From: DongHun Kwak Date: Wed, 9 Dec 2020 01:02:21 +0000 (+0900) Subject: Imported Upstream version 3.9.0 X-Git-Tag: upstream/3.9.0^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e4c425350d0c60f33c1a7a583b0eb957cb95428e;p=platform%2Fupstream%2Fpython3.git Imported Upstream version 3.9.0 --- diff --git a/Doc/c-api/abstract.rst b/Doc/c-api/abstract.rst index 0edd1d5f..1823f9d7 100644 --- a/Doc/c-api/abstract.rst +++ b/Doc/c-api/abstract.rst @@ -18,6 +18,7 @@ but whose items have not been set to some non-\ ``NULL`` value yet. .. toctree:: object.rst + call.rst number.rst sequence.rst mapping.rst diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst index dd091bb3..e3271937 100644 --- a/Doc/c-api/buffer.rst +++ b/Doc/c-api/buffer.rst @@ -462,10 +462,12 @@ Buffer-related functions :c:func:`PyObject_GetBuffer`. -.. c:function:: Py_ssize_t PyBuffer_SizeFromFormat(const char *) +.. c:function:: Py_ssize_t PyBuffer_SizeFromFormat(const char *format) Return the implied :c:data:`~Py_buffer.itemsize` from :c:data:`~Py_buffer.format`. - This function is not yet implemented. + On error, raise an exception and return -1. + + .. versionadded:: 3.9 .. c:function:: int PyBuffer_IsContiguous(Py_buffer *view, char order) diff --git a/Doc/c-api/call.rst b/Doc/c-api/call.rst new file mode 100644 index 00000000..31dc9c80 --- /dev/null +++ b/Doc/c-api/call.rst @@ -0,0 +1,424 @@ +.. highlight:: c + +.. _call: + +Call Protocol +============= + +CPython supports two different calling protocols: +*tp_call* and vectorcall. + +The *tp_call* Protocol +---------------------- + +Instances of classes that set :c:member:`~PyTypeObject.tp_call` are callable. +The signature of the slot is:: + + PyObject *tp_call(PyObject *callable, PyObject *args, PyObject *kwargs); + +A call is made using a tuple for the positional arguments +and a dict for the keyword arguments, similarly to +``callable(*args, **kwargs)`` in Python code. +*args* must be non-NULL (use an empty tuple if there are no arguments) +but *kwargs* may be *NULL* if there are no keyword arguments. + +This convention is not only used by *tp_call*: +:c:member:`~PyTypeObject.tp_new` and :c:member:`~PyTypeObject.tp_init` +also pass arguments this way. + +To call an object, use :c:func:`PyObject_Call` or other +:ref:`call API `. + + +.. _vectorcall: + +The Vectorcall Protocol +----------------------- + +.. versionadded:: 3.9 + +The vectorcall protocol was introduced in :pep:`590` as an additional protocol +for making calls more efficient. + +As rule of thumb, CPython will prefer the vectorcall for internal calls +if the callable supports it. However, this is not a hard rule. +Additionally, some third-party extensions use *tp_call* directly +(rather than using :c:func:`PyObject_Call`). +Therefore, a class supporting vectorcall must also implement +:c:member:`~PyTypeObject.tp_call`. +Moreover, the callable must behave the same +regardless of which protocol is used. +The recommended way to achieve this is by setting +:c:member:`~PyTypeObject.tp_call` to :c:func:`PyVectorcall_Call`. +This bears repeating: + +.. warning:: + + A class supporting vectorcall **must** also implement + :c:member:`~PyTypeObject.tp_call` with the same semantics. + +A class should not implement vectorcall if that would be slower +than *tp_call*. For example, if the callee needs to convert +the arguments to an args tuple and kwargs dict anyway, then there is no point +in implementing vectorcall. + +Classes can implement the vectorcall protocol by enabling the +:const:`Py_TPFLAGS_HAVE_VECTORCALL` flag and setting +:c:member:`~PyTypeObject.tp_vectorcall_offset` to the offset inside the +object structure where a *vectorcallfunc* appears. +This is a pointer to a function with the following signature: + +.. c:type:: PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) + +- *callable* is the object being called. +- *args* is a C array consisting of the positional arguments followed by the + values of the keyword arguments. + This can be *NULL* if there are no arguments. +- *nargsf* is the number of positional arguments plus possibly the + :const:`PY_VECTORCALL_ARGUMENTS_OFFSET` flag. + To get the actual number of positional arguments from *nargsf*, + use :c:func:`PyVectorcall_NARGS`. +- *kwnames* is a tuple containing the names of the keyword arguments; + in other words, the keys of the kwargs dict. + These names must be strings (instances of ``str`` or a subclass) + and they must be unique. + If there are no keyword arguments, then *kwnames* can instead be *NULL*. + +.. c:macro:: PY_VECTORCALL_ARGUMENTS_OFFSET + + If this flag is set in a vectorcall *nargsf* argument, the callee is allowed + to temporarily change ``args[-1]``. In other words, *args* points to + argument 1 (not 0) in the allocated vector. + The callee must restore the value of ``args[-1]`` before returning. + + For :c:func:`PyObject_VectorcallMethod`, this flag means instead that + ``args[0]`` may be changed. + + Whenever they can do so cheaply (without additional allocation), callers + are encouraged to use :const:`PY_VECTORCALL_ARGUMENTS_OFFSET`. + Doing so will allow callables such as bound methods to make their onward + calls (which include a prepended *self* argument) very efficiently. + +To call an object that implements vectorcall, use a :ref:`call API ` +function as with any other callable. +:c:func:`PyObject_Vectorcall` will usually be most efficient. + + +.. note:: + + In CPython 3.8, the vectorcall API and related functions were available + provisionally under names with a leading underscore: + ``_PyObject_Vectorcall``, ``_Py_TPFLAGS_HAVE_VECTORCALL``, + ``_PyObject_VectorcallMethod``, ``_PyVectorcall_Function``, + ``_PyObject_CallOneArg``, ``_PyObject_CallMethodNoArgs``, + ``_PyObject_CallMethodOneArg``. + Additionally, ``PyObject_VectorcallDict`` was available as + ``_PyObject_FastCallDict``. + The old names are still defined as aliases of the new, non-underscored names. + + +Recursion Control +................. + +When using *tp_call*, callees do not need to worry about +:ref:`recursion `: CPython uses +:c:func:`Py_EnterRecursiveCall` and :c:func:`Py_LeaveRecursiveCall` +for calls made using *tp_call*. + +For efficiency, this is not the case for calls done using vectorcall: +the callee should use *Py_EnterRecursiveCall* and *Py_LeaveRecursiveCall* +if needed. + + +Vectorcall Support API +...................... + +.. c:function:: Py_ssize_t PyVectorcall_NARGS(size_t nargsf) + + Given a vectorcall *nargsf* argument, return the actual number of + arguments. + Currently equivalent to:: + + (Py_ssize_t)(nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET) + + However, the function ``PyVectorcall_NARGS`` should be used to allow + for future extensions. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.8 + +.. c:function:: vectorcallfunc PyVectorcall_Function(PyObject *op) + + If *op* does not support the vectorcall protocol (either because the type + does not or because the specific instance does not), return *NULL*. + Otherwise, return the vectorcall function pointer stored in *op*. + This function never raises an exception. + + This is mostly useful to check whether or not *op* supports vectorcall, + which can be done by checking ``PyVectorcall_Function(op) != NULL``. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.8 + +.. c:function:: PyObject* PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict) + + Call *callable*'s :c:type:`vectorcallfunc` with positional and keyword + arguments given in a tuple and dict, respectively. + + This is a specialized function, intended to be put in the + :c:member:`~PyTypeObject.tp_call` slot or be used in an implementation of ``tp_call``. + It does not check the :const:`Py_TPFLAGS_HAVE_VECTORCALL` flag + and it does not fall back to ``tp_call``. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.8 + + +.. _capi-call: + +Object Calling API +------------------ + +Various functions are available for calling a Python object. +Each converts its arguments to a convention supported by the called object – +either *tp_call* or vectorcall. +In order to do as litle conversion as possible, pick one that best fits +the format of data you have available. + +The following table summarizes the available functions; +please see individual documentation for details. + ++------------------------------------------+------------------+--------------------+---------------+ +| Function | callable | args | kwargs | ++==========================================+==================+====================+===============+ +| :c:func:`PyObject_Call` | ``PyObject *`` | tuple | dict/``NULL`` | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallNoArgs` | ``PyObject *`` | --- | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallOneArg` | ``PyObject *`` | 1 object | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallObject` | ``PyObject *`` | tuple/``NULL`` | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallFunction` | ``PyObject *`` | format | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallMethod` | obj + ``char*`` | format | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallFunctionObjArgs` | ``PyObject *`` | variadic | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallMethodObjArgs` | obj + name | variadic | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallMethodNoArgs` | obj + name | --- | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallMethodOneArg` | obj + name | 1 object | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_Vectorcall` | ``PyObject *`` | vectorcall | vectorcall | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_VectorcallDict` | ``PyObject *`` | vectorcall | dict/``NULL`` | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_VectorcallMethod` | arg + name | vectorcall | vectorcall | ++------------------------------------------+------------------+--------------------+---------------+ + + +.. c:function:: PyObject* PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) + + Call a callable Python object *callable*, with arguments given by the + tuple *args*, and named arguments given by the dictionary *kwargs*. + + *args* must not be *NULL*; use an empty tuple if no arguments are needed. + If no named arguments are needed, *kwargs* can be *NULL*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This is the equivalent of the Python expression: + ``callable(*args, **kwargs)``. + + +.. c:function:: PyObject* PyObject_CallNoArgs(PyObject *callable) + + Call a callable Python object *callable* without any arguments. It is the + most efficient way to call a callable Python object without any argument. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + .. versionadded:: 3.9 + + +.. c:function:: PyObject* PyObject_CallOneArg(PyObject *callable, PyObject *arg) + + Call a callable Python object *callable* with exactly 1 positional argument + *arg* and no keyword arguments. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + + +.. c:function:: PyObject* PyObject_CallObject(PyObject *callable, PyObject *args) + + Call a callable Python object *callable*, with arguments given by the + tuple *args*. If no arguments are needed, then *args* can be *NULL*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This is the equivalent of the Python expression: ``callable(*args)``. + + +.. c:function:: PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...) + + Call a callable Python object *callable*, with a variable number of C arguments. + The C arguments are described using a :c:func:`Py_BuildValue` style format + string. The format can be *NULL*, indicating that no arguments are provided. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This is the equivalent of the Python expression: ``callable(*args)``. + + Note that if you only pass :c:type:`PyObject *` args, + :c:func:`PyObject_CallFunctionObjArgs` is a faster alternative. + + .. versionchanged:: 3.4 + The type of *format* was changed from ``char *``. + + +.. c:function:: PyObject* PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...) + + Call the method named *name* of object *obj* with a variable number of C + arguments. The C arguments are described by a :c:func:`Py_BuildValue` format + string that should produce a tuple. + + The format can be *NULL*, indicating that no arguments are provided. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This is the equivalent of the Python expression: + ``obj.name(arg1, arg2, ...)``. + + Note that if you only pass :c:type:`PyObject *` args, + :c:func:`PyObject_CallMethodObjArgs` is a faster alternative. + + .. versionchanged:: 3.4 + The types of *name* and *format* were changed from ``char *``. + + +.. c:function:: PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ...) + + Call a callable Python object *callable*, with a variable number of + :c:type:`PyObject *` arguments. The arguments are provided as a variable number + of parameters followed by *NULL*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This is the equivalent of the Python expression: + ``callable(arg1, arg2, ...)``. + + +.. c:function:: PyObject* PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...) + + Call a method of the Python object *obj*, where the name of the method is given as a + Python string object in *name*. It is called with a variable number of + :c:type:`PyObject *` arguments. The arguments are provided as a variable number + of parameters followed by *NULL*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + +.. c:function:: PyObject* PyObject_CallMethodNoArgs(PyObject *obj, PyObject *name) + + Call a method of the Python object *obj* without arguments, + where the name of the method is given as a Python string object in *name*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + + +.. c:function:: PyObject* PyObject_CallMethodOneArg(PyObject *obj, PyObject *name, PyObject *arg) + + Call a method of the Python object *obj* with a single positional argument + *arg*, where the name of the method is given as a Python string object in + *name*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + + +.. c:function:: PyObject* PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) + + Call a callable Python object *callable*. + The arguments are the same as for :c:type:`vectorcallfunc`. + If *callable* supports vectorcall_, this directly calls + the vectorcall function stored in *callable*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + +.. c:function:: PyObject* PyObject_VectorcallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict) + + Call *callable* with positional arguments passed exactly as in the vectorcall_ protocol, + but with keyword arguments passed as a dictionary *kwdict*. + The *args* array contains only the positional arguments. + + Regardless of which protocol is used internally, + a conversion of arguments needs to be done. + Therefore, this function should only be used if the caller + already has a dictionary ready to use for the keyword arguments, + but not a tuple for the positional arguments. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + +.. c:function:: PyObject* PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, size_t nargsf, PyObject *kwnames) + + Call a method using the vectorcall calling convention. The name of the method + is given as a Python string *name*. The object whose method is called is + *args[0]*, and the *args* array starting at *args[1]* represents the arguments + of the call. There must be at least one positional argument. + *nargsf* is the number of positional arguments including *args[0]*, + plus :const:`PY_VECTORCALL_ARGUMENTS_OFFSET` if the value of ``args[0]`` may + temporarily be changed. Keyword arguments can be passed just like in + :c:func:`PyObject_Vectorcall`. + + If the object has the :const:`Py_TPFLAGS_METHOD_DESCRIPTOR` feature, + this will call the unbound method object with the full + *args* vector as arguments. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + + +Call Support API +---------------- + +.. c:function:: int PyCallable_Check(PyObject *o) + + Determine if the object *o* is callable. Return ``1`` if the object is callable + and ``0`` otherwise. This function always succeeds. diff --git a/Doc/c-api/contextvars.rst b/Doc/c-api/contextvars.rst index 38256a3b..9c088814 100644 --- a/Doc/c-api/contextvars.rst +++ b/Doc/c-api/contextvars.rst @@ -101,11 +101,6 @@ Context object management functions: current context for the current thread. Returns ``0`` on success, and ``-1`` on error. -.. c:function:: int PyContext_ClearFreeList() - - Clear the context variable free list. Return the total number of - freed items. This function always succeeds. - Context variable functions: diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index 30905271..8c626c7d 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -81,14 +81,16 @@ Dictionary Objects .. c:function:: int PyDict_DelItem(PyObject *p, PyObject *key) Remove the entry in dictionary *p* with key *key*. *key* must be hashable; - if it isn't, :exc:`TypeError` is raised. Return ``0`` on success or ``-1`` - on failure. + if it isn't, :exc:`TypeError` is raised. + If *key* is not in the dictionary, :exc:`KeyError` is raised. + Return ``0`` on success or ``-1`` on failure. .. c:function:: int PyDict_DelItemString(PyObject *p, const char *key) - Remove the entry in dictionary *p* which has a key specified by the string - *key*. Return ``0`` on success or ``-1`` on failure. + Remove the entry in dictionary *p* which has a key specified by the string *key*. + If *key* is not in the dictionary, :exc:`KeyError` is raised. + Return ``0`` on success or ``-1`` on failure. .. c:function:: PyObject* PyDict_GetItem(PyObject *p, PyObject *key) @@ -232,10 +234,3 @@ Dictionary Objects for key, value in seq2: if override or key not in a: a[key] = value - - -.. c:function:: int PyDict_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - .. versionadded:: 3.3 diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index a4c263f4..247b6d68 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -374,6 +374,8 @@ Querying the error indicator own a reference to the return value, so you do not need to :c:func:`Py_DECREF` it. + The caller must hold the GIL. + .. note:: Do not compare the return value to a specific exception; use @@ -705,6 +707,8 @@ The following functions are used to create and modify Unicode exceptions from C. ``0`` on success, ``-1`` on failure. +.. _recursion: + Recursion Control ================= @@ -712,6 +716,8 @@ These two functions provide a way to perform safe recursive calls at the C level, both in the core and in extension modules. They are needed if the recursive code does not necessarily invoke Python code (which tracks its recursion depth automatically). +They are also not needed for *tp_call* implementations +because the :ref:`call protocol ` takes care of recursion handling. .. c:function:: int Py_EnterRecursiveCall(const char *where) @@ -725,15 +731,21 @@ recursion depth automatically). case, a :exc:`RecursionError` is set and a nonzero value is returned. Otherwise, zero is returned. - *where* should be a string such as ``" in instance check"`` to be - concatenated to the :exc:`RecursionError` message caused by the recursion + *where* should be a UTF-8 encoded string such as ``" in instance check"`` to + be concatenated to the :exc:`RecursionError` message caused by the recursion depth limit. -.. c:function:: void Py_LeaveRecursiveCall() + .. versionchanged:: 3.9 + This function is now also available in the limited API. + +.. c:function:: void Py_LeaveRecursiveCall(void) Ends a :c:func:`Py_EnterRecursiveCall`. Must be called once for each *successful* invocation of :c:func:`Py_EnterRecursiveCall`. + .. versionchanged:: 3.9 + This function is now also available in the limited API. + Properly implementing :c:member:`~PyTypeObject.tp_repr` for container types requires special recursion handling. In addition to protecting the stack, :c:member:`~PyTypeObject.tp_repr` also needs to track objects to prevent cycles. The diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index bfc28a79..b29937db 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -76,8 +76,3 @@ Floating Point Objects .. c:function:: double PyFloat_GetMin() Return the minimum normalized positive float *DBL_MIN* as C :c:type:`double`. - -.. c:function:: int PyFloat_ClearFreeList() - - Clear the float free list. Return the number of items that could not - be freed. diff --git a/Doc/c-api/gcsupport.rst b/Doc/c-api/gcsupport.rst index 924a7fd2..eee114c1 100644 --- a/Doc/c-api/gcsupport.rst +++ b/Doc/c-api/gcsupport.rst @@ -61,6 +61,33 @@ Constructors for container types must conform to two rules: end of the constructor. +.. c:function:: int PyObject_IS_GC(PyObject *obj) + + Returns non-zero if the object implements the garbage collector protocol, + otherwise returns 0. + + The object cannot be tracked by the garbage collector if this function returns 0. + + +.. c:function:: int PyObject_GC_IsTracked(PyObject *op) + + Returns 1 if the object type of *op* implements the GC protocol and *op* is being + currently tracked by the garbage collector and 0 otherwise. + + This is analogous to the Python function :func:`gc.is_tracked`. + + .. versionadded:: 3.9 + + +.. c:function:: int PyObject_GC_IsFinalized(PyObject *op) + + Returns 1 if the object type of *op* implements the GC protocol and *op* has been + already finalized by the garbage collector and 0 otherwise. + + This is analogous to the Python function :func:`gc.is_finalized`. + + .. versionadded:: 3.9 + Similarly, the deallocator for the object must conform to a similar pair of rules: diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst index 78f935a2..c6fc3307 100644 --- a/Doc/c-api/import.rst +++ b/Doc/c-api/import.rst @@ -223,21 +223,6 @@ Importing Modules Return a new reference to the finder object. -.. c:function:: void _PyImport_Init() - - Initialize the import mechanism. For internal use only. - - -.. c:function:: void PyImport_Cleanup() - - Empty the module table. For internal use only. - - -.. c:function:: void _PyImport_Fini() - - Finalize the import mechanism. For internal use only. - - .. c:function:: int PyImport_ImportFrozenModuleObject(PyObject *name) Load a frozen module named *name*. Return ``1`` for success, ``0`` if the diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index e12f7c62..7f06648b 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -842,12 +842,12 @@ code, or when embedding the Python interpreter: single: PyEval_SaveThread() single: PyEval_RestoreThread() - Initialize and acquire the global interpreter lock. It should be called in the - main thread before creating a second thread or engaging in any other thread - operations such as ``PyEval_ReleaseThread(tstate)``. It is not needed before - calling :c:func:`PyEval_SaveThread` or :c:func:`PyEval_RestoreThread`. + Deprecated function which does nothing. - This is a no-op when called for a second time. + In Python 3.6 and older, this function created the GIL if it didn't exist. + + .. versionchanged:: 3.9 + The function now does nothing. .. versionchanged:: 3.7 This function is now called by :c:func:`Py_Initialize()`, so you don't @@ -856,6 +856,8 @@ code, or when embedding the Python interpreter: .. versionchanged:: 3.2 This function cannot be called before :c:func:`Py_Initialize()` anymore. + .. deprecated-removed:: 3.9 3.11 + .. index:: module: _thread @@ -868,6 +870,8 @@ code, or when embedding the Python interpreter: .. versionchanged:: 3.7 The :term:`GIL` is now initialized by :c:func:`Py_Initialize()`. + .. deprecated-removed:: 3.9 3.11 + .. c:function:: PyThreadState* PyEval_SaveThread() @@ -1048,6 +1052,10 @@ All of the following functions must be called after :c:func:`Py_Initialize`. Reset all information in a thread state object. The global interpreter lock must be held. + .. versionchanged:: 3.9 + This function now calls the :c:member:`PyThreadState.on_delete` callback. + Previously, that happened in :c:func:`PyThreadState_Delete`. + .. c:function:: void PyThreadState_Delete(PyThreadState *tstate) @@ -1056,11 +1064,65 @@ All of the following functions must be called after :c:func:`Py_Initialize`. :c:func:`PyThreadState_Clear`. -.. c:function:: PY_INT64_T PyInterpreterState_GetID(PyInterpreterState *interp) +.. c:function:: void PyThreadState_DeleteCurrent(void) + + Destroy the current thread state and release the global interpreter lock. + Like :c:func:`PyThreadState_Delete`, the global interpreter lock need not + be held. The thread state must have been reset with a previous call + to :c:func:`PyThreadState_Clear`. + + +.. c:function:: PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate) + + Get the current frame of the Python thread state *tstate*. + + Return a strong reference. Return ``NULL`` if no frame is currently + executing. + + See also :c:func:`PyEval_GetFrame`. + + *tstate* must not be ``NULL``. + + .. versionadded:: 3.9 + + +.. c:function:: uint64_t PyThreadState_GetID(PyThreadState *tstate) + + Get the unique thread state identifier of the Python thread state *tstate*. + + *tstate* must not be ``NULL``. + + .. versionadded:: 3.9 + + +.. c:function:: PyInterpreterState* PyThreadState_GetInterpreter(PyThreadState *tstate) + + Get the interpreter of the Python thread state *tstate*. + + *tstate* must not be ``NULL``. + + .. versionadded:: 3.9 + + +.. c:function:: PyInterpreterState* PyInterpreterState_Get(void) + + Get the current interpreter. + + Issue a fatal error if there no current Python thread state or no current + interpreter. It cannot return NULL. + + The caller must hold the GIL. + + .. versionadded:: 3.9 + + +.. c:function:: int64_t PyInterpreterState_GetID(PyInterpreterState *interp) Return the interpreter's unique ID. If there was any error in doing so then ``-1`` is returned and an error is set. + The caller must hold the GIL. + .. versionadded:: 3.7 @@ -1075,6 +1137,32 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. versionadded:: 3.8 +.. c:type:: PyObject* (*_PyFrameEvalFunction)(PyThreadState *tstate, PyFrameObject *frame, int throwflag) + + Type of a frame evaluation function. + + The *throwflag* parameter is used by the ``throw()`` method of generators: + if non-zero, handle the current exception. + + .. versionchanged:: 3.9 + The function now takes a *tstate* parameter. + +.. c:function:: _PyFrameEvalFunction _PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp) + + Get the frame evaluation function. + + See the :pep:`523` "Adding a frame evaluation API to CPython". + + .. versionadded:: 3.9 + +.. c:function:: void _PyInterpreterState_SetEvalFrameFunc(PyInterpreterState *interp, _PyFrameEvalFunction eval_frame); + + Set the frame evaluation function. + + See the :pep:`523` "Adding a frame evaluation API to CPython". + + .. versionadded:: 3.9 + .. c:function:: PyObject* PyThreadState_GetDict() @@ -1102,7 +1190,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. c:function:: void PyEval_AcquireThread(PyThreadState *tstate) Acquire the global interpreter lock and set the current thread state to - *tstate*, which should not be ``NULL``. The lock must have been created earlier. + *tstate*, which must not be ``NULL``. The lock must have been created earlier. If this thread already has the lock, deadlock ensues. .. note:: @@ -1326,6 +1414,10 @@ pointer and a void pointer argument. This function doesn't need a current thread state to run, and it doesn't need the global interpreter lock. + To call this function in a subinterpreter, the caller must hold the GIL. + Otherwise, the function *func* can be scheduled to be called from the wrong + interpreter. + .. warning:: This is a low-level function, only useful for very special cases. There is no guarantee that *func* will be called as quick as @@ -1334,6 +1426,12 @@ pointer and a void pointer argument. function is generally **not** suitable for calling Python code from arbitrary C threads. Instead, use the :ref:`PyGILState API`. + .. versionchanged:: 3.9 + If this function is called in a subinterpreter, the function *func* is + now scheduled to be called from the subinterpreter, rather than being + called from the main interpreter. Each subinterpreter now has its own + list of scheduled calls. + .. versionadded:: 3.1 .. _profiling: @@ -1456,6 +1554,8 @@ Python-level trace functions in previous versions. profile function is called for all monitored events except :const:`PyTrace_LINE` :const:`PyTrace_OPCODE` and :const:`PyTrace_EXCEPTION`. + The caller must hold the :term:`GIL`. + .. c:function:: void PyEval_SetTrace(Py_tracefunc func, PyObject *obj) @@ -1466,6 +1566,9 @@ Python-level trace functions in previous versions. will not receive :const:`PyTrace_C_CALL`, :const:`PyTrace_C_EXCEPTION` or :const:`PyTrace_C_RETURN` as a value for the *what* parameter. + The caller must hold the :term:`GIL`. + + .. _advanced-debugging: Advanced Debugger Support diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index ff4ccb8d..f2b82a0c 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -43,6 +43,7 @@ Functions: * :c:func:`Py_PreInitializeFromArgs` * :c:func:`Py_PreInitializeFromBytesArgs` * :c:func:`Py_RunMain` +* :c:func:`Py_GetArgcArgv` The preconfiguration (``PyPreConfig`` type) is stored in ``_PyRuntime.preconfig`` and the configuration (``PyConfig`` type) is stored in @@ -436,6 +437,14 @@ PyConfig :data:`sys.base_prefix`. + .. c:member:: wchar_t* platlibdir + + :data:`sys.platlibdir`: platform library directory name, set at configure time + by ``--with-platlibdir``, overrideable by the ``PYTHONPLATLIBDIR`` + environment variable. + + .. versionadded:: 3.9 + .. c:member:: int buffered_stdio If equals to 0, enable unbuffered mode, making the stdout and stderr @@ -466,13 +475,13 @@ PyConfig .. c:member:: int dev_mode - Development mode: see :option:`-X dev <-X>`. + If non-zero, enable the :ref:`Python Development Mode `. .. c:member:: int dump_refs If non-zero, dump all objects which are still alive at exit. - Require a debug build of Python (``Py_REF_DEBUG`` macro must be defined). + ``Py_TRACE_REFS`` macro must be defined in build. .. c:member:: wchar_t* exec_prefix @@ -627,14 +636,6 @@ PyConfig ``python3 -m MODULE`` argument. Used by :c:func:`Py_RunMain`. - .. c:member:: int show_alloc_count - - Show allocation counts at exit? - - Set to 1 by :option:`-X showalloccount <-X>` command line option. - - Need a special Python build with ``COUNT_ALLOCS`` macro defined. - .. c:member:: int show_ref_count Show total reference count at exit? @@ -694,6 +695,16 @@ PyConfig :data:`sys._xoptions`. + .. c:member:: int _use_peg_parser + + Enable PEG parser? Default: 1. + + Set to 0 by :option:`-X oldparser <-X>` and :envvar:`PYTHONOLDPARSER`. + + See also :pep:`617`. + + .. deprecated-removed:: 3.9 3.10 + If ``parse_argv`` is non-zero, ``argv`` arguments are parsed the same way the regular Python parses command line arguments, and Python arguments are stripped from ``argv``: see :ref:`Command Line Arguments @@ -702,6 +713,10 @@ arguments are stripped from ``argv``: see :ref:`Command Line Arguments The ``xoptions`` options are parsed to set other options: see :option:`-X` option. +.. versionchanged:: 3.9 + + The ``show_alloc_count`` field has been removed. + Initialization with PyConfig ---------------------------- @@ -878,6 +893,7 @@ Path Configuration * Path configuration inputs: * :c:member:`PyConfig.home` + * :c:member:`PyConfig.platlibdir` * :c:member:`PyConfig.pathconfig_warnings` * :c:member:`PyConfig.program_name` * :c:member:`PyConfig.pythonpath_env` @@ -969,6 +985,14 @@ customized Python always running in isolated mode using :c:func:`Py_RunMain`. +Py_GetArgcArgv() +---------------- + +.. c:function:: void Py_GetArgcArgv(int *argc, wchar_t ***argv) + + Get the original command line arguments, before Python modified them. + + Multi-Phase Initialization Private Provisional API -------------------------------------------------- @@ -998,6 +1022,8 @@ Private provisional API: * :c:member:`PyConfig._init_main`: if set to 0, :c:func:`Py_InitializeFromConfig` stops at the "Core" initialization phase. +* :c:member:`PyConfig._isolated_interpreter`: if non-zero, + disallow threads, subprocesses and fork. .. c:function:: PyStatus _Py_InitializeMain(void) diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index fd1268e3..7ca8693a 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -107,11 +107,24 @@ complete listing. .. c:macro:: Py_UNREACHABLE() - Use this when you have a code path that you do not expect to be reached. + Use this when you have a code path that cannot be reached by design. For example, in the ``default:`` clause in a ``switch`` statement for which all possible values are covered in ``case`` statements. Use this in places where you might be tempted to put an ``assert(0)`` or ``abort()`` call. + In release mode, the macro helps the compiler to optimize the code, and + avoids a warning about unreachable code. For example, the macro is + implemented with ``__builtin_unreachable()`` on GCC in release mode. + + A use for ``Py_UNREACHABLE()`` is following a call a function that + never returns but that is not declared :c:macro:`_Py_NO_RETURN`. + + If a code path is very unlikely code but can be reached under exceptional + case, this macro must not be used. For example, under low memory condition + or if a system call returns a value out of the expected range. In this + case, it's better to report the error to the caller. If the error cannot + be reported to caller, :c:func:`Py_FatalError` can be used. + .. versionadded:: 3.7 .. c:macro:: Py_ABS(x) diff --git a/Doc/c-api/list.rst b/Doc/c-api/list.rst index b247cdfb..0bc0785f 100644 --- a/Doc/c-api/list.rst +++ b/Doc/c-api/list.rst @@ -142,10 +142,3 @@ List Objects Return a new tuple object containing the contents of *list*; equivalent to ``tuple(list)``. - - -.. c:function:: int PyList_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - .. versionadded:: 3.3 diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 3bada415..22e59ce1 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -42,9 +42,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. The current implementation keeps an array of integer objects for all integers between ``-5`` and ``256``, when you create an int in that range you actually - just get back a reference to the existing object. So it should be possible to - change the value of ``1``. I suspect the behaviour of Python in this case is - undefined. :-) + just get back a reference to the existing object. .. c:function:: PyObject* PyLong_FromUnsignedLong(unsigned long v) @@ -193,8 +191,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. :meth:`__int__` method (if present) to convert it to a :c:type:`PyLongObject`. - If the value of *obj* is greater than :const:`PY_LLONG_MAX` or less than - :const:`PY_LLONG_MIN`, set *\*overflow* to ``1`` or ``-1``, respectively, + If the value of *obj* is greater than :const:`LLONG_MAX` or less than + :const:`LLONG_MIN`, set *\*overflow* to ``1`` or ``-1``, respectively, and return ``-1``; otherwise, set *\*overflow* to ``0``. If any other exception occurs set *\*overflow* to ``0`` and return ``-1`` as usual. @@ -302,7 +300,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. it to a :c:type:`PyLongObject`. If the value of *obj* is out of range for an :c:type:`unsigned long long`, - return the reduction of that value modulo ``PY_ULLONG_MAX + 1``. + return the reduction of that value modulo ``ULLONG_MAX + 1``. Returns ``(unsigned long long)-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. diff --git a/Doc/c-api/method.rst b/Doc/c-api/method.rst index b1862d79..0a5341cb 100644 --- a/Doc/c-api/method.rst +++ b/Doc/c-api/method.rst @@ -92,9 +92,3 @@ no longer available. .. c:function:: PyObject* PyMethod_GET_SELF(PyObject *meth) Macro version of :c:func:`PyMethod_Self` which avoids error checking. - - -.. c:function:: int PyMethod_ClearFreeList() - - Clear the free list. Return the total number of freed items. - diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index f840dd90..6e9474bf 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -196,23 +196,47 @@ or request "multi-phase initialization" by returning the definition struct itsel .. c:member:: traverseproc m_traverse A traversal function to call during GC traversal of the module object, or - ``NULL`` if not needed. This function may be called before module state - is allocated (:c:func:`PyModule_GetState()` may return `NULL`), - and before the :c:member:`Py_mod_exec` function is executed. + ``NULL`` if not needed. + + This function is not called if the module state was requested but is not + allocated yet. This is the case immediately after the module is created + and before the module is executed (:c:data:`Py_mod_exec` function). More + precisely, this function is not called if :c:member:`m_size` is greater + than 0 and the module state (as returned by :c:func:`PyModule_GetState`) + is ``NULL``. + + .. versionchanged:: 3.9 + No longer called before the module state is allocated. .. c:member:: inquiry m_clear A clear function to call during GC clearing of the module object, or - ``NULL`` if not needed. This function may be called before module state - is allocated (:c:func:`PyModule_GetState()` may return `NULL`), - and before the :c:member:`Py_mod_exec` function is executed. + ``NULL`` if not needed. + + This function is not called if the module state was requested but is not + allocated yet. This is the case immediately after the module is created + and before the module is executed (:c:data:`Py_mod_exec` function). More + precisely, this function is not called if :c:member:`m_size` is greater + than 0 and the module state (as returned by :c:func:`PyModule_GetState`) + is ``NULL``. + + .. versionchanged:: 3.9 + No longer called before the module state is allocated. .. c:member:: freefunc m_free - A function to call during deallocation of the module object, or ``NULL`` if - not needed. This function may be called before module state - is allocated (:c:func:`PyModule_GetState()` may return `NULL`), - and before the :c:member:`Py_mod_exec` function is executed. + A function to call during deallocation of the module object, or ``NULL`` + if not needed. + + This function is not called if the module state was requested but is not + allocated yet. This is the case immediately after the module is created + and before the module is executed (:c:data:`Py_mod_exec` function). More + precisely, this function is not called if :c:member:`m_size` is greater + than 0 and the module state (as returned by :c:func:`PyModule_GetState`) + is ``NULL``. + + .. versionchanged:: 3.9 + No longer called before the module state is allocated. Single-phase initialization ........................... @@ -417,7 +441,7 @@ state: Add an object to *module* as *name*. This is a convenience function which can be used from the module's initialization function. This steals a reference to - *value* on success. Return ``-1`` on error, ``0`` on success. + *value* on success. Return ``-1`` on error, ``0`` on success. .. note:: @@ -460,6 +484,16 @@ state: Add a string constant to *module*. +.. c:function:: int PyModule_AddType(PyObject *module, PyTypeObject *type) + + Add a type object to *module*. + The type object is finalized by calling internally :c:func:`PyType_Ready`. + The name of the type object is taken from the last component of + :c:member:`~PyTypeObject.tp_name` after dot. + Return ``-1`` on error, ``0`` on success. + + .. versionadded:: 3.9 + Module lookup ^^^^^^^^^^^^^ @@ -493,6 +527,8 @@ since multiple such modules can be created from a single definition. mechanisms (either by calling it directly, or by referring to its implementation for details of the required state updates). + The caller must hold the GIL. + Return 0 on success or -1 on failure. .. versionadded:: 3.3 @@ -502,4 +538,6 @@ since multiple such modules can be created from a single definition. Removes the module object created from *def* from the interpreter state. Return 0 on success or -1 on failure. + The caller must hold the GIL. + .. versionadded:: 3.3 diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index d4e8b746..a387b4a2 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -196,6 +196,7 @@ Object Protocol This function now includes a debug assertion to help ensure that it does not silently discard an active exception. + .. c:function:: PyObject* PyObject_Bytes(PyObject *o) .. index:: builtin: bytes @@ -247,179 +248,6 @@ Object Protocol of base classes). -.. c:function:: int PyCallable_Check(PyObject *o) - - Determine if the object *o* is callable. Return ``1`` if the object is callable - and ``0`` otherwise. This function always succeeds. - - -.. c:function:: PyObject* PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) - - Call a callable Python object *callable*, with arguments given by the - tuple *args*, and named arguments given by the dictionary *kwargs*. - - *args* must not be ``NULL``, use an empty tuple if no arguments are needed. - If no named arguments are needed, *kwargs* can be ``NULL``. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This is the equivalent of the Python expression: - ``callable(*args, **kwargs)``. - - -.. c:function:: PyObject* PyObject_CallObject(PyObject *callable, PyObject *args) - - Call a callable Python object *callable*, with arguments given by the - tuple *args*. If no arguments are needed, then *args* can be ``NULL``. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This is the equivalent of the Python expression: ``callable(*args)``. - - -.. c:function:: PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...) - - Call a callable Python object *callable*, with a variable number of C arguments. - The C arguments are described using a :c:func:`Py_BuildValue` style format - string. The format can be ``NULL``, indicating that no arguments are provided. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This is the equivalent of the Python expression: ``callable(*args)``. - - Note that if you only pass :c:type:`PyObject *` args, - :c:func:`PyObject_CallFunctionObjArgs` is a faster alternative. - - .. versionchanged:: 3.4 - The type of *format* was changed from ``char *``. - - -.. c:function:: PyObject* PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...) - - Call the method named *name* of object *obj* with a variable number of C - arguments. The C arguments are described by a :c:func:`Py_BuildValue` format - string that should produce a tuple. - - The format can be ``NULL``, indicating that no arguments are provided. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This is the equivalent of the Python expression: - ``obj.name(arg1, arg2, ...)``. - - Note that if you only pass :c:type:`PyObject *` args, - :c:func:`PyObject_CallMethodObjArgs` is a faster alternative. - - .. versionchanged:: 3.4 - The types of *name* and *format* were changed from ``char *``. - - -.. c:function:: PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ...) - - Call a callable Python object *callable*, with a variable number of - :c:type:`PyObject*` arguments. The arguments are provided as a variable number - of parameters followed by ``NULL``. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This is the equivalent of the Python expression: - ``callable(arg1, arg2, ...)``. - - -.. c:function:: PyObject* PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...) - - Calls a method of the Python object *obj*, where the name of the method is given as a - Python string object in *name*. It is called with a variable number of - :c:type:`PyObject*` arguments. The arguments are provided as a variable number - of parameters followed by ``NULL``. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - -.. c:function:: PyObject* _PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) - - Call a callable Python object *callable*, using - :c:data:`vectorcall ` if possible. - - *args* is a C array with the positional arguments. - - *nargsf* is the number of positional arguments plus optionally the flag - :const:`PY_VECTORCALL_ARGUMENTS_OFFSET` (see below). - To get actual number of arguments, use - :c:func:`PyVectorcall_NARGS(nargsf) `. - - *kwnames* can be either ``NULL`` (no keyword arguments) or a tuple of keyword - names. In the latter case, the values of the keyword arguments are stored - in *args* after the positional arguments. - The number of keyword arguments does not influence *nargsf*. - - *kwnames* must contain only objects of type ``str`` (not a subclass), - and all keys must be unique. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This uses the vectorcall protocol if the callable supports it; - otherwise, the arguments are converted to use - :c:member:`~PyTypeObject.tp_call`. - - .. note:: - - This function is provisional and expected to become public in Python 3.9, - with a different name and, possibly, changed semantics. - If you use the function, plan for updating your code for Python 3.9. - - .. versionadded:: 3.8 - -.. c:macro:: PY_VECTORCALL_ARGUMENTS_OFFSET - - If set in a vectorcall *nargsf* argument, the callee is allowed to - temporarily change ``args[-1]``. In other words, *args* points to - argument 1 (not 0) in the allocated vector. - The callee must restore the value of ``args[-1]`` before returning. - - Whenever they can do so cheaply (without additional allocation), callers - are encouraged to use :const:`PY_VECTORCALL_ARGUMENTS_OFFSET`. - Doing so will allow callables such as bound methods to make their onward - calls (which include a prepended *self* argument) cheaply. - - .. versionadded:: 3.8 - -.. c:function:: Py_ssize_t PyVectorcall_NARGS(size_t nargsf) - - Given a vectorcall *nargsf* argument, return the actual number of - arguments. - Currently equivalent to ``nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET``. - - .. versionadded:: 3.8 - -.. c:function:: PyObject* _PyObject_FastCallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict) - - Same as :c:func:`_PyObject_Vectorcall` except that the keyword arguments - are passed as a dictionary in *kwdict*. This may be ``NULL`` if there - are no keyword arguments. - - For callables supporting :c:data:`vectorcall `, - the arguments are internally converted to the vectorcall convention. - Therefore, this function adds some overhead compared to - :c:func:`_PyObject_Vectorcall`. - It should only be used if the caller already has a dictionary ready to use. - - .. note:: - - This function is provisional and expected to become public in Python 3.9, - with a different name and, possibly, changed semantics. - If you use the function, plan for updating your code for Python 3.9. - - .. versionadded:: 3.8 - - .. c:function:: Py_hash_t PyObject_Hash(PyObject *o) .. index:: builtin: hash diff --git a/Doc/c-api/reflection.rst b/Doc/c-api/reflection.rst index 1d86de66..9207d860 100644 --- a/Doc/c-api/reflection.rst +++ b/Doc/c-api/reflection.rst @@ -5,34 +5,60 @@ Reflection ========== -.. c:function:: PyObject* PyEval_GetBuiltins() +.. c:function:: PyObject* PyEval_GetBuiltins(void) Return a dictionary of the builtins in the current execution frame, or the interpreter of the thread state if no frame is currently executing. -.. c:function:: PyObject* PyEval_GetLocals() +.. c:function:: PyObject* PyEval_GetLocals(void) Return a dictionary of the local variables in the current execution frame, or ``NULL`` if no frame is currently executing. -.. c:function:: PyObject* PyEval_GetGlobals() +.. c:function:: PyObject* PyEval_GetGlobals(void) Return a dictionary of the global variables in the current execution frame, or ``NULL`` if no frame is currently executing. -.. c:function:: PyFrameObject* PyEval_GetFrame() +.. c:function:: PyFrameObject* PyEval_GetFrame(void) Return the current thread state's frame, which is ``NULL`` if no frame is currently executing. + See also :c:func:`PyThreadState_GetFrame`. + + +.. c:function:: int PyFrame_GetBack(PyFrameObject *frame) + + Get the *frame* next outer frame. + + Return a strong reference, or ``NULL`` if *frame* has no outer frame. + + *frame* must not be ``NULL``. + + .. versionadded:: 3.9 + + +.. c:function:: int PyFrame_GetCode(PyFrameObject *frame) + + Get the *frame* code. + + Return a strong reference. + + *frame* must not be ``NULL``. The result (frame code) cannot be ``NULL``. + + .. versionadded:: 3.9 + .. c:function:: int PyFrame_GetLineNumber(PyFrameObject *frame) Return the line number that *frame* is currently executing. + *frame* must not be ``NULL``. + .. c:function:: const char* PyEval_GetFuncName(PyObject *func) diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst index 54819e8f..879f394d 100644 --- a/Doc/c-api/set.rst +++ b/Doc/c-api/set.rst @@ -157,10 +157,3 @@ subtypes but not for instances of :class:`frozenset` or its subtypes. .. c:function:: int PySet_Clear(PyObject *set) Empty an existing set of all elements. - - -.. c:function:: int PySet_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - .. versionadded:: 3.3 diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index e9c276ce..0a0e03ff 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -9,6 +9,10 @@ There are a large number of structures which are used in the definition of object types for Python. This section describes these structures and how they are used. + +Base object types and macros +---------------------------- + All Python objects ultimately share a small number of fields at the beginning of the object's representation in memory. These are represented by the :c:type:`PyObject` and :c:type:`PyVarObject` types, which are defined, in turn, @@ -66,6 +70,21 @@ the definition of all other Python objects. (((PyObject*)(o))->ob_type) +.. c:function:: int Py_IS_TYPE(PyObject *o, PyTypeObject *type) + + Return non-zero if the object *o* type is *type*. Return zero otherwise. + Equivalent to: ``Py_TYPE(o) == type``. + + .. versionadded:: 3.9 + + +.. c:function:: void Py_SET_TYPE(PyObject *o, PyTypeObject *type) + + Set the object *o* type to *type*. + + .. versionadded:: 3.9 + + .. c:macro:: Py_REFCNT(o) This macro is used to access the :attr:`ob_refcnt` member of a Python @@ -75,6 +94,13 @@ the definition of all other Python objects. (((PyObject*)(o))->ob_refcnt) +.. c:function:: void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt) + + Set the object *o* reference counter to *refcnt*. + + .. versionadded:: 3.9 + + .. c:macro:: Py_SIZE(o) This macro is used to access the :attr:`ob_size` member of a Python object. @@ -83,6 +109,13 @@ the definition of all other Python objects. (((PyVarObject*)(o))->ob_size) +.. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size) + + Set the object *o* size to *size*. + + .. versionadded:: 3.9 + + .. c:macro:: PyObject_HEAD_INIT(type) This is a macro which expands to initialization values for a new @@ -102,6 +135,9 @@ the definition of all other Python objects. 1, type, size, +Implementing functions and methods +---------------------------------- + .. c:type:: PyCFunction Type of the functions used to implement most Python callables in C. @@ -111,23 +147,56 @@ the definition of all other Python objects. value of the function as exposed in Python. The function must return a new reference. + The function signature is:: + + PyObject *PyCFunction(PyObject *self, + PyObject *args); .. c:type:: PyCFunctionWithKeywords Type of the functions used to implement Python callables in C with signature :const:`METH_VARARGS | METH_KEYWORDS`. + The function signature is:: + + PyObject *PyCFunctionWithKeywords(PyObject *self, + PyObject *args, + PyObject *kwargs); .. c:type:: _PyCFunctionFast Type of the functions used to implement Python callables in C with signature :const:`METH_FASTCALL`. + The function signature is:: + PyObject *_PyCFunctionFast(PyObject *self, + PyObject *const *args, + Py_ssize_t nargs); .. c:type:: _PyCFunctionFastWithKeywords Type of the functions used to implement Python callables in C with signature :const:`METH_FASTCALL | METH_KEYWORDS`. + The function signature is:: + + PyObject *_PyCFunctionFastWithKeywords(PyObject *self, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames); + +.. c:type:: PyCMethod + + Type of the functions used to implement Python callables in C + with signature :const:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS`. + The function signature is:: + + PyObject *PyCMethod(PyObject *self, + PyTypeObject *defining_class, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames) + + .. versionadded:: 3.9 .. c:type:: PyMethodDef @@ -161,9 +230,7 @@ The :attr:`ml_flags` field is a bitfield which can include the following flags. The individual flags indicate either a calling convention or a binding convention. -There are four basic calling conventions for positional arguments -and two of them can be combined with :const:`METH_KEYWORDS` to support -also keyword arguments. So there are a total of 6 calling conventions: +There are these calling conventions: .. data:: METH_VARARGS @@ -201,9 +268,11 @@ also keyword arguments. So there are a total of 6 calling conventions: Extension of :const:`METH_FASTCALL` supporting also keyword arguments, with methods of type :c:type:`_PyCFunctionFastWithKeywords`. - Keyword arguments are passed the same way as in the vectorcall protocol: + Keyword arguments are passed the same way as in the + :ref:`vectorcall protocol `: there is an additional fourth :c:type:`PyObject*` parameter which is a tuple representing the names of the keyword arguments + (which are guaranteed to be strings) or possibly ``NULL`` if there are no keywords. The values of the keyword arguments are stored in the *args* array, after the positional arguments. @@ -212,6 +281,19 @@ also keyword arguments. So there are a total of 6 calling conventions: .. versionadded:: 3.7 +.. data:: METH_METHOD | METH_FASTCALL | METH_KEYWORDS + + Extension of :const:`METH_FASTCALL | METH_KEYWORDS` supporting the *defining + class*, that is, the class that contains the method in question. + The defining class might be a superclass of ``Py_TYPE(self)``. + + The method needs to be of type :c:type:`PyCMethod`, the same as for + ``METH_FASTCALL | METH_KEYWORDS`` with ``defining_class`` argument added after + ``self``. + + .. versionadded:: 3.9 + + .. data:: METH_NOARGS Methods without parameters don't need to check whether arguments are given if @@ -270,6 +352,9 @@ definition with the same method name. than wrapper object calls. +Accessing attributes of extension types +--------------------------------------- + .. c:type:: PyMemberDef Structure which describes an attribute of a type which corresponds to a C @@ -335,6 +420,21 @@ definition with the same method name. Only :c:macro:`T_OBJECT` and :c:macro:`T_OBJECT_EX` members can be deleted. (They are set to ``NULL``). + .. _pymemberdef-offsets: + + Heap allocated types (created using :c:func:`PyType_FromSpec` or similar), + ``PyMemberDef`` may contain definitions for the special members + ``__dictoffset__``, ``__weaklistoffset__`` and ``__vectorcalloffset__``, + corresponding to + :c:member:`~PyTypeObject.tp_dictoffset`, + :c:member:`~PyTypeObject.tp_weaklistoffset` and + :c:member:`~PyTypeObject.tp_vectorcall_offset` in type objects. + These must be defined with ``T_PYSSIZET`` and ``READONLY``, for example:: + + static PyMemberDef spam_type_members[] = { + {"__dictoffset__", T_PYSSIZET, offsetof(Spam_object, dict), READONLY}, + {NULL} /* Sentinel */ + }; .. c:type:: PyGetSetDef diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index c851ff66..9ac91790 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -388,6 +388,13 @@ Process Control function :c:func:`abort` is called which will attempt to produce a :file:`core` file. + The ``Py_FatalError()`` function is replaced with a macro which logs + automatically the name of the current function, unless the + ``Py_LIMITED_API`` macro is defined. + + .. versionchanged:: 3.9 + Log the function name automatically. + .. c:function:: void Py_Exit(int status) diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst index d7acc4ea..bf751e44 100644 --- a/Doc/c-api/tuple.rst +++ b/Doc/c-api/tuple.rst @@ -111,11 +111,6 @@ Tuple Objects raises :exc:`MemoryError` or :exc:`SystemError`. -.. c:function:: int PyTuple_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - Struct Sequence Objects ----------------------- @@ -182,10 +177,13 @@ type. +-----------+------------------+-----------------------------------------+ -.. c:var:: char* PyStructSequence_UnnamedField +.. c:var:: const char * const PyStructSequence_UnnamedField Special value for a field name to leave it unnamed. + .. versionchanged:: 3.9 + The type was changed from ``char *``. + .. c:function:: PyObject* PyStructSequence_New(PyTypeObject *type) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index dcdec532..73f26875 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -21,14 +21,14 @@ Type Objects .. c:function:: int PyType_Check(PyObject *o) - Return true if the object *o* is a type object, including instances of types - derived from the standard type object. Return false in all other cases. + Return non-zero if the object *o* is a type object, including instances of + types derived from the standard type object. Return 0 in all other cases. .. c:function:: int PyType_CheckExact(PyObject *o) - Return true if the object *o* is a type object, but not a subtype of the - standard type object. Return false in all other cases. + Return non-zero if the object *o* is a type object, but not a subtype of the + standard type object. Return 0 in all other cases. .. c:function:: unsigned int PyType_ClearCache() @@ -57,8 +57,8 @@ Type Objects .. c:function:: int PyType_HasFeature(PyTypeObject *o, int feature) - Return true if the type object *o* sets the feature *feature*. Type features - are denoted by single bit flags. + Return non-zero if the type object *o* sets the feature *feature*. + Type features are denoted by single bit flags. .. c:function:: int PyType_IS_GC(PyTypeObject *o) @@ -109,6 +109,37 @@ Type Objects .. versionadded:: 3.4 +.. c:function:: PyObject* PyType_GetModule(PyTypeObject *type) + + Return the module object associated with the given type when the type was + created using :c:func:`PyType_FromModuleAndSpec`. + + If no module is associated with the given type, sets :py:class:`TypeError` + and returns ``NULL``. + + This function is usually used to get the module in which a method is defined. + Note that in such a method, ``PyType_GetModule(Py_TYPE(self))`` + may not return the intended result. + ``Py_TYPE(self)`` may be a *subclass* of the intended class, and subclasses + are not necessarily defined in the same module as their superclass. + See :c:type:`PyCMethod` to get the class that defines the method. + + .. versionadded:: 3.9 + +.. c:function:: void* PyType_GetModuleState(PyTypeObject *type) + + Return the state of the module object associated with the given type. + This is a shortcut for calling :c:func:`PyModule_GetState()` on the result + of :c:func:`PyType_GetModule`. + + If no module is associated with the given type, sets :py:class:`TypeError` + and returns ``NULL``. + + If the *type* has an associated module but its state is ``NULL``, + returns ``NULL`` without setting an exception. + + .. versionadded:: 3.9 + Creating Heap-Allocated Types ............................. @@ -116,7 +147,7 @@ Creating Heap-Allocated Types The following functions and structs are used to create :ref:`heap types `. -.. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) +.. c:function:: PyObject* PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) Creates and returns a heap type object from the *spec* (:const:`Py_TPFLAGS_HEAPTYPE`). @@ -127,8 +158,21 @@ The following functions and structs are used to create If *bases* is ``NULL``, the *Py_tp_base* slot is used instead. If that also is ``NULL``, the new type derives from :class:`object`. + The *module* argument can be used to record the module in which the new + class is defined. It must be a module object or ``NULL``. + If not ``NULL``, the module is associated with the new type and can later be + retreived with :c:func:`PyType_GetModule`. + The associated module is not inherited by subclasses; it must be specified + for each class individually. + This function calls :c:func:`PyType_Ready` on the new type. + .. versionadded:: 3.9 + +.. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) + + Equivalent to ``PyType_FromModuleAndSpec(NULL, spec, bases)``. + .. versionadded:: 3.3 .. c:function:: PyObject* PyType_FromSpec(PyType_Spec *spec) @@ -181,16 +225,25 @@ The following functions and structs are used to create * ``Py_nb_add`` to set :c:member:`PyNumberMethods.nb_add` * ``Py_sq_length`` to set :c:member:`PySequenceMethods.sq_length` - The following fields cannot be set using :c:type:`PyType_Spec` and :c:type:`PyType_Slot`: + The following fields cannot be set at all using :c:type:`PyType_Spec` and + :c:type:`PyType_Slot`: * :c:member:`~PyTypeObject.tp_dict` * :c:member:`~PyTypeObject.tp_mro` * :c:member:`~PyTypeObject.tp_cache` * :c:member:`~PyTypeObject.tp_subclasses` * :c:member:`~PyTypeObject.tp_weaklist` - * :c:member:`~PyTypeObject.tp_print` + * :c:member:`~PyTypeObject.tp_vectorcall` * :c:member:`~PyTypeObject.tp_weaklistoffset` + (see :ref:`PyMemberDef `) * :c:member:`~PyTypeObject.tp_dictoffset` + (see :ref:`PyMemberDef `) + * :c:member:`~PyTypeObject.tp_vectorcall_offset` + (see :ref:`PyMemberDef `) + + The following fields cannot be set using :c:type:`PyType_Spec` and + :c:type:`PyType_Slot` under the limited API: + * :c:member:`~PyBufferProcs.bf_getbuffer` * :c:member:`~PyBufferProcs.bf_releasebuffer` @@ -198,6 +251,10 @@ The following functions and structs are used to create To avoid issues, use the *bases* argument of :py:func:`PyType_FromSpecWithBases` instead. + .. versionchanged:: 3.9 + + Slots in :c:type:`PyBufferProcs` in may be set in the unlimited API. + .. c:member:: void *PyType_Slot.pfunc The desired value of the slot. In most cases, this is a pointer diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 3d186231..ddcb8ae3 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -49,7 +49,7 @@ Quick Reference +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_dealloc` | :c:type:`destructor` | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_vectorcall_offset` | Py_ssize_t | | | | | ? | + | :c:member:`~PyTypeObject.tp_vectorcall_offset` | Py_ssize_t | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | (:c:member:`~PyTypeObject.tp_getattr`) | :c:type:`getattrfunc` | __getattribute__, | | | | G | | | | __getattr__ | | | | | @@ -145,15 +145,8 @@ Quick Reference +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_finalize` | :c:type:`destructor` | __del__ | | | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - -If :const:`COUNT_ALLOCS` is defined then the following (internal-only) -fields exist as well: - -* :c:member:`~PyTypeObject.tp_allocs` -* :c:member:`~PyTypeObject.tp_frees` -* :c:member:`~PyTypeObject.tp_maxalloc` -* :c:member:`~PyTypeObject.tp_prev` -* :c:member:`~PyTypeObject.tp_next` + | :c:member:`~PyTypeObject.tp_vectorcall` | :c:type:`vectorcallfunc` | | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ .. [#slots] A slot name in parentheses indicates it is (effectively) deprecated. @@ -180,7 +173,7 @@ fields exist as well: .. code-block:: none - X - type slot is inherited via PyType_Ready if defined with a NULL value + X - type slot is inherited via *PyType_Ready* if defined with a *NULL* value % - the slots of the sub-struct are inherited individually G - inherited, but only in combination with other slots; see the slot's description ? - it's complicated; see the slot's description @@ -687,42 +680,29 @@ and :c:type:`PyType_Type` effectively act as defaults.) .. c:member:: Py_ssize_t PyTypeObject.tp_vectorcall_offset An optional offset to a per-instance function that implements calling - the object using the *vectorcall* protocol, a more efficient alternative + the object using the :ref:`vectorcall protocol `, + a more efficient alternative of the simpler :c:member:`~PyTypeObject.tp_call`. - This field is only used if the flag :const:`_Py_TPFLAGS_HAVE_VECTORCALL` + This field is only used if the flag :const:`Py_TPFLAGS_HAVE_VECTORCALL` is set. If so, this must be a positive integer containing the offset in the instance of a :c:type:`vectorcallfunc` pointer. - The signature is the same as for :c:func:`_PyObject_Vectorcall`:: - - PyObject *vectorcallfunc(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) - The *vectorcallfunc* pointer may be zero, in which case the instance behaves - as if :const:`_Py_TPFLAGS_HAVE_VECTORCALL` was not set: calling the instance + The *vectorcallfunc* pointer may be ``NULL``, in which case the instance behaves + as if :const:`Py_TPFLAGS_HAVE_VECTORCALL` was not set: calling the instance falls back to :c:member:`~PyTypeObject.tp_call`. - Any class that sets ``_Py_TPFLAGS_HAVE_VECTORCALL`` must also set + Any class that sets ``Py_TPFLAGS_HAVE_VECTORCALL`` must also set :c:member:`~PyTypeObject.tp_call` and make sure its behaviour is consistent with the *vectorcallfunc* function. - This can be done by setting *tp_call* to ``PyVectorcall_Call``: + This can be done by setting *tp_call* to :c:func:`PyVectorcall_Call`. - .. c:function:: PyObject *PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict) - - Call *callable*'s *vectorcallfunc* with positional and keyword - arguments given in a tuple and dict, respectively. - - This function is intended to be used in the ``tp_call`` slot. - It does not fall back to ``tp_call`` and it currently does not check the - ``_Py_TPFLAGS_HAVE_VECTORCALL`` flag. - To call an object, use one of the :c:func:`PyObject_Call ` - functions instead. - - .. note:: + .. warning:: It is not recommended for :ref:`heap types ` to implement the vectorcall protocol. - When a user sets ``__call__`` in Python code, only ``tp_call`` is updated, - possibly making it inconsistent with the vectorcall function. + When a user sets :attr:`__call__` in Python code, only *tp_call* is updated, + likely making it inconsistent with the vectorcall function. .. note:: @@ -732,18 +712,19 @@ and :c:type:`PyType_Type` effectively act as defaults.) .. versionchanged:: 3.8 - This slot was used for print formatting in Python 2.x. - In Python 3.0 to 3.7, it was reserved and named ``tp_print``. + Before version 3.8, this slot was named ``tp_print``. + In Python 2.x, it was used for printing to a file. + In Python 3.0 to 3.7, it was unused. **Inheritance:** - This field is inherited by subtypes together with - :c:member:`~PyTypeObject.tp_call`: a subtype inherits - :c:member:`~PyTypeObject.tp_vectorcall_offset` from its base type when - the subtype’s :c:member:`~PyTypeObject.tp_call` is ``NULL``. - - Note that `heap types`_ (including subclasses defined in Python) do not - inherit the :const:`_Py_TPFLAGS_HAVE_VECTORCALL` flag. + This field is always inherited. + However, the :const:`Py_TPFLAGS_HAVE_VECTORCALL` flag is not + always inherited. If it's not, then the subclass won't use + :ref:`vectorcall `, except when + :c:func:`PyVectorcall_Call` is explicitly called. + This is in particular the case for `heap types`_ + (including subclasses defined in Python). .. c:member:: getattrfunc PyTypeObject.tp_getattr @@ -965,7 +946,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) The signature is the same as for :c:func:`PyObject_SetAttr`:: - PyObject *tp_setattro(PyObject *self, PyObject *attr, PyObject *value); + int tp_setattro(PyObject *self, PyObject *attr, PyObject *value); In addition, setting *value* to ``NULL`` to delete an attribute must be supported. It is usually convenient to set this field to @@ -1171,27 +1152,20 @@ and :c:type:`PyType_Type` effectively act as defaults.) :c:member:`~PyTypeObject.tp_finalize` slot is always present in the type structure. - .. data:: _Py_TPFLAGS_HAVE_VECTORCALL - This bit is set when the class implements the vectorcall protocol. + .. data:: Py_TPFLAGS_HAVE_VECTORCALL + + This bit is set when the class implements + the :ref:`vectorcall protocol `. See :c:member:`~PyTypeObject.tp_vectorcall_offset` for details. **Inheritance:** - This bit is set on *static* subtypes if ``tp_flags`` is not overridden: - a subtype inherits ``_Py_TPFLAGS_HAVE_VECTORCALL`` from its base type - when the subtype’s :c:member:`~PyTypeObject.tp_call` is ``NULL`` - and the subtype's ``Py_TPFLAGS_HEAPTYPE`` is not set. - - `Heap types`_ do not inherit ``_Py_TPFLAGS_HAVE_VECTORCALL``. - - .. note:: - - This flag is provisional and expected to become public in Python 3.9, - with a different name and, possibly, changed semantics. - If you use vectorcall, plan for updating your code for Python 3.9. + This bit is inherited for *static* subtypes if + :c:member:`~PyTypeObject.tp_call` is also inherited. + `Heap types`_ do not inherit ``Py_TPFLAGS_HAVE_VECTORCALL``. - .. versionadded:: 3.8 + .. versionadded:: 3.9 .. c:member:: const char* PyTypeObject.tp_doc @@ -1249,11 +1223,25 @@ and :c:type:`PyType_Type` effectively act as defaults.) but the instance has no strong reference to the elements inside it, as they are allowed to be removed even if the instance is still alive). - Note that :c:func:`Py_VISIT` requires the *visit* and *arg* parameters to :c:func:`local_traverse` to have these specific names; don't name them just anything. + Heap-allocated types (:const:`Py_TPFLAGS_HEAPTYPE`, such as those created + with :c:func:`PyType_FromSpec` and similar APIs) hold a reference to their + type. Their traversal function must therefore either visit + :c:func:`Py_TYPE(self) `, or delegate this responsibility by + calling ``tp_traverse`` of another heap-allocated type (such as a + heap-allocated superclass). + If they do not, the type object may not be garbage-collected. + + .. versionchanged:: 3.9 + + Heap-allocated types are expected to visit ``Py_TYPE(self)`` in + ``tp_traverse``. In earlier versions of Python, due to + `bug 40217 `_, doing this + may lead to crashes in subclasses. + **Inheritance:** Group: :const:`Py_TPFLAGS_HAVE_GC`, :attr:`tp_traverse`, :attr:`tp_clear` @@ -1727,9 +1715,9 @@ and :c:type:`PyType_Type` effectively act as defaults.) PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds); - The subtype argument is the type of the object being created; the *args* and + The *subtype* argument is the type of the object being created; the *args* and *kwds* arguments represent positional and keyword arguments of the call to the - type. Note that subtype doesn't have to equal the type whose :c:member:`~PyTypeObject.tp_new` + type. Note that *subtype* doesn't have to equal the type whose :c:member:`~PyTypeObject.tp_new` function is called; it may be a subtype of that type (but not an unrelated type). @@ -1912,30 +1900,20 @@ and :c:type:`PyType_Type` effectively act as defaults.) .. seealso:: "Safe object finalization" (:pep:`442`) -The remaining fields are only defined if the feature test macro -:const:`COUNT_ALLOCS` is defined, and are for internal use only. They are -documented here for completeness. None of these fields are inherited by -subtypes. - -.. c:member:: Py_ssize_t PyTypeObject.tp_allocs - - Number of allocations. - -.. c:member:: Py_ssize_t PyTypeObject.tp_frees +.. c:member:: vectorcallfunc PyTypeObject.tp_vectorcall - Number of frees. + Vectorcall function to use for calls of this type object. + In other words, it is used to implement + :ref:`vectorcall ` for ``type.__call__``. + If ``tp_vectorcall`` is ``NULL``, the default call implementation + using :attr:`__new__` and :attr:`__init__` is used. -.. c:member:: Py_ssize_t PyTypeObject.tp_maxalloc - - Maximum simultaneously allocated objects. - -.. c:member:: PyTypeObject* PyTypeObject.tp_prev + **Inheritance:** - Pointer to the previous type object with a non-zero :c:member:`~PyTypeObject.tp_allocs` field. + This field is never inherited. -.. c:member:: PyTypeObject* PyTypeObject.tp_next + .. versionadded:: 3.9 (the field exists since 3.8 but it's only used since 3.9) - Pointer to the next type object with a non-zero :c:member:`~PyTypeObject.tp_allocs` field. Also, note that, in a garbage collected Python, :c:member:`~PyTypeObject.tp_dealloc` may be called from any Python thread, not just the thread which created the object (if the object @@ -2381,14 +2359,6 @@ Slot Type typedefs .. c:type:: void (*destructor)(PyObject *) -.. c:type:: PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) - - See :c:member:`~PyTypeObject.tp_vectorcall_offset`. - - Arguments to ``vectorcallfunc`` are the same as for :c:func:`_PyObject_Vectorcall`. - - .. versionadded:: 3.8 - .. c:type:: void (*freefunc)(void *) See :c:member:`~PyTypeObject.tp_free`. diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 9b68c31e..8a312ae9 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -208,11 +208,6 @@ access internal read-only data of Unicode objects: .. versionadded:: 3.3 -.. c:function:: int PyUnicode_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - .. c:function:: Py_ssize_t PyUnicode_GET_SIZE(PyObject *o) Return the size of the deprecated :c:type:`Py_UNICODE` representation, in @@ -256,6 +251,16 @@ access internal read-only data of Unicode objects: :c:func:`PyUnicode_nBYTE_DATA` family of macros. +.. c:function:: int PyUnicode_IsIdentifier(PyObject *o) + + Return ``1`` if the string is a valid identifier according to the language + definition, section :ref:`identifiers`. Return ``0`` otherwise. + + .. versionchanged:: 3.9 + The function does not call :c:func:`Py_FatalError` anymore if the string + is not ready. + + Unicode Character Properties """""""""""""""""""""""""""" @@ -1006,7 +1011,7 @@ have the same semantics as the ones of the built-in :func:`str` string object constructor. Setting encoding to ``NULL`` causes the default encoding to be used -which is ASCII. The file system calls should use +which is UTF-8. The file system calls should use :c:func:`PyUnicode_FSConverter` for encoding file names. This uses the variable :c:data:`Py_FileSystemDefaultEncoding` internally. This variable should be treated as read-only: on some systems, it will be a diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 208a14e6..551846ea 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -117,7 +117,7 @@ the same library that the Python runtime is using. closed before PyRun_SimpleFileExFlags returns. .. note:: - On Windows, *fp* should be opened as binary mode (e.g. ``fopen(filename, "rb")``. + On Windows, *fp* should be opened as binary mode (e.g. ``fopen(filename, "rb")``). Otherwise, Python may not handle script file with LF line ending correctly. @@ -193,6 +193,8 @@ the same library that the Python runtime is using. :c:func:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set to ``NULL`` and *flags* set to ``0``. + .. deprecated-removed:: 3.9 3.10 + .. c:function:: struct _node* PyParser_SimpleParseStringFlags( const char *str, int start, int flags) @@ -200,6 +202,8 @@ the same library that the Python runtime is using. :c:func:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set to ``NULL``. + .. deprecated-removed:: 3.9 3.10 + .. c:function:: struct _node* PyParser_SimpleParseStringFlagsFilename( const char *str, const char *filename, int start, int flags) @@ -209,18 +213,24 @@ the same library that the Python runtime is using. many times. *filename* is decoded from the filesystem encoding (:func:`sys.getfilesystemencoding`). + .. deprecated-removed:: 3.9 3.10 + .. c:function:: struct _node* PyParser_SimpleParseFile(FILE *fp, const char *filename, int start) This is a simplified interface to :c:func:`PyParser_SimpleParseFileFlags` below, leaving *flags* set to ``0``. + .. deprecated-removed:: 3.9 3.10 + .. c:function:: struct _node* PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags) Similar to :c:func:`PyParser_SimpleParseStringFlagsFilename`, but the Python source code is read from *fp* instead of an in-memory string. + .. deprecated-removed:: 3.9 3.10 + .. c:function:: PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals) diff --git a/Doc/conf.py b/Doc/conf.py index 4cca13b1..079d1771 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -14,7 +14,8 @@ sys.path.append(os.path.abspath('includes')) # --------------------- extensions = ['sphinx.ext.coverage', 'sphinx.ext.doctest', - 'pyspecific', 'c_annotations', 'escape4chm'] + 'pyspecific', 'c_annotations', 'escape4chm', + 'asdl_highlight', 'peg_highlight'] doctest_global_setup = ''' @@ -127,6 +128,7 @@ latex_elements['preamble'] = r''' } \let\Verbatim=\OriginalVerbatim \let\endVerbatim=\endOriginalVerbatim +\setcounter{tocdepth}{2} ''' # The paper size ('letter' or 'a4'). diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index 3ccc20b7..4dacbe20 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -3046,8 +3046,6 @@ Py_XINCREF:PyObject*:o:+1:if o is not NULL _PyImport_Fini:void::: -_PyImport_Init:void::: - _PyObject_New:PyObject*::+1: _PyObject_New:PyTypeObject*:type:0: diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst index 80136b8a..b14197c2 100644 --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1142,6 +1142,24 @@ other utility module. * ``macosx-10.6-intel`` + For AIX, Python 3.9 and later return a string starting with "aix", followed + by additional fields (separated by ``'-'``) that represent the combined + values of AIX Version, Release and Technology Level (first field), Build Date + (second field), and bit-size (third field). Python 3.8 and earlier returned + only a single additional field with the AIX Version and Release. + + Examples of returned values on AIX: + + * ``aix-5307-0747-32`` # 32-bit build on AIX ``oslevel -s``: 5300-07-00-0000 + + * ``aix-7105-1731-64`` # 64-bit build on AIX ``oslevel -s``: 7100-05-01-1731 + + * ``aix-7.2`` # Legacy form reported in Python 3.8 and earlier + + .. versionchanged:: 3.9 + The AIX platform string format now also includes the technology level, + build date, and ABI bit-size. + .. function:: convert_path(pathname) @@ -1837,6 +1855,9 @@ Subclasses of :class:`Command` must define the following methods. .. class:: bdist_msi +.. deprecated:: 3.9 + Use bdist_wheel (wheel packages) instead. + Builds a `Windows Installer`_ (.msi) binary package. .. _Windows Installer: https://msdn.microsoft.com/en-us/library/cc185688(VS.85).aspx diff --git a/Doc/distutils/builtdist.rst b/Doc/distutils/builtdist.rst index b814f2e9..e032c03e 100644 --- a/Doc/distutils/builtdist.rst +++ b/Doc/distutils/builtdist.rst @@ -149,6 +149,9 @@ generated by each, are: .. note:: bdist_wininst is deprecated since Python 3.8. +.. note:: + bdist_msi is deprecated since Python 3.9. + The following sections give details on the individual :command:`bdist_\*` commands. @@ -304,6 +307,9 @@ Creating Windows Installers .. warning:: bdist_wininst is deprecated since Python 3.8. +.. warning:: + bdist_msi is deprecated since Python 3.9. + Executable installers are the natural format for binary distributions on Windows. They display a nice graphical user interface, display some information about the module distribution to be installed taken from the metadata in the @@ -468,3 +474,6 @@ installed for all users) and 'force' (meaning always prompt for elevation). .. note:: bdist_wininst is deprecated since Python 3.8. + +.. note:: + bdist_msi is deprecated since Python 3.9. diff --git a/Doc/distutils/examples.rst b/Doc/distutils/examples.rst index 44f70831..e492b7f6 100644 --- a/Doc/distutils/examples.rst +++ b/Doc/distutils/examples.rst @@ -255,7 +255,7 @@ Running the ``check`` command will display some warnings: running check warning: check: missing required meta-data: version, url warning: check: missing meta-data: either (author and author_email) or - (maintainer and maintainer_email) must be supplied + (maintainer and maintainer_email) should be supplied If you use the reStructuredText syntax in the ``long_description`` field and diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst index 19c5e515..d9023709 100644 --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -104,7 +104,7 @@ done. This can be done using the :c:func:`PyErr_Fetch` and /* This saves the current exception state */ PyErr_Fetch(&err_type, &err_value, &err_traceback); - cbresult = PyObject_CallObject(self->my_callback, NULL); + cbresult = PyObject_CallNoArgs(self->my_callback); if (cbresult == NULL) PyErr_WriteUnraisable(self->my_callback); else diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst index f91b51bf..8cf271c3 100644 --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -24,14 +24,16 @@ programmers will encounter a fragment of code like this:: z++; Only the ``x++`` statement is executed if the condition is true, but the -indentation leads you to believe otherwise. Even experienced C programmers will -sometimes stare at it a long time wondering why ``y`` is being decremented even +indentation leads many to believe otherwise. Even experienced C programmers will +sometimes stare at it a long time wondering as to why ``y`` is being decremented even for ``x > y``. Because there are no begin/end brackets, Python is much less prone to coding-style conflicts. In C there are many different ways to place the braces. -If you're used to reading and writing code that uses one style, you will feel at -least slightly uneasy when reading (or being required to write) another style. +After becoming used to reading and writing code using a particular style, +it is normal to feel somewhat uneasy when reading (or being required to write) +in a different one. + Many coding styles place begin/end brackets on a line by themselves. This makes programs considerably longer and wastes valuable screen space, making it harder @@ -589,11 +591,11 @@ to the end of some internal list; an interface specification cannot test that your :meth:`append` implementation will actually do this correctly, but it's trivial to check this property in a test suite. -Writing test suites is very helpful, and you might want to design your code with -an eye to making it easily tested. One increasingly popular technique, -test-directed development, calls for writing parts of the test suite first, -before you write any of the actual code. Of course Python allows you to be -sloppy and not write test cases at all. +Writing test suites is very helpful, and you might want to design your code to +make it easily tested. One increasingly popular technique, test-driven +development, calls for writing parts of the test suite first, before you write +any of the actual code. Of course Python allows you to be sloppy and not write +test cases at all. Why is there no goto? @@ -648,7 +650,7 @@ Why doesn't Python have a "with" statement for attribute assignments? --------------------------------------------------------------------- Python has a 'with' statement that wraps the execution of a block, calling code -on the entrance and exit from the block. Some language have a construct that +on the entrance and exit from the block. Some languages have a construct that looks like this:: with obj: diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index eee3c3c2..cf70f16c 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -142,9 +142,9 @@ to fix critical bugs. Alpha, beta and release candidate versions have an additional suffix. The suffix for an alpha version is "aN" for some small number N, the suffix for a beta version is "bN" for some small number N, and the suffix for a release -candidate version is "cN" for some small number N. In other words, all versions +candidate version is "rcN" for some small number N. In other words, all versions labeled 2.0aN precede the versions labeled 2.0bN, which precede versions labeled -2.0cN, and *those* precede 2.0. +2.0rcN, and *those* precede 2.0. You may also find version numbers with a "+" suffix, e.g. "2.2+". These are unreleased versions, built directly from the CPython development repository. In @@ -309,8 +309,8 @@ releases. The latest stable releases can always be found on the `Python download page `_. There are two production-ready versions of Python: 2.x and 3.x. The recommended version is 3.x, which is supported by -most widely used libraries. Although 2.x is still widely used, `it will not -be maintained after January 1, 2020 `_. +most widely used libraries. Although 2.x is still widely used, `it is not +maintained anymore `_. How many people are using Python? --------------------------------- diff --git a/Doc/faq/library.rst b/Doc/faq/library.rst index ab92a879..97058b58 100644 --- a/Doc/faq/library.rst +++ b/Doc/faq/library.rst @@ -125,7 +125,7 @@ argument list. It is called as :: handler(signum, frame) -so it should be declared with two arguments:: +so it should be declared with two parameters:: def handler(signum, frame): ... @@ -159,9 +159,9 @@ The "global main logic" of your program may be as simple as :: at the bottom of the main module of your program. -Once your program is organized as a tractable collection of functions and class -behaviours you should write test functions that exercise the behaviours. A test -suite that automates a sequence of tests can be associated with each module. +Once your program is organized as a tractable collection of function and class +behaviours, you should write test functions that exercise the behaviours. A +test suite that automates a sequence of tests can be associated with each module. This sounds like a lot of work, but since Python is so terse and flexible it's surprisingly easy. You can make coding much more pleasant and fun by writing your test functions in parallel with the "production code", since this makes it @@ -295,7 +295,7 @@ queue as there are threads. How do I parcel out work among a bunch of worker threads? --------------------------------------------------------- -The easiest way is to use the new :mod:`concurrent.futures` module, +The easiest way is to use the :mod:`concurrent.futures` module, especially the :mod:`~concurrent.futures.ThreadPoolExecutor` class. Or, if you want fine control over the dispatching algorithm, you can write @@ -679,7 +679,7 @@ How can I mimic CGI form submission (METHOD=POST)? I would like to retrieve web pages that are the result of POSTing a form. Is there existing code that would let me do this easily? -Yes. Here's a simple example that uses urllib.request:: +Yes. Here's a simple example that uses :mod:`urllib.request`:: #!/usr/local/bin/python @@ -765,20 +765,21 @@ The :mod:`select` module is commonly used to help with asynchronous I/O on sockets. To prevent the TCP connect from blocking, you can set the socket to non-blocking -mode. Then when you do the ``connect()``, you will either connect immediately +mode. Then when you do the :meth:`socket.connect`, you will either connect immediately (unlikely) or get an exception that contains the error number as ``.errno``. ``errno.EINPROGRESS`` indicates that the connection is in progress, but hasn't finished yet. Different OSes will return different values, so you're going to have to check what's returned on your system. -You can use the ``connect_ex()`` method to avoid creating an exception. It will -just return the errno value. To poll, you can call ``connect_ex()`` again later +You can use the :meth:`socket.connect_ex` method to avoid creating an exception. It will +just return the errno value. To poll, you can call :meth:`socket.connect_ex` again later -- ``0`` or ``errno.EISCONN`` indicate that you're connected -- or you can pass this -socket to select to check if it's writable. +socket to :meth:`select.select` to check if it's writable. .. note:: - The :mod:`asyncore` module presents a framework-like approach to the problem - of writing non-blocking networking code. + The :mod:`asyncio` module provides a general purpose single-threaded and + concurrent asynchronous library, which can be used for writing non-blocking + network code. The third-party `Twisted `_ library is a popular and feature-rich alternative. @@ -832,8 +833,8 @@ There are also many other specialized generators in this module, such as: Some higher-level functions operate on sequences directly, such as: -* ``choice(S)`` chooses random element from a given sequence -* ``shuffle(L)`` shuffles a list in-place, i.e. permutes it randomly +* ``choice(S)`` chooses a random element from a given sequence. +* ``shuffle(L)`` shuffles a list in-place, i.e. permutes it randomly. There's also a ``Random`` class you can instantiate to create independent multiple random number generators. diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 70e9190e..66d210a5 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -840,10 +840,11 @@ For integers, use the built-in :func:`int` type constructor, e.g. ``int('144') e.g. ``float('144') == 144.0``. By default, these interpret the number as decimal, so that ``int('0144') == -144`` and ``int('0x144')`` raises :exc:`ValueError`. ``int(string, base)`` takes -the base to convert from as a second optional argument, so ``int('0x144', 16) == -324``. If the base is specified as 0, the number is interpreted using Python's -rules: a leading '0o' indicates octal, and '0x' indicates a hex number. +144`` holds true, and ``int('0x144')`` raises :exc:`ValueError`. ``int(string, +base)`` takes the base to convert from as a second optional argument, so ``int( +'0x144', 16) == 324``. If the base is specified as 0, the number is interpreted +using Python's rules: a leading '0o' indicates octal, and '0x' indicates a hex +number. Do not use the built-in function :func:`eval` if all you need is to convert strings to numbers. :func:`eval` will be significantly slower and it presents a diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 7be755e4..9fdbdb1a 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -1084,19 +1084,15 @@ Glossary Type aliases are useful for simplifying :term:`type hints `. For example:: - from typing import List, Tuple - def remove_gray_shades( - colors: List[Tuple[int, int, int]]) -> List[Tuple[int, int, int]]: + colors: list[tuple[int, int, int]]) -> list[tuple[int, int, int]]: pass could be made more readable like this:: - from typing import List, Tuple - - Color = Tuple[int, int, int] + Color = tuple[int, int, int] - def remove_gray_shades(colors: List[Color]) -> List[Color]: + def remove_gray_shades(colors: list[Color]) -> list[Color]: pass See :mod:`typing` and :pep:`484`, which describe this functionality. diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 4d25d2cc..b792b6c6 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -145,7 +145,7 @@ print a message for each get or set. Overriding :meth:`__getattribute__` is alternate approach that could do this for every attribute. However, this descriptor is useful for monitoring just a few chosen attributes:: - class RevealAccess(object): + class RevealAccess: """A data descriptor that sets and returns values normally and prints a message logging their access. """ @@ -162,7 +162,7 @@ descriptor is useful for monitoring just a few chosen attributes:: print('Updating', self.name) self.val = val - >>> class MyClass(object): + >>> class MyClass: ... x = RevealAccess(10, 'var "x"') ... y = 5 ... @@ -194,7 +194,7 @@ triggers function calls upon access to an attribute. Its signature is:: The documentation shows a typical use to define a managed attribute ``x``:: - class C(object): + class C: def getx(self): return self.__x def setx(self, value): self.__x = value def delx(self): del self.__x @@ -203,7 +203,7 @@ The documentation shows a typical use to define a managed attribute ``x``:: To see how :func:`property` is implemented in terms of the descriptor protocol, here is a pure Python equivalent:: - class Property(object): + class Property: "Emulate PyProperty_Type() in Objects/descrobject.c" def __init__(self, fget=None, fset=None, fdel=None, doc=None): @@ -250,7 +250,7 @@ to be recalculated on every access; however, the programmer does not want to affect existing client code accessing the attribute directly. The solution is to wrap access to the value attribute in a property data descriptor:: - class Cell(object): + class Cell: . . . def getvalue(self): "Recalculate the cell before returning value" @@ -277,7 +277,7 @@ binding methods during attribute access. This means that all functions are non-data descriptors which return bound methods when they are invoked from an object. In pure Python, it works like this:: - class Function(object): + class Function: . . . def __get__(self, obj, objtype=None): "Simulate func_descr_get() in Objects/funcobject.c" @@ -287,7 +287,7 @@ object. In pure Python, it works like this:: Running the interpreter shows how the function descriptor works in practice:: - >>> class D(object): + >>> class D: ... def f(self, x): ... return x ... @@ -365,7 +365,7 @@ It can be called either from an object or the class: ``s.erf(1.5) --> .9332`` o Since staticmethods return the underlying function with no changes, the example calls are unexciting:: - >>> class E(object): + >>> class E: ... def f(x): ... print(x) ... f = staticmethod(f) @@ -378,7 +378,7 @@ calls are unexciting:: Using the non-data descriptor protocol, a pure Python version of :func:`staticmethod` would look like this:: - class StaticMethod(object): + class StaticMethod: "Emulate PyStaticMethod_Type() in Objects/funcobject.c" def __init__(self, f): @@ -391,7 +391,7 @@ Unlike static methods, class methods prepend the class reference to the argument list before calling the function. This format is the same for whether the caller is an object or a class:: - >>> class E(object): + >>> class E: ... def f(klass, x): ... return klass.__name__, x ... f = classmethod(f) @@ -408,7 +408,7 @@ is to create alternate class constructors. In Python 2.3, the classmethod :func:`dict.fromkeys` creates a new dictionary from a list of keys. The pure Python equivalent is:: - class Dict(object): + class Dict: . . . def fromkeys(klass, iterable, value=None): "Emulate dict_fromkeys() in Objects/dictobject.c" @@ -426,7 +426,7 @@ Now a new dictionary of unique keys can be constructed like this:: Using the non-data descriptor protocol, a pure Python version of :func:`classmethod` would look like this:: - class ClassMethod(object): + class ClassMethod: "Emulate PyClassMethod_Type() in Objects/funcobject.c" def __init__(self, f): diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 7a68ca89..6316e086 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -128,10 +128,18 @@ look at that next. Be sure to try the following in a newly-started Python interpreter, and don't just continue from the session described above:: import logging - logging.basicConfig(filename='example.log',level=logging.DEBUG) + logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') + logging.error('And non-ASCII stuff, too, like Øresund and Malmö') + +.. versionchanged:: 3.9 + The *encoding* argument was added. In earlier Python versions, or if not + specified, the encoding used is the default value used by :func:`open`. While + not shown in the above example, an *errors* argument can also now be passed, + which determines how encoding errors are handled. For available values and + the default, see the documentation for :func:`open`. And now if we open the file and look at what we have, we should find the log messages: @@ -141,6 +149,7 @@ messages: DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too + ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö This example also shows how you can set the logging level which acts as the threshold for tracking. In this case, because we set the threshold to @@ -1077,8 +1086,7 @@ need: | | :func:`sys._getframe`, which may help | | | to speed up your code in environments | | | like PyPy (which can't speed up code | -| | that uses :func:`sys._getframe`), if | -| | and when PyPy supports Python 3.x. | +| | that uses :func:`sys._getframe`). | +-----------------------------------------------+----------------------------------------+ | Threading information. | Set ``logging.logThreads`` to ``0``. | +-----------------------------------------------+----------------------------------------+ diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst index 8608162b..1543823c 100644 --- a/Doc/howto/pyporting.rst +++ b/Doc/howto/pyporting.rst @@ -31,20 +31,26 @@ are: #. Only worry about supporting Python 2.7 #. Make sure you have good test coverage (coverage.py_ can help; - ``pip install coverage``) + ``python -m pip install coverage``) #. Learn the differences between Python 2 & 3 -#. Use Futurize_ (or Modernize_) to update your code (e.g. ``pip install future``) +#. Use Futurize_ (or Modernize_) to update your code (e.g. ``python -m pip install future``) #. Use Pylint_ to help make sure you don't regress on your Python 3 support - (``pip install pylint``) + (``python -m pip install pylint``) #. Use caniusepython3_ to find out which of your dependencies are blocking your - use of Python 3 (``pip install caniusepython3``) + use of Python 3 (``python -m pip install caniusepython3``) #. Once your dependencies are no longer blocking you, use continuous integration to make sure you stay compatible with Python 2 & 3 (tox_ can help test - against multiple versions of Python; ``pip install tox``) + against multiple versions of Python; ``python -m pip install tox``) #. Consider using optional static type checking to make sure your type usage works in both Python 2 & 3 (e.g. use mypy_ to check your typing under both - Python 2 & Python 3). + Python 2 & Python 3; ``python -m pip install mypy``). +.. note:: + + Note: Using ``python -m pip install`` guarantees that the ``pip`` you invoke + is the one installed for the Python currently in use, whether it be + a system-wide ``pip`` or one installed within a + :ref:`virtual environment `. Details ======= @@ -71,7 +77,7 @@ Drop support for Python 2.6 and older While you can make Python 2.5 work with Python 3, it is **much** easier if you only have to work with Python 2.7. If dropping Python 2.5 is not an option then the six_ project can help you support Python 2.5 & 3 simultaneously -(``pip install six``). Do realize, though, that nearly all the projects listed +(``python -m pip install six``). Do realize, though, that nearly all the projects listed in this HOWTO will not be available to you. If you are able to skip Python 2.5 and older, then the required changes diff --git a/Doc/howto/sockets.rst b/Doc/howto/sockets.rst index b5c2152e..d6ed128e 100644 --- a/Doc/howto/sockets.rst +++ b/Doc/howto/sockets.rst @@ -317,7 +317,7 @@ know about the mechanics of using sockets. You'll still use the same calls, in much the same ways. It's just that, if you do it right, your app will be almost inside-out. -In Python, you use ``socket.setblocking(0)`` to make it non-blocking. In C, it's +In Python, you use ``socket.setblocking(False)`` to make it non-blocking. In C, it's more complex, (for one thing, you'll need to choose between the BSD flavor ``O_NONBLOCK`` and the almost indistinguishable POSIX flavor ``O_NDELAY``, which is completely different from ``TCP_NODELAY``), but it's the exact same idea. You diff --git a/Doc/howto/sorting.rst b/Doc/howto/sorting.rst index 1d6d5c45..a8efe653 100644 --- a/Doc/howto/sorting.rst +++ b/Doc/howto/sorting.rst @@ -43,16 +43,18 @@ Key Functions ============= Both :meth:`list.sort` and :func:`sorted` have a *key* parameter to specify a -function to be called on each list element prior to making comparisons. +function (or other callable) to be called on each list element prior to making +comparisons. For example, here's a case-insensitive string comparison: >>> sorted("This is a test string from Andrew".split(), key=str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This'] -The value of the *key* parameter should be a function that takes a single argument -and returns a key to use for sorting purposes. This technique is fast because -the key function is called exactly once for each input record. +The value of the *key* parameter should be a function (or other callable) that +takes a single argument and returns a key to use for sorting purposes. This +technique is fast because the key function is called exactly once for each +input record. A common pattern is to sort complex objects using some of the object's indices as keys. For example: diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index 51bd64bf..e948c1e3 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -41,8 +41,9 @@ but these are two different characters that have different meanings. The Unicode standard describes how characters are represented by **code points**. A code point value is an integer in the range 0 to -0x10FFFF (about 1.1 million values, with some 110 thousand assigned so -far). In the standard and in this document, a code point is written +0x10FFFF (about 1.1 million values, the +`actual number assigned `_ +is less than that). In the standard and in this document, a code point is written using the notation ``U+265E`` to mean the character with value ``0x265e`` (9,822 in decimal). @@ -156,9 +157,9 @@ UTF-8 has several convenient properties: References ---------- -The `Unicode Consortium site `_ has character charts, a +The `Unicode Consortium site `_ has character charts, a glossary, and PDF versions of the Unicode specification. Be prepared for some -difficult reading. `A chronology `_ of the +difficult reading. `A chronology `_ of the origin and development of Unicode is also available on the site. On the Computerphile Youtube channel, Tom Scott briefly @@ -393,7 +394,7 @@ These are grouped into categories such as "Letter", "Number", "Punctuation", or from the above output, ``'Ll'`` means 'Letter, lowercase', ``'No'`` means "Number, other", ``'Mn'`` is "Mark, nonspacing", and ``'So'`` is "Symbol, other". See -`the General Category Values section of the Unicode Character Database documentation `_ for a +`the General Category Values section of the Unicode Character Database documentation `_ for a list of category codes. diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst index c3ff3e60..1d7bd262 100644 --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -9,9 +9,7 @@ of *fixers* to transform it into valid Python 3.x code. The standard library contains a rich set of fixers that will handle almost all code. 2to3 supporting library :mod:`lib2to3` is, however, a flexible and generic library, so it is -possible to write your own fixers for 2to3. :mod:`lib2to3` could also be -adapted to custom applications in which Python code needs to be edited -automatically. +possible to write your own fixers for 2to3. .. _2to3-using: @@ -102,7 +100,7 @@ presence of the ``from __future__ import print_function`` compiler directive, it modifies its internal grammar to interpret :func:`print` as a function. This change can also be enabled manually with the :option:`!-p` flag. Use :option:`!-p` to run fixers on code that already has had its print statements -converted. +converted. Also :option:`!-e` can be used to make :func:`exec` a function. The :option:`!-o` or :option:`!--output-dir` option allows specification of an alternate directory for processed output files to be written to. The @@ -466,9 +464,17 @@ and off individually. They are described here in more detail. -------------- +.. deprecated:: 3.10 + Python 3.9 will switch to a PEG parser (see :pep:`617`), and Python 3.10 may + include new language syntax that is not parsable by lib2to3's LL(1) parser. + The ``lib2to3`` module may be removed from the standard library in a future + Python version. Consider third-party alternatives such as `LibCST`_ or + `parso`_. + .. note:: The :mod:`lib2to3` API should be considered unstable and may change drastically in the future. -.. XXX What is the public interface anyway? +.. _LibCST: https://libcst.readthedocs.io/ +.. _parso: https://parso.readthedocs.io/ diff --git a/Doc/library/_dummy_thread.rst b/Doc/library/_dummy_thread.rst deleted file mode 100644 index 7dccbc55..00000000 --- a/Doc/library/_dummy_thread.rst +++ /dev/null @@ -1,22 +0,0 @@ -:mod:`_dummy_thread` --- Drop-in replacement for the :mod:`_thread` module -========================================================================== - -.. module:: _dummy_thread - :synopsis: Drop-in replacement for the _thread module. - -**Source code:** :source:`Lib/_dummy_thread.py` - -.. deprecated:: 3.7 - Python now always has threading enabled. Please use :mod:`_thread` - (or, better, :mod:`threading`) instead. - --------------- - -This module provides a duplicate interface to the :mod:`_thread` module. -It was meant to be imported when the :mod:`_thread` module was not provided -on a platform. - -Be careful to not use this module where deadlock might occur from a thread being -created that blocks waiting for another thread to be created. This often occurs -with blocking I/O. - diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 2ec7ea3e..7a7a4cf9 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -142,7 +142,7 @@ ArgumentParser objects formatter_class=argparse.HelpFormatter, \ prefix_chars='-', fromfile_prefix_chars=None, \ argument_default=None, conflict_handler='error', \ - add_help=True, allow_abbrev=True) + add_help=True, allow_abbrev=True, exit_on_error=True) Create a new :class:`ArgumentParser` object. All parameters should be passed as keyword arguments. Each parameter has its own more detailed description @@ -179,6 +179,9 @@ ArgumentParser objects * allow_abbrev_ - Allows long options to be abbreviated if the abbreviation is unambiguous. (default: ``True``) + * exit_on_error_ - Determines whether or not ArgumentParser exits with + error info when an error occurs. (default: ``True``) + .. versionchanged:: 3.5 *allow_abbrev* parameter was added. @@ -186,6 +189,9 @@ ArgumentParser objects In previous versions, *allow_abbrev* also disabled grouping of short flags such as ``-vv`` to mean ``-v -v``. + .. versionchanged:: 3.9 + *exit_on_error* parameter was added. + The following sections describe how each of these are used. @@ -443,7 +449,7 @@ default values to each of the argument help messages:: >>> parser.add_argument('--foo', type=int, default=42, help='FOO!') >>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!') >>> parser.print_help() - usage: PROG [-h] [--foo FOO] [bar [bar ...]] + usage: PROG [-h] [--foo FOO] [bar ...] positional arguments: bar BAR! (default: [1, 2, 3]) @@ -647,6 +653,28 @@ the help options:: +h, ++help show this help message and exit +exit_on_error +^^^^^^^^^^^^^ + +Normally, when you pass an invalid argument list to the :meth:`~ArgumentParser.parse_args` +method of an :class:`ArgumentParser`, it will exit with error info. + +If the user would like catch errors manually, the feature can be enable by setting +``exit_on_error`` to ``False``:: + + >>> parser = argparse.ArgumentParser(exit_on_error=False) + >>> parser.add_argument('--integers', type=int) + _StoreAction(option_strings=['--integers'], dest='integers', nargs=None, const=None, default=None, type=, choices=None, help=None, metavar=None) + >>> try: + ... parser.parse_args('--integers a'.split()) + ... except argparse.ArgumentError: + ... print('Catching an argumentError') + ... + Catching an argumentError + +.. versionadded:: 3.9 + + The add_argument() method ------------------------- @@ -815,9 +843,19 @@ how the command-line arguments should be handled. The supplied actions are: .. versionadded:: 3.8 You may also specify an arbitrary action by passing an Action subclass or -other object that implements the same interface. The recommended way to do -this is to extend :class:`Action`, overriding the ``__call__`` method -and optionally the ``__init__`` method. +other object that implements the same interface. The ``BooleanOptionalAction`` +is available in ``argparse`` and adds support for boolean actions such as +``--foo`` and ``--no-foo``:: + + >>> import argparse + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction) + >>> parser.parse_args(['--no-foo']) + Namespace(foo=False) + +The recommended way to create a custom action is to extend :class:`Action`, +overriding the ``__call__`` method and optionally the ``__init__`` and +``format_usage`` methods. An example of a custom action:: @@ -923,19 +961,6 @@ values are: usage: PROG [-h] foo [foo ...] PROG: error: the following arguments are required: foo -.. _`argparse.REMAINDER`: - -* ``argparse.REMAINDER``. All the remaining command-line arguments are gathered - into a list. This is commonly useful for command line utilities that dispatch - to other command line utilities:: - - >>> parser = argparse.ArgumentParser(prog='PROG') - >>> parser.add_argument('--foo') - >>> parser.add_argument('command') - >>> parser.add_argument('args', nargs=argparse.REMAINDER) - >>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split())) - Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B') - If the ``nargs`` keyword argument is not provided, the number of arguments consumed is determined by the action_. Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced. @@ -1108,6 +1133,20 @@ container should match the type_ specified:: Any container can be passed as the *choices* value, so :class:`list` objects, :class:`set` objects, and custom containers are all supported. +This includes :class:`enum.Enum`, which could be used to restrain +argument's choices; if we reuse previous rock/paper/scissors game example, +this could be as follows:: + + >>> from enum import Enum + >>> class GameMove(Enum): + ... ROCK = 'rock' + ... PAPER = 'paper' + ... SCISSORS = 'scissors' + ... + >>> parser = argparse.ArgumentParser(prog='game.py') + >>> parser.add_argument('move', type=GameMove, choices=GameMove) + >>> parser.parse_args(['rock']) + Namespace(move=) required @@ -1337,6 +1376,9 @@ Action instances should be callable, so subclasses must override the The ``__call__`` method may perform arbitrary actions, but will typically set attributes on the ``namespace`` based on ``dest`` and ``values``. +Action subclasses can define a ``format_usage`` method that takes no argument +and return a string which will be used when printing the usage of the program. +If such method is not provided, a sensible default will be used. The parse_args() method ----------------------- diff --git a/Doc/library/array.rst b/Doc/library/array.rst index 6809c512..78020738 100644 --- a/Doc/library/array.rst +++ b/Doc/library/array.rst @@ -22,7 +22,7 @@ defined: +-----------+--------------------+-------------------+-----------------------+-------+ | ``'B'`` | unsigned char | int | 1 | | +-----------+--------------------+-------------------+-----------------------+-------+ -| ``'u'`` | Py_UNICODE | Unicode character | 2 | \(1) | +| ``'u'`` | wchar_t | Unicode character | 2 | \(1) | +-----------+--------------------+-------------------+-----------------------+-------+ | ``'h'`` | signed short | int | 2 | | +-----------+--------------------+-------------------+-----------------------+-------+ @@ -48,15 +48,16 @@ defined: Notes: (1) - The ``'u'`` type code corresponds to Python's obsolete unicode character - (:c:type:`Py_UNICODE` which is :c:type:`wchar_t`). Depending on the - platform, it can be 16 bits or 32 bits. + It can be 16 bits or 32 bits depending on the platform. - ``'u'`` will be removed together with the rest of the :c:type:`Py_UNICODE` - API. + .. versionchanged:: 3.9 + ``array('u')`` now uses ``wchar_t`` as C type instead of deprecated + ``Py_UNICODE``. This change doesn't affect to its behavior because + ``Py_UNICODE`` is alias of ``wchar_t`` since Python 3.3. .. deprecated-removed:: 3.3 4.0 + The actual representation of values is determined by the machine architecture (strictly speaking, by the C implementation). The actual size can be accessed through the :attr:`itemsize` attribute. @@ -169,13 +170,6 @@ The following data items and methods are also supported: a.append(x)`` except that if there is a type error, the array is unchanged. -.. method:: array.fromstring() - - Deprecated alias for :meth:`frombytes`. - - .. deprecated-removed:: 3.2 3.9 - - .. method:: array.fromunicode(s) Extends this array with data from the given unicode string. The array must @@ -233,13 +227,6 @@ The following data items and methods are also supported: Convert the array to an ordinary list with the same items. -.. method:: array.tostring() - - Deprecated alias for :meth:`tobytes`. - - .. deprecated-removed:: 3.2 3.9 - - .. method:: array.tounicode() Convert the array to a unicode string. The array must be a type ``'u'`` array; diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 67c6392a..755c60fb 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -7,6 +7,10 @@ .. sectionauthor:: Martin v. Löwis .. sectionauthor:: Georg Brandl +.. testsetup:: + + import ast + **Source code:** :source:`Lib/ast.py` -------------- @@ -23,6 +27,17 @@ classes all inherit from :class:`ast.AST`. An abstract syntax tree can be compiled into a Python code object using the built-in :func:`compile` function. +.. _abstract-grammar: + +Abstract Grammar +---------------- + +The abstract grammar is currently defined as follows: + +.. literalinclude:: ../../Parser/Python.asdl + :language: asdl + + Node classes ------------ @@ -105,23 +120,1388 @@ Node classes Class :class:`ast.Constant` is now used for all constants. +.. versionchanged:: 3.9 + + Simple indices are represented by their value, extended slices are + represented as tuples. + .. deprecated:: 3.8 Old classes :class:`ast.Num`, :class:`ast.Str`, :class:`ast.Bytes`, :class:`ast.NameConstant` and :class:`ast.Ellipsis` are still available, - but they will be removed in future Python releases. In the meanwhile, + but they will be removed in future Python releases. In the meantime, instantiating them will return an instance of a different class. +.. deprecated:: 3.9 -.. _abstract-grammar: + Old classes :class:`ast.Index` and :class:`ast.ExtSlice` are still + available, but they will be removed in future Python releases. + In the meantime, instantiating them will return an instance of + a different class. -Abstract Grammar ----------------- -The abstract grammar is currently defined as follows: +Literals +^^^^^^^^ -.. literalinclude:: ../../Parser/Python.asdl - :language: none +.. class:: Constant(value) + + A constant value. The ``value`` attribute of the ``Constant`` literal contains the + Python object it represents. The values represented can be simple types + such as a number, string or ``None``, but also immutable container types + (tuples and frozensets) if all of their elements are constant. + + .. doctest:: + + >>> print(ast.dump(ast.parse('123', mode='eval'), indent=4)) + Expression( + body=Constant(value=123)) + + +.. class:: FormattedValue(value, conversion, format_spec) + + Node representing a single formatting field in an f-string. If the string + contains a single formatting field and nothing else the node can be + isolated otherwise it appears in :class:`JoinedStr`. + + * ``value`` is any expression node (such as a literal, a variable, or a + function call). + * ``conversion`` is an integer: + + * -1: no formatting + * 115: ``!s`` string formatting + * 114: ``!r`` repr formatting + * 97: ``!a`` ascii formatting + + * ``format_spec`` is a :class:`JoinedStr` node representing the formatting + of the value, or ``None`` if no format was specified. Both + ``conversion`` and ``format_spec`` can be set at the same time. + + +.. class:: JoinedStr(values) + + An f-string, comprising a series of :class:`FormattedValue` and :class:`Constant` + nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('f"sin({a}) is {sin(a):.3}"', mode='eval'), indent=4)) + Expression( + body=JoinedStr( + values=[ + Constant(value='sin('), + FormattedValue( + value=Name(id='a', ctx=Load()), + conversion=-1), + Constant(value=') is '), + FormattedValue( + value=Call( + func=Name(id='sin', ctx=Load()), + args=[ + Name(id='a', ctx=Load())], + keywords=[]), + conversion=-1, + format_spec=JoinedStr( + values=[ + Constant(value='.3')]))])) + + +.. class:: List(elts, ctx) + Tuple(elts, ctx) + + A list or tuple. ``elts`` holds a list of nodes representing the elements. + ``ctx`` is :class:`Store` if the container is an assignment target (i.e. + ``(x,y)=something``), and :class:`Load` otherwise. + + .. doctest:: + + >>> print(ast.dump(ast.parse('[1, 2, 3]', mode='eval'), indent=4)) + Expression( + body=List( + elts=[ + Constant(value=1), + Constant(value=2), + Constant(value=3)], + ctx=Load())) + >>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4)) + Expression( + body=Tuple( + elts=[ + Constant(value=1), + Constant(value=2), + Constant(value=3)], + ctx=Load())) + + +.. class:: Set(elts) + + A set. ``elts`` holds a list of nodes representing the set's elements. + + .. doctest:: + + >>> print(ast.dump(ast.parse('{1, 2, 3}', mode='eval'), indent=4)) + Expression( + body=Set( + elts=[ + Constant(value=1), + Constant(value=2), + Constant(value=3)])) + + +.. class:: Dict(keys, values) + + A dictionary. ``keys`` and ``values`` hold lists of nodes representing the + keys and the values respectively, in matching order (what would be returned + when calling :code:`dictionary.keys()` and :code:`dictionary.values()`). + + When doing dictionary unpacking using dictionary literals the expression to be + expanded goes in the ``values`` list, with a ``None`` at the corresponding + position in ``keys``. + + .. doctest:: + + >>> print(ast.dump(ast.parse('{"a":1, **d}', mode='eval'), indent=4)) + Expression( + body=Dict( + keys=[ + Constant(value='a'), + None], + values=[ + Constant(value=1), + Name(id='d', ctx=Load())])) + + +Variables +^^^^^^^^^ + +.. class:: Name(id, ctx) + + A variable name. ``id`` holds the name as a string, and ``ctx`` is one of + the following types. + + +.. class:: Load() + Store() + Del() + + Variable references can be used to load the value of a variable, to assign + a new value to it, or to delete it. Variable references are given a context + to distinguish these cases. + + .. doctest:: + + >>> print(ast.dump(ast.parse('a'), indent=4)) + Module( + body=[ + Expr( + value=Name(id='a', ctx=Load()))], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('a = 1'), indent=4)) + Module( + body=[ + Assign( + targets=[ + Name(id='a', ctx=Store())], + value=Constant(value=1))], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('del a'), indent=4)) + Module( + body=[ + Delete( + targets=[ + Name(id='a', ctx=Del())])], + type_ignores=[]) + + +.. class:: Starred(value, ctx) + + A ``*var`` variable reference. ``value`` holds the variable, typically a + :class:`Name` node. This type must be used when building a :class:`Call` + node with ``*args``. + + .. doctest:: + + >>> print(ast.dump(ast.parse('a, *b = it'), indent=4)) + Module( + body=[ + Assign( + targets=[ + Tuple( + elts=[ + Name(id='a', ctx=Store()), + Starred( + value=Name(id='b', ctx=Store()), + ctx=Store())], + ctx=Store())], + value=Name(id='it', ctx=Load()))], + type_ignores=[]) + + +Expressions +^^^^^^^^^^^ + +.. class:: Expr(value) + + When an expression, such as a function call, appears as a statement by itself + with its return value not used or stored, it is wrapped in this container. + ``value`` holds one of the other nodes in this section, a :class:`Constant`, a + :class:`Name`, a :class:`Lambda`, a :class:`Yield` or :class:`YieldFrom` node. + + .. doctest:: + + >>> print(ast.dump(ast.parse('-a'), indent=4)) + Module( + body=[ + Expr( + value=UnaryOp( + op=USub(), + operand=Name(id='a', ctx=Load())))], + type_ignores=[]) + + +.. class:: UnaryOp(op, operand) + + A unary operation. ``op`` is the operator, and ``operand`` any expression + node. + + +.. class:: UAdd + USub + Not + Invert + + Unary operator tokens. :class:`Not` is the ``not`` keyword, :class:`Invert` + is the ``~`` operator. + + .. doctest:: + + >>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4)) + Expression( + body=UnaryOp( + op=Not(), + operand=Name(id='x', ctx=Load()))) + + +.. class:: BinOp(left, op, right) + + A binary operation (like addition or division). ``op`` is the operator, and + ``left`` and ``right`` are any expression nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4)) + Expression( + body=BinOp( + left=Name(id='x', ctx=Load()), + op=Add(), + right=Name(id='y', ctx=Load()))) + + +.. class:: Add + Sub + Mult + Div + FloorDiv + Mod + Pow + LShift + RShift + BitOr + BitXor + BitAnd + MatMult + + Binary operator tokens. + + +.. class:: BoolOp(op, values) + + A boolean operation, 'or' or 'and'. ``op`` is :class:`Or` or :class:`And`. + ``values`` are the values involved. Consecutive operations with the same + operator, such as ``a or b or c``, are collapsed into one node with several + values. + + This doesn't include ``not``, which is a :class:`UnaryOp`. + + .. doctest:: + + >>> print(ast.dump(ast.parse('x or y', mode='eval'), indent=4)) + Expression( + body=BoolOp( + op=Or(), + values=[ + Name(id='x', ctx=Load()), + Name(id='y', ctx=Load())])) + + +.. class:: And + Or + + Boolean operator tokens. + + +.. class:: Compare(left, ops, comparators) + + A comparison of two or more values. ``left`` is the first value in the + comparison, ``ops`` the list of operators, and ``comparators`` the list + of values after the first element in the comparison. + + .. doctest:: + + >>> print(ast.dump(ast.parse('1 <= a < 10', mode='eval'), indent=4)) + Expression( + body=Compare( + left=Constant(value=1), + ops=[ + LtE(), + Lt()], + comparators=[ + Name(id='a', ctx=Load()), + Constant(value=10)])) + + +.. class:: Eq + NotEq + Lt + LtE + Gt + GtE + Is + IsNot + In + NotIn + + Comparison operator tokens. + + +.. class:: Call(func, args, keywords, starargs, kwargs) + + A function call. ``func`` is the function, which will often be a + :class:`Name` or :class:`Attribute` object. Of the arguments: + + * ``args`` holds a list of the arguments passed by position. + * ``keywords`` holds a list of :class:`keyword` objects representing + arguments passed by keyword. + + When creating a ``Call`` node, ``args`` and ``keywords`` are required, but + they can be empty lists. ``starargs`` and ``kwargs`` are optional. + + .. doctest:: + + >>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4)) + Expression( + body=Call( + func=Name(id='func', ctx=Load()), + args=[ + Name(id='a', ctx=Load()), + Starred( + value=Name(id='d', ctx=Load()), + ctx=Load())], + keywords=[ + keyword( + arg='b', + value=Name(id='c', ctx=Load())), + keyword( + value=Name(id='e', ctx=Load()))])) + + +.. class:: keyword(arg, value) + + A keyword argument to a function call or class definition. ``arg`` is a raw + string of the parameter name, ``value`` is a node to pass in. + + +.. class:: IfExp(test, body, orelse) + + An expression such as ``a if b else c``. Each field holds a single node, so + in the following example, all three are :class:`Name` nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4)) + Expression( + body=IfExp( + test=Name(id='b', ctx=Load()), + body=Name(id='a', ctx=Load()), + orelse=Name(id='c', ctx=Load()))) + + +.. class:: Attribute(value, attr, ctx) + + Attribute access, e.g. ``d.keys``. ``value`` is a node, typically a + :class:`Name`. ``attr`` is a bare string giving the name of the attribute, + and ``ctx`` is :class:`Load`, :class:`Store` or :class:`Del` according to how + the attribute is acted on. + + .. doctest:: + + >>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4)) + Expression( + body=Attribute( + value=Name(id='snake', ctx=Load()), + attr='colour', + ctx=Load())) + + +.. class:: NamedExpr(target, value) + + A named expression. This AST node is produced by the assignment expressions + operator (also known as the walrus operator). As opposed to the :class:`Assign` + node in which the first argument can be multiple nodes, in this case both + ``target`` and ``value`` must be single nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4)) + Expression( + body=NamedExpr( + target=Name(id='x', ctx=Store()), + value=Constant(value=4))) + + +Subscripting +~~~~~~~~~~~~ + +.. class:: Subscript(value, slice, ctx) + + A subscript, such as ``l[1]``. ``value`` is the subscripted object + (usually sequence or mapping). ``slice`` is an index, slice or key. + It can be a :class:`Tuple` and contain a :class:`Slice`. + ``ctx`` is :class:`Load`, :class:`Store` or :class:`Del` + according to the action performed with the subscript. + + .. doctest:: + + >>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4)) + Expression( + body=Subscript( + value=Name(id='l', ctx=Load()), + slice=Tuple( + elts=[ + Slice( + lower=Constant(value=1), + upper=Constant(value=2)), + Constant(value=3)], + ctx=Load()), + ctx=Load())) + + +.. class:: Slice(lower, upper, step) + + Regular slicing (on the form ``lower:upper`` or ``lower:upper:step``). + Can occur only inside the *slice* field of :class:`Subscript`, either + directly or as an element of :class:`Tuple`. + + .. doctest:: + + >>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4)) + Expression( + body=Subscript( + value=Name(id='l', ctx=Load()), + slice=Slice( + lower=Constant(value=1), + upper=Constant(value=2)), + ctx=Load())) + + +Comprehensions +~~~~~~~~~~~~~~ + +.. class:: ListComp(elt, generators) + SetComp(elt, generators) + GeneratorExp(elt, generators) + DictComp(key, value, generators) + + List and set comprehensions, generator expressions, and dictionary + comprehensions. ``elt`` (or ``key`` and ``value``) is a single node + representing the part that will be evaluated for each item. + + ``generators`` is a list of :class:`comprehension` nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('[x for x in numbers]', mode='eval'), indent=4)) + Expression( + body=ListComp( + elt=Name(id='x', ctx=Load()), + generators=[ + comprehension( + target=Name(id='x', ctx=Store()), + iter=Name(id='numbers', ctx=Load()), + ifs=[], + is_async=0)])) + >>> print(ast.dump(ast.parse('{x: x**2 for x in numbers}', mode='eval'), indent=4)) + Expression( + body=DictComp( + key=Name(id='x', ctx=Load()), + value=BinOp( + left=Name(id='x', ctx=Load()), + op=Pow(), + right=Constant(value=2)), + generators=[ + comprehension( + target=Name(id='x', ctx=Store()), + iter=Name(id='numbers', ctx=Load()), + ifs=[], + is_async=0)])) + >>> print(ast.dump(ast.parse('{x for x in numbers}', mode='eval'), indent=4)) + Expression( + body=SetComp( + elt=Name(id='x', ctx=Load()), + generators=[ + comprehension( + target=Name(id='x', ctx=Store()), + iter=Name(id='numbers', ctx=Load()), + ifs=[], + is_async=0)])) + + +.. class:: comprehension(target, iter, ifs, is_async) + + One ``for`` clause in a comprehension. ``target`` is the reference to use for + each element - typically a :class:`Name` or :class:`Tuple` node. ``iter`` + is the object to iterate over. ``ifs`` is a list of test expressions: each + ``for`` clause can have multiple ``ifs``. + + ``is_async`` indicates a comprehension is asynchronous (using an + ``async for`` instead of ``for``). The value is an integer (0 or 1). + + .. doctest:: + + >>> print(ast.dump(ast.parse('[ord(c) for line in file for c in line]', mode='eval'), + ... indent=4)) # Multiple comprehensions in one. + Expression( + body=ListComp( + elt=Call( + func=Name(id='ord', ctx=Load()), + args=[ + Name(id='c', ctx=Load())], + keywords=[]), + generators=[ + comprehension( + target=Name(id='line', ctx=Store()), + iter=Name(id='file', ctx=Load()), + ifs=[], + is_async=0), + comprehension( + target=Name(id='c', ctx=Store()), + iter=Name(id='line', ctx=Load()), + ifs=[], + is_async=0)])) + + >>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'), + ... indent=4)) # generator comprehension + Expression( + body=GeneratorExp( + elt=BinOp( + left=Name(id='n', ctx=Load()), + op=Pow(), + right=Constant(value=2)), + generators=[ + comprehension( + target=Name(id='n', ctx=Store()), + iter=Name(id='it', ctx=Load()), + ifs=[ + Compare( + left=Name(id='n', ctx=Load()), + ops=[ + Gt()], + comparators=[ + Constant(value=5)]), + Compare( + left=Name(id='n', ctx=Load()), + ops=[ + Lt()], + comparators=[ + Constant(value=10)])], + is_async=0)])) + + >>> print(ast.dump(ast.parse('[i async for i in soc]', mode='eval'), + ... indent=4)) # Async comprehension + Expression( + body=ListComp( + elt=Name(id='i', ctx=Load()), + generators=[ + comprehension( + target=Name(id='i', ctx=Store()), + iter=Name(id='soc', ctx=Load()), + ifs=[], + is_async=1)])) + +Statements +^^^^^^^^^^ + +.. class:: Assign(targets, value, type_comment) + + An assignment. ``targets`` is a list of nodes, and ``value`` is a single node. + + Multiple nodes in ``targets`` represents assigning the same value to each. + Unpacking is represented by putting a :class:`Tuple` or :class:`List` + within ``targets``. + + .. attribute:: type_comment + + ``type_comment`` is an optional string with the type annotation as a comment. + + .. doctest:: + + >>> print(ast.dump(ast.parse('a = b = 1'), indent=4)) # Multiple assignment + Module( + body=[ + Assign( + targets=[ + Name(id='a', ctx=Store()), + Name(id='b', ctx=Store())], + value=Constant(value=1))], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # Unpacking + Module( + body=[ + Assign( + targets=[ + Tuple( + elts=[ + Name(id='a', ctx=Store()), + Name(id='b', ctx=Store())], + ctx=Store())], + value=Name(id='c', ctx=Load()))], + type_ignores=[]) + + +.. class:: AnnAssign(target, annotation, value, simple) + + An assignment with a type annotation. ``target`` is a single node and can + be a :class:`Name`, a :class:`Attribute` or a :class:`Subscript`. + ``annotation`` is the annotation, such as a :class:`Constant` or :class:`Name` + node. ``value`` is a single optional node. ``simple`` is a boolean integer + set to True for a :class:`Name` node in ``target`` that do not appear in + between parenthesis and are hence pure names and not expressions. + + .. doctest:: + + >>> print(ast.dump(ast.parse('c: int'), indent=4)) + Module( + body=[ + AnnAssign( + target=Name(id='c', ctx=Store()), + annotation=Name(id='int', ctx=Load()), + simple=1)], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # Annotation with parenthesis + Module( + body=[ + AnnAssign( + target=Name(id='a', ctx=Store()), + annotation=Name(id='int', ctx=Load()), + value=Constant(value=1), + simple=0)], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('a.b: int'), indent=4)) # Attribute annotation + Module( + body=[ + AnnAssign( + target=Attribute( + value=Name(id='a', ctx=Load()), + attr='b', + ctx=Store()), + annotation=Name(id='int', ctx=Load()), + simple=0)], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # Subscript annotation + Module( + body=[ + AnnAssign( + target=Subscript( + value=Name(id='a', ctx=Load()), + slice=Constant(value=1), + ctx=Store()), + annotation=Name(id='int', ctx=Load()), + simple=0)], + type_ignores=[]) + + +.. class:: AugAssign(target, op, value) + + Augmented assignment, such as ``a += 1``. In the following example, + ``target`` is a :class:`Name` node for ``x`` (with the :class:`Store` + context), ``op`` is :class:`Add`, and ``value`` is a :class:`Constant` with + value for 1. + + The ``target`` attribute connot be of class :class:`Tuple` or :class:`List`, + unlike the targets of :class:`Assign`. + + .. doctest:: + + >>> print(ast.dump(ast.parse('x += 2'), indent=4)) + Module( + body=[ + AugAssign( + target=Name(id='x', ctx=Store()), + op=Add(), + value=Constant(value=2))], + type_ignores=[]) + + +.. class:: Raise(exc, cause) + + A ``raise`` statement. ``exc`` is the exception object to be raised, normally a + :class:`Call` or :class:`Name`, or ``None`` for a standalone ``raise``. + ``cause`` is the optional part for ``y`` in ``raise x from y``. + + .. doctest:: + + >>> print(ast.dump(ast.parse('raise x from y'), indent=4)) + Module( + body=[ + Raise( + exc=Name(id='x', ctx=Load()), + cause=Name(id='y', ctx=Load()))], + type_ignores=[]) + + +.. class:: Assert(test, msg) + + An assertion. ``test`` holds the condition, such as a :class:`Compare` node. + ``msg`` holds the failure message. + + .. doctest:: + + >>> print(ast.dump(ast.parse('assert x,y'), indent=4)) + Module( + body=[ + Assert( + test=Name(id='x', ctx=Load()), + msg=Name(id='y', ctx=Load()))], + type_ignores=[]) + + +.. class:: Delete(targets) + + Represents a ``del`` statement. ``targets`` is a list of nodes, such as + :class:`Name`, :class:`Attribute` or :class:`Subscript` nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('del x,y,z'), indent=4)) + Module( + body=[ + Delete( + targets=[ + Name(id='x', ctx=Del()), + Name(id='y', ctx=Del()), + Name(id='z', ctx=Del())])], + type_ignores=[]) + + +.. class:: Pass() + + A ``pass`` statement. + + .. doctest:: + + >>> print(ast.dump(ast.parse('pass'), indent=4)) + Module( + body=[ + Pass()], + type_ignores=[]) + + +Other statements which are only applicable inside functions or loops are +described in other sections. + +Imports +~~~~~~~ + +.. class:: Import(names) + + An import statement. ``names`` is a list of :class:`alias` nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('import x,y,z'), indent=4)) + Module( + body=[ + Import( + names=[ + alias(name='x'), + alias(name='y'), + alias(name='z')])], + type_ignores=[]) + + +.. class:: ImportFrom(module, names, level) + + Represents ``from x import y``. ``module`` is a raw string of the 'from' name, + without any leading dots, or ``None`` for statements such as ``from . import foo``. + ``level`` is an integer holding the level of the relative import (0 means + absolute import). + + .. doctest:: + + >>> print(ast.dump(ast.parse('from y import x,y,z'), indent=4)) + Module( + body=[ + ImportFrom( + module='y', + names=[ + alias(name='x'), + alias(name='y'), + alias(name='z')], + level=0)], + type_ignores=[]) + + +.. class:: alias(name, asname) + + Both parameters are raw strings of the names. ``asname`` can be ``None`` if + the regular name is to be used. + + .. doctest:: + + >>> print(ast.dump(ast.parse('from ..foo.bar import a as b, c'), indent=4)) + Module( + body=[ + ImportFrom( + module='foo.bar', + names=[ + alias(name='a', asname='b'), + alias(name='c')], + level=2)], + type_ignores=[]) + +Control flow +^^^^^^^^^^^^ + +.. note:: + Optional clauses such as ``else`` are stored as an empty list if they're + not present. + +.. class:: If(test, body, orelse) + + An ``if`` statement. ``test`` holds a single node, such as a :class:`Compare` + node. ``body`` and ``orelse`` each hold a list of nodes. + + ``elif`` clauses don't have a special representation in the AST, but rather + appear as extra :class:`If` nodes within the ``orelse`` section of the + previous one. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... if x: + ... ... + ... elif y: + ... ... + ... else: + ... ... + ... """), indent=4)) + Module( + body=[ + If( + test=Name(id='x', ctx=Load()), + body=[ + Expr( + value=Constant(value=Ellipsis))], + orelse=[ + If( + test=Name(id='y', ctx=Load()), + body=[ + Expr( + value=Constant(value=Ellipsis))], + orelse=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + + +.. class:: For(target, iter, body, orelse, type_comment) + + A ``for`` loop. ``target`` holds the variable(s) the loop assigns to, as a + single :class:`Name`, :class:`Tuple` or :class:`List` node. ``iter`` holds + the item to be looped over, again as a single node. ``body`` and ``orelse`` + contain lists of nodes to execute. Those in ``orelse`` are executed if the + loop finishes normally, rather than via a ``break`` statement. + + .. attribute:: type_comment + + ``type_comment`` is an optional string with the type annotation as a comment. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... for x in y: + ... ... + ... else: + ... ... + ... """), indent=4)) + Module( + body=[ + For( + target=Name(id='x', ctx=Store()), + iter=Name(id='y', ctx=Load()), + body=[ + Expr( + value=Constant(value=Ellipsis))], + orelse=[ + Expr( + value=Constant(value=Ellipsis))])], + type_ignores=[]) + + +.. class:: While(test, body, orelse) + + A ``while`` loop. ``test`` holds the condition, such as a :class:`Compare` + node. + + .. doctest:: + + >> print(ast.dump(ast.parse(""" + ... while x: + ... ... + ... else: + ... ... + ... """), indent=4)) + Module( + body=[ + While( + test=Name(id='x', ctx=Load()), + body=[ + Expr( + value=Constant(value=Ellipsis))], + orelse=[ + Expr( + value=Constant(value=Ellipsis))])], + type_ignores=[]) + + +.. class:: Break + Continue + + The ``break`` and ``continue`` statements. + + .. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... for a in b: + ... if a > 5: + ... break + ... else: + ... continue + ... + ... """), indent=4)) + Module( + body=[ + For( + target=Name(id='a', ctx=Store()), + iter=Name(id='b', ctx=Load()), + body=[ + If( + test=Compare( + left=Name(id='a', ctx=Load()), + ops=[ + Gt()], + comparators=[ + Constant(value=5)]), + body=[ + Break()], + orelse=[ + Continue()])], + orelse=[])], + type_ignores=[]) + + +.. class:: Try(body, handlers, orelse, finalbody) + + ``try`` blocks. All attributes are list of nodes to execute, except for + ``handlers``, which is a list of :class:`ExceptHandler` nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... try: + ... ... + ... except Exception: + ... ... + ... except OtherException as e: + ... ... + ... else: + ... ... + ... finally: + ... ... + ... """), indent=4)) + Module( + body=[ + Try( + body=[ + Expr( + value=Constant(value=Ellipsis))], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Expr( + value=Constant(value=Ellipsis))]), + ExceptHandler( + type=Name(id='OtherException', ctx=Load()), + name='e', + body=[ + Expr( + value=Constant(value=Ellipsis))])], + orelse=[ + Expr( + value=Constant(value=Ellipsis))], + finalbody=[ + Expr( + value=Constant(value=Ellipsis))])], + type_ignores=[]) + + +.. class:: ExceptHandler(type, name, body) + + A single ``except`` clause. ``type`` is the exception type it will match, + typically a :class:`Name` node (or ``None`` for a catch-all ``except:`` clause). + ``name`` is a raw string for the name to hold the exception, or ``None`` if + the clause doesn't have ``as foo``. ``body`` is a list of nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... try: + ... a + 1 + ... except TypeError: + ... pass + ... """), indent=4)) + Module( + body=[ + Try( + body=[ + Expr( + value=BinOp( + left=Name(id='a', ctx=Load()), + op=Add(), + right=Constant(value=1)))], + handlers=[ + ExceptHandler( + type=Name(id='TypeError', ctx=Load()), + body=[ + Pass()])], + orelse=[], + finalbody=[])], + type_ignores=[]) + + +.. class:: With(items, body, type_comment) + + A ``with`` block. ``items`` is a list of :class:`withitem` nodes representing + the context managers, and ``body`` is the indented block inside the context. + + .. attribute:: type_comment + + ``type_comment`` is an optional string with the type annotation as a comment. + + +.. class:: withitem(context_expr, optional_vars) + + A single context manager in a ``with`` block. ``context_expr`` is the context + manager, often a :class:`Call` node. ``optional_vars`` is a :class:`Name`, + :class:`Tuple` or :class:`List` for the ``as foo`` part, or ``None`` if that + isn't used. + + .. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... with a as b, c as d: + ... something(b, d) + ... """), indent=4)) + Module( + body=[ + With( + items=[ + withitem( + context_expr=Name(id='a', ctx=Load()), + optional_vars=Name(id='b', ctx=Store())), + withitem( + context_expr=Name(id='c', ctx=Load()), + optional_vars=Name(id='d', ctx=Store()))], + body=[ + Expr( + value=Call( + func=Name(id='something', ctx=Load()), + args=[ + Name(id='b', ctx=Load()), + Name(id='d', ctx=Load())], + keywords=[]))])], + type_ignores=[]) + + +Function and class definitions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. class:: FunctionDef(name, args, body, decorator_list, returns, type_comment) + + A function definition. + + * ``name`` is a raw string of the function name. + * ``args`` is a :class:`arguments` node. + * ``body`` is the list of nodes inside the function. + * ``decorator_list`` is the list of decorators to be applied, stored outermost + first (i.e. the first in the list will be applied last). + * ``returns`` is the return annotation. + + .. attribute:: type_comment + + ``type_comment`` is an optional string with the type annotation as a comment. + + +.. class:: Lambda(args, body) + + ``lambda`` is a minimal function definition that can be used inside an + expression. Unlike :class:`FunctionDef`, ``body`` holds a single node. + + .. doctest:: + + >>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4)) + Module( + body=[ + Expr( + value=Lambda( + args=arguments( + posonlyargs=[], + args=[ + arg(arg='x'), + arg(arg='y')], + kwonlyargs=[], + kw_defaults=[], + defaults=[]), + body=Constant(value=Ellipsis)))], + type_ignores=[]) + + +.. class:: arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg, defaults) + + The arguments for a function. + + * ``posonlyargs``, ``args`` and ``kwonlyargs`` are lists of :class:`arg` nodes. + * ``vararg`` and ``kwarg`` are single :class:`arg` nodes, referring to the + ``*args, **kwargs`` parameters. + * ``kw_defaults`` is a list of default values for keyword-only arguments. If + one is ``None``, the corresponding argument is required. + * ``defaults`` is a list of default values for arguments that can be passed + positionally. If there are fewer defaults, they correspond to the last n + arguments. + + +.. class:: arg(arg, annotation, type_comment) + + A single argument in a list. ``arg`` is a raw string of the argument + name, ``annotation`` is its annotation, such as a :class:`Str` or + :class:`Name` node. + + .. attribute:: type_comment + + ``type_comment`` is an optional string with the type annotation as a comment + + .. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... @decorator1 + ... @decorator2 + ... def f(a: 'annotation', b=1, c=2, *d, e, f=3, **g) -> 'return annotation': + ... pass + ... """), indent=4)) + Module( + body=[ + FunctionDef( + name='f', + args=arguments( + posonlyargs=[], + args=[ + arg( + arg='a', + annotation=Constant(value='annotation')), + arg(arg='b'), + arg(arg='c')], + vararg=arg(arg='d'), + kwonlyargs=[ + arg(arg='e'), + arg(arg='f')], + kw_defaults=[ + None, + Constant(value=3)], + kwarg=arg(arg='g'), + defaults=[ + Constant(value=1), + Constant(value=2)]), + body=[ + Pass()], + decorator_list=[ + Name(id='decorator1', ctx=Load()), + Name(id='decorator2', ctx=Load())], + returns=Constant(value='return annotation'))], + type_ignores=[]) + + +.. class:: Return(value) + + A ``return`` statement. + + .. doctest:: + + >>> print(ast.dump(ast.parse('return 4'), indent=4)) + Module( + body=[ + Return( + value=Constant(value=4))], + type_ignores=[]) + + +.. class:: Yield(value) + YieldFrom(value) + + A ``yield`` or ``yield from`` expression. Because these are expressions, they + must be wrapped in a :class:`Expr` node if the value sent back is not used. + + .. doctest:: + + >>> print(ast.dump(ast.parse('yield x'), indent=4)) + Module( + body=[ + Expr( + value=Yield( + value=Name(id='x', ctx=Load())))], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('yield from x'), indent=4)) + Module( + body=[ + Expr( + value=YieldFrom( + value=Name(id='x', ctx=Load())))], + type_ignores=[]) + + +.. class:: Global(names) + Nonlocal(names) + + ``global`` and ``nonlocal`` statements. ``names`` is a list of raw strings. + + .. doctest:: + + >>> print(ast.dump(ast.parse('global x,y,z'), indent=4)) + Module( + body=[ + Global( + names=[ + 'x', + 'y', + 'z'])], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4)) + Module( + body=[ + Nonlocal( + names=[ + 'x', + 'y', + 'z'])], + type_ignores=[]) + + +.. class:: ClassDef(name, bases, keywords, starargs, kwargs, body, decorator_list) + + A class definition. + + * ``name`` is a raw string for the class name + * ``bases`` is a list of nodes for explicitly specified base classes. + * ``keywords`` is a list of :class:`keyword` nodes, principally for 'metaclass'. + Other keywords will be passed to the metaclass, as per `PEP-3115 + `_. + * ``starargs`` and ``kwargs`` are each a single node, as in a function call. + starargs will be expanded to join the list of base classes, and kwargs will + be passed to the metaclass. + * ``body`` is a list of nodes representing the code within the class + definition. + * ``decorator_list`` is a list of nodes, as in :class:`FunctionDef`. + + .. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... @decorator1 + ... @decorator2 + ... class Foo(base1, base2, metaclass=meta): + ... pass + ... """), indent=4)) + Module( + body=[ + ClassDef( + name='Foo', + bases=[ + Name(id='base1', ctx=Load()), + Name(id='base2', ctx=Load())], + keywords=[ + keyword( + arg='metaclass', + value=Name(id='meta', ctx=Load()))], + body=[ + Pass()], + decorator_list=[ + Name(id='decorator1', ctx=Load()), + Name(id='decorator2', ctx=Load())])], + type_ignores=[]) + +Async and await +^^^^^^^^^^^^^^^ + +.. class:: AsyncFunctionDef(name, args, body, decorator_list, returns, type_comment) + + An ``async def`` function definition. Has the same fields as + :class:`FunctionDef`. + + +.. class:: Await(value) + + An ``await`` expression. ``value`` is what it waits for. + Only valid in the body of an :class:`AsyncFunctionDef`. + +.. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... async def f(): + ... await other_func() + ... """), indent=4)) + Module( + body=[ + AsyncFunctionDef( + name='f', + args=arguments( + posonlyargs=[], + args=[], + kwonlyargs=[], + kw_defaults=[], + defaults=[]), + body=[ + Expr( + value=Await( + value=Call( + func=Name(id='other_func', ctx=Load()), + args=[], + keywords=[])))], + decorator_list=[])], + type_ignores=[]) + + +.. class:: AsyncFor(target, iter, body, orelse, type_comment) + AsyncWith(items, body, type_comment) + + ``async for`` loops and ``async with`` context managers. They have the same + fields as :class:`For` and :class:`With`, respectively. Only valid in the + body of an :class:`AsyncFunctionDef`. :mod:`ast` Helpers @@ -165,6 +1545,24 @@ and classes for traversing abstract syntax trees: Added ``type_comments``, ``mode='func_type'`` and ``feature_version``. +.. function:: unparse(ast_obj) + + Unparse an :class:`ast.AST` object and generate a string with code + that would produce an equivalent :class:`ast.AST` object if parsed + back with :func:`ast.parse`. + + .. warning:: + The produced code string will not necessarily be equal to the original + code that generated the :class:`ast.AST` object (without any compiler + optimizations, such as constant tuples/frozensets). + + .. warning:: + Trying to unparse a highly complex expression would result with + :exc:`RecursionError`. + + .. versionadded:: 3.9 + + .. function:: literal_eval(node_or_string) Safely evaluate an expression node or a string containing a Python literal or @@ -185,6 +1583,9 @@ and classes for traversing abstract syntax trees: .. versionchanged:: 3.2 Now allows bytes and set literals. + .. versionchanged:: 3.9 + Now supports creating empty sets with ``'set()'``. + .. function:: get_docstring(node, clean=True) @@ -306,7 +1707,7 @@ and classes for traversing abstract syntax trees: def visit_Name(self, node): return Subscript( value=Name(id='data', ctx=Load()), - slice=Index(value=Constant(value=node.id)), + slice=Constant(value=node.id), ctx=node.ctx ) @@ -331,7 +1732,7 @@ and classes for traversing abstract syntax trees: node = YourTransformer().visit(node) -.. function:: dump(node, annotate_fields=True, include_attributes=False) +.. function:: dump(node, annotate_fields=True, include_attributes=False, *, indent=None) Return a formatted dump of the tree in *node*. This is mainly useful for debugging purposes. If *annotate_fields* is true (by default), @@ -341,6 +1742,62 @@ and classes for traversing abstract syntax trees: numbers and column offsets are not dumped by default. If this is wanted, *include_attributes* can be set to true. + If *indent* is a non-negative integer or string, then the tree will be + pretty-printed with that indent level. An indent level + of 0, negative, or ``""`` will only insert newlines. ``None`` (the default) + selects the single line representation. Using a positive integer indent + indents that many spaces per level. If *indent* is a string (such as ``"\t"``), + that string is used to indent each level. + + .. versionchanged:: 3.9 + Added the *indent* option. + + +.. _ast-cli: + +Command-Line Usage +------------------ + +.. versionadded:: 3.9 + +The :mod:`ast` module can be executed as a script from the command line. +It is as simple as: + +.. code-block:: sh + + python -m ast [-m ] [-a] [infile] + +The following options are accepted: + +.. program:: ast + +.. cmdoption:: -h, --help + + Show the help message and exit. + +.. cmdoption:: -m + --mode + + Specify what kind of code must be compiled, like the *mode* argument + in :func:`parse`. + +.. cmdoption:: --no-type-comments + + Don't parse type comments. + +.. cmdoption:: -a, --include-attributes + + Include attributes such as line numbers and column offsets. + +.. cmdoption:: -i + --indent + + Indentation of nodes in AST (number of spaces). + +If :file:`infile` is specified its contents are parsed to AST and dumped +to stdout. Otherwise, the content is read from stdin. + + .. seealso:: `Green Tree Snakes `_, an external diff --git a/Doc/library/asyncio-api-index.rst b/Doc/library/asyncio-api-index.rst index d5b5659a..047e5bbc 100644 --- a/Doc/library/asyncio-api-index.rst +++ b/Doc/library/asyncio-api-index.rst @@ -48,6 +48,9 @@ await on multiple things with timeouts. * - :class:`Task` - Task object. + * - :func:`to_thread` + - Asychronously run a function in a separate OS thread. + * - :func:`run_coroutine_threadsafe` - Schedule a coroutine from another OS thread. diff --git a/Doc/library/asyncio-dev.rst b/Doc/library/asyncio-dev.rst index d7ed9628..02a00033 100644 --- a/Doc/library/asyncio-dev.rst +++ b/Doc/library/asyncio-dev.rst @@ -25,7 +25,7 @@ There are several ways to enable asyncio debug mode: * Setting the :envvar:`PYTHONASYNCIODEBUG` environment variable to ``1``. -* Using the :option:`-X` ``dev`` Python command line option. +* Using the :ref:`Python Development Mode `. * Passing ``debug=True`` to :func:`asyncio.run`. diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 32bc219c..b1e73189 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -173,6 +173,18 @@ Running and stopping the loop .. versionadded:: 3.6 +.. coroutinemethod:: loop.shutdown_default_executor() + + Schedule the closure of the default executor and wait for it to join all of + the threads in the :class:`ThreadPoolExecutor`. After calling this method, a + :exc:`RuntimeError` will be raised if :meth:`loop.run_in_executor` is called + while using the default executor. + + Note that there is no need to call this function when + :func:`asyncio.run` is used. + + .. versionadded:: 3.9 + Scheduling callbacks ^^^^^^^^^^^^^^^^^^^^ @@ -1200,7 +1212,7 @@ Enabling debug mode .. versionchanged:: 3.7 - The new ``-X dev`` command line option can now also be used + The new :ref:`Python Development Mode ` can now also be used to enable the debug mode. .. seealso:: diff --git a/Doc/library/asyncio-future.rst b/Doc/library/asyncio-future.rst index 832d5811..e1ac18ea 100644 --- a/Doc/library/asyncio-future.rst +++ b/Doc/library/asyncio-future.rst @@ -170,7 +170,7 @@ Future Object Returns the number of callbacks removed, which is typically 1, unless a callback was added more than once. - .. method:: cancel() + .. method:: cancel(msg=None) Cancel the Future and schedule callbacks. @@ -178,6 +178,9 @@ Future Object Otherwise, change the Future's state to *cancelled*, schedule the callbacks, and return ``True``. + .. versionchanged:: 3.9 + Added the ``msg`` parameter. + .. method:: exception() Return the exception that was set on this Future. @@ -255,3 +258,6 @@ the Future has a result:: - asyncio Future is not compatible with the :func:`concurrent.futures.wait` and :func:`concurrent.futures.as_completed` functions. + + - :meth:`asyncio.Future.cancel` accepts an optional ``msg`` argument, + but :func:`concurrent.futures.cancel` does not. diff --git a/Doc/library/asyncio-policy.rst b/Doc/library/asyncio-policy.rst index aa8f8f13..d9d3232d 100644 --- a/Doc/library/asyncio-policy.rst +++ b/Doc/library/asyncio-policy.rst @@ -257,6 +257,18 @@ implementation used by the asyncio event loop: This solution requires a running event loop in the main thread to work, as :class:`SafeChildWatcher`. +.. class:: PidfdChildWatcher + + This implementation polls process file descriptors (pidfds) to await child + process termination. In some respects, :class:`PidfdChildWatcher` is a + "Goldilocks" child watcher implementation. It doesn't require signals or + threads, doesn't interfere with any processes launched outside the event + loop, and scales linearly with the number of subprocesses launched by the + event loop. The main disadvantage is that pidfds are specific to Linux, and + only work on recent (5.3+) kernels. + + .. versionadded:: 3.9 + Custom Policies =============== diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index 816ddcd0..9dbd3ab4 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -588,9 +588,6 @@ Buffered Streaming Protocols ---------------------------- .. versionadded:: 3.7 - **Important:** this has been added to asyncio in Python 3.7 - *on a provisional basis*! This is as an experimental API that - might be changed or removed completely in Python 3.8. Buffered Protocols can be used with any event loop method that supports `Streaming Protocols`_. diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst index f080b03b..84a52cb2 100644 --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -347,8 +347,8 @@ BoundedSemaphore --------- -.. deprecated:: 3.7 +.. versionchanged:: 3.9 Acquiring a lock using ``await lock`` or ``yield from lock`` and/or :keyword:`with` statement (``with await lock``, ``with (yield from - lock)``) is deprecated. Use ``async with lock`` instead. + lock)``) was removed. Use ``async with lock`` instead. diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index c96dde2d..99f01254 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -215,8 +215,8 @@ Running an asyncio Program Execute the :term:`coroutine` *coro* and return the result. This function runs the passed coroutine, taking care of - managing the asyncio event loop and *finalizing asynchronous - generators*. + managing the asyncio event loop, *finalizing asynchronous + generators*, and closing the threadpool. This function cannot be called when another asyncio event loop is running in the same thread. @@ -237,6 +237,8 @@ Running an asyncio Program .. versionadded:: 3.7 + .. versionchanged:: 3.9 + Updated to use :meth:`loop.shutdown_default_executor`. .. note:: The source code for ``asyncio.run()`` can be found in @@ -459,7 +461,8 @@ Timeouts wrap it in :func:`shield`. The function will wait until the future is actually cancelled, - so the total wait time may exceed the *timeout*. + so the total wait time may exceed the *timeout*. If an exception + happens during cancellation, it is propagated. If the wait is cancelled, the future *aw* is also cancelled. @@ -504,6 +507,8 @@ Waiting Primitives set concurrently and block until the condition specified by *return_when*. + The *aws* set must not be empty. + Returns two sets of Tasks/Futures: ``(done, pending)``. Usage:: @@ -579,7 +584,7 @@ Waiting Primitives if task in done: # Everything will work as expected now. - .. deprecated:: 3.8 + .. deprecated-removed:: 3.8 3.11 Passing coroutine objects to ``wait()`` directly is deprecated. @@ -605,6 +610,65 @@ Waiting Primitives # ... +Running in Threads +================== + +.. coroutinefunction:: to_thread(func, /, \*args, \*\*kwargs) + + Asynchronously run function *func* in a separate thread. + + Any \*args and \*\*kwargs supplied for this function are directly passed + to *func*. Also, the current :class:`contextvars.Context` is propogated, + allowing context variables from the event loop thread to be accessed in the + separate thread. + + Return a coroutine that can be awaited to get the eventual result of *func*. + + This coroutine function is primarily intended to be used for executing + IO-bound functions/methods that would otherwise block the event loop if + they were ran in the main thread. For example:: + + def blocking_io(): + print(f"start blocking_io at {time.strftime('%X')}") + # Note that time.sleep() can be replaced with any blocking + # IO-bound operation, such as file operations. + time.sleep(1) + print(f"blocking_io complete at {time.strftime('%X')}") + + async def main(): + print(f"started main at {time.strftime('%X')}") + + await asyncio.gather( + asyncio.to_thread(blocking_io), + asyncio.sleep(1)) + + print(f"finished main at {time.strftime('%X')}") + + + asyncio.run(main()) + + # Expected output: + # + # started main at 19:50:53 + # start blocking_io at 19:50:53 + # blocking_io complete at 19:50:54 + # finished main at 19:50:54 + + Directly calling `blocking_io()` in any coroutine would block the event loop + for its duration, resulting in an additional 1 second of run time. Instead, + by using `asyncio.to_thread()`, we can run it in a separate thread without + blocking the event loop. + + .. note:: + + Due to the :term:`GIL`, `asyncio.to_thread()` can typically only be used + to make IO-bound functions non-blocking. However, for extension modules + that release the GIL or alternative Python implementations that don't + have one, `asyncio.to_thread()` can also be used for CPU-bound functions. + + .. versionadded:: 3.9 + + Scheduling From Other Threads ============================= @@ -727,7 +791,7 @@ Task Object .. deprecated-removed:: 3.8 3.10 The *loop* parameter. - .. method:: cancel() + .. method:: cancel(msg=None) Request the Task to be cancelled. @@ -742,6 +806,9 @@ Task Object suppressing cancellation completely is not common and is actively discouraged. + .. versionchanged:: 3.9 + Added the ``msg`` parameter. + .. _asyncio_example_task_cancel: The following example illustrates how coroutines can intercept @@ -903,31 +970,6 @@ Task Object .. versionadded:: 3.8 - .. classmethod:: all_tasks(loop=None) - - Return a set of all tasks for an event loop. - - By default all tasks for the current event loop are returned. - If *loop* is ``None``, the :func:`get_event_loop` function - is used to get the current loop. - - .. deprecated-removed:: 3.7 3.9 - - Do not call this as a task method. Use the :func:`asyncio.all_tasks` - function instead. - - .. classmethod:: current_task(loop=None) - - Return the currently running task or ``None``. - - If *loop* is ``None``, the :func:`get_event_loop` function - is used to get the current loop. - - .. deprecated-removed:: 3.7 3.9 - - Do not call this as a task method. Use the - :func:`asyncio.current_task` function instead. - .. _asyncio_generator_based_coro: diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst index ad9f5f58..1ff22a00 100644 --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -235,12 +235,6 @@ The legacy interface: .. versionadded:: 3.1 -.. function:: decodestring(s) - - Deprecated alias of :func:`decodebytes`. - - .. deprecated:: 3.1 - .. function:: encode(input, output) @@ -261,12 +255,6 @@ The legacy interface: .. versionadded:: 3.1 -.. function:: encodestring(s) - - Deprecated alias of :func:`encodebytes`. - - .. deprecated:: 3.1 - An example usage of the module: diff --git a/Doc/library/bdb.rst b/Doc/library/bdb.rst index 116ffcf8..7e4066cd 100644 --- a/Doc/library/bdb.rst +++ b/Doc/library/bdb.rst @@ -343,7 +343,7 @@ The :mod:`bdb` module also defines two classes: For backwards compatibility. Calls the :meth:`run` method. - .. method:: runcall(func, *args, **kwds) + .. method:: runcall(func, /, *args, **kwds) Debug a single function call, and return its result. diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index 98d8679f..2c0c1bce 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -92,6 +92,8 @@ The :mod:`binascii` module defines the following functions: The string should contain a complete number of binary bytes, or (in case of the last portion of the binhex4 data) have the remaining bits zero. + .. deprecated:: 3.9 + .. function:: rledecode_hqx(data) @@ -104,11 +106,15 @@ The :mod:`binascii` module defines the following functions: .. versionchanged:: 3.2 Accept only bytestring or bytearray objects as input. + .. deprecated:: 3.9 + .. function:: rlecode_hqx(data) Perform binhex4 style RLE-compression on *data* and return the result. + .. deprecated:: 3.9 + .. function:: b2a_hqx(data) @@ -116,6 +122,8 @@ The :mod:`binascii` module defines the following functions: argument should already be RLE-coded, and have a length divisible by 3 (except possibly the last fragment). + .. deprecated:: 3.9 + .. function:: crc_hqx(data, value) diff --git a/Doc/library/binhex.rst b/Doc/library/binhex.rst index 2966e0db..7de6a663 100644 --- a/Doc/library/binhex.rst +++ b/Doc/library/binhex.rst @@ -6,6 +6,8 @@ **Source code:** :source:`Lib/binhex.py` +.. deprecated:: 3.9 + -------------- This module encodes and decodes files in binhex4 format, a format allowing diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst index 277de601..85cdc16a 100644 --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -31,7 +31,7 @@ All of the classes in this module may safely be accessed from multiple threads. (De)compression of files ------------------------ -.. function:: open(filename, mode='r', compresslevel=9, encoding=None, errors=None, newline=None) +.. function:: open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None) Open a bzip2-compressed file in binary or text mode, returning a :term:`file object`. @@ -65,7 +65,7 @@ All of the classes in this module may safely be accessed from multiple threads. Accepts a :term:`path-like object`. -.. class:: BZ2File(filename, mode='r', buffering=None, compresslevel=9) +.. class:: BZ2File(filename, mode='r', *, compresslevel=9) Open a bzip2-compressed file in binary mode. @@ -81,8 +81,6 @@ All of the classes in this module may safely be accessed from multiple threads. If *filename* is a file object (rather than an actual file name), a mode of ``'w'`` does not truncate the file, and is instead equivalent to ``'a'``. - The *buffering* argument is ignored. Its use is deprecated since Python 3.0. - If *mode* is ``'w'`` or ``'a'``, *compresslevel* can be an integer between ``1`` and ``9`` specifying the level of compression: ``1`` produces the least compression, and ``9`` (default) produces the most compression. @@ -110,9 +108,6 @@ All of the classes in this module may safely be accessed from multiple threads. .. versionadded:: 3.3 - .. deprecated:: 3.0 - The keyword argument *buffering* was deprecated and is now ignored. - .. versionchanged:: 3.1 Support for the :keyword:`with` statement was added. @@ -138,6 +133,13 @@ All of the classes in this module may safely be accessed from multiple threads. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. + .. versionchanged:: 3.9 + The *buffering* parameter has been removed. It was ignored and deprecated + since Python 3.0. Pass an open file object to control how the file is + opened. + + The *compresslevel* parameter became keyword-only. + Incremental (de)compression --------------------------- diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 992672e8..f0710572 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1198,7 +1198,8 @@ particular, the following variants typically exist: +-----------------+--------------------------------+--------------------------------+ | mac_iceland | maciceland | Icelandic | +-----------------+--------------------------------+--------------------------------+ -| mac_latin2 | maclatin2, maccentraleurope | Central and Eastern Europe | +| mac_latin2 | maclatin2, maccentraleurope, | Central and Eastern Europe | +| | mac_centeuro | | +-----------------+--------------------------------+--------------------------------+ | mac_roman | macroman, macintosh | Western Europe | +-----------------+--------------------------------+--------------------------------+ diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index d4297166..549ac1bc 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -116,6 +116,9 @@ The class can be used to simulate nested scopes and is useful in templating. >>> list(combined) ['music', 'art', 'opera'] + .. versionchanged:: 3.9 + Added support for ``|`` and ``|=`` operators, specified in :pep:`584`. + .. seealso:: * The `MultiContext class @@ -729,6 +732,10 @@ stack manipulations such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``, initialized from the first argument to the constructor, if present, or to ``None``, if absent. + .. versionchanged:: 3.9 + Added merge (``|``) and update (``|=``) operators, specified in + :pep:`584`. + :class:`defaultdict` Examples ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1119,6 +1126,10 @@ anywhere a regular dictionary is used. passed to the :class:`OrderedDict` constructor and its :meth:`update` method. +.. versionchanged:: 3.9 + Added merge (``|``) and update (``|=``) operators, specified in :pep:`584`. + + :class:`OrderedDict` Examples and Recipes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Doc/library/colorsys.rst b/Doc/library/colorsys.rst index 1360c7cc..b672a05b 100644 --- a/Doc/library/colorsys.rst +++ b/Doc/library/colorsys.rst @@ -21,7 +21,7 @@ spaces, the coordinates are all between 0 and 1. .. seealso:: More information about color spaces can be found at - http://poynton.ca/ColorFAQ.html and + https://poynton.ca/ColorFAQ.html and https://www.cambridgeincolour.com/tutorials/color-spaces.htm. The :mod:`colorsys` module defines the following functions: diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst index 9ce5ca81..9b914b1f 100644 --- a/Doc/library/compileall.rst +++ b/Doc/library/compileall.rst @@ -52,6 +52,13 @@ compile Python sources. cases where the source file does not exist at the time the byte-code file is executed. +.. cmdoption:: -s strip_prefix +.. cmdoption:: -p prepend_prefix + + Remove (``-s``) or append (``-p``) the given prefix of paths + recorded in the ``.pyc`` files. + Cannot be combined with ``-d``. + .. cmdoption:: -x regex regex is used to search the full path to each file considered for @@ -96,6 +103,21 @@ compile Python sources. variable is not set, and ``checked-hash`` if the ``SOURCE_DATE_EPOCH`` environment variable is set. +.. cmdoption:: -o level + + Compile with the given optimization level. May be used multiple times + to compile for multiple levels at a time (for example, + ``compileall -o 1 -o 2``). + +.. cmdoption:: -e dir + + Ignore symlinks pointing outside the given directory. + +.. cmdoption:: --hardlink-dupes + + If two ``.pyc`` files with different optimization level have + the same content, use hard links to consolidate duplicate files. + .. versionchanged:: 3.2 Added the ``-i``, ``-b`` and ``-h`` options. @@ -107,6 +129,12 @@ compile Python sources. .. versionchanged:: 3.7 Added the ``--invalidation-mode`` option. +.. versionchanged:: 3.9 + Added the ``-s``, ``-p``, ``-e`` and ``--hardlink-dupes`` options. + Raised the default recursion limit from 10 to + :py:func:`sys.getrecursionlimit()`. + Added the possibility to specify the ``-o`` option multiple times. + There is no command-line option to control the optimization level used by the :func:`compile` function, because the Python interpreter itself already @@ -120,14 +148,14 @@ runtime. Public functions ---------------- -.. function:: compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, workers=1, invalidation_mode=None) +.. function:: compile_dir(dir, maxlevels=sys.getrecursionlimit(), ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, workers=1, invalidation_mode=None, \*, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False) Recursively descend the directory tree named by *dir*, compiling all :file:`.py` files along the way. Return a true value if all the files compiled successfully, and a false value otherwise. The *maxlevels* parameter is used to limit the depth of the recursion; it - defaults to ``10``. + defaults to ``sys.getrecursionlimit()``. If *ddir* is given, it is prepended to the path to each file being compiled for use in compilation time tracebacks, and is also compiled in to the @@ -153,7 +181,8 @@ Public functions coexist. *optimize* specifies the optimization level for the compiler. It is passed to - the built-in :func:`compile` function. + the built-in :func:`compile` function. Accepts also a sequence of optimization + levels which lead to multiple compilations of one :file:`.py` file in one call. The argument *workers* specifies how many workers are used to compile files in parallel. The default is to not use multiple workers. @@ -166,6 +195,13 @@ Public functions :class:`py_compile.PycInvalidationMode` enum and controls how the generated pycs are invalidated at runtime. + The *stripdir*, *prependdir* and *limit_sl_dest* arguments correspond to + the ``-s``, ``-p`` and ``-e`` options described above. + They may be specified as ``str``, ``bytes`` or :py:class:`os.PathLike`. + + If *hardlink_dupes* is true and two ``.pyc`` files with different optimization + level have the same content, use hard links to consolidate duplicate files. + .. versionchanged:: 3.2 Added the *legacy* and *optimize* parameter. @@ -191,7 +227,11 @@ Public functions .. versionchanged:: 3.8 Setting *workers* to 0 now chooses the optimal number of cores. -.. function:: compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, invalidation_mode=None) + .. versionchanged:: 3.9 + Added *stripdir*, *prependdir*, *limit_sl_dest* and *hardlink_dupes* arguments. + Default value of *maxlevels* was changed from ``10`` to ``sys.getrecursionlimit()`` + +.. function:: compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, invalidation_mode=None, \*, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False) Compile the file with path *fullname*. Return a true value if the file compiled successfully, and a false value otherwise. @@ -217,12 +257,20 @@ Public functions coexist. *optimize* specifies the optimization level for the compiler. It is passed to - the built-in :func:`compile` function. + the built-in :func:`compile` function. Accepts also a sequence of optimization + levels which lead to multiple compilations of one :file:`.py` file in one call. *invalidation_mode* should be a member of the :class:`py_compile.PycInvalidationMode` enum and controls how the generated pycs are invalidated at runtime. + The *stripdir*, *prependdir* and *limit_sl_dest* arguments correspond to + the ``-s``, ``-p`` and ``-e`` options described above. + They may be specified as ``str``, ``bytes`` or :py:class:`os.PathLike`. + + If *hardlink_dupes* is true and two ``.pyc`` files with different optimization + level have the same content, use hard links to consolidate duplicate files. + .. versionadded:: 3.2 .. versionchanged:: 3.5 @@ -238,6 +286,9 @@ Public functions .. versionchanged:: 3.7.2 The *invalidation_mode* parameter's default value is updated to None. + .. versionchanged:: 3.9 + Added *stripdir*, *prependdir*, *limit_sl_dest* and *hardlink_dupes* arguments. + .. function:: compile_path(skip_curdir=True, maxlevels=0, force=False, quiet=0, legacy=False, optimize=-1, invalidation_mode=None) Byte-compile all the :file:`.py` files found along ``sys.path``. Return a diff --git a/Doc/library/concurrency.rst b/Doc/library/concurrency.rst index 39cd9ff4..b150990b 100644 --- a/Doc/library/concurrency.rst +++ b/Doc/library/concurrency.rst @@ -28,5 +28,3 @@ The following are support modules for some of the above services: .. toctree:: _thread.rst - _dummy_thread.rst - dummy_threading.rst diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 88c1d23a..675a9ffd 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -28,7 +28,7 @@ Executor Objects An abstract class that provides methods to execute calls asynchronously. It should not be used directly, but through its concrete subclasses. - .. method:: submit(fn, *args, **kwargs) + .. method:: submit(fn, /, *args, **kwargs) Schedules the callable, *fn*, to be executed as ``fn(*args **kwargs)`` and returns a :class:`Future` object representing the execution of the @@ -67,7 +67,7 @@ Executor Objects .. versionchanged:: 3.5 Added the *chunksize* argument. - .. method:: shutdown(wait=True) + .. method:: shutdown(wait=True, \*, cancel_futures=False) Signal the executor that it should free any resources that it is using when the currently pending futures are done executing. Calls to @@ -82,6 +82,15 @@ Executor Objects value of *wait*, the entire Python program will not exit until all pending futures are done executing. + If *cancel_futures* is ``True``, this method will cancel all pending + futures that the executor has not started running. Any futures that + are completed or running won't be cancelled, regardless of the value + of *cancel_futures*. + + If both *cancel_futures* and *wait* are ``True``, all futures that the + executor has started running will be completed prior to this method + returning. The remaining futures are cancelled. + You can avoid having to call this method explicitly if you use the :keyword:`with` statement, which will shutdown the :class:`Executor` (waiting as if :meth:`Executor.shutdown` were called with *wait* set to @@ -94,6 +103,9 @@ Executor Objects e.submit(shutil.copy, 'src3.txt', 'dest3.txt') e.submit(shutil.copy, 'src4.txt', 'dest4.txt') + .. versionchanged:: 3.9 + Added *cancel_futures*. + ThreadPoolExecutor ------------------ diff --git a/Doc/library/constants.rst b/Doc/library/constants.rst index 50171598..f17e1a37 100644 --- a/Doc/library/constants.rst +++ b/Doc/library/constants.rst @@ -31,7 +31,7 @@ A small number of constants live in the built-in namespace. They are: etc.) to indicate that the operation is not implemented with respect to the other type; may be returned by the in-place binary special methods (e.g. :meth:`__imul__`, :meth:`__iand__`, etc.) for the same purpose. - Its truth value is true. + It should not be evaluated in a boolean context. .. note:: @@ -50,6 +50,11 @@ A small number of constants live in the built-in namespace. They are: even though they have similar names and purposes. See :exc:`NotImplementedError` for details on when to use it. + .. versionchanged:: 3.9 + Evaluating ``NotImplemented`` in a boolean context is deprecated. While + it currently evaluates as true, it will emit a :exc:`DeprecationWarning`. + It will raise a :exc:`TypeError` in a future version of Python. + .. index:: single: ...; ellipsis literal .. data:: Ellipsis diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index 73b24e5f..0aa4ad76 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -416,7 +416,7 @@ Functions and classes provided: The passed in object is returned from the function, allowing this method to be used as a function decorator. - .. method:: callback(callback, *args, **kwds) + .. method:: callback(callback, /, *args, **kwds) Accepts an arbitrary callback function and arguments and adds it to the callback stack. @@ -473,7 +473,7 @@ Functions and classes provided: Similar to :meth:`push` but expects either an asynchronous context manager or a coroutine function. - .. method:: push_async_callback(callback, *args, **kwds) + .. method:: push_async_callback(callback, /, *args, **kwds) Similar to :meth:`callback` but expects a coroutine function. diff --git a/Doc/library/copyreg.rst b/Doc/library/copyreg.rst index 40fca56d..43920210 100644 --- a/Doc/library/copyreg.rst +++ b/Doc/library/copyreg.rst @@ -49,7 +49,7 @@ The example below would like to show how to register a pickle function and how it will be used: >>> import copyreg, copy, pickle - >>> class C(object): + >>> class C: ... def __init__(self, a): ... self.a = a ... diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index 7cd20253..7a13295f 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -511,6 +511,32 @@ The module :mod:`curses` defines the following functions: Save the current state of the terminal modes in a buffer, usable by :func:`resetty`. +.. function:: get_escdelay() + + Retrieves the value set by :func:`set_escdelay`. + + .. versionadded:: 3.9 + +.. function:: set_escdelay(ms) + + Sets the number of milliseconds to wait after reading an escape character, + to distinguish between an individual escape character entered on the + keyboard from escape sequences sent by cursor and function keys. + + .. versionadded:: 3.9 + +.. function:: get_tabsize() + + Retrieves the value set by :func:`set_tabsize`. + + .. versionadded:: 3.9 + +.. function:: set_tabsize(size) + + Sets the number of columns used by the curses library when converting a tab + character to spaces as it adds the tab to a window. + + .. versionadded:: 3.9 .. function:: setsyx(y, x) @@ -656,7 +682,7 @@ The module :mod:`curses` defines the following functions: foreground color on the default background. -.. function:: wrapper(func, ...) +.. function:: wrapper(func, /, *args, **kwargs) Initialize curses and call another callable object, *func*, which should be the rest of your curses-using application. If the application raises an exception, diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index a7fbaaa1..e706f7fc 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -188,7 +188,7 @@ Module-level decorators, classes, and functions @dataclass class C: - mylist: List[int] = field(default_factory=list) + mylist: list[int] = field(default_factory=list) c = C() c.mylist += [1, 2, 3] @@ -301,7 +301,7 @@ Module-level decorators, classes, and functions @dataclass class C: - mylist: List[Point] + mylist: list[Point] p = Point(10, 20) assert asdict(p) == {'x': 10, 'y': 20} @@ -359,7 +359,7 @@ Module-level decorators, classes, and functions def add_one(self): return self.x + 1 -.. function:: replace(instance, **changes) +.. function:: replace(instance, /, **changes) Creates a new object of the same type of ``instance``, replacing fields with values from ``changes``. If ``instance`` is not a Data diff --git a/Doc/library/datatypes.rst b/Doc/library/datatypes.rst index 94010c0e..ff51b277 100644 --- a/Doc/library/datatypes.rst +++ b/Doc/library/datatypes.rst @@ -20,6 +20,7 @@ The following modules are documented in this chapter: .. toctree:: datetime.rst + zoneinfo.rst calendar.rst collections.rst collections.abc.rst @@ -32,3 +33,4 @@ The following modules are documented in this chapter: pprint.rst reprlib.rst enum.rst + graphlib.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index b733c440..508bc88e 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -671,7 +671,8 @@ Instance methods: .. method:: date.isocalendar() - Return a 3-tuple, (ISO year, ISO week number, ISO weekday). + Return a :term:`named tuple` object with three components: ``year``, + ``week`` and ``weekday``. The ISO calendar is a widely used variant of the Gregorian calendar. [#]_ @@ -683,11 +684,14 @@ Instance methods: For example, 2004 begins on a Thursday, so the first week of ISO year 2004 begins on Monday, 29 Dec 2003 and ends on Sunday, 4 Jan 2004:: - >>> from datetime import date - >>> date(2003, 12, 29).isocalendar() - (2004, 1, 1) - >>> date(2004, 1, 4).isocalendar() - (2004, 1, 7) + >>> from datetime import date + >>> date(2003, 12, 29).isocalendar() + datetime.IsoCalendarDate(year=2004, week=1, weekday=1) + >>> date(2004, 1, 4).isocalendar() + datetime.IsoCalendarDate(year=2004, week=1, weekday=7) + + .. versionchanged:: 3.9 + Result changed from a tuple to a :term:`named tuple`. .. method:: date.isoformat() @@ -1398,8 +1402,8 @@ Instance methods: .. method:: datetime.isocalendar() - Return a 3-tuple, (ISO year, ISO week number, ISO weekday). The same as - ``self.date().isocalendar()``. + Return a :term:`named tuple` with three components: ``year``, ``week`` + and ``weekday``. The same as ``self.date().isocalendar()``. .. method:: datetime.isoformat(sep='T', timespec='auto') @@ -2361,7 +2365,7 @@ requires, and these work on all platforms with a standard C implementation. | | string if the object is | +063415, | | | | naive). | -030712.345216 | | +-----------+--------------------------------+------------------------+-------+ -| ``%Z`` | Time zone name (empty string | (empty), UTC, EST, CST | | +| ``%Z`` | Time zone name (empty string | (empty), UTC, GMT | \(6) | | | if the object is naive). | | | +-----------+--------------------------------+------------------------+-------+ | ``%j`` | Day of the year as a | 001, 002, ..., 366 | \(9) | @@ -2532,9 +2536,18 @@ Notes: In addition, providing ``'Z'`` is identical to ``'+00:00'``. ``%Z`` - If :meth:`tzname` returns ``None``, ``%Z`` is replaced by an empty - string. Otherwise ``%Z`` is replaced by the returned value, which must - be a string. + In :meth:`strftime`, ``%Z`` is replaced by an empty string if + :meth:`tzname` returns ``None``; otherwise ``%Z`` is replaced by the + returned value, which must be a string. + + :meth:`strptime` only accepts certain values for ``%Z``: + + 1. any value in ``time.tzname`` for your machine's locale + 2. the hard-coded values ``UTC`` and ``GMT`` + + So someone living in Japan may have ``JST``, ``UTC``, and ``GMT`` as + valid values, but probably not ``EST``. It will raise ``ValueError`` for + invalid values. .. versionchanged:: 3.2 When the ``%z`` directive is provided to the :meth:`strptime` method, an diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index 38173f18..e194649e 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -1488,7 +1488,7 @@ are also included in the pure Python version for compatibility. the C version uses a thread-local rather than a coroutine-local context and the value is ``False``. This is slightly faster in some nested context scenarios. -.. versionadded:: 3.9 backported to 3.7 and 3.8 +.. versionadded:: 3.9 backported to 3.7 and 3.8. Rounding modes @@ -2133,17 +2133,66 @@ Q. Is the CPython implementation fast for large numbers? A. Yes. In the CPython and PyPy3 implementations, the C/CFFI versions of the decimal module integrate the high speed `libmpdec `_ library for -arbitrary precision correctly-rounded decimal floating point arithmetic. +arbitrary precision correctly-rounded decimal floating point arithmetic [#]_. ``libmpdec`` uses `Karatsuba multiplication `_ for medium-sized numbers and the `Number Theoretic Transform `_ -for very large numbers. However, to realize this performance gain, the -context needs to be set for unrounded calculations. +for very large numbers. - >>> c = getcontext() - >>> c.prec = MAX_PREC - >>> c.Emax = MAX_EMAX - >>> c.Emin = MIN_EMIN +The context must be adapted for exact arbitrary precision arithmetic. :attr:`Emin` +and :attr:`Emax` should always be set to the maximum values, :attr:`clamp` +should always be 0 (the default). Setting :attr:`prec` requires some care. -.. versionadded:: 3.3 \ No newline at end of file +The easiest approach for trying out bignum arithmetic is to use the maximum +value for :attr:`prec` as well [#]_:: + + >>> setcontext(Context(prec=MAX_PREC, Emax=MAX_EMAX, Emin=MIN_EMIN)) + >>> x = Decimal(2) ** 256 + >>> x / 128 + Decimal('904625697166532776746648320380374280103671755200316906558262375061821325312') + + +For inexact results, :attr:`MAX_PREC` is far too large on 64-bit platforms and +the available memory will be insufficient:: + + >>> Decimal(1) / 3 + Traceback (most recent call last): + File "", line 1, in + MemoryError + +On systems with overallocation (e.g. Linux), a more sophisticated approach is to +adjust :attr:`prec` to the amount of available RAM. Suppose that you have 8GB of +RAM and expect 10 simultaneous operands using a maximum of 500MB each:: + + >>> import sys + >>> + >>> # Maximum number of digits for a single operand using 500MB in 8-byte words + >>> # with 19 digits per word (4-byte and 9 digits for the 32-bit build): + >>> maxdigits = 19 * ((500 * 1024**2) // 8) + >>> + >>> # Check that this works: + >>> c = Context(prec=maxdigits, Emax=MAX_EMAX, Emin=MIN_EMIN) + >>> c.traps[Inexact] = True + >>> setcontext(c) + >>> + >>> # Fill the available precision with nines: + >>> x = Decimal(0).logical_invert() * 9 + >>> sys.getsizeof(x) + 524288112 + >>> x + 2 + Traceback (most recent call last): + File "", line 1, in + decimal.Inexact: [] + +In general (and especially on systems without overallocation), it is recommended +to estimate even tighter bounds and set the :attr:`Inexact` trap if all calculations +are expected to be exact. + + +.. [#] + .. versionadded:: 3.3 + +.. [#] + .. versionchanged:: 3.9 + This approach now works for all exact results except for non-integer powers. diff --git a/Doc/library/development.rst b/Doc/library/development.rst index ab34e1f7..9edce758 100644 --- a/Doc/library/development.rst +++ b/Doc/library/development.rst @@ -18,12 +18,10 @@ The list of modules described in this chapter is: typing.rst pydoc.rst + devmode.rst doctest.rst unittest.rst unittest.mock.rst unittest.mock-examples.rst 2to3.rst test.rst - -See also the Python development mode: the :option:`-X` ``dev`` option and -:envvar:`PYTHONDEVMODE` environment variable. diff --git a/Doc/library/devmode.rst b/Doc/library/devmode.rst new file mode 100644 index 00000000..d5a40cde --- /dev/null +++ b/Doc/library/devmode.rst @@ -0,0 +1,214 @@ +.. _devmode: + +Python Development Mode +======================= + +.. versionadded:: 3.7 + +The Python Development Mode introduces additional runtime checks that are too +expensive to be enabled by default. It should not be more verbose than the +default if the code is correct; new warnings are only emitted when an issue is +detected. + +It can be enabled using the :option:`-X dev <-X>` command line option or by +setting the :envvar:`PYTHONDEVMODE` environment variable to ``1``. + +Effects of the Python Development Mode +====================================== + +Enabling the Python Development Mode is similar to the following command, but +with additional effects described below:: + + PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 python3 -W default -X faulthandler + +Effects of the Python Development Mode: + +* Add ``default`` :ref:`warning filter `. The + following warnings are shown: + + * :exc:`DeprecationWarning` + * :exc:`ImportWarning` + * :exc:`PendingDeprecationWarning` + * :exc:`ResourceWarning` + + Normally, the above warnings are filtered by the default :ref:`warning + filters `. + + It behaves as if the :option:`-W default <-W>` command line option is used. + + Use the :option:`-W error <-W>` command line option or set the + :envvar:`PYTHONWARNINGS` environment variable to ``error`` to treat warnings + as errors. + +* Install debug hooks on memory allocators to check for: + + * Buffer underflow + * Buffer overflow + * Memory allocator API violation + * Unsafe usage of the GIL + + See the :c:func:`PyMem_SetupDebugHooks` C function. + + It behaves as if the :envvar:`PYTHONMALLOC` environment variable is set to + ``debug``. + + To enable the Python Development Mode without installing debug hooks on + memory allocators, set the :envvar:`PYTHONMALLOC` environment variable to + ``default``. + +* Call :func:`faulthandler.enable` at Python startup to install handlers for + the :const:`SIGSEGV`, :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and + :const:`SIGILL` signals to dump the Python traceback on a crash. + + It behaves as if the :option:`-X faulthandler <-X>` command line option is + used or if the :envvar:`PYTHONFAULTHANDLER` environment variable is set to + ``1``. + +* Enable :ref:`asyncio debug mode `. For example, + :mod:`asyncio` checks for coroutines that were not awaited and logs them. + + It behaves as if the :envvar:`PYTHONASYNCIODEBUG` environment variable is set + to ``1``. + +* Check the *encoding* and *errors* arguments for string encoding and decoding + operations. Examples: :func:`open`, :meth:`str.encode` and + :meth:`bytes.decode`. + + By default, for best performance, the *errors* argument is only checked at + the first encoding/decoding error and the *encoding* argument is sometimes + ignored for empty strings. + +* The :class:`io.IOBase` destructor logs ``close()`` exceptions. +* Set the :attr:`~sys.flags.dev_mode` attribute of :attr:`sys.flags` to + ``True``. + +The Python Development Mode does not enable the :mod:`tracemalloc` module by +default, because the overhead cost (to performance and memory) would be too +large. Enabling the :mod:`tracemalloc` module provides additional information +on the origin of some errors. For example, :exc:`ResourceWarning` logs the +traceback where the resource was allocated, and a buffer overflow error logs +the traceback where the memory block was allocated. + +The Python Development Mode does not prevent the :option:`-O` command line +option from removing :keyword:`assert` statements nor from setting +:const:`__debug__` to ``False``. + +.. versionchanged:: 3.8 + The :class:`io.IOBase` destructor now logs ``close()`` exceptions. + +.. versionchanged:: 3.9 + The *encoding* and *errors* arguments are now checked for string encoding + and decoding operations. + + +ResourceWarning Example +======================= + +Example of a script counting the number of lines of the text file specified in +the command line:: + + import sys + + def main(): + fp = open(sys.argv[1]) + nlines = len(fp.readlines()) + print(nlines) + # The file is closed implicitly + + if __name__ == "__main__": + main() + +The script does not close the file explicitly. By default, Python does not emit +any warning. Example using README.txt, which has 269 lines: + +.. code-block:: shell-session + + $ python3 script.py README.txt + 269 + +Enabling the Python Development Mode displays a :exc:`ResourceWarning` warning: + +.. code-block:: shell-session + + $ python3 -X dev script.py README.txt + 269 + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'> + main() + ResourceWarning: Enable tracemalloc to get the object allocation traceback + +In addition, enabling :mod:`tracemalloc` shows the line where the file was +opened: + +.. code-block:: shell-session + + $ python3 -X dev -X tracemalloc=5 script.py README.rst + 269 + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'> + main() + Object allocated at (most recent call last): + File "script.py", lineno 10 + main() + File "script.py", lineno 4 + fp = open(sys.argv[1]) + +The fix is to close explicitly the file. Example using a context manager:: + + def main(): + # Close the file explicitly when exiting the with block + with open(sys.argv[1]) as fp: + nlines = len(fp.readlines()) + print(nlines) + +Not closing a resource explicitly can leave a resource open for way longer than +expected; it can cause severe issues upon exiting Python. It is bad in +CPython, but it is even worse in PyPy. Closing resources explicitly makes an +application more deterministic and more reliable. + + +Bad file descriptor error example +================================= + +Script displaying the first line of itself:: + + import os + + def main(): + fp = open(__file__) + firstline = fp.readline() + print(firstline.rstrip()) + os.close(fp.fileno()) + # The file is closed implicitly + + main() + +By default, Python does not emit any warning: + +.. code-block:: shell-session + + $ python3 script.py + import os + +The Python Development Mode shows a :exc:`ResourceWarning` and logs a "Bad file +descriptor" error when finalizing the file object: + +.. code-block:: shell-session + + $ python3 script.py + import os + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'> + main() + ResourceWarning: Enable tracemalloc to get the object allocation traceback + Exception ignored in: <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'> + Traceback (most recent call last): + File "script.py", line 10, in + main() + OSError: [Errno 9] Bad file descriptor + +``os.close(fp.fileno())`` closes the file descriptor. When the file object +finalizer tries to close the file descriptor again, it fails with the ``Bad +file descriptor`` error. A file descriptor must be closed only once. In the +worst case scenario, closing it twice can lead to a crash (see :issue:`18748` +for an example). + +The fix is to remove the ``os.close(fp.fileno())`` line, or open the file with +``closefd=False``. diff --git a/Doc/library/dialog.rst b/Doc/library/dialog.rst new file mode 100644 index 00000000..dc82a974 --- /dev/null +++ b/Doc/library/dialog.rst @@ -0,0 +1,230 @@ +Tkinter Dialogs +=============== + +:mod:`tkinter.simpledialog` --- Standard Tkinter input dialogs +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. module:: tkinter.simpledialog + :platform: Tk + :synopsis: Simple dialog windows + +**Source code:** :source:`Lib/tkinter/simpledialog.py` + +-------------- + +The :mod:`tkinter.simpledialog` module contains convenience classes and +functions for creating simple modal dialogs to get a value from the user. + + +.. function:: askfloat(title, prompt, **kw) + askinteger(title, prompt, **kw) + askstring(title, prompt, **kw) + + The above three functions provide dialogs that prompt the user to enter a value + of the desired type. + +.. class:: Dialog(parent, title=None) + + The base class for custom dialogs. + + .. method:: body(master) + + Override to construct the dialog's interface and return the widget that + should have initial focus. + + .. method:: buttonbox() + + Default behaviour adds OK and Cancel buttons. Override for custom button + layouts. + + + +:mod:`tkinter.filedialog` --- File selection dialogs +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. module:: tkinter.filedialog + :platform: Tk + :synopsis: Dialog classes for file selection + +**Source code:** :source:`Lib/tkinter/filedialog.py` + +-------------- + +The :mod:`tkinter.filedialog` module provides classes and factory functions for +creating file/directory selection windows. + +Native Load/Save Dialogs +------------------------ + +The following classes and functions provide file dialog windows that combine a +native look-and-feel with configuration options to customize behaviour. +The following keyword arguments are applicable to the classes and functions +listed below: + + | *parent* - the window to place the dialog on top of + + | *title* - the title of the window + + | *initialdir* - the directory that the dialog starts in + + | *initialfile* - the file selected upon opening of the dialog + + | *filetypes* - a sequence of (label, pattern) tuples, '*' wildcard is allowed + + | *defaultextension* - default extension to append to file (save dialogs) + + | *multiple* - when true, selection of multiple items is allowed + + +**Static factory functions** + +The below functions when called create a modal, native look-and-feel dialog, +wait for the user's selection, then return the selected value(s) or ``None`` to the +caller. + +.. function:: askopenfile(mode="r", **options) + askopenfiles(mode="r", **options) + + The above two functions create an :class:`Open` dialog and return the opened + file object(s) in read-only mode. + +.. function:: asksaveasfile(mode="w", **options) + + Create a :class:`SaveAs` dialog and return a file object opened in write-only mode. + +.. function:: askopenfilename(**options) + askopenfilenames(**options) + + The above two functions create an :class:`Open` dialog and return the + selected filename(s) that correspond to existing file(s). + +.. function:: asksaveasfilename(**options) + + Create a :class:`SaveAs` dialog and return the selected filename. + +.. function:: askdirectory(**options) + + | Prompt user to select a directory. + | Additional keyword option: + | *mustexist* - determines if selection must be an existing directory. + +.. class:: Open(master=None, **options) + SaveAs(master=None, **options) + + The above two classes provide native dialog windows for saving and loading + files. + +**Convenience classes** + +The below classes are used for creating file/directory windows from scratch. +These do not emulate the native look-and-feel of the platform. + +.. class:: Directory(master=None, **options) + + Create a dialog prompting the user to select a directory. + +.. note:: The *FileDialog* class should be subclassed for custom event + handling and behaviour. + +.. class:: FileDialog(master, title=None) + + Create a basic file selection dialog. + + .. method:: cancel_command(event=None) + + Trigger the termination of the dialog window. + + .. method:: dirs_double_event(event) + + Event handler for double-click event on directory. + + .. method:: dirs_select_event(event) + + Event handler for click event on directory. + + .. method:: files_double_event(event) + + Event handler for double-click event on file. + + .. method:: files_select_event(event) + + Event handler for single-click event on file. + + .. method:: filter_command(event=None) + + Filter the files by directory. + + .. method:: get_filter() + + Retrieve the file filter currently in use. + + .. method:: get_selection() + + Retrieve the currently selected item. + + .. method:: go(dir_or_file=os.curdir, pattern="*", default="", key=None) + + Render dialog and start event loop. + + .. method:: ok_event(event) + + Exit dialog returning current selection. + + .. method:: quit(how=None) + + Exit dialog returning filename, if any. + + .. method:: set_filter(dir, pat) + + Set the file filter. + + .. method:: set_selection(file) + + Update the current file selection to *file*. + + +.. class:: LoadFileDialog(master, title=None) + + A subclass of FileDialog that creates a dialog window for selecting an + existing file. + + .. method:: ok_command() + + Test that a file is provided and that the selection indicates an + already existing file. + +.. class:: SaveFileDialog(master, title=None) + + A subclass of FileDialog that creates a dialog window for selecting a + destination file. + + .. method:: ok_command() + + Test whether or not the selection points to a valid file that is not a + directory. Confirmation is required if an already existing file is + selected. + +:mod:`tkinter.commondialog` --- Dialog window templates +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. module:: tkinter.commondialog + :platform: Tk + :synopsis: Tkinter base class for dialogs + +**Source code:** :source:`Lib/tkinter/commondialog.py` + +-------------- + +The :mod:`tkinter.commondialog` module provides the :class:`Dialog` class that +is the base class for dialogs defined in other supporting modules. + +.. class:: Dialog(master=None, **options) + + .. method:: show(color=None, **options) + + Render the Dialog window. + + +.. seealso:: + + Modules :mod:`tkinter.messagebox`, :ref:`tut-files` diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst index a8543b38..aa08988c 100644 --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -422,7 +422,7 @@ The :class:`SequenceMatcher` class has this constructor: is not changed. - .. method:: find_longest_match(alo, ahi, blo, bhi) + .. method:: find_longest_match(alo=0, ahi=None, blo=0, bhi=None) Find longest matching block in ``a[alo:ahi]`` and ``b[blo:bhi]``. @@ -459,6 +459,9 @@ The :class:`SequenceMatcher` class has this constructor: This method returns a :term:`named tuple` ``Match(a, b, size)``. + .. versionchanged:: 3.9 + Added default arguments. + .. method:: get_matching_blocks() diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 015be202..d0307bd8 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -706,50 +706,29 @@ iterations of the loop. popped values are used to restore the exception state. -.. opcode:: POP_FINALLY (preserve_tos) +.. opcode:: RERAISE - Cleans up the value stack and the block stack. If *preserve_tos* is not - ``0`` TOS first is popped from the stack and pushed on the stack after - performing other stack operations: + Re-raises the exception currently on top of the stack. - * If TOS is ``NULL`` or an integer (pushed by :opcode:`BEGIN_FINALLY` - or :opcode:`CALL_FINALLY`) it is popped from the stack. - * If TOS is an exception type (pushed when an exception has been raised) - 6 values are popped from the stack, the last three popped values are - used to restore the exception state. An exception handler block is - removed from the block stack. + .. versionadded:: 3.9 - It is similar to :opcode:`END_FINALLY`, but doesn't change the bytecode - counter nor raise an exception. Used for implementing :keyword:`break`, - :keyword:`continue` and :keyword:`return` in the :keyword:`finally` block. - .. versionadded:: 3.8 - - -.. opcode:: BEGIN_FINALLY +.. opcode:: WITH_EXCEPT_START - Pushes ``NULL`` onto the stack for using it in :opcode:`END_FINALLY`, - :opcode:`POP_FINALLY`, :opcode:`WITH_CLEANUP_START` and - :opcode:`WITH_CLEANUP_FINISH`. Starts the :keyword:`finally` block. + Calls the function in position 7 on the stack with the top three + items on the stack as arguments. + Used to implement the call ``context_manager.__exit__(*exc_info())`` when an exception + has occurred in a :keyword:`with` statement. - .. versionadded:: 3.8 + .. versionadded:: 3.9 -.. opcode:: END_FINALLY +.. opcode:: LOAD_ASSERTION_ERROR - Terminates a :keyword:`finally` clause. The interpreter recalls whether the - exception has to be re-raised or execution has to be continued depending on - the value of TOS. + Pushes :exc:`AssertionError` onto the stack. Used by the :keyword:`assert` + statement. - * If TOS is ``NULL`` (pushed by :opcode:`BEGIN_FINALLY`) continue from - the next instruction. TOS is popped. - * If TOS is an integer (pushed by :opcode:`CALL_FINALLY`), sets the - bytecode counter to TOS. TOS is popped. - * If TOS is an exception type (pushed when an exception has been raised) - 6 values are popped from the stack, the first three popped values are - used to re-raise the exception and the last three popped values are used - to restore the exception state. An exception handler block is removed - from the block stack. + .. versionadded:: 3.9 .. opcode:: LOAD_BUILD_CLASS @@ -772,35 +751,6 @@ iterations of the loop. .. versionadded:: 3.2 -.. opcode:: WITH_CLEANUP_START - - Starts cleaning up the stack when a :keyword:`with` statement block exits. - - At the top of the stack are either ``NULL`` (pushed by - :opcode:`BEGIN_FINALLY`) or 6 values pushed if an exception has been - raised in the with block. Below is the context manager's - :meth:`~object.__exit__` or :meth:`~object.__aexit__` bound method. - - If TOS is ``NULL``, calls ``SECOND(None, None, None)``, - removes the function from the stack, leaving TOS, and pushes ``None`` - to the stack. Otherwise calls ``SEVENTH(TOP, SECOND, THIRD)``, - shifts the bottom 3 values of the stack down, replaces the empty spot - with ``NULL`` and pushes TOS. Finally pushes the result of the call. - - -.. opcode:: WITH_CLEANUP_FINISH - - Finishes cleaning up the stack when a :keyword:`with` statement block exits. - - TOS is result of ``__exit__()`` or ``__aexit__()`` function call pushed - by :opcode:`WITH_CLEANUP_START`. SECOND is ``None`` or an exception type - (pushed when an exception has been raised). - - Pops two values from the stack. If SECOND is not None and TOS is true - unwinds the EXCEPT_HANDLER block which was created when the exception - was caught and pushes ``NULL`` to the stack. - - All of the following opcodes use their arguments. .. opcode:: STORE_NAME (namei) @@ -909,61 +859,39 @@ All of the following opcodes use their arguments. .. versionadded:: 3.6 -.. opcode:: BUILD_TUPLE_UNPACK (count) - - Pops *count* iterables from the stack, joins them in a single tuple, - and pushes the result. Implements iterable unpacking in tuple - displays ``(*x, *y, *z)``. - - .. versionadded:: 3.5 +.. opcode:: LIST_TO_TUPLE + Pops a list from the stack and pushes a tuple containing the same values. -.. opcode:: BUILD_TUPLE_UNPACK_WITH_CALL (count) + .. versionadded:: 3.9 - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, - but is used for ``f(*x, *y, *z)`` call syntax. The stack item at position - ``count + 1`` should be the corresponding callable ``f``. - .. versionadded:: 3.6 +.. opcode:: LIST_EXTEND (i) + Calls ``list.extend(TOS1[-i], TOS)``. Used to build lists. -.. opcode:: BUILD_LIST_UNPACK (count) + .. versionadded:: 3.9 - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a list - instead of tuple. Implements iterable unpacking in list - displays ``[*x, *y, *z]``. - .. versionadded:: 3.5 +.. opcode:: SET_UPDATE (i) + Calls ``set.update(TOS1[-i], TOS)``. Used to build sets. -.. opcode:: BUILD_SET_UNPACK (count) + .. versionadded:: 3.9 - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a set - instead of tuple. Implements iterable unpacking in set - displays ``{*x, *y, *z}``. - .. versionadded:: 3.5 +.. opcode:: DICT_UPDATE (i) + Calls ``dict.update(TOS1[-i], TOS)``. Used to build dicts. -.. opcode:: BUILD_MAP_UNPACK (count) + .. versionadded:: 3.9 - Pops *count* mappings from the stack, merges them into a single dictionary, - and pushes the result. Implements dictionary unpacking in dictionary - displays ``{**x, **y, **z}``. - .. versionadded:: 3.5 +.. opcode:: DICT_MERGE + Like :opcode:`DICT_UPDATE` but raises an exception for duplicate keys. -.. opcode:: BUILD_MAP_UNPACK_WITH_CALL (count) - - This is similar to :opcode:`BUILD_MAP_UNPACK`, - but is used for ``f(**x, **y, **z)`` call syntax. The stack item at - position ``count + 2`` should be the corresponding callable ``f``. - - .. versionadded:: 3.5 - .. versionchanged:: 3.6 - The position of the callable is determined by adding 2 to the opcode - argument instead of encoding it in the second byte of the argument. + .. versionadded:: 3.9 .. opcode:: LOAD_ATTR (namei) @@ -977,6 +905,20 @@ All of the following opcodes use their arguments. ``cmp_op[opname]``. +.. opcode:: IS_OP (invert) + + Performs ``is`` comparison, or ``is not`` if ``invert`` is 1. + + .. versionadded:: 3.9 + + +.. opcode:: CONTAINS_OP (invert) + + Performs ``in`` comparison, or ``not in`` if ``invert`` is 1. + + .. versionadded:: 3.9 + + .. opcode:: IMPORT_NAME (namei) Imports the module ``co_names[namei]``. TOS and TOS1 are popped and provide @@ -1011,6 +953,13 @@ All of the following opcodes use their arguments. .. versionadded:: 3.1 +.. opcode:: JUMP_IF_NOT_EXC_MATCH (target) + + Tests whether the second value on the stack is an exception matching TOS, + and jumps if it is not. Pops two values from the stack. + + .. versionadded:: 3.9 + .. opcode:: JUMP_IF_TRUE_OR_POP (target) @@ -1037,7 +986,7 @@ All of the following opcodes use their arguments. TOS is an :term:`iterator`. Call its :meth:`~iterator.__next__` method. If this yields a new value, push it on the stack (leaving the iterator below - it). If the iterator indicates it is exhausted TOS is popped, and the byte + it). If the iterator indicates it is exhausted, TOS is popped, and the byte code counter is incremented by *delta*. @@ -1052,15 +1001,6 @@ All of the following opcodes use their arguments. stack. *delta* points to the finally block or the first except block. -.. opcode:: CALL_FINALLY (delta) - - Pushes the address of the next instruction onto the stack and increments - bytecode counter by *delta*. Used for calling the finally block as a - "subroutine". - - .. versionadded:: 3.8 - - .. opcode:: LOAD_FAST (var_num) Pushes a reference to the local ``co_varnames[var_num]`` onto the stack. @@ -1142,8 +1082,10 @@ All of the following opcodes use their arguments. Calls a callable object with positional (if any) and keyword arguments. *argc* indicates the total number of positional and keyword arguments. - The top element on the stack contains a tuple of keyword argument names. - Below that are keyword arguments in the order corresponding to the tuple. + The top element on the stack contains a tuple with the names of the + keyword arguments, which must be strings. + Below that are the values for the keyword arguments, + in the order corresponding to the tuple. Below that are positional arguments, with the right-most parameter on top. Below the arguments is a callable object to call. ``CALL_FUNCTION_KW`` pops all arguments and the callable object off the stack, @@ -1160,10 +1102,6 @@ All of the following opcodes use their arguments. Calls a callable object with variable set of positional and keyword arguments. If the lowest bit of *flags* is set, the top of the stack contains a mapping object containing additional keyword arguments. - Below that is an iterable object containing positional arguments and - a callable object to call. :opcode:`BUILD_MAP_UNPACK_WITH_CALL` and - :opcode:`BUILD_TUPLE_UNPACK_WITH_CALL` can be used for merging multiple - mapping objects and iterables containing arguments. Before the callable is called, the mapping object and iterable object are each "unpacked" and their contents passed in as keyword and positional arguments respectively. diff --git a/Doc/library/dummy_threading.rst b/Doc/library/dummy_threading.rst deleted file mode 100644 index dfc3289a..00000000 --- a/Doc/library/dummy_threading.rst +++ /dev/null @@ -1,20 +0,0 @@ -:mod:`dummy_threading` --- Drop-in replacement for the :mod:`threading` module -============================================================================== - -.. module:: dummy_threading - :synopsis: Drop-in replacement for the threading module. - -**Source code:** :source:`Lib/dummy_threading.py` - -.. deprecated:: 3.7 - Python now always has threading enabled. Please use :mod:`threading` instead. - --------------- - -This module provides a duplicate interface to the :mod:`threading` module. -It was meant to be imported when the :mod:`_thread` module was not provided -on a platform. - -Be careful to not use this module where deadlock might occur from a thread being -created that blocks waiting for another thread to be created. This often occurs -with blocking I/O. diff --git a/Doc/library/email.encoders.rst b/Doc/library/email.encoders.rst index e4752a5e..5d68b104 100644 --- a/Doc/library/email.encoders.rst +++ b/Doc/library/email.encoders.rst @@ -15,7 +15,7 @@ the :meth:`~email.message.EmailMessage.set_content` method. This module is deprecated in Python 3. The functions provided here should not be called explicitly since the :class:`~email.mime.text.MIMEText` class sets the content type and CTE header using the *_subtype* and *_charset* -values passed during the instaniation of that class. +values passed during the instantiation of that class. The remaining text in this section is the original documentation of the module. diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index bd10016b..a3c51655 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -62,7 +62,7 @@ helper, :class:`auto`. .. class:: auto - Instances are replaced with an appropriate value for Enum members. Initial value starts at 1. + Instances are replaced with an appropriate value for Enum members. By default, the initial value starts at 1. .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` @@ -394,8 +394,8 @@ enumeration, with the exception of special methods (:meth:`__str__`, variable names listed in :attr:`_ignore_`. Note: if your enumeration defines :meth:`__new__` and/or :meth:`__init__` then -whatever value(s) were given to the enum member will be passed into those -methods. See `Planet`_ for an example. +any value(s) given to the enum member will be passed into those methods. +See `Planet`_ for an example. Restricted Enum subclassing @@ -741,8 +741,7 @@ Some rules: 2. While :class:`Enum` can have members of any type, once you mix in an additional type, all the members must have values of that type, e.g. :class:`int` above. This restriction does not apply to mix-ins which only - add methods and don't specify another data type such as :class:`int` or - :class:`str`. + add methods and don't specify another type. 3. When another data type is mixed in, the :attr:`value` attribute is *not the same* as the enum member itself, although it is equivalent and will compare equal. @@ -1091,7 +1090,7 @@ Supported ``_sunder_`` names - ``_missing_`` -- a lookup function used when a value is not found; may be overridden -- ``_ignore_`` -- a list of names, either as a :func:`list` or a :func:`str`, +- ``_ignore_`` -- a list of names, either as a :class:`list` or a :class:`str`, that will not be transformed into members, and will be removed from the final class - ``_order_`` -- used in Python 2/3 code to ensure member order is consistent diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index 52a505e0..df2cda9d 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -688,6 +688,10 @@ The following exceptions are used as warning categories; see the Base class for warnings about deprecated features when those warnings are intended for other Python developers. + Ignored by the default warning filters, except in the ``__main__`` module + (:pep:`565`). Enabling the :ref:`Python Development Mode ` shows + this warning. + .. exception:: PendingDeprecationWarning @@ -699,6 +703,9 @@ The following exceptions are used as warning categories; see the upcoming deprecation is unusual, and :exc:`DeprecationWarning` is preferred for already active deprecations. + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. + .. exception:: SyntaxWarning @@ -720,6 +727,9 @@ The following exceptions are used as warning categories; see the Base class for warnings about probable mistakes in module imports. + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. + .. exception:: UnicodeWarning @@ -733,8 +743,10 @@ The following exceptions are used as warning categories; see the .. exception:: ResourceWarning - Base class for warnings related to resource usage. Ignored by the default - warning filters. + Base class for warnings related to resource usage. + + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. .. versionadded:: 3.2 diff --git a/Doc/library/faulthandler.rst b/Doc/library/faulthandler.rst index b588dfa1..59274c1d 100644 --- a/Doc/library/faulthandler.rst +++ b/Doc/library/faulthandler.rst @@ -40,6 +40,9 @@ alternatively be passed to :func:`faulthandler.enable`. The module is implemented in C, so tracebacks can be dumped on a crash or when Python is deadlocked. +The :ref:`Python Development Mode ` calls :func:`faulthandler.enable` +at Python startup. + Dumping the traceback --------------------- diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst index 69484b64..07a15d27 100644 --- a/Doc/library/fcntl.rst +++ b/Doc/library/fcntl.rst @@ -33,6 +33,12 @@ descriptor. ``F_SEAL_*`` constants for sealing of :func:`os.memfd_create` file descriptors. +.. versionchanged:: 3.9 + On macOS, the fcntl module exposes the ``F_GETPATH`` constant, which obtains + the path of a file from a file descriptor. + On Linux(>=3.15), the fcntl module exposes the ``F_OFD_GETLK``, ``F_OFD_SETLK`` + and ``F_OFD_SETLKW`` constants, which working with open file description locks. + The module defines the following functions: diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index 58e7126b..a4d006eb 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -84,6 +84,10 @@ another rational number, or from a string. The :class:`Fraction` constructor now accepts :class:`float` and :class:`decimal.Decimal` instances. + .. versionchanged:: 3.9 + The :func:`math.gcd` function is now used to normalize the *numerator* + and *denominator*. :func:`math.gcd` always return a :class:`int` type. + Previously, the GCD type depended on *numerator* and *denominator*. .. attribute:: numerator @@ -172,18 +176,6 @@ another rational number, or from a string. method can also be accessed through the :func:`round` function. -.. function:: gcd(a, b) - - Return the greatest common divisor of the integers *a* and *b*. If either - *a* or *b* is nonzero, then the absolute value of ``gcd(a, b)`` is the - largest integer that divides both *a* and *b*. ``gcd(a,b)`` has the same - sign as *b* if *b* is nonzero; otherwise it takes the sign of *a*. ``gcd(0, - 0)`` returns ``0``. - - .. deprecated:: 3.5 - Use :func:`math.gcd` instead. - - .. seealso:: Module :mod:`numbers` diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index db021236..f4d4cdf9 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -19,10 +19,12 @@ as mirroring other FTP servers. It is also used by the module :mod:`urllib.request` to handle URLs that use FTP. For more information on FTP (File Transfer Protocol), see Internet :rfc:`959`. +The default encoding is UTF-8, following :rfc:`2640`. + Here's a sample session using the :mod:`ftplib` module:: >>> from ftplib import FTP - >>> ftp = FTP('ftp.debian.org') # connect to host, default port + >>> ftp = FTP('ftp.us.debian.org') # connect to host, default port >>> ftp.login() # user anonymous, passwd anonymous@ '230 Login successful.' >>> ftp.cwd('debian') # change into "debian" directory @@ -41,7 +43,7 @@ Here's a sample session using the :mod:`ftplib` module:: The module defines the following items: -.. class:: FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None) +.. class:: FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None, *, encoding='utf-8') Return a new instance of the :class:`FTP` class. When *host* is given, the method call ``connect(host)`` is made. When *user* is given, additionally @@ -50,7 +52,8 @@ The module defines the following items: parameter specifies a timeout in seconds for blocking operations like the connection attempt (if is not specified, the global default timeout setting will be used). *source_address* is a 2-tuple ``(host, port)`` for the socket - to bind to as its source address before connecting. + to bind to as its source address before connecting. The *encoding* parameter + specifies the encoding for directories and filenames. The :class:`FTP` class supports the :keyword:`with` statement, e.g.: @@ -72,8 +75,13 @@ The module defines the following items: .. versionchanged:: 3.3 *source_address* parameter was added. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + The *encoding* parameter was added, and the default was changed from + Latin-1 to UTF-8 to follow :rfc:`2640`. -.. class:: FTP_TLS(host='', user='', passwd='', acct='', keyfile=None, certfile=None, context=None, timeout=None, source_address=None) +.. class:: FTP_TLS(host='', user='', passwd='', acct='', keyfile=None, certfile=None, context=None, timeout=None, source_address=None, *, encoding='utf-8') A :class:`FTP` subclass which adds TLS support to FTP as described in :rfc:`4217`. @@ -105,6 +113,12 @@ The module defines the following items: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + The *encoding* parameter was added, and the default was changed from + Latin-1 to UTF-8 to follow :rfc:`2640`. + Here's a sample session using the :class:`FTP_TLS` class:: >>> ftps = FTP_TLS('ftp.pureftpd.org') @@ -252,9 +266,10 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. .. method:: FTP.retrlines(cmd, callback=None) - Retrieve a file or directory listing in ASCII transfer mode. *cmd* should be - an appropriate ``RETR`` command (see :meth:`retrbinary`) or a command such as - ``LIST`` or ``NLST`` (usually just the string ``'LIST'``). + Retrieve a file or directory listing in the encoding specified by the + *encoding* parameter at initialization. + *cmd* should be an appropriate ``RETR`` command (see :meth:`retrbinary`) or + a command such as ``LIST`` or ``NLST`` (usually just the string ``'LIST'``). ``LIST`` retrieves a list of files and information about those files. ``NLST`` retrieves a list of file names. The *callback* function is called for each line with a string argument @@ -284,7 +299,7 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. .. method:: FTP.storlines(cmd, fp, callback=None) - Store a file in ASCII transfer mode. *cmd* should be an appropriate + Store a file in line mode. *cmd* should be an appropriate ``STOR`` command (see :meth:`storbinary`). Lines are read until EOF from the :term:`file object` *fp* (opened in binary mode) using its :meth:`~io.IOBase.readline` method to provide the data to be stored. *callback* is an optional single @@ -302,10 +317,9 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. If optional *rest* is given, a ``REST`` command is sent to the server, passing *rest* as an argument. *rest* is usually a byte offset into the requested file, telling the server to restart sending the file's bytes at the requested offset, - skipping over the initial bytes. Note however that :rfc:`959` requires only that - *rest* be a string containing characters in the printable range from ASCII code - 33 to ASCII code 126. The :meth:`transfercmd` method, therefore, converts - *rest* to a string, but no check is performed on the string's contents. If the + skipping over the initial bytes. Note however that the :meth:`transfercmd` + method converts *rest* to a string with the *encoding* parameter specified + at initialization, but no check is performed on the string's contents. If the server does not recognize the ``REST`` command, an :exc:`error_reply` exception will be raised. If this happens, simply call :meth:`transfercmd` without a *rest* argument. diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 6003898d..124085ed 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -43,9 +43,8 @@ are always available. They are listed here in alphabetical order. .. function:: abs(x) Return the absolute value of a number. The argument may be an - integer or a floating point number. If the argument is a complex number, its - magnitude is returned. If *x* defines :meth:`__abs__`, - ``abs(x)`` returns ``x.__abs__()``. + integer, a floating point number, or an object implementing :meth:`__abs__`. + If the argument is a complex number, its magnitude is returned. .. function:: all(iterable) @@ -222,10 +221,12 @@ are always available. They are listed here in alphabetical order. implied first argument. Class methods are different than C++ or Java static methods. If you want those, - see :func:`staticmethod`. - + see :func:`staticmethod` in this section. For more information on class methods, see :ref:`types`. + .. versionchanged:: 3.9 + Class methods can now wrap other :term:`descriptors ` such as + :func:`property`. .. function:: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) @@ -890,6 +891,11 @@ are always available. They are listed here in alphabetical order. sequence (such as a string, bytes, tuple, list, or range) or a collection (such as a dictionary, set, or frozen set). + .. impl-detail:: + + ``len`` raises :exc:`OverflowError` on lengths larger than + :data:`sys.maxsize`, such as :class:`range(2 ** 100) `. + .. _func-list: .. class:: list([iterable]) @@ -1246,7 +1252,7 @@ are always available. They are listed here in alphabetical order. * The file is now non-inheritable. - .. deprecated-removed:: 3.4 3.9 + .. deprecated-removed:: 3.4 3.10 The ``'U'`` mode. @@ -1832,6 +1838,9 @@ are always available. They are listed here in alphabetical order. Negative values for *level* are no longer supported (which also changes the default value to 0). + .. versionchanged:: 3.9 + When the command line options :option:`-E` or :option:`-I` are being used, + the environment variable :envvar:`PYTHONCASEOK` is now ignored. .. rubric:: Footnotes diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 0fb8d900..14aa184e 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -8,10 +8,16 @@ .. moduleauthor:: Raymond Hettinger .. moduleauthor:: Nick Coghlan .. moduleauthor:: Łukasz Langa +.. moduleauthor:: Pablo Galindo .. sectionauthor:: Peter Harris **Source code:** :source:`Lib/functools.py` +.. testsetup:: default + + import functools + from functools import * + -------------- The :mod:`functools` module is for higher-order functions: functions that act on @@ -20,6 +26,32 @@ function for the purposes of this module. The :mod:`functools` module defines the following functions: +.. decorator:: cache(user_function) + + Simple lightweight unbounded function cache. Sometimes called + `"memoize" `_. + + Returns the same as ``lru_cache(maxsize=None)``, creating a thin + wrapper around a dictionary lookup for the function arguments. Because it + never needs to evict old values, this is smaller and faster than + :func:`lru_cache()` with a size limit. + + For example:: + + @cache + def factorial(n): + return n * factorial(n-1) if n else 1 + + >>> factorial(10) # no previously cached result, makes 11 recursive calls + 3628800 + >>> factorial(5) # just looks up cached value result + 120 + >>> factorial(12) # makes two new recursive calls, the other 10 are cached + 479001600 + + .. versionadded:: 3.9 + + .. decorator:: cached_property(func) Transform a method of a class into a property whose value is computed once @@ -107,6 +139,11 @@ The :mod:`functools` module defines the following functions: cached separately. For example, ``f(3)`` and ``f(3.0)`` will be treated as distinct calls with distinct results. + The wrapped function is instrumented with a :func:`cache_parameters` + function that returns a new :class:`dict` showing the values for *maxsize* + and *typed*. This is for information purposes only. Mutating the values + has no effect. + To help measure the effectiveness of the cache and tune the *maxsize* parameter, the wrapped function is instrumented with a :func:`cache_info` function that returns a :term:`named tuple` showing *hits*, *misses*, @@ -121,11 +158,11 @@ The :mod:`functools` module defines the following functions: bypassing the cache, or for rewrapping the function with a different cache. An `LRU (least recently used) cache - `_ works - best when the most recent calls are the best predictors of upcoming calls (for - example, the most popular articles on a news server tend to change each day). - The cache's size limit assures that the cache does not grow without bound on - long-running processes such as web servers. + `_ + works best when the most recent calls are the best predictors of upcoming + calls (for example, the most popular articles on a news server tend to + change each day). The cache's size limit assures that the cache does not + grow without bound on long-running processes such as web servers. In general, the LRU cache should only be used when you want to reuse previously computed values. Accordingly, it doesn't make sense to cache @@ -177,6 +214,9 @@ The :mod:`functools` module defines the following functions: .. versionchanged:: 3.8 Added the *user_function* option. + .. versionadded:: 3.9 + Added the function :func:`cache_parameters` + .. decorator:: total_ordering Given a class defining one or more rich comparison ordering methods, this @@ -274,7 +314,7 @@ The :mod:`functools` module defines the following functions: Example:: - >>> class Cell(object): + >>> class Cell: ... def __init__(self): ... self._alive = False ... @property @@ -414,6 +454,20 @@ The :mod:`functools` module defines the following functions: for the base ``object`` type, which means it is used if no better implementation is found. + If an implementation registered to :term:`abstract base class`, virtual + subclasses will be dispatched to that implementation:: + + >>> from collections.abc import Mapping + >>> @fun.register + ... def _(arg: Mapping, verbose=False): + ... if verbose: + ... print("Keys & Values") + ... for key, value in arg.items(): + ... print(key, "=>", value) + ... + >>> fun({"a": "b"}) + a => b + To check which implementation will the generic function choose for a given type, use the ``dispatch()`` attribute:: @@ -597,4 +651,4 @@ callable, weak referencable, and can have attributes. There are some important differences. For instance, the :attr:`~definition.__name__` and :attr:`__doc__` attributes are not created automatically. Also, :class:`partial` objects defined in classes behave like static methods and do not transform into bound methods -during instance attribute look-up. +during instance attribute look-up. \ No newline at end of file diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index adaa3029..2d85cd34 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -177,6 +177,27 @@ The :mod:`gc` module provides the following functions: .. versionadded:: 3.1 +.. function:: is_finalized(obj) + + Returns ``True`` if the given object has been finalized by the + garbage collector, ``False`` otherwise. :: + + >>> x = None + >>> class Lazarus: + ... def __del__(self): + ... global x + ... x = self + ... + >>> lazarus = Lazarus() + >>> gc.is_finalized(lazarus) + False + >>> del lazarus + >>> gc.is_finalized(x) + True + + .. versionadded:: 3.9 + + .. function:: freeze() Freeze all the objects tracked by gc - move them to a permanent generation diff --git a/Doc/library/graphlib.rst b/Doc/library/graphlib.rst new file mode 100644 index 00000000..0faca218 --- /dev/null +++ b/Doc/library/graphlib.rst @@ -0,0 +1,209 @@ +:mod:`graphlib` --- Functionality to operate with graph-like structures +========================================================================= + +.. module:: graphlib + :synopsis: Functionality to operate with graph-like structures + + +**Source code:** :source:`Lib/graphlib.py` + +.. testsetup:: default + + import graphlib + from graphlib import * + +-------------- + + +.. class:: TopologicalSorter(graph=None) + + Provides functionality to topologically sort a graph of hashable nodes. + + A topological order is a linear ordering of the vertices in a graph such that + for every directed edge u -> v from vertex u to vertex v, vertex u comes + before vertex v in the ordering. For instance, the vertices of the graph may + represent tasks to be performed, and the edges may represent constraints that + one task must be performed before another; in this example, a topological + ordering is just a valid sequence for the tasks. A complete topological + ordering is possible if and only if the graph has no directed cycles, that + is, if it is a directed acyclic graph. + + If the optional *graph* argument is provided it must be a dictionary + representing a directed acyclic graph where the keys are nodes and the values + are iterables of all predecessors of that node in the graph (the nodes that + have edges that point to the value in the key). Additional nodes can be added + to the graph using the :meth:`~TopologicalSorter.add` method. + + In the general case, the steps required to perform the sorting of a given + graph are as follows: + + * Create an instance of the :class:`TopologicalSorter` with an optional + initial graph. + * Add additional nodes to the graph. + * Call :meth:`~TopologicalSorter.prepare` on the graph. + * While :meth:`~TopologicalSorter.is_active` is ``True``, iterate over + the nodes returned by :meth:`~TopologicalSorter.get_ready` and + process them. Call :meth:`~TopologicalSorter.done` on each node as it + finishes processing. + + In case just an immediate sorting of the nodes in the graph is required and + no parallelism is involved, the convenience method + :meth:`TopologicalSorter.static_order` can be used directly: + + .. doctest:: + + >>> graph = {"D": {"B", "C"}, "C": {"A"}, "B": {"A"}} + >>> ts = TopologicalSorter(graph) + >>> tuple(ts.static_order()) + ('A', 'C', 'B', 'D') + + The class is designed to easily support parallel processing of the nodes as + they become ready. For instance:: + + topological_sorter = TopologicalSorter() + + # Add nodes to 'topological_sorter'... + + topological_sorter.prepare() + while topological_sorter.is_active(): + for node in topological_sorter.get_ready(): + # Worker threads or processes take nodes to work on off the + # 'task_queue' queue. + task_queue.put(node) + + # When the work for a node is done, workers put the node in + # 'finalized_tasks_queue' so we can get more nodes to work on. + # The definition of 'is_active()' guarantees that, at this point, at + # least one node has been placed on 'task_queue' that hasn't yet + # been passed to 'done()', so this blocking 'get()' must (eventually) + # succeed. After calling 'done()', we loop back to call 'get_ready()' + # again, so put newly freed nodes on 'task_queue' as soon as + # logically possible. + node = finalized_tasks_queue.get() + topological_sorter.done(node) + + .. method:: add(node, *predecessors) + + Add a new node and its predecessors to the graph. Both the *node* and all + elements in *predecessors* must be hashable. + + If called multiple times with the same node argument, the set of + dependencies will be the union of all dependencies passed in. + + It is possible to add a node with no dependencies (*predecessors* is not + provided) or to provide a dependency twice. If a node that has not been + provided before is included among *predecessors* it will be automatically + added to the graph with no predecessors of its own. + + Raises :exc:`ValueError` if called after :meth:`~TopologicalSorter.prepare`. + + .. method:: prepare() + + Mark the graph as finished and check for cycles in the graph. If any cycle + is detected, :exc:`CycleError` will be raised, but + :meth:`~TopologicalSorter.get_ready` can still be used to obtain as many + nodes as possible until cycles block more progress. After a call to this + function, the graph cannot be modified, and therefore no more nodes can be + added using :meth:`~TopologicalSorter.add`. + + .. method:: is_active() + + Returns ``True`` if more progress can be made and ``False`` otherwise. + Progress can be made if cycles do not block the resolution and either + there are still nodes ready that haven't yet been returned by + :meth:`TopologicalSorter.get_ready` or the number of nodes marked + :meth:`TopologicalSorter.done` is less than the number that have been + returned by :meth:`TopologicalSorter.get_ready`. + + The :meth:`~TopologicalSorter.__bool__` method of this class defers to + this function, so instead of:: + + if ts.is_active(): + ... + + it is possible to simply do:: + + if ts: + ... + + Raises :exc:`ValueError` if called without calling + :meth:`~TopologicalSorter.prepare` previously. + + .. method:: done(*nodes) + + Marks a set of nodes returned by :meth:`TopologicalSorter.get_ready` as + processed, unblocking any successor of each node in *nodes* for being + returned in the future by a call to :meth:`TopologicalSorter.get_ready`. + + Raises :exc:`ValueError` if any node in *nodes* has already been marked as + processed by a previous call to this method or if a node was not added to + the graph by using :meth:`TopologicalSorter.add`, if called without + calling :meth:`~TopologicalSorter.prepare` or if node has not yet been + returned by :meth:`~TopologicalSorter.get_ready`. + + .. method:: get_ready() + + Returns a ``tuple`` with all the nodes that are ready. Initially it + returns all nodes with no predecessors, and once those are marked as + processed by calling :meth:`TopologicalSorter.done`, further calls will + return all new nodes that have all their predecessors already processed. + Once no more progress can be made, empty tuples are returned. + + Raises :exc:`ValueError` if called without calling + :meth:`~TopologicalSorter.prepare` previously. + + .. method:: static_order() + + Returns an iterable of nodes in a topological order. Using this method + does not require to call :meth:`TopologicalSorter.prepare` or + :meth:`TopologicalSorter.done`. This method is equivalent to:: + + def static_order(self): + self.prepare() + while self.is_active(): + node_group = self.get_ready() + yield from node_group + self.done(*node_group) + + The particular order that is returned may depend on the specific order in + which the items were inserted in the graph. For example: + + .. doctest:: + + >>> ts = TopologicalSorter() + >>> ts.add(3, 2, 1) + >>> ts.add(1, 0) + >>> print([*ts.static_order()]) + [2, 0, 1, 3] + + >>> ts2 = TopologicalSorter() + >>> ts2.add(1, 0) + >>> ts2.add(3, 2, 1) + >>> print([*ts2.static_order()]) + [0, 2, 1, 3] + + This is due to the fact that "0" and "2" are in the same level in the + graph (they would have been returned in the same call to + :meth:`~TopologicalSorter.get_ready`) and the order between them is + determined by the order of insertion. + + + If any cycle is detected, :exc:`CycleError` will be raised. + + .. versionadded:: 3.9 + + +Exceptions +---------- +The :mod:`graphlib` module defines the following exception classes: + +.. exception:: CycleError + + Subclass of :exc:`ValueError` raised by :meth:`TopologicalSorter.prepare` if cycles exist + in the working graph. If multiple cycles exist, only one undefined choice among them will + be reported and included in the exception. + + The detected cycle can be accessed via the second element in the :attr:`~CycleError.args` + attribute of the exception instance and consists in a list of nodes, such that each node is, + in the graph, an immediate predecessor of the next node in the list. In the reported list, + the first and the last node will be the same, to make it clear that it is cyclic. \ No newline at end of file diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst index 3349a944..33c40676 100644 --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -88,7 +88,8 @@ The module defines the following items: The *mode* argument can be any of ``'r'``, ``'rb'``, ``'a'``, ``'ab'``, ``'w'``, ``'wb'``, ``'x'``, or ``'xb'``, depending on whether the file will be read or written. The default is the mode of *fileobj* if discernible; otherwise, the - default is ``'rb'``. + default is ``'rb'``. In future Python releases the mode of *fileobj* will + not be used. It is better to always specify *mode* for writing. Note that the file is always opened in binary mode. To open a compressed file in text mode, use :func:`.open` (or wrap your :class:`GzipFile` with an @@ -164,6 +165,10 @@ The module defines the following items: .. versionchanged:: 3.6 Accepts a :term:`path-like object`. + .. deprecated:: 3.9 + Opening :class:`GzipFile` for writing without specifying the *mode* + argument is deprecated. + .. function:: compress(data, compresslevel=9, *, mtime=None) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst index a16c7cd4..d644974e 100644 --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -67,7 +67,7 @@ Constructors for hash algorithms that are always present in this module are :func:`sha1`, :func:`sha224`, :func:`sha256`, :func:`sha384`, :func:`sha512`, :func:`blake2b`, and :func:`blake2s`. :func:`md5` is normally available as well, though it -may be missing if you are using a rare "FIPS compliant" build of Python. +may be missing or blocked if you are using a rare "FIPS compliant" build of Python. Additional algorithms may also be available depending upon the OpenSSL library that Python uses on your platform. On most platforms the :func:`sha3_224`, :func:`sha3_256`, :func:`sha3_384`, :func:`sha3_512`, @@ -80,6 +80,15 @@ library that Python uses on your platform. On most platforms the .. versionadded:: 3.6 :func:`blake2b` and :func:`blake2s` were added. +.. versionchanged:: 3.9 + All hashlib constructors take a keyword-only argument *usedforsecurity* + with default value ``True``. A false value allows the use of insecure and + blocked hashing algorithms in restricted environments. ``False`` indicates + that the hashing algorithm is not used in a security context, e.g. as a + non-cryptographic one-way compression function. + + Hashlib now uses SHA3 and SHAKE from OpenSSL 1.1.1 and newer. + For example, to obtain the digest of the byte string ``b'Nobody inspects the spammish repetition'``:: @@ -99,7 +108,7 @@ More condensed: >>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest() 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2' -.. function:: new(name[, data]) +.. function:: new(name[, data], *, usedforsecurity=True) Is a generic constructor that takes the string *name* of the desired algorithm as its first parameter. It also exists to allow access to the @@ -308,11 +317,13 @@ New hash objects are created by calling constructor functions: .. function:: blake2b(data=b'', *, digest_size=64, key=b'', salt=b'', \ person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, \ - node_depth=0, inner_size=0, last_node=False) + node_depth=0, inner_size=0, last_node=False, \ + usedforsecurity=True) .. function:: blake2s(data=b'', *, digest_size=32, key=b'', salt=b'', \ person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, \ - node_depth=0, inner_size=0, last_node=False) + node_depth=0, inner_size=0, last_node=False, \ + usedforsecurity=True) These functions return the corresponding hash objects for calculating diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst index 57ac8bb1..897edc2d 100644 --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -114,6 +114,12 @@ A hash object has the following attributes: .. versionadded:: 3.4 +.. deprecated:: 3.9 + + The undocumented attributes ``HMAC.digest_cons``, ``HMAC.inner``, and + ``HMAC.outer`` are internal implementation details and will be removed in + Python 3.10. + This module also provides the following helper function: .. function:: compare_digest(a, b) @@ -132,6 +138,11 @@ This module also provides the following helper function: .. versionadded:: 3.3 + .. versionchanged:: 3.9 + + The function uses OpenSSL's ``CRYPTO_memcmp()`` internally when + available. + .. seealso:: diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst index be31c3c0..35997db2 100644 --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -484,6 +484,14 @@ statement. HTTP protocol version used by server. 10 for HTTP/1.0, 11 for HTTP/1.1. +.. attribute:: HTTPResponse.url + + URL of the resource retrieved, commonly used to determine if a redirect was followed. + +.. attribute:: HTTPResponse.headers + + Headers of the response in the form of an :class:`email.message.EmailMessage` instance. + .. attribute:: HTTPResponse.status Status code returned by server. @@ -501,6 +509,21 @@ statement. Is ``True`` if the stream is closed. +.. method:: HTTPResponse.geturl() + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~HTTPResponse.url`. + +.. method:: HTTPResponse.info() + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~HTTPResponse.headers`. + +.. method:: HTTPResponse.getstatus() + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~HTTPResponse.status`. + Examples -------- diff --git a/Doc/library/http.rst b/Doc/library/http.rst index 0e3441cb..14ee7336 100644 --- a/Doc/library/http.rst +++ b/Doc/library/http.rst @@ -62,6 +62,7 @@ Code Enum Name Details ``100`` ``CONTINUE`` HTTP/1.1 :rfc:`7231`, Section 6.2.1 ``101`` ``SWITCHING_PROTOCOLS`` HTTP/1.1 :rfc:`7231`, Section 6.2.2 ``102`` ``PROCESSING`` WebDAV :rfc:`2518`, Section 10.1 +``103`` ``EARLY_HINTS`` An HTTP Status Code for Indicating Hints :rfc:`8297` ``200`` ``OK`` HTTP/1.1 :rfc:`7231`, Section 6.3.1 ``201`` ``CREATED`` HTTP/1.1 :rfc:`7231`, Section 6.3.2 ``202`` ``ACCEPTED`` HTTP/1.1 :rfc:`7231`, Section 6.3.3 @@ -98,10 +99,12 @@ Code Enum Name Details ``415`` ``UNSUPPORTED_MEDIA_TYPE`` HTTP/1.1 :rfc:`7231`, Section 6.5.13 ``416`` ``REQUESTED_RANGE_NOT_SATISFIABLE`` HTTP/1.1 Range Requests :rfc:`7233`, Section 4.4 ``417`` ``EXPECTATION_FAILED`` HTTP/1.1 :rfc:`7231`, Section 6.5.14 +``418`` ``IM_A_TEAPOT`` HTCPCP/1.0 :rfc:`2324`, Section 2.3.2 ``421`` ``MISDIRECTED_REQUEST`` HTTP/2 :rfc:`7540`, Section 9.1.2 ``422`` ``UNPROCESSABLE_ENTITY`` WebDAV :rfc:`4918`, Section 11.2 ``423`` ``LOCKED`` WebDAV :rfc:`4918`, Section 11.3 ``424`` ``FAILED_DEPENDENCY`` WebDAV :rfc:`4918`, Section 11.4 +``425`` ``TOO_EARLY`` Using Early Data in HTTP :rfc:`8470` ``426`` ``UPGRADE_REQUIRED`` HTTP/1.1 :rfc:`7231`, Section 6.5.15 ``428`` ``PRECONDITION_REQUIRED`` Additional HTTP Status Codes :rfc:`6585` ``429`` ``TOO_MANY_REQUESTS`` Additional HTTP Status Codes :rfc:`6585` @@ -130,3 +133,6 @@ equal to the constant name (i.e. ``http.HTTPStatus.OK`` is also available as .. versionadded:: 3.8 Added ``451 UNAVAILABLE_FOR_LEGAL_REASONS`` status code. + +.. versionadded:: 3.9 + Added ``103 EARLY_HINTS``, ``418 IM_A_TEAPOT`` and ``425 TOO_EARLY`` status codes. diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index a367e373..478a5b31 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -335,15 +335,21 @@ provides three different variants: .. attribute:: extensions_map - A dictionary mapping suffixes into MIME types. The default is - signified by an empty string, and is considered to be - ``application/octet-stream``. The mapping is used case-insensitively, + A dictionary mapping suffixes into MIME types, contains custom overrides + for the default system mappings. The mapping is used case-insensitively, and so should contain only lower-cased keys. + .. versionchanged:: 3.9 + This dictionary is no longer filled with the default system mappings, + but only contains overrides. + .. attribute:: directory If not specified, the directory to serve is the current working directory. + .. versionchanged:: 3.9 + Accepts a :term:`path-like object`. + The :class:`SimpleHTTPRequestHandler` class defines the following methods: .. method:: do_HEAD() diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index a59a5d3a..43096b01 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -527,33 +527,30 @@ by typing '_' after '.', either before or after the box is opened. Calltips ^^^^^^^^ -A calltip is shown automatically when one types :kbd:`(` after the name -of an *accessible* function. A function name expression may include -dots and subscripts. A calltip remains until it is clicked, the cursor -is moved out of the argument area, or :kbd:`)` is typed. Whenever the -cursor is in the argument part of a definition, select Edit and "Show -Call Tip" on the menu or enter its shortcut to display a calltip. - -The calltip consists of the function's signature and docstring up to -the latter's first blank line or the fifth non-blank line. (Some builtin -functions lack an accessible signature.) A '/' or '*' in the signature -indicates that the preceding or following arguments are passed by -position or name (keyword) only. Details are subject to change. - -In Shell, the accessible functions depends on what modules have been -imported into the user process, including those imported by Idle itself, -and which definitions have been run, all since the last restart. +A calltip is shown when one types :kbd:`(` after the name of an *accessible* +function. A name expression may include dots and subscripts. A calltip +remains until it is clicked, the cursor is moved out of the argument area, +or :kbd:`)` is typed. When the cursor is in the argument part of a definition, +the menu or shortcut display a calltip. + +A calltip consists of the function signature and the first line of the +docstring. For builtins without an accessible signature, the calltip +consists of all lines up the fifth line or the first blank line. These +details may change. + +The set of *accessible* functions depends on what modules have been imported +into the user process, including those imported by Idle itself, +and what definitions have been run, all since the last restart. For example, restart the Shell and enter ``itertools.count(``. A calltip -appears because Idle imports itertools into the user process for its own -use. (This could change.) Enter ``turtle.write(`` and nothing appears. -Idle does not itself import turtle. The menu entry and shortcut also do -nothing. Enter ``import turtle``. Thereafter, ``turtle.write(`` -will display a calltip. - -In an editor, import statements have no effect until one runs the file. -One might want to run a file after writing import statements, after -adding function definitions, or after opening an existing file. +appears because Idle imports itertools into the user process for its own use. +(This could change.) Enter ``turtle.write(`` and nothing appears. Idle does +not import turtle. The menu or shortcut do nothing either. Enter +``import turtle`` and then ``turtle.write(`` will work. + +In an editor, import statements have no effect until one runs the file. One +might want to run a file after writing the import statements at the top, +or immediately run an existing file before editing. .. _code-context: diff --git a/Doc/library/imaplib.rst b/Doc/library/imaplib.rst index b3d53372..02ecfd95 100644 --- a/Doc/library/imaplib.rst +++ b/Doc/library/imaplib.rst @@ -30,12 +30,14 @@ Three classes are provided by the :mod:`imaplib` module, :class:`IMAP4` is the base class: -.. class:: IMAP4(host='', port=IMAP4_PORT) +.. class:: IMAP4(host='', port=IMAP4_PORT, timeout=None) This class implements the actual IMAP4 protocol. The connection is created and protocol version (IMAP4 or IMAP4rev1) is determined when the instance is initialized. If *host* is not specified, ``''`` (the local host) is used. If - *port* is omitted, the standard IMAP4 port (143) is used. + *port* is omitted, the standard IMAP4 port (143) is used. The optional *timeout* + parameter specifies a timeout in seconds for the connection attempt. + If timeout is not given or is None, the global default socket timeout is used. The :class:`IMAP4` class supports the :keyword:`with` statement. When used like this, the IMAP4 ``LOGOUT`` command is issued automatically when the @@ -50,6 +52,9 @@ base class: .. versionchanged:: 3.5 Support for the :keyword:`with` statement was added. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. + Three exceptions are defined as attributes of the :class:`IMAP4` class: @@ -78,7 +83,7 @@ There's also a subclass for secure connections: .. class:: IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, \ - certfile=None, ssl_context=None) + certfile=None, ssl_context=None, timeout=None) This is a subclass derived from :class:`IMAP4` that connects over an SSL encrypted socket (to use this class you need a socket module that was compiled @@ -95,8 +100,12 @@ There's also a subclass for secure connections: mutually exclusive with *ssl_context*, a :class:`ValueError` is raised if *keyfile*/*certfile* is provided along with *ssl_context*. + The optional *timeout* parameter specifies a timeout in seconds for the + connection attempt. If timeout is not given or is None, the global default + socket timeout is used. + .. versionchanged:: 3.3 - *ssl_context* parameter added. + *ssl_context* parameter was added. .. versionchanged:: 3.4 The class now supports hostname check with @@ -110,6 +119,8 @@ There's also a subclass for secure connections: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. The second subclass allows for connections created by a child process: @@ -353,16 +364,22 @@ An :class:`IMAP4` instance has the following methods: Send ``NOOP`` to server. -.. method:: IMAP4.open(host, port) +.. method:: IMAP4.open(host, port, timeout=None) - Opens socket to *port* at *host*. This method is implicitly called by - the :class:`IMAP4` constructor. The connection objects established by this - method will be used in the :meth:`IMAP4.read`, :meth:`IMAP4.readline`, - :meth:`IMAP4.send`, and :meth:`IMAP4.shutdown` methods. You may override - this method. + Opens socket to *port* at *host*. The optional *timeout* parameter + specifies a timeout in seconds for the connection attempt. + If timeout is not given or is None, the global default socket timeout + is used. Also note that if the *timeout* parameter is set to be zero, + it will raise a :class:`ValueError` to reject creating a non-blocking socket. + This method is implicitly called by the :class:`IMAP4` constructor. + The connection objects established by this method will be used in + the :meth:`IMAP4.read`, :meth:`IMAP4.readline`, :meth:`IMAP4.send`, + and :meth:`IMAP4.shutdown` methods. You may override this method. .. audit-event:: imaplib.open self,host,port imaplib.IMAP4.open + .. versionchanged:: 3.9 + The *timeout* parameter was added. .. method:: IMAP4.partial(message_num, message_part, start, length) @@ -565,6 +582,15 @@ An :class:`IMAP4` instance has the following methods: Unsubscribe from old mailbox. +.. method:: IMAP4.unselect() + + :meth:`imaplib.IMAP4.unselect` frees server's resources associated with the + selected mailbox and returns the server to the authenticated + state. This command performs the same actions as :meth:`imaplib.IMAP4.close`, except + that no messages are permanently removed from the currently + selected mailbox. + + .. versionadded:: 3.9 .. method:: IMAP4.xatom(name[, ...]) diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index dc6b66ca..21da143f 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -1,8 +1,8 @@ .. _using: -========================== - Using importlib.metadata -========================== +================================= + Using :mod:`!importlib.metadata` +================================= .. note:: This functionality is provisional and may deviate from the usual @@ -12,8 +12,8 @@ package metadata. Built in part on Python's import system, this library intends to replace similar functionality in the `entry point API`_ and `metadata API`_ of ``pkg_resources``. Along with -``importlib.resources`` in `Python 3.7 -and newer`_ (backported as `importlib_resources`_ for older versions of +:mod:`importlib.resources` in Python 3.7 +and newer (backported as `importlib_resources`_ for older versions of Python), this can eliminate the need to use the older and less efficient ``pkg_resources`` package. @@ -21,9 +21,9 @@ By "installed package" we generally mean a third-party package installed into Python's ``site-packages`` directory via tools such as `pip `_. Specifically, it means a package with either a discoverable ``dist-info`` or ``egg-info`` -directory, and metadata defined by `PEP 566`_ or its older specifications. +directory, and metadata defined by :pep:`566` or its older specifications. By default, package metadata can live on the file system or in zip archives on -``sys.path``. Through an extension mechanism, the metadata can live almost +:data:`sys.path`. Through an extension mechanism, the metadata can live almost anywhere. @@ -77,7 +77,9 @@ Entry points The ``entry_points()`` function returns a dictionary of all entry points, keyed by group. Entry points are represented by ``EntryPoint`` instances; each ``EntryPoint`` has a ``.name``, ``.group``, and ``.value`` attributes and -a ``.load()`` method to resolve the value. +a ``.load()`` method to resolve the value. There are also ``.module``, +``.attr``, and ``.extras`` attributes for getting the components of the +``.value`` attribute:: >>> eps = entry_points() # doctest: +SKIP >>> list(eps) # doctest: +SKIP @@ -86,6 +88,12 @@ a ``.load()`` method to resolve the value. >>> wheel = [ep for ep in scripts if ep.name == 'wheel'][0] # doctest: +SKIP >>> wheel # doctest: +SKIP EntryPoint(name='wheel', value='wheel.cli:main', group='console_scripts') + >>> wheel.module # doctest: +SKIP + 'wheel.cli' + >>> wheel.attr # doctest: +SKIP + 'main' + >>> wheel.extras # doctest: +SKIP + [] >>> main = wheel.load() # doctest: +SKIP >>> main # doctest: +SKIP @@ -94,7 +102,7 @@ The ``group`` and ``name`` are arbitrary values defined by the package author and usually a client will wish to resolve all entry points for a particular group. Read `the setuptools docs `_ -for more information on entrypoints, their definition, and usage. +for more information on entry points, their definition, and usage. .. _metadata: @@ -134,7 +142,7 @@ Distribution files You can also get the full set of files contained within a distribution. The ``files()`` function takes a distribution package name and returns all of the files installed by this distribution. Each file object returned is a -``PackagePath``, a `pathlib.Path`_ derived object with additional ``dist``, +``PackagePath``, a :class:`pathlib.Path` derived object with additional ``dist``, ``size``, and ``hash`` properties as indicated by the metadata. For example:: >>> util = [p for p in files('wheel') if 'util.py' in str(p)][0] # doctest: +SKIP @@ -203,18 +211,18 @@ instance:: >>> d.metadata['License'] # doctest: +SKIP 'MIT' -The full set of available metadata is not described here. See `PEP 566 -`_ for additional details. +The full set of available metadata is not described here. See :pep:`566` +for additional details. Extending the search algorithm ============================== -Because package metadata is not available through ``sys.path`` searches, or +Because package metadata is not available through :data:`sys.path` searches, or package loaders directly, the metadata for a package is found through import -system `finders`_. To find a distribution package's metadata, -``importlib.metadata`` queries the list of `meta path finders`_ on -`sys.meta_path`_. +system :ref:`finders `. To find a distribution package's metadata, +``importlib.metadata`` queries the list of :term:`meta path finders ` on +:data:`sys.meta_path`. The default ``PathFinder`` for Python includes a hook that calls into ``importlib.metadata.MetadataPathFinder`` for finding distributions @@ -224,7 +232,7 @@ The abstract class :py:class:`importlib.abc.MetaPathFinder` defines the interface expected of finders by Python's import system. ``importlib.metadata`` extends this protocol by looking for an optional ``find_distributions`` callable on the finders from -``sys.meta_path`` and presents this extended interface as the +:data:`sys.meta_path` and presents this extended interface as the ``DistributionFinder`` abstract base class, which defines this abstract method:: @@ -235,7 +243,7 @@ method:: """ The ``DistributionFinder.Context`` object provides ``.path`` and ``.name`` -properties indicating the path to search and names to match and may +properties indicating the path to search and name to match and may supply other relevant context. What this means in practice is that to support finding distribution package @@ -247,20 +255,13 @@ a custom finder, return instances of this derived ``Distribution`` in the .. _`entry point API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points .. _`metadata API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#metadata-api -.. _`Python 3.7 and newer`: https://docs.python.org/3/library/importlib.html#module-importlib.resources .. _`importlib_resources`: https://importlib-resources.readthedocs.io/en/latest/index.html -.. _`PEP 566`: https://www.python.org/dev/peps/pep-0566/ -.. _`finders`: https://docs.python.org/3/reference/import.html#finders-and-loaders -.. _`meta path finders`: https://docs.python.org/3/glossary.html#term-meta-path-finder -.. _`sys.meta_path`: https://docs.python.org/3/library/sys.html#sys.meta_path -.. _`pathlib.Path`: https://docs.python.org/3/library/pathlib.html#pathlib.Path .. rubric:: Footnotes .. [#f1] Technically, the returned distribution metadata object is an - `email.message.Message - `_ + :class:`email.message.EmailMessage` instance, but this is an implementation detail, and not part of the stable API. You should only use dictionary-like methods and syntax to access the metadata contents. diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index f205f5fe..b51db9e8 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -480,6 +480,8 @@ ABC hierarchy:: .. class:: ResourceReader + *Superseded by TraversableReader* + An :term:`abstract base class` to provide the ability to read *resources*. @@ -795,6 +797,25 @@ ABC hierarchy:: itself does not end in ``__init__``. +.. class:: Traversable + + An object with a subset of pathlib.Path methods suitable for + traversing directories and opening files. + + .. versionadded:: 3.9 + + +.. class:: TraversableReader + + An abstract base class for resource readers capable of serving + the ``files`` interface. Subclasses ResourceReader and provides + concrete implementations of the ResourceReader's abstract + methods. Therefore, any loader supplying TraversableReader + also supplies ResourceReader. + + .. versionadded:: 3.9 + + :mod:`importlib.resources` -- Resources --------------------------------------- @@ -853,6 +874,19 @@ The following types are defined. The following functions are available. + +.. function:: files(package) + + Returns an :class:`importlib.resources.abc.Traversable` object + representing the resource container for the package (think directory) + and its resources (think files). A Traversable may contain other + containers (think subdirectories). + + *package* is either a name or a module object which conforms to the + ``Package`` requirements. + + .. versionadded:: 3.9 + .. function:: open_binary(package, resource) Open for binary reading the *resource* within *package*. @@ -1440,13 +1474,18 @@ an :term:`importer`. ``importlib.util.resolve_name('sys', __package__)`` without doing a check to see if the **package** argument is needed. - :exc:`ValueError` is raised if **name** is a relative module name but - package is a false value (e.g. ``None`` or the empty string). - :exc:`ValueError` is also raised a relative name would escape its containing + :exc:`ImportError` is raised if **name** is a relative module name but + **package** is a false value (e.g. ``None`` or the empty string). + :exc:`ImportError` is also raised a relative name would escape its containing package (e.g. requesting ``..bacon`` from within the ``spam`` package). .. versionadded:: 3.3 + .. versionchanged:: 3.9 + To improve consistency with import statements, raise + :exc:`ImportError` instead of :exc:`ValueError` for invalid relative + import attempts. + .. function:: find_spec(name, package=None) Find the :term:`spec ` for a module, optionally relative to diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index bab2c41e..d00a30ff 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -821,10 +821,9 @@ function. .. attribute:: BoundArguments.arguments - An ordered, mutable mapping (:class:`collections.OrderedDict`) of - parameters' names to arguments' values. Contains only explicitly bound - arguments. Changes in :attr:`arguments` will reflect in :attr:`args` and - :attr:`kwargs`. + A mutable mapping of parameters' names to arguments' values. + Contains only explicitly bound arguments. Changes in :attr:`arguments` + will reflect in :attr:`args` and :attr:`kwargs`. Should be used in conjunction with :attr:`Signature.parameters` for any argument processing purposes. @@ -836,6 +835,10 @@ function. However, if needed, use :meth:`BoundArguments.apply_defaults` to add them. + .. versionchanged:: 3.9 + :attr:`arguments` is now of type :class:`dict`. Formerly, it was of + type :class:`collections.OrderedDict`. + .. attribute:: BoundArguments.args A tuple of positional arguments values. Dynamically computed from the @@ -866,7 +869,7 @@ function. >>> ba = inspect.signature(foo).bind('spam') >>> ba.apply_defaults() >>> ba.arguments - OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())]) + {'a': 'spam', 'b': 'ham', 'args': ()} .. versionadded:: 3.5 diff --git a/Doc/library/io.rst b/Doc/library/io.rst index 32151a0a..aecbec56 100644 --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -196,18 +196,18 @@ The :class:`RawIOBase` ABC extends :class:`IOBase`. It deals with the reading and writing of bytes to a stream. :class:`FileIO` subclasses :class:`RawIOBase` to provide an interface to files in the machine's file system. -The :class:`BufferedIOBase` ABC deals with buffering on a raw byte stream -(:class:`RawIOBase`). Its subclasses, :class:`BufferedWriter`, -:class:`BufferedReader`, and :class:`BufferedRWPair` buffer streams that are -readable, writable, and both readable and writable. :class:`BufferedRandom` -provides a buffered interface to random access streams. Another -:class:`BufferedIOBase` subclass, :class:`BytesIO`, is a stream of in-memory -bytes. - -The :class:`TextIOBase` ABC, another subclass of :class:`IOBase`, deals with +The :class:`BufferedIOBase` ABC extends :class:`IOBase`. It deals with +buffering on a raw binary stream (:class:`RawIOBase`). Its subclasses, +:class:`BufferedWriter`, :class:`BufferedReader`, and :class:`BufferedRWPair` +buffer raw binary streams that are readable, writable, and both readable and writable, +respectively. :class:`BufferedRandom` provides a buffered interface to seekable streams. +Another :class:`BufferedIOBase` subclass, :class:`BytesIO`, is a stream of +in-memory bytes. + +The :class:`TextIOBase` ABC extends :class:`IOBase`. It deals with streams whose bytes represent text, and handles encoding and decoding to and -from strings. :class:`TextIOWrapper`, which extends it, is a buffered text -interface to a buffered raw stream (:class:`BufferedIOBase`). Finally, +from strings. :class:`TextIOWrapper`, which extends :class:`TextIOBase`, is a buffered text +interface to a buffered raw stream (:class:`BufferedIOBase`). Finally, :class:`StringIO` is an in-memory stream for text. Argument names are not part of the specification, and only the arguments of @@ -392,15 +392,16 @@ I/O Base Classes .. class:: RawIOBase - Base class for raw binary I/O. It inherits :class:`IOBase`. There is no + Base class for raw binary streams. It inherits :class:`IOBase`. There is no public constructor. - Raw binary I/O typically provides low-level access to an underlying OS - device or API, and does not try to encapsulate it in high-level primitives - (this is left to Buffered I/O and Text I/O, described later in this page). + Raw binary streams typically provide low-level access to an underlying OS + device or API, and do not try to encapsulate it in high-level primitives + (this functionality is done at a higher-level in buffered binary streams and text streams, described later + in this page). - In addition to the attributes and methods from :class:`IOBase`, - :class:`RawIOBase` provides the following methods: + :class:`RawIOBase` provides these methods in addition to those from + :class:`IOBase`: .. method:: read(size=-1) @@ -464,8 +465,8 @@ I/O Base Classes :class:`RawIOBase` implementation, but wrap one, like :class:`BufferedWriter` and :class:`BufferedReader` do. - :class:`BufferedIOBase` provides or overrides these methods and attribute in - addition to those from :class:`IOBase`: + :class:`BufferedIOBase` provides or overrides these data attributes and + methods in addition to those from :class:`IOBase`: .. attribute:: raw @@ -558,9 +559,8 @@ Raw File I/O .. class:: FileIO(name, mode='r', closefd=True, opener=None) - :class:`FileIO` represents an OS-level file containing bytes data. - It implements the :class:`RawIOBase` interface (and therefore the - :class:`IOBase` interface, too). + A raw binary stream representing an OS-level file containing bytes data. It + inherits :class:`RawIOBase`. The *name* can be one of two things: @@ -601,9 +601,8 @@ Raw File I/O .. versionchanged:: 3.4 The file is now non-inheritable. - In addition to the attributes and methods from :class:`IOBase` and - :class:`RawIOBase`, :class:`FileIO` provides the following data - attributes: + :class:`FileIO` provides these data attributes in addition to those from + :class:`RawIOBase` and :class:`IOBase`: .. attribute:: mode @@ -623,7 +622,7 @@ than raw I/O does. .. class:: BytesIO([initial_bytes]) - A stream implementation using an in-memory bytes buffer. It inherits + A binary stream using an in-memory bytes buffer. It inherits :class:`BufferedIOBase`. The buffer is discarded when the :meth:`~IOBase.close` method is called. @@ -671,8 +670,10 @@ than raw I/O does. .. class:: BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE) - A buffer providing higher-level access to a readable, sequential - :class:`RawIOBase` object. It inherits :class:`BufferedIOBase`. + A buffered binary stream providing higher-level access to a readable, non + seekable :class:`RawIOBase` raw binary stream. It inherits + :class:`BufferedIOBase`. + When reading data from this object, a larger amount of data may be requested from the underlying raw stream, and kept in an internal buffer. The buffered data can then be returned directly on subsequent reads. @@ -707,8 +708,10 @@ than raw I/O does. .. class:: BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE) - A buffer providing higher-level access to a writeable, sequential - :class:`RawIOBase` object. It inherits :class:`BufferedIOBase`. + A buffered binary stream providing higher-level access to a writeable, non + seekable :class:`RawIOBase` raw binary stream. It inherits + :class:`BufferedIOBase`. + When writing to this object, data is normally placed into an internal buffer. The buffer will be written out to the underlying :class:`RawIOBase` object under various conditions, including: @@ -740,8 +743,9 @@ than raw I/O does. .. class:: BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE) - A buffered interface to random access streams. It inherits - :class:`BufferedReader` and :class:`BufferedWriter`. + A buffered binary stream providing higher-level access to a seekable + :class:`RawIOBase` raw binary stream. It inherits :class:`BufferedReader` + and :class:`BufferedWriter`. The constructor creates a reader and writer for a seekable raw stream, given in the first argument. If the *buffer_size* is omitted it defaults to @@ -754,9 +758,9 @@ than raw I/O does. .. class:: BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE) - A buffered I/O object combining two unidirectional :class:`RawIOBase` - objects -- one readable, the other writeable -- into a single bidirectional - endpoint. It inherits :class:`BufferedIOBase`. + A buffered binary stream providing higher-level access to two non seekable + :class:`RawIOBase` raw binary streams---one readable, the other writeable. + It inherits :class:`BufferedIOBase`. *reader* and *writer* are :class:`RawIOBase` objects that are readable and writeable respectively. If the *buffer_size* is omitted it defaults to @@ -779,8 +783,8 @@ Text I/O .. class:: TextIOBase Base class for text streams. This class provides a character and line based - interface to stream I/O. It inherits :class:`IOBase`. - There is no public constructor. + interface to stream I/O. It inherits :class:`IOBase`. There is no public + constructor. :class:`TextIOBase` provides or overrides these data attributes and methods in addition to those from :class:`IOBase`: @@ -868,8 +872,9 @@ Text I/O .. class:: TextIOWrapper(buffer, encoding=None, errors=None, newline=None, \ line_buffering=False, write_through=False) - A buffered text stream over a :class:`BufferedIOBase` binary stream. - It inherits :class:`TextIOBase`. + A buffered text stream providing higher-level access to a + :class:`BufferedIOBase` buffered binary stream. It inherits + :class:`TextIOBase`. *encoding* gives the name of the encoding that the stream will be decoded or encoded with. It defaults to @@ -897,11 +902,11 @@ Text I/O * When reading input from the stream, if *newline* is ``None``, :term:`universal newlines` mode is enabled. Lines in the input can end in ``'\n'``, ``'\r'``, or ``'\r\n'``, and these are translated into ``'\n'`` - before being returned to the caller. If it is ``''``, universal newlines - mode is enabled, but line endings are returned to the caller untranslated. - If it has any of the other legal values, input lines are only terminated - by the given string, and the line ending is returned to the caller - untranslated. + before being returned to the caller. If *newline* is ``''``, universal + newlines mode is enabled, but line endings are returned to the caller + untranslated. If *newline* has any of the other legal values, input lines + are only terminated by the given string, and the line ending is returned to + the caller untranslated. * When writing output to the stream, if *newline* is ``None``, any ``'\n'`` characters written are translated to the system default line separator, @@ -925,8 +930,8 @@ Text I/O locale encoding using :func:`locale.setlocale`, use the current locale encoding instead of the user preferred encoding. - :class:`TextIOWrapper` provides these members in addition to those of - :class:`TextIOBase` and its parents: + :class:`TextIOWrapper` provides these data attributes and methods in + addition to those from :class:`TextIOBase` and :class:`IOBase`: .. attribute:: line_buffering @@ -961,22 +966,23 @@ Text I/O .. class:: StringIO(initial_value='', newline='\\n') - An in-memory stream for text I/O. The text buffer is discarded when the - :meth:`~IOBase.close` method is called. + A text stream using an in-memory text buffer. It inherits + :class:`TextIOBase`. + + The text buffer is discarded when the :meth:`~IOBase.close` method is + called. The initial value of the buffer can be set by providing *initial_value*. If newline translation is enabled, newlines will be encoded as if by :meth:`~TextIOBase.write`. The stream is positioned at the start of the buffer. - The *newline* argument works like that of :class:`TextIOWrapper`. - The default is to consider only ``\n`` characters as ends of lines and - to do no newline translation. If *newline* is set to ``None``, - newlines are written as ``\n`` on all platforms, but universal - newline decoding is still performed when reading. + The *newline* argument works like that of :class:`TextIOWrapper`, + except that when writing output to the stream, if *newline* is ``None``, + newlines are written as ``\n`` on all platforms. :class:`StringIO` provides this method in addition to those from - :class:`TextIOBase` and its parents: + :class:`TextIOBase` and :class:`IOBase`: .. method:: getvalue() @@ -1067,5 +1073,5 @@ buffered object. The above implicitly extends to text files, since the :func:`open()` function will wrap a buffered object inside a :class:`TextIOWrapper`. This includes -standard streams and therefore affects the built-in function :func:`print()` as +standard streams and therefore affects the built-in :func:`print()` function as well. diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst index 140401d2..5f5e6641 100644 --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -217,11 +217,20 @@ write code that handles both IP versions correctly. Address objects are :RFC:`4291` for details. For example, ``"0000:0000:0000:0000:0000:0abc:0007:0def"`` can be compressed to ``"::abc:7:def"``. + + Optionally, the string may also have a scope zone ID, expressed + with a suffix ``%scope_id``. If present, the scope ID must be non-empty, + and may not contain ``%``. + See :RFC:`4007` for details. + For example, ``fe80::1234%1`` might identify address ``fe80::1234`` on the first link of the node. 2. An integer that fits into 128 bits. 3. An integer packed into a :class:`bytes` object of length 16, big-endian. + >>> ipaddress.IPv6Address('2001:db8::1000') IPv6Address('2001:db8::1000') + >>> ipaddress.IPv6Address('ff02::5678%1') + IPv6Address('ff02::5678%1') .. attribute:: compressed @@ -268,6 +277,12 @@ write code that handles both IP versions correctly. Address objects are ``::FFFF/96``), this property will report the embedded IPv4 address. For any other address, this property will be ``None``. + .. attribute:: scope_id + + For scoped addresses as defined by :RFC:`4007`, this property identifies + the particular zone of the address's scope that the address belongs to, + as a string. When no scope zone is specified, this property will be ``None``. + .. attribute:: sixtofour For addresses that appear to be 6to4 addresses (starting with @@ -299,6 +314,8 @@ the :func:`str` and :func:`int` builtin functions:: >>> int(ipaddress.IPv6Address('::1')) 1 +Note that IPv6 scoped addresses are converted to integers without scope zone ID. + Operators ^^^^^^^^^ @@ -311,8 +328,9 @@ IPv6). Comparison operators """""""""""""""""""" -Address objects can be compared with the usual set of comparison operators. Some -examples:: +Address objects can be compared with the usual set of comparison operators. +Same IPv6 addresses with different scope zone IDs are not equal. +Some examples:: >>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1') True @@ -320,6 +338,10 @@ examples:: False >>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1') True + >>> IPv6Address('fe80::1234') == IPv6Address('fe80::1234%1') + False + >>> IPv6Address('fe80::1234%1') != IPv6Address('fe80::1234%2') + True Arithmetic operators @@ -487,7 +509,8 @@ dictionaries. hosts are all the IP addresses that belong to the network, except the network address itself and the network broadcast address. For networks with a mask length of 31, the network address and network broadcast - address are also included in the result. + address are also included in the result. Networks with a mask of 32 + will return a list containing the single host address. >>> list(ip_network('192.0.2.0/29').hosts()) #doctest: +NORMALIZE_WHITESPACE [IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'), @@ -495,6 +518,8 @@ dictionaries. IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')] >>> list(ip_network('192.0.2.0/31').hosts()) [IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')] + >>> list(ip_network('192.0.2.1/32').hosts()) + [IPv4Address('192.0.2.1')] .. method:: overlaps(other) @@ -656,6 +681,8 @@ dictionaries. hosts are all the IP addresses that belong to the network, except the Subnet-Router anycast address. For networks with a mask length of 127, the Subnet-Router anycast address is also included in the result. + Networks with a mask of 128 will return a list containing the + single host address. .. method:: overlaps(other) .. method:: address_exclude(network) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 134afbe6..107bc515 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -563,6 +563,9 @@ loops that truncate the stream. for prod in result: yield tuple(prod) + Before :func:`product` runs, it completely consumes the input iterables, + keeping pools of values in memory to generate the products. Accordingly, + it only useful with finite inputs. .. function:: repeat(object[, times]) diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 23e39e95..e1a246aa 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -283,19 +283,18 @@ Basic Usage instance containing a JSON document) to a Python object using this :ref:`conversion table `. - The other arguments have the same meaning as in :func:`load`, except - *encoding* which is ignored and deprecated since Python 3.1. + The other arguments have the same meaning as in :func:`load`. If the data being deserialized is not a valid JSON document, a :exc:`JSONDecodeError` will be raised. - .. deprecated-removed:: 3.1 3.9 - *encoding* keyword argument. - .. versionchanged:: 3.6 *s* can now be of type :class:`bytes` or :class:`bytearray`. The input encoding should be UTF-8, UTF-16 or UTF-32. + .. versionchanged:: 3.9 + The keyword argument *encoding* has been removed. + Encoders and Decoders --------------------- @@ -732,12 +731,24 @@ Command line options .. versionadded:: 3.5 +.. cmdoption:: --no-ensure-ascii + + Disable escaping of non-ascii characters, see :func:`json.dumps` for more information. + + .. versionadded:: 3.9 + .. cmdoption:: --json-lines Parse every input line as separate JSON object. .. versionadded:: 3.8 +.. cmdoption:: --indent, --tab, --no-indent, --compact + + Mutually exclusive options for whitespace control. + + .. versionadded:: 3.9 + .. cmdoption:: -h, --help Show the help message. diff --git a/Doc/library/keyword.rst b/Doc/library/keyword.rst index acec45cd..5cae79f5 100644 --- a/Doc/library/keyword.rst +++ b/Doc/library/keyword.rst @@ -22,3 +22,19 @@ This module allows a Python program to determine if a string is a Sequence containing all the :ref:`keywords ` defined for the interpreter. If any keywords are defined to only be active when particular :mod:`__future__` statements are in effect, these will be included as well. + + +.. function:: issoftkeyword(s) + + Return ``True`` if *s* is a Python soft :ref:`keyword `. + + .. versionadded:: 3.9 + + +.. data:: softkwlist + + Sequence containing all the soft :ref:`keywords ` defined for the + interpreter. If any soft keywords are defined to only be active when particular + :mod:`__future__` statements are in effect, these will be included as well. + + .. versionadded:: 3.9 diff --git a/Doc/library/logging.handlers.rst b/Doc/library/logging.handlers.rst index fa0424dc..059ab3d3 100644 --- a/Doc/library/logging.handlers.rst +++ b/Doc/library/logging.handlers.rst @@ -48,7 +48,7 @@ and :meth:`flush` methods). .. method:: emit(record) If a formatter is specified, it is used to format the record. The record - is then written to the stream with a terminator. If exception information + is then written to the stream followed by :attr:`terminator`. If exception information is present, it is formatted using :func:`traceback.print_exception` and appended to the stream. @@ -68,15 +68,19 @@ and :meth:`flush` methods). :return: the old stream, if the stream was changed, or *None* if it wasn't. - .. versionadded:: 3.7 + .. versionadded:: 3.7 + .. attribute:: terminator -.. versionchanged:: 3.2 - The ``StreamHandler`` class now has a ``terminator`` attribute, default - value ``'\n'``, which is used as the terminator when writing a formatted - record to a stream. If you don't want this newline termination, you can - set the handler instance's ``terminator`` attribute to the empty string. - In earlier versions, the terminator was hardcoded as ``'\n'``. + String used as the terminator when writing a formatted record to a stream. + Default value is ``'\n'``. + + If you don't want a newline termination, you can set the handler instance's + ``terminator`` attribute to the empty string. + + In earlier versions, the terminator was hardcoded as ``'\n'``. + + .. versionadded:: 3.2 .. _file-handler: @@ -89,23 +93,26 @@ sends logging output to a disk file. It inherits the output functionality from :class:`StreamHandler`. -.. class:: FileHandler(filename, mode='a', encoding=None, delay=False) +.. class:: FileHandler(filename, mode='a', encoding=None, delay=False, errors=None) Returns a new instance of the :class:`FileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, :const:`'a'` is used. If *encoding* is not ``None``, it is used to open the file with that encoding. If *delay* is true, then file opening is deferred until the - first call to :meth:`emit`. By default, the file grows indefinitely. + first call to :meth:`emit`. By default, the file grows indefinitely. If + *errors* is specified, it's used to determine how encoding errors are handled. .. versionchanged:: 3.6 As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: close() Closes the file. - .. method:: emit(record) Outputs the record to the file. @@ -168,18 +175,22 @@ exclusive locks - and so there is no need for such a handler. Furthermore, for this value. -.. class:: WatchedFileHandler(filename, mode='a', encoding=None, delay=False) +.. class:: WatchedFileHandler(filename, mode='a', encoding=None, delay=False, errors=None) Returns a new instance of the :class:`WatchedFileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, :const:`'a'` is used. If *encoding* is not ``None``, it is used to open the file with that encoding. If *delay* is true, then file opening is deferred until the - first call to :meth:`emit`. By default, the file grows indefinitely. + first call to :meth:`emit`. By default, the file grows indefinitely. If + *errors* is provided, it determines how encoding errors are handled. .. versionchanged:: 3.6 As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: reopenIfNeeded() Checks to see if the file has changed. If it has, the existing stream is @@ -205,7 +216,7 @@ module, is the base class for the rotating file handlers, not need to instantiate this class, but it has attributes and methods you may need to override. -.. class:: BaseRotatingHandler(filename, mode, encoding=None, delay=False) +.. class:: BaseRotatingHandler(filename, mode, encoding=None, delay=False, errors=None) The parameters are as for :class:`FileHandler`. The attributes are: @@ -284,13 +295,14 @@ The :class:`RotatingFileHandler` class, located in the :mod:`logging.handlers` module, supports rotation of disk log files. -.. class:: RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False) +.. class:: RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None) Returns a new instance of the :class:`RotatingFileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, ``'a'`` is used. If *encoding* is not ``None``, it is used to open the file with that encoding. If *delay* is true, then file opening is deferred until the - first call to :meth:`emit`. By default, the file grows indefinitely. + first call to :meth:`emit`. By default, the file grows indefinitely. If + *errors* is provided, it determines how encoding errors are handled. You can use the *maxBytes* and *backupCount* values to allow the file to :dfn:`rollover` at a predetermined size. When the size is about to be exceeded, @@ -311,6 +323,9 @@ module, supports rotation of disk log files. As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: doRollover() Does a rollover, as described above. @@ -331,7 +346,7 @@ The :class:`TimedRotatingFileHandler` class, located in the timed intervals. -.. class:: TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None) +.. class:: TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None) Returns a new instance of the :class:`TimedRotatingFileHandler` class. The specified file is opened and used as the stream for logging. On rotating it also @@ -391,6 +406,9 @@ timed intervals. rollover, and subsequent rollovers would be calculated via the normal interval calculation. + If *errors* is specified, it's used to determine how encoding errors are + handled. + .. note:: Calculation of the initial rollover time is done when the handler is initialised. Calculation of subsequent rollover times is done only when rollover occurs, and rollover occurs only when emitting output. If @@ -411,6 +429,9 @@ timed intervals. As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: doRollover() Does a rollover, as described above. diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 14e7190c..7267f812 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -529,7 +529,7 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on :ref:`logrecord-attributes`. -.. class:: Formatter(fmt=None, datefmt=None, style='%') +.. class:: Formatter(fmt=None, datefmt=None, style='%', validate=True) Returns a new instance of the :class:`Formatter` class. The instance is initialized with a format string for the message as a whole, as well as a @@ -539,8 +539,11 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on The *style* parameter can be one of '%', '{' or '$' and determines how the format string will be merged with its data: using one of %-formatting, - :meth:`str.format` or :class:`string.Template`. See :ref:`formatting-styles` - for more information on using {- and $-formatting for log messages. + :meth:`str.format` or :class:`string.Template`. This only applies to the + format string *fmt* (e.g. ``'%(message)s'`` or ``{message}``), not to the + actual log messages passed to ``Logger.debug`` etc; see + :ref:`formatting-styles` for more information on using {- and $-formatting + for log messages. .. versionchanged:: 3.2 The *style* parameter was added. @@ -605,6 +608,9 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on attributes are ``default_time_format`` (for the strptime format string) and ``default_msec_format`` (for appending the millisecond value). + .. versionchanged:: 3.9 + The ``default_msec_format`` can be ``None``. + .. method:: formatException(exc_info) Formats the specified exception information (a standard exception tuple as @@ -1197,6 +1203,21 @@ functions. | | carrying out the configuration as specified | | | by the other arguments. | +--------------+---------------------------------------------+ + | *encoding* | If this keyword argument is specified along | + | | with *filename*, its value is used when the | + | | FileHandler is created, and thus used when | + | | opening the output file. | + +--------------+---------------------------------------------+ + | *errors* | If this keyword argument is specified along | + | | with *filename*, its value is used when the | + | | FileHandler is created, and thus used when | + | | opening the output file. If not specified, | + | | the value 'backslashreplace' is used. Note | + | | that if ``None`` is specified, it will be | + | | passed as such to func:`open`, which means | + | | that it will be treated the same as passing | + | | 'errors'. | + +--------------+---------------------------------------------+ .. versionchanged:: 3.2 The *style* argument was added. @@ -1210,6 +1231,9 @@ functions. .. versionchanged:: 3.8 The *force* argument was added. + .. versionchanged:: 3.9 + The *encoding* and *errors* arguments were added. + .. function:: shutdown() Informs the logging system to perform an orderly shutdown by flushing and diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 776768dd..6ec1feee 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -71,6 +71,9 @@ Number-theoretic and representation functions Return *x* factorial as an integer. Raises :exc:`ValueError` if *x* is not integral or is negative. + .. deprecated:: 3.9 + Accepting floats with integral values (like ``5.0``) is deprecated. + .. function:: floor(x) @@ -123,15 +126,20 @@ Number-theoretic and representation functions `_\. -.. function:: gcd(a, b) +.. function:: gcd(*integers) - Return the greatest common divisor of the integers *a* and *b*. If either - *a* or *b* is nonzero, then the value of ``gcd(a, b)`` is the largest - positive integer that divides both *a* and *b*. ``gcd(0, 0)`` returns - ``0``. + Return the greatest common divisor of the specified integer arguments. + If any of the arguments is nonzero, then the returned value is the largest + positive integer that is a divisor af all arguments. If all arguments + are zero, then the returned value is ``0``. ``gcd()`` without arguments + returns ``0``. .. versionadded:: 3.5 + .. versionchanged:: 3.9 + Added support for an arbitrary number of arguments. Formerly, only two + arguments were supported. + .. function:: isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0) @@ -198,6 +206,17 @@ Number-theoretic and representation functions .. versionadded:: 3.8 +.. function:: lcm(*integers) + + Return the least common multiple of the specified integer arguments. + If all arguments are nonzero, then the returned value is the smallest + positive integer that is a multiple of all arguments. If any of the arguments + is zero, then the returned value is ``0``. ``lcm()`` without arguments + returns ``1``. + + .. versionadded:: 3.9 + + .. function:: ldexp(x, i) Return ``x * (2**i)``. This is essentially the inverse of function @@ -210,6 +229,23 @@ Number-theoretic and representation functions of *x* and are floats. +.. function:: nextafter(x, y) + + Return the next floating-point value after *x* towards *y*. + + If *x* is equal to *y*, return *y*. + + Examples: + + * ``math.nextafter(x, math.inf)`` goes up: towards positive infinity. + * ``math.nextafter(x, -math.inf)`` goes down: towards minus infinity. + * ``math.nextafter(x, 0.0)`` goes towards zero. + * ``math.nextafter(x, math.copysign(math.inf, x))`` goes away from zero. + + See also :func:`math.ulp`. + + .. versionadded:: 3.9 + .. function:: perm(n, k=None) Return the number of ways to choose *k* items from *n* items @@ -266,6 +302,30 @@ Number-theoretic and representation functions :class:`~numbers.Integral` (usually an integer). Delegates to :meth:`x.__trunc__() `. +.. function:: ulp(x) + + Return the value of the least significant bit of the float *x*: + + * If *x* is a NaN (not a number), return *x*. + * If *x* is negative, return ``ulp(-x)``. + * If *x* is a positive infinity, return *x*. + * If *x* is equal to zero, return the smallest positive + *denormalized* representable float (smaller than the minimum positive + *normalized* float, :data:`sys.float_info.min `). + * If *x* is equal to the largest positive representable float, + return the value of the least significant bit of *x*, such that the first + float smaller than *x* is ``x - ulp(x)``. + * Otherwise (*x* is a positive finite number), return the value of the least + significant bit of *x*, such that the first float bigger than *x* + is ``x + ulp(x)``. + + ULP stands for "Unit in the Last Place". + + See also :func:`math.nextafter` and :data:`sys.float_info.epsilon + `. + + .. versionadded:: 3.9 + Note that :func:`frexp` and :func:`modf` have a different call/return pattern than their C equivalents: they take a single argument and return a pair of @@ -363,17 +423,20 @@ Trigonometric functions .. function:: acos(x) - Return the arc cosine of *x*, in radians. + Return the arc cosine of *x*, in radians. The result is between ``0`` and + ``pi``. .. function:: asin(x) - Return the arc sine of *x*, in radians. + Return the arc sine of *x*, in radians. The result is between ``-pi/2`` and + ``pi/2``. .. function:: atan(x) - Return the arc tangent of *x*, in radians. + Return the arc tangent of *x*, in radians. The result is between ``-pi/2`` and + ``pi/2``. .. function:: atan2(y, x) diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst index 12b14d69..1f3fbc34 100644 --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -244,7 +244,8 @@ To map anonymous memory, -1 should be passed as the fileno along with the length .. method:: readline() Returns a single line, starting at the current file position and up to the - next newline. + next newline. The file position is updated to point after the bytes that were + returned. .. method:: resize(newsize) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index a0f814ed..c9992ee0 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -879,6 +879,16 @@ For an example of the usage of queues for interprocess communication see It is a simplified :class:`Queue` type, very close to a locked :class:`Pipe`. + .. method:: close() + + Close the queue: release internal resources. + + A queue must not be used anymore after it is closed. For example, + :meth:`get`, :meth:`put` and :meth:`empty` methods must no longer be + called. + + .. versionadded:: 3.9 + .. method:: empty() Return ``True`` if the queue is empty, ``False`` otherwise. diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index e8480b54..e7ec9047 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -93,6 +93,10 @@ The module itself defines the following classes: .. versionchanged:: 3.3 Support for the :keyword:`with` statement was added. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + .. class:: NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False, [timeout]) Return a new :class:`NNTP_SSL` object, representing an encrypted @@ -122,6 +126,10 @@ The module itself defines the following classes: :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see :data:`ssl.HAS_SNI`). + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + .. exception:: NNTPError Derived from the standard exception :exc:`Exception`, this is the base @@ -534,33 +542,6 @@ them have been superseded by newer commands in :rfc:`3977`. if available. -.. method:: NNTP.xpath(id) - - Return a pair ``(resp, path)``, where *path* is the directory path to the - article with message ID *id*. Most of the time, this extension is not - enabled by NNTP server administrators. - - .. deprecated:: 3.3 - The XPATH extension is not actively used. - - -.. XXX deprecated: - - .. method:: NNTP.xgtitle(name, *, file=None) - - Process an ``XGTITLE`` command, returning a pair ``(response, list)``, where - *list* is a list of tuples containing ``(name, title)``. If the *file* parameter - is supplied, then the output of the ``XGTITLE`` command is stored in a file. - If *file* is a string, then the method will open a file with that name, write - to it then close it. If *file* is a :term:`file object`, then it will start - calling :meth:`write` on it to store the lines of the command output. If *file* - is supplied, then the returned *list* is an empty list. This is an optional NNTP - extension, and may not be supported by all servers. - - :rfc:`2980` says "It is suggested that this extension be deprecated". Use - :meth:`descriptions` or :meth:`description` instead. - - Utility functions ----------------- diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index c1a18e01..b1094198 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -55,7 +55,7 @@ equivalent to the above example:: -q -foutfile -qfoutfile -Additionally, users can run one of :: +Additionally, users can run one of the following :: -h --help diff --git a/Doc/library/os.rst b/Doc/library/os.rst index c8e316a7..64bc7358 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -111,9 +111,9 @@ process and user. to the environment made after this time are not reflected in ``os.environ``, except for changes made by modifying ``os.environ`` directly. - If the platform supports the :func:`putenv` function, this mapping may be used - to modify the environment as well as query the environment. :func:`putenv` will - be called automatically when the mapping is modified. + This mapping may be used to modify the environment as well as query the + environment. :func:`putenv` will be called automatically when the mapping + is modified. On Unix, keys and values use :func:`sys.getfilesystemencoding` and ``'surrogateescape'`` error handler. Use :data:`environb` if you would like @@ -130,14 +130,13 @@ process and user. cause memory leaks. Refer to the system documentation for :c:func:`putenv`. - If :func:`putenv` is not provided, a modified copy of this mapping may be - passed to the appropriate process-creation functions to cause child processes - to use a modified environment. + You can delete items in this mapping to unset environment variables. + :func:`unsetenv` will be called automatically when an item is deleted from + ``os.environ``, and when one of the :meth:`pop` or :meth:`clear` methods is + called. - If the platform supports the :func:`unsetenv` function, you can delete items in - this mapping to unset environment variables. :func:`unsetenv` will be called - automatically when an item is deleted from ``os.environ``, and when - one of the :meth:`pop` or :meth:`clear` methods is called. + .. versionchanged:: 3.9 + Updated to support :pep:`584`'s merge (``|``) and update (``|=``) operators. .. data:: environb @@ -152,6 +151,9 @@ process and user. .. versionadded:: 3.2 + .. versionchanged:: 3.9 + Updated to support :pep:`584`'s merge (``|``) and update (``|=``) operators. + .. function:: chdir(path) fchdir(fd) @@ -439,20 +441,21 @@ process and user. changes to the environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - .. availability:: most flavors of Unix, Windows. + Assignments to items in ``os.environ`` are automatically translated into + corresponding calls to :func:`putenv`; however, calls to :func:`putenv` + don't update ``os.environ``, so it is actually preferable to assign to items + of ``os.environ``. .. note:: On some platforms, including FreeBSD and Mac OS X, setting ``environ`` may - cause memory leaks. Refer to the system documentation for putenv. - - When :func:`putenv` is supported, assignments to items in ``os.environ`` are - automatically translated into corresponding calls to :func:`putenv`; however, - calls to :func:`putenv` don't update ``os.environ``, so it is actually - preferable to assign to items of ``os.environ``. + cause memory leaks. Refer to the system documentation for :c:func:`putenv`. .. audit-event:: os.putenv key,value os.putenv + .. versionchanged:: 3.9 + The function is now always available. + .. function:: setegid(egid) @@ -640,14 +643,15 @@ process and user. environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - When :func:`unsetenv` is supported, deletion of items in ``os.environ`` is - automatically translated into a corresponding call to :func:`unsetenv`; however, - calls to :func:`unsetenv` don't update ``os.environ``, so it is actually - preferable to delete items of ``os.environ``. + Deletion of items in ``os.environ`` is automatically translated into a + corresponding call to :func:`unsetenv`; however, calls to :func:`unsetenv` + don't update ``os.environ``, so it is actually preferable to delete items of + ``os.environ``. .. audit-event:: os.unsetenv key os.unsetenv - .. availability:: most flavors of Unix. + .. versionchanged:: 3.9 + The function is now always available and is also available on Windows. .. _os-newstreams: @@ -1147,7 +1151,8 @@ or `the MSDN `_ on Windo Combine the functionality of :func:`os.readv` and :func:`os.pread`. .. availability:: Linux 2.6.30 and newer, FreeBSD 6.0 and newer, - OpenBSD 2.7 and newer. Using flags requires Linux 4.6 or newer. + OpenBSD 2.7 and newer, AIX 7.1 and newer. Using flags requires + Linux 4.6 or newer. .. versionadded:: 3.7 @@ -1215,7 +1220,8 @@ or `the MSDN `_ on Windo Combine the functionality of :func:`os.writev` and :func:`os.pwrite`. .. availability:: Linux 2.6.30 and newer, FreeBSD 6.0 and newer, - OpenBSD 2.7 and newer. Using flags requires Linux 4.7 or newer. + OpenBSD 2.7 and newer, AIX 7.1 and newer. Using flags requires + Linux 4.7 or newer. .. versionadded:: 3.7 @@ -1261,27 +1267,27 @@ or `the MSDN `_ on Windo :exc:`InterruptedError` exception (see :pep:`475` for the rationale). -.. function:: sendfile(out, in, offset, count) - sendfile(out, in, offset, count, [headers], [trailers], flags=0) +.. function:: sendfile(out_fd, in_fd, offset, count) + sendfile(out_fd, in_fd, offset, count, headers=(), trailers=(), flags=0) - Copy *count* bytes from file descriptor *in* to file descriptor *out* + Copy *count* bytes from file descriptor *in_fd* to file descriptor *out_fd* starting at *offset*. - Return the number of bytes sent. When EOF is reached return 0. + Return the number of bytes sent. When EOF is reached return ``0``. The first function notation is supported by all platforms that define :func:`sendfile`. On Linux, if *offset* is given as ``None``, the bytes are read from the - current position of *in* and the position of *in* is updated. + current position of *in_fd* and the position of *in_fd* is updated. The second case may be used on Mac OS X and FreeBSD where *headers* and *trailers* are arbitrary sequences of buffers that are written before and - after the data from *in* is written. It returns the same as the first case. + after the data from *in_fd* is written. It returns the same as the first case. - On Mac OS X and FreeBSD, a value of 0 for *count* specifies to send until - the end of *in* is reached. + On Mac OS X and FreeBSD, a value of ``0`` for *count* specifies to send until + the end of *in_fd* is reached. - All platforms support sockets as *out* file descriptor, and some platforms + All platforms support sockets as *out_fd* file descriptor, and some platforms allow other types (e.g. regular file, pipe) as well. Cross-platform applications should not use *headers*, *trailers* and *flags* @@ -1296,6 +1302,9 @@ or `the MSDN `_ on Windo .. versionadded:: 3.3 + .. versionchanged:: 3.9 + Parameters *out* and *in* was renamed to *out_fd* and *in_fd*. + .. function:: set_blocking(fd, blocking) @@ -3059,6 +3068,8 @@ features: for name in dirs: os.rmdir(os.path.join(root, name)) + .. audit-event:: os.walk top,topdown,onerror,followlinks os.walk + .. versionchanged:: 3.5 This function now calls :func:`os.scandir` instead of :func:`os.listdir`, making it faster by reducing the number of calls to :func:`os.stat`. @@ -3118,6 +3129,8 @@ features: for name in dirs: os.rmdir(name, dir_fd=rootfd) + .. audit-event:: os.fwalk top,topdown,onerror,follow_symlinks,dir_fd os.fwalk + .. availability:: Unix. .. versionadded:: 3.3 @@ -3621,6 +3634,19 @@ written in Python, such as a mail server's external command delivery program. .. availability:: Unix. +.. function:: pidfd_open(pid, flags=0) + + Return a file descriptor referring to the process *pid*. This descriptor can + be used to perform process management without races and signals. The *flags* + argument is provided for future extensions; no flag values are currently + defined. + + See the :manpage:`pidfd_open(2)` man page for more details. + + .. availability:: Linux 5.3+ + .. versionadded:: 3.9 + + .. function:: plock(op) Lock program segments into memory. The value of *op* (defined in @@ -3648,6 +3674,11 @@ written in Python, such as a mail server's external command delivery program. subprocess was killed.) On Windows systems, the return value contains the signed integer return code from the child process. + On Unix, :func:`waitstatus_to_exitcode` can be used to convert the ``close`` + method result (exit status) into an exit code if it is not ``None``. On + Windows, the ``close`` method result is directly the exit code + (or ``None``). + This is implemented using :class:`subprocess.Popen`; see that class's documentation for more powerful ways to manage and communicate with subprocesses. @@ -3951,6 +3982,10 @@ 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. + On Unix, :func:`waitstatus_to_exitcode` can be used to convert the result + (exit status) into an exit code. On Windows, the result is directly the exit + code. + .. audit-event:: os.system command os.system .. availability:: Unix, Windows. @@ -3991,12 +4026,21 @@ written in Python, such as a mail server's external command delivery program. number is zero); the high bit of the low byte is set if a core file was produced. + :func:`waitstatus_to_exitcode` can be used to convert the exit status into an + exit code. + .. availability:: Unix. + .. seealso:: + + :func:`waitpid` can be used to wait for the completion of a specific + child process and has more options. + .. function:: waitid(idtype, id, options) Wait for the completion of one or more child processes. - *idtype* can be :data:`P_PID`, :data:`P_PGID` or :data:`P_ALL`. + *idtype* can be :data:`P_PID`, :data:`P_PGID`, :data:`P_ALL`, or + :data:`P_PIDFD` on Linux. *id* specifies the pid to wait on. *options* is constructed from the ORing of one or more of :data:`WEXITED`, :data:`WSTOPPED` or :data:`WCONTINUED` and additionally may be ORed with @@ -4021,6 +4065,15 @@ written in Python, such as a mail server's external command delivery program. .. versionadded:: 3.3 +.. data:: P_PIDFD + + This is a Linux-specific *idtype* that indicates that *id* is a file + descriptor that refers to a process. + + .. availability:: Linux 5.4+ + + .. versionadded:: 3.9 + .. data:: WEXITED WSTOPPED WNOWAIT @@ -4034,8 +4087,10 @@ written in Python, such as a mail server's external command delivery program. .. data:: CLD_EXITED + CLD_KILLED CLD_DUMPED CLD_TRAPPED + CLD_STOPPED CLD_CONTINUED These are the possible values for :attr:`si_code` in the result returned by @@ -4045,6 +4100,9 @@ written in Python, such as a mail server's external command delivery program. .. versionadded:: 3.3 + .. versionchanged:: 3.9 + Added :data:`CLD_KILLED` and :data:`CLD_STOPPED` values. + .. function:: waitpid(pid, options) @@ -4073,6 +4131,9 @@ written in Python, such as a mail server's external command delivery program. id is known, not necessarily a child process. The :func:`spawn\* ` functions called with :const:`P_NOWAIT` return suitable process handles. + :func:`waitstatus_to_exitcode` can be used to convert the exit status into an + exit code. + .. versionchanged:: 3.5 If the system call is interrupted and the signal handler does not raise an exception, the function now retries the system call instead of raising an @@ -4088,6 +4149,9 @@ written in Python, such as a mail server's external command delivery program. information. The option argument is the same as that provided to :func:`waitpid` and :func:`wait4`. + :func:`waitstatus_to_exitcode` can be used to convert the exit status into an + exitcode. + .. availability:: Unix. @@ -4099,9 +4163,42 @@ written in Python, such as a mail server's external command delivery program. resource usage information. The arguments to :func:`wait4` are the same as those provided to :func:`waitpid`. + :func:`waitstatus_to_exitcode` can be used to convert the exit status into an + exitcode. + .. availability:: Unix. +.. function:: waitstatus_to_exitcode(status) + + Convert a wait status to an exit code. + + On Unix: + + * If the process exited normally (if ``WIFEXITED(status)`` is true), + return the process exit status (return ``WEXITSTATUS(status)``): + result greater than or equal to 0. + * If the process was terminated by a signal (if ``WIFSIGNALED(status)`` is + true), return ``-signum`` where *signum* is the number of the signal that + caused the process to terminate (return ``-WTERMSIG(status)``): + result less than 0. + * Otherwise, raise a :exc:`ValueError`. + + On Windows, return *status* shifted right by 8 bits. + + On Unix, if the process is being traced or if :func:`waitpid` was called + with :data:`WUNTRACED` option, the caller must first check if + ``WIFSTOPPED(status)`` is true. This function must not be called if + ``WIFSTOPPED(status)`` is true. + + .. seealso:: + + :func:`WIFEXITED`, :func:`WEXITSTATUS`, :func:`WIFSIGNALED`, + :func:`WTERMSIG`, :func:`WIFSTOPPED`, :func:`WSTOPSIG` functions. + + .. versionadded:: 3.9 + + .. data:: WNOHANG The option for :func:`waitpid` to return immediately if no child process status diff --git a/Doc/library/parser.rst b/Doc/library/parser.rst index 7b380c36..79fc10d0 100644 --- a/Doc/library/parser.rst +++ b/Doc/library/parser.rst @@ -25,11 +25,11 @@ from this. This is better than trying to parse and modify an arbitrary Python code fragment as a string because parsing is performed in a manner identical to the code forming the application. It is also faster. -.. note:: +.. warning:: - From Python 2.5 onward, it's much more convenient to cut in at the Abstract - Syntax Tree (AST) generation and compilation stage, using the :mod:`ast` - module. + The parser module is deprecated and will be removed in future versions of + Python. For the majority of use cases you can leverage the Abstract Syntax + Tree (AST) generation and compilation stage, using the :mod:`ast` module. There are a few things to note about this module which are important to making use of the data structures created. This is not a tutorial on editing the parse diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index c855a6e1..9526a03b 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -273,7 +273,7 @@ Methods and properties .. testsetup:: - from pathlib import PurePosixPath, PureWindowsPath + from pathlib import PurePath, PurePosixPath, PureWindowsPath Pure paths provide the following methods and properties: @@ -462,6 +462,19 @@ Pure paths provide the following methods and properties: True +.. method:: PurePath.is_relative_to(*other) + + Return whether or not this path is relative to the *other* path. + + >>> p = PurePath('/etc/passwd') + >>> p.is_relative_to('/etc') + True + >>> p.is_relative_to('/usr') + False + + .. versionadded:: 3.9 + + .. method:: PurePath.is_reserved() With :class:`PureWindowsPath`, return ``True`` if the path is considered @@ -538,7 +551,9 @@ Pure paths provide the following methods and properties: File "", line 1, in File "pathlib.py", line 694, in relative_to .format(str(self), str(formatted))) - ValueError: '/etc/passwd' does not start with '/usr' + ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other absolute. + + NOTE: This function is part of :class:`PurePath` and works with strings. It does not check or access the underlying file structure. .. method:: PurePath.with_name(name) @@ -558,6 +573,30 @@ Pure paths provide the following methods and properties: ValueError: PureWindowsPath('c:/') has an empty name +.. method:: PurePath.with_stem(stem) + + Return a new path with the :attr:`stem` changed. If the original path + doesn't have a name, ValueError is raised:: + + >>> p = PureWindowsPath('c:/Downloads/draft.txt') + >>> p.with_stem('final') + PureWindowsPath('c:/Downloads/final.txt') + >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') + >>> p.with_stem('lib') + PureWindowsPath('c:/Downloads/lib.gz') + >>> p = PureWindowsPath('c:/') + >>> p.with_stem('') + Traceback (most recent call last): + File "", line 1, in + File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem + return self.with_name(stem + self.suffix) + File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name + raise ValueError("%r has an empty name" % (self,)) + ValueError: PureWindowsPath('c:/') has an empty name + + .. versionadded:: 3.9 + + .. method:: PurePath.with_suffix(suffix) Return a new path with the :attr:`suffix` changed. If the original path @@ -752,6 +791,8 @@ call fails (for example because the path doesn't exist). Using the "``**``" pattern in large directory trees may consume an inordinate amount of time. + .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob + .. method:: Path.group() @@ -938,6 +979,19 @@ call fails (for example because the path doesn't exist). .. versionadded:: 3.5 +.. method:: Path.readlink() + + Return the path to which the symbolic link points (as returned by + :func:`os.readlink`):: + + >>> p = Path('mylink') + >>> p.symlink_to('setup.py') + >>> p.readlink() + PosixPath('setup.py') + + .. versionadded:: 3.9 + + .. method:: Path.rename(target) Rename this file or directory to the given *target*, and return a new Path @@ -954,6 +1008,10 @@ call fails (for example because the path doesn't exist). >>> target.open().read() 'some text' + The target path may be absolute or relative. Relative paths are interpreted + relative to the current working directory, *not* the directory of the Path + object. + .. versionchanged:: 3.8 Added return value, return the new Path instance. @@ -964,6 +1022,10 @@ call fails (for example because the path doesn't exist). instance pointing to *target*. If *target* points to an existing file or directory, it will be unconditionally replaced. + The target path may be absolute or relative. Relative paths are interpreted + relative to the current working directory, *not* the directory of the Path + object. + .. versionchanged:: 3.8 Added return value, return the new Path instance. @@ -1006,6 +1068,8 @@ call fails (for example because the path doesn't exist). PosixPath('setup.py'), PosixPath('test_pathlib.py')] + .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob + .. method:: Path.rmdir() @@ -1136,6 +1200,7 @@ os and os.path pathlib :func:`os.path.abspath` :meth:`Path.resolve` :func:`os.chmod` :meth:`Path.chmod` :func:`os.mkdir` :meth:`Path.mkdir` +:func:`os.makedirs` :meth:`Path.mkdir` :func:`os.rename` :meth:`Path.rename` :func:`os.replace` :meth:`Path.replace` :func:`os.rmdir` :meth:`Path.rmdir` @@ -1150,6 +1215,7 @@ os and os.path pathlib :func:`os.path.islink` :meth:`Path.is_symlink` :func:`os.link` :meth:`Path.link_to` :func:`os.symlink` :meth:`Path.symlink_to` +:func:`os.readlink` :meth:`Path.readlink` :func:`os.stat` :meth:`Path.stat`, :meth:`Path.owner`, :meth:`Path.group` diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index ca0a507a..ed1e9712 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -296,20 +296,20 @@ by the local file. Temporary breakpoint, which is removed automatically when it is first hit. The arguments are the same as for :pdbcmd:`break`. -.. pdbcommand:: cl(ear) [filename:lineno | bpnumber [bpnumber ...]] +.. pdbcommand:: cl(ear) [filename:lineno | bpnumber ...] With a *filename:lineno* argument, clear all the breakpoints at this line. With a space separated list of breakpoint numbers, clear those breakpoints. Without argument, clear all breaks (but first ask confirmation). -.. pdbcommand:: disable [bpnumber [bpnumber ...]] +.. pdbcommand:: disable [bpnumber ...] Disable the breakpoints given as a space separated list of breakpoint numbers. Disabling a breakpoint means it cannot cause the program to stop execution, but unlike clearing a breakpoint, it remains in the list of breakpoints and can be (re-)enabled. -.. pdbcommand:: enable [bpnumber [bpnumber ...]] +.. pdbcommand:: enable [bpnumber ...] Enable the breakpoints specified. diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index d92e947a..b7c34527 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -252,7 +252,7 @@ process more convenient: .. versionchanged:: 3.8 The *buffers* argument was added. -.. function:: loads(data, \*, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) +.. function:: loads(data, /, \*, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) Return the reconstituted object hierarchy of the pickled representation *data* of an object. *data* must be a :term:`bytes-like object`. diff --git a/Doc/library/pkgutil.rst b/Doc/library/pkgutil.rst index 9a24e7a7..3b17b9a6 100644 --- a/Doc/library/pkgutil.rst +++ b/Doc/library/pkgutil.rst @@ -227,3 +227,44 @@ support. then ``None`` is returned. In particular, the :term:`loader` for :term:`namespace packages ` does not support :meth:`get_data `. + + +.. function:: resolve_name(name) + + Resolve a name to an object. + + This functionality is used in numerous places in the standard library (see + :issue:`12915`) - and equivalent functionality is also in widely used + third-party packages such as setuptools, Django and Pyramid. + + It is expected that *name* will be a string in one of the following + formats, where W is shorthand for a valid Python identifier and dot stands + for a literal period in these pseudo-regexes: + + * ``W(.W)*`` + * ``W(.W)*:(W(.W)*)?`` + + The first form is intended for backward compatibility only. It assumes that + some part of the dotted name is a package, and the rest is an object + somewhere within that package, possibly nested inside other objects. + Because the place where the package stops and the object hierarchy starts + can't be inferred by inspection, repeated attempts to import must be done + with this form. + + In the second form, the caller makes the division point clear through the + provision of a single colon: the dotted name to the left of the colon is a + package to be imported, and the dotted name to the right is the object + hierarchy within that package. Only one import is needed in this form. If + it ends with the colon, then a module object is returned. + + The function will return an object (which might be a module), or raise one + of the following exceptions: + + :exc:`ValueError` -- if *name* isn't in a recognised format. + + :exc:`ImportError` -- if an import failed when it shouldn't have. + + :exc:`AttributeError` -- If a failure occurred when traversing the object + hierarchy within the imported package to get to the desired object. + + .. versionadded:: 3.9 diff --git a/Doc/library/plistlib.rst b/Doc/library/plistlib.rst index 9dfe3c8a..6def72b3 100644 --- a/Doc/library/plistlib.rst +++ b/Doc/library/plistlib.rst @@ -1,8 +1,8 @@ -:mod:`plistlib` --- Generate and parse Mac OS X ``.plist`` files -================================================================ +:mod:`plistlib` --- Generate and parse Apple ``.plist`` files +============================================================= .. module:: plistlib - :synopsis: Generate and parse Mac OS X plist files. + :synopsis: Generate and parse Apple plist files. .. moduleauthor:: Jack Jansen .. sectionauthor:: Georg Brandl @@ -17,7 +17,8 @@ -------------- This module provides an interface for reading and writing the "property list" -files used mainly by Mac OS X and supports both binary and XML plist files. +files used by Apple, primarily on macOS and iOS. This module supports both binary +and XML plist files. The property list (``.plist``) file format is a simple serialization supporting basic object types, like dictionaries, lists, numbers and strings. Usually the @@ -30,7 +31,7 @@ To work with plist data in bytes objects, use :func:`dumps` and :func:`loads`. Values can be strings, integers, floats, booleans, tuples, lists, dictionaries -(but only with string keys), :class:`Data`, :class:`bytes`, :class:`bytesarray` +(but only with string keys), :class:`bytes`, :class:`bytearray` or :class:`datetime.datetime` objects. .. versionchanged:: 3.4 @@ -40,6 +41,9 @@ or :class:`datetime.datetime` objects. Support added for reading and writing :class:`UID` tokens in binary plists as used by NSKeyedArchiver and NSKeyedUnarchiver. +.. versionchanged:: 3.9 + Old API removed. + .. seealso:: `PList manual page `_ @@ -48,7 +52,7 @@ or :class:`datetime.datetime` objects. This module defines the following functions: -.. function:: load(fp, \*, fmt=None, use_builtin_types=True, dict_type=dict) +.. function:: load(fp, \*, fmt=None, dict_type=dict) Read a plist file. *fp* should be a readable and binary file object. Return the unpacked root object (which usually is a @@ -62,10 +66,6 @@ This module defines the following functions: * :data:`FMT_BINARY`: Binary plist format - If *use_builtin_types* is true (the default) binary data will be returned - as instances of :class:`bytes`, otherwise it is returned as instances of - :class:`Data`. - The *dict_type* is the type used for dictionaries that are read from the plist file. @@ -80,7 +80,7 @@ This module defines the following functions: .. versionadded:: 3.4 -.. function:: loads(data, \*, fmt=None, use_builtin_types=True, dict_type=dict) +.. function:: loads(data, \*, fmt=None, dict_type=dict) Load a plist from a bytes object. See :func:`load` for an explanation of the keyword arguments. @@ -124,65 +124,9 @@ This module defines the following functions: .. versionadded:: 3.4 -The following functions are deprecated: - -.. function:: readPlist(pathOrFile) - - Read a plist file. *pathOrFile* may be either a file name or a (readable - and binary) file object. Returns the unpacked root object (which usually - is a dictionary). - - This function calls :func:`load` to do the actual work, see the documentation - of :func:`that function ` for an explanation of the keyword arguments. - - .. deprecated:: 3.4 Use :func:`load` instead. - - .. versionchanged:: 3.7 - Dict values in the result are now normal dicts. You no longer can use - attribute access to access items of these dictionaries. - - -.. function:: writePlist(rootObject, pathOrFile) - - Write *rootObject* to an XML plist file. *pathOrFile* may be either a file name - or a (writable and binary) file object - - .. deprecated:: 3.4 Use :func:`dump` instead. - - -.. function:: readPlistFromBytes(data) - - Read a plist data from a bytes object. Return the root object. - - See :func:`load` for a description of the keyword arguments. - - .. deprecated:: 3.4 Use :func:`loads` instead. - - .. versionchanged:: 3.7 - Dict values in the result are now normal dicts. You no longer can use - attribute access to access items of these dictionaries. - - -.. function:: writePlistToBytes(rootObject) - - Return *rootObject* as an XML plist-formatted bytes object. - - .. deprecated:: 3.4 Use :func:`dumps` instead. - The following classes are available: -.. class:: Data(data) - - Return a "data" wrapper object around the bytes object *data*. This is used - in functions converting from/to plists to represent the ```` type - available in plists. - - It has one attribute, :attr:`data`, that can be used to retrieve the Python - bytes object stored in it. - - .. deprecated:: 3.4 Use a :class:`bytes` object instead. - .. class:: UID(data) Wraps an :class:`int`. This is used when reading or writing NSKeyedArchiver diff --git a/Doc/library/poplib.rst b/Doc/library/poplib.rst index 28b42fa6..2f349b35 100644 --- a/Doc/library/poplib.rst +++ b/Doc/library/poplib.rst @@ -47,6 +47,9 @@ The :mod:`poplib` module provides two classes: ``poplib.putline`` with arguments ``self`` and ``line``, where ``line`` is the bytes about to be sent to the remote host. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. .. class:: POP3_SSL(host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None, context=None) @@ -85,6 +88,10 @@ The :mod:`poplib` module provides two classes: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + One exception is defined as an attribute of the :mod:`poplib` module: @@ -268,4 +275,3 @@ retrieves and prints all messages:: At the end of the module, there is a test section that contains a more extensive example of usage. - diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst index b8b7f421..16256c54 100644 --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -25,6 +25,9 @@ width constraint. Dictionaries are sorted by key before the display is computed. +.. versionchanged:: 3.9 + Added support for pretty-printing :class:`types.SimpleNamespace`. + The :mod:`pprint` module defines one class: .. First the implementation class: diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index d8039fd2..34525a96 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -309,7 +309,7 @@ functions: Profile the cmd via :func:`exec` with the specified global and local environment. - .. method:: runcall(func, *args, **kwargs) + .. method:: runcall(func, /, *args, **kwargs) Profile ``func(*args, **kwargs)`` @@ -525,6 +525,17 @@ Analysis of the profiler data is done using the :class:`~pstats.Stats` class. ordering are identical to the :meth:`~pstats.Stats.print_callers` method. + .. method:: get_stats_profile() + + This method returns an instance of StatsProfile, which contains a mapping + of function names to instances of FunctionProfile. Each FunctionProfile + instance holds information related to the function's profile such as how + long the function took to run, how many times it was called, etc... + + .. versionadded:: 3.9 + Added the following dataclasses: StatsProfile, FunctionProfile. + Added the following function: get_stats_profile. + .. _deterministic-profiling: What Is Deterministic Profiling? diff --git a/Doc/library/pty.rst b/Doc/library/pty.rst index e85d2e23..73d4f102 100644 --- a/Doc/library/pty.rst +++ b/Doc/library/pty.rst @@ -69,6 +69,11 @@ The :mod:`pty` module defines the following functions: *select* throws an error on your platform when passed three empty lists. This is a bug, documented in `issue 26228 `_. + Return the exit status value from :func:`os.waitpid` on the child process. + + :func:`waitstatus_to_exitcode` can be used to convert the exit status into + an exit code. + .. audit-event:: pty.spawn argv pty.spawn .. versionchanged:: 3.4 diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 2149e800..90366f49 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -86,6 +86,11 @@ Bookkeeping functions .. versionchanged:: 3.2 Moved to the version 2 scheme which uses all of the bits in a string seed. + .. deprecated:: 3.9 + In the future, the *seed* must be one of the following types: + *NoneType*, :class:`int`, :class:`float`, :class:`str`, + :class:`bytes`, or :class:`bytearray`. + .. function:: getstate() Return an object capturing the current internal state of the generator. This @@ -99,12 +104,17 @@ Bookkeeping functions the time :func:`getstate` was called. -.. function:: getrandbits(k) +Functions for bytes +------------------- - Returns a Python integer with *k* random bits. This method is supplied with - the Mersenne Twister generator and some other generators may also provide it - as an optional part of the API. When available, :meth:`getrandbits` enables - :meth:`randrange` to handle arbitrarily large ranges. +.. function:: randbytes(n) + + Generate *n* random bytes. + + This method should not be used for generating security tokens. + Use :func:`secrets.token_bytes` instead. + + .. versionadded:: 3.9 Functions for integers @@ -130,6 +140,16 @@ Functions for integers Return a random integer *N* such that ``a <= N <= b``. Alias for ``randrange(a, b+1)``. +.. function:: getrandbits(k) + + Returns a Python integer with *k* random bits. This method is supplied with + the MersenneTwister generator and some other generators may also provide it + as an optional part of the API. When available, :meth:`getrandbits` enables + :meth:`randrange` to handle arbitrarily large ranges. + + .. versionchanged:: 3.9 + This method now accepts zero for *k*. + Functions for sequences ----------------------- @@ -160,8 +180,9 @@ Functions for sequences The *weights* or *cum_weights* can use any numeric type that interoperates with the :class:`float` values returned by :func:`random` (that includes - integers, floats, and fractions but excludes decimals). Weights are - assumed to be non-negative. + integers, floats, and fractions but excludes decimals). Behavior is + undefined if any weight is negative. A :exc:`ValueError` is raised if all + weights are zero. For a given seed, the :func:`choices` function with equal weighting typically produces a different sequence than repeated calls to @@ -172,6 +193,9 @@ Functions for sequences .. versionadded:: 3.6 + .. versionchanged:: 3.9 + Raises a :exc:`ValueError` if all weights are zero. + .. function:: shuffle(x[, random]) @@ -189,8 +213,11 @@ Functions for sequences generated. For example, a sequence of length 2080 is the largest that can fit within the period of the Mersenne Twister random number generator. + .. deprecated-removed:: 3.9 3.11 + The optional parameter *random*. + -.. function:: sample(population, k) +.. function:: sample(population, k, *, counts=None) Return a *k* length list of unique elements chosen from the population sequence or set. Used for random sampling without replacement. @@ -204,6 +231,11 @@ Functions for sequences Members of the population need not be :term:`hashable` or unique. If the population contains repeats, then each occurrence is a possible selection in the sample. + Repeated elements can be specified one at a time or with the optional + keyword-only *counts* parameter. For example, ``sample(['red', 'blue'], + counts=[4, 2], k=5)`` is equivalent to ``sample(['red', 'red', 'red', 'red', + 'blue', 'blue'], k=5)``. + To choose a sample from a range of integers, use a :func:`range` object as an argument. This is especially fast and space efficient for sampling from a large population: ``sample(range(10000000), k=60)``. @@ -211,6 +243,16 @@ Functions for sequences If the sample size is larger than the population size, a :exc:`ValueError` is raised. + .. versionchanged:: 3.9 + Added the *counts* parameter. + + .. deprecated:: 3.9 + In the future, the *population* must be a sequence. Instances of + :class:`set` are no longer supported. The set must first be converted + to a :class:`list` or :class:`tuple`, preferably in a deterministic + order so that the sample is reproducible. + + Real-valued distributions ------------------------- @@ -316,6 +358,11 @@ Alternative Generator Class that implements the default pseudo-random number generator used by the :mod:`random` module. + .. deprecated:: 3.9 + In the future, the *seed* must be one of the following types: + :class:`NoneType`, :class:`int`, :class:`float`, :class:`str`, + :class:`bytes`, or :class:`bytearray`. + .. class:: SystemRandom([seed]) Class that uses the :func:`os.urandom` function for generating random numbers @@ -329,8 +376,8 @@ Alternative Generator Notes on Reproducibility ------------------------ -Sometimes it is useful to be able to reproduce the sequences given by a pseudo -random number generator. By re-using a seed value, the same sequence should be +Sometimes it is useful to be able to reproduce the sequences given by a +pseudo-random number generator. By re-using a seed value, the same sequence should be reproducible from run to run as long as multiple threads are not running. Most of the random module's algorithms and seeding functions are subject to @@ -381,12 +428,11 @@ Simulations:: >>> choices(['red', 'black', 'green'], [18, 18, 2], k=6) ['red', 'green', 'black', 'black', 'red', 'black'] - >>> # Deal 20 cards without replacement from a deck of 52 playing cards - >>> # and determine the proportion of cards with a ten-value - >>> # (a ten, jack, queen, or king). - >>> deck = collections.Counter(tens=16, low_cards=36) - >>> seen = sample(list(deck.elements()), k=20) - >>> seen.count('tens') / 20 + >>> # Deal 20 cards without replacement from a deck + >>> # of 52 playing cards, and determine the proportion of cards + >>> # with a ten-value: ten, jack, queen, or king. + >>> dealt = sample(['tens', 'low cards'], counts=[16, 36], k=20) + >>> dealt.count('tens') / 20 0.15 >>> # Estimate the probability of getting 5 or more heads from 7 spins diff --git a/Doc/library/secrets.rst b/Doc/library/secrets.rst index bc4766da..afa8e2d3 100644 --- a/Doc/library/secrets.rst +++ b/Doc/library/secrets.rst @@ -21,7 +21,7 @@ The :mod:`secrets` module is used for generating cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets. -In particularly, :mod:`secrets` should be used in preference to the +In particular, :mod:`secrets` should be used in preference to the default pseudo-random number generator in the :mod:`random` module, which is designed for modelling and simulation, not security or cryptography. diff --git a/Doc/library/select.rst b/Doc/library/select.rst index 39622aad..a354187c 100644 --- a/Doc/library/select.rst +++ b/Doc/library/select.rst @@ -355,6 +355,9 @@ Edge and Level Trigger Polling (epoll) Objects Remove a registered file descriptor from the epoll object. + .. versionchanged:: 3.9 + The method no longer ignores the :data:`~errno.EBADF` error. + .. method:: epoll.poll(timeout=None, maxevents=-1) diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst index adc23da6..7f7f0c7f 100644 --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -36,6 +36,9 @@ The :mod:`shlex` module defines the following functions: instance, passing ``None`` for *s* will read the string to split from standard input. + .. deprecated:: 3.9 + Passing ``None`` for *s* will raise an exception in future Python + versions. .. function:: join(split_command) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 25b749e5..1b094aeb 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -371,6 +371,9 @@ Directory and files operations copy the file more efficiently. See :ref:`shutil-platform-dependent-efficient-copy-operations` section. + .. versionchanged:: 3.9 + Accepts a :term:`path-like object` for both *src* and *dst*. + .. function:: disk_usage(path) Return disk usage statistics about the given path as a :term:`named tuple` diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 5488f4a1..05b285ed 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -53,12 +53,12 @@ This has consequences: Signals and threads ^^^^^^^^^^^^^^^^^^^ -Python signal handlers are always executed in the main Python thread, +Python signal handlers are always executed in the main Python thread of the main interpreter, even if the signal was received in another thread. This means that signals can't be used as a means of inter-thread communication. You can use the synchronization primitives from the :mod:`threading` module instead. -Besides, only the main thread is allowed to set a new signal handler. +Besides, only the main thread of the main interpreter is allowed to set a new signal handler. Module contents @@ -351,13 +351,26 @@ The :mod:`signal` module defines the following functions: .. versionadded:: 3.8 +.. function:: pidfd_send_signal(pidfd, sig, siginfo=None, flags=0) + + Send signal *sig* to the process referred to by file descriptor *pidfd*. + Python does not currently support the *siginfo* parameter; it must be + ``None``. The *flags* argument is provided for future extensions; no flag + values are currently defined. + + See the :manpage:`pidfd_send_signal(2)` man page for more information. + + .. availability:: Linux 5.1+ + .. versionadded:: 3.9 + + .. function:: pthread_kill(thread_id, signalnum) Send the signal *signalnum* to the thread *thread_id*, another thread in the same process as the caller. The target thread can be executing any code (Python or not). However, if the target thread is executing the Python interpreter, the Python signal handlers will be :ref:`executed by the main - thread `. Therefore, the only point of sending a + thread of the main interpreter `. Therefore, the only point of sending a signal to a particular Python thread would be to force a running system call to fail with :exc:`InterruptedError`. @@ -453,7 +466,8 @@ The :mod:`signal` module defines the following functions: If not -1, *fd* must be non-blocking. It is up to the library to remove any bytes from *fd* before calling poll or select again. - When threads are enabled, this function can only be called from the main thread; + When threads are enabled, this function can only be called + from :ref:`the main thread of the main interpreter `; attempting to call it from other threads will cause a :exc:`ValueError` exception to be raised. @@ -506,7 +520,8 @@ The :mod:`signal` module defines the following functions: signal handler will be returned (see the description of :func:`getsignal` above). (See the Unix man page :manpage:`signal(2)` for further information.) - When threads are enabled, this function can only be called from the main thread; + When threads are enabled, this function can only be called + from :ref:`the main thread of the main interpreter `; attempting to call it from other threads will cause a :exc:`ValueError` exception to be raised. diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst index 85ee8a75..d84e74a8 100644 --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -148,6 +148,12 @@ MailmanProxy Objects .. class:: MailmanProxy(localaddr, remoteaddr) + .. deprecated-removed:: 3.9 3.11 + + :class:`MailmanProxy` is deprecated, it depends on a ``Mailman`` + module which no longer exists and therefore is already broken. + + Create a new pure proxy server. Arguments are as per :class:`SMTPServer`. Everything will be relayed to *remoteaddr*, unless local mailman configurations knows about an address, in which case it will be handled via mailman. Note that diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index 6176c35a..a88e358e 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -70,6 +70,9 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). .. versionadded:: 3.5 The SMTPUTF8 extension (:rfc:`6531`) is now supported. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket .. class:: SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, \ certfile=None [, timeout], context=None, \ @@ -108,8 +111,12 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket -.. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None) +.. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None, + source_address=None[, timeout]) The LMTP protocol, which is very similar to ESMTP, is heavily based on the standard SMTP client. It's common to use Unix sockets for LMTP, so our @@ -122,6 +129,9 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). Unix socket, LMTP generally don't support or require any authentication, but your mileage might vary. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. + A nice selection of exceptions is defined as well: diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst old mode 100644 new mode 100755 index 9ab050e8..5bcac20a --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -78,15 +78,15 @@ created. Socket addresses are represented as follows: Python programs. - For :const:`AF_INET6` address family, a four-tuple ``(host, port, flowinfo, - scopeid)`` is used, where *flowinfo* and *scopeid* represent the ``sin6_flowinfo`` + scope_id)`` is used, where *flowinfo* and *scope_id* represent the ``sin6_flowinfo`` and ``sin6_scope_id`` members in :const:`struct sockaddr_in6` in C. For - :mod:`socket` module methods, *flowinfo* and *scopeid* can be omitted just for - backward compatibility. Note, however, omission of *scopeid* can cause problems + :mod:`socket` module methods, *flowinfo* and *scope_id* can be omitted just for + backward compatibility. Note, however, omission of *scope_id* can cause problems in manipulating scoped IPv6 addresses. .. versionchanged:: 3.7 - For multicast addresses (with *scopeid* meaningful) *address* may not contain - ``%scope`` (or ``zone id``) part. This information is superfluous and may + For multicast addresses (with *scope_id* meaningful) *address* may not contain + ``%scope_id`` (or ``zone id``) part. This information is superfluous and may be safely omitted (recommended). - :const:`AF_NETLINK` sockets are represented as pairs ``(pid, groups)``. @@ -118,6 +118,10 @@ created. Socket addresses are represented as follows: - :const:`CAN_ISOTP` protocol require a tuple ``(interface, rx_addr, tx_addr)`` where both additional parameters are unsigned long integer that represent a CAN identifier (standard or extended). + - :const:`CAN_J1939` protocol require a tuple ``(interface, name, pgn, addr)`` + where additional parameters are 64-bit unsigned integer representing the + ECU name, a 32-bit unsigned integer representing the Parameter Group Number + (PGN), and an 8-bit integer representing the address. - A string or a tuple ``(id, unit)`` is used for the :const:`SYSPROTO_CONTROL` protocol of the :const:`PF_SYSTEM` family. The string is the name of a @@ -200,6 +204,23 @@ created. Socket addresses are represented as follows: .. versionadded:: 3.8 +- :const:`IPPROTO_UDPLITE` is a variant of UDP which allows you to specify + what portion of a packet is covered with the checksum. It adds two socket + options that you can change. + ``self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)`` will + change what portion of outgoing packets are covered by the checksum and + ``self.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)`` will + filter out packets which cover too little of their data. In both cases + ``length`` should be in ``range(8, 2**16, 8)``. + + Such a socket should be constructed with + ``socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)`` for IPv4 or + ``socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)`` for IPv6. + + .. availability:: Linux >= 2.6.20, FreeBSD >= 10.1-RELEASE + + .. versionadded:: 3.9 + If you use a hostname in the *host* portion of IPv4/v6 socket address, the program may show a nondeterministic behavior, as Python uses the first address returned from the DNS resolution. The socket address will be resolved @@ -391,6 +412,17 @@ Constants .. versionadded:: 3.5 +.. data:: CAN_RAW_JOIN_FILTERS + + Joins the applied CAN filters such that only CAN frames that match all + given CAN filters are passed to user space. + + This constant is documented in the Linux documentation. + + .. availability:: Linux >= 4.1. + + .. versionadded:: 3.9 + .. data:: CAN_ISOTP CAN_ISOTP, in the CAN protocol family, is the ISO-TP (ISO 15765-2) protocol. @@ -400,6 +432,15 @@ Constants .. versionadded:: 3.7 +.. data:: CAN_J1939 + + CAN_J1939, in the CAN protocol family, is the SAE J1939 protocol. + J1939 constants, documented in the Linux documentation. + + .. availability:: Linux >= 5.4. + + .. versionadded:: 3.9 + .. data:: AF_PACKET PF_PACKET @@ -516,7 +557,8 @@ The following functions all create :ref:`socket objects `. default), :const:`SOCK_DGRAM`, :const:`SOCK_RAW` or perhaps one of the other ``SOCK_`` constants. The protocol number is usually zero and may be omitted or in the case where the address family is :const:`AF_CAN` the protocol - should be one of :const:`CAN_RAW`, :const:`CAN_BCM` or :const:`CAN_ISOTP`. + should be one of :const:`CAN_RAW`, :const:`CAN_BCM`, :const:`CAN_ISOTP` or + :const:`CAN_J1939`. If *fileno* is specified, the values for *family*, *type*, and *proto* are auto-detected from the specified file descriptor. Auto-detection can be @@ -560,6 +602,9 @@ The following functions all create :ref:`socket objects `. ``SOCK_NONBLOCK``, but ``sock.type`` will be set to ``socket.SOCK_STREAM``. + .. versionchanged:: 3.9 + The CAN_J1939 protocol was added. + .. function:: socketpair([family[, type[, proto]]]) Build a pair of connected socket objects using the given address family, socket @@ -721,7 +766,7 @@ The :mod:`socket` module also offers various network-related services: :const:`AI_CANONNAME` is part of the *flags* argument; else *canonname* will be empty. *sockaddr* is a tuple describing a socket address, whose format depends on the returned *family* (a ``(address, port)`` 2-tuple for - :const:`AF_INET`, a ``(address, port, flow info, scope id)`` 4-tuple for + :const:`AF_INET`, a ``(address, port, flowinfo, scope_id)`` 4-tuple for :const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect` method. @@ -742,7 +787,7 @@ The :mod:`socket` module also offers various network-related services: .. versionchanged:: 3.7 for IPv6 multicast addresses, string representing an address will not - contain ``%scope`` part. + contain ``%scope_id`` part. .. function:: getfqdn([name]) @@ -810,8 +855,8 @@ The :mod:`socket` module also offers various network-related services: or numeric address representation in *host*. Similarly, *port* can contain a string port name or a numeric port number. - For IPv6 addresses, ``%scope`` is appended to the host part if *sockaddr* - contains meaningful *scopeid*. Usually this happens for multicast addresses. + For IPv6 addresses, ``%scope_id`` is appended to the host part if *sockaddr* + contains meaningful *scope_id*. Usually this happens for multicast addresses. For more information about *flags* you can consult :manpage:`getnameinfo(3)`. @@ -1337,7 +1382,7 @@ to sockets. .. versionchanged:: 3.7 For multicast IPv6 address, first item of *address* does not contain - ``%scope`` part anymore. In order to get full IPv6 address use + ``%scope_id`` part anymore. In order to get full IPv6 address use :func:`getnameinfo`. .. method:: socket.recvmsg(bufsize[, ancbufsize[, flags]]) @@ -1569,6 +1614,29 @@ to sockets. .. versionadded:: 3.6 +.. method:: socket.send_fds(sock, buffers, fds[, flags[, address]]) + + Send the list of file descriptors *fds* over an :const:`AF_UNIX` socket. + The *fds* parameter is a sequence of file descriptors. + Consult :meth:`sendmsg` for the documentation of these parameters. + + .. availability:: Unix supporting :meth:`~socket.sendmsg` and :const:`SCM_RIGHTS` mechanism. + + .. versionadded:: 3.9 + +.. method:: socket.recv_fds(sock, bufsize, maxfds[, flags]) + + Receive up to *maxfds* file descriptors. Return ``(msg, list(fds), flags, addr)``. Consult + :meth:`recvmsg` for the documentation of these parameters. + + .. availability:: Unix supporting :meth:`~socket.recvmsg` and :const:`SCM_RIGHTS` mechanism. + + .. versionadded:: 3.9 + + .. note:: + + Any truncated integers at the end of the list of file descriptors. + .. method:: socket.sendfile(file, offset=0, count=None) Send a file until EOF is reached by using high-performance diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 314d3a58..ccb82278 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -928,7 +928,7 @@ a class like this:: self.x, self.y = x, y Now you want to store the point in a single SQLite column. First you'll have to -choose one of the supported types first to be used for representing the point. +choose one of the supported types to be used for representing the point. Let's just use str and separate the coordinates using a semicolon. Then you need to give your class a method ``__conform__(self, protocol)`` which must return the converted value. The parameter *protocol* will be :class:`PrepareProtocol`. diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 04523e91..852091c0 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -293,7 +293,7 @@ Random generation Read the Wikipedia article, `Cryptographically secure pseudorandom number generator (CSPRNG) `_, - to get the requirements of a cryptographically generator. + to get the requirements of a cryptographically strong generator. .. versionadded:: 3.3 @@ -1256,7 +1256,7 @@ SSL sockets also have the following additional methods and attributes: The returned dictionary includes additional X509v3 extension items such as ``crlDistributionPoints``, ``caIssuers`` and ``OCSP`` URIs. - .. versionchanged:: 3.8.1 + .. versionchanged:: 3.9 IPv6 address strings no longer have a trailing new line. .. method:: SSLSocket.cipher() diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 026f4aa4..38a499ab 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -696,6 +696,16 @@ of applications in statistics. Set *n* to 100 for percentiles which gives the 99 cuts points that separate the normal distribution into 100 equal sized groups. + .. method:: NormalDist.zscore(x) + + Compute the + `Standard Score `_ + describing *x* in terms of the number of standard deviations + above or below the mean of the normal distribution: + ``(x - mean) / stdev``. + + .. versionadded:: 3.9 + Instances of :class:`NormalDist` support addition, subtraction, multiplication and division by a constant. These operations are used for translation and scaling. For example: diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index ccd2f99c..c3f5c04a 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -352,7 +352,7 @@ Notes: The numeric literals accepted include the digits ``0`` to ``9`` or any Unicode equivalent (code points with the ``Nd`` property). - See http://www.unicode.org/Public/12.1.0/ucd/extracted/DerivedNumericType.txt + See https://www.unicode.org/Public/13.0.0/ucd/extracted/DerivedNumericType.txt for a complete list of code points with the ``Nd`` property. @@ -1558,9 +1558,16 @@ expression support in the :mod:`re` module). :func:`codecs.register_error`, see section :ref:`error-handlers`. For a list of possible encodings, see section :ref:`standard-encodings`. + By default, the *errors* argument is not checked for best performances, but + only used at the first encoding error. Enable the :ref:`Python Development + Mode `, or use a debug build to check *errors*. + .. versionchanged:: 3.1 Support for keyword arguments added. + .. versionchanged:: 3.9 + The *errors* is now checked in development mode and in debug mode. + .. method:: str.endswith(suffix[, start[, end]]) @@ -1775,6 +1782,16 @@ expression support in the :mod:`re` module). Return ``True`` if all cased characters [4]_ in the string are uppercase and there is at least one cased character, ``False`` otherwise. + >>> 'BANANA'.isupper() + True + >>> 'banana'.isupper() + False + >>> 'baNana'.isupper() + False + >>> ' '.isupper() + False + + .. method:: str.join(iterable) @@ -1812,6 +1829,14 @@ expression support in the :mod:`re` module). >>> 'www.example.com'.lstrip('cmowz.') 'example.com' + See :meth:`str.removeprefix` for a method that will remove a single prefix + string rather than all of a set of characters. For example:: + + >>> 'Arthur: three!'.lstrip('Arthur: ') + 'ee!' + >>> 'Arthur: three!'.removeprefix('Arthur: ') + 'three!' + .. staticmethod:: str.maketrans(x[, y[, z]]) @@ -1836,6 +1861,34 @@ expression support in the :mod:`re` module). the string itself, followed by two empty strings. +.. method:: str.removeprefix(prefix, /) + + If the string starts with the *prefix* string, return + ``string[len(prefix):]``. Otherwise, return a copy of the original + string:: + + >>> 'TestHook'.removeprefix('Test') + 'Hook' + >>> 'BaseTestCase'.removeprefix('Test') + 'BaseTestCase' + + .. versionadded:: 3.9 + + +.. method:: str.removesuffix(suffix, /) + + If the string ends with the *suffix* string and that *suffix* is not empty, + return ``string[:-len(suffix)]``. Otherwise, return a copy of the + original string:: + + >>> 'MiscTests'.removesuffix('Tests') + 'Misc' + >>> 'TmpDirMixin'.removesuffix('Tests') + 'TmpDirMixin' + + .. versionadded:: 3.9 + + .. method:: str.replace(old, new[, count]) Return a copy of the string with all occurrences of substring *old* replaced by @@ -1892,6 +1945,13 @@ expression support in the :mod:`re` module). >>> 'mississippi'.rstrip('ipz') 'mississ' + See :meth:`str.removesuffix` for a method that will remove a single suffix + string rather than all of a set of characters. For example:: + + >>> 'Monty Python'.rstrip(' Python') + 'M' + >>> 'Monty Python'.removesuffix(' Python') + 'Monty' .. method:: str.split(sep=None, maxsplit=-1) @@ -2572,6 +2632,50 @@ arbitrary binary data. Also accept an integer in the range 0 to 255 as the subsequence. +.. method:: bytes.removeprefix(prefix, /) + bytearray.removeprefix(prefix, /) + + If the binary data starts with the *prefix* string, return + ``bytes[len(prefix):]``. Otherwise, return a copy of the original + binary data:: + + >>> b'TestHook'.removeprefix(b'Test') + b'Hook' + >>> b'BaseTestCase'.removeprefix(b'Test') + b'BaseTestCase' + + The *prefix* may be any :term:`bytes-like object`. + + .. note:: + + The bytearray version of this method does *not* operate in place - + it always produces a new object, even if no changes were made. + + .. versionadded:: 3.9 + + +.. method:: bytes.removesuffix(suffix, /) + bytearray.removesuffix(suffix, /) + + If the binary data ends with the *suffix* string and that *suffix* is + not empty, return ``bytes[:-len(suffix)]``. Otherwise, return a copy of + the original binary data:: + + >>> b'MiscTests'.removesuffix(b'Tests') + b'Misc' + >>> b'TmpDirMixin'.removesuffix(b'Tests') + b'TmpDirMixin' + + The *suffix* may be any :term:`bytes-like object`. + + .. note:: + + The bytearray version of this method does *not* operate in place - + it always produces a new object, even if no changes were made. + + .. versionadded:: 3.9 + + .. method:: bytes.decode(encoding="utf-8", errors="strict") bytearray.decode(encoding="utf-8", errors="strict") @@ -2583,6 +2687,10 @@ arbitrary binary data. :func:`codecs.register_error`, see section :ref:`error-handlers`. For a list of possible encodings, see section :ref:`standard-encodings`. + By default, the *errors* argument is not checked for best performances, but + only used at the first decoding error. Enable the :ref:`Python Development + Mode `, or use a debug build to check *errors*. + .. note:: Passing the *encoding* argument to :class:`str` allows decoding any @@ -2592,6 +2700,9 @@ arbitrary binary data. .. versionchanged:: 3.1 Added support for keyword arguments. + .. versionchanged:: 3.9 + The *errors* is now checked in development mode and in debug mode. + .. method:: bytes.endswith(suffix[, start[, end]]) bytearray.endswith(suffix[, start[, end]]) @@ -2815,7 +2926,14 @@ produce new objects. b'example.com' The binary sequence of byte values to remove may be any - :term:`bytes-like object`. + :term:`bytes-like object`. See :meth:`~bytes.removeprefix` for a method + that will remove a single prefix string rather than all of a set of + characters. For example:: + + >>> b'Arthur: three!'.lstrip(b'Arthur: ') + b'ee!' + >>> b'Arthur: three!'.removeprefix(b'Arthur: ') + b'three!' .. note:: @@ -2864,7 +2982,14 @@ produce new objects. b'mississ' The binary sequence of byte values to remove may be any - :term:`bytes-like object`. + :term:`bytes-like object`. See :meth:`~bytes.removesuffix` for a method + that will remove a single suffix string rather than all of a set of + characters. For example:: + + >>> b'Monty Python'.rstrip(b' Python') + b'M' + >>> b'Monty Python'.removesuffix(b' Python') + b'Monty' .. note:: @@ -4209,7 +4334,8 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: >>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) >>> d = dict([('two', 2), ('one', 1), ('three', 3)]) >>> e = dict({'three': 3, 'one': 1, 'two': 2}) - >>> a == b == c == d == e + >>> f = dict({'one': 1, 'three': 3}, two=2) + >>> a == b == c == d == e == f True Providing keyword arguments as in the first example only works for keys that @@ -4367,6 +4493,22 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: >>> d.values() == d.values() False + .. describe:: d | other + + Create a new dictionary with the merged keys and values of *d* and + *other*, which must both be dictionaries. The values of *other* take + priority when *d* and *other* share keys. + + .. versionadded:: 3.9 + + .. describe:: d |= other + + Update the dictionary *d* with keys and values from *other*, which may be + either a :term:`mapping` or an :term:`iterable` of key/value pairs. The + values of *other* take priority when *d* and *other* share keys. + + .. versionadded:: 3.9 + Dictionaries compare equal if and only if they have the same ``(key, value)`` pairs (regardless of ordering). Order comparisons ('<', '<=', '>=', '>') raise :exc:`TypeError`. diff --git a/Doc/library/struct.rst b/Doc/library/struct.rst index 278cb19f..eccba20f 100644 --- a/Doc/library/struct.rst +++ b/Doc/library/struct.rst @@ -70,7 +70,7 @@ The module defines the following exception and functions: size required by the format, as reflected by :func:`calcsize`. -.. function:: unpack_from(format, buffer, offset=0) +.. function:: unpack_from(format, /, buffer, offset=0) Unpack from *buffer* starting at position *offset*, according to the format string *format*. The result is a tuple even if it contains exactly one @@ -259,7 +259,7 @@ Notes: called to convert the argument to an integer before packing. .. versionchanged:: 3.2 - Use of the :meth:`__index__` method for non-integers is new in 3.2. + Added use of the :meth:`__index__` method for non-integers. (3) The ``'n'`` and ``'N'`` conversion codes are only available for the native @@ -312,7 +312,7 @@ When packing a value ``x`` using one of the integer formats (``'b'``, then :exc:`struct.error` is raised. .. versionchanged:: 3.1 - In 3.0, some of the integer formats wrapped out-of-range values and + Previously, some of the integer formats wrapped out-of-range values and raised :exc:`DeprecationWarning` instead of :exc:`struct.error`. The ``'p'`` format character encodes a "Pascal string", meaning a short diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index a93a6c18..e37cc980 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -339,7 +339,8 @@ functions. stderr=None, preexec_fn=None, close_fds=True, shell=False, \ cwd=None, env=None, universal_newlines=None, \ startupinfo=None, creationflags=0, restore_signals=True, \ - start_new_session=False, pass_fds=(), *, \ + start_new_session=False, pass_fds=(), \*, group=None, \ + extra_groups=None, user=None, umask=-1, \ encoding=None, errors=None, text=None) Execute a child program in a new process. On POSIX, the class uses @@ -550,6 +551,39 @@ functions. .. versionchanged:: 3.2 *start_new_session* was added. + If *group* is not ``None``, the setregid() system call will be made in the + child process prior to the execution of the subprocess. If the provided + value is a string, it will be looked up via :func:`grp.getgrnam()` and + the value in ``gr_gid`` will be used. If the value is an integer, it + will be passed verbatim. (POSIX only) + + .. availability:: POSIX + .. versionadded:: 3.9 + + If *extra_groups* is not ``None``, the setgroups() system call will be + made in the child process prior to the execution of the subprocess. + Strings provided in *extra_groups* will be looked up via + :func:`grp.getgrnam()` and the values in ``gr_gid`` will be used. + Integer values will be passed verbatim. (POSIX only) + + .. availability:: POSIX + .. versionadded:: 3.9 + + If *user* is not ``None``, the setreuid() system call will be made in the + child process prior to the execution of the subprocess. If the provided + value is a string, it will be looked up via :func:`pwd.getpwnam()` and + the value in ``pw_uid`` will be used. If the value is an integer, it will + be passed verbatim. (POSIX only) + + .. availability:: POSIX + .. versionadded:: 3.9 + + If *umask* is not negative, the umask() system call will be made in the + child process prior to the execution of the subprocess. + + .. availability:: POSIX + .. versionadded:: 3.9 + If *env* is not ``None``, it must be a mapping that defines the environment variables for the new process; these are used instead of the default behavior of inheriting the current process' environment. @@ -747,6 +781,8 @@ Instances of the :class:`Popen` class have the following methods: Sends the signal *signal* to the child. + Do nothing if the process completed. + .. note:: On Windows, SIGTERM is an alias for :meth:`terminate`. CTRL_C_EVENT and diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst index 2064fd7e..aad6f93b 100644 --- a/Doc/library/sunau.rst +++ b/Doc/library/sunau.rst @@ -59,13 +59,6 @@ The :mod:`sunau` module defines the following functions: or ``'wb'`` returns an :class:`AU_write` object. -.. function:: openfp(file, mode) - - A synonym for :func:`.open`, maintained for backwards compatibility. - - .. deprecated-removed:: 3.7 3.9 - - The :mod:`sunau` module defines the following exception: .. exception:: Error diff --git a/Doc/library/symbol.rst b/Doc/library/symbol.rst index 44996936..d56600af 100644 --- a/Doc/library/symbol.rst +++ b/Doc/library/symbol.rst @@ -17,6 +17,11 @@ the definitions of the names in the context of the language grammar. The specific numeric values which the names map to may change between Python versions. +.. warning:: + + The symbol module is deprecated and will be removed in future versions of + Python. + This module also provides one additional data object: diff --git a/Doc/library/symtable.rst b/Doc/library/symtable.rst index 7c6ac4dc..3efdecb5 100644 --- a/Doc/library/symtable.rst +++ b/Doc/library/symtable.rst @@ -67,10 +67,6 @@ Examining Symbol Tables Return ``True`` if the block has nested namespaces within it. These can be obtained with :meth:`get_children`. - .. method:: has_exec() - - Return ``True`` if the block uses ``exec``. - .. method:: get_identifiers() Return a list of names of symbols in this table. diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index d3473de1..880f252f 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -430,9 +430,9 @@ always available. The :term:`named tuple` *flags* exposes the status of command line flags. The attributes are read only. - ============================= ============================= + ============================= ================================================================ attribute flag - ============================= ============================= + ============================= ================================================================ :const:`debug` :option:`-d` :const:`inspect` :option:`-i` :const:`interactive` :option:`-i` @@ -446,9 +446,9 @@ always available. :const:`bytes_warning` :option:`-b` :const:`quiet` :option:`-q` :const:`hash_randomization` :option:`-R` - :const:`dev_mode` :option:`-X` ``dev`` - :const:`utf8_mode` :option:`-X` ``utf8`` - ============================= ============================= + :const:`dev_mode` :option:`-X dev <-X>` (:ref:`Python Development Mode `) + :const:`utf8_mode` :option:`-X utf8 <-X>` + ============================= ================================================================ .. versionchanged:: 3.2 Added ``quiet`` attribute for the new :option:`-q` flag. @@ -463,8 +463,9 @@ always available. Added ``isolated`` attribute for :option:`-I` ``isolated`` flag. .. versionchanged:: 3.7 - Added ``dev_mode`` attribute for the new :option:`-X` ``dev`` flag - and ``utf8_mode`` attribute for the new :option:`-X` ``utf8`` flag. + Added the ``dev_mode`` attribute for the new :ref:`Python Development + Mode ` and the ``utf8_mode`` attribute for the new :option:`-X` + ``utf8`` flag. .. data:: float_info @@ -483,6 +484,8 @@ always available. +=====================+================+==================================================+ | :const:`epsilon` | DBL_EPSILON | difference between 1.0 and the least value | | | | greater than 1.0 that is representable as a float| + | | | | + | | | See also :func:`math.ulp`. | +---------------------+----------------+--------------------------------------------------+ | :const:`dig` | DBL_DIG | maximum number of decimal digits that can be | | | | faithfully represented in a float; see below | @@ -499,6 +502,10 @@ always available. | | | range of representable finite floats | +---------------------+----------------+--------------------------------------------------+ | :const:`min` | DBL_MIN | minimum representable positive *normalized* float| + | | | | + | | | Use :func:`math.ulp(0.0) ` to get the | + | | | smallest positive *denormalized* representable | + | | | float. | +---------------------+----------------+--------------------------------------------------+ | :const:`min_exp` | DBL_MIN_EXP | minimum integer *e* such that ``radix**(e-1)`` is| | | | a normalized float | @@ -573,14 +580,6 @@ always available. .. versionadded:: 3.7 -.. function:: getcheckinterval() - - Return the interpreter's "check interval"; see :func:`setcheckinterval`. - - .. deprecated:: 3.2 - Use :func:`getswitchinterval` instead. - - .. function:: getdefaultencoding() Return the name of the current default string encoding used by the Unicode @@ -1139,6 +1138,28 @@ always available. system's identity. +.. data:: platlibdir + + Name of the platform-specific library directory. It is used to build the + path of standard library and the paths of installed extension modules. + + It is equal to ``"lib"`` on most platforms. On Fedora and SuSE, it is equal + to ``"lib64"`` on 64-bit platforms which gives the following ``sys.path`` + paths (where ``X.Y`` is the Python ``major.minor`` version): + + * ``/usr/lib64/pythonX.Y/``: + Standard library (like ``os.py`` of the :mod:`os` module) + * ``/usr/lib64/pythonX.Y/lib-dynload/``: + C extension modules of the standard library (like the :mod:`errno` module, + the exact filename is platform specific) + * ``/usr/lib/pythonX.Y/site-packages/`` (always use ``lib``, not + :data:`sys.platlibdir`): Third-party modules + * ``/usr/lib64/pythonX.Y/site-packages/``: + C extension modules of third-party packages + + .. versionadded:: 3.9 + + .. data:: prefix A string giving the site-specific directory prefix where the platform @@ -1173,21 +1194,6 @@ always available. implement a dynamic prompt. -.. function:: setcheckinterval(interval) - - Set the interpreter's "check interval". This integer value determines how often - the interpreter checks for periodic things such as thread switches and signal - handlers. The default is ``100``, meaning the check is performed every 100 - Python virtual instructions. Setting it to a larger value may increase - performance for programs using threads. Setting it to a value ``<=`` 0 checks - every virtual instruction, maximizing responsiveness as well as overhead. - - .. deprecated:: 3.2 - This function doesn't have an effect anymore, as the internal logic for - thread switching and asynchronous tasks has been rewritten. Use - :func:`setswitchinterval` instead. - - .. function:: setdlopenflags(n) Set the flags used by the interpreter for :c:func:`dlopen` calls, such as when @@ -1471,9 +1477,15 @@ always available. for the Windows console, this only applies when :envvar:`PYTHONLEGACYWINDOWSSTDIO` is also set. - * When interactive, ``stdout`` and ``stderr`` streams are line-buffered. - Otherwise, they are block-buffered like regular text files. You can - override this value with the :option:`-u` command-line option. + * When interactive, the ``stdout`` stream is line-buffered. Otherwise, + it is block-buffered like regular text files. The ``stderr`` stream + is line-buffered in both cases. You can make both streams unbuffered + by passing the :option:`-u` command-line option or setting the + :envvar:`PYTHONUNBUFFERED` environment variable. + + .. versionchanged:: 3.9 + Non-interactive ``stderr`` is now line-buffered instead of fully + buffered. .. note:: diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index 87c36aa4..cca466b5 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -160,7 +160,10 @@ Some facts and figures: .. function:: is_tarfile(name) Return :const:`True` if *name* is a tar archive file, that the :mod:`tarfile` - module can read. + module can read. *name* may be a :class:`str`, file, or file-like object. + + .. versionchanged:: 3.9 + Support for file and file-like objects. The :mod:`tarfile` module defines the following exceptions: diff --git a/Doc/library/test.rst b/Doc/library/test.rst index da6a85d3..f7e6eba0 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -287,9 +287,65 @@ The :mod:`test.support` module defines the following constants: Set to a filename containing the :data:`FS_NONASCII` character. -.. data:: IPV6_ENABLED +.. data:: LOOPBACK_TIMEOUT + + Timeout in seconds for tests using a network server listening on the network + local loopback interface like ``127.0.0.1``. + + The timeout is long enough to prevent test failure: it takes into account + that the client and the server can run in different threads or even + different processes. + + The timeout should be long enough for :meth:`~socket.socket.connect`, + :meth:`~socket.socket.recv` and :meth:`~socket.socket.send` methods of + :class:`socket.socket`. + + Its default value is 5 seconds. + + See also :data:`INTERNET_TIMEOUT`. + + +.. data:: INTERNET_TIMEOUT + + Timeout in seconds for network requests going to the Internet. + + The timeout is short enough to prevent a test to wait for too long if the + Internet request is blocked for whatever reason. + + Usually, a timeout using :data:`INTERNET_TIMEOUT` should not mark a test as + failed, but skip the test instead: see + :func:`~test.support.socket_helper.transient_internet`. + + Its default value is 1 minute. + + See also :data:`LOOPBACK_TIMEOUT`. + + +.. data:: SHORT_TIMEOUT + + Timeout in seconds to mark a test as failed if the test takes "too long". + + The timeout value depends on the regrtest ``--timeout`` command line option. + + If a test using :data:`SHORT_TIMEOUT` starts to fail randomly on slow + buildbots, use :data:`LONG_TIMEOUT` instead. + + Its default value is 30 seconds. + + +.. data:: LONG_TIMEOUT + + Timeout in seconds to detect when a test hangs. + + It is long enough to reduce the risk of test failure on the slowest Python + buildbots. It should not be used to mark a test as failed if the test takes + "too long". The timeout value depends on the regrtest ``--timeout`` command + line option. + + Its default value is 5 minutes. - Set to ``True`` if IPV6 is enabled on this host, ``False`` otherwise. + See also :data:`LOOPBACK_TIMEOUT`, :data:`INTERNET_TIMEOUT` and + :data:`SHORT_TIMEOUT`. .. data:: SAVEDCWD @@ -367,6 +423,12 @@ The :mod:`test.support` module defines the following constants: Object that is equal to anything. Used to test mixed type comparison. +.. data:: NEVER_EQ + + Object that is not equal to anything (even to :data:`ALWAYS_EQ`). + Used to test mixed type comparison. + + .. data:: LARGEST Object that is greater than anything (except itself). @@ -619,13 +681,6 @@ The :mod:`test.support` module defines the following functions: ``sys.stdout`` if it's not set. -.. function:: strip_python_strerr(stderr) - - Strip the *stderr* of a Python process from potential debug output - emitted by the interpreter. This will typically be run on the result of - :meth:`subprocess.Popen.communicate`. - - .. function:: args_from_interpreter_flags() Return a list of command line arguments reproducing the current settings @@ -704,12 +759,6 @@ The :mod:`test.support` module defines the following functions: A context manager that temporarily sets the process umask. -.. function:: transient_internet(resource_name, *, timeout=30.0, errnos=()) - - A context manager that raises :exc:`ResourceDenied` when various issues - with the internet connection manifest themselves as exceptions. - - .. function:: disable_faulthandler() A context manager that replaces ``sys.stderr`` with ``sys.__stderr__``. @@ -765,6 +814,30 @@ The :mod:`test.support` module defines the following functions: target of the "as" clause, if there is one. +.. function:: print_warning(msg) + + Print a warning into :data:`sys.__stderr__`. Format the message as: + ``f"Warning -- {msg}"``. If *msg* is made of multiple lines, add + ``"Warning -- "`` prefix to each line. + + .. versionadded:: 3.9 + + +.. function:: wait_process(pid, *, exitcode, timeout=None) + + Wait until process *pid* completes and check that the process exit code is + *exitcode*. + + Raise an :exc:`AssertionError` if the process exit code is not equal to + *exitcode*. + + If the process runs longer than *timeout* seconds (:data:`SHORT_TIMEOUT` by + default), kill the process and raise an :exc:`AssertionError`. The timeout + feature is not available on Windows. + + .. versionadded:: 3.9 + + .. function:: wait_threads_exit(timeout=60.0) Context manager to wait until all threads created in the ``with`` statement @@ -817,12 +890,6 @@ The :mod:`test.support` module defines the following functions: A decorator for running tests that require support for xattr. -.. decorator:: skip_unless_bind_unix_socket - - A decorator for running tests that require a functional bind() for Unix - sockets. - - .. decorator:: anticipate_failure(condition) A decorator to conditionally mark tests with @@ -1073,31 +1140,6 @@ The :mod:`test.support` module defines the following functions: is raised. -.. function:: bind_port(sock, host=HOST) - - Bind the socket to a free port and return the port number. Relies on - ephemeral ports in order to ensure we are using an unbound port. This is - important as many tests may be running simultaneously, especially in a - buildbot environment. This method raises an exception if the - ``sock.family`` is :const:`~socket.AF_INET` and ``sock.type`` is - :const:`~socket.SOCK_STREAM`, and the socket has - :const:`~socket.SO_REUSEADDR` or :const:`~socket.SO_REUSEPORT` set on it. - Tests should never set these socket options for TCP/IP sockets. - The only case for setting these options is testing multicasting via - multiple UDP sockets. - - Additionally, if the :const:`~socket.SO_EXCLUSIVEADDRUSE` socket option is - available (i.e. on Windows), it will be set on the socket. This will - prevent anyone else from binding to our host/port for the duration of the - test. - - -.. function:: bind_unix_socket(sock, addr) - - Bind a unix socket, raising :exc:`unittest.SkipTest` if - :exc:`PermissionError` is raised. - - .. function:: catch_threading_exception() Context manager catching :class:`threading.Thread` exception using @@ -1159,29 +1201,6 @@ The :mod:`test.support` module defines the following functions: .. versionadded:: 3.8 -.. function:: find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM) - - Returns an unused port that should be suitable for binding. This is - achieved by creating a temporary socket with the same family and type as - the ``sock`` parameter (default is :const:`~socket.AF_INET`, - :const:`~socket.SOCK_STREAM`), - and binding it to the specified host address (defaults to ``0.0.0.0``) - with the port set to 0, eliciting an unused ephemeral port from the OS. - The temporary socket is then closed and deleted, and the ephemeral port is - returned. - - Either this method or :func:`bind_port` should be used for any tests - where a server socket needs to be bound to a particular port for the - duration of the test. - Which one to use depends on whether the calling code is creating a Python - socket, or if an unused port needs to be provided in a constructor - or passed to an external program (i.e. the ``-accept`` argument to - openssl's s_server mode). Always prefer :func:`bind_port` over - :func:`find_unused_port` where possible. Using a hard coded port is - discouraged since it can make multiple instances of the test impossible to - run simultaneously, which is a problem for buildbots. - - .. function:: load_package_tests(pkg_dir, loader, standard_tests, pattern) Generic implementation of the :mod:`unittest` ``load_tests`` protocol for @@ -1385,11 +1404,6 @@ The :mod:`test.support` module defines the following classes: Run *test* and return the result. -.. class:: TestHandler(logging.handlers.BufferingHandler) - - Class for logging support. - - .. class:: FakePath(path) Simple :term:`path-like object`. It implements the :meth:`__fspath__` @@ -1397,6 +1411,84 @@ The :mod:`test.support` module defines the following classes: it will be raised in :meth:`!__fspath__`. +:mod:`test.support.socket_helper` --- Utilities for socket tests +================================================================ + +.. module:: test.support.socket_helper + :synopsis: Support for socket tests. + + +The :mod:`test.support.socket_helper` module provides support for socket tests. + +.. versionadded:: 3.9 + + +.. data:: IPV6_ENABLED + + Set to ``True`` if IPv6 is enabled on this host, ``False`` otherwise. + + +.. function:: find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM) + + Returns an unused port that should be suitable for binding. This is + achieved by creating a temporary socket with the same family and type as + the ``sock`` parameter (default is :const:`~socket.AF_INET`, + :const:`~socket.SOCK_STREAM`), + and binding it to the specified host address (defaults to ``0.0.0.0``) + with the port set to 0, eliciting an unused ephemeral port from the OS. + The temporary socket is then closed and deleted, and the ephemeral port is + returned. + + Either this method or :func:`bind_port` should be used for any tests + where a server socket needs to be bound to a particular port for the + duration of the test. + Which one to use depends on whether the calling code is creating a Python + socket, or if an unused port needs to be provided in a constructor + or passed to an external program (i.e. the ``-accept`` argument to + openssl's s_server mode). Always prefer :func:`bind_port` over + :func:`find_unused_port` where possible. Using a hard coded port is + discouraged since it can make multiple instances of the test impossible to + run simultaneously, which is a problem for buildbots. + + +.. function:: bind_port(sock, host=HOST) + + Bind the socket to a free port and return the port number. Relies on + ephemeral ports in order to ensure we are using an unbound port. This is + important as many tests may be running simultaneously, especially in a + buildbot environment. This method raises an exception if the + ``sock.family`` is :const:`~socket.AF_INET` and ``sock.type`` is + :const:`~socket.SOCK_STREAM`, and the socket has + :const:`~socket.SO_REUSEADDR` or :const:`~socket.SO_REUSEPORT` set on it. + Tests should never set these socket options for TCP/IP sockets. + The only case for setting these options is testing multicasting via + multiple UDP sockets. + + Additionally, if the :const:`~socket.SO_EXCLUSIVEADDRUSE` socket option is + available (i.e. on Windows), it will be set on the socket. This will + prevent anyone else from binding to our host/port for the duration of the + test. + + +.. function:: bind_unix_socket(sock, addr) + + Bind a unix socket, raising :exc:`unittest.SkipTest` if + :exc:`PermissionError` is raised. + + +.. decorator:: skip_unless_bind_unix_socket + + A decorator for running tests that require a functional ``bind()`` for Unix + sockets. + + +.. function:: transient_internet(resource_name, *, timeout=30.0, errnos=()) + + A context manager that raises :exc:`~test.support.ResourceDenied` when + various issues with the internet connection manifest themselves as + exceptions. + + :mod:`test.support.script_helper` --- Utilities for the Python execution tests ============================================================================== @@ -1432,6 +1524,9 @@ script execution tests. in a subprocess. The values can include ``__isolated``, ``__cleanenv``, ``__cwd``, and ``TERM``. + .. versionchanged:: 3.9 + The function no longer strips whitespaces from *stderr*. + .. function:: assert_python_ok(*args, **env_vars) @@ -1445,6 +1540,9 @@ script execution tests. Python is started in isolated mode (command line option ``-I``), except if the ``__isolated`` keyword is set to ``False``. + .. versionchanged:: 3.9 + The function no longer strips whitespaces from *stderr*. + .. function:: assert_python_failure(*args, **env_vars) @@ -1454,6 +1552,9 @@ script execution tests. See :func:`assert_python_ok` for more options. + .. versionchanged:: 3.9 + The function no longer strips whitespaces from *stderr*. + .. function:: spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw) @@ -1497,3 +1598,33 @@ script execution tests. containing the *source*. If *compiled* is ``True``, both source files will be compiled and added to the zip package. Return a tuple of the full zip path and the archive name for the zip file. + + +:mod:`test.support.bytecode_helper` --- Support tools for testing correct bytecode generation +============================================================================================= + +.. module:: test.support.bytecode_helper + :synopsis: Support tools for testing correct bytecode generation. + +The :mod:`test.support.bytecode_helper` module provides support for testing +and inspecting bytecode generation. + +The module defines the following class: + +.. class:: BytecodeTestCase(unittest.TestCase) + + This class has custom assertion methods for inspecting bytecode. + +.. method:: BytecodeTestCase.get_disassembly_as_string(co) + + Return the disassembly of *co* as string. + + +.. method:: BytecodeTestCase.assertInBytecode(x, opname, argval=_UNSPECIFIED) + + Return instr if *opname* is found, otherwise throws :exc:`AssertionError`. + + +.. method:: BytecodeTestCase.assertNotInBytecode(x, opname, argval=_UNSPECIFIED) + + Throws :exc:`AssertionError` if *opname* is found. diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 4c78e6e1..f4de3c4e 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -800,11 +800,14 @@ Semaphores also support the :ref:`context management protocol `. .. versionchanged:: 3.2 The *timeout* parameter is new. - .. method:: release() + .. method:: release(n=1) + + Release a semaphore, incrementing the internal counter by *n*. When it + was zero on entry and other threads are waiting for it to become larger + than zero again, wake up *n* of those threads. - Release a semaphore, incrementing the internal counter by one. When it - was zero on entry and another thread is waiting for it to become larger - than zero again, wake up that thread. + .. versionchanged:: 3.9 + Added the *n* parameter to release multiple waiting threads at once. .. class:: BoundedSemaphore(value=1) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 6842e907..cff6320b 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -774,6 +774,16 @@ These constants are used as parameters for :func:`clock_getres` and .. versionadded:: 3.7 +.. data:: CLOCK_TAI + + `International Atomic Time `_ + + The system must have a current leap second table in order for this to give + the correct answer. PTP or NTP software can maintain a leap second table. + + .. availability:: Linux. + + .. versionadded:: 3.9 .. data:: CLOCK_THREAD_CPUTIME_ID @@ -805,7 +815,6 @@ These constants are used as parameters for :func:`clock_getres` and .. versionadded:: 3.8 - The following constant is the only parameter that can be sent to :func:`clock_settime`. diff --git a/Doc/library/tk.rst b/Doc/library/tk.rst index 95cd1c77..c6c73f05 100644 --- a/Doc/library/tk.rst +++ b/Doc/library/tk.rst @@ -33,14 +33,17 @@ alternatives, see the :ref:`other-gui-packages` section. .. toctree:: tkinter.rst + tkinter.colorchooser.rst + tkinter.font.rst + dialog.rst + tkinter.messagebox.rst + tkinter.scrolledtext.rst + tkinter.dnd.rst tkinter.ttk.rst tkinter.tix.rst - tkinter.scrolledtext.rst idle.rst othergui.rst .. Other sections I have in mind are Tkinter internals - Freezing Tkinter applications - - + Freezing Tkinter applications \ No newline at end of file diff --git a/Doc/library/tk_msg.png b/Doc/library/tk_msg.png new file mode 100644 index 00000000..c122d8f8 Binary files /dev/null and b/Doc/library/tk_msg.png differ diff --git a/Doc/library/tkinter.colorchooser.rst b/Doc/library/tkinter.colorchooser.rst new file mode 100644 index 00000000..60f4d707 --- /dev/null +++ b/Doc/library/tkinter.colorchooser.rst @@ -0,0 +1,29 @@ +:mod:`tkinter.colorchooser` --- Color choosing dialog +===================================================== + +.. module:: tkinter.colorchooser + :platform: Tk + :synopsis: Color choosing dialog + +**Source code:** :source:`Lib/tkinter/colorchooser.py` + +-------------- + +The :mod:`tkinter.colorchooser` module provides the :class:`Chooser` class +as an interface to the native color picker dialog. ``Chooser`` implements +a modal color choosing dialog window. The ``Chooser`` class inherits from +the :class:`~tkinter.commondialog.Dialog` class. + +.. class:: Chooser(master=None, **options) + +.. function:: askcolor(color=None, **options) + + Create a color choosing dialog. A call to this method will show the window, + wait for the user to make a selection, and return the selected color (or + ``None``) to the caller. + + +.. seealso:: + + Module :mod:`tkinter.commondialog` + Tkinter standard dialog module \ No newline at end of file diff --git a/Doc/library/tkinter.dnd.rst b/Doc/library/tkinter.dnd.rst new file mode 100644 index 00000000..6c11c739 --- /dev/null +++ b/Doc/library/tkinter.dnd.rst @@ -0,0 +1,64 @@ +:mod:`tkinter.dnd` --- Drag and drop support +============================================ + +.. module:: tkinter.dnd + :platform: Tk + :synopsis: Tkinter drag-and-drop interface + +**Source code:** :source:`Lib/tkinter/dnd.py` + +-------------- + +.. note:: This is experimental and due to be deprecated when it is replaced + with the Tk DND. + +The :mod:`tkinter.dnd` module provides drag-and-drop support for objects within +a single application, within the same window or between windows. To enable an +object to be dragged, you must create an event binding for it that starts the +drag-and-drop process. Typically, you bind a ButtonPress event to a callback +function that you write (see :ref:`Bindings-and-Events`). The function should +call :func:`dnd_start`, where 'source' is the object to be dragged, and 'event' +is the event that invoked the call (the argument to your callback function). + +Selection of a target object occurs as follows: + +#. Top-down search of area under mouse for target widget + + * Target widget should have a callable *dnd_accept* attribute + * If *dnd_accept* is not present or returns None, search moves to parent widget + * If no target widget is found, then the target object is None + +2. Call to *.dnd_leave(source, event)* +#. Call to *.dnd_enter(source, event)* +#. Call to *.dnd_commit(source, event)* to notify of drop +#. Call to *.dnd_end(target, event)* to signal end of drag-and-drop + + +.. class:: DndHandler(source, event) + + The *DndHandler* class handles drag-and-drop events tracking Motion and + ButtonRelease events on the root of the event widget. + + .. method:: cancel(event=None) + + Cancel the drag-and-drop process. + + .. method:: finish(event, commit=0) + + Execute end of drag-and-drop functions. + + .. method:: on_motion(event) + + Inspect area below mouse for target objects while drag is performed. + + .. method:: on_release(event) + + Signal end of drag when the release pattern is triggered. + +.. function:: dnd_start(source, event) + + Factory function for drag-and-drop process. + +.. seealso:: + + :ref:`Bindings-and-Events` \ No newline at end of file diff --git a/Doc/library/tkinter.font.rst b/Doc/library/tkinter.font.rst new file mode 100644 index 00000000..b0f4505e --- /dev/null +++ b/Doc/library/tkinter.font.rst @@ -0,0 +1,96 @@ +:mod:`tkinter.font` --- Tkinter font wrapper +============================================ + +.. module:: tkinter.font + :platform: Tk + :synopsis: Tkinter font-wrapping class + +**Source code:** :source:`Lib/tkinter/font.py` + +-------------- + +The :mod:`tkinter.font` module provides the :class:`Font` class for creating +and using named fonts. + +The different font weights and slants are: + +.. data:: NORMAL + BOLD + ITALIC + ROMAN + +.. class:: Font(root=None, font=None, name=None, exists=False, **options) + + The :class:`Font` class represents a named font. *Font* instances are given + unique names and can be specified by their family, size, and style + configuration. Named fonts are Tk's method of creating and identifying + fonts as a single object, rather than specifying a font by its attributes + with each occurrence. + + arguments: + + | *font* - font specifier tuple (family, size, options) + | *name* - unique font name + | *exists* - self points to existing named font if true + + additional keyword options (ignored if *font* is specified): + + | *family* - font family i.e. Courier, Times + | *size* - font size + | If *size* is positive it is interpreted as size in points. + | If *size* is a negative number its absolute value is treated + | as size in pixels. + | *weight* - font emphasis (NORMAL, BOLD) + | *slant* - ROMAN, ITALIC + | *underline* - font underlining (0 - none, 1 - underline) + | *overstrike* - font strikeout (0 - none, 1 - strikeout) + + .. method:: actual(option=None, displayof=None) + + Return the attributes of the font. + + .. method:: cget(option) + + Retrieve an attribute of the font. + + .. method:: config(**options) + + Modify attributes of the font. + + .. method:: copy() + + Return new instance of the current font. + + .. method:: measure(text, displayof=None) + + Return amount of space the text would occupy on the specified display + when formatted in the current font. If no display is specified then the + main application window is assumed. + + .. method:: metrics(*options, **kw) + + Return font-specific data. + Options include: + + *ascent* - distance between baseline and highest point that a + character of the font can occupy + + *descent* - distance between baseline and lowest point that a + character of the font can occupy + + *linespace* - minimum vertical separation necessary between any two + characters of the font that ensures no vertical overlap between lines. + + *fixed* - 1 if font is fixed-width else 0 + +.. function:: families(root=None, displayof=None) + + Return the different font families. + +.. function:: names(root=None) + + Return the names of defined fonts. + +.. function:: nametofont(name) + + Return a :class:`Font` representation of a tk named font. \ No newline at end of file diff --git a/Doc/library/tkinter.messagebox.rst b/Doc/library/tkinter.messagebox.rst new file mode 100644 index 00000000..872e72f7 --- /dev/null +++ b/Doc/library/tkinter.messagebox.rst @@ -0,0 +1,39 @@ +:mod:`tkinter.messagebox` --- Tkinter message prompts +===================================================== + +.. module:: tkinter.messagebox + :platform: Tk + :synopsis: Various types of alert dialogs + +**Source code:** :source:`Lib/tkinter/messagebox.py` + +-------------- + +The :mod:`tkinter.messagebox` module provides a template base class as well as +a variety of convenience methods for commonly used configurations. The message +boxes are modal and will return a subset of (True, False, OK, None, Yes, No) based on +the user's selection. Common message box styles and layouts include but are not +limited to: + +.. figure:: tk_msg.png + +.. class:: Message(master=None, **options) + + Create a default information message box. + +**Information message box** + +.. method:: showinfo(title=None, message=None, **options) + +**Warning message boxes** + +.. method:: showwarning(title=None, message=None, **options) + showerror(title=None, message=None, **options) + +**Question message boxes** + +.. method:: askquestion(title=None, message=None, **options) + askokcancel(title=None, message=None, **options) + askretrycancel(title=None, message=None, **options) + askyesno(title=None, message=None, **options) + askyesnocancel(title=None, message=None, **options) \ No newline at end of file diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 79633b77..7739f2f6 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -109,9 +109,6 @@ Or, more often:: Other modules that provide Tk support include: -:mod:`tkinter.scrolledtext` - Text widget with a vertical scroll bar built in. - :mod:`tkinter.colorchooser` Dialog to let the user choose a color. @@ -127,6 +124,9 @@ Other modules that provide Tk support include: :mod:`tkinter.messagebox` Access to standard Tk dialog boxes. +:mod:`tkinter.scrolledtext` + Text widget with a vertical scroll bar built in. + :mod:`tkinter.simpledialog` Basic dialogs and convenience functions. @@ -683,9 +683,10 @@ scrollcommand This is almost always the :meth:`!set` method of some scrollbar widget, but can be any widget method that takes a single argument. -wrap: +wrap Must be one of: ``"none"``, ``"char"``, or ``"word"``. +.. _Bindings-and-Events: Bindings and Events ^^^^^^^^^^^^^^^^^^^ diff --git a/Doc/library/tkinter.scrolledtext.rst b/Doc/library/tkinter.scrolledtext.rst index 138720e4..d20365ba 100644 --- a/Doc/library/tkinter.scrolledtext.rst +++ b/Doc/library/tkinter.scrolledtext.rst @@ -14,8 +14,7 @@ The :mod:`tkinter.scrolledtext` module provides a class of the same name which implements a basic text widget which has a vertical scroll bar configured to do the "right thing." Using the :class:`ScrolledText` class is a lot easier than -setting up a text widget and scroll bar directly. The constructor is the same -as that of the :class:`tkinter.Text` class. +setting up a text widget and scroll bar directly. The text widget and scrollbar are packed together in a :class:`Frame`, and the methods of the :class:`Grid` and :class:`Pack` geometry managers are acquired @@ -25,12 +24,14 @@ be used directly to achieve most normal geometry management behavior. Should more specific control be necessary, the following attributes are available: +.. class:: ScrolledText(master=None, **kw) -.. attribute:: ScrolledText.frame - The frame which surrounds the text and scroll bar widgets. + .. attribute:: frame + The frame which surrounds the text and scroll bar widgets. -.. attribute:: ScrolledText.vbar - The scroll bar widget. + .. attribute:: vbar + + The scroll bar widget. diff --git a/Doc/library/trace.rst b/Doc/library/trace.rst index 85fec683..c2732d90 100644 --- a/Doc/library/trace.rst +++ b/Doc/library/trace.rst @@ -166,7 +166,7 @@ Programmatic Interface environments. If not defined, *globals* and *locals* default to empty dictionaries. - .. method:: runfunc(func, *args, **kwds) + .. method:: runfunc(func, /, *args, **kwds) Call *func* with the given arguments under control of the :class:`Trace` object with the current tracing parameters. diff --git a/Doc/library/tracemalloc.rst b/Doc/library/tracemalloc.rst index 000c0ee9..20f668c7 100644 --- a/Doc/library/tracemalloc.rst +++ b/Doc/library/tracemalloc.rst @@ -249,6 +249,47 @@ Example of output of the Python test suite:: See :meth:`Snapshot.statistics` for more options. +Record the current and peak size of all traced memory blocks +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The following code computes two sums like ``0 + 1 + 2 + ...`` inefficiently, by +creating a list of those numbers. This list consumes a lot of memory +temporarily. We can use :func:`get_traced_memory` and :func:`reset_peak` to +observe the small memory usage after the sum is computed as well as the peak +memory usage during the computations:: + + import tracemalloc + + tracemalloc.start() + + # Example code: compute a sum with a large temporary list + large_sum = sum(list(range(100000))) + + first_size, first_peak = tracemalloc.get_traced_memory() + + tracemalloc.reset_peak() + + # Example code: compute a sum with a small temporary list + small_sum = sum(list(range(1000))) + + second_size, second_peak = tracemalloc.get_traced_memory() + + print(f"{first_size=}, {first_peak=}") + print(f"{second_size=}, {second_peak=}") + +Output:: + + first_size=664, first_peak=3592984 + second_size=804, second_peak=29704 + +Using :func:`reset_peak` ensured we could accurately record the peak during the +computation of ``small_sum``, even though it is much smaller than the overall +peak size of memory blocks since the :func:`start` call. Without the call to +:func:`reset_peak`, ``second_peak`` would still be the peak from the +computation ``large_sum`` (that is, equal to ``first_peak``). In this case, +both peaks are much higher than the final memory usage, and which suggests we +could optimise (by removing the unnecessary call to :class:`list`, and writing +``sum(range(...))``). API --- @@ -289,6 +330,24 @@ Functions :mod:`tracemalloc` module as a tuple: ``(current: int, peak: int)``. +.. function:: reset_peak() + + Set the peak size of memory blocks traced by the :mod:`tracemalloc` module + to the current size. + + Do nothing if the :mod:`tracemalloc` module is not tracing memory + allocations. + + This function only modifies the recorded peak size, and does not modify or + clear any traces, unlike :func:`clear_traces`. Snapshots taken with + :func:`take_snapshot` before a call to :func:`reset_peak` can be + meaningfully compared to snapshots taken after the call. + + See also :func:`get_traced_memory`. + + .. versionadded:: 3.9 + + .. function:: get_tracemalloc_memory() Get the memory usage in bytes of the :mod:`tracemalloc` module used to store @@ -311,6 +370,9 @@ Functions frames. By default, a trace of a memory block only stores the most recent frame: the limit is ``1``. *nframe* must be greater or equal to ``1``. + You can still read the original number of total frames that composed the + traceback by looking at the :attr:`Traceback.total_nframe` attribute. + Storing more than ``1`` frame is only useful to compute statistics grouped by ``'traceback'`` or to compute cumulative statistics: see the :meth:`Snapshot.compare_to` and :meth:`Snapshot.statistics` methods. @@ -657,6 +719,9 @@ Traceback When a snapshot is taken, tracebacks of traces are limited to :func:`get_traceback_limit` frames. See the :func:`take_snapshot` function. + The original number of frames of the traceback is stored in the + :attr:`Traceback.total_nframe` attribute. That allows to know if a traceback + has been truncated by the traceback limit. The :attr:`Trace.traceback` attribute is an instance of :class:`Traceback` instance. @@ -664,6 +729,15 @@ Traceback .. versionchanged:: 3.7 Frames are now sorted from the oldest to the most recent, instead of most recent to oldest. + .. attribute:: total_nframe + + Total number of frames that composed the traceback before truncation. + This attribute can be set to ``None`` if the information is not + available. + + .. versionchanged:: 3.9 + The :attr:`Traceback.total_nframe` attribute was added. + .. method:: format(limit=None, most_recent_first=False) Format the traceback as a list of lines with newlines. Use the diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 3529c2b0..79acdf44 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -282,6 +282,11 @@ Standard names are defined for the following types: .. versionadded:: 3.3 + .. versionchanged:: 3.9 + + Updated to support the new union (``|``) operator from :pep:`584`, which + simply delegates to the underlying mapping. + .. describe:: key in proxy Return ``True`` if the underlying mapping has a key *key*, else @@ -324,6 +329,12 @@ Standard names are defined for the following types: Return a new view of the underlying mapping's values. + .. describe:: reversed(proxy) + + Return a reverse iterator over the keys of the underlying mapping. + + .. versionadded:: 3.9 + Additional Utility Classes and Functions ---------------------------------------- @@ -344,8 +355,7 @@ Additional Utility Classes and Functions self.__dict__.update(kwargs) def __repr__(self): - keys = sorted(self.__dict__) - items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) + items = (f"{k}={v!r}" for k, v in self.__dict__.items()) return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): @@ -357,6 +367,9 @@ Additional Utility Classes and Functions .. versionadded:: 3.3 + .. versionchanged:: 3.9 + Attribute order in the repr changed from alphabetical to insertion (like + ``dict``). .. function:: DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None) @@ -368,7 +381,7 @@ Additional Utility Classes and Functions class's __getattr__ method; this is done by raising AttributeError. This allows one to have properties active on an instance, and have virtual - attributes on the class with the same name (see Enum for an example). + attributes on the class with the same name (see :class:`enum.Enum` for an example). .. versionadded:: 3.4 diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 0706bc87..3900e496 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1,3 +1,4 @@ +======================================== :mod:`typing` --- Support for type hints ======================================== @@ -34,13 +35,12 @@ In the function ``greeting``, the argument ``name`` is expected to be of type arguments. Type aliases ------------- +============ A type alias is defined by assigning the type to the alias. In this example, -``Vector`` and ``List[float]`` will be treated as interchangeable synonyms:: +``Vector`` and ``list[float]`` will be treated as interchangeable synonyms:: - from typing import List - Vector = List[float] + Vector = list[float] def scale(scalar: float, vector: Vector) -> Vector: return [scalar * num for num in vector] @@ -50,11 +50,11 @@ A type alias is defined by assigning the type to the alias. In this example, Type aliases are useful for simplifying complex type signatures. For example:: - from typing import Dict, Tuple, Sequence + from collections.abc import Sequence - ConnectionOptions = Dict[str, str] - Address = Tuple[str, int] - Server = Tuple[Address, ConnectionOptions] + ConnectionOptions = dict[str, str] + Address = tuple[str, int] + Server = tuple[Address, ConnectionOptions] def broadcast_message(message: str, servers: Sequence[Server]) -> None: ... @@ -63,7 +63,7 @@ Type aliases are useful for simplifying complex type signatures. For example:: # being exactly equivalent to this one. def broadcast_message( message: str, - servers: Sequence[Tuple[Tuple[str, int], Dict[str, str]]]) -> None: + servers: Sequence[tuple[tuple[str, int], dict[str, str]]]) -> None: ... Note that ``None`` as a type hint is a special case and is replaced by @@ -72,7 +72,7 @@ Note that ``None`` as a type hint is a special case and is replaced by .. _distinct: NewType -------- +======= Use the :func:`NewType` helper function to create distinct types:: @@ -149,14 +149,14 @@ See :pep:`484` for more details. .. versionadded:: 3.5.2 Callable --------- +======== Frameworks expecting callback functions of specific signatures might be type hinted using ``Callable[[Arg1Type, Arg2Type], ReturnType]``. For example:: - from typing import Callable + from collections.abc import Callable def feeder(get_next_item: Callable[[], str]) -> None: # Body @@ -172,7 +172,7 @@ for the list of arguments in the type hint: ``Callable[..., ReturnType]``. .. _generics: Generics --------- +======== Since type information about objects kept in containers cannot be statically inferred in a generic way, abstract base classes have been extended to support @@ -180,7 +180,7 @@ subscription to denote expected types for container elements. :: - from typing import Mapping, Sequence + from collections.abc import Mapping, Sequence def notify_by_email(employees: Sequence[Employee], overrides: Mapping[str, str]) -> None: ... @@ -190,7 +190,8 @@ called :class:`TypeVar`. :: - from typing import Sequence, TypeVar + from collections.abc import Sequence + from typing import TypeVar T = TypeVar('T') # Declare type variable @@ -199,7 +200,7 @@ called :class:`TypeVar`. User-defined generic types --------------------------- +========================== A user-defined class can be defined as a generic class. @@ -234,7 +235,7 @@ class body. The :class:`Generic` base class defines :meth:`__class_getitem__` so that ``LoggedVar[t]`` is valid as a type:: - from typing import Iterable + from collections.abc import Iterable def zero_all_vars(vars: Iterable[LoggedVar[int]]) -> None: for var in vars: @@ -265,7 +266,8 @@ This is thus invalid:: You can use multiple inheritance with :class:`Generic`:: - from typing import TypeVar, Generic, Sized + from collections.abc import Sized + from typing import TypeVar, Generic T = TypeVar('T') @@ -274,7 +276,8 @@ You can use multiple inheritance with :class:`Generic`:: When inheriting from generic classes, some type variables could be fixed:: - from typing import TypeVar, Mapping + from collections.abc import Mapping + from typing import TypeVar T = TypeVar('T') @@ -287,13 +290,14 @@ Using a generic class without specifying type parameters assumes :data:`Any` for each position. In the following example, ``MyIterable`` is not generic but implicitly inherits from ``Iterable[Any]``:: - from typing import Iterable + from collections.abc import Iterable class MyIterable(Iterable): # Same as Iterable[Any] User defined generic type aliases are also supported. Examples:: - from typing import TypeVar, Iterable, Tuple, Union + from collections.abc import Iterable + from typing import TypeVar, Union S = TypeVar('S') Response = Union[Iterable[S], int] @@ -302,9 +306,9 @@ User defined generic type aliases are also supported. Examples:: ... T = TypeVar('T', int, float, complex) - Vec = Iterable[Tuple[T, T]] + Vec = Iterable[tuple[T, T]] - def inproduct(v: Vec[T]) -> T: # Same as Iterable[Tuple[T, T]] + def inproduct(v: Vec[T]) -> T: # Same as Iterable[tuple[T, T]] return sum(x*y for x, y in v) .. versionchanged:: 3.7 @@ -317,7 +321,7 @@ comparable for equality. The :data:`Any` type --------------------- +==================== A special kind of type is :data:`Any`. A static type checker will treat every type as being compatible with :data:`Any` and :data:`Any` as being @@ -395,19 +399,19 @@ manner. Use :data:`Any` to indicate that a value is dynamically typed. Nominal vs structural subtyping -------------------------------- +=============================== Initially :pep:`484` defined Python static type system as using *nominal subtyping*. This means that a class ``A`` is allowed where a class ``B`` is expected if and only if ``A`` is a subclass of ``B``. This requirement previously also applied to abstract base classes, such as -:class:`Iterable`. The problem with this approach is that a class had +:class:`~collections.abc.Iterable`. The problem with this approach is that a class had to be explicitly marked to support them, which is unpythonic and unlike what one would normally do in idiomatic dynamically typed Python code. -For example, this conforms to the :pep:`484`:: +For example, this conforms to :pep:`484`:: - from typing import Sized, Iterable, Iterator + from collections.abc import Sized, Iterable, Iterator class Bucket(Sized, Iterable[int]): ... @@ -420,7 +424,7 @@ allowing ``Bucket`` to be implicitly considered a subtype of both ``Sized`` and ``Iterable[int]`` by static type checkers. This is known as *structural subtyping* (or static duck-typing):: - from typing import Iterator, Iterable + from collections.abc import Iterator, Iterable class Bucket: # Note: no base classes ... @@ -434,106 +438,152 @@ Moreover, by subclassing a special class :class:`Protocol`, a user can define new custom protocols to fully enjoy structural subtyping (see examples below). +Module contents +=============== -Classes, functions, and decorators ----------------------------------- +The module defines the following classes, functions and decorators. -The module defines the following classes, functions and decorators: +.. note:: -.. class:: TypeVar + This module defines several types that are subclasses of pre-existing + standard library classes which also extend :class:`Generic` + to support type variables inside ``[]``. + These types became redundant in Python 3.9 when the + corresponding pre-existing classes were enhanced to support ``[]``. - Type variable. + The redundant types are deprecated as of Python 3.9 but no + deprecation warnings will be issued by the interpreter. + It is expected that type checkers will flag the deprecated types + when the checked program targets Python 3.9 or newer. - Usage:: + The deprecated types will be removed from the :mod:`typing` module + in the first Python version released 5 years after the release of Python 3.9.0. + See details in :pep:`585`—*Type Hinting Generics In Standard Collections*. - T = TypeVar('T') # Can be anything - A = TypeVar('A', str, bytes) # Must be str or bytes - Type variables exist primarily for the benefit of static type - checkers. They serve as the parameters for generic types as well - as for generic function definitions. See class Generic for more - information on generic types. Generic functions work as follows:: +Special typing primitives +------------------------- - def repeat(x: T, n: int) -> Sequence[T]: - """Return a list containing n references to x.""" - return [x]*n +Special types +""""""""""""" - def longest(x: A, y: A) -> A: - """Return the longest of two strings.""" - return x if len(x) >= len(y) else y +These can be used as types in annotations and do not support ``[]``. - The latter example's signature is essentially the overloading - of ``(str, str) -> str`` and ``(bytes, bytes) -> bytes``. Also note - that if the arguments are instances of some subclass of :class:`str`, - the return type is still plain :class:`str`. +.. data:: Any - At runtime, ``isinstance(x, T)`` will raise :exc:`TypeError`. In general, - :func:`isinstance` and :func:`issubclass` should not be used with types. + Special type indicating an unconstrained type. - Type variables may be marked covariant or contravariant by passing - ``covariant=True`` or ``contravariant=True``. See :pep:`484` for more - details. By default type variables are invariant. Alternatively, - a type variable may specify an upper bound using ``bound=``. - This means that an actual type substituted (explicitly or implicitly) - for the type variable must be a subclass of the boundary type, - see :pep:`484`. + * Every type is compatible with :data:`Any`. + * :data:`Any` is compatible with every type. -.. class:: Generic +.. data:: NoReturn - Abstract base class for generic types. + Special type indicating that a function never returns. + For example:: - A generic type is typically declared by inheriting from an - instantiation of this class with one or more type variables. - For example, a generic mapping type might be defined as:: + from typing import NoReturn - class Mapping(Generic[KT, VT]): - def __getitem__(self, key: KT) -> VT: - ... - # Etc. + def stop() -> NoReturn: + raise RuntimeError('no way') - This class can then be used as follows:: + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.2 - X = TypeVar('X') - Y = TypeVar('Y') +Special forms +""""""""""""" - def lookup_name(mapping: Mapping[X, Y], key: X, default: Y) -> Y: - try: - return mapping[key] - except KeyError: - return default +These can be used as types in annotations using ``[]``, each having a unique syntax. -.. class:: Protocol(Generic) +.. data:: Tuple - Base class for protocol classes. Protocol classes are defined like this:: + Tuple type; ``Tuple[X, Y]`` is the type of a tuple of two items + with the first item of type X and the second of type Y. The type of + the empty tuple can be written as ``Tuple[()]``. - class Proto(Protocol): - def meth(self) -> int: - ... + Example: ``Tuple[T1, T2]`` is a tuple of two elements corresponding + to type variables T1 and T2. ``Tuple[int, float, str]`` is a tuple + of an int, a float and a string. - Such classes are primarily used with static type checkers that recognize - structural subtyping (static duck-typing), for example:: + To specify a variable-length tuple of homogeneous type, + use literal ellipsis, e.g. ``Tuple[int, ...]``. A plain :data:`Tuple` + is equivalent to ``Tuple[Any, ...]``, and in turn to :class:`tuple`. - class C: - def meth(self) -> int: - return 0 + .. deprecated:: 3.9 + :class:`builtins.tuple ` now supports ``[]``. See :pep:`585`. - def func(x: Proto) -> int: - return x.meth() +.. data:: Union - func(C()) # Passes static type check + Union type; ``Union[X, Y]`` means either X or Y. - See :pep:`544` for details. Protocol classes decorated with - :func:`runtime_checkable` (described later) act as simple-minded runtime - protocols that check only the presence of given attributes, ignoring their - type signatures. + To define a union, use e.g. ``Union[int, str]``. Details: - Protocol classes can be generic, for example:: + * The arguments must be types and there must be at least one. - class GenProto(Protocol[T]): - def meth(self) -> T: - ... + * Unions of unions are flattened, e.g.:: - .. versionadded:: 3.8 + Union[Union[int, str], float] == Union[int, str, float] + + * Unions of a single argument vanish, e.g.:: + + Union[int] == int # The constructor actually returns int + + * Redundant arguments are skipped, e.g.:: + + Union[int, str, int] == Union[int, str] + + * When comparing unions, the argument order is ignored, e.g.:: + + Union[int, str] == Union[str, int] + + * You cannot subclass or instantiate a union. + + * You cannot write ``Union[X][Y]``. + + * You can use ``Optional[X]`` as a shorthand for ``Union[X, None]``. + + .. versionchanged:: 3.7 + Don't remove explicit subclasses from unions at runtime. + +.. data:: Optional + + Optional type. + + ``Optional[X]`` is equivalent to ``Union[X, None]``. + + Note that this is not the same concept as an optional argument, + which is one that has a default. An optional argument with a + default does not require the ``Optional`` qualifier on its type + annotation just because it is optional. For example:: + + def foo(arg: int = 0) -> None: + ... + + On the other hand, if an explicit value of ``None`` is allowed, the + use of ``Optional`` is appropriate, whether the argument is optional + or not. For example:: + + def foo(arg: Optional[int] = None) -> None: + ... + +.. data:: Callable + + Callable type; ``Callable[[int], str]`` is a function of (int) -> str. + + The subscription syntax must always be used with exactly two + values: the argument list and the return type. The argument list + must be a list of types or an ellipsis; the return type must be + a single type. + + There is no syntax to indicate optional or keyword arguments; + such function types are rarely used as callback types. + ``Callable[..., ReturnType]`` (literal ellipsis) can be used to + type hint a callable taking any number of arguments and returning + ``ReturnType``. A plain :data:`Callable` is equivalent to + ``Callable[..., Any]``, and in turn to + :class:`collections.abc.Callable`. + + .. deprecated:: 3.9 + :class:`collections.abc.Callable` now supports ``[]``. See :pep:`585`. .. class:: Type(Generic[CT_co]) @@ -577,239 +627,694 @@ The module defines the following classes, functions and decorators: .. versionadded:: 3.5.2 -.. class:: Iterable(Generic[T_co]) + .. deprecated:: 3.9 + :class:`builtins.type ` now supports ``[]``. See :pep:`585`. - A generic version of :class:`collections.abc.Iterable`. +.. data:: Literal -.. class:: Iterator(Iterable[T_co]) + A type that can be used to indicate to type checkers that the + corresponding variable or function parameter has a value equivalent to + the provided literal (or one of several literals). For example:: - A generic version of :class:`collections.abc.Iterator`. + def validate_simple(data: Any) -> Literal[True]: # always returns True + ... -.. class:: Reversible(Iterable[T_co]) + MODE = Literal['r', 'rb', 'w', 'wb'] + def open_helper(file: str, mode: MODE) -> str: + ... - A generic version of :class:`collections.abc.Reversible`. + open_helper('/some/path', 'r') # Passes type check + open_helper('/other/path', 'typo') # Error in type checker -.. class:: SupportsInt + ``Literal[...]`` cannot be subclassed. At runtime, an arbitrary value + is allowed as type argument to ``Literal[...]``, but type checkers may + impose restrictions. See :pep:`586` for more details about literal types. - An ABC with one abstract method ``__int__``. + .. versionadded:: 3.8 -.. class:: SupportsFloat +.. data:: ClassVar - An ABC with one abstract method ``__float__``. + Special type construct to mark class variables. -.. class:: SupportsComplex + As introduced in :pep:`526`, a variable annotation wrapped in ClassVar + indicates that a given attribute is intended to be used as a class variable + and should not be set on instances of that class. Usage:: - An ABC with one abstract method ``__complex__``. + class Starship: + stats: ClassVar[dict[str, int]] = {} # class variable + damage: int = 10 # instance variable -.. class:: SupportsBytes + :data:`ClassVar` accepts only types and cannot be further subscribed. - An ABC with one abstract method ``__bytes__``. + :data:`ClassVar` is not a class itself, and should not + be used with :func:`isinstance` or :func:`issubclass`. + :data:`ClassVar` does not change Python runtime behavior, but + it can be used by third-party type checkers. For example, a type checker + might flag the following code as an error:: -.. class:: SupportsIndex + enterprise_d = Starship(3000) + enterprise_d.stats = {} # Error, setting class variable on instance + Starship.stats = {} # This is OK - An ABC with one abstract method ``__index__``. + .. versionadded:: 3.5.3 - .. versionadded:: 3.8 +.. data:: Final -.. class:: SupportsAbs + A special typing construct to indicate to type checkers that a name + cannot be re-assigned or overridden in a subclass. For example:: - An ABC with one abstract method ``__abs__`` that is covariant - in its return type. + MAX_SIZE: Final = 9000 + MAX_SIZE += 1 # Error reported by type checker -.. class:: SupportsRound + class Connection: + TIMEOUT: Final[int] = 10 - An ABC with one abstract method ``__round__`` - that is covariant in its return type. + class FastConnector(Connection): + TIMEOUT = 1 # Error reported by type checker -.. class:: Container(Generic[T_co]) + There is no runtime checking of these properties. See :pep:`591` for + more details. - A generic version of :class:`collections.abc.Container`. + .. versionadded:: 3.8 -.. class:: Hashable +.. data:: Annotated - An alias to :class:`collections.abc.Hashable` + A type, introduced in :pep:`593` (``Flexible function and variable + annotations``), to decorate existing types with context-specific metadata + (possibly multiple pieces of it, as ``Annotated`` is variadic). + Specifically, a type ``T`` can be annotated with metadata ``x`` via the + typehint ``Annotated[T, x]``. This metadata can be used for either static + analysis or at runtime. If a library (or tool) encounters a typehint + ``Annotated[T, x]`` and has no special logic for metadata ``x``, it + should ignore it and simply treat the type as ``T``. Unlike the + ``no_type_check`` functionality that currently exists in the ``typing`` + module which completely disables typechecking annotations on a function + or a class, the ``Annotated`` type allows for both static typechecking + of ``T`` (e.g., via mypy or Pyre, which can safely ignore ``x``) + together with runtime access to ``x`` within a specific application. -.. class:: Sized + Ultimately, the responsibility of how to interpret the annotations (if + at all) is the responsibility of the tool or library encountering the + ``Annotated`` type. A tool or library encountering an ``Annotated`` type + can scan through the annotations to determine if they are of interest + (e.g., using ``isinstance()``). - An alias to :class:`collections.abc.Sized` + When a tool or a library does not support annotations or encounters an + unknown annotation it should just ignore it and treat annotated type as + the underlying type. -.. class:: Collection(Sized, Iterable[T_co], Container[T_co]) + It's up to the tool consuming the annotations to decide whether the + client is allowed to have several annotations on one type and how to + merge those annotations. - A generic version of :class:`collections.abc.Collection` + Since the ``Annotated`` type allows you to put several annotations of + the same (or different) type(s) on any node, the tools or libraries + consuming those annotations are in charge of dealing with potential + duplicates. For example, if you are doing value range analysis you might + allow this:: - .. versionadded:: 3.6.0 + T1 = Annotated[int, ValueRange(-10, 5)] + T2 = Annotated[T1, ValueRange(-20, 3)] -.. class:: AbstractSet(Sized, Collection[T_co]) + Passing ``include_extras=True`` to :func:`get_type_hints` lets one + access the extra annotations at runtime. - A generic version of :class:`collections.abc.Set`. + The details of the syntax: -.. class:: MutableSet(AbstractSet[T]) + * The first argument to ``Annotated`` must be a valid type - A generic version of :class:`collections.abc.MutableSet`. + * Multiple type annotations are supported (``Annotated`` supports variadic + arguments):: -.. class:: Mapping(Sized, Collection[KT], Generic[VT_co]) + Annotated[int, ValueRange(3, 10), ctype("char")] - A generic version of :class:`collections.abc.Mapping`. - This type can be used as follows:: + * ``Annotated`` must be called with at least two arguments ( + ``Annotated[int]`` is not valid) - def get_position_in_index(word_list: Mapping[str, int], word: str) -> int: - return word_list[word] + * The order of the annotations is preserved and matters for equality + checks:: -.. class:: MutableMapping(Mapping[KT, VT]) + Annotated[int, ValueRange(3, 10), ctype("char")] != Annotated[ + int, ctype("char"), ValueRange(3, 10) + ] - A generic version of :class:`collections.abc.MutableMapping`. + * Nested ``Annotated`` types are flattened, with metadata ordered + starting with the innermost annotation:: -.. class:: Sequence(Reversible[T_co], Collection[T_co]) + Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[ + int, ValueRange(3, 10), ctype("char") + ] - A generic version of :class:`collections.abc.Sequence`. + * Duplicated annotations are not removed:: -.. class:: MutableSequence(Sequence[T]) + Annotated[int, ValueRange(3, 10)] != Annotated[ + int, ValueRange(3, 10), ValueRange(3, 10) + ] - A generic version of :class:`collections.abc.MutableSequence`. + * ``Annotated`` can be used with nested and generic aliases:: -.. class:: ByteString(Sequence[int]) + T = TypeVar('T') + Vec = Annotated[list[tuple[T, T]], MaxLen(10)] + V = Vec[int] - A generic version of :class:`collections.abc.ByteString`. + V == Annotated[list[tuple[int, int]], MaxLen(10)] - This type represents the types :class:`bytes`, :class:`bytearray`, - and :class:`memoryview` of byte sequences. + .. versionadded:: 3.9 - As a shorthand for this type, :class:`bytes` can be used to - annotate arguments of any of the types mentioned above. +Building generic types +"""""""""""""""""""""" -.. class:: Deque(deque, MutableSequence[T]) +These are not used in annotations. They are building blocks for creating generic types. - A generic version of :class:`collections.deque`. +.. class:: Generic - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.1 + Abstract base class for generic types. -.. class:: List(list, MutableSequence[T]) + A generic type is typically declared by inheriting from an + instantiation of this class with one or more type variables. + For example, a generic mapping type might be defined as:: - Generic version of :class:`list`. + class Mapping(Generic[KT, VT]): + def __getitem__(self, key: KT) -> VT: + ... + # Etc. + + This class can then be used as follows:: + + X = TypeVar('X') + Y = TypeVar('Y') + + def lookup_name(mapping: Mapping[X, Y], key: X, default: Y) -> Y: + try: + return mapping[key] + except KeyError: + return default + +.. class:: TypeVar + + Type variable. + + Usage:: + + T = TypeVar('T') # Can be anything + A = TypeVar('A', str, bytes) # Must be str or bytes + + Type variables exist primarily for the benefit of static type + checkers. They serve as the parameters for generic types as well + as for generic function definitions. See class Generic for more + information on generic types. Generic functions work as follows:: + + def repeat(x: T, n: int) -> Sequence[T]: + """Return a list containing n references to x.""" + return [x]*n + + def longest(x: A, y: A) -> A: + """Return the longest of two strings.""" + return x if len(x) >= len(y) else y + + The latter example's signature is essentially the overloading + of ``(str, str) -> str`` and ``(bytes, bytes) -> bytes``. Also note + that if the arguments are instances of some subclass of :class:`str`, + the return type is still plain :class:`str`. + + At runtime, ``isinstance(x, T)`` will raise :exc:`TypeError`. In general, + :func:`isinstance` and :func:`issubclass` should not be used with types. + + Type variables may be marked covariant or contravariant by passing + ``covariant=True`` or ``contravariant=True``. See :pep:`484` for more + details. By default type variables are invariant. Alternatively, + a type variable may specify an upper bound using ``bound=``. + This means that an actual type substituted (explicitly or implicitly) + for the type variable must be a subclass of the boundary type, + see :pep:`484`. + +.. data:: AnyStr + + ``AnyStr`` is a type variable defined as + ``AnyStr = TypeVar('AnyStr', str, bytes)``. + + It is meant to be used for functions that may accept any kind of string + without allowing different kinds of strings to mix. For example:: + + def concat(a: AnyStr, b: AnyStr) -> AnyStr: + return a + b + + concat(u"foo", u"bar") # Ok, output has type 'unicode' + concat(b"foo", b"bar") # Ok, output has type 'bytes' + concat(u"foo", b"bar") # Error, cannot mix unicode and bytes + +.. class:: Protocol(Generic) + + Base class for protocol classes. Protocol classes are defined like this:: + + class Proto(Protocol): + def meth(self) -> int: + ... + + Such classes are primarily used with static type checkers that recognize + structural subtyping (static duck-typing), for example:: + + class C: + def meth(self) -> int: + return 0 + + def func(x: Proto) -> int: + return x.meth() + + func(C()) # Passes static type check + + See :pep:`544` for details. Protocol classes decorated with + :func:`runtime_checkable` (described later) act as simple-minded runtime + protocols that check only the presence of given attributes, ignoring their + type signatures. + + Protocol classes can be generic, for example:: + + class GenProto(Protocol[T]): + def meth(self) -> T: + ... + + .. versionadded:: 3.8 + +.. decorator:: runtime_checkable + + Mark a protocol class as a runtime protocol. + + Such a protocol can be used with :func:`isinstance` and :func:`issubclass`. + This raises :exc:`TypeError` when applied to a non-protocol class. This + allows a simple-minded structural check, very similar to "one trick ponies" + in :mod:`collections.abc` such as :class:`~collections.abc.Iterable`. For example:: + + @runtime_checkable + class Closable(Protocol): + def close(self): ... + + assert isinstance(open('/some/file'), Closable) + + .. note:: + + :func:`runtime_checkable` will check only the presence of the required methods, + not their type signatures! For example, :class:`builtins.complex ` + implements :func:`__float__`, therefore it passes an :func:`issubclass` check + against :class:`SupportsFloat`. However, the ``complex.__float__`` method + exists only to raise a :class:`TypeError` with a more informative message. + + .. versionadded:: 3.8 + +Other special directives +"""""""""""""""""""""""" + +These are not used in annotations. They are building blocks for declaring types. + +.. class:: NamedTuple + + Typed version of :func:`collections.namedtuple`. + + Usage:: + + class Employee(NamedTuple): + name: str + id: int + + This is equivalent to:: + + Employee = collections.namedtuple('Employee', ['name', 'id']) + + To give a field a default value, you can assign to it in the class body:: + + class Employee(NamedTuple): + name: str + id: int = 3 + + employee = Employee('Guido') + assert employee.id == 3 + + Fields with a default value must come after any fields without a default. + + The resulting class has an extra attribute ``__annotations__`` giving a + dict that maps the field names to the field types. (The field names are in + the ``_fields`` attribute and the default values are in the + ``_field_defaults`` attribute both of which are part of the namedtuple + API.) + + ``NamedTuple`` subclasses can also have docstrings and methods:: + + class Employee(NamedTuple): + """Represents an employee.""" + name: str + id: int = 3 + + def __repr__(self) -> str: + return f'' + + Backward-compatible usage:: + + Employee = NamedTuple('Employee', [('name', str), ('id', int)]) + + .. versionchanged:: 3.6 + Added support for :pep:`526` variable annotation syntax. + + .. versionchanged:: 3.6.1 + Added support for default values, methods, and docstrings. + + .. versionchanged:: 3.8 + The ``_field_types`` and ``__annotations__`` attributes are + now regular dictionaries instead of instances of ``OrderedDict``. + + .. versionchanged:: 3.9 + Removed the ``_field_types`` attribute in favor of the more + standard ``__annotations__`` attribute which has the same information. + +.. function:: NewType(name, tp) + + A helper function to indicate a distinct type to a typechecker, + see :ref:`distinct`. At runtime it returns a function that returns + its argument. Usage:: + + UserId = NewType('UserId', int) + first_user = UserId(1) + + .. versionadded:: 3.5.2 + +.. class:: TypedDict(dict) + + Special construct to add type hints to a dictionary. + At runtime it is a plain :class:`dict`. + + ``TypedDict`` declares a dictionary type that expects all of its + instances to have a certain set of keys, where each key is + associated with a value of a consistent type. This expectation + is not checked at runtime but is only enforced by type checkers. + Usage:: + + class Point2D(TypedDict): + x: int + y: int + label: str + + a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK + b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check + + assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') + + The type info for introspection can be accessed via ``Point2D.__annotations__`` + and ``Point2D.__total__``. To allow using this feature with older versions + of Python that do not support :pep:`526`, ``TypedDict`` supports two additional + equivalent syntactic forms:: + + Point2D = TypedDict('Point2D', x=int, y=int, label=str) + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) + + By default, all keys must be present in a TypedDict. It is possible + to override this by specifying totality. + Usage:: + + class point2D(TypedDict, total=False): + x: int + y: int + + This means that a point2D TypedDict can have any of the keys omitted. A type + checker is only expected to support a literal False or True as the value of + the total argument. True is the default, and makes all items defined in the + class body be required. + + See :pep:`589` for more examples and detailed rules of using ``TypedDict``. + + .. versionadded:: 3.8 + +Generic concrete collections +---------------------------- + +Corresponding to built-in types +""""""""""""""""""""""""""""""" + +.. class:: Dict(dict, MutableMapping[KT, VT]) + + A generic version of :class:`dict`. + Useful for annotating return types. To annotate arguments it is preferred + to use an abstract collection type such as :class:`Mapping`. + + This type can be used as follows:: + + def count_words(text: str) -> Dict[str, int]: + ... + + .. deprecated:: 3.9 + :class:`builtins.dict ` now supports ``[]``. See :pep:`585`. + +.. class:: List(list, MutableSequence[T]) + + Generic version of :class:`list`. Useful for annotating return types. To annotate arguments it is preferred to use an abstract collection type such as :class:`Sequence` or :class:`Iterable`. - This type may be used as follows:: + This type may be used as follows:: + + T = TypeVar('T', int, float) + + def vec2(x: T, y: T) -> List[T]: + return [x, y] + + def keep_positives(vector: Sequence[T]) -> List[T]: + return [item for item in vector if item > 0] + + .. deprecated:: 3.9 + :class:`builtins.list ` now supports ``[]``. See :pep:`585`. + +.. class:: Set(set, MutableSet[T]) + + A generic version of :class:`builtins.set `. + Useful for annotating return types. To annotate arguments it is preferred + to use an abstract collection type such as :class:`AbstractSet`. + + .. deprecated:: 3.9 + :class:`builtins.set ` now supports ``[]``. See :pep:`585`. + +.. class:: FrozenSet(frozenset, AbstractSet[T_co]) + + A generic version of :class:`builtins.frozenset `. + + .. deprecated:: 3.9 + :class:`builtins.frozenset ` now supports ``[]``. See :pep:`585`. + +.. note:: :data:`Tuple` is a special form. + +Corresponding to types in :mod:`collections` +"""""""""""""""""""""""""""""""""""""""""""" + +.. class:: DefaultDict(collections.defaultdict, MutableMapping[KT, VT]) + + A generic version of :class:`collections.defaultdict`. + + .. versionadded:: 3.5.2 + + .. deprecated:: 3.9 + :class:`collections.defaultdict` now supports ``[]``. See :pep:`585`. + +.. class:: OrderedDict(collections.OrderedDict, MutableMapping[KT, VT]) + + A generic version of :class:`collections.OrderedDict`. + + .. versionadded:: 3.7.2 + + .. deprecated:: 3.9 + :class:`collections.OrderedDict` now supports ``[]``. See :pep:`585`. + +.. class:: ChainMap(collections.ChainMap, MutableMapping[KT, VT]) + + A generic version of :class:`collections.ChainMap`. + + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.1 + + .. deprecated:: 3.9 + :class:`collections.ChainMap` now supports ``[]``. See :pep:`585`. + +.. class:: Counter(collections.Counter, Dict[T, int]) + + A generic version of :class:`collections.Counter`. + + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.1 + + .. deprecated:: 3.9 + :class:`collections.Counter` now supports ``[]``. See :pep:`585`. + +.. class:: Deque(deque, MutableSequence[T]) + + A generic version of :class:`collections.deque`. + + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.1 + + .. deprecated:: 3.9 + :class:`collections.deque` now supports ``[]``. See :pep:`585`. + +Other concrete types +"""""""""""""""""""" + +.. class:: IO + TextIO + BinaryIO + + Generic type ``IO[AnyStr]`` and its subclasses ``TextIO(IO[str])`` + and ``BinaryIO(IO[bytes])`` + represent the types of I/O streams such as returned by + :func:`open`. These types are also in the ``typing.io`` namespace. + +.. class:: Pattern + Match + + These type aliases + correspond to the return types from :func:`re.compile` and + :func:`re.match`. These types (and the corresponding functions) + are generic in ``AnyStr`` and can be made specific by writing + ``Pattern[str]``, ``Pattern[bytes]``, ``Match[str]``, or + ``Match[bytes]``. These types are also in the ``typing.re`` namespace. + + .. deprecated:: 3.9 + Classes ``Pattern`` and ``Match`` from :mod:`re` now support ``[]``. See :pep:`585`. + +.. class:: Text + + ``Text`` is an alias for ``str``. It is provided to supply a forward + compatible path for Python 2 code: in Python 2, ``Text`` is an alias for + ``unicode``. + + Use ``Text`` to indicate that a value must contain a unicode string in + a manner that is compatible with both Python 2 and Python 3:: - T = TypeVar('T', int, float) + def add_unicode_checkmark(text: Text) -> Text: + return text + u' \u2713' - def vec2(x: T, y: T) -> List[T]: - return [x, y] + .. versionadded:: 3.5.2 - def keep_positives(vector: Sequence[T]) -> List[T]: - return [item for item in vector if item > 0] +Abstract Base Classes +--------------------- -.. class:: Set(set, MutableSet[T]) +Corresponding to collections in :mod:`collections.abc` +"""""""""""""""""""""""""""""""""""""""""""""""""""""" - A generic version of :class:`builtins.set `. - Useful for annotating return types. To annotate arguments it is preferred - to use an abstract collection type such as :class:`AbstractSet`. +.. class:: AbstractSet(Sized, Collection[T_co]) -.. class:: FrozenSet(frozenset, AbstractSet[T_co]) + A generic version of :class:`collections.abc.Set`. - A generic version of :class:`builtins.frozenset `. + .. deprecated:: 3.9 + :class:`collections.abc.Set` now supports ``[]``. See :pep:`585`. -.. class:: MappingView(Sized, Iterable[T_co]) +.. class:: ByteString(Sequence[int]) - A generic version of :class:`collections.abc.MappingView`. + A generic version of :class:`collections.abc.ByteString`. -.. class:: KeysView(MappingView[KT_co], AbstractSet[KT_co]) + This type represents the types :class:`bytes`, :class:`bytearray`, + and :class:`memoryview` of byte sequences. - A generic version of :class:`collections.abc.KeysView`. + As a shorthand for this type, :class:`bytes` can be used to + annotate arguments of any of the types mentioned above. -.. class:: ItemsView(MappingView, Generic[KT_co, VT_co]) + .. deprecated:: 3.9 + :class:`collections.abc.ByteString` now supports ``[]``. See :pep:`585`. - A generic version of :class:`collections.abc.ItemsView`. +.. class:: Collection(Sized, Iterable[T_co], Container[T_co]) -.. class:: ValuesView(MappingView[VT_co]) + A generic version of :class:`collections.abc.Collection` - A generic version of :class:`collections.abc.ValuesView`. + .. versionadded:: 3.6.0 -.. class:: Awaitable(Generic[T_co]) + .. deprecated:: 3.9 + :class:`collections.abc.Collection` now supports ``[]``. See :pep:`585`. - A generic version of :class:`collections.abc.Awaitable`. +.. class:: Container(Generic[T_co]) - .. versionadded:: 3.5.2 + A generic version of :class:`collections.abc.Container`. -.. class:: Coroutine(Awaitable[V_co], Generic[T_co, T_contra, V_co]) + .. deprecated:: 3.9 + :class:`collections.abc.Container` now supports ``[]``. See :pep:`585`. - A generic version of :class:`collections.abc.Coroutine`. - The variance and order of type variables - correspond to those of :class:`Generator`, for example:: +.. class:: ItemsView(MappingView, Generic[KT_co, VT_co]) - from typing import List, Coroutine - c = None # type: Coroutine[List[str], str, int] - ... - x = c.send('hi') # type: List[str] - async def bar() -> None: - x = await c # type: int + A generic version of :class:`collections.abc.ItemsView`. - .. versionadded:: 3.5.3 + .. deprecated:: 3.9 + :class:`collections.abc.ItemsView` now supports ``[]``. See :pep:`585`. -.. class:: AsyncIterable(Generic[T_co]) +.. class:: KeysView(MappingView[KT_co], AbstractSet[KT_co]) - A generic version of :class:`collections.abc.AsyncIterable`. + A generic version of :class:`collections.abc.KeysView`. - .. versionadded:: 3.5.2 + .. deprecated:: 3.9 + :class:`collections.abc.KeysView` now supports ``[]``. See :pep:`585`. -.. class:: AsyncIterator(AsyncIterable[T_co]) +.. class:: Mapping(Sized, Collection[KT], Generic[VT_co]) - A generic version of :class:`collections.abc.AsyncIterator`. + A generic version of :class:`collections.abc.Mapping`. + This type can be used as follows:: - .. versionadded:: 3.5.2 + def get_position_in_index(word_list: Mapping[str, int], word: str) -> int: + return word_list[word] -.. class:: ContextManager(Generic[T_co]) + .. deprecated:: 3.9 + :class:`collections.abc.Mapping` now supports ``[]``. See :pep:`585`. - A generic version of :class:`contextlib.AbstractContextManager`. +.. class:: MappingView(Sized, Iterable[T_co]) - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.0 + A generic version of :class:`collections.abc.MappingView`. -.. class:: AsyncContextManager(Generic[T_co]) + .. deprecated:: 3.9 + :class:`collections.abc.MappingView` now supports ``[]``. See :pep:`585`. - A generic version of :class:`contextlib.AbstractAsyncContextManager`. +.. class:: MutableMapping(Mapping[KT, VT]) - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.2 + A generic version of :class:`collections.abc.MutableMapping`. -.. class:: Dict(dict, MutableMapping[KT, VT]) + .. deprecated:: 3.9 + :class:`collections.abc.MutableMapping` now supports ``[]``. See :pep:`585`. - A generic version of :class:`dict`. - Useful for annotating return types. To annotate arguments it is preferred - to use an abstract collection type such as :class:`Mapping`. +.. class:: MutableSequence(Sequence[T]) - This type can be used as follows:: + A generic version of :class:`collections.abc.MutableSequence`. - def count_words(text: str) -> Dict[str, int]: - ... + .. deprecated:: 3.9 + :class:`collections.abc.MutableSequence` now supports ``[]``. See :pep:`585`. -.. class:: DefaultDict(collections.defaultdict, MutableMapping[KT, VT]) +.. class:: MutableSet(AbstractSet[T]) - A generic version of :class:`collections.defaultdict`. + A generic version of :class:`collections.abc.MutableSet`. - .. versionadded:: 3.5.2 + .. deprecated:: 3.9 + :class:`collections.abc.MutableSet` now supports ``[]``. See :pep:`585`. -.. class:: OrderedDict(collections.OrderedDict, MutableMapping[KT, VT]) +.. class:: Sequence(Reversible[T_co], Collection[T_co]) - A generic version of :class:`collections.OrderedDict`. + A generic version of :class:`collections.abc.Sequence`. - .. versionadded:: 3.7.2 + .. deprecated:: 3.9 + :class:`collections.abc.Sequence` now supports ``[]``. See :pep:`585`. -.. class:: Counter(collections.Counter, Dict[T, int]) +.. class:: ValuesView(MappingView[VT_co]) - A generic version of :class:`collections.Counter`. + A generic version of :class:`collections.abc.ValuesView`. - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.1 + .. deprecated:: 3.9 + :class:`collections.abc.ValuesView` now supports ``[]``. See :pep:`585`. -.. class:: ChainMap(collections.ChainMap, MutableMapping[KT, VT]) +Corresponding to other types in :mod:`collections.abc` +"""""""""""""""""""""""""""""""""""""""""""""""""""""" - A generic version of :class:`collections.ChainMap`. +.. class:: Iterable(Generic[T_co]) - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.1 + A generic version of :class:`collections.abc.Iterable`. + + .. deprecated:: 3.9 + :class:`collections.abc.Iterable` now supports ``[]``. See :pep:`585`. + +.. class:: Iterator(Iterable[T_co]) + + A generic version of :class:`collections.abc.Iterator`. + + .. deprecated:: 3.9 + :class:`collections.abc.Iterator` now supports ``[]``. See :pep:`585`. .. class:: Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]) @@ -842,6 +1347,45 @@ The module defines the following classes, functions and decorators: yield start start += 1 + .. deprecated:: 3.9 + :class:`collections.abc.Generator` now supports ``[]``. See :pep:`585`. + +.. class:: Hashable + + An alias to :class:`collections.abc.Hashable` + +.. class:: Reversible(Iterable[T_co]) + + A generic version of :class:`collections.abc.Reversible`. + + .. deprecated:: 3.9 + :class:`collections.abc.Reversible` now supports ``[]``. See :pep:`585`. + +.. class:: Sized + + An alias to :class:`collections.abc.Sized` + +Asynchronous programming +"""""""""""""""""""""""" + +.. class:: Coroutine(Awaitable[V_co], Generic[T_co, T_contra, V_co]) + + A generic version of :class:`collections.abc.Coroutine`. + The variance and order of type variables + correspond to those of :class:`Generator`, for example:: + + from collections.abc import Coroutine + c = None # type: Coroutine[list[str], str, int] + ... + x = c.send('hi') # type: list[str] + async def bar() -> None: + x = await c # type: int + + .. versionadded:: 3.5.3 + + .. deprecated:: 3.9 + :class:`collections.abc.Coroutine` now supports ``[]``. See :pep:`585`. + .. class:: AsyncGenerator(AsyncIterator[T_co], Generic[T_co, T_contra]) An async generator can be annotated by the generic type @@ -875,161 +1419,99 @@ The module defines the following classes, functions and decorators: .. versionadded:: 3.6.1 -.. class:: Text - - ``Text`` is an alias for ``str``. It is provided to supply a forward - compatible path for Python 2 code: in Python 2, ``Text`` is an alias for - ``unicode``. + .. deprecated:: 3.9 + :class:`collections.abc.AsyncGenerator` now supports ``[]``. See :pep:`585`. - Use ``Text`` to indicate that a value must contain a unicode string in - a manner that is compatible with both Python 2 and Python 3:: +.. class:: AsyncIterable(Generic[T_co]) - def add_unicode_checkmark(text: Text) -> Text: - return text + u' \u2713' + A generic version of :class:`collections.abc.AsyncIterable`. .. versionadded:: 3.5.2 -.. class:: IO - TextIO - BinaryIO - - Generic type ``IO[AnyStr]`` and its subclasses ``TextIO(IO[str])`` - and ``BinaryIO(IO[bytes])`` - represent the types of I/O streams such as returned by - :func:`open`. - -.. class:: Pattern - Match - - These type aliases - correspond to the return types from :func:`re.compile` and - :func:`re.match`. These types (and the corresponding functions) - are generic in ``AnyStr`` and can be made specific by writing - ``Pattern[str]``, ``Pattern[bytes]``, ``Match[str]``, or - ``Match[bytes]``. - -.. class:: NamedTuple - - Typed version of :func:`collections.namedtuple`. - - Usage:: + .. deprecated:: 3.9 + :class:`collections.abc.AsyncIterable` now supports ``[]``. See :pep:`585`. - class Employee(NamedTuple): - name: str - id: int +.. class:: AsyncIterator(AsyncIterable[T_co]) - This is equivalent to:: + A generic version of :class:`collections.abc.AsyncIterator`. - Employee = collections.namedtuple('Employee', ['name', 'id']) + .. versionadded:: 3.5.2 - To give a field a default value, you can assign to it in the class body:: + .. deprecated:: 3.9 + :class:`collections.abc.AsyncIterator` now supports ``[]``. See :pep:`585`. - class Employee(NamedTuple): - name: str - id: int = 3 +.. class:: Awaitable(Generic[T_co]) - employee = Employee('Guido') - assert employee.id == 3 + A generic version of :class:`collections.abc.Awaitable`. - Fields with a default value must come after any fields without a default. + .. versionadded:: 3.5.2 - The resulting class has an extra attribute ``__annotations__`` giving a - dict that maps the field names to the field types. (The field names are in - the ``_fields`` attribute and the default values are in the - ``_field_defaults`` attribute both of which are part of the namedtuple - API.) + .. deprecated:: 3.9 + :class:`collections.abc.Awaitable` now supports ``[]``. See :pep:`585`. - ``NamedTuple`` subclasses can also have docstrings and methods:: - class Employee(NamedTuple): - """Represents an employee.""" - name: str - id: int = 3 +Context manager types +""""""""""""""""""""" - def __repr__(self) -> str: - return f'' +.. class:: ContextManager(Generic[T_co]) - Backward-compatible usage:: + A generic version of :class:`contextlib.AbstractContextManager`. - Employee = NamedTuple('Employee', [('name', str), ('id', int)]) + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.0 - .. versionchanged:: 3.6 - Added support for :pep:`526` variable annotation syntax. + .. deprecated:: 3.9 + :class:`collections.contextlib.AbstractContextManager` now supports ``[]``. See :pep:`585`. - .. versionchanged:: 3.6.1 - Added support for default values, methods, and docstrings. +.. class:: AsyncContextManager(Generic[T_co]) - .. deprecated-removed:: 3.8 3.9 - Deprecated the ``_field_types`` attribute in favor of the more - standard ``__annotations__`` attribute which has the same information. + A generic version of :class:`contextlib.AbstractAsyncContextManager`. - .. versionchanged:: 3.8 - The ``_field_types`` and ``__annotations__`` attributes are - now regular dictionaries instead of instances of ``OrderedDict``. + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.2 -.. class:: TypedDict(dict) + .. deprecated:: 3.9 + :class:`collections.contextlib.AbstractAsyncContextManager` now supports ``[]``. See :pep:`585`. - A simple typed namespace. At runtime it is equivalent to - a plain :class:`dict`. +Protocols +--------- - ``TypedDict`` creates a dictionary type that expects all of its - instances to have a certain set of keys, where each key is - associated with a value of a consistent type. This expectation - is not checked at runtime but is only enforced by type checkers. - Usage:: +These protocols are decorated with :func:`runtime_checkable`. - class Point2D(TypedDict): - x: int - y: int - label: str +.. class:: SupportsAbs - a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK - b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check + An ABC with one abstract method ``__abs__`` that is covariant + in its return type. - assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') +.. class:: SupportsBytes - The type info for introspection can be accessed via ``Point2D.__annotations__`` - and ``Point2D.__total__``. To allow using this feature with older versions - of Python that do not support :pep:`526`, ``TypedDict`` supports two additional - equivalent syntactic forms:: + An ABC with one abstract method ``__bytes__``. - Point2D = TypedDict('Point2D', x=int, y=int, label=str) - Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) +.. class:: SupportsComplex - By default, all keys must be present in a TypedDict. It is possible - to override this by specifying totality. - Usage:: + An ABC with one abstract method ``__complex__``. - class point2D(TypedDict, total=False): - x: int - y: int +.. class:: SupportsFloat - This means that a point2D TypedDict can have any of the keys omitted. A type - checker is only expected to support a literal False or True as the value of - the total argument. True is the default, and makes all items defined in the - class body be required. + An ABC with one abstract method ``__float__``. - See :pep:`589` for more examples and detailed rules of using ``TypedDict``. +.. class:: SupportsIndex - .. versionadded:: 3.8 + An ABC with one abstract method ``__index__``. -.. class:: ForwardRef + .. versionadded:: 3.8 - A class used for internal typing representation of string forward references. - For example, ``List["SomeClass"]`` is implicitly transformed into - ``List[ForwardRef("SomeClass")]``. This class should not be instantiated by - a user, but may be used by introspection tools. +.. class:: SupportsInt -.. function:: NewType(name, tp) + An ABC with one abstract method ``__int__``. - A helper function to indicate a distinct type to a typechecker, - see :ref:`distinct`. At runtime it returns a function that returns - its argument. Usage:: +.. class:: SupportsRound - UserId = NewType('UserId', int) - first_user = UserId(1) + An ABC with one abstract method ``__round__`` + that is covariant in its return type. - .. versionadded:: 3.5.2 +Functions and decorators +------------------------ .. function:: cast(typ, val) @@ -1040,38 +1522,6 @@ The module defines the following classes, functions and decorators: runtime we intentionally don't check anything (we want this to be as fast as possible). -.. function:: get_type_hints(obj[, globals[, locals]]) - - Return a dictionary containing type hints for a function, method, module - or class object. - - This is often the same as ``obj.__annotations__``. In addition, - forward references encoded as string literals are handled by evaluating - them in ``globals`` and ``locals`` namespaces. If necessary, - ``Optional[t]`` is added for function and method annotations if a default - value equal to ``None`` is set. For a class ``C``, return - a dictionary constructed by merging all the ``__annotations__`` along - ``C.__mro__`` in reverse order. - -.. function:: get_origin(tp) -.. function:: get_args(tp) - - Provide basic introspection for generic types and special typing forms. - - For a typing object of the form ``X[Y, Z, ...]`` these functions return - ``X`` and ``(Y, Z, ...)``. If ``X`` is a generic alias for a builtin or - :mod:`collections` class, it gets normalized to the original class. - For unsupported objects return ``None`` and ``()`` correspondingly. - Examples:: - - assert get_origin(Dict[str, int]) is dict - assert get_args(Dict[int, str]) == (int, str) - - assert get_origin(Union[int, str]) is Union - assert get_args(Union[int, str]) == (int, str) - - .. versionadded:: 3.8 - .. decorator:: overload The ``@overload`` decorator allows describing functions and methods @@ -1090,7 +1540,7 @@ The module defines the following classes, functions and decorators: def process(response: None) -> None: ... @overload - def process(response: int) -> Tuple[int, str]: + def process(response: int) -> tuple[int, str]: ... @overload def process(response: bytes) -> str: @@ -1160,212 +1610,66 @@ The module defines the following classes, functions and decorators: Note that returning instances of private classes is not recommended. It is usually preferable to make such classes public. -.. decorator:: runtime_checkable - - Mark a protocol class as a runtime protocol. - - Such a protocol can be used with :func:`isinstance` and :func:`issubclass`. - This raises :exc:`TypeError` when applied to a non-protocol class. This - allows a simple-minded structural check, very similar to "one trick ponies" - in :mod:`collections.abc` such as :class:`Iterable`. For example:: - - @runtime_checkable - class Closable(Protocol): - def close(self): ... - - assert isinstance(open('/some/file'), Closable) - - **Warning:** this will check only the presence of the required methods, - not their type signatures! - - .. versionadded:: 3.8 - -.. data:: Any - - Special type indicating an unconstrained type. - - * Every type is compatible with :data:`Any`. - * :data:`Any` is compatible with every type. - -.. data:: NoReturn - - Special type indicating that a function never returns. - For example:: - - from typing import NoReturn - - def stop() -> NoReturn: - raise RuntimeError('no way') - - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.2 - -.. data:: Union - - Union type; ``Union[X, Y]`` means either X or Y. - - To define a union, use e.g. ``Union[int, str]``. Details: - - * The arguments must be types and there must be at least one. - - * Unions of unions are flattened, e.g.:: - - Union[Union[int, str], float] == Union[int, str, float] - - * Unions of a single argument vanish, e.g.:: - - Union[int] == int # The constructor actually returns int - - * Redundant arguments are skipped, e.g.:: - - Union[int, str, int] == Union[int, str] - - * When comparing unions, the argument order is ignored, e.g.:: - - Union[int, str] == Union[str, int] - - * You cannot subclass or instantiate a union. - - * You cannot write ``Union[X][Y]``. - - * You can use ``Optional[X]`` as a shorthand for ``Union[X, None]``. - - .. versionchanged:: 3.7 - Don't remove explicit subclasses from unions at runtime. - -.. data:: Optional - - Optional type. - - ``Optional[X]`` is equivalent to ``Union[X, None]``. - - Note that this is not the same concept as an optional argument, - which is one that has a default. An optional argument with a - default does not require the ``Optional`` qualifier on its type - annotation just because it is optional. For example:: - - def foo(arg: int = 0) -> None: - ... - - On the other hand, if an explicit value of ``None`` is allowed, the - use of ``Optional`` is appropriate, whether the argument is optional - or not. For example:: - - def foo(arg: Optional[int] = None) -> None: - ... - -.. data:: Tuple - - Tuple type; ``Tuple[X, Y]`` is the type of a tuple of two items - with the first item of type X and the second of type Y. The type of - the empty tuple can be written as ``Tuple[()]``. - - Example: ``Tuple[T1, T2]`` is a tuple of two elements corresponding - to type variables T1 and T2. ``Tuple[int, float, str]`` is a tuple - of an int, a float and a string. - - To specify a variable-length tuple of homogeneous type, - use literal ellipsis, e.g. ``Tuple[int, ...]``. A plain :data:`Tuple` - is equivalent to ``Tuple[Any, ...]``, and in turn to :class:`tuple`. - -.. data:: Callable - - Callable type; ``Callable[[int], str]`` is a function of (int) -> str. - - The subscription syntax must always be used with exactly two - values: the argument list and the return type. The argument list - must be a list of types or an ellipsis; the return type must be - a single type. - - There is no syntax to indicate optional or keyword arguments; - such function types are rarely used as callback types. - ``Callable[..., ReturnType]`` (literal ellipsis) can be used to - type hint a callable taking any number of arguments and returning - ``ReturnType``. A plain :data:`Callable` is equivalent to - ``Callable[..., Any]``, and in turn to - :class:`collections.abc.Callable`. - -.. data:: Literal - - A type that can be used to indicate to type checkers that the - corresponding variable or function parameter has a value equivalent to - the provided literal (or one of several literals). For example:: - - def validate_simple(data: Any) -> Literal[True]: # always returns True - ... - - MODE = Literal['r', 'rb', 'w', 'wb'] - def open_helper(file: str, mode: MODE) -> str: - ... - - open_helper('/some/path', 'r') # Passes type check - open_helper('/other/path', 'typo') # Error in type checker - - ``Literal[...]`` cannot be subclassed. At runtime, an arbitrary value - is allowed as type argument to ``Literal[...]``, but type checkers may - impose restrictions. See :pep:`586` for more details about literal types. - - .. versionadded:: 3.8 - -.. data:: ClassVar - - Special type construct to mark class variables. +Introspection helpers +--------------------- - As introduced in :pep:`526`, a variable annotation wrapped in ClassVar - indicates that a given attribute is intended to be used as a class variable - and should not be set on instances of that class. Usage:: +.. function:: get_type_hints(obj, globalns=None, localns=None, include_extras=False) - class Starship: - stats: ClassVar[Dict[str, int]] = {} # class variable - damage: int = 10 # instance variable + Return a dictionary containing type hints for a function, method, module + or class object. - :data:`ClassVar` accepts only types and cannot be further subscribed. + This is often the same as ``obj.__annotations__``. In addition, + forward references encoded as string literals are handled by evaluating + them in ``globals`` and ``locals`` namespaces. If necessary, + ``Optional[t]`` is added for function and method annotations if a default + value equal to ``None`` is set. For a class ``C``, return + a dictionary constructed by merging all the ``__annotations__`` along + ``C.__mro__`` in reverse order. - :data:`ClassVar` is not a class itself, and should not - be used with :func:`isinstance` or :func:`issubclass`. - :data:`ClassVar` does not change Python runtime behavior, but - it can be used by third-party type checkers. For example, a type checker - might flag the following code as an error:: + The function recursively replaces all ``Annotated[T, ...]`` with ``T``, + unless ``include_extras`` is set to ``True`` (see :class:`Annotated` for + more information). For example:: - enterprise_d = Starship(3000) - enterprise_d.stats = {} # Error, setting class variable on instance - Starship.stats = {} # This is OK + class Student(NamedTuple): + name: Annotated[str, 'some marker'] - .. versionadded:: 3.5.3 + get_type_hints(Student) == {'name': str} + get_type_hints(Student, include_extras=False) == {'name': str} + get_type_hints(Student, include_extras=True) == { + 'name': Annotated[str, 'some marker'] + } -.. data:: Final + .. versionchanged:: 3.9 + Added ``include_extras`` parameter as part of :pep:`593`. - A special typing construct to indicate to type checkers that a name - cannot be re-assigned or overridden in a subclass. For example:: +.. function:: get_args(tp) +.. function:: get_origin(tp) - MAX_SIZE: Final = 9000 - MAX_SIZE += 1 # Error reported by type checker + Provide basic introspection for generic types and special typing forms. - class Connection: - TIMEOUT: Final[int] = 10 + For a typing object of the form ``X[Y, Z, ...]`` these functions return + ``X`` and ``(Y, Z, ...)``. If ``X`` is a generic alias for a builtin or + :mod:`collections` class, it gets normalized to the original class. + For unsupported objects return ``None`` and ``()`` correspondingly. + Examples:: - class FastConnector(Connection): - TIMEOUT = 1 # Error reported by type checker + assert get_origin(Dict[str, int]) is dict + assert get_args(Dict[int, str]) == (int, str) - There is no runtime checking of these properties. See :pep:`591` for - more details. + assert get_origin(Union[int, str]) is Union + assert get_args(Union[int, str]) == (int, str) .. versionadded:: 3.8 -.. data:: AnyStr - - ``AnyStr`` is a type variable defined as - ``AnyStr = TypeVar('AnyStr', str, bytes)``. - - It is meant to be used for functions that may accept any kind of string - without allowing different kinds of strings to mix. For example:: +.. class:: ForwardRef - def concat(a: AnyStr, b: AnyStr) -> AnyStr: - return a + b + A class used for internal typing representation of string forward references. + For example, ``list["SomeClass"]`` is implicitly transformed into + ``list[ForwardRef("SomeClass")]``. This class should not be instantiated by + a user, but may be used by introspection tools. - concat(u"foo", u"bar") # Ok, output has type 'unicode' - concat(b"foo", b"bar") # Ok, output has type 'bytes' - concat(u"foo", b"bar") # Error, cannot mix unicode and bytes +Constant +-------- .. data:: TYPE_CHECKING @@ -1378,9 +1682,18 @@ The module defines the following classes, functions and decorators: def fun(arg: 'expensive_mod.SomeType') -> None: local_var: expensive_mod.AnotherType = other_fun() - Note that the first type annotation must be enclosed in quotes, making it a + The first type annotation must be enclosed in quotes, making it a "forward reference", to hide the ``expensive_mod`` reference from the interpreter runtime. Type annotations for local variables are not evaluated, so the second annotation does not need to be enclosed in quotes. + .. note:: + + If ``from __future__ import annotations`` is used in Python 3.7 or later, + annotations are not evaluated at function definition time. + Instead, the are stored as strings in ``__annotations__``, + This makes it unnecessary to use quotes around the annotation. + (see :pep:`563`). + .. versionadded:: 3.5.2 + diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst index 225384cf..dade3f26 100644 --- a/Doc/library/unicodedata.rst +++ b/Doc/library/unicodedata.rst @@ -17,8 +17,8 @@ This module provides access to the Unicode Character Database (UCD) which defines character properties for all Unicode characters. The data contained in -this database is compiled from the `UCD version 12.1.0 -`_. +this database is compiled from the `UCD version 13.0.0 +`_. The module uses the same names and symbols as defined by Unicode Standard Annex #44, `"Unicode Character Database" @@ -175,6 +175,6 @@ Examples: .. rubric:: Footnotes -.. [#] http://www.unicode.org/Public/12.1.0/ucd/NameAliases.txt +.. [#] https://www.unicode.org/Public/13.0.0/ucd/NameAliases.txt -.. [#] http://www.unicode.org/Public/12.1.0/ucd/NamedSequences.txt +.. [#] https://www.unicode.org/Public/13.0.0/ucd/NamedSequences.txt diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 34966b38..c5360f91 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -857,7 +857,7 @@ object:: .. class:: AsyncMock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs) - An asynchronous version of :class:`Mock`. The :class:`AsyncMock` object will + An asynchronous version of :class:`MagicMock`. The :class:`AsyncMock` object will behave so the object is recognized as an async function, and the result of a call is an awaitable. @@ -1330,8 +1330,7 @@ patch .. note:: - :func:`patch` is straightforward to use. The key is to do the patching in the - right namespace. See the section `where to patch`_. + The key is to do the patching in the right namespace. See the section `where to patch`_. .. function:: patch(target, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs) @@ -1404,7 +1403,8 @@ patch "as"; very useful if :func:`patch` is creating a mock object for you. :func:`patch` takes arbitrary keyword arguments. These will be passed to - the :class:`Mock` (or *new_callable*) on construction. + :class:`AsyncMock` if the patched object is asynchronous, to + :class:`MagicMock` otherwise or to *new_callable* if specified. ``patch.dict(...)``, ``patch.multiple(...)`` and ``patch.object(...)`` are available for alternate use-cases. diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 67c5fa61..285bb9e8 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -1427,7 +1427,7 @@ Test cases :class:`TextTestResult` in Python 3.2. - .. method:: addCleanup(function, *args, **kwargs) + .. method:: addCleanup(function, /, *args, **kwargs) Add a function to be called after :meth:`tearDown` to cleanup resources used during the test. Functions will be called in reverse order to the diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 25e5cc1a..536cf952 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -42,8 +42,8 @@ or on combining URL components into a URL string. Parse a URL into six components, returning a 6-item :term:`named tuple`. This corresponds to the general structure of a URL: ``scheme://netloc/path;parameters?query#fragment``. - Each tuple item is a string, possibly empty. The components are not broken up in - smaller parts (for example, the network location is a single string), and % + Each tuple item is a string, possibly empty. The components are not broken up + into smaller parts (for example, the network location is a single string), and % escapes are not expanded. The delimiters as shown above are not part of the result, except for a leading slash in the *path* component, which is retained if present. For example: @@ -328,22 +328,22 @@ or on combining URL components into a URL string. .. note:: - If *url* is an absolute URL (that is, starting with ``//`` or ``scheme://``), - the *url*'s host name and/or scheme will be present in the result. For example: + If *url* is an absolute URL (that is, it starts with ``//`` or ``scheme://``), + the *url*'s hostname and/or scheme will be present in the result. For example: - .. doctest:: + .. doctest:: - >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', - ... '//www.python.org/%7Eguido') - 'http://www.python.org/%7Eguido' + >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', + ... '//www.python.org/%7Eguido') + 'http://www.python.org/%7Eguido' - If you do not want that behavior, preprocess the *url* with :func:`urlsplit` and - :func:`urlunsplit`, removing possible *scheme* and *netloc* parts. + If you do not want that behavior, preprocess the *url* with :func:`urlsplit` and + :func:`urlunsplit`, removing possible *scheme* and *netloc* parts. .. versionchanged:: 3.5 - Behaviour updated to match the semantics defined in :rfc:`3986`. + Behavior updated to match the semantics defined in :rfc:`3986`. .. function:: urldefrag(url) @@ -521,11 +521,11 @@ task isn't already covered by the URL parsing functions above. Replace special characters in *string* using the ``%xx`` escape. Letters, digits, and the characters ``'_.-~'`` are never quoted. By default, this - function is intended for quoting the path section of URL. The optional *safe* - parameter specifies additional ASCII characters that should not be quoted - --- its default value is ``'/'``. + function is intended for quoting the path section of a URL. The optional + *safe* parameter specifies additional ASCII characters that should not be + quoted --- its default value is ``'/'``. - *string* may be either a :class:`str` or a :class:`bytes`. + *string* may be either a :class:`str` or a :class:`bytes` object. .. versionchanged:: 3.7 Moved from :rfc:`2396` to :rfc:`3986` for quoting URL strings. "~" is now @@ -547,7 +547,7 @@ task isn't already covered by the URL parsing functions above. .. function:: quote_plus(string, safe='', encoding=None, errors=None) - Like :func:`quote`, but also replace spaces by plus signs, as required for + Like :func:`quote`, but also replace spaces with plus signs, as required for quoting HTML form values when building up a query string to go into a URL. Plus signs in the original string are escaped unless they are included in *safe*. It also does not have *safe* default to ``'/'``. @@ -566,12 +566,12 @@ task isn't already covered by the URL parsing functions above. .. function:: unquote(string, encoding='utf-8', errors='replace') - Replace ``%xx`` escapes by their single-character equivalent. + Replace ``%xx`` escapes with their single-character equivalent. The optional *encoding* and *errors* parameters specify how to decode percent-encoded sequences into Unicode characters, as accepted by the :meth:`bytes.decode` method. - *string* must be a :class:`str`. + *string* may be either a :class:`str` or a :class:`bytes` object. *encoding* defaults to ``'utf-8'``. *errors* defaults to ``'replace'``, meaning invalid sequences are replaced @@ -579,11 +579,16 @@ task isn't already covered by the URL parsing functions above. Example: ``unquote('/El%20Ni%C3%B1o/')`` yields ``'/El Niño/'``. + .. versionchanged:: 3.9 + *string* parameter supports bytes and str objects (previously only str). + + + .. function:: unquote_plus(string, encoding='utf-8', errors='replace') - Like :func:`unquote`, but also replace plus signs by spaces, as required for - unquoting HTML form values. + Like :func:`unquote`, but also replace plus signs with spaces, as required + for unquoting HTML form values. *string* must be a :class:`str`. @@ -592,10 +597,10 @@ task isn't already covered by the URL parsing functions above. .. function:: unquote_to_bytes(string) - Replace ``%xx`` escapes by their single-octet equivalent, and return a + Replace ``%xx`` escapes with their single-octet equivalent, and return a :class:`bytes` object. - *string* may be either a :class:`str` or a :class:`bytes`. + *string* may be either a :class:`str` or a :class:`bytes` object. If it is a :class:`str`, unescaped non-ASCII characters in *string* are encoded into UTF-8 bytes. @@ -626,7 +631,7 @@ task isn't already covered by the URL parsing functions above. When a sequence of two-element tuples is used as the *query* argument, the first element of each tuple is a key and the second is a value. The value element in itself can be a sequence and in that case, if - the optional parameter *doseq* is evaluates to ``True``, individual + the optional parameter *doseq* evaluates to ``True``, individual ``key=value`` pairs separated by ``'&'`` are generated for each element of the value sequence for the key. The order of parameters in the encoded string will match the order of parameter tuples in the sequence. @@ -638,11 +643,12 @@ task isn't already covered by the URL parsing functions above. To reverse this encoding process, :func:`parse_qs` and :func:`parse_qsl` are provided in this module to parse query strings into Python data structures. - Refer to :ref:`urllib examples ` to find out how urlencode - method can be used for generating query string for a URL or data for POST. + Refer to :ref:`urllib examples ` to find out how the + :func:`urllib.parse.urlencode` method can be used for generating the query + string of a URL or data for a POST request. .. versionchanged:: 3.2 - Query parameter supports bytes and string objects. + *query* supports bytes and string objects. .. versionadded:: 3.5 *quote_via* parameter. diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 0edf116f..785ecf8f 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -55,16 +55,8 @@ The :mod:`urllib.request` module defines the following functions: The *cadefault* parameter is ignored. This function always returns an object which can work as a - :term:`context manager` and has methods such as - - * :meth:`~urllib.response.addinfourl.geturl` --- return the URL of the resource retrieved, - commonly used to determine if a redirect was followed - - * :meth:`~urllib.response.addinfourl.info` --- return the meta-information of the page, such as headers, - in the form of an :func:`email.message_from_string` instance (see - `Quick Reference to HTTP Headers `_) - - * :meth:`~urllib.response.addinfourl.getcode` -- return the HTTP status code of the response. + :term:`context manager` and has the properties *url*, *headers*, and *status*. + See :class:`urllib.response.addinfourl` for more detail on these properties. For HTTP and HTTPS URLs, this function returns a :class:`http.client.HTTPResponse` object slightly modified. In addition @@ -1585,9 +1577,42 @@ some point in the future. :synopsis: Response classes used by urllib. The :mod:`urllib.response` module defines functions and classes which define a -minimal file like interface, including ``read()`` and ``readline()``. The -typical response object is an addinfourl instance, which defines an ``info()`` -method and that returns headers and a ``geturl()`` method that returns the url. -Functions defined by this module are used internally by the -:mod:`urllib.request` module. +minimal file-like interface, including ``read()`` and ``readline()``. +Functions defined by this module are used internally by the :mod:`urllib.request` module. +The typical response object is a :class:`urllib.response.addinfourl` instance: + +.. class:: addinfourl + + .. attribute:: url + + URL of the resource retrieved, commonly used to determine if a redirect was followed. + + .. attribute:: headers + + Returns the headers of the response in the form of an :class:`~email.message.EmailMessage` instance. + + .. attribute:: status + + .. versionadded:: 3.9 + + Status code returned by server. + + .. method:: geturl() + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~addinfourl.url`. + + .. method:: info() + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~addinfourl.headers`. + + .. attribute:: code + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~addinfourl.status`. + + .. method:: getstatus() + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~addinfourl.status`. diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index 59b25183..8abadc4d 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -98,7 +98,7 @@ creation according to their needs, the :class:`EnvBuilder` class. .. class:: EnvBuilder(system_site_packages=False, clear=False, \ symlinks=False, upgrade=False, with_pip=False, \ - prompt=None) + prompt=None, upgrade_deps=False) The :class:`EnvBuilder` class accepts the following keyword arguments on instantiation: @@ -122,7 +122,10 @@ creation according to their needs, the :class:`EnvBuilder` class. * ``prompt`` -- a String to be used after virtual environment is activated (defaults to ``None`` which means directory name of the environment would - be used). + be used). If the special string ``"."`` is provided, the basename of the + current directory is used as the prompt. + + * ``upgrade_deps`` -- Update the base venv modules to the latest on PyPI .. versionchanged:: 3.4 Added the ``with_pip`` parameter @@ -130,6 +133,9 @@ creation according to their needs, the :class:`EnvBuilder` class. .. versionadded:: 3.6 Added the ``prompt`` parameter + .. versionadded:: 3.9 + Added the ``upgrade_deps`` parameter + Creators of third-party virtual environment tools will be free to use the provided :class:`EnvBuilder` class as a base class. @@ -186,6 +192,14 @@ creation according to their needs, the :class:`EnvBuilder` class. Installs activation scripts appropriate to the platform into the virtual environment. + .. method:: upgrade_dependencies(context) + + Upgrades the core venv dependency packages (currently ``pip`` and + ``setuptools``) in the environment. This is done by shelling out to the + ``pip`` executable in the environment. + + .. versionadded:: 3.9 + .. method:: post_setup(context) A placeholder method which can be overridden in third party diff --git a/Doc/library/wave.rst b/Doc/library/wave.rst index 60d19a8d..f63e0d3d 100644 --- a/Doc/library/wave.rst +++ b/Doc/library/wave.rst @@ -47,13 +47,6 @@ The :mod:`wave` module defines the following function and exception: .. versionchanged:: 3.4 Added support for unseekable files. -.. function:: openfp(file, mode) - - A synonym for :func:`.open`, maintained for backwards compatibility. - - .. deprecated-removed:: 3.7 3.9 - - .. exception:: Error An error raised when something is impossible because it violates the WAV diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index 0d9f21d2..d3c3a070 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -163,6 +163,8 @@ Extension types can easily be made to support weak references; see application without adding attributes to those objects. This can be especially useful with objects that override attribute accesses. + .. versionchanged:: 3.9 + Added support for ``|`` and ``|=`` operators, specified in :pep:`584`. :class:`WeakKeyDictionary` objects have an additional method that exposes the internal references directly. The references are not guaranteed to @@ -182,6 +184,8 @@ than needed. Mapping class that references values weakly. Entries in the dictionary will be discarded when no strong reference to the value exists any more. + .. versionchanged:: 3.9 + Added support for ``|`` and ``|=`` operators, as specified in :pep:`584`. :class:`WeakValueDictionary` objects have an additional method that has the same issues as the :meth:`keyrefs` method of :class:`WeakKeyDictionary` @@ -227,7 +231,7 @@ objects. .. versionadded:: 3.4 -.. class:: finalize(obj, func, *args, **kwargs) +.. class:: finalize(obj, func, /, *args, **kwargs) Return a callable finalizer object which will be called when *obj* is garbage collected. Unlike an ordinary weak reference, a finalizer diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 8711242d..2c78cd93 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -132,7 +132,8 @@ module documentation. This section lists the differences between the API and ... # Work with dom. -.. method:: Node.writexml(writer, indent="", addindent="", newl="") +.. method:: Node.writexml(writer, indent="", addindent="", newl="", + encoding=None, standalone=None) Write XML to the writer object. The writer receives texts but not bytes as input, it should have a :meth:`write` method which matches that of the file object @@ -144,11 +145,18 @@ module documentation. This section lists the differences between the API and For the :class:`Document` node, an additional keyword argument *encoding* can be used to specify the encoding field of the XML header. + Silimarly, explicitly stating the *standalone* argument causes the + standalone document declarations to be added to the prologue of the XML + document. + If the value is set to `True`, `standalone="yes"` is added, + otherwise it is set to `"no"`. + Not stating the argument will omit the declaration from the document. + .. versionchanged:: 3.8 The :meth:`writexml` method now preserves the attribute order specified by the user. -.. method:: Node.toxml(encoding=None) +.. method:: Node.toxml(encoding=None, standalone=None) Return a string or byte string containing the XML represented by the DOM node. @@ -160,11 +168,14 @@ module documentation. This section lists the differences between the API and encoding. Encoding this string in an encoding other than UTF-8 is likely incorrect, since UTF-8 is the default encoding of XML. + The *standalone* argument behaves exactly as in :meth:`writexml`. + .. versionchanged:: 3.8 The :meth:`toxml` method now preserves the attribute order specified by the user. -.. method:: Node.toprettyxml(indent="\\t", newl="\\n", encoding=None) +.. method:: Node.toprettyxml(indent="\\t", newl="\\n", encoding=None, + standalone=None) Return a pretty-printed version of the document. *indent* specifies the indentation string and defaults to a tabulator; *newl* specifies the string @@ -173,6 +184,8 @@ module documentation. This section lists the differences between the API and The *encoding* argument behaves like the corresponding argument of :meth:`toxml`. + The *standalone* argument behaves exactly as in :meth:`writexml`. + .. versionchanged:: 3.8 The :meth:`toprettyxml` method now preserves the attribute order specified by the user. diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index 44ac52aa..7725e4d1 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -15,6 +15,8 @@ for parsing and creating XML data. .. versionchanged:: 3.3 This module will use a fast implementation whenever available. + +.. deprecated:: 3.3 The :mod:`xml.etree.cElementTree` module is deprecated. @@ -572,6 +574,18 @@ Functions .. versionadded:: 3.2 +.. function:: indent(tree, space=" ", level=0) + + Appends whitespace to the subtree to indent the tree visually. + This can be used to generate pretty-printed XML output. + *tree* can be an Element or ElementTree. *space* is the whitespace + string that will be inserted for each indentation level, two space + characters by default. For indenting partial subtrees inside of an + already indented tree, pass the initial indentation level as *level*. + + .. versionadded:: 3.9 + + .. function:: iselement(element) Check if an object appears to be a valid element object. *element* is an @@ -804,16 +818,25 @@ Functions loader fails, it can return None or raise an exception. -.. function:: xml.etree.ElementInclude.include( elem, loader=None) +.. function:: xml.etree.ElementInclude.include( elem, loader=None, base_url=None, \ + max_depth=6) This function expands XInclude directives. *elem* is the root element. *loader* is an optional resource loader. If omitted, it defaults to :func:`default_loader`. If given, it should be a callable that implements the same interface as - :func:`default_loader`. Returns the expanded resource. If the parse mode is + :func:`default_loader`. *base_url* is base URL of the original file, to resolve + relative include file references. *max_depth* is the maximum number of recursive + inclusions. Limited to reduce the risk of malicious content explosion. Pass a + negative value to disable the limitation. + + Returns the expanded resource. If the parse mode is ``"xml"``, this is an ElementTree instance. If the parse mode is "text", this is a Unicode string. If the loader fails, it can return None or raise an exception. + .. versionadded:: 3.9 + The *base_url* and *max_depth* parameters. + .. _elementtree-element-objects: @@ -950,18 +973,6 @@ Element Objects in the expression into the given namespace. - .. method:: getchildren() - - .. deprecated-removed:: 3.2 3.9 - Use ``list(elem)`` or iteration. - - - .. method:: getiterator(tag=None) - - .. deprecated-removed:: 3.2 3.9 - Use method :meth:`Element.iter` instead. - - .. method:: insert(index, subelement) Inserts *subelement* at the given position in this element. Raises @@ -1096,12 +1107,6 @@ ElementTree Objects Same as :meth:`Element.findtext`, starting at the root of the tree. - .. method:: getiterator(tag=None) - - .. deprecated-removed:: 3.2 3.9 - Use method :meth:`ElementTree.iter` instead. - - .. method:: getroot() Returns the root element for this tree. diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 97da6cab..7126d8bd 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -489,16 +489,20 @@ Path objects are traversable using the ``/`` operator. The final path component. -.. method:: Path.open(*, **) - - Invoke :meth:`ZipFile.open` on the current path. Accepts - the same arguments as :meth:`ZipFile.open`. - - .. caution:: - - The signature on this function changes in an incompatible way - in Python 3.9. For a future-compatible version, consider using - the third-party zipp.Path package (3.0 or later). +.. method:: Path.open(mode='r', *, pwd, **) + + Invoke :meth:`ZipFile.open` on the current path. + Allows opening for read or write, text or binary + through supported modes: 'r', 'w', 'rb', 'wb'. + Positional and keyword arguments are passed through to + :class:`io.TextIOWrapper` when opened as text and + ignored otherwise. + ``pwd`` is the ``pwd`` parameter to + :meth:`ZipFile.open`. + + .. versionchanged:: 3.9 + Added support for text and binary modes for open. Default + mode is now text. .. method:: Path.iterdir() diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index aa61278e..ec60ea24 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -9,9 +9,9 @@ For applications that require data compression, the functions in this module allow compression and decompression, using the zlib library. The zlib library -has its own home page at http://www.zlib.net. There are known +has its own home page at https://www.zlib.net. There are known incompatibilities between the Python module and versions of the zlib library -earlier than 1.1.3; 1.1.3 has a security vulnerability, so we recommend using +earlier than 1.1.3; 1.1.3 has a `security vulnerability `_, so we recommend using 1.1.4 or later. zlib's functions have many options and often need to be used in a particular @@ -47,7 +47,7 @@ The available exception and functions in this module are: platforms, use ``adler32(data) & 0xffffffff``. -.. function:: compress(data, level=-1) +.. function:: compress(data, /, level=-1) Compresses the bytes in *data*, returning a bytes object containing compressed data. *level* is an integer from ``0`` to ``9`` or ``-1`` controlling the level of compression; @@ -132,7 +132,7 @@ The available exception and functions in this module are: platforms, use ``crc32(data) & 0xffffffff``. -.. function:: decompress(data, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE) +.. function:: decompress(data, /, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE) Decompresses the bytes in *data*, returning a bytes object containing the uncompressed data. The *wbits* parameter depends on @@ -337,4 +337,3 @@ the following constants: http://www.zlib.net/manual.html The zlib manual explains the semantics and usage of the library's many functions. - diff --git a/Doc/library/zoneinfo.rst b/Doc/library/zoneinfo.rst new file mode 100644 index 00000000..3a4c12a7 --- /dev/null +++ b/Doc/library/zoneinfo.rst @@ -0,0 +1,413 @@ +:mod:`zoneinfo` --- IANA time zone support +========================================== + +.. module:: zoneinfo + :synopsis: IANA time zone support + +.. versionadded:: 3.9 + +.. moduleauthor:: Paul Ganssle +.. sectionauthor:: Paul Ganssle + +-------------- + +The :mod:`zoneinfo` module provides a concrete time zone implementation to +support the IANA time zone database as originally specified in :pep:`615`. By +default, :mod:`zoneinfo` uses the system's time zone data if available; if no +system time zone data is available, the library will fall back to using the +first-party `tzdata`_ package available on PyPI. + +.. seealso:: + + Module: :mod:`datetime` + Provides the :class:`~datetime.time` and :class:`~datetime.datetime` + types with which the :class:`ZoneInfo` class is designed to be used. + + Package `tzdata`_ + First-party package maintained by the CPython core developers to supply + time zone data via PyPI. + + +Using ``ZoneInfo`` +------------------ + +:class:`ZoneInfo` is a concrete implementation of the :class:`datetime.tzinfo` +abstract base class, and is intended to be attached to ``tzinfo``, either via +the constructor, the :meth:`datetime.replace ` +method or :meth:`datetime.astimezone `:: + + >>> from zoneinfo import ZoneInfo + >>> from datetime import datetime, timedelta + + >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles")) + >>> print(dt) + 2020-10-31 12:00:00-07:00 + + >>> dt.tzname() + 'PDT' + +Datetimes constructed in this way are compatible with datetime arithmetic and +handle daylight saving time transitions with no further intervention:: + + >>> dt_add = dt + timedelta(days=1) + + >>> print(dt_add) + 2020-11-01 12:00:00-08:00 + + >>> dt_add.tzname() + 'PST' + +These time zones also support the :attr:`~datetime.datetime.fold` attribute +introduced in :pep:`495`. During offset transitions which induce ambiguous +times (such as a daylight saving time to standard time transition), the offset +from *before* the transition is used when ``fold=0``, and the offset *after* +the transition is used when ``fold=1``, for example:: + + >>> dt = datetime(2020, 11, 1, 1, tzinfo=ZoneInfo("America/Los_Angeles")) + >>> print(dt) + 2020-11-01 01:00:00-07:00 + + >>> print(dt.replace(fold=1)) + 2020-11-01 01:00:00-08:00 + +When converting from another time zone, the fold will be set to the correct +value:: + + >>> from datetime import timezone + >>> LOS_ANGELES = ZoneInfo("America/Los_Angeles") + >>> dt_utc = datetime(2020, 11, 1, 8, tzinfo=timezone.utc) + + >>> # Before the PDT -> PST transition + >>> print(dt_utc.astimezone(LOS_ANGELES)) + 2020-11-01 01:00:00-07:00 + + >>> # After the PDT -> PST transition + >>> print((dt_utc + timedelta(hours=1)).astimezone(LOS_ANGELES)) + 2020-11-01 01:00:00-08:00 + +Data sources +------------ + +The ``zoneinfo`` module does not directly provide time zone data, and instead +pulls time zone information from the system time zone database or the +first-party PyPI package `tzdata`_, if available. Some systems, including +notably Windows systems, do not have an IANA database available, and so for +projects targeting cross-platform compatibility that require time zone data, it +is recommended to declare a dependency on tzdata. If neither system data nor +tzdata are available, all calls to :class:`ZoneInfo` will raise +:exc:`ZoneInfoNotFoundError`. + +.. _zoneinfo_data_configuration: + +Configuring the data sources +**************************** + +When ``ZoneInfo(key)`` is called, the constructor first searches the +directories specified in :data:`TZPATH` for a file matching ``key``, and on +failure looks for a match in the tzdata package. This behavior can be +configured in three ways: + +1. The default :data:`TZPATH` when not otherwise specified can be configured at + :ref:`compile time `. +2. :data:`TZPATH` can be configured using :ref:`an environment variable + `. +3. At :ref:`runtime `, the search path can be + manipulated using the :func:`reset_tzpath` function. + +.. _zoneinfo_data_compile_time_config: + +Compile-time configuration +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The default :data:`TZPATH` includes several common deployment locations for the +time zone database (except on Windows, where there are no "well-known" +locations for time zone data). On POSIX systems, downstream distributors and +those building Python from source who know where their system +time zone data is deployed may change the default time zone path by specifying +the compile-time option ``TZPATH`` (or, more likely, the ``configure`` flag +``--with-tzpath``), which should be a string delimited by :data:`os.pathsep`. + +On all platforms, the configured value is available as the ``TZPATH`` key in +:func:`sysconfig.get_config_var`. + +.. _zoneinfo_data_environment_var: + +Environment configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ + +When initializing :data:`TZPATH` (either at import time or whenever +:func:`reset_tzpath` is called with no arguments), the ``zoneinfo`` module will +use the environment variable ``PYTHONTZPATH``, if it exists, to set the search +path. + +.. envvar:: PYTHONTZPATH + + This is an :data:`os.pathsep`-separated string containing the time zone + search path to use. It must consist of only absolute rather than relative + paths. Relative components specified in ``PYTHONTZPATH`` will not be used, + but otherwise the behavior when a relative path is specified is + implementation-defined; CPython will raise :exc:`InvalidTZPathWarning`, but + other implementations are free to silently ignore the erroneous component + or raise an exception. + +To set the system to ignore the system data and use the tzdata package +instead, set ``PYTHONTZPATH=""``. + +.. _zoneinfo_data_runtime_config: + +Runtime configuration +^^^^^^^^^^^^^^^^^^^^^ + +The TZ search path can also be configured at runtime using the +:func:`reset_tzpath` function. This is generally not an advisable operation, +though it is reasonable to use it in test functions that require the use of a +specific time zone path (or require disabling access to the system time zones). + + +The ``ZoneInfo`` class +---------------------- + +.. class:: ZoneInfo(key) + + A concrete :class:`datetime.tzinfo` subclass that represents an IANA time + zone specified by the string ``key``. Calls to the primary constructor will + always return objects that compare identically; put another way, barring + cache invalidation via :meth:`ZoneInfo.clear_cache`, for all values of + ``key``, the following assertion will always be true: + + .. code-block:: python + + a = ZoneInfo(key) + b = ZoneInfo(key) + assert a is b + + ``key`` must be in the form of a relative, normalized POSIX path, with no + up-level references. The constructor will raise :exc:`ValueError` if a + non-conforming key is passed. + + If no file matching ``key`` is found, the constructor will raise + :exc:`ZoneInfoNotFoundError`. + + +The ``ZoneInfo`` class has two alternate constructors: + +.. classmethod:: ZoneInfo.from_file(fobj, /, key=None) + + Constructs a ``ZoneInfo`` object from a file-like object returning bytes + (e.g. a file opened in binary mode or an :class:`io.BytesIO` object). + Unlike the primary constructor, this always constructs a new object. + + The ``key`` parameter sets the name of the zone for the purposes of + :py:meth:`~object.__str__` and :py:meth:`~object.__repr__`. + + Objects created via this constructor cannot be pickled (see `pickling`_). + +.. classmethod:: ZoneInfo.no_cache(key) + + An alternate constructor that bypasses the constructor's cache. It is + identical to the primary constructor, but returns a new object on each + call. This is most likely to be useful for testing or demonstration + purposes, but it can also be used to create a system with a different cache + invalidation strategy. + + Objects created via this constructor will also bypass the cache of a + deserializing process when unpickled. + + .. TODO: Add "See `cache_behavior`_" reference when that section is ready. + + .. caution:: + + Using this constructor may change the semantics of your datetimes in + surprising ways, only use it if you know that you need to. + +The following class methods are also available: + +.. classmethod:: ZoneInfo.clear_cache(*, only_keys=None) + + A method for invalidating the cache on the ``ZoneInfo`` class. If no + arguments are passed, all caches are invalidated and the next call to + the primary constructor for each key will return a new instance. + + If an iterable of key names is passed to the ``only_keys`` parameter, only + the specified keys will be removed from the cache. Keys passed to + ``only_keys`` but not found in the cache are ignored. + + .. TODO: Add "See `cache_behavior`_" reference when that section is ready. + + .. warning:: + + Invoking this function may change the semantics of datetimes using + ``ZoneInfo`` in surprising ways; this modifies process-wide global state + and thus may have wide-ranging effects. Only use it if you know that you + need to. + +The class has one attribute: + +.. attribute:: ZoneInfo.key + + This is a read-only :term:`attribute` that returns the value of ``key`` + passed to the constructor, which should be a lookup key in the IANA time + zone database (e.g. ``America/New_York``, ``Europe/Paris`` or + ``Asia/Tokyo``). + + For zones constructed from file without specifying a ``key`` parameter, + this will be set to ``None``. + + .. note:: + + Although it is a somewhat common practice to expose these to end users, + these values are designed to be primary keys for representing the + relevant zones and not necessarily user-facing elements. Projects like + CLDR (the Unicode Common Locale Data Repository) can be used to get + more user-friendly strings from these keys. + +String representations +********************** + +The string representation returned when calling :py:class:`str` on a +:class:`ZoneInfo` object defaults to using the :attr:`ZoneInfo.key` attribute (see +the note on usage in the attribute documentation):: + + >>> zone = ZoneInfo("Pacific/Kwajalein") + >>> str(zone) + 'Pacific/Kwajalein' + + >>> dt = datetime(2020, 4, 1, 3, 15, tzinfo=zone) + >>> f"{dt.isoformat()} [{dt.tzinfo}]" + '2020-04-01T03:15:00+12:00 [Pacific/Kwajalein]' + +For objects constructed from a file without specifying a ``key`` parameter, +``str`` falls back to calling :func:`repr`. ``ZoneInfo``'s ``repr`` is +implementation-defined and not necessarily stable between versions, but it is +guaranteed not to be a valid ``ZoneInfo`` key. + +.. _pickling: + +Pickle serialization +******************** + +Rather than serializing all transition data, ``ZoneInfo`` objects are +serialized by key, and ``ZoneInfo`` objects constructed from files (even those +with a value for ``key`` specified) cannot be pickled. + +The behavior of a ``ZoneInfo`` file depends on how it was constructed: + +1. ``ZoneInfo(key)``: When constructed with the primary constructor, a + ``ZoneInfo`` object is serialized by key, and when deserialized, the + deserializing process uses the primary and thus it is expected that these + are expected to be the same object as other references to the same time + zone. For example, if ``europe_berlin_pkl`` is a string containing a pickle + constructed from ``ZoneInfo("Europe/Berlin")``, one would expect the + following behavior: + + .. code-block:: pycon + + >>> a = ZoneInfo("Europe/Berlin") + >>> b = pickle.loads(europe_berlin_pkl) + >>> a is b + True + +2. ``ZoneInfo.no_cache(key)``: When constructed from the cache-bypassing + constructor, the ``ZoneInfo`` object is also serialized by key, but when + deserialized, the deserializing process uses the cache bypassing + constructor. If ``europe_berlin_pkl_nc`` is a string containing a pickle + constructed from ``ZoneInfo.no_cache("Europe/Berlin")``, one would expect + the following behavior: + + .. code-block:: pycon + + >>> a = ZoneInfo("Europe/Berlin") + >>> b = pickle.loads(europe_berlin_pkl_nc) + >>> a is b + False + +3. ``ZoneInfo.from_file(fobj, /, key=None)``: When constructed from a file, the + ``ZoneInfo`` object raises an exception on pickling. If an end user wants to + pickle a ``ZoneInfo`` constructed from a file, it is recommended that they + use a wrapper type or a custom serialization function: either serializing by + key or storing the contents of the file object and serializing that. + +This method of serialization requires that the time zone data for the required +key be available on both the serializing and deserializing side, similar to the +way that references to classes and functions are expected to exist in both the +serializing and deserializing environments. It also means that no guarantees +are made about the consistency of results when unpickling a ``ZoneInfo`` +pickled in an environment with a different version of the time zone data. + +Functions +--------- + +.. function:: available_timezones() + + Get a set containing all the valid keys for IANA time zones available + anywhere on the time zone path. This is recalculated on every call to the + function. + + This function only includes canonical zone names and does not include + "special" zones such as those under the ``posix/`` and ``right/`` + directories, or the ``posixrules`` zone. + + .. caution:: + + This function may open a large number of files, as the best way to + determine if a file on the time zone path is a valid time zone is to + read the "magic string" at the beginning. + + .. note:: + + These values are not designed to be exposed to end-users; for user + facing elements, applications should use something like CLDR (the + Unicode Common Locale Data Repository) to get more user-friendly + strings. See also the cautionary note on :attr:`ZoneInfo.key`. + +.. function:: reset_tzpath(to=None) + + Sets or resets the time zone search path (:data:`TZPATH`) for the module. + When called with no arguments, :data:`TZPATH` is set to the default value. + + Calling ``reset_tzpath`` will not invalidate the :class:`ZoneInfo` cache, + and so calls to the primary ``ZoneInfo`` constructor will only use the new + ``TZPATH`` in the case of a cache miss. + + The ``to`` parameter must be a :term:`sequence` of strings or + :class:`os.PathLike` and not a string, all of which must be absolute paths. + :exc:`ValueError` will be raised if something other than an absolute path + is passed. + +Globals +------- + +.. data:: TZPATH + + A read-only sequence representing the time zone search path -- when + constructing a ``ZoneInfo`` from a key, the key is joined to each entry in + the ``TZPATH``, and the first file found is used. + + ``TZPATH`` may contain only absolute paths, never relative paths, + regardless of how it is configured. + + The object that ``zoneinfo.TZPATH`` points to may change in response to a + call to :func:`reset_tzpath`, so it is recommended to use + ``zoneinfo.TZPATH`` rather than importing ``TZPATH`` from ``zoneinfo`` or + assigning a long-lived variable to ``zoneinfo.TZPATH``. + + For more information on configuring the time zone search path, see + :ref:`zoneinfo_data_configuration`. + +Exceptions and warnings +----------------------- + +.. exception:: ZoneInfoNotFoundError + + Raised when construction of a :class:`ZoneInfo` object fails because the + specified key could not be found on the system. This is a subclass of + :exc:`KeyError`. + +.. exception:: InvalidTZPathWarning + + Raised when :envvar:`PYTHONTZPATH` contains an invalid component that will + be filtered out, such as a relative path. + +.. Links and references: + +.. _tzdata: https://pypi.org/project/tzdata/ diff --git a/Doc/license.rst b/Doc/license.rst index f70c34d3..4030825b 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -923,7 +923,7 @@ libmpdec The :mod:`_decimal` module is built using an included copy of the libmpdec library unless the build is configured ``--with-system-libmpdec``:: - Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + Copyright (c) 2008-2020 Stefan Krah. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 6900c7ac..b4e06e5b 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -508,7 +508,7 @@ A function definition defines a user-defined function object (see section funcdef: [`decorators`] "def" `funcname` "(" [`parameter_list`] ")" : ["->" `expression`] ":" `suite` decorators: `decorator`+ - decorator: "@" `dotted_name` ["(" [`argument_list` [","]] ")"] NEWLINE + decorator: "@" `assignment_expression` NEWLINE dotted_name: `identifier` ("." `identifier`)* parameter_list: `defparameter` ("," `defparameter`)* "," "/" ["," [`parameter_list_no_posonly`]] : | `parameter_list_no_posonly` @@ -551,6 +551,11 @@ is roughly equivalent to :: except that the original function is not temporarily bound to the name ``func``. +.. versionchanged:: 3.9 + Functions may be decorated with any valid :token:`assignment_expression`. + Previously, the grammar was much more restrictive; see :pep:`614` for + details. + .. index:: triple: default; parameter; value single: argument; function definition @@ -718,6 +723,11 @@ is roughly equivalent to :: The evaluation rules for the decorator expressions are the same as for function decorators. The result is then bound to the class name. +.. versionchanged:: 3.9 + Classes may be decorated with any valid :token:`assignment_expression`. + Previously, the grammar was much more restrictive; see :pep:`614` for + details. + **Programmer's note:** Variables defined in the class definition are class attributes; they are shared by instances. Instance attributes can be set in a method with ``self.name = value``. Both class and instance attributes are @@ -845,8 +855,8 @@ The following code:: is semantically equivalent to:: manager = (EXPRESSION) - aexit = type(manager).__aexit__ aenter = type(manager).__aenter__ + aexit = type(manager).__aexit__ value = await aenter(manager) hit_except = False diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 3f053858..fc304a19 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -156,13 +156,18 @@ NotImplemented object is accessed through the built-in name ``NotImplemented``. Numeric methods and rich comparison methods should return this value if they do not implement the operation for the operands provided. (The interpreter will then try the - reflected operation, or some other fallback, depending on the operator.) Its - truth value is true. + reflected operation, or some other fallback, depending on the operator.) It + should not be evaluated in a boolean context. See :ref:`implementing-the-arithmetic-operations` for more details. + .. versionchanged:: 3.9 + Evaluating ``NotImplemented`` in a boolean context is deprecated. While + it currently evaluates as true, it will emit a :exc:`DeprecationWarning`. + It will raise a :exc:`TypeError` in a future version of Python. + Ellipsis .. index:: @@ -1345,7 +1350,7 @@ Basic customization .. versionchanged:: 3.7 ``object.__format__(x, '')`` is now equivalent to ``str(x)`` rather - than ``format(str(self), '')``. + than ``format(str(x), '')``. .. _richcmpfuncs: @@ -1740,7 +1745,7 @@ the descriptor defines :meth:`__set__` and/or :meth:`__delete__`, it is a data descriptor; if it defines neither, it is a non-data descriptor. Normally, data descriptors define both :meth:`__get__` and :meth:`__set__`, while non-data descriptors have just the :meth:`__get__` method. Data descriptors with -:meth:`__set__` and :meth:`__get__` defined always override a redefinition in an +:meth:`__get__` and :meth:`__set__` (and/or :meth:`__delete__`) defined always override a redefinition in an instance dictionary. In contrast, non-data descriptors can be overridden by instances. diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index 49cb86b5..55ac01b6 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -22,7 +22,9 @@ The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the -interpreter command line with the :option:`-c` option) is a code block. The string +interpreter command line with the :option:`-c` option) is a code block. +A module run as a top level script (as module ``__main__``) from the command +line using a :option:`-m` argument is also a code block. The string argument passed to the built-in functions :func:`eval` and :func:`exec` is a code block. diff --git a/Doc/reference/grammar.rst b/Doc/reference/grammar.rst index 83d0f853..acf83765 100644 --- a/Doc/reference/grammar.rst +++ b/Doc/reference/grammar.rst @@ -1,7 +1,19 @@ Full Grammar specification ========================== -This is the full Python grammar, as it is read by the parser generator and used -to parse Python source files: +This is the full Python grammar, derived directly from the grammar +used to generate the CPython parser (see :source:`Grammar/python.gram`). +The version here omits details related to code generation and +error recovery. -.. literalinclude:: ../../Grammar/Grammar +The notation is a mixture of `EBNF +`_ +and `PEG `_. +In particular, ``&`` followed by a symbol, token or parenthesized +group indicates a positive lookahead (i.e., is required to match but +not consumed), while ``!`` indicates a negative lookahead (i.e., is +required _not_ to match). We use the ``|`` separator to mean PEG's +"ordered choice" (written as ``/`` in traditional PEG grammars). + +.. literalinclude:: ../../Grammar/python.gram + :language: peg diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 1c98aab7..4c36e15d 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -83,7 +83,7 @@ module. Specifically, any module that contains a ``__path__`` attribute is considered a package. All modules have a name. Subpackage names are separated from their parent -package name by dots, akin to Python's standard attribute access syntax. Thus +package name by a dot, akin to Python's standard attribute access syntax. Thus you might have a module called :mod:`sys` and a package called :mod:`email`, which in turn has a subpackage called :mod:`email.mime` and a module within that subpackage called :mod:`email.mime.text`. @@ -202,6 +202,8 @@ named module, the two module objects will *not* be the same. By contrast, reinitialise the module contents by rerunning the module's code. +.. _finders-and-loaders: + Finders and loaders ------------------- diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index f74ff794..77e0578f 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -316,7 +316,7 @@ The Unicode category codes mentioned above stand for: * *Nd* - decimal numbers * *Pc* - connector punctuations * *Other_ID_Start* - explicit list of characters in `PropList.txt - `_ to support backwards + `_ to support backwards compatibility * *Other_ID_Continue* - likewise @@ -718,7 +718,7 @@ Top-level format specifiers may include nested replacement fields. These nested fields may include their own conversion fields and :ref:`format specifiers `, but may not include more deeply-nested replacement fields. The :ref:`format specifier mini-language ` is the same as that used by -the string .format() method. +the :meth:`str.format` method. Formatted string literals may be concatenated, but replacement fields cannot be split across literals. @@ -961,4 +961,4 @@ occurrence outside string literals and comments is an unconditional error: .. rubric:: Footnotes -.. [#] http://www.unicode.org/Public/11.0.0/ucd/NameAliases.txt +.. [#] https://www.unicode.org/Public/11.0.0/ucd/NameAliases.txt diff --git a/Doc/runtime.txt b/Doc/runtime.txt new file mode 100644 index 00000000..548d7136 --- /dev/null +++ b/Doc/runtime.txt @@ -0,0 +1 @@ +3.7 \ No newline at end of file diff --git a/Doc/tools/extensions/asdl_highlight.py b/Doc/tools/extensions/asdl_highlight.py new file mode 100644 index 00000000..b1989e53 --- /dev/null +++ b/Doc/tools/extensions/asdl_highlight.py @@ -0,0 +1,54 @@ +import os +import sys +from pathlib import Path + +CPYTHON_ROOT = Path(__file__).resolve().parent.parent.parent.parent +sys.path.append(str(CPYTHON_ROOT / "Parser")) + +from pygments.lexer import RegexLexer, bygroups, include, words +from pygments.token import (Comment, Generic, Keyword, Name, Operator, + Punctuation, Text) + +from asdl import builtin_types +from sphinx.highlighting import lexers + +class ASDLLexer(RegexLexer): + name = "ASDL" + aliases = ["asdl"] + filenames = ["*.asdl"] + _name = r"([^\W\d]\w*)" + _text_ws = r"(\s*)" + + tokens = { + "ws": [ + (r"\n", Text), + (r"\s+", Text), + (r"--.*?$", Comment.Singleline), + ], + "root": [ + include("ws"), + ( + r"(module)" + _text_ws + _name, + bygroups(Keyword, Text, Name.Tag), + ), + ( + r"(\w+)(\*\s|\?\s|\s)(\w+)", + bygroups(Name.Builtin.Pseudo, Operator, Name), + ), + (words(builtin_types), Name.Builtin), + (r"attributes", Name.Builtin), + ( + _name + _text_ws + "(=)", + bygroups(Name, Text, Operator), + ), + (_name, Name.Class), + (r"\|", Operator), + (r"{|}|\(|\)", Punctuation), + (r".", Text), + ], + } + + +def setup(app): + lexers["asdl"] = ASDLLexer() + return {'version': '1.0', 'parallel_read_safe': True} diff --git a/Doc/tools/extensions/peg_highlight.py b/Doc/tools/extensions/peg_highlight.py new file mode 100644 index 00000000..8bc24670 --- /dev/null +++ b/Doc/tools/extensions/peg_highlight.py @@ -0,0 +1,75 @@ +from pygments.lexer import RegexLexer, bygroups, include +from pygments.token import Comment, Generic, Keyword, Name, Operator, Punctuation, Text + +from sphinx.highlighting import lexers + + +class PEGLexer(RegexLexer): + """Pygments Lexer for PEG grammar (.gram) files + + This lexer strips the following elements from the grammar: + + - Meta-tags + - Variable assignments + - Actions + - Lookaheads + - Rule types + - Rule options + - Rules named `invalid_*` or `incorrect_*` + """ + + name = "PEG" + aliases = ["peg"] + filenames = ["*.gram"] + _name = r"([^\W\d]\w*)" + _text_ws = r"(\s*)" + + tokens = { + "ws": [(r"\n", Text), (r"\s+", Text), (r"#.*$", Comment.Singleline),], + "lookaheads": [ + (r"(?<=\|\s)(&\w+\s?)", bygroups(None)), + (r"(?<=\|\s)(&'.+'\s?)", bygroups(None)), + (r'(?<=\|\s)(&".+"\s?)', bygroups(None)), + (r"(?<=\|\s)(&\(.+\)\s?)", bygroups(None)), + ], + "metas": [ + (r"(@\w+ '''(.|\n)+?''')", bygroups(None)), + (r"^(@.*)$", bygroups(None)), + ], + "actions": [(r"{(.|\n)+?}", bygroups(None)),], + "strings": [ + (r"'\w+?'", Keyword), + (r'"\w+?"', Keyword), + (r"'\W+?'", Text), + (r'"\W+?"', Text), + ], + "variables": [(_name + _text_ws + "(=)", bygroups(None, None, None),),], + "invalids": [ + (r"^(\s+\|\s+invalid_\w+\s*\n)", bygroups(None)), + (r"^(\s+\|\s+incorrect_\w+\s*\n)", bygroups(None)), + (r"^(#.*invalid syntax.*(?:.|\n)*)", bygroups(None),), + ], + "root": [ + include("invalids"), + include("ws"), + include("lookaheads"), + include("metas"), + include("actions"), + include("strings"), + include("variables"), + (r"\b(?!(NULL|EXTRA))([A-Z_]+)\b\s*(?!\()", Text,), + ( + r"^\s*" + _name + r"\s*" + r"(\[.*\])?" + r"\s*" + r"(\(.+\))?" + r"\s*(:)", + bygroups(Name.Function, None, None, Punctuation), + ), + (_name, Name.Function), + (r"[\||\.|\+|\*|\?]", Operator), + (r"{|}|\(|\)|\[|\]", Punctuation), + (r".", Text), + ], + } + + +def setup(app): + lexers["peg"] = PEGLexer() + return {"version": "1.0", "parallel_read_safe": True} diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index e3369cdc..f08f4abb 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -31,12 +31,7 @@ from sphinx.util import status_iterator, logging from sphinx.util.nodes import split_explicit_title from sphinx.writers.text import TextWriter, TextTranslator from sphinx.writers.latex import LaTeXTranslator - -try: - from sphinx.domains.python import PyFunction, PyMethod -except ImportError: - from sphinx.domains.python import PyClassmember as PyMethod - from sphinx.domains.python import PyModulelevel as PyFunction +from sphinx.domains.python import PyModulelevel, PyClassmember # Support for checking for suspicious markup @@ -44,7 +39,7 @@ import suspicious ISSUE_URI = 'https://bugs.python.org/issue%s' -SOURCE_URI = 'https://github.com/python/cpython/tree/3.8/%s' +SOURCE_URI = 'https://github.com/python/cpython/tree/3.9/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body @@ -243,18 +238,17 @@ class PyDecoratorMixin(object): return False -class PyDecoratorFunction(PyDecoratorMixin, PyFunction): +class PyDecoratorFunction(PyDecoratorMixin, PyModulelevel): def run(self): # a decorator function is a function after all self.name = 'py:function' - return PyFunction.run(self) + return PyModulelevel.run(self) -# TODO: Use sphinx.domains.python.PyDecoratorMethod when possible -class PyDecoratorMethod(PyDecoratorMixin, PyMethod): +class PyDecoratorMethod(PyDecoratorMixin, PyClassmember): def run(self): self.name = 'py:method' - return PyMethod.run(self) + return PyClassmember.run(self) class PyCoroutineMixin(object): @@ -271,31 +265,31 @@ class PyAwaitableMixin(object): return ret -class PyCoroutineFunction(PyCoroutineMixin, PyFunction): +class PyCoroutineFunction(PyCoroutineMixin, PyModulelevel): def run(self): self.name = 'py:function' - return PyFunction.run(self) + return PyModulelevel.run(self) -class PyCoroutineMethod(PyCoroutineMixin, PyMethod): +class PyCoroutineMethod(PyCoroutineMixin, PyClassmember): def run(self): self.name = 'py:method' - return PyMethod.run(self) + return PyClassmember.run(self) -class PyAwaitableFunction(PyAwaitableMixin, PyFunction): +class PyAwaitableFunction(PyAwaitableMixin, PyClassmember): def run(self): self.name = 'py:function' - return PyFunction.run(self) + return PyClassmember.run(self) -class PyAwaitableMethod(PyAwaitableMixin, PyMethod): +class PyAwaitableMethod(PyAwaitableMixin, PyClassmember): def run(self): self.name = 'py:method' - return PyMethod.run(self) + return PyClassmember.run(self) -class PyAbstractMethod(PyMethod): +class PyAbstractMethod(PyClassmember): def handle_signature(self, sig, signode): ret = super(PyAbstractMethod, self).handle_signature(sig, signode) @@ -305,7 +299,7 @@ class PyAbstractMethod(PyMethod): def run(self): self.name = 'py:method' - return PyMethod.run(self) + return PyClassmember.run(self) # Support for documenting version of removal in deprecations diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 33fbaf69..7be8d0ab 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -82,6 +82,7 @@ howto/ipaddress,,::,IPv6Address('2001:db8::ffff:ffff') howto/ipaddress,,:ffff,IPv6Address('2001:db8::ffff:ffff') howto/logging,,:And,"WARNING:And this, too" howto/logging,,:And,"WARNING:root:And this, too" +howto/logging,,:And,"ERROR:root:And non-ASCII stuff, too, like " howto/logging,,:Doing,INFO:root:Doing something howto/logging,,:Finished,INFO:root:Finished howto/logging,,:logger,severity:logger name:message @@ -91,6 +92,7 @@ howto/logging,,:root,DEBUG:root:This message should go to the log file howto/logging,,:root,INFO:root:Doing something howto/logging,,:root,INFO:root:Finished howto/logging,,:root,INFO:root:So should this +howto/logging,,:root,"ERROR:root:And non-ASCII stuff, too, like " howto/logging,,:root,INFO:root:Started howto/logging,,:root,"WARNING:root:And this, too" howto/logging,,:root,WARNING:root:Look before you leap! @@ -106,6 +108,8 @@ howto/pyporting,,::,Programming Language :: Python :: 3 howto/regex,,::, howto/regex,,:foo,(?:foo) howto/urllib2,,:password,"""joe:password@example.com""" +library/ast,,:upper,lower:upper +library/ast,,:step,lower:upper:step library/audioop,,:ipos,"# factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)]," library/bisect,32,:hi,all(val >= x for val in a[i:hi]) library/bisect,42,:hi,all(val > x for val in a[i:hi]) @@ -145,6 +149,8 @@ library/ipaddress,,:db8,>>> ipaddress.IPv6Address('2001:db8::1000') library/ipaddress,,::,>>> ipaddress.IPv6Address('2001:db8::1000') library/ipaddress,,:db8,IPv6Address('2001:db8::1000') library/ipaddress,,::,IPv6Address('2001:db8::1000') +library/ipaddress,,::,IPv6Address('ff02::5678%1') +library/ipaddress,,::,fe80::1234 library/ipaddress,,:db8,">>> ipaddress.ip_address(""2001:db8::1"").reverse_pointer" library/ipaddress,,::,">>> ipaddress.ip_address(""2001:db8::1"").reverse_pointer" library/ipaddress,,::,"""::abc:7:def""" diff --git a/Doc/tools/templates/customsourcelink.html b/Doc/tools/templates/customsourcelink.html index 21af621e..fca44e91 100644 --- a/Doc/tools/templates/customsourcelink.html +++ b/Doc/tools/templates/customsourcelink.html @@ -4,7 +4,7 @@
  • {% trans %}Report a Bug{% endtrans %}
  • - {{ _('Show Source') }}
  • diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index 0edb73ad..ff4c797f 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -613,6 +613,21 @@ direction and then call the :func:`reversed` function. :: To loop over a sequence in sorted order, use the :func:`sorted` function which returns a new sorted list while leaving the source unaltered. :: + >>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] + >>> for i in sorted(basket): + ... print(i) + ... + apple + apple + banana + orange + orange + pear + +Using :func:`set` on a sequence eliminates duplicate elements. The use of +:func:`sorted` in combination with :func:`set` over a sequence is an idiomatic +way to loop over unique elements of the sequence in sorted order. :: + >>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] >>> for f in sorted(set(basket)): ... print(f) diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst index 27c67c6e..0ce96466 100644 --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -67,7 +67,7 @@ The rest of the line provides detail based on the type of exception and what caused it. The preceding part of the error message shows the context where the exception -happened, in the form of a stack traceback. In general it contains a stack +occurred, in the form of a stack traceback. In general it contains a stack traceback listing source lines; however, it will not display lines read from standard input. @@ -267,6 +267,53 @@ re-raise the exception:: NameError: HiThere +.. _tut-exception-chaining: + +Exception Chaining +================== + +The :keyword:`raise` statement allows an optional :keyword:`from` which enables +chaining exceptions by setting the ``__cause__`` attribute of the raised +exception. For example:: + + raise RuntimeError from OSError + +This can be useful when you are transforming exceptions. For example:: + + >>> def func(): + ... raise IOError + ... + >>> try: + ... func() + ... except IOError as exc: + ... raise RuntimeError('Failed to open database') from exc + ... + Traceback (most recent call last): + File "", line 2, in + File "", line 2, in func + OSError + + The above exception was the direct cause of the following exception: + + Traceback (most recent call last): + File "", line 4, in + RuntimeError + +The expression following the :keyword:`from` must be either an exception or +``None``. Exception chaining happens automatically when an exception is raised +inside an exception handler or :keyword:`finally` section. Exception chaining +can be disabled by using ``from None`` idiom: + + >>> try: + ... open('database.sqlite') + ... except IOError: + ... raise RuntimeError from None + ... + Traceback (most recent call last): + File "", line 4, in + RuntimeError + + .. _tut-userexceptions: User-defined Exceptions diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst index 501fb6a7..b78d2960 100644 --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -10,13 +10,13 @@ Using the Python Interpreter Invoking the Interpreter ======================== -The Python interpreter is usually installed as :file:`/usr/local/bin/python3.8` +The Python interpreter is usually installed as :file:`/usr/local/bin/python3.9` on those machines where it is available; putting :file:`/usr/local/bin` in your Unix shell's search path makes it possible to start it by typing the command: .. code-block:: text - python3.8 + python3.9 to the shell. [#]_ Since the choice of the directory where the interpreter lives is an installation option, other places are possible; check with your local @@ -24,7 +24,7 @@ Python guru or system administrator. (E.g., :file:`/usr/local/python` is a popular alternative location.) On Windows machines where you have installed Python from the :ref:`Microsoft Store -`, the :file:`python3.8` command will be available. If you have +`, the :file:`python3.9` command will be available. If you have the :ref:`py.exe launcher ` installed, you can use the :file:`py` command. See :ref:`setting-envvars` for other ways to launch Python. @@ -97,8 +97,8 @@ before printing the first prompt: .. code-block:: shell-session - $ python3.8 - Python 3.8 (default, Sep 16 2015, 09:25:04) + $ python3.9 + Python 3.9 (default, June 4 2019, 09:25:04) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst index d0a68faa..af595e5c 100644 --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -306,23 +306,27 @@ defines. It returns a sorted list of strings:: >>> dir(fibo) ['__name__', 'fib', 'fib2'] >>> dir(sys) # doctest: +NORMALIZE_WHITESPACE - ['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__', - '__package__', '__stderr__', '__stdin__', '__stdout__', - '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', - '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv', - 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', - 'call_tracing', 'callstats', 'copyright', 'displayhook', - 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', - 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', - 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', - 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit', - 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount', + ['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', + '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', + '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__', + '_clear_type_cache', '_current_frames', '_debugmallocstats', '_framework', + '_getframe', '_git', '_home', '_xoptions', 'abiflags', 'addaudithook', + 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix', + 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing', + 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', + 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', + 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth', + 'getallocatedblocks', 'getdefaultencoding', 'getdlopenflags', + 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', + 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', - 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', - 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', - 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', - 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', - 'thread_info', 'version', 'version_info', 'warnoptions'] + 'intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value', + 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', + 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'pycache_prefix', + 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setdlopenflags', + 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', + 'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info', + 'warnoptions'] Without arguments, :func:`dir` lists the names you have defined currently:: diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst index 1b890569..a52653b9 100644 --- a/Doc/tutorial/stdlib.rst +++ b/Doc/tutorial/stdlib.rst @@ -15,7 +15,7 @@ operating system:: >>> import os >>> os.getcwd() # Return the current working directory - 'C:\\Python38' + 'C:\\Python39' >>> os.chdir('/server/accesslogs') # Change current working directory >>> os.system('mkdir today') # Run the command mkdir in the system shell 0 diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst index d2ac57b8..29948285 100644 --- a/Doc/tutorial/stdlib2.rst +++ b/Doc/tutorial/stdlib2.rst @@ -278,7 +278,7 @@ applications include caching objects that are expensive to create:: Traceback (most recent call last): File "", line 1, in d['primary'] # entry was automatically removed - File "C:/python38/lib/weakref.py", line 46, in __getitem__ + File "C:/python39/lib/weakref.py", line 46, in __getitem__ o = self.data[key]() KeyError: 'primary' diff --git a/Doc/tutorial/venv.rst b/Doc/tutorial/venv.rst index 558076d5..f422146a 100644 --- a/Doc/tutorial/venv.rst +++ b/Doc/tutorial/venv.rst @@ -116,7 +116,7 @@ You can install the latest version of a package by specifying a package's name: .. code-block:: bash - (tutorial-env) $ pip install novas + (tutorial-env) $ python -m pip install novas Collecting novas Downloading novas-3.1.1.3.tar.gz (136kB) Installing collected packages: novas @@ -128,7 +128,7 @@ package name followed by ``==`` and the version number: .. code-block:: bash - (tutorial-env) $ pip install requests==2.6.0 + (tutorial-env) $ python -m pip install requests==2.6.0 Collecting requests==2.6.0 Using cached requests-2.6.0-py2.py3-none-any.whl Installing collected packages: requests @@ -141,7 +141,7 @@ install --upgrade`` to upgrade the package to the latest version: .. code-block:: bash - (tutorial-env) $ pip install --upgrade requests + (tutorial-env) $ python -m pip install --upgrade requests Collecting requests Installing collected packages: requests Found existing installation: requests 2.6.0 @@ -199,7 +199,7 @@ necessary packages with ``install -r``: .. code-block:: bash - (tutorial-env) $ pip install -r requirements.txt + (tutorial-env) $ python -m pip install -r requirements.txt Collecting novas==3.1.1.3 (from -r requirements.txt (line 1)) ... Collecting numpy==1.9.2 (from -r requirements.txt (line 2)) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index d3f04004..f91ab020 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -426,6 +426,8 @@ Miscellaneous options defines the following possible values: * ``-X faulthandler`` to enable :mod:`faulthandler`; + * ``-X oldparser``: enable the traditional LL(1) parser. See also + :envvar:`PYTHONOLDPARSER` and :pep:`617`. * ``-X showrefcount`` to output the total reference count and number of used memory blocks when the program finishes or after each statement in the interactive interpreter. This only works on debug builds. @@ -434,29 +436,14 @@ Miscellaneous options stored in a traceback of a trace. Use ``-X tracemalloc=NFRAME`` to start tracing with a traceback limit of *NFRAME* frames. See the :func:`tracemalloc.start` for more information. - * ``-X showalloccount`` to output the total count of allocated objects for - each type when the program finishes. This only works when Python was built with - ``COUNT_ALLOCS`` defined. * ``-X importtime`` to show how long each import takes. It shows module name, cumulative time (including nested imports) and self time (excluding nested imports). Note that its output may be broken in multi-threaded application. Typical usage is ``python3 -X importtime -c 'import asyncio'``. See also :envvar:`PYTHONPROFILEIMPORTTIME`. - * ``-X dev``: enable CPython's "development mode", introducing additional - runtime checks which are too expensive to be enabled by default. It should - not be more verbose than the default if the code is correct: new warnings - are only emitted when an issue is detected. Effect of the developer mode: - - * Add ``default`` warning filter, as :option:`-W` ``default``. - * Install debug hooks on memory allocators: see the - :c:func:`PyMem_SetupDebugHooks` C function. - * Enable the :mod:`faulthandler` module to dump the Python traceback - on a crash. - * Enable :ref:`asyncio debug mode `. - * Set the :attr:`~sys.flags.dev_mode` attribute of :attr:`sys.flags` to - ``True``. - * :class:`io.IOBase` destructor logs ``close()`` exceptions. - + * ``-X dev``: enable :ref:`Python Development Mode `, introducing + additional runtime checks that are too expensive to be enabled by + default. * ``-X utf8`` enables UTF-8 mode for operating system interfaces, overriding the default locale-aware mode. ``-X utf8=0`` explicitly disables UTF-8 mode (even when it would otherwise activate automatically). @@ -487,6 +474,15 @@ Miscellaneous options The ``-X pycache_prefix`` option. The ``-X dev`` option now logs ``close()`` exceptions in :class:`io.IOBase` destructor. + .. versionchanged:: 3.9 + Using ``-X dev`` option, check *encoding* and *errors* arguments on + string encoding and decoding operations. + + The ``-X showalloccount`` option has been removed. + + .. deprecated-removed:: 3.9 3.10 + The ``-X oldparser`` option. + Options you shouldn't use ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -542,6 +538,14 @@ conflict. within a Python program as the variable :data:`sys.path`. +.. envvar:: PYTHONPLATLIBDIR + + If this is set to a non-empty string, it overrides the :data:`sys.platlibdir` + value. + + .. versionadded:: 3.9 + + .. envvar:: PYTHONSTARTUP If this is the name of a readable file, the Python commands in that file are @@ -583,6 +587,15 @@ conflict. :option:`-d` multiple times. +.. envvar:: PYTHONOLDPARSER + + If this is set to a non-empty string, enable the traditional LL(1) parser. + + See also the :option:`-X` ``oldparser`` option and :pep:`617`. + + .. deprecated-removed:: 3.9 3.10 + + .. envvar:: PYTHONINSPECT If this is set to a non-empty string it is equivalent to specifying the @@ -883,8 +896,9 @@ conflict. .. envvar:: PYTHONDEVMODE - If this environment variable is set to a non-empty string, enable the - CPython "development mode". See the :option:`-X` ``dev`` option. + If this environment variable is set to a non-empty string, enable + :ref:`Python Development Mode `, introducing additional runtime + checks that are too expensive to be enabled by default. .. versionadded:: 3.7 diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index 0253625f..ead71e1b 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -25,7 +25,7 @@ there. What you get after installing is a number of things: -* A :file:`Python 3.8` folder in your :file:`Applications` folder. In here +* A :file:`Python 3.9` folder in your :file:`Applications` folder. In here you find IDLE, the development environment that is a standard part of official Python distributions; and PythonLauncher, which handles double-clicking Python scripts from the Finder. @@ -92,7 +92,7 @@ aware of: programs that talk to the Aqua window manager (in other words, anything that has a GUI) need to be run in a special way. Use :program:`pythonw` instead of :program:`python` to start such scripts. -With Python 3.8, you can use either :program:`python` or :program:`pythonw`. +With Python 3.9, you can use either :program:`python` or :program:`pythonw`. Configuration diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc index c81aaf15..c8f6e8f8 100644 --- a/Doc/using/venv-create.inc +++ b/Doc/using/venv-create.inc @@ -36,7 +36,7 @@ your :ref:`Python installation `:: The command, if run with ``-h``, will show the available options:: usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] - [--upgrade] [--without-pip] [--prompt PROMPT] + [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps] ENV_DIR [ENV_DIR ...] Creates virtual Python environments in one or more target directories. @@ -61,10 +61,15 @@ The command, if run with ``-h``, will show the available options:: environment (pip is bootstrapped by default) --prompt PROMPT Provides an alternative prompt prefix for this environment. + --upgrade-deps Upgrade core dependencies: pip setuptools to the + latest version in PyPI Once an environment has been created, you may wish to activate it, e.g. by sourcing an activate script in its bin directory. +.. versionchanged:: 3.8 + Add ``--upgrade-deps`` option to upgrade pip + setuptools to the latest on PyPI + .. versionchanged:: 3.4 Installs pip by default, added the ``--without-pip`` and ``--copies`` options @@ -110,7 +115,7 @@ directory containing the virtual environment): +=============+=================+=========================================+ | POSIX | bash/zsh | $ source /bin/activate | +-------------+-----------------+-----------------------------------------+ -| | fish | $ . /bin/activate.fish | +| | fish | $ source /bin/activate.fish | +-------------+-----------------+-----------------------------------------+ | | csh/tcsh | $ source /bin/activate.csh | +-------------+-----------------+-----------------------------------------+ diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 5114a26a..b95a43c8 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -212,13 +212,13 @@ of available options is shown below. For example, to silently install a default, system-wide Python installation, you could use the following command (from an elevated command prompt):: - python-3.8.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 + python-3.9.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 To allow users to easily install a personal copy of Python without the test suite, you could provide a shortcut with the following command. This will display a simplified initial page and disallow customization:: - python-3.8.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0 + python-3.9.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0 SimpleInstall=1 SimpleInstallDescription="Just for me, no test suite." (Note that omitting the launcher also omits file associations, and is only @@ -255,13 +255,13 @@ where a large number of installations are going to be performed it is very useful to have a locally cached copy. Execute the following command from Command Prompt to download all possible -required files. Remember to substitute ``python-3.8.0.exe`` for the actual +required files. Remember to substitute ``python-3.9.0.exe`` for the actual name of your installer, and to create layouts in their own directories to avoid collisions between files with the same name. :: - python-3.8.0.exe /layout [optional target directory] + python-3.9.0.exe /layout [optional target directory] You may also specify the ``/quiet`` option to hide the progress display. @@ -525,7 +525,7 @@ To temporarily set environment variables, open Command Prompt and use the .. code-block:: doscon - C:\>set PATH=C:\Program Files\Python 3.8;%PATH% + C:\>set PATH=C:\Program Files\Python 3.9;%PATH% C:\>set PYTHONPATH=%PYTHONPATH%;C:\My_python_lib C:\>python @@ -598,7 +598,7 @@ of your Python installation, delimited by a semicolon from other entries. An example variable could look like this (assuming the first two entries already existed):: - C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.8 + C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.9 .. _win-utf8-mode: diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 4933cba3..25b1e1e3 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -102,7 +102,7 @@ CPython implementation improvements: * :ref:`PEP 538 `, legacy C locale coercion * :ref:`PEP 540 `, forced UTF-8 runtime mode * :ref:`PEP 552 `, deterministic .pycs -* :ref:`the new development runtime mode ` +* :ref:`New Python Development Mode ` * :ref:`PEP 565 `, improved :exc:`DeprecationWarning` handling @@ -479,15 +479,15 @@ Three new translations have been added: .. _whatsnew37-devmode: -Development Runtime Mode: -X dev +Python Development Mode (-X dev) -------------------------------- The new :option:`-X` ``dev`` command line option or the new :envvar:`PYTHONDEVMODE` environment variable can be used to enable -CPython's *development mode*. When in development mode, CPython performs +:ref:`Python Development Mode `. When in development mode, Python performs additional runtime checks that are too expensive to be enabled by default. -See :option:`-X` ``dev`` documentation for the full description of the effects -of this mode. +See :ref:`Python Development Mode ` documentation for the full +description. Other Language Changes diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 7a86e511..a2fa1781 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -47,8 +47,6 @@ This article explains the new features in Python 3.8, compared to 3.7. For full details, see the :ref:`changelog `. -Python 3.8 was released on October 14th, 2019. - .. testsetup:: from datetime import date @@ -348,20 +346,20 @@ See :pep:`587` for a full description. (Contributed by Victor Stinner in :issue:`36763`.) -Vectorcall: a fast calling protocol for CPython ------------------------------------------------ +PEP 590: Vectorcall: a fast calling protocol for CPython +-------------------------------------------------------- -The "vectorcall" protocol is added to the Python/C API. +:ref:`vectorcall` is added to the Python/C API. It is meant to formalize existing optimizations which were already done for various classes. -Any extension type implementing a callable can use this protocol. +Any static type implementing a callable can use this protocol. This is currently provisional. The aim is to make it fully public in Python 3.9. See :pep:`590` for a full description. -(Contributed by Jeroen Demeyer and Mark Shannon in :issue:`36974`.) +(Contributed by Jeroen Demeyer, Mark Shannon and Petr Viktorin in :issue:`36974`.) Pickle protocol 5 with out-of-band data buffers @@ -430,8 +428,8 @@ Other Language Changes lastname, *members = family.split() return lastname.upper(), *members - >>> parse('simpsons homer marge bart lisa sally') - ('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'sally') + >>> parse('simpsons homer marge bart lisa maggie') + ('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'maggie') (Contributed by David Cuthbert and Jordan Chapman in :issue:`32117`.) @@ -2229,18 +2227,3 @@ because of the behavior of the socket option ``SO_REUSEADDR`` in UDP. For more details, see the documentation for ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in :issue:`37228`.) - -Notable changes in Python 3.8.2 -=============================== - -Fixed a regression with the ``ignore`` callback of :func:`shutil.copytree`. -The argument types are now str and List[str] again. -(Contributed by Manuel Barkhau and Giampaolo Rodola in :issue:`39390`.) - -Notable changes in Python 3.8.3 -=============================== - -The constant values of future flags in the :mod:`__future__` module -are updated in order to prevent collision with compiler flags. Previously -``PyCF_ALLOW_TOP_LEVEL_AWAIT`` was clashing with ``CO_FUTURE_DIVISION``. -(Contributed by Batuhan Taskaya in :issue:`39562`) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst new file mode 100644 index 00000000..9a09e710 --- /dev/null +++ b/Doc/whatsnew/3.9.rst @@ -0,0 +1,1452 @@ +**************************** + What's New In Python 3.9 +**************************** + +:Release: |release| +:Date: |today| +:Editor: Łukasz Langa + +.. Rules for maintenance: + + * Anyone can add text to this document. Your text might get + rewritten to some degree. + + * The maintainer will go through Misc/NEWS periodically and add + changes; it's therefore more important to add your changes to + Misc/NEWS than to this file. + + * This is not a complete list of every single change; completeness + is the purpose of Misc/NEWS. Some changes will be too small + or esoteric to include. If such a change is added to the text, + it might get removed during final editing. + + * If you want to draw your new text to the attention of the + maintainer, add 'XXX' to the beginning of the paragraph or + section. + + * It's OK to just add a fragmentary note about a change. For + example: "XXX Describe the transmogrify() function added to the + socket module." The maintainer will research the change and + write the necessary text. + + * You can comment out your additions if you like, but it's not + necessary (especially when a final release is some months away). + + * Credit the author of a patch or bugfix. Just the name is + sufficient; the e-mail address isn't necessary. + + * It's helpful to add the bug/patch number as a comment: + + XXX Describe the transmogrify() function added to the socket + module. + (Contributed by P.Y. Developer in :issue:`12345`.) + + This saves the maintainer the effort of going through the Mercurial log + when researching a change. + +This article explains the new features in Python 3.9, compared to 3.8. +Python 3.9 was released on October 5th, 2020. + +For full details, see the :ref:`changelog `. + +.. seealso:: + + :pep:`596` - Python 3.9 Release Schedule + + +Summary -- Release highlights +============================= + +.. This section singles out the most important changes in Python 3.9. + Brevity is key. + +New syntax features: + +* :pep:`584`, union operators added to ``dict``; +* :pep:`585`, type hinting generics in standard collections; +* :pep:`614`, relaxed grammar restrictions on decorators. + +New built-in features: + +* :pep:`616`, string methods to remove prefixes and suffixes. + +New features in the standard library: + +* :pep:`593`, flexible function and variable annotations; +* :func:`os.pidfd_open` added that allows process management without races + and signals. + +Interpreter improvements: + +* :pep:`573`, fast access to module state from methods of C extension + types; +* :pep:`617`, CPython now uses a new parser based on PEG; +* a number of Python builtins (range, tuple, set, frozenset, list, dict) are + now sped up using :pep:`590` vectorcall; +* garbage collection does not block on resurrected objects; +* a number of Python modules (:mod:`_abc`, :mod:`audioop`, :mod:`_bz2`, + :mod:`_codecs`, :mod:`_contextvars`, :mod:`_crypt`, :mod:`_functools`, + :mod:`_json`, :mod:`_locale`, :mod:`math`, :mod:`operator`, :mod:`resource`, + :mod:`time`, :mod:`_weakref`) now use multiphase initialization as defined + by PEP 489; +* a number of standard library modules (:mod:`audioop`, :mod:`ast`, :mod:`grp`, + :mod:`_hashlib`, :mod:`pwd`, :mod:`_posixsubprocess`, :mod:`random`, + :mod:`select`, :mod:`struct`, :mod:`termios`, :mod:`zlib`) are now using + the stable ABI defined by PEP 384. + +New library modules: + +* :pep:`615`, the IANA Time Zone Database is now present in the standard + library in the :mod:`zoneinfo` module; +* an implementation of a topological sort of a graph is now provided in + the new :mod:`graphlib` module. + +Release process changes: + +* :pep:`602`, CPython adopts an annual release cycle. + + +You should check for DeprecationWarning in your code +==================================================== + +When Python 2.7 was still supported, a lot of functionality in Python 3 +was kept for backward compatibility with Python 2.7. With the end of Python +2 support, these backward compatibility layers have been removed, or will +be removed soon. Most of them emitted a :exc:`DeprecationWarning` warning for +several years. For example, using ``collections.Mapping`` instead of +``collections.abc.Mapping`` emits a :exc:`DeprecationWarning` since Python +3.3, released in 2012. + +Test your application with the :option:`-W` ``default`` command-line option to see +:exc:`DeprecationWarning` and :exc:`PendingDeprecationWarning`, or even with +:option:`-W` ``error`` to treat them as errors. :ref:`Warnings Filter +` can be used to ignore warnings from third-party code. + +Python 3.9 is the last version providing those Python 2 backward compatibility +layers, to give more time to Python projects maintainers to organize the +removal of the Python 2 support and add support for Python 3.9. + +Aliases to :ref:`Abstract Base Classes ` in +the :mod:`collections` module, like ``collections.Mapping`` alias to +:class:`collections.abc.Mapping`, are kept for one last release for backward +compatibility. They will be removed from Python 3.10. + +More generally, try to run your tests in the :ref:`Python Development Mode +` which helps to prepare your code to make it compatible with the +next Python version. + +Note: a number of pre-existing deprecatations were removed in this version +of Python as well. Consult the :ref:`removed-in-python-39` section. + + +New Features +============ + +Dictionary Merge & Update Operators +----------------------------------- + +Merge (``|``) and update (``|=``) operators have been added to the built-in +:class:`dict` class. Those complement the existing ``dict.update`` and +``{**d1, **d2}`` methods of merging dictionaries. + +Example:: + + >>> x = {"key1": "value1 from x", "key2": "value2 from x"} + >>> y = {"key2": "value2 from y", "key3": "value3 from y"} + >>> x | y + {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'} + >>> y | x + {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'} + +See :pep:`584` for a full description. +(Contributed by Brandt Bucher in :issue:`36144`.) + +New String Methods to Remove Prefixes and Suffixes +-------------------------------------------------- + +:meth:`str.removeprefix(prefix)` and +:meth:`str.removesuffix(suffix)` have been added +to easily remove an unneeded prefix or a suffix from a string. Corresponding +``bytes``, ``bytearray``, and ``collections.UserString`` methods have also been +added. See :pep:`616` for a full description. (Contributed by Dennis Sweeney in +:issue:`39939`.) + +Type Hinting Generics in Standard Collections +--------------------------------------------- + +In type annotations you can now use built-in collection types such as +``list`` and ``dict`` as generic types instead of importing the +corresponding capitalized types (e.g. ``List`` or ``Dict``) from +``typing``. Some other types in the standard library are also now generic, +for example ``queue.Queue``. + +Example: + +.. code-block:: python + + def greet_all(names: list[str]) -> None: + for name in names: + print("Hello", name) + +See :pep:`585` for more details. (Contributed by Guido van Rossum, +Ethan Smith, and Batuhan Taşkaya in :issue:`39481`.) + +New Parser +---------- + +Python 3.9 uses a new parser, based on `PEG +`_ instead +of `LL(1) `_. The new +parser's performance is roughly comparable to that of the old parser, +but the PEG formalism is more flexible than LL(1) when it comes to +designing new language features. We'll start using this flexibility +in Python 3.10 and later. + +The :mod:`ast` module uses the new parser and produces the same AST as +the old parser. + +In Python 3.10, the old parser will be deleted and so will all +functionality that depends on it (primarily the :mod:`parser` module, +which has long been deprecated). In Python 3.9 *only*, you can switch +back to the LL(1) parser using a command line switch (``-X +oldparser``) or an environment variable (``PYTHONOLDPARSER=1``). + +See :pep:`617` for more details. (Contributed by Guido van Rossum, +Pablo Galindo and Lysandros Nikolaou in :issue:`40334`.) + + +Other Language Changes +====================== + +* :func:`__import__` now raises :exc:`ImportError` instead of + :exc:`ValueError`, which used to occur when a relative import went past + its top-level package. + (Contributed by Ngalim Siregar in :issue:`37444`.) + +* Python now gets the absolute path of the script filename specified on + the command line (ex: ``python3 script.py``): the ``__file__`` attribute of + the :mod:`__main__` module became an absolute path, rather than a relative + path. These paths now remain valid after the current directory is changed + by :func:`os.chdir`. As a side effect, the traceback also displays the + absolute path for :mod:`__main__` module frames in this case. + (Contributed by Victor Stinner in :issue:`20443`.) + +* In the :ref:`Python Development Mode ` and in debug build, the + *encoding* and *errors* arguments are now checked for string encoding and + decoding operations. Examples: :func:`open`, :meth:`str.encode` and + :meth:`bytes.decode`. + + By default, for best performance, the *errors* argument is only checked at + the first encoding/decoding error and the *encoding* argument is sometimes + ignored for empty strings. + (Contributed by Victor Stinner in :issue:`37388`.) + +* ``"".replace("", s, n)`` now returns ``s`` instead of an empty string for + all non-zero ``n``. It is now consistent with ``"".replace("", s)``. + There are similar changes for :class:`bytes` and :class:`bytearray` objects. + (Contributed by Serhiy Storchaka in :issue:`28029`.) + +* Any valid expression can now be used as a :term:`decorator`. Previously, the + grammar was much more restrictive. See :pep:`614` for details. + (Contributed by Brandt Bucher in :issue:`39702`.) + +* Improved help for the :mod:`typing` module. Docstrings are now shown for + all special forms and special generic aliases (like ``Union`` and ``List``). + Using :func:`help` with generic alias like ``List[int]`` will show the help + for the correspondent concrete type (``list`` in this case). + (Contributed by Serhiy Storchaka in :issue:`40257`.) + +* Parallel running of :meth:`~agen.aclose` / :meth:`~agen.asend` / + :meth:`~agen.athrow` is now prohibited, and ``ag_running`` now reflects + the actual running status of the async generator. + (Contributed by Yury Selivanov in :issue:`30773`.) + +* Unexpected errors in calling the ``__iter__`` method are no longer masked by + ``TypeError`` in the :keyword:`in` operator and functions + :func:`~operator.contains`, :func:`~operator.indexOf` and + :func:`~operator.countOf` of the :mod:`operator` module. + (Contributed by Serhiy Storchaka in :issue:`40824`.) + + +New Modules +=========== + +zoneinfo +-------- + +The :mod:`zoneinfo` module brings support for the IANA time zone database to +the standard library. It adds :class:`zoneinfo.ZoneInfo`, a concrete +:class:`datetime.tzinfo` implementation backed by the system's time zone data. + +Example:: + + >>> from zoneinfo import ZoneInfo + >>> from datetime import datetime, timedelta + + >>> # Daylight saving time + >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles")) + >>> print(dt) + 2020-10-31 12:00:00-07:00 + >>> dt.tzname() + 'PDT' + + >>> # Standard time + >>> dt += timedelta(days=7) + >>> print(dt) + 2020-11-07 12:00:00-08:00 + >>> print(dt.tzname()) + PST + + +As a fall-back source of data for platforms that don't ship the IANA database, +the |tzdata|_ module was released as a first-party package -- distributed via +PyPI and maintained by the CPython core team. + +.. |tzdata| replace:: ``tzdata`` +.. _tzdata: https://pypi.org/project/tzdata/ + +.. seealso:: + + :pep:`615` -- Support for the IANA Time Zone Database in the Standard Library + PEP written and implemented by Paul Ganssle + + +graphlib +--------- + +A new module, :mod:`graphlib`, was added that contains the +:class:`graphlib.TopologicalSorter` class to offer functionality to perform +topological sorting of graphs. (Contributed by Pablo Galindo, Tim Peters and +Larry Hastings in :issue:`17005`.) + + +Improved Modules +================ + +ast +--- + +Added the *indent* option to :func:`~ast.dump` which allows it to produce a +multiline indented output. +(Contributed by Serhiy Storchaka in :issue:`37995`.) + +Added :func:`ast.unparse` as a function in the :mod:`ast` module that can +be used to unparse an :class:`ast.AST` object and produce a string with code +that would produce an equivalent :class:`ast.AST` object when parsed. +(Contributed by Pablo Galindo and Batuhan Taskaya in :issue:`38870`.) + +Added docstrings to AST nodes that contains the ASDL signature used to +construct that node. (Contributed by Batuhan Taskaya in :issue:`39638`.) + +asyncio +------- + +Due to significant security concerns, the *reuse_address* parameter of +:meth:`asyncio.loop.create_datagram_endpoint` is no longer supported. This is +because of the behavior of the socket option ``SO_REUSEADDR`` in UDP. For more +details, see the documentation for ``loop.create_datagram_endpoint()``. +(Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in +:issue:`37228`.) + +Added a new :term:`coroutine` :meth:`~asyncio.loop.shutdown_default_executor` +that schedules a shutdown for the default executor that waits on the +:class:`~concurrent.futures.ThreadPoolExecutor` to finish closing. Also, +:func:`asyncio.run` has been updated to use the new :term:`coroutine`. +(Contributed by Kyle Stanley in :issue:`34037`.) + +Added :class:`asyncio.PidfdChildWatcher`, a Linux-specific child watcher +implementation that polls process file descriptors. (:issue:`38692`) + +Added a new :term:`coroutine` :func:`asyncio.to_thread`. It is mainly used for +running IO-bound functions in a separate thread to avoid blocking the event +loop, and essentially works as a high-level version of +:meth:`~asyncio.loop.run_in_executor` that can directly take keyword arguments. +(Contributed by Kyle Stanley and Yury Selivanov in :issue:`32309`.) + +When cancelling the task due to a timeout, :meth:`asyncio.wait_for` will now +wait until the cancellation is complete also in the case when *timeout* is +<= 0, like it does with positive timeouts. +(Contributed by Elvis Pranskevichus in :issue:`32751`.) + +:mod:`asyncio` now raises :exc:`TyperError` when calling incompatible +methods with an :class:`ssl.SSLSocket` socket. +(Contributed by Ido Michael in :issue:`37404`.) + +compileall +---------- + +Added new possibility to use hardlinks for duplicated ``.pyc`` files: *hardlink_dupes* parameter and --hardlink-dupes command line option. +(Contributed by Lumír 'Frenzy' Balhar in :issue:`40495`.) + +Added new options for path manipulation in resulting ``.pyc`` files: *stripdir*, *prependdir*, *limit_sl_dest* parameters and -s, -p, -e command line options. +Added the possibility to specify the option for an optimization level multiple times. +(Contributed by Lumír 'Frenzy' Balhar in :issue:`38112`.) + +concurrent.futures +------------------ + +Added a new *cancel_futures* parameter to +:meth:`concurrent.futures.Executor.shutdown` that cancels all pending futures +which have not started running, instead of waiting for them to complete before +shutting down the executor. +(Contributed by Kyle Stanley in :issue:`39349`.) + +Removed daemon threads from :class:`~concurrent.futures.ThreadPoolExecutor` +and :class:`~concurrent.futures.ProcessPoolExecutor`. This improves +compatibility with subinterpreters and predictability in their shutdown +processes. (Contributed by Kyle Stanley in :issue:`39812`.) + +Workers in :class:`~concurrent.futures.ProcessPoolExecutor` are now spawned on +demand, only when there are no available idle workers to reuse. This optimizes +startup overhead and reduces the amount of lost CPU time to idle workers. +(Contributed by Kyle Stanley in :issue:`39207`.) + +curses +------ + +Added :func:`curses.get_escdelay`, :func:`curses.set_escdelay`, +:func:`curses.get_tabsize`, and :func:`curses.set_tabsize` functions. +(Contributed by Anthony Sottile in :issue:`38312`.) + +datetime +-------- +The :meth:`~datetime.date.isocalendar()` of :class:`datetime.date` +and :meth:`~datetime.datetime.isocalendar()` of :class:`datetime.datetime` +methods now returns a :func:`~collections.namedtuple` instead of a :class:`tuple`. +(Contributed by Dong-hee Na in :issue:`24416`.) + +distutils +--------- + +The :command:`upload` command now creates SHA2-256 and Blake2b-256 hash +digests. It skips MD5 on platforms that block MD5 digest. +(Contributed by Christian Heimes in :issue:`40698`.) + +fcntl +----- + +Added constants :data:`~fcntl.F_OFD_GETLK`, :data:`~fcntl.F_OFD_SETLK` +and :data:`~fcntl.F_OFD_SETLKW`. +(Contributed by Dong-hee Na in :issue:`38602`.) + +ftplib +------- + +:class:`~ftplib.FTP` and :class:`~ftplib.FTP_TLS` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + +gc +-- + +When the garbage collector makes a collection in which some objects resurrect +(they are reachable from outside the isolated cycles after the finalizers have +been executed), do not block the collection of all objects that are still +unreachable. (Contributed by Pablo Galindo and Tim Peters in :issue:`38379`.) + +Added a new function :func:`gc.is_finalized` to check if an object has been +finalized by the garbage collector. (Contributed by Pablo Galindo in +:issue:`39322`.) + +hashlib +------- + +The :mod:`hashlib` module can now use SHA3 hashes and SHAKE XOF from OpenSSL +when available. +(Contributed by Christian Heimes in :issue:`37630`.) + +Builtin hash modules can now be disabled with +``./configure --without-builtin-hashlib-hashes`` or selectively enabled with +e.g. ``./configure --with-builtin-hashlib-hashes=sha3,blake2`` to force use +of OpenSSL based implementation. +(Contributed by Christian Heimes in :issue:`40479`) + + +http +---- + +HTTP status codes ``103 EARLY_HINTS``, ``418 IM_A_TEAPOT`` and ``425 TOO_EARLY`` are added to +:class:`http.HTTPStatus`. (Contributed by Dong-hee Na in :issue:`39509` and Ross Rhodes in :issue:`39507`.) + +IDLE and idlelib +---------------- + +Added option to toggle cursor blink off. (Contributed by Zackery Spytz +in :issue:`4603`.) + +Escape key now closes IDLE completion windows. (Contributed by Johnny +Najera in :issue:`38944`.) + +Added keywords to module name completion list. (Contributed by Terry J. +Reedy in :issue:`37765`.) + +The changes above have been backported to 3.8 maintenance releases. + +imaplib +------- + +:class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now have +an optional *timeout* parameter for their constructors. +Also, the :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter +with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and +:class:`~imaplib.IMAP4_stream` were applied to this change. +(Contributed by Dong-hee Na in :issue:`38615`.) + +:meth:`imaplib.IMAP4.unselect` is added. +:meth:`imaplib.IMAP4.unselect` frees server's resources associated with the +selected mailbox and returns the server to the authenticated +state. This command performs the same actions as :meth:`imaplib.IMAP4.close`, except +that no messages are permanently removed from the currently +selected mailbox. (Contributed by Dong-hee Na in :issue:`40375`.) + +importlib +--------- + +To improve consistency with import statements, :func:`importlib.util.resolve_name` +now raises :exc:`ImportError` instead of :exc:`ValueError` for invalid relative +import attempts. +(Contributed by Ngalim Siregar in :issue:`37444`.) + +Import loaders which publish immutable module objects can now publish +immutable packages in addition to individual modules. +(Contributed by Dino Viehland in :issue:`39336`.) + +Added :func:`importlib.resources.files` function with support for +subdirectories in package data, matching backport in ``importlib_resources`` +version 1.5. +(Contributed by Jason R. Coombs in :issue:`39791`.) + +Refreshed ``importlib.metadata`` from ``importlib_metadata`` version 1.6.1. + +inspect +------- + +:attr:`inspect.BoundArguments.arguments` is changed from ``OrderedDict`` to regular +dict. (Contributed by Inada Naoki in :issue:`36350` and :issue:`39775`.) + +ipaddress +--------- + +:mod:`ipaddress` now supports IPv6 Scoped Addresses (IPv6 address with suffix ``%``). + +Scoped IPv6 addresses can be parsed using :class:`ipaddress.IPv6Address`. +If present, scope zone ID is available through the :attr:`~ipaddress.IPv6Address.scope_id` attribute. +(Contributed by Oleksandr Pavliuk in :issue:`34788`.) + +math +---- + +Expanded the :func:`math.gcd` function to handle multiple arguments. +Formerly, it only supported two arguments. +(Contributed by Serhiy Storchaka in :issue:`39648`.) + +Added :func:`math.lcm`: return the least common multiple of specified arguments. +(Contributed by Mark Dickinson, Ananthakrishnan and Serhiy Storchaka in +:issue:`39479` and :issue:`39648`.) + +Added :func:`math.nextafter`: return the next floating-point value after *x* +towards *y*. +(Contributed by Victor Stinner in :issue:`39288`.) + +Added :func:`math.ulp`: return the value of the least significant bit +of a float. +(Contributed by Victor Stinner in :issue:`39310`.) + +multiprocessing +--------------- + +The :class:`multiprocessing.SimpleQueue` class has a new +:meth:`~multiprocessing.SimpleQueue.close` method to explicitly close the +queue. +(Contributed by Victor Stinner in :issue:`30966`.) + +nntplib +------- + +:class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + +os +-- + +Added :data:`~os.CLD_KILLED` and :data:`~os.CLD_STOPPED` for :attr:`si_code`. +(Contributed by Dong-hee Na in :issue:`38493`.) + +Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and +:data:`os.P_PIDFD` (:issue:`38713`) for process management with file +descriptors. + +The :func:`os.unsetenv` function is now also available on Windows. +(Contributed by Victor Stinner in :issue:`39413`.) + +The :func:`os.putenv` and :func:`os.unsetenv` functions are now always +available. +(Contributed by Victor Stinner in :issue:`39395`.) + +Added :func:`os.waitstatus_to_exitcode` function: +convert a wait status to an exit code. +(Contributed by Victor Stinner in :issue:`40094`.) + +pathlib +------- + +Added :meth:`pathlib.Path.readlink()` which acts similarly to +:func:`os.readlink`. +(Contributed by Girts Folkmanis in :issue:`30618`) + +pdb +--- + +On Windows now :class:`~pdb.Pdb` supports ``~/.pdbrc``. +(Contributed by Tim Hopper and Dan Lidral-Porter in :issue:`20523`.) + +poplib +------ + +:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + +pprint +------ + +:mod:`pprint` can now pretty-print :class:`types.SimpleNamespace`. +(Contributed by Carl Bordum Hansen in :issue:`37376`.) + +pydoc +----- + +The documentation string is now shown not only for class, function, +method etc, but for any object that has its own ``__doc__`` attribute. +(Contributed by Serhiy Storchaka in :issue:`40257`.) + +random +------ + +Added a new :attr:`random.Random.randbytes` method: generate random bytes. +(Contributed by Victor Stinner in :issue:`40286`.) + +signal +------ + +Exposed the Linux-specific :func:`signal.pidfd_send_signal` for sending to +signals to a process using a file descriptor instead of a pid. (:issue:`38712`) + +smtplib +------- + +:class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + +:class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. +(Contributed by Dong-hee Na in :issue:`39329`.) + +socket +------ + +The :mod:`socket` module now exports the :data:`~socket.CAN_RAW_JOIN_FILTERS` +constant on Linux 4.1 and greater. +(Contributed by Stefan Tatschner and Zackery Spytz in :issue:`25780`.) + +The socket module now supports the :data:`~socket.CAN_J1939` protocol on +platforms that support it. (Contributed by Karl Ding in :issue:`40291`.) + +The socket module now has the :func:`socket.send_fds` and +:func:`socket.recv.fds` methods. (Contributed by Joannah Nanjekye, Shinya +Okano and Victor Stinner in :issue:`28724`.) + + +time +---- + +On AIX, :func:`~time.thread_time` is now implemented with ``thread_cputime()`` +which has nanosecond resolution, rather than +``clock_gettime(CLOCK_THREAD_CPUTIME_ID)`` which has a resolution of 10 ms. +(Contributed by Batuhan Taskaya in :issue:`40192`) + +sys +--- + +Added a new :attr:`sys.platlibdir` attribute: name of the platform-specific +library directory. It is used to build the path of standard library and the +paths of installed extension modules. It is equal to ``"lib"`` on most +platforms. On Fedora and SuSE, it is equal to ``"lib64"`` on 64-bit platforms. +(Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in :issue:`1294959`.) + +Previously, :attr:`sys.stderr` was block-buffered when non-interactive. Now +``stderr`` defaults to always being line-buffered. +(Contributed by Jendrik Seipp in :issue:`13601`.) + +tracemalloc +----------- + +Added :func:`tracemalloc.reset_peak` to set the peak size of traced memory +blocks to the current size, to measure the peak of specific pieces of code. +(Contributed by Huon Wilson in :issue:`40630`.) + +typing +------ + +:pep:`593` introduced an :data:`typing.Annotated` type to decorate existing +types with context-specific metadata and new ``include_extras`` parameter to +:func:`typing.get_type_hints` to access the metadata at runtime. (Contributed +by Till Varoquaux and Konstantin Kashin.) + +unicodedata +----------- + +The Unicode database has been updated to version 13.0.0. (:issue:`39926`). + +venv +---- + +The activation scripts provided by :mod:`venv` now all specify their prompt +customization consistently by always using the value specified by +``__VENV_PROMPT__``. Previously some scripts unconditionally used +``__VENV_PROMPT__``, others only if it happened to be set (which was the default +case), and one used ``__VENV_NAME__`` instead. +(Contributed by Brett Cannon in :issue:`37663`.) + +xml +--- + +White space characters within attributes are now preserved when serializing +:mod:`xml.etree.ElementTree` to XML file. EOLNs are no longer normalized +to "\n". This is the result of discussion about how to interpret +section 2.11 of XML spec. +(Contributed by Mefistotelis in :issue:`39011`.) + + +Optimizations +============= + +* Optimized the idiom for assignment a temporary variable in comprehensions. + Now ``for y in [expr]`` in comprehensions is as fast as a simple assignment + ``y = expr``. For example: + + sums = [s for s in [0] for x in data for s in [s + x]] + + Unlike the ``:=`` operator this idiom does not leak a variable to the + outer scope. + + (Contributed by Serhiy Storchaka in :issue:`32856`.) + +* Optimized signal handling in multithreaded applications. If a thread different + than the main thread gets a signal, the bytecode evaluation loop is no longer + interrupted at each bytecode instruction to check for pending signals which + cannot be handled. Only the main thread of the main interpreter can handle + signals. + + Previously, the bytecode evaluation loop was interrupted at each instruction + until the main thread handles signals. + (Contributed by Victor Stinner in :issue:`40010`.) + +* Optimized the :mod:`subprocess` module on FreeBSD using ``closefrom()``. + (Contributed by Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak and Victor + Stinner in :issue:`38061`.) + +* :c:func:`PyLong_FromDouble` is now up to 1.87x faster for values that + fit into :c:type:`long`. + (Contributed by Sergey Fedoseev in :issue:`37986`.) + +* A number of Python builtins (:class:`range`, :class:`tuple`, :class:`set`, + :class:`frozenset`, :class:`list`, :class:`dict`) are now sped up by using + :pep:`590` vectorcall protocol. + (Contributed by Dong-hee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in :issue:`37207`.) + +* Optimized :func:`~set.difference_update` for the case when the other set + is much larger than the base set. + (Suggested by Evgeny Kapun with code contributed by Michele Orrù in :issue:`8425`.) + +* Python's small object allocator (``obmalloc.c``) now allows (no more than) + one empty arena to remain available for immediate reuse, without returning + it to the OS. This prevents thrashing in simple loops where an arena could + be created and destroyed anew on each iteration. + (Contributed by Tim Peters in :issue:`37257`.) + +* :term:`floor division` of float operation now has a better performance. Also + the message of :exc:`ZeroDivisionError` for this operation is updated. + (Contributed by Dong-hee Na in :issue:`39434`.) + +* Decoding short ASCII strings with UTF-8 and ascii codecs is now about + 15% faster. (Contributed by Inada Naoki in :issue:`37348`.) + +Here's a summary of performance improvements from Python 3.4 through Python 3.9: + +.. code-block:: none + + Python version 3.4 3.5 3.6 3.7 3.8 3.9 + -------------- --- --- --- --- --- --- + + Variable and attribute read access: + read_local 7.1 7.1 5.4 5.1 3.9 4.0 + read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8 + read_global 15.5 19.0 14.3 13.6 7.6 7.7 + read_builtin 21.1 21.6 18.5 19.0 7.5 7.7 + read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6 + read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1 + read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7 + read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5 + read_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2 + read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9 + + Variable and attribute write access: + write_local 8.7 9.3 5.5 5.3 4.3 4.2 + write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9 + write_global 19.7 21.2 18.0 18.0 15.8 17.2 + write_classvar 92.9 96.0 104.6 102.1 39.2 43.2 + write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7 + write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7 + + Data structure read access: + read_list 24.2 24.5 20.8 20.8 19.0 21.1 + read_deque 24.7 25.5 20.2 20.6 19.8 21.6 + read_dict 24.3 25.7 22.3 23.0 21.0 22.5 + read_strdict 22.6 24.3 19.5 21.2 18.9 21.6 + + Data structure write access: + write_list 27.1 28.5 22.5 21.6 20.0 21.6 + write_deque 28.7 30.1 22.7 21.8 23.5 23.2 + write_dict 31.4 33.3 29.3 29.2 24.7 27.8 + write_strdict 28.4 29.9 27.5 25.2 23.1 29.8 + + Stack (or queue) operations: + list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9 + deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5 + deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5 + + Timing loop: + loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3 + +These results were generated from the variable access benchmark script at: +``Tools/scripts/var_access_benchmark.py``. The benchmark script displays timings +in nanoseconds. The benchmarks were measured on an +`Intel® Core™ i7-4960HQ processor +`_ +running the macOS 64-bit builds found at +`python.org `_. + + +Deprecated +========== + +* The distutils ``bdist_msi`` command is now deprecated, use + ``bdist_wheel`` (wheel packages) instead. + (Contributed by Hugo van Kemenade in :issue:`39586`.) + +* Currently :func:`math.factorial` accepts :class:`float` instances with + non-negative integer values (like ``5.0``). It raises a :exc:`ValueError` + for non-integral and negative floats. It is now deprecated. In future + Python versions it will raise a :exc:`TypeError` for all floats. + (Contributed by Serhiy Storchaka in :issue:`37315`.) + +* The :mod:`parser` and :mod:`symbol` modules are deprecated and will be + removed in future versions of Python. For the majority of use cases, + users can leverage the Abstract Syntax Tree (AST) generation and compilation + stage, using the :mod:`ast` module. + +* The Public C API functions :c:func:`PyParser_SimpleParseStringFlags`, + :c:func:`PyParser_SimpleParseStringFlagsFilename`, + :c:func:`PyParser_SimpleParseFileFlags` and :c:func:`PyNode_Compile` + are deprecated and will be removed in Python 3.10 together with the old parser. + +* Using :data:`NotImplemented` in a boolean context has been deprecated, + as it is almost exclusively the result of incorrect rich comparator + implementations. It will be made a :exc:`TypeError` in a future version + of Python. + (Contributed by Josh Rosenberg in :issue:`35712`.) + +* The :mod:`random` module currently accepts any hashable type as a + possible seed value. Unfortunately, some of those types are not + guaranteed to have a deterministic hash value. After Python 3.9, + the module will restrict its seeds to :const:`None`, :class:`int`, + :class:`float`, :class:`str`, :class:`bytes`, and :class:`bytearray`. + +* Opening the :class:`~gzip.GzipFile` file for writing without specifying + the *mode* argument is deprecated. In future Python versions it will always + be opened for reading by default. Specify the *mode* argument for opening + it for writing and silencing a warning. + (Contributed by Serhiy Storchaka in :issue:`28286`.) + +* Deprecated the ``split()`` method of :class:`_tkinter.TkappType` in + favour of the ``splitlist()`` method which has more consistent and + predicable behavior. + (Contributed by Serhiy Storchaka in :issue:`38371`.) + +* The explicit passing of coroutine objects to :func:`asyncio.wait` has been + deprecated and will be removed in version 3.11. + (Contributed by Yury Selivanov and Kyle Stanley in :issue:`34790`.) + +* binhex4 and hexbin4 standards are now deprecated. The :mod:`binhex` module + and the following :mod:`binascii` functions are now deprecated: + + * :func:`~binascii.b2a_hqx`, :func:`~binascii.a2b_hqx` + * :func:`~binascii.rlecode_hqx`, :func:`~binascii.rledecode_hqx` + + (Contributed by Victor Stinner in :issue:`39353`.) + +* :mod:`ast` classes ``slice``, ``Index`` and ``ExtSlice`` are considered deprecated + and will be removed in future Python versions. ``value`` itself should be + used instead of ``Index(value)``. ``Tuple(slices, Load())`` should be + used instead of ``ExtSlice(slices)``. + (Contributed by Serhiy Storchaka in :issue:`32892`.) + +* :mod:`ast` classes ``Suite``, ``Param``, ``AugLoad`` and ``AugStore`` + are considered deprecated and will be removed in future Python versions. + They were not generated by the parser and not accepted by the code + generator in Python 3. + (Contributed by Batuhan Taskaya in :issue:`39639` and :issue:`39969` + and Serhiy Storchaka in :issue:`39988`.) + +* The :c:func:`PyEval_InitThreads` and :c:func:`PyEval_ThreadsInitialized` + functions are now deprecated and will be removed in Python 3.11. Calling + :c:func:`PyEval_InitThreads` now does nothing. The :term:`GIL` is initialized + by :c:func:`Py_Initialize()` since Python 3.7. + (Contributed by Victor Stinner in :issue:`39877`.) + +* Passing ``None`` as the first argument to the :func:`shlex.split` function + has been deprecated. (Contributed by Zackery Spytz in :issue:`33262`.) + +* :func:`smtpd.MailmanProxy` is now deprecated as it is unusable without + an external module, ``mailman``. (Contributed by Samuel Colvin in :issue:`35800`.) + +* The :mod:`lib2to3` module now emits a :exc:`PendingDeprecationWarning`. + Python 3.9 switched to a PEG parser (see :pep:`617`), and Python 3.10 may + include new language syntax that is not parsable by lib2to3's LL(1) parser. + The ``lib2to3`` module may be removed from the standard library in a future + Python version. Consider third-party alternatives such as `LibCST`_ or + `parso`_. + (Contributed by Carl Meyer in :issue:`40360`.) + +* The *random* parameter of :func:`random.shuffle` has been deprecated. + (Contributed by Raymond Hettinger in :issue:`40465`) + +.. _LibCST: https://libcst.readthedocs.io/ +.. _parso: https://parso.readthedocs.io/ + +.. _removed-in-python-39: + +Removed +======= + +* The erroneous version at :data:`unittest.mock.__version__` has been removed. + +* :class:`nntplib.NNTP`: ``xpath()`` and ``xgtitle()`` methods have been removed. + These methods are deprecated since Python 3.3. Generally, these extensions + are not supported or not enabled by NNTP server administrators. + For ``xgtitle()``, please use :meth:`nntplib.NNTP.descriptions` or + :meth:`nntplib.NNTP.description` instead. + (Contributed by Dong-hee Na in :issue:`39366`.) + +* :class:`array.array`: ``tostring()`` and ``fromstring()`` methods have been + removed. They were aliases to ``tobytes()`` and ``frombytes()``, deprecated + since Python 3.2. + (Contributed by Victor Stinner in :issue:`38916`.) + +* The undocumented ``sys.callstats()`` function has been removed. Since Python + 3.7, it was deprecated and always returned :const:`None`. It required a special + build option ``CALL_PROFILE`` which was already removed in Python 3.7. + (Contributed by Victor Stinner in :issue:`37414`.) + +* The ``sys.getcheckinterval()`` and ``sys.setcheckinterval()`` functions have + been removed. They were deprecated since Python 3.2. Use + :func:`sys.getswitchinterval` and :func:`sys.setswitchinterval` instead. + (Contributed by Victor Stinner in :issue:`37392`.) + +* The C function ``PyImport_Cleanup()`` has been removed. It was documented as: + "Empty the module table. For internal use only." + (Contributed by Victor Stinner in :issue:`36710`.) + +* ``_dummy_thread`` and ``dummy_threading`` modules have been removed. These + modules were deprecated since Python 3.7 which requires threading support. + (Contributed by Victor Stinner in :issue:`37312`.) + +* ``aifc.openfp()`` alias to ``aifc.open()``, ``sunau.openfp()`` alias to + ``sunau.open()``, and ``wave.openfp()`` alias to :func:`wave.open()` have been + removed. They were deprecated since Python 3.7. + (Contributed by Victor Stinner in :issue:`37320`.) + +* The :meth:`~threading.Thread.isAlive()` method of :class:`threading.Thread` + has been removed. It was deprecated since Python 3.8. + Use :meth:`~threading.Thread.is_alive()` instead. + (Contributed by Dong-hee Na in :issue:`37804`.) + +* Methods ``getchildren()`` and ``getiterator()`` of classes + :class:`~xml.etree.ElementTree.ElementTree` and + :class:`~xml.etree.ElementTree.Element` in the :mod:`~xml.etree.ElementTree` + module have been removed. They were deprecated in Python 3.2. + Use ``iter(x)`` or ``list(x)`` instead of ``x.getchildren()`` and + ``x.iter()`` or ``list(x.iter())`` instead of ``x.getiterator()``. + (Contributed by Serhiy Storchaka in :issue:`36543`.) + +* The old :mod:`plistlib` API has been removed, it was deprecated since Python + 3.4. Use the :func:`~plistlib.load`, :func:`~plistlib.loads`, :func:`~plistlib.dump`, and + :func:`~plistlib.dumps` functions. Additionally, the *use_builtin_types* parameter was + removed, standard :class:`bytes` objects are always used instead. + (Contributed by Jon Janzen in :issue:`36409`.) + +* The C function ``PyGen_NeedsFinalizing`` has been removed. It was not + documented, tested, or used anywhere within CPython after the implementation + of :pep:`442`. Patch by Joannah Nanjekye. + (Contributed by Joannah Nanjekye in :issue:`15088`) + +* ``base64.encodestring()`` and ``base64.decodestring()``, aliases deprecated + since Python 3.1, have been removed: use :func:`base64.encodebytes` and + :func:`base64.decodebytes` instead. + (Contributed by Victor Stinner in :issue:`39351`.) + +* ``fractions.gcd()`` function has been removed, it was deprecated since Python + 3.5 (:issue:`22486`): use :func:`math.gcd` instead. + (Contributed by Victor Stinner in :issue:`39350`.) + +* The *buffering* parameter of :class:`bz2.BZ2File` has been removed. Since + Python 3.0, it was ignored and using it emitted a :exc:`DeprecationWarning`. + Pass an open file object to control how the file is opened. + (Contributed by Victor Stinner in :issue:`39357`.) + +* The *encoding* parameter of :func:`json.loads` has been removed. + As of Python 3.1, it was deprecated and ignored; using it has emitted a + :exc:`DeprecationWarning` since Python 3.8. + (Contributed by Inada Naoki in :issue:`39377`) + +* ``with (await asyncio.lock):`` and ``with (yield from asyncio.lock):`` statements are + not longer supported, use ``async with lock`` instead. The same is correct for + ``asyncio.Condition`` and ``asyncio.Semaphore``. + (Contributed by Andrew Svetlov in :issue:`34793`.) + +* The :func:`sys.getcounts` function, the ``-X showalloccount`` command line + option and the ``show_alloc_count`` field of the C structure + :c:type:`PyConfig` have been removed. They required a special Python build by + defining ``COUNT_ALLOCS`` macro. + (Contributed by Victor Stinner in :issue:`39489`.) + +* The ``_field_types`` attribute of the :class:`typing.NamedTuple` class + has been removed. It was deprecated since Python 3.8. Use + the ``__annotations__`` attribute instead. + (Contributed by Serhiy Storchaka in :issue:`40182`.) + +* The :meth:`symtable.SymbolTable.has_exec` method has been removed. It was + deprecated since 2006, and only returning ``False`` when it's called. + (Contributed by Batuhan Taskaya in :issue:`40208`) + +* The :meth:`asyncio.Task.current_task` and :meth:`asyncio.Task.all_tasks` + have been removed. They were deprecated since Python 3.7 and you can use + :func:`asyncio.current_task` and :func:`asyncio.all_tasks` instead. + (Contributed by Rémi Lapeyre in :issue:`40967`) + +* The ``unescape()`` method in the :class:`html.parser.HTMLParser` class + has been removed (it was deprecated since Python 3.4). :func:`html.unescape` + should be used for converting character references to the corresponding + unicode characters. + + +Porting to Python 3.9 +===================== + +This section lists previously described changes and other bugfixes +that may require changes to your code. + + +Changes in the Python API +------------------------- + +* :func:`__import__` and :func:`importlib.util.resolve_name` now raise + :exc:`ImportError` where it previously raised :exc:`ValueError`. Callers + catching the specific exception type and supporting both Python 3.9 and + earlier versions will need to catch both using ``except (ImportError, ValueError):``. + +* The :mod:`venv` activation scripts no longer special-case when + ``__VENV_PROMPT__`` is set to ``""``. + +* The :meth:`select.epoll.unregister` method no longer ignores the + :data:`~errno.EBADF` error. + (Contributed by Victor Stinner in :issue:`39239`.) + +* The *compresslevel* parameter of :class:`bz2.BZ2File` became keyword-only, + since the *buffering* parameter has been removed. + (Contributed by Victor Stinner in :issue:`39357`.) + +* Simplified AST for subscription. Simple indices will be represented by + their value, extended slices will be represented as tuples. + ``Index(value)`` will return a ``value`` itself, ``ExtSlice(slices)`` + will return ``Tuple(slices, Load())``. + (Contributed by Serhiy Storchaka in :issue:`34822`.) + +* The :mod:`importlib` module now ignores the :envvar:`PYTHONCASEOK` + environment variable when the :option:`-E` or :option:`-I` command line + options are being used. + +* The *encoding* parameter has been added to the classes :class:`ftplib.FTP` and + :class:`ftplib.FTP_TLS` as a keyword-only parameter, and the default encoding + is changed from Latin-1 to UTF-8 to follow :rfc:`2640`. + +* :meth:`asyncio.loop.shutdown_default_executor` has been added to + :class:`~asyncio.AbstractEventLoop`, meaning alternative event loops that + inherit from it should have this method defined. + (Contributed by Kyle Stanley in :issue:`34037`.) + +* The constant values of future flags in the :mod:`__future__` module + is updated in order to prevent collision with compiler flags. Previously + ``PyCF_ALLOW_TOP_LEVEL_AWAIT`` was clashing with ``CO_FUTURE_DIVISION``. + (Contributed by Batuhan Taskaya in :issue:`39562`) + +* ``array('u')`` now uses ``wchar_t`` as C type instead of ``Py_UNICODE``. + This change doesn't affect to its behavior because ``Py_UNICODE`` is alias + of ``wchar_t`` since Python 3.3. + (Contributed by Inada Naoki in :issue:`34538`.) + +* The :func:`logging.getLogger` API now returns the root logger when passed + the name ``'root'``, whereas previously it returned a non-root logger named + ``'root'``. This could affect cases where user code explicitly wants a + non-root logger named ``'root'``, or instantiates a logger using + ``logging.getLogger(__name__)`` in some top-level module called ``'root.py'``. + (Contributed by Vinay Sajip in :issue:`37742`.) + +* Division handling of :class:`~pathlib.PurePath` now returns ``NotImplemented`` + instead of raising a :exc:`TypeError` when passed something other than an + instance of ``str`` or :class:`~pathlib.PurePath`. This allows creating + compatible classes that don't inherit from those mentioned types. + (Contributed by Roger Aiudi in :issue:`34775`). + + +Changes in the C API +-------------------- + +* Instances of heap-allocated types (such as those created with + :c:func:`PyType_FromSpec` and similar APIs) hold a reference to their type + object since Python 3.8. As indicated in the "Changes in the C API" of Python + 3.8, for the vast majority of cases, there should be no side effect but for + types that have a custom :c:member:`~PyTypeObject.tp_traverse` function, + ensure that all custom ``tp_traverse`` functions of heap-allocated types + visit the object's type. + + Example: + + .. code-block:: c + + int + foo_traverse(foo_struct *self, visitproc visit, void *arg) { + // Rest of the traverse function + #if PY_VERSION_HEX >= 0x03090000 + // This was not needed before Python 3.9 (Python issue 35810 and 40217) + Py_VISIT(Py_TYPE(self)); + #endif + } + + If your traverse function delegates to ``tp_traverse`` of its base class + (or another type), ensure that ``Py_TYPE(self)`` is visited only once. + Note that only heap types are expected to visit the type in ``tp_traverse``. + + For example, if your ``tp_traverse`` function includes: + + .. code-block:: c + + base->tp_traverse(self, visit, arg) + + then add: + + .. code-block:: c + + #if PY_VERSION_HEX >= 0x03090000 + // This was not needed before Python 3.9 (Python issue 35810 and 40217) + if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { + // a heap type's tp_traverse already visited Py_TYPE(self) + } else { + Py_VISIT(Py_TYPE(self)); + } + #else + + (See :issue:`35810` and :issue:`40217` for more information.) + +* The functions ``PyEval_CallObject``, ``PyEval_CallFunction``, + ``PyEval_CallMethod`` and ``PyEval_CallObjectWithKeywords`` are deprecated. + Use :c:func:`PyObject_Call` and its variants instead. + (See more details in :issue:`29548`.) + +CPython bytecode changes +------------------------ + +* The :opcode:`LOAD_ASSERTION_ERROR` opcode was added for handling the + :keyword:`assert` statement. Previously, the assert statement would not work + correctly if the :exc:`AssertionError` exception was being shadowed. + (Contributed by Zackery Spytz in :issue:`34880`.) + +* The :opcode:`COMPARE_OP` opcode was split into four distinct instructions: + + * ``COMPARE_OP`` for rich comparisons + * ``IS_OP`` for 'is' and 'is not' tests + * ``CONTAINS_OP`` for 'in' and 'is not' tests + * ``JUMP_IF_NOT_EXC_MATCH`` for checking exceptions in 'try-except' + statements. + + (Contributed by Mark Shannon in :issue:`39156`.) + + +Build Changes +============= + +* Added ``--with-platlibdir`` option to the ``configure`` script: name of the + platform-specific library directory, stored in the new :attr:`sys.platlibdir` + attribute. See :attr:`sys.platlibdir` attribute for more information. + (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis + and Victor Stinner in :issue:`1294959`.) + +* The ``COUNT_ALLOCS`` special build macro has been removed. + (Contributed by Victor Stinner in :issue:`39489`.) + +* On non-Windows platforms, the :c:func:`setenv` and :c:func:`unsetenv` + functions are now required to build Python. + (Contributed by Victor Stinner in :issue:`39395`.) + +* On non-Windows platforms, creating ``bdist_wininst`` installers is now + officially unsupported. (See :issue:`10945` for more details.) + +* When building Python on macOS from source, ``_tkinter`` now links with + non-system Tcl and Tk frameworks if they are installed in + ``/Library/Frameworks``, as had been the case on older releases + of macOS. If a macOS SDK is explicitly configured, by using + ``--enable-universalsdk=`` or ``-isysroot``, only the SDK itself is + searched. The default behavior can still be overridden with + ``--with-tcltk-includes`` and ``--with-tcltk-libs``. + (Contributed by Ned Deily in :issue:`34956`.) + +* Python can now be built for Windows 10 ARM64. + (Contributed by Steve Dower in :issue:`33125`.) + +* Some individual tests are now skipped when ``--pgo`` is used. The tests + in question increased the PGO task time significantly and likely + didn't help improve optimization of the final executable. This + speeds up the task by a factor of about 15x. Running the full unit test + suite is slow. This change may result in a slightly less optimized build + since not as many code branches will be executed. If you are willing to + wait for the much slower build, the old behavior can be restored using + ``./configure [..] PROFILE_TASK="-m test --pgo-extended"``. We make no + guarantees as to which PGO task set produces a faster build. Users who care + should run their own relevant benchmarks as results can depend on the + environment, workload, and compiler tool chain. + (See :issue:`36044` and :issue:`37707` for more details.) + + +C API Changes +============= + +New Features +------------ + +* :pep:`573`: Added :c:func:`PyType_FromModuleAndSpec` to associate + a module with a class; :c:func:`PyType_GetModule` and + :c:func:`PyType_GetModuleState` to retrieve the module and its state; and + :c:data:`PyCMethod` and :c:data:`METH_METHOD` to allow a method to + access the class it was defined in. + (Contributed by Marcel Plch and Petr Viktorin in :issue:`38787`.) + +* Added :c:func:`PyFrame_GetCode` function: get a frame code. + Added :c:func:`PyFrame_GetBack` function: get the frame next outer frame. + (Contributed by Victor Stinner in :issue:`40421`.) + +* Added :c:func:`PyFrame_GetLineNumber` to the limited C API. + (Contributed by Victor Stinner in :issue:`40421`.) + +* Added :c:func:`PyThreadState_GetInterpreter` and + :c:func:`PyInterpreterState_Get` functions to get the interpreter. + Added :c:func:`PyThreadState_GetFrame` function to get the current frame of a + Python thread state. + Added :c:func:`PyThreadState_GetID` function: get the unique identifier of a + Python thread state. + (Contributed by Victor Stinner in :issue:`39947`.) + +* Added a new public :c:func:`PyObject_CallNoArgs` function to the C API, which + calls a callable Python object without any arguments. It is the most efficient + way to call a callable Python object without any argument. + (Contributed by Victor Stinner in :issue:`37194`.) + +* Changes in the limited C API (if ``Py_LIMITED_API`` macro is defined): + + * Provide :c:func:`Py_EnterRecursiveCall` and :c:func:`Py_LeaveRecursiveCall` + as regular functions for the limited API. Previously, there were defined as + macros, but these macros didn't compile with the limited C API which cannot + access ``PyThreadState.recursion_depth`` field (the structure is opaque in + the limited C API). + + * ``PyObject_INIT()`` and ``PyObject_INIT_VAR()`` become regular "opaque" + function to hide implementation details. + + (Contributed by Victor Stinner in :issue:`38644` and :issue:`39542`.) + +* The :c:func:`PyModule_AddType` function is added to help adding a type + to a module. + (Contributed by Dong-hee Na in :issue:`40024`.) + +* Added the functions :c:func:`PyObject_GC_IsTracked` and + :c:func:`PyObject_GC_IsFinalized` to the public API to allow to query if + Python objects are being currently tracked or have been already finalized by + the garbage collector respectively. + (Contributed by Pablo Galindo Salgado in :issue:`40241`.) + +* Added :c:func:`_PyObject_FunctionStr` to get a user-friendly string + representation of a function-like object. + (Patch by Jeroen Demeyer in :issue:`37645`.) + + +Porting to Python 3.9 +--------------------- + +* ``PyInterpreterState.eval_frame`` (:pep:`523`) now requires a new mandatory + *tstate* parameter (``PyThreadState*``). + (Contributed by Victor Stinner in :issue:`38500`.) + +* Extension modules: :c:member:`~PyModuleDef.m_traverse`, + :c:member:`~PyModuleDef.m_clear` and :c:member:`~PyModuleDef.m_free` + functions of :c:type:`PyModuleDef` are no longer called if the module state + was requested but is not allocated yet. This is the case immediately after + the module is created and before the module is executed + (:c:data:`Py_mod_exec` function). More precisely, these functions are not called + if :c:member:`~PyModuleDef.m_size` is greater than 0 and the module state (as + returned by :c:func:`PyModule_GetState`) is ``NULL``. + + Extension modules without module state (``m_size <= 0``) are not affected. + +* If :c:func:`Py_AddPendingCall` is called in a subinterpreter, the function is + now scheduled to be called from the subinterpreter, rather than being called + from the main interpreter. Each subinterpreter now has its own list of + scheduled calls. + (Contributed by Victor Stinner in :issue:`39984`.) + +* The Windows registry is no longer used to initialize :data:`sys.path` when + the ``-E`` option is used (if :c:member:`PyConfig.use_environment` is set to + ``0``). This is significant when embedding Python on Windows. + (Contributed by Zackery Spytz in :issue:`8901`.) + +* The global variable :c:data:`PyStructSequence_UnnamedField` is now a constant + and refers to a constant string. + (Contributed by Serhiy Storchaka in :issue:`38650`.) + +* The :c:type:`PyGC_Head` structure is now opaque. It is only defined in the + internal C API (``pycore_gc.h``). + (Contributed by Victor Stinner in :issue:`40241`.) + +* The ``Py_UNICODE_COPY``, ``Py_UNICODE_FILL``, ``PyUnicode_WSTR_LENGTH``, + :c:func:`PyUnicode_FromUnicode`, :c:func:`PyUnicode_AsUnicode`, + ``_PyUnicode_AsUnicode``, and :c:func:`PyUnicode_AsUnicodeAndSize` are + marked as deprecated in C. They have been deprecated by :pep:`393` since + Python 3.3. + (Contributed by Inada Naoki in :issue:`36346`.) + +* The :c:func:`Py_FatalError` function is replaced with a macro which logs + automatically the name of the current function, unless the + ``Py_LIMITED_API`` macro is defined. + (Contributed by Victor Stinner in :issue:`39882`.) + +* The vectorcall protocol now requires that the caller passes only strings as + keyword names. (See :issue:`37540` for more information.) + +* Implementation details of a number of macros and functions are now hidden: + + * :c:func:`PyObject_IS_GC` macro was converted to a function. + + * The :c:func:`PyObject_NEW` macro becomes an alias to the + :c:func:`PyObject_New` macro, and the :c:func:`PyObject_NEW_VAR` macro + becomes an alias to the :c:func:`PyObject_NewVar` macro. They no longer + access directly the :c:member:`PyTypeObject.tp_basicsize` member. + + * :c:func:`PyType_HasFeature` now always calls :c:func:`PyType_GetFlags`. + Previously, it accessed directly the :c:member:`PyTypeObject.tp_flags` + member when the limited C API was not used. + + * :c:func:`PyObject_GET_WEAKREFS_LISTPTR` macro was converted to a function: + the macro accessed directly the :c:member:`PyTypeObject.tp_weaklistoffset` + member. + + * :c:func:`PyObject_CheckBuffer` macro was converted to a function: the macro + accessed directly the :c:member:`PyTypeObject.tp_as_buffer` member. + + * :c:func:`PyIndex_Check` is now always declared as an opaque function to hide + implementation details: removed the ``PyIndex_Check()`` macro. The macro accessed + directly the :c:member:`PyTypeObject.tp_as_number` member. + + (See :issue:`40170` for more details.) + +Removed +------- + +* Excluded ``PyFPE_START_PROTECT()`` and ``PyFPE_END_PROTECT()`` macros of + ``pyfpe.h`` from the limited C API. + (Contributed by Victor Stinner in :issue:`38835`.) + +* The ``tp_print`` slot of :ref:`PyTypeObject ` has been removed. + It was used for printing objects to files in Python 2.7 and before. Since + Python 3.0, it has been ignored and unused. + (Contributed by Jeroen Demeyer in :issue:`36974`.) + +* Changes in the limited C API (if ``Py_LIMITED_API`` macro is defined): + + * Excluded the following functions from the limited C API: + + * ``PyThreadState_DeleteCurrent()`` + (Contributed by Joannah Nanjekye in :issue:`37878`.) + * ``_Py_CheckRecursionLimit`` + * ``_Py_NewReference()`` + * ``_Py_ForgetReference()`` + * ``_PyTraceMalloc_NewReference()`` + * ``_Py_GetRefTotal()`` + * The trashcan mechanism which never worked in the limited C API. + * ``PyTrash_UNWIND_LEVEL`` + * ``Py_TRASHCAN_BEGIN_CONDITION`` + * ``Py_TRASHCAN_BEGIN`` + * ``Py_TRASHCAN_END`` + * ``Py_TRASHCAN_SAFE_BEGIN`` + * ``Py_TRASHCAN_SAFE_END`` + + * Moved following functions and definitions to the internal C API: + + * ``_PyDebug_PrintTotalRefs()`` + * ``_Py_PrintReferences()`` + * ``_Py_PrintReferenceAddresses()`` + * ``_Py_tracemalloc_config`` + * ``_Py_AddToAllObjects()`` (specific to ``Py_TRACE_REFS`` build) + + (Contributed by Victor Stinner in :issue:`38644` and :issue:`39542`.) + +* Removed ``_PyRuntime.getframe`` hook and removed ``_PyThreadState_GetFrame`` + macro which was an alias to ``_PyRuntime.getframe``. They were only exposed + by the internal C API. Removed also ``PyThreadFrameGetter`` type. + (Contributed by Victor Stinner in :issue:`39946`.) + +* Removed the following functions from the C API. Call :c:func:`PyGC_Collect` + explicitly to clear all free lists. + (Contributed by Inada Naoki and Victor Stinner in :issue:`37340`, + :issue:`38896` and :issue:`40428`.) + + * ``PyAsyncGen_ClearFreeLists()`` + * ``PyContext_ClearFreeList()`` + * ``PyDict_ClearFreeList()`` + * ``PyFloat_ClearFreeList()`` + * ``PyFrame_ClearFreeList()`` + * ``PyList_ClearFreeList()`` + * ``PyMethod_ClearFreeList()`` and ``PyCFunction_ClearFreeList()``: + the free lists of bound method objects have been removed. + * ``PySet_ClearFreeList()``: the set free list has been removed + in Python 3.4. + * ``PyTuple_ClearFreeList()`` + * ``PyUnicode_ClearFreeList()``: the Unicode free list has been removed in + Python 3.3. + +* Removed ``_PyUnicode_ClearStaticStrings()`` function. + (Contributed by Victor Stinner in :issue:`39465`.) + +* Removed ``Py_UNICODE_MATCH``. It has been deprecated by :pep:`393`, and + broken since Python 3.3. The :c:func:`PyUnicode_Tailmatch` function can be + used instead. + (Contributed by Inada Naoki in :issue:`36346`.) + +* Cleaned header files of interfaces defined but with no implementation. + The public API symbols being removed are: + ``_PyBytes_InsertThousandsGroupingLocale``, + ``_PyBytes_InsertThousandsGrouping``, ``_Py_InitializeFromArgs``, + ``_Py_InitializeFromWideArgs``, ``_PyFloat_Repr``, ``_PyFloat_Digits``, + ``_PyFloat_DigitsInit``, ``PyFrame_ExtendStack``, ``_PyAIterWrapper_Type``, + ``PyNullImporter_Type``, ``PyCmpWrapper_Type``, ``PySortWrapper_Type``, + ``PyNoArgsFunction``. + (Contributed by Pablo Galindo Salgado in :issue:`39372`.) diff --git a/Doc/whatsnew/index.rst b/Doc/whatsnew/index.rst index b1160c03..954e38bc 100644 --- a/Doc/whatsnew/index.rst +++ b/Doc/whatsnew/index.rst @@ -11,6 +11,7 @@ anyone wishing to stay up-to-date after a new release. .. toctree:: :maxdepth: 2 + 3.9.rst 3.8.rst 3.7.rst 3.6.rst diff --git a/Grammar/Grammar b/Grammar/Grammar index 21f7e1a8..170518af 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -14,7 +14,7 @@ single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE file_input: (NEWLINE | stmt)* ENDMARKER eval_input: testlist NEWLINE* ENDMARKER -decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE +decorator: '@' namedexpr_test NEWLINE decorators: decorator+ decorated: decorators (classdef | funcdef | async_funcdef) diff --git a/Grammar/python.gram b/Grammar/python.gram new file mode 100644 index 00000000..334a7f56 --- /dev/null +++ b/Grammar/python.gram @@ -0,0 +1,700 @@ +# PEG grammar for Python + +@trailer ''' +void * +_PyPegen_parse(Parser *p) +{ + // Initialize keywords + p->keywords = reserved_keywords; + p->n_keyword_lists = n_keyword_lists; + + // Run parser + void *result = NULL; + if (p->start_rule == Py_file_input) { + result = file_rule(p); + } else if (p->start_rule == Py_single_input) { + result = interactive_rule(p); + } else if (p->start_rule == Py_eval_input) { + result = eval_rule(p); + } else if (p->start_rule == Py_func_type_input) { + result = func_type_rule(p); + } else if (p->start_rule == Py_fstring_input) { + result = fstring_rule(p); + } + + return result; +} + +// The end +''' +file[mod_ty]: a=[statements] ENDMARKER { _PyPegen_make_module(p, a) } +interactive[mod_ty]: a=statement_newline { Interactive(a, p->arena) } +eval[mod_ty]: a=expressions NEWLINE* ENDMARKER { Expression(a, p->arena) } +func_type[mod_ty]: '(' a=[type_expressions] ')' '->' b=expression NEWLINE* ENDMARKER { FunctionType(a, b, p->arena) } +fstring[expr_ty]: star_expressions + +# type_expressions allow */** but ignore them +type_expressions[asdl_seq*]: + | a=','.expression+ ',' '*' b=expression ',' '**' c=expression { + _PyPegen_seq_append_to_end(p, CHECK(_PyPegen_seq_append_to_end(p, a, b)), c) } + | a=','.expression+ ',' '*' b=expression { _PyPegen_seq_append_to_end(p, a, b) } + | a=','.expression+ ',' '**' b=expression { _PyPegen_seq_append_to_end(p, a, b) } + | '*' a=expression ',' '**' b=expression { + _PyPegen_seq_append_to_end(p, CHECK(_PyPegen_singleton_seq(p, a)), b) } + | '*' a=expression { _PyPegen_singleton_seq(p, a) } + | '**' a=expression { _PyPegen_singleton_seq(p, a) } + | ','.expression+ + +statements[asdl_seq*]: a=statement+ { _PyPegen_seq_flatten(p, a) } +statement[asdl_seq*]: a=compound_stmt { _PyPegen_singleton_seq(p, a) } | simple_stmt +statement_newline[asdl_seq*]: + | a=compound_stmt NEWLINE { _PyPegen_singleton_seq(p, a) } + | simple_stmt + | NEWLINE { _PyPegen_singleton_seq(p, CHECK(_Py_Pass(EXTRA))) } + | ENDMARKER { _PyPegen_interactive_exit(p) } +simple_stmt[asdl_seq*]: + | a=small_stmt !';' NEWLINE { _PyPegen_singleton_seq(p, a) } # Not needed, there for speedup + | a=';'.small_stmt+ [';'] NEWLINE { a } +# NOTE: assignment MUST precede expression, else parsing a simple assignment +# will throw a SyntaxError. +small_stmt[stmt_ty] (memo): + | assignment + | e=star_expressions { _Py_Expr(e, EXTRA) } + | &'return' return_stmt + | &('import' | 'from') import_stmt + | &'raise' raise_stmt + | 'pass' { _Py_Pass(EXTRA) } + | &'del' del_stmt + | &'yield' yield_stmt + | &'assert' assert_stmt + | 'break' { _Py_Break(EXTRA) } + | 'continue' { _Py_Continue(EXTRA) } + | &'global' global_stmt + | &'nonlocal' nonlocal_stmt +compound_stmt[stmt_ty]: + | &('def' | '@' | ASYNC) function_def + | &'if' if_stmt + | &('class' | '@') class_def + | &('with' | ASYNC) with_stmt + | &('for' | ASYNC) for_stmt + | &'try' try_stmt + | &'while' while_stmt + +# NOTE: annotated_rhs may start with 'yield'; yield_expr must start with 'yield' +assignment[stmt_ty]: + | a=NAME ':' b=expression c=['=' d=annotated_rhs { d }] { + CHECK_VERSION( + 6, + "Variable annotation syntax is", + _Py_AnnAssign(CHECK(_PyPegen_set_expr_context(p, a, Store)), b, c, 1, EXTRA) + ) } + | a=('(' b=single_target ')' { b } + | single_subscript_attribute_target) ':' b=expression c=['=' d=annotated_rhs { d }] { + CHECK_VERSION(6, "Variable annotations syntax is", _Py_AnnAssign(a, b, c, 0, EXTRA)) } + | a=(z=star_targets '=' { z })+ b=(yield_expr | star_expressions) !'=' tc=[TYPE_COMMENT] { + _Py_Assign(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } + | a=single_target b=augassign ~ c=(yield_expr | star_expressions) { + _Py_AugAssign(a, b->kind, c, EXTRA) } + | invalid_assignment + +augassign[AugOperator*]: + | '+=' { _PyPegen_augoperator(p, Add) } + | '-=' { _PyPegen_augoperator(p, Sub) } + | '*=' { _PyPegen_augoperator(p, Mult) } + | '@=' { CHECK_VERSION(5, "The '@' operator is", _PyPegen_augoperator(p, MatMult)) } + | '/=' { _PyPegen_augoperator(p, Div) } + | '%=' { _PyPegen_augoperator(p, Mod) } + | '&=' { _PyPegen_augoperator(p, BitAnd) } + | '|=' { _PyPegen_augoperator(p, BitOr) } + | '^=' { _PyPegen_augoperator(p, BitXor) } + | '<<=' { _PyPegen_augoperator(p, LShift) } + | '>>=' { _PyPegen_augoperator(p, RShift) } + | '**=' { _PyPegen_augoperator(p, Pow) } + | '//=' { _PyPegen_augoperator(p, FloorDiv) } + +global_stmt[stmt_ty]: 'global' a=','.NAME+ { + _Py_Global(CHECK(_PyPegen_map_names_to_ids(p, a)), EXTRA) } +nonlocal_stmt[stmt_ty]: 'nonlocal' a=','.NAME+ { + _Py_Nonlocal(CHECK(_PyPegen_map_names_to_ids(p, a)), EXTRA) } + +yield_stmt[stmt_ty]: y=yield_expr { _Py_Expr(y, EXTRA) } + +assert_stmt[stmt_ty]: 'assert' a=expression b=[',' z=expression { z }] { _Py_Assert(a, b, EXTRA) } + +del_stmt[stmt_ty]: + | 'del' a=del_targets &(';' | NEWLINE) { _Py_Delete(a, EXTRA) } + | invalid_del_stmt + +import_stmt[stmt_ty]: import_name | import_from +import_name[stmt_ty]: 'import' a=dotted_as_names { _Py_Import(a, EXTRA) } +# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS +import_from[stmt_ty]: + | 'from' a=('.' | '...')* b=dotted_name 'import' c=import_from_targets { + _Py_ImportFrom(b->v.Name.id, c, _PyPegen_seq_count_dots(a), EXTRA) } + | 'from' a=('.' | '...')+ 'import' b=import_from_targets { + _Py_ImportFrom(NULL, b, _PyPegen_seq_count_dots(a), EXTRA) } +import_from_targets[asdl_seq*]: + | '(' a=import_from_as_names [','] ')' { a } + | import_from_as_names !',' + | '*' { _PyPegen_singleton_seq(p, CHECK(_PyPegen_alias_for_star(p))) } + | invalid_import_from_targets +import_from_as_names[asdl_seq*]: + | a=','.import_from_as_name+ { a } +import_from_as_name[alias_ty]: + | a=NAME b=['as' z=NAME { z }] { _Py_alias(a->v.Name.id, + (b) ? ((expr_ty) b)->v.Name.id : NULL, + p->arena) } +dotted_as_names[asdl_seq*]: + | a=','.dotted_as_name+ { a } +dotted_as_name[alias_ty]: + | a=dotted_name b=['as' z=NAME { z }] { _Py_alias(a->v.Name.id, + (b) ? ((expr_ty) b)->v.Name.id : NULL, + p->arena) } +dotted_name[expr_ty]: + | a=dotted_name '.' b=NAME { _PyPegen_join_names_with_dot(p, a, b) } + | NAME + +if_stmt[stmt_ty]: + | 'if' a=named_expression ':' b=block c=elif_stmt { _Py_If(a, b, CHECK(_PyPegen_singleton_seq(p, c)), EXTRA) } + | 'if' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } +elif_stmt[stmt_ty]: + | 'elif' a=named_expression ':' b=block c=elif_stmt { _Py_If(a, b, CHECK(_PyPegen_singleton_seq(p, c)), EXTRA) } + | 'elif' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } +else_block[asdl_seq*]: 'else' ':' b=block { b } + +while_stmt[stmt_ty]: + | 'while' a=named_expression ':' b=block c=[else_block] { _Py_While(a, b, c, EXTRA) } + +for_stmt[stmt_ty]: + | 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { + _Py_For(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA) } + | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { + CHECK_VERSION(5, "Async for loops are", _Py_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) } + | invalid_for_target + +with_stmt[stmt_ty]: + | 'with' '(' a=','.with_item+ ','? ')' ':' b=block { + _Py_With(a, b, NULL, EXTRA) } + | 'with' a=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { + _Py_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } + | ASYNC 'with' '(' a=','.with_item+ ','? ')' ':' b=block { + CHECK_VERSION(5, "Async with statements are", _Py_AsyncWith(a, b, NULL, EXTRA)) } + | ASYNC 'with' a=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { + CHECK_VERSION(5, "Async with statements are", _Py_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) } +with_item[withitem_ty]: + | e=expression 'as' t=target &(',' | ')' | ':') { _Py_withitem(e, t, p->arena) } + | invalid_with_item + | e=expression { _Py_withitem(e, NULL, p->arena) } + +try_stmt[stmt_ty]: + | 'try' ':' b=block f=finally_block { _Py_Try(b, NULL, NULL, f, EXTRA) } + | 'try' ':' b=block ex=except_block+ el=[else_block] f=[finally_block] { _Py_Try(b, ex, el, f, EXTRA) } +except_block[excepthandler_ty]: + | 'except' e=expression t=['as' z=NAME { z }] ':' b=block { + _Py_ExceptHandler(e, (t) ? ((expr_ty) t)->v.Name.id : NULL, b, EXTRA) } + | 'except' ':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) } +finally_block[asdl_seq*]: 'finally' ':' a=block { a } + +return_stmt[stmt_ty]: + | 'return' a=[star_expressions] { _Py_Return(a, EXTRA) } + +raise_stmt[stmt_ty]: + | 'raise' a=expression b=['from' z=expression { z }] { _Py_Raise(a, b, EXTRA) } + | 'raise' { _Py_Raise(NULL, NULL, EXTRA) } + +function_def[stmt_ty]: + | d=decorators f=function_def_raw { _PyPegen_function_def_decorators(p, d, f) } + | function_def_raw + +function_def_raw[stmt_ty]: + | 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { + _Py_FunctionDef(n->v.Name.id, + (params) ? params : CHECK(_PyPegen_empty_arguments(p)), + b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA) } + | ASYNC 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { + CHECK_VERSION( + 5, + "Async functions are", + _Py_AsyncFunctionDef(n->v.Name.id, + (params) ? params : CHECK(_PyPegen_empty_arguments(p)), + b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA) + ) } +func_type_comment[Token*]: + | NEWLINE t=TYPE_COMMENT &(NEWLINE INDENT) { t } # Must be followed by indented block + | invalid_double_type_comments + | TYPE_COMMENT + +params[arguments_ty]: + | invalid_parameters + | parameters + +parameters[arguments_ty]: + | a=slash_no_default b=param_no_default* c=param_with_default* d=[star_etc] { + _PyPegen_make_arguments(p, a, NULL, b, c, d) } + | a=slash_with_default b=param_with_default* c=[star_etc] { + _PyPegen_make_arguments(p, NULL, a, NULL, b, c) } + | a=param_no_default+ b=param_with_default* c=[star_etc] { + _PyPegen_make_arguments(p, NULL, NULL, a, b, c) } + | a=param_with_default+ b=[star_etc] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)} + | a=star_etc { _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) } + +# Some duplication here because we can't write (',' | &')'), +# which is because we don't support empty alternatives (yet). +# +slash_no_default[asdl_seq*]: + | a=param_no_default+ '/' ',' { a } + | a=param_no_default+ '/' &')' { a } +slash_with_default[SlashWithDefault*]: + | a=param_no_default* b=param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, a, b) } + | a=param_no_default* b=param_with_default+ '/' &')' { _PyPegen_slash_with_default(p, a, b) } + +star_etc[StarEtc*]: + | '*' a=param_no_default b=param_maybe_default* c=[kwds] { + _PyPegen_star_etc(p, a, b, c) } + | '*' ',' b=param_maybe_default+ c=[kwds] { + _PyPegen_star_etc(p, NULL, b, c) } + | a=kwds { _PyPegen_star_etc(p, NULL, NULL, a) } + | invalid_star_etc + +kwds[arg_ty]: '**' a=param_no_default { a } + +# One parameter. This *includes* a following comma and type comment. +# +# There are three styles: +# - No default +# - With default +# - Maybe with default +# +# There are two alternative forms of each, to deal with type comments: +# - Ends in a comma followed by an optional type comment +# - No comma, optional type comment, must be followed by close paren +# The latter form is for a final parameter without trailing comma. +# +param_no_default[arg_ty]: + | a=param ',' tc=TYPE_COMMENT? { _PyPegen_add_type_comment_to_arg(p, a, tc) } + | a=param tc=TYPE_COMMENT? &')' { _PyPegen_add_type_comment_to_arg(p, a, tc) } +param_with_default[NameDefaultPair*]: + | a=param c=default ',' tc=TYPE_COMMENT? { _PyPegen_name_default_pair(p, a, c, tc) } + | a=param c=default tc=TYPE_COMMENT? &')' { _PyPegen_name_default_pair(p, a, c, tc) } +param_maybe_default[NameDefaultPair*]: + | a=param c=default? ',' tc=TYPE_COMMENT? { _PyPegen_name_default_pair(p, a, c, tc) } + | a=param c=default? tc=TYPE_COMMENT? &')' { _PyPegen_name_default_pair(p, a, c, tc) } +param[arg_ty]: a=NAME b=annotation? { _Py_arg(a->v.Name.id, b, NULL, EXTRA) } + +annotation[expr_ty]: ':' a=expression { a } +default[expr_ty]: '=' a=expression { a } + +decorators[asdl_seq*]: a=('@' f=named_expression NEWLINE { f })+ { a } + +class_def[stmt_ty]: + | a=decorators b=class_def_raw { _PyPegen_class_def_decorators(p, a, b) } + | class_def_raw +class_def_raw[stmt_ty]: + | 'class' a=NAME b=['(' z=[arguments] ')' { z }] ':' c=block { + _Py_ClassDef(a->v.Name.id, + (b) ? ((expr_ty) b)->v.Call.args : NULL, + (b) ? ((expr_ty) b)->v.Call.keywords : NULL, + c, NULL, EXTRA) } + +block[asdl_seq*] (memo): + | NEWLINE INDENT a=statements DEDENT { a } + | simple_stmt + | invalid_block + +expressions_list[asdl_seq*]: a=','.star_expression+ [','] { a } +star_expressions[expr_ty]: + | a=star_expression b=(',' c=star_expression { c })+ [','] { + _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } + | a=star_expression ',' { _Py_Tuple(CHECK(_PyPegen_singleton_seq(p, a)), Load, EXTRA) } + | star_expression +star_expression[expr_ty] (memo): + | '*' a=bitwise_or { _Py_Starred(a, Load, EXTRA) } + | expression + +star_named_expressions[asdl_seq*]: a=','.star_named_expression+ [','] { a } +star_named_expression[expr_ty]: + | '*' a=bitwise_or { _Py_Starred(a, Load, EXTRA) } + | named_expression +named_expression[expr_ty]: + | a=NAME ':=' ~ b=expression { _Py_NamedExpr(CHECK(_PyPegen_set_expr_context(p, a, Store)), b, EXTRA) } + | expression !':=' + | invalid_named_expression + +annotated_rhs[expr_ty]: yield_expr | star_expressions + +expressions[expr_ty]: + | a=expression b=(',' c=expression { c })+ [','] { + _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } + | a=expression ',' { _Py_Tuple(CHECK(_PyPegen_singleton_seq(p, a)), Load, EXTRA) } + | expression +expression[expr_ty] (memo): + | a=disjunction 'if' b=disjunction 'else' c=expression { _Py_IfExp(b, a, c, EXTRA) } + | disjunction + | lambdef + +lambdef[expr_ty]: + | 'lambda' a=[lambda_params] ':' b=expression { _Py_Lambda((a) ? a : CHECK(_PyPegen_empty_arguments(p)), b, EXTRA) } + +lambda_params[arguments_ty]: + | invalid_lambda_parameters + | lambda_parameters + +# lambda_parameters etc. duplicates parameters but without annotations +# or type comments, and if there's no comma after a parameter, we expect +# a colon, not a close parenthesis. (For more, see parameters above.) +# +lambda_parameters[arguments_ty]: + | a=lambda_slash_no_default b=lambda_param_no_default* c=lambda_param_with_default* d=[lambda_star_etc] { + _PyPegen_make_arguments(p, a, NULL, b, c, d) } + | a=lambda_slash_with_default b=lambda_param_with_default* c=[lambda_star_etc] { + _PyPegen_make_arguments(p, NULL, a, NULL, b, c) } + | a=lambda_param_no_default+ b=lambda_param_with_default* c=[lambda_star_etc] { + _PyPegen_make_arguments(p, NULL, NULL, a, b, c) } + | a=lambda_param_with_default+ b=[lambda_star_etc] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)} + | a=lambda_star_etc { _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) } + +lambda_slash_no_default[asdl_seq*]: + | a=lambda_param_no_default+ '/' ',' { a } + | a=lambda_param_no_default+ '/' &':' { a } +lambda_slash_with_default[SlashWithDefault*]: + | a=lambda_param_no_default* b=lambda_param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, a, b) } + | a=lambda_param_no_default* b=lambda_param_with_default+ '/' &':' { _PyPegen_slash_with_default(p, a, b) } + +lambda_star_etc[StarEtc*]: + | '*' a=lambda_param_no_default b=lambda_param_maybe_default* c=[lambda_kwds] { + _PyPegen_star_etc(p, a, b, c) } + | '*' ',' b=lambda_param_maybe_default+ c=[lambda_kwds] { + _PyPegen_star_etc(p, NULL, b, c) } + | a=lambda_kwds { _PyPegen_star_etc(p, NULL, NULL, a) } + | invalid_lambda_star_etc + +lambda_kwds[arg_ty]: '**' a=lambda_param_no_default { a } + +lambda_param_no_default[arg_ty]: + | a=lambda_param ',' { a } + | a=lambda_param &':' { a } +lambda_param_with_default[NameDefaultPair*]: + | a=lambda_param c=default ',' { _PyPegen_name_default_pair(p, a, c, NULL) } + | a=lambda_param c=default &':' { _PyPegen_name_default_pair(p, a, c, NULL) } +lambda_param_maybe_default[NameDefaultPair*]: + | a=lambda_param c=default? ',' { _PyPegen_name_default_pair(p, a, c, NULL) } + | a=lambda_param c=default? &':' { _PyPegen_name_default_pair(p, a, c, NULL) } +lambda_param[arg_ty]: a=NAME { _Py_arg(a->v.Name.id, NULL, NULL, EXTRA) } + +disjunction[expr_ty] (memo): + | a=conjunction b=('or' c=conjunction { c })+ { _Py_BoolOp( + Or, + CHECK(_PyPegen_seq_insert_in_front(p, a, b)), + EXTRA) } + | conjunction +conjunction[expr_ty] (memo): + | a=inversion b=('and' c=inversion { c })+ { _Py_BoolOp( + And, + CHECK(_PyPegen_seq_insert_in_front(p, a, b)), + EXTRA) } + | inversion +inversion[expr_ty] (memo): + | 'not' a=inversion { _Py_UnaryOp(Not, a, EXTRA) } + | comparison +comparison[expr_ty]: + | a=bitwise_or b=compare_op_bitwise_or_pair+ { + _Py_Compare(a, CHECK(_PyPegen_get_cmpops(p, b)), CHECK(_PyPegen_get_exprs(p, b)), EXTRA) } + | bitwise_or +compare_op_bitwise_or_pair[CmpopExprPair*]: + | eq_bitwise_or + | noteq_bitwise_or + | lte_bitwise_or + | lt_bitwise_or + | gte_bitwise_or + | gt_bitwise_or + | notin_bitwise_or + | in_bitwise_or + | isnot_bitwise_or + | is_bitwise_or +eq_bitwise_or[CmpopExprPair*]: '==' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Eq, a) } +noteq_bitwise_or[CmpopExprPair*]: + | (tok='!=' {_PyPegen_check_barry_as_flufl(p) ? NULL : tok}) a=bitwise_or {_PyPegen_cmpop_expr_pair(p, NotEq, a) } +lte_bitwise_or[CmpopExprPair*]: '<=' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, LtE, a) } +lt_bitwise_or[CmpopExprPair*]: '<' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Lt, a) } +gte_bitwise_or[CmpopExprPair*]: '>=' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, GtE, a) } +gt_bitwise_or[CmpopExprPair*]: '>' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Gt, a) } +notin_bitwise_or[CmpopExprPair*]: 'not' 'in' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, NotIn, a) } +in_bitwise_or[CmpopExprPair*]: 'in' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, In, a) } +isnot_bitwise_or[CmpopExprPair*]: 'is' 'not' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, IsNot, a) } +is_bitwise_or[CmpopExprPair*]: 'is' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Is, a) } + +bitwise_or[expr_ty]: + | a=bitwise_or '|' b=bitwise_xor { _Py_BinOp(a, BitOr, b, EXTRA) } + | bitwise_xor +bitwise_xor[expr_ty]: + | a=bitwise_xor '^' b=bitwise_and { _Py_BinOp(a, BitXor, b, EXTRA) } + | bitwise_and +bitwise_and[expr_ty]: + | a=bitwise_and '&' b=shift_expr { _Py_BinOp(a, BitAnd, b, EXTRA) } + | shift_expr +shift_expr[expr_ty]: + | a=shift_expr '<<' b=sum { _Py_BinOp(a, LShift, b, EXTRA) } + | a=shift_expr '>>' b=sum { _Py_BinOp(a, RShift, b, EXTRA) } + | sum + +sum[expr_ty]: + | a=sum '+' b=term { _Py_BinOp(a, Add, b, EXTRA) } + | a=sum '-' b=term { _Py_BinOp(a, Sub, b, EXTRA) } + | term +term[expr_ty]: + | a=term '*' b=factor { _Py_BinOp(a, Mult, b, EXTRA) } + | a=term '/' b=factor { _Py_BinOp(a, Div, b, EXTRA) } + | a=term '//' b=factor { _Py_BinOp(a, FloorDiv, b, EXTRA) } + | a=term '%' b=factor { _Py_BinOp(a, Mod, b, EXTRA) } + | a=term '@' b=factor { CHECK_VERSION(5, "The '@' operator is", _Py_BinOp(a, MatMult, b, EXTRA)) } + | factor +factor[expr_ty] (memo): + | '+' a=factor { _Py_UnaryOp(UAdd, a, EXTRA) } + | '-' a=factor { _Py_UnaryOp(USub, a, EXTRA) } + | '~' a=factor { _Py_UnaryOp(Invert, a, EXTRA) } + | power +power[expr_ty]: + | a=await_primary '**' b=factor { _Py_BinOp(a, Pow, b, EXTRA) } + | await_primary +await_primary[expr_ty] (memo): + | AWAIT a=primary { CHECK_VERSION(5, "Await expressions are", _Py_Await(a, EXTRA)) } + | primary +primary[expr_ty]: + | a=primary '.' b=NAME { _Py_Attribute(a, b->v.Name.id, Load, EXTRA) } + | a=primary b=genexp { _Py_Call(a, CHECK(_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } + | a=primary '(' b=[arguments] ')' { + _Py_Call(a, + (b) ? ((expr_ty) b)->v.Call.args : NULL, + (b) ? ((expr_ty) b)->v.Call.keywords : NULL, + EXTRA) } + | a=primary '[' b=slices ']' { _Py_Subscript(a, b, Load, EXTRA) } + | atom + +slices[expr_ty]: + | a=slice !',' { a } + | a=','.slice+ [','] { _Py_Tuple(a, Load, EXTRA) } +slice[expr_ty]: + | a=[expression] ':' b=[expression] c=[':' d=[expression] { d }] { _Py_Slice(a, b, c, EXTRA) } + | a=expression { a } +atom[expr_ty]: + | NAME + | 'True' { _Py_Constant(Py_True, NULL, EXTRA) } + | 'False' { _Py_Constant(Py_False, NULL, EXTRA) } + | 'None' { _Py_Constant(Py_None, NULL, EXTRA) } + | '__peg_parser__' { RAISE_SYNTAX_ERROR("You found it!") } + | &STRING strings + | NUMBER + | &'(' (tuple | group | genexp) + | &'[' (list | listcomp) + | &'{' (dict | set | dictcomp | setcomp) + | '...' { _Py_Constant(Py_Ellipsis, NULL, EXTRA) } + +strings[expr_ty] (memo): a=STRING+ { _PyPegen_concatenate_strings(p, a) } +list[expr_ty]: + | '[' a=[star_named_expressions] ']' { _Py_List(a, Load, EXTRA) } +listcomp[expr_ty]: + | '[' a=named_expression ~ b=for_if_clauses ']' { _Py_ListComp(a, b, EXTRA) } + | invalid_comprehension +tuple[expr_ty]: + | '(' a=[y=star_named_expression ',' z=[star_named_expressions] { _PyPegen_seq_insert_in_front(p, y, z) } ] ')' { + _Py_Tuple(a, Load, EXTRA) } +group[expr_ty]: + | '(' a=(yield_expr | named_expression) ')' { a } + | invalid_group +genexp[expr_ty]: + | '(' a=expression ~ b=for_if_clauses ')' { _Py_GeneratorExp(a, b, EXTRA) } + | invalid_comprehension +set[expr_ty]: '{' a=expressions_list '}' { _Py_Set(a, EXTRA) } +setcomp[expr_ty]: + | '{' a=expression ~ b=for_if_clauses '}' { _Py_SetComp(a, b, EXTRA) } + | invalid_comprehension +dict[expr_ty]: + | '{' a=[double_starred_kvpairs] '}' { + _Py_Dict(CHECK(_PyPegen_get_keys(p, a)), CHECK(_PyPegen_get_values(p, a)), EXTRA) } +dictcomp[expr_ty]: + | '{' a=kvpair b=for_if_clauses '}' { _Py_DictComp(a->key, a->value, b, EXTRA) } + | invalid_dict_comprehension +double_starred_kvpairs[asdl_seq*]: a=','.double_starred_kvpair+ [','] { a } +double_starred_kvpair[KeyValuePair*]: + | '**' a=bitwise_or { _PyPegen_key_value_pair(p, NULL, a) } + | kvpair +kvpair[KeyValuePair*]: a=expression ':' b=expression { _PyPegen_key_value_pair(p, a, b) } +for_if_clauses[asdl_seq*]: + | for_if_clause+ +for_if_clause[comprehension_ty]: + | ASYNC 'for' a=star_targets 'in' ~ b=disjunction c=('if' z=disjunction { z })* { + CHECK_VERSION(6, "Async comprehensions are", _Py_comprehension(a, b, c, 1, p->arena)) } + | 'for' a=star_targets 'in' ~ b=disjunction c=('if' z=disjunction { z })* { + _Py_comprehension(a, b, c, 0, p->arena) } + | invalid_for_target + +yield_expr[expr_ty]: + | 'yield' 'from' a=expression { _Py_YieldFrom(a, EXTRA) } + | 'yield' a=[star_expressions] { _Py_Yield(a, EXTRA) } + +arguments[expr_ty] (memo): + | a=args [','] &')' { a } + | incorrect_arguments +args[expr_ty]: + | a=','.(starred_expression | named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b, EXTRA) } + | a=kwargs { _Py_Call(_PyPegen_dummy_name(p), + CHECK_NULL_ALLOWED(_PyPegen_seq_extract_starred_exprs(p, a)), + CHECK_NULL_ALLOWED(_PyPegen_seq_delete_starred_exprs(p, a)), + EXTRA) } +kwargs[asdl_seq*]: + | a=','.kwarg_or_starred+ ',' b=','.kwarg_or_double_starred+ { _PyPegen_join_sequences(p, a, b) } + | ','.kwarg_or_starred+ + | ','.kwarg_or_double_starred+ +starred_expression[expr_ty]: + | '*' a=expression { _Py_Starred(a, Load, EXTRA) } +kwarg_or_starred[KeywordOrStarred*]: + | a=NAME '=' b=expression { + _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(a->v.Name.id, b, EXTRA)), 1) } + | a=starred_expression { _PyPegen_keyword_or_starred(p, a, 0) } + | invalid_kwarg +kwarg_or_double_starred[KeywordOrStarred*]: + | a=NAME '=' b=expression { + _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(a->v.Name.id, b, EXTRA)), 1) } + | '**' a=expression { _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(NULL, a, EXTRA)), 1) } + | invalid_kwarg + +# NOTE: star_targets may contain *bitwise_or, targets may not. +star_targets[expr_ty]: + | a=star_target !',' { a } + | a=star_target b=(',' c=star_target { c })* [','] { + _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) } +star_targets_seq[asdl_seq*]: a=','.star_target+ [','] { a } +star_target[expr_ty] (memo): + | '*' a=(!'*' star_target) { + _Py_Starred(CHECK(_PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) } + | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) } + | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) } + | star_atom +star_atom[expr_ty]: + | a=NAME { _PyPegen_set_expr_context(p, a, Store) } + | '(' a=star_target ')' { _PyPegen_set_expr_context(p, a, Store) } + | '(' a=[star_targets_seq] ')' { _Py_Tuple(a, Store, EXTRA) } + | '[' a=[star_targets_seq] ']' { _Py_List(a, Store, EXTRA) } + +single_target[expr_ty]: + | single_subscript_attribute_target + | a=NAME { _PyPegen_set_expr_context(p, a, Store) } + | '(' a=single_target ')' { a } +single_subscript_attribute_target[expr_ty]: + | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) } + | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) } + +del_targets[asdl_seq*]: a=','.del_target+ [','] { a } +del_target[expr_ty] (memo): + | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Del, EXTRA) } + | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Del, EXTRA) } + | del_t_atom +del_t_atom[expr_ty]: + | a=NAME { _PyPegen_set_expr_context(p, a, Del) } + | '(' a=del_target ')' { _PyPegen_set_expr_context(p, a, Del) } + | '(' a=[del_targets] ')' { _Py_Tuple(a, Del, EXTRA) } + | '[' a=[del_targets] ']' { _Py_List(a, Del, EXTRA) } + +targets[asdl_seq*]: a=','.target+ [','] { a } +target[expr_ty] (memo): + | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) } + | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) } + | t_atom +t_primary[expr_ty]: + | a=t_primary '.' b=NAME &t_lookahead { _Py_Attribute(a, b->v.Name.id, Load, EXTRA) } + | a=t_primary '[' b=slices ']' &t_lookahead { _Py_Subscript(a, b, Load, EXTRA) } + | a=t_primary b=genexp &t_lookahead { _Py_Call(a, CHECK(_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } + | a=t_primary '(' b=[arguments] ')' &t_lookahead { + _Py_Call(a, + (b) ? ((expr_ty) b)->v.Call.args : NULL, + (b) ? ((expr_ty) b)->v.Call.keywords : NULL, + EXTRA) } + | a=atom &t_lookahead { a } +t_lookahead: '(' | '[' | '.' +t_atom[expr_ty]: + | a=NAME { _PyPegen_set_expr_context(p, a, Store) } + | '(' a=target ')' { _PyPegen_set_expr_context(p, a, Store) } + | '(' b=[targets] ')' { _Py_Tuple(b, Store, EXTRA) } + | '[' b=[targets] ']' { _Py_List(b, Store, EXTRA) } + + +# From here on, there are rules for invalid syntax with specialised error messages +incorrect_arguments: + | args ',' '*' { RAISE_SYNTAX_ERROR("iterable argument unpacking follows keyword argument unpacking") } + | a=expression for_if_clauses ',' [args | expression for_if_clauses] { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "Generator expression must be parenthesized") } + | a=args for_if_clauses { _PyPegen_nonparen_genexp_in_call(p, a) } + | args ',' a=expression for_if_clauses { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "Generator expression must be parenthesized") } + | a=args ',' args { _PyPegen_arguments_parsing_error(p, a) } +invalid_kwarg: + | a=expression '=' { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + a, "expression cannot contain assignment, perhaps you meant \"==\"?") } +invalid_named_expression: + | a=expression ':=' expression { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + a, "cannot use assignment expressions with %s", _PyPegen_get_expr_name(a)) } +invalid_assignment: + | a=invalid_ann_assign_target ':' expression { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + a, + "only single target (not %s) can be annotated", + _PyPegen_get_expr_name(a) + )} + | a=star_named_expression ',' star_named_expressions* ':' expression { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "only single target (not tuple) can be annotated") } + | a=expression ':' expression { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "illegal target for annotation") } + | (star_targets '=')* a=star_expressions '=' { + RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) } + | (star_targets '=')* a=yield_expr '=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "assignment to yield expression not possible") } + | a=star_expressions augassign (yield_expr | star_expressions) { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + a, + "'%s' is an illegal expression for augmented assignment", + _PyPegen_get_expr_name(a) + )} +invalid_ann_assign_target[expr_ty]: + | list + | tuple + | '(' a=invalid_ann_assign_target ')' { a } +invalid_del_stmt: + | 'del' a=star_expressions { + RAISE_SYNTAX_ERROR_INVALID_TARGET(DEL_TARGETS, a) } +invalid_block: + | NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block") } +invalid_comprehension: + | ('[' | '(' | '{') a=starred_expression for_if_clauses { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable unpacking cannot be used in comprehension") } +invalid_dict_comprehension: + | '{' a='**' bitwise_or for_if_clauses '}' { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "dict unpacking cannot be used in dict comprehension") } +invalid_parameters: + | param_no_default* (slash_with_default | param_with_default+) param_no_default { + RAISE_SYNTAX_ERROR("non-default argument follows default argument") } +invalid_lambda_parameters: + | lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default { + RAISE_SYNTAX_ERROR("non-default argument follows default argument") } +invalid_star_etc: + | '*' (')' | ',' (')' | '**')) { RAISE_SYNTAX_ERROR("named arguments must follow bare *") } + | '*' ',' TYPE_COMMENT { RAISE_SYNTAX_ERROR("bare * has associated type comment") } +invalid_lambda_star_etc: + | '*' (':' | ',' (':' | '**')) { RAISE_SYNTAX_ERROR("named arguments must follow bare *") } +invalid_double_type_comments: + | TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT { + RAISE_SYNTAX_ERROR("Cannot have two type comments on def") } +invalid_with_item: + | expression 'as' a=expression { + RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) } + +invalid_for_target: + | ASYNC? 'for' a=star_expressions { + RAISE_SYNTAX_ERROR_INVALID_TARGET(FOR_TARGETS, a) } + +invalid_group: + | '(' a=starred_expression ')' { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "can't use starred expression here") } +invalid_import_from_targets: + | import_from_as_names ',' { + RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") } diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 5fe4f2b4..e7afa1e6 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -6,6 +6,7 @@ extern "C" { #endif +#ifndef Py_LIMITED_API #include "asdl.h" #undef Yield /* undefine macro conflicting with */ @@ -16,10 +17,7 @@ typedef struct _stmt *stmt_ty; typedef struct _expr *expr_ty; -typedef enum _expr_context { Load=1, Store=2, Del=3, AugLoad=4, AugStore=5, - Param=6 } expr_context_ty; - -typedef struct _slice *slice_ty; +typedef enum _expr_context { Load=1, Store=2, Del=3 } expr_context_ty; typedef enum _boolop { And=1, Or=2 } boolop_ty; @@ -50,7 +48,7 @@ typedef struct _type_ignore *type_ignore_ty; enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, - FunctionType_kind=4, Suite_kind=5}; + FunctionType_kind=4}; struct _mod { enum _mod_kind kind; union { @@ -72,10 +70,6 @@ struct _mod { expr_ty returns; } FunctionType; - struct { - asdl_seq *body; - } Suite; - } v; }; @@ -236,7 +230,7 @@ enum _expr_kind {BoolOp_kind=1, NamedExpr_kind=2, BinOp_kind=3, UnaryOp_kind=4, YieldFrom_kind=15, Compare_kind=16, Call_kind=17, FormattedValue_kind=18, JoinedStr_kind=19, Constant_kind=20, Attribute_kind=21, Subscript_kind=22, Starred_kind=23, - Name_kind=24, List_kind=25, Tuple_kind=26}; + Name_kind=24, List_kind=25, Tuple_kind=26, Slice_kind=27}; struct _expr { enum _expr_kind kind; union { @@ -349,7 +343,7 @@ struct _expr { struct { expr_ty value; - slice_ty slice; + expr_ty slice; expr_context_ty ctx; } Subscript; @@ -373,32 +367,17 @@ struct _expr { expr_context_ty ctx; } Tuple; - } v; - int lineno; - int col_offset; - int end_lineno; - int end_col_offset; -}; - -enum _slice_kind {Slice_kind=1, ExtSlice_kind=2, Index_kind=3}; -struct _slice { - enum _slice_kind kind; - union { struct { expr_ty lower; expr_ty upper; expr_ty step; } Slice; - struct { - asdl_seq *dims; - } ExtSlice; - - struct { - expr_ty value; - } Index; - } v; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; }; struct _comprehension { @@ -448,6 +427,10 @@ struct _arg { struct _keyword { identifier arg; expr_ty value; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; }; struct _alias { @@ -482,8 +465,6 @@ mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena); mod_ty _Py_Expression(expr_ty body, PyArena *arena); #define FunctionType(a0, a1, a2) _Py_FunctionType(a0, a1, a2) mod_ty _Py_FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena); -#define Suite(a0, a1) _Py_Suite(a0, a1) -mod_ty _Py_Suite(asdl_seq * body, PyArena *arena); #define FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * decorator_list, expr_ty returns, string @@ -653,7 +634,7 @@ expr_ty _Py_Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Subscript(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Subscript(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int +expr_ty _Py_Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Starred(a0, a1, a2, a3, a4, a5, a6) _Py_Starred(a0, a1, a2, a3, a4, a5, a6) @@ -672,12 +653,10 @@ expr_ty _Py_List(asdl_seq * elts, expr_context_ty ctx, int lineno, int expr_ty _Py_Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -#define Slice(a0, a1, a2, a3) _Py_Slice(a0, a1, a2, a3) -slice_ty _Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena); -#define ExtSlice(a0, a1) _Py_ExtSlice(a0, a1) -slice_ty _Py_ExtSlice(asdl_seq * dims, PyArena *arena); -#define Index(a0, a1) _Py_Index(a0, a1) -slice_ty _Py_Index(expr_ty value, PyArena *arena); +#define Slice(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Slice(a0, a1, a2, a3, a4, a5, a6, a7) +expr_ty _Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); #define comprehension(a0, a1, a2, a3, a4) _Py_comprehension(a0, a1, a2, a3, a4) comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async, PyArena *arena); @@ -695,8 +674,10 @@ arguments_ty _Py_arguments(asdl_seq * posonlyargs, asdl_seq * args, arg_ty arg_ty _Py_arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -#define keyword(a0, a1, a2) _Py_keyword(a0, a1, a2) -keyword_ty _Py_keyword(identifier arg, expr_ty value, PyArena *arena); +#define keyword(a0, a1, a2, a3, a4, a5, a6) _Py_keyword(a0, a1, a2, a3, a4, a5, a6) +keyword_ty _Py_keyword(identifier arg, expr_ty value, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); #define alias(a0, a1, a2) _Py_alias(a0, a1, a2) alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena); #define withitem(a0, a1, a2) _Py_withitem(a0, a1, a2) @@ -708,6 +689,7 @@ type_ignore_ty _Py_TypeIgnore(int lineno, string tag, PyArena *arena); PyObject* PyAST_mod2obj(mod_ty t); mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); int PyAST_Check(PyObject* obj); +#endif /* !Py_LIMITED_API */ #ifdef __cplusplus } diff --git a/Include/Python.h b/Include/Python.h index d6e5b139..dcd0a57a 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -114,12 +114,15 @@ #include "classobject.h" #include "fileobject.h" #include "pycapsule.h" +#include "code.h" +#include "pyframe.h" #include "traceback.h" #include "sliceobject.h" #include "cellobject.h" #include "iterobject.h" #include "genobject.h" #include "descrobject.h" +#include "genericaliasobject.h" #include "warnings.h" #include "weakrefobject.h" #include "structseq.h" @@ -130,6 +133,7 @@ #include "pyerrors.h" #include "cpython/initconfig.h" +#include "pythread.h" #include "pystate.h" #include "context.h" @@ -152,7 +156,6 @@ #include "pyctype.h" #include "pystrtod.h" #include "pystrcmp.h" -#include "dtoa.h" #include "fileutils.h" #include "pyfpe.h" #include "tracemalloc.h" diff --git a/Include/abstract.h b/Include/abstract.h index 777fd707..bb51c668 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -141,6 +141,12 @@ extern "C" { #endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +/* Call a callable Python object without any arguments */ +PyAPI_FUNC(PyObject *) PyObject_CallNoArgs(PyObject *func); +#endif + + /* Call a callable Python object 'callable' with arguments given by the tuple 'args' and keywords arguments given by the dictionary 'kwargs'. @@ -696,7 +702,7 @@ PyAPI_FUNC(PyObject *) PySequence_Fast(PyObject *o, const char* m); (PyList_Check(o) ? PyList_GET_ITEM(o, i) : PyTuple_GET_ITEM(o, i)) /* Return a pointer to the underlying item array for - an object retured by PySequence_Fast */ + an object returned by PySequence_Fast */ #define PySequence_Fast_ITEMS(sf) \ (PyList_Check(sf) ? ((PyListObject *)(sf))->ob_item \ : ((PyTupleObject *)(sf))->ob_item) diff --git a/Include/asdl.h b/Include/asdl.h index fc6d2237..e962560b 100644 --- a/Include/asdl.h +++ b/Include/asdl.h @@ -1,11 +1,10 @@ +#ifndef Py_LIMITED_API #ifndef Py_ASDL_H #define Py_ASDL_H typedef PyObject * identifier; typedef PyObject * string; -typedef PyObject * bytes; typedef PyObject * object; -typedef PyObject * singleton; typedef PyObject * constant; /* It would be nice if the code generated by asdl_c.py was completely @@ -44,3 +43,4 @@ asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena); #endif #endif /* !Py_ASDL_H */ +#endif /* Py_LIMITED_API */ diff --git a/Include/ast.h b/Include/ast.h index f1d73485..a8c52af7 100644 --- a/Include/ast.h +++ b/Include/ast.h @@ -1,3 +1,4 @@ +#ifndef Py_LIMITED_API #ifndef Py_AST_H #define Py_AST_H #ifdef __cplusplus @@ -19,19 +20,16 @@ PyAPI_FUNC(mod_ty) PyAST_FromNodeObject( PyObject *filename, PyArena *arena); -#ifndef Py_LIMITED_API - /* _PyAST_ExprAsUnicode is defined in ast_unparse.c */ PyAPI_FUNC(PyObject *) _PyAST_ExprAsUnicode(expr_ty); /* Return the borrowed reference to the first literal string in the - sequence of statemnts or NULL if it doesn't start from a literal string. + sequence of statements or NULL if it doesn't start from a literal string. Doesn't set exception. */ PyAPI_FUNC(PyObject *) _PyAST_GetDocString(asdl_seq *); -#endif /* !Py_LIMITED_API */ - #ifdef __cplusplus } #endif #endif /* !Py_AST_H */ +#endif /* !Py_LIMITED_API */ diff --git a/Include/boolobject.h b/Include/boolobject.h index 7cc2f1fe..bb8044a2 100644 --- a/Include/boolobject.h +++ b/Include/boolobject.h @@ -9,7 +9,7 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyBool_Type; -#define PyBool_Check(x) (Py_TYPE(x) == &PyBool_Type) +#define PyBool_Check(x) Py_IS_TYPE(x, &PyBool_Type) /* Py_False and Py_True are the only two bools in existence. Don't forget to apply Py_INCREF() when returning either!!! */ diff --git a/Include/bytearrayobject.h b/Include/bytearrayobject.h index a757b880..9e95433f 100644 --- a/Include/bytearrayobject.h +++ b/Include/bytearrayobject.h @@ -18,25 +18,13 @@ extern "C" { * to contain a char pointer, not an unsigned char pointer. */ -/* Object layout */ -#ifndef Py_LIMITED_API -typedef struct { - PyObject_VAR_HEAD - Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ - char *ob_bytes; /* Physical backing buffer */ - char *ob_start; /* Logical start inside ob_bytes */ - /* XXX(nnorwitz): should ob_exports be Py_ssize_t? */ - int ob_exports; /* How many buffer exports */ -} PyByteArrayObject; -#endif - /* Type object */ PyAPI_DATA(PyTypeObject) PyByteArray_Type; PyAPI_DATA(PyTypeObject) PyByteArrayIter_Type; /* Type check macros */ #define PyByteArray_Check(self) PyObject_TypeCheck(self, &PyByteArray_Type) -#define PyByteArray_CheckExact(self) (Py_TYPE(self) == &PyByteArray_Type) +#define PyByteArray_CheckExact(self) Py_IS_TYPE(self, &PyByteArray_Type) /* Direct API functions */ PyAPI_FUNC(PyObject *) PyByteArray_FromObject(PyObject *); @@ -46,14 +34,10 @@ PyAPI_FUNC(Py_ssize_t) PyByteArray_Size(PyObject *); PyAPI_FUNC(char *) PyByteArray_AsString(PyObject *); PyAPI_FUNC(int) PyByteArray_Resize(PyObject *, Py_ssize_t); -/* Macros, trading safety for speed */ #ifndef Py_LIMITED_API -#define PyByteArray_AS_STRING(self) \ - (assert(PyByteArray_Check(self)), \ - Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) -#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) - -PyAPI_DATA(char) _PyByteArray_empty_string[]; +# define Py_CPYTHON_BYTEARRAYOBJECT_H +# include "cpython/bytearrayobject.h" +# undef Py_CPYTHON_BYTEARRAYOBJECT_H #endif #ifdef __cplusplus diff --git a/Include/bytes_methods.h b/Include/bytes_methods.h deleted file mode 100644 index 8434a50a..00000000 --- a/Include/bytes_methods.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef Py_LIMITED_API -#ifndef Py_BYTES_CTYPE_H -#define Py_BYTES_CTYPE_H - -/* - * The internal implementation behind PyBytes (bytes) and PyByteArray (bytearray) - * methods of the given names, they operate on ASCII byte strings. - */ -extern PyObject* _Py_bytes_isspace(const char *cptr, Py_ssize_t len); -extern PyObject* _Py_bytes_isalpha(const char *cptr, Py_ssize_t len); -extern PyObject* _Py_bytes_isalnum(const char *cptr, Py_ssize_t len); -extern PyObject* _Py_bytes_isascii(const char *cptr, Py_ssize_t len); -extern PyObject* _Py_bytes_isdigit(const char *cptr, Py_ssize_t len); -extern PyObject* _Py_bytes_islower(const char *cptr, Py_ssize_t len); -extern PyObject* _Py_bytes_isupper(const char *cptr, Py_ssize_t len); -extern PyObject* _Py_bytes_istitle(const char *cptr, Py_ssize_t len); - -/* These store their len sized answer in the given preallocated *result arg. */ -extern void _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len); -extern void _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len); -extern void _Py_bytes_title(char *result, const char *s, Py_ssize_t len); -extern void _Py_bytes_capitalize(char *result, const char *s, Py_ssize_t len); -extern void _Py_bytes_swapcase(char *result, const char *s, Py_ssize_t len); - -extern PyObject *_Py_bytes_find(const char *str, Py_ssize_t len, PyObject *args); -extern PyObject *_Py_bytes_index(const char *str, Py_ssize_t len, PyObject *args); -extern PyObject *_Py_bytes_rfind(const char *str, Py_ssize_t len, PyObject *args); -extern PyObject *_Py_bytes_rindex(const char *str, Py_ssize_t len, PyObject *args); -extern PyObject *_Py_bytes_count(const char *str, Py_ssize_t len, PyObject *args); -extern int _Py_bytes_contains(const char *str, Py_ssize_t len, PyObject *arg); -extern PyObject *_Py_bytes_startswith(const char *str, Py_ssize_t len, PyObject *args); -extern PyObject *_Py_bytes_endswith(const char *str, Py_ssize_t len, PyObject *args); - -/* The maketrans() static method. */ -extern PyObject* _Py_bytes_maketrans(Py_buffer *frm, Py_buffer *to); - -/* Shared __doc__ strings. */ -extern const char _Py_isspace__doc__[]; -extern const char _Py_isalpha__doc__[]; -extern const char _Py_isalnum__doc__[]; -extern const char _Py_isascii__doc__[]; -extern const char _Py_isdigit__doc__[]; -extern const char _Py_islower__doc__[]; -extern const char _Py_isupper__doc__[]; -extern const char _Py_istitle__doc__[]; -extern const char _Py_lower__doc__[]; -extern const char _Py_upper__doc__[]; -extern const char _Py_title__doc__[]; -extern const char _Py_capitalize__doc__[]; -extern const char _Py_swapcase__doc__[]; -extern const char _Py_count__doc__[]; -extern const char _Py_find__doc__[]; -extern const char _Py_index__doc__[]; -extern const char _Py_rfind__doc__[]; -extern const char _Py_rindex__doc__[]; -extern const char _Py_startswith__doc__[]; -extern const char _Py_endswith__doc__[]; -extern const char _Py_maketrans__doc__[]; -extern const char _Py_expandtabs__doc__[]; -extern const char _Py_ljust__doc__[]; -extern const char _Py_rjust__doc__[]; -extern const char _Py_center__doc__[]; -extern const char _Py_zfill__doc__[]; - -/* this is needed because some docs are shared from the .o, not static */ -#define PyDoc_STRVAR_shared(name,str) const char name[] = PyDoc_STR(str) - -#endif /* !Py_BYTES_CTYPE_H */ -#endif /* !Py_LIMITED_API */ diff --git a/Include/bytesobject.h b/Include/bytesobject.h index 3fde4a22..5062d8d1 100644 --- a/Include/bytesobject.h +++ b/Include/bytesobject.h @@ -27,26 +27,12 @@ functions should be applied to nil objects. /* Caching the hash (ob_shash) saves recalculation of a string's hash value. This significantly speeds up dict lookups. */ -#ifndef Py_LIMITED_API -typedef struct { - PyObject_VAR_HEAD - Py_hash_t ob_shash; - char ob_sval[1]; - - /* Invariants: - * ob_sval contains space for 'ob_size+1' elements. - * ob_sval[ob_size] == 0. - * ob_shash is the hash of the string or -1 if not computed yet. - */ -} PyBytesObject; -#endif - PyAPI_DATA(PyTypeObject) PyBytes_Type; PyAPI_DATA(PyTypeObject) PyBytesIter_Type; #define PyBytes_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BYTES_SUBCLASS) -#define PyBytes_CheckExact(op) (Py_TYPE(op) == &PyBytes_Type) +#define PyBytes_CheckExact(op) Py_IS_TYPE(op, &PyBytes_Type) PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t); PyAPI_FUNC(PyObject *) PyBytes_FromString(const char *); @@ -60,40 +46,9 @@ PyAPI_FUNC(char *) PyBytes_AsString(PyObject *); PyAPI_FUNC(PyObject *) PyBytes_Repr(PyObject *, int); PyAPI_FUNC(void) PyBytes_Concat(PyObject **, PyObject *); PyAPI_FUNC(void) PyBytes_ConcatAndDel(PyObject **, PyObject *); -#ifndef Py_LIMITED_API -PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t); -PyAPI_FUNC(PyObject*) _PyBytes_FormatEx( - const char *format, - Py_ssize_t format_len, - PyObject *args, - int use_bytearray); -PyAPI_FUNC(PyObject*) _PyBytes_FromHex( - PyObject *string, - int use_bytearray); -#endif PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t, const char *, Py_ssize_t, const char *); -#ifndef Py_LIMITED_API -/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */ -PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t, - const char *, Py_ssize_t, - const char *, - const char **); -#endif - -/* Macro, trading safety for speed */ -#ifndef Py_LIMITED_API -#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \ - (((PyBytesObject *)(op))->ob_sval)) -#define PyBytes_GET_SIZE(op) (assert(PyBytes_Check(op)),Py_SIZE(op)) -#endif - -/* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*, - x must be an iterable object. */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x); -#endif /* Provides access to the internal data buffer and size of a string object or the default encoded version of a Unicode object. Passing @@ -108,28 +63,6 @@ PyAPI_FUNC(int) PyBytes_AsStringAndSize( strings) */ ); -/* Using the current locale, insert the thousands grouping - into the string pointed to by buffer. For the argument descriptions, - see Objects/stringlib/localeutil.h */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGroupingLocale(char *buffer, - Py_ssize_t n_buffer, - char *digits, - Py_ssize_t n_digits, - Py_ssize_t min_width); - -/* Using explicit passed-in values, insert the thousands grouping - into the string pointed to by buffer. For the argument descriptions, - see Objects/stringlib/localeutil.h */ -PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGrouping(char *buffer, - Py_ssize_t n_buffer, - char *digits, - Py_ssize_t n_digits, - Py_ssize_t min_width, - const char *grouping, - const char *thousands_sep); -#endif - /* Flags used by string formatting */ #define F_LJUST (1<<0) #define F_SIGN (1<<1) @@ -138,85 +71,10 @@ PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGrouping(char *buffer, #define F_ZERO (1<<4) #ifndef Py_LIMITED_API -/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer". - A _PyBytesWriter variable must be declared at the end of variables in a - function to optimize the memory allocation on the stack. */ -typedef struct { - /* bytes, bytearray or NULL (when the small buffer is used) */ - PyObject *buffer; - - /* Number of allocated size. */ - Py_ssize_t allocated; - - /* Minimum number of allocated bytes, - incremented by _PyBytesWriter_Prepare() */ - Py_ssize_t min_size; - - /* If non-zero, use a bytearray instead of a bytes object for buffer. */ - int use_bytearray; - - /* If non-zero, overallocate the buffer (default: 0). - This flag must be zero if use_bytearray is non-zero. */ - int overallocate; - - /* Stack buffer */ - int use_small_buffer; - char small_buffer[512]; -} _PyBytesWriter; - -/* Initialize a bytes writer - - By default, the overallocation is disabled. Set the overallocate attribute - to control the allocation of the buffer. */ -PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer); - -/* Get the buffer content and reset the writer. - Return a bytes object, or a bytearray object if use_bytearray is non-zero. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer, - void *str); - -/* Deallocate memory of a writer (clear its internal buffer). */ -PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer); - -/* Allocate the buffer to write size bytes. - Return the pointer to the beginning of buffer data. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer, - Py_ssize_t size); - -/* Ensure that the buffer is large enough to write *size* bytes. - Add size to the writer minimum size (min_size attribute). - - str is the current pointer inside the buffer. - Return the updated current pointer inside the buffer. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, - void *str, - Py_ssize_t size); - -/* Resize the buffer to make it larger. - The new buffer may be larger than size bytes because of overallocation. - Return the updated current pointer inside the buffer. - Raise an exception and return NULL on error. - - Note: size must be greater than the number of allocated bytes in the writer. - - This function doesn't use the writer minimum size (min_size attribute). - - See also _PyBytesWriter_Prepare(). - */ -PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer, - void *str, - Py_ssize_t size); - -/* Write bytes. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, - void *str, - const void *bytes, - Py_ssize_t size); -#endif /* Py_LIMITED_API */ +# define Py_CPYTHON_BYTESOBJECT_H +# include "cpython/bytesobject.h" +# undef Py_CPYTHON_BYTESOBJECT_H +#endif #ifdef __cplusplus } diff --git a/Include/cellobject.h b/Include/cellobject.h index 2f9b5b75..f12aa90a 100644 --- a/Include/cellobject.h +++ b/Include/cellobject.h @@ -13,7 +13,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyCell_Type; -#define PyCell_Check(op) (Py_TYPE(op) == &PyCell_Type) +#define PyCell_Check(op) Py_IS_TYPE(op, &PyCell_Type) PyAPI_FUNC(PyObject *) PyCell_New(PyObject *); PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); diff --git a/Include/ceval.h b/Include/ceval.h index 36fd014a..0f372e20 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -8,52 +8,30 @@ extern "C" { /* Interface to random parts in ceval.c */ /* PyEval_CallObjectWithKeywords(), PyEval_CallObject(), PyEval_CallFunction - * and PyEval_CallMethod are kept for backward compatibility: PyObject_Call(), - * PyObject_CallFunction() and PyObject_CallMethod() are recommended to call - * a callable object. + * and PyEval_CallMethod are deprecated. Since they are officially part of the + * stable ABI (PEP 384), they must be kept for backward compatibility. + * PyObject_Call(), PyObject_CallFunction() and PyObject_CallMethod() are + * recommended to call a callable object. */ -PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords( +Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords( PyObject *callable, PyObject *args, PyObject *kwargs); -/* Inline this */ +/* Deprecated since PyEval_CallObjectWithKeywords is deprecated */ #define PyEval_CallObject(callable, arg) \ PyEval_CallObjectWithKeywords(callable, arg, (PyObject *)NULL) -PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *callable, - const char *format, ...); -PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj, - const char *name, - const char *format, ...); - -#ifndef Py_LIMITED_API -PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); -PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); -PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth(int new_depth); -PyAPI_FUNC(int) _PyEval_GetCoroutineOriginTrackingDepth(void); -PyAPI_FUNC(void) _PyEval_SetAsyncGenFirstiter(PyObject *); -PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFirstiter(void); -PyAPI_FUNC(void) _PyEval_SetAsyncGenFinalizer(PyObject *); -PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFinalizer(void); -#endif - -struct _frame; /* Avoid including frameobject.h */ +Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallFunction( + PyObject *callable, const char *format, ...); +Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallMethod( + PyObject *obj, const char *name, const char *format, ...); PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void); PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void); PyAPI_FUNC(PyObject *) PyEval_GetLocals(void); -PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void); - -#ifndef Py_LIMITED_API -/* Helper to look up a builtin object */ -PyAPI_FUNC(PyObject *) _PyEval_GetBuiltinId(_Py_Identifier *); -/* Look at the current frame's (if any) code's co_flags, and turn on - the corresponding compiler flags in cf->cf_flags. Return 1 if any - flag was set, else return 0. */ -PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); -#endif +PyAPI_FUNC(PyFrameObject *) PyEval_GetFrame(void); PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg); PyAPI_FUNC(int) Py_MakePendingCalls(void); @@ -86,41 +64,8 @@ PyAPI_FUNC(int) Py_MakePendingCalls(void); PyAPI_FUNC(void) Py_SetRecursionLimit(int); PyAPI_FUNC(int) Py_GetRecursionLimit(void); -#define Py_EnterRecursiveCall(where) \ - (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \ - _Py_CheckRecursiveCall(where)) -#define Py_LeaveRecursiveCall() \ - do{ if(_Py_MakeEndRecCheck(PyThreadState_GET()->recursion_depth)) \ - PyThreadState_GET()->overflowed = 0; \ - } while(0) -PyAPI_FUNC(int) _Py_CheckRecursiveCall(const char *where); - -/* Due to the macros in which it's used, _Py_CheckRecursionLimit is in - the stable ABI. It should be removed therefrom when possible. -*/ -PyAPI_DATA(int) _Py_CheckRecursionLimit; - -#ifdef USE_STACKCHECK -/* With USE_STACKCHECK, trigger stack checks in _Py_CheckRecursiveCall() - on every 64th call to Py_EnterRecursiveCall. -*/ -# define _Py_MakeRecCheck(x) \ - (++(x) > _Py_CheckRecursionLimit || \ - ++(PyThreadState_GET()->stackcheck_counter) > 64) -#else -# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit) -#endif - -/* Compute the "lower-water mark" for a recursion limit. When - * Py_LeaveRecursiveCall() is called with a recursion depth below this mark, - * the overflowed flag is reset to 0. */ -#define _Py_RecursionLimitLowerWaterMark(limit) \ - (((limit) > 200) \ - ? ((limit) - 50) \ - : (3 * ((limit) >> 2))) - -#define _Py_MakeEndRecCheck(x) \ - (--(x) < _Py_RecursionLimitLowerWaterMark(_Py_CheckRecursionLimit)) +PyAPI_FUNC(int) Py_EnterRecursiveCall(const char *where); +PyAPI_FUNC(void) Py_LeaveRecursiveCall(void); #define Py_ALLOW_RECURSION \ do { unsigned char _old = PyThreadState_GET()->recursion_critical;\ @@ -133,11 +78,8 @@ PyAPI_DATA(int) _Py_CheckRecursionLimit; PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *); PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *); -PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *); -PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc); -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(struct _frame *f, int exc); -#endif +PyAPI_FUNC(PyObject *) PyEval_EvalFrame(PyFrameObject *); +PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(PyFrameObject *f, int exc); /* Interface for threads. @@ -177,9 +119,6 @@ PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(struct _frame *f, int exc); WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND Py_END_ALLOW_THREADS!!! - The function PyEval_InitThreads() should be called only from - init_thread() in "_threadmodule.c". - Note that not yet all candidates have been converted to use this mechanism! */ @@ -187,22 +126,17 @@ PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(struct _frame *f, int exc); PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void); PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *); -PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); -PyAPI_FUNC(void) PyEval_InitThreads(void); +Py_DEPRECATED(3.9) PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); +Py_DEPRECATED(3.9) PyAPI_FUNC(void) PyEval_InitThreads(void); +/* PyEval_AcquireLock() and PyEval_ReleaseLock() are part of stable ABI. + * They will be removed from this header file in the future version. + * But they will be remained in ABI until Python 4.0. + */ Py_DEPRECATED(3.2) PyAPI_FUNC(void) PyEval_AcquireLock(void); -/* Py_DEPRECATED(3.2) */ PyAPI_FUNC(void) PyEval_ReleaseLock(void); +Py_DEPRECATED(3.2) PyAPI_FUNC(void) PyEval_ReleaseLock(void); PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); -#ifndef Py_LIMITED_API -PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds); -PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void); -#endif - -#ifndef Py_LIMITED_API -PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); -#endif - #define Py_BEGIN_ALLOW_THREADS { \ PyThreadState *_save; \ _save = PyEval_SaveThread(); @@ -211,11 +145,6 @@ PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); #define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \ } -#ifndef Py_LIMITED_API -PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); -PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); -#endif - /* Masks and values used by FORMAT_VALUE opcode. */ #define FVC_MASK 0x3 #define FVC_NONE 0x0 @@ -225,6 +154,12 @@ PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); #define FVS_MASK 0x4 #define FVS_HAVE_SPEC 0x4 +#ifndef Py_LIMITED_API +# define Py_CPYTHON_CEVAL_H +# include "cpython/ceval.h" +# undef Py_CPYTHON_CEVAL_H +#endif + #ifdef __cplusplus } #endif diff --git a/Include/classobject.h b/Include/classobject.h index c83303c3..1952f673 100644 --- a/Include/classobject.h +++ b/Include/classobject.h @@ -19,7 +19,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyMethod_Type; -#define PyMethod_Check(op) ((op)->ob_type == &PyMethod_Type) +#define PyMethod_Check(op) Py_IS_TYPE(op, &PyMethod_Type) PyAPI_FUNC(PyObject *) PyMethod_New(PyObject *, PyObject *); @@ -33,8 +33,6 @@ PyAPI_FUNC(PyObject *) PyMethod_Self(PyObject *); #define PyMethod_GET_SELF(meth) \ (((PyMethodObject *)meth) -> im_self) -PyAPI_FUNC(int) PyMethod_ClearFreeList(void); - typedef struct { PyObject_HEAD PyObject *func; @@ -42,7 +40,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyInstanceMethod_Type; -#define PyInstanceMethod_Check(op) ((op)->ob_type == &PyInstanceMethod_Type) +#define PyInstanceMethod_Check(op) Py_IS_TYPE(op, &PyInstanceMethod_Type) PyAPI_FUNC(PyObject *) PyInstanceMethod_New(PyObject *); PyAPI_FUNC(PyObject *) PyInstanceMethod_Function(PyObject *); diff --git a/Include/code.h b/Include/code.h index a1cd58f4..b9e23eb8 100644 --- a/Include/code.h +++ b/Include/code.h @@ -1,180 +1,20 @@ /* Definitions for bytecode */ -#ifndef Py_LIMITED_API #ifndef Py_CODE_H #define Py_CODE_H #ifdef __cplusplus extern "C" { #endif -typedef uint16_t _Py_CODEUNIT; - -#ifdef WORDS_BIGENDIAN -# define _Py_OPCODE(word) ((word) >> 8) -# define _Py_OPARG(word) ((word) & 255) -#else -# define _Py_OPCODE(word) ((word) & 255) -# define _Py_OPARG(word) ((word) >> 8) -#endif - -typedef struct _PyOpcache _PyOpcache; - -/* Bytecode object */ -typedef struct { - PyObject_HEAD - int co_argcount; /* #arguments, except *args */ - int co_posonlyargcount; /* #positional only arguments */ - int co_kwonlyargcount; /* #keyword only arguments */ - int co_nlocals; /* #local variables */ - int co_stacksize; /* #entries needed for evaluation stack */ - int co_flags; /* CO_..., see below */ - int co_firstlineno; /* first source line number */ - PyObject *co_code; /* instruction opcodes */ - PyObject *co_consts; /* list (constants used) */ - PyObject *co_names; /* list of strings (names used) */ - PyObject *co_varnames; /* tuple of strings (local variable names) */ - PyObject *co_freevars; /* tuple of strings (free variable names) */ - PyObject *co_cellvars; /* tuple of strings (cell variable names) */ - /* The rest aren't used in either hash or comparisons, except for co_name, - used in both. This is done to preserve the name and line number - for tracebacks and debuggers; otherwise, constant de-duplication - would collapse identical functions/lambdas defined on different lines. - */ - Py_ssize_t *co_cell2arg; /* Maps cell vars which are arguments. */ - PyObject *co_filename; /* unicode (where it was loaded from) */ - PyObject *co_name; /* unicode (name, for reference) */ - PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See - Objects/lnotab_notes.txt for details. */ - void *co_zombieframe; /* for optimization only (see frameobject.c) */ - PyObject *co_weakreflist; /* to support weakrefs to code objects */ - /* Scratch space for extra data relating to the code object. - Type is a void* to keep the format private in codeobject.c to force - people to go through the proper APIs. */ - void *co_extra; - - /* Per opcodes just-in-time cache - * - * To reduce cache size, we use indirect mapping from opcode index to - * cache object: - * cache = co_opcache[co_opcache_map[next_instr - first_instr] - 1] - */ - - // co_opcache_map is indexed by (next_instr - first_instr). - // * 0 means there is no cache for this opcode. - // * n > 0 means there is cache in co_opcache[n-1]. - unsigned char *co_opcache_map; - _PyOpcache *co_opcache; - int co_opcache_flag; // used to determine when create a cache. - unsigned char co_opcache_size; // length of co_opcache. -} PyCodeObject; - -/* Masks for co_flags above */ -#define CO_OPTIMIZED 0x0001 -#define CO_NEWLOCALS 0x0002 -#define CO_VARARGS 0x0004 -#define CO_VARKEYWORDS 0x0008 -#define CO_NESTED 0x0010 -#define CO_GENERATOR 0x0020 -/* The CO_NOFREE flag is set if there are no free or cell variables. - This information is redundant, but it allows a single flag test - to determine whether there is any extra work to be done when the - call frame it setup. -*/ -#define CO_NOFREE 0x0040 - -/* The CO_COROUTINE flag is set for coroutine functions (defined with - ``async def`` keywords) */ -#define CO_COROUTINE 0x0080 -#define CO_ITERABLE_COROUTINE 0x0100 -#define CO_ASYNC_GENERATOR 0x0200 - -/* bpo-39562: These constant values are changed in Python 3.9 - to prevent collision with compiler flags. CO_FUTURE_ and PyCF_ - constants must be kept unique. PyCF_ constants can use bits from - 0x0100 to 0x10000. CO_FUTURE_ constants use bits starting at 0x20000. */ -#define CO_FUTURE_DIVISION 0x20000 -#define CO_FUTURE_ABSOLUTE_IMPORT 0x40000 /* do absolute imports by default */ -#define CO_FUTURE_WITH_STATEMENT 0x80000 -#define CO_FUTURE_PRINT_FUNCTION 0x100000 -#define CO_FUTURE_UNICODE_LITERALS 0x200000 - -#define CO_FUTURE_BARRY_AS_BDFL 0x400000 -#define CO_FUTURE_GENERATOR_STOP 0x800000 -#define CO_FUTURE_ANNOTATIONS 0x1000000 - -/* This value is found in the co_cell2arg array when the associated cell - variable does not correspond to an argument. */ -#define CO_CELL_NOT_AN_ARG (-1) - -/* This should be defined if a future statement modifies the syntax. - For example, when a keyword is added. -*/ -#define PY_PARSER_REQUIRES_FUTURE_KEYWORD - -#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ - -PyAPI_DATA(PyTypeObject) PyCode_Type; - -#define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type) -#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars)) - -/* Public interface */ -PyAPI_FUNC(PyCodeObject *) PyCode_New( - int, int, int, int, int, PyObject *, PyObject *, - PyObject *, PyObject *, PyObject *, PyObject *, - PyObject *, PyObject *, int, PyObject *); - -PyAPI_FUNC(PyCodeObject *) PyCode_NewWithPosOnlyArgs( - int, int, int, int, int, int, PyObject *, PyObject *, - PyObject *, PyObject *, PyObject *, PyObject *, - PyObject *, PyObject *, int, PyObject *); - /* same as struct above */ - -/* Creates a new empty code object with the specified source location. */ -PyAPI_FUNC(PyCodeObject *) -PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); - -/* Return the line number associated with the specified bytecode index - in this code object. If you just need the line number of a frame, - use PyFrame_GetLineNumber() instead. */ -PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); - -/* for internal use only */ -typedef struct _addr_pair { - int ap_lower; - int ap_upper; -} PyAddrPair; - -#ifndef Py_LIMITED_API -/* Update *bounds to describe the first and one-past-the-last instructions in the - same line as lasti. Return the number of that line. -*/ -PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co, - int lasti, PyAddrPair *bounds); - -/* Create a comparable key used to compare constants taking in account the - * object type. It is used to make sure types are not coerced (e.g., float and - * complex) _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms - * - * Return (type(obj), obj, ...): a tuple with variable size (at least 2 items) - * depending on the type and the value. The type is the first item to not - * compare bytes and str which can raise a BytesWarning exception. */ -PyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj); -#endif - -PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts, - PyObject *names, PyObject *lnotab); - +typedef struct PyCodeObject PyCodeObject; #ifndef Py_LIMITED_API -PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index, - void **extra); -PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, - void *extra); +# define Py_CPYTHON_CODE_H +# include "cpython/code.h" +# undef Py_CPYTHON_CODE_H #endif #ifdef __cplusplus } #endif #endif /* !Py_CODE_H */ -#endif /* Py_LIMITED_API */ diff --git a/Include/compile.h b/Include/compile.h index 015584d0..98adee3d 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -2,7 +2,6 @@ #define Py_COMPILE_H #ifndef Py_LIMITED_API -#include "code.h" #ifdef __cplusplus extern "C" { @@ -10,6 +9,9 @@ extern "C" { /* Public interface */ struct _node; /* Declare the existence of this type */ +#ifndef Py_BUILD_CORE +Py_DEPRECATED(3.9) +#endif PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); /* XXX (ncoghlan): Unprefixed type name in a public API! */ @@ -89,7 +91,12 @@ PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump); -PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize); +typedef struct { + int optimize; + int ff_features; +} _PyASTOptimizeState; + +PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, _PyASTOptimizeState *state); #ifdef __cplusplus } @@ -103,4 +110,7 @@ PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize); #define Py_eval_input 258 #define Py_func_type_input 345 +/* This doesn't need to match anything */ +#define Py_fstring_input 800 + #endif /* !Py_COMPILE_H */ diff --git a/Include/complexobject.h b/Include/complexobject.h index cb8c52c5..9221f9c5 100644 --- a/Include/complexobject.h +++ b/Include/complexobject.h @@ -39,7 +39,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyComplex_Type; #define PyComplex_Check(op) PyObject_TypeCheck(op, &PyComplex_Type) -#define PyComplex_CheckExact(op) (Py_TYPE(op) == &PyComplex_Type) +#define PyComplex_CheckExact(op) Py_IS_TYPE(op, &PyComplex_Type) #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) PyComplex_FromCComplex(Py_complex); diff --git a/Include/context.h b/Include/context.h index 95812852..4e500708 100644 --- a/Include/context.h +++ b/Include/context.h @@ -17,9 +17,9 @@ PyAPI_DATA(PyTypeObject) PyContextToken_Type; typedef struct _pycontexttokenobject PyContextToken; -#define PyContext_CheckExact(o) (Py_TYPE(o) == &PyContext_Type) -#define PyContextVar_CheckExact(o) (Py_TYPE(o) == &PyContextVar_Type) -#define PyContextToken_CheckExact(o) (Py_TYPE(o) == &PyContextToken_Type) +#define PyContext_CheckExact(o) Py_IS_TYPE(o, &PyContext_Type) +#define PyContextVar_CheckExact(o) Py_IS_TYPE(o, &PyContextVar_Type) +#define PyContextToken_CheckExact(o) Py_IS_TYPE(o, &PyContextToken_Type) PyAPI_FUNC(PyObject *) PyContext_New(void); @@ -73,9 +73,6 @@ PyAPI_FUNC(int) PyContextVar_Reset(PyObject *var, PyObject *token); PyAPI_FUNC(PyObject *) _PyContext_NewHamtForTests(void); -PyAPI_FUNC(int) PyContext_ClearFreeList(void); - - #endif /* !Py_LIMITED_API */ #ifdef __cplusplus diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 2ea3209b..7bc80833 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -26,28 +26,10 @@ PyAPI_FUNC(PyObject *) _PyStack_AsDict( PyObject *const *values, PyObject *kwnames); -/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple). - - Return 0 on success, raise an exception and return -1 on error. - - Write the new stack into *p_stack. If *p_stack is differen than args, it - must be released by PyMem_Free(). - - The stack uses borrowed references. - - The type of keyword keys is not checked, these checks should be done - later (ex: _PyArg_ParseStackAndKeywords). */ -PyAPI_FUNC(int) _PyStack_UnpackDict( - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwargs, - PyObject *const **p_stack, - PyObject **p_kwnames); - /* Suggested size (number of positional arguments) for arrays of PyObject* allocated on a C stack to avoid allocating memory on the heap memory. Such array is used to pass positional arguments to call functions of the - _PyObject_Vectorcall() family. + PyObject_Vectorcall() family. The size is chosen to not abuse the C stack and so limit the risk of stack overflow. The size is also chosen to allow using the small stack for most @@ -55,16 +37,19 @@ PyAPI_FUNC(int) _PyStack_UnpackDict( 40 bytes on the stack. */ #define _PY_FASTCALL_SMALL_STACK 5 -PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(PyObject *callable, - PyObject *result, - const char *where); +PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult( + PyThreadState *tstate, + PyObject *callable, + PyObject *result, + const char *where); /* === Vectorcall protocol (PEP 590) ============================= */ -/* Call callable using tp_call. Arguments are like _PyObject_Vectorcall() - or _PyObject_FastCallDict() (both forms are supported), +/* Call callable using tp_call. Arguments are like PyObject_Vectorcall() + or PyObject_FastCallDict() (both forms are supported), except that nargs is plainly the number of arguments without flags. */ PyAPI_FUNC(PyObject *) _PyObject_MakeTpCall( + PyThreadState *tstate, PyObject *callable, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords); @@ -78,17 +63,21 @@ PyVectorcall_NARGS(size_t n) } static inline vectorcallfunc -_PyVectorcall_Function(PyObject *callable) +PyVectorcall_Function(PyObject *callable) { - PyTypeObject *tp = Py_TYPE(callable); - Py_ssize_t offset = tp->tp_vectorcall_offset; + PyTypeObject *tp; + Py_ssize_t offset; vectorcallfunc *ptr; - if (!PyType_HasFeature(tp, _Py_TPFLAGS_HAVE_VECTORCALL)) { + + assert(callable != NULL); + tp = Py_TYPE(callable); + if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_VECTORCALL)) { return NULL; } assert(PyCallable_Check(callable)); + offset = tp->tp_vectorcall_offset; assert(offset > 0); - ptr = (vectorcallfunc*)(((char *)callable) + offset); + ptr = (vectorcallfunc *)(((char *)callable) + offset); return *ptr; } @@ -106,31 +95,51 @@ _PyVectorcall_Function(PyObject *callable) of keyword arguments does not change nargsf). kwnames can also be NULL if there are no keyword arguments. - keywords must only contains str strings (no subclass), and all keys must - be unique. + keywords must only contain strings and all keys must be unique. Return the result on success. Raise an exception and return NULL on error. */ static inline PyObject * -_PyObject_Vectorcall(PyObject *callable, PyObject *const *args, - size_t nargsf, PyObject *kwnames) +_PyObject_VectorcallTstate(PyThreadState *tstate, PyObject *callable, + PyObject *const *args, size_t nargsf, + PyObject *kwnames) { - PyObject *res; vectorcallfunc func; + PyObject *res; + assert(kwnames == NULL || PyTuple_Check(kwnames)); assert(args != NULL || PyVectorcall_NARGS(nargsf) == 0); - func = _PyVectorcall_Function(callable); + + func = PyVectorcall_Function(callable); if (func == NULL) { Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); - return _PyObject_MakeTpCall(callable, args, nargs, kwnames); + return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwnames); } res = func(callable, args, nargsf, kwnames); - return _Py_CheckFunctionResult(callable, res, NULL); + return _Py_CheckFunctionResult(tstate, callable, res, NULL); } -/* Same as _PyObject_Vectorcall except that keyword arguments are passed as +static inline PyObject * +PyObject_Vectorcall(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + PyThreadState *tstate = PyThreadState_GET(); + return _PyObject_VectorcallTstate(tstate, callable, + args, nargsf, kwnames); +} + +// Backwards compatibility aliases for API that was provisional in Python 3.8 +#define _PyObject_Vectorcall PyObject_Vectorcall +#define _PyObject_VectorcallMethod PyObject_VectorcallMethod +#define _PyObject_FastCallDict PyObject_VectorcallDict +#define _PyVectorcall_Function PyVectorcall_Function +#define _PyObject_CallOneArg PyObject_CallOneArg +#define _PyObject_CallMethodNoArgs PyObject_CallMethodNoArgs +#define _PyObject_CallMethodOneArg PyObject_CallMethodOneArg + +/* Same as PyObject_Vectorcall except that keyword arguments are passed as dict, which may be NULL if there are no keyword arguments. */ -PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( +PyAPI_FUNC(PyObject *) PyObject_VectorcallDict( PyObject *callable, PyObject *const *args, size_t nargsf, @@ -140,30 +149,65 @@ PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( "tuple" and keyword arguments "dict". "dict" may also be NULL */ PyAPI_FUNC(PyObject *) PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict); -/* Same as _PyObject_Vectorcall except without keyword arguments */ +static inline PyObject * +_PyObject_FastCallTstate(PyThreadState *tstate, PyObject *func, PyObject *const *args, Py_ssize_t nargs) +{ + return _PyObject_VectorcallTstate(tstate, func, args, (size_t)nargs, NULL); +} + +/* Same as PyObject_Vectorcall except without keyword arguments */ static inline PyObject * _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) { - return _PyObject_Vectorcall(func, args, (size_t)nargs, NULL); + PyThreadState *tstate = PyThreadState_GET(); + return _PyObject_FastCallTstate(tstate, func, args, nargs); } -/* Call a callable without any arguments */ +/* Call a callable without any arguments + Private static inline function variant of public function + PyObject_CallNoArgs(). */ static inline PyObject * _PyObject_CallNoArg(PyObject *func) { - return _PyObject_Vectorcall(func, NULL, 0, NULL); + PyThreadState *tstate = PyThreadState_GET(); + return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); } -PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( - PyObject *callable, - PyObject *obj, - PyObject *args, - PyObject *kwargs); +static inline PyObject * +PyObject_CallOneArg(PyObject *func, PyObject *arg) +{ + PyObject *_args[2]; + PyObject **args; + PyThreadState *tstate; + size_t nargsf; + + assert(arg != NULL); + args = _args + 1; // For PY_VECTORCALL_ARGUMENTS_OFFSET + args[0] = arg; + tstate = PyThreadState_GET(); + nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET; + return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL); +} -PyAPI_FUNC(PyObject *) _PyObject_FastCall_Prepend( - PyObject *callable, - PyObject *obj, - PyObject *const *args, - Py_ssize_t nargs); +PyAPI_FUNC(PyObject *) PyObject_VectorcallMethod( + PyObject *name, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + +static inline PyObject * +PyObject_CallMethodNoArgs(PyObject *self, PyObject *name) +{ + return PyObject_VectorcallMethod(name, &self, + 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); +} + +static inline PyObject * +PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg) +{ + PyObject *args[2] = {self, arg}; + + assert(arg != NULL); + return PyObject_VectorcallMethod(name, args, + 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); +} /* Like PyObject_CallMethod(), but expect a _Py_Identifier* as the method name. */ @@ -181,6 +225,35 @@ PyAPI_FUNC(PyObject *) _PyObject_CallMethodIdObjArgs( struct _Py_Identifier *name, ...); +static inline PyObject * +_PyObject_VectorcallMethodId( + _Py_Identifier *name, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ + if (!oname) { + return NULL; + } + return PyObject_VectorcallMethod(oname, args, nargsf, kwnames); +} + +static inline PyObject * +_PyObject_CallMethodIdNoArgs(PyObject *self, _Py_Identifier *name) +{ + return _PyObject_VectorcallMethodId(name, &self, + 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); +} + +static inline PyObject * +_PyObject_CallMethodIdOneArg(PyObject *self, _Py_Identifier *name, PyObject *arg) +{ + PyObject *args[2] = {self, arg}; + + assert(arg != NULL); + return _PyObject_VectorcallMethodId(name, args, + 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); +} + PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o); /* Guess the size of object 'o' using len(o) or o.__length_hint__(). @@ -191,9 +264,7 @@ PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t); /* === New Buffer API ============================================ */ /* Return 1 if the getbuffer function is available, otherwise return 0. */ -#define PyObject_CheckBuffer(obj) \ - (((obj)->ob_type->tp_as_buffer != NULL) && \ - ((obj)->ob_type->tp_as_buffer->bf_getbuffer != NULL)) +PyAPI_FUNC(int) PyObject_CheckBuffer(PyObject *obj); /* This is a C-API version of the getbuffer function call. It checks to make sure object has the required function pointer and issues the @@ -209,7 +280,7 @@ PyAPI_FUNC(void *) PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices); /* Return the implied itemsize of the data-format area from a struct-style description. */ -PyAPI_FUNC(int) PyBuffer_SizeFromFormat(const char *); +PyAPI_FUNC(Py_ssize_t) PyBuffer_SizeFromFormat(const char *format); /* Implementation in memoryobject.c */ PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, Py_buffer *view, @@ -261,14 +332,8 @@ PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); /* ==== Iterators ================================================ */ #define PyIter_Check(obj) \ - ((obj)->ob_type->tp_iternext != NULL && \ - (obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented) - -/* === Number Protocol ================================================== */ - -#define PyIndex_Check(obj) \ - ((obj)->ob_type->tp_as_number != NULL && \ - (obj)->ob_type->tp_as_number->nb_index != NULL) + (Py_TYPE(obj)->tp_iternext != NULL && \ + Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented) /* === Sequence protocol ================================================ */ diff --git a/Include/cpython/bytearrayobject.h b/Include/cpython/bytearrayobject.h new file mode 100644 index 00000000..569b0cd0 --- /dev/null +++ b/Include/cpython/bytearrayobject.h @@ -0,0 +1,20 @@ +#ifndef Py_CPYTHON_BYTEARRAYOBJECT_H +# error "this header file must not be included directly" +#endif + +/* Object layout */ +typedef struct { + PyObject_VAR_HEAD + Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ + char *ob_bytes; /* Physical backing buffer */ + char *ob_start; /* Logical start inside ob_bytes */ + Py_ssize_t ob_exports; /* How many buffer exports */ +} PyByteArrayObject; + +/* Macros, trading safety for speed */ +#define PyByteArray_AS_STRING(self) \ + (assert(PyByteArray_Check(self)), \ + Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) +#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) + +PyAPI_DATA(char) _PyByteArray_empty_string[]; diff --git a/Include/cpython/bytesobject.h b/Include/cpython/bytesobject.h new file mode 100644 index 00000000..f284c583 --- /dev/null +++ b/Include/cpython/bytesobject.h @@ -0,0 +1,118 @@ +#ifndef Py_CPYTHON_BYTESOBJECT_H +# error "this header file must not be included directly" +#endif + +typedef struct { + PyObject_VAR_HEAD + Py_hash_t ob_shash; + char ob_sval[1]; + + /* Invariants: + * ob_sval contains space for 'ob_size+1' elements. + * ob_sval[ob_size] == 0. + * ob_shash is the hash of the string or -1 if not computed yet. + */ +} PyBytesObject; + +PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t); +PyAPI_FUNC(PyObject*) _PyBytes_FormatEx( + const char *format, + Py_ssize_t format_len, + PyObject *args, + int use_bytearray); +PyAPI_FUNC(PyObject*) _PyBytes_FromHex( + PyObject *string, + int use_bytearray); + +/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */ +PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t, + const char *, const char **); + +/* Macro, trading safety for speed */ +#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \ + (((PyBytesObject *)(op))->ob_sval)) +#define PyBytes_GET_SIZE(op) (assert(PyBytes_Check(op)),Py_SIZE(op)) + +/* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*, + x must be an iterable object. */ +PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x); + + +/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer". + A _PyBytesWriter variable must be declared at the end of variables in a + function to optimize the memory allocation on the stack. */ +typedef struct { + /* bytes, bytearray or NULL (when the small buffer is used) */ + PyObject *buffer; + + /* Number of allocated size. */ + Py_ssize_t allocated; + + /* Minimum number of allocated bytes, + incremented by _PyBytesWriter_Prepare() */ + Py_ssize_t min_size; + + /* If non-zero, use a bytearray instead of a bytes object for buffer. */ + int use_bytearray; + + /* If non-zero, overallocate the buffer (default: 0). + This flag must be zero if use_bytearray is non-zero. */ + int overallocate; + + /* Stack buffer */ + int use_small_buffer; + char small_buffer[512]; +} _PyBytesWriter; + +/* Initialize a bytes writer + + By default, the overallocation is disabled. Set the overallocate attribute + to control the allocation of the buffer. */ +PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer); + +/* Get the buffer content and reset the writer. + Return a bytes object, or a bytearray object if use_bytearray is non-zero. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer, + void *str); + +/* Deallocate memory of a writer (clear its internal buffer). */ +PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer); + +/* Allocate the buffer to write size bytes. + Return the pointer to the beginning of buffer data. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer, + Py_ssize_t size); + +/* Ensure that the buffer is large enough to write *size* bytes. + Add size to the writer minimum size (min_size attribute). + + str is the current pointer inside the buffer. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Resize the buffer to make it larger. + The new buffer may be larger than size bytes because of overallocation. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. + + Note: size must be greater than the number of allocated bytes in the writer. + + This function doesn't use the writer minimum size (min_size attribute). + + See also _PyBytesWriter_Prepare(). + */ +PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Write bytes. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, + void *str, + const void *bytes, + Py_ssize_t size); diff --git a/Include/cpython/ceval.h b/Include/cpython/ceval.h new file mode 100644 index 00000000..e1922a67 --- /dev/null +++ b/Include/cpython/ceval.h @@ -0,0 +1,38 @@ +#ifndef Py_CPYTHON_CEVAL_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); +PyAPI_DATA(int) _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); +PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); +PyAPI_FUNC(int) _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); +PyAPI_FUNC(int) _PyEval_GetCoroutineOriginTrackingDepth(void); +PyAPI_FUNC(int) _PyEval_SetAsyncGenFirstiter(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFirstiter(void); +PyAPI_FUNC(int) _PyEval_SetAsyncGenFinalizer(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFinalizer(void); + +/* Helper to look up a builtin object */ +PyAPI_FUNC(PyObject *) _PyEval_GetBuiltinId(_Py_Identifier *); +/* Look at the current frame's (if any) code's co_flags, and turn on + the corresponding compiler flags in cf->cf_flags. Return 1 if any + flag was set, else return 0. */ +PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); + +PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int exc); + +PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds); +PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void); + +PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); + +PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); + +#ifdef __cplusplus +} +#endif diff --git a/Include/cpython/code.h b/Include/cpython/code.h new file mode 100644 index 00000000..cda28ac6 --- /dev/null +++ b/Include/cpython/code.h @@ -0,0 +1,165 @@ +#ifndef Py_CPYTHON_CODE_H +# error "this header file must not be included directly" +#endif + +typedef uint16_t _Py_CODEUNIT; + +#ifdef WORDS_BIGENDIAN +# define _Py_OPCODE(word) ((word) >> 8) +# define _Py_OPARG(word) ((word) & 255) +#else +# define _Py_OPCODE(word) ((word) & 255) +# define _Py_OPARG(word) ((word) >> 8) +#endif + +typedef struct _PyOpcache _PyOpcache; + +/* Bytecode object */ +struct PyCodeObject { + PyObject_HEAD + int co_argcount; /* #arguments, except *args */ + int co_posonlyargcount; /* #positional only arguments */ + int co_kwonlyargcount; /* #keyword only arguments */ + int co_nlocals; /* #local variables */ + int co_stacksize; /* #entries needed for evaluation stack */ + int co_flags; /* CO_..., see below */ + int co_firstlineno; /* first source line number */ + PyObject *co_code; /* instruction opcodes */ + PyObject *co_consts; /* list (constants used) */ + PyObject *co_names; /* list of strings (names used) */ + PyObject *co_varnames; /* tuple of strings (local variable names) */ + PyObject *co_freevars; /* tuple of strings (free variable names) */ + PyObject *co_cellvars; /* tuple of strings (cell variable names) */ + /* The rest aren't used in either hash or comparisons, except for co_name, + used in both. This is done to preserve the name and line number + for tracebacks and debuggers; otherwise, constant de-duplication + would collapse identical functions/lambdas defined on different lines. + */ + Py_ssize_t *co_cell2arg; /* Maps cell vars which are arguments. */ + PyObject *co_filename; /* unicode (where it was loaded from) */ + PyObject *co_name; /* unicode (name, for reference) */ + PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See + Objects/lnotab_notes.txt for details. */ + void *co_zombieframe; /* for optimization only (see frameobject.c) */ + PyObject *co_weakreflist; /* to support weakrefs to code objects */ + /* Scratch space for extra data relating to the code object. + Type is a void* to keep the format private in codeobject.c to force + people to go through the proper APIs. */ + void *co_extra; + + /* Per opcodes just-in-time cache + * + * To reduce cache size, we use indirect mapping from opcode index to + * cache object: + * cache = co_opcache[co_opcache_map[next_instr - first_instr] - 1] + */ + + // co_opcache_map is indexed by (next_instr - first_instr). + // * 0 means there is no cache for this opcode. + // * n > 0 means there is cache in co_opcache[n-1]. + unsigned char *co_opcache_map; + _PyOpcache *co_opcache; + int co_opcache_flag; // used to determine when create a cache. + unsigned char co_opcache_size; // length of co_opcache. +}; + +/* Masks for co_flags above */ +#define CO_OPTIMIZED 0x0001 +#define CO_NEWLOCALS 0x0002 +#define CO_VARARGS 0x0004 +#define CO_VARKEYWORDS 0x0008 +#define CO_NESTED 0x0010 +#define CO_GENERATOR 0x0020 +/* The CO_NOFREE flag is set if there are no free or cell variables. + This information is redundant, but it allows a single flag test + to determine whether there is any extra work to be done when the + call frame it setup. +*/ +#define CO_NOFREE 0x0040 + +/* The CO_COROUTINE flag is set for coroutine functions (defined with + ``async def`` keywords) */ +#define CO_COROUTINE 0x0080 +#define CO_ITERABLE_COROUTINE 0x0100 +#define CO_ASYNC_GENERATOR 0x0200 + +/* bpo-39562: These constant values are changed in Python 3.9 + to prevent collision with compiler flags. CO_FUTURE_ and PyCF_ + constants must be kept unique. PyCF_ constants can use bits from + 0x0100 to 0x10000. CO_FUTURE_ constants use bits starting at 0x20000. */ +#define CO_FUTURE_DIVISION 0x20000 +#define CO_FUTURE_ABSOLUTE_IMPORT 0x40000 /* do absolute imports by default */ +#define CO_FUTURE_WITH_STATEMENT 0x80000 +#define CO_FUTURE_PRINT_FUNCTION 0x100000 +#define CO_FUTURE_UNICODE_LITERALS 0x200000 + +#define CO_FUTURE_BARRY_AS_BDFL 0x400000 +#define CO_FUTURE_GENERATOR_STOP 0x800000 +#define CO_FUTURE_ANNOTATIONS 0x1000000 + +/* This value is found in the co_cell2arg array when the associated cell + variable does not correspond to an argument. */ +#define CO_CELL_NOT_AN_ARG (-1) + +/* This should be defined if a future statement modifies the syntax. + For example, when a keyword is added. +*/ +#define PY_PARSER_REQUIRES_FUTURE_KEYWORD + +#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ + +PyAPI_DATA(PyTypeObject) PyCode_Type; + +#define PyCode_Check(op) Py_IS_TYPE(op, &PyCode_Type) +#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars)) + +/* Public interface */ +PyAPI_FUNC(PyCodeObject *) PyCode_New( + int, int, int, int, int, PyObject *, PyObject *, + PyObject *, PyObject *, PyObject *, PyObject *, + PyObject *, PyObject *, int, PyObject *); + +PyAPI_FUNC(PyCodeObject *) PyCode_NewWithPosOnlyArgs( + int, int, int, int, int, int, PyObject *, PyObject *, + PyObject *, PyObject *, PyObject *, PyObject *, + PyObject *, PyObject *, int, PyObject *); + /* same as struct above */ + +/* Creates a new empty code object with the specified source location. */ +PyAPI_FUNC(PyCodeObject *) +PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); + +/* Return the line number associated with the specified bytecode index + in this code object. If you just need the line number of a frame, + use PyFrame_GetLineNumber() instead. */ +PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); + +/* for internal use only */ +typedef struct _addr_pair { + int ap_lower; + int ap_upper; +} PyAddrPair; + +/* Update *bounds to describe the first and one-past-the-last instructions in the + same line as lasti. Return the number of that line. +*/ +PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co, + int lasti, PyAddrPair *bounds); + +/* Create a comparable key used to compare constants taking in account the + * object type. It is used to make sure types are not coerced (e.g., float and + * complex) _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms + * + * Return (type(obj), obj, ...): a tuple with variable size (at least 2 items) + * depending on the type and the value. The type is the first item to not + * compare bytes and str which can raise a BytesWarning exception. */ +PyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj); + +PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts, + PyObject *names, PyObject *lnotab); + + +PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index, + void **extra); +PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, + void *extra); diff --git a/Include/cpython/dictobject.h b/Include/cpython/dictobject.h index 64c012a0..e33a0d15 100644 --- a/Include/cpython/dictobject.h +++ b/Include/cpython/dictobject.h @@ -62,8 +62,6 @@ PyObject *_PyDict_Pop_KnownHash(PyObject *, PyObject *, Py_hash_t, PyObject *); PyObject *_PyDict_FromKeys(PyObject *, PyObject *, PyObject *); #define _PyDict_HasSplitTable(d) ((d)->ma_values != NULL) -PyAPI_FUNC(int) PyDict_ClearFreeList(void); - /* Like PyDict_Merge, but override can be 0, 1 or 2. If override is 0, the first occurrence of a key wins, if override is 1, the last occurrence of a key wins, if override is 2, a KeyError with conflicting key as diff --git a/Include/cpython/fileutils.h b/Include/cpython/fileutils.h new file mode 100644 index 00000000..e79d03e2 --- /dev/null +++ b/Include/cpython/fileutils.h @@ -0,0 +1,165 @@ +#ifndef Py_CPYTHON_FILEUTILS_H +# error "this header file must not be included directly" +#endif + +typedef enum { + _Py_ERROR_UNKNOWN=0, + _Py_ERROR_STRICT, + _Py_ERROR_SURROGATEESCAPE, + _Py_ERROR_REPLACE, + _Py_ERROR_IGNORE, + _Py_ERROR_BACKSLASHREPLACE, + _Py_ERROR_SURROGATEPASS, + _Py_ERROR_XMLCHARREFREPLACE, + _Py_ERROR_OTHER +} _Py_error_handler; + +PyAPI_FUNC(_Py_error_handler) _Py_GetErrorHandler(const char *errors); + +PyAPI_FUNC(int) _Py_DecodeLocaleEx( + const char *arg, + wchar_t **wstr, + size_t *wlen, + const char **reason, + int current_locale, + _Py_error_handler errors); + +PyAPI_FUNC(int) _Py_EncodeLocaleEx( + const wchar_t *text, + char **str, + size_t *error_pos, + const char **reason, + int current_locale, + _Py_error_handler errors); + + +PyAPI_FUNC(PyObject *) _Py_device_encoding(int); + +#if defined(MS_WINDOWS) || defined(__APPLE__) + /* On Windows, the count parameter of read() is an int (bpo-9015, bpo-9611). + On macOS 10.13, read() and write() with more than INT_MAX bytes + fail with EINVAL (bpo-24658). */ +# define _PY_READ_MAX INT_MAX +# define _PY_WRITE_MAX INT_MAX +#else + /* write() should truncate the input to PY_SSIZE_T_MAX bytes, + but it's safer to do it ourself to have a portable behaviour */ +# define _PY_READ_MAX PY_SSIZE_T_MAX +# define _PY_WRITE_MAX PY_SSIZE_T_MAX +#endif + +#ifdef MS_WINDOWS +struct _Py_stat_struct { + unsigned long st_dev; + uint64_t st_ino; + unsigned short st_mode; + int st_nlink; + int st_uid; + int st_gid; + unsigned long st_rdev; + __int64 st_size; + time_t st_atime; + int st_atime_nsec; + time_t st_mtime; + int st_mtime_nsec; + time_t st_ctime; + int st_ctime_nsec; + unsigned long st_file_attributes; + unsigned long st_reparse_tag; +}; +#else +# define _Py_stat_struct stat +#endif + +PyAPI_FUNC(int) _Py_fstat( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_fstat_noraise( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_stat( + PyObject *path, + struct stat *status); + +PyAPI_FUNC(int) _Py_open( + const char *pathname, + int flags); + +PyAPI_FUNC(int) _Py_open_noraise( + const char *pathname, + int flags); + +PyAPI_FUNC(FILE *) _Py_wfopen( + const wchar_t *path, + const wchar_t *mode); + +PyAPI_FUNC(FILE*) _Py_fopen( + const char *pathname, + const char *mode); + +PyAPI_FUNC(FILE*) _Py_fopen_obj( + PyObject *path, + const char *mode); + +PyAPI_FUNC(Py_ssize_t) _Py_read( + int fd, + void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write( + int fd, + const void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( + int fd, + const void *buf, + size_t count); + +#ifdef HAVE_READLINK +PyAPI_FUNC(int) _Py_wreadlink( + const wchar_t *path, + wchar_t *buf, + /* Number of characters of 'buf' buffer + including the trailing NUL character */ + size_t buflen); +#endif + +#ifdef HAVE_REALPATH +PyAPI_FUNC(wchar_t*) _Py_wrealpath( + const wchar_t *path, + wchar_t *resolved_path, + /* Number of characters of 'resolved_path' buffer + including the trailing NUL character */ + size_t resolved_path_len); +#endif + +#ifndef MS_WINDOWS +PyAPI_FUNC(int) _Py_isabs(const wchar_t *path); +#endif + +PyAPI_FUNC(int) _Py_abspath(const wchar_t *path, wchar_t **abspath_p); + +PyAPI_FUNC(wchar_t*) _Py_wgetcwd( + wchar_t *buf, + /* Number of characters of 'buf' buffer + including the trailing NUL character */ + size_t buflen); + +PyAPI_FUNC(int) _Py_get_inheritable(int fd); + +PyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_dup(int fd); + +#ifndef MS_WINDOWS +PyAPI_FUNC(int) _Py_get_blocking(int fd); + +PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); +#endif /* !MS_WINDOWS */ diff --git a/Include/cpython/frameobject.h b/Include/cpython/frameobject.h new file mode 100644 index 00000000..36a51baa --- /dev/null +++ b/Include/cpython/frameobject.h @@ -0,0 +1,84 @@ +/* Frame object interface */ + +#ifndef Py_CPYTHON_FRAMEOBJECT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int b_type; /* what kind of block this is */ + int b_handler; /* where to jump to find handler */ + int b_level; /* value stack level to pop to */ +} PyTryBlock; + +struct _frame { + PyObject_VAR_HEAD + struct _frame *f_back; /* previous frame, or NULL */ + PyCodeObject *f_code; /* code segment */ + PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ + PyObject *f_globals; /* global symbol table (PyDictObject) */ + PyObject *f_locals; /* local symbol table (any mapping) */ + PyObject **f_valuestack; /* points after the last local */ + /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. + Frame evaluation usually NULLs it, but a frame that yields sets it + to the current stack top. */ + PyObject **f_stacktop; + PyObject *f_trace; /* Trace function */ + char f_trace_lines; /* Emit per-line trace events? */ + char f_trace_opcodes; /* Emit per-opcode trace events? */ + + /* Borrowed reference to a generator, or NULL */ + PyObject *f_gen; + + int f_lasti; /* Last instruction if called */ + /* Call PyFrame_GetLineNumber() instead of reading this field + directly. As of 2.3 f_lineno is only valid when tracing is + active (i.e. when f_trace is set). At other times we use + PyCode_Addr2Line to calculate the line from the current + bytecode index. */ + int f_lineno; /* Current line number */ + int f_iblock; /* index in f_blockstack */ + char f_executing; /* whether the frame is still executing */ + PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ + PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ +}; + + +/* Standard object interface */ + +PyAPI_DATA(PyTypeObject) PyFrame_Type; + +#define PyFrame_Check(op) Py_IS_TYPE(op, &PyFrame_Type) + +PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + +/* only internal use */ +PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + + +/* The rest of the interface is specific for frame objects */ + +/* Block management functions */ + +PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); +PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); + +/* Conversions between "fast locals" and locals in dictionary */ + +PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); + +PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); +PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); + +PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); + +PyAPI_FUNC(PyFrameObject *) PyFrame_GetBack(PyFrameObject *frame); + +#ifdef __cplusplus +} +#endif diff --git a/Include/cpython/import.h b/Include/cpython/import.h new file mode 100644 index 00000000..c1b47121 --- /dev/null +++ b/Include/cpython/import.h @@ -0,0 +1,50 @@ +#ifndef Py_CPYTHON_IMPORT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +PyMODINIT_FUNC PyInit__imp(void); + +PyAPI_FUNC(int) _PyImport_IsInitialized(PyInterpreterState *); + +PyAPI_FUNC(PyObject *) _PyImport_GetModuleId(struct _Py_Identifier *name); +PyAPI_FUNC(int) _PyImport_SetModule(PyObject *name, PyObject *module); +PyAPI_FUNC(int) _PyImport_SetModuleString(const char *name, PyObject* module); + +PyAPI_FUNC(void) _PyImport_AcquireLock(void); +PyAPI_FUNC(int) _PyImport_ReleaseLock(void); + +PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObject(PyObject *, PyObject *); + +PyAPI_FUNC(int) _PyImport_FixupBuiltin( + PyObject *mod, + const char *name, /* UTF-8 encoded string */ + PyObject *modules + ); +PyAPI_FUNC(int) _PyImport_FixupExtensionObject(PyObject*, PyObject *, + PyObject *, PyObject *); + +struct _inittab { + const char *name; /* ASCII encoded string */ + PyObject* (*initfunc)(void); +}; +PyAPI_DATA(struct _inittab *) PyImport_Inittab; +PyAPI_FUNC(int) PyImport_ExtendInittab(struct _inittab *newtab); + +struct _frozen { + const char *name; /* ASCII encoded string */ + const unsigned char *code; + int size; +}; + +/* Embedding apps may change this pointer to point to their favorite + collection of frozen modules: */ + +PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules; + +#ifdef __cplusplus +} +#endif diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 4b5ceafe..0a256d4b 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -113,7 +113,11 @@ typedef struct { "POSIX", otherwise it is set to 0. Inherit Py_UTF8Mode value value. */ int utf8_mode; - int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */ + /* If non-zero, enable the Python Development Mode. + + Set to 1 by the -X dev command line option. Set by the PYTHONDEVMODE + environment variable. */ + int dev_mode; /* Memory allocator: PYTHONMALLOC env var. See PyMemAllocatorName for valid values. */ @@ -131,7 +135,7 @@ typedef struct { int isolated; /* Isolated mode? see PyPreConfig.isolated */ int use_environment; /* Use environment variables? see PyPreConfig.use_environment */ - int dev_mode; /* Development mode? See PyPreConfig.dev_mode */ + int dev_mode; /* Python Development Mode? See PyPreConfig.dev_mode */ /* Install signal handlers? Yes by default. */ int install_signal_handlers; @@ -143,13 +147,16 @@ typedef struct { Set to 1 by -X faulthandler and PYTHONFAULTHANDLER. -1 means unset. */ int faulthandler; + /* Enable PEG parser? + 1 by default, set to 0 by -X oldparser and PYTHONOLDPARSER */ + int _use_peg_parser; + /* Enable tracemalloc? Set by -X tracemalloc=N and PYTHONTRACEMALLOC. -1 means unset */ int tracemalloc; int import_time; /* PYTHONPROFILEIMPORTTIME, -X importtime */ int show_ref_count; /* -X showrefcount */ - int show_alloc_count; /* -X showalloccount */ int dump_refs; /* PYTHONDUMPREFS */ int malloc_stats; /* PYTHONMALLOCSTATS */ @@ -381,6 +388,7 @@ typedef struct { wchar_t *base_prefix; /* sys.base_prefix */ wchar_t *exec_prefix; /* sys.exec_prefix */ wchar_t *base_exec_prefix; /* sys.base_exec_prefix */ + wchar_t *platlibdir; /* sys.platlibdir */ /* --- Parameter only used by Py_Main() ---------- */ @@ -402,6 +410,18 @@ typedef struct { /* If equal to 0, stop Python initialization before the "main" phase */ int _init_main; + + /* If non-zero, disallow threads, subprocesses, and fork. + Default: 0. */ + int _isolated_interpreter; + + /* Original command line arguments. If _orig_argv is empty and _argv is + not equal to [''], PyConfig_Read() copies the configuration 'argv' list + into '_orig_argv' list before modifying 'argv' list (if parse_argv + is non-zero). + + _PyConfig_Write() initializes Py_GetArgcArgv() to this list. */ + PyWideStringList _orig_argv; } PyConfig; PyAPI_FUNC(void) PyConfig_InitPythonConfig(PyConfig *config); @@ -427,6 +447,14 @@ PyAPI_FUNC(PyStatus) PyConfig_SetWideStringList(PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items); + +/* --- Helper functions --------------------------------------- */ + +/* Get the original command line arguments, before Python modified them. + + See also PyConfig._orig_argv. */ +PyAPI_FUNC(void) Py_GetArgcArgv(int *argc, wchar_t ***argv); + #ifdef __cplusplus } #endif diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h new file mode 100644 index 00000000..74fe3301 --- /dev/null +++ b/Include/cpython/listobject.h @@ -0,0 +1,43 @@ +#ifndef Py_CPYTHON_LISTOBJECT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_VAR_HEAD + /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ + PyObject **ob_item; + + /* ob_item contains space for 'allocated' elements. The number + * currently in use is ob_size. + * Invariants: + * 0 <= ob_size <= allocated + * len(list) == ob_size + * ob_item == NULL implies ob_size == allocated == 0 + * list.sort() temporarily sets allocated to -1 to detect mutations. + * + * Items must normally not be NULL, except during construction when + * the list is not yet visible outside the function that builds it. + */ + Py_ssize_t allocated; +} PyListObject; + +PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); +PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); + +/* Macro, trading safety for speed */ + +/* Cast argument to PyTupleObject* type. */ +#define _PyList_CAST(op) (assert(PyList_Check(op)), (PyListObject *)(op)) + +#define PyList_GET_ITEM(op, i) (_PyList_CAST(op)->ob_item[i]) +#define PyList_SET_ITEM(op, i, v) (_PyList_CAST(op)->ob_item[i] = (v)) +#define PyList_GET_SIZE(op) Py_SIZE(_PyList_CAST(op)) +#define _PyList_ITEMS(op) (_PyList_CAST(op)->ob_item) + +#ifdef __cplusplus +} +#endif diff --git a/Include/cpython/methodobject.h b/Include/cpython/methodobject.h new file mode 100644 index 00000000..7ecbfe3b --- /dev/null +++ b/Include/cpython/methodobject.h @@ -0,0 +1,35 @@ +#ifndef Py_CPYTHON_METHODOBJECT_H +# error "this header file must not be included directly" +#endif + +PyAPI_DATA(PyTypeObject) PyCMethod_Type; + +#define PyCMethod_CheckExact(op) Py_IS_TYPE(op, &PyCMethod_Type) +#define PyCMethod_Check(op) PyObject_TypeCheck(op, &PyCMethod_Type) + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyCFunction_GET_FUNCTION(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_meth) +#define PyCFunction_GET_SELF(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_STATIC ? \ + NULL : ((PyCFunctionObject *)func) -> m_self) +#define PyCFunction_GET_FLAGS(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags) +#define PyCFunction_GET_CLASS(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_METHOD ? \ + ((PyCMethodObject *)func) -> mm_class : NULL) + +typedef struct { + PyObject_HEAD + PyMethodDef *m_ml; /* Description of the C function to call */ + PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL */ + PyObject *m_module; /* The __module__ attribute, can be anything */ + PyObject *m_weakreflist; /* List of weak references */ + vectorcallfunc vectorcall; +} PyCFunctionObject; + +typedef struct { + PyCFunctionObject func; + PyTypeObject *mm_class; /* Class that defines this method */ +} PyCMethodObject; diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 5a0ac4af..444f832f 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -6,6 +6,22 @@ extern "C" { #endif +PyAPI_FUNC(void) _Py_NewReference(PyObject *op); + +#ifdef Py_TRACE_REFS +/* Py_TRACE_REFS is such major surgery that we call external routines. */ +PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); +#endif + +/* Update the Python traceback of an object. This function must be called + when a memory block is reused from a free list. */ +PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); + +#ifdef Py_REF_DEBUG +PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); +#endif + + /********************* String Literals ****************************************/ /* This structure helps managing static strings. The basic usage goes like this: Instead of doing @@ -20,7 +36,7 @@ extern "C" { PyId_foo is a static variable, either on block level or file level. On first usage, the string "foo" is interned, and the structures are linked. On interpreter - shutdown, all strings are released (through _PyUnicode_ClearStaticStrings). + shutdown, all strings are released. Alternatively, _Py_static_string allows choosing the variable name. _PyUnicode_FromId returns a borrowed reference to the interned string. @@ -174,7 +190,7 @@ typedef struct { * backwards-compatibility */ typedef Py_ssize_t printfunc; -typedef struct _typeobject { +struct _typeobject { PyObject_VAR_HEAD const char *tp_name; /* For printing, in format "." */ Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ @@ -255,19 +271,7 @@ typedef struct _typeobject { destructor tp_finalize; vectorcallfunc tp_vectorcall; - - /* bpo-37250: kept for backwards compatibility in CPython 3.8 only */ - Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int); - -#ifdef COUNT_ALLOCS - /* these must be last and never explicitly initialized */ - Py_ssize_t tp_allocs; - Py_ssize_t tp_frees; - Py_ssize_t tp_maxalloc; - struct _typeobject *tp_prev; - struct _typeobject *tp_next; -#endif -} PyTypeObject; +}; /* The *real* layout of a type object when allocated on the heap */ typedef struct _heaptypeobject { @@ -285,6 +289,7 @@ typedef struct _heaptypeobject { PyBufferProcs as_buffer; PyObject *ht_name, *ht_slots, *ht_qualname; struct _dictkeysobject *ht_cached_keys; + PyObject *ht_module; /* here are optional user slots, followed by the members. */ } PyHeapTypeObject; @@ -321,6 +326,9 @@ PyAPI_FUNC(int) _PyObject_HasAttrId(PyObject *, struct _Py_Identifier *); */ PyAPI_FUNC(int) _PyObject_LookupAttr(PyObject *, PyObject *, PyObject **); PyAPI_FUNC(int) _PyObject_LookupAttrId(PyObject *, struct _Py_Identifier *, PyObject **); + +PyAPI_FUNC(int) _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *); PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *); PyAPI_FUNC(void) PyObject_CallFinalizer(PyObject *); @@ -334,20 +342,7 @@ PyAPI_FUNC(int) _PyObject_GenericSetAttrWithDict(PyObject *, PyObject *, PyObject *, PyObject *); -#define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0) - -static inline void _Py_Dealloc_inline(PyObject *op) -{ - destructor dealloc = Py_TYPE(op)->tp_dealloc; -#ifdef Py_TRACE_REFS - _Py_ForgetReference(op); -#else - _Py_INC_TPFREES(op); -#endif - (*dealloc)(op); -} -#define _Py_Dealloc(op) _Py_Dealloc_inline(op) - +PyAPI_FUNC(PyObject *) _PyObject_FunctionStr(PyObject *); /* Safely decref `op` and set `op` to `op2`. * @@ -391,11 +386,6 @@ PyAPI_DATA(PyTypeObject) _PyNotImplemented_Type; */ PyAPI_DATA(int) _Py_SwappedOp[]; -/* This is the old private API, invoked by the macros before 3.2.4. - Kept for binary compatibility of extensions using the stable ABI. */ -PyAPI_FUNC(void) _PyTrash_deposit_object(PyObject*); -PyAPI_FUNC(void) _PyTrash_destroy_chain(void); - PyAPI_FUNC(void) _PyDebugAllocatorStats(FILE *out, const char *block_name, int num_blocks, size_t sizeof_block); @@ -442,7 +432,7 @@ _PyObject_DebugTypeStats(FILE *out); NDEBUG against a Python built with NDEBUG defined. msg, expr and function can be NULL. */ -PyAPI_FUNC(void) _PyObject_AssertFailed( +PyAPI_FUNC(void) _Py_NO_RETURN _PyObject_AssertFailed( PyObject *obj, const char *expr, const char *msg, @@ -465,6 +455,100 @@ PyAPI_FUNC(int) _PyObject_CheckConsistency( PyObject *op, int check_content); + +/* Trashcan mechanism, thanks to Christian Tismer. + +When deallocating a container object, it's possible to trigger an unbounded +chain of deallocations, as each Py_DECREF in turn drops the refcount on "the +next" object in the chain to 0. This can easily lead to stack overflows, +especially in threads (which typically have less stack space to work with). + +A container object can avoid this by bracketing the body of its tp_dealloc +function with a pair of macros: + +static void +mytype_dealloc(mytype *p) +{ + ... declarations go here ... + + PyObject_GC_UnTrack(p); // must untrack first + Py_TRASHCAN_BEGIN(p, mytype_dealloc) + ... The body of the deallocator goes here, including all calls ... + ... to Py_DECREF on contained objects. ... + Py_TRASHCAN_END // there should be no code after this +} + +CAUTION: Never return from the middle of the body! If the body needs to +"get out early", put a label immediately before the Py_TRASHCAN_END +call, and goto it. Else the call-depth counter (see below) will stay +above 0 forever, and the trashcan will never get emptied. + +How it works: The BEGIN macro increments a call-depth counter. So long +as this counter is small, the body of the deallocator is run directly without +further ado. But if the counter gets large, it instead adds p to a list of +objects to be deallocated later, skips the body of the deallocator, and +resumes execution after the END macro. The tp_dealloc routine then returns +without deallocating anything (and so unbounded call-stack depth is avoided). + +When the call stack finishes unwinding again, code generated by the END macro +notices this, and calls another routine to deallocate all the objects that +may have been added to the list of deferred deallocations. In effect, a +chain of N deallocations is broken into (N-1)/(PyTrash_UNWIND_LEVEL-1) pieces, +with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. + +Since the tp_dealloc of a subclass typically calls the tp_dealloc of the base +class, we need to ensure that the trashcan is only triggered on the tp_dealloc +of the actual class being deallocated. Otherwise we might end up with a +partially-deallocated object. To check this, the tp_dealloc function must be +passed as second argument to Py_TRASHCAN_BEGIN(). +*/ + +/* This is the old private API, invoked by the macros before 3.2.4. + Kept for binary compatibility of extensions using the stable ABI. */ +PyAPI_FUNC(void) _PyTrash_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_destroy_chain(void); + +/* This is the old private API, invoked by the macros before 3.9. + Kept for binary compatibility of extensions using the stable ABI. */ +PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); + +/* Forward declarations for PyThreadState */ +struct _ts; + +/* Python 3.9 private API, invoked by the macros below. */ +PyAPI_FUNC(int) _PyTrash_begin(struct _ts *tstate, PyObject *op); +PyAPI_FUNC(void) _PyTrash_end(struct _ts *tstate); + +#define PyTrash_UNWIND_LEVEL 50 + +#define Py_TRASHCAN_BEGIN_CONDITION(op, cond) \ + do { \ + PyThreadState *_tstate = NULL; \ + /* If "cond" is false, then _tstate remains NULL and the deallocator \ + * is run normally without involving the trashcan */ \ + if (cond) { \ + _tstate = PyThreadState_GET(); \ + if (_PyTrash_begin(_tstate, _PyObject_CAST(op))) { \ + break; \ + } \ + } + /* The body of the deallocator is here. */ +#define Py_TRASHCAN_END \ + if (_tstate) { \ + _PyTrash_end(_tstate); \ + } \ + } while (0); + +#define Py_TRASHCAN_BEGIN(op, dealloc) \ + Py_TRASHCAN_BEGIN_CONDITION(op, \ + Py_TYPE(op)->tp_dealloc == (destructor)(dealloc)) + +/* For backwards compatibility, these macros enable the trashcan + * unconditionally */ +#define Py_TRASHCAN_SAFE_BEGIN(op) Py_TRASHCAN_BEGIN_CONDITION(op, 1) +#define Py_TRASHCAN_SAFE_END(op) Py_TRASHCAN_END + #ifdef __cplusplus } #endif diff --git a/Include/cpython/objimpl.h b/Include/cpython/objimpl.h index f121922b..b835936d 100644 --- a/Include/cpython/objimpl.h +++ b/Include/cpython/objimpl.h @@ -6,6 +6,89 @@ extern "C" { #endif +#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) + +/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a + vrbl-size object with nitems items, exclusive of gc overhead (if any). The + value is rounded up to the closest multiple of sizeof(void *), in order to + ensure that pointer fields at the end of the object are correctly aligned + for the platform (this is of special importance for subclasses of, e.g., + str or int, so that pointers can be stored after the embedded data). + + Note that there's no memory wastage in doing this, as malloc has to + return (at worst) pointer-aligned memory anyway. +*/ +#if ((SIZEOF_VOID_P - 1) & SIZEOF_VOID_P) != 0 +# error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2" +#endif + +#define _PyObject_VAR_SIZE(typeobj, nitems) \ + _Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \ + (nitems)*(typeobj)->tp_itemsize, \ + SIZEOF_VOID_P) + + +/* This example code implements an object constructor with a custom + allocator, where PyObject_New is inlined, and shows the important + distinction between two steps (at least): + 1) the actual allocation of the object storage; + 2) the initialization of the Python specific fields + in this storage with PyObject_{Init, InitVar}. + + PyObject * + YourObject_New(...) + { + PyObject *op; + + op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); + if (op == NULL) + return PyErr_NoMemory(); + + PyObject_Init(op, &YourTypeStruct); + + op->ob_field = value; + ... + return op; + } + + Note that in C++, the use of the new operator usually implies that + the 1st step is performed automatically for you, so in a C++ class + constructor you would start directly with PyObject_Init/InitVar. */ + + +/* Inline functions trading binary compatibility for speed: + PyObject_INIT() is the fast version of PyObject_Init(), and + PyObject_INIT_VAR() is the fast version of PyObject_InitVar(). + + These inline functions must not be called with op=NULL. */ +static inline PyObject* +_PyObject_INIT(PyObject *op, PyTypeObject *typeobj) +{ + assert(op != NULL); + Py_SET_TYPE(op, typeobj); + if (PyType_GetFlags(typeobj) & Py_TPFLAGS_HEAPTYPE) { + Py_INCREF(typeobj); + } + _Py_NewReference(op); + return op; +} + +#define PyObject_INIT(op, typeobj) \ + _PyObject_INIT(_PyObject_CAST(op), (typeobj)) + +static inline PyVarObject* +_PyObject_INIT_VAR(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size) +{ + assert(op != NULL); + Py_SET_SIZE(op, size); + PyObject_INIT((PyObject *)op, typeobj); + return op; +} + +#define PyObject_INIT_VAR(op, typeobj, size) \ + _PyObject_INIT_VAR(_PyVarObject_CAST(op), (typeobj), (size)) + + /* This function returns the number of allocated memory blocks, regardless of size */ PyAPI_FUNC(Py_ssize_t) _Py_GetAllocatedBlocks(void); @@ -37,66 +120,16 @@ PyAPI_FUNC(Py_ssize_t) _PyGC_CollectNoFail(void); PyAPI_FUNC(Py_ssize_t) _PyGC_CollectIfEnabled(void); -/* Test if an object has a GC head */ -#define PyObject_IS_GC(o) \ - (PyType_IS_GC(Py_TYPE(o)) \ - && (Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o))) +/* Test if an object implements the garbage collector protocol */ +PyAPI_FUNC(int) PyObject_IS_GC(PyObject *obj); -/* GC information is stored BEFORE the object structure. */ -typedef struct { - // Pointer to next object in the list. - // 0 means the object is not tracked - uintptr_t _gc_next; - - // Pointer to previous object in the list. - // Lowest two bits are used for flags documented later. - uintptr_t _gc_prev; -} PyGC_Head; - -#define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) - -/* True if the object is currently tracked by the GC. */ -#define _PyObject_GC_IS_TRACKED(o) (_Py_AS_GC(o)->_gc_next != 0) - -/* True if the object may be tracked by the GC in the future, or already is. - This can be useful to implement some optimizations. */ -#define _PyObject_GC_MAY_BE_TRACKED(obj) \ - (PyObject_IS_GC(obj) && \ - (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) - - -/* Bit flags for _gc_prev */ -/* Bit 0 is set when tp_finalize is called */ -#define _PyGC_PREV_MASK_FINALIZED (1) -/* Bit 1 is set when the object is in generation which is GCed currently. */ -#define _PyGC_PREV_MASK_COLLECTING (2) -/* The (N-2) most significant bits contain the real address. */ -#define _PyGC_PREV_SHIFT (2) -#define _PyGC_PREV_MASK (((uintptr_t) -1) << _PyGC_PREV_SHIFT) - -// Lowest bit of _gc_next is used for flags only in GC. -// But it is always 0 for normal code. -#define _PyGCHead_NEXT(g) ((PyGC_Head*)(g)->_gc_next) -#define _PyGCHead_SET_NEXT(g, p) ((g)->_gc_next = (uintptr_t)(p)) - -// Lowest two bits of _gc_prev is used for _PyGC_PREV_MASK_* flags. -#define _PyGCHead_PREV(g) ((PyGC_Head*)((g)->_gc_prev & _PyGC_PREV_MASK)) -#define _PyGCHead_SET_PREV(g, p) do { \ - assert(((uintptr_t)p & ~_PyGC_PREV_MASK) == 0); \ - (g)->_gc_prev = ((g)->_gc_prev & ~_PyGC_PREV_MASK) \ - | ((uintptr_t)(p)); \ - } while (0) - -#define _PyGCHead_FINALIZED(g) \ - (((g)->_gc_prev & _PyGC_PREV_MASK_FINALIZED) != 0) -#define _PyGCHead_SET_FINALIZED(g) \ - ((g)->_gc_prev |= _PyGC_PREV_MASK_FINALIZED) - -#define _PyGC_FINALIZED(o) \ - _PyGCHead_FINALIZED(_Py_AS_GC(o)) -#define _PyGC_SET_FINALIZED(o) \ - _PyGCHead_SET_FINALIZED(_Py_AS_GC(o)) +/* Code built with Py_BUILD_CORE must include pycore_gc.h instead which + defines a different _PyGC_FINALIZED() macro. */ +#ifndef Py_BUILD_CORE + // Kept for backward compatibility with Python 3.8 +# define _PyGC_FINALIZED(o) PyObject_GC_IsFinalized(o) +#endif PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t size); PyAPI_FUNC(PyObject *) _PyObject_GC_Calloc(size_t size); @@ -105,8 +138,7 @@ PyAPI_FUNC(PyObject *) _PyObject_GC_Calloc(size_t size); /* Test if a type supports weak references */ #define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0) -#define PyObject_GET_WEAKREFS_LISTPTR(o) \ - ((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset)) +PyAPI_FUNC(PyObject **) PyObject_GET_WEAKREFS_LISTPTR(PyObject *op); #ifdef __cplusplus } diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index 418f48a7..9c87b539 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -75,7 +75,8 @@ typedef PyOSErrorObject PyWindowsErrorObject; /* Error handling definitions */ PyAPI_FUNC(void) _PyErr_SetKeyError(PyObject *); -_PyErr_StackItem *_PyErr_GetTopmostException(PyThreadState *tstate); +PyAPI_FUNC(_PyErr_StackItem*) _PyErr_GetTopmostException(PyThreadState *tstate); +PyAPI_FUNC(void) _PyErr_GetExcInfo(PyThreadState *, PyObject **, PyObject **, PyObject **); /* Context manipulation (PEP 3134) */ @@ -183,6 +184,17 @@ PyAPI_FUNC(void) _PyErr_WriteUnraisableMsg( const char *err_msg, PyObject *obj); +PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalErrorFunc( + const char *func, + const char *message); + +PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalErrorFormat( + const char *func, + const char *format, + ...); + +#define Py_FatalError(message) _Py_FatalErrorFunc(__func__, message) + #ifdef __cplusplus } #endif diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 2f3a0dbd..eb523b82 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -32,14 +32,6 @@ PyAPI_FUNC(int) _Py_IsCoreInitialized(void); PyAPI_FUNC(PyStatus) Py_InitializeFromConfig( const PyConfig *config); -PyAPI_FUNC(PyStatus) _Py_InitializeFromArgs( - const PyConfig *config, - Py_ssize_t argc, - char * const *argv); -PyAPI_FUNC(PyStatus) _Py_InitializeFromWideArgs( - const PyConfig *config, - Py_ssize_t argc, - wchar_t * const *argv); PyAPI_FUNC(PyStatus) _Py_InitializeMain(void); PyAPI_FUNC(int) Py_RunMain(void); @@ -73,6 +65,8 @@ PyAPI_FUNC(int) _Py_CoerceLegacyLocale(int warn); PyAPI_FUNC(int) _Py_LegacyLocaleDetected(int warn); PyAPI_FUNC(char *) _Py_SetLocaleFromEnv(int category); +PyAPI_FUNC(PyThreadState *) _Py_NewInterpreter(int isolated_subinterpreter); + #ifdef __cplusplus } #endif diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index e22b0539..f292da1d 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -16,7 +16,7 @@ PyAPI_FUNC(PyObject *) _PyInterpreterState_GetMainModule(PyInterpreterState *); /* State unique per thread */ /* Py_tracefunc return -1 when raising an exception, or 0 for success. */ -typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *); +typedef int (*Py_tracefunc)(PyObject *, PyFrameObject *, int, PyObject *); /* The following values are used for 'what' for tracefunc functions * @@ -56,7 +56,7 @@ struct _ts { PyInterpreterState *interp; /* Borrowed reference to the current frame (it can be NULL) */ - struct _frame *frame; + PyFrameObject *frame; int recursion_depth; char overflowed; /* The stack has overflowed. Allow 50 more calls to handle the runtime error. */ @@ -140,22 +140,17 @@ struct _ts { }; -/* Get the current interpreter state. +// Alias for backward compatibility with Python 3.8 +#define _PyInterpreterState_Get PyInterpreterState_Get - Issue a fatal error if there no current Python thread state or no current - interpreter. It cannot return NULL. - - The caller must hold the GIL.*/ -PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_Get(void); - -PyAPI_FUNC(int) _PyState_AddModule(PyObject*, struct PyModuleDef*); -PyAPI_FUNC(void) _PyState_ClearModules(void); PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *); /* Similar to PyThreadState_Get(), but don't issue a fatal error * if it is NULL. */ PyAPI_FUNC(PyThreadState *) _PyThreadState_UncheckedGet(void); +PyAPI_FUNC(PyObject *) _PyThreadState_GetDict(PyThreadState *tstate); + /* PyGILState */ /* Helper/diagnostic function - return 1 if the current thread @@ -170,7 +165,7 @@ PyAPI_FUNC(int) PyGILState_Check(void); This function doesn't check for error. Return NULL before _PyGILState_Init() is called and after _PyGILState_Fini() is called. - See also _PyInterpreterState_Get() and _PyInterpreterState_GET_UNSAFE(). */ + See also _PyInterpreterState_Get() and _PyInterpreterState_GET(). */ PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void); /* The implementation of sys._current_frames() Returns a dict mapping @@ -185,8 +180,24 @@ PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void); PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *); PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *); PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *); +PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); + +/* Frame evaluation API */ + +typedef PyObject* (*_PyFrameEvalFunction)(PyThreadState *tstate, PyFrameObject *, int); + +PyAPI_FUNC(_PyFrameEvalFunction) _PyInterpreterState_GetEvalFrameFunc( + PyInterpreterState *interp); +PyAPI_FUNC(void) _PyInterpreterState_SetEvalFrameFunc( + PyInterpreterState *interp, + _PyFrameEvalFunction eval_frame); + +PyAPI_FUNC(const PyConfig*) _PyInterpreterState_GetConfig(PyInterpreterState *interp); + +// Get the configuration of the currrent interpreter. +// The caller must hold the GIL. +PyAPI_FUNC(const PyConfig*) _Py_GetConfig(void); -typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); /* cross-interpreter data */ diff --git a/Include/cpython/sysmodule.h b/Include/cpython/sysmodule.h index 72d8ffed..1802b5b3 100644 --- a/Include/cpython/sysmodule.h +++ b/Include/cpython/sysmodule.h @@ -13,7 +13,10 @@ 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_Audit( + const char *event, + const char *argFormat, + ...); PyAPI_FUNC(int) PySys_AddAuditHook(Py_AuditHookFunction, void*); #ifdef __cplusplus diff --git a/Include/cpython/traceback.h b/Include/cpython/traceback.h index 746097da..837470c3 100644 --- a/Include/cpython/traceback.h +++ b/Include/cpython/traceback.h @@ -9,7 +9,7 @@ extern "C" { typedef struct _traceback { PyObject_HEAD struct _traceback *tb_next; - struct _frame *tb_frame; + PyFrameObject *tb_frame; int tb_lasti; int tb_lineno; } PyTracebackObject; diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 54a13e32..1fc732ab 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -50,13 +50,18 @@ extern "C" { Py_UNICODE_ISDIGIT(ch) || \ Py_UNICODE_ISNUMERIC(ch)) -#define Py_UNICODE_COPY(target, source, length) \ - memcpy((target), (source), (length)*sizeof(Py_UNICODE)) +Py_DEPRECATED(3.3) static inline void +Py_UNICODE_COPY(Py_UNICODE *target, const Py_UNICODE *source, Py_ssize_t length) { + memcpy(target, source, (size_t)(length) * sizeof(Py_UNICODE)); +} -#define Py_UNICODE_FILL(target, value, length) \ - do {Py_ssize_t i_; Py_UNICODE *t_ = (target); Py_UNICODE v_ = (value);\ - for (i_ = 0; i_ < (length); i_++) t_[i_] = v_;\ - } while (0) +Py_DEPRECATED(3.3) static inline void +Py_UNICODE_FILL(Py_UNICODE *target, Py_UNICODE value, Py_ssize_t length) { + Py_ssize_t i; + for (i = 0; i < length; i++) { + target[i] = value; + } +} /* macros to work with surrogates */ #define Py_UNICODE_IS_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDFFF) @@ -71,14 +76,6 @@ extern "C" { /* low surrogate = bottom 10 bits added to DC00 */ #define Py_UNICODE_LOW_SURROGATE(ch) (0xDC00 + ((ch) & 0x3FF)) -/* Check if substring matches at given offset. The offset must be - valid, and the substring must not be empty. */ - -#define Py_UNICODE_MATCH(string, offset, substring) \ - ((*((string)->wstr + (offset)) == *((substring)->wstr)) && \ - ((*((string)->wstr + (offset) + (substring)->wstr_length-1) == *((substring)->wstr + (substring)->wstr_length-1))) && \ - !memcmp((string)->wstr + (offset), (substring)->wstr, (substring)->wstr_length*sizeof(Py_UNICODE))) - /* --- Unicode Type ------------------------------------------------------- */ /* ASCII-only strings created through PyUnicode_New use the PyASCIIObject @@ -251,10 +248,6 @@ PyAPI_FUNC(int) _PyUnicode_CheckConsistency( int check_content); /* Fast access macros */ -#define PyUnicode_WSTR_LENGTH(op) \ - (PyUnicode_IS_COMPACT_ASCII(op) ? \ - ((PyASCIIObject*)op)->length : \ - ((PyCompactUnicodeObject*)op)->wstr_length) /* Returns the deprecated Py_UNICODE representation's size in code units (this includes surrogate pairs as 2 units). @@ -449,6 +442,14 @@ enum PyUnicode_Kind { (0xffffU) : \ (0x10ffffU))))) +Py_DEPRECATED(3.3) +static inline Py_ssize_t _PyUnicode_get_wstr_length(PyObject *op) { + return PyUnicode_IS_COMPACT_ASCII(op) ? + ((PyASCIIObject*)op)->length : + ((PyCompactUnicodeObject*)op)->wstr_length; +} +#define PyUnicode_WSTR_LENGTH(op) _PyUnicode_get_wstr_length((PyObject*)op) + /* === Public API ========================================================= */ /* --- Plain Py_UNICODE --------------------------------------------------- */ @@ -547,7 +548,7 @@ PyAPI_FUNC(void) _PyUnicode_FastFill( only allowed if u was set to NULL. The buffer is copied into the new object. */ -/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( const Py_UNICODE *u, /* Unicode buffer */ Py_ssize_t size /* size of buffer */ ); @@ -576,13 +577,13 @@ PyAPI_FUNC(Py_UCS4) _PyUnicode_FindMaxChar ( Py_UNICODE buffer. If the wchar_t/Py_UNICODE representation is not yet available, this function will calculate it. */ -/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( PyObject *unicode /* Unicode object */ ); /* Similar to PyUnicode_AsUnicode(), but raises a ValueError if the string contains null characters. */ -PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( +Py_DEPRECATED(3.3) PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( PyObject *unicode /* Unicode object */ ); @@ -591,7 +592,7 @@ PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( If the wchar_t/Py_UNICODE representation is not yet available, this function will calculate it. */ -/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( PyObject *unicode, /* Unicode object */ Py_ssize_t *size /* location where to save the length */ ); @@ -726,12 +727,6 @@ PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( Py_ssize_t start, Py_ssize_t end); -/* --- wchar_t support for platforms which support it --------------------- */ - -#ifdef HAVE_WCHAR_H -PyAPI_FUNC(void*) _PyUnicode_AsKind(PyObject *s, unsigned int kind); -#endif - /* --- Manage the default encoding ---------------------------------------- */ /* Returns a pointer to the default encoding (UTF-8) of the @@ -746,12 +741,6 @@ PyAPI_FUNC(void*) _PyUnicode_AsKind(PyObject *s, unsigned int kind); _PyUnicode_AsStringAndSize is a #define for PyUnicode_AsUTF8AndSize to support the previous internal function with the same behaviour. - - *** This API is for interpreter INTERNAL USE ONLY and will likely - *** be removed or changed in the future. - - *** If you need to access the Unicode object as UTF-8 bytes string, - *** please use PyUnicode_AsUTF8String() instead. */ PyAPI_FUNC(const char *) PyUnicode_AsUTF8AndSize( @@ -990,7 +979,7 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( */ -/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(int) PyUnicode_EncodeDecimal( +Py_DEPRECATED(3.3) PyAPI_FUNC(int) PyUnicode_EncodeDecimal( Py_UNICODE *s, /* Unicode buffer */ Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ char *output, /* Output buffer; must have size >= length */ @@ -1003,7 +992,7 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( Returns a new Unicode string on success, NULL on failure. */ -/* Py_DEPRECATED(3.3) */ +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_TransformDecimalToASCII( Py_UNICODE *s, /* Unicode buffer */ Py_ssize_t length /* Number of Py_UNICODE chars to transform */ @@ -1227,13 +1216,13 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnicodeCopy( /* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*); -/* Clear all static strings. */ -PyAPI_FUNC(void) _PyUnicode_ClearStaticStrings(void); /* Fast equality check when the inputs are known to be exact unicode types and where the hash values are equal (i.e. a very probable match) */ PyAPI_FUNC(int) _PyUnicode_EQ(PyObject *, PyObject *); +PyAPI_FUNC(Py_ssize_t) _PyUnicode_ScanIdentifier(PyObject *); + #ifdef __cplusplus } #endif diff --git a/Include/datetime.h b/Include/datetime.h index 00507cb8..5d9f2558 100644 --- a/Include/datetime.h +++ b/Include/datetime.h @@ -196,19 +196,19 @@ static PyDateTime_CAPI *PyDateTimeAPI = NULL; /* Macros for type checking when not building the Python core. */ #define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType) -#define PyDate_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateType) +#define PyDate_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DateType) #define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType) -#define PyDateTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateTimeType) +#define PyDateTime_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DateTimeType) #define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType) -#define PyTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TimeType) +#define PyTime_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->TimeType) #define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType) -#define PyDelta_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DeltaType) +#define PyDelta_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DeltaType) #define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) -#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType) +#define PyTZInfo_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->TZInfoType) /* Macros for accessing constructors in a simplified fashion. */ diff --git a/Include/dictobject.h b/Include/dictobject.h index b37573ad..c88b0aa0 100644 --- a/Include/dictobject.h +++ b/Include/dictobject.h @@ -16,7 +16,7 @@ PyAPI_DATA(PyTypeObject) PyDict_Type; #define PyDict_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_DICT_SUBCLASS) -#define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) +#define PyDict_CheckExact(op) Py_IS_TYPE(op, &PyDict_Type) PyAPI_FUNC(PyObject *) PyDict_New(void); PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key); diff --git a/Include/dtoa.h b/Include/dtoa.h deleted file mode 100644 index 9bfb6251..00000000 --- a/Include/dtoa.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef Py_LIMITED_API -#ifndef PY_NO_SHORT_FLOAT_REPR -#ifdef __cplusplus -extern "C" { -#endif - -PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr); -PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, - int *decpt, int *sign, char **rve); -PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); -PyAPI_FUNC(double) _Py_dg_stdnan(int sign); -PyAPI_FUNC(double) _Py_dg_infinity(int sign); - - -#ifdef __cplusplus -} -#endif -#endif -#endif diff --git a/Include/errcode.h b/Include/errcode.h index b37cd261..790518b8 100644 --- a/Include/errcode.h +++ b/Include/errcode.h @@ -29,7 +29,6 @@ extern "C" { #define E_EOFS 23 /* EOF in triple-quoted string */ #define E_EOLS 24 /* EOL in single-quoted string */ #define E_LINECONT 25 /* Unexpected characters after a line continuation */ -#define E_IDENTIFIER 26 /* Invalid characters in identifier */ #define E_BADSINGLE 27 /* Ill-formed single statement input */ #ifdef __cplusplus diff --git a/Include/exports.h b/Include/exports.h new file mode 100644 index 00000000..fc1a5c5e --- /dev/null +++ b/Include/exports.h @@ -0,0 +1,30 @@ +#ifndef Py_EXPORTS_H +#define Py_EXPORTS_H + +#if defined(_WIN32) || defined(__CYGWIN__) + #define Py_IMPORTED_SYMBOL __declspec(dllimport) + #define Py_EXPORTED_SYMBOL __declspec(dllexport) + #define Py_LOCAL_SYMBOL +#else +/* + * If we only ever used gcc >= 5, we could use __has_attribute(visibility) + * as a cross-platform way to determine if visibility is supported. However, + * we may still need to support gcc >= 4, as some Ubuntu LTS and Centos versions + * have 4 < gcc < 5. + */ + #ifndef __has_attribute + #define __has_attribute(x) 0 // Compatibility with non-clang compilers. + #endif + #if (defined(__GNUC__) && (__GNUC__ >= 4)) ||\ + (defined(__clang__) && __has_attribute(visibility)) + #define Py_IMPORTED_SYMBOL __attribute__ ((visibility ("default"))) + #define Py_EXPORTED_SYMBOL __attribute__ ((visibility ("default"))) + #define Py_LOCAL_SYMBOL __attribute__ ((visibility ("hidden"))) + #else + #define Py_IMPORTED_SYMBOL + #define Py_EXPORTED_SYMBOL + #define Py_LOCAL_SYMBOL + #endif +#endif + +#endif /* Py_EXPORTS_H */ diff --git a/Include/fileutils.h b/Include/fileutils.h index 359dd0ad..12bd071c 100644 --- a/Include/fileutils.h +++ b/Include/fileutils.h @@ -18,167 +18,12 @@ PyAPI_FUNC(char*) _Py_EncodeLocaleRaw( size_t *error_pos); #endif - -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000 -typedef enum { - _Py_ERROR_UNKNOWN=0, - _Py_ERROR_STRICT, - _Py_ERROR_SURROGATEESCAPE, - _Py_ERROR_REPLACE, - _Py_ERROR_IGNORE, - _Py_ERROR_BACKSLASHREPLACE, - _Py_ERROR_SURROGATEPASS, - _Py_ERROR_XMLCHARREFREPLACE, - _Py_ERROR_OTHER -} _Py_error_handler; - -PyAPI_FUNC(_Py_error_handler) _Py_GetErrorHandler(const char *errors); - -PyAPI_FUNC(int) _Py_DecodeLocaleEx( - const char *arg, - wchar_t **wstr, - size_t *wlen, - const char **reason, - int current_locale, - _Py_error_handler errors); - -PyAPI_FUNC(int) _Py_EncodeLocaleEx( - const wchar_t *text, - char **str, - size_t *error_pos, - const char **reason, - int current_locale, - _Py_error_handler errors); -#endif - #ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _Py_device_encoding(int); - -#if defined(MS_WINDOWS) || defined(__APPLE__) - /* On Windows, the count parameter of read() is an int (bpo-9015, bpo-9611). - On macOS 10.13, read() and write() with more than INT_MAX bytes - fail with EINVAL (bpo-24658). */ -# define _PY_READ_MAX INT_MAX -# define _PY_WRITE_MAX INT_MAX -#else - /* write() should truncate the input to PY_SSIZE_T_MAX bytes, - but it's safer to do it ourself to have a portable behaviour */ -# define _PY_READ_MAX PY_SSIZE_T_MAX -# define _PY_WRITE_MAX PY_SSIZE_T_MAX -#endif - -#ifdef MS_WINDOWS -struct _Py_stat_struct { - unsigned long st_dev; - uint64_t st_ino; - unsigned short st_mode; - int st_nlink; - int st_uid; - int st_gid; - unsigned long st_rdev; - __int64 st_size; - time_t st_atime; - int st_atime_nsec; - time_t st_mtime; - int st_mtime_nsec; - time_t st_ctime; - int st_ctime_nsec; - unsigned long st_file_attributes; - unsigned long st_reparse_tag; -}; -#else -# define _Py_stat_struct stat -#endif - -PyAPI_FUNC(int) _Py_fstat( - int fd, - struct _Py_stat_struct *status); - -PyAPI_FUNC(int) _Py_fstat_noraise( - int fd, - struct _Py_stat_struct *status); - -PyAPI_FUNC(int) _Py_stat( - PyObject *path, - struct stat *status); - -PyAPI_FUNC(int) _Py_open( - const char *pathname, - int flags); - -PyAPI_FUNC(int) _Py_open_noraise( - const char *pathname, - int flags); - -PyAPI_FUNC(FILE *) _Py_wfopen( - const wchar_t *path, - const wchar_t *mode); - -PyAPI_FUNC(FILE*) _Py_fopen( - const char *pathname, - const char *mode); - -PyAPI_FUNC(FILE*) _Py_fopen_obj( - PyObject *path, - const char *mode); - -PyAPI_FUNC(Py_ssize_t) _Py_read( - int fd, - void *buf, - size_t count); - -PyAPI_FUNC(Py_ssize_t) _Py_write( - int fd, - const void *buf, - size_t count); - -PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( - int fd, - const void *buf, - size_t count); - -#ifdef HAVE_READLINK -PyAPI_FUNC(int) _Py_wreadlink( - const wchar_t *path, - wchar_t *buf, - /* Number of characters of 'buf' buffer - including the trailing NUL character */ - size_t buflen); -#endif - -#ifdef HAVE_REALPATH -PyAPI_FUNC(wchar_t*) _Py_wrealpath( - const wchar_t *path, - wchar_t *resolved_path, - /* Number of characters of 'resolved_path' buffer - including the trailing NUL character */ - size_t resolved_path_len); +# define Py_CPYTHON_FILEUTILS_H +# include "cpython/fileutils.h" +# undef Py_CPYTHON_FILEUTILS_H #endif -PyAPI_FUNC(wchar_t*) _Py_wgetcwd( - wchar_t *buf, - /* Number of characters of 'buf' buffer - including the trailing NUL character */ - size_t buflen); - -PyAPI_FUNC(int) _Py_get_inheritable(int fd); - -PyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, - int *atomic_flag_works); - -PyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, - int *atomic_flag_works); - -PyAPI_FUNC(int) _Py_dup(int fd); - -#ifndef MS_WINDOWS -PyAPI_FUNC(int) _Py_get_blocking(int fd); - -PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); -#endif /* !MS_WINDOWS */ - -#endif /* Py_LIMITED_API */ - #ifdef __cplusplus } #endif diff --git a/Include/floatobject.h b/Include/floatobject.h index f1044d64..e994aa8f 100644 --- a/Include/floatobject.h +++ b/Include/floatobject.h @@ -21,7 +21,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyFloat_Type; #define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type) -#define PyFloat_CheckExact(op) (Py_TYPE(op) == &PyFloat_Type) +#define PyFloat_CheckExact(op) Py_IS_TYPE(op, &PyFloat_Type) #ifdef Py_NAN #define Py_RETURN_NAN return PyFloat_FromDouble(Py_NAN) @@ -88,15 +88,6 @@ PyAPI_FUNC(int) _PyFloat_Pack2(double x, unsigned char *p, int le); PyAPI_FUNC(int) _PyFloat_Pack4(double x, unsigned char *p, int le); PyAPI_FUNC(int) _PyFloat_Pack8(double x, unsigned char *p, int le); -/* Needed for the old way for marshal to store a floating point number. - Returns the string length copied into p, -1 on error. - */ -PyAPI_FUNC(int) _PyFloat_Repr(double x, char *p, size_t len); - -/* Used to get the important decimal digits of a double */ -PyAPI_FUNC(int) _PyFloat_Digits(char *buf, double v, int *signum); -PyAPI_FUNC(void) _PyFloat_DigitsInit(void); - /* The unpack routines read 2, 4 or 8 bytes, starting at p. le is a bool * argument, true if the string is in little-endian format (exponent * last, at p+1, p+3 or p+7), false if big-endian (exponent first, at p). @@ -109,9 +100,6 @@ PyAPI_FUNC(double) _PyFloat_Unpack2(const unsigned char *p, int le); PyAPI_FUNC(double) _PyFloat_Unpack4(const unsigned char *p, int le); PyAPI_FUNC(double) _PyFloat_Unpack8(const unsigned char *p, int le); -/* free list api */ -PyAPI_FUNC(int) PyFloat_ClearFreeList(void); - PyAPI_FUNC(void) _PyFloat_DebugMallocStats(FILE* out); /* Format the object based on the format_spec, as defined in PEP 3101 diff --git a/Include/frameobject.h b/Include/frameobject.h index 3bad86a6..c118af12 100644 --- a/Include/frameobject.h +++ b/Include/frameobject.h @@ -1,92 +1,20 @@ /* Frame object interface */ -#ifndef Py_LIMITED_API #ifndef Py_FRAMEOBJECT_H #define Py_FRAMEOBJECT_H #ifdef __cplusplus extern "C" { #endif -typedef struct { - int b_type; /* what kind of block this is */ - int b_handler; /* where to jump to find handler */ - int b_level; /* value stack level to pop to */ -} PyTryBlock; - -typedef struct _frame { - PyObject_VAR_HEAD - struct _frame *f_back; /* previous frame, or NULL */ - PyCodeObject *f_code; /* code segment */ - PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ - PyObject *f_globals; /* global symbol table (PyDictObject) */ - PyObject *f_locals; /* local symbol table (any mapping) */ - PyObject **f_valuestack; /* points after the last local */ - /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. - Frame evaluation usually NULLs it, but a frame that yields sets it - to the current stack top. */ - PyObject **f_stacktop; - PyObject *f_trace; /* Trace function */ - char f_trace_lines; /* Emit per-line trace events? */ - char f_trace_opcodes; /* Emit per-opcode trace events? */ - - /* Borrowed reference to a generator, or NULL */ - PyObject *f_gen; - - int f_lasti; /* Last instruction if called */ - /* Call PyFrame_GetLineNumber() instead of reading this field - directly. As of 2.3 f_lineno is only valid when tracing is - active (i.e. when f_trace is set). At other times we use - PyCode_Addr2Line to calculate the line from the current - bytecode index. */ - int f_lineno; /* Current line number */ - int f_iblock; /* index in f_blockstack */ - char f_executing; /* whether the frame is still executing */ - PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ - PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ -} PyFrameObject; - - -/* Standard object interface */ - -PyAPI_DATA(PyTypeObject) PyFrame_Type; - -#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type) - -PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, - PyObject *, PyObject *); - -/* only internal use */ -PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, - PyObject *, PyObject *); - - -/* The rest of the interface is specific for frame objects */ +#include "pyframe.h" -/* Block management functions */ - -PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); -PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); - -/* Extend the value stack */ - -PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int); - -/* Conversions between "fast locals" and locals in dictionary */ - -PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); - -PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); -PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); - -PyAPI_FUNC(int) PyFrame_ClearFreeList(void); - -PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); - -/* Return the line of code the frame is currently executing. */ -PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); +#ifndef Py_LIMITED_API +# define Py_CPYTHON_FRAMEOBJECT_H +# include "cpython/frameobject.h" +# undef Py_CPYTHON_FRAMEOBJECT_H +#endif #ifdef __cplusplus } #endif #endif /* !Py_FRAMEOBJECT_H */ -#endif /* Py_LIMITED_API */ diff --git a/Include/funcobject.h b/Include/funcobject.h index e563a74a..c5cc9d26 100644 --- a/Include/funcobject.h +++ b/Include/funcobject.h @@ -43,7 +43,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyFunction_Type; -#define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type) +#define PyFunction_Check(op) Py_IS_TYPE(op, &PyFunction_Type) PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); PyAPI_FUNC(PyObject *) PyFunction_NewWithQualName(PyObject *, PyObject *, PyObject *); @@ -60,12 +60,6 @@ PyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *); PyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *); #ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyFunction_FastCallDict( - PyObject *func, - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwargs); - PyAPI_FUNC(PyObject *) _PyFunction_Vectorcall( PyObject *func, PyObject *const *stack, diff --git a/Include/genericaliasobject.h b/Include/genericaliasobject.h new file mode 100644 index 00000000..cf002976 --- /dev/null +++ b/Include/genericaliasobject.h @@ -0,0 +1,14 @@ +// Implementation of PEP 585: support list[int] etc. +#ifndef Py_GENERICALIASOBJECT_H +#define Py_GENERICALIASOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) Py_GenericAlias(PyObject *, PyObject *); +PyAPI_DATA(PyTypeObject) Py_GenericAliasType; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GENERICALIASOBJECT_H */ diff --git a/Include/genobject.h b/Include/genobject.h index 59ede281..8ffd1564 100644 --- a/Include/genobject.h +++ b/Include/genobject.h @@ -10,14 +10,12 @@ extern "C" { #include "pystate.h" /* _PyErr_StackItem */ -struct _frame; /* Avoid including frameobject.h */ - /* _PyGenObject_HEAD defines the initial segment of generator and coroutine objects. */ #define _PyGenObject_HEAD(prefix) \ PyObject_HEAD \ /* Note: gi_frame can be NULL if the generator is "finished" */ \ - struct _frame *prefix##_frame; \ + PyFrameObject *prefix##_frame; \ /* True if generator is being executed. */ \ char prefix##_running; \ /* The code object backing the generator */ \ @@ -38,12 +36,11 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyGen_Type; #define PyGen_Check(op) PyObject_TypeCheck(op, &PyGen_Type) -#define PyGen_CheckExact(op) (Py_TYPE(op) == &PyGen_Type) +#define PyGen_CheckExact(op) Py_IS_TYPE(op, &PyGen_Type) -PyAPI_FUNC(PyObject *) PyGen_New(struct _frame *); -PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(struct _frame *, +PyAPI_FUNC(PyObject *) PyGen_New(PyFrameObject *); +PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(PyFrameObject *, PyObject *name, PyObject *qualname); -PyAPI_FUNC(int) PyGen_NeedsFinalizing(PyGenObject *); PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *); PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **); PyAPI_FUNC(PyObject *) _PyGen_Send(PyGenObject *, PyObject *); @@ -59,11 +56,9 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyCoro_Type; PyAPI_DATA(PyTypeObject) _PyCoroWrapper_Type; -PyAPI_DATA(PyTypeObject) _PyAIterWrapper_Type; - -#define PyCoro_CheckExact(op) (Py_TYPE(op) == &PyCoro_Type) +#define PyCoro_CheckExact(op) Py_IS_TYPE(op, &PyCoro_Type) PyObject *_PyCoro_GetAwaitableIter(PyObject *o); -PyAPI_FUNC(PyObject *) PyCoro_New(struct _frame *, +PyAPI_FUNC(PyObject *) PyCoro_New(PyFrameObject *, PyObject *name, PyObject *qualname); /* Asynchronous Generators */ @@ -89,15 +84,13 @@ PyAPI_DATA(PyTypeObject) _PyAsyncGenASend_Type; PyAPI_DATA(PyTypeObject) _PyAsyncGenWrappedValue_Type; PyAPI_DATA(PyTypeObject) _PyAsyncGenAThrow_Type; -PyAPI_FUNC(PyObject *) PyAsyncGen_New(struct _frame *, +PyAPI_FUNC(PyObject *) PyAsyncGen_New(PyFrameObject *, PyObject *name, PyObject *qualname); -#define PyAsyncGen_CheckExact(op) (Py_TYPE(op) == &PyAsyncGen_Type) +#define PyAsyncGen_CheckExact(op) Py_IS_TYPE(op, &PyAsyncGen_Type) PyObject *_PyAsyncGenValueWrapperNew(PyObject *); -int PyAsyncGen_ClearFreeLists(void); - #endif #undef _PyGenObject_HEAD diff --git a/Include/import.h b/Include/import.h index 13c61493..aeef3efd 100644 --- a/Include/import.h +++ b/Include/import.h @@ -1,4 +1,3 @@ - /* Module definition and import interface */ #ifndef Py_IMPORT_H @@ -7,9 +6,6 @@ extern "C" { #endif -#ifndef Py_LIMITED_API -PyMODINIT_FUNC PyInit__imp(void); -#endif /* !Py_LIMITED_API */ PyAPI_FUNC(long) PyImport_GetMagicNumber(void); PyAPI_FUNC(const char *) PyImport_GetMagicTag(void); PyAPI_FUNC(PyObject *) PyImport_ExecCodeModule( @@ -39,14 +35,6 @@ PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 PyAPI_FUNC(PyObject *) PyImport_GetModule(PyObject *name); #endif -#ifndef Py_LIMITED_API -PyAPI_FUNC(int) _PyImport_IsInitialized(PyInterpreterState *); -PyAPI_FUNC(PyObject *) _PyImport_GetModuleId(struct _Py_Identifier *name); -PyAPI_FUNC(PyObject *) _PyImport_AddModuleObject(PyObject *name, - PyObject *modules); -PyAPI_FUNC(int) _PyImport_SetModule(PyObject *name, PyObject *module); -PyAPI_FUNC(int) _PyImport_SetModuleString(const char *name, PyObject* module); -#endif #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(PyObject *) PyImport_AddModuleObject( PyObject *name @@ -84,7 +72,6 @@ PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevelObject( PyAPI_FUNC(PyObject *) PyImport_GetImporter(PyObject *path); PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name); PyAPI_FUNC(PyObject *) PyImport_ReloadModule(PyObject *m); -PyAPI_FUNC(void) PyImport_Cleanup(void); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(int) PyImport_ImportFrozenModuleObject( PyObject *name @@ -94,53 +81,15 @@ PyAPI_FUNC(int) PyImport_ImportFrozenModule( const char *name /* UTF-8 encoded string */ ); -#ifndef Py_LIMITED_API -PyAPI_FUNC(void) _PyImport_AcquireLock(void); -PyAPI_FUNC(int) _PyImport_ReleaseLock(void); - -PyAPI_FUNC(void) _PyImport_ReInitLock(void); - -PyAPI_FUNC(PyObject *) _PyImport_FindBuiltin( - const char *name, /* UTF-8 encoded string */ - PyObject *modules - ); -PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObject(PyObject *, PyObject *); -PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObjectEx(PyObject *, PyObject *, - PyObject *); -PyAPI_FUNC(int) _PyImport_FixupBuiltin( - PyObject *mod, - const char *name, /* UTF-8 encoded string */ - PyObject *modules - ); -PyAPI_FUNC(int) _PyImport_FixupExtensionObject(PyObject*, PyObject *, - PyObject *, PyObject *); - -struct _inittab { - const char *name; /* ASCII encoded string */ - PyObject* (*initfunc)(void); -}; -PyAPI_DATA(struct _inittab *) PyImport_Inittab; -PyAPI_FUNC(int) PyImport_ExtendInittab(struct _inittab *newtab); -#endif /* Py_LIMITED_API */ - -PyAPI_DATA(PyTypeObject) PyNullImporter_Type; - PyAPI_FUNC(int) PyImport_AppendInittab( const char *name, /* ASCII encoded string */ PyObject* (*initfunc)(void) ); #ifndef Py_LIMITED_API -struct _frozen { - const char *name; /* ASCII encoded string */ - const unsigned char *code; - int size; -}; - -/* Embedding apps may change this pointer to point to their favorite - collection of frozen modules: */ - -PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules; +# define Py_CPYTHON_IMPORT_H +# include "cpython/import.h" +# undef Py_CPYTHON_IMPORT_H #endif #ifdef __cplusplus diff --git a/Include/internal/pegen_interface.h b/Include/internal/pegen_interface.h new file mode 100644 index 00000000..ee4c77ec --- /dev/null +++ b/Include/internal/pegen_interface.h @@ -0,0 +1,46 @@ +#ifndef Py_PEGENINTERFACE +#define Py_PEGENINTERFACE +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "Python.h" +#include "Python-ast.h" + +PyAPI_FUNC(mod_ty) PyPegen_ASTFromString( + const char *str, + const char *filename, + int mode, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(mod_ty) PyPegen_ASTFromStringObject( + const char *str, + PyObject* filename, + int mode, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(mod_ty) PyPegen_ASTFromFileObject( + FILE *fp, + PyObject *filename_ob, + int mode, + const char *enc, + const char *ps1, + const char *ps2, + PyCompilerFlags *flags, + int *errcode, + PyArena *arena); +PyAPI_FUNC(mod_ty) PyPegen_ASTFromFilename( + const char *filename, + int mode, + PyCompilerFlags *flags, + PyArena *arena); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PEGENINTERFACE*/ diff --git a/Include/internal/pycore_abstract.h b/Include/internal/pycore_abstract.h new file mode 100644 index 00000000..b791bf24 --- /dev/null +++ b/Include/internal/pycore_abstract.h @@ -0,0 +1,22 @@ +#ifndef Py_INTERNAL_ABSTRACT_H +#define Py_INTERNAL_ABSTRACT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +// Fast inlined version of PyIndex_Check() +static inline int +_PyIndex_Check(PyObject *obj) +{ + PyNumberMethods *tp_as_number = Py_TYPE(obj)->tp_as_number; + return (tp_as_number != NULL && tp_as_number->nb_index != NULL); +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_ABSTRACT_H */ diff --git a/Include/internal/pycore_atomic.h b/Include/internal/pycore_atomic.h index 336bc3fe..1d5c5621 100644 --- a/Include/internal/pycore_atomic.h +++ b/Include/internal/pycore_atomic.h @@ -8,8 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "dynamic_annotations.h" - +#include "dynamic_annotations.h" /* _Py_ANNOTATE_MEMORY_ORDER */ #include "pyconfig.h" #if defined(HAVE_STD_ATOMIC) diff --git a/Include/internal/pycore_bytes_methods.h b/Include/internal/pycore_bytes_methods.h new file mode 100644 index 00000000..11e8ab20 --- /dev/null +++ b/Include/internal/pycore_bytes_methods.h @@ -0,0 +1,73 @@ +#ifndef Py_LIMITED_API +#ifndef Py_BYTES_CTYPE_H +#define Py_BYTES_CTYPE_H + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +/* + * The internal implementation behind PyBytes (bytes) and PyByteArray (bytearray) + * methods of the given names, they operate on ASCII byte strings. + */ +extern PyObject* _Py_bytes_isspace(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalpha(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalnum(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isascii(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isdigit(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_islower(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isupper(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_istitle(const char *cptr, Py_ssize_t len); + +/* These store their len sized answer in the given preallocated *result arg. */ +extern void _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_title(char *result, const char *s, Py_ssize_t len); +extern void _Py_bytes_capitalize(char *result, const char *s, Py_ssize_t len); +extern void _Py_bytes_swapcase(char *result, const char *s, Py_ssize_t len); + +extern PyObject *_Py_bytes_find(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_index(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_rfind(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_rindex(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_count(const char *str, Py_ssize_t len, PyObject *args); +extern int _Py_bytes_contains(const char *str, Py_ssize_t len, PyObject *arg); +extern PyObject *_Py_bytes_startswith(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_endswith(const char *str, Py_ssize_t len, PyObject *args); + +/* The maketrans() static method. */ +extern PyObject* _Py_bytes_maketrans(Py_buffer *frm, Py_buffer *to); + +/* Shared __doc__ strings. */ +extern const char _Py_isspace__doc__[]; +extern const char _Py_isalpha__doc__[]; +extern const char _Py_isalnum__doc__[]; +extern const char _Py_isascii__doc__[]; +extern const char _Py_isdigit__doc__[]; +extern const char _Py_islower__doc__[]; +extern const char _Py_isupper__doc__[]; +extern const char _Py_istitle__doc__[]; +extern const char _Py_lower__doc__[]; +extern const char _Py_upper__doc__[]; +extern const char _Py_title__doc__[]; +extern const char _Py_capitalize__doc__[]; +extern const char _Py_swapcase__doc__[]; +extern const char _Py_count__doc__[]; +extern const char _Py_find__doc__[]; +extern const char _Py_index__doc__[]; +extern const char _Py_rfind__doc__[]; +extern const char _Py_rindex__doc__[]; +extern const char _Py_startswith__doc__[]; +extern const char _Py_endswith__doc__[]; +extern const char _Py_maketrans__doc__[]; +extern const char _Py_expandtabs__doc__[]; +extern const char _Py_ljust__doc__[]; +extern const char _Py_rjust__doc__[]; +extern const char _Py_center__doc__[]; +extern const char _Py_zfill__doc__[]; + +/* this is needed because some docs are shared from the .o, not static */ +#define PyDoc_STRVAR_shared(name,str) const char name[] = PyDoc_STR(str) + +#endif /* !Py_BYTES_CTYPE_H */ +#endif /* !Py_LIMITED_API */ diff --git a/Include/internal/pycore_byteswap.h b/Include/internal/pycore_byteswap.h new file mode 100644 index 00000000..975e150d --- /dev/null +++ b/Include/internal/pycore_byteswap.h @@ -0,0 +1,91 @@ +/* Bytes swap functions, reverse order of bytes: + + - _Py_bswap16(uint16_t) + - _Py_bswap32(uint32_t) + - _Py_bswap64(uint64_t) +*/ + +#ifndef Py_INTERNAL_BSWAP_H +#define Py_INTERNAL_BSWAP_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#if ((defined(__GNUC__) \ + && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))) \ + || (defined(__clang__) \ + && (__clang_major__ >= 4 \ + || (__clang_major__ == 3 && __clang_minor__ >= 2)))) + /* __builtin_bswap16() is available since GCC 4.8 and clang 3.2, + __builtin_bswap32() is available since GCC 4.3, + __builtin_bswap64() is available since GCC 4.3. */ +# define _PY_HAVE_BUILTIN_BSWAP +#endif + +#ifdef _MSC_VER + /* Get _byteswap_ushort(), _byteswap_ulong(), _byteswap_uint64() */ +# include +#endif + +static inline uint16_t +_Py_bswap16(uint16_t word) +{ +#ifdef _PY_HAVE_BUILTIN_BSWAP + return __builtin_bswap16(word); +#elif defined(_MSC_VER) + Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned short)); + return _byteswap_ushort(word); +#else + // Portable implementation which doesn't rely on circular bit shift + return ( ((word & UINT16_C(0x00FF)) << 8) + | ((word & UINT16_C(0xFF00)) >> 8)); +#endif +} + +static inline uint32_t +_Py_bswap32(uint32_t word) +{ +#ifdef _PY_HAVE_BUILTIN_BSWAP + return __builtin_bswap32(word); +#elif defined(_MSC_VER) + Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned long)); + return _byteswap_ulong(word); +#else + // Portable implementation which doesn't rely on circular bit shift + return ( ((word & UINT32_C(0x000000FF)) << 24) + | ((word & UINT32_C(0x0000FF00)) << 8) + | ((word & UINT32_C(0x00FF0000)) >> 8) + | ((word & UINT32_C(0xFF000000)) >> 24)); +#endif +} + +static inline uint64_t +_Py_bswap64(uint64_t word) +{ +#ifdef _PY_HAVE_BUILTIN_BSWAP + return __builtin_bswap64(word); +#elif defined(_MSC_VER) + return _byteswap_uint64(word); +#else + // Portable implementation which doesn't rely on circular bit shift + return ( ((word & UINT64_C(0x00000000000000FF)) << 56) + | ((word & UINT64_C(0x000000000000FF00)) << 40) + | ((word & UINT64_C(0x0000000000FF0000)) << 24) + | ((word & UINT64_C(0x00000000FF000000)) << 8) + | ((word & UINT64_C(0x000000FF00000000)) >> 8) + | ((word & UINT64_C(0x0000FF0000000000)) >> 24) + | ((word & UINT64_C(0x00FF000000000000)) >> 40) + | ((word & UINT64_C(0xFF00000000000000)) >> 56)); +#endif +} + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_BSWAP_H */ + diff --git a/Include/internal/pycore_call.h b/Include/internal/pycore_call.h new file mode 100644 index 00000000..f7d856a5 --- /dev/null +++ b/Include/internal/pycore_call.h @@ -0,0 +1,39 @@ +#ifndef Py_INTERNAL_CALL_H +#define Py_INTERNAL_CALL_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( + PyThreadState *tstate, + PyObject *callable, + PyObject *obj, + PyObject *args, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyObject_FastCallDictTstate( + PyThreadState *tstate, + PyObject *callable, + PyObject *const *args, + size_t nargsf, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyObject_Call( + PyThreadState *tstate, + PyObject *callable, + PyObject *args, + PyObject *kwargs); + +static inline PyObject * +_PyObject_CallNoArgTstate(PyThreadState *tstate, PyObject *func) { + return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_CALL_H */ diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 4c1c0e24..18c8f027 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -8,29 +8,116 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_atomic.h" -#include "pycore_pystate.h" -#include "pythread.h" - -PyAPI_FUNC(void) _Py_FinishPendingCalls(_PyRuntimeState *runtime); -PyAPI_FUNC(void) _PyEval_Initialize(struct _ceval_runtime_state *); -PyAPI_FUNC(void) _PyEval_FiniThreads( - struct _ceval_runtime_state *ceval); -PyAPI_FUNC(void) _PyEval_SignalReceived( - struct _ceval_runtime_state *ceval); +/* Forward declarations */ +struct pyruntimestate; +struct _ceval_runtime_state; + +#include "pycore_interp.h" /* PyInterpreterState.eval_frame */ + +extern void _Py_FinishPendingCalls(PyThreadState *tstate); +extern void _PyEval_InitRuntimeState(struct _ceval_runtime_state *); +extern int _PyEval_InitState(struct _ceval_state *ceval); +extern void _PyEval_FiniState(struct _ceval_state *ceval); +PyAPI_FUNC(void) _PyEval_SignalReceived(PyInterpreterState *interp); PyAPI_FUNC(int) _PyEval_AddPendingCall( - PyThreadState *tstate, - struct _ceval_runtime_state *ceval, + PyInterpreterState *interp, int (*func)(void *), void *arg); -PyAPI_FUNC(void) _PyEval_SignalAsyncExc( - struct _ceval_runtime_state *ceval); -PyAPI_FUNC(void) _PyEval_ReInitThreads( - _PyRuntimeState *runtime); +PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyThreadState *tstate); +#ifdef HAVE_FORK +extern void _PyEval_ReInitThreads(struct pyruntimestate *runtime); +#endif +PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth( + PyThreadState *tstate, + int new_depth); /* Private function */ void _PyEval_Fini(void); +static inline PyObject* +_PyEval_EvalFrame(PyThreadState *tstate, PyFrameObject *f, int throwflag) +{ + return tstate->interp->eval_frame(tstate, f, throwflag); +} + +extern PyObject *_PyEval_EvalCode( + PyThreadState *tstate, + PyObject *_co, PyObject *globals, PyObject *locals, + PyObject *const *args, Py_ssize_t argcount, + PyObject *const *kwnames, PyObject *const *kwargs, + Py_ssize_t kwcount, int kwstep, + PyObject *const *defs, Py_ssize_t defcount, + PyObject *kwdefs, PyObject *closure, + PyObject *name, PyObject *qualname); + +extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime); +extern PyStatus _PyEval_InitGIL(PyThreadState *tstate); +extern void _PyEval_FiniGIL(PyThreadState *tstate); + +extern void _PyEval_ReleaseLock(PyThreadState *tstate); + + +/* --- _Py_EnterRecursiveCall() ----------------------------------------- */ + +PyAPI_DATA(int) _Py_CheckRecursionLimit; + +#ifdef USE_STACKCHECK +/* With USE_STACKCHECK macro defined, trigger stack checks in + _Py_CheckRecursiveCall() on every 64th call to Py_EnterRecursiveCall. */ +static inline int _Py_MakeRecCheck(PyThreadState *tstate) { + return (++tstate->recursion_depth > tstate->interp->ceval.recursion_limit + || ++tstate->stackcheck_counter > 64); +} +#else +static inline int _Py_MakeRecCheck(PyThreadState *tstate) { + return (++tstate->recursion_depth > tstate->interp->ceval.recursion_limit); +} +#endif + +PyAPI_FUNC(int) _Py_CheckRecursiveCall( + PyThreadState *tstate, + const char *where); + +static inline int _Py_EnterRecursiveCall(PyThreadState *tstate, + const char *where) { + return (_Py_MakeRecCheck(tstate) && _Py_CheckRecursiveCall(tstate, where)); +} + +static inline int _Py_EnterRecursiveCall_inline(const char *where) { + PyThreadState *tstate = PyThreadState_GET(); + return _Py_EnterRecursiveCall(tstate, where); +} + +#define Py_EnterRecursiveCall(where) _Py_EnterRecursiveCall_inline(where) + +/* Compute the "lower-water mark" for a recursion limit. When + * Py_LeaveRecursiveCall() is called with a recursion depth below this mark, + * the overflowed flag is reset to 0. */ +static inline int _Py_RecursionLimitLowerWaterMark(int limit) { + if (limit > 200) { + return (limit - 50); + } + else { + return (3 * (limit >> 2)); + } +} + +static inline void _Py_LeaveRecursiveCall(PyThreadState *tstate) { + tstate->recursion_depth--; + int limit = tstate->interp->ceval.recursion_limit; + if (tstate->recursion_depth < _Py_RecursionLimitLowerWaterMark(limit)) { + tstate->overflowed = 0; + } +} + +static inline void _Py_LeaveRecursiveCall_inline(void) { + PyThreadState *tstate = PyThreadState_GET(); + _Py_LeaveRecursiveCall(tstate); +} + +#define Py_LeaveRecursiveCall() _Py_LeaveRecursiveCall_inline() + + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_context.h b/Include/internal/pycore_context.h index 5e1ba0d0..f665ad5c 100644 --- a/Include/internal/pycore_context.h +++ b/Include/internal/pycore_context.h @@ -5,7 +5,7 @@ # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_hamt.h" +#include "pycore_hamt.h" /* PyHamtObject */ struct _pycontextobject { PyObject_HEAD diff --git a/Include/internal/pycore_dtoa.h b/Include/internal/pycore_dtoa.h new file mode 100644 index 00000000..3faf8cf6 --- /dev/null +++ b/Include/internal/pycore_dtoa.h @@ -0,0 +1,23 @@ +#ifndef PY_NO_SHORT_FLOAT_REPR +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +/* These functions are used by modules compiled as C extension like math: + they must be exported. */ + +PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr); +PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, + int *decpt, int *sign, char **rve); +PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); +PyAPI_FUNC(double) _Py_dg_stdnan(int sign); +PyAPI_FUNC(double) _Py_dg_infinity(int sign); + +#ifdef __cplusplus +} +#endif +#endif /* !PY_NO_SHORT_FLOAT_REPR */ diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h new file mode 100644 index 00000000..0511eea7 --- /dev/null +++ b/Include/internal/pycore_gc.h @@ -0,0 +1,179 @@ +#ifndef Py_INTERNAL_GC_H +#define Py_INTERNAL_GC_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +/* GC information is stored BEFORE the object structure. */ +typedef struct { + // Pointer to next object in the list. + // 0 means the object is not tracked + uintptr_t _gc_next; + + // Pointer to previous object in the list. + // Lowest two bits are used for flags documented later. + uintptr_t _gc_prev; +} PyGC_Head; + +#define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) + +/* True if the object is currently tracked by the GC. */ +#define _PyObject_GC_IS_TRACKED(o) (_Py_AS_GC(o)->_gc_next != 0) + +/* True if the object may be tracked by the GC in the future, or already is. + This can be useful to implement some optimizations. */ +#define _PyObject_GC_MAY_BE_TRACKED(obj) \ + (PyObject_IS_GC(obj) && \ + (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) + + +/* Bit flags for _gc_prev */ +/* Bit 0 is set when tp_finalize is called */ +#define _PyGC_PREV_MASK_FINALIZED (1) +/* Bit 1 is set when the object is in generation which is GCed currently. */ +#define _PyGC_PREV_MASK_COLLECTING (2) +/* The (N-2) most significant bits contain the real address. */ +#define _PyGC_PREV_SHIFT (2) +#define _PyGC_PREV_MASK (((uintptr_t) -1) << _PyGC_PREV_SHIFT) + +// Lowest bit of _gc_next is used for flags only in GC. +// But it is always 0 for normal code. +#define _PyGCHead_NEXT(g) ((PyGC_Head*)(g)->_gc_next) +#define _PyGCHead_SET_NEXT(g, p) ((g)->_gc_next = (uintptr_t)(p)) + +// Lowest two bits of _gc_prev is used for _PyGC_PREV_MASK_* flags. +#define _PyGCHead_PREV(g) ((PyGC_Head*)((g)->_gc_prev & _PyGC_PREV_MASK)) +#define _PyGCHead_SET_PREV(g, p) do { \ + assert(((uintptr_t)p & ~_PyGC_PREV_MASK) == 0); \ + (g)->_gc_prev = ((g)->_gc_prev & ~_PyGC_PREV_MASK) \ + | ((uintptr_t)(p)); \ + } while (0) + +#define _PyGCHead_FINALIZED(g) \ + (((g)->_gc_prev & _PyGC_PREV_MASK_FINALIZED) != 0) +#define _PyGCHead_SET_FINALIZED(g) \ + ((g)->_gc_prev |= _PyGC_PREV_MASK_FINALIZED) + +#define _PyGC_FINALIZED(o) \ + _PyGCHead_FINALIZED(_Py_AS_GC(o)) +#define _PyGC_SET_FINALIZED(o) \ + _PyGCHead_SET_FINALIZED(_Py_AS_GC(o)) + + +/* GC runtime state */ + +/* If we change this, we need to change the default value in the + signature of gc.collect. */ +#define NUM_GENERATIONS 3 +/* + NOTE: about untracking of mutable objects. + + Certain types of container cannot participate in a reference cycle, and + so do not need to be tracked by the garbage collector. Untracking these + objects reduces the cost of garbage collections. However, determining + which objects may be untracked is not free, and the costs must be + weighed against the benefits for garbage collection. + + There are two possible strategies for when to untrack a container: + + i) When the container is created. + ii) When the container is examined by the garbage collector. + + Tuples containing only immutable objects (integers, strings etc, and + recursively, tuples of immutable objects) do not need to be tracked. + The interpreter creates a large number of tuples, many of which will + not survive until garbage collection. It is therefore not worthwhile + to untrack eligible tuples at creation time. + + Instead, all tuples except the empty tuple are tracked when created. + During garbage collection it is determined whether any surviving tuples + can be untracked. A tuple can be untracked if all of its contents are + already not tracked. Tuples are examined for untracking in all garbage + collection cycles. It may take more than one cycle to untrack a tuple. + + Dictionaries containing only immutable objects also do not need to be + tracked. Dictionaries are untracked when created. If a tracked item is + inserted into a dictionary (either as a key or value), the dictionary + becomes tracked. During a full garbage collection (all generations), + the collector will untrack any dictionaries whose contents are not + tracked. + + The module provides the python function is_tracked(obj), which returns + the CURRENT tracking status of the object. Subsequent garbage + collections may change the tracking status of the object. + + Untracking of certain containers was introduced in issue #4688, and + the algorithm was refined in response to issue #14775. +*/ + +struct gc_generation { + PyGC_Head head; + int threshold; /* collection threshold */ + int count; /* count of allocations or collections of younger + generations */ +}; + +/* Running stats per generation */ +struct gc_generation_stats { + /* total number of collections */ + Py_ssize_t collections; + /* total number of collected objects */ + Py_ssize_t collected; + /* total number of uncollectable objects (put into gc.garbage) */ + Py_ssize_t uncollectable; +}; + +struct _gc_runtime_state { + /* List of objects that still need to be cleaned up, singly linked + * via their gc headers' gc_prev pointers. */ + PyObject *trash_delete_later; + /* Current call-stack depth of tp_dealloc calls. */ + int trash_delete_nesting; + + int enabled; + int debug; + /* linked lists of container objects */ + struct gc_generation generations[NUM_GENERATIONS]; + PyGC_Head *generation0; + /* a permanent generation which won't be collected */ + struct gc_generation permanent_generation; + struct gc_generation_stats generation_stats[NUM_GENERATIONS]; + /* true if we are currently running the collector */ + int collecting; + /* list of uncollectable objects */ + PyObject *garbage; + /* a list of callbacks to be invoked when collection is performed */ + PyObject *callbacks; + /* This is the number of objects that survived the last full + collection. It approximates the number of long lived objects + tracked by the GC. + + (by "full collection", we mean a collection of the oldest + generation). */ + Py_ssize_t long_lived_total; + /* This is the number of objects that survived all "non-full" + collections, and are awaiting to undergo a full collection for + the first time. */ + Py_ssize_t long_lived_pending; +}; + +PyAPI_FUNC(void) _PyGC_InitState(struct _gc_runtime_state *); + + +// Functions to clear types free lists +extern void _PyFrame_ClearFreeList(void); +extern void _PyTuple_ClearFreeList(void); +extern void _PyFloat_ClearFreeList(void); +extern void _PyList_ClearFreeList(void); +extern void _PyDict_ClearFreeList(void); +extern void _PyAsyncGen_ClearFreeLists(void); +extern void _PyContext_ClearFreeList(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_GC_H */ diff --git a/Include/internal/pycore_gil.h b/Include/internal/pycore_gil.h index 7de31639..8ebad37b 100644 --- a/Include/internal/pycore_gil.h +++ b/Include/internal/pycore_gil.h @@ -8,8 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_condvar.h" -#include "pycore_atomic.h" +#include "pycore_atomic.h" /* _Py_atomic_address */ +#include "pycore_condvar.h" /* PyCOND_T */ #ifndef Py_HAVE_CONDVAR # error You need either a POSIX-compatible or a Windows system! diff --git a/Include/internal/pycore_hamt.h b/Include/internal/pycore_hamt.h index e65aef5e..aaf65590 100644 --- a/Include/internal/pycore_hamt.h +++ b/Include/internal/pycore_hamt.h @@ -8,7 +8,7 @@ #define _Py_HAMT_MAX_TREE_DEPTH 7 -#define PyHamt_Check(o) (Py_TYPE(o) == &_PyHamt_Type) +#define PyHamt_Check(o) Py_IS_TYPE(o, &_PyHamt_Type) /* Abstract tree node. */ diff --git a/Include/internal/pycore_hashtable.h b/Include/internal/pycore_hashtable.h new file mode 100644 index 00000000..18757abc --- /dev/null +++ b/Include/internal/pycore_hashtable.h @@ -0,0 +1,148 @@ +#ifndef Py_INTERNAL_HASHTABLE_H +#define Py_INTERNAL_HASHTABLE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +/* Single linked list */ + +typedef struct _Py_slist_item_s { + struct _Py_slist_item_s *next; +} _Py_slist_item_t; + +typedef struct { + _Py_slist_item_t *head; +} _Py_slist_t; + +#define _Py_SLIST_ITEM_NEXT(ITEM) (((_Py_slist_item_t *)ITEM)->next) + +#define _Py_SLIST_HEAD(SLIST) (((_Py_slist_t *)SLIST)->head) + + +/* _Py_hashtable: table entry */ + +typedef struct { + /* used by _Py_hashtable_t.buckets to link entries */ + _Py_slist_item_t _Py_slist_item; + + Py_uhash_t key_hash; + void *key; + void *value; +} _Py_hashtable_entry_t; + + +/* _Py_hashtable: prototypes */ + +/* Forward declaration */ +struct _Py_hashtable_t; +typedef struct _Py_hashtable_t _Py_hashtable_t; + +typedef Py_uhash_t (*_Py_hashtable_hash_func) (const void *key); +typedef int (*_Py_hashtable_compare_func) (const void *key1, const void *key2); +typedef void (*_Py_hashtable_destroy_func) (void *key); +typedef _Py_hashtable_entry_t* (*_Py_hashtable_get_entry_func)(_Py_hashtable_t *ht, + const void *key); + +typedef struct { + // Allocate a memory block + void* (*malloc) (size_t size); + + // Release a memory block + void (*free) (void *ptr); +} _Py_hashtable_allocator_t; + + +/* _Py_hashtable: table */ +struct _Py_hashtable_t { + size_t nentries; // Total number of entries in the table + size_t nbuckets; + _Py_slist_t *buckets; + + _Py_hashtable_get_entry_func get_entry_func; + _Py_hashtable_hash_func hash_func; + _Py_hashtable_compare_func compare_func; + _Py_hashtable_destroy_func key_destroy_func; + _Py_hashtable_destroy_func value_destroy_func; + _Py_hashtable_allocator_t alloc; +}; + +/* Hash a pointer (void*) */ +PyAPI_FUNC(Py_uhash_t) _Py_hashtable_hash_ptr(const void *key); + +/* Comparison using memcmp() */ +PyAPI_FUNC(int) _Py_hashtable_compare_direct( + const void *key1, + const void *key2); + +PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new( + _Py_hashtable_hash_func hash_func, + _Py_hashtable_compare_func compare_func); + +PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new_full( + _Py_hashtable_hash_func hash_func, + _Py_hashtable_compare_func compare_func, + _Py_hashtable_destroy_func key_destroy_func, + _Py_hashtable_destroy_func value_destroy_func, + _Py_hashtable_allocator_t *allocator); + +PyAPI_FUNC(void) _Py_hashtable_destroy(_Py_hashtable_t *ht); + +PyAPI_FUNC(void) _Py_hashtable_clear(_Py_hashtable_t *ht); + +typedef int (*_Py_hashtable_foreach_func) (_Py_hashtable_t *ht, + const void *key, const void *value, + void *user_data); + +/* Call func() on each entry of the hashtable. + Iteration stops if func() result is non-zero, in this case it's the result + of the call. Otherwise, the function returns 0. */ +PyAPI_FUNC(int) _Py_hashtable_foreach( + _Py_hashtable_t *ht, + _Py_hashtable_foreach_func func, + void *user_data); + +PyAPI_FUNC(size_t) _Py_hashtable_size(const _Py_hashtable_t *ht); + +/* Add a new entry to the hash. The key must not be present in the hash table. + Return 0 on success, -1 on memory error. */ +PyAPI_FUNC(int) _Py_hashtable_set( + _Py_hashtable_t *ht, + const void *key, + void *value); + + +/* Get an entry. + Return NULL if the key does not exist. */ +static inline _Py_hashtable_entry_t * +_Py_hashtable_get_entry(_Py_hashtable_t *ht, const void *key) +{ + return ht->get_entry_func(ht, key); +} + + +/* Get value from an entry. + Return NULL if the entry is not found. + + Use _Py_hashtable_get_entry() to distinguish entry value equal to NULL + and entry not found. */ +PyAPI_FUNC(void*) _Py_hashtable_get(_Py_hashtable_t *ht, const void *key); + + +/* Remove a key and its associated value without calling key and value destroy + functions. + + Return the removed value if the key was found. + Return NULL if the key was not found. */ +PyAPI_FUNC(void*) _Py_hashtable_steal( + _Py_hashtable_t *ht, + const void *key); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_HASHTABLE_H */ diff --git a/Include/internal/pycore_import.h b/Include/internal/pycore_import.h new file mode 100644 index 00000000..b011ea44 --- /dev/null +++ b/Include/internal/pycore_import.h @@ -0,0 +1,22 @@ +#ifndef Py_LIMITED_API +#ifndef Py_INTERNAL_IMPORT_H +#define Py_INTERNAL_IMPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) _PyImport_FindBuiltin( + PyThreadState *tstate, + const char *name /* UTF-8 encoded string */ + ); + +#ifdef HAVE_FORK +extern void _PyImport_ReInitLock(void); +#endif +extern void _PyImport_Cleanup(PyThreadState *tstate); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_IMPORT_H */ +#endif /* !Py_LIMITED_API */ diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h index 40831c44..457a0058 100644 --- a/Include/internal/pycore_initconfig.h +++ b/Include/internal/pycore_initconfig.h @@ -8,7 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_pystate.h" /* _PyRuntimeState */ +/* Forward declaration */ +struct pyruntimestate; /* --- PyStatus ----------------------------------------------- */ @@ -60,7 +61,7 @@ PyAPI_FUNC(PyObject*) _PyWideStringList_AsList(const PyWideStringList *list); /* --- _PyArgv ---------------------------------------------------- */ -typedef struct { +typedef struct _PyArgv { Py_ssize_t argc; int use_bytes_argv; char * const *bytes_argv; @@ -149,8 +150,8 @@ extern PyStatus _PyConfig_Copy( PyConfig *config, const PyConfig *config2); extern PyStatus _PyConfig_InitPathConfig(PyConfig *config); -extern void _PyConfig_Write(const PyConfig *config, - _PyRuntimeState *runtime); +extern PyStatus _PyConfig_Write(const PyConfig *config, + struct pyruntimestate *runtime); extern PyStatus _PyConfig_SetPyArgv( PyConfig *config, const _PyArgv *args); diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h new file mode 100644 index 00000000..551ad833 --- /dev/null +++ b/Include/internal/pycore_interp.h @@ -0,0 +1,192 @@ +#ifndef Py_INTERNAL_INTERP_H +#define Py_INTERNAL_INTERP_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_atomic.h" /* _Py_atomic_address */ +#include "pycore_gil.h" /* struct _gil_runtime_state */ +#include "pycore_gc.h" /* struct _gc_runtime_state */ +#include "pycore_warnings.h" /* struct _warnings_runtime_state */ + +/* ceval state */ + +struct _pending_calls { + PyThread_type_lock lock; + /* Request for running pending calls. */ + _Py_atomic_int calls_to_do; + /* Request for looking at the `async_exc` field of the current + thread state. + Guarded by the GIL. */ + int async_exc; +#define NPENDINGCALLS 32 + struct { + int (*func)(void *); + void *arg; + } calls[NPENDINGCALLS]; + int first; + int last; +}; + +struct _ceval_state { + int recursion_limit; + /* Records whether tracing is on for any thread. Counts the number + of threads for which tstate->c_tracefunc is non-NULL, so if the + value is 0, we know we don't have to check this thread's + c_tracefunc. This speeds up the if statement in + _PyEval_EvalFrameDefault() after fast_next_opcode. */ + int tracing_possible; + /* This single variable consolidates all requests to break out of + the fast path in the eval loop. */ + _Py_atomic_int eval_breaker; + /* Request for dropping the GIL */ + _Py_atomic_int gil_drop_request; + struct _pending_calls pending; +}; + +/* fs_codec.encoding is initialized to NULL. + Later, it is set to a non-NULL string by _PyUnicode_InitEncodings(). */ +struct _Py_unicode_fs_codec { + char *encoding; // Filesystem encoding (encoded to UTF-8) + int utf8; // encoding=="utf-8"? + char *errors; // Filesystem errors (encoded to UTF-8) + _Py_error_handler error_handler; +}; + +struct _Py_unicode_state { + struct _Py_unicode_fs_codec fs_codec; +}; + + +/* interpreter state */ + +#define _PY_NSMALLPOSINTS 257 +#define _PY_NSMALLNEGINTS 5 + +// The PyInterpreterState typedef is in Include/pystate.h. +struct _is { + + struct _is *next; + struct _ts *tstate_head; + + /* Reference to the _PyRuntime global variable. This field exists + to not have to pass runtime in addition to tstate to a function. + Get runtime from tstate: tstate->interp->runtime. */ + struct pyruntimestate *runtime; + + int64_t id; + int64_t id_refcount; + int requires_idref; + PyThread_type_lock id_mutex; + + int finalizing; + + struct _ceval_state ceval; + struct _gc_runtime_state gc; + + PyObject *modules; + PyObject *modules_by_index; + PyObject *sysdict; + PyObject *builtins; + PyObject *importlib; + + /* Used in Modules/_threadmodule.c. */ + long num_threads; + /* Support for runtime thread stack size tuning. + A value of 0 means using the platform's default stack size + or the size specified by the THREAD_STACK_SIZE macro. */ + /* Used in Python/thread.c. */ + size_t pythread_stacksize; + + PyObject *codec_search_path; + PyObject *codec_search_cache; + PyObject *codec_error_registry; + int codecs_initialized; + + struct _Py_unicode_state unicode; + + PyConfig config; +#ifdef HAVE_DLOPEN + int dlopenflags; +#endif + + PyObject *dict; /* Stores per-interpreter state */ + + PyObject *builtins_copy; + PyObject *import_func; + /* Initialized to PyEval_EvalFrameDefault(). */ + _PyFrameEvalFunction eval_frame; + + Py_ssize_t co_extra_user_count; + freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; + +#ifdef HAVE_FORK + PyObject *before_forkers; + PyObject *after_forkers_parent; + PyObject *after_forkers_child; +#endif + /* AtExit module */ + void (*pyexitfunc)(PyObject *); + PyObject *pyexitmodule; + + uint64_t tstate_next_unique_id; + + struct _warnings_runtime_state warnings; + + PyObject *audit_hooks; + + struct { + struct { + int level; + int atbol; + } listnode; + } parser; + +#if _PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS > 0 + /* Small integers are preallocated in this array so that they + can be shared. + The integers that are preallocated are those in the range + -_PY_NSMALLNEGINTS (inclusive) to _PY_NSMALLPOSINTS (not inclusive). + */ + PyLongObject* small_ints[_PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS]; +#endif +}; + +/* Used by _PyImport_Cleanup() */ +extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp); + +extern PyStatus _PyInterpreterState_SetConfig( + PyInterpreterState *interp, + const PyConfig *config); + + + +/* cross-interpreter data registry */ + +/* For now we use a global registry of shareable classes. An + alternative would be to add a tp_* slot for a class's + crossinterpdatafunc. It would be simpler and more efficient. */ + +struct _xidregitem; + +struct _xidregitem { + PyTypeObject *cls; + crossinterpdatafunc getdata; + struct _xidregitem *next; +}; + +PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(int64_t); + +PyAPI_FUNC(int) _PyInterpreterState_IDInitref(struct _is *); +PyAPI_FUNC(void) _PyInterpreterState_IDIncref(struct _is *); +PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_INTERP_H */ + diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 7418c693..32e86d06 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -8,7 +8,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_pystate.h" /* _PyRuntime */ +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_interp.h" // PyInterpreterState.gc +#include "pycore_pystate.h" // _PyThreadState_GET() PyAPI_FUNC(int) _PyType_CheckConsistency(PyTypeObject *type); PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); @@ -18,7 +20,7 @@ PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); * NB: While the object is tracked by the collector, it must be safe to call the * ob_traverse method. * - * Internal note: _PyRuntime.gc.generation0->_gc_prev doesn't have any bit flags + * Internal note: interp->gc.generation0->_gc_prev doesn't have any bit flags * because it's not object header. So we don't use _PyGCHead_PREV() and * _PyGCHead_SET_PREV() for it to avoid unnecessary bitwise operations. * @@ -37,11 +39,13 @@ static inline void _PyObject_GC_TRACK_impl(const char *filename, int lineno, "object is in generation which is garbage collected", filename, lineno, "_PyObject_GC_TRACK"); - PyGC_Head *last = (PyGC_Head*)(_PyRuntime.gc.generation0->_gc_prev); + PyThreadState *tstate = _PyThreadState_GET(); + PyGC_Head *generation0 = tstate->interp->gc.generation0; + PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev); _PyGCHead_SET_NEXT(last, gc); _PyGCHead_SET_PREV(gc, last); - _PyGCHead_SET_NEXT(gc, _PyRuntime.gc.generation0); - _PyRuntime.gc.generation0->_gc_prev = (uintptr_t)gc; + _PyGCHead_SET_NEXT(gc, generation0); + generation0->_gc_prev = (uintptr_t)gc; } #define _PyObject_GC_TRACK(op) \ @@ -75,6 +79,41 @@ static inline void _PyObject_GC_UNTRACK_impl(const char *filename, int lineno, #define _PyObject_GC_UNTRACK(op) \ _PyObject_GC_UNTRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op)) +#ifdef Py_REF_DEBUG +extern void _PyDebug_PrintTotalRefs(void); +#endif + +#ifdef Py_TRACE_REFS +extern void _Py_AddToAllObjects(PyObject *op, int force); +extern void _Py_PrintReferences(FILE *); +extern void _Py_PrintReferenceAddresses(FILE *); +#endif + +static inline PyObject ** +_PyObject_GET_WEAKREFS_LISTPTR(PyObject *op) +{ + Py_ssize_t offset = Py_TYPE(op)->tp_weaklistoffset; + return (PyObject **)((char *)op + offset); +} + +// Fast inlined version of PyType_HasFeature() +static inline int +_PyType_HasFeature(PyTypeObject *type, unsigned long feature) { + return ((type->tp_flags & feature) != 0); +} + +// Fast inlined version of PyObject_IS_GC() +static inline int +_PyObject_IS_GC(PyObject *obj) +{ + return (PyType_IS_GC(Py_TYPE(obj)) + && (Py_TYPE(obj)->tp_is_gc == NULL + || Py_TYPE(obj)->tp_is_gc(obj))); +} + +// Fast inlined version of PyType_IS_GC() +#define _PyType_IS_GC(t) _PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index ce75ccee..42d61b1c 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -47,8 +47,6 @@ PyAPI_DATA(wchar_t*) _Py_dll_path; #endif extern void _PyPathConfig_ClearGlobal(void); -extern PyStatus _PyPathConfig_SetGlobal( - const struct _PyPathConfig *pathconfig); extern PyStatus _PyPathConfig_Calculate( _PyPathConfig *pathconfig, @@ -56,11 +54,10 @@ extern PyStatus _PyPathConfig_Calculate( extern int _PyPathConfig_ComputeSysPath0( const PyWideStringList *argv, PyObject **path0); -extern int _Py_FindEnvConfigValue( +extern PyStatus _Py_FindEnvConfigValue( FILE *env_file, const wchar_t *key, - wchar_t *value, - size_t value_size); + wchar_t **value_p); #ifdef MS_WINDOWS extern wchar_t* _Py_GetDLLPath(void); diff --git a/Include/internal/pycore_pyerrors.h b/Include/internal/pycore_pyerrors.h index 23327ef7..2cf1160a 100644 --- a/Include/internal/pycore_pyerrors.h +++ b/Include/internal/pycore_pyerrors.h @@ -10,7 +10,22 @@ extern "C" { static inline PyObject* _PyErr_Occurred(PyThreadState *tstate) { - return tstate == NULL ? NULL : tstate->curexc_type; + assert(tstate != NULL); + return tstate->curexc_type; +} + +static inline void _PyErr_ClearExcState(_PyErr_StackItem *exc_state) +{ + PyObject *t, *v, *tb; + t = exc_state->exc_type; + v = exc_state->exc_value; + tb = exc_state->exc_traceback; + exc_state->exc_type = NULL; + exc_state->exc_value = NULL; + exc_state->exc_traceback = NULL; + Py_XDECREF(t); + Py_XDECREF(v); + Py_XDECREF(tb); } @@ -35,10 +50,15 @@ PyAPI_FUNC(void) _PyErr_SetObject( PyObject *type, PyObject *value); +PyAPI_FUNC(void) _PyErr_ChainStackItem( + _PyErr_StackItem *exc_info); + PyAPI_FUNC(void) _PyErr_Clear(PyThreadState *tstate); PyAPI_FUNC(void) _PyErr_SetNone(PyThreadState *tstate, PyObject *exception); +PyAPI_FUNC(PyObject *) _PyErr_NoMemory(PyThreadState *tstate); + PyAPI_FUNC(void) _PyErr_SetString( PyThreadState *tstate, PyObject *exception, @@ -56,6 +76,14 @@ PyAPI_FUNC(void) _PyErr_NormalizeException( PyObject **val, PyObject **tb); +PyAPI_FUNC(PyObject *) _PyErr_FormatFromCauseTstate( + PyThreadState *tstate, + PyObject *exception, + const char *format, + ...); + +PyAPI_FUNC(int) _PyErr_CheckSignalsTstate(PyThreadState *tstate); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index d4f0ae2d..b76bb2c7 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -8,8 +8,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_initconfig.h" /* _PyArgv */ -#include "pycore_pystate.h" /* _PyRuntimeState */ +/* Forward declarations */ +struct _PyArgv; +struct pyruntimestate; /* True if the main interpreter thread exited due to an unhandled * KeyboardInterrupt exception, suggesting the user pressed ^C. */ @@ -32,74 +33,68 @@ PyAPI_FUNC(int) _Py_IsLocaleCoercionTarget(const char *ctype_loc); extern PyStatus _PyUnicode_Init(void); extern int _PyStructSequence_Init(void); -extern int _PyLong_Init(void); +extern int _PyLong_Init(PyThreadState *tstate); extern PyStatus _PyFaulthandler_Init(int enable); extern int _PyTraceMalloc_Init(int enable); -extern PyObject * _PyBuiltin_Init(void); +extern PyObject * _PyBuiltin_Init(PyThreadState *tstate); extern PyStatus _PySys_Create( - _PyRuntimeState *runtime, - PyInterpreterState *interp, + PyThreadState *tstate, PyObject **sysmod_p); -extern PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict); extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options); extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config); -extern int _PySys_InitMain( - _PyRuntimeState *runtime, - PyInterpreterState *interp); -extern PyStatus _PyImport_Init(PyInterpreterState *interp); +extern int _PySys_InitMain(PyThreadState *tstate); extern PyStatus _PyExc_Init(void); extern PyStatus _PyErr_Init(void); extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod); -extern PyStatus _PyImportHooks_Init(void); +extern PyStatus _PyImportHooks_Init(PyThreadState *tstate); extern int _PyFloat_Init(void); extern PyStatus _Py_HashRandomization_Init(const PyConfig *); extern PyStatus _PyTypes_Init(void); -extern PyStatus _PyImportZip_Init(PyInterpreterState *interp); +extern PyStatus _PyTypes_InitSlotDefs(void); +extern PyStatus _PyImportZip_Init(PyThreadState *tstate); +extern PyStatus _PyGC_Init(PyThreadState *tstate); /* Various internal finalizers */ -extern void PyMethod_Fini(void); -extern void PyFrame_Fini(void); -extern void PyCFunction_Fini(void); -extern void PyDict_Fini(void); -extern void PyTuple_Fini(void); -extern void PyList_Fini(void); -extern void PySet_Fini(void); -extern void PyBytes_Fini(void); -extern void PyFloat_Fini(void); +extern void _PyFrame_Fini(void); +extern void _PyDict_Fini(void); +extern void _PyTuple_Fini(void); +extern void _PyList_Fini(void); +extern void _PySet_Fini(void); +extern void _PyBytes_Fini(void); +extern void _PyFloat_Fini(void); +extern void _PySlice_Fini(void); +extern void _PyAsyncGen_Fini(void); + extern void PyOS_FiniInterrupts(void); -extern void PySlice_Fini(void); -extern void PyAsyncGen_Fini(void); extern void _PyExc_Fini(void); extern void _PyImport_Fini(void); extern void _PyImport_Fini2(void); -extern void _PyGC_Fini(_PyRuntimeState *runtime); +extern void _PyGC_Fini(PyThreadState *tstate); extern void _PyType_Fini(void); extern void _Py_HashRandomization_Fini(void); -extern void _PyUnicode_Fini(void); -extern void PyLong_Fini(void); +extern void _PyUnicode_Fini(PyThreadState *tstate); +extern void _PyLong_Fini(PyThreadState *tstate); extern void _PyFaulthandler_Fini(void); extern void _PyHash_Fini(void); extern void _PyTraceMalloc_Fini(void); extern void _PyWarnings_Fini(PyInterpreterState *interp); +extern void _PyAST_Fini(void); -extern void _PyGILState_Init( - _PyRuntimeState *runtime, - PyInterpreterState *interp, - PyThreadState *tstate); -extern void _PyGILState_Fini(_PyRuntimeState *runtime); +extern PyStatus _PyGILState_Init(PyThreadState *tstate); +extern void _PyGILState_Fini(PyThreadState *tstate); -PyAPI_FUNC(void) _PyGC_DumpShutdownStats(_PyRuntimeState *runtime); +PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyThreadState *tstate); PyAPI_FUNC(PyStatus) _Py_PreInitializeFromPyArgv( const PyPreConfig *src_config, - const _PyArgv *args); + const struct _PyArgv *args); PyAPI_FUNC(PyStatus) _Py_PreInitializeFromConfig( const PyConfig *config, - const _PyArgv *args); + const struct _PyArgv *args); PyAPI_FUNC(int) _Py_HandleSystemExit(int *exitcode_p); @@ -110,6 +105,8 @@ PyAPI_FUNC(void) _PyErr_Print(PyThreadState *tstate); PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception, PyObject *value, PyObject *tb); +PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index 47d092f3..3d925e22 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -8,144 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "objimpl.h" -#include "pymem.h" - - -/* GC runtime state */ - -/* If we change this, we need to change the default value in the - signature of gc.collect. */ -#define NUM_GENERATIONS 3 - -/* - NOTE: about the counting of long-lived objects. - - To limit the cost of garbage collection, there are two strategies; - - make each collection faster, e.g. by scanning fewer objects - - do less collections - This heuristic is about the latter strategy. - - In addition to the various configurable thresholds, we only trigger a - full collection if the ratio - long_lived_pending / long_lived_total - is above a given value (hardwired to 25%). - - The reason is that, while "non-full" collections (i.e., collections of - the young and middle generations) will always examine roughly the same - number of objects -- determined by the aforementioned thresholds --, - the cost of a full collection is proportional to the total number of - long-lived objects, which is virtually unbounded. - - Indeed, it has been remarked that doing a full collection every - of object creations entails a dramatic performance - degradation in workloads which consist in creating and storing lots of - long-lived objects (e.g. building a large list of GC-tracked objects would - show quadratic performance, instead of linear as expected: see issue #4074). - - Using the above ratio, instead, yields amortized linear performance in - the total number of objects (the effect of which can be summarized - thusly: "each full garbage collection is more and more costly as the - number of objects grows, but we do fewer and fewer of them"). - - This heuristic was suggested by Martin von Löwis on python-dev in - June 2008. His original analysis and proposal can be found at: - http://mail.python.org/pipermail/python-dev/2008-June/080579.html -*/ - -/* - NOTE: about untracking of mutable objects. - - Certain types of container cannot participate in a reference cycle, and - so do not need to be tracked by the garbage collector. Untracking these - objects reduces the cost of garbage collections. However, determining - which objects may be untracked is not free, and the costs must be - weighed against the benefits for garbage collection. - - There are two possible strategies for when to untrack a container: - - i) When the container is created. - ii) When the container is examined by the garbage collector. - - Tuples containing only immutable objects (integers, strings etc, and - recursively, tuples of immutable objects) do not need to be tracked. - The interpreter creates a large number of tuples, many of which will - not survive until garbage collection. It is therefore not worthwhile - to untrack eligible tuples at creation time. - - Instead, all tuples except the empty tuple are tracked when created. - During garbage collection it is determined whether any surviving tuples - can be untracked. A tuple can be untracked if all of its contents are - already not tracked. Tuples are examined for untracking in all garbage - collection cycles. It may take more than one cycle to untrack a tuple. - - Dictionaries containing only immutable objects also do not need to be - tracked. Dictionaries are untracked when created. If a tracked item is - inserted into a dictionary (either as a key or value), the dictionary - becomes tracked. During a full garbage collection (all generations), - the collector will untrack any dictionaries whose contents are not - tracked. - - The module provides the python function is_tracked(obj), which returns - the CURRENT tracking status of the object. Subsequent garbage - collections may change the tracking status of the object. - - Untracking of certain containers was introduced in issue #4688, and - the algorithm was refined in response to issue #14775. -*/ - -struct gc_generation { - PyGC_Head head; - int threshold; /* collection threshold */ - int count; /* count of allocations or collections of younger - generations */ -}; - -/* Running stats per generation */ -struct gc_generation_stats { - /* total number of collections */ - Py_ssize_t collections; - /* total number of collected objects */ - Py_ssize_t collected; - /* total number of uncollectable objects (put into gc.garbage) */ - Py_ssize_t uncollectable; -}; - -struct _gc_runtime_state { - /* List of objects that still need to be cleaned up, singly linked - * via their gc headers' gc_prev pointers. */ - PyObject *trash_delete_later; - /* Current call-stack depth of tp_dealloc calls. */ - int trash_delete_nesting; - - int enabled; - int debug; - /* linked lists of container objects */ - struct gc_generation generations[NUM_GENERATIONS]; - PyGC_Head *generation0; - /* a permanent generation which won't be collected */ - struct gc_generation permanent_generation; - struct gc_generation_stats generation_stats[NUM_GENERATIONS]; - /* true if we are currently running the collector */ - int collecting; - /* list of uncollectable objects */ - PyObject *garbage; - /* a list of callbacks to be invoked when collection is performed */ - PyObject *callbacks; - /* This is the number of objects that survived the last full - collection. It approximates the number of long lived objects - tracked by the GC. - - (by "full collection", we mean a collection of the oldest - generation). */ - Py_ssize_t long_lived_total; - /* This is the number of objects that survived all "non-full" - collections, and are awaiting to undergo a full collection for - the first time. */ - Py_ssize_t long_lived_pending; -}; - -PyAPI_FUNC(void) _PyGC_Initialize(struct _gc_runtime_state *); +#include "pymem.h" // PyMemAllocatorName /* Set the memory allocator of the specified domain to the default. @@ -206,6 +69,35 @@ PyAPI_FUNC(int) _PyMem_GetAllocatorName( PYMEM_ALLOCATOR_NOT_SET does nothing. */ PyAPI_FUNC(int) _PyMem_SetupAllocators(PyMemAllocatorName allocator); +/* bpo-35053: Expose _Py_tracemalloc_config for _Py_NewReference() + which access directly _Py_tracemalloc_config.tracing for best + performances. */ +struct _PyTraceMalloc_Config { + /* Module initialized? + Variable protected by the GIL */ + enum { + TRACEMALLOC_NOT_INITIALIZED, + TRACEMALLOC_INITIALIZED, + TRACEMALLOC_FINALIZED + } initialized; + + /* Is tracemalloc tracing memory allocations? + Variable protected by the GIL */ + int tracing; + + /* limit of the number of frames in a traceback, 1 by default. + Variable protected by the GIL. */ + int max_nframe; +}; + +#define _PyTraceMalloc_Config_INIT \ + {.initialized = TRACEMALLOC_NOT_INITIALIZED, \ + .tracing = 0, \ + .max_nframe = 1} + +PyAPI_DATA(struct _PyTraceMalloc_Config) _Py_tracemalloc_config; + + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 96d5e31d..835d6e02 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -8,270 +8,52 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "cpython/initconfig.h" -#include "fileobject.h" -#include "pystate.h" -#include "pythread.h" -#include "sysmodule.h" - -#include "pycore_gil.h" /* _gil_runtime_state */ -#include "pycore_pathconfig.h" -#include "pycore_pymem.h" -#include "pycore_warnings.h" - - -/* ceval state */ - -struct _pending_calls { - int finishing; - PyThread_type_lock lock; - /* Request for running pending calls. */ - _Py_atomic_int calls_to_do; - /* Request for looking at the `async_exc` field of the current - thread state. - Guarded by the GIL. */ - int async_exc; -#define NPENDINGCALLS 32 - struct { - int (*func)(void *); - void *arg; - } calls[NPENDINGCALLS]; - int first; - int last; -}; - -struct _ceval_runtime_state { - int recursion_limit; - /* Records whether tracing is on for any thread. Counts the number - of threads for which tstate->c_tracefunc is non-NULL, so if the - value is 0, we know we don't have to check this thread's - c_tracefunc. This speeds up the if statement in - PyEval_EvalFrameEx() after fast_next_opcode. */ - int tracing_possible; - /* This single variable consolidates all requests to break out of - the fast path in the eval loop. */ - _Py_atomic_int eval_breaker; - /* Request for dropping the GIL */ - _Py_atomic_int gil_drop_request; - struct _pending_calls pending; - /* Request for checking signals. */ - _Py_atomic_int signals_pending; - struct _gil_runtime_state gil; -}; - -/* interpreter state */ - -typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int); - -// The PyInterpreterState typedef is in Include/pystate.h. -struct _is { - - struct _is *next; - struct _ts *tstate_head; - - int64_t id; - int64_t id_refcount; - int requires_idref; - PyThread_type_lock id_mutex; - - int finalizing; - - PyObject *modules; - PyObject *modules_by_index; - PyObject *sysdict; - PyObject *builtins; - PyObject *importlib; - - /* Used in Python/sysmodule.c. */ - int check_interval; - - /* Used in Modules/_threadmodule.c. */ - long num_threads; - /* Support for runtime thread stack size tuning. - A value of 0 means using the platform's default stack size - or the size specified by the THREAD_STACK_SIZE macro. */ - /* Used in Python/thread.c. */ - size_t pythread_stacksize; - - PyObject *codec_search_path; - PyObject *codec_search_cache; - PyObject *codec_error_registry; - int codecs_initialized; - - /* fs_codec.encoding is initialized to NULL. - Later, it is set to a non-NULL string by _PyUnicode_InitEncodings(). */ - struct { - char *encoding; /* Filesystem encoding (encoded to UTF-8) */ - char *errors; /* Filesystem errors (encoded to UTF-8) */ - _Py_error_handler error_handler; - } fs_codec; - - PyConfig config; -#ifdef HAVE_DLOPEN - int dlopenflags; -#endif - - PyObject *dict; /* Stores per-interpreter state */ - - PyObject *builtins_copy; - PyObject *import_func; - /* Initialized to PyEval_EvalFrameDefault(). */ - _PyFrameEvalFunction eval_frame; - - Py_ssize_t co_extra_user_count; - freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; - -#ifdef HAVE_FORK - PyObject *before_forkers; - PyObject *after_forkers_parent; - PyObject *after_forkers_child; -#endif - /* AtExit module */ - void (*pyexitfunc)(PyObject *); - PyObject *pyexitmodule; - - uint64_t tstate_next_unique_id; - - struct _warnings_runtime_state warnings; - - PyObject *audit_hooks; -}; - -PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(PY_INT64_T); - -PyAPI_FUNC(int) _PyInterpreterState_IDInitref(struct _is *); -PyAPI_FUNC(void) _PyInterpreterState_IDIncref(struct _is *); -PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *); - - -/* cross-interpreter data registry */ - -/* For now we use a global registry of shareable classes. An - alternative would be to add a tp_* slot for a class's - crossinterpdatafunc. It would be simpler and more efficient. */ - -struct _xidregitem; - -struct _xidregitem { - PyTypeObject *cls; - crossinterpdatafunc getdata; - struct _xidregitem *next; -}; - -/* runtime audit hook state */ - -typedef struct _Py_AuditHookEntry { - struct _Py_AuditHookEntry *next; - Py_AuditHookFunction hookCFunction; - void *userData; -} _Py_AuditHookEntry; - -/* GIL state */ - -struct _gilstate_runtime_state { - int check_enabled; - /* Assuming the current thread holds the GIL, this is the - PyThreadState for the current thread. */ - _Py_atomic_address tstate_current; - PyThreadFrameGetter getframe; - /* The single PyInterpreterState used by this process' - GILState implementation - */ - /* TODO: Given interp_main, it may be possible to kill this ref */ - PyInterpreterState *autoInterpreterState; - Py_tss_t autoTSSkey; -}; - -/* hook for PyEval_GetFrame(), requested for Psyco */ -#define _PyThreadState_GetFrame _PyRuntime.gilstate.getframe - -/* Issue #26558: Flag to disable PyGILState_Check(). - If set to non-zero, PyGILState_Check() always return 1. */ -#define _PyGILState_check_enabled _PyRuntime.gilstate.check_enabled - - -/* Full Python runtime state */ +#include "pycore_runtime.h" /* PyRuntimeState */ -typedef struct pyruntimestate { - /* Is running Py_PreInitialize()? */ - int preinitializing; - /* Is Python preinitialized? Set to 1 by Py_PreInitialize() */ - int preinitialized; - - /* Is Python core initialized? Set to 1 by _Py_InitializeCore() */ - int core_initialized; - - /* Is Python fully initialized? Set to 1 by Py_Initialize() */ - int initialized; - - /* Set by Py_FinalizeEx(). Only reset to NULL if Py_Initialize() - is called again. */ - PyThreadState *finalizing; - - struct pyinterpreters { - PyThread_type_lock mutex; - PyInterpreterState *head; - PyInterpreterState *main; - /* _next_interp_id is an auto-numbered sequence of small - integers. It gets initialized in _PyInterpreterState_Init(), - which is called in Py_Initialize(), and used in - PyInterpreterState_New(). A negative interpreter ID - indicates an error occurred. The main interpreter will - always have an ID of 0. Overflow results in a RuntimeError. - If that becomes a problem later then we can adjust, e.g. by - using a Python int. */ - int64_t next_id; - } interpreters; - // XXX Remove this field once we have a tp_* slot. - struct _xidregistry { - PyThread_type_lock mutex; - struct _xidregitem *head; - } xidregistry; - - unsigned long main_thread; +/* Check if the current thread is the main thread. + Use _Py_IsMainInterpreter() to check if it's the main interpreter. */ +static inline int +_Py_IsMainThread(void) +{ + unsigned long thread = PyThread_get_thread_ident(); + return (thread == _PyRuntime.main_thread); +} -#define NEXITFUNCS 32 - void (*exitfuncs[NEXITFUNCS])(void); - int nexitfuncs; - struct _gc_runtime_state gc; - struct _ceval_runtime_state ceval; - struct _gilstate_runtime_state gilstate; +static inline int +_Py_IsMainInterpreter(PyThreadState* tstate) +{ + /* Use directly _PyRuntime rather than tstate->interp->runtime, since + this function is used in performance critical code path (ceval) */ + return (tstate->interp == _PyRuntime.interpreters.main); +} - PyPreConfig preconfig; - Py_OpenCodeHookFunction open_code_hook; - void *open_code_userdata; - _Py_AuditHookEntry *audit_hook_head; +/* Only handle signals on the main thread of the main interpreter. */ +static inline int +_Py_ThreadCanHandleSignals(PyInterpreterState *interp) +{ + return (_Py_IsMainThread() && interp == _PyRuntime.interpreters.main); +} - // XXX Consolidate globals found via the check-c-globals script. -} _PyRuntimeState; - -#define _PyRuntimeState_INIT \ - {.preinitialized = 0, .core_initialized = 0, .initialized = 0} -/* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */ - -PyAPI_DATA(_PyRuntimeState) _PyRuntime; -PyAPI_FUNC(PyStatus) _PyRuntimeState_Init(_PyRuntimeState *runtime); -PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *runtime); -PyAPI_FUNC(void) _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime); -/* Initialize _PyRuntimeState. - Return NULL on success, or return an error message on failure. */ -PyAPI_FUNC(PyStatus) _PyRuntime_Initialize(void); - -PyAPI_FUNC(void) _PyRuntime_Finalize(void); - -#define _Py_CURRENTLY_FINALIZING(runtime, tstate) \ - (runtime->finalizing == tstate) +/* Only execute pending calls on the main thread. */ +static inline int +_Py_ThreadCanHandlePendingCalls(void) +{ + return _Py_IsMainThread(); +} /* Variable and macro for in-line access to current thread and interpreter state */ -#define _PyRuntimeState_GetThreadState(runtime) \ - ((PyThreadState*)_Py_atomic_load_relaxed(&(runtime)->gilstate.tstate_current)) +static inline PyThreadState* +_PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) +{ + return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current); +} /* Get the current Python thread state. @@ -282,12 +64,31 @@ PyAPI_FUNC(void) _PyRuntime_Finalize(void); The caller must hold the GIL. See also PyThreadState_Get() and PyThreadState_GET(). */ -#define _PyThreadState_GET() _PyRuntimeState_GetThreadState(&_PyRuntime) +static inline PyThreadState* +_PyThreadState_GET(void) +{ + return _PyRuntimeState_GetThreadState(&_PyRuntime); +} /* Redefine PyThreadState_GET() as an alias to _PyThreadState_GET() */ #undef PyThreadState_GET #define PyThreadState_GET() _PyThreadState_GET() +PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalError_TstateNULL(const char *func); + +static inline void +_Py_EnsureFuncTstateNotNULL(const char *func, PyThreadState *tstate) +{ + if (tstate == NULL) { + _Py_FatalError_TstateNULL(func); + } +} + +// Call Py_FatalError() if tstate is NULL +#define _Py_EnsureTstateNotNULL(tstate) \ + _Py_EnsureFuncTstateNotNULL(__func__, tstate) + + /* Get the current interpreter state. The macro is unsafe: it does not check for error and it can return NULL. @@ -296,13 +97,18 @@ PyAPI_FUNC(void) _PyRuntime_Finalize(void); See also _PyInterpreterState_Get() and _PyGILState_GetInterpreterStateUnsafe(). */ -#define _PyInterpreterState_GET_UNSAFE() (_PyThreadState_GET()->interp) +static inline PyInterpreterState* _PyInterpreterState_GET(void) { + PyThreadState *tstate = _PyThreadState_GET(); +#ifdef Py_DEBUG + _Py_EnsureTstateNotNULL(tstate); +#endif + return tstate->interp; +} /* Other */ PyAPI_FUNC(void) _PyThreadState_Init( - _PyRuntimeState *runtime, PyThreadState *tstate); PyAPI_FUNC(void) _PyThreadState_DeleteExcept( _PyRuntimeState *runtime, @@ -318,6 +124,12 @@ PyAPI_FUNC(void) _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyGILState_Reinit(_PyRuntimeState *runtime); +PyAPI_FUNC(int) _PyState_AddModule( + PyThreadState *tstate, + PyObject* module, + struct PyModuleDef* def); + + PyAPI_FUNC(int) _PyOS_InterruptOccurred(PyThreadState *tstate); #ifdef __cplusplus diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h new file mode 100644 index 00000000..34eb492b --- /dev/null +++ b/Include/internal/pycore_runtime.h @@ -0,0 +1,144 @@ +#ifndef Py_INTERNAL_RUNTIME_H +#define Py_INTERNAL_RUNTIME_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_atomic.h" /* _Py_atomic_address */ +#include "pycore_gil.h" // struct _gil_runtime_state + +/* ceval state */ + +struct _ceval_runtime_state { + /* Request for checking signals. It is shared by all interpreters (see + bpo-40513). Any thread of any interpreter can receive a signal, but only + the main thread of the main interpreter can handle signals: see + _Py_ThreadCanHandleSignals(). */ + _Py_atomic_int signals_pending; + struct _gil_runtime_state gil; +}; + +/* GIL state */ + +struct _gilstate_runtime_state { + /* bpo-26558: Flag to disable PyGILState_Check(). + If set to non-zero, PyGILState_Check() always return 1. */ + int check_enabled; + /* Assuming the current thread holds the GIL, this is the + PyThreadState for the current thread. */ + _Py_atomic_address tstate_current; + /* The single PyInterpreterState used by this process' + GILState implementation + */ + /* TODO: Given interp_main, it may be possible to kill this ref */ + PyInterpreterState *autoInterpreterState; + Py_tss_t autoTSSkey; +}; + +/* Runtime audit hook state */ + +typedef struct _Py_AuditHookEntry { + struct _Py_AuditHookEntry *next; + Py_AuditHookFunction hookCFunction; + void *userData; +} _Py_AuditHookEntry; + +/* Full Python runtime state */ + +typedef struct pyruntimestate { + /* Is running Py_PreInitialize()? */ + int preinitializing; + + /* Is Python preinitialized? Set to 1 by Py_PreInitialize() */ + int preinitialized; + + /* Is Python core initialized? Set to 1 by _Py_InitializeCore() */ + int core_initialized; + + /* Is Python fully initialized? Set to 1 by Py_Initialize() */ + int initialized; + + /* Set by Py_FinalizeEx(). Only reset to NULL if Py_Initialize() + is called again. + + Use _PyRuntimeState_GetFinalizing() and _PyRuntimeState_SetFinalizing() + to access it, don't access it directly. */ + _Py_atomic_address _finalizing; + + struct pyinterpreters { + PyThread_type_lock mutex; + PyInterpreterState *head; + PyInterpreterState *main; + /* _next_interp_id is an auto-numbered sequence of small + integers. It gets initialized in _PyInterpreterState_Init(), + which is called in Py_Initialize(), and used in + PyInterpreterState_New(). A negative interpreter ID + indicates an error occurred. The main interpreter will + always have an ID of 0. Overflow results in a RuntimeError. + If that becomes a problem later then we can adjust, e.g. by + using a Python int. */ + int64_t next_id; + } interpreters; + // XXX Remove this field once we have a tp_* slot. + struct _xidregistry { + PyThread_type_lock mutex; + struct _xidregitem *head; + } xidregistry; + + unsigned long main_thread; + +#define NEXITFUNCS 32 + void (*exitfuncs[NEXITFUNCS])(void); + int nexitfuncs; + + struct _ceval_runtime_state ceval; + 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; + +#define _PyRuntimeState_INIT \ + {.preinitialized = 0, .core_initialized = 0, .initialized = 0} +/* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */ + + +PyAPI_DATA(_PyRuntimeState) _PyRuntime; + +PyAPI_FUNC(PyStatus) _PyRuntimeState_Init(_PyRuntimeState *runtime); +PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *runtime); + +#ifdef HAVE_FORK +PyAPI_FUNC(void) _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime); +#endif + +/* Initialize _PyRuntimeState. + Return NULL on success, or return an error message on failure. */ +PyAPI_FUNC(PyStatus) _PyRuntime_Initialize(void); + +PyAPI_FUNC(void) _PyRuntime_Finalize(void); + + +static inline PyThreadState* +_PyRuntimeState_GetFinalizing(_PyRuntimeState *runtime) { + return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->_finalizing); +} + +static inline void +_PyRuntimeState_SetFinalizing(_PyRuntimeState *runtime, PyThreadState *tstate) { + _Py_atomic_store_relaxed(&runtime->_finalizing, (uintptr_t)tstate); +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_RUNTIME_H */ diff --git a/Include/internal/pycore_sysmodule.h b/Include/internal/pycore_sysmodule.h new file mode 100644 index 00000000..738a7746 --- /dev/null +++ b/Include/internal/pycore_sysmodule.h @@ -0,0 +1,24 @@ +#ifndef Py_INTERNAL_SYSMODULE_H +#define Py_INTERNAL_SYSMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +PyAPI_FUNC(int) _PySys_Audit( + PyThreadState *tstate, + const char *event, + const char *argFormat, + ...); + +/* We want minimal exposure of this function, so use extern rather than + PyAPI_FUNC() to not export the symbol. */ +extern void _PySys_ClearAuditHooks(PyThreadState *tstate); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_SYSMODULE_H */ diff --git a/Include/internal/pycore_traceback.h b/Include/internal/pycore_traceback.h index bf4d7fe5..1f092411 100644 --- a/Include/internal/pycore_traceback.h +++ b/Include/internal/pycore_traceback.h @@ -8,7 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pystate.h" /* PyInterpreterState */ +/* Forward declaration */ +struct _is; /* Write the Python traceback into the file 'fd'. For example: @@ -56,7 +57,7 @@ PyAPI_FUNC(void) _Py_DumpTraceback( PyAPI_FUNC(const char*) _Py_DumpTracebackThreads( int fd, - PyInterpreterState *interp, + struct _is *interp, PyThreadState *current_tstate); /* Write a Unicode object into the file descriptor fd. Encode the string to @@ -88,7 +89,7 @@ PyAPI_FUNC(void) _Py_DumpHexadecimal( PyAPI_FUNC(PyObject*) _PyTraceBack_FromFrame( PyObject *tb_next, - struct _frame *frame); + PyFrameObject *frame); #ifdef __cplusplus } diff --git a/Include/internal/pycore_tupleobject.h b/Include/internal/pycore_tupleobject.h index 9fcfc5c6..f95f16c0 100644 --- a/Include/internal/pycore_tupleobject.h +++ b/Include/internal/pycore_tupleobject.h @@ -8,7 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "tupleobject.h" +#include "tupleobject.h" /* _PyTuple_CAST() */ #define _PyTuple_ITEMS(op) (_PyTuple_CAST(op)->ob_item) PyAPI_FUNC(PyObject *) _PyTuple_FromArray(PyObject *const *, Py_ssize_t); diff --git a/Include/internal/pycore_warnings.h b/Include/internal/pycore_warnings.h index 73e5350a..cafe305e 100644 --- a/Include/internal/pycore_warnings.h +++ b/Include/internal/pycore_warnings.h @@ -8,8 +8,6 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "object.h" - struct _warnings_runtime_state { /* Both 'filters' and 'onceregistry' can be set in warnings.py; get_warnings_attr() will reset these variables accordingly. */ @@ -19,6 +17,8 @@ struct _warnings_runtime_state { long filters_version; }; +extern PyStatus _PyWarnings_InitState(PyThreadState *tstate); + #ifdef __cplusplus } #endif diff --git a/Include/iterobject.h b/Include/iterobject.h index f61726f1..51139bf1 100644 --- a/Include/iterobject.h +++ b/Include/iterobject.h @@ -7,14 +7,13 @@ extern "C" { PyAPI_DATA(PyTypeObject) PySeqIter_Type; PyAPI_DATA(PyTypeObject) PyCallIter_Type; -PyAPI_DATA(PyTypeObject) PyCmpWrapper_Type; -#define PySeqIter_Check(op) (Py_TYPE(op) == &PySeqIter_Type) +#define PySeqIter_Check(op) Py_IS_TYPE(op, &PySeqIter_Type) PyAPI_FUNC(PyObject *) PySeqIter_New(PyObject *); -#define PyCallIter_Check(op) (Py_TYPE(op) == &PyCallIter_Type) +#define PyCallIter_Check(op) Py_IS_TYPE(op, &PyCallIter_Type) PyAPI_FUNC(PyObject *) PyCallIter_New(PyObject *, PyObject *); diff --git a/Include/listobject.h b/Include/listobject.h index 6057279d..2a8a2552 100644 --- a/Include/listobject.h +++ b/Include/listobject.h @@ -1,16 +1,14 @@ +/* List object interface -/* List object interface */ + Another generally useful object type is a list of object pointers. + This is a mutable type: the list items can be changed, and items can be + added or removed. Out-of-range indices or non-list objects are ignored. -/* -Another generally useful object type is a list of object pointers. -This is a mutable type: the list items can be changed, and items can be -added or removed. Out-of-range indices or non-list objects are ignored. - -*** WARNING *** PyList_SetItem does not increment the new item's reference -count, but does decrement the reference count of the item it replaces, -if not nil. It does *decrement* the reference count if it is *not* -inserted in the list. Similarly, PyList_GetItem does not increment the -returned item's reference count. + WARNING: PyList_SetItem does not increment the new item's reference count, + but does decrement the reference count of the item it replaces, if not nil. + It does *decrement* the reference count if it is *not* inserted in the list. + Similarly, PyList_GetItem does not increment the returned item's reference + count. */ #ifndef Py_LISTOBJECT_H @@ -19,60 +17,33 @@ returned item's reference count. extern "C" { #endif -#ifndef Py_LIMITED_API -typedef struct { - PyObject_VAR_HEAD - /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ - PyObject **ob_item; - - /* ob_item contains space for 'allocated' elements. The number - * currently in use is ob_size. - * Invariants: - * 0 <= ob_size <= allocated - * len(list) == ob_size - * ob_item == NULL implies ob_size == allocated == 0 - * list.sort() temporarily sets allocated to -1 to detect mutations. - * - * Items must normally not be NULL, except during construction when - * the list is not yet visible outside the function that builds it. - */ - Py_ssize_t allocated; -} PyListObject; -#endif - PyAPI_DATA(PyTypeObject) PyList_Type; PyAPI_DATA(PyTypeObject) PyListIter_Type; PyAPI_DATA(PyTypeObject) PyListRevIter_Type; -PyAPI_DATA(PyTypeObject) PySortWrapper_Type; #define PyList_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) -#define PyList_CheckExact(op) (Py_TYPE(op) == &PyList_Type) +#define PyList_CheckExact(op) Py_IS_TYPE(op, &PyList_Type) PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size); PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *); + PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t); PyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *); + PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); PyAPI_FUNC(int) PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); + PyAPI_FUNC(int) PyList_Sort(PyObject *); PyAPI_FUNC(int) PyList_Reverse(PyObject *); PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *); -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); - -PyAPI_FUNC(int) PyList_ClearFreeList(void); -PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); -#endif -/* Macro, trading safety for speed */ #ifndef Py_LIMITED_API -#define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i]) -#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v)) -#define PyList_GET_SIZE(op) (assert(PyList_Check(op)),Py_SIZE(op)) -#define _PyList_ITEMS(op) (((PyListObject *)(op))->ob_item) +# define Py_CPYTHON_LISTOBJECT_H +# include "cpython/listobject.h" +# undef Py_CPYTHON_LISTOBJECT_H #endif #ifdef __cplusplus diff --git a/Include/longobject.h b/Include/longobject.h index 1e7a58d9..1b288099 100644 --- a/Include/longobject.h +++ b/Include/longobject.h @@ -13,7 +13,7 @@ PyAPI_DATA(PyTypeObject) PyLong_Type; #define PyLong_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LONG_SUBCLASS) -#define PyLong_CheckExact(op) (Py_TYPE(op) == &PyLong_Type) +#define PyLong_CheckExact(op) Py_IS_TYPE(op, &PyLong_Type) PyAPI_FUNC(PyObject *) PyLong_FromLong(long); PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long); @@ -74,7 +74,7 @@ PyAPI_FUNC(int) _PyLong_Size_t_Converter(PyObject *, void *); #endif /* Used by Python/mystrtoul.c, _PyBytes_FromHex(), - _PyBytes_DecodeEscapeRecode(), etc. */ + _PyBytes_DecodeEscape(), etc. */ #ifndef Py_LIMITED_API PyAPI_DATA(unsigned char) _PyLong_DigitValue[256]; #endif diff --git a/Include/memoryobject.h b/Include/memoryobject.h index 990a716f..306028f4 100644 --- a/Include/memoryobject.h +++ b/Include/memoryobject.h @@ -11,7 +11,7 @@ PyAPI_DATA(PyTypeObject) _PyManagedBuffer_Type; #endif PyAPI_DATA(PyTypeObject) PyMemoryView_Type; -#define PyMemoryView_Check(op) (Py_TYPE(op) == &PyMemoryView_Type) +#define PyMemoryView_Check(op) Py_IS_TYPE(op, &PyMemoryView_Type) #ifndef Py_LIMITED_API /* Get a pointer to the memoryview's private copy of the exporter's buffer. */ diff --git a/Include/methodobject.h b/Include/methodobject.h index ba3b8878..12e049b4 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -13,7 +13,8 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyCFunction_Type; -#define PyCFunction_Check(op) (Py_TYPE(op) == &PyCFunction_Type) +#define PyCFunction_CheckExact(op) Py_IS_TYPE(op, &PyCFunction_Type) +#define PyCFunction_Check(op) PyObject_TypeCheck(op, &PyCFunction_Type) typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); typedef PyObject *(*_PyCFunctionFast) (PyObject *, PyObject *const *, Py_ssize_t); @@ -22,31 +23,14 @@ typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *, typedef PyObject *(*_PyCFunctionFastWithKeywords) (PyObject *, PyObject *const *, Py_ssize_t, PyObject *); -typedef PyObject *(*PyNoArgsFunction)(PyObject *); +typedef PyObject *(*PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, + size_t, PyObject *); PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *); -/* Macros for direct access to these values. Type checks are *not* - done, so use with care. */ -#ifndef Py_LIMITED_API -#define PyCFunction_GET_FUNCTION(func) \ - (((PyCFunctionObject *)func) -> m_ml -> ml_meth) -#define PyCFunction_GET_SELF(func) \ - (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_STATIC ? \ - NULL : ((PyCFunctionObject *)func) -> m_self) -#define PyCFunction_GET_FLAGS(func) \ - (((PyCFunctionObject *)func) -> m_ml -> ml_flags) -#endif -PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *); - -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyCFunction_FastCallDict(PyObject *func, - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwargs); -#endif +Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *); struct PyMethodDef { const char *ml_name; /* The name of the built-in function/method */ @@ -61,6 +45,13 @@ typedef struct PyMethodDef PyMethodDef; PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +#define PyCFunction_NewEx(ML, SELF, MOD) PyCMethod_New((ML), (SELF), (MOD), NULL) +PyAPI_FUNC(PyObject *) PyCMethod_New(PyMethodDef *, PyObject *, + PyObject *, PyTypeObject *); +#endif + + /* Flag passed to newmethodobject */ /* #define METH_OLDARGS 0x0000 -- unsupported now */ #define METH_VARARGS 0x0001 @@ -93,36 +84,24 @@ PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, #define METH_STACKLESS 0x0000 #endif -#ifndef Py_LIMITED_API -typedef struct { - PyObject_HEAD - PyMethodDef *m_ml; /* Description of the C function to call */ - PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL */ - PyObject *m_module; /* The __module__ attribute, can be anything */ - PyObject *m_weakreflist; /* List of weak references */ - vectorcallfunc vectorcall; -} PyCFunctionObject; - -PyAPI_FUNC(PyObject *) _PyMethodDef_RawFastCallDict( - PyMethodDef *method, - PyObject *self, - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwargs); - -PyAPI_FUNC(PyObject *) _PyMethodDef_RawFastCallKeywords( - PyMethodDef *method, - PyObject *self, - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwnames); +/* METH_METHOD means the function stores an + * additional reference to the class that defines it; + * both self and class are passed to it. + * It uses PyCMethodObject instead of PyCFunctionObject. + * May not be combined with METH_NOARGS, METH_O, METH_CLASS or METH_STATIC. + */ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +#define METH_METHOD 0x0200 #endif -PyAPI_FUNC(int) PyCFunction_ClearFreeList(void); #ifndef Py_LIMITED_API -PyAPI_FUNC(void) _PyCFunction_DebugMallocStats(FILE *out); -PyAPI_FUNC(void) _PyMethod_DebugMallocStats(FILE *out); + +#define Py_CPYTHON_METHODOBJECT_H +#include "cpython/methodobject.h" +#undef Py_CPYTHON_METHODOBJECT_H + #endif #ifdef __cplusplus diff --git a/Include/modsupport.h b/Include/modsupport.h index f90ede48..4c4aab65 100644 --- a/Include/modsupport.h +++ b/Include/modsupport.h @@ -60,9 +60,12 @@ PyAPI_FUNC(int) _PyArg_UnpackStack( ...); PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kwargs); +PyAPI_FUNC(int) _PyArg_NoKwnames(const char *funcname, PyObject *kwnames); PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args); #define _PyArg_NoKeywords(funcname, kwargs) \ ((kwargs) == NULL || _PyArg_NoKeywords((funcname), (kwargs))) +#define _PyArg_NoKwnames(funcname, kwnames) \ + ((kwnames) == NULL || _PyArg_NoKwnames((funcname), (kwnames))) #define _PyArg_NoPositional(funcname, args) \ ((args) == NULL || _PyArg_NoPositional((funcname), (args))) @@ -136,6 +139,10 @@ void _PyArg_Fini(void); PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *); PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +/* New in 3.9 */ +PyAPI_FUNC(int) PyModule_AddType(PyObject *module, PyTypeObject *type); +#endif /* Py_LIMITED_API */ #define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c) #define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c) diff --git a/Include/moduleobject.h b/Include/moduleobject.h index e246fd2f..cf9ad40c 100644 --- a/Include/moduleobject.h +++ b/Include/moduleobject.h @@ -10,7 +10,7 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyModule_Type; #define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type) -#define PyModule_CheckExact(op) (Py_TYPE(op) == &PyModule_Type) +#define PyModule_CheckExact(op) Py_IS_TYPE(op, &PyModule_Type) #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(PyObject *) PyModule_NewObject( diff --git a/Include/node.h b/Include/node.h index 2b390740..ca24f289 100644 --- a/Include/node.h +++ b/Include/node.h @@ -31,7 +31,6 @@ PyAPI_FUNC(Py_ssize_t) _PyNode_SizeOf(node *n); #define NCH(n) ((n)->n_nchildren) #define CHILD(n, i) (&(n)->n_child[i]) -#define RCHILD(n, i) (CHILD(n, NCH(n) + i)) #define TYPE(n) ((n)->n_type) #define STR(n) ((n)->n_str) #define LINENO(n) ((n)->n_lineno) diff --git a/Include/object.h b/Include/object.h index 5558f656..9c1a7f47 100644 --- a/Include/object.h +++ b/Include/object.h @@ -1,8 +1,6 @@ #ifndef Py_OBJECT_H #define Py_OBJECT_H -#include "pymem.h" /* _Py_tracemalloc_config */ - #ifdef __cplusplus extern "C" { #endif @@ -63,6 +61,9 @@ whose size is determined when the object is allocated. #error Py_LIMITED_API is incompatible with Py_DEBUG, Py_TRACE_REFS, and Py_REF_DEBUG #endif +/* PyTypeObject structure is defined in cpython/object.h. + In Py_LIMITED_API, PyTypeObject is an opaque structure. */ +typedef struct _typeobject PyTypeObject; #ifdef Py_TRACE_REFS /* Define pointers to support a doubly-linked list of all live heap objects. */ @@ -104,11 +105,12 @@ whose size is determined when the object is allocated. typedef struct _object { _PyObject_HEAD_EXTRA Py_ssize_t ob_refcnt; - struct _typeobject *ob_type; + PyTypeObject *ob_type; } PyObject; /* Cast argument to PyObject* type. */ #define _PyObject_CAST(op) ((PyObject*)(op)) +#define _PyObject_CAST_CONST(op) ((const PyObject*)(op)) typedef struct { PyObject ob_base; @@ -122,6 +124,27 @@ typedef struct { #define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type) #define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size) +static inline int _Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) { + return ob->ob_type == type; +} +#define Py_IS_TYPE(ob, type) _Py_IS_TYPE(_PyObject_CAST_CONST(ob), type) + +static inline void _Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { + ob->ob_refcnt = refcnt; +} +#define Py_SET_REFCNT(ob, refcnt) _Py_SET_REFCNT(_PyObject_CAST(ob), refcnt) + +static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { + ob->ob_type = type; +} +#define Py_SET_TYPE(ob, type) _Py_SET_TYPE(_PyObject_CAST(ob), type) + +static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { + ob->ob_size = size; +} +#define Py_SET_SIZE(ob, size) _Py_SET_SIZE(_PyVarObject_CAST(ob), size) + + /* Type objects contain a string containing the type name (to help somewhat in debugging), the allocation parameters (see PyObject_New() and @@ -167,15 +190,8 @@ typedef PyObject *(*iternextfunc) (PyObject *); typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *); typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *); typedef int (*initproc)(PyObject *, PyObject *, PyObject *); -typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *); -typedef PyObject *(*allocfunc)(struct _typeobject *, Py_ssize_t); - -#ifdef Py_LIMITED_API -/* In Py_LIMITED_API, PyTypeObject is an opaque structure. */ -typedef struct _typeobject PyTypeObject; -#else -/* PyTypeObject is defined in cpython/object.h */ -#endif +typedef PyObject *(*newfunc)(PyTypeObject *, PyObject *, PyObject *); +typedef PyObject *(*allocfunc)(PyTypeObject *, Py_ssize_t); typedef struct{ int slot; /* slot id, see below */ @@ -195,30 +211,31 @@ PyAPI_FUNC(PyObject*) PyType_FromSpec(PyType_Spec*); PyAPI_FUNC(PyObject*) PyType_FromSpecWithBases(PyType_Spec*, PyObject*); #endif #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 -PyAPI_FUNC(void*) PyType_GetSlot(struct _typeobject*, int); +PyAPI_FUNC(void*) PyType_GetSlot(PyTypeObject*, int); +#endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +PyAPI_FUNC(PyObject*) PyType_FromModuleAndSpec(PyObject *, PyType_Spec *, PyObject *); +PyAPI_FUNC(PyObject *) PyType_GetModule(struct _typeobject *); +PyAPI_FUNC(void *) PyType_GetModuleState(struct _typeobject *); #endif /* Generic type check */ -PyAPI_FUNC(int) PyType_IsSubtype(struct _typeobject *, struct _typeobject *); +PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); #define PyObject_TypeCheck(ob, tp) \ - (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) - -PyAPI_DATA(struct _typeobject) PyType_Type; /* built-in 'type' */ -PyAPI_DATA(struct _typeobject) PyBaseObject_Type; /* built-in 'object' */ -PyAPI_DATA(struct _typeobject) PySuper_Type; /* built-in 'super' */ + (Py_IS_TYPE(ob, tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) -PyAPI_FUNC(unsigned long) PyType_GetFlags(struct _typeobject*); +PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ +PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ +PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */ -#define PyType_Check(op) \ - PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS) -#define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type) +PyAPI_FUNC(unsigned long) PyType_GetFlags(PyTypeObject*); -PyAPI_FUNC(int) PyType_Ready(struct _typeobject *); -PyAPI_FUNC(PyObject *) PyType_GenericAlloc(struct _typeobject *, Py_ssize_t); -PyAPI_FUNC(PyObject *) PyType_GenericNew(struct _typeobject *, +PyAPI_FUNC(int) PyType_Ready(PyTypeObject *); +PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, PyObject *, PyObject *); PyAPI_FUNC(unsigned int) PyType_ClearCache(void); -PyAPI_FUNC(void) PyType_Modified(struct _typeobject *); +PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); /* Generic operations on objects */ PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *); @@ -235,8 +252,7 @@ PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); -PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, - PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, PyObject *, PyObject *); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(int) PyObject_GenericSetDict(PyObject *, PyObject *, void *); #endif @@ -290,7 +306,9 @@ given type object has a specified feature. /* Set if the type implements the vectorcall protocol (PEP 590) */ #ifndef Py_LIMITED_API -#define _Py_TPFLAGS_HAVE_VECTORCALL (1UL << 11) +#define Py_TPFLAGS_HAVE_VECTORCALL (1UL << 11) +// Backwards compatibility alias for API that was provisional in Python 3.8 +#define _Py_TPFLAGS_HAVE_VECTORCALL Py_TPFLAGS_HAVE_VECTORCALL #endif /* Set if the type is 'ready' -- fully initialized */ @@ -337,19 +355,14 @@ given type object has a specified feature. /* NOTE: The following flags reuse lower bits (removed as part of the * Python 3.0 transition). */ -/* The following flag is kept for compatibility. Starting with 3.8, - * binary compatibility of C extensions accross feature releases of +/* The following flag is kept for compatibility. Starting with 3.8, + * binary compatibility of C extensions across feature releases of * Python is not supported anymore, except when using the stable ABI. */ /* Type structure has tp_finalize member (3.4) */ #define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0) -#ifdef Py_LIMITED_API -# define PyType_HasFeature(t,f) ((PyType_GetFlags(t) & (f)) != 0) -#endif -#define PyType_FastSubclass(t,f) PyType_HasFeature(t,f) - /* The macros Py_INCREF(op) and Py_DECREF(op) are used to increment or decrement @@ -379,94 +392,33 @@ decision that's up to the implementer of each new type so if you want, you can count such references to the type object.) */ -/* First define a pile of simple helper macros, one set per special - * build symbol. These either expand to the obvious things, or to - * nothing at all when the special mode isn't in effect. The main - * macros can later be defined just once then, yet expand to different - * things depending on which special build options are and aren't in effect. - * Trust me : while painful, this is 20x easier to understand than, - * e.g, defining _Py_NewReference five different times in a maze of nested - * #ifdefs (we used to do that -- it was impenetrable). - */ #ifdef Py_REF_DEBUG PyAPI_DATA(Py_ssize_t) _Py_RefTotal; PyAPI_FUNC(void) _Py_NegativeRefcount(const char *filename, int lineno, PyObject *op); -PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); -#define _Py_INC_REFTOTAL _Py_RefTotal++ -#define _Py_DEC_REFTOTAL _Py_RefTotal-- - -/* Py_REF_DEBUG also controls the display of refcounts and memory block - * allocations at the interactive prompt and at interpreter shutdown - */ -PyAPI_FUNC(void) _PyDebug_PrintTotalRefs(void); -#else -#define _Py_INC_REFTOTAL -#define _Py_DEC_REFTOTAL #endif /* Py_REF_DEBUG */ -#ifdef COUNT_ALLOCS -PyAPI_FUNC(void) _Py_inc_count(struct _typeobject *); -PyAPI_FUNC(void) _Py_dec_count(struct _typeobject *); -#define _Py_INC_TPALLOCS(OP) _Py_inc_count(Py_TYPE(OP)) -#define _Py_INC_TPFREES(OP) _Py_dec_count(Py_TYPE(OP)) -#define _Py_DEC_TPFREES(OP) Py_TYPE(OP)->tp_frees-- -#define _Py_COUNT_ALLOCS_COMMA , -#else -#define _Py_INC_TPALLOCS(OP) -#define _Py_INC_TPFREES(OP) -#define _Py_DEC_TPFREES(OP) -#define _Py_COUNT_ALLOCS_COMMA -#endif /* COUNT_ALLOCS */ - -/* Update the Python traceback of an object. This function must be called - when a memory block is reused from a free list. */ -PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); - -#ifdef Py_TRACE_REFS -/* Py_TRACE_REFS is such major surgery that we call external routines. */ -PyAPI_FUNC(void) _Py_NewReference(PyObject *); -PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); -PyAPI_FUNC(void) _Py_PrintReferences(FILE *); -PyAPI_FUNC(void) _Py_PrintReferenceAddresses(FILE *); -PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); -#else -/* Without Py_TRACE_REFS, there's little enough to do that we expand code - inline. */ -static inline void _Py_NewReference(PyObject *op) -{ - if (_Py_tracemalloc_config.tracing) { - _PyTraceMalloc_NewReference(op); - } - _Py_INC_TPALLOCS(op); - _Py_INC_REFTOTAL; - Py_REFCNT(op) = 1; -} - -static inline void _Py_ForgetReference(PyObject *op) -{ - (void)op; /* may be unused, shut up -Wunused-parameter */ - _Py_INC_TPFREES(op); -} -#endif /* !Py_TRACE_REFS */ - - PyAPI_FUNC(void) _Py_Dealloc(PyObject *); static inline void _Py_INCREF(PyObject *op) { - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif op->ob_refcnt++; } #define Py_INCREF(op) _Py_INCREF(_PyObject_CAST(op)) -static inline void _Py_DECREF(const char *filename, int lineno, - PyObject *op) +static inline void _Py_DECREF( +#ifdef Py_REF_DEBUG + const char *filename, int lineno, +#endif + PyObject *op) { - (void)filename; /* may be unused, shut up -Wunused-parameter */ - (void)lineno; /* may be unused, shut up -Wunused-parameter */ - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif if (--op->ob_refcnt != 0) { #ifdef Py_REF_DEBUG if (op->ob_refcnt < 0) { @@ -479,7 +431,11 @@ static inline void _Py_DECREF(const char *filename, int lineno, } } -#define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) +#ifdef Py_REF_DEBUG +# define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) +#else +# define Py_DECREF(op) _Py_DECREF(_PyObject_CAST(op)) +#endif /* Safely decref `op` and set `op` to NULL, especially useful in tp_clear @@ -654,98 +610,37 @@ it carefully, it may save lots of calls to Py_INCREF() and Py_DECREF() at times. */ +#ifndef Py_LIMITED_API +# define Py_CPYTHON_OBJECT_H +# include "cpython/object.h" +# undef Py_CPYTHON_OBJECT_H +#endif -/* Trashcan mechanism, thanks to Christian Tismer. - -When deallocating a container object, it's possible to trigger an unbounded -chain of deallocations, as each Py_DECREF in turn drops the refcount on "the -next" object in the chain to 0. This can easily lead to stack overflows, -especially in threads (which typically have less stack space to work with). - -A container object can avoid this by bracketing the body of its tp_dealloc -function with a pair of macros: -static void -mytype_dealloc(mytype *p) +static inline int +PyType_HasFeature(PyTypeObject *type, unsigned long feature) { - ... declarations go here ... - - PyObject_GC_UnTrack(p); // must untrack first - Py_TRASHCAN_BEGIN(p, mytype_dealloc) - ... The body of the deallocator goes here, including all calls ... - ... to Py_DECREF on contained objects. ... - Py_TRASHCAN_END // there should be no code after this + unsigned long flags; +#ifdef Py_LIMITED_API + // PyTypeObject is opaque in the limited C API + flags = PyType_GetFlags(type); +#else + flags = type->tp_flags; +#endif + return ((flags & feature) != 0); } -CAUTION: Never return from the middle of the body! If the body needs to -"get out early", put a label immediately before the Py_TRASHCAN_END -call, and goto it. Else the call-depth counter (see below) will stay -above 0 forever, and the trashcan will never get emptied. - -How it works: The BEGIN macro increments a call-depth counter. So long -as this counter is small, the body of the deallocator is run directly without -further ado. But if the counter gets large, it instead adds p to a list of -objects to be deallocated later, skips the body of the deallocator, and -resumes execution after the END macro. The tp_dealloc routine then returns -without deallocating anything (and so unbounded call-stack depth is avoided). - -When the call stack finishes unwinding again, code generated by the END macro -notices this, and calls another routine to deallocate all the objects that -may have been added to the list of deferred deallocations. In effect, a -chain of N deallocations is broken into (N-1)/(PyTrash_UNWIND_LEVEL-1) pieces, -with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. - -Since the tp_dealloc of a subclass typically calls the tp_dealloc of the base -class, we need to ensure that the trashcan is only triggered on the tp_dealloc -of the actual class being deallocated. Otherwise we might end up with a -partially-deallocated object. To check this, the tp_dealloc function must be -passed as second argument to Py_TRASHCAN_BEGIN(). -*/ - -/* The new thread-safe private API, invoked by the macros below. */ -PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyObject*); -PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); - -#define PyTrash_UNWIND_LEVEL 50 - -#define Py_TRASHCAN_BEGIN_CONDITION(op, cond) \ - do { \ - PyThreadState *_tstate = NULL; \ - /* If "cond" is false, then _tstate remains NULL and the deallocator \ - * is run normally without involving the trashcan */ \ - if (cond) { \ - _tstate = PyThreadState_GET(); \ - if (_tstate->trash_delete_nesting >= PyTrash_UNWIND_LEVEL) { \ - /* Store the object (to be deallocated later) and jump past \ - * Py_TRASHCAN_END, skipping the body of the deallocator */ \ - _PyTrash_thread_deposit_object(_PyObject_CAST(op)); \ - break; \ - } \ - ++_tstate->trash_delete_nesting; \ - } - /* The body of the deallocator is here. */ -#define Py_TRASHCAN_END \ - if (_tstate) { \ - --_tstate->trash_delete_nesting; \ - if (_tstate->trash_delete_later && _tstate->trash_delete_nesting <= 0) \ - _PyTrash_thread_destroy_chain(); \ - } \ - } while (0); - -#define Py_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN_CONDITION(op, \ - Py_TYPE(op)->tp_dealloc == (destructor)(dealloc)) - -/* For backwards compatibility, these macros enable the trashcan - * unconditionally */ -#define Py_TRASHCAN_SAFE_BEGIN(op) Py_TRASHCAN_BEGIN_CONDITION(op, 1) -#define Py_TRASHCAN_SAFE_END(op) Py_TRASHCAN_END +#define PyType_FastSubclass(type, flag) PyType_HasFeature(type, flag) +static inline int _PyType_Check(PyObject *op) { + return PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS); +} +#define PyType_Check(op) _PyType_Check(_PyObject_CAST(op)) -#ifndef Py_LIMITED_API -# define Py_CPYTHON_OBJECT_H -# include "cpython/object.h" -# undef Py_CPYTHON_OBJECT_H -#endif +static inline int _PyType_CheckExact(PyObject *op) { + return Py_IS_TYPE(op, &PyType_Type); +} +#define PyType_CheckExact(op) _PyType_CheckExact(_PyObject_CAST(op)) #ifdef __cplusplus } diff --git a/Include/objimpl.h b/Include/objimpl.h index 2337d8a5..030d7eee 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -122,103 +122,32 @@ PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); -#define PyObject_New(type, typeobj) \ - ( (type *) _PyObject_New(typeobj) ) -#define PyObject_NewVar(type, typeobj, n) \ - ( (type *) _PyObject_NewVar((typeobj), (n)) ) - -/* Inline functions trading binary compatibility for speed: - PyObject_INIT() is the fast version of PyObject_Init(), and - PyObject_INIT_VAR() is the fast version of PyObject_InitVar. - See also pymem.h. - - These inline functions expect non-NULL object pointers. */ -static inline PyObject* -_PyObject_INIT(PyObject *op, PyTypeObject *typeobj) -{ - assert(op != NULL); - Py_TYPE(op) = typeobj; - if (PyType_GetFlags(typeobj) & Py_TPFLAGS_HEAPTYPE) { - Py_INCREF(typeobj); - } - _Py_NewReference(op); - return op; -} - -#define PyObject_INIT(op, typeobj) \ - _PyObject_INIT(_PyObject_CAST(op), (typeobj)) - -static inline PyVarObject* -_PyObject_INIT_VAR(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size) -{ - assert(op != NULL); - Py_SIZE(op) = size; - PyObject_INIT((PyObject *)op, typeobj); - return op; -} +#define PyObject_New(type, typeobj) ((type *)_PyObject_New(typeobj)) -#define PyObject_INIT_VAR(op, typeobj, size) \ - _PyObject_INIT_VAR(_PyVarObject_CAST(op), (typeobj), (size)) +// Alias to PyObject_New(). In Python 3.8, PyObject_NEW() called directly +// PyObject_MALLOC() with _PyObject_SIZE(). +#define PyObject_NEW(type, typeobj) PyObject_New(type, typeobj) -#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) - -/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a - vrbl-size object with nitems items, exclusive of gc overhead (if any). The - value is rounded up to the closest multiple of sizeof(void *), in order to - ensure that pointer fields at the end of the object are correctly aligned - for the platform (this is of special importance for subclasses of, e.g., - str or int, so that pointers can be stored after the embedded data). +#define PyObject_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_NewVar((typeobj), (n)) ) - Note that there's no memory wastage in doing this, as malloc has to - return (at worst) pointer-aligned memory anyway. -*/ -#if ((SIZEOF_VOID_P - 1) & SIZEOF_VOID_P) != 0 -# error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2" +// Alias to PyObject_New(). In Python 3.8, PyObject_NEW() called directly +// PyObject_MALLOC() with _PyObject_VAR_SIZE(). +#define PyObject_NEW_VAR(type, typeobj, n) PyObject_NewVar(type, typeobj, n) + + +#ifdef Py_LIMITED_API +/* Define PyObject_INIT() and PyObject_INIT_VAR() as aliases to PyObject_Init() + and PyObject_InitVar() in the limited C API for compatibility with the + CPython C API. */ +# define PyObject_INIT(op, typeobj) \ + PyObject_Init(_PyObject_CAST(op), (typeobj)) +# define PyObject_INIT_VAR(op, typeobj, size) \ + PyObject_InitVar(_PyVarObject_CAST(op), (typeobj), (size)) +#else +/* PyObject_INIT() and PyObject_INIT_VAR() are defined in cpython/objimpl.h */ #endif -#define _PyObject_VAR_SIZE(typeobj, nitems) \ - _Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \ - (nitems)*(typeobj)->tp_itemsize, \ - SIZEOF_VOID_P) - -#define PyObject_NEW(type, typeobj) \ -( (type *) PyObject_Init( \ - (PyObject *) PyObject_MALLOC( _PyObject_SIZE(typeobj) ), (typeobj)) ) - -#define PyObject_NEW_VAR(type, typeobj, n) \ -( (type *) PyObject_InitVar( \ - (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE((typeobj),(n)) ),\ - (typeobj), (n)) ) - -/* This example code implements an object constructor with a custom - allocator, where PyObject_New is inlined, and shows the important - distinction between two steps (at least): - 1) the actual allocation of the object storage; - 2) the initialization of the Python specific fields - in this storage with PyObject_{Init, InitVar}. - - PyObject * - YourObject_New(...) - { - PyObject *op; - - op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); - if (op == NULL) - return PyErr_NoMemory(); - - PyObject_Init(op, &YourTypeStruct); - - op->ob_field = value; - ... - return op; - } - - Note that in C++, the use of the new operator usually implies that - the 1st step is performed automatically for you, so in a C++ class - constructor you would start directly with PyObject_Init/InitVar -*/ - - /* * Garbage Collection Support @@ -257,6 +186,8 @@ PyAPI_FUNC(void) PyObject_GC_Del(void *); #define PyObject_GC_NewVar(type, typeobj, n) \ ( (type *) _PyObject_GC_NewVar((typeobj), (n)) ) +PyAPI_FUNC(int) PyObject_GC_IsTracked(PyObject *); +PyAPI_FUNC(int) PyObject_GC_IsFinalized(PyObject *); /* Utility macro to help write tp_traverse functions. * To use this macro, the tp_traverse function must name its arguments diff --git a/Include/odictobject.h b/Include/odictobject.h index 35aff8a2..e0704130 100644 --- a/Include/odictobject.h +++ b/Include/odictobject.h @@ -19,7 +19,7 @@ PyAPI_DATA(PyTypeObject) PyODictItems_Type; PyAPI_DATA(PyTypeObject) PyODictValues_Type; #define PyODict_Check(op) PyObject_TypeCheck(op, &PyODict_Type) -#define PyODict_CheckExact(op) (Py_TYPE(op) == &PyODict_Type) +#define PyODict_CheckExact(op) Py_IS_TYPE(op, &PyODict_Type) #define PyODict_SIZE(op) PyDict_GET_SIZE((op)) PyAPI_FUNC(PyObject *) PyODict_New(void); diff --git a/Include/opcode.h b/Include/opcode.h index 2a29e978..19944fac 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -30,10 +30,11 @@ extern "C" { #define BINARY_TRUE_DIVIDE 27 #define INPLACE_FLOOR_DIVIDE 28 #define INPLACE_TRUE_DIVIDE 29 +#define RERAISE 48 +#define WITH_EXCEPT_START 49 #define GET_AITER 50 #define GET_ANEXT 51 #define BEFORE_ASYNC_WITH 52 -#define BEGIN_FINALLY 53 #define END_ASYNC_FOR 54 #define INPLACE_ADD 55 #define INPLACE_SUBTRACT 56 @@ -53,19 +54,18 @@ extern "C" { #define LOAD_BUILD_CLASS 71 #define YIELD_FROM 72 #define GET_AWAITABLE 73 +#define LOAD_ASSERTION_ERROR 74 #define INPLACE_LSHIFT 75 #define INPLACE_RSHIFT 76 #define INPLACE_AND 77 #define INPLACE_XOR 78 #define INPLACE_OR 79 -#define WITH_CLEANUP_START 81 -#define WITH_CLEANUP_FINISH 82 +#define LIST_TO_TUPLE 82 #define RETURN_VALUE 83 #define IMPORT_STAR 84 #define SETUP_ANNOTATIONS 85 #define YIELD_VALUE 86 #define POP_BLOCK 87 -#define END_FINALLY 88 #define POP_EXCEPT 89 #define HAVE_ARGUMENT 90 #define STORE_NAME 90 @@ -94,6 +94,9 @@ extern "C" { #define POP_JUMP_IF_FALSE 114 #define POP_JUMP_IF_TRUE 115 #define LOAD_GLOBAL 116 +#define IS_OP 117 +#define CONTAINS_OP 118 +#define JUMP_IF_NOT_EXC_MATCH 121 #define SETUP_FINALLY 122 #define LOAD_FAST 124 #define STORE_FAST 125 @@ -114,20 +117,16 @@ extern "C" { #define SET_ADD 146 #define MAP_ADD 147 #define LOAD_CLASSDEREF 148 -#define BUILD_LIST_UNPACK 149 -#define BUILD_MAP_UNPACK 150 -#define BUILD_MAP_UNPACK_WITH_CALL 151 -#define BUILD_TUPLE_UNPACK 152 -#define BUILD_SET_UNPACK 153 #define SETUP_ASYNC_WITH 154 #define FORMAT_VALUE 155 #define BUILD_CONST_KEY_MAP 156 #define BUILD_STRING 157 -#define BUILD_TUPLE_UNPACK_WITH_CALL 158 #define LOAD_METHOD 160 #define CALL_METHOD 161 -#define CALL_FINALLY 162 -#define POP_FINALLY 163 +#define LIST_EXTEND 162 +#define SET_UPDATE 163 +#define DICT_MERGE 164 +#define DICT_UPDATE 165 /* EXCEPT_HANDLER is a special, implicit block type which is created when entering an except handler. It is not an opcode but we define it here @@ -135,11 +134,6 @@ extern "C" { remaining private.*/ #define EXCEPT_HANDLER 257 - -enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, - PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN, - PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; - #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) #ifdef __cplusplus diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 5123b260..a9e8ef19 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -17,13 +17,13 @@ /* Version parsed out into numeric values */ /*--start constants--*/ #define PY_MAJOR_VERSION 3 -#define PY_MINOR_VERSION 8 -#define PY_MICRO_VERSION 6 +#define PY_MINOR_VERSION 9 +#define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.8.6" +#define PY_VERSION "3.9.0" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Include/picklebufobject.h b/Include/picklebufobject.h index f07e900b..0df2561d 100644 --- a/Include/picklebufobject.h +++ b/Include/picklebufobject.h @@ -12,7 +12,7 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyPickleBuffer_Type; -#define PyPickleBuffer_Check(op) (Py_TYPE(op) == &PyPickleBuffer_Type) +#define PyPickleBuffer_Check(op) Py_IS_TYPE(op, &PyPickleBuffer_Type) /* Create a PickleBuffer redirecting to the given buffer-enabled object */ PyAPI_FUNC(PyObject *) PyPickleBuffer_FromObject(PyObject *); diff --git a/Include/py_curses.h b/Include/py_curses.h index 2702b37e..b70252d9 100644 --- a/Include/py_curses.h +++ b/Include/py_curses.h @@ -64,7 +64,7 @@ typedef struct { char *encoding; } PyCursesWindowObject; -#define PyCursesWindow_Check(v) (Py_TYPE(v) == &PyCursesWindow_Type) +#define PyCursesWindow_Check(v) Py_IS_TYPE(v, &PyCursesWindow_Type) #define PyCurses_CAPSULE_NAME "_curses._C_API" @@ -97,4 +97,3 @@ static const char catchall_NULL[] = "curses function returned NULL"; #endif /* !defined(Py_CURSES_H) */ - diff --git a/Include/pycapsule.h b/Include/pycapsule.h index d9ecda7a..fb5d503f 100644 --- a/Include/pycapsule.h +++ b/Include/pycapsule.h @@ -22,7 +22,7 @@ PyAPI_DATA(PyTypeObject) PyCapsule_Type; typedef void (*PyCapsule_Destructor)(PyObject *); -#define PyCapsule_CheckExact(op) (Py_TYPE(op) == &PyCapsule_Type) +#define PyCapsule_CheckExact(op) Py_IS_TYPE(op, &PyCapsule_Type) PyAPI_FUNC(PyObject *) PyCapsule_New( diff --git a/Include/pydebug.h b/Include/pydebug.h index bd4aafe3..78bcb118 100644 --- a/Include/pydebug.h +++ b/Include/pydebug.h @@ -5,8 +5,6 @@ extern "C" { #endif -/* These global variable are defined in pylifecycle.c */ -/* XXX (ncoghlan): move these declarations to pylifecycle.h? */ PyAPI_DATA(int) Py_DebugFlag; PyAPI_DATA(int) Py_VerboseFlag; PyAPI_DATA(int) Py_QuietFlag; diff --git a/Include/pyerrors.h b/Include/pyerrors.h index 5125a51e..979a26ba 100644 --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -4,6 +4,8 @@ extern "C" { #endif +#include // va_list + /* Error handling definitions */ PyAPI_FUNC(void) PyErr_SetNone(PyObject *); @@ -21,7 +23,11 @@ PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **); PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *); #endif -/* Defined in Python/pylifecycle.c */ +/* Defined in Python/pylifecycle.c + + The Py_FatalError() function is replaced with a macro which logs + automatically the name of the current function, unless the Py_LIMITED_API + macro is defined. */ PyAPI_FUNC(void) _Py_NO_RETURN Py_FatalError(const char *message); #if defined(Py_DEBUG) || defined(Py_LIMITED_API) @@ -54,11 +60,11 @@ PyAPI_FUNC(void) PyException_SetContext(PyObject *, PyObject *); PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS)) #define PyExceptionInstance_Check(x) \ - PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS) + PyType_FastSubclass(Py_TYPE(x), Py_TPFLAGS_BASE_EXC_SUBCLASS) PyAPI_FUNC(const char *) PyExceptionClass_Name(PyObject *); -#define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type)) +#define PyExceptionInstance_Class(x) ((PyObject*)Py_TYPE(x)) /* Predefined exceptions */ @@ -303,21 +309,6 @@ PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason( const char *reason /* UTF-8 encoded string */ ); -/* These APIs aren't really part of the error implementation, but - often needed to format error messages; the native C lib APIs are - not available on all platforms, which is why we provide emulations - for those platforms in Python/mysnprintf.c, - WARNING: The return value of snprintf varies across platforms; do - not rely on any particular behavior; eventually the C99 defn may - be reliable. -*/ -#if defined(MS_WIN32) && !defined(HAVE_SNPRINTF) -# define HAVE_SNPRINTF -# define snprintf _snprintf -# define vsnprintf _vsnprintf -#endif - -#include PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...) Py_GCC_ATTRIBUTE((format(printf, 3, 4))); PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) diff --git a/Include/pyfpe.h b/Include/pyfpe.h index 5a99e397..cc2def63 100644 --- a/Include/pyfpe.h +++ b/Include/pyfpe.h @@ -1,5 +1,7 @@ #ifndef Py_PYFPE_H #define Py_PYFPE_H +/* Header excluded from the stable API */ +#ifndef Py_LIMITED_API /* These macros used to do something when Python was built with --with-fpectl, * but support for that was dropped in 3.7. We continue to define them though, @@ -9,4 +11,5 @@ #define PyFPE_START_PROTECT(err_string, leave_stmt) #define PyFPE_END_PROTECT(v) +#endif /* !defined(Py_LIMITED_API) */ #endif /* !Py_PYFPE_H */ diff --git a/Include/pyframe.h b/Include/pyframe.h new file mode 100644 index 00000000..38162242 --- /dev/null +++ b/Include/pyframe.h @@ -0,0 +1,22 @@ +/* Limited C API of PyFrame API + * + * Include "frameobject.h" to get the PyFrameObject structure. + */ + +#ifndef Py_PYFRAME_H +#define Py_PYFRAME_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _frame PyFrameObject; + +/* Return the line of code the frame is currently executing. */ +PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); + +PyAPI_FUNC(PyCodeObject *) PyFrame_GetCode(PyFrameObject *frame); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYFRAME_H */ diff --git a/Include/pyhash.h b/Include/pyhash.h index dbcc9744..4437b870 100644 --- a/Include/pyhash.h +++ b/Include/pyhash.h @@ -8,7 +8,9 @@ extern "C" { /* Helpers for hash functions */ #ifndef Py_LIMITED_API PyAPI_FUNC(Py_hash_t) _Py_HashDouble(double); -PyAPI_FUNC(Py_hash_t) _Py_HashPointer(void*); +PyAPI_FUNC(Py_hash_t) _Py_HashPointer(const void*); +// Similar to _Py_HashPointer(), but don't replace -1 with -2 +PyAPI_FUNC(Py_hash_t) _Py_HashPointerRaw(const void*); PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t); #endif diff --git a/Include/pymacro.h b/Include/pymacro.h index 495c2c25..202b936d 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -100,7 +100,33 @@ # define Py_UNUSED(name) _unused_ ## name #endif -#define Py_UNREACHABLE() \ +#if defined(RANDALL_WAS_HERE) +# define Py_UNREACHABLE() \ + Py_FatalError( \ + "If you're seeing this, the code is in what I thought was\n" \ + "an unreachable state.\n\n" \ + "I could give you advice for what to do, but honestly, why\n" \ + "should you trust me? I clearly screwed this up. I'm writing\n" \ + "a message that should never appear, yet I know it will\n" \ + "probably appear someday.\n\n" \ + "On a deep level, I know I'm not up to this task.\n" \ + "I'm so sorry.\n" \ + "https://xkcd.com/2200") +#elif defined(Py_DEBUG) +# define Py_UNREACHABLE() \ + Py_FatalError( \ + "We've reached an unreachable state. Anything is possible.\n" \ + "The limits were in our heads all along. Follow your dreams.\n" \ + "https://xkcd.com/2200") +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +# define Py_UNREACHABLE() __builtin_unreachable() +#elif defined(__clang__) || defined(__INTEL_COMPILER) +# define Py_UNREACHABLE() __builtin_unreachable() +#elif defined(_MSC_VER) +# define Py_UNREACHABLE() __assume(0) +#else +# define Py_UNREACHABLE() \ Py_FatalError("Unreachable C code path reached") +#endif #endif /* Py_PYMACRO_H */ diff --git a/Include/pymath.h b/Include/pymath.h index 6cf69f98..63ca9727 100644 --- a/Include/pymath.h +++ b/Include/pymath.h @@ -125,7 +125,7 @@ PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); /* Py_IS_FINITE(X) * Return 1 if float or double arg is neither infinite nor NAN, else 0. - * Some compilers (e.g. VisualStudio) have intrisics for this, so a special + * Some compilers (e.g. VisualStudio) have intrinsics for this, so a special * macro for this particular test is useful * Note: PC/pyconfig.h defines Py_IS_FINITE as _finite */ @@ -227,4 +227,12 @@ PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); * behavior. */ #define _Py_InIntegralTypeRange(type, v) (_Py_IntegralTypeMin(type) <= v && v <= _Py_IntegralTypeMax(type)) +/* Return the smallest integer k such that n < 2**k, or 0 if n == 0. + * Equivalent to floor(log2(x))+1. Also equivalent to: bitwidth_of_type - + * count_leading_zero_bits(x) + */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(unsigned int) _Py_bit_length(unsigned long d); +#endif + #endif /* Py_PYMATH_H */ diff --git a/Include/pymem.h b/Include/pymem.h index 07b380aa..607feb94 100644 --- a/Include/pymem.h +++ b/Include/pymem.h @@ -101,41 +101,6 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr); #define PyMem_Del PyMem_Free #define PyMem_DEL PyMem_FREE -/* bpo-35053: expose _Py_tracemalloc_config for performance: - _Py_NewReference() needs an efficient check to test if tracemalloc is - tracing. - - It has to be defined in pymem.h, before object.h is included. */ -struct _PyTraceMalloc_Config { - /* Module initialized? - Variable protected by the GIL */ - enum { - TRACEMALLOC_NOT_INITIALIZED, - TRACEMALLOC_INITIALIZED, - TRACEMALLOC_FINALIZED - } initialized; - - /* Is tracemalloc tracing memory allocations? - Variable protected by the GIL */ - int tracing; - - /* limit of the number of frames in a traceback, 1 by default. - Variable protected by the GIL. */ - int max_nframe; - - /* use domain in trace key? - Variable protected by the GIL. */ - int use_domain; -}; - -PyAPI_DATA(struct _PyTraceMalloc_Config) _Py_tracemalloc_config; - -#define _PyTraceMalloc_Config_INIT \ - {.initialized = TRACEMALLOC_NOT_INITIALIZED, \ - .tracing = 0, \ - .max_nframe = 1, \ - .use_domain = 0} - #ifndef Py_LIMITED_API # define Py_CPYTHON_PYMEM_H diff --git a/Include/pyport.h b/Include/pyport.h index 71f5794d..6505af46 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -133,8 +133,9 @@ typedef int Py_ssize_clean_t; /* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf * format to convert an argument with the width of a size_t or Py_ssize_t. - * C99 introduced "z" for this purpose, but not all platforms support that; - * e.g., MS compilers use "I" instead. + * C99 introduced "z" for this purpose, but old MSVCs had not supported it. + * Since MSVC supports "z" since (at least) 2015, we can just use "z" + * for new code. * * These "high level" Python format functions interpret "z" correctly on * all platforms (Python interprets the format string itself, and does whatever @@ -152,19 +153,11 @@ typedef int Py_ssize_clean_t; * Py_ssize_t index; * fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index); * - * That will expand to %ld, or %Id, or to something else correct for a - * Py_ssize_t on the platform. + * That will expand to %zd or to something else correct for a Py_ssize_t on + * the platform. */ #ifndef PY_FORMAT_SIZE_T -# if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__) -# define PY_FORMAT_SIZE_T "" -# elif SIZEOF_SIZE_T == SIZEOF_LONG -# define PY_FORMAT_SIZE_T "l" -# elif defined(MS_WINDOWS) -# define PY_FORMAT_SIZE_T "I" -# else -# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" -# endif +# define PY_FORMAT_SIZE_T "z" #endif /* Py_LOCAL can be used instead of static to get the fastest possible calling @@ -520,6 +513,26 @@ extern "C" { #define Py_DEPRECATED(VERSION_UNUSED) #endif +#if defined(__clang__) +#define _Py_COMP_DIAG_PUSH _Pragma("clang diagnostic push") +#define _Py_COMP_DIAG_IGNORE_DEPR_DECLS \ + _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#define _Py_COMP_DIAG_POP _Pragma("clang diagnostic pop") +#elif defined(__GNUC__) \ + && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) +#define _Py_COMP_DIAG_PUSH _Pragma("GCC diagnostic push") +#define _Py_COMP_DIAG_IGNORE_DEPR_DECLS \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#define _Py_COMP_DIAG_POP _Pragma("GCC diagnostic pop") +#elif defined(_MSC_VER) +#define _Py_COMP_DIAG_PUSH __pragma(warning(push)) +#define _Py_COMP_DIAG_IGNORE_DEPR_DECLS __pragma(warning(disable: 4996)) +#define _Py_COMP_DIAG_POP __pragma(warning(pop)) +#else +#define _Py_COMP_DIAG_PUSH +#define _Py_COMP_DIAG_IGNORE_DEPR_DECLS +#define _Py_COMP_DIAG_POP +#endif /* _Py_HOT_FUNCTION * The hot attribute on a function is used to inform the compiler that the @@ -645,16 +658,18 @@ extern char * _getpty(int *, int, mode_t, int); # define HAVE_DECLSPEC_DLL #endif +#include "exports.h" + /* only get special linkage if built as shared or platform is Cygwin */ #if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) # if defined(HAVE_DECLSPEC_DLL) # if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) -# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE -# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE +# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE +# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE /* module init functions inside the core need no external linkage */ /* except for Cygwin to handle embedding */ # if defined(__CYGWIN__) -# define PyMODINIT_FUNC __declspec(dllexport) PyObject* +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* # else /* __CYGWIN__ */ # define PyMODINIT_FUNC PyObject* # endif /* __CYGWIN__ */ @@ -665,14 +680,14 @@ extern char * _getpty(int *, int, mode_t, int); /* failures similar to those described at the bottom of 4.1: */ /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ # if !defined(__CYGWIN__) -# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE +# define PyAPI_FUNC(RTYPE) Py_IMPORTED_SYMBOL RTYPE # endif /* !__CYGWIN__ */ -# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE +# define PyAPI_DATA(RTYPE) extern Py_IMPORTED_SYMBOL RTYPE /* module init functions outside the core must be exported */ # if defined(__cplusplus) -# define PyMODINIT_FUNC extern "C" __declspec(dllexport) PyObject* +# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* # else /* __cplusplus */ -# define PyMODINIT_FUNC __declspec(dllexport) PyObject* +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* # endif /* __cplusplus */ # endif /* Py_BUILD_CORE */ # endif /* HAVE_DECLSPEC_DLL */ @@ -680,16 +695,16 @@ extern char * _getpty(int *, int, mode_t, int); /* If no external linkage macros defined by now, create defaults */ #ifndef PyAPI_FUNC -# define PyAPI_FUNC(RTYPE) RTYPE +# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE #endif #ifndef PyAPI_DATA -# define PyAPI_DATA(RTYPE) extern RTYPE +# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE #endif #ifndef PyMODINIT_FUNC # if defined(__cplusplus) -# define PyMODINIT_FUNC extern "C" PyObject* +# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* # else /* __cplusplus */ -# define PyMODINIT_FUNC PyObject* +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* # endif /* __cplusplus */ #endif @@ -773,11 +788,11 @@ extern char * _getpty(int *, int, mode_t, int); */ #ifdef WORDS_BIGENDIAN -#define PY_BIG_ENDIAN 1 -#define PY_LITTLE_ENDIAN 0 +# define PY_BIG_ENDIAN 1 +# define PY_LITTLE_ENDIAN 0 #else -#define PY_BIG_ENDIAN 0 -#define PY_LITTLE_ENDIAN 1 +# define PY_BIG_ENDIAN 0 +# define PY_LITTLE_ENDIAN 1 #endif #ifdef Py_BUILD_CORE @@ -834,8 +849,9 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; #endif /* Mark a function which cannot return. Example: + PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); - PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); */ + XLC support is intentionally omitted due to bpo-40244 */ #if defined(__clang__) || \ (defined(__GNUC__) && \ ((__GNUC__ >= 3) || \ diff --git a/Include/pystate.h b/Include/pystate.h index 4c25e3f7..bae44077 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -7,27 +7,35 @@ extern "C" { #endif -#include "pythread.h" - /* This limitation is for performance and simplicity. If needed it can be removed (with effort). */ #define MAX_CO_EXTRA_USERS 255 /* Forward declarations for PyFrameObject, PyThreadState and PyInterpreterState */ -struct _frame; struct _ts; struct _is; /* struct _ts is defined in cpython/pystate.h */ typedef struct _ts PyThreadState; -/* struct _is is defined in internal/pycore_pystate.h */ +/* struct _is is defined in internal/pycore_interp.h */ typedef struct _is PyInterpreterState; PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void); PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *); PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +/* New in 3.9 */ +/* Get the current interpreter state. + + Issue a fatal error if there no current Python thread state or no current + interpreter. It cannot return NULL. + + The caller must hold the GIL. */ +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Get(void); +#endif + #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000 /* New in 3.8 */ PyAPI_FUNC(PyObject *) PyInterpreterState_GetDict(PyInterpreterState *); @@ -50,7 +58,6 @@ PyAPI_FUNC(PyObject*) PyState_FindModule(struct PyModuleDef*); PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *); PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *); PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); -PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); /* Get the current thread state. @@ -77,6 +84,13 @@ PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *); PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void); PyAPI_FUNC(int) PyThreadState_SetAsyncExc(unsigned long, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +/* New in 3.9 */ +PyAPI_FUNC(PyInterpreterState*) PyThreadState_GetInterpreter(PyThreadState *tstate); +PyAPI_FUNC(PyFrameObject*) PyThreadState_GetFrame(PyThreadState *tstate); +PyAPI_FUNC(uint64_t) PyThreadState_GetID(PyThreadState *tstate); +#endif + typedef enum {PyGILState_LOCKED, PyGILState_UNLOCKED} PyGILState_STATE; diff --git a/Include/pythonrun.h b/Include/pythonrun.h index 46091e09..57529072 100644 --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -72,16 +72,23 @@ PyAPI_FUNC(struct _mod *) PyParser_ASTFromFileObject( #define PyParser_SimpleParseFile(FP, S, B) \ PyParser_SimpleParseFileFlags(FP, S, B, 0) #endif -PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int, - int); + +#ifndef Py_BUILD_CORE +Py_DEPRECATED(3.9) +#endif +PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int, int); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +#ifndef Py_BUILD_CORE +Py_DEPRECATED(3.9) +#endif PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlagsFilename(const char *, const char *, int, int); #endif -PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *, - int, int); - +#ifndef Py_BUILD_CORE +Py_DEPRECATED(3.9) +#endif +PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *, int, int); #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, PyObject *, PyCompilerFlags *); diff --git a/Include/pythread.h b/Include/pythread.h index f22e8c42..bb9d8641 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -3,7 +3,6 @@ #define Py_PYTHREAD_H typedef void *PyThread_type_lock; -typedef void *PyThread_type_sema; #ifdef __cplusplus extern "C" { @@ -37,6 +36,15 @@ PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); #define WAIT_LOCK 1 #define NOWAIT_LOCK 0 +#ifndef Py_LIMITED_API +#ifdef HAVE_FORK +/* Private function to reinitialize a lock at fork in the child process. + Reset the lock to the unlocked state. + Return 0 on success, return -1 on error. */ +PyAPI_FUNC(int) _PyThread_at_fork_reinit(PyThread_type_lock *lock); +#endif /* HAVE_FORK */ +#endif /* !Py_LIMITED_API */ + /* PY_TIMEOUT_T is the integral type used to specify timeouts when waiting on a lock (see PyThread_acquire_lock_timed() below). PY_TIMEOUT_MAX is the highest usable value (in microseconds) of that @@ -51,16 +59,16 @@ PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); #if defined(_POSIX_THREADS) /* PyThread_acquire_lock_timed() uses _PyTime_FromNanoseconds(us * 1000), convert microseconds to nanoseconds. */ -# define PY_TIMEOUT_MAX (PY_LLONG_MAX / 1000) +# define PY_TIMEOUT_MAX (LLONG_MAX / 1000) #elif defined (NT_THREADS) /* In the NT API, the timeout is a DWORD and is expressed in milliseconds */ -# if 0xFFFFFFFFLL * 1000 < PY_LLONG_MAX +# if 0xFFFFFFFFLL * 1000 < LLONG_MAX # define PY_TIMEOUT_MAX (0xFFFFFFFFLL * 1000) # else -# define PY_TIMEOUT_MAX PY_LLONG_MAX +# define PY_TIMEOUT_MAX LLONG_MAX # endif #else -# define PY_TIMEOUT_MAX PY_LLONG_MAX +# define PY_TIMEOUT_MAX LLONG_MAX #endif diff --git a/Include/rangeobject.h b/Include/rangeobject.h index 7e4dc288..d6af8473 100644 --- a/Include/rangeobject.h +++ b/Include/rangeobject.h @@ -19,7 +19,7 @@ PyAPI_DATA(PyTypeObject) PyRange_Type; PyAPI_DATA(PyTypeObject) PyRangeIter_Type; PyAPI_DATA(PyTypeObject) PyLongRangeIter_Type; -#define PyRange_Check(op) (Py_TYPE(op) == &PyRange_Type) +#define PyRange_Check(op) Py_IS_TYPE(op, &PyRange_Type) #ifdef __cplusplus } diff --git a/Include/setobject.h b/Include/setobject.h index fc0ea839..119619eb 100644 --- a/Include/setobject.h +++ b/Include/setobject.h @@ -70,7 +70,6 @@ PyAPI_DATA(PyObject *) _PySet_Dummy; PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, Py_hash_t *hash); PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable); -PyAPI_FUNC(int) PySet_ClearFreeList(void); #endif /* Section excluded by Py_LIMITED_API */ @@ -88,18 +87,18 @@ PyAPI_FUNC(int) PySet_Discard(PyObject *set, PyObject *key); PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set); PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); -#define PyFrozenSet_CheckExact(ob) (Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyFrozenSet_CheckExact(ob) Py_IS_TYPE(ob, &PyFrozenSet_Type) #define PyAnySet_CheckExact(ob) \ - (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type) + (Py_IS_TYPE(ob, &PySet_Type) || Py_IS_TYPE(ob, &PyFrozenSet_Type)) #define PyAnySet_Check(ob) \ - (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type || \ + (Py_IS_TYPE(ob, &PySet_Type) || Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) #define PySet_Check(ob) \ - (Py_TYPE(ob) == &PySet_Type || \ + (Py_IS_TYPE(ob, &PySet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) #define PyFrozenSet_Check(ob) \ - (Py_TYPE(ob) == &PyFrozenSet_Type || \ + (Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) #ifdef __cplusplus diff --git a/Include/sliceobject.h b/Include/sliceobject.h index aae6f3cc..2c889508 100644 --- a/Include/sliceobject.h +++ b/Include/sliceobject.h @@ -28,7 +28,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PySlice_Type; PyAPI_DATA(PyTypeObject) PyEllipsis_Type; -#define PySlice_Check(op) (Py_TYPE(op) == &PySlice_Type) +#define PySlice_Check(op) Py_IS_TYPE(op, &PySlice_Type) PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop, PyObject* step); diff --git a/Include/structseq.h b/Include/structseq.h index e5e5d5c5..8f51c891 100644 --- a/Include/structseq.h +++ b/Include/structseq.h @@ -19,7 +19,7 @@ typedef struct PyStructSequence_Desc { int n_in_sequence; } PyStructSequence_Desc; -extern char* PyStructSequence_UnnamedField; +extern const char * const PyStructSequence_UnnamedField; #ifndef Py_LIMITED_API PyAPI_FUNC(void) PyStructSequence_InitType(PyTypeObject *type, diff --git a/Include/symtable.h b/Include/symtable.h index 5dcfa7e2..abd19a79 100644 --- a/Include/symtable.h +++ b/Include/symtable.h @@ -69,7 +69,7 @@ typedef struct _symtable_entry { PyAPI_DATA(PyTypeObject) PySTEntry_Type; -#define PySTEntry_Check(op) (Py_TYPE(op) == &PySTEntry_Type) +#define PySTEntry_Check(op) Py_IS_TYPE(op, &PySTEntry_Type) PyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *); diff --git a/Include/token.h b/Include/token.h index e08708ba..9b8a3aae 100644 --- a/Include/token.h +++ b/Include/token.h @@ -78,6 +78,10 @@ extern "C" { #define ISTERMINAL(x) ((x) < NT_OFFSET) #define ISNONTERMINAL(x) ((x) >= NT_OFFSET) #define ISEOF(x) ((x) == ENDMARKER) +#define ISWHITESPACE(x) ((x) == ENDMARKER || \ + (x) == NEWLINE || \ + (x) == INDENT || \ + (x) == DEDENT) PyAPI_DATA(const char * const) _PyParser_TokenNames[]; /* Token names */ diff --git a/Include/traceback.h b/Include/traceback.h index b451927f..781e5a6e 100644 --- a/Include/traceback.h +++ b/Include/traceback.h @@ -4,16 +4,14 @@ extern "C" { #endif -struct _frame; - /* Traceback interface */ -PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *); +PyAPI_FUNC(int) PyTraceBack_Here(PyFrameObject *); PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *); /* Reveal traceback type so we can typecheck traceback objects */ PyAPI_DATA(PyTypeObject) PyTraceBack_Type; -#define PyTraceBack_Check(v) (Py_TYPE(v) == &PyTraceBack_Type) +#define PyTraceBack_Check(v) Py_IS_TYPE(v, &PyTraceBack_Type) #ifndef Py_LIMITED_API diff --git a/Include/tupleobject.h b/Include/tupleobject.h index 590902de..e796a320 100644 --- a/Include/tupleobject.h +++ b/Include/tupleobject.h @@ -25,7 +25,7 @@ PyAPI_DATA(PyTypeObject) PyTupleIter_Type; #define PyTuple_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS) -#define PyTuple_CheckExact(op) (Py_TYPE(op) == &PyTuple_Type) +#define PyTuple_CheckExact(op) Py_IS_TYPE(op, &PyTuple_Type) PyAPI_FUNC(PyObject *) PyTuple_New(Py_ssize_t size); PyAPI_FUNC(Py_ssize_t) PyTuple_Size(PyObject *); @@ -34,8 +34,6 @@ PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); PyAPI_FUNC(PyObject *) PyTuple_Pack(Py_ssize_t, ...); -PyAPI_FUNC(int) PyTuple_ClearFreeList(void); - #ifndef Py_LIMITED_API # define Py_CPYTHON_TUPLEOBJECT_H # include "cpython/tupleobject.h" diff --git a/Include/typeslots.h b/Include/typeslots.h index 0ce6a377..64f6fff5 100644 --- a/Include/typeslots.h +++ b/Include/typeslots.h @@ -1,7 +1,12 @@ /* Do not renumber the file; these numbers are part of the stable ABI. */ +#if defined(Py_LIMITED_API) /* Disabled, see #10181 */ #undef Py_bf_getbuffer #undef Py_bf_releasebuffer +#else +#define Py_bf_getbuffer 1 +#define Py_bf_releasebuffer 2 +#endif #define Py_mp_ass_subscript 3 #define Py_mp_length 4 #define Py_mp_subscript 5 diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 97d8cd12..500ce242 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -113,7 +113,7 @@ PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type; #define PyUnicode_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS) -#define PyUnicode_CheckExact(op) (Py_TYPE(op) == &PyUnicode_Type) +#define PyUnicode_CheckExact(op) Py_IS_TYPE(op, &PyUnicode_Type) /* --- Constants ---------------------------------------------------------- */ @@ -328,17 +328,6 @@ PyAPI_FUNC(wchar_t*) PyUnicode_AsWideCharString( PyAPI_FUNC(PyObject*) PyUnicode_FromOrdinal(int ordinal); -/* --- Free-list management ----------------------------------------------- */ - -/* Clear the free list used by the Unicode implementation. - - This can be used to release memory used for objects on the free - list back to the Python memory allocator. - -*/ - -PyAPI_FUNC(int) PyUnicode_ClearFreeList(void); - /* === Builtin Codecs ===================================================== Many of these APIs take two arguments encoding and errors. These diff --git a/Include/weakrefobject.h b/Include/weakrefobject.h index 17051568..ac4b4821 100644 --- a/Include/weakrefobject.h +++ b/Include/weakrefobject.h @@ -46,10 +46,10 @@ PyAPI_DATA(PyTypeObject) _PyWeakref_CallableProxyType; #define PyWeakref_CheckRef(op) PyObject_TypeCheck(op, &_PyWeakref_RefType) #define PyWeakref_CheckRefExact(op) \ - (Py_TYPE(op) == &_PyWeakref_RefType) + Py_IS_TYPE(op, &_PyWeakref_RefType) #define PyWeakref_CheckProxy(op) \ - ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ - (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) + (Py_IS_TYPE(op, &_PyWeakref_ProxyType) || \ + Py_IS_TYPE(op, &_PyWeakref_CallableProxyType)) #define PyWeakref_Check(op) \ (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) diff --git a/Lib/_aix_support.py b/Lib/_aix_support.py new file mode 100644 index 00000000..45504934 --- /dev/null +++ b/Lib/_aix_support.py @@ -0,0 +1,89 @@ +"""Shared AIX support functions.""" + +import sys +import sysconfig + +try: + import subprocess +except ImportError: # pragma: no cover + # _aix_support is used in distutils by setup.py to build C extensions, + # before subprocess dependencies like _posixsubprocess are available. + import _bootsubprocess as subprocess + + +def _aix_tag(vrtl, bd): + # type: (List[int], int) -> str + # Infer the ABI bitwidth from maxsize (assuming 64 bit as the default) + _sz = 32 if sys.maxsize == (2**31-1) else 64 + # vrtl[version, release, technology_level] + return "aix-{:1x}{:1d}{:02d}-{:04d}-{}".format(vrtl[0], vrtl[1], vrtl[2], bd, _sz) + + +# extract version, release and technology level from a VRMF string +def _aix_vrtl(vrmf): + # type: (str) -> List[int] + v, r, tl = vrmf.split(".")[:3] + return [int(v[-1]), int(r), int(tl)] + + +def _aix_bosmp64(): + # type: () -> Tuple[str, int] + """ + Return a Tuple[str, int] e.g., ['7.1.4.34', 1806] + The fileset bos.mp64 is the AIX kernel. It's VRMF and builddate + reflect the current ABI levels of the runtime environment. + """ + # We expect all AIX systems to have lslpp installed in this location + out = subprocess.check_output(["/usr/bin/lslpp", "-Lqc", "bos.mp64"]) + out = out.decode("utf-8") + out = out.strip().split(":") # type: ignore + # Use str() and int() to help mypy see types + return (str(out[2]), int(out[-1])) + + +def aix_platform(): + # type: () -> str + """ + AIX filesets are identified by four decimal values: V.R.M.F. + V (version) and R (release) can be retreived using ``uname`` + Since 2007, starting with AIX 5.3 TL7, the M value has been + included with the fileset bos.mp64 and represents the Technology + Level (TL) of AIX. The F (Fix) value also increases, but is not + relevant for comparing releases and binary compatibility. + For binary compatibility the so-called builddate is needed. + Again, the builddate of an AIX release is associated with bos.mp64. + AIX ABI compatibility is described as guaranteed at: https://www.ibm.com/\ + support/knowledgecenter/en/ssw_aix_72/install/binary_compatability.html + + For pep425 purposes the AIX platform tag becomes: + "aix-{:1x}{:1d}{:02d}-{:04d}-{}".format(v, r, tl, builddate, bitsize) + e.g., "aix-6107-1415-32" for AIX 6.1 TL7 bd 1415, 32-bit + and, "aix-6107-1415-64" for AIX 6.1 TL7 bd 1415, 64-bit + """ + vrmf, bd = _aix_bosmp64() + return _aix_tag(_aix_vrtl(vrmf), bd) + + +# extract vrtl from the BUILD_GNU_TYPE as an int +def _aix_bgt(): + # type: () -> List[int] + gnu_type = sysconfig.get_config_var("BUILD_GNU_TYPE") + if not gnu_type: + raise ValueError("BUILD_GNU_TYPE is not defined") + return _aix_vrtl(vrmf=gnu_type) + + +def aix_buildtag(): + # type: () -> str + """ + Return the platform_tag of the system Python was built on. + """ + # AIX_BUILDDATE is defined by configure with: + # lslpp -Lcq bos.mp64 | awk -F: '{ print $NF }' + build_date = sysconfig.get_config_var("AIX_BUILDDATE") + try: + build_date = int(build_date) + except (ValueError, TypeError): + raise ValueError(f"AIX_BUILDDATE is not defined or invalid: " + f"{build_date!r}") + return _aix_tag(_aix_bgt(), build_date) diff --git a/Lib/_bootsubprocess.py b/Lib/_bootsubprocess.py new file mode 100644 index 00000000..014782f6 --- /dev/null +++ b/Lib/_bootsubprocess.py @@ -0,0 +1,97 @@ +""" +Basic subprocess implementation for POSIX which only uses os functions. Only +implement features required by setup.py to build C extension modules when +subprocess is unavailable. setup.py is not used on Windows. +""" +import os + + +# distutils.spawn used by distutils.command.build_ext +# calls subprocess.Popen().wait() +class Popen: + def __init__(self, cmd, env=None): + self._cmd = cmd + self._env = env + self.returncode = None + + def wait(self): + pid = os.fork() + if pid == 0: + # Child process + try: + if self._env is not None: + os.execve(self._cmd[0], self._cmd, self._env) + else: + os.execv(self._cmd[0], self._cmd) + finally: + os._exit(1) + else: + # Parent process + _, status = os.waitpid(pid, 0) + self.returncode = os.waitstatus_to_exitcode(status) + + return self.returncode + + +def _check_cmd(cmd): + # Use regex [a-zA-Z0-9./-]+: reject empty string, space, etc. + safe_chars = [] + for first, last in (("a", "z"), ("A", "Z"), ("0", "9")): + for ch in range(ord(first), ord(last) + 1): + safe_chars.append(chr(ch)) + safe_chars.append("./-") + safe_chars = ''.join(safe_chars) + + if isinstance(cmd, (tuple, list)): + check_strs = cmd + elif isinstance(cmd, str): + check_strs = [cmd] + else: + return False + + for arg in check_strs: + if not isinstance(arg, str): + return False + if not arg: + # reject empty string + return False + for ch in arg: + if ch not in safe_chars: + return False + + return True + + +# _aix_support used by distutil.util calls subprocess.check_output() +def check_output(cmd, **kwargs): + if kwargs: + raise NotImplementedError(repr(kwargs)) + + if not _check_cmd(cmd): + raise ValueError(f"unsupported command: {cmd!r}") + + tmp_filename = "check_output.tmp" + if not isinstance(cmd, str): + cmd = " ".join(cmd) + cmd = f"{cmd} >{tmp_filename}" + + try: + # system() spawns a shell + status = os.system(cmd) + exitcode = os.waitstatus_to_exitcode(status) + if exitcode: + raise ValueError(f"Command {cmd!r} returned non-zero " + f"exit status {exitcode!r}") + + try: + with open(tmp_filename, "rb") as fp: + stdout = fp.read() + except FileNotFoundError: + stdout = b'' + finally: + try: + os.unlink(tmp_filename) + except OSError: + pass + + return stdout diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index 2b2ddba1..36cd9930 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -9,6 +9,8 @@ Unit tests are in test_collections. from abc import ABCMeta, abstractmethod import sys +GenericAlias = type(list[int]) + __all__ = ["Awaitable", "Coroutine", "AsyncIterable", "AsyncIterator", "AsyncGenerator", "Hashable", "Iterable", "Iterator", "Generator", "Reversible", @@ -110,6 +112,8 @@ class Awaitable(metaclass=ABCMeta): return _check_methods(C, "__await__") return NotImplemented + __class_getitem__ = classmethod(GenericAlias) + class Coroutine(Awaitable): @@ -169,6 +173,8 @@ class AsyncIterable(metaclass=ABCMeta): return _check_methods(C, "__aiter__") return NotImplemented + __class_getitem__ = classmethod(GenericAlias) + class AsyncIterator(AsyncIterable): @@ -255,6 +261,8 @@ class Iterable(metaclass=ABCMeta): return _check_methods(C, "__iter__") return NotImplemented + __class_getitem__ = classmethod(GenericAlias) + class Iterator(Iterable): @@ -274,6 +282,7 @@ class Iterator(Iterable): return _check_methods(C, '__iter__', '__next__') return NotImplemented + Iterator.register(bytes_iterator) Iterator.register(bytearray_iterator) #Iterator.register(callable_iterator) @@ -353,6 +362,7 @@ class Generator(Iterator): 'send', 'throw', 'close') return NotImplemented + Generator.register(generator) @@ -385,6 +395,9 @@ class Container(metaclass=ABCMeta): return _check_methods(C, "__contains__") return NotImplemented + __class_getitem__ = classmethod(GenericAlias) + + class Collection(Sized, Iterable, Container): __slots__ = () @@ -395,6 +408,7 @@ class Collection(Sized, Iterable, Container): return _check_methods(C, "__len__", "__iter__", "__contains__") return NotImplemented + class Callable(metaclass=ABCMeta): __slots__ = () @@ -409,6 +423,8 @@ class Callable(metaclass=ABCMeta): return _check_methods(C, "__call__") return NotImplemented + __class_getitem__ = classmethod(GenericAlias) + ### SETS ### @@ -550,6 +566,7 @@ class Set(Collection): h = 590923713 return h + Set.register(frozenset) @@ -632,6 +649,7 @@ class MutableSet(Set): self.discard(value) return self + MutableSet.register(set) @@ -688,6 +706,7 @@ class Mapping(Collection): __reversed__ = None + Mapping.register(mappingproxy) @@ -704,6 +723,8 @@ class MappingView(Sized): def __repr__(self): return '{0.__class__.__name__}({0._mapping!r})'.format(self) + __class_getitem__ = classmethod(GenericAlias) + class KeysView(MappingView, Set): @@ -719,6 +740,7 @@ class KeysView(MappingView, Set): def __iter__(self): yield from self._mapping + KeysView.register(dict_keys) @@ -743,6 +765,7 @@ class ItemsView(MappingView, Set): for key in self._mapping: yield (key, self._mapping[key]) + ItemsView.register(dict_items) @@ -761,6 +784,7 @@ class ValuesView(MappingView, Collection): for key in self._mapping: yield self._mapping[key] + ValuesView.register(dict_values) @@ -847,6 +871,7 @@ class MutableMapping(Mapping): self[key] = default return default + MutableMapping.register(dict) @@ -914,6 +939,7 @@ class Sequence(Reversible, Collection): 'S.count(value) -> integer -- return number of occurrences of value' return sum(1 for v in self if v is value or v == value) + Sequence.register(tuple) Sequence.register(str) Sequence.register(range) @@ -1000,5 +1026,6 @@ class MutableSequence(Sequence): self.extend(values) return self + MutableSequence.register(list) MutableSequence.register(bytearray) # Multiply inheriting, see ByteString diff --git a/Lib/_dummy_thread.py b/Lib/_dummy_thread.py deleted file mode 100644 index 2e46a076..00000000 --- a/Lib/_dummy_thread.py +++ /dev/null @@ -1,193 +0,0 @@ -"""Drop-in replacement for the thread module. - -Meant to be used as a brain-dead substitute so that threaded code does -not need to be rewritten for when the thread module is not present. - -Suggested usage is:: - - try: - import _thread - except ImportError: - import _dummy_thread as _thread - -""" -# Exports only things specified by thread documentation; -# skipping obsolete synonyms allocate(), start_new(), exit_thread(). -__all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock', - 'interrupt_main', 'LockType', 'RLock'] - -# A dummy value -TIMEOUT_MAX = 2**31 - -# NOTE: this module can be imported early in the extension building process, -# and so top level imports of other modules should be avoided. Instead, all -# imports are done when needed on a function-by-function basis. Since threads -# are disabled, the import lock should not be an issue anyway (??). - -error = RuntimeError - -def start_new_thread(function, args, kwargs={}): - """Dummy implementation of _thread.start_new_thread(). - - Compatibility is maintained by making sure that ``args`` is a - tuple and ``kwargs`` is a dictionary. If an exception is raised - and it is SystemExit (which can be done by _thread.exit()) it is - caught and nothing is done; all other exceptions are printed out - by using traceback.print_exc(). - - If the executed function calls interrupt_main the KeyboardInterrupt will be - raised when the function returns. - - """ - if type(args) != type(tuple()): - raise TypeError("2nd arg must be a tuple") - if type(kwargs) != type(dict()): - raise TypeError("3rd arg must be a dict") - global _main - _main = False - try: - function(*args, **kwargs) - except SystemExit: - pass - except: - import traceback - traceback.print_exc() - _main = True - global _interrupt - if _interrupt: - _interrupt = False - raise KeyboardInterrupt - -def exit(): - """Dummy implementation of _thread.exit().""" - raise SystemExit - -def get_ident(): - """Dummy implementation of _thread.get_ident(). - - Since this module should only be used when _threadmodule is not - available, it is safe to assume that the current process is the - only thread. Thus a constant can be safely returned. - """ - return 1 - -def allocate_lock(): - """Dummy implementation of _thread.allocate_lock().""" - return LockType() - -def stack_size(size=None): - """Dummy implementation of _thread.stack_size().""" - if size is not None: - raise error("setting thread stack size not supported") - return 0 - -def _set_sentinel(): - """Dummy implementation of _thread._set_sentinel().""" - return LockType() - -class LockType(object): - """Class implementing dummy implementation of _thread.LockType. - - Compatibility is maintained by maintaining self.locked_status - which is a boolean that stores the state of the lock. Pickling of - the lock, though, should not be done since if the _thread module is - then used with an unpickled ``lock()`` from here problems could - occur from this class not having atomic methods. - - """ - - def __init__(self): - self.locked_status = False - - def acquire(self, waitflag=None, timeout=-1): - """Dummy implementation of acquire(). - - For blocking calls, self.locked_status is automatically set to - True and returned appropriately based on value of - ``waitflag``. If it is non-blocking, then the value is - actually checked and not set if it is already acquired. This - is all done so that threading.Condition's assert statements - aren't triggered and throw a little fit. - - """ - if waitflag is None or waitflag: - self.locked_status = True - return True - else: - if not self.locked_status: - self.locked_status = True - return True - else: - if timeout > 0: - import time - time.sleep(timeout) - return False - - __enter__ = acquire - - def __exit__(self, typ, val, tb): - self.release() - - def release(self): - """Release the dummy lock.""" - # XXX Perhaps shouldn't actually bother to test? Could lead - # to problems for complex, threaded code. - if not self.locked_status: - raise error - self.locked_status = False - return True - - def locked(self): - return self.locked_status - - def __repr__(self): - return "<%s %s.%s object at %s>" % ( - "locked" if self.locked_status else "unlocked", - self.__class__.__module__, - self.__class__.__qualname__, - hex(id(self)) - ) - - -class RLock(LockType): - """Dummy implementation of threading._RLock. - - Re-entrant lock can be aquired multiple times and needs to be released - just as many times. This dummy implemention does not check wheter the - current thread actually owns the lock, but does accounting on the call - counts. - """ - def __init__(self): - super().__init__() - self._levels = 0 - - def acquire(self, waitflag=None, timeout=-1): - """Aquire the lock, can be called multiple times in succession. - """ - locked = super().acquire(waitflag, timeout) - if locked: - self._levels += 1 - return locked - - def release(self): - """Release needs to be called once for every call to acquire(). - """ - if self._levels == 0: - raise error - if self._levels == 1: - super().release() - self._levels -= 1 - -# Used to signal that interrupt_main was called in a "thread" -_interrupt = False -# True when not executing in a "thread" -_main = True - -def interrupt_main(): - """Set _interrupt flag to True to have start_new_thread raise - KeyboardInterrupt upon exiting.""" - if _main: - raise KeyboardInterrupt - else: - global _interrupt - _interrupt = True diff --git a/Lib/_pyio.py b/Lib/_pyio.py index fd31b8ca..4804ed27 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -36,6 +36,8 @@ BlockingIOError = BlockingIOError # Does io.IOBase finalizer log the exception if the close() method fails? # The exception is ignored silently by default in release build. _IOBASE_EMITS_UNRAISABLE = (hasattr(sys, "gettotalrefcount") or sys.flags.dev_mode) +# Does open() check its 'errors' argument? +_CHECK_ERRORS = _IOBASE_EMITS_UNRAISABLE def open(file, mode="r", buffering=-1, encoding=None, errors=None, @@ -802,6 +804,9 @@ class _BufferedIOMixin(BufferedIOBase): return pos def truncate(self, pos=None): + self._checkClosed() + self._checkWritable() + # Flush the stream. We're mixing buffered I/O with lower-level I/O, # and a flush may be necessary to synch both views of the current # file state. @@ -1571,7 +1576,7 @@ class FileIO(RawIOBase): raise IsADirectoryError(errno.EISDIR, os.strerror(errno.EISDIR), file) except AttributeError: - # Ignore the AttribueError if stat.S_ISDIR or errno.EISDIR + # Ignore the AttributeError if stat.S_ISDIR or errno.EISDIR # don't exist. pass self._blksize = getattr(fdfstat, 'st_blksize', 0) @@ -2026,6 +2031,8 @@ class TextIOWrapper(TextIOBase): else: if not isinstance(errors, str): raise ValueError("invalid errors: %r" % errors) + if _CHECK_ERRORS: + codecs.lookup_error(errors) self._buffer = buffer self._decoded_chars = '' # buffer for text returned from decoder @@ -2295,7 +2302,7 @@ class TextIOWrapper(TextIOBase): return not eof def _pack_cookie(self, position, dec_flags=0, - bytes_to_feed=0, need_eof=0, chars_to_skip=0): + bytes_to_feed=0, need_eof=False, chars_to_skip=0): # The meaning of a tell() cookie is: seek to position, set the # decoder flags to dec_flags, read bytes_to_feed bytes, feed them # into the decoder with need_eof as the EOF flag, then skip @@ -2309,7 +2316,7 @@ class TextIOWrapper(TextIOBase): rest, dec_flags = divmod(rest, 1<<64) rest, bytes_to_feed = divmod(rest, 1<<64) need_eof, chars_to_skip = divmod(rest, 1<<64) - return position, dec_flags, bytes_to_feed, need_eof, chars_to_skip + return position, dec_flags, bytes_to_feed, bool(need_eof), chars_to_skip def tell(self): if not self._seekable: @@ -2383,7 +2390,7 @@ class TextIOWrapper(TextIOBase): # (a point where the decoder has nothing buffered, so seek() # can safely start from there and advance to this location). bytes_fed = 0 - need_eof = 0 + need_eof = False # Chars decoded since `start_pos` chars_decoded = 0 for i in range(skip_bytes, len(next_input)): @@ -2400,7 +2407,7 @@ class TextIOWrapper(TextIOBase): else: # We didn't get enough decoded data; signal EOF to get more. chars_decoded += len(decoder.decode(b'', final=True)) - need_eof = 1 + need_eof = True if chars_decoded < chars_to_skip: raise OSError("can't reconstruct logical file position") diff --git a/Lib/_strptime.py b/Lib/_strptime.py index f4f3c0b8..5df37f5f 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -182,7 +182,7 @@ class TimeRE(dict): self.locale_time = LocaleTime() base = super() base.__init__({ - # The " \d" part of the regex is to make %c from ANSI C work + # The " [1-9]" part of the regex is to make %c from ANSI C work 'd': r"(?P3[0-1]|[1-2]\d|0[1-9]|[1-9]| [1-9])", 'f': r"(?P[0-9]{1,6})", 'H': r"(?P2[0-3]|[0-1]\d|\d)", diff --git a/Lib/_weakrefset.py b/Lib/_weakrefset.py index 7a848236..b267780f 100644 --- a/Lib/_weakrefset.py +++ b/Lib/_weakrefset.py @@ -3,6 +3,7 @@ # by abc.py to load everything else at startup. from _weakref import ref +from types import GenericAlias __all__ = ['WeakSet'] @@ -197,3 +198,5 @@ class WeakSet: def __repr__(self): return repr(self.data) + + __class_getitem__ = classmethod(GenericAlias) diff --git a/Lib/aifc.py b/Lib/aifc.py index 1916e7ef..ed5da7d8 100644 --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -138,7 +138,7 @@ import struct import builtins import warnings -__all__ = ["Error", "open", "openfp"] +__all__ = ["Error", "open"] class Error(Exception): pass @@ -920,10 +920,6 @@ def open(f, mode=None): else: raise Error("mode must be 'r', 'rb', 'w', or 'wb'") -def openfp(f, mode=None): - warnings.warn("aifc.openfp is deprecated since Python 3.7. " - "Use aifc.open instead.", DeprecationWarning, stacklevel=2) - return open(f, mode=mode) if __name__ == '__main__': import sys diff --git a/Lib/antigravity.py b/Lib/antigravity.py index c6f174ca..6dc52073 100644 --- a/Lib/antigravity.py +++ b/Lib/antigravity.py @@ -12,6 +12,6 @@ def geohash(latitude, longitude, datedow): ''' # https://xkcd.com/426/ - h = hashlib.md5(datedow).hexdigest() + h = hashlib.md5(datedow, usedforsecurity=False).hexdigest() p, q = [('%f' % float.fromhex('0.' + x)) for x in (h[:16], h[16:32])] print('%d%s %d%s' % (latitude, p[1:], longitude, q[1:])) diff --git a/Lib/argparse.py b/Lib/argparse.py index 2dad5f12..2fb1da59 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -67,6 +67,7 @@ __all__ = [ 'ArgumentParser', 'ArgumentError', 'ArgumentTypeError', + 'BooleanOptionalAction', 'FileType', 'HelpFormatter', 'ArgumentDefaultsHelpFormatter', @@ -86,7 +87,6 @@ __all__ = [ import os as _os import re as _re -import shutil as _shutil import sys as _sys from gettext import gettext as _, ngettext @@ -129,7 +129,7 @@ class _AttributeHolder(object): return '%s(%s)' % (type_name, ', '.join(arg_strings)) def _get_kwargs(self): - return sorted(self.__dict__.items()) + return list(self.__dict__.items()) def _get_args(self): return [] @@ -166,7 +166,8 @@ class HelpFormatter(object): # default setting for width if width is None: - width = _shutil.get_terminal_size().columns + import shutil + width = shutil.get_terminal_size().columns width -= 2 self._prog = prog @@ -263,7 +264,7 @@ class HelpFormatter(object): invocations.append(get_invocation(subaction)) # update the maximum item length - invocation_length = max([len(s) for s in invocations]) + invocation_length = max(map(len, invocations)) action_length = invocation_length + self._current_indent self._action_max_length = max(self._action_max_length, action_length) @@ -454,7 +455,7 @@ class HelpFormatter(object): # if the Optional doesn't take a value, format is: # -s or --long if action.nargs == 0: - part = '%s' % option_string + part = action.format_usage() # if the Optional takes a value, format is: # -s ARGS or --long ARGS @@ -590,7 +591,11 @@ class HelpFormatter(object): elif action.nargs == OPTIONAL: result = '[%s]' % get_metavar(1) elif action.nargs == ZERO_OR_MORE: - result = '[%s [%s ...]]' % get_metavar(2) + metavar = get_metavar(1) + if len(metavar) == 2: + result = '[%s [%s ...]]' % metavar + else: + result = '[%s ...]' % metavar elif action.nargs == ONE_OR_MORE: result = '%s [%s ...]' % get_metavar(2) elif action.nargs == REMAINDER: @@ -842,9 +847,52 @@ class Action(_AttributeHolder): ] return [(name, getattr(self, name)) for name in names] + def format_usage(self): + return self.option_strings[0] + def __call__(self, parser, namespace, values, option_string=None): raise NotImplementedError(_('.__call__() not defined')) +class BooleanOptionalAction(Action): + def __init__(self, + option_strings, + dest, + default=None, + type=None, + choices=None, + required=False, + help=None, + metavar=None): + + _option_strings = [] + for option_string in option_strings: + _option_strings.append(option_string) + + if option_string.startswith('--'): + option_string = '--no-' + option_string[2:] + _option_strings.append(option_string) + + if help is not None and default is not None: + help += f" (default: {default})" + + super().__init__( + option_strings=_option_strings, + dest=dest, + nargs=0, + default=default, + type=type, + choices=choices, + required=required, + help=help, + metavar=metavar) + + def __call__(self, parser, namespace, values, option_string=None): + if option_string in self.option_strings: + setattr(namespace, self.dest, not option_string.startswith('--no-')) + + def format_usage(self): + return ' | '.join(self.option_strings) + class _StoreAction(Action): @@ -1490,10 +1538,8 @@ class _ActionsContainer(object): # strings starting with two prefix characters are long options option_strings.append(option_string) - if option_string[0] in self.prefix_chars: - if len(option_string) > 1: - if option_string[1] in self.prefix_chars: - long_option_strings.append(option_string) + if len(option_string) > 1 and option_string[1] in self.prefix_chars: + long_option_strings.append(option_string) # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x' dest = kwargs.pop('dest', None) @@ -1633,6 +1679,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): - conflict_handler -- String indicating how to handle conflicts - add_help -- Add a -h/-help option - allow_abbrev -- Allow long options to be abbreviated unambiguously + - exit_on_error -- Determines whether or not ArgumentParser exits with + error info when an error occurs """ def __init__(self, @@ -1647,7 +1695,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): argument_default=None, conflict_handler='error', add_help=True, - allow_abbrev=True): + allow_abbrev=True, + exit_on_error=True): superinit = super(ArgumentParser, self).__init__ superinit(description=description, @@ -1666,6 +1715,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): self.fromfile_prefix_chars = fromfile_prefix_chars self.add_help = add_help self.allow_abbrev = allow_abbrev + self.exit_on_error = exit_on_error add_group = self.add_argument_group self._positionals = add_group(_('positional arguments')) @@ -1796,15 +1846,19 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): setattr(namespace, dest, self._defaults[dest]) # parse the arguments and exit if there are any errors - try: + if self.exit_on_error: + try: + namespace, args = self._parse_known_args(args, namespace) + except ArgumentError: + err = _sys.exc_info()[1] + self.error(str(err)) + else: namespace, args = self._parse_known_args(args, namespace) - if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): - args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) - delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) - return namespace, args - except ArgumentError: - err = _sys.exc_info()[1] - self.error(str(err)) + + if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): + args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) + delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) + return namespace, args def _parse_known_args(self, arg_strings, namespace): # replace arg strings that are file references diff --git a/Lib/ast.py b/Lib/ast.py index d29db80a..d860917f 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -24,7 +24,10 @@ :copyright: Copyright 2008 by Armin Ronacher. :license: Python License. """ +import sys from _ast import * +from contextlib import contextmanager, nullcontext +from enum import IntEnum, auto def parse(source, filename='', mode='exec', *, @@ -82,6 +85,9 @@ def literal_eval(node_or_string): return list(map(_convert, node.elts)) elif isinstance(node, Set): return set(map(_convert, node.elts)) + elif (isinstance(node, Call) and isinstance(node.func, Name) and + node.func.id == 'set' and node.args == node.keywords == []): + return set() elif isinstance(node, Dict): if len(node.keys) != len(node.values): _raise_malformed_node(node) @@ -99,7 +105,7 @@ def literal_eval(node_or_string): return _convert(node_or_string) -def dump(node, annotate_fields=True, include_attributes=False): +def dump(node, annotate_fields=True, include_attributes=False, *, indent=None): """ Return a formatted dump of the tree in node. This is mainly useful for debugging purposes. If annotate_fields is true (by default), @@ -107,35 +113,63 @@ def dump(node, annotate_fields=True, include_attributes=False): If annotate_fields is false, the result string will be more compact by omitting unambiguous field names. Attributes such as line numbers and column offsets are not dumped by default. If this is wanted, - include_attributes can be set to true. + include_attributes can be set to true. If indent is a non-negative + integer or string, then the tree will be pretty-printed with that indent + level. None (the default) selects the single line representation. """ - def _format(node): + def _format(node, level=0): + if indent is not None: + level += 1 + prefix = '\n' + indent * level + sep = ',\n' + indent * level + else: + prefix = '' + sep = ', ' if isinstance(node, AST): + cls = type(node) args = [] + allsimple = True keywords = annotate_fields - for field in node._fields: + for name in node._fields: try: - value = getattr(node, field) + value = getattr(node, name) except AttributeError: keywords = True + continue + if value is None and getattr(cls, name, ...) is None: + keywords = True + continue + value, simple = _format(value, level) + allsimple = allsimple and simple + if keywords: + args.append('%s=%s' % (name, value)) else: - if keywords: - args.append('%s=%s' % (field, _format(value))) - else: - args.append(_format(value)) + args.append(value) if include_attributes and node._attributes: - for a in node._attributes: + for name in node._attributes: try: - args.append('%s=%s' % (a, _format(getattr(node, a)))) + value = getattr(node, name) except AttributeError: - pass - return '%s(%s)' % (node.__class__.__name__, ', '.join(args)) + continue + if value is None and getattr(cls, name, ...) is None: + continue + value, simple = _format(value, level) + allsimple = allsimple and simple + args.append('%s=%s' % (name, value)) + if allsimple and len(args) <= 3: + return '%s(%s)' % (node.__class__.__name__, ', '.join(args)), not args + return '%s(%s%s)' % (node.__class__.__name__, prefix, sep.join(args)), False elif isinstance(node, list): - return '[%s]' % ', '.join(_format(x) for x in node) - return repr(node) + if not node: + return '[]', True + return '[%s%s]' % (prefix, sep.join(_format(x, level)[0] for x in node)), False + return repr(node), True + if not isinstance(node, AST): raise TypeError('expected AST, got %r' % node.__class__.__name__) - return _format(node) + if indent is not None and not isinstance(indent, str): + indent = ' ' * indent + return _format(node)[0] def copy_location(new_node, old_node): @@ -170,7 +204,7 @@ def fix_missing_locations(node): else: lineno = node.lineno if 'end_lineno' in node._attributes: - if not hasattr(node, 'end_lineno'): + if getattr(node, 'end_lineno', None) is None: node.end_lineno = end_lineno else: end_lineno = node.end_lineno @@ -180,7 +214,7 @@ def fix_missing_locations(node): else: col_offset = node.col_offset if 'end_col_offset' in node._attributes: - if not hasattr(node, 'end_col_offset'): + if getattr(node, 'end_col_offset', None) is None: node.end_col_offset = end_col_offset else: end_col_offset = node.end_col_offset @@ -285,7 +319,7 @@ def _splitlines_no_ff(source): def _pad_whitespace(source): - """Replace all chars except '\f\t' in a line with spaces.""" + r"""Replace all chars except '\f\t' in a line with spaces.""" result = '' for c in source: if c in '\f\t': @@ -305,6 +339,8 @@ def get_source_segment(source, node, *, padded=False): be padded with spaces to match its original position. """ try: + if node.end_lineno is None or node.end_col_offset is None: + return None lineno = node.lineno - 1 end_lineno = node.end_lineno - 1 col_offset = node.col_offset @@ -397,7 +433,7 @@ class NodeVisitor(object): else: import warnings warnings.warn(f"{method} is deprecated; add visit_Constant", - PendingDeprecationWarning, 2) + DeprecationWarning, 2) return visitor(node) return self.generic_visit(node) @@ -421,7 +457,7 @@ class NodeTransformer(NodeVisitor): def visit_Name(self, node): return Subscript( value=Name(id='data', ctx=Load()), - slice=Index(value=Str(s=node.id)), + slice=Constant(value=node.id), ctx=node.ctx ) @@ -461,20 +497,26 @@ class NodeTransformer(NodeVisitor): return node -# The following code is for backward compatibility. -# It will be removed in future. +# If the ast module is loaded more than once, only add deprecated methods once +if not hasattr(Constant, 'n'): + # The following code is for backward compatibility. + # It will be removed in future. -def _getter(self): - return self.value + def _getter(self): + """Deprecated. Use value instead.""" + return self.value -def _setter(self, value): - self.value = value + def _setter(self, value): + self.value = value -Constant.n = property(_getter, _setter) -Constant.s = property(_getter, _setter) + Constant.n = property(_getter, _setter) + Constant.s = property(_getter, _setter) class _ABC(type): + def __init__(cls, *args): + cls.__doc__ = """Deprecated AST node class. Use ast.Constant instead""" + def __instancecheck__(cls, inst): if not isinstance(inst, Constant): return False @@ -535,6 +577,7 @@ _const_types = { _const_types_not = { Num: (bool,), } + _const_node_type_names = { bool: 'NameConstant', # should be before int type(None): 'NameConstant', @@ -545,3 +588,943 @@ _const_node_type_names = { bytes: 'Bytes', type(...): 'Ellipsis', } + +class slice(AST): + """Deprecated AST node class.""" + +class Index(slice): + """Deprecated AST node class. Use the index value directly instead.""" + def __new__(cls, value, **kwargs): + return value + +class ExtSlice(slice): + """Deprecated AST node class. Use ast.Tuple instead.""" + def __new__(cls, dims=(), **kwargs): + return Tuple(list(dims), Load(), **kwargs) + +# If the ast module is loaded more than once, only add deprecated methods once +if not hasattr(Tuple, 'dims'): + # The following code is for backward compatibility. + # It will be removed in future. + + def _dims_getter(self): + """Deprecated. Use elts instead.""" + return self.elts + + def _dims_setter(self, value): + self.elts = value + + Tuple.dims = property(_dims_getter, _dims_setter) + +class Suite(mod): + """Deprecated AST node class. Unused in Python 3.""" + +class AugLoad(expr_context): + """Deprecated AST node class. Unused in Python 3.""" + +class AugStore(expr_context): + """Deprecated AST node class. Unused in Python 3.""" + +class Param(expr_context): + """Deprecated AST node class. Unused in Python 3.""" + + +# Large float and imaginary literals get turned into infinities in the AST. +# We unparse those infinities to INFSTR. +_INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1) + +class _Precedence(IntEnum): + """Precedence table that originated from python grammar.""" + + TUPLE = auto() + YIELD = auto() # 'yield', 'yield from' + TEST = auto() # 'if'-'else', 'lambda' + OR = auto() # 'or' + AND = auto() # 'and' + NOT = auto() # 'not' + CMP = auto() # '<', '>', '==', '>=', '<=', '!=', + # 'in', 'not in', 'is', 'is not' + EXPR = auto() + BOR = EXPR # '|' + BXOR = auto() # '^' + BAND = auto() # '&' + SHIFT = auto() # '<<', '>>' + ARITH = auto() # '+', '-' + TERM = auto() # '*', '@', '/', '%', '//' + FACTOR = auto() # unary '+', '-', '~' + POWER = auto() # '**' + AWAIT = auto() # 'await' + ATOM = auto() + + def next(self): + try: + return self.__class__(self + 1) + except ValueError: + return self + +class _Unparser(NodeVisitor): + """Methods in this class recursively traverse an AST and + output source code for the abstract syntax; original formatting + is disregarded.""" + + def __init__(self): + self._source = [] + self._buffer = [] + self._precedences = {} + self._type_ignores = {} + self._indent = 0 + + def interleave(self, inter, f, seq): + """Call f on each item in seq, calling inter() in between.""" + seq = iter(seq) + try: + f(next(seq)) + except StopIteration: + pass + else: + for x in seq: + inter() + f(x) + + def items_view(self, traverser, items): + """Traverse and separate the given *items* with a comma and append it to + the buffer. If *items* is a single item sequence, a trailing comma + will be added.""" + if len(items) == 1: + traverser(items[0]) + self.write(",") + else: + self.interleave(lambda: self.write(", "), traverser, items) + + def maybe_newline(self): + """Adds a newline if it isn't the start of generated source""" + if self._source: + self.write("\n") + + def fill(self, text=""): + """Indent a piece of text and append it, according to the current + indentation level""" + self.maybe_newline() + self.write(" " * self._indent + text) + + def write(self, text): + """Append a piece of text""" + self._source.append(text) + + def buffer_writer(self, text): + self._buffer.append(text) + + @property + def buffer(self): + value = "".join(self._buffer) + self._buffer.clear() + return value + + @contextmanager + def block(self, *, extra = None): + """A context manager for preparing the source for blocks. It adds + the character':', increases the indentation on enter and decreases + the indentation on exit. If *extra* is given, it will be directly + appended after the colon character. + """ + self.write(":") + if extra: + self.write(extra) + self._indent += 1 + yield + self._indent -= 1 + + @contextmanager + def delimit(self, start, end): + """A context manager for preparing the source for expressions. It adds + *start* to the buffer and enters, after exit it adds *end*.""" + + self.write(start) + yield + self.write(end) + + def delimit_if(self, start, end, condition): + if condition: + return self.delimit(start, end) + else: + return nullcontext() + + def require_parens(self, precedence, node): + """Shortcut to adding precedence related parens""" + return self.delimit_if("(", ")", self.get_precedence(node) > precedence) + + def get_precedence(self, node): + return self._precedences.get(node, _Precedence.TEST) + + def set_precedence(self, precedence, *nodes): + for node in nodes: + self._precedences[node] = precedence + + def get_raw_docstring(self, node): + """If a docstring node is found in the body of the *node* parameter, + return that docstring node, None otherwise. + + Logic mirrored from ``_PyAST_GetDocString``.""" + if not isinstance( + node, (AsyncFunctionDef, FunctionDef, ClassDef, Module) + ) or len(node.body) < 1: + return None + node = node.body[0] + if not isinstance(node, Expr): + return None + node = node.value + if isinstance(node, Constant) and isinstance(node.value, str): + return node + + def get_type_comment(self, node): + comment = self._type_ignores.get(node.lineno) or node.type_comment + if comment is not None: + return f" # type: {comment}" + + def traverse(self, node): + if isinstance(node, list): + for item in node: + self.traverse(item) + else: + super().visit(node) + + def visit(self, node): + """Outputs a source code string that, if converted back to an ast + (using ast.parse) will generate an AST equivalent to *node*""" + self._source = [] + self.traverse(node) + return "".join(self._source) + + def _write_docstring_and_traverse_body(self, node): + if (docstring := self.get_raw_docstring(node)): + self._write_docstring(docstring) + self.traverse(node.body[1:]) + else: + self.traverse(node.body) + + def visit_Module(self, node): + self._type_ignores = { + ignore.lineno: f"ignore{ignore.tag}" + for ignore in node.type_ignores + } + self._write_docstring_and_traverse_body(node) + self._type_ignores.clear() + + def visit_FunctionType(self, node): + with self.delimit("(", ")"): + self.interleave( + lambda: self.write(", "), self.traverse, node.argtypes + ) + + self.write(" -> ") + self.traverse(node.returns) + + def visit_Expr(self, node): + self.fill() + self.set_precedence(_Precedence.YIELD, node.value) + self.traverse(node.value) + + def visit_NamedExpr(self, node): + with self.require_parens(_Precedence.TUPLE, node): + self.set_precedence(_Precedence.ATOM, node.target, node.value) + self.traverse(node.target) + self.write(" := ") + self.traverse(node.value) + + def visit_Import(self, node): + self.fill("import ") + self.interleave(lambda: self.write(", "), self.traverse, node.names) + + def visit_ImportFrom(self, node): + self.fill("from ") + self.write("." * node.level) + if node.module: + self.write(node.module) + self.write(" import ") + self.interleave(lambda: self.write(", "), self.traverse, node.names) + + def visit_Assign(self, node): + self.fill() + for target in node.targets: + self.traverse(target) + self.write(" = ") + self.traverse(node.value) + if type_comment := self.get_type_comment(node): + self.write(type_comment) + + def visit_AugAssign(self, node): + self.fill() + self.traverse(node.target) + self.write(" " + self.binop[node.op.__class__.__name__] + "= ") + self.traverse(node.value) + + def visit_AnnAssign(self, node): + self.fill() + with self.delimit_if("(", ")", not node.simple and isinstance(node.target, Name)): + self.traverse(node.target) + self.write(": ") + self.traverse(node.annotation) + if node.value: + self.write(" = ") + self.traverse(node.value) + + def visit_Return(self, node): + self.fill("return") + if node.value: + self.write(" ") + self.traverse(node.value) + + def visit_Pass(self, node): + self.fill("pass") + + def visit_Break(self, node): + self.fill("break") + + def visit_Continue(self, node): + self.fill("continue") + + def visit_Delete(self, node): + self.fill("del ") + self.interleave(lambda: self.write(", "), self.traverse, node.targets) + + def visit_Assert(self, node): + self.fill("assert ") + self.traverse(node.test) + if node.msg: + self.write(", ") + self.traverse(node.msg) + + def visit_Global(self, node): + self.fill("global ") + self.interleave(lambda: self.write(", "), self.write, node.names) + + def visit_Nonlocal(self, node): + self.fill("nonlocal ") + self.interleave(lambda: self.write(", "), self.write, node.names) + + def visit_Await(self, node): + with self.require_parens(_Precedence.AWAIT, node): + self.write("await") + if node.value: + self.write(" ") + self.set_precedence(_Precedence.ATOM, node.value) + self.traverse(node.value) + + def visit_Yield(self, node): + with self.require_parens(_Precedence.YIELD, node): + self.write("yield") + if node.value: + self.write(" ") + self.set_precedence(_Precedence.ATOM, node.value) + self.traverse(node.value) + + def visit_YieldFrom(self, node): + with self.require_parens(_Precedence.YIELD, node): + self.write("yield from ") + if not node.value: + raise ValueError("Node can't be used without a value attribute.") + self.set_precedence(_Precedence.ATOM, node.value) + self.traverse(node.value) + + def visit_Raise(self, node): + self.fill("raise") + if not node.exc: + if node.cause: + raise ValueError(f"Node can't use cause without an exception.") + return + self.write(" ") + self.traverse(node.exc) + if node.cause: + self.write(" from ") + self.traverse(node.cause) + + def visit_Try(self, node): + self.fill("try") + with self.block(): + self.traverse(node.body) + for ex in node.handlers: + self.traverse(ex) + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + if node.finalbody: + self.fill("finally") + with self.block(): + self.traverse(node.finalbody) + + def visit_ExceptHandler(self, node): + self.fill("except") + if node.type: + self.write(" ") + self.traverse(node.type) + if node.name: + self.write(" as ") + self.write(node.name) + with self.block(): + self.traverse(node.body) + + def visit_ClassDef(self, node): + self.maybe_newline() + for deco in node.decorator_list: + self.fill("@") + self.traverse(deco) + self.fill("class " + node.name) + with self.delimit_if("(", ")", condition = node.bases or node.keywords): + comma = False + for e in node.bases: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + for e in node.keywords: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + + with self.block(): + self._write_docstring_and_traverse_body(node) + + def visit_FunctionDef(self, node): + self._function_helper(node, "def") + + def visit_AsyncFunctionDef(self, node): + self._function_helper(node, "async def") + + def _function_helper(self, node, fill_suffix): + self.maybe_newline() + for deco in node.decorator_list: + self.fill("@") + self.traverse(deco) + def_str = fill_suffix + " " + node.name + self.fill(def_str) + with self.delimit("(", ")"): + self.traverse(node.args) + if node.returns: + self.write(" -> ") + self.traverse(node.returns) + with self.block(extra=self.get_type_comment(node)): + self._write_docstring_and_traverse_body(node) + + def visit_For(self, node): + self._for_helper("for ", node) + + def visit_AsyncFor(self, node): + self._for_helper("async for ", node) + + def _for_helper(self, fill, node): + self.fill(fill) + self.traverse(node.target) + self.write(" in ") + self.traverse(node.iter) + with self.block(extra=self.get_type_comment(node)): + self.traverse(node.body) + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + + def visit_If(self, node): + self.fill("if ") + self.traverse(node.test) + with self.block(): + self.traverse(node.body) + # collapse nested ifs into equivalent elifs. + while node.orelse and len(node.orelse) == 1 and isinstance(node.orelse[0], If): + node = node.orelse[0] + self.fill("elif ") + self.traverse(node.test) + with self.block(): + self.traverse(node.body) + # final else + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + + def visit_While(self, node): + self.fill("while ") + self.traverse(node.test) + with self.block(): + self.traverse(node.body) + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + + def visit_With(self, node): + self.fill("with ") + self.interleave(lambda: self.write(", "), self.traverse, node.items) + with self.block(extra=self.get_type_comment(node)): + self.traverse(node.body) + + def visit_AsyncWith(self, node): + self.fill("async with ") + self.interleave(lambda: self.write(", "), self.traverse, node.items) + with self.block(extra=self.get_type_comment(node)): + self.traverse(node.body) + + def visit_JoinedStr(self, node): + self.write("f") + self._fstring_JoinedStr(node, self.buffer_writer) + self.write(repr(self.buffer)) + + def visit_FormattedValue(self, node): + self.write("f") + self._fstring_FormattedValue(node, self.buffer_writer) + self.write(repr(self.buffer)) + + def _fstring_JoinedStr(self, node, write): + for value in node.values: + meth = getattr(self, "_fstring_" + type(value).__name__) + meth(value, write) + + def _fstring_Constant(self, node, write): + if not isinstance(node.value, str): + raise ValueError("Constants inside JoinedStr should be a string.") + value = node.value.replace("{", "{{").replace("}", "}}") + write(value) + + def _fstring_FormattedValue(self, node, write): + write("{") + unparser = type(self)() + unparser.set_precedence(_Precedence.TEST.next(), node.value) + expr = unparser.visit(node.value) + if expr.startswith("{"): + write(" ") # Separate pair of opening brackets as "{ {" + write(expr) + if node.conversion != -1: + conversion = chr(node.conversion) + if conversion not in "sra": + raise ValueError("Unknown f-string conversion.") + write(f"!{conversion}") + if node.format_spec: + write(":") + meth = getattr(self, "_fstring_" + type(node.format_spec).__name__) + meth(node.format_spec, write) + write("}") + + def visit_Name(self, node): + self.write(node.id) + + def _write_docstring(self, node): + def esc_char(c): + if c in ("\n", "\t"): + # In the AST form, we don't know the author's intentation + # about how this should be displayed. We'll only escape + # \n and \t, because they are more likely to be unescaped + # in the source + return c + return c.encode('unicode_escape').decode('ascii') + + self.fill() + if node.kind == "u": + self.write("u") + + value = node.value + if value: + # Preserve quotes in the docstring by escaping them + value = "".join(map(esc_char, value)) + if value[-1] == '"': + value = value.replace('"', '\\"', -1) + value = value.replace('"""', '""\\"') + + self.write(f'"""{value}"""') + + def _write_constant(self, value): + if isinstance(value, (float, complex)): + # Substitute overflowing decimal literal for AST infinities. + self.write(repr(value).replace("inf", _INFSTR)) + else: + self.write(repr(value)) + + def visit_Constant(self, node): + value = node.value + if isinstance(value, tuple): + with self.delimit("(", ")"): + self.items_view(self._write_constant, value) + elif value is ...: + self.write("...") + else: + if node.kind == "u": + self.write("u") + self._write_constant(node.value) + + def visit_List(self, node): + with self.delimit("[", "]"): + self.interleave(lambda: self.write(", "), self.traverse, node.elts) + + def visit_ListComp(self, node): + with self.delimit("[", "]"): + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) + + def visit_GeneratorExp(self, node): + with self.delimit("(", ")"): + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) + + def visit_SetComp(self, node): + with self.delimit("{", "}"): + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) + + def visit_DictComp(self, node): + with self.delimit("{", "}"): + self.traverse(node.key) + self.write(": ") + self.traverse(node.value) + for gen in node.generators: + self.traverse(gen) + + def visit_comprehension(self, node): + if node.is_async: + self.write(" async for ") + else: + self.write(" for ") + self.set_precedence(_Precedence.TUPLE, node.target) + self.traverse(node.target) + self.write(" in ") + self.set_precedence(_Precedence.TEST.next(), node.iter, *node.ifs) + self.traverse(node.iter) + for if_clause in node.ifs: + self.write(" if ") + self.traverse(if_clause) + + def visit_IfExp(self, node): + with self.require_parens(_Precedence.TEST, node): + self.set_precedence(_Precedence.TEST.next(), node.body, node.test) + self.traverse(node.body) + self.write(" if ") + self.traverse(node.test) + self.write(" else ") + self.set_precedence(_Precedence.TEST, node.orelse) + self.traverse(node.orelse) + + def visit_Set(self, node): + if not node.elts: + raise ValueError("Set node should have at least one item") + with self.delimit("{", "}"): + self.interleave(lambda: self.write(", "), self.traverse, node.elts) + + def visit_Dict(self, node): + def write_key_value_pair(k, v): + self.traverse(k) + self.write(": ") + self.traverse(v) + + def write_item(item): + k, v = item + if k is None: + # for dictionary unpacking operator in dicts {**{'y': 2}} + # see PEP 448 for details + self.write("**") + self.set_precedence(_Precedence.EXPR, v) + self.traverse(v) + else: + write_key_value_pair(k, v) + + with self.delimit("{", "}"): + self.interleave( + lambda: self.write(", "), write_item, zip(node.keys, node.values) + ) + + def visit_Tuple(self, node): + with self.delimit("(", ")"): + self.items_view(self.traverse, node.elts) + + unop = {"Invert": "~", "Not": "not", "UAdd": "+", "USub": "-"} + unop_precedence = { + "not": _Precedence.NOT, + "~": _Precedence.FACTOR, + "+": _Precedence.FACTOR, + "-": _Precedence.FACTOR, + } + + def visit_UnaryOp(self, node): + operator = self.unop[node.op.__class__.__name__] + operator_precedence = self.unop_precedence[operator] + with self.require_parens(operator_precedence, node): + self.write(operator) + # factor prefixes (+, -, ~) shouldn't be seperated + # from the value they belong, (e.g: +1 instead of + 1) + if operator_precedence is not _Precedence.FACTOR: + self.write(" ") + self.set_precedence(operator_precedence, node.operand) + self.traverse(node.operand) + + binop = { + "Add": "+", + "Sub": "-", + "Mult": "*", + "MatMult": "@", + "Div": "/", + "Mod": "%", + "LShift": "<<", + "RShift": ">>", + "BitOr": "|", + "BitXor": "^", + "BitAnd": "&", + "FloorDiv": "//", + "Pow": "**", + } + + binop_precedence = { + "+": _Precedence.ARITH, + "-": _Precedence.ARITH, + "*": _Precedence.TERM, + "@": _Precedence.TERM, + "/": _Precedence.TERM, + "%": _Precedence.TERM, + "<<": _Precedence.SHIFT, + ">>": _Precedence.SHIFT, + "|": _Precedence.BOR, + "^": _Precedence.BXOR, + "&": _Precedence.BAND, + "//": _Precedence.TERM, + "**": _Precedence.POWER, + } + + binop_rassoc = frozenset(("**",)) + def visit_BinOp(self, node): + operator = self.binop[node.op.__class__.__name__] + operator_precedence = self.binop_precedence[operator] + with self.require_parens(operator_precedence, node): + if operator in self.binop_rassoc: + left_precedence = operator_precedence.next() + right_precedence = operator_precedence + else: + left_precedence = operator_precedence + right_precedence = operator_precedence.next() + + self.set_precedence(left_precedence, node.left) + self.traverse(node.left) + self.write(f" {operator} ") + self.set_precedence(right_precedence, node.right) + self.traverse(node.right) + + cmpops = { + "Eq": "==", + "NotEq": "!=", + "Lt": "<", + "LtE": "<=", + "Gt": ">", + "GtE": ">=", + "Is": "is", + "IsNot": "is not", + "In": "in", + "NotIn": "not in", + } + + def visit_Compare(self, node): + with self.require_parens(_Precedence.CMP, node): + self.set_precedence(_Precedence.CMP.next(), node.left, *node.comparators) + self.traverse(node.left) + for o, e in zip(node.ops, node.comparators): + self.write(" " + self.cmpops[o.__class__.__name__] + " ") + self.traverse(e) + + boolops = {"And": "and", "Or": "or"} + boolop_precedence = {"and": _Precedence.AND, "or": _Precedence.OR} + + def visit_BoolOp(self, node): + operator = self.boolops[node.op.__class__.__name__] + operator_precedence = self.boolop_precedence[operator] + + def increasing_level_traverse(node): + nonlocal operator_precedence + operator_precedence = operator_precedence.next() + self.set_precedence(operator_precedence, node) + self.traverse(node) + + with self.require_parens(operator_precedence, node): + s = f" {operator} " + self.interleave(lambda: self.write(s), increasing_level_traverse, node.values) + + def visit_Attribute(self, node): + self.set_precedence(_Precedence.ATOM, node.value) + self.traverse(node.value) + # Special case: 3.__abs__() is a syntax error, so if node.value + # is an integer literal then we need to either parenthesize + # it or add an extra space to get 3 .__abs__(). + if isinstance(node.value, Constant) and isinstance(node.value.value, int): + self.write(" ") + self.write(".") + self.write(node.attr) + + def visit_Call(self, node): + self.set_precedence(_Precedence.ATOM, node.func) + self.traverse(node.func) + with self.delimit("(", ")"): + comma = False + for e in node.args: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + for e in node.keywords: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + + def visit_Subscript(self, node): + def is_simple_tuple(slice_value): + # when unparsing a non-empty tuple, the parantheses can be safely + # omitted if there aren't any elements that explicitly requires + # parantheses (such as starred expressions). + return ( + isinstance(slice_value, Tuple) + and slice_value.elts + and not any(isinstance(elt, Starred) for elt in slice_value.elts) + ) + + self.set_precedence(_Precedence.ATOM, node.value) + self.traverse(node.value) + with self.delimit("[", "]"): + if is_simple_tuple(node.slice): + self.items_view(self.traverse, node.slice.elts) + else: + self.traverse(node.slice) + + def visit_Starred(self, node): + self.write("*") + self.set_precedence(_Precedence.EXPR, node.value) + self.traverse(node.value) + + def visit_Ellipsis(self, node): + self.write("...") + + def visit_Slice(self, node): + if node.lower: + self.traverse(node.lower) + self.write(":") + if node.upper: + self.traverse(node.upper) + if node.step: + self.write(":") + self.traverse(node.step) + + def visit_arg(self, node): + self.write(node.arg) + if node.annotation: + self.write(": ") + self.traverse(node.annotation) + + def visit_arguments(self, node): + first = True + # normal arguments + all_args = node.posonlyargs + node.args + defaults = [None] * (len(all_args) - len(node.defaults)) + node.defaults + for index, elements in enumerate(zip(all_args, defaults), 1): + a, d = elements + if first: + first = False + else: + self.write(", ") + self.traverse(a) + if d: + self.write("=") + self.traverse(d) + if index == len(node.posonlyargs): + self.write(", /") + + # varargs, or bare '*' if no varargs but keyword-only arguments present + if node.vararg or node.kwonlyargs: + if first: + first = False + else: + self.write(", ") + self.write("*") + if node.vararg: + self.write(node.vararg.arg) + if node.vararg.annotation: + self.write(": ") + self.traverse(node.vararg.annotation) + + # keyword-only arguments + if node.kwonlyargs: + for a, d in zip(node.kwonlyargs, node.kw_defaults): + self.write(", ") + self.traverse(a) + if d: + self.write("=") + self.traverse(d) + + # kwargs + if node.kwarg: + if first: + first = False + else: + self.write(", ") + self.write("**" + node.kwarg.arg) + if node.kwarg.annotation: + self.write(": ") + self.traverse(node.kwarg.annotation) + + def visit_keyword(self, node): + if node.arg is None: + self.write("**") + else: + self.write(node.arg) + self.write("=") + self.traverse(node.value) + + def visit_Lambda(self, node): + with self.require_parens(_Precedence.TEST, node): + self.write("lambda ") + self.traverse(node.args) + self.write(": ") + self.set_precedence(_Precedence.TEST, node.body) + self.traverse(node.body) + + def visit_alias(self, node): + self.write(node.name) + if node.asname: + self.write(" as " + node.asname) + + def visit_withitem(self, node): + self.traverse(node.context_expr) + if node.optional_vars: + self.write(" as ") + self.traverse(node.optional_vars) + +def unparse(ast_obj): + unparser = _Unparser() + return unparser.visit(ast_obj) + + +def main(): + import argparse + + parser = argparse.ArgumentParser(prog='python -m ast') + parser.add_argument('infile', type=argparse.FileType(mode='rb'), nargs='?', + default='-', + help='the file to parse; defaults to stdin') + parser.add_argument('-m', '--mode', default='exec', + choices=('exec', 'single', 'eval', 'func_type'), + help='specify what kind of code must be parsed') + parser.add_argument('--no-type-comments', default=True, action='store_false', + help="don't add information about type comments") + parser.add_argument('-a', '--include-attributes', action='store_true', + help='include attributes such as line numbers and ' + 'column offsets') + parser.add_argument('-i', '--indent', type=int, default=3, + help='indentation of nodes (number of spaces)') + args = parser.parse_args() + + with args.infile as infile: + source = infile.read() + tree = parse(source, args.infile.name, args.mode, type_comments=args.no_type_comments) + print(dump(tree, include_attributes=args.include_attributes, indent=args.indent)) + +if __name__ == '__main__': + main() diff --git a/Lib/asynchat.py b/Lib/asynchat.py index fc1146ad..f4ba361b 100644 --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -117,7 +117,7 @@ class async_chat(asyncore.dispatcher): data = self.recv(self.ac_in_buffer_size) except BlockingIOError: return - except OSError as why: + except OSError: self.handle_error() return diff --git a/Lib/asyncio/__init__.py b/Lib/asyncio/__init__.py index 28c2e2c4..eb84bfb1 100644 --- a/Lib/asyncio/__init__.py +++ b/Lib/asyncio/__init__.py @@ -17,6 +17,7 @@ from .queues import * from .streams import * from .subprocess import * from .tasks import * +from .threads import * from .transports import * # Exposed for _asynciomodule.c to implement now deprecated @@ -35,6 +36,7 @@ __all__ = (base_events.__all__ + streams.__all__ + subprocess.__all__ + tasks.__all__ + + threads.__all__ + transports.__all__) if sys.platform == 'win32': # pragma: no cover diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 799013d5..b2d446a5 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -410,6 +410,8 @@ class BaseEventLoop(events.AbstractEventLoop): self._asyncgens = weakref.WeakSet() # Set to True when `loop.shutdown_asyncgens` is called. self._asyncgens_shutdown_called = False + # Set to True when `loop.shutdown_default_executor` is called. + self._executor_shutdown_called = False def __repr__(self): return ( @@ -507,6 +509,10 @@ class BaseEventLoop(events.AbstractEventLoop): if self._closed: raise RuntimeError('Event loop is closed') + def _check_default_executor(self): + if self._executor_shutdown_called: + raise RuntimeError('Executor shutdown has been called') + def _asyncgen_finalizer_hook(self, agen): self._asyncgens.discard(agen) if not self.is_closed(): @@ -547,6 +553,26 @@ class BaseEventLoop(events.AbstractEventLoop): 'asyncgen': agen }) + async def shutdown_default_executor(self): + """Schedule the shutdown of the default executor.""" + self._executor_shutdown_called = True + if self._default_executor is None: + return + future = self.create_future() + thread = threading.Thread(target=self._do_shutdown, args=(future,)) + thread.start() + try: + await future + finally: + thread.join() + + def _do_shutdown(self, future): + try: + self._default_executor.shutdown(wait=True) + self.call_soon_threadsafe(future.set_result, None) + except Exception as ex: + self.call_soon_threadsafe(future.set_exception, ex) + def _check_running(self): if self.is_running(): raise RuntimeError('This event loop is already running') @@ -640,6 +666,7 @@ class BaseEventLoop(events.AbstractEventLoop): self._closed = True self._ready.clear() self._scheduled.clear() + self._executor_shutdown_called = True executor = self._default_executor if executor is not None: self._default_executor = None @@ -776,8 +803,12 @@ class BaseEventLoop(events.AbstractEventLoop): self._check_callback(func, 'run_in_executor') if executor is None: executor = self._default_executor + # Only check when the default executor is being used + self._check_default_executor() if executor is None: - executor = concurrent.futures.ThreadPoolExecutor() + executor = concurrent.futures.ThreadPoolExecutor( + thread_name_prefix='asyncio' + ) self._default_executor = executor return futures.wrap_future( executor.submit(func, *args), loop=self) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 353a9f5a..0dce87b8 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -19,7 +19,6 @@ import sys import threading from . import format_helpers -from . import exceptions class Handle: @@ -119,20 +118,24 @@ class TimerHandle(Handle): return hash(self._when) def __lt__(self, other): - return self._when < other._when + if isinstance(other, TimerHandle): + return self._when < other._when + return NotImplemented def __le__(self, other): - if self._when < other._when: - return True - return self.__eq__(other) + if isinstance(other, TimerHandle): + return self._when < other._when or self.__eq__(other) + return NotImplemented def __gt__(self, other): - return self._when > other._when + if isinstance(other, TimerHandle): + return self._when > other._when + return NotImplemented def __ge__(self, other): - if self._when > other._when: - return True - return self.__eq__(other) + if isinstance(other, TimerHandle): + return self._when > other._when or self.__eq__(other) + return NotImplemented def __eq__(self, other): if isinstance(other, TimerHandle): @@ -142,10 +145,6 @@ class TimerHandle(Handle): self._cancelled == other._cancelled) return NotImplemented - def __ne__(self, other): - equal = self.__eq__(other) - return NotImplemented if equal is NotImplemented else not equal - def cancel(self): if not self._cancelled: self._loop._timer_handle_cancelled(self) @@ -249,6 +248,10 @@ class AbstractEventLoop: """Shutdown all active asynchronous generators.""" raise NotImplementedError + async def shutdown_default_executor(self): + """Schedule the shutdown of the default executor.""" + raise NotImplementedError + # Methods scheduling callbacks. All these return Handles. def _timer_handle_cancelled(self, handle): @@ -393,7 +396,7 @@ class AbstractEventLoop: The return value is a Server object, which can be used to stop the service. - path is a str, representing a file systsem path to bind the + path is a str, representing a file system path to bind the server socket to. sock can optionally be specified in order to use a preexisting @@ -632,7 +635,7 @@ class BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy): """ if (self._local._loop is None and not self._local._set_called and - isinstance(threading.current_thread(), threading._MainThread)): + threading.current_thread() is threading.main_thread()): self.set_event_loop(self.new_event_loop()) if self._local._loop is None: diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index 9afda220..bed4da52 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -51,6 +51,9 @@ class Future: _exception = None _loop = None _source_traceback = None + _cancel_message = None + # A saved CancelledError for later chaining as an exception context. + _cancelled_exc = None # This field is used for a dual purpose: # - Its presence is a marker to declare that a class implements @@ -103,6 +106,9 @@ class Future: context['source_traceback'] = self._source_traceback self._loop.call_exception_handler(context) + def __class_getitem__(cls, type): + return cls + @property def _log_traceback(self): return self.__log_traceback @@ -120,7 +126,22 @@ class Future: raise RuntimeError("Future object is not initialized.") return loop - def cancel(self): + def _make_cancelled_error(self): + """Create the CancelledError to raise if the Future is cancelled. + + This should only be called once when handling a cancellation since + it erases the saved context exception value. + """ + if self._cancel_message is None: + exc = exceptions.CancelledError() + else: + exc = exceptions.CancelledError(self._cancel_message) + exc.__context__ = self._cancelled_exc + # Remove the reference since we don't need this anymore. + self._cancelled_exc = None + return exc + + def cancel(self, msg=None): """Cancel the future and schedule callbacks. If the future is already done or cancelled, return False. Otherwise, @@ -131,6 +152,7 @@ class Future: if self._state != _PENDING: return False self._state = _CANCELLED + self._cancel_message = msg self.__schedule_callbacks() return True @@ -170,7 +192,8 @@ class Future: the future is done and has an exception set, this exception is raised. """ if self._state == _CANCELLED: - raise exceptions.CancelledError + exc = self._make_cancelled_error() + raise exc if self._state != _FINISHED: raise exceptions.InvalidStateError('Result is not ready.') self.__log_traceback = False @@ -187,7 +210,8 @@ class Future: InvalidStateError. """ if self._state == _CANCELLED: - raise exceptions.CancelledError + exc = self._make_cancelled_error() + raise exc if self._state != _FINISHED: raise exceptions.InvalidStateError('Exception is not set.') self.__log_traceback = False diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index d94daeb5..f1ce7324 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -3,96 +3,13 @@ __all__ = ('Lock', 'Event', 'Condition', 'Semaphore', 'BoundedSemaphore') import collections -import types import warnings from . import events -from . import futures from . import exceptions -from .import coroutines - - -class _ContextManager: - """Context manager. - - This enables the following idiom for acquiring and releasing a - lock around a block: - - with (yield from lock): - - - while failing loudly when accidentally using: - - with lock: - - - Deprecated, use 'async with' statement: - async with lock: - - """ - - def __init__(self, lock): - self._lock = lock - - def __enter__(self): - # We have no use for the "as ..." clause in the with - # statement for locks. - return None - - def __exit__(self, *args): - try: - self._lock.release() - finally: - self._lock = None # Crudely prevent reuse. class _ContextManagerMixin: - def __enter__(self): - raise RuntimeError( - '"yield from" should be used as context manager expression') - - def __exit__(self, *args): - # This must exist because __enter__ exists, even though that - # always raises; that's how the with-statement works. - pass - - @types.coroutine - def __iter__(self): - # This is not a coroutine. It is meant to enable the idiom: - # - # with (yield from lock): - # - # - # as an alternative to: - # - # yield from lock.acquire() - # try: - # - # finally: - # lock.release() - # Deprecated, use 'async with' statement: - # async with lock: - # - warnings.warn("'with (yield from lock)' is deprecated " - "use 'async with lock' instead", - DeprecationWarning, stacklevel=2) - yield from self.acquire() - return _ContextManager(self) - - # The flag is needed for legacy asyncio.iscoroutine() - __iter__._is_coroutine = coroutines._is_coroutine - - async def __acquire_ctx(self): - await self.acquire() - return _ContextManager(self) - - def __await__(self): - warnings.warn("'with await lock' is deprecated " - "use 'async with lock' instead", - DeprecationWarning, stacklevel=2) - # To make "with await lock" work. - return self.__acquire_ctx().__await__() - async def __aenter__(self): await self.acquire() # We have no use for the "as ..." clause in the with diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 3e0a14f6..b4cd414b 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -711,7 +711,7 @@ class BaseProactorEventLoop(base_events.BaseEventLoop): raise exceptions.SendfileNotAvailableError("not a regular file") try: fsize = os.fstat(fileno).st_size - except OSError as err: + except OSError: raise exceptions.SendfileNotAvailableError("not a regular file") blocksize = count if count else fsize if not blocksize: diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py index 390ae9a6..cd3f7c6a 100644 --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -76,6 +76,9 @@ class Queue: def __str__(self): return f'<{type(self).__name__} {self._format()}>' + def __class_getitem__(cls, type): + return cls + def _format(self): result = f'maxsize={self._maxsize!r}' if getattr(self, '_queue', None): diff --git a/Lib/asyncio/runners.py b/Lib/asyncio/runners.py index d2fa8b7f..268635d6 100644 --- a/Lib/asyncio/runners.py +++ b/Lib/asyncio/runners.py @@ -46,6 +46,7 @@ def run(main, *, debug=None): try: _cancel_all_tasks(loop) loop.run_until_complete(loop.shutdown_asyncgens()) + loop.run_until_complete(loop.shutdown_default_executor()) finally: events.set_event_loop(None) loop.close() diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 6ba30716..59cb6b1b 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -268,6 +268,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): (handle, writer)) if reader is not None: reader.cancel() + return handle def _remove_reader(self, fd): if self.is_closed(): @@ -304,6 +305,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): (reader, handle)) if writer is not None: writer.cancel() + return handle def _remove_writer(self, fd): """Remove a writer callback.""" @@ -331,7 +333,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): def add_reader(self, fd, callback, *args): """Add a reader callback.""" self._ensure_fd_no_transport(fd) - return self._add_reader(fd, callback, *args) + self._add_reader(fd, callback, *args) def remove_reader(self, fd): """Remove a reader callback.""" @@ -341,7 +343,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): def add_writer(self, fd, callback, *args): """Add a writer callback..""" self._ensure_fd_no_transport(fd) - return self._add_writer(fd, callback, *args) + self._add_writer(fd, callback, *args) def remove_writer(self, fd): """Remove a writer callback.""" @@ -364,13 +366,15 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): pass fut = self.create_future() fd = sock.fileno() - self.add_reader(fd, self._sock_recv, fut, sock, n) + self._ensure_fd_no_transport(fd) + handle = self._add_reader(fd, self._sock_recv, fut, sock, n) fut.add_done_callback( - functools.partial(self._sock_read_done, fd)) + functools.partial(self._sock_read_done, fd, handle=handle)) return await fut - def _sock_read_done(self, fd, fut): - self.remove_reader(fd) + def _sock_read_done(self, fd, fut, handle=None): + if handle is None or not handle.cancelled(): + self.remove_reader(fd) def _sock_recv(self, fut, sock, n): # _sock_recv() can add itself as an I/O callback if the operation can't @@ -403,9 +407,10 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): pass fut = self.create_future() fd = sock.fileno() - self.add_reader(fd, self._sock_recv_into, fut, sock, buf) + self._ensure_fd_no_transport(fd) + handle = self._add_reader(fd, self._sock_recv_into, fut, sock, buf) fut.add_done_callback( - functools.partial(self._sock_read_done, fd)) + functools.partial(self._sock_read_done, fd, handle=handle)) return await fut def _sock_recv_into(self, fut, sock, buf): @@ -448,11 +453,12 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): fut = self.create_future() fd = sock.fileno() - fut.add_done_callback( - functools.partial(self._sock_write_done, fd)) + self._ensure_fd_no_transport(fd) # use a trick with a list in closure to store a mutable state - self.add_writer(fd, self._sock_sendall, fut, sock, - memoryview(data), [n]) + handle = self._add_writer(fd, self._sock_sendall, fut, sock, + memoryview(data), [n]) + fut.add_done_callback( + functools.partial(self._sock_write_done, fd, handle=handle)) return await fut def _sock_sendall(self, fut, sock, view, pos): @@ -504,9 +510,11 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): # connection runs in background. We have to wait until the socket # becomes writable to be notified when the connection succeed or # fails. + self._ensure_fd_no_transport(fd) + handle = self._add_writer( + fd, self._sock_connect_cb, fut, sock, address) fut.add_done_callback( - functools.partial(self._sock_write_done, fd)) - self.add_writer(fd, self._sock_connect_cb, fut, sock, address) + functools.partial(self._sock_write_done, fd, handle=handle)) except (SystemExit, KeyboardInterrupt): raise except BaseException as exc: @@ -514,8 +522,9 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): else: fut.set_result(None) - def _sock_write_done(self, fd, fut): - self.remove_writer(fd) + def _sock_write_done(self, fd, fut, handle=None): + if handle is None or not handle.cancelled(): + self.remove_writer(fd) def _sock_connect_cb(self, fut, sock, address): if fut.done(): @@ -548,20 +557,19 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") fut = self.create_future() - self._sock_accept(fut, False, sock) + self._sock_accept(fut, sock) return await fut - def _sock_accept(self, fut, registered, sock): + def _sock_accept(self, fut, sock): fd = sock.fileno() - if registered: - self.remove_reader(fd) - if fut.done(): - return try: conn, address = sock.accept() conn.setblocking(False) except (BlockingIOError, InterruptedError): - self.add_reader(fd, self._sock_accept, fut, True, sock) + self._ensure_fd_no_transport(fd) + handle = self._add_reader(fd, self._sock_accept, fut, sock) + fut.add_done_callback( + functools.partial(self._sock_read_done, fd, handle=handle)) except (SystemExit, KeyboardInterrupt): raise except BaseException as exc: diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 3eca6b4a..cad25b26 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -5,7 +5,6 @@ try: except ImportError: # pragma: no cover ssl = None -from . import base_events from . import constants from . import protocols from . import transports diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 9ca9fa0a..8b05434f 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -113,34 +113,6 @@ class Task(futures._PyFuture): # Inherit Python Task implementation # status is still pending _log_destroy_pending = True - @classmethod - def current_task(cls, loop=None): - """Return the currently running task in an event loop or None. - - By default the current task for the current event loop is returned. - - None is returned when called not in the context of a Task. - """ - warnings.warn("Task.current_task() is deprecated since Python 3.7, " - "use asyncio.current_task() instead", - DeprecationWarning, - stacklevel=2) - if loop is None: - loop = events.get_event_loop() - return current_task(loop) - - @classmethod - def all_tasks(cls, loop=None): - """Return a set of all tasks for an event loop. - - By default all tasks for the current event loop are returned. - """ - warnings.warn("Task.all_tasks() is deprecated since Python 3.7, " - "use asyncio.all_tasks() instead", - DeprecationWarning, - stacklevel=2) - return _all_tasks_compat(loop) - def __init__(self, coro, *, loop=None, name=None): super().__init__(loop=loop) if self._source_traceback: @@ -175,6 +147,9 @@ class Task(futures._PyFuture): # Inherit Python Task implementation self._loop.call_exception_handler(context) super().__del__() + def __class_getitem__(cls, type): + return cls + def _repr_info(self): return base_tasks._task_repr_info(self) @@ -227,7 +202,7 @@ class Task(futures._PyFuture): # Inherit Python Task implementation """ return base_tasks._task_print_stack(self, limit, file) - def cancel(self): + def cancel(self, msg=None): """Request that this task cancel itself. This arranges for a CancelledError to be thrown into the @@ -251,13 +226,14 @@ class Task(futures._PyFuture): # Inherit Python Task implementation if self.done(): return False if self._fut_waiter is not None: - if self._fut_waiter.cancel(): + if self._fut_waiter.cancel(msg=msg): # Leave self._fut_waiter; it may be a Task that # catches and ignores the cancellation so we may have # to cancel it again later. return True # It must be the case that self.__step is already scheduled. self._must_cancel = True + self._cancel_message = msg return True def __step(self, exc=None): @@ -266,7 +242,7 @@ class Task(futures._PyFuture): # Inherit Python Task implementation f'_step(): already done: {self!r}, {exc!r}') if self._must_cancel: if not isinstance(exc, exceptions.CancelledError): - exc = exceptions.CancelledError() + exc = self._make_cancelled_error() self._must_cancel = False coro = self._coro self._fut_waiter = None @@ -284,10 +260,12 @@ class Task(futures._PyFuture): # Inherit Python Task implementation if self._must_cancel: # Task is cancelled right before coro stops. self._must_cancel = False - super().cancel() + super().cancel(msg=self._cancel_message) else: super().set_result(exc.value) - except exceptions.CancelledError: + except exceptions.CancelledError as exc: + # Save the original exception so we can chain it later. + self._cancelled_exc = exc super().cancel() # I.e., Future.cancel(self). except (KeyboardInterrupt, SystemExit) as exc: super().set_exception(exc) @@ -316,7 +294,8 @@ class Task(futures._PyFuture): # Inherit Python Task implementation self.__wakeup, context=self._context) self._fut_waiter = result if self._must_cancel: - if self._fut_waiter.cancel(): + if self._fut_waiter.cancel( + msg=self._cancel_message): self._must_cancel = False else: new_exc = RuntimeError( @@ -421,6 +400,12 @@ async def wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED): "and scheduled for removal in Python 3.10.", DeprecationWarning, stacklevel=2) + if any(coroutines.iscoroutine(f) for f in set(fs)): + warnings.warn("The explicit passing of coroutine objects to " + "asyncio.wait() is deprecated since Python 3.8, and " + "scheduled for removal in Python 3.11.", + DeprecationWarning, stacklevel=2) + fs = {ensure_future(f, loop=loop) for f in set(fs)} return await _wait(fs, timeout, return_when, loop) @@ -495,7 +480,15 @@ async def wait_for(fut, timeout, *, loop=None): # after wait_for() returns. # See https://bugs.python.org/issue32751 await _cancel_and_wait(fut, loop=loop) - raise exceptions.TimeoutError() + # In case task cancellation failed with some + # exception, we should re-raise it + # See https://bugs.python.org/issue40607 + try: + fut.result() + except exceptions.CancelledError as exc: + raise exceptions.TimeoutError() from exc + else: + raise exceptions.TimeoutError() finally: timeout_handle.cancel() @@ -707,12 +700,12 @@ class _GatheringFuture(futures.Future): self._children = children self._cancel_requested = False - def cancel(self): + def cancel(self, msg=None): if self.done(): return False ret = False for child in self._children: - if child.cancel(): + if child.cancel(msg=msg): ret = True if ret: # If any child tasks were actually cancelled, we should @@ -778,7 +771,7 @@ def gather(*coros_or_futures, loop=None, return_exceptions=False): # Check if 'fut' is cancelled first, as # 'fut.exception()' will *raise* a CancelledError # instead of returning it. - exc = exceptions.CancelledError() + exc = fut._make_cancelled_error() outer.set_exception(exc) return else: @@ -794,10 +787,15 @@ def gather(*coros_or_futures, loop=None, return_exceptions=False): for fut in children: if fut.cancelled(): - # Check if 'fut' is cancelled first, as - # 'fut.exception()' will *raise* a CancelledError - # instead of returning it. - res = exceptions.CancelledError() + # Check if 'fut' is cancelled first, as 'fut.exception()' + # will *raise* a CancelledError instead of returning it. + # Also, since we're adding the exception return value + # to 'results' instead of raising it, don't bother + # setting __context__. This also lets us preserve + # calling '_make_cancelled_error()' at most once. + res = exceptions.CancelledError( + '' if fut._cancel_message is None else + fut._cancel_message) else: res = fut.exception() if res is None: @@ -808,7 +806,8 @@ def gather(*coros_or_futures, loop=None, return_exceptions=False): # If gather is being cancelled we must propagate the # cancellation regardless of *return_exceptions* argument. # See issue 32684. - outer.set_exception(exceptions.CancelledError()) + exc = fut._make_cancelled_error() + outer.set_exception(exc) else: outer.set_result(results) diff --git a/Lib/asyncio/threads.py b/Lib/asyncio/threads.py new file mode 100644 index 00000000..34b7513a --- /dev/null +++ b/Lib/asyncio/threads.py @@ -0,0 +1,25 @@ +"""High-level support for working with threads in asyncio""" + +import functools +import contextvars + +from . import events + + +__all__ = "to_thread", + + +async def to_thread(func, /, *args, **kwargs): + """Asynchronously run function *func* in a separate thread. + + Any *args and **kwargs supplied for this function are directly passed + to *func*. Also, the current :class:`contextvars.Context` is propogated, + allowing context variables from the main thread to be accessed in the + separate thread. + + Return a coroutine that can be awaited to get the eventual result of *func*. + """ + loop = events.get_running_loop() + ctx = contextvars.copy_context() + func_call = functools.partial(ctx.run, func, *args, **kwargs) + return await loop.run_in_executor(None, func_call) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 1ff8c427..f34a5b4b 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -29,7 +29,7 @@ from .log import logger __all__ = ( 'SelectorEventLoop', 'AbstractChildWatcher', 'SafeChildWatcher', - 'FastChildWatcher', + 'FastChildWatcher', 'PidfdChildWatcher', 'MultiLoopChildWatcher', 'ThreadedChildWatcher', 'DefaultEventLoopPolicy', ) @@ -330,7 +330,7 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): async def _sock_sendfile_native(self, sock, file, offset, count): try: os.sendfile - except AttributeError as exc: + except AttributeError: raise exceptions.SendfileNotAvailableError( "os.sendfile() is not available") try: @@ -339,7 +339,7 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): raise exceptions.SendfileNotAvailableError("not a regular file") try: fsize = os.fstat(fileno).st_size - except OSError as err: + except OSError: raise exceptions.SendfileNotAvailableError("not a regular file") blocksize = count if count else fsize if not blocksize: @@ -878,6 +878,84 @@ class AbstractChildWatcher: raise NotImplementedError() +class PidfdChildWatcher(AbstractChildWatcher): + """Child watcher implementation using Linux's pid file descriptors. + + This child watcher polls process file descriptors (pidfds) to await child + process termination. In some respects, PidfdChildWatcher is a "Goldilocks" + child watcher implementation. It doesn't require signals or threads, doesn't + interfere with any processes launched outside the event loop, and scales + linearly with the number of subprocesses launched by the event loop. The + main disadvantage is that pidfds are specific to Linux, and only work on + recent (5.3+) kernels. + """ + + def __init__(self): + self._loop = None + self._callbacks = {} + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, exc_traceback): + pass + + def is_active(self): + return self._loop is not None and self._loop.is_running() + + def close(self): + self.attach_loop(None) + + def attach_loop(self, loop): + if self._loop is not None and loop is None and self._callbacks: + warnings.warn( + 'A loop is being detached ' + 'from a child watcher with pending handlers', + RuntimeWarning) + for pidfd, _, _ in self._callbacks.values(): + self._loop._remove_reader(pidfd) + os.close(pidfd) + self._callbacks.clear() + self._loop = loop + + def add_child_handler(self, pid, callback, *args): + existing = self._callbacks.get(pid) + if existing is not None: + self._callbacks[pid] = existing[0], callback, args + else: + pidfd = os.pidfd_open(pid) + self._loop._add_reader(pidfd, self._do_wait, pid) + self._callbacks[pid] = pidfd, callback, args + + def _do_wait(self, pid): + pidfd, callback, args = self._callbacks.pop(pid) + self._loop._remove_reader(pidfd) + try: + _, status = os.waitpid(pid, 0) + except ChildProcessError: + # The child process is already reaped + # (may happen if waitpid() is called elsewhere). + returncode = 255 + logger.warning( + "child process pid %d exit status already read: " + " will report returncode 255", + pid) + else: + returncode = _compute_returncode(status) + + os.close(pidfd) + callback(pid, returncode, *args) + + def remove_child_handler(self, pid): + try: + pidfd, _, _ = self._callbacks.pop(pid) + except KeyError: + return False + self._loop._remove_reader(pidfd) + os.close(pidfd) + return True + + def _compute_returncode(status): if os.WIFSIGNALED(status): # The child process died because of a signal. @@ -1346,8 +1424,7 @@ class _UnixDefaultEventLoopPolicy(events.BaseDefaultEventLoopPolicy): with events._lock: if self._watcher is None: # pragma: no branch self._watcher = ThreadedChildWatcher() - if isinstance(threading.current_thread(), - threading._MainThread): + if threading.current_thread() is threading.main_thread(): self._watcher.attach_loop(self._local._loop) def set_event_loop(self, loop): @@ -1361,7 +1438,7 @@ class _UnixDefaultEventLoopPolicy(events.BaseDefaultEventLoopPolicy): super().set_event_loop(loop) if (self._watcher is not None and - isinstance(threading.current_thread(), threading._MainThread)): + threading.current_thread() is threading.main_thread()): self._watcher.attach_loop(loop) def get_child_watcher(self): diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index a5ad6fc4..5e7cd795 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -75,9 +75,9 @@ class _OverlappedFuture(futures.Future): self._loop.call_exception_handler(context) self._ov = None - def cancel(self): + def cancel(self, msg=None): self._cancel_overlapped() - return super().cancel() + return super().cancel(msg=msg) def set_exception(self, exception): super().set_exception(exception) @@ -149,9 +149,9 @@ class _BaseWaitHandleFuture(futures.Future): self._unregister_wait_cb(None) - def cancel(self): + def cancel(self, msg=None): self._unregister_wait() - return super().cancel() + return super().cancel(msg=msg) def set_exception(self, exception): self._unregister_wait() diff --git a/Lib/asyncore.py b/Lib/asyncore.py index 0e92be3a..ce16f11a 100644 --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -228,7 +228,7 @@ class dispatcher: if sock: # Set to nonblocking just to make sure for cases where we # get a socket from a blocking source. - sock.setblocking(0) + sock.setblocking(False) self.set_socket(sock, map) self.connected = True # The constructor no longer requires that the socket @@ -280,7 +280,7 @@ class dispatcher: def create_socket(self, family=socket.AF_INET, type=socket.SOCK_STREAM): self.family_and_type = family, type sock = socket.socket(family, type) - sock.setblocking(0) + sock.setblocking(False) self.set_socket(sock) def set_socket(self, sock, map=None): diff --git a/Lib/base64.py b/Lib/base64.py index 2e70223d..a28109f8 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -531,28 +531,12 @@ def encodebytes(s): pieces.append(binascii.b2a_base64(chunk)) return b"".join(pieces) -def encodestring(s): - """Legacy alias of encodebytes().""" - import warnings - warnings.warn("encodestring() is a deprecated alias since 3.1, " - "use encodebytes()", - DeprecationWarning, 2) - return encodebytes(s) - def decodebytes(s): """Decode a bytestring of base-64 data into a bytes object.""" _input_type_check(s) return binascii.a2b_base64(s) -def decodestring(s): - """Legacy alias of decodebytes().""" - import warnings - warnings.warn("decodestring() is a deprecated alias since Python 3.1, " - "use decodebytes()", - DeprecationWarning, 2) - return decodebytes(s) - # Usable as a script... def main(): diff --git a/Lib/bdb.py b/Lib/bdb.py index 18491da8..b18a0612 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -611,26 +611,11 @@ class Bdb: # This method is more useful to debug a single function call. - def runcall(*args, **kwds): + def runcall(self, func, /, *args, **kwds): """Debug a single function call. Return the result of the function call. """ - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runcall' of 'Bdb' object " - "needs an argument") - elif 'func' in kwds: - func = kwds.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runcall expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - self.reset() sys.settrace(self.trace_dispatch) res = None @@ -642,7 +627,6 @@ class Bdb: self.quitting = True sys.settrace(None) return res - runcall.__text_signature__ = '($self, func, /, *args, **kwds)' def set_trace(): diff --git a/Lib/binhex.py b/Lib/binhex.py index 56b5f852..9559f46d 100644 --- a/Lib/binhex.py +++ b/Lib/binhex.py @@ -21,10 +21,16 @@ hexbin(inputfilename, outputfilename) # input. The resulting code (xx 90 90) would appear to be interpreted as an # escaped *value* of 0x90. All coders I've seen appear to ignore this nicety... # +import binascii +import contextlib import io import os import struct -import binascii +import warnings + +warnings.warn('the binhex module is deprecated', DeprecationWarning, + stacklevel=2) + __all__ = ["binhex","hexbin","Error"] @@ -76,6 +82,16 @@ class openrsrc: def close(self): pass + +# DeprecationWarning is already emitted on "import binhex". There is no need +# to repeat the warning at each call to deprecated binascii functions. +@contextlib.contextmanager +def _ignore_deprecation_warning(): + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', '', DeprecationWarning) + yield + + class _Hqxcoderengine: """Write data to the coder in 3-byte chunks""" @@ -93,7 +109,8 @@ class _Hqxcoderengine: self.data = self.data[todo:] if not data: return - self.hqxdata = self.hqxdata + binascii.b2a_hqx(data) + with _ignore_deprecation_warning(): + self.hqxdata = self.hqxdata + binascii.b2a_hqx(data) self._flush(0) def _flush(self, force): @@ -109,7 +126,8 @@ class _Hqxcoderengine: def close(self): if self.data: - self.hqxdata = self.hqxdata + binascii.b2a_hqx(self.data) + with _ignore_deprecation_warning(): + self.hqxdata = self.hqxdata + binascii.b2a_hqx(self.data) self._flush(1) self.ofp.close() del self.ofp @@ -125,13 +143,15 @@ class _Rlecoderengine: self.data = self.data + data if len(self.data) < REASONABLY_LARGE: return - rledata = binascii.rlecode_hqx(self.data) + with _ignore_deprecation_warning(): + rledata = binascii.rlecode_hqx(self.data) self.ofp.write(rledata) self.data = b'' def close(self): if self.data: - rledata = binascii.rlecode_hqx(self.data) + with _ignore_deprecation_warning(): + rledata = binascii.rlecode_hqx(self.data) self.ofp.write(rledata) self.ofp.close() del self.ofp @@ -276,7 +296,8 @@ class _Hqxdecoderengine: # while True: try: - decdatacur, self.eof = binascii.a2b_hqx(data) + with _ignore_deprecation_warning(): + decdatacur, self.eof = binascii.a2b_hqx(data) break except binascii.Incomplete: pass @@ -312,8 +333,9 @@ class _Rledecoderengine: def _fill(self, wtd): self.pre_buffer = self.pre_buffer + self.ifp.read(wtd + 4) if self.ifp.eof: - self.post_buffer = self.post_buffer + \ - binascii.rledecode_hqx(self.pre_buffer) + with _ignore_deprecation_warning(): + self.post_buffer = self.post_buffer + \ + binascii.rledecode_hqx(self.pre_buffer) self.pre_buffer = b'' return @@ -340,8 +362,9 @@ class _Rledecoderengine: else: mark = mark - 1 - self.post_buffer = self.post_buffer + \ - binascii.rledecode_hqx(self.pre_buffer[:mark]) + with _ignore_deprecation_warning(): + self.post_buffer = self.post_buffer + \ + binascii.rledecode_hqx(self.pre_buffer[:mark]) self.pre_buffer = self.pre_buffer[mark:] def close(self): diff --git a/Lib/bisect.py b/Lib/bisect.py index 9786fc9d..8f3f6a3f 100644 --- a/Lib/bisect.py +++ b/Lib/bisect.py @@ -29,6 +29,7 @@ def bisect_right(a, x, lo=0, hi=None): hi = len(a) while lo < hi: mid = (lo+hi)//2 + # Use __lt__ to match the logic in list.sort() and in heapq if x < a[mid]: hi = mid else: lo = mid+1 return lo @@ -63,6 +64,7 @@ def bisect_left(a, x, lo=0, hi=None): hi = len(a) while lo < hi: mid = (lo+hi)//2 + # Use __lt__ to match the logic in list.sort() and in heapq if a[mid] < x: lo = mid+1 else: hi = mid return lo diff --git a/Lib/bz2.py b/Lib/bz2.py index 21e8ff49..ce07ebeb 100644 --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -12,7 +12,6 @@ __author__ = "Nadeem Vawda " from builtins import open as _builtin_open import io import os -import warnings import _compression from threading import RLock @@ -24,8 +23,6 @@ _MODE_READ = 1 # Value 2 no longer used _MODE_WRITE = 3 -_sentinel = object() - class BZ2File(_compression.BaseStream): @@ -38,7 +35,7 @@ class BZ2File(_compression.BaseStream): returned as bytes, and data to be written should be given as bytes. """ - def __init__(self, filename, mode="r", buffering=_sentinel, compresslevel=9): + def __init__(self, filename, mode="r", *, compresslevel=9): """Open a bzip2-compressed file. If filename is a str, bytes, or PathLike object, it gives the @@ -49,8 +46,6 @@ class BZ2File(_compression.BaseStream): 'x' for creating exclusively, or 'a' for appending. These can equivalently be given as 'rb', 'wb', 'xb', and 'ab'. - buffering is ignored since Python 3.0. Its use is deprecated. - If mode is 'w', 'x' or 'a', compresslevel can be a number between 1 and 9 specifying the level of compression: 1 produces the least compression, and 9 (default) produces the most compression. @@ -65,12 +60,6 @@ class BZ2File(_compression.BaseStream): self._closefp = False self._mode = _MODE_CLOSED - if buffering is not _sentinel: - warnings.warn("Use of 'buffering' argument is deprecated and ignored " - "since Python 3.0.", - DeprecationWarning, - stacklevel=2) - if not (1 <= compresslevel <= 9): raise ValueError("compresslevel must be between 1 and 9") diff --git a/Lib/cProfile.py b/Lib/cProfile.py index 369d02e2..4f202038 100755 --- a/Lib/cProfile.py +++ b/Lib/cProfile.py @@ -103,28 +103,12 @@ class Profile(_lsprof.Profiler): return self # This method is more useful to profile a single function call. - def runcall(*args, **kw): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runcall' of 'Profile' object " - "needs an argument") - elif 'func' in kw: - func = kw.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runcall expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def runcall(self, func, /, *args, **kw): self.enable() try: return func(*args, **kw) finally: self.disable() - runcall.__text_signature__ = '($self, func, /, *args, **kw)' def __enter__(self): self.enable() diff --git a/Lib/codeop.py b/Lib/codeop.py index 04ca6b93..4c10470a 100644 --- a/Lib/codeop.py +++ b/Lib/codeop.py @@ -81,7 +81,7 @@ def _maybe_compile(compiler, source, filename, symbol): try: code = compiler(source, filename, symbol) - except SyntaxError as err: + except SyntaxError: pass # Catch syntax warnings after the first compile @@ -140,7 +140,7 @@ class Compile: self.flags = PyCF_DONT_IMPLY_DEDENT def __call__(self, source, filename, symbol): - codeob = compile(source, filename, symbol, self.flags, 1) + codeob = compile(source, filename, symbol, self.flags, True) for feature in _features: if codeob.co_flags & feature.compiler_flag: self.flags |= feature.compiler_flag diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index a78a47c5..efd654e8 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -14,17 +14,30 @@ list, set, and tuple. ''' -__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', - 'UserString', 'Counter', 'OrderedDict', 'ChainMap'] +__all__ = [ + 'ChainMap', + 'Counter', + 'OrderedDict', + 'UserDict', + 'UserList', + 'UserString', + 'defaultdict', + 'deque', + 'namedtuple', +] import _collections_abc -from operator import itemgetter as _itemgetter, eq as _eq -from keyword import iskeyword as _iskeyword -import sys as _sys import heapq as _heapq -from _weakref import proxy as _proxy -from itertools import repeat as _repeat, chain as _chain, starmap as _starmap +import sys as _sys + +from itertools import chain as _chain +from itertools import repeat as _repeat +from itertools import starmap as _starmap +from keyword import iskeyword as _iskeyword +from operator import eq as _eq +from operator import itemgetter as _itemgetter from reprlib import recursive_repr as _recursive_repr +from _weakref import proxy as _proxy try: from _collections import deque @@ -48,12 +61,13 @@ def __getattr__(name): import warnings warnings.warn("Using or importing the ABCs from 'collections' instead " "of from 'collections.abc' is deprecated since Python 3.3, " - "and in 3.9 it will stop working", + "and in 3.10 it will stop working", DeprecationWarning, stacklevel=2) globals()[name] = obj return obj raise AttributeError(f'module {__name__!r} has no attribute {name!r}') + ################################################################################ ### OrderedDict ################################################################################ @@ -293,6 +307,24 @@ class OrderedDict(dict): return dict.__eq__(self, other) and all(map(_eq, self, other)) return dict.__eq__(self, other) + def __ior__(self, other): + self.update(other) + return self + + def __or__(self, other): + if not isinstance(other, dict): + return NotImplemented + new = self.__class__(self) + new.update(other) + return new + + def __ror__(self, other): + if not isinstance(other, dict): + return NotImplemented + new = self.__class__(other) + new.update(self) + return new + try: from _collections import OrderedDict @@ -381,18 +413,23 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non # Variables used in the methods and docstrings field_names = tuple(map(_sys.intern, field_names)) num_fields = len(field_names) - arg_list = repr(field_names).replace("'", "")[1:-1] + arg_list = ', '.join(field_names) + if num_fields == 1: + arg_list += ',' repr_fmt = '(' + ', '.join(f'{name}=%r' for name in field_names) + ')' tuple_new = tuple.__new__ _dict, _tuple, _len, _map, _zip = dict, tuple, len, map, zip # Create all the named tuple methods to be added to the class namespace - s = f'def __new__(_cls, {arg_list}): return _tuple_new(_cls, ({arg_list}))' - namespace = {'_tuple_new': tuple_new, '__name__': f'namedtuple_{typename}'} - # Note: exec() has the side-effect of interning the field names - exec(s, namespace) - __new__ = namespace['__new__'] + namespace = { + '_tuple_new': tuple_new, + '__builtins__': None, + '__name__': f'namedtuple_{typename}', + } + code = f'lambda _cls, {arg_list}: _tuple_new(_cls, ({arg_list}))' + __new__ = eval(code, namespace) + __new__.__name__ = '__new__' __new__.__doc__ = f'Create new instance of {typename}({arg_list})' if defaults is not None: __new__.__defaults__ = defaults @@ -429,8 +466,14 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non return _tuple(self) # Modify function metadata to help with introspection and debugging - for method in (__new__, _make.__func__, _replace, - __repr__, _asdict, __getnewargs__): + for method in ( + __new__, + _make.__func__, + _replace, + __repr__, + _asdict, + __getnewargs__, + ): method.__qualname__ = f'{typename}.{method.__name__}' # Build-up the class namespace dictionary @@ -440,8 +483,6 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non '__slots__': (), '_fields': field_names, '_field_defaults': field_defaults, - # alternate spelling for backward compatibility - '_fields_defaults': field_defaults, '__new__': __new__, '_make': _make, '_replace': _replace, @@ -548,7 +589,7 @@ class Counter(dict): >>> c = Counter(a=4, b=2) # a new counter from keyword args ''' - super(Counter, self).__init__() + super().__init__() self.update(iterable, **kwds) def __missing__(self, key): @@ -632,7 +673,8 @@ class Counter(dict): for elem, count in iterable.items(): self[elem] = count + self_get(elem, 0) else: - super(Counter, self).update(iterable) # fast path when counter is empty + # fast path when counter is empty + super().update(iterable) else: _count_elements(self, iterable) if kwds: @@ -679,13 +721,14 @@ class Counter(dict): def __repr__(self): if not self: - return '%s()' % self.__class__.__name__ + return f'{self.__class__.__name__}()' try: - items = ', '.join(map('%r: %r'.__mod__, self.most_common())) - return '%s({%s})' % (self.__class__.__name__, items) + # dict() preserves the ordering returned by most_common() + d = dict(self.most_common()) except TypeError: # handle case where values are not orderable - return '{0}({1!r})'.format(self.__class__.__name__, dict(self)) + d = dict(self) + return f'{self.__class__.__name__}({d!r})' # Multiset-style mathematical operations discussed in: # Knuth TAOCP Volume II section 4.6.3 exercise 19 @@ -950,7 +993,7 @@ class ChainMap(_collections_abc.MutableMapping): try: del self.maps[0][key] except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + raise KeyError(f'Key not found in the first mapping: {key!r}') def popitem(self): 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' @@ -964,12 +1007,31 @@ class ChainMap(_collections_abc.MutableMapping): try: return self.maps[0].pop(key, *args) except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + raise KeyError(f'Key not found in the first mapping: {key!r}') def clear(self): 'Clear maps[0], leaving maps[1:] intact.' self.maps[0].clear() + def __ior__(self, other): + self.maps[0].update(other) + return self + + def __or__(self, other): + if not isinstance(other, _collections_abc.Mapping): + return NotImplemented + m = self.copy() + m.maps[0].update(other) + return m + + def __ror__(self, other): + if not isinstance(other, _collections_abc.Mapping): + return NotImplemented + m = dict(other) + for child in reversed(self.maps): + m.update(child) + return self.__class__(m) + ################################################################################ ### UserDict @@ -978,38 +1040,29 @@ class ChainMap(_collections_abc.MutableMapping): class UserDict(_collections_abc.MutableMapping): # Start by filling-out the abstract methods - def __init__(*args, **kwargs): - if not args: - raise TypeError("descriptor '__init__' of 'UserDict' object " - "needs an argument") - self, *args = args - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - if args: - dict = args[0] - elif 'dict' in kwargs: - dict = kwargs.pop('dict') - import warnings - warnings.warn("Passing 'dict' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - dict = None + def __init__(self, dict=None, /, **kwargs): self.data = {} if dict is not None: self.update(dict) if kwargs: self.update(kwargs) - __init__.__text_signature__ = '($self, dict=None, /, **kwargs)' - def __len__(self): return len(self.data) + def __len__(self): + return len(self.data) + def __getitem__(self, key): if key in self.data: return self.data[key] if hasattr(self.__class__, "__missing__"): return self.__class__.__missing__(self, key) raise KeyError(key) - def __setitem__(self, key, item): self.data[key] = item - def __delitem__(self, key): del self.data[key] + + def __setitem__(self, key, item): + self.data[key] = item + + def __delitem__(self, key): + del self.data[key] + def __iter__(self): return iter(self.data) @@ -1018,7 +1071,30 @@ class UserDict(_collections_abc.MutableMapping): return key in self.data # Now, add the methods in dicts but not in MutableMapping - def __repr__(self): return repr(self.data) + def __repr__(self): + return repr(self.data) + + def __or__(self, other): + if isinstance(other, UserDict): + return self.__class__(self.data | other.data) + if isinstance(other, dict): + return self.__class__(self.data | other) + return NotImplemented + + def __ror__(self, other): + if isinstance(other, UserDict): + return self.__class__(other.data | self.data) + if isinstance(other, dict): + return self.__class__(other | self.data) + return NotImplemented + + def __ior__(self, other): + if isinstance(other, UserDict): + self.data |= other.data + else: + self.data |= other + return self + def __copy__(self): inst = self.__class__.__new__(self.__class__) inst.__dict__.update(self.__dict__) @@ -1047,13 +1123,13 @@ class UserDict(_collections_abc.MutableMapping): return d - ################################################################################ ### UserList ################################################################################ class UserList(_collections_abc.MutableSequence): """A more or less complete user-defined wrapper around list objects.""" + def __init__(self, initlist=None): self.data = [] if initlist is not None: @@ -1064,35 +1140,60 @@ class UserList(_collections_abc.MutableSequence): self.data[:] = initlist.data[:] else: self.data = list(initlist) - def __repr__(self): return repr(self.data) - def __lt__(self, other): return self.data < self.__cast(other) - def __le__(self, other): return self.data <= self.__cast(other) - def __eq__(self, other): return self.data == self.__cast(other) - def __gt__(self, other): return self.data > self.__cast(other) - def __ge__(self, other): return self.data >= self.__cast(other) + + def __repr__(self): + return repr(self.data) + + def __lt__(self, other): + return self.data < self.__cast(other) + + def __le__(self, other): + return self.data <= self.__cast(other) + + def __eq__(self, other): + return self.data == self.__cast(other) + + def __gt__(self, other): + return self.data > self.__cast(other) + + def __ge__(self, other): + return self.data >= self.__cast(other) + def __cast(self, other): return other.data if isinstance(other, UserList) else other - def __contains__(self, item): return item in self.data - def __len__(self): return len(self.data) + + def __contains__(self, item): + return item in self.data + + def __len__(self): + return len(self.data) + def __getitem__(self, i): if isinstance(i, slice): return self.__class__(self.data[i]) else: return self.data[i] - def __setitem__(self, i, item): self.data[i] = item - def __delitem__(self, i): del self.data[i] + + def __setitem__(self, i, item): + self.data[i] = item + + def __delitem__(self, i): + del self.data[i] + def __add__(self, other): if isinstance(other, UserList): return self.__class__(self.data + other.data) elif isinstance(other, type(self.data)): return self.__class__(self.data + other) return self.__class__(self.data + list(other)) + def __radd__(self, other): if isinstance(other, UserList): return self.__class__(other.data + self.data) elif isinstance(other, type(self.data)): return self.__class__(other + self.data) return self.__class__(list(other) + self.data) + def __iadd__(self, other): if isinstance(other, UserList): self.data += other.data @@ -1101,28 +1202,53 @@ class UserList(_collections_abc.MutableSequence): else: self.data += list(other) return self + def __mul__(self, n): - return self.__class__(self.data*n) + return self.__class__(self.data * n) + __rmul__ = __mul__ + def __imul__(self, n): self.data *= n return self + def __copy__(self): inst = self.__class__.__new__(self.__class__) inst.__dict__.update(self.__dict__) # Create a copy and avoid triggering descriptors inst.__dict__["data"] = self.__dict__["data"][:] return inst - def append(self, item): self.data.append(item) - def insert(self, i, item): self.data.insert(i, item) - def pop(self, i=-1): return self.data.pop(i) - def remove(self, item): self.data.remove(item) - def clear(self): self.data.clear() - def copy(self): return self.__class__(self) - def count(self, item): return self.data.count(item) - def index(self, item, *args): return self.data.index(item, *args) - def reverse(self): self.data.reverse() - def sort(self, /, *args, **kwds): self.data.sort(*args, **kwds) + + def append(self, item): + self.data.append(item) + + def insert(self, i, item): + self.data.insert(i, item) + + def pop(self, i=-1): + return self.data.pop(i) + + def remove(self, item): + self.data.remove(item) + + def clear(self): + self.data.clear() + + def copy(self): + return self.__class__(self) + + def count(self, item): + return self.data.count(item) + + def index(self, item, *args): + return self.data.index(item, *args) + + def reverse(self): + self.data.reverse() + + def sort(self, /, *args, **kwds): + self.data.sort(*args, **kwds) + def extend(self, other): if isinstance(other, UserList): self.data.extend(other.data) @@ -1130,12 +1256,12 @@ class UserList(_collections_abc.MutableSequence): self.data.extend(other) - ################################################################################ ### UserString ################################################################################ class UserString(_collections_abc.Sequence): + def __init__(self, seq): if isinstance(seq, str): self.data = seq @@ -1143,12 +1269,25 @@ class UserString(_collections_abc.Sequence): self.data = seq.data[:] else: self.data = str(seq) - def __str__(self): return str(self.data) - def __repr__(self): return repr(self.data) - def __int__(self): return int(self.data) - def __float__(self): return float(self.data) - def __complex__(self): return complex(self.data) - def __hash__(self): return hash(self.data) + + def __str__(self): + return str(self.data) + + def __repr__(self): + return repr(self.data) + + def __int__(self): + return int(self.data) + + def __float__(self): + return float(self.data) + + def __complex__(self): + return complex(self.data) + + def __hash__(self): + return hash(self.data) + def __getnewargs__(self): return (self.data[:],) @@ -1156,18 +1295,22 @@ class UserString(_collections_abc.Sequence): if isinstance(string, UserString): return self.data == string.data return self.data == string + def __lt__(self, string): if isinstance(string, UserString): return self.data < string.data return self.data < string + def __le__(self, string): if isinstance(string, UserString): return self.data <= string.data return self.data <= string + def __gt__(self, string): if isinstance(string, UserString): return self.data > string.data return self.data > string + def __ge__(self, string): if isinstance(string, UserString): return self.data >= string.data @@ -1178,102 +1321,188 @@ class UserString(_collections_abc.Sequence): char = char.data return char in self.data - def __len__(self): return len(self.data) - def __getitem__(self, index): return self.__class__(self.data[index]) + def __len__(self): + return len(self.data) + + def __getitem__(self, index): + return self.__class__(self.data[index]) + def __add__(self, other): if isinstance(other, UserString): return self.__class__(self.data + other.data) elif isinstance(other, str): return self.__class__(self.data + other) return self.__class__(self.data + str(other)) + def __radd__(self, other): if isinstance(other, str): return self.__class__(other + self.data) return self.__class__(str(other) + self.data) + def __mul__(self, n): - return self.__class__(self.data*n) + return self.__class__(self.data * n) + __rmul__ = __mul__ + def __mod__(self, args): return self.__class__(self.data % args) + def __rmod__(self, template): return self.__class__(str(template) % self) + # the following methods are defined in alphabetical order: - def capitalize(self): return self.__class__(self.data.capitalize()) + def capitalize(self): + return self.__class__(self.data.capitalize()) + def casefold(self): return self.__class__(self.data.casefold()) + def center(self, width, *args): return self.__class__(self.data.center(width, *args)) + def count(self, sub, start=0, end=_sys.maxsize): if isinstance(sub, UserString): sub = sub.data return self.data.count(sub, start, end) + + def removeprefix(self, prefix, /): + if isinstance(prefix, UserString): + prefix = prefix.data + return self.__class__(self.data.removeprefix(prefix)) + + def removesuffix(self, suffix, /): + if isinstance(suffix, UserString): + suffix = suffix.data + return self.__class__(self.data.removesuffix(suffix)) + def encode(self, encoding='utf-8', errors='strict'): encoding = 'utf-8' if encoding is None else encoding errors = 'strict' if errors is None else errors return self.data.encode(encoding, errors) + def endswith(self, suffix, start=0, end=_sys.maxsize): return self.data.endswith(suffix, start, end) + def expandtabs(self, tabsize=8): return self.__class__(self.data.expandtabs(tabsize)) + def find(self, sub, start=0, end=_sys.maxsize): if isinstance(sub, UserString): sub = sub.data return self.data.find(sub, start, end) + def format(self, /, *args, **kwds): return self.data.format(*args, **kwds) + def format_map(self, mapping): return self.data.format_map(mapping) + def index(self, sub, start=0, end=_sys.maxsize): return self.data.index(sub, start, end) - def isalpha(self): return self.data.isalpha() - def isalnum(self): return self.data.isalnum() - def isascii(self): return self.data.isascii() - def isdecimal(self): return self.data.isdecimal() - def isdigit(self): return self.data.isdigit() - def isidentifier(self): return self.data.isidentifier() - def islower(self): return self.data.islower() - def isnumeric(self): return self.data.isnumeric() - def isprintable(self): return self.data.isprintable() - def isspace(self): return self.data.isspace() - def istitle(self): return self.data.istitle() - def isupper(self): return self.data.isupper() - def join(self, seq): return self.data.join(seq) + + def isalpha(self): + return self.data.isalpha() + + def isalnum(self): + return self.data.isalnum() + + def isascii(self): + return self.data.isascii() + + def isdecimal(self): + return self.data.isdecimal() + + def isdigit(self): + return self.data.isdigit() + + def isidentifier(self): + return self.data.isidentifier() + + def islower(self): + return self.data.islower() + + def isnumeric(self): + return self.data.isnumeric() + + def isprintable(self): + return self.data.isprintable() + + def isspace(self): + return self.data.isspace() + + def istitle(self): + return self.data.istitle() + + def isupper(self): + return self.data.isupper() + + def join(self, seq): + return self.data.join(seq) + def ljust(self, width, *args): return self.__class__(self.data.ljust(width, *args)) - def lower(self): return self.__class__(self.data.lower()) - def lstrip(self, chars=None): return self.__class__(self.data.lstrip(chars)) + + def lower(self): + return self.__class__(self.data.lower()) + + def lstrip(self, chars=None): + return self.__class__(self.data.lstrip(chars)) + maketrans = str.maketrans + def partition(self, sep): return self.data.partition(sep) + def replace(self, old, new, maxsplit=-1): if isinstance(old, UserString): old = old.data if isinstance(new, UserString): new = new.data return self.__class__(self.data.replace(old, new, maxsplit)) + def rfind(self, sub, start=0, end=_sys.maxsize): if isinstance(sub, UserString): sub = sub.data return self.data.rfind(sub, start, end) + def rindex(self, sub, start=0, end=_sys.maxsize): return self.data.rindex(sub, start, end) + def rjust(self, width, *args): return self.__class__(self.data.rjust(width, *args)) + def rpartition(self, sep): return self.data.rpartition(sep) + def rstrip(self, chars=None): return self.__class__(self.data.rstrip(chars)) + def split(self, sep=None, maxsplit=-1): return self.data.split(sep, maxsplit) + def rsplit(self, sep=None, maxsplit=-1): return self.data.rsplit(sep, maxsplit) - def splitlines(self, keepends=False): return self.data.splitlines(keepends) + + def splitlines(self, keepends=False): + return self.data.splitlines(keepends) + def startswith(self, prefix, start=0, end=_sys.maxsize): return self.data.startswith(prefix, start, end) - def strip(self, chars=None): return self.__class__(self.data.strip(chars)) - def swapcase(self): return self.__class__(self.data.swapcase()) - def title(self): return self.__class__(self.data.title()) + + def strip(self, chars=None): + return self.__class__(self.data.strip(chars)) + + def swapcase(self): + return self.__class__(self.data.swapcase()) + + def title(self): + return self.__class__(self.data.title()) + def translate(self, *args): return self.__class__(self.data.translate(*args)) - def upper(self): return self.__class__(self.data.upper()) - def zfill(self, width): return self.__class__(self.data.zfill(width)) + + def upper(self): + return self.__class__(self.data.upper()) + + def zfill(self, width): + return self.__class__(self.data.zfill(width)) diff --git a/Lib/compileall.py b/Lib/compileall.py index bfac8efc..fe7f450c 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -15,12 +15,14 @@ import sys import importlib.util import py_compile import struct +import filecmp from functools import partial +from pathlib import Path __all__ = ["compile_dir","compile_file","compile_path"] -def _walk_dir(dir, ddir=None, maxlevels=10, quiet=0): +def _walk_dir(dir, maxlevels, quiet=0): if quiet < 2 and isinstance(dir, os.PathLike): dir = os.fspath(dir) if not quiet: @@ -36,37 +38,49 @@ def _walk_dir(dir, ddir=None, maxlevels=10, quiet=0): if name == '__pycache__': continue fullname = os.path.join(dir, name) - if ddir is not None: - dfile = os.path.join(ddir, name) - else: - dfile = None if not os.path.isdir(fullname): - yield fullname, ddir + yield fullname elif (maxlevels > 0 and name != os.curdir and name != os.pardir and os.path.isdir(fullname) and not os.path.islink(fullname)): - yield from _walk_dir(fullname, ddir=dfile, - maxlevels=maxlevels - 1, quiet=quiet) + yield from _walk_dir(fullname, maxlevels=maxlevels - 1, + quiet=quiet) -def compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None, - quiet=0, legacy=False, optimize=-1, workers=1, - invalidation_mode=None): +def compile_dir(dir, maxlevels=None, ddir=None, force=False, + rx=None, quiet=0, legacy=False, optimize=-1, workers=1, + invalidation_mode=None, *, stripdir=None, + prependdir=None, limit_sl_dest=None, hardlink_dupes=False): """Byte-compile all modules in the given directory tree. Arguments (only dir is required): dir: the directory to byte-compile - maxlevels: maximum recursion level (default 10) + maxlevels: maximum recursion level (default `sys.getrecursionlimit()`) ddir: the directory that will be prepended to the path to the file as it is compiled into each byte-code file. force: if True, force compilation, even if timestamps are up-to-date quiet: full output with False or 0, errors only with 1, no output with 2 legacy: if True, produce legacy pyc paths instead of PEP 3147 paths - optimize: optimization level or -1 for level of the interpreter + optimize: int or list of optimization levels or -1 for level of + the interpreter. Multiple levels leads to multiple compiled + files each with one optimization level. workers: maximum number of parallel workers invalidation_mode: how the up-to-dateness of the pyc will be checked + stripdir: part of path to left-strip from source file path + prependdir: path to prepend to beginning of original file path, applied + after stripdir + limit_sl_dest: ignore symlinks if they are pointing outside of + the defined path + hardlink_dupes: hardlink duplicated pyc files """ ProcessPoolExecutor = None + if ddir is not None and (stripdir is not None or prependdir is not None): + raise ValueError(("Destination dir (ddir) cannot be used " + "in combination with stripdir or prependdir")) + if ddir is not None: + stripdir = dir + prependdir = ddir + ddir = None if workers < 0: raise ValueError('workers must be greater or equal to 0') if workers != 1: @@ -76,36 +90,40 @@ def compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None, from concurrent.futures import ProcessPoolExecutor except ImportError: workers = 1 - files_and_ddirs = _walk_dir(dir, quiet=quiet, maxlevels=maxlevels, - ddir=ddir) + if maxlevels is None: + maxlevels = sys.getrecursionlimit() + files = _walk_dir(dir, quiet=quiet, maxlevels=maxlevels) success = True if workers != 1 and ProcessPoolExecutor is not None: # If workers == 0, let ProcessPoolExecutor choose workers = workers or None with ProcessPoolExecutor(max_workers=workers) as executor: - results = executor.map( - partial(_compile_file_tuple, - force=force, rx=rx, quiet=quiet, - legacy=legacy, optimize=optimize, - invalidation_mode=invalidation_mode, - ), - files_and_ddirs) + results = executor.map(partial(compile_file, + ddir=ddir, force=force, + rx=rx, quiet=quiet, + legacy=legacy, + optimize=optimize, + invalidation_mode=invalidation_mode, + stripdir=stripdir, + prependdir=prependdir, + limit_sl_dest=limit_sl_dest, + hardlink_dupes=hardlink_dupes), + files) success = min(results, default=True) else: - for file, dfile in files_and_ddirs: - if not compile_file(file, dfile, force, rx, quiet, - legacy, optimize, invalidation_mode): + for file in files: + if not compile_file(file, ddir, force, rx, quiet, + legacy, optimize, invalidation_mode, + stripdir=stripdir, prependdir=prependdir, + limit_sl_dest=limit_sl_dest, + hardlink_dupes=hardlink_dupes): success = False return success -def _compile_file_tuple(file_and_dfile, **kwargs): - """Needs to be toplevel for ProcessPoolExecutor.""" - file, dfile = file_and_dfile - return compile_file(file, dfile, **kwargs) - def compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, - invalidation_mode=None): + invalidation_mode=None, *, stripdir=None, prependdir=None, + limit_sl_dest=None, hardlink_dupes=False): """Byte-compile one file. Arguments (only fullname is required): @@ -117,32 +135,85 @@ def compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, quiet: full output with False or 0, errors only with 1, no output with 2 legacy: if True, produce legacy pyc paths instead of PEP 3147 paths - optimize: optimization level or -1 for level of the interpreter + optimize: int or list of optimization levels or -1 for level of + the interpreter. Multiple levels leads to multiple compiled + files each with one optimization level. invalidation_mode: how the up-to-dateness of the pyc will be checked + stripdir: part of path to left-strip from source file path + prependdir: path to prepend to beginning of original file path, applied + after stripdir + limit_sl_dest: ignore symlinks if they are pointing outside of + the defined path. + hardlink_dupes: hardlink duplicated pyc files """ + + if ddir is not None and (stripdir is not None or prependdir is not None): + raise ValueError(("Destination dir (ddir) cannot be used " + "in combination with stripdir or prependdir")) + success = True if quiet < 2 and isinstance(fullname, os.PathLike): fullname = os.fspath(fullname) name = os.path.basename(fullname) + + dfile = None + if ddir is not None: dfile = os.path.join(ddir, name) - else: - dfile = None + + if stripdir is not None: + fullname_parts = fullname.split(os.path.sep) + stripdir_parts = stripdir.split(os.path.sep) + ddir_parts = list(fullname_parts) + + for spart, opart in zip(stripdir_parts, fullname_parts): + if spart == opart: + ddir_parts.remove(spart) + + dfile = os.path.join(*ddir_parts) + + if prependdir is not None: + if dfile is None: + dfile = os.path.join(prependdir, fullname) + else: + dfile = os.path.join(prependdir, dfile) + + if isinstance(optimize, int): + optimize = [optimize] + + # Use set() to remove duplicates. + # Use sorted() to create pyc files in a deterministic order. + optimize = sorted(set(optimize)) + + if hardlink_dupes and len(optimize) < 2: + raise ValueError("Hardlinking of duplicated bytecode makes sense " + "only for more than one optimization level") + if rx is not None: mo = rx.search(fullname) if mo: return success + + if limit_sl_dest is not None and os.path.islink(fullname): + if Path(limit_sl_dest).resolve() not in Path(fullname).resolve().parents: + return success + + opt_cfiles = {} + if os.path.isfile(fullname): - if legacy: - cfile = fullname + 'c' - else: - if optimize >= 0: - opt = optimize if optimize >= 1 else '' - cfile = importlib.util.cache_from_source( - fullname, optimization=opt) + for opt_level in optimize: + if legacy: + opt_cfiles[opt_level] = fullname + 'c' else: - cfile = importlib.util.cache_from_source(fullname) - cache_dir = os.path.dirname(cfile) + if opt_level >= 0: + opt = opt_level if opt_level >= 1 else '' + cfile = (importlib.util.cache_from_source( + fullname, optimization=opt)) + opt_cfiles[opt_level] = cfile + else: + cfile = importlib.util.cache_from_source(fullname) + opt_cfiles[opt_level] = cfile + head, tail = name[:-3], name[-3:] if tail == '.py': if not force: @@ -150,18 +221,28 @@ def compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, mtime = int(os.stat(fullname).st_mtime) expect = struct.pack('<4sll', importlib.util.MAGIC_NUMBER, 0, mtime) - with open(cfile, 'rb') as chandle: - actual = chandle.read(12) - if expect == actual: + for cfile in opt_cfiles.values(): + with open(cfile, 'rb') as chandle: + actual = chandle.read(12) + if expect != actual: + break + else: return success except OSError: pass if not quiet: print('Compiling {!r}...'.format(fullname)) try: - ok = py_compile.compile(fullname, cfile, dfile, True, - optimize=optimize, - invalidation_mode=invalidation_mode) + for index, opt_level in enumerate(optimize): + cfile = opt_cfiles[opt_level] + ok = py_compile.compile(fullname, cfile, dfile, True, + optimize=opt_level, + invalidation_mode=invalidation_mode) + if index > 0 and hardlink_dupes: + previous_cfile = opt_cfiles[optimize[index - 1]] + if filecmp.cmp(cfile, previous_cfile, shallow=False): + os.unlink(cfile) + os.link(previous_cfile, cfile) except py_compile.PyCompileError as err: success = False if quiet >= 2: @@ -230,7 +311,7 @@ def main(): parser = argparse.ArgumentParser( description='Utilities to support installing Python libraries.') parser.add_argument('-l', action='store_const', const=0, - default=10, dest='maxlevels', + default=None, dest='maxlevels', help="don't recurse into subdirectories") parser.add_argument('-r', type=int, dest='recursion', help=('control the maximum recursion level. ' @@ -248,6 +329,20 @@ def main(): 'compile-time tracebacks and in runtime ' 'tracebacks in cases where the source file is ' 'unavailable')) + parser.add_argument('-s', metavar='STRIPDIR', dest='stripdir', + default=None, + help=('part of path to left-strip from path ' + 'to source file - for example buildroot. ' + '`-d` and `-s` options cannot be ' + 'specified together.')) + parser.add_argument('-p', metavar='PREPENDDIR', dest='prependdir', + default=None, + help=('path to add as prefix to path ' + 'to source file - for example / to make ' + 'it absolute when some part is removed ' + 'by `-s` option. ' + '`-d` and `-p` options cannot be ' + 'specified together.')) parser.add_argument('-x', metavar='REGEXP', dest='rx', default=None, help=('skip files matching the regular expression; ' 'the regexp is searched for in the full path ' @@ -270,6 +365,15 @@ def main(): '"checked-hash" if the SOURCE_DATE_EPOCH ' 'environment variable is set, and ' '"timestamp" otherwise.')) + parser.add_argument('-o', action='append', type=int, dest='opt_levels', + help=('Optimization levels to run compilation with.' + 'Default is -1 which uses optimization level of' + 'Python interpreter itself (specified by -O).')) + parser.add_argument('-e', metavar='DIR', dest='limit_sl_dest', + help='Ignore symlinks pointing outsite of the DIR') + parser.add_argument('--hardlink-dupes', action='store_true', + dest='hardlink_dupes', + help='Hardlink duplicated pyc files') args = parser.parse_args() compile_dests = args.compile_dest @@ -278,12 +382,26 @@ def main(): import re args.rx = re.compile(args.rx) + if args.limit_sl_dest == "": + args.limit_sl_dest = None if args.recursion is not None: maxlevels = args.recursion else: maxlevels = args.maxlevels + if args.opt_levels is None: + args.opt_levels = [-1] + + if len(args.opt_levels) == 1 and args.hardlink_dupes: + parser.error(("Hardlinking of duplicated bytecode makes sense " + "only for more than one optimization level.")) + + if args.ddir is not None and ( + args.stripdir is not None or args.prependdir is not None + ): + parser.error("-d cannot be used in combination with -s or -p") + # if flist is provided then load it if args.flist: try: @@ -308,13 +426,23 @@ def main(): if os.path.isfile(dest): if not compile_file(dest, args.ddir, args.force, args.rx, args.quiet, args.legacy, - invalidation_mode=invalidation_mode): + invalidation_mode=invalidation_mode, + stripdir=args.stripdir, + prependdir=args.prependdir, + optimize=args.opt_levels, + limit_sl_dest=args.limit_sl_dest, + hardlink_dupes=args.hardlink_dupes): success = False else: if not compile_dir(dest, maxlevels, args.ddir, args.force, args.rx, args.quiet, args.legacy, workers=args.workers, - invalidation_mode=invalidation_mode): + invalidation_mode=invalidation_mode, + stripdir=args.stripdir, + prependdir=args.prependdir, + optimize=args.opt_levels, + limit_sl_dest=args.limit_sl_dest, + hardlink_dupes=args.hardlink_dupes): success = False return success else: diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index 6001e3bd..00eb5488 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -7,6 +7,7 @@ import collections import logging import threading import time +import types FIRST_COMPLETED = 'FIRST_COMPLETED' FIRST_EXCEPTION = 'FIRST_EXCEPTION' @@ -544,10 +545,12 @@ class Future(object): self._condition.notify_all() self._invoke_callbacks() + __class_getitem__ = classmethod(types.GenericAlias) + class Executor(object): """This is an abstract base class for concrete asynchronous executors.""" - def submit(*args, **kwargs): + def submit(self, fn, /, *args, **kwargs): """Submits a callable to be executed with the given arguments. Schedules the callable to be executed as fn(*args, **kwargs) and returns @@ -556,21 +559,7 @@ class Executor(object): Returns: A Future representing the given call. """ - if len(args) >= 2: - pass - elif not args: - raise TypeError("descriptor 'submit' of 'Executor' object " - "needs an argument") - elif 'fn' in kwargs: - import warnings - warnings.warn("Passing 'fn' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('submit expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - raise NotImplementedError() - submit.__text_signature__ = '($self, fn, /, *args, **kwargs)' def map(self, fn, *iterables, timeout=None, chunksize=1): """Returns an iterator equivalent to map(fn, iter). @@ -616,7 +605,7 @@ class Executor(object): future.cancel() return result_iterator() - def shutdown(self, wait=True): + def shutdown(self, wait=True, *, cancel_futures=False): """Clean-up the resources associated with the Executor. It is safe to call this method several times. Otherwise, no other @@ -626,6 +615,9 @@ class Executor(object): wait: If True then shutdown will not return until all running futures have finished executing and the resources used by the executor have been reclaimed. + cancel_futures: If True then shutdown will cancel all pending + futures. Futures that are completed or running will not be + cancelled. """ pass diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 2b2b78ee..90bc98bf 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -45,11 +45,9 @@ Process #1..n: __author__ = 'Brian Quinlan (brian@sweetapp.com)' -import atexit import os from concurrent.futures import _base import queue -from queue import Full import multiprocessing as mp import multiprocessing.connection from multiprocessing.queues import Queue @@ -60,19 +58,6 @@ import itertools import sys import traceback -# Workers are created as daemon threads and processes. This is done to allow the -# interpreter to exit when there are still idle processes in a -# ProcessPoolExecutor's process pool (i.e. shutdown() was not called). However, -# allowing workers to die with the interpreter has two undesirable properties: -# - The workers would still be running during interpreter shutdown, -# meaning that they would fail in unpredictable ways. -# - The workers could be killed while evaluating a work item, which could -# be bad if the callable being evaluated has external side-effects e.g. -# writing to a file. -# -# To work around this problem, an exit handler is installed which tells the -# workers to exit when their work queues are empty and then waits until the -# threads/processes finish. _threads_wakeups = weakref.WeakKeyDictionary() _global_shutdown = False @@ -80,18 +65,23 @@ _global_shutdown = False class _ThreadWakeup: def __init__(self): + self._closed = False self._reader, self._writer = mp.Pipe(duplex=False) def close(self): - self._writer.close() - self._reader.close() + if not self._closed: + self._closed = True + self._writer.close() + self._reader.close() def wakeup(self): - self._writer.send_bytes(b"") + if not self._closed: + self._writer.send_bytes(b"") def clear(self): - while self._reader.poll(): - self._reader.recv_bytes() + if not self._closed: + while self._reader.poll(): + self._reader.recv_bytes() def _python_exit(): @@ -99,10 +89,17 @@ def _python_exit(): _global_shutdown = True items = list(_threads_wakeups.items()) for _, thread_wakeup in items: + # call not protected by ProcessPoolExecutor._shutdown_lock thread_wakeup.wakeup() for t, _ in items: t.join() +# Register for `_python_exit()` to be called just before joining all +# non-daemon threads. This is used instead of `atexit.register()` for +# compatibility with subinterpreters, which no longer support daemon threads. +# See bpo-39812 for context. +threading._register_atexit(_python_exit) + # Controls how many more calls than processes will be queued in the call queue. # A smaller number will mean that processes spend more time idle waiting for # work while a larger number will make Future.cancel() succeed less frequently @@ -160,8 +157,11 @@ class _CallItem(object): class _SafeQueue(Queue): """Safe Queue set exception to the future object linked to a job""" - def __init__(self, max_size=0, *, ctx, pending_work_items): + def __init__(self, max_size=0, *, ctx, pending_work_items, shutdown_lock, + thread_wakeup): self.pending_work_items = pending_work_items + self.shutdown_lock = shutdown_lock + self.thread_wakeup = thread_wakeup super().__init__(max_size, ctx=ctx) def _on_queue_feeder_error(self, e, obj): @@ -169,8 +169,11 @@ class _SafeQueue(Queue): tb = traceback.format_exception(type(e), e, e.__traceback__) e.__cause__ = _RemoteTraceback('\n"""\n{}"""'.format(''.join(tb))) work_item = self.pending_work_items.pop(obj.work_id, None) - # work_item can be None if another process terminated. In this case, - # the queue_manager_thread fails all work_items with BrokenProcessPool + with self.shutdown_lock: + self.thread_wakeup.wakeup() + # work_item can be None if another process terminated. In this + # case, the executor_manager_thread fails all work_items + # with BrokenProcessPool if work_item is not None: work_item.future.set_exception(e) else: @@ -186,6 +189,7 @@ def _get_chunks(*iterables, chunksize): return yield chunk + def _process_chunk(fn, chunk): """ Processes a chunk of an iterable passed to map. @@ -249,120 +253,132 @@ def _process_worker(call_queue, result_queue, initializer, initargs): del call_item -def _add_call_item_to_queue(pending_work_items, - work_ids, - call_queue): - """Fills call_queue with _WorkItems from pending_work_items. +class _ExecutorManagerThread(threading.Thread): + """Manages the communication between this process and the worker processes. - This function never blocks. + The manager is run in a local thread. Args: - pending_work_items: A dict mapping work ids to _WorkItems e.g. - {5: <_WorkItem...>, 6: <_WorkItem...>, ...} - work_ids: A queue.Queue of work ids e.g. Queue([5, 6, ...]). Work ids - are consumed and the corresponding _WorkItems from - pending_work_items are transformed into _CallItems and put in - call_queue. - call_queue: A multiprocessing.Queue that will be filled with _CallItems - derived from _WorkItems. + executor: A reference to the ProcessPoolExecutor that owns + this thread. A weakref will be own by the manager as well as + references to internal objects used to introspect the state of + the executor. """ - while True: - if call_queue.full(): - return - try: - work_id = work_ids.get(block=False) - except queue.Empty: - return - else: - work_item = pending_work_items[work_id] - - if work_item.future.set_running_or_notify_cancel(): - call_queue.put(_CallItem(work_id, - work_item.fn, - work_item.args, - work_item.kwargs), - block=True) - else: - del pending_work_items[work_id] - continue + def __init__(self, executor): + # Store references to necessary internals of the executor. + + # A _ThreadWakeup to allow waking up the queue_manager_thread from the + # main Thread and avoid deadlocks caused by permanently locked queues. + self.thread_wakeup = executor._executor_manager_thread_wakeup + self.shutdown_lock = executor._shutdown_lock + + # A weakref.ref to the ProcessPoolExecutor that owns this thread. Used + # to determine if the ProcessPoolExecutor has been garbage collected + # and that the manager can exit. + # When the executor gets garbage collected, the weakref callback + # will wake up the queue management thread so that it can terminate + # if there is no pending work item. + def weakref_cb(_, + thread_wakeup=self.thread_wakeup, + shutdown_lock=self.shutdown_lock): + mp.util.debug('Executor collected: triggering callback for' + ' QueueManager wakeup') + with shutdown_lock: + thread_wakeup.wakeup() -def _queue_management_worker(executor_reference, - processes, - pending_work_items, - work_ids_queue, - call_queue, - result_queue, - thread_wakeup): - """Manages the communication between this process and the worker processes. + self.executor_reference = weakref.ref(executor, weakref_cb) - This function is run in a local thread. + # A list of the ctx.Process instances used as workers. + self.processes = executor._processes - Args: - executor_reference: A weakref.ref to the ProcessPoolExecutor that owns - this thread. Used to determine if the ProcessPoolExecutor has been - garbage collected and that this function can exit. - process: A list of the ctx.Process instances used as - workers. - pending_work_items: A dict mapping work ids to _WorkItems e.g. - {5: <_WorkItem...>, 6: <_WorkItem...>, ...} - work_ids_queue: A queue.Queue of work ids e.g. Queue([5, 6, ...]). - call_queue: A ctx.Queue that will be filled with _CallItems - derived from _WorkItems for processing by the process workers. - result_queue: A ctx.SimpleQueue of _ResultItems generated by the - process workers. - thread_wakeup: A _ThreadWakeup to allow waking up the - queue_manager_thread from the main Thread and avoid deadlocks - caused by permanently locked queues. - """ - executor = None + # A ctx.Queue that will be filled with _CallItems derived from + # _WorkItems for processing by the process workers. + self.call_queue = executor._call_queue - def shutting_down(): - return (_global_shutdown or executor is None - or executor._shutdown_thread) + # A ctx.SimpleQueue of _ResultItems generated by the process workers. + self.result_queue = executor._result_queue - def shutdown_worker(): - # This is an upper bound on the number of children alive. - n_children_alive = sum(p.is_alive() for p in processes.values()) - n_children_to_stop = n_children_alive - n_sentinels_sent = 0 - # Send the right number of sentinels, to make sure all children are - # properly terminated. - while n_sentinels_sent < n_children_to_stop and n_children_alive > 0: - for i in range(n_children_to_stop - n_sentinels_sent): - try: - call_queue.put_nowait(None) - n_sentinels_sent += 1 - except Full: - break - n_children_alive = sum(p.is_alive() for p in processes.values()) + # A queue.Queue of work ids e.g. Queue([5, 6, ...]). + self.work_ids_queue = executor._work_ids - # Release the queue's resources as soon as possible. - call_queue.close() - # If .join() is not called on the created processes then - # some ctx.Queue methods may deadlock on Mac OS X. - for p in processes.values(): - p.join() + # A dict mapping work ids to _WorkItems e.g. + # {5: <_WorkItem...>, 6: <_WorkItem...>, ...} + self.pending_work_items = executor._pending_work_items - result_reader = result_queue._reader - wakeup_reader = thread_wakeup._reader - readers = [result_reader, wakeup_reader] + super().__init__() - while True: - _add_call_item_to_queue(pending_work_items, - work_ids_queue, - call_queue) + def run(self): + # Main loop for the executor manager thread. + + while True: + self.add_call_item_to_queue() + + result_item, is_broken, cause = self.wait_result_broken_or_wakeup() + if is_broken: + self.terminate_broken(cause) + return + if result_item is not None: + self.process_result_item(result_item) + # Delete reference to result_item to avoid keeping references + # while waiting on new results. + del result_item + + # attempt to increment idle process count + executor = self.executor_reference() + if executor is not None: + executor._idle_worker_semaphore.release() + del executor + + if self.is_shutting_down(): + self.flag_executor_shutting_down() + + # Since no new work items can be added, it is safe to shutdown + # this thread if there are no pending work items. + if not self.pending_work_items: + self.join_executor_internals() + return + + def add_call_item_to_queue(self): + # Fills call_queue with _WorkItems from pending_work_items. + # This function never blocks. + while True: + if self.call_queue.full(): + return + try: + work_id = self.work_ids_queue.get(block=False) + except queue.Empty: + return + else: + work_item = self.pending_work_items[work_id] + + if work_item.future.set_running_or_notify_cancel(): + self.call_queue.put(_CallItem(work_id, + work_item.fn, + work_item.args, + work_item.kwargs), + block=True) + else: + del self.pending_work_items[work_id] + continue + + def wait_result_broken_or_wakeup(self): # Wait for a result to be ready in the result_queue while checking # that all worker processes are still running, or for a wake up # signal send. The wake up signals come either from new tasks being # submitted, from the executor being shutdown/gc-ed, or from the # shutdown of the python interpreter. - worker_sentinels = [p.sentinel for p in processes.values()] + result_reader = self.result_queue._reader + assert not self.thread_wakeup._closed + wakeup_reader = self.thread_wakeup._reader + readers = [result_reader, wakeup_reader] + worker_sentinels = [p.sentinel for p in self.processes.values()] ready = mp.connection.wait(readers + worker_sentinels) cause = None is_broken = True + result_item = None if result_reader in ready: try: result_item = result_reader.recv() @@ -372,79 +388,138 @@ def _queue_management_worker(executor_reference, elif wakeup_reader in ready: is_broken = False - result_item = None - thread_wakeup.clear() - if is_broken: - # Mark the process pool broken so that submits fail right now. - executor = executor_reference() - if executor is not None: - executor._broken = ('A child process terminated ' - 'abruptly, the process pool is not ' - 'usable anymore') - executor._shutdown_thread = True - executor = None - bpe = BrokenProcessPool("A process in the process pool was " - "terminated abruptly while the future was " - "running or pending.") - if cause is not None: - bpe.__cause__ = _RemoteTraceback( - f"\n'''\n{''.join(cause)}'''") - # All futures in flight must be marked failed - for work_id, work_item in pending_work_items.items(): - work_item.future.set_exception(bpe) - # Delete references to object. See issue16284 - del work_item - pending_work_items.clear() - # Terminate remaining workers forcibly: the queues or their - # locks may be in a dirty state and block forever. - for p in processes.values(): - p.terminate() - shutdown_worker() - return + + with self.shutdown_lock: + self.thread_wakeup.clear() + + return result_item, is_broken, cause + + def process_result_item(self, result_item): + # Process the received a result_item. This can be either the PID of a + # worker that exited gracefully or a _ResultItem + if isinstance(result_item, int): # Clean shutdown of a worker using its PID # (avoids marking the executor broken) - assert shutting_down() - p = processes.pop(result_item) + assert self.is_shutting_down() + p = self.processes.pop(result_item) p.join() - if not processes: - shutdown_worker() + if not self.processes: + self.join_executor_internals() return - elif result_item is not None: - work_item = pending_work_items.pop(result_item.work_id, None) + else: + # Received a _ResultItem so mark the future as completed. + work_item = self.pending_work_items.pop(result_item.work_id, None) # work_item can be None if another process terminated (see above) if work_item is not None: if result_item.exception: work_item.future.set_exception(result_item.exception) else: work_item.future.set_result(result_item.result) - # Delete references to object. See issue16284 - del work_item - # Delete reference to result_item - del result_item - # Check whether we should start shutting down. - executor = executor_reference() + def is_shutting_down(self): + # Check whether we should start shutting down the executor. + executor = self.executor_reference() # No more work items can be added if: # - The interpreter is shutting down OR # - The executor that owns this worker has been collected OR # - The executor that owns this worker has been shutdown. - if shutting_down(): - try: - # Flag the executor as shutting down as early as possible if it - # is not gc-ed yet. - if executor is not None: - executor._shutdown_thread = True - # Since no new work items can be added, it is safe to shutdown - # this thread if there are no pending work items. - if not pending_work_items: - shutdown_worker() - return - except Full: - # This is not a problem: we will eventually be woken up (in - # result_queue.get()) and be able to send a sentinel again. - pass - executor = None + return (_global_shutdown or executor is None + or executor._shutdown_thread) + + def terminate_broken(self, cause): + # Terminate the executor because it is in a broken state. The cause + # argument can be used to display more information on the error that + # lead the executor into becoming broken. + + # Mark the process pool broken so that submits fail right now. + executor = self.executor_reference() + if executor is not None: + executor._broken = ('A child process terminated ' + 'abruptly, the process pool is not ' + 'usable anymore') + executor._shutdown_thread = True + executor = None + + # All pending tasks are to be marked failed with the following + # BrokenProcessPool error + bpe = BrokenProcessPool("A process in the process pool was " + "terminated abruptly while the future was " + "running or pending.") + if cause is not None: + bpe.__cause__ = _RemoteTraceback( + f"\n'''\n{''.join(cause)}'''") + + # Mark pending tasks as failed. + for work_id, work_item in self.pending_work_items.items(): + work_item.future.set_exception(bpe) + # Delete references to object. See issue16284 + del work_item + self.pending_work_items.clear() + + # Terminate remaining workers forcibly: the queues or their + # locks may be in a dirty state and block forever. + for p in self.processes.values(): + p.terminate() + + # clean up resources + self.join_executor_internals() + + def flag_executor_shutting_down(self): + # Flag the executor as shutting down and cancel remaining tasks if + # requested as early as possible if it is not gc-ed yet. + executor = self.executor_reference() + if executor is not None: + executor._shutdown_thread = True + # Cancel pending work items if requested. + if executor._cancel_pending_futures: + # Cancel all pending futures and update pending_work_items + # to only have futures that are currently running. + new_pending_work_items = {} + for work_id, work_item in self.pending_work_items.items(): + if not work_item.future.cancel(): + new_pending_work_items[work_id] = work_item + self.pending_work_items = new_pending_work_items + # Drain work_ids_queue since we no longer need to + # add items to the call queue. + while True: + try: + self.work_ids_queue.get_nowait() + except queue.Empty: + break + # Make sure we do this only once to not waste time looping + # on running processes over and over. + executor._cancel_pending_futures = False + + def shutdown_workers(self): + n_children_to_stop = self.get_n_children_alive() + n_sentinels_sent = 0 + # Send the right number of sentinels, to make sure all children are + # properly terminated. + while (n_sentinels_sent < n_children_to_stop + and self.get_n_children_alive() > 0): + for i in range(n_children_to_stop - n_sentinels_sent): + try: + self.call_queue.put_nowait(None) + n_sentinels_sent += 1 + except queue.Full: + break + + def join_executor_internals(self): + self.shutdown_workers() + # Release the queue's resources as soon as possible. + self.call_queue.close() + self.call_queue.join_thread() + with self.shutdown_lock: + self.thread_wakeup.close() + # If .join() is not called on the created processes then + # some ctx.Queue methods may deadlock on Mac OS X. + for p in self.processes.values(): + p.join() + + def get_n_children_alive(self): + # This is an upper bound on the number of children alive. + return sum(p.is_alive() for p in self.processes.values()) _system_limits_checked = False @@ -535,7 +610,7 @@ class ProcessPoolExecutor(_base.Executor): self._initargs = initargs # Management thread - self._queue_management_thread = None + self._executor_manager_thread = None # Map of pids to processes self._processes = {} @@ -543,9 +618,21 @@ class ProcessPoolExecutor(_base.Executor): # Shutdown is a two-step process. self._shutdown_thread = False self._shutdown_lock = threading.Lock() + self._idle_worker_semaphore = threading.Semaphore(0) self._broken = False self._queue_count = 0 self._pending_work_items = {} + self._cancel_pending_futures = False + + # _ThreadWakeup is a communication channel used to interrupt the wait + # of the main loop of executor_manager_thread from another thread (e.g. + # when calling executor.submit or executor.shutdown). We do not use the + # _result_queue to send wakeup signals to the executor_manager_thread + # as it could result in a deadlock if a worker process dies with the + # _result_queue write lock still acquired. + # + # _shutdown_lock must be locked to access _ThreadWakeup. + self._executor_manager_thread_wakeup = _ThreadWakeup() # Create communication channels for the executor # Make the call queue slightly larger than the number of processes to @@ -554,7 +641,9 @@ class ProcessPoolExecutor(_base.Executor): queue_size = self._max_workers + EXTRA_QUEUED_CALLS self._call_queue = _SafeQueue( max_size=queue_size, ctx=self._mp_context, - pending_work_items=self._pending_work_items) + pending_work_items=self._pending_work_items, + shutdown_lock=self._shutdown_lock, + thread_wakeup=self._executor_manager_thread_wakeup) # Killed worker processes can produce spurious "broken pipe" # tracebacks in the queue's own worker thread. But we detect killed # processes anyway, so silence the tracebacks. @@ -562,43 +651,21 @@ class ProcessPoolExecutor(_base.Executor): self._result_queue = mp_context.SimpleQueue() self._work_ids = queue.Queue() - # _ThreadWakeup is a communication channel used to interrupt the wait - # of the main loop of queue_manager_thread from another thread (e.g. - # when calling executor.submit or executor.shutdown). We do not use the - # _result_queue to send the wakeup signal to the queue_manager_thread - # as it could result in a deadlock if a worker process dies with the - # _result_queue write lock still acquired. - self._queue_management_thread_wakeup = _ThreadWakeup() - - def _start_queue_management_thread(self): - if self._queue_management_thread is None: - # When the executor gets garbarge collected, the weakref callback - # will wake up the queue management thread so that it can terminate - # if there is no pending work item. - def weakref_cb(_, - thread_wakeup=self._queue_management_thread_wakeup): - mp.util.debug('Executor collected: triggering callback for' - ' QueueManager wakeup') - thread_wakeup.wakeup() + def _start_executor_manager_thread(self): + if self._executor_manager_thread is None: # Start the processes so that their sentinels are known. - self._adjust_process_count() - self._queue_management_thread = threading.Thread( - target=_queue_management_worker, - args=(weakref.ref(self, weakref_cb), - self._processes, - self._pending_work_items, - self._work_ids, - self._call_queue, - self._result_queue, - self._queue_management_thread_wakeup), - name="QueueManagerThread") - self._queue_management_thread.daemon = True - self._queue_management_thread.start() - _threads_wakeups[self._queue_management_thread] = \ - self._queue_management_thread_wakeup + self._executor_manager_thread = _ExecutorManagerThread(self) + self._executor_manager_thread.start() + _threads_wakeups[self._executor_manager_thread] = \ + self._executor_manager_thread_wakeup def _adjust_process_count(self): - for _ in range(len(self._processes), self._max_workers): + # if there's an idle process, we don't need to spawn a new one. + if self._idle_worker_semaphore.acquire(blocking=False): + return + + process_count = len(self._processes) + if process_count < self._max_workers: p = self._mp_context.Process( target=_process_worker, args=(self._call_queue, @@ -608,22 +675,7 @@ class ProcessPoolExecutor(_base.Executor): p.start() self._processes[p.pid] = p - def submit(*args, **kwargs): - if len(args) >= 2: - self, fn, *args = args - elif not args: - raise TypeError("descriptor 'submit' of 'ProcessPoolExecutor' object " - "needs an argument") - elif 'fn' in kwargs: - fn = kwargs.pop('fn') - self, *args = args - import warnings - warnings.warn("Passing 'fn' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('submit expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def submit(self, fn, /, *args, **kwargs): with self._shutdown_lock: if self._broken: raise BrokenProcessPool(self._broken) @@ -640,11 +692,11 @@ class ProcessPoolExecutor(_base.Executor): self._work_ids.put(self._queue_count) self._queue_count += 1 # Wake up queue management thread - self._queue_management_thread_wakeup.wakeup() + self._executor_manager_thread_wakeup.wakeup() - self._start_queue_management_thread() + self._adjust_process_count() + self._start_executor_manager_thread() return f - submit.__text_signature__ = _base.Executor.submit.__text_signature__ submit.__doc__ = _base.Executor.submit.__doc__ def map(self, fn, *iterables, timeout=None, chunksize=1): @@ -676,29 +728,24 @@ class ProcessPoolExecutor(_base.Executor): timeout=timeout) return _chain_from_iterable_of_lists(results) - def shutdown(self, wait=True): + def shutdown(self, wait=True, *, cancel_futures=False): with self._shutdown_lock: + self._cancel_pending_futures = cancel_futures self._shutdown_thread = True - if self._queue_management_thread: - # Wake up queue management thread - self._queue_management_thread_wakeup.wakeup() - if wait: - self._queue_management_thread.join() + if self._executor_manager_thread_wakeup is not None: + # Wake up queue management thread + self._executor_manager_thread_wakeup.wakeup() + + if self._executor_manager_thread is not None and wait: + self._executor_manager_thread.join() # To reduce the risk of opening too many files, remove references to # objects that use file descriptors. - self._queue_management_thread = None - if self._call_queue is not None: - self._call_queue.close() - if wait: - self._call_queue.join_thread() - self._call_queue = None + self._executor_manager_thread = None + self._call_queue = None + if self._result_queue is not None and wait: + self._result_queue.close() self._result_queue = None self._processes = None - - if self._queue_management_thread_wakeup: - self._queue_management_thread_wakeup.close() - self._queue_management_thread_wakeup = None + self._executor_manager_thread_wakeup = None shutdown.__doc__ = _base.Executor.shutdown.__doc__ - -atexit.register(_python_exit) diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 9e669b21..b7a2cac7 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -5,41 +5,36 @@ __author__ = 'Brian Quinlan (brian@sweetapp.com)' -import atexit from concurrent.futures import _base import itertools import queue import threading +import types import weakref import os -# Workers are created as daemon threads. This is done to allow the interpreter -# to exit when there are still idle threads in a ThreadPoolExecutor's thread -# pool (i.e. shutdown() was not called). However, allowing workers to die with -# the interpreter has two undesirable properties: -# - The workers would still be running during interpreter shutdown, -# meaning that they would fail in unpredictable ways. -# - The workers could be killed while evaluating a work item, which could -# be bad if the callable being evaluated has external side-effects e.g. -# writing to a file. -# -# To work around this problem, an exit handler is installed which tells the -# workers to exit when their work queues are empty and then waits until the -# threads finish. _threads_queues = weakref.WeakKeyDictionary() _shutdown = False +# Lock that ensures that new workers are not created while the interpreter is +# shutting down. Must be held while mutating _threads_queues and _shutdown. +_global_shutdown_lock = threading.Lock() def _python_exit(): global _shutdown - _shutdown = True + with _global_shutdown_lock: + _shutdown = True items = list(_threads_queues.items()) for t, q in items: q.put(None) for t, q in items: t.join() -atexit.register(_python_exit) +# Register for `_python_exit()` to be called just before joining all +# non-daemon threads. This is used instead of `atexit.register()` for +# compatibility with subinterpreters, which no longer support daemon threads. +# See bpo-39812 for context. +threading._register_atexit(_python_exit) class _WorkItem(object): @@ -62,6 +57,8 @@ class _WorkItem(object): else: self.future.set_result(result) + __class_getitem__ = classmethod(types.GenericAlias) + def _worker(executor_reference, work_queue, initializer, initargs): if initializer is not None: @@ -155,23 +152,8 @@ class ThreadPoolExecutor(_base.Executor): self._initializer = initializer self._initargs = initargs - def submit(*args, **kwargs): - if len(args) >= 2: - self, fn, *args = args - elif not args: - raise TypeError("descriptor 'submit' of 'ThreadPoolExecutor' object " - "needs an argument") - elif 'fn' in kwargs: - fn = kwargs.pop('fn') - self, *args = args - import warnings - warnings.warn("Passing 'fn' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('submit expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - - with self._shutdown_lock: + def submit(self, fn, /, *args, **kwargs): + with self._shutdown_lock, _global_shutdown_lock: if self._broken: raise BrokenThreadPool(self._broken) @@ -187,7 +169,6 @@ class ThreadPoolExecutor(_base.Executor): self._work_queue.put(w) self._adjust_thread_count() return f - submit.__text_signature__ = _base.Executor.submit.__text_signature__ submit.__doc__ = _base.Executor.submit.__doc__ def _adjust_thread_count(self): @@ -209,7 +190,6 @@ class ThreadPoolExecutor(_base.Executor): self._work_queue, self._initializer, self._initargs)) - t.daemon = True t.start() self._threads.add(t) _threads_queues[t] = self._work_queue @@ -227,9 +207,22 @@ class ThreadPoolExecutor(_base.Executor): if work_item is not None: work_item.future.set_exception(BrokenThreadPool(self._broken)) - def shutdown(self, wait=True): + def shutdown(self, wait=True, *, cancel_futures=False): with self._shutdown_lock: self._shutdown = True + if cancel_futures: + # Drain all work items from the queue, and then cancel their + # associated futures. + while True: + try: + work_item = self._work_queue.get_nowait() + except queue.Empty: + break + if work_item is not None: + work_item.future.cancel() + + # Send a wake-up to prevent threads calling + # _work_queue.get(block=True) from permanently blocking. self._work_queue.put(None) if wait: for t in self._threads: diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 94dc2bfe..ff92d9f9 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -4,7 +4,7 @@ import sys import _collections_abc from collections import deque from functools import wraps -from types import MethodType +from types import MethodType, GenericAlias __all__ = ["asynccontextmanager", "contextmanager", "closing", "nullcontext", "AbstractContextManager", "AbstractAsyncContextManager", @@ -16,6 +16,8 @@ class AbstractContextManager(abc.ABC): """An abstract base class for context managers.""" + __class_getitem__ = classmethod(GenericAlias) + def __enter__(self): """Return `self` upon entering the runtime context.""" return self @@ -36,6 +38,8 @@ class AbstractAsyncContextManager(abc.ABC): """An abstract base class for asynchronous context managers.""" + __class_getitem__ = classmethod(GenericAlias) + async def __aenter__(self): """Return `self` upon entering the runtime context.""" return self @@ -426,26 +430,11 @@ class _BaseExitStack: self._push_cm_exit(cm, _exit) return result - def callback(*args, **kwds): + def callback(self, callback, /, *args, **kwds): """Registers an arbitrary callback and arguments. Cannot suppress exceptions. """ - if len(args) >= 2: - self, callback, *args = args - elif not args: - raise TypeError("descriptor 'callback' of '_BaseExitStack' object " - "needs an argument") - elif 'callback' in kwds: - callback = kwds.pop('callback') - self, *args = args - import warnings - warnings.warn("Passing 'callback' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('callback expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - _exit_wrapper = self._create_cb_wrapper(callback, *args, **kwds) # We changed the signature, so using @wraps is not appropriate, but @@ -453,7 +442,6 @@ class _BaseExitStack: _exit_wrapper.__wrapped__ = callback self._push_exit_callback(_exit_wrapper) return callback # Allow use as a decorator - callback.__text_signature__ = '($self, callback, /, *args, **kwds)' def _push_cm_exit(self, cm, cm_exit): """Helper to correctly register callbacks to __exit__ methods.""" @@ -587,26 +575,11 @@ class AsyncExitStack(_BaseExitStack, AbstractAsyncContextManager): self._push_async_cm_exit(exit, exit_method) return exit # Allow use as a decorator - def push_async_callback(*args, **kwds): + def push_async_callback(self, callback, /, *args, **kwds): """Registers an arbitrary coroutine function and arguments. Cannot suppress exceptions. """ - if len(args) >= 2: - self, callback, *args = args - elif not args: - raise TypeError("descriptor 'push_async_callback' of " - "'AsyncExitStack' object needs an argument") - elif 'callback' in kwds: - callback = kwds.pop('callback') - self, *args = args - import warnings - warnings.warn("Passing 'callback' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('push_async_callback expected at least 1 ' - 'positional argument, got %d' % (len(args)-1)) - _exit_wrapper = self._create_async_cb_wrapper(callback, *args, **kwds) # We changed the signature, so using @wraps is not appropriate, but @@ -614,7 +587,6 @@ class AsyncExitStack(_BaseExitStack, AbstractAsyncContextManager): _exit_wrapper.__wrapped__ = callback self._push_exit_callback(_exit_wrapper, False) return callback # Allow use as a decorator - push_async_callback.__text_signature__ = '($self, callback, /, *args, **kwds)' async def aclose(self): """Immediately unwind the context stack.""" diff --git a/Lib/crypt.py b/Lib/crypt.py index 8846602d..33dbc46b 100644 --- a/Lib/crypt.py +++ b/Lib/crypt.py @@ -10,6 +10,7 @@ except ModuleNotFoundError: else: raise ImportError("The required _crypt module was not built as part of CPython") +import errno import string as _string from random import SystemRandom as _SystemRandom from collections import namedtuple as _namedtuple @@ -88,7 +89,14 @@ def _add_method(name, *args, rounds=None): method = _Method(name, *args) globals()['METHOD_' + name] = method salt = mksalt(method, rounds=rounds) - result = crypt('', salt) + result = None + try: + result = crypt('', salt) + except OSError as e: + # Not all libc libraries support all encryption methods. + if e.errno == errno.EINVAL: + return False + raise if result and len(result) == method.total_size: methods.append(method) return True diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 8f099114..4afa4ebd 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -1,6 +1,7 @@ """create and manipulate C data types in Python""" import os as _os, sys as _sys +import types as _types __version__ = "1.1.0" @@ -450,6 +451,8 @@ class LibraryLoader(object): def LoadLibrary(self, name): return self._dlltype(name) + __class_getitem__ = classmethod(_types.GenericAlias) + cdll = LibraryLoader(CDLL) pydll = LibraryLoader(PyDLL) diff --git a/Lib/ctypes/test/test_loading.py b/Lib/ctypes/test/test_loading.py index 5c48b0db..ba655bce 100644 --- a/Lib/ctypes/test/test_loading.py +++ b/Lib/ctypes/test/test_loading.py @@ -3,7 +3,6 @@ import os import shutil import subprocess import sys -import sysconfig import unittest import test.support from ctypes.util import find_library diff --git a/Lib/ctypes/test/test_stringptr.py b/Lib/ctypes/test/test_stringptr.py index 95cd1614..c20951f4 100644 --- a/Lib/ctypes/test/test_stringptr.py +++ b/Lib/ctypes/test/test_stringptr.py @@ -70,8 +70,8 @@ class StringPtrTestCase(unittest.TestCase): x = r[0], r[1], r[2], r[3], r[4] self.assertEqual(x, (b"c", b"d", b"e", b"f", b"\000")) del buf - # x1 will NOT be the same as x, usually: - x1 = r[0], r[1], r[2], r[3], r[4] + # Because r is a pointer to memory that is freed after deleting buf, + # the pointer is hanging and using it would reference freed memory. if __name__ == '__main__': unittest.main() diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index cdbaa7fb..245cd94c 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -7,6 +7,11 @@ from struct import calcsize import _ctypes_test from test import support +# The following definition is meant to be used from time to time to assist +# temporarily disabling tests on specific architectures while investigations +# are in progress, to keep buildbots happy. +MACHINE = platform.machine() + class SubclassesTest(unittest.TestCase): def test_subclass(self): class X(Structure): diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 97973bce..01176bf9 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -302,7 +302,7 @@ elif os.name == "posix": res = re.search(expr, os.fsdecode(out)) if res: result = res.group(0) - except Exception as e: + except Exception: pass # result will be None return result diff --git a/Lib/curses/__init__.py b/Lib/curses/__init__.py index 24ff3ca9..69270bfc 100644 --- a/Lib/curses/__init__.py +++ b/Lib/curses/__init__.py @@ -60,7 +60,7 @@ except NameError: # raises an exception, wrapper() will restore the terminal to a sane state so # you can read the resulting traceback. -def wrapper(*args, **kwds): +def wrapper(func, /, *args, **kwds): """Wrapper function that initializes curses and calls another function, restoring normal keyboard/screen behavior on error. The callable object 'func' is then passed the main window 'stdscr' @@ -68,17 +68,6 @@ def wrapper(*args, **kwds): wrapper(). """ - if args: - func, *args = args - elif 'func' in kwds: - func = kwds.pop('func') - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('wrapper expected at least 1 positional argument, ' - 'got %d' % len(args)) - try: # Initialize curses stdscr = initscr() @@ -110,4 +99,3 @@ def wrapper(*args, **kwds): echo() nocbreak() endwin() -wrapper.__text_signature__ = '(func, /, *args, **kwds)' diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 10bb33e3..530d3e99 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -7,6 +7,7 @@ import keyword import builtins import functools import _thread +from types import GenericAlias __all__ = ['dataclass', @@ -199,11 +200,7 @@ _POST_INIT_NAME = '__post_init__' # https://bugs.python.org/issue33453 for details. _MODULE_IDENTIFIER_RE = re.compile(r'^(?:\s*(\w+)\s*\.)?\s*(\w+)') -class _InitVarMeta(type): - def __getitem__(self, params): - return InitVar(params) - -class InitVar(metaclass=_InitVarMeta): +class InitVar: __slots__ = ('type', ) def __init__(self, type): @@ -217,6 +214,9 @@ class InitVar(metaclass=_InitVarMeta): type_name = repr(self.type) return f'dataclasses.InitVar[{type_name}]' + def __class_getitem__(cls, type): + return InitVar(type) + # Instances of Field are only ever created from within this module, # and only from the field() function, although Field instances are @@ -285,6 +285,8 @@ class Field: # it. func(self.default, owner, name) + __class_getitem__ = classmethod(GenericAlias) + class _DataclassParams: __slots__ = ('init', @@ -1231,7 +1233,7 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, unsafe_hash=unsafe_hash, frozen=frozen) -def replace(*args, **changes): +def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for frozen classes. Example usage: @@ -1245,17 +1247,6 @@ def replace(*args, **changes): c1 = replace(c, x=3) assert c1.x == 3 and c1.y == 2 """ - if len(args) > 1: - raise TypeError(f'replace() takes 1 positional argument but {len(args)} were given') - if args: - obj, = args - elif 'obj' in changes: - obj = changes.pop('obj') - import warnings - warnings.warn("Passing 'obj' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError("replace() missing 1 required positional argument: 'obj'") # We're going to mutate 'changes', but that's okay because it's a # new dict, even if called with 'replace(obj, **my_changes)'. @@ -1291,4 +1282,3 @@ def replace(*args, **changes): # changes that aren't fields, this will correctly raise a # TypeError. return obj.__class__(**changes) -replace.__text_signature__ = '(obj, /, **kwargs)' diff --git a/Lib/datetime.py b/Lib/datetime.py index 0adf1dd6..2294ac2b 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -4,6 +4,10 @@ See http://www.iana.org/time-zones/repository/tz-link.html for time zone and DST data sources. """ +__all__ = ("date", "datetime", "time", "timedelta", "timezone", "tzinfo", + "MINYEAR", "MAXYEAR") + + import time as _time import math as _math import sys @@ -1091,7 +1095,7 @@ class date: return self.toordinal() % 7 or 7 def isocalendar(self): - """Return a 3-tuple containing ISO year, week number, and weekday. + """Return a named tuple containing ISO year, week number, and weekday. The first ISO week of the year is the (Mon-Sun) week containing the year's first Thursday; everything else derives @@ -1116,7 +1120,7 @@ class date: if today >= _isoweek1monday(year+1): year += 1 week = 0 - return year, week+1, day+1 + return _IsoCalendarDate(year, week+1, day+1) # Pickle support. @@ -1206,6 +1210,36 @@ class tzinfo: else: return (self.__class__, args, state) + +class IsoCalendarDate(tuple): + + def __new__(cls, year, week, weekday, /): + return super().__new__(cls, (year, week, weekday)) + + @property + def year(self): + return self[0] + + @property + def week(self): + return self[1] + + @property + def weekday(self): + return self[2] + + def __reduce__(self): + # This code is intended to pickle the object without making the + # class public. See https://bugs.python.org/msg352381 + return (tuple, (tuple(self),)) + + def __repr__(self): + return (f'{self.__class__.__name__}' + f'(year={self[0]}, week={self[1]}, weekday={self[2]})') + + +_IsoCalendarDate = IsoCalendarDate +del IsoCalendarDate _tzinfo_class = tzinfo class time: @@ -1418,7 +1452,8 @@ class time: part is omitted if self.microsecond == 0. The optional argument timespec specifies the number of additional - terms of the time to include. + terms of the time to include. Valid options are 'auto', 'hours', + 'minutes', 'seconds', 'milliseconds' and 'microseconds'. """ s = _format_time(self._hour, self._minute, self._second, self._microsecond, timespec) @@ -1555,6 +1590,7 @@ time.min = time(0, 0, 0) time.max = time(23, 59, 59, 999999) time.resolution = timedelta(microseconds=1) + class datetime(date): """datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]) @@ -1902,7 +1938,8 @@ class datetime(date): time, default 'T'. The optional argument timespec specifies the number of additional - terms of the time to include. + terms of the time to include. Valid options are 'auto', 'hours', + 'minutes', 'seconds', 'milliseconds' and 'microseconds'. """ s = ("%04d-%02d-%02d%c" % (self._year, self._month, self._day, sep) + _format_time(self._hour, self._minute, self._second, @@ -2510,7 +2547,7 @@ else: _format_time, _format_offset, _is_leap, _isoweek1monday, _math, _ord2ymd, _time, _time_class, _tzinfo_class, _wrap_strftime, _ymd2ord, _divide_and_round, _parse_isoformat_date, _parse_isoformat_time, - _parse_hh_mm_ss_ff) + _parse_hh_mm_ss_ff, _IsoCalendarDate) # XXX Since import * above excludes names that start with _, # docstring does not get overwritten. In the future, it may be # appropriate to maintain a single module level docstring and diff --git a/Lib/difflib.py b/Lib/difflib.py index 5d756436..0dda80d3 100644 --- a/Lib/difflib.py +++ b/Lib/difflib.py @@ -32,6 +32,7 @@ __all__ = ['get_close_matches', 'ndiff', 'restore', 'SequenceMatcher', from heapq import nlargest as _nlargest from collections import namedtuple as _namedtuple +from types import GenericAlias Match = _namedtuple('Match', 'a b size') @@ -129,7 +130,7 @@ class SequenceMatcher: set_seq2(b) Set the second sequence to be compared. - find_longest_match(alo, ahi, blo, bhi) + find_longest_match(alo=0, ahi=None, blo=0, bhi=None) Find longest matching block in a[alo:ahi] and b[blo:bhi]. get_matching_blocks() @@ -333,9 +334,11 @@ class SequenceMatcher: for elt in popular: # ditto; as fast for 1% deletion del b2j[elt] - def find_longest_match(self, alo, ahi, blo, bhi): + def find_longest_match(self, alo=0, ahi=None, blo=0, bhi=None): """Find longest matching block in a[alo:ahi] and b[blo:bhi]. + By default it will find the longest match in the entirety of a and b. + If isjunk is not defined: Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where @@ -390,6 +393,10 @@ class SequenceMatcher: # the unique 'b's and then matching the first two 'a's. a, b, b2j, isbjunk = self.a, self.b, self.b2j, self.bjunk.__contains__ + if ahi is None: + ahi = len(a) + if bhi is None: + bhi = len(b) besti, bestj, bestsize = alo, blo, 0 # find longest junk-free match # during an iteration of the loop, j2len[j] = length of longest @@ -685,6 +692,9 @@ class SequenceMatcher: # shorter sequence return _calculate_ratio(min(la, lb), la + lb) + __class_getitem__ = classmethod(GenericAlias) + + def get_close_matches(word, possibilities, n=3, cutoff=0.6): """Use SequenceMatcher to return list of the best "good enough" matches. diff --git a/Lib/distutils/_msvccompiler.py b/Lib/distutils/_msvccompiler.py index 03a5986d..af8099a4 100644 --- a/Lib/distutils/_msvccompiler.py +++ b/Lib/distutils/_msvccompiler.py @@ -14,8 +14,6 @@ for older versions in distutils.msvc9compiler and distutils.msvccompiler. # ported to VS 2015 by Steve Dower import os -import shutil -import stat import subprocess import winreg @@ -65,8 +63,6 @@ def _find_vc2017(): If vswhere.exe is not available, by definition, VS 2017 is not installed. """ - import json - root = os.environ.get("ProgramFiles(x86)") or os.environ.get("ProgramFiles") if not root: return None, None diff --git a/Lib/distutils/bcppcompiler.py b/Lib/distutils/bcppcompiler.py index 9f4c432d..071fea5d 100644 --- a/Lib/distutils/bcppcompiler.py +++ b/Lib/distutils/bcppcompiler.py @@ -14,10 +14,10 @@ for the Borland C++ compiler. import os from distutils.errors import \ - DistutilsExecError, DistutilsPlatformError, \ + DistutilsExecError, \ CompileError, LibError, LinkError, UnknownFileError from distutils.ccompiler import \ - CCompiler, gen_preprocess_options, gen_lib_options + CCompiler, gen_preprocess_options from distutils.file_util import write_file from distutils.dep_util import newer from distutils import log diff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py index 4cfc6c70..b5ef143e 100644 --- a/Lib/distutils/ccompiler.py +++ b/Lib/distutils/ccompiler.py @@ -8,7 +8,7 @@ from distutils.errors import * from distutils.spawn import spawn from distutils.file_util import move_file from distutils.dir_util import mkpath -from distutils.dep_util import newer_pairwise, newer_group +from distutils.dep_util import newer_group from distutils.util import split_quoted, execute from distutils import log diff --git a/Lib/distutils/command/bdist_msi.py b/Lib/distutils/command/bdist_msi.py index f335a348..0863a188 100644 --- a/Lib/distutils/command/bdist_msi.py +++ b/Lib/distutils/command/bdist_msi.py @@ -6,7 +6,9 @@ Implements the bdist_msi command. """ -import sys, os +import os +import sys +import warnings from distutils.core import Command from distutils.dir_util import remove_tree from distutils.sysconfig import get_python_version @@ -122,6 +124,12 @@ class bdist_msi(Command): '3.5', '3.6', '3.7', '3.8', '3.9'] other_version = 'X' + def __init__(self, *args, **kw): + super().__init__(*args, **kw) + warnings.warn("bdist_msi command is deprecated since Python 3.9, " + "use bdist_wheel (wheel packages) instead", + DeprecationWarning, 2) + def initialize_options(self): self.bdist_dir = None self.plat_name = None diff --git a/Lib/distutils/command/bdist_rpm.py b/Lib/distutils/command/bdist_rpm.py index 74381cc6..550cbfa1 100644 --- a/Lib/distutils/command/bdist_rpm.py +++ b/Lib/distutils/command/bdist_rpm.py @@ -6,7 +6,6 @@ distributions).""" import subprocess, sys, os from distutils.core import Command from distutils.debug import DEBUG -from distutils.util import get_platform from distutils.file_util import write_file from distutils.errors import * from distutils.sysconfig import get_python_version diff --git a/Lib/distutils/command/bdist_wininst.py b/Lib/distutils/command/bdist_wininst.py index b5ed6f04..0e9ddaa2 100644 --- a/Lib/distutils/command/bdist_wininst.py +++ b/Lib/distutils/command/bdist_wininst.py @@ -8,7 +8,7 @@ import sys import warnings from distutils.core import Command from distutils.util import get_platform -from distutils.dir_util import create_tree, remove_tree +from distutils.dir_util import remove_tree from distutils.errors import * from distutils.sysconfig import get_python_version from distutils import log diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index dbcd9d16..1a9bd120 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -490,7 +490,8 @@ class build_ext(Command): "in 'ext_modules' option (extension '%s'), " "'sources' must be present and must be " "a list of source filenames" % ext.name) - sources = list(sources) + # sort to make the resulting .so file build reproducible + sources = sorted(sources) ext_path = self.get_ext_fullpath(ext.name) depends = sources + ext.depends diff --git a/Lib/distutils/command/check.py b/Lib/distutils/command/check.py index 04c2f964..ada25006 100644 --- a/Lib/distutils/command/check.py +++ b/Lib/distutils/command/check.py @@ -11,7 +11,6 @@ try: from docutils.parsers.rst import Parser from docutils import frontend from docutils import nodes - from io import StringIO class SilentReporter(Reporter): @@ -80,8 +79,11 @@ class check(Command): def check_metadata(self): """Ensures that all required elements of meta-data are supplied. - name, version, URL, (author and author_email) or - (maintainer and maintainer_email)). + Required fields: + name, version, URL + + Recommended fields: + (author and author_email) or (maintainer and maintainer_email)) Warns if any are missing. """ @@ -97,15 +99,15 @@ class check(Command): if metadata.author: if not metadata.author_email: self.warn("missing meta-data: if 'author' supplied, " + - "'author_email' must be supplied too") + "'author_email' should be supplied too") elif metadata.maintainer: if not metadata.maintainer_email: self.warn("missing meta-data: if 'maintainer' supplied, " + - "'maintainer_email' must be supplied too") + "'maintainer_email' should be supplied too") else: self.warn("missing meta-data: either (author and author_email) " + "or (maintainer and maintainer_email) " + - "must be supplied") + "should be supplied") def check_restructuredtext(self): """Checks if the long string fields are reST-compliant.""" diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py index c625c95b..aaa300ef 100644 --- a/Lib/distutils/command/install.py +++ b/Lib/distutils/command/install.py @@ -30,14 +30,14 @@ WINDOWS_SCHEME = { INSTALL_SCHEMES = { 'unix_prefix': { 'purelib': '$base/lib/python$py_version_short/site-packages', - 'platlib': '$platbase/lib/python$py_version_short/site-packages', + 'platlib': '$platbase/$platlibdir/python$py_version_short/site-packages', 'headers': '$base/include/python$py_version_short$abiflags/$dist_name', 'scripts': '$base/bin', 'data' : '$base', }, 'unix_home': { 'purelib': '$base/lib/python', - 'platlib': '$base/lib/python', + 'platlib': '$base/$platlibdir/python', 'headers': '$base/include/python/$dist_name', 'scripts': '$base/bin', 'data' : '$base', @@ -298,6 +298,7 @@ class install(Command): 'sys_exec_prefix': exec_prefix, 'exec_prefix': exec_prefix, 'abiflags': abiflags, + 'platlibdir': sys.platlibdir, } if HAS_USER_SITE: diff --git a/Lib/distutils/command/upload.py b/Lib/distutils/command/upload.py index 11afa24b..95e9fda1 100644 --- a/Lib/distutils/command/upload.py +++ b/Lib/distutils/command/upload.py @@ -7,7 +7,6 @@ index). import os import io -import platform import hashlib from base64 import standard_b64encode from urllib.request import urlopen, Request, HTTPError @@ -17,6 +16,16 @@ from distutils.core import PyPIRCCommand from distutils.spawn import spawn from distutils import log + +# PyPI Warehouse supports MD5, SHA256, and Blake2 (blake2-256) +# https://bugs.python.org/issue40698 +_FILE_CONTENT_DIGESTS = { + "md5_digest": getattr(hashlib, "md5", None), + "sha256_digest": getattr(hashlib, "sha256", None), + "blake2_256_digest": getattr(hashlib, "blake2b", None), +} + + class upload(PyPIRCCommand): description = "upload binary package to PyPI" @@ -88,6 +97,7 @@ class upload(PyPIRCCommand): content = f.read() finally: f.close() + meta = self.distribution.metadata data = { # action @@ -102,7 +112,6 @@ class upload(PyPIRCCommand): 'content': (os.path.basename(filename),content), 'filetype': command, 'pyversion': pyversion, - 'md5_digest': hashlib.md5(content).hexdigest(), # additional meta-data 'metadata_version': '1.0', @@ -124,6 +133,16 @@ class upload(PyPIRCCommand): data['comment'] = '' + # file content digests + for digest_name, digest_cons in _FILE_CONTENT_DIGESTS.items(): + if digest_cons is None: + continue + try: + data[digest_name] = digest_cons(content).hexdigest() + except ValueError: + # hash digest not available or blocked by security policy + pass + if self.sign: with open(filename + ".asc", "rb") as f: data['gpg_signature'] = (os.path.basename(filename) + ".asc", diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index 6c5d7774..66c12dd3 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -51,12 +51,10 @@ import copy from subprocess import Popen, PIPE, check_output import re -from distutils.ccompiler import gen_preprocess_options, gen_lib_options from distutils.unixccompiler import UnixCCompiler from distutils.file_util import write_file from distutils.errors import (DistutilsExecError, CCompilerError, CompileError, UnknownFileError) -from distutils import log from distutils.version import LooseVersion from distutils.spawn import find_executable diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py index 4c0036a0..6934e964 100644 --- a/Lib/distutils/msvc9compiler.py +++ b/Lib/distutils/msvc9compiler.py @@ -19,8 +19,7 @@ import re from distutils.errors import DistutilsExecError, DistutilsPlatformError, \ CompileError, LibError, LinkError -from distutils.ccompiler import CCompiler, gen_preprocess_options, \ - gen_lib_options +from distutils.ccompiler import CCompiler, gen_lib_options from distutils import log from distutils.util import get_platform diff --git a/Lib/distutils/msvccompiler.py b/Lib/distutils/msvccompiler.py index d1de2fbf..d5857cb1 100644 --- a/Lib/distutils/msvccompiler.py +++ b/Lib/distutils/msvccompiler.py @@ -13,7 +13,7 @@ from distutils.errors import \ DistutilsExecError, DistutilsPlatformError, \ CompileError, LibError, LinkError from distutils.ccompiler import \ - CCompiler, gen_preprocess_options, gen_lib_options + CCompiler, gen_lib_options from distutils import log _can_read_reg = False diff --git a/Lib/distutils/spawn.py b/Lib/distutils/spawn.py index ceb94945..0d1bd039 100644 --- a/Lib/distutils/spawn.py +++ b/Lib/distutils/spawn.py @@ -8,11 +8,18 @@ executable name. import sys import os +import subprocess from distutils.errors import DistutilsPlatformError, DistutilsExecError from distutils.debug import DEBUG from distutils import log + +if sys.platform == 'darwin': + _cfg_target = None + _cfg_target_split = None + + def spawn(cmd, search_path=1, verbose=0, dry_run=0): """Run another program, specified as a command list 'cmd', in a new process. @@ -32,64 +39,16 @@ def spawn(cmd, search_path=1, verbose=0, dry_run=0): # cmd is documented as a list, but just in case some code passes a tuple # in, protect our %-formatting code against horrible death cmd = list(cmd) - if os.name == 'posix': - _spawn_posix(cmd, search_path, dry_run=dry_run) - elif os.name == 'nt': - _spawn_nt(cmd, search_path, dry_run=dry_run) - else: - raise DistutilsPlatformError( - "don't know how to spawn programs on platform '%s'" % os.name) - -def _nt_quote_args(args): - """Quote command-line arguments for DOS/Windows conventions. - - Just wraps every argument which contains blanks in double quotes, and - returns a new argument list. - """ - # XXX this doesn't seem very robust to me -- but if the Windows guys - # say it'll work, I guess I'll have to accept it. (What if an arg - # contains quotes? What other magic characters, other than spaces, - # have to be escaped? Is there an escaping mechanism other than - # quoting?) - for i, arg in enumerate(args): - if ' ' in arg: - args[i] = '"%s"' % arg - return args - -def _spawn_nt(cmd, search_path=1, verbose=0, dry_run=0): - executable = cmd[0] - cmd = _nt_quote_args(cmd) - if search_path: - # either we find one or it stays the same - executable = find_executable(executable) or executable - log.info(' '.join([executable] + cmd[1:])) - if not dry_run: - # spawn for NT requires a full path to the .exe - try: - rc = os.spawnv(os.P_WAIT, executable, cmd) - except OSError as exc: - # this seems to happen when the command isn't found - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "command %r failed: %s" % (cmd, exc.args[-1])) - if rc != 0: - # and this reflects the command running but failing - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "command %r failed with exit status %d" % (cmd, rc)) -if sys.platform == 'darwin': - _cfg_target = None - _cfg_target_split = None - -def _spawn_posix(cmd, search_path=1, verbose=0, dry_run=0): log.info(' '.join(cmd)) if dry_run: return - executable = cmd[0] - exec_fn = search_path and os.execvp or os.execv + + if search_path: + executable = find_executable(cmd[0]) + if executable is not None: + cmd[0] = executable + env = None if sys.platform == 'darwin': global _cfg_target, _cfg_target_split @@ -111,60 +70,23 @@ def _spawn_posix(cmd, search_path=1, verbose=0, dry_run=0): raise DistutilsPlatformError(my_msg) env = dict(os.environ, MACOSX_DEPLOYMENT_TARGET=cur_target) - exec_fn = search_path and os.execvpe or os.execve - pid = os.fork() - if pid == 0: # in the child - try: - if env is None: - exec_fn(executable, cmd) - else: - exec_fn(executable, cmd, env) - except OSError as e: - if not DEBUG: - cmd = executable - sys.stderr.write("unable to execute %r: %s\n" - % (cmd, e.strerror)) - os._exit(1) + try: + proc = subprocess.Popen(cmd, env=env) + proc.wait() + exitcode = proc.returncode + except OSError as exc: if not DEBUG: - cmd = executable - sys.stderr.write("unable to execute %r for unknown reasons" % cmd) - os._exit(1) - else: # in the parent - # Loop until the child either exits or is terminated by a signal - # (ie. keep waiting if it's merely stopped) - while True: - try: - pid, status = os.waitpid(pid, 0) - except OSError as exc: - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "command %r failed: %s" % (cmd, exc.args[-1])) - if os.WIFSIGNALED(status): - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "command %r terminated by signal %d" - % (cmd, os.WTERMSIG(status))) - elif os.WIFEXITED(status): - exit_status = os.WEXITSTATUS(status) - if exit_status == 0: - return # hey, it succeeded! - else: - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "command %r failed with exit status %d" - % (cmd, exit_status)) - elif os.WIFSTOPPED(status): - continue - else: - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "unknown error executing %r: termination status %d" - % (cmd, status)) + cmd = cmd[0] + raise DistutilsExecError( + "command %r failed: %s" % (cmd, exc.args[-1])) from exc + + if exitcode: + if not DEBUG: + cmd = cmd[0] + raise DistutilsExecError( + "command %r failed with exit code %s" % (cmd, exitcode)) + def find_executable(executable, path=None): """Tries to find 'executable' in the directories listed in 'path'. diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index b51629eb..37feae5d 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -15,7 +15,6 @@ import re import sys from .errors import DistutilsPlatformError -from .util import get_platform, get_host_platform # These are needed in a couple of spots, so just compute them once. PREFIX = os.path.normpath(sys.prefix) @@ -146,8 +145,15 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None): prefix = plat_specific and EXEC_PREFIX or PREFIX if os.name == "posix": - libpython = os.path.join(prefix, - "lib", "python" + get_python_version()) + if plat_specific or standard_lib: + # Platform-specific modules (any module from a non-pure-Python + # module distribution) or standard Python library modules. + libdir = sys.platlibdir + else: + # Pure Python + libdir = "lib" + libpython = os.path.join(prefix, libdir, + "python" + get_python_version()) if standard_lib: return libpython else: diff --git a/Lib/distutils/tests/support.py b/Lib/distutils/tests/support.py index 04130985..259af882 100644 --- a/Lib/distutils/tests/support.py +++ b/Lib/distutils/tests/support.py @@ -39,8 +39,6 @@ class LoggingSilencer(object): self.logs.append((level, msg, args)) def get_logs(self, *levels): - def _format(msg, args): - return msg % args return [msg % args for level, msg, args in self.logs if level in levels] diff --git a/Lib/distutils/tests/test_bdist_msi.py b/Lib/distutils/tests/test_bdist_msi.py index 15d8bdff..418e60ec 100644 --- a/Lib/distutils/tests/test_bdist_msi.py +++ b/Lib/distutils/tests/test_bdist_msi.py @@ -1,7 +1,7 @@ """Tests for distutils.command.bdist_msi.""" import sys import unittest -from test.support import run_unittest +from test.support import run_unittest, check_warnings from distutils.tests import support @@ -14,7 +14,8 @@ class BDistMSITestCase(support.TempdirManager, # minimal test XXX need more tests from distutils.command.bdist_msi import bdist_msi project_dir, dist = self.create_dist() - cmd = bdist_msi(dist) + with check_warnings(("", DeprecationWarning)): + cmd = bdist_msi(dist) cmd.ensure_finalized() diff --git a/Lib/distutils/tests/test_build_clib.py b/Lib/distutils/tests/test_build_clib.py index 85d09906..abd83137 100644 --- a/Lib/distutils/tests/test_build_clib.py +++ b/Lib/distutils/tests/test_build_clib.py @@ -8,7 +8,6 @@ from test.support import run_unittest, missing_compiler_executable from distutils.command.build_clib import build_clib from distutils.errors import DistutilsSetupError from distutils.tests import support -from distutils.spawn import find_executable class BuildCLibTestCase(support.TempdirManager, support.LoggingSilencer, diff --git a/Lib/distutils/tests/test_config_cmd.py b/Lib/distutils/tests/test_config_cmd.py index 8bd2c942..9aeab07b 100644 --- a/Lib/distutils/tests/test_config_cmd.py +++ b/Lib/distutils/tests/test_config_cmd.py @@ -39,7 +39,6 @@ class ConfigTestCase(support.LoggingSilencer, @unittest.skipIf(sys.platform == 'win32', "can't test on Windows") def test_search_cpp(self): - import shutil cmd = missing_compiler_executable(['preprocessor']) if cmd is not None: self.skipTest('The %r command is not found' % cmd) diff --git a/Lib/distutils/tests/test_dist.py b/Lib/distutils/tests/test_dist.py index cc34725a..60956dad 100644 --- a/Lib/distutils/tests/test_dist.py +++ b/Lib/distutils/tests/test_dist.py @@ -8,7 +8,7 @@ import textwrap from unittest import mock -from distutils.dist import Distribution, fix_help_options, DistributionMetadata +from distutils.dist import Distribution, fix_help_options from distutils.cmd import Command from test.support import ( diff --git a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py index 287ab198..51c80e04 100644 --- a/Lib/distutils/tests/test_install.py +++ b/Lib/distutils/tests/test_install.py @@ -58,7 +58,8 @@ class InstallTestCase(support.TempdirManager, libdir = os.path.join(destination, "lib", "python") check_path(cmd.install_lib, libdir) - check_path(cmd.install_platlib, libdir) + platlibdir = os.path.join(destination, sys.platlibdir, "python") + check_path(cmd.install_platlib, platlibdir) check_path(cmd.install_purelib, libdir) check_path(cmd.install_headers, os.path.join(destination, "include", "python", "foopkg")) diff --git a/Lib/distutils/tests/test_spawn.py b/Lib/distutils/tests/test_spawn.py index f9ae69ef..ad503814 100644 --- a/Lib/distutils/tests/test_spawn.py +++ b/Lib/distutils/tests/test_spawn.py @@ -2,13 +2,11 @@ import os import stat import sys -import unittest -from unittest import mock +import unittest.mock from test.support import run_unittest, unix_shell from test import support as test_support from distutils.spawn import find_executable -from distutils.spawn import _nt_quote_args from distutils.spawn import spawn from distutils.errors import DistutilsExecError from distutils.tests import support @@ -17,16 +15,6 @@ class SpawnTestCase(support.TempdirManager, support.LoggingSilencer, unittest.TestCase): - def test_nt_quote_args(self): - - for (args, wanted) in ((['with space', 'nospace'], - ['"with space"', 'nospace']), - (['nochange', 'nospace'], - ['nochange', 'nospace'])): - res = _nt_quote_args(args) - self.assertEqual(res, wanted) - - @unittest.skipUnless(os.name in ('nt', 'posix'), 'Runs only under posix or nt') def test_spawn(self): @@ -136,6 +124,11 @@ class SpawnTestCase(support.TempdirManager, rv = find_executable(program) self.assertEqual(rv, filename) + def test_spawn_missing_exe(self): + with self.assertRaises(DistutilsExecError) as ctx: + spawn(['does-not-exist']) + self.assertIn("command 'does-not-exist' failed", str(ctx.exception)) + def test_suite(): return unittest.makeSuite(SpawnTestCase) diff --git a/Lib/distutils/tests/test_upload.py b/Lib/distutils/tests/test_upload.py index c17d8e7d..bca5516d 100644 --- a/Lib/distutils/tests/test_upload.py +++ b/Lib/distutils/tests/test_upload.py @@ -130,14 +130,30 @@ class uploadTestCase(BasePyPIRCCommandTestCase): # what did we send ? headers = dict(self.last_open.req.headers) - self.assertEqual(headers['Content-length'], '2162') + self.assertGreaterEqual(int(headers['Content-length']), 2162) content_type = headers['Content-type'] self.assertTrue(content_type.startswith('multipart/form-data')) self.assertEqual(self.last_open.req.get_method(), 'POST') expected_url = 'https://upload.pypi.org/legacy/' self.assertEqual(self.last_open.req.get_full_url(), expected_url) - self.assertTrue(b'xxx' in self.last_open.req.data) - self.assertIn(b'protocol_version', self.last_open.req.data) + data = self.last_open.req.data + self.assertIn(b'xxx',data) + self.assertIn(b'protocol_version', data) + self.assertIn(b'sha256_digest', data) + self.assertIn( + b'cd2eb0837c9b4c962c22d2ff8b5441b7b45805887f051d39bf133b583baf' + b'6860', + data + ) + if b'md5_digest' in data: + self.assertIn(b'f561aaf6ef0bf14d4208bb46a4ccb3ad', data) + if b'blake2_256_digest' in data: + self.assertIn( + b'b6f289a27d4fe90da63c503bfe0a9b761a8f76bb86148565065f040be' + b'6d1c3044cf7ded78ef800509bccb4b648e507d88dc6383d67642aadcc' + b'ce443f1534330a', + data + ) # The PyPI response body was echoed results = self.get_logs(INFO) @@ -166,7 +182,7 @@ class uploadTestCase(BasePyPIRCCommandTestCase): cmd.run() headers = dict(self.last_open.req.headers) - self.assertEqual(headers['Content-length'], '2172') + self.assertGreaterEqual(int(headers['Content-length']), 2172) self.assertIn(b'long description\r', self.last_open.req.data) def test_upload_fails(self): diff --git a/Lib/distutils/tests/test_version.py b/Lib/distutils/tests/test_version.py index 15f14c7d..8671cd2f 100644 --- a/Lib/distutils/tests/test_version.py +++ b/Lib/distutils/tests/test_version.py @@ -45,6 +45,14 @@ class VersionTestCase(unittest.TestCase): self.assertEqual(res, wanted, 'cmp(%s, %s) should be %s, got %s' % (v1, v2, wanted, res)) + res = StrictVersion(v1)._cmp(v2) + self.assertEqual(res, wanted, + 'cmp(%s, %s) should be %s, got %s' % + (v1, v2, wanted, res)) + res = StrictVersion(v1)._cmp(object()) + self.assertIs(res, NotImplemented, + 'cmp(%s, %s) should be NotImplemented, got %s' % + (v1, v2, res)) def test_cmp(self): @@ -63,6 +71,14 @@ class VersionTestCase(unittest.TestCase): self.assertEqual(res, wanted, 'cmp(%s, %s) should be %s, got %s' % (v1, v2, wanted, res)) + res = LooseVersion(v1)._cmp(v2) + self.assertEqual(res, wanted, + 'cmp(%s, %s) should be %s, got %s' % + (v1, v2, wanted, res)) + res = LooseVersion(v1)._cmp(object()) + self.assertIs(res, NotImplemented, + 'cmp(%s, %s) should be NotImplemented, got %s' % + (v1, v2, res)) def test_suite(): return unittest.makeSuite(VersionTestCase) diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py index 17a94bc4..4b002ece 100644 --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -79,7 +79,8 @@ def get_host_platform(): machine += ".%s" % bitness[sys.maxsize] # fall through to standard osname-release-machine representation elif osname[:3] == "aix": - return "%s-%s.%s" % (osname, version, release) + from _aix_support import aix_platform + return aix_platform() elif osname[:6] == "cygwin": osname = "cygwin" rel_re = re.compile (r'[\d.]+', re.ASCII) diff --git a/Lib/distutils/version.py b/Lib/distutils/version.py index af14cc13..c33bebae 100644 --- a/Lib/distutils/version.py +++ b/Lib/distutils/version.py @@ -166,6 +166,8 @@ class StrictVersion (Version): def _cmp (self, other): if isinstance(other, str): other = StrictVersion(other) + elif not isinstance(other, StrictVersion): + return NotImplemented if self.version != other.version: # numeric versions don't match @@ -331,6 +333,8 @@ class LooseVersion (Version): def _cmp (self, other): if isinstance(other, str): other = LooseVersion(other) + elif not isinstance(other, LooseVersion): + return NotImplemented if self.version == other.version: return 0 diff --git a/Lib/doctest.py b/Lib/doctest.py index ee71984a..baa503c8 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1334,7 +1334,7 @@ class DocTestRunner: try: # Don't blink! This is where the user's code gets run. exec(compile(example.source, filename, "single", - compileflags, 1), test.globs) + compileflags, True), test.globs) self.debugger.set_continue() # ==== Example Finished ==== exception = None except KeyboardInterrupt: diff --git a/Lib/dummy_threading.py b/Lib/dummy_threading.py deleted file mode 100644 index 1bb7eee3..00000000 --- a/Lib/dummy_threading.py +++ /dev/null @@ -1,78 +0,0 @@ -"""Faux ``threading`` version using ``dummy_thread`` instead of ``thread``. - -The module ``_dummy_threading`` is added to ``sys.modules`` in order -to not have ``threading`` considered imported. Had ``threading`` been -directly imported it would have made all subsequent imports succeed -regardless of whether ``_thread`` was available which is not desired. - -""" -from sys import modules as sys_modules - -import _dummy_thread - -# Declaring now so as to not have to nest ``try``s to get proper clean-up. -holding_thread = False -holding_threading = False -holding__threading_local = False - -try: - # Could have checked if ``_thread`` was not in sys.modules and gone - # a different route, but decided to mirror technique used with - # ``threading`` below. - if '_thread' in sys_modules: - held_thread = sys_modules['_thread'] - holding_thread = True - # Must have some module named ``_thread`` that implements its API - # in order to initially import ``threading``. - sys_modules['_thread'] = sys_modules['_dummy_thread'] - - if 'threading' in sys_modules: - # If ``threading`` is already imported, might as well prevent - # trying to import it more than needed by saving it if it is - # already imported before deleting it. - held_threading = sys_modules['threading'] - holding_threading = True - del sys_modules['threading'] - - if '_threading_local' in sys_modules: - # If ``_threading_local`` is already imported, might as well prevent - # trying to import it more than needed by saving it if it is - # already imported before deleting it. - held__threading_local = sys_modules['_threading_local'] - holding__threading_local = True - del sys_modules['_threading_local'] - - import threading - # Need a copy of the code kept somewhere... - sys_modules['_dummy_threading'] = sys_modules['threading'] - del sys_modules['threading'] - sys_modules['_dummy__threading_local'] = sys_modules['_threading_local'] - del sys_modules['_threading_local'] - from _dummy_threading import * - from _dummy_threading import __all__ - -finally: - # Put back ``threading`` if we overwrote earlier - - if holding_threading: - sys_modules['threading'] = held_threading - del held_threading - del holding_threading - - # Put back ``_threading_local`` if we overwrote earlier - - if holding__threading_local: - sys_modules['_threading_local'] = held__threading_local - del held__threading_local - del holding__threading_local - - # Put back ``thread`` if we overwrote, else del the entry we made - if holding_thread: - sys_modules['_thread'] = held_thread - del held_thread - else: - del sys_modules['_thread'] - del holding_thread - - del _dummy_thread - del sys_modules diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py index d0914fd1..5d84fc0d 100644 --- a/Lib/email/headerregistry.py +++ b/Lib/email/headerregistry.py @@ -74,11 +74,9 @@ class Address: """The addr_spec (username@domain) portion of the address, quoted according to RFC 5322 rules, but with no Content Transfer Encoding. """ - nameset = set(self.username) - if len(nameset) > len(nameset-parser.DOT_ATOM_ENDS): - lp = parser.quote_string(self.username) - else: - lp = self.username + lp = self.username + if not parser.DOT_ATOM_ENDS.isdisjoint(lp): + lp = parser.quote_string(lp) if self.domain: return lp + '@' + self.domain if not lp: @@ -91,19 +89,17 @@ class Address: self.display_name, self.username, self.domain) def __str__(self): - nameset = set(self.display_name) - if len(nameset) > len(nameset-parser.SPECIALS): - disp = parser.quote_string(self.display_name) - else: - disp = self.display_name + disp = self.display_name + if not parser.SPECIALS.isdisjoint(disp): + disp = parser.quote_string(disp) if disp: addr_spec = '' if self.addr_spec=='<>' else self.addr_spec return "{} <{}>".format(disp, addr_spec) return self.addr_spec def __eq__(self, other): - if type(other) != type(self): - return False + if not isinstance(other, Address): + return NotImplemented return (self.display_name == other.display_name and self.username == other.username and self.domain == other.domain) @@ -146,17 +142,15 @@ class Group: if self.display_name is None and len(self.addresses)==1: return str(self.addresses[0]) disp = self.display_name - if disp is not None: - nameset = set(disp) - if len(nameset) > len(nameset-parser.SPECIALS): - disp = parser.quote_string(disp) + if disp is not None and not parser.SPECIALS.isdisjoint(disp): + disp = parser.quote_string(disp) adrstr = ", ".join(str(x) for x in self.addresses) adrstr = ' ' + adrstr if adrstr else adrstr return "{}:{};".format(disp, adrstr) def __eq__(self, other): - if type(other) != type(self): - return False + if not isinstance(other, Group): + return NotImplemented return (self.display_name == other.display_name and self.addresses == other.addresses) diff --git a/Lib/email/message.py b/Lib/email/message.py index 12626026..3701b305 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -141,7 +141,7 @@ class Message: header. For backward compatibility reasons, if maxheaderlen is not specified it defaults to 0, so you must override it explicitly if you want a different maxheaderlen. 'policy' is passed to the - Generator instance used to serialize the mesasge; if it is not + Generator instance used to serialize the message; if it is not specified the policy associated with the message instance is used. If the message object contains binary data that is not encoded @@ -958,7 +958,7 @@ class MIMEPart(Message): header. maxheaderlen is retained for backward compatibility with the base Message class, but defaults to None, meaning that the policy value for max_line_length controls the header maximum length. 'policy' is - passed to the Generator instance used to serialize the mesasge; if it + passed to the Generator instance used to serialize the message; if it is not specified the policy associated with the message instance is used. """ diff --git a/Lib/email/utils.py b/Lib/email/utils.py index 07dd029c..1a7719db 100644 --- a/Lib/email/utils.py +++ b/Lib/email/utils.py @@ -259,21 +259,13 @@ def decode_params(params): params is a sequence of 2-tuples containing (param name, string value). """ - # Copy params so we don't mess with the original - params = params[:] - new_params = [] + new_params = [params[0]] # Map parameter's name to a list of continuations. The values are a # 3-tuple of the continuation number, the string value, and a flag # specifying whether a particular segment is %-encoded. rfc2231_params = {} - name, value = params.pop(0) - new_params.append((name, value)) - while params: - name, value = params.pop(0) - if name.endswith('*'): - encoded = True - else: - encoded = False + for name, value in params[1:]: + encoded = name.endswith('*') value = unquote(value) mo = rfc2231_continuation.match(name) if mo: diff --git a/Lib/encodings/aliases.py b/Lib/encodings/aliases.py index 2444f9f1..d85afd6d 100644 --- a/Lib/encodings/aliases.py +++ b/Lib/encodings/aliases.py @@ -450,6 +450,7 @@ aliases = { # mac_latin2 codec 'maccentraleurope' : 'mac_latin2', + 'mac_centeuro' : 'mac_latin2', 'maclatin2' : 'mac_latin2', # mac_roman codec @@ -493,9 +494,6 @@ aliases = { 'sjisx0213' : 'shift_jisx0213', 's_jisx0213' : 'shift_jisx0213', - # tactis codec - 'tis260' : 'tactis', - # tis_620 codec 'tis620' : 'tis_620', 'tis_620_0' : 'tis_620', diff --git a/Lib/encodings/mac_centeuro.py b/Lib/encodings/mac_centeuro.py deleted file mode 100644 index 5785a0ec..00000000 --- a/Lib/encodings/mac_centeuro.py +++ /dev/null @@ -1,307 +0,0 @@ -""" Python Character Mapping Codec mac_centeuro generated from 'MAPPINGS/VENDORS/APPLE/CENTEURO.TXT' with gencodec.py. - -"""#" - -import codecs - -### Codec APIs - -class Codec(codecs.Codec): - - def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_table) - - def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.charmap_encode(input,self.errors,encoding_table)[0] - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return codecs.charmap_decode(input,self.errors,decoding_table)[0] - -class StreamWriter(Codec,codecs.StreamWriter): - pass - -class StreamReader(Codec,codecs.StreamReader): - pass - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='mac-centeuro', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - - -### Decoding Table - -decoding_table = ( - '\x00' # 0x00 -> CONTROL CHARACTER - '\x01' # 0x01 -> CONTROL CHARACTER - '\x02' # 0x02 -> CONTROL CHARACTER - '\x03' # 0x03 -> CONTROL CHARACTER - '\x04' # 0x04 -> CONTROL CHARACTER - '\x05' # 0x05 -> CONTROL CHARACTER - '\x06' # 0x06 -> CONTROL CHARACTER - '\x07' # 0x07 -> CONTROL CHARACTER - '\x08' # 0x08 -> CONTROL CHARACTER - '\t' # 0x09 -> CONTROL CHARACTER - '\n' # 0x0A -> CONTROL CHARACTER - '\x0b' # 0x0B -> CONTROL CHARACTER - '\x0c' # 0x0C -> CONTROL CHARACTER - '\r' # 0x0D -> CONTROL CHARACTER - '\x0e' # 0x0E -> CONTROL CHARACTER - '\x0f' # 0x0F -> CONTROL CHARACTER - '\x10' # 0x10 -> CONTROL CHARACTER - '\x11' # 0x11 -> CONTROL CHARACTER - '\x12' # 0x12 -> CONTROL CHARACTER - '\x13' # 0x13 -> CONTROL CHARACTER - '\x14' # 0x14 -> CONTROL CHARACTER - '\x15' # 0x15 -> CONTROL CHARACTER - '\x16' # 0x16 -> CONTROL CHARACTER - '\x17' # 0x17 -> CONTROL CHARACTER - '\x18' # 0x18 -> CONTROL CHARACTER - '\x19' # 0x19 -> CONTROL CHARACTER - '\x1a' # 0x1A -> CONTROL CHARACTER - '\x1b' # 0x1B -> CONTROL CHARACTER - '\x1c' # 0x1C -> CONTROL CHARACTER - '\x1d' # 0x1D -> CONTROL CHARACTER - '\x1e' # 0x1E -> CONTROL CHARACTER - '\x1f' # 0x1F -> CONTROL CHARACTER - ' ' # 0x20 -> SPACE - '!' # 0x21 -> EXCLAMATION MARK - '"' # 0x22 -> QUOTATION MARK - '#' # 0x23 -> NUMBER SIGN - '$' # 0x24 -> DOLLAR SIGN - '%' # 0x25 -> PERCENT SIGN - '&' # 0x26 -> AMPERSAND - "'" # 0x27 -> APOSTROPHE - '(' # 0x28 -> LEFT PARENTHESIS - ')' # 0x29 -> RIGHT PARENTHESIS - '*' # 0x2A -> ASTERISK - '+' # 0x2B -> PLUS SIGN - ',' # 0x2C -> COMMA - '-' # 0x2D -> HYPHEN-MINUS - '.' # 0x2E -> FULL STOP - '/' # 0x2F -> SOLIDUS - '0' # 0x30 -> DIGIT ZERO - '1' # 0x31 -> DIGIT ONE - '2' # 0x32 -> DIGIT TWO - '3' # 0x33 -> DIGIT THREE - '4' # 0x34 -> DIGIT FOUR - '5' # 0x35 -> DIGIT FIVE - '6' # 0x36 -> DIGIT SIX - '7' # 0x37 -> DIGIT SEVEN - '8' # 0x38 -> DIGIT EIGHT - '9' # 0x39 -> DIGIT NINE - ':' # 0x3A -> COLON - ';' # 0x3B -> SEMICOLON - '<' # 0x3C -> LESS-THAN SIGN - '=' # 0x3D -> EQUALS SIGN - '>' # 0x3E -> GREATER-THAN SIGN - '?' # 0x3F -> QUESTION MARK - '@' # 0x40 -> COMMERCIAL AT - 'A' # 0x41 -> LATIN CAPITAL LETTER A - 'B' # 0x42 -> LATIN CAPITAL LETTER B - 'C' # 0x43 -> LATIN CAPITAL LETTER C - 'D' # 0x44 -> LATIN CAPITAL LETTER D - 'E' # 0x45 -> LATIN CAPITAL LETTER E - 'F' # 0x46 -> LATIN CAPITAL LETTER F - 'G' # 0x47 -> LATIN CAPITAL LETTER G - 'H' # 0x48 -> LATIN CAPITAL LETTER H - 'I' # 0x49 -> LATIN CAPITAL LETTER I - 'J' # 0x4A -> LATIN CAPITAL LETTER J - 'K' # 0x4B -> LATIN CAPITAL LETTER K - 'L' # 0x4C -> LATIN CAPITAL LETTER L - 'M' # 0x4D -> LATIN CAPITAL LETTER M - 'N' # 0x4E -> LATIN CAPITAL LETTER N - 'O' # 0x4F -> LATIN CAPITAL LETTER O - 'P' # 0x50 -> LATIN CAPITAL LETTER P - 'Q' # 0x51 -> LATIN CAPITAL LETTER Q - 'R' # 0x52 -> LATIN CAPITAL LETTER R - 'S' # 0x53 -> LATIN CAPITAL LETTER S - 'T' # 0x54 -> LATIN CAPITAL LETTER T - 'U' # 0x55 -> LATIN CAPITAL LETTER U - 'V' # 0x56 -> LATIN CAPITAL LETTER V - 'W' # 0x57 -> LATIN CAPITAL LETTER W - 'X' # 0x58 -> LATIN CAPITAL LETTER X - 'Y' # 0x59 -> LATIN CAPITAL LETTER Y - 'Z' # 0x5A -> LATIN CAPITAL LETTER Z - '[' # 0x5B -> LEFT SQUARE BRACKET - '\\' # 0x5C -> REVERSE SOLIDUS - ']' # 0x5D -> RIGHT SQUARE BRACKET - '^' # 0x5E -> CIRCUMFLEX ACCENT - '_' # 0x5F -> LOW LINE - '`' # 0x60 -> GRAVE ACCENT - 'a' # 0x61 -> LATIN SMALL LETTER A - 'b' # 0x62 -> LATIN SMALL LETTER B - 'c' # 0x63 -> LATIN SMALL LETTER C - 'd' # 0x64 -> LATIN SMALL LETTER D - 'e' # 0x65 -> LATIN SMALL LETTER E - 'f' # 0x66 -> LATIN SMALL LETTER F - 'g' # 0x67 -> LATIN SMALL LETTER G - 'h' # 0x68 -> LATIN SMALL LETTER H - 'i' # 0x69 -> LATIN SMALL LETTER I - 'j' # 0x6A -> LATIN SMALL LETTER J - 'k' # 0x6B -> LATIN SMALL LETTER K - 'l' # 0x6C -> LATIN SMALL LETTER L - 'm' # 0x6D -> LATIN SMALL LETTER M - 'n' # 0x6E -> LATIN SMALL LETTER N - 'o' # 0x6F -> LATIN SMALL LETTER O - 'p' # 0x70 -> LATIN SMALL LETTER P - 'q' # 0x71 -> LATIN SMALL LETTER Q - 'r' # 0x72 -> LATIN SMALL LETTER R - 's' # 0x73 -> LATIN SMALL LETTER S - 't' # 0x74 -> LATIN SMALL LETTER T - 'u' # 0x75 -> LATIN SMALL LETTER U - 'v' # 0x76 -> LATIN SMALL LETTER V - 'w' # 0x77 -> LATIN SMALL LETTER W - 'x' # 0x78 -> LATIN SMALL LETTER X - 'y' # 0x79 -> LATIN SMALL LETTER Y - 'z' # 0x7A -> LATIN SMALL LETTER Z - '{' # 0x7B -> LEFT CURLY BRACKET - '|' # 0x7C -> VERTICAL LINE - '}' # 0x7D -> RIGHT CURLY BRACKET - '~' # 0x7E -> TILDE - '\x7f' # 0x7F -> CONTROL CHARACTER - '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - '\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON - '\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON - '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - '\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK - '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - '\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK - '\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON - '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - '\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON - '\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE - '\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE - '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE - '\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE - '\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON - '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - '\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON - '\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON - '\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON - '\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE - '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - '\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE - '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - '\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON - '\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON - '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - '\u2020' # 0xA0 -> DAGGER - '\xb0' # 0xA1 -> DEGREE SIGN - '\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK - '\xa3' # 0xA3 -> POUND SIGN - '\xa7' # 0xA4 -> SECTION SIGN - '\u2022' # 0xA5 -> BULLET - '\xb6' # 0xA6 -> PILCROW SIGN - '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - '\xae' # 0xA8 -> REGISTERED SIGN - '\xa9' # 0xA9 -> COPYRIGHT SIGN - '\u2122' # 0xAA -> TRADE MARK SIGN - '\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK - '\xa8' # 0xAC -> DIAERESIS - '\u2260' # 0xAD -> NOT EQUAL TO - '\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA - '\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK - '\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK - '\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON - '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON - '\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA - '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - '\u2211' # 0xB7 -> N-ARY SUMMATION - '\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE - '\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA - '\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA - '\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON - '\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON - '\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE - '\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE - '\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA - '\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA - '\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE - '\xac' # 0xC2 -> NOT SIGN - '\u221a' # 0xC3 -> SQUARE ROOT - '\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE - '\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON - '\u2206' # 0xC6 -> INCREMENT - '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - '\xa0' # 0xCA -> NO-BREAK SPACE - '\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON - '\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - '\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE - '\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON - '\u2013' # 0xD0 -> EN DASH - '\u2014' # 0xD1 -> EM DASH - '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - '\xf7' # 0xD6 -> DIVISION SIGN - '\u25ca' # 0xD7 -> LOZENGE - '\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON - '\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE - '\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE - '\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON - '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - '\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON - '\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA - '\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA - '\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON - '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - '\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON - '\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE - '\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE - '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - '\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON - '\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON - '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - '\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON - '\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON - '\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON - '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - '\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON - '\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE - '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - '\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE - '\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - '\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE - '\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK - '\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK - '\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE - '\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE - '\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA - '\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - '\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE - '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE - '\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA - '\u02c7' # 0xFF -> CARON -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 9415fd73..97dfa7ea 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -1,9 +1,13 @@ import os import os.path -import pkgutil import sys import runpy import tempfile +import subprocess +from importlib import resources + +from . import _bundled + __all__ = ["version", "bootstrap"] @@ -11,7 +15,7 @@ __all__ = ["version", "bootstrap"] _SETUPTOOLS_VERSION = "49.2.1" -_PIP_VERSION = "20.2.1" +_PIP_VERSION = "20.2.3" _PROJECTS = [ ("setuptools", _SETUPTOOLS_VERSION, "py3"), @@ -20,22 +24,18 @@ _PROJECTS = [ def _run_pip(args, additional_paths=None): - # Add our bundled software to the sys.path so we can import it - if additional_paths is not None: - sys.path = additional_paths + sys.path - - # Invoke pip as if it's the main module, and catch the exit. - backup_argv = sys.argv[:] - sys.argv[1:] = args - try: - # run_module() alters sys.modules and sys.argv, but restores them at exit - runpy.run_module("pip", run_name="__main__", alter_sys=True) - except SystemExit as exc: - return exc.code - finally: - sys.argv[:] = backup_argv - - raise SystemError("pip did not exit, this should never happen") + # Run the bootstraping in a subprocess to avoid leaking any state that happens + # after pip has executed. Particulary, this avoids the case when pip holds onto + # the files in *additional_paths*, preventing us to remove them at the end of the + # invocation. + code = f""" +import runpy +import sys +sys.path = {additional_paths or []} + sys.path +sys.argv[1:] = {args} +runpy.run_module("pip", run_name="__main__", alter_sys=True) +""" + return subprocess.run([sys.executable, "-c", code], check=True).returncode def version(): @@ -106,9 +106,9 @@ def _bootstrap(*, root=None, upgrade=False, user=False, additional_paths = [] for project, version, py_tag in _PROJECTS: wheel_name = "{}-{}-{}-none-any.whl".format(project, version, py_tag) - whl = pkgutil.get_data( - "ensurepip", - "_bundled/{}".format(wheel_name), + whl = resources.read_binary( + _bundled, + wheel_name, ) with open(os.path.join(tmpdir, wheel_name), "wb") as fp: fp.write(whl) diff --git a/Lib/ensurepip/_bundled/__init__.py b/Lib/ensurepip/_bundled/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Lib/ensurepip/_bundled/pip-20.2.3-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/pip-20.2.3-py2.py3-none-any.whl new file mode 100644 index 00000000..7ebdc0f3 Binary files /dev/null and b/Lib/ensurepip/_bundled/pip-20.2.3-py2.py3-none-any.whl differ diff --git a/Lib/enum.py b/Lib/enum.py index de9ed4c1..ebadd9f6 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -431,7 +431,7 @@ class EnumMeta(type): if module is None: try: module = sys._getframe(2).f_globals['__name__'] - except (AttributeError, ValueError, KeyError) as exc: + except (AttributeError, ValueError, KeyError): pass if module is None: _make_class_unpicklable(enum_class) @@ -475,12 +475,6 @@ class EnumMeta(type): module_globals[name] = cls return cls - def _convert(cls, *args, **kwargs): - import warnings - warnings.warn("_convert is deprecated and will be removed in 3.9, use " - "_convert_ instead.", DeprecationWarning, stacklevel=2) - return cls._convert_(*args, **kwargs) - @staticmethod def _check_for_existing_members(class_name, bases): for chain in bases: @@ -612,7 +606,7 @@ class Enum(metaclass=EnumMeta): if isinstance(result, cls): return result else: - ve_exc = ValueError("%r is not a valid %s" % (value, cls.__name__)) + ve_exc = ValueError("%r is not a valid %s" % (value, cls.__qualname__)) if result is None and exc is None: raise ve_exc elif exc is None: @@ -741,7 +735,7 @@ class Flag(Enum): # verify all bits are accounted for _, extra_flags = _decompose(cls, value) if extra_flags: - raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + raise ValueError("%r is not a valid %s" % (value, cls.__qualname__)) # construct a singleton enum pseudo-member pseudo_member = object.__new__(cls) pseudo_member._name_ = None @@ -815,7 +809,7 @@ class IntFlag(int, Flag): @classmethod def _missing_(cls, value): if not isinstance(value, int): - raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + raise ValueError("%r is not a valid %s" % (value, cls.__qualname__)) new_member = cls._create_pseudo_member_(value) return new_member @@ -896,28 +890,20 @@ def _decompose(flag, value): # _decompose is only called if the value is not named not_covered = value negative = value < 0 - # issue29167: wrap accesses to _value2member_map_ in a list to avoid race - # conditions between iterating over it and having more pseudo- - # members added to it - if negative: - # only check for named flags - flags_to_check = [ - (m, v) - for v, m in list(flag._value2member_map_.items()) - if m.name is not None - ] - else: - # check for named flags and powers-of-two flags - flags_to_check = [ - (m, v) - for v, m in list(flag._value2member_map_.items()) - if m.name is not None or _power_of_two(v) - ] members = [] - for member, member_value in flags_to_check: + for member in flag: + member_value = member.value if member_value and member_value & value == member_value: members.append(member) not_covered &= ~member_value + if not negative: + tmp = not_covered + while tmp: + flag_value = 2 ** _high_bit(tmp) + if flag_value in flag._value2member_map_: + members.append(flag._value2member_map_[flag_value]) + not_covered &= ~flag_value + tmp &= ~flag_value if not members and value in flag._value2member_map_: members.append(flag._value2member_map_[value]) members.sort(key=lambda m: m._value_, reverse=True) @@ -925,8 +911,3 @@ def _decompose(flag, value): # we have the breakdown, don't need the value member itself members.pop(0) return members, not_covered - -def _power_of_two(value): - if value < 1: - return False - return value == 2 ** _high_bit(value) diff --git a/Lib/filecmp.py b/Lib/filecmp.py index e5ad8397..7a4da6be 100644 --- a/Lib/filecmp.py +++ b/Lib/filecmp.py @@ -13,6 +13,7 @@ Functions: import os import stat from itertools import filterfalse +from types import GenericAlias __all__ = ['clear_cache', 'cmp', 'dircmp', 'cmpfiles', 'DEFAULT_IGNORES'] @@ -156,12 +157,12 @@ class dircmp: ok = 1 try: a_stat = os.stat(a_path) - except OSError as why: + except OSError: # print('Can\'t stat', a_path, ':', why.args[1]) ok = 0 try: b_stat = os.stat(b_path) - except OSError as why: + except OSError: # print('Can\'t stat', b_path, ':', why.args[1]) ok = 0 @@ -247,6 +248,9 @@ class dircmp: self.methodmap[attr](self) return getattr(self, attr) + __class_getitem__ = classmethod(GenericAlias) + + def cmpfiles(a, b, common, shallow=True): """Compare common files in two directories. diff --git a/Lib/fileinput.py b/Lib/fileinput.py index c1b0ec9a..0c31f93e 100644 --- a/Lib/fileinput.py +++ b/Lib/fileinput.py @@ -73,6 +73,7 @@ XXX Possible additions: """ import sys, os +from types import GenericAlias __all__ = ["input", "close", "nextfile", "filename", "lineno", "filelineno", "fileno", "isfirstline", "isstdin", "FileInput", "hook_compressed", @@ -391,6 +392,8 @@ class FileInput: def isstdin(self): return self._isstdin + __class_getitem__ = classmethod(GenericAlias) + def hook_compressed(filename, mode): ext = os.path.splitext(filename)[1] diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py index b98e6413..0eb1802b 100644 --- a/Lib/fnmatch.py +++ b/Lib/fnmatch.py @@ -16,6 +16,12 @@ import functools __all__ = ["filter", "fnmatch", "fnmatchcase", "translate"] +# Build a thread-safe incrementing counter to help create unique regexp group +# names across calls. +from itertools import count +_nextgroupnum = count().__next__ +del count + def fnmatch(name, pat): """Test whether FILENAME matches PATTERN. @@ -77,15 +83,19 @@ def translate(pat): There is no way to quote meta-characters. """ + STAR = object() + res = [] + add = res.append i, n = 0, len(pat) - res = '' while i < n: c = pat[i] i = i+1 if c == '*': - res = res + '.*' + # compress consecutive `*` into one + if (not res) or res[-1] is not STAR: + add(STAR) elif c == '?': - res = res + '.' + add('.') elif c == '[': j = i if j < n and pat[j] == '!': @@ -95,7 +105,7 @@ def translate(pat): while j < n and pat[j] != ']': j = j+1 if j >= n: - res = res + '\\[' + add('\\[') else: stuff = pat[i:j] if '--' not in stuff: @@ -122,7 +132,52 @@ def translate(pat): stuff = '^' + stuff[1:] elif stuff[0] in ('^', '['): stuff = '\\' + stuff - res = '%s[%s]' % (res, stuff) + add(f'[{stuff}]') + else: + add(re.escape(c)) + assert i == n + + # Deal with STARs. + inp = res + res = [] + add = res.append + i, n = 0, len(inp) + # Fixed pieces at the start? + while i < n and inp[i] is not STAR: + add(inp[i]) + i += 1 + # Now deal with STAR fixed STAR fixed ... + # For an interior `STAR fixed` pairing, we want to do a minimal + # .*? match followed by `fixed`, with no possibility of backtracking. + # We can't spell that directly, but can trick it into working by matching + # .*?fixed + # in a lookahead assertion, save the matched part in a group, then + # consume that group via a backreference. If the overall match fails, + # the lookahead assertion won't try alternatives. So the translation is: + # (?=(?P.*?fixed))(?P=name) + # Group names are created as needed: g0, g1, g2, ... + # The numbers are obtained from _nextgroupnum() to ensure they're unique + # across calls and across threads. This is because people rely on the + # undocumented ability to join multiple translate() results together via + # "|" to build large regexps matching "one of many" shell patterns. + while i < n: + assert inp[i] is STAR + i += 1 + if i == n: + add(".*") + break + assert inp[i] is not STAR + fixed = [] + while i < n and inp[i] is not STAR: + fixed.append(inp[i]) + i += 1 + fixed = "".join(fixed) + if i == n: + add(".*") + add(fixed) else: - res = res + re.escape(c) - return r'(?s:%s)\Z' % res + groupnum = _nextgroupnum() + add(f"(?=(?P.*?{fixed}))(?P=g{groupnum})") + assert i == n + res = "".join(res) + return fr'(?s:{res})\Z' diff --git a/Lib/fractions.py b/Lib/fractions.py index e4fcc890..de3e23b7 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -10,31 +10,9 @@ import operator import re import sys -__all__ = ['Fraction', 'gcd'] +__all__ = ['Fraction'] - -def gcd(a, b): - """Calculate the Greatest Common Divisor of a and b. - - Unless b==0, the result will have the same sign as b (so that when - b is divided by it, the result comes out positive). - """ - import warnings - warnings.warn('fractions.gcd() is deprecated. Use math.gcd() instead.', - DeprecationWarning, 2) - if type(a) is int is type(b): - if (b or a) < 0: - return -math.gcd(a, b) - return math.gcd(a, b) - return _gcd(a, b) - -def _gcd(a, b): - # Supports non-integers for backward compatibility. - while b: - a, b = b, a%b - return a - # Constants related to the hash implementation; hash(x) is based # on the reduction of x modulo the prime _PyHASH_MODULUS. _PyHASH_MODULUS = sys.hash_info.modulus @@ -177,13 +155,9 @@ class Fraction(numbers.Rational): if denominator == 0: raise ZeroDivisionError('Fraction(%s, 0)' % numerator) if _normalize: - if type(numerator) is int is type(denominator): - # *very* normal case - g = math.gcd(numerator, denominator) - if denominator < 0: - g = -g - else: - g = _gcd(numerator, denominator) + g = math.gcd(numerator, denominator) + if denominator < 0: + g = -g numerator //= g denominator //= g self._numerator = numerator @@ -556,23 +530,34 @@ class Fraction(numbers.Rational): def __hash__(self): """hash(self)""" - # XXX since this method is expensive, consider caching the result - - # In order to make sure that the hash of a Fraction agrees - # with the hash of a numerically equal integer, float or - # Decimal instance, we follow the rules for numeric hashes - # outlined in the documentation. (See library docs, 'Built-in - # Types'). + # To make sure that the hash of a Fraction agrees with the hash + # of a numerically equal integer, float or Decimal instance, we + # follow the rules for numeric hashes outlined in the + # documentation. (See library docs, 'Built-in Types'). - # dinv is the inverse of self._denominator modulo the prime - # _PyHASH_MODULUS, or 0 if self._denominator is divisible by - # _PyHASH_MODULUS. - dinv = pow(self._denominator, _PyHASH_MODULUS - 2, _PyHASH_MODULUS) - if not dinv: + try: + dinv = pow(self._denominator, -1, _PyHASH_MODULUS) + except ValueError: + # ValueError means there is no modular inverse. hash_ = _PyHASH_INF else: - hash_ = abs(self._numerator) * dinv % _PyHASH_MODULUS - result = hash_ if self >= 0 else -hash_ + # The general algorithm now specifies that the absolute value of + # the hash is + # (|N| * dinv) % P + # where N is self._numerator and P is _PyHASH_MODULUS. That's + # optimized here in two ways: first, for a non-negative int i, + # hash(i) == i % P, but the int hash implementation doesn't need + # to divide, and is faster than doing % P explicitly. So we do + # hash(|N| * dinv) + # instead. Second, N is unbounded, so its product with dinv may + # be arbitrarily expensive to compute. The final answer is the + # same if we use the bounded |N| % P instead, which can again + # be done with an int hash() call. If 0 <= i < P, hash(i) == i, + # so this nested hash() call wastes a bit of time making a + # redundant copy when |N| < P, but can save an arbitrarily large + # amount of computation for large |N|. + hash_ = hash(hash(abs(self._numerator)) * dinv) + result = hash_ if self._numerator >= 0 else -hash_ return -2 if result == -1 else result def __eq__(a, b): diff --git a/Lib/ftplib.py b/Lib/ftplib.py index 58a46bca..1f760ed1 100644 --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -72,17 +72,17 @@ B_CRLF = b'\r\n' # The class itself class FTP: - '''An FTP client class. To create a connection, call the class using these arguments: - host, user, passwd, acct, timeout + host, user, passwd, acct, timeout, source_address, encoding The first four arguments are all strings, and have default value ''. - timeout must be numeric and defaults to None if not passed, - meaning that no timeout will be set on any ftp socket(s) + The parameter ´timeout´ must be numeric and defaults to None if not + passed, meaning that no timeout will be set on any ftp socket(s). If a timeout is passed, then this is now the default timeout for all ftp socket operations for this instance. + The last parameter is the encoding of filenames, which defaults to utf-8. Then use self.connect() with optional host and port argument. @@ -103,14 +103,16 @@ class FTP: file = None welcome = None passiveserver = 1 - encoding = "latin-1" - # Initialization method (called by class instantiation). - # Initialize host to localhost, port to standard ftp port - # Optional arguments are host (for connect()), - # and user, passwd, acct (for login()) def __init__(self, host='', user='', passwd='', acct='', - timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None): + timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None, *, + encoding='utf-8'): + """Initialization method (called by class instantiation). + Initialize host to localhost, port to standard ftp port. + Optional arguments are host (for connect()), + and user, passwd, acct (for login()). + """ + self.encoding = encoding self.source_address = source_address self.timeout = timeout if host: @@ -146,6 +148,8 @@ class FTP: self.port = port if timeout != -999: self.timeout = timeout + if self.timeout is not None and not self.timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') if source_address is not None: self.source_address = source_address sys.audit("ftplib.connect", self, self.host, self.port) @@ -704,9 +708,10 @@ else: ''' ssl_version = ssl.PROTOCOL_TLS_CLIENT - def __init__(self, host='', user='', passwd='', acct='', keyfile=None, - certfile=None, context=None, - timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None): + def __init__(self, host='', user='', passwd='', acct='', + keyfile=None, certfile=None, context=None, + timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None, *, + encoding='utf-8'): if context is not None and keyfile is not None: raise ValueError("context and keyfile arguments are mutually " "exclusive") @@ -725,12 +730,13 @@ else: keyfile=keyfile) self.context = context self._prot_p = False - FTP.__init__(self, host, user, passwd, acct, timeout, source_address) + super().__init__(host, user, passwd, acct, + timeout, source_address, encoding=encoding) def login(self, user='', passwd='', acct='', secure=True): if secure and not isinstance(self.sock, ssl.SSLSocket): self.auth() - return FTP.login(self, user, passwd, acct) + return super().login(user, passwd, acct) def auth(self): '''Set up secure control connection by using TLS/SSL.''' @@ -740,8 +746,7 @@ else: resp = self.voidcmd('AUTH TLS') else: resp = self.voidcmd('AUTH SSL') - self.sock = self.context.wrap_socket(self.sock, - server_hostname=self.host) + self.sock = self.context.wrap_socket(self.sock, server_hostname=self.host) self.file = self.sock.makefile(mode='r', encoding=self.encoding) return resp @@ -778,7 +783,7 @@ else: # --- Overridden FTP methods def ntransfercmd(self, cmd, rest=None): - conn, size = FTP.ntransfercmd(self, cmd, rest) + conn, size = super().ntransfercmd(cmd, rest) if self._prot_p: conn = self.context.wrap_socket(conn, server_hostname=self.host) @@ -823,7 +828,6 @@ def parse227(resp): '''Parse the '227' response for a PASV request. Raises error_proto if it does not contain '(h1,h2,h3,h4,p1,p2)' Return ('host.addr.as.numbers', port#) tuple.''' - if resp[:3] != '227': raise error_reply(resp) global _227_re @@ -843,7 +847,6 @@ def parse229(resp, peer): '''Parse the '229' response for an EPSV request. Raises error_proto if it does not contain '(|||port|)' Return ('host.addr.as.numbers', port#) tuple.''' - if resp[:3] != '229': raise error_reply(resp) left = resp.find('(') @@ -865,7 +868,6 @@ def parse257(resp): '''Parse the '257' response for a MKD or PWD request. This is a response to a MKD or PWD request: a directory name. Returns the directoryname in the 257 reply.''' - if resp[:3] != '257': raise error_reply(resp) if resp[3:5] != ' "': diff --git a/Lib/functools.py b/Lib/functools.py index 4cde5f59..5cab497d 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -10,15 +10,16 @@ # See C source code for _functools credits/copyright __all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES', - 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial', - 'partialmethod', 'singledispatch', 'singledispatchmethod', - "cached_property"] + 'total_ordering', 'cache', 'cmp_to_key', 'lru_cache', 'reduce', + 'partial', 'partialmethod', 'singledispatch', 'singledispatchmethod', + 'cached_property'] from abc import get_cache_token from collections import namedtuple # import types, weakref # Deferred to single_dispatch() from reprlib import recursive_repr from _thread import RLock +from types import GenericAlias ################################################################################ @@ -95,6 +96,8 @@ def _gt_from_lt(self, other, NotImplemented=NotImplemented): def _le_from_lt(self, other, NotImplemented=NotImplemented): 'Return a <= b. Computed by @total_ordering from (a < b) or (a == b).' op_result = self.__lt__(other) + if op_result is NotImplemented: + return op_result return op_result or self == other def _ge_from_lt(self, other, NotImplemented=NotImplemented): @@ -135,6 +138,8 @@ def _lt_from_gt(self, other, NotImplemented=NotImplemented): def _ge_from_gt(self, other, NotImplemented=NotImplemented): 'Return a >= b. Computed by @total_ordering from (a > b) or (a == b).' op_result = self.__gt__(other) + if op_result is NotImplemented: + return op_result return op_result or self == other def _le_from_gt(self, other, NotImplemented=NotImplemented): @@ -346,23 +351,7 @@ class partialmethod(object): callables as instance methods. """ - def __init__(*args, **keywords): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor '__init__' of partialmethod " - "needs an argument") - elif 'func' in keywords: - func = keywords.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError("type 'partialmethod' takes at least one argument, " - "got %d" % (len(args)-1)) - args = tuple(args) - + def __init__(self, func, /, *args, **keywords): if not callable(func) and not hasattr(func, "__get__"): raise TypeError("{!r} is not callable or a descriptor" .format(func)) @@ -380,7 +369,6 @@ class partialmethod(object): self.func = func self.args = args self.keywords = keywords - __init__.__text_signature__ = '($self, func, /, *args, **keywords)' def __repr__(self): args = ", ".join(map(repr, self.args)) @@ -424,6 +412,9 @@ class partialmethod(object): def __isabstractmethod__(self): return getattr(self.func, "__isabstractmethod__", False) + __class_getitem__ = classmethod(GenericAlias) + + # Helper functions def _unwrap_partial(func): @@ -517,6 +508,7 @@ def lru_cache(maxsize=128, typed=False): # The user_function was passed in directly via the maxsize argument user_function, maxsize = maxsize, 128 wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo) + wrapper.cache_parameters = lambda : {'maxsize': maxsize, 'typed': typed} return update_wrapper(wrapper, user_function) elif maxsize is not None: raise TypeError( @@ -524,6 +516,7 @@ def lru_cache(maxsize=128, typed=False): def decorating_function(user_function): wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo) + wrapper.cache_parameters = lambda : {'maxsize': maxsize, 'typed': typed} return update_wrapper(wrapper, user_function) return decorating_function @@ -650,6 +643,15 @@ except ImportError: pass +################################################################################ +### cache -- simplified access to the infinity cache +################################################################################ + +def cache(user_function, /): + 'Simple lightweight unbounded cache. Sometimes called "memoize".' + return lru_cache(maxsize=None)(user_function) + + ################################################################################ ### singledispatch() - single-dispatch generic function decorator ################################################################################ @@ -974,3 +976,5 @@ class cached_property: ) raise TypeError(msg) from None return val + + __class_getitem__ = classmethod(GenericAlias) diff --git a/Lib/getpass.py b/Lib/getpass.py index 36e17e4c..6911f41d 100644 --- a/Lib/getpass.py +++ b/Lib/getpass.py @@ -52,7 +52,7 @@ def unix_getpass(prompt='Password: ', stream=None): stack.enter_context(input) if not stream: stream = input - except OSError as e: + except OSError: # If that fails, see if stdin can be controlled. stack.close() try: diff --git a/Lib/gettext.py b/Lib/gettext.py index b98f5018..77b67aef 100644 --- a/Lib/gettext.py +++ b/Lib/gettext.py @@ -46,7 +46,6 @@ internationalized, to the local language and cultural habits. # find this format documented anywhere. -import locale import os import re import sys @@ -210,6 +209,7 @@ def c2py(plural): def _expand_lang(loc): + import locale loc = locale.normalize(loc) COMPONENT_CODESET = 1 << 0 COMPONENT_TERRITORY = 1 << 1 @@ -278,6 +278,7 @@ class NullTranslations: import warnings warnings.warn('lgettext() is deprecated, use gettext() instead', DeprecationWarning, 2) + import locale if self._fallback: with warnings.catch_warnings(): warnings.filterwarnings('ignore', r'.*\blgettext\b.*', @@ -299,6 +300,7 @@ class NullTranslations: import warnings warnings.warn('lngettext() is deprecated, use ngettext() instead', DeprecationWarning, 2) + import locale if self._fallback: with warnings.catch_warnings(): warnings.filterwarnings('ignore', r'.*\blngettext\b.*', @@ -462,6 +464,7 @@ class GNUTranslations(NullTranslations): import warnings warnings.warn('lgettext() is deprecated, use gettext() instead', DeprecationWarning, 2) + import locale missing = object() tmsg = self._catalog.get(message, missing) if tmsg is missing: @@ -476,6 +479,7 @@ class GNUTranslations(NullTranslations): import warnings warnings.warn('lngettext() is deprecated, use ngettext() instead', DeprecationWarning, 2) + import locale try: tmsg = self._catalog[(msgid1, self.plural(n))] except KeyError: @@ -668,6 +672,7 @@ def ldgettext(domain, message): import warnings warnings.warn('ldgettext() is deprecated, use dgettext() instead', DeprecationWarning, 2) + import locale codeset = _localecodesets.get(domain) try: with warnings.catch_warnings(): @@ -695,6 +700,7 @@ def ldngettext(domain, msgid1, msgid2, n): import warnings warnings.warn('ldngettext() is deprecated, use dngettext() instead', DeprecationWarning, 2) + import locale codeset = _localecodesets.get(domain) try: with warnings.catch_warnings(): diff --git a/Lib/graphlib.py b/Lib/graphlib.py new file mode 100644 index 00000000..948f62f1 --- /dev/null +++ b/Lib/graphlib.py @@ -0,0 +1,245 @@ +__all__ = ["TopologicalSorter", "CycleError"] + +_NODE_OUT = -1 +_NODE_DONE = -2 + + +class _NodeInfo: + __slots__ = "node", "npredecessors", "successors" + + def __init__(self, node): + # The node this class is augmenting. + self.node = node + + # Number of predecessors, generally >= 0. When this value falls to 0, + # and is returned by get_ready(), this is set to _NODE_OUT and when the + # node is marked done by a call to done(), set to _NODE_DONE. + self.npredecessors = 0 + + # List of successor nodes. The list can contain duplicated elements as + # long as they're all reflected in the successor's npredecessors attribute). + self.successors = [] + + +class CycleError(ValueError): + """Subclass of ValueError raised by TopologicalSorterif cycles exist in the graph + + If multiple cycles exist, only one undefined choice among them will be reported + and included in the exception. The detected cycle can be accessed via the second + element in the *args* attribute of the exception instance and consists in a list + of nodes, such that each node is, in the graph, an immediate predecessor of the + next node in the list. In the reported list, the first and the last node will be + the same, to make it clear that it is cyclic. + """ + + pass + + +class TopologicalSorter: + """Provides functionality to topologically sort a graph of hashable nodes""" + + def __init__(self, graph=None): + self._node2info = {} + self._ready_nodes = None + self._npassedout = 0 + self._nfinished = 0 + + if graph is not None: + for node, predecessors in graph.items(): + self.add(node, *predecessors) + + def _get_nodeinfo(self, node): + if (result := self._node2info.get(node)) is None: + self._node2info[node] = result = _NodeInfo(node) + return result + + def add(self, node, *predecessors): + """Add a new node and its predecessors to the graph. + + Both the *node* and all elements in *predecessors* must be hashable. + + If called multiple times with the same node argument, the set of dependencies + will be the union of all dependencies passed in. + + It is possible to add a node with no dependencies (*predecessors* is not provided) + as well as provide a dependency twice. If a node that has not been provided before + is included among *predecessors* it will be automatically added to the graph with + no predecessors of its own. + + Raises ValueError if called after "prepare". + """ + if self._ready_nodes is not None: + raise ValueError("Nodes cannot be added after a call to prepare()") + + # Create the node -> predecessor edges + nodeinfo = self._get_nodeinfo(node) + nodeinfo.npredecessors += len(predecessors) + + # Create the predecessor -> node edges + for pred in predecessors: + pred_info = self._get_nodeinfo(pred) + pred_info.successors.append(node) + + def prepare(self): + """Mark the graph as finished and check for cycles in the graph. + + If any cycle is detected, "CycleError" will be raised, but "get_ready" can + still be used to obtain as many nodes as possible until cycles block more + progress. After a call to this function, the graph cannot be modified and + therefore no more nodes can be added using "add". + """ + if self._ready_nodes is not None: + raise ValueError("cannot prepare() more than once") + + self._ready_nodes = [ + i.node for i in self._node2info.values() if i.npredecessors == 0 + ] + # ready_nodes is set before we look for cycles on purpose: + # if the user wants to catch the CycleError, that's fine, + # they can continue using the instance to grab as many + # nodes as possible before cycles block more progress + cycle = self._find_cycle() + if cycle: + raise CycleError(f"nodes are in a cycle", cycle) + + def get_ready(self): + """Return a tuple of all the nodes that are ready. + + Initially it returns all nodes with no predecessors; once those are marked + as processed by calling "done", further calls will return all new nodes that + have all their predecessors already processed. Once no more progress can be made, + empty tuples are returned. + + Raises ValueError if called without calling "prepare" previously. + """ + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + + # Get the nodes that are ready and mark them + result = tuple(self._ready_nodes) + n2i = self._node2info + for node in result: + n2i[node].npredecessors = _NODE_OUT + + # Clean the list of nodes that are ready and update + # the counter of nodes that we have returned. + self._ready_nodes.clear() + self._npassedout += len(result) + + return result + + def is_active(self): + """Return True if more progress can be made and ``False`` otherwise. + + Progress can be made if cycles do not block the resolution and either there + are still nodes ready that haven't yet been returned by "get_ready" or the + number of nodes marked "done" is less than the number that have been returned + by "get_ready". + + Raises ValueError if called without calling "prepare" previously. + """ + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + return self._nfinished < self._npassedout or bool(self._ready_nodes) + + def __bool__(self): + return self.is_active() + + def done(self, *nodes): + """Marks a set of nodes returned by "get_ready" as processed. + + This method unblocks any successor of each node in *nodes* for being returned + in the future by a a call to "get_ready" + + Raises :exec:`ValueError` if any node in *nodes* has already been marked as + processed by a previous call to this method, if a node was not added to the + graph by using "add" or if called without calling "prepare" previously or if + node has not yet been returned by "get_ready". + """ + + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + + n2i = self._node2info + + for node in nodes: + + # Check if we know about this node (it was added previously using add() + if (nodeinfo := n2i.get(node)) is None: + raise ValueError(f"node {node!r} was not added using add()") + + # If the node has not being returned (marked as ready) previously, inform the user. + stat = nodeinfo.npredecessors + if stat != _NODE_OUT: + if stat >= 0: + raise ValueError( + f"node {node!r} was not passed out (still not ready)" + ) + elif stat == _NODE_DONE: + raise ValueError(f"node {node!r} was already marked done") + else: + assert False, f"node {node!r}: unknown status {stat}" + + # Mark the node as processed + nodeinfo.npredecessors = _NODE_DONE + + # Go to all the successors and reduce the number of predecessors, collecting all the ones + # that are ready to be returned in the next get_ready() call. + for successor in nodeinfo.successors: + successor_info = n2i[successor] + successor_info.npredecessors -= 1 + if successor_info.npredecessors == 0: + self._ready_nodes.append(successor) + self._nfinished += 1 + + def _find_cycle(self): + n2i = self._node2info + stack = [] + itstack = [] + seen = set() + node2stacki = {} + + for node in n2i: + if node in seen: + continue + + while True: + if node in seen: + # If we have seen already the node and is in the + # current stack we have found a cycle. + if node in node2stacki: + return stack[node2stacki[node] :] + [node] + # else go on to get next successor + else: + seen.add(node) + itstack.append(iter(n2i[node].successors).__next__) + node2stacki[node] = len(stack) + stack.append(node) + + # Backtrack to the topmost stack entry with + # at least another successor. + while stack: + try: + node = itstack[-1]() + break + except StopIteration: + del node2stacki[stack.pop()] + itstack.pop() + else: + break + return None + + def static_order(self): + """Returns an iterable of nodes in a topological order. + + The particular order that is returned may depend on the specific + order in which the items were inserted in the graph. + + Using this method does not require to call "prepare" or "done". If any + cycle is detected, :exc:`CycleError` will be raised. + """ + self.prepare() + while self.is_active(): + node_group = self.get_ready() + yield from node_group + self.done(*node_group) diff --git a/Lib/gzip.py b/Lib/gzip.py index 87b553df..e422773b 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -177,6 +177,7 @@ class GzipFile(_compression.BaseStream): filename = '' else: filename = os.fspath(filename) + origmode = mode if mode is None: mode = getattr(fileobj, 'mode', 'rb') @@ -187,6 +188,13 @@ class GzipFile(_compression.BaseStream): self.name = filename elif mode.startswith(('w', 'a', 'x')): + if origmode is None: + import warnings + warnings.warn( + "GzipFile was opened for writing, but this will " + "change in future Python releases. " + "Specify the mode argument for opening it for writing.", + FutureWarning, 2) self.mode = WRITE self._init_write(filename) self.compress = zlib.compressobj(compresslevel, diff --git a/Lib/hashlib.py b/Lib/hashlib.py index 56873b72..58c340d5 100644 --- a/Lib/hashlib.py +++ b/Lib/hashlib.py @@ -70,9 +70,12 @@ __all__ = __always_supported + ('new', 'algorithms_guaranteed', __builtin_constructor_cache = {} +# Prefer our blake2 implementation +# OpenSSL 1.1.0 comes with a limited implementation of blake2b/s. The OpenSSL +# implementations neither support keyed blake2 (blake2 MAC) nor advanced +# features like salt, personalization, or tree hashing. OpenSSL hash-only +# variants are available as 'blake2b512' and 'blake2s256', though. __block_openssl_constructor = { - 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', - 'shake_128', 'shake_256', 'blake2b', 'blake2s', } @@ -122,13 +125,16 @@ def __get_builtin_constructor(name): def __get_openssl_constructor(name): if name in __block_openssl_constructor: - # Prefer our blake2 and sha3 implementation. + # Prefer our builtin blake2 implementation. return __get_builtin_constructor(name) try: + # MD5, SHA1, and SHA2 are in all supported OpenSSL versions + # SHA3/shake are available in OpenSSL 1.1.1+ f = getattr(_hashlib, 'openssl_' + name) # Allow the C module to raise ValueError. The function will be - # defined but the hash not actually available thanks to OpenSSL. - f() + # defined but the hash not actually available. Don't fall back to + # builtin if the current security policy blocks a digest, bpo#40695. + f(usedforsecurity=False) # Use the C function directly (very fast) return f except (AttributeError, ValueError): @@ -148,13 +154,10 @@ def __hash_new(name, data=b'', **kwargs): optionally initialized with data (which must be a bytes-like object). """ if name in __block_openssl_constructor: - # Prefer our blake2 and sha3 implementation - # OpenSSL 1.1.0 comes with a limited implementation of blake2b/s. - # It does neither support keyed blake2 nor advanced features like - # salt, personal, tree hashing or SSE. + # Prefer our builtin blake2 implementation. return __get_builtin_constructor(name)(data, **kwargs) try: - return _hashlib.new(name, data) + return _hashlib.new(name, data, **kwargs) except ValueError: # If the _hashlib module (OpenSSL) doesn't support the named # hash, try using our builtin implementations. diff --git a/Lib/hmac.py b/Lib/hmac.py index b769876e..180bc378 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -4,14 +4,15 @@ Implements the HMAC algorithm as described by RFC 2104. """ import warnings as _warnings -from _operator import _compare_digest as compare_digest try: import _hashlib as _hashopenssl except ImportError: _hashopenssl = None _openssl_md_meths = None + from _operator import _compare_digest as compare_digest else: _openssl_md_meths = frozenset(_hashopenssl.openssl_md_meth_names) + compare_digest = _hashopenssl.compare_digest import hashlib as _hashlib trans_5C = bytes((x ^ 0x5C) for x in range(256)) @@ -30,6 +31,10 @@ class HMAC: """ blocksize = 64 # 512-bit HMAC; can be changed in subclasses. + __slots__ = ( + "_digest_cons", "_inner", "_outer", "block_size", "digest_size" + ) + def __init__(self, key, msg=None, digestmod=''): """Create a new HMAC object. @@ -51,18 +56,18 @@ class HMAC: raise TypeError("Missing required parameter 'digestmod'.") if callable(digestmod): - self.digest_cons = digestmod + self._digest_cons = digestmod elif isinstance(digestmod, str): - self.digest_cons = lambda d=b'': _hashlib.new(digestmod, d) + self._digest_cons = lambda d=b'': _hashlib.new(digestmod, d) else: - self.digest_cons = lambda d=b'': digestmod.new(d) + self._digest_cons = lambda d=b'': digestmod.new(d) - self.outer = self.digest_cons() - self.inner = self.digest_cons() - self.digest_size = self.inner.digest_size + self._outer = self._digest_cons() + self._inner = self._digest_cons() + self.digest_size = self._inner.digest_size - if hasattr(self.inner, 'block_size'): - blocksize = self.inner.block_size + if hasattr(self._inner, 'block_size'): + blocksize = self._inner.block_size if blocksize < 16: _warnings.warn('block_size of %d seems too small; using our ' 'default of %d.' % (blocksize, self.blocksize), @@ -79,21 +84,33 @@ class HMAC: self.block_size = blocksize if len(key) > blocksize: - key = self.digest_cons(key).digest() + key = self._digest_cons(key).digest() key = key.ljust(blocksize, b'\0') - self.outer.update(key.translate(trans_5C)) - self.inner.update(key.translate(trans_36)) + self._outer.update(key.translate(trans_5C)) + self._inner.update(key.translate(trans_36)) if msg is not None: self.update(msg) @property def name(self): - return "hmac-" + self.inner.name + return "hmac-" + self._inner.name + + @property + def digest_cons(self): + return self._digest_cons + + @property + def inner(self): + return self._inner + + @property + def outer(self): + return self._outer def update(self, msg): """Feed data from msg into this hashing object.""" - self.inner.update(msg) + self._inner.update(msg) def copy(self): """Return a separate copy of this hashing object. @@ -102,10 +119,10 @@ class HMAC: """ # Call __new__ directly to avoid the expensive __init__. other = self.__class__.__new__(self.__class__) - other.digest_cons = self.digest_cons + other._digest_cons = self._digest_cons other.digest_size = self.digest_size - other.inner = self.inner.copy() - other.outer = self.outer.copy() + other._inner = self._inner.copy() + other._outer = self._outer.copy() return other def _current(self): @@ -113,8 +130,8 @@ class HMAC: To be used only internally with digest() and hexdigest(). """ - h = self.outer.copy() - h.update(self.inner.digest()) + h = self._outer.copy() + h.update(self._inner.digest()) return h def digest(self): diff --git a/Lib/html/parser.py b/Lib/html/parser.py index de81879a..60830779 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -9,7 +9,6 @@ import re -import warnings import _markupbase from html import unescape @@ -461,10 +460,3 @@ class HTMLParser(_markupbase.ParserBase): def unknown_decl(self, data): pass - - # Internal -- helper to remove special character quoting - def unescape(self, s): - warnings.warn('The unescape method is deprecated and will be removed ' - 'in 3.5, use html.unescape() instead.', - DeprecationWarning, stacklevel=2) - return unescape(s) diff --git a/Lib/http/__init__.py b/Lib/http/__init__.py index 350afe77..37be7653 100644 --- a/Lib/http/__init__.py +++ b/Lib/http/__init__.py @@ -17,6 +17,9 @@ class HTTPStatus(IntEnum): * RFC 2774: An HTTP Extension Framework * RFC 7725: An HTTP Status Code to Report Legal Obstacles * RFC 7540: Hypertext Transfer Protocol Version 2 (HTTP/2) + * RFC 2324: Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0) + * RFC 8297: An HTTP Status Code for Indicating Hints + * RFC 8470: Using Early Data in HTTP """ def __new__(cls, value, phrase, description=''): obj = int.__new__(cls, value) @@ -31,6 +34,7 @@ class HTTPStatus(IntEnum): SWITCHING_PROTOCOLS = (101, 'Switching Protocols', 'Switching to new protocol; obey Upgrade header') PROCESSING = 102, 'Processing' + EARLY_HINTS = 103, 'Early Hints' # success OK = 200, 'OK', 'Request fulfilled, document follows' @@ -100,11 +104,14 @@ class HTTPStatus(IntEnum): 'Cannot satisfy request range') EXPECTATION_FAILED = (417, 'Expectation Failed', 'Expect condition could not be satisfied') + IM_A_TEAPOT = (418, 'I\'m a Teapot', + 'Server refuses to brew coffee because it is a teapot.') MISDIRECTED_REQUEST = (421, 'Misdirected Request', 'Server is not able to produce a response') UNPROCESSABLE_ENTITY = 422, 'Unprocessable Entity' LOCKED = 423, 'Locked' FAILED_DEPENDENCY = 424, 'Failed Dependency' + TOO_EARLY = 425, 'Too Early' UPGRADE_REQUIRED = 426, 'Upgrade Required' PRECONDITION_REQUIRED = (428, 'Precondition Required', 'The origin server requires the request to be conditional') diff --git a/Lib/http/cookies.py b/Lib/http/cookies.py index 6694f547..35ac2dc6 100644 --- a/Lib/http/cookies.py +++ b/Lib/http/cookies.py @@ -131,6 +131,7 @@ Finis. # import re import string +import types __all__ = ["CookieError", "BaseCookie", "SimpleCookie"] @@ -419,6 +420,8 @@ class Morsel(dict): # Return the result return _semispacejoin(result) + __class_getitem__ = classmethod(types.GenericAlias) + # # Pattern for finding cookie diff --git a/Lib/http/server.py b/Lib/http/server.py index 38f7acca..fa204fbc 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -639,11 +639,17 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): """ server_version = "SimpleHTTP/" + __version__ + extensions_map = _encodings_map_default = { + '.gz': 'application/gzip', + '.Z': 'application/octet-stream', + '.bz2': 'application/x-bzip2', + '.xz': 'application/x-xz', + } def __init__(self, *args, directory=None, **kwargs): if directory is None: directory = os.getcwd() - self.directory = directory + self.directory = os.fspath(directory) super().__init__(*args, **kwargs) def do_GET(self): @@ -866,25 +872,16 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): slow) to look inside the data to make a better guess. """ - base, ext = posixpath.splitext(path) if ext in self.extensions_map: return self.extensions_map[ext] ext = ext.lower() if ext in self.extensions_map: return self.extensions_map[ext] - else: - return self.extensions_map[''] - - if not mimetypes.inited: - mimetypes.init() # try to read system mime.types - extensions_map = mimetypes.types_map.copy() - extensions_map.update({ - '': 'application/octet-stream', # Default - '.py': 'text/plain', - '.c': 'text/plain', - '.h': 'text/plain', - }) + guess, _ = mimetypes.guess_type(path) + if guess: + return guess + return 'application/octet-stream' # Utilities for CGIHTTPRequestHandler @@ -1015,8 +1012,10 @@ class CGIHTTPRequestHandler(SimpleHTTPRequestHandler): """ collapsed_path = _url_collapse_path(self.path) dir_sep = collapsed_path.find('/', 1) - head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:] - if head in self.cgi_directories: + while dir_sep > 0 and not collapsed_path[:dir_sep] in self.cgi_directories: + dir_sep = collapsed_path.find('/', dir_sep+1) + if dir_sep > 0: + head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:] self.cgi_info = head, tail return True return False @@ -1165,8 +1164,9 @@ class CGIHTTPRequestHandler(SimpleHTTPRequestHandler): while select.select([self.rfile], [], [], 0)[0]: if not self.rfile.read(1): break - if sts: - self.log_error("CGI script exit status %#x", sts) + exitcode = os.waitstatus_to_exitcode(sts) + if exitcode: + self.log_error(f"CGI script exit code {exitcode}") return # Child try: diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 5d9602e7..fd762077 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -1,13 +1,8 @@ -What's New in IDLE 3.8.6 -Released on 2020-09-14? +What's New in IDLE 3.9.0 (since 3.8.0) +Released on 2020-10-05? ====================================== -bpo-35764: Rewrite the Calltips doc section. - -bpo-40181: In calltips, stop reminding that '/' marks the end of -positional-only arguments. - bpo-41468: Improve IDLE run crash error message (which users should never see). @@ -15,19 +10,9 @@ bpo-41373: Save files loaded with no line ending, as when blank, or different line endings, by setting its line ending to the system default. Fix regression in 3.8.4 and 3.9.0b4. - -What's New in IDLE 3.8.5 -Released on 2020-07-20 -====================================== - bpo-41300: Save files with non-ascii chars. Fix regression in 3.9.0b4 and 3.8.4. - -What's New in IDLE 3.8.4 -Released on 2020-06-30 -====================================== - bpo-37765: Add keywords to module name completion list. Rewrite Completions section of IDLE doc. @@ -39,11 +24,6 @@ bpo-41144: Make Open Module open a special module such as os.path. bpo-40723: Make test_idle pass when run after import. Patch by Florian Dahlitz. - -What's New in IDLE 3.8.3 -Released on 2020-05-13 -====================================== - bpo-38689: IDLE will no longer freeze when inspect.signature fails when fetching a calltip. @@ -61,11 +41,6 @@ bpo-39781: Selecting code context lines no longer causes a jump. bpo-39663: Add tests for pyparse find_good_parse_start(). - -What's New in IDLE 3.8.2 -Released on 2020-02-17 -====================================== - bpo-39600: Remove duplicate font names from configuration list. bpo-38792: Close a shell calltip if a :exc:`KeyboardInterrupt` @@ -82,11 +57,6 @@ bpo-32989: Add tests for editor newline_and_indent_event method. Remove unneeded arguments and dead code from pyparse find_good_parse_start method. - -What's New in IDLE 3.8.1 -Released on 2019-12-18 -====================================== - bpo-38943: Fix autocomplete windows not always appearing on some systems. Patch by Johnny Najera. diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index b02f8720..d4092c78 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -118,6 +118,7 @@ _INDENT = ' '*4 # for wrapped signatures _first_param = re.compile(r'(?<=\()\w*\,?\s*') _default_callable_argspec = "See source or doc" _invalid_method = "invalid method signature" +_argument_positional = " # '/' marks preceding args as positional-only." def get_argspec(ob): '''Return a string describing the signature of a callable object, or ''. @@ -145,6 +146,9 @@ def get_argspec(ob): else: argspec = '' + if '/' in argspec and len(argspec) < _MAX_COLS - len(_argument_positional): + # Add explanation TODO remove after 3.7, before 3.9. + argspec += _argument_positional if isinstance(fob, type) and argspec == '()': # If fob has no argument, use default callable argspec. argspec = _default_callable_argspec diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 0edd3917..b2853cff 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -509,29 +509,26 @@ by typing ‘_’ after ‘.’, either before or after the box is opened.

    Calltips¶

    -

    A calltip is shown automatically when one types ( after the name -of an accessible function. A function name expression may include -dots and subscripts. A calltip remains until it is clicked, the cursor -is moved out of the argument area, or ) is typed. Whenever the -cursor is in the argument part of a definition, select Edit and “Show -Call Tip” on the menu or enter its shortcut to display a calltip.

    -

    The calltip consists of the function’s signature and docstring up to -the latter’s first blank line or the fifth non-blank line. (Some builtin -functions lack an accessible signature.) A ‘/’ or ‘*’ in the signature -indicates that the preceding or following arguments are passed by -position or name (keyword) only. Details are subject to change.

    -

    In Shell, the accessible functions depends on what modules have been -imported into the user process, including those imported by Idle itself, -and which definitions have been run, all since the last restart.

    +

    A calltip is shown when one types ( after the name of an accessible +function. A name expression may include dots and subscripts. A calltip +remains until it is clicked, the cursor is moved out of the argument area, +or ) is typed. When the cursor is in the argument part of a definition, +the menu or shortcut display a calltip.

    +

    A calltip consists of the function signature and the first line of the +docstring. For builtins without an accessible signature, the calltip +consists of all lines up the fifth line or the first blank line. These +details may change.

    +

    The set of accessible functions depends on what modules have been imported +into the user process, including those imported by Idle itself, +and what definitions have been run, all since the last restart.

    For example, restart the Shell and enter itertools.count(. A calltip -appears because Idle imports itertools into the user process for its own -use. (This could change.) Enter turtle.write( and nothing appears. -Idle does not itself import turtle. The menu entry and shortcut also do -nothing. Enter import turtle. Thereafter, turtle.write( -will display a calltip.

    -

    In an editor, import statements have no effect until one runs the file. -One might want to run a file after writing import statements, after -adding function definitions, or after opening an existing file.

    +appears because Idle imports itertools into the user process for its own use. +(This could change.) Enter turtle.write( and nothing appears. Idle does +not import turtle. The menu or shortcut do nothing either. Enter +import turtle and then turtle.write( will work.

    +

    In an editor, import statements have no effect until one runs the file. One +might want to run a file after writing the import statements at the top, +or immediately run an existing file before editing.

    Code Context¶

    @@ -978,7 +975,7 @@ also used for testing.



    - Last updated on Sep 22, 2020. + Last updated on Sep 09, 2020. Found a bug?
    diff --git a/Lib/idlelib/idle.bat b/Lib/idlelib/idle.bat old mode 100755 new mode 100644 diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index 4d53df17..d386b5cd 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -61,16 +61,18 @@ class Get_argspecTest(unittest.TestCase): if List.__doc__ is not None: tiptest(List, - f'(iterable=(), /)' + f'(iterable=(), /){calltip._argument_positional}' f'\n{List.__doc__}') tiptest(list.__new__, '(*args, **kwargs)\n' 'Create and return a new object. ' 'See help(type) for accurate signature.') tiptest(list.__init__, - '(self, /, *args, **kwargs)\n' + '(self, /, *args, **kwargs)' + + calltip._argument_positional + '\n' + 'Initialize self. See help(type(self)) for accurate signature.') - append_doc = "\nAppend object to the end of the list." + append_doc = (calltip._argument_positional + + "\nAppend object to the end of the list.") tiptest(list.append, '(self, object, /)' + append_doc) tiptest(List.append, '(self, object, /)' + append_doc) tiptest([].append, '(object, /)' + append_doc) diff --git a/Lib/idlelib/zzdummy.py b/Lib/idlelib/zzdummy.py index 80844996..3c4b1d23 100644 --- a/Lib/idlelib/zzdummy.py +++ b/Lib/idlelib/zzdummy.py @@ -28,7 +28,7 @@ class ZzDummy: text = self.text text.undo_block_start() for line in range(1, text.index('end')): - text.insert('%d.0', ztest) + text.insert('%d.0', ztext) text.undo_block_stop() return "break" diff --git a/Lib/imaplib.py b/Lib/imaplib.py index 822d9d6f..d9720f20 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -98,6 +98,7 @@ Commands = { 'THREAD': ('SELECTED',), 'UID': ('SELECTED',), 'UNSUBSCRIBE': ('AUTH', 'SELECTED'), + 'UNSELECT': ('SELECTED',), } # Patterns to match server responses @@ -135,10 +136,13 @@ class IMAP4: r"""IMAP4 client class. - Instantiate with: IMAP4([host[, port]]) + Instantiate with: IMAP4([host[, port[, timeout=None]]]) host - host's name (default: localhost); port - port number (default: standard IMAP4 port). + timeout - socket timeout (default: None) + If timeout is not given or is None, + the global default socket timeout is used All IMAP4rev1 commands are supported by methods of the same name (in lower-case). @@ -181,7 +185,7 @@ class IMAP4: class abort(error): pass # Service errors - close and retry class readonly(abort): pass # Mailbox status changed to READ-ONLY - def __init__(self, host='', port=IMAP4_PORT): + def __init__(self, host='', port=IMAP4_PORT, timeout=None): self.debug = Debug self.state = 'LOGOUT' self.literal = None # A literal argument to a command @@ -195,7 +199,7 @@ class IMAP4: # Open socket to server. - self.open(host, port) + self.open(host, port, timeout) try: self._connect() @@ -284,15 +288,20 @@ class IMAP4: # Overridable methods - def _create_socket(self): + def _create_socket(self, timeout): # Default value of IMAP4.host is '', but socket.getaddrinfo() # (which is used by socket.create_connection()) expects None # as a default value for host. + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') host = None if not self.host else self.host sys.audit("imaplib.open", self, self.host, self.port) - return socket.create_connection((host, self.port)) + address = (host, self.port) + if timeout is not None: + return socket.create_connection(address, timeout) + return socket.create_connection(address) - def open(self, host = '', port = IMAP4_PORT): + def open(self, host='', port=IMAP4_PORT, timeout=None): """Setup connection to remote server on "host:port" (default: localhost:standard IMAP4 port). This connection will be used by the routines: @@ -300,7 +309,7 @@ class IMAP4: """ self.host = host self.port = port - self.sock = self._create_socket() + self.sock = self._create_socket(timeout) self.file = self.sock.makefile('rb') @@ -502,7 +511,7 @@ class IMAP4: def enable(self, capability): """Send an RFC5161 enable string to the server. - (typ, [data]) = .enable(capability) + (typ, [data]) = .enable(capability) """ if 'ENABLE' not in self.capabilities: raise IMAP4.error("Server does not support ENABLE") @@ -894,6 +903,22 @@ class IMAP4: return self._simple_command('UNSUBSCRIBE', mailbox) + def unselect(self): + """Free server's resources associated with the selected mailbox + and returns the server to the authenticated state. + This command performs the same actions as CLOSE, except + that no messages are permanently removed from the currently + selected mailbox. + + (typ, [data]) = .unselect() + """ + try: + typ, data = self._simple_command('UNSELECT') + finally: + self.state = 'AUTH' + return typ, data + + def xatom(self, name, *args): """Allow simple extension commands notified by server in CAPABILITY response. @@ -1261,7 +1286,7 @@ if HAVE_SSL: """IMAP4 client class over SSL connection - Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context]]]]]) + Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context[, timeout=None]]]]]]) host - host's name (default: localhost); port - port number (default: standard IMAP4 SSL port); @@ -1271,13 +1296,15 @@ if HAVE_SSL: and private key (default: None) Note: if ssl_context is provided, then parameters keyfile or certfile should not be set otherwise ValueError is raised. + timeout - socket timeout (default: None) If timeout is not given or is None, + the global default socket timeout is used for more documentation see the docstring of the parent class IMAP4. """ def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None, - certfile=None, ssl_context=None): + certfile=None, ssl_context=None, timeout=None): if ssl_context is not None and keyfile is not None: raise ValueError("ssl_context and keyfile arguments are mutually " "exclusive") @@ -1294,20 +1321,20 @@ if HAVE_SSL: ssl_context = ssl._create_stdlib_context(certfile=certfile, keyfile=keyfile) self.ssl_context = ssl_context - IMAP4.__init__(self, host, port) + IMAP4.__init__(self, host, port, timeout) - def _create_socket(self): - sock = IMAP4._create_socket(self) + def _create_socket(self, timeout): + sock = IMAP4._create_socket(self, timeout) return self.ssl_context.wrap_socket(sock, server_hostname=self.host) - def open(self, host='', port=IMAP4_SSL_PORT): + def open(self, host='', port=IMAP4_SSL_PORT, timeout=None): """Setup connection to remote server on "host:port". (default: localhost:standard IMAP4 SSL port). This connection will be used by the routines: read, readline, send, shutdown. """ - IMAP4.open(self, host, port) + IMAP4.open(self, host, port, timeout) __all__.append("IMAP4_SSL") @@ -1329,7 +1356,7 @@ class IMAP4_stream(IMAP4): IMAP4.__init__(self) - def open(self, host = None, port = None): + def open(self, host=None, port=None, timeout=None): """Setup a stream connection. This connection will be used by the routines: read, readline, send, shutdown. diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 32deef10..e00b27ec 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -67,6 +67,7 @@ class _ModuleLock: # Deadlock avoidance for concurrent circular imports. me = _thread.get_ident() tid = self.owner + seen = set() while True: lock = _blocking_on.get(tid) if lock is None: @@ -74,6 +75,14 @@ class _ModuleLock: tid = lock.owner if tid == me: return True + if tid in seen: + # bpo 38091: the chain of tid's we encounter here + # eventually leads to a fixpoint or a cycle, but + # does not reach 'me'. This means we would not + # actually deadlock. This can happen if other + # threads are at the beginning of acquire() below. + return False + seen.add(tid) def acquire(self): """ @@ -371,7 +380,7 @@ class ModuleSpec: self.cached == other.cached and self.has_location == other.has_location) except AttributeError: - return False + return NotImplemented @property def cached(self): @@ -713,6 +722,8 @@ class BuiltinImporter: """ + _ORIGIN = "built-in" + @staticmethod def module_repr(module): """Return repr for the module. @@ -720,14 +731,14 @@ class BuiltinImporter: The method is deprecated. The import machinery does the job itself. """ - return ''.format(module.__name__) + return f'' @classmethod def find_spec(cls, fullname, path=None, target=None): if path is not None: return None if _imp.is_builtin(fullname): - return spec_from_loader(fullname, cls, origin='built-in') + return spec_from_loader(fullname, cls, origin=cls._ORIGIN) else: return None @@ -873,7 +884,7 @@ def _resolve_name(name, package, level): """Resolve a relative module name to an absolute one.""" bits = package.rsplit('.', level - 1) if len(bits) < level: - raise ValueError('attempted relative import beyond top-level package') + raise ImportError('attempted relative import beyond top-level package') base = bits[0] return '{}.{}'.format(base, name) if name else base @@ -976,7 +987,12 @@ def _find_and_load_unlocked(name, import_): if parent: # Set the module as an attribute on its parent. parent_module = sys.modules[parent] - setattr(parent_module, name.rpartition('.')[2], module) + child = name.rpartition('.')[2] + try: + setattr(parent_module, child, module) + except AttributeError: + msg = f"Cannot set an attribute on {parent!r} for child module {child!r}" + _warnings.warn(msg, ImportWarning) return module diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index b8ac4829..25a3f8c0 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -34,8 +34,8 @@ def _make_relax_case(): key = b'PYTHONCASEOK' def _relax_case(): - """True if filenames must be checked case-insensitively.""" - return key in _os.environ + """True if filenames must be checked case-insensitively and ignore environment flags are not set.""" + return not sys.flags.ignore_environment and key in _os.environ else: def _relax_case(): """True if filenames must be checked case-insensitively.""" @@ -271,6 +271,13 @@ _code_type = type(_write_atomic.__code__) # Python 3.8b2 3412 (Swap the position of positional args and positional # only args in ast.arguments #37593) # Python 3.8b4 3413 (Fix "break" and "continue" in "finally" #37830) +# Python 3.9a0 3420 (add LOAD_ASSERTION_ERROR #34880) +# Python 3.9a0 3421 (simplified bytecode for with blocks #32949) +# Python 3.9a0 3422 (remove BEGIN_FINALLY, END_FINALLY, CALL_FINALLY, POP_FINALLY bytecodes #33387) +# Python 3.9a2 3423 (add IS_OP, CONTAINS_OP and JUMP_IF_NOT_EXC_MATCH bytecodes #39156) +# Python 3.9a2 3424 (simplify bytecodes for *value unpacking) +# Python 3.9a2 3425 (simplify bytecodes for **value unpacking) + # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually @@ -279,7 +286,7 @@ _code_type = type(_write_atomic.__code__) # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3413).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3425).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' @@ -709,9 +716,9 @@ class WindowsRegistryFinder: @classmethod def _open_registry(cls, key): try: - return _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, key) + return winreg.OpenKey(winreg.HKEY_CURRENT_USER, key) except OSError: - return _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key) + return winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key) @classmethod def _search_registry(cls, fullname): @@ -723,7 +730,7 @@ class WindowsRegistryFinder: sys_version='%d.%d' % sys.version_info[:2]) try: with cls._open_registry(key) as hkey: - filepath = _winreg.QueryValue(hkey, '') + filepath = winreg.QueryValue(hkey, '') except OSError: return None return filepath @@ -1577,14 +1584,7 @@ def _setup(_bootstrap_module): sys = _bootstrap.sys _imp = _bootstrap._imp - # Directly load built-in modules needed during bootstrap. self_module = sys.modules[__name__] - for builtin_name in ('_io', '_warnings', 'builtins', 'marshal'): - if builtin_name not in sys.modules: - builtin_module = _bootstrap._builtin_from_name(builtin_name) - else: - builtin_module = sys.modules[builtin_name] - setattr(self_module, builtin_name, builtin_module) # Directly load the os module (needed during bootstrap). os_details = ('posix', ['/']), ('nt', ['\\', '/']) @@ -1603,23 +1603,22 @@ def _setup(_bootstrap_module): continue else: raise ImportError('importlib requires posix or nt') + setattr(self_module, '_os', os_module) setattr(self_module, 'path_sep', path_sep) setattr(self_module, 'path_separators', ''.join(path_separators)) setattr(self_module, '_pathseps_with_colon', {f':{s}' for s in path_separators}) - # Directly load the _thread module (needed during bootstrap). - thread_module = _bootstrap._builtin_from_name('_thread') - setattr(self_module, '_thread', thread_module) - - # Directly load the _weakref module (needed during bootstrap). - weakref_module = _bootstrap._builtin_from_name('_weakref') - setattr(self_module, '_weakref', weakref_module) - - # Directly load the winreg module (needed during bootstrap). + # Directly load built-in modules needed during bootstrap. + builtin_names = ['_io', '_warnings', 'marshal'] if builtin_os == 'nt': - winreg_module = _bootstrap._builtin_from_name('winreg') - setattr(self_module, '_winreg', winreg_module) + builtin_names.append('winreg') + for builtin_name in builtin_names: + if builtin_name not in sys.modules: + builtin_module = _bootstrap._builtin_from_name(builtin_name) + else: + builtin_module = sys.modules[builtin_name] + setattr(self_module, builtin_name, builtin_module) # Constants setattr(self_module, '_relax_case', _make_relax_case()) diff --git a/Lib/importlib/_common.py b/Lib/importlib/_common.py new file mode 100644 index 00000000..c1204f0b --- /dev/null +++ b/Lib/importlib/_common.py @@ -0,0 +1,62 @@ +import os +import pathlib +import zipfile +import tempfile +import functools +import contextlib + + +def from_package(package): + """ + Return a Traversable object for the given package. + + """ + return fallback_resources(package.__spec__) + + +def fallback_resources(spec): + package_directory = pathlib.Path(spec.origin).parent + try: + archive_path = spec.loader.archive + rel_path = package_directory.relative_to(archive_path) + return zipfile.Path(archive_path, str(rel_path) + '/') + except Exception: + pass + return package_directory + + +@contextlib.contextmanager +def _tempfile(reader, suffix=''): + # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try' + # blocks due to the need to close the temporary file to work on Windows + # properly. + fd, raw_path = tempfile.mkstemp(suffix=suffix) + try: + os.write(fd, reader()) + os.close(fd) + yield pathlib.Path(raw_path) + finally: + try: + os.remove(raw_path) + except FileNotFoundError: + pass + + +@functools.singledispatch +@contextlib.contextmanager +def as_file(path): + """ + Given a Traversable object, return that object as a + path on the local file system in a context manager. + """ + with _tempfile(path.read_bytes, suffix=path.name) as local: + yield local + + +@as_file.register(pathlib.Path) +@contextlib.contextmanager +def _(path): + """ + Degenerate behavior for pathlib.Path objects. + """ + yield path diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py index 4b2d3de6..b8a9bb1a 100644 --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -10,10 +10,11 @@ except ImportError as exc: _frozen_importlib = None try: import _frozen_importlib_external -except ImportError as exc: +except ImportError: _frozen_importlib_external = _bootstrap_external import abc import warnings +from typing import Protocol, runtime_checkable def _register(abstract_cls, *classes): @@ -386,3 +387,88 @@ class ResourceReader(metaclass=abc.ABCMeta): _register(ResourceReader, machinery.SourceFileLoader) + + +@runtime_checkable +class Traversable(Protocol): + """ + An object with a subset of pathlib.Path methods suitable for + traversing directories and opening files. + """ + + @abc.abstractmethod + def iterdir(self): + """ + Yield Traversable objects in self + """ + + @abc.abstractmethod + def read_bytes(self): + """ + Read contents of self as bytes + """ + + @abc.abstractmethod + def read_text(self, encoding=None): + """ + Read contents of self as bytes + """ + + @abc.abstractmethod + def is_dir(self): + """ + Return True if self is a dir + """ + + @abc.abstractmethod + def is_file(self): + """ + Return True if self is a file + """ + + @abc.abstractmethod + def joinpath(self, child): + """ + Return Traversable child in self + """ + + @abc.abstractmethod + def __truediv__(self, child): + """ + Return Traversable child in self + """ + + @abc.abstractmethod + def open(self, mode='r', *args, **kwargs): + """ + mode may be 'r' or 'rb' to open as text or binary. Return a handle + suitable for reading (same as pathlib.Path.open). + + When opening as text, accepts encoding parameters such as those + accepted by io.TextIOWrapper. + """ + + @abc.abstractproperty + def name(self): + # type: () -> str + """ + The base name of this object without any parent references. + """ + + +class TraversableResources(ResourceReader): + @abc.abstractmethod + def files(self): + """Return a Traversable object for the loaded package.""" + + def open_resource(self, resource): + return self.files().joinpath(resource).open('rb') + + def resource_path(self, resource): + raise FileNotFoundError(resource) + + def is_resource(self, path): + return self.files().joinpath(path).isfile() + + def contents(self): + return (item.name for item in self.files().iterdir()) diff --git a/Lib/importlib/metadata.py b/Lib/importlib/metadata.py index 831f5932..ffa0cba4 100644 --- a/Lib/importlib/metadata.py +++ b/Lib/importlib/metadata.py @@ -78,6 +78,16 @@ class EntryPoint( attrs = filter(None, (match.group('attr') or '').split('.')) return functools.reduce(getattr, attrs, module) + @property + def module(self): + match = self.pattern.match(self.value) + return match.group('module') + + @property + def attr(self): + match = self.pattern.match(self.value) + return match.group('attr') + @property def extras(self): match = self.pattern.match(self.value) @@ -170,7 +180,7 @@ class Distribution: """ for resolver in cls._discover_resolvers(): dists = resolver(DistributionFinder.Context(name=name)) - dist = next(dists, None) + dist = next(iter(dists), None) if dist is not None: return dist else: @@ -213,6 +223,17 @@ class Distribution: ) return filter(None, declared) + @classmethod + def _local(cls, root='.'): + from pep517 import build, meta + system = build.compat_system(root) + builder = functools.partial( + meta.build, + source_dir=root, + system=system, + ) + return PathDistribution(zipfile.Path(meta.build_as_zip(builder))) + @property def metadata(self): """Return the parsed metadata for this Distribution. @@ -391,7 +412,7 @@ class FastPath: def __init__(self, root): self.root = root - self.base = os.path.basename(root).lower() + self.base = os.path.basename(self.root).lower() def joinpath(self, child): return pathlib.Path(self.root, child) @@ -408,8 +429,8 @@ class FastPath: names = zip_path.root.namelist() self.joinpath = zip_path.joinpath - return ( - posixpath.split(child)[0] + return dict.fromkeys( + child.split(posixpath.sep, 1)[0] for child in names ) @@ -475,7 +496,6 @@ class MetadataPathFinder(DistributionFinder): ) - class PathDistribution(Distribution): def __init__(self, path): """Construct a distribution from a path to the metadata directory. diff --git a/Lib/importlib/resources.py b/Lib/importlib/resources.py index fc3a1c9c..b803a01c 100644 --- a/Lib/importlib/resources.py +++ b/Lib/importlib/resources.py @@ -1,23 +1,25 @@ import os -import tempfile from . import abc as resources_abc +from . import _common +from ._common import as_file from contextlib import contextmanager, suppress from importlib import import_module from importlib.abc import ResourceLoader from io import BytesIO, TextIOWrapper from pathlib import Path from types import ModuleType -from typing import Iterable, Iterator, Optional, Set, Union # noqa: F401 +from typing import ContextManager, Iterable, Optional, Union from typing import cast from typing.io import BinaryIO, TextIO -from zipimport import ZipImportError __all__ = [ 'Package', 'Resource', + 'as_file', 'contents', + 'files', 'is_resource', 'open_binary', 'open_text', @@ -31,24 +33,23 @@ Package = Union[str, ModuleType] Resource = Union[str, os.PathLike] +def _resolve(name) -> ModuleType: + """If name is a string, resolve to a module.""" + if hasattr(name, '__spec__'): + return name + return import_module(name) + + def _get_package(package) -> ModuleType: """Take a package name or module object and return the module. - If a name, the module is imported. If the passed or imported module + If a name, the module is imported. If the resolved module object is not a package, raise an exception. """ - if hasattr(package, '__spec__'): - if package.__spec__.submodule_search_locations is None: - raise TypeError('{!r} is not a package'.format( - package.__spec__.name)) - else: - return package - else: - module = import_module(package) - if module.__spec__.submodule_search_locations is None: - raise TypeError('{!r} is not a package'.format(package)) - else: - return module + module = _resolve(package) + if module.__spec__.submodule_search_locations is None: + raise TypeError('{!r} is not a package'.format(package)) + return module def _normalize_path(path) -> str: @@ -59,8 +60,7 @@ def _normalize_path(path) -> str: parent, file_name = os.path.split(path) if parent: raise ValueError('{!r} must be only a file name'.format(path)) - else: - return file_name + return file_name def _get_resource_reader( @@ -89,8 +89,8 @@ def open_binary(package: Package, resource: Resource) -> BinaryIO: reader = _get_resource_reader(package) if reader is not None: return reader.open_resource(resource) - _check_location(package) - absolute_package_path = os.path.abspath(package.__spec__.origin) + absolute_package_path = os.path.abspath( + package.__spec__.origin or 'non-existent file') package_path = os.path.dirname(absolute_package_path) full_path = os.path.join(package_path, resource) try: @@ -109,8 +109,7 @@ def open_binary(package: Package, resource: Resource) -> BinaryIO: message = '{!r} resource not found in {!r}'.format( resource, package_name) raise FileNotFoundError(message) - else: - return BytesIO(data) + return BytesIO(data) def open_text(package: Package, @@ -118,39 +117,12 @@ def open_text(package: Package, encoding: str = 'utf-8', errors: str = 'strict') -> TextIO: """Return a file-like object opened for text reading of the resource.""" - resource = _normalize_path(resource) - package = _get_package(package) - reader = _get_resource_reader(package) - if reader is not None: - return TextIOWrapper(reader.open_resource(resource), encoding, errors) - _check_location(package) - absolute_package_path = os.path.abspath(package.__spec__.origin) - package_path = os.path.dirname(absolute_package_path) - full_path = os.path.join(package_path, resource) - try: - return open(full_path, mode='r', encoding=encoding, errors=errors) - except OSError: - # Just assume the loader is a resource loader; all the relevant - # importlib.machinery loaders are and an AttributeError for - # get_data() will make it clear what is needed from the loader. - loader = cast(ResourceLoader, package.__spec__.loader) - data = None - if hasattr(package.__spec__.loader, 'get_data'): - with suppress(OSError): - data = loader.get_data(full_path) - if data is None: - package_name = package.__spec__.name - message = '{!r} resource not found in {!r}'.format( - resource, package_name) - raise FileNotFoundError(message) - else: - return TextIOWrapper(BytesIO(data), encoding, errors) + return TextIOWrapper( + open_binary(package, resource), encoding=encoding, errors=errors) def read_binary(package: Package, resource: Resource) -> bytes: """Return the binary contents of the resource.""" - resource = _normalize_path(resource) - package = _get_package(package) with open_binary(package, resource) as fp: return fp.read() @@ -164,14 +136,20 @@ def read_text(package: Package, The decoding-related arguments have the same semantics as those of bytes.decode(). """ - resource = _normalize_path(resource) - package = _get_package(package) with open_text(package, resource, encoding, errors) as fp: return fp.read() -@contextmanager -def path(package: Package, resource: Resource) -> Iterator[Path]: +def files(package: Package) -> resources_abc.Traversable: + """ + Get a Traversable resource from a package + """ + return _common.from_package(_get_package(package)) + + +def path( + package: Package, resource: Resource, + ) -> 'ContextManager[Path]': """A context manager providing a file path object to the resource. If the resource does not already exist on its own on the file system, @@ -180,39 +158,23 @@ def path(package: Package, resource: Resource) -> Iterator[Path]: raised if the file was deleted prior to the context manager exiting). """ - resource = _normalize_path(resource) - package = _get_package(package) - reader = _get_resource_reader(package) - if reader is not None: - try: - yield Path(reader.resource_path(resource)) - return - except FileNotFoundError: - pass - else: - _check_location(package) - # Fall-through for both the lack of resource_path() *and* if - # resource_path() raises FileNotFoundError. - package_directory = Path(package.__spec__.origin).parent - file_path = package_directory / resource - if file_path.exists(): - yield file_path - else: - with open_binary(package, resource) as fp: - data = fp.read() - # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try' - # blocks due to the need to close the temporary file to work on - # Windows properly. - fd, raw_path = tempfile.mkstemp() - try: - os.write(fd, data) - os.close(fd) - yield Path(raw_path) - finally: - try: - os.remove(raw_path) - except FileNotFoundError: - pass + reader = _get_resource_reader(_get_package(package)) + return ( + _path_from_reader(reader, resource) + if reader else + _common.as_file(files(package).joinpath(_normalize_path(resource))) + ) + + +@contextmanager +def _path_from_reader(reader, resource): + norm_resource = _normalize_path(resource) + with suppress(FileNotFoundError): + yield Path(reader.resource_path(norm_resource)) + return + opener_reader = reader.open_resource(norm_resource) + with _common._tempfile(opener_reader.read, suffix=norm_resource) as res: + yield res def is_resource(package: Package, name: str) -> bool: @@ -225,17 +187,10 @@ def is_resource(package: Package, name: str) -> bool: reader = _get_resource_reader(package) if reader is not None: return reader.is_resource(name) - try: - package_contents = set(contents(package)) - except (NotADirectoryError, FileNotFoundError): - return False + package_contents = set(contents(package)) if name not in package_contents: return False - # Just because the given file_name lives as an entry in the package's - # contents doesn't necessarily mean it's a resource. Directories are not - # resources, so let's try to find out if it's a directory or not. - path = Path(package.__spec__.origin).parent / name - return path.is_file() + return (_common.from_package(package) / name).is_file() def contents(package: Package) -> Iterable[str]: @@ -250,10 +205,11 @@ def contents(package: Package) -> Iterable[str]: if reader is not None: return reader.contents() # Is the package a namespace package? By definition, namespace packages - # cannot have resources. We could use _check_location() and catch the - # exception, but that's extra work, so just inline the check. - elif package.__spec__.origin is None or not package.__spec__.has_location: + # cannot have resources. + namespace = ( + package.__spec__.origin is None or + package.__spec__.origin == 'namespace' + ) + if namespace or not package.__spec__.has_location: return () - else: - package_directory = Path(package.__spec__.origin).parent - return os.listdir(package_directory) + return list(item.name for item in _common.from_package(package).iterdir()) diff --git a/Lib/importlib/util.py b/Lib/importlib/util.py index 201e0f4c..269a6fa9 100644 --- a/Lib/importlib/util.py +++ b/Lib/importlib/util.py @@ -29,8 +29,8 @@ def resolve_name(name, package): if not name.startswith('.'): return name elif not package: - raise ValueError(f'no package specified for {repr(name)} ' - '(required for relative module names)') + raise ImportError(f'no package specified for {repr(name)} ' + '(required for relative module names)') level = 0 for character in name: if character != '.': diff --git a/Lib/inspect.py b/Lib/inspect.py index e8ea8c22..887a3424 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -32,6 +32,7 @@ __author__ = ('Ka-Ping Yee ', 'Yury Selivanov ') import abc +import ast import dis import collections.abc import enum @@ -769,6 +770,42 @@ def getmodule(object, _filename=None): if builtinobject is object: return builtin + +class ClassFoundException(Exception): + pass + + +class _ClassFinder(ast.NodeVisitor): + + def __init__(self, qualname): + self.stack = [] + self.qualname = qualname + + def visit_FunctionDef(self, node): + self.stack.append(node.name) + self.stack.append('') + self.generic_visit(node) + self.stack.pop() + self.stack.pop() + + visit_AsyncFunctionDef = visit_FunctionDef + + def visit_ClassDef(self, node): + self.stack.append(node.name) + if self.qualname == '.'.join(self.stack): + # Return the decorator for the class if present + if node.decorator_list: + line_number = node.decorator_list[0].lineno + else: + line_number = node.lineno + + # decrement by one since lines starts with indexing by zero + line_number -= 1 + raise ClassFoundException(line_number) + self.generic_visit(node) + self.stack.pop() + + def findsource(object): """Return the entire source file and starting line number for an object. @@ -801,25 +838,15 @@ def findsource(object): return lines, 0 if isclass(object): - name = object.__name__ - pat = re.compile(r'^(\s*)class\s*' + name + r'\b') - # make some effort to find the best matching class definition: - # use the one with the least indentation, which is the one - # that's most probably not inside a function definition. - candidates = [] - for i in range(len(lines)): - match = pat.match(lines[i]) - if match: - # if it's at toplevel, it's already the best one - if lines[i][0] == 'c': - return lines, i - # else add whitespace to candidate list - candidates.append((match.group(1), i)) - if candidates: - # this will sort by whitespace, and by line number, - # less whitespace first - candidates.sort() - return lines, candidates[0][1] + qualname = object.__qualname__ + source = ''.join(lines) + tree = ast.parse(source) + class_finder = _ClassFinder(qualname) + try: + class_finder.visit(tree) + except ClassFoundException as e: + line_number = e.args[0] + return lines, line_number else: raise OSError('could not find class definition') @@ -1136,7 +1163,6 @@ def getfullargspec(func): varkw = None posonlyargs = [] kwonlyargs = [] - defaults = () annotations = {} defaults = () kwdefaults = {} @@ -2603,7 +2629,7 @@ class BoundArguments: Has the following public attributes: - * arguments : OrderedDict + * arguments : dict An ordered mutable mapping of parameters' names to arguments' values. Does not contain arguments' default values. * signature : Signature @@ -2703,7 +2729,7 @@ class BoundArguments: # Signature.bind_partial(). continue new_arguments.append((name, val)) - self.arguments = OrderedDict(new_arguments) + self.arguments = dict(new_arguments) def __eq__(self, other): if self is other: @@ -2771,7 +2797,7 @@ class Signature: top_kind = _POSITIONAL_ONLY kind_defaults = False - for idx, param in enumerate(parameters): + for param in parameters: kind = param.kind name = param.name @@ -2806,8 +2832,7 @@ class Signature: params[name] = param else: - params = OrderedDict(((param.name, param) - for param in parameters)) + params = OrderedDict((param.name, param) for param in parameters) self._parameters = types.MappingProxyType(params) self._return_annotation = return_annotation @@ -2889,7 +2914,7 @@ class Signature: def _bind(self, args, kwargs, *, partial=False): """Private method. Don't use directly.""" - arguments = OrderedDict() + arguments = {} parameters = iter(self.parameters.values()) parameters_ex = () diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index 1014eba5..bc662c41 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -560,6 +560,8 @@ class _IPAddressBase: return self.__class__, (str(self),) +_address_fmt_re = None + @functools.total_ordering class _BaseAddress(_IPAddressBase): @@ -618,6 +620,55 @@ class _BaseAddress(_IPAddressBase): def __reduce__(self): return self.__class__, (self._ip,) + def __format__(self, fmt): + """Returns an IP address as a formatted string. + + Supported presentation types are: + 's': returns the IP address as a string (default) + 'b': converts to binary and returns a zero-padded string + 'X' or 'x': converts to upper- or lower-case hex and returns a zero-padded string + 'n': the same as 'b' for IPv4 and 'x' for IPv6 + + For binary and hex presentation types, the alternate form specifier + '#' and the grouping option '_' are supported. + """ + + # Support string formatting + if not fmt or fmt[-1] == 's': + return format(str(self), fmt) + + # From here on down, support for 'bnXx' + global _address_fmt_re + if _address_fmt_re is None: + import re + _address_fmt_re = re.compile('(#?)(_?)([xbnX])') + + m = _address_fmt_re.fullmatch(fmt) + if not m: + return super().__format__(fmt) + + alternate, grouping, fmt_base = m.groups() + + # Set some defaults + if fmt_base == 'n': + if self._version == 4: + fmt_base = 'b' # Binary is default for ipv4 + else: + fmt_base = 'x' # Hex is default for ipv6 + + if fmt_base == 'b': + padlen = self._max_prefixlen + else: + padlen = self._max_prefixlen // 4 + + if grouping: + padlen += padlen // 4 - 1 + + if alternate: + padlen += 2 # 0b or 0x + + return format(int(self), f'{alternate}0{padlen}{grouping}{fmt_base}') + @functools.total_ordering class _BaseNetwork(_IPAddressBase): @@ -1073,7 +1124,6 @@ class _BaseNetwork(_IPAddressBase): return (self.network_address.is_loopback and self.broadcast_address.is_loopback) - class _BaseV4: """Base IPv4 object. @@ -1347,7 +1397,7 @@ class IPv4Interface(IPv4Address): def __eq__(self, other): address_equal = IPv4Address.__eq__(self, other) - if not address_equal or address_equal is NotImplemented: + if address_equal is NotImplemented or not address_equal: return address_equal try: return self.network == other.network @@ -1458,6 +1508,8 @@ class IPv4Network(_BaseV4, _BaseNetwork): if self._prefixlen == (self._max_prefixlen - 1): self.hosts = self.__iter__ + elif self._prefixlen == (self._max_prefixlen): + self.hosts = lambda: [IPv4Address(addr)] @property @functools.lru_cache() @@ -1785,6 +1837,26 @@ class _BaseV6: reverse_chars = self.exploded[::-1].replace(':', '') return '.'.join(reverse_chars) + '.ip6.arpa' + @staticmethod + def _split_scope_id(ip_str): + """Helper function to parse IPv6 string address with scope id. + + See RFC 4007 for details. + + Args: + ip_str: A string, the IPv6 address. + + Returns: + (addr, scope_id) tuple. + + """ + addr, sep, scope_id = ip_str.partition('%') + if not sep: + scope_id = None + elif not scope_id or '%' in scope_id: + raise AddressValueError('Invalid IPv6 address: "%r"' % ip_str) + return addr, scope_id + @property def max_prefixlen(self): return self._max_prefixlen @@ -1798,7 +1870,7 @@ class IPv6Address(_BaseV6, _BaseAddress): """Represent and manipulate single IPv6 Addresses.""" - __slots__ = ('_ip', '__weakref__') + __slots__ = ('_ip', '_scope_id', '__weakref__') def __init__(self, address): """Instantiate a new IPv6 address object. @@ -1821,12 +1893,14 @@ class IPv6Address(_BaseV6, _BaseAddress): if isinstance(address, int): self._check_int_address(address) self._ip = address + self._scope_id = None return # Constructing from a packed address if isinstance(address, bytes): self._check_packed_address(address, 16) self._ip = int.from_bytes(address, 'big') + self._scope_id = None return # Assume input argument to be string or any object representation @@ -1834,8 +1908,37 @@ class IPv6Address(_BaseV6, _BaseAddress): addr_str = str(address) if '/' in addr_str: raise AddressValueError("Unexpected '/' in %r" % address) + addr_str, self._scope_id = self._split_scope_id(addr_str) + self._ip = self._ip_int_from_string(addr_str) + def __str__(self): + ip_str = super().__str__() + return ip_str + '%' + self._scope_id if self._scope_id else ip_str + + def __hash__(self): + return hash((self._ip, self._scope_id)) + + def __eq__(self, other): + address_equal = super().__eq__(other) + if address_equal is NotImplemented: + return NotImplemented + if not address_equal: + return False + return self._scope_id == getattr(other, '_scope_id', None) + + @property + def scope_id(self): + """Identifier of a particular zone of the address's scope. + + See RFC 4007 for details. + + Returns: + A string identifying the zone of the address if specified, else None. + + """ + return self._scope_id + @property def packed(self): """The binary representation of this address.""" @@ -1989,12 +2092,12 @@ class IPv6Interface(IPv6Address): return self.network.hostmask def __str__(self): - return '%s/%d' % (self._string_from_ip_int(self._ip), + return '%s/%d' % (super().__str__(), self._prefixlen) def __eq__(self, other): address_equal = IPv6Address.__eq__(self, other) - if not address_equal or address_equal is NotImplemented: + if address_equal is NotImplemented or not address_equal: return address_equal try: return self.network == other.network @@ -2007,7 +2110,7 @@ class IPv6Interface(IPv6Address): def __lt__(self, other): address_less = IPv6Address.__lt__(self, other) if address_less is NotImplemented: - return NotImplemented + return address_less try: return (self.network < other.network or self.network == other.network and address_less) @@ -2110,6 +2213,8 @@ class IPv6Network(_BaseV6, _BaseNetwork): if self._prefixlen == (self._max_prefixlen - 1): self.hosts = self.__iter__ + elif self._prefixlen == self._max_prefixlen: + self.hosts = lambda: [IPv6Address(addr)] def hosts(self): """Generate Iterator over usable hosts in a network. diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py index 1ba8b48b..2c52bdeb 100644 --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -329,8 +329,6 @@ def loads(s, *, cls=None, object_hook=None, parse_float=None, To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` kwarg; otherwise ``JSONDecoder`` is used. - - The ``encoding`` argument is ignored and deprecated since Python 3.1. """ if isinstance(s, str): if s.startswith('\ufeff'): @@ -342,15 +340,6 @@ def loads(s, *, cls=None, object_hook=None, parse_float=None, f'not {s.__class__.__name__}') s = s.decode(detect_encoding(s), 'surrogatepass') - if "encoding" in kw: - import warnings - warnings.warn( - "'encoding' is ignored and deprecated. It will be removed in Python 3.9", - DeprecationWarning, - stacklevel=2 - ) - del kw['encoding'] - if (cls is None and object_hook is None and parse_int is None and parse_float is None and parse_constant is None and object_pairs_hook is None and not kw): diff --git a/Lib/json/tool.py b/Lib/json/tool.py index c42138a0..5dee0a74 100644 --- a/Lib/json/tool.py +++ b/Lib/json/tool.py @@ -30,22 +30,42 @@ def main(): default=sys.stdout) parser.add_argument('--sort-keys', action='store_true', default=False, help='sort the output of dictionaries alphabetically by key') + parser.add_argument('--no-ensure-ascii', dest='ensure_ascii', action='store_false', + help='disable escaping of non-ASCII characters') parser.add_argument('--json-lines', action='store_true', default=False, - help='parse input using the jsonlines format') + help='parse input using the JSON Lines format. ' + 'Use with --no-indent or --compact to produce valid JSON Lines output.') + group = parser.add_mutually_exclusive_group() + group.add_argument('--indent', default=4, type=int, + help='separate items with newlines and use this number ' + 'of spaces for indentation') + group.add_argument('--tab', action='store_const', dest='indent', + const='\t', help='separate items with newlines and use ' + 'tabs for indentation') + group.add_argument('--no-indent', action='store_const', dest='indent', + const=None, + help='separate items with spaces rather than newlines') + group.add_argument('--compact', action='store_true', + help='suppress all whitespace separation (most compact)') options = parser.parse_args() - infile = options.infile - outfile = options.outfile - sort_keys = options.sort_keys - json_lines = options.json_lines - with infile, outfile: + dump_args = { + 'sort_keys': options.sort_keys, + 'indent': options.indent, + 'ensure_ascii': options.ensure_ascii, + } + if options.compact: + dump_args['indent'] = None + dump_args['separators'] = ',', ':' + + with options.infile as infile, options.outfile as outfile: try: - if json_lines: + if options.json_lines: objs = (json.loads(line) for line in infile) else: objs = (json.load(infile), ) for obj in objs: - json.dump(obj, outfile, sort_keys=sort_keys, indent=4) + json.dump(obj, outfile, **dump_args) outfile.write('\n') except ValueError as e: raise SystemExit(e) diff --git a/Lib/keyword.py b/Lib/keyword.py index ddcbb25d..59fcfb0f 100644 --- a/Lib/keyword.py +++ b/Lib/keyword.py @@ -1,23 +1,25 @@ -"""Keywords (from "Grammar/Grammar") +"""Keywords (from "Grammar/python.gram") This file is automatically generated; please don't muck it up! To update the symbols in this file, 'cd' to the top directory of the python source tree and run: - python3 -m Parser.pgen.keywordgen Grammar/Grammar \ - Grammar/Tokens \ - Lib/keyword.py + PYTHONPATH=Tools/peg_generator python3 -m pegen.keywordgen \ + Grammar/Grammar \ + Grammar/Tokens \ + Lib/keyword.py Alternatively, you can run 'make regen-keyword'. """ -__all__ = ["iskeyword", "kwlist"] +__all__ = ["iskeyword", "issoftkeyword", "kwlist", "softkwlist"] kwlist = [ 'False', 'None', 'True', + '__peg_parser__', 'and', 'as', 'assert', @@ -52,4 +54,9 @@ kwlist = [ 'yield' ] +softkwlist = [ + +] + iskeyword = frozenset(kwlist).__contains__ +issoftkeyword = frozenset(softkwlist).__contains__ diff --git a/Lib/lib2to3/Grammar.txt b/Lib/lib2to3/Grammar.txt index 8ce7fd8a..e007dc18 100644 --- a/Lib/lib2to3/Grammar.txt +++ b/Lib/lib2to3/Grammar.txt @@ -49,7 +49,7 @@ pass_stmt: 'pass' flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt break_stmt: 'break' continue_stmt: 'continue' -return_stmt: 'return' [testlist] +return_stmt: 'return' [testlist_star_expr] yield_stmt: yield_expr raise_stmt: 'raise' [test ['from' test | ',' test [',' test]]] import_stmt: import_name | import_from @@ -153,4 +153,4 @@ testlist1: test (',' test)* encoding_decl: NAME yield_expr: 'yield' [yield_arg] -yield_arg: 'from' test | testlist +yield_arg: 'from' test | testlist_star_expr diff --git a/Lib/lib2to3/__init__.py b/Lib/lib2to3/__init__.py index ea30561d..4224dffe 100644 --- a/Lib/lib2to3/__init__.py +++ b/Lib/lib2to3/__init__.py @@ -1 +1,8 @@ -#empty +import warnings + + +warnings.warn( + "lib2to3 package is deprecated and may not be able to parse Python 3.10+", + PendingDeprecationWarning, + stacklevel=2, +) diff --git a/Lib/lib2to3/fixer_util.py b/Lib/lib2to3/fixer_util.py index babe6cb3..c2a3a47f 100644 --- a/Lib/lib2to3/fixer_util.py +++ b/Lib/lib2to3/fixer_util.py @@ -412,7 +412,7 @@ def _find(name, node): return None def _is_import_binding(node, name, package=None): - """ Will reuturn node if node will import name, or node + """ Will return node if node will import name, or node will import * from package. None is returned otherwise. See test cases for examples. """ diff --git a/Lib/lib2to3/fixes/fix_urllib.py b/Lib/lib2to3/fixes/fix_urllib.py index 5a36049d..ab892bc5 100644 --- a/Lib/lib2to3/fixes/fix_urllib.py +++ b/Lib/lib2to3/fixes/fix_urllib.py @@ -13,7 +13,7 @@ MAPPING = {"urllib": [ ("urllib.request", ["URLopener", "FancyURLopener", "urlretrieve", "_urlopener", "urlopen", "urlcleanup", - "pathname2url", "url2pathname"]), + "pathname2url", "url2pathname", "getproxies"]), ("urllib.parse", ["quote", "quote_plus", "unquote", "unquote_plus", "urlencode", "splitattr", "splithost", "splitnport", diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py index d6b70884..f2849fd6 100644 --- a/Lib/lib2to3/main.py +++ b/Lib/lib2to3/main.py @@ -90,11 +90,11 @@ class StdoutRefactoringTool(refactor.MultiprocessRefactoringTool): if os.path.lexists(backup): try: os.remove(backup) - except OSError as err: + except OSError: self.log_message("Can't remove backup %s", backup) try: os.rename(filename, backup) - except OSError as err: + except OSError: self.log_message("Can't rename %s to %s", filename, backup) # Actually write the new file write = super(StdoutRefactoringTool, self).write_file @@ -154,6 +154,8 @@ def main(fixer_pkg, args=None): help="List available transformations") parser.add_option("-p", "--print-function", action="store_true", help="Modify the grammar so that print() is a function") + parser.add_option("-e", "--exec-function", action="store_true", + help="Modify the grammar so that exec() is a function") parser.add_option("-v", "--verbose", action="store_true", help="More verbose logging") parser.add_option("--no-diffs", action="store_true", @@ -211,6 +213,9 @@ def main(fixer_pkg, args=None): if options.print_function: flags["print_function"] = True + if options.exec_function: + flags["exec_function"] = True + # Set up logging handler level = logging.DEBUG if options.verbose else logging.INFO logging.basicConfig(format='%(name)s: %(message)s', level=level) diff --git a/Lib/lib2to3/refactor.py b/Lib/lib2to3/refactor.py index 55fd60fa..3a5aafff 100644 --- a/Lib/lib2to3/refactor.py +++ b/Lib/lib2to3/refactor.py @@ -155,6 +155,7 @@ class FixerError(Exception): class RefactoringTool(object): _default_options = {"print_function" : False, + "exec_function": False, "write_unchanged_files" : False} CLASS_PREFIX = "Fix" # The prefix for fixer classes @@ -173,10 +174,13 @@ class RefactoringTool(object): self.options = self._default_options.copy() if options is not None: self.options.update(options) - if self.options["print_function"]: - self.grammar = pygram.python_grammar_no_print_statement - else: - self.grammar = pygram.python_grammar + self.grammar = pygram.python_grammar.copy() + + if self.options['print_function']: + del self.grammar.keywords["print"] + elif self.options['exec_function']: + del self.grammar.keywords["exec"] + # When this is True, the refactor*() methods will call write_file() for # files processed even if they were not changed during refactoring. If # and only if the refactor method's write parameter was True. diff --git a/Lib/lib2to3/tests/data/py3_test_grammar.py b/Lib/lib2to3/tests/data/py3_test_grammar.py index e0b68283..d0622320 100644 --- a/Lib/lib2to3/tests/data/py3_test_grammar.py +++ b/Lib/lib2to3/tests/data/py3_test_grammar.py @@ -473,15 +473,27 @@ class GrammarTests(unittest.TestCase): test_inner() def testReturn(self): - # 'return' [testlist] + # 'return' [testlist_star_expr] def g1(): return def g2(): return 1 + return_list = [2, 3] + def g3(): return 1, *return_list g1() x = g2() + x3 = g3() check_syntax_error(self, "class foo:return 1") def testYield(self): + # 'yield' [yield_arg] + def g1(): yield 1 + yield_list = [2, 3] + def g2(): yield 1, *yield_list + def g3(): yield from iter(yield_list) + x1 = g1() + x2 = g2() + x3 = g3() check_syntax_error(self, "class foo:yield 1") + check_syntax_error(self, "def g4(): yield from *a") def testRaise(self): # 'raise' test [',' test] diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py index a2852419..121ebe68 100644 --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -1913,7 +1913,11 @@ def foo(): """ self.check(b, a) + def test_single_import(self): + b = "from urllib import getproxies" + a = "from urllib.request import getproxies" + self.check(b, a) def test_import_module_usage(self): for old, changes in self.modules.items(): diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py index 3a0e7f43..ba2bb787 100644 --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -538,7 +538,7 @@ class TestSetLiteral(GrammarTest): # Adapted from Python 3's Lib/test/test_unicode_identifiers.py and # Lib/test/test_tokenize.py:TokenizeTest.test_non_ascii_identifiers -class TestIdentfier(GrammarTest): +class TestIdentifier(GrammarTest): def test_non_ascii_identifiers(self): self.validate("Örter = 'places'\ngrün = 'green'") self.validate("蟒 = a蟒 = 锦蛇 = 1") diff --git a/Lib/lib2to3/tests/test_refactor.py b/Lib/lib2to3/tests/test_refactor.py index 9e3b8fbb..be705679 100644 --- a/Lib/lib2to3/tests/test_refactor.py +++ b/Lib/lib2to3/tests/test_refactor.py @@ -44,9 +44,13 @@ class TestRefactoringTool(unittest.TestCase): def test_print_function_option(self): rt = self.rt({"print_function" : True}) - self.assertIs(rt.grammar, pygram.python_grammar_no_print_statement) - self.assertIs(rt.driver.grammar, - pygram.python_grammar_no_print_statement) + self.assertNotIn("print", rt.grammar.keywords) + self.assertNotIn("print", rt.driver.grammar.keywords) + + def test_exec_function_option(self): + rt = self.rt({"exec_function" : True}) + self.assertNotIn("exec", rt.grammar.keywords) + self.assertNotIn("exec", rt.driver.grammar.keywords) def test_write_unchanged_files_option(self): rt = self.rt() diff --git a/Lib/linecache.py b/Lib/linecache.py index c87e1807..fa5dbd09 100644 --- a/Lib/linecache.py +++ b/Lib/linecache.py @@ -10,17 +10,8 @@ import sys import os import tokenize -__all__ = ["getline", "clearcache", "checkcache"] +__all__ = ["getline", "clearcache", "checkcache", "lazycache"] -def getline(filename, lineno, module_globals=None): - lines = getlines(filename, module_globals) - if 1 <= lineno <= len(lines): - return lines[lineno-1] - else: - return '' - - -# The cache # The cache. Maps filenames to either a thunk which will provide source code, # or a tuple (size, mtime, lines, fullname) once loaded. @@ -29,9 +20,17 @@ cache = {} def clearcache(): """Clear the cache entirely.""" + cache.clear() - global cache - cache = {} + +def getline(filename, lineno, module_globals=None): + """Get a line for a Python source file from the cache. + Update the cache if it doesn't contain an entry for this file already.""" + + lines = getlines(filename, module_globals) + if 1 <= lineno <= len(lines): + return lines[lineno - 1] + return '' def getlines(filename, module_globals=None): @@ -56,11 +55,10 @@ def checkcache(filename=None): if filename is None: filenames = list(cache.keys()) + elif filename in cache: + filenames = [filename] else: - if filename in cache: - filenames = [filename] - else: - return + return for filename in filenames: entry = cache[filename] @@ -109,8 +107,10 @@ def updatecache(filename, module_globals=None): # for this module. return [] cache[filename] = ( - len(data), None, - [line+'\n' for line in data.splitlines()], fullname + len(data), + None, + [line + '\n' for line in data.splitlines()], + fullname ) return cache[filename][2] diff --git a/Lib/locale.py b/Lib/locale.py index dd8a0852..1a4e9f69 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -279,6 +279,8 @@ def currency(val, symbol=True, grouping=False, international=False): if precedes: s = smb + (separated and ' ' or '') + s else: + if international and smb[-1] == ' ': + smb = smb[:-1] s = s + (separated and ' ' or '') + smb sign_pos = conv[val<0 and 'n_sign_posn' or 'p_sign_posn'] diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 0cfaec84..403dc81b 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2001-2017 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2019 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -18,7 +18,7 @@ Logging package for Python. Based on PEP 282 and comments thereto in comp.lang.python. -Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! """ @@ -234,11 +234,9 @@ if not hasattr(os, 'register_at_fork'): # Windows and friends. def _register_at_fork_reinit_lock(instance): pass # no-op when os.register_at_fork does not exist. else: - # A collection of instances with a createLock method (logging.Handler) + # A collection of instances with a _at_fork_reinit method (logging.Handler) # to be called in the child after forking. The weakref avoids us keeping - # discarded Handler instances alive. A set is used to avoid accumulating - # duplicate registrations as createLock() is responsible for registering - # a new Handler instance with this set in the first place. + # discarded Handler instances alive. _at_fork_reinit_lock_weakset = weakref.WeakSet() def _register_at_fork_reinit_lock(instance): @@ -249,16 +247,12 @@ else: _releaseLock() def _after_at_fork_child_reinit_locks(): - # _acquireLock() was called in the parent before forking. for handler in _at_fork_reinit_lock_weakset: - try: - handler.createLock() - except Exception as err: - # Similar to what PyErr_WriteUnraisable does. - print("Ignoring exception from logging atfork", instance, - "._reinit_lock() method:", err, file=sys.stderr) - _releaseLock() # Acquired by os.register_at_fork(before=. + handler._at_fork_reinit() + # _acquireLock() was called in the parent before forking. + # The lock is reinitialized to unlocked state. + _lock._at_fork_reinit() os.register_at_fork(before=_acquireLock, after_in_child=_after_at_fork_child_reinit_locks, @@ -603,8 +597,9 @@ class Formatter(object): if datefmt: s = time.strftime(datefmt, ct) else: - t = time.strftime(self.default_time_format, ct) - s = self.default_msec_format % (t, record.msecs) + s = time.strftime(self.default_time_format, ct) + if self.default_msec_format: + s = self.default_msec_format % (s, record.msecs) return s def formatException(self, ei): @@ -891,6 +886,9 @@ class Handler(Filterer): self.lock = threading.RLock() _register_at_fork_reinit_lock(self) + def _at_fork_reinit(self): + self.lock._at_fork_reinit() + def acquire(self): """ Acquire the I/O thread lock. @@ -1122,7 +1120,7 @@ class FileHandler(StreamHandler): """ A handler class which writes formatted logging records to disk files. """ - def __init__(self, filename, mode='a', encoding=None, delay=False): + def __init__(self, filename, mode='a', encoding=None, delay=False, errors=None): """ Open the specified file and use it as the stream for logging. """ @@ -1133,6 +1131,7 @@ class FileHandler(StreamHandler): self.baseFilename = os.path.abspath(filename) self.mode = mode self.encoding = encoding + self.errors = errors self.delay = delay if delay: #We don't open the stream, but we still need to call the @@ -1169,7 +1168,8 @@ class FileHandler(StreamHandler): Open the current base file with the (original) mode and encoding. Return the resulting stream. """ - return open(self.baseFilename, self.mode, encoding=self.encoding) + return open(self.baseFilename, self.mode, encoding=self.encoding, + errors=self.errors) def emit(self, record): """ @@ -1931,15 +1931,20 @@ def basicConfig(**kwargs): attached to the root logger are removed and closed, before carrying out the configuration as specified by the other arguments. + encoding If specified together with a filename, this encoding is passed to + the created FileHandler, causing it to be used when the file is + opened. + errors If specified together with a filename, this value is passed to the + created FileHandler, causing it to be used when the file is + opened in text mode. If not specified, the default value is + `backslashreplace`. + Note that you could specify a stream created using open(filename, mode) rather than passing the filename and mode in. However, it should be remembered that StreamHandler does not close its stream (since it may be using sys.stdout or sys.stderr), whereas FileHandler closes its stream when the handler is closed. - .. versionchanged:: 3.8 - Added the ``force`` parameter. - .. versionchanged:: 3.2 Added the ``style`` parameter. @@ -1949,12 +1954,20 @@ def basicConfig(**kwargs): ``filename``/``filemode``, or ``filename``/``filemode`` specified together with ``stream``, or ``handlers`` specified together with ``stream``. + + .. versionchanged:: 3.8 + Added the ``force`` parameter. + + .. versionchanged:: 3.9 + Added the ``encoding`` and ``errors`` parameters. """ # Add thread safety in case someone mistakenly calls # basicConfig() from multiple threads _acquireLock() try: force = kwargs.pop('force', False) + encoding = kwargs.pop('encoding', None) + errors = kwargs.pop('errors', 'backslashreplace') if force: for h in root.handlers[:]: root.removeHandler(h) @@ -1973,7 +1986,10 @@ def basicConfig(**kwargs): filename = kwargs.pop("filename", None) mode = kwargs.pop("filemode", 'a') if filename: - h = FileHandler(filename, mode) + if 'b'in mode: + errors = None + h = FileHandler(filename, mode, + encoding=encoding, errors=errors) else: stream = kwargs.pop("stream", None) h = StreamHandler(stream) @@ -2009,10 +2025,9 @@ def getLogger(name=None): If no name is specified, return the root logger. """ - if name: - return Logger.manager.getLogger(name) - else: + if not name or isinstance(name, str) and name == root.name: return root + return Logger.manager.getLogger(name) def critical(msg, *args, **kwargs): """ @@ -2151,6 +2166,9 @@ class NullHandler(Handler): def createLock(self): self.lock = None + def _at_fork_reinit(self): + pass + # Warnings integration _warnings_showwarning = None diff --git a/Lib/logging/config.py b/Lib/logging/config.py index 3cd5fea8..fd3aded7 100644 --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -143,6 +143,7 @@ def _install_handlers(cp, formatters): kwargs = section.get("kwargs", '{}') kwargs = eval(kwargs, vars(logging)) h = klass(*args, **kwargs) + h.name = hand if "level" in section: level = section["level"] h.setLevel(level) diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 29802b61..867ef4eb 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -48,15 +48,19 @@ class BaseRotatingHandler(logging.FileHandler): Not meant to be instantiated directly. Instead, use RotatingFileHandler or TimedRotatingFileHandler. """ - def __init__(self, filename, mode, encoding=None, delay=False): + namer = None + rotator = None + + def __init__(self, filename, mode, encoding=None, delay=False, errors=None): """ Use the specified filename for streamed logging """ - logging.FileHandler.__init__(self, filename, mode, encoding, delay) + logging.FileHandler.__init__(self, filename, mode=mode, + encoding=encoding, delay=delay, + errors=errors) self.mode = mode self.encoding = encoding - self.namer = None - self.rotator = None + self.errors = errors def emit(self, record): """ @@ -117,7 +121,8 @@ class RotatingFileHandler(BaseRotatingHandler): Handler for logging to a set of files, which switches from one file to the next when the current file reaches a certain size. """ - def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False): + def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, + encoding=None, delay=False, errors=None): """ Open the specified file and use it as the stream for logging. @@ -145,7 +150,8 @@ class RotatingFileHandler(BaseRotatingHandler): # on each run. if maxBytes > 0: mode = 'a' - BaseRotatingHandler.__init__(self, filename, mode, encoding, delay) + BaseRotatingHandler.__init__(self, filename, mode, encoding=encoding, + delay=delay, errors=errors) self.maxBytes = maxBytes self.backupCount = backupCount @@ -196,8 +202,11 @@ class TimedRotatingFileHandler(BaseRotatingHandler): If backupCount is > 0, when rollover is done, no more than backupCount files are kept - the oldest ones are deleted. """ - def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None): - BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay) + def __init__(self, filename, when='h', interval=1, backupCount=0, + encoding=None, delay=False, utc=False, atTime=None, + errors=None): + BaseRotatingHandler.__init__(self, filename, 'a', encoding=encoding, + delay=delay, errors=errors) self.when = when.upper() self.backupCount = backupCount self.utc = utc @@ -431,8 +440,11 @@ class WatchedFileHandler(logging.FileHandler): This handler is based on a suggestion and patch by Chad J. Schroeder. """ - def __init__(self, filename, mode='a', encoding=None, delay=False): - logging.FileHandler.__init__(self, filename, mode, encoding, delay) + def __init__(self, filename, mode='a', encoding=None, delay=False, + errors=None): + logging.FileHandler.__init__(self, filename, mode=mode, + encoding=encoding, delay=delay, + errors=errors) self.dev, self.ino = -1, -1 self._statstream() @@ -730,6 +742,10 @@ class SysLogHandler(logging.Handler): LOG_CRON = 9 # clock daemon LOG_AUTHPRIV = 10 # security/authorization messages (private) LOG_FTP = 11 # FTP daemon + LOG_NTP = 12 # NTP subsystem + LOG_SECURITY = 13 # Log audit + LOG_CONSOLE = 14 # Log alert + LOG_SOLCRON = 15 # Scheduling daemon (Solaris) # other codes through 15 reserved for system use LOG_LOCAL0 = 16 # reserved for local use @@ -757,27 +773,30 @@ class SysLogHandler(logging.Handler): } facility_names = { - "auth": LOG_AUTH, - "authpriv": LOG_AUTHPRIV, - "cron": LOG_CRON, - "daemon": LOG_DAEMON, - "ftp": LOG_FTP, - "kern": LOG_KERN, - "lpr": LOG_LPR, - "mail": LOG_MAIL, - "news": LOG_NEWS, - "security": LOG_AUTH, # DEPRECATED - "syslog": LOG_SYSLOG, - "user": LOG_USER, - "uucp": LOG_UUCP, - "local0": LOG_LOCAL0, - "local1": LOG_LOCAL1, - "local2": LOG_LOCAL2, - "local3": LOG_LOCAL3, - "local4": LOG_LOCAL4, - "local5": LOG_LOCAL5, - "local6": LOG_LOCAL6, - "local7": LOG_LOCAL7, + "auth": LOG_AUTH, + "authpriv": LOG_AUTHPRIV, + "console": LOG_CONSOLE, + "cron": LOG_CRON, + "daemon": LOG_DAEMON, + "ftp": LOG_FTP, + "kern": LOG_KERN, + "lpr": LOG_LPR, + "mail": LOG_MAIL, + "news": LOG_NEWS, + "ntp": LOG_NTP, + "security": LOG_SECURITY, + "solaris-cron": LOG_SOLCRON, + "syslog": LOG_SYSLOG, + "user": LOG_USER, + "uucp": LOG_UUCP, + "local0": LOG_LOCAL0, + "local1": LOG_LOCAL1, + "local2": LOG_LOCAL2, + "local3": LOG_LOCAL3, + "local4": LOG_LOCAL4, + "local5": LOG_LOCAL5, + "local6": LOG_LOCAL6, + "local7": LOG_LOCAL7, } #The map below appears to be trivially lowercasing the key. However, @@ -1154,6 +1173,20 @@ class HTTPHandler(logging.Handler): """ return record.__dict__ + def getConnection(self, host, secure): + """ + get a HTTP[S]Connection. + + Override when a custom connection is required, for example if + there is a proxy. + """ + import http.client + if secure: + connection = http.client.HTTPSConnection(host, context=self.context) + else: + connection = http.client.HTTPConnection(host) + return connection + def emit(self, record): """ Emit a record. @@ -1161,12 +1194,9 @@ class HTTPHandler(logging.Handler): Send the record to the Web server as a percent-encoded dictionary """ try: - import http.client, urllib.parse + import urllib.parse host = self.host - if self.secure: - h = http.client.HTTPSConnection(host, context=self.context) - else: - h = http.client.HTTPConnection(host) + h = self.getConnection(host, self.secure) url = self.url data = urllib.parse.urlencode(self.mapLogRecord(record)) if self.method == "GET": @@ -1242,7 +1272,7 @@ class BufferingHandler(logging.Handler): """ self.acquire() try: - self.buffer = [] + self.buffer.clear() finally: self.release() @@ -1313,7 +1343,7 @@ class MemoryHandler(BufferingHandler): if self.target: for record in self.buffer: self.target.handle(record) - self.buffer = [] + self.buffer.clear() finally: self.release() diff --git a/Lib/mailbox.py b/Lib/mailbox.py index 5b4e8641..70da07ed 100644 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -18,6 +18,7 @@ import email.message import email.generator import io import contextlib +from types import GenericAlias try: import fcntl except ImportError: @@ -260,6 +261,8 @@ class Mailbox: else: raise TypeError('Invalid message type: %s' % type(message)) + __class_getitem__ = classmethod(GenericAlias) + class Maildir(Mailbox): """A qmail-style Maildir mailbox.""" @@ -2015,6 +2018,8 @@ class _ProxyFile: return False return self._file.closed + __class_getitem__ = classmethod(GenericAlias) + class _PartialFile(_ProxyFile): """A read-only wrapper of part of a file.""" diff --git a/Lib/mailcap.py b/Lib/mailcap.py index bd0fc098..ae416a8e 100644 --- a/Lib/mailcap.py +++ b/Lib/mailcap.py @@ -251,6 +251,7 @@ def test(): else: print("Executing:", command) sts = os.system(command) + sts = os.waitstatus_to_exitcode(sts) if sts: print("Exit status:", sts) diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 954bb0a7..92c2a470 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -401,6 +401,7 @@ def _default_mime_types(): '.Z': 'compress', '.bz2': 'bzip2', '.xz': 'xz', + '.br': 'br', } # Before adding new types, make sure they are either registered with IANA, @@ -447,7 +448,6 @@ def _default_mime_types(): '.dvi' : 'application/x-dvi', '.gtar' : 'application/x-gtar', '.hdf' : 'application/x-hdf', - '.h5' : 'application/x-hdf5', '.latex' : 'application/x-latex', '.mif' : 'application/x-mif', '.cdf' : 'application/x-netcdf', diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py index aadcd23e..cb455f40 100644 --- a/Lib/modulefinder.py +++ b/Lib/modulefinder.py @@ -7,8 +7,6 @@ import marshal import os import io import sys -import types -import warnings LOAD_CONST = dis.opmap['LOAD_CONST'] diff --git a/Lib/msilib/__init__.py b/Lib/msilib/__init__.py index 0bc8dd99..0e85aa28 100644 --- a/Lib/msilib/__init__.py +++ b/Lib/msilib/__init__.py @@ -116,7 +116,7 @@ def add_data(db, table, values): raise TypeError("Unsupported type %s" % field.__class__.__name__) try: v.Modify(MSIMODIFY_INSERT, r) - except Exception as e: + except Exception: raise MSIError("Could not insert "+repr(values)+" into "+table) r.ClearData() diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 8e2facf9..510e4b5a 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -73,6 +73,11 @@ def arbitrary_address(family): if family == 'AF_INET': return ('localhost', 0) elif family == 'AF_UNIX': + # Prefer abstract sockets if possible to avoid problems with the address + # size. When coding portable applications, some implementations have + # sun_path as short as 92 bytes in the sockaddr_un struct. + if util.abstract_sockets_supported: + return f"\0listener-{os.getpid()}-{next(_mmap_counter)}" return tempfile.mktemp(prefix='listener-', dir=util.get_temp_dir()) elif family == 'AF_PIPE': return tempfile.mktemp(prefix=r'\\.\pipe\pyc-%d-%d-' % diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index 215ac39a..22a911a7 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -237,14 +237,8 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): break child_w = pid_to_fd.pop(pid, None) if child_w is not None: - if os.WIFSIGNALED(sts): - returncode = -os.WTERMSIG(sts) - else: - if not os.WIFEXITED(sts): - raise AssertionError( - "Child {0:n} status is {1:n}".format( - pid,sts)) - returncode = os.WEXITSTATUS(sts) + returncode = os.waitstatus_to_exitcode(sts) + # Send exit code to client process try: write_signed(child_w, returncode) diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index 85e0d886..0eb16c66 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -21,6 +21,7 @@ import signal import array import queue import time +import types import os from os import getpid @@ -248,7 +249,7 @@ class Server(object): try: obj, exposed, gettypeid = \ self.id_to_local_proxy_obj[ident] - except KeyError as second_ke: + except KeyError: raise ke if methodname not in exposed: @@ -296,7 +297,7 @@ class Server(object): try: try: send(msg) - except Exception as e: + except Exception: send(('#UNSERIALIZABLE', format_exc())) except Exception as e: util.info('exception in thread serving %r', @@ -360,36 +361,10 @@ class Server(object): finally: self.stop_event.set() - def create(*args, **kwds): + def create(self, c, typeid, /, *args, **kwds): ''' Create a new shared object and return its id ''' - if len(args) >= 3: - self, c, typeid, *args = args - elif not args: - raise TypeError("descriptor 'create' of 'Server' object " - "needs an argument") - else: - if 'typeid' not in kwds: - raise TypeError('create expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - typeid = kwds.pop('typeid') - if len(args) >= 2: - self, c, *args = args - import warnings - warnings.warn("Passing 'typeid' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - if 'c' not in kwds: - raise TypeError('create expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - c = kwds.pop('c') - self, *args = args - import warnings - warnings.warn("Passing 'c' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - args = tuple(args) - with self.mutex: callable, exposed, method_to_typeid, proxytype = \ self.registry[typeid] @@ -421,7 +396,6 @@ class Server(object): self.incref(c, ident) return ident, tuple(exposed) - create.__text_signature__ = '($self, c, typeid, /, *args, **kwds)' def get_methods(self, c, token): ''' @@ -1156,6 +1130,8 @@ class ValueProxy(BaseProxy): return self._callmethod('set', (value,)) value = property(get, set) + __class_getitem__ = classmethod(types.GenericAlias) + BaseListProxy = MakeProxyType('BaseListProxy', ( '__add__', '__contains__', '__delitem__', '__getitem__', '__len__', @@ -1297,26 +1273,15 @@ if HAS_SHMEM: _SharedMemoryTracker(f"shm_{address}_{getpid()}") util.debug(f"SharedMemoryServer started by pid {getpid()}") - def create(*args, **kwargs): + def create(self, c, typeid, /, *args, **kwargs): """Create a new distributed-shared object (not backed by a shared memory block) and return its id to be used in a Proxy Object.""" # Unless set up as a shared proxy, don't make shared_memory_context # a standard part of kwargs. This makes things easier for supplying # simple functions. - if len(args) >= 3: - typeod = args[2] - elif 'typeid' in kwargs: - typeid = kwargs['typeid'] - elif not args: - raise TypeError("descriptor 'create' of 'SharedMemoryServer' " - "object needs an argument") - else: - raise TypeError('create expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) if hasattr(self.registry[typeid][-1], "_shared_memory_proxy"): kwargs['shared_memory_context'] = self.shared_memory_context - return Server.create(*args, **kwargs) - create.__text_signature__ = '($self, c, typeid, /, *args, **kwargs)' + return Server.create(self, c, typeid, *args, **kwargs) def shutdown(self, c): "Call unlink() on all tracked shared memory, terminate the Server." diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index 41dd923d..bbe05a55 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -20,8 +20,8 @@ import queue import threading import time import traceback +import types import warnings -from queue import Empty # If threading is available then ThreadPool should be provided. Therefore # we avoid top-level imports which are liable to fail on some systems. @@ -780,6 +780,8 @@ class ApplyResult(object): del self._cache[self._job] self._pool = None + __class_getitem__ = classmethod(types.GenericAlias) + AsyncResult = ApplyResult # create alias -- see #17805 # diff --git a/Lib/multiprocessing/popen_fork.py b/Lib/multiprocessing/popen_fork.py index 11e21607..625981cf 100644 --- a/Lib/multiprocessing/popen_fork.py +++ b/Lib/multiprocessing/popen_fork.py @@ -25,16 +25,12 @@ class Popen(object): if self.returncode is None: try: pid, sts = os.waitpid(self.pid, flag) - except OSError as e: + except OSError: # Child process not yet created. See #1731717 # e.errno == errno.ECHILD == 10 return None if pid == self.pid: - if os.WIFSIGNALED(sts): - self.returncode = -os.WTERMSIG(sts) - else: - assert os.WIFEXITED(sts), "Status is {:n}".format(sts) - self.returncode = os.WEXITSTATUS(sts) + self.returncode = os.waitstatus_to_exitcode(sts) return self.returncode def wait(self, timeout=None): diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py index be13c079..0b2e0b45 100644 --- a/Lib/multiprocessing/process.py +++ b/Lib/multiprocessing/process.py @@ -317,12 +317,12 @@ class BaseProcess(object): finally: util._exit_function() except SystemExit as e: - if not e.args: - exitcode = 1 - elif isinstance(e.args[0], int): - exitcode = e.args[0] + if e.code is None: + exitcode = 0 + elif isinstance(e.code, int): + exitcode = e.code else: - sys.stderr.write(str(e.args[0]) + '\n') + sys.stderr.write(str(e.code) + '\n') exitcode = 1 except: exitcode = 1 diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index d112db2c..a2901814 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -14,6 +14,7 @@ import os import threading import collections import time +import types import weakref import errno @@ -48,8 +49,7 @@ class Queue(object): self._sem = ctx.BoundedSemaphore(maxsize) # For use by concurrent.futures self._ignore_epipe = False - - self._after_fork() + self._reset() if sys.platform != 'win32': register_after_fork(self, Queue._after_fork) @@ -62,11 +62,17 @@ class Queue(object): def __setstate__(self, state): (self._ignore_epipe, self._maxsize, self._reader, self._writer, self._rlock, self._wlock, self._sem, self._opid) = state - self._after_fork() + self._reset() def _after_fork(self): debug('Queue._after_fork()') - self._notempty = threading.Condition(threading.Lock()) + self._reset(after_fork=True) + + def _reset(self, after_fork=False): + if after_fork: + self._notempty._at_fork_reinit() + else: + self._notempty = threading.Condition(threading.Lock()) self._buffer = collections.deque() self._thread = None self._jointhread = None @@ -340,6 +346,10 @@ class SimpleQueue(object): else: self._wlock = ctx.Lock() + def close(self): + self._reader.close() + self._writer.close() + def empty(self): return not self._poll() @@ -366,3 +376,5 @@ class SimpleQueue(object): else: with self._wlock: self._writer.send_bytes(obj) + + __class_getitem__ = classmethod(types.GenericAlias) diff --git a/Lib/multiprocessing/resource_sharer.py b/Lib/multiprocessing/resource_sharer.py index 8d5c9900..66076509 100644 --- a/Lib/multiprocessing/resource_sharer.py +++ b/Lib/multiprocessing/resource_sharer.py @@ -63,7 +63,6 @@ class _ResourceSharer(object): def __init__(self): self._key = 0 self._cache = {} - self._old_locks = [] self._lock = threading.Lock() self._listener = None self._address = None @@ -113,10 +112,7 @@ class _ResourceSharer(object): for key, (send, close) in self._cache.items(): close() self._cache.clear() - # If self._lock was locked at the time of the fork, it may be broken - # -- see issue 6721. Replace it without letting it be gc'ed. - self._old_locks.append(self._lock) - self._lock = threading.Lock() + self._lock._at_fork_reinit() if self._listener is not None: self._listener.close() self._listener = None diff --git a/Lib/multiprocessing/shared_memory.py b/Lib/multiprocessing/shared_memory.py index e5b5e6c0..122b3fce 100644 --- a/Lib/multiprocessing/shared_memory.py +++ b/Lib/multiprocessing/shared_memory.py @@ -14,6 +14,7 @@ import os import errno import struct import secrets +import types if os.name == "nt": import _winapi @@ -253,6 +254,15 @@ class ShareableList: packing format for any storable value must require no more than 8 characters to describe its format.""" + # The shared memory area is organized as follows: + # - 8 bytes: number of items (N) as a 64-bit integer + # - (N + 1) * 8 bytes: offsets of each element from the start of the + # data area + # - K bytes: the data area storing item values (with encoding and size + # depending on their respective types) + # - N * 8 bytes: `struct` format string for each element + # - N bytes: index into _back_transforms_mapping for each element + # (for reconstructing the corresponding Python value) _types_mapping = { int: "q", float: "d", @@ -284,7 +294,8 @@ class ShareableList: return 3 # NoneType def __init__(self, sequence=None, *, name=None): - if sequence is not None: + if name is None or sequence is not None: + sequence = sequence or () _formats = [ self._types_mapping[type(item)] if not isinstance(item, (str, bytes)) @@ -295,10 +306,14 @@ class ShareableList: ] self._list_len = len(_formats) assert sum(len(fmt) <= 8 for fmt in _formats) == self._list_len - self._allocated_bytes = tuple( - self._alignment if fmt[-1] != "s" else int(fmt[:-1]) - for fmt in _formats - ) + offset = 0 + # The offsets of each list element into the shared memory's + # data area (0 meaning the start of the data area, not the start + # of the shared memory area). + self._allocated_offsets = [0] + for fmt in _formats: + offset += self._alignment if fmt[-1] != "s" else int(fmt[:-1]) + self._allocated_offsets.append(offset) _recreation_codes = [ self._extract_recreation_code(item) for item in sequence ] @@ -309,13 +324,9 @@ class ShareableList: self._format_back_transform_codes ) + self.shm = SharedMemory(name, create=True, size=requested_size) else: - requested_size = 8 # Some platforms require > 0. - - if name is not None and sequence is None: self.shm = SharedMemory(name) - else: - self.shm = SharedMemory(name, create=True, size=requested_size) if sequence is not None: _enc = _encoding @@ -324,7 +335,7 @@ class ShareableList: self.shm.buf, 0, self._list_len, - *(self._allocated_bytes) + *(self._allocated_offsets) ) struct.pack_into( "".join(_formats), @@ -347,10 +358,12 @@ class ShareableList: else: self._list_len = len(self) # Obtains size from offset 0 in buffer. - self._allocated_bytes = struct.unpack_from( - self._format_size_metainfo, - self.shm.buf, - 1 * 8 + self._allocated_offsets = list( + struct.unpack_from( + self._format_size_metainfo, + self.shm.buf, + 1 * 8 + ) ) def _get_packing_format(self, position): @@ -372,7 +385,6 @@ class ShareableList: def _get_back_transform(self, position): "Gets the back transformation function for a single value." - position = position if position >= 0 else position + self._list_len if (position >= self._list_len) or (self._list_len < 0): raise IndexError("Requested position out of range.") @@ -389,7 +401,6 @@ class ShareableList: """Sets the packing format and back transformation code for a single value in the list at the specified position.""" - position = position if position >= 0 else position + self._list_len if (position >= self._list_len) or (self._list_len < 0): raise IndexError("Requested position out of range.") @@ -409,9 +420,9 @@ class ShareableList: ) def __getitem__(self, position): + position = position if position >= 0 else position + self._list_len try: - offset = self._offset_data_start \ - + sum(self._allocated_bytes[:position]) + offset = self._offset_data_start + self._allocated_offsets[position] (v,) = struct.unpack_from( self._get_packing_format(position), self.shm.buf, @@ -426,9 +437,10 @@ class ShareableList: return v def __setitem__(self, position, value): + position = position if position >= 0 else position + self._list_len try: - offset = self._offset_data_start \ - + sum(self._allocated_bytes[:position]) + item_offset = self._allocated_offsets[position] + offset = self._offset_data_start + item_offset current_format = self._get_packing_format(position) except IndexError: raise IndexError("assignment index out of range") @@ -437,15 +449,17 @@ class ShareableList: new_format = self._types_mapping[type(value)] encoded_value = value else: + allocated_length = self._allocated_offsets[position + 1] - item_offset + encoded_value = (value.encode(_encoding) if isinstance(value, str) else value) - if len(encoded_value) > self._allocated_bytes[position]: + if len(encoded_value) > allocated_length: raise ValueError("bytes/str item exceeds available storage") if current_format[-1] == "s": new_format = current_format else: new_format = self._types_mapping[str] % ( - self._allocated_bytes[position], + allocated_length, ) self._set_packing_format_and_transform( @@ -466,33 +480,35 @@ class ShareableList: @property def format(self): - "The struct packing format used by all currently stored values." + "The struct packing format used by all currently stored items." return "".join( self._get_packing_format(i) for i in range(self._list_len) ) @property def _format_size_metainfo(self): - "The struct packing format used for metainfo on storage sizes." - return f"{self._list_len}q" + "The struct packing format used for the items' storage offsets." + return "q" * (self._list_len + 1) @property def _format_packing_metainfo(self): - "The struct packing format used for the values' packing formats." + "The struct packing format used for the items' packing formats." return "8s" * self._list_len @property def _format_back_transform_codes(self): - "The struct packing format used for the values' back transforms." + "The struct packing format used for the items' back transforms." return "b" * self._list_len @property def _offset_data_start(self): - return (self._list_len + 1) * 8 # 8 bytes per "q" + # - 8 bytes for the list length + # - (N + 1) * 8 bytes for the element offsets + return (self._list_len + 2) * 8 @property def _offset_packing_formats(self): - return self._offset_data_start + sum(self._allocated_bytes) + return self._offset_data_start + self._allocated_offsets[-1] @property def _offset_back_transform_codes(self): @@ -512,3 +528,5 @@ class ShareableList: return position else: raise ValueError(f"{value!r} not in this container") + + __class_getitem__ = classmethod(types.GenericAlias) diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py index 44abfe52..21f2a7eb 100644 --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -367,13 +367,13 @@ atexit.register(_exit_function) class ForkAwareThreadLock(object): def __init__(self): - self._reset() - register_after_fork(self, ForkAwareThreadLock._reset) - - def _reset(self): self._lock = threading.Lock() self.acquire = self._lock.acquire self.release = self._lock.release + register_after_fork(self, ForkAwareThreadLock._at_fork_reinit) + + def _at_fork_reinit(self): + self._lock._at_fork_reinit() def __enter__(self): return self._lock.__enter__() @@ -452,7 +452,7 @@ def spawnv_passfds(path, args, passfds): return _posixsubprocess.fork_exec( args, [os.fsencode(path)], True, passfds, None, None, -1, -1, -1, -1, -1, -1, errpipe_read, errpipe_write, - False, False, None) + False, False, None, None, None, -1, None) finally: os.close(errpipe_read) os.close(errpipe_write) diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 9036f361..f6e746e7 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -67,7 +67,6 @@ import re import socket import collections import datetime -import warnings import sys try: @@ -294,7 +293,7 @@ if _have_ssl: # The classes themselves -class _NNTPBase: +class NNTP: # UTF-8 is the character set for all NNTP commands and responses: they # are automatically encoded (when sending) and decoded (and receiving) # by this class. @@ -310,13 +309,18 @@ class _NNTPBase: encoding = 'utf-8' errors = 'surrogateescape' - def __init__(self, file, host, - readermode=None, timeout=_GLOBAL_DEFAULT_TIMEOUT): + def __init__(self, host, port=NNTP_PORT, user=None, password=None, + readermode=None, usenetrc=False, + timeout=_GLOBAL_DEFAULT_TIMEOUT): """Initialize an instance. Arguments: - - file: file-like object (open for read/write in binary mode) - - host: hostname of the server + - host: hostname to connect to + - port: port to connect to (default the standard NNTP port) + - user: username to authenticate with + - password: password to use with username - readermode: if true, send 'mode reader' command after connecting. + - usenetrc: allow loading username and password from ~/.netrc file + if not specified explicitly - timeout: timeout (in seconds) used for socket connections readermode is sometimes necessary if you are connecting to an @@ -326,7 +330,24 @@ class _NNTPBase: readermode. """ self.host = host - self.file = file + self.port = port + self.sock = self._create_socket(timeout) + self.file = None + try: + self.file = self.sock.makefile("rwb") + self._base_init(readermode) + if user or usenetrc: + self.login(user, password, usenetrc) + except: + if self.file: + self.file.close() + self.sock.close() + raise + + def _base_init(self, readermode): + """Partial initialization for the NNTP protocol. + This instance method is extracted for supporting the test code. + """ self.debugging = 0 self.welcome = self._getresp() @@ -371,6 +392,12 @@ class _NNTPBase: if is_connected(): self._close() + def _create_socket(self, timeout): + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') + sys.audit("nntplib.connect", self, self.host, self.port) + return socket.create_connection((self.host, self.port), timeout) + def getwelcome(self): """Get the welcome message from the server (this is read and squirreled away by __init__()). @@ -834,44 +861,6 @@ class _NNTPBase: fmt = self._getoverviewfmt() return resp, _parse_overview(lines, fmt) - def xgtitle(self, group, *, file=None): - """Process an XGTITLE command (optional server extension) Arguments: - - group: group name wildcard (i.e. news.*) - Returns: - - resp: server response if successful - - list: list of (name,title) strings""" - warnings.warn("The XGTITLE extension is not actively used, " - "use descriptions() instead", - DeprecationWarning, 2) - line_pat = re.compile('^([^ \t]+)[ \t]+(.*)$') - resp, raw_lines = self._longcmdstring('XGTITLE ' + group, file) - lines = [] - for raw_line in raw_lines: - match = line_pat.search(raw_line.strip()) - if match: - lines.append(match.group(1, 2)) - return resp, lines - - def xpath(self, id): - """Process an XPATH command (optional server extension) Arguments: - - id: Message id of article - Returns: - resp: server response if successful - path: directory path to article - """ - warnings.warn("The XPATH extension is not actively used", - DeprecationWarning, 2) - - resp = self._shortcmd('XPATH {0}'.format(id)) - if not resp.startswith('223'): - raise NNTPReplyError(resp) - try: - [resp_num, path] = resp.split() - except ValueError: - raise NNTPReplyError(resp) from None - else: - return resp, path - def date(self): """Process the DATE command. Returns: @@ -927,8 +916,12 @@ class _NNTPBase: return self._post('IHAVE {0}'.format(message_id), data) def _close(self): - self.file.close() - del self.file + try: + if self.file: + self.file.close() + del self.file + finally: + self.sock.close() def quit(self): """Process a QUIT command and close the socket. Returns: @@ -1018,54 +1011,8 @@ class _NNTPBase: raise NNTPError("TLS failed to start.") -class NNTP(_NNTPBase): - - def __init__(self, host, port=NNTP_PORT, user=None, password=None, - readermode=None, usenetrc=False, - timeout=_GLOBAL_DEFAULT_TIMEOUT): - """Initialize an instance. Arguments: - - host: hostname to connect to - - port: port to connect to (default the standard NNTP port) - - user: username to authenticate with - - password: password to use with username - - readermode: if true, send 'mode reader' command after - connecting. - - usenetrc: allow loading username and password from ~/.netrc file - if not specified explicitly - - timeout: timeout (in seconds) used for socket connections - - readermode is sometimes necessary if you are connecting to an - NNTP server on the local machine and intend to call - reader-specific commands, such as `group'. If you get - unexpected NNTPPermanentErrors, you might need to set - readermode. - """ - self.host = host - self.port = port - sys.audit("nntplib.connect", self, host, port) - self.sock = socket.create_connection((host, port), timeout) - file = None - try: - file = self.sock.makefile("rwb") - _NNTPBase.__init__(self, file, host, - readermode, timeout) - if user or usenetrc: - self.login(user, password, usenetrc) - except: - if file: - file.close() - self.sock.close() - raise - - def _close(self): - try: - _NNTPBase._close(self) - finally: - self.sock.close() - - if _have_ssl: - class NNTP_SSL(_NNTPBase): + class NNTP_SSL(NNTP): def __init__(self, host, port=NNTP_SSL_PORT, user=None, password=None, ssl_context=None, @@ -1074,27 +1021,19 @@ if _have_ssl: """This works identically to NNTP.__init__, except for the change in default port and the `ssl_context` argument for SSL connections. """ - sys.audit("nntplib.connect", self, host, port) - self.sock = socket.create_connection((host, port), timeout) - file = None + self.ssl_context = ssl_context + super().__init__(host, port, user, password, readermode, + usenetrc, timeout) + + def _create_socket(self, timeout): + sock = super()._create_socket(timeout) try: - self.sock = _encrypt_on(self.sock, ssl_context, host) - file = self.sock.makefile("rwb") - _NNTPBase.__init__(self, file, host, - readermode=readermode, timeout=timeout) - if user or usenetrc: - self.login(user, password, usenetrc) + sock = _encrypt_on(sock, self.ssl_context, self.host) except: - if file: - file.close() - self.sock.close() + sock.close() raise - - def _close(self): - try: - _NNTPBase._close(self) - finally: - self.sock.close() + else: + return sock __all__.append("NNTP_SSL") diff --git a/Lib/opcode.py b/Lib/opcode.py index 3fb716b5..ac1aa535 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -21,8 +21,7 @@ try: except ImportError: pass -cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', - 'is not', 'exception match', 'BAD') +cmp_op = ('<', '<=', '==', '!=', '>', '>=') hasconst = [] hasname = [] @@ -84,10 +83,12 @@ def_op('BINARY_TRUE_DIVIDE', 27) def_op('INPLACE_FLOOR_DIVIDE', 28) def_op('INPLACE_TRUE_DIVIDE', 29) +def_op('RERAISE', 48) +def_op('WITH_EXCEPT_START', 49) def_op('GET_AITER', 50) def_op('GET_ANEXT', 51) def_op('BEFORE_ASYNC_WITH', 52) -def_op('BEGIN_FINALLY', 53) + def_op('END_ASYNC_FOR', 54) def_op('INPLACE_ADD', 55) def_op('INPLACE_SUBTRACT', 56) @@ -109,20 +110,20 @@ def_op('PRINT_EXPR', 70) def_op('LOAD_BUILD_CLASS', 71) def_op('YIELD_FROM', 72) def_op('GET_AWAITABLE', 73) - +def_op('LOAD_ASSERTION_ERROR', 74) def_op('INPLACE_LSHIFT', 75) def_op('INPLACE_RSHIFT', 76) def_op('INPLACE_AND', 77) def_op('INPLACE_XOR', 78) def_op('INPLACE_OR', 79) -def_op('WITH_CLEANUP_START', 81) -def_op('WITH_CLEANUP_FINISH', 82) + +def_op('LIST_TO_TUPLE', 82) def_op('RETURN_VALUE', 83) def_op('IMPORT_STAR', 84) def_op('SETUP_ANNOTATIONS', 85) def_op('YIELD_VALUE', 86) def_op('POP_BLOCK', 87) -def_op('END_FINALLY', 88) + def_op('POP_EXCEPT', 89) HAVE_ARGUMENT = 90 # Opcodes from here have an argument: @@ -158,6 +159,10 @@ jabs_op('POP_JUMP_IF_TRUE', 115) # "" name_op('LOAD_GLOBAL', 116) # Index in name list +def_op('IS_OP', 117) +def_op('CONTAINS_OP', 118) + +jabs_op('JUMP_IF_NOT_EXC_MATCH', 121) jrel_op('SETUP_FINALLY', 122) # Distance to target address def_op('LOAD_FAST', 124) # Local variable number @@ -195,22 +200,18 @@ hasfree.append(148) def_op('EXTENDED_ARG', 144) EXTENDED_ARG = 144 -def_op('BUILD_LIST_UNPACK', 149) -def_op('BUILD_MAP_UNPACK', 150) -def_op('BUILD_MAP_UNPACK_WITH_CALL', 151) -def_op('BUILD_TUPLE_UNPACK', 152) -def_op('BUILD_SET_UNPACK', 153) - jrel_op('SETUP_ASYNC_WITH', 154) def_op('FORMAT_VALUE', 155) def_op('BUILD_CONST_KEY_MAP', 156) def_op('BUILD_STRING', 157) -def_op('BUILD_TUPLE_UNPACK_WITH_CALL', 158) name_op('LOAD_METHOD', 160) def_op('CALL_METHOD', 161) -jrel_op('CALL_FINALLY', 162) -def_op('POP_FINALLY', 163) + +def_op('LIST_EXTEND', 162) +def_op('SET_UPDATE', 163) +def_op('DICT_MERGE', 164) +def_op('DICT_UPDATE', 165) del def_op, name_op, jrel_op, jabs_op diff --git a/Lib/os.py b/Lib/os.py index 253cad1a..b794159f 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -28,6 +28,8 @@ import stat as st from _collections_abc import _check_methods +GenericAlias = type(list[int]) + _names = sys.builtin_module_names # Note: more names are added to __all__ later. @@ -336,7 +338,10 @@ def walk(top, topdown=True, onerror=None, followlinks=False): dirs.remove('CVS') # don't visit CVS directories """ - top = fspath(top) + sys.audit("os.walk", top, topdown, onerror, followlinks) + return _walk(fspath(top), topdown, onerror, followlinks) + +def _walk(top, topdown, onerror, followlinks): dirs = [] nondirs = [] walk_dirs = [] @@ -410,11 +415,11 @@ def walk(top, topdown=True, onerror=None, followlinks=False): # the caller can replace the directory entry during the "yield" # above. if followlinks or not islink(new_path): - yield from walk(new_path, topdown, onerror, followlinks) + yield from _walk(new_path, topdown, onerror, followlinks) else: # Recurse into sub-directories for new_path in walk_dirs: - yield from walk(new_path, topdown, onerror, followlinks) + yield from _walk(new_path, topdown, onerror, followlinks) # Yield after recursion if going bottom up yield top, dirs, nondirs @@ -455,6 +460,7 @@ if {open, stat} <= supports_dir_fd and {scandir, stat} <= supports_fd: if 'CVS' in dirs: dirs.remove('CVS') # don't visit CVS directories """ + sys.audit("os.fwalk", top, topdown, onerror, follow_symlinks, dir_fd) if not isinstance(top, int) or not hasattr(top, '__index__'): top = fspath(top) # Note: To guard against symlink races, we use the standard @@ -654,17 +660,15 @@ def get_exec_path(env=None): return path_list.split(pathsep) -# Change environ to automatically call putenv(), unsetenv if they exist. -from _collections_abc import MutableMapping +# Change environ to automatically call putenv() and unsetenv() +from _collections_abc import MutableMapping, Mapping class _Environ(MutableMapping): - def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv): + def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue): self.encodekey = encodekey self.decodekey = decodekey self.encodevalue = encodevalue self.decodevalue = decodevalue - self.putenv = putenv - self.unsetenv = unsetenv self._data = data def __getitem__(self, key): @@ -678,12 +682,12 @@ class _Environ(MutableMapping): def __setitem__(self, key, value): key = self.encodekey(key) value = self.encodevalue(value) - self.putenv(key, value) + putenv(key, value) self._data[key] = value def __delitem__(self, key): encodedkey = self.encodekey(key) - self.unsetenv(encodedkey) + unsetenv(encodedkey) try: del self._data[encodedkey] except KeyError: @@ -712,21 +716,23 @@ class _Environ(MutableMapping): self[key] = value return self[key] -try: - _putenv = putenv -except NameError: - _putenv = lambda key, value: None -else: - if "putenv" not in __all__: - __all__.append("putenv") + def __ior__(self, other): + self.update(other) + return self -try: - _unsetenv = unsetenv -except NameError: - _unsetenv = lambda key: _putenv(key, "") -else: - if "unsetenv" not in __all__: - __all__.append("unsetenv") + def __or__(self, other): + if not isinstance(other, Mapping): + return NotImplemented + new = dict(self) + new.update(other) + return new + + def __ror__(self, other): + if not isinstance(other, Mapping): + return NotImplemented + new = dict(other) + new.update(self) + return new def _createenviron(): if name == 'nt': @@ -755,8 +761,7 @@ def _createenviron(): data = environ return _Environ(data, encodekey, decode, - encode, decode, - _putenv, _unsetenv) + encode, decode) # unicode environ environ = _createenviron() @@ -781,8 +786,7 @@ if supports_bytes_environ: # bytes environ environb = _Environ(environ._data, _check_bytes, bytes, - _check_bytes, bytes, - _putenv, _unsetenv) + _check_bytes, bytes) del _check_bytes def getenvb(key, default=None): @@ -862,12 +866,8 @@ if _exists("fork") and not _exists("spawnv") and _exists("execv"): wpid, sts = waitpid(pid, 0) if WIFSTOPPED(sts): continue - elif WIFSIGNALED(sts): - return -WTERMSIG(sts) - elif WIFEXITED(sts): - return WEXITSTATUS(sts) - else: - raise OSError("Not stopped, signaled or exited???") + + return waitstatus_to_exitcode(sts) def spawnv(mode, file, args): """spawnv(mode, file, args) -> integer @@ -1076,6 +1076,8 @@ class PathLike(abc.ABC): return _check_methods(subclass, '__fspath__') return NotImplemented + __class_getitem__ = classmethod(GenericAlias) + if name == 'nt': class _AddedDllDirectory: diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 4f72bab3..147be2ff 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -450,6 +450,20 @@ class _NormalAccessor(_Accessor): def readlink(self, path): return os.readlink(path) + def owner(self, path): + try: + import pwd + return pwd.getpwuid(self.stat(path).st_uid).pw_name + except ImportError: + raise NotImplementedError("Path.owner() is unsupported on this system") + + def group(self, path): + try: + import grp + return grp.getgrgid(self.stat(path).st_gid).gr_name + except ImportError: + raise NotImplementedError("Path.group() is unsupported on this system") + _normal_accessor = _NormalAccessor() @@ -788,6 +802,9 @@ class PurePath(object): return NotImplemented return self._cparts >= other._cparts + def __class_getitem__(cls, type): + return cls + drive = property(attrgetter('_drv'), doc="""The drive prefix (letter or UNC path), if any.""") @@ -856,6 +873,10 @@ class PurePath(object): return self._from_parsed_parts(self._drv, self._root, self._parts[:-1] + [name]) + def with_stem(self, stem): + """Return a new path with the stem changed.""" + return self.with_name(stem + self.suffix) + def with_suffix(self, suffix): """Return a new path with the file suffix changed. If the path has no suffix, add given suffix. If the given suffix is an empty @@ -904,11 +925,21 @@ class PurePath(object): cf = self._flavour.casefold_parts if (root or drv) if n == 0 else cf(abs_parts[:n]) != cf(to_abs_parts): formatted = self._format_parsed_parts(to_drv, to_root, to_parts) - raise ValueError("{!r} does not start with {!r}" + raise ValueError("{!r} is not in the subpath of {!r}" + " OR one path is relative and the other is absolute." .format(str(self), str(formatted))) return self._from_parsed_parts('', root if n == 1 else '', abs_parts[n:]) + def is_relative_to(self, *other): + """Return True if the path is relative to another path or False. + """ + try: + self.relative_to(*other) + return True + except ValueError: + return False + @property def parts(self): """An object providing sequence-like access to the @@ -1032,7 +1063,6 @@ class Path(PurePath): """ __slots__ = ( '_accessor', - '_closed', ) def __new__(cls, *args, **kwargs): @@ -1049,7 +1079,6 @@ class Path(PurePath): # Private non-constructor arguments template=None, ): - self._closed = False if template is not None: self._accessor = template._accessor else: @@ -1062,15 +1091,18 @@ class Path(PurePath): return self._from_parsed_parts(self._drv, self._root, parts) def __enter__(self): - if self._closed: - self._raise_closed() return self def __exit__(self, t, v, tb): - self._closed = True - - def _raise_closed(self): - raise ValueError("I/O operation on closed path") + # https://bugs.python.org/issue39682 + # In previous versions of pathlib, this method marked this path as + # closed; subsequent attempts to perform I/O would raise an IOError. + # This functionality was never documented, and had the effect of + # making Path objects mutable, contrary to PEP 428. In Python 3.9 the + # _closed attribute was removed, and this method made a no-op. + # This method and __enter__()/__exit__() should be deprecated and + # removed in the future. + pass def _opener(self, name, flags, mode=0o666): # A stub for the opener argument to built-in open() @@ -1081,8 +1113,6 @@ class Path(PurePath): Open the file pointed by this path and return a file descriptor, as os.open() does. """ - if self._closed: - self._raise_closed() return self._accessor.open(self, flags, mode) # Public API @@ -1109,27 +1139,24 @@ class Path(PurePath): try: other_st = other_path.stat() except AttributeError: - other_st = os.stat(other_path) + other_st = self._accessor.stat(other_path) return os.path.samestat(st, other_st) def iterdir(self): """Iterate over the files in this directory. Does not yield any result for the special paths '.' and '..'. """ - if self._closed: - self._raise_closed() for name in self._accessor.listdir(self): if name in {'.', '..'}: # Yielding a path object for these makes little sense continue yield self._make_child_relpath(name) - if self._closed: - self._raise_closed() def glob(self, pattern): """Iterate over this subtree and yield all existing files (of any kind, including directories) matching the given relative pattern. """ + sys.audit("pathlib.Path.glob", self, pattern) if not pattern: raise ValueError("Unacceptable pattern: {!r}".format(pattern)) drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) @@ -1144,6 +1171,7 @@ class Path(PurePath): directories) matching the given relative pattern, anywhere in this subtree. """ + sys.audit("pathlib.Path.rglob", self, pattern) drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") @@ -1159,8 +1187,6 @@ class Path(PurePath): Use resolve() to get the canonical path to a file. """ # XXX untested yet! - if self._closed: - self._raise_closed() if self.is_absolute(): return self # FIXME this must defer to the specific flavour (and, under Windows, @@ -1175,8 +1201,6 @@ class Path(PurePath): normalizing it (for example turning slashes into backslashes under Windows). """ - if self._closed: - self._raise_closed() s = self._flavour.resolve(self, strict=strict) if s is None: # No symlink resolution => for consistency, raise an error if @@ -1200,15 +1224,13 @@ class Path(PurePath): """ Return the login name of the file owner. """ - import pwd - return pwd.getpwuid(self.stat().st_uid).pw_name + return self._accessor.owner(self) def group(self): """ Return the group name of the file gid. """ - import grp - return grp.getgrgid(self.stat().st_gid).gr_name + return self._accessor.group(self) def open(self, mode='r', buffering=-1, encoding=None, errors=None, newline=None): @@ -1216,8 +1238,6 @@ class Path(PurePath): Open the file pointed by this path and return a file object, as the built-in open() function does. """ - if self._closed: - self._raise_closed() return io.open(self, mode, buffering, encoding, errors, newline, opener=self._opener) @@ -1254,12 +1274,19 @@ class Path(PurePath): with self.open(mode='w', encoding=encoding, errors=errors) as f: return f.write(data) + def readlink(self): + """ + Return the path to which the symbolic link points. + """ + path = self._accessor.readlink(self) + obj = self._from_parts((path,), init=False) + obj._init(template=self) + return obj + def touch(self, mode=0o666, exist_ok=True): """ Create this file with the given access mode, if it doesn't exist. """ - if self._closed: - self._raise_closed() if exist_ok: # First try to bump modification time # Implementation note: GNU touch uses the UTIME_NOW option of @@ -1281,8 +1308,6 @@ class Path(PurePath): """ Create a new directory at this given path. """ - if self._closed: - self._raise_closed() try: self._accessor.mkdir(self, mode) except FileNotFoundError: @@ -1300,8 +1325,6 @@ class Path(PurePath): """ Change the permissions of the path, like os.chmod(). """ - if self._closed: - self._raise_closed() self._accessor.chmod(self, mode) def lchmod(self, mode): @@ -1309,8 +1332,6 @@ class Path(PurePath): Like chmod(), except if the path points to a symlink, the symlink's permissions are changed, rather than its target's. """ - if self._closed: - self._raise_closed() self._accessor.lchmod(self, mode) def unlink(self, missing_ok=False): @@ -1318,8 +1339,6 @@ class Path(PurePath): Remove this file or link. If the path is a directory, use rmdir() instead. """ - if self._closed: - self._raise_closed() try: self._accessor.unlink(self) except FileNotFoundError: @@ -1330,8 +1349,6 @@ class Path(PurePath): """ Remove this directory. The directory must be empty. """ - if self._closed: - self._raise_closed() self._accessor.rmdir(self) def lstat(self): @@ -1339,36 +1356,37 @@ class Path(PurePath): Like stat(), except if the path points to a symlink, the symlink's status information is returned, rather than its target's. """ - if self._closed: - self._raise_closed() return self._accessor.lstat(self) def link_to(self, target): """ Create a hard link pointing to a path named target. """ - if self._closed: - self._raise_closed() self._accessor.link_to(self, target) def rename(self, target): """ - Rename this path to the given path, - and return a new Path instance pointing to the given path. + Rename this path to the target path. + + The target path may be absolute or relative. Relative paths are + interpreted relative to the current working directory, *not* the + directory of the Path object. + + Returns the new Path instance pointing to the target path. """ - if self._closed: - self._raise_closed() self._accessor.rename(self, target) return self.__class__(target) def replace(self, target): """ - Rename this path to the given path, clobbering the existing - destination if it exists, and return a new Path instance - pointing to the given path. + Rename this path to the target path, overwriting if that path exists. + + The target path may be absolute or relative. Relative paths are + interpreted relative to the current working directory, *not* the + directory of the Path object. + + Returns the new Path instance pointing to the target path. """ - if self._closed: - self._raise_closed() self._accessor.replace(self, target) return self.__class__(target) @@ -1377,8 +1395,6 @@ class Path(PurePath): Make this path a symlink pointing to the given path. Note the order of arguments (self, target) is the reverse of os.symlink's. """ - if self._closed: - self._raise_closed() self._accessor.symlink(target, self, target_is_directory) # Convenience functions for querying the stat results @@ -1439,9 +1455,8 @@ class Path(PurePath): if not self.exists() or not self.is_dir(): return False - parent = Path(self.parent) try: - parent_dev = parent.stat().st_dev + parent_dev = self.parent.stat().st_dev except OSError: return False @@ -1449,7 +1464,7 @@ class Path(PurePath): if dev != parent_dev: return True ino = self.stat().st_ino - parent_ino = parent.stat().st_ino + parent_ino = self.parent.stat().st_ino return ino == parent_ino def is_symlink(self): @@ -1557,11 +1572,5 @@ class WindowsPath(Path, PureWindowsPath): """ __slots__ = () - def owner(self): - raise NotImplementedError("Path.owner() is unsupported on this system") - - def group(self): - raise NotImplementedError("Path.group() is unsupported on this system") - def is_mount(self): raise NotImplementedError("Path.is_mount() is unsupported on this system") diff --git a/Lib/pickle.py b/Lib/pickle.py index af50a9b0..cbac5f16 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -13,7 +13,7 @@ Functions: dump(object, file) dumps(object) -> string load(file) -> object - loads(string) -> object + loads(bytes) -> object Misc variables: @@ -1604,17 +1604,29 @@ class _Unpickler: def load_get(self): i = int(self.readline()[:-1]) - self.append(self.memo[i]) + try: + self.append(self.memo[i]) + except KeyError: + msg = f'Memo value not found at index {i}' + raise UnpicklingError(msg) from None dispatch[GET[0]] = load_get def load_binget(self): i = self.read(1)[0] - self.append(self.memo[i]) + try: + self.append(self.memo[i]) + except KeyError as exc: + msg = f'Memo value not found at index {i}' + raise UnpicklingError(msg) from None dispatch[BINGET[0]] = load_binget def load_long_binget(self): i, = unpack('{_DOTTED_WORDS})(?P:(?P{_DOTTED_WORDS})?)?$', re.U) +del _DOTTED_WORDS + +def resolve_name(name): + """ + Resolve a name to an object. + + It is expected that `name` will be a string in one of the following + formats, where W is shorthand for a valid Python identifier and dot stands + for a literal period in these pseudo-regexes: + + W(.W)* + W(.W)*:(W(.W)*)? + + The first form is intended for backward compatibility only. It assumes that + some part of the dotted name is a package, and the rest is an object + somewhere within that package, possibly nested inside other objects. + Because the place where the package stops and the object hierarchy starts + can't be inferred by inspection, repeated attempts to import must be done + with this form. + + In the second form, the caller makes the division point clear through the + provision of a single colon: the dotted name to the left of the colon is a + package to be imported, and the dotted name to the right is the object + hierarchy within that package. Only one import is needed in this form. If + it ends with the colon, then a module object is returned. + + The function will return an object (which might be a module), or raise one + of the following exceptions: + + ValueError - if `name` isn't in a recognised format + ImportError - if an import failed when it shouldn't have + AttributeError - if a failure occurred when traversing the object hierarchy + within the imported package to get to the desired object) + """ + m = _NAME_PATTERN.match(name) + if not m: + raise ValueError(f'invalid format: {name!r}') + gd = m.groupdict() + if gd.get('cln'): + # there is a colon - a one-step import is all that's needed + mod = importlib.import_module(gd['pkg']) + parts = gd.get('obj') + parts = parts.split('.') if parts else [] + else: + # no colon - have to iterate to find the package boundary + parts = name.split('.') + modname = parts.pop(0) + # first part *must* be a module/package. + mod = importlib.import_module(modname) + while parts: + p = parts[0] + s = f'{modname}.{p}' + try: + mod = importlib.import_module(s) + parts.pop(0) + modname = s + except ImportError: + break + # if we reach this point, mod is the module, already imported, and + # parts is the list of parts in the object hierarchy to be traversed, or + # an empty list if just the module is wanted. + result = mod + for p in parts: + result = getattr(result, p) + return result diff --git a/Lib/platform.py b/Lib/platform.py index 994d892c..e9f50ab6 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -116,6 +116,9 @@ import collections import os import re import sys +import subprocess +import functools +import itertools ### Globals & Constants @@ -600,22 +603,6 @@ def _follow_symlinks(filepath): os.path.join(os.path.dirname(filepath), os.readlink(filepath))) return filepath -def _syscmd_uname(option, default=''): - - """ Interface to the system's uname command. - """ - if sys.platform in ('dos', 'win32', 'win16'): - # XXX Others too ? - return default - - import subprocess - try: - output = subprocess.check_output(('uname', option), - stderr=subprocess.DEVNULL, - text=True) - except (OSError, subprocess.CalledProcessError): - return default - return (output.strip() or default) def _syscmd_file(target, default=''): @@ -736,13 +723,90 @@ def architecture(executable=sys.executable, bits='', linkage=''): return bits, linkage + +def _get_machine_win32(): + # Try to use the PROCESSOR_* environment variables + # available on Win XP and later; see + # http://support.microsoft.com/kb/888731 and + # http://www.geocities.com/rick_lively/MANUALS/ENV/MSWIN/PROCESSI.HTM + + # WOW64 processes mask the native architecture + return ( + os.environ.get('PROCESSOR_ARCHITEW6432', '') or + os.environ.get('PROCESSOR_ARCHITECTURE', '') + ) + + +class _Processor: + @classmethod + def get(cls): + func = getattr(cls, f'get_{sys.platform}', cls.from_subprocess) + return func() or '' + + def get_win32(): + return os.environ.get('PROCESSOR_IDENTIFIER', _get_machine_win32()) + + def get_OpenVMS(): + try: + import vms_lib + except ImportError: + pass + else: + csid, cpu_number = vms_lib.getsyi('SYI$_CPU', 0) + return 'Alpha' if cpu_number >= 128 else 'VAX' + + def from_subprocess(): + """ + Fall back to `uname -p` + """ + try: + return subprocess.check_output( + ['uname', '-p'], + stderr=subprocess.DEVNULL, + text=True, + ).strip() + except (OSError, subprocess.CalledProcessError): + pass + + +def _unknown_as_blank(val): + return '' if val == 'unknown' else val + + ### Portable uname() interface -uname_result = collections.namedtuple("uname_result", - "system node release version machine processor") +class uname_result( + collections.namedtuple( + "uname_result_base", + "system node release version machine") + ): + """ + A uname_result that's largely compatible with a + simple namedtuple except that 'platform' is + resolved late and cached to avoid calling "uname" + except when needed. + """ + + @functools.cached_property + def processor(self): + return _unknown_as_blank(_Processor.get()) + + def __iter__(self): + return itertools.chain( + super().__iter__(), + (self.processor,) + ) + + def __getitem__(self, key): + return tuple(iter(self))[key] + + def __len__(self): + return len(tuple(iter(self))) + _uname_cache = None + def uname(): """ Fairly portable uname interface. Returns a tuple @@ -756,52 +820,30 @@ def uname(): """ global _uname_cache - no_os_uname = 0 if _uname_cache is not None: return _uname_cache - processor = '' - # Get some infos from the builtin os.uname API... try: - system, node, release, version, machine = os.uname() + system, node, release, version, machine = infos = os.uname() except AttributeError: - no_os_uname = 1 - - if no_os_uname or not list(filter(None, (system, node, release, version, machine))): - # Hmm, no there is either no uname or uname has returned - #'unknowns'... we'll have to poke around the system then. - if no_os_uname: - system = sys.platform - release = '' - version = '' - node = _node() - machine = '' + system = sys.platform + node = _node() + release = version = machine = '' + infos = () - use_syscmd_ver = 1 + if not any(infos): + # uname is not available # Try win32_ver() on win32 platforms if system == 'win32': release, version, csd, ptype = win32_ver() - if release and version: - use_syscmd_ver = 0 - # Try to use the PROCESSOR_* environment variables - # available on Win XP and later; see - # http://support.microsoft.com/kb/888731 and - # http://www.geocities.com/rick_lively/MANUALS/ENV/MSWIN/PROCESSI.HTM - if not machine: - # WOW64 processes mask the native architecture - if "PROCESSOR_ARCHITEW6432" in os.environ: - machine = os.environ.get("PROCESSOR_ARCHITEW6432", '') - else: - machine = os.environ.get('PROCESSOR_ARCHITECTURE', '') - if not processor: - processor = os.environ.get('PROCESSOR_IDENTIFIER', machine) + machine = machine or _get_machine_win32() # Try the 'ver' system command available on some # platforms - if use_syscmd_ver: + if not (release and version): system, release, version = _syscmd_ver(system) # Normalize system to what win32_ver() normally returns # (_syscmd_ver() tends to return the vendor name as well) @@ -841,42 +883,15 @@ def uname(): if not release or release == '0': release = version version = '' - # Get processor information - try: - import vms_lib - except ImportError: - pass - else: - csid, cpu_number = vms_lib.getsyi('SYI$_CPU', 0) - if (cpu_number >= 128): - processor = 'Alpha' - else: - processor = 'VAX' - if not processor: - # Get processor information from the uname system command - processor = _syscmd_uname('-p', '') - - #If any unknowns still exist, replace them with ''s, which are more portable - if system == 'unknown': - system = '' - if node == 'unknown': - node = '' - if release == 'unknown': - release = '' - if version == 'unknown': - version = '' - if machine == 'unknown': - machine = '' - if processor == 'unknown': - processor = '' # normalize name if system == 'Microsoft' and release == 'Windows': system = 'Windows' release = 'Vista' - _uname_cache = uname_result(system, node, release, version, - machine, processor) + vals = system, node, release, version, machine + # Replace 'unknown' values with the more portable '' + _uname_cache = uname_result(*map(_unknown_as_blank, vals)) return _uname_cache ### Direct interfaces to some of the uname() return values @@ -1202,7 +1217,7 @@ def platform(aliased=0, terse=0): elif system in ('Linux',): # check for libc vs. glibc - libcname, libcversion = libc_ver(sys.executable) + libcname, libcversion = libc_ver() platform = _platform(system, release, machine, processor, 'with', libcname+libcversion) diff --git a/Lib/plistlib.py b/Lib/plistlib.py index 04f8a876..aff5fe36 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -46,14 +46,11 @@ Parse Plist example: print(pl["aKey"]) """ __all__ = [ - "readPlist", "writePlist", "readPlistFromBytes", "writePlistToBytes", - "Data", "InvalidFileException", "FMT_XML", "FMT_BINARY", - "load", "dump", "loads", "dumps", "UID" + "InvalidFileException", "FMT_XML", "FMT_BINARY", "load", "dump", "loads", "dumps", "UID" ] import binascii import codecs -import contextlib import datetime import enum from io import BytesIO @@ -61,7 +58,6 @@ import itertools import os import re import struct -from warnings import warn from xml.parsers.expat import ParserCreate @@ -69,112 +65,6 @@ PlistFormat = enum.Enum('PlistFormat', 'FMT_XML FMT_BINARY', module=__name__) globals().update(PlistFormat.__members__) -# -# -# Deprecated functionality -# -# - - -@contextlib.contextmanager -def _maybe_open(pathOrFile, mode): - if isinstance(pathOrFile, str): - with open(pathOrFile, mode) as fp: - yield fp - - else: - yield pathOrFile - - -def readPlist(pathOrFile): - """ - Read a .plist from a path or file. pathOrFile should either - be a file name, or a readable binary file object. - - This function is deprecated, use load instead. - """ - warn("The readPlist function is deprecated, use load() instead", - DeprecationWarning, 2) - - with _maybe_open(pathOrFile, 'rb') as fp: - return load(fp, fmt=None, use_builtin_types=False) - -def writePlist(value, pathOrFile): - """ - Write 'value' to a .plist file. 'pathOrFile' may either be a - file name or a (writable) file object. - - This function is deprecated, use dump instead. - """ - warn("The writePlist function is deprecated, use dump() instead", - DeprecationWarning, 2) - with _maybe_open(pathOrFile, 'wb') as fp: - dump(value, fp, fmt=FMT_XML, sort_keys=True, skipkeys=False) - - -def readPlistFromBytes(data): - """ - Read a plist data from a bytes object. Return the root object. - - This function is deprecated, use loads instead. - """ - warn("The readPlistFromBytes function is deprecated, use loads() instead", - DeprecationWarning, 2) - return load(BytesIO(data), fmt=None, use_builtin_types=False) - - -def writePlistToBytes(value): - """ - Return 'value' as a plist-formatted bytes object. - - This function is deprecated, use dumps instead. - """ - warn("The writePlistToBytes function is deprecated, use dumps() instead", - DeprecationWarning, 2) - f = BytesIO() - dump(value, f, fmt=FMT_XML, sort_keys=True, skipkeys=False) - return f.getvalue() - - -class Data: - """ - Wrapper for binary data. - - This class is deprecated, use a bytes object instead. - """ - - def __init__(self, data): - if not isinstance(data, bytes): - raise TypeError("data must be as bytes") - self.data = data - - @classmethod - def fromBase64(cls, data): - # base64.decodebytes just calls binascii.a2b_base64; - # it seems overkill to use both base64 and binascii. - return cls(_decode_base64(data)) - - def asBase64(self, maxlinelength=76): - return _encode_base64(self.data, maxlinelength) - - def __eq__(self, other): - if isinstance(other, self.__class__): - return self.data == other.data - elif isinstance(other, bytes): - return self.data == other - else: - return NotImplemented - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self.data)) - -# -# -# End of deprecated functionality -# -# - - class UID: def __init__(self, data): if not isinstance(data, int): @@ -202,7 +92,6 @@ class UID: def __hash__(self): return hash(self.data) - # # XML support # @@ -273,11 +162,10 @@ def _escape(text): return text class _PlistParser: - def __init__(self, use_builtin_types, dict_type): + def __init__(self, dict_type): self.stack = [] self.current_key = None self.root = None - self._use_builtin_types = use_builtin_types self._dict_type = dict_type def parse(self, fileobj): @@ -366,11 +254,7 @@ class _PlistParser: self.add_object(self.get_data()) def end_data(self): - if self._use_builtin_types: - self.add_object(_decode_base64(self.get_data())) - - else: - self.add_object(Data.fromBase64(self.get_data())) + self.add_object(_decode_base64(self.get_data())) def end_date(self): self.add_object(_date_from_string(self.get_data())) @@ -452,9 +336,6 @@ class _PlistWriter(_DumbXMLWriter): elif isinstance(value, dict): self.write_dict(value) - elif isinstance(value, Data): - self.write_data(value) - elif isinstance(value, (bytes, bytearray)): self.write_bytes(value) @@ -467,9 +348,6 @@ class _PlistWriter(_DumbXMLWriter): else: raise TypeError("unsupported type: %s" % type(value)) - def write_data(self, data): - self.write_bytes(data.data) - def write_bytes(self, data): self.begin_element("data") self._indent_level -= 1 @@ -563,8 +441,7 @@ class _BinaryPlistParser: see also: http://opensource.apple.com/source/CF/CF-744.18/CFBinaryPList.c """ - def __init__(self, use_builtin_types, dict_type): - self._use_builtin_types = use_builtin_types + def __init__(self, dict_type): self._dict_type = dict_type def parse(self, fp): @@ -664,10 +541,7 @@ class _BinaryPlistParser: elif tokenH == 0x40: # data s = self._get_size(tokenL) - if self._use_builtin_types: - result = self._fp.read(s) - else: - result = Data(self._fp.read(s)) + result = self._fp.read(s) elif tokenH == 0x50: # ascii string s = self._get_size(tokenL) @@ -783,10 +657,6 @@ class _BinaryPlistWriter (object): if (type(value), value) in self._objtable: return - elif isinstance(value, Data): - if (type(value.data), value.data) in self._objtable: - return - elif id(value) in self._objidtable: return @@ -795,8 +665,6 @@ class _BinaryPlistWriter (object): self._objlist.append(value) if isinstance(value, _scalars): self._objtable[(type(value), value)] = refnum - elif isinstance(value, Data): - self._objtable[(type(value.data), value.data)] = refnum else: self._objidtable[id(value)] = refnum @@ -826,8 +694,6 @@ class _BinaryPlistWriter (object): def _getrefnum(self, value): if isinstance(value, _scalars): return self._objtable[(type(value), value)] - elif isinstance(value, Data): - return self._objtable[(type(value.data), value.data)] else: return self._objidtable[id(value)] @@ -885,10 +751,6 @@ class _BinaryPlistWriter (object): f = (value - datetime.datetime(2001, 1, 1)).total_seconds() self._fp.write(struct.pack('>Bd', 0x33, f)) - elif isinstance(value, Data): - self._write_size(0x40, len(value.data)) - self._fp.write(value.data) - elif isinstance(value, (bytes, bytearray)): self._write_size(0x40, len(value)) self._fp.write(value) @@ -970,7 +832,7 @@ _FORMATS={ } -def load(fp, *, fmt=None, use_builtin_types=True, dict_type=dict): +def load(fp, *, fmt=None, dict_type=dict): """Read a .plist file. 'fp' should be a readable and binary file object. Return the unpacked root object (which usually is a dictionary). """ @@ -988,17 +850,16 @@ def load(fp, *, fmt=None, use_builtin_types=True, dict_type=dict): else: P = _FORMATS[fmt]['parser'] - p = P(use_builtin_types=use_builtin_types, dict_type=dict_type) + p = P(dict_type=dict_type) return p.parse(fp) -def loads(value, *, fmt=None, use_builtin_types=True, dict_type=dict): +def loads(value, *, fmt=None, dict_type=dict): """Read a .plist file from a bytes object. Return the unpacked root object (which usually is a dictionary). """ fp = BytesIO(value) - return load( - fp, fmt=fmt, use_builtin_types=use_builtin_types, dict_type=dict_type) + return load(fp, fmt=fmt, dict_type=dict_type) def dump(value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False): diff --git a/Lib/poplib.py b/Lib/poplib.py index e3bd2ab1..0f858731 100644 --- a/Lib/poplib.py +++ b/Lib/poplib.py @@ -107,6 +107,8 @@ class POP3: self.welcome = self._getresp() def _create_socket(self, timeout): + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') return socket.create_connection((self.host, self.port), timeout) def _putline(self, line): @@ -385,7 +387,7 @@ class POP3: for capline in rawcaps: capnm, capargs = _parsecap(capline) caps[capnm] = capargs - except error_proto as _err: + except error_proto: raise error_proto('-ERR CAPA not supported by server') return caps diff --git a/Lib/pprint.py b/Lib/pprint.py index 4bfcc31b..7c1118a4 100644 --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -342,6 +342,33 @@ class PrettyPrinter: _dispatch[_types.MappingProxyType.__repr__] = _pprint_mappingproxy + def _pprint_simplenamespace(self, object, stream, indent, allowance, context, level): + if type(object) is _types.SimpleNamespace: + # The SimpleNamespace repr is "namespace" instead of the class + # name, so we do the same here. For subclasses; use the class name. + cls_name = 'namespace' + else: + cls_name = object.__class__.__name__ + indent += len(cls_name) + 1 + delimnl = ',\n' + ' ' * indent + items = object.__dict__.items() + last_index = len(items) - 1 + + stream.write(cls_name + '(') + for i, (key, ent) in enumerate(items): + stream.write(key) + stream.write('=') + + last = i == last_index + self._format(ent, stream, indent + len(key) + 1, + allowance if last else 1, + context, level) + if not last: + stream.write(delimnl) + stream.write(')') + + _dispatch[_types.SimpleNamespace.__repr__] = _pprint_simplenamespace + def _format_dict_items(self, items, stream, indent, allowance, context, level): write = stream.write diff --git a/Lib/profile.py b/Lib/profile.py index 1346297c..aad458dc 100755 --- a/Lib/profile.py +++ b/Lib/profile.py @@ -425,29 +425,13 @@ class Profile: return self # This method is more useful to profile a single function call. - def runcall(*args, **kw): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runcall' of 'Profile' object " - "needs an argument") - elif 'func' in kw: - func = kw.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runcall expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def runcall(self, func, /, *args, **kw): self.set_cmd(repr(func)) sys.setprofile(self.dispatcher) try: return func(*args, **kw) finally: sys.setprofile(None) - runcall.__text_signature__ = '($self, func, /, *args, **kw)' #****************************************************************** diff --git a/Lib/pstats.py b/Lib/pstats.py index 67a68ebe..e781b91c 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -25,11 +25,13 @@ import os import time import marshal import re + from enum import Enum from functools import cmp_to_key +from dataclasses import dataclass +from typing import Dict -__all__ = ["Stats", "SortKey"] - +__all__ = ["Stats", "SortKey", "FunctionProfile", "StatsProfile"] class SortKey(str, Enum): CALLS = 'calls', 'ncalls' @@ -43,15 +45,31 @@ class SortKey(str, Enum): TIME = 'time', 'tottime' def __new__(cls, *values): - value = values[0] - obj = str.__new__(cls, value) - obj._value_ = value + obj = str.__new__(cls) + + obj._value_ = values[0] for other_value in values[1:]: cls._value2member_map_[other_value] = obj obj._all_values = values return obj +@dataclass(unsafe_hash=True) +class FunctionProfile: + ncalls: int + tottime: float + percall_tottime: float + cumtime: float + percall_cumtime: float + file_name: str + line_number: int + +@dataclass(unsafe_hash=True) +class StatsProfile: + '''Class for keeping track of an item in inventory.''' + total_tt: float + func_profiles: Dict[str, FunctionProfile] + class Stats: """This class is used for creating reports from data generated by the Profile class. It is a "friend" of that class, and imports data either @@ -333,6 +351,41 @@ class Stats: return new_list, msg + def get_stats_profile(self): + """This method returns an instance of StatsProfile, which contains a mapping + of function names to instances of FunctionProfile. Each FunctionProfile + instance holds information related to the function's profile such as how + long the function took to run, how many times it was called, etc... + """ + func_list = self.fcn_list[:] if self.fcn_list else list(self.stats.keys()) + if not func_list: + return StatsProfile(0, {}) + + total_tt = float(f8(self.total_tt)) + func_profiles = {} + stats_profile = StatsProfile(total_tt, func_profiles) + + for func in func_list: + cc, nc, tt, ct, callers = self.stats[func] + file_name, line_number, func_name = func + ncalls = str(nc) if nc == cc else (str(nc) + '/' + str(cc)) + tottime = float(f8(tt)) + percall_tottime = -1 if nc == 0 else float(f8(tt/nc)) + cumtime = float(f8(ct)) + percall_cumtime = -1 if cc == 0 else float(f8(ct/cc)) + func_profile = FunctionProfile( + ncalls, + tottime, # time spent in this function alone + percall_tottime, + cumtime, # time spent in the function plus all functions that this function called, + percall_cumtime, + file_name, + line_number + ) + func_profiles[func_name] = func_profile + + return stats_profile + def get_print_list(self, sel_list): width = self.max_name_len if self.fcn_list: diff --git a/Lib/pydoc.py b/Lib/pydoc.py old mode 100644 new mode 100755 index dc3377d6..35ef3ebd --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -90,9 +90,101 @@ def pathdirs(): normdirs.append(normdir) return dirs +def _findclass(func): + cls = sys.modules.get(func.__module__) + if cls is None: + return None + for name in func.__qualname__.split('.')[:-1]: + cls = getattr(cls, name) + if not inspect.isclass(cls): + return None + return cls + +def _finddoc(obj): + if inspect.ismethod(obj): + name = obj.__func__.__name__ + self = obj.__self__ + if (inspect.isclass(self) and + getattr(getattr(self, name, None), '__func__') is obj.__func__): + # classmethod + cls = self + else: + cls = self.__class__ + elif inspect.isfunction(obj): + name = obj.__name__ + cls = _findclass(obj) + if cls is None or getattr(cls, name) is not obj: + return None + elif inspect.isbuiltin(obj): + name = obj.__name__ + self = obj.__self__ + if (inspect.isclass(self) and + self.__qualname__ + '.' + name == obj.__qualname__): + # classmethod + cls = self + else: + cls = self.__class__ + # Should be tested before isdatadescriptor(). + elif isinstance(obj, property): + func = obj.fget + name = func.__name__ + cls = _findclass(func) + if cls is None or getattr(cls, name) is not obj: + return None + elif inspect.ismethoddescriptor(obj) or inspect.isdatadescriptor(obj): + name = obj.__name__ + cls = obj.__objclass__ + if getattr(cls, name) is not obj: + return None + if inspect.ismemberdescriptor(obj): + slots = getattr(cls, '__slots__', None) + if isinstance(slots, dict) and name in slots: + return slots[name] + else: + return None + for base in cls.__mro__: + try: + doc = _getowndoc(getattr(base, name)) + except AttributeError: + continue + if doc is not None: + return doc + return None + +def _getowndoc(obj): + """Get the documentation string for an object if it is not + inherited from its class.""" + try: + doc = object.__getattribute__(obj, '__doc__') + if doc is None: + return None + if obj is not type: + typedoc = type(obj).__doc__ + if isinstance(typedoc, str) and typedoc == doc: + return None + return doc + except AttributeError: + return None + +def _getdoc(object): + """Get the documentation string for an object. + + All tabs are expanded to spaces. To clean up docstrings that are + indented to line up with blocks of code, any whitespace than can be + uniformly removed from the second line onwards is removed.""" + doc = _getowndoc(object) + if doc is None: + try: + doc = _finddoc(object) + except (AttributeError, TypeError): + return None + if not isinstance(doc, str): + return None + return inspect.cleandoc(doc) + def getdoc(object): """Get the doc string or comments for an object.""" - result = inspect.getdoc(object) or inspect.getcomments(object) + result = _getdoc(object) or inspect.getcomments(object) return result and re.sub('^ *\n', '', result.rstrip()) or '' def splitdoc(doc): @@ -584,7 +676,7 @@ class HTMLDoc(Doc): escape = escape or self.escape results = [] here = 0 - pattern = re.compile(r'\b((http|ftp)://\S+[\w/]|' + pattern = re.compile(r'\b((http|https|ftp)://\S+[\w/]|' r'RFC[- ]?(\d+)|' r'PEP[- ]?(\d+)|' r'(self\.)?(\w+))') @@ -825,11 +917,8 @@ class HTMLDoc(Doc): push(msg) for name, kind, homecls, value in ok: base = self.docother(getattr(object, name), name, mod) - if callable(value) or inspect.isdatadescriptor(value): - doc = getattr(value, "__doc__", None) - else: - doc = None - if doc is None: + doc = getdoc(value) + if not doc: push('
    %s
    \n' % base) else: doc = self.markup(getdoc(value), self.preformat, @@ -1309,10 +1398,7 @@ location listed above. hr.maybe() push(msg) for name, kind, homecls, value in ok: - if callable(value) or inspect.isdatadescriptor(value): - doc = getdoc(value) - else: - doc = None + doc = getdoc(value) try: obj = getattr(object, name) except AttributeError: @@ -1448,8 +1534,10 @@ location listed above. chop = maxlen - len(line) if chop < 0: repr = repr[:chop] + '...' line = (name and self.bold(name) + ' = ' or '') + repr - if doc is not None: - line += '\n' + self.indent(str(doc)) + if not doc: + doc = getdoc(object) + if doc: + line += '\n' + self.indent(str(doc)) + '\n' return line class _PlainTextDoc(TextDoc): @@ -1672,11 +1760,15 @@ def render_doc(thing, title='Python Library Documentation: %s', forceload=0, if not (inspect.ismodule(object) or inspect.isclass(object) or inspect.isroutine(object) or - inspect.isdatadescriptor(object)): + inspect.isdatadescriptor(object) or + _getdoc(object)): # If the passed object is a piece of data or an instance, # document its available methods instead of its value. - object = type(object) - desc += ' object' + if hasattr(object, '__origin__'): + object = object.__origin__ + else: + object = type(object) + desc += ' object' return title % desc + '\n\n' + renderer.document(object, name) def doc(thing, title='Python Library Documentation: %s', forceload=0, @@ -1725,6 +1817,7 @@ class Helper: 'False': '', 'None': '', 'True': '', + '__peg_parser__': '', 'and': 'BOOLEAN', 'as': 'with', 'assert': ('assert', ''), diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index d7600561..40b4579f 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Wed Sep 23 14:35:51 2020 +# Autogenerated by Sphinx on Sun Oct 4 19:26:28 2020 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -99,27 +99,26 @@ topics = {'assert': 'The "assert" statement\n' 'assigned,\n' ' from left to right, to the corresponding targets.\n' '\n' - ' * If the target list contains one target prefixed with an\n' - ' asterisk, called a “starred” target: The object must be ' - 'an\n' - ' iterable with at least as many items as there are targets ' - 'in the\n' - ' target list, minus one. The first items of the iterable ' - 'are\n' - ' assigned, from left to right, to the targets before the ' + ' * If the target list contains one target prefixed with an ' + 'asterisk,\n' + ' called a “starred” target: The object must be an iterable ' + 'with at\n' + ' least as many items as there are targets in the target ' + 'list, minus\n' + ' one. The first items of the iterable are assigned, from ' + 'left to\n' + ' right, to the targets before the starred target. The ' + 'final items\n' + ' of the iterable are assigned to the targets after the ' 'starred\n' - ' target. The final items of the iterable are assigned to ' - 'the\n' - ' targets after the starred target. A list of the remaining ' - 'items\n' - ' in the iterable is then assigned to the starred target ' - '(the list\n' - ' can be empty).\n' + ' target. A list of the remaining items in the iterable is ' + 'then\n' + ' assigned to the starred target (the list can be empty).\n' '\n' ' * Else: The object must be an iterable with the same number ' - 'of\n' - ' items as there are targets in the target list, and the ' - 'items are\n' + 'of items\n' + ' as there are targets in the target list, and the items ' + 'are\n' ' assigned, from left to right, to the corresponding ' 'targets.\n' '\n' @@ -135,10 +134,10 @@ topics = {'assert': 'The "assert" statement\n' 'in the\n' ' current local namespace.\n' '\n' - ' * Otherwise: the name is bound to the object in the global\n' - ' namespace or the outer namespace determined by ' - '"nonlocal",\n' - ' respectively.\n' + ' * Otherwise: the name is bound to the object in the global ' + 'namespace\n' + ' or the outer namespace determined by "nonlocal", ' + 'respectively.\n' '\n' ' The name is rebound if it was already bound. This may cause ' 'the\n' @@ -225,26 +224,27 @@ topics = {'assert': 'The "assert" statement\n' 'called with\n' ' appropriate arguments.\n' '\n' - '* If the target is a slicing: The primary expression in the\n' - ' reference is evaluated. It should yield a mutable sequence ' - 'object\n' - ' (such as a list). The assigned object should be a sequence ' - 'object\n' - ' of the same type. Next, the lower and upper bound ' - 'expressions are\n' - ' evaluated, insofar they are present; defaults are zero and ' - 'the\n' - ' sequence’s length. The bounds should evaluate to integers. ' - 'If\n' - ' either bound is negative, the sequence’s length is added to ' - 'it. The\n' - ' resulting bounds are clipped to lie between zero and the ' + '* If the target is a slicing: The primary expression in the ' + 'reference\n' + ' is evaluated. It should yield a mutable sequence object ' + '(such as a\n' + ' list). The assigned object should be a sequence object of ' + 'the same\n' + ' type. Next, the lower and upper bound expressions are ' + 'evaluated,\n' + ' insofar they are present; defaults are zero and the ' 'sequence’s\n' - ' length, inclusive. Finally, the sequence object is asked to ' - 'replace\n' - ' the slice with the items of the assigned sequence. The ' - 'length of\n' - ' the slice may be different from the length of the assigned ' + ' length. The bounds should evaluate to integers. If either ' + 'bound is\n' + ' negative, the sequence’s length is added to it. The ' + 'resulting\n' + ' bounds are clipped to lie between zero and the sequence’s ' + 'length,\n' + ' inclusive. Finally, the sequence object is asked to replace ' + 'the\n' + ' slice with the items of the assigned sequence. The length ' + 'of the\n' + ' slice may be different from the length of the assigned ' 'sequence,\n' ' thus changing the length of the target sequence, if the ' 'target\n' @@ -514,8 +514,8 @@ topics = {'assert': 'The "assert" statement\n' 'is semantically equivalent to:\n' '\n' ' manager = (EXPRESSION)\n' - ' aexit = type(manager).__aexit__\n' ' aenter = type(manager).__aenter__\n' + ' aexit = type(manager).__aexit__\n' ' value = await aenter(manager)\n' ' hit_except = False\n' '\n' @@ -544,13 +544,17 @@ topics = {'assert': 'The "assert" statement\n' '\n' '-[ Footnotes ]-\n' '\n' - '[1] The exception is propagated to the invocation stack unless\n' - ' there is a "finally" clause which happens to raise another\n' - ' exception. That new exception causes the old one to be lost.\n' + '[1] The exception is propagated to the invocation stack unless ' + 'there\n' + ' is a "finally" clause which happens to raise another ' + 'exception.\n' + ' That new exception causes the old one to be lost.\n' '\n' - '[2] A string literal appearing as the first statement in the\n' - ' function body is transformed into the function’s "__doc__"\n' - ' attribute and therefore the function’s *docstring*.\n' + '[2] A string literal appearing as the first statement in the ' + 'function\n' + ' body is transformed into the function’s "__doc__" attribute ' + 'and\n' + ' therefore the function’s *docstring*.\n' '\n' '[3] A string literal appearing as the first statement in the class\n' ' body is transformed into the namespace’s "__doc__" item and\n' @@ -688,11 +692,13 @@ topics = {'assert': 'The "assert" statement\n' 'needs, for\n' ' example, "object.__getattribute__(self, name)".\n' '\n' - ' Note: This method may still be bypassed when looking ' - 'up special\n' - ' methods as the result of implicit invocation via ' - 'language syntax\n' - ' or built-in functions. See Special method lookup.\n' + ' Note:\n' + '\n' + ' This method may still be bypassed when looking up ' + 'special methods\n' + ' as the result of implicit invocation via language ' + 'syntax or\n' + ' built-in functions. See Special method lookup.\n' '\n' 'object.__setattr__(self, name, value)\n' '\n' @@ -776,15 +782,16 @@ topics = {'assert': 'The "assert" statement\n' '\n' ' sys.modules[__name__].__class__ = VerboseModule\n' '\n' - 'Note: Defining module "__getattr__" and setting module ' - '"__class__"\n' - ' only affect lookups made using the attribute access ' - 'syntax –\n' - ' directly accessing the module globals (whether by code ' - 'within the\n' - ' module, or via a reference to the module’s globals ' - 'dictionary) is\n' - ' unaffected.\n' + 'Note:\n' + '\n' + ' Defining module "__getattr__" and setting module ' + '"__class__" only\n' + ' affect lookups made using the attribute access syntax ' + '– directly\n' + ' accessing the module globals (whether by code within ' + 'the module, or\n' + ' via a reference to the module’s globals dictionary) is ' + 'unaffected.\n' '\n' 'Changed in version 3.5: "__class__" module attribute is ' 'now writable.\n' @@ -867,12 +874,14 @@ topics = {'assert': 'The "assert" statement\n' 'created. The\n' ' descriptor has been assigned to *name*.\n' '\n' - ' Note: "__set_name__()" is only called implicitly as ' - 'part of the\n' - ' "type" constructor, so it will need to be called ' - 'explicitly with\n' - ' the appropriate parameters when a descriptor is ' - 'added to a class\n' + ' Note:\n' + '\n' + ' "__set_name__()" is only called implicitly as part ' + 'of the "type"\n' + ' constructor, so it will need to be called ' + 'explicitly with the\n' + ' appropriate parameters when a descriptor is added ' + 'to a class\n' ' after initial creation:\n' '\n' ' class A:\n' @@ -979,12 +988,13 @@ topics = {'assert': 'The "assert" statement\n' 'define both\n' '"__get__()" and "__set__()", while non-data descriptors ' 'have just the\n' - '"__get__()" method. Data descriptors with "__set__()" ' - 'and "__get__()"\n' - 'defined always override a redefinition in an instance ' - 'dictionary. In\n' - 'contrast, non-data descriptors can be overridden by ' - 'instances.\n' + '"__get__()" method. Data descriptors with "__get__()" ' + 'and "__set__()"\n' + '(and/or "__delete__()") defined always override a ' + 'redefinition in an\n' + 'instance dictionary. In contrast, non-data descriptors ' + 'can be\n' + 'overridden by instances.\n' '\n' 'Python methods (including "staticmethod()" and ' '"classmethod()") are\n' @@ -1032,10 +1042,9 @@ topics = {'assert': 'The "assert" statement\n' '--------------------------\n' '\n' '* When inheriting from a class without *__slots__*, the ' - '*__dict__*\n' - ' and *__weakref__* attribute of the instances will ' - 'always be\n' - ' accessible.\n' + '*__dict__* and\n' + ' *__weakref__* attribute of the instances will always ' + 'be accessible.\n' '\n' '* Without a *__dict__* variable, instances cannot be ' 'assigned new\n' @@ -1050,14 +1059,12 @@ topics = {'assert': 'The "assert" statement\n' ' declaration.\n' '\n' '* Without a *__weakref__* variable for each instance, ' - 'classes\n' - ' defining *__slots__* do not support weak references to ' - 'its\n' - ' instances. If weak reference support is needed, then ' - 'add\n' - ' "\'__weakref__\'" to the sequence of strings in the ' - '*__slots__*\n' - ' declaration.\n' + 'classes defining\n' + ' *__slots__* do not support weak references to its ' + 'instances. If weak\n' + ' reference support is needed, then add ' + '"\'__weakref__\'" to the\n' + ' sequence of strings in the *__slots__* declaration.\n' '\n' '* *__slots__* are implemented at the class level by ' 'creating\n' @@ -1070,24 +1077,23 @@ topics = {'assert': 'The "assert" statement\n' ' attribute would overwrite the descriptor assignment.\n' '\n' '* The action of a *__slots__* declaration is not limited ' - 'to the\n' - ' class where it is defined. *__slots__* declared in ' - 'parents are\n' - ' available in child classes. However, child subclasses ' - 'will get a\n' - ' *__dict__* and *__weakref__* unless they also define ' - '*__slots__*\n' - ' (which should only contain names of any *additional* ' - 'slots).\n' + 'to the class\n' + ' where it is defined. *__slots__* declared in parents ' + 'are available\n' + ' in child classes. However, child subclasses will get a ' + '*__dict__*\n' + ' and *__weakref__* unless they also define *__slots__* ' + '(which should\n' + ' only contain names of any *additional* slots).\n' '\n' '* If a class defines a slot also defined in a base ' - 'class, the\n' - ' instance variable defined by the base class slot is ' - 'inaccessible\n' - ' (except by retrieving its descriptor directly from the ' - 'base class).\n' - ' This renders the meaning of the program undefined. In ' - 'the future, a\n' + 'class, the instance\n' + ' variable defined by the base class slot is ' + 'inaccessible (except by\n' + ' retrieving its descriptor directly from the base ' + 'class). This\n' + ' renders the meaning of the program undefined. In the ' + 'future, a\n' ' check may be added to prevent this.\n' '\n' '* Nonempty *__slots__* does not work for classes derived ' @@ -1096,9 +1102,9 @@ topics = {'assert': 'The "assert" statement\n' '"bytes" and "tuple".\n' '\n' '* Any non-string iterable may be assigned to ' - '*__slots__*. Mappings\n' - ' may also be used; however, in the future, special ' - 'meaning may be\n' + '*__slots__*. Mappings may\n' + ' also be used; however, in the future, special meaning ' + 'may be\n' ' assigned to the values corresponding to each key.\n' '\n' '* *__class__* assignment works only if both classes have ' @@ -1114,9 +1120,9 @@ topics = {'assert': 'The "assert" statement\n' ' raise "TypeError".\n' '\n' '* If an iterator is used for *__slots__* then a ' - 'descriptor is\n' - ' created for each of the iterator’s values. However, ' - 'the *__slots__*\n' + 'descriptor is created\n' + ' for each of the iterator’s values. However, the ' + '*__slots__*\n' ' attribute will be an empty iterator.\n', 'attribute-references': 'Attribute references\n' '********************\n' @@ -1716,6 +1722,10 @@ topics = {'assert': 'The "assert" statement\n' 'for\n' 'function decorators. The result is then bound to the class name.\n' '\n' + 'Changed in version 3.9: Classes may be decorated with any valid\n' + '"assignment_expression". Previously, the grammar was much more\n' + 'restrictive; see **PEP 614** for details.\n' + '\n' '**Programmer’s note:** Variables defined in the class definition ' 'are\n' 'class attributes; they are shared by instances. Instance ' @@ -1877,10 +1887,10 @@ topics = {'assert': 'The "assert" statement\n' ' != x" is true. This behavior is compliant with IEEE 754.\n' '\n' '* "None" and "NotImplemented" are singletons. **PEP 8** ' - 'advises\n' - ' that comparisons for singletons should always be done with ' - '"is" or\n' - ' "is not", never the equality operators.\n' + 'advises that\n' + ' comparisons for singletons should always be done with "is" ' + 'or "is\n' + ' not", never the equality operators.\n' '\n' '* Binary sequences (instances of "bytes" or "bytearray") can ' 'be\n' @@ -1896,15 +1906,15 @@ topics = {'assert': 'The "assert" statement\n' '\n' ' Strings and binary sequences cannot be directly compared.\n' '\n' - '* Sequences (instances of "tuple", "list", or "range") can ' - 'be\n' - ' compared only within each of their types, with the ' - 'restriction that\n' - ' ranges do not support order comparison. Equality ' - 'comparison across\n' - ' these types results in inequality, and ordering comparison ' - 'across\n' - ' these types raises "TypeError".\n' + '* Sequences (instances of "tuple", "list", or "range") can be ' + 'compared\n' + ' only within each of their types, with the restriction that ' + 'ranges do\n' + ' not support order comparison. Equality comparison across ' + 'these\n' + ' types results in inequality, and ordering comparison across ' + 'these\n' + ' types raises "TypeError".\n' '\n' ' Sequences compare lexicographically using comparison of\n' ' corresponding elements. The built-in containers typically ' @@ -1928,8 +1938,8 @@ topics = {'assert': 'The "assert" statement\n' ' false because the type is not the same).\n' '\n' ' * Collections that support order comparison are ordered the ' - 'same\n' - ' as their first unequal elements (for example, "[1,2,x] <= ' + 'same as\n' + ' their first unequal elements (for example, "[1,2,x] <= ' '[1,2,y]"\n' ' has the same value as "x <= y"). If a corresponding ' 'element does\n' @@ -1947,8 +1957,8 @@ topics = {'assert': 'The "assert" statement\n' '"TypeError".\n' '\n' '* Sets (instances of "set" or "frozenset") can be compared ' - 'within\n' - ' and across their types.\n' + 'within and\n' + ' across their types.\n' '\n' ' They define order comparison operators to mean subset and ' 'superset\n' @@ -1967,8 +1977,8 @@ topics = {'assert': 'The "assert" statement\n' ' Comparison of sets enforces reflexivity of its elements.\n' '\n' '* Most other built-in types have no comparison methods ' - 'implemented,\n' - ' so they inherit the default comparison behavior.\n' + 'implemented, so\n' + ' they inherit the default comparison behavior.\n' '\n' 'User-defined classes that customize their comparison behavior ' 'should\n' @@ -2017,10 +2027,10 @@ topics = {'assert': 'The "assert" statement\n' ' "total_ordering()" decorator.\n' '\n' '* The "hash()" result should be consistent with equality. ' - 'Objects\n' - ' that are equal should either have the same hash value, or ' - 'be marked\n' - ' as unhashable.\n' + 'Objects that\n' + ' are equal should either have the same hash value, or be ' + 'marked as\n' + ' unhashable.\n' '\n' 'Python does not enforce these consistency rules. In fact, ' 'the\n' @@ -2294,10 +2304,11 @@ topics = {'assert': 'The "assert" statement\n' ':= a to b do"; e.g., "list(range(3))" returns the list "[0, 1, ' '2]".\n' '\n' - 'Note: There is a subtlety when the sequence is being modified by ' - 'the\n' - ' loop (this can only occur for mutable sequences, e.g. lists). ' - 'An\n' + 'Note:\n' + '\n' + ' There is a subtlety when the sequence is being modified by the ' + 'loop\n' + ' (this can only occur for mutable sequences, e.g. lists). An\n' ' internal counter is used to keep track of which item is used ' 'next,\n' ' and this is incremented on each iteration. When this counter ' @@ -2520,8 +2531,8 @@ topics = {'assert': 'The "assert" statement\n' 'follows:\n' '\n' '1. The context expression (the expression given in the ' - '"with_item")\n' - ' is evaluated to obtain a context manager.\n' + '"with_item") is\n' + ' evaluated to obtain a context manager.\n' '\n' '2. The context manager’s "__enter__()" is loaded for later use.\n' '\n' @@ -2529,13 +2540,15 @@ topics = {'assert': 'The "assert" statement\n' '\n' '4. The context manager’s "__enter__()" method is invoked.\n' '\n' - '5. If a target was included in the "with" statement, the return\n' - ' value from "__enter__()" is assigned to it.\n' + '5. If a target was included in the "with" statement, the return ' + 'value\n' + ' from "__enter__()" is assigned to it.\n' + '\n' + ' Note:\n' '\n' - ' Note: The "with" statement guarantees that if the ' - '"__enter__()"\n' - ' method returns without an error, then "__exit__()" will ' - 'always be\n' + ' The "with" statement guarantees that if the "__enter__()" ' + 'method\n' + ' returns without an error, then "__exit__()" will always be\n' ' called. Thus, if an error occurs during the assignment to ' 'the\n' ' target list, it will be treated the same as an error ' @@ -2625,8 +2638,8 @@ topics = {'assert': 'The "assert" statement\n' '[parameter_list] ")"\n' ' ["->" expression] ":" suite\n' ' decorators ::= decorator+\n' - ' decorator ::= "@" dotted_name ["(" ' - '[argument_list [","]] ")"] NEWLINE\n' + ' decorator ::= "@" assignment_expression ' + 'NEWLINE\n' ' dotted_name ::= identifier ("." identifier)*\n' ' parameter_list ::= defparameter ("," ' 'defparameter)* "," "/" ["," [parameter_list_no_posonly]]\n' @@ -2680,6 +2693,11 @@ topics = {'assert': 'The "assert" statement\n' 'the name\n' '"func".\n' '\n' + 'Changed in version 3.9: Functions may be decorated with any ' + 'valid\n' + '"assignment_expression". Previously, the grammar was much more\n' + 'restrictive; see **PEP 614** for details.\n' + '\n' 'When one or more *parameters* have the form *parameter* "="\n' '*expression*, the function is said to have “default parameter ' 'values.”\n' @@ -2881,6 +2899,10 @@ topics = {'assert': 'The "assert" statement\n' 'function decorators. The result is then bound to the class ' 'name.\n' '\n' + 'Changed in version 3.9: Classes may be decorated with any valid\n' + '"assignment_expression". Previously, the grammar was much more\n' + 'restrictive; see **PEP 614** for details.\n' + '\n' '**Programmer’s note:** Variables defined in the class definition ' 'are\n' 'class attributes; they are shared by instances. Instance ' @@ -3009,8 +3031,8 @@ topics = {'assert': 'The "assert" statement\n' 'is semantically equivalent to:\n' '\n' ' manager = (EXPRESSION)\n' - ' aexit = type(manager).__aexit__\n' ' aenter = type(manager).__aenter__\n' + ' aexit = type(manager).__aexit__\n' ' value = await aenter(manager)\n' ' hit_except = False\n' '\n' @@ -3040,14 +3062,17 @@ topics = {'assert': 'The "assert" statement\n' '\n' '-[ Footnotes ]-\n' '\n' - '[1] The exception is propagated to the invocation stack unless\n' - ' there is a "finally" clause which happens to raise another\n' - ' exception. That new exception causes the old one to be ' - 'lost.\n' + '[1] The exception is propagated to the invocation stack unless ' + 'there\n' + ' is a "finally" clause which happens to raise another ' + 'exception.\n' + ' That new exception causes the old one to be lost.\n' '\n' - '[2] A string literal appearing as the first statement in the\n' - ' function body is transformed into the function’s "__doc__"\n' - ' attribute and therefore the function’s *docstring*.\n' + '[2] A string literal appearing as the first statement in the ' + 'function\n' + ' body is transformed into the function’s "__doc__" attribute ' + 'and\n' + ' therefore the function’s *docstring*.\n' '\n' '[3] A string literal appearing as the first statement in the ' 'class\n' @@ -3146,8 +3171,8 @@ topics = {'assert': 'The "assert" statement\n' ' complex;\n' '\n' '* otherwise, if either argument is a floating point number, ' - 'the\n' - ' other is converted to floating point;\n' + 'the other\n' + ' is converted to floating point;\n' '\n' '* otherwise, both must be integers and no conversion is ' 'necessary.\n' @@ -3257,7 +3282,9 @@ topics = {'assert': 'The "assert" statement\n' 'for\n' ' objects that still exist when the interpreter exits.\n' '\n' - ' Note: "del x" doesn’t directly call "x.__del__()" — the ' + ' Note:\n' + '\n' + ' "del x" doesn’t directly call "x.__del__()" — the ' 'former\n' ' decrements the reference count for "x" by one, and the ' 'latter is\n' @@ -3281,13 +3308,15 @@ topics = {'assert': 'The "assert" statement\n' '\n' ' See also: Documentation for the "gc" module.\n' '\n' - ' Warning: Due to the precarious circumstances under ' - 'which\n' - ' "__del__()" methods are invoked, exceptions that occur ' - 'during\n' - ' their execution are ignored, and a warning is printed ' - 'to\n' - ' "sys.stderr" instead. In particular:\n' + ' Warning:\n' + '\n' + ' Due to the precarious circumstances under which ' + '"__del__()"\n' + ' methods are invoked, exceptions that occur during ' + 'their execution\n' + ' are ignored, and a warning is printed to "sys.stderr" ' + 'instead.\n' + ' In particular:\n' '\n' ' * "__del__()" can be invoked when arbitrary code is ' 'being\n' @@ -3300,22 +3329,20 @@ topics = {'assert': 'The "assert" statement\n' ' that gets interrupted to execute "__del__()".\n' '\n' ' * "__del__()" can be executed during interpreter ' - 'shutdown. As\n' - ' a consequence, the global variables it needs to ' - 'access\n' - ' (including other modules) may already have been ' - 'deleted or set\n' - ' to "None". Python guarantees that globals whose name ' - 'begins\n' - ' with a single underscore are deleted from their ' - 'module before\n' - ' other globals are deleted; if no other references to ' - 'such\n' - ' globals exist, this may help in assuring that ' - 'imported modules\n' - ' are still available at the time when the "__del__()" ' - 'method is\n' - ' called.\n' + 'shutdown. As a\n' + ' consequence, the global variables it needs to access ' + '(including\n' + ' other modules) may already have been deleted or set ' + 'to "None".\n' + ' Python guarantees that globals whose name begins ' + 'with a single\n' + ' underscore are deleted from their module before ' + 'other globals\n' + ' are deleted; if no other references to such globals ' + 'exist, this\n' + ' may help in assuring that imported modules are still ' + 'available\n' + ' at the time when the "__del__()" method is called.\n' '\n' 'object.__repr__(self)\n' '\n' @@ -3400,7 +3427,7 @@ topics = {'assert': 'The "assert" statement\n' '\n' ' Changed in version 3.7: "object.__format__(x, \'\')" is ' 'now\n' - ' equivalent to "str(x)" rather than "format(str(self), ' + ' equivalent to "str(x)" rather than "format(str(x), ' '\'\')".\n' '\n' 'object.__lt__(self, other)\n' @@ -3491,19 +3518,21 @@ topics = {'assert': 'The "assert" statement\n' ' def __hash__(self):\n' ' return hash((self.name, self.nick, self.color))\n' '\n' - ' Note: "hash()" truncates the value returned from an ' - 'object’s\n' - ' custom "__hash__()" method to the size of a ' - '"Py_ssize_t". This\n' - ' is typically 8 bytes on 64-bit builds and 4 bytes on ' - '32-bit\n' - ' builds. If an object’s "__hash__()" must ' - 'interoperate on builds\n' - ' of different bit sizes, be sure to check the width on ' - 'all\n' - ' supported builds. An easy way to do this is with ' - '"python -c\n' - ' "import sys; print(sys.hash_info.width)"".\n' + ' Note:\n' + '\n' + ' "hash()" truncates the value returned from an object’s ' + 'custom\n' + ' "__hash__()" method to the size of a "Py_ssize_t". ' + 'This is\n' + ' typically 8 bytes on 64-bit builds and 4 bytes on ' + '32-bit builds.\n' + ' If an object’s "__hash__()" must interoperate on ' + 'builds of\n' + ' different bit sizes, be sure to check the width on all ' + 'supported\n' + ' builds. An easy way to do this is with "python -c ' + '"import sys;\n' + ' print(sys.hash_info.width)"".\n' '\n' ' If a class does not define an "__eq__()" method it ' 'should not\n' @@ -3561,22 +3590,24 @@ topics = {'assert': 'The "assert" statement\n' ' hashable by an "isinstance(obj, ' 'collections.abc.Hashable)" call.\n' '\n' - ' Note: By default, the "__hash__()" values of str and ' - 'bytes\n' - ' objects are “salted” with an unpredictable random ' - 'value.\n' - ' Although they remain constant within an individual ' - 'Python\n' - ' process, they are not predictable between repeated ' - 'invocations of\n' - ' Python.This is intended to provide protection against ' - 'a denial-\n' - ' of-service caused by carefully-chosen inputs that ' - 'exploit the\n' - ' worst case performance of a dict insertion, O(n^2) ' - 'complexity.\n' - ' See ' - 'http://www.ocert.org/advisories/ocert-2011-003.html for\n' + ' Note:\n' + '\n' + ' By default, the "__hash__()" values of str and bytes ' + 'objects are\n' + ' “salted” with an unpredictable random value. Although ' + 'they\n' + ' remain constant within an individual Python process, ' + 'they are not\n' + ' predictable between repeated invocations of ' + 'Python.This is\n' + ' intended to provide protection against a ' + 'denial-of-service caused\n' + ' by carefully-chosen inputs that exploit the worst ' + 'case\n' + ' performance of a dict insertion, O(n^2) complexity. ' + 'See\n' + ' http://www.ocert.org/advisories/ocert-2011-003.html ' + 'for\n' ' details.Changing hash values affects the iteration ' 'order of sets.\n' ' Python has never made guarantees about this ordering ' @@ -3966,7 +3997,7 @@ topics = {'assert': 'The "assert" statement\n' 'is\n' ' first hit. The arguments are the same as for "break".\n' '\n' - 'cl(ear) [filename:lineno | bpnumber [bpnumber ...]]\n' + 'cl(ear) [filename:lineno | bpnumber ...]\n' '\n' ' With a *filename:lineno* argument, clear all the breakpoints ' 'at\n' @@ -3976,7 +4007,7 @@ topics = {'assert': 'The "assert" statement\n' 'first\n' ' ask confirmation).\n' '\n' - 'disable [bpnumber [bpnumber ...]]\n' + 'disable [bpnumber ...]\n' '\n' ' Disable the breakpoints given as a space separated list of\n' ' breakpoint numbers. Disabling a breakpoint means it cannot ' @@ -3985,7 +4016,7 @@ topics = {'assert': 'The "assert" statement\n' 'breakpoint, it\n' ' remains in the list of breakpoints and can be (re-)enabled.\n' '\n' - 'enable [bpnumber [bpnumber ...]]\n' + 'enable [bpnumber ...]\n' '\n' ' Enable the breakpoints specified.\n' '\n' @@ -4156,9 +4187,11 @@ topics = {'assert': 'The "assert" statement\n' 'its\n' ' value.\n' '\n' - ' Note: "print()" can also be used, but is not a debugger ' - 'command —\n' - ' this executes the Python "print()" function.\n' + ' Note:\n' + '\n' + ' "print()" can also be used, but is not a debugger command — ' + 'this\n' + ' executes the Python "print()" function.\n' '\n' 'pp expression\n' '\n' @@ -4290,8 +4323,8 @@ topics = {'assert': 'The "assert" statement\n' '-[ Footnotes ]-\n' '\n' '[1] Whether a frame is considered to originate in a certain ' - 'module\n' - ' is determined by the "__name__" in the frame globals.\n', + 'module is\n' + ' determined by the "__name__" in the frame globals.\n', 'del': 'The "del" statement\n' '*******************\n' '\n' @@ -4471,13 +4504,15 @@ topics = {'assert': 'The "assert" statement\n' 'about the\n' 'exceptional condition.\n' '\n' - 'Note: Exception messages are not part of the Python API. ' - 'Their\n' - ' contents may change from one version of Python to the next ' - 'without\n' - ' warning and should not be relied on by code which will run ' - 'under\n' - ' multiple versions of the interpreter.\n' + 'Note:\n' + '\n' + ' Exception messages are not part of the Python API. Their ' + 'contents\n' + ' may change from one version of Python to the next without ' + 'warning\n' + ' and should not be relied on by code which will run under ' + 'multiple\n' + ' versions of the interpreter.\n' '\n' 'See also the description of the "try" statement in section The ' 'try\n' @@ -4487,10 +4522,9 @@ topics = {'assert': 'The "assert" statement\n' '-[ Footnotes ]-\n' '\n' '[1] This limitation occurs because the code that is executed ' - 'by\n' - ' these operations is not available at the time the module ' - 'is\n' - ' compiled.\n', + 'by these\n' + ' operations is not available at the time the module is ' + 'compiled.\n', 'execmodel': 'Execution model\n' '***************\n' '\n' @@ -4512,9 +4546,13 @@ topics = {'assert': 'The "assert" statement\n' '(a\n' 'command specified on the interpreter command line with the ' '"-c"\n' - 'option) is a code block. The string argument passed to the ' - 'built-in\n' - 'functions "eval()" and "exec()" is a code block.\n' + 'option) is a code block. A module run as a top level script (as ' + 'module\n' + '"__main__") from the command line using a "-m" argument is also ' + 'a code\n' + 'block. The string argument passed to the built-in functions ' + '"eval()"\n' + 'and "exec()" is a code block.\n' '\n' 'A code block is executed in an *execution frame*. A frame ' 'contains\n' @@ -4792,13 +4830,15 @@ topics = {'assert': 'The "assert" statement\n' 'about the\n' 'exceptional condition.\n' '\n' - 'Note: Exception messages are not part of the Python API. ' - 'Their\n' - ' contents may change from one version of Python to the next ' - 'without\n' - ' warning and should not be relied on by code which will run ' - 'under\n' - ' multiple versions of the interpreter.\n' + 'Note:\n' + '\n' + ' Exception messages are not part of the Python API. Their ' + 'contents\n' + ' may change from one version of Python to the next without ' + 'warning\n' + ' and should not be relied on by code which will run under ' + 'multiple\n' + ' versions of the interpreter.\n' '\n' 'See also the description of the "try" statement in section The ' 'try\n' @@ -4807,11 +4847,10 @@ topics = {'assert': 'The "assert" statement\n' '\n' '-[ Footnotes ]-\n' '\n' - '[1] This limitation occurs because the code that is executed ' - 'by\n' - ' these operations is not available at the time the module ' - 'is\n' - ' compiled.\n', + '[1] This limitation occurs because the code that is executed by ' + 'these\n' + ' operations is not available at the time the module is ' + 'compiled.\n', 'exprlists': 'Expression lists\n' '****************\n' '\n' @@ -4930,8 +4969,11 @@ topics = {'assert': 'The "assert" statement\n' 'i\n' ':= a to b do"; e.g., "list(range(3))" returns the list "[0, 1, 2]".\n' '\n' - 'Note: There is a subtlety when the sequence is being modified by the\n' - ' loop (this can only occur for mutable sequences, e.g. lists). An\n' + 'Note:\n' + '\n' + ' There is a subtlety when the sequence is being modified by the ' + 'loop\n' + ' (this can only occur for mutable sequences, e.g. lists). An\n' ' internal counter is used to keep track of which item is used next,\n' ' and this is incremented on each iteration. When this counter has\n' ' reached the length of the sequence the loop terminates. This ' @@ -5689,8 +5731,8 @@ topics = {'assert': 'The "assert" statement\n' '[parameter_list] ")"\n' ' ["->" expression] ":" suite\n' ' decorators ::= decorator+\n' - ' decorator ::= "@" dotted_name ["(" ' - '[argument_list [","]] ")"] NEWLINE\n' + ' decorator ::= "@" assignment_expression ' + 'NEWLINE\n' ' dotted_name ::= identifier ("." identifier)*\n' ' parameter_list ::= defparameter ("," ' 'defparameter)* "," "/" ["," [parameter_list_no_posonly]]\n' @@ -5744,6 +5786,11 @@ topics = {'assert': 'The "assert" statement\n' 'the name\n' '"func".\n' '\n' + 'Changed in version 3.9: Functions may be decorated with any ' + 'valid\n' + '"assignment_expression". Previously, the grammar was much more\n' + 'restrictive; see **PEP 614** for details.\n' + '\n' 'When one or more *parameters* have the form *parameter* "="\n' '*expression*, the function is said to have “default parameter ' 'values.”\n' @@ -5934,7 +5981,9 @@ topics = {'assert': 'The "assert" statement\n' 'defined.\n' ' See section The import statement.\n' '\n' - ' Note: The name "_" is often used in conjunction with\n' + ' Note:\n' + '\n' + ' The name "_" is often used in conjunction with\n' ' internationalization; refer to the documentation for the\n' ' "gettext" module for more information on this ' 'convention.\n' @@ -6080,7 +6129,9 @@ topics = {'assert': 'The "assert" statement\n' 'defined.\n' ' See section The import statement.\n' '\n' - ' Note: The name "_" is often used in conjunction with\n' + ' Note:\n' + '\n' + ' The name "_" is often used in conjunction with\n' ' internationalization; refer to the documentation for ' 'the\n' ' "gettext" module for more information on this ' @@ -6165,8 +6216,9 @@ topics = {'assert': 'The "assert" statement\n' '\n' '1. find a module, loading and initializing it if necessary\n' '\n' - '2. define a name or names in the local namespace for the scope\n' - ' where the "import" statement occurs.\n' + '2. define a name or names in the local namespace for the scope ' + 'where\n' + ' the "import" statement occurs.\n' '\n' 'When the statement contains multiple clauses (separated by commas) ' 'the\n' @@ -6192,8 +6244,9 @@ topics = {'assert': 'The "assert" statement\n' 'made\n' 'available in the local namespace in one of three ways:\n' '\n' - '* If the module name is followed by "as", then the name following\n' - ' "as" is bound directly to the imported module.\n' + '* If the module name is followed by "as", then the name following ' + '"as"\n' + ' is bound directly to the imported module.\n' '\n' '* If no other name is specified, and the module being imported is ' 'a\n' @@ -6871,15 +6924,17 @@ topics = {'assert': 'The "assert" statement\n' '"__rpow__()" (the\n' ' coercion rules would become too complicated).\n' '\n' - ' Note: If the right operand’s type is a subclass of the ' - 'left\n' - ' operand’s type and that subclass provides the ' - 'reflected method\n' - ' for the operation, this method will be called before ' - 'the left\n' - ' operand’s non-reflected method. This behavior allows ' - 'subclasses\n' - ' to override their ancestors’ operations.\n' + ' Note:\n' + '\n' + ' If the right operand’s type is a subclass of the left ' + 'operand’s\n' + ' type and that subclass provides the reflected method ' + 'for the\n' + ' operation, this method will be called before the left ' + 'operand’s\n' + ' non-reflected method. This behavior allows subclasses ' + 'to\n' + ' override their ancestors’ operations.\n' '\n' 'object.__iadd__(self, other)\n' 'object.__isub__(self, other)\n' @@ -6923,13 +6978,15 @@ topics = {'assert': 'The "assert" statement\n' 'the data\n' ' model.\n' '\n' - ' Note: Due to a bug in the dispatching mechanism for ' - '"**=", a\n' - ' class that defines "__ipow__()" but returns ' - '"NotImplemented"\n' - ' would fail to fall back to "x.__pow__(y)" and ' - '"y.__rpow__(x)".\n' - ' This bug is fixed in Python 3.10.\n' + ' Note:\n' + '\n' + ' Due to a bug in the dispatching mechanism for "**=", a ' + 'class that\n' + ' defines "__ipow__()" but returns "NotImplemented" ' + 'would fail to\n' + ' fall back to "x.__pow__(y)" and "y.__rpow__(x)". This ' + 'bug is\n' + ' fixed in Python 3.10.\n' '\n' 'object.__neg__(self)\n' 'object.__pos__(self)\n' @@ -7207,8 +7264,8 @@ topics = {'assert': 'The "assert" statement\n' '-[ Footnotes ]-\n' '\n' '[1] While "abs(x%y) < abs(y)" is true mathematically, ' - 'for floats\n' - ' it may not be true numerically due to roundoff. For ' + 'for floats it\n' + ' may not be true numerically due to roundoff. For ' 'example, and\n' ' assuming a platform on which a Python float is an ' 'IEEE 754 double-\n' @@ -7273,22 +7330,22 @@ topics = {'assert': 'The "assert" statement\n' '"unicodedata.normalize()".\n' '\n' '[4] Due to automatic garbage-collection, free lists, and ' - 'the\n' - ' dynamic nature of descriptors, you may notice ' - 'seemingly unusual\n' - ' behaviour in certain uses of the "is" operator, like ' - 'those\n' - ' involving comparisons between instance methods, or ' - 'constants.\n' - ' Check their documentation for more info.\n' + 'the dynamic\n' + ' nature of descriptors, you may notice seemingly ' + 'unusual behaviour\n' + ' in certain uses of the "is" operator, like those ' + 'involving\n' + ' comparisons between instance methods, or constants. ' + 'Check their\n' + ' documentation for more info.\n' '\n' '[5] The "%" operator is also used for string formatting; ' 'the same\n' ' precedence applies.\n' '\n' '[6] The power operator "**" binds less tightly than an ' - 'arithmetic\n' - ' or bitwise unary operator on its right, that is, ' + 'arithmetic or\n' + ' bitwise unary operator on its right, that is, ' '"2**-1" is "0.5".\n', 'pass': 'The "pass" statement\n' '********************\n' @@ -7578,9 +7635,11 @@ topics = {'assert': 'The "assert" statement\n' '\n' ' New in version 3.4.\n' '\n' - 'Note: Slicing is done exclusively with the following three ' - 'methods.\n' - ' A call like\n' + 'Note:\n' + '\n' + ' Slicing is done exclusively with the following three ' + 'methods. A\n' + ' call like\n' '\n' ' a[1:2] = b\n' '\n' @@ -7611,7 +7670,9 @@ topics = {'assert': 'The "assert" statement\n' 'the\n' ' container), "KeyError" should be raised.\n' '\n' - ' Note: "for" loops expect that an "IndexError" will be ' + ' Note:\n' + '\n' + ' "for" loops expect that an "IndexError" will be ' 'raised for\n' ' illegal indexes to allow proper detection of the end ' 'of the\n' @@ -7847,26 +7908,26 @@ topics = {'assert': 'The "assert" statement\n' '-[ Footnotes ]-\n' '\n' '[1] Additional information on these special methods may be ' - 'found\n' - ' in the Python Reference Manual (Basic customization).\n' + 'found in\n' + ' the Python Reference Manual (Basic customization).\n' '\n' '[2] As a consequence, the list "[1, 2]" is considered equal ' - 'to\n' - ' "[1.0, 2.0]", and similarly for tuples.\n' + 'to "[1.0,\n' + ' 2.0]", and similarly for tuples.\n' '\n' '[3] They must have since the parser can’t tell the type of ' 'the\n' ' operands.\n' '\n' '[4] Cased characters are those with general category ' - 'property\n' - ' being one of “Lu” (Letter, uppercase), “Ll” (Letter, ' - 'lowercase),\n' - ' or “Lt” (Letter, titlecase).\n' - '\n' - '[5] To format only a tuple you should therefore provide a\n' - ' singleton tuple whose only element is the tuple to be ' - 'formatted.\n', + 'property being\n' + ' one of “Lu” (Letter, uppercase), “Ll” (Letter, ' + 'lowercase), or “Lt”\n' + ' (Letter, titlecase).\n' + '\n' + '[5] To format only a tuple you should therefore provide a ' + 'singleton\n' + ' tuple whose only element is the tuple to be formatted.\n', 'specialnames': 'Special method names\n' '********************\n' '\n' @@ -8011,7 +8072,9 @@ topics = {'assert': 'The "assert" statement\n' 'for\n' ' objects that still exist when the interpreter exits.\n' '\n' - ' Note: "del x" doesn’t directly call "x.__del__()" — the ' + ' Note:\n' + '\n' + ' "del x" doesn’t directly call "x.__del__()" — the ' 'former\n' ' decrements the reference count for "x" by one, and the ' 'latter is\n' @@ -8035,12 +8098,15 @@ topics = {'assert': 'The "assert" statement\n' '\n' ' See also: Documentation for the "gc" module.\n' '\n' - ' Warning: Due to the precarious circumstances under which\n' - ' "__del__()" methods are invoked, exceptions that occur ' - 'during\n' - ' their execution are ignored, and a warning is printed ' - 'to\n' - ' "sys.stderr" instead. In particular:\n' + ' Warning:\n' + '\n' + ' Due to the precarious circumstances under which ' + '"__del__()"\n' + ' methods are invoked, exceptions that occur during their ' + 'execution\n' + ' are ignored, and a warning is printed to "sys.stderr" ' + 'instead.\n' + ' In particular:\n' '\n' ' * "__del__()" can be invoked when arbitrary code is ' 'being\n' @@ -8053,22 +8119,20 @@ topics = {'assert': 'The "assert" statement\n' ' that gets interrupted to execute "__del__()".\n' '\n' ' * "__del__()" can be executed during interpreter ' - 'shutdown. As\n' - ' a consequence, the global variables it needs to ' - 'access\n' - ' (including other modules) may already have been ' - 'deleted or set\n' - ' to "None". Python guarantees that globals whose name ' - 'begins\n' - ' with a single underscore are deleted from their ' - 'module before\n' - ' other globals are deleted; if no other references to ' - 'such\n' - ' globals exist, this may help in assuring that ' - 'imported modules\n' - ' are still available at the time when the "__del__()" ' - 'method is\n' - ' called.\n' + 'shutdown. As a\n' + ' consequence, the global variables it needs to access ' + '(including\n' + ' other modules) may already have been deleted or set ' + 'to "None".\n' + ' Python guarantees that globals whose name begins with ' + 'a single\n' + ' underscore are deleted from their module before other ' + 'globals\n' + ' are deleted; if no other references to such globals ' + 'exist, this\n' + ' may help in assuring that imported modules are still ' + 'available\n' + ' at the time when the "__del__()" method is called.\n' '\n' 'object.__repr__(self)\n' '\n' @@ -8153,7 +8217,7 @@ topics = {'assert': 'The "assert" statement\n' '\n' ' Changed in version 3.7: "object.__format__(x, \'\')" is ' 'now\n' - ' equivalent to "str(x)" rather than "format(str(self), ' + ' equivalent to "str(x)" rather than "format(str(x), ' '\'\')".\n' '\n' 'object.__lt__(self, other)\n' @@ -8244,19 +8308,21 @@ topics = {'assert': 'The "assert" statement\n' ' def __hash__(self):\n' ' return hash((self.name, self.nick, self.color))\n' '\n' - ' Note: "hash()" truncates the value returned from an ' - 'object’s\n' - ' custom "__hash__()" method to the size of a ' - '"Py_ssize_t". This\n' - ' is typically 8 bytes on 64-bit builds and 4 bytes on ' - '32-bit\n' - ' builds. If an object’s "__hash__()" must interoperate ' - 'on builds\n' - ' of different bit sizes, be sure to check the width on ' - 'all\n' - ' supported builds. An easy way to do this is with ' - '"python -c\n' - ' "import sys; print(sys.hash_info.width)"".\n' + ' Note:\n' + '\n' + ' "hash()" truncates the value returned from an object’s ' + 'custom\n' + ' "__hash__()" method to the size of a "Py_ssize_t". ' + 'This is\n' + ' typically 8 bytes on 64-bit builds and 4 bytes on ' + '32-bit builds.\n' + ' If an object’s "__hash__()" must interoperate on ' + 'builds of\n' + ' different bit sizes, be sure to check the width on all ' + 'supported\n' + ' builds. An easy way to do this is with "python -c ' + '"import sys;\n' + ' print(sys.hash_info.width)"".\n' '\n' ' If a class does not define an "__eq__()" method it should ' 'not\n' @@ -8312,21 +8378,22 @@ topics = {'assert': 'The "assert" statement\n' ' hashable by an "isinstance(obj, ' 'collections.abc.Hashable)" call.\n' '\n' - ' Note: By default, the "__hash__()" values of str and ' - 'bytes\n' - ' objects are “salted” with an unpredictable random ' - 'value.\n' - ' Although they remain constant within an individual ' - 'Python\n' - ' process, they are not predictable between repeated ' - 'invocations of\n' - ' Python.This is intended to provide protection against a ' - 'denial-\n' - ' of-service caused by carefully-chosen inputs that ' - 'exploit the\n' - ' worst case performance of a dict insertion, O(n^2) ' - 'complexity.\n' - ' See http://www.ocert.org/advisories/ocert-2011-003.html ' + ' Note:\n' + '\n' + ' By default, the "__hash__()" values of str and bytes ' + 'objects are\n' + ' “salted” with an unpredictable random value. Although ' + 'they\n' + ' remain constant within an individual Python process, ' + 'they are not\n' + ' predictable between repeated invocations of Python.This ' + 'is\n' + ' intended to provide protection against a ' + 'denial-of-service caused\n' + ' by carefully-chosen inputs that exploit the worst case\n' + ' performance of a dict insertion, O(n^2) complexity. ' + 'See\n' + ' http://www.ocert.org/advisories/ocert-2011-003.html ' 'for\n' ' details.Changing hash values affects the iteration ' 'order of sets.\n' @@ -8415,11 +8482,13 @@ topics = {'assert': 'The "assert" statement\n' 'needs, for\n' ' example, "object.__getattribute__(self, name)".\n' '\n' - ' Note: This method may still be bypassed when looking up ' - 'special\n' - ' methods as the result of implicit invocation via ' - 'language syntax\n' - ' or built-in functions. See Special method lookup.\n' + ' Note:\n' + '\n' + ' This method may still be bypassed when looking up ' + 'special methods\n' + ' as the result of implicit invocation via language ' + 'syntax or\n' + ' built-in functions. See Special method lookup.\n' '\n' 'object.__setattr__(self, name, value)\n' '\n' @@ -8503,15 +8572,16 @@ topics = {'assert': 'The "assert" statement\n' '\n' ' sys.modules[__name__].__class__ = VerboseModule\n' '\n' - 'Note: Defining module "__getattr__" and setting module ' - '"__class__"\n' - ' only affect lookups made using the attribute access syntax ' - '–\n' - ' directly accessing the module globals (whether by code ' - 'within the\n' - ' module, or via a reference to the module’s globals ' - 'dictionary) is\n' - ' unaffected.\n' + 'Note:\n' + '\n' + ' Defining module "__getattr__" and setting module ' + '"__class__" only\n' + ' affect lookups made using the attribute access syntax – ' + 'directly\n' + ' accessing the module globals (whether by code within the ' + 'module, or\n' + ' via a reference to the module’s globals dictionary) is ' + 'unaffected.\n' '\n' 'Changed in version 3.5: "__class__" module attribute is now ' 'writable.\n' @@ -8594,12 +8664,14 @@ topics = {'assert': 'The "assert" statement\n' 'The\n' ' descriptor has been assigned to *name*.\n' '\n' - ' Note: "__set_name__()" is only called implicitly as part ' - 'of the\n' - ' "type" constructor, so it will need to be called ' - 'explicitly with\n' - ' the appropriate parameters when a descriptor is added ' - 'to a class\n' + ' Note:\n' + '\n' + ' "__set_name__()" is only called implicitly as part of ' + 'the "type"\n' + ' constructor, so it will need to be called explicitly ' + 'with the\n' + ' appropriate parameters when a descriptor is added to a ' + 'class\n' ' after initial creation:\n' '\n' ' class A:\n' @@ -8704,12 +8776,13 @@ topics = {'assert': 'The "assert" statement\n' 'both\n' '"__get__()" and "__set__()", while non-data descriptors have ' 'just the\n' - '"__get__()" method. Data descriptors with "__set__()" and ' - '"__get__()"\n' - 'defined always override a redefinition in an instance ' - 'dictionary. In\n' - 'contrast, non-data descriptors can be overridden by ' - 'instances.\n' + '"__get__()" method. Data descriptors with "__get__()" and ' + '"__set__()"\n' + '(and/or "__delete__()") defined always override a ' + 'redefinition in an\n' + 'instance dictionary. In contrast, non-data descriptors can ' + 'be\n' + 'overridden by instances.\n' '\n' 'Python methods (including "staticmethod()" and ' '"classmethod()") are\n' @@ -8757,10 +8830,9 @@ topics = {'assert': 'The "assert" statement\n' '~~~~~~~~~~~~~~~~~~~~~~~~~~\n' '\n' '* When inheriting from a class without *__slots__*, the ' - '*__dict__*\n' - ' and *__weakref__* attribute of the instances will always ' - 'be\n' - ' accessible.\n' + '*__dict__* and\n' + ' *__weakref__* attribute of the instances will always be ' + 'accessible.\n' '\n' '* Without a *__dict__* variable, instances cannot be ' 'assigned new\n' @@ -8774,13 +8846,12 @@ topics = {'assert': 'The "assert" statement\n' ' declaration.\n' '\n' '* Without a *__weakref__* variable for each instance, ' - 'classes\n' - ' defining *__slots__* do not support weak references to ' - 'its\n' - ' instances. If weak reference support is needed, then add\n' - ' "\'__weakref__\'" to the sequence of strings in the ' - '*__slots__*\n' - ' declaration.\n' + 'classes defining\n' + ' *__slots__* do not support weak references to its ' + 'instances. If weak\n' + ' reference support is needed, then add "\'__weakref__\'" to ' + 'the\n' + ' sequence of strings in the *__slots__* declaration.\n' '\n' '* *__slots__* are implemented at the class level by ' 'creating\n' @@ -8793,23 +8864,22 @@ topics = {'assert': 'The "assert" statement\n' ' attribute would overwrite the descriptor assignment.\n' '\n' '* The action of a *__slots__* declaration is not limited to ' - 'the\n' - ' class where it is defined. *__slots__* declared in ' - 'parents are\n' - ' available in child classes. However, child subclasses will ' - 'get a\n' - ' *__dict__* and *__weakref__* unless they also define ' - '*__slots__*\n' - ' (which should only contain names of any *additional* ' - 'slots).\n' + 'the class\n' + ' where it is defined. *__slots__* declared in parents are ' + 'available\n' + ' in child classes. However, child subclasses will get a ' + '*__dict__*\n' + ' and *__weakref__* unless they also define *__slots__* ' + '(which should\n' + ' only contain names of any *additional* slots).\n' '\n' '* If a class defines a slot also defined in a base class, ' - 'the\n' - ' instance variable defined by the base class slot is ' - 'inaccessible\n' - ' (except by retrieving its descriptor directly from the ' - 'base class).\n' - ' This renders the meaning of the program undefined. In the ' + 'the instance\n' + ' variable defined by the base class slot is inaccessible ' + '(except by\n' + ' retrieving its descriptor directly from the base class). ' + 'This\n' + ' renders the meaning of the program undefined. In the ' 'future, a\n' ' check may be added to prevent this.\n' '\n' @@ -8819,9 +8889,9 @@ topics = {'assert': 'The "assert" statement\n' 'and "tuple".\n' '\n' '* Any non-string iterable may be assigned to *__slots__*. ' - 'Mappings\n' - ' may also be used; however, in the future, special meaning ' - 'may be\n' + 'Mappings may\n' + ' also be used; however, in the future, special meaning may ' + 'be\n' ' assigned to the values corresponding to each key.\n' '\n' '* *__class__* assignment works only if both classes have the ' @@ -8837,8 +8907,8 @@ topics = {'assert': 'The "assert" statement\n' ' raise "TypeError".\n' '\n' '* If an iterator is used for *__slots__* then a descriptor ' - 'is\n' - ' created for each of the iterator’s values. However, the ' + 'is created\n' + ' for each of the iterator’s values. However, the ' '*__slots__*\n' ' attribute will be an empty iterator.\n' '\n' @@ -8891,9 +8961,11 @@ topics = {'assert': 'The "assert" statement\n' 'does nothing,\n' ' but raises an error if it is called with any arguments.\n' '\n' - ' Note: The metaclass hint "metaclass" is consumed by the ' - 'rest of\n' - ' the type machinery, and is never passed to ' + ' Note:\n' + '\n' + ' The metaclass hint "metaclass" is consumed by the rest ' + 'of the\n' + ' type machinery, and is never passed to ' '"__init_subclass__"\n' ' implementations. The actual metaclass (rather than the ' 'explicit\n' @@ -8961,9 +9033,10 @@ topics = {'assert': 'The "assert" statement\n' 'tuple may\n' 'be empty, in such case the original base is ignored.\n' '\n' - 'See also: **PEP 560** - Core support for typing module and ' - 'generic\n' - ' types\n' + 'See also:\n' + '\n' + ' **PEP 560** - Core support for typing module and generic ' + 'types\n' '\n' '\n' 'Determining the appropriate metaclass\n' @@ -9221,9 +9294,10 @@ topics = {'assert': 'The "assert" statement\n' 'type hints,\n' 'other usage is discouraged.\n' '\n' - 'See also: **PEP 560** - Core support for typing module and ' - 'generic\n' - ' types\n' + 'See also:\n' + '\n' + ' **PEP 560** - Core support for typing module and generic ' + 'types\n' '\n' '\n' 'Emulating callable objects\n' @@ -9335,9 +9409,11 @@ topics = {'assert': 'The "assert" statement\n' '\n' ' New in version 3.4.\n' '\n' - 'Note: Slicing is done exclusively with the following three ' - 'methods.\n' - ' A call like\n' + 'Note:\n' + '\n' + ' Slicing is done exclusively with the following three ' + 'methods. A\n' + ' call like\n' '\n' ' a[1:2] = b\n' '\n' @@ -9368,8 +9444,10 @@ topics = {'assert': 'The "assert" statement\n' 'the\n' ' container), "KeyError" should be raised.\n' '\n' - ' Note: "for" loops expect that an "IndexError" will be ' - 'raised for\n' + ' Note:\n' + '\n' + ' "for" loops expect that an "IndexError" will be raised ' + 'for\n' ' illegal indexes to allow proper detection of the end of ' 'the\n' ' sequence.\n' @@ -9559,15 +9637,17 @@ topics = {'assert': 'The "assert" statement\n' '"__rpow__()" (the\n' ' coercion rules would become too complicated).\n' '\n' - ' Note: If the right operand’s type is a subclass of the ' - 'left\n' - ' operand’s type and that subclass provides the reflected ' - 'method\n' - ' for the operation, this method will be called before ' - 'the left\n' - ' operand’s non-reflected method. This behavior allows ' - 'subclasses\n' - ' to override their ancestors’ operations.\n' + ' Note:\n' + '\n' + ' If the right operand’s type is a subclass of the left ' + 'operand’s\n' + ' type and that subclass provides the reflected method ' + 'for the\n' + ' operation, this method will be called before the left ' + 'operand’s\n' + ' non-reflected method. This behavior allows subclasses ' + 'to\n' + ' override their ancestors’ operations.\n' '\n' 'object.__iadd__(self, other)\n' 'object.__isub__(self, other)\n' @@ -9611,13 +9691,15 @@ topics = {'assert': 'The "assert" statement\n' 'the data\n' ' model.\n' '\n' - ' Note: Due to a bug in the dispatching mechanism for ' - '"**=", a\n' - ' class that defines "__ipow__()" but returns ' - '"NotImplemented"\n' - ' would fail to fall back to "x.__pow__(y)" and ' - '"y.__rpow__(x)".\n' - ' This bug is fixed in Python 3.10.\n' + ' Note:\n' + '\n' + ' Due to a bug in the dispatching mechanism for "**=", a ' + 'class that\n' + ' defines "__ipow__()" but returns "NotImplemented" would ' + 'fail to\n' + ' fall back to "x.__pow__(y)" and "y.__rpow__(x)". This ' + 'bug is\n' + ' fixed in Python 3.10.\n' '\n' 'object.__neg__(self)\n' 'object.__pos__(self)\n' @@ -9925,9 +10007,20 @@ topics = {'assert': 'The "assert" statement\n' 'For a list\n' ' of possible encodings, see section Standard Encodings.\n' '\n' + ' By default, the *errors* argument is not checked for ' + 'best\n' + ' performances, but only used at the first encoding ' + 'error. Enable the\n' + ' Python Development Mode, or use a debug build to check ' + '*errors*.\n' + '\n' ' Changed in version 3.1: Support for keyword arguments ' 'added.\n' '\n' + ' Changed in version 3.9: The *errors* is now checked in ' + 'development\n' + ' mode and in debug mode.\n' + '\n' 'str.endswith(suffix[, start[, end]])\n' '\n' ' Return "True" if the string ends with the specified ' @@ -9982,11 +10075,13 @@ topics = {'assert': 'The "assert" statement\n' '"-1" if\n' ' *sub* is not found.\n' '\n' - ' Note: The "find()" method should be used only if you ' - 'need to know\n' - ' the position of *sub*. To check if *sub* is a ' - 'substring or not,\n' - ' use the "in" operator:\n' + ' Note:\n' + '\n' + ' The "find()" method should be used only if you need ' + 'to know the\n' + ' position of *sub*. To check if *sub* is a substring ' + 'or not, use\n' + ' the "in" operator:\n' '\n' " >>> 'Py' in 'Python'\n" ' True\n' @@ -10015,8 +10110,9 @@ topics = {'assert': 'The "assert" statement\n' ' formatting options that can be specified in format ' 'strings.\n' '\n' - ' Note: When formatting a number ("int", "float", ' - '"complex",\n' + ' Note:\n' + '\n' + ' When formatting a number ("int", "float", "complex",\n' ' "decimal.Decimal" and subclasses) with the "n" type ' '(ex:\n' ' "\'{:n}\'.format(1234)"), the function temporarily ' @@ -10221,6 +10317,15 @@ topics = {'assert': 'The "assert" statement\n' '"False"\n' ' otherwise.\n' '\n' + " >>> 'BANANA'.isupper()\n" + ' True\n' + " >>> 'banana'.isupper()\n" + ' False\n' + " >>> 'baNana'.isupper()\n" + ' False\n' + " >>> ' '.isupper()\n" + ' False\n' + '\n' 'str.join(iterable)\n' '\n' ' Return a string which is the concatenation of the ' @@ -10269,6 +10374,16 @@ topics = {'assert': 'The "assert" statement\n' " >>> 'www.example.com'.lstrip('cmowz.')\n" " 'example.com'\n" '\n' + ' See "str.removeprefix()" for a method that will remove ' + 'a single\n' + ' prefix string rather than all of a set of characters. ' + 'For example:\n' + '\n' + " >>> 'Arthur: three!'.lstrip('Arthur: ')\n" + " 'ee!'\n" + " >>> 'Arthur: three!'.removeprefix('Arthur: ')\n" + " 'three!'\n" + '\n' 'static str.maketrans(x[, y[, z]])\n' '\n' ' This static method returns a translation table usable ' @@ -10305,6 +10420,35 @@ topics = {'assert': 'The "assert" statement\n' 'followed by\n' ' two empty strings.\n' '\n' + 'str.removeprefix(prefix, /)\n' + '\n' + ' If the string starts with the *prefix* string, return\n' + ' "string[len(prefix):]". Otherwise, return a copy of the ' + 'original\n' + ' string:\n' + '\n' + " >>> 'TestHook'.removeprefix('Test')\n" + " 'Hook'\n" + " >>> 'BaseTestCase'.removeprefix('Test')\n" + " 'BaseTestCase'\n" + '\n' + ' New in version 3.9.\n' + '\n' + 'str.removesuffix(suffix, /)\n' + '\n' + ' If the string ends with the *suffix* string and that ' + '*suffix* is\n' + ' not empty, return "string[:-len(suffix)]". Otherwise, ' + 'return a copy\n' + ' of the original string:\n' + '\n' + " >>> 'MiscTests'.removesuffix('Tests')\n" + " 'Misc'\n" + " >>> 'TmpDirMixin'.removesuffix('Tests')\n" + " 'TmpDirMixin'\n" + '\n' + ' New in version 3.9.\n' + '\n' 'str.replace(old, new[, count])\n' '\n' ' Return a copy of the string with all occurrences of ' @@ -10382,6 +10526,16 @@ topics = {'assert': 'The "assert" statement\n' " >>> 'mississippi'.rstrip('ipz')\n" " 'mississ'\n" '\n' + ' See "str.removesuffix()" for a method that will remove ' + 'a single\n' + ' suffix string rather than all of a set of characters. ' + 'For example:\n' + '\n' + " >>> 'Monty Python'.rstrip(' Python')\n" + " 'M'\n" + " >>> 'Monty Python'.removesuffix(' Python')\n" + " 'Monty'\n" + '\n' 'str.split(sep=None, maxsplit=-1)\n' '\n' ' Return a list of the words in the string, using *sep* ' @@ -10863,17 +11017,20 @@ topics = {'assert': 'The "assert" statement\n' '\n' '2. Unlike in Standard C, exactly two hex digits are required.\n' '\n' - '3. In a bytes literal, hexadecimal and octal escapes denote the\n' - ' byte with the given value. In a string literal, these escapes\n' - ' denote a Unicode character with the given value.\n' + '3. In a bytes literal, hexadecimal and octal escapes denote the ' + 'byte\n' + ' with the given value. In a string literal, these escapes ' + 'denote a\n' + ' Unicode character with the given value.\n' '\n' '4. Changed in version 3.3: Support for name aliases [1] has been\n' ' added.\n' '\n' '5. Exactly four hex digits are required.\n' '\n' - '6. Any Unicode character can be encoded this way. Exactly eight\n' - ' hex digits are required.\n' + '6. Any Unicode character can be encoded this way. Exactly eight ' + 'hex\n' + ' digits are required.\n' '\n' 'Unlike Standard C, all unrecognized escape sequences are left in ' 'the\n' @@ -11186,10 +11343,17 @@ topics = {'assert': 'The "assert" statement\n' 'for\n' ' the operands provided. (The interpreter will then try the\n' ' reflected operation, or some other fallback, depending on the\n' - ' operator.) Its truth value is true.\n' + ' operator.) It should not be evaluated in a boolean context.\n' '\n' ' See Implementing the arithmetic operations for more details.\n' '\n' + ' Changed in version 3.9: Evaluating "NotImplemented" in a ' + 'boolean\n' + ' context is deprecated. While it currently evaluates as true, it\n' + ' will emit a "DeprecationWarning". It will raise a "TypeError" in ' + 'a\n' + ' future version of Python.\n' + '\n' 'Ellipsis\n' ' This type has a single value. There is a single object with ' 'this\n' @@ -12295,7 +12459,8 @@ topics = {'assert': 'The "assert" statement\n' " >>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))\n" " >>> d = dict([('two', 2), ('one', 1), ('three', 3)])\n" " >>> e = dict({'three': 3, 'one': 1, 'two': 2})\n" - ' >>> a == b == c == d == e\n' + " >>> f = dict({'one': 1, 'three': 3}, two=2)\n" + ' >>> a == b == c == d == e == f\n' ' True\n' '\n' ' Providing keyword arguments as in the first example only ' @@ -12493,6 +12658,29 @@ topics = {'assert': 'The "assert" statement\n' ' >>> d.values() == d.values()\n' ' False\n' '\n' + ' d | other\n' + '\n' + ' Create a new dictionary with the merged keys and ' + 'values of *d*\n' + ' and *other*, which must both be dictionaries. The ' + 'values of\n' + ' *other* take priority when *d* and *other* share ' + 'keys.\n' + '\n' + ' New in version 3.9.\n' + '\n' + ' d |= other\n' + '\n' + ' Update the dictionary *d* with keys and values from ' + '*other*,\n' + ' which may be either a *mapping* or an *iterable* of ' + 'key/value\n' + ' pairs. The values of *other* take priority when *d* ' + 'and *other*\n' + ' share keys.\n' + '\n' + ' New in version 3.9.\n' + '\n' ' Dictionaries compare equal if and only if they have the ' 'same "(key,\n' ' value)" pairs (regardless of ordering). Order comparisons ' @@ -12540,9 +12728,11 @@ topics = {'assert': 'The "assert" statement\n' '\n' ' Changed in version 3.8: Dictionaries are now reversible.\n' '\n' - 'See also: "types.MappingProxyType" can be used to create a ' - 'read-only\n' - ' view of a "dict".\n' + 'See also:\n' + '\n' + ' "types.MappingProxyType" can be used to create a read-only ' + 'view of a\n' + ' "dict".\n' '\n' '\n' 'Dictionary view objects\n' @@ -12926,13 +13116,14 @@ topics = {'assert': 'The "assert" statement\n' '"None", it\n' ' is treated like "1".\n' '\n' - '6. Concatenating immutable sequences always results in a new\n' - ' object. This means that building up a sequence by repeated\n' - ' concatenation will have a quadratic runtime cost in the ' - 'total\n' - ' sequence length. To get a linear runtime cost, you must ' - 'switch to\n' - ' one of the alternatives below:\n' + '6. Concatenating immutable sequences always results in a new ' + 'object.\n' + ' This means that building up a sequence by repeated ' + 'concatenation\n' + ' will have a quadratic runtime cost in the total sequence ' + 'length.\n' + ' To get a linear runtime cost, you must switch to one of the\n' + ' alternatives below:\n' '\n' ' * if concatenating "str" objects, you can build a list and ' 'use\n' @@ -12950,24 +13141,25 @@ topics = {'assert': 'The "assert" statement\n' ' * for other types, investigate the relevant class ' 'documentation\n' '\n' - '7. Some sequence types (such as "range") only support item\n' - ' sequences that follow specific patterns, and hence don’t ' - 'support\n' - ' sequence concatenation or repetition.\n' - '\n' - '8. "index" raises "ValueError" when *x* is not found in *s*. ' - 'Not\n' - ' all implementations support passing the additional arguments ' - '*i*\n' - ' and *j*. These arguments allow efficient searching of ' - 'subsections\n' - ' of the sequence. Passing the extra arguments is roughly ' - 'equivalent\n' - ' to using "s[i:j].index(x)", only without copying any data and ' - 'with\n' - ' the returned index being relative to the start of the ' + '7. Some sequence types (such as "range") only support item ' + 'sequences\n' + ' that follow specific patterns, and hence don’t support ' 'sequence\n' - ' rather than the start of the slice.\n' + ' concatenation or repetition.\n' + '\n' + '8. "index" raises "ValueError" when *x* is not found in *s*. Not ' + 'all\n' + ' implementations support passing the additional arguments *i* ' + 'and\n' + ' *j*. These arguments allow efficient searching of subsections ' + 'of\n' + ' the sequence. Passing the extra arguments is roughly ' + 'equivalent to\n' + ' using "s[i:j].index(x)", only without copying any data and ' + 'with the\n' + ' returned index being relative to the start of the sequence ' + 'rather\n' + ' than the start of the slice.\n' '\n' '\n' 'Immutable Sequence Types\n' @@ -13095,17 +13287,17 @@ topics = {'assert': 'The "assert" statement\n' '1. *t* must have the same length as the slice it is replacing.\n' '\n' '2. The optional argument *i* defaults to "-1", so that by ' - 'default\n' - ' the last item is removed and returned.\n' + 'default the\n' + ' last item is removed and returned.\n' '\n' '3. "remove()" raises "ValueError" when *x* is not found in *s*.\n' '\n' - '4. The "reverse()" method modifies the sequence in place for\n' - ' economy of space when reversing a large sequence. To remind ' - 'users\n' - ' that it operates by side effect, it does not return the ' - 'reversed\n' - ' sequence.\n' + '4. The "reverse()" method modifies the sequence in place for ' + 'economy\n' + ' of space when reversing a large sequence. To remind users ' + 'that it\n' + ' operates by side effect, it does not return the reversed ' + 'sequence.\n' '\n' '5. "clear()" and "copy()" are included for consistency with the\n' ' interfaces of mutable containers that don’t support slicing\n' @@ -13142,9 +13334,9 @@ topics = {'assert': 'The "assert" statement\n' ' * Using a pair of square brackets to denote the empty list: ' '"[]"\n' '\n' - ' * Using square brackets, separating items with commas: ' - '"[a]",\n' - ' "[a, b, c]"\n' + ' * Using square brackets, separating items with commas: "[a]", ' + '"[a,\n' + ' b, c]"\n' '\n' ' * Using a list comprehension: "[x for x in iterable]"\n' '\n' @@ -13447,9 +13639,9 @@ topics = {'assert': 'The "assert" statement\n' '\n' 'See also:\n' '\n' - ' * The linspace recipe shows how to implement a lazy version ' - 'of\n' - ' range suitable for floating point applications.\n', + ' * The linspace recipe shows how to implement a lazy version of ' + 'range\n' + ' suitable for floating point applications.\n', 'typesseq-mutable': 'Mutable Sequence Types\n' '**********************\n' '\n' @@ -13560,19 +13752,18 @@ topics = {'assert': 'The "assert" statement\n' 'replacing.\n' '\n' '2. The optional argument *i* defaults to "-1", so that ' - 'by default\n' - ' the last item is removed and returned.\n' + 'by default the\n' + ' last item is removed and returned.\n' '\n' '3. "remove()" raises "ValueError" when *x* is not found ' 'in *s*.\n' '\n' '4. The "reverse()" method modifies the sequence in place ' - 'for\n' - ' economy of space when reversing a large sequence. To ' - 'remind users\n' - ' that it operates by side effect, it does not return ' - 'the reversed\n' - ' sequence.\n' + 'for economy\n' + ' of space when reversing a large sequence. To remind ' + 'users that it\n' + ' operates by side effect, it does not return the ' + 'reversed sequence.\n' '\n' '5. "clear()" and "copy()" are included for consistency ' 'with the\n' @@ -13655,8 +13846,9 @@ topics = {'assert': 'The "assert" statement\n' 'The execution of the "with" statement with one “item” proceeds as\n' 'follows:\n' '\n' - '1. The context expression (the expression given in the "with_item")\n' - ' is evaluated to obtain a context manager.\n' + '1. The context expression (the expression given in the "with_item") ' + 'is\n' + ' evaluated to obtain a context manager.\n' '\n' '2. The context manager’s "__enter__()" is loaded for later use.\n' '\n' @@ -13664,12 +13856,15 @@ topics = {'assert': 'The "assert" statement\n' '\n' '4. The context manager’s "__enter__()" method is invoked.\n' '\n' - '5. If a target was included in the "with" statement, the return\n' - ' value from "__enter__()" is assigned to it.\n' + '5. If a target was included in the "with" statement, the return ' + 'value\n' + ' from "__enter__()" is assigned to it.\n' + '\n' + ' Note:\n' '\n' - ' Note: The "with" statement guarantees that if the "__enter__()"\n' - ' method returns without an error, then "__exit__()" will always ' - 'be\n' + ' The "with" statement guarantees that if the "__enter__()" ' + 'method\n' + ' returns without an error, then "__exit__()" will always be\n' ' called. Thus, if an error occurs during the assignment to the\n' ' target list, it will be treated the same as an error occurring\n' ' within the suite would be. See step 6 below.\n' diff --git a/Lib/queue.py b/Lib/queue.py index 5bb0431e..10dbcbc1 100644 --- a/Lib/queue.py +++ b/Lib/queue.py @@ -1,6 +1,7 @@ '''A multi-producer, multi-consumer queue.''' import threading +import types from collections import deque from heapq import heappush, heappop from time import monotonic as time @@ -216,6 +217,8 @@ class Queue: def _get(self): return self.queue.popleft() + __class_getitem__ = classmethod(types.GenericAlias) + class PriorityQueue(Queue): '''Variant of Queue that retrieves open entries in priority order (lowest first). @@ -316,6 +319,8 @@ class _PySimpleQueue: '''Return the approximate size of the queue (not reliable!).''' return len(self._queue) + __class_getitem__ = classmethod(types.GenericAlias) + if SimpleQueue is None: SimpleQueue = _PySimpleQueue diff --git a/Lib/quopri.py b/Lib/quopri.py index cbd979ab..08899c5c 100755 --- a/Lib/quopri.py +++ b/Lib/quopri.py @@ -204,11 +204,11 @@ def main(): print("-t: quote tabs") print("-d: decode; default encode") sys.exit(2) - deco = 0 - tabs = 0 + deco = False + tabs = False for o, a in opts: - if o == '-t': tabs = 1 - if o == '-d': deco = 1 + if o == '-t': tabs = True + if o == '-d': deco = True if tabs and deco: sys.stdout = sys.stderr print("-t and -d are mutually exclusive") diff --git a/Lib/random.py b/Lib/random.py index 365a0195..a6454f52 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -1,5 +1,9 @@ """Random variable generators. + bytes + ----- + uniform bytes (values between 0 and 255) + integers -------- uniform within range @@ -37,14 +41,20 @@ General notes on the underlying Mersenne Twister core generator: """ +# Translated by Guido van Rossum from C source provided by +# Adrian Baddeley. Adapted by Raymond Hettinger for use with +# the Mersenne Twister and os.urandom() core generators. + from warnings import warn as _warn from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin +from math import tau as TWOPI, floor as _floor from os import urandom as _urandom from _collections_abc import Set as _Set, Sequence as _Sequence from itertools import accumulate as _accumulate, repeat as _repeat from bisect import bisect as _bisect import os as _os +import _random try: # hashlib is pretty heavy to load, try lean internal module first @@ -53,28 +63,40 @@ except ImportError: # fallback to official implementation from hashlib import sha512 as _sha512 - -__all__ = ["Random","seed","random","uniform","randint","choice","sample", - "randrange","shuffle","normalvariate","lognormvariate", - "expovariate","vonmisesvariate","gammavariate","triangular", - "gauss","betavariate","paretovariate","weibullvariate", - "getstate","setstate", "getrandbits", "choices", - "SystemRandom"] - -NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0) -TWOPI = 2.0*_pi +__all__ = [ + "Random", + "SystemRandom", + "betavariate", + "choice", + "choices", + "expovariate", + "gammavariate", + "gauss", + "getrandbits", + "getstate", + "lognormvariate", + "normalvariate", + "paretovariate", + "randint", + "random", + "randrange", + "sample", + "seed", + "setstate", + "shuffle", + "triangular", + "uniform", + "vonmisesvariate", + "weibullvariate", +] + +NV_MAGICCONST = 4 * _exp(-0.5) / _sqrt(2.0) LOG4 = _log(4.0) SG_MAGICCONST = 1.0 + _log(4.5) BPF = 53 # Number of bits in a float -RECIP_BPF = 2**-BPF +RECIP_BPF = 2 ** -BPF -# Translated by Guido van Rossum from C source provided by -# Adrian Baddeley. Adapted by Raymond Hettinger for use with -# the Mersenne Twister and os.urandom() core generators. - -import _random - class Random(_random.Random): """Random number generator base class used by bound module functions. @@ -100,28 +122,11 @@ class Random(_random.Random): self.seed(x) self.gauss_next = None - def __init_subclass__(cls, /, **kwargs): - """Control how subclasses generate random integers. - - The algorithm a subclass can use depends on the random() and/or - getrandbits() implementation available to it and determines - whether it can generate random integers from arbitrarily large - ranges. - """ - - for c in cls.__mro__: - if '_randbelow' in c.__dict__: - # just inherit it - break - if 'getrandbits' in c.__dict__: - cls._randbelow = cls._randbelow_with_getrandbits - break - if 'random' in c.__dict__: - cls._randbelow = cls._randbelow_without_getrandbits - break - def seed(self, a=None, version=2): - """Initialize internal state from hashable object. + """Initialize internal state from a seed. + + The only supported seed types are None, int, float, + str, bytes, and bytearray. None or no argument seeds from current time or from an operating system specific randomness source if available. @@ -143,12 +148,20 @@ class Random(_random.Random): x ^= len(a) a = -2 if x == -1 else x - if version == 2 and isinstance(a, (str, bytes, bytearray)): + elif version == 2 and isinstance(a, (str, bytes, bytearray)): if isinstance(a, str): a = a.encode() a += _sha512(a).digest() a = int.from_bytes(a, 'big') + elif not isinstance(a, (type(None), int, float, str, bytes, bytearray)): + _warn('Seeding based on hashing is deprecated\n' + 'since Python 3.9 and will be removed in a subsequent ' + 'version. The only \n' + 'supported seed types are: None, ' + 'int, float, str, bytes, and bytearray.', + DeprecationWarning, 2) + super().seed(a) self.gauss_next = None @@ -169,7 +182,7 @@ class Random(_random.Random): # really unsigned 32-bit ints, so we convert negative ints from # version 2 to positive longs for version 3. try: - internalstate = tuple(x % (2**32) for x in internalstate) + internalstate = tuple(x % (2 ** 32) for x in internalstate) except ValueError as e: raise TypeError from e super().setstate(internalstate) @@ -178,15 +191,18 @@ class Random(_random.Random): "Random.setstate() of version %s" % (version, self.VERSION)) -## ---- Methods below this point do not need to be overridden when -## ---- subclassing for the purpose of using a different core generator. -## -------------------- pickle support ------------------- + ## ------------------------------------------------------- + ## ---- Methods below this point do not need to be overridden or extended + ## ---- when subclassing for the purpose of using a different core generator. + + + ## -------------------- pickle support ------------------- # Issue 17489: Since __reduce__ was defined to fix #759889 this is no # longer called; we leave it here because it has been here since random was # rewritten back in 2001 and why risk breaking something. - def __getstate__(self): # for pickle + def __getstate__(self): # for pickle return self.getstate() def __setstate__(self, state): # for pickle @@ -195,9 +211,83 @@ class Random(_random.Random): def __reduce__(self): return self.__class__, (), self.getstate() -## -------------------- integer methods ------------------- - def randrange(self, start, stop=None, step=1, _int=int): + ## ---- internal support method for evenly distributed integers ---- + + def __init_subclass__(cls, /, **kwargs): + """Control how subclasses generate random integers. + + The algorithm a subclass can use depends on the random() and/or + getrandbits() implementation available to it and determines + whether it can generate random integers from arbitrarily large + ranges. + """ + + for c in cls.__mro__: + if '_randbelow' in c.__dict__: + # just inherit it + break + if 'getrandbits' in c.__dict__: + cls._randbelow = cls._randbelow_with_getrandbits + break + if 'random' in c.__dict__: + cls._randbelow = cls._randbelow_without_getrandbits + break + + def _randbelow_with_getrandbits(self, n): + "Return a random int in the range [0,n). Returns 0 if n==0." + + if not n: + return 0 + getrandbits = self.getrandbits + k = n.bit_length() # don't use (n-1) here because n can be 1 + r = getrandbits(k) # 0 <= r < 2**k + while r >= n: + r = getrandbits(k) + return r + + def _randbelow_without_getrandbits(self, n, maxsize=1<= maxsize: + _warn("Underlying random() generator does not supply \n" + "enough bits to choose from a population range this large.\n" + "To remove the range limitation, add a getrandbits() method.") + return _floor(random() * n) + if n == 0: + return 0 + rem = maxsize % n + limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0 + r = random() + while r >= limit: + r = random() + return _floor(r * maxsize) % n + + _randbelow = _randbelow_with_getrandbits + + + ## -------------------------------------------------------- + ## ---- Methods below this point generate custom distributions + ## ---- based on the methods defined above. They do not + ## ---- directly touch the underlying generator and only + ## ---- access randomness through the methods: random(), + ## ---- getrandbits(), or _randbelow(). + + + ## -------------------- bytes methods --------------------- + + def randbytes(self, n): + """Generate n random bytes.""" + return self.getrandbits(n * 8).to_bytes(n, 'little') + + + ## -------------------- integer methods ------------------- + + def randrange(self, start, stop=None, step=1): """Choose a random item from range(start, stop[, step]). This fixes the problem with randint() which includes the @@ -207,7 +297,7 @@ class Random(_random.Random): # This code is a bit messy to make it fast for the # common case while still doing adequate error checking. - istart = _int(start) + istart = int(start) if istart != start: raise ValueError("non-integer arg 1 for randrange()") if stop is None: @@ -216,7 +306,7 @@ class Random(_random.Random): raise ValueError("empty range for randrange()") # stop argument supplied. - istop = _int(stop) + istop = int(stop) if istop != stop: raise ValueError("non-integer stop for randrange()") width = istop - istart @@ -226,7 +316,7 @@ class Random(_random.Random): raise ValueError("empty range for randrange() (%d, %d, %d)" % (istart, istop, width)) # Non-unit step argument supplied. - istep = _int(step) + istep = int(step) if istep != step: raise ValueError("non-integer step for randrange()") if istep > 0: @@ -239,7 +329,7 @@ class Random(_random.Random): if n <= 0: raise ValueError("empty range for randrange()") - return istart + istep*self._randbelow(n) + return istart + istep * self._randbelow(n) def randint(self, a, b): """Return random integer in range [a, b], including both end points. @@ -247,48 +337,13 @@ class Random(_random.Random): return self.randrange(a, b+1) - def _randbelow_with_getrandbits(self, n): - "Return a random int in the range [0,n). Raises ValueError if n==0." - getrandbits = self.getrandbits - k = n.bit_length() # don't use (n-1) here because n can be 1 - r = getrandbits(k) # 0 <= r < 2**k - while r >= n: - r = getrandbits(k) - return r - - def _randbelow_without_getrandbits(self, n, int=int, maxsize=1<= maxsize: - _warn("Underlying random() generator does not supply \n" - "enough bits to choose from a population range this large.\n" - "To remove the range limitation, add a getrandbits() method.") - return int(random() * n) - if n == 0: - raise ValueError("Boundary cannot be zero") - rem = maxsize % n - limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0 - r = random() - while r >= limit: - r = random() - return int(r*maxsize) % n - - _randbelow = _randbelow_with_getrandbits - -## -------------------- sequence methods ------------------- + ## -------------------- sequence methods ------------------- def choice(self, seq): """Choose a random element from a non-empty sequence.""" - try: - i = self._randbelow(len(seq)) - except ValueError: - raise IndexError('Cannot choose from an empty sequence') from None - return seq[i] + # raises IndexError if seq is empty + return seq[self._randbelow(len(seq))] def shuffle(self, x, random=None): """Shuffle list x in place, and return None. @@ -303,16 +358,20 @@ class Random(_random.Random): randbelow = self._randbelow for i in reversed(range(1, len(x))): # pick an element in x[:i+1] with which to exchange x[i] - j = randbelow(i+1) + j = randbelow(i + 1) x[i], x[j] = x[j], x[i] else: - _int = int + _warn('The *random* parameter to shuffle() has been deprecated\n' + 'since Python 3.9 and will be removed in a subsequent ' + 'version.', + DeprecationWarning, 2) + floor = _floor for i in reversed(range(1, len(x))): # pick an element in x[:i+1] with which to exchange x[i] - j = _int(random() * (i+1)) + j = floor(random() * (i + 1)) x[i], x[j] = x[j], x[i] - def sample(self, population, k): + def sample(self, population, k, *, counts=None): """Chooses k unique random elements from a population sequence or set. Returns a new list containing elements from the population while @@ -325,9 +384,21 @@ class Random(_random.Random): population contains repeats, then each occurrence is a possible selection in the sample. - To choose a sample in a range of integers, use range as an argument. - This is especially fast and space efficient for sampling from a - large population: sample(range(10000000), 60) + Repeated elements can be specified one at a time or with the optional + counts parameter. For example: + + sample(['red', 'blue'], counts=[4, 2], k=5) + + is equivalent to: + + sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5) + + To choose a sample from a range of integers, use range() for the + population argument. This is especially fast and space efficient + for sampling from a large population: + + sample(range(10000000), 60) + """ # Sampling without replacement entails tracking either potential @@ -354,24 +425,40 @@ class Random(_random.Random): # causing them to eat more entropy than necessary. if isinstance(population, _Set): + _warn('Sampling from a set deprecated\n' + 'since Python 3.9 and will be removed in a subsequent version.', + DeprecationWarning, 2) population = tuple(population) if not isinstance(population, _Sequence): - raise TypeError("Population must be a sequence or set. For dicts, use list(d).") - randbelow = self._randbelow + raise TypeError("Population must be a sequence. For dicts or sets, use sorted(d).") n = len(population) + if counts is not None: + cum_counts = list(_accumulate(counts)) + if len(cum_counts) != n: + raise ValueError('The number of counts does not match the population') + total = cum_counts.pop() + if not isinstance(total, int): + raise TypeError('Counts must be integers') + if total <= 0: + raise ValueError('Total of counts must be greater than zero') + selections = sample(range(total), k=k) + bisect = _bisect + return [population[bisect(cum_counts, s)] for s in selections] + randbelow = self._randbelow if not 0 <= k <= n: raise ValueError("Sample larger than population or is negative") result = [None] * k setsize = 21 # size of a small set minus size of an empty list if k > 5: - setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets + setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets if n <= setsize: - # An n-length list is smaller than a k-length set + # An n-length list is smaller than a k-length set. + # Invariant: non-selected at pool[0 : n-i] pool = list(population) - for i in range(k): # invariant: non-selected at [0,n-i) - j = randbelow(n-i) + for i in range(k): + j = randbelow(n - i) result[i] = pool[j] - pool[j] = pool[n-i-1] # move non-selected item into vacancy + pool[j] = pool[n - i - 1] # move non-selected item into vacancy else: selected = set() selected_add = selected.add @@ -394,29 +481,28 @@ class Random(_random.Random): n = len(population) if cum_weights is None: if weights is None: - _int = int + floor = _floor n += 0.0 # convert to float for a small speed improvement - return [population[_int(random() * n)] for i in _repeat(None, k)] + return [population[floor(random() * n)] for i in _repeat(None, k)] cum_weights = list(_accumulate(weights)) elif weights is not None: raise TypeError('Cannot specify both weights and cumulative weights') if len(cum_weights) != n: raise ValueError('The number of weights does not match the population') - bisect = _bisect total = cum_weights[-1] + 0.0 # convert to float + if total <= 0.0: + raise ValueError('Total of weights must be greater than zero') + bisect = _bisect hi = n - 1 return [population[bisect(cum_weights, random() * total, 0, hi)] for i in _repeat(None, k)] -## -------------------- real-valued distributions ------------------- -## -------------------- uniform distribution ------------------- + ## -------------------- real-valued distributions ------------------- def uniform(self, a, b): "Get a random number in the range [a, b) or [a, b] depending on rounding." - return a + (b-a) * self.random() - -## -------------------- triangular -------------------- + return a + (b - a) * self.random() def triangular(self, low=0.0, high=1.0, mode=None): """Triangular distribution. @@ -438,32 +524,64 @@ class Random(_random.Random): low, high = high, low return low + (high - low) * _sqrt(u * c) -## -------------------- normal distribution -------------------- - def normalvariate(self, mu, sigma): """Normal distribution. mu is the mean, and sigma is the standard deviation. """ - # mu = mean, sigma = standard deviation - # Uses Kinderman and Monahan method. Reference: Kinderman, # A.J. and Monahan, J.F., "Computer generation of random # variables using the ratio of uniform deviates", ACM Trans # Math Software, 3, (1977), pp257-260. random = self.random - while 1: + while True: u1 = random() u2 = 1.0 - random() - z = NV_MAGICCONST*(u1-0.5)/u2 - zz = z*z/4.0 + z = NV_MAGICCONST * (u1 - 0.5) / u2 + zz = z * z / 4.0 if zz <= -_log(u2): break - return mu + z*sigma + return mu + z * sigma + + def gauss(self, mu, sigma): + """Gaussian distribution. -## -------------------- lognormal distribution -------------------- + mu is the mean, and sigma is the standard deviation. This is + slightly faster than the normalvariate() function. + + Not thread-safe without a lock around calls. + + """ + # When x and y are two variables from [0, 1), uniformly + # distributed, then + # + # cos(2*pi*x)*sqrt(-2*log(1-y)) + # sin(2*pi*x)*sqrt(-2*log(1-y)) + # + # are two *independent* variables with normal distribution + # (mu = 0, sigma = 1). + # (Lambert Meertens) + # (corrected version; bug discovered by Mike Miller, fixed by LM) + + # Multithreading note: When two threads call this function + # simultaneously, it is possible that they will receive the + # same return value. The window is very small though. To + # avoid this, you have to use a lock around all calls. (I + # didn't want to slow this down in the serial case by using a + # lock here.) + + random = self.random + z = self.gauss_next + self.gauss_next = None + if z is None: + x2pi = random() * TWOPI + g2rad = _sqrt(-2.0 * _log(1.0 - random())) + z = _cos(x2pi) * g2rad + self.gauss_next = _sin(x2pi) * g2rad + + return mu + z * sigma def lognormvariate(self, mu, sigma): """Log normal distribution. @@ -475,8 +593,6 @@ class Random(_random.Random): """ return _exp(self.normalvariate(mu, sigma)) -## -------------------- exponential distribution -------------------- - def expovariate(self, lambd): """Exponential distribution. @@ -492,9 +608,7 @@ class Random(_random.Random): # we use 1-random() instead of random() to preclude the # possibility of taking the log of zero. - return -_log(1.0 - self.random())/lambd - -## -------------------- von Mises distribution -------------------- + return -_log(1.0 - self.random()) / lambd def vonmisesvariate(self, mu, kappa): """Circular data distribution. @@ -505,10 +619,6 @@ class Random(_random.Random): to a uniform random angle over the range 0 to 2*pi. """ - # mu: mean angle (in radians between 0 and 2*pi) - # kappa: concentration parameter kappa (>= 0) - # if kappa = 0 generate uniform random angle - # Based upon an algorithm published in: Fisher, N.I., # "Statistical Analysis of Circular Data", Cambridge # University Press, 1993. @@ -523,7 +633,7 @@ class Random(_random.Random): s = 0.5 / kappa r = s + _sqrt(1.0 + s * s) - while 1: + while True: u1 = random() z = _cos(_pi * u1) @@ -542,8 +652,6 @@ class Random(_random.Random): return theta -## -------------------- gamma distribution -------------------- - def gammavariate(self, alpha, beta): """Gamma distribution. Not the gamma function! @@ -556,7 +664,6 @@ class Random(_random.Random): math.gamma(alpha) * beta ** alpha """ - # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2 # Warning: a few older sources define the gamma distribution in terms @@ -577,32 +684,31 @@ class Random(_random.Random): while 1: u1 = random() - if not 1e-7 < u1 < .9999999: + if not 1e-7 < u1 < 0.9999999: continue u2 = 1.0 - random() - v = _log(u1/(1.0-u1))/ainv - x = alpha*_exp(v) - z = u1*u1*u2 - r = bbb+ccc*v-x - if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z): + v = _log(u1 / (1.0 - u1)) / ainv + x = alpha * _exp(v) + z = u1 * u1 * u2 + r = bbb + ccc * v - x + if r + SG_MAGICCONST - 4.5 * z >= 0.0 or r >= _log(z): return x * beta elif alpha == 1.0: # expovariate(1/beta) return -_log(1.0 - random()) * beta - else: # alpha is between 0 and 1 (exclusive) - + else: + # alpha is between 0 and 1 (exclusive) # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle - - while 1: + while True: u = random() - b = (_e + alpha)/_e - p = b*u + b = (_e + alpha) / _e + p = b * u if p <= 1.0: - x = p ** (1.0/alpha) + x = p ** (1.0 / alpha) else: - x = -_log((b-p)/alpha) + x = -_log((b - p) / alpha) u1 = random() if p > 1.0: if u1 <= x ** (alpha - 1.0): @@ -611,61 +717,6 @@ class Random(_random.Random): break return x * beta -## -------------------- Gauss (faster alternative) -------------------- - - def gauss(self, mu, sigma): - """Gaussian distribution. - - mu is the mean, and sigma is the standard deviation. This is - slightly faster than the normalvariate() function. - - Not thread-safe without a lock around calls. - - """ - - # When x and y are two variables from [0, 1), uniformly - # distributed, then - # - # cos(2*pi*x)*sqrt(-2*log(1-y)) - # sin(2*pi*x)*sqrt(-2*log(1-y)) - # - # are two *independent* variables with normal distribution - # (mu = 0, sigma = 1). - # (Lambert Meertens) - # (corrected version; bug discovered by Mike Miller, fixed by LM) - - # Multithreading note: When two threads call this function - # simultaneously, it is possible that they will receive the - # same return value. The window is very small though. To - # avoid this, you have to use a lock around all calls. (I - # didn't want to slow this down in the serial case by using a - # lock here.) - - random = self.random - z = self.gauss_next - self.gauss_next = None - if z is None: - x2pi = random() * TWOPI - g2rad = _sqrt(-2.0 * _log(1.0 - random())) - z = _cos(x2pi) * g2rad - self.gauss_next = _sin(x2pi) * g2rad - - return mu + z*sigma - -## -------------------- beta -------------------- -## See -## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html -## for Ivan Frohne's insightful analysis of why the original implementation: -## -## def betavariate(self, alpha, beta): -## # Discrete Event Simulation in C, pp 87-88. -## -## y = self.expovariate(alpha) -## z = self.expovariate(1.0/beta) -## return z/(y+z) -## -## was dead wrong, and how it probably got that way. - def betavariate(self, alpha, beta): """Beta distribution. @@ -673,25 +724,32 @@ class Random(_random.Random): Returned values range between 0 and 1. """ + ## See + ## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html + ## for Ivan Frohne's insightful analysis of why the original implementation: + ## + ## def betavariate(self, alpha, beta): + ## # Discrete Event Simulation in C, pp 87-88. + ## + ## y = self.expovariate(alpha) + ## z = self.expovariate(1.0/beta) + ## return z/(y+z) + ## + ## was dead wrong, and how it probably got that way. # This version due to Janne Sinkkonen, and matches all the std # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution"). y = self.gammavariate(alpha, 1.0) - if y == 0: - return 0.0 - else: + if y: return y / (y + self.gammavariate(beta, 1.0)) - -## -------------------- Pareto -------------------- + return 0.0 def paretovariate(self, alpha): """Pareto distribution. alpha is the shape parameter.""" # Jain, pg. 495 u = 1.0 - self.random() - return 1.0 / u ** (1.0/alpha) - -## -------------------- Weibull -------------------- + return 1.0 / u ** (1.0 / alpha) def weibullvariate(self, alpha, beta): """Weibull distribution. @@ -702,16 +760,20 @@ class Random(_random.Random): # Jain, pg. 499; bug fix courtesy Bill Arms u = 1.0 - self.random() - return alpha * (-_log(u)) ** (1.0/beta) + return alpha * (-_log(u)) ** (1.0 / beta) + +## ------------------------------------------------------------------ ## --------------- Operating System Random Source ------------------ + class SystemRandom(Random): """Alternate random number generator using sources provided by the operating system (such as /dev/urandom on Unix or CryptGenRandom on Windows). Not available on all systems (see os.urandom() for details). + """ def random(self): @@ -720,12 +782,18 @@ class SystemRandom(Random): def getrandbits(self, k): """getrandbits(k) -> x. Generates an int with k random bits.""" - if k <= 0: - raise ValueError('number of bits must be greater than zero') + if k < 0: + raise ValueError('number of bits must be non-negative') numbytes = (k + 7) // 8 # bits / 8 and rounded up x = int.from_bytes(_urandom(numbytes), 'big') return x >> (numbytes * 8 - k) # trim excess bits + def randbytes(self, n): + """Generate n random bytes.""" + # os.urandom(n) fails with ValueError for n < 0 + # and returns an empty bytes string for n == 0. + return _urandom(n) + def seed(self, *args, **kwds): "Stub method. Not used for a system random number generator." return None @@ -735,51 +803,11 @@ class SystemRandom(Random): raise NotImplementedError('System entropy source does not have state.') getstate = setstate = _notimplemented -## -------------------- test program -------------------- - -def _test_generator(n, func, args): - import time - print(n, 'times', func.__name__) - total = 0.0 - sqsum = 0.0 - smallest = 1e10 - largest = -1e10 - t0 = time.perf_counter() - for i in range(n): - x = func(*args) - total += x - sqsum = sqsum + x*x - smallest = min(x, smallest) - largest = max(x, largest) - t1 = time.perf_counter() - print(round(t1-t0, 3), 'sec,', end=' ') - avg = total/n - stddev = _sqrt(sqsum/n - avg*avg) - print('avg %g, stddev %g, min %g, max %g\n' % \ - (avg, stddev, smallest, largest)) - - -def _test(N=2000): - _test_generator(N, random, ()) - _test_generator(N, normalvariate, (0.0, 1.0)) - _test_generator(N, lognormvariate, (0.0, 1.0)) - _test_generator(N, vonmisesvariate, (0.0, 1.0)) - _test_generator(N, gammavariate, (0.01, 1.0)) - _test_generator(N, gammavariate, (0.1, 1.0)) - _test_generator(N, gammavariate, (0.1, 2.0)) - _test_generator(N, gammavariate, (0.5, 1.0)) - _test_generator(N, gammavariate, (0.9, 1.0)) - _test_generator(N, gammavariate, (1.0, 1.0)) - _test_generator(N, gammavariate, (2.0, 1.0)) - _test_generator(N, gammavariate, (20.0, 1.0)) - _test_generator(N, gammavariate, (200.0, 1.0)) - _test_generator(N, gauss, (0.0, 1.0)) - _test_generator(N, betavariate, (3.0, 3.0)) - _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0)) +# ---------------------------------------------------------------------- # Create one instance, seeded from current time, and export its methods # as module-level functions. The functions share state across all uses -#(both in the user's code and in the Python libraries), but that's fine +# (both in the user's code and in the Python libraries), but that's fine # for most programs and is easier for the casual user than making them # instantiate their own Random() instance. @@ -806,6 +834,50 @@ weibullvariate = _inst.weibullvariate getstate = _inst.getstate setstate = _inst.setstate getrandbits = _inst.getrandbits +randbytes = _inst.randbytes + + +## ------------------------------------------------------ +## ----------------- test program ----------------------- + +def _test_generator(n, func, args): + from statistics import stdev, fmean as mean + from time import perf_counter + + t0 = perf_counter() + data = [func(*args) for i in range(n)] + t1 = perf_counter() + + xbar = mean(data) + sigma = stdev(data, xbar) + low = min(data) + high = max(data) + + print(f'{t1 - t0:.3f} sec, {n} times {func.__name__}') + print('avg %g, stddev %g, min %g, max %g\n' % (xbar, sigma, low, high)) + + +def _test(N=2000): + _test_generator(N, random, ()) + _test_generator(N, normalvariate, (0.0, 1.0)) + _test_generator(N, lognormvariate, (0.0, 1.0)) + _test_generator(N, vonmisesvariate, (0.0, 1.0)) + _test_generator(N, gammavariate, (0.01, 1.0)) + _test_generator(N, gammavariate, (0.1, 1.0)) + _test_generator(N, gammavariate, (0.1, 2.0)) + _test_generator(N, gammavariate, (0.5, 1.0)) + _test_generator(N, gammavariate, (0.9, 1.0)) + _test_generator(N, gammavariate, (1.0, 1.0)) + _test_generator(N, gammavariate, (2.0, 1.0)) + _test_generator(N, gammavariate, (20.0, 1.0)) + _test_generator(N, gammavariate, (200.0, 1.0)) + _test_generator(N, gauss, (0.0, 1.0)) + _test_generator(N, betavariate, (3.0, 3.0)) + _test_generator(N, triangular, (0.0, 1.0, 1.0 / 3.0)) + + +## ------------------------------------------------------ +## ------------------ fork support --------------------- if hasattr(_os, "fork"): _os.register_at_fork(after_in_child=_inst.seed) diff --git a/Lib/runpy.py b/Lib/runpy.py index 0f54f3e7..7e1e1ac5 100644 --- a/Lib/runpy.py +++ b/Lib/runpy.py @@ -133,6 +133,9 @@ def _get_module_details(mod_name, error=ImportError): # importlib, where the latter raises other errors for cases where # pkgutil previously raised ImportError msg = "Error while finding module specification for {!r} ({}: {})" + if mod_name.endswith(".py"): + msg += (f". Try using '{mod_name[:-3]}' instead of " + f"'{mod_name}' as the module name.") raise error(msg.format(mod_name, type(ex).__name__, ex)) from ex if spec is None: raise error("No module named %s" % mod_name) diff --git a/Lib/secrets.py b/Lib/secrets.py index 13043422..a546efbd 100644 --- a/Lib/secrets.py +++ b/Lib/secrets.py @@ -14,7 +14,6 @@ __all__ = ['choice', 'randbelow', 'randbits', 'SystemRandom', import base64 import binascii -import os from hmac import compare_digest from random import SystemRandom @@ -44,7 +43,7 @@ def token_bytes(nbytes=None): """ if nbytes is None: nbytes = DEFAULT_ENTROPY - return os.urandom(nbytes) + return _sysrand.randbytes(nbytes) def token_hex(nbytes=None): """Return a random text string, in hexadecimal. diff --git a/Lib/selectors.py b/Lib/selectors.py index a9a0801e..bb15a1cb 100644 --- a/Lib/selectors.py +++ b/Lib/selectors.py @@ -57,6 +57,7 @@ if sys.version_info >= (3, 5): SelectorKey.data.__doc__ = ('''Optional opaque data associated to this file object. For example, this could be used to store a per-client session ID.''') + class _SelectorMapping(Mapping): """Mapping of file objects to selector keys.""" @@ -552,7 +553,10 @@ if hasattr(select, 'kqueue'): def select(self, timeout=None): timeout = None if timeout is None else max(timeout, 0) - max_ev = len(self._fd_to_key) + # If max_ev is 0, kqueue will ignore the timeout. For consistent + # behavior with the other selector classes, we prevent that here + # (using max). See https://bugs.python.org/issue29255 + max_ev = max(len(self._fd_to_key), 1) ready = [] try: kev_list = self._selector.control(None, max_ev, timeout) @@ -577,16 +581,39 @@ if hasattr(select, 'kqueue'): super().close() +def _can_use(method): + """Check if we can use the selector depending upon the + operating system. """ + # Implementation based upon https://github.com/sethmlarson/selectors2/blob/master/selectors2.py + selector = getattr(select, method, None) + if selector is None: + # select module does not implement method + return False + # check if the OS and Kernel actually support the method. Call may fail with + # OSError: [Errno 38] Function not implemented + try: + selector_obj = selector() + if method == 'poll': + # check that poll actually works + selector_obj.poll(0) + else: + # close epoll, kqueue, and devpoll fd + selector_obj.close() + return True + except OSError: + return False + + # Choose the best implementation, roughly: # epoll|kqueue|devpoll > poll > select. # select() also can't accept a FD > FD_SETSIZE (usually around 1024) -if 'KqueueSelector' in globals(): +if _can_use('kqueue'): DefaultSelector = KqueueSelector -elif 'EpollSelector' in globals(): +elif _can_use('epoll'): DefaultSelector = EpollSelector -elif 'DevpollSelector' in globals(): +elif _can_use('devpoll'): DefaultSelector = DevpollSelector -elif 'PollSelector' in globals(): +elif _can_use('poll'): DefaultSelector = PollSelector else: DefaultSelector = SelectSelector diff --git a/Lib/shlex.py b/Lib/shlex.py index c8172745..4801a6c1 100644 --- a/Lib/shlex.py +++ b/Lib/shlex.py @@ -304,6 +304,10 @@ class shlex: def split(s, comments=False, posix=True): """Split the string *s* using shell-like syntax.""" + if s is None: + import warnings + warnings.warn("Passing None for 's' to shlex.split() is deprecated.", + DeprecationWarning, stacklevel=2) lex = shlex(s, posix=posix) lex.whitespace_split = True if not comments: diff --git a/Lib/shutil.py b/Lib/shutil.py index 1f05d80f..a4ce2c02 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -741,8 +741,20 @@ def rmtree(path, ignore_errors=False, onerror=None): rmtree.avoids_symlink_attacks = _use_fd_functions def _basename(path): - # A basename() variant which first strips the trailing slash, if present. - # Thus we always get the last component of the path, even for directories. + """A basename() variant which first strips the trailing slash, if present. + Thus we always get the last component of the path, even for directories. + + path: Union[PathLike, str] + + e.g. + >>> os.path.basename('/bar/foo') + 'foo' + >>> os.path.basename('/bar/foo/') + '' + >>> _basename('/bar/foo/') + 'foo' + """ + path = os.fspath(path) sep = os.path.sep + (os.path.altsep or '') return os.path.basename(path.rstrip(sep)) @@ -781,7 +793,10 @@ def move(src, dst, copy_function=copy2): os.rename(src, dst) return + # Using _basename instead of os.path.basename is important, as we must + # ignore any trailing slash to avoid the basename returning '' real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): raise Error("Destination path '%s' already exists" % real_dst) try: diff --git a/Lib/site.py b/Lib/site.py index 9fa21cca..9e617afb 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -334,13 +334,22 @@ def getsitepackages(prefixes=None): continue seen.add(prefix) + libdirs = [sys.platlibdir] + if sys.platlibdir != "lib": + libdirs.append("lib") + if os.sep == '/': - sitepackages.append(os.path.join(prefix, "lib", - "python%d.%d" % sys.version_info[:2], - "site-packages")) + for libdir in libdirs: + path = os.path.join(prefix, libdir, + "python%d.%d" % sys.version_info[:2], + "site-packages") + sitepackages.append(path) else: sitepackages.append(prefix) - sitepackages.append(os.path.join(prefix, "lib", "site-packages")) + + for libdir in libdirs: + path = os.path.join(prefix, libdir, "site-packages") + sitepackages.append(path) return sitepackages def addsitepackages(known_paths, prefixes=None): @@ -590,7 +599,7 @@ def _script(): Exit codes with --user-base or --user-site: 0 - user site directory is enabled 1 - user site directory is disabled by user - 2 - uses site directory is disabled by super user + 2 - user site directory is disabled by super user or for security reasons >2 - unknown error """ diff --git a/Lib/smtpd.py b/Lib/smtpd.py index 8103ca9a..8f1a22e9 100755 --- a/Lib/smtpd.py +++ b/Lib/smtpd.py @@ -779,6 +779,8 @@ class PureProxy(SMTPServer): class MailmanProxy(PureProxy): def __init__(self, *args, **kwargs): + warn('MailmanProxy is deprecated and will be removed ' + 'in future', DeprecationWarning, 2) if 'enable_SMTPUTF8' in kwargs and kwargs['enable_SMTPUTF8']: raise ValueError("MailmanProxy does not support SMTPUTF8.") super(PureProxy, self).__init__(*args, **kwargs) diff --git a/Lib/smtplib.py b/Lib/smtplib.py index 8e3d4bf0..7808ba01 100755 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -303,6 +303,8 @@ class SMTP: def _get_socket(self, host, port, timeout): # This makes it simpler for SMTP_SSL to use the SMTP connect code # and just alter the socket connection bit. + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') if self.debuglevel > 0: self._print_debug('connect: to', (host, port), self.source_address) return socket.create_connection((host, port), timeout, @@ -333,8 +335,6 @@ class SMTP: raise OSError("nonnumeric port") if not port: port = self.default_port - if self.debuglevel > 0: - self._print_debug('connect:', (host, port)) sys.audit("smtplib.connect", self, host, port) self.sock = self._get_socket(host, port, self.timeout) self.file = None @@ -1032,13 +1032,12 @@ if _have_ssl: keyfile=keyfile) self.context = context SMTP.__init__(self, host, port, local_hostname, timeout, - source_address) + source_address) def _get_socket(self, host, port, timeout): if self.debuglevel > 0: self._print_debug('connect:', (host, port)) - new_socket = socket.create_connection((host, port), timeout, - self.source_address) + new_socket = super()._get_socket(host, port, timeout) new_socket = self.context.wrap_socket(new_socket, server_hostname=self._host) return new_socket @@ -1067,19 +1066,23 @@ class LMTP(SMTP): ehlo_msg = "lhlo" def __init__(self, host='', port=LMTP_PORT, local_hostname=None, - source_address=None): + source_address=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): """Initialize a new instance.""" - SMTP.__init__(self, host, port, local_hostname=local_hostname, - source_address=source_address) + super().__init__(host, port, local_hostname=local_hostname, + source_address=source_address, timeout=timeout) def connect(self, host='localhost', port=0, source_address=None): """Connect to the LMTP daemon, on either a Unix or a TCP socket.""" if host[0] != '/': - return SMTP.connect(self, host, port, source_address=source_address) + return super().connect(host, port, source_address=source_address) + + if self.timeout is not None and not self.timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') # Handle Unix-domain sockets. try: self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.sock.settimeout(self.timeout) self.file = None self.sock.connect(host) except OSError: diff --git a/Lib/socket.py b/Lib/socket.py old mode 100644 new mode 100755 index f83f36d0..cafa573a --- a/Lib/socket.py +++ b/Lib/socket.py @@ -12,6 +12,8 @@ Functions: socket() -- create a new socket object socketpair() -- create a pair of new socket objects [*] fromfd() -- create a socket object from an open file descriptor [*] +send_fds() -- Send file descriptor to the socket. +recv_fds() -- Recieve file descriptors from the socket. fromshare() -- create a socket object from data received from socket.share() [*] gethostname() -- return the current hostname gethostbyname() -- map a hostname to its IP number @@ -104,7 +106,6 @@ def _intenum_converter(value, enum_klass): except ValueError: return value -_realsocket = socket # WSA error codes if sys.platform.lower().startswith("win"): @@ -543,6 +544,40 @@ def fromfd(fd, family, type, proto=0): nfd = dup(fd) return socket(family, type, proto, nfd) +if hasattr(_socket.socket, "sendmsg"): + import array + + def send_fds(sock, buffers, fds, flags=0, address=None): + """ send_fds(sock, buffers, fds[, flags[, address]]) -> integer + + Send the list of file descriptors fds over an AF_UNIX socket. + """ + return sock.sendmsg(buffers, [(_socket.SOL_SOCKET, + _socket.SCM_RIGHTS, array.array("i", fds))]) + __all__.append("send_fds") + +if hasattr(_socket.socket, "recvmsg"): + import array + + def recv_fds(sock, bufsize, maxfds, flags=0): + """ recv_fds(sock, bufsize, maxfds[, flags]) -> (data, list of file + descriptors, msg_flags, address) + + Receive up to maxfds file descriptors returning the message + data and a list containing the descriptors. + """ + # Array of ints + fds = array.array("i") + msg, ancdata, flags, addr = sock.recvmsg(bufsize, + _socket.CMSG_LEN(maxfds * fds.itemsize)) + for cmsg_level, cmsg_type, cmsg_data in ancdata: + if (cmsg_level == _socket.SOL_SOCKET and cmsg_type == _socket.SCM_RIGHTS): + fds.frombytes(cmsg_data[: + len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) + + return msg, list(fds), flags, addr + __all__.append("recv_fds") + if hasattr(_socket.socket, "share"): def fromshare(info): """ fromshare(info) -> socket object diff --git a/Lib/socketserver.py b/Lib/socketserver.py index 1ad028fa..57c1ae6e 100644 --- a/Lib/socketserver.py +++ b/Lib/socketserver.py @@ -374,7 +374,7 @@ class BaseServer: """ print('-'*40, file=sys.stderr) - print('Exception happened during processing of request from', + print('Exception occurred during processing of request from', client_address, file=sys.stderr) import traceback traceback.print_exc() diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py index 7c259d2a..ad9c9f02 100644 --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -230,7 +230,7 @@ class CursorTests(unittest.TestCase): """) def CheckExecuteWrongSqlArg(self): - with self.assertRaises(ValueError): + with self.assertRaises(TypeError): self.cu.execute(42) def CheckExecuteArgInt(self): @@ -276,7 +276,7 @@ class CursorTests(unittest.TestCase): self.assertEqual(row[0], "foo") def CheckExecuteParamSequence(self): - class L(object): + class L: def __len__(self): return 1 def __getitem__(self, x): @@ -288,6 +288,18 @@ class CursorTests(unittest.TestCase): row = self.cu.fetchone() self.assertEqual(row[0], "foo") + def CheckExecuteParamSequenceBadLen(self): + # Issue41662: Error in __len__() was overridden with ProgrammingError. + class L: + def __len__(self): + 1/0 + def __getitem__(slf, x): + raise AssertionError + + self.cu.execute("insert into test(name) values ('foo')") + with self.assertRaises(ZeroDivisionError): + self.cu.execute("select name from test where name=?", L()) + def CheckExecuteDictMapping(self): self.cu.execute("insert into test(name) values ('foo')") self.cu.execute("select name from test where name=:name", {"name": "foo"}) @@ -377,7 +389,7 @@ class CursorTests(unittest.TestCase): self.cu.executemany("insert into test(income) values (?)", mygen()) def CheckExecuteManyWrongSqlArg(self): - with self.assertRaises(ValueError): + with self.assertRaises(TypeError): self.cu.executemany(42, [(3,)]) def CheckExecuteManySelect(self): diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index ce97655c..6aa86d57 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -133,6 +133,19 @@ class RegressionTests(unittest.TestCase): con.execute("insert into foo(bar) values (5)") con.execute(SELECT) + def CheckBindMutatingList(self): + # Issue41662: Crash when mutate a list of parameters during iteration. + class X: + def __conform__(self, protocol): + parameters.clear() + return "..." + parameters = [X(), 0] + con = sqlite.connect(":memory:",detect_types=sqlite.PARSE_DECLTYPES) + con.execute("create table foo(bar X, baz integer)") + # Should not crash + with self.assertRaises(IndexError): + con.execute("insert into foo(bar, baz) values (?, ?)", parameters) + def CheckErrorMsgDecodeError(self): # When porting the module to Python 3.0, the error message about # decoding errors disappeared. This verifies they're back again. @@ -262,7 +275,7 @@ class RegressionTests(unittest.TestCase): Call a connection with a non-string SQL request: check error handling of the statement constructor. """ - self.assertRaises(sqlite.Warning, self.con, 1) + self.assertRaises(TypeError, self.con, 1) def CheckCollation(self): def collation_cb(a, b): diff --git a/Lib/ssl.py b/Lib/ssl.py index 0726caee..30f4e593 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -252,7 +252,7 @@ class _TLSMessageType(_IntEnum): if sys.platform == "win32": from _ssl import enum_certificates, enum_crls -from socket import socket, AF_INET, SOCK_STREAM, create_connection +from socket import socket, SOCK_STREAM, create_connection from socket import SOL_SOCKET, SO_TYPE import socket as _socket import base64 # for DER-to-PEM translation diff --git a/Lib/statistics.py b/Lib/statistics.py index c5c6e47f..f9d3802e 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -163,7 +163,7 @@ def _sum(data, start=0): T = _coerce(int, type(start)) for typ, values in groupby(data, type): T = _coerce(T, typ) # or raise TypeError - for n,d in map(_exact_ratio, values): + for n, d in map(_exact_ratio, values): count += 1 partials[d] = partials_get(d, 0) + n if None in partials: @@ -261,7 +261,7 @@ def _convert(value, T): return T(value) except TypeError: if issubclass(T, Decimal): - return T(value.numerator)/T(value.denominator) + return T(value.numerator) / T(value.denominator) else: raise @@ -277,8 +277,8 @@ def _find_lteq(a, x): def _find_rteq(a, l, x): 'Locate the rightmost value exactly equal to x' i = bisect_right(a, x, lo=l) - if i != (len(a)+1) and a[i-1] == x: - return i-1 + if i != (len(a) + 1) and a[i - 1] == x: + return i - 1 raise ValueError @@ -315,7 +315,7 @@ def mean(data): raise StatisticsError('mean requires at least one data point') T, total, count = _sum(data) assert count == n - return _convert(total/n, T) + return _convert(total / n, T) def fmean(data): @@ -403,11 +403,11 @@ def harmonic_mean(data): else: raise TypeError('unsupported type') try: - T, total, count = _sum(1/x for x in _fail_neg(data, errmsg)) + T, total, count = _sum(1 / x for x in _fail_neg(data, errmsg)) except ZeroDivisionError: return 0 assert count == n - return _convert(n/total, T) + return _convert(n / total, T) # FIXME: investigate ways to calculate medians without sorting? Quickselect? @@ -428,11 +428,11 @@ def median(data): n = len(data) if n == 0: raise StatisticsError("no median for empty data") - if n%2 == 1: - return data[n//2] + if n % 2 == 1: + return data[n // 2] else: - i = n//2 - return (data[i - 1] + data[i])/2 + i = n // 2 + return (data[i - 1] + data[i]) / 2 def median_low(data): @@ -451,10 +451,10 @@ def median_low(data): n = len(data) if n == 0: raise StatisticsError("no median for empty data") - if n%2 == 1: - return data[n//2] + if n % 2 == 1: + return data[n // 2] else: - return data[n//2 - 1] + return data[n // 2 - 1] def median_high(data): @@ -473,7 +473,7 @@ def median_high(data): n = len(data) if n == 0: raise StatisticsError("no median for empty data") - return data[n//2] + return data[n // 2] def median_grouped(data, interval=1): @@ -510,15 +510,15 @@ def median_grouped(data, interval=1): return data[0] # Find the value at the midpoint. Remember this corresponds to the # centre of the class interval. - x = data[n//2] + x = data[n // 2] for obj in (x, interval): if isinstance(obj, (str, bytes)): raise TypeError('expected number but got %r' % obj) try: - L = x - interval/2 # The lower limit of the median interval. + L = x - interval / 2 # The lower limit of the median interval. except TypeError: # Mixed type. For now we just coerce to float. - L = float(x) - float(interval)/2 + L = float(x) - float(interval) / 2 # Uses bisection search to search for x in data with log(n) time complexity # Find the position of leftmost occurrence of x in data @@ -528,7 +528,7 @@ def median_grouped(data, interval=1): l2 = _find_rteq(data, l1, x) cf = l1 f = l2 - l1 + 1 - return L + interval*(n/2 - cf)/f + return L + interval * (n / 2 - cf) / f def mode(data): @@ -554,8 +554,7 @@ def mode(data): If *data* is empty, ``mode``, raises StatisticsError. """ - data = iter(data) - pairs = Counter(data).most_common(1) + pairs = Counter(iter(data)).most_common(1) try: return pairs[0][0] except IndexError: @@ -597,7 +596,7 @@ def multimode(data): # For sample data where there is a positive probability for values # beyond the range of the data, the R6 exclusive method is a # reasonable choice. Consider a random sample of nine values from a -# population with a uniform distribution from 0.0 to 100.0. The +# population with a uniform distribution from 0.0 to 1.0. The # distribution of the third ranked sample point is described by # betavariate(alpha=3, beta=7) which has mode=0.250, median=0.286, and # mean=0.300. Only the latter (which corresponds with R6) gives the @@ -643,9 +642,8 @@ def quantiles(data, *, n=4, method='exclusive'): m = ld - 1 result = [] for i in range(1, n): - j = i * m // n - delta = i*m - j*n - interpolated = (data[j] * (n - delta) + data[j+1] * delta) / n + j, delta = divmod(i * m, n) + interpolated = (data[j] * (n - delta) + data[j + 1] * delta) / n result.append(interpolated) return result if method == 'exclusive': @@ -655,7 +653,7 @@ def quantiles(data, *, n=4, method='exclusive'): j = i * m // n # rescale i to m/n j = 1 if j < 1 else ld-1 if j > ld-1 else j # clamp to 1 .. ld-1 delta = i*m - j*n # exact integer math - interpolated = (data[j-1] * (n - delta) + data[j] * delta) / n + interpolated = (data[j - 1] * (n - delta) + data[j] * delta) / n result.append(interpolated) return result raise ValueError(f'Unknown method: {method!r}') @@ -689,9 +687,9 @@ def _ss(data, c=None): T, total, count = _sum((x-c)**2 for x in data) # The following sum should mathematically equal zero, but due to rounding # error may not. - U, total2, count2 = _sum((x-c) for x in data) + U, total2, count2 = _sum((x - c) for x in data) assert T == U and count == count2 - total -= total2**2/len(data) + total -= total2 ** 2 / len(data) assert not total < 0, 'negative sum of square deviations: %f' % total return (T, total) @@ -740,7 +738,7 @@ def variance(data, xbar=None): if n < 2: raise StatisticsError('variance requires at least two data points') T, ss = _ss(data, xbar) - return _convert(ss/(n-1), T) + return _convert(ss / (n - 1), T) def pvariance(data, mu=None): @@ -784,7 +782,7 @@ def pvariance(data, mu=None): if n < 1: raise StatisticsError('pvariance requires at least one data point') T, ss = _ss(data, mu) - return _convert(ss/n, T) + return _convert(ss / n, T) def stdev(data, xbar=None): @@ -896,6 +894,13 @@ def _normal_dist_inv_cdf(p, mu, sigma): return mu + (x * sigma) +# If available, use C implementation +try: + from _statistics import _normal_dist_inv_cdf +except ImportError: + pass + + class NormalDist: "Normal distribution of a random variable" # https://en.wikipedia.org/wiki/Normal_distribution @@ -986,7 +991,7 @@ class NormalDist: if not isinstance(other, NormalDist): raise TypeError('Expected another NormalDist instance') X, Y = self, other - if (Y._sigma, Y._mu) < (X._sigma, X._mu): # sort to assure commutativity + if (Y._sigma, Y._mu) < (X._sigma, X._mu): # sort to assure commutativity X, Y = Y, X X_var, Y_var = X.variance, Y.variance if not X_var or not Y_var: @@ -1001,6 +1006,17 @@ class NormalDist: x2 = (a - b) / dv return 1.0 - (fabs(Y.cdf(x1) - X.cdf(x1)) + fabs(Y.cdf(x2) - X.cdf(x2))) + def zscore(self, x): + """Compute the Standard Score. (x - mean) / stdev + + Describes *x* in terms of the number of standard deviations + above or below the mean of the normal distribution. + """ + # https://www.statisticshowto.com/probability-and-statistics/z-score/ + if not self._sigma: + raise StatisticsError('zscore() not defined when sigma is zero') + return (x - self._mu) / self._sigma + @property def mean(self): "Arithmetic mean of the normal distribution." @@ -1102,79 +1118,3 @@ class NormalDist: def __repr__(self): return f'{type(self).__name__}(mu={self._mu!r}, sigma={self._sigma!r})' - -# If available, use C implementation -try: - from _statistics import _normal_dist_inv_cdf -except ImportError: - pass - - -if __name__ == '__main__': - - # Show math operations computed analytically in comparsion - # to a monte carlo simulation of the same operations - - from math import isclose - from operator import add, sub, mul, truediv - from itertools import repeat - import doctest - - g1 = NormalDist(10, 20) - g2 = NormalDist(-5, 25) - - # Test scaling by a constant - assert (g1 * 5 / 5).mean == g1.mean - assert (g1 * 5 / 5).stdev == g1.stdev - - n = 100_000 - G1 = g1.samples(n) - G2 = g2.samples(n) - - for func in (add, sub): - print(f'\nTest {func.__name__} with another NormalDist:') - print(func(g1, g2)) - print(NormalDist.from_samples(map(func, G1, G2))) - - const = 11 - for func in (add, sub, mul, truediv): - print(f'\nTest {func.__name__} with a constant:') - print(func(g1, const)) - print(NormalDist.from_samples(map(func, G1, repeat(const)))) - - const = 19 - for func in (add, sub, mul): - print(f'\nTest constant with {func.__name__}:') - print(func(const, g1)) - print(NormalDist.from_samples(map(func, repeat(const), G1))) - - def assert_close(G1, G2): - assert isclose(G1.mean, G1.mean, rel_tol=0.01), (G1, G2) - assert isclose(G1.stdev, G2.stdev, rel_tol=0.01), (G1, G2) - - X = NormalDist(-105, 73) - Y = NormalDist(31, 47) - s = 32.75 - n = 100_000 - - S = NormalDist.from_samples([x + s for x in X.samples(n)]) - assert_close(X + s, S) - - S = NormalDist.from_samples([x - s for x in X.samples(n)]) - assert_close(X - s, S) - - S = NormalDist.from_samples([x * s for x in X.samples(n)]) - assert_close(X * s, S) - - S = NormalDist.from_samples([x / s for x in X.samples(n)]) - assert_close(X / s, S) - - S = NormalDist.from_samples([x + y for x, y in zip(X.samples(n), - Y.samples(n))]) - assert_close(X + Y, S) - - S = NormalDist.from_samples([x - y for x, y in zip(X.samples(n), - Y.samples(n))]) - assert_close(X - Y, S) - - print(doctest.testmod()) diff --git a/Lib/string.py b/Lib/string.py index b423ff5d..489777b1 100644 --- a/Lib/string.py +++ b/Lib/string.py @@ -54,30 +54,7 @@ from collections import ChainMap as _ChainMap _sentinel_dict = {} -class _TemplateMetaclass(type): - pattern = r""" - %(delim)s(?: - (?P%(delim)s) | # Escape sequence of two delimiters - (?P%(id)s) | # delimiter and a Python identifier - {(?P%(bid)s)} | # delimiter and a braced identifier - (?P) # Other ill-formed delimiter exprs - ) - """ - - def __init__(cls, name, bases, dct): - super(_TemplateMetaclass, cls).__init__(name, bases, dct) - if 'pattern' in dct: - pattern = cls.pattern - else: - pattern = _TemplateMetaclass.pattern % { - 'delim' : _re.escape(cls.delimiter), - 'id' : cls.idpattern, - 'bid' : cls.braceidpattern or cls.idpattern, - } - cls.pattern = _re.compile(pattern, cls.flags | _re.VERBOSE) - - -class Template(metaclass=_TemplateMetaclass): +class Template: """A string class for supporting $-substitutions.""" delimiter = '$' @@ -89,6 +66,24 @@ class Template(metaclass=_TemplateMetaclass): braceidpattern = None flags = _re.IGNORECASE + def __init_subclass__(cls): + super().__init_subclass__() + if 'pattern' in cls.__dict__: + pattern = cls.pattern + else: + delim = _re.escape(cls.delimiter) + id = cls.idpattern + bid = cls.braceidpattern or cls.idpattern + pattern = fr""" + {delim}(?: + (?P{delim}) | # Escape sequence of two delimiters + (?P{id}) | # delimiter and a Python identifier + {{(?P{bid})}} | # delimiter and a braced identifier + (?P) # Other ill-formed delimiter exprs + ) + """ + cls.pattern = _re.compile(pattern, cls.flags | _re.VERBOSE) + def __init__(self, template): self.template = template @@ -146,6 +141,9 @@ class Template(metaclass=_TemplateMetaclass): self.pattern) return self.pattern.sub(convert, self.template) +# Initialize Template.pattern. __init_subclass__() is automatically called +# only for subclasses, not for the Template class itself. +Template.__init_subclass__() ######################################################################## diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 5c2c2f05..13600c28 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -52,7 +52,16 @@ import threading import warnings import contextlib from time import monotonic as _time +import types +try: + import pwd +except ImportError: + pwd = None +try: + import grp +except ImportError: + grp = None __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput", "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL", @@ -317,7 +326,7 @@ def _args_from_interpreter_flags(): if dev_mode: args.extend(('-X', 'dev')) for opt in ('faulthandler', 'tracemalloc', 'importtime', - 'showalloccount', 'showrefcount', 'utf8'): + 'showrefcount', 'utf8', 'oldparser'): if opt in xoptions: value = xoptions[opt] if value is True: @@ -438,6 +447,9 @@ class CompletedProcess(object): args.append('stderr={!r}'.format(self.stderr)) return "{}({})".format(type(self).__name__, ', '.join(args)) + __class_getitem__ = classmethod(types.GenericAlias) + + def check_returncode(self): """Raise CalledProcessError if the exit code is non-zero.""" if self.returncode: @@ -719,6 +731,14 @@ class Popen(object): start_new_session (POSIX only) + group (POSIX only) + + extra_groups (POSIX only) + + user (POSIX only) + + umask (POSIX only) + pass_fds (POSIX only) encoding and errors: Text mode encoding and error handling to use for @@ -735,7 +755,8 @@ class Popen(object): shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, - pass_fds=(), *, encoding=None, errors=None, text=None): + pass_fds=(), *, user=None, group=None, extra_groups=None, + encoding=None, errors=None, text=None, umask=-1): """Create new Popen instance.""" _cleanup() # Held while anything is calling waitpid before returncode has been @@ -833,6 +854,78 @@ class Popen(object): else: line_buffering = False + gid = None + if group is not None: + if not hasattr(os, 'setregid'): + raise ValueError("The 'group' parameter is not supported on the " + "current platform") + + elif isinstance(group, str): + if grp is None: + raise ValueError("The group parameter cannot be a string " + "on systems without the grp module") + + gid = grp.getgrnam(group).gr_gid + elif isinstance(group, int): + gid = group + else: + raise TypeError("Group must be a string or an integer, not {}" + .format(type(group))) + + if gid < 0: + raise ValueError(f"Group ID cannot be negative, got {gid}") + + gids = None + if extra_groups is not None: + if not hasattr(os, 'setgroups'): + raise ValueError("The 'extra_groups' parameter is not " + "supported on the current platform") + + elif isinstance(extra_groups, str): + raise ValueError("Groups must be a list, not a string") + + gids = [] + for extra_group in extra_groups: + if isinstance(extra_group, str): + if grp is None: + raise ValueError("Items in extra_groups cannot be " + "strings on systems without the " + "grp module") + + gids.append(grp.getgrnam(extra_group).gr_gid) + elif isinstance(extra_group, int): + gids.append(extra_group) + else: + raise TypeError("Items in extra_groups must be a string " + "or integer, not {}" + .format(type(extra_group))) + + # make sure that the gids are all positive here so we can do less + # checking in the C code + for gid_check in gids: + if gid_check < 0: + raise ValueError(f"Group ID cannot be negative, got {gid_check}") + + uid = None + if user is not None: + if not hasattr(os, 'setreuid'): + raise ValueError("The 'user' parameter is not supported on " + "the current platform") + + elif isinstance(user, str): + if pwd is None: + raise ValueError("The user parameter cannot be a string " + "on systems without the pwd module") + + uid = pwd.getpwnam(user).pw_uid + elif isinstance(user, int): + uid = user + else: + raise TypeError("User must be a string or an integer") + + if uid < 0: + raise ValueError(f"User ID cannot be negative, got {uid}") + try: if p2cwrite != -1: self.stdin = io.open(p2cwrite, 'wb', bufsize) @@ -857,7 +950,9 @@ class Popen(object): p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, - restore_signals, start_new_session) + restore_signals, + gid, gids, uid, umask, + start_new_session) except: # Cleanup if the child failed starting. for f in filter(None, (self.stdin, self.stdout, self.stderr)): @@ -887,6 +982,17 @@ class Popen(object): raise + def __repr__(self): + obj_repr = ( + f"<{self.__class__.__name__}: " + f"returncode: {self.returncode} args: {list(self.args)!r}>" + ) + if len(obj_repr) > 80: + obj_repr = obj_repr[:76] + "...>" + return obj_repr + + __class_getitem__ = classmethod(types.GenericAlias) + @property def universal_newlines(self): # universal_newlines as retained as an alias of text_mode for API @@ -1227,7 +1333,10 @@ class Popen(object): p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, - unused_restore_signals, unused_start_new_session): + unused_restore_signals, + unused_gid, unused_gids, unused_uid, + unused_umask, + unused_start_new_session): """Execute program (MS Windows version)""" assert not pass_fds, "pass_fds not supported on Windows." @@ -1553,7 +1662,9 @@ class Popen(object): p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, - restore_signals, start_new_session): + restore_signals, + gid, gids, uid, umask, + start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): @@ -1588,7 +1699,11 @@ class Popen(object): and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) - and not start_new_session): + and not start_new_session + and gid is None + and gids is None + and uid is None + and umask < 0): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, @@ -1641,7 +1756,9 @@ class Popen(object): p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, - restore_signals, start_new_session, preexec_fn) + restore_signals, start_new_session, + gid, gids, uid, umask, + preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what @@ -1703,23 +1820,17 @@ class Popen(object): raise child_exception_type(err_msg) - def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED, - _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED, - _WEXITSTATUS=os.WEXITSTATUS, _WIFSTOPPED=os.WIFSTOPPED, - _WSTOPSIG=os.WSTOPSIG): + def _handle_exitstatus(self, sts, + waitstatus_to_exitcode=os.waitstatus_to_exitcode, + _WIFSTOPPED=os.WIFSTOPPED, + _WSTOPSIG=os.WSTOPSIG): """All callers to this function MUST hold self._waitpid_lock.""" # This method is called (indirectly) by __del__, so it cannot # refer to anything outside of its local scope. - if _WIFSIGNALED(sts): - self.returncode = -_WTERMSIG(sts) - elif _WIFEXITED(sts): - self.returncode = _WEXITSTATUS(sts) - elif _WIFSTOPPED(sts): + if _WIFSTOPPED(sts): self.returncode = -_WSTOPSIG(sts) else: - # Should never happen - raise SubprocessError("Unknown child exit status!") - + self.returncode = waitstatus_to_exitcode(sts) def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD): @@ -1926,9 +2037,31 @@ class Popen(object): def send_signal(self, sig): """Send a signal to the process.""" - # Skip signalling a process that we know has already died. - if self.returncode is None: - os.kill(self.pid, sig) + # bpo-38630: Polling reduces the risk of sending a signal to the + # wrong process if the process completed, the Popen.returncode + # attribute is still None, and the pid has been reassigned + # (recycled) to a new different process. This race condition can + # happens in two cases. + # + # Case 1. Thread A calls Popen.poll(), thread B calls + # Popen.send_signal(). In thread A, waitpid() succeed and returns + # the exit status. Thread B calls kill() because poll() in thread A + # did not set returncode yet. Calling poll() in thread B prevents + # the race condition thanks to Popen._waitpid_lock. + # + # Case 2. waitpid(pid, 0) has been called directly, without + # using Popen methods: returncode is still None is this case. + # Calling Popen.poll() will set returncode to a default value, + # since waitpid() fails with ProcessLookupError. + self.poll() + if self.returncode is not None: + # Skip signalling a process that we know has already died. + return + + # The race condition can still happen if the race condition + # described above happens between the returncode test + # and the kill() call. + os.kill(self.pid, sig) def terminate(self): """Terminate the process with SIGTERM diff --git a/Lib/sunau.py b/Lib/sunau.py index 129502b0..79750a9d 100644 --- a/Lib/sunau.py +++ b/Lib/sunau.py @@ -104,7 +104,7 @@ is destroyed. """ from collections import namedtuple -import warnings + _sunau_params = namedtuple('_sunau_params', 'nchannels sampwidth framerate nframes comptype compname') @@ -524,8 +524,3 @@ def open(f, mode=None): return Au_write(f) else: raise Error("mode must be 'r', 'rb', 'w', or 'wb'") - -def openfp(f, mode=None): - warnings.warn("sunau.openfp is deprecated since Python 3.7. " - "Use sunau.open instead.", DeprecationWarning, stacklevel=2) - return open(f, mode=mode) diff --git a/Lib/symbol.py b/Lib/symbol.py index 36e0eec7..aaac8c91 100644 --- a/Lib/symbol.py +++ b/Lib/symbol.py @@ -11,6 +11,15 @@ # # make regen-symbol +import warnings + +warnings.warn( + "The symbol module is deprecated and will be removed " + "in future versions of Python", + DeprecationWarning, + stacklevel=2, +) + #--start constants-- single_input = 256 file_input = 257 diff --git a/Lib/symtable.py b/Lib/symtable.py index ac0a64ff..a7116765 100644 --- a/Lib/symtable.py +++ b/Lib/symtable.py @@ -82,10 +82,6 @@ class SymbolTable(object): def has_children(self): return bool(self._table.children) - def has_exec(self): - """Return true if the scope uses exec. Deprecated method.""" - return False - def get_identifiers(self): return self._table.symbols.keys() diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index b9e2fafb..bf04ac54 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -20,10 +20,10 @@ __all__ = [ _INSTALL_SCHEMES = { 'posix_prefix': { - 'stdlib': '{installed_base}/lib/python{py_version_short}', - 'platstdlib': '{platbase}/lib/python{py_version_short}', + 'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}', + 'platstdlib': '{platbase}/{platlibdir}/python{py_version_short}', 'purelib': '{base}/lib/python{py_version_short}/site-packages', - 'platlib': '{platbase}/lib/python{py_version_short}/site-packages', + 'platlib': '{platbase}/{platlibdir}/python{py_version_short}/site-packages', 'include': '{installed_base}/include/python{py_version_short}{abiflags}', 'platinclude': @@ -62,10 +62,10 @@ _INSTALL_SCHEMES = { 'data': '{userbase}', }, 'posix_user': { - 'stdlib': '{userbase}/lib/python{py_version_short}', - 'platstdlib': '{userbase}/lib/python{py_version_short}', + 'stdlib': '{userbase}/{platlibdir}/python{py_version_short}', + 'platstdlib': '{userbase}/{platlibdir}/python{py_version_short}', 'purelib': '{userbase}/lib/python{py_version_short}/site-packages', - 'platlib': '{userbase}/lib/python{py_version_short}/site-packages', + 'platlib': '{userbase}/{platlibdir}/python{py_version_short}/site-packages', 'include': '{userbase}/include/python{py_version_short}', 'scripts': '{userbase}/bin', 'data': '{userbase}', @@ -84,8 +84,6 @@ _INSTALL_SCHEMES = { _SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include', 'scripts', 'data') - # FIXME don't rely on sys.version here, its format is an implementation detail - # of CPython, use sys.version_info or sys.hexversion _PY_VERSION = sys.version.split()[0] _PY_VERSION_SHORT = '%d.%d' % sys.version_info[:2] _PY_VERSION_SHORT_NO_DOT = '%d%d' % sys.version_info[:2] @@ -539,6 +537,7 @@ def get_config_vars(*args): _CONFIG_VARS['installed_platbase'] = _BASE_EXEC_PREFIX _CONFIG_VARS['platbase'] = _EXEC_PREFIX _CONFIG_VARS['projectbase'] = _PROJECT_BASE + _CONFIG_VARS['platlibdir'] = sys.platlibdir try: _CONFIG_VARS['abiflags'] = sys.abiflags except AttributeError: @@ -547,6 +546,7 @@ def get_config_vars(*args): if os.name == 'nt': _init_non_posix(_CONFIG_VARS) + _CONFIG_VARS['TZPATH'] = '' if os.name == 'posix': _init_posix(_CONFIG_VARS) # For backward compatibility, see issue19555 @@ -665,7 +665,8 @@ def get_platform(): machine += ".%s" % bitness[sys.maxsize] # fall through to standard osname-release-machine representation elif osname[:3] == "aix": - return "%s-%s.%s" % (osname, version, release) + from _aix_support import aix_platform + return aix_platform() elif osname[:6] == "cygwin": osname = "cygwin" import re diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 7a69e1b1..6769066c 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -930,6 +930,14 @@ class TarInfo(object): """Return a header block. info is a dictionary with file information, format must be one of the *_FORMAT constants. """ + has_device_fields = info.get("type") in (CHRTYPE, BLKTYPE) + if has_device_fields: + devmajor = itn(info.get("devmajor", 0), 8, format) + devminor = itn(info.get("devminor", 0), 8, format) + else: + devmajor = stn("", 8, encoding, errors) + devminor = stn("", 8, encoding, errors) + parts = [ stn(info.get("name", ""), 100, encoding, errors), itn(info.get("mode", 0) & 0o7777, 8, format), @@ -943,8 +951,8 @@ class TarInfo(object): info.get("magic", POSIX_MAGIC), stn(info.get("uname", ""), 32, encoding, errors), stn(info.get("gname", ""), 32, encoding, errors), - itn(info.get("devmajor", 0), 8, format), - itn(info.get("devminor", 0), 8, format), + devmajor, + devminor, stn(info.get("prefix", ""), 155, encoding, errors) ] @@ -2461,9 +2469,14 @@ class TarFile(object): def is_tarfile(name): """Return True if name points to a tar archive that we are able to handle, else return False. + + 'name' should be a string, file, or file-like object. """ try: - t = open(name) + if hasattr(name, "read"): + t = open(fileobj=name) + else: + t = open(name) t.close() return True except TarError: diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 8f9cb6c3..770f72c2 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -44,6 +44,7 @@ import shutil as _shutil import errno as _errno from random import Random as _Random import sys as _sys +import types as _types import weakref as _weakref import _thread _allocate_lock = _thread.allocate_lock @@ -642,6 +643,8 @@ class SpooledTemporaryFile: 'encoding': encoding, 'newline': newline, 'dir': dir, 'errors': errors} + __class_getitem__ = classmethod(_types.GenericAlias) + def _check(self, file): if self._rolled: return max_size = self._max_size @@ -736,10 +739,6 @@ class SpooledTemporaryFile: def seek(self, *args): return self._file.seek(*args) - @property - def softspace(self): - return self._file.softspace - def tell(self): return self._file.tell() @@ -829,3 +828,5 @@ class TemporaryDirectory(object): def cleanup(self): if self._finalizer.detach(): self._rmtree(self.name) + + __class_getitem__ = classmethod(_types.GenericAlias) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index ee9b47bb..e47905c8 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -26,6 +26,8 @@ import warnings import test.support import test.support.script_helper from test import support +from test.support import hashlib_helper +from test.support import socket_helper # Skip tests if _multiprocessing wasn't built. @@ -66,12 +68,6 @@ try: except ImportError: msvcrt = None -# -# -# - -# Timeout to wait until a process completes -TIMEOUT = 60.0 # seconds def latin(s): return s.encode('latin') @@ -86,7 +82,7 @@ def close_queue(queue): def join_process(process): # Since multiprocessing.Process has the same API than threading.Thread # (join() and is_alive(), the support function can be reused - support.join_thread(process, timeout=TIMEOUT) + support.join_thread(process) if os.name == "posix": @@ -301,7 +297,7 @@ class _TestProcess(BaseTestCase): target=self._test_create_grandchild_process, args=(wconn, )) p.start() - if not rconn.poll(timeout=60): + if not rconn.poll(timeout=support.LONG_TIMEOUT): raise AssertionError("Could not communicate with child process") parent_process_status = rconn.recv() self.assertEqual(parent_process_status, "alive") @@ -309,7 +305,7 @@ class _TestProcess(BaseTestCase): p.terminate() p.join() - if not rconn.poll(timeout=60): + if not rconn.poll(timeout=support.LONG_TIMEOUT): raise AssertionError("Could not communicate with child process") parent_process_status = rconn.recv() self.assertEqual(parent_process_status, "not alive") @@ -324,7 +320,7 @@ class _TestProcess(BaseTestCase): def _test_report_parent_status(cls, wconn): from multiprocessing.process import parent_process wconn.send("alive" if parent_process().is_alive() else "not alive") - parent_process().join(timeout=5) + parent_process().join(timeout=support.SHORT_TIMEOUT) wconn.send("alive" if parent_process().is_alive() else "not alive") def test_process(self): @@ -870,12 +866,21 @@ class _TestSubclassingProcess(BaseTestCase): os.unlink(testfn) - for reason in (True, False, 8): - p = self.Process(target=sys.exit, args=(reason,)) - p.daemon = True - p.start() - join_process(p) - self.assertEqual(p.exitcode, reason) + cases = [ + ((True,), 1), + ((False,), 0), + ((8,), 8), + ((None,), 0), + ((), 0), + ] + + for args, expected in cases: + with self.subTest(args=args): + p = self.Process(target=sys.exit, args=args) + p.daemon = True + p.start() + join_process(p) + self.assertEqual(p.exitcode, expected) # # @@ -1150,7 +1155,7 @@ class _TestQueue(BaseTestCase): q = self.Queue() q.put(NotSerializable()) q.put(True) - self.assertTrue(q.get(timeout=TIMEOUT)) + self.assertTrue(q.get(timeout=support.SHORT_TIMEOUT)) close_queue(q) with test.support.captured_stderr(): @@ -1165,8 +1170,7 @@ class _TestQueue(BaseTestCase): # qsize is not available on all platform as it # relies on sem_getvalue pass - # bpo-30595: use a timeout of 1 second for slow buildbots - self.assertTrue(q.get(timeout=1.0)) + self.assertTrue(q.get(timeout=support.SHORT_TIMEOUT)) # Check that the size of the queue is correct self.assertTrue(q.empty()) close_queue(q) @@ -1203,7 +1207,7 @@ class _TestQueue(BaseTestCase): # Verify that q is still functioning correctly q.put(True) - self.assertTrue(q.get(timeout=1.0)) + self.assertTrue(q.get(timeout=support.SHORT_TIMEOUT)) # Assert that the serialization and the hook have been called correctly self.assertTrue(not_serializable_obj.reduce_was_called) @@ -1553,7 +1557,7 @@ class _TestCondition(BaseTestCase): args=(cond, state, success, sem)) p.daemon = True p.start() - self.assertTrue(sem.acquire(timeout=TIMEOUT)) + self.assertTrue(sem.acquire(timeout=support.LONG_TIMEOUT)) # Only increment 3 times, so state == 4 is never reached. for i in range(3): @@ -2926,7 +2930,7 @@ class _TestRemoteManager(BaseTestCase): authkey = os.urandom(32) manager = QueueManager( - address=(test.support.HOST, 0), authkey=authkey, serializer=SERIALIZER + address=(socket_helper.HOST, 0), authkey=authkey, serializer=SERIALIZER ) manager.start() self.addCleanup(manager.shutdown) @@ -2950,6 +2954,8 @@ class _TestRemoteManager(BaseTestCase): # Make queue finalizer run before the server is stopped del queue + +@hashlib_helper.requires_hashdigest('md5') class _TestManagerRestart(BaseTestCase): @classmethod @@ -2963,7 +2969,7 @@ class _TestManagerRestart(BaseTestCase): def test_rapid_restart(self): authkey = os.urandom(32) manager = QueueManager( - address=(test.support.HOST, 0), authkey=authkey, serializer=SERIALIZER) + address=(socket_helper.HOST, 0), authkey=authkey, serializer=SERIALIZER) try: srvr = manager.get_server() addr = srvr.address @@ -3434,6 +3440,7 @@ class _TestPoll(BaseTestCase): # @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction") +@hashlib_helper.requires_hashdigest('md5') class _TestPicklingConnections(BaseTestCase): ALLOWED_TYPES = ('processes',) @@ -3441,7 +3448,7 @@ class _TestPicklingConnections(BaseTestCase): @classmethod def tearDownClass(cls): from multiprocessing import resource_sharer - resource_sharer.stop(timeout=TIMEOUT) + resource_sharer.stop(timeout=support.LONG_TIMEOUT) @classmethod def _listener(cls, conn, families): @@ -3453,7 +3460,7 @@ class _TestPicklingConnections(BaseTestCase): new_conn.close() l.close() - l = socket.create_server((test.support.HOST, 0)) + l = socket.create_server((socket_helper.HOST, 0)) conn.send(l.getsockname()) new_conn, addr = l.accept() conn.send(new_conn) @@ -3736,6 +3743,7 @@ class _TestSharedCTypes(BaseTestCase): @unittest.skipUnless(HAS_SHMEM, "requires multiprocessing.shared_memory") +@hashlib_helper.requires_hashdigest('md5') class _TestSharedMemory(BaseTestCase): ALLOWED_TYPES = ('processes',) @@ -3772,6 +3780,35 @@ class _TestSharedMemory(BaseTestCase): self.assertLess(same_sms.size, 20*sms.size) # Size was ignored. same_sms.close() + # Creating Shared Memory Segment with -ve size + with self.assertRaises(ValueError): + shared_memory.SharedMemory(create=True, size=-2) + + # Attaching Shared Memory Segment without a name + with self.assertRaises(ValueError): + shared_memory.SharedMemory(create=False) + + # Test if shared memory segment is created properly, + # when _make_filename returns an existing shared memory segment name + with unittest.mock.patch( + 'multiprocessing.shared_memory._make_filename') as mock_make_filename: + + NAME_PREFIX = shared_memory._SHM_NAME_PREFIX + names = ['test01_fn', 'test02_fn'] + # Prepend NAME_PREFIX which can be '/psm_' or 'wnsm_', necessary + # because some POSIX compliant systems require name to start with / + names = [NAME_PREFIX + name for name in names] + + mock_make_filename.side_effect = names + shm1 = shared_memory.SharedMemory(create=True, size=1) + self.addCleanup(shm1.unlink) + self.assertEqual(shm1._name, names[0]) + + mock_make_filename.side_effect = names + shm2 = shared_memory.SharedMemory(create=True, size=1) + self.addCleanup(shm2.unlink) + self.assertEqual(shm2._name, names[1]) + if shared_memory._USE_POSIX: # Posix Shared Memory can only be unlinked once. Here we # test an implementation detail that is not observed across @@ -4083,7 +4120,7 @@ class _TestSharedMemory(BaseTestCase): p.terminate() p.wait() - deadline = time.monotonic() + 60 + deadline = time.monotonic() + support.LONG_TIMEOUT t = 0.1 while time.monotonic() < deadline: time.sleep(t) @@ -4394,6 +4431,7 @@ class TestInvalidHandle(unittest.TestCase): +@hashlib_helper.requires_hashdigest('md5') class OtherTest(unittest.TestCase): # TODO: add more tests for deliver/answer challenge. def test_deliver_challenge_auth_failure(self): @@ -4430,6 +4468,7 @@ class OtherTest(unittest.TestCase): def initializer(ns): ns.test += 1 +@hashlib_helper.requires_hashdigest('md5') class TestInitializers(unittest.TestCase): def setUp(self): self.mgr = multiprocessing.Manager() @@ -4576,7 +4615,7 @@ class TestWait(unittest.TestCase): def test_wait_socket(self, slow=False): from multiprocessing.connection import wait - l = socket.create_server((test.support.HOST, 0)) + l = socket.create_server((socket_helper.HOST, 0)) addr = l.getsockname() readers = [] procs = [] @@ -5092,7 +5131,7 @@ class TestResourceTracker(unittest.TestCase): p.terminate() p.wait() - deadline = time.monotonic() + 60 + deadline = time.monotonic() + support.LONG_TIMEOUT while time.monotonic() < deadline: time.sleep(.5) try: @@ -5121,7 +5160,7 @@ class TestResourceTracker(unittest.TestCase): pid = _resource_tracker._pid if pid is not None: os.kill(pid, signal.SIGKILL) - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=-signal.SIGKILL) with warnings.catch_warnings(): warnings.simplefilter("ignore") _resource_tracker.ensure_running() @@ -5228,6 +5267,20 @@ class TestSimpleQueue(unittest.TestCase): proc.join() + def test_close(self): + queue = multiprocessing.SimpleQueue() + queue.close() + # closing a queue twice should not fail + queue.close() + + # Test specific to CPython since it tests private attributes + @test.support.cpython_only + def test_closed(self): + queue = multiprocessing.SimpleQueue() + queue.close() + self.assertTrue(queue._reader.closed) + self.assertTrue(queue._writer.closed) + class TestPoolNotLeakOnFailure(unittest.TestCase): @@ -5270,6 +5323,7 @@ class TestPoolNotLeakOnFailure(unittest.TestCase): any(process.is_alive() for process in forked_processes)) +@hashlib_helper.requires_hashdigest('md5') class TestSyncManagerTypes(unittest.TestCase): """Test all the types which can be shared between a parent and a child process by using a manager which acts as an intermediary @@ -5664,6 +5718,8 @@ def install_tests_in_module_dict(remote_globs, start_method): Mixin = local_globs[type_.capitalize() + 'Mixin'] class Temp(base, Mixin, unittest.TestCase): pass + if type_ == 'manager': + Temp = hashlib_helper.requires_hashdigest('md5')(Temp) Temp.__name__ = Temp.__qualname__ = newname Temp.__module__ = __module__ remote_globs[newname] = Temp diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py index 0dad0172..d3e8e9ee 100644 --- a/Lib/test/audiotests.py +++ b/Lib/test/audiotests.py @@ -1,7 +1,6 @@ from test.support import findfile, TESTFN, unlink import array import io -from unittest import mock import pickle @@ -50,17 +49,6 @@ class AudioTests: self.assertEqual(pickle.loads(dump), params) -class AudioMiscTests(AudioTests): - - def test_openfp_deprecated(self): - arg = "arg" - mode = "mode" - with mock.patch(f"{self.module.__name__}.open") as mock_open, \ - self.assertWarns(DeprecationWarning): - self.module.openfp(arg, mode=mode) - mock_open.assert_called_with(arg, mode=mode) - - class AudioWriteTests(AudioTests): def create_file(self, testfile): diff --git a/Lib/test/bisect_cmd.py b/Lib/test/bisect_cmd.py index cb06480e..0bdd7a43 100755 --- a/Lib/test/bisect_cmd.py +++ b/Lib/test/bisect_cmd.py @@ -47,8 +47,16 @@ def format_shell_args(args): return ' '.join(args) +def python_cmd(): + cmd = [sys.executable] + cmd.extend(subprocess._args_from_interpreter_flags()) + cmd.extend(subprocess._optim_args_from_interpreter_flags()) + return cmd + + def list_cases(args): - cmd = [sys.executable, '-m', 'test', '--list-cases'] + cmd = python_cmd() + cmd.extend(['-m', 'test', '--list-cases']) cmd.extend(args.test_args) proc = subprocess.run(cmd, stdout=subprocess.PIPE, @@ -68,7 +76,8 @@ def run_tests(args, tests, huntrleaks=None): try: write_tests(tmp, tests) - cmd = [sys.executable, '-m', 'test', '--matchfile', tmp] + cmd = python_cmd() + cmd.extend(['-m', 'test', '--matchfile', tmp]) cmd.extend(args.test_args) print("+ %s" % format_shell_args(cmd)) proc = subprocess.run(cmd) @@ -100,6 +109,9 @@ def parse_args(): def main(): args = parse_args() + if '-w' in args.test_args or '--verbose2' in args.test_args: + print("WARNING: -w/--verbose2 option should not be used to bisect!") + print() if args.input: with open(args.input) as fp: diff --git a/Lib/test/bytecode_helper.py b/Lib/test/bytecode_helper.py deleted file mode 100644 index 347d6033..00000000 --- a/Lib/test/bytecode_helper.py +++ /dev/null @@ -1,41 +0,0 @@ -"""bytecode_helper - support tools for testing correct bytecode generation""" - -import unittest -import dis -import io - -_UNSPECIFIED = object() - -class BytecodeTestCase(unittest.TestCase): - """Custom assertion methods for inspecting bytecode.""" - - def get_disassembly_as_string(self, co): - s = io.StringIO() - dis.dis(co, file=s) - return s.getvalue() - - def assertInBytecode(self, x, opname, argval=_UNSPECIFIED): - """Returns instr if op is found, otherwise throws AssertionError""" - for instr in dis.get_instructions(x): - if instr.opname == opname: - if argval is _UNSPECIFIED or instr.argval == argval: - return instr - disassembly = self.get_disassembly_as_string(x) - if argval is _UNSPECIFIED: - msg = '%s not found in bytecode:\n%s' % (opname, disassembly) - else: - msg = '(%s,%r) not found in bytecode:\n%s' - msg = msg % (opname, argval, disassembly) - self.fail(msg) - - def assertNotInBytecode(self, x, opname, argval=_UNSPECIFIED): - """Throws AssertionError if op is found""" - for instr in dis.get_instructions(x): - if instr.opname == opname: - disassembly = self.get_disassembly_as_string(x) - if argval is _UNSPECIFIED: - msg = '%s occurs in bytecode:\n%s' % (opname, disassembly) - elif instr.argval == argval: - msg = '(%s,%r) occurs in bytecode:\n%s' - msg = msg % (opname, argval, disassembly) - self.fail(msg) diff --git a/Lib/test/clinic.test b/Lib/test/clinic.test index 845b165a..cb76c374 100644 --- a/Lib/test/clinic.test +++ b/Lib/test/clinic.test @@ -1269,7 +1269,7 @@ test_long_long_converter(PyObject *module, PyObject *const *args, Py_ssize_t nar goto exit; } a = PyLong_AsLongLong(args[0]); - if (a == (PY_LONG_LONG)-1 && PyErr_Occurred()) { + if (a == -1 && PyErr_Occurred()) { goto exit; } skip_optional: @@ -1281,7 +1281,7 @@ exit: static PyObject * test_long_long_converter_impl(PyObject *module, long long a) -/*[clinic end generated code: output=3e8083f3aee4f18a input=d5fc81577ff4dd02]*/ +/*[clinic end generated code: output=7143b585d7e433e8 input=d5fc81577ff4dd02]*/ /*[clinic input] diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index d1a3c2ff..a9741d6d 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -2,6 +2,7 @@ See http://www.zope.org/Members/fdrake/DateTimeWiki/TestCases """ +import io import itertools import bisect import copy @@ -62,6 +63,12 @@ class TestModule(unittest.TestCase): self.assertEqual(datetime.MINYEAR, 1) self.assertEqual(datetime.MAXYEAR, 9999) + def test_all(self): + """Test that __all__ only points to valid attributes.""" + all_attrs = dir(datetime_module) + for attr in datetime_module.__all__: + self.assertIn(attr, all_attrs) + def test_name_cleanup(self): if '_Pure' in self.__class__.__name__: self.skipTest('Only run for Fast C implementation') @@ -1349,19 +1356,43 @@ class TestDate(HarmlessMixedComparison, unittest.TestCase): def test_isocalendar(self): # Check examples from # http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm - for i in range(7): - d = self.theclass(2003, 12, 22+i) - self.assertEqual(d.isocalendar(), (2003, 52, i+1)) - d = self.theclass(2003, 12, 29) + timedelta(i) - self.assertEqual(d.isocalendar(), (2004, 1, i+1)) - d = self.theclass(2004, 1, 5+i) - self.assertEqual(d.isocalendar(), (2004, 2, i+1)) - d = self.theclass(2009, 12, 21+i) - self.assertEqual(d.isocalendar(), (2009, 52, i+1)) - d = self.theclass(2009, 12, 28) + timedelta(i) - self.assertEqual(d.isocalendar(), (2009, 53, i+1)) - d = self.theclass(2010, 1, 4+i) - self.assertEqual(d.isocalendar(), (2010, 1, i+1)) + week_mondays = [ + ((2003, 12, 22), (2003, 52, 1)), + ((2003, 12, 29), (2004, 1, 1)), + ((2004, 1, 5), (2004, 2, 1)), + ((2009, 12, 21), (2009, 52, 1)), + ((2009, 12, 28), (2009, 53, 1)), + ((2010, 1, 4), (2010, 1, 1)), + ] + + test_cases = [] + for cal_date, iso_date in week_mondays: + base_date = self.theclass(*cal_date) + # Adds one test case for every day of the specified weeks + for i in range(7): + new_date = base_date + timedelta(i) + new_iso = iso_date[0:2] + (iso_date[2] + i,) + test_cases.append((new_date, new_iso)) + + for d, exp_iso in test_cases: + with self.subTest(d=d, comparison="tuple"): + self.assertEqual(d.isocalendar(), exp_iso) + + # Check that the tuple contents are accessible by field name + with self.subTest(d=d, comparison="fields"): + t = d.isocalendar() + self.assertEqual((t.year, t.week, t.weekday), exp_iso) + + def test_isocalendar_pickling(self): + """Test that the result of datetime.isocalendar() can be pickled. + + The result of a round trip should be a plain tuple. + """ + d = self.theclass(2019, 1, 1) + p = pickle.dumps(d.isocalendar()) + res = pickle.loads(p) + self.assertEqual(type(res), tuple) + self.assertEqual(res, (2019, 1, 2)) def test_iso_long_years(self): # Calculate long ISO years and compare to table from @@ -5785,6 +5816,8 @@ class ZoneInfoTest(unittest.TestCase): zonename = 'America/New_York' def setUp(self): + if sys.platform == "vxworks": + self.skipTest("Skipping zoneinfo tests on VxWorks") if sys.platform == "win32": self.skipTest("Skipping zoneinfo tests on Windows") try: @@ -5946,6 +5979,65 @@ class CapiTest(unittest.TestCase): self.assertEqual(dt1.astimezone(timezone.utc), dt_utc) + def test_PyDateTime_DELTA_GET(self): + class TimeDeltaSubclass(timedelta): + pass + + for klass in [timedelta, TimeDeltaSubclass]: + for args in [(26, 55, 99999), (26, 55, 99999)]: + d = klass(*args) + with self.subTest(cls=klass, date=args): + days, seconds, microseconds = _testcapi.PyDateTime_DELTA_GET(d) + + self.assertEqual(days, d.days) + self.assertEqual(seconds, d.seconds) + self.assertEqual(microseconds, d.microseconds) + + def test_PyDateTime_GET(self): + class DateSubclass(date): + pass + + for klass in [date, DateSubclass]: + for args in [(2000, 1, 2), (2012, 2, 29)]: + d = klass(*args) + with self.subTest(cls=klass, date=args): + year, month, day = _testcapi.PyDateTime_GET(d) + + self.assertEqual(year, d.year) + self.assertEqual(month, d.month) + self.assertEqual(day, d.day) + + def test_PyDateTime_DATE_GET(self): + class DateTimeSubclass(datetime): + pass + + for klass in [datetime, DateTimeSubclass]: + for args in [(1993, 8, 26, 22, 12, 55, 99999), + (1993, 8, 26, 22, 12, 55, 99999)]: + d = klass(*args) + with self.subTest(cls=klass, date=args): + hour, minute, second, microsecond = _testcapi.PyDateTime_DATE_GET(d) + + self.assertEqual(hour, d.hour) + self.assertEqual(minute, d.minute) + self.assertEqual(second, d.second) + self.assertEqual(microsecond, d.microsecond) + + def test_PyDateTime_TIME_GET(self): + class TimeSubclass(time): + pass + + for klass in [time, TimeSubclass]: + for args in [(12, 30, 20, 10), (12, 30, 20, 10)]: + d = klass(*args) + with self.subTest(cls=klass, date=args): + hour, minute, second, microsecond = _testcapi.PyDateTime_TIME_GET(d) + + self.assertEqual(hour, d.hour) + self.assertEqual(minute, d.minute) + self.assertEqual(second, d.second) + self.assertEqual(microsecond, d.microsecond) + def test_timezones_offset_zero(self): utc0, utc1, non_utc = _testcapi.get_timezones_offset_zero() @@ -6106,7 +6198,7 @@ class CapiTest(unittest.TestCase): def test_date_from_date(self): exp_date = date(1993, 8, 26) - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro): c_api_date = _testcapi.get_date_fromdate( macro, @@ -6119,7 +6211,7 @@ class CapiTest(unittest.TestCase): def test_datetime_from_dateandtime(self): exp_date = datetime(1993, 8, 26, 22, 12, 55, 99999) - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro): c_api_date = _testcapi.get_datetime_fromdateandtime( macro, @@ -6137,7 +6229,7 @@ class CapiTest(unittest.TestCase): exp_date = datetime(1993, 8, 26, 22, 12, 55, 99999) for fold in [0, 1]: - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro, fold=fold): c_api_date = _testcapi.get_datetime_fromdateandtimeandfold( macro, @@ -6156,7 +6248,7 @@ class CapiTest(unittest.TestCase): def test_time_from_time(self): exp_time = time(22, 12, 55, 99999) - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro): c_api_time = _testcapi.get_time_fromtime( macro, @@ -6171,7 +6263,7 @@ class CapiTest(unittest.TestCase): exp_time = time(22, 12, 55, 99999) for fold in [0, 1]: - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro, fold=fold): c_api_time = _testcapi.get_time_fromtimeandfold( macro, @@ -6187,7 +6279,7 @@ class CapiTest(unittest.TestCase): def test_delta_from_dsu(self): exp_delta = timedelta(26, 55, 99999) - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro): c_api_delta = _testcapi.get_delta_fromdsu( macro, @@ -6200,7 +6292,7 @@ class CapiTest(unittest.TestCase): def test_date_from_timestamp(self): ts = datetime(1995, 4, 12).timestamp() - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro): d = _testcapi.get_date_fromtimestamp(int(ts), macro) @@ -6218,7 +6310,7 @@ class CapiTest(unittest.TestCase): from_timestamp = _testcapi.get_datetime_fromtimestamp for case in cases: - for macro in [0, 1]: + for macro in False, True: with self.subTest(case=case, macro=macro): dtup, tzinfo, usetz = case dt_orig = datetime(*dtup, tzinfo=tzinfo) diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py index 404934ce..606f31b0 100644 --- a/Lib/test/eintrdata/eintr_tester.py +++ b/Lib/test/eintrdata/eintr_tester.py @@ -22,6 +22,7 @@ import time import unittest from test import support +from test.support import socket_helper @contextlib.contextmanager def kill_on_error(proc): @@ -57,9 +58,8 @@ class EINTRBaseTest(unittest.TestCase): # Use faulthandler as watchdog to debug when a test hangs # (timeout of 10 minutes) - if hasattr(faulthandler, 'dump_traceback_later'): - faulthandler.dump_traceback_later(10 * 60, exit=True, - file=sys.__stderr__) + faulthandler.dump_traceback_later(10 * 60, exit=True, + file=sys.__stderr__) @staticmethod def stop_alarm(): @@ -68,8 +68,7 @@ class EINTRBaseTest(unittest.TestCase): def tearDown(self): self.stop_alarm() signal.signal(signal.SIGALRM, self.orig_handler) - if hasattr(faulthandler, 'cancel_dump_traceback_later'): - faulthandler.cancel_dump_traceback_later() + faulthandler.cancel_dump_traceback_later() def subprocess(self, *args, **kw): cmd_args = (sys.executable, '-c') + args @@ -285,14 +284,14 @@ class SocketEINTRTest(EINTRBaseTest): self._test_send(lambda sock, data: sock.sendmsg([data])) def test_accept(self): - sock = socket.create_server((support.HOST, 0)) + sock = socket.create_server((socket_helper.HOST, 0)) self.addCleanup(sock.close) port = sock.getsockname()[1] code = '\n'.join(( 'import socket, time', '', - 'host = %r' % support.HOST, + 'host = %r' % socket_helper.HOST, 'port = %s' % port, 'sleep_time = %r' % self.sleep_time, '', diff --git a/Lib/test/fork_wait.py b/Lib/test/fork_wait.py index 9850b06a..249b5e96 100644 --- a/Lib/test/fork_wait.py +++ b/Lib/test/fork_wait.py @@ -11,7 +11,7 @@ active threads survive in the child after a fork(); this is an error. import os, sys, time, unittest import threading -import test.support as support +from test import support LONGSLEEP = 2 @@ -43,17 +43,8 @@ class ForkWait(unittest.TestCase): except OSError: pass - def wait_impl(self, cpid): - for i in range(10): - # waitpid() shouldn't hang, but some of the buildbots seem to hang - # in the forking tests. This is an attempt to fix the problem. - spid, status = os.waitpid(cpid, os.WNOHANG) - if spid == cpid: - break - time.sleep(2 * SHORTSLEEP) - - self.assertEqual(spid, cpid) - self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) + def wait_impl(self, cpid, *, exitcode): + support.wait_process(cpid, exitcode=exitcode) def test_wait(self): for i in range(NUM_THREADS): @@ -62,7 +53,7 @@ class ForkWait(unittest.TestCase): self.threads.append(thread) # busy-loop to wait for threads - deadline = time.monotonic() + 10.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT while len(self.alive) < NUM_THREADS: time.sleep(0.1) if deadline < time.monotonic(): @@ -88,4 +79,4 @@ class ForkWait(unittest.TestCase): os._exit(n) else: # Parent - self.wait_impl(cpid) + self.wait_impl(cpid, exitcode=0) diff --git a/Lib/test/inspect_fodder2.py b/Lib/test/inspect_fodder2.py index 5a7b559d..e7d4b53e 100644 --- a/Lib/test/inspect_fodder2.py +++ b/Lib/test/inspect_fodder2.py @@ -138,18 +138,124 @@ class cls135: never_reached1 never_reached2 -#line 141 +# line 141 +class cls142: + a = """ +class cls149: + ... +""" + +# line 148 +class cls149: + + def func151(self): + pass + +''' +class cls160: + pass +''' + +# line 159 +class cls160: + + def func162(self): + pass + +# line 165 +class cls166: + a = ''' + class cls175: + ... + ''' + +# line 172 +class cls173: + + class cls175: + pass + +# line 178 +class cls179: + pass + +# line 182 +class cls183: + + class cls185: + + def func186(self): + pass + +def class_decorator(cls): + return cls + +# line 193 +@class_decorator +@class_decorator +class cls196: + + @class_decorator + @class_decorator + class cls200: + pass + +class cls203: + class cls204: + class cls205: + pass + class cls207: + class cls205: + pass + +# line 211 +def func212(): + class cls213: + pass + return cls213 + +# line 217 +class cls213: + def func219(self): + class cls220: + pass + return cls220 + +# line 224 +async def func225(): + class cls226: + pass + return cls226 + +# line 230 +class cls226: + async def func232(self): + class cls233: + pass + return cls233 + +if True: + class cls238: + class cls239: + '''if clause cls239''' +else: + class cls238: + class cls239: + '''else clause 239''' + pass + +#line 247 def positional_only_arg(a, /): pass -#line 145 +#line 251 def all_markers(a, b, /, c, d, *, e, f): pass -# line 149 +# line 255 def all_markers_with_args_and_kwargs(a, b, /, c, d, *args, e, f, **kwargs): pass -#line 153 +#line 259 def all_markers_with_defaults(a, b=1, /, c=2, d=3, *, e=4, f=5): pass diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index adf31cc9..e20bf9a3 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -596,6 +596,7 @@ class Regrtest: test_cwd = 'test_python_worker_{}'.format(pid) else: test_cwd = 'test_python_{}'.format(pid) + test_cwd += support.FS_NONASCII test_cwd = os.path.join(self.tmp_dir, test_cwd) return test_cwd diff --git a/Lib/test/libregrtest/save_env.py b/Lib/test/libregrtest/save_env.py index 31931f21..e7c27a69 100644 --- a/Lib/test/libregrtest/save_env.py +++ b/Lib/test/libregrtest/save_env.py @@ -7,6 +7,7 @@ import shutil import sys import sysconfig import threading +import urllib.request import warnings from test import support from test.libregrtest.utils import print_warning @@ -68,8 +69,20 @@ class saved_test_environment: 'files', 'locale', 'warnings.showwarning', 'shutil_archive_formats', 'shutil_unpack_formats', 'asyncio.events._event_loop_policy', + 'urllib.requests._url_tempfiles', 'urllib.requests._opener', ) + def get_urllib_requests__url_tempfiles(self): + return list(urllib.request._url_tempfiles) + def restore_urllib_requests__url_tempfiles(self, tempfiles): + for filename in tempfiles: + support.unlink(filename) + + def get_urllib_requests__opener(self): + return urllib.request._opener + def restore_urllib_requests__opener(self, opener): + urllib.request._opener = opener + def get_asyncio_events__event_loop_policy(self): return support.maybe_get_event_loop_policy() def restore_asyncio_events__event_loop_policy(self, policy): diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 2b0bdf99..1f264c1b 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -10,6 +10,8 @@ try: except ImportError: gc = None +from test.libregrtest.utils import setup_unraisable_hook + def setup_tests(ns): try: @@ -77,6 +79,19 @@ def setup_tests(ns): pass sys.addaudithook(_test_audit_hook) + setup_unraisable_hook() + + if ns.timeout is not None: + # For a slow buildbot worker, increase SHORT_TIMEOUT and LONG_TIMEOUT + support.SHORT_TIMEOUT = max(support.SHORT_TIMEOUT, ns.timeout / 40) + support.LONG_TIMEOUT = max(support.LONG_TIMEOUT, ns.timeout / 4) + + # If --timeout is short: reduce timeouts + support.LOOPBACK_TIMEOUT = min(support.LOOPBACK_TIMEOUT, ns.timeout) + support.INTERNET_TIMEOUT = min(support.INTERNET_TIMEOUT, ns.timeout) + support.SHORT_TIMEOUT = min(support.SHORT_TIMEOUT, ns.timeout) + support.LONG_TIMEOUT = min(support.LONG_TIMEOUT, ns.timeout) + def replace_stdout(): """Set stdout encoder error handler to backslashreplace (as stderr error diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 0467c8f8..71f538f0 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -63,3 +63,24 @@ def printlist(x, width=70, indent=4, file=None): def print_warning(msg): support.print_warning(msg) + + +orig_unraisablehook = None + + +def regrtest_unraisable_hook(unraisable): + global orig_unraisablehook + support.environment_altered = True + print_warning("Unraisable exception") + old_stderr = sys.stderr + try: + sys.stderr = sys.__stderr__ + orig_unraisablehook(unraisable) + finally: + sys.stderr = old_stderr + + +def setup_unraisable_hook(): + global orig_unraisablehook + orig_unraisablehook = sys.unraisablehook + sys.unraisablehook = regrtest_unraisable_hook diff --git a/Lib/test/list_tests.py b/Lib/test/list_tests.py index 40316de2..44bc2ae6 100644 --- a/Lib/test/list_tests.py +++ b/Lib/test/list_tests.py @@ -7,6 +7,7 @@ import os from functools import cmp_to_key from test import support, seq_tests +from test.support import ALWAYS_EQ, NEVER_EQ class CommonTest(seq_tests.CommonTest): @@ -329,6 +330,20 @@ class CommonTest(seq_tests.CommonTest): self.assertRaises(TypeError, a.remove) + a = self.type2test([1, 2]) + self.assertRaises(ValueError, a.remove, NEVER_EQ) + self.assertEqual(a, [1, 2]) + a.remove(ALWAYS_EQ) + self.assertEqual(a, [2]) + a = self.type2test([ALWAYS_EQ]) + a.remove(1) + self.assertEqual(a, []) + a = self.type2test([ALWAYS_EQ]) + a.remove(NEVER_EQ) + self.assertEqual(a, []) + a = self.type2test([NEVER_EQ]) + self.assertRaises(ValueError, a.remove, ALWAYS_EQ) + class BadExc(Exception): pass diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index 7b1ad8eb..b3975254 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -2,6 +2,7 @@ Various tests for synchronization primitives. """ +import os import sys import time from _thread import start_new_thread, TIMEOUT_MAX @@ -12,6 +13,11 @@ import weakref from test import support +requires_fork = unittest.skipUnless(hasattr(os, 'fork'), + "platform doesn't support fork " + "(no _at_fork_reinit method)") + + def _wait(): # A crude wait/yield function not relying on synchronization primitives. time.sleep(0.01) @@ -182,7 +188,7 @@ class BaseLockTests(BaseTestCase): def test_timeout(self): lock = self.locktype() # Can't set timeout if not blocking - self.assertRaises(ValueError, lock.acquire, 0, 1) + self.assertRaises(ValueError, lock.acquire, False, 1) # Invalid timeout values self.assertRaises(ValueError, lock.acquire, timeout=-100) self.assertRaises(OverflowError, lock.acquire, timeout=1e100) @@ -265,6 +271,25 @@ class LockTests(BaseLockTests): self.assertFalse(lock.locked()) self.assertTrue(lock.acquire(blocking=False)) + @requires_fork + def test_at_fork_reinit(self): + def use_lock(lock): + # make sure that the lock still works normally + # after _at_fork_reinit() + lock.acquire() + lock.release() + + # unlocked + lock = self.locktype() + lock._at_fork_reinit() + use_lock(lock) + + # locked: _at_fork_reinit() resets the lock to the unlocked state + lock2 = self.locktype() + lock2.acquire() + lock2._at_fork_reinit() + use_lock(lock2) + class RLockTests(BaseLockTests): """ @@ -417,12 +442,13 @@ class EventTests(BaseTestCase): b.wait_for_finished() self.assertEqual(results, [True] * N) - def test_reset_internal_locks(self): + @requires_fork + def test_at_fork_reinit(self): # ensure that condition is still using a Lock after reset evt = self.eventtype() with evt._cond: self.assertFalse(evt._cond.acquire(False)) - evt._reset_internal_locks() + evt._at_fork_reinit() with evt._cond: self.assertFalse(evt._cond.acquire(False)) @@ -663,6 +689,38 @@ class BaseSemaphoreTests(BaseTestCase): b.wait_for_finished() self.assertEqual(sem_results, [True] * (6 + 7 + 6 + 1)) + def test_multirelease(self): + sem = self.semtype(7) + sem.acquire() + results1 = [] + results2 = [] + phase_num = 0 + def f(): + sem.acquire() + results1.append(phase_num) + sem.acquire() + results2.append(phase_num) + b = Bunch(f, 10) + b.wait_for_started() + while len(results1) + len(results2) < 6: + _wait() + self.assertEqual(results1 + results2, [0] * 6) + phase_num = 1 + sem.release(7) + while len(results1) + len(results2) < 13: + _wait() + self.assertEqual(sorted(results1 + results2), [0] * 6 + [1] * 7) + phase_num = 2 + sem.release(6) + while len(results1) + len(results2) < 19: + _wait() + self.assertEqual(sorted(results1 + results2), [0] * 6 + [1] * 7 + [2] * 6) + # The semaphore is still locked + self.assertFalse(sem.acquire(False)) + # Final release, to let the last thread finish + sem.release() + b.wait_for_finished() + def test_try_acquire(self): sem = self.semtype(2) self.assertTrue(sem.acquire(False)) diff --git a/Lib/test/mapping_tests.py b/Lib/test/mapping_tests.py index 53f29f60..613206a0 100644 --- a/Lib/test/mapping_tests.py +++ b/Lib/test/mapping_tests.py @@ -448,7 +448,7 @@ class TestMappingProtocol(BasicTestMappingProtocol): class Exc(Exception): pass class baddict1(self.type2test): - def __init__(self): + def __init__(self, *args, **kwargs): raise Exc() self.assertRaises(Exc, baddict1.fromkeys, [1]) @@ -595,12 +595,14 @@ class TestHashMappingProtocol(TestMappingProtocol): d = self._empty_mapping() d[1] = 1 try: + count = 0 for i in d: d[i+1] = 1 + if count >= 1: + self.fail("changing dict size during iteration doesn't raise Error") + count += 1 except RuntimeError: pass - else: - self.fail("changing dict size during iteration doesn't raise Error") def test_repr(self): d = self._empty_mapping() diff --git a/Lib/test/mock_socket.py b/Lib/test/mock_socket.py index b28c4732..cda4db25 100644 --- a/Lib/test/mock_socket.py +++ b/Lib/test/mock_socket.py @@ -91,7 +91,7 @@ class MockSocket: handle = MockFile(self.lines) return handle - def sendall(self, buffer, flags=None): + def sendall(self, data, flags=None): self.last = data self.output.append(data) return len(data) diff --git a/Lib/test/outstanding_bugs.py b/Lib/test/outstanding_bugs.py deleted file mode 100644 index 7e527a67..00000000 --- a/Lib/test/outstanding_bugs.py +++ /dev/null @@ -1,18 +0,0 @@ -# -# This file is for everybody to add tests for bugs that aren't -# fixed yet. Please add a test case and appropriate bug description. -# -# When you fix one of the bugs, please move the test to the correct -# test_ module. -# - -import unittest -from test import support - -# -# No test cases for outstanding bugs at the moment. -# - - -if __name__ == "__main__": - unittest.main() diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index ff7bbb0c..94d42c4f 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -1037,7 +1037,9 @@ class AbstractUnpickleTests(unittest.TestCase): self.assertEqual(self.loads(dumped), '\u20ac\x00') def test_misc_get(self): - self.check_unpickling_error(KeyError, b'g0\np0') + self.check_unpickling_error(pickle.UnpicklingError, b'g0\np0') + self.check_unpickling_error(pickle.UnpicklingError, b'jens:') + self.check_unpickling_error(pickle.UnpicklingError, b'hens:') self.assert_is_copy([(100,), (100,)], self.loads(b'((Kdtp0\nh\x00l.))')) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 9f3e79fb..cc228fb3 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -199,11 +199,19 @@ def collect_os(info_add): ) copy_attributes(info_add, os, 'os.%s', attributes, formatter=format_attr) - call_func(info_add, 'os.getcwd', os, 'getcwd') - - call_func(info_add, 'os.getuid', os, 'getuid') - call_func(info_add, 'os.getgid', os, 'getgid') - call_func(info_add, 'os.uname', os, 'uname') + for func in ( + 'cpu_count', + 'getcwd', + 'getegid', + 'geteuid', + 'getgid', + 'getloadavg', + 'getresgid', + 'getresuid', + 'getuid', + 'uname', + ): + call_func(info_add, 'os.%s' % func, os, func) def format_groups(groups): return ', '.join(map(str, groups)) @@ -220,9 +228,6 @@ def collect_os(info_add): else: info_add("os.login", login) - call_func(info_add, 'os.cpu_count', os, 'cpu_count') - call_func(info_add, 'os.getloadavg', os, 'getloadavg') - # Environment variables used by the stdlib and tests. Don't log the full # environment: filter to list to not leak sensitive information. # @@ -303,7 +308,7 @@ def collect_os(info_add): if hasattr(os, 'umask'): mask = os.umask(0) os.umask(mask) - info_add("os.umask", '%03o' % mask) + info_add("os.umask", '0o%03o' % mask) def collect_pwd(info_add): @@ -715,6 +720,25 @@ def collect_windows(info_add): pass +def collect_fips(info_add): + try: + import _hashlib + except ImportError: + _hashlib = None + + if _hashlib is not None: + call_func(info_add, 'fips.openssl_fips_mode', _hashlib, 'get_fips_mode') + + try: + with open("/proc/sys/crypto/fips_enabled", encoding="utf-8") as fp: + line = fp.readline().rstrip() + + if line: + info_add('fips.linux_crypto_fips_enabled', line) + except OSError: + pass + + def collect_info(info): error = False info_add = info.add @@ -730,6 +754,7 @@ def collect_info(info): collect_datetime, collect_decimal, collect_expat, + collect_fips, collect_gdb, collect_gdbm, collect_get_config, @@ -757,7 +782,7 @@ def collect_info(info): ): try: collect_func(info_add) - except Exception as exc: + except Exception: error = True print("ERROR: %s() failed" % (collect_func.__name__), file=sys.stderr) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 21b0edfd..0ffb3ed4 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -6,9 +6,6 @@ Script to run Python regression tests. Run this script with -h or --help for documentation. """ -# We import importlib *ASAP* in order to test #15386 -import importlib - import os import sys from test.libregrtest import main diff --git a/Lib/test/seq_tests.py b/Lib/test/seq_tests.py index 65b110ef..1d9ad588 100644 --- a/Lib/test/seq_tests.py +++ b/Lib/test/seq_tests.py @@ -6,6 +6,7 @@ import unittest import sys import pickle from test import support +from test.support import ALWAYS_EQ, NEVER_EQ # Various iterables # This is used for checking the constructor (here and in test_deque.py) @@ -221,15 +222,15 @@ class CommonTest(unittest.TestCase): self.assertRaises(TypeError, u.__contains__) def test_contains_fake(self): - class AllEq: - # Sequences must use rich comparison against each item - # (unless "is" is true, or an earlier item answered) - # So instances of AllEq must be found in all non-empty sequences. - def __eq__(self, other): - return True - __hash__ = None # Can't meet hash invariant requirements - self.assertNotIn(AllEq(), self.type2test([])) - self.assertIn(AllEq(), self.type2test([1])) + # Sequences must use rich comparison against each item + # (unless "is" is true, or an earlier item answered) + # So ALWAYS_EQ must be found in all non-empty sequences. + self.assertNotIn(ALWAYS_EQ, self.type2test([])) + self.assertIn(ALWAYS_EQ, self.type2test([1])) + self.assertIn(1, self.type2test([ALWAYS_EQ])) + self.assertNotIn(NEVER_EQ, self.type2test([])) + self.assertNotIn(ALWAYS_EQ, self.type2test([NEVER_EQ])) + self.assertIn(NEVER_EQ, self.type2test([ALWAYS_EQ])) def test_contains_order(self): # Sequences must test in-order. If a rich comparison has side @@ -350,6 +351,11 @@ class CommonTest(unittest.TestCase): self.assertEqual(a.count(1), 3) self.assertEqual(a.count(3), 0) + self.assertEqual(a.count(ALWAYS_EQ), 9) + self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).count(1), 2) + self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).count(NEVER_EQ), 2) + self.assertEqual(self.type2test([NEVER_EQ, NEVER_EQ]).count(ALWAYS_EQ), 0) + self.assertRaises(TypeError, a.count) class BadExc(Exception): @@ -378,6 +384,11 @@ class CommonTest(unittest.TestCase): self.assertEqual(u.index(0, 3, 4), 3) self.assertRaises(ValueError, u.index, 2, 0, -10) + self.assertEqual(u.index(ALWAYS_EQ), 0) + self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).index(1), 0) + self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).index(NEVER_EQ), 0) + self.assertRaises(ValueError, self.type2test([NEVER_EQ, NEVER_EQ]).index, ALWAYS_EQ) + self.assertRaises(TypeError, u.index) class BadExc(Exception): diff --git a/Lib/test/signalinterproctester.py b/Lib/test/signalinterproctester.py index 168b5da0..bc60b747 100644 --- a/Lib/test/signalinterproctester.py +++ b/Lib/test/signalinterproctester.py @@ -4,6 +4,7 @@ import subprocess import sys import time import unittest +from test import support class SIGUSR1Exception(Exception): @@ -27,7 +28,7 @@ class InterProcessSignalTests(unittest.TestCase): # (if set) child.wait() - timeout = 10.0 + timeout = support.SHORT_TIMEOUT deadline = time.monotonic() + timeout while time.monotonic() < deadline: diff --git a/Lib/test/ssl_servers.py b/Lib/test/ssl_servers.py index bfe533c4..a4bd7455 100644 --- a/Lib/test/ssl_servers.py +++ b/Lib/test/ssl_servers.py @@ -9,10 +9,11 @@ from http.server import (HTTPServer as _HTTPServer, SimpleHTTPRequestHandler, BaseHTTPRequestHandler) from test import support +from test.support import socket_helper here = os.path.dirname(__file__) -HOST = support.HOST +HOST = socket_helper.HOST CERTFILE = os.path.join(here, 'keycert.pem') # This one's based on HTTPServer, which is based on socketserver @@ -49,7 +50,7 @@ class RootedHTTPRequestHandler(SimpleHTTPRequestHandler): server_version = "TestHTTPS/1.0" root = here # Avoid hanging when a request gets interrupted by the client - timeout = 5 + timeout = support.LOOPBACK_TIMEOUT def translate_path(self, path): """Translate a /-separated PATH to the local filename syntax. diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index 38da941f..527f505c 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -505,6 +505,7 @@ class BaseTest: EQ("", "", "replace", "A", "") EQ("", "", "replace", "A", "A") EQ("", "", "replace", "", "", 100) + EQ("A", "", "replace", "", "A", 100) EQ("", "", "replace", "", "", sys.maxsize) # interleave (from=="", 'to' gets inserted everywhere) @@ -681,6 +682,42 @@ class BaseTest: self.checkraises(OverflowError, A2_16, "replace", "A", A2_16) self.checkraises(OverflowError, A2_16, "replace", "AA", A2_16+A2_16) + def test_removeprefix(self): + self.checkequal('am', 'spam', 'removeprefix', 'sp') + self.checkequal('spamspam', 'spamspamspam', 'removeprefix', 'spam') + self.checkequal('spam', 'spam', 'removeprefix', 'python') + self.checkequal('spam', 'spam', 'removeprefix', 'spider') + self.checkequal('spam', 'spam', 'removeprefix', 'spam and eggs') + + self.checkequal('', '', 'removeprefix', '') + self.checkequal('', '', 'removeprefix', 'abcde') + self.checkequal('abcde', 'abcde', 'removeprefix', '') + self.checkequal('', 'abcde', 'removeprefix', 'abcde') + + self.checkraises(TypeError, 'hello', 'removeprefix') + self.checkraises(TypeError, 'hello', 'removeprefix', 42) + self.checkraises(TypeError, 'hello', 'removeprefix', 42, 'h') + self.checkraises(TypeError, 'hello', 'removeprefix', 'h', 42) + self.checkraises(TypeError, 'hello', 'removeprefix', ("he", "l")) + + def test_removesuffix(self): + self.checkequal('sp', 'spam', 'removesuffix', 'am') + self.checkequal('spamspam', 'spamspamspam', 'removesuffix', 'spam') + self.checkequal('spam', 'spam', 'removesuffix', 'python') + self.checkequal('spam', 'spam', 'removesuffix', 'blam') + self.checkequal('spam', 'spam', 'removesuffix', 'eggs and spam') + + self.checkequal('', '', 'removesuffix', '') + self.checkequal('', '', 'removesuffix', 'abcde') + self.checkequal('abcde', 'abcde', 'removesuffix', '') + self.checkequal('', 'abcde', 'removesuffix', 'abcde') + + self.checkraises(TypeError, 'hello', 'removesuffix') + self.checkraises(TypeError, 'hello', 'removesuffix', 42) + self.checkraises(TypeError, 'hello', 'removesuffix', 42, 'h') + self.checkraises(TypeError, 'hello', 'removesuffix', 'h', 42) + self.checkraises(TypeError, 'hello', 'removesuffix', ("lo", "l")) + def test_capitalize(self): self.checkequal(' hello ', ' hello ', 'capitalize') self.checkequal('Hello ', 'Hello ','capitalize') diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index fb09e062..aee3737f 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -3,77 +3,31 @@ if __name__ != 'test.support': raise ImportError('support must be imported from the test package') -import asyncio.events import collections.abc import contextlib import errno -import faulthandler import fnmatch import functools -import gc import glob -import hashlib import importlib import importlib.util -import locale -import logging.handlers -import nntplib import os import platform import re -import shutil -import socket import stat import struct import subprocess import sys import sysconfig -import tempfile import _thread import threading import time import types import unittest -import urllib.error import warnings from .testresult import get_test_runner -try: - import multiprocessing.process -except ImportError: - multiprocessing = None - -try: - import zlib -except ImportError: - zlib = None - -try: - import gzip -except ImportError: - gzip = None - -try: - import bz2 -except ImportError: - bz2 = None - -try: - import lzma -except ImportError: - lzma = None - -try: - import resource -except ImportError: - resource = None - -try: - import _hashlib -except ImportError: - _hashlib = None - __all__ = [ # globals "PIPE_MAX_SIZE", "verbose", "max_memuse", "use_resources", "failfast", @@ -91,26 +45,23 @@ __all__ = [ "create_empty_file", "can_symlink", "fs_is_case_insensitive", # unittest "is_resource_enabled", "requires", "requires_freebsd_version", - "requires_linux_version", "requires_mac_ver", "requires_hashdigest", + "requires_linux_version", "requires_mac_ver", "check_syntax_error", "check_syntax_warning", "TransientResource", "time_out", "socket_peer_reset", "ioerror_peer_reset", - "transient_internet", "BasicTestRunner", "run_unittest", "run_doctest", + "BasicTestRunner", "run_unittest", "run_doctest", "skip_unless_symlink", "requires_gzip", "requires_bz2", "requires_lzma", "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute", "requires_IEEE_754", "skip_unless_xattr", "requires_zlib", "anticipate_failure", "load_package_tests", "detect_api_mismatch", - "check__all__", "skip_unless_bind_unix_socket", "skip_if_buggy_ucrt_strfptime", + "check__all__", "skip_if_buggy_ucrt_strfptime", "ignore_warnings", # sys "is_jython", "is_android", "check_impl_detail", "unix_shell", "setswitchinterval", # network - "HOST", "IPV6_ENABLED", "find_unused_port", "bind_port", "open_urlresource", - "bind_unix_socket", + "open_urlresource", # processes 'temp_umask', "reap_children", - # logging - "TestHandler", # threads "threading_setup", "threading_cleanup", "reap_threads", "start_threads", # miscellaneous @@ -119,9 +70,51 @@ __all__ = [ "run_with_locale", "swap_item", "swap_attr", "Matcher", "set_memlimit", "SuppressCrashReport", "sortdict", "run_with_tz", "PGO", "missing_compiler_executable", "fd_count", - "ALWAYS_EQ", "LARGEST", "SMALLEST" + "ALWAYS_EQ", "NEVER_EQ", "LARGEST", "SMALLEST", + "LOOPBACK_TIMEOUT", "INTERNET_TIMEOUT", "SHORT_TIMEOUT", "LONG_TIMEOUT", ] + +# Timeout in seconds for tests using a network server listening on the network +# local loopback interface like 127.0.0.1. +# +# The timeout is long enough to prevent test failure: it takes into account +# that the client and the server can run in different threads or even different +# processes. +# +# The timeout should be long enough for connect(), recv() and send() methods +# of socket.socket. +LOOPBACK_TIMEOUT = 5.0 +if sys.platform == 'win32' and platform.machine() == 'ARM': + # bpo-37553: test_socket.SendfileUsingSendTest is taking longer than 2 + # seconds on Windows ARM32 buildbot + LOOPBACK_TIMEOUT = 10 + +# Timeout in seconds for network requests going to the Internet. The timeout is +# short enough to prevent a test to wait for too long if the Internet request +# is blocked for whatever reason. +# +# Usually, a timeout using INTERNET_TIMEOUT should not mark a test as failed, +# but skip the test instead: see transient_internet(). +INTERNET_TIMEOUT = 60.0 + +# Timeout in seconds to mark a test as failed if the test takes "too long". +# +# The timeout value depends on the regrtest --timeout command line option. +# +# If a test using SHORT_TIMEOUT starts to fail randomly on slow buildbots, use +# LONG_TIMEOUT instead. +SHORT_TIMEOUT = 30.0 + +# Timeout in seconds to detect when a test hangs. +# +# It is long enough to reduce the risk of test failure on the slowest Python +# buildbots. It should not be used to mark a test as failed if the test takes +# "too long". The timeout value depends on the regrtest --timeout command line +# option. +LONG_TIMEOUT = 5 * 60.0 + + class Error(Exception): """Base class for regression test exceptions.""" @@ -417,6 +410,7 @@ else: _rmdir = os.rmdir def _rmtree(path): + import shutil try: shutil.rmtree(path) return @@ -492,7 +486,9 @@ def _is_gui_available(): if hasattr(_is_gui_available, 'result'): return _is_gui_available.result reason = None - if sys.platform.startswith('win'): + if sys.platform.startswith('win') and platform.win32_is_iot(): + reason = "gui is not available on Windows IoT Core" + elif sys.platform.startswith('win'): # if Python is running as a service (such as the buildbot service), # gui interaction may be disallowed import ctypes @@ -652,165 +648,6 @@ def requires_mac_ver(*min_version): return decorator -def requires_hashdigest(digestname, openssl=None): - """Decorator raising SkipTest if a hashing algorithm is not available - - The hashing algorithm could be missing or blocked by a strict crypto - policy. - - If 'openssl' is True, then the decorator checks that OpenSSL provides - the algorithm. Otherwise the check falls back to built-in - implementations. - - ValueError: [digital envelope routines: EVP_DigestInit_ex] disabled for FIPS - ValueError: unsupported hash type md4 - """ - def decorator(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - try: - if openssl and _hashlib is not None: - _hashlib.new(digestname) - else: - hashlib.new(digestname) - except ValueError: - raise unittest.SkipTest( - f"hash digest '{digestname}' is not available." - ) - return func(*args, **kwargs) - return wrapper - return decorator - - -HOST = "localhost" -HOSTv4 = "127.0.0.1" -HOSTv6 = "::1" - - -def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM): - """Returns an unused port that should be suitable for binding. This is - achieved by creating a temporary socket with the same family and type as - the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to - the specified host address (defaults to 0.0.0.0) with the port set to 0, - eliciting an unused ephemeral port from the OS. The temporary socket is - then closed and deleted, and the ephemeral port is returned. - - Either this method or bind_port() should be used for any tests where a - server socket needs to be bound to a particular port for the duration of - the test. Which one to use depends on whether the calling code is creating - a python socket, or if an unused port needs to be provided in a constructor - or passed to an external program (i.e. the -accept argument to openssl's - s_server mode). Always prefer bind_port() over find_unused_port() where - possible. Hard coded ports should *NEVER* be used. As soon as a server - socket is bound to a hard coded port, the ability to run multiple instances - of the test simultaneously on the same host is compromised, which makes the - test a ticking time bomb in a buildbot environment. On Unix buildbots, this - may simply manifest as a failed test, which can be recovered from without - intervention in most cases, but on Windows, the entire python process can - completely and utterly wedge, requiring someone to log in to the buildbot - and manually kill the affected process. - - (This is easy to reproduce on Windows, unfortunately, and can be traced to - the SO_REUSEADDR socket option having different semantics on Windows versus - Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind, - listen and then accept connections on identical host/ports. An EADDRINUSE - OSError will be raised at some point (depending on the platform and - the order bind and listen were called on each socket). - - However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE - will ever be raised when attempting to bind two identical host/ports. When - accept() is called on each socket, the second caller's process will steal - the port from the first caller, leaving them both in an awkwardly wedged - state where they'll no longer respond to any signals or graceful kills, and - must be forcibly killed via OpenProcess()/TerminateProcess(). - - The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option - instead of SO_REUSEADDR, which effectively affords the same semantics as - SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open - Source world compared to Windows ones, this is a common mistake. A quick - look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when - openssl.exe is called with the 's_server' option, for example. See - http://bugs.python.org/issue2550 for more info. The following site also - has a very thorough description about the implications of both REUSEADDR - and EXCLUSIVEADDRUSE on Windows: - http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx) - - XXX: although this approach is a vast improvement on previous attempts to - elicit unused ports, it rests heavily on the assumption that the ephemeral - port returned to us by the OS won't immediately be dished back out to some - other process when we close and delete our temporary socket but before our - calling code has a chance to bind the returned port. We can deal with this - issue if/when we come across it. - """ - - with socket.socket(family, socktype) as tempsock: - port = bind_port(tempsock) - del tempsock - return port - -def bind_port(sock, host=HOST): - """Bind the socket to a free port and return the port number. Relies on - ephemeral ports in order to ensure we are using an unbound port. This is - important as many tests may be running simultaneously, especially in a - buildbot environment. This method raises an exception if the sock.family - is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR - or SO_REUSEPORT set on it. Tests should *never* set these socket options - for TCP/IP sockets. The only case for setting these options is testing - multicasting via multiple UDP sockets. - - Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e. - on Windows), it will be set on the socket. This will prevent anyone else - from bind()'ing to our host/port for the duration of the test. - """ - - if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM: - if hasattr(socket, 'SO_REUSEADDR'): - if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1: - raise TestFailed("tests should never set the SO_REUSEADDR " \ - "socket option on TCP/IP sockets!") - if hasattr(socket, 'SO_REUSEPORT'): - try: - if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1: - raise TestFailed("tests should never set the SO_REUSEPORT " \ - "socket option on TCP/IP sockets!") - except OSError: - # Python's socket module was compiled using modern headers - # thus defining SO_REUSEPORT but this process is running - # under an older kernel that does not support SO_REUSEPORT. - pass - if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'): - sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) - - sock.bind((host, 0)) - port = sock.getsockname()[1] - return port - -def bind_unix_socket(sock, addr): - """Bind a unix socket, raising SkipTest if PermissionError is raised.""" - assert sock.family == socket.AF_UNIX - try: - sock.bind(addr) - except PermissionError: - sock.close() - raise unittest.SkipTest('cannot bind AF_UNIX sockets') - -def _is_ipv6_enabled(): - """Check whether IPv6 is enabled on this host.""" - if socket.has_ipv6: - sock = None - try: - sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) - sock.bind((HOSTv6, 0)) - return True - except OSError: - pass - finally: - if sock: - sock.close() - return False - -IPV6_ENABLED = _is_ipv6_enabled() - def system_must_validate_cert(f): """Skip the test on TLS certificate validation failures.""" @functools.wraps(f) @@ -843,13 +680,33 @@ requires_IEEE_754 = unittest.skipUnless( float.__getformat__("double").startswith("IEEE"), "test requires IEEE 754 doubles") -requires_zlib = unittest.skipUnless(zlib, 'requires zlib') +def requires_zlib(reason='requires zlib'): + try: + import zlib + except ImportError: + zlib = None + return unittest.skipUnless(zlib, reason) -requires_gzip = unittest.skipUnless(gzip, 'requires gzip') +def requires_gzip(reason='requires gzip'): + try: + import gzip + except ImportError: + gzip = None + return unittest.skipUnless(gzip, reason) -requires_bz2 = unittest.skipUnless(bz2, 'requires bz2') +def requires_bz2(reason='requires bz2'): + try: + import bz2 + except ImportError: + bz2 = None + return unittest.skipUnless(bz2, reason) -requires_lzma = unittest.skipUnless(lzma, 'requires lzma') +def requires_lzma(reason='requires lzma'): + try: + import lzma + except ImportError: + lzma = None + return unittest.skipUnless(lzma, reason) is_jython = sys.platform.startswith('java') @@ -863,21 +720,21 @@ else: # Filename used for testing if os.name == 'java': # Jython disallows @ in module names - TESTFN = '$test' + TESTFN_ASCII = '$test' else: - TESTFN = '@test' + TESTFN_ASCII = '@test' # Disambiguate TESTFN for parallel testing, while letting it remain a valid # module name. -TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid()) +TESTFN_ASCII = "{}_{}_tmp".format(TESTFN_ASCII, os.getpid()) # Define the URL of a dedicated HTTP server for the network tests. # The URL must use clear-text HTTP: no redirection to encrypted HTTPS. TEST_HTTP_URL = "http://www.pythontest.net" # FS_NONASCII: non-ASCII character encodable by os.fsencode(), -# or None if there is no such character. -FS_NONASCII = None +# or an empty string if there is no such character. +FS_NONASCII = '' for character in ( # First try printable and common characters to have a readable filename. # For each character, the encoding list are just example of encodings able @@ -924,7 +781,7 @@ for character in ( break # TESTFN_UNICODE is a non-ascii filename -TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f" +TESTFN_UNICODE = TESTFN_ASCII + "-\xe0\xf2\u0258\u0141\u011f" if sys.platform == 'darwin': # In Mac OS X's VFS API file names are, by definition, canonically # decomposed Unicode, encoded using UTF-8. See QA1173: @@ -942,7 +799,7 @@ if os.name == 'nt': if sys.getwindowsversion().platform >= 2: # Different kinds of characters from various languages to minimize the # probability that the whole name is encodable to MBCS (issue #9819) - TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80" + TESTFN_UNENCODABLE = TESTFN_ASCII + "-\u5171\u0141\u2661\u0363\uDC80" try: TESTFN_UNENCODABLE.encode(TESTFN_ENCODING) except UnicodeEncodeError: @@ -959,7 +816,7 @@ elif sys.platform != 'darwin': b'\xff'.decode(TESTFN_ENCODING) except UnicodeDecodeError: # 0xff will be encoded using the surrogate character u+DCFF - TESTFN_UNENCODABLE = TESTFN \ + TESTFN_UNENCODABLE = TESTFN_ASCII \ + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape') else: # File system encoding (eg. ISO-8859-* encodings) can encode @@ -993,13 +850,14 @@ for name in ( try: name.decode(TESTFN_ENCODING) except UnicodeDecodeError: - TESTFN_UNDECODABLE = os.fsencode(TESTFN) + name + TESTFN_UNDECODABLE = os.fsencode(TESTFN_ASCII) + name break if FS_NONASCII: - TESTFN_NONASCII = TESTFN + '-' + FS_NONASCII + TESTFN_NONASCII = TESTFN_ASCII + FS_NONASCII else: TESTFN_NONASCII = None +TESTFN = TESTFN_NONASCII or TESTFN_ASCII # Save the initial cwd SAVEDCWD = os.getcwd() @@ -1026,6 +884,7 @@ def temp_dir(path=None, quiet=False): created, only a warning is issued. """ + import tempfile dir_created = False if path is None: path = tempfile.mkdtemp() @@ -1199,6 +1058,10 @@ def check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=No def open_urlresource(url, *args, **kw): import urllib.request, urllib.parse + try: + import gzip + except ImportError: + gzip = None check = kw.pop('check', None) @@ -1229,7 +1092,7 @@ def open_urlresource(url, *args, **kw): opener = urllib.request.build_opener() if gzip: opener.addheaders.append(('Accept-Encoding', 'gzip')) - f = opener.open(url, timeout=15) + f = opener.open(url, timeout=INTERNET_TIMEOUT) if gzip and f.headers.get('Content-Encoding') == 'gzip': f = gzip.GzipFile(fileobj=f) try: @@ -1518,105 +1381,6 @@ socket_peer_reset = TransientResource(OSError, errno=errno.ECONNRESET) ioerror_peer_reset = TransientResource(OSError, errno=errno.ECONNRESET) -def get_socket_conn_refused_errs(): - """ - Get the different socket error numbers ('errno') which can be received - when a connection is refused. - """ - errors = [errno.ECONNREFUSED] - if hasattr(errno, 'ENETUNREACH'): - # On Solaris, ENETUNREACH is returned sometimes instead of ECONNREFUSED - errors.append(errno.ENETUNREACH) - if hasattr(errno, 'EADDRNOTAVAIL'): - # bpo-31910: socket.create_connection() fails randomly - # with EADDRNOTAVAIL on Travis CI - errors.append(errno.EADDRNOTAVAIL) - if hasattr(errno, 'EHOSTUNREACH'): - # bpo-37583: The destination host cannot be reached - errors.append(errno.EHOSTUNREACH) - if not IPV6_ENABLED: - errors.append(errno.EAFNOSUPPORT) - return errors - - -@contextlib.contextmanager -def transient_internet(resource_name, *, timeout=30.0, errnos=()): - """Return a context manager that raises ResourceDenied when various issues - with the Internet connection manifest themselves as exceptions.""" - default_errnos = [ - ('ECONNREFUSED', 111), - ('ECONNRESET', 104), - ('EHOSTUNREACH', 113), - ('ENETUNREACH', 101), - ('ETIMEDOUT', 110), - # socket.create_connection() fails randomly with - # EADDRNOTAVAIL on Travis CI. - ('EADDRNOTAVAIL', 99), - ] - default_gai_errnos = [ - ('EAI_AGAIN', -3), - ('EAI_FAIL', -4), - ('EAI_NONAME', -2), - ('EAI_NODATA', -5), - # Encountered when trying to resolve IPv6-only hostnames - ('WSANO_DATA', 11004), - ] - - denied = ResourceDenied("Resource %r is not available" % resource_name) - captured_errnos = errnos - gai_errnos = [] - if not captured_errnos: - captured_errnos = [getattr(errno, name, num) - for (name, num) in default_errnos] - gai_errnos = [getattr(socket, name, num) - for (name, num) in default_gai_errnos] - - def filter_error(err): - n = getattr(err, 'errno', None) - if (isinstance(err, socket.timeout) or - (isinstance(err, socket.gaierror) and n in gai_errnos) or - (isinstance(err, urllib.error.HTTPError) and - 500 <= err.code <= 599) or - (isinstance(err, urllib.error.URLError) and - (("ConnectionRefusedError" in err.reason) or - ("TimeoutError" in err.reason) or - ("EOFError" in err.reason))) or - n in captured_errnos): - if not verbose: - sys.stderr.write(denied.args[0] + "\n") - raise denied from err - - old_timeout = socket.getdefaulttimeout() - try: - if timeout is not None: - socket.setdefaulttimeout(timeout) - yield - except nntplib.NNTPTemporaryError as err: - if verbose: - sys.stderr.write(denied.args[0] + "\n") - raise denied from err - except OSError as err: - # urllib can wrap original socket errors multiple times (!), we must - # unwrap to get at the original error. - while True: - a = err.args - if len(a) >= 1 and isinstance(a[0], OSError): - err = a[0] - # The error can also be wrapped as args[1]: - # except socket.error as msg: - # raise OSError('socket error', msg).with_traceback(sys.exc_info()[2]) - elif len(a) >= 2 and isinstance(a[1], OSError): - err = a[1] - else: - break - filter_error(err) - raise - # XXX should we catch generic exceptions and look for their - # __cause__ or __context__? - finally: - socket.setdefaulttimeout(old_timeout) - - @contextlib.contextmanager def captured_output(stream_name): """Return a context manager used by captured_stdout/stdin/stderr @@ -1670,6 +1434,7 @@ def gc_collect(): longer than expected. This function tries its best to force all garbage objects to disappear. """ + import gc gc.collect() if is_jython: time.sleep(0.1) @@ -1678,6 +1443,7 @@ def gc_collect(): @contextlib.contextmanager def disable_gc(): + import gc have_gc = gc.isenabled() gc.disable() try: @@ -1715,12 +1481,12 @@ _TPFLAGS_HAVE_GC = 1<<14 _TPFLAGS_HEAPTYPE = 1<<9 def check_sizeof(test, o, size): - import _testcapi + import _testinternalcapi result = sys.getsizeof(o) # add GC header size if ((type(o) == type) and (o.__flags__ & _TPFLAGS_HEAPTYPE) or\ ((type(o) != type) and (type(o).__flags__ & _TPFLAGS_HAVE_GC))): - size += _testcapi.SIZEOF_PYGC_HEAD + size += _testinternalcapi.SIZEOF_PYGC_HEAD msg = 'wrong size for %s: got %d, expected %d' \ % (type(o), result, size) test.assertEqual(result, size, msg) @@ -2292,7 +2058,7 @@ def reap_threads(func): @contextlib.contextmanager -def wait_threads_exit(timeout=60.0): +def wait_threads_exit(timeout=None): """ bpo-31234: Context manager to wait until all threads created in the with statement exit. @@ -2306,6 +2072,8 @@ def wait_threads_exit(timeout=60.0): which doesn't allow to wait for thread exit, whereas thread.Thread has a join() method. """ + if timeout is None: + timeout = SHORT_TIMEOUT old_count = _thread._count() try: yield @@ -2326,10 +2094,12 @@ def wait_threads_exit(timeout=60.0): gc_collect() -def join_thread(thread, timeout=30.0): +def join_thread(thread, timeout=None): """Join a thread. Raise an AssertionError if the thread is still alive after timeout seconds. """ + if timeout is None: + timeout = SHORT_TIMEOUT thread.join(timeout) if thread.is_alive(): msg = f"failed to join the thread in {timeout:.1f} seconds" @@ -2366,6 +2136,7 @@ def reap_children(): @contextlib.contextmanager def start_threads(threads, unlock=None): + import faulthandler threads = list(threads) started = [] try: @@ -2462,19 +2233,6 @@ def swap_item(obj, item, new_val): if item in obj: del obj[item] -def strip_python_stderr(stderr): - """Strip the stderr of a Python process from potential debug output - emitted by the interpreter. - - This will typically be run on the result of the communicate() method - of a subprocess.Popen object. - """ - stderr = re.sub(br"\[\d+ refs, \d+ blocks\]\r?\n?", b"", stderr).strip() - return stderr - -requires_type_collecting = unittest.skipIf(hasattr(sys, 'getcounts'), - 'types are immortal if COUNT_ALLOCS is defined') - def args_from_interpreter_flags(): """Return a list of command-line arguments reproducing the current settings in sys.flags and sys.warnoptions.""" @@ -2485,37 +2243,6 @@ def optim_args_from_interpreter_flags(): optimization settings in sys.flags.""" return subprocess._optim_args_from_interpreter_flags() -#============================================================ -# Support for assertions about logging. -#============================================================ - -class TestHandler(logging.handlers.BufferingHandler): - def __init__(self, matcher): - # BufferingHandler takes a "capacity" argument - # so as to know when to flush. As we're overriding - # shouldFlush anyway, we can set a capacity of zero. - # You can call flush() manually to clear out the - # buffer. - logging.handlers.BufferingHandler.__init__(self, 0) - self.matcher = matcher - - def shouldFlush(self): - return False - - def emit(self, record): - self.format(record) - self.buffer.append(record.__dict__) - - def matches(self, **kwargs): - """ - Look for a saved dict whose keys/values match the supplied arguments. - """ - result = False - for d in self.buffer: - if self.matcher.matches(d, **kwargs): - result = True - break - return result class Matcher(object): @@ -2584,6 +2311,7 @@ def skip_if_buggy_ucrt_strfptime(test): See bpo-37552 [Windows] strptime/strftime return invalid results with UCRT version 17763.615 """ + import locale global _buggy_ucrt if _buggy_ucrt is None: if(sys.platform == 'win32' and @@ -2674,6 +2402,7 @@ class PythonSymlink: _can_xattr = None def can_xattr(): + import tempfile global _can_xattr if _can_xattr is not None: return _can_xattr @@ -2715,31 +2444,10 @@ def skip_if_pgo_task(test): msg = "Not run for (non-extended) PGO task" return test if ok else unittest.skip(msg)(test) -_bind_nix_socket_error = None -def skip_unless_bind_unix_socket(test): - """Decorator for tests requiring a functional bind() for unix sockets.""" - if not hasattr(socket, 'AF_UNIX'): - return unittest.skip('No UNIX Sockets')(test) - global _bind_nix_socket_error - if _bind_nix_socket_error is None: - path = TESTFN + "can_bind_unix_socket" - with socket.socket(socket.AF_UNIX) as sock: - try: - sock.bind(path) - _bind_nix_socket_error = False - except OSError as e: - _bind_nix_socket_error = e - finally: - unlink(path) - if _bind_nix_socket_error: - msg = 'Requires a functional unix bind(): %s' % _bind_nix_socket_error - return unittest.skip(msg)(test) - else: - return test - def fs_is_case_insensitive(directory): """Detects if the file system for the specified directory is case-insensitive.""" + import tempfile with tempfile.NamedTemporaryFile(dir=directory) as base: base_path = base.name case_path = base_path.upper() @@ -2889,11 +2597,16 @@ class SuppressCrashReport: self.old_modes[report_type] = old_mode, old_file else: - if resource is not None: + try: + import resource + self.resource = resource + except ImportError: + self.resource = None + if self.resource is not None: try: - self.old_value = resource.getrlimit(resource.RLIMIT_CORE) - resource.setrlimit(resource.RLIMIT_CORE, - (0, self.old_value[1])) + self.old_value = self.resource.getrlimit(self.resource.RLIMIT_CORE) + self.resource.setrlimit(self.resource.RLIMIT_CORE, + (0, self.old_value[1])) except (ValueError, OSError): pass @@ -2931,9 +2644,9 @@ class SuppressCrashReport: msvcrt.CrtSetReportMode(report_type, old_mode) msvcrt.CrtSetReportFile(report_type, old_file) else: - if resource is not None: + if self.resource is not None: try: - resource.setrlimit(resource.RLIMIT_CORE, self.old_value) + self.resource.setrlimit(self.resource.RLIMIT_CORE, self.old_value) except (ValueError, OSError): pass @@ -3020,9 +2733,15 @@ def missing_compiler_executable(cmd_names=[]): missing. """ - from distutils import ccompiler, sysconfig, spawn + from distutils import ccompiler, sysconfig, spawn, errors compiler = ccompiler.new_compiler() sysconfig.customize_compiler(compiler) + if compiler.compiler_type == "msvc": + # MSVC has no executables, so check whether initialization succeeds + try: + compiler.initialize() + except errors.DistutilsPlatformError: + return "msvc" for name in compiler.executables: if cmd_names and name not in cmd_names: continue @@ -3053,6 +2772,8 @@ def setswitchinterval(interval): @contextlib.contextmanager def disable_faulthandler(): + import faulthandler + # use sys.__stderr__ instead of sys.stderr, since regrtest replaces # sys.stderr with a StringIO which has no file descriptor when a test # is run with -W/--verbose3. @@ -3199,6 +2920,19 @@ class _ALWAYS_EQ: ALWAYS_EQ = _ALWAYS_EQ() +class _NEVER_EQ: + """ + Object that is not equal to anything. + """ + def __eq__(self, other): + return False + def __ne__(self, other): + return True + def __hash__(self): + return 1 + +NEVER_EQ = _NEVER_EQ() + @functools.total_ordering class _LARGEST: """ @@ -3225,6 +2959,7 @@ SMALLEST = _SMALLEST() def maybe_get_event_loop_policy(): """Return the global event loop policy if one is set, else return None.""" + import asyncio.events return asyncio.events._event_loop_policy # Helpers for testing hashing. @@ -3370,6 +3105,69 @@ class catch_threading_exception: del self.thread +def wait_process(pid, *, exitcode, timeout=None): + """ + Wait until process pid completes and check that the process exit code is + exitcode. + + Raise an AssertionError if the process exit code is not equal to exitcode. + + If the process runs longer than timeout seconds (SHORT_TIMEOUT by default), + kill the process (if signal.SIGKILL is available) and raise an + AssertionError. The timeout feature is not available on Windows. + """ + if os.name != "nt": + import signal + + if timeout is None: + timeout = SHORT_TIMEOUT + t0 = time.monotonic() + sleep = 0.001 + max_sleep = 0.1 + while True: + pid2, status = os.waitpid(pid, os.WNOHANG) + if pid2 != 0: + break + # process is still running + + dt = time.monotonic() - t0 + if dt > SHORT_TIMEOUT: + try: + os.kill(pid, signal.SIGKILL) + os.waitpid(pid, 0) + except OSError: + # Ignore errors like ChildProcessError or PermissionError + pass + + raise AssertionError(f"process {pid} is still running " + f"after {dt:.1f} seconds") + + sleep = min(sleep * 2, max_sleep) + time.sleep(sleep) + else: + # Windows implementation + pid2, status = os.waitpid(pid, 0) + + exitcode2 = os.waitstatus_to_exitcode(status) + if exitcode2 != exitcode: + raise AssertionError(f"process {pid} exited with code {exitcode2}, " + f"but exit code {exitcode} is expected") + + # sanity check: it should not fail in practice + if pid2 != pid: + raise AssertionError(f"pid {pid2} != pid {pid}") + + +def use_old_parser(): + import _testinternalcapi + config = _testinternalcapi.get_configs() + return (config['config']['_use_peg_parser'] == 0) + + +def skip_if_new_parser(msg): + return unittest.skipIf(not use_old_parser(), msg) + + @contextlib.contextmanager def save_restore_warnings_filters(): old_filters = warnings.filters[:] diff --git a/Lib/test/support/bytecode_helper.py b/Lib/test/support/bytecode_helper.py new file mode 100644 index 00000000..348e277c --- /dev/null +++ b/Lib/test/support/bytecode_helper.py @@ -0,0 +1,41 @@ +"""bytecode_helper - support tools for testing correct bytecode generation""" + +import unittest +import dis +import io + +_UNSPECIFIED = object() + +class BytecodeTestCase(unittest.TestCase): + """Custom assertion methods for inspecting bytecode.""" + + def get_disassembly_as_string(self, co): + s = io.StringIO() + dis.dis(co, file=s) + return s.getvalue() + + def assertInBytecode(self, x, opname, argval=_UNSPECIFIED): + """Returns instr if opname is found, otherwise throws AssertionError""" + for instr in dis.get_instructions(x): + if instr.opname == opname: + if argval is _UNSPECIFIED or instr.argval == argval: + return instr + disassembly = self.get_disassembly_as_string(x) + if argval is _UNSPECIFIED: + msg = '%s not found in bytecode:\n%s' % (opname, disassembly) + else: + msg = '(%s,%r) not found in bytecode:\n%s' + msg = msg % (opname, argval, disassembly) + self.fail(msg) + + def assertNotInBytecode(self, x, opname, argval=_UNSPECIFIED): + """Throws AssertionError if opname is found""" + for instr in dis.get_instructions(x): + if instr.opname == opname: + disassembly = self.get_disassembly_as_string(x) + if argval is _UNSPECIFIED: + msg = '%s occurs in bytecode:\n%s' % (opname, disassembly) + elif instr.argval == argval: + msg = '(%s,%r) occurs in bytecode:\n%s' + msg = msg % (opname, argval, disassembly) + self.fail(msg) diff --git a/Lib/test/support/hashlib_helper.py b/Lib/test/support/hashlib_helper.py new file mode 100644 index 00000000..a28132a5 --- /dev/null +++ b/Lib/test/support/hashlib_helper.py @@ -0,0 +1,38 @@ +import functools +import hashlib +import unittest + +try: + import _hashlib +except ImportError: + _hashlib = None + + +def requires_hashdigest(digestname, openssl=None, usedforsecurity=True): + """Decorator raising SkipTest if a hashing algorithm is not available + + The hashing algorithm could be missing or blocked by a strict crypto + policy. + + If 'openssl' is True, then the decorator checks that OpenSSL provides + the algorithm. Otherwise the check falls back to built-in + implementations. The usedforsecurity flag is passed to the constructor. + + ValueError: [digital envelope routines: EVP_DigestInit_ex] disabled for FIPS + ValueError: unsupported hash type md4 + """ + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + try: + if openssl and _hashlib is not None: + _hashlib.new(digestname, usedforsecurity=usedforsecurity) + else: + hashlib.new(digestname, usedforsecurity=usedforsecurity) + except ValueError: + raise unittest.SkipTest( + f"hash digest '{digestname}' is not available." + ) + return func(*args, **kwargs) + return wrapper + return decorator diff --git a/Lib/test/support/logging_helper.py b/Lib/test/support/logging_helper.py new file mode 100644 index 00000000..12fcca4f --- /dev/null +++ b/Lib/test/support/logging_helper.py @@ -0,0 +1,29 @@ +import logging.handlers + +class TestHandler(logging.handlers.BufferingHandler): + def __init__(self, matcher): + # BufferingHandler takes a "capacity" argument + # so as to know when to flush. As we're overriding + # shouldFlush anyway, we can set a capacity of zero. + # You can call flush() manually to clear out the + # buffer. + logging.handlers.BufferingHandler.__init__(self, 0) + self.matcher = matcher + + def shouldFlush(self): + return False + + def emit(self, record): + self.format(record) + self.buffer.append(record.__dict__) + + def matches(self, **kwargs): + """ + Look for a saved dict whose keys/values match the supplied arguments. + """ + result = False + for d in self.buffer: + if self.matcher.matches(d, **kwargs): + result = True + break + return result diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py index 83519988..37e576d4 100644 --- a/Lib/test/support/script_helper.py +++ b/Lib/test/support/script_helper.py @@ -11,7 +11,7 @@ import py_compile import zipfile from importlib.util import source_from_cache -from test.support import make_legacy_pyc, strip_python_stderr +from test.support import make_legacy_pyc # Cached result of the expensive test performed in the function below. @@ -134,7 +134,6 @@ def run_python_until_end(*args, **env_vars): proc.kill() subprocess._cleanup() rc = proc.returncode - err = strip_python_stderr(err) return _PythonRunResult(rc, out, err), cmd_line def _assert_python(expected_success, /, *args, **env_vars): diff --git a/Lib/test/support/socket_helper.py b/Lib/test/support/socket_helper.py new file mode 100644 index 00000000..f709ffd4 --- /dev/null +++ b/Lib/test/support/socket_helper.py @@ -0,0 +1,269 @@ +import contextlib +import errno +import socket +import unittest +import sys + +from .. import support + + +HOST = "localhost" +HOSTv4 = "127.0.0.1" +HOSTv6 = "::1" + + +def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM): + """Returns an unused port that should be suitable for binding. This is + achieved by creating a temporary socket with the same family and type as + the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to + the specified host address (defaults to 0.0.0.0) with the port set to 0, + eliciting an unused ephemeral port from the OS. The temporary socket is + then closed and deleted, and the ephemeral port is returned. + + Either this method or bind_port() should be used for any tests where a + server socket needs to be bound to a particular port for the duration of + the test. Which one to use depends on whether the calling code is creating + a python socket, or if an unused port needs to be provided in a constructor + or passed to an external program (i.e. the -accept argument to openssl's + s_server mode). Always prefer bind_port() over find_unused_port() where + possible. Hard coded ports should *NEVER* be used. As soon as a server + socket is bound to a hard coded port, the ability to run multiple instances + of the test simultaneously on the same host is compromised, which makes the + test a ticking time bomb in a buildbot environment. On Unix buildbots, this + may simply manifest as a failed test, which can be recovered from without + intervention in most cases, but on Windows, the entire python process can + completely and utterly wedge, requiring someone to log in to the buildbot + and manually kill the affected process. + + (This is easy to reproduce on Windows, unfortunately, and can be traced to + the SO_REUSEADDR socket option having different semantics on Windows versus + Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind, + listen and then accept connections on identical host/ports. An EADDRINUSE + OSError will be raised at some point (depending on the platform and + the order bind and listen were called on each socket). + + However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE + will ever be raised when attempting to bind two identical host/ports. When + accept() is called on each socket, the second caller's process will steal + the port from the first caller, leaving them both in an awkwardly wedged + state where they'll no longer respond to any signals or graceful kills, and + must be forcibly killed via OpenProcess()/TerminateProcess(). + + The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option + instead of SO_REUSEADDR, which effectively affords the same semantics as + SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open + Source world compared to Windows ones, this is a common mistake. A quick + look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when + openssl.exe is called with the 's_server' option, for example. See + http://bugs.python.org/issue2550 for more info. The following site also + has a very thorough description about the implications of both REUSEADDR + and EXCLUSIVEADDRUSE on Windows: + http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx) + + XXX: although this approach is a vast improvement on previous attempts to + elicit unused ports, it rests heavily on the assumption that the ephemeral + port returned to us by the OS won't immediately be dished back out to some + other process when we close and delete our temporary socket but before our + calling code has a chance to bind the returned port. We can deal with this + issue if/when we come across it. + """ + + with socket.socket(family, socktype) as tempsock: + port = bind_port(tempsock) + del tempsock + return port + +def bind_port(sock, host=HOST): + """Bind the socket to a free port and return the port number. Relies on + ephemeral ports in order to ensure we are using an unbound port. This is + important as many tests may be running simultaneously, especially in a + buildbot environment. This method raises an exception if the sock.family + is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR + or SO_REUSEPORT set on it. Tests should *never* set these socket options + for TCP/IP sockets. The only case for setting these options is testing + multicasting via multiple UDP sockets. + + Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e. + on Windows), it will be set on the socket. This will prevent anyone else + from bind()'ing to our host/port for the duration of the test. + """ + + if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM: + if hasattr(socket, 'SO_REUSEADDR'): + if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1: + raise support.TestFailed("tests should never set the " + "SO_REUSEADDR socket option on " + "TCP/IP sockets!") + if hasattr(socket, 'SO_REUSEPORT'): + try: + if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1: + raise support.TestFailed("tests should never set the " + "SO_REUSEPORT socket option on " + "TCP/IP sockets!") + except OSError: + # Python's socket module was compiled using modern headers + # thus defining SO_REUSEPORT but this process is running + # under an older kernel that does not support SO_REUSEPORT. + pass + if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'): + sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) + + sock.bind((host, 0)) + port = sock.getsockname()[1] + return port + +def bind_unix_socket(sock, addr): + """Bind a unix socket, raising SkipTest if PermissionError is raised.""" + assert sock.family == socket.AF_UNIX + try: + sock.bind(addr) + except PermissionError: + sock.close() + raise unittest.SkipTest('cannot bind AF_UNIX sockets') + +def _is_ipv6_enabled(): + """Check whether IPv6 is enabled on this host.""" + if socket.has_ipv6: + sock = None + try: + sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) + sock.bind((HOSTv6, 0)) + return True + except OSError: + pass + finally: + if sock: + sock.close() + return False + +IPV6_ENABLED = _is_ipv6_enabled() + + +_bind_nix_socket_error = None +def skip_unless_bind_unix_socket(test): + """Decorator for tests requiring a functional bind() for unix sockets.""" + if not hasattr(socket, 'AF_UNIX'): + return unittest.skip('No UNIX Sockets')(test) + global _bind_nix_socket_error + if _bind_nix_socket_error is None: + from test.support import TESTFN, unlink + path = TESTFN + "can_bind_unix_socket" + with socket.socket(socket.AF_UNIX) as sock: + try: + sock.bind(path) + _bind_nix_socket_error = False + except OSError as e: + _bind_nix_socket_error = e + finally: + unlink(path) + if _bind_nix_socket_error: + msg = 'Requires a functional unix bind(): %s' % _bind_nix_socket_error + return unittest.skip(msg)(test) + else: + return test + + +def get_socket_conn_refused_errs(): + """ + Get the different socket error numbers ('errno') which can be received + when a connection is refused. + """ + errors = [errno.ECONNREFUSED] + if hasattr(errno, 'ENETUNREACH'): + # On Solaris, ENETUNREACH is returned sometimes instead of ECONNREFUSED + errors.append(errno.ENETUNREACH) + if hasattr(errno, 'EADDRNOTAVAIL'): + # bpo-31910: socket.create_connection() fails randomly + # with EADDRNOTAVAIL on Travis CI + errors.append(errno.EADDRNOTAVAIL) + if hasattr(errno, 'EHOSTUNREACH'): + # bpo-37583: The destination host cannot be reached + errors.append(errno.EHOSTUNREACH) + if not IPV6_ENABLED: + errors.append(errno.EAFNOSUPPORT) + return errors + + +_NOT_SET = object() + +@contextlib.contextmanager +def transient_internet(resource_name, *, timeout=_NOT_SET, errnos=()): + """Return a context manager that raises ResourceDenied when various issues + with the Internet connection manifest themselves as exceptions.""" + import nntplib + import urllib.error + if timeout is _NOT_SET: + timeout = support.INTERNET_TIMEOUT + + default_errnos = [ + ('ECONNREFUSED', 111), + ('ECONNRESET', 104), + ('EHOSTUNREACH', 113), + ('ENETUNREACH', 101), + ('ETIMEDOUT', 110), + # socket.create_connection() fails randomly with + # EADDRNOTAVAIL on Travis CI. + ('EADDRNOTAVAIL', 99), + ] + default_gai_errnos = [ + ('EAI_AGAIN', -3), + ('EAI_FAIL', -4), + ('EAI_NONAME', -2), + ('EAI_NODATA', -5), + # Encountered when trying to resolve IPv6-only hostnames + ('WSANO_DATA', 11004), + ] + + denied = support.ResourceDenied("Resource %r is not available" % resource_name) + captured_errnos = errnos + gai_errnos = [] + if not captured_errnos: + captured_errnos = [getattr(errno, name, num) + for (name, num) in default_errnos] + gai_errnos = [getattr(socket, name, num) + for (name, num) in default_gai_errnos] + + def filter_error(err): + n = getattr(err, 'errno', None) + if (isinstance(err, socket.timeout) or + (isinstance(err, socket.gaierror) and n in gai_errnos) or + (isinstance(err, urllib.error.HTTPError) and + 500 <= err.code <= 599) or + (isinstance(err, urllib.error.URLError) and + (("ConnectionRefusedError" in err.reason) or + ("TimeoutError" in err.reason) or + ("EOFError" in err.reason))) or + n in captured_errnos): + if not support.verbose: + sys.stderr.write(denied.args[0] + "\n") + raise denied from err + + old_timeout = socket.getdefaulttimeout() + try: + if timeout is not None: + socket.setdefaulttimeout(timeout) + yield + except nntplib.NNTPTemporaryError as err: + if support.verbose: + sys.stderr.write(denied.args[0] + "\n") + raise denied from err + except OSError as err: + # urllib can wrap original socket errors multiple times (!), we must + # unwrap to get at the original error. + while True: + a = err.args + if len(a) >= 1 and isinstance(a[0], OSError): + err = a[0] + # The error can also be wrapped as args[1]: + # except socket.error as msg: + # raise OSError('socket error', msg).with_traceback(sys.exc_info()[2]) + elif len(a) >= 2 and isinstance(a[1], OSError): + err = a[1] + else: + break + filter_error(err) + raise + # XXX should we catch generic exceptions and look for their + # __cause__ or __context__? + finally: + socket.setdefaulttimeout(old_timeout) diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py index c0778815..0ba243ee 100644 --- a/Lib/test/test___all__.py +++ b/Lib/test/test___all__.py @@ -17,6 +17,7 @@ class AllTest(unittest.TestCase): names = {} with support.check_warnings( (".* (module|package)", DeprecationWarning), + (".* (module|package)", PendingDeprecationWarning), ("", ResourceWarning), quiet=True): try: diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py index ab4e2479..cda0ee91 100644 --- a/Lib/test/test__locale.py +++ b/Lib/test/test__locale.py @@ -30,7 +30,7 @@ def setUpModule(): global candidate_locales # Issue #13441: Skip some locales (e.g. cs_CZ and hu_HU) on Solaris to # workaround a mbstowcs() bug. For example, on Solaris, the hu_HU locale uses - # the locale encoding ISO-8859-2, the thousauds separator is b'\xA0' and it is + # the locale encoding ISO-8859-2, the thousands separator is b'\xA0' and it is # decoded as U+30000020 (an invalid character) by mbstowcs(). if sys.platform == 'sunos5': old_locale = locale.setlocale(locale.LC_ALL) diff --git a/Lib/test/test__xxsubinterpreters.py b/Lib/test/test__xxsubinterpreters.py index f14868ad..7aec021f 100644 --- a/Lib/test/test__xxsubinterpreters.py +++ b/Lib/test/test__xxsubinterpreters.py @@ -19,12 +19,6 @@ interpreters = support.import_module('_xxsubinterpreters') ################################## # helpers -def powerset(*sets): - return itertools.chain.from_iterable( - combinations(sets, r) - for r in range(len(sets)+1)) - - def _captured_script(script): r, w = os.pipe() indented = script.replace('\n', '\n ') @@ -90,14 +84,6 @@ def _run_interp(id, source, shared, _mainns={}): interpreters.run_string(id, source, shared) -def run_interp_threaded(id, source, **shared): - def run(): - _run(id, source, shared) - t = threading.Thread(target=run) - t.start() - t.join() - - class Interpreter(namedtuple('Interpreter', 'name id')): @classmethod @@ -789,12 +775,6 @@ class RunStringTests(TestBase): self._fs.close() super().tearDown() - @property - def fs(self): - if self._fs is None: - self._fs = FSFixture(self) - return self._fs - def test_success(self): script, file = _captured_script('print("it worked!", end="")') with file: @@ -817,6 +797,7 @@ class RunStringTests(TestBase): self.assertEqual(out, 'it worked!') def test_create_thread(self): + subinterp = interpreters.create(isolated=False) script, file = _captured_script(""" import threading def f(): @@ -827,7 +808,7 @@ class RunStringTests(TestBase): t.join() """) with file: - interpreters.run_string(self.id, script) + interpreters.run_string(subinterp, script) out = file.read() self.assertEqual(out, 'it worked!') @@ -1210,6 +1191,185 @@ class ChannelTests(TestBase): self.assertEqual(cid2, int(cid1) + 1) + def test_channel_list_interpreters_none(self): + """Test listing interpreters for a channel with no associations.""" + # Test for channel with no associated interpreters. + cid = interpreters.channel_create() + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(send_interps, []) + self.assertEqual(recv_interps, []) + + def test_channel_list_interpreters_basic(self): + """Test basic listing channel interpreters.""" + interp0 = interpreters.get_main() + cid = interpreters.channel_create() + interpreters.channel_send(cid, "send") + # Test for a channel that has one end associated to an interpreter. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(send_interps, [interp0]) + self.assertEqual(recv_interps, []) + + interp1 = interpreters.create() + _run_output(interp1, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + # Test for channel that has boths ends associated to an interpreter. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(send_interps, [interp0]) + self.assertEqual(recv_interps, [interp1]) + + def test_channel_list_interpreters_multiple(self): + """Test listing interpreters for a channel with many associations.""" + interp0 = interpreters.get_main() + interp1 = interpreters.create() + interp2 = interpreters.create() + interp3 = interpreters.create() + cid = interpreters.channel_create() + + interpreters.channel_send(cid, "send") + _run_output(interp1, dedent(f""" + import _xxsubinterpreters as _interpreters + _interpreters.channel_send({cid}, "send") + """)) + _run_output(interp2, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + _run_output(interp3, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(set(send_interps), {interp0, interp1}) + self.assertEqual(set(recv_interps), {interp2, interp3}) + + def test_channel_list_interpreters_destroyed(self): + """Test listing channel interpreters with a destroyed interpreter.""" + interp0 = interpreters.get_main() + interp1 = interpreters.create() + cid = interpreters.channel_create() + interpreters.channel_send(cid, "send") + _run_output(interp1, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + # Should be one interpreter associated with each end. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(send_interps, [interp0]) + self.assertEqual(recv_interps, [interp1]) + + interpreters.destroy(interp1) + # Destroyed interpreter should not be listed. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(send_interps, [interp0]) + self.assertEqual(recv_interps, []) + + def test_channel_list_interpreters_released(self): + """Test listing channel interpreters with a released channel.""" + # Set up one channel with main interpreter on the send end and two + # subinterpreters on the receive end. + interp0 = interpreters.get_main() + interp1 = interpreters.create() + interp2 = interpreters.create() + cid = interpreters.channel_create() + interpreters.channel_send(cid, "data") + _run_output(interp1, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + interpreters.channel_send(cid, "data") + _run_output(interp2, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + # Check the setup. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(send_interps), 1) + self.assertEqual(len(recv_interps), 2) + + # Release the main interpreter from the send end. + interpreters.channel_release(cid, send=True) + # Send end should have no associated interpreters. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(send_interps), 0) + self.assertEqual(len(recv_interps), 2) + + # Release one of the subinterpreters from the receive end. + _run_output(interp2, dedent(f""" + import _xxsubinterpreters as _interpreters + _interpreters.channel_release({cid}) + """)) + # Receive end should have the released interpreter removed. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(send_interps), 0) + self.assertEqual(recv_interps, [interp1]) + + def test_channel_list_interpreters_closed(self): + """Test listing channel interpreters with a closed channel.""" + interp0 = interpreters.get_main() + interp1 = interpreters.create() + cid = interpreters.channel_create() + # Put something in the channel so that it's not empty. + interpreters.channel_send(cid, "send") + + # Check initial state. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(send_interps), 1) + self.assertEqual(len(recv_interps), 0) + + # Force close the channel. + interpreters.channel_close(cid, force=True) + # Both ends should raise an error. + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=True) + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=False) + + def test_channel_list_interpreters_closed_send_end(self): + """Test listing channel interpreters with a channel's send end closed.""" + interp0 = interpreters.get_main() + interp1 = interpreters.create() + cid = interpreters.channel_create() + # Put something in the channel so that it's not empty. + interpreters.channel_send(cid, "send") + + # Check initial state. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(send_interps), 1) + self.assertEqual(len(recv_interps), 0) + + # Close the send end of the channel. + interpreters.channel_close(cid, send=True) + # Send end should raise an error. + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=True) + # Receive end should not be closed (since channel is not empty). + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(recv_interps), 0) + + # Close the receive end of the channel from a subinterpreter. + _run_output(interp1, dedent(f""" + import _xxsubinterpreters as _interpreters + _interpreters.channel_close({cid}, force=True) + """)) + # Both ends should raise an error. + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=True) + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=False) + #################### def test_send_recv_main(self): @@ -1305,6 +1465,27 @@ class ChannelTests(TestBase): with self.assertRaises(interpreters.ChannelEmptyError): interpreters.channel_recv(cid) + def test_recv_default(self): + default = object() + cid = interpreters.channel_create() + obj1 = interpreters.channel_recv(cid, default) + interpreters.channel_send(cid, None) + interpreters.channel_send(cid, 1) + interpreters.channel_send(cid, b'spam') + interpreters.channel_send(cid, b'eggs') + obj2 = interpreters.channel_recv(cid, default) + obj3 = interpreters.channel_recv(cid, default) + obj4 = interpreters.channel_recv(cid) + obj5 = interpreters.channel_recv(cid, default) + obj6 = interpreters.channel_recv(cid, default) + + self.assertIs(obj1, default) + self.assertIs(obj2, None) + self.assertEqual(obj3, 1) + self.assertEqual(obj4, b'spam') + self.assertEqual(obj5, b'eggs') + self.assertIs(obj6, default) + def test_run_string_arg_unresolved(self): cid = interpreters.channel_create() interp = interpreters.create() @@ -1522,6 +1703,23 @@ class ChannelTests(TestBase): with self.assertRaises(interpreters.ChannelClosedError): interpreters.channel_recv(cid) + def test_channel_list_interpreters_invalid_channel(self): + cid = interpreters.channel_create() + # Test for invalid channel ID. + with self.assertRaises(interpreters.ChannelNotFoundError): + interpreters.channel_list_interpreters(1000, send=True) + + interpreters.channel_close(cid) + # Test for a channel that has been closed. + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=True) + + def test_channel_list_interpreters_invalid_args(self): + # Tests for invalid arguments passed to the API. + cid = interpreters.channel_create() + with self.assertRaises(TypeError): + interpreters.channel_list_interpreters(cid) + class ChannelReleaseTests(TestBase): diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py index 9f5afb24..7e9c47b3 100644 --- a/Lib/test/test_abc.py +++ b/Lib/test/test_abc.py @@ -149,6 +149,25 @@ def test_factory(abc_ABCMeta, abc_get_cache_token): self.assertEqual(D.foo(), 4) self.assertEqual(D().foo(), 4) + def test_object_new_with_one_abstractmethod(self): + class C(metaclass=abc_ABCMeta): + @abc.abstractmethod + def method_one(self): + pass + msg = r"class C with abstract method method_one" + self.assertRaisesRegex(TypeError, msg, C) + + def test_object_new_with_many_abstractmethods(self): + class C(metaclass=abc_ABCMeta): + @abc.abstractmethod + def method_one(self): + pass + @abc.abstractmethod + def method_two(self): + pass + msg = r"class C with abstract methods method_one, method_two" + self.assertRaisesRegex(TypeError, msg, C) + def test_abstractmethod_integration(self): for abstractthing in [abc.abstractmethod, abc.abstractproperty, abc.abstractclassmethod, @@ -307,7 +326,7 @@ def test_factory(abc_ABCMeta, abc_get_cache_token): token_old = abc_get_cache_token() A.register(B) token_new = abc_get_cache_token() - self.assertNotEqual(token_old, token_new) + self.assertGreater(token_new, token_old) self.assertTrue(isinstance(b, A)) self.assertTrue(isinstance(b, (A,))) diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py index c7475841..5a95099c 100644 --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -143,13 +143,12 @@ class AifcALAWTest(AifcTest, unittest.TestCase): frames = byteswap(frames, 2) -class AifcMiscTest(audiotests.AudioMiscTests, unittest.TestCase): - module = aifc - +class AifcMiscTest(unittest.TestCase): def test_skipunknown(self): #Issue 2245 #This file contains chunk types aifc doesn't recognize. - self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif')) + f = aifc.open(findfile('Sine-1000Hz-300ms.aif')) + f.close() def test_close_opened_files_on_error(self): non_aifc_file = findfile('pluck-pcm8.wav', subdir='audiodata') @@ -172,7 +171,8 @@ class AifcMiscTest(audiotests.AudioMiscTests, unittest.TestCase): f.setparams((1, 1, 1, 1, b'NONE', b'')) f.close() - f = self.f = aifc.open(TESTFN, 'rb') + f = aifc.open(TESTFN, 'rb') + self.addCleanup(f.close) params = f.getparams() self.assertEqual(params.nchannels, f.getnchannels()) self.assertEqual(params.sampwidth, f.getsampwidth()) @@ -208,7 +208,8 @@ class AifcMiscTest(audiotests.AudioMiscTests, unittest.TestCase): fout.setmark(2, 0, b'even') fout.writeframes(b'\x00') fout.close() - f = self.f = aifc.open(TESTFN, 'rb') + f = aifc.open(TESTFN, 'rb') + self.addCleanup(f.close) self.assertEqual(f.getmarkers(), [(1, 0, b'odd'), (2, 0, b'even')]) self.assertEqual(f.getmark(1), (1, 0, b'odd')) self.assertEqual(f.getmark(2), (2, 0, b'even')) diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 0753a4b5..22cae626 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -105,7 +105,8 @@ def stderr_to_parser_error(parse_args, *args, **kwargs): code = sys.exc_info()[1].code stdout = sys.stdout.getvalue() stderr = sys.stderr.getvalue() - raise ArgumentParserError("SystemExit", stdout, stderr, code) + raise ArgumentParserError( + "SystemExit", stdout, stderr, code) from None finally: sys.stdout = old_stdout sys.stderr = old_stderr @@ -686,6 +687,38 @@ class TestOptionalsActionStoreTrue(ParserTestCase): ('--apple', NS(apple=True)), ] +class TestBooleanOptionalAction(ParserTestCase): + """Tests BooleanOptionalAction""" + + argument_signatures = [Sig('--foo', action=argparse.BooleanOptionalAction)] + failures = ['--foo bar', '--foo=bar'] + successes = [ + ('', NS(foo=None)), + ('--foo', NS(foo=True)), + ('--no-foo', NS(foo=False)), + ('--foo --no-foo', NS(foo=False)), # useful for aliases + ('--no-foo --foo', NS(foo=True)), + ] + + def test_const(self): + # See bpo-40862 + parser = argparse.ArgumentParser() + with self.assertRaises(TypeError) as cm: + parser.add_argument('--foo', const=True, action=argparse.BooleanOptionalAction) + + self.assertIn("got an unexpected keyword argument 'const'", str(cm.exception)) + +class TestBooleanOptionalActionRequired(ParserTestCase): + """Tests BooleanOptionalAction required""" + + argument_signatures = [ + Sig('--foo', required=True, action=argparse.BooleanOptionalAction) + ] + failures = [''] + successes = [ + ('--foo', NS(foo=True)), + ('--no-foo', NS(foo=False)), + ] class TestOptionalsActionAppend(ParserTestCase): """Tests the append action for an Optional""" @@ -2176,7 +2209,7 @@ class TestAddSubparsers(TestCase): def test_subparser2_help(self): self._test_subparser_help('5.0 2 -h', textwrap.dedent('''\ - usage: PROG bar 2 [-h] [-y {1,2,3}] [z [z ...]] + usage: PROG bar 2 [-h] [-y {1,2,3}] [z ...] 2 description @@ -2710,10 +2743,10 @@ class TestMutuallyExclusiveOptionalAndPositional(MEMixin, TestCase): ] usage_when_not_required = '''\ - usage: PROG [-h] [--foo | --spam SPAM | badger [badger ...]] + usage: PROG [-h] [--foo | --spam SPAM | badger ...] ''' usage_when_required = '''\ - usage: PROG [-h] (--foo | --spam SPAM | badger [badger ...]) + usage: PROG [-h] (--foo | --spam SPAM | badger ...) ''' help = '''\ @@ -3493,6 +3526,10 @@ class TestHelpUsage(HelpTestCase): Sig('a', help='a'), Sig('b', help='b', nargs=2), Sig('c', help='c', nargs='?'), + Sig('--foo', help='Whether to foo', action=argparse.BooleanOptionalAction), + Sig('--bar', help='Whether to bar', default=True, + action=argparse.BooleanOptionalAction), + Sig('-f', '--foobar', '--barfoo', action=argparse.BooleanOptionalAction), ] argument_group_signatures = [ (Sig('group'), [ @@ -3503,26 +3540,32 @@ class TestHelpUsage(HelpTestCase): ]) ] usage = '''\ - usage: PROG [-h] [-w W [W ...]] [-x [X [X ...]]] [-y [Y]] [-z Z Z Z] - a b b [c] [d [d ...]] e [e ...] + usage: PROG [-h] [-w W [W ...]] [-x [X ...]] [--foo | --no-foo] + [--bar | --no-bar] + [-f | --foobar | --no-foobar | --barfoo | --no-barfoo] [-y [Y]] + [-z Z Z Z] + a b b [c] [d ...] e [e ...] ''' help = usage + '''\ positional arguments: - a a - b b - c c + a a + b b + c c optional arguments: - -h, --help show this help message and exit - -w W [W ...] w - -x [X [X ...]] x + -h, --help show this help message and exit + -w W [W ...] w + -x [X ...] x + --foo, --no-foo Whether to foo + --bar, --no-bar Whether to bar (default: True) + -f, --foobar, --no-foobar, --barfoo, --no-barfoo group: - -y [Y] y - -z Z Z Z z - d d - e e + -y [Y] y + -z Z Z Z z + d d + e e ''' version = '' @@ -4690,7 +4733,7 @@ class TestStrings(TestCase): def test_namespace(self): ns = argparse.Namespace(foo=42, bar='spam') - string = "Namespace(bar='spam', foo=42)" + string = "Namespace(foo=42, bar='spam')" self.assertStringEqual(ns, string) def test_namespace_starkwargs_notidentifier(self): @@ -5116,7 +5159,7 @@ class TestAddArgumentMetavar(TestCase): self.do_test_exception(nargs="*", metavar=tuple()) def test_nargs_zeroormore_metavar_length1(self): - self.do_test_exception(nargs="*", metavar=("1",)) + self.do_test_no_exception(nargs="*", metavar=("1",)) def test_nargs_zeroormore_metavar_length2(self): self.do_test_no_exception(nargs="*", metavar=("1", "2")) @@ -5299,6 +5342,21 @@ class TestWrappingMetavar(TestCase): ''')) +class TestExitOnError(TestCase): + + def setUp(self): + self.parser = argparse.ArgumentParser(exit_on_error=False) + self.parser.add_argument('--integers', metavar='N', type=int) + + def test_exit_on_error_with_good_args(self): + ns = self.parser.parse_args('--integers 4'.split()) + self.assertEqual(ns, argparse.Namespace(integers=4)) + + def test_exit_on_error_with_bad_args(self): + with self.assertRaises(argparse.ArgumentError): + self.parser.parse_args('--integers a'.split()) + + def test_main(): support.run_unittest(__name__) # Remove global references to avoid looking like we have refleaks. diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index c2439579..f731b704 100644 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -10,7 +10,6 @@ import pickle import operator import struct import sys -import warnings import array from array import _array_reconstructor as array_reconstructor @@ -426,26 +425,6 @@ class BaseTest: b.fromlist(a.tolist()) self.assertEqual(a, b) - def test_tofromstring(self): - # Warnings not raised when arguments are incorrect as Argument Clinic - # handles that before the warning can be raised. - nb_warnings = 2 - with warnings.catch_warnings(record=True) as r: - warnings.filterwarnings("always", - message=r"(to|from)string\(\) is deprecated", - category=DeprecationWarning) - a = array.array(self.typecode, 2*self.example) - b = array.array(self.typecode) - self.assertRaises(TypeError, a.tostring, 42) - self.assertRaises(TypeError, b.fromstring) - self.assertRaises(TypeError, b.fromstring, 42) - b.fromstring(a.tostring()) - self.assertEqual(a, b) - if a.itemsize>1: - self.assertRaises(ValueError, b.fromstring, "x") - nb_warnings += 1 - self.assertEqual(len(r), nb_warnings) - def test_tofrombytes(self): a = array.array(self.typecode, 2*self.example) b = array.array(self.typecode) diff --git a/Lib/test/test_asdl_parser.py b/Lib/test/test_asdl_parser.py index 9eaceecd..2c14817a 100644 --- a/Lib/test/test_asdl_parser.py +++ b/Lib/test/test_asdl_parser.py @@ -63,10 +63,10 @@ class TestAsdlParser(unittest.TestCase): def test_attributes(self): stmt = self.types['stmt'] self.assertEqual(len(stmt.attributes), 4) - self.assertEqual(str(stmt.attributes[0]), 'Field(int, lineno)') - self.assertEqual(str(stmt.attributes[1]), 'Field(int, col_offset)') - self.assertEqual(str(stmt.attributes[2]), 'Field(int, end_lineno, opt=True)') - self.assertEqual(str(stmt.attributes[3]), 'Field(int, end_col_offset, opt=True)') + self.assertEqual(repr(stmt.attributes[0]), 'Field(int, lineno)') + self.assertEqual(repr(stmt.attributes[1]), 'Field(int, col_offset)') + self.assertEqual(repr(stmt.attributes[2]), 'Field(int, end_lineno, opt=True)') + self.assertEqual(repr(stmt.attributes[3]), 'Field(int, end_col_offset, opt=True)') def test_constructor_fields(self): ehandler = self.types['excepthandler'] @@ -118,7 +118,7 @@ class TestAsdlParser(unittest.TestCase): v = CustomVisitor() v.visit(self.types['mod']) self.assertEqual(v.names_with_seq, - ['Module', 'Module', 'Interactive', 'FunctionType', 'Suite']) + ['Module', 'Module', 'Interactive', 'FunctionType']) if __name__ == '__main__': diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index c625e693..5f57ce87 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -1,7 +1,9 @@ import ast +import builtins import dis import os import sys +import types import unittest import warnings import weakref @@ -17,6 +19,8 @@ def to_tuple(t): result = [t.__class__.__name__] if hasattr(t, 'lineno') and hasattr(t, 'col_offset'): result.append((t.lineno, t.col_offset)) + if hasattr(t, 'end_lineno') and hasattr(t, 'end_col_offset'): + result[-1] += (t.end_lineno, t.end_col_offset) if t._fields is None: return tuple(result) for f in t._fields: @@ -245,6 +249,13 @@ eval_tests = [ class AST_Tests(unittest.TestCase): + def _is_ast_node(self, name, node): + if not isinstance(node, type): + return False + if "ast" not in node.__module__: + return False + return name != 'AST' and name[0].isupper() + def _assertTrueorder(self, ast_node, parent_pos): if not isinstance(ast_node, ast.AST) or ast_node._fields is None: return @@ -274,7 +285,7 @@ class AST_Tests(unittest.TestCase): x.vararg with self.assertRaises(TypeError): - # "_ast.AST constructor takes 0 positional arguments" + # "ast.AST constructor takes 0 positional arguments" ast.AST(2) def test_AST_garbage_collection(self): @@ -333,7 +344,11 @@ class AST_Tests(unittest.TestCase): def test_field_attr_existence(self): for name, item in ast.__dict__.items(): - if isinstance(item, type) and name != 'AST' and name[0].isupper(): + if self._is_ast_node(name, item): + if name == 'Index': + # Index(value) just returns value now. + # The argument is required. + continue x = item() if isinstance(x, ast.AST): self.assertEqual(type(x._fields), tuple) @@ -344,9 +359,11 @@ class AST_Tests(unittest.TestCase): 'kw_defaults', 'kwarg', 'defaults')) with self.assertRaises(AttributeError): - x.vararg + x.args + self.assertIsNone(x.vararg) x = ast.arguments(*range(1, 8)) + self.assertEqual(x.args, 2) self.assertEqual(x.vararg, 3) def test_field_attr_writable(self): @@ -567,22 +584,31 @@ class AST_Tests(unittest.TestCase): m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], []) with self.assertRaises(TypeError) as cm: compile(m, "", "exec") - self.assertIn("but got <_ast.expr", str(cm.exception)) + self.assertIn("but got ", "exec") self.assertIn("identifier must be of type str", str(cm.exception)) + def test_invalid_constant(self): + for invalid_constant in int, (1, 2, int), frozenset((1, 2, int)): + e = ast.Expression(body=ast.Constant(invalid_constant)) + ast.fix_missing_locations(e) + with self.assertRaisesRegex( + TypeError, "invalid type in Constant: type" + ): + compile(e, "", "eval") + def test_empty_yield_from(self): # Issue 16546: yield from value is not optional. empty_yield_from = ast.parse("def f():\n yield from g()") empty_yield_from.body[0].body[0].value.value = None with self.assertRaises(ValueError) as cm: compile(empty_yield_from, "", "exec") - self.assertIn("field value is required", str(cm.exception)) + self.assertIn("field 'value' is required", str(cm.exception)) @support.cpython_only def test_issue31592(self): @@ -630,6 +656,15 @@ class AST_Tests(unittest.TestCase): attr_b = tree.body[0].decorator_list[0].value self.assertEqual(attr_b.end_col_offset, 4) + def test_ast_asdl_signature(self): + self.assertEqual(ast.withitem.__doc__, "withitem(expr context_expr, expr? optional_vars)") + self.assertEqual(ast.GtE.__doc__, "GtE") + self.assertEqual(ast.Name.__doc__, "Name(identifier id, expr_context ctx)") + self.assertEqual(ast.cmpop.__doc__, "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn") + expressions = [f" | {node.__doc__}" for node in ast.expr.__subclasses__()] + expressions[0] = f"expr = {ast.expr.__subclasses__()[0].__doc__}" + self.assertCountEqual(ast.expr.__doc__.split("\n"), expressions) + def test_issue40614_feature_version(self): ast.parse('f"{x=}"', feature_version=(3, 8)) with self.assertRaises(SyntaxError): @@ -663,23 +698,84 @@ class ASTHelpers_Test(unittest.TestCase): node = ast.parse('spam(eggs, "and cheese")') self.assertEqual(ast.dump(node), "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), " - "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], " + "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')], " "keywords=[]))], type_ignores=[])" ) self.assertEqual(ast.dump(node, annotate_fields=False), "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), " - "Constant('and cheese', None)], []))], [])" + "Constant('and cheese')], []))], [])" ) self.assertEqual(ast.dump(node, include_attributes=True), "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), " "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, " - "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, " + "end_lineno=1, end_col_offset=9), Constant(value='and cheese', " "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])" ) + def test_dump_indent(self): + node = ast.parse('spam(eggs, "and cheese")') + self.assertEqual(ast.dump(node, indent=3), """\ +Module( + body=[ + Expr( + value=Call( + func=Name(id='spam', ctx=Load()), + args=[ + Name(id='eggs', ctx=Load()), + Constant(value='and cheese')], + keywords=[]))], + type_ignores=[])""") + self.assertEqual(ast.dump(node, annotate_fields=False, indent='\t'), """\ +Module( +\t[ +\t\tExpr( +\t\t\tCall( +\t\t\t\tName('spam', Load()), +\t\t\t\t[ +\t\t\t\t\tName('eggs', Load()), +\t\t\t\t\tConstant('and cheese')], +\t\t\t\t[]))], +\t[])""") + self.assertEqual(ast.dump(node, include_attributes=True, indent=3), """\ +Module( + body=[ + Expr( + value=Call( + func=Name( + id='spam', + ctx=Load(), + lineno=1, + col_offset=0, + end_lineno=1, + end_col_offset=4), + args=[ + Name( + id='eggs', + ctx=Load(), + lineno=1, + col_offset=5, + end_lineno=1, + end_col_offset=9), + Constant( + value='and cheese', + lineno=1, + col_offset=11, + end_lineno=1, + end_col_offset=23)], + keywords=[], + lineno=1, + col_offset=0, + end_lineno=1, + end_col_offset=24), + lineno=1, + col_offset=0, + end_lineno=1, + end_col_offset=24)], + type_ignores=[])""") + def test_dump_incomplete(self): node = ast.Raise(lineno=3, col_offset=4) self.assertEqual(ast.dump(node), @@ -713,16 +809,13 @@ class ASTHelpers_Test(unittest.TestCase): src = ast.parse('1 + 1', mode='eval') src.body.right = ast.copy_location(ast.Num(2), src.body.right) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, ' + 'Expression(body=BinOp(left=Constant(value=1, lineno=1, col_offset=0, ' 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, ' 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, ' 'col_offset=0, end_lineno=1, end_col_offset=5))' ) src = ast.Call(col_offset=1, lineno=1, end_lineno=1, end_col_offset=1) - new = ast.copy_location(src, ast.Call( - col_offset=None, lineno=None, - end_lineno=None, end_col_offset=None - )) + new = ast.copy_location(src, ast.Call(col_offset=None, lineno=None)) self.assertIsNone(new.end_lineno) self.assertIsNone(new.end_col_offset) self.assertEqual(new.lineno, 1) @@ -737,7 +830,7 @@ class ASTHelpers_Test(unittest.TestCase): self.assertEqual(ast.dump(src, include_attributes=True), "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), " - "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, " + "args=[Constant(value='spam', lineno=1, col_offset=6, end_lineno=1, " "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, " "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, " "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), " @@ -752,8 +845,8 @@ class ASTHelpers_Test(unittest.TestCase): src = ast.parse('1 + 1', mode='eval') self.assertEqual(ast.increment_lineno(src, n=3), src) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, ' - 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, ' + 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, ' + 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, ' 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, ' 'col_offset=0, end_lineno=4, end_col_offset=5))' ) @@ -761,14 +854,13 @@ class ASTHelpers_Test(unittest.TestCase): src = ast.parse('1 + 1', mode='eval') self.assertEqual(ast.increment_lineno(src.body, n=3), src.body) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, ' - 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, ' + 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, ' + 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, ' 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, ' 'col_offset=0, end_lineno=4, end_col_offset=5))' ) src = ast.Call( - func=ast.Name("test", ast.Load()), args=[], keywords=[], - lineno=1, end_lineno=None + func=ast.Name("test", ast.Load()), args=[], keywords=[], lineno=1 ) self.assertEqual(ast.increment_lineno(src).lineno, 2) self.assertIsNone(ast.increment_lineno(src).end_lineno) @@ -787,7 +879,7 @@ class ASTHelpers_Test(unittest.TestCase): self.assertEqual(next(iterator).value, 23) self.assertEqual(next(iterator).value, 42) self.assertEqual(ast.dump(next(iterator)), - "keyword(arg='eggs', value=Constant(value='leek', kind=None))" + "keyword(arg='eggs', value=Constant(value='leek'))" ) def test_get_docstring(self): @@ -873,6 +965,7 @@ class ASTHelpers_Test(unittest.TestCase): self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None)) self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3}) self.assertEqual(ast.literal_eval('b"hi"'), b"hi") + self.assertEqual(ast.literal_eval('set()'), set()) self.assertRaises(ValueError, ast.literal_eval, 'foo()') self.assertEqual(ast.literal_eval('6'), 6) self.assertEqual(ast.literal_eval('+6'), 6) @@ -1278,11 +1371,11 @@ class ASTValidatorTests(unittest.TestCase): self.expr(attr, "must have Load context") def test_subscript(self): - sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)), + sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Num(3), ast.Load()) self.expr(sub, "must have Load context") x = ast.Name("x", ast.Load()) - sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())), + sub = ast.Subscript(x, ast.Name("y", ast.Store()), ast.Load()) self.expr(sub, "must have Load context") s = ast.Name("x", ast.Store()) @@ -1290,9 +1383,9 @@ class ASTValidatorTests(unittest.TestCase): sl = ast.Slice(*args) self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context") - sl = ast.ExtSlice([]) - self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice") - sl = ast.ExtSlice([ast.Index(s)]) + sl = ast.Tuple([], ast.Load()) + self.expr(ast.Subscript(x, sl, ast.Load())) + sl = ast.Tuple([s], ast.Load()) self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context") def test_starred(self): @@ -1634,11 +1727,11 @@ class EndPositionTests(unittest.TestCase): ''').strip() i1, i2, im = map(self._parse_value, (s1, s2, sm)) self._check_content(s1, i1.value, 'f()[1, 2]') - self._check_content(s1, i1.value.slice.value, '1, 2') + self._check_content(s1, i1.value.slice, '1, 2') self._check_content(s2, i2.slice.lower, 'a.b') self._check_content(s2, i2.slice.upper, 'c.d') - self._check_content(sm, im.slice.dims[0].upper, 'f ()') - self._check_content(sm, im.slice.dims[1].lower, 'g ()') + self._check_content(sm, im.slice.elts[0].upper, 'f ()') + self._check_content(sm, im.slice.elts[1].lower, 'g ()') self._check_end_pos(im, 3, 3) def test_binop(self): @@ -1792,6 +1885,17 @@ class EndPositionTests(unittest.TestCase): cdef = ast.parse(s).body[0] self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method) + def test_source_segment_missing_info(self): + s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\r\n' + v, w, x, y = ast.parse(s).body + del v.lineno + del w.end_lineno + del x.col_offset + del y.end_col_offset + self.assertIsNone(ast.get_source_segment(s, v)) + self.assertIsNone(ast.get_source_segment(s, w)) + self.assertIsNone(ast.get_source_segment(s, x)) + self.assertIsNone(ast.get_source_segment(s, y)) class NodeVisitorTests(unittest.TestCase): def test_old_constant_nodes(self): @@ -1819,7 +1923,7 @@ class NodeVisitorTests(unittest.TestCase): visitor = Visitor() log = [] with warnings.catch_warnings(record=True) as wlog: - warnings.filterwarnings('always', '', PendingDeprecationWarning) + warnings.filterwarnings('always', '', DeprecationWarning) visitor.visit(mod) self.assertEqual(log, [ (1, 'Num', 42), @@ -1843,6 +1947,88 @@ class NodeVisitorTests(unittest.TestCase): ]) +@support.cpython_only +class ModuleStateTests(unittest.TestCase): + # bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. + + def check_ast_module(self): + # Check that the _ast module still works as expected + code = 'x + 1' + filename = '' + mode = 'eval' + + # Create _ast.AST subclasses instances + ast_tree = compile(code, filename, mode, flags=ast.PyCF_ONLY_AST) + + # Call PyAST_Check() + code = compile(ast_tree, filename, mode) + self.assertIsInstance(code, types.CodeType) + + def test_reload_module(self): + # bpo-41194: Importing the _ast module twice must not crash. + with support.swap_item(sys.modules, '_ast', None): + del sys.modules['_ast'] + import _ast as ast1 + + del sys.modules['_ast'] + import _ast as ast2 + + self.check_ast_module() + + # Unloading the two _ast module instances must not crash. + del ast1 + del ast2 + support.gc_collect() + + self.check_ast_module() + + def test_sys_modules(self): + # bpo-41631: Test reproducing a Mercurial crash when PyAST_Check() + # imported the _ast module internally. + lazy_mod = object() + + def my_import(name, *args, **kw): + sys.modules[name] = lazy_mod + return lazy_mod + + with support.swap_item(sys.modules, '_ast', None): + del sys.modules['_ast'] + + with support.swap_attr(builtins, '__import__', my_import): + # Test that compile() does not import the _ast module + self.check_ast_module() + self.assertNotIn('_ast', sys.modules) + + # Sanity check of the test itself + import _ast + self.assertIs(_ast, lazy_mod) + + def test_subinterpreter(self): + # bpo-41631: Importing and using the _ast module in a subinterpreter + # must not crash. + code = dedent(''' + import _ast + import ast + import gc + import sys + import types + + # Create _ast.AST subclasses instances and call PyAST_Check() + ast_tree = compile('x+1', '', 'eval', + flags=ast.PyCF_ONLY_AST) + code = compile(ast_tree, 'string', 'eval') + if not isinstance(code, types.CodeType): + raise AssertionError + + # Unloading the _ast module must not crash. + del ast, _ast + del sys.modules['ast'], sys.modules['_ast'] + gc.collect() + ''') + res = support.run_in_subinterp(code) + self.assertEqual(res, 0) + + def main(): if __name__ != '__main__': return @@ -1860,112 +2046,112 @@ def main(): #### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g ##### exec_results = [ -('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []), -('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring', None))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, [('Constant', (1, 8), 0, None)]), [('Pass', (1, 12))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8), 'kwargs', None, None), []), [('Pass', (1, 17))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None), ('arg', (1, 9), 'b', None, None), ('arg', (1, 14), 'c', None, None), ('arg', (1, 22), 'd', None, None), ('arg', (1, 28), 'e', None, None)], ('arg', (1, 35), 'args', None, None), [('arg', (1, 41), 'f', None, None)], [('Constant', (1, 43), 42, None)], ('arg', (1, 49), 'kwargs', None, None), [('Constant', (1, 11), 1, None), ('Constant', (1, 16), None, None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Expr', (1, 58), ('Constant', (1, 58), 'doc for f()', None))], [], None, None)], []), -('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []), -('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []), -('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8), ('Constant', (1, 15), 1, None))], [], None, None)], []), -('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []), -('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []), -('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []), -('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []), -('Module', [('Assign', (1, 0), [('List', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []), -('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []), -('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [])])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [('Pass', (6, 2))])])], []), -('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []), -('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',))), ('withitem', ('Name', (1, 13), 'z', ('Load',)), ('Name', (1, 18), 'q', ('Store',)))], [('Pass', (1, 21))], None)], []), -('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Constant', (1, 16), 'string', None)], []), None)], []), -('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []), -('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []), -('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []), -('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []), -('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []), -('Module', [('Global', (1, 0), ['v'])], []), -('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []), -('Module', [('Pass', (1, 0))], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []), -('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 4), 'a', ('Store',)), ('Name', (1, 6), 'b', ('Store',))], ('Store',)), ('Name', (1, 11), 'c', ('Load',)), [('Pass', (1, 14))], [], None)], []), -('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []), -('Module', [('For', (1, 0), ('List', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []), -('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 0), ('Tuple', (2, 4), [('Name', (3, 4), 'Aa', ('Load',)), ('Name', (5, 7), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4), [('Name', (8, 4), 'Aa', ('Store',)), ('Name', (10, 4), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10), 'Cc', ('Load',)), [], 0)]))], []), -('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Name', (1, 11), 'w', ('Store',)), ('Name', (1, 16), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22), 'm', ('Store',)), ('Name', (1, 27), 'p', ('Load',)), [('Name', (1, 32), 'g', ('Load',))], 0)]))], []), -('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'v', ('Store',)), ('Name', (1, 13), 'w', ('Store',))], ('Store',)), ('Name', (1, 18), 'x', ('Load',)), [], 0)]))], []), -('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 12), 'x', ('Load',)), [('Name', (1, 17), 'g', ('Load',))], 0)]))], []), -('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7), [('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 9), 'm', ('Store',))], ('Store',)), ('Name', (1, 14), 'x', ('Load',)), [], 0)]))], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1), ('Constant', (2, 1), 'async function', None)), ('Expr', (3, 1), ('Await', (3, 1), ('Call', (3, 7), ('Name', (3, 7), 'something', ('Load',)), [], [])))], [], None, None)], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1), ('Name', (2, 11), 'e', ('Store',)), ('Name', (2, 16), 'i', ('Load',)), [('Expr', (2, 19), ('Constant', (2, 19), 1, None))], [('Expr', (3, 7), ('Constant', (3, 7), 2, None))], None)], [], None, None)], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1), [('withitem', ('Name', (2, 12), 'a', ('Load',)), ('Name', (2, 17), 'b', ('Store',)))], [('Expr', (2, 20), ('Constant', (2, 20), 1, None))], None)], [], None, None)], []), -('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Constant', (1, 10), 2, None)], [('Dict', (1, 3), [('Constant', (1, 4), 1, None)], [('Constant', (1, 6), 2, None)]), ('Constant', (1, 12), 3, None)]))], []), -('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1, None), ('Constant', (1, 6), 2, None)]), ('Load',)), ('Constant', (1, 10), 3, None)]))], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1), ('ListComp', (2, 1), ('Name', (2, 2), 'i', ('Load',)), [('comprehension', ('Name', (2, 14), 'b', ('Store',)), ('Name', (2, 19), 'c', ('Load',)), [], 1)]))], [], None, None)], []), -('Module', [('FunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []), -('Module', [('AsyncFunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []), -('Module', [('ClassDef', (4, 0), 'C', [], [], [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])])], []), -('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9))], [('Call', (1, 1), ('Name', (1, 1), 'deco', ('Load',)), [('GeneratorExp', (1, 5), ('Name', (1, 6), 'a', ('Load',)), [('comprehension', ('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 17), 'b', ('Load',)), [], 0)])], [])], None, None)], []), -('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9))], [('Attribute', (1, 1), ('Attribute', (1, 1), ('Name', (1, 1), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',))], None, None)], []), -('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None), ('arg', (1, 15), 'd', None, None), ('arg', (1, 18), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], ('arg', (1, 26), 'kwargs', None, None), []), [('Pass', (1, 35))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None), ('arg', (1, 19), 'c', None, None)], None, [], [], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None), ('Constant', (1, 21), 4, None)]), [('Pass', (1, 25))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 28))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 26))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], ('arg', (1, 29), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 38))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], ('arg', (1, 27), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 36))], [], None, None)], []), +('Module', [('Expr', (1, 0, 1, 4), ('Constant', (1, 0, 1, 4), None, None))], []), +('Module', [('Expr', (1, 0, 1, 18), ('Constant', (1, 0, 1, 18), 'module docstring', None))], []), +('Module', [('FunctionDef', (1, 0, 1, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9, 1, 13))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9, 1, 29), ('Constant', (1, 9, 1, 29), 'function docstring', None))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 14), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10, 1, 14))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 0, None)]), [('Pass', (1, 12, 1, 16))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 11), 'args', None, None), [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 21), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8, 1, 14), 'kwargs', None, None), []), [('Pass', (1, 17, 1, 21))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 71), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None), ('arg', (1, 9, 1, 10), 'b', None, None), ('arg', (1, 14, 1, 15), 'c', None, None), ('arg', (1, 22, 1, 23), 'd', None, None), ('arg', (1, 28, 1, 29), 'e', None, None)], ('arg', (1, 35, 1, 39), 'args', None, None), [('arg', (1, 41, 1, 42), 'f', None, None)], [('Constant', (1, 43, 1, 45), 42, None)], ('arg', (1, 49, 1, 55), 'kwargs', None, None), [('Constant', (1, 11, 1, 12), 1, None), ('Constant', (1, 16, 1, 20), None, None), ('List', (1, 24, 1, 26), [], ('Load',)), ('Dict', (1, 30, 1, 32), [], [])]), [('Expr', (1, 58, 1, 71), ('Constant', (1, 58, 1, 71), 'doc for f()', None))], [], None, None)], []), +('Module', [('ClassDef', (1, 0, 1, 12), 'C', [], [], [('Pass', (1, 8, 1, 12))], [])], []), +('Module', [('ClassDef', (1, 0, 1, 32), 'C', [], [], [('Expr', (1, 9, 1, 32), ('Constant', (1, 9, 1, 32), 'docstring for class C', None))], [])], []), +('Module', [('ClassDef', (1, 0, 1, 21), 'C', [('Name', (1, 8, 1, 14), 'object', ('Load',))], [], [('Pass', (1, 17, 1, 21))], [])], []), +('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8, 1, 16), ('Constant', (1, 15, 1, 16), 1, None))], [], None, None)], []), +('Module', [('Delete', (1, 0, 1, 5), [('Name', (1, 4, 1, 5), 'v', ('Del',))])], []), +('Module', [('Assign', (1, 0, 1, 5), [('Name', (1, 0, 1, 1), 'v', ('Store',))], ('Constant', (1, 4, 1, 5), 1, None), None)], []), +('Module', [('Assign', (1, 0, 1, 7), [('Tuple', (1, 0, 1, 3), [('Name', (1, 0, 1, 1), 'a', ('Store',)), ('Name', (1, 2, 1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 6, 1, 7), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0, 1, 9), [('Tuple', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0, 1, 9), [('List', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), +('Module', [('AugAssign', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'v', ('Store',)), ('Add',), ('Constant', (1, 5, 1, 6), 1, None))], []), +('Module', [('For', (1, 0, 1, 15), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Pass', (1, 11, 1, 15))], [], None)], []), +('Module', [('While', (1, 0, 1, 12), ('Name', (1, 6, 1, 7), 'v', ('Load',)), [('Pass', (1, 8, 1, 12))], [])], []), +('Module', [('If', (1, 0, 1, 9), ('Name', (1, 3, 1, 4), 'v', ('Load',)), [('Pass', (1, 5, 1, 9))], [])], []), +('Module', [('If', (1, 0, 4, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 4, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [])])], []), +('Module', [('If', (1, 0, 6, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 6, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [('Pass', (6, 2, 6, 6))])])], []), +('Module', [('With', (1, 0, 1, 17), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',)))], [('Pass', (1, 13, 1, 17))], None)], []), +('Module', [('With', (1, 0, 1, 25), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',))), ('withitem', ('Name', (1, 13, 1, 14), 'z', ('Load',)), ('Name', (1, 18, 1, 19), 'q', ('Store',)))], [('Pass', (1, 21, 1, 25))], None)], []), +('Module', [('Raise', (1, 0, 1, 25), ('Call', (1, 6, 1, 25), ('Name', (1, 6, 1, 15), 'Exception', ('Load',)), [('Constant', (1, 16, 1, 24), 'string', None)], []), None)], []), +('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [('ExceptHandler', (3, 0, 4, 6), ('Name', (3, 7, 3, 16), 'Exception', ('Load',)), None, [('Pass', (4, 2, 4, 6))])], [], [])], []), +('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [], [], [('Pass', (4, 2, 4, 6))])], []), +('Module', [('Assert', (1, 0, 1, 8), ('Name', (1, 7, 1, 8), 'v', ('Load',)), None)], []), +('Module', [('Import', (1, 0, 1, 10), [('alias', 'sys', None)])], []), +('Module', [('ImportFrom', (1, 0, 1, 17), 'sys', [('alias', 'v', None)], 0)], []), +('Module', [('Global', (1, 0, 1, 8), ['v'])], []), +('Module', [('Expr', (1, 0, 1, 1), ('Constant', (1, 0, 1, 1), 1, None))], []), +('Module', [('Pass', (1, 0, 1, 4))], []), +('Module', [('For', (1, 0, 1, 16), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Break', (1, 11, 1, 16))], [], None)], []), +('Module', [('For', (1, 0, 1, 19), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Continue', (1, 11, 1, 19))], [], None)], []), +('Module', [('For', (1, 0, 1, 18), ('Tuple', (1, 4, 1, 7), [('Name', (1, 4, 1, 5), 'a', ('Store',)), ('Name', (1, 6, 1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 11, 1, 12), 'c', ('Load',)), [('Pass', (1, 14, 1, 18))], [], None)], []), +('Module', [('For', (1, 0, 1, 20), ('Tuple', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), +('Module', [('For', (1, 0, 1, 20), ('List', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), +('Module', [('Expr', (1, 0, 11, 5), ('GeneratorExp', (1, 0, 11, 5), ('Tuple', (2, 4, 6, 5), [('Name', (3, 4, 3, 6), 'Aa', ('Load',)), ('Name', (5, 7, 5, 9), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4, 10, 6), [('Name', (8, 4, 8, 6), 'Aa', ('Store',)), ('Name', (10, 4, 10, 6), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10, 10, 12), 'Cc', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 34), ('DictComp', (1, 0, 1, 34), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Name', (1, 11, 1, 12), 'w', ('Store',)), ('Name', (1, 16, 1, 17), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22, 1, 23), 'm', ('Store',)), ('Name', (1, 27, 1, 28), 'p', ('Load',)), [('Name', (1, 32, 1, 33), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 20), ('DictComp', (1, 0, 1, 20), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'v', ('Store',)), ('Name', (1, 13, 1, 14), 'w', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'x', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 19), ('SetComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 12, 1, 13), 'x', ('Load',)), [('Name', (1, 17, 1, 18), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 16), ('SetComp', (1, 0, 1, 16), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7, 1, 10), [('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 9, 1, 10), 'm', ('Store',))], ('Store',)), ('Name', (1, 14, 1, 15), 'x', ('Load',)), [], 0)]))], []), +('Module', [('AsyncFunctionDef', (1, 0, 3, 18), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 17), ('Constant', (2, 1, 2, 17), 'async function', None)), ('Expr', (3, 1, 3, 18), ('Await', (3, 1, 3, 18), ('Call', (3, 7, 3, 18), ('Name', (3, 7, 3, 16), 'something', ('Load',)), [], [])))], [], None, None)], []), +('Module', [('AsyncFunctionDef', (1, 0, 3, 8), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1, 3, 8), ('Name', (2, 11, 2, 12), 'e', ('Store',)), ('Name', (2, 16, 2, 17), 'i', ('Load',)), [('Expr', (2, 19, 2, 20), ('Constant', (2, 19, 2, 20), 1, None))], [('Expr', (3, 7, 3, 8), ('Constant', (3, 7, 3, 8), 2, None))], None)], [], None, None)], []), +('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1, 2, 21), [('withitem', ('Name', (2, 12, 2, 13), 'a', ('Load',)), ('Name', (2, 17, 2, 18), 'b', ('Store',)))], [('Expr', (2, 20, 2, 21), ('Constant', (2, 20, 2, 21), 1, None))], None)], [], None, None)], []), +('Module', [('Expr', (1, 0, 1, 14), ('Dict', (1, 0, 1, 14), [None, ('Constant', (1, 10, 1, 11), 2, None)], [('Dict', (1, 3, 1, 8), [('Constant', (1, 4, 1, 5), 1, None)], [('Constant', (1, 6, 1, 7), 2, None)]), ('Constant', (1, 12, 1, 13), 3, None)]))], []), +('Module', [('Expr', (1, 0, 1, 12), ('Set', (1, 0, 1, 12), [('Starred', (1, 1, 1, 8), ('Set', (1, 2, 1, 8), [('Constant', (1, 3, 1, 4), 1, None), ('Constant', (1, 6, 1, 7), 2, None)]), ('Load',)), ('Constant', (1, 10, 1, 11), 3, None)]))], []), +('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 21), ('ListComp', (2, 1, 2, 21), ('Name', (2, 2, 2, 3), 'i', ('Load',)), [('comprehension', ('Name', (2, 14, 2, 15), 'b', ('Store',)), ('Name', (2, 19, 2, 20), 'c', ('Load',)), [], 1)]))], [], None, None)], []), +('Module', [('FunctionDef', (4, 0, 4, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None)], []), +('Module', [('AsyncFunctionDef', (4, 0, 4, 19), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15, 4, 19))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None)], []), +('Module', [('ClassDef', (4, 0, 4, 13), 'C', [], [], [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])])], []), +('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Call', (1, 1, 1, 19), ('Name', (1, 1, 1, 5), 'deco', ('Load',)), [('GeneratorExp', (1, 5, 1, 19), ('Name', (1, 6, 1, 7), 'a', ('Load',)), [('comprehension', ('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 17, 1, 18), 'b', ('Load',)), [], 0)])], [])], None, None)], []), +('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Attribute', (1, 1, 1, 6), ('Attribute', (1, 1, 1, 4), ('Name', (1, 1, 1, 2), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',))], None, None)], []), +('Module', [('Expr', (1, 0, 1, 8), ('NamedExpr', (1, 1, 1, 7), ('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Constant', (1, 6, 1, 7), 1, None)))], []), +('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 26), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None), ('arg', (1, 15, 1, 16), 'd', None, None), ('arg', (1, 18, 1, 19), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22, 1, 26))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25, 1, 29))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 39), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], ('arg', (1, 26, 1, 32), 'kwargs', None, None), []), [('Pass', (1, 35, 1, 39))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 20), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None)]), [('Pass', (1, 16, 1, 20))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None), ('arg', (1, 19, 1, 20), 'c', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None), ('Constant', (1, 21, 1, 22), 4, None)]), [('Pass', (1, 25, 1, 29))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 32), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 28, 1, 32))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 30), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 26, 1, 30))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 42), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], ('arg', (1, 29, 1, 35), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 38, 1, 42))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 40), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], ('arg', (1, 27, 1, 33), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 36, 1, 40))], [], None, None)], []), ] single_results = [ -('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1, None), ('Add',), ('Constant', (1, 2), 2, None)))]), +('Interactive', [('Expr', (1, 0, 1, 3), ('BinOp', (1, 0, 1, 3), ('Constant', (1, 0, 1, 1), 1, None), ('Add',), ('Constant', (1, 2, 1, 3), 2, None)))]), ] eval_results = [ -('Expression', ('Constant', (1, 0), None, None)), -('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])), -('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))), -('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))), -('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))), -('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])), -('Expression', ('Dict', (1, 0), [], [])), -('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])), -('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])), -('Expression', ('ListComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Constant', (1, 2), 1, None), ('Constant', (1, 4), 2, None), ('Starred', (1, 10), ('Name', (1, 11), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8), 3, None)), ('keyword', None, ('Name', (1, 15), 'e', ('Load',)))])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Starred', (1, 2), ('List', (1, 3), [('Constant', (1, 4), 0, None), ('Constant', (1, 7), 1, None)], ('Load',)), ('Load',))], [])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('GeneratorExp', (1, 1), ('Name', (1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 8), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Load',)), [], 0)])], [])), -('Expression', ('Constant', (1, 0), 10, None)), -('Expression', ('Constant', (1, 0), 'string', None)), -('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))), -('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))), -('Expression', ('Name', (1, 0), 'v', ('Load',))), -('Expression', ('List', (1, 0), [('Constant', (1, 1), 1, None), ('Constant', (1, 3), 2, None), ('Constant', (1, 5), 3, None)], ('Load',))), -('Expression', ('List', (1, 0), [], ('Load',))), -('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))), -('Expression', ('Tuple', (1, 0), [('Constant', (1, 1), 1, None), ('Constant', (1, 3), 2, None), ('Constant', (1, 5), 3, None)], ('Load',))), -('Expression', ('Tuple', (1, 0), [], ('Load',))), -('Expression', ('Call', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8), ('Attribute', (1, 8), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Constant', (1, 12), 1, None), ('Constant', (1, 14), 2, None), None), ('Load',))], [])), +('Expression', ('Constant', (1, 0, 1, 4), None, None)), +('Expression', ('BoolOp', (1, 0, 1, 7), ('And',), [('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Name', (1, 6, 1, 7), 'b', ('Load',))])), +('Expression', ('BinOp', (1, 0, 1, 5), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Add',), ('Name', (1, 4, 1, 5), 'b', ('Load',)))), +('Expression', ('UnaryOp', (1, 0, 1, 5), ('Not',), ('Name', (1, 4, 1, 5), 'v', ('Load',)))), +('Expression', ('Lambda', (1, 0, 1, 11), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7, 1, 11), None, None))), +('Expression', ('Dict', (1, 0, 1, 7), [('Constant', (1, 2, 1, 3), 1, None)], [('Constant', (1, 4, 1, 5), 2, None)])), +('Expression', ('Dict', (1, 0, 1, 2), [], [])), +('Expression', ('Set', (1, 0, 1, 7), [('Constant', (1, 1, 1, 5), None, None)])), +('Expression', ('Dict', (1, 0, 5, 6), [('Constant', (2, 6, 2, 7), 1, None)], [('Constant', (4, 10, 4, 11), 2, None)])), +('Expression', ('ListComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), +('Expression', ('ListComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('Compare', (1, 0, 1, 9), ('Constant', (1, 0, 1, 1), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4, 1, 5), 2, None), ('Constant', (1, 8, 1, 9), 3, None)])), +('Expression', ('Call', (1, 0, 1, 17), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Constant', (1, 2, 1, 3), 1, None), ('Constant', (1, 4, 1, 5), 2, None), ('Starred', (1, 10, 1, 12), ('Name', (1, 11, 1, 12), 'd', ('Load',)), ('Load',))], [('keyword', (1, 6, 1, 9), 'c', ('Constant', (1, 8, 1, 9), 3, None)), ('keyword', (1, 13, 1, 16), None, ('Name', (1, 15, 1, 16), 'e', ('Load',)))])), +('Expression', ('Call', (1, 0, 1, 10), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Starred', (1, 2, 1, 9), ('List', (1, 3, 1, 9), [('Constant', (1, 4, 1, 5), 0, None), ('Constant', (1, 7, 1, 8), 1, None)], ('Load',)), ('Load',))], [])), +('Expression', ('Call', (1, 0, 1, 15), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('GeneratorExp', (1, 1, 1, 15), ('Name', (1, 2, 1, 3), 'a', ('Load',)), [('comprehension', ('Name', (1, 8, 1, 9), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Load',)), [], 0)])], [])), +('Expression', ('Constant', (1, 0, 1, 2), 10, None)), +('Expression', ('Constant', (1, 0, 1, 8), 'string', None)), +('Expression', ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',))), +('Expression', ('Subscript', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Slice', (1, 2, 1, 5), ('Name', (1, 2, 1, 3), 'b', ('Load',)), ('Name', (1, 4, 1, 5), 'c', ('Load',)), None), ('Load',))), +('Expression', ('Name', (1, 0, 1, 1), 'v', ('Load',))), +('Expression', ('List', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), +('Expression', ('List', (1, 0, 1, 2), [], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 5), [('Constant', (1, 0, 1, 1), 1, None), ('Constant', (1, 2, 1, 3), 2, None), ('Constant', (1, 4, 1, 5), 3, None)], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 2), [], ('Load',))), +('Expression', ('Call', (1, 0, 1, 17), ('Attribute', (1, 0, 1, 7), ('Attribute', (1, 0, 1, 5), ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8, 1, 16), ('Attribute', (1, 8, 1, 11), ('Name', (1, 8, 1, 9), 'a', ('Load',)), 'b', ('Load',)), ('Slice', (1, 12, 1, 15), ('Constant', (1, 12, 1, 13), 1, None), ('Constant', (1, 14, 1, 15), 2, None), None), ('Load',))], [])), ] main() diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py index 14c0ec43..004d368d 100644 --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -1,6 +1,7 @@ # test asynchat from test import support +from test.support import socket_helper import asynchat import asyncore @@ -12,9 +13,8 @@ import time import unittest import unittest.mock -HOST = support.HOST +HOST = socket_helper.HOST SERVER_QUIT = b'QUIT\n' -TIMEOUT = 3.0 class echo_server(threading.Thread): @@ -26,7 +26,7 @@ class echo_server(threading.Thread): threading.Thread.__init__(self) self.event = event self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.port = support.bind_port(self.sock) + self.port = socket_helper.bind_port(self.sock) # This will be set if the client wants us to wait before echoing # data back. self.start_resend_event = None @@ -73,14 +73,14 @@ class echo_client(asynchat.async_chat): self.set_terminator(terminator) self.buffer = b"" - def handle_connect(self): - pass + def handle_connect(self): + pass - if sys.platform == 'darwin': - # select.poll returns a select.POLLHUP at the end of the tests - # on darwin, so just ignore it - def handle_expt(self): - pass + if sys.platform == 'darwin': + # select.poll returns a select.POLLHUP at the end of the tests + # on darwin, so just ignore it + def handle_expt(self): + pass def collect_incoming_data(self, data): self.buffer += data @@ -122,7 +122,7 @@ class TestAsynchat(unittest.TestCase): c.push(b"I'm not dead yet!" + term) c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [b"hello world", b"I'm not dead yet!"]) @@ -153,7 +153,7 @@ class TestAsynchat(unittest.TestCase): c.push(data) c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [data[:termlen]]) @@ -173,7 +173,7 @@ class TestAsynchat(unittest.TestCase): c.push(data) c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, []) self.assertEqual(c.buffer, data) @@ -185,7 +185,7 @@ class TestAsynchat(unittest.TestCase): p = asynchat.simple_producer(data+SERVER_QUIT, buffer_size=8) c.push_with_producer(p) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [b"hello world", b"I'm not dead yet!"]) @@ -195,7 +195,7 @@ class TestAsynchat(unittest.TestCase): data = b"hello world\nI'm not dead yet!\n" c.push_with_producer(data+SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [b"hello world", b"I'm not dead yet!"]) @@ -206,7 +206,7 @@ class TestAsynchat(unittest.TestCase): c.push(b"hello world\n\nI'm not dead yet!\n") c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [b"hello world", b"", b"I'm not dead yet!"]) @@ -225,7 +225,7 @@ class TestAsynchat(unittest.TestCase): # where the server echoes all of its data before we can check that it # got any down below. s.start_resend_event.set() - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, []) # the server might have been able to send a byte or two back, but this @@ -246,7 +246,7 @@ class TestAsynchat(unittest.TestCase): self.assertRaises(TypeError, c.push, 'unicode') c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [b'bytes', b'bytes', b'bytes']) diff --git a/Lib/test/test_asyncio/functional.py b/Lib/test/test_asyncio/functional.py index 70cd140f..5cd06593 100644 --- a/Lib/test/test_asyncio/functional.py +++ b/Lib/test/test_asyncio/functional.py @@ -7,6 +7,7 @@ import select import socket import tempfile import threading +from test import support class FunctionalTestCaseMixin: @@ -49,7 +50,7 @@ class FunctionalTestCaseMixin: def tcp_server(self, server_prog, *, family=socket.AF_INET, addr=None, - timeout=5, + timeout=support.LOOPBACK_TIMEOUT, backlog=1, max_clients=10): @@ -72,7 +73,7 @@ class FunctionalTestCaseMixin: def tcp_client(self, client_prog, family=socket.AF_INET, - timeout=10): + timeout=support.LOOPBACK_TIMEOUT): sock = socket.socket(family, socket.SOCK_STREAM) @@ -225,7 +226,7 @@ class TestThreadedServer(SocketThread): def run(self): try: with self._sock: - self._sock.setblocking(0) + self._sock.setblocking(False) self._run() finally: self._s1.close() diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 0f9e3d04..533d5cc7 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -3,7 +3,6 @@ import concurrent.futures import errno import math -import os import socket import sys import threading @@ -17,6 +16,7 @@ from asyncio import constants from test.test_asyncio import utils as test_utils from test import support from test.support.script_helper import assert_python_ok +from test.support import socket_helper MOCK_ANY = mock.ANY @@ -91,7 +91,7 @@ class BaseEventTests(test_utils.TestCase): self.assertIsNone( base_events._ipaddr_info('1.2.3.4', 1, UNSPEC, 0, 0)) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: # IPv4 address with family IPv6. self.assertIsNone( base_events._ipaddr_info('1.2.3.4', 1, INET6, STREAM, TCP)) @@ -216,6 +216,9 @@ class BaseEventLoopTests(test_utils.TestCase): raise NotImplementedError( 'cannot submit into a dummy executor') + self.loop._process_events = mock.Mock() + self.loop._write_to_self = mock.Mock() + executor = DummyExecutor() self.loop.set_default_executor(executor) self.assertIs(executor, self.loop._default_executor) @@ -226,6 +229,9 @@ class BaseEventLoopTests(test_utils.TestCase): with self.assertWarns(DeprecationWarning): self.loop.set_default_executor(executor) + # Avoid cleaning up the executor mock + self.loop._default_executor = None + def test_call_soon(self): def cb(): pass @@ -1150,7 +1156,7 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): srv.close() self.loop.run_until_complete(srv.wait_closed()) - @unittest.skipUnless(support.IPV6_ENABLED, 'no IPv6 support') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'no IPv6 support') def test_create_server_ipv6(self): async def main(): with self.assertWarns(DeprecationWarning): @@ -1282,7 +1288,7 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): t.close() test_utils.run_briefly(self.loop) # allow transport to close - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: sock.family = socket.AF_INET6 coro = self.loop.create_connection(asyncio.Protocol, '::1', 80) t, p = self.loop.run_until_complete(coro) @@ -1301,7 +1307,7 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): t.close() test_utils.run_briefly(self.loop) # allow transport to close - @unittest.skipUnless(support.IPV6_ENABLED, 'no IPv6 support') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'no IPv6 support') @unittest.skipIf(sys.platform.startswith('aix'), "bpo-25545: IPv6 scope id and getaddrinfo() behave differently on AIX") @patch_socket @@ -1633,7 +1639,7 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): self.assertRaises( OSError, self.loop.run_until_complete, coro) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 not supported or enabled') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 not supported or enabled') def test_create_datagram_endpoint_no_matching_family(self): coro = self.loop.create_datagram_endpoint( asyncio.DatagramProtocol, @@ -1694,7 +1700,7 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): self.loop.run_until_complete(protocol.done) self.assertEqual('CLOSED', protocol.state) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_datagram_endpoint_existing_sock_unix(self): with test_utils.unix_socket_path() as path: sock = socket.socket(socket.AF_UNIX, type=socket.SOCK_DGRAM) @@ -2009,7 +2015,7 @@ class BaseLoopSockSendfileTests(test_utils.TestCase): sock = self.make_socket() proto = self.MyProto(self.loop) server = self.run_loop(self.loop.create_server( - lambda: proto, support.HOST, 0, family=socket.AF_INET)) + lambda: proto, socket_helper.HOST, 0, family=socket.AF_INET)) addr = server.sockets[0].getsockname() for _ in range(10): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 85838f17..7bc9c9a3 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -32,6 +32,8 @@ from asyncio import proactor_events from asyncio import selector_events from test.test_asyncio import utils as test_utils from test import support +from test.support import socket_helper +from test.support import ALWAYS_EQ, LARGEST, SMALLEST def tearDownModule(): @@ -364,6 +366,8 @@ class EventLoopTestsMixin: f2 = self.loop.run_in_executor(None, run) f2.cancel() + self.loop.run_until_complete( + self.loop.shutdown_default_executor()) self.loop.close() self.loop.call_soon = patched_call_soon self.loop.call_soon_threadsafe = patched_call_soon @@ -514,7 +518,7 @@ class EventLoopTestsMixin: lambda: MyProto(loop=self.loop), *httpd.address) self._basetest_create_connection(conn_fut) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_unix_connection(self): # Issue #20682: On Mac OS X Tiger, getsockname() returns a # zero-length address for UNIX socket. @@ -616,7 +620,7 @@ class EventLoopTestsMixin: self._test_create_ssl_connection(httpd, create_connection, peername=httpd.address) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket @unittest.skipIf(ssl is None, 'No ssl module') def test_create_ssl_unix_connection(self): # Issue #20682: On Mac OS X Tiger, getsockname() returns a @@ -635,7 +639,7 @@ class EventLoopTestsMixin: def test_create_connection_local_addr(self): with test_utils.run_test_server() as httpd: - port = support.find_unused_port() + port = socket_helper.find_unused_port() f = self.loop.create_connection( lambda: MyProto(loop=self.loop), *httpd.address, local_addr=(httpd.address[0], port)) @@ -702,7 +706,7 @@ class EventLoopTestsMixin: proto.transport.close() lsock.close() - support.join_thread(thread, timeout=1) + support.join_thread(thread) self.assertFalse(thread.is_alive()) self.assertEqual(proto.state, 'CLOSED') self.assertEqual(proto.nbytes, len(message)) @@ -727,7 +731,7 @@ class EventLoopTestsMixin: sock = socket.socket() self.addCleanup(sock.close) coro = self.loop.connect_accepted_socket( - MyProto, sock, ssl_handshake_timeout=1) + MyProto, sock, ssl_handshake_timeout=support.LOOPBACK_TIMEOUT) with self.assertRaisesRegex( ValueError, 'ssl_handshake_timeout is only meaningful with ssl'): @@ -840,7 +844,7 @@ class EventLoopTestsMixin: return server, path - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_unix_server(self): proto = MyProto(loop=self.loop) server, path = self._make_unix_server(lambda: proto) @@ -932,7 +936,7 @@ class EventLoopTestsMixin: # stop serving server.close() - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket @unittest.skipIf(ssl is None, 'No ssl module') def test_create_unix_server_ssl(self): proto = MyProto(loop=self.loop) @@ -992,7 +996,7 @@ class EventLoopTestsMixin: self.assertIsNone(proto.transport) server.close() - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket @unittest.skipIf(ssl is None, 'No ssl module') def test_create_unix_server_ssl_verify_failed(self): proto = MyProto(loop=self.loop) @@ -1052,7 +1056,7 @@ class EventLoopTestsMixin: self.assertIsNone(proto.transport) server.close() - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket @unittest.skipIf(ssl is None, 'No ssl module') def test_create_unix_server_ssl_verified(self): proto = MyProto(loop=self.loop) @@ -1145,7 +1149,7 @@ class EventLoopTestsMixin: server.close() - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 not supported or enabled') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 not supported or enabled') def test_create_server_dual_stack(self): f_proto = self.loop.create_future() @@ -1157,7 +1161,7 @@ class EventLoopTestsMixin: try_count = 0 while True: try: - port = support.find_unused_port() + port = socket_helper.find_unused_port() f = self.loop.create_server(TestMyProto, host=None, port=port) server = self.loop.run_until_complete(f) except OSError as ex: @@ -1255,7 +1259,7 @@ class EventLoopTestsMixin: def test_create_datagram_endpoint(self): self._test_create_datagram_endpoint(('127.0.0.1', 0), socket.AF_INET) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 not supported or enabled') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 not supported or enabled') def test_create_datagram_endpoint_ipv6(self): self._test_create_datagram_endpoint(('::1', 0), socket.AF_INET6) @@ -1487,12 +1491,12 @@ class EventLoopTestsMixin: return len(data) test_utils.run_until(self.loop, lambda: reader(data) >= 1, - timeout=10) + timeout=support.SHORT_TIMEOUT) self.assertEqual(b'1', data) transport.write(b'2345') test_utils.run_until(self.loop, lambda: reader(data) >= 5, - timeout=10) + timeout=support.SHORT_TIMEOUT) self.assertEqual(b'12345', data) self.assertEqual('CONNECTED', proto.state) @@ -1543,27 +1547,29 @@ class EventLoopTestsMixin: return len(data) write_transport.write(b'1') - test_utils.run_until(self.loop, lambda: reader(data) >= 1, timeout=10) + test_utils.run_until(self.loop, lambda: reader(data) >= 1, + timeout=support.SHORT_TIMEOUT) self.assertEqual(b'1', data) self.assertEqual(['INITIAL', 'CONNECTED'], read_proto.state) self.assertEqual('CONNECTED', write_proto.state) os.write(master, b'a') test_utils.run_until(self.loop, lambda: read_proto.nbytes >= 1, - timeout=10) + timeout=support.SHORT_TIMEOUT) self.assertEqual(['INITIAL', 'CONNECTED'], read_proto.state) self.assertEqual(1, read_proto.nbytes) self.assertEqual('CONNECTED', write_proto.state) write_transport.write(b'2345') - test_utils.run_until(self.loop, lambda: reader(data) >= 5, timeout=10) + test_utils.run_until(self.loop, lambda: reader(data) >= 5, + timeout=support.SHORT_TIMEOUT) self.assertEqual(b'12345', data) self.assertEqual(['INITIAL', 'CONNECTED'], read_proto.state) self.assertEqual('CONNECTED', write_proto.state) os.write(master, b'bcde') test_utils.run_until(self.loop, lambda: read_proto.nbytes >= 5, - timeout=10) + timeout=support.SHORT_TIMEOUT) self.assertEqual(['INITIAL', 'CONNECTED'], read_proto.state) self.assertEqual(5, read_proto.nbytes) self.assertEqual('CONNECTED', write_proto.state) @@ -2394,6 +2400,28 @@ class TimerTests(unittest.TestCase): self.assertIs(NotImplemented, h1.__eq__(h3)) self.assertIs(NotImplemented, h1.__ne__(h3)) + with self.assertRaises(TypeError): + h1 < () + with self.assertRaises(TypeError): + h1 > () + with self.assertRaises(TypeError): + h1 <= () + with self.assertRaises(TypeError): + h1 >= () + self.assertFalse(h1 == ()) + self.assertTrue(h1 != ()) + + self.assertTrue(h1 == ALWAYS_EQ) + self.assertFalse(h1 != ALWAYS_EQ) + self.assertTrue(h1 < LARGEST) + self.assertFalse(h1 > LARGEST) + self.assertTrue(h1 <= LARGEST) + self.assertFalse(h1 >= LARGEST) + self.assertFalse(h1 < SMALLEST) + self.assertTrue(h1 > SMALLEST) + self.assertFalse(h1 <= SMALLEST) + self.assertTrue(h1 >= SMALLEST) + class AbstractEventLoopTests(unittest.TestCase): diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py index ee5edd5b..ec00896c 100644 --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -201,6 +201,27 @@ class BaseFutureTests: self.assertFalse(fut.cancelled()) self.assertFalse(fut.done()) + def test_future_cancel_message_getter(self): + f = self._new_future(loop=self.loop) + self.assertTrue(hasattr(f, '_cancel_message')) + self.assertEqual(f._cancel_message, None) + + f.cancel('my message') + with self.assertRaises(asyncio.CancelledError): + self.loop.run_until_complete(f) + self.assertEqual(f._cancel_message, 'my message') + + def test_future_cancel_message_setter(self): + f = self._new_future(loop=self.loop) + f.cancel('my message') + f._cancel_message = 'my new message' + self.assertEqual(f._cancel_message, 'my new message') + + # Also check that the value is used for cancel(). + with self.assertRaises(asyncio.CancelledError): + self.loop.run_until_complete(f) + self.assertEqual(f._cancel_message, 'my new message') + def test_cancel(self): f = self._new_future(loop=self.loop) self.assertTrue(f.cancel()) diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py index 9468e740..8c93fae2 100644 --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -47,13 +47,7 @@ class LockTests(test_utils.TestCase): self.assertTrue(repr(lock).endswith('[unlocked]>')) self.assertTrue(RGX_REPR.match(repr(lock))) - with self.assertWarns(DeprecationWarning): - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - yield from lock - - self.loop.run_until_complete(acquire_lock()) + self.loop.run_until_complete(lock.acquire()) self.assertTrue(repr(lock).endswith('[locked]>')) self.assertTrue(RGX_REPR.match(repr(lock))) @@ -61,18 +55,16 @@ class LockTests(test_utils.TestCase): with self.assertWarns(DeprecationWarning): lock = asyncio.Lock(loop=self.loop) - @asyncio.coroutine def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) - - res = self.loop.run_until_complete(acquire_lock()) + return (yield from lock) - self.assertTrue(res) - self.assertTrue(lock.locked()) + with self.assertRaisesRegex( + TypeError, + "object is not iterable" + ): + self.loop.run_until_complete(acquire_lock()) - lock.release() self.assertFalse(lock.locked()) def test_lock_by_with_statement(self): @@ -90,13 +82,13 @@ class LockTests(test_utils.TestCase): def test(lock): yield from asyncio.sleep(0.01) self.assertFalse(lock.locked()) - with self.assertWarns(DeprecationWarning): - with (yield from lock) as _lock: - self.assertIs(_lock, None) - self.assertTrue(lock.locked()) - yield from asyncio.sleep(0.01) - self.assertTrue(lock.locked()) - self.assertFalse(lock.locked()) + with self.assertRaisesRegex( + TypeError, + "object is not iterable" + ): + with (yield from lock): + pass + self.assertFalse(lock.locked()) for primitive in primitives: loop.run_until_complete(test(primitive)) @@ -302,52 +294,16 @@ class LockTests(test_utils.TestCase): self.assertFalse(lock.locked()) def test_context_manager(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + async def f(): + lock = asyncio.Lock() + self.assertFalse(lock.locked()) - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) + async with lock: + self.assertTrue(lock.locked()) - with self.loop.run_until_complete(acquire_lock()): - self.assertTrue(lock.locked()) + self.assertFalse(lock.locked()) - self.assertFalse(lock.locked()) - - def test_context_manager_cant_reuse(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) - - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) - - # This spells "yield from lock" outside a generator. - cm = self.loop.run_until_complete(acquire_lock()) - with cm: - self.assertTrue(lock.locked()) - - self.assertFalse(lock.locked()) - - with self.assertRaises(AttributeError): - with cm: - pass - - def test_context_manager_no_yield(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) - - try: - with lock: - self.fail('RuntimeError is not raised in with expression') - except RuntimeError as err: - self.assertEqual( - str(err), - '"yield from" should be used as context manager expression') - - self.assertFalse(lock.locked()) + self.loop.run_until_complete(f()) class EventTests(test_utils.TestCase): @@ -809,33 +765,14 @@ class ConditionTests(test_utils.TestCase): self.assertTrue(RGX_REPR.match(repr(cond))) def test_context_manager(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) - - with self.assertWarns(DeprecationWarning): - @asyncio.coroutine - def acquire_cond(): - with self.assertWarns(DeprecationWarning): - return (yield from cond) - - with self.loop.run_until_complete(acquire_cond()): - self.assertTrue(cond.locked()) - - self.assertFalse(cond.locked()) - - def test_context_manager_no_yield(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) - - try: - with cond: - self.fail('RuntimeError is not raised in with expression') - except RuntimeError as err: - self.assertEqual( - str(err), - '"yield from" should be used as context manager expression') + async def f(): + cond = asyncio.Condition() + self.assertFalse(cond.locked()) + async with cond: + self.assertTrue(cond.locked()) + self.assertFalse(cond.locked()) - self.assertFalse(cond.locked()) + self.loop.run_until_complete(f()) def test_explicit_lock(self): with self.assertWarns(DeprecationWarning): @@ -920,16 +857,14 @@ class SemaphoreTests(test_utils.TestCase): with self.assertWarns(DeprecationWarning): @asyncio.coroutine def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from sem) + return (yield from sem) - res = self.loop.run_until_complete(acquire_lock()) - - self.assertTrue(res) - self.assertTrue(sem.locked()) - self.assertEqual(0, sem._value) + with self.assertRaisesRegex( + TypeError, + "'Semaphore' object is not iterable", + ): + self.loop.run_until_complete(acquire_lock()) - sem.release() self.assertFalse(sem.locked()) self.assertEqual(1, sem._value) @@ -1064,38 +999,6 @@ class SemaphoreTests(test_utils.TestCase): sem.release() self.assertFalse(sem.locked()) - def test_context_manager(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(2, loop=self.loop) - - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from sem) - - with self.loop.run_until_complete(acquire_lock()): - self.assertFalse(sem.locked()) - self.assertEqual(1, sem._value) - - with self.loop.run_until_complete(acquire_lock()): - self.assertTrue(sem.locked()) - - self.assertEqual(2, sem._value) - - def test_context_manager_no_yield(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(2, loop=self.loop) - - try: - with sem: - self.fail('RuntimeError is not raised in with expression') - except RuntimeError as err: - self.assertEqual( - str(err), - '"yield from" should be used as context manager expression') - - self.assertEqual(2, sem._value) - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_asyncio/test_pep492.py b/Lib/test/test_asyncio/test_pep492.py index a1f27dd5..c5e3a5c1 100644 --- a/Lib/test/test_asyncio/test_pep492.py +++ b/Lib/test/test_asyncio/test_pep492.py @@ -77,13 +77,12 @@ class LockTests(BaseTest): async def test(lock): await asyncio.sleep(0.01) self.assertFalse(lock.locked()) - with self.assertWarns(DeprecationWarning): - with await lock as _lock: - self.assertIs(_lock, None) - self.assertTrue(lock.locked()) - await asyncio.sleep(0.01) - self.assertTrue(lock.locked()) - self.assertFalse(lock.locked()) + with self.assertRaisesRegex( + TypeError, + "can't be used in 'await' expression" + ): + with await lock: + pass for primitive in primitives: self.loop.run_until_complete(test(primitive)) diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py index e4809c30..451f86ae 100644 --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -13,6 +13,7 @@ from asyncio.proactor_events import _ProactorWritePipeTransport from asyncio.proactor_events import _ProactorDuplexPipeTransport from asyncio.proactor_events import _ProactorDatagramTransport from test import support +from test.support import socket_helper from test.test_asyncio import utils as test_utils @@ -951,7 +952,7 @@ class ProactorEventLoopUnixSockSendfileTests(test_utils.TestCase): def prepare(self): sock = self.make_socket() proto = self.MyProto(self.loop) - port = support.find_unused_port() + port = socket_helper.find_unused_port() srv_sock = self.make_socket(cleanup=False) srv_sock.bind(('127.0.0.1', port)) server = self.run_loop(self.loop.create_server( diff --git a/Lib/test/test_asyncio/test_sendfile.py b/Lib/test/test_asyncio/test_sendfile.py index 3b7f784c..1b1af08d 100644 --- a/Lib/test/test_asyncio/test_sendfile.py +++ b/Lib/test/test_asyncio/test_sendfile.py @@ -10,6 +10,7 @@ from asyncio import base_events from asyncio import constants from unittest import mock from test import support +from test.support import socket_helper from test.test_asyncio import utils as test_utils try: @@ -163,9 +164,9 @@ class SockSendfileMixin(SendfileBase): def prepare_socksendfile(self): proto = MyProto(self.loop) - port = support.find_unused_port() + port = socket_helper.find_unused_port() srv_sock = self.make_socket(cleanup=False) - srv_sock.bind((support.HOST, port)) + srv_sock.bind((socket_helper.HOST, port)) server = self.run_loop(self.loop.create_server( lambda: proto, sock=srv_sock)) self.reduce_receive_buffer_size(srv_sock) @@ -240,7 +241,7 @@ class SendfileMixin(SendfileBase): # Note: sendfile via SSL transport is equal to sendfile fallback def prepare_sendfile(self, *, is_ssl=False, close_after=0): - port = support.find_unused_port() + port = socket_helper.find_unused_port() srv_proto = MySendfileProto(loop=self.loop, close_after=close_after) if is_ssl: @@ -252,17 +253,17 @@ class SendfileMixin(SendfileBase): srv_ctx = None cli_ctx = None srv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - srv_sock.bind((support.HOST, port)) + srv_sock.bind((socket_helper.HOST, port)) server = self.run_loop(self.loop.create_server( lambda: srv_proto, sock=srv_sock, ssl=srv_ctx)) self.reduce_receive_buffer_size(srv_sock) if is_ssl: - server_hostname = support.HOST + server_hostname = socket_helper.HOST else: server_hostname = None cli_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - cli_sock.connect((support.HOST, port)) + cli_sock.connect((socket_helper.HOST, port)) cli_proto = MySendfileProto(loop=self.loop) tr, pr = self.run_loop(self.loop.create_connection( @@ -444,6 +445,12 @@ class SendfileMixin(SendfileBase): self.assertEqual(srv_proto.data, self.DATA) self.assertEqual(self.file.tell(), len(self.DATA)) + # On Solaris, lowering SO_RCVBUF on a TCP connection after it has been + # established has no effect. Due to its age, this bug affects both Oracle + # Solaris as well as all other OpenSolaris forks (unless they fixed it + # themselves). + @unittest.skipIf(sys.platform.startswith('sunos'), + "Doesn't work on Solaris") def test_sendfile_close_peer_in_the_middle_of_receiving(self): srv_proto, cli_proto = self.prepare_sendfile(close_after=1024) with self.assertRaises(ConnectionError): diff --git a/Lib/test/test_asyncio/test_server.py b/Lib/test/test_asyncio/test_server.py index d47ccc02..2de4dcad 100644 --- a/Lib/test/test_asyncio/test_server.py +++ b/Lib/test/test_asyncio/test_server.py @@ -3,7 +3,7 @@ import time import threading import unittest -from test import support +from test.support import socket_helper from test.test_asyncio import utils as test_utils from test.test_asyncio import functional as func_tests @@ -47,7 +47,7 @@ class BaseStartServer(func_tests.FunctionalTestCaseMixin): with self.assertWarns(DeprecationWarning): srv = self.loop.run_until_complete(asyncio.start_server( - serve, support.HOSTv4, 0, loop=self.loop, start_serving=False)) + serve, socket_helper.HOSTv4, 0, loop=self.loop, start_serving=False)) self.assertFalse(srv.is_serving()) @@ -73,7 +73,7 @@ class SelectorStartServerTests(BaseStartServer, unittest.TestCase): def new_loop(self): return asyncio.SelectorEventLoop() - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_start_unix_server_1(self): HELLO_MSG = b'1' * 1024 * 5 + b'\n' started = threading.Event() diff --git a/Lib/test/test_asyncio/test_sock_lowlevel.py b/Lib/test/test_asyncio/test_sock_lowlevel.py index 89c2af9f..d8a5df8e 100644 --- a/Lib/test/test_asyncio/test_sock_lowlevel.py +++ b/Lib/test/test_asyncio/test_sock_lowlevel.py @@ -1,10 +1,14 @@ import socket +import time import asyncio import sys +import unittest + from asyncio import proactor_events from itertools import cycle, islice from test.test_asyncio import utils as test_utils from test import support +from test.support import socket_helper class MyProto(asyncio.Protocol): @@ -121,6 +125,150 @@ class BaseSockTestsMixin: sock = socket.socket() self._basetest_sock_recv_into(httpd, sock) + async def _basetest_sock_recv_racing(self, httpd, sock): + sock.setblocking(False) + await self.loop.sock_connect(sock, httpd.address) + + task = asyncio.create_task(self.loop.sock_recv(sock, 1024)) + await asyncio.sleep(0) + task.cancel() + + asyncio.create_task( + self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n')) + data = await self.loop.sock_recv(sock, 1024) + # consume data + await self.loop.sock_recv(sock, 1024) + + self.assertTrue(data.startswith(b'HTTP/1.0 200 OK')) + + async def _basetest_sock_recv_into_racing(self, httpd, sock): + sock.setblocking(False) + await self.loop.sock_connect(sock, httpd.address) + + data = bytearray(1024) + with memoryview(data) as buf: + task = asyncio.create_task( + self.loop.sock_recv_into(sock, buf[:1024])) + await asyncio.sleep(0) + task.cancel() + + task = asyncio.create_task( + self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n')) + nbytes = await self.loop.sock_recv_into(sock, buf[:1024]) + # consume data + await self.loop.sock_recv_into(sock, buf[nbytes:]) + self.assertTrue(data.startswith(b'HTTP/1.0 200 OK')) + + await task + + async def _basetest_sock_send_racing(self, listener, sock): + listener.bind(('127.0.0.1', 0)) + listener.listen(1) + + # make connection + sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024) + sock.setblocking(False) + task = asyncio.create_task( + self.loop.sock_connect(sock, listener.getsockname())) + await asyncio.sleep(0) + server = listener.accept()[0] + server.setblocking(False) + + with server: + await task + + # fill the buffer until sending 5 chars would block + size = 8192 + while size >= 4: + with self.assertRaises(BlockingIOError): + while True: + sock.send(b' ' * size) + size = int(size / 2) + + # cancel a blocked sock_sendall + task = asyncio.create_task( + self.loop.sock_sendall(sock, b'hello')) + await asyncio.sleep(0) + task.cancel() + + # receive everything that is not a space + async def recv_all(): + rv = b'' + while True: + buf = await self.loop.sock_recv(server, 8192) + if not buf: + return rv + rv += buf.strip() + task = asyncio.create_task(recv_all()) + + # immediately make another sock_sendall call + await self.loop.sock_sendall(sock, b'world') + sock.shutdown(socket.SHUT_WR) + data = await task + # ProactorEventLoop could deliver hello, so endswith is necessary + self.assertTrue(data.endswith(b'world')) + + # After the first connect attempt before the listener is ready, + # the socket needs time to "recover" to make the next connect call. + # On Linux, a second retry will do. On Windows, the waiting time is + # unpredictable; and on FreeBSD the socket may never come back + # because it's a loopback address. Here we'll just retry for a few + # times, and have to skip the test if it's not working. See also: + # https://stackoverflow.com/a/54437602/3316267 + # https://lists.freebsd.org/pipermail/freebsd-current/2005-May/049876.html + async def _basetest_sock_connect_racing(self, listener, sock): + listener.bind(('127.0.0.1', 0)) + addr = listener.getsockname() + sock.setblocking(False) + + task = asyncio.create_task(self.loop.sock_connect(sock, addr)) + await asyncio.sleep(0) + task.cancel() + + listener.listen(1) + + skip_reason = "Max retries reached" + for i in range(128): + try: + await self.loop.sock_connect(sock, addr) + except ConnectionRefusedError as e: + skip_reason = e + except OSError as e: + skip_reason = e + + # Retry only for this error: + # [WinError 10022] An invalid argument was supplied + if getattr(e, 'winerror', 0) != 10022: + break + else: + # success + return + + self.skipTest(skip_reason) + + def test_sock_client_racing(self): + with test_utils.run_test_server() as httpd: + sock = socket.socket() + with sock: + self.loop.run_until_complete(asyncio.wait_for( + self._basetest_sock_recv_racing(httpd, sock), 10)) + sock = socket.socket() + with sock: + self.loop.run_until_complete(asyncio.wait_for( + self._basetest_sock_recv_into_racing(httpd, sock), 10)) + listener = socket.socket() + sock = socket.socket() + with listener, sock: + self.loop.run_until_complete(asyncio.wait_for( + self._basetest_sock_send_racing(listener, sock), 10)) + + def test_sock_client_connect_racing(self): + listener = socket.socket() + sock = socket.socket() + with listener, sock: + self.loop.run_until_complete(asyncio.wait_for( + self._basetest_sock_connect_racing(listener, sock), 10)) + async def _basetest_huge_content(self, address): sock = socket.socket() sock.setblocking(False) @@ -225,7 +373,7 @@ class BaseSockTestsMixin: self.loop.run_until_complete( self._basetest_huge_content_recvinto(httpd.address)) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_unix_sock_client_ops(self): with test_utils.run_test_unix_server() as httpd: sock = socket.socket(socket.AF_UNIX) @@ -267,6 +415,25 @@ class BaseSockTestsMixin: conn.close() listener.close() + def test_cancel_sock_accept(self): + listener = socket.socket() + listener.setblocking(False) + listener.bind(('127.0.0.1', 0)) + listener.listen(1) + sockaddr = listener.getsockname() + f = asyncio.wait_for(self.loop.sock_accept(listener), 0.1) + with self.assertRaises(asyncio.TimeoutError): + self.loop.run_until_complete(f) + + listener.close() + client = socket.socket() + client.setblocking(False) + f = self.loop.sock_connect(client, sockaddr) + with self.assertRaises(ConnectionRefusedError): + self.loop.run_until_complete(f) + + client.close() + def test_create_connection_sock(self): with test_utils.run_test_server() as httpd: sock = None diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index a7c08901..948820c8 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -2,7 +2,7 @@ import logging import socket -import sys +from test import support import unittest import weakref from unittest import mock @@ -15,6 +15,7 @@ import asyncio from asyncio import log from asyncio import protocols from asyncio import sslproto +from test import support from test.test_asyncio import utils as test_utils from test.test_asyncio import functional as func_tests @@ -162,7 +163,7 @@ class SslProtoHandshakeTests(test_utils.TestCase): class BaseStartTLS(func_tests.FunctionalTestCaseMixin): PAYLOAD_SIZE = 1024 * 100 - TIMEOUT = 60 + TIMEOUT = support.LONG_TIMEOUT def new_loop(self): raise NotImplementedError @@ -272,7 +273,8 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) # No garbage is left if SSL is closed uncleanly client_context = weakref.ref(client_context) @@ -333,7 +335,8 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) # No garbage is left for SSL client from loop.create_connection, even # if user stores the SSLTransport in corresponding protocol instance @@ -489,7 +492,8 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) def test_start_tls_server_1(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE @@ -617,7 +621,7 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin): *addr, ssl=client_sslctx, server_hostname='', - ssl_handshake_timeout=10.0), + ssl_handshake_timeout=support.SHORT_TIMEOUT), 0.5) with self.tcp_server(server, @@ -699,7 +703,7 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin): ssl=client_sslctx, server_hostname='', loop=self.loop, - ssl_handshake_timeout=1.0) + ssl_handshake_timeout=support.LOOPBACK_TIMEOUT) with self.tcp_server(server, max_clients=1, diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 12bd5369..1e9d1156 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -9,7 +9,7 @@ import sys import threading import unittest from unittest import mock -from test import support +from test.support import socket_helper try: import ssl except ImportError: @@ -66,7 +66,7 @@ class StreamTests(test_utils.TestCase): loop=self.loop) self._basetest_open_connection(conn_fut) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_open_unix_connection(self): with test_utils.run_test_unix_server() as httpd: conn_fut = asyncio.open_unix_connection(httpd.address, @@ -99,7 +99,7 @@ class StreamTests(test_utils.TestCase): self._basetest_open_connection_no_loop_ssl(conn_fut) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket @unittest.skipIf(ssl is None, 'No ssl module') def test_open_unix_connection_no_loop_ssl(self): with test_utils.run_test_unix_server(use_ssl=True) as httpd: @@ -130,7 +130,7 @@ class StreamTests(test_utils.TestCase): loop=self.loop) self._basetest_open_connection_error(conn_fut) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_open_unix_connection_error(self): with test_utils.run_test_unix_server() as httpd: conn_fut = asyncio.open_unix_connection(httpd.address, @@ -653,7 +653,7 @@ class StreamTests(test_utils.TestCase): self.assertEqual(messages, []) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_start_unix_server(self): class MyServer: diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index fe8cfa61..6657a88e 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -1,3 +1,4 @@ +import os import signal import sys import unittest @@ -143,7 +144,7 @@ class SubprocessMixin: return proc.returncode, stdout task = run(b'some data') - task = asyncio.wait_for(task, 60.0) + task = asyncio.wait_for(task, support.LONG_TIMEOUT) exitcode, stdout = self.loop.run_until_complete(task) self.assertEqual(exitcode, 0) self.assertEqual(stdout, b'some data') @@ -476,12 +477,19 @@ class SubprocessMixin: proc.kill = kill returncode = transport.get_returncode() transport.close() - await transport._wait() + await asyncio.wait_for(transport._wait(), 5) return (returncode, kill_called) # Ignore "Close running child process: kill ..." log with test_utils.disable_logger(): - returncode, killed = self.loop.run_until_complete(kill_running()) + try: + returncode, killed = self.loop.run_until_complete( + kill_running() + ) + except asyncio.TimeoutError: + self.skipTest( + "Timeout failure on waiting for subprocess stopping" + ) self.assertIsNone(returncode) # transport.close() must kill the process if it is still running @@ -691,6 +699,23 @@ if sys.platform != 'win32': Watcher = unix_events.FastChildWatcher + def has_pidfd_support(): + if not hasattr(os, 'pidfd_open'): + return False + try: + os.close(os.pidfd_open(os.getpid())) + except OSError: + return False + return True + + @unittest.skipUnless( + has_pidfd_support(), + "operating system does not support pidfds", + ) + class SubprocessPidfdWatcherTests(SubprocessWatcherMixin, + test_utils.TestCase): + Watcher = unix_events.PidfdChildWatcher + else: # Windows class SubprocessProactorTests(SubprocessMixin, test_utils.TestCase): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index c402f8f0..74fc1e4a 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -10,6 +10,7 @@ import random import re import sys import textwrap +import traceback import types import unittest import weakref @@ -57,6 +58,22 @@ def format_coroutine(qualname, state, src, source_traceback, generator=False): return 'coro=<%s() %s at %s>' % (qualname, state, src) +def get_innermost_context(exc): + """ + Return information about the innermost exception context in the chain. + """ + depth = 0 + while True: + context = exc.__context__ + if context is None: + break + + exc = context + depth += 1 + + return (type(exc), exc.args, depth) + + class Dummy: def __repr__(self): @@ -80,6 +97,12 @@ class CoroLikeObject: return self +# The following value can be used as a very small timeout: +# it passes check "timeout > 0", but has almost +# no effect on the test performance +_EPSILON = 0.0001 + + class BaseTaskTests: Task = None @@ -97,6 +120,30 @@ class BaseTaskTests: self.loop.set_task_factory(self.new_task) self.loop.create_future = lambda: self.new_future(self.loop) + def test_task_cancel_message_getter(self): + async def coro(): + pass + t = self.new_task(self.loop, coro()) + self.assertTrue(hasattr(t, '_cancel_message')) + self.assertEqual(t._cancel_message, None) + + t.cancel('my message') + self.assertEqual(t._cancel_message, 'my message') + + with self.assertRaises(asyncio.CancelledError): + self.loop.run_until_complete(t) + + def test_task_cancel_message_setter(self): + async def coro(): + pass + t = self.new_task(self.loop, coro()) + t.cancel('my message') + t._cancel_message = 'my new message' + self.assertEqual(t._cancel_message, 'my new message') + + with self.assertRaises(asyncio.CancelledError): + self.loop.run_until_complete(t) + def test_task_del_collect(self): class Evil: def __del__(self): @@ -466,6 +513,66 @@ class BaseTaskTests: t = outer() self.assertEqual(self.loop.run_until_complete(t), 1042) + def test_exception_chaining_after_await(self): + # Test that when awaiting on a task when an exception is already + # active, if the task raises an exception it will be chained + # with the original. + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def raise_error(): + raise ValueError + + async def run(): + try: + raise KeyError(3) + except Exception as exc: + task = self.new_task(loop, raise_error()) + try: + await task + except Exception as exc: + self.assertEqual(type(exc), ValueError) + chained = exc.__context__ + self.assertEqual((type(chained), chained.args), + (KeyError, (3,))) + + try: + task = self.new_task(loop, run()) + loop.run_until_complete(task) + finally: + loop.close() + + def test_exception_chaining_after_await_with_context_cycle(self): + # Check trying to create an exception context cycle: + # https://bugs.python.org/issue40696 + has_cycle = None + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def process_exc(exc): + raise exc + + async def run(): + nonlocal has_cycle + try: + raise KeyError('a') + except Exception as exc: + task = self.new_task(loop, process_exc(exc)) + try: + await task + except BaseException as exc: + has_cycle = (exc is exc.__context__) + # Prevent a hang if has_cycle is True. + exc.__context__ = None + + try: + task = self.new_task(loop, run()) + loop.run_until_complete(task) + finally: + loop.close() + # This also distinguishes from the initial has_cycle=None. + self.assertEqual(has_cycle, False) + def test_cancel(self): def gen(): @@ -487,6 +594,98 @@ class BaseTaskTests: self.assertTrue(t.cancelled()) self.assertFalse(t.cancel()) + def test_cancel_with_message_then_future_result(self): + # Test Future.result() after calling cancel() with a message. + cases = [ + ((), ()), + ((None,), ()), + (('my message',), ('my message',)), + # Non-string values should roundtrip. + ((5,), (5,)), + ] + for cancel_args, expected_args in cases: + with self.subTest(cancel_args=cancel_args): + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def sleep(): + await asyncio.sleep(10) + + async def coro(): + task = self.new_task(loop, sleep()) + await asyncio.sleep(0) + task.cancel(*cancel_args) + done, pending = await asyncio.wait([task]) + task.result() + + task = self.new_task(loop, coro()) + with self.assertRaises(asyncio.CancelledError) as cm: + loop.run_until_complete(task) + exc = cm.exception + self.assertEqual(exc.args, ()) + + actual = get_innermost_context(exc) + self.assertEqual(actual, + (asyncio.CancelledError, expected_args, 2)) + + def test_cancel_with_message_then_future_exception(self): + # Test Future.exception() after calling cancel() with a message. + cases = [ + ((), ()), + ((None,), ()), + (('my message',), ('my message',)), + # Non-string values should roundtrip. + ((5,), (5,)), + ] + for cancel_args, expected_args in cases: + with self.subTest(cancel_args=cancel_args): + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def sleep(): + await asyncio.sleep(10) + + async def coro(): + task = self.new_task(loop, sleep()) + await asyncio.sleep(0) + task.cancel(*cancel_args) + done, pending = await asyncio.wait([task]) + task.exception() + + task = self.new_task(loop, coro()) + with self.assertRaises(asyncio.CancelledError) as cm: + loop.run_until_complete(task) + exc = cm.exception + self.assertEqual(exc.args, ()) + + actual = get_innermost_context(exc) + self.assertEqual(actual, + (asyncio.CancelledError, expected_args, 2)) + + def test_cancel_with_message_before_starting_task(self): + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def sleep(): + await asyncio.sleep(10) + + async def coro(): + task = self.new_task(loop, sleep()) + # We deliberately leave out the sleep here. + task.cancel('my message') + done, pending = await asyncio.wait([task]) + task.exception() + + task = self.new_task(loop, coro()) + with self.assertRaises(asyncio.CancelledError) as cm: + loop.run_until_complete(task) + exc = cm.exception + self.assertEqual(exc.args, ()) + + actual = get_innermost_context(exc) + self.assertEqual(actual, + (asyncio.CancelledError, ('my message',), 2)) + def test_cancel_yield(self): with self.assertWarns(DeprecationWarning): @asyncio.coroutine @@ -667,6 +866,66 @@ class BaseTaskTests: self.assertTrue(nested_task.cancelled()) self.assertTrue(fut.cancelled()) + def assert_text_contains(self, text, substr): + if substr not in text: + raise RuntimeError(f'text {substr!r} not found in:\n>>>{text}<<<') + + def test_cancel_traceback_for_future_result(self): + # When calling Future.result() on a cancelled task, check that the + # line of code that was interrupted is included in the traceback. + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def nested(): + # This will get cancelled immediately. + await asyncio.sleep(10) + + async def coro(): + task = self.new_task(loop, nested()) + await asyncio.sleep(0) + task.cancel() + await task # search target + + task = self.new_task(loop, coro()) + try: + loop.run_until_complete(task) + except asyncio.CancelledError: + tb = traceback.format_exc() + self.assert_text_contains(tb, "await asyncio.sleep(10)") + # The intermediate await should also be included. + self.assert_text_contains(tb, "await task # search target") + else: + self.fail('CancelledError did not occur') + + def test_cancel_traceback_for_future_exception(self): + # When calling Future.exception() on a cancelled task, check that the + # line of code that was interrupted is included in the traceback. + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def nested(): + # This will get cancelled immediately. + await asyncio.sleep(10) + + async def coro(): + task = self.new_task(loop, nested()) + await asyncio.sleep(0) + task.cancel() + done, pending = await asyncio.wait([task]) + task.exception() # search target + + task = self.new_task(loop, coro()) + try: + loop.run_until_complete(task) + except asyncio.CancelledError: + tb = traceback.format_exc() + self.assert_text_contains(tb, "await asyncio.sleep(10)") + # The intermediate await should also be included. + self.assert_text_contains(tb, + "task.exception() # search target") + else: + self.fail('CancelledError did not occur') + def test_stop_while_run_in_complete(self): def gen(): @@ -889,19 +1148,21 @@ class BaseTaskTests: try: await asyncio.sleep(0.2) except asyncio.CancelledError: - await asyncio.sleep(0.1) + await asyncio.sleep(_EPSILON) raise finally: task_done = True inner_task = self.new_task(loop, inner()) - with self.assertRaises(asyncio.TimeoutError): - await asyncio.wait_for(inner_task, timeout=0.1) + await asyncio.wait_for(inner_task, timeout=_EPSILON) - self.assertTrue(task_done) + with self.assertRaises(asyncio.TimeoutError) as cm: + loop.run_until_complete(foo()) - loop.run_until_complete(foo()) + self.assertTrue(task_done) + chained = cm.exception.__context__ + self.assertEqual(type(chained), asyncio.CancelledError) def test_wait_for_waits_for_task_cancellation_w_timeout_0(self): loop = asyncio.new_event_loop() @@ -915,13 +1176,13 @@ class BaseTaskTests: try: await asyncio.sleep(10) except asyncio.CancelledError: - await asyncio.sleep(0.1) + await asyncio.sleep(_EPSILON) raise finally: task_done = True inner_task = self.new_task(loop, inner()) - await asyncio.sleep(0.1) + await asyncio.sleep(_EPSILON) await asyncio.wait_for(inner_task, timeout=0) with self.assertRaises(asyncio.TimeoutError) as cm: @@ -931,6 +1192,45 @@ class BaseTaskTests: chained = cm.exception.__context__ self.assertEqual(type(chained), asyncio.CancelledError) + def test_wait_for_reraises_exception_during_cancellation(self): + loop = asyncio.new_event_loop() + self.addCleanup(loop.close) + + class FooException(Exception): + pass + + async def foo(): + async def inner(): + try: + await asyncio.sleep(0.2) + finally: + raise FooException + + inner_task = self.new_task(loop, inner()) + + await asyncio.wait_for(inner_task, timeout=_EPSILON) + + with self.assertRaises(FooException): + loop.run_until_complete(foo()) + + def test_wait_for_raises_timeout_error_if_returned_during_cancellation(self): + loop = asyncio.new_event_loop() + self.addCleanup(loop.close) + + async def foo(): + async def inner(): + try: + await asyncio.sleep(0.2) + except asyncio.CancelledError: + return 42 + + inner_task = self.new_task(loop, inner()) + + await asyncio.wait_for(inner_task, timeout=_EPSILON) + + with self.assertRaises(asyncio.TimeoutError): + loop.run_until_complete(foo()) + def test_wait_for_self_cancellation(self): loop = asyncio.new_event_loop() self.addCleanup(loop.close) @@ -1026,12 +1326,12 @@ class BaseTaskTests: def coro(s): return s c = coro('test') - - task =self.new_task( + task = self.new_task( self.loop, asyncio.wait([c, c, coro('spam')])) - done, pending = self.loop.run_until_complete(task) + with self.assertWarns(DeprecationWarning): + done, pending = self.loop.run_until_complete(task) self.assertFalse(pending) self.assertEqual(set(f.result() for f in done), {'test', 'spam'}) @@ -1393,7 +1693,9 @@ class BaseTaskTests: futs = list(asyncio.as_completed(fs, loop=loop)) self.assertEqual(len(futs), 2) waiter = asyncio.wait(futs) - done, pending = loop.run_until_complete(waiter) + # Deprecation from passing coros in futs to asyncio.wait() + with self.assertWarns(DeprecationWarning): + done, pending = loop.run_until_complete(waiter) self.assertEqual(set(f.result() for f in done), {'a', 'b'}) def test_as_completed_duplicate_coroutines(self): @@ -1688,32 +1990,6 @@ class BaseTaskTests: self.assertEqual(res, 'test') self.assertIsNone(t2.result()) - - def test_current_task_deprecated(self): - Task = self.__class__.Task - - with self.assertWarns(DeprecationWarning): - self.assertIsNone(Task.current_task(loop=self.loop)) - - async def coro(loop): - with self.assertWarns(DeprecationWarning): - self.assertIs(Task.current_task(loop=loop), task) - - # See http://bugs.python.org/issue29271 for details: - asyncio.set_event_loop(loop) - try: - with self.assertWarns(DeprecationWarning): - self.assertIs(Task.current_task(None), task) - with self.assertWarns(DeprecationWarning): - self.assertIs(Task.current_task(), task) - finally: - asyncio.set_event_loop(None) - - task = self.new_task(self.loop, coro(self.loop)) - self.loop.run_until_complete(task) - with self.assertWarns(DeprecationWarning): - self.assertIsNone(Task.current_task(loop=self.loop)) - def test_current_task(self): self.assertIsNone(asyncio.current_task(loop=self.loop)) @@ -1798,7 +2074,8 @@ class BaseTaskTests: async def outer(): nonlocal proof - d, p = await asyncio.wait([inner()]) + with self.assertWarns(DeprecationWarning): + d, p = await asyncio.wait([inner()]) proof += 100 f = asyncio.ensure_future(outer(), loop=self.loop) @@ -2049,16 +2326,6 @@ class BaseTaskTests: self.assertIsInstance(exception, Exception) self.assertEqual(exception.args, ("foo", )) - def test_all_tasks_deprecated(self): - Task = self.__class__.Task - - async def coro(): - with self.assertWarns(DeprecationWarning): - assert Task.all_tasks(self.loop) == {t} - - t = self.new_task(self.loop, coro()) - self.loop.run_until_complete(t) - def test_log_destroyed_pending_task(self): Task = self.__class__.Task @@ -2081,15 +2348,7 @@ class BaseTaskTests: self.assertEqual(asyncio.all_tasks(loop=self.loop), {task}) - # See http://bugs.python.org/issue29271 for details: - asyncio.set_event_loop(self.loop) - try: - with self.assertWarns(DeprecationWarning): - self.assertEqual(Task.all_tasks(), {task}) - with self.assertWarns(DeprecationWarning): - self.assertEqual(Task.all_tasks(None), {task}) - finally: - asyncio.set_event_loop(None) + asyncio.set_event_loop(None) # execute the task so it waits for future self.loop._run_once() @@ -2255,31 +2514,46 @@ class BaseTaskTests: self.assertEqual(gather_task.result(), [42]) def test_cancel_gather_2(self): - loop = asyncio.new_event_loop() - self.addCleanup(loop.close) - - async def test(): - time = 0 - while True: - time += 0.05 - await asyncio.gather(asyncio.sleep(0.05), - return_exceptions=True, - loop=loop) - if time > 1: - return - - async def main(): - qwe = self.new_task(loop, test()) - await asyncio.sleep(0.2) - qwe.cancel() - try: - await qwe - except asyncio.CancelledError: - pass - else: - self.fail('gather did not propagate the cancellation request') + cases = [ + ((), ()), + ((None,), ()), + (('my message',), ('my message',)), + # Non-string values should roundtrip. + ((5,), (5,)), + ] + for cancel_args, expected_args in cases: + with self.subTest(cancel_args=cancel_args): + loop = asyncio.new_event_loop() + self.addCleanup(loop.close) + + async def test(): + time = 0 + while True: + time += 0.05 + await asyncio.gather(asyncio.sleep(0.05), + return_exceptions=True, + loop=loop) + if time > 1: + return + + async def main(): + qwe = self.new_task(loop, test()) + await asyncio.sleep(0.2) + qwe.cancel(*cancel_args) + await qwe - loop.run_until_complete(main()) + try: + loop.run_until_complete(main()) + except asyncio.CancelledError as exc: + self.assertEqual(exc.args, ()) + exc_type, exc_args, depth = get_innermost_context(exc) + self.assertEqual((exc_type, exc_args), + (asyncio.CancelledError, expected_args)) + # The exact traceback seems to vary in CI. + self.assertIn(depth, (2, 3)) + else: + self.fail('gather did not propagate the cancellation ' + 'request') def test_exception_traceback(self): # See http://bugs.python.org/issue28843 @@ -2772,8 +3046,6 @@ class BaseTaskIntrospectionTests: self.assertEqual(asyncio.all_tasks(loop), set()) self._register_task(task) self.assertEqual(asyncio.all_tasks(loop), set()) - with self.assertWarns(DeprecationWarning): - self.assertEqual(asyncio.Task.all_tasks(loop), {task}) self._unregister_task(task) def test__enter_task(self): @@ -3283,6 +3555,8 @@ class RunCoroutineThreadsafeTests(test_utils.TestCase): self.loop.set_exception_handler(callback) # Set corrupted task factory + self.addCleanup(self.loop.set_task_factory, + self.loop.get_task_factory()) self.loop.set_task_factory(task_factory) # Run event loop @@ -3352,6 +3626,17 @@ class WaitTests(test_utils.TestCase): self.loop.run_until_complete( asyncio.wait_for(coroutine_function(), 0.01, loop=self.loop)) + def test_coro_is_deprecated_in_wait(self): + # Remove test when passing coros to asyncio.wait() is removed in 3.11 + with self.assertWarns(DeprecationWarning): + self.loop.run_until_complete( + asyncio.wait([coroutine_function()])) + + task = self.loop.create_task(coroutine_function()) + with self.assertWarns(DeprecationWarning): + self.loop.run_until_complete( + asyncio.wait([task, coroutine_function()])) + class CompatibilityTests(test_utils.TestCase): # Tests for checking a bridge between old-styled coroutines diff --git a/Lib/test/test_asyncio/test_threads.py b/Lib/test/test_asyncio/test_threads.py new file mode 100644 index 00000000..2af32242 --- /dev/null +++ b/Lib/test/test_asyncio/test_threads.py @@ -0,0 +1,93 @@ +"""Tests for asyncio/threads.py""" + +import asyncio +import unittest + +from contextvars import ContextVar +from unittest import mock +from test.test_asyncio import utils as test_utils + + +def tearDownModule(): + asyncio.set_event_loop_policy(None) + + +class ToThreadTests(test_utils.TestCase): + def setUp(self): + super().setUp() + self.loop = asyncio.new_event_loop() + asyncio.set_event_loop(self.loop) + + def tearDown(self): + self.loop.run_until_complete( + self.loop.shutdown_default_executor()) + self.loop.close() + asyncio.set_event_loop(None) + self.loop = None + super().tearDown() + + def test_to_thread(self): + async def main(): + return await asyncio.to_thread(sum, [40, 2]) + + result = self.loop.run_until_complete(main()) + self.assertEqual(result, 42) + + def test_to_thread_exception(self): + def raise_runtime(): + raise RuntimeError("test") + + async def main(): + await asyncio.to_thread(raise_runtime) + + with self.assertRaisesRegex(RuntimeError, "test"): + self.loop.run_until_complete(main()) + + def test_to_thread_once(self): + func = mock.Mock() + + async def main(): + await asyncio.to_thread(func) + + self.loop.run_until_complete(main()) + func.assert_called_once() + + def test_to_thread_concurrent(self): + func = mock.Mock() + + async def main(): + futs = [] + for _ in range(10): + fut = asyncio.to_thread(func) + futs.append(fut) + await asyncio.gather(*futs) + + self.loop.run_until_complete(main()) + self.assertEqual(func.call_count, 10) + + def test_to_thread_args_kwargs(self): + # Unlike run_in_executor(), to_thread() should directly accept kwargs. + func = mock.Mock() + + async def main(): + await asyncio.to_thread(func, 'test', something=True) + + self.loop.run_until_complete(main()) + func.assert_called_once_with('test', something=True) + + def test_to_thread_contextvars(self): + test_ctx = ContextVar('test_ctx') + + def get_ctx(): + return test_ctx.get() + + async def main(): + test_ctx.set('parrot') + return await asyncio.to_thread(get_ctx) + + result = self.loop.run_until_complete(main()) + self.assertEqual(result, 'parrot') + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index 5487b7af..10bd46de 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -15,6 +15,7 @@ import threading import unittest from unittest import mock from test import support +from test.support import socket_helper if sys.platform == 'win32': raise unittest.SkipTest('UNIX only') @@ -273,7 +274,7 @@ class SelectorEventLoopUnixSocketTests(test_utils.TestCase): self.loop = asyncio.SelectorEventLoop() self.set_event_loop(self.loop) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_unix_server_existing_path_sock(self): with test_utils.unix_socket_path() as path: sock = socket.socket(socket.AF_UNIX) @@ -286,7 +287,7 @@ class SelectorEventLoopUnixSocketTests(test_utils.TestCase): srv.close() self.loop.run_until_complete(srv.wait_closed()) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_unix_server_pathlib(self): with test_utils.unix_socket_path() as path: path = pathlib.Path(path) @@ -344,7 +345,7 @@ class SelectorEventLoopUnixSocketTests(test_utils.TestCase): @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'), 'no socket.SOCK_NONBLOCK (linux only)') - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_unix_server_path_stream_bittype(self): sock = socket.socket( socket.AF_UNIX, socket.SOCK_STREAM | socket.SOCK_NONBLOCK) @@ -497,12 +498,12 @@ class SelectorEventLoopUnixSockSendfileTests(test_utils.TestCase): def prepare(self): sock = self.make_socket() proto = self.MyProto(self.loop) - port = support.find_unused_port() + port = socket_helper.find_unused_port() srv_sock = self.make_socket(cleanup=False) - srv_sock.bind((support.HOST, port)) + srv_sock.bind((socket_helper.HOST, port)) server = self.run_loop(self.loop.create_server( lambda: proto, sock=srv_sock)) - self.run_loop(self.loop.sock_connect(sock, (support.HOST, port))) + self.run_loop(self.loop.sock_connect(sock, (socket_helper.HOST, port))) self.run_loop(proto._ready) def cleanup(): diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py index 5b4bb123..804db916 100644 --- a/Lib/test/test_asyncio/utils.py +++ b/Lib/test/test_asyncio/utils.py @@ -107,7 +107,7 @@ def run_briefly(loop): gen.close() -def run_until(loop, pred, timeout=30): +def run_until(loop, pred, timeout=support.SHORT_TIMEOUT): deadline = time.monotonic() + timeout while not pred(): if timeout is not None: @@ -139,7 +139,7 @@ class SilentWSGIRequestHandler(WSGIRequestHandler): class SilentWSGIServer(WSGIServer): - request_timeout = 2 + request_timeout = support.LOOPBACK_TIMEOUT def get_request(self): request, client_addr = super().get_request() @@ -220,7 +220,7 @@ if hasattr(socket, 'AF_UNIX'): class UnixWSGIServer(UnixHTTPServer, WSGIServer): - request_timeout = 2 + request_timeout = support.LOOPBACK_TIMEOUT def server_bind(self): UnixHTTPServer.server_bind(self) @@ -509,9 +509,11 @@ def get_function_source(func): class TestCase(unittest.TestCase): @staticmethod def close_loop(loop): - executor = loop._default_executor - if executor is not None: - executor.shutdown(wait=True) + if loop._default_executor is not None: + if not loop.is_closed(): + loop.run_until_complete(loop.shutdown_default_executor()) + else: + loop._default_executor.shutdown(wait=True) loop.close() policy = support.maybe_get_event_loop_policy() if policy is not None: diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py index 3fcedb58..3c3abe41 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -10,13 +10,13 @@ import struct import threading from test import support +from test.support import socket_helper from io import BytesIO if support.PGO: raise unittest.SkipTest("test is not helpful for PGO") -TIMEOUT = 3 HAS_UNIX_SOCKETS = hasattr(socket, 'AF_UNIX') class dummysocket: @@ -92,7 +92,7 @@ def bind_af_aware(sock, addr): if HAS_UNIX_SOCKETS and sock.family == socket.AF_UNIX: # Make sure the path doesn't exist. support.unlink(addr) - support.bind_unix_socket(sock, addr) + socket_helper.bind_unix_socket(sock, addr) else: sock.bind(addr) @@ -328,7 +328,7 @@ class DispatcherWithSendTests(unittest.TestCase): evt = threading.Event() sock = socket.socket() sock.settimeout(3) - port = support.bind_port(sock) + port = socket_helper.bind_port(sock) cap = BytesIO() args = (evt, cap, sock) @@ -342,7 +342,7 @@ class DispatcherWithSendTests(unittest.TestCase): data = b"Suppose there isn't a 16-ton weight?" d = dispatcherwithsend_noread() d.create_socket() - d.connect((support.HOST, port)) + d.connect((socket_helper.HOST, port)) # give time for socket to connect time.sleep(0.1) @@ -360,7 +360,7 @@ class DispatcherWithSendTests(unittest.TestCase): self.assertEqual(cap.getvalue(), data*2) finally: - support.join_thread(t, timeout=TIMEOUT) + support.join_thread(t) @unittest.skipUnless(hasattr(asyncore, 'file_wrapper'), @@ -788,16 +788,16 @@ class BaseTestAPI: except OSError: pass finally: - support.join_thread(t, timeout=TIMEOUT) + support.join_thread(t) class TestAPI_UseIPv4Sockets(BaseTestAPI): family = socket.AF_INET - addr = (support.HOST, 0) + addr = (socket_helper.HOST, 0) -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 support required') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 support required') class TestAPI_UseIPv6Sockets(BaseTestAPI): family = socket.AF_INET6 - addr = (support.HOSTv6, 0) + addr = (socket_helper.HOSTv6, 0) @unittest.skipUnless(HAS_UNIX_SOCKETS, 'Unix sockets required') class TestAPI_UseUnixSockets(BaseTestAPI): diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 7dba6635..1dbeac41 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -18,14 +18,6 @@ class LegacyBase64TestCase(unittest.TestCase): int_data = memoryview(b"1234").cast('I') self.assertRaises(TypeError, f, int_data) - def test_encodestring_warns(self): - with self.assertWarns(DeprecationWarning): - base64.encodestring(b"www.python.org") - - def test_decodestring_warns(self): - with self.assertWarns(DeprecationWarning): - base64.decodestring(b"d3d3LnB5dGhvbi5vcmc=\n") - def test_encodebytes(self): eq = self.assertEqual eq(base64.encodebytes(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n") diff --git a/Lib/test/test_bigaddrspace.py b/Lib/test/test_bigaddrspace.py index b639f68c..aa1f8ca7 100644 --- a/Lib/test/test_bigaddrspace.py +++ b/Lib/test/test_bigaddrspace.py @@ -55,7 +55,7 @@ class BytesTest(unittest.TestCase): class StrTest(unittest.TestCase): - unicodesize = 2 if sys.maxunicode < 65536 else 4 + unicodesize = 4 @bigaddrspacetest def test_concat(self): diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index 08de5c9f..45327953 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -4,6 +4,7 @@ import unittest import binascii import array import re +from test import support # Note: "*_hex" functions are aliases for "(un)hexlify" b2a_functions = ['b2a_base64', 'b2a_hex', 'b2a_hqx', 'b2a_qp', 'b2a_uu', @@ -36,6 +37,7 @@ class BinASCIITest(unittest.TestCase): self.assertTrue(hasattr(getattr(binascii, name), '__call__')) self.assertRaises(TypeError, getattr(binascii, name)) + @support.ignore_warnings(category=DeprecationWarning) def test_returned_value(self): # Limit to the minimum of all limits (b2a_uu) MAX_ALL = 45 @@ -179,6 +181,7 @@ class BinASCIITest(unittest.TestCase): with self.assertRaises(TypeError): binascii.b2a_uu(b"", True) + @support.ignore_warnings(category=DeprecationWarning) def test_crc_hqx(self): crc = binascii.crc_hqx(self.type2test(b"Test the CRC-32 of"), 0) crc = binascii.crc_hqx(self.type2test(b" this string."), crc) @@ -198,6 +201,7 @@ class BinASCIITest(unittest.TestCase): self.assertRaises(TypeError, binascii.crc32) + @support.ignore_warnings(category=DeprecationWarning) def test_hqx(self): # Perform binhex4 style RLE-compression # Then calculate the hexbin4 binary-to-ASCII translation @@ -208,6 +212,7 @@ class BinASCIITest(unittest.TestCase): res = binascii.rledecode_hqx(b) self.assertEqual(res, self.rawdata) + @support.ignore_warnings(category=DeprecationWarning) def test_rle(self): # test repetition with a repetition longer than the limit of 255 data = (b'a' * 100 + b'b' + b'c' * 300) @@ -354,6 +359,7 @@ class BinASCIITest(unittest.TestCase): self.assertEqual(b2a_qp(type2test(b'a.\n')), b'a.\n') self.assertEqual(b2a_qp(type2test(b'.a')[:-1]), b'=2E') + @support.ignore_warnings(category=DeprecationWarning) def test_empty_string(self): # A test for SF bug #1022953. Make sure SystemError is not raised. empty = self.type2test(b'') @@ -378,6 +384,7 @@ class BinASCIITest(unittest.TestCase): # crc_hqx needs 2 arguments self.assertRaises(TypeError, binascii.crc_hqx, "test", 0) + @support.ignore_warnings(category=DeprecationWarning) def test_unicode_a2b(self): # Unicode strings are accepted by a2b_* functions. MAX_ALL = 45 @@ -416,6 +423,18 @@ class BinASCIITest(unittest.TestCase): self.assertEqual(binascii.b2a_base64(b, newline=False), b'aGVsbG8=') + def test_deprecated_warnings(self): + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.b2a_hqx(b'abc'), b'B@*M') + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.a2b_hqx(b'B@*M'), (b'abc', 0)) + + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.rlecode_hqx(b'a' * 10), b'a\x90\n') + + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.rledecode_hqx(b'a\x90\n'), b'a' * 10) + class ArrayBinASCIITest(BinASCIITest): def type2test(self, s): diff --git a/Lib/test/test_binhex.py b/Lib/test/test_binhex.py index 2f3d53af..591f32a4 100644 --- a/Lib/test/test_binhex.py +++ b/Lib/test/test_binhex.py @@ -3,17 +3,20 @@ Uses the mechanism of the python binhex module Based on an original test by Roger E. Masse. """ -import binhex import unittest from test import support +with support.check_warnings(('', DeprecationWarning)): + binhex = support.import_fresh_module('binhex') + class BinHexTestCase(unittest.TestCase): def setUp(self): - self.fname1 = support.TESTFN + "1" - self.fname2 = support.TESTFN + "2" - self.fname3 = support.TESTFN + "very_long_filename__very_long_filename__very_long_filename__very_long_filename__" + # binhex supports only file names encodable to Latin1 + self.fname1 = support.TESTFN_ASCII + "1" + self.fname2 = support.TESTFN_ASCII + "2" + self.fname3 = support.TESTFN_ASCII + "very_long_filename__very_long_filename__very_long_filename__very_long_filename__" def tearDown(self): support.unlink(self.fname1) diff --git a/Lib/test/test_buffer.py b/Lib/test/test_buffer.py index dcea2063..d440bcf7 100644 --- a/Lib/test/test_buffer.py +++ b/Lib/test/test_buffer.py @@ -45,6 +45,11 @@ try: except ImportError: numpy_array = None +try: + import _testcapi +except ImportError: + _testcapi = None + SHORT_TEST = True @@ -966,8 +971,6 @@ class TestBufferProtocol(unittest.TestCase): m.tobytes() # Releasing mm didn't release m def verify_getbuf(self, orig_ex, ex, req, sliced=False): - def simple_fmt(ex): - return ex.format == '' or ex.format == 'B' def match(req, flag): return ((req&flag) == flag) @@ -2525,7 +2528,7 @@ class TestBufferProtocol(unittest.TestCase): values = [INT(9), IDX(9), 2.2+3j, Decimal("-21.1"), 12.2, Fraction(5, 2), [1,2,3], {4,5,6}, {7:8}, (), (9,), - True, False, None, NotImplemented, + True, False, None, Ellipsis, b'a', b'abc', bytearray(b'a'), bytearray(b'abc'), 'a', 'abc', r'a', r'abc', f, lambda x: x] @@ -4418,6 +4421,13 @@ class TestBufferProtocol(unittest.TestCase): x = ndarray([1,2,3], shape=[3], flags=ND_GETBUF_FAIL) self.assertRaises(BufferError, memoryview, x) + @support.cpython_only + def test_pybuffer_size_from_format(self): + # basic tests + for format in ('', 'ii', '3s'): + self.assertEqual(_testcapi.PyBuffer_SizeFromFormat(format), + struct.calcsize(format)) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 4a498262..4df1b95b 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -25,6 +25,7 @@ from itertools import product from textwrap import dedent from types import AsyncGeneratorType, FunctionType from operator import neg +from test import support from test.support import ( EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink, maybe_get_event_loop_policy) @@ -326,8 +327,8 @@ class BuiltinTest(unittest.TestCase): bom = b'\xef\xbb\xbf' compile(bom + b'print(1)\n', '', 'exec') compile(source='pass', filename='?', mode='exec') - compile(dont_inherit=0, filename='tmp', source='0', mode='eval') - compile('pass', '?', dont_inherit=1, mode='exec') + compile(dont_inherit=False, filename='tmp', source='0', mode='eval') + compile('pass', '?', dont_inherit=True, mode='exec') compile(memoryview(b"text"), "name", "exec") self.assertRaises(TypeError, compile) self.assertRaises(ValueError, compile, 'print(42)\n', '', 'badmode') @@ -831,6 +832,7 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(hash('spam'), hash(b'spam')) hash((0,1,2,3)) def f(): pass + hash(f) self.assertRaises(TypeError, hash, []) self.assertRaises(TypeError, hash, {}) # Bug 1536021: Allow hash to return long objects @@ -1014,7 +1016,12 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(max(1, 2.0, 3), 3) self.assertEqual(max(1.0, 2, 3), 3) - self.assertRaises(TypeError, max) + with self.assertRaisesRegex( + TypeError, + 'max expected at least 1 argument, got 0' + ): + max() + self.assertRaises(TypeError, max, 42) self.assertRaises(ValueError, max, ()) class BadSeq: @@ -1068,7 +1075,12 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(min(1, 2.0, 3), 1) self.assertEqual(min(1.0, 2, 3), 1.0) - self.assertRaises(TypeError, min) + with self.assertRaisesRegex( + TypeError, + 'min expected at least 1 argument, got 0' + ): + min() + self.assertRaises(TypeError, min, 42) self.assertRaises(ValueError, min, ()) class BadSeq: @@ -1457,6 +1469,24 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(sum(range(10), 1000), 1045) self.assertEqual(sum(range(10), start=1000), 1045) + self.assertEqual(sum(range(10), 2**31-5), 2**31+40) + self.assertEqual(sum(range(10), 2**63-5), 2**63+40) + + self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5) + self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3), + 2**31+2) + self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3), + 2**63+2) + self.assertIs(sum([], False), False) + + self.assertEqual(sum(i / 2 for i in range(10)), 22.5) + self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5) + self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75) + self.assertEqual(sum([0.5, 1]), 1.5) + self.assertEqual(sum([1, 0.5]), 1.5) + self.assertEqual(repr(sum([-0.0])), '0.0') + self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0') + self.assertEqual(repr(sum([], -0.0)), '-0.0') self.assertRaises(TypeError, sum) self.assertRaises(TypeError, sum, 42) @@ -1468,6 +1498,9 @@ class BuiltinTest(unittest.TestCase): self.assertRaises(TypeError, sum, [[1], [2], [3]]) self.assertRaises(TypeError, sum, [{2:3}]) self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3}) + self.assertRaises(TypeError, sum, [], '') + self.assertRaises(TypeError, sum, [], b'') + self.assertRaises(TypeError, sum, [], bytearray()) class BadSeq: def __getitem__(self, index): @@ -1700,6 +1733,20 @@ class BuiltinTest(unittest.TestCase): self.assertRaises(TypeError, tp, 1, 2) self.assertRaises(TypeError, tp, a=1, b=2) + def test_warning_notimplemented(self): + # Issue #35712: NotImplemented is a sentinel value that should never + # be evaluated in a boolean context (virtually all such use cases + # are a result of accidental misuse implementing rich comparison + # operations in terms of one another). + # For the time being, it will continue to evaluate as truthy, but + # issue a deprecation warning (with the eventual intent to make it + # a TypeError). + self.assertWarns(DeprecationWarning, bool, NotImplemented) + with self.assertWarns(DeprecationWarning): + self.assertTrue(NotImplemented) + with self.assertWarns(DeprecationWarning): + self.assertFalse(not NotImplemented) + class TestBreakpoint(unittest.TestCase): def setUp(self): @@ -1834,6 +1881,7 @@ class PtyTests(unittest.TestCase): os.close(w) self.skipTest("pty.fork() raised {}".format(e)) raise + if pid == 0: # Child try: @@ -1847,9 +1895,11 @@ class PtyTests(unittest.TestCase): finally: # We don't want to return to unittest... os._exit(0) + # Parent os.close(w) os.write(fd, terminal_input) + # Get results from the pipe with open(r, "r") as rpipe: lines = [] @@ -1859,6 +1909,7 @@ class PtyTests(unittest.TestCase): # The other end was closed => the child exited break lines.append(line) + # Check the result was got and corresponds to the user's terminal input if len(lines) != 2: # Something went wrong, try to get at stderr @@ -1881,8 +1932,7 @@ class PtyTests(unittest.TestCase): # completion, otherwise the child process hangs on AIX. os.close(fd) - # Wait until the child process completes - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) return lines @@ -1954,7 +2004,7 @@ class TestSorted(unittest.TestCase): self.assertEqual(data, sorted(copy, key=lambda x: -x)) self.assertNotEqual(data, copy) random.shuffle(copy) - self.assertEqual(data, sorted(copy, reverse=1)) + self.assertEqual(data, sorted(copy, reverse=True)) self.assertNotEqual(data, copy) def test_bad_arguments(self): diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index bbd45c75..770e2c55 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -12,12 +12,14 @@ import copy import functools import pickle import tempfile +import textwrap import unittest import test.support import test.string_tests import test.list_tests from test.support import bigaddrspacetest, MAX_Py_ssize_t +from test.support.script_helper import assert_python_failure if sys.flags.bytes_warning: @@ -315,6 +317,62 @@ class BaseBytesTest: # Default encoding is utf-8 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603') + def test_check_encoding_errors(self): + # bpo-37388: bytes(str) and bytes.encode() must check encoding + # and errors arguments in dev mode + invalid = 'Boom, Shaka Laka, Boom!' + encodings = ('ascii', 'utf8', 'latin1') + code = textwrap.dedent(f''' + import sys + type2test = {self.type2test.__name__} + encodings = {encodings!r} + + for data in ('', 'short string'): + try: + type2test(data, encoding={invalid!r}) + except LookupError: + pass + else: + sys.exit(21) + + for encoding in encodings: + try: + type2test(data, encoding=encoding, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(22) + + for data in (b'', b'short string'): + data = type2test(data) + print(repr(data)) + try: + data.decode(encoding={invalid!r}) + except LookupError: + sys.exit(10) + else: + sys.exit(23) + + try: + data.decode(errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(24) + + for encoding in encodings: + try: + data.decode(encoding=encoding, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(25) + + sys.exit(10) + ''') + proc = assert_python_failure('-X', 'dev', '-c', code) + self.assertEqual(proc.rc, 10, proc) + def test_from_int(self): b = self.type2test(0) self.assertEqual(b, self.type2test()) @@ -489,9 +547,13 @@ class BaseBytesTest: self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd") self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd") # Stress it with many items - seq = [b"abc"] * 1000 - expected = b"abc" + b".:abc" * 999 + seq = [b"abc"] * 100000 + expected = b"abc" + b".:abc" * 99999 self.assertEqual(dot_join(seq), expected) + # Stress test with empty separator + seq = [b"abc"] * 100000 + expected = b"abc" * 100000 + self.assertEqual(self.type2test(b"").join(seq), expected) self.assertRaises(TypeError, self.type2test(b" ").join, None) # Error handling and cleanup when some item in the middle of the # sequence has the wrong type. @@ -904,6 +966,15 @@ class BaseBytesTest: c = b.translate(None, delete=b'e') self.assertEqual(c, b'hllo') + def test_sq_item(self): + _testcapi = test.support.import_module('_testcapi') + obj = self.type2test((42,)) + with self.assertRaises(IndexError): + _testcapi.sequence_getitem(obj, -2) + with self.assertRaises(IndexError): + _testcapi.sequence_getitem(obj, 1) + self.assertEqual(_testcapi.sequence_getitem(obj, 0), 42) + class BytesTest(BaseBytesTest, unittest.TestCase): type2test = bytes diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index 2591f0a6..1fce9d82 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -100,6 +100,9 @@ class BZ2FileTest(BaseTest): self.assertRaises(ValueError, BZ2File, os.devnull, compresslevel=0) self.assertRaises(ValueError, BZ2File, os.devnull, compresslevel=10) + # compresslevel is keyword-only + self.assertRaises(TypeError, BZ2File, os.devnull, "r", 3) + def testRead(self): self.createTempFile() with BZ2File(self.filename) as bz2f: @@ -707,7 +710,7 @@ class BZ2DecompressorTest(BaseTest): def testDecompress4G(self, size): # "Test BZ2Decompressor.decompress() with >4GiB input" blocksize = 10 * 1024 * 1024 - block = random.getrandbits(blocksize * 8).to_bytes(blocksize, 'little') + block = random.randbytes(blocksize) try: data = block * (size // blocksize + 1) compressed = bz2.compress(data) diff --git a/Lib/test/test_c_locale_coercion.py b/Lib/test/test_c_locale_coercion.py index 418f9b61..fcc85992 100644 --- a/Lib/test/test_c_locale_coercion.py +++ b/Lib/test/test_c_locale_coercion.py @@ -49,6 +49,10 @@ elif sys.platform == "cygwin": # TODO: Work out a robust dynamic test for this that doesn't rely on # CPython's own locale handling machinery EXPECT_COERCION_IN_DEFAULT_LOCALE = False +elif sys.platform == "vxworks": + # VxWorks defaults to using UTF-8 for all system interfaces + EXPECTED_C_LOCALE_STREAM_ENCODING = "utf-8" + EXPECTED_C_LOCALE_FS_ENCODING = "utf-8" # Note that the above expectations are still wrong in some cases, such as: # * Windows when PYTHONLEGACYWINDOWSFSENCODING is set diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index 0bff7ded..451a7170 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -1,4 +1,3 @@ -import datetime import unittest from test.support import cpython_only try: @@ -27,125 +26,6 @@ class FunctionCalls(unittest.TestCase): self.assertEqual(list(res.items()), expected) -# The test cases here cover several paths through the function calling -# code. They depend on the METH_XXX flag that is used to define a C -# function, which can't be verified from Python. If the METH_XXX decl -# for a C function changes, these tests may not cover the right paths. - -class CFunctionCalls(unittest.TestCase): - - def test_varargs0(self): - self.assertRaises(TypeError, {}.__contains__) - - def test_varargs1(self): - {}.__contains__(0) - - def test_varargs2(self): - self.assertRaises(TypeError, {}.__contains__, 0, 1) - - def test_varargs0_ext(self): - try: - {}.__contains__(*()) - except TypeError: - pass - - def test_varargs1_ext(self): - {}.__contains__(*(0,)) - - def test_varargs2_ext(self): - try: - {}.__contains__(*(1, 2)) - except TypeError: - pass - else: - raise RuntimeError - - def test_varargs1_kw(self): - self.assertRaises(TypeError, {}.__contains__, x=2) - - def test_varargs2_kw(self): - self.assertRaises(TypeError, {}.__contains__, x=2, y=2) - - def test_oldargs0_0(self): - {}.keys() - - def test_oldargs0_1(self): - self.assertRaises(TypeError, {}.keys, 0) - - def test_oldargs0_2(self): - self.assertRaises(TypeError, {}.keys, 0, 1) - - def test_oldargs0_0_ext(self): - {}.keys(*()) - - def test_oldargs0_1_ext(self): - try: - {}.keys(*(0,)) - except TypeError: - pass - else: - raise RuntimeError - - def test_oldargs0_2_ext(self): - try: - {}.keys(*(1, 2)) - except TypeError: - pass - else: - raise RuntimeError - - def test_oldargs0_0_kw(self): - try: - {}.keys(x=2) - except TypeError: - pass - else: - raise RuntimeError - - def test_oldargs0_1_kw(self): - self.assertRaises(TypeError, {}.keys, x=2) - - def test_oldargs0_2_kw(self): - self.assertRaises(TypeError, {}.keys, x=2, y=2) - - def test_oldargs1_0(self): - self.assertRaises(TypeError, [].count) - - def test_oldargs1_1(self): - [].count(1) - - def test_oldargs1_2(self): - self.assertRaises(TypeError, [].count, 1, 2) - - def test_oldargs1_0_ext(self): - try: - [].count(*()) - except TypeError: - pass - else: - raise RuntimeError - - def test_oldargs1_1_ext(self): - [].count(*(1,)) - - def test_oldargs1_2_ext(self): - try: - [].count(*(1, 2)) - except TypeError: - pass - else: - raise RuntimeError - - def test_oldargs1_0_kw(self): - self.assertRaises(TypeError, [].count, x=2) - - def test_oldargs1_1_kw(self): - self.assertRaises(TypeError, [].count, {}, x=2) - - def test_oldargs1_2_kw(self): - self.assertRaises(TypeError, [].count, x=2, y=2) - - @cpython_only class CFunctionCallsErrorMessages(unittest.TestCase): @@ -193,7 +73,7 @@ class CFunctionCallsErrorMessages(unittest.TestCase): self.assertRaisesRegex(TypeError, msg, bool, x=2) def test_varargs4_kw(self): - msg = r"^index\(\) takes no keyword arguments$" + msg = r"^list[.]index\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, [].index, x=2) def test_varargs5_kw(self): @@ -209,19 +89,19 @@ class CFunctionCallsErrorMessages(unittest.TestCase): self.assertRaisesRegex(TypeError, msg, next, x=2) def test_varargs8_kw(self): - msg = r"^pack\(\) takes no keyword arguments$" + msg = r"^_struct[.]pack\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, struct.pack, x=2) def test_varargs9_kw(self): - msg = r"^pack_into\(\) takes no keyword arguments$" + msg = r"^_struct[.]pack_into\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, struct.pack_into, x=2) def test_varargs10_kw(self): - msg = r"^index\(\) takes no keyword arguments$" + msg = r"^deque[.]index\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, collections.deque().index, x=2) def test_varargs11_kw(self): - msg = r"^pack\(\) takes no keyword arguments$" + msg = r"^Struct[.]pack\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, struct.Struct.pack, struct.Struct(""), x=2) def test_varargs12_kw(self): @@ -289,6 +169,176 @@ class CFunctionCallsErrorMessages(unittest.TestCase): self.assertRaisesRegex(TypeError, msg, [].count, x=2, y=2) + +class TestCallingConventions(unittest.TestCase): + """Test calling using various C calling conventions (METH_*) from Python + + Subclasses test several kinds of functions (module-level, methods, + class methods static methods) using these attributes: + obj: the object that contains tested functions (as attributes) + expected_self: expected "self" argument to the C function + + The base class tests module-level functions. + """ + + def setUp(self): + self.obj = self.expected_self = _testcapi + + def test_varargs(self): + self.assertEqual( + self.obj.meth_varargs(1, 2, 3), + (self.expected_self, (1, 2, 3)), + ) + + def test_varargs_ext(self): + self.assertEqual( + self.obj.meth_varargs(*(1, 2, 3)), + (self.expected_self, (1, 2, 3)), + ) + + def test_varargs_error_kw(self): + msg = r"meth_varargs\(\) takes no keyword arguments" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_varargs(k=1), + ) + + def test_varargs_keywords(self): + self.assertEqual( + self.obj.meth_varargs_keywords(1, 2, a=3, b=4), + (self.expected_self, (1, 2), {'a': 3, 'b': 4}) + ) + + def test_varargs_keywords_ext(self): + self.assertEqual( + self.obj.meth_varargs_keywords(*[1, 2], **{'a': 3, 'b': 4}), + (self.expected_self, (1, 2), {'a': 3, 'b': 4}) + ) + + def test_o(self): + self.assertEqual(self.obj.meth_o(1), (self.expected_self, 1)) + + def test_o_ext(self): + self.assertEqual(self.obj.meth_o(*[1]), (self.expected_self, 1)) + + def test_o_error_no_arg(self): + msg = r"meth_o\(\) takes exactly one argument \(0 given\)" + self.assertRaisesRegex(TypeError, msg, self.obj.meth_o) + + def test_o_error_two_args(self): + msg = r"meth_o\(\) takes exactly one argument \(2 given\)" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_o(1, 2), + ) + + def test_o_error_ext(self): + msg = r"meth_o\(\) takes exactly one argument \(3 given\)" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_o(*(1, 2, 3)), + ) + + def test_o_error_kw(self): + msg = r"meth_o\(\) takes no keyword arguments" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_o(k=1), + ) + + def test_o_error_arg_kw(self): + msg = r"meth_o\(\) takes no keyword arguments" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_o(k=1), + ) + + def test_noargs(self): + self.assertEqual(self.obj.meth_noargs(), self.expected_self) + + def test_noargs_ext(self): + self.assertEqual(self.obj.meth_noargs(*[]), self.expected_self) + + def test_noargs_error_arg(self): + msg = r"meth_noargs\(\) takes no arguments \(1 given\)" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_noargs(1), + ) + + def test_noargs_error_arg2(self): + msg = r"meth_noargs\(\) takes no arguments \(2 given\)" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_noargs(1, 2), + ) + + def test_noargs_error_ext(self): + msg = r"meth_noargs\(\) takes no arguments \(3 given\)" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_noargs(*(1, 2, 3)), + ) + + def test_noargs_error_kw(self): + msg = r"meth_noargs\(\) takes no keyword arguments" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_noargs(k=1), + ) + + def test_fastcall(self): + self.assertEqual( + self.obj.meth_fastcall(1, 2, 3), + (self.expected_self, (1, 2, 3)), + ) + + def test_fastcall_ext(self): + self.assertEqual( + self.obj.meth_fastcall(*(1, 2, 3)), + (self.expected_self, (1, 2, 3)), + ) + + def test_fastcall_error_kw(self): + msg = r"meth_fastcall\(\) takes no keyword arguments" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_fastcall(k=1), + ) + + def test_fastcall_keywords(self): + self.assertEqual( + self.obj.meth_fastcall_keywords(1, 2, a=3, b=4), + (self.expected_self, (1, 2), {'a': 3, 'b': 4}) + ) + + def test_fastcall_keywords_ext(self): + self.assertEqual( + self.obj.meth_fastcall_keywords(*(1, 2), **{'a': 3, 'b': 4}), + (self.expected_self, (1, 2), {'a': 3, 'b': 4}) + ) + + +class TestCallingConventionsInstance(TestCallingConventions): + """Test calling instance methods using various calling conventions""" + + def setUp(self): + self.obj = self.expected_self = _testcapi.MethInstance() + + +class TestCallingConventionsClass(TestCallingConventions): + """Test calling class methods using various calling conventions""" + + def setUp(self): + self.obj = self.expected_self = _testcapi.MethClass + + +class TestCallingConventionsClassInstance(TestCallingConventions): + """Test calling class methods on instance""" + + def setUp(self): + self.obj = _testcapi.MethClass() + self.expected_self = _testcapi.MethClass + + +class TestCallingConventionsStatic(TestCallingConventions): + """Test calling static methods using various calling conventions""" + + def setUp(self): + self.obj = _testcapi.MethStatic() + self.expected_self = None + + def pyfunc(arg1, arg2): return [arg1, arg2] @@ -315,14 +365,14 @@ class PythonClass: PYTHON_INSTANCE = PythonClass() +NULL_OR_EMPTY = object() -IGNORE_RESULT = object() - - -@cpython_only class FastCallTests(unittest.TestCase): + """Test calling using various callables from C + """ + # Test calls with positional arguments - CALLS_POSARGS = ( + CALLS_POSARGS = [ # (func, args: tuple, result) # Python function with 2 arguments @@ -341,31 +391,11 @@ class FastCallTests(unittest.TestCase): (PYTHON_INSTANCE.class_method, (), "classmethod"), (PYTHON_INSTANCE.static_method, (), "staticmethod"), - # C function: METH_NOARGS - (globals, (), IGNORE_RESULT), - - # C function: METH_O - (id, ("hello",), IGNORE_RESULT), - - # C function: METH_VARARGS - (dir, (1,), IGNORE_RESULT), - - # C function: METH_VARARGS | METH_KEYWORDS - (min, (5, 9), 5), - - # C function: METH_FASTCALL - (divmod, (1000, 33), (30, 10)), - - # C type static method: METH_FASTCALL | METH_CLASS - (int.from_bytes, (b'\x01\x00', 'little'), 1), - - # bpo-30524: Test that calling a C type static method with no argument - # doesn't crash (ignore the result): METH_FASTCALL | METH_CLASS - (datetime.datetime.now, (), IGNORE_RESULT), - ) + # C callables are added later + ] # Test calls with positional and keyword arguments - CALLS_KWARGS = ( + CALLS_KWARGS = [ # (func, args: tuple, kwargs: dict, result) # Python function with 2 arguments @@ -376,17 +406,51 @@ class FastCallTests(unittest.TestCase): (PYTHON_INSTANCE.method, (1,), {'arg2': 2}, [1, 2]), (PYTHON_INSTANCE.method, (), {'arg1': 1, 'arg2': 2}, [1, 2]), - # C function: METH_VARARGS | METH_KEYWORDS - (max, ([],), {'default': 9}, 9), - - # C type static method: METH_FASTCALL | METH_CLASS - (int.from_bytes, (b'\x01\x00',), {'byteorder': 'little'}, 1), - (int.from_bytes, (), {'bytes': b'\x01\x00', 'byteorder': 'little'}, 1), - ) + # C callables are added later + ] + + # Add all the calling conventions and variants of C callables + _instance = _testcapi.MethInstance() + for obj, expected_self in ( + (_testcapi, _testcapi), # module-level function + (_instance, _instance), # bound method + (_testcapi.MethClass, _testcapi.MethClass), # class method on class + (_testcapi.MethClass(), _testcapi.MethClass), # class method on inst. + (_testcapi.MethStatic, None), # static method + ): + CALLS_POSARGS.extend([ + (obj.meth_varargs, (1, 2), (expected_self, (1, 2))), + (obj.meth_varargs_keywords, + (1, 2), (expected_self, (1, 2), NULL_OR_EMPTY)), + (obj.meth_fastcall, (1, 2), (expected_self, (1, 2))), + (obj.meth_fastcall, (), (expected_self, ())), + (obj.meth_fastcall_keywords, + (1, 2), (expected_self, (1, 2), NULL_OR_EMPTY)), + (obj.meth_fastcall_keywords, + (), (expected_self, (), NULL_OR_EMPTY)), + (obj.meth_noargs, (), expected_self), + (obj.meth_o, (123, ), (expected_self, 123)), + ]) + + CALLS_KWARGS.extend([ + (obj.meth_varargs_keywords, + (1, 2), {'x': 'y'}, (expected_self, (1, 2), {'x': 'y'})), + (obj.meth_varargs_keywords, + (), {'x': 'y'}, (expected_self, (), {'x': 'y'})), + (obj.meth_varargs_keywords, + (1, 2), {}, (expected_self, (1, 2), NULL_OR_EMPTY)), + (obj.meth_fastcall_keywords, + (1, 2), {'x': 'y'}, (expected_self, (1, 2), {'x': 'y'})), + (obj.meth_fastcall_keywords, + (), {'x': 'y'}, (expected_self, (), {'x': 'y'})), + (obj.meth_fastcall_keywords, + (1, 2), {}, (expected_self, (1, 2), NULL_OR_EMPTY)), + ]) def check_result(self, result, expected): - if expected is IGNORE_RESULT: - return + if isinstance(expected, tuple) and expected[-1] is NULL_OR_EMPTY: + if result[-1] in ({}, None): + expected = (*expected[:-1], result[-1]) self.assertEqual(result, expected) def test_fastcall(self): @@ -403,7 +467,7 @@ class FastCallTests(unittest.TestCase): self.check_result(result, expected) def test_vectorcall_dict(self): - # Test _PyObject_FastCallDict() + # Test PyObject_VectorcallDict() for func, args, expected in self.CALLS_POSARGS: with self.subTest(func=func, args=args): @@ -411,26 +475,18 @@ class FastCallTests(unittest.TestCase): result = _testcapi.pyobject_fastcalldict(func, args, None) self.check_result(result, expected) - # kwargs={} - result = _testcapi.pyobject_fastcalldict(func, args, {}) - self.check_result(result, expected) - if not args: # args=NULL, nargs=0, kwargs=NULL result = _testcapi.pyobject_fastcalldict(func, None, None) self.check_result(result, expected) - # args=NULL, nargs=0, kwargs={} - result = _testcapi.pyobject_fastcalldict(func, None, {}) - self.check_result(result, expected) - for func, args, kwargs, expected in self.CALLS_KWARGS: with self.subTest(func=func, args=args, kwargs=kwargs): result = _testcapi.pyobject_fastcalldict(func, args, kwargs) self.check_result(result, expected) def test_vectorcall(self): - # Test _PyObject_Vectorcall() + # Test PyObject_Vectorcall() for func, args, expected in self.CALLS_POSARGS: with self.subTest(func=func, args=args): @@ -537,7 +593,7 @@ class TestPEP590(unittest.TestCase): # 1. vectorcall using PyVectorcall_Call() # (only for objects that support vectorcall directly) # 2. normal call - # 3. vectorcall using _PyObject_Vectorcall() + # 3. vectorcall using PyObject_Vectorcall() # 4. call as bound method # 5. call using functools.partial diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 75471270..5150d577 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -12,6 +12,9 @@ import textwrap import threading import time import unittest +import weakref +import importlib.machinery +import importlib.util from test import support from test.support import MISSING_C_DOCSTRINGS from test.support.script_helper import assert_python_failure, assert_python_ok @@ -23,6 +26,8 @@ except ImportError: # Skip this test if the _testcapi module isn't available. _testcapi = support.import_module('_testcapi') +import _testinternalcapi + # Were we compiled --with-pydebug or with #define Py_DEBUG? Py_DEBUG = hasattr(sys, 'gettotalrefcount') @@ -60,8 +65,12 @@ class CAPITest(unittest.TestCase): self.assertEqual(out, b'') # This used to cause an infinite loop. self.assertTrue(err.rstrip().startswith( - b'Fatal Python error:' - b' PyThreadState_Get: no current thread')) + b'Fatal Python error: ' + b'PyThreadState_Get: ' + b'the function must be called with the GIL held, ' + b'but the GIL is released ' + b'(the current Python thread state is NULL)'), + err) def test_memoryview_from_NULL_pointer(self): self.assertRaises(ValueError, _testcapi.make_memoryview_from_NULL_pointer) @@ -96,7 +105,7 @@ class CAPITest(unittest.TestCase): def __len__(self): return 1 self.assertRaises(TypeError, _posixsubprocess.fork_exec, - 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) + 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21) # Issue #15736: overflow in _PySequence_BytesToCharpArray() class Z(object): def __len__(self): @@ -104,7 +113,7 @@ class CAPITest(unittest.TestCase): def __getitem__(self, i): return b'x' self.assertRaises(MemoryError, _posixsubprocess.fork_exec, - 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) + 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21) @unittest.skipUnless(_posixsubprocess, '_posixsubprocess required for this test.') def test_subprocess_fork_exec(self): @@ -114,7 +123,7 @@ class CAPITest(unittest.TestCase): # Issue #15738: crash in subprocess_fork_exec() self.assertRaises(TypeError, _posixsubprocess.fork_exec, - Z(),[b'1'],3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) + Z(),[b'1'],3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21) @unittest.skipIf(MISSING_C_DOCSTRINGS, "Signature information for builtins requires docstrings") @@ -196,7 +205,8 @@ class CAPITest(unittest.TestCase): """) rc, out, err = assert_python_failure('-c', code) self.assertRegex(err.replace(b'\r', b''), - br'Fatal Python error: a function returned NULL ' + br'Fatal Python error: _Py_CheckFunctionResult: ' + br'a function returned NULL ' br'without setting an error\n' br'Python runtime state: initialized\n' br'SystemError: <module>", out) @@ -56,8 +57,9 @@ class TestCgitb(unittest.TestCase): rc, out, err = assert_python_failure( '-c', ('import cgitb; cgitb.enable(format="text", logdir=%s); ' - 'raise ValueError("Hello World")') % repr(tracedir)) - out = out.decode(sys.getfilesystemencoding()) + 'raise ValueError("Hello World")') % repr(tracedir), + PYTHONIOENCODING='utf-8') + out = out.decode() self.assertIn("ValueError", out) self.assertIn("Hello World", out) self.assertNotIn('

    ', out) diff --git a/Lib/test/test_check_c_globals.py b/Lib/test/test_check_c_globals.py new file mode 100644 index 00000000..030debc4 --- /dev/null +++ b/Lib/test/test_check_c_globals.py @@ -0,0 +1,24 @@ +import unittest +import test.test_tools + +test.test_tools.skip_if_missing('c-analyzer') +with test.test_tools.imports_under_tool('c-analyzer'): + from cpython.__main__ import main + + +class ActualChecks(unittest.TestCase): + + # XXX Also run the check in "make check". + #@unittest.expectedFailure + # Failing on one of the buildbots (see https://bugs.python.org/issue36876). + @unittest.skip('activate this once all the globals have been resolved') + def test_check_c_globals(self): + try: + main('check', {}) + except NotImplementedError: + raise unittest.SkipTest('not supported on this host') + + +if __name__ == '__main__': + # Test needs to be a package, so we can do relative imports. + unittest.main() diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py index 456f1be3..7524f58a 100644 --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -529,7 +529,7 @@ class ClassTests(unittest.TestCase): # In debug mode, printed XXX undetected error and # raises AttributeError I() - except AttributeError as x: + except AttributeError: pass else: self.fail("attribute error for I.__init__ got masked") diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index 244c5fec..3d5dc475 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -2,7 +2,7 @@ # Copyright 2012-2013 by Larry Hastings. # Licensed to the PSF under a contributor agreement. -from test import support +from test import support, test_tools from unittest import TestCase import collections import inspect @@ -10,17 +10,10 @@ import os.path import sys import unittest - -clinic_path = os.path.join(os.path.dirname(__file__), '..', '..', 'Tools', 'clinic') -clinic_path = os.path.normpath(clinic_path) -if not os.path.exists(clinic_path): - raise unittest.SkipTest(f'{clinic_path!r} path does not exist') -sys.path.append(clinic_path) -try: +test_tools.skip_if_missing('clinic') +with test_tools.imports_under_tool('clinic'): import clinic from clinic import DSLParser -finally: - del sys.path[-1] class FakeConverter: diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index a5ece9bd..051c092e 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -6,6 +6,7 @@ import os import subprocess import sys import tempfile +import textwrap import unittest from test import support from test.support.script_helper import ( @@ -223,6 +224,21 @@ class CmdLineTest(unittest.TestCase): ) check_output(text) + def test_non_interactive_output_buffering(self): + code = textwrap.dedent(""" + import sys + out = sys.stdout + print(out.isatty(), out.write_through, out.line_buffering) + err = sys.stderr + print(err.isatty(), err.write_through, err.line_buffering) + """) + args = [sys.executable, '-c', code] + proc = subprocess.run(args, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, text=True, check=True) + self.assertEqual(proc.stdout, + 'False False False\n' + 'False False True\n') + def test_unbuffered_output(self): # Test expected operation of the '-u' switch for stream in ('stdout', 'stderr'): @@ -336,10 +352,10 @@ class CmdLineTest(unittest.TestCase): if sys.platform == 'win32': self.assertEqual(b'1\r\n2\r\n', out) - self.assertEqual(b'3\r\n4', err) + self.assertEqual(b'3\r\n4\r\n', err) else: self.assertEqual(b'1\n2\n', out) - self.assertEqual(b'3\n4', err) + self.assertEqual(b'3\n4\n', err) def test_unmached_quote(self): # Issue #10206: python program starting with unmatched quote @@ -395,7 +411,7 @@ class CmdLineTest(unittest.TestCase): stderr=subprocess.PIPE, preexec_fn=preexec) out, err = p.communicate() - self.assertEqual(support.strip_python_stderr(err), b'') + self.assertEqual(err, b'') self.assertEqual(p.returncode, 42) def test_no_stdin(self): diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index a4a868ad..7a3707d0 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -217,6 +217,19 @@ class CmdLineTest(unittest.TestCase): with support.temp_dir() as script_dir: script_name = _make_test_script(script_dir, 'script') self._check_script(script_name, script_name, script_name, + script_dir, None, + importlib.machinery.SourceFileLoader, + expected_cwd=script_dir) + + def test_script_abspath(self): + # pass the script using the relative path, expect the absolute path + # in __file__ + with support.temp_cwd() as script_dir: + self.assertTrue(os.path.isabs(script_dir), script_dir) + + script_name = _make_test_script(script_dir, 'script') + relative_name = os.path.basename(script_name) + self._check_script(relative_name, script_name, relative_name, script_dir, None, importlib.machinery.SourceFileLoader) @@ -486,6 +499,16 @@ class CmdLineTest(unittest.TestCase): self.assertNotIn(b'is a package', err) self.assertNotIn(b'Traceback', err) + def test_hint_when_triying_to_import_a_py_file(self): + with support.temp_dir() as script_dir, \ + support.change_cwd(path=script_dir): + # Create invalid *.pyc as empty file + with open('asyncio.py', 'wb'): + pass + err = self.check_dash_m_failure('asyncio.py') + self.assertIn(b"Try using 'asyncio' instead " + b"of 'asyncio.py' as the module name", err) + def test_dash_m_init_traceback(self): # These were wrapped in an ImportError and tracebacks were # suppressed; see Issue 14285 @@ -523,7 +546,7 @@ class CmdLineTest(unittest.TestCase): script_name = _make_test_script(script_dir, 'script', script) exitcode, stdout, stderr = assert_python_failure(script_name) text = stderr.decode('ascii').split('\n') - self.assertEqual(len(text), 4) + self.assertEqual(len(text), 5) self.assertTrue(text[0].startswith('Traceback')) self.assertTrue(text[1].startswith(' File ')) self.assertTrue(text[3].startswith('NameError')) @@ -542,7 +565,7 @@ class CmdLineTest(unittest.TestCase): # Issue #16218 source = 'print(ascii(__file__))\n' - script_name = _make_test_script(os.curdir, name, source) + script_name = _make_test_script(os.getcwd(), name, source) self.addCleanup(support.unlink, script_name) rc, stdout, stderr = assert_python_ok(script_name) self.assertEqual( @@ -567,7 +590,7 @@ class CmdLineTest(unittest.TestCase): script_name = _make_test_script(script_dir, 'script', script) exitcode, stdout, stderr = assert_python_failure(script_name) text = stderr.decode('ascii') - self.assertEqual(text, "some text") + self.assertEqual(text.rstrip(), "some text") def test_syntaxerror_unindented_caret_position(self): script = "1 + 1 = 2\n" @@ -609,14 +632,14 @@ class CmdLineTest(unittest.TestCase): self.assertEqual( stderr.splitlines()[-3:], [ - b' foo = f"""{}', + b' foo"""', b' ^', b'SyntaxError: f-string: empty expression not allowed', ], ) def test_syntaxerror_invalid_escape_sequence_multi_line(self): - script = 'foo = """\\q\n"""\n' + script = 'foo = """\\q"""\n' with support.temp_dir() as script_dir: script_name = _make_test_script(script_dir, 'script', script) exitcode, stdout, stderr = assert_python_failure( @@ -624,10 +647,9 @@ class CmdLineTest(unittest.TestCase): ) self.assertEqual( stderr.splitlines()[-3:], - [ - b' foo = """\\q', + [ b' foo = """\\q"""', b' ^', - b'SyntaxError: invalid escape sequence \\q', + b'SyntaxError: invalid escape sequence \\q' ], ) @@ -702,7 +724,7 @@ class CmdLineTest(unittest.TestCase): def test_nonexisting_script(self): # bpo-34783: "./python script.py" must not crash # if the script file doesn't exist. - # (Skip test for macOS framework builds because sys.excutable name + # (Skip test for macOS framework builds because sys.executable name # is not the actual Python executable file name. script = 'nonexistingscript.py' self.assertFalse(os.path.exists(script)) diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 0d80af44..ac3dde74 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -130,7 +130,6 @@ import sys import threading import unittest import weakref -import opcode try: import ctypes except ImportError: @@ -241,7 +240,7 @@ class CodeTest(unittest.TestCase): def func2(): y = 2 return y - code2 = func.__code__ + code2 = func2.__code__ for attr, value in ( ("co_argcount", 0), @@ -434,42 +433,6 @@ if check_impl_detail(cpython=True) and ctypes is not None: tt.join() self.assertEqual(LAST_FREED, 500) - @cpython_only - def test_clean_stack_on_return(self): - - def f(x): - return x - - code = f.__code__ - ct = type(f.__code__) - - # Insert an extra LOAD_FAST, this duplicates the value of - # 'x' in the stack, leaking it if the frame is not properly - # cleaned up upon exit. - - bytecode = list(code.co_code) - bytecode.insert(-2, opcode.opmap['LOAD_FAST']) - bytecode.insert(-2, 0) - - c = ct(code.co_argcount, code.co_posonlyargcount, - code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize+1, - code.co_flags, bytes(bytecode), - code.co_consts, code.co_names, code.co_varnames, - code.co_filename, code.co_name, code.co_firstlineno, - code.co_lnotab, code.co_freevars, code.co_cellvars) - new_function = type(f)(c, f.__globals__, 'nf', f.__defaults__, f.__closure__) - - class Var: - pass - the_object = Var() - var = weakref.ref(the_object) - - new_function(the_object) - - # Check if the_object is leaked - del the_object - assert var() is None - def test_main(verbose=None): from test import test_code diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 0fd258ca..54a35208 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -11,7 +11,7 @@ from test import support try: import _testcapi -except ImportError as exc: +except ImportError: _testcapi = None try: diff --git a/Lib/test/test_codeop.py b/Lib/test/test_codeop.py index 01ee00c3..66caf5aa 100644 --- a/Lib/test/test_codeop.py +++ b/Lib/test/test_codeop.py @@ -2,6 +2,7 @@ Test cases for codeop.py Nick Mathewson """ +import sys import unittest import warnings from test import support @@ -10,7 +11,6 @@ from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT import io if support.is_jython: - import sys def unify_callables(d): for n,v in d.items(): @@ -289,6 +289,15 @@ class CodeopTests(unittest.TestCase): ai("[i for i in range(10)] = (1, 2, 3)") + def test_invalid_exec(self): + ai = self.assertInvalid + ai("raise = 4", symbol="exec") + ai('def a-b', symbol='exec') + ai('await?', symbol='exec') + ai('=!=', symbol='exec') + ai('a await raise b', symbol='exec') + ai('a await raise b?+1', symbol='exec') + def test_filename(self): self.assertEqual(compile_command("a = 1\n", "abc").co_filename, compile("a = 1\n", "abc", 'single').co_filename) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 58f65f3e..a8d3337e 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -232,6 +232,52 @@ class TestChainMap(unittest.TestCase): for k, v in dict(a=1, B=20, C=30, z=100).items(): # check get self.assertEqual(d.get(k, 100), v) + def test_union_operators(self): + cm1 = ChainMap(dict(a=1, b=2), dict(c=3, d=4)) + cm2 = ChainMap(dict(a=10, e=5), dict(b=20, d=4)) + cm3 = cm1.copy() + d = dict(a=10, c=30) + pairs = [('c', 3), ('p',0)] + + tmp = cm1 | cm2 # testing between chainmaps + self.assertEqual(tmp.maps, [cm1.maps[0] | dict(cm2), *cm1.maps[1:]]) + cm1 |= cm2 + self.assertEqual(tmp, cm1) + + tmp = cm2 | d # testing between chainmap and mapping + self.assertEqual(tmp.maps, [cm2.maps[0] | d, *cm2.maps[1:]]) + self.assertEqual((d | cm2).maps, [d | dict(cm2)]) + cm2 |= d + self.assertEqual(tmp, cm2) + + # testing behavior between chainmap and iterable key-value pairs + with self.assertRaises(TypeError): + cm3 | pairs + tmp = cm3.copy() + cm3 |= pairs + self.assertEqual(cm3.maps, [tmp.maps[0] | dict(pairs), *tmp.maps[1:]]) + + # testing proper return types for ChainMap and it's subclasses + class Subclass(ChainMap): + pass + + class SubclassRor(ChainMap): + def __ror__(self, other): + return super().__ror__(other) + + tmp = ChainMap() | ChainMap() + self.assertIs(type(tmp), ChainMap) + self.assertIs(type(tmp.maps[0]), dict) + tmp = ChainMap() | Subclass() + self.assertIs(type(tmp), ChainMap) + self.assertIs(type(tmp.maps[0]), dict) + tmp = Subclass() | ChainMap() + self.assertIs(type(tmp), Subclass) + self.assertIs(type(tmp.maps[0]), dict) + tmp = ChainMap() | SubclassRor() + self.assertIs(type(tmp), SubclassRor) + self.assertIs(type(tmp.maps[0]), dict) + ################################################################################ ### Named Tuples @@ -365,6 +411,18 @@ class TestNamedTuple(unittest.TestCase): self.assertIs(P.m.__doc__, Q.o.__doc__) self.assertIs(P.n.__doc__, Q.p.__doc__) + @support.cpython_only + def test_field_repr(self): + Point = namedtuple('Point', 'x y') + self.assertEqual(repr(Point.x), "_tuplegetter(0, 'Alias for field number 0')") + self.assertEqual(repr(Point.y), "_tuplegetter(1, 'Alias for field number 1')") + + Point.x.__doc__ = 'The x-coordinate' + Point.y.__doc__ = 'The y-coordinate' + + self.assertEqual(repr(Point.x), "_tuplegetter(0, 'The x-coordinate')") + self.assertEqual(repr(Point.y), "_tuplegetter(1, 'The y-coordinate')") + def test_name_fixer(self): for spec, renamed in [ [('efg', 'g%hi'), ('efg', '_1')], # field with non-alpha char @@ -424,8 +482,8 @@ class TestNamedTuple(unittest.TestCase): self.assertIsInstance(p, tuple) self.assertEqual(p, (11, 22)) # matches a real tuple - self.assertEqual(tuple(p), (11, 22)) # coercable to a real tuple - self.assertEqual(list(p), [11, 22]) # coercable to a list + self.assertEqual(tuple(p), (11, 22)) # coercible to a real tuple + self.assertEqual(list(p), [11, 22]) # coercible to a list self.assertEqual(max(p), 22) # iterable self.assertEqual(max(*p), 22) # star-able x, y = p @@ -1472,9 +1530,6 @@ class TestCollectionABCs(ABCTestCase): def test_issue26915(self): # Container membership test should check identity first - class CustomEqualObject: - def __eq__(self, other): - return False class CustomSequence(Sequence): def __init__(self, seq): self._seq = seq @@ -1484,7 +1539,7 @@ class TestCollectionABCs(ABCTestCase): return len(self._seq) nan = float('nan') - obj = CustomEqualObject() + obj = support.NEVER_EQ seq = CustomSequence([nan, obj, nan]) containers = [ seq, @@ -2067,6 +2122,29 @@ class TestCounter(unittest.TestCase): set_result = setop(set(p.elements()), set(q.elements())) self.assertEqual(counter_result, dict.fromkeys(set_result, 1)) + def test_subset_superset_not_implemented(self): + # Verify that multiset comparison operations are not implemented. + + # These operations were intentionally omitted because multiset + # comparison semantics conflict with existing dict equality semantics. + + # For multisets, we would expect that if p<=q and p>=q are both true, + # then p==q. However, dict equality semantics require that p!=q when + # one of sets contains an element with a zero count and the other + # doesn't. + + p = Counter(a=1, b=0) + q = Counter(a=1, c=0) + self.assertNotEqual(p, q) + with self.assertRaises(TypeError): + p < q + with self.assertRaises(TypeError): + p <= q + with self.assertRaises(TypeError): + p > q + with self.assertRaises(TypeError): + p >= q + def test_inplace_operations(self): elements = 'abcd' for i in range(1000): diff --git a/Lib/test/test_compare.py b/Lib/test/test_compare.py index 471c8dae..2b3faed7 100644 --- a/Lib/test/test_compare.py +++ b/Lib/test/test_compare.py @@ -1,4 +1,5 @@ import unittest +from test.support import ALWAYS_EQ class Empty: def __repr__(self): @@ -14,13 +15,6 @@ class Cmp: def __eq__(self, other): return self.arg == other -class Anything: - def __eq__(self, other): - return True - - def __ne__(self, other): - return False - class ComparisonTest(unittest.TestCase): set1 = [2, 2.0, 2, 2+0j, Cmp(2.0)] set2 = [[1], (3,), None, Empty()] @@ -113,11 +107,11 @@ class ComparisonTest(unittest.TestCase): def test_issue_1393(self): x = lambda: None - self.assertEqual(x, Anything()) - self.assertEqual(Anything(), x) + self.assertEqual(x, ALWAYS_EQ) + self.assertEqual(ALWAYS_EQ, x) y = object() - self.assertEqual(y, Anything()) - self.assertEqual(Anything(), y) + self.assertEqual(y, ALWAYS_EQ) + self.assertEqual(ALWAYS_EQ, y) if __name__ == '__main__': diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 566ca27f..55716fd4 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -750,6 +750,16 @@ if 1: self.assertEqual(None, opcodes[0].argval) self.assertEqual('RETURN_VALUE', opcodes[1].opname) + def test_big_dict_literal(self): + # The compiler has a flushing point in "compiler_dict" that calls compiles + # a portion of the dictionary literal when the loop that iterates over the items + # reaches 0xFFFF elements but the code was not including the boundary element, + # dropping the key at position 0xFFFF. See bpo-41531 for more information + + dict_size = 0xFFFF + 1 + the_dict = "{" + ",".join(f"{x}:{x}" for x in range(dict_size)) + "}" + self.assertEqual(len(eval(the_dict)), dict_size) + class TestExpressionStackSize(unittest.TestCase): # These tests check that the computed stack size for a code object # stays within reasonable bounds (see issue #21523 for an example diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index 64f092b5..3bbc6817 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -1,16 +1,19 @@ -import sys import compileall +import contextlib +import filecmp import importlib.util -import test.test_importlib.util +import io +import itertools import os import pathlib import py_compile import shutil import struct +import sys import tempfile +import test.test_importlib.util import time import unittest -import io from unittest import mock, skipUnless try: @@ -26,6 +29,24 @@ from .test_py_compile import without_source_date_epoch from .test_py_compile import SourceDateEpochTestMeta +def get_pyc(script, opt): + if not opt: + # Replace None and 0 with '' + opt = '' + return importlib.util.cache_from_source(script, optimization=opt) + + +def get_pycs(script): + return [get_pyc(script, opt) for opt in (0, 1, 2)] + + +def is_hardlink(filename1, filename2): + """Returns True if two files have the same inode (hardlink)""" + inode1 = os.stat(filename1).st_ino + inode2 = os.stat(filename2).st_ino + return inode1 == inode2 + + class CompileallTestsBase: def setUp(self): @@ -194,6 +215,172 @@ class CompileallTestsBase: compileall.compile_dir(self.directory, quiet=True, workers=5) self.assertTrue(compile_file_mock.called) + def test_compile_dir_maxlevels(self): + # Test the actual impact of maxlevels parameter + depth = 3 + path = self.directory + for i in range(1, depth + 1): + path = os.path.join(path, f"dir_{i}") + source = os.path.join(path, 'script.py') + os.mkdir(path) + shutil.copyfile(self.source_path, source) + pyc_filename = importlib.util.cache_from_source(source) + + compileall.compile_dir(self.directory, quiet=True, maxlevels=depth - 1) + self.assertFalse(os.path.isfile(pyc_filename)) + + compileall.compile_dir(self.directory, quiet=True, maxlevels=depth) + self.assertTrue(os.path.isfile(pyc_filename)) + + def _test_ddir_only(self, *, ddir, parallel=True): + """Recursive compile_dir ddir must contain package paths; bpo39769.""" + fullpath = ["test", "foo"] + path = self.directory + mods = [] + for subdir in fullpath: + path = os.path.join(path, subdir) + os.mkdir(path) + script_helper.make_script(path, "__init__", "") + mods.append(script_helper.make_script(path, "mod", + "def fn(): 1/0\nfn()\n")) + compileall.compile_dir( + self.directory, quiet=True, ddir=ddir, + workers=2 if parallel else 1) + self.assertTrue(mods) + for mod in mods: + self.assertTrue(mod.startswith(self.directory), mod) + modcode = importlib.util.cache_from_source(mod) + modpath = mod[len(self.directory+os.sep):] + _, _, err = script_helper.assert_python_failure(modcode) + expected_in = os.path.join(ddir, modpath) + mod_code_obj = test.test_importlib.util.get_code_from_pyc(modcode) + self.assertEqual(mod_code_obj.co_filename, expected_in) + self.assertIn(f'"{expected_in}"', os.fsdecode(err)) + + def test_ddir_only_one_worker(self): + """Recursive compile_dir ddir= contains package paths; bpo39769.""" + return self._test_ddir_only(ddir="", parallel=False) + + def test_ddir_multiple_workers(self): + """Recursive compile_dir ddir= contains package paths; bpo39769.""" + return self._test_ddir_only(ddir="", parallel=True) + + def test_ddir_empty_only_one_worker(self): + """Recursive compile_dir ddir='' contains package paths; bpo39769.""" + return self._test_ddir_only(ddir="", parallel=False) + + def test_ddir_empty_multiple_workers(self): + """Recursive compile_dir ddir='' contains package paths; bpo39769.""" + return self._test_ddir_only(ddir="", parallel=True) + + def test_strip_only(self): + fullpath = ["test", "build", "real", "path"] + path = os.path.join(self.directory, *fullpath) + os.makedirs(path) + script = script_helper.make_script(path, "test", "1 / 0") + bc = importlib.util.cache_from_source(script) + stripdir = os.path.join(self.directory, *fullpath[:2]) + compileall.compile_dir(path, quiet=True, stripdir=stripdir) + rc, out, err = script_helper.assert_python_failure(bc) + expected_in = os.path.join(*fullpath[2:]) + self.assertIn( + expected_in, + str(err, encoding=sys.getdefaultencoding()) + ) + self.assertNotIn( + stripdir, + str(err, encoding=sys.getdefaultencoding()) + ) + + def test_prepend_only(self): + fullpath = ["test", "build", "real", "path"] + path = os.path.join(self.directory, *fullpath) + os.makedirs(path) + script = script_helper.make_script(path, "test", "1 / 0") + bc = importlib.util.cache_from_source(script) + prependdir = "/foo" + compileall.compile_dir(path, quiet=True, prependdir=prependdir) + rc, out, err = script_helper.assert_python_failure(bc) + expected_in = os.path.join(prependdir, self.directory, *fullpath) + self.assertIn( + expected_in, + str(err, encoding=sys.getdefaultencoding()) + ) + + def test_strip_and_prepend(self): + fullpath = ["test", "build", "real", "path"] + path = os.path.join(self.directory, *fullpath) + os.makedirs(path) + script = script_helper.make_script(path, "test", "1 / 0") + bc = importlib.util.cache_from_source(script) + stripdir = os.path.join(self.directory, *fullpath[:2]) + prependdir = "/foo" + compileall.compile_dir(path, quiet=True, + stripdir=stripdir, prependdir=prependdir) + rc, out, err = script_helper.assert_python_failure(bc) + expected_in = os.path.join(prependdir, *fullpath[2:]) + self.assertIn( + expected_in, + str(err, encoding=sys.getdefaultencoding()) + ) + self.assertNotIn( + stripdir, + str(err, encoding=sys.getdefaultencoding()) + ) + + def test_strip_prepend_and_ddir(self): + fullpath = ["test", "build", "real", "path", "ddir"] + path = os.path.join(self.directory, *fullpath) + os.makedirs(path) + script_helper.make_script(path, "test", "1 / 0") + with self.assertRaises(ValueError): + compileall.compile_dir(path, quiet=True, ddir="/bar", + stripdir="/foo", prependdir="/bar") + + def test_multiple_optimization_levels(self): + script = script_helper.make_script(self.directory, + "test_optimization", + "a = 0") + bc = [] + for opt_level in "", 1, 2, 3: + bc.append(importlib.util.cache_from_source(script, + optimization=opt_level)) + test_combinations = [[0, 1], [1, 2], [0, 2], [0, 1, 2]] + for opt_combination in test_combinations: + compileall.compile_file(script, quiet=True, + optimize=opt_combination) + for opt_level in opt_combination: + self.assertTrue(os.path.isfile(bc[opt_level])) + try: + os.unlink(bc[opt_level]) + except Exception: + pass + + @support.skip_unless_symlink + def test_ignore_symlink_destination(self): + # Create folders for allowed files, symlinks and prohibited area + allowed_path = os.path.join(self.directory, "test", "dir", "allowed") + symlinks_path = os.path.join(self.directory, "test", "dir", "symlinks") + prohibited_path = os.path.join(self.directory, "test", "dir", "prohibited") + os.makedirs(allowed_path) + os.makedirs(symlinks_path) + os.makedirs(prohibited_path) + + # Create scripts and symlinks and remember their byte-compiled versions + allowed_script = script_helper.make_script(allowed_path, "test_allowed", "a = 0") + prohibited_script = script_helper.make_script(prohibited_path, "test_prohibited", "a = 0") + allowed_symlink = os.path.join(symlinks_path, "test_allowed.py") + prohibited_symlink = os.path.join(symlinks_path, "test_prohibited.py") + os.symlink(allowed_script, allowed_symlink) + os.symlink(prohibited_script, prohibited_symlink) + allowed_bc = importlib.util.cache_from_source(allowed_symlink) + prohibited_bc = importlib.util.cache_from_source(prohibited_symlink) + + compileall.compile_dir(symlinks_path, quiet=True, limit_sl_dest=allowed_path) + + self.assertTrue(os.path.isfile(allowed_bc)) + self.assertFalse(os.path.isfile(prohibited_bc)) + class CompileallTestsWithSourceEpoch(CompileallTestsBase, unittest.TestCase, @@ -269,13 +456,15 @@ class CommandLineTestsBase: def assertRunOK(self, *args, **env_vars): rc, out, err = script_helper.assert_python_ok( - *self._get_run_args(args), **env_vars) + *self._get_run_args(args), **env_vars, + PYTHONIOENCODING='utf-8') self.assertEqual(b'', err) return out def assertRunNotOK(self, *args, **env_vars): rc, out, err = script_helper.assert_python_failure( - *self._get_run_args(args), **env_vars) + *self._get_run_args(args), **env_vars, + PYTHONIOENCODING='utf-8') return rc, out, err def assertCompiled(self, fn): @@ -436,6 +625,20 @@ class CommandLineTestsBase: self.assertCompiled(spamfn) self.assertCompiled(eggfn) + @support.skip_unless_symlink + def test_symlink_loop(self): + # Currently, compileall ignores symlinks to directories. + # If that limitation is ever lifted, it should protect against + # recursion in symlink loops. + pkg = os.path.join(self.pkgdir, 'spam') + script_helper.make_pkg(pkg) + os.symlink('.', os.path.join(pkg, 'evil')) + os.symlink('.', os.path.join(pkg, 'evil2')) + self.assertRunOK('-q', self.pkgdir) + self.assertCompiled(os.path.join( + self.pkgdir, 'spam', 'evil', 'evil2', '__init__.py' + )) + def test_quiet(self): noisy = self.assertRunOK(self.pkgdir) quiet = self.assertRunOK('-q', self.pkgdir) @@ -577,56 +780,109 @@ class CommandLineTestsBase: self.assertTrue(compile_dir.called) self.assertEqual(compile_dir.call_args[-1]['workers'], 0) - def _test_ddir_only(self, *, ddir, parallel=True): - """Recursive compile_dir ddir must contain package paths; bpo39769.""" - fullpath = ["test", "foo"] - path = self.directory - mods = [] - for subdir in fullpath: - path = os.path.join(path, subdir) - os.mkdir(path) - script_helper.make_script(path, "__init__", "") - mods.append(script_helper.make_script(path, "mod", - "def fn(): 1/0\nfn()\n")) - compileall.compile_dir( - self.directory, quiet=True, ddir=ddir, - workers=2 if parallel else 1) - self.assertTrue(mods) - for mod in mods: - self.assertTrue(mod.startswith(self.directory), mod) - modcode = importlib.util.cache_from_source(mod) - modpath = mod[len(self.directory+os.sep):] - _, _, err = script_helper.assert_python_failure(modcode) - expected_in = os.path.join(ddir, modpath) - mod_code_obj = test.test_importlib.util._get_code_from_pyc(modcode) - self.assertEqual(mod_code_obj.co_filename, expected_in) - self.assertIn(f'"{expected_in}"', os.fsdecode(err)) - - def test_ddir_only_one_worker(self): - """Recursive compile_dir ddir= contains package paths; bpo39769.""" - return self._test_ddir_only(ddir="", parallel=False) - - def test_ddir_multiple_workers(self): - """Recursive compile_dir ddir= contains package paths; bpo39769.""" - return self._test_ddir_only(ddir="", parallel=True) - - def test_ddir_empty_only_one_worker(self): - """Recursive compile_dir ddir='' contains package paths; bpo39769.""" - return self._test_ddir_only(ddir="", parallel=False) - - def test_ddir_empty_multiple_workers(self): - """Recursive compile_dir ddir='' contains package paths; bpo39769.""" - return self._test_ddir_only(ddir="", parallel=True) - - -class CommmandLineTestsWithSourceEpoch(CommandLineTestsBase, + def test_strip_and_prepend(self): + fullpath = ["test", "build", "real", "path"] + path = os.path.join(self.directory, *fullpath) + os.makedirs(path) + script = script_helper.make_script(path, "test", "1 / 0") + bc = importlib.util.cache_from_source(script) + stripdir = os.path.join(self.directory, *fullpath[:2]) + prependdir = "/foo" + self.assertRunOK("-s", stripdir, "-p", prependdir, path) + rc, out, err = script_helper.assert_python_failure(bc) + expected_in = os.path.join(prependdir, *fullpath[2:]) + self.assertIn( + expected_in, + str(err, encoding=sys.getdefaultencoding()) + ) + self.assertNotIn( + stripdir, + str(err, encoding=sys.getdefaultencoding()) + ) + + def test_multiple_optimization_levels(self): + path = os.path.join(self.directory, "optimizations") + os.makedirs(path) + script = script_helper.make_script(path, + "test_optimization", + "a = 0") + bc = [] + for opt_level in "", 1, 2, 3: + bc.append(importlib.util.cache_from_source(script, + optimization=opt_level)) + test_combinations = [["0", "1"], + ["1", "2"], + ["0", "2"], + ["0", "1", "2"]] + for opt_combination in test_combinations: + self.assertRunOK(path, *("-o" + str(n) for n in opt_combination)) + for opt_level in opt_combination: + self.assertTrue(os.path.isfile(bc[int(opt_level)])) + try: + os.unlink(bc[opt_level]) + except Exception: + pass + + @support.skip_unless_symlink + def test_ignore_symlink_destination(self): + # Create folders for allowed files, symlinks and prohibited area + allowed_path = os.path.join(self.directory, "test", "dir", "allowed") + symlinks_path = os.path.join(self.directory, "test", "dir", "symlinks") + prohibited_path = os.path.join(self.directory, "test", "dir", "prohibited") + os.makedirs(allowed_path) + os.makedirs(symlinks_path) + os.makedirs(prohibited_path) + + # Create scripts and symlinks and remember their byte-compiled versions + allowed_script = script_helper.make_script(allowed_path, "test_allowed", "a = 0") + prohibited_script = script_helper.make_script(prohibited_path, "test_prohibited", "a = 0") + allowed_symlink = os.path.join(symlinks_path, "test_allowed.py") + prohibited_symlink = os.path.join(symlinks_path, "test_prohibited.py") + os.symlink(allowed_script, allowed_symlink) + os.symlink(prohibited_script, prohibited_symlink) + allowed_bc = importlib.util.cache_from_source(allowed_symlink) + prohibited_bc = importlib.util.cache_from_source(prohibited_symlink) + + self.assertRunOK(symlinks_path, "-e", allowed_path) + + self.assertTrue(os.path.isfile(allowed_bc)) + self.assertFalse(os.path.isfile(prohibited_bc)) + + def test_hardlink_bad_args(self): + # Bad arguments combination, hardlink deduplication make sense + # only for more than one optimization level + self.assertRunNotOK(self.directory, "-o 1", "--hardlink-dupes") + + def test_hardlink(self): + # 'a = 0' code produces the same bytecode for the 3 optimization + # levels. All three .pyc files must have the same inode (hardlinks). + # + # If deduplication is disabled, all pyc files must have different + # inodes. + for dedup in (True, False): + with tempfile.TemporaryDirectory() as path: + with self.subTest(dedup=dedup): + script = script_helper.make_script(path, "script", "a = 0") + pycs = get_pycs(script) + + args = ["-q", "-o 0", "-o 1", "-o 2"] + if dedup: + args.append("--hardlink-dupes") + self.assertRunOK(path, *args) + + self.assertEqual(is_hardlink(pycs[0], pycs[1]), dedup) + self.assertEqual(is_hardlink(pycs[1], pycs[2]), dedup) + self.assertEqual(is_hardlink(pycs[0], pycs[2]), dedup) + + +class CommandLineTestsWithSourceEpoch(CommandLineTestsBase, unittest.TestCase, metaclass=SourceDateEpochTestMeta, source_date_epoch=True): pass -class CommmandLineTestsNoSourceEpoch(CommandLineTestsBase, +class CommandLineTestsNoSourceEpoch(CommandLineTestsBase, unittest.TestCase, metaclass=SourceDateEpochTestMeta, source_date_epoch=False): @@ -634,5 +890,176 @@ class CommmandLineTestsNoSourceEpoch(CommandLineTestsBase, +class HardlinkDedupTestsBase: + # Test hardlink_dupes parameter of compileall.compile_dir() + + def setUp(self): + self.path = None + + @contextlib.contextmanager + def temporary_directory(self): + with tempfile.TemporaryDirectory() as path: + self.path = path + yield path + self.path = None + + def make_script(self, code, name="script"): + return script_helper.make_script(self.path, name, code) + + def compile_dir(self, *, dedup=True, optimize=(0, 1, 2), force=False): + compileall.compile_dir(self.path, quiet=True, optimize=optimize, + hardlink_dupes=dedup, force=force) + + def test_bad_args(self): + # Bad arguments combination, hardlink deduplication make sense + # only for more than one optimization level + with self.temporary_directory(): + self.make_script("pass") + with self.assertRaises(ValueError): + compileall.compile_dir(self.path, quiet=True, optimize=0, + hardlink_dupes=True) + with self.assertRaises(ValueError): + # same optimization level specified twice: + # compile_dir() removes duplicates + compileall.compile_dir(self.path, quiet=True, optimize=[0, 0], + hardlink_dupes=True) + + def create_code(self, docstring=False, assertion=False): + lines = [] + if docstring: + lines.append("'module docstring'") + lines.append('x = 1') + if assertion: + lines.append("assert x == 1") + return '\n'.join(lines) + + def iter_codes(self): + for docstring in (False, True): + for assertion in (False, True): + code = self.create_code(docstring=docstring, assertion=assertion) + yield (code, docstring, assertion) + + def test_disabled(self): + # Deduplication disabled, no hardlinks + for code, docstring, assertion in self.iter_codes(): + with self.subTest(docstring=docstring, assertion=assertion): + with self.temporary_directory(): + script = self.make_script(code) + pycs = get_pycs(script) + self.compile_dir(dedup=False) + self.assertFalse(is_hardlink(pycs[0], pycs[1])) + self.assertFalse(is_hardlink(pycs[0], pycs[2])) + self.assertFalse(is_hardlink(pycs[1], pycs[2])) + + def check_hardlinks(self, script, docstring=False, assertion=False): + pycs = get_pycs(script) + self.assertEqual(is_hardlink(pycs[0], pycs[1]), + not assertion) + self.assertEqual(is_hardlink(pycs[0], pycs[2]), + not assertion and not docstring) + self.assertEqual(is_hardlink(pycs[1], pycs[2]), + not docstring) + + def test_hardlink(self): + # Test deduplication on all combinations + for code, docstring, assertion in self.iter_codes(): + with self.subTest(docstring=docstring, assertion=assertion): + with self.temporary_directory(): + script = self.make_script(code) + self.compile_dir() + self.check_hardlinks(script, docstring, assertion) + + def test_only_two_levels(self): + # Don't build the 3 optimization levels, but only 2 + for opts in ((0, 1), (1, 2), (0, 2)): + with self.subTest(opts=opts): + with self.temporary_directory(): + # code with no dostring and no assertion: + # same bytecode for all optimization levels + script = self.make_script(self.create_code()) + self.compile_dir(optimize=opts) + pyc1 = get_pyc(script, opts[0]) + pyc2 = get_pyc(script, opts[1]) + self.assertTrue(is_hardlink(pyc1, pyc2)) + + def test_duplicated_levels(self): + # compile_dir() must not fail if optimize contains duplicated + # optimization levels and/or if optimization levels are not sorted. + with self.temporary_directory(): + # code with no dostring and no assertion: + # same bytecode for all optimization levels + script = self.make_script(self.create_code()) + self.compile_dir(optimize=[1, 0, 1, 0]) + pyc1 = get_pyc(script, 0) + pyc2 = get_pyc(script, 1) + self.assertTrue(is_hardlink(pyc1, pyc2)) + + def test_recompilation(self): + # Test compile_dir() when pyc files already exists and the script + # content changed + with self.temporary_directory(): + script = self.make_script("a = 0") + self.compile_dir() + # All three levels have the same inode + self.check_hardlinks(script) + + pycs = get_pycs(script) + inode = os.stat(pycs[0]).st_ino + + # Change of the module content + script = self.make_script("print(0)") + + # Recompilation without -o 1 + self.compile_dir(optimize=[0, 2], force=True) + + # opt-1.pyc should have the same inode as before and others should not + self.assertEqual(inode, os.stat(pycs[1]).st_ino) + self.assertTrue(is_hardlink(pycs[0], pycs[2])) + self.assertNotEqual(inode, os.stat(pycs[2]).st_ino) + # opt-1.pyc and opt-2.pyc have different content + self.assertFalse(filecmp.cmp(pycs[1], pycs[2], shallow=True)) + + def test_import(self): + # Test that import updates a single pyc file when pyc files already + # exists and the script content changed + with self.temporary_directory(): + script = self.make_script(self.create_code(), name="module") + self.compile_dir() + # All three levels have the same inode + self.check_hardlinks(script) + + pycs = get_pycs(script) + inode = os.stat(pycs[0]).st_ino + + # Change of the module content + script = self.make_script("print(0)", name="module") + + # Import the module in Python with -O (optimization level 1) + script_helper.assert_python_ok( + "-O", "-c", "import module", __isolated=False, PYTHONPATH=self.path + ) + + # Only opt-1.pyc is changed + self.assertEqual(inode, os.stat(pycs[0]).st_ino) + self.assertEqual(inode, os.stat(pycs[2]).st_ino) + self.assertFalse(is_hardlink(pycs[1], pycs[2])) + # opt-1.pyc and opt-2.pyc have different content + self.assertFalse(filecmp.cmp(pycs[1], pycs[2], shallow=True)) + + +class HardlinkDedupTestsWithSourceEpoch(HardlinkDedupTestsBase, + unittest.TestCase, + metaclass=SourceDateEpochTestMeta, + source_date_epoch=True): + pass + + +class HardlinkDedupTestsNoSourceEpoch(HardlinkDedupTestsBase, + unittest.TestCase, + metaclass=SourceDateEpochTestMeta, + source_date_epoch=False): + pass + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index a5a746eb..4fe4bf79 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -1,10 +1,11 @@ -import test.support +from test import support # Skip tests if _multiprocessing wasn't built. -test.support.import_module('_multiprocessing') +support.import_module('_multiprocessing') # Skip tests if sem_open implementation is broken. -test.support.skip_if_broken_multiprocessing_synchronize() +support.skip_if_broken_multiprocessing_synchronize() +from test.support import hashlib_helper from test.support.script_helper import assert_python_ok import contextlib @@ -100,11 +101,11 @@ def make_dummy_object(_): class BaseTestCase(unittest.TestCase): def setUp(self): - self._thread_key = test.support.threading_setup() + self._thread_key = support.threading_setup() def tearDown(self): - test.support.reap_children() - test.support.threading_cleanup(*self._thread_key) + support.reap_children() + support.threading_cleanup(*self._thread_key) class ExecutorMixin: @@ -131,7 +132,7 @@ class ExecutorMixin: self.executor = None dt = time.monotonic() - self.t1 - if test.support.verbose: + if support.verbose: print("%.2fs" % dt, end=' ') self.assertLess(dt, 300, "synchronization issue: test lasted too long") @@ -342,6 +343,49 @@ class ExecutorShutdownTest: for f in fs: f.result() + def test_cancel_futures(self): + executor = self.executor_type(max_workers=3) + fs = [executor.submit(time.sleep, .1) for _ in range(50)] + executor.shutdown(cancel_futures=True) + # We can't guarantee the exact number of cancellations, but we can + # guarantee that *some* were cancelled. With setting max_workers to 3, + # most of the submitted futures should have been cancelled. + cancelled = [fut for fut in fs if fut.cancelled()] + self.assertTrue(len(cancelled) >= 35, msg=f"{len(cancelled)=}") + + # Ensure the other futures were able to finish. + # Use "not fut.cancelled()" instead of "fut.done()" to include futures + # that may have been left in a pending state. + others = [fut for fut in fs if not fut.cancelled()] + for fut in others: + self.assertTrue(fut.done(), msg=f"{fut._state=}") + self.assertIsNone(fut.exception()) + + # Similar to the number of cancelled futures, we can't guarantee the + # exact number that completed. But, we can guarantee that at least + # one finished. + self.assertTrue(len(others) > 0, msg=f"{len(others)=}") + + def test_hang_issue39205(self): + """shutdown(wait=False) doesn't hang at exit with running futures. + + See https://bugs.python.org/issue39205. + """ + if self.executor_type == futures.ProcessPoolExecutor: + raise unittest.SkipTest( + "Hangs due to https://bugs.python.org/issue39205") + + rc, out, err = assert_python_ok('-c', """if True: + from concurrent.futures import {executor_type} + from test.test_concurrent_futures import sleep_and_print + if __name__ == "__main__": + t = {executor_type}(max_workers=3) + t.submit(sleep_and_print, 1.0, "apple") + t.shutdown(wait=False) + """.format(executor_type=self.executor_type.__name__)) + self.assertFalse(err) + self.assertEqual(out.strip(), b"apple") + class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase): def _prime_executor(self): @@ -372,13 +416,32 @@ class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase def test_del_shutdown(self): executor = futures.ThreadPoolExecutor(max_workers=5) - executor.map(abs, range(-5, 5)) + res = executor.map(abs, range(-5, 5)) threads = executor._threads del executor for t in threads: t.join() + # Make sure the results were all computed before the + # executor got shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + + def test_shutdown_no_wait(self): + # Ensure that the executor cleans up the threads when calling + # shutdown with wait=False + executor = futures.ThreadPoolExecutor(max_workers=5) + res = executor.map(abs, range(-5, 5)) + threads = executor._threads + executor.shutdown(wait=False) + for t in threads: + t.join() + + # Make sure the results were all computed before the + # executor got shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + + def test_thread_names_assigned(self): executor = futures.ThreadPoolExecutor( max_workers=5, thread_name_prefix='SpecialPool') @@ -402,16 +465,38 @@ class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase self.assertRegex(t.name, r'ThreadPoolExecutor-\d+_[0-4]$') t.join() + def test_cancel_futures_wait_false(self): + # Can only be reliably tested for TPE, since PPE often hangs with + # `wait=False` (even without *cancel_futures*). + rc, out, err = assert_python_ok('-c', """if True: + from concurrent.futures import ThreadPoolExecutor + from test.test_concurrent_futures import sleep_and_print + if __name__ == "__main__": + t = ThreadPoolExecutor() + t.submit(sleep_and_print, .1, "apple") + t.shutdown(wait=False, cancel_futures=True) + """.format(executor_type=self.executor_type.__name__)) + # Errors in atexit hooks don't change the process exit code, check + # stderr manually. + self.assertFalse(err) + self.assertEqual(out.strip(), b"apple") + class ProcessPoolShutdownTest(ExecutorShutdownTest): def _prime_executor(self): pass def test_processes_terminate(self): - self.executor.submit(mul, 21, 2) - self.executor.submit(mul, 6, 7) - self.executor.submit(mul, 3, 14) - self.assertEqual(len(self.executor._processes), 5) + def acquire_lock(lock): + lock.acquire() + + mp_context = get_context() + sem = mp_context.Semaphore(0) + for _ in range(3): + self.executor.submit(acquire_lock, sem) + self.assertEqual(len(self.executor._processes), 3) + for _ in range(3): + sem.release() processes = self.executor._processes self.executor.shutdown() @@ -429,20 +514,45 @@ class ProcessPoolShutdownTest(ExecutorShutdownTest): def test_del_shutdown(self): executor = futures.ProcessPoolExecutor(max_workers=5) - list(executor.map(abs, range(-5, 5))) - queue_management_thread = executor._queue_management_thread + res = executor.map(abs, range(-5, 5)) + executor_manager_thread = executor._executor_manager_thread processes = executor._processes call_queue = executor._call_queue - queue_management_thread = executor._queue_management_thread + executor_manager_thread = executor._executor_manager_thread del executor # Make sure that all the executor resources were properly cleaned by # the shutdown process - queue_management_thread.join() + executor_manager_thread.join() + for p in processes.values(): + p.join() + call_queue.join_thread() + + # Make sure the results were all computed before the + # executor got shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + + def test_shutdown_no_wait(self): + # Ensure that the executor cleans up the processes when calling + # shutdown with wait=False + executor = futures.ProcessPoolExecutor(max_workers=5) + res = executor.map(abs, range(-5, 5)) + processes = executor._processes + call_queue = executor._call_queue + executor_manager_thread = executor._executor_manager_thread + executor.shutdown(wait=False) + + # Make sure that all the executor resources were properly cleaned by + # the shutdown process + executor_manager_thread.join() for p in processes.values(): p.join() call_queue.join_thread() + # Make sure the results were all computed before the executor got + # shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + create_executor_tests(ProcessPoolShutdownTest, executor_mixins=(ProcessPoolForkMixin, @@ -670,9 +780,8 @@ class ExecutorTest: self.assertEqual(16, future.result()) future = self.executor.submit(capture, 1, self=2, fn=3) self.assertEqual(future.result(), ((1,), {'self': 2, 'fn': 3})) - with self.assertWarns(DeprecationWarning): - future = self.executor.submit(fn=capture, arg=1) - self.assertEqual(future.result(), ((), {'arg': 1})) + with self.assertRaises(TypeError): + self.executor.submit(fn=capture, arg=1) with self.assertRaises(TypeError): self.executor.submit(arg=1) @@ -712,7 +821,7 @@ class ExecutorTest: self.executor.map(str, [2] * (self.worker_count + 1)) self.executor.shutdown() - @test.support.cpython_only + @support.cpython_only def test_no_stale_references(self): # Issue #16284: check that the executors don't unnecessarily hang onto # references. @@ -724,7 +833,7 @@ class ExecutorTest: self.executor.submit(my_object.my_method) del my_object - collected = my_object_collected.wait(timeout=5.0) + collected = my_object_collected.wait(timeout=support.SHORT_TIMEOUT) self.assertTrue(collected, "Stale reference not collected within timeout.") @@ -836,7 +945,7 @@ class ProcessPoolExecutorTest(ExecutorTest): self.assertIs(type(cause), futures.process._RemoteTraceback) self.assertIn('raise RuntimeError(123) # some comment', cause.tb) - with test.support.captured_stderr() as f1: + with support.captured_stderr() as f1: try: raise exc except RuntimeError: @@ -844,6 +953,7 @@ class ProcessPoolExecutorTest(ExecutorTest): self.assertIn('raise RuntimeError(123) # some comment', f1.getvalue()) + @hashlib_helper.requires_hashdigest('md5') def test_ressources_gced_in_workers(self): # Ensure that argument for a job are correctly gc-ed after the job # is finished @@ -857,22 +967,47 @@ class ProcessPoolExecutorTest(ExecutorTest): # explicitly destroy the object to ensure that EventfulGCObj.__del__() # is called while manager is still running. obj = None - test.support.gc_collect() + support.gc_collect() mgr.shutdown() mgr.join() + def test_saturation(self): + executor = self.executor_type(4) + mp_context = get_context() + sem = mp_context.Semaphore(0) + job_count = 15 * executor._max_workers + try: + for _ in range(job_count): + executor.submit(sem.acquire) + self.assertEqual(len(executor._processes), executor._max_workers) + for _ in range(job_count): + sem.release() + finally: + executor.shutdown() + + def test_idle_process_reuse_one(self): + executor = self.executor_type(4) + executor.submit(mul, 21, 2).result() + executor.submit(mul, 6, 7).result() + executor.submit(mul, 3, 14).result() + self.assertEqual(len(executor._processes), 1) + executor.shutdown() + + def test_idle_process_reuse_multiple(self): + executor = self.executor_type(4) + executor.submit(mul, 12, 7).result() + executor.submit(mul, 33, 25) + executor.submit(mul, 25, 26).result() + executor.submit(mul, 18, 29) + self.assertLessEqual(len(executor._processes), 2) + executor.shutdown() create_executor_tests(ProcessPoolExecutorTest, executor_mixins=(ProcessPoolForkMixin, ProcessPoolForkserverMixin, ProcessPoolSpawnMixin)) -def hide_process_stderr(): - import io - sys.stderr = io.StringIO() - - def _crash(delay=None): """Induces a segfault.""" if delay: @@ -889,13 +1024,18 @@ def _exit(): def _raise_error(Err): """Function that raises an Exception in process.""" - hide_process_stderr() + raise Err() + + +def _raise_error_ignore_stderr(Err): + """Function that raises an Exception in process and ignores stderr.""" + import io + sys.stderr = io.StringIO() raise Err() def _return_instance(cls): """Function that returns a instance of cls.""" - hide_process_stderr() return cls() @@ -934,16 +1074,11 @@ class ErrorAtUnpickle(object): """Bad object that triggers an error at unpickling time.""" def __reduce__(self): from pickle import UnpicklingError - return _raise_error, (UnpicklingError, ) + return _raise_error_ignore_stderr, (UnpicklingError, ) class ExecutorDeadlockTest: - TIMEOUT = 15 - - @classmethod - def _sleep_id(cls, x, delay): - time.sleep(delay) - return x + TIMEOUT = support.SHORT_TIMEOUT def _fail_on_deadlock(self, executor): # If we did not recover before TIMEOUT seconds, consider that the @@ -964,57 +1099,84 @@ class ExecutorDeadlockTest: self.fail(f"Executor deadlock:\n\n{tb}") - def test_crash(self): - # extensive testing for deadlock caused by crashes in a pool. + def _check_crash(self, error, func, *args, ignore_stderr=False): + # test for deadlock caused by crashes in a pool self.executor.shutdown(wait=True) - crash_cases = [ - # Check problem occurring while pickling a task in - # the task_handler thread - (id, (ErrorAtPickle(),), PicklingError, "error at task pickle"), - # Check problem occurring while unpickling a task on workers - (id, (ExitAtUnpickle(),), BrokenProcessPool, - "exit at task unpickle"), - (id, (ErrorAtUnpickle(),), BrokenProcessPool, - "error at task unpickle"), - (id, (CrashAtUnpickle(),), BrokenProcessPool, - "crash at task unpickle"), - # Check problem occurring during func execution on workers - (_crash, (), BrokenProcessPool, - "crash during func execution on worker"), - (_exit, (), SystemExit, - "exit during func execution on worker"), - (_raise_error, (RuntimeError, ), RuntimeError, - "error during func execution on worker"), - # Check problem occurring while pickling a task result - # on workers - (_return_instance, (CrashAtPickle,), BrokenProcessPool, - "crash during result pickle on worker"), - (_return_instance, (ExitAtPickle,), SystemExit, - "exit during result pickle on worker"), - (_return_instance, (ErrorAtPickle,), PicklingError, - "error during result pickle on worker"), - # Check problem occurring while unpickling a task in - # the result_handler thread - (_return_instance, (ErrorAtUnpickle,), BrokenProcessPool, - "error during result unpickle in result_handler"), - (_return_instance, (ExitAtUnpickle,), BrokenProcessPool, - "exit during result unpickle in result_handler") - ] - for func, args, error, name in crash_cases: - with self.subTest(name): - # The captured_stderr reduces the noise in the test report - with test.support.captured_stderr(): - executor = self.executor_type( - max_workers=2, mp_context=get_context(self.ctx)) - res = executor.submit(func, *args) - with self.assertRaises(error): - try: - res.result(timeout=self.TIMEOUT) - except futures.TimeoutError: - # If we did not recover before TIMEOUT seconds, - # consider that the executor is in a deadlock state - self._fail_on_deadlock(executor) - executor.shutdown(wait=True) + + executor = self.executor_type( + max_workers=2, mp_context=get_context(self.ctx)) + res = executor.submit(func, *args) + + if ignore_stderr: + cm = support.captured_stderr() + else: + cm = contextlib.nullcontext() + + try: + with self.assertRaises(error): + with cm: + res.result(timeout=self.TIMEOUT) + except futures.TimeoutError: + # If we did not recover before TIMEOUT seconds, + # consider that the executor is in a deadlock state + self._fail_on_deadlock(executor) + executor.shutdown(wait=True) + + def test_error_at_task_pickle(self): + # Check problem occurring while pickling a task in + # the task_handler thread + self._check_crash(PicklingError, id, ErrorAtPickle()) + + def test_exit_at_task_unpickle(self): + # Check problem occurring while unpickling a task on workers + self._check_crash(BrokenProcessPool, id, ExitAtUnpickle()) + + def test_error_at_task_unpickle(self): + # Check problem occurring while unpickling a task on workers + self._check_crash(BrokenProcessPool, id, ErrorAtUnpickle()) + + def test_crash_at_task_unpickle(self): + # Check problem occurring while unpickling a task on workers + self._check_crash(BrokenProcessPool, id, CrashAtUnpickle()) + + def test_crash_during_func_exec_on_worker(self): + # Check problem occurring during func execution on workers + self._check_crash(BrokenProcessPool, _crash) + + def test_exit_during_func_exec_on_worker(self): + # Check problem occurring during func execution on workers + self._check_crash(SystemExit, _exit) + + def test_error_during_func_exec_on_worker(self): + # Check problem occurring during func execution on workers + self._check_crash(RuntimeError, _raise_error, RuntimeError) + + def test_crash_during_result_pickle_on_worker(self): + # Check problem occurring while pickling a task result + # on workers + self._check_crash(BrokenProcessPool, _return_instance, CrashAtPickle) + + def test_exit_during_result_pickle_on_worker(self): + # Check problem occurring while pickling a task result + # on workers + self._check_crash(SystemExit, _return_instance, ExitAtPickle) + + def test_error_during_result_pickle_on_worker(self): + # Check problem occurring while pickling a task result + # on workers + self._check_crash(PicklingError, _return_instance, ErrorAtPickle) + + def test_error_during_result_unpickle_in_result_handler(self): + # Check problem occurring while unpickling a task in + # the result_handler thread + self._check_crash(BrokenProcessPool, + _return_instance, ErrorAtUnpickle, + ignore_stderr=True) + + def test_exit_during_result_unpickle_in_result_handler(self): + # Check problem occurring while unpickling a task in + # the result_handler thread + self._check_crash(BrokenProcessPool, _return_instance, ExitAtUnpickle) def test_shutdown_deadlock(self): # Test that the pool calling shutdown do not cause deadlock @@ -1028,6 +1190,32 @@ class ExecutorDeadlockTest: with self.assertRaises(BrokenProcessPool): f.result() + def test_shutdown_deadlock_pickle(self): + # Test that the pool calling shutdown with wait=False does not cause + # a deadlock if a task fails at pickle after the shutdown call. + # Reported in bpo-39104. + self.executor.shutdown(wait=True) + with self.executor_type(max_workers=2, + mp_context=get_context(self.ctx)) as executor: + self.executor = executor # Allow clean up in fail_on_deadlock + + # Start the executor and get the executor_manager_thread to collect + # the threads and avoid dangling thread that should be cleaned up + # asynchronously. + executor.submit(id, 42).result() + executor_manager = executor._executor_manager_thread + + # Submit a task that fails at pickle and shutdown the executor + # without waiting + f = executor.submit(id, ErrorAtPickle()) + executor.shutdown(wait=False) + with self.assertRaises(PicklingError): + f.result() + + # Make sure the executor is eventually shutdown and do not leave + # dangling threads + executor_manager.join() + create_executor_tests(ExecutorDeadlockTest, executor_mixins=(ProcessPoolForkMixin, @@ -1070,7 +1258,7 @@ class FutureTests(BaseTestCase): self.assertTrue(was_cancelled) def test_done_callback_raises(self): - with test.support.captured_stderr() as stderr: + with support.captured_stderr() as stderr: raising_was_called = False fn_was_called = False @@ -1125,7 +1313,7 @@ class FutureTests(BaseTestCase): self.assertTrue(was_cancelled) def test_done_callback_raises_already_succeeded(self): - with test.support.captured_stderr() as stderr: + with support.captured_stderr() as stderr: def raising_fn(callback_future): raise Exception('doh!') @@ -1244,7 +1432,8 @@ class FutureTests(BaseTestCase): t = threading.Thread(target=notification) t.start() - self.assertRaises(futures.CancelledError, f1.result, timeout=5) + self.assertRaises(futures.CancelledError, + f1.result, timeout=support.SHORT_TIMEOUT) t.join() def test_exception_with_timeout(self): @@ -1273,7 +1462,7 @@ class FutureTests(BaseTestCase): t = threading.Thread(target=notification) t.start() - self.assertTrue(isinstance(f1.exception(timeout=5), OSError)) + self.assertTrue(isinstance(f1.exception(timeout=support.SHORT_TIMEOUT), OSError)) t.join() def test_multiple_set_result(self): @@ -1309,11 +1498,11 @@ _threads_key = None def setUpModule(): global _threads_key - _threads_key = test.support.threading_setup() + _threads_key = support.threading_setup() def tearDownModule(): - test.support.threading_cleanup(*_threads_key) + support.threading_cleanup(*_threads_key) multiprocessing.util._cleanup_tests() diff --git a/Lib/test/test_contains.py b/Lib/test/test_contains.py index 036a1d01..471d04a7 100644 --- a/Lib/test/test_contains.py +++ b/Lib/test/test_contains.py @@ -1,5 +1,6 @@ from collections import deque import unittest +from test.support import NEVER_EQ class base_set: @@ -69,13 +70,7 @@ class TestContains(unittest.TestCase): # containment and equality tests involving elements that are # not necessarily equal to themselves - class MyNonReflexive(object): - def __eq__(self, other): - return False - def __hash__(self): - return 28 - - values = float('nan'), 1, None, 'abc', MyNonReflexive() + values = float('nan'), 1, None, 'abc', NEVER_EQ constructors = list, tuple, dict.fromkeys, set, frozenset, deque for constructor in constructors: container = constructor(values) diff --git a/Lib/test/test_context.py b/Lib/test/test_context.py index b9e991a4..2d8b63a1 100644 --- a/Lib/test/test_context.py +++ b/Lib/test/test_context.py @@ -358,10 +358,6 @@ class ContextTest(unittest.TestCase): tp.shutdown() self.assertEqual(results, list(range(10))) - def test_contextvar_getitem(self): - clss = contextvars.ContextVar - self.assertEqual(clss[str], clss) - # HAMT Tests diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index 188a29d9..024f9126 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -603,9 +603,9 @@ class TestBaseExitStack: stack.callback(arg=1) with self.assertRaises(TypeError): self.exit_stack.callback(arg=2) - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): stack.callback(callback=_exit, arg=3) - self.assertEqual(result, [((), {'arg': 3})]) + self.assertEqual(result, []) def test_push(self): exc_raised = ZeroDivisionError diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index 492b226a..43fb7fce 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -358,9 +358,9 @@ class TestAsyncExitStack(TestBaseExitStack, unittest.TestCase): stack.push_async_callback(arg=1) with self.assertRaises(TypeError): self.exit_stack.push_async_callback(arg=2) - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): stack.push_async_callback(callback=_exit, arg=3) - self.assertEqual(result, [((), {'arg': 3})]) + self.assertEqual(result, []) @_async_test async def test_async_push(self): diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 208b5c2c..8d1e0692 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -1203,39 +1203,41 @@ class CoroutineTest(unittest.TestCase): def __aenter__(self): pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True with self.assertRaisesRegex(AttributeError, '__aexit__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_3(self): class CM: def __aexit__(self): pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True with self.assertRaisesRegex(AttributeError, '__aenter__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_4(self): class CM: - def __enter__(self): - pass - - def __exit__(self): - pass + pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True - with self.assertRaisesRegex(AttributeError, '__aexit__'): + with self.assertRaisesRegex(AttributeError, '__aenter__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_5(self): # While this test doesn't make a lot of sense, diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index a16d1401..d421be07 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -14,6 +14,12 @@ from itertools import permutations from textwrap import dedent from collections import OrderedDict + +class BadIterable: + def __iter__(self): + raise OSError + + class Test_Csv(unittest.TestCase): """ Test the underlying C csv parser in ways that are not appropriate @@ -40,9 +46,15 @@ class Test_Csv(unittest.TestCase): def test_reader_arg_valid(self): self._test_arg_valid(csv.reader, []) + self.assertRaises(OSError, csv.reader, BadIterable()) def test_writer_arg_valid(self): self._test_arg_valid(csv.writer, StringIO()) + class BadWriter: + @property + def write(self): + raise OSError + self.assertRaises(OSError, csv.writer, BadWriter()) def _test_default_attrs(self, ctor, *args): obj = ctor(*args) @@ -141,6 +153,7 @@ class Test_Csv(unittest.TestCase): self._write_test([None], '""') self._write_error_test(csv.Error, [None], quoting = csv.QUOTE_NONE) # Check that exceptions are passed up the chain + self._write_error_test(OSError, BadIterable()) class BadList: def __len__(self): return 10; @@ -230,6 +243,12 @@ class Test_Csv(unittest.TestCase): fileobj.seek(0) self.assertEqual(fileobj.read(), 'a\r\n""\r\n') + def test_writerows_errors(self): + with TemporaryFile("w+", newline='') as fileobj: + writer = csv.writer(fileobj) + self.assertRaises(TypeError, writer.writerows, None) + self.assertRaises(OSError, writer.writerows, BadIterable()) + @support.cpython_only def test_writerows_legacy_strings(self): import _testcapi @@ -334,7 +353,6 @@ class Test_Csv(unittest.TestCase): def test_roundtrip_quoteed_newlines(self): with TemporaryFile("w+", newline='') as fileobj: writer = csv.writer(fileobj) - self.assertRaises(TypeError, writer.writerows, None) rows = [['a\nb','b'],['c','x\r\nd']] writer.writerows(rows) fileobj.seek(0) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index 09738c8a..5e619d13 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -261,6 +261,10 @@ class TestCurses(unittest.TestCase): curses.putp(b'abc') curses.qiflush() curses.raw() ; curses.raw(1) + curses.set_escdelay(25) + self.assertEqual(curses.get_escdelay(), 25) + curses.set_tabsize(4) + self.assertEqual(curses.get_tabsize(), 4) if hasattr(curses, 'setsyx'): curses.setsyx(5,5) curses.tigetflag('hc') diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py old mode 100755 new mode 100644 index 21a7d7ec..b20103bd --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -2028,7 +2028,7 @@ class TestDocString(unittest.TestCase): class C: x: Union[int, type(None)] = None - self.assertDocStrEqual(C.__doc__, "C(x:Union[int, NoneType]=None)") + self.assertDocStrEqual(C.__doc__, "C(x:Optional[int]=None)") def test_docstring_list_field(self): @dataclass @@ -3134,13 +3134,6 @@ class TestReplace(unittest.TestCase): self.assertEqual(c1.x, 3) self.assertEqual(c1.y, 2) - self.assertRaises(TypeError, replace) - self.assertRaises(TypeError, replace, c, c) - with self.assertWarns(DeprecationWarning): - c1 = replace(obj=c, x=3) - self.assertEqual(c1.x, 3) - self.assertEqual(c1.y, 2) - def test_frozen(self): @dataclass(frozen=True) class C: diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index 1f37b537..fd62f37d 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -5201,6 +5201,7 @@ class CWhitebox(unittest.TestCase): DefaultContext = C.DefaultContext InvalidOperation = C.InvalidOperation + FloatOperation = C.FloatOperation DivisionByZero = C.DivisionByZero Overflow = C.Overflow Subnormal = C.Subnormal @@ -5274,6 +5275,7 @@ class CWhitebox(unittest.TestCase): Underflow: C.DecUnderflow, Overflow: C.DecOverflow, DivisionByZero: C.DecDivisionByZero, + FloatOperation: C.DecFloatOperation, InvalidOperation: C.DecIEEEInvalidOperation } IntCond = [ @@ -5476,6 +5478,44 @@ class CWhitebox(unittest.TestCase): self.assertEqual(Decimal.from_float(cls(101.1)), Decimal.from_float(101.1)) + # Issue 41540: + @unittest.skipIf(sys.platform.startswith("aix"), + "AIX: default ulimit: test is flaky because of extreme over-allocation") + def test_maxcontext_exact_arith(self): + + # Make sure that exact operations do not raise MemoryError due + # to huge intermediate values when the context precision is very + # large. + + # The following functions fill the available precision and are + # therefore not suitable for large precisions (by design of the + # specification). + MaxContextSkip = ['logical_invert', 'next_minus', 'next_plus', + 'logical_and', 'logical_or', 'logical_xor', + 'next_toward', 'rotate', 'shift'] + + Decimal = C.Decimal + Context = C.Context + localcontext = C.localcontext + + # Here only some functions that are likely candidates for triggering a + # MemoryError are tested. deccheck.py has an exhaustive test. + maxcontext = Context(prec=C.MAX_PREC, Emin=C.MIN_EMIN, Emax=C.MAX_EMAX) + with localcontext(maxcontext): + self.assertEqual(Decimal(0).exp(), 1) + self.assertEqual(Decimal(1).ln(), 0) + self.assertEqual(Decimal(1).log10(), 0) + self.assertEqual(Decimal(10**2).log10(), 2) + self.assertEqual(Decimal(10**223).log10(), 223) + self.assertEqual(Decimal(10**19).logb(), 19) + self.assertEqual(Decimal(4).sqrt(), 2) + self.assertEqual(Decimal("40E9").sqrt(), Decimal('2.0E+5')) + self.assertEqual(divmod(Decimal(10), 3), (3, 1)) + self.assertEqual(Decimal(10) // 3, 3) + self.assertEqual(Decimal(4) / 2, 2) + self.assertEqual(Decimal(400) ** -1, Decimal('0.0025')) + + @requires_docstrings @unittest.skipUnless(C, "test requires C version") class SignatureTest(unittest.TestCase): @@ -5600,13 +5640,13 @@ class SignatureTest(unittest.TestCase): args, kwds = mkargs(C, c_sig) try: getattr(c_type(9), attr)(*args, **kwds) - except Exception as err: + except Exception: raise TestFailed("invalid signature for %s: %s %s" % (c_func, args, kwds)) args, kwds = mkargs(P, p_sig) try: getattr(p_type(9), attr)(*args, **kwds) - except Exception as err: + except Exception: raise TestFailed("invalid signature for %s: %s %s" % (p_func, args, kwds)) doit('Decimal') diff --git a/Lib/test/test_decorators.py b/Lib/test/test_decorators.py index d0a2ec9f..298979e5 100644 --- a/Lib/test/test_decorators.py +++ b/Lib/test/test_decorators.py @@ -151,21 +151,18 @@ class TestDecorators(unittest.TestCase): self.assertEqual(counts['double'], 4) def test_errors(self): - # Test syntax restrictions - these are all compile-time errors: - # - for expr in [ "1+2", "x[3]", "(1, 2)" ]: - # Sanity check: is expr is a valid expression by itself? - compile(expr, "testexpr", "exec") - - codestr = "@%s\ndef f(): pass" % expr - self.assertRaises(SyntaxError, compile, codestr, "test", "exec") - # You can't put multiple decorators on a single line: - # - self.assertRaises(SyntaxError, compile, - "@f1 @f2\ndef f(): pass", "test", "exec") + # Test SyntaxErrors: + for stmt in ("x,", "x, y", "x = y", "pass", "import sys"): + compile(stmt, "test", "exec") # Sanity check. + with self.assertRaises(SyntaxError): + compile(f"@{stmt}\ndef f(): pass", "test", "exec") - # Test runtime errors + # Test TypeErrors that used to be SyntaxErrors: + for expr in ("1.+2j", "[1, 2][-1]", "(1, 2)", "True", "...", "None"): + compile(expr, "test", "eval") # Sanity check. + with self.assertRaises(TypeError): + exec(f"@{expr}\ndef f(): pass") def unimp(func): raise NotImplementedError @@ -179,6 +176,13 @@ class TestDecorators(unittest.TestCase): code = compile(codestr, "test", "exec") self.assertRaises(exc, eval, code, context) + def test_expressions(self): + for expr in ( + "(x,)", "(x, y)", "x := y", "(x := y)", "x @y", "(x @ y)", "x[0]", + "w[x].y.z", "w + x - (y + z)", "x(y)()(z)", "[w, x, y][z]", "x.y", + ): + compile(f"@{expr}\ndef f(): pass", "test", "exec") + def test_double(self): class C(object): @funcattrs(abc=1, xyz="haha") @@ -265,6 +269,45 @@ class TestDecorators(unittest.TestCase): self.assertEqual(bar(), 42) self.assertEqual(actions, expected_actions) + def test_wrapped_descriptor_inside_classmethod(self): + class BoundWrapper: + def __init__(self, wrapped): + self.__wrapped__ = wrapped + + def __call__(self, *args, **kwargs): + return self.__wrapped__(*args, **kwargs) + + class Wrapper: + def __init__(self, wrapped): + self.__wrapped__ = wrapped + + def __get__(self, instance, owner): + bound_function = self.__wrapped__.__get__(instance, owner) + return BoundWrapper(bound_function) + + def decorator(wrapped): + return Wrapper(wrapped) + + class Class: + @decorator + @classmethod + def inner(cls): + # This should already work. + return 'spam' + + @classmethod + @decorator + def outer(cls): + # Raised TypeError with a message saying that the 'Wrapper' + # object is not callable. + return 'eggs' + + self.assertEqual(Class.inner(), 'spam') + self.assertEqual(Class.outer(), 'eggs') + self.assertEqual(Class().inner(), 'spam') + self.assertEqual(Class().outer(), 'eggs') + + class TestClassDecorators(unittest.TestCase): def test_simple(self): diff --git a/Lib/test/test_defaultdict.py b/Lib/test/test_defaultdict.py index b9f1fb9f..b48c649f 100644 --- a/Lib/test/test_defaultdict.py +++ b/Lib/test/test_defaultdict.py @@ -183,5 +183,43 @@ class TestDefaultDict(unittest.TestCase): o = pickle.loads(s) self.assertEqual(d, o) + def test_union(self): + i = defaultdict(int, {1: 1, 2: 2}) + s = defaultdict(str, {0: "zero", 1: "one"}) + + i_s = i | s + self.assertIs(i_s.default_factory, int) + self.assertDictEqual(i_s, {1: "one", 2: 2, 0: "zero"}) + self.assertEqual(list(i_s), [1, 2, 0]) + + s_i = s | i + self.assertIs(s_i.default_factory, str) + self.assertDictEqual(s_i, {0: "zero", 1: 1, 2: 2}) + self.assertEqual(list(s_i), [0, 1, 2]) + + i_ds = i | dict(s) + self.assertIs(i_ds.default_factory, int) + self.assertDictEqual(i_ds, {1: "one", 2: 2, 0: "zero"}) + self.assertEqual(list(i_ds), [1, 2, 0]) + + ds_i = dict(s) | i + self.assertIs(ds_i.default_factory, int) + self.assertDictEqual(ds_i, {0: "zero", 1: 1, 2: 2}) + self.assertEqual(list(ds_i), [0, 1, 2]) + + with self.assertRaises(TypeError): + i | list(s.items()) + with self.assertRaises(TypeError): + list(s.items()) | i + + # We inherit a fine |= from dict, so just a few sanity checks here: + i |= list(s.items()) + self.assertIs(i.default_factory, int) + self.assertDictEqual(i, {1: "one", 2: 2, 0: "zero"}) + self.assertEqual(list(i), [1, 2, 0]) + + with self.assertRaises(TypeError): + i |= None + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 18397a86..9e875da3 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1613,8 +1613,8 @@ order (MRO) for bases """ spam_cm(spam.spamlist()) self.assertEqual( str(cm.exception), - "descriptor 'classmeth' requires a type " - "but received a 'xxsubtype.spamlist' instance") + "descriptor 'classmeth' for type 'xxsubtype.spamlist' " + "needs a type, not a 'xxsubtype.spamlist' as arg 2") with self.assertRaises(TypeError) as cm: spam_cm(list) @@ -1967,7 +1967,7 @@ order (MRO) for bases """ # different error messages. set_add = set.add - expected_errmsg = "descriptor 'add' of 'set' object needs an argument" + expected_errmsg = "unbound method set.add() needs an argument" with self.assertRaises(TypeError) as cm: set_add() @@ -2526,9 +2526,9 @@ order (MRO) for bases """ except TypeError: pass - # Two essentially featureless objects, just inheriting stuff from - # object. - self.assertEqual(dir(NotImplemented), dir(Ellipsis)) + # Two essentially featureless objects, (Ellipsis just inherits stuff + # from object. + self.assertEqual(dir(object()), dir(Ellipsis)) # Nasty test case for proxied objects class Wrapper(object): diff --git a/Lib/test/test_descrtut.py b/Lib/test/test_descrtut.py index b84d6447..8e25f58d 100644 --- a/Lib/test/test_descrtut.py +++ b/Lib/test/test_descrtut.py @@ -167,6 +167,7 @@ You can get the information from the list type: >>> pprint.pprint(dir(list)) # like list.__dict__.keys(), but sorted ['__add__', '__class__', + '__class_getitem__', '__contains__', '__delattr__', '__delitem__', diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index de483ab5..6b8596ff 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -37,6 +37,38 @@ class DictTest(unittest.TestCase): dictliteral = '{' + ', '.join(formatted_items) + '}' self.assertEqual(eval(dictliteral), dict(items)) + def test_merge_operator(self): + + a = {0: 0, 1: 1, 2: 1} + b = {1: 1, 2: 2, 3: 3} + + c = a.copy() + c |= b + + self.assertEqual(a | b, {0: 0, 1: 1, 2: 2, 3: 3}) + self.assertEqual(c, {0: 0, 1: 1, 2: 2, 3: 3}) + + c = b.copy() + c |= a + + self.assertEqual(b | a, {1: 1, 2: 1, 3: 3, 0: 0}) + self.assertEqual(c, {1: 1, 2: 1, 3: 3, 0: 0}) + + c = a.copy() + c |= [(1, 1), (2, 2), (3, 3)] + + self.assertEqual(c, {0: 0, 1: 1, 2: 2, 3: 3}) + + self.assertIs(a.__or__(None), NotImplemented) + self.assertIs(a.__or__(()), NotImplemented) + self.assertIs(a.__or__("BAD"), NotImplemented) + self.assertIs(a.__or__(""), NotImplemented) + + self.assertRaises(TypeError, a.__ior__, None) + self.assertEqual(a.__ior__(()), {0: 0, 1: 1, 2: 1}) + self.assertRaises(ValueError, a.__ior__, "BAD") + self.assertEqual(a.__ior__(""), {0: 0, 1: 1, 2: 1}) + def test_bool(self): self.assertIs(not {}, True) self.assertTrue({1: 2}) @@ -1292,6 +1324,19 @@ class DictTest(unittest.TestCase): d = {0: set()} (0, X()) in d.items() + def test_dict_contain_use_after_free(self): + # bpo-40489 + class S(str): + def __eq__(self, other): + d.clear() + return NotImplemented + + def __hash__(self): + return hash('test') + + d = {S(): 'value'} + self.assertFalse('test' in d) + def test_init_use_after_free(self): class X: def __hash__(self): diff --git a/Lib/test/test_dict_version.py b/Lib/test/test_dict_version.py index cb79e743..b2378651 100644 --- a/Lib/test/test_dict_version.py +++ b/Lib/test/test_dict_version.py @@ -98,20 +98,25 @@ class DictVersionTests(unittest.TestCase): value2 = AlwaysEqual() self.assertTrue(value1 == value2) self.assertFalse(value1 != value2) + self.assertIsNot(value1, value2) d = self.new_dict() self.check_version_changed(d, d.__setitem__, 'key', value1) + self.assertIs(d['key'], value1) # setting a key to a value equal to the current value # with dict.__setitem__() must change the version self.check_version_changed(d, d.__setitem__, 'key', value2) + self.assertIs(d['key'], value2) # setting a key to a value equal to the current value # with dict.update() must change the version self.check_version_changed(d, d.update, key=value1) + self.assertIs(d['key'], value1) d2 = self.new_dict(key=value2) self.check_version_changed(d, d.update, d2) + self.assertIs(d['key'], value2) def test_setdefault(self): d = self.new_dict() diff --git a/Lib/test/test_dictcomps.py b/Lib/test/test_dictcomps.py index 927e3103..472e3dfa 100644 --- a/Lib/test/test_dictcomps.py +++ b/Lib/test/test_dictcomps.py @@ -77,7 +77,7 @@ class DictComprehensionTest(unittest.TestCase): compile("{x: y for y, x in ((1, 2), (3, 4))} = 5", "", "exec") - with self.assertRaisesRegex(SyntaxError, "cannot assign"): + with self.assertRaisesRegex(SyntaxError, "illegal expression"): compile("{x: y for y, x in ((1, 2), (3, 4))} += 5", "", "exec") @@ -111,5 +111,22 @@ class DictComprehensionTest(unittest.TestCase): self.assertEqual(actual, expected) self.assertEqual(actual_calls, expected_calls) + def test_assignment_idiom_in_comprehensions(self): + expected = {1: 1, 2: 4, 3: 9, 4: 16} + actual = {j: j*j for i in range(4) for j in [i+1]} + self.assertEqual(actual, expected) + expected = {3: 2, 5: 6, 7: 12, 9: 20} + actual = {j+k: j*k for i in range(4) for j in [i+1] for k in [j+1]} + self.assertEqual(actual, expected) + expected = {3: 2, 5: 6, 7: 12, 9: 20} + actual = {j+k: j*k for i in range(4) for j, k in [(i+1, i+2)]} + self.assertEqual(actual, expected) + + def test_star_expression(self): + expected = {0: 0, 1: 1, 2: 4, 3: 9} + self.assertEqual({i: i*i for i in [*range(4)]}, expected) + self.assertEqual({i: i*i for i in (*range(4),)}, expected) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index 2763cbfb..be271beb 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -92,6 +92,12 @@ class DictSetTest(unittest.TestCase): d1 = {'a': 1, 'b': 2} d2 = {'b': 3, 'c': 2} d3 = {'d': 4, 'e': 5} + d4 = {'d': 4} + + class CustomSet(set): + def intersection(self, other): + return CustomSet(super().intersection(other)) + self.assertEqual(d1.keys() & d1.keys(), {'a', 'b'}) self.assertEqual(d1.keys() & d2.keys(), {'b'}) self.assertEqual(d1.keys() & d3.keys(), set()) @@ -99,6 +105,14 @@ class DictSetTest(unittest.TestCase): self.assertEqual(d1.keys() & set(d2.keys()), {'b'}) self.assertEqual(d1.keys() & set(d3.keys()), set()) self.assertEqual(d1.keys() & tuple(d1.keys()), {'a', 'b'}) + self.assertEqual(d3.keys() & d4.keys(), {'d'}) + self.assertEqual(d4.keys() & d3.keys(), {'d'}) + self.assertEqual(d4.keys() & set(d3.keys()), {'d'}) + self.assertIsInstance(d4.keys() & frozenset(d3.keys()), set) + self.assertIsInstance(frozenset(d3.keys()) & d4.keys(), set) + self.assertIs(type(d4.keys() & CustomSet(d3.keys())), set) + self.assertIs(type(d1.keys() & []), set) + self.assertIs(type([] & d1.keys()), set) self.assertEqual(d1.keys() | d1.keys(), {'a', 'b'}) self.assertEqual(d1.keys() | d2.keys(), {'a', 'b', 'c'}) @@ -200,6 +214,38 @@ class DictSetTest(unittest.TestCase): self.assertTrue(de.items().isdisjoint(de.items())) self.assertTrue(de.items().isdisjoint([1])) + def test_set_operations_with_iterator(self): + origin = {1: 2, 3: 4} + self.assertEqual(origin.keys() & iter([1, 2]), {1}) + self.assertEqual(origin.keys() | iter([1, 2]), {1, 2, 3}) + self.assertEqual(origin.keys() ^ iter([1, 2]), {2, 3}) + self.assertEqual(origin.keys() - iter([1, 2]), {3}) + + items = origin.items() + self.assertEqual(items & iter([(1, 2)]), {(1, 2)}) + self.assertEqual(items ^ iter([(1, 2)]), {(3, 4)}) + self.assertEqual(items | iter([(1, 2)]), {(1, 2), (3, 4)}) + self.assertEqual(items - iter([(1, 2)]), {(3, 4)}) + + def test_set_operations_with_noniterable(self): + with self.assertRaises(TypeError): + {}.keys() & 1 + with self.assertRaises(TypeError): + {}.keys() | 1 + with self.assertRaises(TypeError): + {}.keys() ^ 1 + with self.assertRaises(TypeError): + {}.keys() - 1 + + with self.assertRaises(TypeError): + {}.items() & 1 + with self.assertRaises(TypeError): + {}.items() | 1 + with self.assertRaises(TypeError): + {}.items() ^ 1 + with self.assertRaises(TypeError): + {}.items() - 1 + def test_recursive_repr(self): d = {} d[42] = d.values() diff --git a/Lib/test/test_difflib.py b/Lib/test/test_difflib.py index 5e2ca1a2..42ac1fdc 100644 --- a/Lib/test/test_difflib.py +++ b/Lib/test/test_difflib.py @@ -501,12 +501,58 @@ class TestJunkAPIs(unittest.TestCase): for char in ['a', '#', '\n', '\f', '\r', '\v']: self.assertFalse(difflib.IS_CHARACTER_JUNK(char), repr(char)) +class TestFindLongest(unittest.TestCase): + def longer_match_exists(self, a, b, n): + return any(b_part in a for b_part in + [b[i:i + n + 1] for i in range(0, len(b) - n - 1)]) + + def test_default_args(self): + a = 'foo bar' + b = 'foo baz bar' + sm = difflib.SequenceMatcher(a=a, b=b) + match = sm.find_longest_match() + self.assertEqual(match.a, 0) + self.assertEqual(match.b, 0) + self.assertEqual(match.size, 6) + self.assertEqual(a[match.a: match.a + match.size], + b[match.b: match.b + match.size]) + self.assertFalse(self.longer_match_exists(a, b, match.size)) + + match = sm.find_longest_match(alo=2, blo=4) + self.assertEqual(match.a, 3) + self.assertEqual(match.b, 7) + self.assertEqual(match.size, 4) + self.assertEqual(a[match.a: match.a + match.size], + b[match.b: match.b + match.size]) + self.assertFalse(self.longer_match_exists(a[2:], b[4:], match.size)) + + match = sm.find_longest_match(bhi=5, blo=1) + self.assertEqual(match.a, 1) + self.assertEqual(match.b, 1) + self.assertEqual(match.size, 4) + self.assertEqual(a[match.a: match.a + match.size], + b[match.b: match.b + match.size]) + self.assertFalse(self.longer_match_exists(a, b[1:5], match.size)) + + def test_longest_match_with_popular_chars(self): + a = 'dabcd' + b = 'd'*100 + 'abc' + 'd'*100 # length over 200 so popular used + sm = difflib.SequenceMatcher(a=a, b=b) + match = sm.find_longest_match(0, len(a), 0, len(b)) + self.assertEqual(match.a, 0) + self.assertEqual(match.b, 99) + self.assertEqual(match.size, 5) + self.assertEqual(a[match.a: match.a + match.size], + b[match.b: match.b + match.size]) + self.assertFalse(self.longer_match_exists(a, b, match.size)) + + def test_main(): difflib.HtmlDiff._default_prefix = 0 Doctests = doctest.DocTestSuite(difflib) run_unittest( TestWithAscii, TestAutojunk, TestSFpatches, TestSFbugs, - TestOutputFormat, TestBytes, TestJunkAPIs, Doctests) + TestOutputFormat, TestBytes, TestJunkAPIs, TestFindLongest, Doctests) if __name__ == '__main__': test_main() diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 03b28601..ac5836d2 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1,7 +1,7 @@ # Minimal tests for dis module from test.support import captured_stdout -from test.bytecode_helper import BytecodeTestCase +from test.support.bytecode_helper import BytecodeTestCase import unittest import sys import dis @@ -147,7 +147,7 @@ def bug1333982(x=[]): dis_bug1333982 = """\ %3d 0 LOAD_CONST 1 (0) 2 POP_JUMP_IF_TRUE 26 - 4 LOAD_GLOBAL 0 (AssertionError) + 4 LOAD_ASSERTION_ERROR 6 LOAD_CONST 2 ( at 0x..., file "%s", line %d>) 8 LOAD_CONST 3 ('bug1333982..') 10 MAKE_FUNCTION 0 @@ -278,32 +278,33 @@ dis_traceback = """\ --> 6 BINARY_TRUE_DIVIDE 8 POP_TOP 10 POP_BLOCK - 12 JUMP_FORWARD 40 (to 54) + 12 JUMP_FORWARD 42 (to 56) %3d >> 14 DUP_TOP 16 LOAD_GLOBAL 0 (Exception) - 18 COMPARE_OP 10 (exception match) - 20 POP_JUMP_IF_FALSE 52 - 22 POP_TOP - 24 STORE_FAST 0 (e) - 26 POP_TOP - 28 SETUP_FINALLY 10 (to 40) - -%3d 30 LOAD_FAST 0 (e) - 32 LOAD_ATTR 1 (__traceback__) - 34 STORE_FAST 1 (tb) - 36 POP_BLOCK - 38 BEGIN_FINALLY - >> 40 LOAD_CONST 0 (None) - 42 STORE_FAST 0 (e) - 44 DELETE_FAST 0 (e) - 46 END_FINALLY - 48 POP_EXCEPT - 50 JUMP_FORWARD 2 (to 54) - >> 52 END_FINALLY - -%3d >> 54 LOAD_FAST 1 (tb) - 56 RETURN_VALUE + 18 JUMP_IF_NOT_EXC_MATCH 54 + 20 POP_TOP + 22 STORE_FAST 0 (e) + 24 POP_TOP + 26 SETUP_FINALLY 18 (to 46) + +%3d 28 LOAD_FAST 0 (e) + 30 LOAD_ATTR 1 (__traceback__) + 32 STORE_FAST 1 (tb) + 34 POP_BLOCK + 36 POP_EXCEPT + 38 LOAD_CONST 0 (None) + 40 STORE_FAST 0 (e) + 42 DELETE_FAST 0 (e) + 44 JUMP_FORWARD 10 (to 56) + >> 46 LOAD_CONST 0 (None) + 48 STORE_FAST 0 (e) + 50 DELETE_FAST 0 (e) + 52 RERAISE + >> 54 RERAISE + +%3d >> 56 LOAD_FAST 1 (tb) + 58 RETURN_VALUE """ % (TRACEBACK_CODE.co_firstlineno + 1, TRACEBACK_CODE.co_firstlineno + 2, TRACEBACK_CODE.co_firstlineno + 3, @@ -331,6 +332,68 @@ dis_fstring = """\ 28 RETURN_VALUE """ % (_fstring.__code__.co_firstlineno + 1,) +def _tryfinally(a, b): + try: + return a + finally: + b() + +def _tryfinallyconst(b): + try: + return 1 + finally: + b() + +dis_tryfinally = """\ +%3d 0 SETUP_FINALLY 12 (to 14) + +%3d 2 LOAD_FAST 0 (a) + 4 POP_BLOCK + +%3d 6 LOAD_FAST 1 (b) + 8 CALL_FUNCTION 0 + 10 POP_TOP + +%3d 12 RETURN_VALUE + +%3d >> 14 LOAD_FAST 1 (b) + 16 CALL_FUNCTION 0 + 18 POP_TOP + 20 RERAISE + 22 LOAD_CONST 0 (None) + 24 RETURN_VALUE +""" % (_tryfinally.__code__.co_firstlineno + 1, + _tryfinally.__code__.co_firstlineno + 2, + _tryfinally.__code__.co_firstlineno + 4, + _tryfinally.__code__.co_firstlineno + 2, + _tryfinally.__code__.co_firstlineno + 4, + ) + +dis_tryfinallyconst = """\ +%3d 0 SETUP_FINALLY 12 (to 14) + +%3d 2 POP_BLOCK + +%3d 4 LOAD_FAST 0 (b) + 6 CALL_FUNCTION 0 + 8 POP_TOP + +%3d 10 LOAD_CONST 1 (1) + 12 RETURN_VALUE + +%3d >> 14 LOAD_FAST 0 (b) + 16 CALL_FUNCTION 0 + 18 POP_TOP + 20 RERAISE + 22 LOAD_CONST 0 (None) + 24 RETURN_VALUE +""" % (_tryfinallyconst.__code__.co_firstlineno + 1, + _tryfinallyconst.__code__.co_firstlineno + 2, + _tryfinallyconst.__code__.co_firstlineno + 4, + _tryfinallyconst.__code__.co_firstlineno + 2, + _tryfinallyconst.__code__.co_firstlineno + 4, + ) + def _g(x): yield x @@ -442,7 +505,8 @@ class DisTests(unittest.TestCase): def test_widths(self): for opcode, opname in enumerate(dis.opname): if opname in ('BUILD_MAP_UNPACK_WITH_CALL', - 'BUILD_TUPLE_UNPACK_WITH_CALL'): + 'BUILD_TUPLE_UNPACK_WITH_CALL', + 'JUMP_IF_NOT_EXC_MATCH'): continue with self.subTest(opname=opname): width = dis._OPNAME_WIDTH @@ -561,6 +625,10 @@ class DisTests(unittest.TestCase): def test_disassemble_fstring(self): self.do_disassembly_test(_fstring, dis_fstring) + def test_disassemble_try_finally(self): + self.do_disassembly_test(_tryfinally, dis_tryfinally) + self.do_disassembly_test(_tryfinallyconst, dis_tryfinallyconst) + def test_dis_none(self): try: del sys.last_traceback @@ -752,7 +820,7 @@ Argument count: 0 Positional-only arguments: 0 Kw-only arguments: 0 Number of locals: 2 -Stack size: 10 +Stack size: 9 Flags: OPTIMIZED, NEWLOCALS, NOFREE, COROUTINE Constants: 0: None @@ -977,49 +1045,62 @@ expected_opinfo_jumpy = [ Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=96, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=98, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=100, starts_line=None, is_jump_target=False), - Instruction(opname='SETUP_FINALLY', opcode=122, arg=70, argval=174, argrepr='to 174', offset=102, starts_line=20, is_jump_target=True), + Instruction(opname='SETUP_FINALLY', opcode=122, arg=96, argval=200, argrepr='to 200', offset=102, starts_line=20, is_jump_target=True), Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=118, argrepr='to 118', offset=104, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=106, starts_line=21, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False), Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=28, argval=146, argrepr='to 146', offset=116, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=144, argrepr='to 144', offset=116, starts_line=None, is_jump_target=False), Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=118, starts_line=22, is_jump_target=True), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=120, starts_line=None, is_jump_target=False), - Instruction(opname='COMPARE_OP', opcode=107, arg=10, argval='exception match', argrepr='exception match', offset=122, starts_line=None, is_jump_target=False), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=144, argval=144, argrepr='', offset=124, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_IF_NOT_EXC_MATCH', opcode=121, arg=142, argval=142, argrepr='', offset=122, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=124, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=126, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=128, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=130, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=132, starts_line=23, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=134, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=136, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=140, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=170, argrepr='to 170', offset=142, starts_line=None, is_jump_target=False), - Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=144, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=146, starts_line=25, is_jump_target=True), - Instruction(opname='SETUP_WITH', opcode=143, arg=14, argval=164, argrepr='to 164', offset=148, starts_line=None, is_jump_target=False), - Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=150, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=152, starts_line=26, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval='Never reach this', argrepr="'Never reach this'", offset=154, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=156, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False), - Instruction(opname='BEGIN_FINALLY', opcode=53, arg=None, argval=None, argrepr='', offset=162, starts_line=None, is_jump_target=False), - Instruction(opname='WITH_CLEANUP_START', opcode=81, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=True), - Instruction(opname='WITH_CLEANUP_FINISH', opcode=82, arg=None, argval=None, argrepr='', offset=166, starts_line=None, is_jump_target=False), - Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=170, starts_line=None, is_jump_target=True), - Instruction(opname='BEGIN_FINALLY', opcode=53, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=174, starts_line=28, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=176, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=178, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=130, starts_line=23, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=132, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=134, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=136, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=46, argval=188, argrepr='to 188', offset=140, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=142, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, starts_line=25, is_jump_target=True), + Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=172, argrepr='to 172', offset=146, starts_line=None, is_jump_target=False), + Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=148, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=150, starts_line=26, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=152, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=154, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=156, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=160, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=162, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=166, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=188, argrepr='to 188', offset=170, starts_line=None, is_jump_target=False), + Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=178, argval=178, argrepr='', offset=174, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=176, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=True), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), - Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=184, starts_line=None, is_jump_target=False), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=188, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=190, starts_line=28, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=192, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=194, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=196, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=10, argval=210, argrepr='to 210', offset=198, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=200, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=202, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=204, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=206, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=208, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=210, starts_line=None, is_jump_target=True), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=212, starts_line=None, is_jump_target=False), ] # One last piece of inspect fodder to check the default line number handling @@ -1032,6 +1113,10 @@ expected_opinfo_simple = [ class InstructionTests(BytecodeTestCase): + def __init__(self, *args): + super().__init__(*args) + self.maxDiff = None + def test_default_first_line(self): actual = dis.get_instructions(simple) self.assertEqual(list(actual), expected_opinfo_simple) @@ -1063,6 +1148,7 @@ class InstructionTests(BytecodeTestCase): # get_instructions has its own tests above, so can rely on it to validate # the object oriented API class BytecodeTests(unittest.TestCase): + def test_instantiation(self): # Test with function, method, code string and code object for obj in [_f, _C(1).__init__, "a=1", _f.__code__]: diff --git a/Lib/test/test_distutils.py b/Lib/test/test_distutils.py index d613abe4..a37f1179 100644 --- a/Lib/test/test_distutils.py +++ b/Lib/test/test_distutils.py @@ -10,9 +10,15 @@ import test.support def test_main(): + # used by regrtest test.support.run_unittest(distutils.tests.test_suite()) test.support.reap_children() +def load_tests(*_): + # used by unittest + return distutils.tests.test_suite() + + if __name__ == "__main__": test_main() diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index ad30a051..3efe5daf 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -665,7 +665,7 @@ plain ol' Python and is guaranteed to be available. >>> import builtins >>> tests = doctest.DocTestFinder().find(builtins) - >>> 800 < len(tests) < 820 # approximate number of objects with docstrings + >>> 816 < len(tests) < 836 # approximate number of objects with docstrings True >>> real_tests = [t for t in tests if len(t.examples) > 0] >>> len(real_tests) # objects that actually have doctests @@ -2494,7 +2494,7 @@ def test_unittest_reportflags(): def test_testfile(): r""" Tests for the `testfile()` function. This function runs all the -doctest examples in a given file. In its simple invokation, it is +doctest examples in a given file. In its simple invocation, it is called with the name of a file, which is taken to be relative to the calling module. The return value is (#failures, #tests). diff --git a/Lib/test/test_dummy_thread.py b/Lib/test/test_dummy_thread.py deleted file mode 100644 index 0f56fcf9..00000000 --- a/Lib/test/test_dummy_thread.py +++ /dev/null @@ -1,276 +0,0 @@ -import _dummy_thread as _thread -import time -import queue -import random -import unittest -from test import support -from unittest import mock - -DELAY = 0 - - -class LockTests(unittest.TestCase): - """Test lock objects.""" - - def setUp(self): - # Create a lock - self.lock = _thread.allocate_lock() - - def test_initlock(self): - #Make sure locks start locked - self.assertFalse(self.lock.locked(), - "Lock object is not initialized unlocked.") - - def test_release(self): - # Test self.lock.release() - self.lock.acquire() - self.lock.release() - self.assertFalse(self.lock.locked(), - "Lock object did not release properly.") - - def test_LockType_context_manager(self): - with _thread.LockType(): - pass - self.assertFalse(self.lock.locked(), - "Acquired Lock was not released") - - def test_improper_release(self): - #Make sure release of an unlocked thread raises RuntimeError - self.assertRaises(RuntimeError, self.lock.release) - - def test_cond_acquire_success(self): - #Make sure the conditional acquiring of the lock works. - self.assertTrue(self.lock.acquire(0), - "Conditional acquiring of the lock failed.") - - def test_cond_acquire_fail(self): - #Test acquiring locked lock returns False - self.lock.acquire(0) - self.assertFalse(self.lock.acquire(0), - "Conditional acquiring of a locked lock incorrectly " - "succeeded.") - - def test_uncond_acquire_success(self): - #Make sure unconditional acquiring of a lock works. - self.lock.acquire() - self.assertTrue(self.lock.locked(), - "Uncondional locking failed.") - - def test_uncond_acquire_return_val(self): - #Make sure that an unconditional locking returns True. - self.assertIs(self.lock.acquire(1), True, - "Unconditional locking did not return True.") - self.assertIs(self.lock.acquire(), True) - - def test_uncond_acquire_blocking(self): - #Make sure that unconditional acquiring of a locked lock blocks. - def delay_unlock(to_unlock, delay): - """Hold on to lock for a set amount of time before unlocking.""" - time.sleep(delay) - to_unlock.release() - - self.lock.acquire() - start_time = int(time.monotonic()) - _thread.start_new_thread(delay_unlock,(self.lock, DELAY)) - if support.verbose: - print() - print("*** Waiting for thread to release the lock "\ - "(approx. %s sec.) ***" % DELAY) - self.lock.acquire() - end_time = int(time.monotonic()) - if support.verbose: - print("done") - self.assertGreaterEqual(end_time - start_time, DELAY, - "Blocking by unconditional acquiring failed.") - - @mock.patch('time.sleep') - def test_acquire_timeout(self, mock_sleep): - """Test invoking acquire() with a positive timeout when the lock is - already acquired. Ensure that time.sleep() is invoked with the given - timeout and that False is returned.""" - - self.lock.acquire() - retval = self.lock.acquire(waitflag=0, timeout=1) - self.assertTrue(mock_sleep.called) - mock_sleep.assert_called_once_with(1) - self.assertEqual(retval, False) - - def test_lock_representation(self): - self.lock.acquire() - self.assertIn("locked", repr(self.lock)) - self.lock.release() - self.assertIn("unlocked", repr(self.lock)) - - -class RLockTests(unittest.TestCase): - """Test dummy RLock objects.""" - - def setUp(self): - self.rlock = _thread.RLock() - - def test_multiple_acquire(self): - self.assertIn("unlocked", repr(self.rlock)) - self.rlock.acquire() - self.rlock.acquire() - self.assertIn("locked", repr(self.rlock)) - self.rlock.release() - self.assertIn("locked", repr(self.rlock)) - self.rlock.release() - self.assertIn("unlocked", repr(self.rlock)) - self.assertRaises(RuntimeError, self.rlock.release) - - -class MiscTests(unittest.TestCase): - """Miscellaneous tests.""" - - def test_exit(self): - self.assertRaises(SystemExit, _thread.exit) - - def test_ident(self): - self.assertIsInstance(_thread.get_ident(), int, - "_thread.get_ident() returned a non-integer") - self.assertGreater(_thread.get_ident(), 0) - - def test_LockType(self): - self.assertIsInstance(_thread.allocate_lock(), _thread.LockType, - "_thread.LockType is not an instance of what " - "is returned by _thread.allocate_lock()") - - def test_set_sentinel(self): - self.assertIsInstance(_thread._set_sentinel(), _thread.LockType, - "_thread._set_sentinel() did not return a " - "LockType instance.") - - def test_interrupt_main(self): - #Calling start_new_thread with a function that executes interrupt_main - # should raise KeyboardInterrupt upon completion. - def call_interrupt(): - _thread.interrupt_main() - - self.assertRaises(KeyboardInterrupt, - _thread.start_new_thread, - call_interrupt, - tuple()) - - def test_interrupt_in_main(self): - self.assertRaises(KeyboardInterrupt, _thread.interrupt_main) - - def test_stack_size_None(self): - retval = _thread.stack_size(None) - self.assertEqual(retval, 0) - - def test_stack_size_not_None(self): - with self.assertRaises(_thread.error) as cm: - _thread.stack_size("") - self.assertEqual(cm.exception.args[0], - "setting thread stack size not supported") - - -class ThreadTests(unittest.TestCase): - """Test thread creation.""" - - def test_arg_passing(self): - #Make sure that parameter passing works. - def arg_tester(queue, arg1=False, arg2=False): - """Use to test _thread.start_new_thread() passes args properly.""" - queue.put((arg1, arg2)) - - testing_queue = queue.Queue(1) - _thread.start_new_thread(arg_tester, (testing_queue, True, True)) - result = testing_queue.get() - self.assertTrue(result[0] and result[1], - "Argument passing for thread creation " - "using tuple failed") - - _thread.start_new_thread( - arg_tester, - tuple(), - {'queue':testing_queue, 'arg1':True, 'arg2':True}) - - result = testing_queue.get() - self.assertTrue(result[0] and result[1], - "Argument passing for thread creation " - "using kwargs failed") - - _thread.start_new_thread( - arg_tester, - (testing_queue, True), - {'arg2':True}) - - result = testing_queue.get() - self.assertTrue(result[0] and result[1], - "Argument passing for thread creation using both tuple" - " and kwargs failed") - - def test_multi_thread_creation(self): - def queue_mark(queue, delay): - time.sleep(delay) - queue.put(_thread.get_ident()) - - thread_count = 5 - testing_queue = queue.Queue(thread_count) - - if support.verbose: - print() - print("*** Testing multiple thread creation " - "(will take approx. %s to %s sec.) ***" % ( - DELAY, thread_count)) - - for count in range(thread_count): - if DELAY: - local_delay = round(random.random(), 1) - else: - local_delay = 0 - _thread.start_new_thread(queue_mark, - (testing_queue, local_delay)) - time.sleep(DELAY) - if support.verbose: - print('done') - self.assertEqual(testing_queue.qsize(), thread_count, - "Not all %s threads executed properly " - "after %s sec." % (thread_count, DELAY)) - - def test_args_not_tuple(self): - """ - Test invoking start_new_thread() with a non-tuple value for "args". - Expect TypeError with a meaningful error message to be raised. - """ - with self.assertRaises(TypeError) as cm: - _thread.start_new_thread(mock.Mock(), []) - self.assertEqual(cm.exception.args[0], "2nd arg must be a tuple") - - def test_kwargs_not_dict(self): - """ - Test invoking start_new_thread() with a non-dict value for "kwargs". - Expect TypeError with a meaningful error message to be raised. - """ - with self.assertRaises(TypeError) as cm: - _thread.start_new_thread(mock.Mock(), tuple(), kwargs=[]) - self.assertEqual(cm.exception.args[0], "3rd arg must be a dict") - - def test_SystemExit(self): - """ - Test invoking start_new_thread() with a function that raises - SystemExit. - The exception should be discarded. - """ - func = mock.Mock(side_effect=SystemExit()) - try: - _thread.start_new_thread(func, tuple()) - except SystemExit: - self.fail("start_new_thread raised SystemExit.") - - @mock.patch('traceback.print_exc') - def test_RaiseException(self, mock_print_exc): - """ - Test invoking start_new_thread() with a function that raises exception. - - The exception should be discarded and the traceback should be printed - via traceback.print_exc() - """ - func = mock.Mock(side_effect=Exception) - _thread.start_new_thread(func, tuple()) - self.assertTrue(mock_print_exc.called) - -if __name__ == '__main__': - unittest.main() diff --git a/Lib/test/test_dummy_threading.py b/Lib/test/test_dummy_threading.py deleted file mode 100644 index a0c2972a..00000000 --- a/Lib/test/test_dummy_threading.py +++ /dev/null @@ -1,60 +0,0 @@ -from test import support -import unittest -import dummy_threading as _threading -import time - -class DummyThreadingTestCase(unittest.TestCase): - - class TestThread(_threading.Thread): - - def run(self): - global running - global sema - global mutex - # Uncomment if testing another module, such as the real 'threading' - # module. - #delay = random.random() * 2 - delay = 0 - if support.verbose: - print('task', self.name, 'will run for', delay, 'sec') - sema.acquire() - mutex.acquire() - running += 1 - if support.verbose: - print(running, 'tasks are running') - mutex.release() - time.sleep(delay) - if support.verbose: - print('task', self.name, 'done') - mutex.acquire() - running -= 1 - if support.verbose: - print(self.name, 'is finished.', running, 'tasks are running') - mutex.release() - sema.release() - - def setUp(self): - self.numtasks = 10 - global sema - sema = _threading.BoundedSemaphore(value=3) - global mutex - mutex = _threading.RLock() - global running - running = 0 - self.threads = [] - - def test_tasks(self): - for i in range(self.numtasks): - t = self.TestThread(name=""%i) - self.threads.append(t) - t.start() - - if support.verbose: - print('waiting for all tasks to complete') - for t in self.threads: - t.join() - if support.verbose: - print('all tasks done') - -if __name__ == '__main__': - unittest.main() diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index 4b5b4425..1bdcfa12 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -301,7 +301,7 @@ class TestParser(TestParserMixin, TestEmailBase): [], '') - def test_get_unstructured_invaild_ew(self): + def test_get_unstructured_invalid_ew(self): self._test_get_x(self._get_unst, '=?test val', '=?test val', diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index 9e5c6adc..59eabb00 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -1008,7 +1008,7 @@ Test""") Subject: the first part of this is short, but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself""") - def test_splittable_leading_char_followed_by_overlong_unsplitable(self): + def test_splittable_leading_char_followed_by_overlong_unsplittable(self): eq = self.ndiffAssertEqual h = Header(', but_the_second' '_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line' @@ -1017,7 +1017,7 @@ Subject: the first part of this is short, , but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself""") - def test_multiple_splittable_leading_char_followed_by_overlong_unsplitable(self): + def test_multiple_splittable_leading_char_followed_by_overlong_unsplittable(self): eq = self.ndiffAssertEqual h = Header(', , but_the_second' '_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line' @@ -1026,14 +1026,14 @@ Subject: the first part of this is short, , , but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself""") - def test_trailing_splitable_on_overlong_unsplitable(self): + def test_trailing_splittable_on_overlong_unsplittable(self): eq = self.ndiffAssertEqual h = Header('this_part_does_not_fit_within_maxlinelen_and_thus_should_' 'be_on_a_line_all_by_itself;') eq(h.encode(), "this_part_does_not_fit_within_maxlinelen_and_thus_should_" "be_on_a_line_all_by_itself;") - def test_trailing_splitable_on_overlong_unsplitable_with_leading_splitable(self): + def test_trailing_splittable_on_overlong_unsplittable_with_leading_splittable(self): eq = self.ndiffAssertEqual h = Header('; ' 'this_part_does_not_fit_within_maxlinelen_and_thus_should_' @@ -1466,7 +1466,7 @@ Blah blah blah g.flatten(msg) self.assertEqual(b.getvalue(), source + b'>From R\xc3\xb6lli\n') - def test_mutltipart_with_bad_bytes_in_cte(self): + def test_multipart_with_bad_bytes_in_cte(self): # bpo30835 source = textwrap.dedent("""\ From: aperson@example.com diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index 7ade9684..68bbc956 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -7,6 +7,7 @@ from email.message import Message from test.test_email import TestEmailBase, parameterize from email import headerregistry from email.headerregistry import Address, Group +from test.support import ALWAYS_EQ DITTO = object() @@ -1563,6 +1564,24 @@ class TestAddressAndGroup(TestEmailBase): self.assertEqual(m['to'], 'foo bar:;') self.assertEqual(m['to'].addresses, g.addresses) + def test_address_comparison(self): + a = Address('foo', 'bar', 'example.com') + self.assertEqual(Address('foo', 'bar', 'example.com'), a) + self.assertNotEqual(Address('baz', 'bar', 'example.com'), a) + self.assertNotEqual(Address('foo', 'baz', 'example.com'), a) + self.assertNotEqual(Address('foo', 'bar', 'baz'), a) + self.assertFalse(a == object()) + self.assertTrue(a == ALWAYS_EQ) + + def test_group_comparison(self): + a = Address('foo', 'bar', 'example.com') + g = Group('foo bar', [a]) + self.assertEqual(Group('foo bar', (a,)), g) + self.assertNotEqual(Group('baz', [a]), g) + self.assertNotEqual(Group('foo bar', []), g) + self.assertFalse(g == object()) + self.assertTrue(g == ALWAYS_EQ) + class TestFolding(TestHeaderBase): diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 64a26b9f..aeb44d78 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -267,9 +267,8 @@ class EmbeddingTests(EmbeddingTestsMixin, unittest.TestCase): def test_bpo20891(self): """ - bpo-20891: Calling PyGILState_Ensure in a non-Python thread before - calling PyEval_InitThreads() must not crash. PyGILState_Ensure() must - call PyEval_InitThreads() for us in this case. + bpo-20891: Calling PyGILState_Ensure in a non-Python thread must not + crash. """ out, err = self.run_embedded_interpreter("test_bpo20891") self.assertEqual(out, '') @@ -348,6 +347,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'isolated': 0, 'use_environment': 1, 'dev_mode': 0, + '_use_peg_parser': 1, 'install_signal_handlers': 1, 'use_hash_seed': 0, @@ -356,7 +356,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'tracemalloc': 0, 'import_time': 0, 'show_ref_count': 0, - 'show_alloc_count': 0, 'dump_refs': 0, 'malloc_stats': 0, @@ -367,6 +366,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'program_name': GET_DEFAULT_CONFIG, 'parse_argv': 0, 'argv': [""], + '_orig_argv': [], 'xoptions': [], 'warnoptions': [], @@ -381,6 +381,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'exec_prefix': GET_DEFAULT_CONFIG, 'base_exec_prefix': GET_DEFAULT_CONFIG, 'module_search_paths': GET_DEFAULT_CONFIG, + 'platlibdir': sys.platlibdir, 'site_import': 1, 'bytes_warning': 0, @@ -407,6 +408,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'check_hash_pycs_mode': 'default', 'pathconfig_warnings': 1, '_init_main': 1, + '_isolated_interpreter': 0, } if MS_WINDOWS: CONFIG_COMPAT.update({ @@ -585,13 +587,14 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): if value is self.GET_DEFAULT_CONFIG: expected[key] = config[key] - pythonpath_env = expected['pythonpath_env'] - if pythonpath_env is not None: - paths = pythonpath_env.split(os.path.pathsep) - expected['module_search_paths'] = [*paths, *expected['module_search_paths']] - if modify_path_cb is not None: - expected['module_search_paths'] = expected['module_search_paths'].copy() - modify_path_cb(expected['module_search_paths']) + if expected['module_search_paths'] is not self.IGNORE_CONFIG: + pythonpath_env = expected['pythonpath_env'] + if pythonpath_env is not None: + paths = pythonpath_env.split(os.path.pathsep) + expected['module_search_paths'] = [*paths, *expected['module_search_paths']] + if modify_path_cb is not None: + expected['module_search_paths'] = expected['module_search_paths'].copy() + modify_path_cb(expected['module_search_paths']) for key in self.COPY_PRE_CONFIG: if key not in expected_preconfig: @@ -730,15 +733,20 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'tracemalloc': 2, 'import_time': 1, 'show_ref_count': 1, - 'show_alloc_count': 1, 'malloc_stats': 1, + '_use_peg_parser': 0, 'stdio_encoding': 'iso8859-1', 'stdio_errors': 'replace', 'pycache_prefix': 'conf_pycache_prefix', 'program_name': './conf_program_name', - 'argv': ['-c', 'arg2', ], + 'argv': ['-c', 'arg2'], + '_orig_argv': ['python3', + '-W', 'cmdline_warnoption', + '-X', 'cmdline_xoption', + '-c', 'pass', + 'arg2'], 'parse_argv': 1, 'xoptions': [ 'config_xoption1=3', @@ -765,9 +773,13 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'buffered_stdio': 0, 'user_site_directory': 0, 'faulthandler': 1, + 'platlibdir': 'my_platlibdir', + 'module_search_paths': self.IGNORE_CONFIG, 'check_hash_pycs_mode': 'always', 'pathconfig_warnings': 0, + + '_isolated_interpreter': 1, } self.check_all_configs("test_init_from_config", config, preconfig, api=API_COMPAT) @@ -794,6 +806,9 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'user_site_directory': 0, 'faulthandler': 1, 'warnoptions': ['EnvVar'], + 'platlibdir': 'env_platlibdir', + 'module_search_paths': self.IGNORE_CONFIG, + '_use_peg_parser': 0, } self.check_all_configs("test_init_compat_env", config, preconfig, api=API_COMPAT) @@ -821,6 +836,9 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'user_site_directory': 0, 'faulthandler': 1, 'warnoptions': ['EnvVar'], + 'platlibdir': 'env_platlibdir', + 'module_search_paths': self.IGNORE_CONFIG, + '_use_peg_parser': 0, } self.check_all_configs("test_init_python_env", config, preconfig, api=API_PYTHON) @@ -861,7 +879,8 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): } config = { 'argv': ['script.py'], - 'run_filename': 'script.py', + '_orig_argv': ['python3', '-X', 'dev', 'script.py'], + 'run_filename': os.path.abspath('script.py'), 'dev_mode': 1, 'faulthandler': 1, 'warnoptions': ['default'], @@ -875,9 +894,14 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): preconfig = { 'isolated': 0, } + argv = ["python3", + "-E", "-I", + "-X", "dev", + "-X", "utf8", + "script.py"] config = { - 'argv': ["python3", "-E", "-I", - "-X", "dev", "-X", "utf8", "script.py"], + 'argv': argv, + '_orig_argv': argv, 'isolated': 0, } self.check_all_configs("test_preinit_dont_parse_argv", config, preconfig, @@ -956,6 +980,9 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'ignore:::sysadd_warnoption', 'ignore:::config_warnoption', ], + '_orig_argv': ['python3', + '-W', 'ignore:::cmdline_warnoption', + '-X', 'cmdline_xoption'], } self.check_all_configs("test_init_sys_add", config, api=API_PYTHON) @@ -964,6 +991,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'print(json.dumps(_testinternalcapi.get_configs()))') config = { 'argv': ['-c', 'arg2'], + '_orig_argv': ['python3', '-c', code, 'arg2'], 'program_name': './python3', 'run_command': code + '\n', 'parse_argv': 1, @@ -975,6 +1003,9 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'print(json.dumps(_testinternalcapi.get_configs()))') config = { 'argv': ['-c', 'arg2'], + '_orig_argv': ['python3', + '-c', code, + 'arg2'], 'program_name': './python3', 'run_command': code + '\n', 'parse_argv': 1, @@ -988,6 +1019,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): config = { 'parse_argv': 1, 'argv': ['-c', 'arg1', '-v', 'arg3'], + '_orig_argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], 'program_name': './argv0', 'run_command': 'pass\n', 'use_environment': 0, @@ -1001,6 +1033,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): config = { 'parse_argv': 0, 'argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], + '_orig_argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], 'program_name': './argv0', } self.check_all_configs("test_init_dont_parse_argv", config, pre_config, @@ -1073,11 +1106,11 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): else: ver = sys.version_info return [ - os.path.join(prefix, 'lib', + os.path.join(prefix, sys.platlibdir, f'python{ver.major}{ver.minor}.zip'), - os.path.join(prefix, 'lib', + os.path.join(prefix, sys.platlibdir, f'python{ver.major}.{ver.minor}'), - os.path.join(exec_prefix, 'lib', + os.path.join(exec_prefix, sys.platlibdir, f'python{ver.major}.{ver.minor}', 'lib-dynload'), ] @@ -1194,7 +1227,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): if not MS_WINDOWS: lib_dynload = os.path.join(pyvenv_home, - 'lib', + sys.platlibdir, f'python{ver.major}.{ver.minor}', 'lib-dynload') os.makedirs(lib_dynload) @@ -1304,10 +1337,17 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'faulthandler': 1, 'bytes_warning': 1, 'warnoptions': warnoptions, + '_orig_argv': ['python3', + '-Wignore:::cmdline1', + '-Wignore:::cmdline2'], } self.check_all_configs("test_init_warnoptions", config, preconfig, api=API_PYTHON) + def test_get_argc_argv(self): + self.run_embedded_interpreter("test_get_argc_argv") + # ignore output + class AuditingTests(EmbeddingTestsMixin, unittest.TestCase): def test_open_code_hook(self): @@ -1320,36 +1360,44 @@ class AuditingTests(EmbeddingTestsMixin, unittest.TestCase): self.run_embedded_interpreter("test_audit_subinterpreter") def test_audit_run_command(self): - self.run_embedded_interpreter("test_audit_run_command", timeout=3, returncode=1) + self.run_embedded_interpreter("test_audit_run_command", + timeout=support.SHORT_TIMEOUT, + returncode=1) def test_audit_run_file(self): - self.run_embedded_interpreter("test_audit_run_file", timeout=3, returncode=1) + self.run_embedded_interpreter("test_audit_run_file", + timeout=support.SHORT_TIMEOUT, + returncode=1) def test_audit_run_interactivehook(self): - startup = os.path.join(self.oldcwd, support.TESTFN) + (support.FS_NONASCII or '') + ".py" + startup = os.path.join(self.oldcwd, support.TESTFN) + ".py" with open(startup, "w", encoding="utf-8") as f: print("import sys", file=f) print("sys.__interactivehook__ = lambda: None", file=f) try: env = {**remove_python_envvars(), "PYTHONSTARTUP": startup} - self.run_embedded_interpreter("test_audit_run_interactivehook", timeout=5, + self.run_embedded_interpreter("test_audit_run_interactivehook", + timeout=support.SHORT_TIMEOUT, returncode=10, env=env) finally: os.unlink(startup) def test_audit_run_startup(self): - startup = os.path.join(self.oldcwd, support.TESTFN) + (support.FS_NONASCII or '') + ".py" + startup = os.path.join(self.oldcwd, support.TESTFN) + ".py" with open(startup, "w", encoding="utf-8") as f: print("pass", file=f) try: env = {**remove_python_envvars(), "PYTHONSTARTUP": startup} - self.run_embedded_interpreter("test_audit_run_startup", timeout=5, + self.run_embedded_interpreter("test_audit_run_startup", + timeout=support.SHORT_TIMEOUT, returncode=10, env=env) finally: os.unlink(startup) def test_audit_run_stdin(self): - self.run_embedded_interpreter("test_audit_run_stdin", timeout=3, returncode=1) + self.run_embedded_interpreter("test_audit_run_stdin", + timeout=support.SHORT_TIMEOUT, + returncode=1) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 745962a1..0e6b1b16 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -9,6 +9,7 @@ from enum import Enum, IntEnum, EnumMeta, Flag, IntFlag, unique, auto from io import StringIO from pickle import dumps, loads, PicklingError, HIGHEST_PROTOCOL from test import support +from test.support import ALWAYS_EQ from datetime import timedelta @@ -1562,13 +1563,10 @@ class TestEnum(unittest.TestCase): self.assertEqual(list(map(int, Color)), [1, 2, 3]) def test_equality(self): - class AlwaysEqual: - def __eq__(self, other): - return True class OrdinaryEnum(Enum): a = 1 - self.assertEqual(AlwaysEqual(), OrdinaryEnum.a) - self.assertEqual(OrdinaryEnum.a, AlwaysEqual()) + self.assertEqual(ALWAYS_EQ, OrdinaryEnum.a) + self.assertEqual(OrdinaryEnum.a, ALWAYS_EQ) def test_ordered_mixin(self): class OrderedEnum(Enum): @@ -2351,12 +2349,13 @@ class TestFlag(unittest.TestCase): d = 4 f = 6 # Bizarre.c | Bizarre.d - self.assertRaisesRegex(ValueError, "5 is not a valid Bizarre", Bizarre, 5) - self.assertRaisesRegex(ValueError, "5 is not a valid Bizarre", Bizarre, 5) - self.assertRaisesRegex(ValueError, "2 is not a valid Bizarre", Bizarre, 2) - self.assertRaisesRegex(ValueError, "2 is not a valid Bizarre", Bizarre, 2) - self.assertRaisesRegex(ValueError, "1 is not a valid Bizarre", Bizarre, 1) - self.assertRaisesRegex(ValueError, "1 is not a valid Bizarre", Bizarre, 1) + name = "TestFlag.test_cascading_failure..Bizarre" + self.assertRaisesRegex(ValueError, "5 is not a valid " + name, Bizarre, 5) + self.assertRaisesRegex(ValueError, "5 is not a valid " + name, Bizarre, 5) + self.assertRaisesRegex(ValueError, "2 is not a valid " + name, Bizarre, 2) + self.assertRaisesRegex(ValueError, "2 is not a valid " + name, Bizarre, 2) + self.assertRaisesRegex(ValueError, "1 is not a valid " + name, Bizarre, 1) + self.assertRaisesRegex(ValueError, "1 is not a valid " + name, Bizarre, 1) def test_duplicate_auto(self): class Dupes(Enum): diff --git a/Lib/test/test_eof.py b/Lib/test/test_eof.py index 9ef8eb11..51cbbd8e 100644 --- a/Lib/test/test_eof.py +++ b/Lib/test/test_eof.py @@ -26,6 +26,15 @@ class EOFTestCase(unittest.TestCase): else: raise support.TestFailed + def test_eof_with_line_continuation(self): + expect = "unexpected EOF while parsing (, line 1)" + try: + compile('"\\xhh" \\', '', 'exec', dont_inherit=True) + except SyntaxError as msg: + self.assertEqual(str(msg), expect) + else: + raise support.TestFailed + def test_line_continuation_EOF(self): """A continuation at the end of input must be an error; bpo2180.""" expect = 'unexpected EOF while parsing (, line 1)' @@ -43,10 +52,14 @@ class EOFTestCase(unittest.TestCase): file_name = script_helper.make_script(temp_dir, 'foo', '\\') rc, out, err = script_helper.assert_python_failure(file_name) self.assertIn(b'unexpected EOF while parsing', err) + self.assertIn(b'line 2', err) + self.assertIn(b'\\', err) file_name = script_helper.make_script(temp_dir, 'foo', 'y = 6\\') rc, out, err = script_helper.assert_python_failure(file_name) self.assertIn(b'unexpected EOF while parsing', err) + self.assertIn(b'line 2', err) + self.assertIn(b'y = 6\\', err) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py index 8ac0f31d..10f148fe 100644 --- a/Lib/test/test_epoll.py +++ b/Lib/test/test_epoll.py @@ -225,7 +225,10 @@ class TestEPoll(unittest.TestCase): self.assertFalse(then - now > 0.01) server.close() - ep.unregister(fd) + + with self.assertRaises(OSError) as cm: + ep.unregister(fd) + self.assertEqual(cm.exception.errno, errno.EBADF) def test_close(self): open_file = open(__file__, "rb") diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 457b46e0..47f37114 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -34,16 +34,17 @@ class BrokenStrException(Exception): class ExceptionTests(unittest.TestCase): def raise_catch(self, exc, excname): - try: - raise exc("spam") - except exc as err: - buf1 = str(err) - try: - raise exc("spam") - except exc as err: - buf2 = str(err) - self.assertEqual(buf1, buf2) - self.assertEqual(exc.__name__, excname) + with self.subTest(exc=exc, excname=excname): + try: + raise exc("spam") + except exc as err: + buf1 = str(err) + try: + raise exc("spam") + except exc as err: + buf2 = str(err) + self.assertEqual(buf1, buf2) + self.assertEqual(exc.__name__, excname) def testRaising(self): self.raise_catch(AttributeError, "AttributeError") @@ -134,13 +135,14 @@ class ExceptionTests(unittest.TestCase): # these code fragments def ckmsg(src, msg): - try: - compile(src, '', 'exec') - except SyntaxError as e: - if e.msg != msg: - self.fail("expected %s, got %s" % (msg, e.msg)) - else: - self.fail("failed to get expected SyntaxError") + with self.subTest(src=src, msg=msg): + try: + compile(src, '', 'exec') + except SyntaxError as e: + if e.msg != msg: + self.fail("expected %s, got %s" % (msg, e.msg)) + else: + self.fail("failed to get expected SyntaxError") s = '''if 1: try: @@ -179,8 +181,8 @@ class ExceptionTests(unittest.TestCase): s = '''if True:\n print()\n\texec "mixed tabs and spaces"''' ckmsg(s, "inconsistent use of tabs and spaces in indentation", TabError) - def testSyntaxErrorOffset(self): - def check(src, lineno, offset, encoding='utf-8'): + def check(self, src, lineno, offset, encoding='utf-8'): + with self.subTest(source=src, lineno=lineno, offset=offset): with self.assertRaises(SyntaxError) as cm: compile(src, '', 'exec') self.assertEqual(cm.exception.lineno, lineno) @@ -189,8 +191,10 @@ class ExceptionTests(unittest.TestCase): if not isinstance(src, str): src = src.decode(encoding, 'replace') line = src.split('\n')[lineno-1] - self.assertEqual(cm.exception.text.rstrip('\n'), line) + self.assertIn(line, cm.exception.text) + def testSyntaxErrorOffset(self): + check = self.check check('def fact(x):\n\treturn x!\n', 2, 10) check('1 +\n', 1, 4) check('def spam():\n print(1)\n print(2)', 3, 10) @@ -218,6 +222,18 @@ class ExceptionTests(unittest.TestCase): check(b'\xce\xb1 = 0xI', 1, 6) check(b'# -*- coding: iso8859-7 -*-\n\xe1 = 0xI', 2, 6, encoding='iso8859-7') + check(b"""if 1: + def foo(): + ''' + + def bar(): + pass + + def baz(): + '''quux''' + """, 9, 20) + check("pass\npass\npass\n(1+)\npass\npass\npass", 4, 4) + check("(1+)", 1, 4) # Errors thrown by symtable.c check('x = [(yield i) for i in range(3)]', 1, 5) @@ -228,20 +244,17 @@ class ExceptionTests(unittest.TestCase): check('nonlocal x', 1, 1) check('def f():\n global x\n nonlocal x', 2, 3) - # Errors thrown by ast.c - check('for 1 in []: pass', 1, 5) - check('def f(*):\n pass', 1, 7) - check('[*x for x in xs]', 1, 2) - check('def f():\n x, y: int', 2, 3) - check('(yield i) = 2', 1, 1) - check('foo(x for x in range(10), 100)', 1, 5) - check('foo(1=2)', 1, 5) - # Errors thrown by future.c check('from __future__ import doesnt_exist', 1, 1) check('from __future__ import braces', 1, 1) check('x=1\nfrom __future__ import division', 2, 1) - + check('foo(1=2)', 1, 5) + check('def f():\n x, y: int', 2, 3) + check('[*x for x in xs]', 1, 2) + check('foo(x for x in range(10), 100)', 1, 5) + check('(yield i) = 2', 1, 1 if support.use_old_parser() else 2) + check('def f(*):\n pass', 1, 7 if support.use_old_parser() else 8) + check('for 1 in []: pass', 1, 5) @cpython_only def testSettingException(self): @@ -995,7 +1008,7 @@ class ExceptionTests(unittest.TestCase): # finalization of these locals. code = """if 1: import sys - from _testcapi import get_recursion_depth + from _testinternalcapi import get_recursion_depth class MyException(Exception): pass @@ -1079,8 +1092,9 @@ class ExceptionTests(unittest.TestCase): """ with SuppressCrashReport(): rc, out, err = script_helper.assert_python_failure("-c", code) - self.assertIn(b'Fatal Python error: Cannot recover from ' - b'MemoryErrors while normalizing exceptions.', err) + self.assertIn(b'Fatal Python error: _PyErr_NormalizeException: ' + b'Cannot recover from MemoryErrors while ' + b'normalizing exceptions.', err) @cpython_only def test_MemoryError(self): @@ -1298,6 +1312,22 @@ class ExceptionTests(unittest.TestCase): next(i) next(i) + @unittest.skipUnless(__debug__, "Won't work if __debug__ is False") + def test_assert_shadowing(self): + # Shadowing AssertionError would cause the assert statement to + # misbehave. + global AssertionError + AssertionError = TypeError + try: + assert False, 'hello' + except BaseException as e: + del AssertionError + self.assertIsInstance(e, AssertionError) + self.assertEqual(str(e), 'hello') + else: + del AssertionError + self.fail('Expected exception') + def test_memory_error_subclasses(self): # bpo-41654: MemoryError instances use a freelist of objects that are # linked using the 'dict' attribute when they are inactive/dead. @@ -1328,6 +1358,7 @@ class ExceptionTests(unittest.TestCase): gc_collect() + class ImportErrorTests(unittest.TestCase): def test_attributes(self): diff --git a/Lib/test/test_extcall.py b/Lib/test/test_extcall.py index 3cac3bda..4205ca82 100644 --- a/Lib/test/test_extcall.py +++ b/Lib/test/test_extcall.py @@ -52,15 +52,15 @@ Here we add keyword arguments >>> f(1, 2, **{'a': -1, 'b': 5}, **{'a': 4, 'c': 6}) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'a' + TypeError: test.test_extcall.f() got multiple values for keyword argument 'a' >>> f(1, 2, **{'a': -1, 'b': 5}, a=4, c=6) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'a' + TypeError: test.test_extcall.f() got multiple values for keyword argument 'a' >>> f(1, 2, a=3, **{'a': 4}, **{'a': 5}) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'a' + TypeError: test.test_extcall.f() got multiple values for keyword argument 'a' >>> f(1, 2, 3, *[4, 5], **{'a':6, 'b':7}) (1, 2, 3, 4, 5) {'a': 6, 'b': 7} >>> f(1, 2, 3, x=4, y=5, *(6, 7), **{'a':8, 'b': 9}) @@ -79,6 +79,24 @@ Here we add keyword arguments >>> f(1, 2, 3, *(4, 5), x=6, y=7, **UserDict(a=8, b=9)) (1, 2, 3, 4, 5) {'a': 8, 'b': 9, 'x': 6, 'y': 7} +Mix keyword arguments and dict unpacking + + >>> d1 = {'a':1} + + >>> d2 = {'c':3} + + >>> f(b=2, **d1, **d2) + () {'a': 1, 'b': 2, 'c': 3} + + >>> f(**d1, b=2, **d2) + () {'a': 1, 'b': 2, 'c': 3} + + >>> f(**d1, **d2, b=2) + () {'a': 1, 'b': 2, 'c': 3} + + >>> f(**d1, b=2, **d2, d=4) + () {'a': 1, 'b': 2, 'c': 3, 'd': 4} + Examples with invalid arguments (TypeErrors). We're also testing the function names in the exception messages. @@ -118,7 +136,7 @@ Verify clearing of SF bug #733667 >>> g(*Nothing()) Traceback (most recent call last): ... - TypeError: g() argument after * must be an iterable, not Nothing + TypeError: test.test_extcall.g() argument after * must be an iterable, not Nothing >>> class Nothing: ... def __len__(self): return 5 @@ -127,7 +145,7 @@ Verify clearing of SF bug #733667 >>> g(*Nothing()) Traceback (most recent call last): ... - TypeError: g() argument after * must be an iterable, not Nothing + TypeError: test.test_extcall.g() argument after * must be an iterable, not Nothing >>> class Nothing(): ... def __len__(self): return 5 @@ -237,7 +255,7 @@ What about willful misconduct? >>> f(**{1:2}) Traceback (most recent call last): ... - TypeError: f() keywords must be strings + TypeError: keywords must be strings >>> h(**{'e': 2}) Traceback (most recent call last): @@ -247,17 +265,17 @@ What about willful misconduct? >>> h(*h) Traceback (most recent call last): ... - TypeError: h() argument after * must be an iterable, not function + TypeError: test.test_extcall.h() argument after * must be an iterable, not function >>> h(1, *h) Traceback (most recent call last): ... - TypeError: h() argument after * must be an iterable, not function + TypeError: Value after * must be an iterable, not function >>> h(*[1], *h) Traceback (most recent call last): ... - TypeError: h() argument after * must be an iterable, not function + TypeError: Value after * must be an iterable, not function >>> dir(*h) Traceback (most recent call last): @@ -268,38 +286,38 @@ What about willful misconduct? >>> nothing(*h) Traceback (most recent call last): ... - TypeError: NoneType object argument after * must be an iterable, \ + TypeError: None argument after * must be an iterable, \ not function >>> h(**h) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not function + TypeError: test.test_extcall.h() argument after ** must be a mapping, not function >>> h(**[]) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not list + TypeError: test.test_extcall.h() argument after ** must be a mapping, not list >>> h(a=1, **h) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not function + TypeError: test.test_extcall.h() argument after ** must be a mapping, not function >>> h(a=1, **[]) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not list + TypeError: test.test_extcall.h() argument after ** must be a mapping, not list >>> h(**{'a': 1}, **h) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not function + TypeError: test.test_extcall.h() argument after ** must be a mapping, not function >>> h(**{'a': 1}, **[]) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not list + TypeError: test.test_extcall.h() argument after ** must be a mapping, not list >>> dir(**h) Traceback (most recent call last): @@ -309,7 +327,7 @@ not function >>> nothing(**h) Traceback (most recent call last): ... - TypeError: NoneType object argument after ** must be a mapping, \ + TypeError: None argument after ** must be a mapping, \ not function >>> dir(b=1, **{'b': 1}) @@ -351,17 +369,17 @@ Test a kwargs mapping with duplicated keys. >>> g(**MultiDict([('x', 1), ('x', 2)])) Traceback (most recent call last): ... - TypeError: g() got multiple values for keyword argument 'x' + TypeError: test.test_extcall.g() got multiple values for keyword argument 'x' >>> g(a=3, **MultiDict([('x', 1), ('x', 2)])) Traceback (most recent call last): ... - TypeError: g() got multiple values for keyword argument 'x' + TypeError: test.test_extcall.g() got multiple values for keyword argument 'x' >>> g(**MultiDict([('a', 3)]), **MultiDict([('x', 1), ('x', 2)])) Traceback (most recent call last): ... - TypeError: g() got multiple values for keyword argument 'x' + TypeError: test.test_extcall.g() got multiple values for keyword argument 'x' Another helper function diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index d8751039..c64afe88 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -71,9 +71,8 @@ class FaultHandlerTests(unittest.TestCase): with support.SuppressCrashReport(): process = script_helper.spawn_python('-c', code, pass_fds=pass_fds) with process: - stdout, stderr = process.communicate() + output, stderr = process.communicate() exitcode = process.wait() - output = support.strip_python_stderr(stdout) output = output.decode('ascii', 'backslashreplace') if filename: self.assertEqual(output, '') @@ -124,7 +123,9 @@ class FaultHandlerTests(unittest.TestCase): self.assertRegex(output, regex) self.assertNotEqual(exitcode, 0) - def check_fatal_error(self, code, line_number, name_regex, **kw): + def check_fatal_error(self, code, line_number, name_regex, func=None, **kw): + if func: + name_regex = '%s: %s' % (func, name_regex) fatal_error = 'Fatal Python error: %s' % name_regex self.check_error(code, line_number, fatal_error, **kw) @@ -174,6 +175,7 @@ class FaultHandlerTests(unittest.TestCase): 3, 'in new thread', know_current_thread=False, + func='faulthandler_fatal_error_thread', py_fatal_error=True) def test_sigabrt(self): @@ -231,6 +233,7 @@ class FaultHandlerTests(unittest.TestCase): """, 2, 'xyz', + func='faulthandler_fatal_error_py', py_fatal_error=True) def test_fatal_error_without_gil(self): @@ -240,6 +243,7 @@ class FaultHandlerTests(unittest.TestCase): """, 2, 'xyz', + func='faulthandler_fatal_error_py', py_fatal_error=True) @unittest.skipIf(sys.platform.startswith('openbsd'), @@ -535,8 +539,6 @@ class FaultHandlerTests(unittest.TestCase): with temporary_filename() as filename: self.check_dump_traceback_threads(filename) - @unittest.skipIf(not hasattr(faulthandler, 'dump_traceback_later'), - 'need faulthandler.dump_traceback_later()') def check_dump_traceback_later(self, repeat=False, cancel=False, loops=1, *, filename=None, fd=None): """ @@ -744,9 +746,8 @@ class FaultHandlerTests(unittest.TestCase): faulthandler.enable() with self.check_stderr_none(): faulthandler.dump_traceback() - if hasattr(faulthandler, 'dump_traceback_later'): - with self.check_stderr_none(): - faulthandler.dump_traceback_later(1e-3) + with self.check_stderr_none(): + faulthandler.dump_traceback_later(1e-3) if hasattr(faulthandler, "register"): with self.check_stderr_none(): faulthandler.register(signal.SIGUSR1) @@ -823,6 +824,17 @@ class FaultHandlerTests(unittest.TestCase): self.assertEqual(output, []) self.assertEqual(exitcode, 0xC0000005) + def test_cancel_later_without_dump_traceback_later(self): + # bpo-37933: Calling cancel_dump_traceback_later() + # without dump_traceback_later() must not segfault. + code = dedent(""" + import faulthandler + faulthandler.cancel_dump_traceback_later() + """) + output, exitcode = self.get_output(code) + self.assertEqual(output, []) + self.assertEqual(exitcode, 0) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py index c394f694..9ab68c67 100644 --- a/Lib/test/test_fcntl.py +++ b/Lib/test/test_fcntl.py @@ -181,6 +181,12 @@ class TestFcntl(unittest.TestCase): self.assertRaises(OverflowError, fcntl.flock, _testcapi.INT_MAX+1, fcntl.LOCK_SH) + @unittest.skipIf(sys.platform != 'darwin', "F_GETPATH is only available on macos") + def test_fcntl_f_getpath(self): + self.f = open(TESTFN, 'wb') + expected = os.path.abspath(TESTFN).encode('utf-8') + res = fcntl.fcntl(self.f.fileno(), fcntl.F_GETPATH, bytes(len(expected))) + self.assertEqual(expected, res) def test_main(): run_unittest(TestFcntl) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index b6565825..9651281e 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -312,6 +312,34 @@ class GeneralFloatCases(unittest.TestCase): # distinguishes -0.0 and 0.0. self.assertEqual((a, copysign(1.0, a)), (b, copysign(1.0, b))) + def test_float_floor(self): + self.assertIsInstance(float(0.5).__floor__(), int) + self.assertEqual(float(0.5).__floor__(), 0) + self.assertEqual(float(1.0).__floor__(), 1) + self.assertEqual(float(1.5).__floor__(), 1) + self.assertEqual(float(-0.5).__floor__(), -1) + self.assertEqual(float(-1.0).__floor__(), -1) + self.assertEqual(float(-1.5).__floor__(), -2) + self.assertEqual(float(1.23e167).__floor__(), 1.23e167) + self.assertEqual(float(-1.23e167).__floor__(), -1.23e167) + self.assertRaises(ValueError, float("nan").__floor__) + self.assertRaises(OverflowError, float("inf").__floor__) + self.assertRaises(OverflowError, float("-inf").__floor__) + + def test_float_ceil(self): + self.assertIsInstance(float(0.5).__ceil__(), int) + self.assertEqual(float(0.5).__ceil__(), 1) + self.assertEqual(float(1.0).__ceil__(), 1) + self.assertEqual(float(1.5).__ceil__(), 2) + self.assertEqual(float(-0.5).__ceil__(), 0) + self.assertEqual(float(-1.0).__ceil__(), -1) + self.assertEqual(float(-1.5).__ceil__(), -1) + self.assertEqual(float(1.23e167).__ceil__(), 1.23e167) + self.assertEqual(float(-1.23e167).__ceil__(), -1.23e167) + self.assertRaises(ValueError, float("nan").__ceil__) + self.assertRaises(OverflowError, float("inf").__ceil__) + self.assertRaises(OverflowError, float("-inf").__ceil__) + @support.requires_IEEE_754 def test_float_mod(self): # Check behaviour of % operator for IEEE 754 special cases. diff --git a/Lib/test/test_flufl.py b/Lib/test/test_flufl.py index 33e52e60..22285859 100644 --- a/Lib/test/test_flufl.py +++ b/Lib/test/test_flufl.py @@ -1,5 +1,7 @@ import __future__ import unittest +from test import support + class FLUFLTests(unittest.TestCase): @@ -12,10 +14,13 @@ class FLUFLTests(unittest.TestCase): __future__.CO_FUTURE_BARRY_AS_BDFL) self.assertRegex(str(cm.exception), "with Barry as BDFL, use '<>' instead of '!='") - self.assertEqual(cm.exception.text, '2 != 3\n') + self.assertIn('2 != 3', cm.exception.text) self.assertEqual(cm.exception.filename, '') - self.assertEqual(cm.exception.lineno, 2) - self.assertEqual(cm.exception.offset, 4) + + self.assertTrue(cm.exception.lineno, 2) + # The old parser reports the end of the token and the new + # parser reports the start of the token + self.assertEqual(cm.exception.offset, 4 if support.use_old_parser() else 3) def test_guido_as_bdfl(self): code = '2 {0} 3' @@ -23,10 +28,12 @@ class FLUFLTests(unittest.TestCase): with self.assertRaises(SyntaxError) as cm: compile(code.format('<>'), '', 'exec') self.assertRegex(str(cm.exception), "invalid syntax") - self.assertEqual(cm.exception.text, '2 <> 3\n') + self.assertIn('2 <> 3', cm.exception.text) self.assertEqual(cm.exception.filename, '') self.assertEqual(cm.exception.lineno, 1) - self.assertEqual(cm.exception.offset, 4) + # The old parser reports the end of the token and the new + # parser reports the start of the token + self.assertEqual(cm.exception.offset, 4 if support.use_old_parser() else 3) if __name__ == '__main__': diff --git a/Lib/test/test_fnmatch.py b/Lib/test/test_fnmatch.py index 55f9f0d3..10668e4f 100644 --- a/Lib/test/test_fnmatch.py +++ b/Lib/test/test_fnmatch.py @@ -45,6 +45,13 @@ class FnmatchTestCase(unittest.TestCase): check('\nfoo', 'foo*', False) check('\n', '*') + def test_slow_fnmatch(self): + check = self.check_match + check('a' * 50, '*a*a*a*a*a*a*a*a*a*a') + # The next "takes forever" if the regexp translation is + # straightforward. See bpo-40480. + check('a' * 50 + 'b', '*a*a*a*a*a*a*a*a*a*a', False) + def test_mix_bytes_str(self): self.assertRaises(TypeError, fnmatch, 'test', b'*') self.assertRaises(TypeError, fnmatch, b'test', '*') @@ -99,6 +106,7 @@ class FnmatchTestCase(unittest.TestCase): class TranslateTestCase(unittest.TestCase): def test_translate(self): + import re self.assertEqual(translate('*'), r'(?s:.*)\Z') self.assertEqual(translate('?'), r'(?s:.)\Z') self.assertEqual(translate('a?b*'), r'(?s:a.b.*)\Z') @@ -107,7 +115,34 @@ class TranslateTestCase(unittest.TestCase): self.assertEqual(translate('[!x]'), r'(?s:[^x])\Z') self.assertEqual(translate('[^x]'), r'(?s:[\^x])\Z') self.assertEqual(translate('[x'), r'(?s:\[x)\Z') - + # from the docs + self.assertEqual(translate('*.txt'), r'(?s:.*\.txt)\Z') + # squash consecutive stars + self.assertEqual(translate('*********'), r'(?s:.*)\Z') + self.assertEqual(translate('A*********'), r'(?s:A.*)\Z') + self.assertEqual(translate('*********A'), r'(?s:.*A)\Z') + self.assertEqual(translate('A*********?[?]?'), r'(?s:A.*.[?].)\Z') + # fancy translation to prevent exponential-time match failure + t = translate('**a*a****a') + digits = re.findall(r'\d+', t) + self.assertEqual(len(digits), 4) + self.assertEqual(digits[0], digits[1]) + self.assertEqual(digits[2], digits[3]) + g1 = f"g{digits[0]}" # e.g., group name "g4" + g2 = f"g{digits[2]}" # e.g., group name "g5" + self.assertEqual(t, + fr'(?s:(?=(?P<{g1}>.*?a))(?P={g1})(?=(?P<{g2}>.*?a))(?P={g2}).*a)\Z') + # and try pasting multiple translate results - it's an undocumented + # feature that this works; all the pain of generating unique group + # names across calls exists to support this + r1 = translate('**a**a**a*') + r2 = translate('**b**b**b*') + r3 = translate('*c*c*c*') + fatre = "|".join([r1, r2, r3]) + self.assertTrue(re.match(fatre, 'abaccad')) + self.assertTrue(re.match(fatre, 'abxbcab')) + self.assertTrue(re.match(fatre, 'cbabcaxc')) + self.assertFalse(re.match(fatre, 'dabccbad')) class FilterTestCase(unittest.TestCase): diff --git a/Lib/test/test_fork1.py b/Lib/test/test_fork1.py index 2ab856ff..a2f7cfee 100644 --- a/Lib/test/test_fork1.py +++ b/Lib/test/test_fork1.py @@ -10,26 +10,13 @@ import time import unittest from test.fork_wait import ForkWait -from test.support import reap_children, get_attribute, verbose +from test import support # Skip test if fork does not exist. -get_attribute(os, 'fork') +support.get_attribute(os, 'fork') class ForkTest(ForkWait): - def wait_impl(self, cpid): - deadline = time.monotonic() + 10.0 - while time.monotonic() <= deadline: - # waitpid() shouldn't hang, but some of the buildbots seem to hang - # in the forking tests. This is an attempt to fix the problem. - spid, status = os.waitpid(cpid, os.WNOHANG) - if spid == cpid: - break - time.sleep(0.1) - - self.assertEqual(spid, cpid) - self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) - def test_threaded_import_lock_fork(self): """Check fork() in main thread works while a subthread is doing an import""" import_started = threading.Event() @@ -46,6 +33,7 @@ class ForkTest(ForkWait): t = threading.Thread(target=importer) t.start() import_started.wait() + exitcode = 42 pid = os.fork() try: # PyOS_BeforeFork should have waited for the import to complete @@ -54,9 +42,9 @@ class ForkTest(ForkWait): if not pid: m = __import__(fake_module_name) if m == complete_module: - os._exit(0) + os._exit(exitcode) else: - if verbose > 1: + if support.verbose > 1: print("Child encountered partial module") os._exit(1) else: @@ -64,7 +52,7 @@ class ForkTest(ForkWait): # Exitcode 1 means the child got a partial module (bad.) No # exitcode (but a hang, which manifests as 'got pid 0') # means the child deadlocked (also bad.) - self.wait_impl(pid) + self.wait_impl(pid, exitcode=exitcode) finally: try: os.kill(pid, signal.SIGKILL) @@ -74,6 +62,7 @@ class ForkTest(ForkWait): def test_nested_import_lock_fork(self): """Check fork() in main thread works while the main thread is doing an import""" + exitcode = 42 # Issue 9573: this used to trigger RuntimeError in the child process def fork_with_import_lock(level): release = 0 @@ -90,13 +79,13 @@ class ForkTest(ForkWait): imp.release_lock() except RuntimeError: if in_child: - if verbose > 1: + if support.verbose > 1: print("RuntimeError in child") os._exit(1) raise if in_child: - os._exit(0) - self.wait_impl(pid) + os._exit(exitcode) + self.wait_impl(pid, exitcode=exitcode) # Check this works with various levels of nested # import in the main thread @@ -105,7 +94,7 @@ class ForkTest(ForkWait): def tearDownModule(): - reap_children() + support.reap_children() if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py index 4559cd56..d2744cdf 100644 --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -1,6 +1,7 @@ from test.support import verbose, TestFailed import locale import sys +import re import test.support as support import unittest @@ -484,6 +485,36 @@ class FormatTest(unittest.TestCase): with self.assertRaises(ValueError) as cm: format(c, ".%sf" % (INT_MAX + 1)) + def test_g_format_has_no_trailing_zeros(self): + # regression test for bugs.python.org/issue40780 + self.assertEqual("%.3g" % 1505.0, "1.5e+03") + self.assertEqual("%#.3g" % 1505.0, "1.50e+03") + + self.assertEqual(format(1505.0, ".3g"), "1.5e+03") + self.assertEqual(format(1505.0, "#.3g"), "1.50e+03") + + self.assertEqual(format(12300050.0, ".6g"), "1.23e+07") + self.assertEqual(format(12300050.0, "#.6g"), "1.23000e+07") + + def test_with_two_commas_in_format_specifier(self): + error_msg = re.escape("Cannot specify ',' with ','.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:,,}'.format(1) + + def test_with_two_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify '_' with '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:__}'.format(1) + + def test_with_a_commas_and_an_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:,_}'.format(1) + + def test_with_an_underscore_and_a_comma_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:_,}'.format(1) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 86b49f30..0845f792 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -9,11 +9,10 @@ import fractions import functools import sys import unittest -import warnings from copy import copy, deepcopy from pickle import dumps, loads F = fractions.Fraction -gcd = fractions.gcd + class DummyFloat(object): """Dummy float class for testing comparisons with Fractions""" @@ -82,30 +81,6 @@ class DummyRational(object): class DummyFraction(fractions.Fraction): """Dummy Fraction subclass for copy and deepcopy testing.""" -class GcdTest(unittest.TestCase): - - def testMisc(self): - # fractions.gcd() is deprecated - with self.assertWarnsRegex(DeprecationWarning, r'fractions\.gcd'): - gcd(1, 1) - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', r'fractions\.gcd', - DeprecationWarning) - self.assertEqual(0, gcd(0, 0)) - self.assertEqual(1, gcd(1, 0)) - self.assertEqual(-1, gcd(-1, 0)) - self.assertEqual(1, gcd(0, 1)) - self.assertEqual(-1, gcd(0, -1)) - self.assertEqual(1, gcd(7, 1)) - self.assertEqual(-1, gcd(7, -1)) - self.assertEqual(1, gcd(-23, 15)) - self.assertEqual(12, gcd(120, 84)) - self.assertEqual(-12, gcd(84, -120)) - self.assertEqual(gcd(120.0, 84), 12.0) - self.assertEqual(gcd(120, 84.0), 12.0) - self.assertEqual(gcd(F(120), F(84)), F(12)) - self.assertEqual(gcd(F(120, 77), F(84, 55)), F(12, 385)) - def _components(r): return (r.numerator, r.denominator) @@ -727,5 +702,28 @@ class FractionTest(unittest.TestCase): r = F(13, 7) self.assertRaises(AttributeError, setattr, r, 'a', 10) + def test_int_subclass(self): + class myint(int): + def __mul__(self, other): + return type(self)(int(self) * int(other)) + def __floordiv__(self, other): + return type(self)(int(self) // int(other)) + def __mod__(self, other): + x = type(self)(int(self) % int(other)) + return x + @property + def numerator(self): + return type(self)(int(self)) + @property + def denominator(self): + return type(self)(1) + + f = fractions.Fraction(myint(1 * 3), myint(2 * 3)) + self.assertEqual(f.numerator, 1) + self.assertEqual(f.denominator, 2) + self.assertEqual(type(f.numerator), myint) + self.assertEqual(type(f.denominator), myint) + + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_frame.py b/Lib/test/test_frame.py index d6aa2834..a8696f01 100644 --- a/Lib/test/test_frame.py +++ b/Lib/test/test_frame.py @@ -50,7 +50,7 @@ class ClearTest(unittest.TestCase): nonlocal endly try: yield - inner() + self.inner() finally: endly = True gen = g() diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 49663923..2ae815aa 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -8,9 +8,13 @@ # Unicode identifiers in tests is allowed by PEP 3131. import ast +import os +import re import types import decimal import unittest +from test.support import temp_cwd, use_old_parser +from test.support.script_helper import assert_python_failure a_global = 'global variable' @@ -521,7 +525,8 @@ non-important content # This looks like a nested format spec. ]) - self.assertAllRaise(SyntaxError, "invalid syntax", + err_msg = "invalid syntax" if use_old_parser() else "f-string: invalid syntax" + self.assertAllRaise(SyntaxError, err_msg, [# Invalid syntax inside a nested spec. "f'{4:{/5}}'", ]) @@ -583,7 +588,7 @@ non-important content ]) # Different error message is raised for other whitespace characters. - self.assertAllRaise(SyntaxError, 'invalid character in identifier', + self.assertAllRaise(SyntaxError, r"invalid non-printable character U\+00A0", ["f'''{\xa0}'''", "\xa0", ]) @@ -595,7 +600,8 @@ non-important content # are added around it. But we shouldn't go from an invalid # expression to a valid one. The added parens are just # supposed to allow whitespace (including newlines). - self.assertAllRaise(SyntaxError, 'invalid syntax', + err_msg = "invalid syntax" if use_old_parser() else "f-string: invalid syntax" + self.assertAllRaise(SyntaxError, err_msg, ["f'{,}'", "f'{,}'", # this is (,), which is an error ]) @@ -713,7 +719,8 @@ non-important content # lambda doesn't work without parens, because the colon # makes the parser think it's a format_spec - self.assertAllRaise(SyntaxError, 'unexpected EOF while parsing', + err_msg = "invalid syntax" if use_old_parser() else "f-string: invalid syntax" + self.assertAllRaise(SyntaxError, err_msg, ["f'{lambda x:x}'", ]) @@ -722,9 +729,11 @@ non-important content # a function into a generator def fn(y): f'y:{yield y*2}' + f'{yield}' g = fn(4) self.assertEqual(next(g), 8) + self.assertEqual(next(g), None) def test_yield_send(self): def fn(x): @@ -841,8 +850,7 @@ non-important content self.assertEqual(f'{f"{y}"*3}', '555') def test_invalid_string_prefixes(self): - self.assertAllRaise(SyntaxError, 'unexpected EOF while parsing', - ["fu''", + single_quote_cases = ["fu''", "uf''", "Fu''", "fU''", @@ -863,8 +871,15 @@ non-important content "bf''", "bF''", "Bf''", - "BF''", - ]) + "BF''",] + double_quote_cases = [case.replace("'", '"') for case in single_quote_cases] + error_msg = ( + 'invalid syntax' + if use_old_parser() + else 'unexpected EOF while parsing' + ) + self.assertAllRaise(SyntaxError, error_msg, + single_quote_cases + double_quote_cases) def test_leading_trailing_spaces(self): self.assertEqual(f'{ 3}', '3') @@ -1043,6 +1058,17 @@ non-important content r"f'{1000:j}'", ]) + @unittest.skipIf(use_old_parser(), "The old parser only supports as the filename") + def test_filename_in_syntaxerror(self): + # see issue 38964 + with temp_cwd() as cwd: + file_path = os.path.join(cwd, 't.py') + with open(file_path, 'w') as f: + f.write('f"{a b}"') # This generates a SyntaxError + _, _, stderr = assert_python_failure(file_path, + PYTHONIOENCODING='ascii') + self.assertIn(file_path.encode('ascii', 'backslashreplace'), stderr) + def test_loop(self): for i in range(1000): self.assertEqual(f'i:{i}', 'i:' + str(i)) @@ -1178,6 +1204,30 @@ non-important content self.assertEqual(f'{(x:=10)}', '10') self.assertEqual(x, 10) + def test_invalid_syntax_error_message(self): + err_msg = "invalid syntax" if use_old_parser() else "f-string: invalid syntax" + with self.assertRaisesRegex(SyntaxError, err_msg): + compile("f'{a $ b}'", "?", "exec") + + def test_with_two_commas_in_format_specifier(self): + error_msg = re.escape("Cannot specify ',' with ','.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:,,}' + + def test_with_two_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify '_' with '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:__}' + + def test_with_a_commas_and_an_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:,_}' + + def test_with_an_underscore_and_a_comma_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:_,}' if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index b0e46411..e424076d 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -19,14 +19,16 @@ except ImportError: from unittest import TestCase, skipUnless from test import support -from test.support import HOST, HOSTv6 +from test.support import socket_helper +from test.support.socket_helper import HOST, HOSTv6 -TIMEOUT = 3 +TIMEOUT = support.LOOPBACK_TIMEOUT +DEFAULT_ENCODING = 'utf-8' # the dummy data returned by server over the data channel when # RETR, LIST, NLST, MLSD commands are issued -RETR_DATA = 'abcde12345\r\n' * 1000 -LIST_DATA = 'foo\r\nbar\r\n' -NLST_DATA = 'foo\r\nbar\r\n' +RETR_DATA = 'abcde12345\r\n' * 1000 + 'non-ascii char \xAE\r\n' +LIST_DATA = 'foo\r\nbar\r\n non-ascii char \xAE\r\n' +NLST_DATA = 'foo\r\nbar\r\n non-ascii char \xAE\r\n' MLSD_DATA = ("type=cdir;perm=el;unique==keVO1+ZF4; test\r\n" "type=pdir;perm=e;unique==keVO1+d?3; ..\r\n" "type=OS.unix=slink:/foobar;perm=;unique==keVO1+4G4; foobar\r\n" @@ -41,7 +43,9 @@ MLSD_DATA = ("type=cdir;perm=el;unique==keVO1+ZF4; test\r\n" "type=dir;perm=cpmel;unique==keVO1+7G4; incoming\r\n" "type=file;perm=r;unique==keVO1+1G4; file2\r\n" "type=file;perm=r;unique==keVO1+1G4; file3\r\n" - "type=file;perm=r;unique==keVO1+1G4; file4\r\n") + "type=file;perm=r;unique==keVO1+1G4; file4\r\n" + "type=dir;perm=cpmel;unique==SGP1; dir \xAE non-ascii char\r\n" + "type=file;perm=r;unique==SGP2; file \xAE non-ascii char\r\n") class DummyDTPHandler(asynchat.async_chat): @@ -51,9 +55,11 @@ class DummyDTPHandler(asynchat.async_chat): asynchat.async_chat.__init__(self, conn) self.baseclass = baseclass self.baseclass.last_received_data = '' + self.encoding = baseclass.encoding def handle_read(self): - self.baseclass.last_received_data += self.recv(1024).decode('ascii') + new_data = self.recv(1024).decode(self.encoding, 'replace') + self.baseclass.last_received_data += new_data def handle_close(self): # XXX: this method can be called many times in a row for a single @@ -70,7 +76,7 @@ class DummyDTPHandler(asynchat.async_chat): self.baseclass.next_data = None if not what: return self.close_when_done() - super(DummyDTPHandler, self).push(what.encode('ascii')) + super(DummyDTPHandler, self).push(what.encode(self.encoding)) def handle_error(self): raise Exception @@ -80,7 +86,7 @@ class DummyFTPHandler(asynchat.async_chat): dtp_handler = DummyDTPHandler - def __init__(self, conn): + def __init__(self, conn, encoding=DEFAULT_ENCODING): asynchat.async_chat.__init__(self, conn) # tells the socket to handle urgent data inline (ABOR command) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_OOBINLINE, 1) @@ -94,12 +100,13 @@ class DummyFTPHandler(asynchat.async_chat): self.rest = None self.next_retr_data = RETR_DATA self.push('220 welcome') + self.encoding = encoding def collect_incoming_data(self, data): self.in_buffer.append(data) def found_terminator(self): - line = b''.join(self.in_buffer).decode('ascii') + line = b''.join(self.in_buffer).decode(self.encoding) self.in_buffer = [] if self.next_response: self.push(self.next_response) @@ -121,7 +128,7 @@ class DummyFTPHandler(asynchat.async_chat): raise Exception def push(self, data): - asynchat.async_chat.push(self, data.encode('ascii') + b'\r\n') + asynchat.async_chat.push(self, data.encode(self.encoding) + b'\r\n') def cmd_port(self, arg): addr = list(map(int, arg.split(','))) @@ -251,7 +258,7 @@ class DummyFTPServer(asyncore.dispatcher, threading.Thread): handler = DummyFTPHandler - def __init__(self, address, af=socket.AF_INET): + def __init__(self, address, af=socket.AF_INET, encoding=DEFAULT_ENCODING): threading.Thread.__init__(self) asyncore.dispatcher.__init__(self) self.daemon = True @@ -262,6 +269,7 @@ class DummyFTPServer(asyncore.dispatcher, threading.Thread): self.active_lock = threading.Lock() self.host, self.port = self.socket.getsockname()[:2] self.handler_instance = None + self.encoding = encoding def start(self): assert not self.active @@ -284,7 +292,7 @@ class DummyFTPServer(asyncore.dispatcher, threading.Thread): self.join() def handle_accepted(self, conn, addr): - self.handler_instance = self.handler(conn) + self.handler_instance = self.handler(conn, encoding=self.encoding) def handle_connect(self): self.close() @@ -346,7 +354,7 @@ if ssl is not None: if err.args[0] in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): return - except OSError as err: + except OSError: # Any "socket error" corresponds to a SSL_ERROR_SYSCALL return # from OpenSSL's SSL_shutdown(), corresponding to a # closed socket condition. See also: @@ -421,8 +429,8 @@ if ssl is not None: dtp_handler = DummyTLS_DTPHandler - def __init__(self, conn): - DummyFTPHandler.__init__(self, conn) + def __init__(self, conn, encoding=DEFAULT_ENCODING): + DummyFTPHandler.__init__(self, conn, encoding=encoding) self.secure_data_channel = False self._ccc = False @@ -462,10 +470,10 @@ if ssl is not None: class TestFTPClass(TestCase): - def setUp(self): - self.server = DummyFTPServer((HOST, 0)) + def setUp(self, encoding=DEFAULT_ENCODING): + self.server = DummyFTPServer((HOST, 0), encoding=encoding) self.server.start() - self.client = ftplib.FTP(timeout=TIMEOUT) + self.client = ftplib.FTP(timeout=TIMEOUT, encoding=encoding) self.client.connect(self.server.host, self.server.port) def tearDown(self): @@ -565,14 +573,14 @@ class TestFTPClass(TestCase): def test_retrbinary(self): def callback(data): - received.append(data.decode('ascii')) + received.append(data.decode(self.client.encoding)) received = [] self.client.retrbinary('retr', callback) self.check_data(''.join(received), RETR_DATA) def test_retrbinary_rest(self): def callback(data): - received.append(data.decode('ascii')) + received.append(data.decode(self.client.encoding)) for rest in (0, 10, 20): received = [] self.client.retrbinary('retr', callback, rest=rest) @@ -584,7 +592,7 @@ class TestFTPClass(TestCase): self.check_data(''.join(received), RETR_DATA.replace('\r\n', '')) def test_storbinary(self): - f = io.BytesIO(RETR_DATA.encode('ascii')) + f = io.BytesIO(RETR_DATA.encode(self.client.encoding)) self.client.storbinary('stor', f) self.check_data(self.server.handler_instance.last_received_data, RETR_DATA) # test new callback arg @@ -594,14 +602,16 @@ class TestFTPClass(TestCase): self.assertTrue(flag) def test_storbinary_rest(self): - f = io.BytesIO(RETR_DATA.replace('\r\n', '\n').encode('ascii')) + data = RETR_DATA.replace('\r\n', '\n').encode(self.client.encoding) + f = io.BytesIO(data) for r in (30, '30'): f.seek(0) self.client.storbinary('stor', f, rest=r) self.assertEqual(self.server.handler_instance.rest, str(r)) def test_storlines(self): - f = io.BytesIO(RETR_DATA.replace('\r\n', '\n').encode('ascii')) + data = RETR_DATA.replace('\r\n', '\n').encode(self.client.encoding) + f = io.BytesIO(data) self.client.storlines('stor', f) self.check_data(self.server.handler_instance.last_received_data, RETR_DATA) # test new callback arg @@ -742,7 +752,7 @@ class TestFTPClass(TestCase): def test_source_address(self): self.client.quit() - port = support.find_unused_port() + port = socket_helper.find_unused_port() try: self.client.connect(self.server.host, self.server.port, source_address=(HOST, port)) @@ -754,7 +764,7 @@ class TestFTPClass(TestCase): raise def test_source_address_passive_connection(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() self.client.source_address = (HOST, port) try: with self.client.transfercmd('list') as sock: @@ -790,14 +800,32 @@ class TestFTPClass(TestCase): f = io.BytesIO(b'x' * self.client.maxline * 2) self.assertRaises(ftplib.Error, self.client.storlines, 'stor', f) - -@skipUnless(support.IPV6_ENABLED, "IPv6 not enabled") + def test_encoding_param(self): + encodings = ['latin-1', 'utf-8'] + for encoding in encodings: + with self.subTest(encoding=encoding): + self.tearDown() + self.setUp(encoding=encoding) + self.assertEqual(encoding, self.client.encoding) + self.test_retrbinary() + self.test_storbinary() + self.test_retrlines() + new_dir = self.client.mkd('/non-ascii dir \xAE') + self.check_data(new_dir, '/non-ascii dir \xAE') + # Check default encoding + client = ftplib.FTP(timeout=TIMEOUT) + self.assertEqual(DEFAULT_ENCODING, client.encoding) + + +@skipUnless(socket_helper.IPV6_ENABLED, "IPv6 not enabled") class TestIPv6Environment(TestCase): def setUp(self): - self.server = DummyFTPServer((HOSTv6, 0), af=socket.AF_INET6) + self.server = DummyFTPServer((HOSTv6, 0), + af=socket.AF_INET6, + encoding=DEFAULT_ENCODING) self.server.start() - self.client = ftplib.FTP(timeout=TIMEOUT) + self.client = ftplib.FTP(timeout=TIMEOUT, encoding=DEFAULT_ENCODING) self.client.connect(self.server.host, self.server.port) def tearDown(self): @@ -824,7 +852,7 @@ class TestIPv6Environment(TestCase): def test_transfer(self): def retr(): def callback(data): - received.append(data.decode('ascii')) + received.append(data.decode(self.client.encoding)) received = [] self.client.retrbinary('retr', callback) self.assertEqual(len(''.join(received)), len(RETR_DATA)) @@ -841,10 +869,10 @@ class TestTLS_FTPClassMixin(TestFTPClass): and data connections first. """ - def setUp(self): - self.server = DummyTLS_FTPServer((HOST, 0)) + def setUp(self, encoding=DEFAULT_ENCODING): + self.server = DummyTLS_FTPServer((HOST, 0), encoding=encoding) self.server.start() - self.client = ftplib.FTP_TLS(timeout=TIMEOUT) + self.client = ftplib.FTP_TLS(timeout=TIMEOUT, encoding=encoding) self.client.connect(self.server.host, self.server.port) # enable TLS self.client.auth() @@ -855,8 +883,8 @@ class TestTLS_FTPClassMixin(TestFTPClass): class TestTLS_FTPClass(TestCase): """Specific TLS_FTP class tests.""" - def setUp(self): - self.server = DummyTLS_FTPServer((HOST, 0)) + def setUp(self, encoding=DEFAULT_ENCODING): + self.server = DummyTLS_FTPServer((HOST, 0), encoding=encoding) self.server.start() self.client = ftplib.FTP_TLS(timeout=TIMEOUT) self.client.connect(self.server.host, self.server.port) @@ -877,7 +905,8 @@ class TestTLS_FTPClass(TestCase): # clear text with self.client.transfercmd('list') as sock: self.assertNotIsInstance(sock, ssl.SSLSocket) - self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii')) + self.assertEqual(sock.recv(1024), + LIST_DATA.encode(self.client.encoding)) self.assertEqual(self.client.voidresp(), "226 transfer complete") # secured, after PROT P @@ -886,14 +915,16 @@ class TestTLS_FTPClass(TestCase): self.assertIsInstance(sock, ssl.SSLSocket) # consume from SSL socket to finalize handshake and avoid # "SSLError [SSL] shutdown while in init" - self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii')) + self.assertEqual(sock.recv(1024), + LIST_DATA.encode(self.client.encoding)) self.assertEqual(self.client.voidresp(), "226 transfer complete") # PROT C is issued, the connection must be in cleartext again self.client.prot_c() with self.client.transfercmd('list') as sock: self.assertNotIsInstance(sock, ssl.SSLSocket) - self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii')) + self.assertEqual(sock.recv(1024), + LIST_DATA.encode(self.client.encoding)) self.assertEqual(self.client.voidresp(), "226 transfer complete") def test_login(self): @@ -977,7 +1008,7 @@ class TestTimeouts(TestCase): self.evt = threading.Event() self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(20) - self.port = support.bind_port(self.sock) + self.port = socket_helper.bind_port(self.sock) self.server_thread = threading.Thread(target=self.server) self.server_thread.daemon = True self.server_thread.start() @@ -1045,6 +1076,10 @@ class TestTimeouts(TestCase): self.evt.wait() ftp.close() + # bpo-39259 + with self.assertRaises(ValueError): + ftplib.FTP(HOST, timeout=0) + def testTimeoutConnect(self): ftp = ftplib.FTP() ftp.connect(HOST, timeout=30) diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 8fee1c6a..11e8aa35 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -13,9 +13,14 @@ import time import typing import unittest import unittest.mock +import os +import weakref +import gc from weakref import proxy import contextlib +from test.support.script_helper import assert_python_ok + import functools py_functools = support.import_fresh_module('functools', blocked=['_functools']) @@ -556,11 +561,9 @@ class TestPartialMethod(unittest.TestCase): with self.assertRaises(TypeError): class B: method = functools.partialmethod() - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): class B: method = functools.partialmethod(func=capture, a=1) - b = B() - self.assertEqual(b.method(2, x=3), ((b, 2), {'a': 1, 'x': 3})) def test_repr(self): self.assertEqual(repr(vars(self.A)['both']), @@ -1160,6 +1163,25 @@ class Orderable_LT: return self.value == other.value +class TestCache: + # This tests that the pass-through is working as designed. + # The underlying functionality is tested in TestLRU. + + def test_cache(self): + @self.module.cache + def fib(n): + if n < 2: + return n + return fib(n-1) + fib(n-2) + self.assertEqual([fib(n) for n in range(16)], + [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]) + self.assertEqual(fib.cache_info(), + self.module._CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)) + fib.cache_clear() + self.assertEqual(fib.cache_info(), + self.module._CacheInfo(hits=0, misses=0, maxsize=None, currsize=0)) + + class TestLRU: def test_lru(self): @@ -1657,6 +1679,46 @@ class TestLRU: f_copy = copy.deepcopy(f) self.assertIs(f_copy, f) + def test_lru_cache_parameters(self): + @self.module.lru_cache(maxsize=2) + def f(): + return 1 + self.assertEqual(f.cache_parameters(), {'maxsize': 2, "typed": False}) + + @self.module.lru_cache(maxsize=1000, typed=True) + def f(): + return 1 + self.assertEqual(f.cache_parameters(), {'maxsize': 1000, "typed": True}) + + def test_lru_cache_weakrefable(self): + @self.module.lru_cache + def test_function(x): + return x + + class A: + @self.module.lru_cache + def test_method(self, x): + return (self, x) + + @staticmethod + @self.module.lru_cache + def test_staticmethod(x): + return (self, x) + + refs = [weakref.ref(test_function), + weakref.ref(A.test_method), + weakref.ref(A.test_staticmethod)] + + for ref in refs: + self.assertIsNotNone(ref()) + + del A + del test_function + gc.collect() + + for ref in refs: + self.assertIsNone(ref()) + @py_functools.lru_cache() def py_cached_func(x, y): diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py index 57946467..0f40357b 100644 --- a/Lib/test/test_future.py +++ b/Lib/test/test_future.py @@ -7,6 +7,7 @@ from test import support from textwrap import dedent import os import re +import sys rx = re.compile(r'\((\S+).py, line (\d+)') @@ -85,10 +86,10 @@ class FutureTest(unittest.TestCase): for future in __future__.all_feature_names } # obtain some of the exported compiler flags (PyCF_***) from the ast module - flags.update({ + flags |= { flag: getattr(ast, flag) for flag in dir(ast) if flag.startswith("PyCF_") - }) + } self.assertCountEqual(set(flags.values()), flags.values()) def test_parserhack(self): @@ -128,6 +129,10 @@ class AnnotationsFutureTestCase(unittest.TestCase): ... def g(arg: {ann}) -> None: ... + async def f2() -> {ann}: + ... + async def g2(arg: {ann}) -> None: + ... var: {ann} var2: {ann} = None """ @@ -138,9 +143,13 @@ class AnnotationsFutureTestCase(unittest.TestCase): exec(self.template.format(ann=annotation), {}, scope) func_ret_ann = scope['f'].__annotations__['return'] func_arg_ann = scope['g'].__annotations__['arg'] + async_func_ret_ann = scope['f2'].__annotations__['return'] + async_func_arg_ann = scope['g2'].__annotations__['arg'] var_ann1 = scope['__annotations__']['var'] var_ann2 = scope['__annotations__']['var2'] self.assertEqual(func_ret_ann, func_arg_ann) + self.assertEqual(func_ret_ann, async_func_ret_ann) + self.assertEqual(func_ret_ann, async_func_arg_ann) self.assertEqual(func_ret_ann, var_ann1) self.assertEqual(func_ret_ann, var_ann2) return func_ret_ann @@ -161,6 +170,7 @@ class AnnotationsFutureTestCase(unittest.TestCase): eq = self.assertAnnotationEqual eq('...') eq("'some_string'") + eq("u'some_string'") eq("b'\\xa3'") eq('Name') eq('None') @@ -266,7 +276,6 @@ class AnnotationsFutureTestCase(unittest.TestCase): eq("set[str,]") eq("tuple[str, ...]") eq("tuple[(str, *types)]") - eq("tuple[xx:yy, (*types,)]") eq("tuple[str, int, (str, int)]") eq("tuple[(*int, str, str, (str, int))]") eq("tuple[str, int, float, dict[str, int]]") @@ -307,8 +316,9 @@ class AnnotationsFutureTestCase(unittest.TestCase): eq('f((x for x in a), 2)') eq('(((a)))', 'a') eq('(((a, b)))', '(a, b)') - eq("(x:=10)") - eq("f'{(x:=10):=10}'") + eq("(x := 10)") + eq("f'{(x := 10):=10}'") + eq("1 + 2 + 3") def test_fstring_debug_annotations(self): # f-strings with '=' don't round trip very well, so set the expected @@ -320,6 +330,18 @@ class AnnotationsFutureTestCase(unittest.TestCase): self.assertAnnotationEqual("f'{x=!a}'", expected="f'x={x!a}'") self.assertAnnotationEqual("f'{x=!s:*^20}'", expected="f'x={x!s:*^20}'") + def test_infinity_numbers(self): + inf = "1e" + repr(sys.float_info.max_10_exp + 1) + infj = f"{inf}j" + self.assertAnnotationEqual("1e1000", expected=inf) + self.assertAnnotationEqual("1e1000j", expected=infj) + self.assertAnnotationEqual("-1e1000", expected=f"-{inf}") + self.assertAnnotationEqual("3+1e1000j", expected=f"3 + {infj}") + self.assertAnnotationEqual("(1e1000, 1e1000j)", expected=f"({inf}, {infj})") + self.assertAnnotationEqual("'inf'") + self.assertAnnotationEqual("('inf', 1e1000, 'infxxx', 1e1000j)", expected=f"('inf', {inf}, 'infxxx', {infj})") + self.assertAnnotationEqual("(1e1000, (1e1000j,))", expected=f"({inf}, ({infj},))") + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index f52db1ea..acb63919 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -1,7 +1,8 @@ import unittest +import unittest.mock from test.support import (verbose, refcount_test, run_unittest, - strip_python_stderr, cpython_only, start_threads, - temp_dir, requires_type_collecting, TESTFN, unlink, + cpython_only, start_threads, + temp_dir, TESTFN, unlink, import_module) from test.support.script_helper import assert_python_ok, make_script @@ -22,6 +23,11 @@ except ImportError: raise TypeError('requires _testcapi.with_tp_del') return C +try: + from _testcapi import ContainerNoGC +except ImportError: + ContainerNoGC = None + ### Support code ############################################################################### @@ -125,7 +131,6 @@ class GCTests(unittest.TestCase): del a self.assertNotEqual(gc.collect(), 0) - @requires_type_collecting def test_newinstance(self): class A(object): pass @@ -580,6 +585,24 @@ class GCTests(unittest.TestCase): self.assertFalse(gc.is_tracked(UserFloatSlots())) self.assertFalse(gc.is_tracked(UserIntSlots())) + def test_is_finalized(self): + # Objects not tracked by the always gc return false + self.assertFalse(gc.is_finalized(3)) + + storage = [] + class Lazarus: + def __del__(self): + storage.append(self) + + lazarus = Lazarus() + self.assertFalse(gc.is_finalized(lazarus)) + + del lazarus + gc.collect() + + lazarus = storage.pop() + self.assertTrue(gc.is_finalized(lazarus)) + def test_bug1055820b(self): # Corresponds to temp2b.py in the bug report. @@ -665,8 +688,8 @@ class GCTests(unittest.TestCase): p.stdout.close() p.stderr.close() self.assertEqual(p.returncode, 0) - self.assertEqual(stdout.strip(), b"") - return strip_python_stderr(stderr) + self.assertEqual(stdout, b"") + return stderr stderr = run_command(code % "0") self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at " @@ -685,7 +708,6 @@ class GCTests(unittest.TestCase): stderr = run_command(code % "gc.DEBUG_SAVEALL") self.assertNotIn(b"uncollectable objects at shutdown", stderr) - @requires_type_collecting def test_gc_main_module_at_shutdown(self): # Create a reference cycle through the __main__ module and check # it gets collected at interpreter shutdown. @@ -699,7 +721,6 @@ class GCTests(unittest.TestCase): rc, out, err = assert_python_ok('-c', code) self.assertEqual(out.strip(), b'__del__ called') - @requires_type_collecting def test_gc_ordinary_module_at_shutdown(self): # Same as above, but with a non-__main__ module. with temp_dir() as script_dir: @@ -719,7 +740,6 @@ class GCTests(unittest.TestCase): rc, out, err = assert_python_ok('-c', code) self.assertEqual(out.strip(), b'__del__ called') - @requires_type_collecting def test_global_del_SystemExit(self): code = """if 1: class ClassWithDel: @@ -822,7 +842,78 @@ class GCTests(unittest.TestCase): self.assertRaises(TypeError, gc.get_objects, "1") self.assertRaises(TypeError, gc.get_objects, 1.234) - def test_38379(self): + def test_resurrection_only_happens_once_per_object(self): + class A: # simple self-loop + def __init__(self): + self.me = self + + class Lazarus(A): + resurrected = 0 + resurrected_instances = [] + + def __del__(self): + Lazarus.resurrected += 1 + Lazarus.resurrected_instances.append(self) + + gc.collect() + gc.disable() + + # We start with 0 resurrections + laz = Lazarus() + self.assertEqual(Lazarus.resurrected, 0) + + # Deleting the instance and triggering a collection + # resurrects the object + del laz + gc.collect() + self.assertEqual(Lazarus.resurrected, 1) + self.assertEqual(len(Lazarus.resurrected_instances), 1) + + # Clearing the references and forcing a collection + # should not resurrect the object again. + Lazarus.resurrected_instances.clear() + self.assertEqual(Lazarus.resurrected, 1) + gc.collect() + self.assertEqual(Lazarus.resurrected, 1) + + gc.enable() + + def test_resurrection_is_transitive(self): + class Cargo: + def __init__(self): + self.me = self + + class Lazarus: + resurrected_instances = [] + + def __del__(self): + Lazarus.resurrected_instances.append(self) + + gc.collect() + gc.disable() + + laz = Lazarus() + cargo = Cargo() + cargo_id = id(cargo) + + # Create a cycle between cargo and laz + laz.cargo = cargo + cargo.laz = laz + + # Drop the references, force a collection and check that + # everything was resurrected. + del laz, cargo + gc.collect() + self.assertEqual(len(Lazarus.resurrected_instances), 1) + instance = Lazarus.resurrected_instances.pop() + self.assertTrue(hasattr(instance, "cargo")) + self.assertEqual(id(instance.cargo), cargo_id) + + gc.collect() + gc.enable() + + def test_resurrection_does_not_block_cleanup_of_other_objects(self): + # When a finalizer resurrects objects, stats were reporting them as # having been collected. This affected both collect()'s return # value and the dicts returned by get_stats(). @@ -861,38 +952,93 @@ class GCTests(unittest.TestCase): # Nothing is collected - Z() is merely resurrected. t = gc.collect() c, nc = getstats() - #self.assertEqual(t, 2) # before - self.assertEqual(t, 0) # after - #self.assertEqual(c - oldc, 2) # before - self.assertEqual(c - oldc, 0) # after + self.assertEqual(t, 0) + self.assertEqual(c - oldc, 0) self.assertEqual(nc - oldnc, 0) - # Unfortunately, a Z() prevents _anything_ from being collected. - # It should be possible to collect the A instances anyway, but - # that will require non-trivial code changes. + # Z() should not prevent anything else from being collected. oldc, oldnc = c, nc for i in range(N): A() Z() - # Z() prevents anything from being collected. t = gc.collect() c, nc = getstats() - #self.assertEqual(t, 2*N + 2) # before - self.assertEqual(t, 0) # after - #self.assertEqual(c - oldc, 2*N + 2) # before - self.assertEqual(c - oldc, 0) # after + self.assertEqual(t, 2*N) + self.assertEqual(c - oldc, 2*N) self.assertEqual(nc - oldnc, 0) - # But the A() trash is reclaimed on the next run. + # The A() trash should have been reclaimed already but the + # 2 copies of Z are still in zs (and the associated dicts). oldc, oldnc = c, nc + zs.clear() t = gc.collect() c, nc = getstats() - self.assertEqual(t, 2*N) - self.assertEqual(c - oldc, 2*N) + self.assertEqual(t, 4) + self.assertEqual(c - oldc, 4) self.assertEqual(nc - oldnc, 0) gc.enable() + @unittest.skipIf(ContainerNoGC is None, + 'requires ContainerNoGC extension type') + def test_trash_weakref_clear(self): + # Test that trash weakrefs are properly cleared (bpo-38006). + # + # Structure we are creating: + # + # Z <- Y <- A--+--> WZ -> C + # ^ | + # +--+ + # where: + # WZ is a weakref to Z with callback C + # Y doesn't implement tp_traverse + # A contains a reference to itself, Y and WZ + # + # A, Y, Z, WZ are all trash. The GC doesn't know that Z is trash + # because Y does not implement tp_traverse. To show the bug, WZ needs + # to live long enough so that Z is deallocated before it. Then, if + # gcmodule is buggy, when Z is being deallocated, C will run. + # + # To ensure WZ lives long enough, we put it in a second reference + # cycle. That trick only works due to the ordering of the GC prev/next + # linked lists. So, this test is a bit fragile. + # + # The bug reported in bpo-38006 is caused because the GC did not + # clear WZ before starting the process of calling tp_clear on the + # trash. Normally, handle_weakrefs() would find the weakref via Z and + # clear it. However, since the GC cannot find Z, WR is not cleared and + # it can execute during delete_garbage(). That can lead to disaster + # since the callback might tinker with objects that have already had + # tp_clear called on them (leaving them in possibly invalid states). + + callback = unittest.mock.Mock() + + class A: + __slots__ = ['a', 'y', 'wz'] + + class Z: + pass + + # setup required object graph, as described above + a = A() + a.a = a + a.y = ContainerNoGC(Z()) + a.wz = weakref.ref(a.y.value, callback) + # create second cycle to keep WZ alive longer + wr_cycle = [a.wz] + wr_cycle.append(wr_cycle) + # ensure trash unrelated to this test is gone + gc.collect() + gc.disable() + # release references and create trash + del a, wr_cycle + gc.collect() + # if called, it means there is a bug in the GC. The weakref should be + # cleared before Z dies. + callback.assert_not_called() + gc.enable() + + class GCCallbackTests(unittest.TestCase): def setUp(self): # Save gc state and disable it. diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index 01a48af2..44cb9a0f 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -13,7 +13,7 @@ import textwrap import unittest from test import support -from test.support import run_unittest, findfile, python_is_optimized +from test.support import findfile, python_is_optimized def get_gdb_version(): try: @@ -376,7 +376,6 @@ class PrettyPrintTests(DebuggerTests): def check_repr(text): try: text.encode(encoding) - printable = True except UnicodeEncodeError: self.assertGdbRepr(text, ascii(text)) else: @@ -867,47 +866,66 @@ id(42) ) self.assertIn('Garbage-collecting', gdb_output) + @unittest.skipIf(python_is_optimized(), "Python was compiled with optimizations") # Some older versions of gdb will fail with # "Cannot find new threads: generic error" # unless we add LD_PRELOAD=PATH-TO-libpthread.so.1 as a workaround + # + # gdb will also generate many erroneous errors such as: + # Function "meth_varargs" not defined. + # This is because we are calling functions from an "external" module + # (_testcapimodule) rather than compiled-in functions. It seems difficult + # to suppress these. See also the comment in DebuggerTests.get_stack_trace def test_pycfunction(self): 'Verify that "py-bt" displays invocations of PyCFunction instances' # Various optimizations multiply the code paths by which these are # called, so test a variety of calling conventions. - for py_name, py_args, c_name, expected_frame_number in ( - ('gmtime', '', 'time_gmtime', 1), # METH_VARARGS - ('len', '[]', 'builtin_len', 1), # METH_O - ('locals', '', 'builtin_locals', 1), # METH_NOARGS - ('iter', '[]', 'builtin_iter', 1), # METH_FASTCALL - ('sorted', '[]', 'builtin_sorted', 1), # METH_FASTCALL|METH_KEYWORDS + for func_name, args, expected_frame in ( + ('meth_varargs', '', 1), + ('meth_varargs_keywords', '', 1), + ('meth_o', '[]', 1), + ('meth_noargs', '', 1), + ('meth_fastcall', '', 1), + ('meth_fastcall_keywords', '', 1), ): - with self.subTest(c_name): - cmd = ('from time import gmtime\n' # (not always needed) - 'def foo():\n' - f' {py_name}({py_args})\n' - 'def bar():\n' - ' foo()\n' - 'bar()\n') - # Verify with "py-bt": - gdb_output = self.get_stack_trace( - cmd, - breakpoint=c_name, - cmds_after_breakpoint=['bt', 'py-bt'], - ) - self.assertIn(f'>> def f(): x = yield = y -Traceback (most recent call last): - ... -SyntaxError: assignment to yield expression not possible +# Pegen does not produce this error message yet +# >>> def f(): x = yield = y +# Traceback (most recent call last): +# ... +# SyntaxError: assignment to yield expression not possible >>> def f(): (yield bar) = y Traceback (most recent call last): @@ -1869,7 +2018,7 @@ SyntaxError: cannot assign to yield expression >>> def f(): (yield bar) += y Traceback (most recent call last): ... -SyntaxError: cannot assign to yield expression +SyntaxError: 'yield expression' is an illegal expression for augmented assignment Now check some throw() conditions: diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py new file mode 100644 index 00000000..ec1acd47 --- /dev/null +++ b/Lib/test/test_genericalias.py @@ -0,0 +1,293 @@ +"""Tests for C-implemented GenericAlias.""" + +import unittest +import pickle +from collections import ( + defaultdict, deque, OrderedDict, Counter, UserDict, UserList +) +from collections.abc import * +from concurrent.futures import Future +from concurrent.futures.thread import _WorkItem +from contextlib import AbstractContextManager, AbstractAsyncContextManager +from contextvars import ContextVar, Token +from dataclasses import Field +from functools import partial, partialmethod, cached_property +from mailbox import Mailbox, _PartialFile +from ctypes import Array, LibraryLoader +from difflib import SequenceMatcher +from filecmp import dircmp +from fileinput import FileInput +from itertools import chain +from http.cookies import Morsel +from multiprocessing.managers import ValueProxy +from multiprocessing.pool import ApplyResult +try: + from multiprocessing.shared_memory import ShareableList +except ImportError: + # multiprocessing.shared_memory is not available on e.g. Android + ShareableList = None +from multiprocessing.queues import SimpleQueue +from os import DirEntry +from re import Pattern, Match +from types import GenericAlias, MappingProxyType, AsyncGeneratorType +from tempfile import TemporaryDirectory, SpooledTemporaryFile +from urllib.parse import SplitResult, ParseResult +from unittest.case import _AssertRaisesContext +from queue import Queue, SimpleQueue +from weakref import WeakSet, ReferenceType, ref +import typing + +from typing import TypeVar +T = TypeVar('T') +K = TypeVar('K') +V = TypeVar('V') + +class BaseTest(unittest.TestCase): + """Test basics.""" + + def test_subscriptable(self): + for t in (type, tuple, list, dict, set, frozenset, enumerate, + defaultdict, deque, + SequenceMatcher, + dircmp, + FileInput, + OrderedDict, Counter, UserDict, UserList, + Pattern, Match, + partial, partialmethod, cached_property, + AbstractContextManager, AbstractAsyncContextManager, + Awaitable, Coroutine, + AsyncIterable, AsyncIterator, + AsyncGenerator, Generator, + Iterable, Iterator, + Reversible, + Container, Collection, + Callable, + Mailbox, _PartialFile, + ContextVar, Token, + Field, + Set, MutableSet, + Mapping, MutableMapping, MappingView, + KeysView, ItemsView, ValuesView, + Sequence, MutableSequence, + MappingProxyType, AsyncGeneratorType, + DirEntry, + chain, + TemporaryDirectory, SpooledTemporaryFile, + Queue, SimpleQueue, + _AssertRaisesContext, + Array, LibraryLoader, + SplitResult, ParseResult, + ValueProxy, ApplyResult, + WeakSet, ReferenceType, ref, + ShareableList, SimpleQueue, + Future, _WorkItem, + Morsel, + ): + if t is None: + continue + tname = t.__name__ + with self.subTest(f"Testing {tname}"): + alias = t[int] + self.assertIs(alias.__origin__, t) + self.assertEqual(alias.__args__, (int,)) + self.assertEqual(alias.__parameters__, ()) + + def test_unsubscriptable(self): + for t in int, str, float, Sized, Hashable: + tname = t.__name__ + with self.subTest(f"Testing {tname}"): + with self.assertRaises(TypeError): + t[int] + + def test_instantiate(self): + for t in tuple, list, dict, set, frozenset, defaultdict, deque: + tname = t.__name__ + with self.subTest(f"Testing {tname}"): + alias = t[int] + self.assertEqual(alias(), t()) + if t is dict: + self.assertEqual(alias(iter([('a', 1), ('b', 2)])), dict(a=1, b=2)) + self.assertEqual(alias(a=1, b=2), dict(a=1, b=2)) + elif t is defaultdict: + def default(): + return 'value' + a = alias(default) + d = defaultdict(default) + self.assertEqual(a['test'], d['test']) + else: + self.assertEqual(alias(iter((1, 2, 3))), t((1, 2, 3))) + + def test_unbound_methods(self): + t = list[int] + a = t() + t.append(a, 'foo') + self.assertEqual(a, ['foo']) + x = t.__getitem__(a, 0) + self.assertEqual(x, 'foo') + self.assertEqual(t.__len__(a), 1) + + def test_subclassing(self): + class C(list[int]): + pass + self.assertEqual(C.__bases__, (list,)) + self.assertEqual(C.__class__, type) + + def test_class_methods(self): + t = dict[int, None] + self.assertEqual(dict.fromkeys(range(2)), {0: None, 1: None}) # This works + self.assertEqual(t.fromkeys(range(2)), {0: None, 1: None}) # Should be equivalent + + def test_no_chaining(self): + t = list[int] + with self.assertRaises(TypeError): + t[int] + + def test_generic_subclass(self): + class MyList(list): + pass + t = MyList[int] + self.assertIs(t.__origin__, MyList) + self.assertEqual(t.__args__, (int,)) + self.assertEqual(t.__parameters__, ()) + + def test_repr(self): + class MyList(list): + pass + self.assertEqual(repr(list[str]), 'list[str]') + self.assertEqual(repr(list[()]), 'list[()]') + self.assertEqual(repr(tuple[int, ...]), 'tuple[int, ...]') + self.assertTrue(repr(MyList[int]).endswith('.BaseTest.test_repr..MyList[int]')) + self.assertEqual(repr(list[str]()), '[]') # instances should keep their normal repr + + def test_exposed_type(self): + import types + a = types.GenericAlias(list, int) + self.assertEqual(str(a), 'list[int]') + self.assertIs(a.__origin__, list) + self.assertEqual(a.__args__, (int,)) + self.assertEqual(a.__parameters__, ()) + + def test_parameters(self): + from typing import List, Dict, Callable + D0 = dict[str, int] + self.assertEqual(D0.__args__, (str, int)) + self.assertEqual(D0.__parameters__, ()) + D1a = dict[str, V] + self.assertEqual(D1a.__args__, (str, V)) + self.assertEqual(D1a.__parameters__, (V,)) + D1b = dict[K, int] + self.assertEqual(D1b.__args__, (K, int)) + self.assertEqual(D1b.__parameters__, (K,)) + D2a = dict[K, V] + self.assertEqual(D2a.__args__, (K, V)) + self.assertEqual(D2a.__parameters__, (K, V)) + D2b = dict[T, T] + self.assertEqual(D2b.__args__, (T, T)) + self.assertEqual(D2b.__parameters__, (T,)) + L0 = list[str] + self.assertEqual(L0.__args__, (str,)) + self.assertEqual(L0.__parameters__, ()) + L1 = list[T] + self.assertEqual(L1.__args__, (T,)) + self.assertEqual(L1.__parameters__, (T,)) + L2 = list[list[T]] + self.assertEqual(L2.__args__, (list[T],)) + self.assertEqual(L2.__parameters__, (T,)) + L3 = list[List[T]] + self.assertEqual(L3.__args__, (List[T],)) + self.assertEqual(L3.__parameters__, (T,)) + L4a = list[Dict[K, V]] + self.assertEqual(L4a.__args__, (Dict[K, V],)) + self.assertEqual(L4a.__parameters__, (K, V)) + L4b = list[Dict[T, int]] + self.assertEqual(L4b.__args__, (Dict[T, int],)) + self.assertEqual(L4b.__parameters__, (T,)) + L5 = list[Callable[[K, V], K]] + self.assertEqual(L5.__args__, (Callable[[K, V], K],)) + self.assertEqual(L5.__parameters__, (K, V)) + + def test_parameter_chaining(self): + from typing import List, Dict, Union, Callable + self.assertEqual(list[T][int], list[int]) + self.assertEqual(dict[str, T][int], dict[str, int]) + self.assertEqual(dict[T, int][str], dict[str, int]) + self.assertEqual(dict[K, V][str, int], dict[str, int]) + self.assertEqual(dict[T, T][int], dict[int, int]) + + self.assertEqual(list[list[T]][int], list[list[int]]) + self.assertEqual(list[dict[T, int]][str], list[dict[str, int]]) + self.assertEqual(list[dict[str, T]][int], list[dict[str, int]]) + self.assertEqual(list[dict[K, V]][str, int], list[dict[str, int]]) + self.assertEqual(dict[T, list[int]][str], dict[str, list[int]]) + + self.assertEqual(list[List[T]][int], list[List[int]]) + self.assertEqual(list[Dict[K, V]][str, int], list[Dict[str, int]]) + self.assertEqual(list[Union[K, V]][str, int], list[Union[str, int]]) + self.assertEqual(list[Callable[[K, V], K]][str, int], + list[Callable[[str, int], str]]) + self.assertEqual(dict[T, List[int]][str], dict[str, List[int]]) + + with self.assertRaises(TypeError): + list[int][int] + dict[T, int][str, int] + dict[str, T][str, int] + dict[T, T][str, int] + + def test_equality(self): + self.assertEqual(list[int], list[int]) + self.assertEqual(dict[str, int], dict[str, int]) + self.assertNotEqual(dict[str, int], dict[str, str]) + self.assertNotEqual(list, list[int]) + self.assertNotEqual(list[int], list) + + def test_isinstance(self): + self.assertTrue(isinstance([], list)) + with self.assertRaises(TypeError): + isinstance([], list[str]) + + def test_issubclass(self): + class L(list): ... + self.assertTrue(issubclass(L, list)) + with self.assertRaises(TypeError): + issubclass(L, list[str]) + + def test_type_generic(self): + t = type[int] + Test = t('Test', (), {}) + self.assertTrue(isinstance(Test, type)) + test = Test() + self.assertEqual(t(test), Test) + self.assertEqual(t(0), int) + + def test_type_subclass_generic(self): + class MyType(type): + pass + with self.assertRaises(TypeError): + MyType[int] + + def test_pickle(self): + alias = GenericAlias(list, T) + s = pickle.dumps(alias) + loaded = pickle.loads(s) + self.assertEqual(alias.__origin__, loaded.__origin__) + self.assertEqual(alias.__args__, loaded.__args__) + self.assertEqual(alias.__parameters__, loaded.__parameters__) + + def test_union(self): + a = typing.Union[list[int], list[str]] + self.assertEqual(a.__args__, (list[int], list[str])) + self.assertEqual(a.__parameters__, ()) + + def test_union_generic(self): + a = typing.Union[list[T], tuple[T, ...]] + self.assertEqual(a.__args__, (list[T], tuple[T, ...])) + self.assertEqual(a.__parameters__, (T,)) + + def test_dir(self): + dir_of_gen_alias = set(dir(list[int])) + self.assertTrue(dir_of_gen_alias.issuperset(dir(list))) + for generic_alias_property in ("__origin__", "__args__", "__parameters__"): + self.assertIn(generic_alias_property, dir_of_gen_alias) + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py index 9d5ac44b..e7acbcd2 100644 --- a/Lib/test/test_genericpath.py +++ b/Lib/test/test_genericpath.py @@ -534,7 +534,7 @@ class CommonTest(GenericTest): class PathLikeTests(unittest.TestCase): def setUp(self): - self.file_name = support.TESTFN.lower() + self.file_name = support.TESTFN self.file_path = FakePath(support.TESTFN) self.addCleanup(support.unlink, self.file_name) create_file(self.file_name, b"test_genericpath.PathLikeTests") diff --git a/Lib/test/test_genexps.py b/Lib/test/test_genexps.py index fd712bb1..5c1a209b 100644 --- a/Lib/test/test_genexps.py +++ b/Lib/test/test_genexps.py @@ -15,6 +15,22 @@ Test nesting with the inner expression dependent on the outer >>> list((i,j) for i in range(4) for j in range(i) ) [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] +Test the idiom for temporary variable assignment in comprehensions. + + >>> list((j*j for i in range(4) for j in [i+1])) + [1, 4, 9, 16] + >>> list((j*k for i in range(4) for j in [i+1] for k in [j+1])) + [2, 6, 12, 20] + >>> list((j*k for i in range(4) for j, k in [(i+1, i+2)])) + [2, 6, 12, 20] + +Not assignment + + >>> list((i*i for i in [*range(4)])) + [0, 1, 4, 9] + >>> list((i*i for i in (*range(4),))) + [0, 1, 4, 9] + Make sure the induction variable is not exposed >>> i = 20 @@ -142,7 +158,7 @@ Verify that syntax error's are raised for genexps used as lvalues >>> (y for y in (1,2)) += 10 Traceback (most recent call last): ... - SyntaxError: cannot assign to generator expression + SyntaxError: 'generator expression' is an illegal expression for augmented assignment ########### Tests borrowed from or inspired by test_generators.py ############ diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index 2ed73e3a..e1a402e2 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -1,7 +1,7 @@ # Python test set -- part 1, grammar. # This just tests whether the parser accepts them all. -from test.support import check_syntax_error, check_syntax_warning +from test.support import check_syntax_error, check_syntax_warning, use_old_parser import inspect import unittest import sys @@ -460,7 +460,7 @@ class GrammarTests(unittest.TestCase): def test_funcdef(self): ### [decorators] 'def' NAME parameters ['->' test] ':' suite - ### decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE + ### decorator: '@' namedexpr_test NEWLINE ### decorators: decorator+ ### parameters: '(' [typedargslist] ')' ### typedargslist: ((tfpdef ['=' test] ',')* @@ -666,6 +666,20 @@ class GrammarTests(unittest.TestCase): def f(x) -> list: pass self.assertEqual(f.__annotations__, {'return': list}) + # Test expressions as decorators (PEP 614): + @False or null + def f(x): pass + @d := null + def f(x): pass + @lambda f: null(f) + def f(x): pass + @[..., null, ...][1] + def f(x): pass + @null(null)(null) + def f(x): pass + @[null][0].__call__.__call__ + def f(x): pass + # test closures with a variety of opargs closure = 1 def f(): return closure @@ -787,6 +801,23 @@ class GrammarTests(unittest.TestCase): del abc del x, y, (z, xyz) + x, y, z = "xyz" + del x + del y, + del (z) + del () + + a, b, c, d, e, f, g = "abcdefg" + del a, (b, c), (d, (e, f)) + + a, b, c, d, e, f, g = "abcdefg" + del a, [b, c], (d, [e, f]) + + abcd = list("abcd") + del abcd[1:2] + + compile("del a, (b[0].c, (d.e, f.g[1:2])), [h.i.j], ()", "", "exec") + def test_pass_stmt(self): # 'pass' pass @@ -1248,7 +1279,7 @@ class GrammarTests(unittest.TestCase): def test_try(self): ### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] ### | 'try' ':' suite 'finally' ':' suite - ### except_clause: 'except' [expr ['as' expr]] + ### except_clause: 'except' [expr ['as' NAME]] try: 1/0 except ZeroDivisionError: @@ -1266,6 +1297,9 @@ class GrammarTests(unittest.TestCase): except (EOFError, TypeError, ZeroDivisionError) as msg: pass try: pass finally: pass + with self.assertRaises(SyntaxError): + compile("try:\n pass\nexcept Exception as a.b:\n pass", "?", "exec") + compile("try:\n pass\nexcept Exception as a[b]:\n pass", "?", "exec") def test_suite(self): # simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT @@ -1515,13 +1549,27 @@ class GrammarTests(unittest.TestCase): def meth2(self, arg): pass def meth3(self, a1, a2): pass - # decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE + # decorator: '@' namedexpr_test NEWLINE # decorators: decorator+ # decorated: decorators (classdef | funcdef) def class_decorator(x): return x @class_decorator class G: pass + # Test expressions as decorators (PEP 614): + @False or class_decorator + class H: pass + @d := class_decorator + class I: pass + @lambda c: class_decorator(c) + class J: pass + @[..., class_decorator, ...][1] + class K: pass + @class_decorator(class_decorator)(class_decorator) + class L: pass + @[class_decorator][0].__call__.__call__ + class M: pass + def test_dictcomps(self): # dictorsetmaker: ( (test ':' test (comp_for | # (',' test ':' test)* [','])) | @@ -1666,6 +1714,70 @@ class GrammarTests(unittest.TestCase): with manager() as x, manager(): pass + if not use_old_parser(): + test_cases = [ + """if 1: + with ( + manager() + ): + pass + """, + """if 1: + with ( + manager() as x + ): + pass + """, + """if 1: + with ( + manager() as (x, y), + manager() as z, + ): + pass + """, + """if 1: + with ( + manager(), + manager() + ): + pass + """, + """if 1: + with ( + manager() as x, + manager() as y + ): + pass + """, + """if 1: + with ( + manager() as x, + manager() + ): + pass + """, + """if 1: + with ( + manager() as x, + manager() as y, + manager() as z, + ): + pass + """, + """if 1: + with ( + manager() as x, + manager() as y, + manager(), + ): + pass + """, + ] + for case in test_cases: + with self.subTest(case=case): + compile(case, "", "exec") + + def test_if_else_expr(self): # Test ifelse expressions in various cases def _checkeval(msg, ret): diff --git a/Lib/test/test_graphlib.py b/Lib/test/test_graphlib.py new file mode 100644 index 00000000..00432537 --- /dev/null +++ b/Lib/test/test_graphlib.py @@ -0,0 +1,244 @@ +from itertools import chain +import graphlib +import os +import unittest + +from test.support.script_helper import assert_python_ok + +class TestTopologicalSort(unittest.TestCase): + def _test_graph(self, graph, expected): + def static_order_with_groups(ts): + ts.prepare() + while ts.is_active(): + nodes = ts.get_ready() + for node in nodes: + ts.done(node) + yield nodes + + ts = graphlib.TopologicalSorter(graph) + self.assertEqual(list(static_order_with_groups(ts)), list(expected)) + + ts = graphlib.TopologicalSorter(graph) + self.assertEqual(list(ts.static_order()), list(chain(*expected))) + + def _assert_cycle(self, graph, cycle): + ts = graphlib.TopologicalSorter() + for node, dependson in graph.items(): + ts.add(node, *dependson) + try: + ts.prepare() + except graphlib.CycleError as e: + msg, seq = e.args + self.assertIn(" ".join(map(str, cycle)), " ".join(map(str, seq * 2))) + else: + raise + + def test_simple_cases(self): + self._test_graph( + {2: {11}, 9: {11, 8}, 10: {11, 3}, 11: {7, 5}, 8: {7, 3}}, + [(3, 5, 7), (11, 8), (2, 10, 9)], + ) + + self._test_graph({1: {}}, [(1,)]) + + self._test_graph( + {x: {x + 1} for x in range(10)}, [(x,) for x in range(10, -1, -1)] + ) + + self._test_graph( + {2: {3}, 3: {4}, 4: {5}, 5: {1}, 11: {12}, 12: {13}, 13: {14}, 14: {15}}, + [(1, 15), (5, 14), (4, 13), (3, 12), (2, 11)], + ) + + self._test_graph( + { + 0: [1, 2], + 1: [3], + 2: [5, 6], + 3: [4], + 4: [9], + 5: [3], + 6: [7], + 7: [8], + 8: [4], + 9: [], + }, + [(9,), (4,), (3, 8), (1, 5, 7), (6,), (2,), (0,)], + ) + + self._test_graph({0: [1, 2], 1: [], 2: [3], 3: []}, [(1, 3), (2,), (0,)]) + + self._test_graph( + {0: [1, 2], 1: [], 2: [3], 3: [], 4: [5], 5: [6], 6: []}, + [(1, 3, 6), (2, 5), (0, 4)], + ) + + def test_no_dependencies(self): + self._test_graph({1: {2}, 3: {4}, 5: {6}}, [(2, 4, 6), (1, 3, 5)]) + + self._test_graph({1: set(), 3: set(), 5: set()}, [(1, 3, 5)]) + + def test_the_node_multiple_times(self): + # Test same node multiple times in dependencies + self._test_graph({1: {2}, 3: {4}, 0: [2, 4, 4, 4, 4, 4]}, [(2, 4), (1, 3, 0)]) + + # Test adding the same dependency multiple times + ts = graphlib.TopologicalSorter() + ts.add(1, 2) + ts.add(1, 2) + ts.add(1, 2) + self.assertEqual([*ts.static_order()], [2, 1]) + + def test_graph_with_iterables(self): + dependson = (2 * x + 1 for x in range(5)) + ts = graphlib.TopologicalSorter({0: dependson}) + self.assertEqual(list(ts.static_order()), [1, 3, 5, 7, 9, 0]) + + def test_add_dependencies_for_same_node_incrementally(self): + # Test same node multiple times + ts = graphlib.TopologicalSorter() + ts.add(1, 2) + ts.add(1, 3) + ts.add(1, 4) + ts.add(1, 5) + + ts2 = graphlib.TopologicalSorter({1: {2, 3, 4, 5}}) + self.assertEqual([*ts.static_order()], [*ts2.static_order()]) + + def test_empty(self): + self._test_graph({}, []) + + def test_cycle(self): + # Self cycle + self._assert_cycle({1: {1}}, [1, 1]) + # Simple cycle + self._assert_cycle({1: {2}, 2: {1}}, [1, 2, 1]) + # Indirect cycle + self._assert_cycle({1: {2}, 2: {3}, 3: {1}}, [1, 3, 2, 1]) + # not all elements involved in a cycle + self._assert_cycle({1: {2}, 2: {3}, 3: {1}, 5: {4}, 4: {6}}, [1, 3, 2, 1]) + # Multiple cycles + self._assert_cycle({1: {2}, 2: {1}, 3: {4}, 4: {5}, 6: {7}, 7: {6}}, [1, 2, 1]) + # Cycle in the middle of the graph + self._assert_cycle({1: {2}, 2: {3}, 3: {2, 4}, 4: {5}}, [3, 2]) + + def test_calls_before_prepare(self): + ts = graphlib.TopologicalSorter() + + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.get_ready() + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.done(3) + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.is_active() + + def test_prepare_multiple_times(self): + ts = graphlib.TopologicalSorter() + ts.prepare() + with self.assertRaisesRegex(ValueError, r"cannot prepare\(\) more than once"): + ts.prepare() + + def test_invalid_nodes_in_done(self): + ts = graphlib.TopologicalSorter() + ts.add(1, 2, 3, 4) + ts.add(2, 3, 4) + ts.prepare() + ts.get_ready() + + with self.assertRaisesRegex(ValueError, "node 2 was not passed out"): + ts.done(2) + with self.assertRaisesRegex(ValueError, r"node 24 was not added using add\(\)"): + ts.done(24) + + def test_done(self): + ts = graphlib.TopologicalSorter() + ts.add(1, 2, 3, 4) + ts.add(2, 3) + ts.prepare() + + self.assertEqual(ts.get_ready(), (3, 4)) + # If we don't mark anything as done, get_ready() returns nothing + self.assertEqual(ts.get_ready(), ()) + ts.done(3) + # Now 2 becomes available as 3 is done + self.assertEqual(ts.get_ready(), (2,)) + self.assertEqual(ts.get_ready(), ()) + ts.done(4) + ts.done(2) + # Only 1 is missing + self.assertEqual(ts.get_ready(), (1,)) + self.assertEqual(ts.get_ready(), ()) + ts.done(1) + self.assertEqual(ts.get_ready(), ()) + self.assertFalse(ts.is_active()) + + def test_is_active(self): + ts = graphlib.TopologicalSorter() + ts.add(1, 2) + ts.prepare() + + self.assertTrue(ts.is_active()) + self.assertEqual(ts.get_ready(), (2,)) + self.assertTrue(ts.is_active()) + ts.done(2) + self.assertTrue(ts.is_active()) + self.assertEqual(ts.get_ready(), (1,)) + self.assertTrue(ts.is_active()) + ts.done(1) + self.assertFalse(ts.is_active()) + + def test_not_hashable_nodes(self): + ts = graphlib.TopologicalSorter() + self.assertRaises(TypeError, ts.add, dict(), 1) + self.assertRaises(TypeError, ts.add, 1, dict()) + self.assertRaises(TypeError, ts.add, dict(), dict()) + + def test_order_of_insertion_does_not_matter_between_groups(self): + def get_groups(ts): + ts.prepare() + while ts.is_active(): + nodes = ts.get_ready() + ts.done(*nodes) + yield set(nodes) + + ts = graphlib.TopologicalSorter() + ts.add(3, 2, 1) + ts.add(1, 0) + ts.add(4, 5) + ts.add(6, 7) + ts.add(4, 7) + + ts2 = graphlib.TopologicalSorter() + ts2.add(1, 0) + ts2.add(3, 2, 1) + ts2.add(4, 7) + ts2.add(6, 7) + ts2.add(4, 5) + + self.assertEqual(list(get_groups(ts)), list(get_groups(ts2))) + + def test_static_order_does_not_change_with_the_hash_seed(self): + def check_order_with_hash_seed(seed): + code = """if 1: + import graphlib + ts = graphlib.TopologicalSorter() + ts.add('blech', 'bluch', 'hola') + ts.add('abcd', 'blech', 'bluch', 'a', 'b') + ts.add('a', 'a string', 'something', 'b') + ts.add('bluch', 'hola', 'abcde', 'a', 'b') + print(list(ts.static_order())) + """ + env = os.environ.copy() + # signal to assert_python not to do a copy + # of os.environ on its own + env["__cleanenv"] = True + env["PYTHONHASHSEED"] = str(seed) + out = assert_python_ok("-c", code, **env) + return out + + run1 = check_order_with_hash_seed(1234) + run2 = check_order_with_hash_seed(31415) + + self.assertNotEqual(run1, "") + self.assertNotEqual(run2, "") + self.assertEqual(run1, run2) diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index 64682862..0f235d18 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -328,8 +328,15 @@ class TestGzip(BaseTest): cmByte = fRead.read(1) self.assertEqual(cmByte, b'\x08') # deflate + try: + expectedname = self.filename.encode('Latin-1') + b'\x00' + expectedflags = b'\x08' # only the FNAME flag is set + except UnicodeEncodeError: + expectedname = b'' + expectedflags = b'\x00' + flagsByte = fRead.read(1) - self.assertEqual(flagsByte, b'\x08') # only the FNAME flag is set + self.assertEqual(flagsByte, expectedflags) mtimeBytes = fRead.read(4) self.assertEqual(mtimeBytes, struct.pack(' 1.0') def test_pbkdf2_hmac_c(self): - self._test_pbkdf2_hmac(c_hashlib.pbkdf2_hmac) + self._test_pbkdf2_hmac(c_hashlib.pbkdf2_hmac, openssl_md_meth_names) @unittest.skipUnless(hasattr(c_hashlib, 'scrypt'), diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py index 23c108f6..6daf22ca 100644 --- a/Lib/test/test_hmac.py +++ b/Lib/test/test_hmac.py @@ -6,7 +6,18 @@ import unittest import unittest.mock import warnings -from test.support import requires_hashdigest +from test.support import hashlib_helper + +from _operator import _compare_digest as operator_compare_digest + +try: + from _hashlib import HMAC as C_HMAC + from _hashlib import hmac_new as c_hmac_new + from _hashlib import compare_digest as openssl_compare_digest +except ImportError: + C_HMAC = None + c_hmac_new = None + openssl_compare_digest = None def ignore_warning(func): @@ -21,34 +32,91 @@ def ignore_warning(func): class TestVectorsTestCase(unittest.TestCase): - @requires_hashdigest('md5', openssl=True) - def test_md5_vectors(self): - # Test the HMAC module against test vectors from the RFC. + def asssert_hmac( + self, key, data, digest, hashfunc, hashname, digest_size, block_size + ): + h = hmac.HMAC(key, data, digestmod=hashfunc) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + self.assertEqual(h.digest(), binascii.unhexlify(digest)) + self.assertEqual(h.name, f"hmac-{hashname}") + self.assertEqual(h.digest_size, digest_size) + self.assertEqual(h.block_size, block_size) + + h = hmac.HMAC(key, data, digestmod=hashname) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + self.assertEqual(h.digest(), binascii.unhexlify(digest)) + self.assertEqual(h.name, f"hmac-{hashname}") + self.assertEqual(h.digest_size, digest_size) + self.assertEqual(h.block_size, block_size) + + h = hmac.HMAC(key, digestmod=hashname) + h2 = h.copy() + h2.update(b"test update") + h.update(data) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + + h = hmac.new(key, data, digestmod=hashname) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + self.assertEqual(h.digest(), binascii.unhexlify(digest)) + self.assertEqual(h.name, f"hmac-{hashname}") + self.assertEqual(h.digest_size, digest_size) + self.assertEqual(h.block_size, block_size) + + h = hmac.new(key, None, digestmod=hashname) + h.update(data) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + + h = hmac.new(key, digestmod=hashname) + h.update(data) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + + h = hmac.new(key, data, digestmod=hashfunc) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + + self.assertEqual( + hmac.digest(key, data, digest=hashname), + binascii.unhexlify(digest) + ) + self.assertEqual( + hmac.digest(key, data, digest=hashfunc), + binascii.unhexlify(digest) + ) + with unittest.mock.patch('hmac._openssl_md_meths', {}): + self.assertEqual( + hmac.digest(key, data, digest=hashname), + binascii.unhexlify(digest) + ) + self.assertEqual( + hmac.digest(key, data, digest=hashfunc), + binascii.unhexlify(digest) + ) - def md5test(key, data, digest): - h = hmac.HMAC(key, data, digestmod=hashlib.md5) + if c_hmac_new is not None: + h = c_hmac_new(key, data, digestmod=hashname) self.assertEqual(h.hexdigest().upper(), digest.upper()) self.assertEqual(h.digest(), binascii.unhexlify(digest)) - self.assertEqual(h.name, "hmac-md5") - self.assertEqual(h.digest_size, 16) - self.assertEqual(h.block_size, 64) + self.assertEqual(h.name, f"hmac-{hashname}") + self.assertEqual(h.digest_size, digest_size) + self.assertEqual(h.block_size, block_size) - h = hmac.HMAC(key, data, digestmod='md5') + h = c_hmac_new(key, digestmod=hashname) + h2 = h.copy() + h2.update(b"test update") + h.update(data) self.assertEqual(h.hexdigest().upper(), digest.upper()) - self.assertEqual(h.digest(), binascii.unhexlify(digest)) - self.assertEqual(h.name, "hmac-md5") - self.assertEqual(h.digest_size, 16) - self.assertEqual(h.block_size, 64) - self.assertEqual( - hmac.digest(key, data, digest='md5'), - binascii.unhexlify(digest) + @hashlib_helper.requires_hashdigest('md5', openssl=True) + def test_md5_vectors(self): + # Test the HMAC module against test vectors from the RFC. + + def md5test(key, data, digest): + self.asssert_hmac( + key, data, digest, + hashfunc=hashlib.md5, + hashname="md5", + digest_size=16, + block_size=64 ) - with unittest.mock.patch('hmac._openssl_md_meths', {}): - self.assertEqual( - hmac.digest(key, data, digest='md5'), - binascii.unhexlify(digest) - ) md5test(b"\x0b" * 16, b"Hi There", @@ -79,29 +147,17 @@ class TestVectorsTestCase(unittest.TestCase): b"and Larger Than One Block-Size Data"), "6f630fad67cda0ee1fb1f562db3aa53e") - @requires_hashdigest('sha1', openssl=True) + @hashlib_helper.requires_hashdigest('sha1', openssl=True) def test_sha_vectors(self): def shatest(key, data, digest): - h = hmac.HMAC(key, data, digestmod=hashlib.sha1) - self.assertEqual(h.hexdigest().upper(), digest.upper()) - self.assertEqual(h.digest(), binascii.unhexlify(digest)) - self.assertEqual(h.name, "hmac-sha1") - self.assertEqual(h.digest_size, 20) - self.assertEqual(h.block_size, 64) - - h = hmac.HMAC(key, data, digestmod='sha1') - self.assertEqual(h.hexdigest().upper(), digest.upper()) - self.assertEqual(h.digest(), binascii.unhexlify(digest)) - self.assertEqual(h.name, "hmac-sha1") - self.assertEqual(h.digest_size, 20) - self.assertEqual(h.block_size, 64) - - self.assertEqual( - hmac.digest(key, data, digest='sha1'), - binascii.unhexlify(digest) + self.asssert_hmac( + key, data, digest, + hashfunc=hashlib.sha1, + hashname="sha1", + digest_size=20, + block_size=64 ) - shatest(b"\x0b" * 20, b"Hi There", "b617318655057264e28bc0b6fb378c8ef146be00") @@ -133,37 +189,15 @@ class TestVectorsTestCase(unittest.TestCase): def _rfc4231_test_cases(self, hashfunc, hash_name, digest_size, block_size): def hmactest(key, data, hexdigests): - hmac_name = "hmac-" + hash_name - h = hmac.HMAC(key, data, digestmod=hashfunc) - self.assertEqual(h.hexdigest().lower(), hexdigests[hashfunc]) - self.assertEqual(h.name, hmac_name) - self.assertEqual(h.digest_size, digest_size) - self.assertEqual(h.block_size, block_size) - - h = hmac.HMAC(key, data, digestmod=hash_name) - self.assertEqual(h.hexdigest().lower(), hexdigests[hashfunc]) - self.assertEqual(h.name, hmac_name) - self.assertEqual(h.digest_size, digest_size) - self.assertEqual(h.block_size, block_size) - - self.assertEqual( - hmac.digest(key, data, digest=hashfunc), - binascii.unhexlify(hexdigests[hashfunc]) + digest = hexdigests[hashfunc] + + self.asssert_hmac( + key, data, digest, + hashfunc=hashfunc, + hashname=hash_name, + digest_size=digest_size, + block_size=block_size ) - self.assertEqual( - hmac.digest(key, data, digest=hash_name), - binascii.unhexlify(hexdigests[hashfunc]) - ) - - with unittest.mock.patch('hmac._openssl_md_meths', {}): - self.assertEqual( - hmac.digest(key, data, digest=hashfunc), - binascii.unhexlify(hexdigests[hashfunc]) - ) - self.assertEqual( - hmac.digest(key, data, digest=hash_name), - binascii.unhexlify(hexdigests[hashfunc]) - ) # 4.2. Test Case 1 hmactest(key = b'\x0b'*20, @@ -272,23 +306,23 @@ class TestVectorsTestCase(unittest.TestCase): '134676fb6de0446065c97440fa8c6a58', }) - @requires_hashdigest('sha224', openssl=True) + @hashlib_helper.requires_hashdigest('sha224', openssl=True) def test_sha224_rfc4231(self): self._rfc4231_test_cases(hashlib.sha224, 'sha224', 28, 64) - @requires_hashdigest('sha256', openssl=True) + @hashlib_helper.requires_hashdigest('sha256', openssl=True) def test_sha256_rfc4231(self): self._rfc4231_test_cases(hashlib.sha256, 'sha256', 32, 64) - @requires_hashdigest('sha384', openssl=True) + @hashlib_helper.requires_hashdigest('sha384', openssl=True) def test_sha384_rfc4231(self): self._rfc4231_test_cases(hashlib.sha384, 'sha384', 48, 128) - @requires_hashdigest('sha512', openssl=True) + @hashlib_helper.requires_hashdigest('sha512', openssl=True) def test_sha512_rfc4231(self): self._rfc4231_test_cases(hashlib.sha512, 'sha512', 64, 128) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_legacy_block_size_warnings(self): class MockCrazyHash(object): """Ain't no block_size attribute here.""" @@ -329,7 +363,7 @@ class ConstructorTestCase(unittest.TestCase): "6c845b47f52b3b47f6590c502db7825aad757bf4fadc8fa972f7cd2e76a5bdeb" ) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_normal(self): # Standard constructor call. try: @@ -337,21 +371,21 @@ class ConstructorTestCase(unittest.TestCase): except Exception: self.fail("Standard constructor call raised exception.") - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_with_str_key(self): # Pass a key of type str, which is an error, because it expects a key # of type bytes with self.assertRaises(TypeError): h = hmac.HMAC("key", digestmod='sha256') - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_dot_new_with_str_key(self): # Pass a key of type str, which is an error, because it expects a key # of type bytes with self.assertRaises(TypeError): h = hmac.new("key", digestmod='sha256') - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_withtext(self): # Constructor call with text. try: @@ -360,7 +394,7 @@ class ConstructorTestCase(unittest.TestCase): self.fail("Constructor call with text argument raised exception.") self.assertEqual(h.hexdigest(), self.expected) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_with_bytearray(self): try: h = hmac.HMAC(bytearray(b"key"), bytearray(b"hash this!"), @@ -369,7 +403,7 @@ class ConstructorTestCase(unittest.TestCase): self.fail("Constructor call with bytearray arguments raised exception.") self.assertEqual(h.hexdigest(), self.expected) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_with_memoryview_msg(self): try: h = hmac.HMAC(b"key", memoryview(b"hash this!"), digestmod="sha256") @@ -377,7 +411,7 @@ class ConstructorTestCase(unittest.TestCase): self.fail("Constructor call with memoryview msg raised exception.") self.assertEqual(h.hexdigest(), self.expected) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_withmodule(self): # Constructor call with text and digest module. try: @@ -385,50 +419,69 @@ class ConstructorTestCase(unittest.TestCase): except Exception: self.fail("Constructor call with hashlib.sha256 raised exception.") + @unittest.skipUnless(C_HMAC is not None, 'need _hashlib') + def test_internal_types(self): + # internal types like _hashlib.C_HMAC are not constructable + with self.assertRaisesRegex( + TypeError, "cannot create 'HMAC' instance" + ): + C_HMAC() + class SanityTestCase(unittest.TestCase): - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_exercise_all_methods(self): # Exercising all methods once. # This must not raise any exceptions try: h = hmac.HMAC(b"my secret key", digestmod="sha256") h.update(b"compute the hash of this text!") - dig = h.digest() - dig = h.hexdigest() - h2 = h.copy() + h.digest() + h.hexdigest() + h.copy() except Exception: self.fail("Exception raised during normal usage of HMAC class.") class CopyTestCase(unittest.TestCase): - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_attributes(self): # Testing if attributes are of same type. h1 = hmac.HMAC(b"key", digestmod="sha256") h2 = h1.copy() - self.assertTrue(h1.digest_cons == h2.digest_cons, + self.assertTrue(h1._digest_cons == h2._digest_cons, "digest constructors don't match.") - self.assertEqual(type(h1.inner), type(h2.inner), + self.assertEqual(type(h1._inner), type(h2._inner), "Types of inner don't match.") - self.assertEqual(type(h1.outer), type(h2.outer), + self.assertEqual(type(h1._outer), type(h2._outer), "Types of outer don't match.") - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_realcopy(self): # Testing if the copy method created a real copy. h1 = hmac.HMAC(b"key", digestmod="sha256") h2 = h1.copy() # Using id() in case somebody has overridden __eq__/__ne__. self.assertTrue(id(h1) != id(h2), "No real copy of the HMAC instance.") - self.assertTrue(id(h1.inner) != id(h2.inner), + self.assertTrue(id(h1._inner) != id(h2._inner), "No real copy of the attribute 'inner'.") - self.assertTrue(id(h1.outer) != id(h2.outer), + self.assertTrue(id(h1._outer) != id(h2._outer), "No real copy of the attribute 'outer'.") + self.assertEqual(h1._inner, h1.inner) + self.assertEqual(h1._outer, h1.outer) + self.assertEqual(h1._digest_cons, h1.digest_cons) + + @hashlib_helper.requires_hashdigest('sha256') + def test_properties(self): + # deprecated properties + h1 = hmac.HMAC(b"key", digestmod="sha256") + self.assertEqual(h1._inner, h1.inner) + self.assertEqual(h1._outer, h1.outer) + self.assertEqual(h1._digest_cons, h1.digest_cons) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_equality(self): # Testing if the copy has the same digests. h1 = hmac.HMAC(b"key", digestmod="sha256") @@ -439,89 +492,118 @@ class CopyTestCase(unittest.TestCase): self.assertEqual(h1.hexdigest(), h2.hexdigest(), "Hexdigest of copy doesn't match original hexdigest.") + @hashlib_helper.requires_hashdigest('sha256') + def test_equality_new(self): + # Testing if the copy has the same digests with hmac.new(). + h1 = hmac.new(b"key", digestmod="sha256") + h1.update(b"some random text") + h2 = h1.copy() + self.assertTrue( + id(h1) != id(h2), "No real copy of the HMAC instance." + ) + self.assertEqual(h1.digest(), h2.digest(), + "Digest of copy doesn't match original digest.") + self.assertEqual(h1.hexdigest(), h2.hexdigest(), + "Hexdigest of copy doesn't match original hexdigest.") + + class CompareDigestTestCase(unittest.TestCase): - def test_compare_digest(self): + def test_hmac_compare_digest(self): + self._test_compare_digest(hmac.compare_digest) + if openssl_compare_digest is not None: + self.assertIs(hmac.compare_digest, openssl_compare_digest) + else: + self.assertIs(hmac.compare_digest, operator_compare_digest) + + def test_operator_compare_digest(self): + self._test_compare_digest(operator_compare_digest) + + @unittest.skipIf(openssl_compare_digest is None, "test requires _hashlib") + def test_openssl_compare_digest(self): + self._test_compare_digest(openssl_compare_digest) + + def _test_compare_digest(self, compare_digest): # Testing input type exception handling a, b = 100, 200 - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = 100, b"foobar" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = b"foobar", 200 - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = "foobar", b"foobar" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = b"foobar", "foobar" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) # Testing bytes of different lengths a, b = b"foobar", b"foo" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) a, b = b"\xde\xad\xbe\xef", b"\xde\xad" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing bytes of same lengths, different values a, b = b"foobar", b"foobaz" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) a, b = b"\xde\xad\xbe\xef", b"\xab\xad\x1d\xea" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing bytes of same lengths, same values a, b = b"foobar", b"foobar" - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) a, b = b"\xde\xad\xbe\xef", b"\xde\xad\xbe\xef" - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) # Testing bytearrays of same lengths, same values a, b = bytearray(b"foobar"), bytearray(b"foobar") - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) # Testing bytearrays of different lengths a, b = bytearray(b"foobar"), bytearray(b"foo") - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing bytearrays of same lengths, different values a, b = bytearray(b"foobar"), bytearray(b"foobaz") - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing byte and bytearray of same lengths, same values a, b = bytearray(b"foobar"), b"foobar" - self.assertTrue(hmac.compare_digest(a, b)) - self.assertTrue(hmac.compare_digest(b, a)) + self.assertTrue(compare_digest(a, b)) + self.assertTrue(compare_digest(b, a)) # Testing byte bytearray of different lengths a, b = bytearray(b"foobar"), b"foo" - self.assertFalse(hmac.compare_digest(a, b)) - self.assertFalse(hmac.compare_digest(b, a)) + self.assertFalse(compare_digest(a, b)) + self.assertFalse(compare_digest(b, a)) # Testing byte and bytearray of same lengths, different values a, b = bytearray(b"foobar"), b"foobaz" - self.assertFalse(hmac.compare_digest(a, b)) - self.assertFalse(hmac.compare_digest(b, a)) + self.assertFalse(compare_digest(a, b)) + self.assertFalse(compare_digest(b, a)) # Testing str of same lengths a, b = "foobar", "foobar" - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) # Testing str of different lengths a, b = "foo", "foobar" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing bytes of same lengths, different values a, b = "foobar", "foobaz" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing error cases a, b = "foobar", b"foobar" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = b"foobar", "foobar" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = b"foobar", 1 - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = 100, 200 - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = "fooä", "fooä" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) # subclasses are supported by ignore __eq__ class mystr(str): @@ -529,22 +611,22 @@ class CompareDigestTestCase(unittest.TestCase): return False a, b = mystr("foobar"), mystr("foobar") - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) a, b = mystr("foobar"), "foobar" - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) a, b = mystr("foobar"), mystr("foobaz") - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) class mybytes(bytes): def __eq__(self, other): return False a, b = mybytes(b"foobar"), mybytes(b"foobar") - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) a, b = mybytes(b"foobar"), b"foobar" - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) a, b = mybytes(b"foobar"), mybytes(b"foobaz") - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) if __name__ == "__main__": diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index 326e3429..a2bfb39d 100644 --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -573,13 +573,6 @@ text for html, expected in data: self._run_check(html, expected) - def test_unescape_method(self): - from html import unescape - p = self.get_collector() - with self.assertWarns(DeprecationWarning): - s = '""""""&#bad;' - self.assertEqual(p.unescape(s), unescape(s)) - def test_broken_comments(self): html = ('' '' diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 5a5fcecb..ed125893 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -13,6 +13,7 @@ import unittest TestCase = unittest.TestCase from test import support +from test.support import socket_helper here = os.path.dirname(__file__) # Self-signed cert file for 'localhost' @@ -42,7 +43,7 @@ last_chunk_extended = "0" + chunk_extension + "\r\n" trailers = "X-Dummy: foo\r\nX-Dumm2: bar\r\n" chunked_end = "\r\n" -HOST = support.HOST +HOST = socket_helper.HOST class FakeSocket: def __init__(self, text, fileclass=io.BytesIO, host=None, port=None): @@ -1455,6 +1456,7 @@ class OfflineTest(TestCase): 'UNSUPPORTED_MEDIA_TYPE', 'REQUESTED_RANGE_NOT_SATISFIABLE', 'EXPECTATION_FAILED', + 'IM_A_TEAPOT', 'MISDIRECTED_REQUEST', 'UNPROCESSABLE_ENTITY', 'LOCKED', @@ -1473,6 +1475,8 @@ class OfflineTest(TestCase): 'INSUFFICIENT_STORAGE', 'NOT_EXTENDED', 'NETWORK_AUTHENTICATION_REQUIRED', + 'EARLY_HINTS', + 'TOO_EARLY' ] for const in expected: with self.subTest(constant=const): @@ -1482,8 +1486,8 @@ class OfflineTest(TestCase): class SourceAddressTest(TestCase): def setUp(self): self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.port = support.bind_port(self.serv) - self.source_port = support.find_unused_port() + self.port = socket_helper.bind_port(self.serv) + self.source_port = socket_helper.find_unused_port() self.serv.listen() self.conn = None @@ -1515,7 +1519,7 @@ class TimeoutTest(TestCase): def setUp(self): self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - TimeoutTest.PORT = support.bind_port(self.serv) + TimeoutTest.PORT = socket_helper.bind_port(self.serv) self.serv.listen() def tearDown(self): @@ -1647,7 +1651,7 @@ class HTTPSTest(TestCase): # Default settings: requires a valid cert from a trusted CA import ssl support.requires('network') - with support.transient_internet('self-signed.pythontest.net'): + with socket_helper.transient_internet('self-signed.pythontest.net'): h = client.HTTPSConnection('self-signed.pythontest.net', 443) with self.assertRaises(ssl.SSLError) as exc_info: h.request('GET', '/') @@ -1657,7 +1661,7 @@ class HTTPSTest(TestCase): # Switch off cert verification import ssl support.requires('network') - with support.transient_internet('self-signed.pythontest.net'): + with socket_helper.transient_internet('self-signed.pythontest.net'): context = ssl._create_unverified_context() h = client.HTTPSConnection('self-signed.pythontest.net', 443, context=context) @@ -1671,7 +1675,7 @@ class HTTPSTest(TestCase): def test_networked_trusted_by_default_cert(self): # Default settings: requires a valid cert from a trusted CA support.requires('network') - with support.transient_internet('www.python.org'): + with socket_helper.transient_internet('www.python.org'): h = client.HTTPSConnection('www.python.org', 443) h.request('GET', '/') resp = h.getresponse() @@ -1685,7 +1689,7 @@ class HTTPSTest(TestCase): import ssl support.requires('network') selfsigned_pythontestdotnet = 'self-signed.pythontest.net' - with support.transient_internet(selfsigned_pythontestdotnet): + with socket_helper.transient_internet(selfsigned_pythontestdotnet): context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) self.assertEqual(context.verify_mode, ssl.CERT_REQUIRED) self.assertEqual(context.check_hostname, True) @@ -1717,7 +1721,7 @@ class HTTPSTest(TestCase): # We feed a "CA" cert that is unrelated to the server's cert import ssl support.requires('network') - with support.transient_internet('self-signed.pythontest.net'): + with socket_helper.transient_internet('self-signed.pythontest.net'): context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) context.load_verify_locations(CERT_localhost) h = client.HTTPSConnection('self-signed.pythontest.net', 443, context=context) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 87d4924a..c442f557 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -14,6 +14,7 @@ import sys import re import base64 import ntpath +import pathlib import shutil import email.message import email.utils @@ -600,13 +601,20 @@ class CGIHTTPServerTestCase(BaseTestCase): self.parent_dir = tempfile.mkdtemp() self.cgi_dir = os.path.join(self.parent_dir, 'cgi-bin') self.cgi_child_dir = os.path.join(self.cgi_dir, 'child-dir') + self.sub_dir_1 = os.path.join(self.parent_dir, 'sub') + self.sub_dir_2 = os.path.join(self.sub_dir_1, 'dir') + self.cgi_dir_in_sub_dir = os.path.join(self.sub_dir_2, 'cgi-bin') os.mkdir(self.cgi_dir) os.mkdir(self.cgi_child_dir) + os.mkdir(self.sub_dir_1) + os.mkdir(self.sub_dir_2) + os.mkdir(self.cgi_dir_in_sub_dir) self.nocgi_path = None self.file1_path = None self.file2_path = None self.file3_path = None self.file4_path = None + self.file5_path = None # The shebang line should be pure ASCII: use symlink if possible. # See issue #7668. @@ -651,6 +659,11 @@ class CGIHTTPServerTestCase(BaseTestCase): file4.write(cgi_file4 % (self.pythonexe, 'QUERY_STRING')) os.chmod(self.file4_path, 0o777) + self.file5_path = os.path.join(self.cgi_dir_in_sub_dir, 'file5.py') + with open(self.file5_path, 'w', encoding='utf-8') as file5: + file5.write(cgi_file1 % self.pythonexe) + os.chmod(self.file5_path, 0o777) + os.chdir(self.parent_dir) def tearDown(self): @@ -668,8 +681,13 @@ class CGIHTTPServerTestCase(BaseTestCase): os.remove(self.file3_path) if self.file4_path: os.remove(self.file4_path) + if self.file5_path: + os.remove(self.file5_path) os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) + os.rmdir(self.cgi_dir_in_sub_dir) + os.rmdir(self.sub_dir_2) + os.rmdir(self.sub_dir_1) os.rmdir(self.parent_dir) finally: BaseTestCase.tearDown(self) @@ -788,12 +806,23 @@ class CGIHTTPServerTestCase(BaseTestCase): 'text/html', HTTPStatus.OK), (res.read(), res.getheader('Content-type'), res.status)) + def test_cgi_path_in_sub_directories(self): + try: + CGIHTTPRequestHandler.cgi_directories.append('/sub/dir/cgi-bin') + res = self.request('/sub/dir/cgi-bin/file5.py') + self.assertEqual( + (b'Hello World' + self.linesep, 'text/html', HTTPStatus.OK), + (res.read(), res.getheader('Content-type'), res.status)) + finally: + CGIHTTPRequestHandler.cgi_directories.remove('/sub/dir/cgi-bin') + + class SocketlessRequestHandler(SimpleHTTPRequestHandler): - def __init__(self, *args, **kwargs): + def __init__(self, directory=None): request = mock.Mock() request.makefile.return_value = BytesIO() - super().__init__(request, None, None) + super().__init__(request, None, None, directory=directory) self.get_called = False self.protocol_version = "HTTP/1.1" @@ -1068,41 +1097,91 @@ class BaseHTTPRequestHandlerTestCase(unittest.TestCase): class SimpleHTTPRequestHandlerTestCase(unittest.TestCase): """ Test url parsing """ def setUp(self): - self.translated = os.getcwd() - self.translated = os.path.join(self.translated, 'filename') - self.handler = SocketlessRequestHandler() + self.translated_1 = os.path.join(os.getcwd(), 'filename') + self.translated_2 = os.path.join('foo', 'filename') + self.translated_3 = os.path.join('bar', 'filename') + self.handler_1 = SocketlessRequestHandler() + self.handler_2 = SocketlessRequestHandler(directory='foo') + self.handler_3 = SocketlessRequestHandler(directory=pathlib.PurePath('bar')) def test_query_arguments(self): - path = self.handler.translate_path('/filename') - self.assertEqual(path, self.translated) - path = self.handler.translate_path('/filename?foo=bar') - self.assertEqual(path, self.translated) - path = self.handler.translate_path('/filename?a=b&spam=eggs#zot') - self.assertEqual(path, self.translated) + path = self.handler_1.translate_path('/filename') + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('/filename') + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('/filename') + self.assertEqual(path, self.translated_3) + + path = self.handler_1.translate_path('/filename?foo=bar') + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('/filename?foo=bar') + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('/filename?foo=bar') + self.assertEqual(path, self.translated_3) + + path = self.handler_1.translate_path('/filename?a=b&spam=eggs#zot') + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('/filename?a=b&spam=eggs#zot') + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('/filename?a=b&spam=eggs#zot') + self.assertEqual(path, self.translated_3) def test_start_with_double_slash(self): - path = self.handler.translate_path('//filename') - self.assertEqual(path, self.translated) - path = self.handler.translate_path('//filename?foo=bar') - self.assertEqual(path, self.translated) + path = self.handler_1.translate_path('//filename') + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('//filename') + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('//filename') + self.assertEqual(path, self.translated_3) + + path = self.handler_1.translate_path('//filename?foo=bar') + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('//filename?foo=bar') + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('//filename?foo=bar') + self.assertEqual(path, self.translated_3) def test_windows_colon(self): with support.swap_attr(server.os, 'path', ntpath): - path = self.handler.translate_path('c:c:c:foo/filename') + path = self.handler_1.translate_path('c:c:c:foo/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('c:c:c:foo/filename') path = path.replace(ntpath.sep, os.sep) - self.assertEqual(path, self.translated) + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('c:c:c:foo/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_3) - path = self.handler.translate_path('\\c:../filename') + path = self.handler_1.translate_path('\\c:../filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('\\c:../filename') path = path.replace(ntpath.sep, os.sep) - self.assertEqual(path, self.translated) + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('\\c:../filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_3) - path = self.handler.translate_path('c:\\c:..\\foo/filename') + path = self.handler_1.translate_path('c:\\c:..\\foo/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('c:\\c:..\\foo/filename') path = path.replace(ntpath.sep, os.sep) - self.assertEqual(path, self.translated) + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('c:\\c:..\\foo/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_3) - path = self.handler.translate_path('c:c:foo\\c:c:bar/filename') + path = self.handler_1.translate_path('c:c:foo\\c:c:bar/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('c:c:foo\\c:c:bar/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('c:c:foo\\c:c:bar/filename') path = path.replace(ntpath.sep, os.sep) - self.assertEqual(path, self.translated) + self.assertEqual(path, self.translated_3) class MiscTestCase(unittest.TestCase): diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index 06ea86b5..914a75a6 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -1,4 +1,5 @@ from test import support +from test.support import socket_helper from contextlib import contextmanager import imaplib @@ -9,9 +10,9 @@ import calendar import threading import socket -from test.support import (reap_threads, verbose, transient_internet, - run_with_tz, run_with_locale, cpython_only, - requires_hashdigest) +from test.support import (reap_threads, verbose, + run_with_tz, run_with_locale, cpython_only) +from test.support import hashlib_helper import unittest from unittest import mock from datetime import datetime, timezone, timedelta @@ -82,7 +83,7 @@ class TestImaplib(unittest.TestCase): pass # This is the exception that should be raised. - expected_errnos = support.get_socket_conn_refused_errs() + expected_errnos = socket_helper.get_socket_conn_refused_errs() with self.assertRaises(OSError) as cm: imaplib.IMAP4() self.assertIn(cm.exception.errno, expected_errnos) @@ -109,12 +110,13 @@ else: class SimpleIMAPHandler(socketserver.StreamRequestHandler): - timeout = 1 + timeout = support.LOOPBACK_TIMEOUT continuation = None capabilities = '' def setup(self): super().setup() + self.server.is_selected = False self.server.logged = None def _send(self, message): @@ -189,6 +191,18 @@ class SimpleIMAPHandler(socketserver.StreamRequestHandler): self.server.logged = args[0] self._send_tagged(tag, 'OK', 'LOGIN completed') + def cmd_SELECT(self, tag, args): + self.server.is_selected = True + self._send_line(b'* 2 EXISTS') + self._send_tagged(tag, 'OK', '[READ-WRITE] SELECT completed.') + + def cmd_UNSELECT(self, tag, args): + if self.server.is_selected: + self.server.is_selected = False + self._send_tagged(tag, 'OK', 'Returned to authenticated state. (Success)') + else: + self._send_tagged(tag, 'BAD', 'No mailbox selected') + class NewIMAPTestsMixin(): client = None @@ -210,7 +224,7 @@ class NewIMAPTestsMixin(): raise self.addCleanup(self._cleanup) - self.server = self.server_class((support.HOST, 0), imap_handler) + self.server = self.server_class((socket_helper.HOST, 0), imap_handler) self.thread = threading.Thread( name=self._testMethodName+'-server', target=self.server.serve_forever, @@ -238,7 +252,7 @@ class NewIMAPTestsMixin(): # cleanup the server self.server.shutdown() self.server.server_close() - support.join_thread(self.thread, 3.0) + support.join_thread(self.thread) # Explicitly clear the attribute to prevent dangling thread self.thread = None @@ -371,7 +385,7 @@ class NewIMAPTestsMixin(): self.assertEqual(code, 'OK') self.assertEqual(server.response, b'ZmFrZQ==\r\n') # b64 encoded 'fake' - @requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def test_login_cram_md5_bytes(self): class AuthHandler(SimpleIMAPHandler): capabilities = 'LOGINDISABLED AUTH=CRAM-MD5' @@ -389,7 +403,7 @@ class NewIMAPTestsMixin(): ret, _ = client.login_cram_md5("tim", b"tanstaaftanstaaf") self.assertEqual(ret, "OK") - @requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def test_login_cram_md5_plain_text(self): class AuthHandler(SimpleIMAPHandler): capabilities = 'LOGINDISABLED AUTH=CRAM-MD5' @@ -440,6 +454,29 @@ class NewIMAPTestsMixin(): with self.imap_class(*server.server_address): pass + def test_imaplib_timeout_test(self): + _, server = self._setup(SimpleIMAPHandler) + addr = server.server_address[1] + client = self.imap_class("localhost", addr, timeout=None) + self.assertEqual(client.sock.timeout, None) + client.shutdown() + client = self.imap_class("localhost", addr, timeout=support.LOOPBACK_TIMEOUT) + self.assertEqual(client.sock.timeout, support.LOOPBACK_TIMEOUT) + client.shutdown() + with self.assertRaises(ValueError): + client = self.imap_class("localhost", addr, timeout=0) + + def test_imaplib_timeout_functionality_test(self): + class TimeoutHandler(SimpleIMAPHandler): + def handle(self): + time.sleep(1) + SimpleIMAPHandler.handle(self) + + _, server = self._setup(TimeoutHandler) + addr = server.server_address[1] + with self.assertRaises(socket.timeout): + client = self.imap_class("localhost", addr, timeout=0.001) + def test_with_statement(self): _, server = self._setup(SimpleIMAPHandler, connect=False) with self.imap_class(*server.server_address) as imap: @@ -487,6 +524,18 @@ class NewIMAPTestsMixin(): self.assertEqual(typ, 'OK') self.assertEqual(data[0], b'() "." directoryA') + def test_unselect(self): + client, _ = self._setup(SimpleIMAPHandler) + client.login('user', 'pass') + typ, data = client.select() + self.assertEqual(typ, 'OK') + self.assertEqual(data[0], b'2') + + typ, data = client.unselect() + self.assertEqual(typ, 'OK') + self.assertEqual(data[0], b'Returned to authenticated state. (Success)') + self.assertEqual(client.state, 'AUTH') + class NewIMAPTests(NewIMAPTestsMixin, unittest.TestCase): imap_class = imaplib.IMAP4 @@ -577,7 +626,7 @@ class ThreadedNetworkedTests(unittest.TestCase): @contextmanager def reaped_server(self, hdlr): - server, thread = self.make_server((support.HOST, 0), hdlr) + server, thread = self.make_server((socket_helper.HOST, 0), hdlr) try: yield server finally: @@ -800,7 +849,7 @@ class ThreadedNetworkedTests(unittest.TestCase): b'ZmFrZQ==\r\n') # b64 encoded 'fake' @reap_threads - @requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def test_login_cram_md5(self): class AuthHandler(SimpleIMAPHandler): @@ -920,16 +969,16 @@ class RemoteIMAPTest(unittest.TestCase): imap_class = imaplib.IMAP4 def setUp(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): self.server = self.imap_class(self.host, self.port) def tearDown(self): if self.server is not None: - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): self.server.logout() def test_logincapa(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): for cap in self.server.capabilities: self.assertIsInstance(cap, str) self.assertIn('LOGINDISABLED', self.server.capabilities) @@ -938,7 +987,7 @@ class RemoteIMAPTest(unittest.TestCase): self.assertEqual(rs[0], 'OK') def test_logout(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): rs = self.server.logout() self.server = None self.assertEqual(rs[0], 'BYE', rs) @@ -952,7 +1001,7 @@ class RemoteIMAP_STARTTLSTest(RemoteIMAPTest): def setUp(self): super().setUp() - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): rs = self.server.starttls() self.assertEqual(rs[0], 'OK') @@ -993,24 +1042,24 @@ class RemoteIMAP_SSLTest(RemoteIMAPTest): server.logout() def test_logincapa(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): _server = self.imap_class(self.host, self.port) self.check_logincapa(_server) def test_logout(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): _server = self.imap_class(self.host, self.port) rs = _server.logout() self.assertEqual(rs[0], 'BYE', rs) def test_ssl_context_certfile_exclusive(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): self.assertRaises( ValueError, self.imap_class, self.host, self.port, certfile=CERTFILE, ssl_context=self.create_ssl_context()) def test_ssl_context_keyfile_exclusive(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): self.assertRaises( ValueError, self.imap_class, self.host, self.port, keyfile=CERTFILE, ssl_context=self.create_ssl_context()) diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 52f04916..d1dafbe0 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -1,24 +1,22 @@ -# We import importlib *ASAP* in order to test #15386 -import importlib +import builtins +import contextlib +import errno +import glob import importlib.util from importlib._bootstrap_external import _get_sourcefile -import builtins import marshal import os import py_compile import random import shutil -import subprocess import stat +import subprocess import sys +import textwrap import threading import time import unittest -import unittest.mock as mock -import textwrap -import errno -import contextlib -import glob +from unittest import mock import test.support from test.support import ( @@ -28,6 +26,7 @@ from test.support import ( temp_dir, DirsOnSysPath) from test.support import script_helper from test.test_importlib.util import uncache +from types import ModuleType skip_if_dont_write_bytecode = unittest.skipIf( @@ -437,16 +436,24 @@ class ImportTests(unittest.TestCase): os.does_not_exist def test_concurrency(self): + # bpo 38091: this is a hack to slow down the code that calls + # has_deadlock(); the logic was itself sometimes deadlocking. + def delay_has_deadlock(frame, event, arg): + if event == 'call' and frame.f_code.co_name == 'has_deadlock': + time.sleep(0.1) + sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'data')) try: exc = None def run(): + sys.settrace(delay_has_deadlock) event.wait() try: import package except BaseException as e: nonlocal exc exc = e + sys.settrace(None) for i in range(10): event = threading.Event() @@ -1341,6 +1348,19 @@ class CircularImportTests(unittest.TestCase): str(cm.exception), ) + def test_unwritable_module(self): + self.addCleanup(unload, "test.test_import.data.unwritable") + self.addCleanup(unload, "test.test_import.data.unwritable.x") + + import test.test_import.data.unwritable as unwritable + with self.assertWarns(ImportWarning): + from test.test_import.data.unwritable import x + + self.assertNotEqual(type(unwritable), ModuleType) + self.assertEqual(type(x), ModuleType) + with self.assertRaises(AttributeError): + unwritable.x = 42 + if __name__ == '__main__': # Test needs to be a package, so we can do relative imports. diff --git a/Lib/test/test_import/data/unwritable/__init__.py b/Lib/test/test_import/data/unwritable/__init__.py new file mode 100644 index 00000000..da4ddb3d --- /dev/null +++ b/Lib/test/test_import/data/unwritable/__init__.py @@ -0,0 +1,12 @@ +import sys + +class MyMod(object): + __slots__ = ['__builtins__', '__cached__', '__doc__', + '__file__', '__loader__', '__name__', + '__package__', '__path__', '__spec__'] + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, globals()[attr]) + + +sys.modules[__name__] = MyMod() diff --git a/Lib/test/test_import/data/unwritable/x.py b/Lib/test/test_import/data/unwritable/x.py new file mode 100644 index 00000000..e69de29b diff --git a/Lib/test/test_importlib/extension/test_case_sensitivity.py b/Lib/test/test_importlib/extension/test_case_sensitivity.py index 0dd9c861..3a857847 100644 --- a/Lib/test/test_importlib/extension/test_case_sensitivity.py +++ b/Lib/test/test_importlib/extension/test_case_sensitivity.py @@ -1,7 +1,7 @@ from importlib import _bootstrap_external from test import support import unittest - +import sys from .. import util importlib = util.import_importlib('importlib') @@ -21,6 +21,7 @@ class ExtensionModuleCaseSensitivityTest(util.CASEOKTestBase): self.machinery.EXTENSION_SUFFIXES)) return finder.find_module(bad_name) + @unittest.skipIf(sys.flags.ignore_environment, 'ignore_environment flag was set') def test_case_sensitive(self): with support.EnvironmentVarGuard() as env: env.unset('PYTHONCASEOK') @@ -28,6 +29,7 @@ class ExtensionModuleCaseSensitivityTest(util.CASEOKTestBase): loader = self.find_module() self.assertIsNone(loader) + @unittest.skipIf(sys.flags.ignore_environment, 'ignore_environment flag was set') def test_case_insensitivity(self): with support.EnvironmentVarGuard() as env: env.set('PYTHONCASEOK', '1') diff --git a/Lib/test/test_importlib/extension/test_loader.py b/Lib/test/test_importlib/extension/test_loader.py index 9ad05fad..abd612fc 100644 --- a/Lib/test/test_importlib/extension/test_loader.py +++ b/Lib/test/test_importlib/extension/test_loader.py @@ -267,29 +267,6 @@ class MultiPhaseExtensionModuleTests(abc.LoaderTests): self.assertEqual(module.__name__, name) self.assertEqual(module.__doc__, "Module named in %s" % lang) - @unittest.skipIf(not hasattr(sys, 'gettotalrefcount'), - '--with-pydebug has to be enabled for this test') - def test_bad_traverse(self): - ''' Issue #32374: Test that traverse fails when accessing per-module - state before Py_mod_exec was executed. - (Multiphase initialization modules only) - ''' - script = """if True: - try: - from test import support - import importlib.util as util - spec = util.find_spec('_testmultiphase') - spec.name = '_testmultiphase_with_bad_traverse' - - with support.SuppressCrashReport(): - m = spec.loader.create_module(spec) - except: - # Prevent Python-level exceptions from - # ending the process with non-zero status - # (We are testing for a crash in C-code) - pass""" - assert_python_failure("-c", script) - (Frozen_MultiPhaseExtensionModuleTests, Source_MultiPhaseExtensionModuleTests diff --git a/Lib/test/test_importlib/fixtures.py b/Lib/test/test_importlib/fixtures.py index d923cec2..2e55d14b 100644 --- a/Lib/test/test_importlib/fixtures.py +++ b/Lib/test/test_importlib/fixtures.py @@ -161,6 +161,21 @@ class EggInfoFile(OnSysPath, SiteDir): build_files(EggInfoFile.files, prefix=self.site_dir) +class LocalPackage: + files = { + "setup.py": """ + import setuptools + setuptools.setup(name="local-pkg", version="2.0.1") + """, + } + + def setUp(self): + self.fixtures = contextlib.ExitStack() + self.addCleanup(self.fixtures.close) + self.fixtures.enter_context(tempdir_as_cwd()) + build_files(self.files) + + def build_files(file_defs, prefix=pathlib.Path()): """Build a set of files/directories, as described by the @@ -195,6 +210,17 @@ def build_files(file_defs, prefix=pathlib.Path()): f.write(DALS(contents)) +class FileBuilder: + def unicode_filename(self): + try: + import test.support + except ImportError: + # outside CPython, hard-code a unicode snowman + return '☃' + return test.support.FS_NONASCII or \ + self.skip("File system does not support non-ascii.") + + def DALS(str): "Dedent and left-strip" return textwrap.dedent(str).lstrip() diff --git a/Lib/test/test_importlib/import_/test_relative_imports.py b/Lib/test/test_importlib/import_/test_relative_imports.py index 8a95a321..41aa1826 100644 --- a/Lib/test/test_importlib/import_/test_relative_imports.py +++ b/Lib/test/test_importlib/import_/test_relative_imports.py @@ -133,6 +133,7 @@ class RelativeImports: self.assertEqual(module.__name__, 'pkg') self.assertTrue(hasattr(module, 'subpkg2')) self.assertEqual(module.subpkg2.attr, 'pkg.subpkg2.__init__') + self.relative_import_test(create, globals_, callback) def test_deep_import(self): # [deep import] @@ -156,7 +157,7 @@ class RelativeImports: {'__name__': 'pkg', '__path__': ['blah']}) def callback(global_): self.__import__('pkg') - with self.assertRaises(ValueError): + with self.assertRaises(ImportError): self.__import__('', global_, fromlist=['top_level'], level=2) self.relative_import_test(create, globals_, callback) @@ -167,7 +168,7 @@ class RelativeImports: globals_ = {'__package__': 'pkg'}, {'__name__': 'pkg.module'} def callback(global_): self.__import__('pkg') - with self.assertRaises(ValueError): + with self.assertRaises(ImportError): self.__import__('', global_, fromlist=['top_level'], level=2) self.relative_import_test(create, globals_, callback) diff --git a/Lib/test/test_importlib/source/test_case_sensitivity.py b/Lib/test/test_importlib/source/test_case_sensitivity.py index 12ce0cb9..ad1cfdb7 100644 --- a/Lib/test/test_importlib/source/test_case_sensitivity.py +++ b/Lib/test/test_importlib/source/test_case_sensitivity.py @@ -1,4 +1,6 @@ """Test case-sensitivity (PEP 235).""" +import sys + from .. import util importlib = util.import_importlib('importlib') @@ -38,6 +40,7 @@ class CaseSensitivityTest(util.CASEOKTestBase): insensitive_finder = self.finder(insensitive_path) return self.find(sensitive_finder), self.find(insensitive_finder) + @unittest.skipIf(sys.flags.ignore_environment, 'ignore_environment flag was set') def test_sensitive(self): with test_support.EnvironmentVarGuard() as env: env.unset('PYTHONCASEOK') @@ -47,6 +50,7 @@ class CaseSensitivityTest(util.CASEOKTestBase): self.assertIn(self.name, sensitive.get_filename(self.name)) self.assertIsNone(insensitive) + @unittest.skipIf(sys.flags.ignore_environment, 'ignore_environment flag was set') def test_insensitive(self): with test_support.EnvironmentVarGuard() as env: env.set('PYTHONCASEOK', '1') diff --git a/Lib/test/test_importlib/test_abc.py b/Lib/test/test_importlib/test_abc.py index 05608bbb..9816b35e 100644 --- a/Lib/test/test_importlib/test_abc.py +++ b/Lib/test/test_importlib/test_abc.py @@ -357,13 +357,27 @@ class MetaPathFinderFindModuleTests: return MetaPathSpecFinder() - def test_no_spec(self): + def test_find_module(self): finder = self.finder(None) path = ['a', 'b', 'c'] name = 'blah' with self.assertWarns(DeprecationWarning): found = finder.find_module(name, path) self.assertIsNone(found) + + def test_find_spec_with_explicit_target(self): + loader = object() + spec = self.util.spec_from_loader('blah', loader) + finder = self.finder(spec) + found = finder.find_spec('blah', 'blah', None) + self.assertEqual(found, spec) + + def test_no_spec(self): + finder = self.finder(None) + path = ['a', 'b', 'c'] + name = 'blah' + found = finder.find_spec(name, path, None) + self.assertIsNone(found) self.assertEqual(name, finder.called_for[0]) self.assertEqual(path, finder.called_for[1]) @@ -371,9 +385,8 @@ class MetaPathFinderFindModuleTests: loader = object() spec = self.util.spec_from_loader('blah', loader) finder = self.finder(spec) - with self.assertWarns(DeprecationWarning): - found = finder.find_module('blah', None) - self.assertIs(found, spec.loader) + found = finder.find_spec('blah', None) + self.assertIs(found, spec) (Frozen_MPFFindModuleTests, diff --git a/Lib/test/test_importlib/test_files.py b/Lib/test/test_importlib/test_files.py new file mode 100644 index 00000000..fa7af82b --- /dev/null +++ b/Lib/test/test_importlib/test_files.py @@ -0,0 +1,39 @@ +import typing +import unittest + +from importlib import resources +from importlib.abc import Traversable +from . import data01 +from . import util + + +class FilesTests: + def test_read_bytes(self): + files = resources.files(self.data) + actual = files.joinpath('utf-8.file').read_bytes() + assert actual == b'Hello, UTF-8 world!\n' + + def test_read_text(self): + files = resources.files(self.data) + actual = files.joinpath('utf-8.file').read_text() + assert actual == 'Hello, UTF-8 world!\n' + + @unittest.skipUnless( + hasattr(typing, 'runtime_checkable'), + "Only suitable when typing supports runtime_checkable", + ) + def test_traversable(self): + assert isinstance(resources.files(self.data), Traversable) + + +class OpenDiskTests(FilesTests, unittest.TestCase): + def setUp(self): + self.data = data01 + + +class OpenZipTests(FilesTests, util.ZipSetup, unittest.TestCase): + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py index 42a79992..91e501a2 100644 --- a/Lib/test/test_importlib/test_main.py +++ b/Lib/test/test_importlib/test_main.py @@ -246,3 +246,24 @@ class TestEntryPoints(unittest.TestCase): """ with self.assertRaises(Exception): json.dumps(self.ep) + + def test_module(self): + assert self.ep.module == 'value' + + def test_attr(self): + assert self.ep.attr is None + + +class FileSystem( + fixtures.OnSysPath, fixtures.SiteDir, fixtures.FileBuilder, + unittest.TestCase): + def test_unicode_dir_on_sys_path(self): + """ + Ensure a Unicode subdirectory of a directory on sys.path + does not crash. + """ + fixtures.build_files( + {self.unicode_filename(): {}}, + prefix=self.site_dir, + ) + list(distributions()) diff --git a/Lib/test/test_importlib/test_path.py b/Lib/test/test_importlib/test_path.py index 2d3dcda7..c4e72854 100644 --- a/Lib/test/test_importlib/test_path.py +++ b/Lib/test/test_importlib/test_path.py @@ -17,6 +17,7 @@ class PathTests: # Test also implicitly verifies the returned object is a pathlib.Path # instance. with resources.path(self.data, 'utf-8.file') as path: + self.assertTrue(path.name.endswith("utf-8.file"), repr(path)) # pathlib.Path.read_text() was introduced in Python 3.5. with path.open('r', encoding='utf-8') as file: text = file.read() diff --git a/Lib/test/test_importlib/test_pkg_import.py b/Lib/test/test_importlib/test_pkg_import.py new file mode 100644 index 00000000..6181dcfa --- /dev/null +++ b/Lib/test/test_importlib/test_pkg_import.py @@ -0,0 +1,80 @@ +import os +import sys +import shutil +import string +import random +import tempfile +import unittest + +from importlib.util import cache_from_source +from test.support import create_empty_file + +class TestImport(unittest.TestCase): + + def __init__(self, *args, **kw): + self.package_name = 'PACKAGE_' + while self.package_name in sys.modules: + self.package_name += random.choice(string.ascii_letters) + self.module_name = self.package_name + '.foo' + unittest.TestCase.__init__(self, *args, **kw) + + def remove_modules(self): + for module_name in (self.package_name, self.module_name): + if module_name in sys.modules: + del sys.modules[module_name] + + def setUp(self): + self.test_dir = tempfile.mkdtemp() + sys.path.append(self.test_dir) + self.package_dir = os.path.join(self.test_dir, + self.package_name) + os.mkdir(self.package_dir) + create_empty_file(os.path.join(self.package_dir, '__init__.py')) + self.module_path = os.path.join(self.package_dir, 'foo.py') + + def tearDown(self): + shutil.rmtree(self.test_dir) + self.assertNotEqual(sys.path.count(self.test_dir), 0) + sys.path.remove(self.test_dir) + self.remove_modules() + + def rewrite_file(self, contents): + compiled_path = cache_from_source(self.module_path) + if os.path.exists(compiled_path): + os.remove(compiled_path) + with open(self.module_path, 'w') as f: + f.write(contents) + + def test_package_import__semantics(self): + + # Generate a couple of broken modules to try importing. + + # ...try loading the module when there's a SyntaxError + self.rewrite_file('for') + try: __import__(self.module_name) + except SyntaxError: pass + else: raise RuntimeError('Failed to induce SyntaxError') # self.fail()? + self.assertNotIn(self.module_name, sys.modules) + self.assertFalse(hasattr(sys.modules[self.package_name], 'foo')) + + # ...make up a variable name that isn't bound in __builtins__ + var = 'a' + while var in dir(__builtins__): + var += random.choice(string.ascii_letters) + + # ...make a module that just contains that + self.rewrite_file(var) + + try: __import__(self.module_name) + except NameError: pass + else: raise RuntimeError('Failed to induce NameError.') + + # ...now change the module so that the NameError doesn't + # happen + self.rewrite_file('%s = 1' % var) + module = __import__(self.module_name).foo + self.assertEqual(getattr(module, var), 1) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_importlib/test_threaded_import.py b/Lib/test/test_importlib/test_threaded_import.py new file mode 100644 index 00000000..d1f64c70 --- /dev/null +++ b/Lib/test/test_importlib/test_threaded_import.py @@ -0,0 +1,263 @@ +# This is a variant of the very old (early 90's) file +# Demo/threads/bug.py. It simply provokes a number of threads into +# trying to import the same module "at the same time". +# There are no pleasant failure modes -- most likely is that Python +# complains several times about module random having no attribute +# randrange, and then Python hangs. + +import _imp as imp +import os +import importlib +import sys +import time +import shutil +import threading +import unittest +from unittest import mock +from test.support import ( + verbose, run_unittest, TESTFN, reap_threads, + forget, unlink, rmtree, start_threads) + +def task(N, done, done_tasks, errors): + try: + # We don't use modulefinder but still import it in order to stress + # importing of different modules from several threads. + if len(done_tasks) % 2: + import modulefinder + import random + else: + import random + import modulefinder + # This will fail if random is not completely initialized + x = random.randrange(1, 3) + except Exception as e: + errors.append(e.with_traceback(None)) + finally: + done_tasks.append(threading.get_ident()) + finished = len(done_tasks) == N + if finished: + done.set() + +def mock_register_at_fork(func): + # bpo-30599: Mock os.register_at_fork() when importing the random module, + # since this function doesn't allow to unregister callbacks and would leak + # memory. + return mock.patch('os.register_at_fork', create=True)(func) + +# Create a circular import structure: A -> C -> B -> D -> A +# NOTE: `time` is already loaded and therefore doesn't threaten to deadlock. + +circular_imports_modules = { + 'A': """if 1: + import time + time.sleep(%(delay)s) + x = 'a' + import C + """, + 'B': """if 1: + import time + time.sleep(%(delay)s) + x = 'b' + import D + """, + 'C': """import B""", + 'D': """import A""", +} + +class Finder: + """A dummy finder to detect concurrent access to its find_spec() + method.""" + + def __init__(self): + self.numcalls = 0 + self.x = 0 + self.lock = threading.Lock() + + def find_spec(self, name, path=None, target=None): + # Simulate some thread-unsafe behaviour. If calls to find_spec() + # are properly serialized, `x` will end up the same as `numcalls`. + # Otherwise not. + assert imp.lock_held() + with self.lock: + self.numcalls += 1 + x = self.x + time.sleep(0.01) + self.x = x + 1 + +class FlushingFinder: + """A dummy finder which flushes sys.path_importer_cache when it gets + called.""" + + def find_spec(self, name, path=None, target=None): + sys.path_importer_cache.clear() + + +class ThreadedImportTests(unittest.TestCase): + + def setUp(self): + self.old_random = sys.modules.pop('random', None) + + def tearDown(self): + # If the `random` module was already initialized, we restore the + # old module at the end so that pickling tests don't fail. + # See http://bugs.python.org/issue3657#msg110461 + if self.old_random is not None: + sys.modules['random'] = self.old_random + + @mock_register_at_fork + def check_parallel_module_init(self, mock_os): + if imp.lock_held(): + # This triggers on, e.g., from test import autotest. + raise unittest.SkipTest("can't run when import lock is held") + + done = threading.Event() + for N in (20, 50) * 3: + if verbose: + print("Trying", N, "threads ...", end=' ') + # Make sure that random and modulefinder get reimported freshly + for modname in ['random', 'modulefinder']: + try: + del sys.modules[modname] + except KeyError: + pass + errors = [] + done_tasks = [] + done.clear() + t0 = time.monotonic() + with start_threads(threading.Thread(target=task, + args=(N, done, done_tasks, errors,)) + for i in range(N)): + pass + completed = done.wait(10 * 60) + dt = time.monotonic() - t0 + if verbose: + print("%.1f ms" % (dt*1e3), flush=True, end=" ") + dbg_info = 'done: %s/%s' % (len(done_tasks), N) + self.assertFalse(errors, dbg_info) + self.assertTrue(completed, dbg_info) + if verbose: + print("OK.") + + def test_parallel_module_init(self): + self.check_parallel_module_init() + + def test_parallel_meta_path(self): + finder = Finder() + sys.meta_path.insert(0, finder) + try: + self.check_parallel_module_init() + self.assertGreater(finder.numcalls, 0) + self.assertEqual(finder.x, finder.numcalls) + finally: + sys.meta_path.remove(finder) + + def test_parallel_path_hooks(self): + # Here the Finder instance is only used to check concurrent calls + # to path_hook(). + finder = Finder() + # In order for our path hook to be called at each import, we need + # to flush the path_importer_cache, which we do by registering a + # dedicated meta_path entry. + flushing_finder = FlushingFinder() + def path_hook(path): + finder.find_spec('') + raise ImportError + sys.path_hooks.insert(0, path_hook) + sys.meta_path.append(flushing_finder) + try: + # Flush the cache a first time + flushing_finder.find_spec('') + numtests = self.check_parallel_module_init() + self.assertGreater(finder.numcalls, 0) + self.assertEqual(finder.x, finder.numcalls) + finally: + sys.meta_path.remove(flushing_finder) + sys.path_hooks.remove(path_hook) + + def test_import_hangers(self): + # In case this test is run again, make sure the helper module + # gets loaded from scratch again. + try: + del sys.modules['test.test_importlib.threaded_import_hangers'] + except KeyError: + pass + import test.test_importlib.threaded_import_hangers + self.assertFalse(test.test_importlib.threaded_import_hangers.errors) + + def test_circular_imports(self): + # The goal of this test is to exercise implementations of the import + # lock which use a per-module lock, rather than a global lock. + # In these implementations, there is a possible deadlock with + # circular imports, for example: + # - thread 1 imports A (grabbing the lock for A) which imports B + # - thread 2 imports B (grabbing the lock for B) which imports A + # Such implementations should be able to detect such situations and + # resolve them one way or the other, without freezing. + # NOTE: our test constructs a slightly less trivial import cycle, + # in order to better stress the deadlock avoidance mechanism. + delay = 0.5 + os.mkdir(TESTFN) + self.addCleanup(shutil.rmtree, TESTFN) + sys.path.insert(0, TESTFN) + self.addCleanup(sys.path.remove, TESTFN) + for name, contents in circular_imports_modules.items(): + contents = contents % {'delay': delay} + with open(os.path.join(TESTFN, name + ".py"), "wb") as f: + f.write(contents.encode('utf-8')) + self.addCleanup(forget, name) + + importlib.invalidate_caches() + results = [] + def import_ab(): + import A + results.append(getattr(A, 'x', None)) + def import_ba(): + import B + results.append(getattr(B, 'x', None)) + t1 = threading.Thread(target=import_ab) + t2 = threading.Thread(target=import_ba) + t1.start() + t2.start() + t1.join() + t2.join() + self.assertEqual(set(results), {'a', 'b'}) + + @mock_register_at_fork + def test_side_effect_import(self, mock_os): + code = """if 1: + import threading + def target(): + import random + t = threading.Thread(target=target) + t.start() + t.join() + t = None""" + sys.path.insert(0, os.curdir) + self.addCleanup(sys.path.remove, os.curdir) + filename = TESTFN + ".py" + with open(filename, "wb") as f: + f.write(code.encode('utf-8')) + self.addCleanup(unlink, filename) + self.addCleanup(forget, TESTFN) + self.addCleanup(rmtree, '__pycache__') + importlib.invalidate_caches() + __import__(TESTFN) + del sys.modules[TESTFN] + + +@reap_threads +def test_main(): + old_switchinterval = None + try: + old_switchinterval = sys.getswitchinterval() + sys.setswitchinterval(1e-5) + except AttributeError: + pass + try: + run_unittest(ThreadedImportTests) + finally: + if old_switchinterval is not None: + sys.setswitchinterval(old_switchinterval) + +if __name__ == "__main__": + test_main() diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py index 58faab46..d6c10ed3 100644 --- a/Lib/test/test_importlib/test_util.py +++ b/Lib/test/test_importlib/test_util.py @@ -375,7 +375,7 @@ class ResolveNameTests: def test_no_package(self): # .bacon in '' - with self.assertRaises(ValueError): + with self.assertRaises(ImportError): self.util.resolve_name('.bacon', '') def test_in_package(self): @@ -390,7 +390,7 @@ class ResolveNameTests: def test_escape(self): # ..bacon in spam - with self.assertRaises(ValueError): + with self.assertRaises(ImportError): self.util.resolve_name('..bacon', 'spam') @@ -518,7 +518,7 @@ class FindSpecTests: with util.temp_module(name, pkg=True) as pkg_dir: fullname, _ = util.submodule(name, subname, pkg_dir) relname = '.' + subname - with self.assertRaises(ValueError): + with self.assertRaises(ImportError): self.util.find_spec(relname) self.assertNotIn(name, sorted(sys.modules)) self.assertNotIn(fullname, sorted(sys.modules)) @@ -861,7 +861,7 @@ class MagicNumberTests(unittest.TestCase): in advance. Such exceptional releases will then require an adjustment to this test case. """ - EXPECTED_MAGIC_NUMBER = 3413 + EXPECTED_MAGIC_NUMBER = 3425 actual = int.from_bytes(importlib.util.MAGIC_NUMBER[:2], 'little') msg = ( diff --git a/Lib/test/test_importlib/test_zip.py b/Lib/test/test_importlib/test_zip.py index 9568c226..a5399c16 100644 --- a/Lib/test/test_importlib/test_zip.py +++ b/Lib/test/test_importlib/test_zip.py @@ -3,23 +3,31 @@ import unittest from contextlib import ExitStack from importlib.metadata import ( - distribution, entry_points, files, PackageNotFoundError, version, + distribution, entry_points, files, PackageNotFoundError, + version, distributions, ) -from importlib.resources import path +from importlib import resources +from test.support import requires_zlib + +@requires_zlib() class TestZip(unittest.TestCase): root = 'test.test_importlib.data' + def _fixture_on_path(self, filename): + pkg_file = resources.files(self.root).joinpath(filename) + file = self.resources.enter_context(resources.as_file(pkg_file)) + assert file.name.startswith('example-'), file.name + sys.path.insert(0, str(file)) + self.resources.callback(sys.path.pop, 0) + def setUp(self): # Find the path to the example-*.whl so we can add it to the front of # sys.path, where we'll then try to find the metadata thereof. self.resources = ExitStack() self.addCleanup(self.resources.close) - wheel = self.resources.enter_context( - path(self.root, 'example-21.12-py3-none-any.whl')) - sys.path.insert(0, str(wheel)) - self.resources.callback(sys.path.pop, 0) + self._fixture_on_path('example-21.12-py3-none-any.whl') def test_zip_version(self): self.assertEqual(version('example'), '21.12') @@ -46,17 +54,19 @@ class TestZip(unittest.TestCase): path = str(file.dist.locate_file(file)) assert '.whl/' in path, path + def test_one_distribution(self): + dists = list(distributions(path=sys.path[:1])) + assert len(dists) == 1 + +@requires_zlib() class TestEgg(TestZip): def setUp(self): # Find the path to the example-*.egg so we can add it to the front of # sys.path, where we'll then try to find the metadata thereof. self.resources = ExitStack() self.addCleanup(self.resources.close) - egg = self.resources.enter_context( - path(self.root, 'example-21.12-py3.6.egg')) - sys.path.insert(0, str(egg)) - self.resources.callback(sys.path.pop, 0) + self._fixture_on_path('example-21.12-py3.6.egg') def test_files(self): for file in files('example'): diff --git a/Lib/test/test_importlib/threaded_import_hangers.py b/Lib/test/test_importlib/threaded_import_hangers.py new file mode 100644 index 00000000..5484e60a --- /dev/null +++ b/Lib/test/test_importlib/threaded_import_hangers.py @@ -0,0 +1,45 @@ +# This is a helper module for test_threaded_import. The test imports this +# module, and this module tries to run various Python library functions in +# their own thread, as a side effect of being imported. If the spawned +# thread doesn't complete in TIMEOUT seconds, an "appeared to hang" message +# is appended to the module-global `errors` list. That list remains empty +# if (and only if) all functions tested complete. + +TIMEOUT = 10 + +import threading + +import tempfile +import os.path + +errors = [] + +# This class merely runs a function in its own thread T. The thread importing +# this module holds the import lock, so if the function called by T tries +# to do its own imports it will block waiting for this module's import +# to complete. +class Worker(threading.Thread): + def __init__(self, function, args): + threading.Thread.__init__(self) + self.function = function + self.args = args + + def run(self): + self.function(*self.args) + +for name, func, args in [ + # Bug 147376: TemporaryFile hung on Windows, starting in Python 2.4. + ("tempfile.TemporaryFile", lambda: tempfile.TemporaryFile().close(), ()), + + # The real cause for bug 147376: ntpath.abspath() caused the hang. + ("os.path.abspath", os.path.abspath, ('.',)), + ]: + + try: + t = Worker(func, args) + t.start() + t.join(TIMEOUT) + if t.is_alive(): + errors.append("%s appeared to hang" % name) + finally: + del t diff --git a/Lib/test/test_importlib/util.py b/Lib/test/test_importlib/util.py index e6a14768..de6e0b02 100644 --- a/Lib/test/test_importlib/util.py +++ b/Lib/test/test_importlib/util.py @@ -119,7 +119,7 @@ def submodule(parent, name, pkg_dir, content=''): return '{}.{}'.format(parent, name), path -def _get_code_from_pyc(pyc_path): +def get_code_from_pyc(pyc_path): """Reads a pyc file and returns the unmarshalled code object within. No header validation is performed. @@ -499,7 +499,7 @@ class CommonResourceTests(abc.ABC): self.execute(data01, full_path) def test_relative_path(self): - # A reative path is a ValueError. + # A relative path is a ValueError. with self.assertRaises(ValueError): self.execute(data01, '../data01/utf-8.file') diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index ad93f304..e3e2be52 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -25,7 +25,7 @@ except ImportError: ThreadPoolExecutor = None from test.support import run_unittest, TESTFN, DirsOnSysPath, cpython_only -from test.support import MISSING_C_DOCSTRINGS, cpython_only +from test.support import MISSING_C_DOCSTRINGS, ALWAYS_EQ from test.support.script_helper import assert_python_ok, assert_python_failure from test import inspect_fodder as mod from test import inspect_fodder2 as mod2 @@ -118,10 +118,6 @@ def gen_coroutine_function_example(self): yield return 'spam' -class EqualsToAll: - def __eq__(self, other): - return True - class TestPredicates(IsTestBase): def test_excluding_predicates(self): @@ -468,6 +464,7 @@ class TestRetrievingSourceCode(GetSourceBase): def test_getcomments(self): self.assertEqual(inspect.getcomments(mod), '# line 1\n') self.assertEqual(inspect.getcomments(mod.StupidGit), '# line 20\n') + self.assertEqual(inspect.getcomments(mod2.cls160), '# line 159\n') # If the object source file is not available, return None. co = compile('x=1', '_non_existing_filename.py', 'exec') self.assertIsNone(inspect.getcomments(co)) @@ -704,6 +701,45 @@ class TestBuggyCases(GetSourceBase): def test_nested_func(self): self.assertSourceEqual(mod2.cls135.func136, 136, 139) + def test_class_definition_in_multiline_string_definition(self): + self.assertSourceEqual(mod2.cls149, 149, 152) + + def test_class_definition_in_multiline_comment(self): + self.assertSourceEqual(mod2.cls160, 160, 163) + + def test_nested_class_definition_indented_string(self): + self.assertSourceEqual(mod2.cls173.cls175, 175, 176) + + def test_nested_class_definition(self): + self.assertSourceEqual(mod2.cls183, 183, 188) + self.assertSourceEqual(mod2.cls183.cls185, 185, 188) + + def test_class_decorator(self): + self.assertSourceEqual(mod2.cls196, 194, 201) + self.assertSourceEqual(mod2.cls196.cls200, 198, 201) + + def test_class_inside_conditional(self): + self.assertSourceEqual(mod2.cls238, 238, 240) + self.assertSourceEqual(mod2.cls238.cls239, 239, 240) + + def test_multiple_children_classes(self): + self.assertSourceEqual(mod2.cls203, 203, 209) + self.assertSourceEqual(mod2.cls203.cls204, 204, 206) + self.assertSourceEqual(mod2.cls203.cls204.cls205, 205, 206) + self.assertSourceEqual(mod2.cls203.cls207, 207, 209) + self.assertSourceEqual(mod2.cls203.cls207.cls205, 208, 209) + + def test_nested_class_definition_inside_function(self): + self.assertSourceEqual(mod2.func212(), 213, 214) + self.assertSourceEqual(mod2.cls213, 218, 222) + self.assertSourceEqual(mod2.cls213().func219(), 220, 221) + + def test_nested_class_definition_inside_async_function(self): + import asyncio + self.addCleanup(asyncio.set_event_loop_policy, None) + self.assertSourceEqual(asyncio.run(mod2.func225()), 226, 227) + self.assertSourceEqual(mod2.cls226, 231, 235) + self.assertSourceEqual(asyncio.run(mod2.cls226().func232()), 233, 234) class TestNoEOL(GetSourceBase): def setUp(self): @@ -2081,6 +2117,7 @@ class TestSignatureObject(unittest.TestCase): P = inspect.Parameter self.assertEqual(str(S()), '()') + self.assertEqual(repr(S().parameters), 'mappingproxy(OrderedDict())') def test(po, pk, pod=42, pkd=100, *args, ko, **kwargs): pass @@ -2978,8 +3015,8 @@ class TestSignatureObject(unittest.TestCase): def foo(a, *, b:int) -> float: pass self.assertFalse(inspect.signature(foo) == 42) self.assertTrue(inspect.signature(foo) != 42) - self.assertTrue(inspect.signature(foo) == EqualsToAll()) - self.assertFalse(inspect.signature(foo) != EqualsToAll()) + self.assertTrue(inspect.signature(foo) == ALWAYS_EQ) + self.assertFalse(inspect.signature(foo) != ALWAYS_EQ) def bar(a, *, b:int) -> float: pass self.assertTrue(inspect.signature(foo) == inspect.signature(bar)) @@ -3184,6 +3221,11 @@ class TestSignatureObject(unittest.TestCase): l = list(signature.parameters) self.assertEqual(l, unsorted_keyword_only_parameters) + def test_signater_parameters_is_ordered(self): + p1 = inspect.signature(lambda x, y: None).parameters + p2 = inspect.signature(lambda y, x: None).parameters + self.assertNotEqual(p1, p2) + class TestParameterObject(unittest.TestCase): def test_signature_parameter_kinds(self): @@ -3253,8 +3295,8 @@ class TestParameterObject(unittest.TestCase): self.assertFalse(p != p) self.assertFalse(p == 42) self.assertTrue(p != 42) - self.assertTrue(p == EqualsToAll()) - self.assertFalse(p != EqualsToAll()) + self.assertTrue(p == ALWAYS_EQ) + self.assertFalse(p != ALWAYS_EQ) self.assertTrue(p == P('foo', default=42, kind=inspect.Parameter.KEYWORD_ONLY)) @@ -3601,8 +3643,8 @@ class TestBoundArguments(unittest.TestCase): ba = inspect.signature(foo).bind(1) self.assertTrue(ba == ba) self.assertFalse(ba != ba) - self.assertTrue(ba == EqualsToAll()) - self.assertFalse(ba != EqualsToAll()) + self.assertTrue(ba == ALWAYS_EQ) + self.assertFalse(ba != ALWAYS_EQ) ba2 = inspect.signature(foo).bind(1) self.assertTrue(ba == ba2) @@ -3685,6 +3727,10 @@ class TestBoundArguments(unittest.TestCase): ba.apply_defaults() self.assertEqual(list(ba.arguments.items()), [('a', 'spam')]) + def test_signature_bound_arguments_arguments_type(self): + def foo(a): pass + ba = inspect.signature(foo).bind(1) + self.assertIs(type(ba.arguments), dict) class TestSignaturePrivateHelpers(unittest.TestCase): def test_signature_get_bound_param(self): diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 8eef332b..d2e38772 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -29,6 +29,7 @@ import random import signal import sys import sysconfig +import textwrap import threading import time import unittest @@ -37,7 +38,8 @@ import weakref from collections import deque, UserList from itertools import cycle, count from test import support -from test.support.script_helper import assert_python_ok, run_python_until_end +from test.support.script_helper import ( + assert_python_ok, assert_python_failure, run_python_until_end) from test.support import FakePath import codecs @@ -1526,6 +1528,13 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests): self.assertRaises(ValueError, b.peek) self.assertRaises(ValueError, b.read1, 1) + def test_truncate_on_read_only(self): + rawio = self.MockFileIO(b"abc") + bufio = self.tp(rawio) + self.assertFalse(bufio.writable()) + self.assertRaises(self.UnsupportedOperation, bufio.truncate) + self.assertRaises(self.UnsupportedOperation, bufio.truncate, 0) + class CBufferedReaderTest(BufferedReaderTest, SizeofTest): tp = io.BufferedReader @@ -2370,6 +2379,10 @@ class BufferedRandomTest(BufferedReaderTest, BufferedWriterTest): # You can't construct a BufferedRandom over a non-seekable stream. test_unseekable = None + # writable() returns True, so there's no point to test it over + # a writable stream. + test_truncate_on_read_only = None + class CBufferedRandomTest(BufferedRandomTest, SizeofTest): tp = io.BufferedRandom @@ -3495,7 +3508,6 @@ class TextIOWrapperTest(unittest.TestCase): """.format(iomod=iomod, kwargs=kwargs) return assert_python_ok("-c", code) - @support.requires_type_collecting def test_create_at_shutdown_without_encoding(self): rc, out, err = self._check_create_at_shutdown() if err: @@ -3505,7 +3517,6 @@ class TextIOWrapperTest(unittest.TestCase): else: self.assertEqual("ok", out.decode().strip()) - @support.requires_type_collecting def test_create_at_shutdown_with_encoding(self): rc, out, err = self._check_create_at_shutdown(encoding='utf-8', errors='strict') @@ -3688,7 +3699,7 @@ def _to_memoryview(buf): class CTextIOWrapperTest(TextIOWrapperTest): io = io - shutdown_error = "RuntimeError: could not find io module state" + shutdown_error = "LookupError: unknown encoding: ascii" def test_initialization(self): r = self.BytesIO(b"\xc3\xa9\n\n") @@ -4146,6 +4157,51 @@ class MiscIOTest(unittest.TestCase): # there used to be a buffer overflow in the parser for rawmode self.assertRaises(ValueError, self.open, support.TESTFN, 'rwax+') + def test_check_encoding_errors(self): + # bpo-37388: open() and TextIOWrapper must check encoding and errors + # arguments in dev mode + mod = self.io.__name__ + filename = __file__ + invalid = 'Boom, Shaka Laka, Boom!' + code = textwrap.dedent(f''' + import sys + from {mod} import open, TextIOWrapper + + try: + open({filename!r}, encoding={invalid!r}) + except LookupError: + pass + else: + sys.exit(21) + + try: + open({filename!r}, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(22) + + fp = open({filename!r}, "rb") + with fp: + try: + TextIOWrapper(fp, encoding={invalid!r}) + except LookupError: + pass + else: + sys.exit(23) + + try: + TextIOWrapper(fp, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(24) + + sys.exit(10) + ''') + proc = assert_python_failure('-X', 'dev', '-c', code) + self.assertEqual(proc.rc, 10, proc) + class CMiscIOTest(MiscIOTest): io = io @@ -4191,7 +4247,8 @@ class CMiscIOTest(MiscIOTest): err = res.err.decode() if res.rc != 0: # Failure: should be a fatal error - pattern = (r"Fatal Python error: could not acquire lock " + pattern = (r"Fatal Python error: _enter_buffered_busy: " + r"could not acquire lock " r"for <(_io\.)?BufferedWriter name='<{stream_name}>'> " r"at interpreter shutdown, possibly due to " r"daemon threads".format_map(locals())) diff --git a/Lib/test/test_ioctl.py b/Lib/test/test_ioctl.py index d1a5db90..a2873582 100644 --- a/Lib/test/test_ioctl.py +++ b/Lib/test/test_ioctl.py @@ -48,7 +48,7 @@ class IoctlTests(unittest.TestCase): else: buf.append(fill) with open("/dev/tty", "rb") as tty: - r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, 1) + r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, True) rpgrp = buf[0] self.assertEqual(r, 0) self.assertIn(rpgrp, ids) diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index 2eba740e..3c070080 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -7,7 +7,6 @@ import unittest import re import contextlib -import functools import operator import pickle import ipaddress @@ -170,10 +169,44 @@ class CommonTestMixin_v6(CommonTestMixin): assertBadLength(15) assertBadLength(17) + def test_blank_scope_id(self): + address = ('::1%') + with self.assertAddressError('Invalid IPv6 address: "%r"', address): + self.factory(address) + + def test_invalid_scope_id_with_percent(self): + address = ('::1%scope%') + with self.assertAddressError('Invalid IPv6 address: "%r"', address): + self.factory(address) class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4): factory = ipaddress.IPv4Address + def test_format(self): + v4 = ipaddress.IPv4Address("1.2.3.42") + v4_pairs = [ + ("b" ,"00000001000000100000001100101010"), + ("n" ,"00000001000000100000001100101010"), + ("x" ,"0102032a"), + ("X" ,"0102032A"), + ("_b" ,"0000_0001_0000_0010_0000_0011_0010_1010"), + ("_n" ,"0000_0001_0000_0010_0000_0011_0010_1010"), + ("_x" ,"0102_032a"), + ("_X" ,"0102_032A"), + ("#b" ,"0b00000001000000100000001100101010"), + ("#n" ,"0b00000001000000100000001100101010"), + ("#x" ,"0x0102032a"), + ("#X" ,"0X0102032A"), + ("#_b" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"), + ("#_n" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"), + ("#_x" ,"0x0102_032a"), + ("#_X" ,"0X0102_032A"), + ("s" ,"1.2.3.42"), + ("" ,"1.2.3.42"), + ] + for (fmt, txt) in v4_pairs: + self.assertEqual(txt, format(v4, fmt)) + def test_network_passed_as_address(self): addr = "127.0.0.1/24" with self.assertAddressError("Unexpected '/' in %r", addr): @@ -261,25 +294,72 @@ class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4): class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): factory = ipaddress.IPv6Address + def test_format(self): + + v6 = ipaddress.IPv6Address("::1.2.3.42") + v6_pairs = [ + ("b", + "000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000010000" + "00100000001100101010"), + ("n", "0000000000000000000000000102032a"), + ("x", "0000000000000000000000000102032a"), + ("X", "0000000000000000000000000102032A"), + ("_b", + "0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" + "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" + "_0000_0000_0000_0000_0001_0000_0010_0000_0011_0010" + "_1010"), + ("_n", "0000_0000_0000_0000_0000_0000_0102_032a"), + ("_x", "0000_0000_0000_0000_0000_0000_0102_032a"), + ("_X", "0000_0000_0000_0000_0000_0000_0102_032A"), + ("#b", + "0b0000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000100" + "0000100000001100101010"), + ("#n", "0x0000000000000000000000000102032a"), + ("#x", "0x0000000000000000000000000102032a"), + ("#X", "0X0000000000000000000000000102032A"), + ("#_b", + "0b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" + "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" + "_0000_0000_0000_0000_0000_0001_0000_0010_0000_0011" + "_0010_1010"), + ("#_n", "0x0000_0000_0000_0000_0000_0000_0102_032a"), + ("#_x", "0x0000_0000_0000_0000_0000_0000_0102_032a"), + ("#_X", "0X0000_0000_0000_0000_0000_0000_0102_032A"), + ("s", "::102:32a"), + ("", "::102:32a"), + ] + + for (fmt, txt) in v6_pairs: + self.assertEqual(txt, format(v6, fmt)) + def test_network_passed_as_address(self): - addr = "::1/24" - with self.assertAddressError("Unexpected '/' in %r", addr): - ipaddress.IPv6Address(addr) + def assertBadSplit(addr): + msg = "Unexpected '/' in %r" + with self.assertAddressError(msg, addr): + ipaddress.IPv6Address(addr) + assertBadSplit("::1/24") + assertBadSplit("::1%scope_id/24") def test_bad_address_split_v6_not_enough_parts(self): def assertBadSplit(addr): msg = "At least 3 parts expected in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit(":") assertBadSplit(":1") assertBadSplit("FEDC:9878") + assertBadSplit(":%scope") + assertBadSplit(":1%scope") + assertBadSplit("FEDC:9878%scope") def test_bad_address_split_v6_too_many_colons(self): def assertBadSplit(addr): msg = "At most 8 colons permitted in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit("9:8:7:6:5:4:3::2:1") @@ -289,10 +369,17 @@ class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): # A trailing IPv4 address is two parts assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42") + assertBadSplit("9:8:7:6:5:4:3::2:1%scope") + assertBadSplit("10:9:8:7:6:5:4:3:2:1%scope") + assertBadSplit("::8:7:6:5:4:3:2:1%scope") + assertBadSplit("8:7:6:5:4:3:2:1::%scope") + # A trailing IPv4 address is two parts + assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42%scope") + def test_bad_address_split_v6_too_many_parts(self): def assertBadSplit(addr): msg = "Exactly 8 parts expected without '::' in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit("3ffe:0:0:0:0:0:0:0:1") @@ -302,18 +389,26 @@ class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): assertBadSplit("9:8:7:6:5:4:3:42.42.42.42") assertBadSplit("7:6:5:4:3:42.42.42.42") + assertBadSplit("3ffe:0:0:0:0:0:0:0:1%scope") + assertBadSplit("9:8:7:6:5:4:3:2:1%scope") + assertBadSplit("7:6:5:4:3:2:1%scope") + # A trailing IPv4 address is two parts + assertBadSplit("9:8:7:6:5:4:3:42.42.42.42%scope") + assertBadSplit("7:6:5:4:3:42.42.42.42%scope") + def test_bad_address_split_v6_too_many_parts_with_double_colon(self): def assertBadSplit(addr): msg = "Expected at most 7 other parts with '::' in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit("1:2:3:4::5:6:7:8") + assertBadSplit("1:2:3:4::5:6:7:8%scope") def test_bad_address_split_v6_repeated_double_colon(self): def assertBadSplit(addr): msg = "At most one '::' permitted in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit("3ffe::1::1") @@ -327,10 +422,21 @@ class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): assertBadSplit(":::") assertBadSplit('2001:db8:::1') + assertBadSplit("3ffe::1::1%scope") + assertBadSplit("1::2::3::4:5%scope") + assertBadSplit("2001::db:::1%scope") + assertBadSplit("3ffe::1::%scope") + assertBadSplit("::3ffe::1%scope") + assertBadSplit(":3ffe::1::1%scope") + assertBadSplit("3ffe::1::1:%scope") + assertBadSplit(":3ffe::1::1:%scope") + assertBadSplit(":::%scope") + assertBadSplit('2001:db8:::1%scope') + def test_bad_address_split_v6_leading_colon(self): def assertBadSplit(addr): msg = "Leading ':' only permitted as part of '::' in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit(":2001:db8::1") @@ -338,10 +444,15 @@ class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): assertBadSplit(":1:2:3:4:5:6:") assertBadSplit(":6:5:4:3:2:1::") + assertBadSplit(":2001:db8::1%scope") + assertBadSplit(":1:2:3:4:5:6:7%scope") + assertBadSplit(":1:2:3:4:5:6:%scope") + assertBadSplit(":6:5:4:3:2:1::%scope") + def test_bad_address_split_v6_trailing_colon(self): def assertBadSplit(addr): msg = "Trailing ':' only permitted as part of '::' in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit("2001:db8::1:") @@ -349,9 +460,14 @@ class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): assertBadSplit("::1.2.3.4:") assertBadSplit("::7:6:5:4:3:2:") + assertBadSplit("2001:db8::1:%scope") + assertBadSplit("1:2:3:4:5:6:7:%scope") + assertBadSplit("::1.2.3.4:%scope") + assertBadSplit("::7:6:5:4:3:2:%scope") + def test_bad_v4_part_in(self): def assertBadAddressPart(addr, v4_error): - with self.assertAddressError("%s in %r", v4_error, addr): + with self.assertAddressError("%s in %r", v4_error, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'") @@ -365,9 +481,20 @@ class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): "Only decimal digits permitted in 'net' " "in '1.1.1.net'") + assertBadAddressPart("3ffe::1.net%scope", "Expected 4 octets in '1.net'") + assertBadAddressPart("3ffe::127.0.1%scope", + "Expected 4 octets in '127.0.1'") + assertBadAddressPart("::1.2.3%scope", + "Expected 4 octets in '1.2.3'") + assertBadAddressPart("::1.2.3.4.5%scope", + "Expected 4 octets in '1.2.3.4.5'") + assertBadAddressPart("3ffe::1.1.1.net%scope", + "Only decimal digits permitted in 'net' " + "in '1.1.1.net'") + def test_invalid_characters(self): def assertBadPart(addr, part): - msg = "Only hex digits permitted in %r in %r" % (part, addr) + msg = "Only hex digits permitted in %r in %r" % (part, addr.split('%')[0]) with self.assertAddressError(re.escape(msg)): ipaddress.IPv6Address(addr) @@ -378,10 +505,17 @@ class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): assertBadPart("1.2.3.4::", "1.2.3.4") assertBadPart('1234:axy::b', "axy") + assertBadPart("3ffe::goog%scope", "goog") + assertBadPart("3ffe::-0%scope", "-0") + assertBadPart("3ffe::+0%scope", "+0") + assertBadPart("3ffe::-1%scope", "-1") + assertBadPart("1.2.3.4::%scope", "1.2.3.4") + assertBadPart('1234:axy::b%scope', "axy") + def test_part_length(self): def assertBadPart(addr, part): msg = "At most 4 characters permitted in %r in %r" - with self.assertAddressError(msg, part, addr): + with self.assertAddressError(msg, part, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadPart("::00000", "00000") @@ -389,11 +523,17 @@ class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): assertBadPart("02001:db8::", "02001") assertBadPart('2001:888888::1', "888888") + assertBadPart("::00000%scope", "00000") + assertBadPart("3ffe::10000%scope", "10000") + assertBadPart("02001:db8::%scope", "02001") + assertBadPart('2001:888888::1%scope', "888888") + def test_pickle(self): self.pickle_test('2001:db8::') def test_weakref(self): weakref.ref(self.factory('2001:db8::')) + weakref.ref(self.factory('2001:db8::%scope')) class NetmaskTestMixin_v4(CommonTestMixin_v4): @@ -551,11 +691,20 @@ class NetmaskTestMixin_v6(CommonTestMixin_v6): # IPv6Network has prefixlen, but IPv6Interface doesn't. # Should we add it to IPv4Interface too? (bpo-36392) + scoped_net = self.factory('::1%scope') + self.assertEqual(str(scoped_net), '::1%scope/128') + self.assertEqual(str(scoped_net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff') + self.assertEqual(str(scoped_net.hostmask), '::') + def test_split_netmask(self): addr = "cafe:cafe::/128/190" with self.assertAddressError("Only one '/' permitted in %r" % addr): self.factory(addr) + scoped_addr = "cafe:cafe::%scope/128/190" + with self.assertAddressError("Only one '/' permitted in %r" % scoped_addr): + self.factory(scoped_addr) + def test_address_errors(self): def assertBadAddress(addr, details): with self.assertAddressError(details): @@ -568,6 +717,13 @@ class NetmaskTestMixin_v6(CommonTestMixin_v6): assertBadAddress("10/8", "At least 3 parts") assertBadAddress("1234:axy::b", "Only hex digits") + assertBadAddress("/%scope", "Address cannot be empty") + assertBadAddress("/%scope8", "Address cannot be empty") + assertBadAddress("google.com%scope", "At least 3 parts") + assertBadAddress("1.2.3.4%scope", "At least 3 parts") + assertBadAddress("10%scope/8", "At least 3 parts") + assertBadAddress("1234:axy::b%scope", "Only hex digits") + def test_valid_netmask(self): # We only support CIDR for IPv6, because expanded netmasks are not # standard notation. @@ -579,6 +735,14 @@ class NetmaskTestMixin_v6(CommonTestMixin_v6): # Zero prefix is treated as decimal. self.assertEqual(str(self.factory('::/0%d' % i)), net_str) + self.assertEqual(str(self.factory('2001:db8::%scope/32')), '2001:db8::%scope/32') + for i in range(0, 129): + # Generate and re-parse the CIDR format (trivial). + net_str = '::/%d' % i + self.assertEqual(str(self.factory(net_str)), net_str) + # Zero prefix is treated as decimal. + self.assertEqual(str(self.factory('::/0%d' % i)), net_str) + def test_netmask_errors(self): def assertBadNetmask(addr, netmask): msg = "%r is not a valid netmask" % netmask @@ -597,6 +761,8 @@ class NetmaskTestMixin_v6(CommonTestMixin_v6): assertBadNetmask("::1", "pudding") assertBadNetmask("::", "::") + assertBadNetmask("::1%scope", "pudding") + def test_netmask_in_tuple_errors(self): def assertBadNetmask(addr, netmask): msg = "%r is not a valid netmask" % netmask @@ -604,12 +770,15 @@ class NetmaskTestMixin_v6(CommonTestMixin_v6): self.factory((addr, netmask)) assertBadNetmask("::1", -1) assertBadNetmask("::1", 129) + assertBadNetmask("::1%scope", 129) def test_pickle(self): self.pickle_test('2001:db8::1000/124') self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1 self.pickle_test('2001:db8::1000') # IPV6LENGTH + self.pickle_test('2001:db8::1000%scope') # IPV6LENGTH + class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6): factory = ipaddress.IPv6Interface @@ -636,6 +805,13 @@ class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6): self.factory('2000:aaa::/48').subnet_of( self.factory('2000:aaa::/56'))) + self.assertFalse( + self.factory('2000:999::%scope/56').subnet_of( + self.factory('2000:aaa::%scope/48'))) + self.assertTrue( + self.factory('2000:aaa::%scope/56').subnet_of( + self.factory('2000:aaa::%scope/48'))) + def test_supernet_of(self): # containee left of container self.assertFalse( @@ -682,13 +858,19 @@ class ComparisonTests(unittest.TestCase): v6addr = ipaddress.IPv6Address(1) v6net = ipaddress.IPv6Network(1) v6intf = ipaddress.IPv6Interface(1) + v6addr_scoped = ipaddress.IPv6Address('::1%scope') + v6net_scoped= ipaddress.IPv6Network('::1%scope') + v6intf_scoped= ipaddress.IPv6Interface('::1%scope') v4_addresses = [v4addr, v4intf] v4_objects = v4_addresses + [v4net] v6_addresses = [v6addr, v6intf] v6_objects = v6_addresses + [v6net] + v6_scoped_addresses = [v6addr_scoped, v6intf_scoped] + v6_scoped_objects = v6_scoped_addresses + [v6net_scoped] objects = v4_objects + v6_objects + objects_with_scoped = objects + v6_scoped_objects v4addr2 = ipaddress.IPv4Address(2) v4net2 = ipaddress.IPv4Network(2) @@ -696,11 +878,14 @@ class ComparisonTests(unittest.TestCase): v6addr2 = ipaddress.IPv6Address(2) v6net2 = ipaddress.IPv6Network(2) v6intf2 = ipaddress.IPv6Interface(2) + v6addr2_scoped = ipaddress.IPv6Address('::2%scope') + v6net2_scoped = ipaddress.IPv6Network('::2%scope') + v6intf2_scoped = ipaddress.IPv6Interface('::2%scope') def test_foreign_type_equality(self): # __eq__ should never raise TypeError directly other = object() - for obj in self.objects: + for obj in self.objects_with_scoped: self.assertNotEqual(obj, other) self.assertFalse(obj == other) self.assertEqual(obj.__eq__(other), NotImplemented) @@ -715,8 +900,17 @@ class ComparisonTests(unittest.TestCase): continue self.assertNotEqual(lhs, rhs) + def test_scoped_ipv6_equality(self): + for lhs, rhs in zip(self.v6_objects, self.v6_scoped_objects): + self.assertNotEqual(lhs, rhs) + + def test_v4_with_v6_scoped_equality(self): + for lhs in self.v4_objects: + for rhs in self.v6_scoped_objects: + self.assertNotEqual(lhs, rhs) + def test_same_type_equality(self): - for obj in self.objects: + for obj in self.objects_with_scoped: self.assertEqual(obj, obj) self.assertLessEqual(obj, obj) self.assertGreaterEqual(obj, obj) @@ -729,6 +923,9 @@ class ComparisonTests(unittest.TestCase): (self.v6addr, self.v6addr2), (self.v6net, self.v6net2), (self.v6intf, self.v6intf2), + (self.v6addr_scoped, self.v6addr2_scoped), + (self.v6net_scoped, self.v6net2_scoped), + (self.v6intf_scoped, self.v6intf2_scoped), ): self.assertNotEqual(lhs, rhs) self.assertLess(lhs, rhs) @@ -743,16 +940,21 @@ class ComparisonTests(unittest.TestCase): def test_containment(self): for obj in self.v4_addresses: self.assertIn(obj, self.v4net) - for obj in self.v6_addresses: + for obj in self.v6_addresses + self.v6_scoped_addresses: self.assertIn(obj, self.v6net) - for obj in self.v4_objects + [self.v6net]: + for obj in self.v6_addresses + self.v6_scoped_addresses: + self.assertIn(obj, self.v6net_scoped) + + for obj in self.v4_objects + [self.v6net, self.v6net_scoped]: self.assertNotIn(obj, self.v6net) - for obj in self.v6_objects + [self.v4net]: + for obj in self.v4_objects + [self.v6net, self.v6net_scoped]: + self.assertNotIn(obj, self.v6net_scoped) + for obj in self.v6_objects + self.v6_scoped_objects + [self.v4net]: self.assertNotIn(obj, self.v4net) def test_mixed_type_ordering(self): - for lhs in self.objects: - for rhs in self.objects: + for lhs in self.objects_with_scoped: + for rhs in self.objects_with_scoped: if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)): continue self.assertRaises(TypeError, lambda: lhs < rhs) @@ -762,7 +964,7 @@ class ComparisonTests(unittest.TestCase): def test_foreign_type_ordering(self): other = object() - for obj in self.objects: + for obj in self.objects_with_scoped: with self.assertRaises(TypeError): obj < other with self.assertRaises(TypeError): @@ -784,14 +986,18 @@ class ComparisonTests(unittest.TestCase): # with get_mixed_type_key, you can sort addresses and network. v4_ordered = [self.v4addr, self.v4net, self.v4intf] v6_ordered = [self.v6addr, self.v6net, self.v6intf] + v6_scoped_ordered = [self.v6addr_scoped, self.v6net_scoped, self.v6intf_scoped] self.assertEqual(v4_ordered, sorted(self.v4_objects, key=ipaddress.get_mixed_type_key)) self.assertEqual(v6_ordered, sorted(self.v6_objects, key=ipaddress.get_mixed_type_key)) - self.assertEqual(v4_ordered + v6_ordered, - sorted(self.objects, + self.assertEqual(v6_scoped_ordered, + sorted(self.v6_scoped_objects, + key=ipaddress.get_mixed_type_key)) + self.assertEqual(v4_ordered + v6_scoped_ordered, + sorted(self.v4_objects + self.v6_scoped_objects, key=ipaddress.get_mixed_type_key)) self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object)) @@ -801,6 +1007,8 @@ class ComparisonTests(unittest.TestCase): v4net = ipaddress.ip_network('1.1.1.1') v6addr = ipaddress.ip_address('::1') v6net = ipaddress.ip_network('::1') + v6addr_scoped = ipaddress.ip_address('::1%scope') + v6net_scoped = ipaddress.ip_network('::1%scope') self.assertRaises(TypeError, v4addr.__lt__, v6addr) self.assertRaises(TypeError, v4addr.__gt__, v6addr) @@ -812,6 +1020,16 @@ class ComparisonTests(unittest.TestCase): self.assertRaises(TypeError, v6net.__lt__, v4net) self.assertRaises(TypeError, v6net.__gt__, v4net) + self.assertRaises(TypeError, v4addr.__lt__, v6addr_scoped) + self.assertRaises(TypeError, v4addr.__gt__, v6addr_scoped) + self.assertRaises(TypeError, v4net.__lt__, v6net_scoped) + self.assertRaises(TypeError, v4net.__gt__, v6net_scoped) + + self.assertRaises(TypeError, v6addr_scoped.__lt__, v4addr) + self.assertRaises(TypeError, v6addr_scoped.__gt__, v4addr) + self.assertRaises(TypeError, v6net_scoped.__lt__, v4net) + self.assertRaises(TypeError, v6net_scoped.__gt__, v4net) + class IpaddrUnitTest(unittest.TestCase): @@ -825,12 +1043,19 @@ class IpaddrUnitTest(unittest.TestCase): self.ipv6_interface = ipaddress.IPv6Interface( '2001:658:22a:cafe:200:0:0:1/64') self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64') + self.ipv6_scoped_address = ipaddress.IPv6Interface( + '2001:658:22a:cafe:200:0:0:1%scope') + self.ipv6_scoped_interface = ipaddress.IPv6Interface( + '2001:658:22a:cafe:200:0:0:1%scope/64') + self.ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/64') def testRepr(self): self.assertEqual("IPv4Interface('1.2.3.4/32')", repr(ipaddress.IPv4Interface('1.2.3.4'))) self.assertEqual("IPv6Interface('::1/128')", repr(ipaddress.IPv6Interface('::1'))) + self.assertEqual("IPv6Interface('::1%scope/128')", + repr(ipaddress.IPv6Interface('::1%scope'))) # issue #16531: constructing IPv4Network from an (address, mask) tuple def testIPv4Tuple(self): @@ -917,6 +1142,8 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(ipaddress.IPv6Network((ip, '96')), net) + ip_scoped = ipaddress.IPv6Address('2001:db8::%scope') + # strict=True and host bits set ip = ipaddress.IPv6Address('2001:db8::1') with self.assertRaises(ValueError): @@ -945,6 +1172,13 @@ class IpaddrUnitTest(unittest.TestCase): (42540766411282592856903984951653826561, '96')), ipaddress.IPv6Interface('2001:db8::1/96')) + ip_scoped = ipaddress.IPv6Address('2001:db8::1%scope') + with self.assertRaises(ValueError): + ipaddress.IPv6Network(('2001:db8::1%scope', 96)) + with self.assertRaises(ValueError): + ipaddress.IPv6Network((ip_scoped, 96)) + # strict=False and host bits set + # issue57 def testAddressIntMath(self): self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255, @@ -955,6 +1189,10 @@ class IpaddrUnitTest(unittest.TestCase): ipaddress.IPv6Address('::ffff')) self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2), ipaddress.IPv6Address('::1')) + self.assertNotEqual(ipaddress.IPv6Address('::1%scope') + (2**16 - 2), + ipaddress.IPv6Address('::ffff%scope')) + self.assertNotEqual(ipaddress.IPv6Address('::ffff%scope') - (2**16 - 2), + ipaddress.IPv6Address('::1%scope')) def testInvalidIntToBytes(self): self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1) @@ -987,6 +1225,12 @@ class IpaddrUnitTest(unittest.TestCase): '2001:658:22a:cafe::') self.assertEqual(str(self.ipv6_network.hostmask), '::ffff:ffff:ffff:ffff') + self.assertEqual(int(self.ipv6_scoped_network.network_address), + 42540616829182469433403647294022090752) + self.assertEqual(str(self.ipv6_scoped_network.network_address), + '2001:658:22a:cafe::%scope') + self.assertEqual(str(self.ipv6_scoped_network.hostmask), + '::ffff:ffff:ffff:ffff') def testIpFromInt(self): self.assertEqual(self.ipv4_interface._ip, @@ -994,17 +1238,23 @@ class IpaddrUnitTest(unittest.TestCase): ipv4 = ipaddress.ip_network('1.2.3.4') ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1') + ipv6_scoped = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1%scope') self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address))) self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address))) + self.assertNotEqual(ipv6_scoped, ipaddress.ip_network(int(ipv6_scoped.network_address))) v6_int = 42540616829182469433547762482097946625 self.assertEqual(self.ipv6_interface._ip, ipaddress.IPv6Interface(v6_int)._ip) + self.assertEqual(self.ipv6_scoped_interface._ip, + ipaddress.IPv6Interface(v6_int)._ip) self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version, 4) self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version, 6) + self.assertEqual(ipaddress.ip_network(self.ipv6_scoped_address._ip).version, + 6) def testIpFromPacked(self): address = ipaddress.ip_address @@ -1030,6 +1280,24 @@ class IpaddrUnitTest(unittest.TestCase): 42540616829182469433547762482097946625) self.assertEqual(str(self.ipv6_interface.ip), '2001:658:22a:cafe:200::1') + self.assertEqual(int(self.ipv6_scoped_interface.ip), + 42540616829182469433547762482097946625) + self.assertEqual(str(self.ipv6_scoped_interface.ip), + '2001:658:22a:cafe:200::1') + + def testGetScopeId(self): + self.assertEqual(self.ipv6_address.scope_id, + None) + self.assertEqual(str(self.ipv6_scoped_address.scope_id), + 'scope') + self.assertEqual(self.ipv6_interface.scope_id, + None) + self.assertEqual(str(self.ipv6_scoped_interface.scope_id), + 'scope') + self.assertEqual(self.ipv6_network.network_address.scope_id, + None) + self.assertEqual(str(self.ipv6_scoped_network.network_address.scope_id), + 'scope') def testGetNetmask(self): self.assertEqual(int(self.ipv4_network.netmask), 4294967040) @@ -1037,6 +1305,9 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(int(self.ipv6_network.netmask), 340282366920938463444927863358058659840) self.assertEqual(self.ipv6_network.prefixlen, 64) + self.assertEqual(int(self.ipv6_scoped_network.netmask), + 340282366920938463444927863358058659840) + self.assertEqual(self.ipv6_scoped_network.prefixlen, 64) def testZeroNetmask(self): ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0') @@ -1047,6 +1318,10 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0) self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0) + ipv6_scoped_zero_netmask = ipaddress.IPv6Interface('::1%scope/0') + self.assertEqual(int(ipv6_scoped_zero_netmask.network.netmask), 0) + self.assertEqual(ipv6_scoped_zero_netmask._prefix_from_prefix_string('0'), 0) + def testIPv4Net(self): net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255') self.assertEqual(net.prefixlen, 24) @@ -1060,9 +1335,15 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(str(self.ipv6_network.broadcast_address), '2001:658:22a:cafe:ffff:ffff:ffff:ffff') + self.assertEqual(int(self.ipv6_scoped_network.broadcast_address), + 42540616829182469451850391367731642367) + self.assertEqual(str(self.ipv6_scoped_network.broadcast_address), + '2001:658:22a:cafe:ffff:ffff:ffff:ffff') + def testGetPrefixlen(self): self.assertEqual(self.ipv4_interface.network.prefixlen, 24) self.assertEqual(self.ipv6_interface.network.prefixlen, 64) + self.assertEqual(self.ipv6_scoped_interface.network.prefixlen, 64) def testGetSupernet(self): self.assertEqual(self.ipv4_network.supernet().prefixlen, 23) @@ -1077,6 +1358,9 @@ class IpaddrUnitTest(unittest.TestCase): '2001:658:22a:cafe::') self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(), ipaddress.IPv6Network('::0/0')) + self.assertEqual(self.ipv6_scoped_network.supernet().prefixlen, 63) + self.assertEqual(str(self.ipv6_scoped_network.supernet().network_address), + '2001:658:22a:cafe::') def testGetSupernet3(self): self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21) @@ -1086,6 +1370,9 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61) self.assertEqual(str(self.ipv6_network.supernet(3).network_address), '2001:658:22a:caf8::') + self.assertEqual(self.ipv6_scoped_network.supernet(3).prefixlen, 61) + self.assertEqual(str(self.ipv6_scoped_network.supernet(3).network_address), + '2001:658:22a:caf8::') def testGetSupernet4(self): self.assertRaises(ValueError, self.ipv4_network.supernet, @@ -1101,6 +1388,12 @@ class IpaddrUnitTest(unittest.TestCase): new_prefix=65) self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2), self.ipv6_network.supernet(new_prefix=62)) + self.assertRaises(ValueError, self.ipv6_scoped_network.supernet, + prefixlen_diff=2, new_prefix=1) + self.assertRaises(ValueError, self.ipv6_scoped_network.supernet, + new_prefix=65) + self.assertEqual(self.ipv6_scoped_network.supernet(prefixlen_diff=2), + self.ipv6_scoped_network.supernet(new_prefix=62)) def testHosts(self): hosts = list(self.ipv4_network.hosts()) @@ -1114,6 +1407,12 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0]) self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1]) + ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/120') + hosts = list(ipv6_scoped_network.hosts()) + self.assertEqual(255, len(hosts)) + self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0]) + self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1]) + # special case where only 1 bit is left for address addrs = [ipaddress.IPv4Address('2.0.0.0'), ipaddress.IPv4Address('2.0.0.1')] @@ -1124,6 +1423,15 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), list(ipaddress.ip_network(tpl_args).hosts())) + # special case where the network is a /32 + addrs = [ipaddress.IPv4Address('1.2.3.4')] + str_args = '1.2.3.4/32' + tpl_args = ('1.2.3.4', 32) + self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) + self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) + self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), + list(ipaddress.ip_network(tpl_args).hosts())) + addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'), ipaddress.IPv6Address('2001:658:22a:cafe::1')] str_args = '2001:658:22a:cafe::/127' @@ -1133,6 +1441,14 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), list(ipaddress.ip_network(tpl_args).hosts())) + addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::1'), ] + str_args = '2001:658:22a:cafe::1/128' + tpl_args = ('2001:658:22a:cafe::1', 128) + self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) + self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) + self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), + list(ipaddress.ip_network(tpl_args).hosts())) + def testFancySubnetting(self): self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)), sorted(self.ipv4_network.subnets(new_prefix=27))) @@ -1148,6 +1464,13 @@ class IpaddrUnitTest(unittest.TestCase): self.assertRaises(ValueError, list, self.ipv6_network.subnets(prefixlen_diff=4, new_prefix=68)) + self.assertEqual(sorted(self.ipv6_scoped_network.subnets(prefixlen_diff=4)), + sorted(self.ipv6_scoped_network.subnets(new_prefix=68))) + self.assertRaises(ValueError, list, + self.ipv6_scoped_network.subnets(new_prefix=63)) + self.assertRaises(ValueError, list, + self.ipv6_scoped_network.subnets(prefixlen_diff=4, + new_prefix=68)) def testGetSubnets(self): self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25) @@ -1159,6 +1482,7 @@ class IpaddrUnitTest(unittest.TestCase): '1.2.3.128') self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65) + self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].prefixlen, 65) def testGetSubnetForSingle32(self): ip = ipaddress.IPv4Network('1.2.3.4/32') @@ -1174,6 +1498,12 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(subnets1, ['::1/128']) self.assertEqual(subnets1, subnets2) + ip_scoped = ipaddress.IPv6Network('::1%scope/128') + subnets1 = [str(x) for x in ip_scoped.subnets()] + subnets2 = [str(x) for x in ip_scoped.subnets(2)] + self.assertEqual(subnets1, ['::1%scope/128']) + self.assertEqual(subnets1, subnets2) + def testSubnet2(self): ips = [str(x) for x in self.ipv4_network.subnets(2)] self.assertEqual( @@ -1217,12 +1547,18 @@ class IpaddrUnitTest(unittest.TestCase): self.ipv6_interface.network.subnets(65)) self.assertRaises(ValueError, list, self.ipv6_network.subnets(65)) + self.assertRaises(ValueError, list, + self.ipv6_scoped_interface.network.subnets(65)) + self.assertRaises(ValueError, list, + self.ipv6_scoped_network.subnets(65)) def testSupernetFailsForLargeCidrDiff(self): self.assertRaises(ValueError, self.ipv4_interface.network.supernet, 25) self.assertRaises(ValueError, self.ipv6_interface.network.supernet, 65) + self.assertRaises(ValueError, + self.ipv6_scoped_interface.network.supernet, 65) def testSubnetFailsForNegativeCidrDiff(self): self.assertRaises(ValueError, list, @@ -1233,6 +1569,10 @@ class IpaddrUnitTest(unittest.TestCase): self.ipv6_interface.network.subnets(-1)) self.assertRaises(ValueError, list, self.ipv6_network.subnets(-1)) + self.assertRaises(ValueError, list, + self.ipv6_scoped_interface.network.subnets(-1)) + self.assertRaises(ValueError, list, + self.ipv6_scoped_network.subnets(-1)) def testGetNum_Addresses(self): self.assertEqual(self.ipv4_network.num_addresses, 256) @@ -1245,6 +1585,11 @@ class IpaddrUnitTest(unittest.TestCase): 9223372036854775808) self.assertEqual(self.ipv6_network.supernet().num_addresses, 36893488147419103232) + self.assertEqual(self.ipv6_scoped_network.num_addresses, 18446744073709551616) + self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].num_addresses, + 9223372036854775808) + self.assertEqual(self.ipv6_scoped_network.supernet().num_addresses, + 36893488147419103232) def testContains(self): self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'), @@ -1266,6 +1611,9 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(str(self.ipv6_network[5]), '2001:658:22a:cafe::5') self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64) + self.assertEqual(str(self.ipv6_scoped_network[5]), + '2001:658:22a:cafe::5') + self.assertRaises(IndexError, self.ipv6_scoped_network.__getitem__, 1 << 64) def testGetitem(self): # http://code.google.com/p/ipaddr-py/issues/detail?id=15 @@ -1285,6 +1633,8 @@ class IpaddrUnitTest(unittest.TestCase): ipaddress.IPv4Interface('1.2.3.4/23')) self.assertFalse(self.ipv4_interface == ipaddress.IPv6Interface('::1.2.3.4/24')) + self.assertFalse(self.ipv4_interface == + ipaddress.IPv6Interface('::1.2.3.4%scope/24')) self.assertFalse(self.ipv4_interface == '') self.assertFalse(self.ipv4_interface == []) self.assertFalse(self.ipv4_interface == 2) @@ -1299,6 +1649,20 @@ class IpaddrUnitTest(unittest.TestCase): self.assertFalse(self.ipv6_interface == []) self.assertFalse(self.ipv6_interface == 2) + self.assertTrue(self.ipv6_scoped_interface == + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64')) + self.assertFalse(self.ipv6_scoped_interface == + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63')) + self.assertFalse(self.ipv6_scoped_interface == + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64')) + self.assertFalse(self.ipv6_scoped_interface == + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63')) + self.assertFalse(self.ipv6_scoped_interface == + ipaddress.IPv4Interface('1.2.3.4/23')) + self.assertFalse(self.ipv6_scoped_interface == '') + self.assertFalse(self.ipv6_scoped_interface == []) + self.assertFalse(self.ipv6_scoped_interface == 2) + def testNotEqual(self): self.assertFalse(self.ipv4_interface != ipaddress.IPv4Interface('1.2.3.4/24')) @@ -1306,6 +1670,8 @@ class IpaddrUnitTest(unittest.TestCase): ipaddress.IPv4Interface('1.2.3.4/23')) self.assertTrue(self.ipv4_interface != ipaddress.IPv6Interface('::1.2.3.4/24')) + self.assertTrue(self.ipv4_interface != + ipaddress.IPv6Interface('::1.2.3.4%scope/24')) self.assertTrue(self.ipv4_interface != '') self.assertTrue(self.ipv4_interface != []) self.assertTrue(self.ipv4_interface != 2) @@ -1332,6 +1698,26 @@ class IpaddrUnitTest(unittest.TestCase): self.assertTrue(self.ipv6_address != []) self.assertTrue(self.ipv6_address != 2) + self.assertFalse(self.ipv6_scoped_interface != + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64')) + self.assertTrue(self.ipv6_scoped_interface != + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63')) + self.assertTrue(self.ipv6_scoped_interface != + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64')) + self.assertTrue(self.ipv6_scoped_interface != + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63')) + self.assertTrue(self.ipv6_scoped_interface != + ipaddress.IPv4Interface('1.2.3.4/23')) + self.assertTrue(self.ipv6_scoped_interface != '') + self.assertTrue(self.ipv6_scoped_interface != []) + self.assertTrue(self.ipv6_scoped_interface != 2) + + self.assertTrue(self.ipv6_scoped_address != + ipaddress.IPv4Address('1.2.3.4')) + self.assertTrue(self.ipv6_scoped_address != '') + self.assertTrue(self.ipv6_scoped_address != []) + self.assertTrue(self.ipv6_scoped_address != 2) + def testSlash32Constructor(self): self.assertEqual(str(ipaddress.IPv4Interface( '1.2.3.4/255.255.255.255')), '1.2.3.4/32') @@ -1339,6 +1725,8 @@ class IpaddrUnitTest(unittest.TestCase): def testSlash128Constructor(self): self.assertEqual(str(ipaddress.IPv6Interface('::1/128')), '::1/128') + self.assertEqual(str(ipaddress.IPv6Interface('::1%scope/128')), + '::1%scope/128') def testSlash0Constructor(self): self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')), @@ -1410,6 +1798,13 @@ class IpaddrUnitTest(unittest.TestCase): collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3]) self.assertEqual(list(collapsed), [ip3]) + ip1 = ipaddress.IPv6Network('2001::%scope/100') + ip2 = ipaddress.IPv6Network('2001::%scope/120') + ip3 = ipaddress.IPv6Network('2001::%scope/96') + # test that ipv6 addresses are subsumed properly. + collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3]) + self.assertEqual(list(collapsed), [ip3]) + # the toejam test addr_tuples = [ (ipaddress.ip_address('1.1.1.1'), @@ -1423,6 +1818,18 @@ class IpaddrUnitTest(unittest.TestCase): self.assertRaises(TypeError, ipaddress.collapse_addresses, [ip1, ip2]) + addr_tuples = [ + (ipaddress.ip_address('1.1.1.1'), + ipaddress.ip_address('::1%scope')), + (ipaddress.IPv4Network('1.1.0.0/24'), + ipaddress.IPv6Network('2001::%scope/120')), + (ipaddress.IPv4Network('1.1.0.0/32'), + ipaddress.IPv6Network('2001::%scope/128')), + ] + for ip1, ip2 in addr_tuples: + self.assertRaises(TypeError, ipaddress.collapse_addresses, + [ip1, ip2]) + def testSummarizing(self): #ip = ipaddress.ip_address #ipnet = ipaddress.ip_network @@ -1442,6 +1849,8 @@ class IpaddrUnitTest(unittest.TestCase): # test that a summary over ip4 & ip6 fails self.assertRaises(TypeError, list, summarize(ip1, ipaddress.IPv6Address('::1'))) + self.assertRaises(TypeError, list, + summarize(ip1, ipaddress.IPv6Address('::1%scope'))) # test a /24 is summarized properly self.assertEqual(list(summarize(ip1, ip2))[0], ipaddress.ip_network('1.1.1.0/24')) @@ -1467,6 +1876,17 @@ class IpaddrUnitTest(unittest.TestCase): [ipaddress.ip_network('1::/16'), ipaddress.ip_network('2::/128')]) + ip1 = ipaddress.ip_address('1::%scope') + ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff%scope') + # test an IPv6 is summarized properly + self.assertEqual(list(summarize(ip1, ip2))[0], + ipaddress.ip_network('1::/16')) + # test an IPv6 range that isn't on a network byte boundary + ip2 = ipaddress.ip_address('2::%scope') + self.assertEqual(list(summarize(ip1, ip2)), + [ipaddress.ip_network('1::/16'), + ipaddress.ip_network('2::/128')]) + # test exception raised when first is greater than last self.assertRaises(ValueError, list, summarize(ipaddress.ip_address('1.1.1.0'), @@ -1492,6 +1912,10 @@ class IpaddrUnitTest(unittest.TestCase): ipaddress.ip_address('::1')) self.assertTrue(ipaddress.ip_address('::1') <= ipaddress.ip_address('::2')) + self.assertTrue(ipaddress.ip_address('::1%scope') <= + ipaddress.ip_address('::1%scope')) + self.assertTrue(ipaddress.ip_address('::1%scope') <= + ipaddress.ip_address('::2%scope')) def testInterfaceComparison(self): self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') == @@ -1524,6 +1948,52 @@ class IpaddrUnitTest(unittest.TestCase): self.assertTrue(ipaddress.ip_interface('::1/64') > ipaddress.ip_interface('::2/48')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') == + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') < + ipaddress.ip_interface('::1%scope/80')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') < + ipaddress.ip_interface('::2%scope/64')) + self.assertTrue(ipaddress.ip_interface('::2%scope/48') < + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/80') > + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::2%scope/64') > + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') > + ipaddress.ip_interface('::2%scope/48')) + + + self.assertFalse(ipaddress.ip_interface('::1%scope/64') == + ipaddress.ip_interface('::1/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') < + ipaddress.ip_interface('::1/80')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') < + ipaddress.ip_interface('::2/64')) + self.assertTrue(ipaddress.ip_interface('::2%scope/48') < + ipaddress.ip_interface('::1/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/80') > + ipaddress.ip_interface('::1/64')) + self.assertTrue(ipaddress.ip_interface('::2%scope/64') > + ipaddress.ip_interface('::1/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') > + ipaddress.ip_interface('::2/48')) + + self.assertFalse(ipaddress.ip_interface('::1/64') == + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1/64') < + ipaddress.ip_interface('::1%scope/80')) + self.assertTrue(ipaddress.ip_interface('::1/64') < + ipaddress.ip_interface('::2%scope/64')) + self.assertTrue(ipaddress.ip_interface('::2/48') < + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1/80') > + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::2/64') > + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1/64') > + ipaddress.ip_interface('::2%scope/48')) + def testNetworkComparison(self): # ip1 and ip2 have the same network address ip1 = ipaddress.IPv4Network('1.1.1.0/24') @@ -1603,6 +2073,7 @@ class IpaddrUnitTest(unittest.TestCase): ipaddress.ip_network('1.1.1.2')) self.assertFalse(ipaddress.ip_network('1.1.1.2') <= ipaddress.ip_network('1.1.1.1')) + self.assertTrue(ipaddress.ip_network('::1') <= ipaddress.ip_network('::1')) self.assertTrue(ipaddress.ip_network('::1') <= @@ -1613,6 +2084,7 @@ class IpaddrUnitTest(unittest.TestCase): def testStrictNetworks(self): self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24') self.assertRaises(ValueError, ipaddress.ip_network, '::1/120') + self.assertRaises(ValueError, ipaddress.ip_network, '::1%scope/120') def testOverlaps(self): other = ipaddress.IPv4Network('1.2.3.0/30') @@ -1641,13 +2113,28 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'), ipaddress.ip_address('FFFF::c000:201')) + self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'), + ipaddress.ip_address('::FFFF:c000:201%scope')) + self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'), + ipaddress.ip_address('FFFF::c000:201%scope')) + self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'), + ipaddress.ip_address('::FFFF:c000:201')) + self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'), + ipaddress.ip_address('FFFF::c000:201')) + self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1'), + ipaddress.ip_address('::FFFF:c000:201%scope')) + self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1'), + ipaddress.ip_address('FFFF::c000:201%scope')) + def testIPVersion(self): self.assertEqual(self.ipv4_address.version, 4) self.assertEqual(self.ipv6_address.version, 6) + self.assertEqual(self.ipv6_scoped_address.version, 6) def testMaxPrefixLength(self): self.assertEqual(self.ipv4_interface.max_prefixlen, 32) self.assertEqual(self.ipv6_interface.max_prefixlen, 128) + self.assertEqual(self.ipv6_scoped_interface.max_prefixlen, 128) def testPacked(self): self.assertEqual(self.ipv4_address.packed, @@ -1662,6 +2149,14 @@ class IpaddrUnitTest(unittest.TestCase): + b'\x00' * 6) self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed, b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8) + self.assertEqual(self.ipv6_scoped_address.packed, + b'\x20\x01\x06\x58\x02\x2a\xca\xfe' + b'\x02\x00\x00\x00\x00\x00\x00\x01') + self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::%scope').packed, + b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff' + + b'\x00' * 6) + self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0%scope').packed, + b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8) def testIpType(self): ipv4net = ipaddress.ip_network('1.2.3.4') diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py index 22553d5d..52434693 100644 --- a/Lib/test/test_iter.py +++ b/Lib/test/test_iter.py @@ -3,7 +3,7 @@ import sys import unittest from test.support import run_unittest, TESTFN, unlink, cpython_only -from test.support import check_free_after_iterating +from test.support import check_free_after_iterating, ALWAYS_EQ, NEVER_EQ import pickle import collections.abc @@ -41,6 +41,14 @@ class IteratingSequenceClass: def __iter__(self): return BasicIterClass(self.n) +class IteratorProxyClass: + def __init__(self, i): + self.i = i + def __next__(self): + return next(self.i) + def __iter__(self): + return self + class SequenceClass: def __init__(self, n): self.n = n @@ -50,6 +58,12 @@ class SequenceClass: else: raise IndexError +class SequenceProxyClass: + def __init__(self, s): + self.s = s + def __getitem__(self, i): + return self.s[i] + class UnlimitedSequenceClass: def __getitem__(self, i): return i @@ -639,6 +653,13 @@ class TestCase(unittest.TestCase): for i in "abc", -1, 5, 42.42, (3, 4), [], {1: 1}, 3-12j, sc5: self.assertNotIn(i, sc5) + self.assertIn(ALWAYS_EQ, IteratorProxyClass(iter([1]))) + self.assertIn(ALWAYS_EQ, SequenceProxyClass([1])) + self.assertNotIn(ALWAYS_EQ, IteratorProxyClass(iter([NEVER_EQ]))) + self.assertNotIn(ALWAYS_EQ, SequenceProxyClass([NEVER_EQ])) + self.assertIn(NEVER_EQ, IteratorProxyClass(iter([ALWAYS_EQ]))) + self.assertIn(NEVER_EQ, SequenceProxyClass([ALWAYS_EQ])) + self.assertRaises(TypeError, lambda: 3 in 12) self.assertRaises(TypeError, lambda: 3 not in map) self.assertRaises(ZeroDivisionError, lambda: 3 in BadIterableClass()) diff --git a/Lib/test/test_json/test_decode.py b/Lib/test/test_json/test_decode.py index 895c95b5..fdb9e621 100644 --- a/Lib/test/test_json/test_decode.py +++ b/Lib/test/test_json/test_decode.py @@ -95,9 +95,5 @@ class TestDecode: d = self.json.JSONDecoder() self.assertRaises(ValueError, d.raw_decode, 'a'*42, -50000) - def test_deprecated_encode(self): - with self.assertWarns(DeprecationWarning): - self.loads('{}', encoding='fake') - class TestPyDecode(TestDecode, PyTest): pass class TestCDecode(TestDecode, CTest): pass diff --git a/Lib/test/test_json/test_recursion.py b/Lib/test/test_json/test_recursion.py index 877dc448..543c6283 100644 --- a/Lib/test/test_json/test_recursion.py +++ b/Lib/test/test_json/test_recursion.py @@ -52,7 +52,7 @@ class TestRecursion: return [JSONTestObject] else: return 'JSONTestObject' - return pyjson.JSONEncoder.default(o) + return self.json.JSONEncoder.default(o) enc = RecursiveJSONEncoder() self.assertEqual(enc.encode(JSONTestObject), '"JSONTestObject"') diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index a62a5d40..fc2a7a4f 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -3,8 +3,8 @@ import os import sys import textwrap import unittest +import subprocess -from subprocess import Popen, PIPE from test import support from test.support.script_helper import assert_python_ok @@ -86,10 +86,9 @@ class TestTool(unittest.TestCase): def test_stdin_stdout(self): args = sys.executable, '-m', 'json.tool' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - out, err = proc.communicate(self.data.encode()) - self.assertEqual(out.splitlines(), self.expect.encode().splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=self.data, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, self.expect) + self.assertEqual(process.stderr, '') def _create_infile(self, data=None): infile = support.TESTFN @@ -133,10 +132,9 @@ class TestTool(unittest.TestCase): def test_jsonlines(self): args = sys.executable, '-m', 'json.tool', '--json-lines' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - out, err = proc.communicate(self.jsonlines_raw.encode()) - self.assertEqual(out.splitlines(), self.jsonlines_expect.encode().splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=self.jsonlines_raw, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, self.jsonlines_expect) + self.assertEqual(process.stderr, '') def test_help_flag(self): rc, out, err = assert_python_ok('-m', 'json.tool', '-h') @@ -152,10 +150,71 @@ class TestTool(unittest.TestCase): self.expect_without_sort_keys.encode().splitlines()) self.assertEqual(err, b'') + def test_indent(self): + input_ = '[1, 2]' + expect = textwrap.dedent('''\ + [ + 1, + 2 + ] + ''') + args = sys.executable, '-m', 'json.tool', '--indent', '2' + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') + + def test_no_indent(self): + input_ = '[1,\n2]' + expect = '[1, 2]\n' + args = sys.executable, '-m', 'json.tool', '--no-indent' + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') + + def test_tab(self): + input_ = '[1, 2]' + expect = '[\n\t1,\n\t2\n]\n' + args = sys.executable, '-m', 'json.tool', '--tab' + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') + + def test_compact(self): + input_ = '[ 1 ,\n 2]' + expect = '[1,2]\n' + args = sys.executable, '-m', 'json.tool', '--compact' + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') + + def test_no_ensure_ascii_flag(self): + infile = self._create_infile('{"key":"💩"}') + outfile = support.TESTFN + '.out' + self.addCleanup(os.remove, outfile) + assert_python_ok('-m', 'json.tool', '--no-ensure-ascii', infile, outfile) + with open(outfile, "rb") as f: + lines = f.read().splitlines() + # asserting utf-8 encoded output file + expected = [b'{', b' "key": "\xf0\x9f\x92\xa9"', b"}"] + self.assertEqual(lines, expected) + + def test_ensure_ascii_default(self): + infile = self._create_infile('{"key":"💩"}') + outfile = support.TESTFN + '.out' + self.addCleanup(os.remove, outfile) + assert_python_ok('-m', 'json.tool', infile, outfile) + with open(outfile, "rb") as f: + lines = f.read().splitlines() + # asserting an ascii encoded output file + expected = [b'{', rb' "key": "\ud83d\udca9"', b"}"] + self.assertEqual(lines, expected) + @unittest.skipIf(sys.platform =="win32", "The test is failed with ValueError on Windows") def test_broken_pipe_error(self): cmd = [sys.executable, '-m', 'json.tool'] - proc = Popen(cmd, stdout=PIPE, stdin=PIPE) + proc = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE) # bpo-39828: Closing before json.tool attempts to write into stdout. proc.stdout.close() proc.communicate(b'"{}"') diff --git a/Lib/test/test_keyword.py b/Lib/test/test_keyword.py index 3e2a8b3f..e1042cf1 100644 --- a/Lib/test/test_keyword.py +++ b/Lib/test/test_keyword.py @@ -1,5 +1,6 @@ import keyword import unittest +from test.support import use_old_parser class Test_iskeyword(unittest.TestCase): @@ -21,7 +22,10 @@ class Test_iskeyword(unittest.TestCase): self.assertFalse(keyword.iskeyword('eggs')) def test_all_keywords_fail_to_be_used_as_names(self): - for key in keyword.kwlist: + all_keywords = set(keyword.kwlist) + if use_old_parser(): + all_keywords.discard('__peg_parser__') + for key in all_keywords: with self.assertRaises(SyntaxError): exec(f"{key} = 42") diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py index 8870c721..a99b4ba8 100644 --- a/Lib/test/test_largefile.py +++ b/Lib/test/test_largefile.py @@ -5,17 +5,21 @@ import os import stat import sys import unittest +import socket +import shutil +import threading from test.support import TESTFN, requires, unlink, bigmemtest +from test.support import SHORT_TIMEOUT +from test.support import socket_helper import io # C implementation of io import _pyio as pyio # Python implementation of io # size of file to create (>2 GiB; 2 GiB == 2,147,483,648 bytes) size = 2_500_000_000 +TESTFN2 = TESTFN + '2' + class LargeFileTest: - """Test that each file function works as expected for large - (i.e. > 2 GiB) files. - """ def setUp(self): if os.path.exists(TESTFN): @@ -44,6 +48,13 @@ class LargeFileTest: if not os.stat(TESTFN)[stat.ST_SIZE] == 0: raise cls.failureException('File was not truncated by opening ' 'with mode "wb"') + unlink(TESTFN2) + + +class TestFileMethods(LargeFileTest): + """Test that each file function works as expected for large + (i.e. > 2 GiB) files. + """ # _pyio.FileIO.readall() uses a temporary bytearray then casted to bytes, # so memuse=2 is needed @@ -140,6 +151,91 @@ class LargeFileTest: f.seek(pos) self.assertTrue(f.seekable()) + +def skip_no_disk_space(path, required): + def decorator(fun): + def wrapper(*args, **kwargs): + if shutil.disk_usage(os.path.realpath(path)).free < required: + hsize = int(required / 1024 / 1024) + raise unittest.SkipTest( + f"required {hsize} MiB of free disk space") + return fun(*args, **kwargs) + return wrapper + return decorator + + +class TestCopyfile(LargeFileTest, unittest.TestCase): + open = staticmethod(io.open) + + # Exact required disk space would be (size * 2), but let's give it a + # bit more tolerance. + @skip_no_disk_space(TESTFN, size * 2.5) + def test_it(self): + # Internally shutil.copyfile() can use "fast copy" methods like + # os.sendfile(). + size = os.path.getsize(TESTFN) + shutil.copyfile(TESTFN, TESTFN2) + self.assertEqual(os.path.getsize(TESTFN2), size) + with open(TESTFN2, 'rb') as f: + self.assertEqual(f.read(5), b'z\x00\x00\x00\x00') + f.seek(size - 5) + self.assertEqual(f.read(), b'\x00\x00\x00\x00a') + + +@unittest.skipIf(not hasattr(os, 'sendfile'), 'sendfile not supported') +class TestSocketSendfile(LargeFileTest, unittest.TestCase): + open = staticmethod(io.open) + timeout = SHORT_TIMEOUT + + def setUp(self): + super().setUp() + self.thread = None + + def tearDown(self): + super().tearDown() + if self.thread is not None: + self.thread.join(self.timeout) + self.thread = None + + def tcp_server(self, sock): + def run(sock): + with sock: + conn, _ = sock.accept() + conn.settimeout(self.timeout) + with conn, open(TESTFN2, 'wb') as f: + event.wait(self.timeout) + while True: + chunk = conn.recv(65536) + if not chunk: + return + f.write(chunk) + + event = threading.Event() + sock.settimeout(self.timeout) + self.thread = threading.Thread(target=run, args=(sock, )) + self.thread.start() + event.set() + + # Exact required disk space would be (size * 2), but let's give it a + # bit more tolerance. + @skip_no_disk_space(TESTFN, size * 2.5) + def test_it(self): + port = socket_helper.find_unused_port() + with socket.create_server(("", port)) as sock: + self.tcp_server(sock) + with socket.create_connection(("127.0.0.1", port)) as client: + with open(TESTFN, 'rb') as f: + client.sendfile(f) + self.tearDown() + + size = os.path.getsize(TESTFN) + self.assertEqual(os.path.getsize(TESTFN2), size) + with open(TESTFN2, 'rb') as f: + self.assertEqual(f.read(5), b'z\x00\x00\x00\x00') + f.seek(size - 5) + self.assertEqual(f.read(), b'\x00\x00\x00\x00a') + + def setUpModule(): try: import signal @@ -176,14 +272,18 @@ def setUpModule(): unlink(TESTFN) -class CLargeFileTest(LargeFileTest, unittest.TestCase): +class CLargeFileTest(TestFileMethods, unittest.TestCase): open = staticmethod(io.open) -class PyLargeFileTest(LargeFileTest, unittest.TestCase): + +class PyLargeFileTest(TestFileMethods, unittest.TestCase): open = staticmethod(pyio.open) + def tearDownModule(): unlink(TESTFN) + unlink(TESTFN2) + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_lib2to3.py b/Lib/test/test_lib2to3.py index 5eaa5164..15c317e9 100644 --- a/Lib/test/test_lib2to3.py +++ b/Lib/test/test_lib2to3.py @@ -1,5 +1,8 @@ -from lib2to3.tests import load_tests import unittest +from test.support import check_warnings + +with check_warnings(("", PendingDeprecationWarning)): + from lib2to3.tests import load_tests if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index 105ef650..3c8d8295 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -150,6 +150,11 @@ class ListTest(list_tests.CommonTest): a[:] = data self.assertEqual(list(it), []) + def test_step_overflow(self): + a = [0, 1, 2, 3, 4] + a[1::sys.maxsize] = [0] + self.assertEqual(a[3::sys.maxsize], [3]) + def test_no_comdat_folding(self): # Issue 8847: In the PGO build, the MSVC linker's COMDAT folding # optimization causes failures in code that relies on distinct diff --git a/Lib/test/test_listcomps.py b/Lib/test/test_listcomps.py index ddb169fe..62b3319a 100644 --- a/Lib/test/test_listcomps.py +++ b/Lib/test/test_listcomps.py @@ -16,6 +16,22 @@ Test nesting with the inner expression dependent on the outer >>> [(i,j) for i in range(4) for j in range(i)] [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] +Test the idiom for temporary variable assignment in comprehensions. + + >>> [j*j for i in range(4) for j in [i+1]] + [1, 4, 9, 16] + >>> [j*k for i in range(4) for j in [i+1] for k in [j+1]] + [2, 6, 12, 20] + >>> [j*k for i in range(4) for j, k in [(i+1, i+2)]] + [2, 6, 12, 20] + +Not assignment + + >>> [i*i for i in [*range(4)]] + [0, 1, 4, 9] + >>> [i*i for i in (*range(4),)] + [0, 1, 4, 9] + Make sure the induction variable is not exposed >>> i = 20 diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index c5d8e269..2863d200 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -334,8 +334,7 @@ class TestFrFRNumberFormatting(FrFRCookedTest, BaseFormattingTest): euro = '\u20ac' self._test_currency(50000, "50000,00 " + euro) self._test_currency(50000, "50 000,00 " + euro, grouping=True) - # XXX is the trailing space a bug? - self._test_currency(50000, "50 000,00 EUR ", + self._test_currency(50000, "50 000,00 EUR", grouping=True, international=True) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index cea51b45..62759c07 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -1,4 +1,4 @@ -# Copyright 2001-2017 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2019 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -16,7 +16,7 @@ """Test harness for the logging module. Run all tests. -Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved. """ import logging @@ -36,13 +36,14 @@ import os import queue import random import re -import signal import socket import struct import sys import tempfile from test.support.script_helper import assert_python_ok, assert_python_failure from test import support +from test.support import socket_helper +from test.support.logging_helper import TestHandler import textwrap import threading import time @@ -727,30 +728,19 @@ class HandlerTest(BaseTest): locks_held__ready_to_fork.wait() pid = os.fork() - if pid == 0: # Child. + if pid == 0: + # Child process try: test_logger.info(r'Child process did not deadlock. \o/') finally: os._exit(0) - else: # Parent. + else: + # Parent process test_logger.info(r'Parent process returned from fork. \o/') fork_happened__release_locks_and_end_thread.set() lock_holder_thread.join() - start_time = time.monotonic() - while True: - test_logger.debug('Waiting for child process.') - waited_pid, status = os.waitpid(pid, os.WNOHANG) - if waited_pid == pid: - break # child process exited. - if time.monotonic() - start_time > 7: - break # so long? implies child deadlock. - time.sleep(0.05) - test_logger.debug('Done waiting.') - if waited_pid != pid: - os.kill(pid, signal.SIGKILL) - waited_pid, status = os.waitpid(pid, 0) - self.fail("child process deadlocked.") - self.assertEqual(status, 0, msg="child process error") + + support.wait_process(pid, exitcode=0) class BadStream(object): @@ -869,16 +859,13 @@ class TestSMTPServer(smtpd.SMTPServer): """ asyncore.loop(poll_interval, map=self._map) - def stop(self, timeout=None): + def stop(self): """ Stop the thread by closing the server instance. Wait for the server thread to terminate. - - :param timeout: How long to wait for the server thread - to terminate. """ self.close() - support.join_thread(self._thread, timeout) + support.join_thread(self._thread) self._thread = None asyncore.close_all(map=self._map, ignore_all=True) @@ -922,16 +909,13 @@ class ControlMixin(object): self.ready.set() super(ControlMixin, self).serve_forever(poll_interval) - def stop(self, timeout=None): + def stop(self): """ Tell the server thread to stop, and wait for it to do so. - - :param timeout: How long to wait for the server thread - to terminate. """ self.shutdown() if self._thread is not None: - support.join_thread(self._thread, timeout) + support.join_thread(self._thread) self._thread = None self.server_close() self.ready.clear() @@ -1065,15 +1049,15 @@ if hasattr(socket, "AF_UNIX"): # - end of server_helper section class SMTPHandlerTest(BaseTest): - # bpo-14314, bpo-19665, bpo-34092: don't wait forever, timeout of 1 minute - TIMEOUT = 60.0 + # bpo-14314, bpo-19665, bpo-34092: don't wait forever + TIMEOUT = support.LONG_TIMEOUT def test_basic(self): sockmap = {} - server = TestSMTPServer((support.HOST, 0), self.process_message, 0.001, + server = TestSMTPServer((socket_helper.HOST, 0), self.process_message, 0.001, sockmap) server.start() - addr = (support.HOST, server.port) + addr = (socket_helper.HOST, server.port) h = logging.handlers.SMTPHandler(addr, 'me', 'you', 'Log', timeout=self.TIMEOUT) self.assertEqual(h.toaddrs, ['you']) @@ -1612,6 +1596,30 @@ class ConfigFileTest(BaseTest): self.apply_config(self.disable_test, disable_existing_loggers=False) self.assertFalse(logger.disabled) + def test_config_set_handler_names(self): + test_config = """ + [loggers] + keys=root + + [handlers] + keys=hand1 + + [formatters] + keys=form1 + + [logger_root] + handlers=hand1 + + [handler_hand1] + class=StreamHandler + formatter=form1 + + [formatter_form1] + format=%(levelname)s ++ %(message)s + """ + self.apply_config(test_config) + self.assertEqual(logging.getLogger().handlers[0].name, 'hand1') + def test_defaults_do_no_interpolation(self): """bpo-33802 defaults should not get interpolated""" ini = textwrap.dedent(""" @@ -1696,7 +1704,7 @@ class SocketHandlerTest(BaseTest): self.root_logger.removeHandler(self.sock_hdlr) self.sock_hdlr.close() if self.server: - self.server.stop(2.0) + self.server.stop() finally: BaseTest.tearDown(self) @@ -1733,7 +1741,7 @@ class SocketHandlerTest(BaseTest): # one-second timeout on socket.create_connection() (issue #16264). self.sock_hdlr.retryStart = 2.5 # Kill the server - self.server.stop(2.0) + self.server.stop() # The logging call should try to connect, which should fail try: raise RuntimeError('Deliberate mistake') @@ -1807,7 +1815,7 @@ class DatagramHandlerTest(BaseTest): """Shutdown the UDP server.""" try: if self.server: - self.server.stop(2.0) + self.server.stop() if self.sock_hdlr: self.root_logger.removeHandler(self.sock_hdlr) self.sock_hdlr.close() @@ -1888,7 +1896,7 @@ class SysLogHandlerTest(BaseTest): """Shutdown the server.""" try: if self.server: - self.server.stop(2.0) + self.server.stop() if self.sl_hdlr: self.root_logger.removeHandler(self.sl_hdlr) self.sl_hdlr.close() @@ -1935,7 +1943,7 @@ class UnixSysLogHandlerTest(SysLogHandlerTest): SysLogHandlerTest.tearDown(self) support.unlink(self.address) -@unittest.skipUnless(support.IPV6_ENABLED, +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 support required for this test.') class IPv6SysLogHandlerTest(SysLogHandlerTest): @@ -2025,7 +2033,7 @@ class HTTPHandlerTest(BaseTest): self.assertEqual(d['funcName'], ['test_output']) self.assertEqual(d['msg'], [msg]) - self.server.stop(2.0) + self.server.stop() self.root_logger.removeHandler(self.h_hdlr) self.h_hdlr.close() @@ -3225,7 +3233,7 @@ class ConfigDictTest(BaseTest): finally: t.ready.wait(2.0) logging.config.stopListening() - support.join_thread(t, 2.0) + support.join_thread(t) def test_listen_config_10_ok(self): with support.captured_stdout() as output: @@ -3537,7 +3545,7 @@ class QueueHandlerTest(BaseTest): @unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'), 'logging.handlers.QueueListener required for this test') def test_queue_listener(self): - handler = support.TestHandler(support.Matcher()) + handler = TestHandler(support.Matcher()) listener = logging.handlers.QueueListener(self.queue, handler) listener.start() try: @@ -3553,7 +3561,7 @@ class QueueHandlerTest(BaseTest): # Now test with respect_handler_level set - handler = support.TestHandler(support.Matcher()) + handler = TestHandler(support.Matcher()) handler.setLevel(logging.CRITICAL) listener = logging.handlers.QueueListener(self.queue, handler, respect_handler_level=True) @@ -3955,6 +3963,19 @@ class FormatterTest(unittest.TestCase): f.format(r) self.assertEqual(r.asctime, '1993-04-21 08:03:00,123') + def test_default_msec_format_none(self): + class NoMsecFormatter(logging.Formatter): + default_msec_format = None + default_time_format = '%d/%m/%Y %H:%M:%S' + + r = self.get_record() + dt = datetime.datetime(1993, 4, 21, 8, 3, 0, 123, utc) + r.created = time.mktime(dt.astimezone(None).timetuple()) + f = NoMsecFormatter() + f.converter = time.gmtime + self.assertEqual(f.formatTime(r), '21/04/1993 08:03:00') + + class TestBufferingFormatter(logging.BufferingFormatter): def formatHeader(self, records): return '[(%d)' % len(records) @@ -4255,7 +4276,6 @@ class ModuleLevelMiscTest(BaseTest): h.close() logging.setLoggerClass(logging.Logger) - @support.requires_type_collecting def test_logging_at_shutdown(self): # Issue #20037 code = """if 1: @@ -4528,6 +4548,99 @@ class BasicConfigTest(unittest.TestCase): self.assertEqual(new_string_io.getvalue().strip(), 'WARNING:root:warn\nINFO:root:info') + def test_encoding(self): + try: + encoding = 'utf-8' + logging.basicConfig(filename='test.log', encoding=encoding, + errors='strict', + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + logging.debug('The Øresund Bridge joins Copenhagen to Malmö') + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + self.assertEqual(data, + 'The Øresund Bridge joins Copenhagen to Malmö') + + def test_encoding_errors(self): + try: + encoding = 'ascii' + logging.basicConfig(filename='test.log', encoding=encoding, + errors='ignore', + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + logging.debug('The Øresund Bridge joins Copenhagen to Malmö') + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + self.assertEqual(data, 'The resund Bridge joins Copenhagen to Malm') + + def test_encoding_errors_default(self): + try: + encoding = 'ascii' + logging.basicConfig(filename='test.log', encoding=encoding, + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + self.assertEqual(handler.errors, 'backslashreplace') + logging.debug('😂: ☃️: The Øresund Bridge joins Copenhagen to Malmö') + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + self.assertEqual(data, r'\U0001f602: \u2603\ufe0f: The \xd8resund ' + r'Bridge joins Copenhagen to Malm\xf6') + + def test_encoding_errors_none(self): + # Specifying None should behave as 'strict' + try: + encoding = 'ascii' + logging.basicConfig(filename='test.log', encoding=encoding, + errors=None, + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + self.assertIsNone(handler.errors) + + message = [] + + def dummy_handle_error(record): + _, v, _ = sys.exc_info() + message.append(str(v)) + + handler.handleError = dummy_handle_error + logging.debug('The Øresund Bridge joins Copenhagen to Malmö') + self.assertTrue(message) + self.assertIn("'ascii' codec can't encode " + "character '\\xd8' in position 4:", message[0]) + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + # didn't write anything due to the encoding error + self.assertEqual(data, r'') + + def _test_log(self, method, level=None): # logging.root has no handlers so basicConfig should be called called = [] @@ -4815,6 +4928,7 @@ class LoggerTest(BaseTest): self.assertIs(root, logging.root) self.assertIs(root, logging.getLogger(None)) self.assertIs(root, logging.getLogger('')) + self.assertIs(root, logging.getLogger('root')) self.assertIs(root, logging.getLogger('foo').root) self.assertIs(root, logging.getLogger('foo.bar').root) self.assertIs(root, logging.getLogger('foo').parent) @@ -4964,7 +5078,26 @@ class RotatingFileHandlerTest(BaseFileTest): self.assertFalse(os.path.exists(namer(self.fn + ".3"))) rh.close() - @support.requires_zlib + def test_namer_rotator_inheritance(self): + class HandlerWithNamerAndRotator(logging.handlers.RotatingFileHandler): + def namer(self, name): + return name + ".test" + + def rotator(self, source, dest): + if os.path.exists(source): + os.rename(source, dest + ".rotated") + + rh = HandlerWithNamerAndRotator( + self.fn, backupCount=2, maxBytes=1) + self.assertEqual(rh.namer(self.fn), self.fn + ".test") + rh.emit(self.next_rec()) + self.assertLogFile(self.fn) + rh.emit(self.next_rec()) + self.assertLogFile(rh.namer(self.fn + ".1") + ".rotated") + self.assertFalse(os.path.exists(rh.namer(self.fn + ".1"))) + rh.close() + + @support.requires_zlib() def test_rotator(self): def namer(name): return name + ".gz" diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index 53101b3b..7ce37e8d 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -956,6 +956,14 @@ class LongTest(unittest.TestCase): self.assertEqual(huge >> (sys.maxsize + 1), (1 << 499) + 5) self.assertEqual(huge >> (sys.maxsize + 1000), 0) + @support.cpython_only + def test_small_ints_in_huge_calculation(self): + a = 2 ** 100 + b = -a + 1 + c = a + 1 + self.assertIs(a + b, 1) + self.assertIs(c - a, 1) + def test_small_ints(self): for i in range(-5, 257): self.assertIs(i, i + 0) diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py index f24ed3ca..0f3af27e 100644 --- a/Lib/test/test_lzma.py +++ b/Lib/test/test_lzma.py @@ -350,7 +350,7 @@ class CompressorDecompressorTestCase(unittest.TestCase): def test_decompressor_bigmem(self, size): lzd = LZMADecompressor() blocksize = 10 * 1024 * 1024 - block = random.getrandbits(blocksize * 8).to_bytes(blocksize, "little") + block = random.randbytes(blocksize) try: input = block * (size // blocksize + 1) cdata = lzma.compress(input) diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py index effac97d..6f891d41 100644 --- a/Lib/test/test_mailbox.py +++ b/Lib/test/test_mailbox.py @@ -1092,7 +1092,7 @@ class _TestMboxMMDF(_TestSingleFile): # Signal the child it can now release the lock and exit. p.send(b'p') # Wait for child to exit. Locking should now succeed. - exited_pid, status = os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) self._box.lock() self._box.unlock() @@ -1420,7 +1420,7 @@ class TestMessage(TestBase, unittest.TestCase): # Initialize with invalid argument self.assertRaises(TypeError, lambda: self._factory(object())) - def test_all_eMM_attribues_exist(self): + def test_all_eMM_attributes_exist(self): # Issue 12537 eMM = email.message_from_string(_sample_message) msg = self._factory(_sample_message) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 4a1ba830..4b848a5e 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -53,30 +53,6 @@ def to_ulps(x): return n -def ulp(x): - """Return the value of the least significant bit of a - float x, such that the first float bigger than x is x+ulp(x). - Then, given an expected result x and a tolerance of n ulps, - the result y should be such that abs(y-x) <= n * ulp(x). - The results from this function will only make sense on platforms - where native doubles are represented in IEEE 754 binary64 format. - """ - x = abs(float(x)) - if math.isnan(x) or math.isinf(x): - return x - - # Find next float up from x. - n = struct.unpack('>> Another way. diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index 70965854..1663b1f1 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -1152,6 +1152,22 @@ class MinidomTest(unittest.TestCase): doc.unlink() + def testStandalone(self): + doc = parseString('') + self.assertEqual(doc.toxml(), + '\u20ac') + self.assertEqual(doc.toxml(standalone=None), + '\u20ac') + self.assertEqual(doc.toxml(standalone=True), + '\u20ac') + self.assertEqual(doc.toxml(standalone=False), + '\u20ac') + self.assertEqual(doc.toxml('utf-8', True), + b'' + b'\xe2\x82\xac') + + doc.unlink() + class UserDataHandler: called = 0 def handle(self, operation, key, data, src, dst): diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 88c501d8..5400f25f 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -740,6 +740,42 @@ class MmapTests(unittest.TestCase): # See bpo-34754 for details. self.assertRaises(OSError, mm.flush, 1, len(b'python')) + def test_repr(self): + open_mmap_repr_pat = re.compile( + r"\S+), " + r"length=(?P\d+), " + r"pos=(?P\d+), " + r"offset=(?P\d+)>") + closed_mmap_repr_pat = re.compile(r"") + mapsizes = (50, 100, 1_000, 1_000_000, 10_000_000) + offsets = tuple((mapsize // 2 // mmap.ALLOCATIONGRANULARITY) + * mmap.ALLOCATIONGRANULARITY for mapsize in mapsizes) + for offset, mapsize in zip(offsets, mapsizes): + data = b'a' * mapsize + length = mapsize - offset + accesses = ('ACCESS_DEFAULT', 'ACCESS_READ', + 'ACCESS_COPY', 'ACCESS_WRITE') + positions = (0, length//10, length//5, length//4) + with open(TESTFN, "wb+") as fp: + fp.write(data) + fp.flush() + for access, pos in itertools.product(accesses, positions): + accint = getattr(mmap, access) + with mmap.mmap(fp.fileno(), + length, + access=accint, + offset=offset) as mm: + mm.seek(pos) + match = open_mmap_repr_pat.match(repr(mm)) + self.assertIsNotNone(match) + self.assertEqual(match.group('access'), access) + self.assertEqual(match.group('length'), str(length)) + self.assertEqual(match.group('pos'), str(pos)) + self.assertEqual(match.group('offset'), str(offset)) + match = closed_mmap_repr_pat.match(repr(mm)) + self.assertIsNotNone(match) + @unittest.skipUnless(hasattr(mmap.mmap, 'madvise'), 'needs madvise') def test_madvise(self): size = 2 * PAGESIZE diff --git a/Lib/test/test_module.py b/Lib/test/test_module.py index efe9a8ed..1d445635 100644 --- a/Lib/test/test_module.py +++ b/Lib/test/test_module.py @@ -1,7 +1,7 @@ # Test the module type import unittest import weakref -from test.support import gc_collect, requires_type_collecting +from test.support import gc_collect from test.support.script_helper import assert_python_ok import sys @@ -101,7 +101,6 @@ class ModuleTests(unittest.TestCase): gc_collect() self.assertEqual(f().__dict__["bar"], 4) - @requires_type_collecting def test_clear_dict_in_ref_cycle(self): destroyed = [] m = ModuleType("foo") @@ -266,7 +265,6 @@ a = A(destroyed)""" self.assertEqual(r[-len(ends_with):], ends_with, '{!r} does not end with {!r}'.format(r, ends_with)) - @requires_type_collecting def test_module_finalization_at_shutdown(self): # Module globals and builtins should still be available during shutdown rc, out, err = assert_python_ok("-c", "from test import final_a") diff --git a/Lib/test/test_msilib.py b/Lib/test/test_msilib.py index 153a8ac0..4a233c37 100644 --- a/Lib/test/test_msilib.py +++ b/Lib/test/test_msilib.py @@ -1,13 +1,13 @@ """ Test suite for the code in msilib """ import os import unittest -from test.support import TESTFN, FS_NONASCII, import_module, unlink +from test.support import TESTFN, import_module, unlink msilib = import_module('msilib') import msilib.schema def init_database(): - path = TESTFN + (FS_NONASCII or '') + '.msi' + path = TESTFN + '.msi' db = msilib.init_database( path, msilib.schema, diff --git a/Lib/test/test_named_expressions.py b/Lib/test/test_named_expressions.py index 3ae557f7..c813830c 100644 --- a/Lib/test/test_named_expressions.py +++ b/Lib/test/test_named_expressions.py @@ -1,4 +1,3 @@ -import os import unittest GLOBAL_VAR = None diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index fbd7db03..1df64fa7 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -5,13 +5,14 @@ import textwrap import unittest import functools import contextlib +import nntplib import os.path import re import threading from test import support +from test.support import socket_helper from nntplib import NNTP, GroupInfo -import nntplib from unittest.mock import patch try: import ssl @@ -19,7 +20,6 @@ except ImportError: ssl = None -TIMEOUT = 30 certfile = os.path.join(os.path.dirname(__file__), 'keycert3.pem') if ssl is not None: @@ -246,7 +246,7 @@ class NetworkedNNTPTestsMixin: def wrap_meth(meth): @functools.wraps(meth) def wrapped(self): - with support.transient_internet(self.NNTP_HOST): + with socket_helper.transient_internet(self.NNTP_HOST): meth(self) return wrapped for name in dir(cls): @@ -259,6 +259,10 @@ class NetworkedNNTPTestsMixin: # value setattr(cls, name, wrap_meth(meth)) + def test_timeout(self): + with self.assertRaises(ValueError): + self.NNTP_CLASS(self.NNTP_HOST, timeout=0, usenetrc=False) + def test_with_statement(self): def is_connected(): if not hasattr(server, 'file'): @@ -270,12 +274,18 @@ class NetworkedNNTPTestsMixin: return True try: - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + server = self.NNTP_CLASS(self.NNTP_HOST, + timeout=support.INTERNET_TIMEOUT, + usenetrc=False) + with server: self.assertTrue(is_connected()) self.assertTrue(server.help()) self.assertFalse(is_connected()) - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + server = self.NNTP_CLASS(self.NNTP_HOST, + timeout=support.INTERNET_TIMEOUT, + usenetrc=False) + with server: server.quit() self.assertFalse(is_connected()) except SSLError as ssl_err: @@ -305,9 +315,10 @@ class NetworkedNNTPTests(NetworkedNNTPTestsMixin, unittest.TestCase): @classmethod def setUpClass(cls): support.requires("network") - with support.transient_internet(cls.NNTP_HOST): + with socket_helper.transient_internet(cls.NNTP_HOST): try: - cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, timeout=TIMEOUT, + cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, + timeout=support.INTERNET_TIMEOUT, usenetrc=False) except SSLError as ssl_err: # matches "[SSL: DH_KEY_TOO_SMALL] dh key too small" @@ -400,6 +411,18 @@ def make_mock_file(handler): return (sio, file) +class NNTPServer(nntplib.NNTP): + + def __init__(self, f, host, readermode=None): + self.file = f + self.host = host + self._base_init(readermode) + + def _close(self): + self.file.close() + del self.file + + class MockedNNTPTestsMixin: # Override in derived classes handler_class = None @@ -415,7 +438,7 @@ class MockedNNTPTestsMixin: def make_server(self, *args, **kwargs): self.handler = self.handler_class() self.sio, file = make_mock_file(self.handler) - self.server = nntplib._NNTPBase(file, 'test.server', *args, **kwargs) + self.server = NNTPServer(file, 'test.server', *args, **kwargs) return self.server @@ -1545,14 +1568,14 @@ class MockSslTests(MockSocketTests): class LocalServerTests(unittest.TestCase): def setUp(self): sock = socket.socket() - port = support.bind_port(sock) + port = socket_helper.bind_port(sock) sock.listen() self.background = threading.Thread( target=self.run_server, args=(sock,)) self.background.start() self.addCleanup(self.background.join) - self.nntp = NNTP(support.HOST, port, usenetrc=False).__enter__() + self.nntp = NNTP(socket_helper.HOST, port, usenetrc=False).__enter__() self.addCleanup(self.nntp.__exit__, None, None, None) def run_server(self, sock): diff --git a/Lib/test/test_normalization.py b/Lib/test/test_normalization.py deleted file mode 100644 index ba877e73..00000000 --- a/Lib/test/test_normalization.py +++ /dev/null @@ -1,117 +0,0 @@ -from test.support import open_urlresource -import unittest - -from http.client import HTTPException -import sys -from unicodedata import normalize, is_normalized, unidata_version - -TESTDATAFILE = "NormalizationTest.txt" -TESTDATAURL = "http://www.pythontest.net/unicode/" + unidata_version + "/" + TESTDATAFILE - -def check_version(testfile): - hdr = testfile.readline() - return unidata_version in hdr - -class RangeError(Exception): - pass - -def NFC(str): - return normalize("NFC", str) - -def NFKC(str): - return normalize("NFKC", str) - -def NFD(str): - return normalize("NFD", str) - -def NFKD(str): - return normalize("NFKD", str) - -def unistr(data): - data = [int(x, 16) for x in data.split(" ")] - for x in data: - if x > sys.maxunicode: - raise RangeError - return "".join([chr(x) for x in data]) - -class NormalizationTest(unittest.TestCase): - def test_main(self): - # Hit the exception early - try: - testdata = open_urlresource(TESTDATAURL, encoding="utf-8", - check=check_version) - except PermissionError: - self.skipTest(f"Permission error when downloading {TESTDATAURL} " - f"into the test data directory") - except (OSError, HTTPException): - self.fail(f"Could not retrieve {TESTDATAURL}") - - with testdata: - self.run_normalization_tests(testdata) - - def run_normalization_tests(self, testdata): - part = None - part1_data = {} - - for line in testdata: - if '#' in line: - line = line.split('#')[0] - line = line.strip() - if not line: - continue - if line.startswith("@Part"): - part = line.split()[0] - continue - try: - c1,c2,c3,c4,c5 = [unistr(x) for x in line.split(';')[:-1]] - except RangeError: - # Skip unsupported characters; - # try at least adding c1 if we are in part1 - if part == "@Part1": - try: - c1 = unistr(line.split(';')[0]) - except RangeError: - pass - else: - part1_data[c1] = 1 - continue - - # Perform tests - self.assertTrue(c2 == NFC(c1) == NFC(c2) == NFC(c3), line) - self.assertTrue(c4 == NFC(c4) == NFC(c5), line) - self.assertTrue(c3 == NFD(c1) == NFD(c2) == NFD(c3), line) - self.assertTrue(c5 == NFD(c4) == NFD(c5), line) - self.assertTrue(c4 == NFKC(c1) == NFKC(c2) == \ - NFKC(c3) == NFKC(c4) == NFKC(c5), - line) - self.assertTrue(c5 == NFKD(c1) == NFKD(c2) == \ - NFKD(c3) == NFKD(c4) == NFKD(c5), - line) - - self.assertTrue(is_normalized("NFC", c2)) - self.assertTrue(is_normalized("NFC", c4)) - - self.assertTrue(is_normalized("NFD", c3)) - self.assertTrue(is_normalized("NFD", c5)) - - self.assertTrue(is_normalized("NFKC", c4)) - self.assertTrue(is_normalized("NFKD", c5)) - - # Record part 1 data - if part == "@Part1": - part1_data[c1] = 1 - - # Perform tests for all other data - for c in range(sys.maxunicode+1): - X = chr(c) - if X in part1_data: - continue - self.assertTrue(X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X), c) - - def test_bug_834676(self): - # Check for bug 834676 - normalize('NFC', '\ud55c\uae00') - - -if __name__ == "__main__": - unittest.main() diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index 4a02db28..6f881f19 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -725,7 +725,7 @@ class PathLikeTests(NtpathTestCase): path = ntpath def setUp(self): - self.file_name = support.TESTFN.lower() + self.file_name = support.TESTFN self.file_path = FakePath(support.TESTFN) self.addCleanup(support.unlink, self.file_name) with open(self.file_name, 'xb', 0) as file: diff --git a/Lib/test/test_ordered_dict.py b/Lib/test/test_ordered_dict.py index 085e5f60..fdea44e4 100644 --- a/Lib/test/test_ordered_dict.py +++ b/Lib/test/test_ordered_dict.py @@ -407,9 +407,9 @@ class OrderedDictTests: self.assertEqual(list(od), list('abcde')) od.move_to_end('c') self.assertEqual(list(od), list('abdec')) - od.move_to_end('c', 0) + od.move_to_end('c', False) self.assertEqual(list(od), list('cabde')) - od.move_to_end('c', 0) + od.move_to_end('c', False) self.assertEqual(list(od), list('cabde')) od.move_to_end('e') self.assertEqual(list(od), list('cabde')) @@ -418,7 +418,7 @@ class OrderedDictTests: with self.assertRaises(KeyError): od.move_to_end('x') with self.assertRaises(KeyError): - od.move_to_end('x', 0) + od.move_to_end('x', False) def test_move_to_end_issue25406(self): OrderedDict = self.OrderedDict @@ -654,6 +654,49 @@ class OrderedDictTests: support.check_free_after_iterating(self, lambda d: iter(d.values()), self.OrderedDict) support.check_free_after_iterating(self, lambda d: iter(d.items()), self.OrderedDict) + def test_merge_operator(self): + OrderedDict = self.OrderedDict + + a = OrderedDict({0: 0, 1: 1, 2: 1}) + b = OrderedDict({1: 1, 2: 2, 3: 3}) + + c = a.copy() + d = a.copy() + c |= b + d |= list(b.items()) + expected = OrderedDict({0: 0, 1: 1, 2: 2, 3: 3}) + self.assertEqual(a | dict(b), expected) + self.assertEqual(a | b, expected) + self.assertEqual(c, expected) + self.assertEqual(d, expected) + + c = b.copy() + c |= a + expected = OrderedDict({1: 1, 2: 1, 3: 3, 0: 0}) + self.assertEqual(dict(b) | a, expected) + self.assertEqual(b | a, expected) + self.assertEqual(c, expected) + + self.assertIs(type(a | b), OrderedDict) + self.assertIs(type(dict(a) | b), OrderedDict) + self.assertIs(type(a | dict(b)), OrderedDict) + + expected = a.copy() + a |= () + a |= "" + self.assertEqual(a, expected) + + with self.assertRaises(TypeError): + a | None + with self.assertRaises(TypeError): + a | () + with self.assertRaises(TypeError): + a | "BAD" + with self.assertRaises(TypeError): + a | "" + with self.assertRaises(ValueError): + a |= "BAD" + class PurePythonOrderedDictTests(OrderedDictTests, unittest.TestCase): diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 2a4ae157..bf1cb5f5 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -25,10 +25,12 @@ import sysconfig import tempfile import threading import time +import types import unittest import uuid import warnings from test import support +from test.support import socket_helper from platform import win32_is_iot try: @@ -953,17 +955,40 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol): value_str = value.decode(sys.getfilesystemencoding(), 'surrogateescape') self.assertEqual(os.environ['bytes'], value_str) + def test_putenv_unsetenv(self): + name = "PYTHONTESTVAR" + value = "testvalue" + code = f'import os; print(repr(os.environ.get({name!r})))' + + with support.EnvironmentVarGuard() as env: + env.pop(name, None) + + os.putenv(name, value) + proc = subprocess.run([sys.executable, '-c', code], check=True, + stdout=subprocess.PIPE, text=True) + self.assertEqual(proc.stdout.rstrip(), repr(value)) + + os.unsetenv(name) + proc = subprocess.run([sys.executable, '-c', code], check=True, + stdout=subprocess.PIPE, text=True) + self.assertEqual(proc.stdout.rstrip(), repr(None)) + # On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415). @support.requires_mac_ver(10, 6) - def test_unset_error(self): + def test_putenv_unsetenv_error(self): + # Empty variable name is invalid. + # "=" and null character are not allowed in a variable name. + for name in ('', '=name', 'na=me', 'name=', 'name\0', 'na\0me'): + self.assertRaises((OSError, ValueError), os.putenv, name, "value") + self.assertRaises((OSError, ValueError), os.unsetenv, name) + if sys.platform == "win32": - # an environment variable is limited to 32,767 characters - key = 'x' * 50000 - self.assertRaises(ValueError, os.environ.__delitem__, key) - else: - # "=" is not allowed in a variable name - key = 'key=' - self.assertRaises(OSError, os.environ.__delitem__, key) + # On Windows, an environment variable string ("name=value" string) + # is limited to 32,767 characters + longstr = 'x' * 32_768 + self.assertRaises(ValueError, os.putenv, longstr, "1") + self.assertRaises(ValueError, os.putenv, "X", longstr) + self.assertRaises(ValueError, os.unsetenv, longstr) def test_key_type(self): missing = 'missingkey' @@ -1003,6 +1028,96 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol): def test_iter_error_when_changing_os_environ_values(self): self._test_environ_iteration(os.environ.values()) + def _test_underlying_process_env(self, var, expected): + if not (unix_shell and os.path.exists(unix_shell)): + return + + with os.popen(f"{unix_shell} -c 'echo ${var}'") as popen: + value = popen.read().strip() + + self.assertEqual(expected, value) + + def test_or_operator(self): + overridden_key = '_TEST_VAR_' + original_value = 'original_value' + os.environ[overridden_key] = original_value + + new_vars_dict = {'_A_': '1', '_B_': '2', overridden_key: '3'} + expected = dict(os.environ) + expected.update(new_vars_dict) + + actual = os.environ | new_vars_dict + self.assertDictEqual(expected, actual) + self.assertEqual('3', actual[overridden_key]) + + new_vars_items = new_vars_dict.items() + self.assertIs(NotImplemented, os.environ.__or__(new_vars_items)) + + self._test_underlying_process_env('_A_', '') + self._test_underlying_process_env(overridden_key, original_value) + + def test_ior_operator(self): + overridden_key = '_TEST_VAR_' + os.environ[overridden_key] = 'original_value' + + new_vars_dict = {'_A_': '1', '_B_': '2', overridden_key: '3'} + expected = dict(os.environ) + expected.update(new_vars_dict) + + os.environ |= new_vars_dict + self.assertEqual(expected, os.environ) + self.assertEqual('3', os.environ[overridden_key]) + + self._test_underlying_process_env('_A_', '1') + self._test_underlying_process_env(overridden_key, '3') + + def test_ior_operator_invalid_dicts(self): + os_environ_copy = os.environ.copy() + with self.assertRaises(TypeError): + dict_with_bad_key = {1: '_A_'} + os.environ |= dict_with_bad_key + + with self.assertRaises(TypeError): + dict_with_bad_val = {'_A_': 1} + os.environ |= dict_with_bad_val + + # Check nothing was added. + self.assertEqual(os_environ_copy, os.environ) + + def test_ior_operator_key_value_iterable(self): + overridden_key = '_TEST_VAR_' + os.environ[overridden_key] = 'original_value' + + new_vars_items = (('_A_', '1'), ('_B_', '2'), (overridden_key, '3')) + expected = dict(os.environ) + expected.update(new_vars_items) + + os.environ |= new_vars_items + self.assertEqual(expected, os.environ) + self.assertEqual('3', os.environ[overridden_key]) + + self._test_underlying_process_env('_A_', '1') + self._test_underlying_process_env(overridden_key, '3') + + def test_ror_operator(self): + overridden_key = '_TEST_VAR_' + original_value = 'original_value' + os.environ[overridden_key] = original_value + + new_vars_dict = {'_A_': '1', '_B_': '2', overridden_key: '3'} + expected = dict(new_vars_dict) + expected.update(os.environ) + + actual = new_vars_dict | os.environ + self.assertDictEqual(expected, actual) + self.assertEqual(original_value, actual[overridden_key]) + + new_vars_items = new_vars_dict.items() + self.assertIs(NotImplemented, os.environ.__ror__(new_vars_items)) + + self._test_underlying_process_env('_A_', '') + self._test_underlying_process_env(overridden_key, original_value) + class WalkTests(unittest.TestCase): """Tests for os.walk().""" @@ -1058,7 +1173,7 @@ class WalkTests(unittest.TestCase): os.makedirs(t2_path) for path in tmp1_path, tmp2_path, tmp3_path, tmp4_path, tmp5_path: - with open(path, "x") as f: + with open(path, "x", encoding='utf-8') as f: f.write("I'm " + path + " and proud of it. Blame test_os.\n") if support.can_symlink(): @@ -2244,7 +2359,7 @@ class Win32ListdirTests(unittest.TestCase): file_name = 'FILE%d' % i file_path = os.path.join(support.TESTFN, file_name) os.makedirs(dir_path) - with open(file_path, 'w') as f: + with open(file_path, 'w', encoding='utf-8') as f: f.write("I'm %s and proud of it. Blame test_os.\n" % file_path) self.created_paths.extend([dir_name, file_name]) self.created_paths.sort() @@ -2675,7 +2790,7 @@ class PidTests(unittest.TestCase): # We are the parent of our subprocess self.assertEqual(int(stdout), os.getpid()) - def check_waitpid(self, code, exitcode): + def check_waitpid(self, code, exitcode, callback=None): if sys.platform == 'win32': # On Windows, os.spawnv() simply joins arguments with spaces: # arguments need to be quoted @@ -2684,29 +2799,58 @@ class PidTests(unittest.TestCase): args = [sys.executable, '-c', code] pid = os.spawnv(os.P_NOWAIT, sys.executable, args) + if callback is not None: + callback(pid) + + # don't use support.wait_process() to test directly os.waitpid() + # and os.waitstatus_to_exitcode() pid2, status = os.waitpid(pid, 0) - if sys.platform == 'win32': - self.assertEqual(status, exitcode << 8) - else: - self.assertTrue(os.WIFEXITED(status), status) - self.assertEqual(os.WEXITSTATUS(status), exitcode) + self.assertEqual(os.waitstatus_to_exitcode(status), exitcode) self.assertEqual(pid2, pid) def test_waitpid(self): self.check_waitpid(code='pass', exitcode=0) - def test_waitpid_exitcode(self): + def test_waitstatus_to_exitcode(self): exitcode = 23 code = f'import sys; sys.exit({exitcode})' self.check_waitpid(code, exitcode=exitcode) + with self.assertRaises(TypeError): + os.waitstatus_to_exitcode(0.0) + @unittest.skipUnless(sys.platform == 'win32', 'win32-specific test') def test_waitpid_windows(self): - # bpo-40138: test os.waitpid() with exit code larger than INT_MAX. + # bpo-40138: test os.waitpid() and os.waitstatus_to_exitcode() + # with exit code larger than INT_MAX. STATUS_CONTROL_C_EXIT = 0xC000013A code = f'import _winapi; _winapi.ExitProcess({STATUS_CONTROL_C_EXIT})' self.check_waitpid(code, exitcode=STATUS_CONTROL_C_EXIT) + @unittest.skipUnless(sys.platform == 'win32', 'win32-specific test') + def test_waitstatus_to_exitcode_windows(self): + max_exitcode = 2 ** 32 - 1 + for exitcode in (0, 1, 5, max_exitcode): + self.assertEqual(os.waitstatus_to_exitcode(exitcode << 8), + exitcode) + + # invalid values + with self.assertRaises(ValueError): + os.waitstatus_to_exitcode((max_exitcode + 1) << 8) + with self.assertRaises(OverflowError): + os.waitstatus_to_exitcode(-1) + + # Skip the test on Windows + @unittest.skipUnless(hasattr(signal, 'SIGKILL'), 'need signal.SIGKILL') + def test_waitstatus_to_exitcode_kill(self): + code = f'import time; time.sleep({support.LONG_TIMEOUT})' + signum = signal.SIGKILL + + def kill_process(pid): + os.kill(pid, signum) + + self.check_waitpid(code, exitcode=-signum, callback=kill_process) + class SpawnTests(unittest.TestCase): def create_args(self, *, with_env=False, use_bytes=False): @@ -2767,6 +2911,10 @@ class SpawnTests(unittest.TestCase): exitcode = os.spawnv(os.P_WAIT, args[0], args) self.assertEqual(exitcode, self.exitcode) + # Test for PyUnicode_FSConverter() + exitcode = os.spawnv(os.P_WAIT, FakePath(args[0]), args) + self.assertEqual(exitcode, self.exitcode) + @requires_os_func('spawnve') def test_spawnve(self): args = self.create_args(with_env=True) @@ -2789,14 +2937,7 @@ class SpawnTests(unittest.TestCase): def test_nowait(self): args = self.create_args() pid = os.spawnv(os.P_NOWAIT, args[0], args) - result = os.waitpid(pid, 0) - self.assertEqual(result[0], pid) - status = result[1] - if hasattr(os, 'WIFEXITED'): - self.assertTrue(os.WIFEXITED(status)) - self.assertEqual(os.WEXITSTATUS(status), self.exitcode) - else: - self.assertEqual(status, self.exitcode << 8) + support.wait_process(pid, exitcode=self.exitcode) @requires_os_func('spawnve') def test_spawnve_bytes(self): @@ -3031,7 +3172,7 @@ class TestSendfile(unittest.TestCase): support.unlink(support.TESTFN) def setUp(self): - self.server = SendfileTestServer((support.HOST, 0)) + self.server = SendfileTestServer((socket_helper.HOST, 0)) self.server.start() self.client = socket.socket() self.client.connect((self.server.host, self.server.port)) @@ -3135,11 +3276,12 @@ class TestSendfile(unittest.TestCase): def test_keywords(self): # Keyword arguments should be supported - os.sendfile(out=self.sockno, offset=0, count=4096, - **{'in': self.fileno}) + os.sendfile(out_fd=self.sockno, in_fd=self.fileno, + offset=0, count=4096) if self.SUPPORT_HEADERS_TRAILERS: - os.sendfile(self.sockno, self.fileno, offset=0, count=4096, - headers=(), trailers=(), flags=0) + os.sendfile(out_fd=self.sockno, in_fd=self.fileno, + offset=0, count=4096, + headers=(), trailers=(), flags=0) # --- headers / trailers tests @@ -3343,7 +3485,11 @@ class TermsizeTests(unittest.TestCase): should work too. """ try: - size = subprocess.check_output(['stty', 'size']).decode().split() + size = ( + subprocess.check_output( + ["stty", "size"], stderr=subprocess.DEVNULL, text=True + ).split() + ) except (FileNotFoundError, subprocess.CalledProcessError, PermissionError): self.skipTest("stty invocation failed") @@ -3591,7 +3737,7 @@ class PathTConverterTests(unittest.TestCase): if os.name == 'nt': bytes_fspath = bytes_filename = None else: - bytes_filename = support.TESTFN.encode('ascii') + bytes_filename = os.fsencode(support.TESTFN) bytes_fspath = FakePath(bytes_filename) fd = os.open(FakePath(str_filename), os.O_WRONLY|os.O_CREAT) self.addCleanup(support.unlink, support.TESTFN) @@ -3662,6 +3808,24 @@ class ExportsTests(unittest.TestCase): self.assertIn('walk', os.__all__) +class TestDirEntry(unittest.TestCase): + def setUp(self): + self.path = os.path.realpath(support.TESTFN) + self.addCleanup(support.rmtree, self.path) + os.mkdir(self.path) + + def test_uninstantiable(self): + self.assertRaises(TypeError, os.DirEntry) + + def test_unpickable(self): + filename = create_file(os.path.join(self.path, "file.txt"), b'python') + entry = [entry for entry in os.scandir(self.path)].pop() + self.assertIsInstance(entry, os.DirEntry) + self.assertEqual(entry.name, "file.txt") + import pickle + self.assertRaises(TypeError, pickle.dumps, entry, filename) + + class TestScandir(unittest.TestCase): check_no_resource_warning = support.check_no_resource_warning @@ -3696,6 +3860,18 @@ class TestScandir(unittest.TestCase): else: self.assertEqual(stat1, stat2) + def test_uninstantiable(self): + scandir_iter = os.scandir(self.path) + self.assertRaises(TypeError, type(scandir_iter)) + scandir_iter.close() + + def test_unpickable(self): + filename = self.create_file("file.txt") + scandir_iter = os.scandir(self.path) + import pickle + self.assertRaises(TypeError, pickle.dumps, scandir_iter, filename) + scandir_iter.close() + def check_entry(self, entry, name, is_dir, is_file, is_symlink): self.assertIsInstance(entry, os.DirEntry) self.assertEqual(entry.name, name) @@ -4050,6 +4226,9 @@ class TestPEP519(unittest.TestCase): self.assertFalse(issubclass(FakePath, A)) self.assertTrue(issubclass(FakePath, os.PathLike)) + def test_pathlike_class_getitem(self): + self.assertIsInstance(os.PathLike[bytes], types.GenericAlias) + class TimesTests(unittest.TestCase): def test_times(self): diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py index e5285c63..a4d2cdc0 100644 --- a/Lib/test/test_parser.py +++ b/Lib/test/test_parser.py @@ -1,11 +1,16 @@ import copy -import parser +import warnings +with warnings.catch_warnings(): + warnings.filterwarnings('ignore', 'The parser module is deprecated', + DeprecationWarning) + import parser import pickle import unittest import operator import struct from test import support from test.support.script_helper import assert_python_failure +from test.support.script_helper import assert_python_ok # # First, we test that we can generate trees from valid source fragments, @@ -221,6 +226,27 @@ class RoundtripLegalSyntaxTestCase(unittest.TestCase): self.check_suite("@funcattrs()\n" "def f(): pass") + self.check_suite("@False or x\n" + "def f(): pass") + self.check_suite("@d := x\n" + "def f(): pass") + self.check_suite("@lambda f: x(f)\n" + "def f(): pass") + self.check_suite("@[..., x, ...][1]\n" + "def f(): pass") + self.check_suite("@x(x)(x)\n" + "def f(): pass") + self.check_suite("@(x, x)\n" + "def f(): pass") + self.check_suite("@...\n" + "def f(): pass") + self.check_suite("@None\n" + "def f(): pass") + self.check_suite("@w @(x @y) @(z)\n" + "def f(): pass") + self.check_suite("@w[x].y.z\n" + "def f(): pass") + # keyword-only arguments self.check_suite("def f(*, a): pass") self.check_suite("def f(*, a = 5): pass") @@ -265,6 +291,27 @@ class RoundtripLegalSyntaxTestCase(unittest.TestCase): "@decorator2\n" "class foo():pass") + self.check_suite("@False or x\n" + "class C: pass") + self.check_suite("@d := x\n" + "class C: pass") + self.check_suite("@lambda f: x(f)\n" + "class C: pass") + self.check_suite("@[..., x, ...][1]\n" + "class C: pass") + self.check_suite("@x(x)(x)\n" + "class C: pass") + self.check_suite("@(x, x)\n" + "class C: pass") + self.check_suite("@...\n" + "class C: pass") + self.check_suite("@None\n" + "class C: pass") + self.check_suite("@w @(x @y) @(z)\n" + "class C: pass") + self.check_suite("@w[x].y.z\n" + "class C: pass") + def test_import_from_statement(self): self.check_suite("from sys.path import *") self.check_suite("from sys.path import dirname") @@ -854,7 +901,7 @@ class ParserStackLimitTestCase(unittest.TestCase): def test_trigger_memory_error(self): e = self._nested_expression(100) - rc, out, err = assert_python_failure('-c', e) + rc, out, err = assert_python_failure('-Xoldparser', '-c', e) # parsing the expression will result in an error message # followed by a MemoryError (see #11963) self.assertIn(b's_push: parser stack overflow', err) @@ -987,5 +1034,13 @@ class OtherParserCase(unittest.TestCase): with self.assertRaises(TypeError): parser.expr("a", "b") + +class TestDeprecation(unittest.TestCase): + def test_deprecation_message(self): + code = "def f():\n import parser\n\nf()" + rc, out, err = assert_python_ok('-c', code) + self.assertIn(b':2: DeprecationWarning', err) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index e9f928a9..3da35710 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -559,6 +559,23 @@ class _BasePurePathTest(object): self.assertRaises(ValueError, P('a/b').with_name, 'c/') self.assertRaises(ValueError, P('a/b').with_name, 'c/d') + def test_with_stem_common(self): + P = self.cls + self.assertEqual(P('a/b').with_stem('d'), P('a/d')) + self.assertEqual(P('/a/b').with_stem('d'), P('/a/d')) + self.assertEqual(P('a/b.py').with_stem('d'), P('a/d.py')) + self.assertEqual(P('/a/b.py').with_stem('d'), P('/a/d.py')) + self.assertEqual(P('/a/b.tar.gz').with_stem('d'), P('/a/d.gz')) + self.assertEqual(P('a/Dot ending.').with_stem('d'), P('a/d')) + self.assertEqual(P('/a/Dot ending.').with_stem('d'), P('/a/d')) + self.assertRaises(ValueError, P('').with_stem, 'd') + self.assertRaises(ValueError, P('.').with_stem, 'd') + self.assertRaises(ValueError, P('/').with_stem, 'd') + self.assertRaises(ValueError, P('a/b').with_stem, '') + self.assertRaises(ValueError, P('a/b').with_stem, '/c') + self.assertRaises(ValueError, P('a/b').with_stem, 'c/') + self.assertRaises(ValueError, P('a/b').with_stem, 'c/d') + def test_with_suffix_common(self): P = self.cls self.assertEqual(P('a/b').with_suffix('.gz'), P('a/b.gz')) @@ -619,6 +636,40 @@ class _BasePurePathTest(object): self.assertRaises(ValueError, p.relative_to, '') self.assertRaises(ValueError, p.relative_to, P('a')) + def test_is_relative_to_common(self): + P = self.cls + p = P('a/b') + self.assertRaises(TypeError, p.is_relative_to) + self.assertRaises(TypeError, p.is_relative_to, b'a') + self.assertTrue(p.is_relative_to(P())) + self.assertTrue(p.is_relative_to('')) + self.assertTrue(p.is_relative_to(P('a'))) + self.assertTrue(p.is_relative_to('a/')) + self.assertTrue(p.is_relative_to(P('a/b'))) + self.assertTrue(p.is_relative_to('a/b')) + # With several args. + self.assertTrue(p.is_relative_to('a', 'b')) + # Unrelated paths. + self.assertFalse(p.is_relative_to(P('c'))) + self.assertFalse(p.is_relative_to(P('a/b/c'))) + self.assertFalse(p.is_relative_to(P('a/c'))) + self.assertFalse(p.is_relative_to(P('/a'))) + p = P('/a/b') + self.assertTrue(p.is_relative_to(P('/'))) + self.assertTrue(p.is_relative_to('/')) + self.assertTrue(p.is_relative_to(P('/a'))) + self.assertTrue(p.is_relative_to('/a')) + self.assertTrue(p.is_relative_to('/a/')) + self.assertTrue(p.is_relative_to(P('/a/b'))) + self.assertTrue(p.is_relative_to('/a/b')) + # Unrelated paths. + self.assertFalse(p.is_relative_to(P('/c'))) + self.assertFalse(p.is_relative_to(P('/a/b/c'))) + self.assertFalse(p.is_relative_to(P('/a/c'))) + self.assertFalse(p.is_relative_to(P())) + self.assertFalse(p.is_relative_to('')) + self.assertFalse(p.is_relative_to(P('a'))) + def test_pickling_common(self): P = self.cls p = P('/a/b') @@ -980,6 +1031,20 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase): self.assertRaises(ValueError, P('c:a/b').with_name, 'd:/e') self.assertRaises(ValueError, P('c:a/b').with_name, '//My/Share') + def test_with_stem(self): + P = self.cls + self.assertEqual(P('c:a/b').with_stem('d'), P('c:a/d')) + self.assertEqual(P('c:/a/b').with_stem('d'), P('c:/a/d')) + self.assertEqual(P('c:a/Dot ending.').with_stem('d'), P('c:a/d')) + self.assertEqual(P('c:/a/Dot ending.').with_stem('d'), P('c:/a/d')) + self.assertRaises(ValueError, P('c:').with_stem, 'd') + self.assertRaises(ValueError, P('c:/').with_stem, 'd') + self.assertRaises(ValueError, P('//My/Share').with_stem, 'd') + self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:') + self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:e') + self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:/e') + self.assertRaises(ValueError, P('c:a/b').with_stem, '//My/Share') + def test_with_suffix(self): P = self.cls self.assertEqual(P('c:a/b').with_suffix('.gz'), P('c:a/b.gz')) @@ -1062,6 +1127,59 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase): self.assertRaises(ValueError, p.relative_to, P('//z/Share/Foo')) self.assertRaises(ValueError, p.relative_to, P('//Server/z/Foo')) + def test_is_relative_to(self): + P = self.cls + p = P('C:Foo/Bar') + self.assertTrue(p.is_relative_to(P('c:'))) + self.assertTrue(p.is_relative_to('c:')) + self.assertTrue(p.is_relative_to(P('c:foO'))) + self.assertTrue(p.is_relative_to('c:foO')) + self.assertTrue(p.is_relative_to('c:foO/')) + self.assertTrue(p.is_relative_to(P('c:foO/baR'))) + self.assertTrue(p.is_relative_to('c:foO/baR')) + # Unrelated paths. + self.assertFalse(p.is_relative_to(P())) + self.assertFalse(p.is_relative_to('')) + self.assertFalse(p.is_relative_to(P('d:'))) + self.assertFalse(p.is_relative_to(P('/'))) + self.assertFalse(p.is_relative_to(P('Foo'))) + self.assertFalse(p.is_relative_to(P('/Foo'))) + self.assertFalse(p.is_relative_to(P('C:/Foo'))) + self.assertFalse(p.is_relative_to(P('C:Foo/Bar/Baz'))) + self.assertFalse(p.is_relative_to(P('C:Foo/Baz'))) + p = P('C:/Foo/Bar') + self.assertTrue(p.is_relative_to('c:')) + self.assertTrue(p.is_relative_to(P('c:/'))) + self.assertTrue(p.is_relative_to(P('c:/foO'))) + self.assertTrue(p.is_relative_to('c:/foO/')) + self.assertTrue(p.is_relative_to(P('c:/foO/baR'))) + self.assertTrue(p.is_relative_to('c:/foO/baR')) + # Unrelated paths. + self.assertFalse(p.is_relative_to(P('C:/Baz'))) + self.assertFalse(p.is_relative_to(P('C:/Foo/Bar/Baz'))) + self.assertFalse(p.is_relative_to(P('C:/Foo/Baz'))) + self.assertFalse(p.is_relative_to(P('C:Foo'))) + self.assertFalse(p.is_relative_to(P('d:'))) + self.assertFalse(p.is_relative_to(P('d:/'))) + self.assertFalse(p.is_relative_to(P('/'))) + self.assertFalse(p.is_relative_to(P('/Foo'))) + self.assertFalse(p.is_relative_to(P('//C/Foo'))) + # UNC paths. + p = P('//Server/Share/Foo/Bar') + self.assertTrue(p.is_relative_to(P('//sErver/sHare'))) + self.assertTrue(p.is_relative_to('//sErver/sHare')) + self.assertTrue(p.is_relative_to('//sErver/sHare/')) + self.assertTrue(p.is_relative_to(P('//sErver/sHare/Foo'))) + self.assertTrue(p.is_relative_to('//sErver/sHare/Foo')) + self.assertTrue(p.is_relative_to('//sErver/sHare/Foo/')) + self.assertTrue(p.is_relative_to(P('//sErver/sHare/Foo/Bar'))) + self.assertTrue(p.is_relative_to('//sErver/sHare/Foo/Bar')) + # Unrelated paths. + self.assertFalse(p.is_relative_to(P('/Server/Share/Foo'))) + self.assertFalse(p.is_relative_to(P('c:/Server/Share/Foo'))) + self.assertFalse(p.is_relative_to(P('//z/Share/Foo'))) + self.assertFalse(p.is_relative_to(P('//Server/z/Foo'))) + def test_is_absolute(self): P = self.cls # Under NT, only paths with both a drive and a root are absolute. @@ -1633,13 +1751,15 @@ class _BasePathTest(object): next(it2) with p: pass - # I/O operation on closed path. - self.assertRaises(ValueError, next, it) - self.assertRaises(ValueError, next, it2) - self.assertRaises(ValueError, p.open) - self.assertRaises(ValueError, p.resolve) - self.assertRaises(ValueError, p.absolute) - self.assertRaises(ValueError, p.__enter__) + # Using a path as a context manager is a no-op, thus the following + # operations should still succeed after the context manage exits. + next(it) + next(it2) + p.exists() + p.resolve() + p.absolute() + with p: + pass def test_chmod(self): p = self.cls(BASE) / 'fileA' @@ -1779,6 +1899,16 @@ class _BasePathTest(object): self.assertEqual(os.stat(r).st_size, size) self.assertFileNotFound(q.stat) + @support.skip_unless_symlink + def test_readlink(self): + P = self.cls(BASE) + self.assertEqual((P / 'linkA').readlink(), self.cls('fileA')) + self.assertEqual((P / 'brokenLink').readlink(), + self.cls('non-existing')) + self.assertEqual((P / 'linkB').readlink(), self.cls('dirB')) + with self.assertRaises(OSError): + (P / 'fileA').readlink() + def test_touch_common(self): P = self.cls(BASE) p = P / 'newfileA' @@ -2174,6 +2304,9 @@ class _BasePathTest(object): class PathTest(_BasePathTest, unittest.TestCase): cls = pathlib.Path + def test_class_getitem(self): + self.assertIs(self.cls[str], self.cls) + def test_concrete_class(self): p = self.cls('a') self.assertIs(type(p), diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 9c9471a8..8016f81e 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1025,7 +1025,7 @@ def test_pdb_return_command_for_coroutine(): def test_pdb_until_command_for_generator(): """Testing no unwindng stack on yield for generators - for "until" command if target breakpoing is not reached + for "until" command if target breakpoint is not reached >>> def test_gen(): ... yield 0 @@ -1069,7 +1069,7 @@ def test_pdb_until_command_for_generator(): def test_pdb_until_command_for_coroutine(): """Testing no unwindng stack for coroutines - for "until" command if target breakpoing is not reached + for "until" command if target breakpoint is not reached >>> import asyncio @@ -1239,6 +1239,7 @@ class PdbTestCase(unittest.TestCase): stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, + env = {**os.environ, 'PYTHONIOENCODING': 'utf-8'} ) as proc: stdout, stderr = proc.communicate(str.encode(commands)) stdout = stdout and bytes.decode(stdout) @@ -1394,10 +1395,11 @@ def bœr(): stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, + env={**os.environ, 'PYTHONIOENCODING': 'utf-8'} ) self.addCleanup(proc.stdout.close) stdout, stderr = proc.communicate(b'cont\n') - self.assertNotIn('Error', stdout.decode(), + self.assertNotIn(b'Error', stdout, "Got an error running test script under PDB") def test_issue36250(self): @@ -1423,10 +1425,11 @@ def bœr(): stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, + env = {**os.environ, 'PYTHONIOENCODING': 'utf-8'} ) self.addCleanup(proc.stdout.close) stdout, stderr = proc.communicate(b'cont\ncont\n') - self.assertNotIn('Error', stdout.decode(), + self.assertNotIn(b'Error', stdout, "Got an error running test script under PDB") def test_issue16180(self): @@ -1466,8 +1469,8 @@ def bœr(): ) with proc: stdout, stderr = proc.communicate(b'q\n') - self.assertNotIn("NameError: name 'invalid' is not defined", - stdout.decode()) + self.assertNotIn(b"NameError: name 'invalid' is not defined", + stdout) finally: if save_home is not None: diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 01c00369..7913e91e 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -1,7 +1,7 @@ import dis import unittest -from test.bytecode_helper import BytecodeTestCase +from test.support.bytecode_helper import BytecodeTestCase def count_instr_recursively(f, opname): @@ -65,14 +65,14 @@ class TestTranforms(BytecodeTestCase): self.check_lnotab(unot) def test_elim_inversion_of_is_or_in(self): - for line, cmp_op in ( - ('not a is b', 'is not',), - ('not a in b', 'not in',), - ('not a is not b', 'is',), - ('not a not in b', 'in',), + for line, cmp_op, invert in ( + ('not a is b', 'IS_OP', 1,), + ('not a is not b', 'IS_OP', 0,), + ('not a in b', 'CONTAINS_OP', 1,), + ('not a not in b', 'CONTAINS_OP', 0,), ): code = compile(line, '', 'single') - self.assertInBytecode(code, 'COMPARE_OP', cmp_op) + self.assertInBytecode(code, cmp_op, invert) self.check_lnotab(code) def test_global_as_constant(self): @@ -474,7 +474,7 @@ class TestTranforms(BytecodeTestCase): self.assertEqual(f(), 1) self.check_lnotab(f) - def test_if_with_if_expression(self): # XXX does this belong in 3.8? + def test_if_with_if_expression(self): # Check bpo-37289 def f(x): if (True if x else False): @@ -495,6 +495,20 @@ class TestTranforms(BytecodeTestCase): return 6 self.check_lnotab(f) + def test_assignment_idiom_in_comprehensions(self): + def listcomp(): + return [y for x in a for y in [f(x)]] + self.assertEqual(count_instr_recursively(listcomp, 'FOR_ITER'), 1) + def setcomp(): + return {y for x in a for y in [f(x)]} + self.assertEqual(count_instr_recursively(setcomp, 'FOR_ITER'), 1) + def dictcomp(): + return {y: y for x in a for y in [f(x)]} + self.assertEqual(count_instr_recursively(dictcomp, 'FOR_ITER'), 1) + def genexpr(): + return (y for x in a for y in [f(x)]) + self.assertEqual(count_instr_recursively(genexpr, 'FOR_ITER'), 1) + class TestBuglets(unittest.TestCase): diff --git a/Lib/test/test_peg_generator/__init__.py b/Lib/test/test_peg_generator/__init__.py new file mode 100644 index 00000000..fa855f21 --- /dev/null +++ b/Lib/test/test_peg_generator/__init__.py @@ -0,0 +1,7 @@ +import os + +from test.support import load_package_tests + +# Load all tests in package +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_peg_generator/__main__.py b/Lib/test/test_peg_generator/__main__.py new file mode 100644 index 00000000..1fab1fdd --- /dev/null +++ b/Lib/test/test_peg_generator/__main__.py @@ -0,0 +1,4 @@ +import unittest +from . import load_tests + +unittest.main() diff --git a/Lib/test/test_peg_generator/test_c_parser.py b/Lib/test/test_peg_generator/test_c_parser.py new file mode 100644 index 00000000..f9935258 --- /dev/null +++ b/Lib/test/test_peg_generator/test_c_parser.py @@ -0,0 +1,446 @@ +import textwrap +import unittest +from distutils.tests.support import TempdirManager +from pathlib import Path + +from test import test_tools +from test import support +from test.support.script_helper import assert_python_ok + +test_tools.skip_if_missing("peg_generator") +with test_tools.imports_under_tool("peg_generator"): + from pegen.grammar_parser import GeneratedParser as GrammarParser + from pegen.testutil import ( + parse_string, + generate_parser_c_extension, + generate_c_parser_source, + ) + from pegen.ast_dump import ast_dump + + +TEST_TEMPLATE = """ +tmp_dir = {extension_path!r} + +import ast +import traceback +import sys +import unittest + +from test import test_tools +with test_tools.imports_under_tool("peg_generator"): + from pegen.ast_dump import ast_dump + +sys.path.insert(0, tmp_dir) +import parse + +class Tests(unittest.TestCase): + + def check_input_strings_for_grammar( + self, + valid_cases = (), + invalid_cases = (), + ): + if valid_cases: + for case in valid_cases: + parse.parse_string(case, mode=0) + + if invalid_cases: + for case in invalid_cases: + with self.assertRaises(SyntaxError): + parse.parse_string(case, mode=0) + + def verify_ast_generation(self, stmt): + expected_ast = ast.parse(stmt) + actual_ast = parse.parse_string(stmt, mode=1) + self.assertEqual(ast_dump(expected_ast), ast_dump(actual_ast)) + + def test_parse(self): + {test_source} + +unittest.main() +""" + + +class TestCParser(TempdirManager, unittest.TestCase): + def setUp(self): + cmd = support.missing_compiler_executable() + if cmd is not None: + self.skipTest("The %r command is not found" % cmd) + super(TestCParser, self).setUp() + self.tmp_path = self.mkdtemp() + change_cwd = support.change_cwd(self.tmp_path) + change_cwd.__enter__() + self.addCleanup(change_cwd.__exit__, None, None, None) + + def tearDown(self): + super(TestCParser, self).tearDown() + + def build_extension(self, grammar_source): + grammar = parse_string(grammar_source, GrammarParser) + generate_parser_c_extension(grammar, Path(self.tmp_path)) + + def run_test(self, grammar_source, test_source): + self.build_extension(grammar_source) + test_source = textwrap.indent(textwrap.dedent(test_source), 8 * " ") + assert_python_ok( + "-c", + TEST_TEMPLATE.format(extension_path=self.tmp_path, test_source=test_source), + ) + + def test_c_parser(self) -> None: + grammar_source = """ + start[mod_ty]: a=stmt* $ { Module(a, NULL, p->arena) } + stmt[stmt_ty]: a=expr_stmt { a } + expr_stmt[stmt_ty]: a=expression NEWLINE { _Py_Expr(a, EXTRA) } + expression[expr_ty]: ( l=expression '+' r=term { _Py_BinOp(l, Add, r, EXTRA) } + | l=expression '-' r=term { _Py_BinOp(l, Sub, r, EXTRA) } + | t=term { t } + ) + term[expr_ty]: ( l=term '*' r=factor { _Py_BinOp(l, Mult, r, EXTRA) } + | l=term '/' r=factor { _Py_BinOp(l, Div, r, EXTRA) } + | f=factor { f } + ) + factor[expr_ty]: ('(' e=expression ')' { e } + | a=atom { a } + ) + atom[expr_ty]: ( n=NAME { n } + | n=NUMBER { n } + | s=STRING { s } + ) + """ + test_source = """ + expressions = [ + "4+5", + "4-5", + "4*5", + "1+4*5", + "1+4/5", + "(1+1) + (1+1)", + "(1+1) - (1+1)", + "(1+1) * (1+1)", + "(1+1) / (1+1)", + ] + + for expr in expressions: + the_ast = parse.parse_string(expr, mode=1) + expected_ast = ast.parse(expr) + self.assertEqual(ast_dump(the_ast), ast_dump(expected_ast)) + """ + self.run_test(grammar_source, test_source) + + def test_lookahead(self) -> None: + grammar_source = """ + start: NAME &NAME expr NEWLINE? ENDMARKER + expr: NAME | NUMBER + """ + test_source = """ + valid_cases = ["foo bar"] + invalid_cases = ["foo 34"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_negative_lookahead(self) -> None: + grammar_source = """ + start: NAME !NAME expr NEWLINE? ENDMARKER + expr: NAME | NUMBER + """ + test_source = """ + valid_cases = ["foo 34"] + invalid_cases = ["foo bar"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_cut(self) -> None: + grammar_source = """ + start: X ~ Y Z | X Q S + X: 'x' + Y: 'y' + Z: 'z' + Q: 'q' + S: 's' + """ + test_source = """ + valid_cases = ["x y z"] + invalid_cases = ["x q s"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_gather(self) -> None: + grammar_source = """ + start: ';'.pass_stmt+ NEWLINE + pass_stmt: 'pass' + """ + test_source = """ + valid_cases = ["pass", "pass; pass"] + invalid_cases = ["pass;", "pass; pass;"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_left_recursion(self) -> None: + grammar_source = """ + start: expr NEWLINE + expr: ('-' term | expr '+' term | term) + term: NUMBER + """ + test_source = """ + valid_cases = ["-34", "34", "34 + 12", "1 + 1 + 2 + 3"] + self.check_input_strings_for_grammar(valid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_advanced_left_recursive(self) -> None: + grammar_source = """ + start: NUMBER | sign start + sign: ['-'] + """ + test_source = """ + valid_cases = ["23", "-34"] + self.check_input_strings_for_grammar(valid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_mutually_left_recursive(self) -> None: + grammar_source = """ + start: foo 'E' + foo: bar 'A' | 'B' + bar: foo 'C' | 'D' + """ + test_source = """ + valid_cases = ["B E", "D A C A E"] + self.check_input_strings_for_grammar(valid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_nasty_mutually_left_recursive(self) -> None: + grammar_source = """ + start: target '=' + target: maybe '+' | NAME + maybe: maybe '-' | target + """ + test_source = """ + valid_cases = ["x ="] + invalid_cases = ["x - + ="] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_return_stmt_noexpr_action(self) -> None: + grammar_source = """ + start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } + statements[asdl_seq*]: a=statement+ { a } + statement[stmt_ty]: simple_stmt + simple_stmt[stmt_ty]: small_stmt + small_stmt[stmt_ty]: return_stmt + return_stmt[stmt_ty]: a='return' NEWLINE { _Py_Return(NULL, EXTRA) } + """ + test_source = """ + stmt = "return" + self.verify_ast_generation(stmt) + """ + self.run_test(grammar_source, test_source) + + def test_gather_action_ast(self) -> None: + grammar_source = """ + start[mod_ty]: a=';'.pass_stmt+ NEWLINE ENDMARKER { Module(a, NULL, p->arena) } + pass_stmt[stmt_ty]: a='pass' { _Py_Pass(EXTRA)} + """ + test_source = """ + stmt = "pass; pass" + self.verify_ast_generation(stmt) + """ + self.run_test(grammar_source, test_source) + + def test_pass_stmt_action(self) -> None: + grammar_source = """ + start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } + statements[asdl_seq*]: a=statement+ { a } + statement[stmt_ty]: simple_stmt + simple_stmt[stmt_ty]: small_stmt + small_stmt[stmt_ty]: pass_stmt + pass_stmt[stmt_ty]: a='pass' NEWLINE { _Py_Pass(EXTRA) } + """ + test_source = """ + stmt = "pass" + self.verify_ast_generation(stmt) + """ + self.run_test(grammar_source, test_source) + + def test_if_stmt_action(self) -> None: + grammar_source = """ + start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } + statements[asdl_seq*]: a=statement+ { _PyPegen_seq_flatten(p, a) } + statement[asdl_seq*]: a=compound_stmt { _PyPegen_singleton_seq(p, a) } | simple_stmt + + simple_stmt[asdl_seq*]: a=small_stmt b=further_small_stmt* [';'] NEWLINE { _PyPegen_seq_insert_in_front(p, a, b) } + further_small_stmt[stmt_ty]: ';' a=small_stmt { a } + + block: simple_stmt | NEWLINE INDENT a=statements DEDENT { a } + + compound_stmt: if_stmt + + if_stmt: 'if' a=full_expression ':' b=block { _Py_If(a, b, NULL, EXTRA) } + + small_stmt[stmt_ty]: pass_stmt + + pass_stmt[stmt_ty]: a='pass' { _Py_Pass(EXTRA) } + + full_expression: NAME + """ + test_source = """ + stmt = "pass" + self.verify_ast_generation(stmt) + """ + self.run_test(grammar_source, test_source) + + def test_same_name_different_types(self) -> None: + grammar_source = """ + start[mod_ty]: a=import_from+ NEWLINE ENDMARKER { Module(a, NULL, p->arena)} + import_from[stmt_ty]: ( a='from' !'import' c=simple_name 'import' d=import_as_names_from { + _Py_ImportFrom(c->v.Name.id, d, 0, EXTRA) } + | a='from' '.' 'import' c=import_as_names_from { + _Py_ImportFrom(NULL, c, 1, EXTRA) } + ) + simple_name[expr_ty]: NAME + import_as_names_from[asdl_seq*]: a=','.import_as_name_from+ { a } + import_as_name_from[alias_ty]: a=NAME 'as' b=NAME { _Py_alias(((expr_ty) a)->v.Name.id, ((expr_ty) b)->v.Name.id, p->arena) } + """ + test_source = """ + for stmt in ("from a import b as c", "from . import a as b"): + expected_ast = ast.parse(stmt) + actual_ast = parse.parse_string(stmt, mode=1) + self.assertEqual(ast_dump(expected_ast), ast_dump(actual_ast)) + """ + self.run_test(grammar_source, test_source) + + def test_with_stmt_with_paren(self) -> None: + grammar_source = """ + start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } + statements[asdl_seq*]: a=statement+ { _PyPegen_seq_flatten(p, a) } + statement[asdl_seq*]: a=compound_stmt { _PyPegen_singleton_seq(p, a) } + compound_stmt[stmt_ty]: with_stmt + with_stmt[stmt_ty]: ( + a='with' '(' b=','.with_item+ ')' ':' c=block { + _Py_With(b, _PyPegen_singleton_seq(p, c), NULL, EXTRA) } + ) + with_item[withitem_ty]: ( + e=NAME o=['as' t=NAME { t }] { _Py_withitem(e, _PyPegen_set_expr_context(p, o, Store), p->arena) } + ) + block[stmt_ty]: a=pass_stmt NEWLINE { a } | NEWLINE INDENT a=pass_stmt DEDENT { a } + pass_stmt[stmt_ty]: a='pass' { _Py_Pass(EXTRA) } + """ + test_source = """ + stmt = "with (\\n a as b,\\n c as d\\n): pass" + the_ast = parse.parse_string(stmt, mode=1) + self.assertTrue(ast_dump(the_ast).startswith( + "Module(body=[With(items=[withitem(context_expr=Name(id='a', ctx=Load()), optional_vars=Name(id='b', ctx=Store())), " + "withitem(context_expr=Name(id='c', ctx=Load()), optional_vars=Name(id='d', ctx=Store()))]" + )) + """ + self.run_test(grammar_source, test_source) + + def test_ternary_operator(self) -> None: + grammar_source = """ + start[mod_ty]: a=expr ENDMARKER { Module(a, NULL, p->arena) } + expr[asdl_seq*]: a=listcomp NEWLINE { _PyPegen_singleton_seq(p, _Py_Expr(a, EXTRA)) } + listcomp[expr_ty]: ( + a='[' b=NAME c=for_if_clauses d=']' { _Py_ListComp(b, c, EXTRA) } + ) + for_if_clauses[asdl_seq*]: ( + a=(y=[ASYNC] 'for' a=NAME 'in' b=NAME c=('if' z=NAME { z })* + { _Py_comprehension(_Py_Name(((expr_ty) a)->v.Name.id, Store, EXTRA), b, c, (y == NULL) ? 0 : 1, p->arena) })+ { a } + ) + """ + test_source = """ + stmt = "[i for i in a if b]" + self.verify_ast_generation(stmt) + """ + self.run_test(grammar_source, test_source) + + def test_syntax_error_for_string(self) -> None: + grammar_source = """ + start: expr+ NEWLINE? ENDMARKER + expr: NAME + """ + test_source = r""" + for text in ("a b 42 b a", "\u540d \u540d 42 \u540d \u540d"): + try: + parse.parse_string(text, mode=0) + except SyntaxError as e: + tb = traceback.format_exc() + self.assertTrue('File "", line 1' in tb) + self.assertTrue(f"SyntaxError: invalid syntax" in tb) + """ + self.run_test(grammar_source, test_source) + + def test_headers_and_trailer(self) -> None: + grammar_source = """ + @header 'SOME HEADER' + @subheader 'SOME SUBHEADER' + @trailer 'SOME TRAILER' + start: expr+ NEWLINE? ENDMARKER + expr: x=NAME + """ + grammar = parse_string(grammar_source, GrammarParser) + parser_source = generate_c_parser_source(grammar) + + self.assertTrue("SOME HEADER" in parser_source) + self.assertTrue("SOME SUBHEADER" in parser_source) + self.assertTrue("SOME TRAILER" in parser_source) + + def test_error_in_rules(self) -> None: + grammar_source = """ + start: expr+ NEWLINE? ENDMARKER + expr: NAME {PyTuple_New(-1)} + """ + # PyTuple_New raises SystemError if an invalid argument was passed. + test_source = """ + with self.assertRaises(SystemError): + parse.parse_string("a", mode=0) + """ + self.run_test(grammar_source, test_source) + + def test_no_soft_keywords(self) -> None: + grammar_source = """ + start: expr+ NEWLINE? ENDMARKER + expr: 'foo' + """ + grammar = parse_string(grammar_source, GrammarParser) + parser_source = generate_c_parser_source(grammar) + assert "expect_soft_keyword" not in parser_source + + def test_soft_keywords(self) -> None: + grammar_source = """ + start: expr+ NEWLINE? ENDMARKER + expr: "foo" + """ + grammar = parse_string(grammar_source, GrammarParser) + parser_source = generate_c_parser_source(grammar) + assert "expect_soft_keyword" in parser_source + + def test_soft_keywords_parse(self) -> None: + grammar_source = """ + start: "if" expr '+' expr NEWLINE + expr: NAME + """ + test_source = """ + valid_cases = ["if if + if"] + invalid_cases = ["if if"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_soft_keywords_lookahead(self) -> None: + grammar_source = """ + start: &"if" "if" expr '+' expr NEWLINE + expr: NAME + """ + test_source = """ + valid_cases = ["if if + if"] + invalid_cases = ["if if"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) diff --git a/Lib/test/test_peg_generator/test_first_sets.py b/Lib/test/test_peg_generator/test_first_sets.py new file mode 100644 index 00000000..425ee23a --- /dev/null +++ b/Lib/test/test_peg_generator/test_first_sets.py @@ -0,0 +1,225 @@ +import unittest + +from test import test_tools +from typing import Dict, Set + +test_tools.skip_if_missing('peg_generator') +with test_tools.imports_under_tool('peg_generator'): + from pegen.grammar_parser import GeneratedParser as GrammarParser + from pegen.testutil import parse_string + from pegen.first_sets import FirstSetCalculator + from pegen.grammar import Grammar + + +class TestFirstSets(unittest.TestCase): + def calculate_first_sets(self, grammar_source: str) -> Dict[str, Set[str]]: + grammar: Grammar = parse_string(grammar_source, GrammarParser) + return FirstSetCalculator(grammar.rules).calculate() + + def test_alternatives(self) -> None: + grammar = """ + start: expr NEWLINE? ENDMARKER + expr: A | B + A: 'a' | '-' + B: 'b' | '+' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "A": {"'a'", "'-'"}, + "B": {"'+'", "'b'"}, + "expr": {"'+'", "'a'", "'b'", "'-'"}, + "start": {"'+'", "'a'", "'b'", "'-'"}, + }) + + def test_optionals(self) -> None: + grammar = """ + start: expr NEWLINE + expr: ['a'] ['b'] 'c' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "expr": {"'c'", "'a'", "'b'"}, + "start": {"'c'", "'a'", "'b'"}, + }) + + def test_repeat_with_separator(self) -> None: + grammar = """ + start: ','.thing+ NEWLINE + thing: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"thing": {"NUMBER"}, "start": {"NUMBER"}}) + + def test_optional_operator(self) -> None: + grammar = """ + start: sum NEWLINE + sum: (term)? 'b' + term: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "term": {"NUMBER"}, + "sum": {"NUMBER", "'b'"}, + "start": {"'b'", "NUMBER"}, + }) + + def test_optional_literal(self) -> None: + grammar = """ + start: sum NEWLINE + sum: '+' ? term + term: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "term": {"NUMBER"}, + "sum": {"'+'", "NUMBER"}, + "start": {"'+'", "NUMBER"}, + }) + + def test_optional_after(self) -> None: + grammar = """ + start: term NEWLINE + term: NUMBER ['+'] + """ + self.assertEqual(self.calculate_first_sets(grammar), {"term": {"NUMBER"}, "start": {"NUMBER"}}) + + def test_optional_before(self) -> None: + grammar = """ + start: term NEWLINE + term: ['+'] NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"term": {"NUMBER", "'+'"}, "start": {"NUMBER", "'+'"}}) + + def test_repeat_0(self) -> None: + grammar = """ + start: thing* "+" NEWLINE + thing: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"thing": {"NUMBER"}, "start": {'"+"', "NUMBER"}}) + + def test_repeat_0_with_group(self) -> None: + grammar = """ + start: ('+' '-')* term NEWLINE + term: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"term": {"NUMBER"}, "start": {"'+'", "NUMBER"}}) + + def test_repeat_1(self) -> None: + grammar = """ + start: thing+ '-' NEWLINE + thing: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"thing": {"NUMBER"}, "start": {"NUMBER"}}) + + def test_repeat_1_with_group(self) -> None: + grammar = """ + start: ('+' term)+ term NEWLINE + term: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"term": {"NUMBER"}, "start": {"'+'"}}) + + def test_gather(self) -> None: + grammar = """ + start: ','.thing+ NEWLINE + thing: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"thing": {"NUMBER"}, "start": {"NUMBER"}}) + + def test_positive_lookahead(self) -> None: + grammar = """ + start: expr NEWLINE + expr: &'a' opt + opt: 'a' | 'b' | 'c' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "expr": {"'a'"}, + "start": {"'a'"}, + "opt": {"'b'", "'c'", "'a'"}, + }) + + def test_negative_lookahead(self) -> None: + grammar = """ + start: expr NEWLINE + expr: !'a' opt + opt: 'a' | 'b' | 'c' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "opt": {"'b'", "'a'", "'c'"}, + "expr": {"'b'", "'c'"}, + "start": {"'b'", "'c'"}, + }) + + def test_left_recursion(self) -> None: + grammar = """ + start: expr NEWLINE + expr: ('-' term | expr '+' term | term) + term: NUMBER + foo: 'foo' + bar: 'bar' + baz: 'baz' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "expr": {"NUMBER", "'-'"}, + "term": {"NUMBER"}, + "start": {"NUMBER", "'-'"}, + "foo": {"'foo'"}, + "bar": {"'bar'"}, + "baz": {"'baz'"}, + }) + + def test_advance_left_recursion(self) -> None: + grammar = """ + start: NUMBER | sign start + sign: ['-'] + """ + self.assertEqual(self.calculate_first_sets(grammar), {"sign": {"'-'", ""}, "start": {"'-'", "NUMBER"}}) + + def test_mutual_left_recursion(self) -> None: + grammar = """ + start: foo 'E' + foo: bar 'A' | 'B' + bar: foo 'C' | 'D' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "foo": {"'D'", "'B'"}, + "bar": {"'D'"}, + "start": {"'D'", "'B'"}, + }) + + def test_nasty_left_recursion(self) -> None: + # TODO: Validate this + grammar = """ + start: target '=' + target: maybe '+' | NAME + maybe: maybe '-' | target + """ + self.assertEqual(self.calculate_first_sets(grammar), {"maybe": set(), "target": {"NAME"}, "start": {"NAME"}}) + + def test_nullable_rule(self) -> None: + grammar = """ + start: sign thing $ + sign: ['-'] + thing: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "sign": {"", "'-'"}, + "thing": {"NUMBER"}, + "start": {"NUMBER", "'-'"}, + }) + + def test_epsilon_production_in_start_rule(self) -> None: + grammar = """ + start: ['-'] $ + """ + self.assertEqual(self.calculate_first_sets(grammar), {"start": {"ENDMARKER", "'-'"}}) + + def test_multiple_nullable_rules(self) -> None: + grammar = """ + start: sign thing other another $ + sign: ['-'] + thing: ['+'] + other: '*' + another: '/' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "sign": {"", "'-'"}, + "thing": {"'+'", ""}, + "start": {"'+'", "'-'", "'*'"}, + "other": {"'*'"}, + "another": {"'/'"}, + }) diff --git a/Lib/test/test_peg_generator/test_pegen.py b/Lib/test/test_peg_generator/test_pegen.py new file mode 100644 index 00000000..bcfee3f2 --- /dev/null +++ b/Lib/test/test_peg_generator/test_pegen.py @@ -0,0 +1,774 @@ +import io +import textwrap +import unittest + +from test import test_tools +from typing import Dict, Any +from tokenize import TokenInfo, NAME, NEWLINE, NUMBER, OP + +test_tools.skip_if_missing('peg_generator') +with test_tools.imports_under_tool('peg_generator'): + from pegen.grammar_parser import GeneratedParser as GrammarParser + from pegen.testutil import ( + parse_string, + generate_parser, + make_parser + ) + from pegen.grammar import GrammarVisitor, GrammarError, Grammar + from pegen.grammar_visualizer import ASTGrammarPrinter + from pegen.parser import Parser + from pegen.python_generator import PythonParserGenerator + + +class TestPegen(unittest.TestCase): + def test_parse_grammar(self) -> None: + grammar_source = """ + start: sum NEWLINE + sum: t1=term '+' t2=term { action } | term + term: NUMBER + """ + expected = """ + start: sum NEWLINE + sum: term '+' term | term + term: NUMBER + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + rules = grammar.rules + self.assertEqual(str(grammar), textwrap.dedent(expected).strip()) + # Check the str() and repr() of a few rules; AST nodes don't support ==. + self.assertEqual(str(rules["start"]), "start: sum NEWLINE") + self.assertEqual(str(rules["sum"]), "sum: term '+' term | term") + expected_repr = "Rule('term', None, Rhs([Alt([NamedItem(None, NameLeaf('NUMBER'))])]))" + self.assertEqual(repr(rules["term"]), expected_repr) + + def test_long_rule_str(self) -> None: + grammar_source = """ + start: zero | one | one zero | one one | one zero zero | one zero one | one one zero | one one one + """ + expected = """ + start: + | zero + | one + | one zero + | one one + | one zero zero + | one zero one + | one one zero + | one one one + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + self.assertEqual(str(grammar.rules["start"]), textwrap.dedent(expected).strip()) + + def test_typed_rules(self) -> None: + grammar = """ + start[int]: sum NEWLINE + sum[int]: t1=term '+' t2=term { action } | term + term[int]: NUMBER + """ + rules = parse_string(grammar, GrammarParser).rules + # Check the str() and repr() of a few rules; AST nodes don't support ==. + self.assertEqual(str(rules["start"]), "start: sum NEWLINE") + self.assertEqual(str(rules["sum"]), "sum: term '+' term | term") + self.assertEqual( + repr(rules["term"]), + "Rule('term', 'int', Rhs([Alt([NamedItem(None, NameLeaf('NUMBER'))])]))" + ) + + def test_gather(self) -> None: + grammar = """ + start: ','.thing+ NEWLINE + thing: NUMBER + """ + rules = parse_string(grammar, GrammarParser).rules + self.assertEqual(str(rules["start"]), "start: ','.thing+ NEWLINE") + self.assertTrue(repr(rules["start"]).startswith( + "Rule('start', None, Rhs([Alt([NamedItem(None, Gather(StringLeaf(\"','\"), NameLeaf('thing'" + )) + self.assertEqual(str(rules["thing"]), "thing: NUMBER") + parser_class = make_parser(grammar) + node = parse_string("42\n", parser_class) + assert node == [ + [[TokenInfo(NUMBER, string="42", start=(1, 0), end=(1, 2), line="42\n")]], + TokenInfo(NEWLINE, string="\n", start=(1, 2), end=(1, 3), line="42\n"), + ] + node = parse_string("1, 2\n", parser_class) + assert node == [ + [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1, 2\n")], + [TokenInfo(NUMBER, string="2", start=(1, 3), end=(1, 4), line="1, 2\n")], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 4), end=(1, 5), line="1, 2\n"), + ] + + def test_expr_grammar(self) -> None: + grammar = """ + start: sum NEWLINE + sum: term '+' term | term + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("42\n", parser_class) + self.assertEqual(node, [ + [[TokenInfo(NUMBER, string="42", start=(1, 0), end=(1, 2), line="42\n")]], + TokenInfo(NEWLINE, string="\n", start=(1, 2), end=(1, 3), line="42\n"), + ]) + + def test_optional_operator(self) -> None: + grammar = """ + start: sum NEWLINE + sum: term ('+' term)? + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1+2\n", parser_class) + self.assertEqual(node, [ + [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1+2\n")], + [ + TokenInfo(OP, string="+", start=(1, 1), end=(1, 2), line="1+2\n"), + [TokenInfo(NUMBER, string="2", start=(1, 2), end=(1, 3), line="1+2\n")], + ], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 3), end=(1, 4), line="1+2\n"), + ]) + node = parse_string("1\n", parser_class) + self.assertEqual(node, [ + [[TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1\n")], None], + TokenInfo(NEWLINE, string="\n", start=(1, 1), end=(1, 2), line="1\n"), + ]) + + def test_optional_literal(self) -> None: + grammar = """ + start: sum NEWLINE + sum: term '+' ? + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1+\n", parser_class) + self.assertEqual(node, [ + [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1+\n")], + TokenInfo(OP, string="+", start=(1, 1), end=(1, 2), line="1+\n"), + ], + TokenInfo(NEWLINE, string="\n", start=(1, 2), end=(1, 3), line="1+\n"), + ]) + node = parse_string("1\n", parser_class) + self.assertEqual(node, [ + [[TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1\n")], None], + TokenInfo(NEWLINE, string="\n", start=(1, 1), end=(1, 2), line="1\n"), + ]) + + def test_alt_optional_operator(self) -> None: + grammar = """ + start: sum NEWLINE + sum: term ['+' term] + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1 + 2\n", parser_class) + self.assertEqual(node, [ + [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 + 2\n")], + [ + TokenInfo(OP, string="+", start=(1, 2), end=(1, 3), line="1 + 2\n"), + [TokenInfo(NUMBER, string="2", start=(1, 4), end=(1, 5), line="1 + 2\n")], + ], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 5), end=(1, 6), line="1 + 2\n"), + ]) + node = parse_string("1\n", parser_class) + self.assertEqual(node, [ + [[TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1\n")], None], + TokenInfo(NEWLINE, string="\n", start=(1, 1), end=(1, 2), line="1\n"), + ]) + + def test_repeat_0_simple(self) -> None: + grammar = """ + start: thing thing* NEWLINE + thing: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1 2 3\n", parser_class) + self.assertEqual(node, [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 2 3\n")], + [ + [[TokenInfo(NUMBER, string="2", start=(1, 2), end=(1, 3), line="1 2 3\n")]], + [[TokenInfo(NUMBER, string="3", start=(1, 4), end=(1, 5), line="1 2 3\n")]], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 5), end=(1, 6), line="1 2 3\n"), + ]) + node = parse_string("1\n", parser_class) + self.assertEqual(node, [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1\n")], + [], + TokenInfo(NEWLINE, string="\n", start=(1, 1), end=(1, 2), line="1\n"), + ]) + + def test_repeat_0_complex(self) -> None: + grammar = """ + start: term ('+' term)* NEWLINE + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1 + 2 + 3\n", parser_class) + self.assertEqual(node, [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 + 2 + 3\n")], + [ + [ + [ + TokenInfo(OP, string="+", start=(1, 2), end=(1, 3), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="2", start=(1, 4), end=(1, 5), line="1 + 2 + 3\n")], + ] + ], + [ + [ + TokenInfo(OP, string="+", start=(1, 6), end=(1, 7), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="3", start=(1, 8), end=(1, 9), line="1 + 2 + 3\n")], + ] + ], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 9), end=(1, 10), line="1 + 2 + 3\n"), + ]) + + def test_repeat_1_simple(self) -> None: + grammar = """ + start: thing thing+ NEWLINE + thing: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1 2 3\n", parser_class) + self.assertEqual(node, [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 2 3\n")], + [ + [[TokenInfo(NUMBER, string="2", start=(1, 2), end=(1, 3), line="1 2 3\n")]], + [[TokenInfo(NUMBER, string="3", start=(1, 4), end=(1, 5), line="1 2 3\n")]], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 5), end=(1, 6), line="1 2 3\n"), + ]) + with self.assertRaises(SyntaxError): + parse_string("1\n", parser_class) + + def test_repeat_1_complex(self) -> None: + grammar = """ + start: term ('+' term)+ NEWLINE + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1 + 2 + 3\n", parser_class) + self.assertEqual(node, [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 + 2 + 3\n")], + [ + [ + [ + TokenInfo(OP, string="+", start=(1, 2), end=(1, 3), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="2", start=(1, 4), end=(1, 5), line="1 + 2 + 3\n")], + ] + ], + [ + [ + TokenInfo(OP, string="+", start=(1, 6), end=(1, 7), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="3", start=(1, 8), end=(1, 9), line="1 + 2 + 3\n")], + ] + ], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 9), end=(1, 10), line="1 + 2 + 3\n"), + ]) + with self.assertRaises(SyntaxError): + parse_string("1\n", parser_class) + + def test_repeat_with_sep_simple(self) -> None: + grammar = """ + start: ','.thing+ NEWLINE + thing: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1, 2, 3\n", parser_class) + self.assertEqual(node, [ + [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1, 2, 3\n")], + [TokenInfo(NUMBER, string="2", start=(1, 3), end=(1, 4), line="1, 2, 3\n")], + [TokenInfo(NUMBER, string="3", start=(1, 6), end=(1, 7), line="1, 2, 3\n")], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 7), end=(1, 8), line="1, 2, 3\n"), + ]) + + def test_left_recursive(self) -> None: + grammar_source = """ + start: expr NEWLINE + expr: ('-' term | expr '+' term | term) + term: NUMBER + foo: NAME+ + bar: NAME* + baz: NAME? + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + parser_class = generate_parser(grammar) + rules = grammar.rules + self.assertFalse(rules["start"].left_recursive) + self.assertTrue(rules["expr"].left_recursive) + self.assertFalse(rules["term"].left_recursive) + self.assertFalse(rules["foo"].left_recursive) + self.assertFalse(rules["bar"].left_recursive) + self.assertFalse(rules["baz"].left_recursive) + node = parse_string("1 + 2 + 3\n", parser_class) + self.assertEqual(node, [ + [ + [ + [[TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 + 2 + 3\n")]], + TokenInfo(OP, string="+", start=(1, 2), end=(1, 3), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="2", start=(1, 4), end=(1, 5), line="1 + 2 + 3\n")], + ], + TokenInfo(OP, string="+", start=(1, 6), end=(1, 7), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="3", start=(1, 8), end=(1, 9), line="1 + 2 + 3\n")], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 9), end=(1, 10), line="1 + 2 + 3\n"), + ]) + + def test_python_expr(self) -> None: + grammar = """ + start: expr NEWLINE? $ { ast.Expression(expr, lineno=1, col_offset=0) } + expr: ( expr '+' term { ast.BinOp(expr, ast.Add(), term, lineno=expr.lineno, col_offset=expr.col_offset, end_lineno=term.end_lineno, end_col_offset=term.end_col_offset) } + | expr '-' term { ast.BinOp(expr, ast.Sub(), term, lineno=expr.lineno, col_offset=expr.col_offset, end_lineno=term.end_lineno, end_col_offset=term.end_col_offset) } + | term { term } + ) + term: ( l=term '*' r=factor { ast.BinOp(l, ast.Mult(), r, lineno=l.lineno, col_offset=l.col_offset, end_lineno=r.end_lineno, end_col_offset=r.end_col_offset) } + | l=term '/' r=factor { ast.BinOp(l, ast.Div(), r, lineno=l.lineno, col_offset=l.col_offset, end_lineno=r.end_lineno, end_col_offset=r.end_col_offset) } + | factor { factor } + ) + factor: ( '(' expr ')' { expr } + | atom { atom } + ) + atom: ( n=NAME { ast.Name(id=n.string, ctx=ast.Load(), lineno=n.start[0], col_offset=n.start[1], end_lineno=n.end[0], end_col_offset=n.end[1]) } + | n=NUMBER { ast.Constant(value=ast.literal_eval(n.string), lineno=n.start[0], col_offset=n.start[1], end_lineno=n.end[0], end_col_offset=n.end[1]) } + ) + """ + parser_class = make_parser(grammar) + node = parse_string("(1 + 2*3 + 5)/(6 - 2)\n", parser_class) + code = compile(node, "", "eval") + val = eval(code) + self.assertEqual(val, 3.0) + + def test_nullable(self) -> None: + grammar_source = """ + start: sign NUMBER + sign: ['-' | '+'] + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + out = io.StringIO() + genr = PythonParserGenerator(grammar, out) + rules = grammar.rules + self.assertFalse(rules["start"].nullable) # Not None! + self.assertTrue(rules["sign"].nullable) + + def test_advanced_left_recursive(self) -> None: + grammar_source = """ + start: NUMBER | sign start + sign: ['-'] + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + out = io.StringIO() + genr = PythonParserGenerator(grammar, out) + rules = grammar.rules + self.assertFalse(rules["start"].nullable) # Not None! + self.assertTrue(rules["sign"].nullable) + self.assertTrue(rules["start"].left_recursive) + self.assertFalse(rules["sign"].left_recursive) + + def test_mutually_left_recursive(self) -> None: + grammar_source = """ + start: foo 'E' + foo: bar 'A' | 'B' + bar: foo 'C' | 'D' + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + out = io.StringIO() + genr = PythonParserGenerator(grammar, out) + rules = grammar.rules + self.assertFalse(rules["start"].left_recursive) + self.assertTrue(rules["foo"].left_recursive) + self.assertTrue(rules["bar"].left_recursive) + genr.generate("") + ns: Dict[str, Any] = {} + exec(out.getvalue(), ns) + parser_class: Type[Parser] = ns["GeneratedParser"] + node = parse_string("D A C A E", parser_class) + self.assertEqual(node, [ + [ + [ + [ + [TokenInfo(type=NAME, string="D", start=(1, 0), end=(1, 1), line="D A C A E")], + TokenInfo(type=NAME, string="A", start=(1, 2), end=(1, 3), line="D A C A E"), + ], + TokenInfo(type=NAME, string="C", start=(1, 4), end=(1, 5), line="D A C A E"), + ], + TokenInfo(type=NAME, string="A", start=(1, 6), end=(1, 7), line="D A C A E"), + ], + TokenInfo(type=NAME, string="E", start=(1, 8), end=(1, 9), line="D A C A E"), + ]) + node = parse_string("B C A E", parser_class) + self.assertIsNotNone(node) + self.assertEqual(node, [ + [ + [ + [TokenInfo(type=NAME, string="B", start=(1, 0), end=(1, 1), line="B C A E")], + TokenInfo(type=NAME, string="C", start=(1, 2), end=(1, 3), line="B C A E"), + ], + TokenInfo(type=NAME, string="A", start=(1, 4), end=(1, 5), line="B C A E"), + ], + TokenInfo(type=NAME, string="E", start=(1, 6), end=(1, 7), line="B C A E"), + ]) + + def test_nasty_mutually_left_recursive(self) -> None: + # This grammar does not recognize 'x - + =', much to my chagrin. + # But that's the way PEG works. + # [Breathlessly] + # The problem is that the toplevel target call + # recurses into maybe, which recognizes 'x - +', + # and then the toplevel target looks for another '+', + # which fails, so it retreats to NAME, + # which succeeds, so we end up just recognizing 'x', + # and then start fails because there's no '=' after that. + grammar_source = """ + start: target '=' + target: maybe '+' | NAME + maybe: maybe '-' | target + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + out = io.StringIO() + genr = PythonParserGenerator(grammar, out) + genr.generate("") + ns: Dict[str, Any] = {} + exec(out.getvalue(), ns) + parser_class = ns["GeneratedParser"] + with self.assertRaises(SyntaxError): + parse_string("x - + =", parser_class) + + def test_lookahead(self) -> None: + grammar = """ + start: (expr_stmt | assign_stmt) &'.' + expr_stmt: !(target '=') expr + assign_stmt: target '=' expr + expr: term ('+' term)* + target: NAME + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("foo = 12 + 12 .", parser_class) + self.assertEqual(node, [ + [ + [ + [TokenInfo(NAME, string="foo", start=(1, 0), end=(1, 3), line="foo = 12 + 12 .")], + TokenInfo(OP, string="=", start=(1, 4), end=(1, 5), line="foo = 12 + 12 ."), + [ + [ + TokenInfo( + NUMBER, string="12", start=(1, 6), end=(1, 8), line="foo = 12 + 12 ." + ) + ], + [ + [ + [ + TokenInfo( + OP, + string="+", + start=(1, 9), + end=(1, 10), + line="foo = 12 + 12 .", + ), + [ + TokenInfo( + NUMBER, + string="12", + start=(1, 11), + end=(1, 13), + line="foo = 12 + 12 .", + ) + ], + ] + ] + ], + ], + ] + ] + ]) + + def test_named_lookahead_error(self) -> None: + grammar = """ + start: foo=!'x' NAME + """ + with self.assertRaises(SyntaxError): + make_parser(grammar) + + def test_start_leader(self) -> None: + grammar = """ + start: attr | NAME + attr: start '.' NAME + """ + # Would assert False without a special case in compute_left_recursives(). + make_parser(grammar) + + def test_opt_sequence(self) -> None: + grammar = """ + start: [NAME*] + """ + # This case was failing because of a double trailing comma at the end + # of a line in the generated source. See bpo-41044 + make_parser(grammar) + + def test_left_recursion_too_complex(self) -> None: + grammar = """ + start: foo + foo: bar '+' | baz '+' | '+' + bar: baz '-' | foo '-' | '-' + baz: foo '*' | bar '*' | '*' + """ + with self.assertRaises(ValueError) as errinfo: + make_parser(grammar) + self.assertTrue("no leader" in str(errinfo.exception.value)) + + def test_cut(self) -> None: + grammar = """ + start: '(' ~ expr ')' + expr: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("(1)", parser_class) + self.assertEqual(node, [ + TokenInfo(OP, string="(", start=(1, 0), end=(1, 1), line="(1)"), + [TokenInfo(NUMBER, string="1", start=(1, 1), end=(1, 2), line="(1)")], + TokenInfo(OP, string=")", start=(1, 2), end=(1, 3), line="(1)"), + ]) + + def test_dangling_reference(self) -> None: + grammar = """ + start: foo ENDMARKER + foo: bar NAME + """ + with self.assertRaises(GrammarError): + parser_class = make_parser(grammar) + + def test_bad_token_reference(self) -> None: + grammar = """ + start: foo + foo: NAMEE + """ + with self.assertRaises(GrammarError): + parser_class = make_parser(grammar) + + def test_missing_start(self) -> None: + grammar = """ + foo: NAME + """ + with self.assertRaises(GrammarError): + parser_class = make_parser(grammar) + + def test_invalid_rule_name(self) -> None: + grammar = """ + start: _a b + _a: 'a' + b: 'b' + """ + with self.assertRaisesRegex(GrammarError, "cannot start with underscore: '_a'"): + parser_class = make_parser(grammar) + + def test_invalid_variable_name(self) -> None: + grammar = """ + start: a b + a: _x='a' + b: 'b' + """ + with self.assertRaisesRegex(GrammarError, "cannot start with underscore: '_x'"): + parser_class = make_parser(grammar) + + def test_invalid_variable_name_in_temporal_rule(self) -> None: + grammar = """ + start: a b + a: (_x='a' | 'b') | 'c' + b: 'b' + """ + with self.assertRaisesRegex(GrammarError, "cannot start with underscore: '_x'"): + parser_class = make_parser(grammar) + + +class TestGrammarVisitor: + class Visitor(GrammarVisitor): + def __init__(self) -> None: + self.n_nodes = 0 + + def visit(self, node: Any, *args: Any, **kwargs: Any) -> None: + self.n_nodes += 1 + super().visit(node, *args, **kwargs) + + def test_parse_trivial_grammar(self) -> None: + grammar = """ + start: 'a' + """ + rules = parse_string(grammar, GrammarParser) + visitor = self.Visitor() + + visitor.visit(rules) + + self.assertEqual(visitor.n_nodes, 6) + + def test_parse_or_grammar(self) -> None: + grammar = """ + start: rule + rule: 'a' | 'b' + """ + rules = parse_string(grammar, GrammarParser) + visitor = self.Visitor() + + visitor.visit(rules) + + # Grammar/Rule/Rhs/Alt/NamedItem/NameLeaf -> 6 + # Rule/Rhs/ -> 2 + # Alt/NamedItem/StringLeaf -> 3 + # Alt/NamedItem/StringLeaf -> 3 + + self.assertEqual(visitor.n_nodes, 14) + + def test_parse_repeat1_grammar(self) -> None: + grammar = """ + start: 'a'+ + """ + rules = parse_string(grammar, GrammarParser) + visitor = self.Visitor() + + visitor.visit(rules) + + # Grammar/Rule/Rhs/Alt/NamedItem/Repeat1/StringLeaf -> 6 + self.assertEqual(visitor.n_nodes, 7) + + def test_parse_repeat0_grammar(self) -> None: + grammar = """ + start: 'a'* + """ + rules = parse_string(grammar, GrammarParser) + visitor = self.Visitor() + + visitor.visit(rules) + + # Grammar/Rule/Rhs/Alt/NamedItem/Repeat0/StringLeaf -> 6 + + self.assertEqual(visitor.n_nodes, 7) + + def test_parse_optional_grammar(self) -> None: + grammar = """ + start: 'a' ['b'] + """ + rules = parse_string(grammar, GrammarParser) + visitor = self.Visitor() + + visitor.visit(rules) + + # Grammar/Rule/Rhs/Alt/NamedItem/StringLeaf -> 6 + # NamedItem/Opt/Rhs/Alt/NamedItem/Stringleaf -> 6 + + self.assertEqual(visitor.n_nodes, 12) + + +class TestGrammarVisualizer(unittest.TestCase): + def test_simple_rule(self) -> None: + grammar = """ + start: 'a' 'b' + """ + rules = parse_string(grammar, GrammarParser) + + printer = ASTGrammarPrinter() + lines: List[str] = [] + printer.print_grammar_ast(rules, printer=lines.append) + + output = "\n".join(lines) + expected_output = textwrap.dedent( + """\ + └──Rule + └──Rhs + └──Alt + ├──NamedItem + │ └──StringLeaf("'a'") + └──NamedItem + └──StringLeaf("'b'") + """ + ) + + self.assertEqual(output, expected_output) + + def test_multiple_rules(self) -> None: + grammar = """ + start: a b + a: 'a' + b: 'b' + """ + rules = parse_string(grammar, GrammarParser) + + printer = ASTGrammarPrinter() + lines: List[str] = [] + printer.print_grammar_ast(rules, printer=lines.append) + + output = "\n".join(lines) + expected_output = textwrap.dedent( + """\ + └──Rule + └──Rhs + └──Alt + ├──NamedItem + │ └──NameLeaf('a') + └──NamedItem + └──NameLeaf('b') + + └──Rule + └──Rhs + └──Alt + └──NamedItem + └──StringLeaf("'a'") + + └──Rule + └──Rhs + └──Alt + └──NamedItem + └──StringLeaf("'b'") + """ + ) + + self.assertEqual(output, expected_output) + + def test_deep_nested_rule(self) -> None: + grammar = """ + start: 'a' ['b'['c'['d']]] + """ + rules = parse_string(grammar, GrammarParser) + + printer = ASTGrammarPrinter() + lines: List[str] = [] + printer.print_grammar_ast(rules, printer=lines.append) + + output = "\n".join(lines) + expected_output = textwrap.dedent( + """\ + └──Rule + └──Rhs + └──Alt + ├──NamedItem + │ └──StringLeaf("'a'") + └──NamedItem + └──Opt + └──Rhs + └──Alt + ├──NamedItem + │ └──StringLeaf("'b'") + └──NamedItem + └──Opt + └──Rhs + └──Alt + ├──NamedItem + │ └──StringLeaf("'c'") + └──NamedItem + └──Opt + └──Rhs + └──Alt + └──NamedItem + └──StringLeaf("'d'") + """ + ) + + self.assertEqual(output, expected_output) diff --git a/Lib/test/test_peg_parser.py b/Lib/test/test_peg_parser.py new file mode 100644 index 00000000..f4aaef84 --- /dev/null +++ b/Lib/test/test_peg_parser.py @@ -0,0 +1,803 @@ +import ast +import _peg_parser as peg_parser +import unittest +from typing import Any, Union, Iterable, Tuple +from textwrap import dedent +from test import support + + +TEST_CASES = [ + ('annotated_assignment', 'x: int = 42'), + ('annotated_assignment_with_tuple', 'x: tuple = 1, 2'), + ('annotated_assignment_with_parens', '(paren): int = 3+2'), + ('annotated_assignment_with_yield', 'x: int = yield 42'), + ('annotated_no_assignment', 'x: int'), + ('annotation_with_multiple_parens', '((parens)): int'), + ('annotation_with_parens', '(parens): int'), + ('annotated_assignment_with_attr', 'a.b: int'), + ('annotated_assignment_with_subscript', 'a[b]: int'), + ('annotated_assignment_with_attr_and_parens', '(a.b): int'), + ('annotated_assignment_with_subscript_and_parens', '(a[b]): int'), + ('assert', 'assert a'), + ('assert_message', 'assert a, b'), + ('assignment_false', 'a = False'), + ('assignment_none', 'a = None'), + ('assignment_true', 'a = True'), + ('assignment_paren', '(a) = 42'), + ('assignment_paren_multiple', '(a, b) = (0, 1)'), + ('asyncfor', + ''' + async for i in a: + pass + '''), + ('attribute_call', 'a.b()'), + ('attribute_multiple_names', 'abcd.efg.hij'), + ('attribute_simple', 'a.b'), + ('attributes_subscript', 'a.b[0]'), + ('augmented_assignment', 'x += 42'), + ('augmented_assignment_attribute', 'a.b.c += 42'), + ('augmented_assignment_paren', '(x) += 42'), + ('augmented_assignment_paren_subscript', '(x[0]) -= 42'), + ('binop_add', '1 + 1'), + ('binop_add_multiple', '1 + 1 + 1 + 1'), + ('binop_all', '1 + 2 * 5 + 3 ** 2 - -3'), + ('binop_boolop_comp', '1 + 1 == 2 or 1 + 1 == 3 and not b'), + ('boolop_or', 'a or b'), + ('boolop_or_multiple', 'a or b or c'), + ('class_def_bases', + ''' + class C(A, B): + pass + '''), + ('class_def_decorators', + ''' + @a + class C: + pass + '''), + ('class_def_decorator_with_expression', + ''' + @lambda x: 42 + class C: + pass + '''), + ('class_def_decorator_with_expression_and_walrus', + ''' + @x:=lambda x: 42 + class C: + pass + '''), + + ('class_def_keywords', + ''' + class C(keyword=a+b, **c): + pass + '''), + ('class_def_mixed', + ''' + class C(A, B, keyword=0, **a): + pass + '''), + ('class_def_simple', + ''' + class C: + pass + '''), + ('class_def_starred_and_kwarg', + ''' + class C(A, B, *x, **y): + pass + '''), + ('class_def_starred_in_kwargs', + ''' + class C(A, x=2, *[B, C], y=3): + pass + '''), + ('call_attribute', 'f().b'), + ('call_genexp', 'f(i for i in a)'), + ('call_mixed_args', 'f(a, b, *c, **d)'), + ('call_mixed_args_named', 'f(a, b, *c, d=4, **v)'), + ('call_one_arg', 'f(a)'), + ('call_posarg_genexp', 'f(a, (i for i in a))'), + ('call_simple', 'f()'), + ('call_subscript', 'f()[0]'), + ('comp', 'a == b'), + ('comp_multiple', 'a == b == c'), + ('comp_paren_end', 'a == (b-1)'), + ('comp_paren_start', '(a-1) == b'), + ('decorator', + ''' + @a + def f(): + pass + '''), + ('decorator_async', + ''' + @a + async def d(): + pass + '''), + ('decorator_with_expression', + ''' + @lambda x: 42 + def f(): + pass + '''), + ('decorator_with_expression_and_walrus', + ''' + @x:=lambda x: 42 + def f(): + pass + '''), + ('del_attribute', 'del a.b'), + ('del_call_attribute', 'del a().c'), + ('del_call_genexp_attribute', 'del a(i for i in b).c'), + ('del_empty', 'del()'), + ('del_list', 'del a, [b, c]'), + ('del_mixed', 'del a[0].b().c'), + ('del_multiple', 'del a, b'), + ('del_multiple_calls_attribute', 'del a()().b'), + ('del_paren', 'del(a,b)'), + ('del_paren_single_target', 'del(a)'), + ('del_subscript_attribute', 'del a[0].b'), + ('del_tuple', 'del a, (b, c)'), + ('delete', 'del a'), + ('dict', + ''' + { + a: 1, + b: 2, + c: 3 + } + '''), + ('dict_comp', '{x:1 for x in a}'), + ('dict_comp_if', '{x:1+2 for x in a if b}'), + ('dict_empty', '{}'), + ('empty_line_after_linecont', + r''' + pass + \ + + pass + '''), + ('for', + ''' + for i in a: + pass + '''), + ('for_else', + ''' + for i in a: + pass + else: + pass + '''), + ('for_star_target_in_paren', 'for (a) in b: pass'), + ('for_star_targets_attribute', 'for a.b in c: pass'), + ('for_star_targets_call_attribute', 'for a().c in b: pass'), + ('for_star_targets_empty', 'for () in a: pass'), + ('for_star_targets_mixed', 'for a[0].b().c in d: pass'), + ('for_star_targets_mixed_starred', + ''' + for a, *b, (c, d) in e: + pass + '''), + ('for_star_targets_multiple', 'for a, b in c: pass'), + ('for_star_targets_nested_starred', 'for *[*a] in b: pass'), + ('for_star_targets_starred', 'for *a in b: pass'), + ('for_star_targets_subscript_attribute', 'for a[0].b in c: pass'), + ('for_star_targets_trailing_comma', + ''' + for a, (b, c), in d: + pass + '''), + ('for_star_targets_tuple', 'for a, (b, c) in d: pass'), + ('for_underscore', + ''' + for _ in a: + pass + '''), + ('function_return_type', + ''' + def f() -> Any: + pass + '''), + ('f-string_slice', "f'{x[2]}'"), + ('f-string_slice_upper', "f'{x[2:3]}'"), + ('f-string_slice_step', "f'{x[2:3:-2]}'"), + ('f-string_constant', "f'{42}'"), + ('f-string_boolop', "f'{x and y}'"), + ('f-string_named_expr', "f'{(x:=42)}'"), + ('f-string_binop', "f'{x+y}'"), + ('f-string_unaryop', "f'{not x}'"), + ('f-string_lambda', "f'{(lambda x, /, y, y2=42 , *z, k1, k2=34, **k3: 42)}'"), + ('f-string_lambda_call', "f'{(lambda: 2)(2)}'"), + ('f-string_ifexpr', "f'{x if y else z}'"), + ('f-string_dict', "f'{ {2:34, 3:34} }'"), + ('f-string_set', "f'{ {2,-45} }'"), + ('f-string_list', "f'{ [2,-45] }'"), + ('f-string_tuple', "f'{ (2,-45) }'"), + ('f-string_listcomp', "f'{[x for x in y if z]}'"), + ('f-string_setcomp', "f'{ {x for x in y if z} }'"), + ('f-string_dictcomp', "f'{ {x:x for x in y if z} }'"), + ('f-string_genexpr', "f'{ (x for x in y if z) }'"), + ('f-string_yield', "f'{ (yield x) }'"), + ('f-string_yieldfrom', "f'{ (yield from x) }'"), + ('f-string_await', "f'{ await x }'"), + ('f-string_compare', "f'{ x == y }'"), + ('f-string_call', "f'{ f(x,y,z) }'"), + ('f-string_attribute', "f'{ f.x.y.z }'"), + ('f-string_starred', "f'{ *x, }'"), + ('f-string_doublestarred', "f'{ {**x} }'"), + ('f-string_escape_brace', "f'{{Escape'"), + ('f-string_escape_closing_brace', "f'Escape}}'"), + ('f-string_repr', "f'{a!r}'"), + ('f-string_str', "f'{a!s}'"), + ('f-string_ascii', "f'{a!a}'"), + ('f-string_debug', "f'{a=}'"), + ('f-string_padding', "f'{a:03d}'"), + ('f-string_multiline', + """ + f''' + {hello} + ''' + """), + ('f-string_multiline_in_expr', + """ + f''' + { + hello + } + ''' + """), + ('f-string_multiline_in_call', + """ + f''' + {f( + a, b, c + )} + ''' + """), + ('global', 'global a, b'), + ('group', '(yield a)'), + ('if_elif', + ''' + if a: + pass + elif b: + pass + '''), + ('if_elif_elif', + ''' + if a: + pass + elif b: + pass + elif c: + pass + '''), + ('if_elif_else', + ''' + if a: + pass + elif b: + pass + else: + pass + '''), + ('if_else', + ''' + if a: + pass + else: + pass + '''), + ('if_simple', 'if a: pass'), + ('import', 'import a'), + ('import_alias', 'import a as b'), + ('import_dotted', 'import a.b'), + ('import_dotted_alias', 'import a.b as c'), + ('import_dotted_multichar', 'import ab.cd'), + ('import_from', 'from a import b'), + ('import_from_alias', 'from a import b as c'), + ('import_from_dotted', 'from a.b import c'), + ('import_from_dotted_alias', 'from a.b import c as d'), + ('import_from_multiple_aliases', 'from a import b as c, d as e'), + ('import_from_one_dot', 'from .a import b'), + ('import_from_one_dot_alias', 'from .a import b as c'), + ('import_from_star', 'from a import *'), + ('import_from_three_dots', 'from ...a import b'), + ('import_from_trailing_comma', 'from a import (b,)'), + ('kwarg', + ''' + def f(**a): + pass + '''), + ('kwonly_args', + ''' + def f(*, a, b): + pass + '''), + ('kwonly_args_with_default', + ''' + def f(*, a=2, b): + pass + '''), + ('lambda_kwarg', 'lambda **a: 42'), + ('lambda_kwonly_args', 'lambda *, a, b: 42'), + ('lambda_kwonly_args_with_default', 'lambda *, a=2, b: 42'), + ('lambda_mixed_args', 'lambda a, /, b, *, c: 42'), + ('lambda_mixed_args_with_default', 'lambda a, b=2, /, c=3, *e, f, **g: 42'), + ('lambda_no_args', 'lambda: 42'), + ('lambda_pos_args', 'lambda a,b: 42'), + ('lambda_pos_args_with_default', 'lambda a, b=2: 42'), + ('lambda_pos_only_args', 'lambda a, /: 42'), + ('lambda_pos_only_args_with_default', 'lambda a=0, /: 42'), + ('lambda_pos_posonly_args', 'lambda a, b, /, c, d: 42'), + ('lambda_pos_posonly_args_with_default', 'lambda a, b=0, /, c=2: 42'), + ('lambda_vararg', 'lambda *a: 42'), + ('lambda_vararg_kwonly_args', 'lambda *a, b: 42'), + ('list', '[1, 2, a]'), + ('list_comp', '[i for i in a]'), + ('list_comp_if', '[i for i in a if b]'), + ('list_trailing_comma', '[1+2, a, 3+4,]'), + ('mixed_args', + ''' + def f(a, /, b, *, c): + pass + '''), + ('mixed_args_with_default', + ''' + def f(a, b=2, /, c=3, *e, f, **g): + pass + '''), + ('multipart_string_bytes', 'b"Hola" b"Hello" b"Bye"'), + ('multipart_string_triple', '"""Something here""" "and now"'), + ('multipart_string_different_prefixes', 'u"Something" "Other thing" r"last thing"'), + ('multiple_assignments', 'x = y = z = 42'), + ('multiple_assignments_with_yield', 'x = y = z = yield 42'), + ('multiple_pass', + ''' + pass; pass + pass + '''), + ('namedexpr', '(x := [1, 2, 3])'), + ('namedexpr_false', '(x := False)'), + ('namedexpr_none', '(x := None)'), + ('namedexpr_true', '(x := True)'), + ('nonlocal', 'nonlocal a, b'), + ('number_complex', '-2.234+1j'), + ('number_float', '-34.2333'), + ('number_imaginary_literal', '1.1234j'), + ('number_integer', '-234'), + ('number_underscores', '1_234_567'), + ('pass', 'pass'), + ('pos_args', + ''' + def f(a, b): + pass + '''), + ('pos_args_with_default', + ''' + def f(a, b=2): + pass + '''), + ('pos_only_args', + ''' + def f(a, /): + pass + '''), + ('pos_only_args_with_default', + ''' + def f(a=0, /): + pass + '''), + ('pos_posonly_args', + ''' + def f(a, b, /, c, d): + pass + '''), + ('pos_posonly_args_with_default', + ''' + def f(a, b=0, /, c=2): + pass + '''), + ('primary_mixed', 'a.b.c().d[0]'), + ('raise', 'raise'), + ('raise_ellipsis', 'raise ...'), + ('raise_expr', 'raise a'), + ('raise_from', 'raise a from b'), + ('return', 'return'), + ('return_expr', 'return a'), + ('set', '{1, 2+4, 3+5}'), + ('set_comp', '{i for i in a}'), + ('set_trailing_comma', '{1, 2, 3,}'), + ('simple_assignment', 'x = 42'), + ('simple_assignment_with_yield', 'x = yield 42'), + ('string_bytes', 'b"hello"'), + ('string_concatenation_bytes', 'b"hello" b"world"'), + ('string_concatenation_simple', '"abcd" "efgh"'), + ('string_format_simple', 'f"hello"'), + ('string_format_with_formatted_value', 'f"hello {world}"'), + ('string_simple', '"hello"'), + ('string_unicode', 'u"hello"'), + ('subscript_attribute', 'a[0].b'), + ('subscript_call', 'a[b]()'), + ('subscript_multiple_slices', 'a[0:a:2, 1]'), + ('subscript_simple', 'a[0]'), + ('subscript_single_element_tuple', 'a[0,]'), + ('subscript_trailing_comma', 'a[0, 1, 2,]'), + ('subscript_tuple', 'a[0, 1, 2]'), + ('subscript_whole_slice', 'a[0+1:b:c]'), + ('try_except', + ''' + try: + pass + except: + pass + '''), + ('try_except_else', + ''' + try: + pass + except: + pass + else: + pass + '''), + ('try_except_else_finally', + ''' + try: + pass + except: + pass + else: + pass + finally: + pass + '''), + ('try_except_expr', + ''' + try: + pass + except a: + pass + '''), + ('try_except_expr_target', + ''' + try: + pass + except a as b: + pass + '''), + ('try_except_finally', + ''' + try: + pass + except: + pass + finally: + pass + '''), + ('try_finally', + ''' + try: + pass + finally: + pass + '''), + ('unpacking_binop', '[*([1, 2, 3] + [3, 4, 5])]'), + ('unpacking_call', '[*b()]'), + ('unpacking_compare', '[*(x < y)]'), + ('unpacking_constant', '[*3]'), + ('unpacking_dict', '[*{1: 2, 3: 4}]'), + ('unpacking_dict_comprehension', '[*{x:y for x,y in z}]'), + ('unpacking_ifexpr', '[*([1, 2, 3] if x else y)]'), + ('unpacking_list', '[*[1,2,3]]'), + ('unpacking_list_comprehension', '[*[x for x in y]]'), + ('unpacking_namedexpr', '[*(x:=[1, 2, 3])]'), + ('unpacking_set', '[*{1,2,3}]'), + ('unpacking_set_comprehension', '[*{x for x in y}]'), + ('unpacking_string', '[*"myvalue"]'), + ('unpacking_tuple', '[*(1,2,3)]'), + ('unpacking_unaryop', '[*(not [1, 2, 3])]'), + ('unpacking_yield', '[*(yield 42)]'), + ('unpacking_yieldfrom', '[*(yield from x)]'), + ('tuple', '(1, 2, 3)'), + ('vararg', + ''' + def f(*a): + pass + '''), + ('vararg_kwonly_args', + ''' + def f(*a, b): + pass + '''), + ('while', + ''' + while a: + pass + '''), + ('while_else', + ''' + while a: + pass + else: + pass + '''), + ('with', + ''' + with a: + pass + '''), + ('with_as', + ''' + with a as b: + pass + '''), + ('with_as_paren', + ''' + with a as (b): + pass + '''), + ('with_as_empty', 'with a as (): pass'), + ('with_list_recursive', + ''' + with a as [x, [y, z]]: + pass + '''), + ('with_tuple_recursive', + ''' + with a as ((x, y), z): + pass + '''), + ('with_tuple_target', + ''' + with a as (x, y): + pass + '''), + ('with_list_target', + ''' + with a as [x, y]: + pass + '''), + ('yield', 'yield'), + ('yield_expr', 'yield a'), + ('yield_from', 'yield from a'), +] + +FAIL_TEST_CASES = [ + ("annotation_multiple_targets", "(a, b): int = 42"), + ("annotation_nested_tuple", "((a, b)): int"), + ("annotation_list", "[a]: int"), + ("annotation_lambda", "lambda: int = 42"), + ("annotation_tuple", "(a,): int"), + ("annotation_tuple_without_paren", "a,: int"), + ("assignment_keyword", "a = if"), + ("augmented_assignment_list", "[a, b] += 1"), + ("augmented_assignment_tuple", "a, b += 1"), + ("augmented_assignment_tuple_paren", "(a, b) += (1, 2)"), + ("comprehension_lambda", "(a for a in lambda: b)"), + ("comprehension_else", "(a for a in b if c else d"), + ("del_call", "del a()"), + ("del_call_genexp", "del a(i for i in b)"), + ("del_subscript_call", "del a[b]()"), + ("del_attribute_call", "del a.b()"), + ("del_mixed_call", "del a[0].b().c.d()"), + ("for_star_targets_call", "for a() in b: pass"), + ("for_star_targets_subscript_call", "for a[b]() in c: pass"), + ("for_star_targets_attribute_call", "for a.b() in c: pass"), + ("for_star_targets_mixed_call", "for a[0].b().c.d() in e: pass"), + ("for_star_targets_in", "for a, in in b: pass"), + ("f-string_assignment", "f'{x = 42}'"), + ("f-string_empty", "f'{}'"), + ("f-string_function_def", "f'{def f(): pass}'"), + ("f-string_lambda", "f'{lambda x: 42}'"), + ("f-string_singe_brace", "f'{'"), + ("f-string_single_closing_brace", "f'}'"), + ("from_import_invalid", "from import import a"), + ("from_import_trailing_comma", "from a import b,"), + ("import_non_ascii_syntax_error", "import ä £"), + # This test case checks error paths involving tokens with uninitialized + # values of col_offset and end_col_offset. + ("invalid indentation", + """ + def f(): + a + a + """), + ("not_terminated_string", "a = 'example"), + ("try_except_attribute_target", + """ + try: + pass + except Exception as a.b: + pass + """), + ("try_except_subscript_target", + """ + try: + pass + except Exception as a[0]: + pass + """), +] + +FAIL_SPECIALIZED_MESSAGE_CASES = [ + ("f(x, y, z=1, **b, *a", "iterable argument unpacking follows keyword argument unpacking"), + ("f(x, y=1, *z, **a, b", "positional argument follows keyword argument unpacking"), + ("f(x, y, z=1, a=2, b", "positional argument follows keyword argument"), + ("True = 1", "cannot assign to True"), + ("a() = 1", "cannot assign to function call"), + ("(a, b): int", "only single target (not tuple) can be annotated"), + ("[a, b]: int", "only single target (not list) can be annotated"), + ("a(): int", "illegal target for annotation"), + ("1 += 1", "'literal' is an illegal expression for augmented assignment"), + ("pass\n pass", "unexpected indent"), + ("def f():\npass", "expected an indented block"), + ("def f(*): pass", "named arguments must follow bare *"), + ("def f(*,): pass", "named arguments must follow bare *"), + ("def f(*, **a): pass", "named arguments must follow bare *"), + ("lambda *: pass", "named arguments must follow bare *"), + ("lambda *,: pass", "named arguments must follow bare *"), + ("lambda *, **a: pass", "named arguments must follow bare *"), + ("f(g()=2", "expression cannot contain assignment, perhaps you meant \"==\"?"), + ("f(a, b, *c, d.e=2", "expression cannot contain assignment, perhaps you meant \"==\"?"), + ("f(*a, **b, c=0, d[1]=3)", "expression cannot contain assignment, perhaps you meant \"==\"?"), +] + +GOOD_BUT_FAIL_TEST_CASES = [ + ('string_concatenation_format', 'f"{hello} world" f"again {and_again}"'), + ('string_concatenation_multiple', + ''' + f"hello" f"{world} again" f"and_again" + '''), + ('f-string_multiline_comp', + """ + f''' + {(i for i in a + if b)} + ''' + """), +] + +FSTRINGS_TRACEBACKS = { + 'multiline_fstrings_same_line_with_brace': ( + """ + f''' + {a$b} + ''' + """, + '(a$b)\n', + ), + 'multiline_fstring_brace_on_next_line': ( + """ + f''' + {a$b + }''' + """, + '(a$b\n', + ), + 'multiline_fstring_brace_on_previous_line': ( + """ + f''' + { + a$b}''' + """, + 'a$b)\n', + ), +} + +EXPRESSIONS_TEST_CASES = [ + ("expression_add", "1+1"), + ("expression_add_2", "a+b"), + ("expression_call", "f(a, b=2, **kw)"), + ("expression_tuple", "1, 2, 3"), + ("expression_tuple_one_value", "1,") +] + + +def cleanup_source(source: Any) -> str: + if isinstance(source, str): + result = dedent(source) + elif not isinstance(source, (list, tuple)): + result = "\n".join(source) + else: + raise TypeError(f"Invalid type for test source: {source}") + return result + + +def prepare_test_cases( + test_cases: Iterable[Tuple[str, Union[str, Iterable[str]]]] +) -> Tuple[Iterable[str], Iterable[str]]: + + test_ids, _test_sources = zip(*test_cases) + test_sources = list(_test_sources) + for index, source in enumerate(test_sources): + result = cleanup_source(source) + test_sources[index] = result + return test_ids, test_sources + + +TEST_IDS, TEST_SOURCES = prepare_test_cases(TEST_CASES) + +GOOD_BUT_FAIL_TEST_IDS, GOOD_BUT_FAIL_SOURCES = prepare_test_cases( + GOOD_BUT_FAIL_TEST_CASES +) + +FAIL_TEST_IDS, FAIL_SOURCES = prepare_test_cases(FAIL_TEST_CASES) + +EXPRESSIONS_TEST_IDS, EXPRESSIONS_TEST_SOURCES = prepare_test_cases( + EXPRESSIONS_TEST_CASES +) + + +class ASTGenerationTest(unittest.TestCase): + def test_correct_ast_generation_on_source_files(self) -> None: + self.maxDiff = None + for source in TEST_SOURCES: + actual_ast = peg_parser.parse_string(source) + expected_ast = peg_parser.parse_string(source, oldparser=True) + self.assertEqual( + ast.dump(actual_ast, include_attributes=True), + ast.dump(expected_ast, include_attributes=True), + f"Wrong AST generation for source: {source}", + ) + + def test_incorrect_ast_generation_on_source_files(self) -> None: + for source in FAIL_SOURCES: + with self.assertRaises(SyntaxError, msg=f"Parsing {source} did not raise an exception"): + peg_parser.parse_string(source) + + def test_incorrect_ast_generation_with_specialized_errors(self) -> None: + for source, error_text in FAIL_SPECIALIZED_MESSAGE_CASES: + exc = IndentationError if "indent" in error_text else SyntaxError + with self.assertRaises(exc) as se: + peg_parser.parse_string(source) + self.assertTrue( + error_text in se.exception.msg, + f"Actual error message does not match expexted for {source}" + ) + + @unittest.expectedFailure + def test_correct_but_known_to_fail_ast_generation_on_source_files(self) -> None: + for source in GOOD_BUT_FAIL_SOURCES: + actual_ast = peg_parser.parse_string(source) + expected_ast = peg_parser.parse_string(source, oldparser=True) + self.assertEqual( + ast.dump(actual_ast, include_attributes=True), + ast.dump(expected_ast, include_attributes=True), + f"Wrong AST generation for source: {source}", + ) + + def test_correct_ast_generation_without_pos_info(self) -> None: + for source in GOOD_BUT_FAIL_SOURCES: + actual_ast = peg_parser.parse_string(source) + expected_ast = peg_parser.parse_string(source, oldparser=True) + self.assertEqual( + ast.dump(actual_ast), + ast.dump(expected_ast), + f"Wrong AST generation for source: {source}", + ) + + def test_fstring_parse_error_tracebacks(self) -> None: + for source, error_text in FSTRINGS_TRACEBACKS.values(): + with self.assertRaises(SyntaxError) as se: + peg_parser.parse_string(dedent(source)) + self.assertEqual(error_text, se.exception.text) + + def test_correct_ast_generatrion_eval(self) -> None: + for source in EXPRESSIONS_TEST_SOURCES: + actual_ast = peg_parser.parse_string(source, mode='eval') + expected_ast = peg_parser.parse_string(source, mode='eval', oldparser=True) + self.assertEqual( + ast.dump(actual_ast, include_attributes=True), + ast.dump(expected_ast, include_attributes=True), + f"Wrong AST generation for source: {source}", + ) + + def test_tokenizer_errors_are_propagated(self) -> None: + n=201 + with self.assertRaisesRegex(SyntaxError, "too many nested parentheses"): + peg_parser.parse_string(n*'(' + ')'*n) diff --git a/Lib/test/test_pkgimport.py b/Lib/test/test_pkgimport.py deleted file mode 100644 index 5d9a4511..00000000 --- a/Lib/test/test_pkgimport.py +++ /dev/null @@ -1,80 +0,0 @@ -import os -import sys -import shutil -import string -import random -import tempfile -import unittest - -from importlib.util import cache_from_source -from test.support import create_empty_file - -class TestImport(unittest.TestCase): - - def __init__(self, *args, **kw): - self.package_name = 'PACKAGE_' - while self.package_name in sys.modules: - self.package_name += random.choose(string.ascii_letters) - self.module_name = self.package_name + '.foo' - unittest.TestCase.__init__(self, *args, **kw) - - def remove_modules(self): - for module_name in (self.package_name, self.module_name): - if module_name in sys.modules: - del sys.modules[module_name] - - def setUp(self): - self.test_dir = tempfile.mkdtemp() - sys.path.append(self.test_dir) - self.package_dir = os.path.join(self.test_dir, - self.package_name) - os.mkdir(self.package_dir) - create_empty_file(os.path.join(self.package_dir, '__init__.py')) - self.module_path = os.path.join(self.package_dir, 'foo.py') - - def tearDown(self): - shutil.rmtree(self.test_dir) - self.assertNotEqual(sys.path.count(self.test_dir), 0) - sys.path.remove(self.test_dir) - self.remove_modules() - - def rewrite_file(self, contents): - compiled_path = cache_from_source(self.module_path) - if os.path.exists(compiled_path): - os.remove(compiled_path) - with open(self.module_path, 'w') as f: - f.write(contents) - - def test_package_import__semantics(self): - - # Generate a couple of broken modules to try importing. - - # ...try loading the module when there's a SyntaxError - self.rewrite_file('for') - try: __import__(self.module_name) - except SyntaxError: pass - else: raise RuntimeError('Failed to induce SyntaxError') # self.fail()? - self.assertNotIn(self.module_name, sys.modules) - self.assertFalse(hasattr(sys.modules[self.package_name], 'foo')) - - # ...make up a variable name that isn't bound in __builtins__ - var = 'a' - while var in dir(__builtins__): - var += random.choose(string.ascii_letters) - - # ...make a module that just contains that - self.rewrite_file(var) - - try: __import__(self.module_name) - except NameError: pass - else: raise RuntimeError('Failed to induce NameError.') - - # ...now change the module so that the NameError doesn't - # happen - self.rewrite_file('%s = 1' % var) - module = __import__(self.module_name).foo - self.assertEqual(getattr(module, var), 1) - - -if __name__ == "__main__": - unittest.main() diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py index 2887ce6c..b162f994 100644 --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -186,6 +186,97 @@ class PkgutilTests(unittest.TestCase): with self.assertRaises((TypeError, ValueError)): list(pkgutil.walk_packages(bytes_input)) + def test_name_resolution(self): + import logging + import logging.handlers + + success_cases = ( + ('os', os), + ('os.path', os.path), + ('os.path:pathsep', os.path.pathsep), + ('logging', logging), + ('logging:', logging), + ('logging.handlers', logging.handlers), + ('logging.handlers:', logging.handlers), + ('logging.handlers:SysLogHandler', logging.handlers.SysLogHandler), + ('logging.handlers.SysLogHandler', logging.handlers.SysLogHandler), + ('logging.handlers:SysLogHandler.LOG_ALERT', + logging.handlers.SysLogHandler.LOG_ALERT), + ('logging.handlers.SysLogHandler.LOG_ALERT', + logging.handlers.SysLogHandler.LOG_ALERT), + ('builtins.int', int), + ('builtins:int', int), + ('builtins.int.from_bytes', int.from_bytes), + ('builtins:int.from_bytes', int.from_bytes), + ('builtins.ZeroDivisionError', ZeroDivisionError), + ('builtins:ZeroDivisionError', ZeroDivisionError), + ('os:path', os.path), + ) + + failure_cases = ( + (None, TypeError), + (1, TypeError), + (2.0, TypeError), + (True, TypeError), + ('', ValueError), + ('?abc', ValueError), + ('abc/foo', ValueError), + ('foo', ImportError), + ('os.foo', AttributeError), + ('os.foo:', ImportError), + ('os.pth:pathsep', ImportError), + ('logging.handlers:NoSuchHandler', AttributeError), + ('logging.handlers:SysLogHandler.NO_SUCH_VALUE', AttributeError), + ('logging.handlers.SysLogHandler.NO_SUCH_VALUE', AttributeError), + ('ZeroDivisionError', ImportError), + ('os.path.9abc', ValueError), + ('9abc', ValueError), + ) + + # add some Unicode package names to the mix. + + unicode_words = ('\u0935\u092e\u0938', + '\xe9', '\xc8', + '\uc548\ub155\ud558\uc138\uc694', + '\u3055\u3088\u306a\u3089', + '\u3042\u308a\u304c\u3068\u3046', + '\u0425\u043e\u0440\u043e\u0448\u043e', + '\u0441\u043f\u0430\u0441\u0438\u0431\u043e', + '\u73b0\u4ee3\u6c49\u8bed\u5e38\u7528\u5b57\u8868') + + for uw in unicode_words: + d = os.path.join(self.dirname, uw) + try: + os.makedirs(d, exist_ok=True) + except UnicodeEncodeError: + # When filesystem encoding cannot encode uw: skip this test + continue + # make an empty __init__.py file + f = os.path.join(d, '__init__.py') + with open(f, 'w') as f: + f.write('') + f.flush() + # now import the package we just created; clearing the caches is + # needed, otherwise the newly created package isn't found + importlib.invalidate_caches() + mod = importlib.import_module(uw) + success_cases += (uw, mod), + if len(uw) > 1: + failure_cases += (uw[:-1], ImportError), + + # add an example with a Unicode digit at the start + failure_cases += ('\u0966\u0935\u092e\u0938', ValueError), + + for s, expected in success_cases: + with self.subTest(s=s): + o = pkgutil.resolve_name(s) + self.assertEqual(o, expected) + + for s, exc in failure_cases: + with self.subTest(s=s): + with self.assertRaises(exc): + pkgutil.resolve_name(s) + class PkgutilPEP302Tests(unittest.TestCase): diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 3084663a..a5c35dff 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -154,11 +154,39 @@ class PlatformTest(unittest.TestCase): res = platform.uname() self.assertTrue(any(res)) self.assertEqual(res[0], res.system) + self.assertEqual(res[-6], res.system) self.assertEqual(res[1], res.node) + self.assertEqual(res[-5], res.node) self.assertEqual(res[2], res.release) + self.assertEqual(res[-4], res.release) self.assertEqual(res[3], res.version) + self.assertEqual(res[-3], res.version) self.assertEqual(res[4], res.machine) + self.assertEqual(res[-2], res.machine) self.assertEqual(res[5], res.processor) + self.assertEqual(res[-1], res.processor) + self.assertEqual(len(res), 6) + + def test_uname_cast_to_tuple(self): + res = platform.uname() + expected = ( + res.system, res.node, res.release, res.version, res.machine, + res.processor, + ) + self.assertEqual(tuple(res), expected) + + @unittest.skipIf(sys.platform in ['win32', 'OpenVMS'], "uname -p not used") + def test_uname_processor(self): + """ + On some systems, the processor must match the output + of 'uname -p'. See Issue 35967 for rationale. + """ + try: + proc_res = subprocess.check_output(['uname', '-p'], text=True).strip() + expect = platform._unknown_as_blank(proc_res) + except (OSError, subprocess.CalledProcessError): + expect = '' + self.assertEqual(platform.uname().processor, expect) @unittest.skipUnless(sys.platform.startswith('win'), "windows only test") def test_uname_win32_ARCHITEW6432(self): @@ -236,9 +264,7 @@ class PlatformTest(unittest.TestCase): else: # parent - cpid, sts = os.waitpid(pid, 0) - self.assertEqual(cpid, pid) - self.assertEqual(sts, 0) + support.wait_process(pid, exitcode=0) def test_libc_ver(self): # check that libc_ver(executable) doesn't raise an exception diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py index 0d887e21..e82a53c5 100644 --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -263,14 +263,12 @@ class TestPlistlib(unittest.TestCase): self.assertEqual(copy.deepcopy(UID(1)), UID(1)) def test_appleformatting(self): - for use_builtin_types in (True, False): - for fmt in ALL_FORMATS: - with self.subTest(fmt=fmt, use_builtin_types=use_builtin_types): - pl = plistlib.loads(TESTDATA[fmt], - use_builtin_types=use_builtin_types) - data = plistlib.dumps(pl, fmt=fmt) - self.assertEqual(data, TESTDATA[fmt], - "generated data was not identical to Apple's output") + for fmt in ALL_FORMATS: + with self.subTest(fmt=fmt): + pl = plistlib.loads(TESTDATA[fmt]) + data = plistlib.dumps(pl, fmt=fmt) + self.assertEqual(data, TESTDATA[fmt], + "generated data was not identical to Apple's output") def test_appleformattingfromliteral(self): @@ -544,8 +542,7 @@ class TestBinaryPlistlib(unittest.TestCase): # Test effectiveness of saving duplicated objects for x in (None, False, True, 12345, 123.45, 'abcde', b'abcde', datetime.datetime(2004, 10, 26, 10, 33, 33), - plistlib.Data(b'abcde'), bytearray(b'abcde'), - [12, 345], (12, 345), {'12': 345}): + bytearray(b'abcde'), [12, 345], (12, 345), {'12': 345}): with self.subTest(x=x): data = plistlib.dumps([x]*1000, fmt=plistlib.FMT_BINARY) self.assertLess(len(data), 1100, repr(data)) @@ -553,8 +550,7 @@ class TestBinaryPlistlib(unittest.TestCase): def test_identity(self): for x in (None, False, True, 12345, 123.45, 'abcde', b'abcde', datetime.datetime(2004, 10, 26, 10, 33, 33), - plistlib.Data(b'abcde'), bytearray(b'abcde'), - [12, 345], (12, 345), {'12': 345}): + bytearray(b'abcde'), [12, 345], (12, 345), {'12': 345}): with self.subTest(x=x): data = plistlib.dumps([x]*2, fmt=plistlib.FMT_BINARY) a, b = plistlib.loads(data) @@ -641,95 +637,6 @@ class TestBinaryPlistlib(unittest.TestCase): plistlib.loads(b'bplist00' + data, fmt=plistlib.FMT_BINARY) -class TestPlistlibDeprecated(unittest.TestCase): - def test_io_deprecated(self): - pl_in = { - 'key': 42, - 'sub': { - 'key': 9, - 'alt': 'value', - 'data': b'buffer', - } - } - pl_out = { - 'key': 42, - 'sub': { - 'key': 9, - 'alt': 'value', - 'data': plistlib.Data(b'buffer'), - } - } - - self.addCleanup(support.unlink, support.TESTFN) - with self.assertWarns(DeprecationWarning): - plistlib.writePlist(pl_in, support.TESTFN) - - with self.assertWarns(DeprecationWarning): - pl2 = plistlib.readPlist(support.TESTFN) - - self.assertEqual(pl_out, pl2) - - os.unlink(support.TESTFN) - - with open(support.TESTFN, 'wb') as fp: - with self.assertWarns(DeprecationWarning): - plistlib.writePlist(pl_in, fp) - - with open(support.TESTFN, 'rb') as fp: - with self.assertWarns(DeprecationWarning): - pl2 = plistlib.readPlist(fp) - - self.assertEqual(pl_out, pl2) - - def test_bytes_deprecated(self): - pl = { - 'key': 42, - 'sub': { - 'key': 9, - 'alt': 'value', - 'data': b'buffer', - } - } - with self.assertWarns(DeprecationWarning): - data = plistlib.writePlistToBytes(pl) - - with self.assertWarns(DeprecationWarning): - pl2 = plistlib.readPlistFromBytes(data) - - self.assertIsInstance(pl2, dict) - self.assertEqual(pl2, dict( - key=42, - sub=dict( - key=9, - alt='value', - data=plistlib.Data(b'buffer'), - ) - )) - - with self.assertWarns(DeprecationWarning): - data2 = plistlib.writePlistToBytes(pl2) - self.assertEqual(data, data2) - - def test_dataobject_deprecated(self): - in_data = { 'key': plistlib.Data(b'hello') } - out_data = { 'key': b'hello' } - - buf = plistlib.dumps(in_data) - - cur = plistlib.loads(buf) - self.assertEqual(cur, out_data) - self.assertEqual(cur, in_data) - - cur = plistlib.loads(buf, use_builtin_types=False) - self.assertEqual(cur, out_data) - self.assertEqual(cur, in_data) - - with self.assertWarns(DeprecationWarning): - cur = plistlib.readPlistFromBytes(buf) - self.assertEqual(cur, out_data) - self.assertEqual(cur, in_data) - - class TestKeyedArchive(unittest.TestCase): def test_keyed_archive_data(self): # This is the structure of a NSKeyedArchive packed plist diff --git a/Lib/test/test_popen.py b/Lib/test/test_popen.py index da01a878..ab1bc776 100644 --- a/Lib/test/test_popen.py +++ b/Lib/test/test_popen.py @@ -44,10 +44,11 @@ class PopenTest(unittest.TestCase): def test_return_code(self): self.assertEqual(os.popen("exit 0").close(), None) + status = os.popen("exit 42").close() if os.name == 'nt': - self.assertEqual(os.popen("exit 42").close(), 42) + self.assertEqual(status, 42) else: - self.assertEqual(os.popen("exit 42").close(), 42 << 8) + self.assertEqual(os.waitstatus_to_exitcode(status), 42) def test_contextmanager(self): with os.popen("echo hello") as f: diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py index 7b1d854d..b670afcf 100644 --- a/Lib/test/test_poplib.py +++ b/Lib/test/test_poplib.py @@ -13,8 +13,10 @@ import threading from unittest import TestCase, skipUnless from test import support as test_support +from test.support import hashlib_helper +from test.support import socket_helper -HOST = test_support.HOST +HOST = socket_helper.HOST PORT = 0 SUPPORTS_SSL = False @@ -255,7 +257,8 @@ class TestPOP3Class(TestCase): def setUp(self): self.server = DummyPOP3Server((HOST, PORT)) self.server.start() - self.client = poplib.POP3(self.server.host, self.server.port, timeout=3) + self.client = poplib.POP3(self.server.host, self.server.port, + timeout=test_support.LOOPBACK_TIMEOUT) def tearDown(self): self.client.close() @@ -309,11 +312,11 @@ class TestPOP3Class(TestCase): def test_rpop(self): self.assertOK(self.client.rpop('foo')) - @test_support.requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def test_apop_normal(self): self.assertOK(self.client.apop('foo', 'dummypassword')) - @test_support.requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def test_apop_REDOS(self): # Replace welcome with very long evil welcome. # NB The upper bound on welcome length is currently 2048. @@ -376,7 +379,8 @@ class TestPOP3Class(TestCase): self.assertEqual(ctx.check_hostname, True) with self.assertRaises(ssl.CertificateError): resp = self.client.stls(context=ctx) - self.client = poplib.POP3("localhost", self.server.port, timeout=3) + self.client = poplib.POP3("localhost", self.server.port, + timeout=test_support.LOOPBACK_TIMEOUT) resp = self.client.stls(context=ctx) self.assertEqual(resp, expected) @@ -445,7 +449,8 @@ class TestPOP3_TLSClass(TestPOP3Class): def setUp(self): self.server = DummyPOP3Server((HOST, PORT)) self.server.start() - self.client = poplib.POP3(self.server.host, self.server.port, timeout=3) + self.client = poplib.POP3(self.server.host, self.server.port, + timeout=test_support.LOOPBACK_TIMEOUT) self.client.stls() def tearDown(self): @@ -477,8 +482,8 @@ class TestTimeouts(TestCase): self.evt = threading.Event() self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(60) # Safety net. Look issue 11812 - self.port = test_support.bind_port(self.sock) - self.thread = threading.Thread(target=self.server, args=(self.evt,self.sock)) + self.port = socket_helper.bind_port(self.sock) + self.thread = threading.Thread(target=self.server, args=(self.evt, self.sock)) self.thread.daemon = True self.thread.start() self.evt.wait() @@ -502,12 +507,12 @@ class TestTimeouts(TestCase): def testTimeoutDefault(self): self.assertIsNone(socket.getdefaulttimeout()) - socket.setdefaulttimeout(30) + socket.setdefaulttimeout(test_support.LOOPBACK_TIMEOUT) try: pop = poplib.POP3(HOST, self.port) finally: socket.setdefaulttimeout(None) - self.assertEqual(pop.sock.gettimeout(), 30) + self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT) pop.close() def testTimeoutNone(self): @@ -521,9 +526,11 @@ class TestTimeouts(TestCase): pop.close() def testTimeoutValue(self): - pop = poplib.POP3(HOST, self.port, timeout=30) - self.assertEqual(pop.sock.gettimeout(), 30) + pop = poplib.POP3(HOST, self.port, timeout=test_support.LOOPBACK_TIMEOUT) + self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT) pop.close() + with self.assertRaises(ValueError): + poplib.POP3(HOST, self.port, timeout=0) def test_main(): diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 2ef40e3a..0a9503e2 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -16,11 +16,6 @@ def global_pos_only_and_normal(a, /, b): def global_pos_only_defaults(a=1, /, b=2): return a, b -def global_inner_has_pos_only(): - def f(x: int, /): ... - return f - - class PositionalOnlyTestCase(unittest.TestCase): def assertRaisesSyntaxError(self, codestr, regex="invalid syntax"): @@ -266,12 +261,6 @@ class PositionalOnlyTestCase(unittest.TestCase): with self.assertRaisesRegex(TypeError, expected): Example().f(1, b=2) - def test_mangling(self): - class X: - def f(self, *, __a=42): - return __a - self.assertEqual(X().f(), 42) - def test_module_function(self): with self.assertRaisesRegex(TypeError, r"f\(\) missing 2 required positional arguments: 'a' and 'b'"): global_pos_only_f() @@ -307,6 +296,29 @@ class PositionalOnlyTestCase(unittest.TestCase): with self.assertRaisesRegex(TypeError, r"g\(\) takes 2 positional arguments but 3 were given"): f(1,2)(3,4,5) + def test_annotations_in_closures(self): + + def inner_has_pos_only(): + def f(x: int, /): ... + return f + + assert inner_has_pos_only().__annotations__ == {'x': int} + + class Something: + def method(self): + def f(x: int, /): ... + return f + + assert Something().method().__annotations__ == {'x': int} + + def multiple_levels(): + def inner_has_pos_only(): + def f(x: int, /): ... + return f + return inner_has_pos_only() + + assert multiple_levels().__annotations__ == {'x': int} + def test_same_keyword_as_positional_with_kwargs(self): def f(something,/,**kwargs): return (something, kwargs) @@ -417,19 +429,16 @@ class PositionalOnlyTestCase(unittest.TestCase): self.assertEqual(C().method(), sentinel) - def test_annotations(self): - assert global_inner_has_pos_only().__annotations__ == {'x': int} - def test_annotations_constant_fold(self): def g(): def f(x: not (int is int), /): ... # without constant folding we end up with - # COMPARE_OP(is), UNARY_NOT - # with constant folding we should expect a COMPARE_OP(is not) + # COMPARE_OP(is), IS_OP (0) + # with constant folding we should expect a IS_OP (1) codes = [(i.opname, i.argval) for i in dis.get_instructions(g)] self.assertNotIn(('UNARY_NOT', None), codes) - self.assertIn(('COMPARE_OP', 'is not'), codes) + self.assertIn(('IS_OP', 1), codes) if __name__ == "__main__": diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 9bdd2848..be121ae4 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -37,6 +37,7 @@ def _supports_sched(): requires_sched = unittest.skipUnless(_supports_sched(), 'requires POSIX scheduler API') + class PosixTester(unittest.TestCase): def setUp(self): @@ -180,7 +181,6 @@ class PosixTester(unittest.TestCase): @unittest.skipUnless(getattr(os, 'execve', None) in os.supports_fd, "test needs execve() to support the fd parameter") @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()") - @unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()") def test_fexecve(self): fp = os.open(sys.executable, os.O_RDONLY) try: @@ -189,7 +189,7 @@ class PosixTester(unittest.TestCase): os.chdir(os.path.split(sys.executable)[0]) posix.execve(fp, [sys.executable, '-c', 'pass'], os.environ) else: - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) finally: os.close(fp) @@ -969,7 +969,6 @@ class PosixTester(unittest.TestCase): self.assertEqual(type(k), item_type) self.assertEqual(type(v), item_type) - @unittest.skipUnless(hasattr(os, "putenv"), "requires os.putenv()") def test_putenv(self): with self.assertRaises(ValueError): os.putenv('FRUIT\0VEGETABLE', 'cabbage') @@ -1226,6 +1225,16 @@ class PosixTester(unittest.TestCase): finally: posix.close(f) + @unittest.skipUnless(hasattr(signal, 'SIGCHLD'), 'CLD_XXXX be placed in si_code for a SIGCHLD signal') + @unittest.skipUnless(hasattr(os, 'waitid_result'), "test needs os.waitid_result") + def test_cld_xxxx_constants(self): + os.CLD_EXITED + os.CLD_KILLED + os.CLD_DUMPED + os.CLD_TRAPPED + os.CLD_STOPPED + os.CLD_CONTINUED + @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()") def test_symlink_dir_fd(self): f = posix.open(posix.getcwd(), posix.O_RDONLY) @@ -1460,6 +1469,17 @@ class PosixTester(unittest.TestCase): open(fn, 'wb').close() self.assertRaises(ValueError, os.stat, fn_with_NUL) + @unittest.skipUnless(hasattr(os, "pidfd_open"), "pidfd_open unavailable") + def test_pidfd_open(self): + with self.assertRaises(OSError) as cm: + os.pidfd_open(-1) + if cm.exception.errno == errno.ENOSYS: + self.skipTest("system does not support pidfd_open") + if isinstance(cm.exception, PermissionError): + self.skipTest(f"pidfd_open syscall blocked: {cm.exception!r}") + self.assertEqual(cm.exception.errno, errno.EINVAL) + os.close(os.pidfd_open(os.getpid(), 0)) + class PosixGroupsTester(unittest.TestCase): def setUp(self): @@ -1519,7 +1539,7 @@ class _PosixSpawnMixin: """ args = self.python_args('-c', script) pid = self.spawn_func(args[0], args, os.environ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) with open(pidfile) as f: self.assertEqual(f.read(), str(pid)) @@ -1549,7 +1569,7 @@ class _PosixSpawnMixin: args = self.python_args('-c', script) pid = self.spawn_func(args[0], args, {**os.environ, 'foo': 'bar'}) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) with open(envfile) as f: self.assertEqual(f.read(), 'bar') @@ -1560,7 +1580,7 @@ class _PosixSpawnMixin: os.environ, file_actions=None ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_empty_file_actions(self): pid = self.spawn_func( @@ -1569,7 +1589,7 @@ class _PosixSpawnMixin: os.environ, file_actions=[] ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_resetids_explicit_default(self): pid = self.spawn_func( @@ -1578,7 +1598,7 @@ class _PosixSpawnMixin: os.environ, resetids=False ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_resetids(self): pid = self.spawn_func( @@ -1587,7 +1607,7 @@ class _PosixSpawnMixin: os.environ, resetids=True ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_resetids_wrong_type(self): with self.assertRaises(TypeError): @@ -1602,7 +1622,7 @@ class _PosixSpawnMixin: os.environ, setpgroup=os.getpgrp() ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_setpgroup_wrong_type(self): with self.assertRaises(TypeError): @@ -1623,7 +1643,7 @@ class _PosixSpawnMixin: os.environ, setsigmask=[signal.SIGUSR1] ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_setsigmask_wrong_type(self): with self.assertRaises(TypeError): @@ -1664,7 +1684,8 @@ class _PosixSpawnMixin: finally: os.close(wfd) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) + output = os.read(rfd, 100) child_sid = int(output) parent_sid = os.getsid(os.getpid()) @@ -1687,10 +1708,7 @@ class _PosixSpawnMixin: finally: signal.signal(signal.SIGUSR1, original_handler) - pid2, status = os.waitpid(pid, 0) - self.assertEqual(pid2, pid) - self.assertTrue(os.WIFSIGNALED(status), status) - self.assertEqual(os.WTERMSIG(status), signal.SIGUSR1) + support.wait_process(pid, exitcode=-signal.SIGUSR1) def test_setsigdef_wrong_type(self): with self.assertRaises(TypeError): @@ -1724,7 +1742,7 @@ class _PosixSpawnMixin: os.environ, scheduler=(None, os.sched_param(priority)) ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) @requires_sched @unittest.skipIf(sys.platform.startswith(('freebsd', 'netbsd')), @@ -1744,7 +1762,7 @@ class _PosixSpawnMixin: os.environ, scheduler=(policy, os.sched_param(priority)) ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_multiple_file_actions(self): file_actions = [ @@ -1756,7 +1774,7 @@ class _PosixSpawnMixin: self.NOOP_PROGRAM, os.environ, file_actions=file_actions) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_bad_file_actions(self): args = self.NOOP_PROGRAM @@ -1802,7 +1820,8 @@ class _PosixSpawnMixin: args = self.python_args('-c', script) pid = self.spawn_func(args[0], args, os.environ, file_actions=file_actions) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + + support.wait_process(pid, exitcode=0) with open(outfile) as f: self.assertEqual(f.read(), 'hello') @@ -1820,7 +1839,8 @@ class _PosixSpawnMixin: args = self.python_args('-c', script) pid = self.spawn_func(args[0], args, os.environ, file_actions=[(os.POSIX_SPAWN_CLOSE, 0)]) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + + support.wait_process(pid, exitcode=0) with open(closefile) as f: self.assertEqual(f.read(), 'is closed %d' % errno.EBADF) @@ -1838,7 +1858,7 @@ class _PosixSpawnMixin: args = self.python_args('-c', script) pid = self.spawn_func(args[0], args, os.environ, file_actions=file_actions) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) with open(dupfile) as f: self.assertEqual(f.read(), 'hello') @@ -1870,13 +1890,12 @@ class TestPosixSpawnP(unittest.TestCase, _PosixSpawnMixin): spawn_args = (program, '-I', '-S', '-c', 'pass') code = textwrap.dedent(""" import os + from test import support + args = %a pid = os.posix_spawnp(args[0], args, os.environ) - pid2, status = os.waitpid(pid, 0) - if pid2 != pid: - raise Exception(f"pid {pid2} != {pid}") - if status != 0: - raise Exception(f"status {status} != 0") + + support.wait_process(pid, exitcode=0) """ % (spawn_args,)) # Use a subprocess to test os.posix_spawnp() with a modified PATH diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py index 4d3d8976..18819a5d 100644 --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -627,7 +627,7 @@ class PathLikeTests(unittest.TestCase): path = posixpath def setUp(self): - self.file_name = support.TESTFN.lower() + self.file_name = support.TESTFN self.file_path = FakePath(support.TESTFN) self.addCleanup(support.unlink, self.file_name) with open(self.file_name, 'xb', 0) as file: diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py index 269ac062..cf3e4f09 100644 --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -346,6 +346,65 @@ mappingproxy(OrderedDict([('the', 0), ('lazy', 7), ('dog', 8)]))""") + def test_empty_simple_namespace(self): + ns = types.SimpleNamespace() + formatted = pprint.pformat(ns) + self.assertEqual(formatted, "namespace()") + + def test_small_simple_namespace(self): + ns = types.SimpleNamespace(a=1, b=2) + formatted = pprint.pformat(ns) + self.assertEqual(formatted, "namespace(a=1, b=2)") + + def test_simple_namespace(self): + ns = types.SimpleNamespace( + the=0, + quick=1, + brown=2, + fox=3, + jumped=4, + over=5, + a=6, + lazy=7, + dog=8, + ) + formatted = pprint.pformat(ns, width=60) + self.assertEqual(formatted, """\ +namespace(the=0, + quick=1, + brown=2, + fox=3, + jumped=4, + over=5, + a=6, + lazy=7, + dog=8)""") + + def test_simple_namespace_subclass(self): + class AdvancedNamespace(types.SimpleNamespace): pass + ns = AdvancedNamespace( + the=0, + quick=1, + brown=2, + fox=3, + jumped=4, + over=5, + a=6, + lazy=7, + dog=8, + ) + formatted = pprint.pformat(ns, width=60) + self.assertEqual(formatted, """\ +AdvancedNamespace(the=0, + quick=1, + brown=2, + fox=3, + jumped=4, + over=5, + a=6, + lazy=7, + dog=8)""") + def test_subclassing(self): o = {'names with spaces': 'should be presented using repr()', 'others.should.not.be': 'like.this'} @@ -422,7 +481,7 @@ frozenset2({0, # Consequently, this test is fragile and # implementation-dependent. Small changes to Python's sort # algorithm cause the test to fail when it should pass. - # XXX Or changes to the dictionary implmentation... + # XXX Or changes to the dictionary implementation... cube_repr_tgt = """\ {frozenset(): frozenset({frozenset({2}), frozenset({0}), frozenset({1})}), diff --git a/Lib/test/test_property.py b/Lib/test/test_property.py index f6f8f5ed..172737ad 100644 --- a/Lib/test/test_property.py +++ b/Lib/test/test_property.py @@ -183,6 +183,27 @@ class PropertyTests(unittest.TestCase): fake_prop.__init__('fget', 'fset', 'fdel', 'doc') self.assertAlmostEqual(gettotalrefcount() - refs_before, 0, delta=10) + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_class_property(self): + class A: + @classmethod + @property + def __doc__(cls): + return 'A doc for %r' % cls.__name__ + self.assertEqual(A.__doc__, "A doc for 'A'") + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_class_property_override(self): + class A: + """First""" + @classmethod + @property + def __doc__(cls): + return 'Second' + self.assertEqual(A.__doc__, 'Second') + # Issue 5890: subclasses of property do not preserve method __doc__ strings class PropertySub(property): diff --git a/Lib/test/test_pstats.py b/Lib/test/test_pstats.py index 052a3b9c..10559deb 100644 --- a/Lib/test/test_pstats.py +++ b/Lib/test/test_pstats.py @@ -1,10 +1,11 @@ import unittest + from test import support from io import StringIO -import pstats from pstats import SortKey - +import pstats +import cProfile class AddCallersTestCase(unittest.TestCase): """Tests for pstats.add_callers helper.""" @@ -75,10 +76,24 @@ class StatsTestCase(unittest.TestCase): SortKey.TIME, 'calls') + def test_get_stats_profile(self): + def pass1(): pass + def pass2(): pass + def pass3(): pass + + pr = cProfile.Profile() + pr.enable() + pass1() + pass2() + pass3() + pr.create_stats() + ps = pstats.Stats(pr) - def test_SortKey_enum(self): - self.assertEqual(SortKey.FILENAME, 'filename') - self.assertNotEqual(SortKey.FILENAME, SortKey.CALLS) + stats_profile = ps.get_stats_profile() + funcs_called = set(stats_profile.func_profiles.keys()) + self.assertIn('pass1', funcs_called) + self.assertIn('pass2', funcs_called) + self.assertIn('pass3', funcs_called) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index dfb3a3fc..9c32467c 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -200,8 +200,8 @@ class PtyTest(unittest.TestCase): ## raise TestFailed("Unexpected output from child: %r" % line) (pid, status) = os.waitpid(pid, 0) - res = status >> 8 - debug("Child (%d) exited with status %d (%d)." % (pid, res, status)) + res = os.waitstatus_to_exitcode(status) + debug("Child (%d) exited with code %d (status %d)." % (pid, res, status)) if res == 1: self.fail("Child raised an unexpected exception in os.setsid()") elif res == 2: diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index fafe17ce..869799cf 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -223,9 +223,7 @@ class PyclbrTest(TestCase): cm('random', ignore=('Random',)) # from _random import Random as CoreGenerator cm('cgi', ignore=('log',)) # set with = in module cm('pickle', ignore=('partial', 'PickleBuffer')) - # TODO(briancurtin): openfp is deprecated as of 3.7. - # Update this once it has been removed. - cm('aifc', ignore=('openfp', '_aifc_params')) # set with = in module + cm('aifc', ignore=('_aifc_params',)) # set with = in module cm('sre_parse', ignore=('dump', 'groups', 'pos')) # from sre_constants import *; property cm('pdb') cm('pydoc', ignore=('input', 'output',)) # properties @@ -249,7 +247,7 @@ class ReadmoduleTests(TestCase): # not a package. # # Issue #14798. - self.assertRaises(ImportError, pyclbr.readmodule_ex, 'asyncore.foo') + self.assertRaises(ImportError, pyclbr.readmodule_ex, 'asyncio.foo') def test_module_has_no_spec(self): module_name = "doesnotexist" diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index c80477c5..ffabb7f1 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -476,6 +476,7 @@ class PydocDocTest(unittest.TestCase): def test_non_str_name(self): # issue14638 # Treat illegal (non-str) name like no name + class A: __name__ = 42 class B: @@ -1254,7 +1255,9 @@ cm(x) method of builtins.type instance X.attr.__doc__ = 'Custom descriptor' self.assertEqual(self._get_summary_lines(X.attr), """\ -.Descr object>""") +.Descr object> + Custom descriptor +""") X.attr.__name__ = 'foo' self.assertEqual(self._get_summary_lines(X.attr), """\ @@ -1311,6 +1314,17 @@ foo 'async an_async_generator', html) + def test_html_for_https_links(self): + def a_fn_with_https_link(): + """a link https://localhost/""" + pass + + html = pydoc.HTMLDoc().document(a_fn_with_https_link) + self.assertIn( + 'https://localhost/', + html + ) + class PydocServerTest(unittest.TestCase): """Tests for pydoc._start_server""" @@ -1325,7 +1339,7 @@ class PydocServerTest(unittest.TestCase): self.assertIn('0.0.0.0', serverthread.docserver.address) starttime = time.monotonic() - timeout = 1 #seconds + timeout = test.support.SHORT_TIMEOUT while serverthread.serving: time.sleep(.01) diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index 2b6c2d20..b2b4dea0 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -3,6 +3,7 @@ from io import BytesIO import os +import platform import sys import sysconfig import unittest @@ -230,7 +231,7 @@ class ParseTest(unittest.TestCase): parser = expat.ParserCreate(namespace_separator='!') self._hookup_callbacks(parser, out) - parser.Parse(data, 1) + parser.Parse(data, True) operations = out.out self._verify_parse_output(operations) @@ -242,7 +243,7 @@ class ParseTest(unittest.TestCase): parser = expat.ParserCreate(namespace_separator='!') self._hookup_callbacks(parser, out) - parser.Parse(data.decode('iso-8859-1'), 1) + parser.Parse(data.decode('iso-8859-1'), True) operations = out.out self._verify_parse_output(operations) @@ -315,7 +316,7 @@ class InterningTest(unittest.TestCase): L.append(name) p.StartElementHandler = collector p.EndElementHandler = collector - p.Parse(b" ", 1) + p.Parse(b" ", True) tag = L[0] self.assertEqual(len(L), 6) for entry in L: @@ -331,14 +332,14 @@ class InterningTest(unittest.TestCase): def ExternalEntityRefHandler(self, context, base, sysId, pubId): external_parser = self.parser.ExternalEntityParserCreate("") - self.parser_result = external_parser.Parse(b"", 1) + self.parser_result = external_parser.Parse(b"", True) return 1 parser = expat.ParserCreate(namespace_separator='!') parser.buffer_text = 1 out = ExternalOutputter(parser) parser.ExternalEntityRefHandler = out.ExternalEntityRefHandler - parser.Parse(data, 1) + parser.Parse(data, True) self.assertEqual(out.parser_result, 1) @@ -382,7 +383,7 @@ class BufferTextTest(unittest.TestCase): def test_buffering_enabled(self): # Make sure buffering is turned on self.assertTrue(self.parser.buffer_text) - self.parser.Parse(b"123", 1) + self.parser.Parse(b"123", True) self.assertEqual(self.stuff, ['123'], "buffered text not properly collapsed") @@ -390,39 +391,39 @@ class BufferTextTest(unittest.TestCase): # XXX This test exposes more detail of Expat's text chunking than we # XXX like, but it tests what we need to concisely. self.setHandlers(["StartElementHandler"]) - self.parser.Parse(b"12\n34\n5", 1) + self.parser.Parse(b"12\n34\n5", True) self.assertEqual(self.stuff, ["", "1", "", "2", "\n", "3", "", "4\n5"], "buffering control not reacting as expected") def test2(self): - self.parser.Parse(b"1<2> \n 3", 1) + self.parser.Parse(b"1<2> \n 3", True) self.assertEqual(self.stuff, ["1<2> \n 3"], "buffered text not properly collapsed") def test3(self): self.setHandlers(["StartElementHandler"]) - self.parser.Parse(b"123", 1) + self.parser.Parse(b"123", True) self.assertEqual(self.stuff, ["", "1", "", "2", "", "3"], "buffered text not properly split") def test4(self): self.setHandlers(["StartElementHandler", "EndElementHandler"]) self.parser.CharacterDataHandler = None - self.parser.Parse(b"123", 1) + self.parser.Parse(b"123", True) self.assertEqual(self.stuff, ["", "", "", "", "", ""]) def test5(self): self.setHandlers(["StartElementHandler", "EndElementHandler"]) - self.parser.Parse(b"123", 1) + self.parser.Parse(b"123", True) self.assertEqual(self.stuff, ["", "1", "", "", "2", "", "", "3", ""]) def test6(self): self.setHandlers(["CommentHandler", "EndElementHandler", "StartElementHandler"]) - self.parser.Parse(b"12345 ", 1) + self.parser.Parse(b"12345 ", True) self.assertEqual(self.stuff, ["", "1", "", "", "2", "", "", "345", ""], "buffered text not properly split") @@ -430,7 +431,7 @@ class BufferTextTest(unittest.TestCase): def test7(self): self.setHandlers(["CommentHandler", "EndElementHandler", "StartElementHandler"]) - self.parser.Parse(b"12345 ", 1) + self.parser.Parse(b"12345 ", True) self.assertEqual(self.stuff, ["", "1", "", "", "2", "", "", "3", "", "4", "", "5", ""], @@ -450,7 +451,7 @@ class HandlerExceptionTest(unittest.TestCase): parser = expat.ParserCreate() parser.StartElementHandler = self.StartElementHandler try: - parser.Parse(b"", 1) + parser.Parse(b"", True) self.fail() except RuntimeError as e: self.assertEqual(e.args[0], 'a', @@ -465,7 +466,7 @@ class HandlerExceptionTest(unittest.TestCase): "pyexpat.c", "StartElement") self.check_traceback_entry(entries[2], "test_pyexpat.py", "StartElementHandler") - if sysconfig.is_python_build(): + if sysconfig.is_python_build() and not (sys.platform == 'win32' and platform.machine() == 'ARM'): self.assertIn('call_with_frame("StartElement"', entries[1][3]) @@ -498,7 +499,7 @@ class PositionTest(unittest.TestCase): ('e', 15, 3, 6), ('e', 17, 4, 1), ('e', 22, 5, 0)] xml = b'\n \n \n \n' - self.parser.Parse(xml, 1) + self.parser.Parse(xml, True) class sf1296433Test(unittest.TestCase): @@ -578,7 +579,7 @@ class ChardataBufferTest(unittest.TestCase): # Parse one chunk of XML self.n = 0 - parser.Parse(xml1, 0) + parser.Parse(xml1, False) self.assertEqual(parser.buffer_size, 1024) self.assertEqual(self.n, 1) @@ -587,13 +588,13 @@ class ChardataBufferTest(unittest.TestCase): self.assertFalse(parser.buffer_text) self.assertEqual(parser.buffer_size, 1024) for i in range(10): - parser.Parse(xml2, 0) + parser.Parse(xml2, False) self.assertEqual(self.n, 11) parser.buffer_text = 1 self.assertTrue(parser.buffer_text) self.assertEqual(parser.buffer_size, 1024) - parser.Parse(xml3, 1) + parser.Parse(xml3, True) self.assertEqual(self.n, 12) def counting_handler(self, text): @@ -620,10 +621,10 @@ class ChardataBufferTest(unittest.TestCase): self.assertEqual(parser.buffer_size, 1024) self.n = 0 - parser.Parse(xml1, 0) + parser.Parse(xml1, False) parser.buffer_size *= 2 self.assertEqual(parser.buffer_size, 2048) - parser.Parse(xml2, 1) + parser.Parse(xml2, True) self.assertEqual(self.n, 2) def test_change_size_2(self): @@ -636,10 +637,10 @@ class ChardataBufferTest(unittest.TestCase): self.assertEqual(parser.buffer_size, 2048) self.n=0 - parser.Parse(xml1, 0) + parser.Parse(xml1, False) parser.buffer_size = parser.buffer_size // 2 self.assertEqual(parser.buffer_size, 1024) - parser.Parse(xml2, 1) + parser.Parse(xml2, True) self.assertEqual(self.n, 4) class MalformedInputTest(unittest.TestCase): diff --git a/Lib/test/test_queue.py b/Lib/test/test_queue.py index 46e2a8c5..d88e28a9 100644 --- a/Lib/test/test_queue.py +++ b/Lib/test/test_queue.py @@ -63,7 +63,7 @@ class BlockingTestMixin: block_func) return self.result finally: - support.join_thread(thread, 10) # make sure the thread terminates + support.join_thread(thread) # make sure the thread terminates # Call this instead if block_func is supposed to raise an exception. def do_exceptional_blocking_test(self,block_func, block_args, trigger_func, @@ -79,7 +79,7 @@ class BlockingTestMixin: self.fail("expected exception of kind %r" % expected_exception_class) finally: - support.join_thread(thread, 10) # make sure the thread terminates + support.join_thread(thread) # make sure the thread terminates if not thread.startedEvent.is_set(): self.fail("trigger thread ended but event never set") diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 899ca108..a80e71e6 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -5,11 +5,13 @@ import os import time import pickle import warnings +import test.support + from functools import partial from math import log, exp, pi, fsum, sin, factorial from test import support from fractions import Fraction - +from collections import Counter class TestBasicOps: # Superclass with tests common to all generators. @@ -41,11 +43,17 @@ class TestBasicOps: class MySeed(object): def __hash__(self): return -1729 - for arg in [None, 0, 0, 1, 1, -1, -1, 10**20, -(10**20), - 3.14, 1+2j, 'a', tuple('abc'), MySeed()]: + for arg in [None, 0, 1, -1, 10**20, -(10**20), + False, True, 3.14, 'a']: self.gen.seed(arg) + + for arg in [1+2j, tuple('abc'), MySeed()]: + with self.assertWarns(DeprecationWarning): + self.gen.seed(arg) + for arg in [list(range(3)), dict(one=1)]: - self.assertRaises(TypeError, self.gen.seed, arg) + with self.assertWarns(DeprecationWarning): + self.assertRaises(TypeError, self.gen.seed, arg) self.assertRaises(TypeError, self.gen.seed, 1, 2, 3, 4) self.assertRaises(TypeError, type(self.gen), []) @@ -97,7 +105,8 @@ class TestBasicOps: shuffle = self.gen.shuffle mock_random = unittest.mock.Mock(return_value=0.5) seq = bytearray(b'abcdefghijk') - shuffle(seq, mock_random) + with self.assertWarns(DeprecationWarning): + shuffle(seq, mock_random) mock_random.assert_called_with() def test_choice(self): @@ -141,7 +150,6 @@ class TestBasicOps: def test_sample_inputs(self): # SF bug #801342 -- population can be any iterable defining __len__() - self.gen.sample(set(range(20)), 2) self.gen.sample(range(20), 2) self.gen.sample(range(20), 2) self.gen.sample(str('abcdefghijklmnopqrst'), 2) @@ -150,6 +158,82 @@ class TestBasicOps: def test_sample_on_dicts(self): self.assertRaises(TypeError, self.gen.sample, dict.fromkeys('abcdef'), 2) + def test_sample_on_sets(self): + with self.assertWarns(DeprecationWarning): + population = {10, 20, 30, 40, 50, 60, 70} + self.gen.sample(population, k=5) + + def test_sample_with_counts(self): + sample = self.gen.sample + + # General case + colors = ['red', 'green', 'blue', 'orange', 'black', 'brown', 'amber'] + counts = [500, 200, 20, 10, 5, 0, 1 ] + k = 700 + summary = Counter(sample(colors, counts=counts, k=k)) + self.assertEqual(sum(summary.values()), k) + for color, weight in zip(colors, counts): + self.assertLessEqual(summary[color], weight) + self.assertNotIn('brown', summary) + + # Case that exhausts the population + k = sum(counts) + summary = Counter(sample(colors, counts=counts, k=k)) + self.assertEqual(sum(summary.values()), k) + for color, weight in zip(colors, counts): + self.assertLessEqual(summary[color], weight) + self.assertNotIn('brown', summary) + + # Case with population size of 1 + summary = Counter(sample(['x'], counts=[10], k=8)) + self.assertEqual(summary, Counter(x=8)) + + # Case with all counts equal. + nc = len(colors) + summary = Counter(sample(colors, counts=[10]*nc, k=10*nc)) + self.assertEqual(summary, Counter(10*colors)) + + # Test error handling + with self.assertRaises(TypeError): + sample(['red', 'green', 'blue'], counts=10, k=10) # counts not iterable + with self.assertRaises(ValueError): + sample(['red', 'green', 'blue'], counts=[-3, -7, -8], k=2) # counts are negative + with self.assertRaises(ValueError): + sample(['red', 'green', 'blue'], counts=[0, 0, 0], k=2) # counts are zero + with self.assertRaises(ValueError): + sample(['red', 'green'], counts=[10, 10], k=21) # population too small + with self.assertRaises(ValueError): + sample(['red', 'green', 'blue'], counts=[1, 2], k=2) # too few counts + with self.assertRaises(ValueError): + sample(['red', 'green', 'blue'], counts=[1, 2, 3, 4], k=2) # too many counts + + def test_sample_counts_equivalence(self): + # Test the documented strong equivalence to a sample with repeated elements. + # We run this test on random.Random() which makes deterministic selections + # for a given seed value. + sample = random.sample + seed = random.seed + + colors = ['red', 'green', 'blue', 'orange', 'black', 'amber'] + counts = [500, 200, 20, 10, 5, 1 ] + k = 700 + seed(8675309) + s1 = sample(colors, counts=counts, k=k) + seed(8675309) + expanded = [color for (color, count) in zip(colors, counts) for i in range(count)] + self.assertEqual(len(expanded), sum(counts)) + s2 = sample(expanded, k=k) + self.assertEqual(s1, s2) + + pop = 'abcdefghi' + counts = [10, 9, 8, 7, 6, 5, 4, 3, 2] + seed(8675309) + s1 = ''.join(sample(pop, counts=counts, k=30)) + expanded = ''.join([letter for (letter, count) in zip(pop, counts) for i in range(count)]) + seed(8675309) + s2 = ''.join(sample(expanded, k=30)) + self.assertEqual(s1, s2) + def test_choices(self): choices = self.gen.choices data = ['red', 'green', 'blue', 'yellow'] @@ -235,6 +319,11 @@ class TestBasicOps: choices = self.gen.choices choices(population=[1, 2], weights=[1e-323, 1e-323], k=5000) + def test_choices_with_all_zero_weights(self): + # See issue #38881 + with self.assertRaises(ValueError): + self.gen.choices('AB', [0.0, 0.0]) + def test_gauss(self): # Ensure that the seed() method initializes all the hidden state. In # particular, through 2.2.1 it failed to reset a piece of state used @@ -252,6 +341,31 @@ class TestBasicOps: self.assertEqual(x1, x2) self.assertEqual(y1, y2) + def test_getrandbits(self): + # Verify ranges + for k in range(1, 1000): + self.assertTrue(0 <= self.gen.getrandbits(k) < 2**k) + self.assertEqual(self.gen.getrandbits(0), 0) + + # Verify all bits active + getbits = self.gen.getrandbits + for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]: + all_bits = 2**span-1 + cum = 0 + cpl_cum = 0 + for i in range(100): + v = getbits(span) + cum |= v + cpl_cum |= all_bits ^ v + self.assertEqual(cum, all_bits) + self.assertEqual(cpl_cum, all_bits) + + # Verify argument checking + self.assertRaises(TypeError, self.gen.getrandbits) + self.assertRaises(TypeError, self.gen.getrandbits, 1, 2) + self.assertRaises(ValueError, self.gen.getrandbits, -1) + self.assertRaises(TypeError, self.gen.getrandbits, 10.1) + def test_pickling(self): for proto in range(pickle.HIGHEST_PROTOCOL + 1): state = pickle.dumps(self.gen, proto) @@ -260,6 +374,14 @@ class TestBasicOps: restoredseq = [newgen.random() for i in range(10)] self.assertEqual(origseq, restoredseq) + @test.support.cpython_only + def test_bug_41052(self): + # _random.Random should not be allowed to serialization + import _random + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + r = _random.Random() + self.assertRaises(TypeError, pickle.dumps, r, proto) + def test_bug_1727780(self): # verify that version-2-pickles can be loaded # fine, whether they are created on 32-bit or 64-bit @@ -280,6 +402,22 @@ class TestBasicOps: k = sum(randrange(6755399441055744) % 3 == 2 for i in range(n)) self.assertTrue(0.30 < k/n < .37, (k/n)) + def test_randbytes(self): + # Verify ranges + for n in range(1, 10): + data = self.gen.randbytes(n) + self.assertEqual(type(data), bytes) + self.assertEqual(len(data), n) + + self.assertEqual(self.gen.randbytes(0), b'') + + # Verify argument checking + self.assertRaises(TypeError, self.gen.randbytes) + self.assertRaises(TypeError, self.gen.randbytes, 1, 2) + self.assertRaises(ValueError, self.gen.randbytes, -1) + self.assertRaises(TypeError, self.gen.randbytes, 1.0) + + try: random.SystemRandom().random() except NotImplementedError: @@ -363,26 +501,6 @@ class SystemRandom_TestBasicOps(TestBasicOps, unittest.TestCase): raises(0, 42, 0) raises(0, 42, 3.14159) - def test_genrandbits(self): - # Verify ranges - for k in range(1, 1000): - self.assertTrue(0 <= self.gen.getrandbits(k) < 2**k) - - # Verify all bits active - getbits = self.gen.getrandbits - for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]: - cum = 0 - for i in range(100): - cum |= getbits(span) - self.assertEqual(cum, 2**span-1) - - # Verify argument checking - self.assertRaises(TypeError, self.gen.getrandbits) - self.assertRaises(TypeError, self.gen.getrandbits, 1, 2) - self.assertRaises(ValueError, self.gen.getrandbits, 0) - self.assertRaises(ValueError, self.gen.getrandbits, -1) - self.assertRaises(TypeError, self.gen.getrandbits, 10.1) - def test_randbelow_logic(self, _log=log, int=int): # check bitcount transition points: 2**i and 2**(i+1)-1 # show that: k = int(1.001 + _log(n, 2)) @@ -602,34 +720,18 @@ class MersenneTwister_TestBasicOps(TestBasicOps, unittest.TestCase): self.assertEqual(set(range(start,stop)), set([self.gen.randrange(start,stop) for i in range(100)])) - def test_genrandbits(self): + def test_getrandbits(self): + super().test_getrandbits() + # Verify cross-platform repeatability self.gen.seed(1234567) self.assertEqual(self.gen.getrandbits(100), 97904845777343510404718956115) - # Verify ranges - for k in range(1, 1000): - self.assertTrue(0 <= self.gen.getrandbits(k) < 2**k) - - # Verify all bits active - getbits = self.gen.getrandbits - for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]: - cum = 0 - for i in range(100): - cum |= getbits(span) - self.assertEqual(cum, 2**span-1) - - # Verify argument checking - self.assertRaises(TypeError, self.gen.getrandbits) - self.assertRaises(TypeError, self.gen.getrandbits, 'a') - self.assertRaises(TypeError, self.gen.getrandbits, 1, 2) - self.assertRaises(ValueError, self.gen.getrandbits, 0) - self.assertRaises(ValueError, self.gen.getrandbits, -1) def test_randrange_uses_getrandbits(self): # Verify use of getrandbits by randrange # Use same seed as in the cross-platform repeatability test - # in test_genrandbits above. + # in test_getrandbits above. self.gen.seed(1234567) # If randrange uses getrandbits, it should pick getrandbits(100) # when called with a 100-bits stop argument. @@ -668,10 +770,10 @@ class MersenneTwister_TestBasicOps(TestBasicOps, unittest.TestCase): maxsize+1, maxsize=maxsize ) self.gen._randbelow_without_getrandbits(5640, maxsize=maxsize) - # issue 33203: test that _randbelow raises ValueError on + # issue 33203: test that _randbelow returns zero on # n == 0 also in its getrandbits-independent branch. - with self.assertRaises(ValueError): - self.gen._randbelow_without_getrandbits(0, maxsize=maxsize) + x = self.gen._randbelow_without_getrandbits(0, maxsize=maxsize) + self.assertEqual(x, 0) # This might be going too far to test a single line, but because of our # noble aim of achieving 100% test coverage we need to write a case in @@ -736,6 +838,57 @@ class MersenneTwister_TestBasicOps(TestBasicOps, unittest.TestCase): c = self.gen.choices(population, cum_weights=cum_weights, k=10000) self.assertEqual(a, c) + def test_randbytes(self): + super().test_randbytes() + + # Mersenne Twister randbytes() is deterministic + # and does not depend on the endian and bitness. + seed = 8675309 + expected = b'3\xa8\xf9f\xf4\xa4\xd06\x19\x8f\x9f\x82\x02oe\xf0' + + self.gen.seed(seed) + self.assertEqual(self.gen.randbytes(16), expected) + + # randbytes(0) must not consume any entropy + self.gen.seed(seed) + self.assertEqual(self.gen.randbytes(0), b'') + self.assertEqual(self.gen.randbytes(16), expected) + + # Four randbytes(4) calls give the same output than randbytes(16) + self.gen.seed(seed) + self.assertEqual(b''.join([self.gen.randbytes(4) for _ in range(4)]), + expected) + + # Each randbytes(1), randbytes(2) or randbytes(3) call consumes + # 4 bytes of entropy + self.gen.seed(seed) + expected1 = expected[3::4] + self.assertEqual(b''.join(self.gen.randbytes(1) for _ in range(4)), + expected1) + + self.gen.seed(seed) + expected2 = b''.join(expected[i + 2: i + 4] + for i in range(0, len(expected), 4)) + self.assertEqual(b''.join(self.gen.randbytes(2) for _ in range(4)), + expected2) + + self.gen.seed(seed) + expected3 = b''.join(expected[i + 1: i + 4] + for i in range(0, len(expected), 4)) + self.assertEqual(b''.join(self.gen.randbytes(3) for _ in range(4)), + expected3) + + def test_randbytes_getrandbits(self): + # There is a simple relation between randbytes() and getrandbits() + seed = 2849427419 + gen2 = random.Random() + self.gen.seed(seed) + gen2.seed(seed) + for n in range(9): + self.assertEqual(self.gen.randbytes(n), + gen2.getrandbits(n * 8).to_bytes(n, 'little')) + + def gamma(z, sqrt2pi=(2.0*pi)**0.5): # Reflection to right half of complex plane if z < 0.5: @@ -1092,8 +1245,7 @@ class TestModule(unittest.TestCase): child_val = eval(f.read()) self.assertNotEqual(val, child_val) - pid, status = os.waitpid(pid, 0) - self.assertEqual(status, 0) + support.wait_process(pid, exitcode=0) if __name__ == "__main__": diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py index 94c96a94..30fa129b 100644 --- a/Lib/test/test_range.py +++ b/Lib/test/test_range.py @@ -4,6 +4,7 @@ import unittest import sys import pickle import itertools +from test.support import ALWAYS_EQ # pure Python implementations (3 args only), for comparison def pyrange(start, stop, step): @@ -90,6 +91,19 @@ class RangeTest(unittest.TestCase): r = range(-sys.maxsize, sys.maxsize, 2) self.assertEqual(len(r), sys.maxsize) + def test_range_constructor_error_messages(self): + with self.assertRaisesRegex( + TypeError, + "range expected at least 1 argument, got 0" + ): + range() + + with self.assertRaisesRegex( + TypeError, + "range expected at most 3 arguments, got 6" + ): + range(1, 2, 3, 4, 5, 6) + def test_large_operands(self): x = range(10**20, 10**20+10, 3) self.assertEqual(len(x), 4) @@ -289,11 +303,7 @@ class RangeTest(unittest.TestCase): self.assertRaises(ValueError, range(1, 2**100, 2).index, 2**87) self.assertEqual(range(1, 2**100, 2).index(2**87+1), 2**86) - class AlwaysEqual(object): - def __eq__(self, other): - return True - always_equal = AlwaysEqual() - self.assertEqual(range(10).index(always_equal), 0) + self.assertEqual(range(10).index(ALWAYS_EQ), 0) def test_user_index_method(self): bignum = 2*sys.maxsize @@ -344,11 +354,7 @@ class RangeTest(unittest.TestCase): self.assertEqual(range(1, 2**100, 2).count(2**87), 0) self.assertEqual(range(1, 2**100, 2).count(2**87+1), 1) - class AlwaysEqual(object): - def __eq__(self, other): - return True - always_equal = AlwaysEqual() - self.assertEqual(range(10).count(always_equal), 10) + self.assertEqual(range(10).count(ALWAYS_EQ), 10) self.assertEqual(len(range(sys.maxsize, sys.maxsize+10)), 10) @@ -429,9 +435,7 @@ class RangeTest(unittest.TestCase): self.assertIn(True, range(3)) self.assertIn(1+0j, range(3)) - class C1: - def __eq__(self, other): return True - self.assertIn(C1(), range(3)) + self.assertIn(ALWAYS_EQ, range(3)) # Objects are never coerced into other types for comparison. class C2: diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 4817d761..1bfbcb85 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -2217,7 +2217,7 @@ class ExternalTests(unittest.TestCase): def test_re_tests(self): 're_tests test suite' - from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR + from test.re_tests import tests, FAIL, SYNTAX_ERROR for t in tests: pattern = s = outcome = repl = expected = None if len(t) == 5: diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index f89b1af7..a77638b1 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -5,7 +5,6 @@ Note: test_regrtest cannot be run twice in parallel. """ import contextlib -import faulthandler import glob import io import os.path @@ -55,8 +54,6 @@ class ParseArgsTestCase(unittest.TestCase): libregrtest._parse_args([opt]) self.assertIn('Run Python regression tests.', out.getvalue()) - @unittest.skipUnless(hasattr(faulthandler, 'dump_traceback_later'), - "faulthandler.dump_traceback_later() required") def test_timeout(self): ns = libregrtest._parse_args(['--timeout', '4.2']) self.assertEqual(ns.timeout, 4.2) @@ -520,7 +517,7 @@ class BaseTestCase(unittest.TestCase): if not input: input = '' if 'stderr' not in kw: - kw['stderr'] = subprocess.PIPE + kw['stderr'] = subprocess.STDOUT proc = subprocess.run(args, universal_newlines=True, input=input, @@ -592,8 +589,7 @@ class ProgramsTestCase(BaseTestCase): self.python_args = ['-Wd', '-E', '-bb'] self.regrtest_args = ['-uall', '-rwW', '--testdir=%s' % self.tmptestdir] - if hasattr(faulthandler, 'dump_traceback_later'): - self.regrtest_args.extend(('--timeout', '3600', '-j4')) + self.regrtest_args.extend(('--timeout', '3600', '-j4')) if sys.platform == 'win32': self.regrtest_args.append('-n') @@ -664,6 +660,8 @@ class ProgramsTestCase(BaseTestCase): test_args = ['--testdir=%s' % self.tmptestdir] if platform.machine() == 'ARM64': test_args.append('-arm64') # ARM 64-bit build + elif platform.machine() == 'ARM': + test_args.append('-arm32') # 32-bit ARM build elif platform.architecture()[0] == '64bit': test_args.append('-x64') # 64-bit build if not Py_DEBUG: @@ -679,6 +677,8 @@ class ProgramsTestCase(BaseTestCase): rt_args = ["-q"] # Quick, don't run tests twice if platform.machine() == 'ARM64': rt_args.append('-arm64') # ARM 64-bit build + elif platform.machine() == 'ARM': + rt_args.append('-arm32') # 32-bit ARM build elif platform.architecture()[0] == '64bit': rt_args.append('-x64') # 64-bit build if Py_DEBUG: @@ -1233,6 +1233,39 @@ class ArgsTestCase(BaseTestCase): self.assertRegex(output, re.compile('%s timed out' % testname, re.MULTILINE)) + def test_unraisable_exc(self): + # --fail-env-changed must catch unraisable exception. + # The exceptioin must be displayed even if sys.stderr is redirected. + code = textwrap.dedent(r""" + import unittest + import weakref + from test.support import captured_stderr + + class MyObject: + pass + + def weakref_callback(obj): + raise Exception("weakref callback bug") + + class Tests(unittest.TestCase): + def test_unraisable_exc(self): + obj = MyObject() + ref = weakref.ref(obj, weakref_callback) + with captured_stderr() as stderr: + # call weakref_callback() which logs + # an unraisable exception + obj = None + self.assertEqual(stderr.getvalue(), '') + """) + testname = self.create_test(code=code) + + output = self.run_tests("--fail-env-changed", "-v", testname, exitcode=3) + self.check_executed_tests(output, [testname], + env_changed=[testname], + fail_env_changed=True) + self.assertIn("Warning -- Unraisable exception", output) + self.assertIn("Exception: weakref callback bug", output) + def test_cleanup(self): dirname = os.path.join(self.tmptestdir, "test_python_123") os.mkdir(dirname) diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py index 77cd7c4d..a3112b8f 100644 --- a/Lib/test/test_robotparser.py +++ b/Lib/test/test_robotparser.py @@ -4,6 +4,7 @@ import threading import unittest import urllib.robotparser from test import support +from test.support import socket_helper from http.server import BaseHTTPRequestHandler, HTTPServer @@ -309,7 +310,10 @@ class RobotHandler(BaseHTTPRequestHandler): class PasswordProtectedSiteTestCase(unittest.TestCase): def setUp(self): - self.server = HTTPServer((support.HOST, 0), RobotHandler) + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + + self.server = HTTPServer((socket_helper.HOST, 0), RobotHandler) self.t = threading.Thread( name='HTTPServer serving', @@ -329,7 +333,7 @@ class PasswordProtectedSiteTestCase(unittest.TestCase): @support.reap_threads def testPasswordProtectedSite(self): addr = self.server.server_address - url = 'http://' + support.HOST + ':' + str(addr[1]) + url = 'http://' + socket_helper.HOST + ':' + str(addr[1]) robots_url = url + "/robots.txt" parser = urllib.robotparser.RobotFileParser() parser.set_url(url) @@ -345,7 +349,7 @@ class NetworkTestCase(unittest.TestCase): @classmethod def setUpClass(cls): support.requires('network') - with support.transient_internet(cls.base_url): + with socket_helper.transient_internet(cls.base_url): cls.parser = urllib.robotparser.RobotFileParser(cls.robots_txt) cls.parser.read() diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py index 84834d39..4aaf75b1 100644 --- a/Lib/test/test_runpy.py +++ b/Lib/test/test_runpy.py @@ -1,14 +1,17 @@ # Test the runpy module -import unittest -import os +import contextlib +import importlib.machinery, importlib.util import os.path -import sys +import pathlib +import py_compile import re +import signal +import subprocess +import sys import tempfile -import importlib, importlib.machinery, importlib.util -import py_compile +import textwrap +import unittest import warnings -import pathlib from test.support import ( forget, make_legacy_pyc, unload, verbose, no_tracing, create_empty_file, temp_dir) @@ -752,5 +755,82 @@ s = "non-ASCII: h\xe9" self.assertEqual(result['s'], "non-ASCII: h\xe9") +class TestExit(unittest.TestCase): + STATUS_CONTROL_C_EXIT = 0xC000013A + EXPECTED_CODE = ( + STATUS_CONTROL_C_EXIT + if sys.platform == "win32" + else -signal.SIGINT + ) + @staticmethod + @contextlib.contextmanager + def tmp_path(*args, **kwargs): + with temp_dir() as tmp_fn: + yield pathlib.Path(tmp_fn) + + + def run(self, *args, **kwargs): + with self.tmp_path() as tmp: + self.ham = ham = tmp / "ham.py" + ham.write_text( + textwrap.dedent( + """\ + raise KeyboardInterrupt + """ + ) + ) + super().run(*args, **kwargs) + + def assertSigInt(self, *args, **kwargs): + proc = subprocess.run(*args, **kwargs, text=True, stderr=subprocess.PIPE) + self.assertTrue(proc.stderr.endswith("\nKeyboardInterrupt\n")) + self.assertEqual(proc.returncode, self.EXPECTED_CODE) + + def test_pymain_run_file(self): + self.assertSigInt([sys.executable, self.ham]) + + def test_pymain_run_file_runpy_run_module(self): + tmp = self.ham.parent + run_module = tmp / "run_module.py" + run_module.write_text( + textwrap.dedent( + """\ + import runpy + runpy.run_module("ham") + """ + ) + ) + self.assertSigInt([sys.executable, run_module], cwd=tmp) + + def test_pymain_run_file_runpy_run_module_as_main(self): + tmp = self.ham.parent + run_module_as_main = tmp / "run_module_as_main.py" + run_module_as_main.write_text( + textwrap.dedent( + """\ + import runpy + runpy._run_module_as_main("ham") + """ + ) + ) + self.assertSigInt([sys.executable, run_module_as_main], cwd=tmp) + + def test_pymain_run_command_run_module(self): + self.assertSigInt( + [sys.executable, "-c", "import runpy; runpy.run_module('ham')"], + cwd=self.ham.parent, + ) + + def test_pymain_run_command(self): + self.assertSigInt([sys.executable, "-c", "import ham"], cwd=self.ham.parent) + + def test_pymain_run_stdin(self): + self.assertSigInt([sys.executable], input="import ham", cwd=self.ham.parent) + + def test_pymain_run_module(self): + ham = self.ham + self.assertSigInt([sys.executable, "-m", ham.stem], cwd=ham.parent) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py index da4eb1da..ce3a422b 100644 --- a/Lib/test/test_sax.py +++ b/Lib/test/test_sax.py @@ -20,6 +20,7 @@ import codecs import os.path import shutil from urllib.error import URLError +import urllib.request from test import support from test.support import findfile, run_unittest, FakePath, TESTFN @@ -979,6 +980,9 @@ class ExpatReaderTest(XmlTestBase): self.assertEqual(handler._entities, [("img", None, "expat.gif", "GIF")]) def test_expat_external_dtd_enabled(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + parser = create_parser() parser.setFeature(feature_external_ges, True) resolver = self.TestEntityRecorder() diff --git a/Lib/test/test_sched.py b/Lib/test/test_sched.py index 3f84af2a..26cb4be8 100644 --- a/Lib/test/test_sched.py +++ b/Lib/test/test_sched.py @@ -6,7 +6,7 @@ import unittest from test import support -TIMEOUT = 10 +TIMEOUT = support.SHORT_TIMEOUT class Timer: @@ -82,7 +82,7 @@ class TestCase(unittest.TestCase): self.assertEqual(q.get(timeout=TIMEOUT), 5) self.assertTrue(q.empty()) timer.advance(1000) - support.join_thread(t, timeout=TIMEOUT) + support.join_thread(t) self.assertTrue(q.empty()) self.assertEqual(timer.time(), 5) @@ -137,7 +137,7 @@ class TestCase(unittest.TestCase): self.assertEqual(q.get(timeout=TIMEOUT), 4) self.assertTrue(q.empty()) timer.advance(1000) - support.join_thread(t, timeout=TIMEOUT) + support.join_thread(t) self.assertTrue(q.empty()) self.assertEqual(timer.time(), 4) diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py index 31611224..2274c39a 100644 --- a/Lib/test/test_selectors.py +++ b/Lib/test/test_selectors.py @@ -6,6 +6,7 @@ import signal import socket import sys from test import support +from test.support import socket_helper from time import sleep import unittest import unittest.mock @@ -22,7 +23,7 @@ if hasattr(socket, 'socketpair'): else: def socketpair(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): with socket.socket(family, type, proto) as l: - l.bind((support.HOST, 0)) + l.bind((socket_helper.HOST, 0)) l.listen() c = socket.socket(family, type, proto) try: @@ -543,6 +544,19 @@ class KqueueSelectorTestCase(BaseSelectorTestCase, ScalableSelectorMixIn): with self.assertRaises(KeyError): s.get_key(bad_f) + def test_empty_select_timeout(self): + # Issues #23009, #29255: Make sure timeout is applied when no fds + # are registered. + s = self.SELECTOR() + self.addCleanup(s.close) + + t0 = time() + self.assertEqual(s.select(1), []) + t1 = time() + dt = t1 - t0 + # Tolerate 2.0 seconds for very slow buildbots + self.assertTrue(0.8 <= dt <= 2.0, dt) + @unittest.skipUnless(hasattr(selectors, 'DevpollSelector'), "Test needs selectors.DevpollSelector") diff --git a/Lib/test/test_setcomps.py b/Lib/test/test_setcomps.py index fb7cde03..ecc4fffe 100644 --- a/Lib/test/test_setcomps.py +++ b/Lib/test/test_setcomps.py @@ -21,6 +21,22 @@ Test nesting with the inner expression dependent on the outer >>> list(sorted({(i,j) for i in range(4) for j in range(i)})) [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] +Test the idiom for temporary variable assignment in comprehensions. + + >>> sorted({j*j for i in range(4) for j in [i+1]}) + [1, 4, 9, 16] + >>> sorted({j*k for i in range(4) for j in [i+1] for k in [j+1]}) + [2, 6, 12, 20] + >>> sorted({j*k for i in range(4) for j, k in [(i+1, i+2)]}) + [2, 6, 12, 20] + +Not assignment + + >>> sorted({i*i for i in [*range(4)]}) + [0, 1, 4, 9] + >>> sorted({i*i for i in (*range(4),)}) + [0, 1, 4, 9] + Make sure the induction variable is not exposed >>> i = 20 diff --git a/Lib/test/test_shlex.py b/Lib/test/test_shlex.py index a21ccd2f..3081a785 100644 --- a/Lib/test/test_shlex.py +++ b/Lib/test/test_shlex.py @@ -3,7 +3,7 @@ import itertools import shlex import string import unittest - +from unittest import mock # The original test data set was from shellwords, by Hartmut Goebel. @@ -162,6 +162,11 @@ class ShlexTest(unittest.TestCase): tok = lex.get_token() return ret + @mock.patch('sys.stdin', io.StringIO()) + def testSplitNoneDeprecation(self): + with self.assertWarns(DeprecationWarning): + shlex.split(None) + def testSplitPosix(self): """Test data splitting with posix parser""" self.splitTest(self.posix_data, comments=True) diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index bcb7e498..e56b3370 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -123,12 +123,12 @@ def supports_file2file_sendfile(): srcname = None dstname = None try: - with tempfile.NamedTemporaryFile("wb", delete=False) as f: + with tempfile.NamedTemporaryFile("wb", dir=os.getcwd(), delete=False) as f: srcname = f.name f.write(b"0123456789") with open(srcname, "rb") as src: - with tempfile.NamedTemporaryFile("wb", delete=False) as dst: + with tempfile.NamedTemporaryFile("wb", dir=os.getcwd(), delete=False) as dst: dstname = dst.name infd = src.fileno() outfd = dst.fileno() @@ -159,31 +159,21 @@ def _maxdataOK(): else: return True -class TestShutil(unittest.TestCase): - - def setUp(self): - super(TestShutil, self).setUp() - self.tempdirs = [] - - def tearDown(self): - super(TestShutil, self).tearDown() - while self.tempdirs: - d = self.tempdirs.pop() - shutil.rmtree(d, os.name in ('nt', 'cygwin')) +class BaseTest: - def mkdtemp(self): + def mkdtemp(self, prefix=None): """Create a temporary directory that will be cleaned up. Returns the path of the directory. """ - basedir = None - if sys.platform == "win32": - basedir = os.path.realpath(os.getcwd()) - d = tempfile.mkdtemp(dir=basedir) - self.tempdirs.append(d) + d = tempfile.mkdtemp(prefix=prefix, dir=os.getcwd()) + self.addCleanup(support.rmtree, d) return d + +class TestRmTree(BaseTest, unittest.TestCase): + def test_rmtree_works_on_bytes(self): tmp = self.mkdtemp() victim = os.path.join(tmp, 'killme') @@ -241,6 +231,7 @@ class TestShutil(unittest.TestCase): os.mkdir(dir_) link = os.path.join(tmp, 'link') _winapi.CreateJunction(dir_, link) + self.addCleanup(support.unlink, link) self.assertRaises(OSError, shutil.rmtree, link) self.assertTrue(os.path.exists(dir_)) self.assertTrue(os.path.lexists(link)) @@ -277,7 +268,7 @@ class TestShutil(unittest.TestCase): def test_rmtree_errors(self): # filename is guaranteed not to exist - filename = tempfile.mktemp() + filename = tempfile.mktemp(dir=self.mkdtemp()) self.assertRaises(FileNotFoundError, shutil.rmtree, filename) # test that ignore_errors option is honored shutil.rmtree(filename, ignore_errors=True) @@ -385,601 +376,792 @@ class TestShutil(unittest.TestCase): finally: os.lstat = orig_lstat - @support.skip_unless_symlink - def test_copymode_follow_symlinks(self): - tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - dst = os.path.join(tmp_dir, 'bar') - src_link = os.path.join(tmp_dir, 'baz') - dst_link = os.path.join(tmp_dir, 'quux') - write_file(src, 'foo') - write_file(dst, 'foo') - os.symlink(src, src_link) - os.symlink(dst, dst_link) - os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) - # file to file - os.chmod(dst, stat.S_IRWXO) - self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - shutil.copymode(src, dst) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - # On Windows, os.chmod does not follow symlinks (issue #15411) - if os.name != 'nt': - # follow src link - os.chmod(dst, stat.S_IRWXO) - shutil.copymode(src_link, dst) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - # follow dst link - os.chmod(dst, stat.S_IRWXO) - shutil.copymode(src, dst_link) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - # follow both links - os.chmod(dst, stat.S_IRWXO) - shutil.copymode(src_link, dst_link) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + def test_rmtree_uses_safe_fd_version_if_available(self): + _use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= + os.supports_dir_fd and + os.listdir in os.supports_fd and + os.stat in os.supports_follow_symlinks) + if _use_fd_functions: + self.assertTrue(shutil._use_fd_functions) + self.assertTrue(shutil.rmtree.avoids_symlink_attacks) + tmp_dir = self.mkdtemp() + d = os.path.join(tmp_dir, 'a') + os.mkdir(d) + try: + real_rmtree = shutil._rmtree_safe_fd + class Called(Exception): pass + def _raiser(*args, **kwargs): + raise Called + shutil._rmtree_safe_fd = _raiser + self.assertRaises(Called, shutil.rmtree, d) + finally: + shutil._rmtree_safe_fd = real_rmtree + else: + self.assertFalse(shutil._use_fd_functions) + self.assertFalse(shutil.rmtree.avoids_symlink_attacks) - @unittest.skipUnless(hasattr(os, 'lchmod'), 'requires os.lchmod') - @support.skip_unless_symlink - def test_copymode_symlink_to_symlink(self): - tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - dst = os.path.join(tmp_dir, 'bar') - src_link = os.path.join(tmp_dir, 'baz') - dst_link = os.path.join(tmp_dir, 'quux') - write_file(src, 'foo') - write_file(dst, 'foo') - os.symlink(src, src_link) - os.symlink(dst, dst_link) - os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) - os.chmod(dst, stat.S_IRWXU) - os.lchmod(src_link, stat.S_IRWXO|stat.S_IRWXG) - # link to link - os.lchmod(dst_link, stat.S_IRWXO) - shutil.copymode(src_link, dst_link, follow_symlinks=False) - self.assertEqual(os.lstat(src_link).st_mode, - os.lstat(dst_link).st_mode) - self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - # src link - use chmod - os.lchmod(dst_link, stat.S_IRWXO) - shutil.copymode(src_link, dst, follow_symlinks=False) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - # dst link - use chmod - os.lchmod(dst_link, stat.S_IRWXO) - shutil.copymode(src, dst_link, follow_symlinks=False) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + def test_rmtree_dont_delete_file(self): + # When called on a file instead of a directory, don't delete it. + handle, path = tempfile.mkstemp(dir=self.mkdtemp()) + os.close(handle) + self.assertRaises(NotADirectoryError, shutil.rmtree, path) + os.remove(path) - @unittest.skipIf(hasattr(os, 'lchmod'), 'requires os.lchmod to be missing') @support.skip_unless_symlink - def test_copymode_symlink_to_symlink_wo_lchmod(self): - tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - dst = os.path.join(tmp_dir, 'bar') - src_link = os.path.join(tmp_dir, 'baz') - dst_link = os.path.join(tmp_dir, 'quux') - write_file(src, 'foo') - write_file(dst, 'foo') - os.symlink(src, src_link) - os.symlink(dst, dst_link) - shutil.copymode(src_link, dst_link, follow_symlinks=False) # silent fail + def test_rmtree_on_symlink(self): + # bug 1669. + os.mkdir(TESTFN) + try: + src = os.path.join(TESTFN, 'cheese') + dst = os.path.join(TESTFN, 'shop') + os.mkdir(src) + os.symlink(src, dst) + self.assertRaises(OSError, shutil.rmtree, dst) + shutil.rmtree(dst, ignore_errors=True) + finally: + shutil.rmtree(TESTFN, ignore_errors=True) + + @unittest.skipUnless(_winapi, 'only relevant on Windows') + def test_rmtree_on_junction(self): + os.mkdir(TESTFN) + try: + src = os.path.join(TESTFN, 'cheese') + dst = os.path.join(TESTFN, 'shop') + os.mkdir(src) + open(os.path.join(src, 'spam'), 'wb').close() + _winapi.CreateJunction(src, dst) + self.assertRaises(OSError, shutil.rmtree, dst) + shutil.rmtree(dst, ignore_errors=True) + finally: + shutil.rmtree(TESTFN, ignore_errors=True) + + +class TestCopyTree(BaseTest, unittest.TestCase): + + def test_copytree_simple(self): + src_dir = self.mkdtemp() + dst_dir = os.path.join(self.mkdtemp(), 'destination') + self.addCleanup(shutil.rmtree, src_dir) + self.addCleanup(shutil.rmtree, os.path.dirname(dst_dir)) + write_file((src_dir, 'test.txt'), '123') + os.mkdir(os.path.join(src_dir, 'test_dir')) + write_file((src_dir, 'test_dir', 'test.txt'), '456') + + shutil.copytree(src_dir, dst_dir) + self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test.txt'))) + self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'test_dir'))) + self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test_dir', + 'test.txt'))) + actual = read_file((dst_dir, 'test.txt')) + self.assertEqual(actual, '123') + actual = read_file((dst_dir, 'test_dir', 'test.txt')) + self.assertEqual(actual, '456') + + def test_copytree_dirs_exist_ok(self): + src_dir = self.mkdtemp() + dst_dir = self.mkdtemp() + self.addCleanup(shutil.rmtree, src_dir) + self.addCleanup(shutil.rmtree, dst_dir) + + write_file((src_dir, 'nonexisting.txt'), '123') + os.mkdir(os.path.join(src_dir, 'existing_dir')) + os.mkdir(os.path.join(dst_dir, 'existing_dir')) + write_file((dst_dir, 'existing_dir', 'existing.txt'), 'will be replaced') + write_file((src_dir, 'existing_dir', 'existing.txt'), 'has been replaced') + + shutil.copytree(src_dir, dst_dir, dirs_exist_ok=True) + self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'nonexisting.txt'))) + self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'existing_dir'))) + self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'existing_dir', + 'existing.txt'))) + actual = read_file((dst_dir, 'nonexisting.txt')) + self.assertEqual(actual, '123') + actual = read_file((dst_dir, 'existing_dir', 'existing.txt')) + self.assertEqual(actual, 'has been replaced') + + with self.assertRaises(FileExistsError): + shutil.copytree(src_dir, dst_dir, dirs_exist_ok=False) @support.skip_unless_symlink - def test_copystat_symlinks(self): + def test_copytree_symlinks(self): tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - dst = os.path.join(tmp_dir, 'bar') - src_link = os.path.join(tmp_dir, 'baz') - dst_link = os.path.join(tmp_dir, 'qux') - write_file(src, 'foo') - src_stat = os.stat(src) - os.utime(src, (src_stat.st_atime, - src_stat.st_mtime - 42.0)) # ensure different mtimes - write_file(dst, 'bar') - self.assertNotEqual(os.stat(src).st_mtime, os.stat(dst).st_mtime) - os.symlink(src, src_link) - os.symlink(dst, dst_link) + src_dir = os.path.join(tmp_dir, 'src') + dst_dir = os.path.join(tmp_dir, 'dst') + sub_dir = os.path.join(src_dir, 'sub') + os.mkdir(src_dir) + os.mkdir(sub_dir) + write_file((src_dir, 'file.txt'), 'foo') + src_link = os.path.join(sub_dir, 'link') + dst_link = os.path.join(dst_dir, 'sub/link') + os.symlink(os.path.join(src_dir, 'file.txt'), + src_link) if hasattr(os, 'lchmod'): - os.lchmod(src_link, stat.S_IRWXO) + os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): os.lchflags(src_link, stat.UF_NODUMP) - src_link_stat = os.lstat(src_link) - # follow - if hasattr(os, 'lchmod'): - shutil.copystat(src_link, dst_link, follow_symlinks=True) - self.assertNotEqual(src_link_stat.st_mode, os.stat(dst).st_mode) - # don't follow - shutil.copystat(src_link, dst_link, follow_symlinks=False) - dst_link_stat = os.lstat(dst_link) - if os.utime in os.supports_follow_symlinks: - for attr in 'st_atime', 'st_mtime': - # The modification times may be truncated in the new file. - self.assertLessEqual(getattr(src_link_stat, attr), - getattr(dst_link_stat, attr) + 1) + src_stat = os.lstat(src_link) + shutil.copytree(src_dir, dst_dir, symlinks=True) + self.assertTrue(os.path.islink(os.path.join(dst_dir, 'sub', 'link'))) + actual = os.readlink(os.path.join(dst_dir, 'sub', 'link')) + # Bad practice to blindly strip the prefix as it may be required to + # correctly refer to the file, but we're only comparing paths here. + if os.name == 'nt' and actual.startswith('\\\\?\\'): + actual = actual[4:] + self.assertEqual(actual, os.path.join(src_dir, 'file.txt')) + dst_stat = os.lstat(dst_link) if hasattr(os, 'lchmod'): - self.assertEqual(src_link_stat.st_mode, dst_link_stat.st_mode) - if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'): - self.assertEqual(src_link_stat.st_flags, dst_link_stat.st_flags) - # tell to follow but dst is not a link - shutil.copystat(src_link, dst, follow_symlinks=False) - self.assertTrue(abs(os.stat(src).st_mtime - os.stat(dst).st_mtime) < - 00000.1) - - @unittest.skipUnless(hasattr(os, 'chflags') and - hasattr(errno, 'EOPNOTSUPP') and - hasattr(errno, 'ENOTSUP'), - "requires os.chflags, EOPNOTSUPP & ENOTSUP") - def test_copystat_handles_harmless_chflags_errors(self): - tmpdir = self.mkdtemp() - file1 = os.path.join(tmpdir, 'file1') - file2 = os.path.join(tmpdir, 'file2') - write_file(file1, 'xxx') - write_file(file2, 'xxx') - - def make_chflags_raiser(err): - ex = OSError() + self.assertEqual(dst_stat.st_mode, src_stat.st_mode) + if hasattr(os, 'lchflags'): + self.assertEqual(dst_stat.st_flags, src_stat.st_flags) - def _chflags_raiser(path, flags, *, follow_symlinks=True): - ex.errno = err - raise ex - return _chflags_raiser - old_chflags = os.chflags + def test_copytree_with_exclude(self): + # creating data + join = os.path.join + exists = os.path.exists + src_dir = self.mkdtemp() try: - for err in errno.EOPNOTSUPP, errno.ENOTSUP: - os.chflags = make_chflags_raiser(err) - shutil.copystat(file1, file2) - # assert others errors break it - os.chflags = make_chflags_raiser(errno.EOPNOTSUPP + errno.ENOTSUP) - self.assertRaises(OSError, shutil.copystat, file1, file2) + dst_dir = join(self.mkdtemp(), 'destination') + write_file((src_dir, 'test.txt'), '123') + write_file((src_dir, 'test.tmp'), '123') + os.mkdir(join(src_dir, 'test_dir')) + write_file((src_dir, 'test_dir', 'test.txt'), '456') + os.mkdir(join(src_dir, 'test_dir2')) + write_file((src_dir, 'test_dir2', 'test.txt'), '456') + os.mkdir(join(src_dir, 'test_dir2', 'subdir')) + os.mkdir(join(src_dir, 'test_dir2', 'subdir2')) + write_file((src_dir, 'test_dir2', 'subdir', 'test.txt'), '456') + write_file((src_dir, 'test_dir2', 'subdir2', 'test.py'), '456') + + # testing glob-like patterns + try: + patterns = shutil.ignore_patterns('*.tmp', 'test_dir2') + shutil.copytree(src_dir, dst_dir, ignore=patterns) + # checking the result: some elements should not be copied + self.assertTrue(exists(join(dst_dir, 'test.txt'))) + self.assertFalse(exists(join(dst_dir, 'test.tmp'))) + self.assertFalse(exists(join(dst_dir, 'test_dir2'))) + finally: + shutil.rmtree(dst_dir) + try: + patterns = shutil.ignore_patterns('*.tmp', 'subdir*') + shutil.copytree(src_dir, dst_dir, ignore=patterns) + # checking the result: some elements should not be copied + self.assertFalse(exists(join(dst_dir, 'test.tmp'))) + self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir2'))) + self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir'))) + finally: + shutil.rmtree(dst_dir) + + # testing callable-style + try: + def _filter(src, names): + res = [] + for name in names: + path = os.path.join(src, name) + + if (os.path.isdir(path) and + path.split()[-1] == 'subdir'): + res.append(name) + elif os.path.splitext(path)[-1] in ('.py'): + res.append(name) + return res + + shutil.copytree(src_dir, dst_dir, ignore=_filter) + + # checking the result: some elements should not be copied + self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir2', + 'test.py'))) + self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir'))) + + finally: + shutil.rmtree(dst_dir) finally: - os.chflags = old_chflags + shutil.rmtree(src_dir) + shutil.rmtree(os.path.dirname(dst_dir)) + + def test_copytree_arg_types_of_ignore(self): + join = os.path.join + exists = os.path.exists - @support.skip_unless_xattr - def test_copyxattr(self): tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - write_file(src, 'foo') - dst = os.path.join(tmp_dir, 'bar') - write_file(dst, 'bar') + src_dir = join(tmp_dir, "source") - # no xattr == no problem - shutil._copyxattr(src, dst) - # common case - os.setxattr(src, 'user.foo', b'42') - os.setxattr(src, 'user.bar', b'43') - shutil._copyxattr(src, dst) - self.assertEqual(sorted(os.listxattr(src)), sorted(os.listxattr(dst))) - self.assertEqual( - os.getxattr(src, 'user.foo'), - os.getxattr(dst, 'user.foo')) - # check errors don't affect other attrs - os.remove(dst) - write_file(dst, 'bar') - os_error = OSError(errno.EPERM, 'EPERM') + os.mkdir(join(src_dir)) + os.mkdir(join(src_dir, 'test_dir')) + os.mkdir(os.path.join(src_dir, 'test_dir', 'subdir')) + write_file((src_dir, 'test_dir', 'subdir', 'test.txt'), '456') - def _raise_on_user_foo(fname, attr, val, **kwargs): - if attr == 'user.foo': - raise os_error - else: - orig_setxattr(fname, attr, val, **kwargs) - try: - orig_setxattr = os.setxattr - os.setxattr = _raise_on_user_foo - shutil._copyxattr(src, dst) - self.assertIn('user.bar', os.listxattr(dst)) - finally: - os.setxattr = orig_setxattr - # the source filesystem not supporting xattrs should be ok, too. - def _raise_on_src(fname, *, follow_symlinks=True): - if fname == src: - raise OSError(errno.ENOTSUP, 'Operation not supported') - return orig_listxattr(fname, follow_symlinks=follow_symlinks) + invokations = [] + + def _ignore(src, names): + invokations.append(src) + self.assertIsInstance(src, str) + self.assertIsInstance(names, list) + self.assertEqual(len(names), len(set(names))) + for name in names: + self.assertIsInstance(name, str) + return [] + + dst_dir = join(self.mkdtemp(), 'destination') + shutil.copytree(src_dir, dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + dst_dir = join(self.mkdtemp(), 'destination') + shutil.copytree(pathlib.Path(src_dir), dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + dst_dir = join(self.mkdtemp(), 'destination') + src_dir_entry = list(os.scandir(tmp_dir))[0] + self.assertIsInstance(src_dir_entry, os.DirEntry) + shutil.copytree(src_dir_entry, dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + self.assertEqual(len(invokations), 9) + + def test_copytree_retains_permissions(self): + tmp_dir = self.mkdtemp() + src_dir = os.path.join(tmp_dir, 'source') + os.mkdir(src_dir) + dst_dir = os.path.join(tmp_dir, 'destination') + self.addCleanup(shutil.rmtree, tmp_dir) + + os.chmod(src_dir, 0o777) + write_file((src_dir, 'permissive.txt'), '123') + os.chmod(os.path.join(src_dir, 'permissive.txt'), 0o777) + write_file((src_dir, 'restrictive.txt'), '456') + os.chmod(os.path.join(src_dir, 'restrictive.txt'), 0o600) + restrictive_subdir = tempfile.mkdtemp(dir=src_dir) + self.addCleanup(support.rmtree, restrictive_subdir) + os.chmod(restrictive_subdir, 0o600) + + shutil.copytree(src_dir, dst_dir) + self.assertEqual(os.stat(src_dir).st_mode, os.stat(dst_dir).st_mode) + self.assertEqual(os.stat(os.path.join(src_dir, 'permissive.txt')).st_mode, + os.stat(os.path.join(dst_dir, 'permissive.txt')).st_mode) + self.assertEqual(os.stat(os.path.join(src_dir, 'restrictive.txt')).st_mode, + os.stat(os.path.join(dst_dir, 'restrictive.txt')).st_mode) + restrictive_subdir_dst = os.path.join(dst_dir, + os.path.split(restrictive_subdir)[1]) + self.assertEqual(os.stat(restrictive_subdir).st_mode, + os.stat(restrictive_subdir_dst).st_mode) + + @unittest.mock.patch('os.chmod') + def test_copytree_winerror(self, mock_patch): + # When copying to VFAT, copystat() raises OSError. On Windows, the + # exception object has a meaningful 'winerror' attribute, but not + # on other operating systems. Do not assume 'winerror' is set. + src_dir = self.mkdtemp() + dst_dir = os.path.join(self.mkdtemp(), 'destination') + self.addCleanup(shutil.rmtree, src_dir) + self.addCleanup(shutil.rmtree, os.path.dirname(dst_dir)) + + mock_patch.side_effect = PermissionError('ka-boom') + with self.assertRaises(shutil.Error): + shutil.copytree(src_dir, dst_dir) + + def test_copytree_custom_copy_function(self): + # See: https://bugs.python.org/issue35648 + def custom_cpfun(a, b): + flag.append(None) + self.assertIsInstance(a, str) + self.assertIsInstance(b, str) + self.assertEqual(a, os.path.join(src, 'foo')) + self.assertEqual(b, os.path.join(dst, 'foo')) + + flag = [] + src = self.mkdtemp() + dst = tempfile.mktemp(dir=self.mkdtemp()) + with open(os.path.join(src, 'foo'), 'w') as f: + f.close() + shutil.copytree(src, dst, copy_function=custom_cpfun) + self.assertEqual(len(flag), 1) + + # Issue #3002: copyfile and copytree block indefinitely on named pipes + @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()') + @support.skip_unless_symlink + def test_copytree_named_pipe(self): + os.mkdir(TESTFN) try: - orig_listxattr = os.listxattr - os.listxattr = _raise_on_src - shutil._copyxattr(src, dst) + subdir = os.path.join(TESTFN, "subdir") + os.mkdir(subdir) + pipe = os.path.join(subdir, "mypipe") + try: + os.mkfifo(pipe) + except PermissionError as e: + self.skipTest('os.mkfifo(): %s' % e) + try: + shutil.copytree(TESTFN, TESTFN2) + except shutil.Error as e: + errors = e.args[0] + self.assertEqual(len(errors), 1) + src, dst, error_msg = errors[0] + self.assertEqual("`%s` is a named pipe" % pipe, error_msg) + else: + self.fail("shutil.Error should have been raised") finally: - os.listxattr = orig_listxattr + shutil.rmtree(TESTFN, ignore_errors=True) + shutil.rmtree(TESTFN2, ignore_errors=True) - # test that shutil.copystat copies xattrs - src = os.path.join(tmp_dir, 'the_original') - srcro = os.path.join(tmp_dir, 'the_original_ro') - write_file(src, src) - write_file(srcro, srcro) - os.setxattr(src, 'user.the_value', b'fiddly') - os.setxattr(srcro, 'user.the_value', b'fiddly') - os.chmod(srcro, 0o444) - dst = os.path.join(tmp_dir, 'the_copy') - dstro = os.path.join(tmp_dir, 'the_copy_ro') - write_file(dst, dst) - write_file(dstro, dstro) - shutil.copystat(src, dst) - shutil.copystat(srcro, dstro) - self.assertEqual(os.getxattr(dst, 'user.the_value'), b'fiddly') - self.assertEqual(os.getxattr(dstro, 'user.the_value'), b'fiddly') + def test_copytree_special_func(self): + src_dir = self.mkdtemp() + dst_dir = os.path.join(self.mkdtemp(), 'destination') + write_file((src_dir, 'test.txt'), '123') + os.mkdir(os.path.join(src_dir, 'test_dir')) + write_file((src_dir, 'test_dir', 'test.txt'), '456') + + copied = [] + def _copy(src, dst): + copied.append((src, dst)) + + shutil.copytree(src_dir, dst_dir, copy_function=_copy) + self.assertEqual(len(copied), 2) @support.skip_unless_symlink - @support.skip_unless_xattr - @unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() == 0, - 'root privileges required') - def test_copyxattr_symlinks(self): - # On Linux, it's only possible to access non-user xattr for symlinks; - # which in turn require root privileges. This test should be expanded - # as soon as other platforms gain support for extended attributes. - tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - src_link = os.path.join(tmp_dir, 'baz') - write_file(src, 'foo') - os.symlink(src, src_link) - os.setxattr(src, 'trusted.foo', b'42') - os.setxattr(src_link, 'trusted.foo', b'43', follow_symlinks=False) - dst = os.path.join(tmp_dir, 'bar') - dst_link = os.path.join(tmp_dir, 'qux') - write_file(dst, 'bar') - os.symlink(dst, dst_link) - shutil._copyxattr(src_link, dst_link, follow_symlinks=False) - self.assertEqual(os.getxattr(dst_link, 'trusted.foo', follow_symlinks=False), b'43') - self.assertRaises(OSError, os.getxattr, dst, 'trusted.foo') - shutil._copyxattr(src_link, dst, follow_symlinks=False) - self.assertEqual(os.getxattr(dst, 'trusted.foo'), b'43') + def test_copytree_dangling_symlinks(self): + # a dangling symlink raises an error at the end + src_dir = self.mkdtemp() + dst_dir = os.path.join(self.mkdtemp(), 'destination') + os.symlink('IDONTEXIST', os.path.join(src_dir, 'test.txt')) + os.mkdir(os.path.join(src_dir, 'test_dir')) + write_file((src_dir, 'test_dir', 'test.txt'), '456') + self.assertRaises(Error, shutil.copytree, src_dir, dst_dir) + + # a dangling symlink is ignored with the proper flag + dst_dir = os.path.join(self.mkdtemp(), 'destination2') + shutil.copytree(src_dir, dst_dir, ignore_dangling_symlinks=True) + self.assertNotIn('test.txt', os.listdir(dst_dir)) + + # a dangling symlink is copied if symlinks=True + dst_dir = os.path.join(self.mkdtemp(), 'destination3') + shutil.copytree(src_dir, dst_dir, symlinks=True) + self.assertIn('test.txt', os.listdir(dst_dir)) @support.skip_unless_symlink - def test_copy_symlinks(self): - tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - dst = os.path.join(tmp_dir, 'bar') - src_link = os.path.join(tmp_dir, 'baz') + def test_copytree_symlink_dir(self): + src_dir = self.mkdtemp() + dst_dir = os.path.join(self.mkdtemp(), 'destination') + os.mkdir(os.path.join(src_dir, 'real_dir')) + with open(os.path.join(src_dir, 'real_dir', 'test.txt'), 'w'): + pass + os.symlink(os.path.join(src_dir, 'real_dir'), + os.path.join(src_dir, 'link_to_dir'), + target_is_directory=True) + + shutil.copytree(src_dir, dst_dir, symlinks=False) + self.assertFalse(os.path.islink(os.path.join(dst_dir, 'link_to_dir'))) + self.assertIn('test.txt', os.listdir(os.path.join(dst_dir, 'link_to_dir'))) + + dst_dir = os.path.join(self.mkdtemp(), 'destination2') + shutil.copytree(src_dir, dst_dir, symlinks=True) + self.assertTrue(os.path.islink(os.path.join(dst_dir, 'link_to_dir'))) + self.assertIn('test.txt', os.listdir(os.path.join(dst_dir, 'link_to_dir'))) + + def test_copytree_return_value(self): + # copytree returns its destination path. + src_dir = self.mkdtemp() + dst_dir = src_dir + "dest" + self.addCleanup(shutil.rmtree, dst_dir, True) + src = os.path.join(src_dir, 'foo') write_file(src, 'foo') - os.symlink(src, src_link) - if hasattr(os, 'lchmod'): - os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) - # don't follow - shutil.copy(src_link, dst, follow_symlinks=True) - self.assertFalse(os.path.islink(dst)) - self.assertEqual(read_file(src), read_file(dst)) - os.remove(dst) - # follow - shutil.copy(src_link, dst, follow_symlinks=False) - self.assertTrue(os.path.islink(dst)) - self.assertEqual(os.readlink(dst), os.readlink(src_link)) - if hasattr(os, 'lchmod'): - self.assertEqual(os.lstat(src_link).st_mode, - os.lstat(dst).st_mode) + rv = shutil.copytree(src_dir, dst_dir) + self.assertEqual(['foo'], os.listdir(rv)) + + def test_copytree_subdirectory(self): + # copytree where dst is a subdirectory of src, see Issue 38688 + base_dir = self.mkdtemp() + self.addCleanup(shutil.rmtree, base_dir, ignore_errors=True) + src_dir = os.path.join(base_dir, "t", "pg") + dst_dir = os.path.join(src_dir, "somevendor", "1.0") + os.makedirs(src_dir) + src = os.path.join(src_dir, 'pol') + write_file(src, 'pol') + rv = shutil.copytree(src_dir, dst_dir) + self.assertEqual(['pol'], os.listdir(rv)) + +class TestCopy(BaseTest, unittest.TestCase): + + ### shutil.copymode @support.skip_unless_symlink - def test_copy2_symlinks(self): + def test_copymode_follow_symlinks(self): tmp_dir = self.mkdtemp() src = os.path.join(tmp_dir, 'foo') dst = os.path.join(tmp_dir, 'bar') src_link = os.path.join(tmp_dir, 'baz') + dst_link = os.path.join(tmp_dir, 'quux') write_file(src, 'foo') + write_file(dst, 'foo') os.symlink(src, src_link) - if hasattr(os, 'lchmod'): - os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) - if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): - os.lchflags(src_link, stat.UF_NODUMP) - src_stat = os.stat(src) - src_link_stat = os.lstat(src_link) - # follow - shutil.copy2(src_link, dst, follow_symlinks=True) - self.assertFalse(os.path.islink(dst)) - self.assertEqual(read_file(src), read_file(dst)) - os.remove(dst) - # don't follow - shutil.copy2(src_link, dst, follow_symlinks=False) - self.assertTrue(os.path.islink(dst)) - self.assertEqual(os.readlink(dst), os.readlink(src_link)) - dst_stat = os.lstat(dst) - if os.utime in os.supports_follow_symlinks: - for attr in 'st_atime', 'st_mtime': - # The modification times may be truncated in the new file. - self.assertLessEqual(getattr(src_link_stat, attr), - getattr(dst_stat, attr) + 1) - if hasattr(os, 'lchmod'): - self.assertEqual(src_link_stat.st_mode, dst_stat.st_mode) - self.assertNotEqual(src_stat.st_mode, dst_stat.st_mode) - if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'): - self.assertEqual(src_link_stat.st_flags, dst_stat.st_flags) + os.symlink(dst, dst_link) + os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) + # file to file + os.chmod(dst, stat.S_IRWXO) + self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + shutil.copymode(src, dst) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + # On Windows, os.chmod does not follow symlinks (issue #15411) + if os.name != 'nt': + # follow src link + os.chmod(dst, stat.S_IRWXO) + shutil.copymode(src_link, dst) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + # follow dst link + os.chmod(dst, stat.S_IRWXO) + shutil.copymode(src, dst_link) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + # follow both links + os.chmod(dst, stat.S_IRWXO) + shutil.copymode(src_link, dst_link) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - @support.skip_unless_xattr - def test_copy2_xattr(self): + @unittest.skipUnless(hasattr(os, 'lchmod'), 'requires os.lchmod') + @support.skip_unless_symlink + def test_copymode_symlink_to_symlink(self): tmp_dir = self.mkdtemp() src = os.path.join(tmp_dir, 'foo') dst = os.path.join(tmp_dir, 'bar') + src_link = os.path.join(tmp_dir, 'baz') + dst_link = os.path.join(tmp_dir, 'quux') write_file(src, 'foo') - os.setxattr(src, 'user.foo', b'42') - shutil.copy2(src, dst) - self.assertEqual( - os.getxattr(src, 'user.foo'), - os.getxattr(dst, 'user.foo')) - os.remove(dst) - - @support.skip_unless_symlink - def test_copyfile_symlinks(self): - tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'src') - dst = os.path.join(tmp_dir, 'dst') - dst_link = os.path.join(tmp_dir, 'dst_link') - link = os.path.join(tmp_dir, 'link') - write_file(src, 'foo') - os.symlink(src, link) - # don't follow - shutil.copyfile(link, dst_link, follow_symlinks=False) - self.assertTrue(os.path.islink(dst_link)) - self.assertEqual(os.readlink(link), os.readlink(dst_link)) - # follow - shutil.copyfile(link, dst) - self.assertFalse(os.path.islink(dst)) - - def test_rmtree_uses_safe_fd_version_if_available(self): - _use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= - os.supports_dir_fd and - os.listdir in os.supports_fd and - os.stat in os.supports_follow_symlinks) - if _use_fd_functions: - self.assertTrue(shutil._use_fd_functions) - self.assertTrue(shutil.rmtree.avoids_symlink_attacks) - tmp_dir = self.mkdtemp() - d = os.path.join(tmp_dir, 'a') - os.mkdir(d) - try: - real_rmtree = shutil._rmtree_safe_fd - class Called(Exception): pass - def _raiser(*args, **kwargs): - raise Called - shutil._rmtree_safe_fd = _raiser - self.assertRaises(Called, shutil.rmtree, d) - finally: - shutil._rmtree_safe_fd = real_rmtree - else: - self.assertFalse(shutil._use_fd_functions) - self.assertFalse(shutil.rmtree.avoids_symlink_attacks) - - def test_rmtree_dont_delete_file(self): - # When called on a file instead of a directory, don't delete it. - handle, path = tempfile.mkstemp() - os.close(handle) - self.assertRaises(NotADirectoryError, shutil.rmtree, path) - os.remove(path) - - def test_copytree_simple(self): - src_dir = tempfile.mkdtemp() - dst_dir = os.path.join(tempfile.mkdtemp(), 'destination') - self.addCleanup(shutil.rmtree, src_dir) - self.addCleanup(shutil.rmtree, os.path.dirname(dst_dir)) - write_file((src_dir, 'test.txt'), '123') - os.mkdir(os.path.join(src_dir, 'test_dir')) - write_file((src_dir, 'test_dir', 'test.txt'), '456') - - shutil.copytree(src_dir, dst_dir) - self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test.txt'))) - self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'test_dir'))) - self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test_dir', - 'test.txt'))) - actual = read_file((dst_dir, 'test.txt')) - self.assertEqual(actual, '123') - actual = read_file((dst_dir, 'test_dir', 'test.txt')) - self.assertEqual(actual, '456') - - def test_copytree_dirs_exist_ok(self): - src_dir = tempfile.mkdtemp() - dst_dir = tempfile.mkdtemp() - self.addCleanup(shutil.rmtree, src_dir) - self.addCleanup(shutil.rmtree, dst_dir) - - write_file((src_dir, 'nonexisting.txt'), '123') - os.mkdir(os.path.join(src_dir, 'existing_dir')) - os.mkdir(os.path.join(dst_dir, 'existing_dir')) - write_file((dst_dir, 'existing_dir', 'existing.txt'), 'will be replaced') - write_file((src_dir, 'existing_dir', 'existing.txt'), 'has been replaced') + write_file(dst, 'foo') + os.symlink(src, src_link) + os.symlink(dst, dst_link) + os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) + os.chmod(dst, stat.S_IRWXU) + os.lchmod(src_link, stat.S_IRWXO|stat.S_IRWXG) + # link to link + os.lchmod(dst_link, stat.S_IRWXO) + shutil.copymode(src_link, dst_link, follow_symlinks=False) + self.assertEqual(os.lstat(src_link).st_mode, + os.lstat(dst_link).st_mode) + self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + # src link - use chmod + os.lchmod(dst_link, stat.S_IRWXO) + shutil.copymode(src_link, dst, follow_symlinks=False) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + # dst link - use chmod + os.lchmod(dst_link, stat.S_IRWXO) + shutil.copymode(src, dst_link, follow_symlinks=False) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - shutil.copytree(src_dir, dst_dir, dirs_exist_ok=True) - self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'nonexisting.txt'))) - self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'existing_dir'))) - self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'existing_dir', - 'existing.txt'))) - actual = read_file((dst_dir, 'nonexisting.txt')) - self.assertEqual(actual, '123') - actual = read_file((dst_dir, 'existing_dir', 'existing.txt')) - self.assertEqual(actual, 'has been replaced') + @unittest.skipIf(hasattr(os, 'lchmod'), 'requires os.lchmod to be missing') + @support.skip_unless_symlink + def test_copymode_symlink_to_symlink_wo_lchmod(self): + tmp_dir = self.mkdtemp() + src = os.path.join(tmp_dir, 'foo') + dst = os.path.join(tmp_dir, 'bar') + src_link = os.path.join(tmp_dir, 'baz') + dst_link = os.path.join(tmp_dir, 'quux') + write_file(src, 'foo') + write_file(dst, 'foo') + os.symlink(src, src_link) + os.symlink(dst, dst_link) + shutil.copymode(src_link, dst_link, follow_symlinks=False) # silent fail - with self.assertRaises(FileExistsError): - shutil.copytree(src_dir, dst_dir, dirs_exist_ok=False) + ### shutil.copystat @support.skip_unless_symlink - def test_copytree_symlinks(self): + def test_copystat_symlinks(self): tmp_dir = self.mkdtemp() - src_dir = os.path.join(tmp_dir, 'src') - dst_dir = os.path.join(tmp_dir, 'dst') - sub_dir = os.path.join(src_dir, 'sub') - os.mkdir(src_dir) - os.mkdir(sub_dir) - write_file((src_dir, 'file.txt'), 'foo') - src_link = os.path.join(sub_dir, 'link') - dst_link = os.path.join(dst_dir, 'sub/link') - os.symlink(os.path.join(src_dir, 'file.txt'), - src_link) + src = os.path.join(tmp_dir, 'foo') + dst = os.path.join(tmp_dir, 'bar') + src_link = os.path.join(tmp_dir, 'baz') + dst_link = os.path.join(tmp_dir, 'qux') + write_file(src, 'foo') + src_stat = os.stat(src) + os.utime(src, (src_stat.st_atime, + src_stat.st_mtime - 42.0)) # ensure different mtimes + write_file(dst, 'bar') + self.assertNotEqual(os.stat(src).st_mtime, os.stat(dst).st_mtime) + os.symlink(src, src_link) + os.symlink(dst, dst_link) if hasattr(os, 'lchmod'): - os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) + os.lchmod(src_link, stat.S_IRWXO) if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): os.lchflags(src_link, stat.UF_NODUMP) - src_stat = os.lstat(src_link) - shutil.copytree(src_dir, dst_dir, symlinks=True) - self.assertTrue(os.path.islink(os.path.join(dst_dir, 'sub', 'link'))) - actual = os.readlink(os.path.join(dst_dir, 'sub', 'link')) - # Bad practice to blindly strip the prefix as it may be required to - # correctly refer to the file, but we're only comparing paths here. - if os.name == 'nt' and actual.startswith('\\\\?\\'): - actual = actual[4:] - self.assertEqual(actual, os.path.join(src_dir, 'file.txt')) - dst_stat = os.lstat(dst_link) + src_link_stat = os.lstat(src_link) + # follow if hasattr(os, 'lchmod'): - self.assertEqual(dst_stat.st_mode, src_stat.st_mode) - if hasattr(os, 'lchflags'): - self.assertEqual(dst_stat.st_flags, src_stat.st_flags) - - def test_copytree_with_exclude(self): - # creating data - join = os.path.join - exists = os.path.exists - src_dir = tempfile.mkdtemp() - try: - dst_dir = join(tempfile.mkdtemp(), 'destination') - write_file((src_dir, 'test.txt'), '123') - write_file((src_dir, 'test.tmp'), '123') - os.mkdir(join(src_dir, 'test_dir')) - write_file((src_dir, 'test_dir', 'test.txt'), '456') - os.mkdir(join(src_dir, 'test_dir2')) - write_file((src_dir, 'test_dir2', 'test.txt'), '456') - os.mkdir(join(src_dir, 'test_dir2', 'subdir')) - os.mkdir(join(src_dir, 'test_dir2', 'subdir2')) - write_file((src_dir, 'test_dir2', 'subdir', 'test.txt'), '456') - write_file((src_dir, 'test_dir2', 'subdir2', 'test.py'), '456') - - # testing glob-like patterns - try: - patterns = shutil.ignore_patterns('*.tmp', 'test_dir2') - shutil.copytree(src_dir, dst_dir, ignore=patterns) - # checking the result: some elements should not be copied - self.assertTrue(exists(join(dst_dir, 'test.txt'))) - self.assertFalse(exists(join(dst_dir, 'test.tmp'))) - self.assertFalse(exists(join(dst_dir, 'test_dir2'))) - finally: - shutil.rmtree(dst_dir) - try: - patterns = shutil.ignore_patterns('*.tmp', 'subdir*') - shutil.copytree(src_dir, dst_dir, ignore=patterns) - # checking the result: some elements should not be copied - self.assertFalse(exists(join(dst_dir, 'test.tmp'))) - self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir2'))) - self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir'))) - finally: - shutil.rmtree(dst_dir) - - # testing callable-style - try: - def _filter(src, names): - res = [] - for name in names: - path = os.path.join(src, name) - - if (os.path.isdir(path) and - path.split()[-1] == 'subdir'): - res.append(name) - elif os.path.splitext(path)[-1] in ('.py'): - res.append(name) - return res + shutil.copystat(src_link, dst_link, follow_symlinks=True) + self.assertNotEqual(src_link_stat.st_mode, os.stat(dst).st_mode) + # don't follow + shutil.copystat(src_link, dst_link, follow_symlinks=False) + dst_link_stat = os.lstat(dst_link) + if os.utime in os.supports_follow_symlinks: + for attr in 'st_atime', 'st_mtime': + # The modification times may be truncated in the new file. + self.assertLessEqual(getattr(src_link_stat, attr), + getattr(dst_link_stat, attr) + 1) + if hasattr(os, 'lchmod'): + self.assertEqual(src_link_stat.st_mode, dst_link_stat.st_mode) + if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'): + self.assertEqual(src_link_stat.st_flags, dst_link_stat.st_flags) + # tell to follow but dst is not a link + shutil.copystat(src_link, dst, follow_symlinks=False) + self.assertTrue(abs(os.stat(src).st_mtime - os.stat(dst).st_mtime) < + 00000.1) - shutil.copytree(src_dir, dst_dir, ignore=_filter) + @unittest.skipUnless(hasattr(os, 'chflags') and + hasattr(errno, 'EOPNOTSUPP') and + hasattr(errno, 'ENOTSUP'), + "requires os.chflags, EOPNOTSUPP & ENOTSUP") + def test_copystat_handles_harmless_chflags_errors(self): + tmpdir = self.mkdtemp() + file1 = os.path.join(tmpdir, 'file1') + file2 = os.path.join(tmpdir, 'file2') + write_file(file1, 'xxx') + write_file(file2, 'xxx') - # checking the result: some elements should not be copied - self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir2', - 'test.py'))) - self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir'))) + def make_chflags_raiser(err): + ex = OSError() - finally: - shutil.rmtree(dst_dir) + def _chflags_raiser(path, flags, *, follow_symlinks=True): + ex.errno = err + raise ex + return _chflags_raiser + old_chflags = os.chflags + try: + for err in errno.EOPNOTSUPP, errno.ENOTSUP: + os.chflags = make_chflags_raiser(err) + shutil.copystat(file1, file2) + # assert others errors break it + os.chflags = make_chflags_raiser(errno.EOPNOTSUPP + errno.ENOTSUP) + self.assertRaises(OSError, shutil.copystat, file1, file2) finally: - shutil.rmtree(src_dir) - shutil.rmtree(os.path.dirname(dst_dir)) + os.chflags = old_chflags - def test_copytree_arg_types_of_ignore(self): - join = os.path.join - exists = os.path.exists + ### shutil.copyxattr + @support.skip_unless_xattr + def test_copyxattr(self): tmp_dir = self.mkdtemp() - src_dir = join(tmp_dir, "source") + src = os.path.join(tmp_dir, 'foo') + write_file(src, 'foo') + dst = os.path.join(tmp_dir, 'bar') + write_file(dst, 'bar') - os.mkdir(join(src_dir)) - os.mkdir(join(src_dir, 'test_dir')) - os.mkdir(os.path.join(src_dir, 'test_dir', 'subdir')) - write_file((src_dir, 'test_dir', 'subdir', 'test.txt'), '456') + # no xattr == no problem + shutil._copyxattr(src, dst) + # common case + os.setxattr(src, 'user.foo', b'42') + os.setxattr(src, 'user.bar', b'43') + shutil._copyxattr(src, dst) + self.assertEqual(sorted(os.listxattr(src)), sorted(os.listxattr(dst))) + self.assertEqual( + os.getxattr(src, 'user.foo'), + os.getxattr(dst, 'user.foo')) + # check errors don't affect other attrs + os.remove(dst) + write_file(dst, 'bar') + os_error = OSError(errno.EPERM, 'EPERM') - invokations = [] + def _raise_on_user_foo(fname, attr, val, **kwargs): + if attr == 'user.foo': + raise os_error + else: + orig_setxattr(fname, attr, val, **kwargs) + try: + orig_setxattr = os.setxattr + os.setxattr = _raise_on_user_foo + shutil._copyxattr(src, dst) + self.assertIn('user.bar', os.listxattr(dst)) + finally: + os.setxattr = orig_setxattr + # the source filesystem not supporting xattrs should be ok, too. + def _raise_on_src(fname, *, follow_symlinks=True): + if fname == src: + raise OSError(errno.ENOTSUP, 'Operation not supported') + return orig_listxattr(fname, follow_symlinks=follow_symlinks) + try: + orig_listxattr = os.listxattr + os.listxattr = _raise_on_src + shutil._copyxattr(src, dst) + finally: + os.listxattr = orig_listxattr - def _ignore(src, names): - invokations.append(src) - self.assertIsInstance(src, str) - self.assertIsInstance(names, list) - self.assertEqual(len(names), len(set(names))) - for name in names: - self.assertIsInstance(name, str) - return [] + # test that shutil.copystat copies xattrs + src = os.path.join(tmp_dir, 'the_original') + srcro = os.path.join(tmp_dir, 'the_original_ro') + write_file(src, src) + write_file(srcro, srcro) + os.setxattr(src, 'user.the_value', b'fiddly') + os.setxattr(srcro, 'user.the_value', b'fiddly') + os.chmod(srcro, 0o444) + dst = os.path.join(tmp_dir, 'the_copy') + dstro = os.path.join(tmp_dir, 'the_copy_ro') + write_file(dst, dst) + write_file(dstro, dstro) + shutil.copystat(src, dst) + shutil.copystat(srcro, dstro) + self.assertEqual(os.getxattr(dst, 'user.the_value'), b'fiddly') + self.assertEqual(os.getxattr(dstro, 'user.the_value'), b'fiddly') - dst_dir = join(self.mkdtemp(), 'destination') - shutil.copytree(src_dir, dst_dir, ignore=_ignore) - self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', - 'test.txt'))) + @support.skip_unless_symlink + @support.skip_unless_xattr + @unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() == 0, + 'root privileges required') + def test_copyxattr_symlinks(self): + # On Linux, it's only possible to access non-user xattr for symlinks; + # which in turn require root privileges. This test should be expanded + # as soon as other platforms gain support for extended attributes. + tmp_dir = self.mkdtemp() + src = os.path.join(tmp_dir, 'foo') + src_link = os.path.join(tmp_dir, 'baz') + write_file(src, 'foo') + os.symlink(src, src_link) + os.setxattr(src, 'trusted.foo', b'42') + os.setxattr(src_link, 'trusted.foo', b'43', follow_symlinks=False) + dst = os.path.join(tmp_dir, 'bar') + dst_link = os.path.join(tmp_dir, 'qux') + write_file(dst, 'bar') + os.symlink(dst, dst_link) + shutil._copyxattr(src_link, dst_link, follow_symlinks=False) + self.assertEqual(os.getxattr(dst_link, 'trusted.foo', follow_symlinks=False), b'43') + self.assertRaises(OSError, os.getxattr, dst, 'trusted.foo') + shutil._copyxattr(src_link, dst, follow_symlinks=False) + self.assertEqual(os.getxattr(dst, 'trusted.foo'), b'43') - dst_dir = join(self.mkdtemp(), 'destination') - shutil.copytree(pathlib.Path(src_dir), dst_dir, ignore=_ignore) - self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', - 'test.txt'))) + ### shutil.copy - dst_dir = join(self.mkdtemp(), 'destination') - src_dir_entry = list(os.scandir(tmp_dir))[0] - self.assertIsInstance(src_dir_entry, os.DirEntry) - shutil.copytree(src_dir_entry, dst_dir, ignore=_ignore) - self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', - 'test.txt'))) + def _copy_file(self, method): + fname = 'test.txt' + tmpdir = self.mkdtemp() + write_file((tmpdir, fname), 'xxx') + file1 = os.path.join(tmpdir, fname) + tmpdir2 = self.mkdtemp() + method(file1, tmpdir2) + file2 = os.path.join(tmpdir2, fname) + return (file1, file2) - self.assertEqual(len(invokations), 9) + def test_copy(self): + # Ensure that the copied file exists and has the same mode bits. + file1, file2 = self._copy_file(shutil.copy) + self.assertTrue(os.path.exists(file2)) + self.assertEqual(os.stat(file1).st_mode, os.stat(file2).st_mode) - def test_copytree_retains_permissions(self): - tmp_dir = tempfile.mkdtemp() - src_dir = os.path.join(tmp_dir, 'source') - os.mkdir(src_dir) - dst_dir = os.path.join(tmp_dir, 'destination') - self.addCleanup(shutil.rmtree, tmp_dir) + @support.skip_unless_symlink + def test_copy_symlinks(self): + tmp_dir = self.mkdtemp() + src = os.path.join(tmp_dir, 'foo') + dst = os.path.join(tmp_dir, 'bar') + src_link = os.path.join(tmp_dir, 'baz') + write_file(src, 'foo') + os.symlink(src, src_link) + if hasattr(os, 'lchmod'): + os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) + # don't follow + shutil.copy(src_link, dst, follow_symlinks=True) + self.assertFalse(os.path.islink(dst)) + self.assertEqual(read_file(src), read_file(dst)) + os.remove(dst) + # follow + shutil.copy(src_link, dst, follow_symlinks=False) + self.assertTrue(os.path.islink(dst)) + self.assertEqual(os.readlink(dst), os.readlink(src_link)) + if hasattr(os, 'lchmod'): + self.assertEqual(os.lstat(src_link).st_mode, + os.lstat(dst).st_mode) - os.chmod(src_dir, 0o777) - write_file((src_dir, 'permissive.txt'), '123') - os.chmod(os.path.join(src_dir, 'permissive.txt'), 0o777) - write_file((src_dir, 'restrictive.txt'), '456') - os.chmod(os.path.join(src_dir, 'restrictive.txt'), 0o600) - restrictive_subdir = tempfile.mkdtemp(dir=src_dir) - os.chmod(restrictive_subdir, 0o600) + ### shutil.copy2 - shutil.copytree(src_dir, dst_dir) - self.assertEqual(os.stat(src_dir).st_mode, os.stat(dst_dir).st_mode) - self.assertEqual(os.stat(os.path.join(src_dir, 'permissive.txt')).st_mode, - os.stat(os.path.join(dst_dir, 'permissive.txt')).st_mode) - self.assertEqual(os.stat(os.path.join(src_dir, 'restrictive.txt')).st_mode, - os.stat(os.path.join(dst_dir, 'restrictive.txt')).st_mode) - restrictive_subdir_dst = os.path.join(dst_dir, - os.path.split(restrictive_subdir)[1]) - self.assertEqual(os.stat(restrictive_subdir).st_mode, - os.stat(restrictive_subdir_dst).st_mode) + @unittest.skipUnless(hasattr(os, 'utime'), 'requires os.utime') + def test_copy2(self): + # Ensure that the copied file exists and has the same mode and + # modification time bits. + file1, file2 = self._copy_file(shutil.copy2) + self.assertTrue(os.path.exists(file2)) + file1_stat = os.stat(file1) + file2_stat = os.stat(file2) + self.assertEqual(file1_stat.st_mode, file2_stat.st_mode) + for attr in 'st_atime', 'st_mtime': + # The modification times may be truncated in the new file. + self.assertLessEqual(getattr(file1_stat, attr), + getattr(file2_stat, attr) + 1) + if hasattr(os, 'chflags') and hasattr(file1_stat, 'st_flags'): + self.assertEqual(getattr(file1_stat, 'st_flags'), + getattr(file2_stat, 'st_flags')) - @unittest.mock.patch('os.chmod') - def test_copytree_winerror(self, mock_patch): - # When copying to VFAT, copystat() raises OSError. On Windows, the - # exception object has a meaningful 'winerror' attribute, but not - # on other operating systems. Do not assume 'winerror' is set. - src_dir = tempfile.mkdtemp() - dst_dir = os.path.join(tempfile.mkdtemp(), 'destination') - self.addCleanup(shutil.rmtree, src_dir) - self.addCleanup(shutil.rmtree, os.path.dirname(dst_dir)) + @support.skip_unless_symlink + def test_copy2_symlinks(self): + tmp_dir = self.mkdtemp() + src = os.path.join(tmp_dir, 'foo') + dst = os.path.join(tmp_dir, 'bar') + src_link = os.path.join(tmp_dir, 'baz') + write_file(src, 'foo') + os.symlink(src, src_link) + if hasattr(os, 'lchmod'): + os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) + if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): + os.lchflags(src_link, stat.UF_NODUMP) + src_stat = os.stat(src) + src_link_stat = os.lstat(src_link) + # follow + shutil.copy2(src_link, dst, follow_symlinks=True) + self.assertFalse(os.path.islink(dst)) + self.assertEqual(read_file(src), read_file(dst)) + os.remove(dst) + # don't follow + shutil.copy2(src_link, dst, follow_symlinks=False) + self.assertTrue(os.path.islink(dst)) + self.assertEqual(os.readlink(dst), os.readlink(src_link)) + dst_stat = os.lstat(dst) + if os.utime in os.supports_follow_symlinks: + for attr in 'st_atime', 'st_mtime': + # The modification times may be truncated in the new file. + self.assertLessEqual(getattr(src_link_stat, attr), + getattr(dst_stat, attr) + 1) + if hasattr(os, 'lchmod'): + self.assertEqual(src_link_stat.st_mode, dst_stat.st_mode) + self.assertNotEqual(src_stat.st_mode, dst_stat.st_mode) + if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'): + self.assertEqual(src_link_stat.st_flags, dst_stat.st_flags) - mock_patch.side_effect = PermissionError('ka-boom') - with self.assertRaises(shutil.Error): - shutil.copytree(src_dir, dst_dir) + @support.skip_unless_xattr + def test_copy2_xattr(self): + tmp_dir = self.mkdtemp() + src = os.path.join(tmp_dir, 'foo') + dst = os.path.join(tmp_dir, 'bar') + write_file(src, 'foo') + os.setxattr(src, 'user.foo', b'42') + shutil.copy2(src, dst) + self.assertEqual( + os.getxattr(src, 'user.foo'), + os.getxattr(dst, 'user.foo')) + os.remove(dst) - def test_copytree_custom_copy_function(self): - # See: https://bugs.python.org/issue35648 - def custom_cpfun(a, b): - flag.append(None) - self.assertIsInstance(a, str) - self.assertIsInstance(b, str) - self.assertEqual(a, os.path.join(src, 'foo')) - self.assertEqual(b, os.path.join(dst, 'foo')) + def test_copy_return_value(self): + # copy and copy2 both return their destination path. + for fn in (shutil.copy, shutil.copy2): + src_dir = self.mkdtemp() + dst_dir = self.mkdtemp() + src = os.path.join(src_dir, 'foo') + write_file(src, 'foo') + rv = fn(src, dst_dir) + self.assertEqual(rv, os.path.join(dst_dir, 'foo')) + rv = fn(src, os.path.join(dst_dir, 'bar')) + self.assertEqual(rv, os.path.join(dst_dir, 'bar')) - flag = [] - src = tempfile.mkdtemp() - self.addCleanup(support.rmtree, src) - dst = tempfile.mktemp() - self.addCleanup(support.rmtree, dst) - with open(os.path.join(src, 'foo'), 'w') as f: - f.close() - shutil.copytree(src, dst, copy_function=custom_cpfun) - self.assertEqual(len(flag), 1) + ### shutil.copyfile + + @support.skip_unless_symlink + def test_copyfile_symlinks(self): + tmp_dir = self.mkdtemp() + src = os.path.join(tmp_dir, 'src') + dst = os.path.join(tmp_dir, 'dst') + dst_link = os.path.join(tmp_dir, 'dst_link') + link = os.path.join(tmp_dir, 'link') + write_file(src, 'foo') + os.symlink(src, link) + # don't follow + shutil.copyfile(link, dst_link, follow_symlinks=False) + self.assertTrue(os.path.islink(dst_link)) + self.assertEqual(os.readlink(link), os.readlink(dst_link)) + # follow + shutil.copyfile(link, dst) + self.assertFalse(os.path.islink(dst)) @unittest.skipUnless(hasattr(os, 'link'), 'requires os.link') def test_dont_copy_file_onto_link_to_itself(self): @@ -1006,46 +1188,18 @@ class TestShutil(unittest.TestCase): # bug 851123. os.mkdir(TESTFN) src = os.path.join(TESTFN, 'cheese') - dst = os.path.join(TESTFN, 'shop') - try: - with open(src, 'w') as f: - f.write('cheddar') - # Using `src` here would mean we end up with a symlink pointing - # to TESTFN/TESTFN/cheese, while it should point at - # TESTFN/cheese. - os.symlink('cheese', dst) - self.assertRaises(shutil.SameFileError, shutil.copyfile, src, dst) - with open(src, 'r') as f: - self.assertEqual(f.read(), 'cheddar') - os.remove(dst) - finally: - shutil.rmtree(TESTFN, ignore_errors=True) - - @support.skip_unless_symlink - def test_rmtree_on_symlink(self): - # bug 1669. - os.mkdir(TESTFN) - try: - src = os.path.join(TESTFN, 'cheese') - dst = os.path.join(TESTFN, 'shop') - os.mkdir(src) - os.symlink(src, dst) - self.assertRaises(OSError, shutil.rmtree, dst) - shutil.rmtree(dst, ignore_errors=True) - finally: - shutil.rmtree(TESTFN, ignore_errors=True) - - @unittest.skipUnless(_winapi, 'only relevant on Windows') - def test_rmtree_on_junction(self): - os.mkdir(TESTFN) - try: - src = os.path.join(TESTFN, 'cheese') - dst = os.path.join(TESTFN, 'shop') - os.mkdir(src) - open(os.path.join(src, 'spam'), 'wb').close() - _winapi.CreateJunction(src, dst) - self.assertRaises(OSError, shutil.rmtree, dst) - shutil.rmtree(dst, ignore_errors=True) + dst = os.path.join(TESTFN, 'shop') + try: + with open(src, 'w') as f: + f.write('cheddar') + # Using `src` here would mean we end up with a symlink pointing + # to TESTFN/TESTFN/cheese, while it should point at + # TESTFN/cheese. + os.symlink('cheese', dst) + self.assertRaises(shutil.SameFileError, shutil.copyfile, src, dst) + with open(src, 'r') as f: + self.assertEqual(f.read(), 'cheddar') + os.remove(dst) finally: shutil.rmtree(TESTFN, ignore_errors=True) @@ -1064,121 +1218,35 @@ class TestShutil(unittest.TestCase): finally: os.remove(TESTFN) - @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()') - @support.skip_unless_symlink - def test_copytree_named_pipe(self): - os.mkdir(TESTFN) - try: - subdir = os.path.join(TESTFN, "subdir") - os.mkdir(subdir) - pipe = os.path.join(subdir, "mypipe") - try: - os.mkfifo(pipe) - except PermissionError as e: - self.skipTest('os.mkfifo(): %s' % e) - try: - shutil.copytree(TESTFN, TESTFN2) - except shutil.Error as e: - errors = e.args[0] - self.assertEqual(len(errors), 1) - src, dst, error_msg = errors[0] - self.assertEqual("`%s` is a named pipe" % pipe, error_msg) - else: - self.fail("shutil.Error should have been raised") - finally: - shutil.rmtree(TESTFN, ignore_errors=True) - shutil.rmtree(TESTFN2, ignore_errors=True) - - def test_copytree_special_func(self): - - src_dir = self.mkdtemp() - dst_dir = os.path.join(self.mkdtemp(), 'destination') - write_file((src_dir, 'test.txt'), '123') - os.mkdir(os.path.join(src_dir, 'test_dir')) - write_file((src_dir, 'test_dir', 'test.txt'), '456') - - copied = [] - def _copy(src, dst): - copied.append((src, dst)) - - shutil.copytree(src_dir, dst_dir, copy_function=_copy) - self.assertEqual(len(copied), 2) - - @support.skip_unless_symlink - def test_copytree_dangling_symlinks(self): - - # a dangling symlink raises an error at the end + def test_copyfile_return_value(self): + # copytree returns its destination path. src_dir = self.mkdtemp() - dst_dir = os.path.join(self.mkdtemp(), 'destination') - os.symlink('IDONTEXIST', os.path.join(src_dir, 'test.txt')) - os.mkdir(os.path.join(src_dir, 'test_dir')) - write_file((src_dir, 'test_dir', 'test.txt'), '456') - self.assertRaises(Error, shutil.copytree, src_dir, dst_dir) - - # a dangling symlink is ignored with the proper flag - dst_dir = os.path.join(self.mkdtemp(), 'destination2') - shutil.copytree(src_dir, dst_dir, ignore_dangling_symlinks=True) - self.assertNotIn('test.txt', os.listdir(dst_dir)) - - # a dangling symlink is copied if symlinks=True - dst_dir = os.path.join(self.mkdtemp(), 'destination3') - shutil.copytree(src_dir, dst_dir, symlinks=True) - self.assertIn('test.txt', os.listdir(dst_dir)) + dst_dir = self.mkdtemp() + dst_file = os.path.join(dst_dir, 'bar') + src_file = os.path.join(src_dir, 'foo') + write_file(src_file, 'foo') + rv = shutil.copyfile(src_file, dst_file) + self.assertTrue(os.path.exists(rv)) + self.assertEqual(read_file(src_file), read_file(dst_file)) - @support.skip_unless_symlink - def test_copytree_symlink_dir(self): + def test_copyfile_same_file(self): + # copyfile() should raise SameFileError if the source and destination + # are the same. src_dir = self.mkdtemp() - dst_dir = os.path.join(self.mkdtemp(), 'destination') - os.mkdir(os.path.join(src_dir, 'real_dir')) - with open(os.path.join(src_dir, 'real_dir', 'test.txt'), 'w'): - pass - os.symlink(os.path.join(src_dir, 'real_dir'), - os.path.join(src_dir, 'link_to_dir'), - target_is_directory=True) - - shutil.copytree(src_dir, dst_dir, symlinks=False) - self.assertFalse(os.path.islink(os.path.join(dst_dir, 'link_to_dir'))) - self.assertIn('test.txt', os.listdir(os.path.join(dst_dir, 'link_to_dir'))) - - dst_dir = os.path.join(self.mkdtemp(), 'destination2') - shutil.copytree(src_dir, dst_dir, symlinks=True) - self.assertTrue(os.path.islink(os.path.join(dst_dir, 'link_to_dir'))) - self.assertIn('test.txt', os.listdir(os.path.join(dst_dir, 'link_to_dir'))) + src_file = os.path.join(src_dir, 'foo') + write_file(src_file, 'foo') + self.assertRaises(SameFileError, shutil.copyfile, src_file, src_file) + # But Error should work too, to stay backward compatible. + self.assertRaises(Error, shutil.copyfile, src_file, src_file) + # Make sure file is not corrupted. + self.assertEqual(read_file(src_file), 'foo') - def _copy_file(self, method): - fname = 'test.txt' - tmpdir = self.mkdtemp() - write_file((tmpdir, fname), 'xxx') - file1 = os.path.join(tmpdir, fname) - tmpdir2 = self.mkdtemp() - method(file1, tmpdir2) - file2 = os.path.join(tmpdir2, fname) - return (file1, file2) - def test_copy(self): - # Ensure that the copied file exists and has the same mode bits. - file1, file2 = self._copy_file(shutil.copy) - self.assertTrue(os.path.exists(file2)) - self.assertEqual(os.stat(file1).st_mode, os.stat(file2).st_mode) +class TestArchives(BaseTest, unittest.TestCase): - @unittest.skipUnless(hasattr(os, 'utime'), 'requires os.utime') - def test_copy2(self): - # Ensure that the copied file exists and has the same mode and - # modification time bits. - file1, file2 = self._copy_file(shutil.copy2) - self.assertTrue(os.path.exists(file2)) - file1_stat = os.stat(file1) - file2_stat = os.stat(file2) - self.assertEqual(file1_stat.st_mode, file2_stat.st_mode) - for attr in 'st_atime', 'st_mtime': - # The modification times may be truncated in the new file. - self.assertLessEqual(getattr(file1_stat, attr), - getattr(file2_stat, attr) + 1) - if hasattr(os, 'chflags') and hasattr(file1_stat, 'st_flags'): - self.assertEqual(getattr(file1_stat, 'st_flags'), - getattr(file2_stat, 'st_flags')) + ### shutil.make_archive - @support.requires_zlib + @support.requires_zlib() def test_make_tarball(self): # creating something to tar root_dir, base_dir = self._create_files('') @@ -1234,7 +1302,7 @@ class TestShutil(unittest.TestCase): write_file((root_dir, 'outer'), 'xxx') return root_dir, base_dir - @support.requires_zlib + @support.requires_zlib() @unittest.skipUnless(shutil.which('tar'), 'Need the tar command to run') def test_tarfile_vs_tar(self): @@ -1267,7 +1335,7 @@ class TestShutil(unittest.TestCase): self.assertEqual(tarball, base_name + '.tar') self.assertTrue(os.path.isfile(tarball)) - @support.requires_zlib + @support.requires_zlib() def test_make_zipfile(self): # creating something to zip root_dir, base_dir = self._create_files() @@ -1304,7 +1372,7 @@ class TestShutil(unittest.TestCase): ['dist/', 'dist/sub/', 'dist/sub2/', 'dist/file1', 'dist/file2', 'dist/sub/file3']) - @support.requires_zlib + @support.requires_zlib() @unittest.skipUnless(shutil.which('zip'), 'Need the zip command to run') def test_zipfile_vs_zip(self): @@ -1330,7 +1398,7 @@ class TestShutil(unittest.TestCase): names2 = zf.namelist() self.assertEqual(sorted(names), sorted(names2)) - @support.requires_zlib + @support.requires_zlib() @unittest.skipUnless(shutil.which('unzip'), 'Need the unzip command to run') def test_unzip_zipfile(self): @@ -1359,7 +1427,7 @@ class TestShutil(unittest.TestCase): base_name = os.path.join(tmpdir, 'archive') self.assertRaises(ValueError, make_archive, base_name, 'xxx') - @support.requires_zlib + @support.requires_zlib() def test_make_archive_owner_group(self): # testing make_archive with owner and group, with various combinations # this works even if there's not gid/uid support @@ -1387,7 +1455,7 @@ class TestShutil(unittest.TestCase): self.assertTrue(os.path.isfile(res)) - @support.requires_zlib + @support.requires_zlib() @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support") def test_tarfile_root_owner(self): root_dir, base_dir = self._create_files() @@ -1432,7 +1500,7 @@ class TestShutil(unittest.TestCase): self.assertEqual(make_archive('test', 'tar'), 'test.tar') self.assertTrue(os.path.isfile('test.tar')) - @support.requires_zlib + @support.requires_zlib() def test_make_zipfile_in_curdir(self): # Issue #21280 root_dir = self.mkdtemp() @@ -1456,6 +1524,8 @@ class TestShutil(unittest.TestCase): formats = [name for name, params in get_archive_formats()] self.assertNotIn('xxx', formats) + ### shutil.unpack_archive + def check_unpack_archive(self, format): self.check_unpack_archive_with_converter(format, lambda path: path) self.check_unpack_archive_with_converter(format, pathlib.Path) @@ -1485,20 +1555,20 @@ class TestShutil(unittest.TestCase): def test_unpack_archive_tar(self): self.check_unpack_archive('tar') - @support.requires_zlib + @support.requires_zlib() def test_unpack_archive_gztar(self): self.check_unpack_archive('gztar') - @support.requires_bz2 + @support.requires_bz2() def test_unpack_archive_bztar(self): self.check_unpack_archive('bztar') - @support.requires_lzma + @support.requires_lzma() @unittest.skipIf(AIX and not _maxdataOK(), "AIX MAXDATA must be 0x20000000 or larger") def test_unpack_archive_xztar(self): self.check_unpack_archive('xztar') - @support.requires_zlib + @support.requires_zlib() def test_unpack_archive_zip(self): self.check_unpack_archive('zip') @@ -1528,6 +1598,9 @@ class TestShutil(unittest.TestCase): unregister_unpack_format('Boo2') self.assertEqual(get_unpack_formats(), formats) + +class TestMisc(BaseTest, unittest.TestCase): + @unittest.skipUnless(hasattr(shutil, 'disk_usage'), "disk_usage not available on this platform") def test_disk_usage(self): @@ -1546,8 +1619,6 @@ class TestShutil(unittest.TestCase): @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support") @unittest.skipUnless(hasattr(os, 'chown'), 'requires os.chown') def test_chown(self): - - # cleaned-up automatically by TestShutil.tearDown method dirname = self.mkdtemp() filename = tempfile.mktemp(dir=dirname) write_file(filename, 'testing chown function') @@ -1595,76 +1666,23 @@ class TestShutil(unittest.TestCase): shutil.chown(dirname, group=gid) check_chown(dirname, gid=gid) - user = pwd.getpwuid(uid)[0] - group = grp.getgrgid(gid)[0] - shutil.chown(filename, user, group) - check_chown(filename, uid, gid) - shutil.chown(dirname, user, group) - check_chown(dirname, uid, gid) - - def test_copy_return_value(self): - # copy and copy2 both return their destination path. - for fn in (shutil.copy, shutil.copy2): - src_dir = self.mkdtemp() - dst_dir = self.mkdtemp() - src = os.path.join(src_dir, 'foo') - write_file(src, 'foo') - rv = fn(src, dst_dir) - self.assertEqual(rv, os.path.join(dst_dir, 'foo')) - rv = fn(src, os.path.join(dst_dir, 'bar')) - self.assertEqual(rv, os.path.join(dst_dir, 'bar')) - - def test_copyfile_return_value(self): - # copytree returns its destination path. - src_dir = self.mkdtemp() - dst_dir = self.mkdtemp() - dst_file = os.path.join(dst_dir, 'bar') - src_file = os.path.join(src_dir, 'foo') - write_file(src_file, 'foo') - rv = shutil.copyfile(src_file, dst_file) - self.assertTrue(os.path.exists(rv)) - self.assertEqual(read_file(src_file), read_file(dst_file)) - - def test_copyfile_same_file(self): - # copyfile() should raise SameFileError if the source and destination - # are the same. - src_dir = self.mkdtemp() - src_file = os.path.join(src_dir, 'foo') - write_file(src_file, 'foo') - self.assertRaises(SameFileError, shutil.copyfile, src_file, src_file) - # But Error should work too, to stay backward compatible. - self.assertRaises(Error, shutil.copyfile, src_file, src_file) - # Make sure file is not corrupted. - self.assertEqual(read_file(src_file), 'foo') - - def test_copytree_return_value(self): - # copytree returns its destination path. - src_dir = self.mkdtemp() - dst_dir = src_dir + "dest" - self.addCleanup(shutil.rmtree, dst_dir, True) - src = os.path.join(src_dir, 'foo') - write_file(src, 'foo') - rv = shutil.copytree(src_dir, dst_dir) - self.assertEqual(['foo'], os.listdir(rv)) - - def test_copytree_subdirectory(self): - # copytree where dst is a subdirectory of src, see Issue 38688 - base_dir = self.mkdtemp() - self.addCleanup(shutil.rmtree, base_dir, ignore_errors=True) - src_dir = os.path.join(base_dir, "t", "pg") - dst_dir = os.path.join(src_dir, "somevendor", "1.0") - os.makedirs(src_dir) - src = os.path.join(src_dir, 'pol') - write_file(src, 'pol') - rv = shutil.copytree(src_dir, dst_dir) - self.assertEqual(['pol'], os.listdir(rv)) + try: + user = pwd.getpwuid(uid)[0] + group = grp.getgrgid(gid)[0] + except KeyError: + # On some systems uid/gid cannot be resolved. + pass + else: + shutil.chown(filename, user, group) + check_chown(filename, uid, gid) + shutil.chown(dirname, user, group) + check_chown(dirname, uid, gid) -class TestWhich(unittest.TestCase): +class TestWhich(BaseTest, unittest.TestCase): def setUp(self): - self.temp_dir = tempfile.mkdtemp(prefix="Tmp") - self.addCleanup(shutil.rmtree, self.temp_dir, True) + self.temp_dir = self.mkdtemp(prefix="Tmp") # Give the temp_file an ".exe" suffix for all. # It's needed on Windows and not harmful on other platforms. self.temp_file = tempfile.NamedTemporaryFile(dir=self.temp_dir, @@ -1841,28 +1859,17 @@ class TestWhichBytes(TestWhich): self.ext = os.fsencode(self.ext) -class TestMove(unittest.TestCase): +class TestMove(BaseTest, unittest.TestCase): def setUp(self): filename = "foo" - basedir = None - if sys.platform == "win32": - basedir = os.path.realpath(os.getcwd()) - self.src_dir = tempfile.mkdtemp(dir=basedir) - self.dst_dir = tempfile.mkdtemp(dir=basedir) + self.src_dir = self.mkdtemp() + self.dst_dir = self.mkdtemp() self.src_file = os.path.join(self.src_dir, filename) self.dst_file = os.path.join(self.dst_dir, filename) with open(self.src_file, "wb") as f: f.write(b"spam") - def tearDown(self): - for d in (self.src_dir, self.dst_dir): - try: - if d: - shutil.rmtree(d) - except: - pass - def _check_move_file(self, src, dst, real_dst): with open(src, "rb") as f: contents = f.read() @@ -1885,6 +1892,16 @@ class TestMove(unittest.TestCase): # Move a file inside an existing dir on the same filesystem. self._check_move_file(self.src_file, self.dst_dir, self.dst_file) + def test_move_file_to_dir_pathlike_src(self): + # Move a pathlike file to another location on the same filesystem. + src = pathlib.Path(self.src_file) + self._check_move_file(src, self.dst_dir, self.dst_file) + + def test_move_file_to_dir_pathlike_dst(self): + # Move a file to another pathlike location on the same filesystem. + dst = pathlib.Path(self.dst_dir) + self._check_move_file(self.src_file, dst, self.dst_file) + @mock_rename def test_move_file_other_fs(self): # Move a file to an existing dir on another filesystem. @@ -1897,14 +1914,11 @@ class TestMove(unittest.TestCase): def test_move_dir(self): # Move a dir to another location on the same filesystem. - dst_dir = tempfile.mktemp() + dst_dir = tempfile.mktemp(dir=self.mkdtemp()) try: self._check_move_dir(self.src_dir, dst_dir, dst_dir) finally: - try: - shutil.rmtree(dst_dir) - except: - pass + support.rmtree(dst_dir) @mock_rename def test_move_dir_other_fs(self): @@ -1951,7 +1965,7 @@ class TestMove(unittest.TestCase): msg='_destinsrc() wrongly concluded that ' 'dst (%s) is not in src (%s)' % (dst, src)) finally: - shutil.rmtree(TESTFN, ignore_errors=True) + support.rmtree(TESTFN) def test_destinsrc_false_positive(self): os.mkdir(TESTFN) @@ -1963,7 +1977,7 @@ class TestMove(unittest.TestCase): msg='_destinsrc() wrongly concluded that ' 'dst (%s) is in src (%s)' % (dst, src)) finally: - shutil.rmtree(TESTFN, ignore_errors=True) + support.rmtree(TESTFN) @support.skip_unless_symlink @mock_rename @@ -2035,10 +2049,24 @@ class TestMove(unittest.TestCase): shutil.move(self.src_dir, self.dst_dir, copy_function=_copy) self.assertEqual(len(moved), 3) + def test_move_dir_caseinsensitive(self): + # Renames a folder to the same name + # but a different case. -class TestCopyFile(unittest.TestCase): + self.src_dir = self.mkdtemp() + dst_dir = os.path.join( + os.path.dirname(self.src_dir), + os.path.basename(self.src_dir).upper()) + self.assertNotEqual(self.src_dir, dst_dir) - _delete = False + try: + shutil.move(self.src_dir, dst_dir) + self.assertTrue(os.path.isdir(dst_dir)) + finally: + os.rmdir(dst_dir) + + +class TestCopyFile(unittest.TestCase): class Faux(object): _entered = False @@ -2058,27 +2086,18 @@ class TestCopyFile(unittest.TestCase): raise OSError("Cannot close") return self._suppress_at_exit - def tearDown(self): - if self._delete: - del shutil.open - - def _set_shutil_open(self, func): - shutil.open = func - self._delete = True - def test_w_source_open_fails(self): def _open(filename, mode='r'): if filename == 'srcfile': raise OSError('Cannot open "srcfile"') assert 0 # shouldn't reach here. - self._set_shutil_open(_open) - - self.assertRaises(OSError, shutil.copyfile, 'srcfile', 'destfile') + with support.swap_attr(shutil, 'open', _open): + with self.assertRaises(OSError): + shutil.copyfile('srcfile', 'destfile') @unittest.skipIf(MACOS, "skipped on macOS") def test_w_dest_open_fails(self): - srcfile = self.Faux() def _open(filename, mode='r'): @@ -2088,9 +2107,8 @@ class TestCopyFile(unittest.TestCase): raise OSError('Cannot open "destfile"') assert 0 # shouldn't reach here. - self._set_shutil_open(_open) - - shutil.copyfile('srcfile', 'destfile') + with support.swap_attr(shutil, 'open', _open): + shutil.copyfile('srcfile', 'destfile') self.assertTrue(srcfile._entered) self.assertTrue(srcfile._exited_with[0] is OSError) self.assertEqual(srcfile._exited_with[1].args, @@ -2098,7 +2116,6 @@ class TestCopyFile(unittest.TestCase): @unittest.skipIf(MACOS, "skipped on macOS") def test_w_dest_close_fails(self): - srcfile = self.Faux() destfile = self.Faux(True) @@ -2109,9 +2126,8 @@ class TestCopyFile(unittest.TestCase): return destfile assert 0 # shouldn't reach here. - self._set_shutil_open(_open) - - shutil.copyfile('srcfile', 'destfile') + with support.swap_attr(shutil, 'open', _open): + shutil.copyfile('srcfile', 'destfile') self.assertTrue(srcfile._entered) self.assertTrue(destfile._entered) self.assertTrue(destfile._raised) @@ -2132,33 +2148,15 @@ class TestCopyFile(unittest.TestCase): return destfile assert 0 # shouldn't reach here. - self._set_shutil_open(_open) - - self.assertRaises(OSError, - shutil.copyfile, 'srcfile', 'destfile') + with support.swap_attr(shutil, 'open', _open): + with self.assertRaises(OSError): + shutil.copyfile('srcfile', 'destfile') self.assertTrue(srcfile._entered) self.assertTrue(destfile._entered) self.assertFalse(destfile._raised) self.assertTrue(srcfile._exited_with[0] is None) self.assertTrue(srcfile._raised) - def test_move_dir_caseinsensitive(self): - # Renames a folder to the same name - # but a different case. - - self.src_dir = tempfile.mkdtemp() - self.addCleanup(shutil.rmtree, self.src_dir, True) - dst_dir = os.path.join( - os.path.dirname(self.src_dir), - os.path.basename(self.src_dir).upper()) - self.assertNotEqual(self.src_dir, dst_dir) - - try: - shutil.move(self.src_dir, dst_dir) - self.assertTrue(os.path.isdir(dst_dir)) - finally: - os.rmdir(dst_dir) - class TestCopyFileObj(unittest.TestCase): FILESIZE = 2 * 1024 * 1024 @@ -2215,7 +2213,7 @@ class TestCopyFileObj(unittest.TestCase): # If file size < 1 MiB memoryview() length must be equal to # the actual file size. - with tempfile.NamedTemporaryFile(delete=False) as f: + with tempfile.NamedTemporaryFile(dir=os.getcwd(), delete=False) as f: f.write(b'foo') fname = f.name self.addCleanup(support.unlink, fname) @@ -2224,7 +2222,7 @@ class TestCopyFileObj(unittest.TestCase): self.assertEqual(m.call_args[0][2], 3) # Empty files should not rely on readinto() variant. - with tempfile.NamedTemporaryFile(delete=False) as f: + with tempfile.NamedTemporaryFile(dir=os.getcwd(), delete=False) as f: pass fname = f.name self.addCleanup(support.unlink, fname) @@ -2290,7 +2288,7 @@ class _ZeroCopyFileTest(object): self.assertEqual(read_file(TESTFN, binary=True), self.FILEDATA) def test_non_existent_src(self): - name = tempfile.mktemp() + name = tempfile.mktemp(dir=os.getcwd()) with self.assertRaises(FileNotFoundError) as cm: shutil.copyfile(name, "new") self.assertEqual(cm.exception.filename, name) @@ -2461,7 +2459,7 @@ class TestZeroCopyMACOS(_ZeroCopyFileTest, unittest.TestCase): return shutil._fastcopy_fcopyfile(src, dst, posix._COPYFILE_DATA) -class TermsizeTests(unittest.TestCase): +class TestGetTerminalSize(unittest.TestCase): def test_does_not_crash(self): """Check if get_terminal_size() returns a meaningful value. diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index d41e94b0..45553a6a 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -644,7 +644,7 @@ class SiginterruptTest(unittest.TestCase): # wait until the child process is loaded and has started first_line = process.stdout.readline() - stdout, stderr = process.communicate(timeout=5.0) + stdout, stderr = process.communicate(timeout=support.SHORT_TIMEOUT) except subprocess.TimeoutExpired: process.kill() return False @@ -1192,7 +1192,7 @@ class StressTest(unittest.TestCase): self.setsig(signal.SIGALRM, second_handler) # for ITIMER_REAL expected_sigs = 0 - deadline = time.monotonic() + 15.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT while expected_sigs < N: os.kill(os.getpid(), signal.SIGPROF) @@ -1226,7 +1226,7 @@ class StressTest(unittest.TestCase): self.setsig(signal.SIGALRM, handler) # for ITIMER_REAL expected_sigs = 0 - deadline = time.monotonic() + 15.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT while expected_sigs < N: # Hopefully the SIGALRM will be received somewhere during @@ -1273,6 +1273,27 @@ class RaiseSignalTest(unittest.TestCase): self.assertTrue(is_ok) +class PidfdSignalTest(unittest.TestCase): + + @unittest.skipUnless( + hasattr(signal, "pidfd_send_signal"), + "pidfd support not built in", + ) + def test_pidfd_send_signal(self): + with self.assertRaises(OSError) as cm: + signal.pidfd_send_signal(0, signal.SIGINT) + if cm.exception.errno == errno.ENOSYS: + self.skipTest("kernel does not support pidfds") + elif cm.exception.errno == errno.EPERM: + self.skipTest("Not enough privileges to use pidfs") + self.assertEqual(cm.exception.errno, errno.EBADF) + my_pidfd = os.open(f'/proc/{os.getpid()}', os.O_DIRECTORY) + self.addCleanup(os.close, my_pidfd) + with self.assertRaisesRegex(TypeError, "^siginfo must be None$"): + signal.pidfd_send_signal(my_pidfd, signal.SIGINT, object(), 0) + with self.assertRaises(KeyboardInterrupt): + signal.pidfd_send_signal(my_pidfd, signal.SIGINT) + def tearDownModule(): support.reap_children() diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 01008656..923f35ef 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -7,20 +7,21 @@ executing have not been removed. import unittest import test.support from test import support +from test.support import socket_helper from test.support import (captured_stderr, TESTFN, EnvironmentVarGuard, change_cwd) import builtins +import encodings import glob import os -import sys import re -import encodings -import urllib.request -import urllib.error import shutil import subprocess +import sys import sysconfig import tempfile +import urllib.error +import urllib.request from unittest import mock from copy import copy @@ -267,11 +268,18 @@ class HelperFunctionsTests(unittest.TestCase): dirs = site.getsitepackages() if os.sep == '/': # OS X, Linux, FreeBSD, etc - self.assertEqual(len(dirs), 1) + if sys.platlibdir != "lib": + self.assertEqual(len(dirs), 2) + wanted = os.path.join('xoxo', sys.platlibdir, + 'python%d.%d' % sys.version_info[:2], + 'site-packages') + self.assertEqual(dirs[0], wanted) + else: + self.assertEqual(len(dirs), 1) wanted = os.path.join('xoxo', 'lib', 'python%d.%d' % sys.version_info[:2], 'site-packages') - self.assertEqual(dirs[0], wanted) + self.assertEqual(dirs[-1], wanted) else: # other platforms self.assertEqual(len(dirs), 2) @@ -502,7 +510,7 @@ class ImportSideEffectTests(unittest.TestCase): url = license._Printer__data.split()[1] req = urllib.request.Request(url, method='HEAD') try: - with test.support.transient_internet(url): + with socket_helper.transient_internet(url): with urllib.request.urlopen(req) as data: code = data.getcode() except urllib.error.HTTPError as e: diff --git a/Lib/test/test_smtpd.py b/Lib/test/test_smtpd.py index a9f7d5a3..3be77397 100644 --- a/Lib/test/test_smtpd.py +++ b/Lib/test/test_smtpd.py @@ -1,6 +1,7 @@ import unittest import textwrap from test import support, mock_socket +from test.support import socket_helper import socket import io import smtpd @@ -38,7 +39,7 @@ class SMTPDServerTest(unittest.TestCase): smtpd.socket = asyncore.socket = mock_socket def test_process_message_unimplemented(self): - server = smtpd.SMTPServer((support.HOST, 0), ('b', 0), + server = smtpd.SMTPServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, decode_data=True) @@ -57,7 +58,7 @@ class SMTPDServerTest(unittest.TestCase): self.assertRaises( ValueError, smtpd.SMTPServer, - (support.HOST, 0), + (socket_helper.HOST, 0), ('b', 0), enable_SMTPUTF8=True, decode_data=True) @@ -87,7 +88,7 @@ class DebuggingServerTest(unittest.TestCase): write_line(b'.') def test_process_message_with_decode_data_true(self): - server = smtpd.DebuggingServer((support.HOST, 0), ('b', 0), + server = smtpd.DebuggingServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, decode_data=True) @@ -104,7 +105,7 @@ class DebuggingServerTest(unittest.TestCase): """)) def test_process_message_with_decode_data_false(self): - server = smtpd.DebuggingServer((support.HOST, 0), ('b', 0)) + server = smtpd.DebuggingServer((socket_helper.HOST, 0), ('b', 0)) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr) with support.captured_stdout() as s: @@ -120,7 +121,7 @@ class DebuggingServerTest(unittest.TestCase): """)) def test_process_message_with_enable_SMTPUTF8_true(self): - server = smtpd.DebuggingServer((support.HOST, 0), ('b', 0), + server = smtpd.DebuggingServer((socket_helper.HOST, 0), ('b', 0), enable_SMTPUTF8=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, enable_SMTPUTF8=True) @@ -137,7 +138,7 @@ class DebuggingServerTest(unittest.TestCase): """)) def test_process_SMTPUTF8_message_with_enable_SMTPUTF8_true(self): - server = smtpd.DebuggingServer((support.HOST, 0), ('b', 0), + server = smtpd.DebuggingServer((socket_helper.HOST, 0), ('b', 0), enable_SMTPUTF8=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, enable_SMTPUTF8=True) @@ -168,13 +169,13 @@ class TestFamilyDetection(unittest.TestCase): asyncore.close_all() asyncore.socket = smtpd.socket = socket - @unittest.skipUnless(support.IPV6_ENABLED, "IPv6 not enabled") + @unittest.skipUnless(socket_helper.IPV6_ENABLED, "IPv6 not enabled") def test_socket_uses_IPv6(self): - server = smtpd.SMTPServer((support.HOSTv6, 0), (support.HOSTv4, 0)) + server = smtpd.SMTPServer((socket_helper.HOSTv6, 0), (socket_helper.HOSTv4, 0)) self.assertEqual(server.socket.family, socket.AF_INET6) def test_socket_uses_IPv4(self): - server = smtpd.SMTPServer((support.HOSTv4, 0), (support.HOSTv6, 0)) + server = smtpd.SMTPServer((socket_helper.HOSTv4, 0), (socket_helper.HOSTv6, 0)) self.assertEqual(server.socket.family, socket.AF_INET) @@ -197,7 +198,7 @@ class TestRcptOptionParsing(unittest.TestCase): channel.handle_read() def test_params_rejected(self): - server = DummyServer((support.HOST, 0), ('b', 0)) + server = DummyServer((socket_helper.HOST, 0), ('b', 0)) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr) self.write_line(channel, b'EHLO example') @@ -206,7 +207,7 @@ class TestRcptOptionParsing(unittest.TestCase): self.assertEqual(channel.socket.last, self.error_response) def test_nothing_accepted(self): - server = DummyServer((support.HOST, 0), ('b', 0)) + server = DummyServer((socket_helper.HOST, 0), ('b', 0)) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr) self.write_line(channel, b'EHLO example') @@ -234,7 +235,7 @@ class TestMailOptionParsing(unittest.TestCase): channel.handle_read() def test_with_decode_data_true(self): - server = DummyServer((support.HOST, 0), ('b', 0), decode_data=True) + server = DummyServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, decode_data=True) self.write_line(channel, b'EHLO example') @@ -250,7 +251,7 @@ class TestMailOptionParsing(unittest.TestCase): self.assertEqual(channel.socket.last, b'250 OK\r\n') def test_with_decode_data_false(self): - server = DummyServer((support.HOST, 0), ('b', 0)) + server = DummyServer((socket_helper.HOST, 0), ('b', 0)) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr) self.write_line(channel, b'EHLO example') @@ -271,7 +272,7 @@ class TestMailOptionParsing(unittest.TestCase): self.assertEqual(channel.socket.last, b'250 OK\r\n') def test_with_enable_smtputf8_true(self): - server = DummyServer((support.HOST, 0), ('b', 0), enable_SMTPUTF8=True) + server = DummyServer((socket_helper.HOST, 0), ('b', 0), enable_SMTPUTF8=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, enable_SMTPUTF8=True) self.write_line(channel, b'EHLO example') @@ -286,7 +287,7 @@ class SMTPDChannelTest(unittest.TestCase): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOST, 0), ('b', 0), + self.server = DummyServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = self.server.accept() self.channel = smtpd.SMTPChannel(self.server, conn, addr, @@ -304,7 +305,7 @@ class SMTPDChannelTest(unittest.TestCase): def test_broken_connect(self): self.assertRaises( DummyDispatcherBroken, BrokenDummyServer, - (support.HOST, 0), ('b', 0), decode_data=True) + (socket_helper.HOST, 0), ('b', 0), decode_data=True) def test_decode_data_and_enable_SMTPUTF8_raises(self): self.assertRaises( @@ -758,13 +759,13 @@ class SMTPDChannelTest(unittest.TestCase): with support.check_warnings(('', DeprecationWarning)): self.channel._SMTPChannel__addr = 'spam' -@unittest.skipUnless(support.IPV6_ENABLED, "IPv6 not enabled") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, "IPv6 not enabled") class SMTPDChannelIPv6Test(SMTPDChannelTest): def setUp(self): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOSTv6, 0), ('b', 0), + self.server = DummyServer((socket_helper.HOSTv6, 0), ('b', 0), decode_data=True) conn, addr = self.server.accept() self.channel = smtpd.SMTPChannel(self.server, conn, addr, @@ -776,7 +777,7 @@ class SMTPDChannelWithDataSizeLimitTest(unittest.TestCase): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOST, 0), ('b', 0), + self.server = DummyServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = self.server.accept() # Set DATA size limit to 32 bytes for easy testing @@ -831,7 +832,7 @@ class SMTPDChannelWithDecodeDataFalse(unittest.TestCase): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOST, 0), ('b', 0)) + self.server = DummyServer((socket_helper.HOST, 0), ('b', 0)) conn, addr = self.server.accept() self.channel = smtpd.SMTPChannel(self.server, conn, addr) @@ -873,7 +874,7 @@ class SMTPDChannelWithDecodeDataTrue(unittest.TestCase): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOST, 0), ('b', 0), + self.server = DummyServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = self.server.accept() # Set decode_data to True @@ -916,7 +917,7 @@ class SMTPDChannelTestWithEnableSMTPUTF8True(unittest.TestCase): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOST, 0), ('b', 0), + self.server = DummyServer((socket_helper.HOST, 0), ('b', 0), enable_SMTPUTF8=True) conn, addr = self.server.accept() self.channel = smtpd.SMTPChannel(self.server, conn, addr, diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py index d0c9862e..57629990 100644 --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -20,11 +20,12 @@ import threading import unittest from test import support, mock_socket -from test.support import HOST +from test.support import hashlib_helper +from test.support import socket_helper from test.support import threading_setup, threading_cleanup, join_thread -from test.support import requires_hashdigest from unittest.mock import Mock +HOST = socket_helper.HOST if sys.platform == 'darwin': # select.poll returns a select.POLLHUP at the end of the tests @@ -56,7 +57,7 @@ def server(evt, buf, serv): serv.close() evt.set() -class GeneralTests(unittest.TestCase): +class GeneralTests: def setUp(self): smtplib.socket = mock_socket @@ -75,29 +76,29 @@ class GeneralTests(unittest.TestCase): def testBasic1(self): mock_socket.reply_with(b"220 Hola mundo") # connects - smtp = smtplib.SMTP(HOST, self.port) - smtp.close() + client = self.client(HOST, self.port) + client.close() def testSourceAddress(self): mock_socket.reply_with(b"220 Hola mundo") # connects - smtp = smtplib.SMTP(HOST, self.port, - source_address=('127.0.0.1',19876)) - self.assertEqual(smtp.source_address, ('127.0.0.1', 19876)) - smtp.close() + client = self.client(HOST, self.port, + source_address=('127.0.0.1',19876)) + self.assertEqual(client.source_address, ('127.0.0.1', 19876)) + client.close() def testBasic2(self): mock_socket.reply_with(b"220 Hola mundo") # connects, include port in host name - smtp = smtplib.SMTP("%s:%s" % (HOST, self.port)) - smtp.close() + client = self.client("%s:%s" % (HOST, self.port)) + client.close() def testLocalHostName(self): mock_socket.reply_with(b"220 Hola mundo") # check that supplied local_hostname is used - smtp = smtplib.SMTP(HOST, self.port, local_hostname="testhost") - self.assertEqual(smtp.local_hostname, "testhost") - smtp.close() + client = self.client(HOST, self.port, local_hostname="testhost") + self.assertEqual(client.local_hostname, "testhost") + client.close() def testTimeoutDefault(self): mock_socket.reply_with(b"220 Hola mundo") @@ -105,51 +106,71 @@ class GeneralTests(unittest.TestCase): mock_socket.setdefaulttimeout(30) self.assertEqual(mock_socket.getdefaulttimeout(), 30) try: - smtp = smtplib.SMTP(HOST, self.port) + client = self.client(HOST, self.port) finally: mock_socket.setdefaulttimeout(None) - self.assertEqual(smtp.sock.gettimeout(), 30) - smtp.close() + self.assertEqual(client.sock.gettimeout(), 30) + client.close() def testTimeoutNone(self): mock_socket.reply_with(b"220 Hola mundo") self.assertIsNone(socket.getdefaulttimeout()) socket.setdefaulttimeout(30) try: - smtp = smtplib.SMTP(HOST, self.port, timeout=None) + client = self.client(HOST, self.port, timeout=None) finally: socket.setdefaulttimeout(None) - self.assertIsNone(smtp.sock.gettimeout()) - smtp.close() + self.assertIsNone(client.sock.gettimeout()) + client.close() + + def testTimeoutZero(self): + mock_socket.reply_with(b"220 Hola mundo") + with self.assertRaises(ValueError): + self.client(HOST, self.port, timeout=0) def testTimeoutValue(self): mock_socket.reply_with(b"220 Hola mundo") - smtp = smtplib.SMTP(HOST, self.port, timeout=30) - self.assertEqual(smtp.sock.gettimeout(), 30) - smtp.close() + client = self.client(HOST, self.port, timeout=30) + self.assertEqual(client.sock.gettimeout(), 30) + client.close() def test_debuglevel(self): mock_socket.reply_with(b"220 Hello world") - smtp = smtplib.SMTP() - smtp.set_debuglevel(1) + client = self.client() + client.set_debuglevel(1) with support.captured_stderr() as stderr: - smtp.connect(HOST, self.port) - smtp.close() + client.connect(HOST, self.port) + client.close() expected = re.compile(r"^connect:", re.MULTILINE) self.assertRegex(stderr.getvalue(), expected) def test_debuglevel_2(self): mock_socket.reply_with(b"220 Hello world") - smtp = smtplib.SMTP() - smtp.set_debuglevel(2) + client = self.client() + client.set_debuglevel(2) with support.captured_stderr() as stderr: - smtp.connect(HOST, self.port) - smtp.close() + client.connect(HOST, self.port) + client.close() expected = re.compile(r"^\d{2}:\d{2}:\d{2}\.\d{6} connect: ", re.MULTILINE) self.assertRegex(stderr.getvalue(), expected) +class SMTPGeneralTests(GeneralTests, unittest.TestCase): + + client = smtplib.SMTP + + +class LMTPGeneralTests(GeneralTests, unittest.TestCase): + + client = smtplib.LMTP + + def testTimeoutZero(self): + super().testTimeoutZero() + local_host = '/some/local/lmtp/delivery/program' + with self.assertRaises(ValueError): + self.client(local_host, timeout=0) + # Test server thread using the specified SMTP server class def debugging_server(serv, serv_evt, client_evt): serv_evt.set() @@ -245,15 +266,17 @@ class DebuggingServerTests(unittest.TestCase): def testBasic(self): # connect - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.quit() def testSourceAddress(self): # connect - src_port = support.find_unused_port() + src_port = socket_helper.find_unused_port() try: smtp = smtplib.SMTP(self.host, self.port, local_hostname='localhost', - timeout=3, source_address=(self.host, src_port)) + timeout=support.LOOPBACK_TIMEOUT, + source_address=(self.host, src_port)) self.addCleanup(smtp.close) self.assertEqual(smtp.source_address, (self.host, src_port)) self.assertEqual(smtp.local_hostname, 'localhost') @@ -264,14 +287,16 @@ class DebuggingServerTests(unittest.TestCase): raise def testNOOP(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) expected = (250, b'OK') self.assertEqual(smtp.noop(), expected) smtp.quit() def testRSET(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) expected = (250, b'OK') self.assertEqual(smtp.rset(), expected) @@ -279,7 +304,8 @@ class DebuggingServerTests(unittest.TestCase): def testELHO(self): # EHLO isn't implemented in DebuggingServer - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) expected = (250, b'\nSIZE 33554432\nHELP') self.assertEqual(smtp.ehlo(), expected) @@ -287,7 +313,8 @@ class DebuggingServerTests(unittest.TestCase): def testEXPNNotImplemented(self): # EXPN isn't implemented in DebuggingServer - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) expected = (502, b'EXPN not implemented') smtp.putcmd('EXPN') @@ -295,7 +322,8 @@ class DebuggingServerTests(unittest.TestCase): smtp.quit() def testVRFY(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) expected = (252, b'Cannot VRFY user, but will accept message ' + \ b'and attempt delivery') @@ -306,7 +334,8 @@ class DebuggingServerTests(unittest.TestCase): def testSecondHELO(self): # check that a second HELO returns a message that it's a duplicate # (this behavior is specific to smtpd.SMTPChannel) - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.helo() expected = (503, b'Duplicate HELO/EHLO') @@ -314,7 +343,8 @@ class DebuggingServerTests(unittest.TestCase): smtp.quit() def testHELP(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) self.assertEqual(smtp.help(), b'Supported commands: EHLO HELO MAIL ' + \ b'RCPT DATA RSET NOOP QUIT VRFY') @@ -323,7 +353,8 @@ class DebuggingServerTests(unittest.TestCase): def testSend(self): # connect and send mail m = 'A test message' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.sendmail('John', 'Sally', m) # XXX(nnorwitz): this test is flaky and dies with a bad file descriptor @@ -340,7 +371,8 @@ class DebuggingServerTests(unittest.TestCase): def testSendBinary(self): m = b'A test message' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.sendmail('John', 'Sally', m) # XXX (see comment in testSend) @@ -356,7 +388,8 @@ class DebuggingServerTests(unittest.TestCase): def testSendNeedingDotQuote(self): # Issue 12283 m = '.A test\n.mes.sage.' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.sendmail('John', 'Sally', m) # XXX (see comment in testSend) @@ -371,7 +404,8 @@ class DebuggingServerTests(unittest.TestCase): def testSendNullSender(self): m = 'A test message' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.sendmail('<>', 'Sally', m) # XXX (see comment in testSend) @@ -389,7 +423,8 @@ class DebuggingServerTests(unittest.TestCase): def testSendMessage(self): m = email.mime.text.MIMEText('A test message') - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m, from_addr='John', to_addrs='Sally') # XXX (see comment in testSend) @@ -414,7 +449,8 @@ class DebuggingServerTests(unittest.TestCase): m['To'] = 'John' m['CC'] = 'Sally, Fred' m['Bcc'] = 'John Root , "Dinsdale" ' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m) # XXX (see comment in testSend) @@ -448,7 +484,8 @@ class DebuggingServerTests(unittest.TestCase): m = email.mime.text.MIMEText('A test message') m['From'] = 'foo@bar.com' m['To'] = 'John, Dinsdale' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m) # XXX (see comment in testSend) @@ -476,7 +513,8 @@ class DebuggingServerTests(unittest.TestCase): m = email.mime.text.MIMEText('A test message') m['From'] = 'foo@bar.com' m['To'] = 'John, Dinsdale' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m, from_addr='joe@example.com', to_addrs='foo@example.net') # XXX (see comment in testSend) @@ -507,7 +545,8 @@ class DebuggingServerTests(unittest.TestCase): m['From'] = 'Bernard, Bianca' m['Sender'] = 'the_rescuers@Rescue-Aid-Society.com' m['To'] = 'John, Dinsdale' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m) # XXX (see comment in testSend) @@ -540,7 +579,8 @@ class DebuggingServerTests(unittest.TestCase): m['Resent-From'] = 'holy@grail.net' m['Resent-To'] = 'Martha , Jeff' m['Resent-Bcc'] = 'doe@losthope.net' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m) # XXX (see comment in testSend) @@ -579,7 +619,8 @@ class DebuggingServerTests(unittest.TestCase): m['Resent-Date'] = 'Thu, 2 Jan 1970 17:42:00 +0000' m['Resent-To'] = 'holy@grail.net' m['Resent-From'] = 'Martha , Jeff' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) with self.assertRaises(ValueError): smtp.send_message(m) @@ -671,7 +712,7 @@ class TooLongLineTests(unittest.TestCase): self.evt = threading.Event() self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(15) - self.port = support.bind_port(self.sock) + self.port = socket_helper.bind_port(self.sock) servargs = (self.evt, self.respdata, self.sock) self.thread = threading.Thread(target=server, args=servargs) self.thread.start() @@ -944,11 +985,13 @@ class SMTPSimTests(unittest.TestCase): def testBasic(self): # smoke test - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.quit() def testEHLO(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) # no features should be present before the EHLO self.assertEqual(smtp.esmtp_features, {}) @@ -969,7 +1012,8 @@ class SMTPSimTests(unittest.TestCase): smtp.quit() def testVRFY(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) for addr_spec, name in sim_users.items(): expected_known = (250, bytes('%s %s' % @@ -983,7 +1027,8 @@ class SMTPSimTests(unittest.TestCase): smtp.quit() def testEXPN(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) for listname, members in sim_lists.items(): users = [] @@ -999,30 +1044,35 @@ class SMTPSimTests(unittest.TestCase): def testAUTH_PLAIN(self): self.serv.add_feature("AUTH PLAIN") - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) resp = smtp.login(sim_auth[0], sim_auth[1]) self.assertEqual(resp, (235, b'Authentication Succeeded')) smtp.close() def testAUTH_LOGIN(self): self.serv.add_feature("AUTH LOGIN") - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) resp = smtp.login(sim_auth[0], sim_auth[1]) self.assertEqual(resp, (235, b'Authentication Succeeded')) smtp.close() - @requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def testAUTH_CRAM_MD5(self): self.serv.add_feature("AUTH CRAM-MD5") - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) resp = smtp.login(sim_auth[0], sim_auth[1]) self.assertEqual(resp, (235, b'Authentication Succeeded')) smtp.close() + @hashlib_helper.requires_hashdigest('md5') def testAUTH_multiple(self): # Test that multiple authentication methods are tried. self.serv.add_feature("AUTH BOGUS PLAIN LOGIN CRAM-MD5") - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) resp = smtp.login(sim_auth[0], sim_auth[1]) self.assertEqual(resp, (235, b'Authentication Succeeded')) smtp.close() @@ -1040,7 +1090,8 @@ class SMTPSimTests(unittest.TestCase): for mechanism in supported: with self.subTest(mechanism=mechanism): smtp = smtplib.SMTP(HOST, self.port, - local_hostname='localhost', timeout=15) + local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.ehlo('foo') smtp.user, smtp.password = sim_auth[0], sim_auth[1] method = 'auth_' + mechanism.lower().replace('-', '_') @@ -1051,7 +1102,7 @@ class SMTPSimTests(unittest.TestCase): def test_quit_resets_greeting(self): smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', - timeout=15) + timeout=support.LOOPBACK_TIMEOUT) code, message = smtp.ehlo() self.assertEqual(code, 250) self.assertIn('size', smtp.esmtp_features) @@ -1085,7 +1136,8 @@ class SMTPSimTests(unittest.TestCase): # Issue 17498: make sure _rset does not raise SMTPServerDisconnected exception def test__rest_from_mail_cmd(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.noop() self.serv._SMTPchannel.mail_response = '451 Requested action aborted' self.serv._SMTPchannel.disconnect = True @@ -1095,7 +1147,8 @@ class SMTPSimTests(unittest.TestCase): # Issue 5713: make sure close, not rset, is called if we get a 421 error def test_421_from_mail_cmd(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.noop() self.serv._SMTPchannel.mail_response = '421 closing connection' with self.assertRaises(smtplib.SMTPSenderRefused): @@ -1104,7 +1157,8 @@ class SMTPSimTests(unittest.TestCase): self.assertEqual(self.serv._SMTPchannel.rset_count, 0) def test_421_from_rcpt_cmd(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.noop() self.serv._SMTPchannel.rcpt_response = ['250 accepted', '421 closing'] with self.assertRaises(smtplib.SMTPRecipientsRefused) as r: @@ -1121,7 +1175,8 @@ class SMTPSimTests(unittest.TestCase): else: super().found_terminator() self.serv.channel_class = MySimSMTPChannel - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.noop() with self.assertRaises(smtplib.SMTPDataError): smtp.sendmail('John@foo.org', ['Sally@foo.org'], 'test message') @@ -1130,7 +1185,8 @@ class SMTPSimTests(unittest.TestCase): def test_smtputf8_NotSupportedError_if_no_server_support(self): smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.ehlo() self.assertTrue(smtp.does_esmtp) @@ -1145,7 +1201,8 @@ class SMTPSimTests(unittest.TestCase): def test_send_unicode_without_SMTPUTF8(self): smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) self.assertRaises(UnicodeEncodeError, smtp.sendmail, 'Alice', 'Böb', '') self.assertRaises(UnicodeEncodeError, smtp.mail, 'Älice') @@ -1158,15 +1215,16 @@ class SMTPSimTests(unittest.TestCase): msg['To'] = 'Dinsdale' msg['Subject'] = 'Nudge nudge, wink, wink \u1F609' smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) with self.assertRaises(smtplib.SMTPNotSupportedError): smtp.send_message(msg) def test_name_field_not_included_in_envelop_addresses(self): smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3 - ) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) message = EmailMessage() @@ -1242,7 +1300,8 @@ class SMTPUTF8SimTests(unittest.TestCase): def test_test_server_supports_extensions(self): smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.ehlo() self.assertTrue(smtp.does_esmtp) @@ -1251,7 +1310,8 @@ class SMTPUTF8SimTests(unittest.TestCase): def test_send_unicode_with_SMTPUTF8_via_sendmail(self): m = '¡a test message containing unicode!'.encode('utf-8') smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.sendmail('Jőhn', 'Sálly', m, mail_options=['BODY=8BITMIME', 'SMTPUTF8']) @@ -1265,7 +1325,8 @@ class SMTPUTF8SimTests(unittest.TestCase): def test_send_unicode_with_SMTPUTF8_via_low_level_API(self): m = '¡a test message containing unicode!'.encode('utf-8') smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.ehlo() self.assertEqual( @@ -1301,7 +1362,8 @@ class SMTPUTF8SimTests(unittest.TestCase): oh là là, know what I mean, know what I mean? """) smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) self.assertEqual(smtp.send_message(msg), {}) self.assertEqual(self.serv.last_mailfrom, 'főo@bar.com') @@ -1366,15 +1428,15 @@ class SMTPAUTHInitialResponseSimTests(unittest.TestCase): def testAUTH_PLAIN_initial_response_login(self): self.serv.add_feature('AUTH PLAIN') - smtp = smtplib.SMTP(HOST, self.port, - local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.login('psu', 'doesnotexist') smtp.close() def testAUTH_PLAIN_initial_response_auth(self): self.serv.add_feature('AUTH PLAIN') - smtp = smtplib.SMTP(HOST, self.port, - local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.user = 'psu' smtp.password = 'doesnotexist' code, response = smtp.auth('plain', smtp.auth_plain) diff --git a/Lib/test/test_smtpnet.py b/Lib/test/test_smtpnet.py index b69cd9de..74a00a9d 100644 --- a/Lib/test/test_smtpnet.py +++ b/Lib/test/test_smtpnet.py @@ -1,5 +1,6 @@ import unittest from test import support +from test.support import socket_helper import smtplib import socket @@ -28,7 +29,7 @@ class SmtpTest(unittest.TestCase): context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) context.check_hostname = False context.verify_mode = ssl.CERT_NONE - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): server = smtplib.SMTP(self.testServer, self.remotePort) try: server.starttls(context=context) @@ -47,14 +48,14 @@ class SmtpSSLTest(unittest.TestCase): def test_connect(self): support.get_attribute(smtplib, 'SMTP_SSL') - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): server = smtplib.SMTP_SSL(self.testServer, self.remotePort) server.ehlo() server.quit() def test_connect_default_port(self): support.get_attribute(smtplib, 'SMTP_SSL') - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): server = smtplib.SMTP_SSL(self.testServer) server.ehlo() server.quit() @@ -64,20 +65,20 @@ class SmtpSSLTest(unittest.TestCase): context.check_hostname = False context.verify_mode = ssl.CERT_NONE support.get_attribute(smtplib, 'SMTP_SSL') - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context) server.ehlo() server.quit() def test_connect_using_sslcontext_verified(self): - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): can_verify = check_ssl_verifiy(self.testServer, self.remotePort) if not can_verify: self.skipTest("SSL certificate can't be verified") support.get_attribute(smtplib, 'SMTP_SSL') context = ssl.create_default_context() - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context) server.ehlo() server.quit() diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py old mode 100644 new mode 100755 index f9370d8e..aefba4f3 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -1,5 +1,6 @@ import unittest from test import support +from test.support import socket_helper import errno import io @@ -34,10 +35,9 @@ try: except ImportError: fcntl = None -HOST = support.HOST +HOST = socket_helper.HOST # test unicode string and carriage return MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') -MAIN_TIMEOUT = 60.0 VSOCKPORT = 1234 AIX = platform.system() == "AIX" @@ -80,6 +80,16 @@ def _have_socket_can_isotp(): s.close() return True +def _have_socket_can_j1939(): + """Check whether CAN J1939 sockets are supported on this host.""" + try: + s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) + except (AttributeError, OSError): + return False + else: + s.close() + return True + def _have_socket_rds(): """Check whether RDS sockets are supported on this host.""" try: @@ -116,6 +126,19 @@ def _have_socket_vsock(): return ret +def _have_socket_bluetooth(): + """Check whether AF_BLUETOOTH sockets are supported on this host.""" + try: + # RFCOMM is supported by all platforms with bluetooth support. Windows + # does not support omitting the protocol. + s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) + except (AttributeError, OSError): + return False + else: + s.close() + return True + + @contextlib.contextmanager def socket_setdefaulttimeout(timeout): old_timeout = socket.getdefaulttimeout() @@ -130,6 +153,8 @@ HAVE_SOCKET_CAN = _have_socket_can() HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp() +HAVE_SOCKET_CAN_J1939 = _have_socket_can_j1939() + HAVE_SOCKET_RDS = _have_socket_rds() HAVE_SOCKET_ALG = _have_socket_alg() @@ -138,6 +163,10 @@ HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr() HAVE_SOCKET_VSOCK = _have_socket_vsock() +HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE") + +HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth() + # Size in bytes of the int type SIZEOF_INT = array.array("i").itemsize @@ -145,7 +174,7 @@ class SocketTCPTest(unittest.TestCase): def setUp(self): self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.port = support.bind_port(self.serv) + self.port = socket_helper.bind_port(self.serv) self.serv.listen() def tearDown(self): @@ -156,12 +185,18 @@ class SocketUDPTest(unittest.TestCase): def setUp(self): self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - self.port = support.bind_port(self.serv) + self.port = socket_helper.bind_port(self.serv) def tearDown(self): self.serv.close() self.serv = None +class SocketUDPLITETest(SocketUDPTest): + + def setUp(self): + self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE) + self.port = socket_helper.bind_port(self.serv) + class ThreadSafeCleanupTestCase(unittest.TestCase): """Subclass of unittest.TestCase with thread-safe cleanup methods. @@ -243,7 +278,7 @@ class SocketRDSTest(unittest.TestCase): self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) self.addCleanup(self.serv.close) try: - self.port = support.bind_port(self.serv) + self.port = socket_helper.bind_port(self.serv) except OSError: self.skipTest('unable to bind RDS socket') @@ -393,6 +428,22 @@ class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest): self.cli = None ThreadableTest.clientTearDown(self) +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest): + + def __init__(self, methodName='runTest'): + SocketUDPLITETest.__init__(self, methodName=methodName) + ThreadableTest.__init__(self) + + def clientSetUp(self): + self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE) + + def clientTearDown(self): + self.cli.close() + self.cli = None + ThreadableTest.clientTearDown(self) + class ThreadedCANSocketTest(SocketCANTest, ThreadableTest): def __init__(self, methodName='runTest'): @@ -644,7 +695,7 @@ class UnixSocketTestBase(SocketTestBase): def bindSock(self, sock): path = tempfile.mktemp(dir=self.dir_path) - support.bind_unix_socket(sock, path) + socket_helper.bind_unix_socket(sock, path) self.addCleanup(support.unlink, path) class UnixStreamBase(UnixSocketTestBase): @@ -664,7 +715,7 @@ class InetTestBase(SocketTestBase): self.port = self.serv_addr[1] def bindSock(self, sock): - support.bind_port(sock, host=self.host) + socket_helper.bind_port(sock, host=self.host) class TCPTestBase(InetTestBase): """Base class for TCP-over-IPv4 tests.""" @@ -678,6 +729,12 @@ class UDPTestBase(InetTestBase): def newSocket(self): return socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +class UDPLITETestBase(InetTestBase): + """Base class for UDPLITE-over-IPv4 tests.""" + + def newSocket(self): + return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE) + class SCTPStreamBase(InetTestBase): """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode.""" @@ -689,7 +746,7 @@ class SCTPStreamBase(InetTestBase): class Inet6TestBase(InetTestBase): """Base class for IPv6 socket tests.""" - host = support.HOSTv6 + host = socket_helper.HOSTv6 class UDP6TestBase(Inet6TestBase): """Base class for UDP-over-IPv6 tests.""" @@ -697,6 +754,12 @@ class UDP6TestBase(Inet6TestBase): def newSocket(self): return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) +class UDPLITE6TestBase(Inet6TestBase): + """Base class for UDPLITE-over-IPv6 tests.""" + + def newSocket(self): + return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE) + # Test-skipping decorators for use with ThreadableTest. @@ -896,6 +959,37 @@ class GeneralModuleTests(unittest.TestCase): socket.IPPROTO_L2TP socket.IPPROTO_SCTP + @unittest.skipUnless(sys.platform == 'darwin', 'macOS specific test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') + def test3542SocketOptions(self): + # Ref. issue #35569 and https://tools.ietf.org/html/rfc3542 + opts = { + 'IPV6_CHECKSUM', + 'IPV6_DONTFRAG', + 'IPV6_DSTOPTS', + 'IPV6_HOPLIMIT', + 'IPV6_HOPOPTS', + 'IPV6_NEXTHOP', + 'IPV6_PATHMTU', + 'IPV6_PKTINFO', + 'IPV6_RECVDSTOPTS', + 'IPV6_RECVHOPLIMIT', + 'IPV6_RECVHOPOPTS', + 'IPV6_RECVPATHMTU', + 'IPV6_RECVPKTINFO', + 'IPV6_RECVRTHDR', + 'IPV6_RECVTCLASS', + 'IPV6_RTHDR', + 'IPV6_RTHDRDSTOPTS', + 'IPV6_RTHDR_TYPE_0', + 'IPV6_TCLASS', + 'IPV6_USE_MIN_MTU', + } + for opt in opts: + self.assertTrue( + hasattr(socket, opt), f"Missing RFC3542 socket option '{opt}'" + ) + def testHostnameRes(self): # Testing hostname resolution mechanisms hostname = socket.gethostname() @@ -916,12 +1010,12 @@ class GeneralModuleTests(unittest.TestCase): self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names))) def test_host_resolution(self): - for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']: + for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']: self.assertEqual(socket.gethostbyname(addr), addr) - # we don't test support.HOSTv6 because there's a chance it doesn't have + # we don't test socket_helper.HOSTv6 because there's a chance it doesn't have # a matching name entry (e.g. 'ip6-localhost') - for host in [support.HOSTv4]: + for host in [socket_helper.HOSTv4]: self.assertIn(host, socket.gethostbyaddr(host)[2]) def test_host_resolution_bad_address(self): @@ -1284,7 +1378,7 @@ class GeneralModuleTests(unittest.TestCase): def testSockName(self): # Testing getsockname() - port = support.find_unused_port() + port = socket_helper.find_unused_port() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.addCleanup(sock.close) sock.bind(("0.0.0.0", port)) @@ -1350,7 +1444,7 @@ class GeneralModuleTests(unittest.TestCase): def test_getsockaddrarg(self): sock = socket.socket() self.addCleanup(sock.close) - port = support.find_unused_port() + port = socket_helper.find_unused_port() big_port = port + 65536 neg_port = port - 65536 self.assertRaises(OverflowError, sock.bind, (HOST, big_port)) @@ -1358,7 +1452,7 @@ class GeneralModuleTests(unittest.TestCase): # Since find_unused_port() is inherently subject to race conditions, we # call it a couple times if necessary. for i in itertools.count(): - port = support.find_unused_port() + port = socket_helper.find_unused_port() try: sock.bind((HOST, port)) except OSError as e: @@ -1411,7 +1505,7 @@ class GeneralModuleTests(unittest.TestCase): socket.getaddrinfo('localhost', 80) socket.getaddrinfo('127.0.0.1', 80) socket.getaddrinfo(None, 80) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: socket.getaddrinfo('::1', 80) # port can be a string service name such as "http", a numeric # port number or None @@ -1482,7 +1576,7 @@ class GeneralModuleTests(unittest.TestCase): def test_idna(self): # Check for internet access before running test # (issue #12804, issue #25138). - with support.transient_internet('python.org'): + with socket_helper.transient_internet('python.org'): socket.gethostbyname('python.org') # these should all be successful @@ -1624,14 +1718,14 @@ class GeneralModuleTests(unittest.TestCase): srv.bind((HOST, 0)) self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') def test_flowinfo(self): self.assertRaises(OverflowError, socket.getnameinfo, - (support.HOSTv6, 0, 0xffffffff), 0) + (socket_helper.HOSTv6, 0, 0xffffffff), 0) with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s: - self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10)) + self.assertRaises(OverflowError, s.bind, (socket_helper.HOSTv6, 0, -10)) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') def test_getaddrinfo_ipv6_basic(self): ((*_, sockaddr),) = socket.getaddrinfo( 'ff02::1de:c0:face:8D', # Note capital letter `D`. @@ -1641,7 +1735,7 @@ class GeneralModuleTests(unittest.TestCase): ) self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0)) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows') @unittest.skipIf(AIX, 'Symbolic scope id does not work') def test_getaddrinfo_ipv6_scopeid_symbolic(self): @@ -1656,7 +1750,7 @@ class GeneralModuleTests(unittest.TestCase): # Note missing interface name part in IPv6 address self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex)) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @unittest.skipUnless( sys.platform == 'win32', 'Numeric scope id does not work or undocumented') @@ -1673,7 +1767,7 @@ class GeneralModuleTests(unittest.TestCase): # Note missing interface name part in IPv6 address self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex)) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows') @unittest.skipIf(AIX, 'Symbolic scope id does not work') def test_getnameinfo_ipv6_scopeid_symbolic(self): @@ -1683,7 +1777,7 @@ class GeneralModuleTests(unittest.TestCase): nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV) self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234')) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @unittest.skipUnless( sys.platform == 'win32', 'Numeric scope id does not work or undocumented') def test_getnameinfo_ipv6_scopeid_numeric(self): @@ -1776,19 +1870,19 @@ class GeneralModuleTests(unittest.TestCase): def test_socket_fileno(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.addCleanup(s.close) - s.bind((support.HOST, 0)) + s.bind((socket_helper.HOST, 0)) self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM) if hasattr(socket, "SOCK_DGRAM"): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.addCleanup(s.close) - s.bind((support.HOST, 0)) + s.bind((socket_helper.HOST, 0)) self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) self.addCleanup(s.close) - s.bind((support.HOSTv6, 0, 0, 0)) + s.bind((socket_helper.HOSTv6, 0, 0, 0)) self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM) if hasattr(socket, "AF_UNIX"): @@ -2066,6 +2160,68 @@ class ISOTPTest(unittest.TestCase): raise +@unittest.skipUnless(HAVE_SOCKET_CAN_J1939, 'CAN J1939 required for this test.') +class J1939Test(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.interface = "vcan0" + + @unittest.skipUnless(hasattr(socket, "CAN_J1939"), + 'socket.CAN_J1939 required for this test.') + def testJ1939Constants(self): + socket.CAN_J1939 + + socket.J1939_MAX_UNICAST_ADDR + socket.J1939_IDLE_ADDR + socket.J1939_NO_ADDR + socket.J1939_NO_NAME + socket.J1939_PGN_REQUEST + socket.J1939_PGN_ADDRESS_CLAIMED + socket.J1939_PGN_ADDRESS_COMMANDED + socket.J1939_PGN_PDU1_MAX + socket.J1939_PGN_MAX + socket.J1939_NO_PGN + + # J1939 socket options + socket.SO_J1939_FILTER + socket.SO_J1939_PROMISC + socket.SO_J1939_SEND_PRIO + socket.SO_J1939_ERRQUEUE + + socket.SCM_J1939_DEST_ADDR + socket.SCM_J1939_DEST_NAME + socket.SCM_J1939_PRIO + socket.SCM_J1939_ERRQUEUE + + socket.J1939_NLA_PAD + socket.J1939_NLA_BYTES_ACKED + + socket.J1939_EE_INFO_NONE + socket.J1939_EE_INFO_TX_ABORT + + socket.J1939_FILTER_MAX + + @unittest.skipUnless(hasattr(socket, "CAN_J1939"), + 'socket.CAN_J1939 required for this test.') + def testCreateJ1939Socket(self): + with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s: + pass + + def testBind(self): + try: + with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s: + addr = self.interface, socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR + s.bind(addr) + self.assertEqual(s.getsockname(), addr) + except OSError as e: + if e.errno == errno.ENODEV: + self.skipTest('network interface `%s` does not exist' % + self.interface) + else: + raise + + @unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.') class BasicRDSTest(unittest.TestCase): @@ -2164,12 +2320,12 @@ class BasicQIPCRTRTest(unittest.TestCase): def testBindSock(self): with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s: - support.bind_port(s, host=s.getsockname()[0]) + socket_helper.bind_port(s, host=s.getsockname()[0]) self.assertNotEqual(s.getsockname()[1], 0) def testInvalidBindSock(self): with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s: - self.assertRaises(OSError, support.bind_port, s, host=-2) + self.assertRaises(OSError, socket_helper.bind_port, s, host=-2) def testAutoBindSock(self): with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s: @@ -2225,6 +2381,45 @@ class BasicVSOCKTest(unittest.TestCase): socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)) +@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH, + 'Bluetooth sockets required for this test.') +class BasicBluetoothTest(unittest.TestCase): + + def testBluetoothConstants(self): + socket.BDADDR_ANY + socket.BDADDR_LOCAL + socket.AF_BLUETOOTH + socket.BTPROTO_RFCOMM + + if sys.platform != "win32": + socket.BTPROTO_HCI + socket.SOL_HCI + socket.BTPROTO_L2CAP + + if not sys.platform.startswith("freebsd"): + socket.BTPROTO_SCO + + def testCreateRfcommSocket(self): + with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s: + pass + + @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets") + def testCreateL2capSocket(self): + with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s: + pass + + @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets") + def testCreateHciSocket(self): + with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s: + pass + + @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"), + "windows and freebsd do not support SCO sockets") + def testCreateScoSocket(self): + with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s: + pass + + class BasicTCPTest(SocketConnectedTest): def __init__(self, methodName='runTest'): @@ -2376,6 +2571,37 @@ class BasicUDPTest(ThreadedUDPSocketTest): def _testRecvFromNegative(self): self.cli.sendto(MSG, 0, (HOST, self.port)) + +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +class BasicUDPLITETest(ThreadedUDPLITESocketTest): + + def __init__(self, methodName='runTest'): + ThreadedUDPLITESocketTest.__init__(self, methodName=methodName) + + def testSendtoAndRecv(self): + # Testing sendto() and Recv() over UDPLITE + msg = self.serv.recv(len(MSG)) + self.assertEqual(msg, MSG) + + def _testSendtoAndRecv(self): + self.cli.sendto(MSG, 0, (HOST, self.port)) + + def testRecvFrom(self): + # Testing recvfrom() over UDPLITE + msg, addr = self.serv.recvfrom(len(MSG)) + self.assertEqual(msg, MSG) + + def _testRecvFrom(self): + self.cli.sendto(MSG, 0, (HOST, self.port)) + + def testRecvFromNegative(self): + # Negative lengths passed to recvfrom should give ValueError. + self.assertRaises(ValueError, self.serv.recvfrom, -1) + + def _testRecvFromNegative(self): + self.cli.sendto(MSG, 0, (HOST, self.port)) + # Tests for the sendmsg()/recvmsg() interface. Where possible, the # same test code is used with different families and types of socket # (e.g. stream, datagram), and tests using recvmsg() are repeated @@ -2408,7 +2634,7 @@ class SendrecvmsgBase(ThreadSafeCleanupTestCase): # Time in seconds to wait before considering a test failed, or # None for no timeout. Not all tests actually set a timeout. - fail_timeout = 3.0 + fail_timeout = support.LOOPBACK_TIMEOUT def setUp(self): self.misc_event = threading.Event() @@ -3974,25 +4200,25 @@ class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase, self.assertEqual(addr1[:-1], addr2[:-1]) @requireAttrs(socket.socket, "sendmsg") -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @requireSocket("AF_INET6", "SOCK_DGRAM") class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase): pass @requireAttrs(socket.socket, "recvmsg") -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @requireSocket("AF_INET6", "SOCK_DGRAM") class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase): pass @requireAttrs(socket.socket, "recvmsg_into") -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @requireSocket("AF_INET6", "SOCK_DGRAM") class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase): pass @requireAttrs(socket.socket, "recvmsg") -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @requireAttrs(socket, "IPPROTO_IPV6") @requireSocket("AF_INET6", "SOCK_DGRAM") class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest, @@ -4000,7 +4226,7 @@ class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest, pass @requireAttrs(socket.socket, "recvmsg_into") -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @requireAttrs(socket, "IPPROTO_IPV6") @requireSocket("AF_INET6", "SOCK_DGRAM") class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin, @@ -4009,6 +4235,89 @@ class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin, pass +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase, + SendrecvmsgConnectionlessBase, + ThreadedSocketTestMixin, UDPLITETestBase): + pass + +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireAttrs(socket.socket, "sendmsg") +class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase): + pass + +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireAttrs(socket.socket, "recvmsg") +class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase): + pass + +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireAttrs(socket.socket, "recvmsg_into") +class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase): + pass + + +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase, + SendrecvmsgConnectionlessBase, + ThreadedSocketTestMixin, UDPLITE6TestBase): + + def checkRecvmsgAddress(self, addr1, addr2): + # Called to compare the received address with the address of + # the peer, ignoring scope ID + self.assertEqual(addr1[:-1], addr2[:-1]) + +@requireAttrs(socket.socket, "sendmsg") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireSocket("AF_INET6", "SOCK_DGRAM") +class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase): + pass + +@requireAttrs(socket.socket, "recvmsg") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireSocket("AF_INET6", "SOCK_DGRAM") +class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase): + pass + +@requireAttrs(socket.socket, "recvmsg_into") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireSocket("AF_INET6", "SOCK_DGRAM") +class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase): + pass + +@requireAttrs(socket.socket, "recvmsg") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireAttrs(socket, "IPPROTO_IPV6") +@requireSocket("AF_INET6", "SOCK_DGRAM") +class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest, + SendrecvmsgUDPLITE6TestBase): + pass + +@requireAttrs(socket.socket, "recvmsg_into") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireAttrs(socket, "IPPROTO_IPV6") +@requireSocket("AF_INET6", "SOCK_DGRAM") +class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin, + RFC3542AncillaryTest, + SendrecvmsgUDPLITE6TestBase): + pass + + class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase, ConnectedStreamTestMixin, TCPTestBase): pass @@ -4118,7 +4427,7 @@ class InterruptedTimeoutBase(unittest.TestCase): self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler) # Timeout for socket operations - timeout = 4.0 + timeout = support.LOOPBACK_TIMEOUT # Provide setAlarm() method to schedule delivery of SIGALRM after # given number of seconds, or cancel it if zero, and an @@ -4397,7 +4706,7 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest): def testAccept(self): # Testing non-blocking accept - self.serv.setblocking(0) + self.serv.setblocking(False) # connect() didn't start: non-blocking accept() fails start_time = time.monotonic() @@ -4408,7 +4717,7 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest): self.event.set() - read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT) + read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT) if self.serv not in read: self.fail("Error trying to do accept after select.") @@ -4428,7 +4737,7 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest): # Testing non-blocking recv conn, addr = self.serv.accept() self.addCleanup(conn.close) - conn.setblocking(0) + conn.setblocking(False) # the server didn't send data yet: non-blocking recv() fails with self.assertRaises(BlockingIOError): @@ -4436,7 +4745,7 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest): self.event.set() - read, write, err = select.select([conn], [], [], MAIN_TIMEOUT) + read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT) if conn not in read: self.fail("Error during select call to non-blocking socket.") @@ -4796,7 +5105,7 @@ class NetworkConnectionNoServer(unittest.TestCase): socket.socket = old_socket def test_connect(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.addCleanup(cli.close) with self.assertRaises(OSError) as cm: @@ -4806,7 +5115,7 @@ class NetworkConnectionNoServer(unittest.TestCase): def test_create_connection(self): # Issue #9792: errors raised by create_connection() should have # a proper errno attribute. - port = support.find_unused_port() + port = socket_helper.find_unused_port() with self.assertRaises(OSError) as cm: socket.create_connection((HOST, port)) @@ -4824,7 +5133,7 @@ class NetworkConnectionNoServer(unittest.TestCase): # On Solaris, ENETUNREACH is returned in this circumstance instead # of ECONNREFUSED. So, if that errno exists, add it to our list of # expected errnos. - expected_errnos = support.get_socket_conn_refused_errs() + expected_errnos = socket_helper.get_socket_conn_refused_errs() self.assertIn(cm.exception.errno, expected_errnos) def test_create_connection_timeout(self): @@ -4836,7 +5145,7 @@ class NetworkConnectionNoServer(unittest.TestCase): except socket.timeout: pass except OSError as exc: - if support.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT: + if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT: raise else: self.fail('socket.timeout not raised') @@ -4849,7 +5158,7 @@ class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest): ThreadableTest.__init__(self) def clientSetUp(self): - self.source_port = support.find_unused_port() + self.source_port = socket_helper.find_unused_port() def clientTearDown(self): self.cli.close() @@ -4862,14 +5171,16 @@ class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest): testFamily = _justAccept def _testFamily(self): - self.cli = socket.create_connection((HOST, self.port), timeout=30) + self.cli = socket.create_connection((HOST, self.port), + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(self.cli.close) self.assertEqual(self.cli.family, 2) testSourceAddress = _justAccept def _testSourceAddress(self): - self.cli = socket.create_connection((HOST, self.port), timeout=30, - source_address=('', self.source_port)) + self.cli = socket.create_connection((HOST, self.port), + timeout=support.LOOPBACK_TIMEOUT, + source_address=('', self.source_port)) self.addCleanup(self.cli.close) self.assertEqual(self.cli.getsockname()[1], self.source_port) # The port number being used is sufficient to show that the bind() @@ -5022,6 +5333,31 @@ class UDPTimeoutTest(SocketUDPTest): if not ok: self.fail("recv() returned success when we did not expect it") +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +class UDPLITETimeoutTest(SocketUDPLITETest): + + def testUDPLITETimeout(self): + def raise_timeout(*args, **kwargs): + self.serv.settimeout(1.0) + self.serv.recv(1024) + self.assertRaises(socket.timeout, raise_timeout, + "Error generating a timeout exception (UDPLITE)") + + def testTimeoutZero(self): + ok = False + try: + self.serv.settimeout(0.0) + foo = self.serv.recv(1024) + except socket.timeout: + self.fail("caught timeout instead of error (UDPLITE)") + except OSError: + ok = True + except: + self.fail("caught unexpected exception (UDPLITE)") + if not ok: + self.fail("recv() returned success when we did not expect it") + class TestExceptions(unittest.TestCase): def testExceptionTree(self): @@ -5108,7 +5444,7 @@ class TestUnixDomain(unittest.TestCase): def bind(self, sock, path): # Bind the socket try: - support.bind_unix_socket(sock, path) + socket_helper.bind_unix_socket(sock, path) except OSError as e: if str(e) == "AF_UNIX path too long": self.skipTest( @@ -5473,15 +5809,15 @@ class NonblockConstantTest(unittest.TestCase): with socket.socket(socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s: self.checkNonblock(s) - s.setblocking(1) + s.setblocking(True) self.checkNonblock(s, nonblock=False) - s.setblocking(0) + s.setblocking(False) self.checkNonblock(s) s.settimeout(None) self.checkNonblock(s, nonblock=False) s.settimeout(2.0) self.checkNonblock(s, timeout=2.0) - s.setblocking(1) + s.setblocking(True) self.checkNonblock(s, nonblock=False) # defaulttimeout t = socket.getdefaulttimeout() @@ -5611,7 +5947,7 @@ class SendfileUsingSendTest(ThreadedTCPSocketTest): FILESIZE = (10 * 1024 * 1024) # 10 MiB BUFSIZE = 8192 FILEDATA = b"" - TIMEOUT = 2 + TIMEOUT = support.LOOPBACK_TIMEOUT @classmethod def setUpClass(cls): @@ -5637,7 +5973,7 @@ class SendfileUsingSendTest(ThreadedTCPSocketTest): support.unlink(support.TESTFN) def accept_conn(self): - self.serv.settimeout(MAIN_TIMEOUT) + self.serv.settimeout(support.LONG_TIMEOUT) conn, addr = self.serv.accept() conn.settimeout(self.TIMEOUT) self.addCleanup(conn.close) @@ -5733,7 +6069,9 @@ class SendfileUsingSendTest(ThreadedTCPSocketTest): def _testCount(self): address = self.serv.getsockname() file = open(support.TESTFN, 'rb') - with socket.create_connection(address, timeout=2) as sock, file as file: + sock = socket.create_connection(address, + timeout=support.LOOPBACK_TIMEOUT) + with sock, file: count = 5000007 meth = self.meth_from_sock(sock) sent = meth(file, count=count) @@ -5752,7 +6090,9 @@ class SendfileUsingSendTest(ThreadedTCPSocketTest): def _testCountSmall(self): address = self.serv.getsockname() file = open(support.TESTFN, 'rb') - with socket.create_connection(address, timeout=2) as sock, file as file: + sock = socket.create_connection(address, + timeout=support.LOOPBACK_TIMEOUT) + with sock, file: count = 1 meth = self.meth_from_sock(sock) sent = meth(file, count=count) @@ -5806,7 +6146,9 @@ class SendfileUsingSendTest(ThreadedTCPSocketTest): def _testWithTimeout(self): address = self.serv.getsockname() file = open(support.TESTFN, 'rb') - with socket.create_connection(address, timeout=2) as sock, file as file: + sock = socket.create_connection(address, + timeout=support.LOOPBACK_TIMEOUT) + with sock, file: meth = self.meth_from_sock(sock) sent = meth(file) self.assertEqual(sent, self.FILESIZE) @@ -6092,11 +6434,11 @@ class TestMSWindowsTCPFlags(unittest.TestCase): class CreateServerTest(unittest.TestCase): def test_address(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() with socket.create_server(("127.0.0.1", port)) as sock: self.assertEqual(sock.getsockname()[0], "127.0.0.1") self.assertEqual(sock.getsockname()[1], port) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: with socket.create_server(("::1", port), family=socket.AF_INET6) as sock: self.assertEqual(sock.getsockname()[0], "::1") @@ -6106,7 +6448,7 @@ class CreateServerTest(unittest.TestCase): with socket.create_server(("127.0.0.1", 0)) as sock: self.assertEqual(sock.family, socket.AF_INET) self.assertEqual(sock.type, socket.SOCK_STREAM) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: with socket.create_server(("::1", 0), family=socket.AF_INET6) as s: self.assertEqual(s.family, socket.AF_INET6) self.assertEqual(sock.type, socket.SOCK_STREAM) @@ -6126,14 +6468,14 @@ class CreateServerTest(unittest.TestCase): @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or not hasattr(_socket, 'IPV6_V6ONLY'), "IPV6_V6ONLY option not supported") - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') def test_ipv6_only_default(self): with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock: assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY) @unittest.skipIf(not socket.has_dualstack_ipv6(), "dualstack_ipv6 not supported") - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') def test_dualstack_ipv6_family(self): with socket.create_server(("::1", 0), family=socket.AF_INET6, dualstack_ipv6=True) as sock: @@ -6141,7 +6483,7 @@ class CreateServerTest(unittest.TestCase): class CreateServerFunctionalTest(unittest.TestCase): - timeout = 3 + timeout = support.LOOPBACK_TIMEOUT def setUp(self): self.thread = None @@ -6175,14 +6517,14 @@ class CreateServerFunctionalTest(unittest.TestCase): self.assertEqual(sock.recv(1024), b'foo') def test_tcp4(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() with socket.create_server(("", port)) as sock: self.echo_server(sock) self.echo_client(("127.0.0.1", port), socket.AF_INET) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') def test_tcp6(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() with socket.create_server(("", port), family=socket.AF_INET6) as sock: self.echo_server(sock) @@ -6192,9 +6534,9 @@ class CreateServerFunctionalTest(unittest.TestCase): @unittest.skipIf(not socket.has_dualstack_ipv6(), "dualstack_ipv6 not supported") - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') def test_dual_stack_client_v4(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() with socket.create_server(("", port), family=socket.AF_INET6, dualstack_ipv6=True) as sock: self.echo_server(sock) @@ -6202,19 +6544,61 @@ class CreateServerFunctionalTest(unittest.TestCase): @unittest.skipIf(not socket.has_dualstack_ipv6(), "dualstack_ipv6 not supported") - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') def test_dual_stack_client_v6(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() with socket.create_server(("", port), family=socket.AF_INET6, dualstack_ipv6=True) as sock: self.echo_server(sock) self.echo_client(("::1", port), socket.AF_INET6) +@requireAttrs(socket, "send_fds") +@requireAttrs(socket, "recv_fds") +@requireAttrs(socket, "AF_UNIX") +class SendRecvFdsTests(unittest.TestCase): + def testSendAndRecvFds(self): + def close_pipes(pipes): + for fd1, fd2 in pipes: + os.close(fd1) + os.close(fd2) + + def close_fds(fds): + for fd in fds: + os.close(fd) + + # send 10 file descriptors + pipes = [os.pipe() for _ in range(10)] + self.addCleanup(close_pipes, pipes) + fds = [rfd for rfd, wfd in pipes] + + # use a UNIX socket pair to exchange file descriptors locally + sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) + with sock1, sock2: + socket.send_fds(sock1, [MSG], fds) + # request more data and file descriptors than expected + msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2) + self.addCleanup(close_fds, fds2) + + self.assertEqual(msg, MSG) + self.assertEqual(len(fds2), len(fds)) + self.assertEqual(flags, 0) + # don't test addr + + # test that file descriptors are connected + for index, fds in enumerate(pipes): + rfd, wfd = fds + os.write(wfd, str(index).encode()) + + for index, rfd in enumerate(fds2): + data = os.read(rfd, 100) + self.assertEqual(data, str(index).encode()) + def test_main(): tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest, TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, - UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest] + UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest, + SendRecvFdsTests] tests.extend([ NonBlockingTCPTests, @@ -6244,6 +6628,7 @@ def test_main(): BasicVSOCKTest, ThreadedVSOCKSocketStreamTest, ]) + tests.append(BasicBluetoothTest) tests.extend([ CmsgMacroTests, SendmsgUDPTest, @@ -6254,6 +6639,14 @@ def test_main(): RecvmsgRFC3542AncillaryUDP6Test, RecvmsgIntoRFC3542AncillaryUDP6Test, RecvmsgIntoUDP6Test, + SendmsgUDPLITETest, + RecvmsgUDPLITETest, + RecvmsgIntoUDPLITETest, + SendmsgUDPLITE6Test, + RecvmsgUDPLITE6Test, + RecvmsgRFC3542AncillaryUDPLITE6Test, + RecvmsgIntoRFC3542AncillaryUDPLITE6Test, + RecvmsgIntoUDPLITE6Test, SendmsgTCPTest, RecvmsgTCPTest, RecvmsgIntoTCPTest, @@ -6278,5 +6671,6 @@ def test_main(): support.run_unittest(*tests) support.threading_cleanup(*thread_info) + if __name__ == "__main__": test_main() diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py index 8aed4b61..c663cc95 100644 --- a/Lib/test/test_socketserver.py +++ b/Lib/test/test_socketserver.py @@ -15,12 +15,13 @@ import socketserver import test.support from test.support import reap_children, reap_threads, verbose +from test.support import socket_helper test.support.requires("network") TEST_STR = b"hello world\n" -HOST = test.support.HOST +HOST = socket_helper.HOST HAVE_UNIX_SOCKETS = hasattr(socket, "AF_UNIX") requires_unix_sockets = unittest.skipUnless(HAVE_UNIX_SOCKETS, @@ -36,7 +37,7 @@ def signal_alarm(n): # Remember real select() to avoid interferences with mocking _real_select = select.select -def receive(sock, n, timeout=20): +def receive(sock, n, timeout=test.support.SHORT_TIMEOUT): r, w, x = _real_select([sock], [], [], timeout) if sock in r: return sock.recv(n) @@ -65,9 +66,7 @@ def simple_subprocess(testcase): except: raise finally: - pid2, status = os.waitpid(pid, 0) - testcase.assertEqual(pid2, pid) - testcase.assertEqual(72 << 8, status) + test.support.wait_process(pid, exitcode=72) class SocketServerTest(unittest.TestCase): diff --git a/Lib/test/test_source_encoding.py b/Lib/test/test_source_encoding.py index a0bd741c..5ca43461 100644 --- a/Lib/test/test_source_encoding.py +++ b/Lib/test/test_source_encoding.py @@ -57,6 +57,9 @@ class MiscSourceEncodingTest(unittest.TestCase): # one byte in common with the UTF-16-LE BOM self.assertRaises(SyntaxError, eval, b'\xff\x20') + # one byte in common with the UTF-8 BOM + self.assertRaises(SyntaxError, eval, b'\xef\x20') + # two bytes in common with the UTF-8 BOM self.assertRaises(SyntaxError, eval, b'\xef\xbb\x20') diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 0bc0a8c4..5d496c66 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -4,6 +4,7 @@ import sys import unittest import unittest.mock from test import support +from test.support import socket_helper import socket import select import time @@ -29,8 +30,11 @@ ssl = support.import_module("ssl") from ssl import TLSVersion, _TLSContentType, _TLSMessageType +Py_DEBUG = hasattr(sys, 'gettotalrefcount') +Py_DEBUG_WIN32 = Py_DEBUG and sys.platform == 'win32' + PROTOCOLS = sorted(ssl._PROTOCOL_NAMES) -HOST = support.HOST +HOST = socket_helper.HOST IS_LIBRESSL = ssl.OPENSSL_VERSION.startswith('LibreSSL') IS_OPENSSL_1_1_0 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0) IS_OPENSSL_1_1_1 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 1) @@ -405,8 +409,7 @@ class BasicSocketTests(unittest.TestCase): else: os.close(wfd) self.addCleanup(os.close, rfd) - _, status = os.waitpid(pid, 0) - self.assertEqual(status, 0) + support.wait_process(pid, exitcode=0) child_random = os.read(rfd, 16) self.assertEqual(len(child_random), 16) @@ -760,7 +763,7 @@ class BasicSocketTests(unittest.TestCase): fail(cert, 'example.net') # -- IPv6 matching -- - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: cert = {'subject': ((('commonName', 'example.com'),),), 'subjectAltName': ( ('DNS', 'example.com'), @@ -843,7 +846,7 @@ class BasicSocketTests(unittest.TestCase): ssl._inet_paton(invalid) for ipaddr in ['127.0.0.1', '192.168.0.1']: self.assertTrue(ssl._inet_paton(ipaddr)) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: for ipaddr in ['::1', '2001:db8:85a3::8a2e:370:7334']: self.assertTrue(ssl._inet_paton(ipaddr)) @@ -1071,7 +1074,7 @@ class BasicSocketTests(unittest.TestCase): def test_connect_ex_error(self): server = socket.socket(socket.AF_INET) self.addCleanup(server.close) - port = support.bind_port(server) # Reserve port but don't listen + port = socket_helper.bind_port(server) # Reserve port but don't listen s = test_wrap_socket(socket.socket(socket.AF_INET), cert_reqs=ssl.CERT_REQUIRED) self.addCleanup(s.close) @@ -1446,6 +1449,7 @@ class ContextTests(unittest.TestCase): ctx.load_verify_locations(cadata=b"broken") + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_load_dh_params(self): ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ctx.load_dh_params(DHFILE) @@ -1764,6 +1768,7 @@ class SSLErrorTests(unittest.TestCase): self.assertEqual(str(e), "foo") self.assertEqual(e.errno, 1) + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_lib_reason(self): # Test the library and reason attributes ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) @@ -2151,7 +2156,7 @@ class SimpleBackgroundTests(unittest.TestCase): def ssl_io_loop(self, sock, incoming, outgoing, func, *args, **kwargs): # A simple IO loop. Call func(*args) depending on the error we get # (WANT_READ or WANT_WRITE) move data between the socket and the BIOs. - timeout = kwargs.get('timeout', 10) + timeout = kwargs.get('timeout', support.SHORT_TIMEOUT) deadline = time.monotonic() + timeout count = 0 while True: @@ -2241,7 +2246,7 @@ class NetworkedTests(unittest.TestCase): def test_timeout_connect_ex(self): # Issue #12065: on a timeout, connect_ex() should return the original # errno (mimicking the behaviour of non-SSL sockets). - with support.transient_internet(REMOTE_HOST): + with socket_helper.transient_internet(REMOTE_HOST): s = test_wrap_socket(socket.socket(socket.AF_INET), cert_reqs=ssl.CERT_REQUIRED, do_handshake_on_connect=False) @@ -2252,9 +2257,9 @@ class NetworkedTests(unittest.TestCase): self.skipTest("REMOTE_HOST responded too quickly") self.assertIn(rc, (errno.EAGAIN, errno.EWOULDBLOCK)) - @unittest.skipUnless(support.IPV6_ENABLED, 'Needs IPv6') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'Needs IPv6') def test_get_server_certificate_ipv6(self): - with support.transient_internet('ipv6.google.com'): + with socket_helper.transient_internet('ipv6.google.com'): _test_get_server_certificate(self, 'ipv6.google.com', 443) _test_get_server_certificate_fail(self, 'ipv6.google.com', 443) @@ -2296,7 +2301,7 @@ class ThreadedEchoServer(threading.Thread): self.running = False self.sock = connsock self.addr = addr - self.sock.setblocking(1) + self.sock.setblocking(True) self.sslconn = None threading.Thread.__init__(self) self.daemon = True @@ -2507,7 +2512,7 @@ class ThreadedEchoServer(threading.Thread): self.connectionchatty = connectionchatty self.starttls_server = starttls_server self.sock = socket.socket() - self.port = support.bind_port(self.sock) + self.port = socket_helper.bind_port(self.sock) self.flag = None self.active = False self.selected_npn_protocols = [] @@ -2620,7 +2625,7 @@ class AsyncoreEchoServer(threading.Thread): def __init__(self, certfile): self.certfile = certfile sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.port = support.bind_port(sock, '') + self.port = socket_helper.bind_port(sock, '') asyncore.dispatcher.__init__(self, sock) self.listen(5) @@ -3140,7 +3145,7 @@ class ThreadedTests(unittest.TestCase): listener_gone = threading.Event() s = socket.socket() - port = support.bind_port(s, HOST) + port = socket_helper.bind_port(s, HOST) # `listener` runs in a thread. It sits in an accept() until # the main thread connects. Then it rudely closes the socket, @@ -3344,7 +3349,7 @@ class ThreadedTests(unittest.TestCase): wrapped = False with server: s = socket.socket() - s.setblocking(1) + s.setblocking(True) s.connect((HOST, server.port)) if support.verbose: sys.stdout.write("\n") @@ -3636,7 +3641,7 @@ class ThreadedTests(unittest.TestCase): # Issue #5103: SSL handshake must respect the socket timeout server = socket.socket(socket.AF_INET) host = "127.0.0.1" - port = support.bind_port(server) + port = socket_helper.bind_port(server) started = threading.Event() finish = False @@ -3690,7 +3695,7 @@ class ThreadedTests(unittest.TestCase): context.load_cert_chain(SIGNED_CERTFILE) server = socket.socket(socket.AF_INET) host = "127.0.0.1" - port = support.bind_port(server) + port = socket_helper.bind_port(server) server = context.wrap_socket(server, server_side=True) self.assertTrue(server.server_side) @@ -3953,6 +3958,7 @@ class ThreadedTests(unittest.TestCase): sni_name=hostname) self.assertIs(stats['compression'], None) + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_dh_params(self): # Check we can get a connection with ephemeral Diffie-Hellman client_context, server_context, hostname = testing_context() @@ -4582,6 +4588,7 @@ class TestSSLDebug(unittest.TestCase): return len(list(f)) @requires_keylog + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_keylog_defaults(self): self.addCleanup(support.unlink, support.TESTFN) ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) @@ -4605,6 +4612,7 @@ class TestSSLDebug(unittest.TestCase): ctx.keylog_filename = 1 @requires_keylog + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_keylog_filename(self): self.addCleanup(support.unlink, support.TESTFN) client_context, server_context, hostname = testing_context() @@ -4642,6 +4650,7 @@ class TestSSLDebug(unittest.TestCase): @requires_keylog @unittest.skipIf(sys.flags.ignore_environment, "test is not compatible with ignore_environment") + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_keylog_env(self): self.addCleanup(support.unlink, support.TESTFN) with unittest.mock.patch.dict(os.environ): diff --git a/Lib/test/test_stat.py b/Lib/test/test_stat.py index be01db2e..d9e4ffde 100644 --- a/Lib/test/test_stat.py +++ b/Lib/test/test_stat.py @@ -2,8 +2,8 @@ import unittest import os import socket import sys -from test.support import (TESTFN, import_fresh_module, - skip_unless_bind_unix_socket) +from test.support import socket_helper +from test.support import TESTFN, import_fresh_module c_stat = import_fresh_module('stat', fresh=['_stat']) py_stat = import_fresh_module('stat', blocked=['_stat']) @@ -193,7 +193,7 @@ class TestFilemode: self.assertS_IS("BLK", st_mode) break - @skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_socket(self): with socket.socket(socket.AF_UNIX) as s: s.bind(TESTFN) diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 5b8ad874..bf415dda 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -1004,6 +1004,10 @@ class ConvertTest(unittest.TestCase): x = statistics._convert(nan, type(nan)) self.assertTrue(_nan_equal(x, nan)) + def test_invalid_input_type(self): + with self.assertRaises(TypeError): + statistics._convert(None, float) + class FailNegTest(unittest.TestCase): """Test _fail_neg private function.""" @@ -1033,6 +1037,50 @@ class FailNegTest(unittest.TestCase): self.assertEqual(errmsg, msg) +class FindLteqTest(unittest.TestCase): + # Test _find_lteq private function. + + def test_invalid_input_values(self): + for a, x in [ + ([], 1), + ([1, 2], 3), + ([1, 3], 2) + ]: + with self.subTest(a=a, x=x): + with self.assertRaises(ValueError): + statistics._find_lteq(a, x) + + def test_locate_successfully(self): + for a, x, expected_i in [ + ([1, 1, 1, 2, 3], 1, 0), + ([0, 1, 1, 1, 2, 3], 1, 1), + ([1, 2, 3, 3, 3], 3, 2) + ]: + with self.subTest(a=a, x=x): + self.assertEqual(expected_i, statistics._find_lteq(a, x)) + + +class FindRteqTest(unittest.TestCase): + # Test _find_rteq private function. + + def test_invalid_input_values(self): + for a, l, x in [ + ([1], 2, 1), + ([1, 3], 0, 2) + ]: + with self.assertRaises(ValueError): + statistics._find_rteq(a, l, x) + + def test_locate_successfully(self): + for a, l, x, expected_i in [ + ([1, 1, 1, 2, 3], 0, 1, 2), + ([0, 1, 1, 1, 2, 3], 0, 1, 3), + ([1, 2, 3, 3, 3], 0, 3, 4) + ]: + with self.subTest(a=a, l=l, x=x): + self.assertEqual(expected_i, statistics._find_rteq(a, l, x)) + + # === Tests for public functions === class UnivariateCommonMixin: @@ -1476,6 +1524,18 @@ class TestHarmonicMean(NumericTestCase, AverageMixin, UnivariateTypeMixin): with self.subTest(values=values): self.assertRaises(exc, self.func, values) + def test_invalid_type_error(self): + # Test error is raised when input contains invalid type(s) + for data in [ + ['3.14'], # single string + ['1', '2', '3'], # multiple strings + [1, '2', 3, '4', 5], # mixed strings and valid integers + [2.3, 3.4, 4.5, '5.6'] # only one string and valid floats + ]: + with self.subTest(data=data): + with self.assertRaises(TypeError): + self.func(data) + def test_ints(self): # Test harmonic mean with ints. data = [2, 4, 4, 8, 16, 16] @@ -2614,6 +2674,21 @@ class TestNormalDist: with self.assertRaises(self.module.StatisticsError): NormalDist(1, 0).overlap(X) # left operand sigma is zero + def test_zscore(self): + NormalDist = self.module.NormalDist + X = NormalDist(100, 15) + self.assertEqual(X.zscore(142), 2.8) + self.assertEqual(X.zscore(58), -2.8) + self.assertEqual(X.zscore(100), 0.0) + with self.assertRaises(TypeError): + X.zscore() # too few arguments + with self.assertRaises(TypeError): + X.zscore(1, 1) # too may arguments + with self.assertRaises(TypeError): + X.zscore(None) # non-numeric type + with self.assertRaises(self.module.StatisticsError): + NormalDist(1, 0).zscore(100) # sigma is zero + def test_properties(self): X = self.module.NormalDist(100, 15) self.assertEqual(X.mean, 100) diff --git a/Lib/test/test_string_literals.py b/Lib/test/test_string_literals.py index 0cea2edc..9565ee24 100644 --- a/Lib/test/test_string_literals.py +++ b/Lib/test/test_string_literals.py @@ -33,6 +33,7 @@ import shutil import tempfile import unittest import warnings +from test.support import use_old_parser TEMPLATE = r"""# coding: %s @@ -63,8 +64,6 @@ def byte(i): class TestLiterals(unittest.TestCase): - from test.support import check_syntax_warning - def setUp(self): self.save_path = sys.path[:] self.tmpdir = tempfile.mkdtemp() @@ -129,6 +128,7 @@ class TestLiterals(unittest.TestCase): self.assertEqual(w, []) self.assertEqual(exc.filename, '') self.assertEqual(exc.lineno, 1) + self.assertEqual(exc.offset, 1) def test_eval_str_raw(self): self.assertEqual(eval(""" r'x' """), 'x') @@ -168,7 +168,8 @@ class TestLiterals(unittest.TestCase): eval("b'''\n\\z'''") self.assertEqual(len(w), 1) self.assertEqual(w[0].filename, '') - self.assertEqual(w[0].lineno, 1) + if use_old_parser(): + self.assertEqual(w[0].lineno, 1) with warnings.catch_warnings(record=True) as w: warnings.simplefilter('error', category=DeprecationWarning) @@ -177,7 +178,8 @@ class TestLiterals(unittest.TestCase): exc = cm.exception self.assertEqual(w, []) self.assertEqual(exc.filename, '') - self.assertEqual(exc.lineno, 1) + if use_old_parser(): + self.assertEqual(exc.lineno, 1) def test_eval_bytes_raw(self): self.assertEqual(eval(""" br'x' """), b'x') diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index 67e7c559..b3f21ea7 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -7,6 +7,7 @@ import struct import sys from test import support +from test.support.script_helper import assert_python_ok ISBIGENDIAN = sys.byteorder == "big" @@ -652,6 +653,24 @@ class StructTest(unittest.TestCase): s2 = struct.Struct(s.format.encode()) self.assertEqual(s2.format, s.format) + def test_struct_cleans_up_at_runtime_shutdown(self): + code = """if 1: + import struct + + class C: + def __init__(self): + self.pack = struct.pack + def __del__(self): + self.pack('I', -42) + + struct.x = C() + """ + rc, stdout, stderr = assert_python_ok("-c", code) + self.assertEqual(rc, 0) + self.assertEqual(stdout.rstrip(), b"") + self.assertIn(b"Exception ignored in:", stderr) + self.assertIn(b"C.__del__", stderr) + def test_issue35714(self): # Embedded null characters should not be allowed in format strings. for s in '\0', '2\0i', b'\0': @@ -686,6 +705,10 @@ class UnpackIteratorTest(unittest.TestCase): with self.assertRaises(struct.error): s.iter_unpack(b"12") + def test_uninstantiable(self): + iter_unpack_type = type(struct.Struct(">ibcp").iter_unpack(b"")) + self.assertRaises(TypeError, iter_unpack_type) + def test_iterate(self): s = struct.Struct('>IB') b = bytes(range(1, 16)) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 2d3ab935..ba2844da 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -11,6 +11,7 @@ import errno import tempfile import time import traceback +import types import selectors import sysconfig import select @@ -18,6 +19,7 @@ import shutil import threading import gc import textwrap +import json from test.support import FakePath try: @@ -25,6 +27,14 @@ try: except ImportError: _testcapi = None +try: + import pwd +except ImportError: + pwd = None +try: + import grp +except ImportError: + grp = None if support.PGO: raise unittest.SkipTest("test is not helpful for PGO") @@ -76,15 +86,6 @@ class BaseTestCase(unittest.TestCase): self.doCleanups() support.reap_children() - def assertStderrEqual(self, stderr, expected, msg=None): - # In a debug build, stuff like "[6580 refs]" is printed to stderr at - # shutdown time. That frustrates tests trying to check stderr produced - # from a spawned Python process. - actual = support.strip_python_stderr(stderr) - # strip_python_stderr also strips whitespace, so we do too. - expected = expected.strip() - self.assertEqual(actual, expected, msg) - class PopenTestException(Exception): pass @@ -540,7 +541,7 @@ class ProcessTestCase(BaseTestCase): 'import sys; sys.stderr.write("strawberry")'], stderr=subprocess.PIPE) with p: - self.assertStderrEqual(p.stderr.read(), b"strawberry") + self.assertEqual(p.stderr.read(), b"strawberry") def test_stderr_filedes(self): # stderr is set to open file descriptor @@ -552,7 +553,7 @@ class ProcessTestCase(BaseTestCase): stderr=d) p.wait() os.lseek(d, 0, 0) - self.assertStderrEqual(os.read(d, 1024), b"strawberry") + self.assertEqual(os.read(d, 1024), b"strawberry") def test_stderr_fileobj(self): # stderr is set to open file object @@ -563,7 +564,7 @@ class ProcessTestCase(BaseTestCase): stderr=tf) p.wait() tf.seek(0) - self.assertStderrEqual(tf.read(), b"strawberry") + self.assertEqual(tf.read(), b"strawberry") def test_stderr_redirect_with_no_stdout_redirect(self): # test stderr=STDOUT while stdout=None (not set) @@ -582,8 +583,8 @@ class ProcessTestCase(BaseTestCase): stderr=subprocess.PIPE) stdout, stderr = p.communicate() #NOTE: stdout should get stderr from grandchild - self.assertStderrEqual(stdout, b'42') - self.assertStderrEqual(stderr, b'') # should be empty + self.assertEqual(stdout, b'42') + self.assertEqual(stderr, b'') # should be empty self.assertEqual(p.returncode, 0) def test_stdout_stderr_pipe(self): @@ -596,7 +597,7 @@ class ProcessTestCase(BaseTestCase): stdout=subprocess.PIPE, stderr=subprocess.STDOUT) with p: - self.assertStderrEqual(p.stdout.read(), b"appleorange") + self.assertEqual(p.stdout.read(), b"appleorange") def test_stdout_stderr_file(self): # capture stdout and stderr to the same open file @@ -611,7 +612,7 @@ class ProcessTestCase(BaseTestCase): stderr=tf) p.wait() tf.seek(0) - self.assertStderrEqual(tf.read(), b"appleorange") + self.assertEqual(tf.read(), b"appleorange") def test_stdout_filedes_of_stdout(self): # stdout is set to 1 (#1531862). @@ -759,7 +760,7 @@ class ProcessTestCase(BaseTestCase): stderr=subprocess.PIPE) (stdout, stderr) = p.communicate() self.assertEqual(stdout, None) - self.assertStderrEqual(stderr, b"pineapple") + self.assertEqual(stderr, b"pineapple") def test_communicate(self): p = subprocess.Popen([sys.executable, "-c", @@ -774,7 +775,7 @@ class ProcessTestCase(BaseTestCase): self.addCleanup(p.stdin.close) (stdout, stderr) = p.communicate(b"banana") self.assertEqual(stdout, b"banana") - self.assertStderrEqual(stderr, b"pineapple") + self.assertEqual(stderr, b"pineapple") def test_communicate_timeout(self): p = subprocess.Popen([sys.executable, "-c", @@ -793,7 +794,7 @@ class ProcessTestCase(BaseTestCase): # after it completes. (stdout, stderr) = p.communicate() self.assertEqual(stdout, "banana") - self.assertStderrEqual(stderr.encode(), b"pineapple\npear\n") + self.assertEqual(stderr.encode(), b"pineapple\npear\n") def test_communicate_timeout_large_output(self): # Test an expiring timeout while the child is outputting lots of data. @@ -879,7 +880,7 @@ class ProcessTestCase(BaseTestCase): p.stdin.write(b"banana") (stdout, stderr) = p.communicate(b"split") self.assertEqual(stdout, b"bananasplit") - self.assertStderrEqual(stderr, b"") + self.assertEqual(stderr, b"") def test_universal_newlines_and_text(self): args = [ @@ -997,7 +998,6 @@ class ProcessTestCase(BaseTestCase): self.assertEqual("line1\nline2\nline3\nline4\nline5\n", stdout) # Python debug build push something like "[42442 refs]\n" # to stderr at exit of subprocess. - # Don't use assertStderrEqual because it strips CR and LF from output. self.assertTrue(stderr.startswith("eline2\neline6\neline7\n")) def test_universal_newlines_communicate_encodings(self): @@ -1123,9 +1123,7 @@ class ProcessTestCase(BaseTestCase): with self.assertRaises(subprocess.TimeoutExpired) as c: p.wait(timeout=0.0001) self.assertIn("0.0001", str(c.exception)) # For coverage of __str__. - # Some heavily loaded buildbots (sparc Debian 3.x) require this much - # time to start. - self.assertEqual(p.wait(timeout=3), 0) + self.assertEqual(p.wait(timeout=support.SHORT_TIMEOUT), 0) def test_invalid_bufsize(self): # an invalid type of the bufsize argument should raise @@ -1291,7 +1289,7 @@ class ProcessTestCase(BaseTestCase): # Wait for the process to finish; the thread should kill it # long before it finishes on its own. Supplying a timeout # triggers a different code path for better coverage. - proc.wait(timeout=20) + proc.wait(timeout=support.SHORT_TIMEOUT) self.assertEqual(proc.returncode, expected_errorcode, msg="unexpected result in wait from main thread") @@ -1352,6 +1350,30 @@ class ProcessTestCase(BaseTestCase): self.addCleanup(p.stdin.close) p.communicate(b"x" * 2**20) + def test_repr(self): + # Run a command that waits for user input, to check the repr() of + # a Proc object while and after the sub-process runs. + code = 'import sys; input(); sys.exit(57)' + cmd = [sys.executable, '-c', code] + result = "') + ) + + proc.communicate(input='exit...\n') + proc.wait() + + self.assertIsNotNone(proc.returncode) + self.assertTrue( + repr(proc).startswith(result.format(proc.returncode)) and + repr(proc).endswith('>') + ) + def test_communicate_epipe_only_stdin(self): # Issue 10963: communicate() should hide EPIPE p = subprocess.Popen(ZERO_RETURN_CMD, @@ -1415,6 +1437,9 @@ class ProcessTestCase(BaseTestCase): subprocess.Popen(['exit', '0'], cwd='/some/nonexistent/directory') self.assertEqual(c.exception.filename, '/some/nonexistent/directory') + def test_class_getitems(self): + self.assertIsInstance(subprocess.Popen[bytes], types.GenericAlias) + self.assertIsInstance(subprocess.CompletedProcess[str], types.GenericAlias) class RunFuncTestCase(BaseTestCase): def run_python(self, code, **kwargs): @@ -1513,7 +1538,7 @@ class RunFuncTestCase(BaseTestCase): def test_run_with_pathlike_path(self): # bpo-31961: test run(pathlike_object) # the name of a command that can be run without - # any argumenets that exit fast + # any arguments that exit fast prog = 'tree.com' if mswindows else 'ls' path = shutil.which(prog) if path is None: @@ -1591,6 +1616,18 @@ class RunFuncTestCase(BaseTestCase): f"{stacks}```") +def _get_test_grp_name(): + for name_group in ('staff', 'nogroup', 'grp', 'nobody', 'nfsnobody'): + if grp: + try: + grp.getgrnam(name_group) + except KeyError: + continue + return name_group + else: + raise unittest.SkipTest('No identified group name to use for this test on this platform.') + + @unittest.skipIf(mswindows, "POSIX specific tests") class POSIXProcessTestCase(BaseTestCase): @@ -1745,6 +1782,173 @@ class POSIXProcessTestCase(BaseTestCase): child_sid = int(output) self.assertNotEqual(parent_sid, child_sid) + @unittest.skipUnless(hasattr(os, 'setreuid'), 'no setreuid on platform') + def test_user(self): + # For code coverage of the user parameter. We don't care if we get an + # EPERM error from it depending on the test execution environment, that + # still indicates that it was called. + + uid = os.geteuid() + test_users = [65534 if uid != 65534 else 65533, uid] + name_uid = "nobody" if sys.platform != 'darwin' else "unknown" + + if pwd is not None: + try: + pwd.getpwnam(name_uid) + test_users.append(name_uid) + except KeyError: + # unknown user name + name_uid = None + + for user in test_users: + # posix_spawn() may be used with close_fds=False + for close_fds in (False, True): + with self.subTest(user=user, close_fds=close_fds): + try: + output = subprocess.check_output( + [sys.executable, "-c", + "import os; print(os.getuid())"], + user=user, + close_fds=close_fds) + except PermissionError: # (EACCES, EPERM) + pass + except OSError as e: + if e.errno not in (errno.EACCES, errno.EPERM): + raise + else: + if isinstance(user, str): + user_uid = pwd.getpwnam(user).pw_uid + else: + user_uid = user + child_user = int(output) + self.assertEqual(child_user, user_uid) + + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, user=-1) + + if pwd is None and name_uid is not None: + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, user=name_uid) + + @unittest.skipIf(hasattr(os, 'setreuid'), 'setreuid() available on platform') + def test_user_error(self): + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, user=65535) + + @unittest.skipUnless(hasattr(os, 'setregid'), 'no setregid() on platform') + def test_group(self): + gid = os.getegid() + group_list = [65534 if gid != 65534 else 65533] + name_group = _get_test_grp_name() + + if grp is not None: + group_list.append(name_group) + + for group in group_list + [gid]: + # posix_spawn() may be used with close_fds=False + for close_fds in (False, True): + with self.subTest(group=group, close_fds=close_fds): + try: + output = subprocess.check_output( + [sys.executable, "-c", + "import os; print(os.getgid())"], + group=group, + close_fds=close_fds) + except PermissionError: # (EACCES, EPERM) + pass + else: + if isinstance(group, str): + group_gid = grp.getgrnam(group).gr_gid + else: + group_gid = group + + child_group = int(output) + self.assertEqual(child_group, group_gid) + + # make sure we bomb on negative values + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, group=-1) + + if grp is None: + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, group=name_group) + + @unittest.skipIf(hasattr(os, 'setregid'), 'setregid() available on platform') + def test_group_error(self): + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, group=65535) + + @unittest.skipUnless(hasattr(os, 'setgroups'), 'no setgroups() on platform') + def test_extra_groups(self): + gid = os.getegid() + group_list = [65534 if gid != 65534 else 65533] + name_group = _get_test_grp_name() + perm_error = False + + if grp is not None: + group_list.append(name_group) + + try: + output = subprocess.check_output( + [sys.executable, "-c", + "import os, sys, json; json.dump(os.getgroups(), sys.stdout)"], + extra_groups=group_list) + except OSError as ex: + if ex.errno != errno.EPERM: + raise + perm_error = True + + else: + parent_groups = os.getgroups() + child_groups = json.loads(output) + + if grp is not None: + desired_gids = [grp.getgrnam(g).gr_gid if isinstance(g, str) else g + for g in group_list] + else: + desired_gids = group_list + + if perm_error: + self.assertEqual(set(child_groups), set(parent_groups)) + else: + self.assertEqual(set(desired_gids), set(child_groups)) + + # make sure we bomb on negative values + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, extra_groups=[-1]) + + if grp is None: + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, + extra_groups=[name_group]) + + @unittest.skipIf(hasattr(os, 'setgroups'), 'setgroups() available on platform') + def test_extra_groups_error(self): + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, extra_groups=[]) + + @unittest.skipIf(mswindows or not hasattr(os, 'umask'), + 'POSIX umask() is not available.') + def test_umask(self): + tmpdir = None + try: + tmpdir = tempfile.mkdtemp() + name = os.path.join(tmpdir, "beans") + # We set an unusual umask in the child so as a unique mode + # for us to test the child's touched file for. + subprocess.check_call( + [sys.executable, "-c", f"open({name!r}, 'w').close()"], + umask=0o053) + # Ignore execute permissions entirely in our test, + # filesystems could be mounted to ignore or force that. + st_mode = os.stat(name).st_mode & 0o666 + expected_mode = 0o624 + self.assertEqual(expected_mode, st_mode, + msg=f'{oct(expected_mode)} != {oct(st_mode)}') + finally: + if tmpdir is not None: + shutil.rmtree(tmpdir) + def test_run_abort(self): # returncode handles signal termination with support.SuppressCrashReport(): @@ -2034,13 +2238,13 @@ class POSIXProcessTestCase(BaseTestCase): def test_kill(self): p = self._kill_process('kill') _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') self.assertEqual(p.wait(), -signal.SIGKILL) def test_terminate(self): p = self._kill_process('terminate') _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') self.assertEqual(p.wait(), -signal.SIGTERM) def test_send_signal_dead(self): @@ -2088,8 +2292,8 @@ class POSIXProcessTestCase(BaseTestCase): stdin=stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() - err = support.strip_python_stderr(err) - self.assertEqual((out, err), (b'apple', b'orange')) + self.assertEqual(out, b'apple') + self.assertEqual(err, b'orange') finally: self._restore_fds(saved_fds) @@ -2174,7 +2378,7 @@ class POSIXProcessTestCase(BaseTestCase): os.lseek(fd, 0, 0) out = os.read(temp_fds[2], 1024) - err = support.strip_python_stderr(os.read(temp_fds[0], 1024)) + err = os.read(temp_fds[0], 1024).strip() self.assertEqual(out, b"got STDIN") self.assertEqual(err, b"err") @@ -2216,7 +2420,7 @@ class POSIXProcessTestCase(BaseTestCase): os.lseek(fd, 0, 0) out = os.read(stdout_no, 1024) - err = support.strip_python_stderr(os.read(stderr_no, 1024)) + err = os.read(stderr_no, 1024).strip() finally: self._restore_fds(saved_fds) @@ -2795,13 +2999,23 @@ class POSIXProcessTestCase(BaseTestCase): ([b"arg"], [b"exe"], 123, [b"env"]), ([b"arg"], [b"exe"], None, 123), ): - with self.assertRaises(TypeError): + with self.assertRaises(TypeError) as err: _posixsubprocess.fork_exec( args, exe_list, True, (), cwd, env_list, -1, -1, -1, -1, 1, 2, 3, 4, - True, True, func) + True, True, + False, [], 0, -1, + func) + # Attempt to prevent + # "TypeError: fork_exec() takes exactly N arguments (M given)" + # from passing the test. More refactoring to have us start + # with a valid *args list, confirm a good call with that works + # before mutating it in various ways to ensure that bad calls + # with individual arg type errors raise a typeerror would be + # ideal. Saving that for a future PR... + self.assertNotIn('takes exactly', str(err.exception)) finally: if not gc_enabled: gc.disable() @@ -2840,7 +3054,9 @@ class POSIXProcessTestCase(BaseTestCase): True, fds_to_keep, None, [b"env"], -1, -1, -1, -1, 1, 2, 3, 4, - True, True, None) + True, True, + None, None, None, -1, + None) self.assertIn('fds_to_keep', str(c.exception)) finally: if not gc_enabled: @@ -2901,16 +3117,36 @@ class POSIXProcessTestCase(BaseTestCase): proc = subprocess.Popen(args) # Wait until the real process completes to avoid zombie process - pid = proc.pid - pid, status = os.waitpid(pid, 0) - self.assertEqual(status, 0) + support.wait_process(proc.pid, exitcode=0) status = _testcapi.W_STOPCODE(3) - with mock.patch('subprocess.os.waitpid', return_value=(pid, status)): + with mock.patch('subprocess.os.waitpid', return_value=(proc.pid, status)): returncode = proc.wait() self.assertEqual(returncode, -3) + def test_send_signal_race(self): + # bpo-38630: send_signal() must poll the process exit status to reduce + # the risk of sending the signal to the wrong process. + proc = subprocess.Popen(ZERO_RETURN_CMD) + + # wait until the process completes without using the Popen APIs. + support.wait_process(proc.pid, exitcode=0) + + # returncode is still None but the process completed. + self.assertIsNone(proc.returncode) + + with mock.patch("os.kill") as mock_kill: + proc.send_signal(signal.SIGTERM) + + # send_signal() didn't call os.kill() since the process already + # completed. + mock_kill.assert_not_called() + + # Don't check the returncode value: the test reads the exit status, + # so Popen failed to read it and uses a default returncode instead. + self.assertIsNotNone(proc.returncode) + def test_communicate_repeated_call_after_stdout_close(self): proc = subprocess.Popen([sys.executable, '-c', 'import os, time; os.close(1), time.sleep(2)'], @@ -3131,7 +3367,7 @@ class Win32ProcessTestCase(BaseTestCase): p.stdout.read(1) getattr(p, method)(*args) _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') returncode = p.wait() self.assertNotEqual(returncode, 0) @@ -3154,7 +3390,7 @@ class Win32ProcessTestCase(BaseTestCase): # This shouldn't raise even though the child is now dead getattr(p, method)(*args) _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') rc = p.wait() self.assertEqual(rc, 42) @@ -3263,7 +3499,7 @@ class MiscTests(unittest.TestCase): def test__all__(self): """Ensure that __all__ is populated properly.""" - intentionally_excluded = {"list2cmdline", "Handle"} + intentionally_excluded = {"list2cmdline", "Handle", "pwd", "grp"} exported = set(subprocess.__all__) possible_exports = set() import types @@ -3343,7 +3579,7 @@ class ContextManagerTests(BaseTestCase): stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc: self.assertEqual(proc.stdout.read(), b"stdout") - self.assertStderrEqual(proc.stderr.read(), b"stderr") + self.assertEqual(proc.stderr.read(), b"stderr") self.assertTrue(proc.stdout.closed) self.assertTrue(proc.stderr.closed) diff --git a/Lib/test/test_sunau.py b/Lib/test/test_sunau.py index 470a1007..7f1c0a5c 100644 --- a/Lib/test/test_sunau.py +++ b/Lib/test/test_sunau.py @@ -119,10 +119,6 @@ class SunauULAWTest(SunauTest, unittest.TestCase): frames = byteswap(frames, 2) -class SunauMiscTests(audiotests.AudioMiscTests, unittest.TestCase): - module = sunau - - class SunauLowLevelTest(unittest.TestCase): def test_read_bad_magic_number(self): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 80e652d7..b5a16f9c 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -1,4 +1,3 @@ -import contextlib import errno import importlib import io @@ -14,6 +13,7 @@ import time import unittest from test import support from test.support import script_helper +from test.support import socket_helper TESTFN = support.TESTFN @@ -91,17 +91,17 @@ class TestSupport(unittest.TestCase): support.rmtree('__pycache__') def test_HOST(self): - s = socket.create_server((support.HOST, 0)) + s = socket.create_server((socket_helper.HOST, 0)) s.close() def test_find_unused_port(self): - port = support.find_unused_port() - s = socket.create_server((support.HOST, port)) + port = socket_helper.find_unused_port() + s = socket.create_server((socket_helper.HOST, port)) s.close() def test_bind_port(self): s = socket.socket() - support.bind_port(s) + socket_helper.bind_port(s) s.listen() s.close() @@ -176,13 +176,10 @@ class TestSupport(unittest.TestCase): with support.temp_cwd() as temp_path: pid = os.fork() if pid != 0: - # parent process (child has pid == 0) + # parent process # wait for the child to terminate - (pid, status) = os.waitpid(pid, 0) - if status != 0: - raise AssertionError(f"Child process failed with exit " - f"status indication 0x{status:x}.") + support.wait_process(pid, exitcode=0) # Make sure that temp_path is still present. When the child # process leaves the 'temp_cwd'-context, the __exit__()- @@ -422,7 +419,7 @@ class TestSupport(unittest.TestCase): os._exit(0) t0 = time.monotonic() - deadline = time.monotonic() + 60.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT was_altered = support.environment_altered try: @@ -497,7 +494,6 @@ class TestSupport(unittest.TestCase): ['-Wignore', '-X', 'dev'], ['-X', 'faulthandler'], ['-X', 'importtime'], - ['-X', 'showalloccount'], ['-X', 'showrefcount'], ['-X', 'tracemalloc'], ['-X', 'tracemalloc=3'], @@ -675,7 +671,6 @@ class TestSupport(unittest.TestCase): # run_doctest # threading_cleanup # reap_threads - # strip_python_stderr # can_symlink # skip_unless_symlink # SuppressCrashReport diff --git a/Lib/test/test_symtable.py b/Lib/test/test_symtable.py index 98d718c8..d1935588 100644 --- a/Lib/test/test_symtable.py +++ b/Lib/test/test_symtable.py @@ -65,7 +65,6 @@ class SymtableTest(unittest.TestCase): def test_optimized(self): self.assertFalse(self.top.is_optimized()) - self.assertFalse(self.top.has_exec()) self.assertTrue(self.spam.is_optimized()) diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 128c4da1..d6583b9d 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -124,10 +124,109 @@ SyntaxError: cannot assign to __debug__ Traceback (most recent call last): SyntaxError: cannot assign to operator +>>> [a, b[1], c + 1] = [1, 2, 3] +Traceback (most recent call last): +SyntaxError: cannot assign to operator + +>>> [a, b.c.d, c + 1] = [1, 2, 3] +Traceback (most recent call last): +SyntaxError: cannot assign to operator + >>> a if 1 else b = 1 Traceback (most recent call last): SyntaxError: cannot assign to conditional expression +>>> True = True = 3 +Traceback (most recent call last): +SyntaxError: cannot assign to True + +>>> x = y = True = z = 3 +Traceback (most recent call last): +SyntaxError: cannot assign to True + +>>> x = y = yield = 1 +Traceback (most recent call last): +SyntaxError: assignment to yield expression not possible + +>>> a, b += 1, 2 +Traceback (most recent call last): +SyntaxError: 'tuple' is an illegal expression for augmented assignment + +>>> (a, b) += 1, 2 +Traceback (most recent call last): +SyntaxError: 'tuple' is an illegal expression for augmented assignment + +>>> [a, b] += 1, 2 +Traceback (most recent call last): +SyntaxError: 'list' is an illegal expression for augmented assignment + +Invalid targets in `for` loops and `with` statements should also +produce a specialized error message + +>>> for a() in b: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> for (a, b()) in b: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> for [a, b()] in b: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> for (*a, b, c+1) in b: pass +Traceback (most recent call last): +SyntaxError: cannot assign to operator + +>>> for (x, *(y, z.d())) in b: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> for a, b() in c: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> for i < (): pass +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> for a, b +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> with a as b(): pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> with a as (b, c()): pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> with a as [b, c()]: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> with a as (*b, c, d+1): pass +Traceback (most recent call last): +SyntaxError: cannot assign to operator + +>>> with a as (x, *(y, z.d())): pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> with a as b, c as d(): pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> with a as b +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> p = p = +Traceback (most recent call last): +SyntaxError: invalid syntax + From compiler_complex_args(): >>> def f(None=1): @@ -135,7 +234,6 @@ From compiler_complex_args(): Traceback (most recent call last): SyntaxError: invalid syntax - From ast_for_arguments(): >>> def f(x, y=1, z): @@ -158,6 +256,16 @@ SyntaxError: invalid syntax Traceback (most recent call last): SyntaxError: invalid syntax +>>> import ast; ast.parse(''' +... def f( +... *, # type: int +... a, # type: int +... ): +... pass +... ''', type_comments=True) +Traceback (most recent call last): +SyntaxError: bare * has associated type comment + From ast_for_funcdef(): @@ -297,47 +405,50 @@ SyntaxError: invalid syntax ... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) ->>> f(lambda x: x[0] = 3) -Traceback (most recent call last): -SyntaxError: expression cannot contain assignment, perhaps you meant "=="? +# >>> f(lambda x: x[0] = 3) +# Traceback (most recent call last): +# SyntaxError: expression cannot contain assignment, perhaps you meant "=="? The grammar accepts any test (basically, any expression) in the keyword slot of a call site. Test a few different options. ->>> f(x()=2) -Traceback (most recent call last): -SyntaxError: expression cannot contain assignment, perhaps you meant "=="? ->>> f(a or b=1) -Traceback (most recent call last): -SyntaxError: expression cannot contain assignment, perhaps you meant "=="? ->>> f(x.y=1) -Traceback (most recent call last): -SyntaxError: expression cannot contain assignment, perhaps you meant "=="? ->>> f((x)=2) -Traceback (most recent call last): -SyntaxError: expression cannot contain assignment, perhaps you meant "=="? ->>> f(True=2) -Traceback (most recent call last): -SyntaxError: cannot assign to True +# >>> f(x()=2) +# Traceback (most recent call last): +# SyntaxError: expression cannot contain assignment, perhaps you meant "=="? +# >>> f(a or b=1) +# Traceback (most recent call last): +# SyntaxError: expression cannot contain assignment, perhaps you meant "=="? +# >>> f(x.y=1) +# Traceback (most recent call last): +# SyntaxError: expression cannot contain assignment, perhaps you meant "=="? +# >>> f((x)=2) +# Traceback (most recent call last): +# SyntaxError: expression cannot contain assignment, perhaps you meant "=="? +# >>> f(True=2) +# Traceback (most recent call last): +# SyntaxError: cannot assign to True >>> f(__debug__=1) Traceback (most recent call last): SyntaxError: cannot assign to __debug__ +>>> __debug__: int +Traceback (most recent call last): +SyntaxError: cannot assign to __debug__ More set_context(): >>> (x for x in x) += 1 Traceback (most recent call last): -SyntaxError: cannot assign to generator expression +SyntaxError: 'generator expression' is an illegal expression for augmented assignment >>> None += 1 Traceback (most recent call last): -SyntaxError: cannot assign to None +SyntaxError: 'None' is an illegal expression for augmented assignment >>> __debug__ += 1 Traceback (most recent call last): SyntaxError: cannot assign to __debug__ >>> f() += 1 Traceback (most recent call last): -SyntaxError: cannot assign to function call +SyntaxError: 'function call' is an illegal expression for augmented assignment Test continue in finally in weird combinations. @@ -588,7 +699,7 @@ Make sure that the old "raise X, Y[, Z]" form is gone: >>> f(a=23, a=234) Traceback (most recent call last): ... -SyntaxError: keyword argument repeated +SyntaxError: keyword argument repeated: a >>> {1, 2, 3} = 42 Traceback (most recent call last): @@ -606,6 +717,27 @@ SyntaxError: cannot assign to f-string expression Traceback (most recent call last): SyntaxError: cannot assign to f-string expression +>>> from t import x, +Traceback (most recent call last): +SyntaxError: trailing comma not allowed without surrounding parentheses + +>>> from t import x,y, +Traceback (most recent call last): +SyntaxError: trailing comma not allowed without surrounding parentheses + +>>> (): int +Traceback (most recent call last): +SyntaxError: only single target (not tuple) can be annotated +>>> []: int +Traceback (most recent call last): +SyntaxError: only single target (not list) can be annotated +>>> (()): int +Traceback (most recent call last): +SyntaxError: only single target (not tuple) can be annotated +>>> ([]): int +Traceback (most recent call last): +SyntaxError: only single target (not list) can be annotated + Corner-cases that used to fail to raise the correct error: >>> def f(*, x=lambda __debug__:0): pass @@ -634,6 +766,9 @@ Corner-cases that used to crash: Traceback (most recent call last): SyntaxError: cannot assign to __debug__ + >>> import ä £ + Traceback (most recent call last): + SyntaxError: invalid character '£' (U+00A3) """ import re @@ -658,7 +793,7 @@ class SyntaxTestCase(unittest.TestCase): self.fail("SyntaxError is not a %s" % subclass.__name__) mo = re.search(errtext, str(err)) if mo is None: - self.fail("SyntaxError did not contain '%r'" % (errtext,)) + self.fail("SyntaxError did not contain %r" % (errtext,)) self.assertEqual(err.filename, filename) if lineno is not None: self.assertEqual(err.lineno, lineno) @@ -670,8 +805,37 @@ class SyntaxTestCase(unittest.TestCase): def test_assign_call(self): self._check_error("f() = 1", "assign") + @unittest.skipIf(support.use_old_parser(), "The old parser cannot generate these error messages") def test_assign_del(self): - self._check_error("del f()", "delete") + self._check_error("del (,)", "invalid syntax") + self._check_error("del 1", "delete literal") + self._check_error("del (1, 2)", "delete literal") + self._check_error("del None", "delete None") + self._check_error("del *x", "delete starred") + self._check_error("del (*x)", "use starred expression") + self._check_error("del (*x,)", "delete starred") + self._check_error("del [*x,]", "delete starred") + self._check_error("del f()", "delete function call") + self._check_error("del f(a, b)", "delete function call") + self._check_error("del o.f()", "delete function call") + self._check_error("del a[0]()", "delete function call") + self._check_error("del x, f()", "delete function call") + self._check_error("del f(), x", "delete function call") + self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call") + self._check_error("del (a if True else b)", "delete conditional") + self._check_error("del +a", "delete operator") + self._check_error("del a, +b", "delete operator") + self._check_error("del a + b", "delete operator") + self._check_error("del (a + b, c)", "delete operator") + self._check_error("del (c[0], a + b)", "delete operator") + self._check_error("del a.b.c + 2", "delete operator") + self._check_error("del a.b.c[0] + 2", "delete operator") + self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator") + self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator") + self._check_error("del (a := 5)", "delete named expression") + # We don't have a special message for this, but make sure we don't + # report "cannot delete name" + self._check_error("del a += b", "invalid syntax") def test_global_param_err_first(self): source = """if 1: @@ -766,6 +930,20 @@ class SyntaxTestCase(unittest.TestCase): "iterable argument unpacking follows " "keyword argument unpacking") + def test_empty_line_after_linecont(self): + # See issue-40847 + s = r"""\ +pass + \ + +pass +""" + try: + compile(s, '', 'exec') + except SyntaxError: + self.fail("Empty line after a line continuation character is valid.") + + def test_main(): support.run_unittest(SyntaxTestCase) from test import test_syntax diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index af0e54bd..d7915135 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -187,15 +187,6 @@ class SysModuleTest(unittest.TestCase): # testing sys.settrace() is done in test_sys_settrace.py # testing sys.setprofile() is done in test_sys_setprofile.py - def test_setcheckinterval(self): - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - self.assertRaises(TypeError, sys.setcheckinterval) - orig = sys.getcheckinterval() - for n in 0, 100, 120, orig: # orig last to restore starting state - sys.setcheckinterval(n) - self.assertEqual(sys.getcheckinterval(), n) - def test_switchinterval(self): self.assertRaises(TypeError, sys.setswitchinterval) self.assertRaises(TypeError, sys.setswitchinterval, "a") @@ -250,7 +241,7 @@ class SysModuleTest(unittest.TestCase): # mark". Otherwise, it may not be possible anymore to # reset the overflowed flag to 0. - from _testcapi import get_recursion_depth + from _testinternalcapi import get_recursion_depth def set_recursion_limit_at_depth(depth, limit): recursion_depth = get_recursion_depth() @@ -278,6 +269,8 @@ class SysModuleTest(unittest.TestCase): finally: sys.setrecursionlimit(oldlimit) + # The error message is specific to CPython + @test.support.cpython_only def test_recursionlimit_fatalerror(self): # A fatal error occurs if a second recursion limit is hit when recovering # from a first one. @@ -299,7 +292,8 @@ class SysModuleTest(unittest.TestCase): err = sub.communicate()[1] self.assertTrue(sub.returncode, sub.returncode) self.assertIn( - b"Fatal Python error: Cannot recover from stack overflow", + b"Fatal Python error: _Py_CheckRecursiveCall: " + b"Cannot recover from stack overflow", err) def test_getwindowsversion(self): @@ -492,6 +486,7 @@ class SysModuleTest(unittest.TestCase): self.assertIsInstance(sys.platform, str) self.assertIsInstance(sys.prefix, str) self.assertIsInstance(sys.base_prefix, str) + self.assertIsInstance(sys.platlibdir, str) self.assertIsInstance(sys.version, str) vi = sys.version_info self.assertIsInstance(vi[:], tuple) @@ -551,10 +546,10 @@ class SysModuleTest(unittest.TestCase): def test_sys_flags(self): self.assertTrue(sys.flags) attrs = ("debug", - "inspect", "interactive", "optimize", "dont_write_bytecode", - "no_user_site", "no_site", "ignore_environment", "verbose", - "bytes_warning", "quiet", "hash_randomization", "isolated", - "dev_mode", "utf8_mode") + "inspect", "interactive", "optimize", + "dont_write_bytecode", "no_user_site", "no_site", + "ignore_environment", "verbose", "bytes_warning", "quiet", + "hash_randomization", "isolated", "dev_mode", "utf8_mode") for attr in attrs: self.assertTrue(hasattr(sys.flags, attr), attr) attr_type = bool if attr == "dev_mode" else int @@ -828,7 +823,6 @@ class SysModuleTest(unittest.TestCase): c = sys.getallocatedblocks() self.assertIn(c, range(b - 50, b + 50)) - @test.support.requires_type_collecting def test_is_finalizing(self): self.assertIs(sys.is_finalizing(), False) # Don't use the atexit module because _Py_Finalizing is only set @@ -850,7 +844,6 @@ class SysModuleTest(unittest.TestCase): rc, stdout, stderr = assert_python_ok('-c', code) self.assertEqual(stdout.rstrip(), b'True') - @test.support.requires_type_collecting def test_issue20602(self): # sys.flags and sys.float_info were wiped during shutdown. code = """if 1: @@ -866,6 +859,23 @@ class SysModuleTest(unittest.TestCase): self.assertIn(b'sys.flags', out[0]) self.assertIn(b'sys.float_info', out[1]) + def test_sys_ignores_cleaning_up_user_data(self): + code = """if 1: + import struct, sys + + class C: + def __init__(self): + self.pack = struct.pack + def __del__(self): + self.pack('I', -42) + + sys.x = C() + """ + rc, stdout, stderr = assert_python_ok('-c', code) + self.assertEqual(rc, 0) + self.assertEqual(stdout.rstrip(), b"") + self.assertEqual(stderr.rstrip(), b"") + @unittest.skipUnless(hasattr(sys, 'getandroidapilevel'), 'need sys.getandroidapilevel()') def test_getandroidapilevel(self): @@ -1047,8 +1057,8 @@ class SizeofTest(unittest.TestCase): def setUp(self): self.P = struct.calcsize('P') self.longdigit = sys.int_info.sizeof_digit - import _testcapi - self.gc_headsize = _testcapi.SIZEOF_PYGC_HEAD + import _testinternalcapi + self.gc_headsize = _testinternalcapi.SIZEOF_PYGC_HEAD check_sizeof = test.support.check_sizeof @@ -1231,7 +1241,7 @@ class SizeofTest(unittest.TestCase): # list samples = [[], [1,2,3], ['1', '2', '3']] for sample in samples: - check(sample, vsize('Pn') + len(sample)*self.P) + check(list(sample), vsize('Pn') + len(sample)*self.P) # sortwrapper (list) # XXX # cmpwrapper (list) @@ -1303,9 +1313,7 @@ class SizeofTest(unittest.TestCase): check((1,2,3), vsize('') + 3*self.P) # type # static type: PyTypeObject - fmt = 'P2nPI13Pl4Pn9Pn11PIPPP' - if hasattr(sys, 'getcounts'): - fmt += '3n2P' + fmt = 'P2nPI13Pl4Pn9Pn11PIPP' s = vsize(fmt) check(int, s) # class @@ -1315,7 +1323,7 @@ class SizeofTest(unittest.TestCase): '3P' # PyMappingMethods '10P' # PySequenceMethods '2P' # PyBufferProcs - '4P') + '5P') class newstyleclass(object): pass # Separate block for PyDictKeysObject with 8 keys and 5 entries check(newstyleclass, s + calcsize("2nP2n0P") + 8 + 5*calcsize("n2P")) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index fdd78947..482e918a 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -161,8 +161,8 @@ def raises(): def test_raise(): try: raises() - except Exception as exc: - x = 1 + except Exception: + pass test_raise.events = [(0, 'call'), (1, 'line'), @@ -191,7 +191,7 @@ def _settrace_and_raise(tracefunc): def settrace_and_raise(tracefunc): try: _settrace_and_raise(tracefunc) - except RuntimeError as exc: + except RuntimeError: pass settrace_and_raise.events = [(2, 'exception'), @@ -481,6 +481,127 @@ class TraceTestCase(unittest.TestCase): [(0, 'call'), (1, 'line')]) + def test_18_except_with_name(self): + def func(): + try: + try: + raise Exception + except Exception as e: + raise + x = "Something" + y = "Something" + except Exception: + pass + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'exception'), + (4, 'line'), + (5, 'line'), + (8, 'line'), + (9, 'line'), + (9, 'return')]) + + def test_19_except_with_finally(self): + def func(): + try: + try: + raise Exception + finally: + y = "Something" + except Exception: + b = 23 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'exception'), + (5, 'line'), + (6, 'line'), + (7, 'line'), + (7, 'return')]) + + def test_20_async_for_loop(self): + class AsyncIteratorWrapper: + def __init__(self, obj): + self._it = iter(obj) + + def __aiter__(self): + return self + + async def __anext__(self): + try: + return next(self._it) + except StopIteration: + raise StopAsyncIteration + + async def doit_async(): + async for letter in AsyncIteratorWrapper("abc"): + x = letter + y = 42 + + def run(tracer): + x = doit_async() + try: + sys.settrace(tracer) + x.send(None) + finally: + sys.settrace(None) + + tracer = self.make_tracer() + events = [ + (0, 'call'), + (1, 'line'), + (-12, 'call'), + (-11, 'line'), + (-11, 'return'), + (-9, 'call'), + (-8, 'line'), + (-8, 'return'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'exception'), + (-3, 'line'), + (-2, 'line'), + (-2, 'exception'), + (-2, 'return'), + (1, 'exception'), + (3, 'line'), + (3, 'return')] + try: + run(tracer.trace) + except Exception: + pass + self.compare_events(doit_async.__code__.co_firstlineno, + tracer.events, events) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" @@ -827,8 +948,8 @@ class JumpTestCase(unittest.TestCase): output.append(11) output.append(12) - @jump_test(5, 11, [2, 4, 12]) - def test_jump_over_return_try_finally_in_finally_block(output): + @jump_test(5, 11, [2, 4], (ValueError, 'unreachable')) + def test_no_jump_over_return_try_finally_in_finally_block(output): try: output.append(2) finally: @@ -842,8 +963,8 @@ class JumpTestCase(unittest.TestCase): pass output.append(12) - @jump_test(3, 4, [1, 4]) - def test_jump_infinite_while_loop(output): + @jump_test(3, 4, [1], (ValueError, 'unreachable')) + def test_no_jump_infinite_while_loop(output): output.append(1) while True: output.append(3) @@ -1236,16 +1357,16 @@ class JumpTestCase(unittest.TestCase): output.append(7) output.append(8) - @jump_test(1, 5, [], (ValueError, "into a 'finally'")) - def test_no_jump_into_finally_block(output): + @jump_test(1, 5, [5]) + def test_jump_into_finally_block(output): output.append(1) try: output.append(3) finally: output.append(5) - @jump_test(3, 6, [2, 5, 6], (ValueError, "into a 'finally'")) - def test_no_jump_into_finally_block_from_try_block(output): + @jump_test(3, 6, [2, 6, 7]) + def test_jump_into_finally_block_from_try_block(output): try: output.append(2) output.append(3) @@ -1254,8 +1375,8 @@ class JumpTestCase(unittest.TestCase): output.append(6) output.append(7) - @jump_test(5, 1, [1, 3], (ValueError, "out of a 'finally'")) - def test_no_jump_out_of_finally_block(output): + @jump_test(5, 1, [1, 3, 1, 3, 5]) + def test_jump_out_of_finally_block(output): output.append(1) try: output.append(3) @@ -1320,23 +1441,23 @@ class JumpTestCase(unittest.TestCase): output.append(6) output.append(7) - @jump_test(3, 5, [1, 2, -2], (ValueError, 'into')) - def test_no_jump_between_with_blocks(output): + @jump_test(3, 5, [1, 2, 5, -2]) + def test_jump_between_with_blocks(output): output.append(1) with tracecontext(output, 2): output.append(3) with tracecontext(output, 4): output.append(5) - @async_jump_test(3, 5, [1, 2, -2], (ValueError, 'into')) - async def test_no_jump_between_async_with_blocks(output): + @async_jump_test(3, 5, [1, 2, 5, -2]) + async def test_jump_between_async_with_blocks(output): output.append(1) async with asynctracecontext(output, 2): output.append(3) async with asynctracecontext(output, 4): output.append(5) - @jump_test(5, 7, [2, 4], (ValueError, 'finally')) + @jump_test(5, 7, [2, 4], (ValueError, "unreachable")) def test_no_jump_over_return_out_of_finally_block(output): try: output.append(2) @@ -1430,9 +1551,8 @@ output.append(4) output.append(1) 1 / 0 - @jump_test(3, 2, [2], event='return', error=(ValueError, - "can't jump from a yield statement")) - def test_no_jump_from_yield(output): + @jump_test(3, 2, [2, 5], event='return') + def test_jump_from_yield(output): def gen(): output.append(2) yield 3 diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index b512168d..3ddeb97f 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -11,7 +11,7 @@ import unittest.mock import tarfile from test import support -from test.support import script_helper, requires_hashdigest +from test.support import script_helper # Check for our compression modules. try: @@ -57,21 +57,21 @@ class TarTest: def mode(self): return self.prefix + self.suffix -@support.requires_gzip +@support.requires_gzip() class GzipTest: tarname = gzipname suffix = 'gz' open = gzip.GzipFile if gzip else None taropen = tarfile.TarFile.gzopen -@support.requires_bz2 +@support.requires_bz2() class Bz2Test: tarname = bz2name suffix = 'bz2' open = bz2.BZ2File if bz2 else None taropen = tarfile.TarFile.bz2open -@support.requires_lzma +@support.requires_lzma() class LzmaTest: tarname = xzname suffix = 'xz' @@ -319,6 +319,38 @@ class LzmaListTest(LzmaTest, ListTest): class CommonReadTest(ReadTest): + def test_is_tarfile_erroneous(self): + with open(tmpname, "wb"): + pass + + # is_tarfile works on filenames + self.assertFalse(tarfile.is_tarfile(tmpname)) + + # is_tarfile works on path-like objects + self.assertFalse(tarfile.is_tarfile(pathlib.Path(tmpname))) + + # is_tarfile works on file objects + with open(tmpname, "rb") as fobj: + self.assertFalse(tarfile.is_tarfile(fobj)) + + # is_tarfile works on file-like objects + self.assertFalse(tarfile.is_tarfile(io.BytesIO(b"invalid"))) + + def test_is_tarfile_valid(self): + # is_tarfile works on filenames + self.assertTrue(tarfile.is_tarfile(self.tarname)) + + # is_tarfile works on path-like objects + self.assertTrue(tarfile.is_tarfile(pathlib.Path(self.tarname))) + + # is_tarfile works on file objects + with open(self.tarname, "rb") as fobj: + self.assertTrue(tarfile.is_tarfile(fobj)) + + # is_tarfile works on file-like objects + with open(self.tarname, "rb") as fobj: + self.assertTrue(tarfile.is_tarfile(io.BytesIO(fobj.read()))) + def test_empty_tarfile(self): # Test for issue6123: Allow opening empty archives. # This test checks if tarfile.open() is able to open an empty tar @@ -354,7 +386,7 @@ class CommonReadTest(ReadTest): def test_ignore_zeros(self): # Test TarFile's ignore_zeros option. # generate 512 pseudorandom bytes - data = Random(0).getrandbits(512*8).to_bytes(512, 'big') + data = Random(0).randbytes(512) for char in (b'\0', b'a'): # Test if EOFHeaderError ('\0') and InvalidHeaderError ('a') # are ignored correctly. @@ -1524,6 +1556,52 @@ class GNUWriteTest(unittest.TestCase): ("longlnk/" * 127) + "longlink_") +class DeviceHeaderTest(WriteTestBase, unittest.TestCase): + + prefix = "w:" + + def test_headers_written_only_for_device_files(self): + # Regression test for bpo-18819. + tempdir = os.path.join(TEMPDIR, "device_header_test") + os.mkdir(tempdir) + try: + tar = tarfile.open(tmpname, self.mode) + try: + input_blk = tarfile.TarInfo(name="my_block_device") + input_reg = tarfile.TarInfo(name="my_regular_file") + input_blk.type = tarfile.BLKTYPE + input_reg.type = tarfile.REGTYPE + tar.addfile(input_blk) + tar.addfile(input_reg) + finally: + tar.close() + + # devmajor and devminor should be *interpreted* as 0 in both... + tar = tarfile.open(tmpname, "r") + try: + output_blk = tar.getmember("my_block_device") + output_reg = tar.getmember("my_regular_file") + finally: + tar.close() + self.assertEqual(output_blk.devmajor, 0) + self.assertEqual(output_blk.devminor, 0) + self.assertEqual(output_reg.devmajor, 0) + self.assertEqual(output_reg.devminor, 0) + + # ...but the fields should not actually be set on regular files: + with open(tmpname, "rb") as infile: + buf = infile.read() + buf_blk = buf[output_blk.offset:output_blk.offset_data] + buf_reg = buf[output_reg.offset:output_reg.offset_data] + # See `struct posixheader` in GNU docs for byte offsets: + # + device_headers = slice(329, 329 + 16) + self.assertEqual(buf_blk[device_headers], b"0000000\0" * 2) + self.assertEqual(buf_reg[device_headers], b"\0" * 16) + finally: + support.rmtree(tempdir) + + class CreateTest(WriteTestBase, unittest.TestCase): prefix = "x:" @@ -2234,7 +2312,8 @@ class CommandLineTest(unittest.TestCase): def test_test_command_verbose(self): for tar_name in testtarnames: for opt in '-v', '--verbose': - out = self.tarfilecmd(opt, '-t', tar_name) + out = self.tarfilecmd(opt, '-t', tar_name, + PYTHONIOENCODING='utf-8') self.assertIn(b'is a tar archive.\n', out) def test_test_command_invalid_file(self): @@ -2305,7 +2384,8 @@ class CommandLineTest(unittest.TestCase): 'and-utf8-bom-sig-only.txt')] for opt in '-v', '--verbose': try: - out = self.tarfilecmd(opt, '-c', tmpname, *files) + out = self.tarfilecmd(opt, '-c', tmpname, *files, + PYTHONIOENCODING='utf-8') self.assertIn(b' file created.', out) with tarfile.open(tmpname) as tar: tar.getmembers() @@ -2363,7 +2443,8 @@ class CommandLineTest(unittest.TestCase): for opt in '-v', '--verbose': try: with support.temp_cwd(tarextdir): - out = self.tarfilecmd(opt, '-e', tmpname) + out = self.tarfilecmd(opt, '-e', tmpname, + PYTHONIOENCODING='utf-8') self.assertIn(b' file is extracted.', out) finally: support.rmtree(tarextdir) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index 3183ea85..1c5b9cf2 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -3,6 +3,7 @@ import re import subprocess import sys import os +import warnings from test import support # Skip this test if the _tkinter module wasn't built. @@ -573,9 +574,12 @@ class TclTest(unittest.TestCase): def test_split(self): split = self.interp.tk.split call = self.interp.tk.call - self.assertRaises(TypeError, split) - self.assertRaises(TypeError, split, 'a', 'b') - self.assertRaises(TypeError, split, 2) + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', r'\bsplit\b.*\bsplitlist\b', + DeprecationWarning) + self.assertRaises(TypeError, split) + self.assertRaises(TypeError, split, 'a', 'b') + self.assertRaises(TypeError, split, 2) testcases = [ ('2', '2'), ('', ''), @@ -617,7 +621,8 @@ class TclTest(unittest.TestCase): expected), ] for arg, res in testcases: - self.assertEqual(split(arg), res, msg=arg) + with self.assertWarns(DeprecationWarning): + self.assertEqual(split(arg), res, msg=arg) def test_splitdict(self): splitdict = tkinter._splitdict diff --git a/Lib/test/test_telnetlib.py b/Lib/test/test_telnetlib.py index 414c328b..7633901c 100644 --- a/Lib/test/test_telnetlib.py +++ b/Lib/test/test_telnetlib.py @@ -5,9 +5,10 @@ import threading import contextlib from test import support +from test.support import socket_helper import unittest -HOST = support.HOST +HOST = socket_helper.HOST def server(evt, serv): serv.listen() @@ -26,7 +27,7 @@ class GeneralTests(unittest.TestCase): self.evt = threading.Event() self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(60) # Safety net. Look issue 11812 - self.port = support.bind_port(self.sock) + self.port = socket_helper.bind_port(self.sock) self.thread = threading.Thread(target=server, args=(self.evt,self.sock)) self.thread.setDaemon(True) self.thread.start() diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index f129454f..fcc706ed 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -4,12 +4,12 @@ import errno import io import os import pathlib -import signal import sys import re import warnings import contextlib import stat +import types import weakref from unittest import mock @@ -200,15 +200,7 @@ class TestRandomNameSequence(BaseTestCase): child_value = os.read(read_fd, len(parent_value)).decode("ascii") finally: if pid: - # best effort to ensure the process can't bleed out - # via any bugs above - try: - os.kill(pid, signal.SIGKILL) - except OSError: - pass - - # Read the process exit status to avoid zombie process - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) os.close(read_fd) os.close(write_fd) @@ -1231,6 +1223,9 @@ class TestSpooledTemporaryFile(BaseTestCase): self.assertTrue(f._rolled) self.assertEqual(os.fstat(f.fileno()).st_size, 20) + def test_class_getitem(self): + self.assertIsInstance(tempfile.SpooledTemporaryFile[bytes], + types.GenericAlias) if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile: diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py index 9f4801f4..77e46f2c 100644 --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -225,30 +225,31 @@ class TestForkInThread(unittest.TestCase): @unittest.skipUnless(hasattr(os, 'fork'), 'need os.fork') @support.reap_threads def test_forkinthread(self): - status = "not set" + pid = None - def thread1(): - nonlocal status + def fork_thread(read_fd, write_fd): + nonlocal pid # fork in a thread pid = os.fork() - if pid == 0: - # child - try: - os.close(self.read_fd) - os.write(self.write_fd, b"OK") - finally: - os._exit(0) - else: - # parent - os.close(self.write_fd) - pid, status = os.waitpid(pid, 0) + if pid: + # parent process + return + + # child process + try: + os.close(read_fd) + os.write(write_fd, b"OK") + finally: + os._exit(0) with support.wait_threads_exit(): - thread.start_new_thread(thread1, ()) - self.assertEqual(os.read(self.read_fd, 2), b"OK", - "Unable to fork() in thread") - self.assertEqual(status, 0) + thread.start_new_thread(fork_thread, (self.read_fd, self.write_fd)) + self.assertEqual(os.read(self.read_fd, 2), b"OK") + os.close(self.write_fd) + + self.assertIsNotNone(pid) + support.wait_process(pid, exitcode=0) def tearDown(self): try: diff --git a/Lib/test/test_threaded_import.py b/Lib/test/test_threaded_import.py deleted file mode 100644 index 8607f363..00000000 --- a/Lib/test/test_threaded_import.py +++ /dev/null @@ -1,263 +0,0 @@ -# This is a variant of the very old (early 90's) file -# Demo/threads/bug.py. It simply provokes a number of threads into -# trying to import the same module "at the same time". -# There are no pleasant failure modes -- most likely is that Python -# complains several times about module random having no attribute -# randrange, and then Python hangs. - -import _imp as imp -import os -import importlib -import sys -import time -import shutil -import threading -import unittest -from unittest import mock -from test.support import ( - verbose, run_unittest, TESTFN, reap_threads, - forget, unlink, rmtree, start_threads) - -def task(N, done, done_tasks, errors): - try: - # We don't use modulefinder but still import it in order to stress - # importing of different modules from several threads. - if len(done_tasks) % 2: - import modulefinder - import random - else: - import random - import modulefinder - # This will fail if random is not completely initialized - x = random.randrange(1, 3) - except Exception as e: - errors.append(e.with_traceback(None)) - finally: - done_tasks.append(threading.get_ident()) - finished = len(done_tasks) == N - if finished: - done.set() - -def mock_register_at_fork(func): - # bpo-30599: Mock os.register_at_fork() when importing the random module, - # since this function doesn't allow to unregister callbacks and would leak - # memory. - return mock.patch('os.register_at_fork', create=True)(func) - -# Create a circular import structure: A -> C -> B -> D -> A -# NOTE: `time` is already loaded and therefore doesn't threaten to deadlock. - -circular_imports_modules = { - 'A': """if 1: - import time - time.sleep(%(delay)s) - x = 'a' - import C - """, - 'B': """if 1: - import time - time.sleep(%(delay)s) - x = 'b' - import D - """, - 'C': """import B""", - 'D': """import A""", -} - -class Finder: - """A dummy finder to detect concurrent access to its find_spec() - method.""" - - def __init__(self): - self.numcalls = 0 - self.x = 0 - self.lock = threading.Lock() - - def find_spec(self, name, path=None, target=None): - # Simulate some thread-unsafe behaviour. If calls to find_spec() - # are properly serialized, `x` will end up the same as `numcalls`. - # Otherwise not. - assert imp.lock_held() - with self.lock: - self.numcalls += 1 - x = self.x - time.sleep(0.01) - self.x = x + 1 - -class FlushingFinder: - """A dummy finder which flushes sys.path_importer_cache when it gets - called.""" - - def find_spec(self, name, path=None, target=None): - sys.path_importer_cache.clear() - - -class ThreadedImportTests(unittest.TestCase): - - def setUp(self): - self.old_random = sys.modules.pop('random', None) - - def tearDown(self): - # If the `random` module was already initialized, we restore the - # old module at the end so that pickling tests don't fail. - # See http://bugs.python.org/issue3657#msg110461 - if self.old_random is not None: - sys.modules['random'] = self.old_random - - @mock_register_at_fork - def check_parallel_module_init(self, mock_os): - if imp.lock_held(): - # This triggers on, e.g., from test import autotest. - raise unittest.SkipTest("can't run when import lock is held") - - done = threading.Event() - for N in (20, 50) * 3: - if verbose: - print("Trying", N, "threads ...", end=' ') - # Make sure that random and modulefinder get reimported freshly - for modname in ['random', 'modulefinder']: - try: - del sys.modules[modname] - except KeyError: - pass - errors = [] - done_tasks = [] - done.clear() - t0 = time.monotonic() - with start_threads(threading.Thread(target=task, - args=(N, done, done_tasks, errors,)) - for i in range(N)): - pass - completed = done.wait(10 * 60) - dt = time.monotonic() - t0 - if verbose: - print("%.1f ms" % (dt*1e3), flush=True, end=" ") - dbg_info = 'done: %s/%s' % (len(done_tasks), N) - self.assertFalse(errors, dbg_info) - self.assertTrue(completed, dbg_info) - if verbose: - print("OK.") - - def test_parallel_module_init(self): - self.check_parallel_module_init() - - def test_parallel_meta_path(self): - finder = Finder() - sys.meta_path.insert(0, finder) - try: - self.check_parallel_module_init() - self.assertGreater(finder.numcalls, 0) - self.assertEqual(finder.x, finder.numcalls) - finally: - sys.meta_path.remove(finder) - - def test_parallel_path_hooks(self): - # Here the Finder instance is only used to check concurrent calls - # to path_hook(). - finder = Finder() - # In order for our path hook to be called at each import, we need - # to flush the path_importer_cache, which we do by registering a - # dedicated meta_path entry. - flushing_finder = FlushingFinder() - def path_hook(path): - finder.find_spec('') - raise ImportError - sys.path_hooks.insert(0, path_hook) - sys.meta_path.append(flushing_finder) - try: - # Flush the cache a first time - flushing_finder.find_spec('') - numtests = self.check_parallel_module_init() - self.assertGreater(finder.numcalls, 0) - self.assertEqual(finder.x, finder.numcalls) - finally: - sys.meta_path.remove(flushing_finder) - sys.path_hooks.remove(path_hook) - - def test_import_hangers(self): - # In case this test is run again, make sure the helper module - # gets loaded from scratch again. - try: - del sys.modules['test.threaded_import_hangers'] - except KeyError: - pass - import test.threaded_import_hangers - self.assertFalse(test.threaded_import_hangers.errors) - - def test_circular_imports(self): - # The goal of this test is to exercise implementations of the import - # lock which use a per-module lock, rather than a global lock. - # In these implementations, there is a possible deadlock with - # circular imports, for example: - # - thread 1 imports A (grabbing the lock for A) which imports B - # - thread 2 imports B (grabbing the lock for B) which imports A - # Such implementations should be able to detect such situations and - # resolve them one way or the other, without freezing. - # NOTE: our test constructs a slightly less trivial import cycle, - # in order to better stress the deadlock avoidance mechanism. - delay = 0.5 - os.mkdir(TESTFN) - self.addCleanup(shutil.rmtree, TESTFN) - sys.path.insert(0, TESTFN) - self.addCleanup(sys.path.remove, TESTFN) - for name, contents in circular_imports_modules.items(): - contents = contents % {'delay': delay} - with open(os.path.join(TESTFN, name + ".py"), "wb") as f: - f.write(contents.encode('utf-8')) - self.addCleanup(forget, name) - - importlib.invalidate_caches() - results = [] - def import_ab(): - import A - results.append(getattr(A, 'x', None)) - def import_ba(): - import B - results.append(getattr(B, 'x', None)) - t1 = threading.Thread(target=import_ab) - t2 = threading.Thread(target=import_ba) - t1.start() - t2.start() - t1.join() - t2.join() - self.assertEqual(set(results), {'a', 'b'}) - - @mock_register_at_fork - def test_side_effect_import(self, mock_os): - code = """if 1: - import threading - def target(): - import random - t = threading.Thread(target=target) - t.start() - t.join() - t = None""" - sys.path.insert(0, os.curdir) - self.addCleanup(sys.path.remove, os.curdir) - filename = TESTFN + ".py" - with open(filename, "wb") as f: - f.write(code.encode('utf-8')) - self.addCleanup(unlink, filename) - self.addCleanup(forget, TESTFN) - self.addCleanup(rmtree, '__pycache__') - importlib.invalidate_caches() - __import__(TESTFN) - del sys.modules[TESTFN] - - -@reap_threads -def test_main(): - old_switchinterval = None - try: - old_switchinterval = sys.getswitchinterval() - sys.setswitchinterval(1e-5) - except AttributeError: - pass - try: - run_unittest(ThreadedImportTests) - finally: - if old_switchinterval is not None: - sys.setswitchinterval(old_switchinterval) - -if __name__ == "__main__": - test_main() diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index ac4e7a7e..81e5f70d 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -3,8 +3,7 @@ Tests for the threading module. """ import test.support -from test.support import (verbose, import_module, cpython_only, - requires_type_collecting) +from test.support import verbose, import_module, cpython_only from test.support.script_helper import assert_python_ok, assert_python_failure import random @@ -17,6 +16,7 @@ import weakref import os import subprocess import signal +import textwrap from test import lock_tests from test import support @@ -264,7 +264,7 @@ class ThreadTests(BaseTestCase): self.assertEqual(result, 1) # one thread state modified if verbose: print(" waiting for worker to say it caught the exception") - worker_saw_exception.wait(timeout=10) + worker_saw_exception.wait(timeout=support.SHORT_TIMEOUT) self.assertTrue(t.finished) if verbose: print(" all OK -- joining worker") @@ -287,7 +287,7 @@ class ThreadTests(BaseTestCase): finally: threading._start_new_thread = _start_new_thread - def test_finalize_runnning_thread(self): + def test_finalize_running_thread(self): # Issue 1402: the PyGILState_Ensure / _Release functions may be called # very late on python exit: on deallocation of a running thread for # example. @@ -421,8 +421,6 @@ class ThreadTests(BaseTestCase): t.setDaemon(True) t.getName() t.setName("name") - with self.assertWarnsRegex(DeprecationWarning, 'use is_alive()'): - t.isAlive() e = threading.Event() e.isSet() threading.activeCount() @@ -487,9 +485,7 @@ class ThreadTests(BaseTestCase): else: t.join() - pid, status = os.waitpid(pid, 0) - self.assertTrue(os.WIFEXITED(status)) - self.assertEqual(10, os.WEXITSTATUS(status)) + support.wait_process(pid, exitcode=10) def test_main_thread(self): main = threading.main_thread() @@ -509,6 +505,7 @@ class ThreadTests(BaseTestCase): def test_main_thread_after_fork(self): code = """if 1: import os, threading + from test import support pid = os.fork() if pid == 0: @@ -517,7 +514,7 @@ class ThreadTests(BaseTestCase): print(main.ident == threading.current_thread().ident) print(main.ident == threading.get_ident()) else: - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) """ _, out, err = assert_python_ok("-c", code) data = out.decode().replace('\r', '') @@ -530,6 +527,7 @@ class ThreadTests(BaseTestCase): def test_main_thread_after_fork_from_nonmain_thread(self): code = """if 1: import os, threading, sys + from test import support def f(): pid = os.fork() @@ -542,7 +540,7 @@ class ThreadTests(BaseTestCase): # we have to flush before exit. sys.stdout.flush() else: - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) th = threading.Thread(target=f) th.start() @@ -553,7 +551,6 @@ class ThreadTests(BaseTestCase): self.assertEqual(err, b"") self.assertEqual(data, "Thread-1\nTrue\nTrue\n") - @requires_type_collecting def test_main_thread_during_shutdown(self): # bpo-31516: current_thread() should still point to the main thread # at shutdown @@ -641,7 +638,7 @@ class ThreadTests(BaseTestCase): finish.release() # When the thread ends, the state_lock can be successfully # acquired. - self.assertTrue(tstate_lock.acquire(timeout=5), False) + self.assertTrue(tstate_lock.acquire(timeout=support.SHORT_TIMEOUT), False) # But is_alive() is still True: we hold _tstate_lock now, which # prevents is_alive() from knowing the thread's end-of-life C code # is done. @@ -762,6 +759,23 @@ class ThreadTests(BaseTestCase): # Daemon threads must never add it to _shutdown_locks. self.assertNotIn(tstate_lock, threading._shutdown_locks) + def test_locals_at_exit(self): + # bpo-19466: thread locals must not be deleted before destructors + # are called + rc, out, err = assert_python_ok("-c", """if 1: + import threading + + class Atexit: + def __del__(self): + print("thread_dict.atexit = %r" % thread_dict.atexit) + + thread_dict = threading.local() + thread_dict.atexit = "value" + + atexit = Atexit() + """) + self.assertEqual(out.rstrip(), b"thread_dict.atexit = 'value'") + class ThreadJoinOnShutdown(BaseTestCase): @@ -799,11 +813,15 @@ class ThreadJoinOnShutdown(BaseTestCase): def test_2_join_in_forked_process(self): # Like the test above, but from a forked interpreter script = """if 1: + from test import support + childpid = os.fork() if childpid != 0: - os.waitpid(childpid, 0) + # parent process + support.wait_process(childpid, exitcode=0) sys.exit(0) + # child process t = threading.Thread(target=joiningfunc, args=(threading.current_thread(),)) t.start() @@ -818,13 +836,17 @@ class ThreadJoinOnShutdown(BaseTestCase): # In the forked process, the main Thread object must be marked as stopped. script = """if 1: + from test import support + main_thread = threading.current_thread() def worker(): childpid = os.fork() if childpid != 0: - os.waitpid(childpid, 0) + # parent process + support.wait_process(childpid, exitcode=0) sys.exit(0) + # child process t = threading.Thread(target=joiningfunc, args=(main_thread,)) print('end of main') @@ -887,9 +909,9 @@ class ThreadJoinOnShutdown(BaseTestCase): # just fork a child process and wait it pid = os.fork() if pid > 0: - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=50) else: - os._exit(0) + os._exit(50) # start a bunch of threads that will fork() child processes threads = [] @@ -916,26 +938,30 @@ class ThreadJoinOnShutdown(BaseTestCase): if pid == 0: # check that threads states have been cleared if len(sys._current_frames()) == 1: - os._exit(0) + os._exit(51) else: - os._exit(1) + os._exit(52) else: - _, status = os.waitpid(pid, 0) - self.assertEqual(0, status) + support.wait_process(pid, exitcode=51) for t in threads: t.join() class SubinterpThreadingTests(BaseTestCase): + def pipe(self): + r, w = os.pipe() + self.addCleanup(os.close, r) + self.addCleanup(os.close, w) + if hasattr(os, 'set_blocking'): + os.set_blocking(r, False) + return (r, w) def test_threads_join(self): # Non-daemon threads should be joined at subinterpreter shutdown # (issue #18808) - r, w = os.pipe() - self.addCleanup(os.close, r) - self.addCleanup(os.close, w) - code = r"""if 1: + r, w = self.pipe() + code = textwrap.dedent(r""" import os import random import threading @@ -953,7 +979,7 @@ class SubinterpThreadingTests(BaseTestCase): threading.Thread(target=f).start() random_sleep() - """ % (w,) + """ % (w,)) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) # The thread was joined properly. @@ -964,10 +990,8 @@ class SubinterpThreadingTests(BaseTestCase): # Python code returned but before the thread state is deleted. # To achieve this, we register a thread-local object which sleeps # a bit when deallocated. - r, w = os.pipe() - self.addCleanup(os.close, r) - self.addCleanup(os.close, w) - code = r"""if 1: + r, w = self.pipe() + code = textwrap.dedent(r""" import os import random import threading @@ -992,7 +1016,7 @@ class SubinterpThreadingTests(BaseTestCase): threading.Thread(target=f).start() random_sleep() - """ % (w,) + """ % (w,)) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) # The thread was joined properly. @@ -1000,7 +1024,7 @@ class SubinterpThreadingTests(BaseTestCase): @cpython_only def test_daemon_threads_fatal_error(self): - subinterp_code = r"""if 1: + subinterp_code = f"""if 1: import os import threading import time @@ -1008,7 +1032,7 @@ class SubinterpThreadingTests(BaseTestCase): def f(): # Make sure the daemon thread is still running when # Py_EndInterpreter is called. - time.sleep(10) + time.sleep({test.support.SHORT_TIMEOUT}) threading.Thread(target=f, daemon=True).start() """ script = r"""if 1: @@ -1107,7 +1131,6 @@ class ThreadingExceptionTests(BaseTestCase): self.assertIn("ZeroDivisionError", err) self.assertNotIn("Unhandled exception", err) - @requires_type_collecting def test_print_exception_stderr_is_none_1(self): script = r"""if True: import sys @@ -1377,5 +1400,55 @@ class InterruptMainTests(unittest.TestCase): signal.signal(signal.SIGINT, handler) +class AtexitTests(unittest.TestCase): + + def test_atexit_output(self): + rc, out, err = assert_python_ok("-c", """if True: + import threading + + def run_last(): + print('parrot') + + threading._register_atexit(run_last) + """) + + self.assertFalse(err) + self.assertEqual(out.strip(), b'parrot') + + def test_atexit_called_once(self): + rc, out, err = assert_python_ok("-c", """if True: + import threading + from unittest.mock import Mock + + mock = Mock() + threading._register_atexit(mock) + mock.assert_not_called() + # force early shutdown to ensure it was called once + threading._shutdown() + mock.assert_called_once() + """) + + self.assertFalse(err) + + def test_atexit_after_shutdown(self): + # The only way to do this is by registering an atexit within + # an atexit, which is intended to raise an exception. + rc, out, err = assert_python_ok("-c", """if True: + import threading + + def func(): + pass + + def run_last(): + threading._register_atexit(func) + + threading._register_atexit(run_last) + """) + + self.assertTrue(err) + self.assertIn("RuntimeError: can't register atexit after shutdown", + err.decode()) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index 8d8d31e7..80e43faf 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -825,7 +825,7 @@ class CPyTimeTestCase: try: result = pytime_converter(value, time_rnd) expected = expected_func(value) - except Exception as exc: + except Exception: self.fail("Error on timestamp conversion: %s" % debug_info) self.assertEqual(result, expected, diff --git a/Lib/test/test_timeout.py b/Lib/test/test_timeout.py index b07c07cb..ac803f5d 100644 --- a/Lib/test/test_timeout.py +++ b/Lib/test/test_timeout.py @@ -3,6 +3,7 @@ import functools import unittest from test import support +from test.support import socket_helper # This requires the 'network' resource as given on the regrtest command line. skip_expected = not support.is_resource_enabled('network') @@ -19,7 +20,7 @@ def resolve_address(host, port): We must perform name resolution before timeout tests, otherwise it will be performed by connect(). """ - with support.transient_internet(host): + with socket_helper.transient_internet(host): return socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM)[0][4] @@ -79,24 +80,24 @@ class CreationTestCase(unittest.TestCase): def testTimeoutThenBlocking(self): # Test settimeout() followed by setblocking() self.sock.settimeout(10) - self.sock.setblocking(1) + self.sock.setblocking(True) self.assertEqual(self.sock.gettimeout(), None) - self.sock.setblocking(0) + self.sock.setblocking(False) self.assertEqual(self.sock.gettimeout(), 0.0) self.sock.settimeout(10) - self.sock.setblocking(0) + self.sock.setblocking(False) self.assertEqual(self.sock.gettimeout(), 0.0) - self.sock.setblocking(1) + self.sock.setblocking(True) self.assertEqual(self.sock.gettimeout(), None) def testBlockingThenTimeout(self): # Test setblocking() followed by settimeout() - self.sock.setblocking(0) + self.sock.setblocking(False) self.sock.settimeout(1) self.assertEqual(self.sock.gettimeout(), 1) - self.sock.setblocking(1) + self.sock.setblocking(True) self.sock.settimeout(1) self.assertEqual(self.sock.gettimeout(), 1) @@ -110,7 +111,7 @@ class TimeoutTestCase(unittest.TestCase): # solution. fuzz = 2.0 - localhost = support.HOST + localhost = socket_helper.HOST def setUp(self): raise NotImplementedError() @@ -199,10 +200,7 @@ class TCPTimeoutTestCase(TimeoutTestCase): skip = True sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - # Use a timeout of 3 seconds. Why 3? Because it's more than 1, and - # less than 5. i.e. no particular reason. Feel free to tweak it if - # you feel a different value would be more appropriate. - timeout = 3 + timeout = support.LOOPBACK_TIMEOUT sock.settimeout(timeout) try: sock.connect((whitehole)) @@ -232,25 +230,25 @@ class TCPTimeoutTestCase(TimeoutTestCase): # All that hard work just to test if connect times out in 0.001s ;-) self.addr_remote = blackhole - with support.transient_internet(self.addr_remote[0]): + with socket_helper.transient_internet(self.addr_remote[0]): self._sock_operation(1, 0.001, 'connect', self.addr_remote) def testRecvTimeout(self): # Test recv() timeout - with support.transient_internet(self.addr_remote[0]): + with socket_helper.transient_internet(self.addr_remote[0]): self.sock.connect(self.addr_remote) self._sock_operation(1, 1.5, 'recv', 1024) def testAcceptTimeout(self): # Test accept() timeout - support.bind_port(self.sock, self.localhost) + socket_helper.bind_port(self.sock, self.localhost) self.sock.listen() self._sock_operation(1, 1.5, 'accept') def testSend(self): # Test send() timeout with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv: - support.bind_port(serv, self.localhost) + socket_helper.bind_port(serv, self.localhost) serv.listen() self.sock.connect(serv.getsockname()) # Send a lot of data in order to bypass buffering in the TCP stack. @@ -259,7 +257,7 @@ class TCPTimeoutTestCase(TimeoutTestCase): def testSendto(self): # Test sendto() timeout with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv: - support.bind_port(serv, self.localhost) + socket_helper.bind_port(serv, self.localhost) serv.listen() self.sock.connect(serv.getsockname()) # The address argument is ignored since we already connected. @@ -269,7 +267,7 @@ class TCPTimeoutTestCase(TimeoutTestCase): def testSendall(self): # Test sendall() timeout with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv: - support.bind_port(serv, self.localhost) + socket_helper.bind_port(serv, self.localhost) serv.listen() self.sock.connect(serv.getsockname()) # Send a lot of data in order to bypass buffering in the TCP stack. @@ -288,7 +286,7 @@ class UDPTimeoutTestCase(TimeoutTestCase): def testRecvfromTimeout(self): # Test recvfrom() timeout # Prevent "Address already in use" socket exceptions - support.bind_port(self.sock, self.localhost) + socket_helper.bind_port(self.sock, self.localhost) self._sock_operation(1, 1.5, 'recvfrom', 1024) diff --git a/Lib/test/test_tools/__init__.py b/Lib/test/test_tools/__init__.py index 4d0fca33..eb9acad6 100644 --- a/Lib/test/test_tools/__init__.py +++ b/Lib/test/test_tools/__init__.py @@ -1,20 +1,33 @@ """Support functions for testing scripts in the Tools directory.""" -import os -import unittest +import contextlib import importlib +import os.path +import unittest from test import support -basepath = os.path.dirname( # - os.path.dirname( # Lib - os.path.dirname( # test - os.path.dirname(__file__)))) # test_tools +basepath = os.path.normpath( + os.path.dirname( # + os.path.dirname( # Lib + os.path.dirname( # test + os.path.dirname(__file__))))) # test_tools toolsdir = os.path.join(basepath, 'Tools') scriptsdir = os.path.join(toolsdir, 'scripts') -def skip_if_missing(): - if not os.path.isdir(scriptsdir): - raise unittest.SkipTest('scripts directory could not be found') +def skip_if_missing(tool=None): + if tool: + tooldir = os.path.join(toolsdir, tool) + else: + tool = 'scripts' + tooldir = scriptsdir + if not os.path.isdir(tooldir): + raise unittest.SkipTest(f'{tool} directory could not be found') + +@contextlib.contextmanager +def imports_under_tool(name, *subdirs): + tooldir = os.path.join(toolsdir, name, *subdirs) + with support.DirsOnSysPath(tooldir) as cm: + yield cm def import_tool(toolname): with support.DirsOnSysPath(scriptsdir): diff --git a/Lib/test/test_tools/test_c_analyzer/__init__.py b/Lib/test/test_tools/test_c_analyzer/__init__.py new file mode 100644 index 00000000..d0b4c045 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/__init__.py @@ -0,0 +1,15 @@ +import contextlib +import os.path +import test.test_tools +from test.support import load_package_tests + + +@contextlib.contextmanager +def tool_imports_for_tests(): + test.test_tools.skip_if_missing('c-analyzer') + with test.test_tools.imports_under_tool('c-analyzer'): + yield + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/__main__.py b/Lib/test/test_tools/test_c_analyzer/__main__.py new file mode 100644 index 00000000..b5b017de --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/__main__.py @@ -0,0 +1,5 @@ +from . import load_tests +import unittest + + +unittest.main() diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_common/__init__.py new file mode 100644 index 00000000..bc502ef3 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_common/__init__.py @@ -0,0 +1,6 @@ +import os.path +from test.support import load_package_tests + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/test_files.py b/Lib/test/test_tools/test_c_analyzer/test_common/test_files.py new file mode 100644 index 00000000..0c97d2a0 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_common/test_files.py @@ -0,0 +1,470 @@ +import os.path +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.files import ( + iter_files, _walk_tree, glob_tree, + ) + + +def fixpath(filename): + return filename.replace('/', os.path.sep) + + +class IterFilesTests(unittest.TestCase): + + maxDiff = None + + _return_walk = None + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + def set_files(self, *filesperroot): + roots = [] + result = [] + for root, files in filesperroot: + root = fixpath(root) + roots.append(root) + result.append([os.path.join(root, fixpath(f)) + for f in files]) + self._return_walk = result + return roots + + def _walk(self, root, *, suffix=None, walk=None): + self.calls.append(('_walk', (root, suffix, walk))) + return iter(self._return_walk.pop(0)) + + def _glob(self, root, *, suffix=None): + self.calls.append(('_glob', (root, suffix))) + return iter(self._return_walk.pop(0)) + + def test_typical(self): + dirnames = self.set_files( + ('spam', ['file1.c', 'file2.c']), + ('eggs', ['ham/file3.h']), + ) + suffixes = ('.c', '.h') + + files = list(iter_files(dirnames, suffixes, + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + fixpath('eggs/ham/file3.h'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', None, _walk_tree)), + ('_walk', ('eggs', None, _walk_tree)), + ]) + + def test_single_root(self): + self._return_walk = [ + [fixpath('spam/file1.c'), fixpath('spam/file2.c')], + ] + + files = list(iter_files('spam', '.c', + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', '.c', _walk_tree)), + ]) + + def test_one_root(self): + self._return_walk = [ + [fixpath('spam/file1.c'), fixpath('spam/file2.c')], + ] + + files = list(iter_files(['spam'], '.c', + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', '.c', _walk_tree)), + ]) + + def test_multiple_roots(self): + dirnames = self.set_files( + ('spam', ['file1.c', 'file2.c']), + ('eggs', ['ham/file3.c']), + ) + + files = list(iter_files(dirnames, '.c', + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + fixpath('eggs/ham/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', '.c', _walk_tree)), + ('_walk', ('eggs', '.c', _walk_tree)), + ]) + + def test_no_roots(self): + files = list(iter_files([], '.c', + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, []) + self.assertEqual(self.calls, []) + + def test_single_suffix(self): + self._return_walk = [ + [fixpath('spam/file1.c'), + fixpath('spam/eggs/file3.c'), + ], + ] + + files = list(iter_files('spam', '.c', + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/eggs/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', '.c', _walk_tree)), + ]) + + def test_one_suffix(self): + self._return_walk = [ + [fixpath('spam/file1.c'), + fixpath('spam/file1.h'), + fixpath('spam/file1.o'), + fixpath('spam/eggs/file3.c'), + ], + ] + + files = list(iter_files('spam', ['.c'], + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/eggs/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', None, _walk_tree)), + ]) + + def test_multiple_suffixes(self): + self._return_walk = [ + [fixpath('spam/file1.c'), + fixpath('spam/file1.h'), + fixpath('spam/file1.o'), + fixpath('spam/eggs/file3.c'), + ], + ] + + files = list(iter_files('spam', ('.c', '.h'), + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file1.h'), + fixpath('spam/eggs/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', None, _walk_tree)), + ]) + + def test_no_suffix(self): + expected = [fixpath('spam/file1.c'), + fixpath('spam/file1.h'), + fixpath('spam/file1.o'), + fixpath('spam/eggs/file3.c'), + ] + for suffix in (None, '', ()): + with self.subTest(suffix): + self.calls.clear() + self._return_walk = [list(expected)] + + files = list(iter_files('spam', suffix, + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, expected) + self.assertEqual(self.calls, [ + ('_walk', ('spam', suffix, _walk_tree)), + ]) + + def test_relparent(self): + dirnames = self.set_files( + ('/x/y/z/spam', ['file1.c', 'file2.c']), + ('/x/y/z/eggs', ['ham/file3.c']), + ) + + files = list(iter_files(dirnames, '.c', fixpath('/x/y'), + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('z/spam/file1.c'), + fixpath('z/spam/file2.c'), + fixpath('z/eggs/ham/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', (fixpath('/x/y/z/spam'), '.c', _walk_tree)), + ('_walk', (fixpath('/x/y/z/eggs'), '.c', _walk_tree)), + ]) + + def test_glob(self): + dirnames = self.set_files( + ('spam', ['file1.c', 'file2.c']), + ('eggs', ['ham/file3.c']), + ) + + files = list(iter_files(dirnames, '.c', + get_files=glob_tree, + _walk=self._walk, + _glob=self._glob)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + fixpath('eggs/ham/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_glob', ('spam', '.c')), + ('_glob', ('eggs', '.c')), + ]) + + + def test_alt_walk_func(self): + dirnames = self.set_files( + ('spam', ['file1.c', 'file2.c']), + ('eggs', ['ham/file3.c']), + ) + def get_files(root): + return None + + files = list(iter_files(dirnames, '.c', + get_files=get_files, + _walk=self._walk, + _glob=self._glob)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + fixpath('eggs/ham/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', '.c', get_files)), + ('_walk', ('eggs', '.c', get_files)), + ]) + + + + + + +# def test_no_dirnames(self): +# dirnames = [] +# filter_by_name = None +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, []) +# self.assertEqual(self.calls, []) +# +# def test_no_filter(self): +# self._return_walk = [ +# [('spam', (), ('file1', 'file2.c', 'file3.h', 'file4.o')), +# ], +# ] +# dirnames = [ +# 'spam', +# ] +# filter_by_name = None +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, [ +# fixpath('spam/file1'), +# fixpath('spam/file2.c'), +# fixpath('spam/file3.h'), +# fixpath('spam/file4.o'), +# ]) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ]) +# +# def test_no_files(self): +# self._return_walk = [ +# [('spam', (), ()), +# ], +# [(fixpath('eggs/ham'), (), ()), +# ], +# ] +# dirnames = [ +# 'spam', +# fixpath('eggs/ham'), +# ] +# filter_by_name = None +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, []) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ('_walk', (fixpath('eggs/ham'),)), +# ]) +# +# def test_tree(self): +# self._return_walk = [ +# [('spam', ('sub1', 'sub2', 'sub3'), ('file1',)), +# (fixpath('spam/sub1'), ('sub1sub1',), ('file2', 'file3')), +# (fixpath('spam/sub1/sub1sub1'), (), ('file4',)), +# (fixpath('spam/sub2'), (), ()), +# (fixpath('spam/sub3'), (), ('file5',)), +# ], +# [(fixpath('eggs/ham'), (), ('file6',)), +# ], +# ] +# dirnames = [ +# 'spam', +# fixpath('eggs/ham'), +# ] +# filter_by_name = None +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, [ +# fixpath('spam/file1'), +# fixpath('spam/sub1/file2'), +# fixpath('spam/sub1/file3'), +# fixpath('spam/sub1/sub1sub1/file4'), +# fixpath('spam/sub3/file5'), +# fixpath('eggs/ham/file6'), +# ]) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ('_walk', (fixpath('eggs/ham'),)), +# ]) +# +# def test_filter_suffixes(self): +# self._return_walk = [ +# [('spam', (), ('file1', 'file2.c', 'file3.h', 'file4.o')), +# ], +# ] +# dirnames = [ +# 'spam', +# ] +# filter_by_name = ('.c', '.h') +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, [ +# fixpath('spam/file2.c'), +# fixpath('spam/file3.h'), +# ]) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ]) +# +# def test_some_filtered(self): +# self._return_walk = [ +# [('spam', (), ('file1', 'file2', 'file3', 'file4')), +# ], +# ] +# dirnames = [ +# 'spam', +# ] +# def filter_by_name(filename, results=[False, True, False, True]): +# self.calls.append(('filter_by_name', (filename,))) +# return results.pop(0) +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, [ +# fixpath('spam/file2'), +# fixpath('spam/file4'), +# ]) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ('filter_by_name', ('file1',)), +# ('filter_by_name', ('file2',)), +# ('filter_by_name', ('file3',)), +# ('filter_by_name', ('file4',)), +# ]) +# +# def test_none_filtered(self): +# self._return_walk = [ +# [('spam', (), ('file1', 'file2', 'file3', 'file4')), +# ], +# ] +# dirnames = [ +# 'spam', +# ] +# def filter_by_name(filename, results=[True, True, True, True]): +# self.calls.append(('filter_by_name', (filename,))) +# return results.pop(0) +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, [ +# fixpath('spam/file1'), +# fixpath('spam/file2'), +# fixpath('spam/file3'), +# fixpath('spam/file4'), +# ]) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ('filter_by_name', ('file1',)), +# ('filter_by_name', ('file2',)), +# ('filter_by_name', ('file3',)), +# ('filter_by_name', ('file4',)), +# ]) +# +# def test_all_filtered(self): +# self._return_walk = [ +# [('spam', (), ('file1', 'file2', 'file3', 'file4')), +# ], +# ] +# dirnames = [ +# 'spam', +# ] +# def filter_by_name(filename, results=[False, False, False, False]): +# self.calls.append(('filter_by_name', (filename,))) +# return results.pop(0) +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, []) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ('filter_by_name', ('file1',)), +# ('filter_by_name', ('file2',)), +# ('filter_by_name', ('file3',)), +# ('filter_by_name', ('file4',)), +# ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/test_info.py b/Lib/test/test_tools/test_c_analyzer/test_common/test_info.py new file mode 100644 index 00000000..69dbb582 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_common/test_info.py @@ -0,0 +1,197 @@ +import string +import unittest + +from ..util import PseudoStr, StrProxy, Object +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.info import ( + UNKNOWN, + ID, + ) + + +class IDTests(unittest.TestCase): + + VALID_ARGS = ( + 'x/y/z/spam.c', + 'func', + 'eggs', + ) + VALID_KWARGS = dict(zip(ID._fields, VALID_ARGS)) + VALID_EXPECTED = VALID_ARGS + + def test_from_raw(self): + tests = [ + ('', None), + (None, None), + ('spam', (None, None, 'spam')), + (('spam',), (None, None, 'spam')), + (('x/y/z/spam.c', 'spam'), ('x/y/z/spam.c', None, 'spam')), + (self.VALID_ARGS, self.VALID_EXPECTED), + (self.VALID_KWARGS, self.VALID_EXPECTED), + ] + for raw, expected in tests: + with self.subTest(raw): + id = ID.from_raw(raw) + + self.assertEqual(id, expected) + + def test_minimal(self): + id = ID( + filename=None, + funcname=None, + name='eggs', + ) + + self.assertEqual(id, ( + None, + None, + 'eggs', + )) + + def test_init_typical_global(self): + id = ID( + filename='x/y/z/spam.c', + funcname=None, + name='eggs', + ) + + self.assertEqual(id, ( + 'x/y/z/spam.c', + None, + 'eggs', + )) + + def test_init_typical_local(self): + id = ID( + filename='x/y/z/spam.c', + funcname='func', + name='eggs', + ) + + self.assertEqual(id, ( + 'x/y/z/spam.c', + 'func', + 'eggs', + )) + + def test_init_all_missing(self): + for value in ('', None): + with self.subTest(repr(value)): + id = ID( + filename=value, + funcname=value, + name=value, + ) + + self.assertEqual(id, ( + None, + None, + None, + )) + + def test_init_all_coerced(self): + tests = [ + ('str subclass', + dict( + filename=PseudoStr('x/y/z/spam.c'), + funcname=PseudoStr('func'), + name=PseudoStr('eggs'), + ), + ('x/y/z/spam.c', + 'func', + 'eggs', + )), + ('non-str', + dict( + filename=StrProxy('x/y/z/spam.c'), + funcname=Object(), + name=('a', 'b', 'c'), + ), + ('x/y/z/spam.c', + '', + "('a', 'b', 'c')", + )), + ] + for summary, kwargs, expected in tests: + with self.subTest(summary): + id = ID(**kwargs) + + for field in ID._fields: + value = getattr(id, field) + self.assertIs(type(value), str) + self.assertEqual(tuple(id), expected) + + def test_iterable(self): + id = ID(**self.VALID_KWARGS) + + filename, funcname, name = id + + values = (filename, funcname, name) + for value, expected in zip(values, self.VALID_EXPECTED): + self.assertEqual(value, expected) + + def test_fields(self): + id = ID('a', 'b', 'z') + + self.assertEqual(id.filename, 'a') + self.assertEqual(id.funcname, 'b') + self.assertEqual(id.name, 'z') + + def test_validate_typical(self): + id = ID( + filename='x/y/z/spam.c', + funcname='func', + name='eggs', + ) + + id.validate() # This does not fail. + + def test_validate_missing_field(self): + for field in ID._fields: + with self.subTest(field): + id = ID(**self.VALID_KWARGS) + id = id._replace(**{field: None}) + + if field == 'funcname': + id.validate() # The field can be missing (not set). + id = id._replace(filename=None) + id.validate() # Both fields can be missing (not set). + continue + + with self.assertRaises(TypeError): + id.validate() + + def test_validate_bad_field(self): + badch = tuple(c for c in string.punctuation + string.digits) + notnames = ( + '1a', + 'a.b', + 'a-b', + '&a', + 'a++', + ) + badch + tests = [ + ('filename', ()), # Any non-empty str is okay. + ('funcname', notnames), + ('name', notnames), + ] + seen = set() + for field, invalid in tests: + for value in invalid: + seen.add(value) + with self.subTest(f'{field}={value!r}'): + id = ID(**self.VALID_KWARGS) + id = id._replace(**{field: value}) + + with self.assertRaises(ValueError): + id.validate() + + for field, invalid in tests: + valid = seen - set(invalid) + for value in valid: + with self.subTest(f'{field}={value!r}'): + id = ID(**self.VALID_KWARGS) + id = id._replace(**{field: value}) + + id.validate() # This does not fail. diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/test_show.py b/Lib/test/test_tools/test_c_analyzer/test_common/test_show.py new file mode 100644 index 00000000..91ca2f3b --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_common/test_show.py @@ -0,0 +1,54 @@ +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.variables import info + from c_analyzer.common.show import ( + basic, + ) + + +TYPICAL = [ + info.Variable.from_parts('src1/spam.c', None, 'var1', 'static const char *'), + info.Variable.from_parts('src1/spam.c', 'ham', 'initialized', 'static int'), + info.Variable.from_parts('src1/spam.c', None, 'var2', 'static PyObject *'), + info.Variable.from_parts('src1/eggs.c', 'tofu', 'ready', 'static int'), + info.Variable.from_parts('src1/spam.c', None, 'freelist', 'static (PyTupleObject *)[10]'), + info.Variable.from_parts('src1/sub/ham.c', None, 'var1', 'static const char const *'), + info.Variable.from_parts('src2/jam.c', None, 'var1', 'static int'), + info.Variable.from_parts('src2/jam.c', None, 'var2', 'static MyObject *'), + info.Variable.from_parts('Include/spam.h', None, 'data', 'static const int'), + ] + + +class BasicTests(unittest.TestCase): + + maxDiff = None + + def setUp(self): + self.lines = [] + + def print(self, line): + self.lines.append(line) + + def test_typical(self): + basic(TYPICAL, + _print=self.print) + + self.assertEqual(self.lines, [ + 'src1/spam.c:var1 static const char *', + 'src1/spam.c:ham():initialized static int', + 'src1/spam.c:var2 static PyObject *', + 'src1/eggs.c:tofu():ready static int', + 'src1/spam.c:freelist static (PyTupleObject *)[10]', + 'src1/sub/ham.c:var1 static const char const *', + 'src2/jam.c:var1 static int', + 'src2/jam.c:var2 static MyObject *', + 'Include/spam.h:data static const int', + ]) + + def test_no_rows(self): + basic([], + _print=self.print) + + self.assertEqual(self.lines, []) diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/__init__.py new file mode 100644 index 00000000..bc502ef3 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_cpython/__init__.py @@ -0,0 +1,6 @@ +import os.path +from test.support import load_package_tests + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/test___main__.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/test___main__.py new file mode 100644 index 00000000..6d69ed75 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_cpython/test___main__.py @@ -0,0 +1,296 @@ +import sys +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.variables import info + from cpython import SOURCE_DIRS + from cpython.supported import IGNORED_FILE + from cpython.known import DATA_FILE as KNOWN_FILE + from cpython.__main__ import ( + cmd_check, cmd_show, parse_args, main, + ) + + +TYPICAL = [ + (info.Variable.from_parts('src1/spam.c', None, 'var1', 'const char *'), + True, + ), + (info.Variable.from_parts('src1/spam.c', 'ham', 'initialized', 'int'), + True, + ), + (info.Variable.from_parts('src1/spam.c', None, 'var2', 'PyObject *'), + False, + ), + (info.Variable.from_parts('src1/eggs.c', 'tofu', 'ready', 'int'), + True, + ), + (info.Variable.from_parts('src1/spam.c', None, 'freelist', '(PyTupleObject *)[10]'), + False, + ), + (info.Variable.from_parts('src1/sub/ham.c', None, 'var1', 'const char const *'), + True, + ), + (info.Variable.from_parts('src2/jam.c', None, 'var1', 'int'), + True, + ), + (info.Variable.from_parts('src2/jam.c', None, 'var2', 'MyObject *'), + False, + ), + (info.Variable.from_parts('Include/spam.h', None, 'data', 'const int'), + True, + ), + ] + + +class CMDBase(unittest.TestCase): + + maxDiff = None + +# _return_known_from_file = None +# _return_ignored_from_file = None + _return_find = () + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + +# def _known_from_file(self, *args): +# self.calls.append(('_known_from_file', args)) +# return self._return_known_from_file or {} +# +# def _ignored_from_file(self, *args): +# self.calls.append(('_ignored_from_file', args)) +# return self._return_ignored_from_file or {} + + def _find(self, known, ignored, skip_objects=False): + self.calls.append(('_find', (known, ignored, skip_objects))) + return self._return_find + + def _show(self, *args): + self.calls.append(('_show', args)) + + def _print(self, *args): + self.calls.append(('_print', args)) + + +class CheckTests(CMDBase): + + def test_defaults(self): + self._return_find = [] + + cmd_check('check', + _find=self._find, + _show=self._show, + _print=self._print, + ) + + self.assertEqual( + self.calls[0], + ('_find', (KNOWN_FILE, IGNORED_FILE, False)), + ) + + def test_all_supported(self): + self._return_find = [(v, s) for v, s in TYPICAL if s] + dirs = ['src1', 'src2', 'Include'] + + cmd_check('check', + known='known.tsv', + ignored='ignored.tsv', + _find=self._find, + _show=self._show, + _print=self._print, + ) + + self.assertEqual(self.calls, [ + ('_find', ('known.tsv', 'ignored.tsv', False)), + #('_print', ('okay',)), + ]) + + def test_some_unsupported(self): + self._return_find = TYPICAL + + with self.assertRaises(SystemExit) as cm: + cmd_check('check', + known='known.tsv', + ignored='ignored.tsv', + _find=self._find, + _show=self._show, + _print=self._print, + ) + + unsupported = [v for v, s in TYPICAL if not s] + self.assertEqual(self.calls, [ + ('_find', ('known.tsv', 'ignored.tsv', False)), + ('_print', ('ERROR: found unsupported global variables',)), + ('_print', ()), + ('_show', (sorted(unsupported),)), + ('_print', (' (3 total)',)), + ]) + self.assertEqual(cm.exception.code, 1) + + +class ShowTests(CMDBase): + + def test_defaults(self): + self._return_find = [] + + cmd_show('show', + _find=self._find, + _show=self._show, + _print=self._print, + ) + + self.assertEqual( + self.calls[0], + ('_find', (KNOWN_FILE, IGNORED_FILE, False)), + ) + + def test_typical(self): + self._return_find = TYPICAL + + cmd_show('show', + known='known.tsv', + ignored='ignored.tsv', + _find=self._find, + _show=self._show, + _print=self._print, + ) + + supported = [v for v, s in TYPICAL if s] + unsupported = [v for v, s in TYPICAL if not s] + self.assertEqual(self.calls, [ + ('_find', ('known.tsv', 'ignored.tsv', False)), + ('_print', ('supported:',)), + ('_print', ('----------',)), + ('_show', (sorted(supported),)), + ('_print', (' (6 total)',)), + ('_print', ()), + ('_print', ('unsupported:',)), + ('_print', ('------------',)), + ('_show', (sorted(unsupported),)), + ('_print', (' (3 total)',)), + ]) + + +class ParseArgsTests(unittest.TestCase): + + maxDiff = None + + def test_no_args(self): + self.errmsg = None + def fail(msg): + self.errmsg = msg + sys.exit(msg) + + with self.assertRaises(SystemExit): + parse_args('cg', [], _fail=fail) + + self.assertEqual(self.errmsg, 'missing command') + + def test_check_no_args(self): + cmd, cmdkwargs = parse_args('cg', [ + 'check', + ]) + + self.assertEqual(cmd, 'check') + self.assertEqual(cmdkwargs, { + 'ignored': IGNORED_FILE, + 'known': KNOWN_FILE, + #'dirs': SOURCE_DIRS, + }) + + def test_check_full_args(self): + cmd, cmdkwargs = parse_args('cg', [ + 'check', + '--ignored', 'spam.tsv', + '--known', 'eggs.tsv', + #'dir1', + #'dir2', + #'dir3', + ]) + + self.assertEqual(cmd, 'check') + self.assertEqual(cmdkwargs, { + 'ignored': 'spam.tsv', + 'known': 'eggs.tsv', + #'dirs': ['dir1', 'dir2', 'dir3'] + }) + + def test_show_no_args(self): + cmd, cmdkwargs = parse_args('cg', [ + 'show', + ]) + + self.assertEqual(cmd, 'show') + self.assertEqual(cmdkwargs, { + 'ignored': IGNORED_FILE, + 'known': KNOWN_FILE, + #'dirs': SOURCE_DIRS, + 'skip_objects': False, + }) + + def test_show_full_args(self): + cmd, cmdkwargs = parse_args('cg', [ + 'show', + '--ignored', 'spam.tsv', + '--known', 'eggs.tsv', + #'dir1', + #'dir2', + #'dir3', + ]) + + self.assertEqual(cmd, 'show') + self.assertEqual(cmdkwargs, { + 'ignored': 'spam.tsv', + 'known': 'eggs.tsv', + #'dirs': ['dir1', 'dir2', 'dir3'], + 'skip_objects': False, + }) + + +def new_stub_commands(*names): + calls = [] + def cmdfunc(cmd, **kwargs): + calls.append((cmd, kwargs)) + commands = {name: cmdfunc for name in names} + return commands, calls + + +class MainTests(unittest.TestCase): + + def test_no_command(self): + with self.assertRaises(ValueError): + main(None, {}) + + def test_check(self): + commands, calls = new_stub_commands('check', 'show') + + cmdkwargs = { + 'ignored': 'spam.tsv', + 'known': 'eggs.tsv', + 'dirs': ['dir1', 'dir2', 'dir3'], + } + main('check', cmdkwargs, _COMMANDS=commands) + + self.assertEqual(calls, [ + ('check', cmdkwargs), + ]) + + def test_show(self): + commands, calls = new_stub_commands('check', 'show') + + cmdkwargs = { + 'ignored': 'spam.tsv', + 'known': 'eggs.tsv', + 'dirs': ['dir1', 'dir2', 'dir3'], + } + main('show', cmdkwargs, _COMMANDS=commands) + + self.assertEqual(calls, [ + ('show', cmdkwargs), + ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/test_functional.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/test_functional.py new file mode 100644 index 00000000..92797904 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_cpython/test_functional.py @@ -0,0 +1,34 @@ +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + pass + + +class SelfCheckTests(unittest.TestCase): + + @unittest.expectedFailure + def test_known(self): + # Make sure known macros & vartypes aren't hiding unknown local types. + # XXX finish! + raise NotImplementedError + + @unittest.expectedFailure + def test_compare_nm_results(self): + # Make sure the "show" results match the statics found by "nm" command. + # XXX Skip if "nm" is not available. + # XXX finish! + raise NotImplementedError + + +class DummySourceTests(unittest.TestCase): + + @unittest.expectedFailure + def test_check(self): + # XXX finish! + raise NotImplementedError + + @unittest.expectedFailure + def test_show(self): + # XXX finish! + raise NotImplementedError diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/test_supported.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/test_supported.py new file mode 100644 index 00000000..a244b97e --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_cpython/test_supported.py @@ -0,0 +1,98 @@ +import re +import textwrap +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.info import ID + from c_analyzer.variables.info import Variable + from cpython.supported import ( + is_supported, ignored_from_file, + ) + + +class IsSupportedTests(unittest.TestCase): + + @unittest.expectedFailure + def test_supported(self): + statics = [ + Variable('src1/spam.c', None, 'var1', 'const char *'), + Variable('src1/spam.c', None, 'var1', 'int'), + ] + for static in statics: + with self.subTest(static): + result = is_supported(static) + + self.assertTrue(result) + + @unittest.expectedFailure + def test_not_supported(self): + statics = [ + Variable('src1/spam.c', None, 'var1', 'PyObject *'), + Variable('src1/spam.c', None, 'var1', 'PyObject[10]'), + ] + for static in statics: + with self.subTest(static): + result = is_supported(static) + + self.assertFalse(result) + + +class IgnoredFromFileTests(unittest.TestCase): + + maxDiff = None + + _return_read_tsv = () + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + def _read_tsv(self, *args): + self.calls.append(('_read_tsv', args)) + return self._return_read_tsv + + def test_typical(self): + lines = textwrap.dedent(''' + filename funcname name kind reason + file1.c - var1 variable ... + file1.c func1 local1 variable | + file1.c - var2 variable ??? + file1.c func2 local2 variable | + file2.c - var1 variable reasons + ''').strip().splitlines() + lines = [re.sub(r'\s{1,8}', '\t', line, 4).replace('|', '') + for line in lines] + self._return_read_tsv = [tuple(v.strip() for v in line.split('\t')) + for line in lines[1:]] + + ignored = ignored_from_file('spam.c', _read_tsv=self._read_tsv) + + self.assertEqual(ignored, { + 'variables': { + ID('file1.c', '', 'var1'): '...', + ID('file1.c', 'func1', 'local1'): '', + ID('file1.c', '', 'var2'): '???', + ID('file1.c', 'func2', 'local2'): '', + ID('file2.c', '', 'var1'): 'reasons', + }, + }) + self.assertEqual(self.calls, [ + ('_read_tsv', ('spam.c', 'filename\tfuncname\tname\tkind\treason')), + ]) + + def test_empty(self): + self._return_read_tsv = [] + + ignored = ignored_from_file('spam.c', _read_tsv=self._read_tsv) + + self.assertEqual(ignored, { + 'variables': {}, + }) + self.assertEqual(self.calls, [ + ('_read_tsv', ('spam.c', 'filename\tfuncname\tname\tkind\treason')), + ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_parser/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_parser/__init__.py new file mode 100644 index 00000000..bc502ef3 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_parser/__init__.py @@ -0,0 +1,6 @@ +import os.path +from test.support import load_package_tests + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_parser/test_declarations.py b/Lib/test/test_tools/test_c_analyzer/test_parser/test_declarations.py new file mode 100644 index 00000000..674fcb1a --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_parser/test_declarations.py @@ -0,0 +1,795 @@ +import textwrap +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.parser.declarations import ( + iter_global_declarations, iter_local_statements, + parse_func, _parse_var, parse_compound, + iter_variables, + ) + + +class TestCaseBase(unittest.TestCase): + + maxDiff = None + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + +class IterGlobalDeclarationsTests(TestCaseBase): + + def test_functions(self): + tests = [ + (textwrap.dedent(''' + void func1() { + return; + } + '''), + textwrap.dedent(''' + void func1() { + return; + } + ''').strip(), + ), + (textwrap.dedent(''' + static unsigned int * _func1( + const char *arg1, + int *arg2 + long long arg3 + ) + { + return _do_something(arg1, arg2, arg3); + } + '''), + textwrap.dedent(''' + static unsigned int * _func1( const char *arg1, int *arg2 long long arg3 ) { + return _do_something(arg1, arg2, arg3); + } + ''').strip(), + ), + (textwrap.dedent(''' + static PyObject * + _func1(const char *arg1, PyObject *arg2) + { + static int initialized = 0; + if (!initialized) { + initialized = 1; + _init(arg1); + } + + PyObject *result = _do_something(arg1, arg2); + Py_INCREF(result); + return result; + } + '''), + textwrap.dedent(''' + static PyObject * _func1(const char *arg1, PyObject *arg2) { + static int initialized = 0; + if (!initialized) { + initialized = 1; + _init(arg1); + } + PyObject *result = _do_something(arg1, arg2); + Py_INCREF(result); + return result; + } + ''').strip(), + ), + ] + for lines, expected in tests: + body = textwrap.dedent( + expected.partition('{')[2].rpartition('}')[0] + ).strip() + expected = (expected, body) + with self.subTest(lines): + lines = lines.splitlines() + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, [expected]) + + @unittest.expectedFailure + def test_declarations(self): + tests = [ + 'int spam;', + 'long long spam;', + 'static const int const *spam;', + 'int spam;', + 'typedef int myint;', + 'typedef PyObject * (*unaryfunc)(PyObject *);', + # typedef struct + # inline struct + # enum + # inline enum + ] + for text in tests: + expected = (text, + ' '.join(l.strip() for l in text.splitlines())) + with self.subTest(lines): + lines = lines.splitlines() + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, [expected]) + + @unittest.expectedFailure + def test_declaration_multiple_vars(self): + lines = ['static const int const *spam, *ham=NULL, eggs = 3;'] + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, [ + ('static const int const *spam;', None), + ('static const int *ham=NULL;', None), + ('static const int eggs = 3;', None), + ]) + + def test_mixed(self): + lines = textwrap.dedent(''' + int spam; + static const char const *eggs; + + PyObject * start(void) { + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + } + + char* ham; + + static int stop(char *reason) { + ham = reason; + return _stop(); + } + ''').splitlines() + expected = [ + (textwrap.dedent(''' + PyObject * start(void) { + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + } + ''').strip(), + textwrap.dedent(''' + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + ''').strip(), + ), + (textwrap.dedent(''' + static int stop(char *reason) { + ham = reason; + return _stop(); + } + ''').strip(), + textwrap.dedent(''' + ham = reason; + return _stop(); + ''').strip(), + ), + ] + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, expected) + #self.assertEqual([stmt for stmt, _ in stmts], + # [stmt for stmt, _ in expected]) + #self.assertEqual([body for _, body in stmts], + # [body for _, body in expected]) + + def test_no_statements(self): + lines = [] + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, []) + + def test_bogus(self): + tests = [ + (textwrap.dedent(''' + int spam; + static const char const *eggs; + + PyObject * start(void) { + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + } + + char* ham; + + static int _stop(void) { + // missing closing bracket + + static int stop(char *reason) { + ham = reason; + return _stop(); + } + '''), + [(textwrap.dedent(''' + PyObject * start(void) { + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + } + ''').strip(), + textwrap.dedent(''' + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + ''').strip(), + ), + # Neither "stop()" nor "_stop()" are here. + ], + ), + ] + for lines, expected in tests: + with self.subTest(lines): + lines = lines.splitlines() + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, expected) + #self.assertEqual([stmt for stmt, _ in stmts], + # [stmt for stmt, _ in expected]) + #self.assertEqual([body for _, body in stmts], + # [body for _, body in expected]) + + def test_ignore_comments(self): + tests = [ + ('// msg', None), + ('// int stmt;', None), + (' // ... ', None), + ('// /*', None), + ('/* int stmt; */', None), + (""" + /** + * ... + * int stmt; + */ + """, None), + ] + for lines, expected in tests: + with self.subTest(lines): + lines = lines.splitlines() + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, [expected] if expected else []) + + +class IterLocalStatementsTests(TestCaseBase): + + def test_vars(self): + tests = [ + # POTS + 'int spam;', + 'unsigned int spam;', + 'char spam;', + 'float spam;', + + # typedefs + 'uint spam;', + 'MyType spam;', + + # complex + 'struct myspam spam;', + 'union choice spam;', + # inline struct + # inline union + # enum? + ] + # pointers + tests.extend([ + # POTS + 'int * spam;', + 'unsigned int * spam;', + 'char *spam;', + 'char const *spam = "spamspamspam...";', + # typedefs + 'MyType *spam;', + # complex + 'struct myspam *spam;', + 'union choice *spam;', + # packed with details + 'const char const *spam;', + # void pointer + 'void *data = NULL;', + # function pointers + 'int (* func)(char *arg1);', + 'char * (* func)(void);', + ]) + # storage class + tests.extend([ + 'static int spam;', + 'extern int spam;', + 'static unsigned int spam;', + 'static struct myspam spam;', + ]) + # type qualifier + tests.extend([ + 'const int spam;', + 'const unsigned int spam;', + 'const struct myspam spam;', + ]) + # combined + tests.extend([ + 'const char *spam = eggs;', + 'static const char const *spam = "spamspamspam...";', + 'extern const char const *spam;', + 'static void *data = NULL;', + 'static int (const * func)(char *arg1) = func1;', + 'static char * (* func)(void);', + ]) + for line in tests: + expected = line + with self.subTest(line): + stmts = list(iter_local_statements([line])) + + self.assertEqual(stmts, [(expected, None)]) + + @unittest.expectedFailure + def test_vars_multiline_var(self): + lines = textwrap.dedent(''' + PyObject * + spam + = NULL; + ''').splitlines() + expected = 'PyObject * spam = NULL;' + + stmts = list(iter_local_statements(lines)) + + self.assertEqual(stmts, [(expected, None)]) + + @unittest.expectedFailure + def test_declaration_multiple_vars(self): + lines = ['static const int const *spam, *ham=NULL, ham2[]={1, 2, 3}, ham3[2]={1, 2}, eggs = 3;'] + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, [ + ('static const int const *spam;', None), + ('static const int *ham=NULL;', None), + ('static const int ham[]={1, 2, 3};', None), + ('static const int ham[2]={1, 2};', None), + ('static const int eggs = 3;', None), + ]) + + @unittest.expectedFailure + def test_other_simple(self): + raise NotImplementedError + + @unittest.expectedFailure + def test_compound(self): + raise NotImplementedError + + @unittest.expectedFailure + def test_mixed(self): + raise NotImplementedError + + def test_no_statements(self): + lines = [] + + stmts = list(iter_local_statements(lines)) + + self.assertEqual(stmts, []) + + @unittest.expectedFailure + def test_bogus(self): + raise NotImplementedError + + def test_ignore_comments(self): + tests = [ + ('// msg', None), + ('// int stmt;', None), + (' // ... ', None), + ('// /*', None), + ('/* int stmt; */', None), + (""" + /** + * ... + * int stmt; + */ + """, None), + # mixed with statements + ('int stmt; // ...', ('int stmt;', None)), + ( 'int stmt; /* ... */', ('int stmt;', None)), + ( '/* ... */ int stmt;', ('int stmt;', None)), + ] + for lines, expected in tests: + with self.subTest(lines): + lines = lines.splitlines() + + stmts = list(iter_local_statements(lines)) + + self.assertEqual(stmts, [expected] if expected else []) + + +class ParseFuncTests(TestCaseBase): + + def test_typical(self): + tests = [ + ('PyObject *\nspam(char *a)\n{\nreturn _spam(a);\n}', + 'return _spam(a);', + ('spam', 'PyObject * spam(char *a)'), + ), + ] + for stmt, body, expected in tests: + with self.subTest(stmt): + name, signature = parse_func(stmt, body) + + self.assertEqual((name, signature), expected) + + +class ParseVarTests(TestCaseBase): + + def test_typical(self): + tests = [ + # POTS + ('int spam;', ('spam', 'int')), + ('unsigned int spam;', ('spam', 'unsigned int')), + ('char spam;', ('spam', 'char')), + ('float spam;', ('spam', 'float')), + + # typedefs + ('uint spam;', ('spam', 'uint')), + ('MyType spam;', ('spam', 'MyType')), + + # complex + ('struct myspam spam;', ('spam', 'struct myspam')), + ('union choice spam;', ('spam', 'union choice')), + # inline struct + # inline union + # enum? + ] + # pointers + tests.extend([ + # POTS + ('int * spam;', ('spam', 'int *')), + ('unsigned int * spam;', ('spam', 'unsigned int *')), + ('char *spam;', ('spam', 'char *')), + ('char const *spam = "spamspamspam...";', ('spam', 'char const *')), + # typedefs + ('MyType *spam;', ('spam', 'MyType *')), + # complex + ('struct myspam *spam;', ('spam', 'struct myspam *')), + ('union choice *spam;', ('spam', 'union choice *')), + # packed with details + ('const char const *spam;', ('spam', 'const char const *')), + # void pointer + ('void *data = NULL;', ('data', 'void *')), + # function pointers + ('int (* func)(char *);', ('func', 'int (*)(char *)')), + ('char * (* func)(void);', ('func', 'char * (*)(void)')), + ]) + # storage class + tests.extend([ + ('static int spam;', ('spam', 'static int')), + ('extern int spam;', ('spam', 'extern int')), + ('static unsigned int spam;', ('spam', 'static unsigned int')), + ('static struct myspam spam;', ('spam', 'static struct myspam')), + ]) + # type qualifier + tests.extend([ + ('const int spam;', ('spam', 'const int')), + ('const unsigned int spam;', ('spam', 'const unsigned int')), + ('const struct myspam spam;', ('spam', 'const struct myspam')), + ]) + # combined + tests.extend([ + ('const char *spam = eggs;', ('spam', 'const char *')), + ('static const char const *spam = "spamspamspam...";', + ('spam', 'static const char const *')), + ('extern const char const *spam;', + ('spam', 'extern const char const *')), + ('static void *data = NULL;', ('data', 'static void *')), + ('static int (const * func)(char *) = func1;', + ('func', 'static int (const *)(char *)')), + ('static char * (* func)(void);', + ('func', 'static char * (*)(void)')), + ]) + for stmt, expected in tests: + with self.subTest(stmt): + name, vartype = _parse_var(stmt) + + self.assertEqual((name, vartype), expected) + + +@unittest.skip('not finished') +class ParseCompoundTests(TestCaseBase): + + def test_typical(self): + headers, bodies = parse_compound(stmt, blocks) + ... + + +class IterVariablesTests(TestCaseBase): + + _return_iter_source_lines = None + _return_iter_global = None + _return_iter_local = None + _return_parse_func = None + _return_parse_var = None + _return_parse_compound = None + + def _iter_source_lines(self, filename): + self.calls.append( + ('_iter_source_lines', (filename,))) + return self._return_iter_source_lines.splitlines() + + def _iter_global(self, lines): + self.calls.append( + ('_iter_global', (lines,))) + try: + return self._return_iter_global.pop(0) + except IndexError: + return ('???', None) + + def _iter_local(self, lines): + self.calls.append( + ('_iter_local', (lines,))) + try: + return self._return_iter_local.pop(0) + except IndexError: + return ('???', None) + + def _parse_func(self, stmt, body): + self.calls.append( + ('_parse_func', (stmt, body))) + try: + return self._return_parse_func.pop(0) + except IndexError: + return ('???', '???') + + def _parse_var(self, lines): + self.calls.append( + ('_parse_var', (lines,))) + try: + return self._return_parse_var.pop(0) + except IndexError: + return ('???', '???') + + def _parse_compound(self, stmt, blocks): + self.calls.append( + ('_parse_compound', (stmt, blocks))) + try: + return self._return_parse_compound.pop(0) + except IndexError: + return (['???'], ['???']) + + def test_empty_file(self): + self._return_iter_source_lines = '' + self._return_iter_global = [ + [], + ] + self._return_parse_func = None + self._return_parse_var = None + self._return_parse_compound = None + + srcvars = list(iter_variables('spam.c', + _iter_source_lines=self._iter_source_lines, + _iter_global=self._iter_global, + _iter_local=self._iter_local, + _parse_func=self._parse_func, + _parse_var=self._parse_var, + _parse_compound=self._parse_compound, + )) + + self.assertEqual(srcvars, []) + self.assertEqual(self.calls, [ + ('_iter_source_lines', ('spam.c',)), + ('_iter_global', ([],)), + ]) + + def test_no_statements(self): + content = textwrap.dedent(''' + ... + ''') + self._return_iter_source_lines = content + self._return_iter_global = [ + [], + ] + self._return_parse_func = None + self._return_parse_var = None + self._return_parse_compound = None + + srcvars = list(iter_variables('spam.c', + _iter_source_lines=self._iter_source_lines, + _iter_global=self._iter_global, + _iter_local=self._iter_local, + _parse_func=self._parse_func, + _parse_var=self._parse_var, + _parse_compound=self._parse_compound, + )) + + self.assertEqual(srcvars, []) + self.assertEqual(self.calls, [ + ('_iter_source_lines', ('spam.c',)), + ('_iter_global', (content.splitlines(),)), + ]) + + def test_typical(self): + content = textwrap.dedent(''' + ... + ''') + self._return_iter_source_lines = content + self._return_iter_global = [ + [('', None), # var1 + ('', None), # non-var + ('', None), # var2 + ('', ''), # func1 + ('', None), # var4 + ], + ] + self._return_iter_local = [ + # func1 + [('', None), # var3 + ('', [('
    ', '')]), # if + ('', None), # non-var + ], + # if + [('', None), # var2 ("collision" with global var) + ], + ] + self._return_parse_func = [ + ('func1', ''), + ] + self._return_parse_var = [ + ('var1', ''), + (None, None), + ('var2', ''), + ('var3', ''), + ('var2', ''), + ('var4', ''), + (None, None), + (None, None), + (None, None), + ('var5', ''), + ] + self._return_parse_compound = [ + ([[ + 'if (', + '', + ')', + ], + ], + ['']), + ] + + srcvars = list(iter_variables('spam.c', + _iter_source_lines=self._iter_source_lines, + _iter_global=self._iter_global, + _iter_local=self._iter_local, + _parse_func=self._parse_func, + _parse_var=self._parse_var, + _parse_compound=self._parse_compound, + )) + + self.assertEqual(srcvars, [ + (None, 'var1', ''), + (None, 'var2', ''), + ('func1', 'var3', ''), + ('func1', 'var2', ''), + ('func1', 'var4', ''), + (None, 'var5', ''), + ]) + self.assertEqual(self.calls, [ + ('_iter_source_lines', ('spam.c',)), + ('_iter_global', (content.splitlines(),)), + ('_parse_var', ('',)), + ('_parse_var', ('',)), + ('_parse_var', ('',)), + ('_parse_func', ('', '')), + ('_iter_local', ([''],)), + ('_parse_var', ('',)), + ('_parse_compound', ('', [('
    ', '')])), + ('_parse_var', ('if (',)), + ('_parse_var', ('',)), + ('_parse_var', (')',)), + ('_parse_var', ('',)), + ('_iter_local', ([''],)), + ('_parse_var', ('',)), + ('_parse_var', ('',)), + ]) + + def test_no_locals(self): + content = textwrap.dedent(''' + ... + ''') + self._return_iter_source_lines = content + self._return_iter_global = [ + [('', None), # var1 + ('', None), # non-var + ('', None), # var2 + ('', ''), # func1 + ], + ] + self._return_iter_local = [ + # func1 + [('', None), # non-var + ('', [('
    ', '')]), # if + ('', None), # non-var + ], + # if + [('', None), # non-var + ], + ] + self._return_parse_func = [ + ('func1', ''), + ] + self._return_parse_var = [ + ('var1', ''), + (None, None), + ('var2', ''), + (None, None), + (None, None), + (None, None), + (None, None), + (None, None), + (None, None), + ] + self._return_parse_compound = [ + ([[ + 'if (', + '', + ')', + ], + ], + ['']), + ] + + srcvars = list(iter_variables('spam.c', + _iter_source_lines=self._iter_source_lines, + _iter_global=self._iter_global, + _iter_local=self._iter_local, + _parse_func=self._parse_func, + _parse_var=self._parse_var, + _parse_compound=self._parse_compound, + )) + + self.assertEqual(srcvars, [ + (None, 'var1', ''), + (None, 'var2', ''), + ]) + self.assertEqual(self.calls, [ + ('_iter_source_lines', ('spam.c',)), + ('_iter_global', (content.splitlines(),)), + ('_parse_var', ('',)), + ('_parse_var', ('',)), + ('_parse_var', ('',)), + ('_parse_func', ('', '')), + ('_iter_local', ([''],)), + ('_parse_var', ('',)), + ('_parse_compound', ('', [('
    ', '')])), + ('_parse_var', ('if (',)), + ('_parse_var', ('',)), + ('_parse_var', (')',)), + ('_parse_var', ('',)), + ('_iter_local', ([''],)), + ('_parse_var', ('',)), + ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_parser/test_preprocessor.py b/Lib/test/test_tools/test_c_analyzer/test_parser/test_preprocessor.py new file mode 100644 index 00000000..b7f950f8 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_parser/test_preprocessor.py @@ -0,0 +1,1561 @@ +import textwrap +import unittest +import sys + +from ..util import wrapped_arg_combos, StrProxy +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.parser.preprocessor import ( + iter_lines, + # directives + parse_directive, PreprocessorDirective, + Constant, Macro, IfDirective, Include, OtherDirective, + ) + + +class TestCaseBase(unittest.TestCase): + + maxDiff = None + + def reset(self): + self._calls = [] + self.errors = None + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + errors = None + + def try_next_exc(self): + if not self.errors: + return + if exc := self.errors.pop(0): + raise exc + + def check_calls(self, *expected): + self.assertEqual(self.calls, list(expected)) + self.assertEqual(self.errors or [], []) + + +class IterLinesTests(TestCaseBase): + + parsed = None + + def check_calls(self, *expected): + super().check_calls(*expected) + self.assertEqual(self.parsed or [], []) + + def _parse_directive(self, line): + self.calls.append( + ('_parse_directive', line)) + self.try_next_exc() + return self.parsed.pop(0) + + def test_no_lines(self): + lines = [] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, []) + self.check_calls() + + def test_no_directives(self): + lines = textwrap.dedent(''' + + // xyz + typedef enum { + SPAM + EGGS + } kind; + + struct info { + kind kind; + int status; + }; + + typedef struct spam { + struct info info; + } myspam; + + static int spam = 0; + + /** + * ... + */ + static char * + get_name(int arg, + char *default, + ) + { + return default + } + + int check(void) { + return 0; + } + + ''')[1:-1].splitlines() + expected = [(lno, line, None, ()) + for lno, line in enumerate(lines, 1)] + expected[1] = (2, ' ', None, ()) + expected[20] = (21, ' ', None, ()) + del expected[19] + del expected[18] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, expected) + self.check_calls() + + def test_single_directives(self): + tests = [ + ('#include ', Include('')), + ('#define SPAM 1', Constant('SPAM', '1')), + ('#define SPAM() 1', Macro('SPAM', (), '1')), + ('#define SPAM(a, b) a = b;', Macro('SPAM', ('a', 'b'), 'a = b;')), + ('#if defined(SPAM)', IfDirective('if', 'defined(SPAM)')), + ('#ifdef SPAM', IfDirective('ifdef', 'SPAM')), + ('#ifndef SPAM', IfDirective('ifndef', 'SPAM')), + ('#elseif defined(SPAM)', IfDirective('elseif', 'defined(SPAM)')), + ('#else', OtherDirective('else', None)), + ('#endif', OtherDirective('endif', None)), + ('#error ...', OtherDirective('error', '...')), + ('#warning ...', OtherDirective('warning', '...')), + ('#__FILE__ ...', OtherDirective('__FILE__', '...')), + ('#__LINE__ ...', OtherDirective('__LINE__', '...')), + ('#__DATE__ ...', OtherDirective('__DATE__', '...')), + ('#__TIME__ ...', OtherDirective('__TIME__', '...')), + ('#__TIMESTAMP__ ...', OtherDirective('__TIMESTAMP__', '...')), + ] + for line, directive in tests: + with self.subTest(line): + self.reset() + self.parsed = [ + directive, + ] + text = textwrap.dedent(''' + static int spam = 0; + {} + static char buffer[256]; + ''').strip().format(line) + lines = text.strip().splitlines() + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, 'static int spam = 0;', None, ()), + (2, line, directive, ()), + ((3, 'static char buffer[256];', None, ('defined(SPAM)',)) + if directive.kind in ('if', 'ifdef', 'elseif') + else (3, 'static char buffer[256];', None, ('! defined(SPAM)',)) + if directive.kind == 'ifndef' + else (3, 'static char buffer[256];', None, ())), + ]) + self.check_calls( + ('_parse_directive', line), + ) + + def test_directive_whitespace(self): + line = ' # define eggs ( a , b ) { a = b ; } ' + directive = Macro('eggs', ('a', 'b'), '{ a = b; }') + self.parsed = [ + directive, + ] + lines = [line] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, line, directive, ()), + ]) + self.check_calls( + ('_parse_directive', '#define eggs ( a , b ) { a = b ; }'), + ) + + @unittest.skipIf(sys.platform == 'win32', 'needs fix under Windows') + def test_split_lines(self): + directive = Macro('eggs', ('a', 'b'), '{ a = b; }') + self.parsed = [ + directive, + ] + text = textwrap.dedent(r''' + static int spam = 0; + #define eggs(a, b) \ + { \ + a = b; \ + } + static char buffer[256]; + ''').strip() + lines = [line + '\n' for line in text.splitlines()] + lines[-1] = lines[-1][:-1] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, 'static int spam = 0;\n', None, ()), + (5, '#define eggs(a, b) { a = b; }\n', directive, ()), + (6, 'static char buffer[256];', None, ()), + ]) + self.check_calls( + ('_parse_directive', '#define eggs(a, b) { a = b; }'), + ) + + def test_nested_conditions(self): + directives = [ + IfDirective('ifdef', 'SPAM'), + IfDirective('if', 'SPAM == 1'), + IfDirective('elseif', 'SPAM == 2'), + OtherDirective('else', None), + OtherDirective('endif', None), + OtherDirective('endif', None), + ] + self.parsed = list(directives) + text = textwrap.dedent(r''' + static int spam = 0; + + #ifdef SPAM + static int start = 0; + # if SPAM == 1 + static char buffer[10]; + # elif SPAM == 2 + static char buffer[100]; + # else + static char buffer[256]; + # endif + static int end = 0; + #endif + + static int eggs = 0; + ''').strip() + lines = [line for line in text.splitlines() if line.strip()] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, 'static int spam = 0;', None, ()), + (2, '#ifdef SPAM', directives[0], ()), + (3, 'static int start = 0;', None, ('defined(SPAM)',)), + (4, '# if SPAM == 1', directives[1], ('defined(SPAM)',)), + (5, 'static char buffer[10];', None, ('defined(SPAM)', 'SPAM == 1')), + (6, '# elif SPAM == 2', directives[2], ('defined(SPAM)', 'SPAM == 1')), + (7, 'static char buffer[100];', None, ('defined(SPAM)', '! (SPAM == 1)', 'SPAM == 2')), + (8, '# else', directives[3], ('defined(SPAM)', '! (SPAM == 1)', 'SPAM == 2')), + (9, 'static char buffer[256];', None, ('defined(SPAM)', '! (SPAM == 1)', '! (SPAM == 2)')), + (10, '# endif', directives[4], ('defined(SPAM)', '! (SPAM == 1)', '! (SPAM == 2)')), + (11, 'static int end = 0;', None, ('defined(SPAM)',)), + (12, '#endif', directives[5], ('defined(SPAM)',)), + (13, 'static int eggs = 0;', None, ()), + ]) + self.check_calls( + ('_parse_directive', '#ifdef SPAM'), + ('_parse_directive', '#if SPAM == 1'), + ('_parse_directive', '#elif SPAM == 2'), + ('_parse_directive', '#else'), + ('_parse_directive', '#endif'), + ('_parse_directive', '#endif'), + ) + + def test_split_blocks(self): + directives = [ + IfDirective('ifdef', 'SPAM'), + OtherDirective('else', None), + OtherDirective('endif', None), + ] + self.parsed = list(directives) + text = textwrap.dedent(r''' + void str_copy(char *buffer, *orig); + + int init(char *name) { + static int initialized = 0; + if (initialized) { + return 0; + } + #ifdef SPAM + static char buffer[10]; + str_copy(buffer, char); + } + + void copy(char *buffer, *orig) { + strncpy(buffer, orig, 9); + buffer[9] = 0; + } + + #else + static char buffer[256]; + str_copy(buffer, char); + } + + void copy(char *buffer, *orig) { + strcpy(buffer, orig); + } + + #endif + ''').strip() + lines = [line for line in text.splitlines() if line.strip()] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, 'void str_copy(char *buffer, *orig);', None, ()), + (2, 'int init(char *name) {', None, ()), + (3, ' static int initialized = 0;', None, ()), + (4, ' if (initialized) {', None, ()), + (5, ' return 0;', None, ()), + (6, ' }', None, ()), + + (7, '#ifdef SPAM', directives[0], ()), + + (8, ' static char buffer[10];', None, ('defined(SPAM)',)), + (9, ' str_copy(buffer, char);', None, ('defined(SPAM)',)), + (10, '}', None, ('defined(SPAM)',)), + (11, 'void copy(char *buffer, *orig) {', None, ('defined(SPAM)',)), + (12, ' strncpy(buffer, orig, 9);', None, ('defined(SPAM)',)), + (13, ' buffer[9] = 0;', None, ('defined(SPAM)',)), + (14, '}', None, ('defined(SPAM)',)), + + (15, '#else', directives[1], ('defined(SPAM)',)), + + (16, ' static char buffer[256];', None, ('! (defined(SPAM))',)), + (17, ' str_copy(buffer, char);', None, ('! (defined(SPAM))',)), + (18, '}', None, ('! (defined(SPAM))',)), + (19, 'void copy(char *buffer, *orig) {', None, ('! (defined(SPAM))',)), + (20, ' strcpy(buffer, orig);', None, ('! (defined(SPAM))',)), + (21, '}', None, ('! (defined(SPAM))',)), + + (22, '#endif', directives[2], ('! (defined(SPAM))',)), + ]) + self.check_calls( + ('_parse_directive', '#ifdef SPAM'), + ('_parse_directive', '#else'), + ('_parse_directive', '#endif'), + ) + + @unittest.skipIf(sys.platform == 'win32', 'needs fix under Windows') + def test_basic(self): + directives = [ + Include(''), + IfDirective('ifdef', 'SPAM'), + IfDirective('if', '! defined(HAM) || !HAM'), + Constant('HAM', '0'), + IfDirective('elseif', 'HAM < 0'), + Constant('HAM', '-1'), + OtherDirective('else', None), + OtherDirective('endif', None), + OtherDirective('endif', None), + IfDirective('if', 'defined(HAM) && (HAM < 0 || ! HAM)'), + OtherDirective('undef', 'HAM'), + OtherDirective('endif', None), + IfDirective('ifndef', 'HAM'), + OtherDirective('endif', None), + ] + self.parsed = list(directives) + text = textwrap.dedent(r''' + #include + print("begin"); + #ifdef SPAM + print("spam"); + #if ! defined(HAM) || !HAM + # DEFINE HAM 0 + #elseif HAM < 0 + # DEFINE HAM -1 + #else + print("ham HAM"); + #endif + #endif + + #if defined(HAM) && \ + (HAM < 0 || ! HAM) + print("ham?"); + #undef HAM + # endif + + #ifndef HAM + print("no ham"); + #endif + print("end"); + ''')[1:-1] + lines = [line + '\n' for line in text.splitlines()] + lines[-1] = lines[-1][:-1] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, '#include \n', Include(''), ()), + (2, 'print("begin");\n', None, ()), + # + (3, '#ifdef SPAM\n', + IfDirective('ifdef', 'SPAM'), + ()), + (4, ' print("spam");\n', + None, + ('defined(SPAM)',)), + (5, ' #if ! defined(HAM) || !HAM\n', + IfDirective('if', '! defined(HAM) || !HAM'), + ('defined(SPAM)',)), + (6, '# DEFINE HAM 0\n', + Constant('HAM', '0'), + ('defined(SPAM)', '! defined(HAM) || !HAM')), + (7, ' #elseif HAM < 0\n', + IfDirective('elseif', 'HAM < 0'), + ('defined(SPAM)', '! defined(HAM) || !HAM')), + (8, '# DEFINE HAM -1\n', + Constant('HAM', '-1'), + ('defined(SPAM)', '! (! defined(HAM) || !HAM)', 'HAM < 0')), + (9, ' #else\n', + OtherDirective('else', None), + ('defined(SPAM)', '! (! defined(HAM) || !HAM)', 'HAM < 0')), + (10, ' print("ham HAM");\n', + None, + ('defined(SPAM)', '! (! defined(HAM) || !HAM)', '! (HAM < 0)')), + (11, ' #endif\n', + OtherDirective('endif', None), + ('defined(SPAM)', '! (! defined(HAM) || !HAM)', '! (HAM < 0)')), + (12, '#endif\n', + OtherDirective('endif', None), + ('defined(SPAM)',)), + # + (13, '\n', None, ()), + # + (15, '#if defined(HAM) && (HAM < 0 || ! HAM)\n', + IfDirective('if', 'defined(HAM) && (HAM < 0 || ! HAM)'), + ()), + (16, ' print("ham?");\n', + None, + ('defined(HAM) && (HAM < 0 || ! HAM)',)), + (17, ' #undef HAM\n', + OtherDirective('undef', 'HAM'), + ('defined(HAM) && (HAM < 0 || ! HAM)',)), + (18, '# endif\n', + OtherDirective('endif', None), + ('defined(HAM) && (HAM < 0 || ! HAM)',)), + # + (19, '\n', None, ()), + # + (20, '#ifndef HAM\n', + IfDirective('ifndef', 'HAM'), + ()), + (21, ' print("no ham");\n', + None, + ('! defined(HAM)',)), + (22, '#endif\n', + OtherDirective('endif', None), + ('! defined(HAM)',)), + # + (23, 'print("end");', None, ()), + ]) + + @unittest.skipIf(sys.platform == 'win32', 'needs fix under Windows') + def test_typical(self): + # We use Include/compile.h from commit 66c4f3f38b86. It has + # a good enough mix of code without being too large. + directives = [ + IfDirective('ifndef', 'Py_COMPILE_H'), + Constant('Py_COMPILE_H', None), + + IfDirective('ifndef', 'Py_LIMITED_API'), + + Include('"code.h"'), + + IfDirective('ifdef', '__cplusplus'), + OtherDirective('endif', None), + + Constant('PyCF_MASK', '(CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)'), + Constant('PyCF_MASK_OBSOLETE', '(CO_NESTED)'), + Constant('PyCF_SOURCE_IS_UTF8', ' 0x0100'), + Constant('PyCF_DONT_IMPLY_DEDENT', '0x0200'), + Constant('PyCF_ONLY_AST', '0x0400'), + Constant('PyCF_IGNORE_COOKIE', '0x0800'), + Constant('PyCF_TYPE_COMMENTS', '0x1000'), + Constant('PyCF_ALLOW_TOP_LEVEL_AWAIT', '0x2000'), + + IfDirective('ifndef', 'Py_LIMITED_API'), + OtherDirective('endif', None), + + Constant('FUTURE_NESTED_SCOPES', '"nested_scopes"'), + Constant('FUTURE_GENERATORS', '"generators"'), + Constant('FUTURE_DIVISION', '"division"'), + Constant('FUTURE_ABSOLUTE_IMPORT', '"absolute_import"'), + Constant('FUTURE_WITH_STATEMENT', '"with_statement"'), + Constant('FUTURE_PRINT_FUNCTION', '"print_function"'), + Constant('FUTURE_UNICODE_LITERALS', '"unicode_literals"'), + Constant('FUTURE_BARRY_AS_BDFL', '"barry_as_FLUFL"'), + Constant('FUTURE_GENERATOR_STOP', '"generator_stop"'), + Constant('FUTURE_ANNOTATIONS', '"annotations"'), + + Macro('PyAST_Compile', ('mod', 's', 'f', 'ar'), 'PyAST_CompileEx(mod, s, f, -1, ar)'), + + Constant('PY_INVALID_STACK_EFFECT', 'INT_MAX'), + + IfDirective('ifdef', '__cplusplus'), + OtherDirective('endif', None), + + OtherDirective('endif', None), # ifndef Py_LIMITED_API + + Constant('Py_single_input', '256'), + Constant('Py_file_input', '257'), + Constant('Py_eval_input', '258'), + Constant('Py_func_type_input', '345'), + + OtherDirective('endif', None), # ifndef Py_COMPILE_H + ] + self.parsed = list(directives) + text = textwrap.dedent(r''' + #ifndef Py_COMPILE_H + #define Py_COMPILE_H + + #ifndef Py_LIMITED_API + #include "code.h" + + #ifdef __cplusplus + extern "C" { + #endif + + /* Public interface */ + struct _node; /* Declare the existence of this type */ + PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); + /* XXX (ncoghlan): Unprefixed type name in a public API! */ + + #define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ + CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ + CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | \ + CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS) + #define PyCF_MASK_OBSOLETE (CO_NESTED) + #define PyCF_SOURCE_IS_UTF8 0x0100 + #define PyCF_DONT_IMPLY_DEDENT 0x0200 + #define PyCF_ONLY_AST 0x0400 + #define PyCF_IGNORE_COOKIE 0x0800 + #define PyCF_TYPE_COMMENTS 0x1000 + #define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000 + + #ifndef Py_LIMITED_API + typedef struct { + int cf_flags; /* bitmask of CO_xxx flags relevant to future */ + int cf_feature_version; /* minor Python version (PyCF_ONLY_AST) */ + } PyCompilerFlags; + #endif + + /* Future feature support */ + + typedef struct { + int ff_features; /* flags set by future statements */ + int ff_lineno; /* line number of last future statement */ + } PyFutureFeatures; + + #define FUTURE_NESTED_SCOPES "nested_scopes" + #define FUTURE_GENERATORS "generators" + #define FUTURE_DIVISION "division" + #define FUTURE_ABSOLUTE_IMPORT "absolute_import" + #define FUTURE_WITH_STATEMENT "with_statement" + #define FUTURE_PRINT_FUNCTION "print_function" + #define FUTURE_UNICODE_LITERALS "unicode_literals" + #define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL" + #define FUTURE_GENERATOR_STOP "generator_stop" + #define FUTURE_ANNOTATIONS "annotations" + + struct _mod; /* Declare the existence of this type */ + #define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar) + PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx( + struct _mod *mod, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags, + int optimize, + PyArena *arena); + PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject( + struct _mod *mod, + PyObject *filename, + PyCompilerFlags *flags, + int optimize, + PyArena *arena); + PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST( + struct _mod * mod, + const char *filename /* decoded from the filesystem encoding */ + ); + PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject( + struct _mod * mod, + PyObject *filename + ); + + /* _Py_Mangle is defined in compile.c */ + PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); + + #define PY_INVALID_STACK_EFFECT INT_MAX + PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); + PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump); + + PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize); + + #ifdef __cplusplus + } + #endif + + #endif /* !Py_LIMITED_API */ + + /* These definitions must match corresponding definitions in graminit.h. */ + #define Py_single_input 256 + #define Py_file_input 257 + #define Py_eval_input 258 + #define Py_func_type_input 345 + + #endif /* !Py_COMPILE_H */ + ''').strip() + lines = [line + '\n' for line in text.splitlines()] + lines[-1] = lines[-1][:-1] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, '#ifndef Py_COMPILE_H\n', + IfDirective('ifndef', 'Py_COMPILE_H'), + ()), + (2, '#define Py_COMPILE_H\n', + Constant('Py_COMPILE_H', None), + ('! defined(Py_COMPILE_H)',)), + (3, '\n', + None, + ('! defined(Py_COMPILE_H)',)), + (4, '#ifndef Py_LIMITED_API\n', + IfDirective('ifndef', 'Py_LIMITED_API'), + ('! defined(Py_COMPILE_H)',)), + (5, '#include "code.h"\n', + Include('"code.h"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (6, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (7, '#ifdef __cplusplus\n', + IfDirective('ifdef', '__cplusplus'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (8, 'extern "C" {\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), + (9, '#endif\n', + OtherDirective('endif', None), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), + (10, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (11, ' \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (12, 'struct _node; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (13, 'PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (14, ' \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (15, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (19, '#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)\n', + Constant('PyCF_MASK', '(CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (20, '#define PyCF_MASK_OBSOLETE (CO_NESTED)\n', + Constant('PyCF_MASK_OBSOLETE', '(CO_NESTED)'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (21, '#define PyCF_SOURCE_IS_UTF8 0x0100\n', + Constant('PyCF_SOURCE_IS_UTF8', ' 0x0100'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (22, '#define PyCF_DONT_IMPLY_DEDENT 0x0200\n', + Constant('PyCF_DONT_IMPLY_DEDENT', '0x0200'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (23, '#define PyCF_ONLY_AST 0x0400\n', + Constant('PyCF_ONLY_AST', '0x0400'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (24, '#define PyCF_IGNORE_COOKIE 0x0800\n', + Constant('PyCF_IGNORE_COOKIE', '0x0800'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (25, '#define PyCF_TYPE_COMMENTS 0x1000\n', + Constant('PyCF_TYPE_COMMENTS', '0x1000'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (26, '#define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000\n', + Constant('PyCF_ALLOW_TOP_LEVEL_AWAIT', '0x2000'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (27, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (28, '#ifndef Py_LIMITED_API\n', + IfDirective('ifndef', 'Py_LIMITED_API'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (29, 'typedef struct {\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), + (30, ' int cf_flags; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), + (31, ' int cf_feature_version; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), + (32, '} PyCompilerFlags;\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), + (33, '#endif\n', + OtherDirective('endif', None), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), + (34, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (35, ' \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (36, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (37, 'typedef struct {\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (38, ' int ff_features; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (39, ' int ff_lineno; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (40, '} PyFutureFeatures;\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (41, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (42, '#define FUTURE_NESTED_SCOPES "nested_scopes"\n', + Constant('FUTURE_NESTED_SCOPES', '"nested_scopes"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (43, '#define FUTURE_GENERATORS "generators"\n', + Constant('FUTURE_GENERATORS', '"generators"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (44, '#define FUTURE_DIVISION "division"\n', + Constant('FUTURE_DIVISION', '"division"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (45, '#define FUTURE_ABSOLUTE_IMPORT "absolute_import"\n', + Constant('FUTURE_ABSOLUTE_IMPORT', '"absolute_import"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (46, '#define FUTURE_WITH_STATEMENT "with_statement"\n', + Constant('FUTURE_WITH_STATEMENT', '"with_statement"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (47, '#define FUTURE_PRINT_FUNCTION "print_function"\n', + Constant('FUTURE_PRINT_FUNCTION', '"print_function"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (48, '#define FUTURE_UNICODE_LITERALS "unicode_literals"\n', + Constant('FUTURE_UNICODE_LITERALS', '"unicode_literals"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (49, '#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL"\n', + Constant('FUTURE_BARRY_AS_BDFL', '"barry_as_FLUFL"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (50, '#define FUTURE_GENERATOR_STOP "generator_stop"\n', + Constant('FUTURE_GENERATOR_STOP', '"generator_stop"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (51, '#define FUTURE_ANNOTATIONS "annotations"\n', + Constant('FUTURE_ANNOTATIONS', '"annotations"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (52, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (53, 'struct _mod; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (54, '#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar)\n', + Macro('PyAST_Compile', ('mod', 's', 'f', 'ar'), 'PyAST_CompileEx(mod, s, f, -1, ar)'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (55, 'PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx(\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (56, ' struct _mod *mod,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (57, ' const char *filename, \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (58, ' PyCompilerFlags *flags,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (59, ' int optimize,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (60, ' PyArena *arena);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (61, 'PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject(\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (62, ' struct _mod *mod,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (63, ' PyObject *filename,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (64, ' PyCompilerFlags *flags,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (65, ' int optimize,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (66, ' PyArena *arena);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (67, 'PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (68, ' struct _mod * mod,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (69, ' const char *filename \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (70, ' );\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (71, 'PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject(\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (72, ' struct _mod * mod,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (73, ' PyObject *filename\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (74, ' );\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (75, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (76, ' \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (77, 'PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (78, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (79, '#define PY_INVALID_STACK_EFFECT INT_MAX\n', + Constant('PY_INVALID_STACK_EFFECT', 'INT_MAX'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (80, 'PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (81, 'PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (82, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (83, 'PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (84, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (85, '#ifdef __cplusplus\n', + IfDirective('ifdef', '__cplusplus'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (86, '}\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), + (87, '#endif\n', + OtherDirective('endif', None), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), + (88, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (89, '#endif \n', + OtherDirective('endif', None), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (90, '\n', + None, + ('! defined(Py_COMPILE_H)',)), + (91, ' \n', + None, + ('! defined(Py_COMPILE_H)',)), + (92, '#define Py_single_input 256\n', + Constant('Py_single_input', '256'), + ('! defined(Py_COMPILE_H)',)), + (93, '#define Py_file_input 257\n', + Constant('Py_file_input', '257'), + ('! defined(Py_COMPILE_H)',)), + (94, '#define Py_eval_input 258\n', + Constant('Py_eval_input', '258'), + ('! defined(Py_COMPILE_H)',)), + (95, '#define Py_func_type_input 345\n', + Constant('Py_func_type_input', '345'), + ('! defined(Py_COMPILE_H)',)), + (96, '\n', + None, + ('! defined(Py_COMPILE_H)',)), + (97, '#endif ', + OtherDirective('endif', None), + ('! defined(Py_COMPILE_H)',)), + ]) + self.check_calls( + ('_parse_directive', '#ifndef Py_COMPILE_H'), + ('_parse_directive', '#define Py_COMPILE_H'), + ('_parse_directive', '#ifndef Py_LIMITED_API'), + ('_parse_directive', '#include "code.h"'), + ('_parse_directive', '#ifdef __cplusplus'), + ('_parse_directive', '#endif'), + ('_parse_directive', '#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)'), + ('_parse_directive', '#define PyCF_MASK_OBSOLETE (CO_NESTED)'), + ('_parse_directive', '#define PyCF_SOURCE_IS_UTF8 0x0100'), + ('_parse_directive', '#define PyCF_DONT_IMPLY_DEDENT 0x0200'), + ('_parse_directive', '#define PyCF_ONLY_AST 0x0400'), + ('_parse_directive', '#define PyCF_IGNORE_COOKIE 0x0800'), + ('_parse_directive', '#define PyCF_TYPE_COMMENTS 0x1000'), + ('_parse_directive', '#define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000'), + ('_parse_directive', '#ifndef Py_LIMITED_API'), + ('_parse_directive', '#endif'), + ('_parse_directive', '#define FUTURE_NESTED_SCOPES "nested_scopes"'), + ('_parse_directive', '#define FUTURE_GENERATORS "generators"'), + ('_parse_directive', '#define FUTURE_DIVISION "division"'), + ('_parse_directive', '#define FUTURE_ABSOLUTE_IMPORT "absolute_import"'), + ('_parse_directive', '#define FUTURE_WITH_STATEMENT "with_statement"'), + ('_parse_directive', '#define FUTURE_PRINT_FUNCTION "print_function"'), + ('_parse_directive', '#define FUTURE_UNICODE_LITERALS "unicode_literals"'), + ('_parse_directive', '#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL"'), + ('_parse_directive', '#define FUTURE_GENERATOR_STOP "generator_stop"'), + ('_parse_directive', '#define FUTURE_ANNOTATIONS "annotations"'), + ('_parse_directive', '#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar)'), + ('_parse_directive', '#define PY_INVALID_STACK_EFFECT INT_MAX'), + ('_parse_directive', '#ifdef __cplusplus'), + ('_parse_directive', '#endif'), + ('_parse_directive', '#endif'), + ('_parse_directive', '#define Py_single_input 256'), + ('_parse_directive', '#define Py_file_input 257'), + ('_parse_directive', '#define Py_eval_input 258'), + ('_parse_directive', '#define Py_func_type_input 345'), + ('_parse_directive', '#endif'), + ) + + +class ParseDirectiveTests(unittest.TestCase): + + def test_directives(self): + tests = [ + # includes + ('#include "internal/pycore_pystate.h"', Include('"internal/pycore_pystate.h"')), + ('#include ', Include('')), + + # defines + ('#define SPAM int', Constant('SPAM', 'int')), + ('#define SPAM', Constant('SPAM', '')), + ('#define SPAM(x, y) run(x, y)', Macro('SPAM', ('x', 'y'), 'run(x, y)')), + ('#undef SPAM', None), + + # conditionals + ('#if SPAM', IfDirective('if', 'SPAM')), + # XXX complex conditionls + ('#ifdef SPAM', IfDirective('ifdef', 'SPAM')), + ('#ifndef SPAM', IfDirective('ifndef', 'SPAM')), + ('#elseif SPAM', IfDirective('elseif', 'SPAM')), + # XXX complex conditionls + ('#else', OtherDirective('else', '')), + ('#endif', OtherDirective('endif', '')), + + # other + ('#error oops!', None), + ('#warning oops!', None), + ('#pragma ...', None), + ('#__FILE__ ...', None), + ('#__LINE__ ...', None), + ('#__DATE__ ...', None), + ('#__TIME__ ...', None), + ('#__TIMESTAMP__ ...', None), + + # extra whitespace + (' # include ', Include('')), + ('#else ', OtherDirective('else', '')), + ('#endif ', OtherDirective('endif', '')), + ('#define SPAM int ', Constant('SPAM', 'int')), + ('#define SPAM ', Constant('SPAM', '')), + ] + for line, expected in tests: + if expected is None: + kind, _, text = line[1:].partition(' ') + expected = OtherDirective(kind, text) + with self.subTest(line): + directive = parse_directive(line) + + self.assertEqual(directive, expected) + + def test_bad_directives(self): + tests = [ + # valid directives with bad text + '#define 123', + '#else spam', + '#endif spam', + ] + for kind in PreprocessorDirective.KINDS: + # missing leading "#" + tests.append(kind) + if kind in ('else', 'endif'): + continue + # valid directives with missing text + tests.append('#' + kind) + tests.append('#' + kind + ' ') + for line in tests: + with self.subTest(line): + with self.assertRaises(ValueError): + parse_directive(line) + + def test_not_directives(self): + tests = [ + '', + ' ', + 'directive', + 'directive?', + '???', + ] + for line in tests: + with self.subTest(line): + with self.assertRaises(ValueError): + parse_directive(line) + + +class ConstantTests(unittest.TestCase): + + def test_type(self): + directive = Constant('SPAM', '123') + + self.assertIs(type(directive), Constant) + self.assertIsInstance(directive, PreprocessorDirective) + + def test_attrs(self): + d = Constant('SPAM', '123') + kind, name, value = d.kind, d.name, d.value + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertEqual(value, '123') + + def test_text(self): + tests = [ + (('SPAM', '123'), 'SPAM 123'), + (('SPAM',), 'SPAM'), + ] + for args, expected in tests: + with self.subTest(args): + d = Constant(*args) + text = d.text + + self.assertEqual(text, expected) + + def test_iter(self): + kind, name, value = Constant('SPAM', '123') + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertEqual(value, '123') + + def test_defaults(self): + kind, name, value = Constant('SPAM') + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertIs(value, None) + + def test_coerce(self): + tests = [] + # coerced name, value + for args in wrapped_arg_combos('SPAM', '123'): + tests.append((args, ('SPAM', '123'))) + # missing name, value + for name in ('', ' ', None, StrProxy(' '), ()): + for value in ('', ' ', None, StrProxy(' '), ()): + tests.append( + ((name, value), (None, None))) + # whitespace + tests.extend([ + ((' SPAM ', ' 123 '), ('SPAM', '123')), + ]) + + for args, expected in tests: + with self.subTest(args): + d = Constant(*args) + + self.assertEqual(d[1:], expected) + for i, exp in enumerate(expected, start=1): + if exp is not None: + self.assertIs(type(d[i]), str) + + def test_valid(self): + tests = [ + ('SPAM', '123'), + # unusual name + ('_SPAM_', '123'), + ('X_1', '123'), + # unusual value + ('SPAM', None), + ] + for args in tests: + with self.subTest(args): + directive = Constant(*args) + + directive.validate() + + def test_invalid(self): + tests = [ + # invalid name + ((None, '123'), TypeError), + (('_', '123'), ValueError), + (('1', '123'), ValueError), + (('_1_', '123'), ValueError), + # There is no invalid value (including None). + ] + for args, exctype in tests: + with self.subTest(args): + directive = Constant(*args) + + with self.assertRaises(exctype): + directive.validate() + + +class MacroTests(unittest.TestCase): + + def test_type(self): + directive = Macro('SPAM', ('x', 'y'), '123') + + self.assertIs(type(directive), Macro) + self.assertIsInstance(directive, PreprocessorDirective) + + def test_attrs(self): + d = Macro('SPAM', ('x', 'y'), '123') + kind, name, args, body = d.kind, d.name, d.args, d.body + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertEqual(args, ('x', 'y')) + self.assertEqual(body, '123') + + def test_text(self): + tests = [ + (('SPAM', ('x', 'y'), '123'), 'SPAM(x, y) 123'), + (('SPAM', ('x', 'y'),), 'SPAM(x, y)'), + ] + for args, expected in tests: + with self.subTest(args): + d = Macro(*args) + text = d.text + + self.assertEqual(text, expected) + + def test_iter(self): + kind, name, args, body = Macro('SPAM', ('x', 'y'), '123') + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertEqual(args, ('x', 'y')) + self.assertEqual(body, '123') + + def test_defaults(self): + kind, name, args, body = Macro('SPAM', ('x', 'y')) + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertEqual(args, ('x', 'y')) + self.assertIs(body, None) + + def test_coerce(self): + tests = [] + # coerce name and body + for args in wrapped_arg_combos('SPAM', ('x', 'y'), '123'): + tests.append( + (args, ('SPAM', ('x', 'y'), '123'))) + # coerce args + tests.extend([ + (('SPAM', 'x', '123'), + ('SPAM', ('x',), '123')), + (('SPAM', 'x,y', '123'), + ('SPAM', ('x', 'y'), '123')), + ]) + # coerce arg names + for argnames in wrapped_arg_combos('x', 'y'): + tests.append( + (('SPAM', argnames, '123'), + ('SPAM', ('x', 'y'), '123'))) + # missing name, body + for name in ('', ' ', None, StrProxy(' '), ()): + for argnames in (None, ()): + for body in ('', ' ', None, StrProxy(' '), ()): + tests.append( + ((name, argnames, body), + (None, (), None))) + # missing args + tests.extend([ + (('SPAM', None, '123'), + ('SPAM', (), '123')), + (('SPAM', (), '123'), + ('SPAM', (), '123')), + ]) + # missing arg names + for arg in ('', ' ', None, StrProxy(' '), ()): + tests.append( + (('SPAM', (arg,), '123'), + ('SPAM', (None,), '123'))) + tests.extend([ + (('SPAM', ('x', '', 'z'), '123'), + ('SPAM', ('x', None, 'z'), '123')), + ]) + # whitespace + tests.extend([ + ((' SPAM ', (' x ', ' y '), ' 123 '), + ('SPAM', ('x', 'y'), '123')), + (('SPAM', 'x, y', '123'), + ('SPAM', ('x', 'y'), '123')), + ]) + + for args, expected in tests: + with self.subTest(args): + d = Macro(*args) + + self.assertEqual(d[1:], expected) + for i, exp in enumerate(expected, start=1): + if i == 2: + self.assertIs(type(d[i]), tuple) + elif exp is not None: + self.assertIs(type(d[i]), str) + + def test_init_bad_args(self): + tests = [ + ('SPAM', StrProxy('x'), '123'), + ('SPAM', object(), '123'), + ] + for args in tests: + with self.subTest(args): + with self.assertRaises(TypeError): + Macro(*args) + + def test_valid(self): + tests = [ + # unusual name + ('SPAM', ('x', 'y'), 'run(x, y)'), + ('_SPAM_', ('x', 'y'), 'run(x, y)'), + ('X_1', ('x', 'y'), 'run(x, y)'), + # unusual args + ('SPAM', (), 'run(x, y)'), + ('SPAM', ('_x_', 'y_1'), 'run(x, y)'), + ('SPAM', 'x', 'run(x, y)'), + ('SPAM', 'x, y', 'run(x, y)'), + # unusual body + ('SPAM', ('x', 'y'), None), + ] + for args in tests: + with self.subTest(args): + directive = Macro(*args) + + directive.validate() + + def test_invalid(self): + tests = [ + # invalid name + ((None, ('x', 'y'), '123'), TypeError), + (('_', ('x', 'y'), '123'), ValueError), + (('1', ('x', 'y'), '123'), ValueError), + (('_1', ('x', 'y'), '123'), ValueError), + # invalid args + (('SPAM', (None, 'y'), '123'), ValueError), + (('SPAM', ('x', '_'), '123'), ValueError), + (('SPAM', ('x', '1'), '123'), ValueError), + (('SPAM', ('x', '_1_'), '123'), ValueError), + # There is no invalid body (including None). + ] + for args, exctype in tests: + with self.subTest(args): + directive = Macro(*args) + + with self.assertRaises(exctype): + directive.validate() + + +class IfDirectiveTests(unittest.TestCase): + + def test_type(self): + directive = IfDirective('if', '1') + + self.assertIs(type(directive), IfDirective) + self.assertIsInstance(directive, PreprocessorDirective) + + def test_attrs(self): + d = IfDirective('if', '1') + kind, condition = d.kind, d.condition + + self.assertEqual(kind, 'if') + self.assertEqual(condition, '1') + #self.assertEqual(condition, (ArithmeticCondition('1'),)) + + def test_text(self): + tests = [ + (('if', 'defined(SPAM) && 1 || (EGGS > 3 && defined(HAM))'), + 'defined(SPAM) && 1 || (EGGS > 3 && defined(HAM))'), + ] + for kind in IfDirective.KINDS: + tests.append( + ((kind, 'SPAM'), 'SPAM')) + for args, expected in tests: + with self.subTest(args): + d = IfDirective(*args) + text = d.text + + self.assertEqual(text, expected) + + def test_iter(self): + kind, condition = IfDirective('if', '1') + + self.assertEqual(kind, 'if') + self.assertEqual(condition, '1') + #self.assertEqual(condition, (ArithmeticCondition('1'),)) + + #def test_complex_conditions(self): + # ... + + def test_coerce(self): + tests = [] + for kind in IfDirective.KINDS: + if kind == 'ifdef': + cond = 'defined(SPAM)' + elif kind == 'ifndef': + cond = '! defined(SPAM)' + else: + cond = 'SPAM' + for args in wrapped_arg_combos(kind, 'SPAM'): + tests.append((args, (kind, cond))) + tests.extend([ + ((' ' + kind + ' ', ' SPAM '), (kind, cond)), + ]) + for raw in ('', ' ', None, StrProxy(' '), ()): + tests.append(((kind, raw), (kind, None))) + for kind in ('', ' ', None, StrProxy(' '), ()): + tests.append(((kind, 'SPAM'), (None, 'SPAM'))) + for args, expected in tests: + with self.subTest(args): + d = IfDirective(*args) + + self.assertEqual(tuple(d), expected) + for i, exp in enumerate(expected): + if exp is not None: + self.assertIs(type(d[i]), str) + + def test_valid(self): + tests = [] + for kind in IfDirective.KINDS: + tests.extend([ + (kind, 'SPAM'), + (kind, '_SPAM_'), + (kind, 'X_1'), + (kind, '()'), + (kind, '--'), + (kind, '???'), + ]) + for args in tests: + with self.subTest(args): + directive = IfDirective(*args) + + directive.validate() + + def test_invalid(self): + tests = [] + # kind + tests.extend([ + ((None, 'SPAM'), TypeError), + (('_', 'SPAM'), ValueError), + (('-', 'SPAM'), ValueError), + (('spam', 'SPAM'), ValueError), + ]) + for kind in PreprocessorDirective.KINDS: + if kind in IfDirective.KINDS: + continue + tests.append( + ((kind, 'SPAM'), ValueError)) + # condition + for kind in IfDirective.KINDS: + tests.extend([ + ((kind, None), TypeError), + # Any other condition is valid. + ]) + for args, exctype in tests: + with self.subTest(args): + directive = IfDirective(*args) + + with self.assertRaises(exctype): + directive.validate() + + +class IncludeTests(unittest.TestCase): + + def test_type(self): + directive = Include('') + + self.assertIs(type(directive), Include) + self.assertIsInstance(directive, PreprocessorDirective) + + def test_attrs(self): + d = Include('') + kind, file, text = d.kind, d.file, d.text + + self.assertEqual(kind, 'include') + self.assertEqual(file, '') + self.assertEqual(text, '') + + def test_iter(self): + kind, file = Include('') + + self.assertEqual(kind, 'include') + self.assertEqual(file, '') + + def test_coerce(self): + tests = [] + for arg, in wrapped_arg_combos(''): + tests.append((arg, '')) + tests.extend([ + (' ', ''), + ]) + for arg in ('', ' ', None, StrProxy(' '), ()): + tests.append((arg, None )) + for arg, expected in tests: + with self.subTest(arg): + _, file = Include(arg) + + self.assertEqual(file, expected) + if expected is not None: + self.assertIs(type(file), str) + + def test_valid(self): + tests = [ + '', + '"spam.h"', + '"internal/pycore_pystate.h"', + ] + for arg in tests: + with self.subTest(arg): + directive = Include(arg) + + directive.validate() + + def test_invalid(self): + tests = [ + (None, TypeError), + # We currently don't check the file. + ] + for arg, exctype in tests: + with self.subTest(arg): + directive = Include(arg) + + with self.assertRaises(exctype): + directive.validate() + + +class OtherDirectiveTests(unittest.TestCase): + + def test_type(self): + directive = OtherDirective('undef', 'SPAM') + + self.assertIs(type(directive), OtherDirective) + self.assertIsInstance(directive, PreprocessorDirective) + + def test_attrs(self): + d = OtherDirective('undef', 'SPAM') + kind, text = d.kind, d.text + + self.assertEqual(kind, 'undef') + self.assertEqual(text, 'SPAM') + + def test_iter(self): + kind, text = OtherDirective('undef', 'SPAM') + + self.assertEqual(kind, 'undef') + self.assertEqual(text, 'SPAM') + + def test_coerce(self): + tests = [] + for kind in OtherDirective.KINDS: + if kind in ('else', 'endif'): + continue + for args in wrapped_arg_combos(kind, '...'): + tests.append((args, (kind, '...'))) + tests.extend([ + ((' ' + kind + ' ', ' ... '), (kind, '...')), + ]) + for raw in ('', ' ', None, StrProxy(' '), ()): + tests.append(((kind, raw), (kind, None))) + for kind in ('else', 'endif'): + for args in wrapped_arg_combos(kind, None): + tests.append((args, (kind, None))) + tests.extend([ + ((' ' + kind + ' ', None), (kind, None)), + ]) + for kind in ('', ' ', None, StrProxy(' '), ()): + tests.append(((kind, '...'), (None, '...'))) + for args, expected in tests: + with self.subTest(args): + d = OtherDirective(*args) + + self.assertEqual(tuple(d), expected) + for i, exp in enumerate(expected): + if exp is not None: + self.assertIs(type(d[i]), str) + + def test_valid(self): + tests = [] + for kind in OtherDirective.KINDS: + if kind in ('else', 'endif'): + continue + tests.extend([ + (kind, '...'), + (kind, '???'), + (kind, 'SPAM'), + (kind, '1 + 1'), + ]) + for kind in ('else', 'endif'): + tests.append((kind, None)) + for args in tests: + with self.subTest(args): + directive = OtherDirective(*args) + + directive.validate() + + def test_invalid(self): + tests = [] + # kind + tests.extend([ + ((None, '...'), TypeError), + (('_', '...'), ValueError), + (('-', '...'), ValueError), + (('spam', '...'), ValueError), + ]) + for kind in PreprocessorDirective.KINDS: + if kind in OtherDirective.KINDS: + continue + tests.append( + ((kind, None), ValueError)) + # text + for kind in OtherDirective.KINDS: + if kind in ('else', 'endif'): + tests.extend([ + # Any text is invalid. + ((kind, 'SPAM'), ValueError), + ((kind, '...'), ValueError), + ]) + else: + tests.extend([ + ((kind, None), TypeError), + # Any other text is valid. + ]) + for args, exctype in tests: + with self.subTest(args): + directive = OtherDirective(*args) + + with self.assertRaises(exctype): + directive.validate() diff --git a/Lib/test/test_tools/test_c_analyzer/test_symbols/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_symbols/__init__.py new file mode 100644 index 00000000..bc502ef3 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_symbols/__init__.py @@ -0,0 +1,6 @@ +import os.path +from test.support import load_package_tests + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_symbols/test_info.py b/Lib/test/test_tools/test_c_analyzer/test_symbols/test_info.py new file mode 100644 index 00000000..1282a897 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_symbols/test_info.py @@ -0,0 +1,192 @@ +import string +import unittest + +from ..util import PseudoStr, StrProxy, Object +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.info import ID + from c_analyzer.symbols.info import Symbol + + +class SymbolTests(unittest.TestCase): + + VALID_ARGS = ( + ID('x/y/z/spam.c', 'func', 'eggs'), + Symbol.KIND.VARIABLE, + False, + ) + VALID_KWARGS = dict(zip(Symbol._fields, VALID_ARGS)) + VALID_EXPECTED = VALID_ARGS + + def test_init_typical_binary_local(self): + id = ID(None, None, 'spam') + symbol = Symbol( + id=id, + kind=Symbol.KIND.VARIABLE, + external=False, + ) + + self.assertEqual(symbol, ( + id, + Symbol.KIND.VARIABLE, + False, + )) + + def test_init_typical_binary_global(self): + id = ID('Python/ceval.c', None, 'spam') + symbol = Symbol( + id=id, + kind=Symbol.KIND.VARIABLE, + external=False, + ) + + self.assertEqual(symbol, ( + id, + Symbol.KIND.VARIABLE, + False, + )) + + def test_init_coercion(self): + tests = [ + ('str subclass', + dict( + id=PseudoStr('eggs'), + kind=PseudoStr('variable'), + external=0, + ), + (ID(None, None, 'eggs'), + Symbol.KIND.VARIABLE, + False, + )), + ('with filename', + dict( + id=('x/y/z/spam.c', 'eggs'), + kind=PseudoStr('variable'), + external=0, + ), + (ID('x/y/z/spam.c', None, 'eggs'), + Symbol.KIND.VARIABLE, + False, + )), + ('non-str 1', + dict( + id=('a', 'b', 'c'), + kind=StrProxy('variable'), + external=0, + ), + (ID('a', 'b', 'c'), + Symbol.KIND.VARIABLE, + False, + )), + ('non-str 2', + dict( + id=('a', 'b', 'c'), + kind=Object(), + external=0, + ), + (ID('a', 'b', 'c'), + '', + False, + )), + ] + for summary, kwargs, expected in tests: + with self.subTest(summary): + symbol = Symbol(**kwargs) + + for field in Symbol._fields: + value = getattr(symbol, field) + if field == 'external': + self.assertIs(type(value), bool) + elif field == 'id': + self.assertIs(type(value), ID) + else: + self.assertIs(type(value), str) + self.assertEqual(tuple(symbol), expected) + + def test_init_all_missing(self): + id = ID(None, None, 'spam') + + symbol = Symbol(id) + + self.assertEqual(symbol, ( + id, + Symbol.KIND.VARIABLE, + None, + )) + + def test_fields(self): + id = ID('z', 'x', 'a') + + symbol = Symbol(id, 'b', False) + + self.assertEqual(symbol.id, id) + self.assertEqual(symbol.kind, 'b') + self.assertIs(symbol.external, False) + + def test___getattr__(self): + id = ID('z', 'x', 'a') + symbol = Symbol(id, 'b', False) + + filename = symbol.filename + funcname = symbol.funcname + name = symbol.name + + self.assertEqual(filename, 'z') + self.assertEqual(funcname, 'x') + self.assertEqual(name, 'a') + + def test_validate_typical(self): + id = ID('z', 'x', 'a') + + symbol = Symbol( + id=id, + kind=Symbol.KIND.VARIABLE, + external=False, + ) + + symbol.validate() # This does not fail. + + def test_validate_missing_field(self): + for field in Symbol._fields: + with self.subTest(field): + symbol = Symbol(**self.VALID_KWARGS) + symbol = symbol._replace(**{field: None}) + + with self.assertRaises(TypeError): + symbol.validate() + + def test_validate_bad_field(self): + badch = tuple(c for c in string.punctuation + string.digits) + notnames = ( + '1a', + 'a.b', + 'a-b', + '&a', + 'a++', + ) + badch + tests = [ + ('id', notnames), + ('kind', ('bogus',)), + ] + seen = set() + for field, invalid in tests: + for value in invalid: + if field != 'kind': + seen.add(value) + with self.subTest(f'{field}={value!r}'): + symbol = Symbol(**self.VALID_KWARGS) + symbol = symbol._replace(**{field: value}) + + with self.assertRaises(ValueError): + symbol.validate() + + for field, invalid in tests: + if field == 'kind': + continue + valid = seen - set(invalid) + for value in valid: + with self.subTest(f'{field}={value!r}'): + symbol = Symbol(**self.VALID_KWARGS) + symbol = symbol._replace(**{field: value}) + + symbol.validate() # This does not fail. diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_variables/__init__.py new file mode 100644 index 00000000..bc502ef3 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_variables/__init__.py @@ -0,0 +1,6 @@ +import os.path +from test.support import load_package_tests + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/test_find.py b/Lib/test/test_tools/test_c_analyzer/test_variables/test_find.py new file mode 100644 index 00000000..7a13cf3f --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_variables/test_find.py @@ -0,0 +1,124 @@ +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.variables import info + from c_analyzer.variables.find import ( + vars_from_binary, + ) + + +class _Base(unittest.TestCase): + + maxDiff = None + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + +class VarsFromBinaryTests(_Base): + + _return_iter_vars = () + _return_get_symbol_resolver = None + + def setUp(self): + super().setUp() + + self.kwargs = dict( + _iter_vars=self._iter_vars, + _get_symbol_resolver=self._get_symbol_resolver, + ) + + def _iter_vars(self, binfile, resolve, handle_id): + self.calls.append(('_iter_vars', (binfile, resolve, handle_id))) + return [(v, v.id) for v in self._return_iter_vars] + + def _get_symbol_resolver(self, known=None, dirnames=(), *, + handle_var, + filenames=None, + check_filename=None, + perfilecache=None, + ): + self.calls.append(('_get_symbol_resolver', + (known, dirnames, handle_var, filenames, + check_filename, perfilecache))) + return self._return_get_symbol_resolver + + def test_typical(self): + resolver = self._return_get_symbol_resolver = object() + variables = self._return_iter_vars = [ + info.Variable.from_parts('dir1/spam.c', None, 'var1', 'int'), + info.Variable.from_parts('dir1/spam.c', None, 'var2', 'static int'), + info.Variable.from_parts('dir1/spam.c', None, 'var3', 'char *'), + info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', 'const char *'), + info.Variable.from_parts('dir1/eggs.c', None, 'var1', 'static int'), + info.Variable.from_parts('dir1/eggs.c', 'func1', 'var2', 'static char *'), + ] + known = object() + filenames = object() + + found = list(vars_from_binary('python', + known=known, + filenames=filenames, + **self.kwargs)) + + self.assertEqual(found, [ + info.Variable.from_parts('dir1/spam.c', None, 'var1', 'int'), + info.Variable.from_parts('dir1/spam.c', None, 'var2', 'static int'), + info.Variable.from_parts('dir1/spam.c', None, 'var3', 'char *'), + info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', 'const char *'), + info.Variable.from_parts('dir1/eggs.c', None, 'var1', 'static int'), + info.Variable.from_parts('dir1/eggs.c', 'func1', 'var2', 'static char *'), + ]) + self.assertEqual(self.calls, [ + ('_get_symbol_resolver', (filenames, known, info.Variable.from_id, None, None, {})), + ('_iter_vars', ('python', resolver, None)), + ]) + +# self._return_iter_symbols = [ +# s_info.Symbol(('dir1/spam.c', None, 'var1'), 'variable', False), +# s_info.Symbol(('dir1/spam.c', None, 'var2'), 'variable', False), +# s_info.Symbol(('dir1/spam.c', None, 'func1'), 'function', False), +# s_info.Symbol(('dir1/spam.c', None, 'func2'), 'function', True), +# s_info.Symbol(('dir1/spam.c', None, 'var3'), 'variable', False), +# s_info.Symbol(('dir1/spam.c', 'func2', 'var4'), 'variable', False), +# s_info.Symbol(('dir1/ham.c', None, 'var1'), 'variable', True), +# s_info.Symbol(('dir1/eggs.c', None, 'var1'), 'variable', False), +# s_info.Symbol(('dir1/eggs.c', None, 'xyz'), 'other', False), +# s_info.Symbol(('dir1/eggs.c', '???', 'var2'), 'variable', False), +# s_info.Symbol(('???', None, 'var_x'), 'variable', False), +# s_info.Symbol(('???', '???', 'var_y'), 'variable', False), +# s_info.Symbol((None, None, '???'), 'other', False), +# ] +# known = object() +# +# vars_from_binary('python', knownvars=known, **this.kwargs) +# found = list(globals_from_symbols(['dir1'], self.iter_symbols)) +# +# self.assertEqual(found, [ +# info.Variable.from_parts('dir1/spam.c', None, 'var1', '???'), +# info.Variable.from_parts('dir1/spam.c', None, 'var2', '???'), +# info.Variable.from_parts('dir1/spam.c', None, 'var3', '???'), +# info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', '???'), +# info.Variable.from_parts('dir1/eggs.c', None, 'var1', '???'), +# ]) +# self.assertEqual(self.calls, [ +# ('iter_symbols', (['dir1'],)), +# ]) +# +# def test_no_symbols(self): +# self._return_iter_symbols = [] +# +# found = list(globals_from_symbols(['dir1'], self.iter_symbols)) +# +# self.assertEqual(found, []) +# self.assertEqual(self.calls, [ +# ('iter_symbols', (['dir1'],)), +# ]) + + # XXX need functional test diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/test_info.py b/Lib/test/test_tools/test_c_analyzer/test_variables/test_info.py new file mode 100644 index 00000000..d424d8ee --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_variables/test_info.py @@ -0,0 +1,244 @@ +import string +import unittest + +from ..util import PseudoStr, StrProxy, Object +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.info import UNKNOWN, ID + from c_analyzer.variables.info import ( + normalize_vartype, Variable + ) + + +class NormalizeVartypeTests(unittest.TestCase): + + def test_basic(self): + tests = [ + (None, None), + ('', ''), + ('int', 'int'), + (PseudoStr('int'), 'int'), + (StrProxy('int'), 'int'), + ] + for vartype, expected in tests: + with self.subTest(vartype): + normalized = normalize_vartype(vartype) + + self.assertEqual(normalized, expected) + + +class VariableTests(unittest.TestCase): + + VALID_ARGS = ( + ('x/y/z/spam.c', 'func', 'eggs'), + 'static', + 'int', + ) + VALID_KWARGS = dict(zip(Variable._fields, VALID_ARGS)) + VALID_EXPECTED = VALID_ARGS + + def test_init_typical_global(self): + for storage in ('static', 'extern', 'implicit'): + with self.subTest(storage): + static = Variable( + id=ID( + filename='x/y/z/spam.c', + funcname=None, + name='eggs', + ), + storage=storage, + vartype='int', + ) + + self.assertEqual(static, ( + ('x/y/z/spam.c', None, 'eggs'), + storage, + 'int', + )) + + def test_init_typical_local(self): + for storage in ('static', 'local'): + with self.subTest(storage): + static = Variable( + id=ID( + filename='x/y/z/spam.c', + funcname='func', + name='eggs', + ), + storage=storage, + vartype='int', + ) + + self.assertEqual(static, ( + ('x/y/z/spam.c', 'func', 'eggs'), + storage, + 'int', + )) + + def test_init_all_missing(self): + for value in ('', None): + with self.subTest(repr(value)): + static = Variable( + id=value, + storage=value, + vartype=value, + ) + + self.assertEqual(static, ( + None, + None, + None, + )) + + def test_init_all_coerced(self): + id = ID('x/y/z/spam.c', 'func', 'spam') + tests = [ + ('str subclass', + dict( + id=( + PseudoStr('x/y/z/spam.c'), + PseudoStr('func'), + PseudoStr('spam'), + ), + storage=PseudoStr('static'), + vartype=PseudoStr('int'), + ), + (id, + 'static', + 'int', + )), + ('non-str 1', + dict( + id=id, + storage=Object(), + vartype=Object(), + ), + (id, + '', + '', + )), + ('non-str 2', + dict( + id=id, + storage=StrProxy('static'), + vartype=StrProxy('variable'), + ), + (id, + 'static', + 'variable', + )), + ('non-str', + dict( + id=id, + storage=('a', 'b', 'c'), + vartype=('x', 'y', 'z'), + ), + (id, + "('a', 'b', 'c')", + "('x', 'y', 'z')", + )), + ] + for summary, kwargs, expected in tests: + with self.subTest(summary): + static = Variable(**kwargs) + + for field in Variable._fields: + value = getattr(static, field) + if field == 'id': + self.assertIs(type(value), ID) + else: + self.assertIs(type(value), str) + self.assertEqual(tuple(static), expected) + + def test_iterable(self): + static = Variable(**self.VALID_KWARGS) + + id, storage, vartype = static + + values = (id, storage, vartype) + for value, expected in zip(values, self.VALID_EXPECTED): + self.assertEqual(value, expected) + + def test_fields(self): + static = Variable(('a', 'b', 'z'), 'x', 'y') + + self.assertEqual(static.id, ('a', 'b', 'z')) + self.assertEqual(static.storage, 'x') + self.assertEqual(static.vartype, 'y') + + def test___getattr__(self): + static = Variable(('a', 'b', 'z'), 'x', 'y') + + self.assertEqual(static.filename, 'a') + self.assertEqual(static.funcname, 'b') + self.assertEqual(static.name, 'z') + + def test_validate_typical(self): + validstorage = ('static', 'extern', 'implicit', 'local') + self.assertEqual(set(validstorage), set(Variable.STORAGE)) + + for storage in validstorage: + with self.subTest(storage): + static = Variable( + id=ID( + filename='x/y/z/spam.c', + funcname='func', + name='eggs', + ), + storage=storage, + vartype='int', + ) + + static.validate() # This does not fail. + + def test_validate_missing_field(self): + for field in Variable._fields: + with self.subTest(field): + static = Variable(**self.VALID_KWARGS) + static = static._replace(**{field: None}) + + with self.assertRaises(TypeError): + static.validate() + for field in ('storage', 'vartype'): + with self.subTest(field): + static = Variable(**self.VALID_KWARGS) + static = static._replace(**{field: UNKNOWN}) + + with self.assertRaises(TypeError): + static.validate() + + def test_validate_bad_field(self): + badch = tuple(c for c in string.punctuation + string.digits) + notnames = ( + '1a', + 'a.b', + 'a-b', + '&a', + 'a++', + ) + badch + tests = [ + ('id', ()), # Any non-empty str is okay. + ('storage', ('external', 'global') + notnames), + ('vartype', ()), # Any non-empty str is okay. + ] + seen = set() + for field, invalid in tests: + for value in invalid: + seen.add(value) + with self.subTest(f'{field}={value!r}'): + static = Variable(**self.VALID_KWARGS) + static = static._replace(**{field: value}) + + with self.assertRaises(ValueError): + static.validate() + + for field, invalid in tests: + if field == 'id': + continue + valid = seen - set(invalid) + for value in valid: + with self.subTest(f'{field}={value!r}'): + static = Variable(**self.VALID_KWARGS) + static = static._replace(**{field: value}) + + static.validate() # This does not fail. diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/test_known.py b/Lib/test/test_tools/test_c_analyzer/test_variables/test_known.py new file mode 100644 index 00000000..49ff45c6 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_variables/test_known.py @@ -0,0 +1,139 @@ +import re +import textwrap +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.info import ID + from c_analyzer.variables.info import Variable + from c_analyzer.variables.known import ( + read_file, + from_file, + ) + +class _BaseTests(unittest.TestCase): + + maxDiff = None + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + +class ReadFileTests(_BaseTests): + + _return_read_tsv = () + + def _read_tsv(self, *args): + self.calls.append(('_read_tsv', args)) + return self._return_read_tsv + + def test_typical(self): + lines = textwrap.dedent(''' + filename funcname name kind declaration + file1.c - var1 variable static int + file1.c func1 local1 variable static int + file1.c - var2 variable int + file1.c func2 local2 variable char * + file2.c - var1 variable char * + ''').strip().splitlines() + lines = [re.sub(r'\s+', '\t', line, 4) for line in lines] + self._return_read_tsv = [tuple(v.strip() for v in line.split('\t')) + for line in lines[1:]] + + known = list(read_file('known.tsv', _read_tsv=self._read_tsv)) + + self.assertEqual(known, [ + ('variable', ID('file1.c', '', 'var1'), 'static int'), + ('variable', ID('file1.c', 'func1', 'local1'), 'static int'), + ('variable', ID('file1.c', '', 'var2'), 'int'), + ('variable', ID('file1.c', 'func2', 'local2'), 'char *'), + ('variable', ID('file2.c', '', 'var1'), 'char *'), + ]) + self.assertEqual(self.calls, [ + ('_read_tsv', + ('known.tsv', 'filename\tfuncname\tname\tkind\tdeclaration')), + ]) + + def test_empty(self): + self._return_read_tsv = [] + + known = list(read_file('known.tsv', _read_tsv=self._read_tsv)) + + self.assertEqual(known, []) + self.assertEqual(self.calls, [ + ('_read_tsv', ('known.tsv', 'filename\tfuncname\tname\tkind\tdeclaration')), + ]) + + +class FromFileTests(_BaseTests): + + _return_read_file = () + _return_handle_var = () + + def _read_file(self, infile): + self.calls.append(('_read_file', (infile,))) + return iter(self._return_read_file) + + def _handle_var(self, varid, decl): + self.calls.append(('_handle_var', (varid, decl))) + var = self._return_handle_var.pop(0) + return var + + def test_typical(self): + expected = [ + Variable.from_parts('file1.c', '', 'var1', 'static int'), + Variable.from_parts('file1.c', 'func1', 'local1', 'static int'), + Variable.from_parts('file1.c', '', 'var2', 'int'), + Variable.from_parts('file1.c', 'func2', 'local2', 'char *'), + Variable.from_parts('file2.c', '', 'var1', 'char *'), + ] + self._return_read_file = [('variable', v.id, v.vartype) + for v in expected] +# ('variable', ID('file1.c', '', 'var1'), 'static int'), +# ('variable', ID('file1.c', 'func1', 'local1'), 'static int'), +# ('variable', ID('file1.c', '', 'var2'), 'int'), +# ('variable', ID('file1.c', 'func2', 'local2'), 'char *'), +# ('variable', ID('file2.c', '', 'var1'), 'char *'), +# ] + self._return_handle_var = list(expected) # a copy + + known = from_file('known.tsv', + handle_var=self._handle_var, + _read_file=self._read_file, + ) + + self.assertEqual(known, { + 'variables': {v.id: v for v in expected}, + }) +# Variable.from_parts('file1.c', '', 'var1', 'static int'), +# Variable.from_parts('file1.c', 'func1', 'local1', 'static int'), +# Variable.from_parts('file1.c', '', 'var2', 'int'), +# Variable.from_parts('file1.c', 'func2', 'local2', 'char *'), +# Variable.from_parts('file2.c', '', 'var1', 'char *'), +# ]}, +# }) + self.assertEqual(self.calls, [ + ('_read_file', ('known.tsv',)), + *[('_handle_var', (v.id, v.vartype)) + for v in expected], + ]) + + def test_empty(self): + self._return_read_file = [] + + known = from_file('known.tsv', + handle_var=self._handle_var, + _read_file=self._read_file, + ) + + self.assertEqual(known, { + 'variables': {}, + }) + self.assertEqual(self.calls, [ + ('_read_file', ('known.tsv',)), + ]) diff --git a/Lib/test/test_tools/test_c_analyzer/util.py b/Lib/test/test_tools/test_c_analyzer/util.py new file mode 100644 index 00000000..ba73b0a4 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/util.py @@ -0,0 +1,60 @@ +import itertools + + +class PseudoStr(str): + pass + + +class StrProxy: + def __init__(self, value): + self.value = value + def __str__(self): + return self.value + def __bool__(self): + return bool(self.value) + + +class Object: + def __repr__(self): + return '' + + +def wrapped_arg_combos(*args, + wrappers=(PseudoStr, StrProxy), + skip=(lambda w, i, v: not isinstance(v, str)), + ): + """Yield every possible combination of wrapped items for the given args. + + Effectively, the wrappers are applied to the args according to the + powerset of the args indicies. So the result includes the args + completely unwrapped. + + If "skip" is supplied (default is to skip all non-str values) and + it returns True for a given arg index/value then that arg will + remain unwrapped, + + Only unique results are returned. If an arg was skipped for one + of the combinations then it could end up matching one of the other + combinations. In that case only one of them will be yielded. + """ + if not args: + return + indices = list(range(len(args))) + # The powerset (from recipe in the itertools docs). + combos = itertools.chain.from_iterable(itertools.combinations(indices, r) + for r in range(len(indices)+1)) + seen = set() + for combo in combos: + for wrap in wrappers: + indexes = [] + applied = list(args) + for i in combo: + arg = args[i] + if skip and skip(wrap, i, arg): + continue + indexes.append(i) + applied[i] = wrap(arg) + key = (wrap, tuple(indexes)) + if key not in seen: + yield tuple(applied) + seen.add(key) diff --git a/Lib/test/test_tools/test_lll.py b/Lib/test/test_tools/test_lll.py index b01e2188..568cbfb5 100644 --- a/Lib/test/test_tools/test_lll.py +++ b/Lib/test/test_tools/test_lll.py @@ -1,7 +1,6 @@ """Tests for the lll script in the Tools/script directory.""" import os -import sys import tempfile from test import support from test.test_tools import skip_if_missing, import_tool diff --git a/Lib/test/test_tools/test_md5sum.py b/Lib/test/test_tools/test_md5sum.py index fb565b73..321bc4bb 100644 --- a/Lib/test/test_tools/test_md5sum.py +++ b/Lib/test/test_tools/test_md5sum.py @@ -3,12 +3,14 @@ import os import unittest from test import support +from test.support import hashlib_helper from test.support.script_helper import assert_python_ok, assert_python_failure from test.test_tools import scriptsdir, skip_if_missing skip_if_missing() +@hashlib_helper.requires_hashdigest('md5') class MD5SumTests(unittest.TestCase): @classmethod def setUpClass(cls): diff --git a/Lib/test/test_tools/test_pathfix.py b/Lib/test/test_tools/test_pathfix.py index ec361178..03ed29d3 100644 --- a/Lib/test/test_tools/test_pathfix.py +++ b/Lib/test/test_tools/test_pathfix.py @@ -3,7 +3,7 @@ import subprocess import sys import unittest from test import support -from test.test_tools import import_tool, scriptsdir, skip_if_missing +from test.test_tools import scriptsdir, skip_if_missing # need Tools/script/ directory: skip if run on Python installed on the system @@ -30,16 +30,18 @@ class TestPathfixFunctional(unittest.TestCase): with open(filename, 'w', encoding='utf8') as f: f.write(f'{shebang}\n' + 'print("Hello world")\n') + encoding = sys.getfilesystemencoding() proc = subprocess.run( [sys.executable, self.script, *pathfix_flags, '-n', pathfix_arg], - capture_output=True, text=1) + env={**os.environ, 'PYTHONIOENCODING': encoding}, + capture_output=True) if stdout == '' and proc.returncode == 0: stdout = f'{filename}: updating\n' self.assertEqual(proc.returncode, exitcode, proc) - self.assertEqual(proc.stdout, stdout, proc) - self.assertEqual(proc.stderr, stderr, proc) + self.assertEqual(proc.stdout.decode(encoding), stdout.replace('\n', os.linesep), proc) + self.assertEqual(proc.stderr.decode(encoding), stderr.replace('\n', os.linesep), proc) with open(filename, 'r', encoding='utf8') as f: output = f.read() diff --git a/Lib/test/test_tools/test_sundry.py b/Lib/test/test_tools/test_sundry.py index f5fed014..10eb6941 100644 --- a/Lib/test/test_tools/test_sundry.py +++ b/Lib/test/test_tools/test_sundry.py @@ -2,7 +2,7 @@ This file contains extremely basic regression tests for the scripts found in the Tools directory of a Python checkout or tarball which don't have separate -tests of their own, such as h2py.py. +tests of their own. """ import os diff --git a/Lib/test/test_tools/test_unparse.py b/Lib/test/test_tools/test_unparse.py deleted file mode 100644 index d89cb097..00000000 --- a/Lib/test/test_tools/test_unparse.py +++ /dev/null @@ -1,332 +0,0 @@ -"""Tests for the unparse.py script in the Tools/parser directory.""" - -import unittest -import test.support -import io -import os -import random -import tokenize -import ast - -from test.test_tools import basepath, toolsdir, skip_if_missing - -skip_if_missing() - -parser_path = os.path.join(toolsdir, "parser") - -with test.support.DirsOnSysPath(parser_path): - import unparse - -def read_pyfile(filename): - """Read and return the contents of a Python source file (as a - string), taking into account the file encoding.""" - with open(filename, "rb") as pyfile: - encoding = tokenize.detect_encoding(pyfile.readline)[0] - with open(filename, "r", encoding=encoding) as pyfile: - source = pyfile.read() - return source - -for_else = """\ -def f(): - for x in range(10): - break - else: - y = 2 - z = 3 -""" - -while_else = """\ -def g(): - while True: - break - else: - y = 2 - z = 3 -""" - -relative_import = """\ -from . import fred -from .. import barney -from .australia import shrimp as prawns -""" - -nonlocal_ex = """\ -def f(): - x = 1 - def g(): - nonlocal x - x = 2 - y = 7 - def h(): - nonlocal x, y -""" - -# also acts as test for 'except ... as ...' -raise_from = """\ -try: - 1 / 0 -except ZeroDivisionError as e: - raise ArithmeticError from e -""" - -class_decorator = """\ -@f1(arg) -@f2 -class Foo: pass -""" - -elif1 = """\ -if cond1: - suite1 -elif cond2: - suite2 -else: - suite3 -""" - -elif2 = """\ -if cond1: - suite1 -elif cond2: - suite2 -""" - -try_except_finally = """\ -try: - suite1 -except ex1: - suite2 -except ex2: - suite3 -else: - suite4 -finally: - suite5 -""" - -with_simple = """\ -with f(): - suite1 -""" - -with_as = """\ -with f() as x: - suite1 -""" - -with_two_items = """\ -with f() as x, g() as y: - suite1 -""" - -class ASTTestCase(unittest.TestCase): - def assertASTEqual(self, ast1, ast2): - self.assertEqual(ast.dump(ast1), ast.dump(ast2)) - - def check_roundtrip(self, code1, filename="internal"): - ast1 = compile(code1, filename, "exec", ast.PyCF_ONLY_AST) - unparse_buffer = io.StringIO() - unparse.Unparser(ast1, unparse_buffer) - code2 = unparse_buffer.getvalue() - ast2 = compile(code2, filename, "exec", ast.PyCF_ONLY_AST) - self.assertASTEqual(ast1, ast2) - -class UnparseTestCase(ASTTestCase): - # Tests for specific bugs found in earlier versions of unparse - - def test_fstrings(self): - # See issue 25180 - self.check_roundtrip(r"""f'{f"{0}"*3}'""") - self.check_roundtrip(r"""f'{f"{y}"*3}'""") - - def test_strings(self): - self.check_roundtrip("u'foo'") - self.check_roundtrip("r'foo'") - self.check_roundtrip("b'foo'") - - def test_del_statement(self): - self.check_roundtrip("del x, y, z") - - def test_shifts(self): - self.check_roundtrip("45 << 2") - self.check_roundtrip("13 >> 7") - - def test_for_else(self): - self.check_roundtrip(for_else) - - def test_while_else(self): - self.check_roundtrip(while_else) - - def test_unary_parens(self): - self.check_roundtrip("(-1)**7") - self.check_roundtrip("(-1.)**8") - self.check_roundtrip("(-1j)**6") - self.check_roundtrip("not True or False") - self.check_roundtrip("True or not False") - - def test_integer_parens(self): - self.check_roundtrip("3 .__abs__()") - - def test_huge_float(self): - self.check_roundtrip("1e1000") - self.check_roundtrip("-1e1000") - self.check_roundtrip("1e1000j") - self.check_roundtrip("-1e1000j") - - def test_min_int(self): - self.check_roundtrip(str(-2**31)) - self.check_roundtrip(str(-2**63)) - - def test_imaginary_literals(self): - self.check_roundtrip("7j") - self.check_roundtrip("-7j") - self.check_roundtrip("0j") - self.check_roundtrip("-0j") - - def test_lambda_parentheses(self): - self.check_roundtrip("(lambda: int)()") - - def test_chained_comparisons(self): - self.check_roundtrip("1 < 4 <= 5") - self.check_roundtrip("a is b is c is not d") - - def test_function_arguments(self): - self.check_roundtrip("def f(): pass") - self.check_roundtrip("def f(a): pass") - self.check_roundtrip("def f(b = 2): pass") - self.check_roundtrip("def f(a, b): pass") - self.check_roundtrip("def f(a, b = 2): pass") - self.check_roundtrip("def f(a = 5, b = 2): pass") - self.check_roundtrip("def f(*, a = 1, b = 2): pass") - self.check_roundtrip("def f(*, a = 1, b): pass") - self.check_roundtrip("def f(*, a, b = 2): pass") - self.check_roundtrip("def f(a, b = None, *, c, **kwds): pass") - self.check_roundtrip("def f(a=2, *args, c=5, d, **kwds): pass") - self.check_roundtrip("def f(*args, **kwargs): pass") - - def test_relative_import(self): - self.check_roundtrip(relative_import) - - def test_nonlocal(self): - self.check_roundtrip(nonlocal_ex) - - def test_raise_from(self): - self.check_roundtrip(raise_from) - - def test_bytes(self): - self.check_roundtrip("b'123'") - - def test_annotations(self): - self.check_roundtrip("def f(a : int): pass") - self.check_roundtrip("def f(a: int = 5): pass") - self.check_roundtrip("def f(*args: [int]): pass") - self.check_roundtrip("def f(**kwargs: dict): pass") - self.check_roundtrip("def f() -> None: pass") - - def test_set_literal(self): - self.check_roundtrip("{'a', 'b', 'c'}") - - def test_set_comprehension(self): - self.check_roundtrip("{x for x in range(5)}") - - def test_dict_comprehension(self): - self.check_roundtrip("{x: x*x for x in range(10)}") - - def test_class_decorators(self): - self.check_roundtrip(class_decorator) - - def test_class_definition(self): - self.check_roundtrip("class A(metaclass=type, *[], **{}): pass") - - def test_elifs(self): - self.check_roundtrip(elif1) - self.check_roundtrip(elif2) - - def test_try_except_finally(self): - self.check_roundtrip(try_except_finally) - - def test_starred_assignment(self): - self.check_roundtrip("a, *b, c = seq") - self.check_roundtrip("a, (*b, c) = seq") - self.check_roundtrip("a, *b[0], c = seq") - self.check_roundtrip("a, *(b, c) = seq") - - def test_with_simple(self): - self.check_roundtrip(with_simple) - - def test_with_as(self): - self.check_roundtrip(with_as) - - def test_with_two_items(self): - self.check_roundtrip(with_two_items) - - def test_dict_unpacking_in_dict(self): - # See issue 26489 - self.check_roundtrip(r"""{**{'y': 2}, 'x': 1}""") - self.check_roundtrip(r"""{**{'y': 2}, **{'x': 1}}""") - - def test_subscript(self): - self.check_roundtrip("a[i]") - self.check_roundtrip("a[i,]") - self.check_roundtrip("a[i, j]") - self.check_roundtrip("a[()]") - self.check_roundtrip("a[i:j]") - self.check_roundtrip("a[:j]") - self.check_roundtrip("a[i:]") - self.check_roundtrip("a[i:j:k]") - self.check_roundtrip("a[:j:k]") - self.check_roundtrip("a[i::k]") - self.check_roundtrip("a[i:j,]") - self.check_roundtrip("a[i:j, k]") - - -class DirectoryTestCase(ASTTestCase): - """Test roundtrip behaviour on all files in Lib and Lib/test.""" - NAMES = None - - # test directories, relative to the root of the distribution - test_directories = 'Lib', os.path.join('Lib', 'test') - - @classmethod - def get_names(cls): - if cls.NAMES is not None: - return cls.NAMES - - names = [] - for d in cls.test_directories: - test_dir = os.path.join(basepath, d) - for n in os.listdir(test_dir): - if n.endswith('.py') and not n.startswith('bad'): - names.append(os.path.join(test_dir, n)) - - # Test limited subset of files unless the 'cpu' resource is specified. - if not test.support.is_resource_enabled("cpu"): - names = random.sample(names, 10) - # bpo-31174: Store the names sample to always test the same files. - # It prevents false alarms when hunting reference leaks. - cls.NAMES = names - return names - - def test_files(self): - # get names of files to test - names = self.get_names() - - for filename in names: - if test.support.verbose: - print('Testing %s' % filename) - - # Some f-strings are not correctly round-tripped by - # Tools/parser/unparse.py. See issue 28002 for details. - # We need to skip files that contain such f-strings. - if os.path.basename(filename) in ('test_fstring.py', ): - if test.support.verbose: - print(f'Skipping {filename}: see issue 28002') - continue - - with self.subTest(filename=filename): - source = read_pyfile(filename) - self.check_roundtrip(source) - - -if __name__ == '__main__': - unittest.main() diff --git a/Lib/test/test_trace.py b/Lib/test/test_trace.py index 8eacf99c..c03982ba 100644 --- a/Lib/test/test_trace.py +++ b/Lib/test/test_trace.py @@ -180,7 +180,7 @@ class TestLineCounts(unittest.TestCase): firstlineno_called = get_firstlineno(traced_doubler) expected = { (self.my_py_filename, firstlineno_calling + 1): 1, - # List compehentions work differently in 3.x, so the count + # List comprehensions work differently in 3.x, so the count # below changed compared to 2.x. (self.my_py_filename, firstlineno_calling + 2): 12, (self.my_py_filename, firstlineno_calling + 3): 1, @@ -276,9 +276,8 @@ class TestFuncs(unittest.TestCase): def test_arg_errors(self): res = self.tracer.runfunc(traced_capturer, 1, 2, self=3, func=4) self.assertEqual(res, ((1, 2), {'self': 3, 'func': 4})) - with self.assertWarns(DeprecationWarning): - res = self.tracer.runfunc(func=traced_capturer, arg=1) - self.assertEqual(res, ((), {'arg': 1})) + with self.assertRaises(TypeError): + self.tracer.runfunc(func=traced_capturer, arg=1) with self.assertRaises(TypeError): self.tracer.runfunc() @@ -507,7 +506,8 @@ class TestCommandLine(unittest.TestCase): fd.write("print(type(sys.argv))\n") status, direct_stdout, stderr = assert_python_ok(TESTFN) - status, trace_stdout, stderr = assert_python_ok('-m', 'trace', '-l', TESTFN) + status, trace_stdout, stderr = assert_python_ok('-m', 'trace', '-l', TESTFN, + PYTHONIOENCODING='utf-8') self.assertIn(direct_stdout.strip(), trace_stdout) def test_count_and_summary(self): @@ -527,7 +527,8 @@ class TestCommandLine(unittest.TestCase): for i in range(10): f() """)) - status, stdout, _ = assert_python_ok('-m', 'trace', '-cs', filename) + status, stdout, _ = assert_python_ok('-m', 'trace', '-cs', filename, + PYTHONIOENCODING='utf-8') stdout = stdout.decode() self.assertEqual(status, 0) self.assertIn('lines cov% module (path)', stdout) diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 96d85e2c..f9a5f2fc 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -7,7 +7,7 @@ import sys import unittest import re from test import support -from test.support import TESTFN, Error, captured_output, unlink, cpython_only +from test.support import TESTFN, Error, captured_output, unlink, cpython_only, ALWAYS_EQ from test.support.script_helper import assert_python_ok import textwrap @@ -58,13 +58,13 @@ class TracebackCases(unittest.TestCase): SyntaxError) self.assertIn("^", err[2]) # third line has caret self.assertEqual(err[2].count('\n'), 1) # and no additional newline - self.assertEqual(err[1].find("+"), err[2].find("^")) # in the right place + self.assertEqual(err[1].find("+") + 1, err[2].find("^")) # in the right place err = self.get_exception_format(self.syntax_error_with_caret_non_ascii, SyntaxError) self.assertIn("^", err[2]) # third line has caret self.assertEqual(err[2].count('\n'), 1) # and no additional newline - self.assertEqual(err[1].find("+"), err[2].find("^")) # in the right place + self.assertEqual(err[1].find("+") + 1, err[2].find("^")) # in the right place def test_nocaret(self): exc = SyntaxError("error", ("x.py", 23, None, "bad syntax")) @@ -78,14 +78,13 @@ class TracebackCases(unittest.TestCase): self.assertEqual(len(err), 4) self.assertEqual(err[1].strip(), "print(2)") self.assertIn("^", err[2]) - self.assertEqual(err[1].find(")"), err[2].find("^")) + self.assertEqual(err[1].find(")") + 1, err[2].find("^")) + # No caret for "unexpected indent" err = self.get_exception_format(self.syntax_error_bad_indentation2, IndentationError) - self.assertEqual(len(err), 4) + self.assertEqual(len(err), 3) self.assertEqual(err[1].strip(), "print(2)") - self.assertIn("^", err[2]) - self.assertEqual(err[1].find("p"), err[2].find("^")) def test_base_exception(self): # Test that exceptions derived from BaseException are formatted right @@ -174,7 +173,6 @@ class TracebackCases(unittest.TestCase): # Issue #18960: coding spec should have no effect do_test("x=0\n# coding: GBK\n", "h\xe9 ho", 'utf-8', 5) - @support.requires_type_collecting def test_print_traceback_at_exit(self): # Issue #22599: Ensure that it is possible to use the traceback module # to display an exception at Python exit @@ -313,7 +311,7 @@ class TracebackFormatTests(unittest.TestCase): with captured_output("stderr") as stderr_f: try: f() - except RecursionError as exc: + except RecursionError: render_exc() else: self.fail("no recursion occurred") @@ -360,7 +358,7 @@ class TracebackFormatTests(unittest.TestCase): with captured_output("stderr") as stderr_g: try: g() - except ValueError as exc: + except ValueError: render_exc() else: self.fail("no value error was raised") @@ -396,7 +394,7 @@ class TracebackFormatTests(unittest.TestCase): with captured_output("stderr") as stderr_h: try: h() - except ValueError as exc: + except ValueError: render_exc() else: self.fail("no value error was raised") @@ -424,7 +422,7 @@ class TracebackFormatTests(unittest.TestCase): with captured_output("stderr") as stderr_g: try: g(traceback._RECURSIVE_CUTOFF) - except ValueError as exc: + except ValueError: render_exc() else: self.fail("no error raised") @@ -452,7 +450,7 @@ class TracebackFormatTests(unittest.TestCase): with captured_output("stderr") as stderr_g: try: g(traceback._RECURSIVE_CUTOFF + 1) - except ValueError as exc: + except ValueError: render_exc() else: self.fail("no error raised") @@ -657,6 +655,7 @@ class BaseExceptionReportingTests: self.assertIn('inner_raise() # Marker', blocks[2]) self.check_zero_div(blocks[2]) + @unittest.skipIf(support.use_old_parser(), "Pegen is arguably better here, so no need to fix this") def test_syntax_error_offset_at_eol(self): # See #10186. def e(): @@ -666,7 +665,7 @@ class BaseExceptionReportingTests: def e(): exec("x = 5 | 4 |") msg = self.get_report(e).splitlines() - self.assertEqual(msg[-2], ' ^') + self.assertEqual(msg[-2], ' ^') def test_message_none(self): # A message that looks like "None" should not be treated specially @@ -679,6 +678,25 @@ class BaseExceptionReportingTests: err = self.get_report(Exception('')) self.assertIn('Exception\n', err) + def test_syntax_error_various_offsets(self): + for offset in range(-5, 10): + for add in [0, 2]: + text = " "*add + "text%d" % offset + expected = [' File "file.py", line 1'] + if offset < 1: + expected.append(" %s" % text.lstrip()) + elif offset <= 6: + expected.append(" %s" % text.lstrip()) + expected.append(" %s^" % (" "*(offset-1))) + else: + expected.append(" %s" % text.lstrip()) + expected.append(" %s^" % (" "*5)) + expected.append("SyntaxError: msg") + expected.append("") + err = self.get_report(SyntaxError("msg", ("file.py", 1, offset+add, text))) + exp = "\n".join(expected) + self.assertEqual(exp, err) + class PyExcReportingTests(BaseExceptionReportingTests, unittest.TestCase): # @@ -887,6 +905,8 @@ class TestFrame(unittest.TestCase): # operator fallbacks to FrameSummary.__eq__. self.assertEqual(tuple(f), f) self.assertIsNone(f.locals) + self.assertNotEqual(f, object()) + self.assertEqual(f, ALWAYS_EQ) def test_lazy_lines(self): linecache.clearcache() @@ -1083,6 +1103,18 @@ class TestTracebackException(unittest.TestCase): self.assertEqual(exc_info[0], exc.exc_type) self.assertEqual(str(exc_info[1]), str(exc)) + def test_comparison(self): + try: + 1/0 + except Exception: + exc_info = sys.exc_info() + exc = traceback.TracebackException(*exc_info) + exc2 = traceback.TracebackException(*exc_info) + self.assertIsNot(exc, exc2) + self.assertEqual(exc, exc2) + self.assertNotEqual(exc, object()) + self.assertEqual(exc, ALWAYS_EQ) + def test_unhashable(self): class UnhashableException(Exception): def __eq__(self, other): diff --git a/Lib/test/test_tracemalloc.py b/Lib/test/test_tracemalloc.py index 4b9bf4ed..c5ae4e6d 100644 --- a/Lib/test/test_tracemalloc.py +++ b/Lib/test/test_tracemalloc.py @@ -36,7 +36,7 @@ def allocate_bytes(size): bytes_len = (size - EMPTY_STRING_SIZE) frames = get_frames(nframe, 1) data = b'x' * bytes_len - return data, tracemalloc.Traceback(frames) + return data, tracemalloc.Traceback(frames, min(len(frames), nframe)) def create_snapshots(): traceback_limit = 2 @@ -45,27 +45,27 @@ def create_snapshots(): # traceback_frames) tuples. traceback_frames is a tuple of (filename, # line_number) tuples. raw_traces = [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), - (1, 2, (('a.py', 5), ('b.py', 4))), + (1, 2, (('a.py', 5), ('b.py', 4)), 3), - (2, 66, (('b.py', 1),)), + (2, 66, (('b.py', 1),), 1), - (3, 7, (('', 0),)), + (3, 7, (('', 0),), 1), ] snapshot = tracemalloc.Snapshot(raw_traces, traceback_limit) raw_traces2 = [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), - (2, 2, (('a.py', 5), ('b.py', 4))), - (2, 5000, (('a.py', 5), ('b.py', 4))), + (2, 2, (('a.py', 5), ('b.py', 4)), 3), + (2, 5000, (('a.py', 5), ('b.py', 4)), 3), - (4, 400, (('c.py', 578),)), + (4, 400, (('c.py', 578),), 1), ] snapshot2 = tracemalloc.Snapshot(raw_traces2, traceback_limit) @@ -125,7 +125,7 @@ class TestTracemallocEnabled(unittest.TestCase): nframe = tracemalloc.get_traceback_limit() frames = get_frames(nframe, -3) - obj_traceback = tracemalloc.Traceback(frames) + obj_traceback = tracemalloc.Traceback(frames, min(len(frames), nframe)) traceback = tracemalloc.get_object_traceback(obj) self.assertIsNotNone(traceback) @@ -167,7 +167,7 @@ class TestTracemallocEnabled(unittest.TestCase): trace = self.find_trace(traces, obj_traceback) self.assertIsInstance(trace, tuple) - domain, size, traceback = trace + domain, size, traceback, length = trace self.assertEqual(size, obj_size) self.assertEqual(traceback, obj_traceback._frames) @@ -197,8 +197,8 @@ class TestTracemallocEnabled(unittest.TestCase): trace1 = self.find_trace(traces, obj1_traceback) trace2 = self.find_trace(traces, obj2_traceback) - domain1, size1, traceback1 = trace1 - domain2, size2, traceback2 = trace2 + domain1, size1, traceback1, length1 = trace1 + domain2, size2, traceback2, length2 = trace2 self.assertIs(traceback2, traceback1) def test_get_traced_memory(self): @@ -246,6 +246,30 @@ class TestTracemallocEnabled(unittest.TestCase): traceback2 = tracemalloc.get_object_traceback(obj) self.assertIsNone(traceback2) + def test_reset_peak(self): + # Python allocates some internals objects, so the test must tolerate + # a small difference between the expected size and the real usage + tracemalloc.clear_traces() + + # Example: allocate a large piece of memory, temporarily + large_sum = sum(list(range(100000))) + size1, peak1 = tracemalloc.get_traced_memory() + + # reset_peak() resets peak to traced memory: peak2 < peak1 + tracemalloc.reset_peak() + size2, peak2 = tracemalloc.get_traced_memory() + self.assertGreaterEqual(peak2, size2) + self.assertLess(peak2, peak1) + + # check that peak continue to be updated if new memory is allocated: + # peak3 > peak2 + obj_size = 1024 * 1024 + obj, obj_traceback = allocate_bytes(obj_size) + size3, peak3 = tracemalloc.get_traced_memory() + self.assertGreaterEqual(peak3, size3) + self.assertGreater(peak3, peak2) + self.assertGreaterEqual(peak3 - peak2, obj_size) + def test_is_tracing(self): tracemalloc.stop() self.assertFalse(tracemalloc.is_tracing()) @@ -259,6 +283,9 @@ class TestTracemallocEnabled(unittest.TestCase): # take a snapshot snapshot = tracemalloc.take_snapshot() + # This can vary + self.assertGreater(snapshot.traces[1].traceback.total_nframe, 10) + # write on disk snapshot.dump(support.TESTFN) self.addCleanup(support.unlink, support.TESTFN) @@ -311,17 +338,14 @@ class TestTracemallocEnabled(unittest.TestCase): finally: os._exit(exitcode) else: - pid2, status = os.waitpid(pid, 0) - self.assertTrue(os.WIFEXITED(status)) - exitcode = os.WEXITSTATUS(status) - self.assertEqual(exitcode, 0) + support.wait_process(pid, exitcode=0) class TestSnapshot(unittest.TestCase): maxDiff = 4000 def test_create_snapshot(self): - raw_traces = [(0, 5, (('a.py', 2),))] + raw_traces = [(0, 5, (('a.py', 2),), 10)] with contextlib.ExitStack() as stack: stack.enter_context(patch.object(tracemalloc, 'is_tracing', @@ -336,6 +360,7 @@ class TestSnapshot(unittest.TestCase): self.assertEqual(len(snapshot.traces), 1) trace = snapshot.traces[0] self.assertEqual(trace.size, 5) + self.assertEqual(trace.traceback.total_nframe, 10) self.assertEqual(len(trace.traceback), 1) self.assertEqual(trace.traceback[0].filename, 'a.py') self.assertEqual(trace.traceback[0].lineno, 2) @@ -351,11 +376,11 @@ class TestSnapshot(unittest.TestCase): # exclude b.py snapshot3 = snapshot.filter_traces((filter1,)) self.assertEqual(snapshot3.traces._traces, [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (1, 2, (('a.py', 5), ('b.py', 4))), - (3, 7, (('', 0),)), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (1, 2, (('a.py', 5), ('b.py', 4)), 3), + (3, 7, (('', 0),), 1), ]) # filter_traces() must not touch the original snapshot @@ -364,10 +389,10 @@ class TestSnapshot(unittest.TestCase): # only include two lines of a.py snapshot4 = snapshot3.filter_traces((filter2, filter3)) self.assertEqual(snapshot4.traces._traces, [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (1, 2, (('a.py', 5), ('b.py', 4))), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (1, 2, (('a.py', 5), ('b.py', 4)), 3), ]) # No filter: just duplicate the snapshot @@ -388,21 +413,21 @@ class TestSnapshot(unittest.TestCase): # exclude a.py of domain 1 snapshot3 = snapshot.filter_traces((filter1,)) self.assertEqual(snapshot3.traces._traces, [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (2, 66, (('b.py', 1),)), - (3, 7, (('', 0),)), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (2, 66, (('b.py', 1),), 1), + (3, 7, (('', 0),), 1), ]) # include domain 1 snapshot3 = snapshot.filter_traces((filter1,)) self.assertEqual(snapshot3.traces._traces, [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (2, 66, (('b.py', 1),)), - (3, 7, (('', 0),)), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (2, 66, (('b.py', 1),), 1), + (3, 7, (('', 0),), 1), ]) def test_filter_traces_domain_filter(self): @@ -413,17 +438,17 @@ class TestSnapshot(unittest.TestCase): # exclude domain 2 snapshot3 = snapshot.filter_traces((filter1,)) self.assertEqual(snapshot3.traces._traces, [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (1, 2, (('a.py', 5), ('b.py', 4))), - (2, 66, (('b.py', 1),)), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (1, 2, (('a.py', 5), ('b.py', 4)), 3), + (2, 66, (('b.py', 1),), 1), ]) # include domain 2 snapshot3 = snapshot.filter_traces((filter2,)) self.assertEqual(snapshot3.traces._traces, [ - (3, 7, (('', 0),)), + (3, 7, (('', 0),), 1), ]) def test_snapshot_group_by_line(self): diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index 571981fc..5d5f0570 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -85,7 +85,7 @@ class TurtleConfigTest(unittest.TestCase): self.assertEqual(parsed_cfg, expected) - def test_partial_config_dict_with_commments(self): + def test_partial_config_dict_with_comments(self): cfg_name = self.get_cfg_file(test_config_two) parsed_cfg = turtle.config_dict(cfg_name) diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 43be54ef..71d1430d 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -1,6 +1,7 @@ import ast import sys import unittest +from test import support funcdef = """\ @@ -390,7 +391,7 @@ class TypeCommentTests(unittest.TestCase): arg = tree.argtypes[0] self.assertEqual(arg.id, "int") self.assertEqual(tree.returns.value.id, "List") - self.assertEqual(tree.returns.slice.value.id, "str") + self.assertEqual(tree.returns.slice.id, "str") tree = parse_func_type_input("(int, *str, **Any) -> float") self.assertEqual(tree.argtypes[0].id, "int") @@ -398,6 +399,14 @@ class TypeCommentTests(unittest.TestCase): self.assertEqual(tree.argtypes[2].id, "Any") self.assertEqual(tree.returns.id, "float") + tree = parse_func_type_input("(*int) -> None") + self.assertEqual(tree.argtypes[0].id, "int") + tree = parse_func_type_input("(**int) -> None") + self.assertEqual(tree.argtypes[0].id, "int") + tree = parse_func_type_input("(*int, **str) -> None") + self.assertEqual(tree.argtypes[0].id, "int") + self.assertEqual(tree.argtypes[1].id, "str") + with self.assertRaises(SyntaxError): tree = parse_func_type_input("(int, *str, *Any) -> float") diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 56848c1b..49dc5bf4 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -466,7 +466,7 @@ class TypesTests(unittest.TestCase): # No format code means use g, but must have a decimal # and a number after the decimal. This is tricky, because - # a totaly empty format specifier means something else. + # a totally empty format specifier means something else. # So, just use a sign flag test(1e200, '+g', '+1e+200') test(1e200, '+', '+1e+200') @@ -622,8 +622,13 @@ class MappingProxyTests(unittest.TestCase): self.assertEqual(attrs, { '__contains__', '__getitem__', + '__class_getitem__', + '__ior__', '__iter__', '__len__', + '__or__', + '__reversed__', + '__ror__', 'copy', 'get', 'items', @@ -764,6 +769,14 @@ class MappingProxyTests(unittest.TestCase): self.assertEqual(set(view.values()), set(values)) self.assertEqual(set(view.items()), set(items)) + def test_reversed(self): + d = {'a': 1, 'b': 2, 'foo': 0, 'c': 3, 'd': 4} + mp = self.mappingproxy(d) + del d['foo'] + r = reversed(mp) + self.assertEqual(list(r), list('dcba')) + self.assertRaises(StopIteration, next, r) + def test_copy(self): original = {'key1': 27, 'key2': 51, 'key3': 93} view = self.mappingproxy(original) @@ -774,6 +787,22 @@ class MappingProxyTests(unittest.TestCase): self.assertEqual(view['key1'], 70) self.assertEqual(copy['key1'], 27) + def test_union(self): + mapping = {'a': 0, 'b': 1, 'c': 2} + view = self.mappingproxy(mapping) + with self.assertRaises(TypeError): + view | [('r', 2), ('d', 2)] + with self.assertRaises(TypeError): + [('r', 2), ('d', 2)] | view + with self.assertRaises(TypeError): + view |= [('r', 2), ('d', 2)] + other = {'c': 3, 'p': 0} + self.assertDictEqual(view | other, {'a': 0, 'b': 1, 'c': 3, 'p': 0}) + self.assertDictEqual(other | view, {'c': 2, 'p': 0, 'a': 0, 'b': 1}) + self.assertEqual(view, {'a': 0, 'b': 1, 'c': 2}) + self.assertDictEqual(mapping, {'a': 0, 'b': 1, 'c': 2}) + self.assertDictEqual(other, {'c': 3, 'p': 0}) + class ClassCreationTests(unittest.TestCase): @@ -1233,8 +1262,8 @@ class SimpleNamespaceTests(unittest.TestCase): ns2._y = 5 name = "namespace" - self.assertEqual(repr(ns1), "{name}(w=3, x=1, y=2)".format(name=name)) - self.assertEqual(repr(ns2), "{name}(_y=5, x='spam')".format(name=name)) + self.assertEqual(repr(ns1), "{name}(x=1, y=2, w=3)".format(name=name)) + self.assertEqual(repr(ns2), "{name}(x='spam', _y=5)".format(name=name)) def test_equal(self): ns1 = types.SimpleNamespace(x=1) @@ -1283,7 +1312,7 @@ class SimpleNamespaceTests(unittest.TestCase): ns3.spam = ns2 name = "namespace" repr1 = "{name}(c='cookie', spam={name}(...))".format(name=name) - repr2 = "{name}(spam={name}(spam={name}(...), x=1))".format(name=name) + repr2 = "{name}(spam={name}(x=1, spam={name}(...)))".format(name=name) self.assertEqual(repr(ns1), repr1) self.assertEqual(repr(ns2), repr2) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 83bfef14..7f96aff7 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3,14 +3,14 @@ import collections import pickle import re import sys -from unittest import TestCase, main, skipUnless, SkipTest, skip +from unittest import TestCase, main, skipUnless, skip from copy import copy, deepcopy from typing import Any, NoReturn from typing import TypeVar, AnyStr from typing import T, KT, VT # Not in __all__. from typing import Union, Optional, Literal -from typing import Tuple, List, MutableMapping +from typing import Tuple, List, Dict, MutableMapping from typing import Callable from typing import Generic, ClassVar, Final, final, Protocol from typing import cast, runtime_checkable @@ -22,6 +22,7 @@ from typing import NewType from typing import NamedTuple, TypedDict from typing import IO, TextIO, BinaryIO from typing import Pattern, Match +from typing import Annotated, ForwardRef import abc import typing import weakref @@ -367,10 +368,8 @@ class UnionTests(BaseTestCase): def test_etree(self): # See https://github.com/python/typing/issues/229 # (Only relevant for Python 2.) - try: - from xml.etree.cElementTree import Element - except ImportError: - raise SkipTest("cElementTree not found") + from xml.etree.ElementTree import Element + Union[Element, str] # Shouldn't crash def Elem(*args): @@ -1418,8 +1417,6 @@ class GenericTests(BaseTestCase): def test_generic_errors(self): T = TypeVar('T') S = TypeVar('S') - with self.assertRaises(TypeError): - Generic[T]() with self.assertRaises(TypeError): Generic[T][T] with self.assertRaises(TypeError): @@ -1751,17 +1748,23 @@ class GenericTests(BaseTestCase): self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''), 'Union[Tuple, Tuple[int]]') self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''), - 'Callable[..., Union[int, NoneType]]') + 'Callable[..., Optional[int]]') self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''), 'Callable[[], List[int]]') def test_generic_forward_ref(self): def foobar(x: List[List['CC']]): ... + def foobar2(x: list[list[ForwardRef('CC')]]): ... class CC: ... self.assertEqual( get_type_hints(foobar, globals(), locals()), {'x': List[List[CC]]} ) + self.assertEqual( + get_type_hints(foobar2, globals(), locals()), + {'x': list[list[CC]]} + ) + T = TypeVar('T') AT = Tuple[T, ...] def barfoo(x: AT): ... @@ -1783,10 +1786,11 @@ class GenericTests(BaseTestCase): self.assertEqual(T1[int, T].__origin__, T1) self.assertEqual(T2.__parameters__, (T,)) - with self.assertRaises(TypeError): - T1[int] - with self.assertRaises(TypeError): - T2[int, str] + # These don't work because of tuple.__class_item__ + ## with self.assertRaises(TypeError): + ## T1[int] + ## with self.assertRaises(TypeError): + ## T2[int, str] self.assertEqual(repr(C1[int]).split('.')[-1], 'C1[int]') self.assertEqual(C2.__parameters__, ()) @@ -1825,22 +1829,22 @@ class GenericTests(BaseTestCase): self.clear_caches() class MyTup(Tuple[T, T]): ... self.assertIs(MyTup[int]().__class__, MyTup) - self.assertIs(MyTup[int]().__orig_class__, MyTup[int]) + self.assertEqual(MyTup[int]().__orig_class__, MyTup[int]) class MyCall(Callable[..., T]): def __call__(self): return None self.assertIs(MyCall[T]().__class__, MyCall) - self.assertIs(MyCall[T]().__orig_class__, MyCall[T]) + self.assertEqual(MyCall[T]().__orig_class__, MyCall[T]) class MyDict(typing.Dict[T, T]): ... self.assertIs(MyDict[int]().__class__, MyDict) - self.assertIs(MyDict[int]().__orig_class__, MyDict[int]) + self.assertEqual(MyDict[int]().__orig_class__, MyDict[int]) class MyDef(typing.DefaultDict[str, T]): ... self.assertIs(MyDef[int]().__class__, MyDef) - self.assertIs(MyDef[int]().__orig_class__, MyDef[int]) + self.assertEqual(MyDef[int]().__orig_class__, MyDef[int]) # ChainMap was added in 3.3 if sys.version_info >= (3, 3): class MyChain(typing.ChainMap[str, T]): ... self.assertIs(MyChain[int]().__class__, MyChain) - self.assertIs(MyChain[int]().__orig_class__, MyChain[int]) + self.assertEqual(MyChain[int]().__orig_class__, MyChain[int]) def test_all_repr_eq_any(self): objs = (getattr(typing, el) for el in typing.__all__) @@ -2446,6 +2450,18 @@ class ForwardRefTests(BaseTestCase): self.assertEqual(get_type_hints(foo, globals(), locals()), {'a': Tuple[T]}) + def foo(a: tuple[ForwardRef('T')]): + pass + + self.assertEqual(get_type_hints(foo, globals(), locals()), + {'a': tuple[T]}) + + def test_double_forward(self): + def foo(a: 'List[\'int\']'): + pass + self.assertEqual(get_type_hints(foo, globals(), locals()), + {'a': List[int]}) + def test_forward_recursion_actually(self): def namespace1(): a = typing.ForwardRef('A') @@ -2898,6 +2914,86 @@ class GetTypeHintTests(BaseTestCase): self.assertEqual(gth(ForRefExample.func), expects) self.assertEqual(gth(ForRefExample.nested), expects) + def test_get_type_hints_annotated(self): + def foobar(x: List['X']): ... + X = Annotated[int, (1, 10)] + self.assertEqual( + get_type_hints(foobar, globals(), locals()), + {'x': List[int]} + ) + self.assertEqual( + get_type_hints(foobar, globals(), locals(), include_extras=True), + {'x': List[Annotated[int, (1, 10)]]} + ) + + def foobar(x: list[ForwardRef('X')]): ... + X = Annotated[int, (1, 10)] + self.assertEqual( + get_type_hints(foobar, globals(), locals()), + {'x': list[int]} + ) + self.assertEqual( + get_type_hints(foobar, globals(), locals(), include_extras=True), + {'x': list[Annotated[int, (1, 10)]]} + ) + + BA = Tuple[Annotated[T, (1, 0)], ...] + def barfoo(x: BA): ... + self.assertEqual(get_type_hints(barfoo, globals(), locals())['x'], Tuple[T, ...]) + self.assertIs( + get_type_hints(barfoo, globals(), locals(), include_extras=True)['x'], + BA + ) + + BA = tuple[Annotated[T, (1, 0)], ...] + def barfoo(x: BA): ... + self.assertEqual(get_type_hints(barfoo, globals(), locals())['x'], tuple[T, ...]) + self.assertIs( + get_type_hints(barfoo, globals(), locals(), include_extras=True)['x'], + BA + ) + + def barfoo2(x: typing.Callable[..., Annotated[List[T], "const"]], + y: typing.Union[int, Annotated[T, "mutable"]]): ... + self.assertEqual( + get_type_hints(barfoo2, globals(), locals()), + {'x': typing.Callable[..., List[T]], 'y': typing.Union[int, T]} + ) + + BA2 = typing.Callable[..., List[T]] + def barfoo3(x: BA2): ... + self.assertIs( + get_type_hints(barfoo3, globals(), locals(), include_extras=True)["x"], + BA2 + ) + + def test_get_type_hints_annotated_refs(self): + + Const = Annotated[T, "Const"] + + class MySet(Generic[T]): + + def __ior__(self, other: "Const[MySet[T]]") -> "MySet[T]": + ... + + def __iand__(self, other: Const["MySet[T]"]) -> "MySet[T]": + ... + + self.assertEqual( + get_type_hints(MySet.__iand__, globals(), locals()), + {'other': MySet[T], 'return': MySet[T]} + ) + + self.assertEqual( + get_type_hints(MySet.__iand__, globals(), locals(), include_extras=True), + {'other': Const[MySet[T]], 'return': MySet[T]} + ) + + self.assertEqual( + get_type_hints(MySet.__ior__, globals(), locals()), + {'other': MySet[T], 'return': MySet[T]} + ) + class GetUtilitiesTestCase(TestCase): def test_get_origin(self): @@ -2913,9 +3009,12 @@ class GetUtilitiesTestCase(TestCase): self.assertIs(get_origin(Generic), Generic) self.assertIs(get_origin(Generic[T]), Generic) self.assertIs(get_origin(List[Tuple[T, T]][int]), list) + self.assertIs(get_origin(Annotated[T, 'thing']), Annotated) self.assertIs(get_origin(List), list) self.assertIs(get_origin(Tuple), tuple) self.assertIs(get_origin(Callable), collections.abc.Callable) + self.assertIs(get_origin(list[int]), list) + self.assertIs(get_origin(list), None) def test_get_args(self): T = TypeVar('T') @@ -2937,9 +3036,12 @@ class GetUtilitiesTestCase(TestCase): (int, Callable[[Tuple[T, ...]], str])) self.assertEqual(get_args(Tuple[int, ...]), (int, ...)) self.assertEqual(get_args(Tuple[()]), ((),)) + self.assertEqual(get_args(Annotated[T, 'one', 2, ['three']]), (T, 'one', 2, ['three'])) self.assertEqual(get_args(List), ()) self.assertEqual(get_args(Tuple), ()) self.assertEqual(get_args(Callable), ()) + self.assertEqual(get_args(list[int]), (int,)) + self.assertEqual(get_args(list), ()) class CollectionsAbcTests(BaseTestCase): @@ -3075,6 +3177,17 @@ class CollectionsAbcTests(BaseTestCase): def test_dict(self): self.assertIsSubclass(dict, typing.Dict) + def test_dict_subscribe(self): + K = TypeVar('K') + V = TypeVar('V') + self.assertEqual(Dict[K, V][str, int], Dict[str, int]) + self.assertEqual(Dict[K, int][str], Dict[str, int]) + self.assertEqual(Dict[str, V][int], Dict[str, int]) + self.assertEqual(Dict[K, List[V]][str, int], Dict[str, List[int]]) + self.assertEqual(Dict[K, List[int]][str], Dict[str, List[int]]) + self.assertEqual(Dict[K, list[V]][str, int], Dict[str, list[int]]) + self.assertEqual(Dict[K, list[int]][str], Dict[str, list[int]]) + def test_no_list_instantiation(self): with self.assertRaises(TypeError): typing.List() @@ -3516,7 +3629,6 @@ class NamedTupleTests(BaseTestCase): self.assertEqual(Emp._fields, ('name', 'id')) self.assertEqual(Emp.__annotations__, collections.OrderedDict([('name', str), ('id', int)])) - self.assertIs(Emp._field_types, Emp.__annotations__) def test_namedtuple_pyversion(self): if sys.version_info[:2] < (3, 6): @@ -3536,7 +3648,6 @@ class NamedTupleTests(BaseTestCase): self.assertEqual(CoolEmployee._fields, ('name', 'cool')) self.assertEqual(CoolEmployee.__annotations__, collections.OrderedDict(name=str, cool=int)) - self.assertIs(CoolEmployee._field_types, CoolEmployee.__annotations__) def test_annotation_usage_with_default(self): jelle = CoolEmployeeWithDefault('Jelle') @@ -3549,15 +3660,14 @@ class NamedTupleTests(BaseTestCase): self.assertEqual(CoolEmployeeWithDefault.__name__, 'CoolEmployeeWithDefault') self.assertEqual(CoolEmployeeWithDefault._fields, ('name', 'cool')) - self.assertEqual(CoolEmployeeWithDefault._field_types, dict(name=str, cool=int)) + self.assertEqual(CoolEmployeeWithDefault.__annotations__, + dict(name=str, cool=int)) self.assertEqual(CoolEmployeeWithDefault._field_defaults, dict(cool=0)) with self.assertRaises(TypeError): - exec(""" -class NonDefaultAfterDefault(NamedTuple): - x: int = 3 - y: int -""") + class NonDefaultAfterDefault(NamedTuple): + x: int = 3 + y: int def test_annotation_usage_with_methods(self): self.assertEqual(XMeth(1).double(), 2) @@ -3566,20 +3676,23 @@ class NonDefaultAfterDefault(NamedTuple): self.assertEqual(XRepr(1, 2) + XRepr(3), 0) with self.assertRaises(AttributeError): - exec(""" -class XMethBad(NamedTuple): - x: int - def _fields(self): - return 'no chance for this' -""") + class XMethBad(NamedTuple): + x: int + def _fields(self): + return 'no chance for this' with self.assertRaises(AttributeError): - exec(""" -class XMethBad2(NamedTuple): - x: int - def _source(self): - return 'no chance for this as well' -""") + class XMethBad2(NamedTuple): + x: int + def _source(self): + return 'no chance for this as well' + + def test_multiple_inheritance(self): + class A: + pass + with self.assertRaises(TypeError): + class X(NamedTuple, A): + x: int def test_namedtuple_keyword_usage(self): LocalEmployee = NamedTuple("LocalEmployee", name=str, age=int) @@ -3589,7 +3702,6 @@ class XMethBad2(NamedTuple): self.assertEqual(LocalEmployee.__name__, 'LocalEmployee') self.assertEqual(LocalEmployee._fields, ('name', 'age')) self.assertEqual(LocalEmployee.__annotations__, dict(name=str, age=int)) - self.assertIs(LocalEmployee._field_types, LocalEmployee.__annotations__) with self.assertRaises(TypeError): NamedTuple('Name', [('x', int)], y=str) with self.assertRaises(TypeError): @@ -3614,16 +3726,10 @@ class XMethBad2(NamedTuple): NamedTuple('Emp', [('name', str)], None) with self.assertRaises(ValueError): NamedTuple('Emp', [('_name', str)]) - - with self.assertWarns(DeprecationWarning): - Emp = NamedTuple(typename='Emp', name=str, id=int) - self.assertEqual(Emp.__name__, 'Emp') - self.assertEqual(Emp._fields, ('name', 'id')) - - with self.assertWarns(DeprecationWarning): - Emp = NamedTuple('Emp', fields=[('name', str), ('id', int)]) - self.assertEqual(Emp.__name__, 'Emp') - self.assertEqual(Emp._fields, ('name', 'id')) + with self.assertRaises(TypeError): + NamedTuple(typename='Emp', name=str, id=int) + with self.assertRaises(TypeError): + NamedTuple('Emp', fields=[('name', str), ('id', int)]) def test_copy_and_pickle(self): global Emp # pickle wants to reference the class by name @@ -3696,6 +3802,7 @@ class TypedDictTests(BaseTestCase): TypedDict() with self.assertRaises(TypeError): TypedDict('Emp', [('name', str)], None) + with self.assertRaises(TypeError): TypedDict(_typename='Emp', name=str, id=int) with self.assertRaises(TypeError): @@ -3760,6 +3867,45 @@ class TypedDictTests(BaseTestCase): self.assertEqual(Options(log_level=2), {'log_level': 2}) self.assertEqual(Options.__total__, False) + def test_optional_keys(self): + class Point2Dor3D(Point2D, total=False): + z: int + + assert Point2Dor3D.__required_keys__ == frozenset(['x', 'y']) + assert Point2Dor3D.__optional_keys__ == frozenset(['z']) + + def test_keys_inheritance(self): + class BaseAnimal(TypedDict): + name: str + + class Animal(BaseAnimal, total=False): + voice: str + tail: bool + + class Cat(Animal): + fur_color: str + + assert BaseAnimal.__required_keys__ == frozenset(['name']) + assert BaseAnimal.__optional_keys__ == frozenset([]) + assert BaseAnimal.__annotations__ == {'name': str} + + assert Animal.__required_keys__ == frozenset(['name']) + assert Animal.__optional_keys__ == frozenset(['tail', 'voice']) + assert Animal.__annotations__ == { + 'name': str, + 'tail': bool, + 'voice': str, + } + + assert Cat.__required_keys__ == frozenset(['name', 'fur_color']) + assert Cat.__optional_keys__ == frozenset(['tail', 'voice']) + assert Cat.__annotations__ == { + 'fur_color': str, + 'name': str, + 'tail': bool, + 'voice': str, + } + class IOTests(BaseTestCase): @@ -3856,6 +4002,179 @@ class RETests(BaseTestCase): "type 're.Match' is not an acceptable base type") +class AnnotatedTests(BaseTestCase): + + def test_repr(self): + self.assertEqual( + repr(Annotated[int, 4, 5]), + "typing.Annotated[int, 4, 5]" + ) + self.assertEqual( + repr(Annotated[List[int], 4, 5]), + "typing.Annotated[typing.List[int], 4, 5]" + ) + + def test_flatten(self): + A = Annotated[Annotated[int, 4], 5] + self.assertEqual(A, Annotated[int, 4, 5]) + self.assertEqual(A.__metadata__, (4, 5)) + self.assertEqual(A.__origin__, int) + + def test_specialize(self): + L = Annotated[List[T], "my decoration"] + LI = Annotated[List[int], "my decoration"] + self.assertEqual(L[int], Annotated[List[int], "my decoration"]) + self.assertEqual(L[int].__metadata__, ("my decoration",)) + self.assertEqual(L[int].__origin__, List[int]) + with self.assertRaises(TypeError): + LI[int] + with self.assertRaises(TypeError): + L[int, float] + + def test_hash_eq(self): + self.assertEqual(len({Annotated[int, 4, 5], Annotated[int, 4, 5]}), 1) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[int, 5, 4]) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[str, 4, 5]) + self.assertNotEqual(Annotated[int, 4], Annotated[int, 4, 4]) + self.assertEqual( + {Annotated[int, 4, 5], Annotated[int, 4, 5], Annotated[T, 4, 5]}, + {Annotated[int, 4, 5], Annotated[T, 4, 5]} + ) + + def test_instantiate(self): + class C: + classvar = 4 + + def __init__(self, x): + self.x = x + + def __eq__(self, other): + if not isinstance(other, C): + return NotImplemented + return other.x == self.x + + A = Annotated[C, "a decoration"] + a = A(5) + c = C(5) + self.assertEqual(a, c) + self.assertEqual(a.x, c.x) + self.assertEqual(a.classvar, c.classvar) + + def test_instantiate_generic(self): + MyCount = Annotated[typing.Counter[T], "my decoration"] + self.assertEqual(MyCount([4, 4, 5]), {4: 2, 5: 1}) + self.assertEqual(MyCount[int]([4, 4, 5]), {4: 2, 5: 1}) + + def test_cannot_instantiate_forward(self): + A = Annotated["int", (5, 6)] + with self.assertRaises(TypeError): + A(5) + + def test_cannot_instantiate_type_var(self): + A = Annotated[T, (5, 6)] + with self.assertRaises(TypeError): + A(5) + + def test_cannot_getattr_typevar(self): + with self.assertRaises(AttributeError): + Annotated[T, (5, 7)].x + + def test_attr_passthrough(self): + class C: + classvar = 4 + + A = Annotated[C, "a decoration"] + self.assertEqual(A.classvar, 4) + A.x = 5 + self.assertEqual(C.x, 5) + + def test_hash_eq(self): + self.assertEqual(len({Annotated[int, 4, 5], Annotated[int, 4, 5]}), 1) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[int, 5, 4]) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[str, 4, 5]) + self.assertNotEqual(Annotated[int, 4], Annotated[int, 4, 4]) + self.assertEqual( + {Annotated[int, 4, 5], Annotated[int, 4, 5], Annotated[T, 4, 5]}, + {Annotated[int, 4, 5], Annotated[T, 4, 5]} + ) + + def test_cannot_subclass(self): + with self.assertRaisesRegex(TypeError, "Cannot subclass .*Annotated"): + class C(Annotated): + pass + + def test_cannot_check_instance(self): + with self.assertRaises(TypeError): + isinstance(5, Annotated[int, "positive"]) + + def test_cannot_check_subclass(self): + with self.assertRaises(TypeError): + issubclass(int, Annotated[int, "positive"]) + + def test_pickle(self): + samples = [typing.Any, typing.Union[int, str], + typing.Optional[str], Tuple[int, ...], + typing.Callable[[str], bytes]] + + for t in samples: + x = Annotated[t, "a"] + + for prot in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=prot, type=t): + pickled = pickle.dumps(x, prot) + restored = pickle.loads(pickled) + self.assertEqual(x, restored) + + global _Annotated_test_G + + class _Annotated_test_G(Generic[T]): + x = 1 + + G = Annotated[_Annotated_test_G[int], "A decoration"] + G.foo = 42 + G.bar = 'abc' + + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + z = pickle.dumps(G, proto) + x = pickle.loads(z) + self.assertEqual(x.foo, 42) + self.assertEqual(x.bar, 'abc') + self.assertEqual(x.x, 1) + + def test_subst(self): + dec = "a decoration" + dec2 = "another decoration" + + S = Annotated[T, dec2] + self.assertEqual(S[int], Annotated[int, dec2]) + + self.assertEqual(S[Annotated[int, dec]], Annotated[int, dec, dec2]) + L = Annotated[List[T], dec] + + self.assertEqual(L[int], Annotated[List[int], dec]) + with self.assertRaises(TypeError): + L[int, int] + + self.assertEqual(S[L[int]], Annotated[List[int], dec, dec2]) + + D = Annotated[typing.Dict[KT, VT], dec] + self.assertEqual(D[str, int], Annotated[typing.Dict[str, int], dec]) + with self.assertRaises(TypeError): + D[int] + + It = Annotated[int, dec] + with self.assertRaises(TypeError): + It[None] + + LI = L[int] + with self.assertRaises(TypeError): + LI[None] + + def test_annotated_in_other_types(self): + X = List[Annotated[T, 5]] + self.assertEqual(X[int], List[Annotated[int, 5]]) + + class AllTests(BaseTestCase): """Tests for __all__.""" diff --git a/Lib/test/test_ucn.py b/Lib/test/test_ucn.py index 8febf0af..e95f911d 100644 --- a/Lib/test/test_ucn.py +++ b/Lib/test/test_ucn.py @@ -12,7 +12,6 @@ import unicodedata from test import support from http.client import HTTPException -from test.test_normalization import check_version try: from _testcapi import INT_MAX, PY_SSIZE_T_MAX, UINT_MAX @@ -100,6 +99,7 @@ class UnicodeNamesTest(unittest.TestCase): self.checkletter("CJK UNIFIED IDEOGRAPH-2B734", "\U0002B734") self.checkletter("CJK UNIFIED IDEOGRAPH-2B740", "\U0002B740") self.checkletter("CJK UNIFIED IDEOGRAPH-2B81D", "\U0002B81D") + self.checkletter("CJK UNIFIED IDEOGRAPH-3134A", "\U0003134A") def test_bmp_characters(self): for code in range(0x10000): @@ -172,6 +172,9 @@ class UnicodeNamesTest(unittest.TestCase): def test_named_sequences_full(self): # Check all the named sequences + def check_version(testfile): + hdr = testfile.readline() + return unicodedata.unidata_version in hdr url = ("http://www.pythontest.net/unicode/%s/NamedSequences.txt" % unicodedata.unidata_version) try: diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 1d6aabdb..2ee4e64d 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -11,10 +11,12 @@ import itertools import operator import struct import sys +import textwrap import unicodedata import unittest import warnings from test import support, string_tests +from test.support.script_helper import assert_python_failure # Error handling (bad decoder return) def search_function(encoding): @@ -718,6 +720,13 @@ class UnicodeTest(string_tests.CommonTest, self.assertFalse("©".isidentifier()) self.assertFalse("0".isidentifier()) + @support.cpython_only + def test_isidentifier_legacy(self): + import _testcapi + u = '𝖀𝖓𝖎𝖈𝖔𝖉𝖊' + self.assertTrue(u.isidentifier()) + self.assertTrue(_testcapi.unicode_legacy_string(u).isidentifier()) + def test_isprintable(self): self.assertTrue("".isprintable()) self.assertTrue(" ".isprintable()) @@ -1750,7 +1759,7 @@ class UnicodeTest(string_tests.CommonTest, # Issue #8271: during the decoding of an invalid UTF-8 byte sequence, # only the start byte and the continuation byte(s) are now considered # invalid, instead of the number of bytes specified by the start byte. - # See http://www.unicode.org/versions/Unicode5.2.0/ch03.pdf (page 95, + # See https://www.unicode.org/versions/Unicode5.2.0/ch03.pdf (page 95, # table 3-8, Row 2) for more information about the algorithm used. FFFD = '\ufffd' sequences = [ @@ -2447,6 +2456,66 @@ class UnicodeTest(string_tests.CommonTest, support.check_free_after_iterating(self, iter, str) support.check_free_after_iterating(self, reversed, str) + def test_check_encoding_errors(self): + # bpo-37388: str(bytes) and str.decode() must check encoding and errors + # arguments in dev mode + encodings = ('ascii', 'utf8', 'latin1') + invalid = 'Boom, Shaka Laka, Boom!' + code = textwrap.dedent(f''' + import sys + encodings = {encodings!r} + + for data in (b'', b'short string'): + try: + str(data, encoding={invalid!r}) + except LookupError: + pass + else: + sys.exit(21) + + try: + str(data, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(22) + + for encoding in encodings: + try: + str(data, encoding, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(22) + + for data in ('', 'short string'): + try: + data.encode(encoding={invalid!r}) + except LookupError: + pass + else: + sys.exit(23) + + try: + data.encode(errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(24) + + for encoding in encodings: + try: + data.encode(encoding, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(24) + + sys.exit(10) + ''') + proc = assert_python_failure('-X', 'dev', '-c', code) + self.assertEqual(proc.rc, 10, proc) + class CAPITest(unittest.TestCase): @@ -2758,15 +2827,43 @@ class CAPITest(unittest.TestCase): for s in ['abc', '\xa1\xa2', '\u4f60\u597d', 'a\U0001f600', 'a\ud800b\udfffc', '\ud834\udd1e']: l = len(s) - self.assertEqual(unicode_asucs4(s, l, 1), s+'\0') - self.assertEqual(unicode_asucs4(s, l, 0), s+'\uffff') - self.assertEqual(unicode_asucs4(s, l+1, 1), s+'\0\uffff') - self.assertEqual(unicode_asucs4(s, l+1, 0), s+'\0\uffff') - self.assertRaises(SystemError, unicode_asucs4, s, l-1, 1) - self.assertRaises(SystemError, unicode_asucs4, s, l-2, 0) + self.assertEqual(unicode_asucs4(s, l, True), s+'\0') + self.assertEqual(unicode_asucs4(s, l, False), s+'\uffff') + self.assertEqual(unicode_asucs4(s, l+1, True), s+'\0\uffff') + self.assertEqual(unicode_asucs4(s, l+1, False), s+'\0\uffff') + self.assertRaises(SystemError, unicode_asucs4, s, l-1, True) + self.assertRaises(SystemError, unicode_asucs4, s, l-2, False) s = '\0'.join([s, s]) - self.assertEqual(unicode_asucs4(s, len(s), 1), s+'\0') - self.assertEqual(unicode_asucs4(s, len(s), 0), s+'\uffff') + self.assertEqual(unicode_asucs4(s, len(s), True), s+'\0') + self.assertEqual(unicode_asucs4(s, len(s), False), s+'\uffff') + + # Test PyUnicode_AsUTF8() + @support.cpython_only + def test_asutf8(self): + from _testcapi import unicode_asutf8 + + bmp = '\u0100' + bmp2 = '\uffff' + nonbmp = chr(0x10ffff) + + self.assertEqual(unicode_asutf8(bmp), b'\xc4\x80') + self.assertEqual(unicode_asutf8(bmp2), b'\xef\xbf\xbf') + self.assertEqual(unicode_asutf8(nonbmp), b'\xf4\x8f\xbf\xbf') + self.assertRaises(UnicodeEncodeError, unicode_asutf8, 'a\ud800b\udfffc') + + # Test PyUnicode_AsUTF8AndSize() + @support.cpython_only + def test_asutf8andsize(self): + from _testcapi import unicode_asutf8andsize + + bmp = '\u0100' + bmp2 = '\uffff' + nonbmp = chr(0x10ffff) + + self.assertEqual(unicode_asutf8andsize(bmp), (b'\xc4\x80', 2)) + self.assertEqual(unicode_asutf8andsize(bmp2), (b'\xef\xbf\xbf', 3)) + self.assertEqual(unicode_asutf8andsize(nonbmp), (b'\xf4\x8f\xbf\xbf', 4)) + self.assertRaises(UnicodeEncodeError, unicode_asutf8andsize, 'a\ud800b\udfffc') # Test PyUnicode_FindChar() @support.cpython_only diff --git a/Lib/test/test_unicode_identifiers.py b/Lib/test/test_unicode_identifiers.py index 07332c46..5b9ced5d 100644 --- a/Lib/test/test_unicode_identifiers.py +++ b/Lib/test/test_unicode_identifiers.py @@ -20,9 +20,11 @@ class PEP3131Test(unittest.TestCase): def test_invalid(self): try: from test import badsyntax_3131 - except SyntaxError as s: - self.assertEqual(str(s), - "invalid character in identifier (badsyntax_3131.py, line 2)") + except SyntaxError as err: + self.assertEqual(str(err), + "invalid character '€' (U+20AC) (badsyntax_3131.py, line 2)") + self.assertEqual(err.lineno, 2) + self.assertEqual(err.offset, 1) else: self.fail("expected exception didn't occur") diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py index 07d71768..b552d2bd 100644 --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -1,4 +1,4 @@ -""" Test script for the unicodedata module. +""" Tests for the unicodedata module. Written by Marc-Andre Lemburg (mal@lemburg.com). @@ -6,25 +6,23 @@ """ +import hashlib +from http.client import HTTPException import sys +import unicodedata import unittest -import hashlib -from test.support import script_helper - -encoding = 'utf-8' -errors = 'surrogatepass' - +from test.support import open_urlresource, requires_resource, script_helper -### Run tests class UnicodeMethodsTest(unittest.TestCase): # update this, if the database changes - expectedchecksum = '9129d6f2bdf008a81c2476e5b5127014a62130c1' + expectedchecksum = 'fbdf8106a3c7c242086b0a9efa03ad4d30d5b85d' + @requires_resource('cpu') def test_method_checksum(self): h = hashlib.sha1() - for i in range(0x10000): + for i in range(sys.maxunicode + 1): char = chr(i) data = [ # Predicates (single char) @@ -61,31 +59,25 @@ class UnicodeMethodsTest(unittest.TestCase): (char + 'ABC').title(), ] - h.update(''.join(data).encode(encoding, errors)) + h.update(''.join(data).encode('utf-8', 'surrogatepass')) result = h.hexdigest() self.assertEqual(result, self.expectedchecksum) class UnicodeDatabaseTest(unittest.TestCase): - - def setUp(self): - # In case unicodedata is not available, this will raise an ImportError, - # but the other test cases will still be run - import unicodedata - self.db = unicodedata - - def tearDown(self): - del self.db + db = unicodedata class UnicodeFunctionsTest(UnicodeDatabaseTest): # Update this if the database changes. Make sure to do a full rebuild # (e.g. 'make distclean && make') to get the correct checksum. - expectedchecksum = 'c44a49ca7c5cb6441640fe174ede604b45028652' + expectedchecksum = 'd1e37a2854df60ac607b47b51189b9bf1b54bfdb' + + @requires_resource('cpu') def test_function_checksum(self): data = [] h = hashlib.sha1() - for i in range(0x10000): + for i in range(sys.maxunicode + 1): char = chr(i) data = [ # Properties @@ -183,15 +175,8 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest): self.assertRaises(TypeError, self.db.combining) self.assertRaises(TypeError, self.db.combining, 'xx') - def test_normalize(self): - self.assertRaises(TypeError, self.db.normalize) - self.assertRaises(ValueError, self.db.normalize, 'unknown', 'xx') - self.assertEqual(self.db.normalize('NFKC', ''), '') - # The rest can be found in test_normalization.py - # which requires an external file. - def test_pr29(self): - # http://www.unicode.org/review/pr-29.html + # https://www.unicode.org/review/pr-29.html # See issues #1054943 and #10254. composed = ("\u0b47\u0300\u0b3e", "\u1100\u0300\u1161", 'Li\u030dt-s\u1e73\u0301', @@ -220,9 +205,6 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest): self.assertEqual(self.db.normalize('NFC', u11a7_str_a), u11a7_str_b) self.assertEqual(self.db.normalize('NFC', u11c3_str_a), u11c3_str_b) - # For tests of unicodedata.is_normalized / self.db.is_normalized , - # see test_normalization.py . - def test_east_asian_width(self): eaw = self.db.east_asian_width self.assertRaises(TypeError, eaw, b'a') @@ -327,5 +309,102 @@ class UnicodeMiscTest(UnicodeDatabaseTest): self.assertEqual(len(lines), 1, r"\u%.4x should not be a linebreak" % i) +class NormalizationTest(unittest.TestCase): + @staticmethod + def check_version(testfile): + hdr = testfile.readline() + return unicodedata.unidata_version in hdr + + @staticmethod + def unistr(data): + data = [int(x, 16) for x in data.split(" ")] + return "".join([chr(x) for x in data]) + + def test_normalization(self): + TESTDATAFILE = "NormalizationTest.txt" + TESTDATAURL = f"http://www.pythontest.net/unicode/{unicodedata.unidata_version}/{TESTDATAFILE}" + + # Hit the exception early + try: + testdata = open_urlresource(TESTDATAURL, encoding="utf-8", + check=self.check_version) + except PermissionError: + self.skipTest(f"Permission error when downloading {TESTDATAURL} " + f"into the test data directory") + except (OSError, HTTPException): + self.fail(f"Could not retrieve {TESTDATAURL}") + + with testdata: + self.run_normalization_tests(testdata) + + def run_normalization_tests(self, testdata): + part = None + part1_data = {} + + def NFC(str): + return unicodedata.normalize("NFC", str) + + def NFKC(str): + return unicodedata.normalize("NFKC", str) + + def NFD(str): + return unicodedata.normalize("NFD", str) + + def NFKD(str): + return unicodedata.normalize("NFKD", str) + + for line in testdata: + if '#' in line: + line = line.split('#')[0] + line = line.strip() + if not line: + continue + if line.startswith("@Part"): + part = line.split()[0] + continue + c1,c2,c3,c4,c5 = [self.unistr(x) for x in line.split(';')[:-1]] + + # Perform tests + self.assertTrue(c2 == NFC(c1) == NFC(c2) == NFC(c3), line) + self.assertTrue(c4 == NFC(c4) == NFC(c5), line) + self.assertTrue(c3 == NFD(c1) == NFD(c2) == NFD(c3), line) + self.assertTrue(c5 == NFD(c4) == NFD(c5), line) + self.assertTrue(c4 == NFKC(c1) == NFKC(c2) == \ + NFKC(c3) == NFKC(c4) == NFKC(c5), + line) + self.assertTrue(c5 == NFKD(c1) == NFKD(c2) == \ + NFKD(c3) == NFKD(c4) == NFKD(c5), + line) + + self.assertTrue(unicodedata.is_normalized("NFC", c2)) + self.assertTrue(unicodedata.is_normalized("NFC", c4)) + + self.assertTrue(unicodedata.is_normalized("NFD", c3)) + self.assertTrue(unicodedata.is_normalized("NFD", c5)) + + self.assertTrue(unicodedata.is_normalized("NFKC", c4)) + self.assertTrue(unicodedata.is_normalized("NFKD", c5)) + + # Record part 1 data + if part == "@Part1": + part1_data[c1] = 1 + + # Perform tests for all other data + for c in range(sys.maxunicode+1): + X = chr(c) + if X in part1_data: + continue + self.assertTrue(X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X), c) + + def test_edge_cases(self): + self.assertRaises(TypeError, unicodedata.normalize) + self.assertRaises(ValueError, unicodedata.normalize, 'unknown', 'xx') + self.assertEqual(unicodedata.normalize('NFKC', ''), '') + + def test_bug_834676(self): + # Check for bug 834676 + unicodedata.normalize('NFC', '\ud55c\uae00') + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_unpack_ex.py b/Lib/test/test_unpack_ex.py index 45cf051f..fcc93829 100644 --- a/Lib/test/test_unpack_ex.py +++ b/Lib/test/test_unpack_ex.py @@ -158,14 +158,20 @@ List comprehension element unpacking ... SyntaxError: iterable unpacking cannot be used in comprehension -Generator expression in function arguments - - >>> list(*x for x in (range(5) for i in range(3))) + >>> {**{} for a in [1]} Traceback (most recent call last): ... - list(*x for x in (range(5) for i in range(3))) - ^ - SyntaxError: invalid syntax + SyntaxError: dict unpacking cannot be used in dict comprehension + +# Pegen is better here. +# Generator expression in function arguments + +# >>> list(*x for x in (range(5) for i in range(3))) +# Traceback (most recent call last): +# ... +# list(*x for x in (range(5) for i in range(3))) +# ^ +# SyntaxError: invalid syntax >>> dict(**x for x in [{1:2}]) Traceback (most recent call last): @@ -236,27 +242,27 @@ Overridden parameters >>> f(x=5, **{'x': 3}, y=2) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'x' + TypeError: test.test_unpack_ex.f() got multiple values for keyword argument 'x' >>> f(**{'x': 3}, x=5, y=2) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'x' + TypeError: test.test_unpack_ex.f() got multiple values for keyword argument 'x' >>> f(**{'x': 3}, **{'x': 5}, y=2) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'x' + TypeError: test.test_unpack_ex.f() got multiple values for keyword argument 'x' >>> f(x=5, **{'x': 3}, **{'x': 2}) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'x' + TypeError: test.test_unpack_ex.f() got multiple values for keyword argument 'x' >>> f(**{1: 3}, **{1: 5}) Traceback (most recent call last): ... - TypeError: f() keywords must be strings + TypeError: test.test_unpack_ex.f() got multiple values for keyword argument '1' Unpacking non-sequence @@ -308,12 +314,17 @@ Now some general starred expressions (all fail). >>> a, *b, c, *d, e = range(10) # doctest:+ELLIPSIS Traceback (most recent call last): ... - SyntaxError: two starred expressions in assignment + SyntaxError: multiple starred expressions in assignment >>> [*b, *c] = range(10) # doctest:+ELLIPSIS Traceback (most recent call last): ... - SyntaxError: two starred expressions in assignment + SyntaxError: multiple starred expressions in assignment + + >>> a,*b,*c,*d = range(4) # doctest:+ELLIPSIS + Traceback (most recent call last): + ... + SyntaxError: multiple starred expressions in assignment >>> *a = range(10) # doctest:+ELLIPSIS Traceback (most recent call last): diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py new file mode 100644 index 00000000..532aa3a6 --- /dev/null +++ b/Lib/test/test_unparse.py @@ -0,0 +1,542 @@ +"""Tests for the unparse.py script in the Tools/parser directory.""" + +import unittest +import test.support +import pathlib +import random +import tokenize +import ast + + +def read_pyfile(filename): + """Read and return the contents of a Python source file (as a + string), taking into account the file encoding.""" + with tokenize.open(filename) as stream: + return stream.read() + + +for_else = """\ +def f(): + for x in range(10): + break + else: + y = 2 + z = 3 +""" + +while_else = """\ +def g(): + while True: + break + else: + y = 2 + z = 3 +""" + +relative_import = """\ +from . import fred +from .. import barney +from .australia import shrimp as prawns +""" + +nonlocal_ex = """\ +def f(): + x = 1 + def g(): + nonlocal x + x = 2 + y = 7 + def h(): + nonlocal x, y +""" + +# also acts as test for 'except ... as ...' +raise_from = """\ +try: + 1 / 0 +except ZeroDivisionError as e: + raise ArithmeticError from e +""" + +class_decorator = """\ +@f1(arg) +@f2 +class Foo: pass +""" + +elif1 = """\ +if cond1: + suite1 +elif cond2: + suite2 +else: + suite3 +""" + +elif2 = """\ +if cond1: + suite1 +elif cond2: + suite2 +""" + +try_except_finally = """\ +try: + suite1 +except ex1: + suite2 +except ex2: + suite3 +else: + suite4 +finally: + suite5 +""" + +with_simple = """\ +with f(): + suite1 +""" + +with_as = """\ +with f() as x: + suite1 +""" + +with_two_items = """\ +with f() as x, g() as y: + suite1 +""" + +docstring_prefixes = ( + "", + "class foo:\n ", + "def foo():\n ", + "async def foo():\n ", +) + +class ASTTestCase(unittest.TestCase): + def assertASTEqual(self, ast1, ast2): + self.assertEqual(ast.dump(ast1), ast.dump(ast2)) + + def check_ast_roundtrip(self, code1, **kwargs): + with self.subTest(code1=code1, ast_parse_kwargs=kwargs): + ast1 = ast.parse(code1, **kwargs) + code2 = ast.unparse(ast1) + ast2 = ast.parse(code2, **kwargs) + self.assertASTEqual(ast1, ast2) + + def check_invalid(self, node, raises=ValueError): + with self.subTest(node=node): + self.assertRaises(raises, ast.unparse, node) + + def get_source(self, code1, code2=None): + code2 = code2 or code1 + code1 = ast.unparse(ast.parse(code1)) + return code1, code2 + + def check_src_roundtrip(self, code1, code2=None): + code1, code2 = self.get_source(code1, code2) + with self.subTest(code1=code1, code2=code2): + self.assertEqual(code2, code1) + + def check_src_dont_roundtrip(self, code1, code2=None): + code1, code2 = self.get_source(code1, code2) + with self.subTest(code1=code1, code2=code2): + self.assertNotEqual(code2, code1) + +class UnparseTestCase(ASTTestCase): + # Tests for specific bugs found in earlier versions of unparse + + def test_fstrings(self): + # See issue 25180 + self.check_ast_roundtrip(r"""f'{f"{0}"*3}'""") + self.check_ast_roundtrip(r"""f'{f"{y}"*3}'""") + + def test_strings(self): + self.check_ast_roundtrip("u'foo'") + self.check_ast_roundtrip("r'foo'") + self.check_ast_roundtrip("b'foo'") + + def test_del_statement(self): + self.check_ast_roundtrip("del x, y, z") + + def test_shifts(self): + self.check_ast_roundtrip("45 << 2") + self.check_ast_roundtrip("13 >> 7") + + def test_for_else(self): + self.check_ast_roundtrip(for_else) + + def test_while_else(self): + self.check_ast_roundtrip(while_else) + + def test_unary_parens(self): + self.check_ast_roundtrip("(-1)**7") + self.check_ast_roundtrip("(-1.)**8") + self.check_ast_roundtrip("(-1j)**6") + self.check_ast_roundtrip("not True or False") + self.check_ast_roundtrip("True or not False") + + def test_integer_parens(self): + self.check_ast_roundtrip("3 .__abs__()") + + def test_huge_float(self): + self.check_ast_roundtrip("1e1000") + self.check_ast_roundtrip("-1e1000") + self.check_ast_roundtrip("1e1000j") + self.check_ast_roundtrip("-1e1000j") + + def test_min_int(self): + self.check_ast_roundtrip(str(-(2 ** 31))) + self.check_ast_roundtrip(str(-(2 ** 63))) + + def test_imaginary_literals(self): + self.check_ast_roundtrip("7j") + self.check_ast_roundtrip("-7j") + self.check_ast_roundtrip("0j") + self.check_ast_roundtrip("-0j") + + def test_lambda_parentheses(self): + self.check_ast_roundtrip("(lambda: int)()") + + def test_chained_comparisons(self): + self.check_ast_roundtrip("1 < 4 <= 5") + self.check_ast_roundtrip("a is b is c is not d") + + def test_function_arguments(self): + self.check_ast_roundtrip("def f(): pass") + self.check_ast_roundtrip("def f(a): pass") + self.check_ast_roundtrip("def f(b = 2): pass") + self.check_ast_roundtrip("def f(a, b): pass") + self.check_ast_roundtrip("def f(a, b = 2): pass") + self.check_ast_roundtrip("def f(a = 5, b = 2): pass") + self.check_ast_roundtrip("def f(*, a = 1, b = 2): pass") + self.check_ast_roundtrip("def f(*, a = 1, b): pass") + self.check_ast_roundtrip("def f(*, a, b = 2): pass") + self.check_ast_roundtrip("def f(a, b = None, *, c, **kwds): pass") + self.check_ast_roundtrip("def f(a=2, *args, c=5, d, **kwds): pass") + self.check_ast_roundtrip("def f(*args, **kwargs): pass") + + def test_relative_import(self): + self.check_ast_roundtrip(relative_import) + + def test_nonlocal(self): + self.check_ast_roundtrip(nonlocal_ex) + + def test_raise_from(self): + self.check_ast_roundtrip(raise_from) + + def test_bytes(self): + self.check_ast_roundtrip("b'123'") + + def test_annotations(self): + self.check_ast_roundtrip("def f(a : int): pass") + self.check_ast_roundtrip("def f(a: int = 5): pass") + self.check_ast_roundtrip("def f(*args: [int]): pass") + self.check_ast_roundtrip("def f(**kwargs: dict): pass") + self.check_ast_roundtrip("def f() -> None: pass") + + def test_set_literal(self): + self.check_ast_roundtrip("{'a', 'b', 'c'}") + + def test_set_comprehension(self): + self.check_ast_roundtrip("{x for x in range(5)}") + + def test_dict_comprehension(self): + self.check_ast_roundtrip("{x: x*x for x in range(10)}") + + def test_class_decorators(self): + self.check_ast_roundtrip(class_decorator) + + def test_class_definition(self): + self.check_ast_roundtrip("class A(metaclass=type, *[], **{}): pass") + + def test_elifs(self): + self.check_ast_roundtrip(elif1) + self.check_ast_roundtrip(elif2) + + def test_try_except_finally(self): + self.check_ast_roundtrip(try_except_finally) + + def test_starred_assignment(self): + self.check_ast_roundtrip("a, *b, c = seq") + self.check_ast_roundtrip("a, (*b, c) = seq") + self.check_ast_roundtrip("a, *b[0], c = seq") + self.check_ast_roundtrip("a, *(b, c) = seq") + + def test_with_simple(self): + self.check_ast_roundtrip(with_simple) + + def test_with_as(self): + self.check_ast_roundtrip(with_as) + + def test_with_two_items(self): + self.check_ast_roundtrip(with_two_items) + + def test_dict_unpacking_in_dict(self): + # See issue 26489 + self.check_ast_roundtrip(r"""{**{'y': 2}, 'x': 1}""") + self.check_ast_roundtrip(r"""{**{'y': 2}, **{'x': 1}}""") + + def test_slices(self): + self.check_ast_roundtrip("a[i]") + self.check_ast_roundtrip("a[i,]") + self.check_ast_roundtrip("a[i, j]") + self.check_ast_roundtrip("a[(*a,)]") + self.check_ast_roundtrip("a[(a:=b)]") + self.check_ast_roundtrip("a[(a:=b,c)]") + self.check_ast_roundtrip("a[()]") + self.check_ast_roundtrip("a[i:j]") + self.check_ast_roundtrip("a[:j]") + self.check_ast_roundtrip("a[i:]") + self.check_ast_roundtrip("a[i:j:k]") + self.check_ast_roundtrip("a[:j:k]") + self.check_ast_roundtrip("a[i::k]") + self.check_ast_roundtrip("a[i:j,]") + self.check_ast_roundtrip("a[i:j, k]") + + def test_invalid_raise(self): + self.check_invalid(ast.Raise(exc=None, cause=ast.Name(id="X"))) + + def test_invalid_fstring_constant(self): + self.check_invalid(ast.JoinedStr(values=[ast.Constant(value=100)])) + + def test_invalid_fstring_conversion(self): + self.check_invalid( + ast.FormattedValue( + value=ast.Constant(value="a", kind=None), + conversion=ord("Y"), # random character + format_spec=None, + ) + ) + + def test_invalid_set(self): + self.check_invalid(ast.Set(elts=[])) + + def test_invalid_yield_from(self): + self.check_invalid(ast.YieldFrom(value=None)) + + def test_docstrings(self): + docstrings = ( + 'this ends with double quote"', + 'this includes a """triple quote"""', + '\r', + '\\r', + '\t', + '\\t', + '\n', + '\\n', + '\r\\r\t\\t\n\\n', + '""">>> content = \"\"\"blabla\"\"\" <<<"""', + r'foo\n\x00', + '🐍⛎𩸽üéş^\N{LONG RIGHTWARDS SQUIGGLE ARROW}' + + ) + for docstring in docstrings: + # check as Module docstrings for easy testing + self.check_ast_roundtrip(f"'''{docstring}'''") + + def test_constant_tuples(self): + self.check_src_roundtrip(ast.Constant(value=(1,), kind=None), "(1,)") + self.check_src_roundtrip( + ast.Constant(value=(1, 2, 3), kind=None), "(1, 2, 3)" + ) + + def test_function_type(self): + for function_type in ( + "() -> int", + "(int, int) -> int", + "(Callable[complex], More[Complex(call.to_typevar())]) -> None" + ): + self.check_ast_roundtrip(function_type, mode="func_type") + + def test_type_comments(self): + for statement in ( + "a = 5 # type:", + "a = 5 # type: int", + "a = 5 # type: int and more", + "def x(): # type: () -> None\n\tpass", + "def x(y): # type: (int) -> None and more\n\tpass", + "async def x(): # type: () -> None\n\tpass", + "async def x(y): # type: (int) -> None and more\n\tpass", + "for x in y: # type: int\n\tpass", + "async for x in y: # type: int\n\tpass", + "with x(): # type: int\n\tpass", + "async with x(): # type: int\n\tpass" + ): + self.check_ast_roundtrip(statement, type_comments=True) + + def test_type_ignore(self): + for statement in ( + "a = 5 # type: ignore", + "a = 5 # type: ignore and more", + "def x(): # type: ignore\n\tpass", + "def x(y): # type: ignore and more\n\tpass", + "async def x(): # type: ignore\n\tpass", + "async def x(y): # type: ignore and more\n\tpass", + "for x in y: # type: ignore\n\tpass", + "async for x in y: # type: ignore\n\tpass", + "with x(): # type: ignore\n\tpass", + "async with x(): # type: ignore\n\tpass" + ): + self.check_ast_roundtrip(statement, type_comments=True) + + +class CosmeticTestCase(ASTTestCase): + """Test if there are cosmetic issues caused by unnecesary additions""" + + def test_simple_expressions_parens(self): + self.check_src_roundtrip("(a := b)") + self.check_src_roundtrip("await x") + self.check_src_roundtrip("x if x else y") + self.check_src_roundtrip("lambda x: x") + self.check_src_roundtrip("1 + 1") + self.check_src_roundtrip("1 + 2 / 3") + self.check_src_roundtrip("(1 + 2) / 3") + self.check_src_roundtrip("(1 + 2) * 3 + 4 * (5 + 2)") + self.check_src_roundtrip("(1 + 2) * 3 + 4 * (5 + 2) ** 2") + self.check_src_roundtrip("~x") + self.check_src_roundtrip("x and y") + self.check_src_roundtrip("x and y and z") + self.check_src_roundtrip("x and (y and x)") + self.check_src_roundtrip("(x and y) and z") + self.check_src_roundtrip("(x ** y) ** z ** q") + self.check_src_roundtrip("x >> y") + self.check_src_roundtrip("x << y") + self.check_src_roundtrip("x >> y and x >> z") + self.check_src_roundtrip("x + y - z * q ^ t ** k") + self.check_src_roundtrip("P * V if P and V else n * R * T") + self.check_src_roundtrip("lambda P, V, n: P * V == n * R * T") + self.check_src_roundtrip("flag & (other | foo)") + self.check_src_roundtrip("not x == y") + self.check_src_roundtrip("x == (not y)") + self.check_src_roundtrip("yield x") + self.check_src_roundtrip("yield from x") + self.check_src_roundtrip("call((yield x))") + self.check_src_roundtrip("return x + (yield x)") + + + def test_class_bases_and_keywords(self): + self.check_src_roundtrip("class X:\n pass") + self.check_src_roundtrip("class X(A):\n pass") + self.check_src_roundtrip("class X(A, B, C, D):\n pass") + self.check_src_roundtrip("class X(x=y):\n pass") + self.check_src_roundtrip("class X(metaclass=z):\n pass") + self.check_src_roundtrip("class X(x=y, z=d):\n pass") + self.check_src_roundtrip("class X(A, x=y):\n pass") + self.check_src_roundtrip("class X(A, **kw):\n pass") + self.check_src_roundtrip("class X(*args):\n pass") + self.check_src_roundtrip("class X(*args, **kwargs):\n pass") + + def test_docstrings(self): + docstrings = ( + '"""simple doc string"""', + '''"""A more complex one + with some newlines"""''', + '''"""Foo bar baz + + empty newline"""''', + '"""With some \t"""', + '"""Foo "bar" baz """', + '"""\\r"""', + '""""""', + '"""\'\'\'"""', + '"""\'\'\'\'\'\'"""', + ) + + for prefix in docstring_prefixes: + for docstring in docstrings: + self.check_src_roundtrip(f"{prefix}{docstring}") + + def test_docstrings_negative_cases(self): + # Test some cases that involve strings in the children of the + # first node but aren't docstrings to make sure we don't have + # False positives. + docstrings_negative = ( + 'a = """false"""', + '"""false""" + """unless its optimized"""', + '1 + 1\n"""false"""', + 'f"""no, top level but f-fstring"""' + ) + for prefix in docstring_prefixes: + for negative in docstrings_negative: + # this cases should be result with single quote + # rather then triple quoted docstring + src = f"{prefix}{negative}" + self.check_ast_roundtrip(src) + self.check_src_dont_roundtrip(src) + + def test_unary_op_factor(self): + for prefix in ("+", "-", "~"): + self.check_src_roundtrip(f"{prefix}1") + for prefix in ("not",): + self.check_src_roundtrip(f"{prefix} 1") + + def test_slices(self): + self.check_src_roundtrip("a[1]") + self.check_src_roundtrip("a[1, 2]") + self.check_src_roundtrip("a[(1, *a)]") + +class DirectoryTestCase(ASTTestCase): + """Test roundtrip behaviour on all files in Lib and Lib/test.""" + + lib_dir = pathlib.Path(__file__).parent / ".." + test_directories = (lib_dir, lib_dir / "test") + skip_files = {"test_fstring.py"} + run_always_files = {"test_grammar.py", "test_syntax.py", "test_compile.py", + "test_ast.py", "test_asdl_parser.py"} + + _files_to_test = None + + @classmethod + def files_to_test(cls): + + if cls._files_to_test is not None: + return cls._files_to_test + + items = [ + item.resolve() + for directory in cls.test_directories + for item in directory.glob("*.py") + if not item.name.startswith("bad") + ] + + # Test limited subset of files unless the 'cpu' resource is specified. + if not test.support.is_resource_enabled("cpu"): + + tests_to_run_always = {item for item in items if + item.name in cls.run_always_files} + + items = set(random.sample(items, 10)) + + # Make sure that at least tests that heavily use grammar features are + # always considered in order to reduce the chance of missing something. + items = list(items | tests_to_run_always) + + # bpo-31174: Store the names sample to always test the same files. + # It prevents false alarms when hunting reference leaks. + cls._files_to_test = items + + return items + + def test_files(self): + for item in self.files_to_test(): + if test.support.verbose: + print(f"Testing {item.absolute()}") + + # Some f-strings are not correctly round-tripped by + # Tools/parser/unparse.py. See issue 28002 for details. + # We need to skip files that contain such f-strings. + if item.name in self.skip_files: + if test.support.verbose: + print(f"Skipping {item.absolute()}: see issue 28002") + continue + + with self.subTest(filename=item): + source = read_pyfile(item) + self.check_ast_roundtrip(source) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 1c247c5d..68bb49ef 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -151,7 +151,8 @@ class urlopen_FileTests(unittest.TestCase): finally: f.close() self.pathname = support.TESTFN - self.returned_obj = urlopen("file:%s" % self.pathname) + self.quoted_pathname = urllib.parse.quote(self.pathname) + self.returned_obj = urlopen("file:%s" % self.quoted_pathname) def tearDown(self): """Shut down the open object""" @@ -194,11 +195,20 @@ class urlopen_FileTests(unittest.TestCase): # by the tearDown() method for the test self.returned_obj.close() + def test_headers(self): + self.assertIsInstance(self.returned_obj.headers, email.message.Message) + + def test_url(self): + self.assertEqual(self.returned_obj.url, self.quoted_pathname) + + def test_status(self): + self.assertIsNone(self.returned_obj.status) + def test_info(self): self.assertIsInstance(self.returned_obj.info(), email.message.Message) def test_geturl(self): - self.assertEqual(self.returned_obj.geturl(), self.pathname) + self.assertEqual(self.returned_obj.geturl(), self.quoted_pathname) def test_getcode(self): self.assertIsNone(self.returned_obj.getcode()) @@ -599,6 +609,9 @@ class urlopen_DataTests(unittest.TestCase): """Test urlopen() opening a data URL.""" def setUp(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + # text containing URL special- and unicode-characters self.text = "test data URLs :;,%=& \u00f6 \u00c4 " # 2x1 pixel RGB PNG image with one black and one white pixel @@ -673,6 +686,9 @@ class urlretrieve_FileTests(unittest.TestCase): """Test urllib.urlretrieve() on local files""" def setUp(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + # Create a list of temporary files. Each item in the list is a file # name (absolute path or relative to the current working directory). # All files in this list will be deleted in the tearDown method. Note, @@ -813,6 +829,8 @@ class urlretrieve_HttpTests(unittest.TestCase, FakeHTTPMixin): """Test urllib.urlretrieve() using fake http connections""" def test_short_content_raises_ContentTooShortError(self): + self.addCleanup(urllib.request.urlcleanup) + self.fakehttp(b'''HTTP/1.1 200 OK Date: Wed, 02 Jan 2008 03:03:54 GMT Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e @@ -834,6 +852,8 @@ FF self.unfakehttp() def test_short_content_raises_ContentTooShortError_without_reporthook(self): + self.addCleanup(urllib.request.urlcleanup) + self.fakehttp(b'''HTTP/1.1 200 OK Date: Wed, 02 Jan 2008 03:03:54 GMT Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e @@ -1084,8 +1104,6 @@ class UnquotingTests(unittest.TestCase): "%s" % result) self.assertRaises((TypeError, AttributeError), urllib.parse.unquote, None) self.assertRaises((TypeError, AttributeError), urllib.parse.unquote, ()) - with support.check_warnings(('', BytesWarning), quiet=True): - self.assertRaises((TypeError, AttributeError), urllib.parse.unquote, b'') def test_unquoting_badpercent(self): # Test unquoting on bad percent-escapes @@ -1245,6 +1263,29 @@ class UnquotingTests(unittest.TestCase): self.assertEqual(expect, result, "using unquote(): %r != %r" % (expect, result)) + def test_unquoting_with_bytes_input(self): + # ASCII characters decoded to a string + given = b'blueberryjam' + expect = 'blueberryjam' + result = urllib.parse.unquote(given) + self.assertEqual(expect, result, + "using unquote(): %r != %r" % (expect, result)) + + # A mix of non-ASCII hex-encoded characters and ASCII characters + given = b'bl\xc3\xa5b\xc3\xa6rsyltet\xc3\xb8y' + expect = 'bl\u00e5b\u00e6rsyltet\u00f8y' + result = urllib.parse.unquote(given) + self.assertEqual(expect, result, + "using unquote(): %r != %r" % (expect, result)) + + # A mix of non-ASCII percent-encoded characters and ASCII characters + given = b'bl%c3%a5b%c3%a6rsyltet%c3%b8j' + expect = 'bl\u00e5b\u00e6rsyltet\u00f8j' + result = urllib.parse.unquote(given) + self.assertEqual(expect, result, + "using unquote(): %r != %r" % (expect, result)) + + class urlencode_Tests(unittest.TestCase): """Tests for urlencode()""" @@ -1558,85 +1599,6 @@ class URLopener_Tests(FakeHTTPMixin, unittest.TestCase): self.assertRaises(OSError, DummyURLopener().retrieve, url) -# Just commented them out. -# Can't really tell why keep failing in windows and sparc. -# Everywhere else they work ok, but on those machines, sometimes -# fail in one of the tests, sometimes in other. I have a linux, and -# the tests go ok. -# If anybody has one of the problematic environments, please help! -# . Facundo -# -# def server(evt): -# import socket, time -# serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -# serv.settimeout(3) -# serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) -# serv.bind(("", 9093)) -# serv.listen() -# try: -# conn, addr = serv.accept() -# conn.send("1 Hola mundo\n") -# cantdata = 0 -# while cantdata < 13: -# data = conn.recv(13-cantdata) -# cantdata += len(data) -# time.sleep(.3) -# conn.send("2 No more lines\n") -# conn.close() -# except socket.timeout: -# pass -# finally: -# serv.close() -# evt.set() -# -# class FTPWrapperTests(unittest.TestCase): -# -# def setUp(self): -# import ftplib, time, threading -# ftplib.FTP.port = 9093 -# self.evt = threading.Event() -# threading.Thread(target=server, args=(self.evt,)).start() -# time.sleep(.1) -# -# def tearDown(self): -# self.evt.wait() -# -# def testBasic(self): -# # connects -# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) -# ftp.close() -# -# def testTimeoutNone(self): -# # global default timeout is ignored -# import socket -# self.assertIsNone(socket.getdefaulttimeout()) -# socket.setdefaulttimeout(30) -# try: -# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) -# finally: -# socket.setdefaulttimeout(None) -# self.assertEqual(ftp.ftp.sock.gettimeout(), 30) -# ftp.close() -# -# def testTimeoutDefault(self): -# # global default timeout is used -# import socket -# self.assertIsNone(socket.getdefaulttimeout()) -# socket.setdefaulttimeout(30) -# try: -# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) -# finally: -# socket.setdefaulttimeout(None) -# self.assertEqual(ftp.ftp.sock.gettimeout(), 30) -# ftp.close() -# -# def testTimeoutValue(self): -# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [], -# timeout=30) -# self.assertEqual(ftp.ftp.sock.gettimeout(), 30) -# ftp.close() - - class RequestTests(unittest.TestCase): """Unit tests for urllib.request.Request.""" diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 091b3979..cbfa9ba6 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -1,5 +1,6 @@ import unittest from test import support +from test.support import socket_helper from test import test_urllib import os @@ -47,6 +48,9 @@ class TrivialTests(unittest.TestCase): def test_trivial(self): # A couple trivial tests + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + self.assertRaises(ValueError, urllib.request.urlopen, 'bogus url') # XXX Name hacking to get this to work on Windows. @@ -631,17 +635,12 @@ class OpenerDirectorTests(unittest.TestCase): [("http_error_302")], ] handlers = add_ordered_mock_handlers(o, meth_spec) - - class Unknown: - def __eq__(self, other): - return True - req = Request("http://example.com/") o.open(req) assert len(o.calls) == 2 calls = [(handlers[0], "http_open", (req,)), (handlers[2], "http_error_302", - (req, Unknown(), 302, "", {}))] + (req, support.ALWAYS_EQ, 302, "", {}))] for expected, got in zip(calls, o.calls): handler, method_name, args = expected self.assertEqual((handler, method_name), got[:2]) @@ -1290,6 +1289,10 @@ class HandlerTests(unittest.TestCase): def test_redirect_no_path(self): # Issue 14132: Relative redirect strips original path + + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + real_class = http.client.HTTPConnection response1 = b"HTTP/1.1 302 Found\r\nLocation: ?query\r\n\r\n" http.client.HTTPConnection = test_urllib.fakehttp(response1) @@ -1774,7 +1777,7 @@ class MiscTests(unittest.TestCase): @unittest.skipUnless(support.is_resource_enabled('network'), 'test requires network access') def test_issue16464(self): - with support.transient_internet("http://www.example.com/"): + with socket_helper.transient_internet("http://www.example.com/"): opener = urllib.request.build_opener() request = urllib.request.Request("http://www.example.com/") self.assertEqual(None, request.data) diff --git a/Lib/test/test_urllib2_localnet.py b/Lib/test/test_urllib2_localnet.py index 1cb358f8..ed426b05 100644 --- a/Lib/test/test_urllib2_localnet.py +++ b/Lib/test/test_urllib2_localnet.py @@ -9,6 +9,7 @@ import unittest import hashlib from test import support +from test.support import hashlib_helper try: import ssl @@ -315,6 +316,7 @@ class BasicAuthTests(unittest.TestCase): self.assertRaises(urllib.error.HTTPError, urllib.request.urlopen, self.server_url) +@hashlib_helper.requires_hashdigest("md5") class ProxyAuthTests(unittest.TestCase): URL = "http://localhost" @@ -322,7 +324,6 @@ class ProxyAuthTests(unittest.TestCase): PASSWD = "test123" REALM = "TestRealm" - @support.requires_hashdigest("md5") def setUp(self): super(ProxyAuthTests, self).setUp() # Ignore proxy bypass settings in the environment. @@ -448,6 +449,9 @@ class TestUrlopen(unittest.TestCase): def setUp(self): super(TestUrlopen, self).setUp() + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + # Ignore proxies for localhost tests. def restore_environ(old_environ): os.environ.clear() diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index 0f43d71e..ba4c500e 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -1,5 +1,6 @@ import unittest from test import support +from test.support import socket_helper from test.test_urllib2 import sanepathname2url import os @@ -10,8 +11,6 @@ import sys support.requires("network") -TIMEOUT = 60 # seconds - def _retry_thrice(func, exc, *args, **kwargs): for i in range(3): @@ -82,10 +81,13 @@ class AuthTests(unittest.TestCase): class CloseSocketTest(unittest.TestCase): def test_close(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + # calling .close() on urllib2's response objects should close the # underlying socket url = support.TEST_HTTP_URL - with support.transient_internet(url): + with socket_helper.transient_internet(url): response = _urlopen_with_retry(url) sock = response.fp self.assertFalse(sock.closed) @@ -158,7 +160,7 @@ class OtherNetworkTests(unittest.TestCase): def test_urlwithfrag(self): urlwith_frag = "http://www.pythontest.net/index.html#frag" - with support.transient_internet(urlwith_frag): + with socket_helper.transient_internet(urlwith_frag): req = urllib.request.Request(urlwith_frag) res = urllib.request.urlopen(req) self.assertEqual(res.geturl(), @@ -166,7 +168,7 @@ class OtherNetworkTests(unittest.TestCase): def test_redirect_url_withfrag(self): redirect_url_with_frag = "http://www.pythontest.net/redir/with_frag/" - with support.transient_internet(redirect_url_with_frag): + with socket_helper.transient_internet(redirect_url_with_frag): req = urllib.request.Request(redirect_url_with_frag) res = urllib.request.urlopen(req) self.assertEqual(res.geturl(), @@ -174,7 +176,7 @@ class OtherNetworkTests(unittest.TestCase): def test_custom_headers(self): url = support.TEST_HTTP_URL - with support.transient_internet(url): + with socket_helper.transient_internet(url): opener = urllib.request.build_opener() request = urllib.request.Request(url) self.assertFalse(request.header_items()) @@ -192,11 +194,11 @@ class OtherNetworkTests(unittest.TestCase): URL = 'http://www.imdb.com' # mangles Connection:close - with support.transient_internet(URL): + with socket_helper.transient_internet(URL): try: with urllib.request.urlopen(URL) as res: pass - except ValueError as e: + except ValueError: self.fail("urlopen failed for site not sending \ Connection:close") else: @@ -222,9 +224,9 @@ class OtherNetworkTests(unittest.TestCase): else: req = expected_err = None - with support.transient_internet(url): + with socket_helper.transient_internet(url): try: - f = urlopen(url, req, TIMEOUT) + f = urlopen(url, req, support.INTERNET_TIMEOUT) # urllib.error.URLError is a subclass of OSError except OSError as err: if expected_err: @@ -257,10 +259,14 @@ class OtherNetworkTests(unittest.TestCase): class TimeoutTest(unittest.TestCase): + def setUp(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + def test_http_basic(self): self.assertIsNone(socket.getdefaulttimeout()) url = support.TEST_HTTP_URL - with support.transient_internet(url, timeout=None): + with socket_helper.transient_internet(url, timeout=None): u = _urlopen_with_retry(url) self.addCleanup(u.close) self.assertIsNone(u.fp.raw._sock.gettimeout()) @@ -268,7 +274,7 @@ class TimeoutTest(unittest.TestCase): def test_http_default_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) url = support.TEST_HTTP_URL - with support.transient_internet(url): + with socket_helper.transient_internet(url): socket.setdefaulttimeout(60) try: u = _urlopen_with_retry(url) @@ -280,7 +286,7 @@ class TimeoutTest(unittest.TestCase): def test_http_no_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) url = support.TEST_HTTP_URL - with support.transient_internet(url): + with socket_helper.transient_internet(url): socket.setdefaulttimeout(60) try: u = _urlopen_with_retry(url, timeout=None) @@ -291,7 +297,7 @@ class TimeoutTest(unittest.TestCase): def test_http_timeout(self): url = support.TEST_HTTP_URL - with support.transient_internet(url): + with socket_helper.transient_internet(url): u = _urlopen_with_retry(url, timeout=120) self.addCleanup(u.close) self.assertEqual(u.fp.raw._sock.gettimeout(), 120) @@ -301,7 +307,7 @@ class TimeoutTest(unittest.TestCase): @skip_ftp_test_on_travis def test_ftp_basic(self): self.assertIsNone(socket.getdefaulttimeout()) - with support.transient_internet(self.FTP_HOST, timeout=None): + with socket_helper.transient_internet(self.FTP_HOST, timeout=None): u = _urlopen_with_retry(self.FTP_HOST) self.addCleanup(u.close) self.assertIsNone(u.fp.fp.raw._sock.gettimeout()) @@ -309,7 +315,7 @@ class TimeoutTest(unittest.TestCase): @skip_ftp_test_on_travis def test_ftp_default_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) - with support.transient_internet(self.FTP_HOST): + with socket_helper.transient_internet(self.FTP_HOST): socket.setdefaulttimeout(60) try: u = _urlopen_with_retry(self.FTP_HOST) @@ -321,7 +327,7 @@ class TimeoutTest(unittest.TestCase): @skip_ftp_test_on_travis def test_ftp_no_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) - with support.transient_internet(self.FTP_HOST): + with socket_helper.transient_internet(self.FTP_HOST): socket.setdefaulttimeout(60) try: u = _urlopen_with_retry(self.FTP_HOST, timeout=None) @@ -332,7 +338,7 @@ class TimeoutTest(unittest.TestCase): @skip_ftp_test_on_travis def test_ftp_timeout(self): - with support.transient_internet(self.FTP_HOST): + with socket_helper.transient_internet(self.FTP_HOST): u = _urlopen_with_retry(self.FTP_HOST, timeout=60) self.addCleanup(u.close) self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60) diff --git a/Lib/test/test_urllib_response.py b/Lib/test/test_urllib_response.py index 0eb59426..73d2ef04 100644 --- a/Lib/test/test_urllib_response.py +++ b/Lib/test/test_urllib_response.py @@ -42,6 +42,7 @@ class TestResponse(unittest.TestCase): def test_addinfo(self): info = urllib.response.addinfo(self.fp, self.test_headers) self.assertEqual(info.info(), self.test_headers) + self.assertEqual(info.headers, self.test_headers) def test_addinfourl(self): url = "http://www.python.org" @@ -51,6 +52,9 @@ class TestResponse(unittest.TestCase): self.assertEqual(infourl.info(), self.test_headers) self.assertEqual(infourl.geturl(), url) self.assertEqual(infourl.getcode(), code) + self.assertEqual(infourl.headers, self.test_headers) + self.assertEqual(infourl.url, url) + self.assertEqual(infourl.status, code) def tearDown(self): self.sock.close() diff --git a/Lib/test/test_urllibnet.py b/Lib/test/test_urllibnet.py index d394cedd..28680aa6 100644 --- a/Lib/test/test_urllibnet.py +++ b/Lib/test/test_urllibnet.py @@ -1,5 +1,6 @@ import unittest from test import support +from test.support import socket_helper import contextlib import socket @@ -16,17 +17,18 @@ support.requires('network') class URLTimeoutTest(unittest.TestCase): # XXX this test doesn't seem to test anything useful. - TIMEOUT = 30.0 - def setUp(self): - socket.setdefaulttimeout(self.TIMEOUT) + socket.setdefaulttimeout(support.INTERNET_TIMEOUT) def tearDown(self): socket.setdefaulttimeout(None) def testURLread(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + domain = urllib.parse.urlparse(support.TEST_HTTP_URL).netloc - with support.transient_internet(domain): + with socket_helper.transient_internet(domain): f = urllib.request.urlopen(support.TEST_HTTP_URL) f.read() @@ -48,10 +50,14 @@ class urlopenNetworkTests(unittest.TestCase): url = 'http://www.pythontest.net/' + def setUp(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + @contextlib.contextmanager def urlopen(self, *args, **kwargs): resource = args[0] - with support.transient_internet(resource): + with socket_helper.transient_internet(resource): r = urllib.request.urlopen(*args, **kwargs) try: yield r @@ -93,7 +99,7 @@ class urlopenNetworkTests(unittest.TestCase): def test_getcode(self): # test getcode() with the fancy opener to get 404 error codes URL = self.url + "XXXinvalidXXX" - with support.transient_internet(URL): + with socket_helper.transient_internet(URL): with self.assertWarns(DeprecationWarning): open_url = urllib.request.FancyURLopener().open(URL) try: @@ -144,10 +150,14 @@ class urlopenNetworkTests(unittest.TestCase): class urlretrieveNetworkTests(unittest.TestCase): """Tests urllib.request.urlretrieve using the network.""" + def setUp(self): + # remove temporary files created by urlretrieve() + self.addCleanup(urllib.request.urlcleanup) + @contextlib.contextmanager def urlretrieve(self, *args, **kwargs): resource = args[0] - with support.transient_internet(resource): + with socket_helper.transient_internet(resource): file_location, info = urllib.request.urlretrieve(*args, **kwargs) try: yield file_location, info diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 4ae6ed33..76250078 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -709,15 +709,17 @@ class UrlParseTestCase(unittest.TestCase): def test_portseparator(self): # Issue 754016 makes changes for port separator ':' from scheme separator - self.assertEqual(urllib.parse.urlparse("path:80"), - ('','','path:80','','','')) + self.assertEqual(urllib.parse.urlparse("http:80"), ('http','','80','','','')) + self.assertEqual(urllib.parse.urlparse("https:80"), ('https','','80','','','')) + self.assertEqual(urllib.parse.urlparse("path:80"), ('path','','80','','','')) self.assertEqual(urllib.parse.urlparse("http:"),('http','','','','','')) self.assertEqual(urllib.parse.urlparse("https:"),('https','','','','','')) self.assertEqual(urllib.parse.urlparse("http://www.python.org:80"), ('http','www.python.org:80','','','','')) # As usual, need to check bytes input as well - self.assertEqual(urllib.parse.urlparse(b"path:80"), - (b'',b'',b'path:80',b'',b'',b'')) + self.assertEqual(urllib.parse.urlparse(b"http:80"), (b'http',b'',b'80',b'',b'',b'')) + self.assertEqual(urllib.parse.urlparse(b"https:80"), (b'https',b'',b'80',b'',b'',b'')) + self.assertEqual(urllib.parse.urlparse(b"path:80"), (b'path',b'',b'80',b'',b'',b'')) self.assertEqual(urllib.parse.urlparse(b"http:"),(b'http',b'',b'',b'',b'',b'')) self.assertEqual(urllib.parse.urlparse(b"https:"),(b'https',b'',b'',b'',b'',b'')) self.assertEqual(urllib.parse.urlparse(b"http://www.python.org:80"), diff --git a/Lib/test/test_userdict.py b/Lib/test/test_userdict.py index 662c7f64..483910aa 100644 --- a/Lib/test/test_userdict.py +++ b/Lib/test/test_userdict.py @@ -30,8 +30,8 @@ class UserDictTest(mapping_tests.TestHashMappingProtocol): self.assertEqual(collections.UserDict(one=1, two=2), d2) # item sequence constructor self.assertEqual(collections.UserDict([('one',1), ('two',2)]), d2) - with self.assertWarnsRegex(DeprecationWarning, "'dict'"): - self.assertEqual(collections.UserDict(dict=[('one',1), ('two',2)]), d2) + self.assertEqual(collections.UserDict(dict=[('one',1), ('two',2)]), + {'dict': [('one', 1), ('two', 2)]}) # both together self.assertEqual(collections.UserDict([('one',1), ('two',2)], two=3, three=5), d3) @@ -149,9 +149,8 @@ class UserDictTest(mapping_tests.TestHashMappingProtocol): [('dict', 42)]) self.assertEqual(list(collections.UserDict({}, dict=None).items()), [('dict', None)]) - with self.assertWarnsRegex(DeprecationWarning, "'dict'"): - self.assertEqual(list(collections.UserDict(dict={'a': 42}).items()), - [('a', 42)]) + self.assertEqual(list(collections.UserDict(dict={'a': 42}).items()), + [('dict', {'a': 42})]) self.assertRaises(TypeError, collections.UserDict, 42) self.assertRaises(TypeError, collections.UserDict, (), ()) self.assertRaises(TypeError, collections.UserDict.__init__) diff --git a/Lib/test/test_uu.py b/Lib/test/test_uu.py index c8709f7a..4c639b7b 100644 --- a/Lib/test/test_uu.py +++ b/Lib/test/test_uu.py @@ -174,8 +174,8 @@ class UUStdIOTest(unittest.TestCase): class UUFileTest(unittest.TestCase): def setUp(self): - self.tmpin = support.TESTFN + "i" - self.tmpout = support.TESTFN + "o" + self.tmpin = support.TESTFN_ASCII + "i" + self.tmpout = support.TESTFN_ASCII + "o" self.addCleanup(support.unlink, self.tmpin) self.addCleanup(support.unlink, self.tmpout) diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py index 92642d23..b1c92427 100644 --- a/Lib/test/test_uuid.py +++ b/Lib/test/test_uuid.py @@ -1,4 +1,4 @@ -import unittest.mock +import unittest from test import support import builtins import contextlib @@ -6,8 +6,6 @@ import copy import io import os import pickle -import shutil -import subprocess import sys import weakref from unittest import mock @@ -15,7 +13,6 @@ from unittest import mock py_uuid = support.import_fresh_module('uuid', blocked=['_uuid']) c_uuid = support.import_fresh_module('uuid', fresh=['_uuid']) - def importable(name): try: __import__(name) @@ -24,6 +21,12 @@ def importable(name): return False +def mock_get_command_stdout(data): + def get_command_stdout(command, args): + return io.BytesIO(data.encode()) + return get_command_stdout + + class BaseTestUUID: uuid = None @@ -459,7 +462,7 @@ class BaseTestUUID: # uuid.getnode to fall back on uuid._random_getnode, which will # generate a valid value. too_large_getter = lambda: 1 << 48 - with unittest.mock.patch.multiple( + with mock.patch.multiple( self.uuid, _node=None, # Ignore any cached node value. _GETTERS=[too_large_getter], @@ -472,7 +475,7 @@ class BaseTestUUID: # the value from too_large_getter above. try: self.uuid.uuid1(node=node) - except ValueError as e: + except ValueError: self.fail('uuid1 was given an invalid node ID') def test_uuid1(self): @@ -538,8 +541,8 @@ class BaseTestUUID: f = self.uuid._generate_time_safe if f is None: self.skipTest('need uuid._generate_time_safe') - with unittest.mock.patch.object(self.uuid, '_generate_time_safe', - lambda: (f()[0], safe_value)): + with mock.patch.object(self.uuid, '_generate_time_safe', + lambda: (f()[0], safe_value)): yield @unittest.skipUnless(os.name == 'posix', 'POSIX-only test') @@ -652,7 +655,7 @@ class BaseTestUUID: os.close(fds[1]) self.addCleanup(os.close, fds[0]) parent_value = self.uuid.uuid4().hex - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) child_value = os.read(fds[0], 100).decode('latin-1') self.assertNotEqual(parent_value, child_value) @@ -674,27 +677,139 @@ class TestUUIDWithExtModule(BaseTestUUID, unittest.TestCase): class BaseTestInternals: _uuid = py_uuid - @unittest.skipUnless(os.name == 'posix', 'requires Posix') - def test_find_mac(self): + def check_parse_mac(self, aix): + if not aix: + patch = mock.patch.multiple(self.uuid, + _MAC_DELIM=b':', + _MAC_OMITS_LEADING_ZEROES=False) + else: + patch = mock.patch.multiple(self.uuid, + _MAC_DELIM=b'.', + _MAC_OMITS_LEADING_ZEROES=True) + + with patch: + # Valid MAC addresses + if not aix: + tests = ( + (b'52:54:00:9d:0e:67', 0x5254009d0e67), + (b'12:34:56:78:90:ab', 0x1234567890ab), + ) + else: + # AIX format + tests = ( + (b'fe.ad.c.1.23.4', 0xfead0c012304), + ) + for mac, expected in tests: + self.assertEqual(self.uuid._parse_mac(mac), expected) + + # Invalid MAC addresses + for mac in ( + b'', + # IPv6 addresses with same length than valid MAC address + # (17 characters) + b'fe80::5054:ff:fe9', + b'123:2:3:4:5:6:7:8', + # empty 5rd field + b'52:54:00:9d::67', + # only 5 fields instead of 6 + b'52:54:00:9d:0e' + # invalid character 'x' + b'52:54:00:9d:0e:6x' + # dash separator + b'52-54-00-9d-0e-67', + ): + if aix: + mac = mac.replace(b':', b'.') + with self.subTest(mac=mac): + self.assertIsNone(self.uuid._parse_mac(mac)) + + def test_parse_mac(self): + self.check_parse_mac(False) + + def test_parse_mac_aix(self): + self.check_parse_mac(True) + + def test_find_under_heading(self): + data = '''\ +Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll +en0 1500 link#2 fe.ad.c.1.23.4 1714807956 0 711348489 0 0 + 01:00:5e:00:00:01 +en0 1500 192.168.129 x071 1714807956 0 711348489 0 0 + 224.0.0.1 +en0 1500 192.168.90 x071 1714807956 0 711348489 0 0 + 224.0.0.1 +''' + + # The above data is from AIX - with '.' as _MAC_DELIM and strings + # shorter than 17 bytes (no leading 0). (_MAC_OMITS_LEADING_ZEROES=True) + with mock.patch.multiple(self.uuid, + _MAC_DELIM=b'.', + _MAC_OMITS_LEADING_ZEROES=True, + _get_command_stdout=mock_get_command_stdout(data)): + mac = self.uuid._find_mac_under_heading( + command='netstat', + args='-ian', + heading=b'Address', + ) + + self.assertEqual(mac, 0xfead0c012304) + + def test_find_under_heading_ipv6(self): + # bpo-39991: IPv6 address "fe80::5054:ff:fe9" looks like a MAC address + # (same string length) but must be skipped + data = '''\ +Name Mtu Network Address Ipkts Ierrs Idrop Opkts Oerrs Coll +vtnet 1500 52:54:00:9d:0e:67 10017 0 0 8174 0 0 +vtnet - fe80::%vtnet0 fe80::5054:ff:fe9 0 - - 4 - - +vtnet - 192.168.122.0 192.168.122.45 8844 - - 8171 - - +lo0 16384 lo0 260148 0 0 260148 0 0 +lo0 - ::1/128 ::1 193 - - 193 - - + ff01::1%lo0 + ff02::2:2eb7:74fa + ff02::2:ff2e:b774 + ff02::1%lo0 + ff02::1:ff00:1%lo +lo0 - fe80::%lo0/64 fe80::1%lo0 0 - - 0 - - + ff01::1%lo0 + ff02::2:2eb7:74fa + ff02::2:ff2e:b774 + ff02::1%lo0 + ff02::1:ff00:1%lo +lo0 - 127.0.0.0/8 127.0.0.1 259955 - - 259955 - - + 224.0.0.1 +''' + + with mock.patch.multiple(self.uuid, + _MAC_DELIM=b':', + _MAC_OMITS_LEADING_ZEROES=False, + _get_command_stdout=mock_get_command_stdout(data)): + mac = self.uuid._find_mac_under_heading( + command='netstat', + args='-ian', + heading=b'Address', + ) + + self.assertEqual(mac, 0x5254009d0e67) + + def test_find_mac_near_keyword(self): + # key and value are on the same line data = ''' -fake hwaddr +fake Link encap:UNSPEC hwaddr 00-00 cscotun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 eth0 Link encap:Ethernet HWaddr 12:34:56:78:90:ab ''' - popen = unittest.mock.MagicMock() - popen.stdout = io.BytesIO(data.encode()) - - with unittest.mock.patch.object(shutil, 'which', - return_value='/sbin/ifconfig'): - with unittest.mock.patch.object(subprocess, 'Popen', - return_value=popen): - mac = self.uuid._find_mac( - command='ifconfig', - args='', - hw_identifiers=[b'hwaddr'], - get_index=lambda x: x + 1, - ) + # The above data will only be parsed properly on non-AIX unixes. + with mock.patch.multiple(self.uuid, + _MAC_DELIM=b':', + _MAC_OMITS_LEADING_ZEROES=False, + _get_command_stdout=mock_get_command_stdout(data)): + mac = self.uuid._find_mac_near_keyword( + command='ifconfig', + args='', + keywords=[b'hwaddr'], + get_word_index=lambda x: x + 1, + ) self.assertEqual(mac, 0x1234567890ab) @@ -737,17 +852,6 @@ eth0 Link encap:Ethernet HWaddr 12:34:56:78:90:ab node = self.uuid._netstat_getnode() self.check_node(node, 'netstat') - @unittest.skipUnless(os.name == 'nt', 'requires Windows') - def test_ipconfig_getnode(self): - node = self.uuid._ipconfig_getnode() - self.check_node(node, 'ipconfig') - - @unittest.skipUnless(importable('win32wnet'), 'requires win32wnet') - @unittest.skipUnless(importable('netbios'), 'requires netbios') - def test_netbios_getnode(self): - node = self.uuid._netbios_getnode() - self.check_node(node) - def test_random_getnode(self): node = self.uuid._random_getnode() # The multicast bit, i.e. the least significant bit of first octet, @@ -759,6 +863,13 @@ eth0 Link encap:Ethernet HWaddr 12:34:56:78:90:ab node2 = self.uuid._random_getnode() self.assertNotEqual(node2, node, '%012x' % node) +class TestInternalsWithoutExtModule(BaseTestInternals, unittest.TestCase): + uuid = py_uuid + +@unittest.skipUnless(c_uuid, 'requires the C _uuid module') +class TestInternalsWithExtModule(BaseTestInternals, unittest.TestCase): + uuid = c_uuid + @unittest.skipUnless(os.name == 'posix', 'requires Posix') def test_unix_getnode(self): if not importable('_uuid') and not importable('ctypes'): @@ -770,19 +881,10 @@ eth0 Link encap:Ethernet HWaddr 12:34:56:78:90:ab self.check_node(node, 'unix') @unittest.skipUnless(os.name == 'nt', 'requires Windows') - @unittest.skipUnless(importable('ctypes'), 'requires ctypes') def test_windll_getnode(self): node = self.uuid._windll_getnode() self.check_node(node) -class TestInternalsWithoutExtModule(BaseTestInternals, unittest.TestCase): - uuid = py_uuid - -@unittest.skipUnless(c_uuid, 'requires the C _uuid module') -class TestInternalsWithExtModule(BaseTestInternals, unittest.TestCase): - uuid = c_uuid - - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 28743f03..ca003d55 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -18,9 +18,9 @@ from test.support import (captured_stdout, captured_stderr, requires_zlib, can_symlink, EnvironmentVarGuard, rmtree, import_module, skip_if_broken_multiprocessing_synchronize) -import threading import unittest import venv +from unittest.mock import patch try: import ctypes @@ -80,8 +80,8 @@ class BaseTest(unittest.TestCase): def get_env_file(self, *args): return os.path.join(self.env_dir, *args) - def get_text_file_contents(self, *args): - with open(self.get_env_file(*args), 'r') as f: + def get_text_file_contents(self, *args, encoding='utf-8'): + with open(self.get_env_file(*args), 'r', encoding=encoding) as f: result = f.read() return result @@ -139,6 +139,39 @@ class BasicTest(BaseTest): self.assertEqual(context.prompt, '(My prompt) ') self.assertIn("prompt = 'My prompt'\n", data) + rmtree(self.env_dir) + builder = venv.EnvBuilder(prompt='.') + cwd = os.path.basename(os.getcwd()) + self.run_with_capture(builder.create, self.env_dir) + context = builder.ensure_directories(self.env_dir) + data = self.get_text_file_contents('pyvenv.cfg') + self.assertEqual(context.prompt, '(%s) ' % cwd) + self.assertIn("prompt = '%s'\n" % cwd, data) + + def test_upgrade_dependencies(self): + builder = venv.EnvBuilder() + bin_path = 'Scripts' if sys.platform == 'win32' else 'bin' + python_exe = 'python.exe' if sys.platform == 'win32' else 'python' + with tempfile.TemporaryDirectory() as fake_env_dir: + + def pip_cmd_checker(cmd): + self.assertEqual( + cmd, + [ + os.path.join(fake_env_dir, bin_path, python_exe), + '-m', + 'pip', + 'install', + '--upgrade', + 'pip', + 'setuptools' + ] + ) + + fake_context = builder.ensure_directories(fake_env_dir) + with patch('venv.subprocess.check_call', pip_cmd_checker): + builder.upgrade_dependencies(fake_context) + @requireVenvCreate def test_prefixes(self): """ @@ -499,7 +532,7 @@ class EnsurePipTest(BaseTest): # Issue #26610: pip/pep425tags.py requires ctypes @unittest.skipUnless(ctypes, 'pip requires ctypes') - @requires_zlib + @requires_zlib() def test_with_pip(self): self.do_test_with_pip(False) self.do_test_with_pip(True) diff --git a/Lib/test/test_wait3.py b/Lib/test/test_wait3.py index eb51b2c0..aa166baa 100644 --- a/Lib/test/test_wait3.py +++ b/Lib/test/test_wait3.py @@ -2,10 +2,12 @@ """ import os +import subprocess +import sys import time import unittest from test.fork_wait import ForkWait -from test.support import reap_children +from test import support if not hasattr(os, 'fork'): raise unittest.SkipTest("os.fork not defined") @@ -14,11 +16,11 @@ if not hasattr(os, 'wait3'): raise unittest.SkipTest("os.wait3 not defined") class Wait3Test(ForkWait): - def wait_impl(self, cpid): + def wait_impl(self, cpid, *, exitcode): # This many iterations can be required, since some previously run # tests (e.g. test_ctypes) could have spawned a lot of children # very quickly. - deadline = time.monotonic() + 10.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT while time.monotonic() <= deadline: # wait3() shouldn't hang, but some of the buildbots seem to hang # in the forking tests. This is an attempt to fix the problem. @@ -28,11 +30,27 @@ class Wait3Test(ForkWait): time.sleep(0.1) self.assertEqual(spid, cpid) - self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) + self.assertEqual(os.waitstatus_to_exitcode(status), exitcode) self.assertTrue(rusage) + def test_wait3_rusage_initialized(self): + # Ensure a successful wait3() call where no child was ready to report + # its exit status does not return uninitialized memory in the rusage + # structure. See bpo-36279. + args = [sys.executable, '-c', 'import sys; sys.stdin.read()'] + proc = subprocess.Popen(args, stdin=subprocess.PIPE) + try: + pid, status, rusage = os.wait3(os.WNOHANG) + self.assertEqual(0, pid) + self.assertEqual(0, status) + self.assertEqual(0, sum(rusage)) + finally: + proc.stdin.close() + proc.wait() + + def tearDownModule(): - reap_children() + support.reap_children() if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_wait4.py b/Lib/test/test_wait4.py index 3e6a79df..f8d5e130 100644 --- a/Lib/test/test_wait4.py +++ b/Lib/test/test_wait4.py @@ -6,21 +6,21 @@ import time import sys import unittest from test.fork_wait import ForkWait -from test.support import reap_children, get_attribute +from test import support # If either of these do not exist, skip this test. -get_attribute(os, 'fork') -get_attribute(os, 'wait4') +support.get_attribute(os, 'fork') +support.get_attribute(os, 'wait4') class Wait4Test(ForkWait): - def wait_impl(self, cpid): + def wait_impl(self, cpid, *, exitcode): option = os.WNOHANG if sys.platform.startswith('aix'): # Issue #11185: wait4 is broken on AIX and will always return 0 # with WNOHANG. option = 0 - deadline = time.monotonic() + 10.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT while time.monotonic() <= deadline: # wait4() shouldn't hang, but some of the buildbots seem to hang # in the forking tests. This is an attempt to fix the problem. @@ -29,11 +29,11 @@ class Wait4Test(ForkWait): break time.sleep(0.1) self.assertEqual(spid, cpid) - self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) + self.assertEqual(os.waitstatus_to_exitcode(status), exitcode) self.assertTrue(rusage) def tearDownModule(): - reap_children() + support.reap_children() if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 7b0d06b3..dcc0ea89 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -940,8 +940,8 @@ class PyWarningsDisplayTests(WarningsDisplayTests, unittest.TestCase): """)) def run(*args): - res = assert_python_ok(*args) - stderr = res.err.decode('ascii', 'replace') + res = assert_python_ok(*args, PYTHONIOENCODING='utf-8') + stderr = res.err.decode('utf-8', 'replace') stderr = '\n'.join(stderr.splitlines()) # normalize newlines @@ -949,27 +949,26 @@ class PyWarningsDisplayTests(WarningsDisplayTests, unittest.TestCase): return stderr # tracemalloc disabled + filename = os.path.abspath(support.TESTFN) stderr = run('-Wd', support.TESTFN) - expected = textwrap.dedent(''' - {fname}:5: ResourceWarning: unclosed file <...> + expected = textwrap.dedent(f''' + {filename}:5: ResourceWarning: unclosed file <...> f = None ResourceWarning: Enable tracemalloc to get the object allocation traceback - ''') - expected = expected.format(fname=support.TESTFN).strip() + ''').strip() self.assertEqual(stderr, expected) # tracemalloc enabled stderr = run('-Wd', '-X', 'tracemalloc=2', support.TESTFN) - expected = textwrap.dedent(''' - {fname}:5: ResourceWarning: unclosed file <...> + expected = textwrap.dedent(f''' + {filename}:5: ResourceWarning: unclosed file <...> f = None Object allocated at (most recent call last): - File "{fname}", lineno 7 + File "{filename}", lineno 7 func() - File "{fname}", lineno 3 + File "{filename}", lineno 3 f = open(__file__) - ''') - expected = expected.format(fname=support.TESTFN).strip() + ''').strip() self.assertEqual(stderr, expected) @@ -1199,7 +1198,7 @@ class EnvironmentVariableTests(BaseTest): @unittest.skipUnless(sys.getfilesystemencoding() != 'ascii', 'requires non-ascii filesystemencoding') def test_nonascii(self): - PYTHONWARNINGS="ignore:DeprecationWarning" + (support.FS_NONASCII or '') + PYTHONWARNINGS="ignore:DeprecationWarning" + support.FS_NONASCII rc, stdout, stderr = assert_python_ok("-c", "import sys; sys.stdout.write(str(sys.warnoptions))", PYTHONIOENCODING="utf-8", @@ -1228,7 +1227,6 @@ class BootstrapTest(unittest.TestCase): class FinalizationTest(unittest.TestCase): - @support.requires_type_collecting def test_finalization(self): # Issue #19421: warnings.warn() should not crash # during Python finalization @@ -1243,7 +1241,8 @@ class A: a=A() """ rc, out, err = assert_python_ok("-c", code) - self.assertEqual(err.decode(), ':7: UserWarning: test') + self.assertEqual(err.decode().rstrip(), + ':7: UserWarning: test') def test_late_resource_warning(self): # Issue #21925: Emitting a ResourceWarning late during the Python diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py index 8a42f8e4..eb231cb1 100644 --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -105,9 +105,7 @@ class WavePCM32Test(WaveTest, unittest.TestCase): frames = byteswap(frames, 4) -class MiscTestCase(audiotests.AudioMiscTests, unittest.TestCase): - module = wave - +class MiscTestCase(unittest.TestCase): def test__all__(self): blacklist = {'WAVE_FORMAT_PCM'} support.check__all__(self, wave, blacklist=blacklist) diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py index 2dbf3f45..56a42f05 100644 --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -11,7 +11,7 @@ import time import random from test import support -from test.support import script_helper +from test.support import script_helper, ALWAYS_EQ # Used in ReferencesTestCase.test_ref_created_during_del() . ref_from_del = None @@ -411,6 +411,26 @@ class ReferencesTestCase(TestBase): # can be killed in the middle of the call "blech" in p + def test_proxy_reversed(self): + class MyObj: + def __len__(self): + return 3 + def __reversed__(self): + return iter('cba') + + obj = MyObj() + self.assertEqual("".join(reversed(weakref.proxy(obj))), "cba") + + def test_proxy_hash(self): + cool_hash = 299_792_458 + + class MyObj: + def __hash__(self): + return cool_hash + + obj = MyObj() + self.assertEqual(hash(weakref.proxy(obj)), cool_hash) + def test_getweakrefcount(self): o = C() ref1 = weakref.ref(o) @@ -649,7 +669,6 @@ class ReferencesTestCase(TestBase): del c1, c2, C, D gc.collect() - @support.requires_type_collecting def test_callback_in_cycle_resurrection(self): import gc @@ -814,6 +833,10 @@ class ReferencesTestCase(TestBase): self.assertTrue(a != c) self.assertTrue(a == d) self.assertFalse(a != d) + self.assertFalse(a == x) + self.assertTrue(a != x) + self.assertTrue(a == ALWAYS_EQ) + self.assertFalse(a != ALWAYS_EQ) del x, y, z gc.collect() for r in a, b, c: @@ -1122,6 +1145,9 @@ class WeakMethodTestCase(unittest.TestCase): _ne(a, f) _ne(b, e) _ne(b, f) + # Compare with different types + _ne(a, x.some_method) + _eq(a, ALWAYS_EQ) del x, y, z gc.collect() # Dead WeakMethods compare by identity @@ -1603,6 +1629,43 @@ class MappingTestCase(TestBase): self.assertEqual(list(d.keys()), [kw]) self.assertEqual(d[kw], o) + def test_weak_valued_union_operators(self): + a = C() + b = C() + c = C() + wvd1 = weakref.WeakValueDictionary({1: a}) + wvd2 = weakref.WeakValueDictionary({1: b, 2: a}) + wvd3 = wvd1.copy() + d1 = {1: c, 3: b} + pairs = [(5, c), (6, b)] + + tmp1 = wvd1 | wvd2 # Between two WeakValueDictionaries + self.assertEqual(dict(tmp1), dict(wvd1) | dict(wvd2)) + self.assertIs(type(tmp1), weakref.WeakValueDictionary) + wvd1 |= wvd2 + self.assertEqual(wvd1, tmp1) + + tmp2 = wvd2 | d1 # Between WeakValueDictionary and mapping + self.assertEqual(dict(tmp2), dict(wvd2) | d1) + self.assertIs(type(tmp2), weakref.WeakValueDictionary) + wvd2 |= d1 + self.assertEqual(wvd2, tmp2) + + tmp3 = wvd3.copy() # Between WeakValueDictionary and iterable key, value + tmp3 |= pairs + self.assertEqual(dict(tmp3), dict(wvd3) | dict(pairs)) + self.assertIs(type(tmp3), weakref.WeakValueDictionary) + + tmp4 = d1 | wvd3 # Testing .__ror__ + self.assertEqual(dict(tmp4), d1 | dict(wvd3)) + self.assertIs(type(tmp4), weakref.WeakValueDictionary) + + del a + self.assertNotIn(2, tmp1) + self.assertNotIn(2, tmp2) + self.assertNotIn(1, tmp3) + self.assertNotIn(1, tmp4) + def test_weak_keyed_dict_update(self): self.check_update(weakref.WeakKeyDictionary, {C(): 1, C(): 2, C(): 3}) @@ -1618,6 +1681,43 @@ class MappingTestCase(TestBase): self.assertEqual(len(d), 1) self.assertEqual(list(d.keys()), [o2]) + def test_weak_keyed_union_operators(self): + o1 = C() + o2 = C() + o3 = C() + wkd1 = weakref.WeakKeyDictionary({o1: 1, o2: 2}) + wkd2 = weakref.WeakKeyDictionary({o3: 3, o1: 4}) + wkd3 = wkd1.copy() + d1 = {o2: '5', o3: '6'} + pairs = [(o2, 7), (o3, 8)] + + tmp1 = wkd1 | wkd2 # Between two WeakKeyDictionaries + self.assertEqual(dict(tmp1), dict(wkd1) | dict(wkd2)) + self.assertIs(type(tmp1), weakref.WeakKeyDictionary) + wkd1 |= wkd2 + self.assertEqual(wkd1, tmp1) + + tmp2 = wkd2 | d1 # Between WeakKeyDictionary and mapping + self.assertEqual(dict(tmp2), dict(wkd2) | d1) + self.assertIs(type(tmp2), weakref.WeakKeyDictionary) + wkd2 |= d1 + self.assertEqual(wkd2, tmp2) + + tmp3 = wkd3.copy() # Between WeakKeyDictionary and iterable key, value + tmp3 |= pairs + self.assertEqual(dict(tmp3), dict(wkd3) | dict(pairs)) + self.assertIs(type(tmp3), weakref.WeakKeyDictionary) + + tmp4 = d1 | wkd3 # Testing .__ror__ + self.assertEqual(dict(tmp4), d1 | dict(wkd3)) + self.assertIs(type(tmp4), weakref.WeakKeyDictionary) + + del o1 + self.assertNotIn(4, tmp1.values()) + self.assertNotIn(4, tmp2.values()) + self.assertNotIn(1, tmp3.values()) + self.assertNotIn(1, tmp4.values()) + def test_weak_valued_delitem(self): d = weakref.WeakValueDictionary() o1 = Object('1') @@ -1891,20 +1991,10 @@ class FinalizeTestCase(unittest.TestCase): f() self.assertEqual(res, [((1, 2), {'func': 3, 'obj': 4})]) - res = [] - with self.assertWarns(DeprecationWarning): - f = weakref.finalize(a, func=fin, arg=1) - self.assertEqual(f.peek(), (a, fin, (), {'arg': 1})) - f() - self.assertEqual(res, [((), {'arg': 1})]) - - res = [] - with self.assertWarns(DeprecationWarning): - f = weakref.finalize(obj=a, func=fin, arg=1) - self.assertEqual(f.peek(), (a, fin, (), {'arg': 1})) - f() - self.assertEqual(res, [((), {'arg': 1})]) - + with self.assertRaises(TypeError): + weakref.finalize(a, func=fin, arg=1) + with self.assertRaises(TypeError): + weakref.finalize(obj=a, func=fin, arg=1) self.assertRaises(TypeError, weakref.finalize, a) self.assertRaises(TypeError, weakref.finalize) diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py index 569facdd..49a9b5c3 100644 --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -2,6 +2,7 @@ import unittest from weakref import WeakSet import string from collections import UserString as ustr +from collections.abc import Set, MutableSet import gc import contextlib @@ -437,6 +438,10 @@ class TestWeakSet(unittest.TestCase): def test_repr(self): assert repr(self.s) == repr(self.s.data) + def test_abc(self): + self.assertIsInstance(self.s, Set) + self.assertIsInstance(self.s, MutableSet) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_winconsoleio.py b/Lib/test/test_winconsoleio.py index 9a61e488..a44f7bbd 100644 --- a/Lib/test/test_winconsoleio.py +++ b/Lib/test/test_winconsoleio.py @@ -144,6 +144,10 @@ class WindowsConsoleIOTests(unittest.TestCase): self.assertStdinRoundTrip('ϼўТλФЙ') # Combining characters self.assertStdinRoundTrip('A͏B ﬖ̳AA̝') + + # bpo-38325 + @unittest.skipIf(True, "Handling Non-BMP characters is broken") + def test_input_nonbmp(self): # Non-BMP self.assertStdinRoundTrip('\U00100000\U0010ffff\U0010fffd') @@ -163,6 +167,8 @@ class WindowsConsoleIOTests(unittest.TestCase): self.assertEqual(actual, expected, 'stdin.read({})'.format(read_count)) + # bpo-38325 + @unittest.skipIf(True, "Handling Non-BMP characters is broken") def test_partial_surrogate_reads(self): # Test that reading less than 1 full character works when stdin # contains surrogate pairs that cannot be decoded to UTF-8 without diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py index 6af45145..4bf5d39e 100644 --- a/Lib/test/test_wsgiref.py +++ b/Lib/test/test_wsgiref.py @@ -1,5 +1,6 @@ from unittest import mock from test import support +from test.support import socket_helper from test.test_httpservers import NoLogRequestHandler from unittest import TestCase from wsgiref.util import setup_testing_defaults @@ -263,7 +264,7 @@ class IntegrationTests(TestCase): class WsgiHandler(NoLogRequestHandler, WSGIRequestHandler): pass - server = make_server(support.HOST, 0, app, handler_class=WsgiHandler) + server = make_server(socket_helper.HOST, 0, app, handler_class=WsgiHandler) self.addCleanup(server.server_close) interrupted = threading.Event() diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index b2492cda..d01649d1 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -242,7 +242,6 @@ class ElementTreeTest(unittest.TestCase): check_method(element.extend) check_method(element.insert) check_method(element.remove) - check_method(element.getchildren) check_method(element.find) check_method(element.iterfind) check_method(element.findall) @@ -254,7 +253,6 @@ class ElementTreeTest(unittest.TestCase): check_method(element.items) check_method(element.iter) check_method(element.itertext) - check_method(element.getiterator) # These methods return an iterable. See bug 6472. @@ -432,13 +430,14 @@ class ElementTreeTest(unittest.TestCase): self.assertEqual(ET.tostring(elem), b'aa') + # Test preserving white space chars in attributes elem = ET.Element('test') elem.set('a', '\r') elem.set('b', '\r\n') elem.set('c', '\t\n\r ') - elem.set('d', '\n\n') + elem.set('d', '\n\n\r\r\t\t ') self.assertEqual(ET.tostring(elem), - b'') + b'') def test_makeelement(self): # Test makeelement handling. @@ -741,24 +740,20 @@ class ElementTreeTest(unittest.TestCase): ('end-ns', ''), ]) - # Element.getchildren() and ElementTree.getiterator() are deprecated. - @checkwarnings(("This method will be removed in future versions. " - "Use .+ instead.", - DeprecationWarning)) - def test_getchildren(self): - # Test Element.getchildren() + def test_children(self): + # Test Element children iteration with open(SIMPLE_XMLFILE, "rb") as f: tree = ET.parse(f) - self.assertEqual([summarize_list(elem.getchildren()) + self.assertEqual([summarize_list(elem) for elem in tree.getroot().iter()], [ ['element', 'element', 'empty-element'], [], [], [], ]) - self.assertEqual([summarize_list(elem.getchildren()) - for elem in tree.getiterator()], [ + self.assertEqual([summarize_list(elem) + for elem in tree.iter()], [ ['element', 'element', 'empty-element'], [], [], @@ -766,13 +761,13 @@ class ElementTreeTest(unittest.TestCase): ]) elem = ET.XML(SAMPLE_XML) - self.assertEqual(len(elem.getchildren()), 3) - self.assertEqual(len(elem[2].getchildren()), 1) - self.assertEqual(elem[:], elem.getchildren()) + self.assertEqual(len(list(elem)), 3) + self.assertEqual(len(list(elem[2])), 1) + self.assertEqual(elem[:], list(elem)) child1 = elem[0] child2 = elem[2] del elem[1:2] - self.assertEqual(len(elem.getchildren()), 2) + self.assertEqual(len(list(elem)), 2) self.assertEqual(child1, elem[0]) self.assertEqual(child2, elem[1]) elem[0:2] = [child2, child1] @@ -780,7 +775,7 @@ class ElementTreeTest(unittest.TestCase): self.assertEqual(child1, elem[1]) self.assertNotEqual(child1, elem[0]) elem.clear() - self.assertEqual(elem.getchildren(), []) + self.assertEqual(list(elem), []) def test_writestring(self): elem = ET.XML("text") @@ -788,6 +783,123 @@ class ElementTreeTest(unittest.TestCase): elem = ET.fromstring("text") self.assertEqual(ET.tostring(elem), b'text') + def test_indent(self): + elem = ET.XML("") + ET.indent(elem) + self.assertEqual(ET.tostring(elem), b'') + + elem = ET.XML("text") + ET.indent(elem) + self.assertEqual(ET.tostring(elem), b'\n text\n') + + elem = ET.XML(" text ") + ET.indent(elem) + self.assertEqual(ET.tostring(elem), b'\n text\n') + + elem = ET.XML("texttail") + ET.indent(elem) + self.assertEqual(ET.tostring(elem), b'\n texttail') + + elem = ET.XML("

    par

    \n

    text

    \t


    ") + ET.indent(elem) + self.assertEqual( + ET.tostring(elem), + b'\n' + b' \n' + b'

    par

    \n' + b'

    text

    \n' + b'

    \n' + b'
    \n' + b'

    \n' + b' \n' + b'' + ) + + elem = ET.XML("

    pre
    post

    text

    ") + ET.indent(elem) + self.assertEqual( + ET.tostring(elem), + b'\n' + b' \n' + b'

    pre
    post

    \n' + b'

    text

    \n' + b' \n' + b'' + ) + + def test_indent_space(self): + elem = ET.XML("

    pre
    post

    text

    ") + ET.indent(elem, space='\t') + self.assertEqual( + ET.tostring(elem), + b'\n' + b'\t\n' + b'\t\t

    pre
    post

    \n' + b'\t\t

    text

    \n' + b'\t\n' + b'' + ) + + elem = ET.XML("

    pre
    post

    text

    ") + ET.indent(elem, space='') + self.assertEqual( + ET.tostring(elem), + b'\n' + b'\n' + b'

    pre
    post

    \n' + b'

    text

    \n' + b'\n' + b'' + ) + + def test_indent_space_caching(self): + elem = ET.XML("

    par

    text


    ") + ET.indent(elem) + self.assertEqual( + {el.tail for el in elem.iter()}, + {None, "\n", "\n ", "\n "} + ) + self.assertEqual( + {el.text for el in elem.iter()}, + {None, "\n ", "\n ", "\n ", "par", "text"} + ) + self.assertEqual( + len({el.tail for el in elem.iter()}), + len({id(el.tail) for el in elem.iter()}), + ) + + def test_indent_level(self): + elem = ET.XML("

    pre
    post

    text

    ") + with self.assertRaises(ValueError): + ET.indent(elem, level=-1) + self.assertEqual( + ET.tostring(elem), + b"

    pre
    post

    text

    " + ) + + ET.indent(elem, level=2) + self.assertEqual( + ET.tostring(elem), + b'\n' + b' \n' + b'

    pre
    post

    \n' + b'

    text

    \n' + b' \n' + b' ' + ) + + elem = ET.XML("

    pre
    post

    text

    ") + ET.indent(elem, level=1, space=' ') + self.assertEqual( + ET.tostring(elem), + b'\n' + b' \n' + b'

    pre
    post

    \n' + b'

    text

    \n' + b' \n' + b' ' + ) + def test_tostring_default_namespace(self): elem = ET.XML('') self.assertEqual( @@ -1557,6 +1669,17 @@ XINCLUDE["default.xml"] = """\ """.format(html.escape(SIMPLE_XMLFILE, True)) +XINCLUDE["include_c1_repeated.xml"] = """\ + + +

    The following is the source code of Recursive1.xml:

    + + + + +
    +""" + # # badly formatted xi:include tags @@ -1577,6 +1700,31 @@ XINCLUDE_BAD["B2.xml"] = """\ """ +XINCLUDE["Recursive1.xml"] = """\ + + +

    The following is the source code of Recursive2.xml:

    + +
    +""" + +XINCLUDE["Recursive2.xml"] = """\ + + +

    The following is the source code of Recursive3.xml:

    + +
    +""" + +XINCLUDE["Recursive3.xml"] = """\ + + +

    The following is the source code of Recursive1.xml:

    + +
    +""" + + class XIncludeTest(unittest.TestCase): def xinclude_loader(self, href, parse="xml", encoding=None): @@ -1678,6 +1826,13 @@ class XIncludeTest(unittest.TestCase): ' \n' '') # C5 + def test_xinclude_repeated(self): + from xml.etree import ElementInclude + + document = self.xinclude_loader("include_c1_repeated.xml") + ElementInclude.include(document, self.xinclude_loader) + self.assertEqual(1+4*2, len(document.findall(".//p"))) + def test_xinclude_failures(self): from xml.etree import ElementInclude @@ -1710,6 +1865,45 @@ class XIncludeTest(unittest.TestCase): "xi:fallback tag must be child of xi:include " "('{http://www.w3.org/2001/XInclude}fallback')") + # Test infinitely recursive includes. + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.FatalIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader) + self.assertEqual(str(cm.exception), + "recursive include of Recursive2.xml") + + # Test 'max_depth' limitation. + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.FatalIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=None) + self.assertEqual(str(cm.exception), + "recursive include of Recursive2.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.LimitedRecursiveIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=0) + self.assertEqual(str(cm.exception), + "maximum xinclude depth reached when including file Recursive2.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.LimitedRecursiveIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=1) + self.assertEqual(str(cm.exception), + "maximum xinclude depth reached when including file Recursive3.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.LimitedRecursiveIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=2) + self.assertEqual(str(cm.exception), + "maximum xinclude depth reached when including file Recursive1.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.FatalIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=3) + self.assertEqual(str(cm.exception), + "recursive include of Recursive2.xml") + + # -------------------------------------------------------------------- # reported bugs @@ -2066,6 +2260,10 @@ class BugsTest(unittest.TestCase): text = text[6:-4] self.assertEqual(root.get('b'), text) + def test_39495_treebuilder_start(self): + self.assertRaises(TypeError, ET.TreeBuilder().start, "tag") + self.assertRaises(TypeError, ET.TreeBuilder().start, "tag", None) + # -------------------------------------------------------------------- @@ -2100,6 +2298,35 @@ class BasicElementTest(ElementTestCase, unittest.TestCase): self.assertIsNot(element_foo.attrib, attrib) self.assertNotEqual(element_foo.attrib, attrib) + def test_copy(self): + # Only run this test if Element.copy() is defined. + if "copy" not in dir(ET.Element): + raise unittest.SkipTest("Element.copy() not present") + + element_foo = ET.Element("foo", { "zix": "wyp" }) + element_foo.append(ET.Element("bar", { "baz": "qix" })) + + with self.assertWarns(DeprecationWarning): + element_foo2 = element_foo.copy() + + # elements are not the same + self.assertIsNot(element_foo2, element_foo) + + # string attributes are equal + self.assertEqual(element_foo2.tag, element_foo.tag) + self.assertEqual(element_foo2.text, element_foo.text) + self.assertEqual(element_foo2.tail, element_foo.tail) + + # number of children is the same + self.assertEqual(len(element_foo2), len(element_foo)) + + # children are the same + for (child1, child2) in itertools.zip_longest(element_foo, element_foo2): + self.assertIs(child1, child2) + + # attrib is a copy + self.assertEqual(element_foo2.attrib, element_foo.attrib) + def test___copy__(self): element_foo = ET.Element("foo", { "zix": "wyp" }) element_foo.append(ET.Element("bar", { "baz": "qix" })) @@ -2838,40 +3065,6 @@ class ElementIterTest(unittest.TestCase): self.assertEqual(self._ilist(doc), all_tags) self.assertEqual(self._ilist(doc, '*'), all_tags) - # Element.getiterator() is deprecated. - @checkwarnings(("This method will be removed in future versions. " - "Use .+ instead.", DeprecationWarning)) - def test_getiterator(self): - doc = ET.XML(''' - - - bedroom1 - bedroom2 - - nothing here - - - bedroom8 - - ''') - - self.assertEqual(summarize_list(doc.getiterator('room')), - ['room'] * 3) - self.assertEqual(summarize_list(doc.getiterator('house')), - ['house'] * 2) - - # test that getiterator also accepts 'tag' as a keyword arg - self.assertEqual( - summarize_list(doc.getiterator(tag='room')), - ['room'] * 3) - - # make sure both tag=None and tag='*' return all tags - all_tags = ['document', 'house', 'room', 'room', - 'shed', 'house', 'room'] - self.assertEqual(summarize_list(doc.getiterator()), all_tags) - self.assertEqual(summarize_list(doc.getiterator(None)), all_tags) - self.assertEqual(summarize_list(doc.getiterator('*')), all_tags) - def test_copy(self): a = ET.Element('a') it = a.iter() diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 52bacc1e..f68af527 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -15,6 +15,8 @@ import re import io import contextlib from test import support +from test.support import socket_helper +from test.support import ALWAYS_EQ, LARGEST, SMALLEST try: import gzip @@ -333,7 +335,7 @@ class XMLRPCTestCase(unittest.TestCase): server.handle_request() # First request and attempt at second server.handle_request() # Retried second request - server = http.server.HTTPServer((support.HOST, 0), RequestHandler) + server = http.server.HTTPServer((socket_helper.HOST, 0), RequestHandler) self.addCleanup(server.server_close) thread = threading.Thread(target=run_server) thread.start() @@ -530,14 +532,10 @@ class DateTimeTestCase(unittest.TestCase): # some other types dbytes = dstr.encode('ascii') dtuple = now.timetuple() - with self.assertRaises(TypeError): - dtime == 1970 - with self.assertRaises(TypeError): - dtime != dbytes - with self.assertRaises(TypeError): - dtime == bytearray(dbytes) - with self.assertRaises(TypeError): - dtime != dtuple + self.assertFalse(dtime == 1970) + self.assertTrue(dtime != dbytes) + self.assertFalse(dtime == bytearray(dbytes)) + self.assertTrue(dtime != dtuple) with self.assertRaises(TypeError): dtime < float(1970) with self.assertRaises(TypeError): @@ -547,6 +545,18 @@ class DateTimeTestCase(unittest.TestCase): with self.assertRaises(TypeError): dtime >= dtuple + self.assertTrue(dtime == ALWAYS_EQ) + self.assertFalse(dtime != ALWAYS_EQ) + self.assertTrue(dtime < LARGEST) + self.assertFalse(dtime > LARGEST) + self.assertTrue(dtime <= LARGEST) + self.assertFalse(dtime >= LARGEST) + self.assertFalse(dtime < SMALLEST) + self.assertTrue(dtime > SMALLEST) + self.assertFalse(dtime <= SMALLEST) + self.assertTrue(dtime >= SMALLEST) + + class BinaryTestCase(unittest.TestCase): # XXX What should str(Binary(b"\xff")) return? I'm chosing "\xff" diff --git a/Lib/test/test_zipapp.py b/Lib/test/test_zipapp.py index 73bddc79..69f2e55d 100644 --- a/Lib/test/test_zipapp.py +++ b/Lib/test/test_zipapp.py @@ -101,7 +101,7 @@ class ZipAppTest(unittest.TestCase): expected_target = self.tmpdir / 'source.pyz' self.assertTrue(expected_target.is_file()) - @requires_zlib + @requires_zlib() def test_create_archive_with_compression(self): # Test packing a directory into a compressed archive. source = self.tmpdir / 'source' diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index e2e37a17..b7bc218d 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -16,7 +16,7 @@ import zipfile from tempfile import TemporaryFile -from random import randint, random, getrandbits +from random import randint, random, randbytes from test.support import script_helper from test.support import (TESTFN, findfile, unlink, rmtree, temp_dir, temp_cwd, @@ -33,9 +33,6 @@ SMALL_TEST_DATA = [('_ziptest1', '1q2w3e4r5t'), ('ziptest2dir/ziptest3dir/_ziptest3', 'azsxdcfvgb'), ('ziptest2dir/ziptest3dir/ziptest4dir/_ziptest3', '6y7u8i9o0p')] -def getrandbytes(size): - return getrandbits(8 * size).to_bytes(size, 'little') - def get_files(test): yield TESTFN2 with TemporaryFile() as f: @@ -324,7 +321,7 @@ class AbstractTestsWithSourceFile: # than requested. for test_size in (1, 4095, 4096, 4097, 16384): file_size = test_size + 1 - junk = getrandbytes(file_size) + junk = randbytes(file_size) with zipfile.ZipFile(io.BytesIO(), "w", self.compression) as zipf: zipf.writestr('foo', junk) with zipf.open('foo', 'r') as fp: @@ -572,6 +569,20 @@ class StoredTestsWithSourceFile(AbstractTestsWithSourceFile, with open(TESTFN, "rb") as f: self.assertEqual(zipfp.read(TESTFN), f.read()) + def test_io_on_closed_zipextfile(self): + fname = "somefile.txt" + with zipfile.ZipFile(TESTFN2, mode="w") as zipfp: + zipfp.writestr(fname, "bogus") + + with zipfile.ZipFile(TESTFN2, mode="r") as zipfp: + with zipfp.open(fname) as fid: + fid.close() + self.assertRaises(ValueError, fid.read) + self.assertRaises(ValueError, fid.seek, 0) + self.assertRaises(ValueError, fid.tell) + self.assertRaises(ValueError, fid.readable) + self.assertRaises(ValueError, fid.seekable) + def test_write_to_readonly(self): """Check that trying to call write() on a readonly ZipFile object raises a ValueError.""" @@ -629,7 +640,7 @@ class StoredTestsWithSourceFile(AbstractTestsWithSourceFile, self.assertEqual(zinfo.date_time, (2107, 12, 31, 23, 59, 59)) -@requires_zlib +@requires_zlib() class DeflateTestsWithSourceFile(AbstractTestsWithSourceFile, unittest.TestCase): compression = zipfile.ZIP_DEFLATED @@ -645,12 +656,12 @@ class DeflateTestsWithSourceFile(AbstractTestsWithSourceFile, self.assertEqual(sinfo.compress_type, zipfile.ZIP_STORED) self.assertEqual(dinfo.compress_type, zipfile.ZIP_DEFLATED) -@requires_bz2 +@requires_bz2() class Bzip2TestsWithSourceFile(AbstractTestsWithSourceFile, unittest.TestCase): compression = zipfile.ZIP_BZIP2 -@requires_lzma +@requires_lzma() class LzmaTestsWithSourceFile(AbstractTestsWithSourceFile, unittest.TestCase): compression = zipfile.ZIP_LZMA @@ -1064,17 +1075,17 @@ class StoredTestZip64InSmallFiles(AbstractTestZip64InSmallFiles, self.assertEqual(zf.read(zinfo), expected_content) -@requires_zlib +@requires_zlib() class DeflateTestZip64InSmallFiles(AbstractTestZip64InSmallFiles, unittest.TestCase): compression = zipfile.ZIP_DEFLATED -@requires_bz2 +@requires_bz2() class Bzip2TestZip64InSmallFiles(AbstractTestZip64InSmallFiles, unittest.TestCase): compression = zipfile.ZIP_BZIP2 -@requires_lzma +@requires_lzma() class LzmaTestZip64InSmallFiles(AbstractTestZip64InSmallFiles, unittest.TestCase): compression = zipfile.ZIP_LZMA @@ -1109,15 +1120,15 @@ class AbstractWriterTests: class StoredWriterTests(AbstractWriterTests, unittest.TestCase): compression = zipfile.ZIP_STORED -@requires_zlib +@requires_zlib() class DeflateWriterTests(AbstractWriterTests, unittest.TestCase): compression = zipfile.ZIP_DEFLATED -@requires_bz2 +@requires_bz2() class Bzip2WriterTests(AbstractWriterTests, unittest.TestCase): compression = zipfile.ZIP_BZIP2 -@requires_lzma +@requires_lzma() class LzmaWriterTests(AbstractWriterTests, unittest.TestCase): compression = zipfile.ZIP_LZMA @@ -1571,7 +1582,7 @@ class OtherTests(unittest.TestCase): self.assertRaises(NotImplementedError, zipfile.ZipFile, io.BytesIO(data), 'r') - @requires_zlib + @requires_zlib() def test_read_unicode_filenames(self): # bug #10801 fname = findfile('zip_cp437_header.zip') @@ -1903,6 +1914,33 @@ class OtherTests(unittest.TestCase): self.assertRaises(ValueError, zipfile.ZipInfo, 'seventies', (1979, 1, 1, 0, 0, 0)) + def test_create_empty_zipinfo_repr(self): + """Before bpo-26185, repr() on empty ZipInfo object was failing.""" + zi = zipfile.ZipInfo(filename="empty") + self.assertEqual(repr(zi), "") + + def test_create_empty_zipinfo_default_attributes(self): + """Ensure all required attributes are set.""" + zi = zipfile.ZipInfo() + self.assertEqual(zi.orig_filename, "NoName") + self.assertEqual(zi.filename, "NoName") + self.assertEqual(zi.date_time, (1980, 1, 1, 0, 0, 0)) + self.assertEqual(zi.compress_type, zipfile.ZIP_STORED) + self.assertEqual(zi.comment, b"") + self.assertEqual(zi.extra, b"") + self.assertIn(zi.create_system, (0, 3)) + self.assertEqual(zi.create_version, zipfile.DEFAULT_VERSION) + self.assertEqual(zi.extract_version, zipfile.DEFAULT_VERSION) + self.assertEqual(zi.reserved, 0) + self.assertEqual(zi.flag_bits, 0) + self.assertEqual(zi.volume, 0) + self.assertEqual(zi.internal_attr, 0) + self.assertEqual(zi.external_attr, 0) + + # Before bpo-26185, both were missing + self.assertEqual(zi.file_size, 0) + self.assertEqual(zi.compress_size, 0) + def test_zipfile_with_short_extra_field(self): """If an extra field in the header is less than 4 bytes, skip it.""" zipdata = ( @@ -1985,7 +2023,7 @@ class OtherTests(unittest.TestCase): fp.seek(0, os.SEEK_SET) self.assertEqual(fp.tell(), 0) - @requires_bz2 + @requires_bz2() def test_decompress_without_3rd_party_library(self): data = b'PK\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' zip_file = io.BytesIO(data) @@ -2043,7 +2081,7 @@ class StoredBadCrcTests(AbstractBadCrcTests, unittest.TestCase): b'lePK\005\006\0\0\0\0\001\0\001\0003\000' b'\0\0/\0\0\0\0\0') -@requires_zlib +@requires_zlib() class DeflateBadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_DEFLATED zip_with_bad_crc = ( @@ -2056,7 +2094,7 @@ class DeflateBadCrcTests(AbstractBadCrcTests, unittest.TestCase): b'\x00afilePK\x05\x06\x00\x00\x00\x00\x01\x00' b'\x01\x003\x00\x00\x003\x00\x00\x00\x00\x00') -@requires_bz2 +@requires_bz2() class Bzip2BadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_BZIP2 zip_with_bad_crc = ( @@ -2072,7 +2110,7 @@ class Bzip2BadCrcTests(AbstractBadCrcTests, unittest.TestCase): b'\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00\x00[\x00' b'\x00\x00\x00\x00') -@requires_lzma +@requires_lzma() class LzmaBadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_LZMA zip_with_bad_crc = ( @@ -2139,7 +2177,7 @@ class DecryptionTests(unittest.TestCase): self.zip2.setpassword(b"perl") self.assertRaises(RuntimeError, self.zip2.read, "zero") - @requires_zlib + @requires_zlib() def test_good_password(self): self.zip.setpassword(b"python") self.assertEqual(self.zip.read("test.txt"), self.plain) @@ -2285,17 +2323,17 @@ class StoredTestsWithRandomBinaryFiles(AbstractTestsWithRandomBinaryFiles, unittest.TestCase): compression = zipfile.ZIP_STORED -@requires_zlib +@requires_zlib() class DeflateTestsWithRandomBinaryFiles(AbstractTestsWithRandomBinaryFiles, unittest.TestCase): compression = zipfile.ZIP_DEFLATED -@requires_bz2 +@requires_bz2() class Bzip2TestsWithRandomBinaryFiles(AbstractTestsWithRandomBinaryFiles, unittest.TestCase): compression = zipfile.ZIP_BZIP2 -@requires_lzma +@requires_lzma() class LzmaTestsWithRandomBinaryFiles(AbstractTestsWithRandomBinaryFiles, unittest.TestCase): compression = zipfile.ZIP_LZMA @@ -2383,12 +2421,12 @@ class UnseekableTests(unittest.TestCase): self.assertEqual(zipf.read('twos'), b'222') -@requires_zlib +@requires_zlib() class TestsWithMultipleOpens(unittest.TestCase): @classmethod def setUpClass(cls): - cls.data1 = b'111' + getrandbytes(10000) - cls.data2 = b'222' + getrandbytes(10000) + cls.data1 = b'111' + randbytes(10000) + cls.data2 = b'222' + randbytes(10000) def make_test_archive(self, f): # Create the ZIP archive @@ -2649,7 +2687,7 @@ class CommandLineTest(unittest.TestCase): PYTHONIOENCODING='ascii:backslashreplace') self.assertEqual(out, expected) - @requires_zlib + @requires_zlib() def test_create_command(self): self.addCleanup(unlink, TESTFN) with open(TESTFN, 'w') as f: @@ -2845,7 +2883,7 @@ class TestPath(unittest.TestCase): a, b, g = root.iterdir() with a.open() as strm: data = strm.read() - assert data == b"content of a" + assert data == "content of a" def test_read(self): for alpharep in self.zipfile_alpharep(): diff --git a/Lib/test/test_zipfile64.py b/Lib/test/test_zipfile64.py index 56746bc0..3a788de2 100644 --- a/Lib/test/test_zipfile64.py +++ b/Lib/test/test_zipfile64.py @@ -73,7 +73,7 @@ class TestsWithSourceFile(unittest.TestCase): self.assertFalse(f.closed) self.zipTest(TESTFN2, zipfile.ZIP_STORED) - @requires_zlib + @requires_zlib() def testDeflated(self): # Try the temp file first. If we do TESTFN2 first, then it hogs # gigabytes of disk space for the duration of the test. diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index 2af8689c..56028607 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -683,7 +683,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase): self.doTest(".py", files, TESTMOD, comment=b"c" * ((1 << 16) - 1)) -@support.requires_zlib +@support.requires_zlib() class CompressedZipImportTestCase(UncompressedZipImportTestCase): compression = ZIP_DEFLATED diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py index f828b4c7..02509cdf 100644 --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -134,8 +134,7 @@ class BaseCompressTestCase(object): # Generate 10 MiB worth of random, and expand it by repeating it. # The assumption is that zlib's memory is not big enough to exploit # such spread out redundancy. - data = b''.join([random.getrandbits(8 * _1M).to_bytes(_1M, 'little') - for i in range(10)]) + data = random.randbytes(_1M * 10) data = data * (size // len(data) + 1) try: compress_func(data) @@ -488,7 +487,7 @@ class CompressObjectTestCase(BaseCompressTestCase, unittest.TestCase): # others might simply have a single RNG gen = random gen.seed(1) - data = genblock(1, 17 * 1024, generator=gen) + data = gen.randbytes(17 * 1024) # compress, sync-flush, and decompress first = co.compress(data) @@ -825,20 +824,6 @@ class CompressObjectTestCase(BaseCompressTestCase, unittest.TestCase): self.assertEqual(dco.decompress(gzip), HAMLET_SCENE) -def genblock(seed, length, step=1024, generator=random): - """length-byte stream of random data from a seed (in step-byte blocks).""" - if seed is not None: - generator.seed(seed) - randint = generator.randint - if length < step or step < 2: - step = length - blocks = bytes() - for i in range(0, length, step): - blocks += bytes(randint(0, 255) for x in range(step)) - return blocks - - - def choose_lines(source, number, seed=None, generator=random): """Return a list of number lines randomly chosen from the source""" if seed is not None: @@ -847,7 +832,6 @@ def choose_lines(source, number, seed=None, generator=random): return [generator.choice(sources) for n in range(number)] - HAMLET_SCENE = b""" LAERTES diff --git a/Lib/test/test_zoneinfo/__init__.py b/Lib/test/test_zoneinfo/__init__.py new file mode 100644 index 00000000..98cc4412 --- /dev/null +++ b/Lib/test/test_zoneinfo/__init__.py @@ -0,0 +1 @@ +from .test_zoneinfo import * diff --git a/Lib/test/test_zoneinfo/__main__.py b/Lib/test/test_zoneinfo/__main__.py new file mode 100644 index 00000000..5cc4e055 --- /dev/null +++ b/Lib/test/test_zoneinfo/__main__.py @@ -0,0 +1,3 @@ +import unittest + +unittest.main('test.test_zoneinfo') diff --git a/Lib/test/test_zoneinfo/_support.py b/Lib/test/test_zoneinfo/_support.py new file mode 100644 index 00000000..0fe162c2 --- /dev/null +++ b/Lib/test/test_zoneinfo/_support.py @@ -0,0 +1,100 @@ +import contextlib +import functools +import sys +import threading +import unittest +from test.support import import_fresh_module + +OS_ENV_LOCK = threading.Lock() +TZPATH_LOCK = threading.Lock() +TZPATH_TEST_LOCK = threading.Lock() + + +def call_once(f): + """Decorator that ensures a function is only ever called once.""" + lock = threading.Lock() + cached = functools.lru_cache(None)(f) + + @functools.wraps(f) + def inner(): + with lock: + return cached() + + return inner + + +@call_once +def get_modules(): + """Retrieve two copies of zoneinfo: pure Python and C accelerated. + + Because this function manipulates the import system in a way that might + be fragile or do unexpected things if it is run many times, it uses a + `call_once` decorator to ensure that this is only ever called exactly + one time — in other words, when using this function you will only ever + get one copy of each module rather than a fresh import each time. + """ + import zoneinfo as c_module + + py_module = import_fresh_module("zoneinfo", blocked=["_zoneinfo"]) + + return py_module, c_module + + +@contextlib.contextmanager +def set_zoneinfo_module(module): + """Make sure sys.modules["zoneinfo"] refers to `module`. + + This is necessary because `pickle` will refuse to serialize + an type calling itself `zoneinfo.ZoneInfo` unless `zoneinfo.ZoneInfo` + refers to the same object. + """ + + NOT_PRESENT = object() + old_zoneinfo = sys.modules.get("zoneinfo", NOT_PRESENT) + sys.modules["zoneinfo"] = module + yield + if old_zoneinfo is not NOT_PRESENT: + sys.modules["zoneinfo"] = old_zoneinfo + else: # pragma: nocover + sys.modules.pop("zoneinfo") + + +class ZoneInfoTestBase(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.klass = cls.module.ZoneInfo + super().setUpClass() + + @contextlib.contextmanager + def tzpath_context(self, tzpath, block_tzdata=True, lock=TZPATH_LOCK): + def pop_tzdata_modules(): + tzdata_modules = {} + for modname in list(sys.modules): + if modname.split(".", 1)[0] != "tzdata": # pragma: nocover + continue + + tzdata_modules[modname] = sys.modules.pop(modname) + + return tzdata_modules + + with lock: + if block_tzdata: + # In order to fully exclude tzdata from the path, we need to + # clear the sys.modules cache of all its contents — setting the + # root package to None is not enough to block direct access of + # already-imported submodules (though it will prevent new + # imports of submodules). + tzdata_modules = pop_tzdata_modules() + sys.modules["tzdata"] = None + + old_path = self.module.TZPATH + try: + self.module.reset_tzpath(tzpath) + yield + finally: + if block_tzdata: + sys.modules.pop("tzdata") + for modname, module in tzdata_modules.items(): + sys.modules[modname] = module + + self.module.reset_tzpath(old_path) diff --git a/Lib/test/test_zoneinfo/data/update_test_data.py b/Lib/test/test_zoneinfo/data/update_test_data.py new file mode 100644 index 00000000..f531ab31 --- /dev/null +++ b/Lib/test/test_zoneinfo/data/update_test_data.py @@ -0,0 +1,122 @@ +""" +Script to automatically generate a JSON file containing time zone information. + +This is done to allow "pinning" a small subset of the tzdata in the tests, +since we are testing properties of a file that may be subject to change. For +example, the behavior in the far future of any given zone is likely to change, +but "does this give the right answer for this file in 2040" is still an +important property to test. + +This must be run from a computer with zoneinfo data installed. +""" +from __future__ import annotations + +import base64 +import functools +import json +import lzma +import pathlib +import textwrap +import typing + +import zoneinfo + +KEYS = [ + "Africa/Abidjan", + "Africa/Casablanca", + "America/Los_Angeles", + "America/Santiago", + "Asia/Tokyo", + "Australia/Sydney", + "Europe/Dublin", + "Europe/Lisbon", + "Europe/London", + "Pacific/Kiritimati", + "UTC", +] + +TEST_DATA_LOC = pathlib.Path(__file__).parent + + +@functools.lru_cache(maxsize=None) +def get_zoneinfo_path() -> pathlib.Path: + """Get the first zoneinfo directory on TZPATH containing the "UTC" zone.""" + key = "UTC" + for path in map(pathlib.Path, zoneinfo.TZPATH): + if (path / key).exists(): + return path + else: + raise OSError("Cannot find time zone data.") + + +def get_zoneinfo_metadata() -> typing.Dict[str, str]: + path = get_zoneinfo_path() + + tzdata_zi = path / "tzdata.zi" + if not tzdata_zi.exists(): + # tzdata.zi is necessary to get the version information + raise OSError("Time zone data does not include tzdata.zi.") + + with open(tzdata_zi, "r") as f: + version_line = next(f) + + _, version = version_line.strip().rsplit(" ", 1) + + if ( + not version[0:4].isdigit() + or len(version) < 5 + or not version[4:].isalpha() + ): + raise ValueError( + "Version string should be YYYYx, " + + "where YYYY is the year and x is a letter; " + + f"found: {version}" + ) + + return {"version": version} + + +def get_zoneinfo(key: str) -> bytes: + path = get_zoneinfo_path() + + with open(path / key, "rb") as f: + return f.read() + + +def encode_compressed(data: bytes) -> typing.List[str]: + compressed_zone = lzma.compress(data) + raw = base64.b85encode(compressed_zone) + + raw_data_str = raw.decode("utf-8") + + data_str = textwrap.wrap(raw_data_str, width=70) + return data_str + + +def load_compressed_keys() -> typing.Dict[str, typing.List[str]]: + output = {key: encode_compressed(get_zoneinfo(key)) for key in KEYS} + + return output + + +def update_test_data(fname: str = "zoneinfo_data.json") -> None: + TEST_DATA_LOC.mkdir(exist_ok=True, parents=True) + + # Annotation required: https://github.com/python/mypy/issues/8772 + json_kwargs: typing.Dict[str, typing.Any] = dict( + indent=2, sort_keys=True, + ) + + compressed_keys = load_compressed_keys() + metadata = get_zoneinfo_metadata() + output = { + "metadata": metadata, + "data": compressed_keys, + } + + with open(TEST_DATA_LOC / fname, "w") as f: + json.dump(output, f, **json_kwargs) + + +if __name__ == "__main__": + update_test_data() diff --git a/Lib/test/test_zoneinfo/data/zoneinfo_data.json b/Lib/test/test_zoneinfo/data/zoneinfo_data.json new file mode 100644 index 00000000..ec4414a0 --- /dev/null +++ b/Lib/test/test_zoneinfo/data/zoneinfo_data.json @@ -0,0 +1,190 @@ +{ + "data": { + "Africa/Abidjan": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j-~f{VGF<>F7KxBg5R*{Ksocg8-YYVul=v7vZzaHN", + "uC=da5UI2rH18c!OnjV{y4u(+A!!VBKmY&$ORw>7UO^(500B;v0RR91bXh%WvBYQl0ssI2", + "00dcD" + ], + "Africa/Casablanca": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j;0b&Kz+C_;7KxBg5R*{N&yjMUR~;C-fDaSOU;q-~", + "FqW+4{YBjbcw}`a!dW>b)R2-0a+uwf`P3{_Y@HuCz}S$J$ZJ>R_V<~|Fk>sgX4=%0vUrh-", + "lt@YP^Wrus;j?`Th#xRPzf<<~Hp4DH^gZX>d{+WOp~HNu8!{uWu}&XphAd{j1;rB4|9?R!", + "pqruAFUMt8#*WcrVS{;kLlY(cJRV$w?d2car%Rs>q9BgTU4", + "Ht-tQKZ7Z`9QqOb?R#b%z?rk>!CkH7jy3wja4NG2q)H}fNRKg8v{);Em;K3Cncf4C6&Oaj", + "V+DbX%o4+)CV3+e!Lm6dutu(0BQpH1T?W(~cQtKV*^_Pdx!LirjpTs?Bmt@vktjLq4;)O!", + "rrly=c*rwTwMJFd0I57`hgkc?=nyI4RZf9W$6DCWugmf&)wk^tWH17owj=#PGH7Xv-?9$j", + "njwDlkOE+BFNR9YXEmBpO;rqEw=e2IR-8^(W;8ma?M3JVd($2T>IW+0tk|Gm8>ftukRQ9J", + "8k3brzqMnVyjsLI-CKneFa)Lxvp_aq40f}0J3VVoWL5rox", + "`Kptivcp}o5xA^@>qNI%?zo=Yj4AMV?kbAA)j(1%)+Pp)bSn+7Yk`M{oE}L-Z!G6OMr5G+h", + "p)$3Lg{ono{4cN>Vr&>L4kXH;_VnBL5U!LgzqE%P7QQ*tue}O`3(TZ0`aKn&~8trOQ-rBXCp)f@P6RMO4l0+;b|5-pk9_ryNh}Zc*v%mvz_#", + "yd6fjB0g9{MmMnu8bG%#C~ugXK^S^k@?ab#", + "O|aE>dDTt4s4n69(~@t~!wniV%g7khFx~I*4>Y|V$4j5%KPF*-FyKIi@!Ho&", + "x8QQsksYt8)D+W)Ni!=G`ogSu^vLL-l#7A7=iIAKL2SuZk9F}NfNk86VI)9WZE?%2wC-ya", + "F~z#Qsq)LH0|_D8^5fU8X%GeQ4TB>R-dlziA&tZe&1ada208!$nk`7bOFO2S00G`Z@1A~t&lyL{p{eM{5)QGf7Mo5FW9==mlyXJt2", + "UwpntR7H0eSq!(aYq#aqUz&RM*tvuMI)AsM?K3-dV3-TT{t)!Iy#JTo=tXkzAM9~j2YbiO", + "ls3(H8Dc>Y|D1aqL51vjLbpYG;GvGTQB4bXuJ%mA;(B4eUpu$$@zv2vVcq-Y)VKbzp^tei", + "uzy}R{LuvDjpuVb`79O+CBmg{Wx!bvx$eu4zRE&", + "PehMb=&G<9$>iZ|bFE)0=4I?KLFGBC0I(0_svgw0%FiMsT%koo*!nEYc6GY@QnU}&4Isg;", + "l=|khi(!VaiSE2=Ny`&&tpi~~;{$uN}%f|7mBhAy;s3YT^sy!$eG~?`9mNJC9@4Bac_p^BZh)Yd_rWW5qh-?tKY(>5VHO", + "L*iT8P@wCavLj^yYbnDR+4ukhS+xPrpl)iqB?u)bj9a2aW==g6G3lCJd>(+Blfr)~^40F4f>cRZ^UF;RibfZ>0m73hR", + "C{$vTfC(STN`g7(B<=Z2556{}0`?p&|Akkst!4Xy4OT;A@c$XTUI3FRRjy*KA7uC56FD)z", + "^X{WV*sr(w!c$W357o!&eLO2wTDNOyw@gf(&R<t;=-Tu1TV{>%8ZVATC9tjD8|(&`$9YHvZ9bVe#>w", + "|8c;Tg|xE&)`*}LwM*E}q}q8^Qja%p`_U)*5DdLI9O@!e=3jFjOCrCq28b_bb;s>%D#iJB", + "CWJi{JH!Js;6nfayos$kq^OEX00HO-lokL0!mqm{vBYQl0ssI200dcD" + ], + "America/Santiago": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j;0fRZ<6QtM7KxBg84(fsEAUJ$J{f-TXlPEUec5Ee", + "n+hsD4lC(QYax=JdSpoyje8%VM`GW}{bJ8@y$A8O&*$pw{(f~Os#}2w", + "eX6^Rgi$IT%n^V^85L>$_c7{cB^#ogV=rHBJGiz-RQNFGK?gdPi|q)j`&8)}KJ{qo6dixa", + "9@yYyVg+%lo0nO+Tw0-w2hJ%mafyWL)|", + ")?W6Bi%FWuGPA1Dru$XR4SZANsAthU2EoKHF6oEtKq`rwP", + "(VNegnI_NI%;ma$)wj{k!@KFB30Yo)IOrl>)$)D|+(5h&+%2vuwGuy^@S8FT^s21V5};>VA9Iu;?8bHz#r<;JtfZDI1(FT@edh0#", + "MYW$A1qkMGIwTZqqdYNE3gl#zp&NbL9Mp=voqN|;?gqR&4$)1`znddtEyuKS*^nMMD=0^>", + "7^z6-C4P67UWOXuMBubP>j6i~03aR@jD^-Y`JSYu#Yp0P8dLLJ0QOPE8=BoiuRX59YW7xg", + "WiexjHX%&0?`ZQCdxCdL^qd1v@kOjQKaWo2Y1++~LcA%FTq?5o%}fX1-RIvlB)1#iTNomGnUL=nM!>Ix|AGtON7!F1O?53kqlC2o-`ZGw*+s", + "NM$^9znsIJMwlgscE`|O3|;BRgsQMYm~`uv+nvuv`nigRa}X=BX=A5Sw$)WEklF7&c>_~$", + "zJ(m--bqXgiN^w-U=BJH9C0Qro(x90zo@rK;&TJ$nI@&k$ORgOb2s%gWbc}ok_27)Eoku~Fq|B-Ps+4J_", + "HPJMLJ2^_)cOU$p&3kNAlrV!)%~6r$BJ>OOi~=-<6byle{?zd4J{NG}o8tw|+#ZNLcpNwk", + "TuPE~sbJB8_RZb2DopStO+Wwux~F#S59zm%00I98;S&G=b(j+6vBYQl0ssI200dcD" + ], + "Asia/Tokyo": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j-~luMgIxeB7KxBg5R*;y?l4Rl4neXH3cv!OtfK@h", + "KZzauI)S!FSDREPhhBS6Fb$&Vv#7%;?Te|>pF^0HBr&z_Tk<%vMW_QqjevRZOp8XVFgP<8", + "TkT#`9H&0Ua;gT1#rZLV0HqbAKK;_z@nO;6t0L}hOdk<>TdUa07R(LPI6@!GU$ty4=mwqHG-XVe*n(Yvgdlr+FqIU18!osi)48t~eWX8)&L", + "G)Ud^0zz@*AF+2r7E}Nf9Y72K~o-T%}D&z%}#7g2br?oH6ZiYH^%>J3D)TPKV(JY*bwjuw5=DsPB@~CrROZeN", + "x>A*H&CHrWt0`EP`m!F%waepl#|w#&`XgVc?~2M3uw$fGX~tf_Il!q#Aa<*8xlzQ2+7r6Z", + "^;Laa9F(WB_O&Dy2r>~@kSi16W{=6+i5GV=Uq~KX*~&HUN4oz7*O(gXIr}sDVcD`Ikgw#|", + "50ssal8s)Qy;?YGCf;*UKKKN!T4!Kqy_G;7PfQapugqvVBKy12v3TVH^L2", + "0?#5*VP~MOYfe$h`*L!7@tiW|_^X1N%<}`7YahiUYtMu5XwmOf3?dr+@zXHwW`z}ZDqZlT", + "<2Cs(<1%M!i6o&VK89BY0J7HPIo;O62s=|IbV^@y$N&#=>i^F00FcHoDl#3", + "Mdv&xvBYQl0ssI200dcD" + ], + "Europe/Dublin": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j;0>b$_+0=h7KxBg5R*;&J77#T_U2R5sleVWFDmK~", + "Kzj5oh@`QKHvW^6V{jU-w>qg1tSt0c^vh;?qAqA0%t?;#S~6U8Qi", + "v&f1s9IH#g$m1k1a#3+lylw4mwT4QnEUUQdwg+xnEcBlgu31bAVabn41OMZVLGz6NDwG%X", + "uQar!b>GI{qSahE`AG}$kRWbuI~JCt;38)Xwbb~Qggs55t+MAHIxgDxzTJ;2xXx99+qCy4", + "45kC#v_l8fx|G&jlVvaciR<-wwf22l%4(t@S6tnX39#_K(4S0fu$FUs$isud9IKzCXB78NkARYq@9Dc0TGkhz);NtM_SSzEffN", + "l{2^*CKGdp52h!52A)6q9fUSltXF{T*Ehc9Q7u8!W7pE(Fv$D$cKUAt6wY=DA1mGgxC*VX", + "q_If3G#FY6-Voj`fIKk`0}Cc72_SD{v>468LV{pyBI33^p0E?}RwDA6Pkq--C~0jF&Z@Pv", + "!dx_1SN_)jwz@P$(oK%P!Tk9?fRjK88yxhxlcFtTjjZ$DYssSsa#ufYrR+}}nKS+r384o~", + "!Uw$nwTbF~qgRsgr0N#d@KIinx%hQB(SJyjJtDtIy(%mDm}ZBGN}dV6K~om|=U", + "VGkbciQ=^$_14|gT21!YQ)@y*Rd0i_lS6gtPBE9+ah%WIJPwzUTjIr+J1XckkmA!6WE16%", + "CVAl{Dn&-)=G$Bjh?bh0$Xt1UDcgXJjXzzojuw0>paV~?Sa`VN3FysqFxTzfKVAu*ucq#+m=|KSSMvp_#@-lwd+q*ue", + "FQ^5<|<0R-u4qYMbRqzSn&", + "Q7jSuvc%b+EZc%>nI(+&0Tl1Y>a6v4`uNFD-7$QrhHgS7Wnv~rDgfH;rQw3+m`LJxoM4v#", + "gK@?|B{RHJ*VxZgk#!p<_&-sjxOda0YaiJ1UnG41VPv(Et%ElzKRMcO$AfgU+Xnwg5p2_+", + "NrnZ1WfEj^fmHd^sx@%JWKkh#zaK0ox%rdP)zUmGZZnqmZ_9L=%6R8ibJH0bOT$AGhDo6{", + "fJ?;_U;D|^>5by2ul@i4Zf()InfFN}00EQ=q#FPL>RM>svBYQl0ssI200dcD" + ], + "Europe/Lisbon": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j;0=rf*IfWA7KxBg5R*;*X|PN+G3LqthM?xgkNUN_", + ")gCt1Sc%YT6^TTomk4yVHXeyvQj8}l<;q&s7K}#Vnc8lII1?)AHh$*>OKUU4S;*h>v*ep0", + "xTi1cK2{aY*|2D*-~K<;-{_W+r@NvZ7-|NZv($ek_C%VfP0xjWeZP#CPXD`IKkakjh(kUd", + "&H)m;^Q(jGjIyiyrcUMtOP)u3A>sw6ux;Bmp3x$4QvQKMx5TrCx_!$srWQuXNs&`9=^IY1", + "yc&C31!sQh7P=Mk*#6x8Z@5^%ehR8UW$OWw0KMw}P1ycI^", + "4eh12oBUOV?S>n*d!+EM@>x#9PZD12iD=zaC;7`8dTfkU_6d}OZvSFSbGgXeKw}XyX@D=(", + ")D0!^DBGr8pXWBT$S-yhLP>Z3ys^VW3}RQ6{NGGVJG6vf*MH93vvNW6yLjie1;{4tVhg-KnSf|G`!", + "Z;j$7gJ1ows~RD=@n7I6aFd8rOR_7Y?E-$clI%1o5gA@O!KPa^(8^iFFeFykI-+z>E$mvp", + "E_h`vbHPjqkLs`Dn-0FV`R@z|h!S(Lb;M&|Exr!biY`%bfp$6`hK;GDhdP|^Q", + "*Ty*}1d41K>H2B{jrjE9aFK>yAQJBX9CD%-384S;0fw`PlprHGS`^b$oS-`I4VH7ji8ou-", + "g|060jfb1XcxiInT0oOoeR7#%e5Ug5#KW)nVSRvLHNe$SQHM@2)`S9L7>RL@Qx%fmm7?3u7P5TywFQ}C@S(pq}|", + "eLPT{C^{<0Q?uU&kSVd%!~8q3;Z0s3OqzF`$HRkePL5Ywgiwn{R(zi+jmOBFrVpW;)@UsU#%$8BcV#h@}m$#!Fglo&bwb78aYqOG_W7h{eb(+39&-mk4EIXq_", + "_`30=8sfA3=!3TO_TyS5X22~?6nKngZ|bq=grdq=9X)3xAkA42L!~rmS)n3w-~;lgz%Fhn", + "(?rXdp2ho~9?wmVs2JwVt~?@FVD%`tN69{(i3oQa;O0$E$lF&~Y#_H6bu6(BiwblJ>;-Fs", + "gA$Y$*?=X)n1pFkKn}F~`>=4)+LLQk?L*P!bhAm0;`N~z3QbUIyVrm%kOZ(n1JJsm0pyb8", + "!GV{d*C!9KXv;4vD4Q>-k#+x(!V5L@w5M>v2V5a`B>t(|B", + "|Fqr4^-{S*%Ep~ojUtx_CRbSQ(uFwu2=KH)Q@EBs@ZqRXn4mU;B!68;;IQs3Ub=n&UU%*m", + "k&zwD36&JSwsN(%k&x?H+tN^6)23c`I0=5^N_R0~1>tsFZ`^`3z~rXSXT&qcwa#n!%+Z#P", + "PG}(D^_CCILXnF|GKwabBh*xFS?4rwGo2vtJUwzrbv_$5PO+`?$l{H-jGB@X%S!OAhw;D4", + "XFycN3!XqQ&EorJOD3>~^U%Luw!jF<;6_q-f-S|6{cQDfZ2(4Xf1MMLr1=SA=MwVf2%Pp%VP;jn)|5Tf!-DbUGn%I-rkYaH7?$$O!t)wwClAisr3eUoeB^~T=U*_P~Y2*KdnO87>B!19sV=xZ5", + "yApq26RxgqA|*tmsvtL#OhcF(C<0EGWHP)BFl?h)_*7!{LoJiv%RsOs!q->n+DcV%9~B@RbC_1G_1g6`Yd~8|%-=2l~oGN!~TVv2Bnk>7wW8L@^?vX$f3AiT)(4nrCuTm9%(XC6Nai", + "E(;}7&=YZagjAN$O-cN;1u{dTkElmB0GT$|Wa)QMmKrx<|LCJ9qlUoFsUbD^H^6_8(w<0{", + "ftj&O1~p_%lh5z;zNV&sP+", + "NF2>iK{8KMUf+)<-)VxXbLxD(alL}N$AT-ogNbJSMMYeX+Z{jS)b8TK^PB=FxyBxzfmFto", + "eo0R`a(%NO?#aEH9|?Cv00000NIsFh6BW2800DjO0RR918Pu^`vBYQl0ssI200dcD" + ], + "UTC": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j-~e#|9bEt_7KxBg5R*|3h1|xhHLji!C57qW6L*|H", + "pEErm00000ygu;I+>V)?00B92fhY-(AGY&-0RR9100dcD" + ] + }, + "metadata": { + "version": "2020a" + } +} \ No newline at end of file diff --git a/Lib/test/test_zoneinfo/test_zoneinfo.py b/Lib/test/test_zoneinfo/test_zoneinfo.py new file mode 100644 index 00000000..85703269 --- /dev/null +++ b/Lib/test/test_zoneinfo/test_zoneinfo.py @@ -0,0 +1,2099 @@ +from __future__ import annotations + +import base64 +import contextlib +import dataclasses +import importlib.metadata +import io +import json +import lzma +import os +import pathlib +import pickle +import re +import shutil +import struct +import tempfile +import unittest +from datetime import date, datetime, time, timedelta, timezone +from functools import cached_property + +from . import _support as test_support +from ._support import OS_ENV_LOCK, TZPATH_TEST_LOCK, ZoneInfoTestBase + +py_zoneinfo, c_zoneinfo = test_support.get_modules() + +try: + importlib.metadata.metadata("tzdata") + HAS_TZDATA_PKG = True +except importlib.metadata.PackageNotFoundError: + HAS_TZDATA_PKG = False + +ZONEINFO_DATA = None +ZONEINFO_DATA_V1 = None +TEMP_DIR = None +DATA_DIR = pathlib.Path(__file__).parent / "data" +ZONEINFO_JSON = DATA_DIR / "zoneinfo_data.json" + +# Useful constants +ZERO = timedelta(0) +ONE_H = timedelta(hours=1) + + +def setUpModule(): + global TEMP_DIR + global ZONEINFO_DATA + global ZONEINFO_DATA_V1 + + TEMP_DIR = pathlib.Path(tempfile.mkdtemp(prefix="zoneinfo")) + ZONEINFO_DATA = ZoneInfoData(ZONEINFO_JSON, TEMP_DIR / "v2") + ZONEINFO_DATA_V1 = ZoneInfoData(ZONEINFO_JSON, TEMP_DIR / "v1", v1=True) + + +def tearDownModule(): + shutil.rmtree(TEMP_DIR) + + +class TzPathUserMixin: + """ + Adds a setUp() and tearDown() to make TZPATH manipulations thread-safe. + + Any tests that require manipulation of the TZPATH global are necessarily + thread unsafe, so we will acquire a lock and reset the TZPATH variable + to the default state before each test and release the lock after the test + is through. + """ + + @property + def tzpath(self): # pragma: nocover + return None + + @property + def block_tzdata(self): + return True + + def setUp(self): + with contextlib.ExitStack() as stack: + stack.enter_context( + self.tzpath_context( + self.tzpath, + block_tzdata=self.block_tzdata, + lock=TZPATH_TEST_LOCK, + ) + ) + self.addCleanup(stack.pop_all().close) + + super().setUp() + + +class DatetimeSubclassMixin: + """ + Replaces all ZoneTransition transition dates with a datetime subclass. + """ + + class DatetimeSubclass(datetime): + @classmethod + def from_datetime(cls, dt): + return cls( + dt.year, + dt.month, + dt.day, + dt.hour, + dt.minute, + dt.second, + dt.microsecond, + tzinfo=dt.tzinfo, + fold=dt.fold, + ) + + def load_transition_examples(self, key): + transition_examples = super().load_transition_examples(key) + for zt in transition_examples: + dt = zt.transition + new_dt = self.DatetimeSubclass.from_datetime(dt) + new_zt = dataclasses.replace(zt, transition=new_dt) + yield new_zt + + +class ZoneInfoTest(TzPathUserMixin, ZoneInfoTestBase): + module = py_zoneinfo + class_name = "ZoneInfo" + + def setUp(self): + super().setUp() + + # This is necessary because various subclasses pull from different + # data sources (e.g. tzdata, V1 files, etc). + self.klass.clear_cache() + + @property + def zoneinfo_data(self): + return ZONEINFO_DATA + + @property + def tzpath(self): + return [self.zoneinfo_data.tzpath] + + def zone_from_key(self, key): + return self.klass(key) + + def zones(self): + return ZoneDumpData.transition_keys() + + def fixed_offset_zones(self): + return ZoneDumpData.fixed_offset_zones() + + def load_transition_examples(self, key): + return ZoneDumpData.load_transition_examples(key) + + def test_str(self): + # Zones constructed with a key must have str(zone) == key + for key in self.zones(): + with self.subTest(key): + zi = self.zone_from_key(key) + + self.assertEqual(str(zi), key) + + # Zones with no key constructed should have str(zone) == repr(zone) + file_key = self.zoneinfo_data.keys[0] + file_path = self.zoneinfo_data.path_from_key(file_key) + + with open(file_path, "rb") as f: + with self.subTest(test_name="Repr test", path=file_path): + zi_ff = self.klass.from_file(f) + self.assertEqual(str(zi_ff), repr(zi_ff)) + + def test_repr(self): + # The repr is not guaranteed, but I think we can insist that it at + # least contain the name of the class. + key = next(iter(self.zones())) + + zi = self.klass(key) + class_name = self.class_name + with self.subTest(name="from key"): + self.assertRegex(repr(zi), class_name) + + file_key = self.zoneinfo_data.keys[0] + file_path = self.zoneinfo_data.path_from_key(file_key) + with open(file_path, "rb") as f: + zi_ff = self.klass.from_file(f, key=file_key) + + with self.subTest(name="from file with key"): + self.assertRegex(repr(zi_ff), class_name) + + with open(file_path, "rb") as f: + zi_ff_nk = self.klass.from_file(f) + + with self.subTest(name="from file without key"): + self.assertRegex(repr(zi_ff_nk), class_name) + + def test_key_attribute(self): + key = next(iter(self.zones())) + + def from_file_nokey(key): + with open(self.zoneinfo_data.path_from_key(key), "rb") as f: + return self.klass.from_file(f) + + constructors = ( + ("Primary constructor", self.klass, key), + ("no_cache", self.klass.no_cache, key), + ("from_file", from_file_nokey, None), + ) + + for msg, constructor, expected in constructors: + zi = constructor(key) + + # Ensure that the key attribute is set to the input to ``key`` + with self.subTest(msg): + self.assertEqual(zi.key, expected) + + # Ensure that the key attribute is read-only + with self.subTest(f"{msg}: readonly"): + with self.assertRaises(AttributeError): + zi.key = "Some/Value" + + def test_bad_keys(self): + bad_keys = [ + "Eurasia/Badzone", # Plausible but does not exist + "BZQ", + "America.Los_Angeles", + "🇨🇦", # Non-ascii + "America/New\ud800York", # Contains surrogate character + ] + + for bad_key in bad_keys: + with self.assertRaises(self.module.ZoneInfoNotFoundError): + self.klass(bad_key) + + def test_bad_keys_paths(self): + bad_keys = [ + "/America/Los_Angeles", # Absolute path + "America/Los_Angeles/", # Trailing slash - not normalized + "../zoneinfo/America/Los_Angeles", # Traverses above TZPATH + "America/../America/Los_Angeles", # Not normalized + "America/./Los_Angeles", + ] + + for bad_key in bad_keys: + with self.assertRaises(ValueError): + self.klass(bad_key) + + def test_bad_zones(self): + bad_zones = [ + b"", # Empty file + b"AAAA3" + b" " * 15, # Bad magic + ] + + for bad_zone in bad_zones: + fobj = io.BytesIO(bad_zone) + with self.assertRaises(ValueError): + self.klass.from_file(fobj) + + def test_fromutc_errors(self): + key = next(iter(self.zones())) + zone = self.zone_from_key(key) + + bad_values = [ + (datetime(2019, 1, 1, tzinfo=timezone.utc), ValueError), + (datetime(2019, 1, 1), ValueError), + (date(2019, 1, 1), TypeError), + (time(0), TypeError), + (0, TypeError), + ("2019-01-01", TypeError), + ] + + for val, exc_type in bad_values: + with self.subTest(val=val): + with self.assertRaises(exc_type): + zone.fromutc(val) + + def test_utc(self): + zi = self.klass("UTC") + dt = datetime(2020, 1, 1, tzinfo=zi) + + self.assertEqual(dt.utcoffset(), ZERO) + self.assertEqual(dt.dst(), ZERO) + self.assertEqual(dt.tzname(), "UTC") + + def test_unambiguous(self): + test_cases = [] + for key in self.zones(): + for zone_transition in self.load_transition_examples(key): + test_cases.append( + ( + key, + zone_transition.transition - timedelta(days=2), + zone_transition.offset_before, + ) + ) + + test_cases.append( + ( + key, + zone_transition.transition + timedelta(days=2), + zone_transition.offset_after, + ) + ) + + for key, dt, offset in test_cases: + with self.subTest(key=key, dt=dt, offset=offset): + tzi = self.zone_from_key(key) + dt = dt.replace(tzinfo=tzi) + + self.assertEqual(dt.tzname(), offset.tzname, dt) + self.assertEqual(dt.utcoffset(), offset.utcoffset, dt) + self.assertEqual(dt.dst(), offset.dst, dt) + + def test_folds_and_gaps(self): + test_cases = [] + for key in self.zones(): + tests = {"folds": [], "gaps": []} + for zt in self.load_transition_examples(key): + if zt.fold: + test_group = tests["folds"] + elif zt.gap: + test_group = tests["gaps"] + else: + # Assign a random variable here to disable the peephole + # optimizer so that coverage can see this line. + # See bpo-2506 for more information. + no_peephole_opt = None + continue + + # Cases are of the form key, dt, fold, offset + dt = zt.anomaly_start - timedelta(seconds=1) + test_group.append((dt, 0, zt.offset_before)) + test_group.append((dt, 1, zt.offset_before)) + + dt = zt.anomaly_start + test_group.append((dt, 0, zt.offset_before)) + test_group.append((dt, 1, zt.offset_after)) + + dt = zt.anomaly_start + timedelta(seconds=1) + test_group.append((dt, 0, zt.offset_before)) + test_group.append((dt, 1, zt.offset_after)) + + dt = zt.anomaly_end - timedelta(seconds=1) + test_group.append((dt, 0, zt.offset_before)) + test_group.append((dt, 1, zt.offset_after)) + + dt = zt.anomaly_end + test_group.append((dt, 0, zt.offset_after)) + test_group.append((dt, 1, zt.offset_after)) + + dt = zt.anomaly_end + timedelta(seconds=1) + test_group.append((dt, 0, zt.offset_after)) + test_group.append((dt, 1, zt.offset_after)) + + for grp, test_group in tests.items(): + test_cases.append(((key, grp), test_group)) + + for (key, grp), tests in test_cases: + with self.subTest(key=key, grp=grp): + tzi = self.zone_from_key(key) + + for dt, fold, offset in tests: + dt = dt.replace(fold=fold, tzinfo=tzi) + + self.assertEqual(dt.tzname(), offset.tzname, dt) + self.assertEqual(dt.utcoffset(), offset.utcoffset, dt) + self.assertEqual(dt.dst(), offset.dst, dt) + + def test_folds_from_utc(self): + for key in self.zones(): + zi = self.zone_from_key(key) + with self.subTest(key=key): + for zt in self.load_transition_examples(key): + if not zt.fold: + continue + + dt_utc = zt.transition_utc + dt_before_utc = dt_utc - timedelta(seconds=1) + dt_after_utc = dt_utc + timedelta(seconds=1) + + dt_before = dt_before_utc.astimezone(zi) + self.assertEqual(dt_before.fold, 0, (dt_before, dt_utc)) + + dt_after = dt_after_utc.astimezone(zi) + self.assertEqual(dt_after.fold, 1, (dt_after, dt_utc)) + + def test_time_variable_offset(self): + # self.zones() only ever returns variable-offset zones + for key in self.zones(): + zi = self.zone_from_key(key) + t = time(11, 15, 1, 34471, tzinfo=zi) + + with self.subTest(key=key): + self.assertIs(t.tzname(), None) + self.assertIs(t.utcoffset(), None) + self.assertIs(t.dst(), None) + + def test_time_fixed_offset(self): + for key, offset in self.fixed_offset_zones(): + zi = self.zone_from_key(key) + + t = time(11, 15, 1, 34471, tzinfo=zi) + + with self.subTest(key=key): + self.assertEqual(t.tzname(), offset.tzname) + self.assertEqual(t.utcoffset(), offset.utcoffset) + self.assertEqual(t.dst(), offset.dst) + + +class CZoneInfoTest(ZoneInfoTest): + module = c_zoneinfo + + def test_fold_mutate(self): + """Test that fold isn't mutated when no change is necessary. + + The underlying C API is capable of mutating datetime objects, and + may rely on the fact that addition of a datetime object returns a + new datetime; this test ensures that the input datetime to fromutc + is not mutated. + """ + + def to_subclass(dt): + class SameAddSubclass(type(dt)): + def __add__(self, other): + if other == timedelta(0): + return self + + return super().__add__(other) # pragma: nocover + + return SameAddSubclass( + dt.year, + dt.month, + dt.day, + dt.hour, + dt.minute, + dt.second, + dt.microsecond, + fold=dt.fold, + tzinfo=dt.tzinfo, + ) + + subclass = [False, True] + + key = "Europe/London" + zi = self.zone_from_key(key) + for zt in self.load_transition_examples(key): + if zt.fold and zt.offset_after.utcoffset == ZERO: + example = zt.transition_utc.replace(tzinfo=zi) + break + + for subclass in [False, True]: + if subclass: + dt = to_subclass(example) + else: + dt = example + + with self.subTest(subclass=subclass): + dt_fromutc = zi.fromutc(dt) + + self.assertEqual(dt_fromutc.fold, 1) + self.assertEqual(dt.fold, 0) + + +class ZoneInfoDatetimeSubclassTest(DatetimeSubclassMixin, ZoneInfoTest): + pass + + +class CZoneInfoDatetimeSubclassTest(DatetimeSubclassMixin, CZoneInfoTest): + pass + + +class ZoneInfoSubclassTest(ZoneInfoTest): + @classmethod + def setUpClass(cls): + super().setUpClass() + + class ZISubclass(cls.klass): + pass + + cls.class_name = "ZISubclass" + cls.parent_klass = cls.klass + cls.klass = ZISubclass + + def test_subclass_own_cache(self): + base_obj = self.parent_klass("Europe/London") + sub_obj = self.klass("Europe/London") + + self.assertIsNot(base_obj, sub_obj) + self.assertIsInstance(base_obj, self.parent_klass) + self.assertIsInstance(sub_obj, self.klass) + + +class CZoneInfoSubclassTest(ZoneInfoSubclassTest): + module = c_zoneinfo + + +class ZoneInfoV1Test(ZoneInfoTest): + @property + def zoneinfo_data(self): + return ZONEINFO_DATA_V1 + + def load_transition_examples(self, key): + # We will discard zdump examples outside the range epoch +/- 2**31, + # because they are not well-supported in Version 1 files. + epoch = datetime(1970, 1, 1) + max_offset_32 = timedelta(seconds=2 ** 31) + min_dt = epoch - max_offset_32 + max_dt = epoch + max_offset_32 + + for zt in ZoneDumpData.load_transition_examples(key): + if min_dt <= zt.transition <= max_dt: + yield zt + + +class CZoneInfoV1Test(ZoneInfoV1Test): + module = c_zoneinfo + + +@unittest.skipIf( + not HAS_TZDATA_PKG, "Skipping tzdata-specific tests: tzdata not installed" +) +class TZDataTests(ZoneInfoTest): + """ + Runs all the ZoneInfoTest tests, but against the tzdata package + + NOTE: The ZoneDumpData has frozen test data, but tzdata will update, so + some of the tests (particularly those related to the far future) may break + in the event that the time zone policies in the relevant time zones change. + """ + + @property + def tzpath(self): + return [] + + @property + def block_tzdata(self): + return False + + def zone_from_key(self, key): + return self.klass(key=key) + + +@unittest.skipIf( + not HAS_TZDATA_PKG, "Skipping tzdata-specific tests: tzdata not installed" +) +class CTZDataTests(TZDataTests): + module = c_zoneinfo + + +class WeirdZoneTest(ZoneInfoTestBase): + module = py_zoneinfo + + def test_one_transition(self): + LMT = ZoneOffset("LMT", -timedelta(hours=6, minutes=31, seconds=2)) + STD = ZoneOffset("STD", -timedelta(hours=6)) + + transitions = [ + ZoneTransition(datetime(1883, 6, 9, 14), LMT, STD), + ] + + after = "STD6" + + zf = self.construct_zone(transitions, after) + zi = self.klass.from_file(zf) + + dt0 = datetime(1883, 6, 9, 1, tzinfo=zi) + dt1 = datetime(1883, 6, 10, 1, tzinfo=zi) + + for dt, offset in [(dt0, LMT), (dt1, STD)]: + with self.subTest(name="local", dt=dt): + self.assertEqual(dt.tzname(), offset.tzname) + self.assertEqual(dt.utcoffset(), offset.utcoffset) + self.assertEqual(dt.dst(), offset.dst) + + dts = [ + ( + datetime(1883, 6, 9, 1, tzinfo=zi), + datetime(1883, 6, 9, 7, 31, 2, tzinfo=timezone.utc), + ), + ( + datetime(2010, 4, 1, 12, tzinfo=zi), + datetime(2010, 4, 1, 18, tzinfo=timezone.utc), + ), + ] + + for dt_local, dt_utc in dts: + with self.subTest(name="fromutc", dt=dt_local): + dt_actual = dt_utc.astimezone(zi) + self.assertEqual(dt_actual, dt_local) + + dt_utc_actual = dt_local.astimezone(timezone.utc) + self.assertEqual(dt_utc_actual, dt_utc) + + def test_one_zone_dst(self): + DST = ZoneOffset("DST", ONE_H, ONE_H) + transitions = [ + ZoneTransition(datetime(1970, 1, 1), DST, DST), + ] + + after = "STD0DST-1,0/0,J365/25" + + zf = self.construct_zone(transitions, after) + zi = self.klass.from_file(zf) + + dts = [ + datetime(1900, 3, 1), + datetime(1965, 9, 12), + datetime(1970, 1, 1), + datetime(2010, 11, 3), + datetime(2040, 1, 1), + ] + + for dt in dts: + dt = dt.replace(tzinfo=zi) + with self.subTest(dt=dt): + self.assertEqual(dt.tzname(), DST.tzname) + self.assertEqual(dt.utcoffset(), DST.utcoffset) + self.assertEqual(dt.dst(), DST.dst) + + def test_no_tz_str(self): + STD = ZoneOffset("STD", ONE_H, ZERO) + DST = ZoneOffset("DST", 2 * ONE_H, ONE_H) + + transitions = [] + for year in range(1996, 2000): + transitions.append( + ZoneTransition(datetime(year, 3, 1, 2), STD, DST) + ) + transitions.append( + ZoneTransition(datetime(year, 11, 1, 2), DST, STD) + ) + + after = "" + + zf = self.construct_zone(transitions, after) + + # According to RFC 8536, local times after the last transition time + # with an empty TZ string are unspecified. We will go with "hold the + # last transition", but the most we should promise is "doesn't crash." + zi = self.klass.from_file(zf) + + cases = [ + (datetime(1995, 1, 1), STD), + (datetime(1996, 4, 1), DST), + (datetime(1996, 11, 2), STD), + (datetime(2001, 1, 1), STD), + ] + + for dt, offset in cases: + dt = dt.replace(tzinfo=zi) + with self.subTest(dt=dt): + self.assertEqual(dt.tzname(), offset.tzname) + self.assertEqual(dt.utcoffset(), offset.utcoffset) + self.assertEqual(dt.dst(), offset.dst) + + # Test that offsets return None when using a datetime.time + t = time(0, tzinfo=zi) + with self.subTest("Testing datetime.time"): + self.assertIs(t.tzname(), None) + self.assertIs(t.utcoffset(), None) + self.assertIs(t.dst(), None) + + def test_tz_before_only(self): + # From RFC 8536 Section 3.2: + # + # If there are no transitions, local time for all timestamps is + # specified by the TZ string in the footer if present and nonempty; + # otherwise, it is specified by time type 0. + + offsets = [ + ZoneOffset("STD", ZERO, ZERO), + ZoneOffset("DST", ONE_H, ONE_H), + ] + + for offset in offsets: + # Phantom transition to set time type 0. + transitions = [ + ZoneTransition(None, offset, offset), + ] + + after = "" + + zf = self.construct_zone(transitions, after) + zi = self.klass.from_file(zf) + + dts = [ + datetime(1900, 1, 1), + datetime(1970, 1, 1), + datetime(2000, 1, 1), + ] + + for dt in dts: + dt = dt.replace(tzinfo=zi) + with self.subTest(offset=offset, dt=dt): + self.assertEqual(dt.tzname(), offset.tzname) + self.assertEqual(dt.utcoffset(), offset.utcoffset) + self.assertEqual(dt.dst(), offset.dst) + + def test_empty_zone(self): + zf = self.construct_zone([], "") + + with self.assertRaises(ValueError): + self.klass.from_file(zf) + + def test_zone_very_large_timestamp(self): + """Test when a transition is in the far past or future. + + Particularly, this is a concern if something: + + 1. Attempts to call ``datetime.timestamp`` for a datetime outside + of ``[datetime.min, datetime.max]``. + 2. Attempts to construct a timedelta outside of + ``[timedelta.min, timedelta.max]``. + + This actually occurs "in the wild", as some time zones on Ubuntu (at + least as of 2020) have an initial transition added at ``-2**58``. + """ + + LMT = ZoneOffset("LMT", timedelta(seconds=-968)) + GMT = ZoneOffset("GMT", ZERO) + + transitions = [ + (-(1 << 62), LMT, LMT), + ZoneTransition(datetime(1912, 1, 1), LMT, GMT), + ((1 << 62), GMT, GMT), + ] + + after = "GMT0" + + zf = self.construct_zone(transitions, after) + zi = self.klass.from_file(zf, key="Africa/Abidjan") + + offset_cases = [ + (datetime.min, LMT), + (datetime.max, GMT), + (datetime(1911, 12, 31), LMT), + (datetime(1912, 1, 2), GMT), + ] + + for dt_naive, offset in offset_cases: + dt = dt_naive.replace(tzinfo=zi) + with self.subTest(name="offset", dt=dt, offset=offset): + self.assertEqual(dt.tzname(), offset.tzname) + self.assertEqual(dt.utcoffset(), offset.utcoffset) + self.assertEqual(dt.dst(), offset.dst) + + utc_cases = [ + (datetime.min, datetime.min + timedelta(seconds=968)), + (datetime(1898, 12, 31, 23, 43, 52), datetime(1899, 1, 1)), + ( + datetime(1911, 12, 31, 23, 59, 59, 999999), + datetime(1912, 1, 1, 0, 16, 7, 999999), + ), + (datetime(1912, 1, 1, 0, 16, 8), datetime(1912, 1, 1, 0, 16, 8)), + (datetime(1970, 1, 1), datetime(1970, 1, 1)), + (datetime.max, datetime.max), + ] + + for naive_dt, naive_dt_utc in utc_cases: + dt = naive_dt.replace(tzinfo=zi) + dt_utc = naive_dt_utc.replace(tzinfo=timezone.utc) + + self.assertEqual(dt_utc.astimezone(zi), dt) + self.assertEqual(dt, dt_utc) + + def test_fixed_offset_phantom_transition(self): + UTC = ZoneOffset("UTC", ZERO, ZERO) + + transitions = [ZoneTransition(datetime(1970, 1, 1), UTC, UTC)] + + after = "UTC0" + zf = self.construct_zone(transitions, after) + zi = self.klass.from_file(zf, key="UTC") + + dt = datetime(2020, 1, 1, tzinfo=zi) + with self.subTest("datetime.datetime"): + self.assertEqual(dt.tzname(), UTC.tzname) + self.assertEqual(dt.utcoffset(), UTC.utcoffset) + self.assertEqual(dt.dst(), UTC.dst) + + t = time(0, tzinfo=zi) + with self.subTest("datetime.time"): + self.assertEqual(t.tzname(), UTC.tzname) + self.assertEqual(t.utcoffset(), UTC.utcoffset) + self.assertEqual(t.dst(), UTC.dst) + + def construct_zone(self, transitions, after=None, version=3): + # These are not used for anything, so we're not going to include + # them for now. + isutc = [] + isstd = [] + leap_seconds = [] + + offset_lists = [[], []] + trans_times_lists = [[], []] + trans_idx_lists = [[], []] + + v1_range = (-(2 ** 31), 2 ** 31) + v2_range = (-(2 ** 63), 2 ** 63) + ranges = [v1_range, v2_range] + + def zt_as_tuple(zt): + # zt may be a tuple (timestamp, offset_before, offset_after) or + # a ZoneTransition object — this is to allow the timestamp to be + # values that are outside the valid range for datetimes but still + # valid 64-bit timestamps. + if isinstance(zt, tuple): + return zt + + if zt.transition: + trans_time = int(zt.transition_utc.timestamp()) + else: + trans_time = None + + return (trans_time, zt.offset_before, zt.offset_after) + + transitions = sorted(map(zt_as_tuple, transitions), key=lambda x: x[0]) + + for zt in transitions: + trans_time, offset_before, offset_after = zt + + for v, (dt_min, dt_max) in enumerate(ranges): + offsets = offset_lists[v] + trans_times = trans_times_lists[v] + trans_idx = trans_idx_lists[v] + + if trans_time is not None and not ( + dt_min <= trans_time <= dt_max + ): + continue + + if offset_before not in offsets: + offsets.append(offset_before) + + if offset_after not in offsets: + offsets.append(offset_after) + + if trans_time is not None: + trans_times.append(trans_time) + trans_idx.append(offsets.index(offset_after)) + + isutcnt = len(isutc) + isstdcnt = len(isstd) + leapcnt = len(leap_seconds) + + zonefile = io.BytesIO() + + time_types = ("l", "q") + for v in range(min((version, 2))): + offsets = offset_lists[v] + trans_times = trans_times_lists[v] + trans_idx = trans_idx_lists[v] + time_type = time_types[v] + + # Translate the offsets into something closer to the C values + abbrstr = bytearray() + ttinfos = [] + + for offset in offsets: + utcoff = int(offset.utcoffset.total_seconds()) + isdst = bool(offset.dst) + abbrind = len(abbrstr) + + ttinfos.append((utcoff, isdst, abbrind)) + abbrstr += offset.tzname.encode("ascii") + b"\x00" + abbrstr = bytes(abbrstr) + + typecnt = len(offsets) + timecnt = len(trans_times) + charcnt = len(abbrstr) + + # Write the header + zonefile.write(b"TZif") + zonefile.write(b"%d" % version) + zonefile.write(b" " * 15) + zonefile.write( + struct.pack( + ">6l", isutcnt, isstdcnt, leapcnt, timecnt, typecnt, charcnt + ) + ) + + # Now the transition data + zonefile.write(struct.pack(f">{timecnt}{time_type}", *trans_times)) + zonefile.write(struct.pack(f">{timecnt}B", *trans_idx)) + + for ttinfo in ttinfos: + zonefile.write(struct.pack(">lbb", *ttinfo)) + + zonefile.write(bytes(abbrstr)) + + # Now the metadata and leap seconds + zonefile.write(struct.pack(f"{isutcnt}b", *isutc)) + zonefile.write(struct.pack(f"{isstdcnt}b", *isstd)) + zonefile.write(struct.pack(f">{leapcnt}l", *leap_seconds)) + + # Finally we write the TZ string if we're writing a Version 2+ file + if v > 0: + zonefile.write(b"\x0A") + zonefile.write(after.encode("ascii")) + zonefile.write(b"\x0A") + + zonefile.seek(0) + return zonefile + + +class CWeirdZoneTest(WeirdZoneTest): + module = c_zoneinfo + + +class TZStrTest(ZoneInfoTestBase): + module = py_zoneinfo + + NORMAL = 0 + FOLD = 1 + GAP = 2 + + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls._populate_test_cases() + cls.populate_tzstr_header() + + @classmethod + def populate_tzstr_header(cls): + out = bytearray() + # The TZif format always starts with a Version 1 file followed by + # the Version 2+ file. In this case, we have no transitions, just + # the tzstr in the footer, so up to the footer, the files are + # identical and we can just write the same file twice in a row. + for _ in range(2): + out += b"TZif" # Magic value + out += b"3" # Version + out += b" " * 15 # Reserved + + # We will not write any of the manual transition parts + out += struct.pack(">6l", 0, 0, 0, 0, 0, 0) + + cls._tzif_header = bytes(out) + + def zone_from_tzstr(self, tzstr): + """Creates a zoneinfo file following a POSIX rule.""" + zonefile = io.BytesIO(self._tzif_header) + zonefile.seek(0, 2) + + # Write the footer + zonefile.write(b"\x0A") + zonefile.write(tzstr.encode("ascii")) + zonefile.write(b"\x0A") + + zonefile.seek(0) + + return self.klass.from_file(zonefile, key=tzstr) + + def test_tzstr_localized(self): + for tzstr, cases in self.test_cases.items(): + with self.subTest(tzstr=tzstr): + zi = self.zone_from_tzstr(tzstr) + + for dt_naive, offset, _ in cases: + dt = dt_naive.replace(tzinfo=zi) + + with self.subTest(tzstr=tzstr, dt=dt, offset=offset): + self.assertEqual(dt.tzname(), offset.tzname) + self.assertEqual(dt.utcoffset(), offset.utcoffset) + self.assertEqual(dt.dst(), offset.dst) + + def test_tzstr_from_utc(self): + for tzstr, cases in self.test_cases.items(): + with self.subTest(tzstr=tzstr): + zi = self.zone_from_tzstr(tzstr) + + for dt_naive, offset, dt_type in cases: + if dt_type == self.GAP: + continue # Cannot create a gap from UTC + + dt_utc = (dt_naive - offset.utcoffset).replace( + tzinfo=timezone.utc + ) + + # Check that we can go UTC -> Our zone + dt_act = dt_utc.astimezone(zi) + dt_exp = dt_naive.replace(tzinfo=zi) + + self.assertEqual(dt_act, dt_exp) + + if dt_type == self.FOLD: + self.assertEqual(dt_act.fold, dt_naive.fold, dt_naive) + else: + self.assertEqual(dt_act.fold, 0) + + # Now check that we can go our zone -> UTC + dt_act = dt_exp.astimezone(timezone.utc) + + self.assertEqual(dt_act, dt_utc) + + def test_invalid_tzstr(self): + invalid_tzstrs = [ + "PST8PDT", # DST but no transition specified + "+11", # Unquoted alphanumeric + "GMT,M3.2.0/2,M11.1.0/3", # Transition rule but no DST + "GMT0+11,M3.2.0/2,M11.1.0/3", # Unquoted alphanumeric in DST + "PST8PDT,M3.2.0/2", # Only one transition rule + # Invalid offsets + "STD+25", + "STD-25", + "STD+374", + "STD+374DST,M3.2.0/2,M11.1.0/3", + "STD+23DST+25,M3.2.0/2,M11.1.0/3", + "STD-23DST-25,M3.2.0/2,M11.1.0/3", + # Completely invalid dates + "AAA4BBB,M1443339,M11.1.0/3", + "AAA4BBB,M3.2.0/2,0349309483959c", + # Invalid months + "AAA4BBB,M13.1.1/2,M1.1.1/2", + "AAA4BBB,M1.1.1/2,M13.1.1/2", + "AAA4BBB,M0.1.1/2,M1.1.1/2", + "AAA4BBB,M1.1.1/2,M0.1.1/2", + # Invalid weeks + "AAA4BBB,M1.6.1/2,M1.1.1/2", + "AAA4BBB,M1.1.1/2,M1.6.1/2", + # Invalid weekday + "AAA4BBB,M1.1.7/2,M2.1.1/2", + "AAA4BBB,M1.1.1/2,M2.1.7/2", + # Invalid numeric offset + "AAA4BBB,-1/2,20/2", + "AAA4BBB,1/2,-1/2", + "AAA4BBB,367,20/2", + "AAA4BBB,1/2,367/2", + # Invalid julian offset + "AAA4BBB,J0/2,J20/2", + "AAA4BBB,J20/2,J366/2", + ] + + for invalid_tzstr in invalid_tzstrs: + with self.subTest(tzstr=invalid_tzstr): + # Not necessarily a guaranteed property, but we should show + # the problematic TZ string if that's the cause of failure. + tzstr_regex = re.escape(invalid_tzstr) + with self.assertRaisesRegex(ValueError, tzstr_regex): + self.zone_from_tzstr(invalid_tzstr) + + @classmethod + def _populate_test_cases(cls): + # This method uses a somewhat unusual style in that it populates the + # test cases for each tzstr by using a decorator to automatically call + # a function that mutates the current dictionary of test cases. + # + # The population of the test cases is done in individual functions to + # give each set of test cases its own namespace in which to define + # its offsets (this way we don't have to worry about variable reuse + # causing problems if someone makes a typo). + # + # The decorator for calling is used to make it more obvious that each + # function is actually called (if it's not decorated, it's not called). + def call(f): + """Decorator to call the addition methods. + + This will call a function which adds at least one new entry into + the `cases` dictionary. The decorator will also assert that + something was added to the dictionary. + """ + prev_len = len(cases) + f() + assert len(cases) > prev_len, "Function did not add a test case!" + + NORMAL = cls.NORMAL + FOLD = cls.FOLD + GAP = cls.GAP + + cases = {} + + @call + def _add(): + # Transition to EDT on the 2nd Sunday in March at 4 AM, and + # transition back on the first Sunday in November at 3AM + tzstr = "EST5EDT,M3.2.0/4:00,M11.1.0/3:00" + + EST = ZoneOffset("EST", timedelta(hours=-5), ZERO) + EDT = ZoneOffset("EDT", timedelta(hours=-4), ONE_H) + + cases[tzstr] = ( + (datetime(2019, 3, 9), EST, NORMAL), + (datetime(2019, 3, 10, 3, 59), EST, NORMAL), + (datetime(2019, 3, 10, 4, 0, fold=0), EST, GAP), + (datetime(2019, 3, 10, 4, 0, fold=1), EDT, GAP), + (datetime(2019, 3, 10, 4, 1, fold=0), EST, GAP), + (datetime(2019, 3, 10, 4, 1, fold=1), EDT, GAP), + (datetime(2019, 11, 2), EDT, NORMAL), + (datetime(2019, 11, 3, 1, 59, fold=1), EDT, NORMAL), + (datetime(2019, 11, 3, 2, 0, fold=0), EDT, FOLD), + (datetime(2019, 11, 3, 2, 0, fold=1), EST, FOLD), + (datetime(2020, 3, 8, 3, 59), EST, NORMAL), + (datetime(2020, 3, 8, 4, 0, fold=0), EST, GAP), + (datetime(2020, 3, 8, 4, 0, fold=1), EDT, GAP), + (datetime(2020, 11, 1, 1, 59, fold=1), EDT, NORMAL), + (datetime(2020, 11, 1, 2, 0, fold=0), EDT, FOLD), + (datetime(2020, 11, 1, 2, 0, fold=1), EST, FOLD), + ) + + @call + def _add(): + # Transition to BST happens on the last Sunday in March at 1 AM GMT + # and the transition back happens the last Sunday in October at 2AM BST + tzstr = "GMT0BST-1,M3.5.0/1:00,M10.5.0/2:00" + + GMT = ZoneOffset("GMT", ZERO, ZERO) + BST = ZoneOffset("BST", ONE_H, ONE_H) + + cases[tzstr] = ( + (datetime(2019, 3, 30), GMT, NORMAL), + (datetime(2019, 3, 31, 0, 59), GMT, NORMAL), + (datetime(2019, 3, 31, 2, 0), BST, NORMAL), + (datetime(2019, 10, 26), BST, NORMAL), + (datetime(2019, 10, 27, 0, 59, fold=1), BST, NORMAL), + (datetime(2019, 10, 27, 1, 0, fold=0), BST, GAP), + (datetime(2019, 10, 27, 2, 0, fold=1), GMT, GAP), + (datetime(2020, 3, 29, 0, 59), GMT, NORMAL), + (datetime(2020, 3, 29, 2, 0), BST, NORMAL), + (datetime(2020, 10, 25, 0, 59, fold=1), BST, NORMAL), + (datetime(2020, 10, 25, 1, 0, fold=0), BST, FOLD), + (datetime(2020, 10, 25, 2, 0, fold=1), GMT, NORMAL), + ) + + @call + def _add(): + # Austrialian time zone - DST start is chronologically first + tzstr = "AEST-10AEDT,M10.1.0/2,M4.1.0/3" + + AEST = ZoneOffset("AEST", timedelta(hours=10), ZERO) + AEDT = ZoneOffset("AEDT", timedelta(hours=11), ONE_H) + + cases[tzstr] = ( + (datetime(2019, 4, 6), AEDT, NORMAL), + (datetime(2019, 4, 7, 1, 59), AEDT, NORMAL), + (datetime(2019, 4, 7, 1, 59, fold=1), AEDT, NORMAL), + (datetime(2019, 4, 7, 2, 0, fold=0), AEDT, FOLD), + (datetime(2019, 4, 7, 2, 1, fold=0), AEDT, FOLD), + (datetime(2019, 4, 7, 2, 0, fold=1), AEST, FOLD), + (datetime(2019, 4, 7, 2, 1, fold=1), AEST, FOLD), + (datetime(2019, 4, 7, 3, 0, fold=0), AEST, NORMAL), + (datetime(2019, 4, 7, 3, 0, fold=1), AEST, NORMAL), + (datetime(2019, 10, 5, 0), AEST, NORMAL), + (datetime(2019, 10, 6, 1, 59), AEST, NORMAL), + (datetime(2019, 10, 6, 2, 0, fold=0), AEST, GAP), + (datetime(2019, 10, 6, 2, 0, fold=1), AEDT, GAP), + (datetime(2019, 10, 6, 3, 0), AEDT, NORMAL), + ) + + @call + def _add(): + # Irish time zone - negative DST + tzstr = "IST-1GMT0,M10.5.0,M3.5.0/1" + + GMT = ZoneOffset("GMT", ZERO, -ONE_H) + IST = ZoneOffset("IST", ONE_H, ZERO) + + cases[tzstr] = ( + (datetime(2019, 3, 30), GMT, NORMAL), + (datetime(2019, 3, 31, 0, 59), GMT, NORMAL), + (datetime(2019, 3, 31, 2, 0), IST, NORMAL), + (datetime(2019, 10, 26), IST, NORMAL), + (datetime(2019, 10, 27, 0, 59, fold=1), IST, NORMAL), + (datetime(2019, 10, 27, 1, 0, fold=0), IST, FOLD), + (datetime(2019, 10, 27, 1, 0, fold=1), GMT, FOLD), + (datetime(2019, 10, 27, 2, 0, fold=1), GMT, NORMAL), + (datetime(2020, 3, 29, 0, 59), GMT, NORMAL), + (datetime(2020, 3, 29, 2, 0), IST, NORMAL), + (datetime(2020, 10, 25, 0, 59, fold=1), IST, NORMAL), + (datetime(2020, 10, 25, 1, 0, fold=0), IST, FOLD), + (datetime(2020, 10, 25, 2, 0, fold=1), GMT, NORMAL), + ) + + @call + def _add(): + # Pacific/Kosrae: Fixed offset zone with a quoted numerical tzname + tzstr = "<+11>-11" + + cases[tzstr] = ( + ( + datetime(2020, 1, 1), + ZoneOffset("+11", timedelta(hours=11)), + NORMAL, + ), + ) + + @call + def _add(): + # Quoted STD and DST, transitions at 24:00 + tzstr = "<-04>4<-03>,M9.1.6/24,M4.1.6/24" + + M04 = ZoneOffset("-04", timedelta(hours=-4)) + M03 = ZoneOffset("-03", timedelta(hours=-3), ONE_H) + + cases[tzstr] = ( + (datetime(2020, 5, 1), M04, NORMAL), + (datetime(2020, 11, 1), M03, NORMAL), + ) + + @call + def _add(): + # Permanent daylight saving time is modeled with transitions at 0/0 + # and J365/25, as mentioned in RFC 8536 Section 3.3.1 + tzstr = "EST5EDT,0/0,J365/25" + + EDT = ZoneOffset("EDT", timedelta(hours=-4), ONE_H) + + cases[tzstr] = ( + (datetime(2019, 1, 1), EDT, NORMAL), + (datetime(2019, 6, 1), EDT, NORMAL), + (datetime(2019, 12, 31, 23, 59, 59, 999999), EDT, NORMAL), + (datetime(2020, 1, 1), EDT, NORMAL), + (datetime(2020, 3, 1), EDT, NORMAL), + (datetime(2020, 6, 1), EDT, NORMAL), + (datetime(2020, 12, 31, 23, 59, 59, 999999), EDT, NORMAL), + (datetime(2400, 1, 1), EDT, NORMAL), + (datetime(2400, 3, 1), EDT, NORMAL), + (datetime(2400, 12, 31, 23, 59, 59, 999999), EDT, NORMAL), + ) + + @call + def _add(): + # Transitions on March 1st and November 1st of each year + tzstr = "AAA3BBB,J60/12,J305/12" + + AAA = ZoneOffset("AAA", timedelta(hours=-3)) + BBB = ZoneOffset("BBB", timedelta(hours=-2), ONE_H) + + cases[tzstr] = ( + (datetime(2019, 1, 1), AAA, NORMAL), + (datetime(2019, 2, 28), AAA, NORMAL), + (datetime(2019, 3, 1, 11, 59), AAA, NORMAL), + (datetime(2019, 3, 1, 12, fold=0), AAA, GAP), + (datetime(2019, 3, 1, 12, fold=1), BBB, GAP), + (datetime(2019, 3, 1, 13), BBB, NORMAL), + (datetime(2019, 11, 1, 10, 59), BBB, NORMAL), + (datetime(2019, 11, 1, 11, fold=0), BBB, FOLD), + (datetime(2019, 11, 1, 11, fold=1), AAA, FOLD), + (datetime(2019, 11, 1, 12), AAA, NORMAL), + (datetime(2019, 12, 31, 23, 59, 59, 999999), AAA, NORMAL), + (datetime(2020, 1, 1), AAA, NORMAL), + (datetime(2020, 2, 29), AAA, NORMAL), + (datetime(2020, 3, 1, 11, 59), AAA, NORMAL), + (datetime(2020, 3, 1, 12, fold=0), AAA, GAP), + (datetime(2020, 3, 1, 12, fold=1), BBB, GAP), + (datetime(2020, 3, 1, 13), BBB, NORMAL), + (datetime(2020, 11, 1, 10, 59), BBB, NORMAL), + (datetime(2020, 11, 1, 11, fold=0), BBB, FOLD), + (datetime(2020, 11, 1, 11, fold=1), AAA, FOLD), + (datetime(2020, 11, 1, 12), AAA, NORMAL), + (datetime(2020, 12, 31, 23, 59, 59, 999999), AAA, NORMAL), + ) + + @call + def _add(): + # Taken from America/Godthab, this rule has a transition on the + # Saturday before the last Sunday of March and October, at 22:00 + # and 23:00, respectively. This is encoded with negative start + # and end transition times. + tzstr = "<-03>3<-02>,M3.5.0/-2,M10.5.0/-1" + + N03 = ZoneOffset("-03", timedelta(hours=-3)) + N02 = ZoneOffset("-02", timedelta(hours=-2), ONE_H) + + cases[tzstr] = ( + (datetime(2020, 3, 27), N03, NORMAL), + (datetime(2020, 3, 28, 21, 59, 59), N03, NORMAL), + (datetime(2020, 3, 28, 22, fold=0), N03, GAP), + (datetime(2020, 3, 28, 22, fold=1), N02, GAP), + (datetime(2020, 3, 28, 23), N02, NORMAL), + (datetime(2020, 10, 24, 21), N02, NORMAL), + (datetime(2020, 10, 24, 22, fold=0), N02, FOLD), + (datetime(2020, 10, 24, 22, fold=1), N03, FOLD), + (datetime(2020, 10, 24, 23), N03, NORMAL), + ) + + @call + def _add(): + # Transition times with minutes and seconds + tzstr = "AAA3BBB,M3.2.0/01:30,M11.1.0/02:15:45" + + AAA = ZoneOffset("AAA", timedelta(hours=-3)) + BBB = ZoneOffset("BBB", timedelta(hours=-2), ONE_H) + + cases[tzstr] = ( + (datetime(2012, 3, 11, 1, 0), AAA, NORMAL), + (datetime(2012, 3, 11, 1, 30, fold=0), AAA, GAP), + (datetime(2012, 3, 11, 1, 30, fold=1), BBB, GAP), + (datetime(2012, 3, 11, 2, 30), BBB, NORMAL), + (datetime(2012, 11, 4, 1, 15, 44, 999999), BBB, NORMAL), + (datetime(2012, 11, 4, 1, 15, 45, fold=0), BBB, FOLD), + (datetime(2012, 11, 4, 1, 15, 45, fold=1), AAA, FOLD), + (datetime(2012, 11, 4, 2, 15, 45), AAA, NORMAL), + ) + + cls.test_cases = cases + + +class CTZStrTest(TZStrTest): + module = c_zoneinfo + + +class ZoneInfoCacheTest(TzPathUserMixin, ZoneInfoTestBase): + module = py_zoneinfo + + def setUp(self): + self.klass.clear_cache() + super().setUp() + + @property + def zoneinfo_data(self): + return ZONEINFO_DATA + + @property + def tzpath(self): + return [self.zoneinfo_data.tzpath] + + def test_ephemeral_zones(self): + self.assertIs( + self.klass("America/Los_Angeles"), self.klass("America/Los_Angeles") + ) + + def test_strong_refs(self): + tz0 = self.klass("Australia/Sydney") + tz1 = self.klass("Australia/Sydney") + + self.assertIs(tz0, tz1) + + def test_no_cache(self): + + tz0 = self.klass("Europe/Lisbon") + tz1 = self.klass.no_cache("Europe/Lisbon") + + self.assertIsNot(tz0, tz1) + + def test_cache_reset_tzpath(self): + """Test that the cache persists when tzpath has been changed. + + The PEP specifies that as long as a reference exists to one zone + with a given key, the primary constructor must continue to return + the same object. + """ + zi0 = self.klass("America/Los_Angeles") + with self.tzpath_context([]): + zi1 = self.klass("America/Los_Angeles") + + self.assertIs(zi0, zi1) + + def test_clear_cache_explicit_none(self): + la0 = self.klass("America/Los_Angeles") + self.klass.clear_cache(only_keys=None) + la1 = self.klass("America/Los_Angeles") + + self.assertIsNot(la0, la1) + + def test_clear_cache_one_key(self): + """Tests that you can clear a single key from the cache.""" + la0 = self.klass("America/Los_Angeles") + dub0 = self.klass("Europe/Dublin") + + self.klass.clear_cache(only_keys=["America/Los_Angeles"]) + + la1 = self.klass("America/Los_Angeles") + dub1 = self.klass("Europe/Dublin") + + self.assertIsNot(la0, la1) + self.assertIs(dub0, dub1) + + def test_clear_cache_two_keys(self): + la0 = self.klass("America/Los_Angeles") + dub0 = self.klass("Europe/Dublin") + tok0 = self.klass("Asia/Tokyo") + + self.klass.clear_cache( + only_keys=["America/Los_Angeles", "Europe/Dublin"] + ) + + la1 = self.klass("America/Los_Angeles") + dub1 = self.klass("Europe/Dublin") + tok1 = self.klass("Asia/Tokyo") + + self.assertIsNot(la0, la1) + self.assertIsNot(dub0, dub1) + self.assertIs(tok0, tok1) + + +class CZoneInfoCacheTest(ZoneInfoCacheTest): + module = c_zoneinfo + + +class ZoneInfoPickleTest(TzPathUserMixin, ZoneInfoTestBase): + module = py_zoneinfo + + def setUp(self): + self.klass.clear_cache() + + with contextlib.ExitStack() as stack: + stack.enter_context(test_support.set_zoneinfo_module(self.module)) + self.addCleanup(stack.pop_all().close) + + super().setUp() + + @property + def zoneinfo_data(self): + return ZONEINFO_DATA + + @property + def tzpath(self): + return [self.zoneinfo_data.tzpath] + + def test_cache_hit(self): + zi_in = self.klass("Europe/Dublin") + pkl = pickle.dumps(zi_in) + zi_rt = pickle.loads(pkl) + + with self.subTest(test="Is non-pickled ZoneInfo"): + self.assertIs(zi_in, zi_rt) + + zi_rt2 = pickle.loads(pkl) + with self.subTest(test="Is unpickled ZoneInfo"): + self.assertIs(zi_rt, zi_rt2) + + def test_cache_miss(self): + zi_in = self.klass("Europe/Dublin") + pkl = pickle.dumps(zi_in) + + del zi_in + self.klass.clear_cache() # Induce a cache miss + zi_rt = pickle.loads(pkl) + zi_rt2 = pickle.loads(pkl) + + self.assertIs(zi_rt, zi_rt2) + + def test_no_cache(self): + zi_no_cache = self.klass.no_cache("Europe/Dublin") + + pkl = pickle.dumps(zi_no_cache) + zi_rt = pickle.loads(pkl) + + with self.subTest(test="Not the pickled object"): + self.assertIsNot(zi_rt, zi_no_cache) + + zi_rt2 = pickle.loads(pkl) + with self.subTest(test="Not a second unpickled object"): + self.assertIsNot(zi_rt, zi_rt2) + + zi_cache = self.klass("Europe/Dublin") + with self.subTest(test="Not a cached object"): + self.assertIsNot(zi_rt, zi_cache) + + def test_from_file(self): + key = "Europe/Dublin" + with open(self.zoneinfo_data.path_from_key(key), "rb") as f: + zi_nokey = self.klass.from_file(f) + + f.seek(0) + zi_key = self.klass.from_file(f, key=key) + + test_cases = [ + (zi_key, "ZoneInfo with key"), + (zi_nokey, "ZoneInfo without key"), + ] + + for zi, test_name in test_cases: + with self.subTest(test_name=test_name): + with self.assertRaises(pickle.PicklingError): + pickle.dumps(zi) + + def test_pickle_after_from_file(self): + # This may be a bit of paranoia, but this test is to ensure that no + # global state is maintained in order to handle the pickle cache and + # from_file behavior, and that it is possible to interweave the + # constructors of each of these and pickling/unpickling without issues. + key = "Europe/Dublin" + zi = self.klass(key) + + pkl_0 = pickle.dumps(zi) + zi_rt_0 = pickle.loads(pkl_0) + self.assertIs(zi, zi_rt_0) + + with open(self.zoneinfo_data.path_from_key(key), "rb") as f: + zi_ff = self.klass.from_file(f, key=key) + + pkl_1 = pickle.dumps(zi) + zi_rt_1 = pickle.loads(pkl_1) + self.assertIs(zi, zi_rt_1) + + with self.assertRaises(pickle.PicklingError): + pickle.dumps(zi_ff) + + pkl_2 = pickle.dumps(zi) + zi_rt_2 = pickle.loads(pkl_2) + self.assertIs(zi, zi_rt_2) + + +class CZoneInfoPickleTest(ZoneInfoPickleTest): + module = c_zoneinfo + + +class CallingConventionTest(ZoneInfoTestBase): + """Tests for functions with restricted calling conventions.""" + + module = py_zoneinfo + + @property + def zoneinfo_data(self): + return ZONEINFO_DATA + + def test_from_file(self): + with open(self.zoneinfo_data.path_from_key("UTC"), "rb") as f: + with self.assertRaises(TypeError): + self.klass.from_file(fobj=f) + + def test_clear_cache(self): + with self.assertRaises(TypeError): + self.klass.clear_cache(["UTC"]) + + +class CCallingConventionTest(CallingConventionTest): + module = c_zoneinfo + + +class TzPathTest(TzPathUserMixin, ZoneInfoTestBase): + module = py_zoneinfo + + @staticmethod + @contextlib.contextmanager + def python_tzpath_context(value): + path_var = "PYTHONTZPATH" + try: + with OS_ENV_LOCK: + old_env = os.environ.get(path_var, None) + os.environ[path_var] = value + yield + finally: + if old_env is None: + del os.environ[path_var] + else: + os.environ[path_var] = old_env # pragma: nocover + + def test_env_variable(self): + """Tests that the environment variable works with reset_tzpath.""" + new_paths = [ + ("", []), + ("/etc/zoneinfo", ["/etc/zoneinfo"]), + (f"/a/b/c{os.pathsep}/d/e/f", ["/a/b/c", "/d/e/f"]), + ] + + for new_path_var, expected_result in new_paths: + with self.python_tzpath_context(new_path_var): + with self.subTest(tzpath=new_path_var): + self.module.reset_tzpath() + tzpath = self.module.TZPATH + self.assertSequenceEqual(tzpath, expected_result) + + def test_env_variable_relative_paths(self): + test_cases = [ + [("path/to/somewhere",), ()], + [ + ("/usr/share/zoneinfo", "path/to/somewhere",), + ("/usr/share/zoneinfo",), + ], + [("../relative/path",), ()], + [ + ("/usr/share/zoneinfo", "../relative/path",), + ("/usr/share/zoneinfo",), + ], + [("path/to/somewhere", "../relative/path",), ()], + [ + ( + "/usr/share/zoneinfo", + "path/to/somewhere", + "../relative/path", + ), + ("/usr/share/zoneinfo",), + ], + ] + + for input_paths, expected_paths in test_cases: + path_var = os.pathsep.join(input_paths) + with self.python_tzpath_context(path_var): + with self.subTest("warning", path_var=path_var): + # Note: Per PEP 615 the warning is implementation-defined + # behavior, other implementations need not warn. + with self.assertWarns(self.module.InvalidTZPathWarning): + self.module.reset_tzpath() + + tzpath = self.module.TZPATH + with self.subTest("filtered", path_var=path_var): + self.assertSequenceEqual(tzpath, expected_paths) + + def test_reset_tzpath_kwarg(self): + self.module.reset_tzpath(to=["/a/b/c"]) + + self.assertSequenceEqual(self.module.TZPATH, ("/a/b/c",)) + + def test_reset_tzpath_relative_paths(self): + bad_values = [ + ("path/to/somewhere",), + ("/usr/share/zoneinfo", "path/to/somewhere",), + ("../relative/path",), + ("/usr/share/zoneinfo", "../relative/path",), + ("path/to/somewhere", "../relative/path",), + ("/usr/share/zoneinfo", "path/to/somewhere", "../relative/path",), + ] + for input_paths in bad_values: + with self.subTest(input_paths=input_paths): + with self.assertRaises(ValueError): + self.module.reset_tzpath(to=input_paths) + + def test_tzpath_type_error(self): + bad_values = [ + "/etc/zoneinfo:/usr/share/zoneinfo", + b"/etc/zoneinfo:/usr/share/zoneinfo", + 0, + ] + + for bad_value in bad_values: + with self.subTest(value=bad_value): + with self.assertRaises(TypeError): + self.module.reset_tzpath(bad_value) + + def test_tzpath_attribute(self): + tzpath_0 = ["/one", "/two"] + tzpath_1 = ["/three"] + + with self.tzpath_context(tzpath_0): + query_0 = self.module.TZPATH + + with self.tzpath_context(tzpath_1): + query_1 = self.module.TZPATH + + self.assertSequenceEqual(tzpath_0, query_0) + self.assertSequenceEqual(tzpath_1, query_1) + + +class CTzPathTest(TzPathTest): + module = c_zoneinfo + + +class TestModule(ZoneInfoTestBase): + module = py_zoneinfo + + @property + def zoneinfo_data(self): + return ZONEINFO_DATA + + @cached_property + def _UTC_bytes(self): + zone_file = self.zoneinfo_data.path_from_key("UTC") + with open(zone_file, "rb") as f: + return f.read() + + def touch_zone(self, key, tz_root): + """Creates a valid TZif file at key under the zoneinfo root tz_root. + + tz_root must exist, but all folders below that will be created. + """ + if not os.path.exists(tz_root): + raise FileNotFoundError(f"{tz_root} does not exist.") + + root_dir, *tail = key.rsplit("/", 1) + if tail: # If there's no tail, then the first component isn't a dir + os.makedirs(os.path.join(tz_root, root_dir), exist_ok=True) + + zonefile_path = os.path.join(tz_root, key) + with open(zonefile_path, "wb") as f: + f.write(self._UTC_bytes) + + def test_getattr_error(self): + with self.assertRaises(AttributeError): + self.module.NOATTRIBUTE + + def test_dir_contains_all(self): + """dir(self.module) should at least contain everything in __all__.""" + module_all_set = set(self.module.__all__) + module_dir_set = set(dir(self.module)) + + difference = module_all_set - module_dir_set + + self.assertFalse(difference) + + def test_dir_unique(self): + """Test that there are no duplicates in dir(self.module)""" + module_dir = dir(self.module) + module_unique = set(module_dir) + + self.assertCountEqual(module_dir, module_unique) + + def test_available_timezones(self): + with self.tzpath_context([self.zoneinfo_data.tzpath]): + self.assertTrue(self.zoneinfo_data.keys) # Sanity check + + available_keys = self.module.available_timezones() + zoneinfo_keys = set(self.zoneinfo_data.keys) + + # If tzdata is not present, zoneinfo_keys == available_keys, + # otherwise it should be a subset. + union = zoneinfo_keys & available_keys + self.assertEqual(zoneinfo_keys, union) + + def test_available_timezones_weirdzone(self): + with tempfile.TemporaryDirectory() as td: + # Make a fictional zone at "Mars/Olympus_Mons" + self.touch_zone("Mars/Olympus_Mons", td) + + with self.tzpath_context([td]): + available_keys = self.module.available_timezones() + self.assertIn("Mars/Olympus_Mons", available_keys) + + def test_folder_exclusions(self): + expected = { + "America/Los_Angeles", + "America/Santiago", + "America/Indiana/Indianapolis", + "UTC", + "Europe/Paris", + "Europe/London", + "Asia/Tokyo", + "Australia/Sydney", + } + + base_tree = list(expected) + posix_tree = [f"posix/{x}" for x in base_tree] + right_tree = [f"right/{x}" for x in base_tree] + + cases = [ + ("base_tree", base_tree), + ("base_and_posix", base_tree + posix_tree), + ("base_and_right", base_tree + right_tree), + ("all_trees", base_tree + right_tree + posix_tree), + ] + + with tempfile.TemporaryDirectory() as td: + for case_name, tree in cases: + tz_root = os.path.join(td, case_name) + os.mkdir(tz_root) + + for key in tree: + self.touch_zone(key, tz_root) + + with self.tzpath_context([tz_root]): + with self.subTest(case_name): + actual = self.module.available_timezones() + self.assertEqual(actual, expected) + + def test_exclude_posixrules(self): + expected = { + "America/New_York", + "Europe/London", + } + + tree = list(expected) + ["posixrules"] + + with tempfile.TemporaryDirectory() as td: + for key in tree: + self.touch_zone(key, td) + + with self.tzpath_context([td]): + actual = self.module.available_timezones() + self.assertEqual(actual, expected) + + +class CTestModule(TestModule): + module = c_zoneinfo + + +class ExtensionBuiltTest(unittest.TestCase): + """Smoke test to ensure that the C and Python extensions are both tested. + + Because the intention is for the Python and C versions of ZoneInfo to + behave identically, these tests necessarily rely on implementation details, + so the tests may need to be adjusted if the implementations change. Do not + rely on these tests as an indication of stable properties of these classes. + """ + + def test_cache_location(self): + # The pure Python version stores caches on attributes, but the C + # extension stores them in C globals (at least for now) + self.assertFalse(hasattr(c_zoneinfo.ZoneInfo, "_weak_cache")) + self.assertTrue(hasattr(py_zoneinfo.ZoneInfo, "_weak_cache")) + + def test_gc_tracked(self): + # The pure Python version is tracked by the GC but (for now) the C + # version is not. + import gc + + self.assertTrue(gc.is_tracked(py_zoneinfo.ZoneInfo)) + self.assertFalse(gc.is_tracked(c_zoneinfo.ZoneInfo)) + + +@dataclasses.dataclass(frozen=True) +class ZoneOffset: + tzname: str + utcoffset: timedelta + dst: timedelta = ZERO + + +@dataclasses.dataclass(frozen=True) +class ZoneTransition: + transition: datetime + offset_before: ZoneOffset + offset_after: ZoneOffset + + @property + def transition_utc(self): + return (self.transition - self.offset_before.utcoffset).replace( + tzinfo=timezone.utc + ) + + @property + def fold(self): + """Whether this introduces a fold""" + return self.offset_before.utcoffset > self.offset_after.utcoffset + + @property + def gap(self): + """Whether this introduces a gap""" + return self.offset_before.utcoffset < self.offset_after.utcoffset + + @property + def delta(self): + return self.offset_after.utcoffset - self.offset_before.utcoffset + + @property + def anomaly_start(self): + if self.fold: + return self.transition + self.delta + else: + return self.transition + + @property + def anomaly_end(self): + if not self.fold: + return self.transition + self.delta + else: + return self.transition + + +class ZoneInfoData: + def __init__(self, source_json, tzpath, v1=False): + self.tzpath = pathlib.Path(tzpath) + self.keys = [] + self.v1 = v1 + self._populate_tzpath(source_json) + + def path_from_key(self, key): + return self.tzpath / key + + def _populate_tzpath(self, source_json): + with open(source_json, "rb") as f: + zoneinfo_dict = json.load(f) + + zoneinfo_data = zoneinfo_dict["data"] + + for key, value in zoneinfo_data.items(): + self.keys.append(key) + raw_data = self._decode_text(value) + + if self.v1: + data = self._convert_to_v1(raw_data) + else: + data = raw_data + + destination = self.path_from_key(key) + destination.parent.mkdir(exist_ok=True, parents=True) + with open(destination, "wb") as f: + f.write(data) + + def _decode_text(self, contents): + raw_data = b"".join(map(str.encode, contents)) + decoded = base64.b85decode(raw_data) + + return lzma.decompress(decoded) + + def _convert_to_v1(self, contents): + assert contents[0:4] == b"TZif", "Invalid TZif data found!" + version = int(contents[4:5]) + + header_start = 4 + 16 + header_end = header_start + 24 # 6l == 24 bytes + assert version >= 2, "Version 1 file found: no conversion necessary" + isutcnt, isstdcnt, leapcnt, timecnt, typecnt, charcnt = struct.unpack( + ">6l", contents[header_start:header_end] + ) + + file_size = ( + timecnt * 5 + + typecnt * 6 + + charcnt + + leapcnt * 8 + + isstdcnt + + isutcnt + ) + file_size += header_end + out = b"TZif" + b"\x00" + contents[5:file_size] + + assert ( + contents[file_size : (file_size + 4)] == b"TZif" + ), "Version 2 file not truncated at Version 2 header" + + return out + + +class ZoneDumpData: + @classmethod + def transition_keys(cls): + return cls._get_zonedump().keys() + + @classmethod + def load_transition_examples(cls, key): + return cls._get_zonedump()[key] + + @classmethod + def fixed_offset_zones(cls): + if not cls._FIXED_OFFSET_ZONES: + cls._populate_fixed_offsets() + + return cls._FIXED_OFFSET_ZONES.items() + + @classmethod + def _get_zonedump(cls): + if not cls._ZONEDUMP_DATA: + cls._populate_zonedump_data() + return cls._ZONEDUMP_DATA + + @classmethod + def _populate_fixed_offsets(cls): + cls._FIXED_OFFSET_ZONES = { + "UTC": ZoneOffset("UTC", ZERO, ZERO), + } + + @classmethod + def _populate_zonedump_data(cls): + def _Africa_Abidjan(): + LMT = ZoneOffset("LMT", timedelta(seconds=-968)) + GMT = ZoneOffset("GMT", ZERO) + + return [ + ZoneTransition(datetime(1912, 1, 1), LMT, GMT), + ] + + def _Africa_Casablanca(): + P00_s = ZoneOffset("+00", ZERO, ZERO) + P01_d = ZoneOffset("+01", ONE_H, ONE_H) + P00_d = ZoneOffset("+00", ZERO, -ONE_H) + P01_s = ZoneOffset("+01", ONE_H, ZERO) + + return [ + # Morocco sometimes pauses DST during Ramadan + ZoneTransition(datetime(2018, 3, 25, 2), P00_s, P01_d), + ZoneTransition(datetime(2018, 5, 13, 3), P01_d, P00_s), + ZoneTransition(datetime(2018, 6, 17, 2), P00_s, P01_d), + # On October 28th Morocco set standard time to +01, + # with negative DST only during Ramadan + ZoneTransition(datetime(2018, 10, 28, 3), P01_d, P01_s), + ZoneTransition(datetime(2019, 5, 5, 3), P01_s, P00_d), + ZoneTransition(datetime(2019, 6, 9, 2), P00_d, P01_s), + ] + + def _America_Los_Angeles(): + LMT = ZoneOffset("LMT", timedelta(seconds=-28378), ZERO) + PST = ZoneOffset("PST", timedelta(hours=-8), ZERO) + PDT = ZoneOffset("PDT", timedelta(hours=-7), ONE_H) + PWT = ZoneOffset("PWT", timedelta(hours=-7), ONE_H) + PPT = ZoneOffset("PPT", timedelta(hours=-7), ONE_H) + + return [ + ZoneTransition(datetime(1883, 11, 18, 12, 7, 2), LMT, PST), + ZoneTransition(datetime(1918, 3, 31, 2), PST, PDT), + ZoneTransition(datetime(1918, 3, 31, 2), PST, PDT), + ZoneTransition(datetime(1918, 10, 27, 2), PDT, PST), + # Transition to Pacific War Time + ZoneTransition(datetime(1942, 2, 9, 2), PST, PWT), + # Transition from Pacific War Time to Pacific Peace Time + ZoneTransition(datetime(1945, 8, 14, 16), PWT, PPT), + ZoneTransition(datetime(1945, 9, 30, 2), PPT, PST), + ZoneTransition(datetime(2015, 3, 8, 2), PST, PDT), + ZoneTransition(datetime(2015, 11, 1, 2), PDT, PST), + # After 2038: Rules continue indefinitely + ZoneTransition(datetime(2450, 3, 13, 2), PST, PDT), + ZoneTransition(datetime(2450, 11, 6, 2), PDT, PST), + ] + + def _America_Santiago(): + LMT = ZoneOffset("LMT", timedelta(seconds=-16966), ZERO) + SMT = ZoneOffset("SMT", timedelta(seconds=-16966), ZERO) + N05 = ZoneOffset("-05", timedelta(seconds=-18000), ZERO) + N04 = ZoneOffset("-04", timedelta(seconds=-14400), ZERO) + N03 = ZoneOffset("-03", timedelta(seconds=-10800), ONE_H) + + return [ + ZoneTransition(datetime(1890, 1, 1), LMT, SMT), + ZoneTransition(datetime(1910, 1, 10), SMT, N05), + ZoneTransition(datetime(1916, 7, 1), N05, SMT), + ZoneTransition(datetime(2008, 3, 30), N03, N04), + ZoneTransition(datetime(2008, 10, 12), N04, N03), + ZoneTransition(datetime(2040, 4, 8), N03, N04), + ZoneTransition(datetime(2040, 9, 2), N04, N03), + ] + + def _Asia_Tokyo(): + JST = ZoneOffset("JST", timedelta(seconds=32400), ZERO) + JDT = ZoneOffset("JDT", timedelta(seconds=36000), ONE_H) + + # Japan had DST from 1948 to 1951, and it was unusual in that + # the transition from DST to STD occurred at 25:00, and is + # denominated as such in the time zone database + return [ + ZoneTransition(datetime(1948, 5, 2), JST, JDT), + ZoneTransition(datetime(1948, 9, 12, 1), JDT, JST), + ZoneTransition(datetime(1951, 9, 9, 1), JDT, JST), + ] + + def _Australia_Sydney(): + LMT = ZoneOffset("LMT", timedelta(seconds=36292), ZERO) + AEST = ZoneOffset("AEST", timedelta(seconds=36000), ZERO) + AEDT = ZoneOffset("AEDT", timedelta(seconds=39600), ONE_H) + + return [ + ZoneTransition(datetime(1895, 2, 1), LMT, AEST), + ZoneTransition(datetime(1917, 1, 1, 0, 1), AEST, AEDT), + ZoneTransition(datetime(1917, 3, 25, 2), AEDT, AEST), + ZoneTransition(datetime(2012, 4, 1, 3), AEDT, AEST), + ZoneTransition(datetime(2012, 10, 7, 2), AEST, AEDT), + ZoneTransition(datetime(2040, 4, 1, 3), AEDT, AEST), + ZoneTransition(datetime(2040, 10, 7, 2), AEST, AEDT), + ] + + def _Europe_Dublin(): + LMT = ZoneOffset("LMT", timedelta(seconds=-1500), ZERO) + DMT = ZoneOffset("DMT", timedelta(seconds=-1521), ZERO) + IST_0 = ZoneOffset("IST", timedelta(seconds=2079), ONE_H) + GMT_0 = ZoneOffset("GMT", ZERO, ZERO) + BST = ZoneOffset("BST", ONE_H, ONE_H) + GMT_1 = ZoneOffset("GMT", ZERO, -ONE_H) + IST_1 = ZoneOffset("IST", ONE_H, ZERO) + + return [ + ZoneTransition(datetime(1880, 8, 2, 0), LMT, DMT), + ZoneTransition(datetime(1916, 5, 21, 2), DMT, IST_0), + ZoneTransition(datetime(1916, 10, 1, 3), IST_0, GMT_0), + ZoneTransition(datetime(1917, 4, 8, 2), GMT_0, BST), + ZoneTransition(datetime(2016, 3, 27, 1), GMT_1, IST_1), + ZoneTransition(datetime(2016, 10, 30, 2), IST_1, GMT_1), + ZoneTransition(datetime(2487, 3, 30, 1), GMT_1, IST_1), + ZoneTransition(datetime(2487, 10, 26, 2), IST_1, GMT_1), + ] + + def _Europe_Lisbon(): + WET = ZoneOffset("WET", ZERO, ZERO) + WEST = ZoneOffset("WEST", ONE_H, ONE_H) + CET = ZoneOffset("CET", ONE_H, ZERO) + CEST = ZoneOffset("CEST", timedelta(seconds=7200), ONE_H) + + return [ + ZoneTransition(datetime(1992, 3, 29, 1), WET, WEST), + ZoneTransition(datetime(1992, 9, 27, 2), WEST, CET), + ZoneTransition(datetime(1993, 3, 28, 2), CET, CEST), + ZoneTransition(datetime(1993, 9, 26, 3), CEST, CET), + ZoneTransition(datetime(1996, 3, 31, 2), CET, WEST), + ZoneTransition(datetime(1996, 10, 27, 2), WEST, WET), + ] + + def _Europe_London(): + LMT = ZoneOffset("LMT", timedelta(seconds=-75), ZERO) + GMT = ZoneOffset("GMT", ZERO, ZERO) + BST = ZoneOffset("BST", ONE_H, ONE_H) + + return [ + ZoneTransition(datetime(1847, 12, 1), LMT, GMT), + ZoneTransition(datetime(2005, 3, 27, 1), GMT, BST), + ZoneTransition(datetime(2005, 10, 30, 2), BST, GMT), + ZoneTransition(datetime(2043, 3, 29, 1), GMT, BST), + ZoneTransition(datetime(2043, 10, 25, 2), BST, GMT), + ] + + def _Pacific_Kiritimati(): + LMT = ZoneOffset("LMT", timedelta(seconds=-37760), ZERO) + N1040 = ZoneOffset("-1040", timedelta(seconds=-38400), ZERO) + N10 = ZoneOffset("-10", timedelta(seconds=-36000), ZERO) + P14 = ZoneOffset("+14", timedelta(seconds=50400), ZERO) + + # This is literally every transition in Christmas Island history + return [ + ZoneTransition(datetime(1901, 1, 1), LMT, N1040), + ZoneTransition(datetime(1979, 10, 1), N1040, N10), + # They skipped December 31, 1994 + ZoneTransition(datetime(1994, 12, 31), N10, P14), + ] + + cls._ZONEDUMP_DATA = { + "Africa/Abidjan": _Africa_Abidjan(), + "Africa/Casablanca": _Africa_Casablanca(), + "America/Los_Angeles": _America_Los_Angeles(), + "America/Santiago": _America_Santiago(), + "Australia/Sydney": _Australia_Sydney(), + "Asia/Tokyo": _Asia_Tokyo(), + "Europe/Dublin": _Europe_Dublin(), + "Europe/Lisbon": _Europe_Lisbon(), + "Europe/London": _Europe_London(), + "Pacific/Kiritimati": _Pacific_Kiritimati(), + } + + _ZONEDUMP_DATA = None + _FIXED_OFFSET_ZONES = None diff --git a/Lib/test/threaded_import_hangers.py b/Lib/test/threaded_import_hangers.py deleted file mode 100644 index 5484e60a..00000000 --- a/Lib/test/threaded_import_hangers.py +++ /dev/null @@ -1,45 +0,0 @@ -# This is a helper module for test_threaded_import. The test imports this -# module, and this module tries to run various Python library functions in -# their own thread, as a side effect of being imported. If the spawned -# thread doesn't complete in TIMEOUT seconds, an "appeared to hang" message -# is appended to the module-global `errors` list. That list remains empty -# if (and only if) all functions tested complete. - -TIMEOUT = 10 - -import threading - -import tempfile -import os.path - -errors = [] - -# This class merely runs a function in its own thread T. The thread importing -# this module holds the import lock, so if the function called by T tries -# to do its own imports it will block waiting for this module's import -# to complete. -class Worker(threading.Thread): - def __init__(self, function, args): - threading.Thread.__init__(self) - self.function = function - self.args = args - - def run(self): - self.function(*self.args) - -for name, func, args in [ - # Bug 147376: TemporaryFile hung on Windows, starting in Python 2.4. - ("tempfile.TemporaryFile", lambda: tempfile.TemporaryFile().close(), ()), - - # The real cause for bug 147376: ntpath.abspath() caused the hang. - ("os.path.abspath", os.path.abspath, ('.',)), - ]: - - try: - t = Worker(func, args) - t.start() - t.join(TIMEOUT) - if t.is_alive(): - errors.append("%s appeared to hang" % name) - finally: - del t diff --git a/Lib/threading.py b/Lib/threading.py index 813dae2a..ab29db77 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -3,6 +3,7 @@ import os as _os import sys as _sys import _thread +import functools from time import monotonic as _time from _weakrefset import WeakSet @@ -121,6 +122,11 @@ class _RLock: hex(id(self)) ) + def _at_fork_reinit(self): + self._block._at_fork_reinit() + self._owner = None + self._count = 0 + def acquire(self, blocking=True, timeout=-1): """Acquire a lock, blocking or non-blocking. @@ -243,6 +249,10 @@ class Condition: pass self._waiters = _deque() + def _at_fork_reinit(self): + self._lock._at_fork_reinit() + self._waiters.clear() + def __enter__(self): return self._lock.__enter__() @@ -261,7 +271,7 @@ class Condition: def _is_owned(self): # Return True if lock is owned by current_thread. # This method is called only if _lock doesn't have _is_owned(). - if self._lock.acquire(0): + if self._lock.acquire(False): self._lock.release() return False else: @@ -438,16 +448,19 @@ class Semaphore: __enter__ = acquire - def release(self): - """Release a semaphore, incrementing the internal counter by one. + def release(self, n=1): + """Release a semaphore, incrementing the internal counter by one or more. When the counter is zero on entry and another thread is waiting for it to become larger than zero again, wake up that thread. """ + if n < 1: + raise ValueError('n must be one or more') with self._cond: - self._value += 1 - self._cond.notify() + self._value += n + for i in range(n): + self._cond.notify() def __exit__(self, t, v, tb): self.release() @@ -474,8 +487,8 @@ class BoundedSemaphore(Semaphore): Semaphore.__init__(self, value) self._initial_value = value - def release(self): - """Release a semaphore, incrementing the internal counter by one. + def release(self, n=1): + """Release a semaphore, incrementing the internal counter by one or more. When the counter is zero on entry and another thread is waiting for it to become larger than zero again, wake up that thread. @@ -484,11 +497,14 @@ class BoundedSemaphore(Semaphore): raise a ValueError. """ + if n < 1: + raise ValueError('n must be one or more') with self._cond: - if self._value >= self._initial_value: + if self._value + n > self._initial_value: raise ValueError("Semaphore released too many times") - self._value += 1 - self._cond.notify() + self._value += n + for i in range(n): + self._cond.notify() class Event: @@ -506,9 +522,9 @@ class Event: self._cond = Condition(Lock()) self._flag = False - def _reset_internal_locks(self): - # private! called by Thread._reset_internal_locks by _after_fork() - self._cond.__init__(Lock()) + def _at_fork_reinit(self): + # Private method called by Thread._reset_internal_locks() + self._cond._at_fork_reinit() def is_set(self): """Return true if and only if the internal flag is true.""" @@ -808,9 +824,10 @@ class Thread: def _reset_internal_locks(self, is_alive): # private! Called by _after_fork() to reset our internal locks as # they may be in an invalid state leading to a deadlock or crash. - self._started._reset_internal_locks() + self._started._at_fork_reinit() if is_alive: - self._set_tstate_lock() + self._tstate_lock._at_fork_reinit() + self._tstate_lock.acquire() else: # The thread isn't alive after fork: it doesn't have a tstate # anymore. @@ -846,6 +863,7 @@ class Thread: if self._started.is_set(): raise RuntimeError("threads can only be started once") + with _active_limbo_lock: _limbo[self] = self try: @@ -1082,16 +1100,6 @@ class Thread: self._wait_for_tstate_lock(False) return not self._is_stopped - def isAlive(self): - """Return whether the thread is alive. - - This method is deprecated, use is_alive() instead. - """ - import warnings - warnings.warn('isAlive() is deprecated, use is_alive() instead', - DeprecationWarning, stacklevel=2) - return self.is_alive() - @property def daemon(self): """A boolean value indicating whether this thread is a daemon thread. @@ -1344,6 +1352,27 @@ def enumerate(): with _active_limbo_lock: return list(_active.values()) + list(_limbo.values()) + +_threading_atexits = [] +_SHUTTING_DOWN = False + +def _register_atexit(func, *arg, **kwargs): + """CPython internal: register *func* to be called before joining threads. + + The registered *func* is called with its arguments just before all + non-daemon threads are joined in `_shutdown()`. It provides a similar + purpose to `atexit.register()`, but its functions are called prior to + threading shutdown instead of interpreter shutdown. + + For similarity to atexit, the registered functions are called in reverse. + """ + if _SHUTTING_DOWN: + raise RuntimeError("can't register atexit after shutdown") + + call = functools.partial(func, *arg, **kwargs) + _threading_atexits.append(call) + + from _thread import stack_size # Create the main thread object, @@ -1365,6 +1394,8 @@ def _shutdown(): # _shutdown() was already called return + global _SHUTTING_DOWN + _SHUTTING_DOWN = True # Main thread tlock = _main_thread._tstate_lock # The main thread isn't finished yet, so its thread state lock can't have @@ -1374,6 +1405,11 @@ def _shutdown(): tlock.release() _main_thread._stop() + # Call registered threading atexit functions before threads are joined. + # Order is reversed, similar to atexit. + for atexit_call in reversed(_threading_atexits): + atexit_call() + # Join all non-deamon threads while True: with _shutdown_locks_lock: diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 479eb016..1067ab6a 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -32,13 +32,13 @@ tk.mainloop() import enum import sys +import types import _tkinter # If this fails your Python may not be configured for Tk TclError = _tkinter.TclError from tkinter.constants import * import re - wantobjects = 1 TkVersion = float(_tkinter.TK_VERSION) @@ -146,10 +146,10 @@ def _splitdict(tk, v, cut_minus=True, conv=None): class EventType(str, enum.Enum): KeyPress = '2' - Key = KeyPress + Key = KeyPress, KeyRelease = '3' ButtonPress = '4' - Button = ButtonPress + Button = ButtonPress, ButtonRelease = '5' Motion = '6' Enter = '7' @@ -180,10 +180,10 @@ class EventType(str, enum.Enum): Colormap = '32' ClientMessage = '33' # undocumented Mapping = '34' # undocumented - VirtualEvent = '35' # undocumented - Activate = '36' - Deactivate = '37' - MouseWheel = '38' + VirtualEvent = '35', # undocumented + Activate = '36', + Deactivate = '37', + MouseWheel = '38', def __str__(self): return self.name @@ -484,6 +484,8 @@ class Variable: Note: if the Variable's master matters to behavior also compare self._master == other._master """ + if not isinstance(other, Variable): + return NotImplemented return self.__class__.__name__ == other.__class__.__name__ \ and self._name == other._name @@ -2239,7 +2241,7 @@ class Tk(Misc, Wm): _w = '.' def __init__(self, screenName=None, baseName=None, className='Tk', - useTk=1, sync=0, use=None): + useTk=True, sync=False, use=None): """Return a new Toplevel widget on screen SCREENNAME. A new Tcl interpreter will be created. BASENAME will be used for the identification of the profile file (see readprofile). @@ -2257,7 +2259,7 @@ class Tk(Misc, Wm): baseName, ext = os.path.splitext(baseName) if ext not in ('.py', '.pyc'): baseName = baseName + ext - interactive = 0 + interactive = False self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use) if useTk: self._loadtk() @@ -2359,7 +2361,7 @@ class Tk(Misc, Wm): # copied into the Pack, Place or Grid class. -def Tcl(screenName=None, baseName=None, className='Tk', useTk=0): +def Tcl(screenName=None, baseName=None, className='Tk', useTk=False): return Tk(screenName, baseName, className, useTk) @@ -4569,5 +4571,9 @@ def _test(): root.mainloop() +__all__ = [name for name, obj in globals().items() + if not name.startswith('_') and not isinstance(obj, types.ModuleType) + and name not in {'wantobjects'}] + if __name__ == '__main__': _test() diff --git a/Lib/tkinter/colorchooser.py b/Lib/tkinter/colorchooser.py index 9dc96713..3cfc06f6 100644 --- a/Lib/tkinter/colorchooser.py +++ b/Lib/tkinter/colorchooser.py @@ -21,6 +21,8 @@ from tkinter.commondialog import Dialog +__all__ = ["Chooser", "askcolor"] + # # color chooser class diff --git a/Lib/tkinter/commondialog.py b/Lib/tkinter/commondialog.py index c4ec010e..e56b5baf 100644 --- a/Lib/tkinter/commondialog.py +++ b/Lib/tkinter/commondialog.py @@ -8,15 +8,17 @@ # written by Fredrik Lundh, May 1997 # -from tkinter import * +__all__ = ["Dialog"] + +from tkinter import Frame class Dialog: - command = None + command = None def __init__(self, master=None, **options): - self.master = master + self.master = master self.options = options if not master and options.get('parent'): self.master = options['parent'] diff --git a/Lib/tkinter/dialog.py b/Lib/tkinter/dialog.py index cb463f71..8ae21401 100644 --- a/Lib/tkinter/dialog.py +++ b/Lib/tkinter/dialog.py @@ -1,7 +1,8 @@ # dialog.py -- Tkinter interface to the tk_dialog script. -from tkinter import * -from tkinter import _cnfmerge +from tkinter import _cnfmerge, Widget, TclError, Button, Pack + +__all__ = ["Dialog"] DIALOG_ICON = 'questhead' diff --git a/Lib/tkinter/dnd.py b/Lib/tkinter/dnd.py index 4de2331c..3120ff34 100644 --- a/Lib/tkinter/dnd.py +++ b/Lib/tkinter/dnd.py @@ -99,9 +99,10 @@ active; it will never call dnd_commit(). """ - import tkinter +__all__ = ["dnd_start", "DndHandler"] + # The factory function diff --git a/Lib/tkinter/filedialog.py b/Lib/tkinter/filedialog.py index 88d23476..3ed93eb8 100644 --- a/Lib/tkinter/filedialog.py +++ b/Lib/tkinter/filedialog.py @@ -11,14 +11,20 @@ to the native file dialogues available in Tk 4.2 and newer, and the directory dialogue available in Tk 8.3 and newer. These interfaces were written by Fredrik Lundh, May 1997. """ +__all__ = ["FileDialog", "LoadFileDialog", "SaveFileDialog", + "Open", "SaveAs", "Directory", + "askopenfilename", "asksaveasfilename", "askopenfilenames", + "askopenfile", "askopenfiles", "asksaveasfile", "askdirectory"] -from tkinter import * +import fnmatch +import os +from tkinter import ( + Frame, LEFT, YES, BOTTOM, Entry, TOP, Button, Tk, X, + Toplevel, RIGHT, Y, END, Listbox, BOTH, Scrollbar, +) from tkinter.dialog import Dialog from tkinter import commondialog -import os -import fnmatch - dialogstates = {} diff --git a/Lib/tkinter/font.py b/Lib/tkinter/font.py index 13642572..15ad7ab4 100644 --- a/Lib/tkinter/font.py +++ b/Lib/tkinter/font.py @@ -3,11 +3,12 @@ # written by Fredrik Lundh, February 1998 # -__version__ = "0.9" - import itertools import tkinter +__version__ = "0.9" +__all__ = ["NORMAL", "ROMAN", "BOLD", "ITALIC", + "nametofont", "Font", "families", "names"] # weight/slant NORMAL = "normal" @@ -100,7 +101,9 @@ class Font: return self.name def __eq__(self, other): - return isinstance(other, Font) and self.name == other.name + if not isinstance(other, Font): + return NotImplemented + return self.name == other.name def __getitem__(self, key): return self.cget(key) diff --git a/Lib/tkinter/messagebox.py b/Lib/tkinter/messagebox.py index 4a711fa6..5f0343b6 100644 --- a/Lib/tkinter/messagebox.py +++ b/Lib/tkinter/messagebox.py @@ -24,6 +24,10 @@ from tkinter.commondialog import Dialog +__all__ = ["showinfo", "showwarning", "showerror", + "askquestion", "askokcancel", "askyesno", + "askyesnocancel", "askretrycancel"] + # # constants diff --git a/Lib/tkinter/scrolledtext.py b/Lib/tkinter/scrolledtext.py index 749a06a6..4f9a8815 100644 --- a/Lib/tkinter/scrolledtext.py +++ b/Lib/tkinter/scrolledtext.py @@ -11,11 +11,11 @@ Most methods calls are inherited from the Text widget; Pack, Grid and Place methods are redirected to the Frame widget however. """ -__all__ = ['ScrolledText'] - from tkinter import Frame, Text, Scrollbar, Pack, Grid, Place from tkinter.constants import RIGHT, LEFT, Y, BOTH +__all__ = ['ScrolledText'] + class ScrolledText(Text): def __init__(self, master=None, **kw): diff --git a/Lib/tkinter/test/test_tkinter/test_font.py b/Lib/tkinter/test/test_tkinter/test_font.py index 97cd87cc..a021ea33 100644 --- a/Lib/tkinter/test/test_tkinter/test_font.py +++ b/Lib/tkinter/test/test_tkinter/test_font.py @@ -1,7 +1,7 @@ import unittest import tkinter from tkinter import font -from test.support import requires, run_unittest, gc_collect +from test.support import requires, run_unittest, gc_collect, ALWAYS_EQ from tkinter.test.support import AbstractTkTest requires('gui') @@ -70,6 +70,7 @@ class FontTest(AbstractTkTest, unittest.TestCase): self.assertEqual(font1, font2) self.assertNotEqual(font1, font1.copy()) self.assertNotEqual(font1, 0) + self.assertEqual(font1, ALWAYS_EQ) def test_measure(self): self.assertIsInstance(self.font.measure('abc'), int) diff --git a/Lib/tkinter/test/test_tkinter/test_misc.py b/Lib/tkinter/test/test_tkinter/test_misc.py index 236cae0e..1e089747 100644 --- a/Lib/tkinter/test/test_tkinter/test_misc.py +++ b/Lib/tkinter/test/test_tkinter/test_misc.py @@ -7,6 +7,20 @@ support.requires('gui') class MiscTest(AbstractTkTest, unittest.TestCase): + def test_all(self): + self.assertIn("Widget", tkinter.__all__) + # Check that variables from tkinter.constants are also in tkinter.__all__ + self.assertIn("CASCADE", tkinter.__all__) + self.assertIsNotNone(tkinter.CASCADE) + # Check that sys, re, and constants are not in tkinter.__all__ + self.assertNotIn("re", tkinter.__all__) + self.assertNotIn("sys", tkinter.__all__) + self.assertNotIn("constants", tkinter.__all__) + # Check that an underscored functions is not in tkinter.__all__ + self.assertNotIn("_tkerror", tkinter.__all__) + # Check that wantobjects is not in tkinter.__all__ + self.assertNotIn("wantobjects", tkinter.__all__) + def test_repr(self): t = tkinter.Toplevel(self.root, name='top') f = tkinter.Frame(t, name='child') diff --git a/Lib/tkinter/test/test_tkinter/test_variables.py b/Lib/tkinter/test/test_tkinter/test_variables.py index 2eb1e126..08b7dedc 100644 --- a/Lib/tkinter/test/test_tkinter/test_variables.py +++ b/Lib/tkinter/test/test_tkinter/test_variables.py @@ -2,6 +2,7 @@ import unittest import gc from tkinter import (Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tcl, TclError) +from test.support import ALWAYS_EQ class Var(Variable): @@ -59,11 +60,17 @@ class TestVariable(TestBase): # values doesn't matter, only class and name are checked v1 = Variable(self.root, name="abc") v2 = Variable(self.root, name="abc") + self.assertIsNot(v1, v2) self.assertEqual(v1, v2) - v3 = Variable(self.root, name="abc") - v4 = StringVar(self.root, name="abc") - self.assertNotEqual(v3, v4) + v3 = StringVar(self.root, name="abc") + self.assertNotEqual(v1, v3) + + V = type('Variable', (), {}) + self.assertNotEqual(v1, V()) + + self.assertNotEqual(v1, object()) + self.assertEqual(v1, ALWAYS_EQ) def test_invalid_name(self): with self.assertRaises(TypeError): diff --git a/Lib/trace.py b/Lib/trace.py index 89f17d48..c505d8bc 100755 --- a/Lib/trace.py +++ b/Lib/trace.py @@ -453,22 +453,7 @@ class Trace: sys.settrace(None) threading.settrace(None) - def runfunc(*args, **kw): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runfunc' of 'Trace' object " - "needs an argument") - elif 'func' in kw: - func = kw.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runfunc expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def runfunc(self, func, /, *args, **kw): result = None if not self.donothing: sys.settrace(self.globaltrace) @@ -478,7 +463,6 @@ class Trace: if not self.donothing: sys.settrace(None) return result - runfunc.__text_signature__ = '($self, func, /, *args, **kw)' def file_module_function_of(self, frame): code = frame.f_code diff --git a/Lib/traceback.py b/Lib/traceback.py index 5ef3be74..a19e3871 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -538,7 +538,9 @@ class TracebackException: self.__cause__._load_lines() def __eq__(self, other): - return self.__dict__ == other.__dict__ + if isinstance(other, TracebackException): + return self.__dict__ == other.__dict__ + return NotImplemented def __str__(self): return self._str @@ -567,23 +569,30 @@ class TracebackException: if not issubclass(self.exc_type, SyntaxError): yield _format_final_exc_line(stype, self._str) - return + else: + yield from self._format_syntax_error(stype) - # It was a syntax error; show exactly where the problem was found. + def _format_syntax_error(self, stype): + """Format SyntaxError exceptions (internal helper).""" + # Show exactly where the problem was found. filename = self.filename or "" lineno = str(self.lineno) or '?' yield ' File "{}", line {}\n'.format(filename, lineno) - badline = self.text - offset = self.offset - if badline is not None: - yield ' {}\n'.format(badline.strip()) - if offset is not None: - caretspace = badline.rstrip('\n') - offset = min(len(caretspace), offset) - 1 - caretspace = caretspace[:offset].lstrip() + text = self.text + if text is not None: + # text = " foo\n" + # rtext = " foo" + # ltext = "foo" + rtext = text.rstrip('\n') + ltext = rtext.lstrip(' \n\f') + spaces = len(rtext) - len(ltext) + yield ' {}\n'.format(ltext) + # Convert 1-based column offset to 0-based index into stripped text + caret = (self.offset or 0) - 1 - spaces + if caret >= 0: # non-space whitespace (likes tabs) must be kept for alignment - caretspace = ((c.isspace() and c or ' ') for c in caretspace) + caretspace = ((c if c.isspace() else ' ') for c in ltext[:caret]) yield ' {}^\n'.format(''.join(caretspace)) msg = self.msg or "" yield "{}: {}\n".format(stype, msg) diff --git a/Lib/tracemalloc.py b/Lib/tracemalloc.py index 2c1ac3b3..69b4170e 100644 --- a/Lib/tracemalloc.py +++ b/Lib/tracemalloc.py @@ -43,6 +43,8 @@ class Statistic: return hash((self.traceback, self.size, self.count)) def __eq__(self, other): + if not isinstance(other, Statistic): + return NotImplemented return (self.traceback == other.traceback and self.size == other.size and self.count == other.count) @@ -84,6 +86,8 @@ class StatisticDiff: self.count, self.count_diff)) def __eq__(self, other): + if not isinstance(other, StatisticDiff): + return NotImplemented return (self.traceback == other.traceback and self.size == other.size and self.size_diff == other.size_diff @@ -153,9 +157,13 @@ class Frame: return self._frame[1] def __eq__(self, other): + if not isinstance(other, Frame): + return NotImplemented return (self._frame == other._frame) def __lt__(self, other): + if not isinstance(other, Frame): + return NotImplemented return (self._frame < other._frame) def __hash__(self): @@ -174,15 +182,20 @@ class Traceback(Sequence): Sequence of Frame instances sorted from the oldest frame to the most recent frame. """ - __slots__ = ("_frames",) + __slots__ = ("_frames", '_total_nframe') - def __init__(self, frames): + def __init__(self, frames, total_nframe=None): Sequence.__init__(self) # frames is a tuple of frame tuples: see Frame constructor for the # format of a frame tuple; it is reversed, because _tracemalloc # returns frames sorted from most recent to oldest, but the # Python API expects oldest to most recent self._frames = tuple(reversed(frames)) + self._total_nframe = total_nframe + + @property + def total_nframe(self): + return self._total_nframe def __len__(self): return len(self._frames) @@ -200,16 +213,25 @@ class Traceback(Sequence): return hash(self._frames) def __eq__(self, other): + if not isinstance(other, Traceback): + return NotImplemented return (self._frames == other._frames) def __lt__(self, other): + if not isinstance(other, Traceback): + return NotImplemented return (self._frames < other._frames) def __str__(self): return str(self[0]) def __repr__(self): - return "" % (tuple(self),) + s = "" + return s def format(self, limit=None, most_recent_first=False): lines = [] @@ -268,9 +290,11 @@ class Trace: @property def traceback(self): - return Traceback(self._trace[2]) + return Traceback(*self._trace[2:]) def __eq__(self, other): + if not isinstance(other, Trace): + return NotImplemented return (self._trace == other._trace) def __hash__(self): @@ -303,6 +327,8 @@ class _Traces(Sequence): return trace._trace in self._traces def __eq__(self, other): + if not isinstance(other, _Traces): + return NotImplemented return (self._traces == other._traces) def __repr__(self): @@ -362,7 +388,7 @@ class Filter(BaseFilter): return self._match_frame(filename, lineno) def _match(self, trace): - domain, size, traceback = trace + domain, size, traceback, total_nframe = trace res = self._match_traceback(traceback) if self.domain is not None: if self.inclusive: @@ -382,7 +408,7 @@ class DomainFilter(BaseFilter): return self._domain def _match(self, trace): - domain, size, traceback = trace + domain, size, traceback, total_nframe = trace return (domain == self.domain) ^ (not self.inclusive) @@ -459,7 +485,7 @@ class Snapshot: tracebacks = {} if not cumulative: for trace in self.traces._traces: - domain, size, trace_traceback = trace + domain, size, trace_traceback, total_nframe = trace try: traceback = tracebacks[trace_traceback] except KeyError: @@ -480,7 +506,7 @@ class Snapshot: else: # cumulative statistics for trace in self.traces._traces: - domain, size, trace_traceback = trace + domain, size, trace_traceback, total_nframe = trace for frame in trace_traceback: try: traceback = tracebacks[frame] diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py old mode 100644 new mode 100755 diff --git a/Lib/turtledemo/sorting_animate.py b/Lib/turtledemo/sorting_animate.py old mode 100644 new mode 100755 diff --git a/Lib/turtledemo/two_canvases.py b/Lib/turtledemo/two_canvases.py old mode 100755 new mode 100644 diff --git a/Lib/types.py b/Lib/types.py index ea3c0b29..ad2020ec 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -293,4 +293,7 @@ def coroutine(func): return wrapped +GenericAlias = type(list[int]) + + __all__ = [n for n in globals() if n[:1] != '_'] diff --git a/Lib/typing.py b/Lib/typing.py index 4ec538da..39c956dd 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -26,11 +26,12 @@ import operator import re as stdlib_re # Avoid confusion with the re we export. import sys import types -from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType +from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType, GenericAlias # Please keep __all__ alphabetized within each category. __all__ = [ # Super-special typing primitives. + 'Annotated', 'Any', 'Callable', 'ClassVar', @@ -140,8 +141,9 @@ def _type_check(arg, msg, is_argument=True): if (isinstance(arg, _GenericAlias) and arg.__origin__ in invalid_generic_forms): raise TypeError(f"{arg} is not valid as type argument") - if (isinstance(arg, _SpecialForm) and arg not in (Any, NoReturn) or - arg in (Generic, Protocol)): + if arg in (Any, NoReturn): + return arg + if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol): raise TypeError(f"Plain {arg} is not valid as type argument") if isinstance(arg, (type, TypeVar, ForwardRef)): return arg @@ -179,38 +181,18 @@ def _collect_type_vars(types): for t in types: if isinstance(t, TypeVar) and t not in tvars: tvars.append(t) - if isinstance(t, _GenericAlias) and not t._special: + if isinstance(t, (_GenericAlias, GenericAlias)): tvars.extend([t for t in t.__parameters__ if t not in tvars]) return tuple(tvars) -def _subs_tvars(tp, tvars, subs): - """Substitute type variables 'tvars' with substitutions 'subs'. - These two must have the same length. - """ - if not isinstance(tp, _GenericAlias): - return tp - new_args = list(tp.__args__) - for a, arg in enumerate(tp.__args__): - if isinstance(arg, TypeVar): - for i, tvar in enumerate(tvars): - if arg == tvar: - new_args[a] = subs[i] - else: - new_args[a] = _subs_tvars(arg, tvars, subs) - if tp.__origin__ is Union: - return Union[tuple(new_args)] - return tp.copy_with(tuple(new_args)) - - -def _check_generic(cls, parameters): +def _check_generic(cls, parameters, elen): """Check correct count for parameters of a generic cls (internal helper). This gives a nice error message in case of count mismatch. """ - if not cls.__parameters__: + if not elen: raise TypeError(f"{cls} is not a generic class") alen = len(parameters) - elen = len(cls.__parameters__) if alen != elen: raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};" f" actual {alen}, expected {elen}") @@ -223,7 +205,7 @@ def _remove_dups_flatten(parameters): # Flatten out Union[Union[...], ...]. params = [] for p in parameters: - if isinstance(p, _GenericAlias) and p.__origin__ is Union: + if isinstance(p, _UnionGenericAlias): params.extend(p.__args__) elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union: params.extend(p[1:]) @@ -262,19 +244,22 @@ def _tp_cache(func): return inner -def _eval_type(t, globalns, localns): +def _eval_type(t, globalns, localns, recursive_guard=frozenset()): """Evaluate all forward references in the given type t. For use of globalns and localns see the docstring for get_type_hints(). + recursive_guard is used to prevent prevent infinite recursion + with recursive ForwardRef. """ if isinstance(t, ForwardRef): - return t._evaluate(globalns, localns) - if isinstance(t, _GenericAlias): - ev_args = tuple(_eval_type(a, globalns, localns) for a in t.__args__) + return t._evaluate(globalns, localns, recursive_guard) + if isinstance(t, (_GenericAlias, GenericAlias)): + ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__) if ev_args == t.__args__: return t - res = t.copy_with(ev_args) - res._special = t._special - return res + if isinstance(t, GenericAlias): + return GenericAlias(t.__origin__, ev_args) + else: + return t.copy_with(ev_args) return t @@ -289,6 +274,7 @@ class _Final: class _Immutable: """Mixin to indicate that object should not be copied.""" + __slots__ = () def __copy__(self): return self @@ -297,37 +283,18 @@ class _Immutable: return self -class _SpecialForm(_Final, _Immutable, _root=True): - """Internal indicator of special typing constructs. - See _doc instance attribute for specific docs. - """ - - __slots__ = ('_name', '_doc') - - def __new__(cls, *args, **kwds): - """Constructor. +# Internal indicator of special typing constructs. +# See __doc__ instance attribute for specific docs. +class _SpecialForm(_Final, _root=True): + __slots__ = ('_name', '__doc__', '_getitem') - This only exists to give a better error message in case - someone tries to subclass a special typing object (not a good idea). - """ - if (len(args) == 3 and - isinstance(args[0], str) and - isinstance(args[1], tuple)): - # Close enough. - raise TypeError(f"Cannot subclass {cls!r}") - return super().__new__(cls) - - def __init__(self, name, doc): - self._name = name - self._doc = doc + def __init__(self, getitem): + self._getitem = getitem + self._name = getitem.__name__ + self.__doc__ = getitem.__doc__ - def __eq__(self, other): - if not isinstance(other, _SpecialForm): - return NotImplemented - return self._name == other._name - - def __hash__(self): - return hash((self._name,)) + def __mro_entries__(self, bases): + raise TypeError(f"Cannot subclass {self!r}") def __repr__(self): return 'typing.' + self._name @@ -346,31 +313,10 @@ class _SpecialForm(_Final, _Immutable, _root=True): @_tp_cache def __getitem__(self, parameters): - if self._name in ('ClassVar', 'Final'): - item = _type_check(parameters, f'{self._name} accepts only single type.') - return _GenericAlias(self, (item,)) - if self._name == 'Union': - if parameters == (): - raise TypeError("Cannot take a Union of no types.") - if not isinstance(parameters, tuple): - parameters = (parameters,) - msg = "Union[arg, ...]: each arg must be a type." - parameters = tuple(_type_check(p, msg) for p in parameters) - parameters = _remove_dups_flatten(parameters) - if len(parameters) == 1: - return parameters[0] - return _GenericAlias(self, parameters) - if self._name == 'Optional': - arg = _type_check(parameters, "Optional[t] requires a single type.") - return Union[arg, type(None)] - if self._name == 'Literal': - # There is no '_type_check' call because arguments to Literal[...] are - # values, not types. - return _GenericAlias(self, parameters) - raise TypeError(f"{self} is not subscriptable") - - -Any = _SpecialForm('Any', doc= + return self._getitem(self, parameters) + +@_SpecialForm +def Any(self, parameters): """Special type indicating an unconstrained type. - Any is compatible with every type. @@ -380,9 +326,11 @@ Any = _SpecialForm('Any', doc= Note that all the above statements are true from the point of view of static type checkers. At runtime, Any should not be used with instance or class checks. - """) + """ + raise TypeError(f"{self} is not subscriptable") -NoReturn = _SpecialForm('NoReturn', doc= +@_SpecialForm +def NoReturn(self, parameters): """Special type indicating functions that never return. Example:: @@ -393,9 +341,11 @@ NoReturn = _SpecialForm('NoReturn', doc= This type is invalid in other positions, e.g., ``List[NoReturn]`` will fail in static type checkers. - """) + """ + raise TypeError(f"{self} is not subscriptable") -ClassVar = _SpecialForm('ClassVar', doc= +@_SpecialForm +def ClassVar(self, parameters): """Special type construct to mark class variables. An annotation wrapped in ClassVar indicates that a given @@ -410,9 +360,12 @@ ClassVar = _SpecialForm('ClassVar', doc= Note that ClassVar is not a class itself, and should not be used with isinstance() or issubclass(). - """) + """ + item = _type_check(parameters, f'{self} accepts only single type.') + return _GenericAlias(self, (item,)) -Final = _SpecialForm('Final', doc= +@_SpecialForm +def Final(self, parameters): """Special typing construct to indicate final names to type checkers. A final name cannot be re-assigned or overridden in a subclass. @@ -428,9 +381,12 @@ Final = _SpecialForm('Final', doc= TIMEOUT = 1 # Error reported by type checker There is no runtime checking of these properties. - """) + """ + item = _type_check(parameters, f'{self} accepts only single type.') + return _GenericAlias(self, (item,)) -Union = _SpecialForm('Union', doc= +@_SpecialForm +def Union(self, parameters): """Union type; Union[X, Y] means either X or Y. To define a union, use e.g. Union[int, str]. Details: @@ -455,15 +411,29 @@ Union = _SpecialForm('Union', doc= - You cannot subclass or instantiate a union. - You can use Optional[X] as a shorthand for Union[X, None]. - """) - -Optional = _SpecialForm('Optional', doc= + """ + if parameters == (): + raise TypeError("Cannot take a Union of no types.") + if not isinstance(parameters, tuple): + parameters = (parameters,) + msg = "Union[arg, ...]: each arg must be a type." + parameters = tuple(_type_check(p, msg) for p in parameters) + parameters = _remove_dups_flatten(parameters) + if len(parameters) == 1: + return parameters[0] + return _UnionGenericAlias(self, parameters) + +@_SpecialForm +def Optional(self, parameters): """Optional type. Optional[X] is equivalent to Union[X, None]. - """) + """ + arg = _type_check(parameters, f"{self} requires a single type.") + return Union[arg, type(None)] -Literal = _SpecialForm('Literal', doc= +@_SpecialForm +def Literal(self, parameters): """Special typing form to define literal types (a.k.a. value types). This form can be used to indicate to type checkers that the corresponding @@ -480,10 +450,13 @@ Literal = _SpecialForm('Literal', doc= open_helper('/some/path', 'r') # Passes type check open_helper('/other/path', 'typo') # Error in type checker - Literal[...] cannot be subclassed. At runtime, an arbitrary value - is allowed as type argument to Literal[...], but type checkers may - impose restrictions. - """) + Literal[...] cannot be subclassed. At runtime, an arbitrary value + is allowed as type argument to Literal[...], but type checkers may + impose restrictions. + """ + # There is no '_type_check' call because arguments to Literal[...] are + # values, not types. + return _GenericAlias(self, parameters) class ForwardRef(_Final, _root=True): @@ -506,7 +479,9 @@ class ForwardRef(_Final, _root=True): self.__forward_value__ = None self.__forward_is_argument__ = is_argument - def _evaluate(self, globalns, localns): + def _evaluate(self, globalns, localns, recursive_guard): + if self.__forward_arg__ in recursive_guard: + return self if not self.__forward_evaluated__ or localns is not globalns: if globalns is None and localns is None: globalns = localns = {} @@ -514,10 +489,14 @@ class ForwardRef(_Final, _root=True): globalns = localns elif localns is None: localns = globalns - self.__forward_value__ = _type_check( + type_ =_type_check( eval(self.__forward_code__, globalns, localns), "Forward references must evaluate to types.", - is_argument=self.__forward_is_argument__) + is_argument=self.__forward_is_argument__, + ) + self.__forward_value__ = _eval_type( + type_, globalns, localns, recursive_guard | {self.__forward_arg__} + ) self.__forward_evaluated__ = True return self.__forward_value__ @@ -581,7 +560,7 @@ class TypeVar(_Final, _Immutable, _root=True): """ __slots__ = ('__name__', '__bound__', '__constraints__', - '__covariant__', '__contravariant__') + '__covariant__', '__contravariant__', '__dict__') def __init__(self, name, *constraints, bound=None, covariant=False, contravariant=False): @@ -620,34 +599,10 @@ class TypeVar(_Final, _Immutable, _root=True): return self.__name__ -# Special typing constructs Union, Optional, Generic, Callable and Tuple -# use three special attributes for internal bookkeeping of generic types: -# * __parameters__ is a tuple of unique free type parameters of a generic -# type, for example, Dict[T, T].__parameters__ == (T,); -# * __origin__ keeps a reference to a type that was subscripted, -# e.g., Union[T, int].__origin__ == Union, or the non-generic version of -# the type. -# * __args__ is a tuple of all arguments used in subscripting, -# e.g., Dict[T, int].__args__ == (T, int). - - -# Mapping from non-generic type names that have a generic alias in typing -# but with a different name. -_normalize_alias = {'list': 'List', - 'tuple': 'Tuple', - 'dict': 'Dict', - 'set': 'Set', - 'frozenset': 'FrozenSet', - 'deque': 'Deque', - 'defaultdict': 'DefaultDict', - 'type': 'Type', - 'Set': 'AbstractSet'} - def _is_dunder(attr): return attr.startswith('__') and attr.endswith('__') - -class _GenericAlias(_Final, _root=True): +class _BaseGenericAlias(_Final, _root=True): """The central part of internal API. This represents a generic version of type 'origin' with type arguments 'params'. @@ -656,24 +611,88 @@ class _GenericAlias(_Final, _root=True): have 'name' always set. If 'inst' is False, then the alias can't be instantiated, this is used by e.g. typing.List and typing.Dict. """ - def __init__(self, origin, params, *, inst=True, special=False, name=None): + def __init__(self, origin, *, inst=True, name=None): self._inst = inst - self._special = special - if special and name is None: - orig_name = origin.__name__ - name = _normalize_alias.get(orig_name, orig_name) self._name = name + self.__origin__ = origin + self.__slots__ = None # This is not documented. + + def __call__(self, *args, **kwargs): + if not self._inst: + raise TypeError(f"Type {self._name} cannot be instantiated; " + f"use {self.__origin__.__name__}() instead") + result = self.__origin__(*args, **kwargs) + try: + result.__orig_class__ = self + except AttributeError: + pass + return result + + def __mro_entries__(self, bases): + res = [] + if self.__origin__ not in bases: + res.append(self.__origin__) + i = bases.index(self) + for b in bases[i+1:]: + if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic): + break + else: + res.append(Generic) + return tuple(res) + + def __getattr__(self, attr): + # We are careful for copy and pickle. + # Also for simplicity we just don't relay all dunder names + if '__origin__' in self.__dict__ and not _is_dunder(attr): + return getattr(self.__origin__, attr) + raise AttributeError(attr) + + def __setattr__(self, attr, val): + if _is_dunder(attr) or attr in ('_name', '_inst', '_nparams'): + super().__setattr__(attr, val) + else: + setattr(self.__origin__, attr, val) + + def __instancecheck__(self, obj): + return self.__subclasscheck__(type(obj)) + + def __subclasscheck__(self, cls): + raise TypeError("Subscripted generics cannot be used with" + " class and instance checks") + + +# Special typing constructs Union, Optional, Generic, Callable and Tuple +# use three special attributes for internal bookkeeping of generic types: +# * __parameters__ is a tuple of unique free type parameters of a generic +# type, for example, Dict[T, T].__parameters__ == (T,); +# * __origin__ keeps a reference to a type that was subscripted, +# e.g., Union[T, int].__origin__ == Union, or the non-generic version of +# the type. +# * __args__ is a tuple of all arguments used in subscripting, +# e.g., Dict[T, int].__args__ == (T, int). + + +class _GenericAlias(_BaseGenericAlias, _root=True): + def __init__(self, origin, params, *, inst=True, name=None): + super().__init__(origin, inst=inst, name=name) if not isinstance(params, tuple): params = (params,) - self.__origin__ = origin self.__args__ = tuple(... if a is _TypingEllipsis else () if a is _TypingEmpty else a for a in params) self.__parameters__ = _collect_type_vars(params) - self.__slots__ = None # This is not documented. if not name: self.__module__ = origin.__module__ + def __eq__(self, other): + if not isinstance(other, _GenericAlias): + return NotImplemented + return (self.__origin__ == other.__origin__ + and self.__args__ == other.__args__) + + def __hash__(self): + return hash((self.__origin__, self.__args__)) + @_tp_cache def __getitem__(self, params): if self.__origin__ in (Generic, Protocol): @@ -683,125 +702,119 @@ class _GenericAlias(_Final, _root=True): params = (params,) msg = "Parameters to generic types must be types." params = tuple(_type_check(p, msg) for p in params) - _check_generic(self, params) - return _subs_tvars(self, self.__parameters__, params) + _check_generic(self, params, len(self.__parameters__)) + + subst = dict(zip(self.__parameters__, params)) + new_args = [] + for arg in self.__args__: + if isinstance(arg, TypeVar): + arg = subst[arg] + elif isinstance(arg, (_GenericAlias, GenericAlias)): + subparams = arg.__parameters__ + if subparams: + subargs = tuple(subst[x] for x in subparams) + arg = arg[subargs] + new_args.append(arg) + return self.copy_with(tuple(new_args)) def copy_with(self, params): - # We don't copy self._special. - return _GenericAlias(self.__origin__, params, name=self._name, inst=self._inst) + return self.__class__(self.__origin__, params, name=self._name, inst=self._inst) def __repr__(self): - if (self._name != 'Callable' or - len(self.__args__) == 2 and self.__args__[0] is Ellipsis): - if self._name: - name = 'typing.' + self._name - else: - name = _type_repr(self.__origin__) - if not self._special: - args = f'[{", ".join([_type_repr(a) for a in self.__args__])}]' - else: - args = '' - return (f'{name}{args}') - if self._special: - return 'typing.Callable' - return (f'typing.Callable' - f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], ' - f'{_type_repr(self.__args__[-1])}]') - - def __eq__(self, other): - if not isinstance(other, _GenericAlias): - return NotImplemented - if self.__origin__ != other.__origin__: - return False - if self.__origin__ is Union and other.__origin__ is Union: - return frozenset(self.__args__) == frozenset(other.__args__) - return self.__args__ == other.__args__ - - def __hash__(self): - if self.__origin__ is Union: - return hash((Union, frozenset(self.__args__))) - return hash((self.__origin__, self.__args__)) + if self._name: + name = 'typing.' + self._name + else: + name = _type_repr(self.__origin__) + args = ", ".join([_type_repr(a) for a in self.__args__]) + return f'{name}[{args}]' - def __call__(self, *args, **kwargs): - if not self._inst: - raise TypeError(f"Type {self._name} cannot be instantiated; " - f"use {self._name.lower()}() instead") - result = self.__origin__(*args, **kwargs) - try: - result.__orig_class__ = self - except AttributeError: - pass - return result + def __reduce__(self): + if self._name: + origin = globals()[self._name] + else: + origin = self.__origin__ + args = tuple(self.__args__) + if len(args) == 1 and not isinstance(args[0], tuple): + args, = args + return operator.getitem, (origin, args) def __mro_entries__(self, bases): if self._name: # generic version of an ABC or built-in class - res = [] - if self.__origin__ not in bases: - res.append(self.__origin__) - i = bases.index(self) - if not any(isinstance(b, _GenericAlias) or issubclass(b, Generic) - for b in bases[i+1:]): - res.append(Generic) - return tuple(res) + return super().__mro_entries__(bases) if self.__origin__ is Generic: if Protocol in bases: return () i = bases.index(self) for b in bases[i+1:]: - if isinstance(b, _GenericAlias) and b is not self: + if isinstance(b, _BaseGenericAlias) and b is not self: return () return (self.__origin__,) - def __getattr__(self, attr): - # We are careful for copy and pickle. - # Also for simplicity we just don't relay all dunder names - if '__origin__' in self.__dict__ and not _is_dunder(attr): - return getattr(self.__origin__, attr) - raise AttributeError(attr) - def __setattr__(self, attr, val): - if _is_dunder(attr) or attr in ('_name', '_inst', '_special'): - super().__setattr__(attr, val) +# _nparams is the number of accepted parameters, e.g. 0 for Hashable, +# 1 for List and 2 for Dict. It may be -1 if variable number of +# parameters are accepted (needs custom __getitem__). + +class _SpecialGenericAlias(_BaseGenericAlias, _root=True): + def __init__(self, origin, nparams, *, inst=True, name=None): + if name is None: + name = origin.__name__ + super().__init__(origin, inst=inst, name=name) + self._nparams = nparams + if origin.__module__ == 'builtins': + self.__doc__ = f'A generic version of {origin.__qualname__}.' else: - setattr(self.__origin__, attr, val) + self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.' - def __instancecheck__(self, obj): - return self.__subclasscheck__(type(obj)) + @_tp_cache + def __getitem__(self, params): + if not isinstance(params, tuple): + params = (params,) + msg = "Parameters to generic types must be types." + params = tuple(_type_check(p, msg) for p in params) + _check_generic(self, params, self._nparams) + return self.copy_with(params) + + def copy_with(self, params): + return _GenericAlias(self.__origin__, params, + name=self._name, inst=self._inst) + + def __repr__(self): + return 'typing.' + self._name def __subclasscheck__(self, cls): - if self._special: - if not isinstance(cls, _GenericAlias): - return issubclass(cls, self.__origin__) - if cls._special: - return issubclass(cls.__origin__, self.__origin__) - raise TypeError("Subscripted generics cannot be used with" - " class and instance checks") + if isinstance(cls, _SpecialGenericAlias): + return issubclass(cls.__origin__, self.__origin__) + if not isinstance(cls, _GenericAlias): + return issubclass(cls, self.__origin__) + return super().__subclasscheck__(cls) def __reduce__(self): - if self._special: - return self._name + return self._name - if self._name: - origin = globals()[self._name] - else: - origin = self.__origin__ - if (origin is Callable and - not (len(self.__args__) == 2 and self.__args__[0] is Ellipsis)): - args = list(self.__args__[:-1]), self.__args__[-1] - else: - args = tuple(self.__args__) - if len(args) == 1 and not isinstance(args[0], tuple): - args, = args - return operator.getitem, (origin, args) +class _CallableGenericAlias(_GenericAlias, _root=True): + def __repr__(self): + assert self._name == 'Callable' + if len(self.__args__) == 2 and self.__args__[0] is Ellipsis: + return super().__repr__() + return (f'typing.Callable' + f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], ' + f'{_type_repr(self.__args__[-1])}]') + + def __reduce__(self): + args = self.__args__ + if not (len(args) == 2 and args[0] is ...): + args = list(args[:-1]), args[-1] + return operator.getitem, (Callable, args) + + +class _CallableType(_SpecialGenericAlias, _root=True): + def copy_with(self, params): + return _CallableGenericAlias(self.__origin__, params, + name=self._name, inst=self._inst) -class _VariadicGenericAlias(_GenericAlias, _root=True): - """Same as _GenericAlias above but for variadic aliases. Currently, - this is used only by special internal aliases: Tuple and Callable. - """ def __getitem__(self, params): - if self._name != 'Callable' or not self._special: - return self.__getitem_inner__(params) if not isinstance(params, tuple) or len(params) != 2: raise TypeError("Callable must be used as " "Callable[[arg, ...], result].") @@ -817,29 +830,53 @@ class _VariadicGenericAlias(_GenericAlias, _root=True): @_tp_cache def __getitem_inner__(self, params): - if self.__origin__ is tuple and self._special: - if params == (): - return self.copy_with((_TypingEmpty,)) - if not isinstance(params, tuple): - params = (params,) - if len(params) == 2 and params[1] is ...: - msg = "Tuple[t, ...]: t must be a type." - p = _type_check(params[0], msg) - return self.copy_with((p, _TypingEllipsis)) - msg = "Tuple[t0, t1, ...]: each t must be a type." - params = tuple(_type_check(p, msg) for p in params) - return self.copy_with(params) - if self.__origin__ is collections.abc.Callable and self._special: - args, result = params - msg = "Callable[args, result]: result must be a type." - result = _type_check(result, msg) - if args is Ellipsis: - return self.copy_with((_TypingEllipsis, result)) - msg = "Callable[[arg, ...], result]: each arg must be a type." - args = tuple(_type_check(arg, msg) for arg in args) - params = args + (result,) - return self.copy_with(params) - return super().__getitem__(params) + args, result = params + msg = "Callable[args, result]: result must be a type." + result = _type_check(result, msg) + if args is Ellipsis: + return self.copy_with((_TypingEllipsis, result)) + msg = "Callable[[arg, ...], result]: each arg must be a type." + args = tuple(_type_check(arg, msg) for arg in args) + params = args + (result,) + return self.copy_with(params) + + +class _TupleType(_SpecialGenericAlias, _root=True): + @_tp_cache + def __getitem__(self, params): + if params == (): + return self.copy_with((_TypingEmpty,)) + if not isinstance(params, tuple): + params = (params,) + if len(params) == 2 and params[1] is ...: + msg = "Tuple[t, ...]: t must be a type." + p = _type_check(params[0], msg) + return self.copy_with((p, _TypingEllipsis)) + msg = "Tuple[t0, t1, ...]: each t must be a type." + params = tuple(_type_check(p, msg) for p in params) + return self.copy_with(params) + + +class _UnionGenericAlias(_GenericAlias, _root=True): + def copy_with(self, params): + return Union[params] + + def __eq__(self, other): + if not isinstance(other, _UnionGenericAlias): + return NotImplemented + return set(self.__args__) == set(other.__args__) + + def __hash__(self): + return hash(frozenset(self.__args__)) + + def __repr__(self): + args = self.__args__ + if len(args) == 2: + if args[0] is type(None): + return f'typing.Optional[{_type_repr(args[1])}]' + elif args[1] is type(None): + return f'typing.Optional[{_type_repr(args[0])}]' + return super().__repr__() class Generic: @@ -865,16 +902,6 @@ class Generic: __slots__ = () _is_protocol = False - def __new__(cls, *args, **kwds): - if cls in (Generic, Protocol): - raise TypeError(f"Type {cls.__name__} cannot be instantiated; " - "it can be used only as a base class") - if super().__new__ is object.__new__ and cls.__init__ is not object.__init__: - obj = super().__new__(cls) - else: - obj = super().__new__(cls, *args, **kwds) - return obj - @_tp_cache def __class_getitem__(cls, params): if not isinstance(params, tuple): @@ -894,7 +921,7 @@ class Generic: f"Parameters to {cls.__name__}[...] must all be unique") else: # Subscripting a regular Generic subclass. - _check_generic(cls, params) + _check_generic(cls, params, len(cls.__parameters__)) return _GenericAlias(cls, params) def __init_subclass__(cls, *args, **kwargs): @@ -949,7 +976,7 @@ _TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__', _SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__', '__init__', '__module__', '__new__', '__slots__', - '__subclasshook__', '__weakref__'] + '__subclasshook__', '__weakref__', '__class_getitem__'] # These special attributes will be not collected as protocol members. EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker'] @@ -983,7 +1010,7 @@ def _no_init(self, *args, **kwargs): def _allow_reckless_class_cheks(): - """Allow instnance and class checks for special stdlib modules. + """Allow instance and class checks for special stdlib modules. The abc and functools modules indiscriminately call isinstance() and issubclass() on the whole MRO of a user class, which may contain protocols. @@ -1121,6 +1148,100 @@ class Protocol(Generic, metaclass=_ProtocolMeta): cls.__init__ = _no_init +class _AnnotatedAlias(_GenericAlias, _root=True): + """Runtime representation of an annotated type. + + At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't' + with extra annotations. The alias behaves like a normal typing alias, + instantiating is the same as instantiating the underlying type, binding + it to types is also the same. + """ + def __init__(self, origin, metadata): + if isinstance(origin, _AnnotatedAlias): + metadata = origin.__metadata__ + metadata + origin = origin.__origin__ + super().__init__(origin, origin) + self.__metadata__ = metadata + + def copy_with(self, params): + assert len(params) == 1 + new_type = params[0] + return _AnnotatedAlias(new_type, self.__metadata__) + + def __repr__(self): + return "typing.Annotated[{}, {}]".format( + _type_repr(self.__origin__), + ", ".join(repr(a) for a in self.__metadata__) + ) + + def __reduce__(self): + return operator.getitem, ( + Annotated, (self.__origin__,) + self.__metadata__ + ) + + def __eq__(self, other): + if not isinstance(other, _AnnotatedAlias): + return NotImplemented + return (self.__origin__ == other.__origin__ + and self.__metadata__ == other.__metadata__) + + def __hash__(self): + return hash((self.__origin__, self.__metadata__)) + + +class Annotated: + """Add context specific metadata to a type. + + Example: Annotated[int, runtime_check.Unsigned] indicates to the + hypothetical runtime_check module that this type is an unsigned int. + Every other consumer of this type can ignore this metadata and treat + this type as int. + + The first argument to Annotated must be a valid type. + + Details: + + - It's an error to call `Annotated` with less than two arguments. + - Nested Annotated are flattened:: + + Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3] + + - Instantiating an annotated type is equivalent to instantiating the + underlying type:: + + Annotated[C, Ann1](5) == C(5) + + - Annotated can be used as a generic type alias:: + + Optimized = Annotated[T, runtime.Optimize()] + Optimized[int] == Annotated[int, runtime.Optimize()] + + OptimizedList = Annotated[List[T], runtime.Optimize()] + OptimizedList[int] == Annotated[List[int], runtime.Optimize()] + """ + + __slots__ = () + + def __new__(cls, *args, **kwargs): + raise TypeError("Type Annotated cannot be instantiated.") + + @_tp_cache + def __class_getitem__(cls, params): + if not isinstance(params, tuple) or len(params) < 2: + raise TypeError("Annotated[...] should be used " + "with at least two arguments (a type and an " + "annotation).") + msg = "Annotated[t, ...]: t must be a type." + origin = _type_check(params[0], msg) + metadata = tuple(params[1:]) + return _AnnotatedAlias(origin, metadata) + + def __init_subclass__(cls, *args, **kwargs): + raise TypeError( + "Cannot subclass {}.Annotated".format(cls.__module__) + ) + + def runtime_checkable(cls): """Mark a protocol class as a runtime protocol. @@ -1182,12 +1303,13 @@ _allowed_types = (types.FunctionType, types.BuiltinFunctionType, WrapperDescriptorType, MethodWrapperType, MethodDescriptorType) -def get_type_hints(obj, globalns=None, localns=None): +def get_type_hints(obj, globalns=None, localns=None, include_extras=False): """Return type hints for an object. This is often the same as obj.__annotations__, but it handles - forward references encoded as string literals, and if necessary - adds Optional[t] if a default value equal to None is set. + forward references encoded as string literals, adds Optional[t] if a + default value equal to None is set and recursively replaces all + 'Annotated[T, ...]' with 'T' (unless 'include_extras=True'). The argument may be a module, class, method, or function. The annotations are returned as a dictionary. For classes, annotations include also @@ -1231,7 +1353,7 @@ def get_type_hints(obj, globalns=None, localns=None): value = ForwardRef(value, is_argument=False) value = _eval_type(value, base_globals, localns) hints[name] = value - return hints + return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()} if globalns is None: if isinstance(obj, types.ModuleType): @@ -1265,14 +1387,32 @@ def get_type_hints(obj, globalns=None, localns=None): if name in defaults and defaults[name] is None: value = Optional[value] hints[name] = value - return hints + return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()} + + +def _strip_annotations(t): + """Strips the annotations from a given type. + """ + if isinstance(t, _AnnotatedAlias): + return _strip_annotations(t.__origin__) + if isinstance(t, _GenericAlias): + stripped_args = tuple(_strip_annotations(a) for a in t.__args__) + if stripped_args == t.__args__: + return t + return t.copy_with(stripped_args) + if isinstance(t, GenericAlias): + stripped_args = tuple(_strip_annotations(a) for a in t.__args__) + if stripped_args == t.__args__: + return t + return GenericAlias(t.__origin__, stripped_args) + return t def get_origin(tp): """Get the unsubscripted version of a type. - This supports generic types, Callable, Tuple, Union, Literal, Final and ClassVar. - Return None for unsupported types. Examples:: + This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar + and Annotated. Return None for unsupported types. Examples:: get_origin(Literal[42]) is Literal get_origin(int) is None @@ -1282,7 +1422,9 @@ def get_origin(tp): get_origin(Union[T, int]) is Union get_origin(List[Tuple[T, T]][int]) == list """ - if isinstance(tp, _GenericAlias): + if isinstance(tp, _AnnotatedAlias): + return Annotated + if isinstance(tp, (_BaseGenericAlias, GenericAlias)): return tp.__origin__ if tp is Generic: return Generic @@ -1300,11 +1442,15 @@ def get_args(tp): get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int]) get_args(Callable[[], T][int]) == ([], int) """ - if isinstance(tp, _GenericAlias) and not tp._special: + if isinstance(tp, _AnnotatedAlias): + return (tp.__origin__,) + tp.__metadata__ + if isinstance(tp, _GenericAlias): res = tp.__args__ - if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis: + if tp.__origin__ is collections.abc.Callable and res[0] is not Ellipsis: res = (list(res[:-1]), res[-1]) return res + if isinstance(tp, GenericAlias): + return tp.__args__ return () @@ -1432,21 +1578,20 @@ AnyStr = TypeVar('AnyStr', bytes, str) # Various ABCs mimicking those in collections.abc. -def _alias(origin, params, inst=True): - return _GenericAlias(origin, params, special=True, inst=inst) - -Hashable = _alias(collections.abc.Hashable, ()) # Not generic. -Awaitable = _alias(collections.abc.Awaitable, T_co) -Coroutine = _alias(collections.abc.Coroutine, (T_co, T_contra, V_co)) -AsyncIterable = _alias(collections.abc.AsyncIterable, T_co) -AsyncIterator = _alias(collections.abc.AsyncIterator, T_co) -Iterable = _alias(collections.abc.Iterable, T_co) -Iterator = _alias(collections.abc.Iterator, T_co) -Reversible = _alias(collections.abc.Reversible, T_co) -Sized = _alias(collections.abc.Sized, ()) # Not generic. -Container = _alias(collections.abc.Container, T_co) -Collection = _alias(collections.abc.Collection, T_co) -Callable = _VariadicGenericAlias(collections.abc.Callable, (), special=True) +_alias = _SpecialGenericAlias + +Hashable = _alias(collections.abc.Hashable, 0) # Not generic. +Awaitable = _alias(collections.abc.Awaitable, 1) +Coroutine = _alias(collections.abc.Coroutine, 3) +AsyncIterable = _alias(collections.abc.AsyncIterable, 1) +AsyncIterator = _alias(collections.abc.AsyncIterator, 1) +Iterable = _alias(collections.abc.Iterable, 1) +Iterator = _alias(collections.abc.Iterator, 1) +Reversible = _alias(collections.abc.Reversible, 1) +Sized = _alias(collections.abc.Sized, 0) # Not generic. +Container = _alias(collections.abc.Container, 1) +Collection = _alias(collections.abc.Collection, 1) +Callable = _CallableType(collections.abc.Callable, 2) Callable.__doc__ = \ """Callable type; Callable[[int], str] is a function of (int) -> str. @@ -1457,15 +1602,16 @@ Callable.__doc__ = \ There is no syntax to indicate optional or keyword arguments, such function types are rarely used as callback types. """ -AbstractSet = _alias(collections.abc.Set, T_co) -MutableSet = _alias(collections.abc.MutableSet, T) +AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet') +MutableSet = _alias(collections.abc.MutableSet, 1) # NOTE: Mapping is only covariant in the value type. -Mapping = _alias(collections.abc.Mapping, (KT, VT_co)) -MutableMapping = _alias(collections.abc.MutableMapping, (KT, VT)) -Sequence = _alias(collections.abc.Sequence, T_co) -MutableSequence = _alias(collections.abc.MutableSequence, T) -ByteString = _alias(collections.abc.ByteString, ()) # Not generic -Tuple = _VariadicGenericAlias(tuple, (), inst=False, special=True) +Mapping = _alias(collections.abc.Mapping, 2) +MutableMapping = _alias(collections.abc.MutableMapping, 2) +Sequence = _alias(collections.abc.Sequence, 1) +MutableSequence = _alias(collections.abc.MutableSequence, 1) +ByteString = _alias(collections.abc.ByteString, 0) # Not generic +# Tuple accepts variable number of parameters. +Tuple = _TupleType(tuple, -1, inst=False, name='Tuple') Tuple.__doc__ = \ """Tuple type; Tuple[X, Y] is the cross-product type of X and Y. @@ -1475,24 +1621,24 @@ Tuple.__doc__ = \ To specify a variable-length tuple of homogeneous type, use Tuple[T, ...]. """ -List = _alias(list, T, inst=False) -Deque = _alias(collections.deque, T) -Set = _alias(set, T, inst=False) -FrozenSet = _alias(frozenset, T_co, inst=False) -MappingView = _alias(collections.abc.MappingView, T_co) -KeysView = _alias(collections.abc.KeysView, KT) -ItemsView = _alias(collections.abc.ItemsView, (KT, VT_co)) -ValuesView = _alias(collections.abc.ValuesView, VT_co) -ContextManager = _alias(contextlib.AbstractContextManager, T_co) -AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, T_co) -Dict = _alias(dict, (KT, VT), inst=False) -DefaultDict = _alias(collections.defaultdict, (KT, VT)) -OrderedDict = _alias(collections.OrderedDict, (KT, VT)) -Counter = _alias(collections.Counter, T) -ChainMap = _alias(collections.ChainMap, (KT, VT)) -Generator = _alias(collections.abc.Generator, (T_co, T_contra, V_co)) -AsyncGenerator = _alias(collections.abc.AsyncGenerator, (T_co, T_contra)) -Type = _alias(type, CT_co, inst=False) +List = _alias(list, 1, inst=False, name='List') +Deque = _alias(collections.deque, 1, name='Deque') +Set = _alias(set, 1, inst=False, name='Set') +FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet') +MappingView = _alias(collections.abc.MappingView, 1) +KeysView = _alias(collections.abc.KeysView, 1) +ItemsView = _alias(collections.abc.ItemsView, 2) +ValuesView = _alias(collections.abc.ValuesView, 1) +ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager') +AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager') +Dict = _alias(dict, 2, inst=False, name='Dict') +DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict') +OrderedDict = _alias(collections.OrderedDict, 2) +Counter = _alias(collections.Counter, 1) +ChainMap = _alias(collections.ChainMap, 2) +Generator = _alias(collections.abc.Generator, 3) +AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2) +Type = _alias(type, 1, inst=False, name='Type') Type.__doc__ = \ """A special construct usable to annotate class objects. @@ -1588,50 +1734,41 @@ class SupportsRound(Protocol[T_co]): pass -def _make_nmtuple(name, types): - msg = "NamedTuple('Name', [(f0, t0), (f1, t1), ...]); each t must be a type" - types = [(n, _type_check(t, msg)) for n, t in types] - nm_tpl = collections.namedtuple(name, [n for n, t in types]) - # Prior to PEP 526, only _field_types attribute was assigned. - # Now __annotations__ are used and _field_types is deprecated (remove in 3.9) - nm_tpl.__annotations__ = nm_tpl._field_types = dict(types) - try: - nm_tpl.__module__ = sys._getframe(2).f_globals.get('__name__', '__main__') - except (AttributeError, ValueError): - pass +def _make_nmtuple(name, types, module, defaults = ()): + fields = [n for n, t in types] + types = {n: _type_check(t, f"field {n} annotation must be a type") + for n, t in types} + nm_tpl = collections.namedtuple(name, fields, + defaults=defaults, module=module) + nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types return nm_tpl # attributes prohibited to set in NamedTuple class syntax -_prohibited = ('__new__', '__init__', '__slots__', '__getnewargs__', - '_fields', '_field_defaults', '_field_types', - '_make', '_replace', '_asdict', '_source') +_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__', + '_fields', '_field_defaults', + '_make', '_replace', '_asdict', '_source'}) -_special = ('__module__', '__name__', '__annotations__') +_special = frozenset({'__module__', '__name__', '__annotations__'}) class NamedTupleMeta(type): def __new__(cls, typename, bases, ns): - if ns.get('_root', False): - return super().__new__(cls, typename, bases, ns) + assert bases[0] is _NamedTuple types = ns.get('__annotations__', {}) - nm_tpl = _make_nmtuple(typename, types.items()) - defaults = [] - defaults_dict = {} + default_names = [] for field_name in types: if field_name in ns: - default_value = ns[field_name] - defaults.append(default_value) - defaults_dict[field_name] = default_value - elif defaults: - raise TypeError("Non-default namedtuple field {field_name} cannot " - "follow default field(s) {default_names}" - .format(field_name=field_name, - default_names=', '.join(defaults_dict.keys()))) - nm_tpl.__new__.__annotations__ = dict(types) - nm_tpl.__new__.__defaults__ = tuple(defaults) - nm_tpl._field_defaults = defaults_dict + default_names.append(field_name) + elif default_names: + raise TypeError(f"Non-default namedtuple field {field_name} " + f"cannot follow default field" + f"{'s' if len(default_names) > 1 else ''} " + f"{', '.join(default_names)}") + nm_tpl = _make_nmtuple(typename, types.items(), + defaults=[ns[n] for n in default_names], + module=ns['__module__']) # update from user namespace without overriding special namedtuple attributes for key in ns: if key in _prohibited: @@ -1641,7 +1778,7 @@ class NamedTupleMeta(type): return nm_tpl -class NamedTuple(metaclass=NamedTupleMeta): +def NamedTuple(typename, fields=None, /, **kwargs): """Typed version of namedtuple. Usage in Python versions >= 3.6:: @@ -1665,99 +1802,81 @@ class NamedTuple(metaclass=NamedTupleMeta): Employee = NamedTuple('Employee', [('name', str), ('id', int)]) """ - _root = True - - def __new__(*args, **kwargs): - if not args: - raise TypeError('NamedTuple.__new__(): not enough arguments') - cls, *args = args # allow the "cls" keyword be passed - if args: - typename, *args = args # allow the "typename" keyword be passed - elif 'typename' in kwargs: - typename = kwargs.pop('typename') - import warnings - warnings.warn("Passing 'typename' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError("NamedTuple.__new__() missing 1 required positional " - "argument: 'typename'") - if args: - try: - fields, = args # allow the "fields" keyword be passed - except ValueError: - raise TypeError(f'NamedTuple.__new__() takes from 2 to 3 ' - f'positional arguments but {len(args) + 2} ' - f'were given') from None - elif 'fields' in kwargs and len(kwargs) == 1: - fields = kwargs.pop('fields') - import warnings - warnings.warn("Passing 'fields' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - fields = None - - if fields is None: - fields = kwargs.items() - elif kwargs: - raise TypeError("Either list of fields or keywords" - " can be provided to NamedTuple, not both") - return _make_nmtuple(typename, fields) - __new__.__text_signature__ = '($cls, typename, fields=None, /, **kwargs)' - - -def _dict_new(cls, /, *args, **kwargs): - return dict(*args, **kwargs) - - -def _typeddict_new(cls, typename, fields=None, /, *, total=True, **kwargs): if fields is None: - fields = kwargs + fields = kwargs.items() elif kwargs: - raise TypeError("TypedDict takes either a dict or keyword arguments," - " but not both") - - ns = {'__annotations__': dict(fields), '__total__': total} + raise TypeError("Either list of fields or keywords" + " can be provided to NamedTuple, not both") try: - # Setting correct module is necessary to make typed dict classes pickleable. - ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') + module = sys._getframe(1).f_globals.get('__name__', '__main__') except (AttributeError, ValueError): - pass + module = None + return _make_nmtuple(typename, fields, module=module) - return _TypedDictMeta(typename, (), ns) +_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {}) +def _namedtuple_mro_entries(bases): + if len(bases) > 1: + raise TypeError("Multiple inheritance with NamedTuple is not supported") + assert bases[0] is NamedTuple + return (_NamedTuple,) -def _check_fails(cls, other): - # Typed dicts are only for static structural subtyping. - raise TypeError('TypedDict does not support instance and class checks') +NamedTuple.__mro_entries__ = _namedtuple_mro_entries class _TypedDictMeta(type): def __new__(cls, name, bases, ns, total=True): """Create new typed dict class object. - This method is called directly when TypedDict is subclassed, - or via _typeddict_new when TypedDict is instantiated. This way + This method is called when TypedDict is subclassed, + or when TypedDict is instantiated. This way TypedDict supports all three syntax forms described in its docstring. - Subclasses and instances of TypedDict return actual dictionaries - via _dict_new. + Subclasses and instances of TypedDict return actual dictionaries. """ - ns['__new__'] = _typeddict_new if name == 'TypedDict' else _dict_new - tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns) - - anns = ns.get('__annotations__', {}) + for base in bases: + if type(base) is not _TypedDictMeta: + raise TypeError('cannot inherit from both a TypedDict type ' + 'and a non-TypedDict base class') + tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns) + + annotations = {} + own_annotations = ns.get('__annotations__', {}) + own_annotation_keys = set(own_annotations.keys()) msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" - anns = {n: _type_check(tp, msg) for n, tp in anns.items()} + own_annotations = { + n: _type_check(tp, msg) for n, tp in own_annotations.items() + } + required_keys = set() + optional_keys = set() + for base in bases: - anns.update(base.__dict__.get('__annotations__', {})) - tp_dict.__annotations__ = anns + annotations.update(base.__dict__.get('__annotations__', {})) + required_keys.update(base.__dict__.get('__required_keys__', ())) + optional_keys.update(base.__dict__.get('__optional_keys__', ())) + + annotations.update(own_annotations) + if total: + required_keys.update(own_annotation_keys) + else: + optional_keys.update(own_annotation_keys) + + tp_dict.__annotations__ = annotations + tp_dict.__required_keys__ = frozenset(required_keys) + tp_dict.__optional_keys__ = frozenset(optional_keys) if not hasattr(tp_dict, '__total__'): tp_dict.__total__ = total return tp_dict - __instancecheck__ = __subclasscheck__ = _check_fails + __call__ = dict # static method + def __subclasscheck__(cls, other): + # Typed dicts are only for static structural subtyping. + raise TypeError('TypedDict does not support instance and class checks') -class TypedDict(dict, metaclass=_TypedDictMeta): + __instancecheck__ = __subclasscheck__ + + +def TypedDict(typename, fields=None, /, *, total=True, **kwargs): """A simple typed namespace. At runtime it is equivalent to a plain dict. TypedDict creates a dictionary type that expects all of its @@ -1776,8 +1895,9 @@ class TypedDict(dict, metaclass=_TypedDictMeta): assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') - The type info can be accessed via Point2D.__annotations__. TypedDict - supports two additional equivalent forms:: + The type info can be accessed via the Point2D.__annotations__ dict, and + the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets. + TypedDict supports two additional equivalent forms:: Point2D = TypedDict('Point2D', x=int, y=int, label=str) Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) @@ -1798,6 +1918,23 @@ class TypedDict(dict, metaclass=_TypedDictMeta): The class syntax is only supported in Python 3.6+, while two other syntax forms work for Python 2.7 and 3.2+ """ + if fields is None: + fields = kwargs + elif kwargs: + raise TypeError("TypedDict takes either a dict or keyword arguments," + " but not both") + + ns = {'__annotations__': dict(fields), '__total__': total} + try: + # Setting correct module is necessary to make typed dict classes pickleable. + ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass + + return _TypedDictMeta(typename, (), ns) + +_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {}) +TypedDict.__mro_entries__ = lambda bases: (_TypedDict,) def NewType(name, tp): @@ -1995,8 +2132,8 @@ class io: io.__name__ = __name__ + '.io' sys.modules[io.__name__] = io -Pattern = _alias(stdlib_re.Pattern, AnyStr) -Match = _alias(stdlib_re.Match, AnyStr) +Pattern = _alias(stdlib_re.Pattern, 1) +Match = _alias(stdlib_re.Match, 1) class re: """Wrapper namespace for re type aliases.""" diff --git a/Lib/unittest/__init__.py b/Lib/unittest/__init__.py index ace3a6fb..348dc471 100644 --- a/Lib/unittest/__init__.py +++ b/Lib/unittest/__init__.py @@ -57,7 +57,6 @@ __all__.extend(['getTestCaseNames', 'makeSuite', 'findTestCases']) __unittest = True from .result import TestResult -from .async_case import IsolatedAsyncioTestCase from .case import (addModuleCleanup, TestCase, FunctionTestCase, SkipTest, skip, skipIf, skipUnless, expectedFailure) from .suite import BaseTestSuite, TestSuite @@ -66,6 +65,7 @@ from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames, from .main import TestProgram, main from .runner import TextTestRunner, TextTestResult from .signals import installHandler, registerResult, removeResult, removeHandler +# IsolatedAsyncioTestCase will be imported lazily. # deprecated _TextTestResult = TextTestResult @@ -78,3 +78,18 @@ def load_tests(loader, tests, pattern): # top level directory cached on loader instance this_dir = os.path.dirname(__file__) return loader.discover(start_dir=this_dir, pattern=pattern) + + +# Lazy import of IsolatedAsyncioTestCase from .async_case +# It imports asyncio, which is relatively heavy, but most tests +# do not need it. + +def __dir__(): + return globals().keys() | {'IsolatedAsyncioTestCase'} + +def __getattr__(name): + if name == 'IsolatedAsyncioTestCase': + global IsolatedAsyncioTestCase + from .async_case import IsolatedAsyncioTestCase + return IsolatedAsyncioTestCase + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/Lib/unittest/_log.py b/Lib/unittest/_log.py new file mode 100644 index 00000000..94e7e758 --- /dev/null +++ b/Lib/unittest/_log.py @@ -0,0 +1,69 @@ +import logging +import collections + +from .case import _BaseTestCaseContext + + +_LoggingWatcher = collections.namedtuple("_LoggingWatcher", + ["records", "output"]) + +class _CapturingHandler(logging.Handler): + """ + A logging handler capturing all (raw and formatted) logging output. + """ + + def __init__(self): + logging.Handler.__init__(self) + self.watcher = _LoggingWatcher([], []) + + def flush(self): + pass + + def emit(self, record): + self.watcher.records.append(record) + msg = self.format(record) + self.watcher.output.append(msg) + + +class _AssertLogsContext(_BaseTestCaseContext): + """A context manager used to implement TestCase.assertLogs().""" + + LOGGING_FORMAT = "%(levelname)s:%(name)s:%(message)s" + + def __init__(self, test_case, logger_name, level): + _BaseTestCaseContext.__init__(self, test_case) + self.logger_name = logger_name + if level: + self.level = logging._nameToLevel.get(level, level) + else: + self.level = logging.INFO + self.msg = None + + def __enter__(self): + if isinstance(self.logger_name, logging.Logger): + logger = self.logger = self.logger_name + else: + logger = self.logger = logging.getLogger(self.logger_name) + formatter = logging.Formatter(self.LOGGING_FORMAT) + handler = _CapturingHandler() + handler.setFormatter(formatter) + self.watcher = handler.watcher + self.old_handlers = logger.handlers[:] + self.old_level = logger.level + self.old_propagate = logger.propagate + logger.handlers = [handler] + logger.setLevel(self.level) + logger.propagate = False + return handler.watcher + + def __exit__(self, exc_type, exc_value, tb): + self.logger.handlers = self.old_handlers + self.logger.propagate = self.old_propagate + self.logger.setLevel(self.old_level) + if exc_type is not None: + # let unexpected exceptions pass through + return False + if len(self.watcher.records) == 0: + self._raiseFailure( + "no logs of level {} or higher triggered on {}" + .format(logging.getLevelName(self.level), self.logger.name)) diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 3223c0bf..f8bc865e 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -3,7 +3,6 @@ import sys import functools import difflib -import logging import pprint import re import warnings @@ -241,6 +240,8 @@ class _AssertRaisesContext(_AssertRaisesBaseContext): expected_regex.pattern, str(exc_value))) return True + __class_getitem__ = classmethod(types.GenericAlias) + class _AssertWarnsContext(_AssertRaisesBaseContext): """A context manager used to implement TestCase.assertWarns* methods.""" @@ -251,7 +252,7 @@ class _AssertWarnsContext(_AssertRaisesBaseContext): def __enter__(self): # The __warningregistry__'s need to be in a pristine state for tests # to work properly. - for v in list(sys.modules.values()): + for v in sys.modules.values(): if getattr(v, '__warningregistry__', None): v.__warningregistry__ = {} self.warnings_manager = warnings.catch_warnings(record=True) @@ -295,73 +296,6 @@ class _AssertWarnsContext(_AssertRaisesBaseContext): -_LoggingWatcher = collections.namedtuple("_LoggingWatcher", - ["records", "output"]) - - -class _CapturingHandler(logging.Handler): - """ - A logging handler capturing all (raw and formatted) logging output. - """ - - def __init__(self): - logging.Handler.__init__(self) - self.watcher = _LoggingWatcher([], []) - - def flush(self): - pass - - def emit(self, record): - self.watcher.records.append(record) - msg = self.format(record) - self.watcher.output.append(msg) - - - -class _AssertLogsContext(_BaseTestCaseContext): - """A context manager used to implement TestCase.assertLogs().""" - - LOGGING_FORMAT = "%(levelname)s:%(name)s:%(message)s" - - def __init__(self, test_case, logger_name, level): - _BaseTestCaseContext.__init__(self, test_case) - self.logger_name = logger_name - if level: - self.level = logging._nameToLevel.get(level, level) - else: - self.level = logging.INFO - self.msg = None - - def __enter__(self): - if isinstance(self.logger_name, logging.Logger): - logger = self.logger = self.logger_name - else: - logger = self.logger = logging.getLogger(self.logger_name) - formatter = logging.Formatter(self.LOGGING_FORMAT) - handler = _CapturingHandler() - handler.setFormatter(formatter) - self.watcher = handler.watcher - self.old_handlers = logger.handlers[:] - self.old_level = logger.level - self.old_propagate = logger.propagate - logger.handlers = [handler] - logger.setLevel(self.level) - logger.propagate = False - return handler.watcher - - def __exit__(self, exc_type, exc_value, tb): - self.logger.handlers = self.old_handlers - self.logger.propagate = self.old_propagate - self.logger.setLevel(self.old_level) - if exc_type is not None: - # let unexpected exceptions pass through - return False - if len(self.watcher.records) == 0: - self._raiseFailure( - "no logs of level {} or higher triggered on {}" - .format(logging.getLevelName(self.level), self.logger.name)) - - class _OrderedChainMap(collections.ChainMap): def __iter__(self): seen = set() @@ -468,30 +402,13 @@ class TestCase(object): """ self._type_equality_funcs[typeobj] = function - def addCleanup(*args, **kwargs): + def addCleanup(self, function, /, *args, **kwargs): """Add a function, with arguments, to be called when the test is completed. Functions added are called on a LIFO basis and are called after tearDown on test failure or success. Cleanup items are called even if setUp fails (unlike tearDown).""" - if len(args) >= 2: - self, function, *args = args - elif not args: - raise TypeError("descriptor 'addCleanup' of 'TestCase' object " - "needs an argument") - elif 'function' in kwargs: - function = kwargs.pop('function') - self, *args = args - import warnings - warnings.warn("Passing 'function' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('addCleanup expected at least 1 positional ' - 'argument, got %d' % (len(args)-1)) - args = tuple(args) - self._cleanups.append((function, args, kwargs)) - addCleanup.__text_signature__ = '($self, function, /, *args, **kwargs)' @classmethod def addClassCleanup(cls, function, /, *args, **kwargs): @@ -729,7 +646,7 @@ class TestCase(object): function, args, kwargs = cls._class_cleanups.pop() try: function(*args, **kwargs) - except Exception as exc: + except Exception: cls.tearDown_exceptions.append(sys.exc_info()) def __call__(self, *args, **kwds): @@ -869,6 +786,8 @@ class TestCase(object): self.assertEqual(cm.output, ['INFO:foo:first message', 'ERROR:foo.bar:second message']) """ + # Lazy import to avoid importing logging if it is not needed. + from ._log import _AssertLogsContext return _AssertLogsContext(self, logger, level) def _getAssertEqualityFunc(self, first, second): diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 3629cf61..b495a5f6 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -23,8 +23,6 @@ __all__ = ( ) -__version__ = '1.0' - import asyncio import contextlib import io @@ -32,6 +30,7 @@ import inspect import pprint import sys import builtins +from asyncio import iscoroutinefunction from types import CodeType, ModuleType, MethodType from unittest.util import safe_repr from functools import wraps, partial @@ -50,12 +49,12 @@ def _is_async_obj(obj): return False if hasattr(obj, '__func__'): obj = getattr(obj, '__func__') - return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj) + return iscoroutinefunction(obj) or inspect.isawaitable(obj) def _is_async_func(func): if getattr(func, '__code__', None): - return asyncio.iscoroutinefunction(func) + return iscoroutinefunction(func) else: return False @@ -403,18 +402,12 @@ class NonCallableMock(Base): # so we can create magic methods on the # class without stomping on other mocks bases = (cls,) - if not issubclass(cls, AsyncMock): + if not issubclass(cls, AsyncMockMixin): # Check if spec is an async object or function - sig = inspect.signature(NonCallableMock.__init__) - bound_args = sig.bind_partial(cls, *args, **kw).arguments - spec_arg = [ - arg for arg in bound_args.keys() - if arg.startswith('spec') - ] - if spec_arg: - # what if spec_set is different than spec? - if _is_async_obj(bound_args[spec_arg[0]]): - bases = (AsyncMockMixin, cls,) + bound_args = _MOCK_SIG.bind_partial(cls, *args, **kw).arguments + spec_arg = bound_args.get('spec_set', bound_args.get('spec')) + if spec_arg and _is_async_obj(spec_arg): + bases = (AsyncMockMixin, cls) new = type(cls.__name__, bases, {'__doc__': cls.__doc__}) instance = _safe_super(NonCallableMock, cls).__new__(new) return instance @@ -496,7 +489,7 @@ class NonCallableMock(Base): _spec_asyncs = [] for attr in dir(spec): - if asyncio.iscoroutinefunction(getattr(spec, attr, None)): + if iscoroutinefunction(getattr(spec, attr, None)): _spec_asyncs.append(attr) if spec is not None and not _is_list(spec): @@ -600,7 +593,7 @@ class NonCallableMock(Base): for child in self._mock_children.values(): if isinstance(child, _SpecState) or child is _deleted: continue - child.reset_mock(visited) + child.reset_mock(visited, return_value=return_value, side_effect=side_effect) ret = self._mock_return_value if _is_instance_mock(ret) and ret is not self: @@ -857,7 +850,8 @@ class NonCallableMock(Base): else: name, args, kwargs = _call try: - return name, sig.bind(*args, **kwargs) + bound_call = sig.bind(*args, **kwargs) + return call(name, bound_call.args, bound_call.kwargs) except TypeError as e: return e.with_traceback(None) else: @@ -906,9 +900,9 @@ class NonCallableMock(Base): def _error_message(): msg = self._format_mock_failure_message(args, kwargs) return msg - expected = self._call_matcher((args, kwargs)) + expected = self._call_matcher(_Call((args, kwargs), two=True)) actual = self._call_matcher(self.call_args) - if expected != actual: + if actual != expected: cause = expected if isinstance(expected, Exception) else None raise AssertionError(_error_message()) from cause @@ -976,10 +970,10 @@ class NonCallableMock(Base): The assert passes if the mock has *ever* been called, unlike `assert_called_with` and `assert_called_once_with` that only pass if the call is the most recent one.""" - expected = self._call_matcher((args, kwargs)) + expected = self._call_matcher(_Call((args, kwargs), two=True)) + cause = expected if isinstance(expected, Exception) else None actual = [self._call_matcher(c) for c in self.call_args_list] - if expected not in actual: - cause = expected if isinstance(expected, Exception) else None + if cause or expected not in _AnyComparer(actual): expected_string = self._format_mock_call_signature(args, kwargs) raise AssertionError( '%s call not found' % expected_string @@ -1038,6 +1032,24 @@ class NonCallableMock(Base): return f"\n{prefix}: {safe_repr(self.mock_calls)}." +_MOCK_SIG = inspect.signature(NonCallableMock.__init__) + + +class _AnyComparer(list): + """A list which checks if it contains a call which may have an + argument of ANY, flipping the components of item and self from + their traditional locations so that ANY is guaranteed to be on + the left.""" + def __contains__(self, item): + for _call in self: + assert len(item) == len(_call) + if all([ + expected == actual + for expected, actual in zip(item, _call) + ]): + return True + return False + def _try_iter(obj): if obj is None: @@ -1696,7 +1708,8 @@ def patch( "as"; very useful if `patch` is creating a mock object for you. `patch` takes arbitrary keyword arguments. These will be passed to - the `Mock` (or `new_callable`) on construction. + `AsyncMock` if the patched object is asynchronous, to `MagicMock` + otherwise or to `new_callable` if specified. `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are available for alternate use-cases. @@ -1820,11 +1833,27 @@ class _patch_dict(object): def __exit__(self, *args): """Unpatch the dict.""" - self._unpatch_dict() + if self._original is not None: + self._unpatch_dict() return False - start = __enter__ - stop = __exit__ + + def start(self): + """Activate a patch, returning any created mock.""" + result = self.__enter__() + _patch._active_patches.append(self) + return result + + + def stop(self): + """Stop an active patch.""" + try: + _patch._active_patches.remove(self) + except ValueError: + # If the patch hasn't been started this will fail + return None + + return self.__exit__(None, None, None) def _clear_dict(in_dict): @@ -2096,7 +2125,7 @@ class AsyncMockMixin(Base): def __init__(self, /, *args, **kwargs): super().__init__(*args, **kwargs) - # asyncio.iscoroutinefunction() checks _is_coroutine property to say if an + # iscoroutinefunction() checks _is_coroutine property to say if an # object is a coroutine. Without this check it looks to see if it is a # function/method, which in this case it is not (since it is an # AsyncMock). @@ -2111,7 +2140,7 @@ class AsyncMockMixin(Base): self.__dict__['__code__'] = code_mock async def _execute_mock_call(self, /, *args, **kwargs): - # This is nearly just like super(), except for sepcial handling + # This is nearly just like super(), except for special handling # of coroutines _call = _Call((args, kwargs), two=True) @@ -2132,7 +2161,7 @@ class AsyncMockMixin(Base): raise StopAsyncIteration if _is_exception(result): raise result - elif asyncio.iscoroutinefunction(effect): + elif iscoroutinefunction(effect): result = await effect(*args, **kwargs) else: result = effect(*args, **kwargs) @@ -2144,7 +2173,7 @@ class AsyncMockMixin(Base): return self.return_value if self._mock_wraps is not None: - if asyncio.iscoroutinefunction(self._mock_wraps): + if iscoroutinefunction(self._mock_wraps): return await self._mock_wraps(*args, **kwargs) return self._mock_wraps(*args, **kwargs) @@ -2179,9 +2208,9 @@ class AsyncMockMixin(Base): msg = self._format_mock_failure_message(args, kwargs, action='await') return msg - expected = self._call_matcher((args, kwargs)) + expected = self._call_matcher(_Call((args, kwargs), two=True)) actual = self._call_matcher(self.await_args) - if expected != actual: + if actual != expected: cause = expected if isinstance(expected, Exception) else None raise AssertionError(_error_message()) from cause @@ -2200,10 +2229,10 @@ class AsyncMockMixin(Base): """ Assert the mock has ever been awaited with the specified arguments. """ - expected = self._call_matcher((args, kwargs)) + expected = self._call_matcher(_Call((args, kwargs), two=True)) + cause = expected if isinstance(expected, Exception) else None actual = [self._call_matcher(c) for c in self.await_args_list] - if expected not in actual: - cause = expected if isinstance(expected, Exception) else None + if cause or expected not in _AnyComparer(actual): expected_string = self._format_mock_call_signature(args, kwargs) raise AssertionError( '%s await not found' % expected_string @@ -2281,7 +2310,7 @@ class AsyncMock(AsyncMockMixin, AsyncMagicMixin, Mock): recognized as an async function, and the result of a call is an awaitable: >>> mock = AsyncMock() - >>> asyncio.iscoroutinefunction(mock) + >>> iscoroutinefunction(mock) True >>> inspect.isawaitable(mock()) True @@ -2408,12 +2437,10 @@ class _Call(tuple): def __eq__(self, other): - if other is ANY: - return True try: len_other = len(other) except TypeError: - return False + return NotImplemented self_name = '' if len(self) == 2: @@ -2486,12 +2513,6 @@ class _Call(tuple): return tuple.__getattribute__(self, attr) - def count(self, /, *args, **kwargs): - return self.__getattr__('count')(*args, **kwargs) - - def index(self, /, *args, **kwargs): - return self.__getattr__('index')(*args, **kwargs) - def _get_call_arguments(self): if len(self) == 2: args, kwargs = self @@ -2656,7 +2677,7 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, skipfirst = _must_skip(spec, entry, is_type) kwargs['_eat_self'] = skipfirst - if asyncio.iscoroutinefunction(original): + if iscoroutinefunction(original): child_klass = AsyncMock else: child_klass = MagicMock @@ -2862,9 +2883,6 @@ class _AsyncIterator: code_mock.co_flags = inspect.CO_ITERABLE_COROUTINE self.__dict__['__code__'] = code_mock - def __aiter__(self): - return self - async def __anext__(self): try: return next(self.iterator) diff --git a/Lib/unittest/result.py b/Lib/unittest/result.py index c7e3206d..111317b3 100644 --- a/Lib/unittest/result.py +++ b/Lib/unittest/result.py @@ -161,7 +161,7 @@ class TestResult(object): """Tells whether or not this result was a success.""" # The hasattr check is for test_result's OldResult test. That # way this method works on objects that lack the attribute. - # (where would such result intances come from? old stored pickles?) + # (where would such result instances come from? old stored pickles?) return ((len(self.failures) == len(self.errors) == 0) and (not hasattr(self, 'unexpectedSuccesses') or len(self.unexpectedSuccesses) == 0)) diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py index 3dedcbe6..f855c4dc 100644 --- a/Lib/unittest/test/test_case.py +++ b/Lib/unittest/test/test_case.py @@ -8,7 +8,6 @@ import logging import warnings import weakref import inspect -import types from copy import deepcopy from test import support @@ -1351,20 +1350,6 @@ test case pass self.assertRaises(TypeError, self.assertWarnsRegex, MyWarn, lambda: True) - def testAssertWarnsModifySysModules(self): - # bpo-29620: handle modified sys.modules during iteration - class Foo(types.ModuleType): - @property - def __warningregistry__(self): - sys.modules['@bar@'] = 'bar' - - sys.modules['@foo@'] = Foo('foo') - try: - self.assertWarns(UserWarning, warnings.warn, 'expected') - finally: - del sys.modules['@foo@'] - del sys.modules['@bar@'] - def testAssertRaisesRegexMismatch(self): def Stub(): raise Exception('Unexpected') diff --git a/Lib/unittest/test/test_program.py b/Lib/unittest/test/test_program.py index 4a62ae1b..eef82ff9 100644 --- a/Lib/unittest/test/test_program.py +++ b/Lib/unittest/test/test_program.py @@ -188,8 +188,6 @@ class TestCommandLineArgs(unittest.TestCase): program = self.program for arg, attr in (('buffer', 'buffer'), ('failfast', 'failfast'), ('catch', 'catchbreak')): - if attr == 'catch' and not hasInstallHandler: - continue setattr(program, attr, None) program.parseArgs([None]) diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py index 7d363407..dd9a1b6d 100644 --- a/Lib/unittest/test/test_runner.py +++ b/Lib/unittest/test/test_runner.py @@ -592,7 +592,7 @@ class TestModuleCleanUp(unittest.TestCase): class TestableTest(unittest.TestCase): def setUp(self2): self2.addCleanup(cleanup, 1, 2, function=3, self=4) - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): self2.addCleanup(function=cleanup, arg='hello') def testNothing(self): pass @@ -603,8 +603,7 @@ class TestModuleCleanUp(unittest.TestCase): unittest.TestCase.addCleanup(self=TestableTest(), function=cleanup) runTests(TestableTest) self.assertEqual(cleanups, - [((), {'arg': 'hello'}), - ((1, 2), {'function': 3, 'self': 4})]) + [((1, 2), {'function': 3, 'self': 4})]) def test_with_errors_in_addClassCleanup(self): ordering = [] diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index e84c66c0..690ca4f5 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -1,8 +1,12 @@ import asyncio +import gc import inspect import re import unittest +from contextlib import contextmanager +from asyncio import run, iscoroutinefunction +from unittest import IsolatedAsyncioTestCase from unittest.mock import (ANY, call, AsyncMock, patch, MagicMock, Mock, create_autospec, sentinel, _CallList) @@ -12,49 +16,48 @@ def tearDownModule(): class AsyncClass: - def __init__(self): - pass - async def async_method(self): - pass - def normal_method(self): - pass + def __init__(self): pass + async def async_method(self): pass + def normal_method(self): pass @classmethod - async def async_class_method(cls): - pass + async def async_class_method(cls): pass @staticmethod - async def async_static_method(): - pass + async def async_static_method(): pass class AwaitableClass: - def __await__(self): - yield + def __await__(self): yield -async def async_func(): - pass +async def async_func(): pass -async def async_func_args(a, b, *, c): - pass +async def async_func_args(a, b, *, c): pass -def normal_func(): - pass +def normal_func(): pass class NormalClass(object): - def a(self): - pass + def a(self): pass async_foo_name = f'{__name__}.AsyncClass' normal_foo_name = f'{__name__}.NormalClass' +@contextmanager +def assertNeverAwaited(test): + with test.assertWarnsRegex(RuntimeWarning, "was never awaited$"): + yield + # In non-CPython implementations of Python, this is needed because timely + # deallocation is not guaranteed by the garbage collector. + gc.collect() + + class AsyncPatchDecoratorTest(unittest.TestCase): def test_is_coroutine_function_patch(self): @patch.object(AsyncClass, 'async_method') def test_async(mock_method): - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) test_async() def test_is_async_patch(self): @@ -62,13 +65,13 @@ class AsyncPatchDecoratorTest(unittest.TestCase): def test_async(mock_method): m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) @patch(f'{async_foo_name}.async_method') def test_no_parent_attribute(mock_method): m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) test_async() test_no_parent_attribute() @@ -107,7 +110,7 @@ class AsyncPatchDecoratorTest(unittest.TestCase): self.assertEqual(await async_func(), 1) self.assertEqual(await async_func_args(1, 2, c=3), 2) - asyncio.run(test_async()) + run(test_async()) self.assertTrue(inspect.iscoroutinefunction(async_func)) @@ -115,7 +118,7 @@ class AsyncPatchCMTest(unittest.TestCase): def test_is_async_function_cm(self): def test_async(): with patch.object(AsyncClass, 'async_method') as mock_method: - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) test_async() @@ -124,7 +127,7 @@ class AsyncPatchCMTest(unittest.TestCase): with patch.object(AsyncClass, 'async_method') as mock_method: m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) test_async() @@ -141,31 +144,31 @@ class AsyncPatchCMTest(unittest.TestCase): self.assertIsInstance(async_func, AsyncMock) self.assertTrue(inspect.iscoroutinefunction(async_func)) - asyncio.run(test_async()) + run(test_async()) class AsyncMockTest(unittest.TestCase): def test_iscoroutinefunction_default(self): mock = AsyncMock() - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) def test_iscoroutinefunction_function(self): async def foo(): pass mock = AsyncMock(foo) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertTrue(inspect.iscoroutinefunction(mock)) def test_isawaitable(self): mock = AsyncMock() m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) self.assertIn('assert_awaited', dir(mock)) def test_iscoroutinefunction_normal_function(self): def foo(): pass mock = AsyncMock(foo) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertTrue(inspect.iscoroutinefunction(mock)) def test_future_isfuture(self): @@ -211,9 +214,9 @@ class AsyncAutospecTest(unittest.TestCase): self.assertEqual(spec.await_args_list, []) spec.assert_not_awaited() - asyncio.run(main()) + run(main()) - self.assertTrue(asyncio.iscoroutinefunction(spec)) + self.assertTrue(iscoroutinefunction(spec)) self.assertTrue(asyncio.iscoroutine(awaitable)) self.assertEqual(spec.await_count, 1) self.assertEqual(spec.await_args, call(1, 2, c=3)) @@ -223,6 +226,10 @@ class AsyncAutospecTest(unittest.TestCase): spec.assert_awaited_with(1, 2, c=3) spec.assert_awaited() + with self.assertRaises(AssertionError): + spec.assert_any_await(e=1) + + def test_patch_with_autospec(self): async def test_async(): @@ -230,7 +237,7 @@ class AsyncAutospecTest(unittest.TestCase): awaitable = mock_method(1, 2, c=3) self.assertIsInstance(mock_method.mock, AsyncMock) - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) self.assertTrue(asyncio.iscoroutine(awaitable)) self.assertTrue(inspect.isawaitable(awaitable)) @@ -255,7 +262,7 @@ class AsyncAutospecTest(unittest.TestCase): self.assertIsNone(mock_method.await_args) self.assertEqual(mock_method.await_args_list, []) - asyncio.run(test_async()) + run(test_async()) class AsyncSpecTest(unittest.TestCase): @@ -278,8 +285,7 @@ class AsyncSpecTest(unittest.TestCase): def inner_test(mock_type): async_mock = mock_type(spec=async_func) self.assertIsInstance(async_mock, mock_type) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.assertTrue(inspect.isawaitable(async_mock())) sync_mock = mock_type(spec=normal_func) @@ -293,8 +299,7 @@ class AsyncSpecTest(unittest.TestCase): def inner_test(mock_type): async_mock = mock_type(async_func) self.assertIsInstance(async_mock, mock_type) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.assertTrue(inspect.isawaitable(async_mock())) sync_mock = mock_type(normal_func) @@ -309,14 +314,14 @@ class AsyncSpecTest(unittest.TestCase): self.assertIsInstance(mock, AsyncMock) m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) def test_spec_as_normal_positional_AsyncMock(self): mock = AsyncMock(normal_func) self.assertIsInstance(mock, AsyncMock) m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) def test_spec_async_mock(self): @patch.object(AsyncClass, 'async_method', spec=True) @@ -362,16 +367,17 @@ class AsyncSpecSetTest(unittest.TestCase): @patch.object(AsyncClass, 'async_method', spec_set=True) def test_async(async_method): self.assertIsInstance(async_method, AsyncMock) + test_async() def test_is_async_AsyncMock(self): mock = AsyncMock(spec_set=AsyncClass.async_method) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertIsInstance(mock, AsyncMock) def test_is_child_AsyncMock(self): mock = MagicMock(spec_set=AsyncClass) - self.assertTrue(asyncio.iscoroutinefunction(mock.async_method)) - self.assertFalse(asyncio.iscoroutinefunction(mock.normal_method)) + self.assertTrue(iscoroutinefunction(mock.async_method)) + self.assertFalse(iscoroutinefunction(mock.normal_method)) self.assertIsInstance(mock.async_method, AsyncMock) self.assertIsInstance(mock.normal_method, MagicMock) self.assertIsInstance(mock, MagicMock) @@ -384,10 +390,9 @@ class AsyncSpecSetTest(unittest.TestCase): self.assertIsInstance(cm, MagicMock) -class AsyncArguments(unittest.IsolatedAsyncioTestCase): +class AsyncArguments(IsolatedAsyncioTestCase): async def test_add_return_value(self): - async def addition(self, var): - return var + 1 + async def addition(self, var): pass mock = AsyncMock(addition, return_value=10) output = await mock(5) @@ -395,8 +400,7 @@ class AsyncArguments(unittest.IsolatedAsyncioTestCase): self.assertEqual(output, 10) async def test_add_side_effect_exception(self): - async def addition(var): - return var + 1 + async def addition(var): pass mock = AsyncMock(addition, side_effect=Exception('err')) with self.assertRaises(Exception): await mock(5) @@ -542,24 +546,20 @@ class AsyncMagicMethods(unittest.TestCase): self.assertIsInstance(m_mock.__aenter__, AsyncMock) self.assertIsInstance(m_mock.__aexit__, AsyncMock) # AsyncMocks are also coroutine functions - self.assertTrue(asyncio.iscoroutinefunction(m_mock.__aenter__)) - self.assertTrue(asyncio.iscoroutinefunction(m_mock.__aexit__)) + self.assertTrue(iscoroutinefunction(m_mock.__aenter__)) + self.assertTrue(iscoroutinefunction(m_mock.__aexit__)) class AsyncContextManagerTest(unittest.TestCase): + class WithAsyncContextManager: - async def __aenter__(self, *args, **kwargs): - self.entered = True - return self + async def __aenter__(self, *args, **kwargs): pass - async def __aexit__(self, *args, **kwargs): - self.exited = True + async def __aexit__(self, *args, **kwargs): pass class WithSyncContextManager: - def __enter__(self, *args, **kwargs): - return self + def __enter__(self, *args, **kwargs): pass - def __exit__(self, *args, **kwargs): - pass + def __exit__(self, *args, **kwargs): pass class ProductionCode: # Example real-world(ish) code @@ -580,7 +580,7 @@ class AsyncContextManagerTest(unittest.TestCase): response.json = AsyncMock(return_value={'json': 123}) cm.__aenter__.return_value = response pc.session.post.return_value = cm - result = asyncio.run(pc.main()) + result = run(pc.main()) self.assertEqual(result, {'json': 123}) for mock_type in [AsyncMock, MagicMock]: @@ -599,7 +599,7 @@ class AsyncContextManagerTest(unittest.TestCase): called = True return result - cm_result = asyncio.run(use_context_manager()) + cm_result = run(use_context_manager()) self.assertTrue(called) self.assertTrue(cm_mock.__aenter__.called) self.assertTrue(cm_mock.__aexit__.called) @@ -612,6 +612,7 @@ class AsyncContextManagerTest(unittest.TestCase): with self.subTest(f"test context manager magics with {mock_type}"): inner_test(mock_type) + def test_mock_customize_async_context_manager(self): instance = self.WithAsyncContextManager() mock_instance = MagicMock(instance) @@ -623,7 +624,7 @@ class AsyncContextManagerTest(unittest.TestCase): async with mock_instance as result: return result - self.assertIs(asyncio.run(use_context_manager()), expected_result) + self.assertIs(run(use_context_manager()), expected_result) def test_mock_customize_async_context_manager_with_coroutine(self): enter_called = False @@ -647,7 +648,7 @@ class AsyncContextManagerTest(unittest.TestCase): async with mock_instance: pass - asyncio.run(use_context_manager()) + run(use_context_manager()) self.assertTrue(enter_called) self.assertTrue(exit_called) @@ -659,7 +660,7 @@ class AsyncContextManagerTest(unittest.TestCase): instance = self.WithAsyncContextManager() mock_instance = MagicMock(instance) with self.assertRaises(TypeError): - asyncio.run(raise_in(mock_instance)) + run(raise_in(mock_instance)) class AsyncIteratorTest(unittest.TestCase): @@ -667,23 +668,16 @@ class AsyncIteratorTest(unittest.TestCase): def __init__(self): self.items = ["foo", "NormalFoo", "baz"] - def __aiter__(self): - return self - - async def __anext__(self): - try: - return self.items.pop() - except IndexError: - pass + def __aiter__(self): pass - raise StopAsyncIteration + async def __anext__(self): pass def test_aiter_set_return_value(self): mock_iter = AsyncMock(name="tester") mock_iter.__aiter__.return_value = [1, 2, 3] async def main(): return [i async for i in mock_iter] - result = asyncio.run(main()) + result = run(main()) self.assertEqual(result, [1, 2, 3]) def test_mock_aiter_and_anext_asyncmock(self): @@ -692,11 +686,11 @@ class AsyncIteratorTest(unittest.TestCase): mock_instance = mock_type(instance) # Check that the mock and the real thing bahave the same # __aiter__ is not actually async, so not a coroutinefunction - self.assertFalse(asyncio.iscoroutinefunction(instance.__aiter__)) - self.assertFalse(asyncio.iscoroutinefunction(mock_instance.__aiter__)) + self.assertFalse(iscoroutinefunction(instance.__aiter__)) + self.assertFalse(iscoroutinefunction(mock_instance.__aiter__)) # __anext__ is async - self.assertTrue(asyncio.iscoroutinefunction(instance.__anext__)) - self.assertTrue(asyncio.iscoroutinefunction(mock_instance.__anext__)) + self.assertTrue(iscoroutinefunction(instance.__anext__)) + self.assertTrue(iscoroutinefunction(mock_instance.__anext__)) for mock_type in [AsyncMock, MagicMock]: with self.subTest(f"test aiter and anext corourtine with {mock_type}"): @@ -714,18 +708,18 @@ class AsyncIteratorTest(unittest.TestCase): expected = ["FOO", "BAR", "BAZ"] def test_default(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) - self.assertEqual(asyncio.run(iterate(mock_instance)), []) + self.assertEqual(run(iterate(mock_instance)), []) def test_set_return_value(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) mock_instance.__aiter__.return_value = expected[:] - self.assertEqual(asyncio.run(iterate(mock_instance)), expected) + self.assertEqual(run(iterate(mock_instance)), expected) def test_set_return_value_iter(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) mock_instance.__aiter__.return_value = iter(expected[:]) - self.assertEqual(asyncio.run(iterate(mock_instance)), expected) + self.assertEqual(run(iterate(mock_instance)), expected) for mock_type in [AsyncMock, MagicMock]: with self.subTest(f"default value with {mock_type}"): @@ -750,10 +744,9 @@ class AsyncMockAssert(unittest.TestCase): def test_assert_called_but_not_awaited(self): mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): mock.async_method() - self.assertTrue(asyncio.iscoroutinefunction(mock.async_method)) + self.assertTrue(iscoroutinefunction(mock.async_method)) mock.async_method.assert_called() mock.async_method.assert_called_once() mock.async_method.assert_called_once_with() @@ -771,7 +764,7 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): mock.async_method.assert_awaited() - asyncio.run(self._await_coroutine(mock_coroutine)) + run(self._await_coroutine(mock_coroutine)) # Assert we haven't re-called the function mock.async_method.assert_called_once() mock.async_method.assert_awaited() @@ -785,21 +778,21 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): self.mock.assert_called() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_called_once() self.mock.assert_awaited_once() def test_assert_called_twice_and_awaited_once(self): mock = AsyncMock(AsyncClass) coroutine = mock.async_method() - with self.assertWarns(RuntimeWarning): - # The first call will be awaited so no warning there - # But this call will never get awaited, so it will warn here + # The first call will be awaited so no warning there + # But this call will never get awaited, so it will warn here + with assertNeverAwaited(self): mock.async_method() with self.assertRaises(AssertionError): mock.async_method.assert_awaited() mock.async_method.assert_called() - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) mock.async_method.assert_awaited() mock.async_method.assert_awaited_once() @@ -807,10 +800,10 @@ class AsyncMockAssert(unittest.TestCase): mock = AsyncMock(AsyncClass) coroutine = mock.async_method() mock.async_method.assert_called_once() - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) with self.assertRaises(RuntimeError): # Cannot reuse already awaited coroutine - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) mock.async_method.assert_awaited() def test_assert_awaited_but_not_called(self): @@ -820,7 +813,7 @@ class AsyncMockAssert(unittest.TestCase): self.mock.assert_called() with self.assertRaises(TypeError): # You cannot await an AsyncMock, it must be a coroutine - asyncio.run(self._await_coroutine(self.mock)) + run(self._await_coroutine(self.mock)) with self.assertRaises(AssertionError): self.mock.assert_awaited() @@ -829,38 +822,34 @@ class AsyncMockAssert(unittest.TestCase): def test_assert_has_calls_not_awaits(self): kalls = [call('foo')] - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock('foo') self.mock.assert_has_calls(kalls) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(kalls) def test_assert_has_mock_calls_on_async_mock_no_spec(self): - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock() kalls_empty = [('', (), {})] self.assertEqual(self.mock.mock_calls, kalls_empty) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock('foo') + with assertNeverAwaited(self): self.mock('baz') mock_kalls = ([call(), call('foo'), call('baz')]) self.assertEqual(self.mock.mock_calls, mock_kalls) def test_assert_has_mock_calls_on_async_mock_with_spec(self): a_class_mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): a_class_mock.async_method() kalls_empty = [('', (), {})] self.assertEqual(a_class_mock.async_method.mock_calls, kalls_empty) self.assertEqual(a_class_mock.mock_calls, [call.async_method()]) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): a_class_mock.async_method(1, 2, 3, a=4, b=5) method_kalls = [call(), call(1, 2, 3, a=4, b=5)] mock_kalls = [call.async_method(), call.async_method(1, 2, 3, a=4, b=5)] @@ -868,9 +857,9 @@ class AsyncMockAssert(unittest.TestCase): self.assertEqual(a_class_mock.mock_calls, mock_kalls) def test_async_method_calls_recorded(self): - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): self.mock.something(3, fish=None) + with assertNeverAwaited(self): self.mock.something_else.something(6, cake=sentinel.Cake) self.assertEqual(self.mock.method_calls, [ @@ -892,19 +881,20 @@ class AsyncMockAssert(unittest.TestCase): self.assertEqual(attr, []) assert_attrs(self.mock) - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): self.mock() + with assertNeverAwaited(self): self.mock(1, 2) + with assertNeverAwaited(self): self.mock(a=3) self.mock.reset_mock() assert_attrs(self.mock) a_mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): a_mock.async_method() + with assertNeverAwaited(self): a_mock.async_method(1, a=3) a_mock.reset_mock() @@ -914,17 +904,17 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): self.mock.assert_awaited() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_awaited() def test_assert_awaited_once(self): with self.assertRaises(AssertionError): self.mock.assert_awaited_once() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_awaited_once() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) with self.assertRaises(AssertionError): self.mock.assert_awaited_once() @@ -933,15 +923,15 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaisesRegex(AssertionError, msg): self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test()) + run(self._runnable_test()) msg = 'expected await not found' with self.assertRaisesRegex(AssertionError, msg): self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) with self.assertRaises(AssertionError): self.mock.assert_awaited_with('foo') @@ -949,10 +939,10 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): self.mock.assert_awaited_once_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_awaited_once_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_awaited_once_with('foo') @@ -960,14 +950,14 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) with self.assertRaises(AssertionError): self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) self.mock.assert_any_await('foo') def test_assert_has_awaits_no_order(self): @@ -977,43 +967,67 @@ class AsyncMockAssert(unittest.TestCase): self.mock.assert_has_awaits(calls) self.assertEqual(len(cm.exception.args), 1) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) self.mock.assert_has_awaits(calls) + def test_awaits_asserts_with_any(self): + class Foo: + def __eq__(self, other): pass + + run(self._runnable_test(Foo(), 1)) + + self.mock.assert_has_awaits([call(ANY, 1)]) + self.mock.assert_awaited_with(ANY, 1) + self.mock.assert_any_await(ANY, 1) + + def test_awaits_asserts_with_spec_and_any(self): + class Foo: + def __eq__(self, other): pass + + mock_with_spec = AsyncMock(spec=Foo) + + async def _custom_mock_runnable_test(*args): + await mock_with_spec(*args) + + run(_custom_mock_runnable_test(Foo(), 1)) + mock_with_spec.assert_has_awaits([call(ANY, 1)]) + mock_with_spec.assert_awaited_with(ANY, 1) + mock_with_spec.assert_any_await(ANY, 1) + def test_assert_has_awaits_ordered(self): calls = [call('foo'), call('baz')] with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('bamf')) + run(self._runnable_test('bamf')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('qux')) + run(self._runnable_test('qux')) self.mock.assert_has_awaits(calls, any_order=True) def test_assert_not_awaited(self): self.mock.assert_not_awaited() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) with self.assertRaises(AssertionError): self.mock.assert_not_awaited() @@ -1021,7 +1035,7 @@ class AsyncMockAssert(unittest.TestCase): async def f(x=None): pass self.mock = AsyncMock(spec=f) - asyncio.run(self._runnable_test(1)) + run(self._runnable_test(1)) with self.assertRaisesRegex( AssertionError, diff --git a/Lib/unittest/test/testmock/testhelpers.py b/Lib/unittest/test/testmock/testhelpers.py index f3c7acb9..9e7ec5d6 100644 --- a/Lib/unittest/test/testmock/testhelpers.py +++ b/Lib/unittest/test/testmock/testhelpers.py @@ -64,7 +64,28 @@ class AnyTest(unittest.TestCase): self.assertEqual(expected, mock.mock_calls) self.assertEqual(mock.mock_calls, expected) + def test_any_no_spec(self): + # This is a regression test for bpo-37555 + class Foo: + def __eq__(self, other): pass + + mock = Mock() + mock(Foo(), 1) + mock.assert_has_calls([call(ANY, 1)]) + mock.assert_called_with(ANY, 1) + mock.assert_any_call(ANY, 1) + + def test_any_and_spec_set(self): + # This is a regression test for bpo-37555 + class Foo: + def __eq__(self, other): pass + + mock = Mock(spec=Foo) + mock(Foo(), 1) + mock.assert_has_calls([call(ANY, 1)]) + mock.assert_called_with(ANY, 1) + mock.assert_any_call(ANY, 1) class CallTest(unittest.TestCase): diff --git a/Lib/unittest/test/testmock/testmagicmethods.py b/Lib/unittest/test/testmock/testmagicmethods.py index 76b3a560..a4feae7e 100644 --- a/Lib/unittest/test/testmock/testmagicmethods.py +++ b/Lib/unittest/test/testmock/testmagicmethods.py @@ -1,8 +1,7 @@ -import asyncio import math import unittest import os -import sys +from asyncio import iscoroutinefunction from unittest.mock import AsyncMock, Mock, MagicMock, _magics @@ -286,8 +285,8 @@ class TestMockingMagicMethods(unittest.TestCase): self.assertEqual(math.trunc(mock), mock.__trunc__()) self.assertEqual(math.floor(mock), mock.__floor__()) self.assertEqual(math.ceil(mock), mock.__ceil__()) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aexit__)) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aenter__)) + self.assertTrue(iscoroutinefunction(mock.__aexit__)) + self.assertTrue(iscoroutinefunction(mock.__aenter__)) self.assertIsInstance(mock.__aenter__, AsyncMock) self.assertIsInstance(mock.__aexit__, AsyncMock) @@ -312,8 +311,8 @@ class TestMockingMagicMethods(unittest.TestCase): self.assertEqual(math.trunc(mock), mock.__trunc__()) self.assertEqual(math.floor(mock), mock.__floor__()) self.assertEqual(math.ceil(mock), mock.__ceil__()) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aexit__)) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aenter__)) + self.assertTrue(iscoroutinefunction(mock.__aexit__)) + self.assertTrue(iscoroutinefunction(mock.__aenter__)) self.assertIsInstance(mock.__aenter__, AsyncMock) self.assertIsInstance(mock.__aexit__, AsyncMock) @@ -429,7 +428,6 @@ class TestMockingMagicMethods(unittest.TestCase): self.assertEqual(dir(mock), ['foo']) - @unittest.skipIf('PyPy' in sys.version, "This fails differently on pypy") def test_bound_methods(self): m = Mock() diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 1cde45e9..ce674e71 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -3,6 +3,7 @@ import re import sys import tempfile +from test.support import ALWAYS_EQ import unittest from unittest.test.testmock.support import is_instance from unittest import mock @@ -262,7 +263,7 @@ class MockTest(unittest.TestCase): ret_val = mock(sentinel.Arg) self.assertTrue(mock.called, "called not set") - self.assertEqual(mock.call_count, 1, "call_count incoreect") + self.assertEqual(mock.call_count, 1, "call_count incorrect") self.assertEqual(mock.call_args, ((sentinel.Arg,), {}), "call_args not set") self.assertEqual(mock.call_args.args, (sentinel.Arg,), @@ -322,6 +323,8 @@ class MockTest(unittest.TestCase): self.assertFalse(mm != mock.ANY) self.assertTrue(mock.ANY == mm) self.assertFalse(mock.ANY != mm) + self.assertTrue(mm == ALWAYS_EQ) + self.assertFalse(mm != ALWAYS_EQ) call1 = mock.call(mock.MagicMock()) call2 = mock.call(mock.ANY) @@ -330,6 +333,11 @@ class MockTest(unittest.TestCase): self.assertTrue(call2 == call1) self.assertFalse(call2 != call1) + self.assertTrue(call1 == ALWAYS_EQ) + self.assertFalse(call1 != ALWAYS_EQ) + self.assertFalse(call1 == 1) + self.assertTrue(call1 != 1) + def test_assert_called_with(self): mock = Mock() @@ -707,6 +715,57 @@ class MockTest(unittest.TestCase): self.assertRaises(StopIteration, mock.method) + def test_magic_method_wraps_dict(self): + # bpo-25597: MagicMock with wrap doesn't call wrapped object's + # method for magic methods with default values. + data = {'foo': 'bar'} + + wrapped_dict = MagicMock(wraps=data) + self.assertEqual(wrapped_dict.get('foo'), 'bar') + # Accessing key gives a MagicMock + self.assertIsInstance(wrapped_dict['foo'], MagicMock) + # __contains__ method has a default value of False + self.assertFalse('foo' in wrapped_dict) + + # return_value is non-sentinel and takes precedence over wrapped value. + wrapped_dict.get.return_value = 'return_value' + self.assertEqual(wrapped_dict.get('foo'), 'return_value') + + # return_value is sentinel and hence wrapped value is returned. + wrapped_dict.get.return_value = sentinel.DEFAULT + self.assertEqual(wrapped_dict.get('foo'), 'bar') + + self.assertEqual(wrapped_dict.get('baz'), None) + self.assertIsInstance(wrapped_dict['baz'], MagicMock) + self.assertFalse('bar' in wrapped_dict) + + data['baz'] = 'spam' + self.assertEqual(wrapped_dict.get('baz'), 'spam') + self.assertIsInstance(wrapped_dict['baz'], MagicMock) + self.assertFalse('bar' in wrapped_dict) + + del data['baz'] + self.assertEqual(wrapped_dict.get('baz'), None) + + + def test_magic_method_wraps_class(self): + + class Foo: + + def __getitem__(self, index): + return index + + def __custom_method__(self): + return "foo" + + + klass = MagicMock(wraps=Foo) + obj = klass() + self.assertEqual(obj.__getitem__(2), 2) + self.assertEqual(obj[2], 2) + self.assertEqual(obj.__custom_method__(), "foo") + + def test_exceptional_side_effect(self): mock = Mock(side_effect=AttributeError) self.assertRaises(AttributeError, mock) @@ -1628,11 +1687,23 @@ class MockTest(unittest.TestCase): self.assertNotEqual(m.side_effect, None) def test_reset_sideeffect(self): - m = Mock(return_value=10, side_effect=[2,3]) + m = Mock(return_value=10, side_effect=[2, 3]) m.reset_mock(side_effect=True) self.assertEqual(m.return_value, 10) self.assertEqual(m.side_effect, None) + def test_reset_return_with_children(self): + m = MagicMock(f=MagicMock(return_value=1)) + self.assertEqual(m.f(), 1) + m.reset_mock(return_value=True) + self.assertNotEqual(m.f(), 1) + + def test_reset_return_with_children_side_effect(self): + m = MagicMock(f=MagicMock(side_effect=[2, 3])) + self.assertNotEqual(m.f.side_effect, None) + m.reset_mock(side_effect=True) + self.assertEqual(m.f.side_effect, None) + def test_mock_add_spec(self): class _One(object): one = 1 @@ -1801,6 +1872,11 @@ class MockTest(unittest.TestCase): with self.assertRaises(StopIteration): next(f1) + def test_mock_open_next_with_readline_with_return_value(self): + mopen = mock.mock_open(read_data='foo\nbarn') + mopen.return_value.readline.return_value = 'abc' + self.assertEqual('abc', next(mopen())) + def test_mock_open_write(self): # Test exception in file writing write() mock_namedtemp = mock.mock_open(mock.MagicMock(name='JLV')) diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index e065a2c3..d8c1515f 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -4,6 +4,7 @@ import os import sys +from collections import OrderedDict import unittest from unittest.test.testmock import support @@ -769,6 +770,14 @@ class PatchTest(unittest.TestCase): self.assertEqual(d, original) + def test_patch_dict_stop_without_start(self): + d = {'foo': 'bar'} + original = d.copy() + patcher = patch.dict(d, [('spam', 'eggs')], clear=True) + self.assertFalse(patcher.stop()) + self.assertEqual(d, original) + + def test_patch_dict_class_decorator(self): this = self d = {'spam': 'eggs'} @@ -1807,6 +1816,56 @@ class PatchTest(unittest.TestCase): self.assertEqual(stopped, ["three", "two", "one"]) + def test_patch_dict_stopall(self): + dic1 = {} + dic2 = {1: 'a'} + dic3 = {1: 'A', 2: 'B'} + origdic1 = dic1.copy() + origdic2 = dic2.copy() + origdic3 = dic3.copy() + patch.dict(dic1, {1: 'I', 2: 'II'}).start() + patch.dict(dic2, {2: 'b'}).start() + + @patch.dict(dic3) + def patched(): + del dic3[1] + + patched() + self.assertNotEqual(dic1, origdic1) + self.assertNotEqual(dic2, origdic2) + self.assertEqual(dic3, origdic3) + + patch.stopall() + + self.assertEqual(dic1, origdic1) + self.assertEqual(dic2, origdic2) + self.assertEqual(dic3, origdic3) + + + def test_patch_and_patch_dict_stopall(self): + original_unlink = os.unlink + original_chdir = os.chdir + dic1 = {} + dic2 = {1: 'A', 2: 'B'} + origdic1 = dic1.copy() + origdic2 = dic2.copy() + + patch('os.unlink', something).start() + patch('os.chdir', something_else).start() + patch.dict(dic1, {1: 'I', 2: 'II'}).start() + patch.dict(dic2).start() + del dic2[1] + + self.assertIsNot(os.unlink, original_unlink) + self.assertIsNot(os.chdir, original_chdir) + self.assertNotEqual(dic1, origdic1) + self.assertNotEqual(dic2, origdic2) + patch.stopall() + self.assertIs(os.unlink, original_unlink) + self.assertIs(os.chdir, original_chdir) + self.assertEqual(dic1, origdic1) + self.assertEqual(dic2, origdic2) + def test_special_attrs(self): def foo(x=0): @@ -1834,6 +1893,25 @@ class PatchTest(unittest.TestCase): self.assertEqual(foo(), 1) self.assertEqual(foo(), 0) + def test_patch_orderdict(self): + foo = OrderedDict() + foo['a'] = object() + foo['b'] = 'python' + + original = foo.copy() + update_values = list(zip('cdefghijklmnopqrstuvwxyz', range(26))) + patched_values = list(foo.items()) + update_values + + with patch.dict(foo, OrderedDict(update_values)): + self.assertEqual(list(foo.items()), patched_values) + + self.assertEqual(foo, original) + + with patch.dict(foo, update_values): + self.assertEqual(list(foo.items()), patched_values) + + self.assertEqual(foo, original) + def test_dotted_but_module_not_loaded(self): # This exercises the AttributeError branch of _dot_lookup. diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index e2b6f133..ea897c30 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -29,6 +29,7 @@ test_urlparse.py provides a good indicator of parsing behavior. import re import sys +import types import collections import warnings @@ -176,6 +177,8 @@ class _NetlocResultMixinBase(object): raise ValueError("Port out of range 0-65535") return port + __class_getitem__ = classmethod(types.GenericAlias) + class _NetlocResultMixinStr(_NetlocResultMixinBase, _ResultMixinStr): __slots__ = () @@ -366,9 +369,23 @@ del _fix_result_transcoding def urlparse(url, scheme='', allow_fragments=True): """Parse a URL into 6 components: :///;?# - Return a 6-tuple: (scheme, netloc, path, params, query, fragment). - Note that we don't break the components up in smaller bits - (e.g. netloc is a single string) and we don't expand % escapes.""" + + The result is a named 6-tuple with fields corresponding to the + above. It is either a ParseResult or ParseResultBytes object, + depending on the type of the url parameter. + + The username, password, hostname, and port sub-components of netloc + can also be accessed as attributes of the returned object. + + The scheme argument provides the default value of the scheme + component when no scheme is found in url. + + If allow_fragments is False, no attempt is made to separate the + fragment component from the previous component, which can be either + path or query. + + Note that % escapes are not expanded. + """ url, scheme, _coerce_result = _coerce_args(url, scheme) splitresult = urlsplit(url, scheme, allow_fragments) scheme, netloc, url, query, fragment = splitresult @@ -417,9 +434,24 @@ def _checknetloc(netloc): def urlsplit(url, scheme='', allow_fragments=True): """Parse a URL into 5 components: :///?# - Return a 5-tuple: (scheme, netloc, path, query, fragment). - Note that we don't break the components up in smaller bits - (e.g. netloc is a single string) and we don't expand % escapes.""" + + The result is a named 5-tuple with fields corresponding to the + above. It is either a SplitResult or SplitResultBytes object, + depending on the type of the url parameter. + + The username, password, hostname, and port sub-components of netloc + can also be accessed as attributes of the returned object. + + The scheme argument provides the default value of the scheme + component when no scheme is found in url. + + If allow_fragments is False, no attempt is made to separate the + fragment component from the previous component, which can be either + path or query. + + Note that % escapes are not expanded. + """ + url, scheme, _coerce_result = _coerce_args(url, scheme) allow_fragments = bool(allow_fragments) key = url, scheme, allow_fragments, type(url), type(scheme) @@ -431,31 +463,11 @@ def urlsplit(url, scheme='', allow_fragments=True): netloc = query = fragment = '' i = url.find(':') if i > 0: - if url[:i] == 'http': # optimize the common case - url = url[i+1:] - if url[:2] == '//': - netloc, url = _splitnetloc(url, 2) - if (('[' in netloc and ']' not in netloc) or - (']' in netloc and '[' not in netloc)): - raise ValueError("Invalid IPv6 URL") - if allow_fragments and '#' in url: - url, fragment = url.split('#', 1) - if '?' in url: - url, query = url.split('?', 1) - _checknetloc(netloc) - v = SplitResult('http', netloc, url, query, fragment) - _parse_cache[key] = v - return _coerce_result(v) for c in url[:i]: if c not in scheme_chars: break else: - # make sure "url" is not actually a port number (in which case - # "scheme" is really part of the path) - rest = url[i+1:] - if not rest or any(c not in '0123456789' for c in rest): - # not a port number - scheme, url = url[:i].lower(), rest + scheme, url = url[:i].lower(), url[i+1:] if url[:2] == '//': netloc, url = _splitnetloc(url, 2) @@ -631,6 +643,8 @@ def unquote(string, encoding='utf-8', errors='replace'): unquote('abc%20def') -> 'abc def'. """ + if isinstance(string, bytes): + return unquote_to_bytes(string).decode(encoding, errors) if '%' not in string: string.split return string diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index e4407388..2a3d7155 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -163,18 +163,10 @@ def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, The *cadefault* parameter is ignored. - This function always returns an object which can work as a context - manager and has methods such as - * geturl() - return the URL of the resource retrieved, commonly used to - determine if a redirect was followed - - * info() - return the meta-information of the page, such as headers, in the - form of an email.message_from_string() instance (see Quick Reference to - HTTP Headers) - - * getcode() - return the HTTP status code of the response. Raises URLError - on errors. + This function always returns an object which can work as a + context manager and has the properties url, headers, and status. + See urllib.response.addinfourl for more detail on these properties. For HTTP and HTTPS URLs, this function returns a http.client.HTTPResponse object slightly modified. In addition to the three new methods above, the @@ -1819,7 +1811,7 @@ class URLopener: hdrs = fp.info() fp.close() return url2pathname(_splithost(url1)[1]), hdrs - except OSError as msg: + except OSError: pass fp = self.open(url, data) try: diff --git a/Lib/urllib/response.py b/Lib/urllib/response.py index 4778118d..5a2c3cc7 100644 --- a/Lib/urllib/response.py +++ b/Lib/urllib/response.py @@ -73,6 +73,10 @@ class addinfourl(addinfo): self.url = url self.code = code + @property + def status(self): + return self.code + def getcode(self): return self.code diff --git a/Lib/uuid.py b/Lib/uuid.py index 9540c21e..5ae0a3e5 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -61,6 +61,12 @@ else: _AIX = _platform_system == 'AIX' _LINUX = _platform_system == 'Linux' +_MAC_DELIM = b':' +_MAC_OMITS_LEADING_ZEROES = False +if _AIX: + _MAC_DELIM = b'.' + _MAC_OMITS_LEADING_ZEROES = True + RESERVED_NCS, RFC_4122, RESERVED_MICROSOFT, RESERVED_FUTURE = [ 'reserved for NCS compatibility', 'specified in RFC 4122', 'reserved for Microsoft compatibility', 'reserved for future definition'] @@ -349,24 +355,32 @@ class UUID: if self.variant == RFC_4122: return int((self.int >> 76) & 0xf) -def _popen(command, *args): - import os, shutil, subprocess - executable = shutil.which(command) - if executable is None: - path = os.pathsep.join(('/sbin', '/usr/sbin')) - executable = shutil.which(command, path=path) + +def _get_command_stdout(command, *args): + import io, os, shutil, subprocess + + try: + path_dirs = os.environ.get('PATH', os.defpath).split(os.pathsep) + path_dirs.extend(['/sbin', '/usr/sbin']) + executable = shutil.which(command, path=os.pathsep.join(path_dirs)) if executable is None: return None - # LC_ALL=C to ensure English output, stderr=DEVNULL to prevent output - # on stderr (Note: we don't have an example where the words we search - # for are actually localized, but in theory some system could do so.) - env = dict(os.environ) - env['LC_ALL'] = 'C' - proc = subprocess.Popen((executable,) + args, - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL, - env=env) - return proc + # LC_ALL=C to ensure English output, stderr=DEVNULL to prevent output + # on stderr (Note: we don't have an example where the words we search + # for are actually localized, but in theory some system could do so.) + env = dict(os.environ) + env['LC_ALL'] = 'C' + proc = subprocess.Popen((executable,) + args, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + env=env) + if not proc: + return None + stdout, stderr = proc.communicate() + return io.BytesIO(stdout) + except (OSError, subprocess.SubprocessError): + return None + # For MAC (a.k.a. IEEE 802, or EUI-48) addresses, the second least significant # bit of the first octet signifies whether the MAC address is universally (0) @@ -386,40 +400,114 @@ def _popen(command, *args): def _is_universal(mac): return not (mac & (1 << 41)) -def _find_mac(command, args, hw_identifiers, get_index): + +def _find_mac_near_keyword(command, args, keywords, get_word_index): + """Searches a command's output for a MAC address near a keyword. + + Each line of words in the output is case-insensitively searched for + any of the given keywords. Upon a match, get_word_index is invoked + to pick a word from the line, given the index of the match. For + example, lambda i: 0 would get the first word on the line, while + lambda i: i - 1 would get the word preceding the keyword. + """ + stdout = _get_command_stdout(command, args) + if stdout is None: + return None + first_local_mac = None - try: - proc = _popen(command, *args.split()) - if not proc: - return None - with proc: - for line in proc.stdout: - words = line.lower().rstrip().split() - for i in range(len(words)): - if words[i] in hw_identifiers: - try: - word = words[get_index(i)] - mac = int(word.replace(b':', b''), 16) - if _is_universal(mac): - return mac - first_local_mac = first_local_mac or mac - except (ValueError, IndexError): - # Virtual interfaces, such as those provided by - # VPNs, do not have a colon-delimited MAC address - # as expected, but a 16-byte HWAddr separated by - # dashes. These should be ignored in favor of a - # real MAC address - pass - except OSError: - pass + for line in stdout: + words = line.lower().rstrip().split() + for i in range(len(words)): + if words[i] in keywords: + try: + word = words[get_word_index(i)] + mac = int(word.replace(_MAC_DELIM, b''), 16) + except (ValueError, IndexError): + # Virtual interfaces, such as those provided by + # VPNs, do not have a colon-delimited MAC address + # as expected, but a 16-byte HWAddr separated by + # dashes. These should be ignored in favor of a + # real MAC address + pass + else: + if _is_universal(mac): + return mac + first_local_mac = first_local_mac or mac return first_local_mac or None + +def _parse_mac(word): + # Accept 'HH:HH:HH:HH:HH:HH' MAC address (ex: '52:54:00:9d:0e:67'), + # but reject IPv6 address (ex: 'fe80::5054:ff:fe9' or '123:2:3:4:5:6:7:8'). + # + # Virtual interfaces, such as those provided by VPNs, do not have a + # colon-delimited MAC address as expected, but a 16-byte HWAddr separated + # by dashes. These should be ignored in favor of a real MAC address + parts = word.split(_MAC_DELIM) + if len(parts) != 6: + return + if _MAC_OMITS_LEADING_ZEROES: + # (Only) on AIX the macaddr value given is not prefixed by 0, e.g. + # en0 1500 link#2 fa.bc.de.f7.62.4 110854824 0 160133733 0 0 + # not + # en0 1500 link#2 fa.bc.de.f7.62.04 110854824 0 160133733 0 0 + if not all(1 <= len(part) <= 2 for part in parts): + return + hexstr = b''.join(part.rjust(2, b'0') for part in parts) + else: + if not all(len(part) == 2 for part in parts): + return + hexstr = b''.join(parts) + try: + return int(hexstr, 16) + except ValueError: + return + + +def _find_mac_under_heading(command, args, heading): + """Looks for a MAC address under a heading in a command's output. + + The first line of words in the output is searched for the given + heading. Words at the same word index as the heading in subsequent + lines are then examined to see if they look like MAC addresses. + """ + stdout = _get_command_stdout(command, args) + if stdout is None: + return None + + keywords = stdout.readline().rstrip().split() + try: + column_index = keywords.index(heading) + except ValueError: + return None + + first_local_mac = None + for line in stdout: + words = line.rstrip().split() + try: + word = words[column_index] + except IndexError: + continue + + mac = _parse_mac(word) + if mac is None: + continue + if _is_universal(mac): + return mac + if first_local_mac is None: + first_local_mac = mac + + return first_local_mac + + +# The following functions call external programs to 'get' a macaddr value to +# be used as basis for an uuid def _ifconfig_getnode(): """Get the hardware address on Unix by running ifconfig.""" # This works on Linux ('' or '-a'), Tru64 ('-av'), but not all Unixes. keywords = (b'hwaddr', b'ether', b'address:', b'lladdr') for args in ('', '-a', '-av'): - mac = _find_mac('ifconfig', args, keywords, lambda i: i+1) + mac = _find_mac_near_keyword('ifconfig', args, keywords, lambda i: i+1) if mac: return mac return None @@ -427,7 +515,7 @@ def _ifconfig_getnode(): def _ip_getnode(): """Get the hardware address on Unix by running ip.""" # This works on Linux with iproute2. - mac = _find_mac('ip', 'link', [b'link/ether'], lambda i: i+1) + mac = _find_mac_near_keyword('ip', 'link', [b'link/ether'], lambda i: i+1) if mac: return mac return None @@ -441,17 +529,17 @@ def _arp_getnode(): return None # Try getting the MAC addr from arp based on our IP address (Solaris). - mac = _find_mac('arp', '-an', [os.fsencode(ip_addr)], lambda i: -1) + mac = _find_mac_near_keyword('arp', '-an', [os.fsencode(ip_addr)], lambda i: -1) if mac: return mac # This works on OpenBSD - mac = _find_mac('arp', '-an', [os.fsencode(ip_addr)], lambda i: i+1) + mac = _find_mac_near_keyword('arp', '-an', [os.fsencode(ip_addr)], lambda i: i+1) if mac: return mac # This works on Linux, FreeBSD and NetBSD - mac = _find_mac('arp', '-an', [os.fsencode('(%s)' % ip_addr)], + mac = _find_mac_near_keyword('arp', '-an', [os.fsencode('(%s)' % ip_addr)], lambda i: i+2) # Return None instead of 0. if mac: @@ -461,210 +549,52 @@ def _arp_getnode(): def _lanscan_getnode(): """Get the hardware address on Unix by running lanscan.""" # This might work on HP-UX. - return _find_mac('lanscan', '-ai', [b'lan0'], lambda i: 0) + return _find_mac_near_keyword('lanscan', '-ai', [b'lan0'], lambda i: 0) def _netstat_getnode(): """Get the hardware address on Unix by running netstat.""" - # This might work on AIX, Tru64 UNIX. - first_local_mac = None - try: - proc = _popen('netstat', '-ia') - if not proc: - return None - with proc: - words = proc.stdout.readline().rstrip().split() - try: - i = words.index(b'Address') - except ValueError: - return None - for line in proc.stdout: - try: - words = line.rstrip().split() - word = words[i] - if len(word) == 17 and word.count(b':') == 5: - mac = int(word.replace(b':', b''), 16) - if _is_universal(mac): - return mac - first_local_mac = first_local_mac or mac - except (ValueError, IndexError): - pass - except OSError: - pass - return first_local_mac or None + # This works on AIX and might work on Tru64 UNIX. + return _find_mac_under_heading('netstat', '-ian', b'Address') def _ipconfig_getnode(): - """Get the hardware address on Windows by running ipconfig.exe.""" - import os, re, subprocess - first_local_mac = None - dirs = ['', r'c:\windows\system32', r'c:\winnt\system32'] - try: - import ctypes - buffer = ctypes.create_string_buffer(300) - ctypes.windll.kernel32.GetSystemDirectoryA(buffer, 300) - dirs.insert(0, buffer.value.decode('mbcs')) - except: - pass - for dir in dirs: - try: - proc = subprocess.Popen([os.path.join(dir, 'ipconfig'), '/all'], - stdout=subprocess.PIPE, - encoding="oem") - except OSError: - continue - with proc: - for line in proc.stdout: - value = line.split(':')[-1].strip().lower() - if re.fullmatch('(?:[0-9a-f][0-9a-f]-){5}[0-9a-f][0-9a-f]', value): - mac = int(value.replace('-', ''), 16) - if _is_universal(mac): - return mac - first_local_mac = first_local_mac or mac - return first_local_mac or None + """[DEPRECATED] Get the hardware address on Windows.""" + # bpo-40501: UuidCreateSequential() is now the only supported approach + return _windll_getnode() def _netbios_getnode(): - """Get the hardware address on Windows using NetBIOS calls. - See http://support.microsoft.com/kb/118623 for details.""" - import win32wnet, netbios - first_local_mac = None - ncb = netbios.NCB() - ncb.Command = netbios.NCBENUM - ncb.Buffer = adapters = netbios.LANA_ENUM() - adapters._pack() - if win32wnet.Netbios(ncb) != 0: - return None - adapters._unpack() - for i in range(adapters.length): - ncb.Reset() - ncb.Command = netbios.NCBRESET - ncb.Lana_num = ord(adapters.lana[i]) - if win32wnet.Netbios(ncb) != 0: - continue - ncb.Reset() - ncb.Command = netbios.NCBASTAT - ncb.Lana_num = ord(adapters.lana[i]) - ncb.Callname = '*'.ljust(16) - ncb.Buffer = status = netbios.ADAPTER_STATUS() - if win32wnet.Netbios(ncb) != 0: - continue - status._unpack() - bytes = status.adapter_address[:6] - if len(bytes) != 6: - continue - mac = int.from_bytes(bytes, 'big') - if _is_universal(mac): - return mac - first_local_mac = first_local_mac or mac - return first_local_mac or None + """[DEPRECATED] Get the hardware address on Windows.""" + # bpo-40501: UuidCreateSequential() is now the only supported approach + return _windll_getnode() -_generate_time_safe = _UuidCreate = None -_has_uuid_generate_time_safe = None - # Import optional C extension at toplevel, to help disabling it when testing try: import _uuid + _generate_time_safe = getattr(_uuid, "generate_time_safe", None) + _UuidCreate = getattr(_uuid, "UuidCreate", None) + _has_uuid_generate_time_safe = _uuid.has_uuid_generate_time_safe except ImportError: _uuid = None + _generate_time_safe = None + _UuidCreate = None + _has_uuid_generate_time_safe = None def _load_system_functions(): - """ - Try to load platform-specific functions for generating uuids. - """ - global _generate_time_safe, _UuidCreate, _has_uuid_generate_time_safe - - if _has_uuid_generate_time_safe is not None: - return - - _has_uuid_generate_time_safe = False - - if sys.platform == "darwin" and int(os.uname().release.split('.')[0]) < 9: - # The uuid_generate_* functions are broken on MacOS X 10.5, as noted - # in issue #8621 the function generates the same sequence of values - # in the parent process and all children created using fork (unless - # those children use exec as well). - # - # Assume that the uuid_generate functions are broken from 10.5 onward, - # the test can be adjusted when a later version is fixed. - pass - elif _uuid is not None: - _generate_time_safe = _uuid.generate_time_safe - _has_uuid_generate_time_safe = _uuid.has_uuid_generate_time_safe - return - - try: - # If we couldn't find an extension module, try ctypes to find - # system routines for UUID generation. - # Thanks to Thomas Heller for ctypes and for his help with its use here. - import ctypes - import ctypes.util - - # The uuid_generate_* routines are provided by libuuid on at least - # Linux and FreeBSD, and provided by libc on Mac OS X. - _libnames = ['uuid'] - if not sys.platform.startswith('win'): - _libnames.append('c') - for libname in _libnames: - try: - lib = ctypes.CDLL(ctypes.util.find_library(libname)) - except Exception: # pragma: nocover - continue - # Try to find the safe variety first. - if hasattr(lib, 'uuid_generate_time_safe'): - _uuid_generate_time_safe = lib.uuid_generate_time_safe - # int uuid_generate_time_safe(uuid_t out); - def _generate_time_safe(): - _buffer = ctypes.create_string_buffer(16) - res = _uuid_generate_time_safe(_buffer) - return bytes(_buffer.raw), res - _has_uuid_generate_time_safe = True - break - - elif hasattr(lib, 'uuid_generate_time'): # pragma: nocover - _uuid_generate_time = lib.uuid_generate_time - # void uuid_generate_time(uuid_t out); - _uuid_generate_time.restype = None - def _generate_time_safe(): - _buffer = ctypes.create_string_buffer(16) - _uuid_generate_time(_buffer) - return bytes(_buffer.raw), None - break - - # On Windows prior to 2000, UuidCreate gives a UUID containing the - # hardware address. On Windows 2000 and later, UuidCreate makes a - # random UUID and UuidCreateSequential gives a UUID containing the - # hardware address. These routines are provided by the RPC runtime. - # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last - # 6 bytes returned by UuidCreateSequential are fixed, they don't appear - # to bear any relationship to the MAC address of any network device - # on the box. - try: - lib = ctypes.windll.rpcrt4 - except: - lib = None - _UuidCreate = getattr(lib, 'UuidCreateSequential', - getattr(lib, 'UuidCreate', None)) - - except Exception as exc: - import warnings - warnings.warn(f"Could not find fallback ctypes uuid functions: {exc}", - ImportWarning) + """[DEPRECATED] Platform-specific functions loaded at import time""" def _unix_getnode(): - """Get the hardware address on Unix using the _uuid extension module - or ctypes.""" - _load_system_functions() - uuid_time, _ = _generate_time_safe() - return UUID(bytes=uuid_time).node + """Get the hardware address on Unix using the _uuid extension module.""" + if _generate_time_safe: + uuid_time, _ = _generate_time_safe() + return UUID(bytes=uuid_time).node def _windll_getnode(): - """Get the hardware address on Windows using ctypes.""" - import ctypes - _load_system_functions() - _buffer = ctypes.create_string_buffer(16) - if _UuidCreate(_buffer) == 0: - return UUID(bytes=bytes_(_buffer.raw)).node + """Get the hardware address on Windows using the _uuid extension module.""" + if _UuidCreate: + uuid_bytes = _UuidCreate() + return UUID(bytes_le=uuid_bytes).node def _random_getnode(): """Get a random node ID.""" @@ -693,7 +623,8 @@ if _LINUX: elif sys.platform == 'darwin': _OS_GETTERS = [_ifconfig_getnode, _arp_getnode, _netstat_getnode] elif sys.platform == 'win32': - _OS_GETTERS = [_netbios_getnode, _ipconfig_getnode] + # bpo-40201: _windll_getnode will always succeed, so these are not needed + _OS_GETTERS = [] elif _AIX: _OS_GETTERS = [_netstat_getnode] else: @@ -708,7 +639,7 @@ else: _node = None -def getnode(*, getters=None): +def getnode(): """Get the hardware address as a 48-bit positive integer. The first time this runs, it may launch a separate program, which could @@ -740,7 +671,6 @@ def uuid1(node=None, clock_seq=None): # When the system provides a version-1 UUID generator, use it (but don't # use UuidCreate here because its UUIDs don't conform to RFC 4122). - _load_system_functions() if _generate_time_safe is not None and node is clock_seq is None: uuid_time, safely_generated = _generate_time_safe() try: @@ -774,8 +704,11 @@ def uuid1(node=None, clock_seq=None): def uuid3(namespace, name): """Generate a UUID from the MD5 hash of a namespace UUID and a name.""" from hashlib import md5 - hash = md5(namespace.bytes + bytes(name, "utf-8")).digest() - return UUID(bytes=hash[:16], version=3) + digest = md5( + namespace.bytes + bytes(name, "utf-8"), + usedforsecurity=False + ).digest() + return UUID(bytes=digest[:16], version=3) def uuid4(): """Generate a random UUID.""" diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index caa7285b..8009deb3 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -12,6 +12,8 @@ import sys import sysconfig import types + +CORE_VENV_DEPS = ('pip', 'setuptools') logger = logging.getLogger(__name__) @@ -38,16 +40,21 @@ class EnvBuilder: :param with_pip: If True, ensure pip is installed in the virtual environment :param prompt: Alternative terminal prefix for the environment. + :param upgrade_deps: Update the base venv modules to the latest on PyPI """ def __init__(self, system_site_packages=False, clear=False, - symlinks=False, upgrade=False, with_pip=False, prompt=None): + symlinks=False, upgrade=False, with_pip=False, prompt=None, + upgrade_deps=False): self.system_site_packages = system_site_packages self.clear = clear self.symlinks = symlinks self.upgrade = upgrade self.with_pip = with_pip + if prompt == '.': # see bpo-38901 + prompt = os.path.basename(os.getcwd()) self.prompt = prompt + self.upgrade_deps = upgrade_deps def create(self, env_dir): """ @@ -74,6 +81,8 @@ class EnvBuilder: # restore it and rewrite the configuration self.system_site_packages = True self.create_configuration(context) + if self.upgrade_deps: + self.upgrade_dependencies(context) def clear_directory(self, path): for fn in os.listdir(path): @@ -234,7 +243,7 @@ class EnvBuilder: copier(context.executable, path) if not os.path.islink(path): os.chmod(path, 0o755) - for suffix in ('python', 'python3'): + for suffix in ('python', 'python3', f'python3.{sys.version_info[1]}'): path = os.path.join(binpath, suffix) if not os.path.exists(path): # Issue 18807: make copies if @@ -381,13 +390,25 @@ class EnvBuilder: f.write(data) shutil.copymode(srcfile, dstfile) + def upgrade_dependencies(self, context): + logger.debug( + f'Upgrading {CORE_VENV_DEPS} packages in {context.bin_path}' + ) + if sys.platform == 'win32': + python_exe = os.path.join(context.bin_path, 'python.exe') + else: + python_exe = os.path.join(context.bin_path, 'python') + cmd = [python_exe, '-m', 'pip', 'install', '--upgrade'] + cmd.extend(CORE_VENV_DEPS) + subprocess.check_call(cmd) + def create(env_dir, system_site_packages=False, clear=False, - symlinks=False, with_pip=False, prompt=None): + symlinks=False, with_pip=False, prompt=None, upgrade_deps=False): """Create a virtual environment in a directory.""" builder = EnvBuilder(system_site_packages=system_site_packages, clear=clear, symlinks=symlinks, with_pip=with_pip, - prompt=prompt) + prompt=prompt, upgrade_deps=upgrade_deps) builder.create(env_dir) def main(args=None): @@ -450,6 +471,11 @@ def main(args=None): parser.add_argument('--prompt', help='Provides an alternative prompt prefix for ' 'this environment.') + parser.add_argument('--upgrade-deps', default=False, action='store_true', + dest='upgrade_deps', + help='Upgrade core dependencies: {} to the latest ' + 'version in PyPI'.format( + ' '.join(CORE_VENV_DEPS))) options = parser.parse_args(args) if options.upgrade and options.clear: raise ValueError('you cannot supply --upgrade and --clear together.') @@ -458,7 +484,8 @@ def main(args=None): symlinks=options.symlinks, upgrade=options.upgrade, with_pip=options.with_pip, - prompt=options.prompt) + prompt=options.prompt, + upgrade_deps=options.upgrade_deps) for d in options.dirs: builder.create(d) diff --git a/Lib/venv/scripts/common/activate b/Lib/venv/scripts/common/activate index 5e7ac174..45af3536 100644 --- a/Lib/venv/scripts/common/activate +++ b/Lib/venv/scripts/common/activate @@ -18,7 +18,7 @@ deactivate () { # be called to get it to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r + hash -r 2> /dev/null fi if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then @@ -54,17 +54,7 @@ fi if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then _OLD_VIRTUAL_PS1="${PS1:-}" - if [ "x__VENV_PROMPT__" != x ] ; then - PS1="__VENV_PROMPT__${PS1:-}" - else - if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then - # special case for Aspen magic directories - # see https://aspen.io/ - PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" - else - PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" - fi - fi + PS1="__VENV_PROMPT__${PS1:-}" export PS1 fi @@ -72,5 +62,5 @@ fi # be called to get it to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r + hash -r 2> /dev/null fi diff --git a/Lib/venv/scripts/posix/activate.csh b/Lib/venv/scripts/posix/activate.csh index 0f39ee8c..68a0dc74 100644 --- a/Lib/venv/scripts/posix/activate.csh +++ b/Lib/venv/scripts/posix/activate.csh @@ -17,19 +17,7 @@ setenv PATH "$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH" set _OLD_VIRTUAL_PROMPT="$prompt" if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - if ("__VENV_NAME__" != "") then - set env_name = "__VENV_NAME__" - else - if (`basename "VIRTUAL_ENV"` == "__") then - # special case for Aspen magic directories - # see https://aspen.io/ - set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` - else - set env_name = `basename "$VIRTUAL_ENV"` - endif - endif - set prompt = "[$env_name] $prompt" - unset env_name + set prompt = "__VENV_PROMPT__$prompt" endif alias pydoc python -m pydoc diff --git a/Lib/venv/scripts/posix/activate.fish b/Lib/venv/scripts/posix/activate.fish index 03e893f8..54b9ea56 100644 --- a/Lib/venv/scripts/posix/activate.fish +++ b/Lib/venv/scripts/posix/activate.fish @@ -1,7 +1,7 @@ -# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) -# you cannot run it directly +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/); you cannot run it directly. -function deactivate -d "Exit virtualenv and return to normal shell environment" +function deactivate -d "Exit virtual environment and return to normal shell environment" # reset old environment variables if test -n "$_OLD_VIRTUAL_PATH" set -gx PATH $_OLD_VIRTUAL_PATH @@ -21,12 +21,12 @@ function deactivate -d "Exit virtualenv and return to normal shell environment" set -e VIRTUAL_ENV if test "$argv[1]" != "nondestructive" - # Self destruct! + # Self-destruct! functions -e deactivate end end -# unset irrelevant variables +# Unset irrelevant variables. deactivate nondestructive set -gx VIRTUAL_ENV "__VENV_DIR__" @@ -34,7 +34,7 @@ set -gx VIRTUAL_ENV "__VENV_DIR__" set -gx _OLD_VIRTUAL_PATH $PATH set -gx PATH "$VIRTUAL_ENV/__VENV_BIN_NAME__" $PATH -# unset PYTHONHOME if set +# Unset PYTHONHOME if set. if set -q PYTHONHOME set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME set -e PYTHONHOME @@ -43,31 +43,20 @@ end if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" # fish uses a function instead of an env var to generate the prompt. - # save the current fish_prompt function as the function _old_fish_prompt + # Save the current fish_prompt function as the function _old_fish_prompt. functions -c fish_prompt _old_fish_prompt - # with the original prompt function renamed, we can override with our own. + # With the original prompt function renamed, we can override with our own. function fish_prompt - # Save the return status of the last command + # Save the return status of the last command. set -l old_status $status - # Prompt override? - if test -n "__VENV_PROMPT__" - printf "%s%s" "__VENV_PROMPT__" (set_color normal) - else - # ...Otherwise, prepend env - set -l _checkbase (basename "$VIRTUAL_ENV") - if test $_checkbase = "__" - # special case for Aspen magic directories - # see https://aspen.io/ - printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) - else - printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) - end - end + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) "__VENV_PROMPT__" (set_color normal) # Restore the return status of the previous command. echo "exit $old_status" | . + # Output the original/"old" prompt. _old_fish_prompt end diff --git a/Lib/wave.py b/Lib/wave.py index 823f091d..b7071198 100644 --- a/Lib/wave.py +++ b/Lib/wave.py @@ -71,9 +71,15 @@ The close() method is called automatically when the class instance is destroyed. """ +from chunk import Chunk +from collections import namedtuple +import audioop import builtins +import struct +import sys + -__all__ = ["open", "openfp", "Error", "Wave_read", "Wave_write"] +__all__ = ["open", "Error", "Wave_read", "Wave_write"] class Error(Exception): pass @@ -82,13 +88,6 @@ WAVE_FORMAT_PCM = 0x0001 _array_fmts = None, 'b', 'h', None, 'i' -import audioop -import struct -import sys -from chunk import Chunk -from collections import namedtuple -import warnings - _wave_params = namedtuple('_wave_params', 'nchannels sampwidth framerate nframes comptype compname') @@ -512,8 +511,3 @@ def open(f, mode=None): return Wave_write(f) else: raise Error("mode must be 'r', 'rb', 'w', or 'wb'") - -def openfp(f, mode=None): - warnings.warn("wave.openfp is deprecated since Python 3.7. " - "Use wave.open instead.", DeprecationWarning, stacklevel=2) - return open(f, mode=mode) diff --git a/Lib/weakref.py b/Lib/weakref.py index 9d700894..5fa851dd 100644 --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -33,6 +33,9 @@ __all__ = ["ref", "proxy", "getweakrefcount", "getweakrefs", "WeakSet", "WeakMethod", "finalize"] +_collections_abc.Set.register(WeakSet) +_collections_abc.MutableSet.register(WeakSet) + class WeakMethod(ref): """ A custom `weakref.ref` subclass which simulates a weak reference to @@ -75,14 +78,14 @@ class WeakMethod(ref): if not self._alive or not other._alive: return self is other return ref.__eq__(self, other) and self._func_ref == other._func_ref - return False + return NotImplemented def __ne__(self, other): if isinstance(other, WeakMethod): if not self._alive or not other._alive: return self is not other return ref.__ne__(self, other) or self._func_ref != other._func_ref - return True + return NotImplemented __hash__ = ref.__hash__ @@ -307,6 +310,25 @@ class WeakValueDictionary(_collections_abc.MutableMapping): self._commit_removals() return list(self.data.values()) + def __ior__(self, other): + self.update(other) + return self + + def __or__(self, other): + if isinstance(other, _collections_abc.Mapping): + c = self.copy() + c.update(other) + return c + return NotImplemented + + def __ror__(self, other): + if isinstance(other, _collections_abc.Mapping): + c = self.__class__() + c.update(other) + c.update(self) + return c + return NotImplemented + class KeyedRef(ref): """Specialized reference that includes a key corresponding to the value. @@ -485,6 +507,25 @@ class WeakKeyDictionary(_collections_abc.MutableMapping): if len(kwargs): self.update(kwargs) + def __ior__(self, other): + self.update(other) + return self + + def __or__(self, other): + if isinstance(other, _collections_abc.Mapping): + c = self.copy() + c.update(other) + return c + return NotImplemented + + def __ror__(self, other): + if isinstance(other, _collections_abc.Mapping): + c = self.__class__() + c.update(other) + c.update(self) + return c + return NotImplemented + class finalize: """Class for finalization of weakrefable objects @@ -514,33 +555,7 @@ class finalize: class _Info: __slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index") - def __init__(*args, **kwargs): - if len(args) >= 3: - self, obj, func, *args = args - elif not args: - raise TypeError("descriptor '__init__' of 'finalize' object " - "needs an argument") - else: - if 'func' not in kwargs: - raise TypeError('finalize expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - func = kwargs.pop('func') - if len(args) >= 2: - self, obj, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - if 'obj' not in kwargs: - raise TypeError('finalize expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - obj = kwargs.pop('obj') - self, *args = args - import warnings - warnings.warn("Passing 'obj' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - args = tuple(args) - + def __init__(self, obj, func, /, *args, **kwargs): if not self._registered_with_atexit: # We may register the exit function more than once because # of a thread race, but that is harmless @@ -556,7 +571,6 @@ class finalize: info.index = next(self._index_iter) self._registry[self] = info finalize._dirty = True - __init__.__text_signature__ = '($self, obj, func, /, *args, **kwargs)' def __call__(self, _=None): """If alive then mark as dead and return func(*args, **kwargs); diff --git a/Lib/xml/dom/expatbuilder.py b/Lib/xml/dom/expatbuilder.py index 2bd835b0..199c22d0 100644 --- a/Lib/xml/dom/expatbuilder.py +++ b/Lib/xml/dom/expatbuilder.py @@ -204,11 +204,11 @@ class ExpatBuilder: buffer = file.read(16*1024) if not buffer: break - parser.Parse(buffer, 0) + parser.Parse(buffer, False) if first_buffer and self.document.documentElement: self._setup_subset(buffer) first_buffer = False - parser.Parse("", True) + parser.Parse(b"", True) except ParseEscape: pass doc = self.document @@ -637,7 +637,7 @@ class FragmentBuilder(ExpatBuilder): nsattrs = self._getNSattrs() # get ns decls from node's ancestors document = _FRAGMENT_BUILDER_TEMPLATE % (ident, subset, nsattrs) try: - parser.Parse(document, 1) + parser.Parse(document, True) except: self.reset() raise @@ -697,7 +697,7 @@ class FragmentBuilder(ExpatBuilder): self.fragment = self.document.createDocumentFragment() self.curNode = self.fragment try: - parser.Parse(self._source, 1) + parser.Parse(self._source, True) finally: self.curNode = old_cur_node self.document = old_document diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py index 464420b7..d09ef5e7 100644 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -43,10 +43,11 @@ class Node(xml.dom.Node): def __bool__(self): return True - def toxml(self, encoding=None): - return self.toprettyxml("", "", encoding) + def toxml(self, encoding=None, standalone=None): + return self.toprettyxml("", "", encoding, standalone) - def toprettyxml(self, indent="\t", newl="\n", encoding=None): + def toprettyxml(self, indent="\t", newl="\n", encoding=None, + standalone=None): if encoding is None: writer = io.StringIO() else: @@ -56,7 +57,7 @@ class Node(xml.dom.Node): newline='\n') if self.nodeType == Node.DOCUMENT_NODE: # Can pass encoding only to document, to put it into XML header - self.writexml(writer, "", indent, newl, encoding) + self.writexml(writer, "", indent, newl, encoding, standalone) else: self.writexml(writer, "", indent, newl) if encoding is None: @@ -718,6 +719,14 @@ class Element(Node): Node.unlink(self) def getAttribute(self, attname): + """Returns the value of the specified attribute. + + Returns the value of the element's attribute named attname as + a string. An empty string is returned if the element does not + have such an attribute. Note that an empty string may also be + returned as an explicitly given attribute value, use the + hasAttribute method to distinguish these two cases. + """ if self._attrs is None: return "" try: @@ -828,6 +837,11 @@ class Element(Node): removeAttributeNodeNS = removeAttributeNode def hasAttribute(self, name): + """Checks whether the element has an attribute with the specified name. + + Returns True if the element has an attribute with the specified name. + Otherwise, returns False. + """ if self._attrs is None: return False return name in self._attrs @@ -838,6 +852,11 @@ class Element(Node): return (namespaceURI, localName) in self._attrsNS def getElementsByTagName(self, name): + """Returns all descendant elements with the given tag name. + + Returns the list of all descendant elements (not direct children + only) with the specified tag name. + """ return _get_elements_by_tagName_helper(self, name, NodeList()) def getElementsByTagNameNS(self, namespaceURI, localName): @@ -848,6 +867,11 @@ class Element(Node): return "" % (self.tagName, id(self)) def writexml(self, writer, indent="", addindent="", newl=""): + """Write an XML element to a file-like object + + Write the element to the writer object that must provide + a write method (e.g. a file or StringIO object). + """ # indent = current indentation # addindent = indentation to add to higher levels # newl = newline string @@ -1787,12 +1811,17 @@ class Document(Node, DocumentLS): raise xml.dom.NotSupportedErr("cannot import document type nodes") return _clone_node(node, deep, self) - def writexml(self, writer, indent="", addindent="", newl="", encoding=None): - if encoding is None: - writer.write(''+newl) - else: - writer.write('%s' % ( - encoding, newl)) + def writexml(self, writer, indent="", addindent="", newl="", encoding=None, + standalone=None): + declarations = [] + + if encoding: + declarations.append(f'encoding="{encoding}"') + if standalone is not None: + declarations.append(f'standalone="{"yes" if standalone else "no"}"') + + writer.write(f'{newl}') + for node in self.childNodes: node.writexml(writer, indent, addindent, newl) diff --git a/Lib/xml/dom/xmlbuilder.py b/Lib/xml/dom/xmlbuilder.py index 213ab145..8a200263 100644 --- a/Lib/xml/dom/xmlbuilder.py +++ b/Lib/xml/dom/xmlbuilder.py @@ -1,7 +1,6 @@ """Implementation of the DOM Level 3 'LS-Load' feature.""" import copy -import warnings import xml.dom from xml.dom.NodeFilter import NodeFilter diff --git a/Lib/xml/etree/ElementInclude.py b/Lib/xml/etree/ElementInclude.py index 963470e3..53030627 100644 --- a/Lib/xml/etree/ElementInclude.py +++ b/Lib/xml/etree/ElementInclude.py @@ -50,18 +50,28 @@ import copy from . import ElementTree +from urllib.parse import urljoin XINCLUDE = "{http://www.w3.org/2001/XInclude}" XINCLUDE_INCLUDE = XINCLUDE + "include" XINCLUDE_FALLBACK = XINCLUDE + "fallback" +# For security reasons, the inclusion depth is limited to this read-only value by default. +DEFAULT_MAX_INCLUSION_DEPTH = 6 + + ## # Fatal include error. class FatalIncludeError(SyntaxError): pass + +class LimitedRecursiveIncludeError(FatalIncludeError): + pass + + ## # Default loader. This loader reads an included resource from disk. # @@ -92,13 +102,33 @@ def default_loader(href, parse, encoding=None): # @param loader Optional resource loader. If omitted, it defaults # to {@link default_loader}. If given, it should be a callable # that implements the same interface as default_loader. +# @param base_url The base URL of the original file, to resolve +# relative include file references. +# @param max_depth The maximum number of recursive inclusions. +# Limited to reduce the risk of malicious content explosion. +# Pass a negative value to disable the limitation. +# @throws LimitedRecursiveIncludeError If the {@link max_depth} was exceeded. # @throws FatalIncludeError If the function fails to include a given # resource, or if the tree contains malformed XInclude elements. -# @throws OSError If the function fails to load a given resource. +# @throws IOError If the function fails to load a given resource. +# @returns the node or its replacement if it was an XInclude node -def include(elem, loader=None): +def include(elem, loader=None, base_url=None, + max_depth=DEFAULT_MAX_INCLUSION_DEPTH): + if max_depth is None: + max_depth = -1 + elif max_depth < 0: + raise ValueError("expected non-negative depth or None for 'max_depth', got %r" % max_depth) + + if hasattr(elem, 'getroot'): + elem = elem.getroot() if loader is None: loader = default_loader + + _include(elem, loader, base_url, max_depth, set()) + + +def _include(elem, loader, base_url, max_depth, _parent_hrefs): # look for xinclude elements i = 0 while i < len(elem): @@ -106,14 +136,24 @@ def include(elem, loader=None): if e.tag == XINCLUDE_INCLUDE: # process xinclude directive href = e.get("href") + if base_url: + href = urljoin(base_url, href) parse = e.get("parse", "xml") if parse == "xml": + if href in _parent_hrefs: + raise FatalIncludeError("recursive include of %s" % href) + if max_depth == 0: + raise LimitedRecursiveIncludeError( + "maximum xinclude depth reached when including file %s" % href) + _parent_hrefs.add(href) node = loader(href, parse) if node is None: raise FatalIncludeError( "cannot load %r as %r" % (href, parse) ) - node = copy.copy(node) + node = copy.copy(node) # FIXME: this makes little sense with recursive includes + _include(node, loader, href, max_depth - 1, _parent_hrefs) + _parent_hrefs.remove(href) if e.tail: node.tail = (node.tail or "") + e.tail elem[i] = node @@ -123,11 +163,13 @@ def include(elem, loader=None): raise FatalIncludeError( "cannot load %r as %r" % (href, parse) ) + if e.tail: + text += e.tail if i: node = elem[i-1] - node.tail = (node.tail or "") + text + (e.tail or "") + node.tail = (node.tail or "") + text else: - elem.text = (elem.text or "") + text + (e.tail or "") + elem.text = (elem.text or "") + text del elem[i] continue else: @@ -139,5 +181,5 @@ def include(elem, loader=None): "xi:fallback tag must be child of xi:include (%r)" % e.tag ) else: - include(e, loader) - i = i + 1 + _include(e, loader, base_url, max_depth, _parent_hrefs) + i += 1 diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index 645e999a..da2bcad0 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -76,7 +76,7 @@ __all__ = [ "dump", "Element", "ElementTree", "fromstring", "fromstringlist", - "iselement", "iterparse", + "indent", "iselement", "iterparse", "parse", "ParseError", "PI", "ProcessingInstruction", "QName", @@ -195,6 +195,13 @@ class Element: original tree. """ + warnings.warn( + "elem.copy() is deprecated. Use copy.copy(elem) instead.", + DeprecationWarning + ) + return self.__copy__() + + def __copy__(self): elem = self.makeelement(self.tag, self.attrib) elem.text = self.text elem.tail = self.tail @@ -273,19 +280,6 @@ class Element: # assert iselement(element) self._children.remove(subelement) - def getchildren(self): - """(Deprecated) Return all subelements. - - Elements are returned in document order. - - """ - warnings.warn( - "This method will be removed in future versions. " - "Use 'list(elem)' or iteration over elem instead.", - DeprecationWarning, stacklevel=2 - ) - return self._children - def find(self, path, namespaces=None): """Find first matching element by tag name or path. @@ -409,15 +403,6 @@ class Element: for e in self._children: yield from e.iter(tag) - # compatibility - def getiterator(self, tag=None): - warnings.warn( - "This method will be removed in future versions. " - "Use 'elem.iter()' or 'list(elem.iter())' instead.", - DeprecationWarning, stacklevel=2 - ) - return list(self.iter(tag)) - def itertext(self): """Create text iterator. @@ -617,15 +602,6 @@ class ElementTree: # assert self._root is not None return self._root.iter(tag) - # compatibility - def getiterator(self, tag=None): - warnings.warn( - "This method will be removed in future versions. " - "Use 'tree.iter()' or 'list(tree.iter())' instead.", - DeprecationWarning, stacklevel=2 - ) - return list(self.iter(tag)) - def find(self, path, namespaces=None): """Find first matching element by tag name or path. @@ -1081,15 +1057,15 @@ def _escape_attrib(text): text = text.replace(">", ">") if "\"" in text: text = text.replace("\"", """) - # The following business with carriage returns is to satisfy - # Section 2.11 of the XML specification, stating that - # CR or CR LN should be replaced with just LN + # Although section 2.11 of the XML specification states that CR or + # CR LN should be replaced with just LN, it applies only to EOLNs + # which take part of organizing file into lines. Within attributes, + # we are replacing these with entity numbers, so they do not count. # http://www.w3.org/TR/REC-xml/#sec-line-ends - if "\r\n" in text: - text = text.replace("\r\n", "\n") + # The current solution, contained in following six lines, was + # discussed in issue 17582 and 39011. if "\r" in text: - text = text.replace("\r", "\n") - #The following four lines are issue 17582 + text = text.replace("\r", " ") if "\n" in text: text = text.replace("\n", " ") if "\t" in text: @@ -1185,6 +1161,57 @@ def dump(elem): if not tail or tail[-1] != "\n": sys.stdout.write("\n") + +def indent(tree, space=" ", level=0): + """Indent an XML document by inserting newlines and indentation space + after elements. + + *tree* is the ElementTree or Element to modify. The (root) element + itself will not be changed, but the tail text of all elements in its + subtree will be adapted. + + *space* is the whitespace to insert for each indentation level, two + space characters by default. + + *level* is the initial indentation level. Setting this to a higher + value than 0 can be used for indenting subtrees that are more deeply + nested inside of a document. + """ + if isinstance(tree, ElementTree): + tree = tree.getroot() + if level < 0: + raise ValueError(f"Initial indentation level must be >= 0, got {level}") + if not len(tree): + return + + # Reduce the memory consumption by reusing indentation strings. + indentations = ["\n" + level * space] + + def _indent_children(elem, level): + # Start a new indentation level for the first child. + child_level = level + 1 + try: + child_indentation = indentations[child_level] + except IndexError: + child_indentation = indentations[level] + space + indentations.append(child_indentation) + + if not elem.text or not elem.text.strip(): + elem.text = child_indentation + + for child in elem: + if len(child): + _indent_children(child, child_level) + if not child.tail or not child.tail.strip(): + child.tail = child_indentation + + # Dedent after the last child by overwriting the previous indentation. + if not child.tail.strip(): + child.tail = indentations[level] + + _indent_children(tree, 0) + + # -------------------------------------------------------------------- # parsing @@ -1690,14 +1717,14 @@ class XMLParser: def feed(self, data): """Feed encoded data to parser.""" try: - self.parser.Parse(data, 0) + self.parser.Parse(data, False) except self._error as v: self._raiseerror(v) def close(self): """Finish feeding data to parser and return element structure.""" try: - self.parser.Parse("", 1) # end of data + self.parser.Parse(b"", True) # end of data except self._error as v: self._raiseerror(v) try: diff --git a/Lib/xml/sax/__init__.py b/Lib/xml/sax/__init__.py index a0f5d40b..17b75879 100644 --- a/Lib/xml/sax/__init__.py +++ b/Lib/xml/sax/__init__.py @@ -78,7 +78,7 @@ def make_parser(parser_list=()): for parser_name in list(parser_list) + default_parser_list: try: return _create_parser(parser_name) - except ImportError as e: + except ImportError: import sys if parser_name in sys.modules: # The parser module was found, but importing it diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py index 5066ffc2..e334ac9f 100644 --- a/Lib/xml/sax/expatreader.py +++ b/Lib/xml/sax/expatreader.py @@ -93,7 +93,7 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator): self._parser = None self._namespaces = namespaceHandling self._lex_handler_prop = None - self._parsing = 0 + self._parsing = False self._entity_stack = [] self._external_ges = 0 self._interning = None @@ -203,10 +203,10 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator): # IncrementalParser methods - def feed(self, data, isFinal = 0): + def feed(self, data, isFinal=False): if not self._parsing: self.reset() - self._parsing = 1 + self._parsing = True self._cont_handler.startDocument() try: @@ -237,13 +237,13 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator): # If we are completing an external entity, do nothing here return try: - self.feed("", isFinal = 1) + self.feed(b"", isFinal=True) self._cont_handler.endDocument() - self._parsing = 0 + self._parsing = False # break cycle created by expat handlers pointing to our methods self._parser = None finally: - self._parsing = 0 + self._parsing = False if self._parser is not None: # Keep ErrorColumnNumber and ErrorLineNumber after closing. parser = _ClosedParser() @@ -307,7 +307,7 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator): self._parser.SetParamEntityParsing( expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) - self._parsing = 0 + self._parsing = False self._entity_stack = [] # Locator methods diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py index b9875745..d15d60d2 100644 --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -313,31 +313,38 @@ class DateTime: s = self.timetuple() o = other.timetuple() else: - otype = (hasattr(other, "__class__") - and other.__class__.__name__ - or type(other)) - raise TypeError("Can't compare %s and %s" % - (self.__class__.__name__, otype)) + s = self + o = NotImplemented return s, o def __lt__(self, other): s, o = self.make_comparable(other) + if o is NotImplemented: + return NotImplemented return s < o def __le__(self, other): s, o = self.make_comparable(other) + if o is NotImplemented: + return NotImplemented return s <= o def __gt__(self, other): s, o = self.make_comparable(other) + if o is NotImplemented: + return NotImplemented return s > o def __ge__(self, other): s, o = self.make_comparable(other) + if o is NotImplemented: + return NotImplemented return s >= o def __eq__(self, other): s, o = self.make_comparable(other) + if o is NotImplemented: + return NotImplemented return s == o def timetuple(self): @@ -435,7 +442,7 @@ class ExpatParser: target.xml(encoding, None) def feed(self, data): - self._parser.Parse(data, 0) + self._parser.Parse(data, False) def close(self): try: @@ -1414,15 +1421,14 @@ class ServerProxy: # establish a "logical" server connection # get the url - type, uri = urllib.parse._splittype(uri) - if type not in ("http", "https"): + p = urllib.parse.urlparse(uri) + if p.scheme not in ("http", "https"): raise OSError("unsupported XML-RPC protocol") - self.__host, self.__handler = urllib.parse._splithost(uri) - if not self.__handler: - self.__handler = "/RPC2" + self.__host = p.netloc + self.__handler = p.path or "/RPC2" if transport is None: - if type == "https": + if p.scheme == "https": handler = SafeTransport extra_kwargs = {"context": context} else: diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py index 32aba4df..287e3243 100644 --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -732,7 +732,7 @@ class ServerHTMLDoc(pydoc.HTMLDoc): # hyperlinking of arbitrary strings being used as method # names. Only methods with names consisting of word characters # and '.'s are hyperlinked. - pattern = re.compile(r'\b((http|ftp)://\S+[\w/]|' + pattern = re.compile(r'\b((http|https|ftp)://\S+[\w/]|' r'RFC[- ]?(\d+)|' r'PEP[- ]?(\d+)|' r'(self\.)?((?:\w|\.)+))\b') diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 73e89666..915698f9 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -4,7 +4,6 @@ Read and write ZIP files. XXX references to utf-8 need further investigation. """ import binascii -import functools import importlib.util import io import itertools @@ -378,11 +377,11 @@ class ZipInfo (object): self.volume = 0 # Volume number of file header self.internal_attr = 0 # Internal attributes self.external_attr = 0 # External file attributes + self.compress_size = 0 # Size of the compressed file + self.file_size = 0 # Size of the uncompressed file # Other attributes are set by class ZipFile: # header_offset Byte offset to the file header # CRC CRC-32 of the uncompressed file - # compress_size Size of the compressed file - # file_size Size of the uncompressed file def __repr__(self): result = ['<%s filename=%r' % (self.__class__.__name__, self.filename)] @@ -467,44 +466,23 @@ class ZipInfo (object): if ln+4 > len(extra): raise BadZipFile("Corrupt extra field %04x (size=%d)" % (tp, ln)) if tp == 0x0001: - if ln >= 24: - counts = unpack('{timecnt}{time_type}", fobj.read(timecnt * time_size) + ) + trans_idx = struct.unpack(f">{timecnt}B", fobj.read(timecnt)) + else: + trans_list_utc = () + trans_idx = () + + # Read the ttinfo struct, (utoff, isdst, abbrind) + if typecnt: + utcoff, isdst, abbrind = zip( + *(struct.unpack(">lbb", fobj.read(6)) for i in range(typecnt)) + ) + else: + utcoff = () + isdst = () + abbrind = () + + # Now read the abbreviations. They are null-terminated strings, indexed + # not by position in the array but by position in the unsplit + # abbreviation string. I suppose this makes more sense in C, which uses + # null to terminate the strings, but it's inconvenient here... + abbr_vals = {} + abbr_chars = fobj.read(charcnt) + + def get_abbr(idx): + # Gets a string starting at idx and running until the next \x00 + # + # We cannot pre-populate abbr_vals by splitting on \x00 because there + # are some zones that use subsets of longer abbreviations, like so: + # + # LMT\x00AHST\x00HDT\x00 + # + # Where the idx to abbr mapping should be: + # + # {0: "LMT", 4: "AHST", 5: "HST", 9: "HDT"} + if idx not in abbr_vals: + span_end = abbr_chars.find(b"\x00", idx) + abbr_vals[idx] = abbr_chars[idx:span_end].decode() + + return abbr_vals[idx] + + abbr = tuple(get_abbr(idx) for idx in abbrind) + + # The remainder of the file consists of leap seconds (currently unused) and + # the standard/wall and ut/local indicators, which are metadata we don't need. + # In version 2 files, we need to skip the unnecessary data to get at the TZ string: + if header.version >= 2: + # Each leap second record has size (time_size + 4) + skip_bytes = header.isutcnt + header.isstdcnt + header.leapcnt * 12 + fobj.seek(skip_bytes, 1) + + c = fobj.read(1) # Should be \n + assert c == b"\n", c + + tz_bytes = b"" + while (c := fobj.read(1)) != b"\n": + tz_bytes += c + + tz_str = tz_bytes + else: + tz_str = None + + return trans_idx, trans_list_utc, utcoff, isdst, abbr, tz_str + + +class _TZifHeader: + __slots__ = [ + "version", + "isutcnt", + "isstdcnt", + "leapcnt", + "timecnt", + "typecnt", + "charcnt", + ] + + def __init__(self, *args): + assert len(self.__slots__) == len(args) + for attr, val in zip(self.__slots__, args): + setattr(self, attr, val) + + @classmethod + def from_file(cls, stream): + # The header starts with a 4-byte "magic" value + if stream.read(4) != b"TZif": + raise ValueError("Invalid TZif file: magic not found") + + _version = stream.read(1) + if _version == b"\x00": + version = 1 + else: + version = int(_version) + stream.read(15) + + args = (version,) + + # Slots are defined in the order that the bytes are arranged + args = args + struct.unpack(">6l", stream.read(24)) + + return cls(*args) + + +class ZoneInfoNotFoundError(KeyError): + """Exception raised when a ZoneInfo key is not found.""" diff --git a/Lib/zoneinfo/_tzpath.py b/Lib/zoneinfo/_tzpath.py new file mode 100644 index 00000000..9513611c --- /dev/null +++ b/Lib/zoneinfo/_tzpath.py @@ -0,0 +1,175 @@ +import os +import sysconfig + + +def reset_tzpath(to=None): + global TZPATH + + tzpaths = to + if tzpaths is not None: + if isinstance(tzpaths, (str, bytes)): + raise TypeError( + f"tzpaths must be a list or tuple, " + + f"not {type(tzpaths)}: {tzpaths!r}" + ) + + if not all(map(os.path.isabs, tzpaths)): + raise ValueError(_get_invalid_paths_message(tzpaths)) + base_tzpath = tzpaths + else: + env_var = os.environ.get("PYTHONTZPATH", None) + if env_var is not None: + base_tzpath = _parse_python_tzpath(env_var) + else: + base_tzpath = _parse_python_tzpath( + sysconfig.get_config_var("TZPATH") + ) + + TZPATH = tuple(base_tzpath) + + +def _parse_python_tzpath(env_var): + if not env_var: + return () + + raw_tzpath = env_var.split(os.pathsep) + new_tzpath = tuple(filter(os.path.isabs, raw_tzpath)) + + # If anything has been filtered out, we will warn about it + if len(new_tzpath) != len(raw_tzpath): + import warnings + + msg = _get_invalid_paths_message(raw_tzpath) + + warnings.warn( + "Invalid paths specified in PYTHONTZPATH environment variable." + + msg, + InvalidTZPathWarning, + ) + + return new_tzpath + + +def _get_invalid_paths_message(tzpaths): + invalid_paths = (path for path in tzpaths if not os.path.isabs(path)) + + prefix = "\n " + indented_str = prefix + prefix.join(invalid_paths) + + return ( + "Paths should be absolute but found the following relative paths:" + + indented_str + ) + + +def find_tzfile(key): + """Retrieve the path to a TZif file from a key.""" + _validate_tzfile_path(key) + for search_path in TZPATH: + filepath = os.path.join(search_path, key) + if os.path.isfile(filepath): + return filepath + + return None + + +_TEST_PATH = os.path.normpath(os.path.join("_", "_"))[:-1] + + +def _validate_tzfile_path(path, _base=_TEST_PATH): + if os.path.isabs(path): + raise ValueError( + f"ZoneInfo keys may not be absolute paths, got: {path}" + ) + + # We only care about the kinds of path normalizations that would change the + # length of the key - e.g. a/../b -> a/b, or a/b/ -> a/b. On Windows, + # normpath will also change from a/b to a\b, but that would still preserve + # the length. + new_path = os.path.normpath(path) + if len(new_path) != len(path): + raise ValueError( + f"ZoneInfo keys must be normalized relative paths, got: {path}" + ) + + resolved = os.path.normpath(os.path.join(_base, new_path)) + if not resolved.startswith(_base): + raise ValueError( + f"ZoneInfo keys must refer to subdirectories of TZPATH, got: {path}" + ) + + +del _TEST_PATH + + +def available_timezones(): + """Returns a set containing all available time zones. + + .. caution:: + + This may attempt to open a large number of files, since the best way to + determine if a given file on the time zone search path is to open it + and check for the "magic string" at the beginning. + """ + from importlib import resources + + valid_zones = set() + + # Start with loading from the tzdata package if it exists: this has a + # pre-assembled list of zones that only requires opening one file. + try: + with resources.open_text("tzdata", "zones") as f: + for zone in f: + zone = zone.strip() + if zone: + valid_zones.add(zone) + except (ImportError, FileNotFoundError): + pass + + def valid_key(fpath): + try: + with open(fpath, "rb") as f: + return f.read(4) == b"TZif" + except Exception: # pragma: nocover + return False + + for tz_root in TZPATH: + if not os.path.exists(tz_root): + continue + + for root, dirnames, files in os.walk(tz_root): + if root == tz_root: + # right/ and posix/ are special directories and shouldn't be + # included in the output of available zones + if "right" in dirnames: + dirnames.remove("right") + if "posix" in dirnames: + dirnames.remove("posix") + + for file in files: + fpath = os.path.join(root, file) + + key = os.path.relpath(fpath, start=tz_root) + if os.sep != "/": # pragma: nocover + key = key.replace(os.sep, "/") + + if not key or key in valid_zones: + continue + + if valid_key(fpath): + valid_zones.add(key) + + if "posixrules" in valid_zones: + # posixrules is a special symlink-only time zone where it exists, it + # should not be included in the output + valid_zones.remove("posixrules") + + return valid_zones + + +class InvalidTZPathWarning(RuntimeWarning): + """Warning raised if an invalid path is specified in PYTHONTZPATH.""" + + +TZPATH = () +reset_tzpath() diff --git a/Lib/zoneinfo/_zoneinfo.py b/Lib/zoneinfo/_zoneinfo.py new file mode 100644 index 00000000..9810637d --- /dev/null +++ b/Lib/zoneinfo/_zoneinfo.py @@ -0,0 +1,752 @@ +import bisect +import calendar +import collections +import functools +import re +import weakref +from datetime import datetime, timedelta, tzinfo + +from . import _common, _tzpath + +EPOCH = datetime(1970, 1, 1) +EPOCHORDINAL = datetime(1970, 1, 1).toordinal() + +# It is relatively expensive to construct new timedelta objects, and in most +# cases we're looking at the same deltas, like integer numbers of hours, etc. +# To improve speed and memory use, we'll keep a dictionary with references +# to the ones we've already used so far. +# +# Loading every time zone in the 2020a version of the time zone database +# requires 447 timedeltas, which requires approximately the amount of space +# that ZoneInfo("America/New_York") with 236 transitions takes up, so we will +# set the cache size to 512 so that in the common case we always get cache +# hits, but specifically crafted ZoneInfo objects don't leak arbitrary amounts +# of memory. +@functools.lru_cache(maxsize=512) +def _load_timedelta(seconds): + return timedelta(seconds=seconds) + + +class ZoneInfo(tzinfo): + _strong_cache_size = 8 + _strong_cache = collections.OrderedDict() + _weak_cache = weakref.WeakValueDictionary() + __module__ = "zoneinfo" + + def __init_subclass__(cls): + cls._strong_cache = collections.OrderedDict() + cls._weak_cache = weakref.WeakValueDictionary() + + def __new__(cls, key): + instance = cls._weak_cache.get(key, None) + if instance is None: + instance = cls._weak_cache.setdefault(key, cls._new_instance(key)) + instance._from_cache = True + + # Update the "strong" cache + cls._strong_cache[key] = cls._strong_cache.pop(key, instance) + + if len(cls._strong_cache) > cls._strong_cache_size: + cls._strong_cache.popitem(last=False) + + return instance + + @classmethod + def no_cache(cls, key): + obj = cls._new_instance(key) + obj._from_cache = False + + return obj + + @classmethod + def _new_instance(cls, key): + obj = super().__new__(cls) + obj._key = key + obj._file_path = obj._find_tzfile(key) + + if obj._file_path is not None: + file_obj = open(obj._file_path, "rb") + else: + file_obj = _common.load_tzdata(key) + + with file_obj as f: + obj._load_file(f) + + return obj + + @classmethod + def from_file(cls, fobj, /, key=None): + obj = super().__new__(cls) + obj._key = key + obj._file_path = None + obj._load_file(fobj) + obj._file_repr = repr(fobj) + + # Disable pickling for objects created from files + obj.__reduce__ = obj._file_reduce + + return obj + + @classmethod + def clear_cache(cls, *, only_keys=None): + if only_keys is not None: + for key in only_keys: + cls._weak_cache.pop(key, None) + cls._strong_cache.pop(key, None) + + else: + cls._weak_cache.clear() + cls._strong_cache.clear() + + @property + def key(self): + return self._key + + def utcoffset(self, dt): + return self._find_trans(dt).utcoff + + def dst(self, dt): + return self._find_trans(dt).dstoff + + def tzname(self, dt): + return self._find_trans(dt).tzname + + def fromutc(self, dt): + """Convert from datetime in UTC to datetime in local time""" + + if not isinstance(dt, datetime): + raise TypeError("fromutc() requires a datetime argument") + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + timestamp = self._get_local_timestamp(dt) + num_trans = len(self._trans_utc) + + if num_trans >= 1 and timestamp < self._trans_utc[0]: + tti = self._tti_before + fold = 0 + elif ( + num_trans == 0 or timestamp > self._trans_utc[-1] + ) and not isinstance(self._tz_after, _ttinfo): + tti, fold = self._tz_after.get_trans_info_fromutc( + timestamp, dt.year + ) + elif num_trans == 0: + tti = self._tz_after + fold = 0 + else: + idx = bisect.bisect_right(self._trans_utc, timestamp) + + if num_trans > 1 and timestamp >= self._trans_utc[1]: + tti_prev, tti = self._ttinfos[idx - 2 : idx] + elif timestamp > self._trans_utc[-1]: + tti_prev = self._ttinfos[-1] + tti = self._tz_after + else: + tti_prev = self._tti_before + tti = self._ttinfos[0] + + # Detect fold + shift = tti_prev.utcoff - tti.utcoff + fold = shift.total_seconds() > timestamp - self._trans_utc[idx - 1] + dt += tti.utcoff + if fold: + return dt.replace(fold=1) + else: + return dt + + def _find_trans(self, dt): + if dt is None: + if self._fixed_offset: + return self._tz_after + else: + return _NO_TTINFO + + ts = self._get_local_timestamp(dt) + + lt = self._trans_local[dt.fold] + + num_trans = len(lt) + + if num_trans and ts < lt[0]: + return self._tti_before + elif not num_trans or ts > lt[-1]: + if isinstance(self._tz_after, _TZStr): + return self._tz_after.get_trans_info(ts, dt.year, dt.fold) + else: + return self._tz_after + else: + # idx is the transition that occurs after this timestamp, so we + # subtract off 1 to get the current ttinfo + idx = bisect.bisect_right(lt, ts) - 1 + assert idx >= 0 + return self._ttinfos[idx] + + def _get_local_timestamp(self, dt): + return ( + (dt.toordinal() - EPOCHORDINAL) * 86400 + + dt.hour * 3600 + + dt.minute * 60 + + dt.second + ) + + def __str__(self): + if self._key is not None: + return f"{self._key}" + else: + return repr(self) + + def __repr__(self): + if self._key is not None: + return f"{self.__class__.__name__}(key={self._key!r})" + else: + return f"{self.__class__.__name__}.from_file({self._file_repr})" + + def __reduce__(self): + return (self.__class__._unpickle, (self._key, self._from_cache)) + + def _file_reduce(self): + import pickle + + raise pickle.PicklingError( + "Cannot pickle a ZoneInfo file created from a file stream." + ) + + @classmethod + def _unpickle(cls, key, from_cache, /): + if from_cache: + return cls(key) + else: + return cls.no_cache(key) + + def _find_tzfile(self, key): + return _tzpath.find_tzfile(key) + + def _load_file(self, fobj): + # Retrieve all the data as it exists in the zoneinfo file + trans_idx, trans_utc, utcoff, isdst, abbr, tz_str = _common.load_data( + fobj + ) + + # Infer the DST offsets (needed for .dst()) from the data + dstoff = self._utcoff_to_dstoff(trans_idx, utcoff, isdst) + + # Convert all the transition times (UTC) into "seconds since 1970-01-01 local time" + trans_local = self._ts_to_local(trans_idx, trans_utc, utcoff) + + # Construct `_ttinfo` objects for each transition in the file + _ttinfo_list = [ + _ttinfo( + _load_timedelta(utcoffset), _load_timedelta(dstoffset), tzname + ) + for utcoffset, dstoffset, tzname in zip(utcoff, dstoff, abbr) + ] + + self._trans_utc = trans_utc + self._trans_local = trans_local + self._ttinfos = [_ttinfo_list[idx] for idx in trans_idx] + + # Find the first non-DST transition + for i in range(len(isdst)): + if not isdst[i]: + self._tti_before = _ttinfo_list[i] + break + else: + if self._ttinfos: + self._tti_before = self._ttinfos[0] + else: + self._tti_before = None + + # Set the "fallback" time zone + if tz_str is not None and tz_str != b"": + self._tz_after = _parse_tz_str(tz_str.decode()) + else: + if not self._ttinfos and not _ttinfo_list: + raise ValueError("No time zone information found.") + + if self._ttinfos: + self._tz_after = self._ttinfos[-1] + else: + self._tz_after = _ttinfo_list[-1] + + # Determine if this is a "fixed offset" zone, meaning that the output + # of the utcoffset, dst and tzname functions does not depend on the + # specific datetime passed. + # + # We make three simplifying assumptions here: + # + # 1. If _tz_after is not a _ttinfo, it has transitions that might + # actually occur (it is possible to construct TZ strings that + # specify STD and DST but no transitions ever occur, such as + # AAA0BBB,0/0,J365/25). + # 2. If _ttinfo_list contains more than one _ttinfo object, the objects + # represent different offsets. + # 3. _ttinfo_list contains no unused _ttinfos (in which case an + # otherwise fixed-offset zone with extra _ttinfos defined may + # appear to *not* be a fixed offset zone). + # + # Violations to these assumptions would be fairly exotic, and exotic + # zones should almost certainly not be used with datetime.time (the + # only thing that would be affected by this). + if len(_ttinfo_list) > 1 or not isinstance(self._tz_after, _ttinfo): + self._fixed_offset = False + elif not _ttinfo_list: + self._fixed_offset = True + else: + self._fixed_offset = _ttinfo_list[0] == self._tz_after + + @staticmethod + def _utcoff_to_dstoff(trans_idx, utcoffsets, isdsts): + # Now we must transform our ttis and abbrs into `_ttinfo` objects, + # but there is an issue: .dst() must return a timedelta with the + # difference between utcoffset() and the "standard" offset, but + # the "base offset" and "DST offset" are not encoded in the file; + # we can infer what they are from the isdst flag, but it is not + # sufficient to to just look at the last standard offset, because + # occasionally countries will shift both DST offset and base offset. + + typecnt = len(isdsts) + dstoffs = [0] * typecnt # Provisionally assign all to 0. + dst_cnt = sum(isdsts) + dst_found = 0 + + for i in range(1, len(trans_idx)): + if dst_cnt == dst_found: + break + + idx = trans_idx[i] + + dst = isdsts[idx] + + # We're only going to look at daylight saving time + if not dst: + continue + + # Skip any offsets that have already been assigned + if dstoffs[idx] != 0: + continue + + dstoff = 0 + utcoff = utcoffsets[idx] + + comp_idx = trans_idx[i - 1] + + if not isdsts[comp_idx]: + dstoff = utcoff - utcoffsets[comp_idx] + + if not dstoff and idx < (typecnt - 1): + comp_idx = trans_idx[i + 1] + + # If the following transition is also DST and we couldn't + # find the DST offset by this point, we're going ot have to + # skip it and hope this transition gets assigned later + if isdsts[comp_idx]: + continue + + dstoff = utcoff - utcoffsets[comp_idx] + + if dstoff: + dst_found += 1 + dstoffs[idx] = dstoff + else: + # If we didn't find a valid value for a given index, we'll end up + # with dstoff = 0 for something where `isdst=1`. This is obviously + # wrong - one hour will be a much better guess than 0 + for idx in range(typecnt): + if not dstoffs[idx] and isdsts[idx]: + dstoffs[idx] = 3600 + + return dstoffs + + @staticmethod + def _ts_to_local(trans_idx, trans_list_utc, utcoffsets): + """Generate number of seconds since 1970 *in the local time*. + + This is necessary to easily find the transition times in local time""" + if not trans_list_utc: + return [[], []] + + # Start with the timestamps and modify in-place + trans_list_wall = [list(trans_list_utc), list(trans_list_utc)] + + if len(utcoffsets) > 1: + offset_0 = utcoffsets[0] + offset_1 = utcoffsets[trans_idx[0]] + if offset_1 > offset_0: + offset_1, offset_0 = offset_0, offset_1 + else: + offset_0 = offset_1 = utcoffsets[0] + + trans_list_wall[0][0] += offset_0 + trans_list_wall[1][0] += offset_1 + + for i in range(1, len(trans_idx)): + offset_0 = utcoffsets[trans_idx[i - 1]] + offset_1 = utcoffsets[trans_idx[i]] + + if offset_1 > offset_0: + offset_1, offset_0 = offset_0, offset_1 + + trans_list_wall[0][i] += offset_0 + trans_list_wall[1][i] += offset_1 + + return trans_list_wall + + +class _ttinfo: + __slots__ = ["utcoff", "dstoff", "tzname"] + + def __init__(self, utcoff, dstoff, tzname): + self.utcoff = utcoff + self.dstoff = dstoff + self.tzname = tzname + + def __eq__(self, other): + return ( + self.utcoff == other.utcoff + and self.dstoff == other.dstoff + and self.tzname == other.tzname + ) + + def __repr__(self): # pragma: nocover + return ( + f"{self.__class__.__name__}" + + f"({self.utcoff}, {self.dstoff}, {self.tzname})" + ) + + +_NO_TTINFO = _ttinfo(None, None, None) + + +class _TZStr: + __slots__ = ( + "std", + "dst", + "start", + "end", + "get_trans_info", + "get_trans_info_fromutc", + "dst_diff", + ) + + def __init__( + self, std_abbr, std_offset, dst_abbr, dst_offset, start=None, end=None + ): + self.dst_diff = dst_offset - std_offset + std_offset = _load_timedelta(std_offset) + self.std = _ttinfo( + utcoff=std_offset, dstoff=_load_timedelta(0), tzname=std_abbr + ) + + self.start = start + self.end = end + + dst_offset = _load_timedelta(dst_offset) + delta = _load_timedelta(self.dst_diff) + self.dst = _ttinfo(utcoff=dst_offset, dstoff=delta, tzname=dst_abbr) + + # These are assertions because the constructor should only be called + # by functions that would fail before passing start or end + assert start is not None, "No transition start specified" + assert end is not None, "No transition end specified" + + self.get_trans_info = self._get_trans_info + self.get_trans_info_fromutc = self._get_trans_info_fromutc + + def transitions(self, year): + start = self.start.year_to_epoch(year) + end = self.end.year_to_epoch(year) + return start, end + + def _get_trans_info(self, ts, year, fold): + """Get the information about the current transition - tti""" + start, end = self.transitions(year) + + # With fold = 0, the period (denominated in local time) with the + # smaller offset starts at the end of the gap and ends at the end of + # the fold; with fold = 1, it runs from the start of the gap to the + # beginning of the fold. + # + # So in order to determine the DST boundaries we need to know both + # the fold and whether DST is positive or negative (rare), and it + # turns out that this boils down to fold XOR is_positive. + if fold == (self.dst_diff >= 0): + end -= self.dst_diff + else: + start += self.dst_diff + + if start < end: + isdst = start <= ts < end + else: + isdst = not (end <= ts < start) + + return self.dst if isdst else self.std + + def _get_trans_info_fromutc(self, ts, year): + start, end = self.transitions(year) + start -= self.std.utcoff.total_seconds() + end -= self.dst.utcoff.total_seconds() + + if start < end: + isdst = start <= ts < end + else: + isdst = not (end <= ts < start) + + # For positive DST, the ambiguous period is one dst_diff after the end + # of DST; for negative DST, the ambiguous period is one dst_diff before + # the start of DST. + if self.dst_diff > 0: + ambig_start = end + ambig_end = end + self.dst_diff + else: + ambig_start = start + ambig_end = start - self.dst_diff + + fold = ambig_start <= ts < ambig_end + + return (self.dst if isdst else self.std, fold) + + +def _post_epoch_days_before_year(year): + """Get the number of days between 1970-01-01 and YEAR-01-01""" + y = year - 1 + return y * 365 + y // 4 - y // 100 + y // 400 - EPOCHORDINAL + + +class _DayOffset: + __slots__ = ["d", "julian", "hour", "minute", "second"] + + def __init__(self, d, julian, hour=2, minute=0, second=0): + if not (0 + julian) <= d <= 365: + min_day = 0 + julian + raise ValueError(f"d must be in [{min_day}, 365], not: {d}") + + self.d = d + self.julian = julian + self.hour = hour + self.minute = minute + self.second = second + + def year_to_epoch(self, year): + days_before_year = _post_epoch_days_before_year(year) + + d = self.d + if self.julian and d >= 59 and calendar.isleap(year): + d += 1 + + epoch = (days_before_year + d) * 86400 + epoch += self.hour * 3600 + self.minute * 60 + self.second + + return epoch + + +class _CalendarOffset: + __slots__ = ["m", "w", "d", "hour", "minute", "second"] + + _DAYS_BEFORE_MONTH = ( + -1, + 0, + 31, + 59, + 90, + 120, + 151, + 181, + 212, + 243, + 273, + 304, + 334, + ) + + def __init__(self, m, w, d, hour=2, minute=0, second=0): + if not 0 < m <= 12: + raise ValueError("m must be in (0, 12]") + + if not 0 < w <= 5: + raise ValueError("w must be in (0, 5]") + + if not 0 <= d <= 6: + raise ValueError("d must be in [0, 6]") + + self.m = m + self.w = w + self.d = d + self.hour = hour + self.minute = minute + self.second = second + + @classmethod + def _ymd2ord(cls, year, month, day): + return ( + _post_epoch_days_before_year(year) + + cls._DAYS_BEFORE_MONTH[month] + + (month > 2 and calendar.isleap(year)) + + day + ) + + # TODO: These are not actually epoch dates as they are expressed in local time + def year_to_epoch(self, year): + """Calculates the datetime of the occurrence from the year""" + # We know year and month, we need to convert w, d into day of month + # + # Week 1 is the first week in which day `d` (where 0 = Sunday) appears. + # Week 5 represents the last occurrence of day `d`, so we need to know + # the range of the month. + first_day, days_in_month = calendar.monthrange(year, self.m) + + # This equation seems magical, so I'll break it down: + # 1. calendar says 0 = Monday, POSIX says 0 = Sunday + # so we need first_day + 1 to get 1 = Monday -> 7 = Sunday, + # which is still equivalent because this math is mod 7 + # 2. Get first day - desired day mod 7: -1 % 7 = 6, so we don't need + # to do anything to adjust negative numbers. + # 3. Add 1 because month days are a 1-based index. + month_day = (self.d - (first_day + 1)) % 7 + 1 + + # Now use a 0-based index version of `w` to calculate the w-th + # occurrence of `d` + month_day += (self.w - 1) * 7 + + # month_day will only be > days_in_month if w was 5, and `w` means + # "last occurrence of `d`", so now we just check if we over-shot the + # end of the month and if so knock off 1 week. + if month_day > days_in_month: + month_day -= 7 + + ordinal = self._ymd2ord(year, self.m, month_day) + epoch = ordinal * 86400 + epoch += self.hour * 3600 + self.minute * 60 + self.second + return epoch + + +def _parse_tz_str(tz_str): + # The tz string has the format: + # + # std[offset[dst[offset],start[/time],end[/time]]] + # + # std and dst must be 3 or more characters long and must not contain + # a leading colon, embedded digits, commas, nor a plus or minus signs; + # The spaces between "std" and "offset" are only for display and are + # not actually present in the string. + # + # The format of the offset is ``[+|-]hh[:mm[:ss]]`` + + offset_str, *start_end_str = tz_str.split(",", 1) + + # fmt: off + parser_re = re.compile( + r"(?P[^<0-9:.+-]+|<[a-zA-Z0-9+\-]+>)" + + r"((?P[+-]?\d{1,2}(:\d{2}(:\d{2})?)?)" + + r"((?P[^0-9:.+-]+|<[a-zA-Z0-9+\-]+>)" + + r"((?P[+-]?\d{1,2}(:\d{2}(:\d{2})?)?))?" + + r")?" + # dst + r")?$" # stdoff + ) + # fmt: on + + m = parser_re.match(offset_str) + + if m is None: + raise ValueError(f"{tz_str} is not a valid TZ string") + + std_abbr = m.group("std") + dst_abbr = m.group("dst") + dst_offset = None + + std_abbr = std_abbr.strip("<>") + + if dst_abbr: + dst_abbr = dst_abbr.strip("<>") + + if std_offset := m.group("stdoff"): + try: + std_offset = _parse_tz_delta(std_offset) + except ValueError as e: + raise ValueError(f"Invalid STD offset in {tz_str}") from e + else: + std_offset = 0 + + if dst_abbr is not None: + if dst_offset := m.group("dstoff"): + try: + dst_offset = _parse_tz_delta(dst_offset) + except ValueError as e: + raise ValueError(f"Invalid DST offset in {tz_str}") from e + else: + dst_offset = std_offset + 3600 + + if not start_end_str: + raise ValueError(f"Missing transition rules: {tz_str}") + + start_end_strs = start_end_str[0].split(",", 1) + try: + start, end = (_parse_dst_start_end(x) for x in start_end_strs) + except ValueError as e: + raise ValueError(f"Invalid TZ string: {tz_str}") from e + + return _TZStr(std_abbr, std_offset, dst_abbr, dst_offset, start, end) + elif start_end_str: + raise ValueError(f"Transition rule present without DST: {tz_str}") + else: + # This is a static ttinfo, don't return _TZStr + return _ttinfo( + _load_timedelta(std_offset), _load_timedelta(0), std_abbr + ) + + +def _parse_dst_start_end(dststr): + date, *time = dststr.split("/") + if date[0] == "M": + n_is_julian = False + m = re.match(r"M(\d{1,2})\.(\d).(\d)$", date) + if m is None: + raise ValueError(f"Invalid dst start/end date: {dststr}") + date_offset = tuple(map(int, m.groups())) + offset = _CalendarOffset(*date_offset) + else: + if date[0] == "J": + n_is_julian = True + date = date[1:] + else: + n_is_julian = False + + doy = int(date) + offset = _DayOffset(doy, n_is_julian) + + if time: + time_components = list(map(int, time[0].split(":"))) + n_components = len(time_components) + if n_components < 3: + time_components.extend([0] * (3 - n_components)) + offset.hour, offset.minute, offset.second = time_components + + return offset + + +def _parse_tz_delta(tz_delta): + match = re.match( + r"(?P[+-])?(?P\d{1,2})(:(?P\d{2})(:(?P\d{2}))?)?", + tz_delta, + ) + # Anything passed to this function should already have hit an equivalent + # regular expression to find the section to parse. + assert match is not None, tz_delta + + h, m, s = ( + int(v) if v is not None else 0 + for v in map(match.group, ("h", "m", "s")) + ) + + total = h * 3600 + m * 60 + s + + if not -86400 < total < 86400: + raise ValueError( + f"Offset must be strictly between -24h and +24h: {tz_delta}" + ) + + # Yes, +5 maps to an offset of -5h + if match.group("sign") != "-": + total *= -1 + + return total diff --git a/Mac/BuildScript/resources/ReadMe.rtf b/Mac/BuildScript/resources/ReadMe.rtf index b1e972ee..9bc96986 100644 --- a/Mac/BuildScript/resources/ReadMe.rtf +++ b/Mac/BuildScript/resources/ReadMe.rtf @@ -20,7 +20,7 @@ This package includes its own private copy of OpenSSL 1.1.1. The trust certifi \f0\i0 command line utility are not used as defaults by the Python \f3 ssl \f0 module. A sample command script is included in -\f3 /Applications/Python 3.8 +\f3 /Applications/Python 3.9 \f0 to install a curated bundle of default root certificates from the third-party \f3 certifi \f0 package ({\field{\*\fldinst{HYPERLINK "https://pypi.org/project/certifi/"}}{\fldrslt https://pypi.org/project/certifi/}}). Double-click on @@ -48,33 +48,9 @@ Due to new security checks on macOS 10.15 Catalina, when launching IDLE macOS ma \f0\b0 file dialog windows. Click on the \f1\b OK \f0\b0 button to proceed.\ - -\f1\b \ul \ -macOS 10.15 (Catalina) Gatekeeper Requirements [changed in 3.8.2]\ - -\f0\b0 \ulnone \ -As of 2020-02-03, Apple has changed how third-party installer packages, like those provided by python.org, are notarized for verification by Gatekeeper and begun enforcing additional requirements such as code signing and use of the hardened runtime. As of 3.8.2, python.org installer packages now meet those additional notarization requirements. The necessary changes in packaging should be transparent to your use of Python but, in the unlikely event that you encounter changes in behavior between 3.8.1 and newer 3.8.x releases in areas like ctypes, importlib, or mmap, please check bugs.python.org for existing reports and, if necessary, open a new issue.\ - -\f1\b \ul \ -Python 2.7 end-of-life [changed in 3.8.4]\ \ -\f0\b0 \ulnone Python 2.7 has now reached end-of-life. As of Python 3.8.4, the -\f3 Python Launcher -\f0 app now has -\f3 python3 -\f0 factory defaults. Also, the -\f3 Current -\f0 link in the -\f3 /Library/Frameworks/Python.framework/Versions -\f0 directory is now updated to point to the Python 3 being installed; previously, only Python 2 installs updated -\f3 Current -\f0 . This change might affect developers using the framework to embed Python in their applications. If another version is desired for embedding, the -\f3 Current -\f0 symlink can be changed manually without affecting 3.8.x behavior.\ - -\f1\b \ul \ -Other changes\ +\f1\b \ul Other changes\ \f0\b0 \ulnone \ For other changes in this release, see the diff --git a/Mac/BuildScript/resources/Welcome.rtf b/Mac/BuildScript/resources/Welcome.rtf index ce53bd78..407c2258 100644 --- a/Mac/BuildScript/resources/Welcome.rtf +++ b/Mac/BuildScript/resources/Welcome.rtf @@ -1,5 +1,5 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;\f2\fmodern\fcharset0 CourierNewPSMT; +{\rtf1\ansi\ansicpg1252\cocoartf2513 +\cocoascreenfonts1\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;\f2\fmodern\fcharset0 CourierNewPSMT; } {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} diff --git a/Mac/Resources/iconsrc/PythonCompiled.psd b/Mac/Resources/iconsrc/PythonCompiled.psd old mode 100755 new mode 100644 diff --git a/Mac/Resources/iconsrc/PythonIcon.psd b/Mac/Resources/iconsrc/PythonIcon.psd old mode 100755 new mode 100644 diff --git a/Mac/Resources/iconsrc/PythonSource.psd b/Mac/Resources/iconsrc/PythonSource.psd old mode 100755 new mode 100644 diff --git a/Makefile.pre.in b/Makefile.pre.in index a914a9c7..77f91e72 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -143,11 +143,12 @@ LIBDIR= @libdir@ MANDIR= @mandir@ INCLUDEDIR= @includedir@ CONFINCLUDEDIR= $(exec_prefix)/include -SCRIPTDIR= $(prefix)/lib +PLATLIBDIR= @PLATLIBDIR@ +SCRIPTDIR= $(prefix)/$(PLATLIBDIR) ABIFLAGS= @ABIFLAGS@ # Detailed destination directories -BINLIBDEST= $(LIBDIR)/python$(VERSION) +BINLIBDEST= @BINLIBDEST@ LIBDEST= $(SCRIPTDIR)/python$(VERSION) INCLUDEPY= $(INCLUDEDIR)/python$(LDVERSION) CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(LDVERSION) @@ -160,6 +161,10 @@ BLDSHARED= @BLDSHARED@ $(PY_CORE_LDFLAGS) LDCXXSHARED= @LDCXXSHARED@ DESTSHARED= $(BINLIBDEST)/lib-dynload +# List of exported symbols for AIX +EXPORTSYMS= @EXPORTSYMS@ +EXPORTSFROM= @EXPORTSFROM@ + # Executable suffix (.exe on Windows and Mac OS X) EXE= @EXEEXT@ BUILDEXE= @BUILDEXEEXT@ @@ -196,6 +201,9 @@ OPENSSL_INCLUDES=@OPENSSL_INCLUDES@ OPENSSL_LIBS=@OPENSSL_LIBS@ OPENSSL_LDFLAGS=@OPENSSL_LDFLAGS@ +# Default zoneinfo.TZPATH. Added here to expose it in sysconfig.get_config_var +TZPATH=@TZPATH@ + # Modes for directories, executables and data files created by the # install process. Default to user-only-writable for all file types. DIRMODE= 755 @@ -243,7 +251,7 @@ LIBOBJS= @LIBOBJS@ PYTHON= python$(EXE) BUILDPYTHON= python$(BUILDEXE) -PYTHON_FOR_REGEN=@PYTHON_FOR_REGEN@ +PYTHON_FOR_REGEN?=@PYTHON_FOR_REGEN@ UPDATE_FILE=@PYTHON_FOR_REGEN@ $(srcdir)/Tools/scripts/update_file.py PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@ _PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@ @@ -294,6 +302,19 @@ LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@ ########################################################################## # Parser + +PEGEN_OBJS= \ + Parser/pegen/pegen.o \ + Parser/pegen/parse.o \ + Parser/pegen/parse_string.o \ + Parser/pegen/peg_api.o + + +PEGEN_HEADERS= \ + $(srcdir)/Include/internal/pegen_interface.h \ + $(srcdir)/Parser/pegen/pegen.h \ + $(srcdir)/Parser/pegen/parse_string.h + POBJS= \ Parser/acceler.o \ Parser/grammar1.o \ @@ -302,9 +323,10 @@ POBJS= \ Parser/parser.o \ Parser/token.o \ -PARSER_OBJS= $(POBJS) Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o +PARSER_OBJS= $(POBJS) $(PEGEN_OBJS) Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o PARSER_HEADERS= \ + $(PEGEN_HEADERS) \ $(srcdir)/Include/grammar.h \ $(srcdir)/Include/parsetok.h \ $(srcdir)/Parser/parser.h \ @@ -336,6 +358,7 @@ PYTHON_OBJS= \ Python/getversion.o \ Python/graminit.o \ Python/hamt.o \ + Python/hashtable.o \ Python/import.o \ Python/importdl.o \ Python/initconfig.o \ @@ -392,6 +415,7 @@ OBJECT_OBJS= \ Objects/descrobject.o \ Objects/enumobject.o \ Objects/exceptions.o \ + Objects/genericaliasobject.o \ Objects/genobject.o \ Objects/fileobject.o \ Objects/floatobject.o \ @@ -461,7 +485,7 @@ check-clean-src: # Profile generation build must start from a clean tree. profile-clean-stamp: - $(MAKE) clean profile-removal + $(MAKE) clean touch $@ # Compile with profile generation enabled. @@ -485,7 +509,7 @@ profile-run-stamp: $(MAKE) run_profile_task $(MAKE) build_all_merge_profile # Remove profile generation binary since we are done with it. - $(MAKE) clean + $(MAKE) clean-retain-profile # This is an expensive target to build and it does not have proper # makefile dependency information. So, we create a "stamp" file # to record its completion and avoid re-running it. @@ -512,8 +536,8 @@ profile-opt: profile-run-stamp .PHONY=coverage coverage-lcov coverage-report coverage: @echo "Building with support for coverage checking:" - $(MAKE) clean profile-removal - $(MAKE) @DEF_MAKE_RULE@ CFLAGS="$(CFLAGS) -O0 -pg -fprofile-arcs -ftest-coverage" LIBS="$(LIBS) -lgcov" + $(MAKE) clean + $(MAKE) @DEF_MAKE_RULE@ CFLAGS="$(CFLAGS) -O0 -pg --coverage" LIBS="$(LIBS) --coverage" coverage-lcov: @echo "Creating Coverage HTML report with LCOV:" @@ -562,7 +586,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c $(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir) # Build the interpreter -$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) +$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) $(EXPORTSYMS) $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) platform: $(BUILDPYTHON) pybuilddir.txt @@ -634,6 +658,10 @@ libpython$(LDVERSION).dylib: $(LIBRARY_OBJS) libpython$(VERSION).sl: $(LIBRARY_OBJS) $(LDSHARED) -o $@ $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) +# List of exported symbols for AIX +Modules/python.exp: $(LIBRARY) + $(srcdir)/Modules/makexp_aix $@ "$(EXPORTSFROM)" $? + # Copy up the gdb python hooks into a position where they can be automatically # loaded by gdb during Lib/test/test_gdb.py # @@ -693,7 +721,7 @@ Makefile Modules/config.c: Makefile.pre \ @echo "The Makefile was updated, you may need to re-run make." -Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) +Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) $(EXPORTSYMS) $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) ############################################################################ @@ -730,7 +758,8 @@ regen-importlib: Programs/_freeze_importlib # Regenerate all generated files regen-all: regen-opcode regen-opcode-targets regen-typeslots regen-grammar \ - regen-token regen-keyword regen-symbol regen-ast regen-importlib clinic + regen-token regen-keyword regen-symbol regen-ast regen-importlib clinic \ + regen-pegen-metaparser regen-pegen ############################################################################ # Special rules for object files @@ -788,6 +817,11 @@ Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(srcdir)/Include/pydt $(MULTIARCH_CPPFLAGS) \ -o $@ $(srcdir)/Python/sysmodule.c +Python/initconfig.o: $(srcdir)/Python/initconfig.c + $(CC) -c $(PY_CORE_CFLAGS) \ + -DPLATLIBDIR='"$(PLATLIBDIR)"' \ + -o $@ $(srcdir)/Python/initconfig.c + $(IO_OBJS): $(IO_H) .PHONY: regen-grammar @@ -802,19 +836,35 @@ regen-grammar: regen-token $(UPDATE_FILE) $(srcdir)/Include/graminit.h $(srcdir)/Include/graminit.h.new $(UPDATE_FILE) $(srcdir)/Python/graminit.c $(srcdir)/Python/graminit.c.new +.PHONY: regen-pegen-metaparser +regen-pegen-metaparser: + @$(MKDIR_P) $(srcdir)/Tools/peg_generator/pegen + PYTHONPATH=$(srcdir)/Tools/peg_generator $(PYTHON_FOR_REGEN) -m pegen -q python \ + $(srcdir)/Tools/peg_generator/pegen/metagrammar.gram \ + -o $(srcdir)/Tools/peg_generator/pegen/grammar_parser.py.new + $(UPDATE_FILE) $(srcdir)/Tools/peg_generator/pegen/grammar_parser.py \ + $(srcdir)/Tools/peg_generator/pegen/grammar_parser.py.new + +.PHONY: regen-pegen +regen-pegen: + @$(MKDIR_P) $(srcdir)/Parser/pegen + PYTHONPATH=$(srcdir)/Tools/peg_generator $(PYTHON_FOR_REGEN) -m pegen -q c \ + $(srcdir)/Grammar/python.gram \ + $(srcdir)/Grammar/Tokens \ + -o $(srcdir)/Parser/pegen/parse.new.c + $(UPDATE_FILE) $(srcdir)/Parser/pegen/parse.c $(srcdir)/Parser/pegen/parse.new.c + .PHONY=regen-ast regen-ast: - # Regenerate Include/Python-ast.h using Parser/asdl_c.py -h + # Regenerate Include/Python-ast.h and Python/Python-ast.c using Parser/asdl_c.py $(MKDIR_P) $(srcdir)/Include - $(PYTHON_FOR_REGEN) $(srcdir)/Parser/asdl_c.py \ - -h $(srcdir)/Include/Python-ast.h.new \ - $(srcdir)/Parser/Python.asdl - $(UPDATE_FILE) $(srcdir)/Include/Python-ast.h $(srcdir)/Include/Python-ast.h.new - # Regenerate Python/Python-ast.c using Parser/asdl_c.py -c $(MKDIR_P) $(srcdir)/Python $(PYTHON_FOR_REGEN) $(srcdir)/Parser/asdl_c.py \ - -c $(srcdir)/Python/Python-ast.c.new \ - $(srcdir)/Parser/Python.asdl + $(srcdir)/Parser/Python.asdl \ + -H $(srcdir)/Include/Python-ast.h.new \ + -C $(srcdir)/Python/Python-ast.c.new + + $(UPDATE_FILE) $(srcdir)/Include/Python-ast.h $(srcdir)/Include/Python-ast.h.new $(UPDATE_FILE) $(srcdir)/Python/Python-ast.c $(srcdir)/Python/Python-ast.c.new .PHONY: regen-opcode @@ -851,9 +901,10 @@ regen-token: .PHONY: regen-keyword regen-keyword: - # Regenerate Lib/keyword.py from Grammar/Grammar and Grammar/Tokens - # using Parser/pgen - PYTHONPATH=$(srcdir) $(PYTHON_FOR_REGEN) -m Parser.pgen.keywordgen $(srcdir)/Grammar/Grammar \ + # Regenerate Lib/keyword.py from Grammar/python.gram and Grammar/Tokens + # using Tools/peg_generator/pegen + PYTHONPATH=$(srcdir)/Tools/peg_generator $(PYTHON_FOR_REGEN) -m pegen.keywordgen \ + $(srcdir)/Grammar/python.gram \ $(srcdir)/Grammar/Tokens \ $(srcdir)/Lib/keyword.py.new $(UPDATE_FILE) $(srcdir)/Lib/keyword.py $(srcdir)/Lib/keyword.py.new @@ -970,7 +1021,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/bltinmodule.h \ $(srcdir)/Include/boolobject.h \ $(srcdir)/Include/bytearrayobject.h \ - $(srcdir)/Include/bytes_methods.h \ $(srcdir)/Include/bytesobject.h \ $(srcdir)/Include/cellobject.h \ $(srcdir)/Include/ceval.h \ @@ -982,7 +1032,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/context.h \ $(srcdir)/Include/descrobject.h \ $(srcdir)/Include/dictobject.h \ - $(srcdir)/Include/dtoa.h \ $(srcdir)/Include/dynamic_annotations.h \ $(srcdir)/Include/enumobject.h \ $(srcdir)/Include/errcode.h \ @@ -1022,6 +1071,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/pydtrace.h \ $(srcdir)/Include/pyerrors.h \ $(srcdir)/Include/pyfpe.h \ + $(srcdir)/Include/pyframe.h \ $(srcdir)/Include/pyhash.h \ $(srcdir)/Include/pylifecycle.h \ $(srcdir)/Include/pymacconfig.h \ @@ -1057,10 +1107,18 @@ PYTHON_HEADERS= \ $(srcdir)/Include/Python-ast.h \ \ $(srcdir)/Include/cpython/abstract.h \ + $(srcdir)/Include/cpython/bytearrayobject.h \ + $(srcdir)/Include/cpython/bytesobject.h \ + $(srcdir)/Include/cpython/ceval.h \ + $(srcdir)/Include/cpython/code.h \ $(srcdir)/Include/cpython/dictobject.h \ $(srcdir)/Include/cpython/fileobject.h \ + $(srcdir)/Include/cpython/fileutils.h \ + $(srcdir)/Include/cpython/import.h \ $(srcdir)/Include/cpython/initconfig.h \ $(srcdir)/Include/cpython/interpreteridobject.h \ + $(srcdir)/Include/cpython/listobject.h \ + $(srcdir)/Include/cpython/methodobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ $(srcdir)/Include/cpython/pyerrors.h \ @@ -1072,17 +1130,25 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/tupleobject.h \ $(srcdir)/Include/cpython/unicodeobject.h \ \ + $(srcdir)/Include/internal/pycore_abstract.h \ $(srcdir)/Include/internal/pycore_accu.h \ $(srcdir)/Include/internal/pycore_atomic.h \ + $(srcdir)/Include/internal/pycore_byteswap.h \ + $(srcdir)/Include/internal/pycore_bytes_methods.h \ + $(srcdir)/Include/internal/pycore_call.h \ $(srcdir)/Include/internal/pycore_ceval.h \ $(srcdir)/Include/internal/pycore_code.h \ $(srcdir)/Include/internal/pycore_condvar.h \ $(srcdir)/Include/internal/pycore_context.h \ + $(srcdir)/Include/internal/pycore_dtoa.h \ $(srcdir)/Include/internal/pycore_fileutils.h \ $(srcdir)/Include/internal/pycore_getopt.h \ $(srcdir)/Include/internal/pycore_gil.h \ $(srcdir)/Include/internal/pycore_hamt.h \ + $(srcdir)/Include/internal/pycore_hashtable.h \ + $(srcdir)/Include/internal/pycore_import.h \ $(srcdir)/Include/internal/pycore_initconfig.h \ + $(srcdir)/Include/internal/pycore_interp.h \ $(srcdir)/Include/internal/pycore_object.h \ $(srcdir)/Include/internal/pycore_pathconfig.h \ $(srcdir)/Include/internal/pycore_pyerrors.h \ @@ -1090,6 +1156,8 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_pylifecycle.h \ $(srcdir)/Include/internal/pycore_pymem.h \ $(srcdir)/Include/internal/pycore_pystate.h \ + $(srcdir)/Include/internal/pycore_runtime.h \ + $(srcdir)/Include/internal/pycore_sysmodule.h \ $(srcdir)/Include/internal/pycore_traceback.h \ $(srcdir)/Include/internal/pycore_tupleobject.h \ $(srcdir)/Include/internal/pycore_warnings.h \ @@ -1332,6 +1400,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ test/test_import/data/circular_imports/subpkg \ test/test_import/data/package \ test/test_import/data/package2 \ + test/test_import/data/unwritable \ importlib \ importlib/metadata \ test/test_importlib \ @@ -1372,6 +1441,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ test/test_importlib/source \ test/test_importlib/zipdata01 \ test/test_importlib/zipdata02 \ + test/test_zoneinfo test/test_zoneinfo/data \ test/ziptestdata \ asyncio \ test/test_asyncio \ @@ -1387,12 +1457,14 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ ctypes ctypes/test ctypes/macholib \ idlelib idlelib/Icons idlelib/idle_test \ distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \ + test/test_peg_generator \ test/test_tools test/test_warnings test/test_warnings/data \ turtledemo \ multiprocessing multiprocessing/dummy \ unittest unittest/test unittest/test/testmock \ venv venv/scripts venv/scripts/common venv/scripts/posix \ - curses pydoc_data + curses pydoc_data \ + zoneinfo libinstall: build_all $(srcdir)/Modules/xxmodule.c @for i in $(SCRIPTDIR) $(LIBDEST); \ do \ @@ -1435,6 +1507,7 @@ libinstall: build_all $(srcdir)/Modules/xxmodule.c *CVS) ;; \ *.py[co]) ;; \ *.orig) ;; \ + *wininst-*.exe) ;; \ *~) ;; \ *) \ if test -d $$i; then continue; fi; \ @@ -1753,10 +1826,13 @@ docclean: -rm -rf Doc/build -rm -rf Doc/tools/sphinx Doc/tools/pygments Doc/tools/docutils -clean: pycremoval +# like the 'clean' target but retain the profile guided optimization (PGO) +# data. The PGO data is only valid if source code remains unchanged. +clean-retain-profile: pycremoval find . -name '*.[oa]' -exec rm -f {} ';' find . -name '*.s[ol]' -exec rm -f {} ';' find . -name '*.so.[0-9]*.[0-9]*' -exec rm -f {} ';' + find . -name '*.lst' -exec rm -f {} ';' find build -name 'fficonfig.h' -exec rm -f {} ';' || true find build -name '*.py' -exec rm -f {} ';' || true find build -name '*.py[co]' -exec rm -f {} ';' || true @@ -1775,14 +1851,19 @@ profile-removal: rm -rf $(COVERAGE_REPORT) rm -f profile-run-stamp -clobber: clean profile-removal +clean: clean-retain-profile + @if test @DEF_MAKE_ALL_RULE@ = profile-opt; then \ + rm -f profile-gen-stamp profile-clean-stamp; \ + $(MAKE) profile-removal; \ + fi + +clobber: clean -rm -f $(BUILDPYTHON) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ tags TAGS \ config.cache config.log pyconfig.h Modules/config.c -rm -rf build platform -rm -rf $(PYTHONFRAMEWORKDIR) -rm -f python-config.py python-config - -rm -f profile-gen-stamp profile-clean-stamp # Make things extra clean, before making a distribution: # remove all generated files, even Makefile[.pre] @@ -1856,6 +1937,8 @@ Python/thread.o: @THREADHEADERS@ $(srcdir)/Python/condvar.h .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools .PHONY: frameworkaltinstallunixtools recheck clean clobber distclean .PHONY: smelly funny patchcheck touch altmaninstall commoninstall +.PHONY: clean-retain-profile profile-removal run_profile_task +.PHONY: build_all_generate_profile build_all_merge_profile .PHONY: gdbhooks # IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/Misc/ACKS b/Misc/ACKS index 8d355da8..a16f15a7 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -12,6 +12,7 @@ PS: In the standard Python distribution, this file is encoded in UTF-8 and the list is in rough alphabetical order by last names. Aahz +Erlend Egeberg Aasland Edison Abahurire Michael Abbott Rajiv Abraham @@ -23,6 +24,7 @@ Eitan Adler Anton Afanasyev Ali Afshar Nitika Agarwal +Anjani Agrawal Pablo S. Blum de Aguiar Jim Ahlstrom Farhan Ahmad @@ -45,6 +47,7 @@ Rose Ames A. Amoroso Mark Anacker Shashwat Anand +Ananthakrishnan Anders Andersen Tycho Andersen John Anderson @@ -84,8 +87,10 @@ Marcin Bachry Alfonso Baciero Dwayne Bailey Stig Bakken +Lumír Balhar Aleksandr Balezin Greg Ball +Lewis Ball Luigi Ballabio Thomas Ballinger Jeff Balogh @@ -232,6 +237,7 @@ Floris Bruynooghe Matt Bryant Stan Bubrouski Brandt Bucher +Curtis Bucher Colm Buckley Erik de Bueger Jan-Hein Bührman @@ -239,6 +245,7 @@ Lars Buitinck Dick Bulterman Bill Bumgarner Jimmy Burgett +Charles Burkland Edmond Burnett Tommy Burnette Roger Burnham @@ -257,6 +264,7 @@ Ben Caller Arnaud Calmettes Daniel Calvelo Tony Campbell +Giovanni Cappellotto Brett Cannon Tristan Carel Mike Carlton @@ -285,6 +293,7 @@ Brad Chapman Greg Chapman Mitch Chapman Matt Chaput +William Chargin Yogesh Chaudhari David Chaum Nicolas Chauvat @@ -309,6 +318,7 @@ Gilles Civario Chris Clark Diana Clarke Laurie Clark-Michalek +Alexander Clarkson Mike Clarkson Andrew Clegg Brad Clements @@ -324,6 +334,7 @@ Benjamin Collar Jeffery Collins Robert Collins Paul Colomiets +Samuel Colvin Christophe Combelles Geremy Condra Denver Coneybeare @@ -363,8 +374,8 @@ Tom Culliton Raúl Cumplido Antonio Cuni Brian Curtin -Hakan Celik Jason Curtis +Hakan Celik Paul Dagnelie Lisandro Dalcin Darren Dale @@ -449,6 +460,7 @@ Rodolpho Eckhardt Ulrich Eckhardt David Edelsohn John Edmonds +Benjamin Edwards Grant Edwards Zvi Effron John Ehresman @@ -467,6 +479,7 @@ Tom Epperly Gökcen Eraslan Stoffel Erasmus Jürgen A. Erhard +Florian Ernst Michael Ernst Ben Escoto Andy Eskilsson @@ -508,6 +521,7 @@ Tomer Filiba Segev Finer Jeffrey Finkelstein Russell Finn +Neal Finne Dan Finnie Nils Fischbeck Frederik Fix @@ -555,11 +569,13 @@ Riccardo Attilio Galli Raymund Galvin Nitin Ganatra Fred Gansevles +Paul Ganssle Lars Marius Garshol Jake Garver Dan Gass Tim Gates Andrew Gaul +Lewis Gaul Matthieu Gautier Stephen M. Gava Xavier de Gaye @@ -643,6 +659,7 @@ Mark Hammond Harald Hanche-Olsen Manus Hand Milton L. Hankins +Carl Bordum Hansen Stephen Hansen Barry Hantman Lynda Hardman @@ -653,6 +670,7 @@ David Harrigan Brian Harring Jonathan Hartley Travis B. Hartwell +Henrik Harutyunyan Shane Harvey Larry Hastings Tim Hatch @@ -660,6 +678,7 @@ Zac Hatfield-Dodds Shane Hathaway Michael Haubenwallner Janko Hauser +Flavian Hautbois Rycharde Hawkes Ben Hayden Jochen Hayek @@ -721,6 +740,7 @@ Rob Hooft Michiel de Hoon Brian Hooper Randall Hopper +Tim Hopper Nadav Horesh Alon Horev Jan Hosang @@ -739,6 +759,7 @@ Lawrence Hudson Michael Hudson Jim Hugunin Greg Humphreys +Chris Hunt Eric Huss Nehal Hussain Taihyun Hwang @@ -747,6 +768,7 @@ Ludwig Hähne Gerhard Häring Fredrik Håård Florian Höch +Oleg Höfling Robert Hölzl Catalin Iacob Mihai Ibanescu @@ -839,6 +861,7 @@ Dmitry Kazakov Brian Kearns Sebastien Keim Ryan Kelly +Hugo van Kemenade Dan Kenigsberg Randall Kern Robert Kern @@ -851,6 +874,7 @@ Dhiru Kholia Artem Khramov Akshit Khurana Sanyam Khurana +Tyler Kieft Mads Kiilerich Jason Killen Jan Kim @@ -993,6 +1017,7 @@ Robert Li Xuanji Li Zekun Li Zheao Li +Dan Lidral-Porter Robert van Liere Ross Light Shawn Ligocki @@ -1101,6 +1126,7 @@ Ezio Melotti Doug Mennella Dimitri Merejkowsky Brian Merrell +Bruce Merry Alexis Métaireau Luke Mewburn Carl Meyer @@ -1215,10 +1241,12 @@ Elena Oat Jon Oberheide Milan Oberkirch Pascal Oberndoerfer +Géry Ogam Jeffrey Ollie Adam Olsen Bryan Olson Grant Olson +Furkan Onder Koray Oner Ethan Onstott Piet van Oostrum @@ -1419,6 +1447,7 @@ Mike Romberg Armin Ronacher Case Roole Timothy Roscoe +Joel Rosdahl Erik Rose Mark Roseman Josh Rosenberg @@ -1507,6 +1536,7 @@ Steven Scott Nick Seidenman Michael Seifert Žiga Seilnacht +Jendrik Seipp Michael Selik Yury Selivanov Fred Sells @@ -1555,6 +1585,7 @@ Kirill Simonov Nathan Paul Simons Guilherme Simões Adam Simpkins +Karthikeyan Singaravelan Mandeep Singh Ravi Sinha Janne Sinkkonen @@ -1565,6 +1596,7 @@ J. Sipprell Ngalim Siregar Kragen Sitaker Kaartic Sivaraam +Roman Skurikhin Ville Skyttä Michael Sloan Nick Sloan @@ -1602,6 +1634,7 @@ Tage Stabell-Kulo Quentin Stafford-Fraser Frank Stajano Joel Stanley +Kyle Stanley Anthony Starks David Steele Oliver Steele @@ -1638,6 +1671,7 @@ Hisao Suzuki Kalle Svensson Andrew Svetlov Paul Swartz +Dennis Sweeney Al Sweigart Sviatoslav Sydorenko Thenault Sylvain @@ -1660,6 +1694,7 @@ William Tanksley Christian Tanzer Steven Taschuk Batuhan Taskaya +Stefan Tatschner Amy Taylor Julian Taylor Monty Taylor @@ -1731,6 +1766,7 @@ Roger Upole Daniel Urban Michael Urman Hector Urtubia +Elizabeth Uselton Lukas Vacek Ville Vainio Yann Vaginay @@ -1795,6 +1831,7 @@ Steve Weber Corran Webster Glyn Webster Phil Webster +Antoine Wecxsteen Stefan Wehr Zack Weinberg Bob Weiner @@ -1806,6 +1843,7 @@ Jeff Wheeler Christopher White David White Mats Wichmann +Pete Wicken Marcel Widjaja Truida Wiedijk Felix Wiemann @@ -1829,6 +1867,7 @@ Alex Willmer David Wilson Geoff Wilson Greg V. Wilson +Huon Wilson J Derek Wilson Paul Winkler Jody Winston @@ -1849,6 +1888,7 @@ Klaus-Juergen Wolf Dan Wolfe Richard Wolff Adam Woodbeck +William Woodruff Steven Work Gordon Worley Darren Worrall @@ -1872,6 +1912,7 @@ EungJun Yi Bob Yodlowski Danny Yoo Wonsup Yoon +Andrew York Rory Yorke George Yoshida Kazuhiro Yoshida @@ -1897,5 +1938,6 @@ Jelle Zijlstra Gennadiy Zlobin Doug Zongker Peter Åstrand +Vlad Emelianov (Entries should be added in rough alphabetical order by last names) diff --git a/Misc/HISTORY b/Misc/HISTORY index fa5a05fd..32b2a378 100644 --- a/Misc/HISTORY +++ b/Misc/HISTORY @@ -2113,7 +2113,7 @@ Build - Issue #21285: Refactor and fix curses configure check to always search in a ncursesw directory. -- Issue #15234: For BerkelyDB and Sqlite, only add the found library and +- Issue #15234: For BerkeleyDB and Sqlite, only add the found library and include directories if they aren't already being searched. This avoids an explicit runtime library dependency. diff --git a/Misc/NEWS b/Misc/NEWS index 6e94ca3e..81da2bed 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,101 +2,102 @@ Python News +++++++++++ -What's New in Python 3.8.6 final? +What's New in Python 3.9.0 final? ================================= -*Release date: 2020-09-23* - -Core and Builtins ------------------ - -- bpo-41525: The output of ``python --help`` contains now only ASCII - characters. +*Release date: 2020-10-04* Library ------- -- bpo-41817: fix `tkinter.EventType` Enum so all members are strings, and - none are tuples - - bpo-41815: Fix SQLite3 segfault when backing up closed database. Patch contributed by Peter David McCormick. -- bpo-41517: fix bug allowing Enums to be extended via multiple inheritance - -- bpo-39587: use the correct mix-in data type when constructing Enums - -- bpo-41789: Honor `object` overrides in `Enum` class creation - (specifically, `__str__`, `__repr__`, `__format__`, and `__reduce_ex__`). - -- bpo-39651: Fix a race condition in the ``call_soon_threadsafe()`` method - of ``asyncio.ProactorEventLoop``: do nothing if the self-pipe socket has - been closed. +- bpo-41662: No longer override exceptions raised in ``__len__()`` of a + sequence of parameters in :mod:`sqlite3` with + :exc:`~sqlite3.ProgrammingError`. -- bpo-41720: Fixed :meth:`turtle.Vec2D.__rmul__` for arguments which are not - int or float. +- bpo-41662: Fixed crash when mutate list of parameters during iteration in + :mod:`sqlite3`. - bpo-39728: fix default `_missing_` so a duplicate `ValueError` is not set as the `__context__` of the original `ValueError` -- bpo-37479: When `Enum.__str__` is overridden in a derived class, the - override will be used by `Enum.__format__` regardless of whether mixin - classes are present. - -Documentation -------------- - -- bpo-35293: Fix RemovedInSphinx40Warning when building the documentation. - Patch by Dong-hee Na. - -- bpo-37149: Change Shipman tkinter doc link from archive.org to TkDocs. - (The doc has been removed from the NMT server.) The new link responds - much faster and includes a short explanatory note. - Tests ----- -- bpo-41731: Make test_cmd_line_script pass with option '-vv'. - -Windows -------- - -- bpo-41744: Fixes automatic import of props file when using the Nuget - package. - -IDLE ----- +- bpo-41602: Add tests for SIGINT handling in the runpy module. -- bpo-35764: Rewrite the Calltips doc section. +Build +----- -- bpo-40181: In calltips, stop reminding that '/' marks the end of - positional-only arguments. +- bpo-38249: Update :c:macro:`Py_UNREACHABLE` to use __builtin_unreachable() + if only the compiler is able to use it. Patch by Dong-hee Na. -What's New in Python 3.8.6 release candidate 1? +What's New in Python 3.9.0 release candidate 2? =============================================== -*Release date: 2020-09-07* +*Release date: 2020-09-16* Core and Builtins ----------------- +- bpo-41780: Fix :meth:`__dir__` of :class:`types.GenericAlias`. Patch by + Batuhan Taskaya. + +- bpo-41690: Fix a possible stack overflow in the parser when parsing + functions and classes with a huge ammount of arguments. Patch by Pablo + Galindo. + +- bpo-41681: Fixes the wrong error description in the error raised by using + 2 `,` in format string in f-string and :meth:`str.format`. + - bpo-41654: Fix a crash that occurred when destroying subclasses of :class:`MemoryError`. Patch by Pablo Galindo. +- bpo-41631: The ``_ast`` module uses again a global state. Using a module + state per module instance is causing subtle practical problems. For + example, the Mercurial project replaces the ``__import__()`` function to + implement lazy import, whereas Python expected that ``import _ast`` always + return a fully initialized ``_ast`` module. + - bpo-41533: Free the stack allocated in ``va_build_stack`` if ``do_mkstack`` fails and the stack is not a ``small_stack``. -- bpo-38156: Handle interrupts that come after EOF correctly in - ``PyOS_StdioReadline``. +- bpo-41531: Fix a bug that was dropping keys when compiling dict literals + with more than 0xFFFF elements. Patch by Pablo Galindo. + +- bpo-41525: The output of ``python --help`` contains now only ASCII + characters. + +- bpo-29590: Make the stack trace correct after calling + :meth:`generator.throw` on a generator that has yielded from a ``yield + from``. Library ------- +- bpo-41517: fix bug allowing Enums to be extended via multiple inheritance + +- bpo-39587: use the correct mix-in data type when constructing Enums + +- bpo-41789: Honor `object` overrides in `Enum` class creation + (specifically, `__str__`, `__repr__`, `__format__`, and `__reduce_ex__`). + +- bpo-39651: Fix a race condition in the ``call_soon_threadsafe()`` method + of ``asyncio.ProactorEventLoop``: do nothing if the self-pipe socket has + been closed. + +- bpo-41720: Fixed :meth:`turtle.Vec2D.__rmul__` for arguments which are not + int or float. + - bpo-41696: Fix handling of debug mode in :func:`asyncio.run`. This allows setting ``PYTHONASYNCIODEBUG`` or ``-X dev`` to enable asyncio debug mode when using :func:`asyncio.run`. +- bpo-41687: Fix implementation of sendfile to be compatible with Solaris. + - bpo-39010: Restarting a ``ProactorEventLoop`` on Windows no longer logs spurious ``ConnectionResetErrors``. @@ -120,30 +121,11 @@ Library - bpo-41503: Fixed a race between setTarget and flush in logging.handlers.MemoryHandler. -- bpo-41497: Fix potential UnicodeDecodeError in dis module. - -- bpo-41490: Update :mod:`ensurepip` to install pip 20.2.1 and setuptools - 49.2.1. - -- bpo-41467: On Windows, fix asyncio ``recv_into()`` return value when the - socket/pipe is closed (:exc:`BrokenPipeError`): return ``0`` rather than - an empty byte string (``b''``). - -- bpo-41425: Make tkinter doc example runnable. - -- bpo-41384: Raise TclError instead of TypeError when an unknown option is - passed to tkinter.OptionMenu. - -- bpo-38731: Fix :exc:`NameError` in command-line interface of - :mod:`py_compile`. - -- bpo-41364: Reduce import overhead of :mod:`uuid`. - - bpo-41344: Prevent creating :class:`shared_memory.SharedMemory` objects with :code:`size=0`. -- bpo-40726: Handle cases where the ``end_lineno`` is ``None`` on - :func:`ast.increment_lineno`. +- bpo-41025: Fixed an issue preventing the C implementation of + :class:`zoneinfo.ZoneInfo` from being subclassed. - bpo-31122: ssl.wrap_socket() now raises ssl.SSLEOFError rather than OSError when peer closes connection during TLS negotiation @@ -154,38 +136,39 @@ Library Documentation ------------- +- bpo-37149: Change Shipman tkinter doc link from archive.org to TkDocs. + (The doc has been removed from the NMT server.) The new link responds + much faster and includes a short explanatory note. + - bpo-41624: Fix the signature of :class:`typing.Coroutine`. - bpo-40204: Enable Sphinx 3.2 ``c_allow_pre_v3`` option and disable ``c_warn_on_allowed_pre_v3`` option to make the documentation compatible with Sphinx 2 and Sphinx 3. -- bpo-41045: Add documentation for debug feature of f-strings. - -- bpo-41314: Changed the release when ``from __future__ import annotations`` - becomes the default from ``4.0`` to ``3.10`` (following a change in PEP - 563). +- bpo-40979: Refactored typing.rst, arranging more than 70 classes, + functions, and decorators into new sub-sections. - bpo-39883: Make code, examples, and recipes in the Python documentation be licensed under the more permissive BSD0 license in addition to the existing Python 2.0 license. -Windows -------- +Tests +----- -- bpo-41492: Fixes the description that appears in UAC prompts. +- bpo-41731: Make test_cmd_line_script pass with option '-vv'. -- bpo-40741: Update Windows release to include SQLite 3.32.3. +Build +----- -IDLE ----- +- bpo-41617: Fix ``pycore_byteswap.h`` header file to support old clang + versions: ``__builtin_bswap16()`` is not available in LLVM clang 3.0. -- bpo-41468: Improve IDLE run crash error message (which users should never - see). +Windows +------- -- bpo-41373: Save files loaded with no line ending, as when blank, or - different line endings, by setting its line ending to the system default. - Fix regression in 3.8.4 and 3.9.0b4. +- bpo-41526: Fixed layout of final page of the installer by removing the + special thanks to Mark Hammond (with his permission). C API ----- @@ -194,84 +177,121 @@ C API pointers beyond the end of a string. -What's New in Python 3.8.5 final? -================================= - -*Release date: 2020-07-20* - -Security --------- - -- bpo-41304: Fixes `python3x._pth` being ignored on Windows, caused by the - fix for :issue:`29778` (CVE-2020-15801). +What's New in Python 3.9.0 release candidate 1? +=============================================== -- bpo-39603: Prevent http header injection by rejecting control characters - in http.client.putrequest(...). +*Release date: 2020-08-11* Core and Builtins ----------------- -- bpo-41295: Resolve a regression in CPython 3.8.4 where defining - "__setattr__" in a multi-inheritance setup and calling up the hierarchy - chain could fail if builtins/extension types were involved in the base - types. +- bpo-38156: Handle interrupts that come after EOF correctly in + ``PyOS_StdioReadline``. Library ------- -- bpo-41288: Unpickling invalid NEWOBJ_EX opcode with the C implementation - raises now UnpicklingError instead of crashing. +- bpo-41497: Fix potential UnicodeDecodeError in dis module. -- bpo-39017: Avoid infinite loop when reading specially crafted TAR files - using the tarfile module (CVE-2019-20907). +- bpo-41490: Update :mod:`ensurepip` to install pip 20.2.1 and setuptools + 49.2.1. + +- bpo-41467: On Windows, fix asyncio ``recv_into()`` return value when the + socket/pipe is closed (:exc:`BrokenPipeError`): return ``0`` rather than + an empty byte string (``b''``). + +- bpo-41425: Make tkinter doc example runnable. + +- bpo-41384: Raise TclError instead of TypeError when an unknown option is + passed to tkinter.OptionMenu. + +- bpo-38731: Fix :exc:`NameError` in command-line interface of + :mod:`py_compile`. + +- bpo-41317: Use add_done_callback() in asyncio.loop.sock_accept() to + unsubscribe reader early on cancellation. + +- bpo-41364: Reduce import overhead of :mod:`uuid`. + +- bpo-41341: Recursive evaluation of `typing.ForwardRef` in + `get_type_hints`. + +- bpo-41182: selector: use DefaultSelector based upon implementation + +- bpo-40726: Handle cases where the ``end_lineno`` is ``None`` on + :func:`ast.increment_lineno`. Documentation ------------- -- bpo-37703: Updated Documentation to comprehensively elaborate on the - behaviour of gather.cancel() +- bpo-41045: Add documentation for debug feature of f-strings. -Build ------ +- bpo-41314: Changed the release when ``from __future__ import annotations`` + becomes the default from ``4.0`` to ``3.10`` (following a change in PEP + 563). -- bpo-41302: Enable building Python 3.8 with libmpdec-2.5.0 to ease - maintenance for Linux distributions. Patch by Felix Yan. +Windows +------- -macOS ------ +- bpo-41492: Fixes the description that appears in UAC prompts. -- bpo-40741: Update macOS installer to use SQLite 3.32.3. +- bpo-40948: Improve post-install message to direct people to the "py" + command. + +- bpo-41412: The installer will now fail to install on Windows 7 and Windows + 8. Further, the UCRT dependency is now always downloaded on demand. + +- bpo-40741: Update Windows release to include SQLite 3.32.3. IDLE ---- -- bpo-41300: Save files with non-ascii chars. Fix regression released in - 3.9.0b4 and 3.8.4. +- bpo-41468: Improve IDLE run crash error message (which users should never + see). +- bpo-41373: Save files loaded with no line ending, as when blank, or + different line endings, by setting its line ending to the system default. + Fix regression in 3.8.4 and 3.9.0b4. -What's New in Python 3.8.4 final? -================================= -*Release date: 2020-07-13* +What's New in Python 3.9.0 beta 5? +================================== + +*Release date: 2020-07-20* Security -------- +- bpo-41304: Fixes `python3x._pth` being ignored on Windows, caused by the + fix for :issue:`29778` (CVE-2020-15801). + - bpo-41162: Audit hooks are now cleared later during finalization to avoid missing events. - bpo-29778: Ensure :file:`python3.dll` is loaded from correct locations when Python is embedded (CVE-2020-15523). +- bpo-39603: Prevent http header injection by rejecting control characters + in http.client.putrequest(...). + Core and Builtins ----------------- +- bpo-41295: Resolve a regression in CPython 3.8.4 where defining + "__setattr__" in a multi-inheritance setup and calling up the hierarchy + chain could fail if builtins/extension types were involved in the base + types. + - bpo-41247: Always cache the running loop holder when running ``asyncio.set_running_loop``. - bpo-41252: Fix incorrect refcounting in _ssl.c's ``_servername_callback()``. +- bpo-41215: Use non-NULL default values in the PEG parser keyword list to + overcome a bug that was preventing Python from being properly compiled + when using the XLC compiler. Patch by Pablo Galindo. + - bpo-41218: Python 3.8.3 had a regression where compiling with ast.PyCF_ALLOW_TOP_LEVEL_AWAIT would aggressively mark list comprehension with CO_COROUTINE. Now only list comprehension making use of async/await @@ -287,34 +307,59 @@ Core and Builtins Library ------- +- bpo-41288: Unpickling invalid NEWOBJ_EX opcode with the C implementation + raises now UnpicklingError instead of crashing. + +- bpo-39017: Avoid infinite loop when reading specially crafted TAR files + using the tarfile module (CVE-2019-20907). + - bpo-41235: Fix the error handling in :meth:`ssl.SSLContext.load_dh_params`. -- bpo-41193: The ``write_history()`` atexit function of the readline - completer now ignores any :exc:`OSError` to ignore error if the filesystem - is read-only, instead of only ignoring :exc:`FileNotFoundError` and - :exc:`PermissionError`. +- bpo-41207: In distutils.spawn, restore expectation that DistutilsExecError + is raised when the command is not found. -- bpo-41043: Fixed the use of :func:`~glob.glob` in the stdlib: literal part - of the path is now always correctly escaped. +- bpo-39168: Remove the ``__new__`` method of :class:`typing.Generic`. + +- bpo-41194: Fix a crash in the ``_ast`` module: it can no longer be loaded + more than once. It now uses a global state rather than a module state. - bpo-39384: Fixed email.contentmanager to allow set_content() to set a null string. +Documentation +------------- + +- bpo-37703: Updated Documentation to comprehensively elaborate on the + behaviour of gather.cancel() + +macOS +----- + +- bpo-40741: Update macOS installer to use SQLite 3.32.3. + IDLE ---- +- bpo-41300: Save files with non-ascii chars. Fix regression released in + 3.9.0b4 and 3.8.4. + - bpo-37765: Add keywords to module name completion list. Rewrite Completions section of IDLE doc. -- bpo-41152: The encoding of ``stdin``, ``stdout`` and ``stderr`` in IDLE is - now always UTF-8. +C API +----- +- bpo-40170: Revert :c:func:`PyType_HasFeature` change: it reads again + directly the :c:member:`PyTypeObject.tp_flags` member when the limited C + API is not used, rather than always calling :c:func:`PyType_GetFlags` + which hides implementation details. -What's New in Python 3.8.4 release candidate 1? -=============================================== -*Release date: 2020-06-29* +What's New in Python 3.9.0 beta 4? +================================== + +*Release date: 2020-07-02* Security -------- @@ -325,44 +370,78 @@ Security fix uses hash() to generate hash values for the tuple of (address, mask length, network address). -- bpo-39073: Disallow CR or LF in email.headerregistry.Address arguments to - guard against header injection attacks. - Core and Builtins ----------------- - bpo-41094: Fix decoding errors with audit when open files with non-ASCII names on non-UTF-8 locale. +- bpo-41084: Prefix the error message with 'f-string: ', when parsing an + f-string expression which throws a :exc:`SyntaxError`. + +- bpo-41076: Pre-feed the parser with the location of the f-string + expression, not the f-string itself, which allows us to skip the shifting + of the AST node locations after the parsing is completed. + +- bpo-40939: Deprecate :c:func:`PyNode_Compile`. + - bpo-41056: Fixes a reference to deallocated stack space during startup when constructing sys.path involving a relative symlink when code was supplied via -c. (discovered via Coverity) +- bpo-41061: Fix incorrect expressions and asserts in hashtable code and + tests. + +- bpo-41052: Opt out serialization/deserialization for _random.Random + +- bpo-40939: Deprecate :c:func:`PyParser_SimpleParseStringFlags`, + :c:func:`PyParser_SimpleParseStringFlagsFilename` and + :c:func:`PyParser_SimpleParseFileFlags`. + - bpo-35975: Stefan Behnel reported that cf_feature_version is used even when PyCF_ONLY_AST is not set. This is against the intention and against the documented behavior, so it's been fixed. +- bpo-40985: Fix a bug that caused the :exc:`SyntaxError` text to be empty + when a file ends with a line ending in a line continuation character (i.e. + backslash). The error text should contain the text of the last line. + +- bpo-40958: Fix a possible buffer overflow in the PEG parser when gathering + information for emitting syntax errors. Patch by Pablo Galindo. + - bpo-40957: Fix refleak in _Py_fopen_obj() when PySys_Audit() fails -- bpo-40870: Raise :exc:`ValueError` when validating custom AST's where the - constants ``True``, ``False`` and ``None`` are used within a - :class:`ast.Name` node. +- bpo-40947: The Python :ref:`Path Configuration ` now + takes :c:member:`PyConfig.platlibdir` in account. -- bpo-40826: Fix GIL usage in :c:func:`PyOS_Readline`: lock the GIL to set - an exception and pass the Python thread state when checking if there is a - pending signal. +- bpo-40847: Fix a bug where a line with only a line continuation character + is not considered a blank line at tokenizer level. In such cases, more + than a single `NEWLINE` token was emitted. The old parser was working + around the issue, but the new parser threw a :exc:`SyntaxError` for valid + input due to this. For example, an empty line following a line + continuation character was interpreted as a :exc:`SyntaxError`. - bpo-40824: Unexpected errors in calling the ``__iter__`` method are no longer masked by ``TypeError`` in the :keyword:`in` operator and functions :func:`~operator.contains`, :func:`~operator.indexOf` and :func:`~operator.countOf` of the :mod:`operator` module. -- bpo-40663: Correctly generate annotations where parentheses are omitted - but required (e.g: ``Type[(str, int, *other))]``. +- bpo-19569: Add the private macros ``_Py_COMP_DIAG_PUSH``, + ``_Py_COMP_DIAG_IGNORE_DEPR_DECLS``, and ``_Py_COMP_DIAG_POP``. Library ------- +- bpo-41193: The ``write_history()`` atexit function of the readline + completer now ignores any :exc:`OSError` to ignore error if the filesystem + is read-only, instead of only ignoring :exc:`FileNotFoundError` and + :exc:`PermissionError`. + +- bpo-41161: The decimal module now requires libmpdec-2.5.0. Users of + --with-system-libmpdec should update their system library. + +- bpo-40874: The decimal module now requires libmpdec-2.5.0. + - bpo-41138: Fixed the :mod:`trace` module CLI for Python source files with non-UTF-8 encoding. @@ -378,82 +457,46 @@ Library - bpo-41056: Fix a NULL pointer dereference within the ssl module during a MemoryError in the keylog callback. (discovered by Coverity) +- bpo-41056: Fixed an instance where a MemoryError within the zoneinfo + module might not be reported or not reported at its source. (found by + Coverity) + - bpo-41048: :func:`mimetypes.read_mime_types` function reads the rule file using UTF-8 encoding, not the locale encoding. Patch by Srinivas Reddy Thatiparthy. +- bpo-41043: Fixed the use of :func:`~glob.glob` in the stdlib: literal part + of the path is now always correctly escaped. + - bpo-40448: :mod:`ensurepip` now disables the use of `pip` cache when installing the bundled versions of `pip` and `setuptools`. Patch by Krzysztof Konopko. +- bpo-40967: Removed :meth:`asyncio.Task.current_task` and + :meth:`asyncio.Task.all_tasks`. Patch contributed by Rémi Lapeyre. + +- bpo-40955: Fix a minor memory leak in :mod:`subprocess` module when + extra_groups was specified. + - bpo-40855: The standard deviation and variance functions in the statistics module were ignoring their mu and xbar arguments. -- bpo-40807: Stop codeop._maybe_compile, used by code.InteractiveInterpreter - (and IDLE). from from emitting each warning three times. +- bpo-40924: Removed support for loaders implementing .files and supplying + TraversableResources. + +- bpo-40939: Use the new PEG parser when generating the stdlib + :mod:`keyword` module. - bpo-40834: Fix truncate when sending str object with_xxsubinterpreters.channel_send. -- bpo-38488: Update ensurepip to install pip 20.1.1 and setuptools 47.1.0. - -- bpo-40767: :mod:`webbrowser` now properly finds the default browser in - pure Wayland systems by checking the WAYLAND_DISPLAY environment variable. - Patch contributed by Jérémy Attali. - -- bpo-40795: :mod:`ctypes` module: If ctypes fails to convert the result of - a callback or if a ctypes callback function raises an exception, - sys.unraisablehook is now called with an exception set. Previously, the - error was logged into stderr by :c:func:`PyErr_Print`. - -- bpo-30008: Fix :mod:`ssl` code to be compatible with OpenSSL 1.1.x builds - that use ``no-deprecated`` and ``--api=1.1.0``. - -- bpo-40614: :func:`ast.parse` will not parse self documenting expressions - in f-strings when passed ``feature_version`` is less than ``(3, 8)``. - -- bpo-40626: Add h5 file extension as MIME Type application/x-hdf5, as per - HDF Group recommendation for HDF5 formatted data files. Patch contributed - by Mark Schwab. - -- bpo-25872: :mod:`linecache` could crash with a :exc:`KeyError` when - accessed from multiple threads. Fix by Michael Graczyk. - -- bpo-40597: If text content lines are longer than policy.max_line_length, - always use a content-encoding to make sure they are wrapped. - -- bpo-40515: The :mod:`ssl` and :mod:`hashlib` modules now actively check - that OpenSSL is build with thread support. Python 3.7.0 made thread - support mandatory and no longer works safely with a no-thread builds. - -- bpo-13097: ``ctypes`` now raises an ``ArgumentError`` when a callback is - invoked with more than 1024 arguments. - -- bpo-40457: The ssl module now support OpenSSL builds without TLS 1.0 and - 1.1 methods. - -- bpo-39830: Add :class:`zipfile.Path` to ``__all__`` in the :mod:`zipfile` - module. - -- bpo-40025: Raise TypeError when _generate_next_value_ is defined after - members. Patch by Ethan Onstott. - -- bpo-39244: Fixed :class:`multiprocessing.context.get_all_start_methods` to - properly return the default method first on macOS. - -- bpo-39040: Fix parsing of invalid mime headers parameters by collapsing - whitespace between encoded words in a bare-quote-string. - -- bpo-35714: :exc:`struct.error` is now raised if there is a null character - in a :mod:`struct` format string. +- bpo-26407: Unexpected errors in calling the ``__iter__`` method are no + longer masked by ``TypeError`` in :func:`csv.reader`, + :func:`csv.writer.writerow` and :meth:`csv.writer.writerows`. -- bpo-36290: AST nodes are now raising :exc:`TypeError` on conflicting - keyword arguments. Patch contributed by Rémi Lapeyre. +- bpo-38488: Update ensurepip to install pip 20.1.1 and setuptools 47.1.0. -- bpo-29620: :func:`~unittest.TestCase.assertWarns` no longer raises a - ``RuntimeException`` when accessing a module's ``__warningregistry__`` - causes importation of a new module, or when a new module is imported in - another thread. Patch by Kernc. +- bpo-36543: Restored the deprecated :mod:`xml.etree.cElementTree` module. - bpo-34226: Fix `cgi.parse_multipart` without content_length. Patch by Roger Duran @@ -464,6 +507,10 @@ Tests - bpo-41085: Fix integer overflow in the :meth:`array.array.index` method on 64-bit Windows for index larger than ``2**31``. +- bpo-41069: :data:`test.support.TESTFN` and the current directory for tests + when run via ``test.regrtest`` contain now non-ascii characters if + possible. + - bpo-38377: On Linux, skip tests using multiprocessing if the current user cannot create a file in ``/dev/shm/`` directory. Add the :func:`~test.support.skip_if_broken_multiprocessing_synchronize` function @@ -479,9 +526,9 @@ Tests - bpo-40964: Disable remote :mod:`imaplib` tests, host cyrus.andrew.cmu.edu is blocking incoming connections. -- bpo-40055: distutils.tests now saves/restores warnings filters to leave - them unchanged. Importing tests imports docutils which imports - pkg_resources which adds a warnings filter. +- bpo-40927: Fix test_binhex when run twice: it now uses + import_fresh_module() to ensure that it raises DeprecationWarning each + time. - bpo-34401: Make test_gdb properly run on HP-UX. Patch by Michael Osipov. @@ -490,9 +537,6 @@ Build - bpo-40204: Pin Sphinx version to 2.3.1 in ``Doc/Makefile``. -- bpo-40653: Move _dirnameW out of HAVE_SYMLINK to fix a potential compiling - issue. - Windows ------- @@ -502,17 +546,8 @@ Windows - bpo-40164: Updates Windows OpenSSL to 1.1.1g -- bpo-39631: Changes the registered MIME type for ``.py`` files on Windows - to ``text/x-python`` instead of ``text/plain``. - -- bpo-40677: Manually define IO_REPARSE_TAG_APPEXECLINK in case some old - Windows SDK doesn't have it. - -- bpo-40650: Include winsock2.h in pytime.c for timeval. - -- bpo-39148: Add IPv6 support to :mod:`asyncio` datagram endpoints in - ProactorEventLoop. Change the raised exception for unknown address - families to ValueError as it's not coming from Windows API. +- bpo-37556: Extend py.exe help to mention overrides via venv, shebang, + environmental variables & ini files. macOS ----- @@ -529,2412 +564,4307 @@ macOS - bpo-41005: fixed an XDG settings issue not allowing macos to open browser in webbrowser.py -- bpo-40741: Update macOS installer to use SQLite 3.32.2. - IDLE ---- +- bpo-41152: The encoding of ``stdin``, ``stdout`` and ``stderr`` in IDLE is + now always UTF-8. + - bpo-41144: Make Open Module open a special module such as os.path. -- bpo-39885: Make context menu Cut and Copy work again when right-clicking - within a selection. +C API +----- -- bpo-40723: Make test_idle pass when run after import. +- bpo-36346: Mark ``Py_UNICODE_COPY``, ``Py_UNICODE_FILL``, + ``PyUnicode_WSTR_LENGTH``, ``PyUnicode_FromUnicode``, + ``PyUnicode_AsUnicode``, ``_PyUnicode_AsUnicode``, and + ``PyUnicode_AsUnicodeAndSize`` as deprecated in C. Remove + ``Py_UNICODE_MATCH`` which was deprecated and broken since Python 3.3. -Tools/Demos ------------ +- bpo-36020: On Windows, ``#include "pyerrors.h"`` no longer defines + ``snprintf`` and ``vsnprintf`` macros. -- bpo-40479: Update multissltest helper to test with latest OpenSSL 1.0.2, - 1.1.0, 1.1.1, and 3.0.0-alpha. +- bpo-40703: The PyType_FromSpec*() functions no longer overwrite the type's + "__module__" attribute if it is set via "Py_tp_members" or "Py_tp_getset". -- bpo-40163: Fix multissltest tool. OpenSSL has changed download URL for old - releases. The multissltest tool now tries to download from current and old - download URLs. +What's New in Python 3.9.0 beta 3? +================================== -What's New in Python 3.8.3 final? -================================= +*Release date: 2020-06-09* + +Library +------- + +- bpo-40924: `importlib.resources`: Reverted ``TraversableResources`` + implementations from the built-in loaders (SourceFileLoader and + ZipImporter) as it was an incompatible change introduced in 3.9.0 beta 2 + causing through a chain of events for root TLS certificates to be missing. + +Build +----- + +- bpo-40684: ``make install`` now uses the ``PLATLIBDIR`` variable for the + destination ``lib-dynload/`` directory when ``./configure + --with-platlibdir`` is used. -*Release date: 2020-05-13* + +What's New in Python 3.9.0 beta 2? +================================== + +*Release date: 2020-06-08* Core and Builtins ----------------- -- bpo-40527: Fix command line argument parsing: no longer write errors - multiple times into stderr. +- bpo-40904: Fix possible segfault in the new PEG parser when parsing + f-string containing yield statements with no value (:code:`f"{yield}"`). + Patch by Pablo Galindo -- bpo-40417: Fix imp module deprecation warning when PyImport_ReloadModule - is called. Patch by Robert Rouhani. +- bpo-40903: Fixed a possible segfault in the new PEG parser when producing + error messages for invalid assignments of the form :code:`p=p=`. Patch by + Pablo Galindo -- bpo-39562: The constant values of future flags in the :mod:`__future__` - module are updated in order to prevent collision with compiler flags. - Previously ``PyCF_ALLOW_TOP_LEVEL_AWAIT`` was clashing with - ``CO_FUTURE_DIVISION``. +- bpo-40880: Fix invalid memory read in the new parser when checking + newlines in string literals. Patch by Pablo Galindo. -Library -------- +- bpo-40883: Fix memory leak in when parsing f-strings in the new parser. + Patch by Pablo Galindo -- bpo-40559: Fix possible memory leak in the C implementation of - :class:`asyncio.Task`. +- bpo-40870: Raise :exc:`ValueError` when validating custom AST's where the + constants ``True``, ``False`` and ``None`` are used within a + :class:`ast.Name` node. -- bpo-40355: Improve error reporting in :func:`ast.literal_eval` in the - presence of malformed :class:`ast.Dict` nodes instead of silently ignoring - any non-conforming elements. Patch by Curtis Bucher. +- bpo-40854: Allow overriding :data:`sys.platlibdir` via a new + :envvar:`PYTHONPLATLIBDIR` environment variable. -- bpo-40459: :func:`platform.win32_ver` now produces correct *ptype* strings - instead of empty strings. +- bpo-40826: Fix GIL usage in :c:func:`PyOS_Readline`: lock the GIL to set + an exception and pass the Python thread state when checking if there is a + pending signal. -- bpo-40398: :func:`typing.get_args` now always returns an empty tuple for - special generic aliases. +- bpo-40780: Fix a corner case where g-style string formatting of a float + failed to remove trailing zeros. -Documentation -------------- +- bpo-38964: When there's a :exc:`SyntaxError` in the expression part of an + fstring, the filename attribute of the :exc:`SyntaxError` gets correctly + set to the name of the file the fstring resides in. -- bpo-40561: Provide docstrings for webbrowser open functions. +- bpo-40750: Support the "-d" debug flag in the new PEG parser. Patch by + Pablo Galindo -- bpo-39435: Fix an incorrect signature for :func:`pickle.loads` in the docs +- bpo-40217: Instances of types created with + :c:func:`PyType_FromSpecWithBases` will no longer automatically visit + their class object when traversing references in the garbage collector. + The user is expected to manually visit the object's class. Patch by Pablo + Galindo. -Windows -------- +- bpo-40696: Fix a hang that can arise after :meth:`generator.throw` due to + a cycle in the exception context chain. -- bpo-40458: Increase reserved stack space to prevent overflow crash on - Windows. +Library +------- -C API ------ +- bpo-39791: Refresh importlib.metadata from importlib_metadata 1.6.1. -- bpo-40412: Nullify inittab_copy during finalization, preventing future - interpreter initializations in an embedded situation from crashing. Patch - by Gregory Szorc. +- bpo-40807: Stop codeop._maybe_compile, used by code.InteractiveInterpreter + (and IDLE). from from emitting each warning three times. +- bpo-39791: Built-in loaders (SourceFileLoader and ZipImporter) now supply + ``TraversableResources`` implementations for ``ResourceReader``, and the + fallback function has been removed. -What's New in Python 3.8.3 release candidate 1? -=============================================== +- bpo-17005: The topological sort functionality that was introduced + initially in the :mod:`functools` module has been moved to a new + :mod:`graphlib` module to better accommodate the new tools and keep the + original scope of the :mod:`functools` module. Patch by Pablo Galindo -*Release date: 2020-04-29* +- bpo-40777: Initialize PyDateTime_IsoCalendarDateType.tp_base at run-time + to avoid errors on some compilers. -Security --------- +- bpo-40767: :mod:`webbrowser` now properly finds the default browser in + pure Wayland systems by checking the WAYLAND_DISPLAY environment variable. + Patch contributed by Jérémy Attali. -- bpo-40121: Fixes audit events raised on creating a new socket. +- bpo-40791: :func:`hashlib.compare_digest` uses OpenSSL's + ``CRYPTO_memcmp()`` function when OpenSSL is available. -- bpo-38576: Disallow control characters in hostnames in http.client, - addressing CVE-2019-18348. Such potentially malicious header injection - URLs now cause a InvalidURL to be raised. +- bpo-40795: :mod:`ctypes` module: If ctypes fails to convert the result of + a callback or if a ctypes callback function raises an exception, + sys.unraisablehook is now called with an exception set. Previously, the + error was logged into stderr by :c:func:`PyErr_Print`. -- bpo-39503: CVE-2020-8492: The - :class:`~urllib.request.AbstractBasicAuthHandler` class of the - :mod:`urllib.request` module uses an inefficient regular expression which - can be exploited by an attacker to cause a denial of service. Fix the - regex to prevent the catastrophic backtracking. Vulnerability reported by - Ben Caller and Matt Schwager. +- bpo-30008: Fix :mod:`ssl` code to be compatible with OpenSSL 1.1.x builds + that use ``no-deprecated`` and ``--api=1.1.0``. -Core and Builtins ------------------ +- bpo-30064: Fix asyncio ``loop.sock_*`` race condition issue -- bpo-20526: Fix :c:func:`PyThreadState_Clear()`. ``PyThreadState.frame`` is - a borrowed reference, not a strong reference: ``PyThreadState_Clear()`` - must not call ``Py_CLEAR(tstate->frame)``. +- bpo-40759: Deprecate the :mod:`symbol` module. -- bpo-39965: Correctly raise ``SyntaxError`` if *await* is used inside - non-async functions and ``PyCF_ALLOW_TOP_LEVEL_AWAIT`` is set (like in the - asyncio REPL). Patch by Pablo Galindo. +- bpo-40737: Fix possible reference leak for :mod:`sqlite3` initialization. -- bpo-39562: Allow executing asynchronous comprehensions on the top level - when the ``PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag is given. Patch by Batuhan - Taskaya. +- bpo-40698: :mod:`distutils` upload creates SHA2-256 and Blake2b-256 + digests. MD5 digests is skipped if platform blocks MD5. -- bpo-38894: Fix a bug that was causing incomplete results when calling - ``pathlib.Path.glob`` in the presence of symlinks that point to files - where the user does not have read access. Patch by Pablo Galindo and Matt - Wozniski. +- bpo-40695: :mod:`hashlib` no longer falls back to builtin hash + implementations when OpenSSL provides a hash digest and the algorithm is + blocked by security policy. -- bpo-39871: Fix a possible :exc:`SystemError` in - ``math.{atan2,copysign,remainder}()`` when the first argument cannot be - converted to a :class:`float`. Patch by Zachary Spytz. +- bpo-9216: func:`hashlib.new` passed ``usedforsecurity`` to OpenSSL EVP + constructor ``_hashlib.new()``. test_hashlib and test_smtplib handle + strict security policy better. -- bpo-39776: Fix race condition where threads created by PyGILState_Ensure() - could get a duplicate id. +- bpo-40614: :func:`ast.parse` will not parse self documenting expressions + in f-strings when passed ``feature_version`` is less than ``(3, 8)``. - This affects consumers of tstate->id like the contextvar caching - machinery, which could return invalid cached objects under heavy thread - load (observed in embedded scenarios). +- bpo-40671: Prepare ``_hashlib`` for :pep:`489` and use + :c:func:`PyModule_AddType`. -- bpo-39778: Fixed a crash due to incorrect handling of weak references in - ``collections.OrderedDict`` classes. Patch by Pablo Galindo. +- bpo-32309: Added a new :term:`coroutine` :func:`asyncio.to_thread`. It is + mainly used for running IO-bound functions in a separate thread to avoid + blocking the event loop, and essentially works as a high-level version of + :meth:`~asyncio.loop.run_in_executor` that can directly take keyword + arguments. -- bpo-39520: Fix unparsing of ext slices with no items (``foo[:,]``). Patch - by Batuhan Taskaya. +- bpo-40630: Added :func:`tracemalloc.reset_peak` to set the peak size of + traced memory blocks to the current size, to measure the peak of specific + pieces of code. -- bpo-22490: Don't leak environment variable ``__PYVENV_LAUNCHER__`` into - the interpreter session on macOS. +- bpo-13097: ``ctypes`` now raises an ``ArgumentError`` when a callback is + invoked with more than 1024 arguments. -Library -------- +- bpo-23082: Updated the error message and docs of PurePath.relative_to() to + better reflect the function behaviour. -- bpo-40138: Fix the Windows implementation of :func:`os.waitpid` for exit - code larger than ``INT_MAX >> 8``. The exit status is now interpreted as - an unsigned number. +- bpo-39244: Fixed :class:`multiprocessing.context.get_all_start_methods` to + properly return the default method first on macOS. -- bpo-39942: Set "__main__" as the default module name when "__name__" is - missing in :class:`typing.TypeVar`. Patch by Weipeng Hong. +- bpo-39040: Fix parsing of invalid mime headers parameters by collapsing + whitespace between encoded words in a bare-quote-string. -- bpo-40330: In :meth:`ShareableList.__setitem__`, check the size of a new - string item after encoding it to utf-8, not before. +- bpo-35714: :exc:`struct.error` is now raised if there is a null character + in a :mod:`struct` format string. -- bpo-40287: Fixed ``SpooledTemporaryFile.seek()`` to return the position. +- bpo-36290: AST nodes are now raising :exc:`TypeError` on conflicting + keyword arguments. Patch contributed by Rémi Lapeyre. -- bpo-40260: Ensure :mod:`modulefinder` uses :func:`io.open_code` and - respects coding comments. +Tests +----- -- bpo-40196: Fix a bug in the :mod:`symtable` module that was causing - incorrectly report global variables as local. Patch by Pablo Galindo. +- bpo-17258: Skip some :mod:`multiprocessing` tests when MD5 hash digest is + blocked. -- bpo-40126: Fixed reverting multiple patches in unittest.mock. Patcher's - ``__exit__()`` is now never called if its ``__enter__()`` is failed. - Returning true from ``__exit__()`` silences now the exception. +Build +----- -- bpo-40089: Fix threading._after_fork(): if fork was not called by a thread - spawned by threading.Thread, threading._after_fork() now creates a - _MainThread instance for _main_thread, instead of a _DummyThread instance. +- bpo-40514: Remove ``--with-experimental-isolated-subinterpreters`` + configure option in Python 3.9: the experiment continues in the master + branch, but it's no longer needed in 3.9. -- bpo-39503: :class:`~urllib.request.AbstractBasicAuthHandler` of - :mod:`urllib.request` now parses all WWW-Authenticate HTTP headers and - accepts multiple challenges per header: use the realm of the first Basic - challenge. +- bpo-40683: Fixed an issue where the :mod:`zoneinfo` module and its tests + were not included when Python is installed with ``make``. -- bpo-40014: Fix ``os.getgrouplist()``: if ``getgrouplist()`` function fails - because the group list is too small, retry with a larger group list. On - failure, the glibc implementation of ``getgrouplist()`` sets ``ngroups`` - to the total number of groups. For other implementations, double the group - list size. +Windows +------- -- bpo-40016: In re docstring, clarify the relationship between inline and - argument compile flags. +- bpo-39631: Changes the registered MIME type for ``.py`` files on Windows + to ``text/x-python`` instead of ``text/plain``. -- bpo-39953: Update internal table of OpenSSL error codes in the ``ssl`` - module. +- bpo-40677: Manually define IO_REPARSE_TAG_APPEXECLINK in case some old + Windows SDK doesn't have it. -- bpo-39360: Ensure all workers exit when finalizing a - :class:`multiprocessing.Pool` implicitly via the module finalization - handlers of multiprocessing. This fixes a deadlock situation that can be - experienced when the Pool is not properly finalized via the context - manager or a call to ``multiprocessing.Pool.terminate``. Patch by Batuhan - Taskaya and Pablo Galindo. +macOS +----- -- bpo-39652: The column name found in ``sqlite3.Cursor.description`` is now - truncated on the first '[' only if the PARSE_COLNAMES option is set. +- bpo-40741: Update macOS installer to use SQLite 3.32.2. -- bpo-39915: Ensure :attr:`unittest.mock.AsyncMock.await_args_list` has call - objects in the order of awaited arguments instead of using - :attr:`unittest.mock.Mock.call_args` which has the last value of the call. - Patch by Karthikeyan Singaravelan. +IDLE +---- -- bpo-38662: The ``ensurepip`` module now invokes ``pip`` via the ``runpy`` - module. Hence it is no longer tightly coupled with the internal API of the - bundled ``pip`` version, allowing easier updates to a newer ``pip`` - version both internally and for distributors. +- bpo-39885: Make context menu Cut and Copy work again when right-clicking + within a selection. -- bpo-39916: More reliable use of ``os.scandir()`` in ``Path.glob()``. It no - longer emits a ResourceWarning when interrupted. +- bpo-40723: Make test_idle pass when run after import. -- bpo-39850: :mod:`multiprocessing` now supports abstract socket addresses - (if abstract sockets are supported in the running platform). Patch by - Pablo Galindo. +C API +----- -- bpo-39828: Fix :mod:`json.tool` to catch :exc:`BrokenPipeError`. Patch by - Dong-hee Na. +- bpo-40910: Export explicitly the :c:func:`Py_GetArgcArgv` function to the + C API and document the function. Previously, it was exported implicitly + which no longer works since Python is built with ``-fvisibility=hidden``. -- bpo-13487: Avoid a possible *"RuntimeError: dictionary changed size during - iteration"* from :func:`inspect.getmodule` when it tried to loop through - :attr:`sys.modules`. +- bpo-40724: Allow defining buffer slots in type specs. -- bpo-39794: Add --without-decimal-contextvar build option. This enables a - thread-local rather than a coroutine local context. +- bpo-40826: :c:func:`PyOS_InterruptOccurred` now fails with a fatal error + if it is called with the GIL released. -- bpo-39769: The :func:`compileall.compile_dir` function's *ddir* parameter - and the compileall command line flag `-d` no longer write the wrong - pathname to the generated pyc file for submodules beneath the root of the - directory tree being compiled. This fixes a regression introduced with - Python 3.5. -- bpo-39517: Fix runpy.run_path() when using pathlike objects +What's New in Python 3.9.0 beta 1? +================================== -- bpo-39764: Fix AttributeError when calling get_stack on a PyAsyncGenObject - Task +*Release date: 2020-05-19* -- bpo-30566: Fix :exc:`IndexError` when trying to decode an invalid string - with punycode codec. +Security +-------- -- bpo-39667: Correct performance degradation in ``zipfile.Path`` as found in - zipp 3.0. While retaining compatibility, this change discourages the use - of ``zipfile.Path.open`` due to the signature change in Python 3.9. For - compatibility across Python 3.8 and later versions, consider using - ``zipp.Path`` on Python 3.8.x and earlier. +- bpo-40501: :mod:`uuid` no longer uses :mod:`ctypes` to load + :file:`libuuid` or :file:`rpcrt4.dll` at runtime. -- bpo-39548: Fix handling of header in - :class:`urllib.request.AbstractDigestAuthHandler` when the optional - ``qop`` parameter is not present. +Core and Builtins +----------------- -- bpo-38971: Open issue in the BPO indicated a desire to make the - implementation of codecs.open() at parity with io.open(), which implements - a try/except to assure file stream gets closed before an exception is - raised. +- bpo-40663: Correctly generate annotations where parentheses are omitted + but required (e.g: ``Type[(str, int, *other))]``. -- bpo-38410: Properly handle :func:`sys.audit` failures in - :func:`sys.set_asyncgen_hooks`. Based on patch by Zackery Spytz. +- bpo-40596: Fixed :meth:`str.isidentifier` for non-canonicalized strings + containing non-BMP characters on Windows. -- bpo-36541: lib2to3 now recognizes named assignment expressions (the walrus - operator, ``:=``) +- bpo-40593: Improved syntax errors for invalid characters in source code. -- bpo-31758: Prevent crashes when using an uninitialized - ``_elementtree.XMLParser`` object. Patch by Oren Milman. +- bpo-40585: Fixed a bug when using :func:`codeop.compile_command` that was + causing exceptions to be swallowed with the new parser. Patch by Pablo + Galindo -Documentation -------------- +- bpo-40566: Apply :pep:`573` to :mod:`abc`. -- bpo-27635: The pickle documentation incorrectly claimed that ``__new__`` - isn't called by default when unpickling. +- bpo-40502: Initialize ``n->n_col_offset``. (Patch by Joannah Nanjekye) -- bpo-39879: Updated :ref:`datamodel` docs to include :func:`dict` insertion - order preservation. Patch by Furkan Onder and Samy Lahfa. +- bpo-40527: Fix command line argument parsing: no longer write errors + multiple times into stderr. -- bpo-39868: Updated the Language Reference for :pep:`572`. +- bpo-1635741: Port :mod:`errno` to multiphase initialization (:pep:`489`). -- bpo-13790: Change 'string' to 'specification' in format doc. +- bpo-40523: Add pass-throughs for :func:`hash` and :func:`reversed` to + :class:`weakref.proxy` objects. Patch by Pablo Galindo. -- bpo-17422: The language reference no longer restricts default class - namespaces to dicts only. +- bpo-1635741: Port :mod:`syslog` to multiphase initialization (:pep:`489`). -- bpo-39530: Fix misleading documentation about mixed-type numeric - comparisons. +- bpo-40246: Reporting a specialised error message for invalid string + prefixes, which was introduced in :issue:`40246`, is being reverted due to + backwards compatibility concerns for strings that immediately follow a + reserved keyword without whitespace between them. Constructs like + `bg="#d00" if clear else"#fca"` were failing to parse, which is not an + acceptable breakage on such short notice. -- bpo-39718: Update :mod:`token` documentation to reflect additions in - Python 3.8 +- bpo-40417: Fix imp module deprecation warning when PyImport_ReloadModule + is called. Patch by Robert Rouhani. -- bpo-39677: Changed operand name of **MAKE_FUNCTION** from *argc* to - *flags* for module :mod:`dis` +- bpo-40408: Fixed support of nested type variables in GenericAlias (e.g. + ``list[list[T]]``). -- bpo-38387: Document :c:macro:`PyDoc_STRVAR` macro in the C-API reference. +- bpo-1635741: Port _stat module to multiphase initialization (:pep:`489`). -Tests ------ +- bpo-29587: Enable implicit exception chaining when calling + :meth:`generator.throw`. -- bpo-40436: test_gdb and test.pythoninfo now check gdb command exit code. +- bpo-40328: Add tools for generating mappings headers for CJKCodecs. -- bpo-40162: Update Travis CI configuration to OpenSSL 1.1.1f. +- bpo-40228: Setting frame.f_lineno is now robust w.r.t. changes in the + source-to-bytecode compiler -- bpo-40146: Update OpenSSL to 1.1.1f in Azure Pipelines. +- bpo-38880: Added the ability to list interpreters associated with channel + ends in the internal subinterpreters module. -- bpo-40019: test_gdb now skips tests if it detects that gdb failed to read - debug information because the Python binary is optimized. +- bpo-37986: Improve performance of :c:func:`PyLong_FromDouble` for values + that fit into :c:type:`long`. -- bpo-27807: ``test_site.test_startup_imports()`` is now skipped if a path - of :data:`sys.path` contains a ``.pth`` file. +Library +------- -- bpo-39793: Use the same domain when testing ``make_msgid``. Patch by - Batuhan Taskaya. +- bpo-40662: Fixed :func:`ast.get_source_segment` for ast nodes that have + incomplete location information. Patch by Irit Katriel. -- bpo-1812: Fix newline handling in doctest.testfile when loading from a - package whose loader has a get_data method. Patch by Peter Donis. +- bpo-40665: Convert :mod:`bisect` to use Argument Clinic. -- bpo-37957: test.regrtest now can receive a list of test patterns to ignore - (using the -i/--ignore argument) or a file with a list of patterns to - ignore (using the --ignore-file argument). Patch by Pablo Galindo. +- bpo-40536: Added the :func:`~zoneinfo.available_timezones` function to the + :mod:`zoneinfo` module. Patch by Paul Ganssle. -- bpo-38502: test.regrtest now uses process groups in the multiprocessing - mode (-jN command line option) if process groups are available: if - :func:`os.setsid` and :func:`os.killpg` functions are available. +- bpo-40645: The :class:`hmac.HMAC` exposes internal implementation details. + The attributes ``digest_cons``, ``inner``, and ``outer`` are deprecated + and will be removed in the future. -Build ------ +- bpo-40645: The internal module ``_hashlib`` wraps and exposes OpenSSL's + HMAC API. The new code will be used in Python 3.10 after the internal + implementation details of the pure Python HMAC module are no longer part + of the public API. -- bpo-38360: Support single-argument form of macOS -isysroot flag. +- bpo-40637: Builtin hash modules can now be disabled or selectively enabled + with ``configure --with-builtin-hashlib-hashes=sha3,blake1`` or + ``--without-builtin-hashlib-hashes``. -- bpo-40204: Pin Sphinx version to 1.8.2 in ``Doc/Makefile``. +- bpo-37630: The :mod:`hashlib` module can now use SHA3 hashes and SHAKE XOF + from OpenSSL when available. -- bpo-40158: Fix CPython MSBuild Properties in NuGet Package - (build/native/python.props) +- bpo-40479: The :mod:`hashlib` now compiles with OpenSSL 3.0.0-alpha2. -- bpo-38527: Fix configure check on Solaris for "float word ordering": - sometimes, the correct "grep" command was not being used. Patch by Arnon - Yaari. +- bpo-40257: Revert changes to :func:`inspect.getdoc`. -Windows -------- +- bpo-40607: When cancelling a task due to timeout, :meth:`asyncio.wait_for` + will now propagate the exception if an error happens during cancellation. + Patch by Roman Skurikhin. -- bpo-40164: Updates Windows to OpenSSL 1.1.1f +- bpo-40612: Fix edge cases in SyntaxError formatting. If the offset is <= + 0, no caret is printed. If the offset is > line length, the caret is + printed pointing just after the last character. -- bpo-39930: Ensures the required :file:`vcruntime140.dll` is included in - install packages. +- bpo-40597: If text content lines are longer than policy.max_line_length, + always use a content-encoding to make sure they are wrapped. -- bpo-39847: Avoid hang when computer is hibernated whilst waiting for a - mutex (for lock-related objects from :mod:`threading`) around 49-day - uptime. +- bpo-40571: Added functools.cache() as a simpler, more discoverable way to + access the unbounded cache variant of lru_cache(maxsize=None). -- bpo-38597: :mod:`distutils` will no longer statically link - :file:`vcruntime140.dll` when a redistributable version is unavailable. - All future releases of CPython will include a copy of this DLL to ensure - distributed extensions can continue to load. +- bpo-40503: :pep:`615`, the :mod:`zoneinfo` module. Adds support for the + IANA time zone database. -- bpo-38380: Update Windows builds to use SQLite 3.31.1 +- bpo-40397: Removed attributes ``__args__`` and ``__parameters__`` from + special generic aliases like ``typing.List`` (not subscripted). -- bpo-39789: Update Windows release build machines to Visual Studio 2019 - (MSVC 14.2). +- bpo-40549: Convert posixmodule.c ("posix" or "nt" module) to the + multiphase initialization (PEP 489). -- bpo-34803: Package for nuget.org now includes repository reference and - bundled icon image. +- bpo-31033: Add a ``msg`` argument to :meth:`Future.cancel` and + :meth:`Task.cancel`. -macOS ------ +- bpo-40541: Added an optional *counts* parameter to random.sample(). -- bpo-40164: Update macOS installer builds to use OpenSSL 1.1.1g. +- bpo-40515: The :mod:`ssl` and :mod:`hashlib` modules now actively check + that OpenSSL is build with thread support. Python 3.7.0 made thread + support mandatory and no longer works safely with a no-thread builds. -- bpo-38380: Update macOS builds to use SQLite 3.31.1 +- bpo-31033: When a :class:`asyncio.Task` is cancelled, the exception + traceback now chains all the way back to where the task was first + interrupted. -IDLE ----- +- bpo-40504: :func:`functools.lru_cache` objects can now be the targets of + weakrefs. -- bpo-27115: For 'Go to Line', use a Query box subclass with IDLE standard - behavior and improved error checking. +- bpo-40559: Fix possible memory leak in the C implementation of + :class:`asyncio.Task`. -- bpo-39885: Since clicking to get an IDLE context menu moves the cursor, - any text selection should be and now is cleared. +- bpo-40480: ``fnmatch.fnmatch()`` could take exponential time in the + presence of multiple ``*`` pattern characters. This was repaired by + generating more elaborate regular expressions to avoid futile + backtracking. -- bpo-39852: Edit "Go to line" now clears any selection, preventing - accidental deletion. It also updates Ln and Col on the status bar. +- bpo-40495: :mod:`compileall` is now able to use hardlinks to prevent + duplicates in a case when ``.pyc`` files for different optimization levels + have the same content. -- bpo-39781: Selecting code context lines no longer causes a jump. +- bpo-40457: The ssl module now support OpenSSL builds without TLS 1.0 and + 1.1 methods. -- bpo-38439: Add a 256×256 pixel IDLE icon to support more modern - environments. Created by Andrew Clover. Delete the unused macOS idle.icns - icon file. +- bpo-40355: Improve error reporting in :func:`ast.literal_eval` in the + presence of malformed :class:`ast.Dict` nodes instead of silently ignoring + any non-conforming elements. Patch by Curtis Bucher. -- bpo-38689: IDLE will no longer freeze when inspect.signature fails when - fetching a calltip. +- bpo-40465: Deprecated the optional *random* argument to + *random.shuffle()*. -Tools/Demos ------------ +- bpo-40459: :func:`platform.win32_ver` now produces correct *ptype* strings + instead of empty strings. -- bpo-40179: Fixed translation of ``#elif`` in Argument Clinic. +- bpo-39435: The first argument of :func:`pickle.loads` is now + positional-only. -- bpo-36184: Port python-gdb.py to FreeBSD. python-gdb.py now checks for - "take_gil" function name to check if a frame tries to acquire the GIL, - instead of checking for "pthread_cond_timedwait" which is specific to - Linux and can be a different condition than the GIL. +- bpo-39305: Update :mod:`nntplib` to merge :class:`nntplib.NNTP` and + :class:`nntplib._NNTPBase`. Patch by Dong-hee Na. -- bpo-39889: Fixed ``unparse.py`` for extended slices containing a single - element (e.g. ``a[i:j,]``). Remove redundant tuples when index with a - tuple (e.g. ``a[i, j]``). +- bpo-32494: Update :mod:`dbm.gnu` to use gdbm_count if possible when + calling :func:`len`. Patch by Dong-hee Na. -C API ------ +- bpo-40453: Add ``isolated=True`` keyword-only parameter to + ``_xxsubinterpreters.create()``. An isolated subinterpreter cannot spawn + threads, spawn a child process or call ``os.fork()``. -- bpo-35370: If :c:func:`PySys_Audit` fails in :c:func:`PyEval_SetProfile` - or :c:func:`PyEval_SetTrace`, log the error as an unraisable exception. +- bpo-40286: Remove ``_random.Random.randbytes()``: the C implementation of + ``randbytes()``. Implement the method in Python to ease subclassing: + ``randbytes()`` now directly reuses ``getrandbits()``. -- bpo-39884: :c:func:`PyDescr_NewMethod` and :c:func:`PyCFunction_NewEx` now - include the method name in the SystemError "bad call flags" error message - to ease debug. +- bpo-40394: Added default arguments to + :meth:`difflib.SequenceMatcher.find_longest_match()`. -- bpo-38643: :c:func:`PyNumber_ToBase` now raises a :exc:`SystemError` - instead of crashing when called with invalid base. +- bpo-39995: Fix a race condition in concurrent.futures._ThreadWakeup: + access to _ThreadWakeup is now protected with the shutdown lock. -- bpo-38913: Fixed segfault in ``Py_BuildValue()`` called with a format - containing "#" and undefined PY_SSIZE_T_CLEAN whwn an exception is set. +- bpo-30966: ``Process.shutdown(wait=True)`` of :mod:`concurrent.futures` + now closes explicitly the result queue. +- bpo-30966: Add a new :meth:`~multiprocessing.SimpleQueue.close` method to + the :class:`~multiprocessing.SimpleQueue` class to explicitly close the + queue. -What's New in Python 3.8.2 final? -================================= +- bpo-39966: Revert bpo-25597. :class:`unittest.mock.MagicMock` with wraps' + set uses default return values for magic methods. -*Release date: 2020-02-24* +- bpo-39791: Added ``files()`` function to importlib.resources with support + for subdirectories in package data, matching backport in + importlib_resources 1.5. -Core and Builtins ------------------ +- bpo-40375: :meth:`imaplib.IMAP4.unselect` is added. Patch by Dong-hee Na. -- bpo-39382: Fix a use-after-free in the single inheritance path of - ``issubclass()``, when the ``__bases__`` of an object has a single - reference, and so does its first item. Patch by Yonatan Goldschmidt. +- bpo-40389: ``repr()`` now returns ``typing.Optional[T]`` when called for + ``typing.Union`` of two types, one of which is ``NoneType``. -- bpo-39427: Document all possibilities for the ``-X`` options in the - command line help section. Patch by Pablo Galindo. +- bpo-40291: Add support for CAN_J1939 sockets (available on Linux 5.4+) -Library -------- +- bpo-40273: :class:`types.MappingProxyType` is now reversible. -- bpo-39649: Remove obsolete check for `__args__` in - bdb.Bdb.format_stack_entry. +- bpo-39075: The repr for :class:`types.SimpleNamespace` is now insertion + ordered rather than alphabetical. -- bpo-39681: Fix a regression where the C pickle module wouldn't allow - unpickling from a file-like object that doesn't expose a readinto() - method. +- bpo-40192: On AIX, :func:`~time.thread_time` is now implemented with + ``thread_cputime()`` which has nanosecond resolution, rather than + ``clock_gettime(CLOCK_THREAD_CPUTIME_ID)`` which has a resolution of 10 + ms. Patch by Batuhan Taskaya. -- bpo-39546: Fix a regression in :class:`~argparse.ArgumentParser` where - ``allow_abbrev=False`` was ignored for long options that used a prefix - character other than "-". +- bpo-40025: Raise TypeError when _generate_next_value_ is defined after + members. Patch by Ethan Onstott. -- bpo-39432: Implement PEP-489 algorithm for non-ascii "PyInit\_..." symbol - names in distutils to make it export the correct init symbol also on - Windows. +- bpo-39058: In the argparse module, the repr for Namespace() and other + argument holders now displayed in the order attributes were added. + Formerly, it displayed in alphabetical order even though argument order is + preserved the user visible parts of the module. + +- bpo-24416: The ``isocalendar()`` methods of :class:`datetime.date` and + :class:`datetime.datetime` now return a :term:`named tuple` instead of a + :class:`tuple`. Documentation ------------- -- bpo-17422: The language reference now specifies restrictions on class - namespaces. Adapted from a patch by Ethan Furman. +- bpo-34790: Add version of removal for explicit passing of coros to + `asyncio.wait()`'s documentation -- bpo-39572: Updated documentation of ``total`` flag of TypeDict. +- bpo-40561: Provide docstrings for webbrowser open functions. -- bpo-39654: In pyclbr doc, update 'class' to 'module' where appropriate and - add readmodule comment. Patch by Hakan Çelik. +- bpo-40499: Mention that :func:`asyncio.wait` requires a non-empty set of + awaitables. -IDLE ----- +- bpo-39705: Tutorial example for sorted() in the Loop Techniques section is + given a better explanation. Also a new example is included to explain + sorted()'s basic behavior. -- bpo-39663: Add tests for pyparse find_good_parse_start(). +- bpo-39435: Fix an incorrect signature for :func:`pickle.loads` in the docs +Tests +----- -What's New in Python 3.8.2 release candidate 2? -=============================================== +- bpo-40055: distutils.tests now saves/restores warnings filters to leave + them unchanged. Importing tests imports docutils which imports + pkg_resources which adds a warnings filter. -*Release date: 2020-02-17* +- bpo-40436: test_gdb and test.pythoninfo now check gdb command exit code. -Security --------- +Build +----- -- bpo-39184: Add audit events to functions in `fcntl`, `msvcrt`, `os`, - `resource`, `shutil`, `signal` and `syslog`. +- bpo-40653: Move _dirnameW out of HAVE_SYMLINK to fix a potential compiling + issue. -Core and Builtins ------------------ +- bpo-40514: Add ``--with-experimental-isolated-subinterpreters`` build + option to ``configure``: better isolate subinterpreters, experimental + build mode. -- bpo-39619: Enable use of :func:`os.chroot` on HP-UX systems. +Windows +------- -- bpo-39606: Fix regression caused by fix for bpo-39386, that prevented - calling ``aclose`` on an async generator that had already been closed or - exhausted. +- bpo-40650: Include winsock2.h in pytime.c for timeval. -- bpo-39453: Fixed a possible crash in :meth:`list.__contains__` when a list - is changed during comparing items. Patch by Dong-hee Na. +- bpo-40458: Increase reserved stack space to prevent overflow crash on + Windows. -- bpo-39219: Syntax errors raised in the tokenizer now always set correct - "text" and "offset" attributes. +- bpo-39148: Add IPv6 support to :mod:`asyncio` datagram endpoints in + ProactorEventLoop. Change the raised exception for unknown address + families to ValueError as it's not coming from Windows API. -Library -------- +macOS +----- -- bpo-27657: The original fix for bpo-27657, "Fix urlparse() with numeric - paths" (GH-16839) included in 3.8.1, inadvertently introduced a behavior - change that broke several third-party packages relying on the original - undefined parsing behavior. The change is reverted in 3.8.2, restoring the - behavior of 3.8.0 and earlier releases. +- bpo-34956: When building Python on macOS from source, ``_tkinter`` now + links with non-system Tcl and Tk frameworks if they are installed in + ``/Library/Frameworks``, as had been the case on older releases of macOS. + If a macOS SDK is explicitly configured, by using + ``--enable-universalsdk=`` or ``-isysroot``, only the SDK itself is + searched. The default behavior can still be overridden with + ``--with-tcltk-includes`` and ``--with-tcltk-libs``. -- bpo-39474: Fixed starting position of AST for expressions like ``(a)(b)``, - ``(a)[b]`` and ``(a).b``. +- bpo-35569: Expose RFC 3542 IPv6 socket options. -- bpo-21016: The :mod:`pydoc` and :mod:`trace` modules now use the - :mod:`sysconfig` module to get the path to the Python standard library, to - support uncommon installation path like ``/usr/lib64/python3.9/`` on - Fedora. Patch by Jan Matějek. +Tools/Demos +----------- -- bpo-39595: Improved performance of zipfile.Path for files with a large - number of entries. Also improved performance and fixed minor issue as - published with `importlib_metadata 1.5 - `_. +- bpo-40479: Update multissltest helper to test with latest OpenSSL 1.0.2, + 1.1.0, 1.1.1, and 3.0.0-alpha. -IDLE ----- +- bpo-40431: Fix a syntax typo in ``turtledemo`` that now raises a + ``SyntaxError``. -- bpo-39600: In the font configuration window, remove duplicated font names. +- bpo-40163: Fix multissltest tool. OpenSSL has changed download URL for old + releases. The multissltest tool now tries to download from current and old + download URLs. +C API +----- -What's New in Python 3.8.2 release candidate 1? -=============================================== +- bpo-39465: Remove the ``_PyUnicode_ClearStaticStrings()`` function from + the C API. -*Release date: 2020-02-10* +- bpo-38787: Add PyCFunction_CheckExact() macro for exact type checks now + that we allow subtypes of PyCFunction, as well as PyCMethod_CheckExact() + and PyCMethod_Check() for the new PyCMethod subtype. -Security --------- +- bpo-40545: Declare ``_PyErr_GetTopmostException()`` with ``PyAPI_FUNC()`` + to properly export the function in the C API. The function remains private + (``_Py``) prefix. -- bpo-39401: Avoid unsafe load of ``api-ms-win-core-path-l1-1-0.dll`` at - startup on Windows 7. +- bpo-40412: Nullify inittab_copy during finalization, preventing future + interpreter initializations in an embedded situation from crashing. Patch + by Gregory Szorc. -- bpo-39184: Add audit events to command execution functions in os and pty - modules. +- bpo-40429: The :c:func:`PyThreadState_GetFrame` function now returns a + strong reference to the frame. -Core and Builtins ------------------ +- bpo-40428: Remove the following functions from the C API. Call + :c:func:`PyGC_Collect` explicitly to free all free lists. -- bpo-39579: Change the ending column offset of `Attribute` nodes - constructed in `ast_for_dotted_name` to point at the end of the current - node and not at the end of the last `NAME` node. + * ``PyAsyncGen_ClearFreeLists()`` + * ``PyContext_ClearFreeList()`` + * ``PyDict_ClearFreeList()`` + * ``PyFloat_ClearFreeList()`` + * ``PyFrame_ClearFreeList()`` + * ``PyList_ClearFreeList()`` + * ``PySet_ClearFreeList()`` + * ``PyTuple_ClearFreeList()`` -- bpo-39510: Fix segfault in ``readinto()`` method on closed BufferedReader. +- bpo-40421: New :c:func:`PyFrame_GetBack` function: get the frame next + outer frame. -- bpo-39492: Fix a reference cycle in the C Pickler that was preventing the - garbage collection of deleted, pickled objects. +- bpo-40421: New :c:func:`PyFrame_GetCode` function: return a borrowed + reference to the frame code. -- bpo-39421: Fix possible crashes when operating with the functions in the - :mod:`heapq` module and custom comparison operators. +- bpo-40217: Ensure that instances of types created with + :c:func:`PyType_FromSpecWithBases` will visit its class object when + traversing references in the garbage collector (implemented as an + extension of the provided :c:member:`~PyTypeObject.tp_traverse`). Patch by + Pablo Galindo. -- bpo-39386: Prevent double awaiting of async iterator. +- bpo-38787: Module C state is now accessible from C-defined heap type + methods (:pep:`573`). Patch by Marcel Plch and Petr Viktorin. -- bpo-39235: Fix AST end location for lone generator expression in function - call, e.g. f(i for i in a). -- bpo-39209: Correctly handle multi-line tokens in interactive mode. Patch - by Pablo Galindo. +What's New in Python 3.9.0 alpha 6? +=================================== -- bpo-39216: Fix constant folding optimization for positional only arguments - - by Anthony Sottile. +*Release date: 2020-04-27* -- bpo-39215: Fix ``SystemError`` when nested function has annotation on - positional-only argument - by Anthony Sottile. +Security +-------- -- bpo-38588: Fix possible crashes in dict and list when calling - :c:func:`PyObject_RichCompareBool`. +- bpo-40121: Fixes audit events raised on creating a new socket. -- bpo-38610: Fix possible crashes in several list methods by holding strong - references to list elements when calling - :c:func:`PyObject_RichCompareBool`. +- bpo-39073: Disallow CR or LF in email.headerregistry.Address arguments to + guard against header injection attacks. -Library -------- +- bpo-39503: CVE-2020-8492: The + :class:`~urllib.request.AbstractBasicAuthHandler` class of the + :mod:`urllib.request` module uses an inefficient regular expression which + can be exploited by an attacker to cause a denial of service. Fix the + regex to prevent the catastrophic backtracking. Vulnerability reported by + Ben Caller and Matt Schwager. -- bpo-39590: Collections.deque now holds strong references during - deque.__contains__ and deque.count, fixing crashes. +Core and Builtins +----------------- -- bpo-38149: :func:`sys.audit` is now called only once per call of - :func:`glob.glob` and :func:`glob.iglob`. +- bpo-40313: Improve the performance of bytes.hex(). -- bpo-39450: Striped whitespace from docstring before returning it from - :func:`unittest.case.shortDescription`. +- bpo-40334: Switch to a new parser, based on PEG. For more details see PEP + 617. To temporarily switch back to the old parser, use ``-X oldparser`` or + ``PYTHONOLDPARSER=1``. In Python 3.10 we will remove the old parser + completely, including the ``parser`` module (already deprecated) and + anything that depends on it. -- bpo-39493: Mark ``typing.IO.closed`` as a property +- bpo-40267: Fix the tokenizer to display the correct error message, when + there is a SyntaxError on the last input character and no newline follows. + It used to be `unexpected EOF while parsing`, while it should be `invalid + syntax`. -- bpo-39485: Fix a bug in :func:`unittest.mock.create_autospec` that would - complain about the wrong number of arguments for custom descriptors - defined in an extension module returning functions. +- bpo-39522: Correctly unparse explicit ``u`` prefix for strings when + postponed evaluation for annotations activated. Patch by Batuhan Taskaya. -- bpo-39082: Allow AsyncMock to correctly patch static/class methods +- bpo-40246: Report a specialized error message, `invalid string prefix`, + when the tokenizer encounters a string with an invalid prefix. -- bpo-39430: Fixed race condition in lazy imports in :mod:`tarfile`. +- bpo-40082: Fix the signal handler: it now always uses the main + interpreter, rather than trying to get the current Python thread state. -- bpo-39390: Fixed a regression with the `ignore` callback of - :func:`shutil.copytree`. The argument types are now str and List[str] - again. +- bpo-37388: str.encode() and str.decode() no longer check the encoding and + errors in development mode or in debug mode during Python finalization. + The codecs machinery can no longer work on very late calls to str.encode() + and str.decode(). -- bpo-39389: Write accurate compression level metadata in :mod:`gzip` - archives, rather than always signaling maximum compression. +- bpo-40077: Fix possible refleaks in :mod:`_json`, memo of PyScannerObject + should be traversed. -- bpo-39274: ``bool(fraction.Fraction)`` now returns a boolean even if - (numerator != 0) does not return a boolean (ex: numpy number). +- bpo-37207: Speed up calls to ``dict()`` by using the :pep:`590` + ``vectorcall`` calling convention. -- bpo-39297: Improved performance of importlib.metadata distribution - discovery and resilients to inaccessible sys.path entries - (importlib_metadata v1.4.0). +- bpo-40141: Add column and line information to ``ast.keyword`` nodes. Patch + by Pablo Galindo. -- bpo-39242: Updated the Gmane domain from news.gmane.org to news.gmane.io - which is used for examples of :class:`~nntplib.NNTP` news reader server - and nntplib tests. +- bpo-1635741: Port :mod:`resource` to multiphase initialization + (:pep:`489`). -- bpo-38907: In http.server script, restore binding to IPv4 on Windows. +- bpo-1635741: Port :mod:`math` to multiphase initialization (:pep:`489`). -- bpo-39152: Fix ttk.Scale.configure([name]) to return configuration tuple - for name or all options. Giovanni Lombardo contributed part of the patch. +- bpo-1635741: Port _uuid module to multiphase initialization (:pep:`489`). -- bpo-39198: If an exception were to be thrown in `Logger.isEnabledFor` - (say, by asyncio timeouts or stopit) , the `logging` global lock may not - be released appropriately, resulting in deadlock. This change wraps that - block of code with `try...finally` to ensure the lock is released. +- bpo-40077: Convert json module to use :c:func:`PyType_FromSpec`. -- bpo-39191: Perform a check for running loop before starting a new task in - ``loop.run_until_complete()`` to fail fast; it prevents the side effect of - new task spawning before exception raising. +- bpo-40067: Improve the error message for multiple star expressions in an + assignment. Patch by Furkan Onder -- bpo-38871: Correctly parenthesize filter-based statements that contain - lambda expressions in mod:`lib2to3`. Patch by Dong-hee Na. +- bpo-1635741: Port _functools module to multiphase initialization (PEP + 489). Patch by Paulo Henrique Silva. -- bpo-39142: A change was made to logging.config.dictConfig to avoid - converting instances of named tuples to ConvertingTuple. It's assumed that - named tuples are too specialised to be treated like ordinary tuples; if a - user of named tuples requires ConvertingTuple functionality, they will - have to implement that themselves in their named tuple class. +- bpo-1635741: Port operator module to multiphase initialization (PEP 489). + Patch by Paulo Henrique Silva. -- bpo-39129: Fix import path for ``asyncio.TimeoutError`` +- bpo-20526: Fix :c:func:`PyThreadState_Clear()`. ``PyThreadState.frame`` is + a borrowed reference, not a strong reference: ``PyThreadState_Clear()`` + must not call ``Py_CLEAR(tstate->frame)``. -- bpo-39057: :func:`urllib.request.proxy_bypass_environment` now ignores - leading dots and no longer ignores a trailing newline. +- bpo-1635741: Port time module to multiphase initialization (:pep:`489`). + Patch by Paulo Henrique Silva. -- bpo-39056: Fixed handling invalid warning category in the -W option. No - longer import the re module if it is not needed. +- bpo-1635741: Port _weakref extension module to multiphase initialization + (:pep:`489`). -- bpo-39055: :func:`base64.b64decode` with ``validate=True`` raises now a - binascii.Error if the input ends with a single ``\n``. +- bpo-40020: Fix a leak and subsequent crash in parsetok.c caused by realloc + misuse on a rare codepath. -- bpo-39033: Fix :exc:`NameError` in :mod:`zipimport`. Patch by Karthikeyan - Singaravelan. +- bpo-39939: Added str.removeprefix and str.removesuffix methods and + corresponding bytes, bytearray, and collections.UserString methods to + remove affixes from a string if present. See :pep:`616` for a full + description. Patch by Dennis Sweeney. -- bpo-38878: Fixed __subclasshook__ of :class:`os.PathLike` to return a - correct result upon inheritence. Patch by Bar Harel. +- bpo-39481: Implement PEP 585. This supports list[int], tuple[str, ...] + etc. -- bpo-35182: Fixed :func:`Popen.communicate` subsequent call crash when the - child process has already closed any piped standard stream, but still - continues to be running. Patch by Andriy Maletsky. +- bpo-32894: Support unparsing of infinity numbers in postponed annotations. + Patch by Batuhan Taşkaya. -- bpo-38473: Use signature from inner mock for autospecced methods attached - with :func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. +- bpo-37207: Speed up calls to ``list()`` by using the :pep:`590` + ``vectorcall`` calling convention. Patch by Mark Shannon. -- bpo-38293: Add :func:`copy.copy` and :func:`copy.deepcopy` support to - :func:`property` objects. +Library +------- -Documentation -------------- +- bpo-40398: :func:`typing.get_args` now always returns an empty tuple for + special generic aliases. -- bpo-39153: Clarify refcounting semantics for the following functions: - - PyObject_SetItem - PyMapping_SetItemString - PyDict_SetItem - - PyDict_SetItemString +- bpo-40396: Functions :func:`typing.get_origin`, :func:`typing.get_args` + and :func:`typing.get_type_hints` support now generic aliases like + ``list[int]``. -- bpo-39392: Explain that when filling with turtle, overlap regions may be - left unfilled. +- bpo-38061: Optimize the :mod:`subprocess` module on FreeBSD using + ``closefrom()``. A single ``close(fd)`` syscall is cheap, but when + ``sysconf(_SC_OPEN_MAX)`` is high, the loop calling ``close(fd)`` on each + file descriptor can take several milliseconds. -- bpo-39381: Mention in docs that :func:`asyncio.get_event_loop` implicitly - creates new event loop only if called from the main thread. + The workaround on FreeBSD to improve performance was to load and mount the + fdescfs kernel module, but this is not enabled by default. -- bpo-38918: Add an entry for ``__module__`` in the "function" & "method" - sections of the `inspect docs types and members table - `_ + Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans + (kevans) and Kubilay Kocak (koobs): + https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274 -- bpo-3530: In the :mod:`ast` module documentation, fix a misleading - ``NodeTransformer`` example and add advice on when to use the - ``fix_missing_locations`` function. +- bpo-38061: On FreeBSD, ``os.closerange(fd_low, fd_high)`` now calls + ``closefrom(fd_low)`` if *fd_high* is greater than or equal to + ``sysconf(_SC_OPEN_MAX)``. -Tests ------ + Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans + (kevans) and Kubilay Kocak (koobs): + https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274 -- bpo-39502: Skip test_zipfile.test_add_file_after_2107() if - :func:`time.localtime` fails with :exc:`OverflowError`. It is the case on - AIX 6.1 for example. +- bpo-40360: The :mod:`lib2to3` module is pending deprecation due to + :pep:`617`. -- bpo-38546: Fix test_ressources_gced_in_workers() of - test_concurrent_futures: explicitly stop the manager to prevent leaking a - child process running in the background after the test completes. +- bpo-40138: Fix the Windows implementation of :func:`os.waitpid` for exit + code larger than ``INT_MAX >> 8``. The exit status is now interpreted as + an unsigned number. -Build ------ +- bpo-39942: Set "__main__" as the default module name when "__name__" is + missing in :class:`typing.TypeVar`. Patch by Weipeng Hong. -- bpo-39144: The ctags and etags build targets both include Modules/_ctypes - and Python standard library source files. +- bpo-40275: The :mod:`logging` package is now imported lazily in + :mod:`unittest` only when the :meth:`~unittest.TestCase.assertLogs` + assertion is used. -Windows -------- +- bpo-40275: The :mod:`asyncio` package is now imported lazily in + :mod:`unittest` only when the :class:`~unittest.IsolatedAsyncioTestCase` + class is used. -- bpo-39439: Honor the Python path when a virtualenv is active on Windows. +- bpo-40330: In :meth:`ShareableList.__setitem__`, check the size of a new + string item after encoding it to utf-8, not before. -- bpo-39393: Improve the error message when attempting to load a DLL with - unresolved dependencies. +- bpo-40148: Added :meth:`pathlib.Path.with_stem()` to create a new Path + with the stem replaced. -- bpo-38883: :meth:`~pathlib.Path.home()` and - :meth:`~pathlib.Path.expanduser()` on Windows now prefer - :envvar:`USERPROFILE` and no longer use :envvar:`HOME`, which is not - normally set for regular user accounts. This makes them again behave like - :func:`os.path.expanduser`, which was changed to ignore :envvar:`HOME` in - 3.8, see :issue:`36264`. +- bpo-40325: Deprecated support for set objects in random.sample(). -- bpo-39185: The build.bat script has additional options for very-quiet - output (-q) and very-verbose output (-vv) +- bpo-40257: Improved help for the :mod:`typing` module. Docstrings are now + shown for all special forms and special generic aliases (like ``Union`` + and ``List``). Using ``help()`` with generic alias like ``List[int]`` will + show the help for the correspondent concrete type (``list`` in this case). -IDLE ----- +- bpo-40257: func:`inspect.getdoc` no longer returns docstring inherited + from the type of the object or from parent class if it is a class if it is + not defined in the object itself. In :mod:`pydoc` the documentation string + is now shown not only for class, function, method etc, but for any object + that has its own ``__doc__`` attribute. -- bpo-30780: Add remaining configdialog tests for buttons and highlights and - keys tabs. +- bpo-40287: Fixed ``SpooledTemporaryFile.seek()`` to return the position. -- bpo-39388: IDLE Settings Cancel button now cancels pending changes +- bpo-40290: Added zscore() to statistics.NormalDist(). -- bpo-39050: Make IDLE Settings dialog Help button work again. +- bpo-40282: Allow ``random.getrandbits(0)`` to succeed and to return 0. -- bpo-34118: Tag memoryview, range, and tuple as classes, the same as list, - etcetera, in the library manual built-in functions list. +- bpo-40286: Add :func:`random.randbytes` function and + :meth:`random.Random.randbytes` method to generate random bytes. -- bpo-38792: Close an IDLE shell calltip if a :exc:`KeyboardInterrupt` or - shell restart occurs. Patch by Zackery Spytz. +- bpo-40277: :func:`collections.namedtuple` now provides a human-readable + repr for its field accessors. -- bpo-32989: Add tests for editor newline_and_indent_event method. Remove - dead code from pyparse find_good_parse_start method. +- bpo-40270: The included copy of sqlite3 on Windows is now compiled with + the json extension. This allows the use of functions such as + ``json_object``. +- bpo-29255: Wait in `KqueueSelector.select` when no fds are registered -What's New in Python 3.8.1 final? -================================= +- bpo-40260: Ensure :mod:`modulefinder` uses :func:`io.open_code` and + respects coding comments. -*Release date: 2019-12-18* +- bpo-40234: Allow again to spawn daemon threads in subinterpreters (revert + change which denied them). -Core and Builtins ------------------ +- bpo-39207: Workers in :class:`~concurrent.futures.ProcessPoolExecutor` are + now spawned on demand, only when there are no available idle workers to + reuse. This optimizes startup overhead and reduces the amount of lost CPU + time to idle workers. Patch by Kyle Stanley. -- bpo-39080: Fix the value of *end_col_offset* for Starred Expression AST - nodes when they are among the elements in the *args* attribute of Call AST - nodes. +- bpo-40091: Fix a hang at fork in the logging module: the new private + _at_fork_reinit() method is now used to reinitialize locks at fork in the + child process. -- bpo-39031: When parsing an "elif" node, lineno and col_offset of the node - now point to the "elif" keyword and not to its condition, making it - consistent with the "if" node. Patch by Lysandros Nikolaou. +- bpo-40149: Implement traverse and clear slots in _abc._abc_data type. -- bpo-39008: :c:func:`PySys_Audit` now requires ``Py_ssize_t`` to be used - for size arguments in the format string, regardless of whether - ``PY_SSIZE_T_CLEAN`` was defined at include time. +- bpo-40208: Remove deprecated :meth:`symtable.SymbolTable.has_exec`. -Library -------- +- bpo-40196: Fix a bug in the :mod:`symtable` module that was causing + incorrectly report global variables as local. Patch by Pablo Galindo. -- bpo-39022: Update importlib.metadata to include improvements from - importlib_metadata 1.3 including better serialization of EntryPoints and - improved documentation for custom finders. +- bpo-40190: Add support for ``_SC_AIX_REALMEM`` to :func:`posix.sysconf`. -- bpo-38811: Fix an unhandled exception in :mod:`pathlib` when - :meth:`os.link` is missing. Patch by Toke Høiland-Jørgensen. +- bpo-40182: Removed the ``_field_types`` attribute of the + :class:`typing.NamedTuple` class. -- bpo-36406: Handle namespace packages in :mod:`doctest`. Patch by - Karthikeyan Singaravelan. +- bpo-36517: Multiple inheritance with :class:`typing.NamedTuple` now raises + an error instead of silently ignoring other types. -Tests ------ +- bpo-40126: Fixed reverting multiple patches in unittest.mock. Patcher's + ``__exit__()`` is now never called if its ``__enter__()`` is failed. + Returning true from ``__exit__()`` silences now the exception. -- bpo-38546: Multiprocessing and concurrent.futures tests now stop the - resource tracker process when tests complete. +- bpo-40094: CGIHTTPRequestHandler of http.server now logs the CGI script + exit code, rather than the CGI script exit status of os.waitpid(). For + example, if the script is killed by signal 11, it now logs: "CGI script + exit code -11." -Windows -------- +- bpo-40108: Improve the error message when triying to import a module using + :mod:`runpy` and incorrently use the ".py" extension at the end of the + module name. Patch by Pablo Galindo. -- bpo-39007: Add auditing events to functions in :mod:`winreg`. +- bpo-40094: Add :func:`os.waitstatus_to_exitcode` function: convert a wait + status to an exit code. -macOS ------ +- bpo-40089: Fix threading._after_fork(): if fork was not called by a thread + spawned by threading.Thread, threading._after_fork() now creates a + _MainThread instance for _main_thread, instead of a _DummyThread instance. -- bpo-38295: Prevent failure of test_relative_path in test_py_compile on - macOS Catalina. +- bpo-40089: Add a private ``_at_fork_reinit()`` method to + :class:`_thread.Lock`, :class:`_thread.RLock`, :class:`threading.RLock` + and :class:`threading.Condition` classes: reinitialize the lock at fork in + the child process, reset the lock to the unlocked state. Rename also the + private ``_reset_internal_locks()`` method of :class:`threading.Event` to + ``_at_fork_reinit()``. -IDLE ----- +- bpo-25780: Expose :data:`~socket.CAN_RAW_JOIN_FILTERS` in the + :mod:`socket` module. -- bpo-38944: Escape key now closes IDLE completion windows. Patch by Johnny - Najera. +- bpo-39503: :class:`~urllib.request.AbstractBasicAuthHandler` of + :mod:`urllib.request` now parses all WWW-Authenticate HTTP headers and + accepts multiple challenges per header: use the realm of the first Basic + challenge. -- bpo-38943: Fix IDLE autocomplete windows not always appearing on some - systems. Patch by Johnny Najera. +- bpo-39812: Removed daemon threads from :mod:`concurrent.futures` by adding + an internal `threading._register_atexit()`, which calls registered + functions prior to joining all non-daemon threads. This allows for + compatibility with subinterpreters, which don't support daemon threads. +- bpo-40050: Fix ``importlib._bootstrap_external``: avoid creating a new + ``winreg`` builtin module if it's already available in + :data:`sys.modules`, and remove redundant imports. -What's New in Python 3.8.1 release candidate 1? -=============================================== +- bpo-40014: Fix ``os.getgrouplist()``: if ``getgrouplist()`` function fails + because the group list is too small, retry with a larger group list. On + failure, the glibc implementation of ``getgrouplist()`` sets ``ngroups`` + to the total number of groups. For other implementations, double the group + list size. -*Release date: 2019-12-09* +- bpo-40017: Add :data:`time.CLOCK_TAI` constant if the operating system + support it. -Security --------- +- bpo-40016: In re docstring, clarify the relationship between inline and + argument compile flags. -- bpo-38945: Newline characters have been escaped when performing uu - encoding to prevent them from overflowing into to content section of the - encoded file. This prevents malicious or accidental modification of data - during the decoding process. +- bpo-39953: Update internal table of OpenSSL error codes in the ``ssl`` + module. -- bpo-37228: Due to significant security concerns, the *reuse_address* - parameter of :meth:`asyncio.loop.create_datagram_endpoint` is no longer - supported. This is because of the behavior of ``SO_REUSEADDR`` in UDP. For - more details, see the documentation for - ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine - Pitrou, and Yury Selivanov in :issue:`37228`.) +- bpo-36144: Added :pep:`584` operators to + :class:`weakref.WeakValueDictionary`. -- bpo-38722: :mod:`runpy` now uses :meth:`io.open_code` to open code files. - Patch by Jason Killen. +- bpo-36144: Added :pep:`584` operators to + :class:`weakref.WeakKeyDictionary`. -- bpo-38804: Fixes a ReDoS vulnerability in :mod:`http.cookiejar`. Patch by - Ben Caller. +- bpo-38891: Fix linear runtime behaviour of the `__getitem__` and + `__setitem__` methods in + :class:`multiprocessing.shared_memory.ShareableList`. This avoids + quadratic performance when iterating a `ShareableList`. Patch by Thomas + Krennwallner. -- bpo-38622: Add additional audit events for the :mod:`ctypes` module. +- bpo-39682: Remove undocumented support for *closing* a `pathlib.Path` + object via its context manager. The context manager magic methods remain, + but they are now a no-op, making `Path` objects immutable. -- bpo-38418: Fixes audit event for :func:`os.system` to be named - ``os.system``. +- bpo-36144: Added :pep:`584` operators (``|`` and ``|=``) to + :class:`collections.ChainMap`. -Core and Builtins ------------------ +- bpo-39011: Normalization of line endings in ElementTree attributes was + removed, as line endings which were replaced by entity numbers should be + preserved in original form. -- bpo-38673: In REPL mode, don't switch to PS2 if the line starts with - comment or whitespace. Based on work by Batuhan Taşkaya. +- bpo-38410: Properly handle :func:`sys.audit` failures in + :func:`sys.set_asyncgen_hooks`. -- bpo-38922: Calling ``replace`` on a code object now raises the - ``code.__new__`` audit event. +- bpo-36541: lib2to3 now recognizes named assignment expressions (the walrus + operator, ``:=``) -- bpo-38920: Add audit hooks for when :func:`sys.excepthook` and - :func:`sys.unraisablehook` are invoked +- bpo-35967: In platform, delay the invocation of 'uname -p' until the + processor attribute is requested. -- bpo-38892: Improve documentation for audit events table and functions. +- bpo-35113: :meth:`inspect.getsource` now returns correct source code for + inner class with same name as module level class. Decorators are also + returned as part of source of the class. Patch by Karthikeyan + Singaravelan. -- bpo-38707: ``MainThread.native_id`` is now correctly reset in child - processes spawned using :class:`multiprocessing.Process`, instead of - retaining the parent's value. +- bpo-33262: Deprecate passing None as an argument for + :func:`shlex.split()`'s ``s`` parameter. Patch by Zackery Spytz. -- bpo-38640: Fixed a bug in the compiler that was causing to raise in the - presence of break statements and continue statements inside always false - while loops. Patch by Pablo Galindo. +- bpo-31758: Prevent crashes when using an uninitialized + ``_elementtree.XMLParser`` object. Patch by Oren Milman. -- bpo-38535: Fixed line numbers and column offsets for AST nodes for calls - without arguments in decorators. +Documentation +------------- -- bpo-38525: Fix a segmentation fault when using reverse iterators of empty - ``dict`` objects. Patch by Dong-hee Na and Inada Naoki. +- bpo-27635: The pickle documentation incorrectly claimed that ``__new__`` + isn't called by default when unpickling. -- bpo-35409: Ignore GeneratorExit exceptions when throwing an exception into - the aclose coroutine of an asynchronous generator. +- bpo-39879: Updated :ref:`datamodel` docs to include :func:`dict` insertion + order preservation. Patch by Furkan Onder and Samy Lahfa. -Library -------- +- bpo-38387: Document :c:macro:`PyDoc_STRVAR` macro in the C-API reference. -- bpo-39006: Fix asyncio when the ssl module is missing: only check for - ssl.SSLSocket instance if the ssl module is available. +- bpo-13743: Some methods within xml.dom.minidom.Element class are now + better documented. -- bpo-38708: Fix a potential IndexError in email parser when parsing an - empty msg-id. +Tests +----- -- bpo-38698: Add a new ``InvalidMessageID`` token to email parser to - represent invalid Message-ID headers. Also, add defects when there is - remaining value after parsing the header. +- bpo-31904: Set expected default encoding in test_c_locale_coercion.py for + VxWorks RTOS. -- bpo-38979: Return class from ``ContextVar.__class_getitem__`` to simplify - subclassing. +- bpo-40162: Update Travis CI configuration to OpenSSL 1.1.1f. -- bpo-38986: Make repr of C accelerated TaskWakeupMethWrapper the same as of - pure Python version. +- bpo-40146: Update OpenSSL to 1.1.1f in Azure Pipelines. -- bpo-38529: Drop too noisy asyncio warning about deletion of a stream - without explicit ``.close()`` call. +- bpo-40094: Add :func:`test.support.wait_process` function. -- bpo-38634: The :mod:`readline` module now detects if Python is linked to - libedit at runtime on all platforms. Previously, the check was only done - on macOS. +- bpo-40003: ``test.bisect_cmd`` now copies Python command line options like + ``-O`` or ``-W``. Moreover, emit a warning if ``test.bisect_cmd`` is used + with ``-w``/``--verbose2`` option. -- bpo-33684: Fix ``json.tool`` failed to read a JSON file with non-ASCII - characters when locale encoding is not UTF-8. +- bpo-39380: Add the encoding in :class:`ftplib.FTP` and + :class:`ftplib.FTP_TLS` to the constructor as keyword-only and change the + default from ``latin-1`` to ``utf-8`` to follow :rfc:`2640`. -- bpo-38698: Prevent UnboundLocalError to pop up in parse_message_id +- bpo-39793: Use the same domain when testing ``make_msgid``. Patch by + Batuhan Taskaya. - parse_message_id() was improperly using a token defined inside an - exception handler, which was raising `UnboundLocalError` on parsing an - invalid value. Patch by Claudiu Popa. +- bpo-1812: Fix newline handling in doctest.testfile when loading from a + package whose loader has a get_data method. Patch by Peter Donis. -- bpo-26730: Fix ``SpooledTemporaryFile.rollover()`` might corrupt the file - when it is in text mode. Patch by Serhiy Storchaka. +Build +----- -- bpo-38668: Calling func:`shutil.copytree` to copy a directory tree from - one directory to another subdirectory resulted in an endless loop and a - RecursionError. A fix was added to consume an iterator and create the list - of the entries to be copied, avoiding the recursion for newly created - directories. Patch by Bruno P. Kinoshita. +- bpo-38360: Support single-argument form of macOS -isysroot flag. -- bpo-37838: :meth:`typing.get_type_hints` properly handles functions - decorated with :meth:`functools.wraps`. +- bpo-40158: Fix CPython MSBuild Properties in NuGet Package + (build/native/python.props) -- bpo-38859: AsyncMock now returns StopAsyncIteration on the exaustion of a - side_effects iterable. Since PEP-479 its Impossible to raise a - StopIteration exception from a coroutine. +- bpo-38527: Fix configure check on Solaris for "float word ordering": + sometimes, the correct "grep" command was not being used. Patch by Arnon + Yaari. -- bpo-38857: AsyncMock fix for return values that are awaitable types. This - also covers side_effect iterable values that happend to be awaitable, and - wraps callables that return an awaitable type. Before these awaitables - were being awaited instead of being returned as is. +Windows +------- -- bpo-38821: Fix unhandled exceptions in :mod:`argparse` when - internationalizing error messages for arguments with ``nargs`` set to - special (non-integer) values. Patch by Federico Bond. +- bpo-40164: Updates Windows to OpenSSL 1.1.1f -- bpo-38820: Make Python compatible with OpenSSL 3.0.0. - :func:`ssl.SSLSocket.getpeercert` no longer returns IPv6 addresses with a - trailing new line. +- bpo-8901: Ignore the Windows registry when the ``-E`` option is used. -- bpo-38807: Update :exc:`TypeError` messages for :meth:`os.path.join` to - include :class:`os.PathLike` objects as acceptable input types. +macOS +----- -- bpo-38785: Prevent asyncio from crashing if parent ``__init__`` is not - called from a constructor of object derived from ``asyncio.Future``. +- bpo-38329: python.org macOS installers now update the Current version + symlink of /Library/Frameworks/Python.framework/Versions for 3.9 installs. + Previously, Current was only updated for Python 2.x installs. This should + make it easier to embed Python 3 into other macOS applications. -- bpo-38723: :mod:`pdb` now uses :meth:`io.open_code` to trigger auditing - events. +- bpo-40164: Update macOS installer builds to use OpenSSL 1.1.1g. -- bpo-27805: Allow opening pipes and other non-seekable files in append mode - with :func:`open`. +IDLE +---- -- bpo-38686: Added support for multiple ``qop`` values in - :class:`urllib.request.AbstractDigestAuthHandler`. +- bpo-38439: Add a 256×256 pixel IDLE icon to support more modern + environments. Created by Andrew Clover. Delete the unused macOS idle.icns + icon file. -- bpo-38334: Fixed seeking backward on an encrypted - :class:`zipfile.ZipExtFile`. +- bpo-38689: IDLE will no longer freeze when inspect.signature fails when + fetching a calltip. -- bpo-34679: asynci.ProactorEventLoop.close() now only calls - signal.set_wakeup_fd() in the main thread. +Tools/Demos +----------- -- bpo-31202: The case the result of :func:`pathlib.WindowsPath.glob` matches - now the case of the pattern for literal parts. +- bpo-40385: Removed the checkpyc.py tool. Please see compileall without + force mode as a potential alternative. -- bpo-38521: Fixed erroneous equality comparison in statistics.NormalDist(). +- bpo-40179: Fixed translation of ``#elif`` in Argument Clinic. -- bpo-38478: Fixed a bug in :meth:`inspect.signature.bind` that was causing - it to fail when handling a keyword argument with same name as - positional-only parameter. Patch by Pablo Galindo. +- bpo-40094: Fix ``which.py`` script exit code: it now uses + :func:`os.waitstatus_to_exitcode` to convert :func:`os.system` exit status + into an exit code. -- bpo-33604: Fixed `hmac.new` and `hmac.HMAC` to raise TypeError instead of - ValueError when the digestmod parameter, now required in 3.8, is omitted. - Also clarified the hmac module documentation and docstrings. +C API +----- -- bpo-38422: Clarify docstrings of pathlib suffix(es) +- bpo-40241: Move the :c:type:`PyGC_Head` structure to the internal C API. -- bpo-36993: Improve error reporting for corrupt zip files with bad zip64 - extra data. Patch by Daniel Hillier. +- bpo-40170: Convert :c:func:`PyObject_IS_GC` macro to a function to hide + implementation details. -- bpo-36820: Break cycle generated when saving an exception in socket.py, - codeop.py and dyld.py as they keep alive not only the exception but user - objects through the ``__traceback__`` attribute. Patch by Mario Corchero. +- bpo-40241: Add the functions :c:func:`PyObject_GC_IsTracked` and + :c:func:`PyObject_GC_IsFinalized` to the public API to allow to query if + Python objects are being currently tracked or have been already finalized + by the garbage collector respectively. Patch by Pablo Galindo. -- bpo-34776: Fix dataclasses to support forward references in type - annotations +- bpo-40170: The :c:func:`PyObject_NEW` macro becomes an alias to the + :c:func:`PyObject_New` macro, and the :c:func:`PyObject_NEW_VAR` macro + becomes an alias to the :c:func:`PyObject_NewVar` macro, to hide + implementation details. They no longer access directly the + :c:member:`PyTypeObject.tp_basicsize` member. -- bpo-33348: lib2to3 now recognizes expressions after ``*`` and `**` like in - ``f(*[] or [])``. +- bpo-40170: :c:func:`PyType_HasFeature` now always calls + :c:func:`PyType_GetFlags` to hide implementation details. Previously, it + accessed directly the :c:member:`PyTypeObject.tp_flags` member when the + limited C API was not used. -- bpo-27657: Fix urllib.parse.urlparse() with numeric paths. A string like - "path:80" is no longer parsed as a path but as a scheme ("path") and a - path ("80"). +- bpo-40170: Convert the :c:func:`PyObject_GET_WEAKREFS_LISTPTR` macro to a + function to hide implementation details: the macro accessed directly to + the :c:member:`PyTypeObject.tp_weaklistoffset` member. -Documentation -------------- +- bpo-40170: Convert :c:func:`PyObject_CheckBuffer` macro to a function to + hide implementation details: the macro accessed directly the + :c:member:`PyTypeObject.tp_as_buffer` member. -- bpo-38816: Provides more details about the interaction between - :c:func:`fork` and CPython's runtime, focusing just on the C-API. This - includes cautions about where :c:func:`fork` should and shouldn't be - called. +- bpo-40170: Always declare :c:func:`PyIndex_Check` as an opaque function to + hide implementation details: remove ``PyIndex_Check()`` macro. The macro + accessed directly the :c:member:`PyTypeObject.tp_as_number` member. -- bpo-38351: Modernize :mod:`email` examples from %-formatting to f-strings. +- bpo-39947: Add :c:func:`PyThreadState_GetID` function: get the unique + identifier of a Python thread state. -- bpo-38778: Document the fact that :exc:`RuntimeError` is raised if - :meth:`os.fork` is called in a subinterpreter. -- bpo-38592: Add Brazilian Portuguese to the language switcher at Python - Documentation website. +What's New in Python 3.9.0 alpha 5? +=================================== -Tests ------ +*Release date: 2020-03-23* -- bpo-38547: Fix test_pty: if the process is the session leader, closing the - master file descriptor raises a SIGHUP signal: simply ignore SIGHUP when - running the tests. +Security +-------- -- bpo-38992: Fix a test for :func:`math.fsum` that was failing due to - constant folding. +- bpo-38576: Disallow control characters in hostnames in http.client, + addressing CVE-2019-18348. Such potentially malicious header injection + URLs now cause a InvalidURL to be raised. -- bpo-38965: Fix test_faulthandler on GCC 10. Use the "volatile" keyword in - ``faulthandler._stack_overflow()`` to prevent tail call optimization on - any compiler, rather than relying on compiler specific pragma. +Core and Builtins +----------------- -- bpo-38875: test_capi: trashcan tests now require the test "cpu" resource. +- bpo-40010: Optimize pending calls in multithreaded applications. If a + thread different than the main thread schedules a pending call + (:c:func:`Py_AddPendingCall`), the bytecode evaluation loop is no longer + interrupted at each bytecode instruction to check for pending calls which + cannot be executed. Only the main thread can execute pending calls. -- bpo-38841: Skip asyncio test_create_datagram_endpoint_existing_sock_unix - on platforms lacking a functional bind() for named unix domain sockets. + Previously, the bytecode evaluation loop was interrupted at each + instruction until the main thread executes pending calls. -- bpo-38669: Raise :exc:`TypeError` when passing target as a string with - :meth:`unittest.mock.patch.object`. +- bpo-1635741: Port _weakref extension module to multiphase initialization + (:pep:`489`). -- bpo-35998: Fix a race condition in test_asyncio.test_start_tls_server_1(). - Previously, there was a race condition between the test main() function - which replaces the protocol and the test ServerProto protocol which sends - ANSWER once it gets HELLO. Now, only the test main() function is - responsible to send data, ServerProto no longer sends data. +- bpo-1635741: Port _collections module to multiphase initialization + (:pep:`489`). -Build ------ +- bpo-40010: Optimize signal handling in multithreaded applications. If a + thread different than the main thread gets a signal, the bytecode + evaluation loop is no longer interrupted at each bytecode instruction to + check for pending signals which cannot be handled. Only the main thread of + the main interpreter can handle signals. -- bpo-37404: :mod:`asyncio` now raises :exc:`TyperError` when calling - incompatible methods with an :class:`ssl.SSLSocket` socket. Patch by Ido - Michael. + Previously, the bytecode evaluation loop was interrupted at each + instruction until the main thread handles signals. -- bpo-38809: On Windows, build scripts will now recognize and use python.exe - from an active virtual env. +- bpo-39984: If :c:func:`Py_AddPendingCall` is called in a subinterpreter, + the function is now scheduled to be called from the subinterpreter, rather + than being called from the main interpreter. Each subinterpreter now has + its own list of scheduled calls. -- bpo-38684: Fix _hashlib build when Blake2 is disabled, but OpenSSL - supports it. +- bpo-1635741: Port _heapq module to multiphase initialization. -- bpo-37415: Fix stdatomic.h header check for ICC compiler: the ICC - implementation lacks atomic_uintptr_t type which is needed by Python. +- bpo-1635741: Port itertools module to multiphase initialization + (:pep:`489`). -Windows -------- +- bpo-37207: Speed up calls to ``frozenset()`` by using the :pep:`590` + ``vectorcall`` calling convention. Patch by Dong-hee Na. -- bpo-33125: Add support for building and releasing Windows ARM64 packages. +- bpo-39984: subinterpreters: Move + ``_PyRuntimeState.ceval.tracing_possible`` to + ``PyInterpreterState.ceval.tracing_possible``: each interpreter now has + its own variable. -- bpo-38589: Fixes HTML Help shortcut when Windows is not installed to C - drive +- bpo-37207: Speed up calls to ``set()`` by using the :pep:`590` + ``vectorcall`` calling convention. Patch by Dong-hee Na. -- bpo-38453: Ensure ntpath.realpath() correctly resolves relative paths. +- bpo-1635741: Port _statistics module to multiphase initialization + (:pep:`489`). -- bpo-38519: Restores the internal C headers that were missing from the - nuget.org and Microsoft Store packages. +- bpo-39968: Use inline function to replace extension modules' + get_module_state macros. -- bpo-38492: Remove ``pythonw.exe`` dependency on the Microsoft C++ runtime. +- bpo-39965: Correctly raise ``SyntaxError`` if *await* is used inside + non-async functions and ``PyCF_ALLOW_TOP_LEVEL_AWAIT`` is set (like in the + asyncio REPL). Patch by Pablo Galindo. -macOS ------ +- bpo-39562: Allow executing asynchronous comprehensions on the top level + when the ``PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag is given. Patch by Batuhan + Taskaya. -- bpo-37931: Fixed a crash on OSX dynamic builds that occurred when - re-initializing the posix module after a Py_Finalize if the environment - had changed since the previous `import posix`. Patch by Benoît Hudson. +- bpo-37207: Speed up calls to ``tuple()`` by using the :pep:`590` + ``vectorcall`` calling convention. Patch by Dong-hee Na. -IDLE ----- +- bpo-38373: Chaged list overallocation strategy. It no longer overallocates + if the new size is closer to overalocated size than to the old size and + adds padding. -- bpo-38862: 'Strip Trailing Whitespace' on the Format menu removes extra - newlines at the end of non-shell files. +- bpo-39926: Update Unicode database to Unicode version 13.0.0. -- bpo-26353: Stop adding newline when saving an IDLE shell window. +- bpo-19466: Clear the frames of daemon threads earlier during the Python + shutdown to call objects destructors. So "unclosed file" resource warnings + are now emitted for daemon threads in a more reliable way. -- bpo-38636: Fix IDLE Format menu tab toggle and file indent width. These - functions (default shortcuts Alt-T and Alt-U) were mistakenly disabled in - 3.7.5 and 3.8.0. +- bpo-38894: Fix a bug that was causing incomplete results when calling + ``pathlib.Path.glob`` in the presence of symlinks that point to files + where the user does not have read access. Patch by Pablo Galindo and Matt + Wozniski. -- bpo-4630: Add an option to toggle IDLE's cursor blink for shell, editor, - and output windows. See Settings, General, Window Preferences, Cursor - Blink. Patch by Zackery Spytz. +- bpo-39877: Fix :c:func:`PyEval_RestoreThread` random crash at exit with + daemon threads. It now accesses the ``_PyRuntime`` variable directly + instead of using ``tstate->interp->runtime``, since ``tstate`` can be a + dangling pointer after :c:func:`Py_Finalize` has been called. Moreover, + the daemon thread now exits before trying to take the GIL. -- bpo-38598: Do not try to compile IDLE shell or output windows +- bpo-39871: Fix a possible :exc:`SystemError` in + ``math.{atan2,copysign,remainder}()`` when the first argument cannot be + converted to a :class:`float`. Patch by Zackery Spytz. -C API ------ +- bpo-39776: Fix race condition where threads created by PyGILState_Ensure() + could get a duplicate id. -- bpo-37633: Re-export some function compatibility wrappers for macros in - ``pythonrun.h``. + This affects consumers of tstate->id like the contextvar caching + machinery, which could return invalid cached objects under heavy thread + load (observed in embedded scenarios). -- bpo-38540: Fixed possible leak in :c:func:`PyArg_Parse` and similar - functions for format units ``"es#"`` and ``"et#"`` when the macro - :c:macro:`PY_SSIZE_T_CLEAN` is not defined. +- bpo-39778: Fixed a crash due to incorrect handling of weak references in + ``collections.OrderedDict`` classes. Patch by Pablo Galindo. -- bpo-36389: The ``_PyObject_CheckConsistency()`` function is now also - available in release mode. For example, it can be used to debug a crash in - the ``visit_decref()`` function of the GC. +- bpo-1635741: Port audioop extension module to multiphase initialization + (:pep:`489`). +- bpo-39702: Relax :term:`decorator` grammar restrictions to allow any valid + expression (:pep:`614`). -What's New in Python 3.8.0 final? -================================= +- bpo-38091: Tweak import deadlock detection code to not deadlock itself. -*Release date: 2019-10-14* +- bpo-1635741: Port _locale extension module to multiphase initialization + (:pep:`489`). -Core and Builtins ------------------ +- bpo-39087: Optimize :c:func:`PyUnicode_AsUTF8` and + :c:func:`PyUnicode_AsUTF8AndSize` slightly when they need to create + internal UTF-8 cache. -- bpo-38469: Fixed a bug where the scope of named expressions was not being - resolved correctly in the presence of the *global* keyword. Patch by Pablo - Galindo. +- bpo-39520: Fix unparsing of ext slices with no items (``foo[:,]``). Patch + by Batuhan Taskaya. -- bpo-38379: When cyclic garbage collection (gc) runs finalizers that - resurrect unreachable objects, the current gc run ends, without collecting - any cyclic trash. However, the statistics reported by ``collect()`` and - ``get_stats()`` claimed that all cyclic trash found was collected, and - that the resurrected objects were collected. Changed the stats to report - that none were collected. +- bpo-39220: Do not optimize annotations if 'from __future__ import + annotations' is used. Patch by Pablo Galindo. + +- bpo-35712: Using :data:`NotImplemented` in a boolean context has been + deprecated. Patch contributed by Josh Rosenberg. + +- bpo-22490: Don't leak environment variable ``__PYVENV_LAUNCHER__`` into + the interpreter session on macOS. Library ------- -- bpo-38449: Revert GH-15522, which introduces a regression in - :meth:`mimetypes.guess_type` due to improper handling of filenames as - urls. +- bpo-39830: Add :class:`zipfile.Path` to ``__all__`` in the :mod:`zipfile` + module. -- bpo-38431: Fix ``__repr__`` method for :class:`dataclasses.InitVar` to - support typing objects, patch by Samuel Colvin. +- bpo-40000: Improved error messages for validation of ``ast.Constant`` + nodes. Patch by Batuhan Taskaya. -- bpo-38109: Add missing :data:`stat.S_IFDOOR`, :data:`stat.S_IFPORT`, - :data:`stat.S_IFWHT`, :func:`stat.S_ISDOOR`, :func:`stat.S_ISPORT`, and - :func:`stat.S_ISWHT` values to the Python implementation of :mod:`stat`. +- bpo-39999: ``__module__`` of the AST node classes is now set to "ast" + instead of "_ast". Added docstrings for dummy AST node classes and + deprecated attributes. -- bpo-38405: Nested subclasses of :class:`typing.NamedTuple` are now - pickleable. +- bpo-39991: :func:`uuid.getnode` now skips IPv6 addresses with the same + string length than a MAC address (17 characters): only use MAC addresses. -- bpo-38332: Prevent :exc:`KeyError` thrown by :func:`_encoded_words.decode` - when given an encoded-word with invalid content-type encoding from - propagating all the way to :func:`email.message.get`. +- bpo-39988: Deprecated ``ast.AugLoad`` and ``ast.AugStore`` node classes + because they are no longer used. -- bpo-38341: Add :exc:`smtplib.SMTPNotSupportedError` to the :mod:`smtplib` - exported names. +- bpo-39656: Ensure ``bin/python3.#`` is always present in virtual + environments on POSIX platforms - by Anthony Sottile. -- bpo-13153: OS native encoding is now used for converting between Python - strings and Tcl objects. This allows to display, copy and paste to - clipboard emoji and other non-BMP characters. Converting strings from Tcl - to Python and back now never fails (except MemoryError). +- bpo-39969: Deprecated ``ast.Param`` node class because it's no longer + used. Patch by Batuhan Taskaya. -Documentation -------------- +- bpo-39360: Ensure all workers exit when finalizing a + :class:`multiprocessing.Pool` implicitly via the module finalization + handlers of multiprocessing. This fixes a deadlock situation that can be + experienced when the Pool is not properly finalized via the context + manager or a call to ``multiprocessing.Pool.terminate``. Patch by Batuhan + Taskaya and Pablo Galindo. -- bpo-38294: Add list of no-longer-escaped chars to re.escape documentation. +- bpo-35370: sys.settrace(), sys.setprofile() and _lsprof.Profiler.enable() + now properly report :c:func:`PySys_Audit` error if "sys.setprofile" or + "sys.settrace" audit event is denied. -Tests ------ +- bpo-39936: AIX: Fix _aix_support module when the subprocess is not + available, when building Python from scratch. It now uses new private + _bootsubprocess module, rather than having two implementations depending + if subprocess is available or not. So _aix_support.aix_platform() result + is now the same if subprocess is available or not. -- bpo-37531: On timeout, regrtest no longer attempts to call - ``popen.communicate()`` again: it can hang until all child processes using - stdout and stderr pipes completes. Kill the worker process and ignores its - output. Change also the faulthandler timeout of the main process from 1 - minute to 5 minutes, for Python slowest buildbots. +- bpo-36144: :class:`collections.OrderedDict` now implements ``|`` and + ``|=`` (:pep:`584`). -Windows -------- +- bpo-39652: The column name found in ``sqlite3.Cursor.description`` is now + truncated on the first '[' only if the PARSE_COLNAMES option is set. -- bpo-38344: Fix error message in activate.bat. +- bpo-39915: Ensure :attr:`unittest.mock.AsyncMock.await_args_list` has call + objects in the order of awaited arguments instead of using + :attr:`unittest.mock.Mock.call_args` which has the last value of the call. + Patch by Karthikeyan Singaravelan. -- bpo-38359: Ensures ``pyw.exe`` launcher reads correct registry key. +- bpo-36144: Updated :data:`os.environ` and :data:`os.environb` to support + :pep:`584`'s merge (``|``) and update (``|=``) operators. -- bpo-38355: Fixes ``ntpath.realpath`` failing on ``sys.executable``. +- bpo-38662: The ``ensurepip`` module now invokes ``pip`` via the ``runpy`` + module. Hence it is no longer tightly coupled with the internal API of the + bundled ``pip`` version, allowing easier updates to a newer ``pip`` + version both internally and for distributors. -IDLE ----- +- bpo-38075: Fix the :meth:`random.Random.seed` method when a :class:`bool` + is passed as the seed. -- bpo-36698: IDLE no longer fails when write non-encodable characters to - stderr. It now escapes them with a backslash, as the regular Python - interpreter. Added the ``errors`` field to the standard streams. +- bpo-39916: More reliable use of ``os.scandir()`` in ``Path.glob()``. It no + longer emits a ResourceWarning when interrupted. -Tools/Demos ------------ +- bpo-39850: :mod:`multiprocessing` now supports abstract socket addresses + (if abstract sockets are supported in the running platform). When creating + arbitrary addresses (like when default-constructing + :class:`multiprocessing.connection.Listener` objects) abstract sockets are + preferred to avoid the case when the temporary-file-generated address is + too large for an AF_UNIX socket address. Patch by Pablo Galindo. -- bpo-38118: Update Valgrind suppression file to ignore a false alarm in - :c:func:`PyUnicode_Decode` when using GCC builtin strcmp(). +- bpo-36287: :func:`ast.dump()` no longer outputs optional fields and + attributes with default values. The default values for optional fields and + attributes of AST nodes are now set as class attributes (e.g. + ``Constant.kind`` is set to ``None``). -- bpo-38347: pathfix.py: Assume all files that end on '.py' are Python - scripts when working recursively. +- bpo-39889: Fixed :func:`ast.unparse` for extended slices containing a + single element (e.g. ``a[i:j,]``). Remove redundant tuples when index with + a tuple (e.g. ``a[i, j]``). -C API ------ +- bpo-39828: Fix :mod:`json.tool` to catch :exc:`BrokenPipeError`. Patch by + Dong-hee Na. -- bpo-38395: Fix a crash in :class:`weakref.proxy` objects due to incorrect - lifetime management when calling some associated methods that may delete - the last reference to object being referenced by the proxy. Patch by Pablo - Galindo. +- bpo-13487: Avoid a possible *"RuntimeError: dictionary changed size during + iteration"* from :func:`inspect.getmodule` when it tried to loop through + :attr:`sys.modules`. +- bpo-39674: Revert "bpo-37330: open() no longer accept 'U' in file mode". + The "U" mode of open() is kept in Python 3.9 to ease transition from + Python 2.7, but will be removed in Python 3.10. -What's New in Python 3.8.0 release candidate 1? -=============================================== +- bpo-28577: The hosts method on 32-bit prefix length IPv4Networks and + 128-bit prefix IPv6Networks now returns a list containing the single + Address instead of an empty list. -*Release date: 2019-10-01* +- bpo-39826: Add getConnection method to logging HTTPHandler to enable + custom connections. -Security --------- +- bpo-39763: Reimplement :func:`distutils.spawn.spawn` function with the + :mod:`subprocess` module. -- bpo-38243: Escape the server title of - :class:`xmlrpc.server.DocXMLRPCServer` when rendering the document page as - HTML. (Contributed by Dong-hee Na in :issue:`38243`.) +- bpo-39794: Add --without-decimal-contextvar build option. This enables a + thread-local rather than a coroutine local context. -- bpo-38174: Update vendorized expat library version to 2.2.8, which - resolves CVE-2019-15903. +- bpo-36144: :class:`collections.defaultdict` now implements ``|`` + (:pep:`584`). -- bpo-37764: Fixes email._header_value_parser.get_unstructured going into an - infinite loop for a specific case in which the email header does not have - trailing whitespace, and the case in which it contains an invalid encoded - word. Patch by Ashwin Ramaswami. +- bpo-39517: Fix runpy.run_path() when using pathlike objects -Core and Builtins ------------------ +- bpo-39775: Change ``inspect.Signature.parameters`` back to + ``collections.OrderedDict``. This was changed to ``dict`` in Python + 3.9.0a4. -- bpo-38006: Fix a bug due to the interaction of weakrefs and the cyclic - garbage collector. We must clear any weakrefs in garbage in order to - prevent their callbacks from executing and causing a crash. +- bpo-39678: Refactor queue_manager in + :class:`concurrent.futures.ProcessPoolExecutor` to make it easier to + maintain. -- bpo-38317: Fix warnings options priority: ``PyConfig.warnoptions`` has the - highest priority, as stated in the :pep:`587`. +- bpo-39764: Fix AttributeError when calling get_stack on a PyAsyncGenObject + Task -- bpo-36871: Improve error handling for the assert_has_calls and - assert_has_awaits methods of mocks. Fixed a bug where any errors - encountered while binding the expected calls to the mock's spec were - silently swallowed, leading to misleading error output. +- bpo-39769: The :func:`compileall.compile_dir` function's *ddir* parameter + and the compileall command line flag `-d` no longer write the wrong + pathname to the generated pyc file for submodules beneath the root of the + directory tree being compiled. This fixes a regression introduced with + Python 3.5. -- bpo-38236: Python now dumps path configuration if it fails to import the - Python codecs of the filesystem and stdio encodings. +- bpo-36144: :class:`types.MappingProxyType` objects now support the merge + (``|``) operator from :pep:`584`. -- bpo-38013: Allow to call ``async_generator_athrow().throw(...)`` even for - non-started async generator helper. It fixes annoying warning at the end - of :func:`asyncio.run` call. +- bpo-38691: The :mod:`importlib` module now ignores the + :envvar:`PYTHONCASEOK` environment variable when the :option:`-E` or + :option:`-I` command line options are being used. -- bpo-38124: Fix an off-by-one error in PyState_AddModule that could cause - out-of-bounds memory access. +- bpo-39719: Remove :meth:`tempfile.SpooledTemporaryFile.softspace` as files + no longer have the ``softspace`` attribute in Python 3. Patch by Shantanu. -- bpo-38005: Fixed comparing and creating of InterpreterID and ChannelID. +- bpo-39667: Improve pathlib.Path compatibility on zipfile.Path and correct + performance degradation as found in zipp 3.0. -- bpo-37994: Fixed silencing arbitrary errors if an attribute lookup fails - in several sites. Only AttributeError should be silenced. +- bpo-39638: Keep ASDL signatures in the docstrings for ``AST`` nodes. Patch + by Batuhan Taskaya -- bpo-37990: Fix elapsed time in gc stats was not printed correctly. This - bug was a regression in 3.8b4. +- bpo-39639: Deprecated ``ast.Suite`` node class because it's no longer + used. Patch by Batuhan Taskaya. -- bpo-37966: The implementation of :func:`~unicodedata.is_normalized` has - been greatly sped up on strings that aren't normalized, by implementing - the full normalization-quick-check algorithm from the Unicode standard. +- bpo-39609: Add thread_name_prefix to default asyncio executor -- bpo-20490: Improve import error message for partially initialized module - on circular ``from`` imports - by Anthony Sottile. +- bpo-39548: Fix handling of header in + :class:`urllib.request.AbstractDigestAuthHandler` when the optional + ``qop`` parameter is not present. -- bpo-37409: Ensure explicit relative imports from interactive sessions and - scripts (having no parent package) always raise ImportError, rather than - treating the current module as the package. Patch by Ben Lewis. +- bpo-39509: HTTP status codes ``103 EARLY_HINTS`` and ``425 TOO_EARLY`` are + added to :class:`http.HTTPStatus`. Patch by Dong-hee Na. -- bpo-37619: When adding a wrapper descriptor from one class to a different - class (for example, setting ``__add__ = str.__add__`` on an ``int`` - subclass), an exception is correctly raised when the operator is called. +- bpo-39507: Adding HTTP status 418 "I'm a Teapot" to HTTPStatus in http + library. Patch by Ross Rhodes. -- bpo-30773: Prohibit parallel running of aclose() / asend() / athrow(). Fix - ag_running to reflect the actual running status of the AG. +- bpo-39495: Remove default value from *attrs* parameter of + :meth:`xml.etree.ElementTree.TreeBuilder.start` for consistency between + Python and C implementations. -Library -------- +- bpo-38971: Open issue in the BPO indicated a desire to make the + implementation of codecs.open() at parity with io.open(), which implements + a try/except to assure file stream gets closed before an exception is + raised. -- bpo-38319: sendfile() used in socket and shutil modules was raising - OverflowError for files >= 2GiB on 32-bit architectures. (patch by - Giampaolo Rodola) +- bpo-38641: Added starred expressions support to ``return`` and ``yield`` + statements for ``lib2to3``. Patch by Vlad Emelianov. -- bpo-38242: Revert the new asyncio Streams API +- bpo-37534: When using minidom module to generate XML documents the ability + to add Standalone Document Declaration is added. All the changes are made + to generate a document in compliance with Extensible Markup Language (XML) + 1.0 (Fifth Edition) W3C Recommendation (available here: + https://www.w3.org/TR/xml/#sec-prolog-dtd). -- bpo-38019: Correctly handle pause/resume reading of closed asyncio unix - pipe. +- bpo-34788: Add support for scoped IPv6 addresses to :mod:`ipaddress`. + Patch by Oleksandr Pavliuk. -- bpo-38163: Child mocks will now detect their type as either synchronous or - asynchronous, asynchronous child mocks will be AsyncMocks and synchronous - child mocks will be either MagicMock or Mock (depending on their parent - type). +- bpo-34822: Simplified AST for subscription. Simple indices are now + represented by their value, extended slices are represented as tuples. + :mod:`ast` classes ``Index`` and ``ExtSlice`` are considered deprecated + and will be removed in future Python versions. In the meantime, + ``Index(value)`` now returns a ``value`` itself, ``ExtSlice(slices)`` + returns ``Tuple(slices, Load())``. -- bpo-38161: Removes _AwaitEvent from AsyncMock. +Documentation +------------- -- bpo-38216: Allow the rare code that wants to send invalid http requests - from the `http.client` library a way to do so. The fixes for bpo-30458 - led to breakage for some projects that were relying on this ability to - test their own behavior in the face of bad requests. +- bpo-39868: Updated the Language Reference for :pep:`572`. -- bpo-38108: Any synchronous magic methods on an AsyncMock now return a - MagicMock. Any asynchronous magic methods on a MagicMock now return an - AsyncMock. +- bpo-13790: Change 'string' to 'specification' in format doc. -- bpo-38248: asyncio: Fix inconsistent immediate Task cancellation +- bpo-17422: The language reference no longer restricts default class + namespaces to dicts only. -- bpo-38237: The arguments for the builtin pow function are more - descriptive. They can now also be passed in as keywords. +- bpo-39530: Fix misleading documentation about mixed-type numeric + comparisons. -- bpo-38191: Constructors of :class:`~typing.NamedTuple` and - :class:`~typing.TypedDict` types now accept arbitrary keyword argument - names, including "cls", "self", "typename", "_typename", "fields" and - "_fields". Passing positional arguments by keyword is deprecated. +- bpo-39718: Update :mod:`token` documentation to reflect additions in + Python 3.8 -- bpo-38185: Fixed case-insensitive string comparison in - :class:`sqlite3.Row` indexing. +- bpo-39677: Changed operand name of **MAKE_FUNCTION** from *argc* to + *flags* for module :mod:`dis` -- bpo-38136: Changes AsyncMock call count and await count to be two - different counters. Now await count only counts when a coroutine has been - awaited, not when it has been called, and vice-versa. Update the - documentation around this. +Tests +----- -- bpo-37828: Fix default mock name in - :meth:`unittest.mock.Mock.assert_called` exceptions. Patch by Abraham - Toriz Cruz. +- bpo-40019: test_gdb now skips tests if it detects that gdb failed to read + debug information because the Python binary is optimized. -- bpo-38175: Fix a memory leak in comparison of :class:`sqlite3.Row` - objects. +- bpo-27807: ``test_site.test_startup_imports()`` is now skipped if a path + of :data:`sys.path` contains a ``.pth`` file. -- bpo-33936: _hashlib no longer calls obsolete OpenSSL initialization - function with OpenSSL 1.1.0+. +- bpo-26067: Do not fail test_shutil test_chown test when uid or gid of user + cannot be resolved to a name. -- bpo-34706: Preserve subclassing in inspect.Signature.from_callable. +- bpo-39855: test_subprocess.test_user() now skips the test on an user name + if the user name doesn't exist. For example, skip the test if the user + "nobody" doesn't exist on Linux. -- bpo-38153: Names of hashing algorithms frome OpenSSL are now normalized to - follow Python's naming conventions. For example OpenSSL uses sha3-512 - instead of sha3_512 or blake2b512 instead of blake2b. +Build +----- -- bpo-38115: Fix a bug in dis.findlinestarts() where it would return invalid - bytecode offsets. Document that a code object's co_lnotab can contain - invalid bytecode offsets. +- bpo-39761: Fix build with DTrace but without additional DFLAGS. -- bpo-38148: Add slots to :mod:`asyncio` transport classes, which can reduce - memory usage. +- bpo-39763: setup.py now uses a basic implementation of the + :mod:`subprocess` module if the :mod:`subprocess` module is not available: + before required C extension modules are built. -- bpo-36991: Fixes a potential incorrect AttributeError exception escaping - ZipFile.extract() in some unsupported input error situations. +- bpo-1294959: Add ``--with-platlibdir`` option to the configure script: + name of the platform-specific library directory, stored in the new + :attr:`sys.platlibdir` attribute. It is used to build the path of + platform-specific extension modules and the path of the standard library. + It is equal to ``"lib"`` on most platforms. On Fedora and SuSE, it is + equal to ``"lib64"`` on 64-bit platforms. Patch by Jan Matějek, Matěj + Cepl, Charalampos Stratakis and Victor Stinner. -- bpo-38134: Remove obsolete copy of PBKDF2_HMAC_fast. All supported OpenSSL - versions contain a fast implementation. +Windows +------- -- bpo-38132: The OpenSSL hashlib wrapper uses a simpler implementation. - Several Macros and pointless caches are gone. The hash name now comes from - OpenSSL's EVP. The algorithm name stays the same, except it is now always - lower case. +- bpo-39930: Ensures the required :file:`vcruntime140.dll` is included in + install packages. -- bpo-38008: Fix parent class check in protocols to correctly identify the - module that provides a builtin protocol, instead of assuming they all come - from the :mod:`collections.abc` module +- bpo-39847: Avoid hang when computer is hibernated whilst waiting for a + mutex (for lock-related objects from :mod:`threading`) around 49-day + uptime. -- bpo-37405: Fixed regression bug for socket.getsockname() for non-CAN_ISOTP - AF_CAN address family sockets by returning a 1-tuple instead of string. +- bpo-38597: :mod:`distutils` will no longer statically link + :file:`vcruntime140.dll` when a redistributable version is unavailable. + All future releases of CPython will include a copy of this DLL to ensure + distributed extensions can continue to load. -- bpo-38121: Update parameter names on functions in importlib.metadata - matching the changes in the 0.22 release of importlib_metadata. +- bpo-38380: Update Windows builds to use SQLite 3.31.1 -- bpo-38110: The os.closewalk() implementation now uses the libc fdwalk() - API on platforms where it is available. +- bpo-39789: Update Windows release build machines to Visual Studio 2019 + (MSVC 14.2). -- bpo-38093: Fixes AsyncMock so it doesn't crash when used with - AsyncContextManagers or AsyncIterators. +- bpo-34803: Package for nuget.org now includes repository reference and + bundled icon image. -- bpo-37488: Add warning to :meth:`datetime.utctimetuple`, - :meth:`datetime.utcnow` and :meth:`datetime.utcfromtimestamp` . +macOS +----- -- bpo-38086: Update importlib.metadata with changes from `importlib_metadata - 0.21 - `_. +- bpo-38380: Update macOS builds to use SQLite 3.31.1 -- bpo-37251: Remove `__code__` check in AsyncMock that incorrectly evaluated - function specs as async objects but failed to evaluate classes with - `__await__` but no `__code__` attribute defined as async objects. +IDLE +---- -- bpo-38037: Fix reference counters in the :mod:`signal` module. +- bpo-27115: For 'Go to Line', use a Query box subclass with IDLE standard + behavior and improved error checking. -- bpo-38066: Hide internal asyncio.Stream methods: feed_eof(), feed_data(), - set_exception() and set_transport(). +- bpo-39885: Since clicking to get an IDLE context menu moves the cursor, + any text selection should be and now is cleared. -- bpo-38059: inspect.py now uses sys.exit() instead of exit() +- bpo-39852: Edit "Go to line" now clears any selection, preventing + accidental deletion. It also updates Ln and Col on the status bar. -- bpo-37953: In :mod:`typing`, improved the ``__hash__`` and ``__eq__`` - methods for :class:`ForwardReferences`. +- bpo-39781: Selecting code context lines no longer causes a jump. -- bpo-38026: Fixed :func:`inspect.getattr_static` used ``isinstance`` while - it should avoid dynamic lookup. +Tools/Demos +----------- -- bpo-38010: In ``importlib.metadata`` sync with ``importlib_metadata`` - 0.20, clarifying behavior of ``files()`` and fixing issue where only one - requirement was returned for ``requires()`` on ``dist-info`` packages. +- bpo-36184: Port python-gdb.py to FreeBSD. python-gdb.py now checks for + "take_gil" function name to check if a frame tries to acquire the GIL, + instead of checking for "pthread_cond_timedwait" which is specific to + Linux and can be a different condition than the GIL. -- bpo-38006: weakref.WeakValueDictionary defines a local remove() function - used as callback for weak references. This function was created with a - closure. Modify the implementation to avoid the closure. +- bpo-38080: Added support to fix ``getproxies`` in the + :mod:`lib2to3.fixes.fix_urllib` module. Patch by José Roberto Meza + Cabrera. -- bpo-34410: Fixed a crash in the :func:`tee` iterator when re-enter it. - RuntimeError is now raised in this case. +C API +----- -- bpo-37140: Fix a ctypes regression of Python 3.8. When a ctypes.Structure - is passed by copy to a function, ctypes internals created a temporary - object which had the side effect of calling the structure finalizer - (__del__) twice. The Python semantics requires a finalizer to be called - exactly once. Fix ctypes internals to no longer call the finalizer twice. +- bpo-40024: Add :c:func:`PyModule_AddType` helper function: add a type to a + module. Patch by Dong-hee Na. -- bpo-37972: Subscripts to the `unittest.mock.call` objects now receive the - same chaining mechanism as any other custom attributes, so that the - following usage no longer raises a `TypeError`: +- bpo-39946: Remove ``_PyRuntime.getframe`` hook and remove + ``_PyThreadState_GetFrame`` macro which was an alias to + ``_PyRuntime.getframe``. They were only exposed by the internal C API. + Remove also ``PyThreadFrameGetter`` type. - call().foo().__getitem__('bar') +- bpo-39947: Add :c:func:`PyThreadState_GetFrame` function: get the current + frame of a Python thread state. - Patch by blhsing +- bpo-37207: Add _PyArg_NoKwnames helper function. Patch by Dong-hee Na. -- bpo-22347: Update mimetypes.guess_type to allow proper parsing of URLs - with only a host name. Patch by Dong-hee Na. +- bpo-39947: Add :c:func:`PyThreadState_GetInterpreter`: get the interpreter + of a Python thread state. -- bpo-37885: venv: Don't generate unset variable warning on deactivate. +- bpo-39947: Add :c:func:`PyInterpreterState_Get` function to the limited C + API. -- bpo-37785: Fix xgettext warnings in :mod:`argparse`. +- bpo-35370: If :c:func:`PySys_Audit` fails in :c:func:`PyEval_SetProfile` + or :c:func:`PyEval_SetTrace`, log the error as an unraisable exception. -- bpo-11953: Completing WSA* error codes in :mod:`socket`. +- bpo-39947: Move the static inline function flavor of + Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() to the internal C API: + they access PyThreadState attributes. The limited C API provides regular + functions which hide implementation details. -- bpo-37424: Fixes a possible hang when using a timeout on - `subprocess.run()` while capturing output. If the child process spawned - its own children or otherwise connected its stdout or stderr handles with - another process, we could hang after the timeout was reached and our child - was killed when attempting to read final output from the pipes. +- bpo-39947: Py_TRASHCAN_BEGIN_CONDITION and Py_TRASHCAN_END macro no longer + access PyThreadState attributes, but call new private _PyTrash_begin() and + _PyTrash_end() functions which hide implementation details. -- bpo-37212: :func:`unittest.mock.call` now preserves the order of keyword - arguments in repr output. Patch by Karthikeyan Singaravelan. +- bpo-39884: :c:func:`PyDescr_NewMethod` and :c:func:`PyCFunction_NewEx` now + include the method name in the SystemError "bad call flags" error message + to ease debug. -- bpo-37305: Add .webmanifest -> application/manifest+json to list of - recognized file types and content type headers +- bpo-39877: Deprecated :c:func:`PyEval_InitThreads` and + :c:func:`PyEval_ThreadsInitialized`. Calling :c:func:`PyEval_InitThreads` + now does nothing. -- bpo-21872: Fix :mod:`lzma`: module decompresses data incompletely. When - decompressing a FORMAT_ALONE format file, and it doesn't have the end - marker, sometimes the last one to dozens bytes can't be output. Patch by - Ma Lin. +- bpo-38249: :c:macro:`Py_UNREACHABLE` is now implemented with + ``__builtin_unreachable()`` and analogs in release mode. -- bpo-37206: Default values which cannot be represented as Python objects no - longer improperly represented as ``None`` in function signatures. +- bpo-38643: :c:func:`PyNumber_ToBase` now raises a :exc:`SystemError` + instead of crashing when called with invalid base. -- bpo-12144: Ensure cookies with ``expires`` attribute are handled in - :meth:`CookieJar.make_cookies`. +- bpo-39882: The :c:func:`Py_FatalError` function is replaced with a macro + which logs automatically the name of the current function, unless the + ``Py_LIMITED_API`` macro is defined. -- bpo-31163: pathlib.Path instance's rename and replace methods now return - the new Path instance. +- bpo-39824: Extension modules: :c:member:`~PyModuleDef.m_traverse`, + :c:member:`~PyModuleDef.m_clear` and :c:member:`~PyModuleDef.m_free` + functions of :c:type:`PyModuleDef` are no longer called if the module + state was requested but is not allocated yet. This is the case immediately + after the module is created and before the module is executed + (:c:data:`Py_mod_exec` function). More precisely, these functions are not + called if :c:member:`~PyModuleDef.m_size` is greater than 0 and the module + state (as returned by :c:func:`PyModule_GetState`) is ``NULL``. -- bpo-25068: :class:`urllib.request.ProxyHandler` now lowercases the keys of - the passed dictionary. + Extension modules without module state (``m_size <= 0``) are not affected. -- bpo-21315: Email headers containing RFC2047 encoded words are parsed - despite the missing whitespace, and a defect registered. Also missing - trailing whitespace after encoded words is now registered as a defect. +- bpo-38913: Fixed segfault in ``Py_BuildValue()`` called with a format + containing "#" and undefined PY_SSIZE_T_CLEAN whwn an exception is set. -- bpo-36250: Ignore ``ValueError`` from ``signal`` with ``interaction`` in - non-main thread. +- bpo-38500: Add a private API to get and set the frame evaluation function: + add :c:func:`_PyInterpreterState_GetEvalFrameFunc` and + :c:func:`_PyInterpreterState_SetEvalFrameFunc` C functions. The + :c:type:`_PyFrameEvalFunction` function type now takes a *tstate* + parameter. -- bpo-35168: :attr:`shlex.shlex.punctuation_chars` is now a read-only - property. -- bpo-20504: Fixes a bug in :mod:`cgi` module when a multipart/form-data - request has no `Content-Length` header. +What's New in Python 3.9.0 alpha 4? +=================================== -- bpo-34519: Add additional aliases for HP Roman 8. Patch by Michael Osipov. +*Release date: 2020-02-25* -Documentation -------------- +Security +-------- -- bpo-26868: Fix example usage of :c:func:`PyModule_AddObject` to properly - handle errors. +- bpo-39184: Add audit events to functions in `fcntl`, `msvcrt`, `os`, + `resource`, `shutil`, `signal` and `syslog`. -- bpo-36797: Fix a dead link in the distutils API Reference. +- bpo-39401: Avoid unsafe DLL load at startup on Windows 7 and earlier. -- bpo-37977: Warn more strongly and clearly about pickle insecurity +- bpo-39184: Add audit events to command execution functions in os and pty + modules. -- bpo-37937: Mention ``frame.f_trace`` in :func:`sys.settrace` docs. +Core and Builtins +----------------- -- bpo-36260: Add decompression pitfalls to zipfile module documentation. +- bpo-39382: Fix a use-after-free in the single inheritance path of + ``issubclass()``, when the ``__bases__`` of an object has a single + reference, and so does its first item. Patch by Yonatan Goldschmidt. -- bpo-36960: Restructured the :mod:`datetime` docs in the interest of making - them more user-friendly and improving readability. Patch by Brad Solomon. +- bpo-39573: Update clinic tool to use :c:func:`Py_IS_TYPE`. Patch by + Dong-hee Na. -- bpo-23460: The documentation for decimal string formatting using the `:g` - specifier has been updated to reflect the correct exponential notation - cutoff point. Original patch contributed by Tuomas Suutari. +- bpo-39619: Enable use of :func:`os.chroot` on HP-UX systems. -- bpo-35803: Document and test that ``tempfile`` functions may accept a - :term:`path-like object` for the ``dir`` argument. Patch by Anthony - Sottile. +- bpo-39573: Add :c:func:`Py_IS_TYPE` static inline function to check + whether the object *o* type is *type*. -- bpo-33944: Added a note about the intended use of code in .pth files. +- bpo-39606: Fix regression caused by fix for bpo-39386, that prevented + calling ``aclose`` on an async generator that had already been closed or + exhausted. -- bpo-34293: Fix the Doc/Makefile regarding PAPER environment variable and - PDF builds +- bpo-39579: Change the ending column offset of `Attribute` nodes + constructed in `ast_for_dotted_name` to point at the end of the current + node and not at the end of the last `NAME` node. -Tests ------ +- bpo-1635741: Port _crypt extension module to multiphase initialization + (:pep:`489`). -- bpo-38239: Fix test_gdb for Link Time Optimization (LTO) builds. +- bpo-1635741: Port _contextvars extension module to multiphase + initialization (:pep:`489`). -- bpo-38275: test_ssl now handles disabled TLS/SSL versions better. - OpenSSL's crypto policy and run-time settings are recognized and tests for - disabled versions are skipped. Tests also accept more TLS minimum_versions - for platforms that override OpenSSL's default with strict settings. +- bpo-39510: Fix segfault in ``readinto()`` method on closed BufferedReader. -- bpo-38271: The private keys for test_ssl were encrypted with 3DES in - traditional PKCS#5 format. 3DES and the digest algorithm of PKCS#5 are - blocked by some strict crypto policies. Use PKCS#8 format with AES256 - encryption instead. +- bpo-39502: Fix :func:`time.localtime` on 64-bit AIX to support years + before 1902 and after 2038. Patch by M Felt. -- bpo-38270: test.support now has a helper function to check for - availibility of a hash digest function. Several tests are refactored avoid - MD5 and use SHA256 instead. Other tests are marked to use MD5 and skipped - when MD5 is disabled. +- bpo-39492: Fix a reference cycle in the C Pickler that was preventing the + garbage collection of deleted, pickled objects. -- bpo-37123: Multiprocessing test test_mymanager() now also expects - -SIGTERM, not only exitcode 0. BaseManager._finalize_manager() sends - SIGTERM to the manager process if it takes longer than 1 second to stop, - which happens on slow buildbots. +- bpo-39453: Fixed a possible crash in :meth:`list.__contains__` when a list + is changed during comparing items. Patch by Dong-hee Na. -- bpo-38212: Multiprocessing tests: increase - test_queue_feeder_donot_stop_onexc() timeout from 1 to 60 seconds. +- bpo-39434: :term:`floor division` of float operation now has a better + performance. Also the message of :exc:`ZeroDivisionError` for this + operation is updated. Patch by Dong-hee Na. -- bpo-38117: Test with OpenSSL 1.1.1d +- bpo-1635741: Port _codecs extension module to multiphase initialization + (:pep:`489`). -- bpo-37531: Enhance regrtest multiprocess timeout: write a message when - killing a worker process, catch popen.kill() and popen.wait() exceptions, - put a timeout on the second call to popen.communicate(). +- bpo-1635741: Port _bz2 extension module to multiphase initialization + (:pep:`489`). -- bpo-37876: Add tests for ROT-13 codec. +- bpo-1635741: Port _abc extension module to multiphase initialization + (:pep:`489`). -- bpo-37252: Fix assertions in ``test_close`` and - ``test_events_mask_overflow`` devpoll tests. +- bpo-39320: Replace two complex bytecodes for building dicts with two + simpler ones. The new bytecodes ``DICT_MERGE`` and ``DICT_UPDATE`` have + been added The old bytecodes ``BUILD_MAP_UNPACK`` and + ``BUILD_MAP_UNPACK_WITH_CALL`` have been removed. -- bpo-34001: Make test_ssl pass with LibreSSL. LibreSSL handles minimum and - maximum TLS version differently than OpenSSL. +- bpo-39219: Syntax errors raised in the tokenizer now always set correct + "text" and "offset" attributes. -- bpo-36919: Make ``test_source_encoding.test_issue2301`` implementation - independent. The test will work now for both CPython and IronPython. +- bpo-36051: Drop the GIL during large ``bytes.join`` operations. Patch by + Bruce Merry. -- bpo-34596: Fallback to a default reason when :func:`unittest.skip` is - uncalled. Patch by Naitree Zhu. +- bpo-38960: Fix DTrace build issues on FreeBSD. Patch by David Carlier. -Build ------ +- bpo-37207: Speed up calls to ``range()`` by about 30%, by using the PEP + 590 ``vectorcall`` calling convention. Patch by Mark Shannon. -- bpo-38301: In Solaris family, we must be sure to use ``-D_REENTRANT``. - Patch by Jesús Cea Avión. +- bpo-36144: :class:`dict` (and :class:`collections.UserDict`) objects now + support PEP 584's merge (``|``) and update (``|=``) operators. Patch by + Brandt Bucher. -- bpo-36210: Update optional extension module detection for AIX. ossaudiodev - and spwd are not applicable for AIX, and are no longer reported as - missing. 3rd-party packaging of ncurses (with ASIS support) conflicts with - officially supported AIX curses library, so configure AIX to use - libcurses.a. However, skip trying to build _curses_panel. +- bpo-32856: Optimized the idiom for assignment a temporary variable in + comprehensions. Now ``for y in [expr]`` in comprehensions is as fast as a + simple assignment ``y = expr``. - patch by M Felt +Library +------- -- bpo-36002: Locate ``llvm-profdata`` and ``llvm-ar`` binaries using - ``AC_PATH_TOOL`` rather than ``AC_PATH_TARGET_TOOL``. +- bpo-30566: Fix :exc:`IndexError` when trying to decode an invalid string + with punycode codec. -- bpo-37936: The :file:`.gitignore` file systematically keeps "rooted", with - a non-trailing slash, all the rules that are meant to apply to files in a - specific place in the repo. Previously, when the intended file to ignore - happened to be at the root of the repo, we'd most often accidentally also - ignore files and directories with the same name anywhere in the tree. +- bpo-39649: Remove obsolete check for `__args__` in + bdb.Bdb.format_stack_entry. -- bpo-37936: The :file:`.gitignore` file no longer applies to any files that - are in fact tracked in the Git repository. Patch by Greg Price. +- bpo-39648: Expanded :func:`math.gcd` and :func:`math.lcm` to handle + multiple arguments. -Windows -------- +- bpo-39681: Fix a regression where the C pickle module wouldn't allow + unpickling from a file-like object that doesn't expose a readinto() + method. -- bpo-38117: Update bundled OpenSSL to 1.1.1d +- bpo-35950: Raise :exc:`io.UnsupportedOperation` in + :meth:`io.BufferedReader.truncate` when it is called on a read-only + :class:`io.BufferedReader` instance. -- bpo-38092: Reduce overhead when using multiprocessing in a Windows virtual - environment. +- bpo-39479: Add :func:`math.lcm` function: least common multiple. -- bpo-38133: Allow py.exe launcher to locate installations from the - Microsoft Store and improve display of active virtual environments. +- bpo-39674: Revert "Do not expose abstract collection classes in the + collections module" change (bpo-25988). Aliases to ABC like + collections.Mapping are kept in Python 3.9 to ease transition from Python + 2.7, but will be removed in Python 3.10. -- bpo-38114: The ``pip.ini`` is no longer included in the Nuget package. +- bpo-39104: Fix hanging ProcessPoolExcutor on ``shutdown(wait=False)`` when + a task has failed pickling. -- bpo-36634: :func:`os.cpu_count` now returns active processors rather than - maximum processors. +- bpo-39627: Fixed TypedDict totality check for inherited keys. -- bpo-36634: venv activate.bat now works when the existing variables contain - double quote characters. +- bpo-39474: Fixed starting position of AST for expressions like ``(a)(b)``, + ``(a)[b]`` and ``(a).b``. -- bpo-38081: Prevent error calling :func:`os.path.realpath` on ``'NUL'``. +- bpo-21016: The :mod:`pydoc` and :mod:`trace` modules now use the + :mod:`sysconfig` module to get the path to the Python standard library, to + support uncommon installation path like ``/usr/lib64/python3.9/`` on + Fedora. Patch by Jan Matějek. -- bpo-38087: Fix case sensitivity in test_pathlib and test_ntpath. +- bpo-39590: Collections.deque now holds strong references during + deque.__contains__ and deque.count, fixing crashes. -- bpo-38088: Fixes distutils not finding vcruntime140.dll with only the v142 - toolset installed. +- bpo-39586: The distutils ``bdist_msi`` command is deprecated in Python + 3.9, use ``bdist_wheel`` (wheel packages) instead. -- bpo-37283: Ensure command-line and unattend.xml setting override - previously detected states in Windows installer. - -- bpo-38030: Fixes :func:`os.stat` failing for block devices on Windows +- bpo-39595: Improved performance of zipfile.Path for files with a large + number of entries. Also improved performance and fixed minor issue as + published with `importlib_metadata 1.5 + `_. -- bpo-38020: Fixes potential crash when calling :func:`os.readlink` (or - indirectly through :func:`~os.path.realpath`) on a file that is not a - supported link. +- bpo-39350: Fix regression in :class:`fractions.Fraction` if the numerator + and/or the denominator is an :class:`int` subclass. The :func:`math.gcd` + function is now used to normalize the *numerator* and *denominator*. + :func:`math.gcd` always return a :class:`int` type. Previously, the GCD + type depended on *numerator* and *denominator*. -- bpo-37705: Improve the implementation of ``winerror_to_errno()``. +- bpo-39567: Added audit for :func:`os.walk`, :func:`os.fwalk`, + :meth:`pathlib.Path.glob` and :meth:`pathlib.Path.rglob`. -- bpo-37702: Fix memory leak on Windows in creating an SSLContext object or - running urllib.request.urlopen('https://...'). +- bpo-39559: Remove unused, undocumented argument ``getters`` from + :func:`uuid.getnode` -- bpo-37445: Include the ``FORMAT_MESSAGE_IGNORE_INSERTS`` flag in - ``FormatMessageW()`` calls. +- bpo-38149: :func:`sys.audit` is now called only once per call of + :func:`glob.glob` and :func:`glob.iglob`. -- bpo-37380: Don't collect unfinished processes with ``subprocess._active`` - on Windows to cleanup later. Patch by Ruslan Kuprieiev. +- bpo-39546: Fix a regression in :class:`~argparse.ArgumentParser` where + ``allow_abbrev=False`` was ignored for long options that used a prefix + character other than "-". -- bpo-32587: Make :data:`winreg.REG_MULTI_SZ` support zero-length strings. +- bpo-39450: Striped whitespace from docstring before returning it from + :func:`unittest.case.shortDescription`. -macOS ------ +- bpo-12915: A new function ``resolve_name`` has been added to the + ``pkgutil`` module. This resolves a string of the form ``'a.b.c.d'`` or + ``'a.b:c.d'`` to an object. In the example, ``a.b`` is a package/module + and ``c.d`` is an object within that package/module reached via recursive + attribute access. -- bpo-38117: Updated OpenSSL to 1.1.1d in macOS installer. +- bpo-39353: The :func:`binascii.crc_hqx` function is no longer deprecated. -- bpo-38089: Move Azure Pipelines to latest VM versions and make macOS tests - optional +- bpo-39493: Mark ``typing.IO.closed`` as a property -IDLE ----- +- bpo-39491: Add :data:`typing.Annotated` and ``include_extras`` parameter + to :func:`typing.get_type_hints` as part of :pep:`593`. Patch by Till + Varoquaux, documentation by Till Varoquaux and Konstantin Kashin. -- bpo-35379: When exiting IDLE, catch any AttributeError. One happens when - EditorWindow.close is called twice. Printing a traceback, when IDLE is - run from a terminal, is useless and annoying. +- bpo-39485: Fix a bug in :func:`unittest.mock.create_autospec` that would + complain about the wrong number of arguments for custom descriptors + defined in an extension module returning functions. -- bpo-38183: To avoid problems, test_idle ignores the user config directory. - It no longer tries to create or access .idlerc or any files within. Users - must run IDLE to discover problems with saving settings. +- bpo-38932: Mock fully resets child objects on reset_mock(). Patch by + Vegard Stikbakke -- bpo-38077: IDLE no longer adds 'argv' to the user namespace when - initializing it. This bug only affected 3.7.4 and 3.8.0b2 to 3.8.0b4. +- bpo-39082: Allow AsyncMock to correctly patch static/class methods -- bpo-38041: Shell restart lines now fill the window width, always start - with '=', and avoid wrapping unnecessarily. The line will still wrap if - the included file name is long relative to the width. +- bpo-39432: Implement PEP-489 algorithm for non-ascii "PyInit\_..." symbol + names in distutils to make it export the correct init symbol also on + Windows. -- bpo-35771: To avoid occasional spurious test_idle failures on slower - machines, increase the ``hover_delay`` in test_tooltip. +- bpo-18819: Omit ``devmajor`` and ``devminor`` fields for non-device files + in :mod:`tarfile` archives, enabling bit-for-bit compatibility with GNU + ``tar(1)``. -- bpo-37902: Add mousewheel scrolling for IDLE module, path, and stack - browsers. Patch by George Zhang. +- bpo-39349: Added a new *cancel_futures* parameter to + :meth:`concurrent.futures.Executor.shutdown` that cancels all pending + futures which have not started running, instead of waiting for them to + complete before shutting down the executor. -Tools/Demos ------------ +- bpo-39274: ``bool(fraction.Fraction)`` now returns a boolean even if + (numerator != 0) does not return a boolean (ex: numpy number). -- bpo-37803: pdb's ``--help`` and ``--version`` long options now work. +- bpo-34793: Remove support for ``with (await asyncio.lock):`` and ``with + (yield from asyncio.lock):``. The same is correct for + ``asyncio.Condition`` and ``asyncio.Semaphore``. -- bpo-37064: Add option -k to pathscript.py script: preserve shebang flags. - Add option -a to pathscript.py script: add flags. +- bpo-25597: Ensure, if ``wraps`` is supplied to + :class:`unittest.mock.MagicMock`, it is used to calculate return values + for the magic methods instead of using the default return values. Patch by + Karthikeyan Singaravelan. -C API ------ +- bpo-36350: `inspect.Signature.parameters` and + `inspect.BoundArguments.arguments` are now dicts instead of OrderedDicts. + Patch contributed by Rémi Lapeyre. -- bpo-38234: :c:func:`Py_SetPath` now sets :data:`sys.executable` to the - program full path (:c:func:`Py_GetProgramFullPath`) rather than to the - program name (:c:func:`Py_GetProgramName`). +- bpo-35727: Fix sys.exit() and sys.exit(None) exit code propagation when + used in multiprocessing.Process. -- bpo-38234: Python ignored arguments passed to :c:func:`Py_SetPath`, - :c:func:`Py_SetPythonHome` and :c:func:`Py_SetProgramName`: fix Python - initialization to use specified arguments. +- bpo-32173: * Add `lazycache` function to `__all__`. * Use `dict.clear` to + clear the cache. * Refactoring `getline` function and `checkcache` + function. -- bpo-38205: The :c:func:`Py_UNREACHABLE` macro now calls - :c:func:`Py_FatalError`. +Documentation +------------- -- bpo-37879: Fix subtype_dealloc to suppress the type decref when the base - type is a C heap type +- bpo-17422: The language reference now specifies restrictions on class + namespaces. Adapted from a patch by Ethan Furman. +- bpo-39572: Updated documentation of ``total`` flag of TypeDict. -What's New in Python 3.8.0 beta 4? -================================== +- bpo-39654: In pyclbr doc, update 'class' to 'module' where appropriate and + add readmodule comment. Patch by Hakan Çelik. -*Release date: 2019-08-29* +- bpo-39153: Clarify refcounting semantics for the following functions: - + PyObject_SetItem - PyMapping_SetItemString - PyDict_SetItem - + PyDict_SetItemString -Security --------- +- bpo-39392: Explain that when filling with turtle, overlap regions may be + left unfilled. -- bpo-34155: Fix parsing of invalid email addresses with more than one ``@`` - (e.g. a@b@c.com.) to not return the part before 2nd ``@`` as valid email - address. Patch by maxking & jpic. +- bpo-39369: Update mmap readline method description. The fact that the + readline method does update the file position should not be ignored since + this might give the impression for the programmer that it doesn't update + it. -Core and Builtins ------------------ +- bpo-9056: Include subsection in TOC for PDF version of docs. -- bpo-37947: Adjust correctly the recursion level in the symtable generation - for named expressions. Patch by Pablo Galindo. +Tests +----- -- bpo-37830: Fixed compilation of :keyword:`break` and :keyword:`continue` - in the :keyword:`finally` block when the corresponding :keyword:`try` - block contains :keyword:`return` with a non-constant value. +- bpo-38325: Skip tests on non-BMP characters of test_winconsoleio. -- bpo-32912: Reverted :issue:`32912`: emitting :exc:`SyntaxWarning` instead - of :exc:`DeprecationWarning` for invalid escape sequences in string and - bytes literals. +- bpo-39502: Skip test_zipfile.test_add_file_after_2107() if + :func:`time.localtime` fails with :exc:`OverflowError`. It is the case on + AIX 6.1 for example. -- bpo-37757: :pep:`572`: As described in the PEP, assignment expressions now - raise :exc:`SyntaxError` when their interaction with comprehension scoping - results in an ambiguous target scope. +Build +----- - The ``TargetScopeError`` subclass originally proposed by the PEP has been - removed in favour of just raising regular syntax errors for the disallowed - cases. +- bpo-39489: Remove ``COUNT_ALLOCS`` special build. -- bpo-36311: Decoding bytes objects larger than 2GiB is faster and no longer - fails when a multibyte characters spans a chunk boundary. +Windows +------- -- bpo-37433: Fix ``SyntaxError`` indicator printing too many spaces for - multi-line strings - by Anthony Sottile. +- bpo-39553: Delete unused code related to SxS manifests. -- bpo-20523: ``pdb.Pdb`` supports ~/.pdbrc in Windows 7. Patch by Tim Hopper - and Dan Lidral-Porter. +- bpo-39439: Honor the Python path when a virtualenv is active on Windows. -Library -------- +- bpo-39393: Improve the error message when attempting to load a DLL with + unresolved dependencies. -- bpo-37834: Prevent shutil.rmtree exception when built on non-Windows - system without fd system call support, like older versions of macOS. +- bpo-38883: :meth:`~pathlib.Path.home()` and + :meth:`~pathlib.Path.expanduser()` on Windows now prefer + :envvar:`USERPROFILE` and no longer use :envvar:`HOME`, which is not + normally set for regular user accounts. This makes them again behave like + :func:`os.path.expanduser`, which was changed to ignore :envvar:`HOME` in + 3.8, see :issue:`36264`. -- bpo-37965: Fix C compiler warning caused by - distutils.ccompiler.CCompiler.has_function. +- bpo-39185: The build.bat script has additional options for very-quiet + output (-q) and very-verbose output (-vv) -- bpo-37960: ``repr()`` of buffered and text streams now silences only - expected exceptions when get the value of "name" and "mode" attributes. +IDLE +---- -- bpo-37951: Most features of the subprocess module now work again in - subinterpreters. Only *preexec_fn* is restricted in subinterpreters. +- bpo-39663: Add tests for pyparse find_good_parse_start(). -- bpo-36205: Fix the rusage implementation of time.process_time() to - correctly report the sum of the system and user CPU time. +- bpo-39600: In the font configuration window, remove duplicated font names. -- bpo-37950: Fix :func:`ast.dump` when call with incompletely initialized - node. +- bpo-30780: Add remaining configdialog tests for buttons and highlights and + keys tabs. -- bpo-34679: Restores instantiation of Windows IOCP event loops from the - non-main thread. +- bpo-39388: IDLE Settings Cancel button now cancels pending changes -- bpo-36917: Add default implementation of the - :meth:`ast.NodeVisitor.visit_Constant` method which emits a deprecation - warning and calls corresponding methody ``visit_Num()``, ``visit_Str()``, - etc. +- bpo-38792: Close an IDLE shell calltip if a :exc:`KeyboardInterrupt` or + shell restart occurs. Patch by Zackery Spytz. -- bpo-37798: Update test_statistics.py to verify that the statistics module - works well for both C and Python implementations. Patch by Dong-hee Na +C API +----- -- bpo-26589: Added a new status code to the http module: 451 - UNAVAILABLE_FOR_LEGAL_REASONS +- bpo-35081: Move the ``bytes_methods.h`` header file to the internal C API + as ``pycore_bytes_methods.h``: it only contains private symbols (prefixed + by ``_Py``), except of the ``PyDoc_STRVAR_shared()`` macro. -- bpo-37915: Fix a segmentation fault that appeared when comparing instances - of ``datetime.timezone`` and ``datetime.tzinfo`` objects. Patch by Pablo - Galindo. +- bpo-35081: Move the ``dtoa.h`` header file to the internal C API as + ``pycore_dtoa.h``: it only contains private functions (prefixed by + ``_Py``). The :mod:`math` and :mod:`cmath` modules must now be compiled + with the ``Py_BUILD_CORE`` macro defined. -- bpo-37868: Fix dataclasses.is_dataclass when given an instance that never - raises AttributeError in __getattr__. That is, an object that returns - something for __dataclass_fields__ even if it's not a dataclass. +- bpo-39573: Add :c:func:`Py_SET_SIZE` function to set the size of an + object. -- bpo-37811: Fix ``socket`` module's ``socket.connect(address)`` function - being unable to establish connection in case of interrupted system call. - The problem was observed on all OSes which ``poll(2)`` system call can - take only non-negative integers and -1 as a timeout value. +- bpo-39500: :c:func:`PyUnicode_IsIdentifier` does not call + :c:func:`Py_FatalError` anymore if the string is not ready. -- bpo-21131: Fix ``faulthandler.register(chain=True)`` stack. faulthandler - now allocates a dedicated stack of ``SIGSTKSZ*2`` bytes, instead of just - ``SIGSTKSZ`` bytes. Calling the previous signal handler in faulthandler - signal handler uses more than ``SIGSTKSZ`` bytes of stack memory on some - platforms. +- bpo-39573: Add :c:func:`Py_SET_TYPE` function to set the type of an + object. -- bpo-37798: Add C fastpath for statistics.NormalDist.inv_cdf() Patch by - Dong-hee Na +- bpo-39573: Add a :c:func:`Py_SET_REFCNT` function to set the reference + counter of an object. -- bpo-37819: Add Fraction.as_integer_ratio() to match the corresponding - methods in bool, int, float, and decimal. +- bpo-39542: Convert :c:func:`PyType_HasFeature`, :c:func:`PyType_Check` and + :c:func:`PyType_CheckExact` macros to static inline functions. -- bpo-37810: Fix :mod:`difflib` ``?`` hint in diff output when dealing with - tabs. Patch by Anthony Sottile. +- bpo-39542: In the limited C API, ``PyObject_INIT()`` and + ``PyObject_INIT_VAR()`` are now defined as aliases to + :c:func:`PyObject_Init` and :c:func:`PyObject_InitVar` to make their + implementation opaque. It avoids to leak implementation details in the + limited C API. Exclude the following functions from the limited C API: + ``_Py_NewReference()``, ``_Py_ForgetReference()``, + ``_PyTraceMalloc_NewReference()`` and ``_Py_GetRefTotal()``. -- bpo-37772: In ``zipfile.Path``, when adding implicit dirs, ensure that - ancestral directories are added and that duplicates are excluded. +- bpo-39542: Exclude trashcan mechanism from the limited C API: it requires + access to PyTypeObject and PyThreadState structure fields, whereas these + structures are opaque in the limited C API. -- bpo-28292: Mark calendar.py helper functions as being private. The - follows PEP 8 guidance to maintain the style conventions in the module and - it addresses a known case of user confusion. +- bpo-39511: The :c:func:`PyThreadState_Clear` function now calls the + :c:member:`PyThreadState.on_delete` callback. Previously, that happened in + :c:func:`PyThreadState_Delete`. -- bpo-18049: Add definition of THREAD_STACK_SIZE for AIX in - Python/thread_pthread.h The default thread stacksize caused crashes with - the default recursion limit Patch by M Felt +- bpo-38076: Fix to clear the interpreter state only after clearing module + globals to guarantee module state access from C Extensions during runtime + destruction -- bpo-37738: Fix the implementation of curses ``addch(str, color_pair)``: - pass the color pair to ``setcchar()``, instead of always passing 0 as the - color pair. +- bpo-39245: The Vectorcall API (PEP 590) was made public, adding the + functions ``PyObject_Vectorcall``, ``PyObject_VectorcallMethod``, + ``PyVectorcall_Function``, ``PyObject_CallOneArg``, + ``PyObject_CallMethodNoArgs``, ``PyObject_CallMethodOneArg``, + ``PyObject_FastCallDict``, and the flag ``Py_TPFLAGS_HAVE_VECTORCALL``. -- bpo-37723: Fix performance regression on regular expression parsing with - huge character sets. Patch by Yann Vaginay. -- bpo-32178: Fix IndexError in :mod:`email` package when trying to parse - invalid address fields starting with ``:``. +What's New in Python 3.9.0 alpha 3? +=================================== -- bpo-37685: Fixed comparisons of :class:`datetime.timedelta` and - :class:`datetime.timezone`. +*Release date: 2020-01-24* -- bpo-37695: Correct :func:`curses.unget_wch` error message. Patch by - Anthony Sottile. +Core and Builtins +----------------- -- bpo-37354: Make Activate.ps1 Powershell script static to allow for signing - it. +- bpo-39427: Document all possibilities for the ``-X`` options in the + command line help section. Patch by Pablo Galindo. -- bpo-37664: Update wheels bundled with ensurepip (pip 19.2.3 and setuptools - 41.2.0) +- bpo-39421: Fix possible crashes when operating with the functions in the + :mod:`heapq` module and custom comparison operators. -- bpo-37642: Allowed the pure Python implementation of - :class:`datetime.timezone` to represent sub-minute offsets close to - minimum and maximum boundaries, specifically in the ranges (23:59, 24:00) - and (-23:59, 24:00). Patch by Ngalim Siregar +- bpo-39386: Prevent double awaiting of async iterator. -- bpo-16970: Adding a value error when an invalid value in passed to nargs - Patch by Robert Leenders +- bpo-17005: Add :class:`functools.TopologicalSorter` to the + :mod:`functools` module to offers functionality to perform topological + sorting of graphs. Patch by Pablo Galindo, Tim Peters and Larry Hastings. -- bpo-37587: Make json.loads faster for long strings. (Patch by Marco - Paolini) +- bpo-39320: Replace four complex bytecodes for building sequences with + three simpler ones. -- bpo-18378: Recognize "UTF-8" as a valid value for LC_CTYPE in - locale._parse_localename. + The following four bytecodes have been removed: -- bpo-37531: "python3 -m test -jN --timeout=TIMEOUT" now kills a worker - process if it runs longer than *TIMEOUT* seconds. + * BUILD_LIST_UNPACK + * BUILD_TUPLE_UNPACK + * BUILD_SET_UNPACK + * BUILD_TUPLE_UNPACK_WITH_CALL -- bpo-37482: Fix serialization of display name in originator or destination - address fields with both encoded words and special chars. + The following three bytecodes have been added: -- bpo-37372: Fix error unpickling datetime.time objects from Python 2 with - seconds>=24. Patch by Justin Blanchard. + * LIST_TO_TUPLE + * LIST_EXTEND + * SET_UPDATE -- bpo-37085: Add the optional Linux SocketCAN Broadcast Manager constants, - used as flags to configure the BCM behaviour, in the socket module. Patch - by Karl Ding. +- bpo-39336: Import loaders which publish immutable module objects can now + publish immutable packages in addition to individual modules. -- bpo-36871: Ensure method signature is used instead of constructor - signature of a class while asserting mock object against method calls. - Patch by Karthikeyan Singaravelan. +- bpo-39322: Added a new function :func:`gc.is_finalized` to check if an + object has been finalized by the garbage collector. Patch by Pablo + Galindo. -- bpo-36582: Fix ``UserString.encode()`` to correctly return ``bytes`` - rather than a ``UserString`` instance. +- bpo-39048: Improve the displayed error message when incorrect types are + passed to ``async with`` statements by looking up the :meth:`__aenter__` + special method before the :meth:`__aexit__` special method when entering + an asynchronous context manager. Patch by Géry Ogam. -- bpo-34775: Division handling of PurePath now returns NotImplemented - instead of raising a TypeError when passed something other than an - instance of str or PurePath. Patch by Roger Aiudi. +- bpo-39235: Fix AST end location for lone generator expression in function + call, e.g. f(i for i in a). -Documentation -------------- - -- bpo-37979: Added a link to dateutil.parser.isoparse in the - datetime.fromisoformat documentation. Patch by Paul Ganssle +- bpo-39209: Correctly handle multi-line tokens in interactive mode. Patch + by Pablo Galindo. -- bpo-37759: Beginning edits to Whatsnew 3.8 +- bpo-1635741: Port _json extension module to multiphase initialization + (:pep:`489`). -- bpo-37726: Stop recommending getopt in the tutorial for command line - argument parsing and promote argparse. +- bpo-39216: Fix constant folding optimization for positional only arguments + - by Anthony Sottile. -- bpo-37256: Fix wording of arguments for :class:`Request` in - :mod:`urllib.request` +- bpo-39215: Fix ``SystemError`` when nested function has annotation on + positional-only argument - by Anthony Sottile. -- bpo-37004: In the documentation for difflib, a note was added explicitly - warning that the results of SequenceMatcher's ratio method may depend on - the order of the input strings. +- bpo-39200: Correct the error message when calling the :func:`min` or + :func:`max` with no arguments. Patch by Dong-hee Na. -- bpo-36487: Make C-API docs clear about what the "main" interpreter is. +- bpo-39200: Correct the error message when trying to construct + :class:`range` objects with no arguments. Patch by Pablo Galindo. -Tests ------ +- bpo-39166: Fix incorrect line execution reporting in trace functions when + tracing the last iteration of asynchronous for loops. Patch by Pablo + Galindo. -- bpo-37805: Add tests for json.dump(..., skipkeys=True). Patch by Dong-hee - Na. +- bpo-39114: Fix incorrent line execution reporting in trace functions when + tracing exception handlers with name binding. Patch by Pablo Galindo. -Build ------ +- bpo-39156: Split the COMPARE_OP bytecode instruction into four distinct + instructions. -- bpo-37707: Mark some individual tests to skip when --pgo is used. The - tests marked increase the PGO task time significantly and likely don't - help improve optimization of the final executable. + * COMPARE_OP for rich comparisons + * IS_OP for 'is' and 'is not' tests + * CONTAINS_OP for 'in' and 'is not' tests + * JUMP_IF_NOT_EXC_MATCH for checking exceptions in 'try-except' statements. -Windows -------- + This improves the clarity of the interpreter and should provide a modest + speedup. -- bpo-37549: :func:`os.dup` no longer fails for standard streams on Windows - 7. +- bpo-38588: Fix possible crashes in dict and list when calling + :c:func:`PyObject_RichCompareBool`. -- bpo-1311: The ``nul`` file on Windows now returns True from - :func:`~os.path.exists` and a valid result from :func:`os.stat` with - ``S_IFCHR`` set. +- bpo-13601: By default, ``sys.stderr`` is line-buffered now, even if + ``stderr`` is redirected to a file. You can still make ``sys.stderr`` + unbuffered by passing the :option:`-u` command-line option or setting the + :envvar:`PYTHONUNBUFFERED` environment variable. -- bpo-9949: Enable support for following symlinks in :func:`os.realpath`. + (Contributed by Jendrik Seipp in bpo-13601.) -- bpo-37834: Treat all name surrogate reparse points on Windows in - :func:`os.lstat` and other reparse points as regular files in - :func:`os.stat`. +- bpo-38610: Fix possible crashes in several list methods by holding strong + references to list elements when calling + :c:func:`PyObject_RichCompareBool`. -- bpo-36266: Add the module name in the formatted error message when DLL - load fail happens during module import in - ``_PyImport_FindSharedFuncptrWindows()``. Patch by Srinivas Nyayapati. +- bpo-32021: Include brotli .br encoding in mimetypes encodings_map -- bpo-25172: Trying to import the :mod:`crypt` module on Windows will result - in an :exc:`ImportError` with a message explaining that the module isn't - supported on Windows. On other platforms, if the underlying ``_crypt`` - module is not available, the ImportError will include a message explaining - the problem. +Library +------- -- bpo-37778: Fixes the icons used for file associations to the Microsoft - Store package. +- bpo-39430: Fixed race condition in lazy imports in :mod:`tarfile`. -- bpo-37734: Fix use of registry values to launch Python from Microsoft - Store app. +- bpo-39413: The :func:`os.unsetenv` function is now also available on + Windows. -- bpo-28269: Replace use of :c:func:`strcasecmp` for the system function - :c:func:`_stricmp`. Patch by Minmin Gong. +- bpo-39390: Fixed a regression with the `ignore` callback of + :func:`shutil.copytree`. The argument types are now str and List[str] + again. -macOS ------ +- bpo-39395: The :func:`os.putenv` and :func:`os.unsetenv` functions are now + always available. -- bpo-18049: Increase the default stack size of threads from 5MB to 16MB on - macOS, to match the stack size of the main thread. This avoids crashes on - deep recursion in threads. +- bpo-39406: If ``setenv()`` C function is available, :func:`os.putenv` is + now implemented with ``setenv()`` instead of ``putenv()``, so Python + doesn't have to handle the environment variable memory. -IDLE ----- +- bpo-39396: Fix ``math.nextafter(-0.0, +0.0)`` on AIX 7.1. -- bpo-37824: Properly handle user input warnings in IDLE shell. Cease - turning SyntaxWarnings into SyntaxErrors. +- bpo-29435: Allow :func:`tarfile.is_tarfile` to be used with file and + file-like objects, like :func:`zipfile.is_zipfile`. Patch by William + Woodruff. -- bpo-37929: IDLE Settings dialog now closes properly when there is no shell - window. +- bpo-39377: Removed ``encoding`` option from :func:`json.loads`. It has + been deprecated since Python 3.1. -- bpo-37849: Fixed completions list appearing too high or low when shown - above the current line. +- bpo-39389: Write accurate compression level metadata in :mod:`gzip` + archives, rather than always signaling maximum compression. -- bpo-36419: Refactor IDLE autocomplete and improve testing. +- bpo-39366: The previously deprecated ``xpath()`` and ``xgtitle()`` methods + of :class:`nntplib.NNTP` have been removed. -- bpo-37748: Reorder the Run menu. Put the most common choice, Run Module, - at the top. +- bpo-39357: Remove the *buffering* parameter of :class:`bz2.BZ2File`. Since + Python 3.0, it was ignored and using it was emitting + :exc:`DeprecationWarning`. Pass an open file object, to control how the + file is opened. The *compresslevel* parameter becomes keyword-only. -Tools/Demos ------------ +- bpo-39353: Deprecate binhex4 and hexbin4 standards. Deprecate the + :mod:`binhex` module and the following :mod:`binascii` functions: + :func:`~binascii.b2a_hqx`, :func:`~binascii.a2b_hqx`, + :func:`~binascii.rlecode_hqx`, :func:`~binascii.rledecode_hqx`, + :func:`~binascii.crc_hqx`. -- bpo-37942: Improve ArgumentClinic converter for floats. +- bpo-39351: Remove ``base64.encodestring()`` and ``base64.decodestring()``, + aliases deprecated since Python 3.1: use :func:`base64.encodebytes` and + :func:`base64.decodebytes` instead. -- bpo-37034: Argument Clinic now uses the argument name on errors with - keyword-only argument instead of their position. Patch contributed by Rémi - Lapeyre. +- bpo-39350: Remove ``fractions.gcd()`` function, deprecated since Python + 3.5 (:issue:`22486`): use :func:`math.gcd` instead. -C API ------ +- bpo-39329: :class:`~smtplib.LMTP` constructor now has an optional + *timeout* parameter. Patch by Dong-hee Na. -- bpo-36763: Options added by ``PySys_AddXOption()`` are now handled the - same way than ``PyConfig.xoptions`` and command line ``-X`` options. +- bpo-39313: Add a new ``exec_function`` option (*--exec-function* in the + CLI) to ``RefactoringTool`` for making ``exec`` a function. Patch by + Batuhan Taskaya. -- bpo-37926: Fix a crash in ``PySys_SetArgvEx(0, NULL, 0)``. +- bpo-39259: :class:`~ftplib.FTP_TLS` and :class:`~ftplib.FTP_TLS` now raise + a :class:`ValueError` if the given timeout for their constructor is zero + to prevent the creation of a non-blocking socket. Patch by Dong-hee Na. +- bpo-39259: :class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise + a :class:`ValueError` if the given timeout for their constructor is zero + to prevent the creation of a non-blocking socket. Patch by Dong-hee Na. -What's New in Python 3.8.0 beta 3? -================================== +- bpo-39310: Add :func:`math.ulp`: return the value of the least significant + bit of a float. -*Release date: 2019-07-29* +- bpo-39297: Improved performance of importlib.metadata distribution + discovery and resilients to inaccessible sys.path entries + (importlib_metadata v1.4.0). -Security --------- +- bpo-39259: :class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise + a :class:`ValueError` if the given timeout for their constructor is zero + to prevent the creation of a non-blocking socket. Patch by Dong-hee Na. -- bpo-37461: Fix an infinite loop when parsing specially crafted email - headers. Patch by Abhilash Raj. +- bpo-38901: When you specify prompt='.' or equivalently python -m venv + --prompt . ... the basename of the current directory is used to set the + created venv's prompt when it's activated. -Core and Builtins ------------------ +- bpo-39288: Add :func:`math.nextafter`: return the next floating-point + value after *x* towards *y*. -- bpo-37593: Swap the positions of the *posonlyargs* and *args* parameters - in the constructor of :class:`ast.parameters` nodes. +- bpo-39259: :class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a + :class:`ValueError` if the given timeout for their constructor is zero to + prevent the creation of a non-blocking socket. Patch by Dong-hee Na. -- bpo-36974: Implemented separate vectorcall functions for every calling - convention of builtin functions and methods. This improves performance for - calls. +- bpo-39242: Updated the Gmane domain from news.gmane.org to news.gmane.io + which is used for examples of :class:`~nntplib.NNTP` news reader server + and nntplib tests. -Library -------- +- bpo-35292: Proxy the `SimpleHTTPRequestHandler.guess_type` to + `mimetypes.guess_type` so the `mimetypes.init` is called lazily to avoid + unnecessary costs when :mod:`http.server` module is imported. -- bpo-37697: Syncronize ``importlib.metadata`` with `importlib_metadata 0.19 - `_, - improving handling of EGG-INFO files and fixing a crash when entry point - names contained colons. +- bpo-39239: The :meth:`select.epoll.unregister` method no longer ignores + the :data:`~errno.EBADF` error. -- bpo-37691: Let math.dist() accept coordinates as sequences (or iterables) - rather than just tuples. +- bpo-38907: In http.server script, restore binding to IPv4 on Windows. -- bpo-37664: Update wheels bundled with ensurepip (pip 19.2.1 and setuptools - 41.0.1) +- bpo-39152: Fix ttk.Scale.configure([name]) to return configuration tuple + for name or all options. Giovanni Lombardo contributed part of the patch. -- bpo-36324: Make internal attributes for statistics.NormalDist() private. +- bpo-39198: If an exception were to be thrown in `Logger.isEnabledFor` + (say, by asyncio timeouts or stopit) , the `logging` global lock may not + be released appropriately, resulting in deadlock. This change wraps that + block of code with `try...finally` to ensure the lock is released. -- bpo-37491: Fix ``IndexError`` when parsing email headers with unexpectedly - ending bare-quoted string value. Patch by Abhilash Raj. +- bpo-39191: Perform a check for running loop before starting a new task in + ``loop.run_until_complete()`` to fail fast; it prevents the side effect of + new task spawning before exception raising. -- bpo-37579: Return :exc:`NotImplemented` in Python implementation of - ``__eq__`` for :class:`~datetime.timedelta` and :class:`~datetime.time` - when the other object being compared is not of the same type to match C - implementation. Patch by Karthikeyan Singaravelan. +- bpo-38871: Correctly parenthesize filter-based statements that contain + lambda expressions in mod:`lib2to3`. Patch by Dong-hee Na. -- bpo-21478: Record calls to parent when autospecced object is attached to a - mock using :func:`unittest.mock.attach_mock`. Patch by Karthikeyan - Singaravelan. +- bpo-39142: A change was made to logging.config.dictConfig to avoid + converting instances of named tuples to ConvertingTuple. It's assumed that + named tuples are too specialised to be treated like ordinary tuples; if a + user of named tuples requires ConvertingTuple functionality, they will + have to implement that themselves in their named tuple class. -- bpo-37502: pickle.loads() no longer raises TypeError when the buffers - argument is set to None +- bpo-39158: ast.literal_eval() now supports empty sets. -- bpo-37520: Correct behavior for zipfile.Path.parent when the path object - identifies a subdirectory. +- bpo-39129: Fix import path for ``asyncio.TimeoutError`` -- bpo-18374: Fix the ``.col_offset`` attribute of nested :class:`ast.BinOp` - instances which had a too large value in some situations. +- bpo-39057: :func:`urllib.request.proxy_bypass_environment` now ignores + leading dots and no longer ignores a trailing newline. -- bpo-37421: Fix :func:`multiprocessing.util.get_temp_dir` finalizer: clear - also the 'tempdir' configuration of the current process, so next call to - ``get_temp_dir()`` will create a new temporary directory, rather than - reusing the removed temporary directory. +- bpo-39056: Fixed handling invalid warning category in the -W option. No + longer import the re module if it is not needed. -- bpo-37481: The distutils ``bdist_wininst`` command is deprecated in Python - 3.8, use ``bdist_wheel`` (wheel packages) instead. +- bpo-39055: :func:`base64.b64decode` with ``validate=True`` raises now a + binascii.Error if the input ends with a single ``\n``. -- bpo-26967: An :class:`~argparse.ArgumentParser` with - ``allow_abbrev=False`` no longer disables grouping of short flags, such as - ``-vv``, but only disables abbreviation of long flags as documented. Patch - by Zac Hatfield-Dodds. +- bpo-21600: Fix :func:`mock.patch.stopall` to stop active patches that were + created with :func:`mock.patch.dict`. -- bpo-37347: :meth:`sqlite3.Connection.create_aggregate`, - :meth:`sqlite3.Connection.create_function`, - :meth:`sqlite3.Connection.set_authorizer`, - :meth:`sqlite3.Connection.set_progress_handler` - :meth:`sqlite3.Connection.set_trace_callback` methods lead to segfaults if - some of these methods are called twice with an equal object but not the - same. Now callbacks are stored more carefully. Patch by Aleksandr Balezin. +- bpo-39019: Implement dummy ``__class_getitem__`` for + :class:`tempfile.SpooledTemporaryFile`. -- bpo-36564: Fix infinite loop in email header folding logic that would be - triggered when an email policy's max_line_length is not long enough to - include the required markup and any values in the message. Patch by Paul - Ganssle +- bpo-39019: Implement dummy ``__class_getitem__`` for ``subprocess.Popen``, + ``subprocess.CompletedProcess`` -Documentation -------------- +- bpo-38914: Adjusted the wording of the warning issued by distutils' + ``check`` command when the ``author`` and ``maintainer`` fields are + supplied but no corresponding e-mail field (``author_email`` or + ``maintainer_email``) is found. The wording now reflects the fact that + these fields are suggested, but not required. Patch by Juergen Gmach. -- bpo-32910: Remove implementation-specific behaviour of how venv's - Deactivate works. +- bpo-38878: Fixed __subclasshook__ of :class:`os.PathLike` to return a + correct result upon inheritence. Patch by Bar Harel. -- bpo-37284: Add a brief note to indicate that any new - ``sys.implementation`` required attributes must go through the PEP - process. +- bpo-38615: :class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now + have an optional *timeout* parameter for their constructors. Also, the + :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter + with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` + and :class:`~imaplib.IMAP4_stream` were applied to this change. Patch by + Dong-hee Na. -- bpo-30088: Documented that :class:`mailbox.Maildir` constructor doesn't - attempt to verify the maildir folder layout correctness. Patch by - Sviatoslav Sydorenko. +- bpo-35182: Fixed :func:`Popen.communicate` subsequent call crash when the + child process has already closed any piped standard stream, but still + continues to be running. Patch by Andriy Maletsky. -- bpo-37521: Fix `importlib` examples to insert any newly created modules - via importlib.util.module_from_spec() immediately into sys.modules instead - of after calling loader.exec_module(). +- bpo-38630: On Unix, :meth:`subprocess.Popen.send_signal` now polls the + process status. Polling reduces the risk of sending a signal to the wrong + process if the process completed, the :attr:`subprocess.Popen.returncode` + attribute is still ``None``, and the pid has been reassigned (recycled) to + a new different process. - Thanks to Benjamin Mintz for finding the bug. +- bpo-38536: Removes trailing space in formatted currency with + `international=True` and a locale with symbol following value. E.g. + `locale.currency(12.34, international=True)` returned `'12,34 EUR '` + instead of `'12,34 EUR'`. -- bpo-37456: Slash ('/') is now part of syntax. +- bpo-38473: Use signature from inner mock for autospecced methods attached + with :func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. -- bpo-37487: Fix PyList_GetItem index description to include 0. +- bpo-38361: Fixed an issue where ``ident`` could include a leading path + separator when :func:`syslog.openlog` was called without arguments. -- bpo-37149: Replace the dead link to the Tkinter 8.5 reference by John - Shipman, New Mexico Tech, with a link to the archive.org copy. +- bpo-38293: Add :func:`copy.copy` and :func:`copy.deepcopy` support to + :func:`property` objects. -- bpo-37478: Added possible exceptions to the description of os.chdir(). +- bpo-37958: Added the pstats.Stats.get_profile_dict() method to return the + profile data as a StatsProfile instance. -Tests ------ +- bpo-28367: Termios magic constants for the following baud rates: - + B500000 - B576000 - B921600 - B1000000 - B1152000 - B1500000 - + B2000000 - B2500000 - B3000000 - B3500000 - B4000000 Patch by + Andrey Smirnov -- bpo-37558: Fix test_shared_memory_cleaned_after_process_termination name - handling +Documentation +------------- -- bpo-37526: Add :func:`test.support.catch_threading_exception`: context - manager catching :class:`threading.Thread` exception using - :func:`threading.excepthook`. +- bpo-39381: Mention in docs that :func:`asyncio.get_event_loop` implicitly + creates new event loop only if called from the main thread. -- bpo-37421: test_concurrent_futures now explicitly stops the ForkServer - instance if it's running. +- bpo-38918: Add an entry for ``__module__`` in the "function" & "method" + sections of the `inspect docs types and members table + `_ -- bpo-37421: multiprocessing tests now stop the ForkServer instance if it's - running: close the "alive" file descriptor to ask the server to stop and - then remove its UNIX address. +- bpo-3530: In the :mod:`ast` module documentation, fix a misleading + ``NodeTransformer`` example and add advice on when to use the + ``fix_missing_locations`` function. Build ----- -- bpo-36044: Reduce the number of unit tests run for the PGO generation - task. This speeds up the task by a factor of about 15x. Running the full - unit test suite is slow. This change may result in a slightly less - optimized build since not as many code branches will be executed. If you - are willing to wait for the much slower build, the old behavior can be - restored using './configure [..] PROFILE_TASK="-m test --pgo-extended"'. - We make no guarantees as to which PGO task set produces a faster build. - Users who care should run their own relevant benchmarks as results can - depend on the environment, workload, and compiler tool chain. +- bpo-39395: On non-Windows platforms, the :c:func:`setenv` and + :c:func:`unsetenv` functions are now required to build Python. -Windows -------- +- bpo-39160: Updated the documentation in `./configure --help` to show + default values, reference documentation where required and add additional + explanation where needed. -- bpo-37672: Switch Windows Store package's pip to use bundled - :file:`pip.ini` instead of :envvar:`PIP_USER` variable. +- bpo-39144: The ctags and etags build targets both include Modules/_ctypes + and Python standard library source files. IDLE ---- -- bpo-37692: Improve highlight config sample with example shell interaction - and better labels for shell elements. +- bpo-39050: Make IDLE Settings dialog Help button work again. -- bpo-37628: Settings dialog no longer expands with font size. +- bpo-34118: Tag memoryview, range, and tuple as classes, the same as list, + etcetera, in the library manual built-in functions list. -- bpo-37627: Initialize the Customize Run dialog with the command line - arguments most recently entered before. The user can optionally edit - before submitting them. +- bpo-32989: Add tests for editor newline_and_indent_event method. Remove + dead code from pyparse find_good_parse_start method. -- bpo-33610: Fix code context not showing the correct context when first - toggled on. +C API +----- -- bpo-37530: Optimize code context to reduce unneeded background activity. - Font and highlight changes now occur along with text changes instead of - after a random delay. +- bpo-39372: Clean header files of interfaces defined but with no + implementation. The public API symbols being removed are: + ``_PyBytes_InsertThousandsGroupingLocale``, + ``_PyBytes_InsertThousandsGrouping``, ``_Py_InitializeFromArgs``, + ``_Py_InitializeFromWideArgs``, ``_PyFloat_Repr``, ``_PyFloat_Digits``, + ``_PyFloat_DigitsInit``, ``PyFrame_ExtendStack``, + ``_PyAIterWrapper_Type``, ``PyNullImporter_Type``, ``PyCmpWrapper_Type``, + ``PySortWrapper_Type``, ``PyNoArgsFunction``. -- bpo-27452: Cleanup ``config.py`` by inlining ``RemoveFile`` and - simplifying the handling of ``file`` in ``CreateConfigHandlers``. +- bpo-39164: Add a private ``_PyErr_GetExcInfo()`` function to retrieve + exception information of the specified Python thread state. -- bpo-17535: Add optional line numbers for IDLE editor windows. Windows - open without line numbers unless set otherwise in the General tab of the - configuration dialog. -- bpo-26806: To compensate for stack frames added by IDLE and avoid possible - problems with low recursion limits, add 30 to limits in the user code - execution process. Subtract 30 when reporting recursion limits to make - this addition mostly transparent. +What's New in Python 3.9.0 alpha 2? +=================================== -- bpo-36390: Gather Format menu functions into format.py. Combine - paragraph.py, rstrip.py, and format methods from editor.py. +*Release date: 2019-12-18* -Tools/Demos ------------ +Security +-------- -- bpo-37675: 2to3 now works when run from a zipped standard library. +- bpo-38945: Newline characters have been escaped when performing uu + encoding to prevent them from overflowing into to content section of the + encoded file. This prevents malicious or accidental modification of data + during the decoding process. +- bpo-37228: Due to significant security concerns, the *reuse_address* + parameter of :meth:`asyncio.loop.create_datagram_endpoint` is no longer + supported. This is because of the behavior of ``SO_REUSEADDR`` in UDP. For + more details, see the documentation for + ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine + Pitrou, and Yury Selivanov in :issue:`37228`.) -What's New in Python 3.8.0 beta 2? -================================== +- bpo-38804: Fixes a ReDoS vulnerability in :mod:`http.cookiejar`. Patch by + Ben Caller. -*Release date: 2019-07-04* +Core and Builtins +----------------- -Security --------- +- bpo-39028: Slightly improve the speed of keyword argument parsing with + many kwargs by strengthening the assumption that kwargs are interned + strings. -- bpo-37363: Adds audit events for the range of supported run commands (see - :ref:`using-on-general`). +- bpo-39080: Fix the value of *end_col_offset* for Starred Expression AST + nodes when they are among the elements in the *args* attribute of Call AST + nodes. -- bpo-37463: ssl.match_hostname() no longer accepts IPv4 addresses with - additional text after the address and only quad-dotted notation without - trailing whitespaces. Some inet_aton() implementations ignore whitespace - and all data after whitespace, e.g. '127.0.0.1 whatever'. +- bpo-39031: When parsing an "elif" node, lineno and col_offset of the node + now point to the "elif" keyword and not to its condition, making it + consistent with the "if" node. Patch by Lysandros Nikolaou. -- bpo-37363: Adds audit events for :mod:`ensurepip`, :mod:`ftplib`, - :mod:`glob`, :mod:`imaplib`, :mod:`nntplib`, :mod:`pdb`, :mod:`poplib`, - :mod:`shutil`, :mod:`smtplib`, :mod:`sqlite3`, :mod:`subprocess`, - :mod:`telnetlib`, :mod:`tempfile` and :mod:`webbrowser`, as well as - :func:`os.listdir`, :func:`os.scandir` and :func:`breakpoint`. +- bpo-20443: In Python 3.9.0a1, sys.argv[0] was made an absolute path if a + filename was specified on the command line. Revert this change, since most + users expect sys.argv to be unmodified. -- bpo-37364: :func:`io.open_code` is now used when reading :file:`.pth` - files. +- bpo-39008: :c:func:`PySys_Audit` now requires ``Py_ssize_t`` to be used + for size arguments in the format string, regardless of whether + ``PY_SSIZE_T_CLEAN`` was defined at include time. -- bpo-34631: Updated OpenSSL to 1.1.1c in Windows installer +- bpo-38673: In REPL mode, don't switch to PS2 if the line starts with + comment or whitespace. Based on work by Batuhan Taşkaya. -Core and Builtins ------------------ +- bpo-38922: Calling ``replace`` on a code object now raises the + ``code.__new__`` audit event. -- bpo-37467: Fix :func:`sys.excepthook` and :c:func:`PyErr_Display` if a - filename is a bytes string. For example, for a SyntaxError exception where - the filename attribute is a bytes string. +- bpo-38920: Add audit hooks for when :func:`sys.excepthook` and + :func:`sys.unraisablehook` are invoked. -- bpo-37417: :meth:`bytearray.extend` now correctly handles errors that - arise during iteration. Patch by Brandt Bucher. +- bpo-38892: Improve documentation for audit events table and functions. -- bpo-24214: Improved support of the surrogatepass error handler in the - UTF-8 and UTF-16 incremental decoders. +- bpo-38852: Set the thread stack size to 8 Mb for debug builds on android + platforms. -- bpo-35224: Reverse evaluation order of key: value in dict comprehensions - as proposed in PEP 572. I.e. in ``{k: v for ...}``, ``k`` will be - evaluated before ``v``. +- bpo-38858: Each Python subinterpreter now has its own "small integer + singletons": numbers in [-5; 257] range. It is no longer possible to + change the number of small integers at build time by overriding + ``NSMALLNEGINTS`` and ``NSMALLPOSINTS`` macros: macros should now be + modified manually in ``pycore_pystate.h`` header file. -- bpo-37316: Fix the :c:func:`PySys_Audit` call in :class:`mmap.mmap`. +- bpo-36854: The garbage collector state becomes per interpreter + (``PyInterpreterState.gc``), rather than being global + (``_PyRuntimeState.gc``). -- bpo-37269: Fix a bug in the peephole optimizer that was not treating - correctly constant conditions with binary operators. Patch by Pablo - Galindo. +- bpo-38835: The ``PyFPE_START_PROTECT()`` and ``PyFPE_END_PROTECT()`` + macros are empty: they have been doing nothing for the last year, so stop + using them. -- bpo-37213: Handle correctly negative line offsets in the peephole - optimizer. Patch by Pablo Galindo. +- bpo-38328: Sped up the creation time of constant :class:`list` and + :class:`set` displays. Patch by Brandt Bucher. -- bpo-37219: Remove errorneous optimization for empty set differences. +- bpo-38707: ``MainThread.native_id`` is now correctly reset in child + processes spawned using :class:`multiprocessing.Process`, instead of + retaining the parent's value. -- bpo-36922: Slot functions optimize any callable with - ``Py_TPFLAGS_METHOD_DESCRIPTOR`` instead of only instances of - ``function``. +- bpo-38629: Added ``__floor__`` and ``__ceil__`` methods to float object. + Patch by Batuhan Taşkaya. -- bpo-36974: The slot ``tp_vectorcall_offset`` is inherited unconditionally - to support ``super().__call__()`` when the base class uses vectorcall. +- bpo-27145: int + int and int - int operators can now return small integer + singletons. Patch by hongweipeng. -- bpo-37160: :func:`threading.get_native_id` now also supports NetBSD. +- bpo-38021: Provide a platform tag for AIX that is sufficient for PEP425 + binary distribution identification. Patch by Michael Felt. -- bpo-37077: Add :func:`threading.get_native_id` support for AIX. Patch by - M. Felt +- bpo-35409: Ignore GeneratorExit exceptions when throwing an exception into + the aclose coroutine of an asynchronous generator. + +- bpo-33387: Removed WITH_CLEANUP_START, WITH_CLEANUP_FINISH, BEGIN_FINALLY, + END_FINALLY, CALL_FINALLY and POP_FINALLY bytecodes. Replaced with RERAISE + and WITH_EXCEPT_FINISH bytecodes. The compiler now generates different + code for exceptional and non-exceptional branches for 'with' and + 'try-except' statements. For 'try-finally' statements the 'finally' block + is replicated for each exit from the 'try' body. Library ------- -- bpo-37440: http.client now enables TLS 1.3 post-handshake authentication - for default context or if a cert_file is passed to HTTPSConnection. +- bpo-39033: Fix :exc:`NameError` in :mod:`zipimport`. Patch by Karthikeyan + Singaravelan. -- bpo-37437: Update vendorized expat version to 2.2.7. +- bpo-39022: Update importlib.metadata to include improvements from + importlib_metadata 1.3 including better serialization of EntryPoints and + improved documentation for custom finders. -- bpo-37428: SSLContext.post_handshake_auth = True no longer sets - SSL_VERIFY_POST_HANDSHAKE verify flag for client connections. Although the - option is documented as ignored for clients, OpenSSL implicitly enables - cert chain validation when the flag is set. +- bpo-39006: Fix asyncio when the ssl module is missing: only check for + ssl.SSLSocket instance if the ssl module is available. -- bpo-37420: :func:`os.sched_setaffinity` now correctly handles errors that - arise during iteration over its ``mask`` argument. Patch by Brandt Bucher. +- bpo-38708: Fix a potential IndexError in email parser when parsing an + empty msg-id. -- bpo-37412: The :func:`os.getcwdb` function now uses the UTF-8 encoding on - Windows, rather than the ANSI code page: see :pep:`529` for the rationale. - The function is no longer deprecated on Windows. +- bpo-38698: Add a new ``InvalidMessageID`` token to email parser to + represent invalid Message-ID headers. Also, add defects when there is + remaining value after parsing the header. -- bpo-29412: Fix IndexError in parsing a header value ending unexpectedly. - Patch by Abhilash Raj. +- bpo-38994: Implement ``__class_getitem__`` for ``os.PathLike``, + ``pathlib.Path``. -- bpo-36546: The *dist* argument for statistics.quantiles() is now - positional only. The current name doesn't reflect that the argument can be - either a dataset or a distribution. Marking the parameter as positional - avoids confusion and makes it possible to change the name later. +- bpo-38979: Return class from ``ContextVar.__class_getitem__`` to simplify + subclassing. -- bpo-37394: Fix a bug that was causing the :mod:`queue` module to fail if - the accelerator module was not available. Patch by Pablo Galindo. +- bpo-38978: Implement ``__class_getitem__`` on asyncio objects (Future, + Task, Queue). Patch by Batuhan Taskaya. -- bpo-33972: Email with single part but content-type set to ``multipart/*`` - doesn't raise AttributeError anymore. +- bpo-38916: :class:`array.array`: Remove ``tostring()`` and + ``fromstring()`` methods. They were aliases to ``tobytes()`` and + ``frombytes()``, deprecated since Python 3.2. -- bpo-37280: Use threadpool for reading from file for sendfile fallback - mode. +- bpo-38986: Make repr of C accelerated TaskWakeupMethWrapper the same as of + pure Python version. -- bpo-37279: Fix asyncio sendfile support when sendfile sends extra data in - fallback mode. +- bpo-38982: Fix asyncio ``PidfdChildWatcher``: handle ``waitpid()`` error. + If ``waitpid()`` is called elsewhere, ``waitpid()`` call fails with + :exc:`ChildProcessError`: use return code 255 in this case, and log a + warning. It ensures that the pidfd file descriptor is closed if this error + occurs. -- bpo-19865: :func:`ctypes.create_unicode_buffer()` now also supports - non-BMP characters on platforms with 16-bit :c:type:`wchar_t` (for - example, Windows and AIX). +- bpo-38529: Drop too noisy asyncio warning about deletion of a stream + without explicit ``.close()`` call. -- bpo-37210: Allow pure Python implementation of :mod:`pickle` to work even - when the C :mod:`_pickle` module is unavailable. +- bpo-27413: Added ability to pass through ``ensure_ascii`` options to + json.dumps in the ``json.tool`` command-line interface. -- bpo-35922: Fix :meth:`RobotFileParser.crawl_delay` and - :meth:`RobotFileParser.request_rate` to return ``None`` rather than raise - :exc:`AttributeError` when no relevant rule is defined in the robots.txt - file. Patch by Rémi Lapeyre. +- bpo-38634: The :mod:`readline` module now detects if Python is linked to + libedit at runtime on all platforms. Previously, the check was only done + on macOS. -- bpo-35766: Change the format of feature_version to be a (major, minor) - tuple. +- bpo-33684: Fix ``json.tool`` failed to read a JSON file with non-ASCII + characters when locale encoding is not UTF-8. -- bpo-36607: Eliminate :exc:`RuntimeError` raised by - :func:`asyncio.all_tasks()` if internal tasks weak set is changed by - another thread during iteration. +- bpo-38698: Prevent UnboundLocalError to pop up in parse_message_id. -- bpo-18748: :class:`_pyio.IOBase` destructor now does nothing if getting - the ``closed`` attribute fails to better mimick :class:`_io.IOBase` - finalizer. + parse_message_id() was improperly using a token defined inside an + exception handler, which was raising `UnboundLocalError` on parsing an + invalid value. Patch by Claudiu Popa. -- bpo-36402: Fix a race condition at Python shutdown when waiting for - threads. Wait until the Python thread state of all non-daemon threads get - deleted (join all non-daemon threads), rather than just wait until - non-daemon Python threads complete. +- bpo-38927: Use ``python -m pip`` instead of ``pip`` to upgrade + dependencies in venv. -- bpo-34886: Fix an unintended ValueError from :func:`subprocess.run` when - checking for conflicting `input` and `stdin` or `capture_output` and - `stdout` or `stderr` args when they were explicitly provided but with - `None` values within a passed in `**kwargs` dict rather than as passed - directly by name. Patch contributed by Rémi Lapeyre. +- bpo-26730: Fix ``SpooledTemporaryFile.rollover()`` might corrupt the file + when it is in text mode. Patch by Serhiy Storchaka. -- bpo-37173: The exception message for ``inspect.getfile()`` now correctly - reports the passed class rather than the builtins module. +- bpo-38881: random.choices() now raises a ValueError when all the weights + are zero. -- bpo-37178: Give math.perm() a one argument form that means the same as - math.factorial(). +- bpo-38876: Raise pickle.UnpicklingError when loading an item from memo for + invalid input. -- bpo-37178: For math.perm(n, k), let k default to n, giving the same result - as factorial. + The previous code was raising a `KeyError` for both the Python and C + implementation. This was caused by the specified index of an invalid input + which did not exist in the memo structure, where the pickle stores what + objects it has seen. The malformed input would have caused either a + `BINGET` or `LONG_BINGET` load from the memo, leading to a `KeyError` as + the determined index was bogus. Patch by Claudiu Popa -- bpo-37163: Deprecated passing ``obj`` argument of - :func:`dataclasses.replace` as keyword argument. +- bpo-38688: Calling func:`shutil.copytree` to copy a directory tree from + one directory to another subdirectory resulted in an endless loop and a + RecursionError. A fix was added to consume an iterator and create the list + of the entries to be copied, avoiding the recursion for newly created + directories. Patch by Bruno P. Kinoshita. -- bpo-37165: Converted _collections._count_elements to use the Argument - Clinic. +- bpo-38863: Improve :func:`is_cgi` function in :mod:`http.server`, which + enables processing the case that cgi directory is a child of another + directory other than root. -- bpo-34767: Do not always create a :class:`collections.deque` in - :class:`asyncio.Lock`. +- bpo-37838: :meth:`typing.get_type_hints` properly handles functions + decorated with :meth:`functools.wraps`. -- bpo-37158: Speed-up statistics.fmean() by switching from a function to a - generator. +- bpo-38870: Expose :func:`ast.unparse` as a function of the :mod:`ast` + module that can be used to unparse an :class:`ast.AST` object and produce + a string with code that would produce an equivalent :class:`ast.AST` + object when parsed. Patch by Pablo Galindo and Batuhan Taskaya. -- bpo-37150: `argparse._ActionsContainer.add_argument` now throws error, if - someone accidentally pass FileType class object instead of instance of - FileType as `type` argument +- bpo-38859: AsyncMock now returns StopAsyncIteration on the exhaustion of a + side_effects iterable. Since PEP-479 its Impossible to raise a + StopIteration exception from a coroutine. -- bpo-35621: Support running asyncio subprocesses when execution event loop - in a thread on UNIX. +- bpo-38857: AsyncMock fix for return values that are awaitable types. This + also covers side_effect iterable values that happened to be awaitable, and + wraps callables that return an awaitable type. Before these awaitables + were being awaited instead of being returned as is. -- bpo-36520: Lengthy email headers with UTF-8 characters are now properly - encoded when they are folded. Patch by Jeffrey Kintscher. +- bpo-38834: :class:`typing.TypedDict` subclasses now track which keys are + optional using the ``__required_keys__`` and ``__optional_keys__`` + attributes, to enable runtime validation by downstream projects. Patch by + Zac Hatfield-Dodds. -- bpo-30835: Fixed a bug in email parsing where a message with invalid bytes - in content-transfer-encoding of a multipart message can cause an - AttributeError. Patch by Andrew Donnellan. +- bpo-38821: Fix unhandled exceptions in :mod:`argparse` when + internationalizing error messages for arguments with ``nargs`` set to + special (non-integer) values. Patch by Federico Bond. -- bpo-35805: Add parser for Message-ID header and add it to default - HeaderRegistry. This should prevent folding of Message-ID using RFC 2048 - encoded words. +- bpo-38820: Make Python compatible with OpenSSL 3.0.0. + :func:`ssl.SSLSocket.getpeercert` no longer returns IPv6 addresses with a + trailing new line. -- bpo-35070: posix.getgrouplist() now works correctly when the user belongs - to NGROUPS_MAX supplemental groups. Patch by Jeffrey Kintscher. +- bpo-38811: Fix an unhandled exception in :mod:`pathlib` when + :meth:`os.link` is missing. Patch by Toke Høiland-Jørgensen. -- bpo-32627: Fix compile error when ``_uuid`` headers conflicting included. +- bpo-38686: Added support for multiple ``qop`` values in + :class:`urllib.request.AbstractDigestAuthHandler`. -- bpo-11122: Distutils won't check for rpmbuild in specified paths only. +- bpo-38712: Add the Linux-specific :func:`signal.pidfd_send_signal` + function, which allows sending a signal to a process identified by a file + descriptor rather than a pid. -- bpo-4963: Fixed non-deterministic behavior related to mimetypes extension - mapping and module reinitialization. +- bpo-38348: Add ``-i`` and ``--indent`` (indentation level), and + ``--no-type-comments`` (type comments) command line options to ast parsing + tool. -Documentation -------------- +- bpo-37523: Change :class:`zipfile.ZipExtFile` to raise ``ValueError`` when + trying to access the underlying file object after it has been closed. This + new behavior is consistent with how accessing closed files is handled in + other parts of Python. -- bpo-34903: Documented that in :meth:`datetime.datetime.strptime()`, the - leading zero in some two-digit formats is optional. Patch by Mike Gleen. +- bpo-38045: Improve the performance of :func:`enum._decompose` in + :mod:`enum`. Patch by hongweipeng. -Tests ------ +- bpo-36820: Break cycle generated when saving an exception in socket.py, + codeop.py and dyld.py as they keep alive not only the exception but user + objects through the ``__traceback__`` attribute. Patch by Mario Corchero. + +- bpo-36406: Handle namespace packages in :mod:`doctest`. Patch by + Karthikeyan Singaravelan. + +- bpo-34776: Fix dataclasses to support forward references in type + annotations + +- bpo-20928: ElementTree supports recursive XInclude processing. Patch by + Stefan Behnel. + +- bpo-29636: Add whitespace options for formatting JSON with the + ``json.tool`` CLI. The following mutually exclusive options are now + supported: ``--indent`` for setting the indent level in spaces; ``--tab`` + for indenting with tabs; ``--no-indent`` for suppressing newlines; and + ``--compact`` for suppressing all whitespace. The default behavior remains + the same as ``--indent=4``. + +Documentation +------------- + +- bpo-38928: Correct when venv's ``upgrade_dependencies()`` and + ``--upgrade-deps`` are added. + +- bpo-38899: Update documentation to state that to activate virtual + environments under fish one should use `source`, not `.` as documented at + https://fishshell.com/docs/current/commands.html#source. + +- bpo-22377: Improves documentation of the values that + :meth:`datetime.datetime.strptime` accepts for ``%Z``. Patch by Karl + Dubost. + +Tests +----- + +- bpo-38546: Fix test_ressources_gced_in_workers() of + test_concurrent_futures: explicitly stop the manager to prevent leaking a + child process running in the background after the test completes. + +- bpo-38546: Multiprocessing and concurrent.futures tests now stop the + resource tracker process when tests complete. + +- bpo-38614: Replace hardcoded timeout constants in tests with new + :mod:`test.support` constants: :data:`~test.support.LOOPBACK_TIMEOUT`, + :data:`~test.support.INTERNET_TIMEOUT`, + :data:`~test.support.SHORT_TIMEOUT` and + :data:`~test.support.LONG_TIMEOUT`. It becomes easier to adjust these four + timeout constants for all tests at once, rather than having to adjust + every single test file. + +- bpo-38547: Fix test_pty: if the process is the session leader, closing the + master file descriptor raises a SIGHUP signal: simply ignore SIGHUP when + running the tests. + +- bpo-38992: Fix a test for :func:`math.fsum` that was failing due to + constant folding. + +- bpo-38991: :mod:`test.support`: + :func:`~test.support.run_python_until_end`, + :func:`~test.support.assert_python_ok` and + :func:`~test.support.assert_python_failure` functions no longer strip + whitespaces from stderr. Remove ``test.support.strip_python_stderr()`` + function. + +- bpo-38965: Fix test_faulthandler on GCC 10. Use the "volatile" keyword in + ``faulthandler._stack_overflow()`` to prevent tail call optimization on + any compiler, rather than relying on compiler specific pragma. + +- bpo-38875: test_capi: trashcan tests now require the test "cpu" resource. + +- bpo-38841: Skip asyncio test_create_datagram_endpoint_existing_sock_unix + on platforms lacking a functional bind() for named unix domain sockets. + +- bpo-38692: Skip the test_posix.test_pidfd_open() test if + ``os.pidfd_open()`` fails with a :exc:`PermissionError`. This situation + can happen in a Linux sandbox using a syscall whitelist which doesn't + allow the ``pidfd_open()`` syscall yet. + +- bpo-38839: Fix some unused functions in tests. Patch by Adam Johnson. + +- bpo-38669: Raise :exc:`TypeError` when passing target as a string with + :meth:`unittest.mock.patch.object`. + +- bpo-37957: test.regrtest now can receive a list of test patterns to ignore + (using the -i/--ignore argument) or a file with a list of patterns to + ignore (using the --ignore-file argument). Patch by Pablo Galindo. + +Build +----- + +- bpo-37404: :mod:`asyncio` now raises :exc:`TyperError` when calling + incompatible methods with an :class:`ssl.SSLSocket` socket. Patch by Ido + Michael. + +- bpo-36500: Added an optional "regen" project to the Visual Studio solution + that will regenerate all grammar, tokens, and opcodes. + +Windows +------- + +- bpo-39007: Add auditing events to functions in :mod:`winreg`. + +- bpo-33125: Add support for building and releasing Windows ARM64 packages. + +macOS +----- + +- bpo-37931: Fixed a crash on OSX dynamic builds that occurred when + re-initializing the posix module after a Py_Finalize if the environment + had changed since the previous `import posix`. Patch by Benoît Hudson. + +IDLE +---- + +- bpo-38944: Escape key now closes IDLE completion windows. Patch by Johnny + Najera. + +- bpo-38943: Fix IDLE autocomplete windows not always appearing on some + systems. Patch by Johnny Najera. + +- bpo-38862: 'Strip Trailing Whitespace' on the Format menu removes extra + newlines at the end of non-shell files. + +- bpo-38636: Fix IDLE Format menu tab toggle and file indent width. These + functions (default shortcuts Alt-T and Alt-U) were mistakenly disabled in + 3.7.5 and 3.8.0. + +C API +----- + +- bpo-38896: Remove ``PyUnicode_ClearFreeList()`` function: the Unicode free + list has been removed in Python 3.3. + +- bpo-37340: Remove ``PyMethod_ClearFreeList()`` and + ``PyCFunction_ClearFreeList()`` functions: the free lists of bound method + objects have been removed. + +- bpo-38835: Exclude ``PyFPE_START_PROTECT()`` and ``PyFPE_END_PROTECT()`` + macros of ``pyfpe.h`` from ``Py_LIMITED_API`` (stable API). + + +What's New in Python 3.9.0 alpha 1? +=================================== + +*Release date: 2019-11-19* + +Security +-------- + +- bpo-38722: :mod:`runpy` now uses :meth:`io.open_code` to open code files. + Patch by Jason Killen. + +- bpo-38622: Add additional audit events for the :mod:`ctypes` module. + +- bpo-38418: Fixes audit event for :func:`os.system` to be named + ``os.system``. + +- bpo-38243: Escape the server title of + :class:`xmlrpc.server.DocXMLRPCServer` when rendering the document page as + HTML. (Contributed by Dong-hee Na in :issue:`38243`.) + +- bpo-38174: Update vendorized expat library version to 2.2.8, which + resolves CVE-2019-15903. + +- bpo-37764: Fixes email._header_value_parser.get_unstructured going into an + infinite loop for a specific case in which the email header does not have + trailing whitespace, and the case in which it contains an invalid encoded + word. Patch by Ashwin Ramaswami. + +- bpo-37461: Fix an infinite loop when parsing specially crafted email + headers. Patch by Abhilash Raj. + +- bpo-37363: Adds audit events for the range of supported run commands (see + :ref:`using-on-general`). + +- bpo-37463: ssl.match_hostname() no longer accepts IPv4 addresses with + additional text after the address and only quad-dotted notation without + trailing whitespaces. Some inet_aton() implementations ignore whitespace + and all data after whitespace, e.g. '127.0.0.1 whatever'. + +- bpo-37363: Adds audit events for :mod:`ensurepip`, :mod:`ftplib`, + :mod:`glob`, :mod:`imaplib`, :mod:`nntplib`, :mod:`pdb`, :mod:`poplib`, + :mod:`shutil`, :mod:`smtplib`, :mod:`sqlite3`, :mod:`subprocess`, + :mod:`telnetlib`, :mod:`tempfile` and :mod:`webbrowser`, as well as + :func:`os.listdir`, :func:`os.scandir` and :func:`breakpoint`. + +- bpo-37364: :func:`io.open_code` is now used when reading :file:`.pth` + files. + +- bpo-34631: Updated OpenSSL to 1.1.1c in Windows installer + +- bpo-34155: Fix parsing of invalid email addresses with more than one ``@`` + (e.g. a@b@c.com.) to not return the part before 2nd ``@`` as valid email + address. Patch by maxking & jpic. + +Core and Builtins +----------------- + +- bpo-38631: Replace ``Py_FatalError()`` call with a regular + :exc:`RuntimeError` exception in :meth:`float.__getformat__`. + +- bpo-38639: Optimized :func:`math.floor()`, :func:`math.ceil()` and + :func:`math.trunc()` for floats. + +- bpo-38640: Fixed a bug in the compiler that was causing to raise in the + presence of break statements and continue statements inside always false + while loops. Patch by Pablo Galindo. + +- bpo-38613: Optimized some set operations (e.g. ``|``, ``^``, and ``-``) of + ``dict_keys``. ``d.keys() | other`` was slower than ``set(d) | other`` but + they are almost same performance for now. + +- bpo-28029: ``"".replace("", s, n)`` now returns ``s`` instead of an empty + string for all non-zero ``n``. There are similar changes for + :class:`bytes` and :class:`bytearray` objects. + +- bpo-38535: Fixed line numbers and column offsets for AST nodes for calls + without arguments in decorators. + +- bpo-38525: Fix a segmentation fault when using reverse iterators of empty + ``dict`` objects. Patch by Dong-hee Na and Inada Naoki. + +- bpo-38465: :class:`bytearray`, :class:`~array.array` and + :class:`~mmap.mmap` objects allow now to export more than 2**31 buffers at + a time. + +- bpo-38469: Fixed a bug where the scope of named expressions was not being + resolved correctly in the presence of the *global* keyword. Patch by Pablo + Galindo. + +- bpo-38437: Activate the ``GC_DEBUG`` macro for debug builds of the + interpreter (when ``Py_DEBUG`` is set). Patch by Pablo Galindo. + +- bpo-38379: When the garbage collector makes a collection in which some + objects resurrect (they are reachable from outside the isolated cycles + after the finalizers have been executed), do not block the collection of + all objects that are still unreachable. Patch by Pablo Galindo and Tim + Peters. + +- bpo-38379: When cyclic garbage collection (gc) runs finalizers that + resurrect unreachable objects, the current gc run ends, without collecting + any cyclic trash. However, the statistics reported by ``collect()`` and + ``get_stats()`` claimed that all cyclic trash found was collected, and + that the resurrected objects were collected. Changed the stats to report + that none were collected. + +- bpo-38392: In debug mode, :c:func:`PyObject_GC_Track` now calls + ``tp_traverse()`` of the object type to ensure that the object is valid: + test that objects visited by ``tp_traverse()`` are valid. + +- bpo-38210: Remove unecessary intersection and update set operation in + dictview with empty set. (Contributed by Dong-hee Na in :issue:`38210`.) + +- bpo-38402: Check the error from the system's underlying ``crypt`` or + ``crypt_r``. + +- bpo-37474: On FreeBSD, Python no longer calls ``fedisableexcept()`` at + startup to control the floating point control mode. The call became + useless since FreeBSD 6: it became the default mode. + +- bpo-38006: Fix a bug due to the interaction of weakrefs and the cyclic + garbage collector. We must clear any weakrefs in garbage in order to + prevent their callbacks from executing and causing a crash. + +- bpo-38317: Fix warnings options priority: ``PyConfig.warnoptions`` has the + highest priority, as stated in the :pep:`587`. + +- bpo-38310: Predict ``BUILD_MAP_UNPACK_WITH_CALL`` -> ``CALL_FUNCTION_EX`` + opcode pairs in the main interpreter loop. Patch by Brandt Bucher. + +- bpo-36871: Improve error handling for the assert_has_calls and + assert_has_awaits methods of mocks. Fixed a bug where any errors + encountered while binding the expected calls to the mock's spec were + silently swallowed, leading to misleading error output. + +- bpo-11410: Better control over symbol visibility is provided through use + of the visibility attributes available in gcc >= 4.0, provided in a + uniform way across POSIX and Windows. The POSIX build files have been + updated to compile with -fvisibility=hidden, minimising exported symbols. + +- bpo-38219: Optimized the :class:`dict` constructor and the + :meth:`~dict.update` method for the case when the argument is a dict. + +- bpo-38236: Python now dumps path configuration if it fails to import the + Python codecs of the filesystem and stdio encodings. + +- bpo-38013: Allow to call ``async_generator_athrow().throw(...)`` even for + non-started async generator helper. It fixes annoying warning at the end + of :func:`asyncio.run` call. + +- bpo-38124: Fix an off-by-one error in PyState_AddModule that could cause + out-of-bounds memory access. + +- bpo-38116: The select module is now PEP-384 compliant and no longer has + static state + +- bpo-38113: ast module updated to PEP-384 and all statics removed + +- bpo-38076: The struct module is now PEP-384 compatible + +- bpo-38075: The random module is now PEP-384 compatible + +- bpo-38074: zlib module made PEP-384 compatible + +- bpo-38073: Make pwd extension module PEP-384 compatible + +- bpo-38072: grp module made PEP-384 compatible + +- bpo-38069: Make _posixsubprocess PEP-384 compatible + +- bpo-38071: Make termios extension module PEP-384 compatible + +- bpo-38005: Fixed comparing and creating of InterpreterID and ChannelID. + +- bpo-36946: Fix possible signed integer overflow when handling slices. + Patch by hongweipeng. + +- bpo-37994: Fixed silencing arbitrary errors if an attribute lookup fails + in several sites. Only AttributeError should be silenced. + +- bpo-8425: Optimize set difference_update for the case when the other set + is much larger than the base set. (Suggested by Evgeny Kapun with code + contributed by Michele Orrù). + +- bpo-37966: The implementation of :func:`~unicodedata.is_normalized` has + been greatly sped up on strings that aren't normalized, by implementing + the full normalization-quick-check algorithm from the Unicode standard. + +- bpo-37947: Adjust correctly the recursion level in the symtable generation + for named expressions. Patch by Pablo Galindo. + +- bpo-37812: The ``CHECK_SMALL_INT`` macro used inside + :file:`Object/longobject.c` has been replaced with an explicit ``return`` + at each call site. + +- bpo-37751: Fix :func:`codecs.lookup` to normalize the encoding name the + same way than :func:`encodings.normalize_encoding`, except that + :func:`codecs.lookup` also converts the name to lower case. + +- bpo-37830: Fixed compilation of :keyword:`break` and :keyword:`continue` + in the :keyword:`finally` block when the corresponding :keyword:`try` + block contains :keyword:`return` with a non-constant value. + +- bpo-20490: Improve import error message for partially initialized module + on circular ``from`` imports - by Anthony Sottile. + +- bpo-37840: Fix handling of negative indices in + :c:member:`~PySequenceMethods.sq_item` of :class:`bytearray`. Patch by + Sergey Fedoseev. + +- bpo-37802: Slightly improve performance of + :c:func:`PyLong_FromUnsignedLong`, :c:func:`PyLong_FromUnsignedLongLong` + and :c:func:`PyLong_FromSize_t`. Patch by Sergey Fedoseev. + +- bpo-37409: Ensure explicit relative imports from interactive sessions and + scripts (having no parent package) always raise ImportError, rather than + treating the current module as the package. Patch by Ben Lewis. + +- bpo-32912: Reverted :issue:`32912`: emitting :exc:`SyntaxWarning` instead + of :exc:`DeprecationWarning` for invalid escape sequences in string and + bytes literals. + +- bpo-37757: :pep:`572`: As described in the PEP, assignment expressions now + raise :exc:`SyntaxError` when their interaction with comprehension scoping + results in an ambiguous target scope. + + The ``TargetScopeError`` subclass originally proposed by the PEP has been + removed in favour of just raising regular syntax errors for the disallowed + cases. + +- bpo-36279: Fix potential use of uninitialized memory in :func:`os.wait3`. + +- bpo-36311: Decoding bytes objects larger than 2GiB is faster and no longer + fails when a multibyte characters spans a chunk boundary. + +- bpo-34880: The :keyword:`assert` statement now works properly if the + :exc:`AssertionError` exception is being shadowed. Patch by Zackery Spytz. + +- bpo-37340: Removed object cache (``free_list``) for bound method objects. + Temporary bound method objects are less used than before thanks to the + ``LOAD_METHOD`` opcode and the ``_PyObject_VectorcallMethod`` C API. + +- bpo-37648: Fixed minor inconsistency in :meth:`list.__contains__`, + :meth:`tuple.__contains__` and a few other places. The collection's item + is now always at the left and the needle is on the right of ``==``. + +- bpo-37444: Update differing exception between :meth:`builtins.__import__` + and :meth:`importlib.__import__`. + +- bpo-37619: When adding a wrapper descriptor from one class to a different + class (for example, setting ``__add__ = str.__add__`` on an ``int`` + subclass), an exception is correctly raised when the operator is called. + +- bpo-37593: Swap the positions of the *posonlyargs* and *args* parameters + in the constructor of :class:`ast.parameters` nodes. + +- bpo-37543: Optimized pymalloc for non PGO build. + +- bpo-37537: Compute allocated pymalloc blocks inside + _Py_GetAllocatedBlocks(). This slows down _Py_GetAllocatedBlocks() but + gives a small speedup to _PyObject_Malloc() and _PyObject_Free(). + +- bpo-37467: Fix :func:`sys.excepthook` and :c:func:`PyErr_Display` if a + filename is a bytes string. For example, for a SyntaxError exception where + the filename attribute is a bytes string. + +- bpo-37433: Fix ``SyntaxError`` indicator printing too many spaces for + multi-line strings - by Anthony Sottile. + +- bpo-37417: :meth:`bytearray.extend` now correctly handles errors that + arise during iteration. Patch by Brandt Bucher. + +- bpo-37414: The undocumented ``sys.callstats()`` function has been removed. + Since Python 3.7, it was deprecated and always returned ``None``. It + required a special build option ``CALL_PROFILE`` which was already removed + in Python 3.7. + +- bpo-37392: Remove ``sys.getcheckinterval()`` and + ``sys.setcheckinterval()`` functions. They were deprecated since Python + 3.2. Use :func:`sys.getswitchinterval` and :func:`sys.setswitchinterval` + instead. Remove also ``check_interval`` field of the + ``PyInterpreterState`` structure. + +- bpo-37388: In development mode and in debug build, *encoding* and *errors* + arguments are now checked on string encoding and decoding operations. + Examples: :func:`open`, :meth:`str.encode` and :meth:`bytes.decode`. + + By default, for best performances, the *errors* argument is only checked + at the first encoding/decoding error, and the *encoding* argument is + sometimes ignored for empty strings. + +- bpo-37348: Optimized decoding short ASCII string with UTF-8 and ascii + codecs. ``b"foo".decode()`` is about 15% faster. Patch by Inada Naoki. + +- bpo-24214: Improved support of the surrogatepass error handler in the + UTF-8 and UTF-16 incremental decoders. + +- bpo-37330: :func:`open`, :func:`io.open`, :func:`codecs.open` and + :class:`fileinput.FileInput` no longer accept ``'U'`` ("universal + newline") in the file mode. This flag was deprecated since Python 3.3. + +- bpo-35224: Reverse evaluation order of key: value in dict comprehensions + as proposed in PEP 572. I.e. in ``{k: v for ...}``, ``k`` will be + evaluated before ``v``. + +- bpo-37316: Fix the :c:func:`PySys_Audit` call in :class:`mmap.mmap`. + +- bpo-37300: Remove an unnecssary Py_XINCREF in classobject.c. + +- bpo-37269: Fix a bug in the peephole optimizer that was not treating + correctly constant conditions with binary operators. Patch by Pablo + Galindo. + +- bpo-20443: Python now gets the absolute path of the script filename + specified on the command line (ex: "python3 script.py"): the __file__ + attribute of the __main__ module and sys.path[0] become an absolute path, + rather than a relative path. + +- bpo-37257: Python's small object allocator (``obmalloc.c``) now allows (no + more than) one empty arena to remain available for immediate reuse, + without returning it to the OS. This prevents thrashing in simple loops + where an arena could be created and destroyed anew on each iteration. + +- bpo-37231: The dispatching of type slots to special methods (for example + calling ``__mul__`` when doing ``x * y``) has been made faster. + +- bpo-36974: Implemented separate vectorcall functions for every calling + convention of builtin functions and methods. This improves performance for + calls. + +- bpo-37213: Handle correctly negative line offsets in the peephole + optimizer. Patch by Pablo Galindo. + +- bpo-37219: Remove erroneous optimization for empty set differences. + +- bpo-15913: Implement :c:func:`PyBuffer_SizeFromFormat()` function + (previously documented but not implemented): call :func:`struct.calcsize`. + Patch by Joannah Nanjekye. + +- bpo-36922: Slot functions optimize any callable with + ``Py_TPFLAGS_METHOD_DESCRIPTOR`` instead of only instances of + ``function``. + +- bpo-36974: The slot ``tp_vectorcall_offset`` is inherited unconditionally + to support ``super().__call__()`` when the base class uses vectorcall. + +- bpo-37160: :func:`threading.get_native_id` now also supports NetBSD. + +- bpo-37077: Add :func:`threading.get_native_id` support for AIX. Patch by + M. Felt + +- bpo-36781: :func:`sum` has been optimized for boolean values. + +- bpo-34556: Add ``--upgrade-deps`` to venv module. Patch by Cooper Ry Lees + +- bpo-20523: ``pdb.Pdb`` supports ~/.pdbrc in Windows 7. Patch by Tim Hopper + and Dan Lidral-Porter. + +- bpo-35551: Updated encodings: - Removed the "tis260" encoding, which was + an alias for the nonexistent "tactis" codec. - Added "mac_centeuro" as an + alias for the mac_latin2 encoding. + +- bpo-19072: The :class:`classmethod` decorator can now wrap other + descriptors such as property objects. Adapted from a patch written by + Graham Dumpleton. + +- bpo-27575: Improve speed of dictview intersection by directly using set + intersection logic. Patch by David Su. + +- bpo-30773: Prohibit parallel running of aclose() / asend() / athrow(). Fix + ag_running to reflect the actual running status of the AG. + +Library +------- + +- bpo-36589: The :func:`curses.update_lines_cols` function now returns + ``None`` instead of ``1`` on success. + +- bpo-38807: Update :exc:`TypeError` messages for :meth:`os.path.join` to + include :class:`os.PathLike` objects as acceptable input types. + +- bpo-38724: Add a repr for ``subprocess.Popen`` objects. Patch by Andrey + Doroschenko. + +- bpo-38786: pydoc now recognizes and parses HTTPS URLs. Patch by python273. + +- bpo-38785: Prevent asyncio from crashing if parent ``__init__`` is not + called from a constructor of object derived from ``asyncio.Future``. + +- bpo-38723: :mod:`pdb` now uses :meth:`io.open_code` to trigger auditing + events. + +- bpo-27805: Allow opening pipes and other non-seekable files in append mode + with :func:`open`. + +- bpo-38438: Simplify the :mod:`argparse` usage message for ``nargs="*"``. + +- bpo-38761: WeakSet is now registered as a collections.abc.MutableSet. + +- bpo-38716: logging: change RotatingHandler namer and rotator to + class-level attributes. This stops __init__ from setting them to None in + the case where a subclass defines them with eponymous methods. + +- bpo-38713: Add :data:`os.P_PIDFD` constant, which may be passed to + :func:`os.waitid` to wait on a Linux process file descriptor. + +- bpo-38692: Add :class:`asyncio.PidfdChildWatcher`, a Linux-specific child + watcher implementation that polls process file descriptors. + +- bpo-38692: Expose the Linux ``pidfd_open`` syscall as + :func:`os.pidfd_open`. + +- bpo-38602: Added constants :data:`~fcntl.F_OFD_GETLK`, + :data:`~fcntl.F_OFD_SETLK` and :data:`~fcntl.F_OFD_SETLKW` to the + :mod:`fcntl` module. Patch by Dong-hee Na. + +- bpo-38334: Fixed seeking backward on an encrypted + :class:`zipfile.ZipExtFile`. + +- bpo-38312: Add :func:`curses.get_escdelay`, :func:`curses.set_escdelay`, + :func:`curses.get_tabsize`, and :func:`curses.set_tabsize` functions - by + Anthony Sottile. + +- bpo-38586: Now :func:`~logging.config.fileConfig` correcty sets the .name + of handlers loaded. + +- bpo-38565: Add new cache_parameters() method for functools.lru_cache() to + better support pickling. + +- bpo-34679: asynci.ProactorEventLoop.close() now only calls + signal.set_wakeup_fd() in the main thread. + +- bpo-31202: The case the result of :func:`pathlib.WindowsPath.glob` matches + now the case of the pattern for literal parts. + +- bpo-36321: Remove misspelled attribute. The 3.8 changelog noted that this + would be removed in 3.9. + +- bpo-38521: Fixed erroneous equality comparison in statistics.NormalDist(). + +- bpo-38493: Added :data:`~os.CLD_KILLED` and :data:`~os.CLD_STOPPED` for + :attr:`si_code`. Patch by Dong-hee Na. + +- bpo-38478: Fixed a bug in :meth:`inspect.signature.bind` that was causing + it to fail when handling a keyword argument with same name as + positional-only parameter. Patch by Pablo Galindo. + +- bpo-33604: Fixed `hmac.new` and `hmac.HMAC` to raise TypeError instead of + ValueError when the digestmod parameter, now required in 3.8, is omitted. + Also clarified the hmac module documentation and docstrings. + +- bpo-38378: Parameters *out* and *in* of :func:`os.sendfile` was renamed to + *out_fd* and *in_fd*. + +- bpo-38417: Added support for setting the umask in the child process to the + subprocess module on POSIX systems. + +- bpo-38449: Revert GH-15522, which introduces a regression in + :meth:`mimetypes.guess_type` due to improper handling of filenames as + urls. + +- bpo-38431: Fix ``__repr__`` method for :class:`dataclasses.InitVar` to + support typing objects, patch by Samuel Colvin. + +- bpo-38109: Add missing :data:`stat.S_IFDOOR`, :data:`stat.S_IFPORT`, + :data:`stat.S_IFWHT`, :func:`stat.S_ISDOOR`, :func:`stat.S_ISPORT`, and + :func:`stat.S_ISWHT` values to the Python implementation of :mod:`stat`. + +- bpo-38422: Clarify docstrings of pathlib suffix(es) + +- bpo-38405: Nested subclasses of :class:`typing.NamedTuple` are now + pickleable. + +- bpo-38332: Prevent :exc:`KeyError` thrown by :func:`_encoded_words.decode` + when given an encoded-word with invalid content-type encoding from + propagating all the way to :func:`email.message.get`. + +- bpo-38371: Deprecated the ``split()`` method in + :class:`_tkinter.TkappType` in favour of the ``splitlist()`` method which + has more consistent and predicable behavior. + +- bpo-38341: Add :exc:`smtplib.SMTPNotSupportedError` to the :mod:`smtplib` + exported names. + +- bpo-38319: sendfile() used in socket and shutil modules was raising + OverflowError for files >= 2GiB on 32-bit architectures. (patch by + Giampaolo Rodola) + +- bpo-38242: Revert the new asyncio Streams API + +- bpo-13153: OS native encoding is now used for converting between Python + strings and Tcl objects. This allows to display, copy and paste to + clipboard emoji and other non-BMP characters. Converting strings from Tcl + to Python and back now never fails (except MemoryError). + +- bpo-38019: Correctly handle pause/resume reading of closed asyncio unix + pipe. + +- bpo-38163: Child mocks will now detect their type as either synchronous or + asynchronous, asynchronous child mocks will be AsyncMocks and synchronous + child mocks will be either MagicMock or Mock (depending on their parent + type). + +- bpo-38161: Removes _AwaitEvent from AsyncMock. + +- bpo-38216: Allow the rare code that wants to send invalid http requests + from the `http.client` library a way to do so. The fixes for bpo-30458 + led to breakage for some projects that were relying on this ability to + test their own behavior in the face of bad requests. + +- bpo-28286: Deprecate opening :class:`~gzip.GzipFile` for writing + implicitly. Always specify the *mode* argument for writing. + +- bpo-38108: Any synchronous magic methods on an AsyncMock now return a + MagicMock. Any asynchronous magic methods on a MagicMock now return an + AsyncMock. + +- bpo-38265: Update the *length* parameter of :func:`os.pread` to accept + :c:type:`Py_ssize_t` instead of :c:type:`int`. + +- bpo-38112: :mod:`compileall` has a higher default recursion limit and new + command-line arguments for path manipulation, symlinks handling, and + multiple optimization levels. + +- bpo-38248: asyncio: Fix inconsistent immediate Task cancellation + +- bpo-38237: The arguments for the builtin pow function are more + descriptive. They can now also be passed in as keywords. + +- bpo-34002: Improve efficiency in parts of email package by changing + while-pop to a for loop, using isdisjoint instead of set intersections. + +- bpo-38191: Constructors of :class:`~typing.NamedTuple` and + :class:`~typing.TypedDict` types now accept arbitrary keyword argument + names, including "cls", "self", "typename", "_typename", "fields" and + "_fields". + +- bpo-38155: Add ``__all__`` to :mod:`datetime`. Patch by Tahia Khan. + +- bpo-38185: Fixed case-insensitive string comparison in + :class:`sqlite3.Row` indexing. + +- bpo-38136: Changes AsyncMock call count and await count to be two + different counters. Now await count only counts when a coroutine has been + awaited, not when it has been called, and vice-versa. Update the + documentation around this. + +- bpo-37828: Fix default mock name in + :meth:`unittest.mock.Mock.assert_called` exceptions. Patch by Abraham + Toriz Cruz. + +- bpo-38175: Fix a memory leak in comparison of :class:`sqlite3.Row` + objects. + +- bpo-33936: _hashlib no longer calls obsolete OpenSSL initialization + function with OpenSSL 1.1.0+. + +- bpo-34706: Preserve subclassing in inspect.Signature.from_callable. + +- bpo-38153: Names of hashing algorithms frome OpenSSL are now normalized to + follow Python's naming conventions. For example OpenSSL uses sha3-512 + instead of sha3_512 or blake2b512 instead of blake2b. + +- bpo-38115: Fix a bug in dis.findlinestarts() where it would return invalid + bytecode offsets. Document that a code object's co_lnotab can contain + invalid bytecode offsets. + +- bpo-38148: Add slots to :mod:`asyncio` transport classes, which can reduce + memory usage. + +- bpo-38142: The _hashlib OpenSSL wrapper extension module is now PEP-384 + compliant. + +- bpo-9216: hashlib constructors now support usedforsecurity flag to signal + that a hashing algorithm is not used in a security context. + +- bpo-36991: Fixes a potential incorrect AttributeError exception escaping + ZipFile.extract() in some unsupported input error situations. + +- bpo-38134: Remove obsolete copy of PBKDF2_HMAC_fast. All supported OpenSSL + versions contain a fast implementation. + +- bpo-38132: The OpenSSL hashlib wrapper uses a simpler implementation. + Several Macros and pointless caches are gone. The hash name now comes from + OpenSSL's EVP. The algorithm name stays the same, except it is now always + lower case. + +- bpo-38008: Fix parent class check in protocols to correctly identify the + module that provides a builtin protocol, instead of assuming they all come + from the :mod:`collections.abc` module + +- bpo-34037: For :mod:`asyncio`, add a new coroutine + :meth:`loop.shutdown_default_executor`. The new coroutine provides an API + to schedule an executor shutdown that waits on the threadpool to finish + closing. Also, :func:`asyncio.run` has been updated to utilize the new + coroutine. Patch by Kyle Stanley. + +- bpo-37405: Fixed regression bug for socket.getsockname() for non-CAN_ISOTP + AF_CAN address family sockets by returning a 1-tuple instead of string. + +- bpo-38121: Update parameter names on functions in importlib.metadata + matching the changes in the 0.22 release of importlib_metadata. + +- bpo-38110: The os.closewalk() implementation now uses the libc fdwalk() + API on platforms where it is available. + +- bpo-38093: Fixes AsyncMock so it doesn't crash when used with + AsyncContextManagers or AsyncIterators. + +- bpo-37488: Add warning to :meth:`datetime.utctimetuple`, + :meth:`datetime.utcnow` and :meth:`datetime.utcfromtimestamp` . + +- bpo-35640: Allow passing a :term:`path-like object` as ``directory`` + argument to the :class:`http.server.SimpleHTTPRequestHandler` class. Patch + by Géry Ogam. + +- bpo-38086: Update importlib.metadata with changes from `importlib_metadata + 0.21 + `_. + +- bpo-37251: Remove `__code__` check in AsyncMock that incorrectly evaluated + function specs as async objects but failed to evaluate classes with + `__await__` but no `__code__` attribute defined as async objects. + +- bpo-38037: Fix reference counters in the :mod:`signal` module. + +- bpo-38066: Hide internal asyncio.Stream methods: feed_eof(), feed_data(), + set_exception() and set_transport(). + +- bpo-38059: inspect.py now uses sys.exit() instead of exit() + +- bpo-38049: Added command-line interface for the :mod:`ast` module. + +- bpo-37953: In :mod:`typing`, improved the ``__hash__`` and ``__eq__`` + methods for :class:`ForwardReferences`. + +- bpo-38026: Fixed :func:`inspect.getattr_static` used ``isinstance`` while + it should avoid dynamic lookup. + +- bpo-35923: Update :class:`importlib.machinery.BuiltinImporter` to use + ``loader._ORIGIN`` instead of a hardcoded value. Patch by Dong-hee Na. + +- bpo-38010: In ``importlib.metadata`` sync with ``importlib_metadata`` + 0.20, clarifying behavior of ``files()`` and fixing issue where only one + requirement was returned for ``requires()`` on ``dist-info`` packages. + +- bpo-38006: weakref.WeakValueDictionary defines a local remove() function + used as callback for weak references. This function was created with a + closure. Modify the implementation to avoid the closure. + +- bpo-37995: Added the *indent* option to :func:`ast.dump` which allows it + to produce a multiline indented output. + +- bpo-34410: Fixed a crash in the :func:`tee` iterator when re-enter it. + RuntimeError is now raised in this case. + +- bpo-37140: Fix a ctypes regression of Python 3.8. When a ctypes.Structure + is passed by copy to a function, ctypes internals created a temporary + object which had the side effect of calling the structure finalizer + (__del__) twice. The Python semantics requires a finalizer to be called + exactly once. Fix ctypes internals to no longer call the finalizer twice. + +- bpo-37587: ``_json.scanstring`` is now up to 3x faster when there are many + backslash escaped characters in the JSON string. + +- bpo-37834: Prevent shutil.rmtree exception when built on non-Windows + system without fd system call support, like older versions of macOS. + +- bpo-10978: Semaphores and BoundedSemaphores can now release more than one + waiting thread at a time. + +- bpo-37972: Subscripts to the `unittest.mock.call` objects now receive the + same chaining mechanism as any other custom attributes, so that the + following usage no longer raises a `TypeError`: + + call().foo().__getitem__('bar') + + Patch by blhsing + +- bpo-37965: Fix C compiler warning caused by + distutils.ccompiler.CCompiler.has_function. + +- bpo-37964: Add ``F_GETPATH`` command to :mod:`fcntl`. + +- bpo-37960: ``repr()`` of buffered and text streams now silences only + expected exceptions when get the value of "name" and "mode" attributes. + +- bpo-37961: Add a ``total_nframe`` field to the traces collected by the + tracemalloc module. This field indicates the original number of frames + before it was truncated. + +- bpo-37951: Most features of the subprocess module now work again in + subinterpreters. Only *preexec_fn* is restricted in subinterpreters. + +- bpo-36205: Fix the rusage implementation of time.process_time() to + correctly report the sum of the system and user CPU time. + +- bpo-37950: Fix :func:`ast.dump` when call with incompletely initialized + node. + +- bpo-34679: Restores instantiation of Windows IOCP event loops from the + non-main thread. + +- bpo-36917: Add default implementation of the + :meth:`ast.NodeVisitor.visit_Constant` method which emits a deprecation + warning and calls corresponding methody ``visit_Num()``, ``visit_Str()``, + etc. + +- bpo-37798: Update test_statistics.py to verify that the statistics module + works well for both C and Python implementations. Patch by Dong-hee Na + +- bpo-26589: Added a new status code to the http module: 451 + UNAVAILABLE_FOR_LEGAL_REASONS + +- bpo-37915: Fix a segmentation fault that appeared when comparing instances + of ``datetime.timezone`` and ``datetime.tzinfo`` objects. Patch by Pablo + Galindo. + +- bpo-32554: Deprecate having random.seed() call hash on arbitrary types. + +- bpo-9938: Add optional keyword argument ``exit_on_error`` for + :class:`ArgumentParser`. + +- bpo-37851: The :mod:`faulthandler` module no longer allocates its + alternative stack at Python startup. Now the stack is only allocated at + the first faulthandler usage. + +- bpo-32793: Fix a duplicated debug message when + :meth:`smtplib.SMTP.connect` is called. + +- bpo-37885: venv: Don't generate unset variable warning on deactivate. + +- bpo-37868: Fix dataclasses.is_dataclass when given an instance that never + raises AttributeError in __getattr__. That is, an object that returns + something for __dataclass_fields__ even if it's not a dataclass. + +- bpo-37811: Fix ``socket`` module's ``socket.connect(address)`` function + being unable to establish connection in case of interrupted system call. + The problem was observed on all OSes which ``poll(2)`` system call can + take only non-negative integers and -1 as a timeout value. + +- bpo-37863: Optimizations for Fraction.__hash__ suggested by Tim Peters. + +- bpo-21131: Fix ``faulthandler.register(chain=True)`` stack. faulthandler + now allocates a dedicated stack of ``SIGSTKSZ*2`` bytes, instead of just + ``SIGSTKSZ`` bytes. Calling the previous signal handler in faulthandler + signal handler uses more than ``SIGSTKSZ`` bytes of stack memory on some + platforms. + +- bpo-37798: Add C fastpath for statistics.NormalDist.inv_cdf() Patch by + Dong-hee Na + +- bpo-37804: Remove the deprecated method `threading.Thread.isAlive()`. + Patch by Dong-hee Na. + +- bpo-37819: Add Fraction.as_integer_ratio() to match the corresponding + methods in bool, int, float, and decimal. + +- bpo-14465: Add an xml.etree.ElementTree.indent() function for + pretty-printing XML trees. Contributed by Stefan Behnel. + +- bpo-37810: Fix :mod:`difflib` ``?`` hint in diff output when dealing with + tabs. Patch by Anthony Sottile. + +- bpo-37772: In ``zipfile.Path``, when adding implicit dirs, ensure that + ancestral directories are added and that duplicates are excluded. + +- bpo-18578: Renamed and documented `test.bytecode_helper` as + `test.support.bytecode_helper`. Patch by Joannah Nanjekye. + +- bpo-37785: Fix xgettext warnings in :mod:`argparse`. + +- bpo-34488: :meth:`writelines` method of :class:`io.BytesIO` is now + slightly faster when many small lines are passed. Patch by Sergey + Fedoseev. + +- bpo-37449: `ensurepip` now uses `importlib.resources.read_binary()` to + read data instead of `pkgutil.get_data()`. Patch by Joannah Nanjekye. + +- bpo-28292: Mark calendar.py helper functions as being private. The + follows PEP 8 guidance to maintain the style conventions in the module and + it addresses a known case of user confusion. + +- bpo-18049: Add definition of THREAD_STACK_SIZE for AIX in + Python/thread_pthread.h The default thread stacksize caused crashes with + the default recursion limit Patch by M Felt + +- bpo-37742: The logging.getLogger() API now returns the root logger when + passed the name 'root', whereas previously it returned a non-root logger + named 'root'. This could affect cases where user code explicitly wants a + non-root logger named 'root', or instantiates a logger using + logging.getLogger(__name__) in some top-level module called 'root.py'. + +- bpo-37738: Fix the implementation of curses ``addch(str, color_pair)``: + pass the color pair to ``setcchar()``, instead of always passing 0 as the + color pair. + +- bpo-37723: Fix performance regression on regular expression parsing with + huge character sets. Patch by Yann Vaginay. + +- bpo-35943: The function :c:func:`PyImport_GetModule` now ensures any + module it returns is fully initialized. Patch by Joannah Nanjekye. + +- bpo-32178: Fix IndexError in :mod:`email` package when trying to parse + invalid address fields starting with ``:``. + +- bpo-37268: The :mod:`parser` module is deprecated and will be removed in + future versions of Python. + +- bpo-11953: Completing WSA* error codes in :mod:`socket`. + +- bpo-37685: Fixed comparisons of :class:`datetime.timedelta` and + :class:`datetime.timezone`. + +- bpo-37697: Syncronize ``importlib.metadata`` with `importlib_metadata 0.19 + `_, + improving handling of EGG-INFO files and fixing a crash when entry point + names contained colons. + +- bpo-37695: Correct :func:`curses.unget_wch` error message. Patch by + Anthony Sottile. + +- bpo-37689: Add :meth:`is_relative_to` in :class:`PurePath` to determine + whether or not one path is relative to another. + +- bpo-29553: Fixed :meth:`argparse.ArgumentParser.format_usage` for mutually + exclusive groups. Patch by Andrew Nester. + +- bpo-37691: Let math.dist() accept coordinates as sequences (or iterables) + rather than just tuples. + +- bpo-37685: Fixed ``__eq__``, ``__lt__`` etc implementations in some + classes. They now return :data:`NotImplemented` for unsupported type of + the other operand. This allows the other operand to play role (for example + the equality comparison with :data:`~unittest.mock.ANY` will return + ``True``). + +- bpo-37354: Make Activate.ps1 Powershell script static to allow for signing + it. + +- bpo-37664: Update wheels bundled with ensurepip (pip 19.2.3 and setuptools + 41.2.0) + +- bpo-37663: Bring consistency to venv shell activation scripts by always + using __VENV_PROMPT__. + +- bpo-37642: Allowed the pure Python implementation of + :class:`datetime.timezone` to represent sub-minute offsets close to + minimum and maximum boundaries, specifically in the ranges (23:59, 24:00) + and (-23:59, 24:00). Patch by Ngalim Siregar + +- bpo-36161: In :mod:`posix`, use ``ttyname_r`` instead of ``ttyname`` for + thread safety. + +- bpo-36324: Make internal attributes for statistics.NormalDist() private. + +- bpo-37555: Fix `NonCallableMock._call_matcher` returning tuple instead of + `_Call` object when `self._spec_signature` exists. Patch by Elizabeth + Uselton + +- bpo-29446: Make `from tkinter import *` import only the expected objects. + +- bpo-16970: Adding a value error when an invalid value in passed to nargs + Patch by Robert Leenders + +- bpo-34443: Exceptions from :mod:`enum` now use the ``__qualname`` of the + enum class in the exception message instead of the ``__name__``. + +- bpo-37491: Fix ``IndexError`` when parsing email headers with unexpectedly + ending bare-quoted string value. Patch by Abhilash Raj. + +- bpo-37587: Make json.loads faster for long strings. (Patch by Marco + Paolini) + +- bpo-18378: Recognize "UTF-8" as a valid value for LC_CTYPE in + locale._parse_localename. + +- bpo-37579: Return :exc:`NotImplemented` in Python implementation of + ``__eq__`` for :class:`~datetime.timedelta` and :class:`~datetime.time` + when the other object being compared is not of the same type to match C + implementation. Patch by Karthikeyan Singaravelan. + +- bpo-21478: Record calls to parent when autospecced object is attached to a + mock using :func:`unittest.mock.attach_mock`. Patch by Karthikeyan + Singaravelan. + +- bpo-37531: "python3 -m test -jN --timeout=TIMEOUT" now kills a worker + process if it runs longer than *TIMEOUT* seconds. + +- bpo-37482: Fix serialization of display name in originator or destination + address fields with both encoded words and special chars. + +- bpo-36993: Improve error reporting for corrupt zip files with bad zip64 + extra data. Patch by Daniel Hillier. + +- bpo-37502: pickle.loads() no longer raises TypeError when the buffers + argument is set to None + +- bpo-37520: Correct behavior for zipfile.Path.parent when the path object + identifies a subdirectory. + +- bpo-18374: Fix the ``.col_offset`` attribute of nested :class:`ast.BinOp` + instances which had a too large value in some situations. + +- bpo-37424: Fixes a possible hang when using a timeout on + `subprocess.run()` while capturing output. If the child process spawned + its own children or otherwise connected its stdout or stderr handles with + another process, we could hang after the timeout was reached and our child + was killed when attempting to read final output from the pipes. + +- bpo-37421: Fix :func:`multiprocessing.util.get_temp_dir` finalizer: clear + also the 'tempdir' configuration of the current process, so next call to + ``get_temp_dir()`` will create a new temporary directory, rather than + reusing the removed temporary directory. + +- bpo-37481: The distutils ``bdist_wininst`` command is deprecated in Python + 3.8, use ``bdist_wheel`` (wheel packages) instead. + +- bpo-37479: When `Enum.__str__` is overridden in a derived class, the + override will be used by `Enum.__format__` regardless of whether mixin + classes are present. + +- bpo-37440: http.client now enables TLS 1.3 post-handshake authentication + for default context or if a cert_file is passed to HTTPSConnection. + +- bpo-37437: Update vendorized expat version to 2.2.7. + +- bpo-37428: SSLContext.post_handshake_auth = True no longer sets + SSL_VERIFY_POST_HANDSHAKE verify flag for client connections. Although the + option is documented as ignored for clients, OpenSSL implicitly enables + cert chain validation when the flag is set. + +- bpo-37420: :func:`os.sched_setaffinity` now correctly handles errors that + arise during iteration over its ``mask`` argument. Patch by Brandt Bucher. + +- bpo-37412: The :func:`os.getcwdb` function now uses the UTF-8 encoding on + Windows, rather than the ANSI code page: see :pep:`529` for the rationale. + The function is no longer deprecated on Windows. + +- bpo-37406: The sqlite3 module now raises TypeError, rather than + ValueError, if operation argument type is not str: execute(), + executemany() and calling a connection. + +- bpo-29412: Fix IndexError in parsing a header value ending unexpectedly. + Patch by Abhilash Raj. + +- bpo-36546: The *dist* argument for statistics.quantiles() is now + positional only. The current name doesn't reflect that the argument can be + either a dataset or a distribution. Marking the parameter as positional + avoids confusion and makes it possible to change the name later. + +- bpo-37394: Fix a bug that was causing the :mod:`queue` module to fail if + the accelerator module was not available. Patch by Pablo Galindo. + +- bpo-37376: :mod:`pprint` now has support for + :class:`types.SimpleNamespace`. Patch by Carl Bordum Hansen. + +- bpo-26967: An :class:`~argparse.ArgumentParser` with + ``allow_abbrev=False`` no longer disables grouping of short flags, such as + ``-vv``, but only disables abbreviation of long flags as documented. Patch + by Zac Hatfield-Dodds. + +- bpo-37212: :func:`unittest.mock.call` now preserves the order of keyword + arguments in repr output. Patch by Karthikeyan Singaravelan. + +- bpo-37372: Fix error unpickling datetime.time objects from Python 2 with + seconds>=24. Patch by Justin Blanchard. + +- bpo-37345: Add formal support for UDPLITE sockets. Support was present + before, but it is now easier to detect support with ``hasattr(socket, + 'IPPROTO_UDPLITE')`` and there are constants defined for each of the + values needed: :py:obj:`socket.IPPROTO_UDPLITE`, + :py:obj:`UDPLITE_SEND_CSCOV`, and :py:obj:`UDPLITE_RECV_CSCOV`. Patch by + Gabe Appleton. + +- bpo-37358: Optimized ``functools.partial`` by using vectorcall. + +- bpo-37347: :meth:`sqlite3.Connection.create_aggregate`, + :meth:`sqlite3.Connection.create_function`, + :meth:`sqlite3.Connection.set_authorizer`, + :meth:`sqlite3.Connection.set_progress_handler` + :meth:`sqlite3.Connection.set_trace_callback` methods lead to segfaults if + some of these methods are called twice with an equal object but not the + same. Now callbacks are stored more carefully. Patch by Aleksandr Balezin. + +- bpo-37163: The *obj* argument of :func:`dataclasses.replace` is + positional-only now. + +- bpo-37085: Add the optional Linux SocketCAN Broadcast Manager constants, + used as flags to configure the BCM behaviour, in the socket module. Patch + by Karl Ding. + +- bpo-37328: ``HTMLParser.unescape`` is removed. It was undocumented and + deprecated since Python 3.4. + +- bpo-37305: Add .webmanifest -> application/manifest+json to list of + recognized file types and content type headers + +- bpo-37320: ``aifc.openfp()`` alias to ``aifc.open()``, ``sunau.openfp()`` + alias to ``sunau.open()``, and ``wave.openfp()`` alias to ``wave.open()`` + have been removed. They were deprecated since Python 3.7. + +- bpo-37315: Deprecated accepting floats with integral value (like ``5.0``) + in :func:`math.factorial`. + +- bpo-37312: ``_dummy_thread`` and ``dummy_threading`` modules have been + removed. These modules were deprecated since Python 3.7 which requires + threading support. + +- bpo-33972: Email with single part but content-type set to ``multipart/*`` + doesn't raise AttributeError anymore. + +- bpo-37280: Use threadpool for reading from file for sendfile fallback + mode. + +- bpo-37279: Fix asyncio sendfile support when sendfile sends extra data in + fallback mode. + +- bpo-19865: :func:`ctypes.create_unicode_buffer()` now also supports + non-BMP characters on platforms with 16-bit :c:type:`wchar_t` (for + example, Windows and AIX). + +- bpo-37266: In a subinterpreter, spawning a daemon thread now raises an + exception. Daemon threads were never supported in subinterpreters. + Previously, the subinterpreter finalization crashed with a Pyton fatal + error if a daemon thread was still running. + +- bpo-37210: Allow pure Python implementation of :mod:`pickle` to work even + when the C :mod:`_pickle` module is unavailable. + +- bpo-21872: Fix :mod:`lzma`: module decompresses data incompletely. When + decompressing a FORMAT_ALONE format file, and it doesn't have the end + marker, sometimes the last one to dozens bytes can't be output. Patch by + Ma Lin. + +- bpo-35922: Fix :meth:`RobotFileParser.crawl_delay` and + :meth:`RobotFileParser.request_rate` to return ``None`` rather than raise + :exc:`AttributeError` when no relevant rule is defined in the robots.txt + file. Patch by Rémi Lapeyre. + +- bpo-35766: Change the format of feature_version to be a (major, minor) + tuple. + +- bpo-36607: Eliminate :exc:`RuntimeError` raised by + :func:`asyncio.all_tasks()` if internal tasks weak set is changed by + another thread during iteration. + +- bpo-18748: :class:`_pyio.IOBase` destructor now does nothing if getting + the ``closed`` attribute fails to better mimick :class:`_io.IOBase` + finalizer. + +- bpo-36402: Fix a race condition at Python shutdown when waiting for + threads. Wait until the Python thread state of all non-daemon threads get + deleted (join all non-daemon threads), rather than just wait until + non-daemon Python threads complete. + +- bpo-37206: Default values which cannot be represented as Python objects no + longer improperly represented as ``None`` in function signatures. + +- bpo-37111: Added ``encoding`` and ``errors`` keyword parameters to + ``logging.basicConfig``. + +- bpo-12144: Ensure cookies with ``expires`` attribute are handled in + :meth:`CookieJar.make_cookies`. + +- bpo-34886: Fix an unintended ValueError from :func:`subprocess.run` when + checking for conflicting `input` and `stdin` or `capture_output` and + `stdout` or `stderr` args when they were explicitly provided but with + `None` values within a passed in `**kwargs` dict rather than as passed + directly by name. Patch contributed by Rémi Lapeyre. + +- bpo-37173: The exception message for ``inspect.getfile()`` now correctly + reports the passed class rather than the builtins module. + +- bpo-37178: Give math.perm() a one argument form that means the same as + math.factorial(). + +- bpo-37178: For math.perm(n, k), let k default to n, giving the same result + as factorial. + +- bpo-37165: Converted _collections._count_elements to use the Argument + Clinic. + +- bpo-34767: Do not always create a :class:`collections.deque` in + :class:`asyncio.Lock`. + +- bpo-37158: Speed-up statistics.fmean() by switching from a function to a + generator. + +- bpo-34282: Remove ``Enum._convert`` method, deprecated in 3.8. + +- bpo-37150: `argparse._ActionsContainer.add_argument` now throws error, if + someone accidentally pass FileType class object instead of instance of + FileType as `type` argument + +- bpo-28724: The socket module now has the :func:`socket.send_fds` and + :func:`socket.recv.fds` methods. Contributed by Joannah Nanjekye, Shinya + Okano and Victor Stinner. + +- bpo-35621: Support running asyncio subprocesses when execution event loop + in a thread on UNIX. + +- bpo-36520: Lengthy email headers with UTF-8 characters are now properly + encoded when they are folded. Patch by Jeffrey Kintscher. + +- bpo-30835: Fixed a bug in email parsing where a message with invalid bytes + in content-transfer-encoding of a multipart message can cause an + AttributeError. Patch by Andrew Donnellan. + +- bpo-31163: pathlib.Path instance's rename and replace methods now return + the new Path instance. + +- bpo-25068: :class:`urllib.request.ProxyHandler` now lowercases the keys of + the passed dictionary. + +- bpo-26185: Fix :func:`repr` on empty :class:`ZipInfo` object. Patch by + Mickaël Schoentgen. + +- bpo-21315: Email headers containing RFC2047 encoded words are parsed + despite the missing whitespace, and a defect registered. Also missing + trailing whitespace after encoded words is now registered as a defect. + +- bpo-31904: Port test_datetime to VxWorks: skip zoneinfo tests on VxWorks + +- bpo-35805: Add parser for Message-ID header and add it to default + HeaderRegistry. This should prevent folding of Message-ID using RFC 2048 + encoded words. + +- bpo-36871: Ensure method signature is used instead of constructor + signature of a class while asserting mock object against method calls. + Patch by Karthikeyan Singaravelan. + +- bpo-35070: posix.getgrouplist() now works correctly when the user belongs + to NGROUPS_MAX supplemental groups. Patch by Jeffrey Kintscher. + +- bpo-31783: Fix race condition in ThreadPoolExecutor when worker threads + are created during interpreter shutdown. + +- bpo-36582: Fix ``UserString.encode()`` to correctly return ``bytes`` + rather than a ``UserString`` instance. + +- bpo-32424: Deprecate xml.etree.ElementTree.Element.copy() in favor of + copy.copy(). + + Patch by Gordon P. Hemsley + +- bpo-36564: Fix infinite loop in email header folding logic that would be + triggered when an email policy's max_line_length is not long enough to + include the required markup and any values in the message. Patch by Paul + Ganssle + +- bpo-36543: Removed methods Element.getchildren(), Element.getiterator() + and ElementTree.getiterator() and the xml.etree.cElementTree module. + +- bpo-36409: Remove the old plistlib API deprecated in Python 3.4 + +- bpo-36302: distutils sorts source file lists so that Extension .so files + build more reproducibly by default + +- bpo-36250: Ignore ``ValueError`` from ``signal`` with ``interaction`` in + non-main thread. + +- bpo-36046: Added ``user``, ``group`` and ``extra_groups`` parameters to + the subprocess.Popen constructor. Patch by Patrick McLean. + +- bpo-32627: Fix compile error when ``_uuid`` headers conflicting included. + +- bpo-35800: Deprecate ``smtpd.MailmanProxy`` ready for future removal. + +- bpo-35168: :attr:`shlex.shlex.punctuation_chars` is now a read-only + property. + +- bpo-8538: Add support for boolean actions like ``--foo`` and ``--no-foo`` + to argparse. Patch contributed by Rémi Lapeyre. + +- bpo-20504: Fixes a bug in :mod:`cgi` module when a multipart/form-data + request has no `Content-Length` header. + +- bpo-25988: The abstract base classes in :mod:`collections.abc` no longer + are exposed in the regular :mod:`collections` module. + +- bpo-11122: Distutils won't check for rpmbuild in specified paths only. + +- bpo-34775: Division handling of PurePath now returns NotImplemented + instead of raising a TypeError when passed something other than an + instance of str or PurePath. Patch by Roger Aiudi. + +- bpo-34749: :func:`binascii.a2b_base64` is now up to 2 times faster. Patch + by Sergey Fedoseev. + +- bpo-34519: Add additional aliases for HP Roman 8. Patch by Michael Osipov. + +- bpo-28009: Fix uuid.getnode() on platforms with '.' as MAC Addr delimiter + as well fix for MAC Addr format that omits a leading 0 in MAC Addr values. + Currently, AIX is the only know platform with these settings. Patch by + Michael Felt. + +- bpo-30618: Add :meth:`~pathlib.Path.readlink`. Patch by Girts Folkmanis. + +- bpo-32498: Made :func:`urllib.parse.unquote()` accept bytes in addition to + strings. Patch by Stein Karlsen. + +- bpo-33348: lib2to3 now recognizes expressions after ``*`` and `**` like in + ``f(*[] or [])``. + +- bpo-32689: Update :func:`shutil.move` function to allow for Path objects + to be used as source argument. Patch by Emily Morehouse and Maxwell + "5.13b" McKinnon. + +- bpo-32820: Added __format__ to IPv4 and IPv6 classes. Always outputs a + fully zero- padded string. Supports b/x/n modifiers (bin/hex/native + format). Native format for IPv4 is bin, native format for IPv6 is hex. + Also supports '#' and '_' modifiers. + +- bpo-27657: Fix urllib.parse.urlparse() with numeric paths. A string like + "path:80" is no longer parsed as a path but as a scheme ("path") and a + path ("80"). + +- bpo-4963: Fixed non-deterministic behavior related to mimetypes extension + mapping and module reinitialization. + +Documentation +------------- + +- bpo-21767: Explicitly mention abc support in functools.singledispatch + +- bpo-38816: Provides more details about the interaction between + :c:func:`fork` and CPython's runtime, focusing just on the C-API. This + includes cautions about where :c:func:`fork` should and shouldn't be + called. + +- bpo-38351: Modernize :mod:`email` examples from %-formatting to f-strings. + +- bpo-38778: Document the fact that :exc:`RuntimeError` is raised if + :meth:`os.fork` is called in a subinterpreter. + +- bpo-38592: Add Brazilian Portuguese to the language switcher at Python + Documentation website. + +- bpo-38294: Add list of no-longer-escaped chars to re.escape documentation + +- bpo-38053: Modernized the plistlib documentation + +- bpo-26868: Fix example usage of :c:func:`PyModule_AddObject` to properly + handle errors. + +- bpo-36797: Fix a dead link in the distutils API Reference. + +- bpo-37977: Warn more strongly and clearly about pickle insecurity + +- bpo-37979: Added a link to dateutil.parser.isoparse in the + datetime.fromisoformat documentation. Patch by Paul Ganssle + +- bpo-12707: Deprecate info(), geturl(), getcode() methods in favor of the + headers, url, and status properties, respectively, for HTTPResponse and + addinfourl. Also deprecate the code attribute of addinfourl in favor of + the status attribute. Patch by Ashwin Ramaswami + +- bpo-37937: Mention ``frame.f_trace`` in :func:`sys.settrace` docs. + +- bpo-37878: Make :c:func:`PyThreadState_DeleteCurrent` Internal. + +- bpo-37759: Beginning edits to Whatsnew 3.8 + +- bpo-37726: Stop recommending getopt in the tutorial for command line + argument parsing and promote argparse. + +- bpo-32910: Remove implementation-specific behaviour of how venv's + Deactivate works. + +- bpo-37256: Fix wording of arguments for :class:`Request` in + :mod:`urllib.request` + +- bpo-37284: Add a brief note to indicate that any new + ``sys.implementation`` required attributes must go through the PEP + process. + +- bpo-30088: Documented that :class:`mailbox.Maildir` constructor doesn't + attempt to verify the maildir folder layout correctness. Patch by + Sviatoslav Sydorenko. + +- bpo-37521: Fix `importlib` examples to insert any newly created modules + via importlib.util.module_from_spec() immediately into sys.modules instead + of after calling loader.exec_module(). + + Thanks to Benjamin Mintz for finding the bug. + +- bpo-37456: Slash ('/') is now part of syntax. + +- bpo-37487: Fix PyList_GetItem index description to include 0. + +- bpo-37149: Replace the dead link to the Tkinter 8.5 reference by John + Shipman, New Mexico Tech, with a link to the archive.org copy. + +- bpo-37478: Added possible exceptions to the description of os.chdir(). + +- bpo-34903: Documented that in :meth:`datetime.datetime.strptime()`, the + leading zero in some two-digit formats is optional. Patch by Mike Gleen. + +- bpo-36260: Add decompression pitfalls to zipfile module documentation. + +- bpo-37004: In the documentation for difflib, a note was added explicitly + warning that the results of SequenceMatcher's ratio method may depend on + the order of the input strings. + +- bpo-36960: Restructured the :mod:`datetime` docs in the interest of making + them more user-friendly and improving readability. Patch by Brad Solomon. + +- bpo-36487: Make C-API docs clear about what the "main" interpreter is. + +- bpo-23460: The documentation for decimal string formatting using the `:g` + specifier has been updated to reflect the correct exponential notation + cutoff point. Original patch contributed by Tuomas Suutari. + +- bpo-35803: Document and test that ``tempfile`` functions may accept a + :term:`path-like object` for the ``dir`` argument. Patch by Anthony + Sottile. + +- bpo-33944: Added a note about the intended use of code in .pth files. + +- bpo-34293: Fix the Doc/Makefile regarding PAPER environment variable and + PDF builds + +- bpo-25237: Add documentation for tkinter modules + +Tests +----- + +- bpo-38614: Fix test_communicate() of test_asyncio.test_subprocess: use + ``support.LONG_TIMEOUT`` (5 minutes), instead of just 1 minute. + +- bpo-38614: Add timeout constants to :mod:`test.support`: + :data:`~test.support.LOOPBACK_TIMEOUT`, + :data:`~test.support.INTERNET_TIMEOUT`, + :data:`~test.support.SHORT_TIMEOUT` and + :data:`~test.support.LONG_TIMEOUT`. + +- bpo-38502: test.regrtest now uses process groups in the multiprocessing + mode (-jN command line option) if process groups are available: if + :func:`os.setsid` and :func:`os.killpg` functions are available. + +- bpo-35998: Fix a race condition in test_asyncio.test_start_tls_server_1(). + Previously, there was a race condition between the test main() function + which replaces the protocol and the test ServerProto protocol which sends + ANSWER once it gets HELLO. Now, only the test main() function is + responsible to send data, ServerProto no longer sends data. + +- bpo-38470: Fix ``test_compileall.test_compile_dir_maxlevels()`` on Windows + without long path support: only create 3 subdirectories instead of between + 20 and 100 subdirectories. + +- bpo-37531: On timeout, regrtest no longer attempts to call + ``popen.communicate()`` again: it can hang until all child processes using + stdout and stderr pipes completes. Kill the worker process and ignores its + output. Change also the faulthandler timeout of the main process from 1 + minute to 5 minutes, for Python slowest buildbots. + +- bpo-38239: Fix test_gdb for Link Time Optimization (LTO) builds. + +- bpo-38275: test_ssl now handles disabled TLS/SSL versions better. + OpenSSL's crypto policy and run-time settings are recognized and tests for + disabled versions are skipped. Tests also accept more TLS minimum_versions + for platforms that override OpenSSL's default with strict settings. + +- bpo-38271: The private keys for test_ssl were encrypted with 3DES in + traditional PKCS#5 format. 3DES and the digest algorithm of PKCS#5 are + blocked by some strict crypto policies. Use PKCS#8 format with AES256 + encryption instead. + +- bpo-38270: test.support now has a helper function to check for + availibility of a hash digest function. Several tests are refactored avoid + MD5 and use SHA256 instead. Other tests are marked to use MD5 and skipped + when MD5 is disabled. + +- bpo-37123: Multiprocessing test test_mymanager() now also expects + -SIGTERM, not only exitcode 0. BaseManager._finalize_manager() sends + SIGTERM to the manager process if it takes longer than 1 second to stop, + which happens on slow buildbots. + +- bpo-38212: Multiprocessing tests: increase + test_queue_feeder_donot_stop_onexc() timeout from 1 to 60 seconds. + +- bpo-38117: Test with OpenSSL 1.1.1d + +- bpo-38018: Increase code coverage for multiprocessing.shared_memory. + +- bpo-37805: Add tests for json.dump(..., skipkeys=True). Patch by Dong-hee + Na. + +- bpo-37531: Enhance regrtest multiprocess timeout: write a message when + killing a worker process, catch popen.kill() and popen.wait() exceptions, + put a timeout on the second call to popen.communicate(). + +- bpo-37876: Add tests for ROT-13 codec. + +- bpo-36833: Added tests for PyDateTime_xxx_GET_xxx() macros of the C API of + the :mod:`datetime` module. Patch by Joannah Nanjekye. + +- bpo-37558: Fix test_shared_memory_cleaned_after_process_termination name + handling + +- bpo-37526: Add :func:`test.support.catch_threading_exception`: context + manager catching :class:`threading.Thread` exception using + :func:`threading.excepthook`. + +- bpo-37421: test_concurrent_futures now explicitly stops the ForkServer + instance if it's running. + +- bpo-37421: multiprocessing tests now stop the ForkServer instance if it's + running: close the "alive" file descriptor to ask the server to stop and + then remove its UNIX address. + +- bpo-37421: test_distutils.test_build_ext() is now able to remove the + temporary directory on Windows: don't import the newly built C extension + ("xx") in the current process, but test it in a separated process. + +- bpo-37421: test_concurrent_futures now cleans up multiprocessing to remove + immediately temporary directories created by + multiprocessing.util.get_temp_dir(). + +- bpo-37421: test_winconsoleio doesn't leak a temporary file anymore: use + tempfile.TemporaryFile() to remove it when the test completes. + +- bpo-37421: multiprocessing tests now explicitly call ``_run_finalizers()`` + to immediately remove temporary directories created by tests. + +- bpo-37421: urllib.request tests now call + :func:`~urllib.request.urlcleanup` to remove temporary files created by + ``urlretrieve()`` tests and to clear the ``_opener`` global variable set + by ``urlopen()`` and functions calling indirectly ``urlopen()``. + +- bpo-37472: Remove ``Lib/test/outstanding_bugs.py``. + +- bpo-37199: Fix test failures when IPv6 is unavailable or disabled. + +- bpo-19696: Replace deprecated method "random.choose" with "random.choice" + in "test_pkg_import.py". + +- bpo-37335: Remove no longer necessary code from c locale coercion tests + +- bpo-37421: Fix test_shutil to no longer leak temporary files. + +- bpo-37411: Fix test_wsgiref.testEnviron() to no longer depend on the + environment variables (don't fail if "X" variable is set). + +- bpo-37400: Fix test_os.test_chown(): use os.getgroups() rather than + grp.getgrall() to get groups. Rename also the test to test_chown_gid(). + +- bpo-37359: Add --cleanup option to python3 -m test to remove + ``test_python_*`` directories of previous failed jobs. Add "make + cleantest" to run ``python3 -m test --cleanup``. + +- bpo-37362: test_gdb no longer fails if it gets an "unexpected" message on + stderr: it now ignores stderr. The purpose of test_gdb is to test that + python-gdb.py commands work as expected, not to test gdb. + +- bpo-35998: Avoid TimeoutError in test_asyncio: test_start_tls_server_1() + +- bpo-37278: Fix test_asyncio ProactorLoopCtrlC: join the thread to prevent + leaking a running thread and leaking a reference. + +- bpo-37261: Fix :func:`test.support.catch_unraisable_exception`: its + __exit__() method now ignores unraisable exception raised when clearing + its ``unraisable`` attribute. + +- bpo-37069: regrtest now uses :func:`sys.unraisablehook` to mark a test as + "environment altered" (ENV_CHANGED) if it emits an "unraisable exception". + Moreover, regrtest logs a warning in this case. + + Use ``python3 -m test --fail-env-changed`` to catch unraisable exceptions + in tests. + +- bpo-37252: Fix assertions in ``test_close`` and + ``test_events_mask_overflow`` devpoll tests. + +- bpo-37169: Rewrite ``_PyObject_IsFreed()`` unit tests. + +- bpo-37153: ``test_venv.test_multiprocessing()`` now explicitly calls + ``pool.terminate()`` to wait until the pool completes. + +- bpo-34001: Make test_ssl pass with LibreSSL. LibreSSL handles minimum and + maximum TLS version differently than OpenSSL. + +- bpo-36919: Make ``test_source_encoding.test_issue2301`` implementation + independent. The test will work now for both CPython and IronPython. + +- bpo-30202: Update ``test.test_importlib.test_abc`` to test + ``find_spec()``. + +- bpo-28009: Modify the test_uuid logic to test when a program is available + AND can be used to obtain a MACADDR as basis for an UUID. Patch by M. Felt + +- bpo-34596: Fallback to a default reason when :func:`unittest.skip` is + uncalled. Patch by Naitree Zhu. + +Build +----- + +- bpo-38809: On Windows, build scripts will now recognize and use python.exe + from an active virtual env. + +- bpo-38684: Fix _hashlib build when Blake2 is disabled, but OpenSSL + supports it. + +- bpo-38468: Misc/python-config.in now uses `getvar()` for all still + existing `sysconfig.get_config_var()` calls. Patch by Joannah Nanjekye. + +- bpo-37415: Fix stdatomic.h header check for ICC compiler: the ICC + implementation lacks atomic_uintptr_t type which is needed by Python. + +- bpo-38301: In Solaris family, we must be sure to use ``-D_REENTRANT``. + Patch by Jesús Cea Avión. + +- bpo-36002: Locate ``llvm-profdata`` and ``llvm-ar`` binaries using + ``AC_PATH_TOOL`` rather than ``AC_PATH_TARGET_TOOL``. + +- bpo-37936: The :file:`.gitignore` file systematically keeps "rooted", with + a non-trailing slash, all the rules that are meant to apply to files in a + specific place in the repo. Previously, when the intended file to ignore + happened to be at the root of the repo, we'd most often accidentally also + ignore files and directories with the same name anywhere in the tree. + +- bpo-37760: The :file:`Tools/unicode/makeunicodedata.py` script, which is + used for converting information from the Unicode Character Database into + generated code and data used by the methods of :class:`str` and by the + :mod:`unicodedata` module, now handles each character's data as a + ``dataclass`` with named attributes, rather than a length-18 list of + different fields. + +- bpo-37936: The :file:`.gitignore` file no longer applies to any files that + are in fact tracked in the Git repository. Patch by Greg Price. + +- bpo-37725: Change "clean" makefile target to also clean the program guided + optimization (PGO) data. Previously you would have to use "make clean" + and "make profile-removal", or "make clobber". + +- bpo-37707: Mark some individual tests to skip when --pgo is used. The + tests marked increase the PGO task time significantly and likely don't + help improve optimization of the final executable. + +- bpo-36044: Reduce the number of unit tests run for the PGO generation + task. This speeds up the task by a factor of about 15x. Running the full + unit test suite is slow. This change may result in a slightly less + optimized build since not as many code branches will be executed. If you + are willing to wait for the much slower build, the old behavior can be + restored using './configure [..] PROFILE_TASK="-m test --pgo-extended"'. + We make no guarantees as to which PGO task set produces a faster build. + Users who care should run their own relevant benchmarks as results can + depend on the environment, workload, and compiler tool chain. + +- bpo-37468: ``make install`` no longer installs ``wininst-*.exe`` files + used by distutils bdist_wininst: bdist_wininst only works on Windows. + +- bpo-37189: Many ``PyRun_XXX()`` functions like :c:func:`PyRun_String` were + no longer exported in ``libpython38.dll`` by mistake. Export them again to + fix the ABI compatibility. + +- bpo-25361: Enables use of SSE2 instructions in Windows 32-bit build. + +- bpo-36210: Update optional extension module detection for AIX. ossaudiodev + and spwd are not applicable for AIX, and are no longer reported as + missing. 3rd-party packaging of ncurses (with ASIS support) conflicts with + officially supported AIX curses library, so configure AIX to use + libcurses.a. However, skip trying to build _curses_panel. + + patch by M Felt + +Windows +------- + +- bpo-38589: Fixes HTML Help shortcut when Windows is not installed to C + drive + +- bpo-38453: Ensure ntpath.realpath() correctly resolves relative paths. + +- bpo-38519: Restores the internal C headers that were missing from the + nuget.org and Microsoft Store packages. + +- bpo-38492: Remove ``pythonw.exe`` dependency on the Microsoft C++ runtime. + +- bpo-38344: Fix error message in activate.bat + +- bpo-38359: Ensures ``pyw.exe`` launcher reads correct registry key. + +- bpo-38355: Fixes ``ntpath.realpath`` failing on ``sys.executable``. + +- bpo-38117: Update bundled OpenSSL to 1.1.1d + +- bpo-38092: Reduce overhead when using multiprocessing in a Windows virtual + environment. + +- bpo-38133: Allow py.exe launcher to locate installations from the + Microsoft Store and improve display of active virtual environments. -- bpo-37421: test_distutils.test_build_ext() is now able to remove the - temporary directory on Windows: don't import the newly built C extension - ("xx") in the current process, but test it in a separated process. +- bpo-38114: The ``pip.ini`` is no longer included in the Nuget package. -- bpo-37421: test_concurrent_futures now cleans up multiprocessing to remove - immediately temporary directories created by - multiprocessing.util.get_temp_dir(). +- bpo-32592: Set Windows 8 as the minimum required version for API support -- bpo-37421: test_winconsoleio doesn't leak a temporary file anymore: use - tempfile.TemporaryFile() to remove it when the test completes. +- bpo-36634: :func:`os.cpu_count` now returns active processors rather than + maximum processors. -- bpo-37421: multiprocessing tests now explicitly call ``_run_finalizers()`` - to immediately remove temporary directories created by tests. +- bpo-36634: venv activate.bat now works when the existing variables contain + double quote characters. -- bpo-37199: Fix test failures when IPv6 is unavailable or disabled. +- bpo-38081: Prevent error calling :func:`os.path.realpath` on ``'NUL'``. -- bpo-37335: Remove no longer necessary code from c locale coercion tests +- bpo-38087: Fix case sensitivity in test_pathlib and test_ntpath. -- bpo-37421: Fix test_shutil to no longer leak temporary files. +- bpo-38088: Fixes distutils not finding vcruntime140.dll with only the v142 + toolset installed. -- bpo-37411: Fix test_wsgiref.testEnviron() to no longer depend on the - environment variables (don't fail if "X" variable is set). +- bpo-37283: Ensure command-line and unattend.xml setting override + previously detected states in Windows installer. -- bpo-37400: Fix test_os.test_chown(): use os.getgroups() rather than - grp.getgrall() to get groups. Rename also the test to test_chown_gid(). +- bpo-38030: Fixes :func:`os.stat` failing for block devices on Windows -- bpo-37359: Add --cleanup option to python3 -m test to remove - ``test_python_*`` directories of previous failed jobs. Add "make - cleantest" to run ``python3 -m test --cleanup``. +- bpo-38020: Fixes potential crash when calling :func:`os.readlink` (or + indirectly through :func:`~os.path.realpath`) on a file that is not a + supported link. -- bpo-37362: test_gdb no longer fails if it gets an "unexpected" message on - stderr: it now ignores stderr. The purpose of test_gdb is to test that - python-gdb.py commands work as expected, not to test gdb. +- bpo-37705: Improve the implementation of ``winerror_to_errno()``. -- bpo-35998: Avoid TimeoutError in test_asyncio: test_start_tls_server_1() +- bpo-37549: :func:`os.dup` no longer fails for standard streams on Windows + 7. -- bpo-37278: Fix test_asyncio ProactorLoopCtrlC: join the thread to prevent - leaking a running thread and leaking a reference. +- bpo-1311: The ``nul`` file on Windows now returns True from + :func:`~os.path.exists` and a valid result from :func:`os.stat` with + ``S_IFCHR`` set. -- bpo-37261: Fix :func:`test.support.catch_unraisable_exception`: its - __exit__() method now ignores unraisable exception raised when clearing - its ``unraisable`` attribute. +- bpo-9949: Enable support for following symlinks in :func:`os.realpath`. -- bpo-37169: Rewrite ``_PyObject_IsFreed()`` unit tests. +- bpo-37834: Treat all name surrogate reparse points on Windows in + :func:`os.lstat` and other reparse points as regular files in + :func:`os.stat`. -- bpo-37153: ``test_venv.test_mutiprocessing()`` now explicitly calls - ``pool.terminate()`` to wait until the pool completes. +- bpo-36266: Add the module name in the formatted error message when DLL + load fail happens during module import in + ``_PyImport_FindSharedFuncptrWindows()``. Patch by Srinivas Nyayapati. -- bpo-28009: Modify the test_uuid logic to test when a program is available - AND can be used to obtain a MACADDR as basis for an UUID. Patch by M. Felt +- bpo-25172: Trying to import the :mod:`crypt` module on Windows will result + in an :exc:`ImportError` with a message explaining that the module isn't + supported on Windows. On other platforms, if the underlying ``_crypt`` + module is not available, the ImportError will include a message explaining + the problem. -Build ------ +- bpo-37778: Fixes the icons used for file associations to the Microsoft + Store package. -- bpo-37189: Many ``PyRun_XXX()`` functions like :c:func:`PyRun_String` were - no longer exported in ``libpython38.dll`` by mistake. Export them again to - fix the ABI compatibiliy. +- bpo-37734: Fix use of registry values to launch Python from Microsoft + Store app. -Windows -------- +- bpo-37702: Fix memory leak on Windows in creating an SSLContext object or + running urllib.request.urlopen('https://...'). + +- bpo-37672: Switch Windows Store package's pip to use bundled + :file:`pip.ini` instead of :envvar:`PIP_USER` variable. - bpo-10945: Officially drop support for creating bdist_wininst installers on non-Windows systems. +- bpo-37445: Include the ``FORMAT_MESSAGE_IGNORE_INSERTS`` flag in + ``FormatMessageW()`` calls. + - bpo-37369: Fixes path for :data:`sys.executable` when running from the Microsoft Store. +- bpo-37380: Don't collect unfinished processes with ``subprocess._active`` + on Windows to cleanup later. Patch by Ruslan Kuprieiev. + - bpo-37351: Removes libpython38.a from standard Windows distribution. - bpo-35360: Update Windows builds to use SQLite 3.28.0. @@ -2945,9 +4875,25 @@ Windows - bpo-36779: Ensure ``time.tzname`` is correct on Windows when the active code page is set to CP_UTF7 or CP_UTF8. +- bpo-32587: Make :data:`winreg.REG_MULTI_SZ` support zero-length strings. + +- bpo-28269: Replace use of :c:func:`strcasecmp` for the system function + :c:func:`_stricmp`. Patch by Minmin Gong. + +- bpo-36590: Add native Bluetooth RFCOMM support to socket module. + macOS ----- +- bpo-38117: Updated OpenSSL to 1.1.1d in macOS installer. + +- bpo-38089: Move Azure Pipelines to latest VM versions and make macOS tests + optional + +- bpo-18049: Increase the default stack size of threads from 5MB to 16MB on + macOS, to match the stack size of the main thread. This avoids crashes on + deep recursion in threads. + - bpo-34602: Avoid test suite failures on macOS by no longer calling resource.setrlimit to increase the process stack size limit at runtime. The runtime change is no longer needed since the interpreter is being @@ -2960,17 +4906,92 @@ macOS IDLE ---- +- bpo-26353: Stop adding newline when saving an IDLE shell window. + +- bpo-4630: Add an option to toggle IDLE's cursor blink for shell, editor, + and output windows. See Settings, General, Window Preferences, Cursor + Blink. Patch by Zackery Spytz. + +- bpo-38598: Do not try to compile IDLE shell or output windows + +- bpo-36698: IDLE no longer fails when write non-encodable characters to + stderr. It now escapes them with a backslash, as the regular Python + interpreter. Added the ``errors`` field to the standard streams. + +- bpo-35379: When exiting IDLE, catch any AttributeError. One happens when + EditorWindow.close is called twice. Printing a traceback, when IDLE is + run from a terminal, is useless and annoying. + +- bpo-38183: To avoid problems, test_idle ignores the user config directory. + It no longer tries to create or access .idlerc or any files within. Users + must run IDLE to discover problems with saving settings. + +- bpo-38077: IDLE no longer adds 'argv' to the user namespace when + initializing it. This bug only affected 3.7.4 and 3.8.0b2 to 3.8.0b4. + +- bpo-38041: Shell restart lines now fill the window width, always start + with '=', and avoid wrapping unnecessarily. The line will still wrap if + the included file name is long relative to the width. + +- bpo-35771: To avoid occasional spurious test_idle failures on slower + machines, increase the ``hover_delay`` in test_tooltip. + +- bpo-37824: Properly handle user input warnings in IDLE shell. Cease + turning SyntaxWarnings into SyntaxErrors. + +- bpo-37929: IDLE Settings dialog now closes properly when there is no shell + window. + +- bpo-37902: Add mousewheel scrolling for IDLE module, path, and stack + browsers. Patch by George Zhang. + +- bpo-37849: Fixed completions list appearing too high or low when shown + above the current line. + +- bpo-36419: Refactor IDLE autocomplete and improve testing. + +- bpo-37748: Reorder the Run menu. Put the most common choice, Run Module, + at the top. + +- bpo-37692: Improve highlight config sample with example shell interaction + and better labels for shell elements. + +- bpo-37628: Settings dialog no longer expands with font size. + +- bpo-37627: Initialize the Customize Run dialog with the command line + arguments most recently entered before. The user can optionally edit + before submitting them. + +- bpo-33610: Fix code context not showing the correct context when first + toggled on. + +- bpo-37530: Optimize code context to reduce unneeded background activity. + Font and highlight changes now occur along with text changes instead of + after a random delay. + +- bpo-27452: Cleanup ``config.py`` by inlining ``RemoveFile`` and + simplifying the handling of ``file`` in ``CreateConfigHandlers``. + - bpo-37325: Fix tab focus traversal order for help source and custom run dialogs. - bpo-37321: Both subprocess connection error messages now refer to the 'Startup failure' section of the IDLE doc. +- bpo-17535: Add optional line numbers for IDLE editor windows. Windows + open without line numbers unless set otherwise in the General tab of the + configuration dialog. + +- bpo-26806: To compensate for stack frames added by IDLE and avoid possible + problems with low recursion limits, add 30 to limits in the user code + execution process. Subtract 30 when reporting recursion limits to make + this addition mostly transparent. + - bpo-37177: Properly 'attach' search dialogs to their main window so that they behave like other dialogs and do not get hidden behind their main window. -- bpo-37039: Adjust "Zoom Height" to individual screens by momemtarily +- bpo-37039: Adjust "Zoom Height" to individual screens by momentarily maximizing the window on first use with a particular screen. Changing screen settings may invalidate the saved height. While a window is maximized, "Zoom Height" has no effect. @@ -2982,19 +5003,126 @@ IDLE customized settings. Any 'command line arguments' entered are added to sys.argv. One can suppress the normal Shell main module restart. +- bpo-36390: Gather Format menu functions into format.py. Combine + paragraph.py, rstrip.py, and format methods from editor.py. + +Tools/Demos +----------- + +- bpo-38118: Update Valgrind suppression file to ignore a false alarm in + :c:func:`PyUnicode_Decode` when using GCC builtin strcmp(). + +- bpo-38347: pathfix.py: Assume all files that end on '.py' are Python + scripts when working recursively. + +- bpo-37803: pdb's ``--help`` and ``--version`` long options now work. + +- bpo-37942: Improve ArgumentClinic converter for floats. + +- bpo-37704: Remove ``Tools/scripts/h2py.py``: use cffi to access a C API in + Python. + +- bpo-37675: 2to3 now works when run from a zipped standard library. + +- bpo-37034: Argument Clinic now uses the argument name on errors with + keyword-only argument instead of their position. Patch contributed by Rémi + Lapeyre. + +- bpo-37064: Add option -k to pathscript.py script: preserve shebang flags. + Add option -a to pathscript.py script: add flags. + C API ----- +- bpo-37633: Re-export some function compatibility wrappers for macros in + ``pythonrun.h``. + +- bpo-38644: Provide :c:func:`Py_EnterRecursiveCall` and + :c:func:`Py_LeaveRecursiveCall` as regular functions for the limited API. + Previously, there were defined as macros, but these macros didn't work + with the limited API which cannot access ``PyThreadState.recursion_depth`` + field. Remove ``_Py_CheckRecursionLimit`` from the stable ABI. + +- bpo-38650: The global variable :c:data:`PyStructSequence_UnnamedField` is + now a constant and refers to a constant string. + +- bpo-38540: Fixed possible leak in :c:func:`PyArg_Parse` and similar + functions for format units ``"es#"`` and ``"et#"`` when the macro + :c:macro:`PY_SSIZE_T_CLEAN` is not defined. + +- bpo-38395: Fix a crash in :class:`weakref.proxy` objects due to incorrect + lifetime management when calling some associated methods that may delete + the last reference to object being referenced by the proxy. Patch by Pablo + Galindo. + +- bpo-36389: The ``_PyObject_CheckConsistency()`` function is now also + available in release mode. For example, it can be used to debug a crash in + the ``visit_decref()`` function of the GC. + +- bpo-38266: Revert the removal of PyThreadState_DeleteCurrent() with + documentation. + +- bpo-38303: Update audioop extension module to use the stable ABI + (PEP-384). Patch by Tyler Kieft. + +- bpo-38234: :c:func:`Py_SetPath` now sets :data:`sys.executable` to the + program full path (:c:func:`Py_GetProgramFullPath`) rather than to the + program name (:c:func:`Py_GetProgramName`). + +- bpo-38234: Python ignored arguments passed to :c:func:`Py_SetPath`, + :c:func:`Py_SetPythonHome` and :c:func:`Py_SetProgramName`: fix Python + initialization to use specified arguments. + +- bpo-38205: The :c:func:`Py_UNREACHABLE` macro now calls + :c:func:`Py_FatalError`. + +- bpo-38140: Make dict and weakref offsets opaque for C heap types by + passing the offsets through PyMemberDef + +- bpo-15088: The C function ``PyGen_NeedsFinalizing`` has been removed. It + was not documented, tested or used anywhere within CPython after the + implementation of :pep:`442`. Patch by Joannah Nanjekye. (Patch by Joannah + Nanjekye) + +- bpo-36763: Options added by ``PySys_AddXOption()`` are now handled the + same way than ``PyConfig.xoptions`` and command line ``-X`` options. + +- bpo-37926: Fix a crash in ``PySys_SetArgvEx(0, NULL, 0)``. + +- bpo-37879: Fix subtype_dealloc to suppress the type decref when the base + type is a C heap type + +- bpo-37645: Add :c:func:`_PyObject_FunctionStr` to get a user-friendly + string representation of a function-like object. Patch by Jeroen Demeyer. + +- bpo-29548: The functions ``PyEval_CallObject``, ``PyEval_CallFunction``, + ``PyEval_CallMethod`` and ``PyEval_CallObjectWithKeywords`` are + deprecated. Use :c:func:`PyObject_Call` and its variants instead. + +- bpo-37151: ``PyCFunction_Call`` is now a deprecated alias of + :c:func:`PyObject_Call`. + +- bpo-37540: The vectorcall protocol now requires that the caller passes + only strings as keyword names. + +- bpo-37207: The vectorcall protocol is now enabled for ``type`` objects: + set ``tp_vectorcall`` to a vectorcall function to be used instead of + ``tp_new`` and ``tp_init`` when calling the class itself. + +- bpo-21120: Exclude Python-ast.h, ast.h and asdl.h from the limited API. + +- bpo-37483: Add new function ``_PyObject_CallOneArg`` for calling an object + with one positional argument. + - bpo-36763: Add :func:`PyConfig_SetWideStringList` function. +- bpo-37337: Add fast functions for calling methods: + :c:func:`_PyObject_VectorcallMethod`, :c:func:`_PyObject_CallMethodNoArgs` + and :c:func:`_PyObject_CallMethodOneArg`. + - bpo-28805: The :const:`METH_FASTCALL` calling convention has been documented. -- bpo-37221: ``tp_print`` is put back at the end of the ``PyTypeObject`` - structure to restore support for old code (in particular generated by - Cython) setting ``tp_print = 0``. Note that ``tp_print`` will be removed - entirely in Python 3.9. - - bpo-37221: The new function :c:func:`PyCode_NewWithPosOnlyArgs` allows to create code objects like :c:func:`PyCode_New`, but with an extra *posonlyargcount* parameter for indicating the number of positonal-only @@ -3002,14 +5130,22 @@ C API - bpo-37215: Fix dtrace issue introduce by bpo-36842 -- bpo-37191: Python.h does not need compiler support for intermingled - declarations (GCC's ``-Wdeclaration-after-statement``), which were added - in 3.8.0 Beta 1. Note that in Python 3.9, intermingled declarations will - be needed again. +- bpo-37194: Add a new public :c:func:`PyObject_CallNoArgs` function to the + C API: call a callable Python object without any arguments. It is the most + efficient way to call a callback without any argument. On x86-64, for + example, ``PyObject_CallFunctionObjArgs(func, NULL)`` allocates 960 bytes + on the stack per call, whereas ``PyObject_CallNoArgs(func)`` only + allocates 624 bytes per call. - bpo-37170: Fix the cast on error in :c:func:`PyLong_AsUnsignedLongLongMask()`. +- bpo-35381: Convert posixmodule.c statically allocated types + ``DirEntryType`` and ``ScandirIteratorType`` to heap-allocated types. + +- bpo-34331: Use singular/plural noun in error message when instantiating an + abstract class with non-overriden abstract method(s). + What's New in Python 3.8.0 beta 1? ================================== @@ -4094,7 +6230,7 @@ Tests with ``-jN/--multiprocess N``. ``--findleaks`` becomes a deprecated alias to ``--fail-env-changed``. -- bpo-36725: When using mulitprocessing mode (-jN), regrtest now better +- bpo-36725: When using multiprocessing mode (-jN), regrtest now better reports errors if a worker process fails, and it exits immediately on a worker thread failure or when interrupted. @@ -5549,7 +7685,7 @@ Library - bpo-35585: Speed-up building enums by value, e.g. http.HTTPStatus(200). - bpo-30561: random.gammavariate(1.0, beta) now computes the same result as - random.expovariate(1.0 / beta). This synchonizes the two algorithms and + random.expovariate(1.0 / beta). This synchronizes the two algorithms and eliminates some idiosyncrasies in the old implementation. It does however produce a difference stream of random variables than it used to. @@ -11330,7 +13466,7 @@ Library - bpo-29204: Element.getiterator() and the html parameter of XMLParser() were deprecated only in the documentation (since Python 3.2 and 3.4 - correspondintly). Now using them emits a deprecation warning. + correspondingly). Now using them emits a deprecation warning. - bpo-27863: Fixed multiple crashes in ElementTree caused by race conditions and wrong types. @@ -23173,7 +25309,7 @@ Build - bpo-21285: Refactor and fix curses configure check to always search in a ncursesw directory. -- bpo-15234: For BerkelyDB and Sqlite, only add the found library and +- bpo-15234: For BerkeleyDB and Sqlite, only add the found library and include directories if they aren't already being searched. This avoids an explicit runtime library dependency. diff --git a/Misc/SpecialBuilds.txt b/Misc/SpecialBuilds.txt index d1a03216..27369abf 100644 --- a/Misc/SpecialBuilds.txt +++ b/Misc/SpecialBuilds.txt @@ -46,9 +46,7 @@ Build option: ``./configure --with-trace-refs``. Turn on heavy reference debugging. This is major surgery. Every PyObject grows two more pointers, to maintain a doubly-linked list of all live heap-allocated objects. Most built-in type objects are not in this list, as they're statically -allocated. Starting in Python 2.3, if COUNT_ALLOCS (see below) is also defined, -a static type object T does appear in this list if at least one object of type T -has been created. +allocated. Note that because the fundamental PyObject layout changes, Python modules compiled with Py_TRACE_REFS are incompatible with modules compiled without it. @@ -165,55 +163,6 @@ by not defining NDEBUG), and some routines do additional sanity checks inside "#ifdef Py_DEBUG" blocks. -COUNT_ALLOCS ------------- - -Each type object grows three new members: - - /* Number of times an object of this type was allocated. */ - int tp_allocs; - - /* Number of times an object of this type was deallocated. */ - int tp_frees; - - /* Highwater mark: the maximum value of tp_allocs - tp_frees so - * far; or, IOW, the largest number of objects of this type alive at - * the same time. - */ - int tp_maxalloc; - -Allocation and deallocation code keeps these counts up to date. Py_FinalizeEx() -displays a summary of the info returned by sys.getcounts() (see below), along -with assorted other special allocation counts (like the number of tuple -allocations satisfied by a tuple free-list, the number of 1-character strings -allocated, etc). - -Before Python 2.2, type objects were immortal, and the COUNT_ALLOCS -implementation relies on that. As of Python 2.2, heap-allocated type/ class -objects can go away. COUNT_ALLOCS can blow up in 2.2 and 2.2.1 because of this; -this was fixed in 2.2.2. Use of COUNT_ALLOCS makes all heap-allocated type -objects immortal, except for those for which no object of that type is ever -allocated. - -Starting with Python 2.3, If Py_TRACE_REFS is also defined, COUNT_ALLOCS -arranges to ensure that the type object for each allocated object appears in the -doubly-linked list of all objects maintained by Py_TRACE_REFS. - -Special gimmicks: - -sys.getcounts() - Return a list of 4-tuples, one entry for each type object for which at least - one object of that type was allocated. Each tuple is of the form: - - (tp_name, tp_allocs, tp_frees, tp_maxalloc) - - Each distinct type object gets a distinct entry in this list, even if two or - more type objects have the same tp_name (in which case there's no way to - distinguish them by looking at this list). The list is ordered by time of - first object allocation: the type object for which the first allocation of - an object of that type occurred most recently is at the front of the list. - - LLTRACE ------- diff --git a/Misc/python-config.in b/Misc/python-config.in index 727c4a86..ebd99daa 100644 --- a/Misc/python-config.in +++ b/Misc/python-config.in @@ -25,8 +25,8 @@ except getopt.error: if not opts: exit_with_usage() -pyver = sysconfig.get_config_var('VERSION') getvar = sysconfig.get_config_var +pyver = getvar('VERSION') opt_flags = [flag for (flag, val) in opts] @@ -35,10 +35,10 @@ if '--help' in opt_flags: for opt in opt_flags: if opt == '--prefix': - print(sysconfig.get_config_var('prefix')) + print(getvar('prefix')) elif opt == '--exec-prefix': - print(sysconfig.get_config_var('exec_prefix')) + print(getvar('exec_prefix')) elif opt in ('--includes', '--cflags'): flags = ['-I' + sysconfig.get_path('include'), @@ -65,10 +65,10 @@ for opt in opt_flags: print(' '.join(libs)) elif opt == '--extension-suffix': - print(sysconfig.get_config_var('EXT_SUFFIX')) + print(getvar('EXT_SUFFIX')) elif opt == '--abiflags': print(sys.abiflags) elif opt == '--configdir': - print(sysconfig.get_config_var('LIBPL')) + print(getvar('LIBPL')) diff --git a/Misc/python-wing3.wpr b/Misc/python-wing3.wpr old mode 100644 new mode 100755 diff --git a/Misc/python-wing4.wpr b/Misc/python-wing4.wpr old mode 100644 new mode 100755 diff --git a/Misc/python-wing5.wpr b/Misc/python-wing5.wpr old mode 100644 new mode 100755 diff --git a/Misc/python.man b/Misc/python.man index fa5d7999..22537657 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -286,10 +286,6 @@ Set implementation specific option. The following options are available: traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a traceback limit of NFRAME frames - -X showalloccount: output the total count of allocated objects for each - type when the program finishes. This only works when Python was built with - COUNT_ALLOCS defined - -X importtime: show how long each import takes. It shows module name, cumulative time (including nested imports) and self time (excluding nested imports). Note that its output may be broken in multi-threaded @@ -417,6 +413,8 @@ inserted in the path in front of $PYTHONPATH. The search path can be manipulated from within a Python program as the variable .IR sys.path . +.IP PYTHONPLATLIBDIR +Override sys.platlibdir. .IP PYTHONSTARTUP If this is the name of a readable file, the Python commands in that file are executed before the first prompt is displayed in interactive diff --git a/Misc/requirements-test.txt b/Misc/requirements-test.txt new file mode 100644 index 00000000..6e46c12e --- /dev/null +++ b/Misc/requirements-test.txt @@ -0,0 +1 @@ +tzdata==2020.1rc0 diff --git a/Modules/Setup b/Modules/Setup index 983fa014..02cfb675 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -132,7 +132,10 @@ faulthandler faulthandler.c # # bpo-35053: The module must be builtin since _Py_NewReference() # can call _PyTraceMalloc_NewReference(). -_tracemalloc _tracemalloc.c hashtable.c +_tracemalloc _tracemalloc.c + +# PEG-based parser module -- slated to be *the* parser +_peg_parser _peg_parser.c # The rest of the modules listed in this file are all commented out by # default. Usually they can be detected and built as dynamically @@ -167,17 +170,18 @@ _symtable symtablemodule.c # Modules that should always be present (non UNIX dependent): #array arraymodule.c # array objects -#cmath cmathmodule.c _math.c # -lm # complex math library functions -#math mathmodule.c _math.c # -lm # math library functions, e.g. sin() +#cmath cmathmodule.c _math.c -DPy_BUILD_CORE_MODULE # -lm # complex math library functions +#math mathmodule.c _math.c -DPy_BUILD_CORE_MODULE # -lm # math library functions, e.g. sin() #_contextvars _contextvarsmodule.c # Context Variables #_struct _struct.c # binary structure packing/unpacking #_weakref _weakref.c # basic weak reference support #_testcapi _testcapimodule.c # Python C API test module #_testinternalcapi _testinternalcapi.c -I$(srcdir)/Include/internal -DPy_BUILD_CORE_MODULE # Python internal C API test module -#_random _randommodule.c # Random number generator +#_random _randommodule.c -DPy_BUILD_CORE_MODULE # Random number generator #_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator #_pickle _pickle.c # pickle accelerator #_datetime _datetimemodule.c # datetime accelerator +#_zoneinfo _zoneinfo.c # zoneinfo accelerator #_bisect _bisectmodule.c # Bisection algorithms #_heapq _heapqmodule.c # Heap queue algorithm #_asyncio _asynciomodule.c # Fast asyncio Future @@ -247,8 +251,8 @@ _symtable symtablemodule.c # The _sha module implements the SHA checksum algorithms. # (NIST's Secure Hash Algorithms.) #_sha1 sha1module.c -#_sha256 sha256module.c -#_sha512 sha512module.c +#_sha256 sha256module.c -DPy_BUILD_CORE_BUILTIN +#_sha512 sha512module.c -DPy_BUILD_CORE_BUILTIN #_sha3 _sha3/sha3module.c # _blake module diff --git a/Modules/_abc.c b/Modules/_abc.c index de938dd0..709b52ff 100644 --- a/Modules/_abc.c +++ b/Modules/_abc.c @@ -1,7 +1,6 @@ /* ABCMeta implementation */ #include "Python.h" -#include "structmember.h" #include "clinic/_abc.c.h" /*[clinic input] @@ -20,12 +19,18 @@ _Py_IDENTIFIER(_abc_impl); _Py_IDENTIFIER(__subclasscheck__); _Py_IDENTIFIER(__subclasshook__); -/* A global counter that is incremented each time a class is - registered as a virtual subclass of anything. It forces the - negative cache to be cleared before its next use. - Note: this counter is private. Use `abc.get_cache_token()` for - external code. */ -static unsigned long long abc_invalidation_counter = 0; +typedef struct { + PyTypeObject *_abc_data_type; + unsigned long long abc_invalidation_counter; +} _abcmodule_state; + +static inline _abcmodule_state* +get_abc_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_abcmodule_state *)state; +} /* This object stores internal state for ABCs. Note that we can use normal sets for caches, @@ -38,51 +43,84 @@ typedef struct { unsigned long long _abc_negative_cache_version; } _abc_data; +static int +abc_data_traverse(_abc_data *self, visitproc visit, void *arg) +{ + Py_VISIT(Py_TYPE(self)); + Py_VISIT(self->_abc_registry); + Py_VISIT(self->_abc_cache); + Py_VISIT(self->_abc_negative_cache); + return 0; +} + +static int +abc_data_clear(_abc_data *self) +{ + Py_CLEAR(self->_abc_registry); + Py_CLEAR(self->_abc_cache); + Py_CLEAR(self->_abc_negative_cache); + return 0; +} + static void abc_data_dealloc(_abc_data *self) { - Py_XDECREF(self->_abc_registry); - Py_XDECREF(self->_abc_cache); - Py_XDECREF(self->_abc_negative_cache); - Py_TYPE(self)->tp_free(self); + PyTypeObject *tp = Py_TYPE(self); + (void)abc_data_clear(self); + tp->tp_free(self); + Py_DECREF(tp); } static PyObject * abc_data_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { _abc_data *self = (_abc_data *) type->tp_alloc(type, 0); + _abcmodule_state *state = NULL; if (self == NULL) { return NULL; } + state = PyType_GetModuleState(type); + if (state == NULL) { + Py_DECREF(self); + return NULL; + } + self->_abc_registry = NULL; self->_abc_cache = NULL; self->_abc_negative_cache = NULL; - self->_abc_negative_cache_version = abc_invalidation_counter; + self->_abc_negative_cache_version = state->abc_invalidation_counter; return (PyObject *) self; } PyDoc_STRVAR(abc_data_doc, "Internal state held by ABC machinery."); -static PyTypeObject _abc_data_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_abc_data", /*tp_name*/ - sizeof(_abc_data), /*tp_basicsize*/ - .tp_dealloc = (destructor)abc_data_dealloc, - .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_alloc = PyType_GenericAlloc, - .tp_new = abc_data_new, +static PyType_Slot _abc_data_type_spec_slots[] = { + {Py_tp_doc, (void *)abc_data_doc}, + {Py_tp_new, abc_data_new}, + {Py_tp_dealloc, abc_data_dealloc}, + {Py_tp_traverse, abc_data_traverse}, + {Py_tp_clear, abc_data_clear}, + {0, 0} +}; + +static PyType_Spec _abc_data_type_spec = { + .name = "_abc._abc_data", + .basicsize = sizeof(_abc_data), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .slots = _abc_data_type_spec_slots, }; static _abc_data * -_get_impl(PyObject *self) +_get_impl(PyObject *module, PyObject *self) { + _abcmodule_state *state = get_abc_state(module); PyObject *impl = _PyObject_GetAttrId(self, &PyId__abc_impl); if (impl == NULL) { return NULL; } - if (Py_TYPE(impl) != &_abc_data_type) { + if (!Py_IS_TYPE(impl, state->_abc_data_type)) { PyErr_SetString(PyExc_TypeError, "_abc_impl is set to a wrong type"); Py_DECREF(impl); return NULL; @@ -179,7 +217,7 @@ static PyObject * _abc__reset_registry(PyObject *module, PyObject *self) /*[clinic end generated code: output=92d591a43566cc10 input=12a0b7eb339ac35c]*/ { - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -206,7 +244,7 @@ static PyObject * _abc__reset_caches(PyObject *module, PyObject *self) /*[clinic end generated code: output=f296f0d5c513f80c input=c0ac616fd8acfb6f]*/ { - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -241,7 +279,7 @@ static PyObject * _abc__get_dump(PyObject *module, PyObject *self) /*[clinic end generated code: output=9d9569a8e2c1c443 input=2c5deb1bfe9e3c79]*/ { - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -391,13 +429,14 @@ static PyObject * _abc__abc_init(PyObject *module, PyObject *self) /*[clinic end generated code: output=594757375714cda1 input=8d7fe470ff77f029]*/ { + _abcmodule_state *state = get_abc_state(module); PyObject *data; if (compute_abstract_methods(self) < 0) { return NULL; } /* Set up inheritance registry. */ - data = abc_data_new(&_abc_data_type, NULL, NULL); + data = abc_data_new(state->_abc_data_type, NULL, NULL); if (data == NULL) { return NULL; } @@ -446,7 +485,7 @@ _abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass) if (result < 0) { return NULL; } - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -457,7 +496,7 @@ _abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass) Py_DECREF(impl); /* Invalidate negative cache */ - abc_invalidation_counter++; + get_abc_state(module)->abc_invalidation_counter++; Py_INCREF(subclass); return subclass; @@ -480,7 +519,7 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self, /*[clinic end generated code: output=b8b5148f63b6b56f input=a4f4525679261084]*/ { PyObject *subtype, *result = NULL, *subclass = NULL; - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -502,7 +541,7 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self, } subtype = (PyObject *)Py_TYPE(instance); if (subtype == subclass) { - if (impl->_abc_negative_cache_version == abc_invalidation_counter) { + if (impl->_abc_negative_cache_version == get_abc_state(module)->abc_invalidation_counter) { incache = _in_weak_set(impl->_abc_negative_cache, subclass); if (incache < 0) { goto end; @@ -514,12 +553,12 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self, } } /* Fall back to the subclass check. */ - result = _PyObject_CallMethodIdObjArgs(self, &PyId___subclasscheck__, - subclass, NULL); + result = _PyObject_CallMethodIdOneArg(self, &PyId___subclasscheck__, + subclass); goto end; } - result = _PyObject_CallMethodIdObjArgs(self, &PyId___subclasscheck__, - subclass, NULL); + result = _PyObject_CallMethodIdOneArg(self, &PyId___subclasscheck__, + subclass); if (result == NULL) { goto end; } @@ -531,8 +570,8 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self, break; case 0: Py_DECREF(result); - result = _PyObject_CallMethodIdObjArgs(self, &PyId___subclasscheck__, - subtype, NULL); + result = _PyObject_CallMethodIdOneArg(self, &PyId___subclasscheck__, + subtype); break; case 1: // Nothing to do. break; @@ -574,9 +613,10 @@ _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self, } PyObject *ok, *subclasses = NULL, *result = NULL; + _abcmodule_state *state = NULL; Py_ssize_t pos; int incache; - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -591,15 +631,16 @@ _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self, goto end; } + state = get_abc_state(module); /* 2. Check negative cache; may have to invalidate. */ - if (impl->_abc_negative_cache_version < abc_invalidation_counter) { + if (impl->_abc_negative_cache_version < state->abc_invalidation_counter) { /* Invalidate the negative cache. */ if (impl->_abc_negative_cache != NULL && PySet_Clear(impl->_abc_negative_cache) < 0) { goto end; } - impl->_abc_negative_cache_version = abc_invalidation_counter; + impl->_abc_negative_cache_version = state->abc_invalidation_counter; } else { incache = _in_weak_set(impl->_abc_negative_cache, subclass); @@ -613,8 +654,8 @@ _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self, } /* 3. Check the subclass hook. */ - ok = _PyObject_CallMethodIdObjArgs((PyObject *)self, &PyId___subclasshook__, - subclass, NULL); + ok = _PyObject_CallMethodIdOneArg((PyObject *)self, &PyId___subclasshook__, + subclass); if (ok == NULL) { goto end; } @@ -792,10 +833,11 @@ static PyObject * _abc_get_cache_token_impl(PyObject *module) /*[clinic end generated code: output=c7d87841e033dacc input=70413d1c423ad9f9]*/ { - return PyLong_FromUnsignedLongLong(abc_invalidation_counter); + _abcmodule_state *state = get_abc_state(module); + return PyLong_FromUnsignedLongLong(state->abc_invalidation_counter); } -static struct PyMethodDef module_functions[] = { +static struct PyMethodDef _abcmodule_methods[] = { _ABC_GET_CACHE_TOKEN_METHODDEF _ABC__ABC_INIT_METHODDEF _ABC__RESET_REGISTRY_METHODDEF @@ -807,26 +849,60 @@ static struct PyMethodDef module_functions[] = { {NULL, NULL} /* sentinel */ }; +static int +_abcmodule_exec(PyObject *module) +{ + _abcmodule_state *state = get_abc_state(module); + state->abc_invalidation_counter = 0; + state->_abc_data_type = (PyTypeObject *)PyType_FromModuleAndSpec(module, &_abc_data_type_spec, NULL); + if (state->_abc_data_type == NULL) { + return -1; + } + + return 0; +} + +static int +_abcmodule_traverse(PyObject *module, visitproc visit, void *arg) +{ + _abcmodule_state *state = get_abc_state(module); + Py_VISIT(state->_abc_data_type); + return 0; +} + +static int +_abcmodule_clear(PyObject *module) +{ + _abcmodule_state *state = get_abc_state(module); + Py_CLEAR(state->_abc_data_type); + return 0; +} + +static void +_abcmodule_free(void *module) +{ + _abcmodule_clear((PyObject *)module); +} + +static PyModuleDef_Slot _abcmodule_slots[] = { + {Py_mod_exec, _abcmodule_exec}, + {0, NULL} +}; + static struct PyModuleDef _abcmodule = { PyModuleDef_HEAD_INIT, "_abc", _abc__doc__, - -1, - module_functions, - NULL, - NULL, - NULL, - NULL + sizeof(_abcmodule_state), + _abcmodule_methods, + _abcmodule_slots, + _abcmodule_traverse, + _abcmodule_clear, + _abcmodule_free, }; - PyMODINIT_FUNC PyInit__abc(void) { - if (PyType_Ready(&_abc_data_type) < 0) { - return NULL; - } - _abc_data_type.tp_doc = abc_data_doc; - - return PyModule_Create(&_abcmodule); + return PyModuleDef_Init(&_abcmodule); } diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 4ed2af55..b615c48c 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1,5 +1,6 @@ #include "Python.h" -#include "structmember.h" +#include "pycore_pyerrors.h" // _PyErr_ClearExcState() +#include // offsetof() /*[clinic input] @@ -12,10 +13,8 @@ module _asyncio _Py_IDENTIFIER(__asyncio_running_event_loop__); _Py_IDENTIFIER(_asyncio_future_blocking); _Py_IDENTIFIER(add_done_callback); -_Py_IDENTIFIER(_all_tasks_compat); _Py_IDENTIFIER(call_soon); _Py_IDENTIFIER(cancel); -_Py_IDENTIFIER(current_task); _Py_IDENTIFIER(get_event_loop); _Py_IDENTIFIER(send); _Py_IDENTIFIER(throw); @@ -67,11 +66,13 @@ typedef enum { PyObject *prefix##_exception; \ PyObject *prefix##_result; \ PyObject *prefix##_source_tb; \ + PyObject *prefix##_cancel_msg; \ fut_state prefix##_state; \ int prefix##_log_tb; \ int prefix##_blocking; \ PyObject *dict; \ - PyObject *prefix##_weakreflist; + PyObject *prefix##_weakreflist; \ + _PyErr_StackItem prefix##_cancelled_exc_state; typedef struct { FutureObj_HEAD(fut) @@ -112,8 +113,8 @@ static PyTypeObject TaskType; static PyTypeObject PyRunningLoopHolder_Type; -#define Future_CheckExact(obj) (Py_TYPE(obj) == &FutureType) -#define Task_CheckExact(obj) (Py_TYPE(obj) == &TaskType) +#define Future_CheckExact(obj) Py_IS_TYPE(obj, &FutureType) +#define Task_CheckExact(obj) Py_IS_TYPE(obj, &TaskType) #define Future_Check(obj) PyObject_TypeCheck(obj, &FutureType) #define Task_Check(obj) PyObject_TypeCheck(obj, &TaskType) @@ -142,8 +143,7 @@ _is_coroutine(PyObject *coro) Do this check after 'future_init()'; in case we need to raise an error, __del__ needs a properly initialized object. */ - PyObject *res = PyObject_CallFunctionObjArgs( - asyncio_iscoroutine_func, coro, NULL); + PyObject *res = PyObject_CallOneArg(asyncio_iscoroutine_func, coro); if (res == NULL) { return -1; } @@ -217,7 +217,7 @@ get_future_loop(PyObject *fut) return NULL; } if (getloop != NULL) { - PyObject *res = _PyObject_CallNoArg(getloop); + PyObject *res = PyObject_CallNoArgs(getloop); Py_DECREF(getloop); return res; } @@ -232,17 +232,19 @@ get_running_loop(PyObject **loop) PyObject *rl; PyThreadState *ts = PyThreadState_Get(); - if (ts->id == cached_running_holder_tsid && cached_running_holder != NULL) { + uint64_t ts_id = PyThreadState_GetID(ts); + if (ts_id == cached_running_holder_tsid && cached_running_holder != NULL) { // Fast path, check the cache. rl = cached_running_holder; // borrowed } else { - if (ts->dict == NULL) { + PyObject *ts_dict = _PyThreadState_GetDict(ts); // borrowed + if (ts_dict == NULL) { goto not_found; } rl = _PyDict_GetItemIdWithError( - ts->dict, &PyId___asyncio_running_event_loop__); // borrowed + ts_dict, &PyId___asyncio_running_event_loop__); // borrowed if (rl == NULL) { if (PyErr_Occurred()) { goto error; @@ -253,10 +255,10 @@ get_running_loop(PyObject **loop) } cached_running_holder = rl; // borrowed - cached_running_holder_tsid = ts->id; + cached_running_holder_tsid = ts_id; } - assert(Py_TYPE(rl) == &PyRunningLoopHolder_Type); + assert(Py_IS_TYPE(rl, &PyRunningLoopHolder_Type)); PyObject *running_loop = ((PyRunningLoopHolder *)rl)->rl_loop; if (running_loop == Py_None) { @@ -289,7 +291,13 @@ error: static int set_running_loop(PyObject *loop) { - PyObject *ts_dict = PyThreadState_GetDict(); // borrowed + PyObject *ts_dict = NULL; + + PyThreadState *tstate = PyThreadState_Get(); + if (tstate != NULL) { + ts_dict = _PyThreadState_GetDict(tstate); // borrowed + } + if (ts_dict == NULL) { PyErr_SetString( PyExc_RuntimeError, "thread-local storage is not available"); @@ -310,10 +318,7 @@ set_running_loop(PyObject *loop) Py_DECREF(rl); cached_running_holder = (PyObject *)rl; - - /* safe to assume state is not NULL as the call to PyThreadState_GetDict() - above already checks if state is NULL */ - cached_running_holder_tsid = PyThreadState_Get()->id; + cached_running_holder_tsid = PyThreadState_GetID(tstate); return 0; } @@ -332,12 +337,12 @@ get_event_loop(void) return loop; } - policy = _PyObject_CallNoArg(asyncio_get_event_loop_policy); + policy = PyObject_CallNoArgs(asyncio_get_event_loop_policy); if (policy == NULL) { return NULL; } - loop = _PyObject_CallMethodId(policy, &PyId_get_event_loop, NULL); + loop = _PyObject_CallMethodIdNoArgs(policy, &PyId_get_event_loop); Py_DECREF(policy); return loop; } @@ -371,7 +376,7 @@ call_soon(PyObject *loop, PyObject *func, PyObject *arg, PyObject *ctx) } stack[nargs] = (PyObject *)ctx; - handle = _PyObject_Vectorcall(callable, stack, nargs, context_kwname); + handle = PyObject_Vectorcall(callable, stack, nargs, context_kwname); Py_DECREF(callable); } @@ -482,6 +487,8 @@ future_init(FutureObj *fut, PyObject *loop) Py_CLEAR(fut->fut_result); Py_CLEAR(fut->fut_exception); Py_CLEAR(fut->fut_source_tb); + Py_CLEAR(fut->fut_cancel_msg); + _PyErr_ClearExcState(&fut->fut_cancelled_exc_state); fut->fut_state = STATE_PENDING; fut->fut_log_tb = 0; @@ -498,7 +505,7 @@ future_init(FutureObj *fut, PyObject *loop) } fut->fut_loop = loop; - res = _PyObject_CallMethodId(fut->fut_loop, &PyId_get_debug, NULL); + res = _PyObject_CallMethodIdNoArgs(fut->fut_loop, &PyId_get_debug); if (res == NULL) { return -1; } @@ -514,7 +521,7 @@ future_init(FutureObj *fut, PyObject *loop) method, which is called during the interpreter shutdown and the traceback module is already unloaded. */ - fut->fut_source_tb = _PyObject_CallNoArg(traceback_extract_stack); + fut->fut_source_tb = PyObject_CallNoArgs(traceback_extract_stack); if (fut->fut_source_tb == NULL) { return -1; } @@ -557,7 +564,7 @@ future_set_exception(FutureObj *fut, PyObject *exc) } if (PyExceptionClass_Check(exc)) { - exc_val = _PyObject_CallNoArg(exc); + exc_val = PyObject_CallNoArgs(exc); if (exc_val == NULL) { return NULL; } @@ -576,7 +583,7 @@ future_set_exception(FutureObj *fut, PyObject *exc) PyErr_SetString(PyExc_TypeError, "invalid exception object"); return NULL; } - if ((PyObject*)Py_TYPE(exc_val) == PyExc_StopIteration) { + if (Py_IS_TYPE(exc_val, (PyTypeObject *)PyExc_StopIteration)) { Py_DECREF(exc_val); PyErr_SetString(PyExc_TypeError, "StopIteration interacts badly with generators " @@ -596,11 +603,33 @@ future_set_exception(FutureObj *fut, PyObject *exc) Py_RETURN_NONE; } +static PyObject * +create_cancelled_error(PyObject *msg) +{ + PyObject *exc; + if (msg == NULL || msg == Py_None) { + exc = PyObject_CallNoArgs(asyncio_CancelledError); + } else { + exc = PyObject_CallOneArg(asyncio_CancelledError, msg); + } + return exc; +} + +static void +future_set_cancelled_error(FutureObj *fut) +{ + PyObject *exc = create_cancelled_error(fut->fut_cancel_msg); + PyErr_SetObject(asyncio_CancelledError, exc); + Py_DECREF(exc); + + _PyErr_ChainStackItem(&fut->fut_cancelled_exc_state); +} + static int future_get_result(FutureObj *fut, PyObject **result) { if (fut->fut_state == STATE_CANCELLED) { - PyErr_SetNone(asyncio_CancelledError); + future_set_cancelled_error(fut); return -1; } @@ -697,7 +726,7 @@ future_add_done_callback(FutureObj *fut, PyObject *arg, PyObject *ctx) } static PyObject * -future_cancel(FutureObj *fut) +future_cancel(FutureObj *fut, PyObject *msg) { fut->fut_log_tb = 0; @@ -706,6 +735,9 @@ future_cancel(FutureObj *fut) } fut->fut_state = STATE_CANCELLED; + Py_XINCREF(msg); + Py_XSETREF(fut->fut_cancel_msg, msg); + if (future_schedule_callbacks(fut) == -1) { return NULL; } @@ -751,6 +783,8 @@ FutureObj_clear(FutureObj *fut) Py_CLEAR(fut->fut_result); Py_CLEAR(fut->fut_exception); Py_CLEAR(fut->fut_source_tb); + Py_CLEAR(fut->fut_cancel_msg); + _PyErr_ClearExcState(&fut->fut_cancelled_exc_state); Py_CLEAR(fut->dict); return 0; } @@ -765,7 +799,14 @@ FutureObj_traverse(FutureObj *fut, visitproc visit, void *arg) Py_VISIT(fut->fut_result); Py_VISIT(fut->fut_exception); Py_VISIT(fut->fut_source_tb); + Py_VISIT(fut->fut_cancel_msg); Py_VISIT(fut->dict); + + _PyErr_StackItem *exc_state = &fut->fut_cancelled_exc_state; + Py_VISIT(exc_state->exc_type); + Py_VISIT(exc_state->exc_value); + Py_VISIT(exc_state->exc_traceback); + return 0; } @@ -830,7 +871,7 @@ _asyncio_Future_exception_impl(FutureObj *self) } if (self->fut_state == STATE_CANCELLED) { - PyErr_SetNone(asyncio_CancelledError); + future_set_cancelled_error(self); return NULL; } @@ -942,7 +983,7 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn) ENSURE_FUTURE_ALIVE(self) if (self->fut_callback0 != NULL) { - int cmp = PyObject_RichCompareBool(fn, self->fut_callback0, Py_EQ); + int cmp = PyObject_RichCompareBool(self->fut_callback0, fn, Py_EQ); if (cmp == -1) { return NULL; } @@ -967,7 +1008,7 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn) if (len == 1) { PyObject *cb_tup = PyList_GET_ITEM(self->fut_callbacks, 0); int cmp = PyObject_RichCompareBool( - fn, PyTuple_GET_ITEM(cb_tup, 0), Py_EQ); + PyTuple_GET_ITEM(cb_tup, 0), fn, Py_EQ); if (cmp == -1) { return NULL; } @@ -989,7 +1030,7 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn) int ret; PyObject *item = PyList_GET_ITEM(self->fut_callbacks, i); Py_INCREF(item); - ret = PyObject_RichCompareBool(fn, PyTuple_GET_ITEM(item, 0), Py_EQ); + ret = PyObject_RichCompareBool(PyTuple_GET_ITEM(item, 0), fn, Py_EQ); if (ret == 0) { if (j < len) { PyList_SET_ITEM(newlist, j, item); @@ -1011,7 +1052,7 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn) } if (j < len) { - Py_SIZE(newlist) = j; + Py_SET_SIZE(newlist, j); } j = PyList_GET_SIZE(newlist); len = PyList_GET_SIZE(self->fut_callbacks); @@ -1031,6 +1072,8 @@ fail: /*[clinic input] _asyncio.Future.cancel + msg: object = None + Cancel the future and schedule callbacks. If the future is already done or cancelled, return False. Otherwise, @@ -1039,11 +1082,11 @@ return True. [clinic start generated code]*/ static PyObject * -_asyncio_Future_cancel_impl(FutureObj *self) -/*[clinic end generated code: output=e45b932ba8bd68a1 input=515709a127995109]*/ +_asyncio_Future_cancel_impl(FutureObj *self, PyObject *msg) +/*[clinic end generated code: output=3edebbc668e5aba3 input=925eb545251f2c5a]*/ { ENSURE_FUTURE_ALIVE(self) - return future_cancel(self); + return future_cancel(self, msg); } /*[clinic input] @@ -1256,6 +1299,29 @@ FutureObj_get_source_traceback(FutureObj *fut, void *Py_UNUSED(ignored)) return fut->fut_source_tb; } +static PyObject * +FutureObj_get_cancel_message(FutureObj *fut, void *Py_UNUSED(ignored)) +{ + if (fut->fut_cancel_msg == NULL) { + Py_RETURN_NONE; + } + Py_INCREF(fut->fut_cancel_msg); + return fut->fut_cancel_msg; +} + +static int +FutureObj_set_cancel_message(FutureObj *fut, PyObject *msg, + void *Py_UNUSED(ignored)) +{ + if (msg == NULL) { + PyErr_SetString(PyExc_AttributeError, "cannot delete attribute"); + return -1; + } + Py_INCREF(msg); + Py_XSETREF(fut->fut_cancel_msg, msg); + return 0; +} + static PyObject * FutureObj_get_state(FutureObj *fut, void *Py_UNUSED(ignored)) { @@ -1283,6 +1349,29 @@ FutureObj_get_state(FutureObj *fut, void *Py_UNUSED(ignored)) return ret; } +/*[clinic input] +_asyncio.Future._make_cancelled_error + +Create the CancelledError to raise if the Future is cancelled. + +This should only be called once when handling a cancellation since +it erases the context exception value. +[clinic start generated code]*/ + +static PyObject * +_asyncio_Future__make_cancelled_error_impl(FutureObj *self) +/*[clinic end generated code: output=a5df276f6c1213de input=ac6effe4ba795ecc]*/ +{ + PyObject *exc = create_cancelled_error(self->fut_cancel_msg); + _PyErr_StackItem *exc_state = &self->fut_cancelled_exc_state; + /* Transfer ownership of exc_value from exc_state to exc since we are + done with it. */ + PyException_SetContext(exc, exc_state->exc_value); + exc_state->exc_value = NULL; + + return exc; +} + /*[clinic input] _asyncio.Future._repr_info [clinic start generated code]*/ @@ -1291,8 +1380,7 @@ static PyObject * _asyncio_Future__repr_info_impl(FutureObj *self) /*[clinic end generated code: output=fa69e901bd176cfb input=f21504d8e2ae1ca2]*/ { - return PyObject_CallFunctionObjArgs( - asyncio_future_repr_info_func, self, NULL); + return PyObject_CallOneArg(asyncio_future_repr_info_func, (PyObject *)self); } static PyObject * @@ -1302,9 +1390,8 @@ FutureObj_repr(FutureObj *fut) ENSURE_FUTURE_ALIVE(fut) - PyObject *rinfo = _PyObject_CallMethodIdObjArgs((PyObject*)fut, - &PyId__repr_info, - NULL); + PyObject *rinfo = _PyObject_CallMethodIdNoArgs((PyObject*)fut, + &PyId__repr_info); if (rinfo == NULL) { return NULL; } @@ -1369,7 +1456,7 @@ FutureObj_finalize(FutureObj *fut) func = _PyObject_GetAttrId(fut->fut_loop, &PyId_call_exception_handler); if (func != NULL) { - PyObject *res = PyObject_CallFunctionObjArgs(func, context, NULL); + PyObject *res = PyObject_CallOneArg(func, context); if (res == NULL) { PyErr_WriteUnraisable(func); } @@ -1387,6 +1474,12 @@ finally: PyErr_Restore(error_type, error_value, error_traceback); } +static PyObject * +future_cls_getitem(PyObject *cls, PyObject *type) +{ + Py_INCREF(cls); + return cls; +} static PyAsyncMethods FutureType_as_async = { (unaryfunc)future_new_iter, /* am_await */ @@ -1405,7 +1498,9 @@ static PyMethodDef FutureType_methods[] = { _ASYNCIO_FUTURE_CANCELLED_METHODDEF _ASYNCIO_FUTURE_DONE_METHODDEF _ASYNCIO_FUTURE_GET_LOOP_METHODDEF + _ASYNCIO_FUTURE__MAKE_CANCELLED_ERROR_METHODDEF _ASYNCIO_FUTURE__REPR_INFO_METHODDEF + {"__class_getitem__", future_cls_getitem, METH_O|METH_CLASS, NULL}, {NULL, NULL} /* Sentinel */ }; @@ -1419,7 +1514,10 @@ static PyMethodDef FutureType_methods[] = { {"_exception", (getter)FutureObj_get_exception, NULL, NULL}, \ {"_log_traceback", (getter)FutureObj_get_log_traceback, \ (setter)FutureObj_set_log_traceback, NULL}, \ - {"_source_traceback", (getter)FutureObj_get_source_traceback, NULL, NULL}, + {"_source_traceback", (getter)FutureObj_get_source_traceback, \ + NULL, NULL}, \ + {"_cancel_message", (getter)FutureObj_get_cancel_message, \ + (setter)FutureObj_set_cancel_message, NULL}, static PyGetSetDef FutureType_getsetlist[] = { FUTURE_COMMON_GETSETLIST @@ -1866,8 +1964,8 @@ register_task(PyObject *task) { _Py_IDENTIFIER(add); - PyObject *res = _PyObject_CallMethodIdObjArgs( - all_tasks, &PyId_add, task, NULL); + PyObject *res = _PyObject_CallMethodIdOneArg(all_tasks, + &PyId_add, task); if (res == NULL) { return -1; } @@ -1881,8 +1979,8 @@ unregister_task(PyObject *task) { _Py_IDENTIFIER(discard); - PyObject *res = _PyObject_CallMethodIdObjArgs( - all_tasks, &PyId_discard, task, NULL); + PyObject *res = _PyObject_CallMethodIdOneArg(all_tasks, + &PyId_discard, task); if (res == NULL) { return -1; } @@ -2088,89 +2186,22 @@ TaskObj_get_fut_waiter(TaskObj *task, void *Py_UNUSED(ignored)) } /*[clinic input] -@classmethod -_asyncio.Task.current_task +_asyncio.Task._make_cancelled_error - loop: object = None +Create the CancelledError to raise if the Task is cancelled. -Return the currently running task in an event loop or None. - -By default the current task for the current event loop is returned. - -None is returned when called not in the context of a Task. +This should only be called once when handling a cancellation since +it erases the context exception value. [clinic start generated code]*/ static PyObject * -_asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop) -/*[clinic end generated code: output=99fbe7332c516e03 input=cd14770c5b79c7eb]*/ +_asyncio_Task__make_cancelled_error_impl(TaskObj *self) +/*[clinic end generated code: output=55a819e8b4276fab input=52c0e32de8e2f840]*/ { - PyObject *ret; - PyObject *current_task_func; - - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "Task.current_task() is deprecated, " \ - "use asyncio.current_task() instead", - 1) < 0) { - return NULL; - } - - current_task_func = _PyObject_GetAttrId(asyncio_mod, &PyId_current_task); - if (current_task_func == NULL) { - return NULL; - } - - if (loop == Py_None) { - loop = get_event_loop(); - if (loop == NULL) { - Py_DECREF(current_task_func); - return NULL; - } - ret = PyObject_CallFunctionObjArgs(current_task_func, loop, NULL); - Py_DECREF(current_task_func); - Py_DECREF(loop); - return ret; - } - else { - ret = PyObject_CallFunctionObjArgs(current_task_func, loop, NULL); - Py_DECREF(current_task_func); - return ret; - } + FutureObj *fut = (FutureObj*)self; + return _asyncio_Future__make_cancelled_error_impl(fut); } -/*[clinic input] -@classmethod -_asyncio.Task.all_tasks - - loop: object = None - -Return a set of all tasks for an event loop. - -By default all tasks for the current event loop are returned. -[clinic start generated code]*/ - -static PyObject * -_asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop) -/*[clinic end generated code: output=11f9b20749ccca5d input=497f80bc9ce726b5]*/ -{ - PyObject *res; - PyObject *all_tasks_func; - - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "Task.all_tasks() is deprecated, " \ - "use asyncio.all_tasks() instead", - 1) < 0) { - return NULL; - } - - all_tasks_func = _PyObject_GetAttrId(asyncio_mod, &PyId__all_tasks_compat); - if (all_tasks_func == NULL) { - return NULL; - } - - res = PyObject_CallFunctionObjArgs(all_tasks_func, loop, NULL); - Py_DECREF(all_tasks_func); - return res; -} /*[clinic input] _asyncio.Task._repr_info @@ -2180,13 +2211,14 @@ static PyObject * _asyncio_Task__repr_info_impl(TaskObj *self) /*[clinic end generated code: output=6a490eb66d5ba34b input=3c6d051ed3ddec8b]*/ { - return PyObject_CallFunctionObjArgs( - asyncio_task_repr_info_func, self, NULL); + return PyObject_CallOneArg(asyncio_task_repr_info_func, (PyObject *)self); } /*[clinic input] _asyncio.Task.cancel + msg: object = None + Request that this task cancel itself. This arranges for a CancelledError to be thrown into the @@ -2208,8 +2240,8 @@ was not called). [clinic start generated code]*/ static PyObject * -_asyncio_Task_cancel_impl(TaskObj *self) -/*[clinic end generated code: output=6bfc0479da9d5757 input=13f9bf496695cb52]*/ +_asyncio_Task_cancel_impl(TaskObj *self, PyObject *msg) +/*[clinic end generated code: output=c66b60d41c74f9f1 input=f4ff8e8ffc5f1c00]*/ { self->task_log_tb = 0; @@ -2221,8 +2253,8 @@ _asyncio_Task_cancel_impl(TaskObj *self) PyObject *res; int is_true; - res = _PyObject_CallMethodId( - self->task_fut_waiter, &PyId_cancel, NULL); + res = _PyObject_CallMethodIdOneArg(self->task_fut_waiter, + &PyId_cancel, msg); if (res == NULL) { return NULL; } @@ -2239,6 +2271,8 @@ _asyncio_Task_cancel_impl(TaskObj *self) } self->task_must_cancel = 1; + Py_XINCREF(msg); + Py_XSETREF(self->task_cancel_msg, msg); Py_RETURN_TRUE; } @@ -2432,7 +2466,7 @@ TaskObj_finalize(TaskObj *task) func = _PyObject_GetAttrId(task->task_loop, &PyId_call_exception_handler); if (func != NULL) { - PyObject *res = PyObject_CallFunctionObjArgs(func, context, NULL); + PyObject *res = PyObject_CallOneArg(func, context); if (res == NULL) { PyErr_WriteUnraisable(func); } @@ -2453,6 +2487,13 @@ done: FutureObj_finalize((FutureObj*)task); } +static PyObject * +task_cls_getitem(PyObject *cls, PyObject *type) +{ + Py_INCREF(cls); + return cls; +} + static void TaskObj_dealloc(PyObject *); /* Needs Task_CheckExact */ static PyMethodDef TaskType_methods[] = { @@ -2464,15 +2505,15 @@ static PyMethodDef TaskType_methods[] = { _ASYNCIO_FUTURE_DONE_METHODDEF _ASYNCIO_TASK_SET_RESULT_METHODDEF _ASYNCIO_TASK_SET_EXCEPTION_METHODDEF - _ASYNCIO_TASK_CURRENT_TASK_METHODDEF - _ASYNCIO_TASK_ALL_TASKS_METHODDEF _ASYNCIO_TASK_CANCEL_METHODDEF _ASYNCIO_TASK_GET_STACK_METHODDEF _ASYNCIO_TASK_PRINT_STACK_METHODDEF + _ASYNCIO_TASK__MAKE_CANCELLED_ERROR_METHODDEF _ASYNCIO_TASK__REPR_INFO_METHODDEF _ASYNCIO_TASK_GET_NAME_METHODDEF _ASYNCIO_TASK_SET_NAME_METHODDEF _ASYNCIO_TASK_GET_CORO_METHODDEF + {"__class_getitem__", task_cls_getitem, METH_O|METH_CLASS, NULL}, {NULL, NULL} /* Sentinel */ }; @@ -2564,7 +2605,7 @@ task_set_error_soon(TaskObj *task, PyObject *et, const char *format, ...) return NULL; } - PyObject *e = PyObject_CallFunctionObjArgs(et, msg, NULL); + PyObject *e = PyObject_CallOneArg(et, msg); Py_DECREF(msg); if (e == NULL) { return NULL; @@ -2614,7 +2655,8 @@ task_step_impl(TaskObj *task, PyObject *exc) if (!exc) { /* exc was not a CancelledError */ - exc = _PyObject_CallNoArg(asyncio_CancelledError); + exc = create_cancelled_error(task->task_cancel_msg); + if (!exc) { goto fail; } @@ -2641,13 +2683,11 @@ task_step_impl(TaskObj *task, PyObject *exc) result = _PyGen_Send((PyGenObject*)coro, Py_None); } else { - result = _PyObject_CallMethodIdObjArgs(coro, &PyId_send, - Py_None, NULL); + result = _PyObject_CallMethodIdOneArg(coro, &PyId_send, Py_None); } } else { - result = _PyObject_CallMethodIdObjArgs(coro, &PyId_throw, - exc, NULL); + result = _PyObject_CallMethodIdOneArg(coro, &PyId_throw, exc); if (clear_exc) { /* We created 'exc' during this call */ Py_DECREF(exc); @@ -2665,7 +2705,7 @@ task_step_impl(TaskObj *task, PyObject *exc) if (task->task_must_cancel) { // Task is cancelled right before coro stops. task->task_must_cancel = 0; - res = future_cancel((FutureObj*)task); + res = future_cancel((FutureObj*)task, task->task_cancel_msg); } else { res = future_set_result((FutureObj*)task, o); @@ -2682,8 +2722,15 @@ task_step_impl(TaskObj *task, PyObject *exc) if (PyErr_ExceptionMatches(asyncio_CancelledError)) { /* CancelledError */ - PyErr_Clear(); - return future_cancel((FutureObj*)task); + PyErr_Fetch(&et, &ev, &tb); + + FutureObj *fut = (FutureObj*)task; + _PyErr_StackItem *exc_state = &fut->fut_cancelled_exc_state; + exc_state->exc_type = et; + exc_state->exc_value = ev; + exc_state->exc_traceback = tb; + + return future_cancel(fut, NULL); } /* Some other exception; pop it and call Task.set_exception() */ @@ -2763,7 +2810,8 @@ task_step_impl(TaskObj *task, PyObject *exc) if (task->task_must_cancel) { PyObject *r; int is_true; - r = _PyObject_CallMethodId(result, &PyId_cancel, NULL); + r = _PyObject_CallMethodIdOneArg(result, &PyId_cancel, + task->task_cancel_msg); if (r == NULL) { return NULL; } @@ -2840,7 +2888,7 @@ task_step_impl(TaskObj *task, PyObject *exc) PyObject *stack[2]; stack[0] = wrapper; stack[1] = (PyObject *)task->task_context; - res = _PyObject_Vectorcall(add_cb, stack, 1, context_kwname); + res = PyObject_Vectorcall(add_cb, stack, 1, context_kwname); Py_DECREF(add_cb); Py_DECREF(wrapper); if (res == NULL) { @@ -2854,7 +2902,8 @@ task_step_impl(TaskObj *task, PyObject *exc) if (task->task_must_cancel) { PyObject *r; int is_true; - r = _PyObject_CallMethodId(result, &PyId_cancel, NULL); + r = _PyObject_CallMethodIdOneArg(result, &PyId_cancel, + task->task_cancel_msg); if (r == NULL) { return NULL; } @@ -3341,7 +3390,7 @@ module_init(void) PyObject *weak_set; WITH_MOD("weakref") GET_MOD_ATTR(weak_set, "WeakSet"); - all_tasks = _PyObject_CallNoArg(weak_set); + all_tasks = PyObject_CallNoArgs(weak_set); Py_CLEAR(weak_set); if (all_tasks == NULL) { goto fail; @@ -3392,9 +3441,6 @@ PyInit__asyncio(void) if (module_init() < 0) { return NULL; } - if (PyType_Ready(&FutureType) < 0) { - return NULL; - } if (PyType_Ready(&FutureIterType) < 0) { return NULL; } @@ -3404,9 +3450,6 @@ PyInit__asyncio(void) if (PyType_Ready(&TaskWakeupMethWrapper_Type) < 0) { return NULL; } - if (PyType_Ready(&TaskType) < 0) { - return NULL; - } if (PyType_Ready(&PyRunningLoopHolder_Type) < 0) { return NULL; } @@ -3416,16 +3459,13 @@ PyInit__asyncio(void) return NULL; } - Py_INCREF(&FutureType); - if (PyModule_AddObject(m, "Future", (PyObject *)&FutureType) < 0) { - Py_DECREF(&FutureType); + /* FutureType and TaskType are made ready by PyModule_AddType() calls below. */ + if (PyModule_AddType(m, &FutureType) < 0) { Py_DECREF(m); return NULL; } - Py_INCREF(&TaskType); - if (PyModule_AddObject(m, "Task", (PyObject *)&TaskType) < 0) { - Py_DECREF(&TaskType); + if (PyModule_AddType(m, &TaskType) < 0) { Py_DECREF(m); return NULL; } diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index 461a11f5..82d800d9 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -6,6 +6,13 @@ Converted to C by Dmitry Vasiliev (dima at hlabs.spb.ru). #define PY_SSIZE_T_CLEAN #include "Python.h" +/*[clinic input] +module _bisect +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=4d56a2b2033b462b]*/ + +#include "clinic/_bisectmodule.c.h" + _Py_IDENTIFIER(insert); static inline Py_ssize_t @@ -44,69 +51,63 @@ internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t return lo; } -static PyObject * -bisect_right(PyObject *self, PyObject *args, PyObject *kw) +/*[clinic input] +_bisect.bisect_right -> Py_ssize_t + + a: object + x: object + lo: Py_ssize_t = 0 + hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + +Return the index where to insert item x in list a, assuming a is sorted. + +The return value i is such that all e in a[:i] have e <= x, and all e in +a[i:] have e > x. So if x already appears in the list, i points just +beyond the rightmost x already there + +Optional args lo (default 0) and hi (default len(a)) bound the +slice of a to be searched. +[clinic start generated code]*/ + +static Py_ssize_t +_bisect_bisect_right_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi) +/*[clinic end generated code: output=419e150cf1d2a235 input=e72212b282c83375]*/ { - PyObject *list, *item; - Py_ssize_t lo = 0; - Py_ssize_t hi = -1; - Py_ssize_t index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - - if (kw == NULL && PyTuple_GET_SIZE(args) == 2) { - list = PyTuple_GET_ITEM(args, 0); - item = PyTuple_GET_ITEM(args, 1); - } - else { - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:bisect_right", - keywords, &list, &item, &lo, &hi)) - return NULL; - } - index = internal_bisect_right(list, item, lo, hi); - if (index < 0) - return NULL; - return PyLong_FromSsize_t(index); + return internal_bisect_right(a, x, lo, hi); } -PyDoc_STRVAR(bisect_right_doc, -"bisect_right(a, x[, lo[, hi]]) -> index\n\ -\n\ -Return the index where to insert item x in list a, assuming a is sorted.\n\ -\n\ -The return value i is such that all e in a[:i] have e <= x, and all e in\n\ -a[i:] have e > x. So if x already appears in the list, i points just\n\ -beyond the rightmost x already there\n\ -\n\ -Optional args lo (default 0) and hi (default len(a)) bound the\n\ -slice of a to be searched.\n"); +/*[clinic input] +_bisect.insort_right + + a: object + x: object + lo: Py_ssize_t = 0 + hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + +Insert item x in list a, and keep it sorted assuming a is sorted. + +If x is already in a, insert it to the right of the rightmost x. + +Optional args lo (default 0) and hi (default len(a)) bound the +slice of a to be searched. +[clinic start generated code]*/ static PyObject * -insort_right(PyObject *self, PyObject *args, PyObject *kw) +_bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi) +/*[clinic end generated code: output=c2caa3d4cd02035a input=d1c45bfa68182669]*/ { - PyObject *list, *item, *result; - Py_ssize_t lo = 0; - Py_ssize_t hi = -1; - Py_ssize_t index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - - if (kw == NULL && PyTuple_GET_SIZE(args) == 2) { - list = PyTuple_GET_ITEM(args, 0); - item = PyTuple_GET_ITEM(args, 1); - } - else { - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:insort_right", - keywords, &list, &item, &lo, &hi)) - return NULL; - } - index = internal_bisect_right(list, item, lo, hi); + PyObject *result; + Py_ssize_t index = internal_bisect_right(a, x, lo, hi); if (index < 0) return NULL; - if (PyList_CheckExact(list)) { - if (PyList_Insert(list, index, item) < 0) + if (PyList_CheckExact(a)) { + if (PyList_Insert(a, index, x) < 0) return NULL; } else { - result = _PyObject_CallMethodId(list, &PyId_insert, "nO", index, item); + result = _PyObject_CallMethodId(a, &PyId_insert, "nO", index, x); if (result == NULL) return NULL; Py_DECREF(result); @@ -115,16 +116,6 @@ insort_right(PyObject *self, PyObject *args, PyObject *kw) Py_RETURN_NONE; } -PyDoc_STRVAR(insort_right_doc, -"insort_right(a, x[, lo[, hi]])\n\ -\n\ -Insert item x in list a, and keep it sorted assuming a is sorted.\n\ -\n\ -If x is already in a, insert it to the right of the rightmost x.\n\ -\n\ -Optional args lo (default 0) and hi (default len(a)) bound the\n\ -slice of a to be searched.\n"); - static inline Py_ssize_t internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi) { @@ -161,67 +152,64 @@ internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t h return lo; } -static PyObject * -bisect_left(PyObject *self, PyObject *args, PyObject *kw) + +/*[clinic input] +_bisect.bisect_left -> Py_ssize_t + + a: object + x: object + lo: Py_ssize_t = 0 + hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + +Return the index where to insert item x in list a, assuming a is sorted. + +The return value i is such that all e in a[:i] have e < x, and all e in +a[i:] have e >= x. So if x already appears in the list, i points just +before the leftmost x already there. + +Optional args lo (default 0) and hi (default len(a)) bound the +slice of a to be searched. +[clinic start generated code]*/ + +static Py_ssize_t +_bisect_bisect_left_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi) +/*[clinic end generated code: output=af82168bc2856f24 input=2bd90f34afe5609f]*/ { - PyObject *list, *item; - Py_ssize_t lo = 0; - Py_ssize_t hi = -1; - Py_ssize_t index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - - if (kw == NULL && PyTuple_GET_SIZE(args) == 2) { - list = PyTuple_GET_ITEM(args, 0); - item = PyTuple_GET_ITEM(args, 1); - } - else { - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:bisect_left", - keywords, &list, &item, &lo, &hi)) - return NULL; - } - index = internal_bisect_left(list, item, lo, hi); - if (index < 0) - return NULL; - return PyLong_FromSsize_t(index); + return internal_bisect_left(a, x, lo, hi); } -PyDoc_STRVAR(bisect_left_doc, -"bisect_left(a, x[, lo[, hi]]) -> index\n\ -\n\ -Return the index where to insert item x in list a, assuming a is sorted.\n\ -\n\ -The return value i is such that all e in a[:i] have e < x, and all e in\n\ -a[i:] have e >= x. So if x already appears in the list, i points just\n\ -before the leftmost x already there.\n\ -\n\ -Optional args lo (default 0) and hi (default len(a)) bound the\n\ -slice of a to be searched.\n"); + +/*[clinic input] +_bisect.insort_left + + a: object + x: object + lo: Py_ssize_t = 0 + hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + +Insert item x in list a, and keep it sorted assuming a is sorted. + +If x is already in a, insert it to the left of the leftmost x. + +Optional args lo (default 0) and hi (default len(a)) bound the +slice of a to be searched. +[clinic start generated code]*/ static PyObject * -insort_left(PyObject *self, PyObject *args, PyObject *kw) +_bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi) +/*[clinic end generated code: output=9e8356c0844a182b input=bc4583308bce00cc]*/ { - PyObject *list, *item, *result; - Py_ssize_t lo = 0; - Py_ssize_t hi = -1; - Py_ssize_t index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - - if (kw == NULL && PyTuple_GET_SIZE(args) == 2) { - list = PyTuple_GET_ITEM(args, 0); - item = PyTuple_GET_ITEM(args, 1); - } else { - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:insort_left", - keywords, &list, &item, &lo, &hi)) - return NULL; - } - index = internal_bisect_left(list, item, lo, hi); + PyObject *result; + Py_ssize_t index = internal_bisect_left(a, x, lo, hi); if (index < 0) return NULL; - if (PyList_CheckExact(list)) { - if (PyList_Insert(list, index, item) < 0) + if (PyList_CheckExact(a)) { + if (PyList_Insert(a, index, x) < 0) return NULL; } else { - result = _PyObject_CallMethodId(list, &PyId_insert, "nO", index, item); + result = _PyObject_CallMethodId(a, &PyId_insert, "nO", index, x); if (result == NULL) return NULL; Py_DECREF(result); @@ -230,25 +218,11 @@ insort_left(PyObject *self, PyObject *args, PyObject *kw) Py_RETURN_NONE; } -PyDoc_STRVAR(insort_left_doc, -"insort_left(a, x[, lo[, hi]])\n\ -\n\ -Insert item x in list a, and keep it sorted assuming a is sorted.\n\ -\n\ -If x is already in a, insert it to the left of the leftmost x.\n\ -\n\ -Optional args lo (default 0) and hi (default len(a)) bound the\n\ -slice of a to be searched.\n"); - static PyMethodDef bisect_methods[] = { - {"bisect_right", (PyCFunction)(void(*)(void))bisect_right, - METH_VARARGS|METH_KEYWORDS, bisect_right_doc}, - {"insort_right", (PyCFunction)(void(*)(void))insort_right, - METH_VARARGS|METH_KEYWORDS, insort_right_doc}, - {"bisect_left", (PyCFunction)(void(*)(void))bisect_left, - METH_VARARGS|METH_KEYWORDS, bisect_left_doc}, - {"insort_left", (PyCFunction)(void(*)(void))insort_left, - METH_VARARGS|METH_KEYWORDS, insort_left_doc}, + _BISECT_BISECT_RIGHT_METHODDEF + _BISECT_INSORT_RIGHT_METHODDEF + _BISECT_BISECT_LEFT_METHODDEF + _BISECT_INSORT_LEFT_METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/_blake2/blake2b_impl.c b/Modules/_blake2/blake2b_impl.c index edab31ea..7fb1296f 100644 --- a/Modules/_blake2/blake2b_impl.c +++ b/Modules/_blake2/blake2b_impl.c @@ -15,7 +15,6 @@ #include "Python.h" #include "pystrhex.h" -#include "pythread.h" #include "../hashlib.h" #include "blake2ns.h" @@ -81,6 +80,7 @@ _blake2.blake2b.__new__ as py_blake2b_new node_depth: int = 0 inner_size: int = 0 last_node: bool = False + usedforsecurity: bool = True Return a new BLAKE2b hash object. [clinic start generated code]*/ @@ -90,8 +90,8 @@ py_blake2b_new_impl(PyTypeObject *type, PyObject *data, int digest_size, Py_buffer *key, Py_buffer *salt, Py_buffer *person, int fanout, int depth, unsigned long leaf_size, unsigned long long node_offset, int node_depth, - int inner_size, int last_node) -/*[clinic end generated code: output=65e732c66c2297a0 input=82be35a4e6a9daa2]*/ + int inner_size, int last_node, int usedforsecurity) +/*[clinic end generated code: output=32bfd8f043c6896f input=b947312abff46977]*/ { BLAKE2bObject *self = NULL; Py_buffer buf; diff --git a/Modules/_blake2/blake2module.c b/Modules/_blake2/blake2module.c index e2a3d420..ff142c9f 100644 --- a/Modules/_blake2/blake2module.c +++ b/Modules/_blake2/blake2module.c @@ -62,14 +62,11 @@ PyInit__blake2(void) return NULL; /* BLAKE2b */ - Py_TYPE(&PyBlake2_BLAKE2bType) = &PyType_Type; - if (PyType_Ready(&PyBlake2_BLAKE2bType) < 0) { + Py_SET_TYPE(&PyBlake2_BLAKE2bType, &PyType_Type); + if (PyModule_AddType(m, &PyBlake2_BLAKE2bType) < 0) { return NULL; } - Py_INCREF(&PyBlake2_BLAKE2bType); - PyModule_AddObject(m, "blake2b", (PyObject *)&PyBlake2_BLAKE2bType); - d = PyBlake2_BLAKE2bType.tp_dict; ADD_INT(d, "SALT_SIZE", BLAKE2B_SALTBYTES); ADD_INT(d, "PERSON_SIZE", BLAKE2B_PERSONALBYTES); @@ -82,14 +79,11 @@ PyInit__blake2(void) PyModule_AddIntConstant(m, "BLAKE2B_MAX_DIGEST_SIZE", BLAKE2B_OUTBYTES); /* BLAKE2s */ - Py_TYPE(&PyBlake2_BLAKE2sType) = &PyType_Type; - if (PyType_Ready(&PyBlake2_BLAKE2sType) < 0) { + Py_SET_TYPE(&PyBlake2_BLAKE2sType, &PyType_Type); + if (PyModule_AddType(m, &PyBlake2_BLAKE2sType) < 0) { return NULL; } - Py_INCREF(&PyBlake2_BLAKE2sType); - PyModule_AddObject(m, "blake2s", (PyObject *)&PyBlake2_BLAKE2sType); - d = PyBlake2_BLAKE2sType.tp_dict; ADD_INT(d, "SALT_SIZE", BLAKE2S_SALTBYTES); ADD_INT(d, "PERSON_SIZE", BLAKE2S_PERSONALBYTES); diff --git a/Modules/_blake2/blake2s_impl.c b/Modules/_blake2/blake2s_impl.c index ef2f7e19..e3e90d05 100644 --- a/Modules/_blake2/blake2s_impl.c +++ b/Modules/_blake2/blake2s_impl.c @@ -15,7 +15,6 @@ #include "Python.h" #include "pystrhex.h" -#include "pythread.h" #include "../hashlib.h" #include "blake2ns.h" @@ -81,6 +80,7 @@ _blake2.blake2s.__new__ as py_blake2s_new node_depth: int = 0 inner_size: int = 0 last_node: bool = False + usedforsecurity: bool = True Return a new BLAKE2s hash object. [clinic start generated code]*/ @@ -90,8 +90,8 @@ py_blake2s_new_impl(PyTypeObject *type, PyObject *data, int digest_size, Py_buffer *key, Py_buffer *salt, Py_buffer *person, int fanout, int depth, unsigned long leaf_size, unsigned long long node_offset, int node_depth, - int inner_size, int last_node) -/*[clinic end generated code: output=b95806be0514dcf7 input=641c0509debf714d]*/ + int inner_size, int last_node, int usedforsecurity) +/*[clinic end generated code: output=556181f73905c686 input=4dda87723f23abb0]*/ { BLAKE2sObject *self = NULL; Py_buffer buf; diff --git a/Modules/_blake2/clinic/blake2b_impl.c.h b/Modules/_blake2/clinic/blake2b_impl.c.h index cd329c07..07258c31 100644 --- a/Modules/_blake2/clinic/blake2b_impl.c.h +++ b/Modules/_blake2/clinic/blake2b_impl.c.h @@ -5,7 +5,8 @@ preserve PyDoc_STRVAR(py_blake2b_new__doc__, "blake2b(data=b\'\', /, *, digest_size=_blake2.blake2b.MAX_DIGEST_SIZE,\n" " key=b\'\', salt=b\'\', person=b\'\', fanout=1, depth=1, leaf_size=0,\n" -" node_offset=0, node_depth=0, inner_size=0, last_node=False)\n" +" node_offset=0, node_depth=0, inner_size=0, last_node=False,\n" +" usedforsecurity=True)\n" "--\n" "\n" "Return a new BLAKE2b hash object."); @@ -15,15 +16,15 @@ py_blake2b_new_impl(PyTypeObject *type, PyObject *data, int digest_size, Py_buffer *key, Py_buffer *salt, Py_buffer *person, int fanout, int depth, unsigned long leaf_size, unsigned long long node_offset, int node_depth, - int inner_size, int last_node); + int inner_size, int last_node, int usedforsecurity); static PyObject * py_blake2b_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"", "digest_size", "key", "salt", "person", "fanout", "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", NULL}; + static const char * const _keywords[] = {"", "digest_size", "key", "salt", "person", "fanout", "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "blake2b", 0}; - PyObject *argsbuf[12]; + PyObject *argsbuf[13]; PyObject * const *fastargs; Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; @@ -39,6 +40,7 @@ py_blake2b_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) int node_depth = 0; int inner_size = 0; int last_node = 0; + int usedforsecurity = 1; fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf); if (!fastargs) { @@ -175,12 +177,21 @@ skip_optional_posonly: goto skip_optional_kwonly; } } - last_node = PyObject_IsTrue(fastargs[11]); - if (last_node < 0) { + if (fastargs[11]) { + last_node = PyObject_IsTrue(fastargs[11]); + if (last_node < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + usedforsecurity = PyObject_IsTrue(fastargs[12]); + if (usedforsecurity < 0) { goto exit; } skip_optional_kwonly: - return_value = py_blake2b_new_impl(type, data, digest_size, &key, &salt, &person, fanout, depth, leaf_size, node_offset, node_depth, inner_size, last_node); + return_value = py_blake2b_new_impl(type, data, digest_size, &key, &salt, &person, fanout, depth, leaf_size, node_offset, node_depth, inner_size, last_node, usedforsecurity); exit: /* Cleanup for key */ @@ -261,4 +272,4 @@ _blake2_blake2b_hexdigest(BLAKE2bObject *self, PyObject *Py_UNUSED(ignored)) { return _blake2_blake2b_hexdigest_impl(self); } -/*[clinic end generated code: output=cbb625d7f60c288c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2d6d0fe9aa42a42a input=a9049054013a1b77]*/ diff --git a/Modules/_blake2/clinic/blake2s_impl.c.h b/Modules/_blake2/clinic/blake2s_impl.c.h index 560bd681..71c5706f 100644 --- a/Modules/_blake2/clinic/blake2s_impl.c.h +++ b/Modules/_blake2/clinic/blake2s_impl.c.h @@ -5,7 +5,8 @@ preserve PyDoc_STRVAR(py_blake2s_new__doc__, "blake2s(data=b\'\', /, *, digest_size=_blake2.blake2s.MAX_DIGEST_SIZE,\n" " key=b\'\', salt=b\'\', person=b\'\', fanout=1, depth=1, leaf_size=0,\n" -" node_offset=0, node_depth=0, inner_size=0, last_node=False)\n" +" node_offset=0, node_depth=0, inner_size=0, last_node=False,\n" +" usedforsecurity=True)\n" "--\n" "\n" "Return a new BLAKE2s hash object."); @@ -15,15 +16,15 @@ py_blake2s_new_impl(PyTypeObject *type, PyObject *data, int digest_size, Py_buffer *key, Py_buffer *salt, Py_buffer *person, int fanout, int depth, unsigned long leaf_size, unsigned long long node_offset, int node_depth, - int inner_size, int last_node); + int inner_size, int last_node, int usedforsecurity); static PyObject * py_blake2s_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"", "digest_size", "key", "salt", "person", "fanout", "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", NULL}; + static const char * const _keywords[] = {"", "digest_size", "key", "salt", "person", "fanout", "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "blake2s", 0}; - PyObject *argsbuf[12]; + PyObject *argsbuf[13]; PyObject * const *fastargs; Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; @@ -39,6 +40,7 @@ py_blake2s_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) int node_depth = 0; int inner_size = 0; int last_node = 0; + int usedforsecurity = 1; fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf); if (!fastargs) { @@ -175,12 +177,21 @@ skip_optional_posonly: goto skip_optional_kwonly; } } - last_node = PyObject_IsTrue(fastargs[11]); - if (last_node < 0) { + if (fastargs[11]) { + last_node = PyObject_IsTrue(fastargs[11]); + if (last_node < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + usedforsecurity = PyObject_IsTrue(fastargs[12]); + if (usedforsecurity < 0) { goto exit; } skip_optional_kwonly: - return_value = py_blake2s_new_impl(type, data, digest_size, &key, &salt, &person, fanout, depth, leaf_size, node_offset, node_depth, inner_size, last_node); + return_value = py_blake2s_new_impl(type, data, digest_size, &key, &salt, &person, fanout, depth, leaf_size, node_offset, node_depth, inner_size, last_node, usedforsecurity); exit: /* Cleanup for key */ @@ -261,4 +272,4 @@ _blake2_blake2s_hexdigest(BLAKE2sObject *self, PyObject *Py_UNUSED(ignored)) { return _blake2_blake2s_hexdigest_impl(self); } -/*[clinic end generated code: output=39af5a74c8805b36 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c80d8d06ce40a192 input=a9049054013a1b77]*/ diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c index 31bbf661..880632c6 100644 --- a/Modules/_bz2module.c +++ b/Modules/_bz2module.c @@ -3,9 +3,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" - -#include "pythread.h" +#include "structmember.h" // PyMemberDef #include #include @@ -728,13 +726,32 @@ static PyTypeObject BZ2Decompressor_Type = { /* Module initialization. */ +static int +_bz2_exec(PyObject *module) +{ + if (PyModule_AddType(module, &BZ2Compressor_Type) < 0) { + return -1; + } + + if (PyModule_AddType(module, &BZ2Decompressor_Type) < 0) { + return -1; + } + + return 0; +} + +static struct PyModuleDef_Slot _bz2_slots[] = { + {Py_mod_exec, _bz2_exec}, + {0, NULL} +}; + static struct PyModuleDef _bz2module = { PyModuleDef_HEAD_INIT, "_bz2", NULL, - -1, - NULL, + 0, NULL, + _bz2_slots, NULL, NULL, NULL @@ -743,23 +760,5 @@ static struct PyModuleDef _bz2module = { PyMODINIT_FUNC PyInit__bz2(void) { - PyObject *m; - - if (PyType_Ready(&BZ2Compressor_Type) < 0) - return NULL; - if (PyType_Ready(&BZ2Decompressor_Type) < 0) - return NULL; - - m = PyModule_Create(&_bz2module); - if (m == NULL) - return NULL; - - Py_INCREF(&BZ2Compressor_Type); - PyModule_AddObject(m, "BZ2Compressor", (PyObject *)&BZ2Compressor_Type); - - Py_INCREF(&BZ2Decompressor_Type); - PyModule_AddObject(m, "BZ2Decompressor", - (PyObject *)&BZ2Decompressor_Type); - - return m; + return PyModuleDef_Init(&_bz2module); } diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c index a8ffb699..95207210 100644 --- a/Modules/_codecsmodule.c +++ b/Modules/_codecsmodule.c @@ -1039,13 +1039,17 @@ static PyMethodDef _codecs_functions[] = { {NULL, NULL} /* sentinel */ }; +static PyModuleDef_Slot _codecs_slots[] = { + {0, NULL} +}; + static struct PyModuleDef codecsmodule = { PyModuleDef_HEAD_INIT, "_codecs", NULL, - -1, + 0, _codecs_functions, - NULL, + _codecs_slots, NULL, NULL, NULL @@ -1054,5 +1058,5 @@ static struct PyModuleDef codecsmodule = { PyMODINIT_FUNC PyInit__codecs(void) { - return PyModule_Create(&codecsmodule); + return PyModuleDef_Init(&codecsmodule); } diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index cc2b90ea..7120e4dd 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1,10 +1,10 @@ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #ifdef STDC_HEADERS #include #else -#include /* For size_t */ +#include // size_t #endif /*[clinic input] @@ -172,7 +172,7 @@ deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds) MARK_END(b->rightlink); assert(BLOCKLEN >= 2); - Py_SIZE(deque) = 0; + Py_SET_SIZE(deque, 0); deque->leftblock = b; deque->rightblock = b; deque->leftindex = CENTER + 1; @@ -196,7 +196,7 @@ deque_pop(dequeobject *deque, PyObject *unused) } item = deque->rightblock->data[deque->rightindex]; deque->rightindex--; - Py_SIZE(deque)--; + Py_SET_SIZE(deque, Py_SIZE(deque) - 1); deque->state++; if (deque->rightindex < 0) { @@ -234,7 +234,7 @@ deque_popleft(dequeobject *deque, PyObject *unused) assert(deque->leftblock != NULL); item = deque->leftblock->data[deque->leftindex]; deque->leftindex++; - Py_SIZE(deque)--; + Py_SET_SIZE(deque, Py_SIZE(deque) - 1); deque->state++; if (deque->leftindex == BLOCKLEN) { @@ -287,7 +287,7 @@ deque_append_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen) MARK_END(b->rightlink); deque->rightindex = -1; } - Py_SIZE(deque)++; + Py_SET_SIZE(deque, Py_SIZE(deque) + 1); deque->rightindex++; deque->rightblock->data[deque->rightindex] = item; if (NEEDS_TRIM(deque, maxlen)) { @@ -324,7 +324,7 @@ deque_appendleft_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen) MARK_END(b->leftlink); deque->leftindex = BLOCKLEN; } - Py_SIZE(deque)++; + Py_SET_SIZE(deque, Py_SIZE(deque) + 1); deque->leftindex--; deque->leftblock->data[deque->leftindex] = item; if (NEEDS_TRIM(deque, deque->maxlen)) { @@ -489,7 +489,7 @@ deque_copy(PyObject *deque, PyObject *Py_UNUSED(ignored)) { PyObject *result; dequeobject *old_deque = (dequeobject *)deque; - if (Py_TYPE(deque) == &deque_type) { + if (Py_IS_TYPE(deque, &deque_type)) { dequeobject *new_deque; PyObject *rv; @@ -512,8 +512,7 @@ deque_copy(PyObject *deque, PyObject *Py_UNUSED(ignored)) return NULL; } if (old_deque->maxlen < 0) - result = PyObject_CallFunctionObjArgs((PyObject *)(Py_TYPE(deque)), - deque, NULL); + result = PyObject_CallOneArg((PyObject *)(Py_TYPE(deque)), deque); else result = PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi", deque, old_deque->maxlen, NULL); @@ -540,7 +539,7 @@ deque_concat(dequeobject *deque, PyObject *other) if (rv == 0) { PyErr_Format(PyExc_TypeError, "can only concatenate deque (not \"%.200s\") to deque", - other->ob_type->tp_name); + Py_TYPE(other)->tp_name); } return NULL; } @@ -598,7 +597,7 @@ deque_clear(dequeobject *deque) /* Set the deque to be empty using the newly allocated block */ MARK_END(b->leftlink); MARK_END(b->rightlink); - Py_SIZE(deque) = 0; + Py_SET_SIZE(deque, 0); deque->leftblock = b; deque->rightblock = b; deque->leftindex = CENTER + 1; @@ -681,7 +680,7 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n) if (deque->rightindex == BLOCKLEN - 1) { block *b = newblock(); if (b == NULL) { - Py_SIZE(deque) += i; + Py_SET_SIZE(deque, Py_SIZE(deque) + i); return NULL; } b->leftlink = deque->rightblock; @@ -701,7 +700,7 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n) deque->rightblock->data[deque->rightindex] = item; } } - Py_SIZE(deque) += i; + Py_SET_SIZE(deque, Py_SIZE(deque) + i); Py_INCREF(deque); return (PyObject *)deque; } @@ -1610,6 +1609,8 @@ static PyMethodDef deque_methods[] = { METH_FASTCALL, rotate_doc}, {"__sizeof__", (PyCFunction)deque_sizeof, METH_NOARGS, sizeof_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -1981,7 +1982,7 @@ defdict_missing(defdictobject *dd, PyObject *key) Py_DECREF(tup); return NULL; } - value = PyEval_CallObject(factory, NULL); + value = _PyObject_CallNoArg(factory); if (value == NULL) return value; if (PyObject_SetItem((PyObject *)dd, key, value) < 0) { @@ -1991,6 +1992,13 @@ defdict_missing(defdictobject *dd, PyObject *key) return value; } +static inline PyObject* +new_defdict(defdictobject *dd, PyObject *arg) +{ + return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), + dd->default_factory ? dd->default_factory : Py_None, arg, NULL); +} + PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D."); static PyObject * @@ -2000,11 +2008,7 @@ defdict_copy(defdictobject *dd, PyObject *Py_UNUSED(ignored)) whose class constructor has the same signature. Subclasses that define a different constructor signature must override copy(). */ - - if (dd->default_factory == NULL) - return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL); - return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), - dd->default_factory, dd, NULL); + return new_defdict(dd, (PyObject*)dd); } static PyObject * @@ -2044,7 +2048,7 @@ defdict_reduce(defdictobject *dd, PyObject *Py_UNUSED(ignored)) args = PyTuple_Pack(1, dd->default_factory); if (args == NULL) return NULL; - items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, NULL); + items = _PyObject_CallMethodIdNoArgs((PyObject *)dd, &PyId_items); if (items == NULL) { Py_DECREF(args); return NULL; @@ -2072,6 +2076,8 @@ static PyMethodDef defdict_methods[] = { defdict_copy_doc}, {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS, reduce_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, + PyDoc_STR("See PEP 585")}, {NULL} }; @@ -2128,6 +2134,38 @@ defdict_repr(defdictobject *dd) return result; } +static PyObject* +defdict_or(PyObject* left, PyObject* right) +{ + PyObject *self, *other; + if (PyObject_TypeCheck(left, &defdict_type)) { + self = left; + other = right; + } + else { + self = right; + other = left; + } + if (!PyDict_Check(other)) { + Py_RETURN_NOTIMPLEMENTED; + } + // Like copy(), this calls the object's class. + // Override __or__/__ror__ for subclasses with different constructors. + PyObject *new = new_defdict((defdictobject*)self, left); + if (!new) { + return NULL; + } + if (PyDict_Update(new, right)) { + Py_DECREF(new); + return NULL; + } + return new; +} + +static PyNumberMethods defdict_as_number = { + .nb_or = defdict_or, +}; + static int defdict_traverse(PyObject *self, visitproc visit, void *arg) { @@ -2199,7 +2237,7 @@ static PyTypeObject defdict_type = { 0, /* tp_setattr */ 0, /* tp_as_async */ (reprfunc)defdict_repr, /* tp_repr */ - 0, /* tp_as_number */ + &defdict_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ @@ -2400,7 +2438,7 @@ tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type) "descriptor for index '%zd' for tuple subclasses " "doesn't apply to '%s' object", index, - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); return NULL; } @@ -2455,6 +2493,14 @@ tuplegetter_reduce(_tuplegetterobject *self, PyObject *Py_UNUSED(ignored)) return Py_BuildValue("(O(nO))", (PyObject*) Py_TYPE(self), self->index, self->doc); } +static PyObject* +tuplegetter_repr(_tuplegetterobject *self) +{ + return PyUnicode_FromFormat("%s(%zd, %R)", + _PyType_Name(Py_TYPE(self)), + self->index, self->doc); +} + static PyMemberDef tuplegetter_members[] = { {"__doc__", T_OBJECT, offsetof(_tuplegetterobject, doc), 0}, @@ -2477,7 +2523,7 @@ static PyTypeObject tuplegetter_type = { 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - 0, /* tp_repr */ + (reprfunc)tuplegetter_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ @@ -2512,24 +2558,51 @@ static PyTypeObject tuplegetter_type = { /* module level code ********************************************************/ -PyDoc_STRVAR(module_doc, +PyDoc_STRVAR(collections_doc, "High performance data structures.\n\ - deque: ordered collection accessible from endpoints only\n\ - defaultdict: dict subclass with a default value factory\n\ "); -static struct PyMethodDef module_functions[] = { +static struct PyMethodDef collections_methods[] = { _COLLECTIONS__COUNT_ELEMENTS_METHODDEF {NULL, NULL} /* sentinel */ }; +static int +collections_exec(PyObject *module) { + PyTypeObject *typelist[] = { + &deque_type, + &defdict_type, + &PyODict_Type, + &dequeiter_type, + &dequereviter_type, + &tuplegetter_type + }; + + defdict_type.tp_base = &PyDict_Type; + + for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) { + if (PyModule_AddType(module, typelist[i]) < 0) { + return -1; + } + } + + return 0; +} + +static struct PyModuleDef_Slot collections_slots[] = { + {Py_mod_exec, collections_exec}, + {0, NULL} +}; + static struct PyModuleDef _collectionsmodule = { PyModuleDef_HEAD_INIT, "_collections", - module_doc, - -1, - module_functions, - NULL, + collections_doc, + 0, + collections_methods, + collections_slots, NULL, NULL, NULL @@ -2538,40 +2611,5 @@ static struct PyModuleDef _collectionsmodule = { PyMODINIT_FUNC PyInit__collections(void) { - PyObject *m; - - m = PyModule_Create(&_collectionsmodule); - if (m == NULL) - return NULL; - - if (PyType_Ready(&deque_type) < 0) - return NULL; - Py_INCREF(&deque_type); - PyModule_AddObject(m, "deque", (PyObject *)&deque_type); - - defdict_type.tp_base = &PyDict_Type; - if (PyType_Ready(&defdict_type) < 0) - return NULL; - Py_INCREF(&defdict_type); - PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type); - - Py_INCREF(&PyODict_Type); - PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type); - - if (PyType_Ready(&dequeiter_type) < 0) - return NULL; - Py_INCREF(&dequeiter_type); - PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type); - - if (PyType_Ready(&dequereviter_type) < 0) - return NULL; - Py_INCREF(&dequereviter_type); - PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type); - - if (PyType_Ready(&tuplegetter_type) < 0) - return NULL; - Py_INCREF(&tuplegetter_type); - PyModule_AddObject(m, "_tuplegetter", (PyObject *)&tuplegetter_type); - - return m; + return PyModuleDef_Init(&_collectionsmodule); } diff --git a/Modules/_contextvarsmodule.c b/Modules/_contextvarsmodule.c index 1abcdbfa..d6d7f375 100644 --- a/Modules/_contextvarsmodule.c +++ b/Modules/_contextvarsmodule.c @@ -27,33 +27,15 @@ static PyMethodDef _contextvars_methods[] = { {NULL, NULL} }; -static struct PyModuleDef _contextvarsmodule = { - PyModuleDef_HEAD_INIT, /* m_base */ - "_contextvars", /* m_name */ - module_doc, /* m_doc */ - -1, /* m_size */ - _contextvars_methods, /* m_methods */ - NULL, /* m_slots */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL, /* m_free */ -}; - -PyMODINIT_FUNC -PyInit__contextvars(void) +static int +_contextvars_exec(PyObject *m) { - PyObject *m = PyModule_Create(&_contextvarsmodule); - if (m == NULL) { - return NULL; - } - Py_INCREF(&PyContext_Type); if (PyModule_AddObject(m, "Context", (PyObject *)&PyContext_Type) < 0) { Py_DECREF(&PyContext_Type); - Py_DECREF(m); - return NULL; + return -1; } Py_INCREF(&PyContextVar_Type); @@ -61,8 +43,7 @@ PyInit__contextvars(void) (PyObject *)&PyContextVar_Type) < 0) { Py_DECREF(&PyContextVar_Type); - Py_DECREF(m); - return NULL; + return -1; } Py_INCREF(&PyContextToken_Type); @@ -70,9 +51,31 @@ PyInit__contextvars(void) (PyObject *)&PyContextToken_Type) < 0) { Py_DECREF(&PyContextToken_Type); - Py_DECREF(m); - return NULL; + return -1; } - return m; + return 0; +} + +static struct PyModuleDef_Slot _contextvars_slots[] = { + {Py_mod_exec, _contextvars_exec}, + {0, NULL} +}; + +static struct PyModuleDef _contextvarsmodule = { + PyModuleDef_HEAD_INIT, /* m_base */ + "_contextvars", /* m_name */ + module_doc, /* m_doc */ + 0, /* m_size */ + _contextvars_methods, /* m_methods */ + _contextvars_slots, /* m_slots */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL, /* m_free */ +}; + +PyMODINIT_FUNC +PyInit__contextvars(void) +{ + return PyModuleDef_Init(&_contextvarsmodule); } diff --git a/Modules/_cryptmodule.c b/Modules/_cryptmodule.c index 5d03f45f..a95f55a6 100644 --- a/Modules/_cryptmodule.c +++ b/Modules/_cryptmodule.c @@ -42,6 +42,9 @@ crypt_crypt_impl(PyObject *module, const char *word, const char *salt) #else crypt_result = crypt(word, salt); #endif + if (crypt_result == NULL) { + return PyErr_SetFromErrno(PyExc_OSError); + } return Py_BuildValue("s", crypt_result); } @@ -51,14 +54,17 @@ static PyMethodDef crypt_methods[] = { {NULL, NULL} /* sentinel */ }; +static PyModuleDef_Slot _crypt_slots[] = { + {0, NULL} +}; static struct PyModuleDef cryptmodule = { PyModuleDef_HEAD_INIT, "_crypt", NULL, - -1, + 0, crypt_methods, - NULL, + _crypt_slots, NULL, NULL, NULL @@ -67,5 +73,5 @@ static struct PyModuleDef cryptmodule = { PyMODINIT_FUNC PyInit__crypt(void) { - return PyModule_Create(&cryptmodule); + return PyModuleDef_Init(&cryptmodule); } diff --git a/Modules/_csv.c b/Modules/_csv.c index 46d41438..59109b01 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -11,7 +11,7 @@ module instead. #define MODULE_VERSION "1.0" #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include @@ -21,21 +21,27 @@ typedef struct { long field_limit; /* max parsed field size */ } _csvstate; -#define _csvstate(o) ((_csvstate *)PyModule_GetState(o)) +static inline _csvstate* +get_csv_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_csvstate *)state; +} static int _csv_clear(PyObject *m) { - Py_CLEAR(_csvstate(m)->error_obj); - Py_CLEAR(_csvstate(m)->dialects); + Py_CLEAR(get_csv_state(m)->error_obj); + Py_CLEAR(get_csv_state(m)->dialects); return 0; } static int _csv_traverse(PyObject *m, visitproc visit, void *arg) { - Py_VISIT(_csvstate(m)->error_obj); - Py_VISIT(_csvstate(m)->dialects); + Py_VISIT(get_csv_state(m)->error_obj); + Py_VISIT(get_csv_state(m)->dialects); return 0; } @@ -106,7 +112,7 @@ typedef struct { static PyTypeObject Reader_Type; -#define ReaderObject_Check(v) (Py_TYPE(v) == &Reader_Type) +#define ReaderObject_Check(v) Py_IS_TYPE(v, &Reader_Type) typedef struct { PyObject_HEAD @@ -236,7 +242,7 @@ _set_char(const char *name, Py_UCS4 *target, PyObject *src, Py_UCS4 dflt) if (!PyUnicode_Check(src)) { PyErr_Format(PyExc_TypeError, "\"%s\" must be string, not %.200s", name, - src->ob_type->tp_name); + Py_TYPE(src)->tp_name); return -1; } len = PyUnicode_GetLength(src); @@ -514,10 +520,10 @@ _call_dialect(PyObject *dialect_inst, PyObject *kwargs) { PyObject *type = (PyObject *)&Dialect_Type; if (dialect_inst) { - return _PyObject_FastCallDict(type, &dialect_inst, 1, kwargs); + return PyObject_VectorcallDict(type, &dialect_inst, 1, kwargs); } else { - return _PyObject_FastCallDict(type, NULL, 0, kwargs); + return PyObject_VectorcallDict(type, NULL, 0, kwargs); } } @@ -783,7 +789,7 @@ Reader_iternext(ReaderObj *self) Py_UCS4 c; Py_ssize_t pos, linelen; unsigned int kind; - void *data; + const void *data; PyObject *lineobj; if (parse_reset(self) < 0) @@ -807,7 +813,7 @@ Reader_iternext(ReaderObj *self) "iterator should return strings, " "not %.200s " "(did you open the file in text mode?)", - lineobj->ob_type->tp_name + Py_TYPE(lineobj)->tp_name ); Py_DECREF(lineobj); return NULL; @@ -958,8 +964,6 @@ csv_reader(PyObject *module, PyObject *args, PyObject *keyword_args) } self->input_iter = PyObject_GetIter(iterator); if (self->input_iter == NULL) { - PyErr_SetString(PyExc_TypeError, - "argument 1 must be an iterator"); Py_DECREF(self); return NULL; } @@ -990,7 +994,7 @@ join_reset(WriterObj *self) * record length. */ static Py_ssize_t -join_append_data(WriterObj *self, unsigned int field_kind, void *field_data, +join_append_data(WriterObj *self, unsigned int field_kind, const void *field_data, Py_ssize_t field_len, int *quoted, int copy_phase) { @@ -1101,7 +1105,7 @@ static int join_append(WriterObj *self, PyObject *field, int quoted) { unsigned int field_kind = -1; - void *field_data = NULL; + const void *field_data = NULL; Py_ssize_t field_len = 0; Py_ssize_t rec_len; @@ -1133,7 +1137,7 @@ join_append_lineterminator(WriterObj *self) { Py_ssize_t terminator_len, i; unsigned int term_kind; - void *term_data; + const void *term_data; terminator_len = PyUnicode_GET_LENGTH(self->dialect->lineterminator); if (terminator_len == -1) @@ -1165,10 +1169,14 @@ csv_writerow(WriterObj *self, PyObject *seq) PyObject *iter, *field, *line, *result; iter = PyObject_GetIter(seq); - if (iter == NULL) - return PyErr_Format(_csvstate_global->error_obj, - "iterable expected, not %.200s", - seq->ob_type->tp_name); + if (iter == NULL) { + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_Format(_csvstate_global->error_obj, + "iterable expected, not %.200s", + Py_TYPE(seq)->tp_name); + } + return NULL; + } /* Join all fields in internal buffer. */ @@ -1240,7 +1248,7 @@ csv_writerow(WriterObj *self, PyObject *seq) if (line == NULL) { return NULL; } - result = PyObject_CallFunctionObjArgs(self->write, line, NULL); + result = PyObject_CallOneArg(self->write, line); Py_DECREF(line); return result; } @@ -1258,8 +1266,6 @@ csv_writerows(WriterObj *self, PyObject *seqseq) row_iter = PyObject_GetIter(seqseq); if (row_iter == NULL) { - PyErr_SetString(PyExc_TypeError, - "writerows() argument must be iterable"); return NULL; } while ((row_obj = PyIter_Next(row_iter))) { @@ -1627,9 +1633,6 @@ PyInit__csv(void) PyObject *module; const StyleDesc *style; - if (PyType_Ready(&Dialect_Type) < 0) - return NULL; - if (PyType_Ready(&Reader_Type) < 0) return NULL; @@ -1647,15 +1650,15 @@ PyInit__csv(void) return NULL; /* Set the field limit */ - _csvstate(module)->field_limit = 128 * 1024; + get_csv_state(module)->field_limit = 128 * 1024; /* Do I still need to add this var to the Module Dict? */ /* Add _dialects dictionary */ - _csvstate(module)->dialects = PyDict_New(); - if (_csvstate(module)->dialects == NULL) + get_csv_state(module)->dialects = PyDict_New(); + if (get_csv_state(module)->dialects == NULL) return NULL; - Py_INCREF(_csvstate(module)->dialects); - if (PyModule_AddObject(module, "_dialects", _csvstate(module)->dialects)) + Py_INCREF(get_csv_state(module)->dialects); + if (PyModule_AddObject(module, "_dialects", get_csv_state(module)->dialects)) return NULL; /* Add quote styles into dictionary */ @@ -1665,16 +1668,15 @@ PyInit__csv(void) return NULL; } - /* Add the Dialect type */ - Py_INCREF(&Dialect_Type); - if (PyModule_AddObject(module, "Dialect", (PyObject *)&Dialect_Type)) + if (PyModule_AddType(module, &Dialect_Type)) { return NULL; + } /* Add the CSV exception object to the module. */ - _csvstate(module)->error_obj = PyErr_NewException("_csv.Error", NULL, NULL); - if (_csvstate(module)->error_obj == NULL) + get_csv_state(module)->error_obj = PyErr_NewException("_csv.Error", NULL, NULL); + if (get_csv_state(module)->error_obj == NULL) return NULL; - Py_INCREF(_csvstate(module)->error_obj); - PyModule_AddObject(module, "Error", _csvstate(module)->error_obj); + Py_INCREF(get_csv_state(module)->error_obj); + PyModule_AddObject(module, "Error", get_csv_state(module)->error_obj); return module; } diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index b10b8672..ceae67eb 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -102,7 +102,7 @@ bytes(cdata) #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include #ifdef MS_WIN32 @@ -1060,8 +1060,8 @@ PyCPointerType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) stgdict items size, align, length contain info about pointers itself, stgdict->proto has info about the pointed to type! */ - stgdict = (StgDictObject *)PyObject_CallObject( - (PyObject *)&PyCStgDict_Type, NULL); + stgdict = (StgDictObject *)_PyObject_CallNoArg( + (PyObject *)&PyCStgDict_Type); if (!stgdict) return NULL; stgdict->size = sizeof(void *); @@ -1310,7 +1310,7 @@ CharArray_get_value(CDataObject *self, void *Py_UNUSED(ignored)) static int CharArray_set_value(CDataObject *self, PyObject *value, void *Py_UNUSED(ignored)) { - char *ptr; + const char *ptr; Py_ssize_t size; if (value == NULL) { @@ -1552,8 +1552,8 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) goto error; } - stgdict = (StgDictObject *)PyObject_CallObject( - (PyObject *)&PyCStgDict_Type, NULL); + stgdict = (StgDictObject *)_PyObject_CallNoArg( + (PyObject *)&PyCStgDict_Type); if (!stgdict) goto error; @@ -2009,8 +2009,8 @@ static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject if (result == NULL) return NULL; - stgdict = (StgDictObject *)PyObject_CallObject( - (PyObject *)&PyCStgDict_Type, NULL); + stgdict = (StgDictObject *)_PyObject_CallNoArg( + (PyObject *)&PyCStgDict_Type); if (!stgdict) { Py_DECREF(result); return NULL; @@ -2123,8 +2123,8 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) goto error; } - stgdict = (StgDictObject *)PyObject_CallObject( - (PyObject *)&PyCStgDict_Type, NULL); + stgdict = (StgDictObject *)_PyObject_CallNoArg( + (PyObject *)&PyCStgDict_Type); if (!stgdict) goto error; @@ -2563,8 +2563,8 @@ PyCFuncPtrType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyTypeObject *result; StgDictObject *stgdict; - stgdict = (StgDictObject *)PyObject_CallObject( - (PyObject *)&PyCStgDict_Type, NULL); + stgdict = (StgDictObject *)_PyObject_CallNoArg( + (PyObject *)&PyCStgDict_Type); if (!stgdict) return NULL; @@ -4085,7 +4085,7 @@ _build_result(PyObject *result, PyObject *callargs, _Py_IDENTIFIER(__ctypes_from_outparam__); v = PyTuple_GET_ITEM(callargs, i); - v = _PyObject_CallMethodId(v, &PyId___ctypes_from_outparam__, NULL); + v = _PyObject_CallMethodIdNoArgs(v, &PyId___ctypes_from_outparam__); if (v == NULL || numretvals == 1) { Py_DECREF(callargs); return v; @@ -4798,6 +4798,12 @@ Array_length(PyObject *myself) return self->b_length; } +static PyMethodDef Array_methods[] = { + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, + { NULL, NULL } +}; + static PySequenceMethods Array_as_sequence = { Array_length, /* sq_length; */ 0, /* sq_concat; */ @@ -4846,7 +4852,7 @@ PyTypeObject PyCArray_Type = { 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + Array_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ @@ -5265,7 +5271,8 @@ Pointer_subscript(PyObject *myself, PyObject *item) PyObject *np; StgDictObject *stgdict, *itemdict; PyObject *proto; - Py_ssize_t i, len, cur; + Py_ssize_t i, len; + size_t cur; /* Since pointers have no length, and we want to apply different semantics to negative indices than normal @@ -5694,7 +5701,6 @@ PyInit__ctypes(void) ob_type is the metatype (the 'type'), defaults to PyType_Type, tp_base is the base type, defaults to 'object' aka PyBaseObject_Type. */ - PyEval_InitThreads(); m = PyModule_Create(&_ctypesmodule); if (!m) return NULL; @@ -5757,42 +5763,42 @@ PyInit__ctypes(void) if (PyType_Ready(&PyCData_Type) < 0) return NULL; - Py_TYPE(&Struct_Type) = &PyCStructType_Type; + Py_SET_TYPE(&Struct_Type, &PyCStructType_Type); Struct_Type.tp_base = &PyCData_Type; if (PyType_Ready(&Struct_Type) < 0) return NULL; Py_INCREF(&Struct_Type); PyModule_AddObject(m, "Structure", (PyObject *)&Struct_Type); - Py_TYPE(&Union_Type) = &UnionType_Type; + Py_SET_TYPE(&Union_Type, &UnionType_Type); Union_Type.tp_base = &PyCData_Type; if (PyType_Ready(&Union_Type) < 0) return NULL; Py_INCREF(&Union_Type); PyModule_AddObject(m, "Union", (PyObject *)&Union_Type); - Py_TYPE(&PyCPointer_Type) = &PyCPointerType_Type; + Py_SET_TYPE(&PyCPointer_Type, &PyCPointerType_Type); PyCPointer_Type.tp_base = &PyCData_Type; if (PyType_Ready(&PyCPointer_Type) < 0) return NULL; Py_INCREF(&PyCPointer_Type); PyModule_AddObject(m, "_Pointer", (PyObject *)&PyCPointer_Type); - Py_TYPE(&PyCArray_Type) = &PyCArrayType_Type; + Py_SET_TYPE(&PyCArray_Type, &PyCArrayType_Type); PyCArray_Type.tp_base = &PyCData_Type; if (PyType_Ready(&PyCArray_Type) < 0) return NULL; Py_INCREF(&PyCArray_Type); PyModule_AddObject(m, "Array", (PyObject *)&PyCArray_Type); - Py_TYPE(&Simple_Type) = &PyCSimpleType_Type; + Py_SET_TYPE(&Simple_Type, &PyCSimpleType_Type); Simple_Type.tp_base = &PyCData_Type; if (PyType_Ready(&Simple_Type) < 0) return NULL; Py_INCREF(&Simple_Type); PyModule_AddObject(m, "_SimpleCData", (PyObject *)&Simple_Type); - Py_TYPE(&PyCFuncPtr_Type) = &PyCFuncPtrType_Type; + Py_SET_TYPE(&PyCFuncPtr_Type, &PyCFuncPtrType_Type); PyCFuncPtr_Type.tp_base = &PyCData_Type; if (PyType_Ready(&PyCFuncPtr_Type) < 0) return NULL; diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 33922082..1ccad8e0 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -4,11 +4,7 @@ #include #endif -#if defined(MS_WIN32) || defined(__CYGWIN__) -#define EXPORT(x) __declspec(dllexport) x -#else -#define EXPORT(x) x -#endif +#define EXPORT(x) Py_EXPORTED_SYMBOL x /* some functions handy for testing */ @@ -598,30 +594,6 @@ struct BITS { #endif }; -EXPORT(void) set_bitfields(struct BITS *bits, char name, int value) -{ - switch (name) { - case 'A': bits->A = value; break; - case 'B': bits->B = value; break; - case 'C': bits->C = value; break; - case 'D': bits->D = value; break; - case 'E': bits->E = value; break; - case 'F': bits->F = value; break; - case 'G': bits->G = value; break; - case 'H': bits->H = value; break; - case 'I': bits->I = value; break; -#ifdef SIGNED_SHORT_BITFIELDS - case 'M': bits->M = value; break; - case 'N': bits->N = value; break; - case 'O': bits->O = value; break; - case 'P': bits->P = value; break; - case 'Q': bits->Q = value; break; - case 'R': bits->R = value; break; - case 'S': bits->S = value; break; -#endif - } -} - EXPORT(int) unpack_bitfields(struct BITS *bits, char name) { switch (name) { @@ -1060,14 +1032,17 @@ EXPORT (HRESULT) KeepObject(IUnknown *punk) #endif +static struct PyModuleDef_Slot _ctypes_test_slots[] = { + {0, NULL} +}; static struct PyModuleDef _ctypes_testmodule = { PyModuleDef_HEAD_INIT, "_ctypes_test", NULL, - -1, + 0, module_methods, - NULL, + _ctypes_test_slots, NULL, NULL, NULL @@ -1076,5 +1051,5 @@ static struct PyModuleDef _ctypes_testmodule = { PyMODINIT_FUNC PyInit__ctypes_test(void) { - return PyModule_Create(&_ctypes_testmodule); + return PyModuleDef_Init(&_ctypes_testmodule); } diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index 2a364d6c..2abfa67c 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -84,7 +84,7 @@ PrintError(const char *msg, ...) va_list marker; va_start(marker, msg); - vsnprintf(buf, sizeof(buf), msg, marker); + PyOS_vsnprintf(buf, sizeof(buf), msg, marker); va_end(marker); if (f != NULL && f != Py_None) PyFile_WriteString(buf, f); @@ -438,7 +438,6 @@ static void LoadPython(void) { if (!Py_IsInitialized()) { Py_Initialize(); - PyEval_InitThreads(); } } diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index a9b8675c..6030cc3d 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -55,7 +55,7 @@ */ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #ifdef MS_WIN32 #include @@ -156,10 +156,9 @@ _ctypes_get_errobj(int **pspace) Py_INCREF(errobj); } else if (!PyErr_Occurred()) { - void *space = PyMem_Malloc(sizeof(int) * 2); + void *space = PyMem_Calloc(2, sizeof(int)); if (space == NULL) return NULL; - memset(space, 0, sizeof(int) * 2); errobj = PyCapsule_New(space, CTYPES_CAPSULE_NAME_PYMEM, pymem_destructor); if (errobj == NULL) { PyMem_Free(space); @@ -752,7 +751,7 @@ static int ConvParam(PyObject *obj, Py_ssize_t index, struct argument *pa) #if defined(MS_WIN32) && !defined(_WIN32_WCE) /* Per: https://msdn.microsoft.com/en-us/library/7572ztz4.aspx -To be returned by value in RAX, user-defined types must have a length +To be returned by value in RAX, user-defined types must have a length of 1, 2, 4, 8, 16, 32, or 64 bits */ int can_return_struct_as_int(size_t s) @@ -945,7 +944,7 @@ static PyObject *GetResult(PyObject *restype, void *result, PyObject *checker) if (!checker || !retval) return retval; - v = PyObject_CallFunctionObjArgs(checker, retval, NULL); + v = PyObject_CallOneArg(checker, retval); if (v == NULL) _PyTraceback_Add("GetResult", "_ctypes/callproc.c", __LINE__-2); Py_DECREF(retval); @@ -1153,7 +1152,7 @@ PyObject *_ctypes_callproc(PPROC pProc, if (argtypes && argtype_count > i) { PyObject *v; converter = PyTuple_GET_ITEM(argtypes, i); - v = PyObject_CallFunctionObjArgs(converter, arg, NULL); + v = PyObject_CallOneArg(converter, arg); if (v == NULL) { _ctypes_extend_error(PyExc_ArgError, "argument %zd: ", i+1); goto cleanup; @@ -1402,7 +1401,7 @@ copy_com_pointer(PyObject *self, PyObject *args) static PyObject *py_dl_open(PyObject *self, PyObject *args) { PyObject *name, *name2; - char *name_str; + const char *name_str; void * handle; #if HAVE_DECL_RTLD_LOCAL int mode = RTLD_NOW | RTLD_LOCAL; @@ -1726,10 +1725,9 @@ resize(PyObject *self, PyObject *args) if (!_CDataObject_HasExternalBuffer(obj)) { /* We are currently using the objects default buffer, but it isn't large enough any more. */ - void *ptr = PyMem_Malloc(size); + void *ptr = PyMem_Calloc(1, size); if (ptr == NULL) return PyErr_NoMemory(); - memset(ptr, 0, size); memmove(ptr, obj->b_ptr, obj->b_size); obj->b_ptr = ptr; obj->b_size = size; @@ -1753,7 +1751,7 @@ unpickle(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "OO!", &typ, &PyTuple_Type, &state)) return NULL; - obj = _PyObject_CallMethodIdObjArgs(typ, &PyId___new__, typ, NULL); + obj = _PyObject_CallMethodIdOneArg(typ, &PyId___new__, typ); if (obj == NULL) return NULL; @@ -1849,7 +1847,7 @@ pointer(PyObject *self, PyObject *arg) typ = PyDict_GetItemWithError(_ctypes_ptrtype_cache, (PyObject *)Py_TYPE(arg)); if (typ) { - return PyObject_CallFunctionObjArgs(typ, arg, NULL); + return PyObject_CallOneArg(typ, arg); } else if (PyErr_Occurred()) { return NULL; @@ -1857,7 +1855,7 @@ pointer(PyObject *self, PyObject *arg) typ = POINTER(NULL, (PyObject *)Py_TYPE(arg)); if (typ == NULL) return NULL; - result = PyObject_CallFunctionObjArgs(typ, arg, NULL); + result = PyObject_CallOneArg(typ, arg); Py_DECREF(typ); return result; } diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 95367d50..a72682d7 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "pycore_byteswap.h" // _Py_bswap32() #include #ifdef MS_WIN32 @@ -60,8 +61,7 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index, #define CONT_BITFIELD 2 #define EXPAND_BITFIELD 3 - self = (CFieldObject *)PyObject_CallObject((PyObject *)&PyCField_Type, - NULL); + self = (CFieldObject *)_PyObject_CallNoArg((PyObject *)&PyCField_Type); if (self == NULL) return NULL; dict = PyType_stgdict(desc); @@ -275,7 +275,7 @@ static void PyCField_dealloc(PyObject *self) { PyCField_clear((CFieldObject *)self); - self->ob_type->tp_free((PyObject *)self); + Py_TYPE(self)->tp_free((PyObject *)self); } static PyObject * @@ -449,46 +449,32 @@ get_ulonglong(PyObject *v, unsigned long long *p) ( ( (type)x & ~(BIT_MASK(type, size) << LOW_BIT(size)) ) | ( ((type)v & BIT_MASK(type, size)) << LOW_BIT(size) ) ) \ : (type)v) -/* byte swapping macros */ -#define SWAP_2(v) \ - ( ( (v >> 8) & 0x00FF) | \ - ( (v << 8) & 0xFF00) ) - -#define SWAP_4(v) \ - ( ( (v & 0x000000FF) << 24 ) | \ - ( (v & 0x0000FF00) << 8 ) | \ - ( (v & 0x00FF0000) >> 8 ) | \ - ( ((v >> 24) & 0xFF)) ) - -#ifdef _MSC_VER -#define SWAP_8(v) \ - ( ( (v & 0x00000000000000FFL) << 56 ) | \ - ( (v & 0x000000000000FF00L) << 40 ) | \ - ( (v & 0x0000000000FF0000L) << 24 ) | \ - ( (v & 0x00000000FF000000L) << 8 ) | \ - ( (v & 0x000000FF00000000L) >> 8 ) | \ - ( (v & 0x0000FF0000000000L) >> 24 ) | \ - ( (v & 0x00FF000000000000L) >> 40 ) | \ - ( ((v >> 56) & 0xFF)) ) +#if SIZEOF_SHORT == 2 +# define SWAP_SHORT _Py_bswap16 #else -#define SWAP_8(v) \ - ( ( (v & 0x00000000000000FFLL) << 56 ) | \ - ( (v & 0x000000000000FF00LL) << 40 ) | \ - ( (v & 0x0000000000FF0000LL) << 24 ) | \ - ( (v & 0x00000000FF000000LL) << 8 ) | \ - ( (v & 0x000000FF00000000LL) >> 8 ) | \ - ( (v & 0x0000FF0000000000LL) >> 24 ) | \ - ( (v & 0x00FF000000000000LL) >> 40 ) | \ - ( ((v >> 56) & 0xFF)) ) +# error "unsupported short size" #endif -#define SWAP_INT SWAP_4 +#if SIZEOF_INT == 4 +# define SWAP_INT _Py_bswap32 +#else +# error "unsupported int size" +#endif #if SIZEOF_LONG == 4 -# define SWAP_LONG SWAP_4 +# define SWAP_LONG _Py_bswap32 #elif SIZEOF_LONG == 8 -# define SWAP_LONG SWAP_8 +# define SWAP_LONG _Py_bswap64 +#else +# error "unsupported long size" +#endif + +#if SIZEOF_LONG_LONG == 8 +# define SWAP_LONG_LONG _Py_bswap64 +#else +# error "unsupported long long size" #endif + /***************************************************************** * The setter methods return an object which must be kept alive, to keep the * data valid which has been stored in the memory block. The ctypes object @@ -570,12 +556,13 @@ h_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { long val; short field; - if (get_long(value, &val) < 0) + if (get_long(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); - field = SWAP_2(field); + field = SWAP_SHORT(field); field = SET(short, field, val, size); - field = SWAP_2(field); + field = SWAP_SHORT(field); memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -594,7 +581,7 @@ h_get_sw(void *ptr, Py_ssize_t size) { short val; memcpy(&val, ptr, sizeof(val)); - val = SWAP_2(val); + val = SWAP_SHORT(val); GET_BITFIELD(val, size); return PyLong_FromLong(val); } @@ -617,12 +604,13 @@ H_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { unsigned long val; unsigned short field; - if (get_ulong(value, &val) < 0) + if (get_ulong(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); - field = SWAP_2(field); + field = SWAP_SHORT(field); field = SET(unsigned short, field, val, size); - field = SWAP_2(field); + field = SWAP_SHORT(field); memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -642,7 +630,7 @@ H_get_sw(void *ptr, Py_ssize_t size) { unsigned short val; memcpy(&val, ptr, sizeof(val)); - val = SWAP_2(val); + val = SWAP_SHORT(val); GET_BITFIELD(val, size); return PyLong_FromLong(val); } @@ -665,8 +653,9 @@ i_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { long val; int field; - if (get_long(value, &val) < 0) + if (get_long(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); field = SWAP_INT(field); field = SET(int, field, val, size); @@ -758,8 +747,9 @@ I_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { unsigned long val; unsigned int field; - if (get_ulong(value, &val) < 0) + if (get_ulong(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); field = SWAP_INT(field); field = SET(unsigned int, field, (unsigned int)val, size); @@ -806,8 +796,9 @@ l_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { long val; long field; - if (get_long(value, &val) < 0) + if (get_long(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); field = SWAP_LONG(field); field = SET(long, field, val, size); @@ -854,8 +845,9 @@ L_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { unsigned long val; unsigned long field; - if (get_ulong(value, &val) < 0) + if (get_ulong(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); field = SWAP_LONG(field); field = SET(unsigned long, field, val, size); @@ -902,12 +894,13 @@ q_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { long long val; long long field; - if (get_longlong(value, &val) < 0) + if (get_longlong(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); - field = SWAP_8(field); + field = SWAP_LONG_LONG(field); field = SET(long long, field, val, size); - field = SWAP_8(field); + field = SWAP_LONG_LONG(field); memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -926,7 +919,7 @@ q_get_sw(void *ptr, Py_ssize_t size) { long long val; memcpy(&val, ptr, sizeof(val)); - val = SWAP_8(val); + val = SWAP_LONG_LONG(val); GET_BITFIELD(val, size); return PyLong_FromLongLong(val); } @@ -949,12 +942,13 @@ Q_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { unsigned long long val; unsigned long long field; - if (get_ulonglong(value, &val) < 0) + if (get_ulonglong(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); - field = SWAP_8(field); + field = SWAP_LONG_LONG(field); field = SET(unsigned long long, field, val, size); - field = SWAP_8(field); + field = SWAP_LONG_LONG(field); memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -973,7 +967,7 @@ Q_get_sw(void *ptr, Py_ssize_t size) { unsigned long long val; memcpy(&val, ptr, sizeof(val)); - val = SWAP_8(val); + val = SWAP_LONG_LONG(val); GET_BITFIELD(val, size); return PyLong_FromUnsignedLongLong(val); } @@ -1176,7 +1170,7 @@ u_set(void *ptr, PyObject *value, Py_ssize_t size) if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } else Py_INCREF(value); @@ -1235,7 +1229,7 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length) if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1284,13 +1278,13 @@ s_get(void *ptr, Py_ssize_t size) static PyObject * s_set(void *ptr, PyObject *value, Py_ssize_t length) { - char *data; + const char *data; Py_ssize_t size; if(!PyBytes_Check(value)) { PyErr_Format(PyExc_TypeError, "expected bytes, %s found", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1322,7 +1316,7 @@ z_set(void *ptr, PyObject *value, Py_ssize_t size) return value; } if (PyBytes_Check(value)) { - *(char **)ptr = PyBytes_AsString(value); + *(const char **)ptr = PyBytes_AsString(value); Py_INCREF(value); return value; } else if (PyLong_Check(value)) { @@ -1335,7 +1329,7 @@ z_set(void *ptr, PyObject *value, Py_ssize_t size) } PyErr_Format(PyExc_TypeError, "bytes or integer address expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1374,7 +1368,7 @@ Z_set(void *ptr, PyObject *value, Py_ssize_t size) if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string or integer address expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1417,7 +1411,7 @@ BSTR_set(void *ptr, PyObject *value, Py_ssize_t size) } else if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index e58f8523..1effccf9 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -68,7 +68,7 @@ typedef struct { ffi_type *atypes[1]; } CThunkObject; extern PyTypeObject PyCThunk_Type; -#define CThunk_CheckExact(v) ((v)->ob_type == &PyCThunk_Type) +#define CThunk_CheckExact(v) Py_IS_TYPE(v, &PyCThunk_Type) typedef struct { /* First part identical to tagCDataObject */ @@ -102,7 +102,7 @@ typedef struct { } PyCFuncPtrObject; extern PyTypeObject PyCStgDict_Type; -#define PyCStgDict_CheckExact(v) ((v)->ob_type == &PyCStgDict_Type) +#define PyCStgDict_CheckExact(v) Py_IS_TYPE(v, &PyCStgDict_Type) #define PyCStgDict_Check(v) PyObject_TypeCheck(v, &PyCStgDict_Type) extern int PyCStructUnionType_update_stgdict(PyObject *fields, PyObject *type, int isStruct); @@ -112,12 +112,12 @@ extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palig extern PyTypeObject PyCData_Type; -#define CDataObject_CheckExact(v) ((v)->ob_type == &PyCData_Type) +#define CDataObject_CheckExact(v) Py_IS_TYPE(v, &PyCData_Type) #define CDataObject_Check(v) PyObject_TypeCheck(v, &PyCData_Type) #define _CDataObject_HasExternalBuffer(v) ((v)->b_ptr != (char *)&(v)->b_value) extern PyTypeObject PyCSimpleType_Type; -#define PyCSimpleTypeObject_CheckExact(v) ((v)->ob_type == &PyCSimpleType_Type) +#define PyCSimpleTypeObject_CheckExact(v) Py_IS_TYPE(v, &PyCSimpleType_Type) #define PyCSimpleTypeObject_Check(v) PyObject_TypeCheck(v, &PyCSimpleType_Type) extern PyTypeObject PyCField_Type; @@ -314,7 +314,7 @@ struct tagPyCArgObject { }; extern PyTypeObject PyCArg_Type; -#define PyCArg_CheckExact(v) ((v)->ob_type == &PyCArg_Type) +#define PyCArg_CheckExact(v) Py_IS_TYPE(v, &PyCArg_Type) extern PyCArgObject *PyCArgObject_new(void); extern PyObject * diff --git a/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c b/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c index f2610c16..8e7d0164 100644 --- a/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +++ b/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c @@ -57,7 +57,7 @@ ffi_call_unix64( of SSESF, SSEDF classes, that are basically SSE class, just gcc will use SF or DFmode move instead of DImode to avoid reformating penalties. - Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves whenever possible (upper half does contain padding). */ enum x86_64_reg_class { diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c index 1d45ade5..443951a6 100644 --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -190,7 +190,7 @@ PyType_stgdict(PyObject *obj) StgDictObject * PyObject_stgdict(PyObject *self) { - PyTypeObject *type = self->ob_type; + PyTypeObject *type = Py_TYPE(self); if (!type->tp_dict || !PyCStgDict_CheckExact(type->tp_dict)) return NULL; return (StgDictObject *)type->tp_dict; @@ -231,7 +231,7 @@ MakeFields(PyObject *type, CFieldObject *descr, Py_DECREF(fieldlist); return -1; } - if (Py_TYPE(fdescr) != &PyCField_Type) { + if (!Py_IS_TYPE(fdescr, &PyCField_Type)) { PyErr_SetString(PyExc_TypeError, "unexpected type"); Py_DECREF(fdescr); Py_DECREF(fieldlist); @@ -254,7 +254,7 @@ MakeFields(PyObject *type, CFieldObject *descr, Py_DECREF(fieldlist); return -1; } - assert(Py_TYPE(new_descr) == &PyCField_Type); + assert(Py_IS_TYPE(new_descr, &PyCField_Type)); new_descr->size = fdescr->size; new_descr->offset = fdescr->offset + offset; new_descr->index = fdescr->index + index; @@ -304,7 +304,7 @@ MakeAnonFields(PyObject *type) Py_DECREF(anon_names); return -1; } - if (Py_TYPE(descr) != &PyCField_Type) { + if (!Py_IS_TYPE(descr, &PyCField_Type)) { PyErr_Format(PyExc_AttributeError, "'%U' is specified in _anonymous_ but not in " "_fields_", diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c index 53849e3a..f1248034 100644 --- a/Modules/_curses_panel.c +++ b/Modules/_curses_panel.c @@ -21,19 +21,26 @@ typedef struct { PyObject *PyCursesPanel_Type; } _curses_panelstate; -#define _curses_panelstate(o) ((_curses_panelstate *)PyModule_GetState(o)) +static inline _curses_panelstate* +get_curses_panelstate(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_curses_panelstate *)state; +} static int _curses_panel_clear(PyObject *m) { - Py_CLEAR(_curses_panelstate(m)->PyCursesError); + Py_CLEAR(get_curses_panelstate(m)->PyCursesError); return 0; } static int _curses_panel_traverse(PyObject *m, visitproc visit, void *arg) { - Py_VISIT(_curses_panelstate(m)->PyCursesError); + Py_VISIT(Py_TYPE(m)); + Py_VISIT(get_curses_panelstate(m)->PyCursesError); return 0; } @@ -83,7 +90,7 @@ typedef struct { } PyCursesPanelObject; #define PyCursesPanel_Check(v) \ - (Py_TYPE(v) == _curses_panelstate_global->PyCursesPanel_Type) + Py_IS_TYPE(v, _curses_panelstate_global->PyCursesPanel_Type) /* Some helper functions. The problem is that there's always a window associated with a panel. To ensure that Python's GC doesn't pull @@ -233,7 +240,7 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) { PyCursesPanelObject *po; - po = PyObject_NEW(PyCursesPanelObject, + po = PyObject_New(PyCursesPanelObject, (PyTypeObject *)(_curses_panelstate_global)->PyCursesPanel_Type); if (po == NULL) return NULL; po->pan = pan; @@ -645,15 +652,15 @@ PyInit__curses_panel(void) if (v == NULL) goto fail; ((PyTypeObject *)v)->tp_new = NULL; - _curses_panelstate(m)->PyCursesPanel_Type = v; + get_curses_panelstate(m)->PyCursesPanel_Type = v; import_curses(); if (PyErr_Occurred()) goto fail; /* For exception _curses_panel.error */ - _curses_panelstate(m)->PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL); - PyDict_SetItemString(d, "error", _curses_panelstate(m)->PyCursesError); + get_curses_panelstate(m)->PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL); + PyDict_SetItemString(d, "error", get_curses_panelstate(m)->PyCursesError); /* Make the version available */ v = PyUnicode_FromString(PyCursesVersion); @@ -661,8 +668,9 @@ PyInit__curses_panel(void) PyDict_SetItemString(d, "__version__", v); Py_DECREF(v); - Py_INCREF(_curses_panelstate(m)->PyCursesPanel_Type); - PyModule_AddObject(m, "panel", (PyObject *)_curses_panelstate(m)->PyCursesPanel_Type); + Py_INCREF(get_curses_panelstate(m)->PyCursesPanel_Type); + PyModule_AddObject(m, "panel", + (PyObject *)get_curses_panelstate(m)->PyCursesPanel_Type); return m; fail: Py_XDECREF(m); diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index b2b1117f..c70b0e2a 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -547,7 +547,7 @@ PyCursesWindow_New(WINDOW *win, const char *encoding) encoding = "utf-8"; } - wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type); + wo = PyObject_New(PyCursesWindowObject, &PyCursesWindow_Type); if (wo == NULL) return NULL; wo->win = win; wo->encoding = _PyMem_Strdup(encoding); @@ -709,7 +709,7 @@ _curses_window_addstr_impl(PyCursesWindowObject *self, int group_left_1, else #endif { - char *str = PyBytes_AS_STRING(bytesobj); + const char *str = PyBytes_AS_STRING(bytesobj); funcname = "addstr"; if (use_xy) rtn = mvwaddstr(self->win,y,x,str); @@ -792,7 +792,7 @@ _curses_window_addnstr_impl(PyCursesWindowObject *self, int group_left_1, else #endif { - char *str = PyBytes_AS_STRING(bytesobj); + const char *str = PyBytes_AS_STRING(bytesobj); funcname = "addnstr"; if (use_xy) rtn = mvwaddnstr(self->win,y,x,str,n); @@ -1710,7 +1710,7 @@ _curses_window_insstr_impl(PyCursesWindowObject *self, int group_left_1, else #endif { - char *str = PyBytes_AS_STRING(bytesobj); + const char *str = PyBytes_AS_STRING(bytesobj); funcname = "insstr"; if (use_xy) rtn = mvwinsstr(self->win,y,x,str); @@ -1795,7 +1795,7 @@ _curses_window_insnstr_impl(PyCursesWindowObject *self, int group_left_1, else #endif { - char *str = PyBytes_AS_STRING(bytesobj); + const char *str = PyBytes_AS_STRING(bytesobj); funcname = "insnstr"; if (use_xy) rtn = mvwinsnstr(self->win,y,x,str,n); @@ -2918,13 +2918,13 @@ _curses_getwin(PyObject *module, PyObject *file) if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0) goto error; - data = _PyObject_CallMethodId(file, &PyId_read, NULL); + data = _PyObject_CallMethodIdNoArgs(file, &PyId_read); if (data == NULL) goto error; if (!PyBytes_Check(data)) { PyErr_Format(PyExc_TypeError, "f.read() returned %.100s instead of bytes", - data->ob_type->tp_name); + Py_TYPE(data)->tp_name); Py_DECREF(data); goto error; } @@ -3255,6 +3255,90 @@ _curses_setupterm_impl(PyObject *module, const char *term, int fd) Py_RETURN_NONE; } +#if defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102 +// https://invisible-island.net/ncurses/NEWS.html#index-t20080119 + +/*[clinic input] +_curses.get_escdelay + +Gets the curses ESCDELAY setting. + +Gets the number of milliseconds to wait after reading an escape character, +to distinguish between an individual escape character entered on the +keyboard from escape sequences sent by cursor and function keys. +[clinic start generated code]*/ + +static PyObject * +_curses_get_escdelay_impl(PyObject *module) +/*[clinic end generated code: output=222fa1a822555d60 input=be2d5b3dd974d0a4]*/ +{ + return PyLong_FromLong(ESCDELAY); +} +/*[clinic input] +_curses.set_escdelay + ms: int + length of the delay in milliseconds. + / + +Sets the curses ESCDELAY setting. + +Sets the number of milliseconds to wait after reading an escape character, +to distinguish between an individual escape character entered on the +keyboard from escape sequences sent by cursor and function keys. +[clinic start generated code]*/ + +static PyObject * +_curses_set_escdelay_impl(PyObject *module, int ms) +/*[clinic end generated code: output=43818efbf7980ac4 input=7796fe19f111e250]*/ +{ + if (ms <= 0) { + PyErr_SetString(PyExc_ValueError, "ms must be > 0"); + return NULL; + } + + return PyCursesCheckERR(set_escdelay(ms), "set_escdelay"); +} + +/*[clinic input] +_curses.get_tabsize + +Gets the curses TABSIZE setting. + +Gets the number of columns used by the curses library when converting a tab +character to spaces as it adds the tab to a window. +[clinic start generated code]*/ + +static PyObject * +_curses_get_tabsize_impl(PyObject *module) +/*[clinic end generated code: output=7e9e51fb6126fbdf input=74af86bf6c9f5d7e]*/ +{ + return PyLong_FromLong(TABSIZE); +} +/*[clinic input] +_curses.set_tabsize + size: int + rendered cell width of a tab character. + / + +Sets the curses TABSIZE setting. + +Sets the number of columns used by the curses library when converting a tab +character to spaces as it adds the tab to a window. +[clinic start generated code]*/ + +static PyObject * +_curses_set_tabsize_impl(PyObject *module, int size) +/*[clinic end generated code: output=c1de5a76c0daab1e input=78cba6a3021ad061]*/ +{ + if (size <= 0) { + PyErr_SetString(PyExc_ValueError, "size must be > 0"); + return NULL; + } + + return PyCursesCheckERR(set_tabsize(size), "set_tabsize"); +} +#endif + /*[clinic input] _curses.intrflush @@ -3730,7 +3814,7 @@ update_lines_cols(void) return 0; } /* PyId_LINES.object will be initialized here. */ - if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) { + if (PyDict_SetItem(ModDict, _PyUnicode_FromId(&PyId_LINES), o)) { Py_DECREF(m); Py_DECREF(o); return 0; @@ -3746,7 +3830,7 @@ update_lines_cols(void) Py_DECREF(o); return 0; } - if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) { + if (PyDict_SetItem(ModDict, _PyUnicode_FromId(&PyId_COLS), o)) { Py_DECREF(m); Py_DECREF(o); return 0; @@ -3757,15 +3841,18 @@ update_lines_cols(void) } /*[clinic input] -_curses.update_lines_cols -> int +_curses.update_lines_cols [clinic start generated code]*/ -static int +static PyObject * _curses_update_lines_cols_impl(PyObject *module) -/*[clinic end generated code: output=0345e7f072ea711a input=3a87760f7d5197f0]*/ +/*[clinic end generated code: output=423f2b1e63ed0f75 input=5f065ab7a28a5d90]*/ { - return update_lines_cols(); + if (!update_lines_cols()) { + return NULL; + } + Py_RETURN_NONE; } #endif @@ -3849,8 +3936,10 @@ _curses_resizeterm_impl(PyObject *module, int nlines, int ncols) result = PyCursesCheckERR(resizeterm(nlines, ncols), "resizeterm"); if (!result) return NULL; - if (!update_lines_cols()) + if (!update_lines_cols()) { + Py_DECREF(result); return NULL; + } return result; } @@ -3886,8 +3975,10 @@ _curses_resize_term_impl(PyObject *module, int nlines, int ncols) result = PyCursesCheckERR(resize_term(nlines, ncols), "resize_term"); if (!result) return NULL; - if (!update_lines_cols()) + if (!update_lines_cols()) { + Py_DECREF(result); return NULL; + } return result; } #endif /* HAVE_CURSES_RESIZE_TERM */ @@ -3958,12 +4049,18 @@ _curses_start_color_impl(PyObject *module) c = PyLong_FromLong((long) COLORS); if (c == NULL) return NULL; - PyDict_SetItemString(ModDict, "COLORS", c); + if (PyDict_SetItemString(ModDict, "COLORS", c) < 0) { + Py_DECREF(c); + return NULL; + } Py_DECREF(c); cp = PyLong_FromLong((long) COLOR_PAIRS); if (cp == NULL) return NULL; - PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp); + if (PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp) < 0) { + Py_DECREF(cp); + return NULL; + } Py_DECREF(cp); Py_RETURN_NONE; } else { @@ -4415,6 +4512,12 @@ static PyMethodDef PyCurses_methods[] = { _CURSES_RESIZETERM_METHODDEF _CURSES_RESIZE_TERM_METHODDEF _CURSES_SAVETTY_METHODDEF +#if defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102 + _CURSES_GET_ESCDELAY_METHODDEF + _CURSES_SET_ESCDELAY_METHODDEF +#endif + _CURSES_GET_TABSIZE_METHODDEF + _CURSES_SET_TABSIZE_METHODDEF _CURSES_SETSYX_METHODDEF _CURSES_SETUPTERM_METHODDEF _CURSES_START_COLOR_METHODDEF @@ -4637,7 +4740,8 @@ PyInit__curses(void) SetDictInt("KEY_MAX", KEY_MAX); } - Py_INCREF(&PyCursesWindow_Type); - PyModule_AddObject(m, "window", (PyObject *)&PyCursesWindow_Type); + if (PyModule_AddType(m, &PyCursesWindow_Type) < 0) { + return NULL; + } return m; } diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 41c3f342..4e0c3783 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -9,7 +9,7 @@ #include "Python.h" #include "datetime.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include @@ -18,19 +18,19 @@ #endif #define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) -#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) +#define PyDate_CheckExact(op) Py_IS_TYPE(op, &PyDateTime_DateType) #define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType) -#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType) +#define PyDateTime_CheckExact(op) Py_IS_TYPE(op, &PyDateTime_DateTimeType) #define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType) -#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType) +#define PyTime_CheckExact(op) Py_IS_TYPE(op, &PyDateTime_TimeType) #define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType) -#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType) +#define PyDelta_CheckExact(op) Py_IS_TYPE(op, &PyDateTime_DeltaType) #define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) -#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) +#define PyTZInfo_CheckExact(op) Py_IS_TYPE(op, &PyDateTime_TZInfoType) #define PyTimezone_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeZoneType) @@ -38,8 +38,9 @@ module datetime class datetime.datetime "PyDateTime_DateTime *" "&PyDateTime_DateTimeType" class datetime.date "PyDateTime_Date *" "&PyDateTime_DateType" +class datetime.IsoCalendarDate "PyDateTime_IsoCalendarDate *" "&PyDateTime_IsoCalendarDateType" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=25138ad6a696b785]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=81bec0fa19837f63]*/ #include "clinic/_datetimemodule.c.h" @@ -131,6 +132,7 @@ class datetime.date "PyDateTime_Date *" "&PyDateTime_DateType" static PyTypeObject PyDateTime_DateType; static PyTypeObject PyDateTime_DateTimeType; static PyTypeObject PyDateTime_DeltaType; +static PyTypeObject PyDateTime_IsoCalendarDateType; static PyTypeObject PyDateTime_TimeType; static PyTypeObject PyDateTime_TZInfoType; static PyTypeObject PyDateTime_TimeZoneType; @@ -1242,8 +1244,7 @@ call_tzname(PyObject *tzinfo, PyObject *tzinfoarg) if (tzinfo == Py_None) Py_RETURN_NONE; - result = _PyObject_CallMethodIdObjArgs(tzinfo, &PyId_tzname, - tzinfoarg, NULL); + result = _PyObject_CallMethodIdOneArg(tzinfo, &PyId_tzname, tzinfoarg); if (result == NULL || result == Py_None) return result; @@ -1533,8 +1534,8 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, ntoappend = 1; } else if ((ch = *pin++) == '\0') { - /* Null byte follows %, copy only '%'. - * + /* Null byte follows %, copy only '%'. + * * Back the pin up one char so that we catch the null check * the next time through the loop.*/ pin--; @@ -1624,7 +1625,7 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, usednew += ntoappend; assert(usednew <= totalnew); } /* end while() */ - + if (_PyBytes_Resize(&newfmt, usednew) < 0) goto Done; { @@ -1664,7 +1665,7 @@ time_time(void) if (time != NULL) { _Py_IDENTIFIER(time); - result = _PyObject_CallMethodId(time, &PyId_time, NULL); + result = _PyObject_CallMethodIdNoArgs(time, &PyId_time); Py_DECREF(time); } return result; @@ -1698,8 +1699,7 @@ build_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag) return NULL; } - result = _PyObject_CallMethodIdObjArgs(time, &PyId_struct_time, - args, NULL); + result = _PyObject_CallMethodIdOneArg(time, &PyId_struct_time, args); Py_DECREF(time); Py_DECREF(args); return result; @@ -1812,7 +1812,7 @@ checked_divmod(PyObject *a, PyObject *b) if (!PyTuple_Check(result)) { PyErr_Format(PyExc_TypeError, "divmod() returned non-tuple (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -1923,7 +1923,7 @@ get_float_as_integer_ratio(PyObject *floatobj) PyObject *ratio; assert(floatobj && PyFloat_Check(floatobj)); - ratio = _PyObject_CallMethodId(floatobj, &PyId_as_integer_ratio, NULL); + ratio = _PyObject_CallMethodIdNoArgs(floatobj, &PyId_as_integer_ratio); if (ratio == NULL) { return NULL; } @@ -2491,7 +2491,6 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw) int x_is_odd; PyObject *temp; - whole_us = round(leftover_us); if (fabs(whole_us - leftover_us) == 0.5) { /* We're exactly halfway between two integers. In order * to do round-half-to-even, we must determine whether x @@ -2899,8 +2898,7 @@ date_today(PyObject *cls, PyObject *dummy) * time.time() delivers; if someone were gonzo about optimization, * date.today() could get away with plain C time(). */ - result = _PyObject_CallMethodIdObjArgs(cls, &PyId_fromtimestamp, - time, NULL); + result = _PyObject_CallMethodIdOneArg(cls, &PyId_fromtimestamp, time); Py_DECREF(time); return result; } @@ -3167,7 +3165,7 @@ date_isoformat(PyDateTime_Date *self, PyObject *Py_UNUSED(ignored)) static PyObject * date_str(PyDateTime_Date *self) { - return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, NULL); + return _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_isoformat); } @@ -3193,7 +3191,7 @@ date_strftime(PyDateTime_Date *self, PyObject *args, PyObject *kw) &format)) return NULL; - tuple = _PyObject_CallMethodId((PyObject *)self, &PyId_timetuple, NULL); + tuple = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_timetuple); if (tuple == NULL) return NULL; result = wrap_strftime((PyObject *)self, format, tuple, @@ -3214,8 +3212,8 @@ date_format(PyDateTime_Date *self, PyObject *args) if (PyUnicode_GetLength(format) == 0) return PyObject_Str((PyObject *)self); - return _PyObject_CallMethodIdObjArgs((PyObject *)self, &PyId_strftime, - format, NULL); + return _PyObject_CallMethodIdOneArg((PyObject *)self, &PyId_strftime, + format); } /* ISO methods. */ @@ -3228,6 +3226,136 @@ date_isoweekday(PyDateTime_Date *self, PyObject *Py_UNUSED(ignored)) return PyLong_FromLong(dow + 1); } +PyDoc_STRVAR(iso_calendar_date__doc__, +"The result of date.isocalendar() or datetime.isocalendar()\n\n\ +This object may be accessed either as a tuple of\n\ + ((year, week, weekday)\n\ +or via the object attributes as named in the above tuple."); + +typedef struct { + PyTupleObject tuple; +} PyDateTime_IsoCalendarDate; + +static PyObject * +iso_calendar_date_repr(PyDateTime_IsoCalendarDate *self) +{ + PyObject* year = PyTuple_GetItem((PyObject *)self, 0); + if (year == NULL) { + return NULL; + } + PyObject* week = PyTuple_GetItem((PyObject *)self, 1); + if (week == NULL) { + return NULL; + } + PyObject* weekday = PyTuple_GetItem((PyObject *)self, 2); + if (weekday == NULL) { + return NULL; + } + + return PyUnicode_FromFormat("%.200s(year=%S, week=%S, weekday=%S)", + Py_TYPE(self)->tp_name, year, week, weekday); +} + +static PyObject * +iso_calendar_date_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + // Construct the tuple that this reduces to + PyObject * reduce_tuple = Py_BuildValue( + "O((OOO))", &PyTuple_Type, + PyTuple_GET_ITEM(self, 0), + PyTuple_GET_ITEM(self, 1), + PyTuple_GET_ITEM(self, 2) + ); + + return reduce_tuple; +} + +static PyObject * +iso_calendar_date_year(PyDateTime_IsoCalendarDate *self, void *unused) +{ + PyObject *year = PyTuple_GetItem((PyObject *)self, 0); + if (year == NULL) { + return NULL; + } + Py_INCREF(year); + return year; +} + +static PyObject * +iso_calendar_date_week(PyDateTime_IsoCalendarDate *self, void *unused) +{ + PyObject *week = PyTuple_GetItem((PyObject *)self, 1); + if (week == NULL) { + return NULL; + } + Py_INCREF(week); + return week; +} + +static PyObject * +iso_calendar_date_weekday(PyDateTime_IsoCalendarDate *self, void *unused) +{ + PyObject *weekday = PyTuple_GetItem((PyObject *)self, 2); + if (weekday == NULL) { + return NULL; + } + Py_INCREF(weekday); + return weekday; +} + +static PyGetSetDef iso_calendar_date_getset[] = { + {"year", (getter)iso_calendar_date_year}, + {"week", (getter)iso_calendar_date_week}, + {"weekday", (getter)iso_calendar_date_weekday}, + {NULL} +}; + +static PyMethodDef iso_calendar_date_methods[] = { + {"__reduce__", (PyCFunction)iso_calendar_date_reduce, METH_NOARGS, + PyDoc_STR("__reduce__() -> (cls, state)")}, + {NULL, NULL}, +}; + +static PyTypeObject PyDateTime_IsoCalendarDateType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "datetime.IsoCalendarDate", + .tp_basicsize = sizeof(PyDateTime_IsoCalendarDate), + .tp_repr = (reprfunc) iso_calendar_date_repr, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_doc = iso_calendar_date__doc__, + .tp_methods = iso_calendar_date_methods, + .tp_getset = iso_calendar_date_getset, + // .tp_base = &PyTuple_Type, // filled in PyInit__datetime + .tp_new = iso_calendar_date_new, +}; + +/*[clinic input] +@classmethod +datetime.IsoCalendarDate.__new__ as iso_calendar_date_new + year: int + week: int + weekday: int +[clinic start generated code]*/ + +static PyObject * +iso_calendar_date_new_impl(PyTypeObject *type, int year, int week, + int weekday) +/*[clinic end generated code: output=383d33d8dc7183a2 input=4f2c663c9d19c4ee]*/ + +{ + PyDateTime_IsoCalendarDate *self; + self = (PyDateTime_IsoCalendarDate *) type->tp_alloc(type, 3); + if (self == NULL) { + return NULL; + } + + PyTuple_SET_ITEM(self, 0, PyLong_FromLong(year)); + PyTuple_SET_ITEM(self, 1, PyLong_FromLong(week)); + PyTuple_SET_ITEM(self, 2, PyLong_FromLong(weekday)); + + return (PyObject *)self; +} + static PyObject * date_isocalendar(PyDateTime_Date *self, PyObject *Py_UNUSED(ignored)) { @@ -3247,7 +3375,13 @@ date_isocalendar(PyDateTime_Date *self, PyObject *Py_UNUSED(ignored)) ++year; week = 0; } - return Py_BuildValue("iii", year, week + 1, day + 1); + + PyObject* v = iso_calendar_date_new_impl(&PyDateTime_IsoCalendarDateType, + year, week + 1, day + 1); + if (v == NULL) { + return NULL; + } + return v; } /* Miscellaneous methods. */ @@ -3386,7 +3520,7 @@ static PyMethodDef date_methods[] = { PyDoc_STR("Return time tuple, compatible with time.localtime().")}, {"isocalendar", (PyCFunction)date_isocalendar, METH_NOARGS, - PyDoc_STR("Return a 3-tuple containing ISO year, week number, and " + PyDoc_STR("Return a named tuple containing ISO year, week number, and " "weekday.")}, {"isoformat", (PyCFunction)date_isoformat, METH_NOARGS, @@ -3614,7 +3748,7 @@ tzinfo_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) return NULL; } if (getinitargs != NULL) { - args = _PyObject_CallNoArg(getinitargs); + args = PyObject_CallNoArgs(getinitargs); Py_DECREF(getinitargs); } else { @@ -3629,7 +3763,7 @@ tzinfo_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) return NULL; } if (getstate != NULL) { - state = _PyObject_CallNoArg(getstate); + state = PyObject_CallNoArgs(getstate); Py_DECREF(getstate); if (state == NULL) { Py_DECREF(args); @@ -3945,7 +4079,7 @@ static PyTypeObject PyDateTime_TimeZoneType = { timezone_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ - &PyDateTime_TZInfoType, /* tp_base */ + 0, /* tp_base; filled in PyInit__datetime */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ @@ -4176,18 +4310,18 @@ time_repr(PyDateTime_Time *self) static PyObject * time_str(PyDateTime_Time *self) { - return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, NULL); + return _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_isoformat); } static PyObject * time_isoformat(PyDateTime_Time *self, PyObject *args, PyObject *kw) { char buf[100]; - char *timespec = NULL; + const char *timespec = NULL; static char *keywords[] = {"timespec", NULL}; PyObject *result; int us = TIME_GET_MICROSECOND(self); - static char *specs[][2] = { + static const char *specs[][2] = { {"hours", "%02d"}, {"minutes", "%02d:%02d"}, {"seconds", "%02d:%02d:%02d"}, @@ -4539,7 +4673,10 @@ static PyMethodDef time_methods[] = { {"isoformat", (PyCFunction)(void(*)(void))time_isoformat, METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Return string in ISO 8601 format, [HH[:MM[:SS[.mmm[uuu]]]]]" "[+HH:MM].\n\n" - "timespec specifies what components of the time to include.\n")}, + "The optional argument timespec specifies the number " + "of additional terms\nof the time to include. Valid " + "options are 'auto', 'hours', 'minutes',\n'seconds', " + "'milliseconds' and 'microseconds'.\n")}, {"strftime", (PyCFunction)(void(*)(void))time_strftime, METH_VARARGS | METH_KEYWORDS, PyDoc_STR("format -> strftime() style string.")}, @@ -5419,7 +5556,7 @@ datetime_isoformat(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) char buffer[100]; PyObject *result = NULL; int us = DATE_GET_MICROSECOND(self); - static char *specs[][2] = { + static const char *specs[][2] = { {"hours", "%04d-%02d-%02d%c%02d"}, {"minutes", "%04d-%02d-%02d%c%02d:%02d"}, {"seconds", "%04d-%02d-%02d%c%02d:%02d:%02d"}, @@ -5961,7 +6098,7 @@ datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) temp = (PyObject *)result; result = (PyDateTime_DateTime *) - _PyObject_CallMethodIdObjArgs(tzinfo, &PyId_fromutc, temp, NULL); + _PyObject_CallMethodIdOneArg(tzinfo, &PyId_fromutc, temp); Py_DECREF(temp); return result; @@ -6246,9 +6383,10 @@ static PyMethodDef datetime_methods[] = { "YYYY-MM-DDT[HH[:MM[:SS[.mmm[uuu]]]]][+HH:MM].\n" "sep is used to separate the year from the time, and " "defaults to 'T'.\n" - "timespec specifies what components of the time to include" - " (allowed values are 'auto', 'hours', 'minutes', 'seconds'," - " 'milliseconds', and 'microseconds').\n")}, + "The optional argument timespec specifies the number " + "of additional terms\nof the time to include. Valid " + "options are 'auto', 'hours', 'minutes',\n'seconds', " + "'milliseconds' and 'microseconds'.\n")}, {"utcoffset", (PyCFunction)datetime_utcoffset, METH_NOARGS, PyDoc_STR("Return self.tzinfo.utcoffset(self).")}, @@ -6324,7 +6462,8 @@ static PyTypeObject PyDateTime_DateTimeType = { datetime_methods, /* tp_methods */ 0, /* tp_members */ datetime_getset, /* tp_getset */ - &PyDateTime_DateType, /* tp_base */ + 0, /* tp_base; filled in + PyInit__datetime */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ @@ -6390,18 +6529,32 @@ PyInit__datetime(void) if (m == NULL) return NULL; - if (PyType_Ready(&PyDateTime_DateType) < 0) - return NULL; - if (PyType_Ready(&PyDateTime_DateTimeType) < 0) - return NULL; - if (PyType_Ready(&PyDateTime_DeltaType) < 0) - return NULL; - if (PyType_Ready(&PyDateTime_TimeType) < 0) - return NULL; - if (PyType_Ready(&PyDateTime_TZInfoType) < 0) - return NULL; - if (PyType_Ready(&PyDateTime_TimeZoneType) < 0) + // `&...` is not a constant expression according to a strict reading + // of C standards. Fill tp_base at run-time rather than statically. + // See https://bugs.python.org/issue40777 + PyDateTime_IsoCalendarDateType.tp_base = &PyTuple_Type; + PyDateTime_TimeZoneType.tp_base = &PyDateTime_TZInfoType; + PyDateTime_DateTimeType.tp_base = &PyDateTime_DateType; + + PyTypeObject *types[] = { + &PyDateTime_DateType, + &PyDateTime_DateTimeType, + &PyDateTime_TimeType, + &PyDateTime_DeltaType, + &PyDateTime_TZInfoType, + &PyDateTime_TimeZoneType, + }; + + for (size_t i = 0; i < Py_ARRAY_LENGTH(types); i++) { + if (PyModule_AddType(m, types[i]) < 0) { + return NULL; + } + } + + if (PyType_Ready(&PyDateTime_IsoCalendarDateType) < 0) { return NULL; + } + Py_INCREF(&PyDateTime_IsoCalendarDateType); /* timedelta values */ d = PyDateTime_DeltaType.tp_dict; @@ -6519,25 +6672,6 @@ PyInit__datetime(void) PyModule_AddIntMacro(m, MINYEAR); PyModule_AddIntMacro(m, MAXYEAR); - Py_INCREF(&PyDateTime_DateType); - PyModule_AddObject(m, "date", (PyObject *) &PyDateTime_DateType); - - Py_INCREF(&PyDateTime_DateTimeType); - PyModule_AddObject(m, "datetime", - (PyObject *)&PyDateTime_DateTimeType); - - Py_INCREF(&PyDateTime_TimeType); - PyModule_AddObject(m, "time", (PyObject *) &PyDateTime_TimeType); - - Py_INCREF(&PyDateTime_DeltaType); - PyModule_AddObject(m, "timedelta", (PyObject *) &PyDateTime_DeltaType); - - Py_INCREF(&PyDateTime_TZInfoType); - PyModule_AddObject(m, "tzinfo", (PyObject *) &PyDateTime_TZInfoType); - - Py_INCREF(&PyDateTime_TimeZoneType); - PyModule_AddObject(m, "timezone", (PyObject *) &PyDateTime_TimeZoneType); - x = PyCapsule_New(&CAPI, PyDateTime_CAPSULE_NAME, NULL); if (x == NULL) return NULL; diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index ea0a9d6f..80a05036 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -45,7 +45,7 @@ typedef struct { static PyTypeObject Dbmtype; -#define is_dbmobject(v) (Py_TYPE(v) == &Dbmtype) +#define is_dbmobject(v) Py_IS_TYPE(v, &Dbmtype) #define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \ { PyErr_SetString(DbmError, "DBM object has already been closed"); \ return NULL; } @@ -255,7 +255,7 @@ dbm_contains(PyObject *self, PyObject *arg) else if (!PyBytes_Check(arg)) { PyErr_Format(PyExc_TypeError, "dbm key must be bytes or string, not %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return -1; } else { @@ -370,7 +370,7 @@ static PyObject * dbm__exit__(PyObject *self, PyObject *args) { _Py_IDENTIFIER(close); - return _PyObject_CallMethodId(self, &PyId_close, NULL); + return _PyObject_CallMethodIdNoArgs(self, &PyId_close); } diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index eb1f1a01..fb4e020f 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -28,8 +28,6 @@ #include #include "longintrepr.h" -#include "pythread.h" -#include "structmember.h" #include "complexobject.h" #include "mpdecimal.h" @@ -38,8 +36,8 @@ #include "docstrings.h" -#if !defined(MPD_VERSION_HEX) || MPD_VERSION_HEX < 0x02040100 - #error "libmpdec version >= 2.4.1 required" +#if !defined(MPD_VERSION_HEX) || MPD_VERSION_HEX < 0x02050000 + #error "libmpdec version >= 2.5.0 required" #endif @@ -58,13 +56,11 @@ #define BOUNDS_CHECK(x, MIN, MAX) x = (x < MIN || MAX < x) ? MAX : x -#ifndef UNUSED #if defined(__GNUC__) && !defined(__INTEL_COMPILER) #define UNUSED __attribute__((unused)) #else #define UNUSED #endif -#endif /* _Py_DEC_MINALLOC >= MPD_MINALLOC */ #define _Py_DEC_MINALLOC 4 @@ -103,9 +99,9 @@ static PyTypeObject PyDec_Type; static PyTypeObject *PyDecSignalDict_Type; static PyTypeObject PyDecContext_Type; static PyTypeObject PyDecContextManager_Type; -#define PyDec_CheckExact(v) (Py_TYPE(v) == &PyDec_Type) +#define PyDec_CheckExact(v) Py_IS_TYPE(v, &PyDec_Type) #define PyDec_Check(v) PyObject_TypeCheck(v, &PyDec_Type) -#define PyDecSignalDict_Check(v) (Py_TYPE(v) == PyDecSignalDict_Type) +#define PyDecSignalDict_Check(v) Py_IS_TYPE(v, PyDecSignalDict_Type) #define PyDecContext_Check(v) PyObject_TypeCheck(v, &PyDecContext_Type) #define MPD(v) (&((PyDecObject *)v)->dec) #define SdFlagAddr(v) (((PyDecSignalDictObject *)v)->flags) @@ -1885,7 +1881,7 @@ dec_dealloc(PyObject *dec) /******************************************************************************/ Py_LOCAL_INLINE(int) -is_space(enum PyUnicode_Kind kind, void *data, Py_ssize_t pos) +is_space(enum PyUnicode_Kind kind, const void *data, Py_ssize_t pos) { Py_UCS4 ch = PyUnicode_READ(kind, data, pos); return Py_UNICODE_ISSPACE(ch); @@ -1903,7 +1899,7 @@ static char * numeric_as_ascii(const PyObject *u, int strip_ws, int ignore_underscores) { enum PyUnicode_Kind kind; - void *data; + const void *data; Py_UCS4 ch; char *res, *cp; Py_ssize_t j, len; @@ -2733,7 +2729,7 @@ PyDecType_FromObjectExact(PyTypeObject *type, PyObject *v, PyObject *context) else { PyErr_Format(PyExc_TypeError, "conversion from %s to Decimal is not supported", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); return NULL; } } @@ -2782,7 +2778,7 @@ PyDec_FromObject(PyObject *v, PyObject *context) else { PyErr_Format(PyExc_TypeError, "conversion from %s to Decimal is not supported", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); return NULL; } } @@ -2845,7 +2841,7 @@ convert_op(int type_err, PyObject **conv, PyObject *v, PyObject *context) if (type_err) { PyErr_Format(PyExc_TypeError, "conversion from %s to Decimal is not supported", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); } else { Py_INCREF(Py_NotImplemented); @@ -3402,9 +3398,9 @@ dec_as_long(PyObject *dec, PyObject *context, int round) i--; } - Py_SIZE(pylong) = i; + Py_SET_SIZE(pylong, i); if (mpd_isnegative(x) && !mpd_iszero(x)) { - Py_SIZE(pylong) = -i; + Py_SET_SIZE(pylong, -i); } mpd_del(x); diff --git a/Modules/_decimal/libmpdec/README.txt b/Modules/_decimal/libmpdec/README.txt index 96b72232..dc97820a 100644 --- a/Modules/_decimal/libmpdec/README.txt +++ b/Modules/_decimal/libmpdec/README.txt @@ -20,7 +20,7 @@ Files required for the Python _decimal module context.c -> Context functions. io.{c,h} -> Conversions between mpd_t and ASCII strings, mpd_t formatting (allows UTF-8 fill character). - memory.{c,h} -> Allocation handlers with overflow detection + mpalloc.{c,h} -> Allocation handlers with overflow detection and functions for switching between static and dynamic mpd_t. mpdecimal.{c,h} -> All (quiet) functions of the specification. @@ -30,7 +30,6 @@ Files required for the Python _decimal module Visual Studio only: ~~~~~~~~~~~~~~~~~~~ vccompat.h -> snprintf <==> sprintf_s and similar things. - vcstdint.h -> stdint.h (included in VS 2010 but not in VS 2008). vcdiv64.asm -> Double word division used in typearith.h. VS 2008 does not allow inline asm for x64. Also, it does not provide an intrinsic for double word division. diff --git a/Modules/_decimal/libmpdec/basearith.c b/Modules/_decimal/libmpdec/basearith.c index dfe15239..85c608fa 100644 --- a/Modules/_decimal/libmpdec/basearith.c +++ b/Modules/_decimal/libmpdec/basearith.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,13 +27,13 @@ #include "mpdecimal.h" -#include -#include -#include + #include +#include + +#include "basearith.h" #include "constants.h" #include "typearith.h" -#include "basearith.h" /*********************************************************************/ @@ -337,6 +337,7 @@ _mpd_basedivmod(mpd_uint_t *q, mpd_uint_t *r, /* D2: loop */ for (j=m; j != MPD_SIZE_MAX; j--) { + assert(2 <= j+n && j+n <= nplusm); /* annotation for scan-build */ /* D3: calculate qhat and rhat */ rhat = _mpd_shortdiv(w2, u+j+n-1, 2, v[n-1]); @@ -652,6 +653,3 @@ _mpd_shortdiv_b(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n, return rem; } - - - diff --git a/Modules/_decimal/libmpdec/basearith.h b/Modules/_decimal/libmpdec/basearith.h index 976358a1..d35925aa 100644 --- a/Modules/_decimal/libmpdec/basearith.h +++ b/Modules/_decimal/libmpdec/basearith.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef BASEARITH_H -#define BASEARITH_H +#ifndef LIBMPDEC_BASEARITH_H_ +#define LIBMPDEC_BASEARITH_H_ #include "mpdecimal.h" -#include #include "typearith.h" @@ -216,7 +215,4 @@ _mpd_isallnine(const mpd_uint_t *data, mpd_ssize_t len) MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif /* BASEARITH_H */ - - - +#endif /* LIBMPDEC_BASEARITH_H_ */ diff --git a/Modules/_decimal/libmpdec/bits.h b/Modules/_decimal/libmpdec/bits.h index b5eaa249..aa9c3e77 100644 --- a/Modules/_decimal/libmpdec/bits.h +++ b/Modules/_decimal/libmpdec/bits.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef BITS_H -#define BITS_H +#ifndef LIBMPDEC_BITS_H_ +#define LIBMPDEC_BITS_H_ #include "mpdecimal.h" -#include /* Check if n is a power of 2. */ @@ -186,7 +185,4 @@ mpd_bsf(mpd_size_t a) #endif /* BSR/BSF */ -#endif /* BITS_H */ - - - +#endif /* LIBMPDEC_BITS_H_ */ diff --git a/Modules/_decimal/libmpdec/constants.c b/Modules/_decimal/libmpdec/constants.c index 2c2d5ea4..4c4de622 100644 --- a/Modules/_decimal/libmpdec/constants.c +++ b/Modules/_decimal/libmpdec/constants.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,7 +27,6 @@ #include "mpdecimal.h" -#include #include "constants.h" @@ -128,5 +127,3 @@ const char *mpd_clamp_string[MPD_CLAMP_GUARD] = { "CLAMP_DEFAULT", "CLAMP_IEEE_754" }; - - diff --git a/Modules/_decimal/libmpdec/constants.h b/Modules/_decimal/libmpdec/constants.h index c0febfc8..7c1db839 100644 --- a/Modules/_decimal/libmpdec/constants.h +++ b/Modules/_decimal/libmpdec/constants.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,14 @@ */ -#ifndef CONSTANTS_H -#define CONSTANTS_H +#ifndef LIBMPDEC_CONSTANTS_H_ +#define LIBMPDEC_CONSTANTS_H_ #include "mpdecimal.h" +#include + /* Internal header file: all symbols have local scope in the DSO */ MPD_PRAGMA(MPD_HIDE_SYMBOLS_START) @@ -84,7 +86,4 @@ extern const mpd_uint_t UH_P1P2; MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif /* CONSTANTS_H */ - - - +#endif /* LIBMPDEC_CONSTANTS_H_ */ diff --git a/Modules/_decimal/libmpdec/context.c b/Modules/_decimal/libmpdec/context.c index 24c7b890..9cbc2050 100644 --- a/Modules/_decimal/libmpdec/context.c +++ b/Modules/_decimal/libmpdec/context.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,14 +27,16 @@ #include "mpdecimal.h" + +#include #include #include -#include void -mpd_dflt_traphandler(mpd_context_t *ctx UNUSED) +mpd_dflt_traphandler(mpd_context_t *ctx) { + (void)ctx; raise(SIGFPE); } @@ -282,5 +284,3 @@ mpd_addstatus_raise(mpd_context_t *ctx, uint32_t flags) mpd_traphandler(ctx); } } - - diff --git a/Modules/_decimal/libmpdec/convolute.c b/Modules/_decimal/libmpdec/convolute.c index 4c62e8bd..4bc8e8b5 100644 --- a/Modules/_decimal/libmpdec/convolute.c +++ b/Modules/_decimal/libmpdec/convolute.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,15 +27,14 @@ #include "mpdecimal.h" -#include #include "bits.h" #include "constants.h" +#include "convolute.h" #include "fnt.h" #include "fourstep.h" #include "numbertheory.h" #include "sixstep.h" #include "umodarith.h" -#include "convolute.h" /* Bignum: Fast convolution using the Number Theoretic Transform. Used for @@ -170,5 +169,3 @@ fnt_autoconvolute(mpd_uint_t *c1, mpd_size_t n, int modnum) return 1; } - - diff --git a/Modules/_decimal/libmpdec/convolute.h b/Modules/_decimal/libmpdec/convolute.h index f30a177a..62edb3e4 100644 --- a/Modules/_decimal/libmpdec/convolute.h +++ b/Modules/_decimal/libmpdec/convolute.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef CONVOLUTE_H -#define CONVOLUTE_H +#ifndef LIBMPDEC_CONVOLUTE_H_ +#define LIBMPDEC_CONVOLUTE_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -47,4 +46,4 @@ int fnt_autoconvolute(mpd_uint_t *c1, mpd_size_t n, int modnum); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_CONVOLUTE_H_ */ diff --git a/Modules/_decimal/libmpdec/crt.c b/Modules/_decimal/libmpdec/crt.c index 4a1e80a2..613274ee 100644 --- a/Modules/_decimal/libmpdec/crt.c +++ b/Modules/_decimal/libmpdec/crt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,11 +27,14 @@ #include "mpdecimal.h" -#include + #include + +#include "constants.h" +#include "crt.h" #include "numbertheory.h" #include "umodarith.h" -#include "crt.h" +#include "typearith.h" /* Bignum: Chinese Remainder Theorem, extends the maximum transform length. */ @@ -175,5 +178,3 @@ crt3(mpd_uint_t *x1, mpd_uint_t *x2, mpd_uint_t *x3, mpd_size_t rsize) assert(carry[0] == 0 && carry[1] == 0 && carry[2] == 0); } - - diff --git a/Modules/_decimal/libmpdec/crt.h b/Modules/_decimal/libmpdec/crt.h index f61e7729..15a347d4 100644 --- a/Modules/_decimal/libmpdec/crt.h +++ b/Modules/_decimal/libmpdec/crt.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef CRT_H -#define CRT_H +#ifndef LIBMPDEC_CRT_H_ +#define LIBMPDEC_CRT_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -44,4 +43,4 @@ void crt3(mpd_uint_t *x1, mpd_uint_t *x2, mpd_uint_t *x3, mpd_size_t nmemb); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_CRT_H_ */ diff --git a/Modules/_decimal/libmpdec/difradix2.c b/Modules/_decimal/libmpdec/difradix2.c index 06e5ab5e..049ecff6 100644 --- a/Modules/_decimal/libmpdec/difradix2.c +++ b/Modules/_decimal/libmpdec/difradix2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,12 +27,14 @@ #include "mpdecimal.h" -#include + #include + #include "bits.h" +#include "constants.h" +#include "difradix2.h" #include "numbertheory.h" #include "umodarith.h" -#include "difradix2.h" /* Bignum: The actual transform routine (decimation in frequency). */ @@ -169,5 +171,3 @@ fnt_dif2(mpd_uint_t a[], mpd_size_t n, struct fnt_params *tparams) bitreverse_permute(a, n); } - - diff --git a/Modules/_decimal/libmpdec/difradix2.h b/Modules/_decimal/libmpdec/difradix2.h index 5e22bcf3..cdcbcf9a 100644 --- a/Modules/_decimal/libmpdec/difradix2.h +++ b/Modules/_decimal/libmpdec/difradix2.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef DIF_RADIX2_H -#define DIF_RADIX2_H +#ifndef LIBMPDEC_DIFRADIX2_H_ +#define LIBMPDEC_DIFRADIX2_H_ #include "mpdecimal.h" -#include #include "numbertheory.h" @@ -45,4 +44,4 @@ void fnt_dif2(mpd_uint_t a[], mpd_size_t n, struct fnt_params *tparams); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_DIFRADIX2_H_ */ diff --git a/Modules/_decimal/libmpdec/fnt.c b/Modules/_decimal/libmpdec/fnt.c index 7e924c85..0dbe98fc 100644 --- a/Modules/_decimal/libmpdec/fnt.c +++ b/Modules/_decimal/libmpdec/fnt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,13 +27,14 @@ #include "mpdecimal.h" -#include -#include + #include +#include + #include "bits.h" #include "difradix2.h" -#include "numbertheory.h" #include "fnt.h" +#include "numbertheory.h" /* Bignum: Fast transform for medium-sized coefficients. */ @@ -76,6 +77,3 @@ std_inv_fnt(mpd_uint_t *a, mpd_size_t n, int modnum) mpd_free(tparams); return 1; } - - - diff --git a/Modules/_decimal/libmpdec/fnt.h b/Modules/_decimal/libmpdec/fnt.h index fa2154a7..5222c476 100644 --- a/Modules/_decimal/libmpdec/fnt.h +++ b/Modules/_decimal/libmpdec/fnt.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef FNT_H -#define FNT_H +#ifndef LIBMPDEC_FNT_H_ +#define LIBMPDEC_FNT_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -45,5 +44,4 @@ int std_inv_fnt(mpd_uint_t a[], mpd_size_t n, int modnum); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif - +#endif /* LIBMPDEC_FNT_H_ */ diff --git a/Modules/_decimal/libmpdec/fourstep.c b/Modules/_decimal/libmpdec/fourstep.c index 21d3e748..fb173ed5 100644 --- a/Modules/_decimal/libmpdec/fourstep.c +++ b/Modules/_decimal/libmpdec/fourstep.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,12 +27,14 @@ #include "mpdecimal.h" + #include + +#include "constants.h" +#include "fourstep.h" #include "numbertheory.h" #include "sixstep.h" -#include "transpose.h" #include "umodarith.h" -#include "fourstep.h" /* Bignum: Cache efficient Matrix Fourier Transform for arrays of the @@ -187,6 +189,7 @@ four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum) #if 0 /* An unordered transform is sufficient for convolution. */ /* Transpose the matrix. */ + #include "transpose.h" transpose_3xpow2(a, R, C); #endif @@ -217,6 +220,7 @@ inv_four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum) #if 0 /* An unordered transform is sufficient for convolution. */ /* Transpose the matrix, producing an R*C matrix. */ + #include "transpose.h" transpose_3xpow2(a, C, R); #endif @@ -253,5 +257,3 @@ inv_four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum) return 1; } - - diff --git a/Modules/_decimal/libmpdec/fourstep.h b/Modules/_decimal/libmpdec/fourstep.h index 80dcd4be..5ffb6fcc 100644 --- a/Modules/_decimal/libmpdec/fourstep.h +++ b/Modules/_decimal/libmpdec/fourstep.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef FOUR_STEP_H -#define FOUR_STEP_H +#ifndef LIBMPDEC_FOURSTEP_H_ +#define LIBMPDEC_FOURSTEP_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -45,4 +44,4 @@ int inv_four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_FOURSTEP_H_ */ diff --git a/Modules/_decimal/libmpdec/io.c b/Modules/_decimal/libmpdec/io.c index f45e558f..9513a68e 100644 --- a/Modules/_decimal/libmpdec/io.c +++ b/Modules/_decimal/libmpdec/io.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,16 +27,16 @@ #include "mpdecimal.h" -#include -#include -#include -#include -#include + #include +#include #include +#include #include -#include "bits.h" -#include "constants.h" +#include +#include +#include + #include "typearith.h" #include "io.h" @@ -277,7 +277,7 @@ mpd_qset_string(mpd_t *dec, const char *s, const mpd_context_t *ctx, } } - digits = end - coeff; + digits = end - coeff; if (dpoint) { size_t fracdigits = end-dpoint-1; if (dpoint > coeff) digits--; @@ -326,6 +326,22 @@ conversion_error: mpd_seterror(dec, MPD_Conversion_syntax, status); } +/* convert a character string to a decimal, use a maxcontext for conversion */ +void +mpd_qset_string_exact(mpd_t *dec, const char *s, uint32_t *status) +{ + mpd_context_t maxcontext; + + mpd_maxcontext(&maxcontext); + mpd_qset_string(dec, s, &maxcontext, status); + + if (*status & (MPD_Inexact|MPD_Rounded|MPD_Clamped)) { + /* we want exact results */ + mpd_seterror(dec, MPD_Invalid_operation, status); + } + *status &= MPD_Errors; +} + /* Print word x with n decimal digits to string s. dot is either NULL or the location of a decimal point. */ #define EXTRACT_DIGIT(s, x, d, dot) \ @@ -539,8 +555,8 @@ _mpd_to_string(char **result, const mpd_t *dec, int flags, mpd_ssize_t dplace) dplace = -1 + mod_mpd_ssize_t(dec->exp+2, 3); } else { /* ldigits-1 is the adjusted exponent, which - * should be divisible by three. If not, move - * dplace one or two places to the right. */ + * should be divisible by three. If not, move + * dplace one or two places to the right. */ dplace += mod_mpd_ssize_t(ldigits-1, 3); } } @@ -1247,7 +1263,7 @@ mpd_qformat_spec(const mpd_t *dec, const mpd_spec_t *spec, } if (isupper((uchar)type)) { - type = tolower((uchar)type); + type = (char)tolower((uchar)type); flags |= MPD_FMT_UPPER; } if (spec->sign == ' ') { @@ -1265,6 +1281,7 @@ mpd_qformat_spec(const mpd_t *dec, const mpd_spec_t *spec, stackspec.align = '>'; spec = &stackspec; } + assert(strlen(spec->fill) == 1); /* annotation for scan-build */ if (type == '%') { flags |= MPD_FMT_PERCENT; } @@ -1579,5 +1596,3 @@ mpd_print(const mpd_t *dec) fputs("mpd_fprint: output error\n", stderr); /* GCOV_NOT_REACHED */ } } - - diff --git a/Modules/_decimal/libmpdec/io.h b/Modules/_decimal/libmpdec/io.h index de5486a0..79d7c05c 100644 --- a/Modules/_decimal/libmpdec/io.h +++ b/Modules/_decimal/libmpdec/io.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,17 +26,20 @@ */ -#ifndef IO_H -#define IO_H +#ifndef LIBMPDEC_IO_H_ +#define LIBMPDEC_IO_H_ -#include #include "mpdecimal.h" +#include + #if SIZE_MAX == MPD_SIZE_MAX #define mpd_strtossize _mpd_strtossize #else +#include + static inline mpd_ssize_t mpd_strtossize(const char *s, char **end, int base) { @@ -56,4 +59,4 @@ mpd_strtossize(const char *s, char **end, int base) #endif -#endif +#endif /* LIBMPDEC_IO_H_ */ diff --git a/Modules/_decimal/libmpdec/literature/fnt.py b/Modules/_decimal/libmpdec/literature/fnt.py index 6363536d..c1285a56 100644 --- a/Modules/_decimal/libmpdec/literature/fnt.py +++ b/Modules/_decimal/libmpdec/literature/fnt.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008-2016 Stefan Krah. All rights reserved. +# Copyright (c) 2008-2020 Stefan Krah. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/Modules/_decimal/libmpdec/literature/matrix-transform.txt b/Modules/_decimal/libmpdec/literature/matrix-transform.txt index 701d85d6..6e7ad742 100644 --- a/Modules/_decimal/libmpdec/literature/matrix-transform.txt +++ b/Modules/_decimal/libmpdec/literature/matrix-transform.txt @@ -1,6 +1,6 @@ -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) +(* Copyright (c) 2011-2020 Stefan Krah. All rights reserved. *) The Matrix Fourier Transform: diff --git a/Modules/_decimal/libmpdec/literature/mulmod-64.txt b/Modules/_decimal/libmpdec/literature/mulmod-64.txt index 029b8de3..fa967bf9 100644 --- a/Modules/_decimal/libmpdec/literature/mulmod-64.txt +++ b/Modules/_decimal/libmpdec/literature/mulmod-64.txt @@ -1,6 +1,6 @@ -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) +(* Copyright (c) 2011-2020 Stefan Krah. All rights reserved. *) ========================================================================== diff --git a/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt b/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt index 4d17a928..ba804e4b 100644 --- a/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt +++ b/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt @@ -1,6 +1,6 @@ -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) +(* Copyright (c) 2011-2020 Stefan Krah. All rights reserved. *) ======================================================================== diff --git a/Modules/_decimal/libmpdec/literature/six-step.txt b/Modules/_decimal/libmpdec/literature/six-step.txt index 8e45f487..852d5b0d 100644 --- a/Modules/_decimal/libmpdec/literature/six-step.txt +++ b/Modules/_decimal/libmpdec/literature/six-step.txt @@ -1,6 +1,6 @@ -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) +(* Copyright (c) 2011-2020 Stefan Krah. All rights reserved. *) The Six Step Transform: diff --git a/Modules/_decimal/libmpdec/literature/umodarith.lisp b/Modules/_decimal/libmpdec/literature/umodarith.lisp index 99d71c37..d71f074a 100644 --- a/Modules/_decimal/libmpdec/literature/umodarith.lisp +++ b/Modules/_decimal/libmpdec/literature/umodarith.lisp @@ -1,5 +1,5 @@ ; -; Copyright (c) 2008-2016 Stefan Krah. All rights reserved. +; Copyright (c) 2008-2020 Stefan Krah. All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions @@ -149,7 +149,7 @@ (defthmd addmod-correct (implies (and (< 0 m) (< m base) - (< a m) (<= b m) + (< a m) (<= b m) (natp m) (natp base) (natp a) (natp b)) (equal (addmod a b m base) @@ -179,7 +179,7 @@ (defthmd submod-correct (implies (and (< 0 m) (< m base) - (< a m) (<= b m) + (< a m) (<= b m) (natp m) (natp base) (natp a) (natp b)) (equal (submod a b m base) @@ -200,7 +200,7 @@ (defthm submod-2-correct (implies (and (< 0 m) (< m base) - (< a m) (<= b m) + (< a m) (<= b m) (natp m) (natp base) (natp a) (natp b)) (equal (submod-2 a b m base) @@ -231,7 +231,7 @@ (defthmd ext-submod-ext-submod-2-equal (implies (and (< 0 m) (< m base) - (< a (* 2 m)) (< b (* 2 m)) + (< a (* 2 m)) (< b (* 2 m)) (natp m) (natp base) (natp a) (natp b)) (equal (ext-submod a b m base) @@ -239,7 +239,7 @@ (defthmd ext-submod-2-correct (implies (and (< 0 m) (< m base) - (< a (* 2 m)) (< b (* 2 m)) + (< a (* 2 m)) (< b (* 2 m)) (natp m) (natp base) (natp a) (natp b)) (equal (ext-submod-2 a b m base) @@ -257,7 +257,7 @@ (defthmd dw-reduce-correct (implies (and (< 0 m) (< m base) - (< hi base) (< lo base) + (< hi base) (< lo base) (natp m) (natp base) (natp hi) (natp lo)) (equal (dw-reduce hi lo m base) @@ -322,7 +322,7 @@ (defthmd dw-submod-correct (implies (and (< 0 m) (< m base) (natp a) (< a m) - (< hi base) (< lo base) + (< hi base) (< lo base) (natp m) (natp base) (natp hi) (natp lo)) (equal (dw-submod a hi lo m base) diff --git a/Modules/_decimal/libmpdec/memory.c b/Modules/_decimal/libmpdec/memory.c deleted file mode 100644 index a854e099..00000000 --- a/Modules/_decimal/libmpdec/memory.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - - -#include "mpdecimal.h" -#include -#include -#include "typearith.h" -#include "mpalloc.h" - - -#if defined(_MSC_VER) - #pragma warning(disable : 4232) -#endif - - -/* Guaranteed minimum allocation for a coefficient. May be changed once - at program start using mpd_setminalloc(). */ -mpd_ssize_t MPD_MINALLOC = MPD_MINALLOC_MIN; - -/* Custom allocation and free functions */ -void *(* mpd_mallocfunc)(size_t size) = malloc; -void *(* mpd_reallocfunc)(void *ptr, size_t size) = realloc; -void *(* mpd_callocfunc)(size_t nmemb, size_t size) = calloc; -void (* mpd_free)(void *ptr) = free; - - -/* emulate calloc if it is not available */ -void * -mpd_callocfunc_em(size_t nmemb, size_t size) -{ - void *ptr; - size_t req; - mpd_size_t overflow; - -#if MPD_SIZE_MAX < SIZE_MAX - /* full_coverage test only */ - if (nmemb > MPD_SIZE_MAX || size > MPD_SIZE_MAX) { - return NULL; - } -#endif - - req = mul_size_t_overflow((mpd_size_t)nmemb, (mpd_size_t)size, - &overflow); - if (overflow) { - return NULL; - } - - ptr = mpd_mallocfunc(req); - if (ptr == NULL) { - return NULL; - } - /* used on uint32_t or uint64_t */ - memset(ptr, 0, req); - - return ptr; -} - - -/* malloc with overflow checking */ -void * -mpd_alloc(mpd_size_t nmemb, mpd_size_t size) -{ - mpd_size_t req, overflow; - - req = mul_size_t_overflow(nmemb, size, &overflow); - if (overflow) { - return NULL; - } - - return mpd_mallocfunc(req); -} - -/* calloc with overflow checking */ -void * -mpd_calloc(mpd_size_t nmemb, mpd_size_t size) -{ - mpd_size_t overflow; - - (void)mul_size_t_overflow(nmemb, size, &overflow); - if (overflow) { - return NULL; - } - - return mpd_callocfunc(nmemb, size); -} - -/* realloc with overflow checking */ -void * -mpd_realloc(void *ptr, mpd_size_t nmemb, mpd_size_t size, uint8_t *err) -{ - void *new; - mpd_size_t req, overflow; - - req = mul_size_t_overflow(nmemb, size, &overflow); - if (overflow) { - *err = 1; - return ptr; - } - - new = mpd_reallocfunc(ptr, req); - if (new == NULL) { - *err = 1; - return ptr; - } - - return new; -} - -/* struct hack malloc with overflow checking */ -void * -mpd_sh_alloc(mpd_size_t struct_size, mpd_size_t nmemb, mpd_size_t size) -{ - mpd_size_t req, overflow; - - req = mul_size_t_overflow(nmemb, size, &overflow); - if (overflow) { - return NULL; - } - - req = add_size_t_overflow(req, struct_size, &overflow); - if (overflow) { - return NULL; - } - - return mpd_mallocfunc(req); -} - - -/* Allocate a new decimal with a coefficient of length 'nwords'. In case - of an error the return value is NULL. */ -mpd_t * -mpd_qnew_size(mpd_ssize_t nwords) -{ - mpd_t *result; - - nwords = (nwords < MPD_MINALLOC) ? MPD_MINALLOC : nwords; - - result = mpd_alloc(1, sizeof *result); - if (result == NULL) { - return NULL; - } - - result->data = mpd_alloc(nwords, sizeof *result->data); - if (result->data == NULL) { - mpd_free(result); - return NULL; - } - - result->flags = 0; - result->exp = 0; - result->digits = 0; - result->len = 0; - result->alloc = nwords; - - return result; -} - -/* Allocate a new decimal with a coefficient of length MPD_MINALLOC. - In case of an error the return value is NULL. */ -mpd_t * -mpd_qnew(void) -{ - return mpd_qnew_size(MPD_MINALLOC); -} - -/* Allocate new decimal. Caller can check for NULL or MPD_Malloc_error. - Raises on error. */ -mpd_t * -mpd_new(mpd_context_t *ctx) -{ - mpd_t *result; - - result = mpd_qnew(); - if (result == NULL) { - mpd_addstatus_raise(ctx, MPD_Malloc_error); - } - return result; -} - -/* - * Input: 'result' is a static mpd_t with a static coefficient. - * Assumption: 'nwords' >= result->alloc. - * - * Resize the static coefficient to a larger dynamic one and copy the - * existing data. If successful, the value of 'result' is unchanged. - * Otherwise, set 'result' to NaN and update 'status' with MPD_Malloc_error. - */ -int -mpd_switch_to_dyn(mpd_t *result, mpd_ssize_t nwords, uint32_t *status) -{ - mpd_uint_t *p = result->data; - - assert(nwords >= result->alloc); - - result->data = mpd_alloc(nwords, sizeof *result->data); - if (result->data == NULL) { - result->data = p; - mpd_set_qnan(result); - mpd_set_positive(result); - result->exp = result->digits = result->len = 0; - *status |= MPD_Malloc_error; - return 0; - } - - memcpy(result->data, p, result->alloc * (sizeof *result->data)); - result->alloc = nwords; - mpd_set_dynamic_data(result); - return 1; -} - -/* - * Input: 'result' is a static mpd_t with a static coefficient. - * - * Convert the coefficient to a dynamic one that is initialized to zero. If - * malloc fails, set 'result' to NaN and update 'status' with MPD_Malloc_error. - */ -int -mpd_switch_to_dyn_zero(mpd_t *result, mpd_ssize_t nwords, uint32_t *status) -{ - mpd_uint_t *p = result->data; - - result->data = mpd_calloc(nwords, sizeof *result->data); - if (result->data == NULL) { - result->data = p; - mpd_set_qnan(result); - mpd_set_positive(result); - result->exp = result->digits = result->len = 0; - *status |= MPD_Malloc_error; - return 0; - } - - result->alloc = nwords; - mpd_set_dynamic_data(result); - - return 1; -} - -/* - * Input: 'result' is a static or a dynamic mpd_t with a dynamic coefficient. - * Resize the coefficient to length 'nwords': - * Case nwords > result->alloc: - * If realloc is successful: - * 'result' has a larger coefficient but the same value. Return 1. - * Otherwise: - * Set 'result' to NaN, update status with MPD_Malloc_error and return 0. - * Case nwords < result->alloc: - * If realloc is successful: - * 'result' has a smaller coefficient. result->len is undefined. Return 1. - * Otherwise (unlikely): - * 'result' is unchanged. Reuse the now oversized coefficient. Return 1. - */ -int -mpd_realloc_dyn(mpd_t *result, mpd_ssize_t nwords, uint32_t *status) -{ - uint8_t err = 0; - - result->data = mpd_realloc(result->data, nwords, sizeof *result->data, &err); - if (!err) { - result->alloc = nwords; - } - else if (nwords > result->alloc) { - mpd_set_qnan(result); - mpd_set_positive(result); - result->exp = result->digits = result->len = 0; - *status |= MPD_Malloc_error; - return 0; - } - - return 1; -} - - diff --git a/Modules/_decimal/libmpdec/mpalloc.c b/Modules/_decimal/libmpdec/mpalloc.c new file mode 100644 index 00000000..eb5ee7a8 --- /dev/null +++ b/Modules/_decimal/libmpdec/mpalloc.c @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + + +#include "mpdecimal.h" + +#include +#include +#include +#include + +#include "mpalloc.h" +#include "typearith.h" + + +#if defined(_MSC_VER) + #pragma warning(disable : 4232) +#endif + + +/* Guaranteed minimum allocation for a coefficient. May be changed once + at program start using mpd_setminalloc(). */ +mpd_ssize_t MPD_MINALLOC = MPD_MINALLOC_MIN; + +/* Custom allocation and free functions */ +void *(* mpd_mallocfunc)(size_t size) = malloc; +void *(* mpd_reallocfunc)(void *ptr, size_t size) = realloc; +void *(* mpd_callocfunc)(size_t nmemb, size_t size) = calloc; +void (* mpd_free)(void *ptr) = free; + + +/* emulate calloc if it is not available */ +void * +mpd_callocfunc_em(size_t nmemb, size_t size) +{ + void *ptr; + size_t req; + mpd_size_t overflow; + +#if MPD_SIZE_MAX < SIZE_MAX + /* full_coverage test only */ + if (nmemb > MPD_SIZE_MAX || size > MPD_SIZE_MAX) { + return NULL; + } +#endif + + req = mul_size_t_overflow((mpd_size_t)nmemb, (mpd_size_t)size, + &overflow); + if (overflow) { + return NULL; + } + + ptr = mpd_mallocfunc(req); + if (ptr == NULL) { + return NULL; + } + /* used on uint32_t or uint64_t */ + memset(ptr, 0, req); + + return ptr; +} + + +/* malloc with overflow checking */ +void * +mpd_alloc(mpd_size_t nmemb, mpd_size_t size) +{ + mpd_size_t req, overflow; + + req = mul_size_t_overflow(nmemb, size, &overflow); + if (overflow) { + return NULL; + } + + return mpd_mallocfunc(req); +} + +/* calloc with overflow checking */ +void * +mpd_calloc(mpd_size_t nmemb, mpd_size_t size) +{ + mpd_size_t overflow; + + (void)mul_size_t_overflow(nmemb, size, &overflow); + if (overflow) { + return NULL; + } + + return mpd_callocfunc(nmemb, size); +} + +/* realloc with overflow checking */ +void * +mpd_realloc(void *ptr, mpd_size_t nmemb, mpd_size_t size, uint8_t *err) +{ + void *new; + mpd_size_t req, overflow; + + req = mul_size_t_overflow(nmemb, size, &overflow); + if (overflow) { + *err = 1; + return ptr; + } + + new = mpd_reallocfunc(ptr, req); + if (new == NULL) { + *err = 1; + return ptr; + } + + return new; +} + +/* struct hack malloc with overflow checking */ +void * +mpd_sh_alloc(mpd_size_t struct_size, mpd_size_t nmemb, mpd_size_t size) +{ + mpd_size_t req, overflow; + + req = mul_size_t_overflow(nmemb, size, &overflow); + if (overflow) { + return NULL; + } + + req = add_size_t_overflow(req, struct_size, &overflow); + if (overflow) { + return NULL; + } + + return mpd_mallocfunc(req); +} + + +/* Allocate a new decimal with a coefficient of length 'nwords'. In case + of an error the return value is NULL. */ +mpd_t * +mpd_qnew_size(mpd_ssize_t nwords) +{ + mpd_t *result; + + nwords = (nwords < MPD_MINALLOC) ? MPD_MINALLOC : nwords; + + result = mpd_alloc(1, sizeof *result); + if (result == NULL) { + return NULL; + } + + result->data = mpd_alloc(nwords, sizeof *result->data); + if (result->data == NULL) { + mpd_free(result); + return NULL; + } + + result->flags = 0; + result->exp = 0; + result->digits = 0; + result->len = 0; + result->alloc = nwords; + + return result; +} + +/* Allocate a new decimal with a coefficient of length MPD_MINALLOC. + In case of an error the return value is NULL. */ +mpd_t * +mpd_qnew(void) +{ + return mpd_qnew_size(MPD_MINALLOC); +} + +/* Allocate new decimal. Caller can check for NULL or MPD_Malloc_error. + Raises on error. */ +mpd_t * +mpd_new(mpd_context_t *ctx) +{ + mpd_t *result; + + result = mpd_qnew(); + if (result == NULL) { + mpd_addstatus_raise(ctx, MPD_Malloc_error); + } + return result; +} + +/* + * Input: 'result' is a static mpd_t with a static coefficient. + * Assumption: 'nwords' >= result->alloc. + * + * Resize the static coefficient to a larger dynamic one and copy the + * existing data. If successful, the value of 'result' is unchanged. + * Otherwise, set 'result' to NaN and update 'status' with MPD_Malloc_error. + */ +int +mpd_switch_to_dyn(mpd_t *result, mpd_ssize_t nwords, uint32_t *status) +{ + mpd_uint_t *p = result->data; + + assert(nwords >= result->alloc); + + result->data = mpd_alloc(nwords, sizeof *result->data); + if (result->data == NULL) { + result->data = p; + mpd_set_qnan(result); + mpd_set_positive(result); + result->exp = result->digits = result->len = 0; + *status |= MPD_Malloc_error; + return 0; + } + + memcpy(result->data, p, result->alloc * (sizeof *result->data)); + result->alloc = nwords; + mpd_set_dynamic_data(result); + return 1; +} + +/* + * Input: 'result' is a static mpd_t with a static coefficient. + * + * Convert the coefficient to a dynamic one that is initialized to zero. If + * malloc fails, set 'result' to NaN and update 'status' with MPD_Malloc_error. + */ +int +mpd_switch_to_dyn_zero(mpd_t *result, mpd_ssize_t nwords, uint32_t *status) +{ + mpd_uint_t *p = result->data; + + result->data = mpd_calloc(nwords, sizeof *result->data); + if (result->data == NULL) { + result->data = p; + mpd_set_qnan(result); + mpd_set_positive(result); + result->exp = result->digits = result->len = 0; + *status |= MPD_Malloc_error; + return 0; + } + + result->alloc = nwords; + mpd_set_dynamic_data(result); + + return 1; +} + +/* + * Input: 'result' is a static or a dynamic mpd_t with a dynamic coefficient. + * Resize the coefficient to length 'nwords': + * Case nwords > result->alloc: + * If realloc is successful: + * 'result' has a larger coefficient but the same value. Return 1. + * Otherwise: + * Set 'result' to NaN, update status with MPD_Malloc_error and return 0. + * Case nwords < result->alloc: + * If realloc is successful: + * 'result' has a smaller coefficient. result->len is undefined. Return 1. + * Otherwise (unlikely): + * 'result' is unchanged. Reuse the now oversized coefficient. Return 1. + */ +int +mpd_realloc_dyn(mpd_t *result, mpd_ssize_t nwords, uint32_t *status) +{ + uint8_t err = 0; + + result->data = mpd_realloc(result->data, nwords, sizeof *result->data, &err); + if (!err) { + result->alloc = nwords; + } + else if (nwords > result->alloc) { + mpd_set_qnan(result); + mpd_set_positive(result); + result->exp = result->digits = result->len = 0; + *status |= MPD_Malloc_error; + return 0; + } + + return 1; +} + +/* + * Input: 'result' is a static mpd_t with a static coefficient. + * Assumption: 'nwords' >= result->alloc. + * + * Resize the static coefficient to a larger dynamic one and copy the + * existing data. + * + * On failure the value of 'result' is unchanged. + */ +int +mpd_switch_to_dyn_cxx(mpd_t *result, mpd_ssize_t nwords) +{ + assert(nwords >= result->alloc); + + mpd_uint_t *data = mpd_alloc(nwords, sizeof *result->data); + if (data == NULL) { + return 0; + } + + memcpy(data, result->data, result->alloc * (sizeof *result->data)); + result->data = data; + result->alloc = nwords; + mpd_set_dynamic_data(result); + return 1; +} + +/* + * Input: 'result' is a static or a dynamic mpd_t with a dynamic coefficient. + * Resize the coefficient to length 'nwords': + * Case nwords > result->alloc: + * If realloc is successful: + * 'result' has a larger coefficient but the same value. Return 1. + * Otherwise: + * 'result' has a the same coefficient. Return 0. + * Case nwords < result->alloc: + * If realloc is successful: + * 'result' has a smaller coefficient. result->len is undefined. Return 1. + * Otherwise (unlikely): + * 'result' is unchanged. Reuse the now oversized coefficient. Return 1. + */ +int +mpd_realloc_dyn_cxx(mpd_t *result, mpd_ssize_t nwords) +{ + uint8_t err = 0; + + mpd_uint_t *p = mpd_realloc(result->data, nwords, sizeof *result->data, &err); + if (!err) { + result->data = p; + result->alloc = nwords; + } + else if (nwords > result->alloc) { + return 0; + } + + return 1; +} diff --git a/Modules/_decimal/libmpdec/mpalloc.h b/Modules/_decimal/libmpdec/mpalloc.h index efd71195..18680845 100644 --- a/Modules/_decimal/libmpdec/mpalloc.h +++ b/Modules/_decimal/libmpdec/mpalloc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,14 @@ */ -#ifndef MPALLOC_H -#define MPALLOC_H +#ifndef LIBMPDEC_MPALLOC_H_ +#define LIBMPDEC_MPALLOC_H_ #include "mpdecimal.h" +#include + /* Internal header file: all symbols have local scope in the DSO */ MPD_PRAGMA(MPD_HIDE_SYMBOLS_START) @@ -41,11 +43,11 @@ int mpd_switch_to_dyn(mpd_t *result, mpd_ssize_t size, uint32_t *status); int mpd_switch_to_dyn_zero(mpd_t *result, mpd_ssize_t size, uint32_t *status); int mpd_realloc_dyn(mpd_t *result, mpd_ssize_t size, uint32_t *status); - -MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ +int mpd_switch_to_dyn_cxx(mpd_t *result, mpd_ssize_t size); +int mpd_realloc_dyn_cxx(mpd_t *result, mpd_ssize_t size); -#endif - +MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ +#endif /* LIBMPDEC_MPALLOC_H_ */ diff --git a/Modules/_decimal/libmpdec/mpdecimal.c b/Modules/_decimal/libmpdec/mpdecimal.c index bfa8bb34..28b639cc 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.c +++ b/Modules/_decimal/libmpdec/mpdecimal.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,18 +27,21 @@ #include "mpdecimal.h" + +#include +#include +#include #include #include #include -#include -#include + #include "basearith.h" #include "bits.h" +#include "constants.h" #include "convolute.h" #include "crt.h" #include "mpalloc.h" #include "typearith.h" -#include "umodarith.h" #ifdef PPRO #if defined(_MSC_VER) @@ -61,7 +64,7 @@ #if defined(_MSC_VER) #define ALWAYS_INLINE __forceinline -#elif defined(LEGACY_COMPILER) +#elif defined(__IBMC__) || defined(LEGACY_COMPILER) #define ALWAYS_INLINE #undef inline #define inline @@ -241,7 +244,7 @@ mpd_lsd(mpd_uint_t word) } /* Coefficient size needed to store 'digits' */ -ALWAYS_INLINE mpd_ssize_t +mpd_ssize_t mpd_digits_to_size(mpd_ssize_t digits) { mpd_ssize_t q, r; @@ -260,8 +263,9 @@ mpd_exp_digits(mpd_ssize_t exp) /* Canonical */ ALWAYS_INLINE int -mpd_iscanonical(const mpd_t *dec UNUSED) +mpd_iscanonical(const mpd_t *dec) { + (void)dec; return 1; } @@ -512,6 +516,28 @@ mpd_qresize(mpd_t *result, mpd_ssize_t nwords, uint32_t *status) return mpd_realloc_dyn(result, nwords, status); } +/* Same as mpd_qresize, but do not set the result no NaN on failure. */ +static ALWAYS_INLINE int +mpd_qresize_cxx(mpd_t *result, mpd_ssize_t nwords) +{ + assert(!mpd_isconst_data(result)); /* illegal operation for a const */ + assert(!mpd_isshared_data(result)); /* illegal operation for a shared */ + assert(MPD_MINALLOC <= result->alloc); + + nwords = (nwords <= MPD_MINALLOC) ? MPD_MINALLOC : nwords; + if (nwords == result->alloc) { + return 1; + } + if (mpd_isstatic_data(result)) { + if (nwords > result->alloc) { + return mpd_switch_to_dyn_cxx(result, nwords); + } + return 1; + } + + return mpd_realloc_dyn_cxx(result, nwords); +} + /* Same as mpd_qresize, but the complete coefficient (including the old * memory area!) is initialized to zero. */ ALWAYS_INLINE int @@ -1192,7 +1218,7 @@ _c32setu64(mpd_t *result, uint64_t u, uint8_t sign, uint32_t *status) result->data[i] = w[i]; } - mpd_set_sign(result, sign); + mpd_set_flags(result, sign); result->exp = 0; result->len = len; mpd_setdigits(result); @@ -1244,6 +1270,26 @@ mpd_qset_i64(mpd_t *result, int64_t a, const mpd_context_t *ctx, #endif } +/* quietly set a decimal from an int64_t, use a maxcontext for conversion */ +void +mpd_qset_i64_exact(mpd_t *result, int64_t a, uint32_t *status) +{ + mpd_context_t maxcontext; + + mpd_maxcontext(&maxcontext); +#ifdef CONFIG_64 + mpd_qset_ssize(result, a, &maxcontext, status); +#else + _c32_qset_i64(result, a, &maxcontext, status); +#endif + + if (*status & (MPD_Inexact|MPD_Rounded|MPD_Clamped)) { + /* we want exact results */ + mpd_seterror(result, MPD_Invalid_operation, status); + } + *status &= MPD_Errors; +} + /* quietly set a decimal from a uint64_t */ void mpd_qset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx, @@ -1255,8 +1301,27 @@ mpd_qset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx, _c32_qset_u64(result, a, ctx, status); #endif } -#endif /* !LEGACY_COMPILER */ +/* quietly set a decimal from a uint64_t, use a maxcontext for conversion */ +void +mpd_qset_u64_exact(mpd_t *result, uint64_t a, uint32_t *status) +{ + mpd_context_t maxcontext; + + mpd_maxcontext(&maxcontext); +#ifdef CONFIG_64 + mpd_qset_uint(result, a, &maxcontext, status); +#else + _c32_qset_u64(result, a, &maxcontext, status); +#endif + + if (*status & (MPD_Inexact|MPD_Rounded|MPD_Clamped)) { + /* we want exact results */ + mpd_seterror(result, MPD_Invalid_operation, status); + } + *status &= MPD_Errors; +} +#endif /* !LEGACY_COMPILER */ /* * Quietly get an mpd_uint_t from a decimal. Assumes @@ -1345,11 +1410,13 @@ mpd_qabs_uint(const mpd_t *a, uint32_t *status) mpd_ssize_t mpd_qget_ssize(const mpd_t *a, uint32_t *status) { + uint32_t workstatus = 0; mpd_uint_t u; int isneg; - u = mpd_qabs_uint(a, status); - if (*status&MPD_Invalid_operation) { + u = mpd_qabs_uint(a, &workstatus); + if (workstatus&MPD_Invalid_operation) { + *status |= workstatus; return MPD_SSIZE_MAX; } @@ -1469,9 +1536,11 @@ mpd_qget_i64(const mpd_t *a, uint32_t *status) uint32_t mpd_qget_u32(const mpd_t *a, uint32_t *status) { - uint64_t x = mpd_qget_uint(a, status); + uint32_t workstatus = 0; + uint64_t x = mpd_qget_uint(a, &workstatus); - if (*status&MPD_Invalid_operation) { + if (workstatus&MPD_Invalid_operation) { + *status |= workstatus; return UINT32_MAX; } if (x > UINT32_MAX) { @@ -1486,9 +1555,11 @@ mpd_qget_u32(const mpd_t *a, uint32_t *status) int32_t mpd_qget_i32(const mpd_t *a, uint32_t *status) { - int64_t x = mpd_qget_ssize(a, status); + uint32_t workstatus = 0; + int64_t x = mpd_qget_ssize(a, &workstatus); - if (*status&MPD_Invalid_operation) { + if (workstatus&MPD_Invalid_operation) { + *status |= workstatus; return INT32_MAX; } if (x < INT32_MIN || x > INT32_MAX) { @@ -1504,14 +1575,20 @@ mpd_qget_i32(const mpd_t *a, uint32_t *status) uint64_t mpd_qget_u64(const mpd_t *a, uint32_t *status) { - return _c32_qget_u64(1, a, status); + uint32_t workstatus = 0; + uint64_t x = _c32_qget_u64(1, a, &workstatus); + *status |= workstatus; + return x; } /* quietly get an int64_t from a decimal */ int64_t mpd_qget_i64(const mpd_t *a, uint32_t *status) { - return _c32_qget_i64(a, status); + uint32_t workstatus = 0; + int64_t x = _c32_qget_i64(a, &workstatus); + *status |= workstatus; + return x; } #endif @@ -1937,6 +2014,25 @@ mpd_qcopy(mpd_t *result, const mpd_t *a, uint32_t *status) return 1; } +/* Same as mpd_qcopy, but do not set the result to NaN on failure. */ +int +mpd_qcopy_cxx(mpd_t *result, const mpd_t *a) +{ + if (result == a) return 1; + + if (!mpd_qresize_cxx(result, a->len)) { + return 0; + } + + mpd_copy_flags(result, a); + result->exp = a->exp; + result->digits = a->digits; + result->len = a->len; + memcpy(result->data, a->data, a->len * (sizeof *result->data)); + + return 1; +} + /* * Copy to a decimal with a static buffer. The caller has to make sure that * the buffer is big enough. Cannot fail. @@ -3780,7 +3876,72 @@ void mpd_qdiv(mpd_t *q, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status) { - _mpd_qdiv(SET_IDEAL_EXP, q, a, b, ctx, status); + MPD_NEW_STATIC(aa,0,0,0,0); + MPD_NEW_STATIC(bb,0,0,0,0); + uint32_t xstatus = 0; + + if (q == a) { + if (!mpd_qcopy(&aa, a, status)) { + mpd_seterror(q, MPD_Malloc_error, status); + goto out; + } + a = &aa; + } + + if (q == b) { + if (!mpd_qcopy(&bb, b, status)) { + mpd_seterror(q, MPD_Malloc_error, status); + goto out; + } + b = &bb; + } + + _mpd_qdiv(SET_IDEAL_EXP, q, a, b, ctx, &xstatus); + + if (xstatus & (MPD_Malloc_error|MPD_Division_impossible)) { + /* Inexact quotients (the usual case) fill the entire context precision, + * which can lead to the above errors for very high precisions. Retry + * the operation with a lower precision in case the result is exact. + * + * We need an upper bound for the number of digits of a_coeff / b_coeff + * when the result is exact. If a_coeff' * 1 / b_coeff' is in lowest + * terms, then maxdigits(a_coeff') + maxdigits(1 / b_coeff') is a suitable + * bound. + * + * 1 / b_coeff' is exact iff b_coeff' exclusively has prime factors 2 or 5. + * The largest amount of digits is generated if b_coeff' is a power of 2 or + * a power of 5 and is less than or equal to log5(b_coeff') <= log2(b_coeff'). + * + * We arrive at a total upper bound: + * + * maxdigits(a_coeff') + maxdigits(1 / b_coeff') <= + * log10(a_coeff) + log2(b_coeff) = + * log10(a_coeff) + log10(b_coeff) / log10(2) <= + * a->digits + b->digits * 4; + */ + mpd_context_t workctx = *ctx; + uint32_t ystatus = 0; + + workctx.prec = a->digits + b->digits * 4; + if (workctx.prec >= ctx->prec) { + *status |= (xstatus&MPD_Errors); + goto out; /* No point in retrying, keep the original error. */ + } + + _mpd_qdiv(SET_IDEAL_EXP, q, a, b, &workctx, &ystatus); + if (ystatus != 0) { + ystatus = *status | ((ystatus|xstatus)&MPD_Errors); + mpd_seterror(q, ystatus, status); + } + } + else { + *status |= xstatus; + } + + +out: + mpd_del(&aa); + mpd_del(&bb); } /* Internal function. */ @@ -3870,6 +4031,7 @@ _mpd_qdivmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b, } if (b->len == 1) { + assert(b->data[0] != 0); /* annotation for scan-build */ if (a->len == 1) { _mpd_div_word(&q->data[0], &r->data[0], a->data[0], b->data[0]); } @@ -6214,9 +6376,11 @@ _mpd_qpow_int(mpd_t *result, const mpd_t *base, const mpd_t *exp, workctx.round = MPD_ROUND_HALF_EVEN; workctx.clamp = 0; if (mpd_isnegative(exp)) { + uint32_t workstatus = 0; workctx.prec += 1; - mpd_qdiv(&tbase, &one, base, &workctx, status); - if (*status&MPD_Errors) { + mpd_qdiv(&tbase, &one, base, &workctx, &workstatus); + *status |= workstatus; + if (workstatus&MPD_Errors) { mpd_setspecial(result, MPD_POS, MPD_NAN); goto finish; } @@ -6951,6 +7115,8 @@ mpd_qrem_near(mpd_t *r, const mpd_t *a, const mpd_t *b, mpd_ssize_t expdiff, qdigits; int cmp, isodd, allnine; + assert(r != NULL); /* annotation for scan-build */ + if (mpd_isspecial(a) || mpd_isspecial(b)) { if (mpd_qcheck_nans(r, a, b, ctx, status)) { return; @@ -7181,6 +7347,11 @@ void mpd_qtrunc(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status) { + if (mpd_isspecial(a)) { + mpd_seterror(result, MPD_Invalid_operation, status); + return; + } + (void)_mpd_qround_to_integral(TO_INT_TRUNC, result, a, ctx, status); } @@ -7189,6 +7360,12 @@ mpd_qfloor(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status) { mpd_context_t workctx = *ctx; + + if (mpd_isspecial(a)) { + mpd_seterror(result, MPD_Invalid_operation, status); + return; + } + workctx.round = MPD_ROUND_FLOOR; (void)_mpd_qround_to_integral(TO_INT_SILENT, result, a, &workctx, status); @@ -7199,6 +7376,12 @@ mpd_qceil(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status) { mpd_context_t workctx = *ctx; + + if (mpd_isspecial(a)) { + mpd_seterror(result, MPD_Invalid_operation, status); + return; + } + workctx.round = MPD_ROUND_CEILING; (void)_mpd_qround_to_integral(TO_INT_SILENT, result, a, &workctx, status); @@ -7702,9 +7885,9 @@ mpd_qinvroot(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, /* END LIBMPDEC_ONLY */ /* Algorithm from decimal.py */ -void -mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, - uint32_t *status) +static void +_mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, + uint32_t *status) { mpd_context_t maxcontext; MPD_NEW_STATIC(c,0,0,0,0); @@ -7836,6 +8019,56 @@ malloc_error: goto out; } +void +mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, + uint32_t *status) +{ + MPD_NEW_STATIC(aa,0,0,0,0); + uint32_t xstatus = 0; + + if (result == a) { + if (!mpd_qcopy(&aa, a, status)) { + mpd_seterror(result, MPD_Malloc_error, status); + goto out; + } + a = &aa; + } + + _mpd_qsqrt(result, a, ctx, &xstatus); + + if (xstatus & (MPD_Malloc_error|MPD_Division_impossible)) { + /* The above conditions can occur at very high context precisions + * if intermediate values get too large. Retry the operation with + * a lower context precision in case the result is exact. + * + * If the result is exact, an upper bound for the number of digits + * is the number of digits in the input. + * + * NOTE: sqrt(40e9) = 2.0e+5 /\ digits(40e9) = digits(2.0e+5) = 2 + */ + uint32_t ystatus = 0; + mpd_context_t workctx = *ctx; + + workctx.prec = a->digits; + if (workctx.prec >= ctx->prec) { + *status |= (xstatus|MPD_Errors); + goto out; /* No point in repeating this, keep the original error. */ + } + + _mpd_qsqrt(result, a, &workctx, &ystatus); + if (ystatus != 0) { + ystatus = *status | ((xstatus|ystatus)&MPD_Errors); + mpd_seterror(result, ystatus, status); + } + } + else { + *status |= xstatus; + } + +out: + mpd_del(&aa); +} + /******************************************************************************/ /* Base conversions */ @@ -7847,6 +8080,7 @@ mpd_sizeinbase(const mpd_t *a, uint32_t base) { double x; size_t digits; + double upper_bound; assert(mpd_isinteger(a)); assert(base >= 2); @@ -7863,10 +8097,14 @@ mpd_sizeinbase(const mpd_t *a, uint32_t base) if (digits > 2711437152599294ULL) { return SIZE_MAX; } + + upper_bound = (double)((1ULL<<53)-1); +#else + upper_bound = (double)(SIZE_MAX-1); #endif x = (double)digits / log10(base); - return (x > SIZE_MAX-1) ? SIZE_MAX : (size_t)x + 1; + return (x > upper_bound) ? SIZE_MAX : (size_t)x + 1; } /* Space needed to import a base 'base' integer of length 'srclen'. */ @@ -7874,6 +8112,7 @@ static mpd_ssize_t _mpd_importsize(size_t srclen, uint32_t base) { double x; + double upper_bound; assert(srclen > 0); assert(base >= 2); @@ -7882,10 +8121,15 @@ _mpd_importsize(size_t srclen, uint32_t base) if (srclen > (1ULL<<53)) { return MPD_SSIZE_MAX; } + + assert((1ULL<<53) <= MPD_MAXIMPORT); + upper_bound = (double)((1ULL<<53)-1); +#else + upper_bound = MPD_MAXIMPORT-1; #endif x = (double)srclen * (log10(base)/MPD_RDIGITS); - return (x >= MPD_MAXIMPORT) ? MPD_SSIZE_MAX : (mpd_ssize_t)x + 1; + return (x > upper_bound) ? MPD_SSIZE_MAX : (mpd_ssize_t)x + 1; } static uint8_t @@ -8412,6 +8656,3 @@ mpd_qimport_u32(mpd_t *result, mpd_qresize(result, result->len, status); mpd_qfinalize(result, ctx, status); } - - - diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h index a67dd9bc..2815a8cd 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.h +++ b/Modules/_decimal/libmpdec/mpdecimal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,59 +26,45 @@ */ -#ifndef MPDECIMAL_H -#define MPDECIMAL_H - - -#ifdef __cplusplus -extern "C" { - #ifndef __STDC_LIMIT_MACROS - #define __STDC_LIMIT_MACROS - #define MPD_CLEAR_STDC_LIMIT_MACROS - #endif -#endif +#ifndef LIBMPDEC_MPDECIMAL_H_ +#define LIBMPDEC_MPDECIMAL_H_ #ifndef _MSC_VER #include "pyconfig.h" #endif -#include -#include -#include -#include -#include -#include -#include +#ifdef __cplusplus + #include + #include + #include + #include + #include +extern "C" { +#else + #include + #include + #include + #include + #include +#endif -#ifdef _MSC_VER - #include "vccompat.h" - #ifndef UNUSED - #define UNUSED - #endif + +#if (defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)) && \ + defined(__GNUC__) && __GNUC__ >= 4 && !defined(__INTEL_COMPILER) + #define MPD_PRAGMA(x) _Pragma(x) + #define MPD_HIDE_SYMBOLS_START "GCC visibility push(hidden)" + #define MPD_HIDE_SYMBOLS_END "GCC visibility pop" +#else #define MPD_PRAGMA(x) #define MPD_HIDE_SYMBOLS_START #define MPD_HIDE_SYMBOLS_END +#endif + +#if defined(_MSC_VER) + #include "vccompat.h" #define EXTINLINE extern inline #else - #ifndef __GNUC_STDC_INLINE__ - #define __GNUC_STDC_INLINE__ 1 - #endif - #if defined(__GNUC__) && !defined(__INTEL_COMPILER) - #define UNUSED __attribute__((unused)) - #else - #define UNUSED - #endif - #if (defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)) && \ - defined(__GNUC__) && __GNUC__ >= 4 && !defined(__INTEL_COMPILER) - #define MPD_PRAGMA(x) _Pragma(x) - #define MPD_HIDE_SYMBOLS_START "GCC visibility push(hidden)" - #define MPD_HIDE_SYMBOLS_END "GCC visibility pop" - #else - #define MPD_PRAGMA(x) - #define MPD_HIDE_SYMBOLS_START - #define MPD_HIDE_SYMBOLS_END - #endif #define EXTINLINE #endif @@ -103,10 +89,10 @@ MPD_PRAGMA(MPD_HIDE_SYMBOLS_START) /******************************************************************************/ #define MPD_MAJOR_VERSION 2 -#define MPD_MINOR_VERSION 4 -#define MPD_MICRO_VERSION 2 +#define MPD_MINOR_VERSION 5 +#define MPD_MICRO_VERSION 0 -#define MPD_VERSION "2.4.2" +#define MPD_VERSION "2.5.0" #define MPD_VERSION_HEX ((MPD_MAJOR_VERSION << 24) | \ (MPD_MINOR_VERSION << 16) | \ @@ -423,6 +409,7 @@ void mpd_print(const mpd_t *dec); /* assignment from a string */ void mpd_qset_string(mpd_t *dec, const char *s, const mpd_context_t *ctx, uint32_t *status); +void mpd_qset_string_exact(mpd_t *dec, const char *s, uint32_t *status); /* set to NaN with error flags */ void mpd_seterror(mpd_t *result, uint32_t flags, uint32_t *status); @@ -440,6 +427,8 @@ void mpd_qset_u32(mpd_t *result, uint32_t a, const mpd_context_t *ctx, uint32_t #ifndef LEGACY_COMPILER void mpd_qset_i64(mpd_t *result, int64_t a, const mpd_context_t *ctx, uint32_t *status); void mpd_qset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx, uint32_t *status); +void mpd_qset_i64_exact(mpd_t *result, int64_t a, uint32_t *status); +void mpd_qset_u64_exact(mpd_t *result, uint64_t a, uint32_t *status); #endif /* quietly assign a C integer type to an mpd_t with a static coefficient */ @@ -467,7 +456,8 @@ void mpd_qfinalize(mpd_t *result, const mpd_context_t *ctx, uint32_t *status); const char *mpd_class(const mpd_t *a, const mpd_context_t *ctx); -int mpd_qcopy(mpd_t *result, const mpd_t *a, uint32_t *status); +int mpd_qcopy(mpd_t *result, const mpd_t *a, uint32_t *status); +int mpd_qcopy_cxx(mpd_t *result, const mpd_t *a); mpd_t *mpd_qncopy(const mpd_t *a); int mpd_qcopy_abs(mpd_t *result, const mpd_t *a, uint32_t *status); int mpd_qcopy_negate(mpd_t *result, const mpd_t *a, uint32_t *status); @@ -721,7 +711,7 @@ EXTINLINE mpd_uint_t mpd_lsd(mpd_uint_t word); EXTINLINE mpd_ssize_t mpd_digits_to_size(mpd_ssize_t digits); /* number of digits in the exponent, undefined for MPD_SSIZE_MIN */ EXTINLINE int mpd_exp_digits(mpd_ssize_t exp); -EXTINLINE int mpd_iscanonical(const mpd_t *dec UNUSED); +EXTINLINE int mpd_iscanonical(const mpd_t *dec); EXTINLINE int mpd_isfinite(const mpd_t *dec); EXTINLINE int mpd_isinfinite(const mpd_t *dec); EXTINLINE int mpd_isinteger(const mpd_t *dec); @@ -833,15 +823,8 @@ MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ #ifdef __cplusplus - #ifdef MPD_CLEAR_STDC_LIMIT_MACROS - #undef MPD_CLEAR_STDC_LIMIT_MACROS - #undef __STDC_LIMIT_MACROS - #endif } /* END extern "C" */ #endif -#endif /* MPDECIMAL_H */ - - - +#endif /* LIBMPDEC_MPDECIMAL_H_ */ diff --git a/Modules/_decimal/libmpdec/numbertheory.c b/Modules/_decimal/libmpdec/numbertheory.c index 4e035477..210e0deb 100644 --- a/Modules/_decimal/libmpdec/numbertheory.c +++ b/Modules/_decimal/libmpdec/numbertheory.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,11 +27,13 @@ #include "mpdecimal.h" -#include + #include +#include + #include "bits.h" -#include "umodarith.h" #include "numbertheory.h" +#include "umodarith.h" /* Bignum: Initialize the Number Theoretic Transform. */ @@ -128,5 +130,3 @@ _mpd_init_w3table(mpd_uint_t w3table[3], int sign, int modnum) w3table[1] = kernel; w3table[2] = POWMOD(kernel, 2); } - - diff --git a/Modules/_decimal/libmpdec/numbertheory.h b/Modules/_decimal/libmpdec/numbertheory.h index e94c1579..47b7753b 100644 --- a/Modules/_decimal/libmpdec/numbertheory.h +++ b/Modules/_decimal/libmpdec/numbertheory.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,12 @@ */ -#ifndef NUMBER_THEORY_H -#define NUMBER_THEORY_H +#ifndef LIBMPDEC_NUMBERTHEORY_H_ +#define LIBMPDEC_NUMBERTHEORY_H_ -#include "constants.h" #include "mpdecimal.h" +#include "constants.h" /* Internal header file: all symbols have local scope in the DSO */ @@ -73,6 +73,4 @@ std_setmodulus(int modnum, mpd_uint_t *umod) MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif - - +#endif /* LIBMPDEC_NUMBERTHEORY_H_ */ diff --git a/Modules/_decimal/libmpdec/sixstep.c b/Modules/_decimal/libmpdec/sixstep.c index 92d513eb..a4d1dbed 100644 --- a/Modules/_decimal/libmpdec/sixstep.c +++ b/Modules/_decimal/libmpdec/sixstep.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,15 +27,17 @@ #include "mpdecimal.h" -#include -#include + #include +#include + #include "bits.h" +#include "constants.h" #include "difradix2.h" #include "numbertheory.h" +#include "sixstep.h" #include "transpose.h" #include "umodarith.h" -#include "sixstep.h" /* Bignum: Cache efficient Matrix Fourier Transform for arrays of the @@ -210,5 +212,3 @@ inv_six_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum) return 1; } - - diff --git a/Modules/_decimal/libmpdec/sixstep.h b/Modules/_decimal/libmpdec/sixstep.h index 4a8b015e..89b4a33a 100644 --- a/Modules/_decimal/libmpdec/sixstep.h +++ b/Modules/_decimal/libmpdec/sixstep.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef SIX_STEP_H -#define SIX_STEP_H +#ifndef LIBMPDEC_SIXSTEP_H_ +#define LIBMPDEC_SIXSTEP_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -45,4 +44,4 @@ int inv_six_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_SIXSTEP_H_ */ diff --git a/Modules/_decimal/libmpdec/transpose.c b/Modules/_decimal/libmpdec/transpose.c index 55d6d899..56321b5f 100644 --- a/Modules/_decimal/libmpdec/transpose.c +++ b/Modules/_decimal/libmpdec/transpose.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,15 +27,17 @@ #include "mpdecimal.h" + +#include +#include #include #include #include -#include -#include + #include "bits.h" #include "constants.h" -#include "typearith.h" #include "transpose.h" +#include "typearith.h" #define BUFSIZE 4096 @@ -272,5 +274,3 @@ transpose_pow2(mpd_uint_t *matrix, mpd_size_t rows, mpd_size_t cols) return 1; } - - diff --git a/Modules/_decimal/libmpdec/transpose.h b/Modules/_decimal/libmpdec/transpose.h index e1cd1fa1..e91c18d7 100644 --- a/Modules/_decimal/libmpdec/transpose.h +++ b/Modules/_decimal/libmpdec/transpose.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef TRANSPOSE_H -#define TRANSPOSE_H +#ifndef LIBMPDEC_TRANSPOSE_H_ +#define LIBMPDEC_TRANSPOSE_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -59,4 +58,4 @@ static inline void pointerswap(mpd_uint_t **a, mpd_uint_t **b) MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_TRANSPOSE_H_ */ diff --git a/Modules/_decimal/libmpdec/typearith.h b/Modules/_decimal/libmpdec/typearith.h index 405237da..47961788 100644 --- a/Modules/_decimal/libmpdec/typearith.h +++ b/Modules/_decimal/libmpdec/typearith.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,14 @@ */ -#ifndef TYPEARITH_H -#define TYPEARITH_H +#ifndef LIBMPDEC_TYPEARITH_H_ +#define LIBMPDEC_TYPEARITH_H_ #include "mpdecimal.h" +#include + /*****************************************************************************/ /* Low level native arithmetic on basic types */ @@ -663,7 +665,4 @@ mulmod_size_t(mpd_size_t a, mpd_size_t b, mpd_size_t m) } -#endif /* TYPEARITH_H */ - - - +#endif /* LIBMPDEC_TYPEARITH_H_ */ diff --git a/Modules/_decimal/libmpdec/umodarith.h b/Modules/_decimal/libmpdec/umodarith.h index 68d15188..d7dbbbe6 100644 --- a/Modules/_decimal/libmpdec/umodarith.h +++ b/Modules/_decimal/libmpdec/umodarith.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,13 @@ */ -#ifndef UMODARITH_H -#define UMODARITH_H +#ifndef LIBMPDEC_UMODARITH_H_ +#define LIBMPDEC_UMODARITH_H_ -#include "constants.h" #include "mpdecimal.h" + +#include "constants.h" #include "typearith.h" @@ -644,7 +645,4 @@ ppro_powmod(mpd_uint_t base, mpd_uint_t exp, double *dmod, uint32_t *dinvmod) #endif /* CONFIG_32 */ -#endif /* UMODARITH_H */ - - - +#endif /* LIBMPDEC_UMODARITH_H_ */ diff --git a/Modules/_decimal/libmpdec/vccompat.h b/Modules/_decimal/libmpdec/vccompat.h index dd131d8d..e2e1c42c 100644 --- a/Modules/_decimal/libmpdec/vccompat.h +++ b/Modules/_decimal/libmpdec/vccompat.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,14 +26,16 @@ */ -#ifndef VCCOMPAT_H -#define VCCOMPAT_H +#ifndef LIBMPDEC_VCCOMPAT_H_ +#define LIBMPDEC_VCCOMPAT_H_ -/* Visual C fixes: no stdint.h, no snprintf ... */ +/* Visual C fixes: no snprintf ... */ #ifdef _MSC_VER - #undef inline - #define inline __inline + #ifndef __cplusplus + #undef inline + #define inline __inline + #endif #undef random #define random rand #undef srandom @@ -51,7 +53,4 @@ #endif -#endif /* VCCOMPAT_H */ - - - +#endif /* LIBMPDEC_VCCOMPAT_H_ */ diff --git a/Modules/_decimal/libmpdec/vcdiv64.asm b/Modules/_decimal/libmpdec/vcdiv64.asm index 6b664567..597e9ba9 100644 --- a/Modules/_decimal/libmpdec/vcdiv64.asm +++ b/Modules/_decimal/libmpdec/vcdiv64.asm @@ -1,5 +1,5 @@ ; -; Copyright (c) 2008-2016 Stefan Krah. All rights reserved. +; Copyright (c) 2008-2020 Stefan Krah. All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions @@ -44,5 +44,3 @@ _mpd_div_words PROC _mpd_div_words ENDP _TEXT ENDS END - - diff --git a/Modules/_decimal/libmpdec/vcstdint.h b/Modules/_decimal/libmpdec/vcstdint.h deleted file mode 100644 index 17dcad45..00000000 --- a/Modules/_decimal/libmpdec/vcstdint.h +++ /dev/null @@ -1,232 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#if (_MSC_VER < 1300) && defined(__cplusplus) - extern "C++" { -#endif -# include -#if (_MSC_VER < 1300) && defined(__cplusplus) - } -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types -typedef __int8 int8_t; -typedef __int16 int16_t; -typedef __int32 int32_t; -typedef __int64 int64_t; -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int64 uint64_t; - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ] diff --git a/Modules/_decimal/tests/deccheck.py b/Modules/_decimal/tests/deccheck.py index f907531e..5d9179e6 100644 --- a/Modules/_decimal/tests/deccheck.py +++ b/Modules/_decimal/tests/deccheck.py @@ -29,9 +29,20 @@ # Usage: python deccheck.py [--short|--medium|--long|--all] # -import sys, random + +import sys +import os +import time +import random from copy import copy from collections import defaultdict + +import argparse +import subprocess +from subprocess import PIPE, STDOUT +from queue import Queue, Empty +from threading import Thread, Event, Lock + from test.support import import_fresh_module from randdec import randfloat, all_unary, all_binary, all_ternary from randdec import unary_optarg, binary_optarg, ternary_optarg @@ -125,6 +136,12 @@ ContextFunctions = { 'special': ('context.__reduce_ex__', 'context.create_decimal_from_float') } +# Functions that set no context flags but whose result can differ depending +# on prec, Emin and Emax. +MaxContextSkip = ['is_normal', 'is_subnormal', 'logical_invert', 'next_minus', + 'next_plus', 'number_class', 'logical_and', 'logical_or', + 'logical_xor', 'next_toward', 'rotate', 'shift'] + # Functions that require a restricted exponent range for reasonable runtimes. UnaryRestricted = [ '__ceil__', '__floor__', '__int__', '__trunc__', @@ -344,6 +361,20 @@ class TestSet(object): self.pex = RestrictedList() # Python exceptions for P.Decimal self.presults = RestrictedList() # P.Decimal results + # If the above results are exact, unrounded and not clamped, repeat + # the operation with a maxcontext to ensure that huge intermediate + # values do not cause a MemoryError. + self.with_maxcontext = False + self.maxcontext = context.c.copy() + self.maxcontext.prec = C.MAX_PREC + self.maxcontext.Emax = C.MAX_EMAX + self.maxcontext.Emin = C.MIN_EMIN + self.maxcontext.clear_flags() + + self.maxop = RestrictedList() # converted C.Decimal operands + self.maxex = RestrictedList() # Python exceptions for C.Decimal + self.maxresults = RestrictedList() # C.Decimal results + # ====================================================================== # SkipHandler: skip known discrepancies @@ -545,13 +576,17 @@ def function_as_string(t): if t.contextfunc: cargs = t.cop pargs = t.pop + maxargs = t.maxop cfunc = "c_func: %s(" % t.funcname pfunc = "p_func: %s(" % t.funcname + maxfunc = "max_func: %s(" % t.funcname else: cself, cargs = t.cop[0], t.cop[1:] pself, pargs = t.pop[0], t.pop[1:] + maxself, maxargs = t.maxop[0], t.maxop[1:] cfunc = "c_func: %s.%s(" % (repr(cself), t.funcname) pfunc = "p_func: %s.%s(" % (repr(pself), t.funcname) + maxfunc = "max_func: %s.%s(" % (repr(maxself), t.funcname) err = cfunc for arg in cargs: @@ -565,6 +600,14 @@ def function_as_string(t): err = err.rstrip(", ") err += ")" + if t.with_maxcontext: + err += "\n" + err += maxfunc + for arg in maxargs: + err += "%s, " % repr(arg) + err = err.rstrip(", ") + err += ")" + return err def raise_error(t): @@ -577,9 +620,24 @@ def raise_error(t): err = "Error in %s:\n\n" % t.funcname err += "input operands: %s\n\n" % (t.op,) err += function_as_string(t) - err += "\n\nc_result: %s\np_result: %s\n\n" % (t.cresults, t.presults) - err += "c_exceptions: %s\np_exceptions: %s\n\n" % (t.cex, t.pex) - err += "%s\n\n" % str(t.context) + + err += "\n\nc_result: %s\np_result: %s\n" % (t.cresults, t.presults) + if t.with_maxcontext: + err += "max_result: %s\n\n" % (t.maxresults) + else: + err += "\n" + + err += "c_exceptions: %s\np_exceptions: %s\n" % (t.cex, t.pex) + if t.with_maxcontext: + err += "max_exceptions: %s\n\n" % t.maxex + else: + err += "\n" + + err += "%s\n" % str(t.context) + if t.with_maxcontext: + err += "%s\n" % str(t.maxcontext) + else: + err += "\n" raise VerifyError(err) @@ -603,6 +661,13 @@ def raise_error(t): # are printed to stdout. # ====================================================================== +def all_nan(a): + if isinstance(a, C.Decimal): + return a.is_nan() + elif isinstance(a, tuple): + return all(all_nan(v) for v in a) + return False + def convert(t, convstr=True): """ t is the testset. At this stage the testset contains a tuple of operands t.op of various types. For decimal methods the first @@ -617,10 +682,12 @@ def convert(t, convstr=True): for i, op in enumerate(t.op): context.clear_status() + t.maxcontext.clear_flags() if op in RoundModes: t.cop.append(op) t.pop.append(op) + t.maxop.append(op) elif not t.contextfunc and i == 0 or \ convstr and isinstance(op, str): @@ -638,11 +705,25 @@ def convert(t, convstr=True): p = None pex = e.__class__ + try: + C.setcontext(t.maxcontext) + maxop = C.Decimal(op) + maxex = None + except (TypeError, ValueError, OverflowError) as e: + maxop = None + maxex = e.__class__ + finally: + C.setcontext(context.c) + t.cop.append(c) t.cex.append(cex) + t.pop.append(p) t.pex.append(pex) + t.maxop.append(maxop) + t.maxex.append(maxex) + if cex is pex: if str(c) != str(p) or not context.assert_eq_status(): raise_error(t) @@ -652,14 +733,21 @@ def convert(t, convstr=True): else: raise_error(t) + # The exceptions in the maxcontext operation can legitimately + # differ, only test that maxex implies cex: + if maxex is not None and cex is not maxex: + raise_error(t) + elif isinstance(op, Context): t.context = op t.cop.append(op.c) t.pop.append(op.p) + t.maxop.append(t.maxcontext) else: t.cop.append(op) t.pop.append(op) + t.maxop.append(op) return 1 @@ -673,6 +761,7 @@ def callfuncs(t): t.rc and t.rp are the results of the operation. """ context.clear_status() + t.maxcontext.clear_flags() try: if t.contextfunc: @@ -700,6 +789,35 @@ def callfuncs(t): t.rp = None t.pex.append(e.__class__) + # If the above results are exact, unrounded, normal etc., repeat the + # operation with a maxcontext to ensure that huge intermediate values + # do not cause a MemoryError. + if (t.funcname not in MaxContextSkip and + not context.c.flags[C.InvalidOperation] and + not context.c.flags[C.Inexact] and + not context.c.flags[C.Rounded] and + not context.c.flags[C.Subnormal] and + not context.c.flags[C.Clamped] and + not context.clamp and # results are padded to context.prec if context.clamp==1. + not any(isinstance(v, C.Context) for v in t.cop)): # another context is used. + t.with_maxcontext = True + try: + if t.contextfunc: + maxargs = t.maxop + t.rmax = getattr(t.maxcontext, t.funcname)(*maxargs) + else: + maxself = t.maxop[0] + maxargs = t.maxop[1:] + try: + C.setcontext(t.maxcontext) + t.rmax = getattr(maxself, t.funcname)(*maxargs) + finally: + C.setcontext(context.c) + t.maxex.append(None) + except (TypeError, ValueError, OverflowError, MemoryError) as e: + t.rmax = None + t.maxex.append(e.__class__) + def verify(t, stat): """ t is the testset. At this stage the testset contains the following tuples: @@ -714,6 +832,9 @@ def verify(t, stat): """ t.cresults.append(str(t.rc)) t.presults.append(str(t.rp)) + if t.with_maxcontext: + t.maxresults.append(str(t.rmax)) + if isinstance(t.rc, C.Decimal) and isinstance(t.rp, P.Decimal): # General case: both results are Decimals. t.cresults.append(t.rc.to_eng_string()) @@ -725,6 +846,12 @@ def verify(t, stat): t.presults.append(str(t.rp.imag)) t.presults.append(str(t.rp.real)) + if t.with_maxcontext and isinstance(t.rmax, C.Decimal): + t.maxresults.append(t.rmax.to_eng_string()) + t.maxresults.append(t.rmax.as_tuple()) + t.maxresults.append(str(t.rmax.imag)) + t.maxresults.append(str(t.rmax.real)) + nc = t.rc.number_class().lstrip('+-s') stat[nc] += 1 else: @@ -732,6 +859,9 @@ def verify(t, stat): if not isinstance(t.rc, tuple) and not isinstance(t.rp, tuple): if t.rc != t.rp: raise_error(t) + if t.with_maxcontext and not isinstance(t.rmax, tuple): + if t.rmax != t.rc: + raise_error(t) stat[type(t.rc).__name__] += 1 # The return value lists must be equal. @@ -744,6 +874,20 @@ def verify(t, stat): if not t.context.assert_eq_status(): raise_error(t) + if t.with_maxcontext: + # NaN payloads etc. depend on precision and clamp. + if all_nan(t.rc) and all_nan(t.rmax): + return + # The return value lists must be equal. + if t.maxresults != t.cresults: + raise_error(t) + # The Python exception lists (TypeError, etc.) must be equal. + if t.maxex != t.cex: + raise_error(t) + # The context flags must be equal. + if t.maxcontext.flags != t.context.c.flags: + raise_error(t) + # ====================================================================== # Main test loops @@ -991,18 +1135,35 @@ def check_untested(funcdict, c_cls, p_cls): funcdict['untested'] = tuple(sorted(intersect-tested)) - #for key in ('untested', 'c_only', 'p_only'): - # s = 'Context' if c_cls == C.Context else 'Decimal' - # print("\n%s %s:\n%s" % (s, key, funcdict[key])) + # for key in ('untested', 'c_only', 'p_only'): + # s = 'Context' if c_cls == C.Context else 'Decimal' + # print("\n%s %s:\n%s" % (s, key, funcdict[key])) if __name__ == '__main__': - import time + parser = argparse.ArgumentParser(prog="deccheck.py") + + group = parser.add_mutually_exclusive_group() + group.add_argument('--short', dest='time', action="store_const", const='short', default='short', help="short test (default)") + group.add_argument('--medium', dest='time', action="store_const", const='medium', default='short', help="medium test (reasonable run time)") + group.add_argument('--long', dest='time', action="store_const", const='long', default='short', help="long test (long run time)") + group.add_argument('--all', dest='time', action="store_const", const='all', default='short', help="all tests (excessive run time)") + + group = parser.add_mutually_exclusive_group() + group.add_argument('--single', dest='single', nargs=1, default=False, metavar="TEST", help="run a single test") + group.add_argument('--multicore', dest='multicore', action="store_true", default=False, help="use all available cores") + + args = parser.parse_args() + assert args.single is False or args.multicore is False + if args.single: + args.single = args.single[0] + randseed = int(time.time()) random.seed(randseed) + # Set up the testspecs list. A testspec is simply a dictionary # that determines the amount of different contexts that 'test_method' # will generate. @@ -1035,17 +1196,17 @@ if __name__ == '__main__': {'prec': [34], 'expts': [(-6143, 6144)], 'clamp': 1, 'iter': None} ] - if '--medium' in sys.argv: + if args.time == 'medium': base['expts'].append(('rand', 'rand')) # 5 random precisions base['samples'] = 5 testspecs = [small] + ieee + [base] - if '--long' in sys.argv: + elif args.time == 'long': base['expts'].append(('rand', 'rand')) # 10 random precisions base['samples'] = 10 testspecs = [small] + ieee + [base] - elif '--all' in sys.argv: + elif args.time == 'all': base['expts'].append(('rand', 'rand')) # All precisions in [1, 100] base['samples'] = 100 @@ -1062,39 +1223,100 @@ if __name__ == '__main__': small['expts'] = [(-prec, prec)] testspecs = [small, rand_ieee, base] + check_untested(Functions, C.Decimal, P.Decimal) check_untested(ContextFunctions, C.Context, P.Context) - log("\n\nRandom seed: %d\n\n", randseed) + if args.multicore: + q = Queue() + elif args.single: + log("Random seed: %d", randseed) + else: + log("\n\nRandom seed: %d\n\n", randseed) + + + FOUND_METHOD = False + def do_single(method, f): + global FOUND_METHOD + if args.multicore: + q.put(method) + elif not args.single or args.single == method: + FOUND_METHOD = True + f() # Decimal methods: for method in Functions['unary'] + Functions['unary_ctx'] + \ Functions['unary_rnd_ctx']: - test_method(method, testspecs, test_unary) + do_single(method, lambda: test_method(method, testspecs, test_unary)) for method in Functions['binary'] + Functions['binary_ctx']: - test_method(method, testspecs, test_binary) + do_single(method, lambda: test_method(method, testspecs, test_binary)) for method in Functions['ternary'] + Functions['ternary_ctx']: - test_method(method, testspecs, test_ternary) + name = '__powmod__' if method == '__pow__' else method + do_single(name, lambda: test_method(method, testspecs, test_ternary)) - test_method('__format__', testspecs, test_format) - test_method('__round__', testspecs, test_round) - test_method('from_float', testspecs, test_from_float) - test_method('quantize', testspecs, test_quantize_api) + do_single('__format__', lambda: test_method('__format__', testspecs, test_format)) + do_single('__round__', lambda: test_method('__round__', testspecs, test_round)) + do_single('from_float', lambda: test_method('from_float', testspecs, test_from_float)) + do_single('quantize_api', lambda: test_method('quantize', testspecs, test_quantize_api)) # Context methods: for method in ContextFunctions['unary']: - test_method(method, testspecs, test_unary) + do_single(method, lambda: test_method(method, testspecs, test_unary)) for method in ContextFunctions['binary']: - test_method(method, testspecs, test_binary) + do_single(method, lambda: test_method(method, testspecs, test_binary)) for method in ContextFunctions['ternary']: - test_method(method, testspecs, test_ternary) - - test_method('context.create_decimal_from_float', testspecs, test_from_float) - - - sys.exit(EXIT_STATUS) + name = 'context.powmod' if method == 'context.power' else method + do_single(name, lambda: test_method(method, testspecs, test_ternary)) + + do_single('context.create_decimal_from_float', + lambda: test_method('context.create_decimal_from_float', + testspecs, test_from_float)) + + if args.multicore: + error = Event() + write_lock = Lock() + + def write_output(out, returncode): + if returncode != 0: + error.set() + + with write_lock: + sys.stdout.buffer.write(out + b"\n") + sys.stdout.buffer.flush() + + def tfunc(): + while not error.is_set(): + try: + test = q.get(block=False, timeout=-1) + except Empty: + return + + cmd = [sys.executable, "deccheck.py", "--%s" % args.time, "--single", test] + p = subprocess.Popen(cmd, stdout=PIPE, stderr=STDOUT) + out, _ = p.communicate() + write_output(out, p.returncode) + + N = os.cpu_count() + t = N * [None] + + for i in range(N): + t[i] = Thread(target=tfunc) + t[i].start() + + for i in range(N): + t[i].join() + + sys.exit(1 if error.is_set() else 0) + + elif args.single: + if not FOUND_METHOD: + log("\nerror: cannot find method \"%s\"" % args.single) + EXIT_STATUS = 1 + sys.exit(EXIT_STATUS) + else: + sys.exit(EXIT_STATUS) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index a96e3f43..2c92a8ae 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -14,7 +14,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef /* -------------------------------------------------------------------- */ /* configuration */ @@ -101,7 +101,13 @@ static struct PyModuleDef elementtreemodule; /* Given a module object (assumed to be _elementtree), get its per-module * state. */ -#define ET_STATE(mod) ((elementtreestate *) PyModule_GetState(mod)) +static inline elementtreestate* +get_elementtree_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (elementtreestate *)state; +} /* Find the module instance imported in the currently running sub-interpreter * and get its state. @@ -112,7 +118,7 @@ static struct PyModuleDef elementtreemodule; static int elementtree_clear(PyObject *m) { - elementtreestate *st = ET_STATE(m); + elementtreestate *st = get_elementtree_state(m); Py_CLEAR(st->parseerror_obj); Py_CLEAR(st->deepcopy_obj); Py_CLEAR(st->elementpath_obj); @@ -124,7 +130,7 @@ elementtree_clear(PyObject *m) static int elementtree_traverse(PyObject *m, visitproc visit, void *arg) { - elementtreestate *st = ET_STATE(m); + elementtreestate *st = get_elementtree_state(m); Py_VISIT(st->parseerror_obj); Py_VISIT(st->deepcopy_obj); Py_VISIT(st->elementpath_obj); @@ -170,7 +176,7 @@ is_empty_dict(PyObject *obj) typedef struct { - /* attributes (a dictionary object), or None if no attributes */ + /* attributes (a dictionary object), or NULL if no attributes */ PyObject* attrib; /* child elements */ @@ -209,7 +215,7 @@ typedef struct { } ElementObject; -#define Element_CheckExact(op) (Py_TYPE(op) == &Element_Type) +#define Element_CheckExact(op) Py_IS_TYPE(op, &Element_Type) #define Element_Check(op) PyObject_TypeCheck(op, &Element_Type) @@ -225,10 +231,7 @@ create_extra(ElementObject* self, PyObject* attrib) return -1; } - if (!attrib) - attrib = Py_None; - - Py_INCREF(attrib); + Py_XINCREF(attrib); self->extra->attrib = attrib; self->extra->length = 0; @@ -246,7 +249,7 @@ dealloc_extra(ElementObjectExtra *extra) if (!extra) return; - Py_DECREF(extra->attrib); + Py_XDECREF(extra->attrib); for (i = 0; i < extra->length; i++) Py_DECREF(extra->children[i]); @@ -300,7 +303,7 @@ create_new_element(PyObject* tag, PyObject* attrib) ALLOC(sizeof(ElementObject), "create element"); PyObject_GC_Track(self); - if (attrib != Py_None && !is_empty_dict(attrib)) { + if (attrib != NULL && !is_empty_dict(attrib)) { if (create_extra(self, attrib) < 0) { Py_DECREF(self); return NULL; @@ -530,13 +533,9 @@ element_get_attrib(ElementObject* self) PyObject* res = self->extra->attrib; - if (res == Py_None) { + if (!res) { /* create missing dictionary */ - res = PyDict_New(); - if (!res) - return NULL; - Py_DECREF(Py_None); - self->extra->attrib = res; + res = self->extra->attrib = PyDict_New(); } return res; @@ -616,12 +615,10 @@ subelement(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } else { /* no attrib arg, no kwds, so no attribute */ - Py_INCREF(Py_None); - attrib = Py_None; } elem = create_new_element(tag, attrib); - Py_DECREF(attrib); + Py_XDECREF(attrib); if (elem == NULL) return NULL; @@ -736,7 +733,7 @@ _elementtree_Element___copy___impl(ElementObject *self) ElementObject* element; element = (ElementObject*) create_new_element( - self->tag, (self->extra) ? self->extra->attrib : Py_None); + self->tag, self->extra ? self->extra->attrib : NULL); if (!element) return NULL; @@ -792,21 +789,20 @@ _elementtree_Element___deepcopy___impl(ElementObject *self, PyObject *memo) if (!tag) return NULL; - if (self->extra) { + if (self->extra && self->extra->attrib) { attrib = deepcopy(self->extra->attrib, memo); if (!attrib) { Py_DECREF(tag); return NULL; } } else { - Py_INCREF(Py_None); - attrib = Py_None; + attrib = NULL; } element = (ElementObject*) create_new_element(tag, attrib); Py_DECREF(tag); - Py_DECREF(attrib); + Py_XDECREF(attrib); if (!element) return NULL; @@ -963,7 +959,7 @@ _elementtree_Element___getstate___impl(ElementObject *self) PyList_SET_ITEM(children, i, child); } - if (self->extra && self->extra->attrib != Py_None) { + if (self->extra && self->extra->attrib) { attrib = self->extra->attrib; Py_INCREF(attrib); } @@ -1037,9 +1033,9 @@ element_setstate_from_attributes(ElementObject *self, assert(self->extra); assert(self->extra->allocated >= nchildren); if (oldextra) { - assert(self->extra->attrib == Py_None); + assert(self->extra->attrib == NULL); self->extra->attrib = oldextra->attrib; - oldextra->attrib = Py_None; + oldextra->attrib = NULL; } /* Copy children */ @@ -1065,10 +1061,8 @@ element_setstate_from_attributes(ElementObject *self, } /* Stash attrib. */ - if (attrib) { - Py_INCREF(attrib); - Py_XSETREF(self->extra->attrib, attrib); - } + Py_XINCREF(attrib); + Py_XSETREF(self->extra->attrib, attrib); dealloc_extra(oldextra); Py_RETURN_NONE; @@ -1138,7 +1132,7 @@ checkpath(PyObject* tag) if (PyUnicode_Check(tag)) { const Py_ssize_t len = PyUnicode_GET_LENGTH(tag); - void *data = PyUnicode_DATA(tag); + const void *data = PyUnicode_DATA(tag); unsigned int kind = PyUnicode_KIND(tag); if (len >= 3 && PyUnicode_READ(kind, data, 0) == '{' && ( PyUnicode_READ(kind, data, 1) == '}' || ( @@ -1159,7 +1153,7 @@ checkpath(PyObject* tag) return 0; } if (PyBytes_Check(tag)) { - char *p = PyBytes_AS_STRING(tag); + const char *p = PyBytes_AS_STRING(tag); const Py_ssize_t len = PyBytes_GET_SIZE(tag); if (len >= 3 && p[0] == '{' && ( p[1] == '}' || (p[1] == '*' && p[2] == '}'))) { @@ -1401,7 +1395,7 @@ _elementtree_Element_get_impl(ElementObject *self, PyObject *key, { PyObject* value; - if (!self->extra || self->extra->attrib == Py_None) + if (!self->extra || !self->extra->attrib) value = default_value; else { value = PyDict_GetItemWithError(self->extra->attrib, key); @@ -1417,42 +1411,6 @@ _elementtree_Element_get_impl(ElementObject *self, PyObject *key, return value; } -/*[clinic input] -_elementtree.Element.getchildren - -[clinic start generated code]*/ - -static PyObject * -_elementtree_Element_getchildren_impl(ElementObject *self) -/*[clinic end generated code: output=e50ffe118637b14f input=0f754dfded150d5f]*/ -{ - Py_ssize_t i; - PyObject* list; - - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "This method will be removed in future versions. " - "Use 'list(elem)' or iteration over elem instead.", - 1) < 0) { - return NULL; - } - - if (!self->extra) - return PyList_New(0); - - list = PyList_New(self->extra->length); - if (!list) - return NULL; - - for (i = 0; i < self->extra->length; i++) { - PyObject* item = self->extra->children[i]; - Py_INCREF(item); - PyList_SET_ITEM(list, i, item); - } - - return list; -} - - static PyObject * create_elementiter(ElementObject *self, PyObject *tag, int gettext); @@ -1483,27 +1441,6 @@ _elementtree_Element_iter_impl(ElementObject *self, PyObject *tag) } -/*[clinic input] -_elementtree.Element.getiterator - - tag: object = None - -[clinic start generated code]*/ - -static PyObject * -_elementtree_Element_getiterator_impl(ElementObject *self, PyObject *tag) -/*[clinic end generated code: output=cb69ff4a3742dfa1 input=500da1a03f7b9e28]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "This method will be removed in future versions. " - "Use 'tree.iter()' or 'list(tree.iter())' instead.", - 1) < 0) { - return NULL; - } - return _elementtree_Element_iter_impl(self, tag); -} - - /*[clinic input] _elementtree.Element.itertext @@ -1586,7 +1523,7 @@ static PyObject * _elementtree_Element_items_impl(ElementObject *self) /*[clinic end generated code: output=6db2c778ce3f5a4d input=adbe09aaea474447]*/ { - if (!self->extra || self->extra->attrib == Py_None) + if (!self->extra || !self->extra->attrib) return PyList_New(0); return PyDict_Items(self->extra->attrib); @@ -1601,7 +1538,7 @@ static PyObject * _elementtree_Element_keys_impl(ElementObject *self) /*[clinic end generated code: output=bc5bfabbf20eeb3c input=f02caf5b496b5b0b]*/ { - if (!self->extra || self->extra->attrib == Py_None) + if (!self->extra || !self->extra->attrib) return PyList_New(0); return PyDict_Keys(self->extra->attrib); @@ -1620,7 +1557,7 @@ element_length(ElementObject* self) _elementtree.Element.makeelement tag: object - attrib: object + attrib: object(subclass_of='&PyDict_Type') / [clinic start generated code]*/ @@ -1628,7 +1565,7 @@ _elementtree.Element.makeelement static PyObject * _elementtree_Element_makeelement_impl(ElementObject *self, PyObject *tag, PyObject *attrib) -/*[clinic end generated code: output=4109832d5bb789ef input=9480d1d2e3e68235]*/ +/*[clinic end generated code: output=4109832d5bb789ef input=2279d974529c3861]*/ { PyObject* elem; @@ -2100,12 +2037,18 @@ static int element_attrib_setter(ElementObject *self, PyObject *value, void *closure) { _VALIDATE_ATTR_VALUE(value); + if (!PyDict_Check(value)) { + PyErr_Format(PyExc_TypeError, + "attrib must be dict, not %.200s", + value->ob_type->tp_name); + return -1; + } if (!self->extra) { if (create_extra(self, NULL) < 0) return -1; } Py_INCREF(value); - Py_SETREF(self->extra->attrib, value); + Py_XSETREF(self->extra->attrib, value); return 0; } @@ -2365,8 +2308,6 @@ create_elementiter(ElementObject *self, PyObject *tag, int gettext) Py_INCREF(self); it->root_element = self; - PyObject_GC_Track(it); - it->parent_stack = PyMem_New(ParentLocator, INIT_PARENT_STACK_SIZE); if (it->parent_stack == NULL) { Py_DECREF(it); @@ -2376,6 +2317,8 @@ create_elementiter(ElementObject *self, PyObject *tag, int gettext) it->parent_stack_used = 0; it->parent_stack_size = INIT_PARENT_STACK_SIZE; + PyObject_GC_Track(it); + return (PyObject *)it; } @@ -2414,7 +2357,7 @@ typedef struct { char insert_pis; } TreeBuilderObject; -#define TreeBuilder_CheckExact(op) (Py_TYPE(op) == &TreeBuilder_Type) +#define TreeBuilder_CheckExact(op) Py_IS_TYPE((op), &TreeBuilder_Type) /* -------------------------------------------------------------------- */ /* constructor and destructor */ @@ -2702,7 +2645,7 @@ treebuilder_add_subelement(PyObject *element, PyObject *child) } else { PyObject *res; - res = _PyObject_CallMethodIdObjArgs(element, &PyId_append, child, NULL); + res = _PyObject_CallMethodIdOneArg(element, &PyId_append, child); if (res == NULL) return -1; Py_DECREF(res); @@ -2719,7 +2662,7 @@ treebuilder_append_event(TreeBuilderObject *self, PyObject *action, PyObject *event = PyTuple_Pack(2, action, node); if (event == NULL) return -1; - res = _PyObject_FastCall(self->events_append, &event, 1); + res = PyObject_CallOneArg(self->events_append, event); Py_DECREF(event); if (res == NULL) return -1; @@ -2745,7 +2688,7 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag, if (!self->element_factory) { node = create_new_element(tag, attrib); - } else if (attrib == Py_None) { + } else if (attrib == NULL) { attrib = PyDict_New(); if (!attrib) return NULL; @@ -2885,7 +2828,7 @@ treebuilder_handle_comment(TreeBuilderObject* self, PyObject* text) } if (self->comment_factory) { - comment = _PyObject_FastCall(self->comment_factory, &text, 1); + comment = PyObject_CallOneArg(self->comment_factory, text); if (!comment) return NULL; @@ -3086,7 +3029,7 @@ _elementtree_TreeBuilder_close_impl(TreeBuilderObject *self) _elementtree.TreeBuilder.start tag: object - attrs: object = None + attrs: object(subclass_of='&PyDict_Type') / [clinic start generated code]*/ @@ -3094,7 +3037,7 @@ _elementtree.TreeBuilder.start static PyObject * _elementtree_TreeBuilder_start_impl(TreeBuilderObject *self, PyObject *tag, PyObject *attrs) -/*[clinic end generated code: output=e7e9dc2861349411 input=95fc1758dd042c65]*/ +/*[clinic end generated code: output=e7e9dc2861349411 input=7288e9e38e63b2b6]*/ { return treebuilder_handle_start(self, tag, attrs); } @@ -3227,7 +3170,7 @@ expat_set_error(enum XML_Error error_code, Py_ssize_t line, Py_ssize_t column, if (errmsg == NULL) return; - error = _PyObject_FastCall(st->parseerror_obj, &errmsg, 1); + error = PyObject_CallOneArg(st->parseerror_obj, errmsg); Py_DECREF(errmsg); if (!error) return; @@ -3290,7 +3233,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in, (TreeBuilderObject*) self->target, value ); else if (self->handle_data) - res = _PyObject_FastCall(self->handle_data, &value, 1); + res = PyObject_CallOneArg(self->handle_data, value); else res = NULL; Py_XDECREF(res); @@ -3354,8 +3297,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, attrib_in += 2; } } else { - Py_INCREF(Py_None); - attrib = Py_None; + attrib = NULL; } if (TreeBuilder_CheckExact(self->target)) { @@ -3364,8 +3306,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, tag, attrib); } else if (self->handle_start) { - if (attrib == Py_None) { - Py_DECREF(attrib); + if (attrib == NULL) { attrib = PyDict_New(); if (!attrib) { Py_DECREF(tag); @@ -3378,7 +3319,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, res = NULL; Py_DECREF(tag); - Py_DECREF(attrib); + Py_XDECREF(attrib); Py_XDECREF(res); } @@ -3401,7 +3342,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in, /* shortcut */ res = treebuilder_handle_data((TreeBuilderObject*) self->target, data); else if (self->handle_data) - res = _PyObject_FastCall(self->handle_data, &data, 1); + res = PyObject_CallOneArg(self->handle_data, data); else res = NULL; @@ -3428,7 +3369,7 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in) else if (self->handle_end) { tag = makeuniversal(self, tag_in); if (tag) { - res = _PyObject_FastCall(self->handle_end, &tag, 1); + res = PyObject_CallOneArg(self->handle_end, tag); Py_DECREF(tag); } } @@ -3515,7 +3456,7 @@ expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in) if (!prefix) return; - res = _PyObject_FastCall(self->handle_end_ns, &prefix, 1); + res = PyObject_CallOneArg(self->handle_end_ns, prefix); Py_DECREF(prefix); } @@ -3547,7 +3488,7 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in) if (!comment) return; - res = _PyObject_FastCall(self->handle_comment, &comment, 1); + res = PyObject_CallOneArg(self->handle_comment, comment); Py_XDECREF(res); Py_DECREF(comment); } @@ -3938,7 +3879,7 @@ _elementtree_XMLParser_close_impl(XMLParserObject *self) } else if (self->handle_close) { Py_DECREF(res); - return _PyObject_CallNoArg(self->handle_close); + return PyObject_CallNoArgs(self->handle_close); } else { return res; @@ -4235,9 +4176,6 @@ static PyMethodDef element_methods[] = { _ELEMENTTREE_ELEMENT_ITERTEXT_METHODDEF _ELEMENTTREE_ELEMENT_ITERFIND_METHODDEF - _ELEMENTTREE_ELEMENT_GETITERATOR_METHODDEF - _ELEMENTTREE_ELEMENT_GETCHILDREN_METHODDEF - _ELEMENTTREE_ELEMENT_ITEMS_METHODDEF _ELEMENTTREE_ELEMENT_KEYS_METHODDEF @@ -4469,7 +4407,7 @@ PyInit__elementtree(void) m = PyModule_Create(&elementtreemodule); if (!m) return NULL; - st = ET_STATE(m); + st = get_elementtree_state(m); if (!(temp = PyImport_ImportModule("copy"))) return NULL; @@ -4505,16 +4443,22 @@ PyInit__elementtree(void) "xml.etree.ElementTree.ParseError", PyExc_SyntaxError, NULL ); Py_INCREF(st->parseerror_obj); - PyModule_AddObject(m, "ParseError", st->parseerror_obj); - - Py_INCREF((PyObject *)&Element_Type); - PyModule_AddObject(m, "Element", (PyObject *)&Element_Type); + if (PyModule_AddObject(m, "ParseError", st->parseerror_obj) < 0) { + Py_DECREF(st->parseerror_obj); + return NULL; + } - Py_INCREF((PyObject *)&TreeBuilder_Type); - PyModule_AddObject(m, "TreeBuilder", (PyObject *)&TreeBuilder_Type); + PyTypeObject *types[] = { + &Element_Type, + &TreeBuilder_Type, + &XMLParser_Type + }; - Py_INCREF((PyObject *)&XMLParser_Type); - PyModule_AddObject(m, "XMLParser", (PyObject *)&XMLParser_Type); + for (size_t i = 0; i < Py_ARRAY_LENGTH(types); i++) { + if (PyModule_AddType(m, types[i]) < 0) { + return NULL; + } + } return m; } diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index a101363b..d158d3ba 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -1,8 +1,7 @@ #include "Python.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tupleobject.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef /* _functools module written and maintained by Hye-Shik Chang @@ -18,13 +17,15 @@ typedef struct { PyObject *fn; PyObject *args; PyObject *kw; - PyObject *dict; + PyObject *dict; /* __dict__ */ PyObject *weakreflist; /* List of weak references */ - int use_fastcall; + vectorcallfunc vectorcall; } partialobject; static PyTypeObject partial_type; +static void partial_setvectorcall(partialobject *pto); + static PyObject * partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) { @@ -39,7 +40,7 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) pargs = pkw = NULL; func = PyTuple_GET_ITEM(args, 0); - if (Py_TYPE(func) == &partial_type && type == &partial_type) { + if (Py_IS_TYPE(func, &partial_type) && type == &partial_type) { partialobject *part = (partialobject *)func; if (part->dict == NULL) { pargs = part->args; @@ -107,8 +108,7 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) return NULL; } - pto->use_fastcall = (_PyVectorcall_Function(func) != NULL); - + partial_setvectorcall(pto); return (PyObject *)pto; } @@ -126,77 +126,114 @@ partial_dealloc(partialobject *pto) Py_TYPE(pto)->tp_free(pto); } + +/* Merging keyword arguments using the vectorcall convention is messy, so + * if we would need to do that, we stop using vectorcall and fall back + * to using partial_call() instead. */ +_Py_NO_INLINE static PyObject * +partial_vectorcall_fallback(PyThreadState *tstate, partialobject *pto, + PyObject *const *args, size_t nargsf, + PyObject *kwnames) +{ + pto->vectorcall = NULL; + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + return _PyObject_MakeTpCall(tstate, (PyObject *)pto, + args, nargs, kwnames); +} + static PyObject * -partial_fastcall(partialobject *pto, PyObject **args, Py_ssize_t nargs, - PyObject *kwargs) +partial_vectorcall(partialobject *pto, PyObject *const *args, + size_t nargsf, PyObject *kwnames) { - PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; - PyObject *ret; - PyObject **stack, **stack_buf = NULL; - Py_ssize_t nargs2, pto_nargs; + PyThreadState *tstate = _PyThreadState_GET(); - pto_nargs = PyTuple_GET_SIZE(pto->args); - nargs2 = pto_nargs + nargs; + /* pto->kw is mutable, so need to check every time */ + if (PyDict_GET_SIZE(pto->kw)) { + return partial_vectorcall_fallback(tstate, pto, args, nargsf, kwnames); + } - if (pto_nargs == 0) { - stack = args; + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + Py_ssize_t nargs_total = nargs; + if (kwnames != NULL) { + nargs_total += PyTuple_GET_SIZE(kwnames); } - else if (nargs == 0) { - stack = _PyTuple_ITEMS(pto->args); + + PyObject **pto_args = _PyTuple_ITEMS(pto->args); + Py_ssize_t pto_nargs = PyTuple_GET_SIZE(pto->args); + + /* Fast path if we're called without arguments */ + if (nargs_total == 0) { + return _PyObject_VectorcallTstate(tstate, pto->fn, + pto_args, pto_nargs, NULL); + } + + /* Fast path using PY_VECTORCALL_ARGUMENTS_OFFSET to prepend a single + * positional argument */ + if (pto_nargs == 1 && (nargsf & PY_VECTORCALL_ARGUMENTS_OFFSET)) { + PyObject **newargs = (PyObject **)args - 1; + PyObject *tmp = newargs[0]; + newargs[0] = pto_args[0]; + PyObject *ret = _PyObject_VectorcallTstate(tstate, pto->fn, + newargs, nargs + 1, kwnames); + newargs[0] = tmp; + return ret; + } + + Py_ssize_t newnargs_total = pto_nargs + nargs_total; + + PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; + PyObject *ret; + PyObject **stack; + + if (newnargs_total <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { + stack = small_stack; } else { - if (nargs2 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { - stack = small_stack; - } - else { - stack_buf = PyMem_Malloc(nargs2 * sizeof(PyObject *)); - if (stack_buf == NULL) { - PyErr_NoMemory(); - return NULL; - } - stack = stack_buf; + stack = PyMem_Malloc(newnargs_total * sizeof(PyObject *)); + if (stack == NULL) { + PyErr_NoMemory(); + return NULL; } - - /* use borrowed references */ - memcpy(stack, - _PyTuple_ITEMS(pto->args), - pto_nargs * sizeof(PyObject*)); - memcpy(&stack[pto_nargs], - args, - nargs * sizeof(PyObject*)); } - ret = _PyObject_FastCallDict(pto->fn, stack, nargs2, kwargs); - PyMem_Free(stack_buf); + /* Copy to new stack, using borrowed references */ + memcpy(stack, pto_args, pto_nargs * sizeof(PyObject*)); + memcpy(stack + pto_nargs, args, nargs_total * sizeof(PyObject*)); + + ret = _PyObject_VectorcallTstate(tstate, pto->fn, + stack, pto_nargs + nargs, kwnames); + if (stack != small_stack) { + PyMem_Free(stack); + } return ret; } -static PyObject * -partial_call_impl(partialobject *pto, PyObject *args, PyObject *kwargs) +/* Set pto->vectorcall depending on the parameters of the partial object */ +static void +partial_setvectorcall(partialobject *pto) { - PyObject *ret, *args2; - - /* Note: tupleconcat() is optimized for empty tuples */ - args2 = PySequence_Concat(pto->args, args); - if (args2 == NULL) { - return NULL; + if (PyVectorcall_Function(pto->fn) == NULL) { + /* Don't use vectorcall if the underlying function doesn't support it */ + pto->vectorcall = NULL; + } + /* We could have a special case if there are no arguments, + * but that is unlikely (why use partial without arguments?), + * so we don't optimize that */ + else { + pto->vectorcall = (vectorcallfunc)partial_vectorcall; } - assert(PyTuple_Check(args2)); - - ret = PyObject_Call(pto->fn, args2, kwargs); - Py_DECREF(args2); - return ret; } + static PyObject * partial_call(partialobject *pto, PyObject *args, PyObject *kwargs) { - PyObject *kwargs2, *res; - - assert (PyCallable_Check(pto->fn)); - assert (PyTuple_Check(pto->args)); - assert (PyDict_Check(pto->kw)); + assert(PyCallable_Check(pto->fn)); + assert(PyTuple_Check(pto->args)); + assert(PyDict_Check(pto->kw)); + /* Merge keywords */ + PyObject *kwargs2; if (PyDict_GET_SIZE(pto->kw) == 0) { /* kwargs can be NULL */ kwargs2 = kwargs; @@ -219,16 +256,16 @@ partial_call(partialobject *pto, PyObject *args, PyObject *kwargs) } } - - if (pto->use_fastcall) { - res = partial_fastcall(pto, - _PyTuple_ITEMS(args), - PyTuple_GET_SIZE(args), - kwargs2); - } - else { - res = partial_call_impl(pto, args, kwargs2); + /* Merge positional arguments */ + /* Note: tupleconcat() is optimized for empty tuples */ + PyObject *args2 = PySequence_Concat(pto->args, args); + if (args2 == NULL) { + Py_XDECREF(kwargs2); + return NULL; } + + PyObject *res = PyObject_Call(pto->fn, args2, kwargs2); + Py_DECREF(args2); Py_XDECREF(kwargs2); return res; } @@ -365,17 +402,19 @@ partial_setstate(partialobject *pto, PyObject *state) Py_INCREF(dict); Py_INCREF(fn); - pto->use_fastcall = (_PyVectorcall_Function(fn) != NULL); Py_SETREF(pto->fn, fn); Py_SETREF(pto->args, fnargs); Py_SETREF(pto->kw, kw); Py_XSETREF(pto->dict, dict); + partial_setvectorcall(pto); Py_RETURN_NONE; } static PyMethodDef partial_methods[] = { {"__reduce__", (PyCFunction)partial_reduce, METH_NOARGS}, {"__setstate__", (PyCFunction)partial_setstate, METH_O}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -386,7 +425,7 @@ static PyTypeObject partial_type = { 0, /* tp_itemsize */ /* methods */ (destructor)partial_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ + offsetof(partialobject, vectorcall),/* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ @@ -401,7 +440,8 @@ static PyTypeObject partial_type = { PyObject_GenericSetAttr, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ partial_doc, /* tp_doc */ (traverseproc)partial_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -534,7 +574,7 @@ keyobject_richcompare(PyObject *ko, PyObject *other, int op) PyObject *answer; PyObject* stack[2]; - if (Py_TYPE(other) != &keyobject_type){ + if (!Py_IS_TYPE(other, &keyobject_type)) { PyErr_Format(PyExc_TypeError, "other argument must be K instance"); return NULL; } @@ -610,7 +650,7 @@ functools_reduce(PyObject *self, PyObject *args) for (;;) { PyObject *op2; - if (args->ob_refcnt > 1) { + if (Py_REFCNT(args) > 1) { Py_DECREF(args); if ((args = PyTuple_New(2)) == NULL) goto Fail; @@ -627,7 +667,7 @@ functools_reduce(PyObject *self, PyObject *args) result = op2; else { /* Update the args tuple in-place */ - assert(args->ob_refcnt == 1); + assert(Py_REFCNT(args) == 1); Py_XSETREF(_PyTuple_ITEMS(args)[0], result); Py_XSETREF(_PyTuple_ITEMS(args)[1], op2); if ((result = PyObject_Call(func, args, NULL)) == NULL) { @@ -743,6 +783,7 @@ typedef struct lru_cache_object { Py_ssize_t misses; PyObject *cache_info_type; PyObject *dict; + PyObject *weakreflist; } lru_cache_object; static PyTypeObject lru_cache_type; @@ -1155,6 +1196,8 @@ lru_cache_new(PyTypeObject *type, PyObject *args, PyObject *kw) obj->maxsize = maxsize; Py_INCREF(cache_info_type); obj->cache_info_type = cache_info_type; + obj->dict = NULL; + obj->weakreflist = NULL; return (PyObject *)obj; } @@ -1186,6 +1229,8 @@ lru_cache_dealloc(lru_cache_object *obj) lru_list_elem *list; /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(obj); + if (obj->weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject*)obj); list = lru_cache_unlink_list(obj); Py_XDECREF(obj->cache); @@ -1343,7 +1388,8 @@ static PyTypeObject lru_cache_type = { (traverseproc)lru_cache_tp_traverse,/* tp_traverse */ (inquiry)lru_cache_tp_clear, /* tp_clear */ 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ + offsetof(lru_cache_object, weakreflist), + /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ lru_cache_methods, /* tp_methods */ @@ -1361,10 +1407,10 @@ static PyTypeObject lru_cache_type = { /* module level code ********************************************************/ -PyDoc_STRVAR(module_doc, +PyDoc_STRVAR(_functools_doc, "Tools that operate on functions."); -static PyMethodDef module_methods[] = { +static PyMethodDef _functools_methods[] = { {"reduce", functools_reduce, METH_VARARGS, functools_reduce_doc}, {"cmp_to_key", (PyCFunction)(void(*)(void))functools_cmp_to_key, METH_VARARGS | METH_KEYWORDS, functools_cmp_to_key_doc}, @@ -1372,53 +1418,56 @@ static PyMethodDef module_methods[] = { }; static void -module_free(void *m) +_functools_free(void *m) { - Py_CLEAR(kwd_mark); + // FIXME: Do not clear kwd_mark to avoid NULL pointer dereferencing if we have + // other modules instances that could use it. Will fix when PEP-573 land + // and we could move kwd_mark to a per-module state. + // Py_CLEAR(kwd_mark); } -static struct PyModuleDef _functoolsmodule = { - PyModuleDef_HEAD_INIT, - "_functools", - module_doc, - -1, - module_methods, - NULL, - NULL, - NULL, - module_free, -}; - -PyMODINIT_FUNC -PyInit__functools(void) +static int +_functools_exec(PyObject *module) { - int i; - PyObject *m; - const char *name; PyTypeObject *typelist[] = { &partial_type, - &lru_cache_type, - NULL + &lru_cache_type }; - m = PyModule_Create(&_functoolsmodule); - if (m == NULL) - return NULL; - - kwd_mark = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type); if (!kwd_mark) { - Py_DECREF(m); - return NULL; + kwd_mark = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type); + if (!kwd_mark) { + return -1; + } } - for (i=0 ; typelist[i] != NULL ; i++) { - if (PyType_Ready(typelist[i]) < 0) { - Py_DECREF(m); - return NULL; + for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) { + if (PyModule_AddType(module, typelist[i]) < 0) { + return -1; } - name = _PyType_Name(typelist[i]); - Py_INCREF(typelist[i]); - PyModule_AddObject(m, name, (PyObject *)typelist[i]); } - return m; + return 0; +} + +static struct PyModuleDef_Slot _functools_slots[] = { + {Py_mod_exec, _functools_exec}, + {0, NULL} +}; + +static struct PyModuleDef _functools_module = { + PyModuleDef_HEAD_INIT, + "_functools", + _functools_doc, + 0, + _functools_methods, + _functools_slots, + NULL, + NULL, + _functools_free, +}; + +PyMODINIT_FUNC +PyInit__functools(void) +{ + return PyModuleDef_Init(&_functools_module); } diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index 77e78875..dd4c6b16 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -36,7 +36,7 @@ values() methods are not supported."); typedef struct { PyObject_HEAD - int di_size; /* -1 means recompute */ + Py_ssize_t di_size; /* -1 means recompute */ GDBM_FILE di_dbm; } dbmobject; @@ -44,7 +44,7 @@ static PyTypeObject Dbmtype; #include "clinic/_gdbmmodule.c.h" -#define is_dbmobject(v) (Py_TYPE(v) == &Dbmtype) +#define is_dbmobject(v) Py_IS_TYPE(v, &Dbmtype) #define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \ { PyErr_SetString(DbmError, "GDBM object has already been closed"); \ return NULL; } @@ -102,19 +102,39 @@ dbm_length(dbmobject *dp) return -1; } if (dp->di_size < 0) { +#if GDBM_VERSION_MAJOR >= 1 && GDBM_VERSION_MINOR >= 11 + errno = 0; + gdbm_count_t count; + if (gdbm_count(dp->di_dbm, &count) == -1) { + if (errno != 0) { + PyErr_SetFromErrno(DbmError); + } + else { + PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno)); + } + return -1; + } + if (count > PY_SSIZE_T_MAX) { + PyErr_SetString(PyExc_OverflowError, "count exceeds PY_SSIZE_T_MAX"); + return -1; + } + dp->di_size = count; +#else datum key,okey; - int size; okey.dsize=0; okey.dptr=NULL; - size = 0; - for (key=gdbm_firstkey(dp->di_dbm); key.dptr; + Py_ssize_t size = 0; + for (key = gdbm_firstkey(dp->di_dbm); key.dptr; key = gdbm_nextkey(dp->di_dbm,okey)) { size++; - if(okey.dsize) free(okey.dptr); + if (okey.dsize) { + free(okey.dptr); + } okey=key; } dp->di_size = size; +#endif } return dp->di_size; } @@ -349,7 +369,7 @@ dbm_contains(PyObject *self, PyObject *arg) else if (!PyBytes_Check(arg)) { PyErr_Format(PyExc_TypeError, "gdbm key must be bytes or string, not %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return -1; } else { @@ -497,7 +517,7 @@ static PyObject * dbm__exit__(PyObject *self, PyObject *args) { _Py_IDENTIFIER(close); - return _PyObject_CallMethodId(self, &PyId_close, NULL); + return _PyObject_CallMethodIdNoArgs(self, &PyId_close); } static PyMethodDef dbm_methods[] = { diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index edadbcb3..adc86537 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -14,7 +14,6 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" #include "hashlib.h" #include "pystrhex.h" @@ -22,10 +21,13 @@ /* EVP is the preferred interface to hashing in OpenSSL */ #include #include +#include /* We use the object interface to discover what hashes OpenSSL supports. */ #include #include "openssl/err.h" +#include // FIPS_mode() + #ifndef OPENSSL_THREADS # error "OPENSSL_THREADS is not defined, Python requires thread-safe OpenSSL" #endif @@ -34,6 +36,32 @@ /* OpenSSL < 1.1.0 */ #define EVP_MD_CTX_new EVP_MD_CTX_create #define EVP_MD_CTX_free EVP_MD_CTX_destroy + +HMAC_CTX * +HMAC_CTX_new(void) +{ + HMAC_CTX *ctx = OPENSSL_malloc(sizeof(HMAC_CTX)); + if (ctx != NULL) { + memset(ctx, 0, sizeof(HMAC_CTX)); + HMAC_CTX_init(ctx); + } + return ctx; +} + +void +HMAC_CTX_free(HMAC_CTX *ctx) +{ + if (ctx != NULL) { + HMAC_CTX_cleanup(ctx); + OPENSSL_free(ctx); + } +} + +const EVP_MD * +HMAC_CTX_get_md(const HMAC_CTX *ctx) +{ + return ctx->md; +} #endif #define MUNCH_SIZE INT_MAX @@ -50,21 +78,44 @@ #define PY_OPENSSL_HAS_BLAKE2 1 #endif +static PyModuleDef _hashlibmodule; + +typedef struct { + PyTypeObject *EVPtype; + PyTypeObject *HMACtype; +#ifdef PY_OPENSSL_HAS_SHAKE + PyTypeObject *EVPXOFtype; +#endif +} _hashlibstate; + +static inline _hashlibstate* +get_hashlib_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_hashlibstate *)state; +} + typedef struct { PyObject_HEAD EVP_MD_CTX *ctx; /* OpenSSL message digest context */ PyThread_type_lock lock; /* OpenSSL context lock */ } EVPobject; - -static PyTypeObject EVPtype; +typedef struct { + PyObject_HEAD + HMAC_CTX *ctx; /* OpenSSL hmac context */ + PyThread_type_lock lock; /* HMAC context lock */ +} HMACobject; #include "clinic/_hashopenssl.c.h" /*[clinic input] module _hashlib -class _hashlib.HASH "EVPobject *" "&EVPtype" +class _hashlib.HASH "EVPobject *" "((_hashlibstate *)PyModule_GetState(module))->EVPtype" +class _hashlib.HASHXOF "EVPobject *" "((_hashlibstate *)PyModule_GetState(module))->EVPXOFtype" +class _hashlib.HMAC "HMACobject *" "((_hashlibstate *)PyModule_GetState(module))->HMACtype" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a881a5092eecad28]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=7df1bcf6f75cb8ef]*/ /* LCOV_EXCL_START */ @@ -98,6 +149,15 @@ _setException(PyObject *exc) } /* LCOV_EXCL_STOP */ +/* {Py_tp_new, NULL} doesn't block __new__ */ +static PyObject * +_disabled_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyErr_Format(PyExc_TypeError, + "cannot create '%.100s' instances", _PyType_Name(type)); + return NULL; +} + static PyObject* py_digest_name(const EVP_MD *md) { @@ -233,9 +293,9 @@ py_digest_by_name(const char *name) } static EVPobject * -newEVPobject(void) +newEVPobject(PyTypeObject *type) { - EVPobject *retval = (EVPobject *)PyObject_New(EVPobject, &EVPtype); + EVPobject *retval = (EVPobject *)PyObject_New(EVPobject, type); if (retval == NULL) { return NULL; } @@ -277,10 +337,12 @@ EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len) static void EVP_dealloc(EVPobject *self) { + PyTypeObject *tp = Py_TYPE(self); if (self->lock != NULL) PyThread_free_lock(self->lock); EVP_MD_CTX_free(self->ctx); PyObject_Del(self); + Py_DECREF(tp); } static int @@ -307,7 +369,7 @@ EVP_copy_impl(EVPobject *self) { EVPobject *newobj; - if ( (newobj = newEVPobject())==NULL) + if ((newobj = newEVPobject(Py_TYPE(self))) == NULL) return NULL; if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) { @@ -482,7 +544,8 @@ EVP_repr(EVPobject *self) if (!name_obj) { return NULL; } - repr = PyUnicode_FromFormat("<%U HASH object @ %p>", name_obj, self); + repr = PyUnicode_FromFormat("<%U %s object @ %p>", + name_obj, Py_TYPE(self)->tp_name, self); Py_DECREF(name_obj); return repr; } @@ -505,61 +568,206 @@ PyDoc_STRVAR(hashtype_doc, "name -- the hash algorithm being used by this object\n" "digest_size -- number of bytes in this hashes output"); -static PyTypeObject EVPtype = { - PyVarObject_HEAD_INIT(NULL, 0) +static PyType_Slot EVPtype_slots[] = { + {Py_tp_dealloc, EVP_dealloc}, + {Py_tp_repr, EVP_repr}, + {Py_tp_doc, (char *)hashtype_doc}, + {Py_tp_methods, EVP_methods}, + {Py_tp_getset, EVP_getseters}, + {Py_tp_new, _disabled_new}, + {0, 0}, +}; + +static PyType_Spec EVPtype_spec = { "_hashlib.HASH", /*tp_name*/ sizeof(EVPobject), /*tp_basicsize*/ 0, /*tp_itemsize*/ - /* methods */ - (destructor)EVP_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - (reprfunc)EVP_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - hashtype_doc, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - EVP_methods, /* tp_methods */ - NULL, /* tp_members */ - EVP_getseters, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + EVPtype_slots +}; + +#ifdef PY_OPENSSL_HAS_SHAKE + +/*[clinic input] +_hashlib.HASHXOF.digest as EVPXOF_digest + + length: Py_ssize_t + +Return the digest value as a bytes object. +[clinic start generated code]*/ + +static PyObject * +EVPXOF_digest_impl(EVPobject *self, Py_ssize_t length) +/*[clinic end generated code: output=ef9320c23280efad input=816a6537cea3d1db]*/ +{ + EVP_MD_CTX *temp_ctx; + PyObject *retval = PyBytes_FromStringAndSize(NULL, length); + + if (retval == NULL) { + return NULL; + } + + temp_ctx = EVP_MD_CTX_new(); + if (temp_ctx == NULL) { + Py_DECREF(retval); + PyErr_NoMemory(); + return NULL; + } + + if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) { + Py_DECREF(retval); + EVP_MD_CTX_free(temp_ctx); + return _setException(PyExc_ValueError); + } + if (!EVP_DigestFinalXOF(temp_ctx, + (unsigned char*)PyBytes_AS_STRING(retval), + length)) { + Py_DECREF(retval); + EVP_MD_CTX_free(temp_ctx); + _setException(PyExc_ValueError); + return NULL; + } + + EVP_MD_CTX_free(temp_ctx); + return retval; +} + +/*[clinic input] +_hashlib.HASHXOF.hexdigest as EVPXOF_hexdigest + + length: Py_ssize_t + +Return the digest value as a string of hexadecimal digits. +[clinic start generated code]*/ + +static PyObject * +EVPXOF_hexdigest_impl(EVPobject *self, Py_ssize_t length) +/*[clinic end generated code: output=eb3e6ee7788bf5b2 input=5f9d6a8f269e34df]*/ +{ + unsigned char *digest; + EVP_MD_CTX *temp_ctx; + PyObject *retval; + + digest = (unsigned char*)PyMem_Malloc(length); + if (digest == NULL) { + PyErr_NoMemory(); + return NULL; + } + + temp_ctx = EVP_MD_CTX_new(); + if (temp_ctx == NULL) { + PyMem_Free(digest); + PyErr_NoMemory(); + return NULL; + } + + /* Get the raw (binary) digest value */ + if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) { + PyMem_Free(digest); + EVP_MD_CTX_free(temp_ctx); + return _setException(PyExc_ValueError); + } + if (!EVP_DigestFinalXOF(temp_ctx, digest, length)) { + PyMem_Free(digest); + EVP_MD_CTX_free(temp_ctx); + _setException(PyExc_ValueError); + return NULL; + } + + EVP_MD_CTX_free(temp_ctx); + + retval = _Py_strhex((const char *)digest, length); + PyMem_Free(digest); + return retval; +} + +static PyMethodDef EVPXOF_methods[] = { + EVPXOF_DIGEST_METHODDEF + EVPXOF_HEXDIGEST_METHODDEF + {NULL, NULL} /* sentinel */ +}; + + +static PyObject * +EVPXOF_get_digest_size(EVPobject *self, void *closure) +{ + return PyLong_FromLong(0); +} + +static PyGetSetDef EVPXOF_getseters[] = { + {"digest_size", + (getter)EVPXOF_get_digest_size, NULL, + NULL, + NULL}, + {NULL} /* Sentinel */ +}; + +PyDoc_STRVAR(hashxoftype_doc, +"HASHXOF(name, string=b\'\')\n" +"--\n" +"\n" +"A hash is an object used to calculate a checksum of a string of information.\n" +"\n" +"Methods:\n" +"\n" +"update() -- updates the current digest with an additional string\n" +"digest(length) -- return the current digest value\n" +"hexdigest(length) -- return the current digest as a string of hexadecimal digits\n" +"copy() -- return a copy of the current hash object\n" +"\n" +"Attributes:\n" +"\n" +"name -- the hash algorithm being used by this object\n" +"digest_size -- number of bytes in this hashes output"); + +static PyType_Slot EVPXOFtype_slots[] = { + {Py_tp_doc, (char *)hashxoftype_doc}, + {Py_tp_methods, EVPXOF_methods}, + {Py_tp_getset, EVPXOF_getseters}, + {Py_tp_new, _disabled_new}, + {0, 0}, +}; + +static PyType_Spec EVPXOFtype_spec = { + "_hashlib.HASHXOF", /*tp_name*/ + sizeof(EVPobject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + EVPXOFtype_slots }; -\ + +#endif + static PyObject * -EVPnew(const EVP_MD *digest, - const unsigned char *cp, Py_ssize_t len) +EVPnew(PyObject *module, const EVP_MD *digest, + const unsigned char *cp, Py_ssize_t len, int usedforsecurity) { int result = 0; EVPobject *self; + PyTypeObject *type = get_hashlib_state(module)->EVPtype; if (!digest) { PyErr_SetString(PyExc_ValueError, "unsupported hash type"); return NULL; } - if ((self = newEVPobject()) == NULL) +#ifdef PY_OPENSSL_HAS_SHAKE + if ((EVP_MD_flags(digest) & EVP_MD_FLAG_XOF) == EVP_MD_FLAG_XOF) { + type = get_hashlib_state(module)->EVPXOFtype; + } +#endif + + if ((self = newEVPobject(type)) == NULL) return NULL; + if (!usedforsecurity) { +#ifdef EVP_MD_CTX_FLAG_NON_FIPS_ALLOW + EVP_MD_CTX_set_flags(self->ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); +#endif + } + + if (!EVP_DigestInit_ex(self->ctx, digest, NULL)) { _setException(PyExc_ValueError); Py_DECREF(self); @@ -591,6 +799,8 @@ _hashlib.new as EVP_new name as name_obj: object string as data_obj: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new hash object using the named algorithm. @@ -601,13 +811,14 @@ The MD5 and SHA1 algorithms are always supported. [clinic start generated code]*/ static PyObject * -EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj) -/*[clinic end generated code: output=9e7cf664e04b0226 input=7eb79bf30058bd02]*/ +EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=ddd5053f92dffe90 input=c24554d0337be1b0]*/ { Py_buffer view = { 0 }; PyObject *ret_obj; char *name; - const EVP_MD *digest; + const EVP_MD *digest = NULL; if (!PyArg_Parse(name_obj, "s", &name)) { PyErr_SetString(PyExc_TypeError, "name must be a string"); @@ -619,7 +830,9 @@ EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj) digest = py_digest_by_name(name); - ret_obj = EVPnew(digest, (unsigned char*)view.buf, view.len); + ret_obj = EVPnew(module, digest, + (unsigned char*)view.buf, view.len, + usedforsecurity); if (data_obj) PyBuffer_Release(&view); @@ -627,7 +840,8 @@ EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj) } static PyObject* -EVP_fast_new(PyObject *module, PyObject *data_obj, const EVP_MD *digest) +EVP_fast_new(PyObject *module, PyObject *data_obj, const EVP_MD *digest, + int usedforsecurity) { Py_buffer view = { 0 }; PyObject *ret_obj; @@ -635,7 +849,9 @@ EVP_fast_new(PyObject *module, PyObject *data_obj, const EVP_MD *digest) if (data_obj) GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); - ret_obj = EVPnew(digest, (unsigned char*)view.buf, view.len); + ret_obj = EVPnew(module, digest, + (unsigned char*)view.buf, view.len, + usedforsecurity); if (data_obj) PyBuffer_Release(&view); @@ -647,16 +863,19 @@ EVP_fast_new(PyObject *module, PyObject *data_obj, const EVP_MD *digest) _hashlib.openssl_md5 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a md5 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=6caae75b73e22c3f input=52010d3869e1b1a7]*/ +_hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=87b0186440a44f8c input=990e36d5e689b16e]*/ { - return EVP_fast_new(module, data_obj, EVP_md5()); + return EVP_fast_new(module, data_obj, EVP_md5(), usedforsecurity); } @@ -664,16 +883,19 @@ _hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj) _hashlib.openssl_sha1 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a sha1 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=07606d8f75153e61 input=16807d30e4aa8ae9]*/ +_hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=6813024cf690670d input=948f2f4b6deabc10]*/ { - return EVP_fast_new(module, data_obj, EVP_sha1()); + return EVP_fast_new(module, data_obj, EVP_sha1(), usedforsecurity); } @@ -681,16 +903,19 @@ _hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj) _hashlib.openssl_sha224 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a sha224 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=55e848761bcef0c9 input=5dbc2f1d84eb459b]*/ +_hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=a2dfe7cc4eb14ebb input=f9272821fadca505]*/ { - return EVP_fast_new(module, data_obj, EVP_sha224()); + return EVP_fast_new(module, data_obj, EVP_sha224(), usedforsecurity); } @@ -698,16 +923,19 @@ _hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj) _hashlib.openssl_sha256 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a sha256 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=05851d7cce34ac65 input=a68a5d21cda5a80f]*/ +_hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=1f874a34870f0a68 input=549fad9d2930d4c5]*/ { - return EVP_fast_new(module, data_obj, EVP_sha256()); + return EVP_fast_new(module, data_obj, EVP_sha256(), usedforsecurity); } @@ -715,16 +943,19 @@ _hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj) _hashlib.openssl_sha384 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a sha384 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=5101a4704a932c2f input=6bdfa006622b64ea]*/ +_hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=58529eff9ca457b2 input=48601a6e3bf14ad7]*/ { - return EVP_fast_new(module, data_obj, EVP_sha384()); + return EVP_fast_new(module, data_obj, EVP_sha384(), usedforsecurity); } @@ -732,18 +963,140 @@ _hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj) _hashlib.openssl_sha512 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a sha512 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_sha512_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=20c8e63ee560a5cb input=ece50182ad4b76a6]*/ +_hashlib_openssl_sha512_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=2c744c9e4a40d5f6 input=c5c46a2a817aa98f]*/ +{ + return EVP_fast_new(module, data_obj, EVP_sha512(), usedforsecurity); +} + + +#ifdef PY_OPENSSL_HAS_SHA3 + +/*[clinic input] +_hashlib.openssl_sha3_224 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a sha3-224 hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_sha3_224_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=144641c1d144b974 input=e3a01b2888916157]*/ +{ + return EVP_fast_new(module, data_obj, EVP_sha3_224(), usedforsecurity); +} + +/*[clinic input] +_hashlib.openssl_sha3_256 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a sha3-256 hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_sha3_256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=c61f1ab772d06668 input=e2908126c1b6deed]*/ +{ + return EVP_fast_new(module, data_obj, EVP_sha3_256(), usedforsecurity); +} + +/*[clinic input] +_hashlib.openssl_sha3_384 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a sha3-384 hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_sha3_384_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=f68e4846858cf0ee input=ec0edf5c792f8252]*/ +{ + return EVP_fast_new(module, data_obj, EVP_sha3_384(), usedforsecurity); +} + +/*[clinic input] +_hashlib.openssl_sha3_512 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a sha3-512 hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_sha3_512_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=2eede478c159354a input=64e2cc0c094d56f4]*/ +{ + return EVP_fast_new(module, data_obj, EVP_sha3_512(), usedforsecurity); +} +#endif /* PY_OPENSSL_HAS_SHA3 */ + +#ifdef PY_OPENSSL_HAS_SHAKE +/*[clinic input] +_hashlib.openssl_shake_128 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a shake-128 variable hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_shake_128_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=bc49cdd8ada1fa97 input=6c9d67440eb33ec8]*/ { - return EVP_fast_new(module, data_obj, EVP_sha512()); + return EVP_fast_new(module, data_obj, EVP_shake128(), usedforsecurity); } +/*[clinic input] +_hashlib.openssl_shake_256 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a shake-256 variable hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_shake_256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=358d213be8852df7 input=479cbe9fefd4a9f8]*/ +{ + return EVP_fast_new(module, data_obj, EVP_shake256(), usedforsecurity); +} +#endif /* PY_OPENSSL_HAS_SHAKE */ /*[clinic input] _hashlib.pbkdf2_hmac as pbkdf2_hmac @@ -769,7 +1122,7 @@ pbkdf2_hmac_impl(PyObject *module, const char *hash_name, int retval; const EVP_MD *digest; - digest = EVP_get_digestbyname(hash_name); + digest = py_digest_by_name(hash_name); if (digest == NULL) { PyErr_SetString(PyExc_ValueError, "unsupported hash type"); goto end; @@ -971,7 +1324,7 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt, */ /*[clinic input] -_hashlib.hmac_digest +_hashlib.hmac_digest as _hashlib_hmac_singleshot key: Py_buffer msg: Py_buffer @@ -981,16 +1334,16 @@ Single-shot HMAC. [clinic start generated code]*/ static PyObject * -_hashlib_hmac_digest_impl(PyObject *module, Py_buffer *key, Py_buffer *msg, - const char *digest) -/*[clinic end generated code: output=75630e684cdd8762 input=562d2f4249511bd3]*/ +_hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key, + Py_buffer *msg, const char *digest) +/*[clinic end generated code: output=15658ede5ab98185 input=019dffc571909a46]*/ { unsigned char md[EVP_MAX_MD_SIZE] = {0}; unsigned int md_len = 0; unsigned char *result; const EVP_MD *evp; - evp = EVP_get_digestbyname(digest); + evp = py_digest_by_name(digest); if (evp == NULL) { PyErr_SetString(PyExc_ValueError, "unsupported hash type"); return NULL; @@ -1022,54 +1375,577 @@ _hashlib_hmac_digest_impl(PyObject *module, Py_buffer *key, Py_buffer *msg, return PyBytes_FromStringAndSize((const char*)md, md_len); } -/* State for our callback function so that it can accumulate a result. */ -typedef struct _internal_name_mapper_state { - PyObject *set; - int error; -} _InternalNameMapperState; +/* OpenSSL-based HMAC implementation + */ +static int _hmac_update(HMACobject*, PyObject*); -/* A callback function to pass to OpenSSL's OBJ_NAME_do_all(...) */ -static void -_openssl_hash_name_mapper(const EVP_MD *md, const char *from, - const char *to, void *arg) -{ - _InternalNameMapperState *state = (_InternalNameMapperState *)arg; - PyObject *py_name; +/*[clinic input] +_hashlib.hmac_new - assert(state != NULL); - if (md == NULL) - return; + key: Py_buffer + msg as msg_obj: object(c_default="NULL") = b'' + digestmod: str(c_default="NULL") = None - py_name = py_digest_name(md); - if (py_name == NULL) { - state->error = 1; - } else { - if (PySet_Add(state->set, py_name) != 0) { - state->error = 1; - } - Py_DECREF(py_name); +Return a new hmac object. +[clinic start generated code]*/ + +static PyObject * +_hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj, + const char *digestmod) +/*[clinic end generated code: output=9a35673be0cbea1b input=a0878868eb190134]*/ +{ + PyTypeObject *type = get_hashlib_state(module)->HMACtype; + const EVP_MD *digest; + HMAC_CTX *ctx = NULL; + HMACobject *self = NULL; + int r; + + if (key->len > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "key is too long."); + return NULL; + } + + if ((digestmod == NULL) || !strlen(digestmod)) { + PyErr_SetString( + PyExc_TypeError, "Missing required parameter 'digestmod'."); + return NULL; + } + + digest = py_digest_by_name(digestmod); + if (!digest) { + PyErr_SetString(PyExc_ValueError, "unknown hash function"); + return NULL; + } + + ctx = HMAC_CTX_new(); + if (ctx == NULL) { + _setException(PyExc_ValueError); + goto error; + } + + r = HMAC_Init_ex( + ctx, + (const char*)key->buf, + (int)key->len, + digest, + NULL /*impl*/); + if (r == 0) { + _setException(PyExc_ValueError); + goto error; } + + self = (HMACobject *)PyObject_New(HMACobject, type); + if (self == NULL) { + goto error; + } + + self->ctx = ctx; + self->lock = NULL; + + if ((msg_obj != NULL) && (msg_obj != Py_None)) { + if (!_hmac_update(self, msg_obj)) + goto error; + } + + return (PyObject*)self; + +error: + if (ctx) HMAC_CTX_free(ctx); + if (self) PyObject_Del(self); + return NULL; } +/* helper functions */ +static int +locked_HMAC_CTX_copy(HMAC_CTX *new_ctx_p, HMACobject *self) +{ + int result; + ENTER_HASHLIB(self); + result = HMAC_CTX_copy(new_ctx_p, self->ctx); + LEAVE_HASHLIB(self); + return result; +} -/* Ask OpenSSL for a list of supported ciphers, filling in a Python set. */ -static PyObject* -generate_hash_name_list(void) +static unsigned int +_hmac_digest_size(HMACobject *self) { - _InternalNameMapperState state; - state.set = PyFrozenSet_New(NULL); - if (state.set == NULL) + unsigned int digest_size = EVP_MD_size(HMAC_CTX_get_md(self->ctx)); + assert(digest_size <= EVP_MAX_MD_SIZE); + return digest_size; +} + +static int +_hmac_update(HMACobject *self, PyObject *obj) +{ + int r; + Py_buffer view = {0}; + + GET_BUFFER_VIEW_OR_ERROR(obj, &view, return 0); + + if (self->lock == NULL && view.len >= HASHLIB_GIL_MINSIZE) { + self->lock = PyThread_allocate_lock(); + /* fail? lock = NULL and we fail over to non-threaded code. */ + } + + if (self->lock != NULL) { + ENTER_HASHLIB(self); + r = HMAC_Update(self->ctx, (const unsigned char*)view.buf, view.len); + LEAVE_HASHLIB(self); + } else { + r = HMAC_Update(self->ctx, (const unsigned char*)view.buf, view.len); + } + + PyBuffer_Release(&view); + + if (r == 0) { + _setException(PyExc_ValueError); + return 0; + } + return 1; +} + +/*[clinic input] +_hashlib.HMAC.copy + +Return a copy ("clone") of the HMAC object. +[clinic start generated code]*/ + +static PyObject * +_hashlib_HMAC_copy_impl(HMACobject *self) +/*[clinic end generated code: output=29aa28b452833127 input=e2fa6a05db61a4d6]*/ +{ + HMACobject *retval; + + HMAC_CTX *ctx = HMAC_CTX_new(); + if (ctx == NULL) { + return _setException(PyExc_ValueError); + } + if (!locked_HMAC_CTX_copy(ctx, self)) { + HMAC_CTX_free(ctx); + return _setException(PyExc_ValueError); + } + + retval = (HMACobject *)PyObject_New(HMACobject, Py_TYPE(self)); + if (retval == NULL) { + HMAC_CTX_free(ctx); return NULL; - state.error = 0; + } + retval->ctx = ctx; + retval->lock = NULL; + + return (PyObject *)retval; +} + +static void +_hmac_dealloc(HMACobject *self) +{ + PyTypeObject *tp = Py_TYPE(self); + if (self->lock != NULL) { + PyThread_free_lock(self->lock); + } + HMAC_CTX_free(self->ctx); + PyObject_Del(self); + Py_DECREF(tp); +} + +static PyObject * +_hmac_repr(HMACobject *self) +{ + PyObject *digest_name = py_digest_name(HMAC_CTX_get_md(self->ctx)); + if (digest_name == NULL) { + return NULL; + } + PyObject *repr = PyUnicode_FromFormat( + "<%U HMAC object @ %p>", digest_name, self + ); + Py_DECREF(digest_name); + return repr; +} + +/*[clinic input] +_hashlib.HMAC.update + msg: object + +Update the HMAC object with msg. +[clinic start generated code]*/ + +static PyObject * +_hashlib_HMAC_update_impl(HMACobject *self, PyObject *msg) +/*[clinic end generated code: output=f31f0ace8c625b00 input=1829173bb3cfd4e6]*/ +{ + if (!_hmac_update(self, msg)) { + return NULL; + } + Py_RETURN_NONE; +} + +static int +_hmac_digest(HMACobject *self, unsigned char *buf, unsigned int len) +{ + HMAC_CTX *temp_ctx = HMAC_CTX_new(); + if (temp_ctx == NULL) { + PyErr_NoMemory(); + return 0; + } + if (!locked_HMAC_CTX_copy(temp_ctx, self)) { + _setException(PyExc_ValueError); + return 0; + } + int r = HMAC_Final(temp_ctx, buf, &len); + HMAC_CTX_free(temp_ctx); + if (r == 0) { + _setException(PyExc_ValueError); + return 0; + } + return 1; +} + +/*[clinic input] +_hashlib.HMAC.digest +Return the digest of the bytes passed to the update() method so far. +[clinic start generated code]*/ + +static PyObject * +_hashlib_HMAC_digest_impl(HMACobject *self) +/*[clinic end generated code: output=1b1424355af7a41e input=bff07f74da318fb4]*/ +{ + unsigned char digest[EVP_MAX_MD_SIZE]; + unsigned int digest_size = _hmac_digest_size(self); + if (digest_size == 0) { + return _setException(PyExc_ValueError); + } + int r = _hmac_digest(self, digest, digest_size); + if (r == 0) { + return NULL; + } + return PyBytes_FromStringAndSize((const char *)digest, digest_size); +} + +/*[clinic input] +_hashlib.HMAC.hexdigest + +Return hexadecimal digest of the bytes passed to the update() method so far. + +This may be used to exchange the value safely in email or other non-binary +environments. +[clinic start generated code]*/ + +static PyObject * +_hashlib_HMAC_hexdigest_impl(HMACobject *self) +/*[clinic end generated code: output=80d825be1eaae6a7 input=5abc42702874ddcf]*/ +{ + unsigned char digest[EVP_MAX_MD_SIZE]; + unsigned int digest_size = _hmac_digest_size(self); + if (digest_size == 0) { + return _setException(PyExc_ValueError); + } + int r = _hmac_digest(self, digest, digest_size); + if (r == 0) { + return NULL; + } + return _Py_strhex((const char *)digest, digest_size); +} + +static PyObject * +_hashlib_hmac_get_digest_size(HMACobject *self, void *closure) +{ + unsigned int digest_size = _hmac_digest_size(self); + if (digest_size == 0) { + return _setException(PyExc_ValueError); + } + return PyLong_FromLong(digest_size); +} + +static PyObject * +_hashlib_hmac_get_block_size(HMACobject *self, void *closure) +{ + const EVP_MD *md = HMAC_CTX_get_md(self->ctx); + if (md == NULL) { + return _setException(PyExc_ValueError); + } + return PyLong_FromLong(EVP_MD_block_size(md)); +} + +static PyObject * +_hashlib_hmac_get_name(HMACobject *self, void *closure) +{ + PyObject *digest_name = py_digest_name(HMAC_CTX_get_md(self->ctx)); + if (digest_name == NULL) { + return NULL; + } + PyObject *name = PyUnicode_FromFormat("hmac-%U", digest_name); + Py_DECREF(digest_name); + return name; +} + +static PyMethodDef HMAC_methods[] = { + _HASHLIB_HMAC_UPDATE_METHODDEF + _HASHLIB_HMAC_DIGEST_METHODDEF + _HASHLIB_HMAC_HEXDIGEST_METHODDEF + _HASHLIB_HMAC_COPY_METHODDEF + {NULL, NULL} /* sentinel */ +}; + +static PyGetSetDef HMAC_getset[] = { + {"digest_size", (getter)_hashlib_hmac_get_digest_size, NULL, NULL, NULL}, + {"block_size", (getter)_hashlib_hmac_get_block_size, NULL, NULL, NULL}, + {"name", (getter)_hashlib_hmac_get_name, NULL, NULL, NULL}, + {NULL} /* Sentinel */ +}; + + +PyDoc_STRVAR(hmactype_doc, +"The object used to calculate HMAC of a message.\n\ +\n\ +Methods:\n\ +\n\ +update() -- updates the current digest with an additional string\n\ +digest() -- return the current digest value\n\ +hexdigest() -- return the current digest as a string of hexadecimal digits\n\ +copy() -- return a copy of the current hash object\n\ +\n\ +Attributes:\n\ +\n\ +name -- the name, including the hash algorithm used by this object\n\ +digest_size -- number of bytes in digest() output\n"); + +static PyType_Slot HMACtype_slots[] = { + {Py_tp_doc, (char *)hmactype_doc}, + {Py_tp_repr, (reprfunc)_hmac_repr}, + {Py_tp_dealloc,(destructor)_hmac_dealloc}, + {Py_tp_methods, HMAC_methods}, + {Py_tp_getset, HMAC_getset}, + {Py_tp_new, _disabled_new}, + {0, NULL} +}; + +PyType_Spec HMACtype_spec = { + "_hashlib.HMAC", /* name */ + sizeof(HMACobject), /* basicsize */ + .flags = Py_TPFLAGS_DEFAULT, + .slots = HMACtype_slots, +}; + + +/* State for our callback function so that it can accumulate a result. */ +typedef struct _internal_name_mapper_state { + PyObject *set; + int error; +} _InternalNameMapperState; + + +/* A callback function to pass to OpenSSL's OBJ_NAME_do_all(...) */ +static void +_openssl_hash_name_mapper(const EVP_MD *md, const char *from, + const char *to, void *arg) +{ + _InternalNameMapperState *state = (_InternalNameMapperState *)arg; + PyObject *py_name; + + assert(state != NULL); + if (md == NULL) + return; + + py_name = py_digest_name(md); + if (py_name == NULL) { + state->error = 1; + } else { + if (PySet_Add(state->set, py_name) != 0) { + state->error = 1; + } + Py_DECREF(py_name); + } +} + + +/* Ask OpenSSL for a list of supported ciphers, filling in a Python set. */ +static int +hashlib_md_meth_names(PyObject *module) +{ + _InternalNameMapperState state = { + .set = PyFrozenSet_New(NULL), + .error = 0 + }; + if (state.set == NULL) { + return -1; + } EVP_MD_do_all(&_openssl_hash_name_mapper, &state); if (state.error) { Py_DECREF(state.set); - return NULL; + return -1; + } + + if (PyModule_AddObject(module, "openssl_md_meth_names", state.set) < 0) { + Py_DECREF(state.set); + return -1; + } + + return 0; +} + +/* LibreSSL doesn't support FIPS: + https://marc.info/?l=openbsd-misc&m=139819485423701&w=2 + + Ted Unangst wrote: "I figured I should mention our current libressl policy + wrt FIPS mode. It's gone and it's not coming back." */ +#ifndef LIBRESSL_VERSION_NUMBER +/*[clinic input] +_hashlib.get_fips_mode -> int + +Determine the OpenSSL FIPS mode of operation. + +For OpenSSL 3.0.0 and newer it returns the state of the default provider +in the default OSSL context. It's not quite the same as FIPS_mode() but good +enough for unittests. + +Effectively any non-zero return value indicates FIPS mode; +values other than 1 may have additional significance. +[clinic start generated code]*/ + +static int +_hashlib_get_fips_mode_impl(PyObject *module) +/*[clinic end generated code: output=87eece1bab4d3fa9 input=2db61538c41c6fef]*/ + +{ + int result; +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + result = EVP_default_properties_is_fips_enabled(NULL); +#else + ERR_clear_error(); + result = FIPS_mode(); + if (result == 0) { + // "If the library was built without support of the FIPS Object Module, + // then the function will return 0 with an error code of + // CRYPTO_R_FIPS_MODE_NOT_SUPPORTED (0x0f06d065)." + // But 0 is also a valid result value. + unsigned long errcode = ERR_peek_last_error(); + if (errcode) { + _setException(PyExc_ValueError); + return -1; + } + } + return result; +#endif +} +#endif // !LIBRESSL_VERSION_NUMBER + + +static int +_tscmp(const unsigned char *a, const unsigned char *b, + Py_ssize_t len_a, Py_ssize_t len_b) +{ + /* loop count depends on length of b. Might leak very little timing + * information if sizes are different. + */ + Py_ssize_t length = len_b; + const void *left = a; + const void *right = b; + int result = 0; + + if (len_a != length) { + left = b; + result = 1; + } + + result |= CRYPTO_memcmp(left, right, length); + + return (result == 0); +} + +/* NOTE: Keep in sync with _operator.c implementation. */ + +/*[clinic input] +_hashlib.compare_digest + + a: object + b: object + / + +Return 'a == b'. + +This function uses an approach designed to prevent +timing analysis, making it appropriate for cryptography. + +a and b must both be of the same type: either str (ASCII only), +or any bytes-like object. + +Note: If a and b are of different lengths, or if an error occurs, +a timing attack could theoretically reveal information about the +types and lengths of a and b--but not their values. +[clinic start generated code]*/ + +static PyObject * +_hashlib_compare_digest_impl(PyObject *module, PyObject *a, PyObject *b) +/*[clinic end generated code: output=6f1c13927480aed9 input=9c40c6e566ca12f5]*/ +{ + int rc; + + /* ASCII unicode string */ + if(PyUnicode_Check(a) && PyUnicode_Check(b)) { + if (PyUnicode_READY(a) == -1 || PyUnicode_READY(b) == -1) { + return NULL; + } + if (!PyUnicode_IS_ASCII(a) || !PyUnicode_IS_ASCII(b)) { + PyErr_SetString(PyExc_TypeError, + "comparing strings with non-ASCII characters is " + "not supported"); + return NULL; + } + + rc = _tscmp(PyUnicode_DATA(a), + PyUnicode_DATA(b), + PyUnicode_GET_LENGTH(a), + PyUnicode_GET_LENGTH(b)); + } + /* fallback to buffer interface for bytes, bytesarray and other */ + else { + Py_buffer view_a; + Py_buffer view_b; + + if (PyObject_CheckBuffer(a) == 0 && PyObject_CheckBuffer(b) == 0) { + PyErr_Format(PyExc_TypeError, + "unsupported operand types(s) or combination of types: " + "'%.100s' and '%.100s'", + Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name); + return NULL; + } + + if (PyObject_GetBuffer(a, &view_a, PyBUF_SIMPLE) == -1) { + return NULL; + } + if (view_a.ndim > 1) { + PyErr_SetString(PyExc_BufferError, + "Buffer must be single dimension"); + PyBuffer_Release(&view_a); + return NULL; + } + + if (PyObject_GetBuffer(b, &view_b, PyBUF_SIMPLE) == -1) { + PyBuffer_Release(&view_a); + return NULL; + } + if (view_b.ndim > 1) { + PyErr_SetString(PyExc_BufferError, + "Buffer must be single dimension"); + PyBuffer_Release(&view_a); + PyBuffer_Release(&view_b); + return NULL; + } + + rc = _tscmp((const unsigned char*)view_a.buf, + (const unsigned char*)view_b.buf, + view_a.len, + view_b.len); + + PyBuffer_Release(&view_a); + PyBuffer_Release(&view_b); } - return state.set; + + return PyBool_FromLong(rc); } /* List of functions exported by this module */ @@ -1078,68 +1954,188 @@ static struct PyMethodDef EVP_functions[] = { EVP_NEW_METHODDEF PBKDF2_HMAC_METHODDEF _HASHLIB_SCRYPT_METHODDEF - _HASHLIB_HMAC_DIGEST_METHODDEF + _HASHLIB_GET_FIPS_MODE_METHODDEF + _HASHLIB_COMPARE_DIGEST_METHODDEF + _HASHLIB_HMAC_SINGLESHOT_METHODDEF + _HASHLIB_HMAC_NEW_METHODDEF _HASHLIB_OPENSSL_MD5_METHODDEF _HASHLIB_OPENSSL_SHA1_METHODDEF _HASHLIB_OPENSSL_SHA224_METHODDEF _HASHLIB_OPENSSL_SHA256_METHODDEF _HASHLIB_OPENSSL_SHA384_METHODDEF _HASHLIB_OPENSSL_SHA512_METHODDEF + _HASHLIB_OPENSSL_SHA3_224_METHODDEF + _HASHLIB_OPENSSL_SHA3_256_METHODDEF + _HASHLIB_OPENSSL_SHA3_384_METHODDEF + _HASHLIB_OPENSSL_SHA3_512_METHODDEF + _HASHLIB_OPENSSL_SHAKE_128_METHODDEF + _HASHLIB_OPENSSL_SHAKE_256_METHODDEF {NULL, NULL} /* Sentinel */ }; /* Initialize this module. */ +static int +hashlib_traverse(PyObject *m, visitproc visit, void *arg) +{ + _hashlibstate *state = get_hashlib_state(m); + Py_VISIT(state->EVPtype); + Py_VISIT(state->HMACtype); +#ifdef PY_OPENSSL_HAS_SHAKE + Py_VISIT(state->EVPXOFtype); +#endif + return 0; +} -static struct PyModuleDef _hashlibmodule = { - PyModuleDef_HEAD_INIT, - "_hashlib", - NULL, - -1, - EVP_functions, - NULL, - NULL, - NULL, - NULL -}; +static int +hashlib_clear(PyObject *m) +{ + _hashlibstate *state = get_hashlib_state(m); + Py_CLEAR(state->EVPtype); + Py_CLEAR(state->HMACtype); +#ifdef PY_OPENSSL_HAS_SHAKE + Py_CLEAR(state->EVPXOFtype); +#endif + return 0; +} -PyMODINIT_FUNC -PyInit__hashlib(void) +static void +hashlib_free(void *m) { - PyObject *m, *openssl_md_meth_names; + hashlib_clear((PyObject *)m); +} +/* Py_mod_exec functions */ +static int +hashlib_openssl_legacy_init(PyObject *module) +{ #if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER) /* Load all digest algorithms and initialize cpuid */ OPENSSL_add_all_algorithms_noconf(); ERR_load_crypto_strings(); #endif + return 0; +} - /* TODO build EVP_functions openssl_* entries dynamically based - * on what hashes are supported rather than listing many - * but having some be unsupported. Only init appropriate - * constants. */ +static int +hashlib_init_evptype(PyObject *module) +{ + _hashlibstate *state = get_hashlib_state(module); - Py_TYPE(&EVPtype) = &PyType_Type; - if (PyType_Ready(&EVPtype) < 0) - return NULL; + state->EVPtype = (PyTypeObject *)PyType_FromSpec(&EVPtype_spec); + if (state->EVPtype == NULL) { + return -1; + } + if (PyModule_AddType(module, state->EVPtype) < 0) { + return -1; + } + return 0; +} + +static int +hashlib_init_evpxoftype(PyObject *module) +{ +#ifdef PY_OPENSSL_HAS_SHAKE + _hashlibstate *state = get_hashlib_state(module); + PyObject *bases; + + if (state->EVPtype == NULL) { + return -1; + } + + bases = PyTuple_Pack(1, state->EVPtype); + if (bases == NULL) { + return -1; + } + + state->EVPXOFtype = (PyTypeObject *)PyType_FromSpecWithBases( + &EVPXOFtype_spec, bases + ); + Py_DECREF(bases); + if (state->EVPXOFtype == NULL) { + return -1; + } + if (PyModule_AddType(module, state->EVPXOFtype) < 0) { + return -1; + } +#endif + return 0; +} + +static int +hashlib_init_hmactype(PyObject *module) +{ + _hashlibstate *state = get_hashlib_state(module); + + state->HMACtype = (PyTypeObject *)PyType_FromSpec(&HMACtype_spec); + if (state->HMACtype == NULL) { + return -1; + } + if (PyModule_AddType(module, state->HMACtype) < 0) { + return -1; + } + return 0; +} + +#if 0 +static PyModuleDef_Slot hashlib_slots[] = { + /* OpenSSL 1.0.2 and LibreSSL */ + {Py_mod_exec, hashlib_openssl_legacy_init}, + {Py_mod_exec, hashlib_init_evptype}, + {Py_mod_exec, hashlib_init_evpxoftype}, + {Py_mod_exec, hashlib_init_hmactype}, + {Py_mod_exec, hashlib_md_meth_names}, + {0, NULL} +}; +#endif + +static struct PyModuleDef _hashlibmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_hashlib", + .m_doc = "OpenSSL interface for hashlib module", + .m_size = sizeof(_hashlibstate), + .m_methods = EVP_functions, + .m_slots = NULL, + .m_traverse = hashlib_traverse, + .m_clear = hashlib_clear, + .m_free = hashlib_free +}; + +PyMODINIT_FUNC +PyInit__hashlib(void) +{ + PyObject *m = PyState_FindModule(&_hashlibmodule); + if (m != NULL) { + Py_INCREF(m); + return m; + } m = PyModule_Create(&_hashlibmodule); - if (m == NULL) + if (m == NULL) { return NULL; + } - openssl_md_meth_names = generate_hash_name_list(); - if (openssl_md_meth_names == NULL) { + if (hashlib_openssl_legacy_init(m) < 0) { Py_DECREF(m); return NULL; } - if (PyModule_AddObject(m, "openssl_md_meth_names", openssl_md_meth_names)) { + if (hashlib_init_evptype(m) < 0) { + Py_DECREF(m); + return NULL; + } + if (hashlib_init_evpxoftype(m) < 0) { + Py_DECREF(m); + return NULL; + } + if (hashlib_init_hmactype(m) < 0) { + Py_DECREF(m); + return NULL; + } + if (hashlib_md_meth_names(m) == -1) { Py_DECREF(m); return NULL; } - - Py_INCREF((PyObject *)&EVPtype); - PyModule_AddObject(m, "HASH", (PyObject *)&EVPtype); return m; } diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c index 6bc18b5f..4e85e046 100644 --- a/Modules/_heapqmodule.c +++ b/Modules/_heapqmodule.c @@ -555,7 +555,6 @@ _heapq__heapify_max(PyObject *module, PyObject *heap) return heapify_internal(heap, siftup_max); } - static PyMethodDef heapq_methods[] = { _HEAPQ_HEAPPUSH_METHODDEF _HEAPQ_HEAPPUSHPOP_METHODDEF @@ -694,13 +693,29 @@ Believe me, real good tape sorts were quite spectacular to watch!\n\ From all times, sorting has always been a Great Art! :-)\n"); +static int +heapq_exec(PyObject *m) +{ + PyObject *about = PyUnicode_FromString(__about__); + if (PyModule_AddObject(m, "__about__", about) < 0) { + Py_DECREF(about); + return -1; + } + return 0; +} + +static struct PyModuleDef_Slot heapq_slots[] = { + {Py_mod_exec, heapq_exec}, + {0, NULL} +}; + static struct PyModuleDef _heapqmodule = { PyModuleDef_HEAD_INIT, "_heapq", module_doc, - -1, + 0, heapq_methods, - NULL, + heapq_slots, NULL, NULL, NULL @@ -709,13 +724,5 @@ static struct PyModuleDef _heapqmodule = { PyMODINIT_FUNC PyInit__heapq(void) { - PyObject *m, *about; - - m = PyModule_Create(&_heapqmodule); - if (m == NULL) - return NULL; - about = PyUnicode_DecodeUTF8(__about__, strlen(__about__), NULL); - PyModule_AddObject(m, "__about__", about); - return m; + return PyModuleDef_Init(&_heapqmodule); } - diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index 49ed2cb0..d7cadace 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -9,8 +9,6 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_pystate.h" /* _PyInterpreterState_GET_UNSAFE() */ -#include "structmember.h" #include "_iomodule.h" #ifdef HAVE_SYS_TYPES_H @@ -377,14 +375,16 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, { PyObject *RawIO_class = (PyObject *)&PyFileIO_Type; #ifdef MS_WINDOWS - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; + const PyConfig *config = _Py_GetConfig(); if (!config->legacy_windows_stdio && _PyIO_get_console_type(path_or_fd) != '\0') { RawIO_class = (PyObject *)&PyWindowsConsoleIO_Type; encoding = "utf-8"; } #endif - raw = PyObject_CallFunction(RawIO_class, - "OsiO", path_or_fd, rawmode, closefd, opener); + raw = PyObject_CallFunction(RawIO_class, "OsOO", + path_or_fd, rawmode, + closefd ? Py_True : Py_False, + opener); } if (raw == NULL) @@ -400,7 +400,7 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, /* buffering */ if (buffering < 0) { - PyObject *res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL); + PyObject *res = _PyObject_CallMethodIdNoArgs(raw, &PyId_isatty); if (res == NULL) goto error; isatty = PyLong_AsLong(res); @@ -476,10 +476,10 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, /* wraps into a TextIOWrapper */ wrapper = PyObject_CallFunction((PyObject *)&PyTextIOWrapper_Type, - "Osssi", + "OsssO", buffer, encoding, errors, newline, - line_buffering); + line_buffering ? Py_True : Py_False); if (wrapper == NULL) goto error; result = wrapper; @@ -494,7 +494,7 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, if (result != NULL) { PyObject *exc, *val, *tb, *close_result; PyErr_Fetch(&exc, &val, &tb); - close_result = _PyObject_CallMethodId(result, &PyId_close, NULL); + close_result = _PyObject_CallMethodIdNoArgs(result, &PyId_close); _PyErr_ChainExceptions(exc, val, tb); Py_XDECREF(close_result); Py_DECREF(result); @@ -563,7 +563,7 @@ PyNumber_AsOff_t(PyObject *item, PyObject *err) /* Otherwise replace the error with caller's error object. */ PyErr_Format(err, "cannot fit '%.200s' into an offset-sized integer", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); } finish: @@ -571,13 +571,20 @@ PyNumber_AsOff_t(PyObject *item, PyObject *err) return result; } +static inline _PyIO_State* +get_io_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_PyIO_State *)state; +} _PyIO_State * _PyIO_get_module_state(void) { PyObject *mod = PyState_FindModule(&_PyIO_Module); _PyIO_State *state; - if (mod == NULL || (state = IO_MOD_STATE(mod)) == NULL) { + if (mod == NULL || (state = get_io_state(mod)) == NULL) { PyErr_SetString(PyExc_RuntimeError, "could not find io module state " "(interpreter shutdown?)"); @@ -613,7 +620,7 @@ _PyIO_get_locale_module(_PyIO_State *state) static int iomodule_traverse(PyObject *mod, visitproc visit, void *arg) { - _PyIO_State *state = IO_MOD_STATE(mod); + _PyIO_State *state = get_io_state(mod); if (!state->initialized) return 0; if (state->locale_module != NULL) { @@ -626,7 +633,7 @@ iomodule_traverse(PyObject *mod, visitproc visit, void *arg) { static int iomodule_clear(PyObject *mod) { - _PyIO_State *state = IO_MOD_STATE(mod); + _PyIO_State *state = get_io_state(mod); if (!state->initialized) return 0; if (state->locale_module != NULL) @@ -672,15 +679,11 @@ PyInit__io(void) _PyIO_State *state = NULL; if (m == NULL) return NULL; - state = IO_MOD_STATE(m); + state = get_io_state(m); state->initialized = 0; -#define ADD_TYPE(type, name) \ - if (PyType_Ready(type) < 0) \ - goto fail; \ - Py_INCREF(type); \ - if (PyModule_AddObject(m, name, (PyObject *)type) < 0) { \ - Py_DECREF(type); \ +#define ADD_TYPE(type) \ + if (PyModule_AddType(m, type) < 0) { \ goto fail; \ } @@ -708,54 +711,54 @@ PyInit__io(void) /* Concrete base types of the IO ABCs. (the ABCs themselves are declared through inheritance in io.py) */ - ADD_TYPE(&PyIOBase_Type, "_IOBase"); - ADD_TYPE(&PyRawIOBase_Type, "_RawIOBase"); - ADD_TYPE(&PyBufferedIOBase_Type, "_BufferedIOBase"); - ADD_TYPE(&PyTextIOBase_Type, "_TextIOBase"); + ADD_TYPE(&PyIOBase_Type); + ADD_TYPE(&PyRawIOBase_Type); + ADD_TYPE(&PyBufferedIOBase_Type); + ADD_TYPE(&PyTextIOBase_Type); /* Implementation of concrete IO objects. */ /* FileIO */ PyFileIO_Type.tp_base = &PyRawIOBase_Type; - ADD_TYPE(&PyFileIO_Type, "FileIO"); + ADD_TYPE(&PyFileIO_Type); /* BytesIO */ PyBytesIO_Type.tp_base = &PyBufferedIOBase_Type; - ADD_TYPE(&PyBytesIO_Type, "BytesIO"); + ADD_TYPE(&PyBytesIO_Type); if (PyType_Ready(&_PyBytesIOBuffer_Type) < 0) goto fail; /* StringIO */ PyStringIO_Type.tp_base = &PyTextIOBase_Type; - ADD_TYPE(&PyStringIO_Type, "StringIO"); + ADD_TYPE(&PyStringIO_Type); #ifdef MS_WINDOWS /* WindowsConsoleIO */ PyWindowsConsoleIO_Type.tp_base = &PyRawIOBase_Type; - ADD_TYPE(&PyWindowsConsoleIO_Type, "_WindowsConsoleIO"); + ADD_TYPE(&PyWindowsConsoleIO_Type); #endif /* BufferedReader */ PyBufferedReader_Type.tp_base = &PyBufferedIOBase_Type; - ADD_TYPE(&PyBufferedReader_Type, "BufferedReader"); + ADD_TYPE(&PyBufferedReader_Type); /* BufferedWriter */ PyBufferedWriter_Type.tp_base = &PyBufferedIOBase_Type; - ADD_TYPE(&PyBufferedWriter_Type, "BufferedWriter"); + ADD_TYPE(&PyBufferedWriter_Type); /* BufferedRWPair */ PyBufferedRWPair_Type.tp_base = &PyBufferedIOBase_Type; - ADD_TYPE(&PyBufferedRWPair_Type, "BufferedRWPair"); + ADD_TYPE(&PyBufferedRWPair_Type); /* BufferedRandom */ PyBufferedRandom_Type.tp_base = &PyBufferedIOBase_Type; - ADD_TYPE(&PyBufferedRandom_Type, "BufferedRandom"); + ADD_TYPE(&PyBufferedRandom_Type); /* TextIOWrapper */ PyTextIOWrapper_Type.tp_base = &PyTextIOBase_Type; - ADD_TYPE(&PyTextIOWrapper_Type, "TextIOWrapper"); + ADD_TYPE(&PyTextIOWrapper_Type); /* IncrementalNewlineDecoder */ - ADD_TYPE(&PyIncrementalNewlineDecoder_Type, "IncrementalNewlineDecoder"); + ADD_TYPE(&PyIncrementalNewlineDecoder_Type); /* Interned strings */ #define ADD_INTERNED(name) \ diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h index 4d318acd..a8f3951e 100644 --- a/Modules/_io/_iomodule.h +++ b/Modules/_io/_iomodule.h @@ -2,6 +2,8 @@ * Declarations shared between the different parts of the io module */ +#include "exports.h" + /* ABCs */ extern PyTypeObject PyIOBase_Type; extern PyTypeObject PyRawIOBase_Type; @@ -183,4 +185,4 @@ extern PyObject *_PyIO_str_write; extern PyObject *_PyIO_empty_str; extern PyObject *_PyIO_empty_bytes; -extern PyTypeObject _PyBytesIOBuffer_Type; +extern Py_EXPORTED_SYMBOL PyTypeObject _PyBytesIOBuffer_Type; diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index ad7a8c9d..f8e21f20 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -10,9 +10,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_object.h" -#include "pycore_pystate.h" -#include "structmember.h" -#include "pythread.h" +#include "structmember.h" // PyMemberDef #include "_iomodule.h" /*[clinic input] @@ -292,12 +290,11 @@ _enter_buffered_busy(buffered *self) } Py_END_ALLOW_THREADS if (relax_locking && st != PY_LOCK_ACQUIRED) { - PyObject *msgobj = PyUnicode_FromFormat( - "could not acquire lock for %A at interpreter " + PyObject *ascii = PyObject_ASCII((PyObject*)self); + _Py_FatalErrorFormat(__func__, + "could not acquire lock for %s at interpreter " "shutdown, possibly due to daemon threads", - (PyObject *) self); - const char *msg = PyUnicode_AsUTF8(msgobj); - Py_FatalError(msg); + ascii ? PyUnicode_AsUTF8(ascii) : ""); } return 1; } @@ -439,8 +436,8 @@ buffered_dealloc_warn(buffered *self, PyObject *source) { if (self->ok && self->raw) { PyObject *r; - r = _PyObject_CallMethodIdObjArgs(self->raw, &PyId__dealloc_warn, - source, NULL); + r = _PyObject_CallMethodIdOneArg(self->raw, &PyId__dealloc_warn, + source); if (r) Py_DECREF(r); else @@ -461,7 +458,7 @@ static PyObject * buffered_simple_flush(buffered *self, PyObject *args) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_flush, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_flush); } static int @@ -513,7 +510,7 @@ buffered_close(buffered *self, PyObject *args) } /* flush() will most probably re-take the lock, so drop it first */ LEAVE_BUFFERED(self) - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (!ENTER_BUFFERED(self)) return NULL; if (res == NULL) @@ -521,7 +518,7 @@ buffered_close(buffered *self, PyObject *args) else Py_DECREF(res); - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_close, NULL); + res = PyObject_CallMethodNoArgs(self->raw, _PyIO_str_close); if (self->buffer) { PyMem_Free(self->buffer); @@ -545,7 +542,7 @@ buffered_detach(buffered *self, PyObject *Py_UNUSED(ignored)) { PyObject *raw, *res; CHECK_INITIALIZED(self) - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); @@ -562,21 +559,21 @@ static PyObject * buffered_seekable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_seekable, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_seekable); } static PyObject * buffered_readable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_readable, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_readable); } static PyObject * buffered_writable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_writable, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_writable); } static PyObject * @@ -599,14 +596,14 @@ static PyObject * buffered_fileno(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_fileno, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_fileno); } static PyObject * buffered_isatty(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_isatty, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_isatty); } /* Forward decls */ @@ -670,7 +667,7 @@ _buffered_raw_tell(buffered *self) { Py_off_t n; PyObject *res; - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_tell, NULL); + res = PyObject_CallMethodNoArgs(self->raw, _PyIO_str_tell); if (res == NULL) return -1; n = PyNumber_AsOff_t(res, PyExc_ValueError); @@ -1315,16 +1312,20 @@ _io__Buffered_truncate_impl(buffered *self, PyObject *pos) PyObject *res = NULL; CHECK_INITIALIZED(self) + CHECK_CLOSED(self, "truncate of closed file") + if (!self->writable) { + return bufferediobase_unsupported("truncate"); + } if (!ENTER_BUFFERED(self)) return NULL; - if (self->writable) { - res = buffered_flush_and_rewind_unlocked(self); - if (res == NULL) - goto end; - Py_CLEAR(res); + res = buffered_flush_and_rewind_unlocked(self); + if (res == NULL) { + goto end; } - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_truncate, pos, NULL); + Py_CLEAR(res); + + res = PyObject_CallMethodOneArg(self->raw, _PyIO_str_truncate, pos); if (res == NULL) goto end; /* Reset cached position */ @@ -1351,8 +1352,8 @@ buffered_iternext(buffered *self) line = _buffered_readline(self, -1); } else { - line = PyObject_CallMethodObjArgs((PyObject *)self, - _PyIO_str_readline, NULL); + line = PyObject_CallMethodNoArgs((PyObject *)self, + _PyIO_str_readline); if (line && !PyBytes_Check(line)) { PyErr_Format(PyExc_OSError, "readline() should have returned a bytes object, " @@ -1445,8 +1446,8 @@ _io_BufferedReader___init___impl(buffered *self, PyObject *raw, return -1; _bufferedreader_reset_buf(self); - self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedReader_Type && - Py_TYPE(raw) == &PyFileIO_Type); + self->fast_closed_checks = (Py_IS_TYPE(self, &PyBufferedReader_Type) && + Py_IS_TYPE(raw, &PyFileIO_Type)); self->ok = 1; return 0; @@ -1470,7 +1471,7 @@ _bufferedreader_raw_read(buffered *self, char *start, Py_ssize_t len) raised (see issue #10956). */ do { - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_readinto, memobj, NULL); + res = PyObject_CallMethodOneArg(self->raw, _PyIO_str_readinto, memobj); } while (res == NULL && _PyIO_trap_eintr()); Py_DECREF(memobj); if (res == NULL) @@ -1569,7 +1570,7 @@ _bufferedreader_read_all(buffered *self) } /* Read until EOF or until read() would block. */ - data = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_read, NULL); + data = PyObject_CallMethodNoArgs(self->raw, _PyIO_str_read); if (data == NULL) goto cleanup; if (data != Py_None && !PyBytes_Check(data)) { @@ -1791,8 +1792,8 @@ _io_BufferedWriter___init___impl(buffered *self, PyObject *raw, _bufferedwriter_reset_buf(self); self->pos = 0; - self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedWriter_Type && - Py_TYPE(raw) == &PyFileIO_Type); + self->fast_closed_checks = (Py_IS_TYPE(self, &PyBufferedWriter_Type) && + Py_IS_TYPE(raw, &PyFileIO_Type)); self->ok = 1; return 0; @@ -1818,7 +1819,7 @@ _bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len) */ do { errno = 0; - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_write, memobj, NULL); + res = PyObject_CallMethodOneArg(self->raw, _PyIO_str_write, memobj); errnum = errno; } while (res == NULL && _PyIO_trap_eintr()); Py_DECREF(memobj); @@ -2305,8 +2306,8 @@ _io_BufferedRandom___init___impl(buffered *self, PyObject *raw, _bufferedwriter_reset_buf(self); self->pos = 0; - self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedRandom_Type && - Py_TYPE(raw) == &PyFileIO_Type); + self->fast_closed_checks = (Py_IS_TYPE(self, &PyBufferedRandom_Type) && + Py_IS_TYPE(raw, &PyFileIO_Type)); self->ok = 1; return 0; diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index 3cf6402e..2468f45f 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -1,6 +1,6 @@ #include "Python.h" #include "pycore_object.h" -#include "structmember.h" /* for offsetof() */ +#include // offsetof() #include "_iomodule.h" /*[clinic input] @@ -31,17 +31,34 @@ typedef struct { * exports > 0. Py_REFCNT(buf) == 1, any modifications are forbidden. */ +static int +check_closed(bytesio *self) +{ + if (self->buf == NULL) { + PyErr_SetString(PyExc_ValueError, "I/O operation on closed file."); + return 1; + } + return 0; +} + +static int +check_exports(bytesio *self) +{ + if (self->exports > 0) { + PyErr_SetString(PyExc_BufferError, + "Existing exports of data: object cannot be re-sized"); + return 1; + } + return 0; +} + #define CHECK_CLOSED(self) \ - if ((self)->buf == NULL) { \ - PyErr_SetString(PyExc_ValueError, \ - "I/O operation on closed file."); \ + if (check_closed(self)) { \ return NULL; \ } #define CHECK_EXPORTS(self) \ - if ((self)->exports > 0) { \ - PyErr_SetString(PyExc_BufferError, \ - "Existing exports of data: object cannot be re-sized"); \ + if (check_exports(self)) { \ return NULL; \ } @@ -156,23 +173,41 @@ resize_buffer(bytesio *self, size_t size) } /* Internal routine for writing a string of bytes to the buffer of a BytesIO - object. Returns the number of bytes written, or -1 on error. */ -static Py_ssize_t -write_bytes(bytesio *self, const char *bytes, Py_ssize_t len) + object. Returns the number of bytes written, or -1 on error. + Inlining is disabled because it's significantly decreases performance + of writelines() in PGO build. */ +_Py_NO_INLINE static Py_ssize_t +write_bytes(bytesio *self, PyObject *b) { - size_t endpos; - assert(self->buf != NULL); - assert(self->pos >= 0); - assert(len >= 0); + if (check_closed(self)) { + return -1; + } + if (check_exports(self)) { + return -1; + } - endpos = (size_t)self->pos + len; + Py_buffer buf; + if (PyObject_GetBuffer(b, &buf, PyBUF_CONTIG_RO) < 0) { + return -1; + } + Py_ssize_t len = buf.len; + if (len == 0) { + goto done; + } + + assert(self->pos >= 0); + size_t endpos = (size_t)self->pos + len; if (endpos > (size_t)PyBytes_GET_SIZE(self->buf)) { - if (resize_buffer(self, endpos) < 0) - return -1; + if (resize_buffer(self, endpos) < 0) { + len = -1; + goto done; + } } else if (SHARED_BUF(self)) { - if (unshare_buffer(self, Py_MAX(endpos, (size_t)self->string_size)) < 0) - return -1; + if (unshare_buffer(self, Py_MAX(endpos, (size_t)self->string_size)) < 0) { + len = -1; + goto done; + } } if (self->pos > self->string_size) { @@ -190,7 +225,7 @@ write_bytes(bytesio *self, const char *bytes, Py_ssize_t len) /* Copy the data to the internal buffer, overwriting some of the existing data if self->pos < self->string_size. */ - memcpy(PyBytes_AS_STRING(self->buf) + self->pos, bytes, len); + memcpy(PyBytes_AS_STRING(self->buf) + self->pos, buf.buf, len); self->pos = endpos; /* Set the new length of the internal string if it has changed. */ @@ -198,6 +233,8 @@ write_bytes(bytesio *self, const char *bytes, Py_ssize_t len) self->string_size = endpos; } + done: + PyBuffer_Release(&buf); return len; } @@ -356,7 +393,7 @@ _io_BytesIO_tell_impl(bytesio *self) static PyObject * read_bytes(bytesio *self, Py_ssize_t size) { - char *output; + const char *output; assert(self->buf != NULL); assert(size <= self->string_size); @@ -465,7 +502,7 @@ _io_BytesIO_readlines_impl(bytesio *self, PyObject *arg) { Py_ssize_t maxsize, size, n; PyObject *result, *line; - char *output; + const char *output; CHECK_CLOSED(self); @@ -669,19 +706,7 @@ static PyObject * _io_BytesIO_write(bytesio *self, PyObject *b) /*[clinic end generated code: output=53316d99800a0b95 input=f5ec7c8c64ed720a]*/ { - Py_ssize_t n = 0; - Py_buffer buf; - - CHECK_CLOSED(self); - CHECK_EXPORTS(self); - - if (PyObject_GetBuffer(b, &buf, PyBUF_CONTIG_RO) < 0) - return NULL; - - if (buf.len != 0) - n = write_bytes(self, buf.buf, buf.len); - - PyBuffer_Release(&buf); + Py_ssize_t n = write_bytes(self, b); return n >= 0 ? PyLong_FromSsize_t(n) : NULL; } @@ -702,7 +727,6 @@ _io_BytesIO_writelines(bytesio *self, PyObject *lines) /*[clinic end generated code: output=7f33aa3271c91752 input=e972539176fc8fc1]*/ { PyObject *it, *item; - PyObject *ret; CHECK_CLOSED(self); @@ -711,13 +735,12 @@ _io_BytesIO_writelines(bytesio *self, PyObject *lines) return NULL; while ((item = PyIter_Next(it)) != NULL) { - ret = _io_BytesIO_write(self, item); + Py_ssize_t ret = write_bytes(self, item); Py_DECREF(item); - if (ret == NULL) { + if (ret < 0) { Py_DECREF(it); return NULL; } - Py_DECREF(ret); } Py_DECREF(it); @@ -1101,7 +1124,7 @@ static PyBufferProcs bytesiobuf_as_buffer = { (releasebufferproc) bytesiobuf_releasebuffer, }; -PyTypeObject _PyBytesIOBuffer_Type = { +Py_EXPORTED_SYMBOL PyTypeObject _PyBytesIOBuffer_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_io._BytesIOBuffer", /*tp_name*/ sizeof(bytesiobuf), /*tp_basicsize*/ diff --git a/Modules/_io/clinic/bufferedio.c.h b/Modules/_io/clinic/bufferedio.c.h index 72841fcb..56d6332a 100644 --- a/Modules/_io/clinic/bufferedio.c.h +++ b/Modules/_io/clinic/bufferedio.c.h @@ -578,7 +578,7 @@ _io_BufferedRWPair___init__(PyObject *self, PyObject *args, PyObject *kwargs) PyObject *writer; Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE; - if ((Py_TYPE(self) == &PyBufferedRWPair_Type) && + if (Py_IS_TYPE(self, &PyBufferedRWPair_Type) && !_PyArg_NoKeywords("BufferedRWPair", kwargs)) { goto exit; } @@ -672,4 +672,4 @@ skip_optional_pos: exit: return return_value; } -/*[clinic end generated code: output=7246104f6c7d3167 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7d9ad40c95bdd808 input=a9049054013a1b77]*/ diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 482d08f9..caf91dfd 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -3,7 +3,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_object.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include #ifdef HAVE_SYS_TYPES_H #include @@ -146,8 +146,8 @@ _io_FileIO_close_impl(fileio *self) PyObject *exc, *val, *tb; int rc; _Py_IDENTIFIER(close); - res = _PyObject_CallMethodIdObjArgs((PyObject*)&PyRawIOBase_Type, - &PyId_close, self, NULL); + res = _PyObject_CallMethodIdOneArg((PyObject*)&PyRawIOBase_Type, + &PyId_close, (PyObject *)self); if (!self->closefd) { self->fd = -1; return res; diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index fab45097..a8e55c34 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -11,7 +11,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_object.h" -#include "structmember.h" +#include // offsetof() #include "_iomodule.h" /*[clinic input] @@ -235,7 +235,7 @@ _io__IOBase_close_impl(PyObject *self) Py_RETURN_NONE; } - res = PyObject_CallMethodObjArgs(self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs(self, _PyIO_str_flush); PyErr_Fetch(&exc, &val, &tb); rc = _PyObject_SetAttrId(self, &PyId___IOBase_closed, Py_True); @@ -281,15 +281,13 @@ iobase_finalize(PyObject *self) finalization process. */ if (_PyObject_SetAttrId(self, &PyId__finalizing, Py_True)) PyErr_Clear(); - res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_close, - NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_close); /* Silencing I/O errors is bad, but printing spurious tracebacks is equally as bad, and potentially more frequent (because of shutdown issues). */ if (res == NULL) { #ifndef Py_DEBUG - const PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; - if (config->dev_mode) { + if (_Py_GetConfig()->dev_mode) { PyErr_WriteUnraisable(self); } else { @@ -383,7 +381,7 @@ _io__IOBase_seekable_impl(PyObject *self) PyObject * _PyIOBase_check_seekable(PyObject *self, PyObject *args) { - PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_seekable, NULL); + PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_seekable); if (res == NULL) return NULL; if (res != Py_True) { @@ -416,7 +414,7 @@ _io__IOBase_readable_impl(PyObject *self) PyObject * _PyIOBase_check_readable(PyObject *self, PyObject *args) { - PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_readable, NULL); + PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_readable); if (res == NULL) return NULL; if (res != Py_True) { @@ -449,7 +447,7 @@ _io__IOBase_writable_impl(PyObject *self) PyObject * _PyIOBase_check_writable(PyObject *self, PyObject *args) { - PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_writable, NULL); + PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_writable); if (res == NULL) return NULL; if (res != Py_True) { @@ -478,7 +476,7 @@ iobase_enter(PyObject *self, PyObject *args) static PyObject * iobase_exit(PyObject *self, PyObject *args) { - return PyObject_CallMethodObjArgs(self, _PyIO_str_close, NULL); + return PyObject_CallMethodNoArgs(self, _PyIO_str_close); } /* Lower-level APIs */ @@ -557,7 +555,7 @@ _io__IOBase_readline_impl(PyObject *self, Py_ssize_t limit) PyObject *b; if (peek != NULL) { - PyObject *readahead = PyObject_CallFunctionObjArgs(peek, _PyLong_One, NULL); + PyObject *readahead = PyObject_CallOneArg(peek, _PyLong_One); if (readahead == NULL) { /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals() when EINTR occurs so we needn't do it ourselves. */ @@ -656,7 +654,7 @@ iobase_iter(PyObject *self) static PyObject * iobase_iternext(PyObject *self) { - PyObject *line = PyObject_CallMethodObjArgs(self, _PyIO_str_readline, NULL); + PyObject *line = PyObject_CallMethodNoArgs(self, _PyIO_str_readline); if (line == NULL) return NULL; @@ -921,7 +919,7 @@ _io__RawIOBase_read_impl(PyObject *self, Py_ssize_t n) if (n < 0) { _Py_IDENTIFIER(readall); - return _PyObject_CallMethodId(self, &PyId_readall, NULL); + return _PyObject_CallMethodIdNoArgs(self, &PyId_readall); } /* TODO: allocate a bytes object directly instead and manually construct diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c index 8b5fa7a3..e76152e6 100644 --- a/Modules/_io/stringio.c +++ b/Modules/_io/stringio.c @@ -1,6 +1,6 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include // offsetof() #include "pycore_accu.h" #include "pycore_object.h" #include "_iomodule.h" @@ -402,14 +402,14 @@ stringio_iternext(stringio *self) CHECK_CLOSED(self); ENSURE_REALIZED(self); - if (Py_TYPE(self) == &PyStringIO_Type) { + if (Py_IS_TYPE(self, &PyStringIO_Type)) { /* Skip method call overhead for speed */ line = _stringio_readline(self, -1); } else { /* XXX is subclassing StringIO really supported? */ - line = PyObject_CallMethodObjArgs((PyObject *)self, - _PyIO_str_readline, NULL); + line = PyObject_CallMethodNoArgs((PyObject *)self, + _PyIO_str_readline); if (line && !PyUnicode_Check(line)) { PyErr_Format(PyExc_OSError, "readline() should have returned a str object, " @@ -714,9 +714,9 @@ _io_StringIO___init___impl(stringio *self, PyObject *value, } if (self->readuniversal) { - self->decoder = PyObject_CallFunction( + self->decoder = PyObject_CallFunctionObjArgs( (PyObject *)&PyIncrementalNewlineDecoder_Type, - "Oi", Py_None, (int) self->readtranslate); + Py_None, self->readtranslate ? Py_True : Py_False, NULL); if (self->decoder == NULL) return -1; } diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index a4bf7cd1..f2c72ebd 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -8,8 +8,10 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_interp.h" // PyInterpreterState.fs_codec #include "pycore_object.h" -#include "structmember.h" +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "structmember.h" // PyMemberDef #include "_iomodule.h" /*[clinic input] @@ -340,7 +342,7 @@ _PyIncrementalNewlineDecoder_decode(PyObject *myself, goto error; kind = PyUnicode_KIND(modified); out = PyUnicode_DATA(modified); - PyUnicode_WRITE(kind, PyUnicode_DATA(modified), 0, '\r'); + PyUnicode_WRITE(kind, out, 0, '\r'); memcpy(out + kind, PyUnicode_DATA(output), kind * output_len); Py_DECREF(output); output = modified; /* output remains ready */ @@ -367,7 +369,7 @@ _PyIncrementalNewlineDecoder_decode(PyObject *myself, /* Record which newlines are read and do newline translation if desired, all in one pass. */ { - void *in_str; + const void *in_str; Py_ssize_t len; int seennl = self->seennl; int only_lf = 0; @@ -447,7 +449,7 @@ _PyIncrementalNewlineDecoder_decode(PyObject *myself, else { void *translated; int kind = PyUnicode_KIND(output); - void *in_str = PyUnicode_DATA(output); + const void *in_str = PyUnicode_DATA(output); Py_ssize_t in, out; /* XXX: Previous in-place translation here is disabled as resizing is not possible anymore */ @@ -527,8 +529,8 @@ _io_IncrementalNewlineDecoder_getstate_impl(nldecoder_object *self) unsigned long long flag; if (self->decoder != Py_None) { - PyObject *state = PyObject_CallMethodObjArgs(self->decoder, - _PyIO_str_getstate, NULL); + PyObject *state = PyObject_CallMethodNoArgs(self->decoder, + _PyIO_str_getstate); if (state == NULL) return NULL; if (!PyTuple_Check(state)) { @@ -601,7 +603,7 @@ _io_IncrementalNewlineDecoder_reset_impl(nldecoder_object *self) self->seennl = 0; self->pendingcr = 0; if (self->decoder != Py_None) - return PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_reset, NULL); + return PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_reset); else Py_RETURN_NONE; } @@ -862,7 +864,7 @@ _textiowrapper_set_decoder(textio *self, PyObject *codec_info, PyObject *res; int r; - res = _PyObject_CallMethodId(self->buffer, &PyId_readable, NULL); + res = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_readable); if (res == NULL) return -1; @@ -880,9 +882,9 @@ _textiowrapper_set_decoder(textio *self, PyObject *codec_info, return -1; if (self->readuniversal) { - PyObject *incrementalDecoder = PyObject_CallFunction( + PyObject *incrementalDecoder = PyObject_CallFunctionObjArgs( (PyObject *)&PyIncrementalNewlineDecoder_Type, - "Oi", self->decoder, (int)self->readtranslate); + self->decoder, self->readtranslate ? Py_True : Py_False, NULL); if (incrementalDecoder == NULL) return -1; Py_CLEAR(self->decoder); @@ -897,7 +899,7 @@ _textiowrapper_decode(PyObject *decoder, PyObject *bytes, int eof) { PyObject *chars; - if (Py_TYPE(decoder) == &PyIncrementalNewlineDecoder_Type) + if (Py_IS_TYPE(decoder, &PyIncrementalNewlineDecoder_Type)) chars = _PyIncrementalNewlineDecoder_decode(decoder, bytes, eof); else chars = PyObject_CallMethodObjArgs(decoder, _PyIO_str_decode, bytes, @@ -917,7 +919,7 @@ _textiowrapper_set_encoder(textio *self, PyObject *codec_info, PyObject *res; int r; - res = _PyObject_CallMethodId(self->buffer, &PyId_writable, NULL); + res = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_writable); if (res == NULL) return -1; @@ -963,8 +965,8 @@ _textiowrapper_fix_encoder_state(textio *self) self->encoding_start_of_stream = 1; - PyObject *cookieObj = PyObject_CallMethodObjArgs( - self->buffer, _PyIO_str_tell, NULL); + PyObject *cookieObj = PyObject_CallMethodNoArgs( + self->buffer, _PyIO_str_tell); if (cookieObj == NULL) { return -1; } @@ -977,8 +979,8 @@ _textiowrapper_fix_encoder_state(textio *self) if (cmp == 0) { self->encoding_start_of_stream = 0; - PyObject *res = PyObject_CallMethodObjArgs( - self->encoder, _PyIO_str_setstate, _PyLong_Zero, NULL); + PyObject *res = PyObject_CallMethodOneArg( + self->encoder, _PyIO_str_setstate, _PyLong_Zero); if (res == NULL) { return -1; } @@ -988,6 +990,46 @@ _textiowrapper_fix_encoder_state(textio *self) return 0; } +static int +io_check_errors(PyObject *errors) +{ + assert(errors != NULL && errors != Py_None); + + PyInterpreterState *interp = _PyInterpreterState_GET(); +#ifndef Py_DEBUG + /* In release mode, only check in development mode (-X dev) */ + if (!_PyInterpreterState_GetConfig(interp)->dev_mode) { + return 0; + } +#else + /* Always check in debug mode */ +#endif + + /* Avoid calling PyCodec_LookupError() before the codec registry is ready: + before_PyUnicode_InitEncodings() is called. */ + if (!interp->unicode.fs_codec.encoding) { + return 0; + } + + Py_ssize_t name_length; + const char *name = PyUnicode_AsUTF8AndSize(errors, &name_length); + if (name == NULL) { + return -1; + } + if (strlen(name) != (size_t)name_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character in errors"); + return -1; + } + PyObject *handler = PyCodec_LookupError(name); + if (handler != NULL) { + Py_DECREF(handler); + return 0; + } + return -1; +} + + + /*[clinic input] _io.TextIOWrapper.__init__ buffer: object @@ -1054,7 +1096,10 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, PyErr_Format( PyExc_TypeError, "TextIOWrapper() argument 'errors' must be str or None, not %.50s", - errors->ob_type->tp_name); + Py_TYPE(errors)->tp_name); + return -1; + } + else if (io_check_errors(errors)) { return -1; } @@ -1083,7 +1128,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, state = IO_STATE(); if (state == NULL) goto error; - fileno = _PyObject_CallMethodId(buffer, &PyId_fileno, NULL); + fileno = _PyObject_CallMethodIdNoArgs(buffer, &PyId_fileno); /* Ignore only AttributeError and UnsupportedOperation */ if (fileno == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError) || @@ -1112,8 +1157,8 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, PyObject *locale_module = _PyIO_get_locale_module(state); if (locale_module == NULL) goto catch_ImportError; - self->encoding = _PyObject_CallMethodIdObjArgs( - locale_module, &PyId_getpreferredencoding, Py_False, NULL); + self->encoding = _PyObject_CallMethodIdOneArg( + locale_module, &PyId_getpreferredencoding, Py_False); Py_DECREF(locale_module); if (self->encoding == NULL) { catch_ImportError: @@ -1183,22 +1228,22 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, /* Finished sorting out the codec details */ Py_CLEAR(codec_info); - if (Py_TYPE(buffer) == &PyBufferedReader_Type || - Py_TYPE(buffer) == &PyBufferedWriter_Type || - Py_TYPE(buffer) == &PyBufferedRandom_Type) + if (Py_IS_TYPE(buffer, &PyBufferedReader_Type) || + Py_IS_TYPE(buffer, &PyBufferedWriter_Type) || + Py_IS_TYPE(buffer, &PyBufferedRandom_Type)) { if (_PyObject_LookupAttrId(buffer, &PyId_raw, &raw) < 0) goto error; /* Cache the raw FileIO object to speed up 'closed' checks */ if (raw != NULL) { - if (Py_TYPE(raw) == &PyFileIO_Type) + if (Py_IS_TYPE(raw, &PyFileIO_Type)) self->raw = raw; else Py_DECREF(raw); } } - res = _PyObject_CallMethodId(buffer, &PyId_seekable, NULL); + res = _PyObject_CallMethodIdNoArgs(buffer, &PyId_seekable); if (res == NULL) goto error; r = PyObject_IsTrue(res); @@ -1343,7 +1388,7 @@ _io_TextIOWrapper_reconfigure_impl(textio *self, PyObject *encoding, return NULL; } - PyObject *res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + PyObject *res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) { return NULL; } @@ -1423,7 +1468,7 @@ textiowrapper_closed_get(textio *self, void *context); do { \ int r; \ PyObject *_res; \ - if (Py_TYPE(self) == &PyTextIOWrapper_Type) { \ + if (Py_IS_TYPE(self, &PyTextIOWrapper_Type)) { \ if (self->raw != NULL) \ r = _PyFileIO_closed(self->raw); \ else { \ @@ -1482,7 +1527,7 @@ _io_TextIOWrapper_detach_impl(textio *self) { PyObject *buffer, *res; CHECK_ATTACHED(self); - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); @@ -1554,8 +1599,7 @@ _textiowrapper_writeflush(textio *self) PyObject *ret; do { - ret = PyObject_CallMethodObjArgs(self->buffer, - _PyIO_str_write, b, NULL); + ret = PyObject_CallMethodOneArg(self->buffer, _PyIO_str_write, b); } while (ret == NULL && _PyIO_trap_eintr()); Py_DECREF(b); if (ret == NULL) @@ -1625,8 +1669,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) self->encoding_start_of_stream = 0; } else - b = PyObject_CallMethodObjArgs(self->encoder, - _PyIO_str_encode, text, NULL); + b = PyObject_CallMethodOneArg(self->encoder, _PyIO_str_encode, text); Py_DECREF(text); if (b == NULL) @@ -1677,7 +1720,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) } if (needflush) { - ret = PyObject_CallMethodObjArgs(self->buffer, _PyIO_str_flush, NULL); + ret = PyObject_CallMethodNoArgs(self->buffer, _PyIO_str_flush); if (ret == NULL) return NULL; Py_DECREF(ret); @@ -1687,7 +1730,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) Py_CLEAR(self->snapshot); if (self->decoder) { - ret = _PyObject_CallMethodId(self->decoder, &PyId_reset, NULL); + ret = _PyObject_CallMethodIdNoArgs(self->decoder, &PyId_reset); if (ret == NULL) return NULL; Py_DECREF(ret); @@ -1767,9 +1810,8 @@ textiowrapper_read_chunk(textio *self, Py_ssize_t size_hint) /* To prepare for tell(), we need to snapshot a point in the file * where the decoder's input buffer is empty. */ - - PyObject *state = PyObject_CallMethodObjArgs(self->decoder, - _PyIO_str_getstate, NULL); + PyObject *state = PyObject_CallMethodNoArgs(self->decoder, + _PyIO_str_getstate); if (state == NULL) return -1; /* Given this, we know there was a valid snapshot point @@ -1809,9 +1851,9 @@ textiowrapper_read_chunk(textio *self, Py_ssize_t size_hint) if (chunk_size == NULL) goto fail; - input_chunk = PyObject_CallMethodObjArgs(self->buffer, + input_chunk = PyObject_CallMethodOneArg(self->buffer, (self->has_read1 ? _PyIO_str_read1: _PyIO_str_read), - chunk_size, NULL); + chunk_size); Py_DECREF(chunk_size); if (input_chunk == NULL) goto fail; @@ -1892,12 +1934,12 @@ _io_TextIOWrapper_read_impl(textio *self, Py_ssize_t n) if (n < 0) { /* Read everything */ - PyObject *bytes = _PyObject_CallMethodId(self->buffer, &PyId_read, NULL); + PyObject *bytes = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_read); PyObject *decoded; if (bytes == NULL) goto fail; - if (Py_TYPE(self->decoder) == &PyIncrementalNewlineDecoder_Type) + if (Py_IS_TYPE(self->decoder, &PyIncrementalNewlineDecoder_Type)) decoded = _PyIncrementalNewlineDecoder_decode(self->decoder, bytes, 1); else @@ -2045,7 +2087,7 @@ _PyIO_find_line_ending( else { /* Non-universal mode. */ Py_ssize_t readnl_len = PyUnicode_GET_LENGTH(readnl); - Py_UCS1 *nl = PyUnicode_1BYTE_DATA(readnl); + const Py_UCS1 *nl = PyUnicode_1BYTE_DATA(readnl); /* Assume that readnl is an ASCII character. */ assert(PyUnicode_KIND(readnl) == PyUnicode_1BYTE_KIND); if (readnl_len == 1) { @@ -2099,7 +2141,7 @@ _textiowrapper_readline(textio *self, Py_ssize_t limit) chunked = 0; while (1) { - char *ptr; + const char *ptr; Py_ssize_t line_len; int kind; Py_ssize_t consumed = 0; @@ -2353,7 +2395,7 @@ _textiowrapper_decoder_setstate(textio *self, cookie_type *cookie) utf-16, that we are expecting a BOM). */ if (cookie->start_pos == 0 && cookie->dec_flags == 0) - res = PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_reset, NULL); + res = PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_reset); else res = _PyObject_CallMethodId(self->decoder, &PyId_setstate, "((yi))", "", cookie->dec_flags); @@ -2368,12 +2410,12 @@ _textiowrapper_encoder_reset(textio *self, int start_of_stream) { PyObject *res; if (start_of_stream) { - res = PyObject_CallMethodObjArgs(self->encoder, _PyIO_str_reset, NULL); + res = PyObject_CallMethodNoArgs(self->encoder, _PyIO_str_reset); self->encoding_start_of_stream = 1; } else { - res = PyObject_CallMethodObjArgs(self->encoder, _PyIO_str_setstate, - _PyLong_Zero, NULL); + res = PyObject_CallMethodOneArg(self->encoder, _PyIO_str_setstate, + _PyLong_Zero); self->encoding_start_of_stream = 0; } if (res == NULL) @@ -2433,7 +2475,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) * sync the underlying buffer with the current position. */ Py_DECREF(cookieObj); - cookieObj = _PyObject_CallMethodId((PyObject *)self, &PyId_tell, NULL); + cookieObj = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_tell); if (cookieObj == NULL) goto fail; break; @@ -2449,7 +2491,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } - res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); + res = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_flush); if (res == NULL) goto fail; Py_DECREF(res); @@ -2457,7 +2499,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) textiowrapper_set_decoded_chars(self, NULL); Py_CLEAR(self->snapshot); if (self->decoder) { - res = _PyObject_CallMethodId(self->decoder, &PyId_reset, NULL); + res = _PyObject_CallMethodIdNoArgs(self->decoder, &PyId_reset); if (res == NULL) goto fail; Py_DECREF(res); @@ -2497,7 +2539,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) goto fail; Py_DECREF(res); @@ -2512,8 +2554,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) posobj = PyLong_FromOff_t(cookie.start_pos); if (posobj == NULL) goto fail; - res = PyObject_CallMethodObjArgs(self->buffer, - _PyIO_str_seek, posobj, NULL); + res = PyObject_CallMethodOneArg(self->buffer, _PyIO_str_seek, posobj); Py_DECREF(posobj); if (res == NULL) goto fail; @@ -2552,8 +2593,8 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) } Py_XSETREF(self->snapshot, snapshot); - decoded = _PyObject_CallMethodId(self->decoder, &PyId_decode, - "Oi", input_chunk, (int)cookie.need_eof); + decoded = _PyObject_CallMethodIdObjArgs(self->decoder, &PyId_decode, + input_chunk, cookie.need_eof ? Py_True : Py_False, NULL); if (check_decoded(decoded) < 0) goto fail; @@ -2601,7 +2642,7 @@ _io_TextIOWrapper_tell_impl(textio *self) Py_ssize_t chars_to_skip, chars_decoded; Py_ssize_t skip_bytes, skip_back; PyObject *saved_state = NULL; - char *input, *input_end; + const char *input, *input_end; Py_ssize_t dec_buffer_len; int dec_flags; @@ -2620,12 +2661,12 @@ _io_TextIOWrapper_tell_impl(textio *self) if (_textiowrapper_writeflush(self) < 0) return NULL; - res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); + res = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_flush); if (res == NULL) goto fail; Py_DECREF(res); - posobj = _PyObject_CallMethodId(self->buffer, &PyId_tell, NULL); + posobj = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_tell); if (posobj == NULL) goto fail; @@ -2661,15 +2702,15 @@ _io_TextIOWrapper_tell_impl(textio *self) chars_to_skip = self->decoded_chars_used; /* Decoder state will be restored at the end */ - saved_state = PyObject_CallMethodObjArgs(self->decoder, - _PyIO_str_getstate, NULL); + saved_state = PyObject_CallMethodNoArgs(self->decoder, + _PyIO_str_getstate); if (saved_state == NULL) goto fail; #define DECODER_GETSTATE() do { \ PyObject *dec_buffer; \ - PyObject *_state = PyObject_CallMethodObjArgs(self->decoder, \ - _PyIO_str_getstate, NULL); \ + PyObject *_state = PyObject_CallMethodNoArgs(self->decoder, \ + _PyIO_str_getstate); \ if (_state == NULL) \ goto fail; \ if (!PyTuple_Check(_state)) { \ @@ -2780,7 +2821,7 @@ _io_TextIOWrapper_tell_impl(textio *self) if (input == input_end) { /* We didn't get enough decoded data; signal EOF to get more. */ PyObject *decoded = _PyObject_CallMethodId( - self->decoder, &PyId_decode, "yi", "", /* final = */ 1); + self->decoder, &PyId_decode, "yO", "", /* final = */ Py_True); if (check_decoded(decoded) < 0) goto fail; chars_decoded += PyUnicode_GET_LENGTH(decoded); @@ -2795,7 +2836,7 @@ _io_TextIOWrapper_tell_impl(textio *self) } finally: - res = _PyObject_CallMethodIdObjArgs(self->decoder, &PyId_setstate, saved_state, NULL); + res = _PyObject_CallMethodIdOneArg(self->decoder, &PyId_setstate, saved_state); Py_DECREF(saved_state); if (res == NULL) return NULL; @@ -2809,7 +2850,7 @@ fail: if (saved_state) { PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); - res = _PyObject_CallMethodIdObjArgs(self->decoder, &PyId_setstate, saved_state, NULL); + res = _PyObject_CallMethodIdOneArg(self->decoder, &PyId_setstate, saved_state); _PyErr_ChainExceptions(type, value, traceback); Py_DECREF(saved_state); Py_XDECREF(res); @@ -2831,12 +2872,12 @@ _io_TextIOWrapper_truncate_impl(textio *self, PyObject *pos) CHECK_ATTACHED(self) - res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); - return PyObject_CallMethodObjArgs(self->buffer, _PyIO_str_truncate, pos, NULL); + return PyObject_CallMethodOneArg(self->buffer, _PyIO_str_truncate, pos); } static PyObject * @@ -2916,7 +2957,7 @@ _io_TextIOWrapper_fileno_impl(textio *self) /*[clinic end generated code: output=21490a4c3da13e6c input=c488ca83d0069f9b]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_fileno, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_fileno); } /*[clinic input] @@ -2928,7 +2969,7 @@ _io_TextIOWrapper_seekable_impl(textio *self) /*[clinic end generated code: output=ab223dbbcffc0f00 input=8b005ca06e1fca13]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_seekable, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_seekable); } /*[clinic input] @@ -2940,7 +2981,7 @@ _io_TextIOWrapper_readable_impl(textio *self) /*[clinic end generated code: output=72ff7ba289a8a91b input=0704ea7e01b0d3eb]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_readable, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_readable); } /*[clinic input] @@ -2952,7 +2993,7 @@ _io_TextIOWrapper_writable_impl(textio *self) /*[clinic end generated code: output=a728c71790d03200 input=c41740bc9d8636e8]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_writable, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_writable); } /*[clinic input] @@ -2964,7 +3005,7 @@ _io_TextIOWrapper_isatty_impl(textio *self) /*[clinic end generated code: output=12be1a35bace882e input=fb68d9f2c99bbfff]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_isatty, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_isatty); } /*[clinic input] @@ -2980,7 +3021,7 @@ _io_TextIOWrapper_flush_impl(textio *self) self->telling = self->seekable; if (_textiowrapper_writeflush(self) < 0) return NULL; - return _PyObject_CallMethodId(self->buffer, &PyId_flush, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_flush); } /*[clinic input] @@ -3009,21 +3050,21 @@ _io_TextIOWrapper_close_impl(textio *self) else { PyObject *exc = NULL, *val, *tb; if (self->finalizing) { - res = _PyObject_CallMethodIdObjArgs(self->buffer, - &PyId__dealloc_warn, - self, NULL); + res = _PyObject_CallMethodIdOneArg(self->buffer, + &PyId__dealloc_warn, + (PyObject *)self); if (res) Py_DECREF(res); else PyErr_Clear(); } - res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); + res = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_flush); if (res == NULL) PyErr_Fetch(&exc, &val, &tb); else Py_DECREF(res); - res = _PyObject_CallMethodId(self->buffer, &PyId_close, NULL); + res = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_close); if (exc != NULL) { _PyErr_ChainExceptions(exc, val, tb); Py_CLEAR(res); @@ -3040,13 +3081,13 @@ textiowrapper_iternext(textio *self) CHECK_ATTACHED(self); self->telling = 0; - if (Py_TYPE(self) == &PyTextIOWrapper_Type) { + if (Py_IS_TYPE(self, &PyTextIOWrapper_Type)) { /* Skip method call overhead for speed */ line = _textiowrapper_readline(self, -1); } else { - line = PyObject_CallMethodObjArgs((PyObject *)self, - _PyIO_str_readline, NULL); + line = PyObject_CallMethodNoArgs((PyObject *)self, + _PyIO_str_readline); if (line && !PyUnicode_Check(line)) { PyErr_Format(PyExc_OSError, "readline() should have returned a str object, " diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index ea5d24f9..a83ef37a 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -12,7 +12,7 @@ #ifdef MS_WINDOWS -#include "structmember.h" +#include "structmember.h" // PyMemberDef #ifdef HAVE_SYS_TYPES_H #include #endif @@ -204,8 +204,8 @@ _io__WindowsConsoleIO_close_impl(winconsoleio *self) PyObject *exc, *val, *tb; int rc; _Py_IDENTIFIER(close); - res = _PyObject_CallMethodIdObjArgs((PyObject*)&PyRawIOBase_Type, - &PyId_close, self, NULL); + res = _PyObject_CallMethodIdOneArg((PyObject*)&PyRawIOBase_Type, + &PyId_close, (PyObject*)self); if (!self->closehandle) { self->handle = INVALID_HANDLE_VALUE; return res; diff --git a/Modules/_json.c b/Modules/_json.c index 048a9654..faa3944e 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -9,22 +9,22 @@ #endif #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "pycore_accu.h" -#ifdef __GNUC__ -#define UNUSED __attribute__((__unused__)) -#else -#define UNUSED -#endif +typedef struct { + PyObject *PyScannerType; + PyObject *PyEncoderType; +} _jsonmodulestate; -#define PyScanner_Check(op) PyObject_TypeCheck(op, &PyScannerType) -#define PyScanner_CheckExact(op) (Py_TYPE(op) == &PyScannerType) -#define PyEncoder_Check(op) PyObject_TypeCheck(op, &PyEncoderType) -#define PyEncoder_CheckExact(op) (Py_TYPE(op) == &PyEncoderType) +static inline _jsonmodulestate* +get_json_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_jsonmodulestate *)state; +} -static PyTypeObject PyScannerType; -static PyTypeObject PyEncoderType; typedef struct _PyScannerObject { PyObject_HEAD @@ -73,25 +73,12 @@ static PyMemberDef encoder_members[] = { {NULL} }; -static PyObject * -join_list_unicode(PyObject *lst) -{ - /* return u''.join(lst) */ - static PyObject *sep = NULL; - if (sep == NULL) { - sep = PyUnicode_FromStringAndSize("", 0); - if (sep == NULL) - return NULL; - } - return PyUnicode_Join(sep, lst); -} - /* Forward decls */ static PyObject * ascii_escape_unicode(PyObject *pystr); static PyObject * -py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr); +py_encode_basestring_ascii(PyObject* Py_UNUSED(self), PyObject *pystr); void init_json(void); static PyObject * scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr); @@ -102,13 +89,13 @@ scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static void scanner_dealloc(PyObject *self); static int -scanner_clear(PyObject *self); +scanner_clear(PyScannerObject *self); static PyObject * encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static void encoder_dealloc(PyObject *self); static int -encoder_clear(PyObject *self); +encoder_clear(PyEncoderObject *self); static int encoder_listencode_list(PyEncoderObject *s, _PyAccu *acc, PyObject *seq, Py_ssize_t indent_level); static int @@ -172,8 +159,8 @@ ascii_escape_unicode(PyObject *pystr) Py_ssize_t output_size; Py_ssize_t chars; PyObject *rval; - void *input; - unsigned char *output; + const void *input; + Py_UCS1 *output; int kind; if (PyUnicode_READY(pystr) == -1) @@ -238,7 +225,7 @@ escape_unicode(PyObject *pystr) Py_ssize_t output_size; Py_ssize_t chars; PyObject *rval; - void *input; + const void *input; int kind; Py_UCS4 maxchar; @@ -385,21 +372,6 @@ _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) { return tpl; } -#define APPEND_OLD_CHUNK \ - if (chunk != NULL) { \ - if (chunks == NULL) { \ - chunks = PyList_New(0); \ - if (chunks == NULL) { \ - goto bail; \ - } \ - } \ - if (PyList_Append(chunks, chunk)) { \ - Py_CLEAR(chunk); \ - goto bail; \ - } \ - Py_CLEAR(chunk); \ - } - static PyObject * scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next_end_ptr) { @@ -417,12 +389,14 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next Py_ssize_t next /* = begin */; const void *buf; int kind; - PyObject *chunks = NULL; - PyObject *chunk = NULL; if (PyUnicode_READY(pystr) == -1) return 0; + _PyUnicodeWriter writer; + _PyUnicodeWriter_Init(&writer); + writer.overallocate = 1; + len = PyUnicode_GET_LENGTH(pystr); buf = PyUnicode_DATA(pystr); kind = PyUnicode_KIND(pystr); @@ -433,29 +407,42 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next } while (1) { /* Find the end of the string or the next escape */ - Py_UCS4 c = 0; - for (next = end; next < len; next++) { - c = PyUnicode_READ(kind, buf, next); - if (c == '"' || c == '\\') { - break; + Py_UCS4 c; + { + // Use tight scope variable to help register allocation. + Py_UCS4 d = 0; + for (next = end; next < len; next++) { + d = PyUnicode_READ(kind, buf, next); + if (d == '"' || d == '\\') { + break; + } + if (d <= 0x1f && strict) { + raise_errmsg("Invalid control character at", pystr, next); + goto bail; + } } - else if (c <= 0x1f && strict) { - raise_errmsg("Invalid control character at", pystr, next); - goto bail; + c = d; + } + + if (c == '"') { + // Fast path for simple case. + if (writer.buffer == NULL) { + PyObject *ret = PyUnicode_Substring(pystr, end, next); + if (ret == NULL) { + goto bail; + } + *next_end_ptr = next + 1;; + return ret; } } - if (!(c == '"' || c == '\\')) { + else if (c != '\\') { raise_errmsg("Unterminated string starting at", pystr, begin); goto bail; } + /* Pick up this chunk if it's not zero length */ if (next != end) { - APPEND_OLD_CHUNK - chunk = PyUnicode_FromKindAndData( - kind, - (char*)buf + kind * end, - next - end); - if (chunk == NULL) { + if (_PyUnicodeWriter_WriteSubstring(&writer, pystr, end, next) < 0) { goto bail; } } @@ -546,34 +533,18 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next end -= 6; } } - APPEND_OLD_CHUNK - chunk = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, &c, 1); - if (chunk == NULL) { + if (_PyUnicodeWriter_WriteChar(&writer, c) < 0) { goto bail; } } - if (chunks == NULL) { - if (chunk != NULL) - rval = chunk; - else - rval = PyUnicode_FromStringAndSize("", 0); - } - else { - APPEND_OLD_CHUNK - rval = join_list_unicode(chunks); - if (rval == NULL) { - goto bail; - } - Py_CLEAR(chunks); - } - + rval = _PyUnicodeWriter_Finish(&writer); *next_end_ptr = end; return rval; + bail: *next_end_ptr = -1; - Py_XDECREF(chunks); - Py_XDECREF(chunk); + _PyUnicodeWriter_Dealloc(&writer); return NULL; } @@ -591,7 +562,7 @@ PyDoc_STRVAR(pydoc_scanstring, ); static PyObject * -py_scanstring(PyObject* self UNUSED, PyObject *args) +py_scanstring(PyObject* Py_UNUSED(self), PyObject *args) { PyObject *pystr; PyObject *rval; @@ -620,7 +591,7 @@ PyDoc_STRVAR(pydoc_encode_basestring_ascii, ); static PyObject * -py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr) +py_encode_basestring_ascii(PyObject* Py_UNUSED(self), PyObject *pystr) { PyObject *rval; /* Return an ASCII-only JSON representation of a Python string */ @@ -645,7 +616,7 @@ PyDoc_STRVAR(pydoc_encode_basestring, ); static PyObject * -py_encode_basestring(PyObject* self UNUSED, PyObject *pystr) +py_encode_basestring(PyObject* Py_UNUSED(self), PyObject *pystr) { PyObject *rval; /* Return a JSON representation of a Python string */ @@ -665,38 +636,36 @@ py_encode_basestring(PyObject* self UNUSED, PyObject *pystr) static void scanner_dealloc(PyObject *self) { + PyTypeObject *tp = Py_TYPE(self); /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(self); - scanner_clear(self); - Py_TYPE(self)->tp_free(self); + scanner_clear((PyScannerObject *)self); + tp->tp_free(self); + Py_DECREF(tp); } static int -scanner_traverse(PyObject *self, visitproc visit, void *arg) +scanner_traverse(PyScannerObject *self, visitproc visit, void *arg) { - PyScannerObject *s; - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; - Py_VISIT(s->object_hook); - Py_VISIT(s->object_pairs_hook); - Py_VISIT(s->parse_float); - Py_VISIT(s->parse_int); - Py_VISIT(s->parse_constant); + Py_VISIT(Py_TYPE(self)); + Py_VISIT(self->object_hook); + Py_VISIT(self->object_pairs_hook); + Py_VISIT(self->parse_float); + Py_VISIT(self->parse_int); + Py_VISIT(self->parse_constant); + Py_VISIT(self->memo); return 0; } static int -scanner_clear(PyObject *self) +scanner_clear(PyScannerObject *self) { - PyScannerObject *s; - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; - Py_CLEAR(s->object_hook); - Py_CLEAR(s->object_pairs_hook); - Py_CLEAR(s->parse_float); - Py_CLEAR(s->parse_int); - Py_CLEAR(s->parse_constant); - Py_CLEAR(s->memo); + Py_CLEAR(self->object_hook); + Py_CLEAR(self->object_pairs_hook); + Py_CLEAR(self->parse_float); + Py_CLEAR(self->parse_int); + Py_CLEAR(self->parse_constant); + Py_CLEAR(self->memo); return 0; } @@ -710,7 +679,7 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss Returns a new PyObject (usually a dict, but object_hook can change that) */ - void *str; + const void *str; int kind; Py_ssize_t end_idx; PyObject *val = NULL; @@ -749,19 +718,13 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss key = scanstring_unicode(pystr, idx + 1, s->strict, &next_idx); if (key == NULL) goto bail; - memokey = PyDict_GetItemWithError(s->memo, key); - if (memokey != NULL) { - Py_INCREF(memokey); - Py_DECREF(key); - key = memokey; - } - else if (PyErr_Occurred()) { + memokey = PyDict_SetDefault(s->memo, key, key); + if (memokey == NULL) { goto bail; } - else { - if (PyDict_SetItem(s->memo, key, key) < 0) - goto bail; - } + Py_INCREF(memokey); + Py_DECREF(key); + key = memokey; idx = next_idx; /* skip whitespace between key and : delimiter, read :, skip whitespace */ @@ -818,14 +781,14 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss *next_idx_ptr = idx + 1; if (has_pairs_hook) { - val = PyObject_CallFunctionObjArgs(s->object_pairs_hook, rval, NULL); + val = PyObject_CallOneArg(s->object_pairs_hook, rval); Py_DECREF(rval); return val; } /* if object_hook is not None: rval = object_hook(rval) */ if (s->object_hook != Py_None) { - val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL); + val = PyObject_CallOneArg(s->object_hook, rval); Py_DECREF(rval); return val; } @@ -846,7 +809,7 @@ _parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssi Returns a new PyList */ - void *str; + const void *str; int kind; Py_ssize_t end_idx; PyObject *val = NULL; @@ -931,7 +894,7 @@ _parse_constant(PyScannerObject *s, const char *constant, Py_ssize_t idx, Py_ssi return NULL; /* rval = parse_constant(constant) */ - rval = PyObject_CallFunctionObjArgs(s->parse_constant, cstr, NULL); + rval = PyObject_CallOneArg(s->parse_constant, cstr); idx += PyUnicode_GET_LENGTH(cstr); Py_DECREF(cstr); *next_idx_ptr = idx; @@ -949,7 +912,7 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ PyLong, or PyFloat. May return other types if parse_int or parse_float are set */ - void *str; + const void *str; int kind; Py_ssize_t end_idx; Py_ssize_t idx = start; @@ -1030,7 +993,7 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ idx - start); if (numstr == NULL) return NULL; - rval = PyObject_CallFunctionObjArgs(custom_func, numstr, NULL); + rval = PyObject_CallOneArg(custom_func, numstr); } else { Py_ssize_t i, n; @@ -1066,7 +1029,7 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_ Returns a new PyObject representation of the term. */ PyObject *res; - void *str; + const void *str; int kind; Py_ssize_t length; @@ -1168,7 +1131,7 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_ } static PyObject * -scanner_call(PyObject *self, PyObject *args, PyObject *kwds) +scanner_call(PyScannerObject *self, PyObject *args, PyObject *kwds) { /* Python callable interface to scan_once_{str,unicode} */ PyObject *pystr; @@ -1176,14 +1139,11 @@ scanner_call(PyObject *self, PyObject *args, PyObject *kwds) Py_ssize_t idx; Py_ssize_t next_idx = -1; static char *kwlist[] = {"string", "idx", NULL}; - PyScannerObject *s; - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; if (!PyArg_ParseTupleAndKeywords(args, kwds, "On:scan_once", kwlist, &pystr, &idx)) return NULL; if (PyUnicode_Check(pystr)) { - rval = scan_once_unicode(s, pystr, idx, &next_idx); + rval = scan_once_unicode(self, pystr, idx, &next_idx); } else { PyErr_Format(PyExc_TypeError, @@ -1191,7 +1151,7 @@ scanner_call(PyObject *self, PyObject *args, PyObject *kwds) Py_TYPE(pystr)->tp_name); return NULL; } - PyDict_Clear(s->memo); + PyDict_Clear(self->memo); if (rval == NULL) return NULL; return _build_rval_index_tuple(rval, next_idx); @@ -1250,47 +1210,23 @@ bail: PyDoc_STRVAR(scanner_doc, "JSON scanner object"); -static -PyTypeObject PyScannerType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_json.Scanner", /* tp_name */ - sizeof(PyScannerObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - scanner_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - scanner_call, /* tp_call */ - 0, /* tp_str */ - 0,/* PyObject_GenericGetAttr, */ /* tp_getattro */ - 0,/* PyObject_GenericSetAttr, */ /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - scanner_doc, /* tp_doc */ - scanner_traverse, /* tp_traverse */ - scanner_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - scanner_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0,/* PyType_GenericAlloc, */ /* tp_alloc */ - scanner_new, /* tp_new */ - 0,/* PyObject_GC_Del, */ /* tp_free */ +static PyType_Slot PyScannerType_slots[] = { + {Py_tp_doc, (void *)scanner_doc}, + {Py_tp_dealloc, scanner_dealloc}, + {Py_tp_call, scanner_call}, + {Py_tp_traverse, scanner_traverse}, + {Py_tp_clear, scanner_clear}, + {Py_tp_members, scanner_members}, + {Py_tp_new, scanner_new}, + {0, 0} +}; + +static PyType_Spec PyScannerType_spec = { + .name = "_json.Scanner", + .basicsize = sizeof(PyScannerObject), + .itemsize = 0, + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .slots = PyScannerType_slots, }; static PyObject * @@ -1348,23 +1284,19 @@ encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } static PyObject * -encoder_call(PyObject *self, PyObject *args, PyObject *kwds) +encoder_call(PyEncoderObject *self, PyObject *args, PyObject *kwds) { /* Python callable interface to encode_listencode_obj */ static char *kwlist[] = {"obj", "_current_indent_level", NULL}; PyObject *obj; Py_ssize_t indent_level; - PyEncoderObject *s; _PyAccu acc; - - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; if (!PyArg_ParseTupleAndKeywords(args, kwds, "On:_iterencode", kwlist, &obj, &indent_level)) return NULL; if (_PyAccu_Init(&acc)) return NULL; - if (encoder_listencode_obj(s, &acc, obj, indent_level)) { + if (encoder_listencode_obj(self, &acc, obj, indent_level)) { _PyAccu_Destroy(&acc); return NULL; } @@ -1440,7 +1372,7 @@ encoder_encode_string(PyEncoderObject *s, PyObject *obj) if (s->fast_encode) { return s->fast_encode(NULL, obj); } - encoded = PyObject_CallFunctionObjArgs(s->encoder, obj, NULL); + encoded = PyObject_CallOneArg(s->encoder, obj); if (encoded != NULL && !PyUnicode_Check(encoded)) { PyErr_Format(PyExc_TypeError, "encoder() must return a string, not %.80s", @@ -1526,7 +1458,7 @@ encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc, return -1; } } - newobj = PyObject_CallFunctionObjArgs(s->defaultfn, obj, NULL); + newobj = PyObject_CallOneArg(s->defaultfn, obj); if (newobj == NULL) { Py_XDECREF(ident); return -1; @@ -1658,7 +1590,7 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc, else { PyErr_Format(PyExc_TypeError, "keys must be str, int, float, bool or None, " - "not %.100s", key->ob_type->tp_name); + "not %.100s", Py_TYPE(key)->tp_name); goto bail; } @@ -1803,86 +1735,59 @@ bail: static void encoder_dealloc(PyObject *self) { + PyTypeObject *tp = Py_TYPE(self); /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(self); - encoder_clear(self); - Py_TYPE(self)->tp_free(self); + encoder_clear((PyEncoderObject *)self); + tp->tp_free(self); + Py_DECREF(tp); } static int -encoder_traverse(PyObject *self, visitproc visit, void *arg) +encoder_traverse(PyEncoderObject *self, visitproc visit, void *arg) { - PyEncoderObject *s; - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; - Py_VISIT(s->markers); - Py_VISIT(s->defaultfn); - Py_VISIT(s->encoder); - Py_VISIT(s->indent); - Py_VISIT(s->key_separator); - Py_VISIT(s->item_separator); + Py_VISIT(Py_TYPE(self)); + Py_VISIT(self->markers); + Py_VISIT(self->defaultfn); + Py_VISIT(self->encoder); + Py_VISIT(self->indent); + Py_VISIT(self->key_separator); + Py_VISIT(self->item_separator); return 0; } static int -encoder_clear(PyObject *self) +encoder_clear(PyEncoderObject *self) { /* Deallocate Encoder */ - PyEncoderObject *s; - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; - Py_CLEAR(s->markers); - Py_CLEAR(s->defaultfn); - Py_CLEAR(s->encoder); - Py_CLEAR(s->indent); - Py_CLEAR(s->key_separator); - Py_CLEAR(s->item_separator); + Py_CLEAR(self->markers); + Py_CLEAR(self->defaultfn); + Py_CLEAR(self->encoder); + Py_CLEAR(self->indent); + Py_CLEAR(self->key_separator); + Py_CLEAR(self->item_separator); return 0; } PyDoc_STRVAR(encoder_doc, "_iterencode(obj, _current_indent_level) -> iterable"); -static -PyTypeObject PyEncoderType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_json.Encoder", /* tp_name */ - sizeof(PyEncoderObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - encoder_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - encoder_call, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - encoder_doc, /* tp_doc */ - encoder_traverse, /* tp_traverse */ - encoder_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - encoder_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - encoder_new, /* tp_new */ - 0, /* tp_free */ +static PyType_Slot PyEncoderType_slots[] = { + {Py_tp_doc, (void *)encoder_doc}, + {Py_tp_dealloc, encoder_dealloc}, + {Py_tp_call, encoder_call}, + {Py_tp_traverse, encoder_traverse}, + {Py_tp_clear, encoder_clear}, + {Py_tp_members, encoder_members}, + {Py_tp_new, encoder_new}, + {0, 0} +}; + +static PyType_Spec PyEncoderType_spec = { + .name = "_json.Encoder", + .basicsize = sizeof(PyEncoderObject), + .itemsize = 0, + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .slots = PyEncoderType_slots }; static PyMethodDef speedups_methods[] = { @@ -1904,40 +1809,77 @@ static PyMethodDef speedups_methods[] = { PyDoc_STRVAR(module_doc, "json speedups\n"); +static int +_json_exec(PyObject *module) +{ + _jsonmodulestate *state = get_json_state(module); + + state->PyScannerType = PyType_FromSpec(&PyScannerType_spec); + if (state->PyScannerType == NULL) { + return -1; + } + Py_INCREF(state->PyScannerType); + if (PyModule_AddObject(module, "make_scanner", state->PyScannerType) < 0) { + Py_DECREF(state->PyScannerType); + return -1; + } + + state->PyEncoderType = PyType_FromSpec(&PyEncoderType_spec); + if (state->PyEncoderType == NULL) { + return -1; + } + Py_INCREF(state->PyEncoderType); + if (PyModule_AddObject(module, "make_encoder", state->PyEncoderType) < 0) { + Py_DECREF(state->PyEncoderType); + return -1; + } + + return 0; +} + +static int +_jsonmodule_traverse(PyObject *module, visitproc visit, void *arg) +{ + _jsonmodulestate *state = get_json_state(module); + Py_VISIT(state->PyScannerType); + Py_VISIT(state->PyEncoderType); + return 0; +} + +static int +_jsonmodule_clear(PyObject *module) +{ + _jsonmodulestate *state = get_json_state(module); + Py_CLEAR(state->PyScannerType); + Py_CLEAR(state->PyEncoderType); + return 0; +} + +static void +_jsonmodule_free(void *module) +{ + _jsonmodule_clear((PyObject *)module); +} + +static PyModuleDef_Slot _json_slots[] = { + {Py_mod_exec, _json_exec}, + {0, NULL} +}; + static struct PyModuleDef jsonmodule = { PyModuleDef_HEAD_INIT, "_json", module_doc, - -1, + sizeof(_jsonmodulestate), speedups_methods, - NULL, - NULL, - NULL, - NULL + _json_slots, + _jsonmodule_traverse, + _jsonmodule_clear, + _jsonmodule_free, }; PyMODINIT_FUNC PyInit__json(void) { - PyObject *m = PyModule_Create(&jsonmodule); - if (!m) - return NULL; - if (PyType_Ready(&PyScannerType) < 0) - goto fail; - if (PyType_Ready(&PyEncoderType) < 0) - goto fail; - Py_INCREF((PyObject*)&PyScannerType); - if (PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType) < 0) { - Py_DECREF((PyObject*)&PyScannerType); - goto fail; - } - Py_INCREF((PyObject*)&PyEncoderType); - if (PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType) < 0) { - Py_DECREF((PyObject*)&PyEncoderType); - goto fail; - } - return m; - fail: - Py_DECREF(m); - return NULL; + return PyModuleDef_Init(&jsonmodule); } diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 036bdb30..0819d0e1 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -41,7 +41,17 @@ This software comes with no warranty. Use at your own risk. PyDoc_STRVAR(locale__doc__, "Support for POSIX locales."); -static PyObject *Error; +typedef struct _locale_state { + PyObject *Error; +} _locale_state; + +static inline _locale_state* +get_locale_state(PyObject *m) +{ + void *state = PyModule_GetState(m); + assert(state != NULL); + return (_locale_state *)state; +} /* support functions for formatting floating point numbers */ @@ -94,7 +104,8 @@ PyLocale_setlocale(PyObject* self, PyObject* args) #if defined(MS_WINDOWS) if (category < LC_MIN || category > LC_MAX) { - PyErr_SetString(Error, "invalid locale category"); + PyErr_SetString(get_locale_state(self)->Error, + "invalid locale category"); return NULL; } #endif @@ -104,7 +115,8 @@ PyLocale_setlocale(PyObject* self, PyObject* args) result = setlocale(category, locale); if (!result) { /* operation failed, no setting was changed */ - PyErr_SetString(Error, "unsupported locale setting"); + PyErr_SetString(get_locale_state(self)->Error, + "unsupported locale setting"); return NULL; } result_object = PyUnicode_DecodeLocale(result, NULL); @@ -114,7 +126,8 @@ PyLocale_setlocale(PyObject* self, PyObject* args) /* get locale */ result = setlocale(category, NULL); if (!result) { - PyErr_SetString(Error, "locale query failed"); + PyErr_SetString(get_locale_state(self)->Error, + "locale query failed"); return NULL; } result_object = PyUnicode_DecodeLocale(result, NULL); @@ -622,14 +635,16 @@ PyDoc_STRVAR(bindtextdomain__doc__, "Bind the C library's domain to dir."); static PyObject* -PyIntl_bindtextdomain(PyObject* self,PyObject*args) +PyIntl_bindtextdomain(PyObject* self, PyObject*args) { - char *domain, *dirname, *current_dirname; + const char *domain, *dirname, *current_dirname; PyObject *dirname_obj, *dirname_bytes = NULL, *result; + if (!PyArg_ParseTuple(args, "sO", &domain, &dirname_obj)) return 0; if (!strlen(domain)) { - PyErr_SetString(Error, "domain must be a non-empty string"); + PyErr_SetString(get_locale_state(self)->Error, + "domain must be a non-empty string"); return 0; } if (dirname_obj != Py_None) { @@ -710,63 +725,104 @@ static struct PyMethodDef PyLocale_Methods[] = { {NULL, NULL} }; - -static struct PyModuleDef _localemodule = { - PyModuleDef_HEAD_INIT, - "_locale", - locale__doc__, - -1, - PyLocale_Methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit__locale(void) +static int +_locale_exec(PyObject *module) { - PyObject *m; #ifdef HAVE_LANGINFO_H int i; #endif +#define ADD_INT(module, value) \ + do { \ + if (PyModule_AddIntConstant(module, #value, value) < 0) { \ + return -1; \ + } \ + } while (0) - m = PyModule_Create(&_localemodule); - if (m == NULL) - return NULL; - - PyModule_AddIntMacro(m, LC_CTYPE); - PyModule_AddIntMacro(m, LC_TIME); - PyModule_AddIntMacro(m, LC_COLLATE); - PyModule_AddIntMacro(m, LC_MONETARY); + ADD_INT(module, LC_CTYPE); + ADD_INT(module, LC_TIME); + ADD_INT(module, LC_COLLATE); + ADD_INT(module, LC_MONETARY); #ifdef LC_MESSAGES - PyModule_AddIntMacro(m, LC_MESSAGES); + ADD_INT(module, LC_MESSAGES); #endif /* LC_MESSAGES */ - PyModule_AddIntMacro(m, LC_NUMERIC); - PyModule_AddIntMacro(m, LC_ALL); - PyModule_AddIntMacro(m, CHAR_MAX); + ADD_INT(module, LC_NUMERIC); + ADD_INT(module, LC_ALL); + ADD_INT(module, CHAR_MAX); - Error = PyErr_NewException("locale.Error", NULL, NULL); - if (Error == NULL) { - Py_DECREF(m); - return NULL; + _locale_state *state = get_locale_state(module); + state->Error = PyErr_NewException("locale.Error", NULL, NULL); + if (state->Error == NULL) { + return -1; + } + Py_INCREF(get_locale_state(module)->Error); + if (PyModule_AddObject(module, "Error", get_locale_state(module)->Error) < 0) { + Py_DECREF(get_locale_state(module)->Error); + return -1; } - PyModule_AddObject(m, "Error", Error); #ifdef HAVE_LANGINFO_H for (i = 0; langinfo_constants[i].name; i++) { - PyModule_AddIntConstant(m, langinfo_constants[i].name, - langinfo_constants[i].value); + if (PyModule_AddIntConstant(module, + langinfo_constants[i].name, + langinfo_constants[i].value) < 0) { + return -1; + } } #endif if (PyErr_Occurred()) { - Py_DECREF(m); - return NULL; + return -1; } - return m; + return 0; + +#undef ADD_INT +} + +static struct PyModuleDef_Slot _locale_slots[] = { + {Py_mod_exec, _locale_exec}, + {0, NULL} +}; + +static int +locale_traverse(PyObject *module, visitproc visit, void *arg) +{ + _locale_state *state = get_locale_state(module); + Py_VISIT(state->Error); + return 0; +} + +static int +locale_clear(PyObject *module) +{ + _locale_state *state = get_locale_state(module); + Py_CLEAR(state->Error); + return 0; +} + +static void +locale_free(PyObject *module) +{ + locale_clear(module); +} + +static struct PyModuleDef _localemodule = { + PyModuleDef_HEAD_INIT, + "_locale", + locale__doc__, + sizeof(_locale_state), + PyLocale_Methods, + _locale_slots, + locale_traverse, + locale_clear, + (freefunc)locale_free, +}; + +PyMODINIT_FUNC +PyInit__locale(void) +{ + return PyModuleDef_Init(&_localemodule); } /* diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index c5a6f444..5e53d839 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -1,5 +1,4 @@ #include "Python.h" -#include "frameobject.h" #include "rotatingtree.h" /************************************************************/ @@ -54,7 +53,7 @@ typedef struct { static PyTypeObject PyProfiler_Type; #define PyProfiler_Check(op) PyObject_TypeCheck(op, &PyProfiler_Type) -#define PyProfiler_CheckExact(op) (Py_TYPE(op) == &PyProfiler_Type) +#define PyProfiler_CheckExact(op) Py_IS_TYPE(op, &PyProfiler_Type) /*** External Timers ***/ @@ -388,15 +387,22 @@ profiler_callback(PyObject *self, PyFrameObject *frame, int what, /* the 'frame' of a called function is about to start its execution */ case PyTrace_CALL: - ptrace_enter_call(self, (void *)frame->f_code, - (PyObject *)frame->f_code); + { + PyCodeObject *code = PyFrame_GetCode(frame); + ptrace_enter_call(self, (void *)code, (PyObject *)code); + Py_DECREF(code); break; + } /* the 'frame' of a called function is about to finish (either normally or with an exception) */ case PyTrace_RETURN: - ptrace_leave_call(self, (void *)frame->f_code); + { + PyCodeObject *code = PyFrame_GetCode(frame); + ptrace_leave_call(self, (void *)code); + Py_DECREF(code); break; + } /* case PyTrace_EXCEPTION: If the exception results in the function exiting, a @@ -578,8 +584,9 @@ static PyObject* profiler_getstats(ProfilerObject *pObj, PyObject* noarg) { statscollector_t collect; - if (pending_exception(pObj)) + if (pending_exception(pObj)) { return NULL; + } if (!pObj->externalTimer || pObj->externalTimerUnit == 0.0) { _PyTime_t onesec = _PyTime_FromSeconds(1); collect.factor = (double)1 / onesec; @@ -639,9 +646,15 @@ profiler_enable(ProfilerObject *self, PyObject *args, PyObject *kwds) if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii:enable", kwlist, &subcalls, &builtins)) return NULL; - if (setSubcalls(self, subcalls) < 0 || setBuiltins(self, builtins) < 0) + if (setSubcalls(self, subcalls) < 0 || setBuiltins(self, builtins) < 0) { + return NULL; + } + + PyThreadState *tstate = PyThreadState_GET(); + if (_PyEval_SetProfile(tstate, profiler_callback, (PyObject*)self) < 0) { return NULL; - PyEval_SetProfile(profiler_callback, (PyObject*)self); + } + self->flags |= POF_ENABLED; Py_RETURN_NONE; } @@ -671,11 +684,16 @@ Stop collecting profiling information.\n\ static PyObject* profiler_disable(ProfilerObject *self, PyObject* noarg) { + PyThreadState *tstate = PyThreadState_GET(); + if (_PyEval_SetProfile(tstate, NULL, NULL) < 0) { + return NULL; + } self->flags &= ~POF_ENABLED; - PyEval_SetProfile(NULL, NULL); + flush_unmatched(self); - if (pending_exception(self)) + if (pending_exception(self)) { return NULL; + } Py_RETURN_NONE; } @@ -695,8 +713,13 @@ profiler_clear(ProfilerObject *pObj, PyObject* noarg) static void profiler_dealloc(ProfilerObject *op) { - if (op->flags & POF_ENABLED) - PyEval_SetProfile(NULL, NULL); + if (op->flags & POF_ENABLED) { + PyThreadState *tstate = PyThreadState_GET(); + if (_PyEval_SetProfile(tstate, NULL, NULL) < 0) { + PyErr_WriteUnraisable((PyObject *)op); + } + } + flush_unmatched(op); clearEntries(op); Py_XDECREF(op->externalTimer); diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c index 1ab67f30..2a62a683 100644 --- a/Modules/_lzmamodule.c +++ b/Modules/_lzmamodule.c @@ -8,8 +8,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" -#include "pythread.h" +#include "structmember.h" // PyMemberDef #include #include @@ -212,10 +211,9 @@ parse_filter_spec_lzma(PyObject *spec) return NULL; } - options = (lzma_options_lzma *)PyMem_Malloc(sizeof *options); + options = (lzma_options_lzma *)PyMem_Calloc(1, sizeof *options); if (options == NULL) return PyErr_NoMemory(); - memset(options, 0, sizeof *options); if (lzma_lzma_preset(options, preset)) { PyMem_Free(options); @@ -257,10 +255,9 @@ parse_filter_spec_delta(PyObject *spec) return NULL; } - options = (lzma_options_delta *)PyMem_Malloc(sizeof *options); + options = (lzma_options_delta *)PyMem_Calloc(1, sizeof *options); if (options == NULL) return PyErr_NoMemory(); - memset(options, 0, sizeof *options); options->type = LZMA_DELTA_TYPE_BYTE; options->dist = dist; return options; @@ -281,10 +278,9 @@ parse_filter_spec_bcj(PyObject *spec) return NULL; } - options = (lzma_options_bcj *)PyMem_Malloc(sizeof *options); + options = (lzma_options_bcj *)PyMem_Calloc(1, sizeof *options); if (options == NULL) return PyErr_NoMemory(); - memset(options, 0, sizeof *options); options->start_offset = start_offset; return options; } @@ -1486,19 +1482,13 @@ PyInit__lzma(void) if (PyModule_AddObject(m, "LZMAError", Error) == -1) return NULL; - if (PyType_Ready(&Compressor_type) == -1) - return NULL; - Py_INCREF(&Compressor_type); - if (PyModule_AddObject(m, "LZMACompressor", - (PyObject *)&Compressor_type) == -1) + if (PyModule_AddType(m, &Compressor_type) < 0) { return NULL; + } - if (PyType_Ready(&Decompressor_type) == -1) - return NULL; - Py_INCREF(&Decompressor_type); - if (PyModule_AddObject(m, "LZMADecompressor", - (PyObject *)&Decompressor_type) == -1) + if (PyModule_AddType(m, &Decompressor_type) < 0) { return NULL; + } return m; } diff --git a/Modules/_multiprocessing/multiprocessing.h b/Modules/_multiprocessing/multiprocessing.h index 512bc17f..fe78135d 100644 --- a/Modules/_multiprocessing/multiprocessing.h +++ b/Modules/_multiprocessing/multiprocessing.h @@ -27,14 +27,6 @@ # include typedef sem_t *SEM_HANDLE; # endif -# define HANDLE int -# define SOCKET int -# define BOOL int -# define UINT32 uint32_t -# define INT32 int32_t -# define TRUE 1 -# define FALSE 0 -# define INVALID_HANDLE_VALUE (-1) #endif /* @@ -72,8 +64,6 @@ # define T_HANDLE T_POINTER # define F_SEM_HANDLE F_HANDLE # define T_SEM_HANDLE T_HANDLE -# define F_DWORD "k" -# define T_DWORD T_ULONG #else # define F_HANDLE "i" # define T_HANDLE T_INT diff --git a/Modules/_multiprocessing/posixshmem.c b/Modules/_multiprocessing/posixshmem.c index 2049dbbc..436ac6d6 100644 --- a/Modules/_multiprocessing/posixshmem.c +++ b/Modules/_multiprocessing/posixshmem.c @@ -5,7 +5,6 @@ posixshmem - A Python extension that provides shm_open() and shm_unlink() #define PY_SSIZE_T_CLEAN #include -#include "structmember.h" // for shm_open() and shm_unlink() #ifdef HAVE_SYS_MMAN_H diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c index 4be2deae..ee490256 100644 --- a/Modules/_multiprocessing/semaphore.c +++ b/Modules/_multiprocessing/semaphore.c @@ -268,11 +268,8 @@ static PyObject * semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) { int blocking = 1, res, err = 0; - double timeout; PyObject *timeout_obj = Py_None; struct timespec deadline = {0}; - struct timeval now; - long sec, nsec; static char *kwlist[] = {"block", "timeout", NULL}; @@ -285,19 +282,23 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) Py_RETURN_TRUE; } - if (timeout_obj != Py_None) { - timeout = PyFloat_AsDouble(timeout_obj); - if (PyErr_Occurred()) + int use_deadline = (timeout_obj != Py_None); + if (use_deadline) { + double timeout = PyFloat_AsDouble(timeout_obj); + if (PyErr_Occurred()) { return NULL; - if (timeout < 0.0) + } + if (timeout < 0.0) { timeout = 0.0; + } + struct timeval now; if (gettimeofday(&now, NULL) < 0) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } - sec = (long) timeout; - nsec = (long) (1e9 * (timeout - sec) + 0.5); + long sec = (long) timeout; + long nsec = (long) (1e9 * (timeout - sec) + 0.5); deadline.tv_sec = now.tv_sec + sec; deadline.tv_nsec = now.tv_usec * 1000 + nsec; deadline.tv_sec += (deadline.tv_nsec / 1000000000); @@ -315,7 +316,7 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) /* Couldn't acquire immediately, need to block */ do { Py_BEGIN_ALLOW_THREADS - if (timeout_obj == Py_None) { + if (!use_deadline) { res = sem_wait(self->handle); } else { diff --git a/Modules/_operator.c b/Modules/_operator.c index 5aa229fa..8a54829e 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -785,6 +785,8 @@ _operator_length_hint_impl(PyObject *module, PyObject *obj, return PyObject_LengthHint(obj, default_value); } +/* NOTE: Keep in sync with _hashopenssl.c implementation. */ + /*[clinic input] _operator._compare_digest = _operator.eq @@ -1170,7 +1172,7 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) for (idx = 0; idx < nattrs; ++idx) { PyObject *item = PyTuple_GET_ITEM(args, idx); Py_ssize_t item_len; - void *data; + const void *data; unsigned int kind; int dot_count; @@ -1682,7 +1684,7 @@ methodcaller_reduce(methodcallerobject *mc, PyObject *Py_UNUSED(ignored)) newargs[0] = (PyObject *)Py_TYPE(mc); newargs[1] = mc->name; - constructor = _PyObject_FastCallDict(partial, newargs, 2, mc->kwds); + constructor = PyObject_VectorcallDict(partial, newargs, 2, mc->kwds); Py_DECREF(partial); return Py_BuildValue("NO", constructor, mc->args); @@ -1746,16 +1748,38 @@ static PyTypeObject methodcaller_type = { }; -/* Initialization function for the module (*must* be called PyInit__operator) */ +static int +operator_exec(PyObject *module) +{ + PyTypeObject *types[] = { + &itemgetter_type, + &attrgetter_type, + &methodcaller_type + }; + + for (size_t i = 0; i < Py_ARRAY_LENGTH(types); i++) { + if (PyModule_AddType(module, types[i]) < 0) { + return -1; + } + } + + return 0; +} + + +static struct PyModuleDef_Slot operator_slots[] = { + {Py_mod_exec, operator_exec}, + {0, NULL} +}; static struct PyModuleDef operatormodule = { PyModuleDef_HEAD_INIT, "_operator", operator_doc, - -1, + 0, operator_methods, - NULL, + operator_slots, NULL, NULL, NULL @@ -1764,26 +1788,5 @@ static struct PyModuleDef operatormodule = { PyMODINIT_FUNC PyInit__operator(void) { - PyObject *m; - - /* Create the module and add the functions */ - m = PyModule_Create(&operatormodule); - if (m == NULL) - return NULL; - - if (PyType_Ready(&itemgetter_type) < 0) - return NULL; - Py_INCREF(&itemgetter_type); - PyModule_AddObject(m, "itemgetter", (PyObject *)&itemgetter_type); - - if (PyType_Ready(&attrgetter_type) < 0) - return NULL; - Py_INCREF(&attrgetter_type); - PyModule_AddObject(m, "attrgetter", (PyObject *)&attrgetter_type); - - if (PyType_Ready(&methodcaller_type) < 0) - return NULL; - Py_INCREF(&methodcaller_type); - PyModule_AddObject(m, "methodcaller", (PyObject *)&methodcaller_type); - return m; + return PyModuleDef_Init(&operatormodule); } diff --git a/Modules/_peg_parser.c b/Modules/_peg_parser.c new file mode 100644 index 00000000..ca2a3cf7 --- /dev/null +++ b/Modules/_peg_parser.c @@ -0,0 +1,153 @@ +#include +#include "pegen_interface.h" + +static int +_mode_str_to_int(char *mode_str) +{ + int mode; + if (strcmp(mode_str, "exec") == 0) { + mode = Py_file_input; + } + else if (strcmp(mode_str, "eval") == 0) { + mode = Py_eval_input; + } + else if (strcmp(mode_str, "single") == 0) { + mode = Py_single_input; + } + else { + mode = -1; + } + return mode; +} + +static mod_ty +_run_parser(char *str, char *filename, int mode, PyCompilerFlags *flags, PyArena *arena, int oldparser) +{ + mod_ty mod; + if (!oldparser) { + mod = PyPegen_ASTFromString(str, filename, mode, flags, arena); + } + else { + mod = PyParser_ASTFromString(str, filename, mode, flags, arena); + } + return mod; +} + +PyObject * +_Py_compile_string(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *keywords[] = {"string", "filename", "mode", "oldparser", NULL}; + char *the_string; + char *filename = ""; + char *mode_str = "exec"; + int oldparser = 0; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|ssp", keywords, + &the_string, &filename, &mode_str, &oldparser)) { + return NULL; + } + + int mode = _mode_str_to_int(mode_str); + if (mode == -1) { + return PyErr_Format(PyExc_ValueError, "mode must be either 'exec' or 'eval' or 'single'"); + } + + PyCompilerFlags flags = _PyCompilerFlags_INIT; + flags.cf_flags = PyCF_IGNORE_COOKIE; + + PyArena *arena = PyArena_New(); + if (arena == NULL) { + return NULL; + } + + mod_ty mod = _run_parser(the_string, filename, mode, &flags, arena, oldparser); + if (mod == NULL) { + PyArena_Free(arena); + return NULL; + } + + PyObject *filename_ob = PyUnicode_DecodeFSDefault(filename); + if (filename_ob == NULL) { + PyArena_Free(arena); + return NULL; + } + PyCodeObject *result = PyAST_CompileObject(mod, filename_ob, &flags, -1, arena); + Py_XDECREF(filename_ob); + PyArena_Free(arena); + return (PyObject *)result; +} + +PyObject * +_Py_parse_string(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *keywords[] = {"string", "filename", "mode", "oldparser", "ast", NULL}; + char *the_string; + char *filename = ""; + char *mode_str = "exec"; + int oldparser = 0; + int ast = 1; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|sspp", keywords, + &the_string, &filename, &mode_str, &oldparser, &ast)) { + return NULL; + } + + int mode = _mode_str_to_int(mode_str); + if (mode == -1) { + return PyErr_Format(PyExc_ValueError, "mode must be either 'exec' or 'eval' or 'single'"); + } + + PyCompilerFlags flags = _PyCompilerFlags_INIT; + flags.cf_flags = PyCF_IGNORE_COOKIE; + + PyArena *arena = PyArena_New(); + if (arena == NULL) { + return NULL; + } + + mod_ty mod = _run_parser(the_string, filename, mode, &flags, arena, oldparser); + if (mod == NULL) { + PyArena_Free(arena); + return NULL; + } + + PyObject *result; + if (ast) { + result = PyAST_mod2obj(mod); + } + else { + Py_INCREF(Py_None); + result = Py_None; + } + PyArena_Free(arena); + return result; +} + +static PyMethodDef ParseMethods[] = { + { + "parse_string", + (PyCFunction)(void (*)(void))_Py_parse_string, + METH_VARARGS|METH_KEYWORDS, + "Parse a string, return an AST." + }, + { + "compile_string", + (PyCFunction)(void (*)(void))_Py_compile_string, + METH_VARARGS|METH_KEYWORDS, + "Compile a string, return a code object." + }, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +static struct PyModuleDef parsemodule = { + PyModuleDef_HEAD_INIT, + .m_name = "peg_parser", + .m_doc = "A parser.", + .m_methods = ParseMethods, +}; + +PyMODINIT_FUNC +PyInit__peg_parser(void) +{ + return PyModule_Create(&parsemodule); +} diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 42ce62fc..8dea2c6e 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -9,7 +9,7 @@ #endif #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef PyDoc_STRVAR(pickle_module_doc, "Optimized C implementation for the Python pickle module."); @@ -359,7 +359,7 @@ _Pickle_FastCall(PyObject *func, PyObject *obj) { PyObject *result; - result = PyObject_CallFunctionObjArgs(func, obj, NULL); + result = PyObject_CallOneArg(func, obj); Py_DECREF(obj); return result; } @@ -420,7 +420,7 @@ call_method(PyObject *func, PyObject *self, PyObject *obj) return PyObject_CallFunctionObjArgs(func, self, obj, NULL); } else { - return PyObject_CallFunctionObjArgs(func, obj, NULL); + return PyObject_CallOneArg(func, obj); } } @@ -461,7 +461,7 @@ Pdata_New(void) if (!(self = PyObject_New(Pdata, &Pdata_Type))) return NULL; - Py_SIZE(self) = 0; + Py_SET_SIZE(self, 0); self->mark_set = 0; self->fence = 0; self->allocated = 8; @@ -488,7 +488,7 @@ Pdata_clear(Pdata *self, Py_ssize_t clearto) while (--i >= clearto) { Py_CLEAR(self->data[i]); } - Py_SIZE(self) = clearto; + Py_SET_SIZE(self, clearto); return 0; } @@ -539,7 +539,8 @@ Pdata_pop(Pdata *self) Pdata_stack_underflow(self); return NULL; } - return self->data[--Py_SIZE(self)]; + Py_SET_SIZE(self, Py_SIZE(self) - 1); + return self->data[Py_SIZE(self)]; } #define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0) @@ -549,7 +550,8 @@ Pdata_push(Pdata *self, PyObject *obj) if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) { return -1; } - self->data[Py_SIZE(self)++] = obj; + self->data[Py_SIZE(self)] = obj; + Py_SET_SIZE(self, Py_SIZE(self) + 1); return 0; } @@ -579,7 +581,7 @@ Pdata_poptuple(Pdata *self, Py_ssize_t start) for (i = start, j = 0; j < len; i++, j++) PyTuple_SET_ITEM(tuple, j, self->data[i]); - Py_SIZE(self) = start; + Py_SET_SIZE(self, start); return tuple; } @@ -596,7 +598,7 @@ Pdata_poplist(Pdata *self, Py_ssize_t start) for (i = start, j = 0; j < len; i++, j++) PyList_SET_ITEM(list, j, self->data[i]); - Py_SIZE(self) = start; + Py_SET_SIZE(self, start); return list; } @@ -1274,7 +1276,7 @@ _Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n) return -1; if (n == READ_WHOLE_LINE) { - data = _PyObject_CallNoArg(self->readline); + data = PyObject_CallNoArgs(self->readline); } else { PyObject *len; @@ -2007,7 +2009,7 @@ fast_save_enter(PicklerObject *self, PyObject *obj) PyErr_Format(PyExc_ValueError, "fast mode: can't pickle cyclic objects " "including object type %.200s at %p", - obj->ob_type->tp_name, obj); + Py_TYPE(obj)->tp_name, obj); self->fast_nesting = -1; return 0; } @@ -2327,7 +2329,7 @@ _Pickler_write_bytes(PicklerObject *self, return -1; } } - result = PyObject_CallFunctionObjArgs(self->write, payload, NULL); + result = PyObject_CallOneArg(self->write, payload); Py_XDECREF(mem); if (result == NULL) { return -1; @@ -2535,8 +2537,7 @@ save_picklebuffer(PicklerObject *self, PyObject *obj) } int in_band = 1; if (self->buffer_callback != NULL) { - PyObject *ret = PyObject_CallFunctionObjArgs(self->buffer_callback, - obj, NULL); + PyObject *ret = PyObject_CallOneArg(self->buffer_callback, obj); if (ret == NULL) { return -1; } @@ -2580,7 +2581,7 @@ raw_unicode_escape(PyObject *obj) { char *p; Py_ssize_t i, size; - void *data; + const void *data; unsigned int kind; _PyBytesWriter writer; @@ -3337,7 +3338,7 @@ save_dict(PicklerObject *self, PyObject *obj) } else { _Py_IDENTIFIER(items); - items = _PyObject_CallMethodId(obj, &PyId_items, NULL); + items = _PyObject_CallMethodIdNoArgs(obj, &PyId_items); if (items == NULL) goto error; iter = PyObject_GetIter(items); @@ -4353,8 +4354,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) * regular reduction mechanism. */ if (self->reducer_override != NULL) { - reduce_value = PyObject_CallFunctionObjArgs(self->reducer_override, - obj, NULL); + reduce_value = PyObject_CallOneArg(self->reducer_override, obj); if (reduce_value == NULL) { goto error; } @@ -4441,7 +4441,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) goto error; } if (reduce_func != NULL) { - reduce_value = _PyObject_CallNoArg(reduce_func); + reduce_value = PyObject_CallNoArgs(reduce_func); } else { PickleState *st = _Pickle_GetGlobalState(); @@ -4974,7 +4974,7 @@ Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored)) return -1; } - if (Py_TYPE(obj) == &PicklerMemoProxyType) { + if (Py_IS_TYPE(obj, &PicklerMemoProxyType)) { PicklerObject *pickler = ((PicklerMemoProxyObject *)obj)->pickler; @@ -5821,7 +5821,7 @@ instantiate(PyObject *cls, PyObject *args) return NULL; } if (func == NULL) { - return _PyObject_CallMethodIdObjArgs(cls, &PyId___new__, cls, NULL); + return _PyObject_CallMethodIdOneArg(cls, &PyId___new__, cls); } Py_DECREF(func); } @@ -6180,7 +6180,7 @@ load_pop(UnpicklerObject *self) else { len--; Py_DECREF(self->stack->data[len]); - Py_SIZE(self->stack) = len; + Py_SET_SIZE(self->stack, len); } return 0; } @@ -6235,8 +6235,10 @@ load_get(UnpicklerObject *self) value = _Unpickler_MemoGet(self, idx); if (value == NULL) { - if (!PyErr_Occurred()) - PyErr_SetObject(PyExc_KeyError, key); + if (!PyErr_Occurred()) { + PickleState *st = _Pickle_GetGlobalState(); + PyErr_Format(st->UnpicklingError, "Memo value not found at index %ld", idx); + } Py_DECREF(key); return -1; } @@ -6262,7 +6264,8 @@ load_binget(UnpicklerObject *self) if (value == NULL) { PyObject *key = PyLong_FromSsize_t(idx); if (key != NULL) { - PyErr_SetObject(PyExc_KeyError, key); + PickleState *st = _Pickle_GetGlobalState(); + PyErr_Format(st->UnpicklingError, "Memo value not found at index %ld", idx); Py_DECREF(key); } return -1; @@ -6288,7 +6291,8 @@ load_long_binget(UnpicklerObject *self) if (value == NULL) { PyObject *key = PyLong_FromSsize_t(idx); if (key != NULL) { - PyErr_SetObject(PyExc_KeyError, key); + PickleState *st = _Pickle_GetGlobalState(); + PyErr_Format(st->UnpicklingError, "Memo value not found at index %ld", idx); Py_DECREF(key); } return -1; @@ -6537,13 +6541,13 @@ do_append(UnpicklerObject *self, Py_ssize_t x) result = _Pickle_FastCall(append_func, value); if (result == NULL) { Pdata_clear(self->stack, i + 1); - Py_SIZE(self->stack) = x; + Py_SET_SIZE(self->stack, x); Py_DECREF(append_func); return -1; } Py_DECREF(result); } - Py_SIZE(self->stack) = x; + Py_SET_SIZE(self->stack, x); Py_DECREF(append_func); } } @@ -6665,12 +6669,12 @@ load_additems(UnpicklerObject *self) result = _Pickle_FastCall(add_func, item); if (result == NULL) { Pdata_clear(self->stack, i + 1); - Py_SIZE(self->stack) = mark; + Py_SET_SIZE(self->stack, mark); return -1; } Py_DECREF(result); } - Py_SIZE(self->stack) = mark; + Py_SET_SIZE(self->stack, mark); } return 0; @@ -7528,7 +7532,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored return -1; } - if (Py_TYPE(obj) == &UnpicklerMemoProxyType) { + if (Py_IS_TYPE(obj, &UnpicklerMemoProxyType)) { UnpicklerObject *unpickler = ((UnpicklerMemoProxyObject *)obj)->unpickler; @@ -7882,6 +7886,7 @@ _pickle_load_impl(PyObject *module, PyObject *file, int fix_imports, _pickle.loads data: object + / * fix_imports: bool = True encoding: str = 'ASCII' @@ -7908,7 +7913,7 @@ static PyObject * _pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports, const char *encoding, const char *errors, PyObject *buffers) -/*[clinic end generated code: output=82ac1e6b588e6d02 input=9c2ab6a0960185ea]*/ +/*[clinic end generated code: output=82ac1e6b588e6d02 input=b3615540d0535087]*/ { PyObject *result; UnpicklerObject *unpickler = _Unpickler_New(); @@ -8002,10 +8007,6 @@ PyInit__pickle(void) return m; } - if (PyType_Ready(&Unpickler_Type) < 0) - return NULL; - if (PyType_Ready(&Pickler_Type) < 0) - return NULL; if (PyType_Ready(&Pdata_Type) < 0) return NULL; if (PyType_Ready(&PicklerMemoProxyType) < 0) @@ -8019,16 +8020,15 @@ PyInit__pickle(void) return NULL; /* Add types */ - Py_INCREF(&Pickler_Type); - if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0) + if (PyModule_AddType(m, &Pickler_Type) < 0) { return NULL; - Py_INCREF(&Unpickler_Type); - if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0) + } + if (PyModule_AddType(m, &Unpickler_Type) < 0) { return NULL; - Py_INCREF(&PyPickleBuffer_Type); - if (PyModule_AddObject(m, "PickleBuffer", - (PyObject *)&PyPickleBuffer_Type) < 0) + } + if (PyModule_AddType(m, &PyPickleBuffer_Type) < 0) { return NULL; + } st = _Pickle_GetState(m); diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index e693e532..5d1691ac 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -8,7 +8,7 @@ #ifdef HAVE_SYS_TYPES_H #include #endif -#if defined(HAVE_SYS_STAT_H) && defined(__FreeBSD__) +#if defined(HAVE_SYS_STAT_H) #include #endif #ifdef HAVE_SYS_SYSCALL_H @@ -20,6 +20,11 @@ #ifdef HAVE_DIRENT_H #include #endif +#ifdef HAVE_GRP_H +#include +#endif /* HAVE_GRP_H */ + +#include "posixmodule.h" #ifdef _Py_MEMORY_SANITIZER # include @@ -47,20 +52,43 @@ # define FD_DIR "/proc/self/fd" #endif +#ifdef NGROUPS_MAX +#define MAX_GROUPS NGROUPS_MAX +#else +#define MAX_GROUPS 64 +#endif + #define POSIX_CALL(call) do { if ((call) == -1) goto error; } while (0) +typedef struct { + PyObject* disable; + PyObject* enable; + PyObject* isenabled; +} _posixsubprocessstate; + +static struct PyModuleDef _posixsubprocessmodule; + +static inline _posixsubprocessstate* +get_posixsubprocess_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_posixsubprocessstate *)state; +} + +#define _posixsubprocessstate_global get_posixsubprocess_state(PyState_FindModule(&_posixsubprocessmodule)) /* If gc was disabled, call gc.enable(). Return 0 on success. */ static int _enable_gc(int need_to_reenable_gc, PyObject *gc_module) { PyObject *result; - _Py_IDENTIFIER(enable); PyObject *exctype, *val, *tb; if (need_to_reenable_gc) { PyErr_Fetch(&exctype, &val, &tb); - result = _PyObject_CallMethodId(gc_module, &PyId_enable, NULL); + result = PyObject_CallMethodNoArgs( + gc_module, _posixsubprocessstate_global->enable); if (exctype != NULL) { PyErr_Restore(exctype, val, tb); } @@ -236,9 +264,15 @@ _close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep) start_fd = keep_fd + 1; } if (start_fd <= end_fd) { +#if defined(__FreeBSD__) + /* Any errors encountered while closing file descriptors are ignored */ + closefrom(start_fd); +#else for (fd_num = start_fd; fd_num < end_fd; ++fd_num) { - close(fd_num); + /* Ignore errors */ + (void)close(fd_num); } +#endif } } @@ -405,6 +439,9 @@ child_exec(char *const exec_array[], int errpipe_read, int errpipe_write, int close_fds, int restore_signals, int call_setsid, + int call_setgid, gid_t gid, + int call_setgroups, size_t groups_size, const gid_t *groups, + int call_setuid, uid_t uid, int child_umask, PyObject *py_fds_to_keep, PyObject *preexec_fn, PyObject *preexec_fn_args_tuple) @@ -474,6 +511,9 @@ child_exec(char *const exec_array[], if (cwd) POSIX_CALL(chdir(cwd)); + if (child_umask >= 0) + umask(child_umask); /* umask() always succeeds. */ + if (restore_signals) _Py_RestoreSignals(); @@ -482,6 +522,22 @@ child_exec(char *const exec_array[], POSIX_CALL(setsid()); #endif +#ifdef HAVE_SETGROUPS + if (call_setgroups) + POSIX_CALL(setgroups(groups_size, groups)); +#endif /* HAVE_SETGROUPS */ + +#ifdef HAVE_SETREGID + if (call_setgid) + POSIX_CALL(setregid(gid, gid)); +#endif /* HAVE_SETREGID */ + +#ifdef HAVE_SETREUID + if (call_setuid) + POSIX_CALL(setreuid(uid, uid)); +#endif /* HAVE_SETREUID */ + + reached_preexec = 1; if (preexec_fn != Py_None && preexec_fn_args_tuple) { /* This is where the user has asked us to deadlock their program. */ @@ -561,30 +617,38 @@ subprocess_fork_exec(PyObject* self, PyObject *args) PyObject *env_list, *preexec_fn; PyObject *process_args, *converted_args = NULL, *fast_args = NULL; PyObject *preexec_fn_args_tuple = NULL; + PyObject *groups_list; + PyObject *uid_object, *gid_object; int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite; int errpipe_read, errpipe_write, close_fds, restore_signals; int call_setsid; + int call_setgid = 0, call_setgroups = 0, call_setuid = 0; + uid_t uid; + gid_t gid, *groups = NULL; + int child_umask; PyObject *cwd_obj, *cwd_obj2; const char *cwd; pid_t pid; int need_to_reenable_gc = 0; char *const *exec_array, *const *argv = NULL, *const *envp = NULL; - Py_ssize_t arg_num; + Py_ssize_t arg_num, num_groups = 0; int need_after_fork = 0; int saved_errno = 0; if (!PyArg_ParseTuple( - args, "OOpO!OOiiiiiiiiiiO:fork_exec", + args, "OOpO!OOiiiiiiiiiiOOOiO:fork_exec", &process_args, &executable_list, &close_fds, &PyTuple_Type, &py_fds_to_keep, &cwd_obj, &env_list, &p2cread, &p2cwrite, &c2pread, &c2pwrite, &errread, &errwrite, &errpipe_read, &errpipe_write, - &restore_signals, &call_setsid, &preexec_fn)) + &restore_signals, &call_setsid, + &gid_object, &groups_list, &uid_object, &child_umask, + &preexec_fn)) return NULL; if ((preexec_fn != Py_None) && - (_PyInterpreterState_Get() != PyInterpreterState_Main())) { + (PyInterpreterState_Get() != PyInterpreterState_Main())) { PyErr_SetString(PyExc_RuntimeError, "preexec_fn not supported within subinterpreters"); return NULL; @@ -599,16 +663,23 @@ subprocess_fork_exec(PyObject* self, PyObject *args) return NULL; } + PyInterpreterState *interp = PyInterpreterState_Get(); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); + if (config->_isolated_interpreter) { + PyErr_SetString(PyExc_RuntimeError, + "subprocess not supported for isolated subinterpreters"); + return NULL; + } + /* We need to call gc.disable() when we'll be calling preexec_fn */ if (preexec_fn != Py_None) { PyObject *result; - _Py_IDENTIFIER(isenabled); - _Py_IDENTIFIER(disable); gc_module = PyImport_ImportModule("gc"); if (gc_module == NULL) return NULL; - result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, NULL); + result = PyObject_CallMethodNoArgs( + gc_module, _posixsubprocessstate_global->isenabled); if (result == NULL) { Py_DECREF(gc_module); return NULL; @@ -619,7 +690,8 @@ subprocess_fork_exec(PyObject* self, PyObject *args) Py_DECREF(gc_module); return NULL; } - result = _PyObject_CallMethodId(gc_module, &PyId_disable, NULL); + result = PyObject_CallMethodNoArgs( + gc_module, _posixsubprocessstate_global->disable); if (result == NULL) { Py_DECREF(gc_module); return NULL; @@ -679,6 +751,90 @@ subprocess_fork_exec(PyObject* self, PyObject *args) cwd_obj2 = NULL; } + if (groups_list != Py_None) { +#ifdef HAVE_SETGROUPS + Py_ssize_t i; + unsigned long gid; + + if (!PyList_Check(groups_list)) { + PyErr_SetString(PyExc_TypeError, + "setgroups argument must be a list"); + goto cleanup; + } + num_groups = PySequence_Size(groups_list); + + if (num_groups < 0) + goto cleanup; + + if (num_groups > MAX_GROUPS) { + PyErr_SetString(PyExc_ValueError, "too many groups"); + goto cleanup; + } + + if ((groups = PyMem_RawMalloc(num_groups * sizeof(gid_t))) == NULL) { + PyErr_SetString(PyExc_MemoryError, + "failed to allocate memory for group list"); + goto cleanup; + } + + for (i = 0; i < num_groups; i++) { + PyObject *elem; + elem = PySequence_GetItem(groups_list, i); + if (!elem) + goto cleanup; + if (!PyLong_Check(elem)) { + PyErr_SetString(PyExc_TypeError, + "groups must be integers"); + Py_DECREF(elem); + goto cleanup; + } else { + /* In posixmodule.c UnsignedLong is used as a fallback value + * if the value provided does not fit in a Long. Since we are + * already doing the bounds checking on the Python side, we + * can go directly to an UnsignedLong here. */ + if (!_Py_Gid_Converter(elem, &gid)) { + Py_DECREF(elem); + PyErr_SetString(PyExc_ValueError, "invalid group id"); + goto cleanup; + } + groups[i] = gid; + } + Py_DECREF(elem); + } + call_setgroups = 1; + +#else /* HAVE_SETGROUPS */ + PyErr_BadInternalCall(); + goto cleanup; +#endif /* HAVE_SETGROUPS */ + } + + if (gid_object != Py_None) { +#ifdef HAVE_SETREGID + if (!_Py_Gid_Converter(gid_object, &gid)) + goto cleanup; + + call_setgid = 1; + +#else /* HAVE_SETREGID */ + PyErr_BadInternalCall(); + goto cleanup; +#endif /* HAVE_SETREUID */ + } + + if (uid_object != Py_None) { +#ifdef HAVE_SETREUID + if (!_Py_Uid_Converter(uid_object, &uid)) + goto cleanup; + + call_setuid = 1; + +#else /* HAVE_SETREUID */ + PyErr_BadInternalCall(); + goto cleanup; +#endif /* HAVE_SETREUID */ + } + /* This must be the last thing done before fork() because we do not * want to call PyOS_BeforeFork() if there is any chance of another * error leading to the cleanup: code without calling fork(). */ @@ -711,6 +867,8 @@ subprocess_fork_exec(PyObject* self, PyObject *args) p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, close_fds, restore_signals, call_setsid, + call_setgid, gid, call_setgroups, num_groups, groups, + call_setuid, uid, child_umask, py_fds_to_keep, preexec_fn, preexec_fn_args_tuple); _exit(255); return NULL; /* Dead code to avoid a potential compiler warning. */ @@ -735,6 +893,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) if (_enable_gc(need_to_reenable_gc, gc_module)) { pid = -1; } + PyMem_RawFree(groups); Py_XDECREF(preexec_fn_args_tuple); Py_XDECREF(gc_module); @@ -755,6 +914,8 @@ cleanup: _Py_FreeCharPArray(argv); if (exec_array) _Py_FreeCharPArray(exec_array); + + PyMem_RawFree(groups); Py_XDECREF(converted_args); Py_XDECREF(fast_args); Py_XDECREF(preexec_fn_args_tuple); @@ -765,16 +926,22 @@ cleanup: PyDoc_STRVAR(subprocess_fork_exec_doc, -"fork_exec(args, executable_list, close_fds, cwd, env,\n\ +"fork_exec(args, executable_list, close_fds, pass_fds, cwd, env,\n\ p2cread, p2cwrite, c2pread, c2pwrite,\n\ errread, errwrite, errpipe_read, errpipe_write,\n\ - restore_signals, call_setsid, preexec_fn)\n\ + restore_signals, call_setsid,\n\ + gid, groups_list, uid,\n\ + preexec_fn)\n\ \n\ Forks a child process, closes parent file descriptors as appropriate in the\n\ child and dups the few that are needed before calling exec() in the child\n\ process.\n\ \n\ -The preexec_fn, if supplied, will be called immediately before exec.\n\ +If close_fds is true, close file descriptors 3 and higher, except those listed\n\ +in the sorted tuple pass_fds.\n\ +\n\ +The preexec_fn, if supplied, will be called immediately before closing file\n\ +descriptors and exec.\n\ WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\ It may trigger infrequent, difficult to debug deadlocks.\n\ \n\ @@ -798,16 +965,56 @@ static PyMethodDef module_methods[] = { }; +static int _posixsubprocess_traverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(get_posixsubprocess_state(m)->disable); + Py_VISIT(get_posixsubprocess_state(m)->enable); + Py_VISIT(get_posixsubprocess_state(m)->isenabled); + return 0; +} + +static int _posixsubprocess_clear(PyObject *m) { + Py_CLEAR(get_posixsubprocess_state(m)->disable); + Py_CLEAR(get_posixsubprocess_state(m)->enable); + Py_CLEAR(get_posixsubprocess_state(m)->isenabled); + return 0; +} + +static void _posixsubprocess_free(void *m) { + _posixsubprocess_clear((PyObject *)m); +} + static struct PyModuleDef _posixsubprocessmodule = { PyModuleDef_HEAD_INIT, "_posixsubprocess", module_doc, - -1, /* No memory is needed. */ + sizeof(_posixsubprocessstate), module_methods, + NULL, + _posixsubprocess_traverse, + _posixsubprocess_clear, + _posixsubprocess_free, }; PyMODINIT_FUNC PyInit__posixsubprocess(void) { - return PyModule_Create(&_posixsubprocessmodule); + PyObject* m; + + m = PyState_FindModule(&_posixsubprocessmodule); + if (m != NULL) { + Py_INCREF(m); + return m; + } + + m = PyModule_Create(&_posixsubprocessmodule); + if (m == NULL) { + return NULL; + } + + get_posixsubprocess_state(m)->disable = PyUnicode_InternFromString("disable"); + get_posixsubprocess_state(m)->enable = PyUnicode_InternFromString("enable"); + get_posixsubprocess_state(m)->isenabled = PyUnicode_InternFromString("isenabled"); + + PyState_AddModule(m, &_posixsubprocessmodule); + return m; } diff --git a/Modules/_queuemodule.c b/Modules/_queuemodule.c index e033da50..b155ea94 100644 --- a/Modules/_queuemodule.c +++ b/Modules/_queuemodule.c @@ -1,6 +1,5 @@ #include "Python.h" -#include "structmember.h" /* offsetof */ -#include "pythread.h" +#include // offsetof() /*[clinic input] module _queue @@ -302,6 +301,8 @@ static PyMethodDef simplequeue_methods[] = { _QUEUE_SIMPLEQUEUE_PUT_METHODDEF _QUEUE_SIMPLEQUEUE_PUT_NOWAIT_METHODDEF _QUEUE_SIMPLEQUEUE_QSIZE_METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -390,11 +391,9 @@ PyInit__queue(void) if (PyModule_AddObject(m, "Empty", EmptyError) < 0) return NULL; - if (PyType_Ready(&PySimpleQueueType) < 0) - return NULL; - Py_INCREF(&PySimpleQueueType); - if (PyModule_AddObject(m, "SimpleQueue", (PyObject *)&PySimpleQueueType) < 0) + if (PyModule_AddType(m, &PySimpleQueueType) < 0) { return NULL; + } return m; } diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 4e9ac407..1b01491b 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -11,7 +11,7 @@ * renamed genrand_res53() to random_random() and wrapped in python calling/return code. - * genrand_int32() and the helper functions, init_genrand() + * genrand_uint32() and the helper functions, init_genrand() and init_by_array(), were declared static, wrapped in Python calling/return code. also, their global data references were replaced with structure references. @@ -67,9 +67,9 @@ /* ---------------------------------------------------------------*/ #include "Python.h" -#include /* for seeding to current time */ +#include "pycore_byteswap.h" // _Py_bswap32() #ifdef HAVE_PROCESS_H -# include /* needed for getpid() */ +# include // getpid() #endif /* Period parameters -- These are all magic. Don't change. */ @@ -79,15 +79,29 @@ #define UPPER_MASK 0x80000000U /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffU /* least significant r bits */ +typedef struct { + PyObject *Random_Type; + PyObject *Long___abs__; +} _randomstate; + +static inline _randomstate* +get_random_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_randomstate *)state; +} + +static struct PyModuleDef _randommodule; + +#define _randomstate_global get_random_state(PyState_FindModule(&_randommodule)) + typedef struct { PyObject_HEAD int index; uint32_t state[N]; } RandomObject; -static PyTypeObject Random_Type; - -#define RandomObject_Check(v) (Py_TYPE(v) == &Random_Type) #include "clinic/_randommodule.c.h" @@ -102,7 +116,7 @@ class _random.Random "RandomObject *" "&Random_Type" /* generates a random number on [0,0xffffffff]-interval */ static uint32_t -genrand_int32(RandomObject *self) +genrand_uint32(RandomObject *self) { uint32_t y; static const uint32_t mag01[2] = {0x0U, MATRIX_A}; @@ -157,7 +171,7 @@ static PyObject * _random_Random_random_impl(RandomObject *self) /*[clinic end generated code: output=117ff99ee53d755c input=afb2a59cbbb00349]*/ { - uint32_t a=genrand_int32(self)>>5, b=genrand_int32(self)>>6; + uint32_t a=genrand_uint32(self)>>5, b=genrand_uint32(self)>>6; return PyFloat_FromDouble((a*67108864.0+b)*(1.0/9007199254740992.0)); } @@ -220,7 +234,7 @@ init_by_array(RandomObject *self, uint32_t init_key[], size_t key_length) static int random_seed_urandom(RandomObject *self) { - PY_UINT32_T key[N]; + uint32_t key[N]; if (_PyOS_URandomNonblock(key, sizeof(key)) < 0) { return -1; @@ -236,14 +250,14 @@ random_seed_time_pid(RandomObject *self) uint32_t key[5]; now = _PyTime_GetSystemClock(); - key[0] = (PY_UINT32_T)(now & 0xffffffffU); - key[1] = (PY_UINT32_T)(now >> 32); + key[0] = (uint32_t)(now & 0xffffffffU); + key[1] = (uint32_t)(now >> 32); - key[2] = (PY_UINT32_T)getpid(); + key[2] = (uint32_t)getpid(); now = _PyTime_GetMonotonicClock(); - key[3] = (PY_UINT32_T)(now & 0xffffffffU); - key[4] = (PY_UINT32_T)(now >> 32); + key[3] = (uint32_t)(now & 0xffffffffU); + key[4] = (uint32_t)(now >> 32); init_by_array(self, key, Py_ARRAY_LENGTH(key)); } @@ -272,10 +286,12 @@ random_seed(RandomObject *self, PyObject *arg) * So: if the arg is a PyLong, use its absolute value. * Otherwise use its hash value, cast to unsigned. */ - if (PyLong_Check(arg)) { + if (PyLong_CheckExact(arg)) { + n = PyNumber_Absolute(arg); + } else if (PyLong_Check(arg)) { /* Calling int.__abs__() prevents calling arg.__abs__(), which might return an invalid value. See issue #31478. */ - n = PyLong_Type.tp_as_number->nb_absolute(arg); + n = PyObject_CallOneArg(_randomstate_global->Long___abs__, arg); } else { Py_hash_t hash = PyObject_Hash(arg); @@ -458,14 +474,17 @@ _random_Random_getrandbits_impl(RandomObject *self, int k) uint32_t *wordarray; PyObject *result; - if (k <= 0) { + if (k < 0) { PyErr_SetString(PyExc_ValueError, - "number of bits must be greater than zero"); + "number of bits must be non-negative"); return NULL; } + if (k == 0) + return PyLong_FromLong(0); + if (k <= 32) /* Fast path */ - return PyLong_FromUnsignedLong(genrand_int32(self) >> (32 - k)); + return PyLong_FromUnsignedLong(genrand_uint32(self) >> (32 - k)); words = (k - 1) / 32 + 1; wordarray = (uint32_t *)PyMem_Malloc(words * 4); @@ -482,7 +501,7 @@ _random_Random_getrandbits_impl(RandomObject *self, int k) for (i = words - 1; i >= 0; i--, k -= 32) #endif { - r = genrand_int32(self); + r = genrand_uint32(self); if (k < 32) r >>= (32 - k); /* Drop least significant bits */ wordarray[i] = r; @@ -500,10 +519,12 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds) RandomObject *self; PyObject *tmp; - if (type == &Random_Type && !_PyArg_NoKeywords("Random", kwds)) + if (type == (PyTypeObject*)_randomstate_global->Random_Type && + !_PyArg_NoKeywords("Random()", kwds)) { return NULL; + } - self = (RandomObject *)type->tp_alloc(type, 0); + self = (RandomObject *)PyType_GenericAlloc(type, 0); if (self == NULL) return NULL; tmp = random_seed(self, args); @@ -515,76 +536,86 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return (PyObject *)self; } + +/*[clinic input] + +_random.Random.__reduce__ + +[clinic start generated code]*/ + +static PyObject * +_random_Random___reduce___impl(RandomObject *self) +/*[clinic end generated code: output=ddea0dcdb60ffd6d input=bd38ec35fd157e0f]*/ +{ + PyErr_Format(PyExc_TypeError, + "cannot pickle %s object", + Py_TYPE(self)->tp_name); + return NULL; +} + static PyMethodDef random_methods[] = { _RANDOM_RANDOM_RANDOM_METHODDEF _RANDOM_RANDOM_SEED_METHODDEF _RANDOM_RANDOM_GETSTATE_METHODDEF _RANDOM_RANDOM_SETSTATE_METHODDEF _RANDOM_RANDOM_GETRANDBITS_METHODDEF + _RANDOM_RANDOM___REDUCE___METHODDEF {NULL, NULL} /* sentinel */ }; PyDoc_STRVAR(random_doc, "Random() -> create a random number generator with its own internal state."); -static PyTypeObject Random_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_random.Random", /*tp_name*/ - sizeof(RandomObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - 0, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - PyObject_GenericGetAttr, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - random_doc, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - random_methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - random_new, /*tp_new*/ - PyObject_Free, /*tp_free*/ - 0, /*tp_is_gc*/ +static PyType_Slot Random_Type_slots[] = { + {Py_tp_doc, (void *)random_doc}, + {Py_tp_methods, random_methods}, + {Py_tp_new, random_new}, + {Py_tp_free, PyObject_Free}, + {0, 0}, +}; + +static PyType_Spec Random_Type_spec = { + "_random.Random", + sizeof(RandomObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + Random_Type_slots }; PyDoc_STRVAR(module_doc, "Module implements the Mersenne Twister random number generator."); +static int +_random_traverse(PyObject *module, visitproc visit, void *arg) +{ + Py_VISIT(get_random_state(module)->Random_Type); + return 0; +} + +static int +_random_clear(PyObject *module) +{ + Py_CLEAR(get_random_state(module)->Random_Type); + Py_CLEAR(get_random_state(module)->Long___abs__); + return 0; +} + +static void +_random_free(void *module) +{ + _random_clear((PyObject *)module); +} static struct PyModuleDef _randommodule = { PyModuleDef_HEAD_INIT, "_random", module_doc, - -1, - NULL, + sizeof(_randomstate), NULL, NULL, - NULL, - NULL + _random_traverse, + _random_clear, + _random_free, }; PyMODINIT_FUNC @@ -592,12 +623,41 @@ PyInit__random(void) { PyObject *m; - if (PyType_Ready(&Random_Type) < 0) + PyObject *Random_Type = PyType_FromSpec(&Random_Type_spec); + if (Random_Type == NULL) { return NULL; + } + m = PyModule_Create(&_randommodule); - if (m == NULL) + if (m == NULL) { + Py_DECREF(Random_Type); return NULL; - Py_INCREF(&Random_Type); - PyModule_AddObject(m, "Random", (PyObject *)&Random_Type); + } + get_random_state(m)->Random_Type = Random_Type; + + Py_INCREF(Random_Type); + PyModule_AddObject(m, "Random", Random_Type); + + /* Look up and save int.__abs__, which is needed in random_seed(). */ + PyObject *longval = NULL, *longtype = NULL; + longval = PyLong_FromLong(0); + if (longval == NULL) goto fail; + + longtype = PyObject_Type(longval); + if (longtype == NULL) goto fail; + + PyObject *abs = PyObject_GetAttrString(longtype, "__abs__"); + if (abs == NULL) goto fail; + + Py_DECREF(longtype); + Py_DECREF(longval); + get_random_state(m)->Long___abs__ = abs; + return m; + +fail: + Py_XDECREF(longtype); + Py_XDECREF(longval); + Py_DECREF(m); + return NULL; } diff --git a/Modules/_sha3/clinic/sha3module.c.h b/Modules/_sha3/clinic/sha3module.c.h index 554442df..1c79c269 100644 --- a/Modules/_sha3/clinic/sha3module.c.h +++ b/Modules/_sha3/clinic/sha3module.c.h @@ -2,6 +2,52 @@ preserve [clinic start generated code]*/ +PyDoc_STRVAR(py_sha3_new__doc__, +"sha3_224(data=b\'\', /, *, usedforsecurity=True)\n" +"--\n" +"\n" +"Return a new BLAKE2b hash object."); + +static PyObject * +py_sha3_new_impl(PyTypeObject *type, PyObject *data, int usedforsecurity); + +static PyObject * +py_sha3_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "sha3_224", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; + PyObject *data = NULL; + int usedforsecurity = 1; + + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf); + if (!fastargs) { + goto exit; + } + if (nargs < 1) { + goto skip_optional_posonly; + } + noptargs--; + data = fastargs[0]; +skip_optional_posonly: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(fastargs[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = py_sha3_new_impl(type, data, usedforsecurity); + +exit: + return return_value; +} + PyDoc_STRVAR(_sha3_sha3_224_copy__doc__, "copy($self, /)\n" "--\n" @@ -118,4 +164,4 @@ _sha3_shake_128_hexdigest(SHA3object *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=5b3e99b9a96471e8 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c8a97b34e80def62 input=a9049054013a1b77]*/ diff --git a/Modules/_sha3/sha3module.c b/Modules/_sha3/sha3module.c index c1fb6185..c826b42d 100644 --- a/Modules/_sha3/sha3module.c +++ b/Modules/_sha3/sha3module.c @@ -40,7 +40,7 @@ #elif PY_BIG_ENDIAN /* opt64 is not yet supported on big endian platforms */ #define KeccakOpt 32 -#elif SIZEOF_VOID_P == 8 && defined(PY_UINT64_T) +#elif SIZEOF_VOID_P == 8 /* opt64 works only on little-endian 64bit platforms with unsigned int64 */ #define KeccakOpt 64 #else @@ -48,9 +48,9 @@ #define KeccakOpt 32 #endif -#if KeccakOpt == 64 && defined(PY_UINT64_T) +#if KeccakOpt == 64 /* 64bit platforms with unsigned int64 */ - typedef PY_UINT64_T UINT64; + typedef uint64_t UINT64; typedef unsigned char UINT8; #endif @@ -169,21 +169,24 @@ newSHA3object(PyTypeObject *type) return newobj; } +/*[clinic input] +@classmethod +_sha3.sha3_224.__new__ as py_sha3_new + data: object(c_default="NULL") = b'' + / + * + usedforsecurity: bool = True + +Return a new BLAKE2b hash object. +[clinic start generated code]*/ static PyObject * -py_sha3_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +py_sha3_new_impl(PyTypeObject *type, PyObject *data, int usedforsecurity) +/*[clinic end generated code: output=90409addc5d5e8b0 input=bcfcdf2e4368347a]*/ { SHA3object *self = NULL; Py_buffer buf = {NULL, NULL}; HashReturn res; - PyObject *data = NULL; - - if (!_PyArg_NoKeywords(_PyType_Name(type), kwargs)) { - return NULL; - } - if (!PyArg_UnpackTuple(args, _PyType_Name(type), 0, 1, &data)) { - return NULL; - } self = newSHA3object(type); if (self == NULL) { @@ -529,22 +532,22 @@ static PyGetSetDef SHA3_getseters[] = { } PyDoc_STRVAR(sha3_224__doc__, -"sha3_224([data]) -> SHA3 object\n\ +"sha3_224([data], *, usedforsecurity=True) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 28 bytes."); PyDoc_STRVAR(sha3_256__doc__, -"sha3_256([data]) -> SHA3 object\n\ +"sha3_256([data], *, usedforsecurity=True) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 32 bytes."); PyDoc_STRVAR(sha3_384__doc__, -"sha3_384([data]) -> SHA3 object\n\ +"sha3_384([data], *, usedforsecurity=True) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 48 bytes."); PyDoc_STRVAR(sha3_512__doc__, -"sha3_512([data]) -> SHA3 object\n\ +"sha3_512([data], *, usedforsecurity=True) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 64 bytes."); @@ -555,22 +558,22 @@ SHA3_TYPE(SHA3_512type, "_sha3.sha3_512", sha3_512__doc__, SHA3_methods); #ifdef PY_WITH_KECCAK PyDoc_STRVAR(keccak_224__doc__, -"keccak_224([data]) -> Keccak object\n\ +"keccak_224([data], *, usedforsecurity=True) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 28 bytes."); PyDoc_STRVAR(keccak_256__doc__, -"keccak_256([data]) -> Keccak object\n\ +"keccak_256([data], *, usedforsecurity=True) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 32 bytes."); PyDoc_STRVAR(keccak_384__doc__, -"keccak_384([data]) -> Keccak object\n\ +"keccak_384([data], *, usedforsecurity=True) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 48 bytes."); PyDoc_STRVAR(keccak_512__doc__, -"keccak_512([data]) -> Keccak object\n\ +"keccak_512([data], *, usedforsecurity=True) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 64 bytes."); @@ -672,12 +675,12 @@ static PyMethodDef SHAKE_methods[] = { }; PyDoc_STRVAR(shake_128__doc__, -"shake_128([data]) -> SHAKE object\n\ +"shake_128([data], *, usedforsecurity=True) -> SHAKE object\n\ \n\ Return a new SHAKE hash object."); PyDoc_STRVAR(shake_256__doc__, -"shake_256([data]) -> SHAKE object\n\ +"shake_256([data], *, usedforsecurity=True) -> SHAKE object\n\ \n\ Return a new SHAKE hash object."); @@ -710,7 +713,7 @@ PyInit__sha3(void) #define init_sha3type(name, type) \ do { \ - Py_TYPE(type) = &PyType_Type; \ + Py_SET_TYPE(type, &PyType_Type); \ if (PyType_Ready(type) < 0) { \ goto error; \ } \ diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c index 4d418042..758fc022 100644 --- a/Modules/_sqlite/cache.c +++ b/Modules/_sqlite/cache.c @@ -112,9 +112,8 @@ void pysqlite_cache_dealloc(pysqlite_Cache* self) Py_TYPE(self)->tp_free((PyObject*)self); } -PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* args) +PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* key) { - PyObject* key = args; pysqlite_Node* node; pysqlite_Node* ptr; PyObject* data; @@ -184,6 +183,9 @@ PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* args) } } + /* We cannot replace this by PyObject_CallOneArg() since + * PyObject_CallFunction() has a special case when using a + * single tuple as argument. */ data = PyObject_CallFunction(self->factory, "O", key); if (!data) { diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index b6188a36..b8003734 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -23,15 +23,13 @@ #include "cache.h" #include "module.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "connection.h" #include "statement.h" #include "cursor.h" #include "prepare_protocol.h" #include "util.h" -#include "pythread.h" - #define ACTION_FINALIZE 1 #define ACTION_RESET 2 @@ -79,7 +77,7 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject NULL }; - char* database; + const char* database; PyObject* database_obj; int detect_types = 0; PyObject* isolation_level = NULL; @@ -308,7 +306,7 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, factory = (PyObject*)&pysqlite_CursorType; } - cursor = PyObject_CallFunctionObjArgs(factory, (PyObject *)self, NULL); + cursor = PyObject_CallOneArg(factory, (PyObject *)self); if (cursor == NULL) return NULL; if (!PyObject_TypeCheck(cursor, &pysqlite_CursorType)) { @@ -550,7 +548,7 @@ PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_ cur_value = argv[i]; switch (sqlite3_value_type(argv[i])) { case SQLITE_INTEGER: - cur_py_value = _pysqlite_long_from_int64(sqlite3_value_int64(cur_value)); + cur_py_value = PyLong_FromLongLong(sqlite3_value_int64(cur_value)); break; case SQLITE_FLOAT: cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value)); @@ -709,7 +707,7 @@ void _pysqlite_final_callback(sqlite3_context* context) PyErr_Fetch(&exception, &value, &tb); restore = 1; - function_result = _PyObject_CallMethodId(*aggregate_instance, &PyId_finalize, NULL); + function_result = _PyObject_CallMethodIdNoArgs(*aggregate_instance, &PyId_finalize); Py_DECREF(*aggregate_instance); @@ -975,7 +973,7 @@ static void _trace_callback(void* user_arg, const char* statement_string) py_statement = PyUnicode_DecodeUTF8(statement_string, strlen(statement_string), "replace"); if (py_statement) { - ret = PyObject_CallFunctionObjArgs((PyObject*)user_arg, py_statement, NULL); + ret = PyObject_CallOneArg((PyObject*)user_arg, py_statement); Py_DECREF(py_statement); } @@ -1192,9 +1190,9 @@ pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* iso return -1; } - uppercase_level = _PyObject_CallMethodIdObjArgs( + uppercase_level = _PyObject_CallMethodIdOneArg( (PyObject *)&PyUnicode_Type, &PyId_upper, - isolation_level, NULL); + isolation_level); if (!uppercase_level) { return -1; } @@ -1230,7 +1228,7 @@ PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, Py if (!_PyArg_NoKeywords(MODULE_NAME ".Connection", kwargs)) return NULL; - if (!PyArg_ParseTuple(args, "O", &sql)) + if (!PyArg_ParseTuple(args, "U", &sql)) return NULL; _pysqlite_drop_unused_statement_references(self); @@ -1282,7 +1280,7 @@ PyObject* pysqlite_connection_execute(pysqlite_Connection* self, PyObject* args) PyObject* result = 0; PyObject* method = 0; - cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, NULL); + cursor = _PyObject_CallMethodIdNoArgs((PyObject*)self, &PyId_cursor); if (!cursor) { goto error; } @@ -1311,7 +1309,7 @@ PyObject* pysqlite_connection_executemany(pysqlite_Connection* self, PyObject* a PyObject* result = 0; PyObject* method = 0; - cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, NULL); + cursor = _PyObject_CallMethodIdNoArgs((PyObject*)self, &PyId_cursor); if (!cursor) { goto error; } @@ -1340,7 +1338,7 @@ PyObject* pysqlite_connection_executescript(pysqlite_Connection* self, PyObject* PyObject* result = 0; PyObject* method = 0; - cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, NULL); + cursor = _PyObject_CallMethodIdNoArgs((PyObject*)self, &PyId_cursor); if (!cursor) { goto error; } @@ -1472,16 +1470,9 @@ pysqlite_connection_iterdump(pysqlite_Connection* self, PyObject* args) goto finally; } - args = PyTuple_New(1); - if (!args) { - goto finally; - } - Py_INCREF(self); - PyTuple_SetItem(args, 0, (PyObject*)self); - retval = PyObject_CallObject(pyfn_iterdump, args); + retval = PyObject_CallOneArg(pyfn_iterdump, (PyObject *)self); finally: - Py_XDECREF(args); Py_XDECREF(module); return retval; } @@ -1655,7 +1646,7 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) const char *uppercase_name_str; int rc; unsigned int kind; - void *data; + const void *data; if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { goto finally; @@ -1666,8 +1657,8 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) goto finally; } - uppercase_name = _PyObject_CallMethodIdObjArgs((PyObject *)&PyUnicode_Type, - &PyId_upper, name, NULL); + uppercase_name = _PyObject_CallMethodIdOneArg((PyObject *)&PyUnicode_Type, + &PyId_upper, name); if (!uppercase_name) { goto finally; } diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 8cfa6e50..5cfb4b97 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -106,7 +106,7 @@ _pysqlite_get_converter(const char *keystr, Py_ssize_t keylen) if (!key) { return NULL; } - upcase_key = _PyObject_CallMethodId(key, &PyId_upper, NULL); + upcase_key = _PyObject_CallMethodIdNoArgs(key, &PyId_upper); Py_DECREF(key); if (!upcase_key) { return NULL; @@ -274,7 +274,7 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) item = PyBytes_FromStringAndSize(val_str, nbytes); if (!item) goto error; - converted = PyObject_CallFunction(converter, "O", item); + converted = PyObject_CallOneArg(converter, item); Py_DECREF(item); } } else { @@ -285,7 +285,7 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) Py_INCREF(Py_None); converted = Py_None; } else if (coltype == SQLITE_INTEGER) { - converted = _pysqlite_long_from_int64(sqlite3_column_int64(self->statement->st, i)); + converted = PyLong_FromLongLong(sqlite3_column_int64(self->statement->st, i)); } else if (coltype == SQLITE_FLOAT) { converted = PyFloat_FromDouble(sqlite3_column_double(self->statement->st, i)); } else if (coltype == SQLITE_TEXT) { @@ -393,12 +393,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args) if (multiple) { /* executemany() */ - if (!PyArg_ParseTuple(args, "OO", &operation, &second_argument)) { - goto error; - } - - if (!PyUnicode_Check(operation)) { - PyErr_SetString(PyExc_ValueError, "operation parameter must be str"); + if (!PyArg_ParseTuple(args, "UO", &operation, &second_argument)) { goto error; } @@ -415,12 +410,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args) } } else { /* execute() */ - if (!PyArg_ParseTuple(args, "O|O", &operation, &second_argument)) { - goto error; - } - - if (!PyUnicode_Check(operation)) { - PyErr_SetString(PyExc_ValueError, "operation parameter must be str"); + if (!PyArg_ParseTuple(args, "U|O", &operation, &second_argument)) { goto error; } @@ -583,7 +573,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args) Py_BEGIN_ALLOW_THREADS lastrowid = sqlite3_last_insert_rowid(self->connection->db); Py_END_ALLOW_THREADS - self->lastrowid = _pysqlite_long_from_int64(lastrowid); + self->lastrowid = PyLong_FromLongLong(lastrowid); } if (rc == SQLITE_ROW) { @@ -636,7 +626,6 @@ static PyObject * pysqlite_cursor_executescript(pysqlite_Cursor* self, PyObject* args) { PyObject* script_obj; - PyObject* script_str = NULL; const char* script_cstr; sqlite3_stmt* statement; int rc; @@ -710,8 +699,6 @@ pysqlite_cursor_executescript(pysqlite_Cursor* self, PyObject* args) } error: - Py_XDECREF(script_str); - if (PyErr_Occurred()) { return NULL; } else { @@ -798,7 +785,7 @@ PyObject* pysqlite_cursor_fetchone(pysqlite_Cursor* self, PyObject* args) PyObject* pysqlite_cursor_fetchmany(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"size", NULL, NULL}; + static char *kwlist[] = {"size", NULL}; PyObject* row; PyObject* list; @@ -814,17 +801,9 @@ PyObject* pysqlite_cursor_fetchmany(pysqlite_Cursor* self, PyObject* args, PyObj return NULL; } - /* just make sure we enter the loop */ - row = Py_None; - - while (row) { - row = pysqlite_cursor_iternext(self); - if (row) { - PyList_Append(list, row); - Py_DECREF(row); - } else { - break; - } + while ((row = pysqlite_cursor_iternext(self))) { + PyList_Append(list, row); + Py_XDECREF(row); if (++counter == maxrows) { break; @@ -849,15 +828,9 @@ PyObject* pysqlite_cursor_fetchall(pysqlite_Cursor* self, PyObject* args) return NULL; } - /* just make sure we enter the loop */ - row = (PyObject*)Py_None; - - while (row) { - row = pysqlite_cursor_iternext(self); - if (row) { - PyList_Append(list, row); - Py_DECREF(row); - } + while ((row = pysqlite_cursor_iternext(self))) { + PyList_Append(list, row); + Py_XDECREF(row); } if (PyErr_Occurred()) { diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index c23b09f5..3b2d7f42 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -24,7 +24,6 @@ */ #include -#include #include "cursor.h" #include "microprotocols.h" @@ -84,7 +83,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) way to get a quotable object to be its instance */ /* look for an adapter in the registry */ - key = Py_BuildValue("(OO)", (PyObject*)obj->ob_type, proto); + key = Py_BuildValue("(OO)", (PyObject*)Py_TYPE(obj), proto); if (!key) { return NULL; } @@ -92,7 +91,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) Py_DECREF(key); if (adapter) { Py_INCREF(adapter); - adapted = PyObject_CallFunctionObjArgs(adapter, obj, NULL); + adapted = PyObject_CallOneArg(adapter, obj); Py_DECREF(adapter); return adapted; } @@ -105,7 +104,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) return NULL; } if (adapter) { - adapted = PyObject_CallFunctionObjArgs(adapter, obj, NULL); + adapted = PyObject_CallOneArg(adapter, obj); Py_DECREF(adapter); if (adapted == Py_None) { @@ -124,7 +123,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) return NULL; } if (adapter) { - adapted = PyObject_CallFunctionObjArgs(adapter, proto, NULL); + adapted = PyObject_CallOneArg(adapter, proto); Py_DECREF(adapter); if (adapted == Py_None) { diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 9fe0dc95..71d951ee 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -105,7 +105,7 @@ RAM instead of on disk."); static PyObject* module_complete(PyObject* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"statement", NULL, NULL}; + static char *kwlist[] = {"statement", NULL}; char* statement; PyObject* result; @@ -135,7 +135,7 @@ Checks if a string contains a complete SQL statement. Non-standard."); static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"do_enable", NULL, NULL}; + static char *kwlist[] = {"do_enable", NULL}; int do_enable; int rc; @@ -203,7 +203,7 @@ static PyObject* module_register_converter(PyObject* self, PyObject* args) } /* convert the name to upper case */ - name = _PyObject_CallMethodId(orig_name, &PyId_upper, NULL); + name = _PyObject_CallMethodIdNoArgs(orig_name, &PyId_upper); if (!name) { goto error; } @@ -346,6 +346,14 @@ static struct PyModuleDef _sqlite3module = { NULL }; +#define ADD_TYPE(module, type) \ +do { \ + if (PyModule_AddType(module, &type) < 0) { \ + Py_DECREF(module); \ + return NULL; \ + } \ +} while (0) + PyMODINIT_FUNC PyInit__sqlite3(void) { PyObject *module, *dict; @@ -366,14 +374,10 @@ PyMODINIT_FUNC PyInit__sqlite3(void) return NULL; } - Py_INCREF(&pysqlite_ConnectionType); - PyModule_AddObject(module, "Connection", (PyObject*) &pysqlite_ConnectionType); - Py_INCREF(&pysqlite_CursorType); - PyModule_AddObject(module, "Cursor", (PyObject*) &pysqlite_CursorType); - Py_INCREF(&pysqlite_PrepareProtocolType); - PyModule_AddObject(module, "PrepareProtocol", (PyObject*) &pysqlite_PrepareProtocolType); - Py_INCREF(&pysqlite_RowType); - PyModule_AddObject(module, "Row", (PyObject*) &pysqlite_RowType); + ADD_TYPE(module, pysqlite_ConnectionType); + ADD_TYPE(module, pysqlite_CursorType); + ADD_TYPE(module, pysqlite_PrepareProtocolType); + ADD_TYPE(module, pysqlite_RowType); if (!(dict = PyModule_GetDict(module))) { goto error; diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c index 181c7edf..05a2ca5a 100644 --- a/Modules/_sqlite/prepare_protocol.c +++ b/Modules/_sqlite/prepare_protocol.c @@ -78,6 +78,6 @@ PyTypeObject pysqlite_PrepareProtocolType= { extern int pysqlite_prepare_protocol_setup_types(void) { pysqlite_PrepareProtocolType.tp_new = PyType_GenericNew; - Py_TYPE(&pysqlite_PrepareProtocolType)= &PyType_Type; + Py_SET_TYPE(&pysqlite_PrepareProtocolType, &PyType_Type); return PyType_Ready(&pysqlite_PrepareProtocolType); } diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 491294b0..23c204e7 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -59,6 +59,8 @@ int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* con self->st = NULL; self->in_use = 0; + assert(PyUnicode_Check(sql)); + sql_cstr = PyUnicode_AsUTF8AndSize(sql, &sql_cstr_len); if (sql_cstr == NULL) { rc = PYSQLITE_SQL_WRONG_TYPE; @@ -225,6 +227,9 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para num_params = PyList_GET_SIZE(parameters); } else { num_params = PySequence_Size(parameters); + if (num_params == -1) { + return; + } } if (num_params != num_params_needed) { PyErr_Format(pysqlite_ProgrammingError, @@ -236,9 +241,9 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para for (i = 0; i < num_params; i++) { if (PyTuple_CheckExact(parameters)) { current_param = PyTuple_GET_ITEM(parameters, i); - Py_XINCREF(current_param); + Py_INCREF(current_param); } else if (PyList_CheckExact(parameters)) { - current_param = PyList_GET_ITEM(parameters, i); + current_param = PyList_GetItem(parameters, i); Py_XINCREF(current_param); } else { current_param = PySequence_GetItem(parameters, i); diff --git a/Modules/_sqlite/util.c b/Modules/_sqlite/util.c index 3fa671d0..1dbabcdd 100644 --- a/Modules/_sqlite/util.c +++ b/Modules/_sqlite/util.c @@ -103,22 +103,6 @@ int _pysqlite_seterror(sqlite3* db, sqlite3_stmt* st) # define IS_LITTLE_ENDIAN 1 #endif -PyObject * -_pysqlite_long_from_int64(sqlite_int64 value) -{ -# if SIZEOF_LONG_LONG < 8 - if (value > PY_LLONG_MAX || value < PY_LLONG_MIN) { - return _PyLong_FromByteArray(&value, sizeof(value), - IS_LITTLE_ENDIAN, 1 /* signed */); - } -# endif -# if SIZEOF_LONG < SIZEOF_LONG_LONG - if (value > LONG_MAX || value < LONG_MIN) - return PyLong_FromLongLong(value); -# endif - return PyLong_FromLong(Py_SAFE_DOWNCAST(value, sqlite_int64, long)); -} - sqlite_int64 _pysqlite_long_as_int64(PyObject * py_val) { diff --git a/Modules/_sqlite/util.h b/Modules/_sqlite/util.h index 62619111..c5a220e9 100644 --- a/Modules/_sqlite/util.h +++ b/Modules/_sqlite/util.h @@ -37,7 +37,6 @@ int pysqlite_step(sqlite3_stmt* statement, pysqlite_Connection* connection); */ int _pysqlite_seterror(sqlite3* db, sqlite3_stmt* st); -PyObject * _pysqlite_long_from_int64(sqlite_int64 value); sqlite_int64 _pysqlite_long_as_int64(PyObject * value); #if SQLITE_VERSION_NUMBER >= 3007014 diff --git a/Modules/_sre.c b/Modules/_sre.c index d4fe588c..244e4f1f 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -41,7 +41,7 @@ static const char copyright[] = #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" /* offsetof */ +#include "structmember.h" // PyMemberDef #include "sre.h" @@ -351,7 +351,7 @@ state_reset(SRE_STATE* state) data_stack_dealloc(state); } -static void* +static const void* getstring(PyObject* string, Py_ssize_t* p_length, int* p_isbytes, int* p_charsize, Py_buffer *view) @@ -398,11 +398,11 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string, Py_ssize_t length; int isbytes, charsize; - void* ptr; + const void* ptr; memset(state, 0, sizeof(SRE_STATE)); - state->mark = PyMem_New(void *, pattern->groups * 2); + state->mark = PyMem_New(const void *, pattern->groups * 2); if (!state->mark) { PyErr_NoMemory(); goto err; @@ -891,7 +891,7 @@ _sre_SRE_Pattern_split_impl(PatternObject *self, PyObject *string, Py_ssize_t status; Py_ssize_t n; Py_ssize_t i; - void* last; + const void* last; assert(self->codesize != 0); @@ -984,7 +984,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, PyObject* item; PyObject* filter; PyObject* match; - void* ptr; + const void* ptr; Py_ssize_t status; Py_ssize_t n; Py_ssize_t i, b, e; @@ -1002,7 +1002,6 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, int literal; view.buf = NULL; ptr = getstring(ptemplate, &n, &isbytes, &charsize, &view); - b = charsize; if (ptr) { if (charsize == 1) literal = memchr(ptr, '\\', n) == NULL; @@ -1082,7 +1081,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, match = pattern_new_match(self, &state, 1); if (!match) goto error; - item = PyObject_CallFunctionObjArgs(filter, match, NULL); + item = PyObject_CallOneArg(filter, match); Py_DECREF(match); if (!item) goto error; @@ -1339,7 +1338,7 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags, n = PyList_GET_SIZE(code); /* coverity[ampersand_in_size] */ - self = PyObject_NEW_VAR(PatternObject, &Pattern_Type, n); + self = PyObject_NewVar(PatternObject, &Pattern_Type, n); if (!self) return NULL; self->weakreflist = NULL; @@ -1896,7 +1895,7 @@ match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def) int isbytes, charsize; Py_buffer view; PyObject *result; - void* ptr; + const void* ptr; Py_ssize_t i, j; assert(0 <= index && index < self->groups); @@ -2328,8 +2327,8 @@ pattern_new_match(PatternObject* pattern, SRE_STATE* state, Py_ssize_t status) /* create match object (with room for extra group marks) */ /* coverity[ampersand_in_size] */ - match = PyObject_NEW_VAR(MatchObject, &Match_Type, - 2*(pattern->groups+1)); + match = PyObject_NewVar(MatchObject, &Match_Type, + 2*(pattern->groups+1)); if (!match) return NULL; @@ -2469,7 +2468,7 @@ pattern_scanner(PatternObject *self, PyObject *string, Py_ssize_t pos, Py_ssize_ ScannerObject* scanner; /* create scanner object */ - scanner = PyObject_NEW(ScannerObject, &Scanner_Type); + scanner = PyObject_New(ScannerObject, &Scanner_Type); if (!scanner) return NULL; scanner->pattern = NULL; @@ -2519,7 +2518,7 @@ pattern_richcompare(PyObject *lefto, PyObject *righto, int op) Py_RETURN_NOTIMPLEMENTED; } - if (Py_TYPE(lefto) != &Pattern_Type || Py_TYPE(righto) != &Pattern_Type) { + if (!Py_IS_TYPE(lefto, &Pattern_Type) || !Py_IS_TYPE(righto, &Pattern_Type)) { Py_RETURN_NOTIMPLEMENTED; } @@ -2569,6 +2568,8 @@ static PyMethodDef pattern_methods[] = { _SRE_SRE_PATTERN_SCANNER_METHODDEF _SRE_SRE_PATTERN___COPY___METHODDEF _SRE_SRE_PATTERN___DEEPCOPY___METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, + PyDoc_STR("See PEP 585")}, {NULL, NULL} }; @@ -2639,6 +2640,8 @@ static PyMethodDef match_methods[] = { _SRE_SRE_MATCH_EXPAND_METHODDEF _SRE_SRE_MATCH___COPY___METHODDEF _SRE_SRE_MATCH___DEEPCOPY___METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, + PyDoc_STR("See PEP 585")}, {NULL, NULL} }; diff --git a/Modules/_ssl.c b/Modules/_ssl.c index e6dda298..28796b37 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -18,8 +18,6 @@ #include "Python.h" -#include "pythread.h" - /* Redefined below for Windows debug builds after important #includes */ #define _PySSL_FIX_ERRNO @@ -523,9 +521,9 @@ static int PySSL_select(PySocketSockObject *s, int writing, _PyTime_t timeout); static int PySSL_set_owner(PySSLSocket *, PyObject *, void *); static int PySSL_set_session(PySSLSocket *, PyObject *, void *); -#define PySSLSocket_Check(v) (Py_TYPE(v) == &PySSLSocket_Type) -#define PySSLMemoryBIO_Check(v) (Py_TYPE(v) == &PySSLMemoryBIO_Type) -#define PySSLSession_Check(v) (Py_TYPE(v) == &PySSLSession_Type) +#define PySSLSocket_Check(v) Py_IS_TYPE(v, &PySSLSocket_Type) +#define PySSLMemoryBIO_Check(v) Py_IS_TYPE(v, &PySSLMemoryBIO_Type) +#define PySSLSession_Check(v) Py_IS_TYPE(v, &PySSLSession_Type) typedef enum { SOCKET_IS_NONBLOCKING, @@ -4069,7 +4067,7 @@ error: /* internal helper function, returns -1 on error */ static int -_add_ca_certs(PySSLContext *self, void *data, Py_ssize_t len, +_add_ca_certs(PySSLContext *self, const void *data, Py_ssize_t len, int filetype) { BIO *biobuf = NULL; @@ -4255,7 +4253,6 @@ _ssl__SSLContext_load_verify_locations_impl(PySSLContext *self, r = SSL_CTX_load_verify_locations(self->ctx, cafile_buf, capath_buf); PySSL_END_ALLOW_THREADS if (r != 1) { - ok = 0; if (errno != 0) { ERR_clear_error(); PyErr_SetFromErrno(PyExc_OSError); diff --git a/Modules/_stat.c b/Modules/_stat.c index 7a799af0..546e6a5f 100644 --- a/Modules/_stat.c +++ b/Modules/_stat.c @@ -496,113 +496,140 @@ ST_CTIME\n\ "); +static int +stat_exec(PyObject *module) +{ +#define ADD_INT_MACRO(module, macro) \ + do { \ + if (PyModule_AddIntConstant(module, #macro, macro) < 0) { \ + return -1; \ + } \ + } while (0) + + ADD_INT_MACRO(module, S_IFDIR); + ADD_INT_MACRO(module, S_IFCHR); + ADD_INT_MACRO(module, S_IFBLK); + ADD_INT_MACRO(module, S_IFREG); + ADD_INT_MACRO(module, S_IFIFO); + ADD_INT_MACRO(module, S_IFLNK); + ADD_INT_MACRO(module, S_IFSOCK); + ADD_INT_MACRO(module, S_IFDOOR); + ADD_INT_MACRO(module, S_IFPORT); + ADD_INT_MACRO(module, S_IFWHT); + + ADD_INT_MACRO(module, S_ISUID); + ADD_INT_MACRO(module, S_ISGID); + ADD_INT_MACRO(module, S_ISVTX); + ADD_INT_MACRO(module, S_ENFMT); + + ADD_INT_MACRO(module, S_IREAD); + ADD_INT_MACRO(module, S_IWRITE); + ADD_INT_MACRO(module, S_IEXEC); + + ADD_INT_MACRO(module, S_IRWXU); + ADD_INT_MACRO(module, S_IRUSR); + ADD_INT_MACRO(module, S_IWUSR); + ADD_INT_MACRO(module, S_IXUSR); + + ADD_INT_MACRO(module, S_IRWXG); + ADD_INT_MACRO(module, S_IRGRP); + ADD_INT_MACRO(module, S_IWGRP); + ADD_INT_MACRO(module, S_IXGRP); + + ADD_INT_MACRO(module, S_IRWXO); + ADD_INT_MACRO(module, S_IROTH); + ADD_INT_MACRO(module, S_IWOTH); + ADD_INT_MACRO(module, S_IXOTH); + + ADD_INT_MACRO(module, UF_NODUMP); + ADD_INT_MACRO(module, UF_IMMUTABLE); + ADD_INT_MACRO(module, UF_APPEND); + ADD_INT_MACRO(module, UF_OPAQUE); + ADD_INT_MACRO(module, UF_NOUNLINK); + ADD_INT_MACRO(module, UF_COMPRESSED); + ADD_INT_MACRO(module, UF_HIDDEN); + ADD_INT_MACRO(module, SF_ARCHIVED); + ADD_INT_MACRO(module, SF_IMMUTABLE); + ADD_INT_MACRO(module, SF_APPEND); + ADD_INT_MACRO(module, SF_NOUNLINK); + ADD_INT_MACRO(module, SF_SNAPSHOT); + + const char* st_constants[] = { + "ST_MODE", + "ST_INO", + "ST_DEV", + "ST_NLINK", + "ST_UID", + "ST_GID", + "ST_SIZE", + "ST_ATIME", + "ST_MTIME", + "ST_CTIME" + }; + + for (int i = 0; i < (int)Py_ARRAY_LENGTH(st_constants); i++) { + if (PyModule_AddIntConstant(module, st_constants[i], i) < 0) { + return -1; + } + } + +#ifdef MS_WINDOWS + ADD_INT_MACRO(module, FILE_ATTRIBUTE_ARCHIVE); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_COMPRESSED); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_DEVICE); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_DIRECTORY); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_ENCRYPTED); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_HIDDEN); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_INTEGRITY_STREAM); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_NORMAL); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_NO_SCRUB_DATA); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_OFFLINE); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_READONLY); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_REPARSE_POINT); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_SPARSE_FILE); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_SYSTEM); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_TEMPORARY); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_VIRTUAL); + + if (PyModule_AddObject(module, "IO_REPARSE_TAG_SYMLINK", + PyLong_FromUnsignedLong(IO_REPARSE_TAG_SYMLINK)) < 0) { + return -1; + } + if (PyModule_AddObject(module, "IO_REPARSE_TAG_MOUNT_POINT", + PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT)) < 0) { + return -1; + } + if (PyModule_AddObject(module, "IO_REPARSE_TAG_APPEXECLINK", + PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK)) < 0) { + return -1; + } +#endif + + return 0; +} + + +static PyModuleDef_Slot stat_slots[] = { + {Py_mod_exec, stat_exec}, + {0, NULL} +}; + + static struct PyModuleDef statmodule = { PyModuleDef_HEAD_INIT, - "_stat", - module_doc, - -1, - stat_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "_stat", + .m_doc = module_doc, + .m_size = 0, + .m_methods = stat_methods, + .m_slots = stat_slots, }; + PyMODINIT_FUNC PyInit__stat(void) { - PyObject *m; - m = PyModule_Create(&statmodule); - if (m == NULL) - return NULL; - - if (PyModule_AddIntMacro(m, S_IFDIR)) return NULL; - if (PyModule_AddIntMacro(m, S_IFCHR)) return NULL; - if (PyModule_AddIntMacro(m, S_IFBLK)) return NULL; - if (PyModule_AddIntMacro(m, S_IFREG)) return NULL; - if (PyModule_AddIntMacro(m, S_IFIFO)) return NULL; - if (PyModule_AddIntMacro(m, S_IFLNK)) return NULL; - if (PyModule_AddIntMacro(m, S_IFSOCK)) return NULL; - if (PyModule_AddIntMacro(m, S_IFDOOR)) return NULL; - if (PyModule_AddIntMacro(m, S_IFPORT)) return NULL; - if (PyModule_AddIntMacro(m, S_IFWHT)) return NULL; - - if (PyModule_AddIntMacro(m, S_ISUID)) return NULL; - if (PyModule_AddIntMacro(m, S_ISGID)) return NULL; - if (PyModule_AddIntMacro(m, S_ISVTX)) return NULL; - if (PyModule_AddIntMacro(m, S_ENFMT)) return NULL; - - if (PyModule_AddIntMacro(m, S_IREAD)) return NULL; - if (PyModule_AddIntMacro(m, S_IWRITE)) return NULL; - if (PyModule_AddIntMacro(m, S_IEXEC)) return NULL; - - if (PyModule_AddIntMacro(m, S_IRWXU)) return NULL; - if (PyModule_AddIntMacro(m, S_IRUSR)) return NULL; - if (PyModule_AddIntMacro(m, S_IWUSR)) return NULL; - if (PyModule_AddIntMacro(m, S_IXUSR)) return NULL; - - if (PyModule_AddIntMacro(m, S_IRWXG)) return NULL; - if (PyModule_AddIntMacro(m, S_IRGRP)) return NULL; - if (PyModule_AddIntMacro(m, S_IWGRP)) return NULL; - if (PyModule_AddIntMacro(m, S_IXGRP)) return NULL; - - if (PyModule_AddIntMacro(m, S_IRWXO)) return NULL; - if (PyModule_AddIntMacro(m, S_IROTH)) return NULL; - if (PyModule_AddIntMacro(m, S_IWOTH)) return NULL; - if (PyModule_AddIntMacro(m, S_IXOTH)) return NULL; - - if (PyModule_AddIntMacro(m, UF_NODUMP)) return NULL; - if (PyModule_AddIntMacro(m, UF_IMMUTABLE)) return NULL; - if (PyModule_AddIntMacro(m, UF_APPEND)) return NULL; - if (PyModule_AddIntMacro(m, UF_OPAQUE)) return NULL; - if (PyModule_AddIntMacro(m, UF_NOUNLINK)) return NULL; - if (PyModule_AddIntMacro(m, UF_COMPRESSED)) return NULL; - if (PyModule_AddIntMacro(m, UF_HIDDEN)) return NULL; - if (PyModule_AddIntMacro(m, SF_ARCHIVED)) return NULL; - if (PyModule_AddIntMacro(m, SF_IMMUTABLE)) return NULL; - if (PyModule_AddIntMacro(m, SF_APPEND)) return NULL; - if (PyModule_AddIntMacro(m, SF_NOUNLINK)) return NULL; - if (PyModule_AddIntMacro(m, SF_SNAPSHOT)) return NULL; - - if (PyModule_AddIntConstant(m, "ST_MODE", 0)) return NULL; - if (PyModule_AddIntConstant(m, "ST_INO", 1)) return NULL; - if (PyModule_AddIntConstant(m, "ST_DEV", 2)) return NULL; - if (PyModule_AddIntConstant(m, "ST_NLINK", 3)) return NULL; - if (PyModule_AddIntConstant(m, "ST_UID", 4)) return NULL; - if (PyModule_AddIntConstant(m, "ST_GID", 5)) return NULL; - if (PyModule_AddIntConstant(m, "ST_SIZE", 6)) return NULL; - if (PyModule_AddIntConstant(m, "ST_ATIME", 7)) return NULL; - if (PyModule_AddIntConstant(m, "ST_MTIME", 8)) return NULL; - if (PyModule_AddIntConstant(m, "ST_CTIME", 9)) return NULL; - -#ifdef MS_WINDOWS - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_ARCHIVE)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_COMPRESSED)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_DEVICE)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_DIRECTORY)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_ENCRYPTED)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_HIDDEN)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_INTEGRITY_STREAM)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NORMAL)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NO_SCRUB_DATA)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_OFFLINE)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_READONLY)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_REPARSE_POINT)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_SPARSE_FILE)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_SYSTEM)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_TEMPORARY)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_VIRTUAL)) return NULL; - - if (PyModule_AddObject(m, "IO_REPARSE_TAG_SYMLINK", - PyLong_FromUnsignedLong(IO_REPARSE_TAG_SYMLINK))) return NULL; - if (PyModule_AddObject(m, "IO_REPARSE_TAG_MOUNT_POINT", - PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT))) return NULL; - if (PyModule_AddObject(m, "IO_REPARSE_TAG_APPEXECLINK", - PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK))) return NULL; -#endif - - return m; + return PyModuleDef_Init(&statmodule); } #ifdef __cplusplus diff --git a/Modules/_statisticsmodule.c b/Modules/_statisticsmodule.c index a646e96d..78c0676a 100644 --- a/Modules/_statisticsmodule.c +++ b/Modules/_statisticsmodule.c @@ -1,7 +1,6 @@ /* statistics accelerator C extension: _statistics module. */ #include "Python.h" -#include "structmember.h" #include "clinic/_statisticsmodule.c.h" /*[clinic input] @@ -129,13 +128,17 @@ static PyMethodDef statistics_methods[] = { PyDoc_STRVAR(statistics_doc, "Accelerators for the statistics module.\n"); +static struct PyModuleDef_Slot _statisticsmodule_slots[] = { + {0, NULL} +}; + static struct PyModuleDef statisticsmodule = { PyModuleDef_HEAD_INIT, "_statistics", statistics_doc, - -1, + 0, statistics_methods, - NULL, + _statisticsmodule_slots, NULL, NULL, NULL @@ -144,7 +147,5 @@ static struct PyModuleDef statisticsmodule = { PyMODINIT_FUNC PyInit__statistics(void) { - PyObject *m = PyModule_Create(&statisticsmodule); - if (!m) return NULL; - return m; + return PyModuleDef_Init(&statisticsmodule); } diff --git a/Modules/_struct.c b/Modules/_struct.c index 64a9827e..f759f0b1 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -6,7 +6,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include /*[clinic input] @@ -14,7 +14,23 @@ class Struct "PyStructObject *" "&PyStructType" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=9b032058a83ed7c3]*/ -static PyTypeObject PyStructType; +typedef struct { + PyObject *PyStructType; + PyObject *unpackiter_type; + PyObject *StructError; +} _structmodulestate; + +static inline _structmodulestate* +get_struct_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_structmodulestate *)state; +} + +static struct PyModuleDef _structmodule; + +#define _structmodulestate_global get_struct_state(PyState_FindModule(&_structmodule)) /* The translation function for each format character is table driven */ typedef struct _formatdef { @@ -46,13 +62,8 @@ typedef struct { } PyStructObject; -#define PyStruct_Check(op) PyObject_TypeCheck(op, &PyStructType) -#define PyStruct_CheckExact(op) (Py_TYPE(op) == &PyStructType) - - -/* Exception */ - -static PyObject *StructError; +#define PyStruct_Check(op) PyObject_TypeCheck(op, (PyTypeObject *)_structmodulestate_global->PyStructType) +#define PyStruct_CheckExact(op) Py_IS_TYPE(op, (PyTypeObject *)_structmodulestate_global->PyStructType) /* Define various structs to figure out the alignments of types */ @@ -115,7 +126,7 @@ get_pylong(PyObject *v) return NULL; } else { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not an integer"); return NULL; } @@ -143,7 +154,7 @@ get_long(PyObject *v, long *p) Py_DECREF(v); if (x == (long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -167,7 +178,7 @@ get_ulong(PyObject *v, unsigned long *p) Py_DECREF(v); if (x == (unsigned long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -190,7 +201,7 @@ get_longlong(PyObject *v, long long *p) Py_DECREF(v); if (x == (long long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -213,7 +224,7 @@ get_ulonglong(PyObject *v, unsigned long long *p) Py_DECREF(v); if (x == (unsigned long long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -236,7 +247,7 @@ get_ssize_t(PyObject *v, Py_ssize_t *p) Py_DECREF(v); if (x == (Py_ssize_t)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -259,7 +270,7 @@ get_size_t(PyObject *v, size_t *p) Py_DECREF(v); if (x == (size_t)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -293,7 +304,7 @@ pack_halffloat(char *p, /* start of 2-byte string */ { double x = PyFloat_AsDouble(v); if (x == -1.0 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -339,13 +350,13 @@ _range_error(const formatdef *f, int is_unsigned) const size_t ulargest = (size_t)-1 >> ((SIZEOF_SIZE_T - f->size)*8); assert(f->size >= 1 && f->size <= SIZEOF_SIZE_T); if (is_unsigned) - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "'%c' format requires 0 <= number <= %zu", f->format, ulargest); else { const Py_ssize_t largest = (Py_ssize_t)(ulargest >> 1); - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "'%c' format requires %zd <= number <= %zd", f->format, ~ largest, @@ -361,8 +372,8 @@ _range_error(const formatdef *f, int is_unsigned) [bln][up]_TYPE - [bln] distiguishes among big-endian, little-endian and native. - [pu] distiguishes between pack (to struct) and unpack (from struct). + [bln] distinguishes among big-endian, little-endian and native. + [pu] distinguishes between pack (to struct) and unpack (from struct). TYPE is one of char, byte, ubyte, etc. */ @@ -524,7 +535,7 @@ np_byte(char *p, PyObject *v, const formatdef *f) if (get_long(v, &x) < 0) return -1; if (x < -128 || x > 127) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "byte format requires -128 <= number <= 127"); return -1; } @@ -539,7 +550,7 @@ np_ubyte(char *p, PyObject *v, const formatdef *f) if (get_long(v, &x) < 0) return -1; if (x < 0 || x > 255) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "ubyte format requires 0 <= number <= 255"); return -1; } @@ -550,8 +561,8 @@ np_ubyte(char *p, PyObject *v, const formatdef *f) static int np_char(char *p, PyObject *v, const formatdef *f) { - if (!PyBytes_Check(v) || PyBytes_GET_SIZE(v) != 1) { - PyErr_SetString(StructError, + if (!PyBytes_Check(v) || PyBytes_Size(v) != 1) { + PyErr_SetString(_structmodulestate_global->StructError, "char format requires a bytes object of length 1"); return -1; } @@ -567,7 +578,7 @@ np_short(char *p, PyObject *v, const formatdef *f) if (get_long(v, &x) < 0) return -1; if (x < SHRT_MIN || x > SHRT_MAX) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "short format requires " Py_STRINGIFY(SHRT_MIN) " <= number <= " Py_STRINGIFY(SHRT_MAX)); return -1; @@ -585,7 +596,7 @@ np_ushort(char *p, PyObject *v, const formatdef *f) if (get_long(v, &x) < 0) return -1; if (x < 0 || x > USHRT_MAX) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "ushort format requires 0 <= number <= " Py_STRINGIFY(USHRT_MAX)); return -1; @@ -716,7 +727,7 @@ np_float(char *p, PyObject *v, const formatdef *f) { float x = (float)PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -729,7 +740,7 @@ np_double(char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -948,7 +959,7 @@ bp_float(char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -960,7 +971,7 @@ bp_double(char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -1163,7 +1174,7 @@ lp_float(char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -1175,7 +1186,7 @@ lp_double(char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -1242,7 +1253,7 @@ getentry(int c, const formatdef *f) return f; } } - PyErr_SetString(StructError, "bad char in struct format"); + PyErr_SetString(_structmodulestate_global->StructError, "bad char in struct format"); return NULL; } @@ -1286,7 +1297,8 @@ prepare_s(PyStructObject *self) fmt = PyBytes_AS_STRING(self->s_format); if (strlen(fmt) != (size_t)PyBytes_GET_SIZE(self->s_format)) { - PyErr_SetString(StructError, "embedded null character"); + PyErr_SetString(_structmodulestate_global->StructError, + "embedded null character"); return -1; } @@ -1297,7 +1309,7 @@ prepare_s(PyStructObject *self) len = 0; ncodes = 0; while ((c = *s++) != '\0') { - if (Py_ISSPACE(Py_CHARMASK(c))) + if (Py_ISSPACE(c)) continue; if ('0' <= c && c <= '9') { num = c - '0'; @@ -1311,7 +1323,7 @@ prepare_s(PyStructObject *self) num = num*10 + (c - '0'); } if (c == '\0') { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "repeat count given without format specifier"); return -1; } @@ -1362,7 +1374,7 @@ prepare_s(PyStructObject *self) s = fmt; size = 0; while ((c = *s++) != '\0') { - if (Py_ISSPACE(Py_CHARMASK(c))) + if (Py_ISSPACE(c)) continue; if ('0' <= c && c <= '9') { num = c - '0'; @@ -1401,7 +1413,7 @@ prepare_s(PyStructObject *self) return 0; overflow: - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "total struct size too long"); return -1; } @@ -1411,9 +1423,11 @@ s_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *self; - assert(type != NULL && type->tp_alloc != NULL); + assert(type != NULL); + allocfunc alloc_func = PyType_GetSlot(type, Py_tp_alloc); + assert(alloc_func != NULL); - self = type->tp_alloc(type, 0); + self = alloc_func(type, 0); if (self != NULL) { PyStructObject *s = (PyStructObject*)self; Py_INCREF(Py_None); @@ -1459,7 +1473,7 @@ Struct___init___impl(PyStructObject *self, PyObject *format) PyErr_Format(PyExc_TypeError, "Struct() argument 1 must be a str or bytes object, " "not %.200s", - Py_TYPE(format)->tp_name); + _PyType_Name(Py_TYPE(format))); return -1; } @@ -1472,13 +1486,16 @@ Struct___init___impl(PyStructObject *self, PyObject *format) static void s_dealloc(PyStructObject *s) { + PyTypeObject *tp = Py_TYPE(s); if (s->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *)s); if (s->s_codes != NULL) { PyMem_FREE(s->s_codes); } - Py_DECREF(s->s_format); - Py_TYPE(s)->tp_free((PyObject *)s); + Py_XDECREF(s->s_format); + freefunc free_func = PyType_GetSlot(Py_TYPE(s), Py_tp_free); + free_func(s); + Py_DECREF(tp); } static PyObject * @@ -1539,7 +1556,7 @@ Struct_unpack_impl(PyStructObject *self, Py_buffer *buffer) { assert(self->s_codes != NULL); if (buffer->len != self->s_size) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "unpack requires a buffer of %zd bytes", self->s_size); return NULL; @@ -1572,7 +1589,7 @@ Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer, if (offset < 0) { if (offset + self->s_size > 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "not enough data to unpack %zd bytes at offset %zd", self->s_size, offset); @@ -1580,7 +1597,7 @@ Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer, } if (offset + buffer->len < 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "offset %zd out of range for %zd-byte buffer", offset, buffer->len); @@ -1590,7 +1607,7 @@ Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer, } if ((buffer->len - offset) < self->s_size) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "unpack_from requires a buffer of at least %zu bytes for " "unpacking %zd bytes at offset %zd " "(actual buffer size is %zd)", @@ -1618,15 +1635,18 @@ static void unpackiter_dealloc(unpackiterobject *self) { /* bpo-31095: UnTrack is needed before calling any callbacks */ + PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_XDECREF(self->so); PyBuffer_Release(&self->buf); PyObject_GC_Del(self); + Py_DECREF(tp); } static int unpackiter_traverse(unpackiterobject *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(self->so); Py_VISIT(self->buf.obj); return 0; @@ -1667,35 +1687,28 @@ unpackiter_iternext(unpackiterobject *self) return result; } -static PyTypeObject unpackiter_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "unpack_iterator", /* tp_name */ - sizeof(unpackiterobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)unpackiter_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - 0, /* tp_doc */ - (traverseproc)unpackiter_traverse, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)unpackiter_iternext, /* tp_iternext */ - unpackiter_methods /* tp_methods */ +PyObject *unpackiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { + PyErr_Format(PyExc_TypeError, "Cannot create '%.200s objects", _PyType_Name(type)); + return NULL; +} + +static PyType_Slot unpackiter_type_slots[] = { + {Py_tp_dealloc, unpackiter_dealloc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_traverse, unpackiter_traverse}, + {Py_tp_iter, PyObject_SelfIter}, + {Py_tp_iternext, unpackiter_iternext}, + {Py_tp_methods, unpackiter_methods}, + {Py_tp_new, unpackiter_new}, + {0, 0}, +}; + +static PyType_Spec unpackiter_type_spec = { + "_struct.unpack_iterator", + sizeof(unpackiterobject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + unpackiter_type_slots }; /*[clinic input] @@ -1721,12 +1734,12 @@ Struct_iter_unpack(PyStructObject *self, PyObject *buffer) assert(self->s_codes != NULL); if (self->s_size == 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "cannot iteratively unpack with a struct of length 0"); return NULL; } - iter = (unpackiterobject *) PyType_GenericAlloc(&unpackiter_type, 0); + iter = (unpackiterobject *) PyType_GenericAlloc((PyTypeObject *)_structmodulestate_global->unpackiter_type, 0); if (iter == NULL) return NULL; @@ -1735,7 +1748,7 @@ Struct_iter_unpack(PyStructObject *self, PyObject *buffer) return NULL; } if (iter->buf.len % self->s_size != 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "iterative unpacking requires a buffer of " "a multiple of %zd bytes", self->s_size); @@ -1778,10 +1791,10 @@ s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, char* if (e->format == 's') { Py_ssize_t n; int isstring; - void *p; + const void *p; isstring = PyBytes_Check(v); if (!isstring && !PyByteArray_Check(v)) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument for 's' must be a bytes object"); return -1; } @@ -1800,10 +1813,10 @@ s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, char* } else if (e->format == 'p') { Py_ssize_t n; int isstring; - void *p; + const void *p; isstring = PyBytes_Check(v); if (!isstring && !PyByteArray_Check(v)) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument for 'p' must be a bytes object"); return -1; } @@ -1825,7 +1838,7 @@ s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, char* } else { if (e->pack(res, v, e) < 0) { if (PyLong_Check(v) && PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "int too large to convert"); return -1; } @@ -1849,8 +1862,8 @@ strings."); static PyObject * s_pack(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { + char *buf; PyStructObject *soself; - PyObject *result; /* Validate arguments. */ soself = (PyStructObject *)self; @@ -1858,23 +1871,27 @@ s_pack(PyObject *self, PyObject *const *args, Py_ssize_t nargs) assert(soself->s_codes != NULL); if (nargs != soself->s_len) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "pack expected %zd items for packing (got %zd)", soself->s_len, nargs); return NULL; } - /* Allocate a new buffer */ - result = PyBytes_FromStringAndSize((char *)NULL, soself->s_size); - if (result == NULL) + /* Allocate a new string */ + _PyBytesWriter writer; + _PyBytesWriter_Init(&writer); + buf = _PyBytesWriter_Alloc(&writer, soself->s_size); + if (buf == NULL) { + _PyBytesWriter_Dealloc(&writer); return NULL; + } /* Call the guts */ - if ( s_pack_internal(soself, args, 0, PyBytes_AS_STRING(result)) != 0 ) { - Py_DECREF(result); + if ( s_pack_internal(soself, args, 0, buf) != 0 ) { + _PyBytesWriter_Dealloc(&writer); return NULL; } - return result; + return _PyBytesWriter_Finish(&writer, buf + soself->s_size); } PyDoc_STRVAR(s_pack_into__doc__, @@ -1899,15 +1916,15 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) if (nargs != (soself->s_len + 2)) { if (nargs == 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "pack_into expected buffer argument"); } else if (nargs == 1) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "pack_into expected offset argument"); } else { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "pack_into expected %zd items for packing (got %zd)", soself->s_len, (nargs - 2)); } @@ -1930,7 +1947,7 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) if (offset < 0) { /* Check that negative offset is low enough to fit data */ if (offset + soself->s_size > 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "no space to pack %zd bytes at offset %zd", soself->s_size, offset); @@ -1940,7 +1957,7 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) /* Check that negative offset is not crossing buffer boundary */ if (offset + buffer.len < 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "offset %zd out of range for %zd-byte buffer", offset, buffer.len); @@ -1956,7 +1973,7 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) assert(offset >= 0); assert(soself->s_size >= 0); - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "pack_into requires a buffer of at least %zu bytes for " "packing %zd bytes at offset %zd " "(actual buffer size is %zd)", @@ -2018,6 +2035,11 @@ static struct PyMethodDef s_methods[] = { {NULL, NULL} /* sentinel */ }; +static PyMemberDef s_members[] = { + {"__weaklistoffset__", T_PYSSIZET, offsetof(PyStructObject, weakreflist), READONLY}, + {NULL} /* sentinel */ +}; + #define OFF(x) offsetof(PyStructObject, x) static PyGetSetDef s_getsetlist[] = { @@ -2026,47 +2048,32 @@ static PyGetSetDef s_getsetlist[] = { {NULL} /* sentinel */ }; -static -PyTypeObject PyStructType = { - PyVarObject_HEAD_INIT(NULL, 0) - "Struct", +PyDoc_STRVAR(s__doc__, +"Struct(fmt) --> compiled struct object\n" +"\n" +); + +static PyType_Slot PyStructType_slots[] = { + {Py_tp_dealloc, s_dealloc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_setattro, PyObject_GenericSetAttr}, + {Py_tp_doc, (void*)s__doc__}, + {Py_tp_methods, s_methods}, + {Py_tp_members, s_members}, + {Py_tp_getset, s_getsetlist}, + {Py_tp_init, Struct___init__}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_new, s_new}, + {Py_tp_free, PyObject_Del}, + {0, 0}, +}; + +static PyType_Spec PyStructType_spec = { + "_struct.Struct", sizeof(PyStructObject), 0, - (destructor)s_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Struct___init____doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(PyStructObject, weakreflist), /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - s_methods, /* tp_methods */ - NULL, /* tp_members */ - s_getsetlist, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - Struct___init__, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - s_new, /* tp_new */ - PyObject_Del, /* tp_free */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + PyStructType_slots }; @@ -2102,7 +2109,7 @@ cache_struct_converter(PyObject *fmt, PyStructObject **ptr) return 0; } - s_object = PyObject_CallFunctionObjArgs((PyObject *)(&PyStructType), fmt, NULL); + s_object = PyObject_CallOneArg(_structmodulestate_global->PyStructType, fmt); if (s_object != NULL) { if (PyDict_GET_SIZE(cache) >= MAXCACHE) PyDict_Clear(cache); @@ -2312,16 +2319,46 @@ Whitespace between formats is ignored.\n\ The variable struct.error is an exception raised on errors.\n"); +static int +_structmodule_traverse(PyObject *module, visitproc visit, void *arg) +{ + _structmodulestate *state = (_structmodulestate *)PyModule_GetState(module); + if (state) { + Py_VISIT(state->PyStructType); + Py_VISIT(state->unpackiter_type); + Py_VISIT(state->StructError); + } + return 0; +} + +static int +_structmodule_clear(PyObject *module) +{ + _structmodulestate *state = (_structmodulestate *)PyModule_GetState(module); + if (state) { + Py_CLEAR(state->PyStructType); + Py_CLEAR(state->unpackiter_type); + Py_CLEAR(state->StructError); + } + return 0; +} + +static void +_structmodule_free(void *module) +{ + _structmodule_clear((PyObject *)module); +} + static struct PyModuleDef _structmodule = { PyModuleDef_HEAD_INIT, "_struct", module_doc, - -1, + sizeof(_structmodulestate), module_functions, NULL, - NULL, - NULL, - NULL + _structmodule_traverse, + _structmodule_clear, + _structmodule_free, }; PyMODINIT_FUNC @@ -2333,12 +2370,19 @@ PyInit__struct(void) if (m == NULL) return NULL; - Py_TYPE(&PyStructType) = &PyType_Type; - if (PyType_Ready(&PyStructType) < 0) + PyObject *PyStructType = PyType_FromSpec(&PyStructType_spec); + if (PyStructType == NULL) { return NULL; + } + Py_INCREF(PyStructType); + PyModule_AddObject(m, "Struct", PyStructType); + get_struct_state(m)->PyStructType = PyStructType; - if (PyType_Ready(&unpackiter_type) < 0) + PyObject *unpackiter_type = PyType_FromSpec(&unpackiter_type_spec); + if (unpackiter_type == NULL) { return NULL; + } + get_struct_state(m)->unpackiter_type = unpackiter_type; /* Check endian and swap in faster functions */ { @@ -2383,17 +2427,12 @@ PyInit__struct(void) } /* Add some symbolic constants to the module */ - if (StructError == NULL) { - StructError = PyErr_NewException("struct.error", NULL, NULL); - if (StructError == NULL) - return NULL; - } - + PyObject *StructError = PyErr_NewException("struct.error", NULL, NULL); + if (StructError == NULL) + return NULL; Py_INCREF(StructError); PyModule_AddObject(m, "error", StructError); - - Py_INCREF((PyObject*)&PyStructType); - PyModule_AddObject(m, "Struct", (PyObject*)&PyStructType); + get_struct_state(m)->StructError = StructError; return m; } diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c index d7d3cc8d..d8321768 100644 --- a/Modules/_testbuffer.c +++ b/Modules/_testbuffer.c @@ -24,7 +24,7 @@ static PyObject *simple_format = NULL; /**************************************************************************/ static PyTypeObject NDArray_Type; -#define NDArray_Check(v) (Py_TYPE(v) == &NDArray_Type) +#define NDArray_Check(v) Py_IS_TYPE(v, &NDArray_Type) #define CHECK_LIST_OR_TUPLE(v) \ if (!PyList_Check(v) && !PyTuple_Check(v)) { \ @@ -1854,7 +1854,7 @@ ndarray_subscript(NDArrayObject *self, PyObject *key) type_error: PyErr_Format(PyExc_TypeError, "cannot index memory using \"%.200s\"", - key->ob_type->tp_name); + Py_TYPE(key)->tp_name); err_occurred: Py_DECREF(nd); return NULL; @@ -2050,7 +2050,7 @@ static PyObject * ndarray_get_format(NDArrayObject *self, void *closure) { Py_buffer *base = &self->head->base; - char *fmt = base->format ? base->format : ""; + const char *fmt = base->format ? base->format : ""; return PyUnicode_FromString(fmt); } @@ -2835,11 +2835,11 @@ PyInit__testbuffer(void) if (m == NULL) return NULL; - Py_TYPE(&NDArray_Type) = &PyType_Type; + Py_SET_TYPE(&NDArray_Type, &PyType_Type); Py_INCREF(&NDArray_Type); PyModule_AddObject(m, "ndarray", (PyObject *)&NDArray_Type); - Py_TYPE(&StaticArray_Type) = &PyType_Type; + Py_SET_TYPE(&StaticArray_Type, &PyType_Type); Py_INCREF(&StaticArray_Type); PyModule_AddObject(m, "staticarray", (PyObject *)&StaticArray_Type); diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index af28af50..b2d070cf 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5,18 +5,22 @@ * standard Python regression test, via Lib/test/test_capi.py. */ -/* The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE - define, but we only want to test the public C API, not the internal - C API. */ +/* This module tests the public (Include/ and Include/cpython/) C API. + The internal C API must not be used here: use _testinternalcapi for that. + + The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE + macro defined, but only the public C API must be tested here. */ + #undef Py_BUILD_CORE_MODULE +/* Always enable assertions */ +#undef NDEBUG #define PY_SSIZE_T_CLEAN #include "Python.h" #include "datetime.h" #include "marshal.h" -#include "pythread.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include #include @@ -274,7 +278,7 @@ dict_hassplittable(PyObject *self, PyObject *arg) if (!PyDict_Check(arg)) { PyErr_Format(PyExc_TypeError, "dict_hassplittable() argument must be dict, not '%s'", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return NULL; } @@ -639,7 +643,7 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) int overflow; /* Test that overflow is set properly for a large value. */ - /* num is a number larger than PY_LLONG_MAX on a typical machine. */ + /* num is a number larger than LLONG_MAX on a typical machine. */ num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16); if (num == NULL) return NULL; @@ -655,8 +659,8 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) return raiseTestError("test_long_long_and_overflow", "overflow was not set to 1"); - /* Same again, with num = PY_LLONG_MAX + 1 */ - num = PyLong_FromLongLong(PY_LLONG_MAX); + /* Same again, with num = LLONG_MAX + 1 */ + num = PyLong_FromLongLong(LLONG_MAX); if (num == NULL) return NULL; one = PyLong_FromLong(1L); @@ -683,7 +687,7 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) "overflow was not set to 1"); /* Test that overflow is set properly for a large negative value. */ - /* num is a number smaller than PY_LLONG_MIN on a typical platform */ + /* num is a number smaller than LLONG_MIN on a typical platform */ num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16); if (num == NULL) return NULL; @@ -699,8 +703,8 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) return raiseTestError("test_long_long_and_overflow", "overflow was not set to -1"); - /* Same again, with num = PY_LLONG_MIN - 1 */ - num = PyLong_FromLongLong(PY_LLONG_MIN); + /* Same again, with num = LLONG_MIN - 1 */ + num = PyLong_FromLongLong(LLONG_MIN); if (num == NULL) return NULL; one = PyLong_FromLong(1L); @@ -757,7 +761,7 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) return raiseTestError("test_long_long_and_overflow", "overflow was set incorrectly"); - num = PyLong_FromLongLong(PY_LLONG_MAX); + num = PyLong_FromLongLong(LLONG_MAX); if (num == NULL) return NULL; overflow = 1234; @@ -765,14 +769,14 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) Py_DECREF(num); if (value == -1 && PyErr_Occurred()) return NULL; - if (value != PY_LLONG_MAX) + if (value != LLONG_MAX) return raiseTestError("test_long_long_and_overflow", - "expected return value PY_LLONG_MAX"); + "expected return value LLONG_MAX"); if (overflow != 0) return raiseTestError("test_long_long_and_overflow", "overflow was not cleared"); - num = PyLong_FromLongLong(PY_LLONG_MIN); + num = PyLong_FromLongLong(LLONG_MIN); if (num == NULL) return NULL; overflow = 0; @@ -780,9 +784,9 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) Py_DECREF(num); if (value == -1 && PyErr_Occurred()) return NULL; - if (value != PY_LLONG_MIN) + if (value != LLONG_MIN) return raiseTestError("test_long_long_and_overflow", - "expected return value PY_LLONG_MIN"); + "expected return value LLONG_MIN"); if (overflow != 0) return raiseTestError("test_long_long_and_overflow", "overflow was not cleared"); @@ -1664,6 +1668,10 @@ exit: static volatile int x; +/* Ignore use of deprecated APIs */ +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + /* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case of an error. */ @@ -1840,6 +1848,7 @@ test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored)) Py_RETURN_NONE; } +_Py_COMP_DIAG_POP static PyObject * unicode_aswidechar(PyObject *self, PyObject *args) @@ -1923,6 +1932,48 @@ unicode_asucs4(PyObject *self, PyObject *args) return result; } +static PyObject * +unicode_asutf8(PyObject *self, PyObject *args) +{ + PyObject *unicode; + const char *buffer; + + if (!PyArg_ParseTuple(args, "U", &unicode)) { + return NULL; + } + + buffer = PyUnicode_AsUTF8(unicode); + if (buffer == NULL) { + return NULL; + } + + return PyBytes_FromString(buffer); +} + +static PyObject * +unicode_asutf8andsize(PyObject *self, PyObject *args) +{ + PyObject *unicode, *result; + const char *buffer; + Py_ssize_t utf8_len; + + if(!PyArg_ParseTuple(args, "U", &unicode)) { + return NULL; + } + + buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len); + if (buffer == NULL) { + return NULL; + } + + result = PyBytes_FromString(buffer); + if (result == NULL) { + return NULL; + } + + return Py_BuildValue("(Nn)", result, utf8_len); +} + static PyObject * unicode_findchar(PyObject *self, PyObject *args) { @@ -1973,6 +2024,10 @@ unicode_copycharacters(PyObject *self, PyObject *args) return Py_BuildValue("(Nn)", to_copy, copied); } +/* Ignore use of deprecated APIs */ +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + static PyObject * unicode_encodedecimal(PyObject *self, PyObject *args) { @@ -2040,6 +2095,7 @@ unicode_legacy_string(PyObject *self, PyObject *args) return u; } +_Py_COMP_DIAG_POP static PyObject * getargs_w_star(PyObject *self, PyObject *args) @@ -2589,6 +2645,55 @@ get_datetime_fromtimestamp(PyObject* self, PyObject *args) return rv; } +static PyObject * +test_PyDateTime_GET(PyObject *self, PyObject *obj) +{ + int year, month, day; + + year = PyDateTime_GET_YEAR(obj); + month = PyDateTime_GET_MONTH(obj); + day = PyDateTime_GET_DAY(obj); + + return Py_BuildValue("(lll)", year, month, day); +} + +static PyObject * +test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj) +{ + int hour, minute, second, microsecond; + + hour = PyDateTime_DATE_GET_HOUR(obj); + minute = PyDateTime_DATE_GET_MINUTE(obj); + second = PyDateTime_DATE_GET_SECOND(obj); + microsecond = PyDateTime_DATE_GET_MICROSECOND(obj); + + return Py_BuildValue("(llll)", hour, minute, second, microsecond); +} + +static PyObject * +test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj) +{ + int hour, minute, second, microsecond; + + hour = PyDateTime_TIME_GET_HOUR(obj); + minute = PyDateTime_TIME_GET_MINUTE(obj); + second = PyDateTime_TIME_GET_SECOND(obj); + microsecond = PyDateTime_TIME_GET_MICROSECOND(obj); + + return Py_BuildValue("(llll)", hour, minute, second, microsecond); +} + +static PyObject * +test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj) +{ + int days, seconds, microseconds; + + days = PyDateTime_DELTA_GET_DAYS(obj); + seconds = PyDateTime_DELTA_GET_SECONDS(obj); + microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj); + + return Py_BuildValue("(lll)", days, seconds, microseconds); +} /* test_thread_state spawns a thread of its own, and that thread releases * `thread_done` when it's finished. The driver code has to know when the @@ -2633,12 +2738,10 @@ test_thread_state(PyObject *self, PyObject *args) if (!PyCallable_Check(fn)) { PyErr_Format(PyExc_TypeError, "'%s' object is not callable", - fn->ob_type->tp_name); + Py_TYPE(fn)->tp_name); return NULL; } - /* Ensure Python is set up for threading */ - PyEval_InitThreads(); thread_done = PyThread_allocate_lock(); if (thread_done == NULL) return PyErr_NoMemory(); @@ -3323,6 +3426,26 @@ getbuffer_with_null_view(PyObject* self, PyObject *obj) Py_RETURN_NONE; } +/* PyBuffer_SizeFromFormat() */ +static PyObject * +test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args) +{ + const char *format; + Py_ssize_t result; + + if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat", + &format)) { + return NULL; + } + + result = PyBuffer_SizeFromFormat(format); + if (result == -1) { + return NULL; + } + + return PyLong_FromSsize_t(result); +} + /* Test that the fatal error from not having a current thread doesn't cause an infinite loop. Run via Lib/test/test_capi.py */ static PyObject * @@ -3441,8 +3564,8 @@ slot_tp_del(PyObject *self) PyObject *error_type, *error_value, *error_traceback; /* Temporarily resurrect the object. */ - assert(self->ob_refcnt == 0); - self->ob_refcnt = 1; + assert(Py_REFCNT(self) == 0); + Py_SET_REFCNT(self, 1); /* Save the current exception, if any. */ PyErr_Fetch(&error_type, &error_value, &error_traceback); @@ -3464,31 +3587,26 @@ slot_tp_del(PyObject *self) /* Undo the temporary resurrection; can't use DECREF here, it would * cause a recursive call. */ - assert(self->ob_refcnt > 0); - if (--self->ob_refcnt == 0) - return; /* this is the normal path out */ + assert(Py_REFCNT(self) > 0); + Py_SET_REFCNT(self, Py_REFCNT(self) - 1); + if (Py_REFCNT(self) == 0) { + /* this is the normal path out */ + return; + } /* __del__ resurrected it! Make it look like the original Py_DECREF * never happened. */ { - Py_ssize_t refcnt = self->ob_refcnt; + Py_ssize_t refcnt = Py_REFCNT(self); _Py_NewReference(self); - self->ob_refcnt = refcnt; - } - assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self)); - /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so - * we need to undo that. */ - _Py_DEC_REFTOTAL; - /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object - * chain, so no more to do there. - * If COUNT_ALLOCS, the original decref bumped tp_frees, and - * _Py_NewReference bumped tp_allocs: both of those need to be - * undone. - */ -#ifdef COUNT_ALLOCS - --Py_TYPE(self)->tp_frees; - --Py_TYPE(self)->tp_allocs; + Py_SET_REFCNT(self, refcnt); + } + assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self)); + /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased + _Py_RefTotal, so we need to undo that. */ +#ifdef Py_REF_DEBUG + _Py_RefTotal--; #endif } @@ -4071,8 +4189,6 @@ call_in_temporary_c_thread(PyObject *self, PyObject *callback) test_c_thread_t test_c_thread; long thread; - PyEval_InitThreads(); - test_c_thread.start_event = PyThread_allocate_lock(); test_c_thread.exit_event = PyThread_allocate_lock(); test_c_thread.callback = NULL; @@ -4121,15 +4237,15 @@ static PyObject* pymarshal_write_long_to_file(PyObject* self, PyObject *args) { long value; - char *filename; + PyObject *filename; int version; FILE *fp; - if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file", + if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file", &value, &filename, &version)) return NULL; - fp = fopen(filename, "wb"); + fp = _Py_fopen_obj(filename, "wb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4147,15 +4263,15 @@ static PyObject* pymarshal_write_object_to_file(PyObject* self, PyObject *args) { PyObject *obj; - char *filename; + PyObject *filename; int version; FILE *fp; - if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file", + if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file", &obj, &filename, &version)) return NULL; - fp = fopen(filename, "wb"); + fp = _Py_fopen_obj(filename, "wb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4174,13 +4290,13 @@ pymarshal_read_short_from_file(PyObject* self, PyObject *args) { int value; long pos; - char *filename; + PyObject *filename; FILE *fp; - if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename)) + if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename)) return NULL; - fp = fopen(filename, "rb"); + fp = _Py_fopen_obj(filename, "rb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4199,13 +4315,13 @@ static PyObject* pymarshal_read_long_from_file(PyObject* self, PyObject *args) { long value, pos; - char *filename; + PyObject *filename; FILE *fp; - if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename)) + if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename)) return NULL; - fp = fopen(filename, "rb"); + fp = _Py_fopen_obj(filename, "rb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4225,13 +4341,13 @@ pymarshal_read_last_object_from_file(PyObject* self, PyObject *args) { PyObject *obj; long pos; - char *filename; + PyObject *filename; FILE *fp; - if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename)) + if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename)) return NULL; - fp = fopen(filename, "rb"); + fp = _Py_fopen_obj(filename, "rb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4249,13 +4365,13 @@ pymarshal_read_object_from_file(PyObject* self, PyObject *args) { PyObject *obj; long pos; - char *filename; + PyObject *filename; FILE *fp; - if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename)) + if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename)) return NULL; - fp = fopen(filename, "rb"); + fp = _Py_fopen_obj(filename, "rb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4423,15 +4539,6 @@ test_PyTime_AsMicroseconds(PyObject *self, PyObject *args) return _PyTime_AsNanosecondsObject(ms); } -static PyObject* -get_recursion_depth(PyObject *self, PyObject *args) -{ - PyThreadState *tstate = PyThreadState_Get(); - - /* subtract one to ignore the frame of the get_recursion_depth() call */ - return PyLong_FromLong(tstate->recursion_depth - 1); -} - static PyObject* pymem_buffer_overflow(PyObject *self, PyObject *args) { @@ -4518,7 +4625,7 @@ check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) return NULL; } /* Initialize reference count to avoid early crash in ceval or GC */ - Py_REFCNT(op) = 1; + Py_SET_REFCNT(op, 1); /* object fields like ob_type are uninitialized! */ return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op); } @@ -4533,7 +4640,7 @@ check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args return NULL; } /* Initialize reference count to avoid early crash in ceval or GC */ - Py_REFCNT(op) = 1; + Py_SET_REFCNT(op, 1); /* ob_type field is after the memory block: part of "forbidden bytes" when using debug hooks on memory allocators! */ return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op); @@ -4549,7 +4656,7 @@ check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) } Py_TYPE(op)->tp_dealloc(op); /* Reset reference count to avoid early crash in ceval or GC */ - Py_REFCNT(op) = 1; + Py_SET_REFCNT(op, 1); /* object memory is freed! */ return test_pyobject_is_freed("check_pyobject_freed_is_freed", op); } @@ -4654,8 +4761,8 @@ dict_get_version(PyObject *self, PyObject *args) version = dict->ma_version_tag; - Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version)); - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version); + Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version)); + return PyLong_FromUnsignedLongLong((unsigned long long)version); } @@ -4742,7 +4849,7 @@ test_pyobject_fastcalldict(PyObject *self, PyObject *args) return NULL; } - return _PyObject_FastCallDict(func, stack, nargs, kwargs); + return PyObject_VectorcallDict(func, stack, nargs, kwargs); } @@ -4776,7 +4883,7 @@ test_pyobject_vectorcall(PyObject *self, PyObject *args) PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple"); return NULL; } - return _PyObject_Vectorcall(func, stack, nargs, kwnames); + return PyObject_Vectorcall(func, stack, nargs, kwnames); } @@ -4919,7 +5026,7 @@ bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return NULL; } - PyObject *res = PyObject_CallObject(cls, NULL); + PyObject *res = _PyObject_CallNoArg(cls); if (res == NULL) { return NULL; } @@ -5031,7 +5138,7 @@ negative_refcount(PyObject *self, PyObject *Py_UNUSED(args)) } assert(Py_REFCNT(obj) == 1); - Py_REFCNT(obj) = 0; + Py_SET_REFCNT(obj, 0); /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */ Py_DECREF(obj); @@ -5065,6 +5172,96 @@ test_write_unraisable_exc(PyObject *self, PyObject *args) } +static PyObject * +sequence_getitem(PyObject *self, PyObject *args) +{ + PyObject *seq; + Py_ssize_t i; + if (!PyArg_ParseTuple(args, "On", &seq, &i)) { + return NULL; + } + return PySequence_GetItem(seq, i); +} + + +/* Functions for testing C calling conventions (METH_*) are named meth_*, + * e.g. "meth_varargs" for METH_VARARGS. + * + * They all return a tuple of their C-level arguments, with None instead + * of NULL and Python tuples instead of C arrays. + */ + + +static PyObject* +_null_to_none(PyObject* obj) +{ + if (obj == NULL) { + Py_RETURN_NONE; + } + Py_INCREF(obj); + return obj; +} + +static PyObject* +meth_varargs(PyObject* self, PyObject* args) +{ + return Py_BuildValue("NO", _null_to_none(self), args); +} + +static PyObject* +meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs) +{ + return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs)); +} + +static PyObject* +meth_o(PyObject* self, PyObject* obj) +{ + return Py_BuildValue("NO", _null_to_none(self), obj); +} + +static PyObject* +meth_noargs(PyObject* self, PyObject* ignored) +{ + return _null_to_none(self); +} + +static PyObject* +_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs) +{ + PyObject *tuple = PyTuple_New(nargs); + if (tuple == NULL) { + return NULL; + } + for (Py_ssize_t i=0; i < nargs; i++) { + Py_INCREF(args[i]); + PyTuple_SET_ITEM(tuple, i, args[i]); + } + return tuple; +} + +static PyObject* +meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs) +{ + return Py_BuildValue( + "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs) + ); +} + +static PyObject* +meth_fastcall_keywords(PyObject* self, PyObject* const* args, + Py_ssize_t nargs, PyObject* kwargs) +{ + PyObject *pyargs = _fastcall_to_tuple(args, nargs); + if (pyargs == NULL) { + return NULL; + } + PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type, + args + nargs, 0, kwargs); + return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs); +} + + static PyObject* pynumber_tobase(PyObject *module, PyObject *args) { @@ -5103,6 +5300,10 @@ static PyMethodDef TestMethods[] = { {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS}, {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS}, {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS}, + {"PyDateTime_GET", test_PyDateTime_GET, METH_O}, + {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O}, + {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O}, + {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O}, {"test_list_api", test_list_api, METH_NOARGS}, {"test_dict_iteration", test_dict_iteration, METH_NOARGS}, {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS}, @@ -5138,6 +5339,7 @@ static PyMethodDef TestMethods[] = { {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS}, #endif {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O}, + {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS}, {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS}, {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS}, {"get_args", get_args, METH_VARARGS}, @@ -5202,6 +5404,8 @@ static PyMethodDef TestMethods[] = { {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS}, {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS}, {"unicode_asucs4", unicode_asucs4, METH_VARARGS}, + {"unicode_asutf8", unicode_asutf8, METH_VARARGS}, + {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS}, {"unicode_findchar", unicode_findchar, METH_VARARGS}, {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS}, {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS}, @@ -5289,7 +5493,6 @@ static PyMethodDef TestMethods[] = { #endif {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS}, {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS}, - {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS}, {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS}, {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS}, @@ -5324,6 +5527,13 @@ static PyMethodDef TestMethods[] = { {"negative_refcount", negative_refcount, METH_NOARGS}, #endif {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS}, + {"sequence_getitem", sequence_getitem, METH_VARARGS}, + {"meth_varargs", meth_varargs, METH_VARARGS}, + {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS}, + {"meth_o", meth_o, METH_O}, + {"meth_noargs", meth_noargs, METH_NOARGS}, + {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL}, + {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS}, {"pynumber_tobase", pynumber_tobase, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; @@ -5943,7 +6153,7 @@ static PyTypeObject MethodDescriptorBase_Type = { .tp_call = PyVectorcall_Call, .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall), .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_METHOD_DESCRIPTOR | _Py_TPFLAGS_HAVE_VECTORCALL, + Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL, .tp_descr_get = func_descr_get, }; @@ -5982,7 +6192,7 @@ static PyTypeObject MethodDescriptor2_Type = { .tp_new = MethodDescriptor2_new, .tp_call = PyVectorcall_Call, .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall), - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | _Py_TPFLAGS_HAVE_VECTORCALL, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL, }; PyDoc_STRVAR(heapgctype__doc__, @@ -6100,6 +6310,47 @@ static PyType_Spec HeapCTypeSubclass_spec = { HeapCTypeSubclass_slots }; +PyDoc_STRVAR(heapctypewithbuffer__doc__, +"Heap type with buffer support.\n\n" +"The buffer is set to [b'1', b'2', b'3', b'4']"); + +typedef struct { + HeapCTypeObject base; + char buffer[4]; +} HeapCTypeWithBufferObject; + +static int +heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags) +{ + self->buffer[0] = '1'; + self->buffer[1] = '2'; + self->buffer[2] = '3'; + self->buffer[3] = '4'; + return PyBuffer_FillInfo( + view, (PyObject*)self, (void *)self->buffer, 4, 1, flags); +} + +static void +heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view) +{ + assert(view->obj == (void*) self); +} + +static PyType_Slot HeapCTypeWithBuffer_slots[] = { + {Py_bf_getbuffer, heapctypewithbuffer_getbuffer}, + {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer}, + {Py_tp_doc, (char*)heapctypewithbuffer__doc__}, + {0, 0}, +}; + +static PyType_Spec HeapCTypeWithBuffer_spec = { + "_testcapi.HeapCTypeWithBuffer", + sizeof(HeapCTypeWithBufferObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + HeapCTypeWithBuffer_slots +}; + PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__, "Subclass of HeapCType with a finalizer that reassigns __class__.\n\n" "__class__ is set to plain HeapCTypeSubclass during finalization.\n" @@ -6177,6 +6428,106 @@ static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = { HeapCTypeSubclassWithFinalizer_slots }; +typedef struct { + PyObject_HEAD + PyObject *dict; +} HeapCTypeWithDictObject; + +static void +heapctypewithdict_dealloc(HeapCTypeWithDictObject* self) +{ + + PyTypeObject *tp = Py_TYPE(self); + Py_XDECREF(self->dict); + PyObject_DEL(self); + Py_DECREF(tp); +} + +static PyGetSetDef heapctypewithdict_getsetlist[] = { + {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict}, + {NULL} /* Sentinel */ +}; + +static struct PyMemberDef heapctypewithdict_members[] = { + {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)}, + {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY}, + {NULL} /* Sentinel */ +}; + +static PyType_Slot HeapCTypeWithDict_slots[] = { + {Py_tp_members, heapctypewithdict_members}, + {Py_tp_getset, heapctypewithdict_getsetlist}, + {Py_tp_dealloc, heapctypewithdict_dealloc}, + {0, 0}, +}; + +static PyType_Spec HeapCTypeWithDict_spec = { + "_testcapi.HeapCTypeWithDict", + sizeof(HeapCTypeWithDictObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + HeapCTypeWithDict_slots +}; + +static struct PyMemberDef heapctypewithnegativedict_members[] = { + {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)}, + {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY}, + {NULL} /* Sentinel */ +}; + +static PyType_Slot HeapCTypeWithNegativeDict_slots[] = { + {Py_tp_members, heapctypewithnegativedict_members}, + {Py_tp_getset, heapctypewithdict_getsetlist}, + {Py_tp_dealloc, heapctypewithdict_dealloc}, + {0, 0}, +}; + +static PyType_Spec HeapCTypeWithNegativeDict_spec = { + "_testcapi.HeapCTypeWithNegativeDict", + sizeof(HeapCTypeWithDictObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + HeapCTypeWithNegativeDict_slots +}; + +typedef struct { + PyObject_HEAD + PyObject *weakreflist; +} HeapCTypeWithWeakrefObject; + +static struct PyMemberDef heapctypewithweakref_members[] = { + {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)}, + {"__weaklistoffset__", T_PYSSIZET, + offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY}, + {NULL} /* Sentinel */ +}; + +static void +heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self) +{ + + PyTypeObject *tp = Py_TYPE(self); + if (self->weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject *) self); + Py_XDECREF(self->weakreflist); + PyObject_DEL(self); + Py_DECREF(tp); +} + +static PyType_Slot HeapCTypeWithWeakref_slots[] = { + {Py_tp_members, heapctypewithweakref_members}, + {Py_tp_dealloc, heapctypewithweakref_dealloc}, + {0, 0}, +}; + +static PyType_Spec HeapCTypeWithWeakref_spec = { + "_testcapi.HeapCTypeWithWeakref", + sizeof(HeapCTypeWithWeakrefObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + HeapCTypeWithWeakref_slots +}; + PyDoc_STRVAR(heapctypesetattr__doc__, "A heap type without GC, but with overridden __setattr__.\n\n" "The 'value' attribute is set to 10 in __init__ and updated via attribute setting."); @@ -6251,6 +6602,120 @@ static PyType_Spec HeapCTypeSetattr_spec = { HeapCTypeSetattr_slots }; +static PyMethodDef meth_instance_methods[] = { + {"meth_varargs", meth_varargs, METH_VARARGS}, + {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS}, + {"meth_o", meth_o, METH_O}, + {"meth_noargs", meth_noargs, METH_NOARGS}, + {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL}, + {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS}, + {NULL, NULL} /* sentinel */ +}; + + +static PyTypeObject MethInstance_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "MethInstance", + sizeof(PyObject), + .tp_new = PyType_GenericNew, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = meth_instance_methods, + .tp_doc = (char*)PyDoc_STR( + "Class with normal (instance) methods to test calling conventions"), +}; + +static PyMethodDef meth_class_methods[] = { + {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS}, + {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS}, + {"meth_o", meth_o, METH_O|METH_CLASS}, + {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS}, + {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS}, + {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS}, + {NULL, NULL} /* sentinel */ +}; + + +static PyTypeObject MethClass_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "MethClass", + sizeof(PyObject), + .tp_new = PyType_GenericNew, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = meth_class_methods, + .tp_doc = PyDoc_STR( + "Class with class methods to test calling conventions"), +}; + +static PyMethodDef meth_static_methods[] = { + {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC}, + {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC}, + {"meth_o", meth_o, METH_O|METH_STATIC}, + {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC}, + {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC}, + {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC}, + {NULL, NULL} /* sentinel */ +}; + + +static PyTypeObject MethStatic_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "MethStatic", + sizeof(PyObject), + .tp_new = PyType_GenericNew, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = meth_static_methods, + .tp_doc = PyDoc_STR( + "Class with static methods to test calling conventions"), +}; + +/* ContainerNoGC -- a simple container without GC methods */ + +typedef struct { + PyObject_HEAD + PyObject *value; +} ContainerNoGCobject; + +static PyObject * +ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyObject *value; + char *names[] = {"value", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) { + return NULL; + } + PyObject *self = type->tp_alloc(type, 0); + if (self == NULL) { + return NULL; + } + Py_INCREF(value); + ((ContainerNoGCobject *)self)->value = value; + return self; +} + +static void +ContainerNoGC_dealloc(ContainerNoGCobject *self) +{ + Py_DECREF(self->value); + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyMemberDef ContainerNoGC_members[] = { + {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY, + PyDoc_STR("a container value for test purposes")}, + {0} +}; + +static PyTypeObject ContainerNoGC_type = { + PyVarObject_HEAD_INIT(NULL, 0) + "_testcapi.ContainerNoGC", + sizeof(ContainerNoGCobject), + .tp_dealloc = (destructor)ContainerNoGC_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .tp_members = ContainerNoGC_members, + .tp_new = ContainerNoGC_new, +}; + + static struct PyModuleDef _testcapimodule = { PyModuleDef_HEAD_INIT, "_testcapi", @@ -6275,9 +6740,9 @@ PyInit__testcapi(void) if (m == NULL) return NULL; - Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type; + Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type); - Py_TYPE(&test_structmembersType)=&PyType_Type; + Py_SET_TYPE(&test_structmembersType, &PyType_Type); Py_INCREF(&test_structmembersType); /* don't use a name starting with "test", since we don't want test_capi to automatically call this */ @@ -6303,10 +6768,6 @@ PyInit__testcapi(void) Py_INCREF(&MyList_Type); PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type); - /* bpo-37250: old Cython code sets tp_print to 0, we check that - * this doesn't break anything. */ - MyList_Type.tp_print = 0; - if (PyType_Ready(&MethodDescriptorBase_Type) < 0) return NULL; Py_INCREF(&MethodDescriptorBase_Type); @@ -6340,6 +6801,21 @@ PyInit__testcapi(void) Py_INCREF(&Generic_Type); PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type); + if (PyType_Ready(&MethInstance_Type) < 0) + return NULL; + Py_INCREF(&MethInstance_Type); + PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type); + + if (PyType_Ready(&MethClass_Type) < 0) + return NULL; + Py_INCREF(&MethClass_Type); + PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type); + + if (PyType_Ready(&MethStatic_Type) < 0) + return NULL; + Py_INCREF(&MethStatic_Type); + PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type); + PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception; if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) { return NULL; @@ -6364,12 +6840,11 @@ PyInit__testcapi(void) PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN)); PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX)); PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN)); - PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX)); - PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN)); - PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX)); + PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX)); + PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN)); + PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX)); PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX)); PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN)); - PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head))); PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t))); Py_INCREF(&PyInstanceMethod_Type); PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type); @@ -6409,6 +6884,30 @@ PyInit__testcapi(void) Py_DECREF(subclass_bases); PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass); + PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec); + if (HeapCTypeWithDict == NULL) { + return NULL; + } + PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict); + + PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec); + if (HeapCTypeWithNegativeDict == NULL) { + return NULL; + } + PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict); + + PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec); + if (HeapCTypeWithWeakref == NULL) { + return NULL; + } + PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref); + + PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec); + if (HeapCTypeWithBuffer == NULL) { + return NULL; + } + PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer); + PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec); if (HeapCTypeSetattr == NULL) { return NULL; @@ -6427,6 +6926,14 @@ PyInit__testcapi(void) Py_DECREF(subclass_with_finalizer_bases); PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer); + if (PyType_Ready(&ContainerNoGC_type) < 0) { + return NULL; + } + Py_INCREF(&ContainerNoGC_type); + if (PyModule_AddObject(m, "ContainerNoGC", + (PyObject *) &ContainerNoGC_type) < 0) + return NULL; + PyState_AddModule(m, &_testcapimodule); return m; } diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 3a931cae..4445d2e5 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -6,10 +6,16 @@ # error "Py_BUILD_CORE_BUILTIN or Py_BUILD_CORE_MODULE must be defined" #endif +/* Always enable assertions */ +#undef NDEBUG + #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_initconfig.h" +#include "pycore_byteswap.h" // _Py_bswap32() +#include "pycore_initconfig.h" // _Py_GetConfigsAsDict() +#include "pycore_hashtable.h" // _Py_hashtable_new() +#include "pycore_gc.h" // PyGC_Head #ifdef MS_WINDOWS @@ -62,8 +68,139 @@ get_configs(PyObject *self, PyObject *Py_UNUSED(args)) } +static PyObject* +get_recursion_depth(PyObject *self, PyObject *Py_UNUSED(args)) +{ + PyThreadState *tstate = PyThreadState_Get(); + + /* subtract one to ignore the frame of the get_recursion_depth() call */ + return PyLong_FromLong(tstate->recursion_depth - 1); +} + + +static PyObject* +test_bswap(PyObject *self, PyObject *Py_UNUSED(args)) +{ + uint16_t u16 = _Py_bswap16(UINT16_C(0x3412)); + if (u16 != UINT16_C(0x1234)) { + PyErr_Format(PyExc_AssertionError, + "_Py_bswap16(0x3412) returns %u", u16); + return NULL; + } + + uint32_t u32 = _Py_bswap32(UINT32_C(0x78563412)); + if (u32 != UINT32_C(0x12345678)) { + PyErr_Format(PyExc_AssertionError, + "_Py_bswap32(0x78563412) returns %lu", u32); + return NULL; + } + + uint64_t u64 = _Py_bswap64(UINT64_C(0xEFCDAB9078563412)); + if (u64 != UINT64_C(0x1234567890ABCDEF)) { + PyErr_Format(PyExc_AssertionError, + "_Py_bswap64(0xEFCDAB9078563412) returns %llu", u64); + return NULL; + } + + Py_RETURN_NONE; +} + + +#define TO_PTR(ch) ((void*)(uintptr_t)ch) +#define FROM_PTR(ptr) ((uintptr_t)ptr) +#define VALUE(key) (1 + ((int)(key) - 'a')) + +static Py_uhash_t +hash_char(const void *key) +{ + char ch = (char)FROM_PTR(key); + return ch; +} + + +static int +hashtable_cb(_Py_hashtable_t *table, + const void *key_ptr, const void *value_ptr, + void *user_data) +{ + int *count = (int *)user_data; + char key = (char)FROM_PTR(key_ptr); + int value = (int)FROM_PTR(value_ptr); + assert(value == VALUE(key)); + *count += 1; + return 0; +} + + +static PyObject* +test_hashtable(PyObject *self, PyObject *Py_UNUSED(args)) +{ + _Py_hashtable_t *table = _Py_hashtable_new(hash_char, + _Py_hashtable_compare_direct); + if (table == NULL) { + return PyErr_NoMemory(); + } + + // Using an newly allocated table must not crash + assert(table->nentries == 0); + assert(table->nbuckets > 0); + assert(_Py_hashtable_get(table, TO_PTR('x')) == NULL); + + // Test _Py_hashtable_set() + char key; + for (key='a'; key <= 'z'; key++) { + int value = VALUE(key); + if (_Py_hashtable_set(table, TO_PTR(key), TO_PTR(value)) < 0) { + _Py_hashtable_destroy(table); + return PyErr_NoMemory(); + } + } + assert(table->nentries == 26); + assert(table->nbuckets > table->nentries); + + // Test _Py_hashtable_get_entry() + for (key='a'; key <= 'z'; key++) { + _Py_hashtable_entry_t *entry = _Py_hashtable_get_entry(table, TO_PTR(key)); + assert(entry != NULL); + assert(entry->key == TO_PTR(key)); + assert(entry->value == TO_PTR(VALUE(key))); + } + + // Test _Py_hashtable_get() + for (key='a'; key <= 'z'; key++) { + void *value_ptr = _Py_hashtable_get(table, TO_PTR(key)); + assert((int)FROM_PTR(value_ptr) == VALUE(key)); + } + + // Test _Py_hashtable_steal() + key = 'p'; + void *value_ptr = _Py_hashtable_steal(table, TO_PTR(key)); + assert((int)FROM_PTR(value_ptr) == VALUE(key)); + assert(table->nentries == 25); + assert(_Py_hashtable_get_entry(table, TO_PTR(key)) == NULL); + + // Test _Py_hashtable_foreach() + int count = 0; + int res = _Py_hashtable_foreach(table, hashtable_cb, &count); + assert(res == 0); + assert(count == 25); + + // Test _Py_hashtable_clear() + _Py_hashtable_clear(table); + assert(table->nentries == 0); + assert(table->nbuckets > 0); + assert(_Py_hashtable_get(table, TO_PTR('x')) == NULL); + + _Py_hashtable_destroy(table); + Py_RETURN_NONE; +} + + static PyMethodDef TestMethods[] = { {"get_configs", get_configs, METH_NOARGS}, + {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, + {"test_bswap", test_bswap, METH_NOARGS}, + {"test_hashtable", test_hashtable, METH_NOARGS}, {NULL, NULL} /* sentinel */ }; @@ -84,5 +221,19 @@ static struct PyModuleDef _testcapimodule = { PyMODINIT_FUNC PyInit__testinternalcapi(void) { - return PyModule_Create(&_testcapimodule); + PyObject *module = PyModule_Create(&_testcapimodule); + if (module == NULL) { + return NULL; + } + + if (PyModule_AddObject(module, "SIZEOF_PYGC_HEAD", + PyLong_FromSsize_t(sizeof(PyGC_Head))) < 0) { + goto error; + } + + return module; + +error: + Py_DECREF(module); + return NULL; } diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c index 4933abba..d69ae628 100644 --- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -4,6 +4,19 @@ #include "Python.h" +/* State for testing module state access from methods */ + +typedef struct { + int counter; +} meth_state; + +/*[clinic input] +module _testmultiphase + +class _testmultiphase.StateAccessType "StateAccessTypeObject *" "!StateAccessType" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=bab9f2fe3bd312ff]*/ + /* Example objects */ typedef struct { PyObject_HEAD @@ -14,6 +27,10 @@ typedef struct { PyObject *integer; } testmultiphase_state; +typedef struct { + PyObject_HEAD +} StateAccessTypeObject; + /* Example methods */ static int @@ -42,6 +59,7 @@ Example_demo(ExampleObject *self, PyObject *args) Py_RETURN_NONE; } +#include "clinic/_testmultiphase.c.h" static PyMethodDef Example_methods[] = { {"demo", (PyCFunction)Example_demo, METH_VARARGS, @@ -102,6 +120,150 @@ static PyType_Spec Example_Type_spec = { Example_Type_slots }; + +/*[clinic input] +_testmultiphase.StateAccessType.get_defining_module + + cls: defining_class + +Return the module of the defining class. +[clinic start generated code]*/ + +static PyObject * +_testmultiphase_StateAccessType_get_defining_module_impl(StateAccessTypeObject *self, + PyTypeObject *cls) +/*[clinic end generated code: output=ba2a14284a5d0921 input=946149f91cf72c0d]*/ +{ + PyObject *retval; + retval = PyType_GetModule(cls); + if (retval == NULL) { + return NULL; + } + Py_INCREF(retval); + return retval; +} + +/*[clinic input] +_testmultiphase.StateAccessType.increment_count_clinic + + cls: defining_class + / + n: int = 1 + * + twice: bool = False + +Add 'n' from the module-state counter. + +Pass 'twice' to double that amount. + +This tests Argument Clinic support for defining_class. +[clinic start generated code]*/ + +static PyObject * +_testmultiphase_StateAccessType_increment_count_clinic_impl(StateAccessTypeObject *self, + PyTypeObject *cls, + int n, int twice) +/*[clinic end generated code: output=3b34f86bc5473204 input=551d482e1fe0b8f5]*/ +{ + meth_state *m_state = PyType_GetModuleState(cls); + if (twice) { + n *= 2; + } + m_state->counter += n; + + Py_RETURN_NONE; +} + +PyDoc_STRVAR(_StateAccessType_decrement_count__doc__, +"decrement_count($self, /, n=1, *, twice=None)\n" +"--\n" +"\n" +"Add 'n' from the module-state counter.\n" +"Pass 'twice' to double that amount.\n" +"(This is to test both positional and keyword arguments."); + +// Intentionally does not use Argument Clinic +static PyObject * +_StateAccessType_increment_count_noclinic(StateAccessTypeObject *self, + PyTypeObject *defining_class, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames) +{ + if (!_PyArg_CheckPositional("StateAccessTypeObject.decrement_count", nargs, 0, 1)) { + return NULL; + } + long n = 1; + if (nargs) { + n = PyLong_AsLong(args[0]); + if (PyErr_Occurred()) { + return NULL; + } + } + if (kwnames && PyTuple_Check(kwnames)) { + if (PyTuple_GET_SIZE(kwnames) > 1 || + PyUnicode_CompareWithASCIIString( + PyTuple_GET_ITEM(kwnames, 0), + "twice" + )) { + PyErr_SetString( + PyExc_TypeError, + "decrement_count only takes 'twice' keyword argument" + ); + return NULL; + } + n *= 2; + } + meth_state *m_state = PyType_GetModuleState(defining_class); + m_state->counter += n; + + Py_RETURN_NONE; +} + +/*[clinic input] +_testmultiphase.StateAccessType.get_count + + cls: defining_class + +Return the value of the module-state counter. +[clinic start generated code]*/ + +static PyObject * +_testmultiphase_StateAccessType_get_count_impl(StateAccessTypeObject *self, + PyTypeObject *cls) +/*[clinic end generated code: output=64600f95b499a319 input=d5d181f12384849f]*/ +{ + meth_state *m_state = PyType_GetModuleState(cls); + return PyLong_FromLong(m_state->counter); +} + +static PyMethodDef StateAccessType_methods[] = { + _TESTMULTIPHASE_STATEACCESSTYPE_GET_DEFINING_MODULE_METHODDEF + _TESTMULTIPHASE_STATEACCESSTYPE_GET_COUNT_METHODDEF + _TESTMULTIPHASE_STATEACCESSTYPE_INCREMENT_COUNT_CLINIC_METHODDEF + { + "increment_count_noclinic", + (PyCFunction)(void(*)(void))_StateAccessType_increment_count_noclinic, + METH_METHOD|METH_FASTCALL|METH_KEYWORDS, + _StateAccessType_decrement_count__doc__ + }, + {NULL, NULL} /* sentinel */ +}; + +static PyType_Slot StateAccessType_Type_slots[] = { + {Py_tp_doc, "Type for testing per-module state access from methods."}, + {Py_tp_methods, StateAccessType_methods}, + {0, NULL} +}; + +static PyType_Spec StateAccessType_spec = { + "_testimportexec.StateAccessType", + sizeof(StateAccessTypeObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE | Py_TPFLAGS_BASETYPE, + StateAccessType_Type_slots +}; + /* Function of two integers returning integer */ PyDoc_STRVAR(testexport_foo_doc, @@ -193,30 +355,39 @@ static int execfunc(PyObject *m) /* Add a custom type */ temp = PyType_FromSpec(&Example_Type_spec); - if (temp == NULL) + if (temp == NULL) { goto fail; - if (PyModule_AddObject(m, "Example", temp) != 0) + } + if (PyModule_AddObject(m, "Example", temp) != 0) { goto fail; + } + /* Add an exception type */ temp = PyErr_NewException("_testimportexec.error", NULL, NULL); - if (temp == NULL) + if (temp == NULL) { goto fail; - if (PyModule_AddObject(m, "error", temp) != 0) + } + if (PyModule_AddObject(m, "error", temp) != 0) { goto fail; + } /* Add Str */ temp = PyType_FromSpec(&Str_Type_spec); - if (temp == NULL) + if (temp == NULL) { goto fail; - if (PyModule_AddObject(m, "Str", temp) != 0) + } + if (PyModule_AddObject(m, "Str", temp) != 0) { goto fail; + } - if (PyModule_AddIntConstant(m, "int_const", 1969) != 0) + if (PyModule_AddIntConstant(m, "int_const", 1969) != 0) { goto fail; + } - if (PyModule_AddStringConstant(m, "str_const", "something different") != 0) + if (PyModule_AddStringConstant(m, "str_const", "something different") != 0) { goto fail; + } return 0; fail: @@ -225,20 +396,18 @@ static int execfunc(PyObject *m) /* Helper for module definitions; there'll be a lot of them */ -#define TEST_MODULE_DEF_EX(name, slots, methods, statesize, traversefunc) { \ +#define TEST_MODULE_DEF(name, slots, methods) { \ PyModuleDef_HEAD_INIT, /* m_base */ \ name, /* m_name */ \ PyDoc_STR("Test module " name), /* m_doc */ \ - statesize, /* m_size */ \ + 0, /* m_size */ \ methods, /* m_methods */ \ slots, /* m_slots */ \ - traversefunc, /* m_traverse */ \ + NULL, /* m_traverse */ \ NULL, /* m_clear */ \ NULL, /* m_free */ \ } -#define TEST_MODULE_DEF(name, slots, methods) TEST_MODULE_DEF_EX(name, slots, methods, 0, NULL) - static PyModuleDef_Slot main_slots[] = { {Py_mod_exec, execfunc}, {0, NULL}, @@ -623,51 +792,49 @@ PyInit__testmultiphase_exec_unreported_exception(PyObject *spec) } static int -bad_traverse(PyObject *self, visitproc visit, void *arg) { - testmultiphase_state *m_state; - - m_state = PyModule_GetState(self); - - /* The following assertion mimics any traversal function that doesn't correctly handle - * the case during module creation where the module state hasn't been created yet. - * - * The check that it is used to test only runs in debug mode, so it is OK that the - * assert() will get compiled out in fully optimised release builds. - */ - assert(m_state != NULL); - Py_VISIT(m_state->integer); - return 0; -} - -static int -execfunc_with_bad_traverse(PyObject *mod) { - testmultiphase_state *m_state; +meth_state_access_exec(PyObject *m) +{ + PyObject *temp; + meth_state *m_state; - m_state = PyModule_GetState(mod); + m_state = PyModule_GetState(m); if (m_state == NULL) { return -1; } - m_state->integer = PyLong_FromLong(0x7fffffff); - Py_INCREF(m_state->integer); + temp = PyType_FromModuleAndSpec(m, &StateAccessType_spec, NULL); + if (temp == NULL) { + return -1; + } + if (PyModule_AddObject(m, "StateAccessType", temp) != 0) { + return -1; + } + return 0; } -static PyModuleDef_Slot slots_with_bad_traverse[] = { - {Py_mod_exec, execfunc_with_bad_traverse}, +static PyModuleDef_Slot meth_state_access_slots[] = { + {Py_mod_exec, meth_state_access_exec}, {0, NULL} }; -static PyModuleDef def_with_bad_traverse = TEST_MODULE_DEF_EX( - "_testmultiphase_with_bad_traverse", slots_with_bad_traverse, NULL, - sizeof(testmultiphase_state), bad_traverse); +static PyModuleDef def_meth_state_access = { + PyModuleDef_HEAD_INIT, + .m_name = "_testmultiphase_meth_state_access", + .m_doc = PyDoc_STR("Module testing access" + " to state from methods."), + .m_size = sizeof(meth_state), + .m_slots = meth_state_access_slots, +}; PyMODINIT_FUNC -PyInit__testmultiphase_with_bad_traverse(PyObject *spec) { - return PyModuleDef_Init(&def_with_bad_traverse); +PyInit__testmultiphase_meth_state_access(PyObject *spec) +{ + return PyModuleDef_Init(&def_meth_state_access); } + /*** Helper for imp test ***/ static PyModuleDef imp_dummy_def = TEST_MODULE_DEF("imp_dummy", main_slots, testexport_methods); diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index fadf57aa..77baba48 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -4,9 +4,9 @@ #include "Python.h" #include "pycore_pylifecycle.h" -#include "pycore_pystate.h" -#include "structmember.h" /* offsetof */ -#include "pythread.h" +#include "pycore_interp.h" // _PyInterpreterState.num_threads +#include "pycore_pystate.h" // _PyThreadState_Init() +#include // offsetof() static PyObject *ThreadError; static PyObject *str_dict; @@ -205,6 +205,22 @@ lock_repr(lockobject *self) self->locked ? "locked" : "unlocked", Py_TYPE(self)->tp_name, self); } +#ifdef HAVE_FORK +static PyObject * +lock__at_fork_reinit(lockobject *self, PyObject *Py_UNUSED(args)) +{ + if (_PyThread_at_fork_reinit(&self->lock_lock) < 0) { + PyErr_SetString(ThreadError, "failed to reinitialize lock at fork"); + return NULL; + } + + self->locked = 0; + + Py_RETURN_NONE; +} +#endif /* HAVE_FORK */ + + static PyMethodDef lock_methods[] = { {"acquire_lock", (PyCFunction)(void(*)(void))lock_PyThread_acquire_lock, METH_VARARGS | METH_KEYWORDS, acquire_doc}, @@ -222,6 +238,10 @@ static PyMethodDef lock_methods[] = { METH_VARARGS | METH_KEYWORDS, acquire_doc}, {"__exit__", (PyCFunction)lock_PyThread_release_lock, METH_VARARGS, release_doc}, +#ifdef HAVE_FORK + {"_at_fork_reinit", (PyCFunction)lock__at_fork_reinit, + METH_NOARGS, NULL}, +#endif {NULL, NULL} /* sentinel */ }; @@ -438,22 +458,20 @@ For internal use by `threading.Condition`."); static PyObject * rlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - rlockobject *self; - - self = (rlockobject *) type->tp_alloc(type, 0); - if (self != NULL) { - self->in_weakreflist = NULL; - self->rlock_owner = 0; - self->rlock_count = 0; - - self->rlock_lock = PyThread_allocate_lock(); - if (self->rlock_lock == NULL) { - Py_DECREF(self); - PyErr_SetString(ThreadError, "can't allocate lock"); - return NULL; - } + rlockobject *self = (rlockobject *) type->tp_alloc(type, 0); + if (self == NULL) { + return NULL; } + self->in_weakreflist = NULL; + self->rlock_owner = 0; + self->rlock_count = 0; + self->rlock_lock = PyThread_allocate_lock(); + if (self->rlock_lock == NULL) { + Py_DECREF(self); + PyErr_SetString(ThreadError, "can't allocate lock"); + return NULL; + } return (PyObject *) self; } @@ -467,6 +485,23 @@ rlock_repr(rlockobject *self) } +#ifdef HAVE_FORK +static PyObject * +rlock__at_fork_reinit(rlockobject *self, PyObject *Py_UNUSED(args)) +{ + if (_PyThread_at_fork_reinit(&self->rlock_lock) < 0) { + PyErr_SetString(ThreadError, "failed to reinitialize lock at fork"); + return NULL; + } + + self->rlock_owner = 0; + self->rlock_count = 0; + + Py_RETURN_NONE; +} +#endif /* HAVE_FORK */ + + static PyMethodDef rlock_methods[] = { {"acquire", (PyCFunction)(void(*)(void))rlock_acquire, METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc}, @@ -482,6 +517,10 @@ static PyMethodDef rlock_methods[] = { METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc}, {"__exit__", (PyCFunction)rlock_release, METH_VARARGS, rlock_release_doc}, +#ifdef HAVE_FORK + {"_at_fork_reinit", (PyCFunction)rlock__at_fork_reinit, + METH_NOARGS, NULL}, +#endif {NULL, NULL} /* sentinel */ }; @@ -548,8 +587,6 @@ newlockobject(void) /* Thread-local objects */ -#include "structmember.h" - /* Quick overview: We need to be able to reclaim reference cycles as soon as possible @@ -836,7 +873,7 @@ _ldict(localobject *self) } } else { - assert(Py_TYPE(dummy) == &localdummytype); + assert(Py_IS_TYPE(dummy, &localdummytype)); ldict = ((localdummyobject *) dummy)->localdict; } @@ -930,7 +967,7 @@ local_getattro(localobject *self, PyObject *name) if (r == -1) return NULL; - if (Py_TYPE(self) != &localtype) + if (!Py_IS_TYPE(self, &localtype)) /* use generic lookup for subtypes */ return _PyObject_GenericGetAttrWithDict( (PyObject *)self, name, ldict, 0); @@ -985,6 +1022,7 @@ struct bootstate { PyObject *args; PyObject *keyw; PyThreadState *tstate; + _PyRuntimeState *runtime; }; static void @@ -996,7 +1034,7 @@ t_bootstrap(void *boot_raw) tstate = boot->tstate; tstate->thread_id = PyThread_get_thread_ident(); - _PyThreadState_Init(&_PyRuntime, tstate); + _PyThreadState_Init(tstate); PyEval_AcquireThread(tstate); tstate->interp->num_threads++; res = PyObject_Call(boot->func, boot->args, boot->keyw); @@ -1017,13 +1055,14 @@ t_bootstrap(void *boot_raw) PyMem_DEL(boot_raw); tstate->interp->num_threads--; PyThreadState_Clear(tstate); - PyThreadState_DeleteCurrent(); + _PyThreadState_DeleteCurrent(tstate); PyThread_exit_thread(); } static PyObject * thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) { + _PyRuntimeState *runtime = &_PyRuntime; PyObject *func, *args, *keyw = NULL; struct bootstate *boot; unsigned long ident; @@ -1046,14 +1085,23 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) "optional 3rd arg must be a dictionary"); return NULL; } + + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (interp->config._isolated_interpreter) { + PyErr_SetString(PyExc_RuntimeError, + "thread is not supported for isolated subinterpreters"); + return NULL; + } + boot = PyMem_NEW(struct bootstate, 1); if (boot == NULL) return PyErr_NoMemory(); - boot->interp = _PyInterpreterState_Get(); + boot->interp = _PyInterpreterState_GET(); boot->func = func; boot->args = args; boot->keyw = keyw; boot->tstate = _PyThreadState_Prealloc(boot->interp); + boot->runtime = runtime; if (boot->tstate == NULL) { PyMem_DEL(boot); return PyErr_NoMemory(); @@ -1061,7 +1109,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) Py_INCREF(func); Py_INCREF(args); Py_XINCREF(keyw); - PyEval_InitThreads(); /* Start the interpreter's thread-awareness */ + ident = PyThread_start_new_thread(t_bootstrap, (void*) boot); if (ident == PYTHREAD_INVALID_THREAD_ID) { PyErr_SetString(ThreadError, "can't start new thread"); @@ -1170,7 +1218,7 @@ particular thread within a system."); static PyObject * thread__count(PyObject *self, PyObject *Py_UNUSED(ignored)) { - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); return PyLong_FromLong(interp->num_threads); } @@ -1196,7 +1244,7 @@ release_sentinel(void *wr_raw) PyObject *obj = PyWeakref_GET_OBJECT(wr); lockobject *lock; if (obj != Py_None) { - assert(Py_TYPE(obj) == &Locktype); + assert(Py_IS_TYPE(obj, &Locktype)); lock = (lockobject *) obj; if (lock->locked) { PyThread_release_lock(lock->lock_lock); @@ -1351,7 +1399,7 @@ thread_excepthook_file(PyObject *file, PyObject *exc_type, PyObject *exc_value, _PyErr_Display(file, exc_type, exc_value, exc_traceback); /* Call file.flush() */ - PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL); + PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); if (!res) { return -1; } @@ -1387,7 +1435,7 @@ static PyStructSequence_Desc ExceptHookArgs_desc = { static PyObject * thread_excepthook(PyObject *self, PyObject *args) { - if (Py_TYPE(args) != &ExceptHookArgsType) { + if (!Py_IS_TYPE(args, &ExceptHookArgsType)) { PyErr_SetString(PyExc_TypeError, "_thread.excepthook argument type " "must be ExceptHookArgs"); @@ -1513,7 +1561,7 @@ PyInit__thread(void) PyObject *m, *d, *v; double time_max; double timeout_max; - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); /* Initialize types: */ if (PyType_Ready(&localdummytype) < 0) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index a1071e5a..793c5e71 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -26,8 +26,6 @@ Copyright (C) 1994 Steen Lumholt. #include "Python.h" #include -#include "pythread.h" - #ifdef MS_WINDOWS #include #endif @@ -56,7 +54,7 @@ Copyright (C) 1994 Steen Lumholt. #if TK_HEX_VERSION >= 0x08050208 && TK_HEX_VERSION < 0x08060000 || \ TK_HEX_VERSION >= 0x08060200 -#define HAVE_LIBTOMMAMTH +#define HAVE_LIBTOMMATH #include #endif @@ -574,9 +572,9 @@ SplitObj(PyObject *arg) else if (PyBytes_Check(arg)) { int argc; const char **argv; - char *list = PyBytes_AS_STRING(arg); + const char *list = PyBytes_AS_STRING(arg); - if (Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) { + if (Tcl_SplitList((Tcl_Interp *)NULL, (char *)list, &argc, &argv) != TCL_OK) { Py_INCREF(arg); return arg; } @@ -712,8 +710,8 @@ Tkapp_New(const char *screenName, const char *className, } strcpy(argv0, className); - if (Py_ISUPPER(Py_CHARMASK(argv0[0]))) - argv0[0] = Py_TOLOWER(Py_CHARMASK(argv0[0])); + if (Py_ISUPPER(argv0[0])) + argv0[0] = Py_TOLOWER(argv0[0]); Tcl_SetVar(v->interp, "argv0", argv0, TCL_GLOBAL_ONLY); PyMem_Free(argv0); @@ -833,7 +831,7 @@ typedef struct { } PyTclObject; static PyObject *PyTclObject_Type; -#define PyTclObject_Check(v) ((v)->ob_type == (PyTypeObject *) PyTclObject_Type) +#define PyTclObject_Check(v) Py_IS_TYPE(v, (PyTypeObject *) PyTclObject_Type) static PyObject * newPyTclObject(Tcl_Obj *arg) @@ -967,7 +965,7 @@ static PyType_Spec PyTclObject_Type_spec = { #define CHECK_STRING_LENGTH(s) #endif -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH static Tcl_Obj* asBignumObj(PyObject *value) { @@ -1047,7 +1045,7 @@ AsObj(PyObject *value) #endif /* If there is an overflow in the wideInt conversion, fall through to bignum handling. */ -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH return asBignumObj(value); #endif /* If there is no wideInt or bignum support, @@ -1169,7 +1167,7 @@ fromWideIntObj(TkappObject *tkapp, Tcl_Obj *value) return NULL; } -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH static PyObject* fromBignumObj(TkappObject *tkapp, Tcl_Obj *value) { @@ -1249,7 +1247,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value) fall through to bignum handling. */ } -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH if (value->typePtr == tkapp->IntType || value->typePtr == tkapp->WideIntType || value->typePtr == tkapp->BignumType) { @@ -1302,7 +1300,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value) } #endif -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH if (tkapp->BignumType == NULL && strcmp(value->typePtr->name, "bignum") == 0) { /* bignum type is not registered in Tcl */ @@ -1734,7 +1732,7 @@ varname_converter(PyObject *in, void *_out) } PyErr_Format(PyExc_TypeError, "must be str, bytes or Tcl_Obj, not %.50s", - in->ob_type->tp_name); + Py_TYPE(in)->tp_name); return 0; } @@ -2003,7 +2001,7 @@ _tkinter_tkapp_getint(TkappObject *self, PyObject *arg) Prefer bignum because Tcl_GetWideIntFromObj returns ambiguous result for value in ranges -2**64..-2**63-1 and 2**63..2**64-1 (on 32-bit platform). */ -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH result = fromBignumObj(self, value); #else result = fromWideIntObj(self, value); @@ -2166,11 +2164,9 @@ _tkinter_tkapp_exprdouble_impl(TkappObject *self, const char *s) CHECK_STRING_LENGTH(s); CHECK_TCL_APPARTMENT; - PyFPE_START_PROTECT("Tkapp_ExprDouble", return 0) ENTER_TCL retval = Tcl_ExprDouble(Tkapp_Interp(self), s, &v); ENTER_OVERLAP - PyFPE_END_PROTECT(retval) if (retval == TCL_ERROR) res = Tkinter_Error(self); else @@ -2304,6 +2300,12 @@ _tkinter_tkapp_split(TkappObject *self, PyObject *arg) PyObject *v; char *list; + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "split() is deprecated; consider using splitlist() instead", 1)) + { + return NULL; + } + if (PyTclObject_Check(arg)) { Tcl_Obj *value = ((PyTclObject*)arg)->value; int objc; @@ -2798,7 +2800,7 @@ TimerHandler(ClientData clientData) ENTER_PYTHON - res = _PyObject_CallNoArg(func); + res = PyObject_CallNoArgs(func); Py_DECREF(func); Py_DECREF(v); /* See Tktt_New() */ diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c index cbcf55f8..fc91622d 100644 --- a/Modules/_tracemalloc.c +++ b/Modules/_tracemalloc.c @@ -1,9 +1,9 @@ #include "Python.h" +#include "pycore_gc.h" // PyGC_Head +#include "pycore_pymem.h" // _Py_tracemalloc_config #include "pycore_traceback.h" -#include "hashtable.h" -#include "frameobject.h" -#include "pythread.h" -#include "osdefs.h" +#include "pycore_hashtable.h" +#include "frameobject.h" // PyFrame_GetBack() #include "clinic/_tracemalloc.c.h" /*[clinic input] @@ -23,6 +23,9 @@ static void raw_free(void *ptr); # define TRACE_DEBUG #endif +#define TO_PTR(key) ((const void *)(uintptr_t)(key)) +#define FROM_PTR(key) ((uintptr_t)(key)) + /* Protected by the GIL */ static struct { PyMemAllocatorEx mem; @@ -34,7 +37,7 @@ static struct { #if defined(TRACE_RAW_MALLOC) /* This lock is needed because tracemalloc_free() is called without the GIL held from PyMem_RawFree(). It cannot acquire the lock because it - would introduce a deadlock in PyThreadState_DeleteCurrent(). */ + would introduce a deadlock in _PyThreadState_DeleteCurrent(). */ static PyThread_type_lock tables_lock; # define TABLES_LOCK() PyThread_acquire_lock(tables_lock, 1) # define TABLES_UNLOCK() PyThread_release_lock(tables_lock) @@ -47,16 +50,6 @@ static PyThread_type_lock tables_lock; #define DEFAULT_DOMAIN 0 -/* Pack the frame_t structure to reduce the memory footprint. */ -typedef struct -#ifdef __GNUC__ -__attribute__((packed)) -#endif -{ - uintptr_t ptr; - unsigned int domain; -} pointer_t; - /* Pack the frame_t structure to reduce the memory footprint on 64-bit architectures: 12 bytes instead of 16. */ typedef struct @@ -78,15 +71,20 @@ __attribute__((packed)) typedef struct { Py_uhash_t hash; - int nframe; + /* Number of frames stored */ + uint16_t nframe; + /* Total number of frames the traceback had */ + uint16_t total_nframe; frame_t frames[1]; } traceback_t; #define TRACEBACK_SIZE(NFRAME) \ (sizeof(traceback_t) + sizeof(frame_t) * (NFRAME - 1)) -#define MAX_NFRAME \ - ((INT_MAX - (int)sizeof(traceback_t)) / (int)sizeof(frame_t) + 1) +/* The maximum number of frames is either: + - The maximum number of frames we can store in `traceback_t.nframe` + - The maximum memory size_t we can allocate */ +static const unsigned long MAX_NFRAME = Py_MIN(UINT16_MAX, ((SIZE_MAX - sizeof(traceback_t)) / sizeof(frame_t) + 1)); static PyObject *unknown_filename = NULL; @@ -124,10 +122,14 @@ static traceback_t *tracemalloc_traceback = NULL; Protected by the GIL */ static _Py_hashtable_t *tracemalloc_tracebacks = NULL; -/* pointer (void*) => trace (trace_t). +/* pointer (void*) => trace (trace_t*). Protected by TABLES_LOCK(). */ static _Py_hashtable_t *tracemalloc_traces = NULL; +/* domain (unsigned int) => traces (_Py_hashtable_t). + Protected by TABLES_LOCK(). */ +static _Py_hashtable_t *tracemalloc_domains = NULL; + #ifdef TRACE_DEBUG static void @@ -204,69 +206,44 @@ set_reentrant(int reentrant) static Py_uhash_t -hashtable_hash_pyobject(_Py_hashtable_t *ht, const void *pkey) +hashtable_hash_pyobject(const void *key) { - PyObject *obj; - - _Py_HASHTABLE_READ_KEY(ht, pkey, obj); + PyObject *obj = (PyObject *)key; return PyObject_Hash(obj); } static int -hashtable_compare_unicode(_Py_hashtable_t *ht, const void *pkey, - const _Py_hashtable_entry_t *entry) +hashtable_compare_unicode(const void *key1, const void *key2) { - PyObject *key1, *key2; - - _Py_HASHTABLE_READ_KEY(ht, pkey, key1); - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, key2); - - if (key1 != NULL && key2 != NULL) - return (PyUnicode_Compare(key1, key2) == 0); - else - return key1 == key2; + PyObject *obj1 = (PyObject *)key1; + PyObject *obj2 = (PyObject *)key2; + if (obj1 != NULL && obj2 != NULL) { + return (PyUnicode_Compare(obj1, obj2) == 0); + } + else { + return obj1 == obj2; + } } static Py_uhash_t -hashtable_hash_pointer_t(_Py_hashtable_t *ht, const void *pkey) +hashtable_hash_uint(const void *key_raw) { - pointer_t ptr; - Py_uhash_t hash; - - _Py_HASHTABLE_READ_KEY(ht, pkey, ptr); - - hash = (Py_uhash_t)_Py_HashPointer((void*)ptr.ptr); - hash ^= ptr.domain; - return hash; -} - - -static int -hashtable_compare_pointer_t(_Py_hashtable_t *ht, const void *pkey, - const _Py_hashtable_entry_t *entry) -{ - pointer_t ptr1, ptr2; - - _Py_HASHTABLE_READ_KEY(ht, pkey, ptr1); - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, ptr2); - - /* compare pointer before domain, because pointer is more likely to be - different */ - return (ptr1.ptr == ptr2.ptr && ptr1.domain == ptr2.domain); - + unsigned int key = (unsigned int)FROM_PTR(key_raw); + return (Py_uhash_t)key; } static _Py_hashtable_t * -hashtable_new(size_t key_size, size_t data_size, - _Py_hashtable_hash_func hash_func, - _Py_hashtable_compare_func compare_func) +hashtable_new(_Py_hashtable_hash_func hash_func, + _Py_hashtable_compare_func compare_func, + _Py_hashtable_destroy_func key_destroy_func, + _Py_hashtable_destroy_func value_destroy_func) { _Py_hashtable_allocator_t hashtable_alloc = {malloc, free}; - return _Py_hashtable_new_full(key_size, data_size, 0, - hash_func, compare_func, + return _Py_hashtable_new_full(hash_func, compare_func, + key_destroy_func, value_destroy_func, &hashtable_alloc); } @@ -285,36 +262,33 @@ raw_free(void *ptr) static Py_uhash_t -hashtable_hash_traceback(_Py_hashtable_t *ht, const void *pkey) +hashtable_hash_traceback(const void *key) { - traceback_t *traceback; - - _Py_HASHTABLE_READ_KEY(ht, pkey, traceback); + const traceback_t *traceback = (const traceback_t *)key; return traceback->hash; } static int -hashtable_compare_traceback(_Py_hashtable_t *ht, const void *pkey, - const _Py_hashtable_entry_t *entry) +hashtable_compare_traceback(const void *key1, const void *key2) { - traceback_t *traceback1, *traceback2; - const frame_t *frame1, *frame2; - int i; - - _Py_HASHTABLE_READ_KEY(ht, pkey, traceback1); - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, traceback2); + const traceback_t *traceback1 = (const traceback_t *)key1; + const traceback_t *traceback2 = (const traceback_t *)key2; - if (traceback1->nframe != traceback2->nframe) + if (traceback1->nframe != traceback2->nframe) { + return 0; + } + if (traceback1->total_nframe != traceback2->total_nframe) { return 0; + } - for (i=0; i < traceback1->nframe; i++) { - frame1 = &traceback1->frames[i]; - frame2 = &traceback2->frames[i]; + for (int i=0; i < traceback1->nframe; i++) { + const frame_t *frame1 = &traceback1->frames[i]; + const frame_t *frame2 = &traceback2->frames[i]; - if (frame1->lineno != frame2->lineno) + if (frame1->lineno != frame2->lineno) { return 0; - + } if (frame1->filename != frame2->filename) { assert(PyUnicode_Compare(frame1->filename, frame2->filename) != 0); return 0; @@ -327,37 +301,24 @@ hashtable_compare_traceback(_Py_hashtable_t *ht, const void *pkey, static void tracemalloc_get_frame(PyFrameObject *pyframe, frame_t *frame) { - PyCodeObject *code; - PyObject *filename; - _Py_hashtable_entry_t *entry; - int lineno; - frame->filename = unknown_filename; - lineno = PyFrame_GetLineNumber(pyframe); - if (lineno < 0) + int lineno = PyFrame_GetLineNumber(pyframe); + if (lineno < 0) { lineno = 0; + } frame->lineno = (unsigned int)lineno; - code = pyframe->f_code; - if (code == NULL) { -#ifdef TRACE_DEBUG - tracemalloc_error("failed to get the code object of the frame"); -#endif - return; - } + PyCodeObject *code = PyFrame_GetCode(pyframe); + PyObject *filename = code->co_filename; + Py_DECREF(code); - if (code->co_filename == NULL) { + if (filename == NULL) { #ifdef TRACE_DEBUG tracemalloc_error("failed to get the filename of the code object"); #endif return; } - filename = code->co_filename; - assert(filename != NULL); - if (filename == NULL) - return; - if (!PyUnicode_Check(filename)) { #ifdef TRACE_DEBUG tracemalloc_error("filename is not a unicode string"); @@ -374,15 +335,16 @@ tracemalloc_get_frame(PyFrameObject *pyframe, frame_t *frame) } /* intern the filename */ - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_filenames, filename); + _Py_hashtable_entry_t *entry; + entry = _Py_hashtable_get_entry(tracemalloc_filenames, filename); if (entry != NULL) { - _Py_HASHTABLE_ENTRY_READ_KEY(tracemalloc_filenames, entry, filename); + filename = (PyObject *)entry->key; } else { /* tracemalloc_filenames is responsible to keep a reference to the filename */ Py_INCREF(filename); - if (_Py_HASHTABLE_SET_NODATA(tracemalloc_filenames, filename) < 0) { + if (_Py_hashtable_set(tracemalloc_filenames, filename, NULL) < 0) { Py_DECREF(filename); #ifdef TRACE_DEBUG tracemalloc_error("failed to intern the filename"); @@ -416,6 +378,7 @@ traceback_hash(traceback_t *traceback) /* the cast might truncate len; that doesn't change hash stability */ mult += (Py_uhash_t)(82520UL + len + len); } + x ^= traceback->total_nframe; x += 97531UL; return x; } @@ -424,10 +387,7 @@ traceback_hash(traceback_t *traceback) static void traceback_get_frames(traceback_t *traceback) { - PyThreadState *tstate; - PyFrameObject *pyframe; - - tstate = PyGILState_GetThisThreadState(); + PyThreadState *tstate = PyGILState_GetThisThreadState(); if (tstate == NULL) { #ifdef TRACE_DEBUG tracemalloc_error("failed to get the current thread state"); @@ -435,12 +395,20 @@ traceback_get_frames(traceback_t *traceback) return; } - for (pyframe = tstate->frame; pyframe != NULL; pyframe = pyframe->f_back) { - tracemalloc_get_frame(pyframe, &traceback->frames[traceback->nframe]); - assert(traceback->frames[traceback->nframe].filename != NULL); - traceback->nframe++; - if (traceback->nframe == _Py_tracemalloc_config.max_nframe) - break; + PyFrameObject *pyframe = PyThreadState_GetFrame(tstate); + for (; pyframe != NULL;) { + if (traceback->nframe < _Py_tracemalloc_config.max_nframe) { + tracemalloc_get_frame(pyframe, &traceback->frames[traceback->nframe]); + assert(traceback->frames[traceback->nframe].filename != NULL); + traceback->nframe++; + } + if (traceback->total_nframe < UINT16_MAX) { + traceback->total_nframe++; + } + + PyFrameObject *back = PyFrame_GetBack(pyframe); + Py_DECREF(pyframe); + pyframe = back; } } @@ -456,15 +424,16 @@ traceback_new(void) /* get frames */ traceback = tracemalloc_traceback; traceback->nframe = 0; + traceback->total_nframe = 0; traceback_get_frames(traceback); if (traceback->nframe == 0) return &tracemalloc_empty_traceback; traceback->hash = traceback_hash(traceback); /* intern the traceback */ - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_tracebacks, traceback); + entry = _Py_hashtable_get_entry(tracemalloc_tracebacks, traceback); if (entry != NULL) { - _Py_HASHTABLE_ENTRY_READ_KEY(tracemalloc_tracebacks, entry, traceback); + traceback = (traceback_t *)entry->key; } else { traceback_t *copy; @@ -481,7 +450,7 @@ traceback_new(void) } memcpy(copy, traceback, traceback_size); - if (_Py_HASHTABLE_SET_NODATA(tracemalloc_tracebacks, copy) < 0) { + if (_Py_hashtable_set(tracemalloc_tracebacks, copy, NULL) < 0) { raw_free(copy); #ifdef TRACE_DEBUG tracemalloc_error("failed to intern the traceback: putdata failed"); @@ -494,79 +463,54 @@ traceback_new(void) } -static int -tracemalloc_use_domain_cb(_Py_hashtable_t *old_traces, - _Py_hashtable_entry_t *entry, void *user_data) +static _Py_hashtable_t* +tracemalloc_create_traces_table(void) { - uintptr_t ptr; - pointer_t key; - _Py_hashtable_t *new_traces = (_Py_hashtable_t *)user_data; - const void *pdata = _Py_HASHTABLE_ENTRY_PDATA(old_traces, entry); - - _Py_HASHTABLE_ENTRY_READ_KEY(old_traces, entry, ptr); - key.ptr = ptr; - key.domain = DEFAULT_DOMAIN; - - return _Py_hashtable_set(new_traces, - sizeof(key), &key, - old_traces->data_size, pdata); + return hashtable_new(_Py_hashtable_hash_ptr, + _Py_hashtable_compare_direct, + NULL, raw_free); } -/* Convert tracemalloc_traces from compact key (uintptr_t) to pointer_t key. - * Return 0 on success, -1 on error. */ -static int -tracemalloc_use_domain(void) +static _Py_hashtable_t* +tracemalloc_create_domains_table(void) { - _Py_hashtable_t *new_traces = NULL; + return hashtable_new(hashtable_hash_uint, + _Py_hashtable_compare_direct, + NULL, + (_Py_hashtable_destroy_func)_Py_hashtable_destroy); +} - assert(!_Py_tracemalloc_config.use_domain); - new_traces = hashtable_new(sizeof(pointer_t), - sizeof(trace_t), - hashtable_hash_pointer_t, - hashtable_compare_pointer_t); - if (new_traces == NULL) { - return -1; +static _Py_hashtable_t* +tracemalloc_get_traces_table(unsigned int domain) +{ + if (domain == DEFAULT_DOMAIN) { + return tracemalloc_traces; } - - if (_Py_hashtable_foreach(tracemalloc_traces, tracemalloc_use_domain_cb, - new_traces) < 0) - { - _Py_hashtable_destroy(new_traces); - return -1; + else { + return _Py_hashtable_get(tracemalloc_domains, TO_PTR(domain)); } - - _Py_hashtable_destroy(tracemalloc_traces); - tracemalloc_traces = new_traces; - - _Py_tracemalloc_config.use_domain = 1; - - return 0; } static void tracemalloc_remove_trace(unsigned int domain, uintptr_t ptr) { - trace_t trace; - int removed; - assert(_Py_tracemalloc_config.tracing); - if (_Py_tracemalloc_config.use_domain) { - pointer_t key = {ptr, domain}; - removed = _Py_HASHTABLE_POP(tracemalloc_traces, key, trace); - } - else { - removed = _Py_HASHTABLE_POP(tracemalloc_traces, ptr, trace); - } - if (!removed) { + _Py_hashtable_t *traces = tracemalloc_get_traces_table(domain); + if (!traces) { return; } - assert(tracemalloc_traced_memory >= trace.size); - tracemalloc_traced_memory -= trace.size; + trace_t *trace = _Py_hashtable_steal(traces, TO_PTR(ptr)); + if (!trace) { + return; + } + assert(tracemalloc_traced_memory >= trace->size); + tracemalloc_traced_memory -= trace->size; + raw_free(trace); } #define REMOVE_TRACE(ptr) \ @@ -577,63 +521,55 @@ static int tracemalloc_add_trace(unsigned int domain, uintptr_t ptr, size_t size) { - pointer_t key = {ptr, domain}; - traceback_t *traceback; - trace_t trace; - _Py_hashtable_entry_t* entry; - int res; - assert(_Py_tracemalloc_config.tracing); - traceback = traceback_new(); + traceback_t *traceback = traceback_new(); if (traceback == NULL) { return -1; } - if (!_Py_tracemalloc_config.use_domain && domain != DEFAULT_DOMAIN) { - /* first trace using a non-zero domain whereas traces use compact - (uintptr_t) keys: switch to pointer_t keys. */ - if (tracemalloc_use_domain() < 0) { + _Py_hashtable_t *traces = tracemalloc_get_traces_table(domain); + if (traces == NULL) { + traces = tracemalloc_create_traces_table(); + if (traces == NULL) { return -1; } - } - if (_Py_tracemalloc_config.use_domain) { - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_traces, key); - } - else { - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_traces, ptr); + if (_Py_hashtable_set(tracemalloc_domains, TO_PTR(domain), traces) < 0) { + _Py_hashtable_destroy(traces); + return -1; + } } - if (entry != NULL) { + trace_t *trace = _Py_hashtable_get(traces, TO_PTR(ptr)); + if (trace != NULL) { /* the memory block is already tracked */ - _Py_HASHTABLE_ENTRY_READ_DATA(tracemalloc_traces, entry, trace); - assert(tracemalloc_traced_memory >= trace.size); - tracemalloc_traced_memory -= trace.size; + assert(tracemalloc_traced_memory >= trace->size); + tracemalloc_traced_memory -= trace->size; - trace.size = size; - trace.traceback = traceback; - _Py_HASHTABLE_ENTRY_WRITE_DATA(tracemalloc_traces, entry, trace); + trace->size = size; + trace->traceback = traceback; } else { - trace.size = size; - trace.traceback = traceback; - - if (_Py_tracemalloc_config.use_domain) { - res = _Py_HASHTABLE_SET(tracemalloc_traces, key, trace); - } - else { - res = _Py_HASHTABLE_SET(tracemalloc_traces, ptr, trace); + trace = raw_malloc(sizeof(trace_t)); + if (trace == NULL) { + return -1; } + trace->size = size; + trace->traceback = traceback; + + int res = _Py_hashtable_set(traces, TO_PTR(ptr), trace); if (res != 0) { + raw_free(trace); return res; } } assert(tracemalloc_traced_memory <= SIZE_MAX - size); tracemalloc_traced_memory += size; - if (tracemalloc_traced_memory > tracemalloc_peak_traced_memory) + if (tracemalloc_traced_memory > tracemalloc_peak_traced_memory) { tracemalloc_peak_traced_memory = tracemalloc_traced_memory; + } return 0; } @@ -684,7 +620,7 @@ tracemalloc_realloc(void *ctx, void *ptr, size_t new_size) TABLES_LOCK(); /* tracemalloc_add_trace() updates the trace if there is already - a trace at address (domain, ptr2) */ + a trace at address ptr2 */ if (ptr2 != ptr) { REMOVE_TRACE(ptr); } @@ -699,7 +635,7 @@ tracemalloc_realloc(void *ctx, void *ptr, size_t new_size) The GIL and the table lock ensures that only one thread is allocating memory. */ - Py_UNREACHABLE(); + Py_FatalError("tracemalloc_realloc() failed to allocate a trace"); } TABLES_UNLOCK(); } @@ -728,7 +664,7 @@ tracemalloc_free(void *ctx, void *ptr) return; /* GIL cannot be locked in PyMem_RawFree() because it would introduce - a deadlock in PyThreadState_DeleteCurrent(). */ + a deadlock in _PyThreadState_DeleteCurrent(). */ alloc->free(alloc->ctx, ptr); @@ -888,27 +824,11 @@ tracemalloc_raw_realloc(void *ctx, void *ptr, size_t new_size) #endif /* TRACE_RAW_MALLOC */ -static int -tracemalloc_clear_filename(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry, - void *user_data) +static void +tracemalloc_clear_filename(void *value) { - PyObject *filename; - - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, filename); + PyObject *filename = (PyObject *)value; Py_DECREF(filename); - return 0; -} - - -static int -traceback_free_traceback(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry, - void *user_data) -{ - traceback_t *traceback; - - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, traceback); - raw_free(traceback); - return 0; } @@ -921,14 +841,13 @@ tracemalloc_clear_traces(void) TABLES_LOCK(); _Py_hashtable_clear(tracemalloc_traces); + _Py_hashtable_clear(tracemalloc_domains); tracemalloc_traced_memory = 0; tracemalloc_peak_traced_memory = 0; TABLES_UNLOCK(); - _Py_hashtable_foreach(tracemalloc_tracebacks, traceback_free_traceback, NULL); _Py_hashtable_clear(tracemalloc_tracebacks); - _Py_hashtable_foreach(tracemalloc_filenames, tracemalloc_clear_filename, NULL); _Py_hashtable_clear(tracemalloc_filenames); } @@ -968,29 +887,19 @@ tracemalloc_init(void) } #endif - tracemalloc_filenames = hashtable_new(sizeof(PyObject *), 0, - hashtable_hash_pyobject, - hashtable_compare_unicode); + tracemalloc_filenames = hashtable_new(hashtable_hash_pyobject, + hashtable_compare_unicode, + tracemalloc_clear_filename, NULL); - tracemalloc_tracebacks = hashtable_new(sizeof(traceback_t *), 0, - hashtable_hash_traceback, - hashtable_compare_traceback); + tracemalloc_tracebacks = hashtable_new(hashtable_hash_traceback, + hashtable_compare_traceback, + NULL, raw_free); - if (_Py_tracemalloc_config.use_domain) { - tracemalloc_traces = hashtable_new(sizeof(pointer_t), - sizeof(trace_t), - hashtable_hash_pointer_t, - hashtable_compare_pointer_t); - } - else { - tracemalloc_traces = hashtable_new(sizeof(uintptr_t), - sizeof(trace_t), - _Py_hashtable_hash_ptr, - _Py_hashtable_compare_direct); - } + tracemalloc_traces = tracemalloc_create_traces_table(); + tracemalloc_domains = tracemalloc_create_domains_table(); if (tracemalloc_filenames == NULL || tracemalloc_tracebacks == NULL - || tracemalloc_traces == NULL) { + || tracemalloc_traces == NULL || tracemalloc_domains == NULL) { PyErr_NoMemory(); return -1; } @@ -1001,6 +910,7 @@ tracemalloc_init(void) PyUnicode_InternInPlace(&unknown_filename); tracemalloc_empty_traceback.nframe = 1; + tracemalloc_empty_traceback.total_nframe = 1; /* borrowed reference */ tracemalloc_empty_traceback.frames[0].filename = unknown_filename; tracemalloc_empty_traceback.frames[0].lineno = 0; @@ -1021,9 +931,10 @@ tracemalloc_deinit(void) tracemalloc_stop(); /* destroy hash tables */ + _Py_hashtable_destroy(tracemalloc_domains); + _Py_hashtable_destroy(tracemalloc_traces); _Py_hashtable_destroy(tracemalloc_tracebacks); _Py_hashtable_destroy(tracemalloc_filenames); - _Py_hashtable_destroy(tracemalloc_traces); #if defined(TRACE_RAW_MALLOC) if (tables_lock != NULL) { @@ -1046,10 +957,10 @@ tracemalloc_start(int max_nframe) PyMemAllocatorEx alloc; size_t size; - if (max_nframe < 1 || max_nframe > MAX_NFRAME) { + if (max_nframe < 1 || (unsigned long) max_nframe > MAX_NFRAME) { PyErr_Format(PyExc_ValueError, - "the number of frames must be in range [1; %i]", - (int)MAX_NFRAME); + "the number of frames must be in range [1; %lu]", + MAX_NFRAME); return -1; } @@ -1062,7 +973,6 @@ tracemalloc_start(int max_nframe) return 0; } - assert(1 <= max_nframe && max_nframe <= MAX_NFRAME); _Py_tracemalloc_config.max_nframe = max_nframe; /* allocate a buffer to store a new traceback */ @@ -1191,11 +1101,11 @@ frame_to_pyobject(frame_t *frame) static PyObject* traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table) { - int i; - PyObject *frames, *frame; + PyObject *frames; if (intern_table != NULL) { - if (_Py_HASHTABLE_GET(intern_table, traceback, frames)) { + frames = _Py_hashtable_get(intern_table, (const void *)traceback); + if (frames) { Py_INCREF(frames); return frames; } @@ -1205,8 +1115,8 @@ traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table) if (frames == NULL) return NULL; - for (i=0; i < traceback->nframe; i++) { - frame = frame_to_pyobject(&traceback->frames[i]); + for (int i=0; i < traceback->nframe; i++) { + PyObject *frame = frame_to_pyobject(&traceback->frames[i]); if (frame == NULL) { Py_DECREF(frames); return NULL; @@ -1215,7 +1125,7 @@ traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table) } if (intern_table != NULL) { - if (_Py_HASHTABLE_SET(intern_table, traceback, frames) < 0) { + if (_Py_hashtable_set(intern_table, traceback, frames) < 0) { Py_DECREF(frames); PyErr_NoMemory(); return NULL; @@ -1228,13 +1138,13 @@ traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table) static PyObject* -trace_to_pyobject(unsigned int domain, trace_t *trace, +trace_to_pyobject(unsigned int domain, const trace_t *trace, _Py_hashtable_t *intern_tracebacks) { PyObject *trace_obj = NULL; PyObject *obj; - trace_obj = PyTuple_New(3); + trace_obj = PyTuple_New(4); if (trace_obj == NULL) return NULL; @@ -1259,58 +1169,152 @@ trace_to_pyobject(unsigned int domain, trace_t *trace, } PyTuple_SET_ITEM(trace_obj, 2, obj); + obj = PyLong_FromUnsignedLong(trace->traceback->total_nframe); + if (obj == NULL) { + Py_DECREF(trace_obj); + return NULL; + } + PyTuple_SET_ITEM(trace_obj, 3, obj); + return trace_obj; } typedef struct { _Py_hashtable_t *traces; + _Py_hashtable_t *domains; _Py_hashtable_t *tracebacks; PyObject *list; + unsigned int domain; } get_traces_t; + static int -tracemalloc_get_traces_fill(_Py_hashtable_t *traces, _Py_hashtable_entry_t *entry, - void *user_data) +tracemalloc_copy_trace(_Py_hashtable_t *traces, + const void *key, const void *value, + void *user_data) { - get_traces_t *get_traces = user_data; - unsigned int domain; - trace_t trace; - PyObject *tracemalloc_obj; - int res; + _Py_hashtable_t *traces2 = (_Py_hashtable_t *)user_data; + + trace_t *trace = (trace_t *)value; - if (_Py_tracemalloc_config.use_domain) { - pointer_t key; - _Py_HASHTABLE_ENTRY_READ_KEY(traces, entry, key); - domain = key.domain; + trace_t *trace2 = raw_malloc(sizeof(trace_t)); + if (traces2 == NULL) { + return -1; } - else { - domain = DEFAULT_DOMAIN; + *trace2 = *trace; + if (_Py_hashtable_set(traces2, key, trace2) < 0) { + raw_free(trace2); + return -1; + } + return 0; +} + + +static _Py_hashtable_t* +tracemalloc_copy_traces(_Py_hashtable_t *traces) +{ + _Py_hashtable_t *traces2 = tracemalloc_create_traces_table(); + if (traces2 == NULL) { + return NULL; + } + + int err = _Py_hashtable_foreach(traces, + tracemalloc_copy_trace, + traces2); + if (err) { + _Py_hashtable_destroy(traces2); + return NULL; + } + return traces2; +} + + +static int +tracemalloc_copy_domain(_Py_hashtable_t *domains, + const void *key, const void *value, + void *user_data) +{ + _Py_hashtable_t *domains2 = (_Py_hashtable_t *)user_data; + + unsigned int domain = (unsigned int)FROM_PTR(key); + _Py_hashtable_t *traces = (_Py_hashtable_t *)value; + + _Py_hashtable_t *traces2 = tracemalloc_copy_traces(traces); + if (_Py_hashtable_set(domains2, TO_PTR(domain), traces2) < 0) { + _Py_hashtable_destroy(traces2); + return -1; } - _Py_HASHTABLE_ENTRY_READ_DATA(traces, entry, trace); + return 0; +} + - tracemalloc_obj = trace_to_pyobject(domain, &trace, get_traces->tracebacks); - if (tracemalloc_obj == NULL) +static _Py_hashtable_t* +tracemalloc_copy_domains(_Py_hashtable_t *domains) +{ + _Py_hashtable_t *domains2 = tracemalloc_create_domains_table(); + if (domains2 == NULL) { + return NULL; + } + + int err = _Py_hashtable_foreach(domains, + tracemalloc_copy_domain, + domains2); + if (err) { + _Py_hashtable_destroy(domains2); + return NULL; + } + return domains2; +} + + +static int +tracemalloc_get_traces_fill(_Py_hashtable_t *traces, + const void *key, const void *value, + void *user_data) +{ + get_traces_t *get_traces = user_data; + + const trace_t *trace = (const trace_t *)value; + + PyObject *tuple = trace_to_pyobject(get_traces->domain, trace, + get_traces->tracebacks); + if (tuple == NULL) { return 1; + } - res = PyList_Append(get_traces->list, tracemalloc_obj); - Py_DECREF(tracemalloc_obj); - if (res < 0) + int res = PyList_Append(get_traces->list, tuple); + Py_DECREF(tuple); + if (res < 0) { return 1; + } return 0; } static int -tracemalloc_pyobject_decref_cb(_Py_hashtable_t *tracebacks, - _Py_hashtable_entry_t *entry, - void *user_data) +tracemalloc_get_traces_domain(_Py_hashtable_t *domains, + const void *key, const void *value, + void *user_data) { - PyObject *obj; - _Py_HASHTABLE_ENTRY_READ_DATA(tracebacks, entry, obj); + get_traces_t *get_traces = user_data; + + unsigned int domain = (unsigned int)FROM_PTR(key); + _Py_hashtable_t *traces = (_Py_hashtable_t *)value; + + get_traces->domain = domain; + return _Py_hashtable_foreach(traces, + tracemalloc_get_traces_fill, + get_traces); +} + + +static void +tracemalloc_pyobject_decref(void *value) +{ + PyObject *obj = (PyObject *)value; Py_DECREF(obj); - return 0; } @@ -1331,9 +1335,9 @@ _tracemalloc__get_traces_impl(PyObject *module) /*[clinic end generated code: output=e9929876ced4b5cc input=6c7d2230b24255aa]*/ { get_traces_t get_traces; - int err; - + get_traces.domain = DEFAULT_DOMAIN; get_traces.traces = NULL; + get_traces.domains = NULL; get_traces.tracebacks = NULL; get_traces.list = PyList_New(0); if (get_traces.list == NULL) @@ -1344,45 +1348,65 @@ _tracemalloc__get_traces_impl(PyObject *module) /* the traceback hash table is used temporarily to intern traceback tuple of (filename, lineno) tuples */ - get_traces.tracebacks = hashtable_new(sizeof(traceback_t *), - sizeof(PyObject *), - _Py_hashtable_hash_ptr, - _Py_hashtable_compare_direct); + get_traces.tracebacks = hashtable_new(_Py_hashtable_hash_ptr, + _Py_hashtable_compare_direct, + NULL, tracemalloc_pyobject_decref); if (get_traces.tracebacks == NULL) { - PyErr_NoMemory(); - goto error; + goto no_memory; } + // Copy all traces so tracemalloc_get_traces_fill() doesn't have to disable + // temporarily tracemalloc which would impact other threads and so would + // miss allocations while get_traces() is called. TABLES_LOCK(); - get_traces.traces = _Py_hashtable_copy(tracemalloc_traces); + get_traces.traces = tracemalloc_copy_traces(tracemalloc_traces); TABLES_UNLOCK(); if (get_traces.traces == NULL) { - PyErr_NoMemory(); - goto error; + goto no_memory; + } + + TABLES_LOCK(); + get_traces.domains = tracemalloc_copy_domains(tracemalloc_domains); + TABLES_UNLOCK(); + + if (get_traces.domains == NULL) { + goto no_memory; } + // Convert traces to a list of tuples set_reentrant(1); - err = _Py_hashtable_foreach(get_traces.traces, - tracemalloc_get_traces_fill, &get_traces); + int err = _Py_hashtable_foreach(get_traces.traces, + tracemalloc_get_traces_fill, + &get_traces); + if (!err) { + err = _Py_hashtable_foreach(get_traces.domains, + tracemalloc_get_traces_domain, + &get_traces); + } set_reentrant(0); - if (err) + if (err) { goto error; + } goto finally; +no_memory: + PyErr_NoMemory(); + error: Py_CLEAR(get_traces.list); finally: if (get_traces.tracebacks != NULL) { - _Py_hashtable_foreach(get_traces.tracebacks, - tracemalloc_pyobject_decref_cb, NULL); _Py_hashtable_destroy(get_traces.tracebacks); } if (get_traces.traces != NULL) { _Py_hashtable_destroy(get_traces.traces); } + if (get_traces.domains != NULL) { + _Py_hashtable_destroy(get_traces.domains); + } return get_traces.list; } @@ -1391,26 +1415,26 @@ finally: static traceback_t* tracemalloc_get_traceback(unsigned int domain, uintptr_t ptr) { - trace_t trace; - int found; if (!_Py_tracemalloc_config.tracing) return NULL; + trace_t *trace; TABLES_LOCK(); - if (_Py_tracemalloc_config.use_domain) { - pointer_t key = {ptr, domain}; - found = _Py_HASHTABLE_GET(tracemalloc_traces, key, trace); + _Py_hashtable_t *traces = tracemalloc_get_traces_table(domain); + if (traces) { + trace = _Py_hashtable_get(traces, TO_PTR(ptr)); } else { - found = _Py_HASHTABLE_GET(tracemalloc_traces, ptr, trace); + trace = NULL; } TABLES_UNLOCK(); - if (!found) + if (!trace) { return NULL; + } - return trace.traceback; + return trace->traceback; } @@ -1550,6 +1574,17 @@ _tracemalloc_get_traceback_limit_impl(PyObject *module) } +static int +tracemalloc_get_tracemalloc_memory_cb(_Py_hashtable_t *domains, + const void *key, const void *value, + void *user_data) +{ + const _Py_hashtable_t *traces = value; + size_t *size = (size_t*)user_data; + *size += _Py_hashtable_size(traces); + return 0; +} + /*[clinic input] _tracemalloc.get_tracemalloc_memory @@ -1570,6 +1605,8 @@ _tracemalloc_get_tracemalloc_memory_impl(PyObject *module) TABLES_LOCK(); size += _Py_hashtable_size(tracemalloc_traces); + _Py_hashtable_foreach(tracemalloc_domains, + tracemalloc_get_tracemalloc_memory_cb, &size); TABLES_UNLOCK(); return PyLong_FromSize_t(size); @@ -1602,6 +1639,30 @@ _tracemalloc_get_traced_memory_impl(PyObject *module) return Py_BuildValue("nn", size, peak_size); } +/*[clinic input] +_tracemalloc.reset_peak + +Set the peak size of memory blocks traced by tracemalloc to the current size. + +Do nothing if the tracemalloc module is not tracing memory allocations. + +[clinic start generated code]*/ + +static PyObject * +_tracemalloc_reset_peak_impl(PyObject *module) +/*[clinic end generated code: output=140c2870f691dbb2 input=18afd0635066e9ce]*/ +{ + if (!_Py_tracemalloc_config.tracing) { + Py_RETURN_NONE; + } + + TABLES_LOCK(); + tracemalloc_peak_traced_memory = tracemalloc_traced_memory; + TABLES_UNLOCK(); + + Py_RETURN_NONE; +} + static PyMethodDef module_methods[] = { _TRACEMALLOC_IS_TRACING_METHODDEF @@ -1613,6 +1674,7 @@ static PyMethodDef module_methods[] = { _TRACEMALLOC_GET_TRACEBACK_LIMIT_METHODDEF _TRACEMALLOC_GET_TRACEMALLOC_MEMORY_METHODDEF _TRACEMALLOC_GET_TRACED_MEMORY_METHODDEF + _TRACEMALLOC_RESET_PEAK_METHODDEF /* sentinel */ {NULL, NULL} }; @@ -1727,26 +1789,15 @@ _PyTraceMalloc_NewReference(PyObject *op) ptr = (uintptr_t)op; } - _Py_hashtable_entry_t* entry; int res = -1; TABLES_LOCK(); - if (_Py_tracemalloc_config.use_domain) { - pointer_t key = {ptr, DEFAULT_DOMAIN}; - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_traces, key); - } - else { - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_traces, ptr); - } - - if (entry != NULL) { + trace_t *trace = _Py_hashtable_get(tracemalloc_traces, TO_PTR(ptr)); + if (trace != NULL) { /* update the traceback of the memory block */ traceback_t *traceback = traceback_new(); if (traceback != NULL) { - trace_t trace; - _Py_HASHTABLE_ENTRY_READ_DATA(tracemalloc_traces, entry, trace); - trace.traceback = traceback; - _Py_HASHTABLE_ENTRY_WRITE_DATA(tracemalloc_traces, entry, trace); + trace->traceback = traceback; res = 0; } } diff --git a/Modules/_uuidmodule.c b/Modules/_uuidmodule.c index 0b7aa72e..3f33e22a 100644 --- a/Modules/_uuidmodule.c +++ b/Modules/_uuidmodule.c @@ -1,5 +1,5 @@ /* - * Python UUID module that wraps libuuid - + * Python UUID module that wraps libuuid or Windows rpcrt4.dll. * DCE compatible Universally Unique Identifier library. */ @@ -12,6 +12,12 @@ #include #endif +#ifdef MS_WINDOWS +#include +#endif + +#ifndef MS_WINDOWS + static PyObject * py_uuid_generate_time_safe(PyObject *Py_UNUSED(context), PyObject *Py_UNUSED(ignored)) @@ -31,45 +37,86 @@ py_uuid_generate_time_safe(PyObject *Py_UNUSED(context), return Py_BuildValue("y#i", buf, sizeof(uuid), (int) status); # else return Py_BuildValue("y#i", (const char *) &uuid, sizeof(uuid), (int) status); -# endif -#else +# endif /* HAVE_UUID_CREATE */ +#else /* HAVE_UUID_GENERATE_TIME_SAFE */ uuid_generate_time(uuid); return Py_BuildValue("y#O", (const char *) uuid, sizeof(uuid), Py_None); -#endif +#endif /* HAVE_UUID_GENERATE_TIME_SAFE */ } +#else /* MS_WINDOWS */ + +static PyObject * +py_UuidCreate(PyObject *Py_UNUSED(context), + PyObject *Py_UNUSED(ignored)) +{ + UUID uuid; + RPC_STATUS res; + + Py_BEGIN_ALLOW_THREADS + res = UuidCreateSequential(&uuid); + Py_END_ALLOW_THREADS + + switch (res) { + case RPC_S_OK: + case RPC_S_UUID_LOCAL_ONLY: + case RPC_S_UUID_NO_ADDRESS: + /* + All success codes, but the latter two indicate that the UUID is random + rather than based on the MAC address. If the OS can't figure this out, + neither can we, so we'll take it anyway. + */ + return Py_BuildValue("y#", (const char *)&uuid, sizeof(uuid)); + } + PyErr_SetFromWindowsErr(res); + return NULL; +} + +#endif /* MS_WINDOWS */ + + +static int +uuid_exec(PyObject *module) { + assert(sizeof(uuid_t) == 16); +#if defined(MS_WINDOWS) + int has_uuid_generate_time_safe = 0; +#elif defined(HAVE_UUID_GENERATE_TIME_SAFE) + int has_uuid_generate_time_safe = 1; +#else + int has_uuid_generate_time_safe = 0; +#endif + if (PyModule_AddIntConstant(module, "has_uuid_generate_time_safe", + has_uuid_generate_time_safe) < 0) { + return -1; + } + return 0; +} static PyMethodDef uuid_methods[] = { +#if defined(HAVE_UUID_UUID_H) || defined(HAVE_UUID_H) {"generate_time_safe", py_uuid_generate_time_safe, METH_NOARGS, NULL}, +#endif +#if defined(MS_WINDOWS) + {"UuidCreate", py_UuidCreate, METH_NOARGS, NULL}, +#endif {NULL, NULL, 0, NULL} /* sentinel */ }; +static PyModuleDef_Slot uuid_slots[] = { + {Py_mod_exec, uuid_exec}, + {0, NULL} +}; + static struct PyModuleDef uuidmodule = { PyModuleDef_HEAD_INIT, .m_name = "_uuid", - .m_size = -1, + .m_size = 0, .m_methods = uuid_methods, + .m_slots = uuid_slots, }; PyMODINIT_FUNC PyInit__uuid(void) { - PyObject *mod; - assert(sizeof(uuid_t) == 16); -#ifdef HAVE_UUID_GENERATE_TIME_SAFE - int has_uuid_generate_time_safe = 1; -#else - int has_uuid_generate_time_safe = 0; -#endif - mod = PyModule_Create(&uuidmodule); - if (mod == NULL) { - return NULL; - } - if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe", - has_uuid_generate_time_safe) < 0) { - Py_DECREF(mod); - return NULL; - } - - return mod; + return PyModuleDef_Init(&uuidmodule); } diff --git a/Modules/_weakref.c b/Modules/_weakref.c index c1238e00..e33cba2a 100644 --- a/Modules/_weakref.c +++ b/Modules/_weakref.c @@ -1,8 +1,9 @@ #include "Python.h" +#include "pycore_object.h" // _PyObject_GET_WEAKREFS_LISTPTR #define GET_WEAKREFS_LISTPTR(o) \ - ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o)) + ((PyWeakReference **) _PyObject_GET_WEAKREFS_LISTPTR(o)) /*[clinic input] module _weakref @@ -136,14 +137,48 @@ weakref_functions[] = { {NULL, NULL, 0, NULL} }; +static int +weakref_exec(PyObject *module) +{ + Py_INCREF(&_PyWeakref_RefType); + if (PyModule_AddObject(module, "ref", (PyObject *) &_PyWeakref_RefType) < 0) { + Py_DECREF(&_PyWeakref_RefType); + return -1; + } + Py_INCREF(&_PyWeakref_RefType); + if (PyModule_AddObject(module, "ReferenceType", + (PyObject *) &_PyWeakref_RefType) < 0) { + Py_DECREF(&_PyWeakref_RefType); + return -1; + } + Py_INCREF(&_PyWeakref_ProxyType); + if (PyModule_AddObject(module, "ProxyType", + (PyObject *) &_PyWeakref_ProxyType) < 0) { + Py_DECREF(&_PyWeakref_ProxyType); + return -1; + } + Py_INCREF(&_PyWeakref_CallableProxyType); + if (PyModule_AddObject(module, "CallableProxyType", + (PyObject *) &_PyWeakref_CallableProxyType) < 0) { + Py_DECREF(&_PyWeakref_CallableProxyType); + return -1; + } + + return 0; +} + +static struct PyModuleDef_Slot weakref_slots[] = { + {Py_mod_exec, weakref_exec}, + {0, NULL} +}; static struct PyModuleDef weakrefmodule = { PyModuleDef_HEAD_INIT, "_weakref", "Weak-reference support module.", - -1, + 0, weakref_functions, - NULL, + weakref_slots, NULL, NULL, NULL @@ -152,23 +187,5 @@ static struct PyModuleDef weakrefmodule = { PyMODINIT_FUNC PyInit__weakref(void) { - PyObject *m; - - m = PyModule_Create(&weakrefmodule); - - if (m != NULL) { - Py_INCREF(&_PyWeakref_RefType); - PyModule_AddObject(m, "ref", - (PyObject *) &_PyWeakref_RefType); - Py_INCREF(&_PyWeakref_RefType); - PyModule_AddObject(m, "ReferenceType", - (PyObject *) &_PyWeakref_RefType); - Py_INCREF(&_PyWeakref_ProxyType); - PyModule_AddObject(m, "ProxyType", - (PyObject *) &_PyWeakref_ProxyType); - Py_INCREF(&_PyWeakref_CallableProxyType); - PyModule_AddObject(m, "CallableProxyType", - (PyObject *) &_PyWeakref_CallableProxyType); - } - return m; + return PyModuleDef_Init(&weakrefmodule); } diff --git a/Modules/_winapi.c b/Modules/_winapi.c index 647075cd..e1672c47 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -35,7 +35,7 @@ /* See http://www.python.org/2.4/license for licensing details. */ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #define WINDOWS_LEAN_AND_MEAN #include "windows.h" @@ -603,11 +603,10 @@ _winapi_CreateJunction_impl(PyObject *module, LPWSTR src_path, sizeof(rdb->MountPointReparseBuffer.PathBuffer) + /* Two +1's for NUL terminators. */ (prefix_len + print_len + 1 + print_len + 1) * sizeof(WCHAR); - rdb = (_Py_PREPARSE_DATA_BUFFER)PyMem_RawMalloc(rdb_size); + rdb = (_Py_PREPARSE_DATA_BUFFER)PyMem_RawCalloc(1, rdb_size); if (rdb == NULL) goto cleanup; - memset(rdb, 0, rdb_size); rdb->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT; rdb->ReparseDataLength = rdb_size - _Py_REPARSE_DATA_BUFFER_HEADER_SIZE; rdb->MountPointReparseBuffer.SubstituteNameOffset = 0; @@ -1081,6 +1080,14 @@ _winapi_CreateProcess_impl(PyObject *module, return NULL; } + PyInterpreterState *interp = PyInterpreterState_Get(); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); + if (config->_isolated_interpreter) { + PyErr_SetString(PyExc_RuntimeError, + "subprocess not supported for isolated subinterpreters"); + return NULL; + } + ZeroMemory(&si, sizeof(si)); si.StartupInfo.cb = sizeof(si); @@ -1111,8 +1118,8 @@ _winapi_CreateProcess_impl(PyObject *module, } } else if (command_line != Py_None) { - PyErr_Format(PyExc_TypeError, - "CreateProcess() argument 2 must be str or None, not %s", + PyErr_Format(PyExc_TypeError, + "CreateProcess() argument 2 must be str or None, not %s", Py_TYPE(command_line)->tp_name); goto cleanup; } diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index db1116ac..de11c090 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -26,9 +26,9 @@ _copy_raw_string(PyObject *strobj) static PyInterpreterState * _get_current(void) { - // _PyInterpreterState_Get() aborts if lookup fails, so don't need + // PyInterpreterState_Get() aborts if lookup fails, so don't need // to check the result for NULL. - return _PyInterpreterState_Get(); + return PyInterpreterState_Get(); } @@ -538,7 +538,7 @@ _channelend_find(_channelend *first, int64_t interp, _channelend **pprev) typedef struct _channelassociations { // Note that the list entries are never removed for interpreter - // for which the channel is closed. This should be a problem in + // for which the channel is closed. This should not be a problem in // practice. Also, a channel isn't automatically closed when an // interpreter is destroyed. int64_t numsendopen; @@ -1179,11 +1179,6 @@ _channels_list_all(_channels *channels, int64_t *count) { int64_t *cids = NULL; PyThread_acquire_lock(channels->mutex, WAIT_LOCK); - int64_t numopen = channels->numopen; - if (numopen >= PY_SSIZE_T_MAX) { - PyErr_SetString(PyExc_RuntimeError, "too many channels open"); - goto done; - } int64_t *ids = PyMem_NEW(int64_t, (Py_ssize_t)(channels->numopen)); if (ids == NULL) { goto done; @@ -1350,19 +1345,16 @@ _channel_recv(_channels *channels, int64_t id) _PyCrossInterpreterData *data = _channel_next(chan, PyInterpreterState_GetID(interp)); PyThread_release_lock(mutex); if (data == NULL) { - if (!PyErr_Occurred()) { - PyErr_Format(ChannelEmptyError, "channel %" PRId64 " is empty", id); - } return NULL; } // Convert the data back to an object. PyObject *obj = _PyCrossInterpreterData_NewObject(data); + _PyCrossInterpreterData_Release(data); + PyMem_Free(data); if (obj == NULL) { return NULL; } - _PyCrossInterpreterData_Release(data); - PyMem_Free(data); return obj; } @@ -1395,6 +1387,24 @@ _channel_close(_channels *channels, int64_t id, int end, int force) return _channels_close(channels, id, NULL, end, force); } +static int +_channel_is_associated(_channels *channels, int64_t cid, int64_t interp, + int send) +{ + _PyChannelState *chan = _channels_lookup(channels, cid, NULL); + if (chan == NULL) { + return -1; + } else if (send && chan->closing != NULL) { + PyErr_Format(ChannelClosedError, "channel %" PRId64 " closed", cid); + return -1; + } + + _channelend *end = _channelend_find(send ? chan->ends->send : chan->ends->recv, + interp, NULL); + + return (end != NULL && end->open); +} + /* ChannelID class */ static PyTypeObject ChannelIDtype; @@ -1428,7 +1438,7 @@ channel_id_converter(PyObject *arg, void *ptr) else { PyErr_Format(PyExc_TypeError, "channel ID must be an int, got %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return 0; } *(int64_t *)ptr = cid; @@ -1830,14 +1840,17 @@ _is_running(PyInterpreterState *interp) "interpreter has more than one thread"); return -1; } - PyFrameObject *frame = tstate->frame; + + assert(!PyErr_Occurred()); + PyFrameObject *frame = PyThreadState_GetFrame(tstate); if (frame == NULL) { - if (PyErr_Occurred() != NULL) { - return -1; - } return 0; } - return (int)(frame->f_executing); + + int executing = (int)(frame->f_executing); + Py_DECREF(frame); + + return executing; } static int @@ -1928,7 +1941,7 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr, // Switch to interpreter. PyThreadState *save_tstate = NULL; - if (interp != _PyInterpreterState_Get()) { + if (interp != PyInterpreterState_Get()) { // XXX Using the "head" thread isn't strictly correct. PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); // XXX Possible GILState issues? @@ -1986,16 +1999,20 @@ _global_channels(void) { } static PyObject * -interp_create(PyObject *self, PyObject *args) +interp_create(PyObject *self, PyObject *args, PyObject *kwds) { - if (!PyArg_UnpackTuple(args, "create", 0, 0)) { + + static char *kwlist[] = {"isolated", NULL}; + int isolated = 1; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|$i:create", kwlist, + &isolated)) { return NULL; } // Create and initialize the new interpreter. PyThreadState *save_tstate = PyThreadState_Swap(NULL); // XXX Possible GILState issues? - PyThreadState *tstate = Py_NewInterpreter(); + PyThreadState *tstate = _Py_NewInterpreter(isolated); PyThreadState_Swap(save_tstate); if (tstate == NULL) { /* Since no new thread state was created, there is no exception to @@ -2004,7 +2021,8 @@ interp_create(PyObject *self, PyObject *args) PyErr_SetString(PyExc_RuntimeError, "interpreter creation failed"); return NULL; } - PyObject *idobj = _PyInterpreterState_GetIDObject(tstate->interp); + PyInterpreterState *interp = PyThreadState_GetInterpreter(tstate); + PyObject *idobj = _PyInterpreterState_GetIDObject(interp); if (idobj == NULL) { // XXX Possible GILState issues? save_tstate = PyThreadState_Swap(tstate); @@ -2012,7 +2030,7 @@ interp_create(PyObject *self, PyObject *args) PyThreadState_Swap(save_tstate); return NULL; } - _PyInterpreterState_RequireIDRef(tstate->interp, 1); + _PyInterpreterState_RequireIDRef(interp, 1); return idobj; } @@ -2058,7 +2076,6 @@ interp_destroy(PyObject *self, PyObject *args, PyObject *kwds) } // Destroy the interpreter. - //PyInterpreterState_Delete(interp); PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); // XXX Possible GILState issues? PyThreadState *save_tstate = PyThreadState_Swap(tstate); @@ -2135,7 +2152,7 @@ static PyObject * interp_get_main(PyObject *self, PyObject *Py_UNUSED(ignored)) { // Currently, 0 is always the main interpreter. - PY_INT64_T id = 0; + int64_t id = 0; return _PyInterpreterID_New(id); } @@ -2326,6 +2343,68 @@ PyDoc_STRVAR(channel_list_all_doc, \n\ Return the list of all IDs for active channels."); +static PyObject * +channel_list_interpreters(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"cid", "send", NULL}; + int64_t cid; /* Channel ID */ + int send = 0; /* Send or receive end? */ + int64_t id; + PyObject *ids, *id_obj; + PyInterpreterState *interp; + + if (!PyArg_ParseTupleAndKeywords( + args, kwds, "O&$p:channel_list_interpreters", + kwlist, channel_id_converter, &cid, &send)) { + return NULL; + } + + ids = PyList_New(0); + if (ids == NULL) { + goto except; + } + + interp = PyInterpreterState_Head(); + while (interp != NULL) { + id = PyInterpreterState_GetID(interp); + assert(id >= 0); + int res = _channel_is_associated(&_globals.channels, cid, id, send); + if (res < 0) { + goto except; + } + if (res) { + id_obj = _PyInterpreterState_GetIDObject(interp); + if (id_obj == NULL) { + goto except; + } + res = PyList_Insert(ids, 0, id_obj); + Py_DECREF(id_obj); + if (res < 0) { + goto except; + } + } + interp = PyInterpreterState_Next(interp); + } + + goto finally; + +except: + Py_XDECREF(ids); + ids = NULL; + +finally: + return ids; +} + +PyDoc_STRVAR(channel_list_interpreters_doc, +"channel_list_interpreters(cid, *, send) -> [id]\n\ +\n\ +Return the list of all interpreter IDs associated with an end of the channel.\n\ +\n\ +The 'send' argument should be a boolean indicating whether to use the send or\n\ +receive end."); + + static PyObject * channel_send(PyObject *self, PyObject *args, PyObject *kwds) { @@ -2351,20 +2430,37 @@ Add the object's data to the channel's queue."); static PyObject * channel_recv(PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"cid", NULL}; + static char *kwlist[] = {"cid", "default", NULL}; int64_t cid; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&:channel_recv", kwlist, - channel_id_converter, &cid)) { + PyObject *dflt = NULL; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|O:channel_recv", kwlist, + channel_id_converter, &cid, &dflt)) { return NULL; } + Py_XINCREF(dflt); - return _channel_recv(&_globals.channels, cid); + PyObject *obj = _channel_recv(&_globals.channels, cid); + if (obj != NULL) { + Py_XDECREF(dflt); + return obj; + } else if (PyErr_Occurred()) { + Py_XDECREF(dflt); + return NULL; + } else if (dflt != NULL) { + return dflt; + } else { + PyErr_Format(ChannelEmptyError, "channel %" PRId64 " is empty", cid); + return NULL; + } } PyDoc_STRVAR(channel_recv_doc, -"channel_recv(cid) -> obj\n\ +"channel_recv(cid, [default]) -> obj\n\ +\n\ +Return a new object from the data at the front of the channel's queue.\n\ \n\ -Return a new object from the data at the from of the channel's queue."); +If there is nothing to receive then raise ChannelEmptyError, unless\n\ +a default value is provided. In that case return it."); static PyObject * channel_close(PyObject *self, PyObject *args, PyObject *kwds) @@ -2455,8 +2551,8 @@ channel__channel_id(PyObject *self, PyObject *args, PyObject *kwds) } static PyMethodDef module_functions[] = { - {"create", (PyCFunction)interp_create, - METH_VARARGS, create_doc}, + {"create", (PyCFunction)(void(*)(void))interp_create, + METH_VARARGS | METH_KEYWORDS, create_doc}, {"destroy", (PyCFunction)(void(*)(void))interp_destroy, METH_VARARGS | METH_KEYWORDS, destroy_doc}, {"list_all", interp_list_all, @@ -2479,6 +2575,8 @@ static PyMethodDef module_functions[] = { METH_VARARGS | METH_KEYWORDS, channel_destroy_doc}, {"channel_list_all", channel_list_all, METH_NOARGS, channel_list_all_doc}, + {"channel_list_interpreters", (PyCFunction)(void(*)(void))channel_list_interpreters, + METH_VARARGS | METH_KEYWORDS, channel_list_interpreters_doc}, {"channel_send", (PyCFunction)(void(*)(void))channel_send, METH_VARARGS | METH_KEYWORDS, channel_send_doc}, {"channel_recv", (PyCFunction)(void(*)(void))channel_recv, diff --git a/Modules/_xxtestfuzz/_xxtestfuzz.c b/Modules/_xxtestfuzz/_xxtestfuzz.c index 781dd235..e0694de6 100644 --- a/Modules/_xxtestfuzz/_xxtestfuzz.c +++ b/Modules/_xxtestfuzz/_xxtestfuzz.c @@ -44,10 +44,5 @@ static struct PyModuleDef _fuzzmodule = { PyMODINIT_FUNC PyInit__xxtestfuzz(void) { - PyObject *m = NULL; - - if ((m = PyModule_Create(&_fuzzmodule)) == NULL) { - return NULL; - } - return m; + return PyModule_Create(&_fuzzmodule); } diff --git a/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/hello_string b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/hello_string new file mode 100644 index 00000000..92d47cd3 Binary files /dev/null and b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/hello_string differ diff --git a/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/long_zero b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/long_zero new file mode 100644 index 00000000..d952225c Binary files /dev/null and b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/long_zero differ diff --git a/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/varied_format_string b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/varied_format_string new file mode 100644 index 00000000..a150dc08 Binary files /dev/null and b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/varied_format_string differ diff --git a/Modules/_xxtestfuzz/fuzz_tests.txt b/Modules/_xxtestfuzz/fuzz_tests.txt index 9d330a66..053b77b4 100644 --- a/Modules/_xxtestfuzz/fuzz_tests.txt +++ b/Modules/_xxtestfuzz/fuzz_tests.txt @@ -5,3 +5,4 @@ fuzz_json_loads fuzz_sre_compile fuzz_sre_match fuzz_csv_reader +fuzz_struct_unpack diff --git a/Modules/_xxtestfuzz/fuzzer.c b/Modules/_xxtestfuzz/fuzzer.c index 1821eb2a..6bd2c3ae 100644 --- a/Modules/_xxtestfuzz/fuzzer.c +++ b/Modules/_xxtestfuzz/fuzzer.c @@ -79,6 +79,69 @@ static int fuzz_builtin_unicode(const char* data, size_t size) { return 0; } + +PyObject* struct_unpack_method = NULL; +PyObject* struct_error = NULL; +/* Called by LLVMFuzzerTestOneInput for initialization */ +static int init_struct_unpack() { + /* Import struct.unpack */ + PyObject* struct_module = PyImport_ImportModule("struct"); + if (struct_module == NULL) { + return 0; + } + struct_error = PyObject_GetAttrString(struct_module, "error"); + if (struct_error == NULL) { + return 0; + } + struct_unpack_method = PyObject_GetAttrString(struct_module, "unpack"); + return struct_unpack_method != NULL; +} +/* Fuzz struct.unpack(x, y) */ +static int fuzz_struct_unpack(const char* data, size_t size) { + /* Everything up to the first null byte is considered the + format. Everything after is the buffer */ + const char* first_null = memchr(data, '\0', size); + if (first_null == NULL) { + return 0; + } + + size_t format_length = first_null - data; + size_t buffer_length = size - format_length - 1; + + PyObject* pattern = PyBytes_FromStringAndSize(data, format_length); + if (pattern == NULL) { + return 0; + } + PyObject* buffer = PyBytes_FromStringAndSize(first_null + 1, buffer_length); + if (buffer == NULL) { + Py_DECREF(pattern); + return 0; + } + + PyObject* unpacked = PyObject_CallFunctionObjArgs( + struct_unpack_method, pattern, buffer, NULL); + /* Ignore any overflow errors, these are easily triggered accidentally */ + if (unpacked == NULL && PyErr_ExceptionMatches(PyExc_OverflowError)) { + PyErr_Clear(); + } + /* The pascal format string will throw a negative size when passing 0 + like: struct.unpack('0p', b'') */ + if (unpacked == NULL && PyErr_ExceptionMatches(PyExc_SystemError)) { + PyErr_Clear(); + } + /* Ignore any struct.error exceptions, these can be caused by invalid + formats or incomplete buffers both of which are common. */ + if (unpacked == NULL && PyErr_ExceptionMatches(struct_error)) { + PyErr_Clear(); + } + + Py_XDECREF(unpacked); + Py_DECREF(pattern); + Py_DECREF(buffer); + return 0; +} + + #define MAX_JSON_TEST_SIZE 0x10000 PyObject* json_loads_method = NULL; @@ -104,7 +167,7 @@ static int fuzz_json_loads(const char* data, size_t size) { if (input_bytes == NULL) { return 0; } - PyObject* parsed = PyObject_CallFunctionObjArgs(json_loads_method, input_bytes, NULL); + PyObject* parsed = PyObject_CallOneArg(json_loads_method, input_bytes); if (parsed == NULL) { /* Ignore ValueError as the fuzzer will more than likely generate some invalid json and values */ @@ -190,9 +253,10 @@ static int fuzz_sre_compile(const char* data, size_t size) { PyErr_Clear(); } /* Ignore some common errors thrown by sre_parse: - Overflow, Assertion and Index */ + Overflow, Assertion, Recursion and Index */ if (compiled == NULL && (PyErr_ExceptionMatches(PyExc_OverflowError) || PyErr_ExceptionMatches(PyExc_AssertionError) || + PyErr_ExceptionMatches(PyExc_RecursionError) || PyErr_ExceptionMatches(PyExc_IndexError)) ) { PyErr_Clear(); @@ -263,7 +327,7 @@ static int fuzz_sre_match(const char* data, size_t size) { PyObject* pattern = compiled_patterns[idx]; PyObject* match_callable = PyObject_GetAttrString(pattern, "match"); - PyObject* matches = PyObject_CallFunctionObjArgs(match_callable, to_match, NULL); + PyObject* matches = PyObject_CallOneArg(match_callable, to_match); Py_XDECREF(matches); Py_DECREF(match_callable); @@ -378,6 +442,16 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { #if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_builtin_unicode) rv |= _run_fuzz(data, size, fuzz_builtin_unicode); #endif +#if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_struct_unpack) + static int STRUCT_UNPACK_INITIALIZED = 0; + if (!STRUCT_UNPACK_INITIALIZED && !init_struct_unpack()) { + PyErr_Print(); + abort(); + } else { + STRUCT_UNPACK_INITIALIZED = 1; + } + rv |= _run_fuzz(data, size, fuzz_struct_unpack); +#endif #if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_json_loads) static int JSON_LOADS_INITIALIZED = 0; if (!JSON_LOADS_INITIALIZED && !init_json_loads()) { diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c new file mode 100644 index 00000000..2cee65fa --- /dev/null +++ b/Modules/_zoneinfo.c @@ -0,0 +1,2700 @@ +#include "Python.h" +#include "structmember.h" + +#include +#include +#include + +#include "datetime.h" + +// Imports +static PyObject *io_open = NULL; +static PyObject *_tzpath_find_tzfile = NULL; +static PyObject *_common_mod = NULL; + +typedef struct TransitionRuleType TransitionRuleType; +typedef struct StrongCacheNode StrongCacheNode; + +typedef struct { + PyObject *utcoff; + PyObject *dstoff; + PyObject *tzname; + long utcoff_seconds; +} _ttinfo; + +typedef struct { + _ttinfo std; + _ttinfo dst; + int dst_diff; + TransitionRuleType *start; + TransitionRuleType *end; + unsigned char std_only; +} _tzrule; + +typedef struct { + PyDateTime_TZInfo base; + PyObject *key; + PyObject *file_repr; + PyObject *weakreflist; + size_t num_transitions; + size_t num_ttinfos; + int64_t *trans_list_utc; + int64_t *trans_list_wall[2]; + _ttinfo **trans_ttinfos; // References to the ttinfo for each transition + _ttinfo *ttinfo_before; + _tzrule tzrule_after; + _ttinfo *_ttinfos; // Unique array of ttinfos for ease of deallocation + unsigned char fixed_offset; + unsigned char source; +} PyZoneInfo_ZoneInfo; + +struct TransitionRuleType { + int64_t (*year_to_timestamp)(TransitionRuleType *, int); +}; + +typedef struct { + TransitionRuleType base; + uint8_t month; + uint8_t week; + uint8_t day; + int8_t hour; + int8_t minute; + int8_t second; +} CalendarRule; + +typedef struct { + TransitionRuleType base; + uint8_t julian; + unsigned int day; + int8_t hour; + int8_t minute; + int8_t second; +} DayRule; + +struct StrongCacheNode { + StrongCacheNode *next; + StrongCacheNode *prev; + PyObject *key; + PyObject *zone; +}; + +static PyTypeObject PyZoneInfo_ZoneInfoType; + +// Globals +static PyObject *TIMEDELTA_CACHE = NULL; +static PyObject *ZONEINFO_WEAK_CACHE = NULL; +static StrongCacheNode *ZONEINFO_STRONG_CACHE = NULL; +static size_t ZONEINFO_STRONG_CACHE_MAX_SIZE = 8; + +static _ttinfo NO_TTINFO = {NULL, NULL, NULL, 0}; + +// Constants +static const int EPOCHORDINAL = 719163; +static int DAYS_IN_MONTH[] = { + -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, +}; + +static int DAYS_BEFORE_MONTH[] = { + -1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, +}; + +static const int SOURCE_NOCACHE = 0; +static const int SOURCE_CACHE = 1; +static const int SOURCE_FILE = 2; + +// Forward declarations +static int +load_data(PyZoneInfo_ZoneInfo *self, PyObject *file_obj); +static void +utcoff_to_dstoff(size_t *trans_idx, long *utcoffs, long *dstoffs, + unsigned char *isdsts, size_t num_transitions, + size_t num_ttinfos); +static int +ts_to_local(size_t *trans_idx, int64_t *trans_utc, long *utcoff, + int64_t *trans_local[2], size_t num_ttinfos, + size_t num_transitions); + +static int +parse_tz_str(PyObject *tz_str_obj, _tzrule *out); + +static Py_ssize_t +parse_abbr(const char *const p, PyObject **abbr); +static Py_ssize_t +parse_tz_delta(const char *const p, long *total_seconds); +static Py_ssize_t +parse_transition_time(const char *const p, int8_t *hour, int8_t *minute, + int8_t *second); +static Py_ssize_t +parse_transition_rule(const char *const p, TransitionRuleType **out); + +static _ttinfo * +find_tzrule_ttinfo(_tzrule *rule, int64_t ts, unsigned char fold, int year); +static _ttinfo * +find_tzrule_ttinfo_fromutc(_tzrule *rule, int64_t ts, int year, + unsigned char *fold); + +static int +build_ttinfo(long utcoffset, long dstoffset, PyObject *tzname, _ttinfo *out); +static void +xdecref_ttinfo(_ttinfo *ttinfo); +static int +ttinfo_eq(const _ttinfo *const tti0, const _ttinfo *const tti1); + +static int +build_tzrule(PyObject *std_abbr, PyObject *dst_abbr, long std_offset, + long dst_offset, TransitionRuleType *start, + TransitionRuleType *end, _tzrule *out); +static void +free_tzrule(_tzrule *tzrule); + +static PyObject * +load_timedelta(long seconds); + +static int +get_local_timestamp(PyObject *dt, int64_t *local_ts); +static _ttinfo * +find_ttinfo(PyZoneInfo_ZoneInfo *self, PyObject *dt); + +static int +ymd_to_ord(int y, int m, int d); +static int +is_leap_year(int year); + +static size_t +_bisect(const int64_t value, const int64_t *arr, size_t size); + +static void +eject_from_strong_cache(const PyTypeObject *const type, PyObject *key); +static void +clear_strong_cache(const PyTypeObject *const type); +static void +update_strong_cache(const PyTypeObject *const type, PyObject *key, + PyObject *zone); +static PyObject * +zone_from_strong_cache(const PyTypeObject *const type, PyObject *key); + +static PyObject * +zoneinfo_new_instance(PyTypeObject *type, PyObject *key) +{ + PyObject *file_obj = NULL; + PyObject *file_path = NULL; + + file_path = PyObject_CallFunctionObjArgs(_tzpath_find_tzfile, key, NULL); + if (file_path == NULL) { + return NULL; + } + else if (file_path == Py_None) { + file_obj = PyObject_CallMethod(_common_mod, "load_tzdata", "O", key); + if (file_obj == NULL) { + Py_DECREF(file_path); + return NULL; + } + } + + PyObject *self = (PyObject *)(type->tp_alloc(type, 0)); + if (self == NULL) { + goto error; + } + + if (file_obj == NULL) { + file_obj = PyObject_CallFunction(io_open, "Os", file_path, "rb"); + if (file_obj == NULL) { + goto error; + } + } + + if (load_data((PyZoneInfo_ZoneInfo *)self, file_obj)) { + goto error; + } + + PyObject *rv = PyObject_CallMethod(file_obj, "close", NULL); + Py_DECREF(file_obj); + file_obj = NULL; + if (rv == NULL) { + goto error; + } + Py_DECREF(rv); + + ((PyZoneInfo_ZoneInfo *)self)->key = key; + Py_INCREF(key); + + goto cleanup; +error: + Py_XDECREF(self); + self = NULL; +cleanup: + if (file_obj != NULL) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyObject *tmp = PyObject_CallMethod(file_obj, "close", NULL); + _PyErr_ChainExceptions(exc, val, tb); + if (tmp == NULL) { + Py_CLEAR(self); + } + Py_XDECREF(tmp); + Py_DECREF(file_obj); + } + Py_DECREF(file_path); + return self; +} + +static PyObject * +get_weak_cache(PyTypeObject *type) +{ + if (type == &PyZoneInfo_ZoneInfoType) { + return ZONEINFO_WEAK_CACHE; + } + else { + PyObject *cache = + PyObject_GetAttrString((PyObject *)type, "_weak_cache"); + // We are assuming that the type lives at least as long as the function + // that calls get_weak_cache, and that it holds a reference to the + // cache, so we'll return a "borrowed reference". + Py_XDECREF(cache); + return cache; + } +} + +static PyObject * +zoneinfo_new(PyTypeObject *type, PyObject *args, PyObject *kw) +{ + PyObject *key = NULL; + static char *kwlist[] = {"key", NULL}; + if (PyArg_ParseTupleAndKeywords(args, kw, "O", kwlist, &key) == 0) { + return NULL; + } + + PyObject *instance = zone_from_strong_cache(type, key); + if (instance != NULL) { + return instance; + } + + PyObject *weak_cache = get_weak_cache(type); + instance = PyObject_CallMethod(weak_cache, "get", "O", key, Py_None); + if (instance == NULL) { + return NULL; + } + + if (instance == Py_None) { + Py_DECREF(instance); + PyObject *tmp = zoneinfo_new_instance(type, key); + if (tmp == NULL) { + return NULL; + } + + instance = + PyObject_CallMethod(weak_cache, "setdefault", "OO", key, tmp); + Py_DECREF(tmp); + if (instance == NULL) { + return NULL; + } + ((PyZoneInfo_ZoneInfo *)instance)->source = SOURCE_CACHE; + } + + update_strong_cache(type, key, instance); + return instance; +} + +static void +zoneinfo_dealloc(PyObject *obj_self) +{ + PyZoneInfo_ZoneInfo *self = (PyZoneInfo_ZoneInfo *)obj_self; + + if (self->weakreflist != NULL) { + PyObject_ClearWeakRefs(obj_self); + } + + if (self->trans_list_utc != NULL) { + PyMem_Free(self->trans_list_utc); + } + + for (size_t i = 0; i < 2; i++) { + if (self->trans_list_wall[i] != NULL) { + PyMem_Free(self->trans_list_wall[i]); + } + } + + if (self->_ttinfos != NULL) { + for (size_t i = 0; i < self->num_ttinfos; ++i) { + xdecref_ttinfo(&(self->_ttinfos[i])); + } + PyMem_Free(self->_ttinfos); + } + + if (self->trans_ttinfos != NULL) { + PyMem_Free(self->trans_ttinfos); + } + + free_tzrule(&(self->tzrule_after)); + + Py_XDECREF(self->key); + Py_XDECREF(self->file_repr); + + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyObject * +zoneinfo_from_file(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyObject *file_obj = NULL; + PyObject *file_repr = NULL; + PyObject *key = Py_None; + PyZoneInfo_ZoneInfo *self = NULL; + + static char *kwlist[] = {"", "key", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", kwlist, &file_obj, + &key)) { + return NULL; + } + + PyObject *obj_self = (PyObject *)(type->tp_alloc(type, 0)); + self = (PyZoneInfo_ZoneInfo *)obj_self; + if (self == NULL) { + return NULL; + } + + file_repr = PyUnicode_FromFormat("%R", file_obj); + if (file_repr == NULL) { + goto error; + } + + if (load_data(self, file_obj)) { + goto error; + } + + self->source = SOURCE_FILE; + self->file_repr = file_repr; + self->key = key; + Py_INCREF(key); + + return obj_self; +error: + Py_XDECREF(file_repr); + Py_XDECREF(self); + return NULL; +} + +static PyObject * +zoneinfo_no_cache(PyTypeObject *cls, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = {"key", NULL}; + PyObject *key = NULL; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kwlist, &key)) { + return NULL; + } + + PyObject *out = zoneinfo_new_instance(cls, key); + if (out != NULL) { + ((PyZoneInfo_ZoneInfo *)out)->source = SOURCE_NOCACHE; + } + + return out; +} + +static PyObject * +zoneinfo_clear_cache(PyObject *cls, PyObject *args, PyObject *kwargs) +{ + PyObject *only_keys = NULL; + static char *kwlist[] = {"only_keys", NULL}; + + if (!(PyArg_ParseTupleAndKeywords(args, kwargs, "|$O", kwlist, + &only_keys))) { + return NULL; + } + + PyTypeObject *type = (PyTypeObject *)cls; + PyObject *weak_cache = get_weak_cache(type); + + if (only_keys == NULL || only_keys == Py_None) { + PyObject *rv = PyObject_CallMethod(weak_cache, "clear", NULL); + if (rv != NULL) { + Py_DECREF(rv); + } + + clear_strong_cache(type); + } + else { + PyObject *item = NULL; + PyObject *pop = PyUnicode_FromString("pop"); + if (pop == NULL) { + return NULL; + } + + PyObject *iter = PyObject_GetIter(only_keys); + if (iter == NULL) { + Py_DECREF(pop); + return NULL; + } + + while ((item = PyIter_Next(iter))) { + // Remove from strong cache + eject_from_strong_cache(type, item); + + // Remove from weak cache + PyObject *tmp = PyObject_CallMethodObjArgs(weak_cache, pop, item, + Py_None, NULL); + + Py_DECREF(item); + if (tmp == NULL) { + break; + } + Py_DECREF(tmp); + } + Py_DECREF(iter); + Py_DECREF(pop); + } + + if (PyErr_Occurred()) { + return NULL; + } + + Py_RETURN_NONE; +} + +static PyObject * +zoneinfo_utcoffset(PyObject *self, PyObject *dt) +{ + _ttinfo *tti = find_ttinfo((PyZoneInfo_ZoneInfo *)self, dt); + if (tti == NULL) { + return NULL; + } + Py_INCREF(tti->utcoff); + return tti->utcoff; +} + +static PyObject * +zoneinfo_dst(PyObject *self, PyObject *dt) +{ + _ttinfo *tti = find_ttinfo((PyZoneInfo_ZoneInfo *)self, dt); + if (tti == NULL) { + return NULL; + } + Py_INCREF(tti->dstoff); + return tti->dstoff; +} + +static PyObject * +zoneinfo_tzname(PyObject *self, PyObject *dt) +{ + _ttinfo *tti = find_ttinfo((PyZoneInfo_ZoneInfo *)self, dt); + if (tti == NULL) { + return NULL; + } + Py_INCREF(tti->tzname); + return tti->tzname; +} + +#define HASTZINFO(p) (((_PyDateTime_BaseTZInfo *)(p))->hastzinfo) +#define GET_DT_TZINFO(p) \ + (HASTZINFO(p) ? ((PyDateTime_DateTime *)(p))->tzinfo : Py_None) + +static PyObject * +zoneinfo_fromutc(PyObject *obj_self, PyObject *dt) +{ + if (!PyDateTime_Check(dt)) { + PyErr_SetString(PyExc_TypeError, + "fromutc: argument must be a datetime"); + return NULL; + } + if (GET_DT_TZINFO(dt) != obj_self) { + PyErr_SetString(PyExc_ValueError, + "fromutc: dt.tzinfo " + "is not self"); + return NULL; + } + + PyZoneInfo_ZoneInfo *self = (PyZoneInfo_ZoneInfo *)obj_self; + + int64_t timestamp; + if (get_local_timestamp(dt, ×tamp)) { + return NULL; + } + size_t num_trans = self->num_transitions; + + _ttinfo *tti = NULL; + unsigned char fold = 0; + + if (num_trans >= 1 && timestamp < self->trans_list_utc[0]) { + tti = self->ttinfo_before; + } + else if (num_trans == 0 || + timestamp > self->trans_list_utc[num_trans - 1]) { + tti = find_tzrule_ttinfo_fromutc(&(self->tzrule_after), timestamp, + PyDateTime_GET_YEAR(dt), &fold); + + // Immediately after the last manual transition, the fold/gap is + // between self->trans_ttinfos[num_transitions - 1] and whatever + // ttinfo applies immediately after the last transition, not between + // the STD and DST rules in the tzrule_after, so we may need to + // adjust the fold value. + if (num_trans) { + _ttinfo *tti_prev = NULL; + if (num_trans == 1) { + tti_prev = self->ttinfo_before; + } + else { + tti_prev = self->trans_ttinfos[num_trans - 2]; + } + int64_t diff = tti_prev->utcoff_seconds - tti->utcoff_seconds; + if (diff > 0 && + timestamp < (self->trans_list_utc[num_trans - 1] + diff)) { + fold = 1; + } + } + } + else { + size_t idx = _bisect(timestamp, self->trans_list_utc, num_trans); + _ttinfo *tti_prev = NULL; + + if (idx >= 2) { + tti_prev = self->trans_ttinfos[idx - 2]; + tti = self->trans_ttinfos[idx - 1]; + } + else { + tti_prev = self->ttinfo_before; + tti = self->trans_ttinfos[0]; + } + + // Detect fold + int64_t shift = + (int64_t)(tti_prev->utcoff_seconds - tti->utcoff_seconds); + if (shift > (timestamp - self->trans_list_utc[idx - 1])) { + fold = 1; + } + } + + PyObject *tmp = PyNumber_Add(dt, tti->utcoff); + if (tmp == NULL) { + return NULL; + } + + if (fold) { + if (PyDateTime_CheckExact(tmp)) { + ((PyDateTime_DateTime *)tmp)->fold = 1; + dt = tmp; + } + else { + PyObject *replace = PyObject_GetAttrString(tmp, "replace"); + PyObject *args = PyTuple_New(0); + PyObject *kwargs = PyDict_New(); + + Py_DECREF(tmp); + if (args == NULL || kwargs == NULL || replace == NULL) { + Py_XDECREF(args); + Py_XDECREF(kwargs); + Py_XDECREF(replace); + return NULL; + } + + dt = NULL; + if (!PyDict_SetItemString(kwargs, "fold", _PyLong_One)) { + dt = PyObject_Call(replace, args, kwargs); + } + + Py_DECREF(args); + Py_DECREF(kwargs); + Py_DECREF(replace); + + if (dt == NULL) { + return NULL; + } + } + } + else { + dt = tmp; + } + return dt; +} + +static PyObject * +zoneinfo_repr(PyZoneInfo_ZoneInfo *self) +{ + PyObject *rv = NULL; + const char *type_name = Py_TYPE((PyObject *)self)->tp_name; + if (!(self->key == Py_None)) { + rv = PyUnicode_FromFormat("%s(key=%R)", type_name, self->key); + } + else { + assert(PyUnicode_Check(self->file_repr)); + rv = PyUnicode_FromFormat("%s.from_file(%U)", type_name, + self->file_repr); + } + + return rv; +} + +static PyObject * +zoneinfo_str(PyZoneInfo_ZoneInfo *self) +{ + if (!(self->key == Py_None)) { + Py_INCREF(self->key); + return self->key; + } + else { + return zoneinfo_repr(self); + } +} + +/* Pickles the ZoneInfo object by key and source. + * + * ZoneInfo objects are pickled by reference to the TZif file that they came + * from, which means that the exact transitions may be different or the file + * may not un-pickle if the data has changed on disk in the interim. + * + * It is necessary to include a bit indicating whether or not the object + * was constructed from the cache, because from-cache objects will hit the + * unpickling process's cache, whereas no-cache objects will bypass it. + * + * Objects constructed from ZoneInfo.from_file cannot be pickled. + */ +static PyObject * +zoneinfo_reduce(PyObject *obj_self, PyObject *unused) +{ + PyZoneInfo_ZoneInfo *self = (PyZoneInfo_ZoneInfo *)obj_self; + if (self->source == SOURCE_FILE) { + // Objects constructed from files cannot be pickled. + PyObject *pickle = PyImport_ImportModule("pickle"); + if (pickle == NULL) { + return NULL; + } + + PyObject *pickle_error = + PyObject_GetAttrString(pickle, "PicklingError"); + Py_DECREF(pickle); + if (pickle_error == NULL) { + return NULL; + } + + PyErr_Format(pickle_error, + "Cannot pickle a ZoneInfo file from a file stream."); + Py_DECREF(pickle_error); + return NULL; + } + + unsigned char from_cache = self->source == SOURCE_CACHE ? 1 : 0; + PyObject *constructor = PyObject_GetAttrString(obj_self, "_unpickle"); + + if (constructor == NULL) { + return NULL; + } + + PyObject *rv = Py_BuildValue("O(OB)", constructor, self->key, from_cache); + Py_DECREF(constructor); + return rv; +} + +static PyObject * +zoneinfo__unpickle(PyTypeObject *cls, PyObject *args) +{ + PyObject *key; + unsigned char from_cache; + if (!PyArg_ParseTuple(args, "OB", &key, &from_cache)) { + return NULL; + } + + if (from_cache) { + PyObject *val_args = Py_BuildValue("(O)", key); + if (val_args == NULL) { + return NULL; + } + + PyObject *rv = zoneinfo_new(cls, val_args, NULL); + + Py_DECREF(val_args); + return rv; + } + else { + return zoneinfo_new_instance(cls, key); + } +} + +/* It is relatively expensive to construct new timedelta objects, and in most + * cases we're looking at a relatively small number of timedeltas, such as + * integer number of hours, etc. We will keep a cache so that we construct + * a minimal number of these. + * + * Possibly this should be replaced with an LRU cache so that it's not possible + * for the memory usage to explode from this, but in order for this to be a + * serious problem, one would need to deliberately craft a malicious time zone + * file with many distinct offsets. As of tzdb 2019c, loading every single zone + * fills the cache with ~450 timedeltas for a total size of ~12kB. + * + * This returns a new reference to the timedelta. + */ +static PyObject * +load_timedelta(long seconds) +{ + PyObject *rv = NULL; + PyObject *pyoffset = PyLong_FromLong(seconds); + if (pyoffset == NULL) { + return NULL; + } + int contains = PyDict_Contains(TIMEDELTA_CACHE, pyoffset); + if (contains == -1) { + goto error; + } + + if (!contains) { + PyObject *tmp = PyDateTimeAPI->Delta_FromDelta( + 0, seconds, 0, 1, PyDateTimeAPI->DeltaType); + + if (tmp == NULL) { + goto error; + } + + rv = PyDict_SetDefault(TIMEDELTA_CACHE, pyoffset, tmp); + Py_DECREF(tmp); + } + else { + rv = PyDict_GetItem(TIMEDELTA_CACHE, pyoffset); + } + + Py_DECREF(pyoffset); + Py_INCREF(rv); + return rv; +error: + Py_DECREF(pyoffset); + return NULL; +} + +/* Constructor for _ttinfo object - this starts by initializing the _ttinfo + * to { NULL, NULL, NULL }, so that Py_XDECREF will work on partially + * initialized _ttinfo objects. + */ +static int +build_ttinfo(long utcoffset, long dstoffset, PyObject *tzname, _ttinfo *out) +{ + out->utcoff = NULL; + out->dstoff = NULL; + out->tzname = NULL; + + out->utcoff_seconds = utcoffset; + out->utcoff = load_timedelta(utcoffset); + if (out->utcoff == NULL) { + return -1; + } + + out->dstoff = load_timedelta(dstoffset); + if (out->dstoff == NULL) { + return -1; + } + + out->tzname = tzname; + Py_INCREF(tzname); + + return 0; +} + +/* Decrease reference count on any non-NULL members of a _ttinfo */ +static void +xdecref_ttinfo(_ttinfo *ttinfo) +{ + if (ttinfo != NULL) { + Py_XDECREF(ttinfo->utcoff); + Py_XDECREF(ttinfo->dstoff); + Py_XDECREF(ttinfo->tzname); + } +} + +/* Equality function for _ttinfo. */ +static int +ttinfo_eq(const _ttinfo *const tti0, const _ttinfo *const tti1) +{ + int rv; + if ((rv = PyObject_RichCompareBool(tti0->utcoff, tti1->utcoff, Py_EQ)) < + 1) { + goto end; + } + + if ((rv = PyObject_RichCompareBool(tti0->dstoff, tti1->dstoff, Py_EQ)) < + 1) { + goto end; + } + + if ((rv = PyObject_RichCompareBool(tti0->tzname, tti1->tzname, Py_EQ)) < + 1) { + goto end; + } +end: + return rv; +} + +/* Given a file-like object, this populates a ZoneInfo object + * + * The current version calls into a Python function to read the data from + * file into Python objects, and this translates those Python objects into + * C values and calculates derived values (e.g. dstoff) in C. + * + * This returns 0 on success and -1 on failure. + * + * The function will never return while `self` is partially initialized — + * the object only needs to be freed / deallocated if this succeeds. + */ +static int +load_data(PyZoneInfo_ZoneInfo *self, PyObject *file_obj) +{ + PyObject *data_tuple = NULL; + + long *utcoff = NULL; + long *dstoff = NULL; + size_t *trans_idx = NULL; + unsigned char *isdst = NULL; + + self->trans_list_utc = NULL; + self->trans_list_wall[0] = NULL; + self->trans_list_wall[1] = NULL; + self->trans_ttinfos = NULL; + self->_ttinfos = NULL; + self->file_repr = NULL; + + size_t ttinfos_allocated = 0; + + data_tuple = PyObject_CallMethod(_common_mod, "load_data", "O", file_obj); + + if (data_tuple == NULL) { + goto error; + } + + if (!PyTuple_CheckExact(data_tuple)) { + PyErr_Format(PyExc_TypeError, "Invalid data result type: %r", + data_tuple); + goto error; + } + + // Unpack the data tuple + PyObject *trans_idx_list = PyTuple_GetItem(data_tuple, 0); + if (trans_idx_list == NULL) { + goto error; + } + + PyObject *trans_utc = PyTuple_GetItem(data_tuple, 1); + if (trans_utc == NULL) { + goto error; + } + + PyObject *utcoff_list = PyTuple_GetItem(data_tuple, 2); + if (utcoff_list == NULL) { + goto error; + } + + PyObject *isdst_list = PyTuple_GetItem(data_tuple, 3); + if (isdst_list == NULL) { + goto error; + } + + PyObject *abbr = PyTuple_GetItem(data_tuple, 4); + if (abbr == NULL) { + goto error; + } + + PyObject *tz_str = PyTuple_GetItem(data_tuple, 5); + if (tz_str == NULL) { + goto error; + } + + // Load the relevant sizes + Py_ssize_t num_transitions = PyTuple_Size(trans_utc); + if (num_transitions < 0) { + goto error; + } + + Py_ssize_t num_ttinfos = PyTuple_Size(utcoff_list); + if (num_ttinfos < 0) { + goto error; + } + + self->num_transitions = (size_t)num_transitions; + self->num_ttinfos = (size_t)num_ttinfos; + + // Load the transition indices and list + self->trans_list_utc = + PyMem_Malloc(self->num_transitions * sizeof(int64_t)); + trans_idx = PyMem_Malloc(self->num_transitions * sizeof(Py_ssize_t)); + + for (size_t i = 0; i < self->num_transitions; ++i) { + PyObject *num = PyTuple_GetItem(trans_utc, i); + if (num == NULL) { + goto error; + } + self->trans_list_utc[i] = PyLong_AsLongLong(num); + if (self->trans_list_utc[i] == -1 && PyErr_Occurred()) { + goto error; + } + + num = PyTuple_GetItem(trans_idx_list, i); + if (num == NULL) { + goto error; + } + + Py_ssize_t cur_trans_idx = PyLong_AsSsize_t(num); + if (cur_trans_idx == -1) { + goto error; + } + + trans_idx[i] = (size_t)cur_trans_idx; + if (trans_idx[i] > self->num_ttinfos) { + PyErr_Format( + PyExc_ValueError, + "Invalid transition index found while reading TZif: %zd", + cur_trans_idx); + + goto error; + } + } + + // Load UTC offsets and isdst (size num_ttinfos) + utcoff = PyMem_Malloc(self->num_ttinfos * sizeof(long)); + isdst = PyMem_Malloc(self->num_ttinfos * sizeof(unsigned char)); + + if (utcoff == NULL || isdst == NULL) { + goto error; + } + for (size_t i = 0; i < self->num_ttinfos; ++i) { + PyObject *num = PyTuple_GetItem(utcoff_list, i); + if (num == NULL) { + goto error; + } + + utcoff[i] = PyLong_AsLong(num); + if (utcoff[i] == -1 && PyErr_Occurred()) { + goto error; + } + + num = PyTuple_GetItem(isdst_list, i); + if (num == NULL) { + goto error; + } + + int isdst_with_error = PyObject_IsTrue(num); + if (isdst_with_error == -1) { + goto error; + } + else { + isdst[i] = (unsigned char)isdst_with_error; + } + } + + dstoff = PyMem_Calloc(self->num_ttinfos, sizeof(long)); + if (dstoff == NULL) { + goto error; + } + + // Derive dstoff and trans_list_wall from the information we've loaded + utcoff_to_dstoff(trans_idx, utcoff, dstoff, isdst, self->num_transitions, + self->num_ttinfos); + + if (ts_to_local(trans_idx, self->trans_list_utc, utcoff, + self->trans_list_wall, self->num_ttinfos, + self->num_transitions)) { + goto error; + } + + // Build _ttinfo objects from utcoff, dstoff and abbr + self->_ttinfos = PyMem_Malloc(self->num_ttinfos * sizeof(_ttinfo)); + for (size_t i = 0; i < self->num_ttinfos; ++i) { + PyObject *tzname = PyTuple_GetItem(abbr, i); + if (tzname == NULL) { + goto error; + } + + ttinfos_allocated++; + if (build_ttinfo(utcoff[i], dstoff[i], tzname, &(self->_ttinfos[i]))) { + goto error; + } + } + + // Build our mapping from transition to the ttinfo that applies + self->trans_ttinfos = + PyMem_Calloc(self->num_transitions, sizeof(_ttinfo *)); + for (size_t i = 0; i < self->num_transitions; ++i) { + size_t ttinfo_idx = trans_idx[i]; + assert(ttinfo_idx < self->num_ttinfos); + self->trans_ttinfos[i] = &(self->_ttinfos[ttinfo_idx]); + } + + // Set ttinfo_before to the first non-DST transition + for (size_t i = 0; i < self->num_ttinfos; ++i) { + if (!isdst[i]) { + self->ttinfo_before = &(self->_ttinfos[i]); + break; + } + } + + // If there are only DST ttinfos, pick the first one, if there are no + // ttinfos at all, set ttinfo_before to NULL + if (self->ttinfo_before == NULL && self->num_ttinfos > 0) { + self->ttinfo_before = &(self->_ttinfos[0]); + } + + if (tz_str != Py_None && PyObject_IsTrue(tz_str)) { + if (parse_tz_str(tz_str, &(self->tzrule_after))) { + goto error; + } + } + else { + if (!self->num_ttinfos) { + PyErr_Format(PyExc_ValueError, "No time zone information found."); + goto error; + } + + size_t idx; + if (!self->num_transitions) { + idx = self->num_ttinfos - 1; + } + else { + idx = trans_idx[self->num_transitions - 1]; + } + + _ttinfo *tti = &(self->_ttinfos[idx]); + build_tzrule(tti->tzname, NULL, tti->utcoff_seconds, 0, NULL, NULL, + &(self->tzrule_after)); + + // We've abused the build_tzrule constructor to construct an STD-only + // rule mimicking whatever ttinfo we've picked up, but it's possible + // that the one we've picked up is a DST zone, so we need to make sure + // that the dstoff is set correctly in that case. + if (PyObject_IsTrue(tti->dstoff)) { + _ttinfo *tti_after = &(self->tzrule_after.std); + Py_DECREF(tti_after->dstoff); + tti_after->dstoff = tti->dstoff; + Py_INCREF(tti_after->dstoff); + } + } + + // Determine if this is a "fixed offset" zone, meaning that the output of + // the utcoffset, dst and tzname functions does not depend on the specific + // datetime passed. + // + // We make three simplifying assumptions here: + // + // 1. If tzrule_after is not std_only, it has transitions that might occur + // (it is possible to construct TZ strings that specify STD and DST but + // no transitions ever occur, such as AAA0BBB,0/0,J365/25). + // 2. If self->_ttinfos contains more than one _ttinfo object, the objects + // represent different offsets. + // 3. self->ttinfos contains no unused _ttinfos (in which case an otherwise + // fixed-offset zone with extra _ttinfos defined may appear to *not* be + // a fixed offset zone). + // + // Violations to these assumptions would be fairly exotic, and exotic + // zones should almost certainly not be used with datetime.time (the + // only thing that would be affected by this). + if (self->num_ttinfos > 1 || !self->tzrule_after.std_only) { + self->fixed_offset = 0; + } + else if (self->num_ttinfos == 0) { + self->fixed_offset = 1; + } + else { + int constant_offset = + ttinfo_eq(&(self->_ttinfos[0]), &self->tzrule_after.std); + if (constant_offset < 0) { + goto error; + } + else { + self->fixed_offset = constant_offset; + } + } + + int rv = 0; + goto cleanup; +error: + // These resources only need to be freed if we have failed, if we succeed + // in initializing a PyZoneInfo_ZoneInfo object, we can rely on its dealloc + // method to free the relevant resources. + if (self->trans_list_utc != NULL) { + PyMem_Free(self->trans_list_utc); + self->trans_list_utc = NULL; + } + + for (size_t i = 0; i < 2; ++i) { + if (self->trans_list_wall[i] != NULL) { + PyMem_Free(self->trans_list_wall[i]); + self->trans_list_wall[i] = NULL; + } + } + + if (self->_ttinfos != NULL) { + for (size_t i = 0; i < ttinfos_allocated; ++i) { + xdecref_ttinfo(&(self->_ttinfos[i])); + } + PyMem_Free(self->_ttinfos); + self->_ttinfos = NULL; + } + + if (self->trans_ttinfos != NULL) { + PyMem_Free(self->trans_ttinfos); + self->trans_ttinfos = NULL; + } + + rv = -1; +cleanup: + Py_XDECREF(data_tuple); + + if (utcoff != NULL) { + PyMem_Free(utcoff); + } + + if (dstoff != NULL) { + PyMem_Free(dstoff); + } + + if (isdst != NULL) { + PyMem_Free(isdst); + } + + if (trans_idx != NULL) { + PyMem_Free(trans_idx); + } + + return rv; +} + +/* Function to calculate the local timestamp of a transition from the year. */ +int64_t +calendarrule_year_to_timestamp(TransitionRuleType *base_self, int year) +{ + CalendarRule *self = (CalendarRule *)base_self; + + // We want (year, month, day of month); we have year and month, but we + // need to turn (week, day-of-week) into day-of-month + // + // Week 1 is the first week in which day `day` (where 0 = Sunday) appears. + // Week 5 represents the last occurrence of day `day`, so we need to know + // the first weekday of the month and the number of days in the month. + int8_t first_day = (ymd_to_ord(year, self->month, 1) + 6) % 7; + uint8_t days_in_month = DAYS_IN_MONTH[self->month]; + if (self->month == 2 && is_leap_year(year)) { + days_in_month += 1; + } + + // This equation seems magical, so I'll break it down: + // 1. calendar says 0 = Monday, POSIX says 0 = Sunday so we need first_day + // + 1 to get 1 = Monday -> 7 = Sunday, which is still equivalent + // because this math is mod 7 + // 2. Get first day - desired day mod 7 (adjusting by 7 for negative + // numbers so that -1 % 7 = 6). + // 3. Add 1 because month days are a 1-based index. + int8_t month_day = ((int8_t)(self->day) - (first_day + 1)) % 7; + if (month_day < 0) { + month_day += 7; + } + month_day += 1; + + // Now use a 0-based index version of `week` to calculate the w-th + // occurrence of `day` + month_day += ((int8_t)(self->week) - 1) * 7; + + // month_day will only be > days_in_month if w was 5, and `w` means "last + // occurrence of `d`", so now we just check if we over-shot the end of the + // month and if so knock off 1 week. + if (month_day > days_in_month) { + month_day -= 7; + } + + int64_t ordinal = ymd_to_ord(year, self->month, month_day) - EPOCHORDINAL; + return ((ordinal * 86400) + (int64_t)(self->hour * 3600) + + (int64_t)(self->minute * 60) + (int64_t)(self->second)); +} + +/* Constructor for CalendarRule. */ +int +calendarrule_new(uint8_t month, uint8_t week, uint8_t day, int8_t hour, + int8_t minute, int8_t second, CalendarRule *out) +{ + // These bounds come from the POSIX standard, which describes an Mm.n.d + // rule as: + // + // The d'th day (0 <= d <= 6) of week n of month m of the year (1 <= n <= + // 5, 1 <= m <= 12, where week 5 means "the last d day in month m" which + // may occur in either the fourth or the fifth week). Week 1 is the first + // week in which the d'th day occurs. Day zero is Sunday. + if (month <= 0 || month > 12) { + PyErr_Format(PyExc_ValueError, "Month must be in (0, 12]"); + return -1; + } + + if (week <= 0 || week > 5) { + PyErr_Format(PyExc_ValueError, "Week must be in (0, 5]"); + return -1; + } + + // day is an unsigned integer, so day < 0 should always return false, but + // if day's type changes to a signed integer *without* changing this value, + // it may create a bug. Considering that the compiler should be able to + // optimize out the first comparison if day is an unsigned integer anyway, + // we will leave this comparison in place and disable the compiler warning. +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" + if (day < 0 || day > 6) { +#pragma GCC diagnostic pop + PyErr_Format(PyExc_ValueError, "Day must be in [0, 6]"); + return -1; + } + + TransitionRuleType base = {&calendarrule_year_to_timestamp}; + + CalendarRule new_offset = { + .base = base, + .month = month, + .week = week, + .day = day, + .hour = hour, + .minute = minute, + .second = second, + }; + + *out = new_offset; + return 0; +} + +/* Function to calculate the local timestamp of a transition from the year. + * + * This translates the day of the year into a local timestamp — either a + * 1-based Julian day, not including leap days, or the 0-based year-day, + * including leap days. + * */ +int64_t +dayrule_year_to_timestamp(TransitionRuleType *base_self, int year) +{ + // The function signature requires a TransitionRuleType pointer, but this + // function is only applicable to DayRule* objects. + DayRule *self = (DayRule *)base_self; + + // ymd_to_ord calculates the number of days since 0001-01-01, but we want + // to know the number of days since 1970-01-01, so we must subtract off + // the equivalent of ymd_to_ord(1970, 1, 1). + // + // We subtract off an additional 1 day to account for January 1st (we want + // the number of full days *before* the date of the transition - partial + // days are accounted for in the hour, minute and second portions. + int64_t days_before_year = ymd_to_ord(year, 1, 1) - EPOCHORDINAL - 1; + + // The Julian day specification skips over February 29th in leap years, + // from the POSIX standard: + // + // Leap days shall not be counted. That is, in all years-including leap + // years-February 28 is day 59 and March 1 is day 60. It is impossible to + // refer explicitly to the occasional February 29. + // + // This is actually more useful than you'd think — if you want a rule that + // always transitions on a given calendar day (other than February 29th), + // you would use a Julian day, e.g. J91 always refers to April 1st and J365 + // always refers to December 31st. + unsigned int day = self->day; + if (self->julian && day >= 59 && is_leap_year(year)) { + day += 1; + } + + return ((days_before_year + day) * 86400) + (self->hour * 3600) + + (self->minute * 60) + self->second; +} + +/* Constructor for DayRule. */ +static int +dayrule_new(uint8_t julian, unsigned int day, int8_t hour, int8_t minute, + int8_t second, DayRule *out) +{ + // The POSIX standard specifies that Julian days must be in the range (1 <= + // n <= 365) and that non-Julian (they call it "0-based Julian") days must + // be in the range (0 <= n <= 365). + if (day < julian || day > 365) { + PyErr_Format(PyExc_ValueError, "day must be in [%u, 365], not: %u", + julian, day); + return -1; + } + + TransitionRuleType base = { + &dayrule_year_to_timestamp, + }; + + DayRule tmp = { + .base = base, + .julian = julian, + .day = day, + .hour = hour, + .minute = minute, + .second = second, + }; + + *out = tmp; + + return 0; +} + +/* Calculate the start and end rules for a _tzrule in the given year. */ +static void +tzrule_transitions(_tzrule *rule, int year, int64_t *start, int64_t *end) +{ + assert(rule->start != NULL); + assert(rule->end != NULL); + *start = rule->start->year_to_timestamp(rule->start, year); + *end = rule->end->year_to_timestamp(rule->end, year); +} + +/* Calculate the _ttinfo that applies at a given local time from a _tzrule. + * + * This takes a local timestamp and fold for disambiguation purposes; the year + * could technically be calculated from the timestamp, but given that the + * callers of this function already have the year information accessible from + * the datetime struct, it is taken as an additional parameter to reduce + * unncessary calculation. + * */ +static _ttinfo * +find_tzrule_ttinfo(_tzrule *rule, int64_t ts, unsigned char fold, int year) +{ + if (rule->std_only) { + return &(rule->std); + } + + int64_t start, end; + uint8_t isdst; + + tzrule_transitions(rule, year, &start, &end); + + // With fold = 0, the period (denominated in local time) with the smaller + // offset starts at the end of the gap and ends at the end of the fold; + // with fold = 1, it runs from the start of the gap to the beginning of the + // fold. + // + // So in order to determine the DST boundaries we need to know both the + // fold and whether DST is positive or negative (rare), and it turns out + // that this boils down to fold XOR is_positive. + if (fold == (rule->dst_diff >= 0)) { + end -= rule->dst_diff; + } + else { + start += rule->dst_diff; + } + + if (start < end) { + isdst = (ts >= start) && (ts < end); + } + else { + isdst = (ts < end) || (ts >= start); + } + + if (isdst) { + return &(rule->dst); + } + else { + return &(rule->std); + } +} + +/* Calculate the ttinfo and fold that applies for a _tzrule at an epoch time. + * + * This function can determine the _ttinfo that applies at a given epoch time, + * (analogous to trans_list_utc), and whether or not the datetime is in a fold. + * This is to be used in the .fromutc() function. + * + * The year is technically a redundant parameter, because it can be calculated + * from the timestamp, but all callers of this function should have the year + * in the datetime struct anyway, so taking it as a parameter saves unnecessary + * calculation. + **/ +static _ttinfo * +find_tzrule_ttinfo_fromutc(_tzrule *rule, int64_t ts, int year, + unsigned char *fold) +{ + if (rule->std_only) { + *fold = 0; + return &(rule->std); + } + + int64_t start, end; + uint8_t isdst; + tzrule_transitions(rule, year, &start, &end); + start -= rule->std.utcoff_seconds; + end -= rule->dst.utcoff_seconds; + + if (start < end) { + isdst = (ts >= start) && (ts < end); + } + else { + isdst = (ts < end) || (ts >= start); + } + + // For positive DST, the ambiguous period is one dst_diff after the end of + // DST; for negative DST, the ambiguous period is one dst_diff before the + // start of DST. + int64_t ambig_start, ambig_end; + if (rule->dst_diff > 0) { + ambig_start = end; + ambig_end = end + rule->dst_diff; + } + else { + ambig_start = start; + ambig_end = start - rule->dst_diff; + } + + *fold = (ts >= ambig_start) && (ts < ambig_end); + + if (isdst) { + return &(rule->dst); + } + else { + return &(rule->std); + } +} + +/* Parse a TZ string in the format specified by the POSIX standard: + * + * std offset[dst[offset],start[/time],end[/time]] + * + * std and dst must be 3 or more characters long and must not contain a + * leading colon, embedded digits, commas, nor a plus or minus signs; The + * spaces between "std" and "offset" are only for display and are not actually + * present in the string. + * + * The format of the offset is ``[+|-]hh[:mm[:ss]]`` + * + * See the POSIX.1 spec: IEE Std 1003.1-2018 §8.3: + * + * https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html + */ +static int +parse_tz_str(PyObject *tz_str_obj, _tzrule *out) +{ + PyObject *std_abbr = NULL; + PyObject *dst_abbr = NULL; + TransitionRuleType *start = NULL; + TransitionRuleType *end = NULL; + // Initialize offsets to invalid value (> 24 hours) + long std_offset = 1 << 20; + long dst_offset = 1 << 20; + + char *tz_str = PyBytes_AsString(tz_str_obj); + if (tz_str == NULL) { + return -1; + } + char *p = tz_str; + + // Read the `std` abbreviation, which must be at least 3 characters long. + Py_ssize_t num_chars = parse_abbr(p, &std_abbr); + if (num_chars < 1) { + PyErr_Format(PyExc_ValueError, "Invalid STD format in %R", tz_str_obj); + goto error; + } + + p += num_chars; + + // Now read the STD offset, which is required + num_chars = parse_tz_delta(p, &std_offset); + if (num_chars < 0) { + PyErr_Format(PyExc_ValueError, "Invalid STD offset in %R", tz_str_obj); + goto error; + } + p += num_chars; + + // If the string ends here, there is no DST, otherwise we must parse the + // DST abbreviation and start and end dates and times. + if (*p == '\0') { + goto complete; + } + + num_chars = parse_abbr(p, &dst_abbr); + if (num_chars < 1) { + PyErr_Format(PyExc_ValueError, "Invalid DST format in %R", tz_str_obj); + goto error; + } + p += num_chars; + + if (*p == ',') { + // From the POSIX standard: + // + // If no offset follows dst, the alternative time is assumed to be one + // hour ahead of standard time. + dst_offset = std_offset + 3600; + } + else { + num_chars = parse_tz_delta(p, &dst_offset); + if (num_chars < 0) { + PyErr_Format(PyExc_ValueError, "Invalid DST offset in %R", + tz_str_obj); + goto error; + } + + p += num_chars; + } + + TransitionRuleType **transitions[2] = {&start, &end}; + for (size_t i = 0; i < 2; ++i) { + if (*p != ',') { + PyErr_Format(PyExc_ValueError, + "Missing transition rules in TZ string: %R", + tz_str_obj); + goto error; + } + p++; + + num_chars = parse_transition_rule(p, transitions[i]); + if (num_chars < 0) { + PyErr_Format(PyExc_ValueError, + "Malformed transition rule in TZ string: %R", + tz_str_obj); + goto error; + } + p += num_chars; + } + + if (*p != '\0') { + PyErr_Format(PyExc_ValueError, + "Extraneous characters at end of TZ string: %R", + tz_str_obj); + goto error; + } + +complete: + build_tzrule(std_abbr, dst_abbr, std_offset, dst_offset, start, end, out); + Py_DECREF(std_abbr); + Py_XDECREF(dst_abbr); + + return 0; +error: + Py_XDECREF(std_abbr); + if (dst_abbr != NULL && dst_abbr != Py_None) { + Py_DECREF(dst_abbr); + } + + if (start != NULL) { + PyMem_Free(start); + } + + if (end != NULL) { + PyMem_Free(end); + } + + return -1; +} + +static int +parse_uint(const char *const p, uint8_t *value) +{ + if (!isdigit(*p)) { + return -1; + } + + *value = (*p) - '0'; + return 0; +} + +/* Parse the STD and DST abbreviations from a TZ string. */ +static Py_ssize_t +parse_abbr(const char *const p, PyObject **abbr) +{ + const char *ptr = p; + char buff = *ptr; + const char *str_start; + const char *str_end; + + if (*ptr == '<') { + ptr++; + str_start = ptr; + while ((buff = *ptr) != '>') { + // From the POSIX standard: + // + // In the quoted form, the first character shall be the less-than + // ( '<' ) character and the last character shall be the + // greater-than ( '>' ) character. All characters between these + // quoting characters shall be alphanumeric characters from the + // portable character set in the current locale, the plus-sign ( + // '+' ) character, or the minus-sign ( '-' ) character. The std + // and dst fields in this case shall not include the quoting + // characters. + if (!isalpha(buff) && !isdigit(buff) && buff != '+' && + buff != '-') { + return -1; + } + ptr++; + } + str_end = ptr; + ptr++; + } + else { + str_start = p; + // From the POSIX standard: + // + // In the unquoted form, all characters in these fields shall be + // alphabetic characters from the portable character set in the + // current locale. + while (isalpha(*ptr)) { + ptr++; + } + str_end = ptr; + } + + *abbr = PyUnicode_FromStringAndSize(str_start, str_end - str_start); + if (*abbr == NULL) { + return -1; + } + + return ptr - p; +} + +/* Parse a UTC offset from a TZ str. */ +static Py_ssize_t +parse_tz_delta(const char *const p, long *total_seconds) +{ + // From the POSIX spec: + // + // Indicates the value added to the local time to arrive at Coordinated + // Universal Time. The offset has the form: + // + // hh[:mm[:ss]] + // + // One or more digits may be used; the value is always interpreted as a + // decimal number. + // + // The POSIX spec says that the values for `hour` must be between 0 and 24 + // hours, but RFC 8536 §3.3.1 specifies that the hours part of the + // transition times may be signed and range from -167 to 167. + long sign = -1; + long hours = 0; + long minutes = 0; + long seconds = 0; + + const char *ptr = p; + char buff = *ptr; + if (buff == '-' || buff == '+') { + // Negative numbers correspond to *positive* offsets, from the spec: + // + // If preceded by a '-', the timezone shall be east of the Prime + // Meridian; otherwise, it shall be west (which may be indicated by + // an optional preceding '+' ). + if (buff == '-') { + sign = 1; + } + + ptr++; + } + + // The hour can be 1 or 2 numeric characters + for (size_t i = 0; i < 2; ++i) { + buff = *ptr; + if (!isdigit(buff)) { + if (i == 0) { + return -1; + } + else { + break; + } + } + + hours *= 10; + hours += buff - '0'; + ptr++; + } + + if (hours > 24 || hours < 0) { + return -1; + } + + // Minutes and seconds always of the format ":dd" + long *outputs[2] = {&minutes, &seconds}; + for (size_t i = 0; i < 2; ++i) { + if (*ptr != ':') { + goto complete; + } + ptr++; + + for (size_t j = 0; j < 2; ++j) { + buff = *ptr; + if (!isdigit(buff)) { + return -1; + } + *(outputs[i]) *= 10; + *(outputs[i]) += buff - '0'; + ptr++; + } + } + +complete: + *total_seconds = sign * ((hours * 3600) + (minutes * 60) + seconds); + + return ptr - p; +} + +/* Parse the date portion of a transition rule. */ +static Py_ssize_t +parse_transition_rule(const char *const p, TransitionRuleType **out) +{ + // The full transition rule indicates when to change back and forth between + // STD and DST, and has the form: + // + // date[/time],date[/time] + // + // This function parses an individual date[/time] section, and returns + // the number of characters that contributed to the transition rule. This + // does not include the ',' at the end of the first rule. + // + // The POSIX spec states that if *time* is not given, the default is 02:00. + const char *ptr = p; + int8_t hour = 2; + int8_t minute = 0; + int8_t second = 0; + + // Rules come in one of three flavors: + // + // 1. Jn: Julian day n, with no leap days. + // 2. n: Day of year (0-based, with leap days) + // 3. Mm.n.d: Specifying by month, week and day-of-week. + + if (*ptr == 'M') { + uint8_t month, week, day; + ptr++; + if (parse_uint(ptr, &month)) { + return -1; + } + ptr++; + if (*ptr != '.') { + uint8_t tmp; + if (parse_uint(ptr, &tmp)) { + return -1; + } + + month *= 10; + month += tmp; + ptr++; + } + + uint8_t *values[2] = {&week, &day}; + for (size_t i = 0; i < 2; ++i) { + if (*ptr != '.') { + return -1; + } + ptr++; + + if (parse_uint(ptr, values[i])) { + return -1; + } + ptr++; + } + + if (*ptr == '/') { + ptr++; + Py_ssize_t num_chars = + parse_transition_time(ptr, &hour, &minute, &second); + if (num_chars < 0) { + return -1; + } + ptr += num_chars; + } + + CalendarRule *rv = PyMem_Calloc(1, sizeof(CalendarRule)); + if (rv == NULL) { + return -1; + } + + if (calendarrule_new(month, week, day, hour, minute, second, rv)) { + PyMem_Free(rv); + return -1; + } + + *out = (TransitionRuleType *)rv; + } + else { + uint8_t julian = 0; + unsigned int day = 0; + if (*ptr == 'J') { + julian = 1; + ptr++; + } + + for (size_t i = 0; i < 3; ++i) { + if (!isdigit(*ptr)) { + if (i == 0) { + return -1; + } + break; + } + day *= 10; + day += (*ptr) - '0'; + ptr++; + } + + if (*ptr == '/') { + ptr++; + Py_ssize_t num_chars = + parse_transition_time(ptr, &hour, &minute, &second); + if (num_chars < 0) { + return -1; + } + ptr += num_chars; + } + + DayRule *rv = PyMem_Calloc(1, sizeof(DayRule)); + if (rv == NULL) { + return -1; + } + + if (dayrule_new(julian, day, hour, minute, second, rv)) { + PyMem_Free(rv); + return -1; + } + *out = (TransitionRuleType *)rv; + } + + return ptr - p; +} + +/* Parse the time portion of a transition rule (e.g. following an /) */ +static Py_ssize_t +parse_transition_time(const char *const p, int8_t *hour, int8_t *minute, + int8_t *second) +{ + // From the spec: + // + // The time has the same format as offset except that no leading sign + // ( '-' or '+' ) is allowed. + // + // The format for the offset is: + // + // h[h][:mm[:ss]] + // + // RFC 8536 also allows transition times to be signed and to range from + // -167 to +167, but the current version only supports [0, 99]. + // + // TODO: Support the full range of transition hours. + int8_t *components[3] = {hour, minute, second}; + const char *ptr = p; + int8_t sign = 1; + + if (*ptr == '-' || *ptr == '+') { + if (*ptr == '-') { + sign = -1; + } + ptr++; + } + + for (size_t i = 0; i < 3; ++i) { + if (i > 0) { + if (*ptr != ':') { + break; + } + ptr++; + } + + uint8_t buff = 0; + for (size_t j = 0; j < 2; j++) { + if (!isdigit(*ptr)) { + if (i == 0 && j > 0) { + break; + } + return -1; + } + + buff *= 10; + buff += (*ptr) - '0'; + ptr++; + } + + *(components[i]) = sign * buff; + } + + return ptr - p; +} + +/* Constructor for a _tzrule. + * + * If `dst_abbr` is NULL, this will construct an "STD-only" _tzrule, in which + * case `dst_offset` will be ignored and `start` and `end` are expected to be + * NULL as well. + * + * Returns 0 on success. + */ +static int +build_tzrule(PyObject *std_abbr, PyObject *dst_abbr, long std_offset, + long dst_offset, TransitionRuleType *start, + TransitionRuleType *end, _tzrule *out) +{ + _tzrule rv = {{0}}; + + rv.start = start; + rv.end = end; + + if (build_ttinfo(std_offset, 0, std_abbr, &rv.std)) { + goto error; + } + + if (dst_abbr != NULL) { + rv.dst_diff = dst_offset - std_offset; + if (build_ttinfo(dst_offset, rv.dst_diff, dst_abbr, &rv.dst)) { + goto error; + } + } + else { + rv.std_only = 1; + } + + *out = rv; + + return 0; +error: + xdecref_ttinfo(&rv.std); + xdecref_ttinfo(&rv.dst); + return -1; +} + +/* Destructor for _tzrule. */ +static void +free_tzrule(_tzrule *tzrule) +{ + xdecref_ttinfo(&(tzrule->std)); + if (!tzrule->std_only) { + xdecref_ttinfo(&(tzrule->dst)); + } + + if (tzrule->start != NULL) { + PyMem_Free(tzrule->start); + } + + if (tzrule->end != NULL) { + PyMem_Free(tzrule->end); + } +} + +/* Calculate DST offsets from transitions and UTC offsets + * + * This is necessary because each C `ttinfo` only contains the UTC offset, + * time zone abbreviation and an isdst boolean - it does not include the + * amount of the DST offset, but we need the amount for the dst() function. + * + * Thus function uses heuristics to infer what the offset should be, so it + * is not guaranteed that this will work for all zones. If we cannot assign + * a value for a given DST offset, we'll assume it's 1H rather than 0H, so + * bool(dt.dst()) will always match ttinfo.isdst. + */ +static void +utcoff_to_dstoff(size_t *trans_idx, long *utcoffs, long *dstoffs, + unsigned char *isdsts, size_t num_transitions, + size_t num_ttinfos) +{ + size_t dst_count = 0; + size_t dst_found = 0; + for (size_t i = 0; i < num_ttinfos; ++i) { + dst_count++; + } + + for (size_t i = 1; i < num_transitions; ++i) { + if (dst_count == dst_found) { + break; + } + + size_t idx = trans_idx[i]; + size_t comp_idx = trans_idx[i - 1]; + + // Only look at DST offsets that have nto been assigned already + if (!isdsts[idx] || dstoffs[idx] != 0) { + continue; + } + + long dstoff = 0; + long utcoff = utcoffs[idx]; + + if (!isdsts[comp_idx]) { + dstoff = utcoff - utcoffs[comp_idx]; + } + + if (!dstoff && idx < (num_ttinfos - 1)) { + comp_idx = trans_idx[i + 1]; + + // If the following transition is also DST and we couldn't find + // the DST offset by this point, we're going to have to skip it + // and hope this transition gets assigned later + if (isdsts[comp_idx]) { + continue; + } + + dstoff = utcoff - utcoffs[comp_idx]; + } + + if (dstoff) { + dst_found++; + dstoffs[idx] = dstoff; + } + } + + if (dst_found < dst_count) { + // If there are time zones we didn't find a value for, we'll end up + // with dstoff = 0 for something where isdst=1. This is obviously + // wrong — one hour will be a much better guess than 0. + for (size_t idx = 0; idx < num_ttinfos; ++idx) { + if (isdsts[idx] && !dstoffs[idx]) { + dstoffs[idx] = 3600; + } + } + } +} + +#define _swap(x, y, buffer) \ + buffer = x; \ + x = y; \ + y = buffer; + +/* Calculate transitions in local time from UTC time and offsets. + * + * We want to know when each transition occurs, denominated in the number of + * nominal wall-time seconds between 1970-01-01T00:00:00 and the transition in + * *local time* (note: this is *not* equivalent to the output of + * datetime.timestamp, which is the total number of seconds actual elapsed + * since 1970-01-01T00:00:00Z in UTC). + * + * This is an ambiguous question because "local time" can be ambiguous — but it + * is disambiguated by the `fold` parameter, so we allocate two arrays: + * + * trans_local[0]: The wall-time transitions for fold=0 + * trans_local[1]: The wall-time transitions for fold=1 + * + * This returns 0 on success and a negative number of failure. The trans_local + * arrays must be freed if they are not NULL. + */ +static int +ts_to_local(size_t *trans_idx, int64_t *trans_utc, long *utcoff, + int64_t *trans_local[2], size_t num_ttinfos, + size_t num_transitions) +{ + if (num_transitions == 0) { + return 0; + } + + // Copy the UTC transitions into each array to be modified in place later + for (size_t i = 0; i < 2; ++i) { + trans_local[i] = PyMem_Malloc(num_transitions * sizeof(int64_t)); + if (trans_local[i] == NULL) { + return -1; + } + + memcpy(trans_local[i], trans_utc, num_transitions * sizeof(int64_t)); + } + + int64_t offset_0, offset_1, buff; + if (num_ttinfos > 1) { + offset_0 = utcoff[0]; + offset_1 = utcoff[trans_idx[0]]; + + if (offset_1 > offset_0) { + _swap(offset_0, offset_1, buff); + } + } + else { + offset_0 = utcoff[0]; + offset_1 = utcoff[0]; + } + + trans_local[0][0] += offset_0; + trans_local[1][0] += offset_1; + + for (size_t i = 1; i < num_transitions; ++i) { + offset_0 = utcoff[trans_idx[i - 1]]; + offset_1 = utcoff[trans_idx[i]]; + + if (offset_1 > offset_0) { + _swap(offset_1, offset_0, buff); + } + + trans_local[0][i] += offset_0; + trans_local[1][i] += offset_1; + } + + return 0; +} + +/* Simple bisect_right binary search implementation */ +static size_t +_bisect(const int64_t value, const int64_t *arr, size_t size) +{ + size_t lo = 0; + size_t hi = size; + size_t m; + + while (lo < hi) { + m = (lo + hi) / 2; + if (arr[m] > value) { + hi = m; + } + else { + lo = m + 1; + } + } + + return hi; +} + +/* Find the ttinfo rules that apply at a given local datetime. */ +static _ttinfo * +find_ttinfo(PyZoneInfo_ZoneInfo *self, PyObject *dt) +{ + // datetime.time has a .tzinfo attribute that passes None as the dt + // argument; it only really has meaning for fixed-offset zones. + if (dt == Py_None) { + if (self->fixed_offset) { + return &(self->tzrule_after.std); + } + else { + return &NO_TTINFO; + } + } + + int64_t ts; + if (get_local_timestamp(dt, &ts)) { + return NULL; + } + + unsigned char fold = PyDateTime_DATE_GET_FOLD(dt); + assert(fold < 2); + int64_t *local_transitions = self->trans_list_wall[fold]; + size_t num_trans = self->num_transitions; + + if (num_trans && ts < local_transitions[0]) { + return self->ttinfo_before; + } + else if (!num_trans || ts > local_transitions[self->num_transitions - 1]) { + return find_tzrule_ttinfo(&(self->tzrule_after), ts, fold, + PyDateTime_GET_YEAR(dt)); + } + else { + size_t idx = _bisect(ts, local_transitions, self->num_transitions) - 1; + assert(idx < self->num_transitions); + return self->trans_ttinfos[idx]; + } +} + +static int +is_leap_year(int year) +{ + const unsigned int ayear = (unsigned int)year; + return ayear % 4 == 0 && (ayear % 100 != 0 || ayear % 400 == 0); +} + +/* Calculates ordinal datetime from year, month and day. */ +static int +ymd_to_ord(int y, int m, int d) +{ + y -= 1; + int days_before_year = (y * 365) + (y / 4) - (y / 100) + (y / 400); + int yearday = DAYS_BEFORE_MONTH[m]; + if (m > 2 && is_leap_year(y + 1)) { + yearday += 1; + } + + return days_before_year + yearday + d; +} + +/* Calculate the number of seconds since 1970-01-01 in local time. + * + * This gets a datetime in the same "units" as self->trans_list_wall so that we + * can easily determine which transitions a datetime falls between. See the + * comment above ts_to_local for more information. + * */ +static int +get_local_timestamp(PyObject *dt, int64_t *local_ts) +{ + assert(local_ts != NULL); + + int hour, minute, second; + int ord; + if (PyDateTime_CheckExact(dt)) { + int y = PyDateTime_GET_YEAR(dt); + int m = PyDateTime_GET_MONTH(dt); + int d = PyDateTime_GET_DAY(dt); + hour = PyDateTime_DATE_GET_HOUR(dt); + minute = PyDateTime_DATE_GET_MINUTE(dt); + second = PyDateTime_DATE_GET_SECOND(dt); + + ord = ymd_to_ord(y, m, d); + } + else { + PyObject *num = PyObject_CallMethod(dt, "toordinal", NULL); + if (num == NULL) { + return -1; + } + + ord = PyLong_AsLong(num); + Py_DECREF(num); + if (ord == -1 && PyErr_Occurred()) { + return -1; + } + + num = PyObject_GetAttrString(dt, "hour"); + if (num == NULL) { + return -1; + } + hour = PyLong_AsLong(num); + Py_DECREF(num); + if (hour == -1) { + return -1; + } + + num = PyObject_GetAttrString(dt, "minute"); + if (num == NULL) { + return -1; + } + minute = PyLong_AsLong(num); + Py_DECREF(num); + if (minute == -1) { + return -1; + } + + num = PyObject_GetAttrString(dt, "second"); + if (num == NULL) { + return -1; + } + second = PyLong_AsLong(num); + Py_DECREF(num); + if (second == -1) { + return -1; + } + } + + *local_ts = (int64_t)(ord - EPOCHORDINAL) * 86400 + + (int64_t)(hour * 3600 + minute * 60 + second); + + return 0; +} + +///// +// Functions for cache handling + +/* Constructor for StrongCacheNode */ +static StrongCacheNode * +strong_cache_node_new(PyObject *key, PyObject *zone) +{ + StrongCacheNode *node = PyMem_Malloc(sizeof(StrongCacheNode)); + if (node == NULL) { + return NULL; + } + + Py_INCREF(key); + Py_INCREF(zone); + + node->next = NULL; + node->prev = NULL; + node->key = key; + node->zone = zone; + + return node; +} + +/* Destructor for StrongCacheNode */ +void +strong_cache_node_free(StrongCacheNode *node) +{ + Py_XDECREF(node->key); + Py_XDECREF(node->zone); + + PyMem_Free(node); +} + +/* Frees all nodes at or after a specified root in the strong cache. + * + * This can be used on the root node to free the entire cache or it can be used + * to clear all nodes that have been expired (which, if everything is going + * right, will actually only be 1 node at a time). + */ +void +strong_cache_free(StrongCacheNode *root) +{ + StrongCacheNode *node = root; + StrongCacheNode *next_node; + while (node != NULL) { + next_node = node->next; + strong_cache_node_free(node); + + node = next_node; + } +} + +/* Removes a node from the cache and update its neighbors. + * + * This is used both when ejecting a node from the cache and when moving it to + * the front of the cache. + */ +static void +remove_from_strong_cache(StrongCacheNode *node) +{ + if (ZONEINFO_STRONG_CACHE == node) { + ZONEINFO_STRONG_CACHE = node->next; + } + + if (node->prev != NULL) { + node->prev->next = node->next; + } + + if (node->next != NULL) { + node->next->prev = node->prev; + } + + node->next = NULL; + node->prev = NULL; +} + +/* Retrieves the node associated with a key, if it exists. + * + * This traverses the strong cache until it finds a matching key and returns a + * pointer to the relevant node if found. Returns NULL if no node is found. + * + * root may be NULL, indicating an empty cache. + */ +static StrongCacheNode * +find_in_strong_cache(const StrongCacheNode *const root, PyObject *const key) +{ + const StrongCacheNode *node = root; + while (node != NULL) { + if (PyObject_RichCompareBool(key, node->key, Py_EQ)) { + return (StrongCacheNode *)node; + } + + node = node->next; + } + + return NULL; +} + +/* Ejects a given key from the class's strong cache, if applicable. + * + * This function is used to enable the per-key functionality in clear_cache. + */ +static void +eject_from_strong_cache(const PyTypeObject *const type, PyObject *key) +{ + if (type != &PyZoneInfo_ZoneInfoType) { + return; + } + + StrongCacheNode *node = find_in_strong_cache(ZONEINFO_STRONG_CACHE, key); + if (node != NULL) { + remove_from_strong_cache(node); + + strong_cache_node_free(node); + } +} + +/* Moves a node to the front of the LRU cache. + * + * The strong cache is an LRU cache, so whenever a given node is accessed, if + * it is not at the front of the cache, it needs to be moved there. + */ +static void +move_strong_cache_node_to_front(StrongCacheNode **root, StrongCacheNode *node) +{ + StrongCacheNode *root_p = *root; + if (root_p == node) { + return; + } + + remove_from_strong_cache(node); + + node->prev = NULL; + node->next = root_p; + + if (root_p != NULL) { + root_p->prev = node; + } + + *root = node; +} + +/* Retrieves a ZoneInfo from the strong cache if it's present. + * + * This function finds the ZoneInfo by key and if found will move the node to + * the front of the LRU cache and return a new reference to it. It returns NULL + * if the key is not in the cache. + * + * The strong cache is currently only implemented for the base class, so this + * always returns a cache miss for subclasses. + */ +static PyObject * +zone_from_strong_cache(const PyTypeObject *const type, PyObject *const key) +{ + if (type != &PyZoneInfo_ZoneInfoType) { + return NULL; // Strong cache currently only implemented for base class + } + + StrongCacheNode *node = find_in_strong_cache(ZONEINFO_STRONG_CACHE, key); + + if (node != NULL) { + move_strong_cache_node_to_front(&ZONEINFO_STRONG_CACHE, node); + Py_INCREF(node->zone); + return node->zone; + } + + return NULL; // Cache miss +} + +/* Inserts a new key into the strong LRU cache. + * + * This function is only to be used after a cache miss — it creates a new node + * at the front of the cache and ejects any stale entries (keeping the size of + * the cache to at most ZONEINFO_STRONG_CACHE_MAX_SIZE). + */ +static void +update_strong_cache(const PyTypeObject *const type, PyObject *key, + PyObject *zone) +{ + if (type != &PyZoneInfo_ZoneInfoType) { + return; + } + + StrongCacheNode *new_node = strong_cache_node_new(key, zone); + + move_strong_cache_node_to_front(&ZONEINFO_STRONG_CACHE, new_node); + + StrongCacheNode *node = new_node->next; + for (size_t i = 1; i < ZONEINFO_STRONG_CACHE_MAX_SIZE; ++i) { + if (node == NULL) { + return; + } + node = node->next; + } + + // Everything beyond this point needs to be freed + if (node != NULL) { + if (node->prev != NULL) { + node->prev->next = NULL; + } + strong_cache_free(node); + } +} + +/* Clears all entries into a type's strong cache. + * + * Because the strong cache is not implemented for subclasses, this is a no-op + * for everything except the base class. + */ +void +clear_strong_cache(const PyTypeObject *const type) +{ + if (type != &PyZoneInfo_ZoneInfoType) { + return; + } + + strong_cache_free(ZONEINFO_STRONG_CACHE); + ZONEINFO_STRONG_CACHE = NULL; +} + +static PyObject * +new_weak_cache(void) +{ + PyObject *weakref_module = PyImport_ImportModule("weakref"); + if (weakref_module == NULL) { + return NULL; + } + + PyObject *weak_cache = + PyObject_CallMethod(weakref_module, "WeakValueDictionary", ""); + Py_DECREF(weakref_module); + return weak_cache; +} + +static int +initialize_caches(void) +{ + // TODO: Move to a PyModule_GetState / PEP 573 based caching system. + if (TIMEDELTA_CACHE == NULL) { + TIMEDELTA_CACHE = PyDict_New(); + } + else { + Py_INCREF(TIMEDELTA_CACHE); + } + + if (TIMEDELTA_CACHE == NULL) { + return -1; + } + + if (ZONEINFO_WEAK_CACHE == NULL) { + ZONEINFO_WEAK_CACHE = new_weak_cache(); + } + else { + Py_INCREF(ZONEINFO_WEAK_CACHE); + } + + if (ZONEINFO_WEAK_CACHE == NULL) { + return -1; + } + + return 0; +} + +static PyObject * +zoneinfo_init_subclass(PyTypeObject *cls, PyObject *args, PyObject **kwargs) +{ + PyObject *weak_cache = new_weak_cache(); + if (weak_cache == NULL) { + return NULL; + } + + PyObject_SetAttrString((PyObject *)cls, "_weak_cache", weak_cache); + Py_DECREF(weak_cache); + Py_RETURN_NONE; +} + +///// +// Specify the ZoneInfo type +static PyMethodDef zoneinfo_methods[] = { + {"clear_cache", (PyCFunction)(void (*)(void))zoneinfo_clear_cache, + METH_VARARGS | METH_KEYWORDS | METH_CLASS, + PyDoc_STR("Clear the ZoneInfo cache.")}, + {"no_cache", (PyCFunction)(void (*)(void))zoneinfo_no_cache, + METH_VARARGS | METH_KEYWORDS | METH_CLASS, + PyDoc_STR("Get a new instance of ZoneInfo, bypassing the cache.")}, + {"from_file", (PyCFunction)(void (*)(void))zoneinfo_from_file, + METH_VARARGS | METH_KEYWORDS | METH_CLASS, + PyDoc_STR("Create a ZoneInfo file from a file object.")}, + {"utcoffset", (PyCFunction)zoneinfo_utcoffset, METH_O, + PyDoc_STR("Retrieve a timedelta representing the UTC offset in a zone at " + "the given datetime.")}, + {"dst", (PyCFunction)zoneinfo_dst, METH_O, + PyDoc_STR("Retrieve a timedelta representing the amount of DST applied " + "in a zone at the given datetime.")}, + {"tzname", (PyCFunction)zoneinfo_tzname, METH_O, + PyDoc_STR("Retrieve a string containing the abbreviation for the time " + "zone that applies in a zone at a given datetime.")}, + {"fromutc", (PyCFunction)zoneinfo_fromutc, METH_O, + PyDoc_STR("Given a datetime with local time in UTC, retrieve an adjusted " + "datetime in local time.")}, + {"__reduce__", (PyCFunction)zoneinfo_reduce, METH_NOARGS, + PyDoc_STR("Function for serialization with the pickle protocol.")}, + {"_unpickle", (PyCFunction)zoneinfo__unpickle, METH_VARARGS | METH_CLASS, + PyDoc_STR("Private method used in unpickling.")}, + {"__init_subclass__", (PyCFunction)(void (*)(void))zoneinfo_init_subclass, + METH_VARARGS | METH_KEYWORDS | METH_CLASS, + PyDoc_STR("Function to initialize subclasses.")}, + {NULL} /* Sentinel */ +}; + +static PyMemberDef zoneinfo_members[] = { + {.name = "key", + .offset = offsetof(PyZoneInfo_ZoneInfo, key), + .type = T_OBJECT_EX, + .flags = READONLY, + .doc = NULL}, + {NULL}, /* Sentinel */ +}; + +static PyTypeObject PyZoneInfo_ZoneInfoType = { + PyVarObject_HEAD_INIT(NULL, 0) // + .tp_name = "zoneinfo.ZoneInfo", + .tp_basicsize = sizeof(PyZoneInfo_ZoneInfo), + .tp_weaklistoffset = offsetof(PyZoneInfo_ZoneInfo, weakreflist), + .tp_repr = (reprfunc)zoneinfo_repr, + .tp_str = (reprfunc)zoneinfo_str, + .tp_getattro = PyObject_GenericGetAttr, + .tp_flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE), + /* .tp_doc = zoneinfo_doc, */ + .tp_methods = zoneinfo_methods, + .tp_members = zoneinfo_members, + .tp_new = zoneinfo_new, + .tp_dealloc = zoneinfo_dealloc, +}; + +///// +// Specify the _zoneinfo module +static PyMethodDef module_methods[] = {{NULL, NULL}}; +static void +module_free() +{ + Py_XDECREF(_tzpath_find_tzfile); + _tzpath_find_tzfile = NULL; + + Py_XDECREF(_common_mod); + _common_mod = NULL; + + Py_XDECREF(io_open); + io_open = NULL; + + xdecref_ttinfo(&NO_TTINFO); + + if (TIMEDELTA_CACHE != NULL && Py_REFCNT(TIMEDELTA_CACHE) > 1) { + Py_DECREF(TIMEDELTA_CACHE); + } else { + Py_CLEAR(TIMEDELTA_CACHE); + } + + if (ZONEINFO_WEAK_CACHE != NULL && Py_REFCNT(ZONEINFO_WEAK_CACHE) > 1) { + Py_DECREF(ZONEINFO_WEAK_CACHE); + } else { + Py_CLEAR(ZONEINFO_WEAK_CACHE); + } + + clear_strong_cache(&PyZoneInfo_ZoneInfoType); +} + +static int +zoneinfomodule_exec(PyObject *m) +{ + PyDateTime_IMPORT; + PyZoneInfo_ZoneInfoType.tp_base = PyDateTimeAPI->TZInfoType; + if (PyType_Ready(&PyZoneInfo_ZoneInfoType) < 0) { + goto error; + } + + Py_INCREF(&PyZoneInfo_ZoneInfoType); + PyModule_AddObject(m, "ZoneInfo", (PyObject *)&PyZoneInfo_ZoneInfoType); + + /* Populate imports */ + PyObject *_tzpath_module = PyImport_ImportModule("zoneinfo._tzpath"); + if (_tzpath_module == NULL) { + goto error; + } + + _tzpath_find_tzfile = + PyObject_GetAttrString(_tzpath_module, "find_tzfile"); + Py_DECREF(_tzpath_module); + if (_tzpath_find_tzfile == NULL) { + goto error; + } + + PyObject *io_module = PyImport_ImportModule("io"); + if (io_module == NULL) { + goto error; + } + + io_open = PyObject_GetAttrString(io_module, "open"); + Py_DECREF(io_module); + if (io_open == NULL) { + goto error; + } + + _common_mod = PyImport_ImportModule("zoneinfo._common"); + if (_common_mod == NULL) { + goto error; + } + + if (NO_TTINFO.utcoff == NULL) { + NO_TTINFO.utcoff = Py_None; + NO_TTINFO.dstoff = Py_None; + NO_TTINFO.tzname = Py_None; + + for (size_t i = 0; i < 3; ++i) { + Py_INCREF(Py_None); + } + } + + if (initialize_caches()) { + goto error; + } + + return 0; + +error: + return -1; +} + +static PyModuleDef_Slot zoneinfomodule_slots[] = { + {Py_mod_exec, zoneinfomodule_exec}, {0, NULL}}; + +static struct PyModuleDef zoneinfomodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_zoneinfo", + .m_doc = "C implementation of the zoneinfo module", + .m_size = 0, + .m_methods = module_methods, + .m_slots = zoneinfomodule_slots, + .m_free = (freefunc)module_free}; + +PyMODINIT_FUNC +PyInit__zoneinfo(void) +{ + return PyModuleDef_Init(&zoneinfomodule); +} diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index abcdd1e8..724c503e 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -5,7 +5,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include // offsetof() #ifdef STDC_HEADERS #include @@ -43,7 +43,7 @@ typedef struct arrayobject { Py_ssize_t allocated; const struct arraydescr *ob_descr; PyObject *weakreflist; /* List of weak references */ - int ob_exports; /* Number of exported buffers */ + Py_ssize_t ob_exports; /* Number of exported buffers */ } arrayobject; static PyTypeObject Arraytype; @@ -106,7 +106,7 @@ enum machine_format_code { #include "clinic/arraymodule.c.h" #define array_Check(op) PyObject_TypeCheck(op, &Arraytype) -#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype) +#define array_CheckExact(op) Py_IS_TYPE(op, &Arraytype) static int array_resize(arrayobject *self, Py_ssize_t newsize) @@ -128,14 +128,14 @@ array_resize(arrayobject *self, Py_ssize_t newsize) if (self->allocated >= newsize && Py_SIZE(self) < newsize + 16 && self->ob_item != NULL) { - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); return 0; } if (newsize == 0) { PyMem_FREE(self->ob_item); self->ob_item = NULL; - Py_SIZE(self) = 0; + Py_SET_SIZE(self, 0); self->allocated = 0; return 0; } @@ -165,7 +165,7 @@ array_resize(arrayobject *self, Py_ssize_t newsize) return -1; } self->ob_item = items; - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); self->allocated = _new_size; return 0; } @@ -185,9 +185,7 @@ in bounds; that's the responsibility of the caller. static PyObject * b_getitem(arrayobject *ap, Py_ssize_t i) { - long x = ((char *)ap->ob_item)[i]; - if (x >= 128) - x -= 256; + long x = ((signed char *)ap->ob_item)[i]; return PyLong_FromLong(x); } @@ -237,24 +235,31 @@ BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) static PyObject * u_getitem(arrayobject *ap, Py_ssize_t i) { - return PyUnicode_FromOrdinal(((Py_UNICODE *) ap->ob_item)[i]); + return PyUnicode_FromOrdinal(((wchar_t *) ap->ob_item)[i]); } static int u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { - Py_UNICODE *p; - Py_ssize_t len; - - if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len)) + PyObject *u; + if (!PyArg_Parse(v, "U;array item must be unicode character", &u)) { return -1; - if (len != 1) { + } + + Py_ssize_t len = PyUnicode_AsWideChar(u, NULL, 0); + if (len != 2) { PyErr_SetString(PyExc_TypeError, "array item must be unicode character"); return -1; } - if (i >= 0) - ((Py_UNICODE *)ap->ob_item)[i] = p[0]; + + wchar_t w; + len = PyUnicode_AsWideChar(u, &w, 1); + assert(len == 1); + + if (i >= 0) { + ((wchar_t *)ap->ob_item)[i] = w; + } return 0; } @@ -532,7 +537,7 @@ d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) DEFINE_COMPAREITEMS(b, signed char) DEFINE_COMPAREITEMS(BB, unsigned char) -DEFINE_COMPAREITEMS(u, Py_UNICODE) +DEFINE_COMPAREITEMS(u, wchar_t) DEFINE_COMPAREITEMS(h, short) DEFINE_COMPAREITEMS(HH, unsigned short) DEFINE_COMPAREITEMS(i, int) @@ -550,7 +555,7 @@ DEFINE_COMPAREITEMS(QQ, unsigned long long) static const struct arraydescr descriptors[] = { {'b', 1, b_getitem, b_setitem, b_compareitems, "b", 1, 1}, {'B', 1, BB_getitem, BB_setitem, BB_compareitems, "B", 1, 0}, - {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, u_compareitems, "u", 0, 0}, + {'u', sizeof(wchar_t), u_getitem, u_setitem, u_compareitems, "u", 0, 0}, {'h', sizeof(short), h_getitem, h_setitem, h_compareitems, "h", 1, 1}, {'H', sizeof(short), HH_getitem, HH_setitem, HH_compareitems, "H", 1, 0}, {'i', sizeof(int), i_getitem, i_setitem, i_compareitems, "i", 1, 1}, @@ -595,7 +600,7 @@ newarrayobject(PyTypeObject *type, Py_ssize_t size, const struct arraydescr *des op->ob_descr = descr; op->allocated = size; op->weakreflist = NULL; - Py_SIZE(op) = size; + Py_SET_SIZE(op, size); if (size <= 0) { op->ob_item = NULL; } @@ -1507,7 +1512,7 @@ array_array_tofile(arrayobject *self, PyObject *f) bytes = PyBytes_FromStringAndSize(ptr, size); if (bytes == NULL) return NULL; - res = _PyObject_CallMethodIdObjArgs(f, &PyId_write, bytes, NULL); + res = _PyObject_CallMethodIdOneArg(f, &PyId_write, bytes); Py_DECREF(bytes); if (res == NULL) return NULL; @@ -1625,27 +1630,6 @@ frombytes(arrayobject *self, Py_buffer *buffer) Py_RETURN_NONE; } -/*[clinic input] -array.array.fromstring - - buffer: Py_buffer(accept={str, buffer}) - / - -Appends items from the string, interpreting it as an array of machine values, as if it had been read from a file using the fromfile() method). - -This method is deprecated. Use frombytes instead. -[clinic start generated code]*/ - -static PyObject * -array_array_fromstring_impl(arrayobject *self, Py_buffer *buffer) -/*[clinic end generated code: output=31c4baa779df84ce input=a3341a512e11d773]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "fromstring() is deprecated. Use frombytes() instead.", 2) != 0) - return NULL; - return frombytes(self, buffer); -} - /*[clinic input] array.array.frombytes @@ -1680,28 +1664,10 @@ array_array_tobytes_impl(arrayobject *self) } } -/*[clinic input] -array.array.tostring - -Convert the array to an array of machine values and return the bytes representation. - -This method is deprecated. Use tobytes instead. -[clinic start generated code]*/ - -static PyObject * -array_array_tostring_impl(arrayobject *self) -/*[clinic end generated code: output=7d6bd92745a2c8f3 input=b6c0ddee7b30457e]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "tostring() is deprecated. Use tobytes() instead.", 2) != 0) - return NULL; - return array_array_tobytes_impl(self); -} - /*[clinic input] array.array.fromunicode - ustr: Py_UNICODE(zeroes=True) + ustr: unicode / Extends this array with data from the unicode string ustr. @@ -1712,25 +1678,28 @@ some other type. [clinic start generated code]*/ static PyObject * -array_array_fromunicode_impl(arrayobject *self, const Py_UNICODE *ustr, - Py_ssize_clean_t ustr_length) -/*[clinic end generated code: output=cf2f662908e2befc input=150f00566ffbca6e]*/ +array_array_fromunicode_impl(arrayobject *self, PyObject *ustr) +/*[clinic end generated code: output=24359f5e001a7f2b input=025db1fdade7a4ce]*/ { - char typecode; - - typecode = self->ob_descr->typecode; - if (typecode != 'u') { + if (self->ob_descr->typecode != 'u') { PyErr_SetString(PyExc_ValueError, "fromunicode() may only be called on " "unicode type arrays"); return NULL; } - if (ustr_length > 0) { + + Py_ssize_t ustr_length = PyUnicode_AsWideChar(ustr, NULL, 0); + assert(ustr_length > 0); + if (ustr_length > 1) { + ustr_length--; /* trim trailing NUL character */ Py_ssize_t old_size = Py_SIZE(self); - if (array_resize(self, old_size + ustr_length) == -1) + if (array_resize(self, old_size + ustr_length) == -1) { return NULL; - memcpy(self->ob_item + old_size * sizeof(Py_UNICODE), - ustr, ustr_length * sizeof(Py_UNICODE)); + } + + // must not fail + PyUnicode_AsWideChar( + ustr, ((wchar_t *)self->ob_item) + old_size, ustr_length); } Py_RETURN_NONE; @@ -1750,14 +1719,12 @@ static PyObject * array_array_tounicode_impl(arrayobject *self) /*[clinic end generated code: output=08e442378336e1ef input=127242eebe70b66d]*/ { - char typecode; - typecode = self->ob_descr->typecode; - if (typecode != 'u') { + if (self->ob_descr->typecode != 'u') { PyErr_SetString(PyExc_ValueError, "tounicode() may only be called on unicode type arrays"); return NULL; } - return PyUnicode_FromWideChar((Py_UNICODE *) self->ob_item, Py_SIZE(self)); + return PyUnicode_FromWideChar((wchar_t *) self->ob_item, Py_SIZE(self)); } /*[clinic input] @@ -2285,7 +2252,6 @@ static PyMethodDef array_methods[] = { ARRAY_ARRAY_EXTEND_METHODDEF ARRAY_ARRAY_FROMFILE_METHODDEF ARRAY_ARRAY_FROMLIST_METHODDEF - ARRAY_ARRAY_FROMSTRING_METHODDEF ARRAY_ARRAY_FROMBYTES_METHODDEF ARRAY_ARRAY_FROMUNICODE_METHODDEF ARRAY_ARRAY_INDEX_METHODDEF @@ -2296,7 +2262,6 @@ static PyMethodDef array_methods[] = { ARRAY_ARRAY_REVERSE_METHODDEF ARRAY_ARRAY_TOFILE_METHODDEF ARRAY_ARRAY_TOLIST_METHODDEF - ARRAY_ARRAY_TOSTRING_METHODDEF ARRAY_ARRAY_TOBYTES_METHODDEF ARRAY_ARRAY_TOUNICODE_METHODDEF ARRAY_ARRAY___SIZEOF___METHODDEF @@ -2718,30 +2683,20 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_DECREF(v); } else if (initial != NULL && PyUnicode_Check(initial)) { - Py_UNICODE *ustr; Py_ssize_t n; - - ustr = PyUnicode_AsUnicode(initial); + wchar_t *ustr = PyUnicode_AsWideCharString(initial, &n); if (ustr == NULL) { - PyErr_NoMemory(); Py_DECREF(a); return NULL; } - n = PyUnicode_GET_DATA_SIZE(initial); if (n > 0) { arrayobject *self = (arrayobject *)a; - char *item = self->ob_item; - item = (char *)PyMem_Realloc(item, n); - if (item == NULL) { - PyErr_NoMemory(); - Py_DECREF(a); - return NULL; - } - self->ob_item = item; - Py_SIZE(self) = n / sizeof(Py_UNICODE); - memcpy(item, ustr, n); - self->allocated = Py_SIZE(self); + // self->ob_item may be NULL but it is safe. + PyMem_Free(self->ob_item); + self->ob_item = (char *)ustr; + Py_SET_SIZE(self, n); + self->allocated = n; } } else if (initial != NULL && array_Check(initial) && len > 0) { @@ -3034,12 +2989,11 @@ array_modexec(PyObject *m) { char buffer[Py_ARRAY_LENGTH(descriptors)], *p; PyObject *typecodes; - Py_ssize_t size = 0; const struct arraydescr *descr; if (PyType_Ready(&Arraytype) < 0) return -1; - Py_TYPE(&PyArrayIter_Type) = &PyType_Type; + Py_SET_TYPE(&PyArrayIter_Type, &PyType_Type); Py_INCREF((PyObject *)&Arraytype); if (PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype) < 0) { @@ -3052,10 +3006,6 @@ array_modexec(PyObject *m) return -1; } - for (descr=descriptors; descr->typecode != '\0'; descr++) { - size++; - } - p = buffer; for (descr = descriptors; descr->typecode != '\0'; descr++) { *p++ = (char)descr->typecode; diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index 1d6d6e53..8cef64ce 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -28,7 +28,13 @@ typedef struct { int callback_len; } atexitmodule_state; -#define GET_ATEXIT_STATE(mod) ((atexitmodule_state*)PyModule_GetState(mod)) +static inline atexitmodule_state* +get_atexit_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (atexitmodule_state *)state; +} static void @@ -72,7 +78,7 @@ atexit_callfuncs(PyObject *module) if (module == NULL) return; - modstate = GET_ATEXIT_STATE(module); + modstate = get_atexit_state(module); if (modstate->ncallbacks == 0) return; @@ -130,7 +136,7 @@ atexit_register(PyObject *self, PyObject *args, PyObject *kwargs) atexit_callback *new_callback; PyObject *func = NULL; - modstate = GET_ATEXIT_STATE(self); + modstate = get_atexit_state(self); if (modstate->ncallbacks >= modstate->callback_len) { atexit_callback **r; @@ -197,7 +203,7 @@ Clear the list of previously registered exit functions."); static PyObject * atexit_clear(PyObject *self, PyObject *unused) { - atexit_cleanup(GET_ATEXIT_STATE(self)); + atexit_cleanup(get_atexit_state(self)); Py_RETURN_NONE; } @@ -211,7 +217,7 @@ atexit_ncallbacks(PyObject *self, PyObject *unused) { atexitmodule_state *modstate; - modstate = GET_ATEXIT_STATE(self); + modstate = get_atexit_state(self); return PyLong_FromSsize_t(modstate->ncallbacks); } @@ -222,16 +228,15 @@ atexit_m_traverse(PyObject *self, visitproc visit, void *arg) int i; atexitmodule_state *modstate; - modstate = GET_ATEXIT_STATE(self); - if (modstate != NULL) { - for (i = 0; i < modstate->ncallbacks; i++) { - atexit_callback *cb = modstate->atexit_callbacks[i]; - if (cb == NULL) - continue; - Py_VISIT(cb->func); - Py_VISIT(cb->args); - Py_VISIT(cb->kwargs); - } + modstate = (atexitmodule_state *)PyModule_GetState(self); + + for (i = 0; i < modstate->ncallbacks; i++) { + atexit_callback *cb = modstate->atexit_callbacks[i]; + if (cb == NULL) + continue; + Py_VISIT(cb->func); + Py_VISIT(cb->args); + Py_VISIT(cb->kwargs); } return 0; } @@ -240,10 +245,8 @@ static int atexit_m_clear(PyObject *self) { atexitmodule_state *modstate; - modstate = GET_ATEXIT_STATE(self); - if (modstate != NULL) { - atexit_cleanup(modstate); - } + modstate = (atexitmodule_state *)PyModule_GetState(self); + atexit_cleanup(modstate); return 0; } @@ -251,11 +254,9 @@ static void atexit_free(PyObject *m) { atexitmodule_state *modstate; - modstate = GET_ATEXIT_STATE(m); - if (modstate != NULL) { - atexit_cleanup(modstate); - PyMem_Free(modstate->atexit_callbacks); - } + modstate = (atexitmodule_state *)PyModule_GetState(m); + atexit_cleanup(modstate); + PyMem_Free(modstate->atexit_callbacks); } PyDoc_STRVAR(atexit_unregister__doc__, @@ -273,7 +274,7 @@ atexit_unregister(PyObject *self, PyObject *func) atexit_callback *cb; int i, eq; - modstate = GET_ATEXIT_STATE(self); + modstate = get_atexit_state(self); for (i = 0; i < modstate->ncallbacks; i++) { @@ -318,7 +319,7 @@ static int atexit_exec(PyObject *m) { atexitmodule_state *modstate; - modstate = GET_ATEXIT_STATE(m); + modstate = get_atexit_state(m); modstate->callback_len = 32; modstate->ncallbacks = 0; modstate->atexit_callbacks = PyMem_New(atexit_callback*, diff --git a/Modules/audioop.c b/Modules/audioop.c index f4fdeb23..3aeb6f04 100644 --- a/Modules/audioop.c +++ b/Modules/audioop.c @@ -371,14 +371,26 @@ static const int stepsizeTable[89] = { SETINT32((cp), (i), (val)); \ } while(0) +static PyModuleDef audioopmodule; -static PyObject *AudioopError; +typedef struct { + PyObject *AudioopError; +} audioop_state; + +static inline audioop_state * +get_audioop_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (audioop_state *)state; +} static int -audioop_check_size(int size) +audioop_check_size(PyObject *module, int size) { if (size < 1 || size > 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2, 3 or 4"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Size should be 1, 2, 3 or 4"); return 0; } else @@ -386,12 +398,13 @@ audioop_check_size(int size) } static int -audioop_check_parameters(Py_ssize_t len, int size) +audioop_check_parameters(PyObject *module, Py_ssize_t len, int size) { - if (!audioop_check_size(size)) + if (!audioop_check_size(module, size)) return 0; if (len % size != 0) { - PyErr_SetString(AudioopError, "not a whole number of frames"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "not a whole number of frames"); return 0; } return 1; @@ -420,10 +433,11 @@ audioop_getsample_impl(PyObject *module, Py_buffer *fragment, int width, { int val; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; if (index < 0 || index >= fragment->len/width) { - PyErr_SetString(AudioopError, "Index out of range"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Index out of range"); return NULL; } val = GETRAWSAMPLE(width, fragment->buf, index*width); @@ -447,7 +461,7 @@ audioop_max_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; unsigned int absval, max = 0; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; for (i = 0; i < fragment->len; i += width) { int val = GETRAWSAMPLE(width, fragment->buf, i); @@ -479,7 +493,7 @@ audioop_minmax_impl(PyObject *module, Py_buffer *fragment, int width) a warning */ int min = 0x7fffffff, max = -0x7FFFFFFF-1; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; for (i = 0; i < fragment->len; i += width) { int val = GETRAWSAMPLE(width, fragment->buf, i); @@ -507,7 +521,7 @@ audioop_avg_impl(PyObject *module, Py_buffer *fragment, int width) int avg; double sum = 0.0; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; for (i = 0; i < fragment->len; i += width) sum += GETRAWSAMPLE(width, fragment->buf, i); @@ -536,7 +550,7 @@ audioop_rms_impl(PyObject *module, Py_buffer *fragment, int width) unsigned int res; double sum_squares = 0.0; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; for (i = 0; i < fragment->len; i += width) { double val = GETRAWSAMPLE(width, fragment->buf, i); @@ -614,7 +628,8 @@ audioop_findfit_impl(PyObject *module, Py_buffer *fragment, double sum_ri_2, sum_aij_2, sum_aij_ri, result, best_result, factor; if (fragment->len & 1 || reference->len & 1) { - PyErr_SetString(AudioopError, "Strings should be even-sized"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Strings should be even-sized"); return NULL; } cp1 = (const int16_t *)fragment->buf; @@ -623,7 +638,8 @@ audioop_findfit_impl(PyObject *module, Py_buffer *fragment, len2 = reference->len >> 1; if (len1 < len2) { - PyErr_SetString(AudioopError, "First sample should be longer"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "First sample should be longer"); return NULL; } sum_ri_2 = _sum2(cp2, cp2, len2); @@ -681,11 +697,13 @@ audioop_findfactor_impl(PyObject *module, Py_buffer *fragment, double sum_ri_2, sum_aij_ri, result; if (fragment->len & 1 || reference->len & 1) { - PyErr_SetString(AudioopError, "Strings should be even-sized"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Strings should be even-sized"); return NULL; } if (fragment->len != reference->len) { - PyErr_SetString(AudioopError, "Samples should be same size"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Samples should be same size"); return NULL; } cp1 = (const int16_t *)fragment->buf; @@ -725,14 +743,16 @@ audioop_findmax_impl(PyObject *module, Py_buffer *fragment, double result, best_result; if (fragment->len & 1) { - PyErr_SetString(AudioopError, "Strings should be even-sized"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Strings should be even-sized"); return NULL; } cp1 = (const int16_t *)fragment->buf; len1 = fragment->len >> 1; if (length < 0 || len1 < length) { - PyErr_SetString(AudioopError, "Input sample should be longer"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Input sample should be longer"); return NULL; } @@ -777,7 +797,7 @@ audioop_avgpp_impl(PyObject *module, Py_buffer *fragment, int width) unsigned int avg; int diff, prevdiff, nextreme = 0; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; if (fragment->len <= width) return PyLong_FromLong(0); @@ -833,7 +853,7 @@ audioop_maxpp_impl(PyObject *module, Py_buffer *fragment, int width) unsigned int max = 0, extremediff; int diff, prevdiff; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; if (fragment->len <= width) return PyLong_FromLong(0); @@ -885,7 +905,7 @@ audioop_cross_impl(PyObject *module, Py_buffer *fragment, int width) int prevval; Py_ssize_t ncross; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; ncross = -1; prevval = 17; /* Anything <> 0,1 */ @@ -918,7 +938,7 @@ audioop_mul_impl(PyObject *module, Py_buffer *fragment, int width, double maxval, minval; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; maxval = (double) maxvals[width]; @@ -961,10 +981,11 @@ audioop_tomono_impl(PyObject *module, Py_buffer *fragment, int width, cp = fragment->buf; len = fragment->len; - if (!audioop_check_parameters(len, width)) + if (!audioop_check_parameters(module, len, width)) return NULL; if (((len / width) & 1) != 0) { - PyErr_SetString(AudioopError, "not a whole number of frames"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "not a whole number of frames"); return NULL; } @@ -1008,7 +1029,7 @@ audioop_tostereo_impl(PyObject *module, Py_buffer *fragment, int width, double maxval, minval; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; maxval = (double) maxvals[width]; @@ -1056,10 +1077,11 @@ audioop_add_impl(PyObject *module, Py_buffer *fragment1, int minval, maxval, newval; PyObject *rv; - if (!audioop_check_parameters(fragment1->len, width)) + if (!audioop_check_parameters(module, fragment1->len, width)) return NULL; if (fragment1->len != fragment2->len) { - PyErr_SetString(AudioopError, "Lengths should be the same"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Lengths should be the same"); return NULL; } @@ -1114,7 +1136,7 @@ audioop_bias_impl(PyObject *module, Py_buffer *fragment, int width, int bias) unsigned int val = 0, mask; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; rv = PyBytes_FromStringAndSize(NULL, fragment->len); @@ -1172,7 +1194,7 @@ audioop_reverse_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; rv = PyBytes_FromStringAndSize(NULL, fragment->len); @@ -1205,7 +1227,7 @@ audioop_byteswap_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; rv = PyBytes_FromStringAndSize(NULL, fragment->len); @@ -1241,9 +1263,9 @@ audioop_lin2lin_impl(PyObject *module, Py_buffer *fragment, int width, Py_ssize_t i, j; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; - if (!audioop_check_size(newwidth)) + if (!audioop_check_size(module, newwidth)) return NULL; if (fragment->len/width > PY_SSIZE_T_MAX/newwidth) { @@ -1302,10 +1324,11 @@ audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width, PyObject *samps, *str, *rv = NULL, *channel; int bytes_per_frame; - if (!audioop_check_size(width)) + if (!audioop_check_size(module, width)) return NULL; if (nchannels < 1) { - PyErr_SetString(AudioopError, "# of channels should be >= 1"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "# of channels should be >= 1"); return NULL; } if (width > INT_MAX / nchannels) { @@ -1318,17 +1341,19 @@ audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width, } bytes_per_frame = width * nchannels; if (weightA < 1 || weightB < 0) { - PyErr_SetString(AudioopError, + PyErr_SetString(get_audioop_state(module)->AudioopError, "weightA should be >= 1, weightB should be >= 0"); return NULL; } assert(fragment->len >= 0); if (fragment->len % bytes_per_frame != 0) { - PyErr_SetString(AudioopError, "not a whole number of frames"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "not a whole number of frames"); return NULL; } if (inrate <= 0 || outrate <= 0) { - PyErr_SetString(AudioopError, "sampling rate not > 0"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "sampling rate not > 0"); return NULL; } /* divide inrate and outrate by their greatest common divisor */ @@ -1369,7 +1394,7 @@ audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width, &d, &PyTuple_Type, &samps)) goto exit; if (PyTuple_Size(samps) != nchannels) { - PyErr_SetString(AudioopError, + PyErr_SetString(get_audioop_state(module)->AudioopError, "illegal state argument"); goto exit; } @@ -1491,7 +1516,7 @@ audioop_lin2ulaw_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; rv = PyBytes_FromStringAndSize(NULL, fragment->len/width); @@ -1525,7 +1550,7 @@ audioop_ulaw2lin_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; PyObject *rv; - if (!audioop_check_size(width)) + if (!audioop_check_size(module, width)) return NULL; if (fragment->len > PY_SSIZE_T_MAX/width) { @@ -1564,7 +1589,7 @@ audioop_lin2alaw_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; rv = PyBytes_FromStringAndSize(NULL, fragment->len/width); @@ -1599,7 +1624,7 @@ audioop_alaw2lin_impl(PyObject *module, Py_buffer *fragment, int width) int val; PyObject *rv; - if (!audioop_check_size(width)) + if (!audioop_check_size(module, width)) return NULL; if (fragment->len > PY_SSIZE_T_MAX/width) { @@ -1643,7 +1668,7 @@ audioop_lin2adpcm_impl(PyObject *module, Py_buffer *fragment, int width, PyObject *rv = NULL, *str; int outputbuffer = 0, bufferstep; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; /* Decode state, should have (value, step) */ @@ -1773,7 +1798,7 @@ audioop_adpcm2lin_impl(PyObject *module, Py_buffer *fragment, int width, PyObject *rv, *str; int inputbuffer = 0, bufferstep; - if (!audioop_check_size(width)) + if (!audioop_check_size(module, width)) return NULL; /* Decode state, should have (value, step) */ @@ -1897,31 +1922,65 @@ static PyMethodDef audioop_methods[] = { { 0, 0 } }; +static int +audioop_traverse(PyObject *module, visitproc visit, void *arg) +{ + audioop_state *state = get_audioop_state(module); + Py_VISIT(state->AudioopError); + return 0; +} + +static int +audioop_clear(PyObject *module) +{ + audioop_state *state = get_audioop_state(module); + Py_CLEAR(state->AudioopError); + return 0; +} + +static void +audioop_free(void *module) { + audioop_clear((PyObject *)module); +} + +static int +audioop_exec(PyObject* module) +{ + audioop_state *state = get_audioop_state(module); + + state->AudioopError = PyErr_NewException("audioop.error", NULL, NULL); + if (state->AudioopError == NULL) { + return -1; + } + + Py_INCREF(state->AudioopError); + if (PyModule_AddObject(module, "error", state->AudioopError) < 0) { + Py_DECREF(state->AudioopError); + return -1; + } + + return 0; +} + +static PyModuleDef_Slot audioop_slots[] = { + {Py_mod_exec, audioop_exec}, + {0, NULL} +}; static struct PyModuleDef audioopmodule = { PyModuleDef_HEAD_INIT, "audioop", NULL, - -1, + sizeof(audioop_state), audioop_methods, - NULL, - NULL, - NULL, - NULL + audioop_slots, + audioop_traverse, + audioop_clear, + audioop_free }; PyMODINIT_FUNC PyInit_audioop(void) { - PyObject *m, *d; - m = PyModule_Create(&audioopmodule); - if (m == NULL) - return NULL; - d = PyModule_GetDict(m); - if (d == NULL) - return NULL; - AudioopError = PyErr_NewException("audioop.error", NULL, NULL); - if (AudioopError != NULL) - PyDict_SetItemString(d,"error",AudioopError); - return m; + return PyModuleDef_Init(&audioopmodule); } diff --git a/Modules/binascii.c b/Modules/binascii.c index 1c7dc358..1f3248b6 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -66,6 +66,12 @@ typedef struct binascii_state { PyObject *Incomplete; } binascii_state; +static binascii_state * +get_binascii_state(PyObject *module) +{ + return (binascii_state *)PyModule_GetState(module); +} + /* ** hqx lookup table, ascii->binary. */ @@ -130,7 +136,7 @@ static const unsigned char table_a2b_hqx[256] = { static const unsigned char table_b2a_hqx[] = "!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr"; -static const char table_a2b_base64[] = { +static const unsigned char table_a2b_base64[] = { -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, @@ -138,7 +144,16 @@ static const char table_a2b_base64[] = { -1, 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,-1, -1,-1,-1,-1, -1,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,-1, -1,-1,-1,-1 + 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1, + + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, }; #define BASE64_PAD '=' @@ -413,32 +428,6 @@ binascii_b2a_uu_impl(PyObject *module, Py_buffer *data, int backtick) return _PyBytesWriter_Finish(&writer, ascii_data); } - -static int -binascii_find_valid(const unsigned char *s, Py_ssize_t slen, int num) -{ - /* Finds & returns the (num+1)th - ** valid character for base64, or -1 if none. - */ - - int ret = -1; - unsigned char c, b64val; - - while ((slen > 0) && (ret == -1)) { - c = *s; - b64val = table_a2b_base64[c & 0x7f]; - if ( ((c <= 0x7f) && (b64val != (unsigned char)-1)) ) { - if (num == 0) - ret = *s; - num--; - } - - s++; - slen--; - } - return ret; -} - /*[clinic input] binascii.a2b_base64 @@ -452,88 +441,74 @@ static PyObject * binascii_a2b_base64_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=0628223f19fd3f9b input=5872acf6e1cac243]*/ { - const unsigned char *ascii_data; - unsigned char *bin_data; - unsigned char *bin_data_start; - int leftbits = 0; - unsigned char this_ch; - unsigned int leftchar = 0; - Py_ssize_t ascii_len, bin_len; - int quad_pos = 0; - _PyBytesWriter writer; - binascii_state *state; - - ascii_data = data->buf; - ascii_len = data->len; - - assert(ascii_len >= 0); + assert(data->len >= 0); - if (ascii_len > PY_SSIZE_T_MAX - 3) - return PyErr_NoMemory(); - - bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */ - - _PyBytesWriter_Init(&writer); + const unsigned char *ascii_data = data->buf; + size_t ascii_len = data->len; /* Allocate the buffer */ - bin_data = _PyBytesWriter_Alloc(&writer, bin_len); + Py_ssize_t bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */ + _PyBytesWriter writer; + _PyBytesWriter_Init(&writer); + unsigned char *bin_data = _PyBytesWriter_Alloc(&writer, bin_len); if (bin_data == NULL) return NULL; - bin_data_start = bin_data; + unsigned char *bin_data_start = bin_data; - for( ; ascii_len > 0; ascii_len--, ascii_data++) { - this_ch = *ascii_data; - - if (this_ch > 0x7f || - this_ch == '\r' || this_ch == '\n' || this_ch == ' ') - continue; + int quad_pos = 0; + unsigned char leftchar = 0; + int pads = 0; + for (size_t i = 0; i < ascii_len; i++) { + unsigned char this_ch = ascii_data[i]; /* Check for pad sequences and ignore ** the invalid ones. */ if (this_ch == BASE64_PAD) { - if ( (quad_pos < 2) || - ((quad_pos == 2) && - (binascii_find_valid(ascii_data, ascii_len, 1) - != BASE64_PAD)) ) - { - continue; - } - else { + if (quad_pos >= 2 && quad_pos + ++pads >= 4) { /* A pad sequence means no more input. ** We've already interpreted the data ** from the quad at this point. */ - leftbits = 0; - break; + goto done; } + continue; } - this_ch = table_a2b_base64[*ascii_data]; - if ( this_ch == (unsigned char) -1 ) + this_ch = table_a2b_base64[this_ch]; + if (this_ch >= 64) { continue; + } + pads = 0; - /* - ** Shift it in on the low end, and see if there's - ** a byte ready for output. - */ - quad_pos = (quad_pos + 1) & 0x03; - leftchar = (leftchar << 6) | (this_ch); - leftbits += 6; - - if ( leftbits >= 8 ) { - leftbits -= 8; - *bin_data++ = (leftchar >> leftbits) & 0xff; - leftchar &= ((1 << leftbits) - 1); + switch (quad_pos) { + case 0: + quad_pos = 1; + leftchar = this_ch; + break; + case 1: + quad_pos = 2; + *bin_data++ = (leftchar << 2) | (this_ch >> 4); + leftchar = this_ch & 0x0f; + break; + case 2: + quad_pos = 3; + *bin_data++ = (leftchar << 4) | (this_ch >> 2); + leftchar = this_ch & 0x03; + break; + case 3: + quad_pos = 0; + *bin_data++ = (leftchar << 6) | (this_ch); + leftchar = 0; + break; } } - if (leftbits != 0) { - state = PyModule_GetState(module); + if (quad_pos != 0) { + binascii_state *state = PyModule_GetState(module); if (state == NULL) { - return NULL; - } - if (leftbits == 6) { + /* error already set, from PyModule_GetState */ + } else if (quad_pos == 1) { /* ** There is exactly one extra valid, non-padding, base64 character. ** This is an invalid length, as there is no possible input that @@ -551,6 +526,7 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data) return NULL; } +done: return _PyBytesWriter_Finish(&writer, bin_data); } @@ -643,6 +619,11 @@ static PyObject * binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=4d6d8c54d54ea1c1 input=0d914c680e0eed55]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.a2b_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *ascii_data; unsigned char *bin_data; int leftbits = 0; @@ -731,6 +712,11 @@ static PyObject * binascii_rlecode_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=393d79338f5f5629 input=e1f1712447a82b09]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.rlecode_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *in_data; unsigned char *out_data; unsigned char ch; @@ -793,6 +779,11 @@ static PyObject * binascii_b2a_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=d0aa5a704bc9f7de input=9596ebe019fe12ba]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.b2a_hqx() is deprecated", 1) < 0) { + return NULL; + } + unsigned char *ascii_data; const unsigned char *bin_data; int leftbits = 0; @@ -848,6 +839,11 @@ static PyObject * binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=9826619565de1c6c input=54cdd49fc014402c]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.rledecode_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *in_data; unsigned char *out_data; unsigned char in_byte, in_repeat; @@ -962,7 +958,7 @@ error: /*[clinic input] -binascii.crc_hqx -> unsigned_int +binascii.crc_hqx data: Py_buffer crc: unsigned_int(bitwise=True) @@ -971,9 +967,9 @@ binascii.crc_hqx -> unsigned_int Compute CRC-CCITT incrementally. [clinic start generated code]*/ -static unsigned int +static PyObject * binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc) -/*[clinic end generated code: output=8ec2a78590d19170 input=f18240ff8c705b79]*/ +/*[clinic end generated code: output=2fde213d0f547a98 input=56237755370a951c]*/ { const unsigned char *bin_data; Py_ssize_t len; @@ -986,7 +982,7 @@ binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc) crc = ((crc<<8)&0xff00) ^ crctab_hqx[(crc>>8)^*bin_data++]; } - return crc; + return PyLong_FromUnsignedLong(crc); } #ifndef USE_ZLIB_CRC32 @@ -1315,15 +1311,12 @@ binascii_a2b_qp_impl(PyObject *module, Py_buffer *data, int header) datalen = data->len; /* We allocate the output same size as input, this is overkill. - * The previous implementation used calloc() so we'll zero out the - * memory here too, since PyMem_Malloc() does not guarantee that. */ - odata = (unsigned char *) PyMem_Malloc(datalen); + odata = (unsigned char *) PyMem_Calloc(1, datalen); if (odata == NULL) { PyErr_NoMemory(); return NULL; } - memset(odata, 0, datalen); in = out = 0; while (in < datalen) { @@ -1503,15 +1496,12 @@ binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs, } /* We allocate the output same size as input, this is overkill. - * The previous implementation used calloc() so we'll zero out the - * memory here too, since PyMem_Malloc() does not guarantee that. */ - odata = (unsigned char *) PyMem_Malloc(odatalen); + odata = (unsigned char *) PyMem_Calloc(1, odatalen); if (odata == NULL) { PyErr_NoMemory(); return NULL; } - memset(odata, 0, odatalen); in = out = linelen = 0; while (in < datalen) { @@ -1616,9 +1606,9 @@ static struct PyMethodDef binascii_module_methods[] = { PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII"); static int -binascii_exec(PyObject *m) { +binascii_exec(PyObject *module) { int result; - binascii_state *state = PyModule_GetState(m); + binascii_state *state = PyModule_GetState(module); if (state == NULL) { return -1; } @@ -1627,8 +1617,10 @@ binascii_exec(PyObject *m) { if (state->Error == NULL) { return -1; } - result = PyModule_AddObject(m, "Error", state->Error); + Py_INCREF(state->Error); + result = PyModule_AddObject(module, "Error", state->Error); if (result == -1) { + Py_DECREF(state->Error); return -1; } @@ -1636,8 +1628,10 @@ binascii_exec(PyObject *m) { if (state->Incomplete == NULL) { return -1; } - result = PyModule_AddObject(m, "Incomplete", state->Incomplete); + Py_INCREF(state->Incomplete); + result = PyModule_AddObject(module, "Incomplete", state->Incomplete); if (result == -1) { + Py_DECREF(state->Incomplete); return -1; } @@ -1649,6 +1643,30 @@ static PyModuleDef_Slot binascii_slots[] = { {0, NULL} }; +static int +binascii_traverse(PyObject *module, visitproc visit, void *arg) +{ + binascii_state *state = get_binascii_state(module); + Py_VISIT(state->Error); + Py_VISIT(state->Incomplete); + return 0; +} + +static int +binascii_clear(PyObject *module) +{ + binascii_state *state = get_binascii_state(module); + Py_CLEAR(state->Error); + Py_CLEAR(state->Incomplete); + return 0; +} + +static void +binascii_free(void *module) +{ + binascii_clear((PyObject *)module); +} + static struct PyModuleDef binasciimodule = { PyModuleDef_HEAD_INIT, "binascii", @@ -1656,9 +1674,9 @@ static struct PyModuleDef binasciimodule = { sizeof(binascii_state), binascii_module_methods, binascii_slots, - NULL, - NULL, - NULL + binascii_traverse, + binascii_clear, + binascii_free }; PyMODINIT_FUNC diff --git a/Modules/cjkcodecs/README b/Modules/cjkcodecs/README index b2370bc2..165ae7ad 100644 --- a/Modules/cjkcodecs/README +++ b/Modules/cjkcodecs/README @@ -1,12 +1,10 @@ To generate or modify mapping headers ------------------------------------- -Mapping headers are imported from CJKCodecs as pre-generated form. -If you need to tweak or add something on it, please look at tools/ -subdirectory of CJKCodecs' distribution. +Mapping headers are generated from Tools/unicode/genmap_*.py -Notes on implmentation characteristics of each codecs +Notes on implementation characteristics of each codecs ----------------------------------------------------- 1) Big5 codec diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h index b67f3482..e41755b1 100644 --- a/Modules/cjkcodecs/cjkcodecs.h +++ b/Modules/cjkcodecs/cjkcodecs.h @@ -72,7 +72,7 @@ static const struct dbcs_map *mapping_list; #define ENCODER(encoding) \ static Py_ssize_t encoding##_encode( \ MultibyteCodec_State *state, const void *config, \ - int kind, void *data, \ + int kind, const void *data, \ Py_ssize_t *inpos, Py_ssize_t inlen, \ unsigned char **outbuf, Py_ssize_t outleft, int flags) #define ENCODER_RESET(encoding) \ @@ -291,7 +291,7 @@ getcodec(PyObject *self, PyObject *encoding) if (codecobj == NULL) return NULL; - r = PyObject_CallFunctionObjArgs(cofunc, codecobj, NULL); + r = PyObject_CallOneArg(cofunc, codecobj); Py_DECREF(codecobj); return r; diff --git a/Modules/cjkcodecs/mappings_cn.h b/Modules/cjkcodecs/mappings_cn.h index 1f8c299d..87ca0de7 100644 --- a/Modules/cjkcodecs/mappings_cn.h +++ b/Modules/cjkcodecs/mappings_cn.h @@ -1,3 +1,4 @@ +// AUTO-GENERATED FILE FROM genmap_schinese.py: DO NOT EDIT static const ucs2_t __gb2312_decmap[7482] = { 12288,12289,12290,12539,713,711,168,12291,12293,8213,65374,8214,8230,8216, 8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303, diff --git a/Modules/cjkcodecs/mappings_jisx0213_pair.h b/Modules/cjkcodecs/mappings_jisx0213_pair.h index 729e4bcb..c96f2014 100644 --- a/Modules/cjkcodecs/mappings_jisx0213_pair.h +++ b/Modules/cjkcodecs/mappings_jisx0213_pair.h @@ -1,3 +1,4 @@ +// AUTO-GENERATED FILE FROM genmap_japanese.py: DO NOT EDIT #define JISX0213_ENCPAIRS 46 #ifdef EXTERN_JISX0213_PAIR static const struct widedbcs_index *jisx0213_pair_decmap; diff --git a/Modules/cjkcodecs/mappings_jp.h b/Modules/cjkcodecs/mappings_jp.h index c6dae3da..409aeae2 100644 --- a/Modules/cjkcodecs/mappings_jp.h +++ b/Modules/cjkcodecs/mappings_jp.h @@ -1,3 +1,4 @@ +// AUTO-GENERATED FILE FROM genmap_japanese.py: DO NOT EDIT static const ucs2_t __jisx0208_decmap[6956] = { 12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180, 65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294, diff --git a/Modules/cjkcodecs/mappings_kr.h b/Modules/cjkcodecs/mappings_kr.h index 7e6fdd27..bb59accc 100644 --- a/Modules/cjkcodecs/mappings_kr.h +++ b/Modules/cjkcodecs/mappings_kr.h @@ -1,3 +1,4 @@ +// AUTO-GENERATED FILE FROM genmap_korean.py: DO NOT EDIT static const ucs2_t __ksx1001_decmap[8264] = { 12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217, 8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304, @@ -3249,3 +3250,4 @@ __cp949_encmap+31959,0,255},{__cp949_encmap+32215,0,255},{__cp949_encmap+32471 __cp949_encmap+32891,0,11},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp949_encmap+ 32903,1,230}, }; + diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 4a751f7c..86402768 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -6,7 +6,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "multibytecodec.h" #include "clinic/multibytecodec.c.h" @@ -81,7 +81,7 @@ internal_error_callback(const char *errors) static PyObject * call_error_callback(PyObject *errors, PyObject *exc) { - PyObject *args, *cb, *r; + PyObject *cb, *r; const char *str; assert(PyUnicode_Check(errors)); @@ -92,17 +92,7 @@ call_error_callback(PyObject *errors, PyObject *exc) if (cb == NULL) return NULL; - args = PyTuple_New(1); - if (args == NULL) { - Py_DECREF(cb); - return NULL; - } - - PyTuple_SET_ITEM(args, 0, exc); - Py_INCREF(exc); - - r = PyObject_CallObject(cb, args); - Py_DECREF(args); + r = PyObject_CallOneArg(cb, exc); Py_DECREF(cb); return r; } @@ -238,7 +228,7 @@ multibytecodec_encerror(MultibyteCodec *codec, Py_ssize_t r; Py_ssize_t inpos; int kind; - void *data; + const void *data; replchar = PyUnicode_FromOrdinal('?'); if (replchar == NULL) @@ -467,7 +457,7 @@ multibytecodec_encode(MultibyteCodec *codec, Py_ssize_t finalsize, r = 0; Py_ssize_t datalen; int kind; - void *data; + const void *data; if (PyUnicode_READY(text) < 0) return NULL; @@ -1256,7 +1246,7 @@ _multibytecodec_MultibyteIncrementalDecoder_setstate_impl(MultibyteIncrementalDe PyObject *buffer; PyLongObject *statelong; Py_ssize_t buffersize; - char *bufferstr; + const char *bufferstr; unsigned char statebytes[8]; if (!PyArg_ParseTuple(state, "SO!;setstate(): illegal state argument", @@ -1460,7 +1450,7 @@ mbstreamreader_iread(MultibyteStreamReaderObject *self, PyErr_Format(PyExc_TypeError, "stream function returned a " "non-bytes object (%.100s)", - cres->ob_type->tp_name); + Py_TYPE(cres)->tp_name); goto errorexit; } @@ -1786,7 +1776,7 @@ mbstreamwriter_iwrite(MultibyteStreamWriterObject *self, if (str == NULL) return -1; - wr = _PyObject_CallMethodIdObjArgs(self->stream, &PyId_write, str, NULL); + wr = _PyObject_CallMethodIdOneArg(self->stream, &PyId_write, str); Py_DECREF(str); if (wr == NULL) return -1; @@ -1880,7 +1870,7 @@ _multibytecodec_MultibyteStreamWriter_reset_impl(MultibyteStreamWriterObject *se if (PyBytes_Size(pwrt) > 0) { PyObject *wr; - wr = _PyObject_CallMethodIdObjArgs(self->stream, &PyId_write, pwrt); + wr = _PyObject_CallMethodIdOneArg(self->stream, &PyId_write, pwrt); if (wr == NULL) { Py_DECREF(pwrt); return NULL; @@ -2069,14 +2059,12 @@ static struct PyModuleDef _multibytecodecmodule = { PyMODINIT_FUNC PyInit__multibytecodec(void) { - int i; PyObject *m; PyTypeObject *typelist[] = { &MultibyteIncrementalEncoder_Type, &MultibyteIncrementalDecoder_Type, &MultibyteStreamReader_Type, - &MultibyteStreamWriter_Type, - NULL + &MultibyteStreamWriter_Type }; if (PyType_Ready(&MultibyteCodec_Type) < 0) @@ -2086,16 +2074,13 @@ PyInit__multibytecodec(void) if (m == NULL) return NULL; - for (i = 0; typelist[i] != NULL; i++) { - if (PyType_Ready(typelist[i]) < 0) + for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) { + if (PyModule_AddType(m, typelist[i]) < 0) { return NULL; - Py_INCREF(typelist[i]); - PyModule_AddObject(m, typelist[i]->tp_name, - (PyObject *)typelist[i]); + } } if (PyErr_Occurred()) { - Py_FatalError("can't initialize the _multibytecodec module"); Py_DECREF(m); m = NULL; } diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h index 6d34534e..59468210 100644 --- a/Modules/cjkcodecs/multibytecodec.h +++ b/Modules/cjkcodecs/multibytecodec.h @@ -30,7 +30,7 @@ typedef struct { typedef int (*mbcodec_init)(const void *config); typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state, const void *config, - int kind, void *data, + int kind, const void *data, Py_ssize_t *inpos, Py_ssize_t inlen, unsigned char **outbuf, Py_ssize_t outleft, int flags); @@ -65,7 +65,7 @@ typedef struct { MultibyteCodec *codec; } MultibyteCodecObject; -#define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type) +#define MultibyteCodec_Check(op) Py_IS_TYPE((op), &MultibyteCodec_Type) #define _MultibyteStatefulCodec_HEAD \ PyObject_HEAD \ diff --git a/Modules/clinic/_asynciomodule.c.h b/Modules/clinic/_asynciomodule.c.h index 17eb7733..a071efc1 100644 --- a/Modules/clinic/_asynciomodule.c.h +++ b/Modules/clinic/_asynciomodule.c.h @@ -174,7 +174,7 @@ PyDoc_STRVAR(_asyncio_Future_remove_done_callback__doc__, {"remove_done_callback", (PyCFunction)_asyncio_Future_remove_done_callback, METH_O, _asyncio_Future_remove_done_callback__doc__}, PyDoc_STRVAR(_asyncio_Future_cancel__doc__, -"cancel($self, /)\n" +"cancel($self, /, msg=None)\n" "--\n" "\n" "Cancel the future and schedule callbacks.\n" @@ -184,15 +184,34 @@ PyDoc_STRVAR(_asyncio_Future_cancel__doc__, "return True."); #define _ASYNCIO_FUTURE_CANCEL_METHODDEF \ - {"cancel", (PyCFunction)_asyncio_Future_cancel, METH_NOARGS, _asyncio_Future_cancel__doc__}, + {"cancel", (PyCFunction)(void(*)(void))_asyncio_Future_cancel, METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_cancel__doc__}, static PyObject * -_asyncio_Future_cancel_impl(FutureObj *self); +_asyncio_Future_cancel_impl(FutureObj *self, PyObject *msg); static PyObject * -_asyncio_Future_cancel(FutureObj *self, PyObject *Py_UNUSED(ignored)) +_asyncio_Future_cancel(FutureObj *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _asyncio_Future_cancel_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = {"msg", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "cancel", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *msg = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + msg = args[0]; +skip_optional_pos: + return_value = _asyncio_Future_cancel_impl(self, msg); + +exit: + return return_value; } PyDoc_STRVAR(_asyncio_Future_cancelled__doc__, @@ -252,6 +271,27 @@ _asyncio_Future_get_loop(FutureObj *self, PyObject *Py_UNUSED(ignored)) return _asyncio_Future_get_loop_impl(self); } +PyDoc_STRVAR(_asyncio_Future__make_cancelled_error__doc__, +"_make_cancelled_error($self, /)\n" +"--\n" +"\n" +"Create the CancelledError to raise if the Future is cancelled.\n" +"\n" +"This should only be called once when handling a cancellation since\n" +"it erases the context exception value."); + +#define _ASYNCIO_FUTURE__MAKE_CANCELLED_ERROR_METHODDEF \ + {"_make_cancelled_error", (PyCFunction)_asyncio_Future__make_cancelled_error, METH_NOARGS, _asyncio_Future__make_cancelled_error__doc__}, + +static PyObject * +_asyncio_Future__make_cancelled_error_impl(FutureObj *self); + +static PyObject * +_asyncio_Future__make_cancelled_error(FutureObj *self, PyObject *Py_UNUSED(ignored)) +{ + return _asyncio_Future__make_cancelled_error_impl(self); +} + PyDoc_STRVAR(_asyncio_Future__repr_info__doc__, "_repr_info($self, /)\n" "--\n" @@ -315,84 +355,25 @@ exit: return return_value; } -PyDoc_STRVAR(_asyncio_Task_current_task__doc__, -"current_task($type, /, loop=None)\n" +PyDoc_STRVAR(_asyncio_Task__make_cancelled_error__doc__, +"_make_cancelled_error($self, /)\n" "--\n" "\n" -"Return the currently running task in an event loop or None.\n" +"Create the CancelledError to raise if the Task is cancelled.\n" "\n" -"By default the current task for the current event loop is returned.\n" -"\n" -"None is returned when called not in the context of a Task."); +"This should only be called once when handling a cancellation since\n" +"it erases the context exception value."); -#define _ASYNCIO_TASK_CURRENT_TASK_METHODDEF \ - {"current_task", (PyCFunction)(void(*)(void))_asyncio_Task_current_task, METH_FASTCALL|METH_KEYWORDS|METH_CLASS, _asyncio_Task_current_task__doc__}, +#define _ASYNCIO_TASK__MAKE_CANCELLED_ERROR_METHODDEF \ + {"_make_cancelled_error", (PyCFunction)_asyncio_Task__make_cancelled_error, METH_NOARGS, _asyncio_Task__make_cancelled_error__doc__}, static PyObject * -_asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop); +_asyncio_Task__make_cancelled_error_impl(TaskObj *self); static PyObject * -_asyncio_Task_current_task(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_asyncio_Task__make_cancelled_error(TaskObj *self, PyObject *Py_UNUSED(ignored)) { - PyObject *return_value = NULL; - static const char * const _keywords[] = {"loop", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "current_task", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; - PyObject *loop = Py_None; - - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_pos; - } - loop = args[0]; -skip_optional_pos: - return_value = _asyncio_Task_current_task_impl(type, loop); - -exit: - return return_value; -} - -PyDoc_STRVAR(_asyncio_Task_all_tasks__doc__, -"all_tasks($type, /, loop=None)\n" -"--\n" -"\n" -"Return a set of all tasks for an event loop.\n" -"\n" -"By default all tasks for the current event loop are returned."); - -#define _ASYNCIO_TASK_ALL_TASKS_METHODDEF \ - {"all_tasks", (PyCFunction)(void(*)(void))_asyncio_Task_all_tasks, METH_FASTCALL|METH_KEYWORDS|METH_CLASS, _asyncio_Task_all_tasks__doc__}, - -static PyObject * -_asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop); - -static PyObject * -_asyncio_Task_all_tasks(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) -{ - PyObject *return_value = NULL; - static const char * const _keywords[] = {"loop", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "all_tasks", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; - PyObject *loop = Py_None; - - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_pos; - } - loop = args[0]; -skip_optional_pos: - return_value = _asyncio_Task_all_tasks_impl(type, loop); - -exit: - return return_value; + return _asyncio_Task__make_cancelled_error_impl(self); } PyDoc_STRVAR(_asyncio_Task__repr_info__doc__, @@ -413,7 +394,7 @@ _asyncio_Task__repr_info(TaskObj *self, PyObject *Py_UNUSED(ignored)) } PyDoc_STRVAR(_asyncio_Task_cancel__doc__, -"cancel($self, /)\n" +"cancel($self, /, msg=None)\n" "--\n" "\n" "Request that this task cancel itself.\n" @@ -436,15 +417,34 @@ PyDoc_STRVAR(_asyncio_Task_cancel__doc__, "was not called)."); #define _ASYNCIO_TASK_CANCEL_METHODDEF \ - {"cancel", (PyCFunction)_asyncio_Task_cancel, METH_NOARGS, _asyncio_Task_cancel__doc__}, + {"cancel", (PyCFunction)(void(*)(void))_asyncio_Task_cancel, METH_FASTCALL|METH_KEYWORDS, _asyncio_Task_cancel__doc__}, static PyObject * -_asyncio_Task_cancel_impl(TaskObj *self); +_asyncio_Task_cancel_impl(TaskObj *self, PyObject *msg); static PyObject * -_asyncio_Task_cancel(TaskObj *self, PyObject *Py_UNUSED(ignored)) +_asyncio_Task_cancel(TaskObj *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _asyncio_Task_cancel_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = {"msg", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "cancel", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *msg = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + msg = args[0]; +skip_optional_pos: + return_value = _asyncio_Task_cancel_impl(self, msg); + +exit: + return return_value; } PyDoc_STRVAR(_asyncio_Task_get_stack__doc__, @@ -832,4 +832,4 @@ _asyncio__leave_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, exit: return return_value; } -/*[clinic end generated code: output=585ba1f8de5b4103 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d0fc522bcbff9d61 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_bisectmodule.c.h b/Modules/clinic/_bisectmodule.c.h new file mode 100644 index 00000000..80ab7048 --- /dev/null +++ b/Modules/clinic/_bisectmodule.c.h @@ -0,0 +1,306 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(_bisect_bisect_right__doc__, +"bisect_right($module, /, a, x, lo=0, hi=None)\n" +"--\n" +"\n" +"Return the index where to insert item x in list a, assuming a is sorted.\n" +"\n" +"The return value i is such that all e in a[:i] have e <= x, and all e in\n" +"a[i:] have e > x. So if x already appears in the list, i points just\n" +"beyond the rightmost x already there\n" +"\n" +"Optional args lo (default 0) and hi (default len(a)) bound the\n" +"slice of a to be searched."); + +#define _BISECT_BISECT_RIGHT_METHODDEF \ + {"bisect_right", (PyCFunction)(void(*)(void))_bisect_bisect_right, METH_FASTCALL|METH_KEYWORDS, _bisect_bisect_right__doc__}, + +static Py_ssize_t +_bisect_bisect_right_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi); + +static PyObject * +_bisect_bisect_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "bisect_right", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *x; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + Py_ssize_t _return_value; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + x = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + lo = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } +skip_optional_pos: + _return_value = _bisect_bisect_right_impl(module, a, x, lo, hi); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyLong_FromSsize_t(_return_value); + +exit: + return return_value; +} + +PyDoc_STRVAR(_bisect_insort_right__doc__, +"insort_right($module, /, a, x, lo=0, hi=None)\n" +"--\n" +"\n" +"Insert item x in list a, and keep it sorted assuming a is sorted.\n" +"\n" +"If x is already in a, insert it to the right of the rightmost x.\n" +"\n" +"Optional args lo (default 0) and hi (default len(a)) bound the\n" +"slice of a to be searched."); + +#define _BISECT_INSORT_RIGHT_METHODDEF \ + {"insort_right", (PyCFunction)(void(*)(void))_bisect_insort_right, METH_FASTCALL|METH_KEYWORDS, _bisect_insort_right__doc__}, + +static PyObject * +_bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi); + +static PyObject * +_bisect_insort_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "insort_right", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *x; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + x = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + lo = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } +skip_optional_pos: + return_value = _bisect_insort_right_impl(module, a, x, lo, hi); + +exit: + return return_value; +} + +PyDoc_STRVAR(_bisect_bisect_left__doc__, +"bisect_left($module, /, a, x, lo=0, hi=None)\n" +"--\n" +"\n" +"Return the index where to insert item x in list a, assuming a is sorted.\n" +"\n" +"The return value i is such that all e in a[:i] have e < x, and all e in\n" +"a[i:] have e >= x. So if x already appears in the list, i points just\n" +"before the leftmost x already there.\n" +"\n" +"Optional args lo (default 0) and hi (default len(a)) bound the\n" +"slice of a to be searched."); + +#define _BISECT_BISECT_LEFT_METHODDEF \ + {"bisect_left", (PyCFunction)(void(*)(void))_bisect_bisect_left, METH_FASTCALL|METH_KEYWORDS, _bisect_bisect_left__doc__}, + +static Py_ssize_t +_bisect_bisect_left_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi); + +static PyObject * +_bisect_bisect_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "bisect_left", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *x; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + Py_ssize_t _return_value; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + x = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + lo = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } +skip_optional_pos: + _return_value = _bisect_bisect_left_impl(module, a, x, lo, hi); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyLong_FromSsize_t(_return_value); + +exit: + return return_value; +} + +PyDoc_STRVAR(_bisect_insort_left__doc__, +"insort_left($module, /, a, x, lo=0, hi=None)\n" +"--\n" +"\n" +"Insert item x in list a, and keep it sorted assuming a is sorted.\n" +"\n" +"If x is already in a, insert it to the left of the leftmost x.\n" +"\n" +"Optional args lo (default 0) and hi (default len(a)) bound the\n" +"slice of a to be searched."); + +#define _BISECT_INSORT_LEFT_METHODDEF \ + {"insort_left", (PyCFunction)(void(*)(void))_bisect_insort_left, METH_FASTCALL|METH_KEYWORDS, _bisect_insort_left__doc__}, + +static PyObject * +_bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi); + +static PyObject * +_bisect_insort_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "insort_left", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *x; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + x = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + lo = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } +skip_optional_pos: + return_value = _bisect_insort_left_impl(module, a, x, lo, hi); + +exit: + return return_value; +} +/*[clinic end generated code: output=bcbd6c77331a08f0 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_bz2module.c.h b/Modules/clinic/_bz2module.c.h index ac826bd9..0eb6280d 100644 --- a/Modules/clinic/_bz2module.c.h +++ b/Modules/clinic/_bz2module.c.h @@ -85,7 +85,7 @@ _bz2_BZ2Compressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) int return_value = -1; int compresslevel = 9; - if ((Py_TYPE(self) == &BZ2Compressor_Type) && + if (Py_IS_TYPE(self, &BZ2Compressor_Type) && !_PyArg_NoKeywords("BZ2Compressor", kwargs)) { goto exit; } @@ -207,11 +207,11 @@ _bz2_BZ2Decompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; - if ((Py_TYPE(self) == &BZ2Decompressor_Type) && + if (Py_IS_TYPE(self, &BZ2Decompressor_Type) && !_PyArg_NoPositional("BZ2Decompressor", args)) { goto exit; } - if ((Py_TYPE(self) == &BZ2Decompressor_Type) && + if (Py_IS_TYPE(self, &BZ2Decompressor_Type) && !_PyArg_NoKeywords("BZ2Decompressor", kwargs)) { goto exit; } @@ -220,4 +220,4 @@ _bz2_BZ2Decompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=ec3d1b3652c98823 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3f3f1e788fe28ee1 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_cursesmodule.c.h b/Modules/clinic/_cursesmodule.c.h index ad93e6a0..50d7f213 100644 --- a/Modules/clinic/_cursesmodule.c.h +++ b/Modules/clinic/_cursesmodule.c.h @@ -3040,6 +3040,144 @@ exit: return return_value; } +#if (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) + +PyDoc_STRVAR(_curses_get_escdelay__doc__, +"get_escdelay($module, /)\n" +"--\n" +"\n" +"Gets the curses ESCDELAY setting.\n" +"\n" +"Gets the number of milliseconds to wait after reading an escape character,\n" +"to distinguish between an individual escape character entered on the\n" +"keyboard from escape sequences sent by cursor and function keys."); + +#define _CURSES_GET_ESCDELAY_METHODDEF \ + {"get_escdelay", (PyCFunction)_curses_get_escdelay, METH_NOARGS, _curses_get_escdelay__doc__}, + +static PyObject * +_curses_get_escdelay_impl(PyObject *module); + +static PyObject * +_curses_get_escdelay(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _curses_get_escdelay_impl(module); +} + +#endif /* (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) */ + +#if (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) + +PyDoc_STRVAR(_curses_set_escdelay__doc__, +"set_escdelay($module, ms, /)\n" +"--\n" +"\n" +"Sets the curses ESCDELAY setting.\n" +"\n" +" ms\n" +" length of the delay in milliseconds.\n" +"\n" +"Sets the number of milliseconds to wait after reading an escape character,\n" +"to distinguish between an individual escape character entered on the\n" +"keyboard from escape sequences sent by cursor and function keys."); + +#define _CURSES_SET_ESCDELAY_METHODDEF \ + {"set_escdelay", (PyCFunction)_curses_set_escdelay, METH_O, _curses_set_escdelay__doc__}, + +static PyObject * +_curses_set_escdelay_impl(PyObject *module, int ms); + +static PyObject * +_curses_set_escdelay(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int ms; + + if (PyFloat_Check(arg)) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + ms = _PyLong_AsInt(arg); + if (ms == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = _curses_set_escdelay_impl(module, ms); + +exit: + return return_value; +} + +#endif /* (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) */ + +#if (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) + +PyDoc_STRVAR(_curses_get_tabsize__doc__, +"get_tabsize($module, /)\n" +"--\n" +"\n" +"Gets the curses TABSIZE setting.\n" +"\n" +"Gets the number of columns used by the curses library when converting a tab\n" +"character to spaces as it adds the tab to a window."); + +#define _CURSES_GET_TABSIZE_METHODDEF \ + {"get_tabsize", (PyCFunction)_curses_get_tabsize, METH_NOARGS, _curses_get_tabsize__doc__}, + +static PyObject * +_curses_get_tabsize_impl(PyObject *module); + +static PyObject * +_curses_get_tabsize(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _curses_get_tabsize_impl(module); +} + +#endif /* (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) */ + +#if (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) + +PyDoc_STRVAR(_curses_set_tabsize__doc__, +"set_tabsize($module, size, /)\n" +"--\n" +"\n" +"Sets the curses TABSIZE setting.\n" +"\n" +" size\n" +" rendered cell width of a tab character.\n" +"\n" +"Sets the number of columns used by the curses library when converting a tab\n" +"character to spaces as it adds the tab to a window."); + +#define _CURSES_SET_TABSIZE_METHODDEF \ + {"set_tabsize", (PyCFunction)_curses_set_tabsize, METH_O, _curses_set_tabsize__doc__}, + +static PyObject * +_curses_set_tabsize_impl(PyObject *module, int size); + +static PyObject * +_curses_set_tabsize(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int size; + + if (PyFloat_Check(arg)) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + size = _PyLong_AsInt(arg); + if (size == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = _curses_set_tabsize_impl(module, size); + +exit: + return return_value; +} + +#endif /* (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) */ + PyDoc_STRVAR(_curses_intrflush__doc__, "intrflush($module, flag, /)\n" "--\n" @@ -3799,23 +3937,13 @@ PyDoc_STRVAR(_curses_update_lines_cols__doc__, #define _CURSES_UPDATE_LINES_COLS_METHODDEF \ {"update_lines_cols", (PyCFunction)_curses_update_lines_cols, METH_NOARGS, _curses_update_lines_cols__doc__}, -static int +static PyObject * _curses_update_lines_cols_impl(PyObject *module); static PyObject * _curses_update_lines_cols(PyObject *module, PyObject *Py_UNUSED(ignored)) { - PyObject *return_value = NULL; - int _return_value; - - _return_value = _curses_update_lines_cols_impl(module); - if ((_return_value == -1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromLong((long)_return_value); - -exit: - return return_value; + return _curses_update_lines_cols_impl(module); } #endif /* (defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)) */ @@ -4526,6 +4654,22 @@ _curses_use_default_colors(PyObject *module, PyObject *Py_UNUSED(ignored)) #define _CURSES_HAS_KEY_METHODDEF #endif /* !defined(_CURSES_HAS_KEY_METHODDEF) */ +#ifndef _CURSES_GET_ESCDELAY_METHODDEF + #define _CURSES_GET_ESCDELAY_METHODDEF +#endif /* !defined(_CURSES_GET_ESCDELAY_METHODDEF) */ + +#ifndef _CURSES_SET_ESCDELAY_METHODDEF + #define _CURSES_SET_ESCDELAY_METHODDEF +#endif /* !defined(_CURSES_SET_ESCDELAY_METHODDEF) */ + +#ifndef _CURSES_GET_TABSIZE_METHODDEF + #define _CURSES_GET_TABSIZE_METHODDEF +#endif /* !defined(_CURSES_GET_TABSIZE_METHODDEF) */ + +#ifndef _CURSES_SET_TABSIZE_METHODDEF + #define _CURSES_SET_TABSIZE_METHODDEF +#endif /* !defined(_CURSES_SET_TABSIZE_METHODDEF) */ + #ifndef _CURSES_IS_TERM_RESIZED_METHODDEF #define _CURSES_IS_TERM_RESIZED_METHODDEF #endif /* !defined(_CURSES_IS_TERM_RESIZED_METHODDEF) */ @@ -4569,4 +4713,4 @@ _curses_use_default_colors(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef _CURSES_USE_DEFAULT_COLORS_METHODDEF #define _CURSES_USE_DEFAULT_COLORS_METHODDEF #endif /* !defined(_CURSES_USE_DEFAULT_COLORS_METHODDEF) */ -/*[clinic end generated code: output=e5b3502f1d38dff0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b53652f8acafd817 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_datetimemodule.c.h b/Modules/clinic/_datetimemodule.c.h index 447036ca..973a4ea0 100644 --- a/Modules/clinic/_datetimemodule.c.h +++ b/Modules/clinic/_datetimemodule.c.h @@ -14,6 +14,60 @@ PyDoc_STRVAR(datetime_date_fromtimestamp__doc__, #define DATETIME_DATE_FROMTIMESTAMP_METHODDEF \ {"fromtimestamp", (PyCFunction)datetime_date_fromtimestamp, METH_O|METH_CLASS, datetime_date_fromtimestamp__doc__}, +static PyObject * +iso_calendar_date_new_impl(PyTypeObject *type, int year, int week, + int weekday); + +static PyObject * +iso_calendar_date_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"year", "week", "weekday", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "IsoCalendarDate", 0}; + PyObject *argsbuf[3]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + int year; + int week; + int weekday; + + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 3, 3, 0, argsbuf); + if (!fastargs) { + goto exit; + } + if (PyFloat_Check(fastargs[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + year = _PyLong_AsInt(fastargs[0]); + if (year == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(fastargs[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + week = _PyLong_AsInt(fastargs[1]); + if (week == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(fastargs[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + weekday = _PyLong_AsInt(fastargs[2]); + if (weekday == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = iso_calendar_date_new_impl(type, year, week, weekday); + +exit: + return return_value; +} + PyDoc_STRVAR(datetime_datetime_now__doc__, "now($type, /, tz=None)\n" "--\n" @@ -55,4 +109,4 @@ skip_optional_pos: exit: return return_value; } -/*[clinic end generated code: output=aae916ab728ca85b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5e17549f29a439a5 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index 0bc4bb5d..825416f4 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -355,23 +355,6 @@ exit: return return_value; } -PyDoc_STRVAR(_elementtree_Element_getchildren__doc__, -"getchildren($self, /)\n" -"--\n" -"\n"); - -#define _ELEMENTTREE_ELEMENT_GETCHILDREN_METHODDEF \ - {"getchildren", (PyCFunction)_elementtree_Element_getchildren, METH_NOARGS, _elementtree_Element_getchildren__doc__}, - -static PyObject * -_elementtree_Element_getchildren_impl(ElementObject *self); - -static PyObject * -_elementtree_Element_getchildren(ElementObject *self, PyObject *Py_UNUSED(ignored)) -{ - return _elementtree_Element_getchildren_impl(self); -} - PyDoc_STRVAR(_elementtree_Element_iter__doc__, "iter($self, /, tag=None)\n" "--\n" @@ -408,42 +391,6 @@ exit: return return_value; } -PyDoc_STRVAR(_elementtree_Element_getiterator__doc__, -"getiterator($self, /, tag=None)\n" -"--\n" -"\n"); - -#define _ELEMENTTREE_ELEMENT_GETITERATOR_METHODDEF \ - {"getiterator", (PyCFunction)(void(*)(void))_elementtree_Element_getiterator, METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_getiterator__doc__}, - -static PyObject * -_elementtree_Element_getiterator_impl(ElementObject *self, PyObject *tag); - -static PyObject * -_elementtree_Element_getiterator(ElementObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) -{ - PyObject *return_value = NULL; - static const char * const _keywords[] = {"tag", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "getiterator", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; - PyObject *tag = Py_None; - - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_pos; - } - tag = args[0]; -skip_optional_pos: - return_value = _elementtree_Element_getiterator_impl(self, tag); - -exit: - return return_value; -} - PyDoc_STRVAR(_elementtree_Element_itertext__doc__, "itertext($self, /)\n" "--\n" @@ -568,6 +515,10 @@ _elementtree_Element_makeelement(ElementObject *self, PyObject *const *args, Py_ goto exit; } tag = args[0]; + if (!PyDict_Check(args[1])) { + _PyArg_BadArgument("makeelement", "argument 2", "dict", args[1]); + goto exit; + } attrib = args[1]; return_value = _elementtree_Element_makeelement_impl(self, tag, attrib); @@ -814,7 +765,7 @@ _elementtree_TreeBuilder_close(TreeBuilderObject *self, PyObject *Py_UNUSED(igno } PyDoc_STRVAR(_elementtree_TreeBuilder_start__doc__, -"start($self, tag, attrs=None, /)\n" +"start($self, tag, attrs, /)\n" "--\n" "\n"); @@ -830,17 +781,17 @@ _elementtree_TreeBuilder_start(TreeBuilderObject *self, PyObject *const *args, P { PyObject *return_value = NULL; PyObject *tag; - PyObject *attrs = Py_None; + PyObject *attrs; - if (!_PyArg_CheckPositional("start", nargs, 1, 2)) { + if (!_PyArg_CheckPositional("start", nargs, 2, 2)) { goto exit; } tag = args[0]; - if (nargs < 2) { - goto skip_optional; + if (!PyDict_Check(args[1])) { + _PyArg_BadArgument("start", "argument 2", "dict", args[1]); + goto exit; } attrs = args[1]; -skip_optional: return_value = _elementtree_TreeBuilder_start_impl(self, tag, attrs); exit: @@ -969,4 +920,4 @@ skip_optional: exit: return return_value; } -/*[clinic end generated code: output=1443ed7bb9f9e03e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b7f6a32462fc42a9 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_hashopenssl.c.h b/Modules/clinic/_hashopenssl.c.h index 9aaea47e..68aa765e 100644 --- a/Modules/clinic/_hashopenssl.c.h +++ b/Modules/clinic/_hashopenssl.c.h @@ -65,8 +65,112 @@ PyDoc_STRVAR(EVP_update__doc__, #define EVP_UPDATE_METHODDEF \ {"update", (PyCFunction)EVP_update, METH_O, EVP_update__doc__}, +#if defined(PY_OPENSSL_HAS_SHAKE) + +PyDoc_STRVAR(EVPXOF_digest__doc__, +"digest($self, /, length)\n" +"--\n" +"\n" +"Return the digest value as a bytes object."); + +#define EVPXOF_DIGEST_METHODDEF \ + {"digest", (PyCFunction)(void(*)(void))EVPXOF_digest, METH_FASTCALL|METH_KEYWORDS, EVPXOF_digest__doc__}, + +static PyObject * +EVPXOF_digest_impl(EVPobject *self, Py_ssize_t length); + +static PyObject * +EVPXOF_digest(EVPobject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"length", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "digest", 0}; + PyObject *argsbuf[1]; + Py_ssize_t length; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[0]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + length = ival; + } + return_value = EVPXOF_digest_impl(self, length); + +exit: + return return_value; +} + +#endif /* defined(PY_OPENSSL_HAS_SHAKE) */ + +#if defined(PY_OPENSSL_HAS_SHAKE) + +PyDoc_STRVAR(EVPXOF_hexdigest__doc__, +"hexdigest($self, /, length)\n" +"--\n" +"\n" +"Return the digest value as a string of hexadecimal digits."); + +#define EVPXOF_HEXDIGEST_METHODDEF \ + {"hexdigest", (PyCFunction)(void(*)(void))EVPXOF_hexdigest, METH_FASTCALL|METH_KEYWORDS, EVPXOF_hexdigest__doc__}, + +static PyObject * +EVPXOF_hexdigest_impl(EVPobject *self, Py_ssize_t length); + +static PyObject * +EVPXOF_hexdigest(EVPobject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"length", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "hexdigest", 0}; + PyObject *argsbuf[1]; + Py_ssize_t length; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[0]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + length = ival; + } + return_value = EVPXOF_hexdigest_impl(self, length); + +exit: + return return_value; +} + +#endif /* defined(PY_OPENSSL_HAS_SHAKE) */ + PyDoc_STRVAR(EVP_new__doc__, -"new($module, /, name, string=b\'\')\n" +"new($module, /, name, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new hash object using the named algorithm.\n" @@ -80,18 +184,20 @@ PyDoc_STRVAR(EVP_new__doc__, {"new", (PyCFunction)(void(*)(void))EVP_new, METH_FASTCALL|METH_KEYWORDS, EVP_new__doc__}, static PyObject * -EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj); +EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj, + int usedforsecurity); static PyObject * EVP_new(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"name", "string", NULL}; + static const char * const _keywords[] = {"name", "string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "new", 0}; - PyObject *argsbuf[2]; + PyObject *argsbuf[3]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *name_obj; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); if (!args) { @@ -101,16 +207,29 @@ EVP_new(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwn if (!noptargs) { goto skip_optional_pos; } - data_obj = args[1]; + if (args[1]) { + data_obj = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = EVP_new_impl(module, name_obj, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[2]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = EVP_new_impl(module, name_obj, data_obj, usedforsecurity); exit: return return_value; } PyDoc_STRVAR(_hashlib_openssl_md5__doc__, -"openssl_md5($module, /, string=b\'\')\n" +"openssl_md5($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Returns a md5 hash object; optionally initialized with a string"); @@ -119,54 +238,389 @@ PyDoc_STRVAR(_hashlib_openssl_md5__doc__, {"openssl_md5", (PyCFunction)(void(*)(void))_hashlib_openssl_md5, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_md5__doc__}, static PyObject * -_hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * _hashlib_openssl_md5(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "openssl_md5", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_md5_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_openssl_sha1__doc__, +"openssl_sha1($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha1 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA1_METHODDEF \ + {"openssl_sha1", (PyCFunction)(void(*)(void))_hashlib_openssl_sha1, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha1__doc__}, + +static PyObject * +_hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha1", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { goto exit; } if (!noptargs) { - goto skip_optional_pos; + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha1_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_openssl_sha224__doc__, +"openssl_sha224($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha224 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA224_METHODDEF \ + {"openssl_sha224", (PyCFunction)(void(*)(void))_hashlib_openssl_sha224, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha224__doc__}, + +static PyObject * +_hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha224", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha224_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_openssl_sha256__doc__, +"openssl_sha256($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha256 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA256_METHODDEF \ + {"openssl_sha256", (PyCFunction)(void(*)(void))_hashlib_openssl_sha256, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha256__doc__}, + +static PyObject * +_hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha256", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha256_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_openssl_sha384__doc__, +"openssl_sha384($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha384 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA384_METHODDEF \ + {"openssl_sha384", (PyCFunction)(void(*)(void))_hashlib_openssl_sha384, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha384__doc__}, + +static PyObject * +_hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha384", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha384_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_openssl_sha512__doc__, +"openssl_sha512($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha512 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA512_METHODDEF \ + {"openssl_sha512", (PyCFunction)(void(*)(void))_hashlib_openssl_sha512, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha512__doc__}, + +static PyObject * +_hashlib_openssl_sha512_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha512(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha512", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha512_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +#if defined(PY_OPENSSL_HAS_SHA3) + +PyDoc_STRVAR(_hashlib_openssl_sha3_224__doc__, +"openssl_sha3_224($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha3-224 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA3_224_METHODDEF \ + {"openssl_sha3_224", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_224, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_224__doc__}, + +static PyObject * +_hashlib_openssl_sha3_224_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha3_224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha3_224", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; } - data_obj = args[0]; -skip_optional_pos: - return_value = _hashlib_openssl_md5_impl(module, data_obj); + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha3_224_impl(module, data_obj, usedforsecurity); exit: return return_value; } -PyDoc_STRVAR(_hashlib_openssl_sha1__doc__, -"openssl_sha1($module, /, string=b\'\')\n" +#endif /* defined(PY_OPENSSL_HAS_SHA3) */ + +#if defined(PY_OPENSSL_HAS_SHA3) + +PyDoc_STRVAR(_hashlib_openssl_sha3_256__doc__, +"openssl_sha3_256($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" -"Returns a sha1 hash object; optionally initialized with a string"); +"Returns a sha3-256 hash object; optionally initialized with a string"); -#define _HASHLIB_OPENSSL_SHA1_METHODDEF \ - {"openssl_sha1", (PyCFunction)(void(*)(void))_hashlib_openssl_sha1, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha1__doc__}, +#define _HASHLIB_OPENSSL_SHA3_256_METHODDEF \ + {"openssl_sha3_256", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_256, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_256__doc__}, static PyObject * -_hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_sha3_256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * -_hashlib_openssl_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_openssl_sha3_256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha1", 0}; - PyObject *argsbuf[1]; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha3_256", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -175,35 +629,54 @@ _hashlib_openssl_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, if (!noptargs) { goto skip_optional_pos; } - data_obj = args[0]; + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _hashlib_openssl_sha1_impl(module, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha3_256_impl(module, data_obj, usedforsecurity); exit: return return_value; } -PyDoc_STRVAR(_hashlib_openssl_sha224__doc__, -"openssl_sha224($module, /, string=b\'\')\n" +#endif /* defined(PY_OPENSSL_HAS_SHA3) */ + +#if defined(PY_OPENSSL_HAS_SHA3) + +PyDoc_STRVAR(_hashlib_openssl_sha3_384__doc__, +"openssl_sha3_384($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" -"Returns a sha224 hash object; optionally initialized with a string"); +"Returns a sha3-384 hash object; optionally initialized with a string"); -#define _HASHLIB_OPENSSL_SHA224_METHODDEF \ - {"openssl_sha224", (PyCFunction)(void(*)(void))_hashlib_openssl_sha224, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha224__doc__}, +#define _HASHLIB_OPENSSL_SHA3_384_METHODDEF \ + {"openssl_sha3_384", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_384, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_384__doc__}, static PyObject * -_hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_sha3_384_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * -_hashlib_openssl_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_openssl_sha3_384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha224", 0}; - PyObject *argsbuf[1]; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha3_384", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -212,35 +685,54 @@ _hashlib_openssl_sha224(PyObject *module, PyObject *const *args, Py_ssize_t narg if (!noptargs) { goto skip_optional_pos; } - data_obj = args[0]; + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _hashlib_openssl_sha224_impl(module, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha3_384_impl(module, data_obj, usedforsecurity); exit: return return_value; } -PyDoc_STRVAR(_hashlib_openssl_sha256__doc__, -"openssl_sha256($module, /, string=b\'\')\n" +#endif /* defined(PY_OPENSSL_HAS_SHA3) */ + +#if defined(PY_OPENSSL_HAS_SHA3) + +PyDoc_STRVAR(_hashlib_openssl_sha3_512__doc__, +"openssl_sha3_512($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" -"Returns a sha256 hash object; optionally initialized with a string"); +"Returns a sha3-512 hash object; optionally initialized with a string"); -#define _HASHLIB_OPENSSL_SHA256_METHODDEF \ - {"openssl_sha256", (PyCFunction)(void(*)(void))_hashlib_openssl_sha256, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha256__doc__}, +#define _HASHLIB_OPENSSL_SHA3_512_METHODDEF \ + {"openssl_sha3_512", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_512, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_512__doc__}, static PyObject * -_hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_sha3_512_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * -_hashlib_openssl_sha256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_openssl_sha3_512(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha256", 0}; - PyObject *argsbuf[1]; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha3_512", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -249,35 +741,54 @@ _hashlib_openssl_sha256(PyObject *module, PyObject *const *args, Py_ssize_t narg if (!noptargs) { goto skip_optional_pos; } - data_obj = args[0]; + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _hashlib_openssl_sha256_impl(module, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha3_512_impl(module, data_obj, usedforsecurity); exit: return return_value; } -PyDoc_STRVAR(_hashlib_openssl_sha384__doc__, -"openssl_sha384($module, /, string=b\'\')\n" +#endif /* defined(PY_OPENSSL_HAS_SHA3) */ + +#if defined(PY_OPENSSL_HAS_SHAKE) + +PyDoc_STRVAR(_hashlib_openssl_shake_128__doc__, +"openssl_shake_128($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" -"Returns a sha384 hash object; optionally initialized with a string"); +"Returns a shake-128 variable hash object; optionally initialized with a string"); -#define _HASHLIB_OPENSSL_SHA384_METHODDEF \ - {"openssl_sha384", (PyCFunction)(void(*)(void))_hashlib_openssl_sha384, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha384__doc__}, +#define _HASHLIB_OPENSSL_SHAKE_128_METHODDEF \ + {"openssl_shake_128", (PyCFunction)(void(*)(void))_hashlib_openssl_shake_128, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_shake_128__doc__}, static PyObject * -_hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_shake_128_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * -_hashlib_openssl_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_openssl_shake_128(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha384", 0}; - PyObject *argsbuf[1]; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_shake_128", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -286,35 +797,54 @@ _hashlib_openssl_sha384(PyObject *module, PyObject *const *args, Py_ssize_t narg if (!noptargs) { goto skip_optional_pos; } - data_obj = args[0]; + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _hashlib_openssl_sha384_impl(module, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_shake_128_impl(module, data_obj, usedforsecurity); exit: return return_value; } -PyDoc_STRVAR(_hashlib_openssl_sha512__doc__, -"openssl_sha512($module, /, string=b\'\')\n" +#endif /* defined(PY_OPENSSL_HAS_SHAKE) */ + +#if defined(PY_OPENSSL_HAS_SHAKE) + +PyDoc_STRVAR(_hashlib_openssl_shake_256__doc__, +"openssl_shake_256($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" -"Returns a sha512 hash object; optionally initialized with a string"); +"Returns a shake-256 variable hash object; optionally initialized with a string"); -#define _HASHLIB_OPENSSL_SHA512_METHODDEF \ - {"openssl_sha512", (PyCFunction)(void(*)(void))_hashlib_openssl_sha512, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha512__doc__}, +#define _HASHLIB_OPENSSL_SHAKE_256_METHODDEF \ + {"openssl_shake_256", (PyCFunction)(void(*)(void))_hashlib_openssl_shake_256, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_shake_256__doc__}, static PyObject * -_hashlib_openssl_sha512_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_shake_256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * -_hashlib_openssl_sha512(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_openssl_shake_256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha512", 0}; - PyObject *argsbuf[1]; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_shake_256", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -323,14 +853,29 @@ _hashlib_openssl_sha512(PyObject *module, PyObject *const *args, Py_ssize_t narg if (!noptargs) { goto skip_optional_pos; } - data_obj = args[0]; + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _hashlib_openssl_sha512_impl(module, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_shake_256_impl(module, data_obj, usedforsecurity); exit: return return_value; } +#endif /* defined(PY_OPENSSL_HAS_SHAKE) */ + PyDoc_STRVAR(pbkdf2_hmac__doc__, "pbkdf2_hmac($module, /, hash_name, password, salt, iterations,\n" " dklen=None)\n" @@ -550,21 +1095,21 @@ exit: #endif /* (OPENSSL_VERSION_NUMBER > 0x10100000L && !defined(OPENSSL_NO_SCRYPT) && !defined(LIBRESSL_VERSION_NUMBER)) */ -PyDoc_STRVAR(_hashlib_hmac_digest__doc__, +PyDoc_STRVAR(_hashlib_hmac_singleshot__doc__, "hmac_digest($module, /, key, msg, digest)\n" "--\n" "\n" "Single-shot HMAC."); -#define _HASHLIB_HMAC_DIGEST_METHODDEF \ - {"hmac_digest", (PyCFunction)(void(*)(void))_hashlib_hmac_digest, METH_FASTCALL|METH_KEYWORDS, _hashlib_hmac_digest__doc__}, +#define _HASHLIB_HMAC_SINGLESHOT_METHODDEF \ + {"hmac_digest", (PyCFunction)(void(*)(void))_hashlib_hmac_singleshot, METH_FASTCALL|METH_KEYWORDS, _hashlib_hmac_singleshot__doc__}, static PyObject * -_hashlib_hmac_digest_impl(PyObject *module, Py_buffer *key, Py_buffer *msg, - const char *digest); +_hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key, + Py_buffer *msg, const char *digest); static PyObject * -_hashlib_hmac_digest(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_hmac_singleshot(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"key", "msg", "digest", NULL}; @@ -605,7 +1150,7 @@ _hashlib_hmac_digest(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; } - return_value = _hashlib_hmac_digest_impl(module, &key, &msg, digest); + return_value = _hashlib_hmac_singleshot_impl(module, &key, &msg, digest); exit: /* Cleanup for key */ @@ -620,7 +1165,281 @@ exit: return return_value; } +PyDoc_STRVAR(_hashlib_hmac_new__doc__, +"hmac_new($module, /, key, msg=b\'\', digestmod=None)\n" +"--\n" +"\n" +"Return a new hmac object."); + +#define _HASHLIB_HMAC_NEW_METHODDEF \ + {"hmac_new", (PyCFunction)(void(*)(void))_hashlib_hmac_new, METH_FASTCALL|METH_KEYWORDS, _hashlib_hmac_new__doc__}, + +static PyObject * +_hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj, + const char *digestmod); + +static PyObject * +_hashlib_hmac_new(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"key", "msg", "digestmod", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "hmac_new", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + Py_buffer key = {NULL, NULL}; + PyObject *msg_obj = NULL; + const char *digestmod = NULL; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &key, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&key, 'C')) { + _PyArg_BadArgument("hmac_new", "argument 'key'", "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + msg_obj = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!PyUnicode_Check(args[2])) { + _PyArg_BadArgument("hmac_new", "argument 'digestmod'", "str", args[2]); + goto exit; + } + Py_ssize_t digestmod_length; + digestmod = PyUnicode_AsUTF8AndSize(args[2], &digestmod_length); + if (digestmod == NULL) { + goto exit; + } + if (strlen(digestmod) != (size_t)digestmod_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } +skip_optional_pos: + return_value = _hashlib_hmac_new_impl(module, &key, msg_obj, digestmod); + +exit: + /* Cleanup for key */ + if (key.obj) { + PyBuffer_Release(&key); + } + + return return_value; +} + +PyDoc_STRVAR(_hashlib_HMAC_copy__doc__, +"copy($self, /)\n" +"--\n" +"\n" +"Return a copy (\"clone\") of the HMAC object."); + +#define _HASHLIB_HMAC_COPY_METHODDEF \ + {"copy", (PyCFunction)_hashlib_HMAC_copy, METH_NOARGS, _hashlib_HMAC_copy__doc__}, + +static PyObject * +_hashlib_HMAC_copy_impl(HMACobject *self); + +static PyObject * +_hashlib_HMAC_copy(HMACobject *self, PyObject *Py_UNUSED(ignored)) +{ + return _hashlib_HMAC_copy_impl(self); +} + +PyDoc_STRVAR(_hashlib_HMAC_update__doc__, +"update($self, /, msg)\n" +"--\n" +"\n" +"Update the HMAC object with msg."); + +#define _HASHLIB_HMAC_UPDATE_METHODDEF \ + {"update", (PyCFunction)(void(*)(void))_hashlib_HMAC_update, METH_FASTCALL|METH_KEYWORDS, _hashlib_HMAC_update__doc__}, + +static PyObject * +_hashlib_HMAC_update_impl(HMACobject *self, PyObject *msg); + +static PyObject * +_hashlib_HMAC_update(HMACobject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"msg", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "update", 0}; + PyObject *argsbuf[1]; + PyObject *msg; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + msg = args[0]; + return_value = _hashlib_HMAC_update_impl(self, msg); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_HMAC_digest__doc__, +"digest($self, /)\n" +"--\n" +"\n" +"Return the digest of the bytes passed to the update() method so far."); + +#define _HASHLIB_HMAC_DIGEST_METHODDEF \ + {"digest", (PyCFunction)_hashlib_HMAC_digest, METH_NOARGS, _hashlib_HMAC_digest__doc__}, + +static PyObject * +_hashlib_HMAC_digest_impl(HMACobject *self); + +static PyObject * +_hashlib_HMAC_digest(HMACobject *self, PyObject *Py_UNUSED(ignored)) +{ + return _hashlib_HMAC_digest_impl(self); +} + +PyDoc_STRVAR(_hashlib_HMAC_hexdigest__doc__, +"hexdigest($self, /)\n" +"--\n" +"\n" +"Return hexadecimal digest of the bytes passed to the update() method so far.\n" +"\n" +"This may be used to exchange the value safely in email or other non-binary\n" +"environments."); + +#define _HASHLIB_HMAC_HEXDIGEST_METHODDEF \ + {"hexdigest", (PyCFunction)_hashlib_HMAC_hexdigest, METH_NOARGS, _hashlib_HMAC_hexdigest__doc__}, + +static PyObject * +_hashlib_HMAC_hexdigest_impl(HMACobject *self); + +static PyObject * +_hashlib_HMAC_hexdigest(HMACobject *self, PyObject *Py_UNUSED(ignored)) +{ + return _hashlib_HMAC_hexdigest_impl(self); +} + +#if !defined(LIBRESSL_VERSION_NUMBER) + +PyDoc_STRVAR(_hashlib_get_fips_mode__doc__, +"get_fips_mode($module, /)\n" +"--\n" +"\n" +"Determine the OpenSSL FIPS mode of operation.\n" +"\n" +"For OpenSSL 3.0.0 and newer it returns the state of the default provider\n" +"in the default OSSL context. It\'s not quite the same as FIPS_mode() but good\n" +"enough for unittests.\n" +"\n" +"Effectively any non-zero return value indicates FIPS mode;\n" +"values other than 1 may have additional significance."); + +#define _HASHLIB_GET_FIPS_MODE_METHODDEF \ + {"get_fips_mode", (PyCFunction)_hashlib_get_fips_mode, METH_NOARGS, _hashlib_get_fips_mode__doc__}, + +static int +_hashlib_get_fips_mode_impl(PyObject *module); + +static PyObject * +_hashlib_get_fips_mode(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + int _return_value; + + _return_value = _hashlib_get_fips_mode_impl(module); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyLong_FromLong((long)_return_value); + +exit: + return return_value; +} + +#endif /* !defined(LIBRESSL_VERSION_NUMBER) */ + +PyDoc_STRVAR(_hashlib_compare_digest__doc__, +"compare_digest($module, a, b, /)\n" +"--\n" +"\n" +"Return \'a == b\'.\n" +"\n" +"This function uses an approach designed to prevent\n" +"timing analysis, making it appropriate for cryptography.\n" +"\n" +"a and b must both be of the same type: either str (ASCII only),\n" +"or any bytes-like object.\n" +"\n" +"Note: If a and b are of different lengths, or if an error occurs,\n" +"a timing attack could theoretically reveal information about the\n" +"types and lengths of a and b--but not their values."); + +#define _HASHLIB_COMPARE_DIGEST_METHODDEF \ + {"compare_digest", (PyCFunction)(void(*)(void))_hashlib_compare_digest, METH_FASTCALL, _hashlib_compare_digest__doc__}, + +static PyObject * +_hashlib_compare_digest_impl(PyObject *module, PyObject *a, PyObject *b); + +static PyObject * +_hashlib_compare_digest(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *a; + PyObject *b; + + if (!_PyArg_CheckPositional("compare_digest", nargs, 2, 2)) { + goto exit; + } + a = args[0]; + b = args[1]; + return_value = _hashlib_compare_digest_impl(module, a, b); + +exit: + return return_value; +} + +#ifndef EVPXOF_DIGEST_METHODDEF + #define EVPXOF_DIGEST_METHODDEF +#endif /* !defined(EVPXOF_DIGEST_METHODDEF) */ + +#ifndef EVPXOF_HEXDIGEST_METHODDEF + #define EVPXOF_HEXDIGEST_METHODDEF +#endif /* !defined(EVPXOF_HEXDIGEST_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHA3_224_METHODDEF + #define _HASHLIB_OPENSSL_SHA3_224_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHA3_224_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHA3_256_METHODDEF + #define _HASHLIB_OPENSSL_SHA3_256_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHA3_256_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHA3_384_METHODDEF + #define _HASHLIB_OPENSSL_SHA3_384_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHA3_384_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHA3_512_METHODDEF + #define _HASHLIB_OPENSSL_SHA3_512_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHA3_512_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHAKE_128_METHODDEF + #define _HASHLIB_OPENSSL_SHAKE_128_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHAKE_128_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHAKE_256_METHODDEF + #define _HASHLIB_OPENSSL_SHAKE_256_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHAKE_256_METHODDEF) */ + #ifndef _HASHLIB_SCRYPT_METHODDEF #define _HASHLIB_SCRYPT_METHODDEF #endif /* !defined(_HASHLIB_SCRYPT_METHODDEF) */ -/*[clinic end generated code: output=38c2637f67e9bb79 input=a9049054013a1b77]*/ + +#ifndef _HASHLIB_GET_FIPS_MODE_METHODDEF + #define _HASHLIB_GET_FIPS_MODE_METHODDEF +#endif /* !defined(_HASHLIB_GET_FIPS_MODE_METHODDEF) */ +/*[clinic end generated code: output=b6b280e46bf0b139 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_pickle.c.h b/Modules/clinic/_pickle.c.h index 0457a433..136524b6 100644 --- a/Modules/clinic/_pickle.c.h +++ b/Modules/clinic/_pickle.c.h @@ -735,7 +735,7 @@ exit: } PyDoc_STRVAR(_pickle_loads__doc__, -"loads($module, /, data, *, fix_imports=True, encoding=\'ASCII\',\n" +"loads($module, data, /, *, fix_imports=True, encoding=\'ASCII\',\n" " errors=\'strict\', buffers=())\n" "--\n" "\n" @@ -766,7 +766,7 @@ static PyObject * _pickle_loads(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"data", "fix_imports", "encoding", "errors", "buffers", NULL}; + static const char * const _keywords[] = {"", "fix_imports", "encoding", "errors", "buffers", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "loads", 0}; PyObject *argsbuf[5]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; @@ -836,4 +836,4 @@ skip_optional_kwonly: exit: return return_value; } -/*[clinic end generated code: output=e2506823be1960c5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=324aad69644beda2 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_randommodule.c.h b/Modules/clinic/_randommodule.c.h index a467811d..0a642dff 100644 --- a/Modules/clinic/_randommodule.c.h +++ b/Modules/clinic/_randommodule.c.h @@ -114,4 +114,21 @@ _random_Random_getrandbits(RandomObject *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=a7feb0c9c8d1b627 input=a9049054013a1b77]*/ + +PyDoc_STRVAR(_random_Random___reduce____doc__, +"__reduce__($self, /)\n" +"--\n" +"\n"); + +#define _RANDOM_RANDOM___REDUCE___METHODDEF \ + {"__reduce__", (PyCFunction)_random_Random___reduce__, METH_NOARGS, _random_Random___reduce____doc__}, + +static PyObject * +_random_Random___reduce___impl(RandomObject *self); + +static PyObject * +_random_Random___reduce__(RandomObject *self, PyObject *Py_UNUSED(ignored)) +{ + return _random_Random___reduce___impl(self); +} +/*[clinic end generated code: output=d8a99be3f1192219 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_testmultiphase.c.h b/Modules/clinic/_testmultiphase.c.h new file mode 100644 index 00000000..0d38c230 --- /dev/null +++ b/Modules/clinic/_testmultiphase.c.h @@ -0,0 +1,101 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(_testmultiphase_StateAccessType_get_defining_module__doc__, +"get_defining_module($self, /)\n" +"--\n" +"\n" +"Return the module of the defining class."); + +#define _TESTMULTIPHASE_STATEACCESSTYPE_GET_DEFINING_MODULE_METHODDEF \ + {"get_defining_module", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_get_defining_module, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_get_defining_module__doc__}, + +static PyObject * +_testmultiphase_StateAccessType_get_defining_module_impl(StateAccessTypeObject *self, + PyTypeObject *cls); + +static PyObject * +_testmultiphase_StateAccessType_get_defining_module(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":get_defining_module", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _testmultiphase_StateAccessType_get_defining_module_impl(self, cls); + +exit: + return return_value; +} + +PyDoc_STRVAR(_testmultiphase_StateAccessType_increment_count_clinic__doc__, +"increment_count_clinic($self, /, n=1, *, twice=False)\n" +"--\n" +"\n" +"Add \'n\' from the module-state counter.\n" +"\n" +"Pass \'twice\' to double that amount.\n" +"\n" +"This tests Argument Clinic support for defining_class."); + +#define _TESTMULTIPHASE_STATEACCESSTYPE_INCREMENT_COUNT_CLINIC_METHODDEF \ + {"increment_count_clinic", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_increment_count_clinic, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_increment_count_clinic__doc__}, + +static PyObject * +_testmultiphase_StateAccessType_increment_count_clinic_impl(StateAccessTypeObject *self, + PyTypeObject *cls, + int n, int twice); + +static PyObject * +_testmultiphase_StateAccessType_increment_count_clinic(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"n", "twice", NULL}; + static _PyArg_Parser _parser = {"|i$p:increment_count_clinic", _keywords, 0}; + int n = 1; + int twice = 0; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &n, &twice)) { + goto exit; + } + return_value = _testmultiphase_StateAccessType_increment_count_clinic_impl(self, cls, n, twice); + +exit: + return return_value; +} + +PyDoc_STRVAR(_testmultiphase_StateAccessType_get_count__doc__, +"get_count($self, /)\n" +"--\n" +"\n" +"Return the value of the module-state counter."); + +#define _TESTMULTIPHASE_STATEACCESSTYPE_GET_COUNT_METHODDEF \ + {"get_count", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_get_count, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_get_count__doc__}, + +static PyObject * +_testmultiphase_StateAccessType_get_count_impl(StateAccessTypeObject *self, + PyTypeObject *cls); + +static PyObject * +_testmultiphase_StateAccessType_get_count(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":get_count", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _testmultiphase_StateAccessType_get_count_impl(self, cls); + +exit: + return return_value; +} +/*[clinic end generated code: output=39eea487e94e7f5d input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_tracemalloc.c.h b/Modules/clinic/_tracemalloc.c.h index 68fafdc3..049cacd8 100644 --- a/Modules/clinic/_tracemalloc.c.h +++ b/Modules/clinic/_tracemalloc.c.h @@ -197,4 +197,24 @@ _tracemalloc_get_traced_memory(PyObject *module, PyObject *Py_UNUSED(ignored)) { return _tracemalloc_get_traced_memory_impl(module); } -/*[clinic end generated code: output=1bc96dc569706afa input=a9049054013a1b77]*/ + +PyDoc_STRVAR(_tracemalloc_reset_peak__doc__, +"reset_peak($module, /)\n" +"--\n" +"\n" +"Set the peak size of memory blocks traced by tracemalloc to the current size.\n" +"\n" +"Do nothing if the tracemalloc module is not tracing memory allocations."); + +#define _TRACEMALLOC_RESET_PEAK_METHODDEF \ + {"reset_peak", (PyCFunction)_tracemalloc_reset_peak, METH_NOARGS, _tracemalloc_reset_peak__doc__}, + +static PyObject * +_tracemalloc_reset_peak_impl(PyObject *module); + +static PyObject * +_tracemalloc_reset_peak(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _tracemalloc_reset_peak_impl(module); +} +/*[clinic end generated code: output=a130117b1af821da input=a9049054013a1b77]*/ diff --git a/Modules/clinic/arraymodule.c.h b/Modules/clinic/arraymodule.c.h index 33f82d4d..b9245ca9 100644 --- a/Modules/clinic/arraymodule.c.h +++ b/Modules/clinic/arraymodule.c.h @@ -312,54 +312,6 @@ array_array_tolist(arrayobject *self, PyObject *Py_UNUSED(ignored)) return array_array_tolist_impl(self); } -PyDoc_STRVAR(array_array_fromstring__doc__, -"fromstring($self, buffer, /)\n" -"--\n" -"\n" -"Appends items from the string, interpreting it as an array of machine values, as if it had been read from a file using the fromfile() method).\n" -"\n" -"This method is deprecated. Use frombytes instead."); - -#define ARRAY_ARRAY_FROMSTRING_METHODDEF \ - {"fromstring", (PyCFunction)array_array_fromstring, METH_O, array_array_fromstring__doc__}, - -static PyObject * -array_array_fromstring_impl(arrayobject *self, Py_buffer *buffer); - -static PyObject * -array_array_fromstring(arrayobject *self, PyObject *arg) -{ - PyObject *return_value = NULL; - Py_buffer buffer = {NULL, NULL}; - - if (PyUnicode_Check(arg)) { - Py_ssize_t len; - const char *ptr = PyUnicode_AsUTF8AndSize(arg, &len); - if (ptr == NULL) { - goto exit; - } - PyBuffer_FillInfo(&buffer, arg, (void *)ptr, len, 1, 0); - } - else { /* any bytes-like object */ - if (PyObject_GetBuffer(arg, &buffer, PyBUF_SIMPLE) != 0) { - goto exit; - } - if (!PyBuffer_IsContiguous(&buffer, 'C')) { - _PyArg_BadArgument("fromstring", "argument", "contiguous buffer", arg); - goto exit; - } - } - return_value = array_array_fromstring_impl(self, &buffer); - -exit: - /* Cleanup for buffer */ - if (buffer.obj) { - PyBuffer_Release(&buffer); - } - - return return_value; -} - PyDoc_STRVAR(array_array_frombytes__doc__, "frombytes($self, buffer, /)\n" "--\n" @@ -414,26 +366,6 @@ array_array_tobytes(arrayobject *self, PyObject *Py_UNUSED(ignored)) return array_array_tobytes_impl(self); } -PyDoc_STRVAR(array_array_tostring__doc__, -"tostring($self, /)\n" -"--\n" -"\n" -"Convert the array to an array of machine values and return the bytes representation.\n" -"\n" -"This method is deprecated. Use tobytes instead."); - -#define ARRAY_ARRAY_TOSTRING_METHODDEF \ - {"tostring", (PyCFunction)array_array_tostring, METH_NOARGS, array_array_tostring__doc__}, - -static PyObject * -array_array_tostring_impl(arrayobject *self); - -static PyObject * -array_array_tostring(arrayobject *self, PyObject *Py_UNUSED(ignored)) -{ - return array_array_tostring_impl(self); -} - PyDoc_STRVAR(array_array_fromunicode__doc__, "fromunicode($self, ustr, /)\n" "--\n" @@ -448,20 +380,23 @@ PyDoc_STRVAR(array_array_fromunicode__doc__, {"fromunicode", (PyCFunction)array_array_fromunicode, METH_O, array_array_fromunicode__doc__}, static PyObject * -array_array_fromunicode_impl(arrayobject *self, const Py_UNICODE *ustr, - Py_ssize_clean_t ustr_length); +array_array_fromunicode_impl(arrayobject *self, PyObject *ustr); static PyObject * array_array_fromunicode(arrayobject *self, PyObject *arg) { PyObject *return_value = NULL; - const Py_UNICODE *ustr; - Py_ssize_clean_t ustr_length; + PyObject *ustr; - if (!PyArg_Parse(arg, "u#:fromunicode", &ustr, &ustr_length)) { + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("fromunicode", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { goto exit; } - return_value = array_array_fromunicode_impl(self, ustr, ustr_length); + ustr = arg; + return_value = array_array_fromunicode_impl(self, ustr); exit: return return_value; @@ -599,4 +534,4 @@ PyDoc_STRVAR(array_arrayiterator___setstate____doc__, #define ARRAY_ARRAYITERATOR___SETSTATE___METHODDEF \ {"__setstate__", (PyCFunction)array_arrayiterator___setstate__, METH_O, array_arrayiterator___setstate____doc__}, -/*[clinic end generated code: output=6aa421571e2c0756 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9f70748dd3bc532f input=a9049054013a1b77]*/ diff --git a/Modules/clinic/binascii.c.h b/Modules/clinic/binascii.c.h index 82942f08..4d02c72c 100644 --- a/Modules/clinic/binascii.c.h +++ b/Modules/clinic/binascii.c.h @@ -328,7 +328,7 @@ PyDoc_STRVAR(binascii_crc_hqx__doc__, #define BINASCII_CRC_HQX_METHODDEF \ {"crc_hqx", (PyCFunction)(void(*)(void))binascii_crc_hqx, METH_FASTCALL, binascii_crc_hqx__doc__}, -static unsigned int +static PyObject * binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc); static PyObject * @@ -337,7 +337,6 @@ binascii_crc_hqx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) PyObject *return_value = NULL; Py_buffer data = {NULL, NULL}; unsigned int crc; - unsigned int _return_value; if (!_PyArg_CheckPositional("crc_hqx", nargs, 2, 2)) { goto exit; @@ -358,11 +357,7 @@ binascii_crc_hqx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (crc == (unsigned int)-1 && PyErr_Occurred()) { goto exit; } - _return_value = binascii_crc_hqx_impl(module, &data, crc); - if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromUnsignedLong((unsigned long)_return_value); + return_value = binascii_crc_hqx_impl(module, &data, crc); exit: /* Cleanup for data */ @@ -801,4 +796,4 @@ exit: return return_value; } -/*[clinic end generated code: output=ec26d03c2007eaac input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a1e878d3963b615e input=a9049054013a1b77]*/ diff --git a/Modules/clinic/cmathmodule.c.h b/Modules/clinic/cmathmodule.c.h index 81a8437c..4b6653aa 100644 --- a/Modules/clinic/cmathmodule.c.h +++ b/Modules/clinic/cmathmodule.c.h @@ -26,9 +26,8 @@ cmath_acos(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_acos_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -69,9 +68,8 @@ cmath_acosh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_acosh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -112,9 +110,8 @@ cmath_asin(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_asin_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -155,9 +152,8 @@ cmath_asinh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_asinh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -198,9 +194,8 @@ cmath_atan(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_atan_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -241,9 +236,8 @@ cmath_atanh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_atanh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -284,9 +278,8 @@ cmath_cos(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_cos_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -327,9 +320,8 @@ cmath_cosh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_cosh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -370,9 +362,8 @@ cmath_exp(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_exp_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -413,9 +404,8 @@ cmath_log10(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_log10_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -456,9 +446,8 @@ cmath_sin(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_sin_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -499,9 +488,8 @@ cmath_sinh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_sinh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -542,9 +530,8 @@ cmath_sqrt(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_sqrt_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -585,9 +572,8 @@ cmath_tan(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_tan_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -628,9 +614,8 @@ cmath_tanh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_tanh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -968,4 +953,4 @@ skip_optional_kwonly: exit: return return_value; } -/*[clinic end generated code: output=3edc4484b10ae752 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=353347db2e808e0d input=a9049054013a1b77]*/ diff --git a/Modules/clinic/gcmodule.c.h b/Modules/clinic/gcmodule.c.h index 22d2aa4a..72795c66 100644 --- a/Modules/clinic/gcmodule.c.h +++ b/Modules/clinic/gcmodule.c.h @@ -304,6 +304,15 @@ PyDoc_STRVAR(gc_is_tracked__doc__, #define GC_IS_TRACKED_METHODDEF \ {"is_tracked", (PyCFunction)gc_is_tracked, METH_O, gc_is_tracked__doc__}, +PyDoc_STRVAR(gc_is_finalized__doc__, +"is_finalized($module, obj, /)\n" +"--\n" +"\n" +"Returns true if the object has been already finalized by the GC."); + +#define GC_IS_FINALIZED_METHODDEF \ + {"is_finalized", (PyCFunction)gc_is_finalized, METH_O, gc_is_finalized__doc__}, + PyDoc_STRVAR(gc_freeze__doc__, "freeze($module, /)\n" "--\n" @@ -373,4 +382,4 @@ gc_get_freeze_count(PyObject *module, PyObject *Py_UNUSED(ignored)) exit: return return_value; } -/*[clinic end generated code: output=e40d384b1f0d513c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bd6a8056989e2e69 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index 95d68ee5..65f3dd4f 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -2,36 +2,6 @@ preserve [clinic start generated code]*/ -PyDoc_STRVAR(math_gcd__doc__, -"gcd($module, x, y, /)\n" -"--\n" -"\n" -"greatest common divisor of x and y"); - -#define MATH_GCD_METHODDEF \ - {"gcd", (PyCFunction)(void(*)(void))math_gcd, METH_FASTCALL, math_gcd__doc__}, - -static PyObject * -math_gcd_impl(PyObject *module, PyObject *a, PyObject *b); - -static PyObject * -math_gcd(PyObject *module, PyObject *const *args, Py_ssize_t nargs) -{ - PyObject *return_value = NULL; - PyObject *a; - PyObject *b; - - if (!_PyArg_CheckPositional("gcd", nargs, 2, 2)) { - goto exit; - } - a = args[0]; - b = args[1]; - return_value = math_gcd_impl(module, a, b); - -exit: - return return_value; -} - PyDoc_STRVAR(math_ceil__doc__, "ceil($module, x, /)\n" "--\n" @@ -808,4 +778,91 @@ math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=9a2b3dc91eb9aadd input=a9049054013a1b77]*/ + +PyDoc_STRVAR(math_nextafter__doc__, +"nextafter($module, x, y, /)\n" +"--\n" +"\n" +"Return the next floating-point value after x towards y."); + +#define MATH_NEXTAFTER_METHODDEF \ + {"nextafter", (PyCFunction)(void(*)(void))math_nextafter, METH_FASTCALL, math_nextafter__doc__}, + +static PyObject * +math_nextafter_impl(PyObject *module, double x, double y); + +static PyObject * +math_nextafter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + double x; + double y; + + if (!_PyArg_CheckPositional("nextafter", nargs, 2, 2)) { + goto exit; + } + if (PyFloat_CheckExact(args[0])) { + x = PyFloat_AS_DOUBLE(args[0]); + } + else + { + x = PyFloat_AsDouble(args[0]); + if (x == -1.0 && PyErr_Occurred()) { + goto exit; + } + } + if (PyFloat_CheckExact(args[1])) { + y = PyFloat_AS_DOUBLE(args[1]); + } + else + { + y = PyFloat_AsDouble(args[1]); + if (y == -1.0 && PyErr_Occurred()) { + goto exit; + } + } + return_value = math_nextafter_impl(module, x, y); + +exit: + return return_value; +} + +PyDoc_STRVAR(math_ulp__doc__, +"ulp($module, x, /)\n" +"--\n" +"\n" +"Return the value of the least significant bit of the float x."); + +#define MATH_ULP_METHODDEF \ + {"ulp", (PyCFunction)math_ulp, METH_O, math_ulp__doc__}, + +static double +math_ulp_impl(PyObject *module, double x); + +static PyObject * +math_ulp(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + double x; + double _return_value; + + if (PyFloat_CheckExact(arg)) { + x = PyFloat_AS_DOUBLE(arg); + } + else + { + x = PyFloat_AsDouble(arg); + if (x == -1.0 && PyErr_Occurred()) { + goto exit; + } + } + _return_value = math_ulp_impl(module, x); + if ((_return_value == -1.0) && PyErr_Occurred()) { + goto exit; + } + return_value = PyFloat_FromDouble(_return_value); + +exit: + return return_value; +} +/*[clinic end generated code: output=1eae2b3ef19568fa input=a9049054013a1b77]*/ diff --git a/Modules/clinic/md5module.c.h b/Modules/clinic/md5module.c.h index 12484cc0..c109f9ef 100644 --- a/Modules/clinic/md5module.c.h +++ b/Modules/clinic/md5module.c.h @@ -66,7 +66,7 @@ PyDoc_STRVAR(MD5Type_update__doc__, {"update", (PyCFunction)MD5Type_update, METH_O, MD5Type_update__doc__}, PyDoc_STRVAR(_md5_md5__doc__, -"md5($module, /, string=b\'\')\n" +"md5($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new MD5 hash object; optionally initialized with a string."); @@ -75,17 +75,18 @@ PyDoc_STRVAR(_md5_md5__doc__, {"md5", (PyCFunction)(void(*)(void))_md5_md5, METH_FASTCALL|METH_KEYWORDS, _md5_md5__doc__}, static PyObject * -_md5_md5_impl(PyObject *module, PyObject *string); +_md5_md5_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _md5_md5(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "md5", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -94,11 +95,24 @@ _md5_md5(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _md5_md5_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _md5_md5_impl(module, string, usedforsecurity); exit: return return_value; } -/*[clinic end generated code: output=53133f08cf9095fc input=a9049054013a1b77]*/ +/*[clinic end generated code: output=dbe3abc60086f3ef input=a9049054013a1b77]*/ diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 09ecdb35..41baa455 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -2805,7 +2805,7 @@ PyDoc_STRVAR(os_sched_getscheduler__doc__, "sched_getscheduler($module, pid, /)\n" "--\n" "\n" -"Get the scheduling policy for the process identifiedy by pid.\n" +"Get the scheduling policy for the process identified by pid.\n" "\n" "Passing 0 for pid returns the scheduling policy for the calling process."); @@ -2838,7 +2838,7 @@ PyDoc_STRVAR(os_sched_param__doc__, "sched_param(sched_priority)\n" "--\n" "\n" -"Current has only one field: sched_priority\");\n" +"Currently has only one field: sched_priority\n" "\n" " sched_priority\n" " A scheduling parameter."); @@ -2886,7 +2886,7 @@ PyDoc_STRVAR(os_sched_setscheduler__doc__, static PyObject * os_sched_setscheduler_impl(PyObject *module, pid_t pid, int policy, - struct sched_param *param); + PyObject *param_obj); static PyObject * os_sched_setscheduler(PyObject *module, PyObject *const *args, Py_ssize_t nargs) @@ -2894,13 +2894,13 @@ os_sched_setscheduler(PyObject *module, PyObject *const *args, Py_ssize_t nargs) PyObject *return_value = NULL; pid_t pid; int policy; - struct sched_param param; + PyObject *param_obj; - if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "iO&:sched_setscheduler", - &pid, &policy, convert_sched_param, ¶m)) { + if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "iO:sched_setscheduler", + &pid, &policy, ¶m_obj)) { goto exit; } - return_value = os_sched_setscheduler_impl(module, pid, policy, ¶m); + return_value = os_sched_setscheduler_impl(module, pid, policy, param_obj); exit: return return_value; @@ -2957,21 +2957,20 @@ PyDoc_STRVAR(os_sched_setparam__doc__, {"sched_setparam", (PyCFunction)(void(*)(void))os_sched_setparam, METH_FASTCALL, os_sched_setparam__doc__}, static PyObject * -os_sched_setparam_impl(PyObject *module, pid_t pid, - struct sched_param *param); +os_sched_setparam_impl(PyObject *module, pid_t pid, PyObject *param_obj); static PyObject * os_sched_setparam(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; pid_t pid; - struct sched_param param; + PyObject *param_obj; - if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "O&:sched_setparam", - &pid, convert_sched_param, ¶m)) { + if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "O:sched_setparam", + &pid, ¶m_obj)) { goto exit; } - return_value = os_sched_setparam_impl(module, pid, ¶m); + return_value = os_sched_setparam_impl(module, pid, param_obj); exit: return return_value; @@ -3247,6 +3246,118 @@ os_getpid(PyObject *module, PyObject *Py_UNUSED(ignored)) #endif /* defined(HAVE_GETPID) */ +#if defined(HAVE_GETGROUPLIST) && defined(__APPLE__) + +PyDoc_STRVAR(os_getgrouplist__doc__, +"getgrouplist($module, user, group, /)\n" +"--\n" +"\n" +"Returns a list of groups to which a user belongs.\n" +"\n" +" user\n" +" username to lookup\n" +" group\n" +" base group id of the user"); + +#define OS_GETGROUPLIST_METHODDEF \ + {"getgrouplist", (PyCFunction)(void(*)(void))os_getgrouplist, METH_FASTCALL, os_getgrouplist__doc__}, + +static PyObject * +os_getgrouplist_impl(PyObject *module, const char *user, int basegid); + +static PyObject * +os_getgrouplist(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + const char *user; + int basegid; + + if (!_PyArg_CheckPositional("getgrouplist", nargs, 2, 2)) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("getgrouplist", "argument 1", "str", args[0]); + goto exit; + } + Py_ssize_t user_length; + user = PyUnicode_AsUTF8AndSize(args[0], &user_length); + if (user == NULL) { + goto exit; + } + if (strlen(user) != (size_t)user_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + basegid = _PyLong_AsInt(args[1]); + if (basegid == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = os_getgrouplist_impl(module, user, basegid); + +exit: + return return_value; +} + +#endif /* defined(HAVE_GETGROUPLIST) && defined(__APPLE__) */ + +#if defined(HAVE_GETGROUPLIST) && !defined(__APPLE__) + +PyDoc_STRVAR(os_getgrouplist__doc__, +"getgrouplist($module, user, group, /)\n" +"--\n" +"\n" +"Returns a list of groups to which a user belongs.\n" +"\n" +" user\n" +" username to lookup\n" +" group\n" +" base group id of the user"); + +#define OS_GETGROUPLIST_METHODDEF \ + {"getgrouplist", (PyCFunction)(void(*)(void))os_getgrouplist, METH_FASTCALL, os_getgrouplist__doc__}, + +static PyObject * +os_getgrouplist_impl(PyObject *module, const char *user, gid_t basegid); + +static PyObject * +os_getgrouplist(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + const char *user; + gid_t basegid; + + if (!_PyArg_CheckPositional("getgrouplist", nargs, 2, 2)) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("getgrouplist", "argument 1", "str", args[0]); + goto exit; + } + Py_ssize_t user_length; + user = PyUnicode_AsUTF8AndSize(args[0], &user_length); + if (user == NULL) { + goto exit; + } + if (strlen(user) != (size_t)user_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!_Py_Gid_Converter(args[1], &basegid)) { + goto exit; + } + return_value = os_getgrouplist_impl(module, user, basegid); + +exit: + return return_value; +} + +#endif /* defined(HAVE_GETGROUPLIST) && !defined(__APPLE__) */ + #if defined(HAVE_GETGROUPS) PyDoc_STRVAR(os_getgroups__doc__, @@ -3269,6 +3380,102 @@ os_getgroups(PyObject *module, PyObject *Py_UNUSED(ignored)) #endif /* defined(HAVE_GETGROUPS) */ +#if defined(HAVE_INITGROUPS) && defined(__APPLE__) + +PyDoc_STRVAR(os_initgroups__doc__, +"initgroups($module, username, gid, /)\n" +"--\n" +"\n" +"Initialize the group access list.\n" +"\n" +"Call the system initgroups() to initialize the group access list with all of\n" +"the groups of which the specified username is a member, plus the specified\n" +"group id."); + +#define OS_INITGROUPS_METHODDEF \ + {"initgroups", (PyCFunction)(void(*)(void))os_initgroups, METH_FASTCALL, os_initgroups__doc__}, + +static PyObject * +os_initgroups_impl(PyObject *module, PyObject *oname, int gid); + +static PyObject * +os_initgroups(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *oname = NULL; + int gid; + + if (!_PyArg_CheckPositional("initgroups", nargs, 2, 2)) { + goto exit; + } + if (!PyUnicode_FSConverter(args[0], &oname)) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + gid = _PyLong_AsInt(args[1]); + if (gid == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = os_initgroups_impl(module, oname, gid); + +exit: + /* Cleanup for oname */ + Py_XDECREF(oname); + + return return_value; +} + +#endif /* defined(HAVE_INITGROUPS) && defined(__APPLE__) */ + +#if defined(HAVE_INITGROUPS) && !defined(__APPLE__) + +PyDoc_STRVAR(os_initgroups__doc__, +"initgroups($module, username, gid, /)\n" +"--\n" +"\n" +"Initialize the group access list.\n" +"\n" +"Call the system initgroups() to initialize the group access list with all of\n" +"the groups of which the specified username is a member, plus the specified\n" +"group id."); + +#define OS_INITGROUPS_METHODDEF \ + {"initgroups", (PyCFunction)(void(*)(void))os_initgroups, METH_FASTCALL, os_initgroups__doc__}, + +static PyObject * +os_initgroups_impl(PyObject *module, PyObject *oname, gid_t gid); + +static PyObject * +os_initgroups(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *oname = NULL; + gid_t gid; + + if (!_PyArg_CheckPositional("initgroups", nargs, 2, 2)) { + goto exit; + } + if (!PyUnicode_FSConverter(args[0], &oname)) { + goto exit; + } + if (!_Py_Gid_Converter(args[1], &gid)) { + goto exit; + } + return_value = os_initgroups_impl(module, oname, gid); + +exit: + /* Cleanup for oname */ + Py_XDECREF(oname); + + return return_value; +} + +#endif /* defined(HAVE_INITGROUPS) && !defined(__APPLE__) */ + #if defined(HAVE_GETPGID) PyDoc_STRVAR(os_getpgid__doc__, @@ -3963,6 +4170,44 @@ os_wait(PyObject *module, PyObject *Py_UNUSED(ignored)) #endif /* defined(HAVE_WAIT) */ +#if (defined(__linux__) && defined(__NR_pidfd_open)) + +PyDoc_STRVAR(os_pidfd_open__doc__, +"pidfd_open($module, /, pid, flags=0)\n" +"--\n" +"\n" +"Return a file descriptor referring to the process *pid*.\n" +"\n" +"The descriptor can be used to perform process management without races and\n" +"signals."); + +#define OS_PIDFD_OPEN_METHODDEF \ + {"pidfd_open", (PyCFunction)(void(*)(void))os_pidfd_open, METH_FASTCALL|METH_KEYWORDS, os_pidfd_open__doc__}, + +static PyObject * +os_pidfd_open_impl(PyObject *module, pid_t pid, unsigned int flags); + +static PyObject * +os_pidfd_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"pid", "flags", NULL}; + static _PyArg_Parser _parser = {"" _Py_PARSE_PID "|O&:pidfd_open", _keywords, 0}; + pid_t pid; + unsigned int flags = 0; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &pid, _PyLong_UnsignedInt_Converter, &flags)) { + goto exit; + } + return_value = os_pidfd_open_impl(module, pid, flags); + +exit: + return return_value; +} + +#endif /* (defined(__linux__) && defined(__NR_pidfd_open)) */ + #if (defined(HAVE_READLINK) || defined(MS_WINDOWS)) PyDoc_STRVAR(os_readlink__doc__, @@ -4799,14 +5044,14 @@ PyDoc_STRVAR(os_pread__doc__, {"pread", (PyCFunction)(void(*)(void))os_pread, METH_FASTCALL, os_pread__doc__}, static PyObject * -os_pread_impl(PyObject *module, int fd, int length, Py_off_t offset); +os_pread_impl(PyObject *module, int fd, Py_ssize_t length, Py_off_t offset); static PyObject * os_pread(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; int fd; - int length; + Py_ssize_t length; Py_off_t offset; if (!_PyArg_CheckPositional("pread", nargs, 3, 3)) { @@ -4826,9 +5071,17 @@ os_pread(PyObject *module, PyObject *const *args, Py_ssize_t nargs) "integer argument expected, got float" ); goto exit; } - length = _PyLong_AsInt(args[1]); - if (length == -1 && PyErr_Occurred()) { - goto exit; + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + length = ival; } if (!Py_off_t_converter(args[2], &offset)) { goto exit; @@ -4975,10 +5228,287 @@ exit: return return_value; } +#if defined(HAVE_SENDFILE) && defined(__APPLE__) + +PyDoc_STRVAR(os_sendfile__doc__, +"sendfile($module, /, out_fd, in_fd, offset, count, headers=(),\n" +" trailers=(), flags=0)\n" +"--\n" +"\n" +"Copy count bytes from file descriptor in_fd to file descriptor out_fd."); + +#define OS_SENDFILE_METHODDEF \ + {"sendfile", (PyCFunction)(void(*)(void))os_sendfile, METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, + +static PyObject * +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset, + Py_off_t sbytes, PyObject *headers, PyObject *trailers, + int flags); + +static PyObject * +os_sendfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"out_fd", "in_fd", "offset", "count", "headers", "trailers", "flags", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "sendfile", 0}; + PyObject *argsbuf[7]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 4; + int out_fd; + int in_fd; + Py_off_t offset; + Py_off_t sbytes; + PyObject *headers = NULL; + PyObject *trailers = NULL; + int flags = 0; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 7, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + out_fd = _PyLong_AsInt(args[0]); + if (out_fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + in_fd = _PyLong_AsInt(args[1]); + if (in_fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (!Py_off_t_converter(args[2], &offset)) { + goto exit; + } + if (!Py_off_t_converter(args[3], &sbytes)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[4]) { + headers = args[4]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[5]) { + trailers = args[5]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[6]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: + return_value = os_sendfile_impl(module, out_fd, in_fd, offset, sbytes, headers, trailers, flags); + +exit: + return return_value; +} + +#endif /* defined(HAVE_SENDFILE) && defined(__APPLE__) */ + +#if defined(HAVE_SENDFILE) && !defined(__APPLE__) && (defined(__FreeBSD__) || defined(__DragonFly__)) + +PyDoc_STRVAR(os_sendfile__doc__, +"sendfile($module, /, out_fd, in_fd, offset, count, headers=(),\n" +" trailers=(), flags=0)\n" +"--\n" +"\n" +"Copy count bytes from file descriptor in_fd to file descriptor out_fd."); + +#define OS_SENDFILE_METHODDEF \ + {"sendfile", (PyCFunction)(void(*)(void))os_sendfile, METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, + +static PyObject * +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset, + Py_ssize_t count, PyObject *headers, PyObject *trailers, + int flags); + +static PyObject * +os_sendfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"out_fd", "in_fd", "offset", "count", "headers", "trailers", "flags", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "sendfile", 0}; + PyObject *argsbuf[7]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 4; + int out_fd; + int in_fd; + Py_off_t offset; + Py_ssize_t count; + PyObject *headers = NULL; + PyObject *trailers = NULL; + int flags = 0; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 7, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + out_fd = _PyLong_AsInt(args[0]); + if (out_fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + in_fd = _PyLong_AsInt(args[1]); + if (in_fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (!Py_off_t_converter(args[2], &offset)) { + goto exit; + } + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[3]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + count = ival; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[4]) { + headers = args[4]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[5]) { + trailers = args[5]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[6]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: + return_value = os_sendfile_impl(module, out_fd, in_fd, offset, count, headers, trailers, flags); + +exit: + return return_value; +} + +#endif /* defined(HAVE_SENDFILE) && !defined(__APPLE__) && (defined(__FreeBSD__) || defined(__DragonFly__)) */ + +#if defined(HAVE_SENDFILE) && !defined(__APPLE__) && !(defined(__FreeBSD__) || defined(__DragonFly__)) + +PyDoc_STRVAR(os_sendfile__doc__, +"sendfile($module, /, out_fd, in_fd, offset, count)\n" +"--\n" +"\n" +"Copy count bytes from file descriptor in_fd to file descriptor out_fd."); + +#define OS_SENDFILE_METHODDEF \ + {"sendfile", (PyCFunction)(void(*)(void))os_sendfile, METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, + +static PyObject * +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj, + Py_ssize_t count); + +static PyObject * +os_sendfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"out_fd", "in_fd", "offset", "count", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "sendfile", 0}; + PyObject *argsbuf[4]; + int out_fd; + int in_fd; + PyObject *offobj; + Py_ssize_t count; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 4, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + out_fd = _PyLong_AsInt(args[0]); + if (out_fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + in_fd = _PyLong_AsInt(args[1]); + if (in_fd == -1 && PyErr_Occurred()) { + goto exit; + } + offobj = args[2]; + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[3]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + count = ival; + } + return_value = os_sendfile_impl(module, out_fd, in_fd, offobj, count); + +exit: + return return_value; +} + +#endif /* defined(HAVE_SENDFILE) && !defined(__APPLE__) && !(defined(__FreeBSD__) || defined(__DragonFly__)) */ + #if defined(__APPLE__) PyDoc_STRVAR(os__fcopyfile__doc__, -"_fcopyfile($module, infd, outfd, flags, /)\n" +"_fcopyfile($module, in_fd, out_fd, flags, /)\n" "--\n" "\n" "Efficiently copy content or metadata of 2 regular file descriptors (macOS)."); @@ -4987,14 +5517,14 @@ PyDoc_STRVAR(os__fcopyfile__doc__, {"_fcopyfile", (PyCFunction)(void(*)(void))os__fcopyfile, METH_FASTCALL, os__fcopyfile__doc__}, static PyObject * -os__fcopyfile_impl(PyObject *module, int infd, int outfd, int flags); +os__fcopyfile_impl(PyObject *module, int in_fd, int out_fd, int flags); static PyObject * os__fcopyfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; - int infd; - int outfd; + int in_fd; + int out_fd; int flags; if (!_PyArg_CheckPositional("_fcopyfile", nargs, 3, 3)) { @@ -5005,8 +5535,8 @@ os__fcopyfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs) "integer argument expected, got float" ); goto exit; } - infd = _PyLong_AsInt(args[0]); - if (infd == -1 && PyErr_Occurred()) { + in_fd = _PyLong_AsInt(args[0]); + if (in_fd == -1 && PyErr_Occurred()) { goto exit; } if (PyFloat_Check(args[1])) { @@ -5014,8 +5544,8 @@ os__fcopyfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs) "integer argument expected, got float" ); goto exit; } - outfd = _PyLong_AsInt(args[1]); - if (outfd == -1 && PyErr_Occurred()) { + out_fd = _PyLong_AsInt(args[1]); + if (out_fd == -1 && PyErr_Occurred()) { goto exit; } if (PyFloat_Check(args[2])) { @@ -5027,7 +5557,7 @@ os__fcopyfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (flags == -1 && PyErr_Occurred()) { goto exit; } - return_value = os__fcopyfile_impl(module, infd, outfd, flags); + return_value = os__fcopyfile_impl(module, in_fd, out_fd, flags); exit: return return_value; @@ -5988,7 +6518,7 @@ exit: #endif /* (defined(HAVE_POSIX_FADVISE) && !defined(POSIX_FADVISE_AIX_BUG)) */ -#if defined(HAVE_PUTENV) && defined(MS_WINDOWS) +#if defined(MS_WINDOWS) PyDoc_STRVAR(os_putenv__doc__, "putenv($module, name, value, /)\n" @@ -6034,9 +6564,9 @@ exit: return return_value; } -#endif /* defined(HAVE_PUTENV) && defined(MS_WINDOWS) */ +#endif /* defined(MS_WINDOWS) */ -#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) +#if !defined(MS_WINDOWS) PyDoc_STRVAR(os_putenv__doc__, "putenv($module, name, value, /)\n" @@ -6077,9 +6607,45 @@ exit: return return_value; } -#endif /* defined(HAVE_PUTENV) && !defined(MS_WINDOWS) */ +#endif /* !defined(MS_WINDOWS) */ -#if defined(HAVE_UNSETENV) +#if defined(MS_WINDOWS) + +PyDoc_STRVAR(os_unsetenv__doc__, +"unsetenv($module, name, /)\n" +"--\n" +"\n" +"Delete an environment variable."); + +#define OS_UNSETENV_METHODDEF \ + {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__}, + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name); + +static PyObject * +os_unsetenv(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + PyObject *name; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("unsetenv", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { + goto exit; + } + name = arg; + return_value = os_unsetenv_impl(module, name); + +exit: + return return_value; +} + +#endif /* defined(MS_WINDOWS) */ + +#if !defined(MS_WINDOWS) PyDoc_STRVAR(os_unsetenv__doc__, "unsetenv($module, name, /)\n" @@ -6111,7 +6677,7 @@ exit: return return_value; } -#endif /* defined(HAVE_UNSETENV) */ +#endif /* !defined(MS_WINDOWS) */ PyDoc_STRVAR(os_strerror__doc__, "strerror($module, code, /)\n" @@ -7486,6 +8052,62 @@ exit: #endif /* defined(HAVE_MEMFD_CREATE) */ +#if (defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL)) + +PyDoc_STRVAR(os_get_terminal_size__doc__, +"get_terminal_size($module, fd=, /)\n" +"--\n" +"\n" +"Return the size of the terminal window as (columns, lines).\n" +"\n" +"The optional argument fd (default standard output) specifies\n" +"which file descriptor should be queried.\n" +"\n" +"If the file descriptor is not connected to a terminal, an OSError\n" +"is thrown.\n" +"\n" +"This function will only be defined if an implementation is\n" +"available for this system.\n" +"\n" +"shutil.get_terminal_size is the high-level function which should\n" +"normally be used, os.get_terminal_size is the low-level implementation."); + +#define OS_GET_TERMINAL_SIZE_METHODDEF \ + {"get_terminal_size", (PyCFunction)(void(*)(void))os_get_terminal_size, METH_FASTCALL, os_get_terminal_size__doc__}, + +static PyObject * +os_get_terminal_size_impl(PyObject *module, int fd); + +static PyObject * +os_get_terminal_size(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int fd = fileno(stdout); + + if (!_PyArg_CheckPositional("get_terminal_size", nargs, 0, 1)) { + goto exit; + } + if (nargs < 1) { + goto skip_optional; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fd = _PyLong_AsInt(args[0]); + if (fd == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional: + return_value = os_get_terminal_size_impl(module, fd); + +exit: + return return_value; +} + +#endif /* (defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL)) */ + PyDoc_STRVAR(os_cpu_count__doc__, "cpu_count($module, /)\n" "--\n" @@ -7766,18 +8388,24 @@ PyDoc_STRVAR(os_DirEntry_is_symlink__doc__, "Return True if the entry is a symbolic link; cached per entry."); #define OS_DIRENTRY_IS_SYMLINK_METHODDEF \ - {"is_symlink", (PyCFunction)os_DirEntry_is_symlink, METH_NOARGS, os_DirEntry_is_symlink__doc__}, + {"is_symlink", (PyCFunction)(void(*)(void))os_DirEntry_is_symlink, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_symlink__doc__}, static int -os_DirEntry_is_symlink_impl(DirEntry *self); +os_DirEntry_is_symlink_impl(DirEntry *self, PyTypeObject *defining_class); static PyObject * -os_DirEntry_is_symlink(DirEntry *self, PyObject *Py_UNUSED(ignored)) +os_DirEntry_is_symlink(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":is_symlink", _keywords, 0}; int _return_value; - _return_value = os_DirEntry_is_symlink_impl(self); + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + _return_value = os_DirEntry_is_symlink_impl(self, defining_class); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; } @@ -7794,34 +8422,25 @@ PyDoc_STRVAR(os_DirEntry_stat__doc__, "Return stat_result object for the entry; cached per entry."); #define OS_DIRENTRY_STAT_METHODDEF \ - {"stat", (PyCFunction)(void(*)(void))os_DirEntry_stat, METH_FASTCALL|METH_KEYWORDS, os_DirEntry_stat__doc__}, + {"stat", (PyCFunction)(void(*)(void))os_DirEntry_stat, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_stat__doc__}, static PyObject * -os_DirEntry_stat_impl(DirEntry *self, int follow_symlinks); +os_DirEntry_stat_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks); static PyObject * -os_DirEntry_stat(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +os_DirEntry_stat(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "stat", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + static _PyArg_Parser _parser = {"|$p:stat", _keywords, 0}; int follow_symlinks = 1; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_kwonly; - } - follow_symlinks = PyObject_IsTrue(args[0]); - if (follow_symlinks < 0) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &follow_symlinks)) { goto exit; } -skip_optional_kwonly: - return_value = os_DirEntry_stat_impl(self, follow_symlinks); + return_value = os_DirEntry_stat_impl(self, defining_class, follow_symlinks); exit: return return_value; @@ -7834,35 +8453,26 @@ PyDoc_STRVAR(os_DirEntry_is_dir__doc__, "Return True if the entry is a directory; cached per entry."); #define OS_DIRENTRY_IS_DIR_METHODDEF \ - {"is_dir", (PyCFunction)(void(*)(void))os_DirEntry_is_dir, METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_dir__doc__}, + {"is_dir", (PyCFunction)(void(*)(void))os_DirEntry_is_dir, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_dir__doc__}, static int -os_DirEntry_is_dir_impl(DirEntry *self, int follow_symlinks); +os_DirEntry_is_dir_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks); static PyObject * -os_DirEntry_is_dir(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +os_DirEntry_is_dir(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "is_dir", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + static _PyArg_Parser _parser = {"|$p:is_dir", _keywords, 0}; int follow_symlinks = 1; int _return_value; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_kwonly; - } - follow_symlinks = PyObject_IsTrue(args[0]); - if (follow_symlinks < 0) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &follow_symlinks)) { goto exit; } -skip_optional_kwonly: - _return_value = os_DirEntry_is_dir_impl(self, follow_symlinks); + _return_value = os_DirEntry_is_dir_impl(self, defining_class, follow_symlinks); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; } @@ -7879,35 +8489,26 @@ PyDoc_STRVAR(os_DirEntry_is_file__doc__, "Return True if the entry is a file; cached per entry."); #define OS_DIRENTRY_IS_FILE_METHODDEF \ - {"is_file", (PyCFunction)(void(*)(void))os_DirEntry_is_file, METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_file__doc__}, + {"is_file", (PyCFunction)(void(*)(void))os_DirEntry_is_file, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_file__doc__}, static int -os_DirEntry_is_file_impl(DirEntry *self, int follow_symlinks); +os_DirEntry_is_file_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks); static PyObject * -os_DirEntry_is_file(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +os_DirEntry_is_file(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "is_file", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + static _PyArg_Parser _parser = {"|$p:is_file", _keywords, 0}; int follow_symlinks = 1; int _return_value; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_kwonly; - } - follow_symlinks = PyObject_IsTrue(args[0]); - if (follow_symlinks < 0) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &follow_symlinks)) { goto exit; } -skip_optional_kwonly: - _return_value = os_DirEntry_is_file_impl(self, follow_symlinks); + _return_value = os_DirEntry_is_file_impl(self, defining_class, follow_symlinks); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; } @@ -8192,6 +8793,54 @@ exit: #endif /* defined(MS_WINDOWS) */ +#if (defined(WIFEXITED) || defined(MS_WINDOWS)) + +PyDoc_STRVAR(os_waitstatus_to_exitcode__doc__, +"waitstatus_to_exitcode($module, /, status)\n" +"--\n" +"\n" +"Convert a wait status to an exit code.\n" +"\n" +"On Unix:\n" +"\n" +"* If WIFEXITED(status) is true, return WEXITSTATUS(status).\n" +"* If WIFSIGNALED(status) is true, return -WTERMSIG(status).\n" +"* Otherwise, raise a ValueError.\n" +"\n" +"On Windows, return status shifted right by 8 bits.\n" +"\n" +"On Unix, if the process is being traced or if waitpid() was called with\n" +"WUNTRACED option, the caller must first check if WIFSTOPPED(status) is true.\n" +"This function must not be called if WIFSTOPPED(status) is true."); + +#define OS_WAITSTATUS_TO_EXITCODE_METHODDEF \ + {"waitstatus_to_exitcode", (PyCFunction)(void(*)(void))os_waitstatus_to_exitcode, METH_FASTCALL|METH_KEYWORDS, os_waitstatus_to_exitcode__doc__}, + +static PyObject * +os_waitstatus_to_exitcode_impl(PyObject *module, PyObject *status_obj); + +static PyObject * +os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"status", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "waitstatus_to_exitcode", 0}; + PyObject *argsbuf[1]; + PyObject *status_obj; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + status_obj = args[0]; + return_value = os_waitstatus_to_exitcode_impl(module, status_obj); + +exit: + return return_value; +} + +#endif /* (defined(WIFEXITED) || defined(MS_WINDOWS)) */ + #ifndef OS_TTYNAME_METHODDEF #define OS_TTYNAME_METHODDEF #endif /* !defined(OS_TTYNAME_METHODDEF) */ @@ -8384,10 +9033,18 @@ exit: #define OS_GETPID_METHODDEF #endif /* !defined(OS_GETPID_METHODDEF) */ +#ifndef OS_GETGROUPLIST_METHODDEF + #define OS_GETGROUPLIST_METHODDEF +#endif /* !defined(OS_GETGROUPLIST_METHODDEF) */ + #ifndef OS_GETGROUPS_METHODDEF #define OS_GETGROUPS_METHODDEF #endif /* !defined(OS_GETGROUPS_METHODDEF) */ +#ifndef OS_INITGROUPS_METHODDEF + #define OS_INITGROUPS_METHODDEF +#endif /* !defined(OS_INITGROUPS_METHODDEF) */ + #ifndef OS_GETPGID_METHODDEF #define OS_GETPGID_METHODDEF #endif /* !defined(OS_GETPGID_METHODDEF) */ @@ -8472,6 +9129,10 @@ exit: #define OS_WAIT_METHODDEF #endif /* !defined(OS_WAIT_METHODDEF) */ +#ifndef OS_PIDFD_OPEN_METHODDEF + #define OS_PIDFD_OPEN_METHODDEF +#endif /* !defined(OS_PIDFD_OPEN_METHODDEF) */ + #ifndef OS_READLINK_METHODDEF #define OS_READLINK_METHODDEF #endif /* !defined(OS_READLINK_METHODDEF) */ @@ -8520,6 +9181,10 @@ exit: #define OS_PREADV_METHODDEF #endif /* !defined(OS_PREADV_METHODDEF) */ +#ifndef OS_SENDFILE_METHODDEF + #define OS_SENDFILE_METHODDEF +#endif /* !defined(OS_SENDFILE_METHODDEF) */ + #ifndef OS__FCOPYFILE_METHODDEF #define OS__FCOPYFILE_METHODDEF #endif /* !defined(OS__FCOPYFILE_METHODDEF) */ @@ -8696,6 +9361,10 @@ exit: #define OS_MEMFD_CREATE_METHODDEF #endif /* !defined(OS_MEMFD_CREATE_METHODDEF) */ +#ifndef OS_GET_TERMINAL_SIZE_METHODDEF + #define OS_GET_TERMINAL_SIZE_METHODDEF +#endif /* !defined(OS_GET_TERMINAL_SIZE_METHODDEF) */ + #ifndef OS_GET_HANDLE_INHERITABLE_METHODDEF #define OS_GET_HANDLE_INHERITABLE_METHODDEF #endif /* !defined(OS_GET_HANDLE_INHERITABLE_METHODDEF) */ @@ -8723,4 +9392,8 @@ exit: #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=edb5a840b51fcaa8 input=a9049054013a1b77]*/ + +#ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF + #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF +#endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ +/*[clinic end generated code: output=005919eaaef3f8e6 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/selectmodule.c.h b/Modules/clinic/selectmodule.c.h index a9e14840..c1072e6e 100644 --- a/Modules/clinic/selectmodule.c.h +++ b/Modules/clinic/selectmodule.c.h @@ -963,11 +963,11 @@ select_kqueue(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; - if ((type == &kqueue_queue_Type) && + if ((type == _selectstate_global->kqueue_queue_Type) && !_PyArg_NoPositional("kqueue", args)) { goto exit; } - if ((type == &kqueue_queue_Type) && + if ((type == _selectstate_global->kqueue_queue_Type) && !_PyArg_NoKeywords("kqueue", kwargs)) { goto exit; } @@ -1219,4 +1219,4 @@ exit: #ifndef SELECT_KQUEUE_CONTROL_METHODDEF #define SELECT_KQUEUE_CONTROL_METHODDEF #endif /* !defined(SELECT_KQUEUE_CONTROL_METHODDEF) */ -/*[clinic end generated code: output=86010dde10ca89c6 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ef42c3485a8fe3a0 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha1module.c.h b/Modules/clinic/sha1module.c.h index 001c6af7..fc37b1ab 100644 --- a/Modules/clinic/sha1module.c.h +++ b/Modules/clinic/sha1module.c.h @@ -66,7 +66,7 @@ PyDoc_STRVAR(SHA1Type_update__doc__, {"update", (PyCFunction)SHA1Type_update, METH_O, SHA1Type_update__doc__}, PyDoc_STRVAR(_sha1_sha1__doc__, -"sha1($module, /, string=b\'\')\n" +"sha1($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new SHA1 hash object; optionally initialized with a string."); @@ -75,17 +75,18 @@ PyDoc_STRVAR(_sha1_sha1__doc__, {"sha1", (PyCFunction)(void(*)(void))_sha1_sha1, METH_FASTCALL|METH_KEYWORDS, _sha1_sha1__doc__}, static PyObject * -_sha1_sha1_impl(PyObject *module, PyObject *string); +_sha1_sha1_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _sha1_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "sha1", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -94,11 +95,24 @@ _sha1_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _sha1_sha1_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _sha1_sha1_impl(module, string, usedforsecurity); exit: return return_value; } -/*[clinic end generated code: output=1ae7e73ec84a27d5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3ddd637ae17e14b3 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha256module.c.h b/Modules/clinic/sha256module.c.h index 658abb15..2a788ea9 100644 --- a/Modules/clinic/sha256module.c.h +++ b/Modules/clinic/sha256module.c.h @@ -66,7 +66,7 @@ PyDoc_STRVAR(SHA256Type_update__doc__, {"update", (PyCFunction)SHA256Type_update, METH_O, SHA256Type_update__doc__}, PyDoc_STRVAR(_sha256_sha256__doc__, -"sha256($module, /, string=b\'\')\n" +"sha256($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new SHA-256 hash object; optionally initialized with a string."); @@ -75,17 +75,18 @@ PyDoc_STRVAR(_sha256_sha256__doc__, {"sha256", (PyCFunction)(void(*)(void))_sha256_sha256, METH_FASTCALL|METH_KEYWORDS, _sha256_sha256__doc__}, static PyObject * -_sha256_sha256_impl(PyObject *module, PyObject *string); +_sha256_sha256_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _sha256_sha256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "sha256", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -94,16 +95,29 @@ _sha256_sha256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _sha256_sha256_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _sha256_sha256_impl(module, string, usedforsecurity); exit: return return_value; } PyDoc_STRVAR(_sha256_sha224__doc__, -"sha224($module, /, string=b\'\')\n" +"sha224($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new SHA-224 hash object; optionally initialized with a string."); @@ -112,17 +126,18 @@ PyDoc_STRVAR(_sha256_sha224__doc__, {"sha224", (PyCFunction)(void(*)(void))_sha256_sha224, METH_FASTCALL|METH_KEYWORDS, _sha256_sha224__doc__}, static PyObject * -_sha256_sha224_impl(PyObject *module, PyObject *string); +_sha256_sha224_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _sha256_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "sha224", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -131,11 +146,24 @@ _sha256_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _sha256_sha224_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _sha256_sha224_impl(module, string, usedforsecurity); exit: return return_value; } -/*[clinic end generated code: output=c54d0956ec88409d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c8cca8adbe72ec9a input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha512module.c.h b/Modules/clinic/sha512module.c.h index 459a9341..b8185b62 100644 --- a/Modules/clinic/sha512module.c.h +++ b/Modules/clinic/sha512module.c.h @@ -66,7 +66,7 @@ PyDoc_STRVAR(SHA512Type_update__doc__, {"update", (PyCFunction)SHA512Type_update, METH_O, SHA512Type_update__doc__}, PyDoc_STRVAR(_sha512_sha512__doc__, -"sha512($module, /, string=b\'\')\n" +"sha512($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new SHA-512 hash object; optionally initialized with a string."); @@ -75,17 +75,18 @@ PyDoc_STRVAR(_sha512_sha512__doc__, {"sha512", (PyCFunction)(void(*)(void))_sha512_sha512, METH_FASTCALL|METH_KEYWORDS, _sha512_sha512__doc__}, static PyObject * -_sha512_sha512_impl(PyObject *module, PyObject *string); +_sha512_sha512_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _sha512_sha512(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "sha512", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -94,16 +95,29 @@ _sha512_sha512(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _sha512_sha512_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _sha512_sha512_impl(module, string, usedforsecurity); exit: return return_value; } PyDoc_STRVAR(_sha512_sha384__doc__, -"sha384($module, /, string=b\'\')\n" +"sha384($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new SHA-384 hash object; optionally initialized with a string."); @@ -112,17 +126,18 @@ PyDoc_STRVAR(_sha512_sha384__doc__, {"sha384", (PyCFunction)(void(*)(void))_sha512_sha384, METH_FASTCALL|METH_KEYWORDS, _sha512_sha384__doc__}, static PyObject * -_sha512_sha384_impl(PyObject *module, PyObject *string); +_sha512_sha384_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _sha512_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "sha384", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -131,11 +146,24 @@ _sha512_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _sha512_sha384_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _sha512_sha384_impl(module, string, usedforsecurity); exit: return return_value; } -/*[clinic end generated code: output=580df4b667084a7e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bbfa72d8703c82b5 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/signalmodule.c.h b/Modules/clinic/signalmodule.c.h index 3cb1db14..7f60e28a 100644 --- a/Modules/clinic/signalmodule.c.h +++ b/Modules/clinic/signalmodule.c.h @@ -611,6 +611,76 @@ exit: #endif /* defined(HAVE_PTHREAD_KILL) */ +#if (defined(__linux__) && defined(__NR_pidfd_send_signal)) + +PyDoc_STRVAR(signal_pidfd_send_signal__doc__, +"pidfd_send_signal($module, pidfd, signalnum, siginfo=None, flags=0, /)\n" +"--\n" +"\n" +"Send a signal to a process referred to by a pid file descriptor."); + +#define SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF \ + {"pidfd_send_signal", (PyCFunction)(void(*)(void))signal_pidfd_send_signal, METH_FASTCALL, signal_pidfd_send_signal__doc__}, + +static PyObject * +signal_pidfd_send_signal_impl(PyObject *module, int pidfd, int signalnum, + PyObject *siginfo, int flags); + +static PyObject * +signal_pidfd_send_signal(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int pidfd; + int signalnum; + PyObject *siginfo = Py_None; + int flags = 0; + + if (!_PyArg_CheckPositional("pidfd_send_signal", nargs, 2, 4)) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + pidfd = _PyLong_AsInt(args[0]); + if (pidfd == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + signalnum = _PyLong_AsInt(args[1]); + if (signalnum == -1 && PyErr_Occurred()) { + goto exit; + } + if (nargs < 3) { + goto skip_optional; + } + siginfo = args[2]; + if (nargs < 4) { + goto skip_optional; + } + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[3]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional: + return_value = signal_pidfd_send_signal_impl(module, pidfd, signalnum, siginfo, flags); + +exit: + return return_value; +} + +#endif /* (defined(__linux__) && defined(__NR_pidfd_send_signal)) */ + #ifndef SIGNAL_ALARM_METHODDEF #define SIGNAL_ALARM_METHODDEF #endif /* !defined(SIGNAL_ALARM_METHODDEF) */ @@ -658,4 +728,8 @@ exit: #ifndef SIGNAL_PTHREAD_KILL_METHODDEF #define SIGNAL_PTHREAD_KILL_METHODDEF #endif /* !defined(SIGNAL_PTHREAD_KILL_METHODDEF) */ -/*[clinic end generated code: output=3320b8f73c20ba60 input=a9049054013a1b77]*/ + +#ifndef SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF + #define SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF +#endif /* !defined(SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF) */ +/*[clinic end generated code: output=b41b4b6bd9ad4da2 input=a9049054013a1b77]*/ diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index 02c09bbe..5eac4b49 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -3,6 +3,7 @@ /* much code borrowed from mathmodule.c */ #include "Python.h" +#include "pycore_dtoa.h" #include "_math.h" /* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from float.h. We assume that FLT_RADIX is either 2 or 16. */ @@ -17,7 +18,7 @@ module cmath /*[python input] class Py_complex_protected_converter(Py_complex_converter): def modify(self): - return 'errno = 0; PyFPE_START_PROTECT("complex function", goto exit);' + return 'errno = 0;' class Py_complex_protected_return_converter(CReturnConverter): @@ -26,7 +27,6 @@ class Py_complex_protected_return_converter(CReturnConverter): def render(self, function, data): self.declare(data) data.return_conversion.append(""" -PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -40,7 +40,7 @@ else { } """.strip()) [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=345daa075b1028e7]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=8b27adb674c08321]*/ #if (FLT_RADIX != 2 && FLT_RADIX != 16) #error "Modules/cmathmodule.c expects FLT_RADIX to be 2 or 16" @@ -960,7 +960,6 @@ cmath_log_impl(PyObject *module, Py_complex x, PyObject *y_obj) Py_complex y; errno = 0; - PyFPE_START_PROTECT("complex function", return 0) x = c_log(x); if (y_obj != NULL) { y = PyComplex_AsCComplex(y_obj); @@ -970,7 +969,6 @@ cmath_log_impl(PyObject *module, Py_complex x, PyObject *y_obj) y = c_log(y); x = _Py_c_quot(x, y); } - PyFPE_END_PROTECT(x) if (errno != 0) return math_error(); return PyComplex_FromCComplex(x); @@ -1008,9 +1006,7 @@ cmath_phase_impl(PyObject *module, Py_complex z) double phi; errno = 0; - PyFPE_START_PROTECT("arg function", return 0) phi = c_atan2(z); - PyFPE_END_PROTECT(phi) if (errno != 0) return math_error(); else @@ -1035,10 +1031,8 @@ cmath_polar_impl(PyObject *module, Py_complex z) double r, phi; errno = 0; - PyFPE_START_PROTECT("polar function", return 0) phi = c_atan2(z); /* should not cause any exception */ r = _Py_c_abs(z); /* sets errno to ERANGE on overflow */ - PyFPE_END_PROTECT(r) if (errno != 0) return math_error(); else @@ -1074,7 +1068,6 @@ cmath_rect_impl(PyObject *module, double r, double phi) { Py_complex z; errno = 0; - PyFPE_START_PROTECT("rect function", return 0) /* deal with special values */ if (!Py_IS_FINITE(r) || !Py_IS_FINITE(phi)) { @@ -1116,7 +1109,6 @@ cmath_rect_impl(PyObject *module, double r, double phi) errno = 0; } - PyFPE_END_PROTECT(z) if (errno != 0) return math_error(); else diff --git a/Modules/errnomodule.c b/Modules/errnomodule.c index 06ed53a6..d99bed45 100644 --- a/Modules/errnomodule.c +++ b/Modules/errnomodule.c @@ -46,66 +46,57 @@ static PyMethodDef errno_methods[] = { /* Helper function doing the dictionary inserting */ -static void -_inscode(PyObject *d, PyObject *de, const char *name, int code) +static int +_add_errcode(PyObject *module_dict, PyObject *error_dict, const char *name_str, int code_int) { - PyObject *u = PyUnicode_FromString(name); - PyObject *v = PyLong_FromLong((long) code); - - /* Don't bother checking for errors; they'll be caught at the end - * of the module initialization function by the caller of - * initerrno(). - */ - if (u && v) { - /* insert in modules dict */ - PyDict_SetItem(d, u, v); - /* insert in errorcode dict */ - PyDict_SetItem(de, v, u); + PyObject *name = PyUnicode_FromString(name_str); + if (!name) { + return -1; } - Py_XDECREF(u); - Py_XDECREF(v); -} -PyDoc_STRVAR(errno__doc__, -"This module makes available standard errno system symbols.\n\ -\n\ -The value of each symbol is the corresponding integer value,\n\ -e.g., on most systems, errno.ENOENT equals the integer 2.\n\ -\n\ -The dictionary errno.errorcode maps numeric codes to symbol names,\n\ -e.g., errno.errorcode[2] could be the string 'ENOENT'.\n\ -\n\ -Symbols that are not relevant to the underlying system are not defined.\n\ -\n\ -To map error codes to error messages, use the function os.strerror(),\n\ -e.g. os.strerror(2) could return 'No such file or directory'."); + PyObject *code = PyLong_FromLong(code_int); + if (!code) { + Py_DECREF(name); + return -1; + } -static struct PyModuleDef errnomodule = { - PyModuleDef_HEAD_INIT, - "errno", - errno__doc__, - -1, - errno_methods, - NULL, - NULL, - NULL, - NULL -}; + int ret = -1; + /* insert in modules dict */ + if (PyDict_SetItem(module_dict, name, code) < 0) { + goto end; + } + /* insert in errorcode dict */ + if (PyDict_SetItem(error_dict, code, name) < 0) { + goto end; + } + ret = 0; +end: + Py_DECREF(name); + Py_DECREF(code); + return ret; +} -PyMODINIT_FUNC -PyInit_errno(void) +static int +errno_exec(PyObject *module) { - PyObject *m, *d, *de; - m = PyModule_Create(&errnomodule); - if (m == NULL) - return NULL; - d = PyModule_GetDict(m); - de = PyDict_New(); - if (!d || !de || PyDict_SetItemString(d, "errorcode", de) < 0) - return NULL; + PyObject *module_dict = PyModule_GetDict(module); + PyObject *error_dict = PyDict_New(); + if (!module_dict || !error_dict) { + return -1; + } + if (PyDict_SetItemString(module_dict, "errorcode", error_dict) < 0) { + Py_DECREF(error_dict); + return -1; + } /* Macro so I don't have to edit each and every line below... */ -#define inscode(d, ds, de, name, code, comment) _inscode(d, de, name, code) +#define add_errcode(name, code, comment) \ + do { \ + if (_add_errcode(module_dict, error_dict, name, code) < 0) { \ + Py_DECREF(error_dict); \ + return -1; \ + } \ + } while (0); /* * The names and comments are borrowed from linux/include/errno.h, @@ -116,820 +107,854 @@ PyInit_errno(void) */ #ifdef ENODEV - inscode(d, ds, de, "ENODEV", ENODEV, "No such device"); + add_errcode("ENODEV", ENODEV, "No such device"); #endif #ifdef ENOCSI - inscode(d, ds, de, "ENOCSI", ENOCSI, "No CSI structure available"); + add_errcode("ENOCSI", ENOCSI, "No CSI structure available"); #endif #ifdef EHOSTUNREACH - inscode(d, ds, de, "EHOSTUNREACH", EHOSTUNREACH, "No route to host"); + add_errcode("EHOSTUNREACH", EHOSTUNREACH, "No route to host"); #else #ifdef WSAEHOSTUNREACH - inscode(d, ds, de, "EHOSTUNREACH", WSAEHOSTUNREACH, "No route to host"); + add_errcode("EHOSTUNREACH", WSAEHOSTUNREACH, "No route to host"); #endif #endif #ifdef ENOMSG - inscode(d, ds, de, "ENOMSG", ENOMSG, "No message of desired type"); + add_errcode("ENOMSG", ENOMSG, "No message of desired type"); #endif #ifdef EUCLEAN - inscode(d, ds, de, "EUCLEAN", EUCLEAN, "Structure needs cleaning"); + add_errcode("EUCLEAN", EUCLEAN, "Structure needs cleaning"); #endif #ifdef EL2NSYNC - inscode(d, ds, de, "EL2NSYNC", EL2NSYNC, "Level 2 not synchronized"); + add_errcode("EL2NSYNC", EL2NSYNC, "Level 2 not synchronized"); #endif #ifdef EL2HLT - inscode(d, ds, de, "EL2HLT", EL2HLT, "Level 2 halted"); + add_errcode("EL2HLT", EL2HLT, "Level 2 halted"); #endif #ifdef ENODATA - inscode(d, ds, de, "ENODATA", ENODATA, "No data available"); + add_errcode("ENODATA", ENODATA, "No data available"); #endif #ifdef ENOTBLK - inscode(d, ds, de, "ENOTBLK", ENOTBLK, "Block device required"); + add_errcode("ENOTBLK", ENOTBLK, "Block device required"); #endif #ifdef ENOSYS - inscode(d, ds, de, "ENOSYS", ENOSYS, "Function not implemented"); + add_errcode("ENOSYS", ENOSYS, "Function not implemented"); #endif #ifdef EPIPE - inscode(d, ds, de, "EPIPE", EPIPE, "Broken pipe"); + add_errcode("EPIPE", EPIPE, "Broken pipe"); #endif #ifdef EINVAL - inscode(d, ds, de, "EINVAL", EINVAL, "Invalid argument"); + add_errcode("EINVAL", EINVAL, "Invalid argument"); #else #ifdef WSAEINVAL - inscode(d, ds, de, "EINVAL", WSAEINVAL, "Invalid argument"); + add_errcode("EINVAL", WSAEINVAL, "Invalid argument"); #endif #endif #ifdef EOVERFLOW - inscode(d, ds, de, "EOVERFLOW", EOVERFLOW, "Value too large for defined data type"); + add_errcode("EOVERFLOW", EOVERFLOW, "Value too large for defined data type"); #endif #ifdef EADV - inscode(d, ds, de, "EADV", EADV, "Advertise error"); + add_errcode("EADV", EADV, "Advertise error"); #endif #ifdef EINTR - inscode(d, ds, de, "EINTR", EINTR, "Interrupted system call"); + add_errcode("EINTR", EINTR, "Interrupted system call"); #else #ifdef WSAEINTR - inscode(d, ds, de, "EINTR", WSAEINTR, "Interrupted system call"); + add_errcode("EINTR", WSAEINTR, "Interrupted system call"); #endif #endif #ifdef EUSERS - inscode(d, ds, de, "EUSERS", EUSERS, "Too many users"); + add_errcode("EUSERS", EUSERS, "Too many users"); #else #ifdef WSAEUSERS - inscode(d, ds, de, "EUSERS", WSAEUSERS, "Too many users"); + add_errcode("EUSERS", WSAEUSERS, "Too many users"); #endif #endif #ifdef ENOTEMPTY - inscode(d, ds, de, "ENOTEMPTY", ENOTEMPTY, "Directory not empty"); + add_errcode("ENOTEMPTY", ENOTEMPTY, "Directory not empty"); #else #ifdef WSAENOTEMPTY - inscode(d, ds, de, "ENOTEMPTY", WSAENOTEMPTY, "Directory not empty"); + add_errcode("ENOTEMPTY", WSAENOTEMPTY, "Directory not empty"); #endif #endif #ifdef ENOBUFS - inscode(d, ds, de, "ENOBUFS", ENOBUFS, "No buffer space available"); + add_errcode("ENOBUFS", ENOBUFS, "No buffer space available"); #else #ifdef WSAENOBUFS - inscode(d, ds, de, "ENOBUFS", WSAENOBUFS, "No buffer space available"); + add_errcode("ENOBUFS", WSAENOBUFS, "No buffer space available"); #endif #endif #ifdef EPROTO - inscode(d, ds, de, "EPROTO", EPROTO, "Protocol error"); + add_errcode("EPROTO", EPROTO, "Protocol error"); #endif #ifdef EREMOTE - inscode(d, ds, de, "EREMOTE", EREMOTE, "Object is remote"); + add_errcode("EREMOTE", EREMOTE, "Object is remote"); #else #ifdef WSAEREMOTE - inscode(d, ds, de, "EREMOTE", WSAEREMOTE, "Object is remote"); + add_errcode("EREMOTE", WSAEREMOTE, "Object is remote"); #endif #endif #ifdef ENAVAIL - inscode(d, ds, de, "ENAVAIL", ENAVAIL, "No XENIX semaphores available"); + add_errcode("ENAVAIL", ENAVAIL, "No XENIX semaphores available"); #endif #ifdef ECHILD - inscode(d, ds, de, "ECHILD", ECHILD, "No child processes"); + add_errcode("ECHILD", ECHILD, "No child processes"); #endif #ifdef ELOOP - inscode(d, ds, de, "ELOOP", ELOOP, "Too many symbolic links encountered"); + add_errcode("ELOOP", ELOOP, "Too many symbolic links encountered"); #else #ifdef WSAELOOP - inscode(d, ds, de, "ELOOP", WSAELOOP, "Too many symbolic links encountered"); + add_errcode("ELOOP", WSAELOOP, "Too many symbolic links encountered"); #endif #endif #ifdef EXDEV - inscode(d, ds, de, "EXDEV", EXDEV, "Cross-device link"); + add_errcode("EXDEV", EXDEV, "Cross-device link"); #endif #ifdef E2BIG - inscode(d, ds, de, "E2BIG", E2BIG, "Arg list too long"); + add_errcode("E2BIG", E2BIG, "Arg list too long"); #endif #ifdef ESRCH - inscode(d, ds, de, "ESRCH", ESRCH, "No such process"); + add_errcode("ESRCH", ESRCH, "No such process"); #endif #ifdef EMSGSIZE - inscode(d, ds, de, "EMSGSIZE", EMSGSIZE, "Message too long"); + add_errcode("EMSGSIZE", EMSGSIZE, "Message too long"); #else #ifdef WSAEMSGSIZE - inscode(d, ds, de, "EMSGSIZE", WSAEMSGSIZE, "Message too long"); + add_errcode("EMSGSIZE", WSAEMSGSIZE, "Message too long"); #endif #endif #ifdef EAFNOSUPPORT - inscode(d, ds, de, "EAFNOSUPPORT", EAFNOSUPPORT, "Address family not supported by protocol"); + add_errcode("EAFNOSUPPORT", EAFNOSUPPORT, "Address family not supported by protocol"); #else #ifdef WSAEAFNOSUPPORT - inscode(d, ds, de, "EAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol"); + add_errcode("EAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol"); #endif #endif #ifdef EBADR - inscode(d, ds, de, "EBADR", EBADR, "Invalid request descriptor"); + add_errcode("EBADR", EBADR, "Invalid request descriptor"); #endif #ifdef EHOSTDOWN - inscode(d, ds, de, "EHOSTDOWN", EHOSTDOWN, "Host is down"); + add_errcode("EHOSTDOWN", EHOSTDOWN, "Host is down"); #else #ifdef WSAEHOSTDOWN - inscode(d, ds, de, "EHOSTDOWN", WSAEHOSTDOWN, "Host is down"); + add_errcode("EHOSTDOWN", WSAEHOSTDOWN, "Host is down"); #endif #endif #ifdef EPFNOSUPPORT - inscode(d, ds, de, "EPFNOSUPPORT", EPFNOSUPPORT, "Protocol family not supported"); + add_errcode("EPFNOSUPPORT", EPFNOSUPPORT, "Protocol family not supported"); #else #ifdef WSAEPFNOSUPPORT - inscode(d, ds, de, "EPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported"); + add_errcode("EPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported"); #endif #endif #ifdef ENOPROTOOPT - inscode(d, ds, de, "ENOPROTOOPT", ENOPROTOOPT, "Protocol not available"); + add_errcode("ENOPROTOOPT", ENOPROTOOPT, "Protocol not available"); #else #ifdef WSAENOPROTOOPT - inscode(d, ds, de, "ENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available"); + add_errcode("ENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available"); #endif #endif #ifdef EBUSY - inscode(d, ds, de, "EBUSY", EBUSY, "Device or resource busy"); + add_errcode("EBUSY", EBUSY, "Device or resource busy"); #endif #ifdef EWOULDBLOCK - inscode(d, ds, de, "EWOULDBLOCK", EWOULDBLOCK, "Operation would block"); + add_errcode("EWOULDBLOCK", EWOULDBLOCK, "Operation would block"); #else #ifdef WSAEWOULDBLOCK - inscode(d, ds, de, "EWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block"); + add_errcode("EWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block"); #endif #endif #ifdef EBADFD - inscode(d, ds, de, "EBADFD", EBADFD, "File descriptor in bad state"); + add_errcode("EBADFD", EBADFD, "File descriptor in bad state"); #endif #ifdef EDOTDOT - inscode(d, ds, de, "EDOTDOT", EDOTDOT, "RFS specific error"); + add_errcode("EDOTDOT", EDOTDOT, "RFS specific error"); #endif #ifdef EISCONN - inscode(d, ds, de, "EISCONN", EISCONN, "Transport endpoint is already connected"); + add_errcode("EISCONN", EISCONN, "Transport endpoint is already connected"); #else #ifdef WSAEISCONN - inscode(d, ds, de, "EISCONN", WSAEISCONN, "Transport endpoint is already connected"); + add_errcode("EISCONN", WSAEISCONN, "Transport endpoint is already connected"); #endif #endif #ifdef ENOANO - inscode(d, ds, de, "ENOANO", ENOANO, "No anode"); + add_errcode("ENOANO", ENOANO, "No anode"); #endif #ifdef ESHUTDOWN - inscode(d, ds, de, "ESHUTDOWN", ESHUTDOWN, "Cannot send after transport endpoint shutdown"); + add_errcode("ESHUTDOWN", ESHUTDOWN, "Cannot send after transport endpoint shutdown"); #else #ifdef WSAESHUTDOWN - inscode(d, ds, de, "ESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown"); + add_errcode("ESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown"); #endif #endif #ifdef ECHRNG - inscode(d, ds, de, "ECHRNG", ECHRNG, "Channel number out of range"); + add_errcode("ECHRNG", ECHRNG, "Channel number out of range"); #endif #ifdef ELIBBAD - inscode(d, ds, de, "ELIBBAD", ELIBBAD, "Accessing a corrupted shared library"); + add_errcode("ELIBBAD", ELIBBAD, "Accessing a corrupted shared library"); #endif #ifdef ENONET - inscode(d, ds, de, "ENONET", ENONET, "Machine is not on the network"); + add_errcode("ENONET", ENONET, "Machine is not on the network"); #endif #ifdef EBADE - inscode(d, ds, de, "EBADE", EBADE, "Invalid exchange"); + add_errcode("EBADE", EBADE, "Invalid exchange"); #endif #ifdef EBADF - inscode(d, ds, de, "EBADF", EBADF, "Bad file number"); + add_errcode("EBADF", EBADF, "Bad file number"); #else #ifdef WSAEBADF - inscode(d, ds, de, "EBADF", WSAEBADF, "Bad file number"); + add_errcode("EBADF", WSAEBADF, "Bad file number"); #endif #endif #ifdef EMULTIHOP - inscode(d, ds, de, "EMULTIHOP", EMULTIHOP, "Multihop attempted"); + add_errcode("EMULTIHOP", EMULTIHOP, "Multihop attempted"); #endif #ifdef EIO - inscode(d, ds, de, "EIO", EIO, "I/O error"); + add_errcode("EIO", EIO, "I/O error"); #endif #ifdef EUNATCH - inscode(d, ds, de, "EUNATCH", EUNATCH, "Protocol driver not attached"); + add_errcode("EUNATCH", EUNATCH, "Protocol driver not attached"); #endif #ifdef EPROTOTYPE - inscode(d, ds, de, "EPROTOTYPE", EPROTOTYPE, "Protocol wrong type for socket"); + add_errcode("EPROTOTYPE", EPROTOTYPE, "Protocol wrong type for socket"); #else #ifdef WSAEPROTOTYPE - inscode(d, ds, de, "EPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket"); + add_errcode("EPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket"); #endif #endif #ifdef ENOSPC - inscode(d, ds, de, "ENOSPC", ENOSPC, "No space left on device"); + add_errcode("ENOSPC", ENOSPC, "No space left on device"); #endif #ifdef ENOEXEC - inscode(d, ds, de, "ENOEXEC", ENOEXEC, "Exec format error"); + add_errcode("ENOEXEC", ENOEXEC, "Exec format error"); #endif #ifdef EALREADY - inscode(d, ds, de, "EALREADY", EALREADY, "Operation already in progress"); + add_errcode("EALREADY", EALREADY, "Operation already in progress"); #else #ifdef WSAEALREADY - inscode(d, ds, de, "EALREADY", WSAEALREADY, "Operation already in progress"); + add_errcode("EALREADY", WSAEALREADY, "Operation already in progress"); #endif #endif #ifdef ENETDOWN - inscode(d, ds, de, "ENETDOWN", ENETDOWN, "Network is down"); + add_errcode("ENETDOWN", ENETDOWN, "Network is down"); #else #ifdef WSAENETDOWN - inscode(d, ds, de, "ENETDOWN", WSAENETDOWN, "Network is down"); + add_errcode("ENETDOWN", WSAENETDOWN, "Network is down"); #endif #endif #ifdef ENOTNAM - inscode(d, ds, de, "ENOTNAM", ENOTNAM, "Not a XENIX named type file"); + add_errcode("ENOTNAM", ENOTNAM, "Not a XENIX named type file"); #endif #ifdef EACCES - inscode(d, ds, de, "EACCES", EACCES, "Permission denied"); + add_errcode("EACCES", EACCES, "Permission denied"); #else #ifdef WSAEACCES - inscode(d, ds, de, "EACCES", WSAEACCES, "Permission denied"); + add_errcode("EACCES", WSAEACCES, "Permission denied"); #endif #endif #ifdef ELNRNG - inscode(d, ds, de, "ELNRNG", ELNRNG, "Link number out of range"); + add_errcode("ELNRNG", ELNRNG, "Link number out of range"); #endif #ifdef EILSEQ - inscode(d, ds, de, "EILSEQ", EILSEQ, "Illegal byte sequence"); + add_errcode("EILSEQ", EILSEQ, "Illegal byte sequence"); #endif #ifdef ENOTDIR - inscode(d, ds, de, "ENOTDIR", ENOTDIR, "Not a directory"); + add_errcode("ENOTDIR", ENOTDIR, "Not a directory"); #endif #ifdef ENOTUNIQ - inscode(d, ds, de, "ENOTUNIQ", ENOTUNIQ, "Name not unique on network"); + add_errcode("ENOTUNIQ", ENOTUNIQ, "Name not unique on network"); #endif #ifdef EPERM - inscode(d, ds, de, "EPERM", EPERM, "Operation not permitted"); + add_errcode("EPERM", EPERM, "Operation not permitted"); #endif #ifdef EDOM - inscode(d, ds, de, "EDOM", EDOM, "Math argument out of domain of func"); + add_errcode("EDOM", EDOM, "Math argument out of domain of func"); #endif #ifdef EXFULL - inscode(d, ds, de, "EXFULL", EXFULL, "Exchange full"); + add_errcode("EXFULL", EXFULL, "Exchange full"); #endif #ifdef ECONNREFUSED - inscode(d, ds, de, "ECONNREFUSED", ECONNREFUSED, "Connection refused"); + add_errcode("ECONNREFUSED", ECONNREFUSED, "Connection refused"); #else #ifdef WSAECONNREFUSED - inscode(d, ds, de, "ECONNREFUSED", WSAECONNREFUSED, "Connection refused"); + add_errcode("ECONNREFUSED", WSAECONNREFUSED, "Connection refused"); #endif #endif #ifdef EISDIR - inscode(d, ds, de, "EISDIR", EISDIR, "Is a directory"); + add_errcode("EISDIR", EISDIR, "Is a directory"); #endif #ifdef EPROTONOSUPPORT - inscode(d, ds, de, "EPROTONOSUPPORT", EPROTONOSUPPORT, "Protocol not supported"); + add_errcode("EPROTONOSUPPORT", EPROTONOSUPPORT, "Protocol not supported"); #else #ifdef WSAEPROTONOSUPPORT - inscode(d, ds, de, "EPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported"); + add_errcode("EPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported"); #endif #endif #ifdef EROFS - inscode(d, ds, de, "EROFS", EROFS, "Read-only file system"); + add_errcode("EROFS", EROFS, "Read-only file system"); #endif #ifdef EADDRNOTAVAIL - inscode(d, ds, de, "EADDRNOTAVAIL", EADDRNOTAVAIL, "Cannot assign requested address"); + add_errcode("EADDRNOTAVAIL", EADDRNOTAVAIL, "Cannot assign requested address"); #else #ifdef WSAEADDRNOTAVAIL - inscode(d, ds, de, "EADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address"); + add_errcode("EADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address"); #endif #endif #ifdef EIDRM - inscode(d, ds, de, "EIDRM", EIDRM, "Identifier removed"); + add_errcode("EIDRM", EIDRM, "Identifier removed"); #endif #ifdef ECOMM - inscode(d, ds, de, "ECOMM", ECOMM, "Communication error on send"); + add_errcode("ECOMM", ECOMM, "Communication error on send"); #endif #ifdef ESRMNT - inscode(d, ds, de, "ESRMNT", ESRMNT, "Srmount error"); + add_errcode("ESRMNT", ESRMNT, "Srmount error"); #endif #ifdef EREMOTEIO - inscode(d, ds, de, "EREMOTEIO", EREMOTEIO, "Remote I/O error"); + add_errcode("EREMOTEIO", EREMOTEIO, "Remote I/O error"); #endif #ifdef EL3RST - inscode(d, ds, de, "EL3RST", EL3RST, "Level 3 reset"); + add_errcode("EL3RST", EL3RST, "Level 3 reset"); #endif #ifdef EBADMSG - inscode(d, ds, de, "EBADMSG", EBADMSG, "Not a data message"); + add_errcode("EBADMSG", EBADMSG, "Not a data message"); #endif #ifdef ENFILE - inscode(d, ds, de, "ENFILE", ENFILE, "File table overflow"); + add_errcode("ENFILE", ENFILE, "File table overflow"); #endif #ifdef ELIBMAX - inscode(d, ds, de, "ELIBMAX", ELIBMAX, "Attempting to link in too many shared libraries"); + add_errcode("ELIBMAX", ELIBMAX, "Attempting to link in too many shared libraries"); #endif #ifdef ESPIPE - inscode(d, ds, de, "ESPIPE", ESPIPE, "Illegal seek"); + add_errcode("ESPIPE", ESPIPE, "Illegal seek"); #endif #ifdef ENOLINK - inscode(d, ds, de, "ENOLINK", ENOLINK, "Link has been severed"); + add_errcode("ENOLINK", ENOLINK, "Link has been severed"); #endif #ifdef ENETRESET - inscode(d, ds, de, "ENETRESET", ENETRESET, "Network dropped connection because of reset"); + add_errcode("ENETRESET", ENETRESET, "Network dropped connection because of reset"); #else #ifdef WSAENETRESET - inscode(d, ds, de, "ENETRESET", WSAENETRESET, "Network dropped connection because of reset"); + add_errcode("ENETRESET", WSAENETRESET, "Network dropped connection because of reset"); #endif #endif #ifdef ETIMEDOUT - inscode(d, ds, de, "ETIMEDOUT", ETIMEDOUT, "Connection timed out"); + add_errcode("ETIMEDOUT", ETIMEDOUT, "Connection timed out"); #else #ifdef WSAETIMEDOUT - inscode(d, ds, de, "ETIMEDOUT", WSAETIMEDOUT, "Connection timed out"); + add_errcode("ETIMEDOUT", WSAETIMEDOUT, "Connection timed out"); #endif #endif #ifdef ENOENT - inscode(d, ds, de, "ENOENT", ENOENT, "No such file or directory"); + add_errcode("ENOENT", ENOENT, "No such file or directory"); #endif #ifdef EEXIST - inscode(d, ds, de, "EEXIST", EEXIST, "File exists"); + add_errcode("EEXIST", EEXIST, "File exists"); #endif #ifdef EDQUOT - inscode(d, ds, de, "EDQUOT", EDQUOT, "Quota exceeded"); + add_errcode("EDQUOT", EDQUOT, "Quota exceeded"); #else #ifdef WSAEDQUOT - inscode(d, ds, de, "EDQUOT", WSAEDQUOT, "Quota exceeded"); + add_errcode("EDQUOT", WSAEDQUOT, "Quota exceeded"); #endif #endif #ifdef ENOSTR - inscode(d, ds, de, "ENOSTR", ENOSTR, "Device not a stream"); + add_errcode("ENOSTR", ENOSTR, "Device not a stream"); #endif #ifdef EBADSLT - inscode(d, ds, de, "EBADSLT", EBADSLT, "Invalid slot"); + add_errcode("EBADSLT", EBADSLT, "Invalid slot"); #endif #ifdef EBADRQC - inscode(d, ds, de, "EBADRQC", EBADRQC, "Invalid request code"); + add_errcode("EBADRQC", EBADRQC, "Invalid request code"); #endif #ifdef ELIBACC - inscode(d, ds, de, "ELIBACC", ELIBACC, "Can not access a needed shared library"); + add_errcode("ELIBACC", ELIBACC, "Can not access a needed shared library"); #endif #ifdef EFAULT - inscode(d, ds, de, "EFAULT", EFAULT, "Bad address"); + add_errcode("EFAULT", EFAULT, "Bad address"); #else #ifdef WSAEFAULT - inscode(d, ds, de, "EFAULT", WSAEFAULT, "Bad address"); + add_errcode("EFAULT", WSAEFAULT, "Bad address"); #endif #endif #ifdef EFBIG - inscode(d, ds, de, "EFBIG", EFBIG, "File too large"); + add_errcode("EFBIG", EFBIG, "File too large"); #endif #ifdef EDEADLK - inscode(d, ds, de, "EDEADLK", EDEADLK, "Resource deadlock would occur"); + add_errcode("EDEADLK", EDEADLK, "Resource deadlock would occur"); #endif #ifdef ENOTCONN - inscode(d, ds, de, "ENOTCONN", ENOTCONN, "Transport endpoint is not connected"); + add_errcode("ENOTCONN", ENOTCONN, "Transport endpoint is not connected"); #else #ifdef WSAENOTCONN - inscode(d, ds, de, "ENOTCONN", WSAENOTCONN, "Transport endpoint is not connected"); + add_errcode("ENOTCONN", WSAENOTCONN, "Transport endpoint is not connected"); #endif #endif #ifdef EDESTADDRREQ - inscode(d, ds, de, "EDESTADDRREQ", EDESTADDRREQ, "Destination address required"); + add_errcode("EDESTADDRREQ", EDESTADDRREQ, "Destination address required"); #else #ifdef WSAEDESTADDRREQ - inscode(d, ds, de, "EDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required"); + add_errcode("EDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required"); #endif #endif #ifdef ELIBSCN - inscode(d, ds, de, "ELIBSCN", ELIBSCN, ".lib section in a.out corrupted"); + add_errcode("ELIBSCN", ELIBSCN, ".lib section in a.out corrupted"); #endif #ifdef ENOLCK - inscode(d, ds, de, "ENOLCK", ENOLCK, "No record locks available"); + add_errcode("ENOLCK", ENOLCK, "No record locks available"); #endif #ifdef EISNAM - inscode(d, ds, de, "EISNAM", EISNAM, "Is a named type file"); + add_errcode("EISNAM", EISNAM, "Is a named type file"); #endif #ifdef ECONNABORTED - inscode(d, ds, de, "ECONNABORTED", ECONNABORTED, "Software caused connection abort"); + add_errcode("ECONNABORTED", ECONNABORTED, "Software caused connection abort"); #else #ifdef WSAECONNABORTED - inscode(d, ds, de, "ECONNABORTED", WSAECONNABORTED, "Software caused connection abort"); + add_errcode("ECONNABORTED", WSAECONNABORTED, "Software caused connection abort"); #endif #endif #ifdef ENETUNREACH - inscode(d, ds, de, "ENETUNREACH", ENETUNREACH, "Network is unreachable"); + add_errcode("ENETUNREACH", ENETUNREACH, "Network is unreachable"); #else #ifdef WSAENETUNREACH - inscode(d, ds, de, "ENETUNREACH", WSAENETUNREACH, "Network is unreachable"); + add_errcode("ENETUNREACH", WSAENETUNREACH, "Network is unreachable"); #endif #endif #ifdef ESTALE - inscode(d, ds, de, "ESTALE", ESTALE, "Stale NFS file handle"); + add_errcode("ESTALE", ESTALE, "Stale NFS file handle"); #else #ifdef WSAESTALE - inscode(d, ds, de, "ESTALE", WSAESTALE, "Stale NFS file handle"); + add_errcode("ESTALE", WSAESTALE, "Stale NFS file handle"); #endif #endif #ifdef ENOSR - inscode(d, ds, de, "ENOSR", ENOSR, "Out of streams resources"); + add_errcode("ENOSR", ENOSR, "Out of streams resources"); #endif #ifdef ENOMEM - inscode(d, ds, de, "ENOMEM", ENOMEM, "Out of memory"); + add_errcode("ENOMEM", ENOMEM, "Out of memory"); #endif #ifdef ENOTSOCK - inscode(d, ds, de, "ENOTSOCK", ENOTSOCK, "Socket operation on non-socket"); + add_errcode("ENOTSOCK", ENOTSOCK, "Socket operation on non-socket"); #else #ifdef WSAENOTSOCK - inscode(d, ds, de, "ENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket"); + add_errcode("ENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket"); #endif #endif #ifdef ESTRPIPE - inscode(d, ds, de, "ESTRPIPE", ESTRPIPE, "Streams pipe error"); + add_errcode("ESTRPIPE", ESTRPIPE, "Streams pipe error"); #endif #ifdef EMLINK - inscode(d, ds, de, "EMLINK", EMLINK, "Too many links"); + add_errcode("EMLINK", EMLINK, "Too many links"); #endif #ifdef ERANGE - inscode(d, ds, de, "ERANGE", ERANGE, "Math result not representable"); + add_errcode("ERANGE", ERANGE, "Math result not representable"); #endif #ifdef ELIBEXEC - inscode(d, ds, de, "ELIBEXEC", ELIBEXEC, "Cannot exec a shared library directly"); + add_errcode("ELIBEXEC", ELIBEXEC, "Cannot exec a shared library directly"); #endif #ifdef EL3HLT - inscode(d, ds, de, "EL3HLT", EL3HLT, "Level 3 halted"); + add_errcode("EL3HLT", EL3HLT, "Level 3 halted"); #endif #ifdef ECONNRESET - inscode(d, ds, de, "ECONNRESET", ECONNRESET, "Connection reset by peer"); + add_errcode("ECONNRESET", ECONNRESET, "Connection reset by peer"); #else #ifdef WSAECONNRESET - inscode(d, ds, de, "ECONNRESET", WSAECONNRESET, "Connection reset by peer"); + add_errcode("ECONNRESET", WSAECONNRESET, "Connection reset by peer"); #endif #endif #ifdef EADDRINUSE - inscode(d, ds, de, "EADDRINUSE", EADDRINUSE, "Address already in use"); + add_errcode("EADDRINUSE", EADDRINUSE, "Address already in use"); #else #ifdef WSAEADDRINUSE - inscode(d, ds, de, "EADDRINUSE", WSAEADDRINUSE, "Address already in use"); + add_errcode("EADDRINUSE", WSAEADDRINUSE, "Address already in use"); #endif #endif #ifdef EOPNOTSUPP - inscode(d, ds, de, "EOPNOTSUPP", EOPNOTSUPP, "Operation not supported on transport endpoint"); + add_errcode("EOPNOTSUPP", EOPNOTSUPP, "Operation not supported on transport endpoint"); #else #ifdef WSAEOPNOTSUPP - inscode(d, ds, de, "EOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint"); + add_errcode("EOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint"); #endif #endif #ifdef EREMCHG - inscode(d, ds, de, "EREMCHG", EREMCHG, "Remote address changed"); + add_errcode("EREMCHG", EREMCHG, "Remote address changed"); #endif #ifdef EAGAIN - inscode(d, ds, de, "EAGAIN", EAGAIN, "Try again"); + add_errcode("EAGAIN", EAGAIN, "Try again"); #endif #ifdef ENAMETOOLONG - inscode(d, ds, de, "ENAMETOOLONG", ENAMETOOLONG, "File name too long"); + add_errcode("ENAMETOOLONG", ENAMETOOLONG, "File name too long"); #else #ifdef WSAENAMETOOLONG - inscode(d, ds, de, "ENAMETOOLONG", WSAENAMETOOLONG, "File name too long"); + add_errcode("ENAMETOOLONG", WSAENAMETOOLONG, "File name too long"); #endif #endif #ifdef ENOTTY - inscode(d, ds, de, "ENOTTY", ENOTTY, "Not a typewriter"); + add_errcode("ENOTTY", ENOTTY, "Not a typewriter"); #endif #ifdef ERESTART - inscode(d, ds, de, "ERESTART", ERESTART, "Interrupted system call should be restarted"); + add_errcode("ERESTART", ERESTART, "Interrupted system call should be restarted"); #endif #ifdef ESOCKTNOSUPPORT - inscode(d, ds, de, "ESOCKTNOSUPPORT", ESOCKTNOSUPPORT, "Socket type not supported"); + add_errcode("ESOCKTNOSUPPORT", ESOCKTNOSUPPORT, "Socket type not supported"); #else #ifdef WSAESOCKTNOSUPPORT - inscode(d, ds, de, "ESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported"); + add_errcode("ESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported"); #endif #endif #ifdef ETIME - inscode(d, ds, de, "ETIME", ETIME, "Timer expired"); + add_errcode("ETIME", ETIME, "Timer expired"); #endif #ifdef EBFONT - inscode(d, ds, de, "EBFONT", EBFONT, "Bad font file format"); + add_errcode("EBFONT", EBFONT, "Bad font file format"); #endif #ifdef EDEADLOCK - inscode(d, ds, de, "EDEADLOCK", EDEADLOCK, "Error EDEADLOCK"); + add_errcode("EDEADLOCK", EDEADLOCK, "Error EDEADLOCK"); #endif #ifdef ETOOMANYREFS - inscode(d, ds, de, "ETOOMANYREFS", ETOOMANYREFS, "Too many references: cannot splice"); + add_errcode("ETOOMANYREFS", ETOOMANYREFS, "Too many references: cannot splice"); #else #ifdef WSAETOOMANYREFS - inscode(d, ds, de, "ETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice"); + add_errcode("ETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice"); #endif #endif #ifdef EMFILE - inscode(d, ds, de, "EMFILE", EMFILE, "Too many open files"); + add_errcode("EMFILE", EMFILE, "Too many open files"); #else #ifdef WSAEMFILE - inscode(d, ds, de, "EMFILE", WSAEMFILE, "Too many open files"); + add_errcode("EMFILE", WSAEMFILE, "Too many open files"); #endif #endif #ifdef ETXTBSY - inscode(d, ds, de, "ETXTBSY", ETXTBSY, "Text file busy"); + add_errcode("ETXTBSY", ETXTBSY, "Text file busy"); #endif #ifdef EINPROGRESS - inscode(d, ds, de, "EINPROGRESS", EINPROGRESS, "Operation now in progress"); + add_errcode("EINPROGRESS", EINPROGRESS, "Operation now in progress"); #else #ifdef WSAEINPROGRESS - inscode(d, ds, de, "EINPROGRESS", WSAEINPROGRESS, "Operation now in progress"); + add_errcode("EINPROGRESS", WSAEINPROGRESS, "Operation now in progress"); #endif #endif #ifdef ENXIO - inscode(d, ds, de, "ENXIO", ENXIO, "No such device or address"); + add_errcode("ENXIO", ENXIO, "No such device or address"); #endif #ifdef ENOPKG - inscode(d, ds, de, "ENOPKG", ENOPKG, "Package not installed"); + add_errcode("ENOPKG", ENOPKG, "Package not installed"); #endif #ifdef WSASY - inscode(d, ds, de, "WSASY", WSASY, "Error WSASY"); + add_errcode("WSASY", WSASY, "Error WSASY"); #endif #ifdef WSAEHOSTDOWN - inscode(d, ds, de, "WSAEHOSTDOWN", WSAEHOSTDOWN, "Host is down"); + add_errcode("WSAEHOSTDOWN", WSAEHOSTDOWN, "Host is down"); #endif #ifdef WSAENETDOWN - inscode(d, ds, de, "WSAENETDOWN", WSAENETDOWN, "Network is down"); + add_errcode("WSAENETDOWN", WSAENETDOWN, "Network is down"); #endif #ifdef WSAENOTSOCK - inscode(d, ds, de, "WSAENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket"); + add_errcode("WSAENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket"); #endif #ifdef WSAEHOSTUNREACH - inscode(d, ds, de, "WSAEHOSTUNREACH", WSAEHOSTUNREACH, "No route to host"); + add_errcode("WSAEHOSTUNREACH", WSAEHOSTUNREACH, "No route to host"); #endif #ifdef WSAELOOP - inscode(d, ds, de, "WSAELOOP", WSAELOOP, "Too many symbolic links encountered"); + add_errcode("WSAELOOP", WSAELOOP, "Too many symbolic links encountered"); #endif #ifdef WSAEMFILE - inscode(d, ds, de, "WSAEMFILE", WSAEMFILE, "Too many open files"); + add_errcode("WSAEMFILE", WSAEMFILE, "Too many open files"); #endif #ifdef WSAESTALE - inscode(d, ds, de, "WSAESTALE", WSAESTALE, "Stale NFS file handle"); + add_errcode("WSAESTALE", WSAESTALE, "Stale NFS file handle"); #endif #ifdef WSAVERNOTSUPPORTED - inscode(d, ds, de, "WSAVERNOTSUPPORTED", WSAVERNOTSUPPORTED, "Error WSAVERNOTSUPPORTED"); + add_errcode("WSAVERNOTSUPPORTED", WSAVERNOTSUPPORTED, "Error WSAVERNOTSUPPORTED"); #endif #ifdef WSAENETUNREACH - inscode(d, ds, de, "WSAENETUNREACH", WSAENETUNREACH, "Network is unreachable"); + add_errcode("WSAENETUNREACH", WSAENETUNREACH, "Network is unreachable"); #endif #ifdef WSAEPROCLIM - inscode(d, ds, de, "WSAEPROCLIM", WSAEPROCLIM, "Error WSAEPROCLIM"); + add_errcode("WSAEPROCLIM", WSAEPROCLIM, "Error WSAEPROCLIM"); #endif #ifdef WSAEFAULT - inscode(d, ds, de, "WSAEFAULT", WSAEFAULT, "Bad address"); + add_errcode("WSAEFAULT", WSAEFAULT, "Bad address"); #endif #ifdef WSANOTINITIALISED - inscode(d, ds, de, "WSANOTINITIALISED", WSANOTINITIALISED, "Error WSANOTINITIALISED"); + add_errcode("WSANOTINITIALISED", WSANOTINITIALISED, "Error WSANOTINITIALISED"); #endif #ifdef WSAEUSERS - inscode(d, ds, de, "WSAEUSERS", WSAEUSERS, "Too many users"); + add_errcode("WSAEUSERS", WSAEUSERS, "Too many users"); #endif #ifdef WSAMAKEASYNCREPL - inscode(d, ds, de, "WSAMAKEASYNCREPL", WSAMAKEASYNCREPL, "Error WSAMAKEASYNCREPL"); + add_errcode("WSAMAKEASYNCREPL", WSAMAKEASYNCREPL, "Error WSAMAKEASYNCREPL"); #endif #ifdef WSAENOPROTOOPT - inscode(d, ds, de, "WSAENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available"); + add_errcode("WSAENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available"); #endif #ifdef WSAECONNABORTED - inscode(d, ds, de, "WSAECONNABORTED", WSAECONNABORTED, "Software caused connection abort"); + add_errcode("WSAECONNABORTED", WSAECONNABORTED, "Software caused connection abort"); #endif #ifdef WSAENAMETOOLONG - inscode(d, ds, de, "WSAENAMETOOLONG", WSAENAMETOOLONG, "File name too long"); + add_errcode("WSAENAMETOOLONG", WSAENAMETOOLONG, "File name too long"); #endif #ifdef WSAENOTEMPTY - inscode(d, ds, de, "WSAENOTEMPTY", WSAENOTEMPTY, "Directory not empty"); + add_errcode("WSAENOTEMPTY", WSAENOTEMPTY, "Directory not empty"); #endif #ifdef WSAESHUTDOWN - inscode(d, ds, de, "WSAESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown"); + add_errcode("WSAESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown"); #endif #ifdef WSAEAFNOSUPPORT - inscode(d, ds, de, "WSAEAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol"); + add_errcode("WSAEAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol"); #endif #ifdef WSAETOOMANYREFS - inscode(d, ds, de, "WSAETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice"); + add_errcode("WSAETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice"); #endif #ifdef WSAEACCES - inscode(d, ds, de, "WSAEACCES", WSAEACCES, "Permission denied"); + add_errcode("WSAEACCES", WSAEACCES, "Permission denied"); #endif #ifdef WSATR - inscode(d, ds, de, "WSATR", WSATR, "Error WSATR"); + add_errcode("WSATR", WSATR, "Error WSATR"); #endif #ifdef WSABASEERR - inscode(d, ds, de, "WSABASEERR", WSABASEERR, "Error WSABASEERR"); + add_errcode("WSABASEERR", WSABASEERR, "Error WSABASEERR"); #endif #ifdef WSADESCRIPTIO - inscode(d, ds, de, "WSADESCRIPTIO", WSADESCRIPTIO, "Error WSADESCRIPTIO"); + add_errcode("WSADESCRIPTIO", WSADESCRIPTIO, "Error WSADESCRIPTIO"); #endif #ifdef WSAEMSGSIZE - inscode(d, ds, de, "WSAEMSGSIZE", WSAEMSGSIZE, "Message too long"); + add_errcode("WSAEMSGSIZE", WSAEMSGSIZE, "Message too long"); #endif #ifdef WSAEBADF - inscode(d, ds, de, "WSAEBADF", WSAEBADF, "Bad file number"); + add_errcode("WSAEBADF", WSAEBADF, "Bad file number"); #endif #ifdef WSAECONNRESET - inscode(d, ds, de, "WSAECONNRESET", WSAECONNRESET, "Connection reset by peer"); + add_errcode("WSAECONNRESET", WSAECONNRESET, "Connection reset by peer"); #endif #ifdef WSAGETSELECTERRO - inscode(d, ds, de, "WSAGETSELECTERRO", WSAGETSELECTERRO, "Error WSAGETSELECTERRO"); + add_errcode("WSAGETSELECTERRO", WSAGETSELECTERRO, "Error WSAGETSELECTERRO"); #endif #ifdef WSAETIMEDOUT - inscode(d, ds, de, "WSAETIMEDOUT", WSAETIMEDOUT, "Connection timed out"); + add_errcode("WSAETIMEDOUT", WSAETIMEDOUT, "Connection timed out"); #endif #ifdef WSAENOBUFS - inscode(d, ds, de, "WSAENOBUFS", WSAENOBUFS, "No buffer space available"); + add_errcode("WSAENOBUFS", WSAENOBUFS, "No buffer space available"); #endif #ifdef WSAEDISCON - inscode(d, ds, de, "WSAEDISCON", WSAEDISCON, "Error WSAEDISCON"); + add_errcode("WSAEDISCON", WSAEDISCON, "Error WSAEDISCON"); #endif #ifdef WSAEINTR - inscode(d, ds, de, "WSAEINTR", WSAEINTR, "Interrupted system call"); + add_errcode("WSAEINTR", WSAEINTR, "Interrupted system call"); #endif #ifdef WSAEPROTOTYPE - inscode(d, ds, de, "WSAEPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket"); + add_errcode("WSAEPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket"); #endif #ifdef WSAHOS - inscode(d, ds, de, "WSAHOS", WSAHOS, "Error WSAHOS"); + add_errcode("WSAHOS", WSAHOS, "Error WSAHOS"); #endif #ifdef WSAEADDRINUSE - inscode(d, ds, de, "WSAEADDRINUSE", WSAEADDRINUSE, "Address already in use"); + add_errcode("WSAEADDRINUSE", WSAEADDRINUSE, "Address already in use"); #endif #ifdef WSAEADDRNOTAVAIL - inscode(d, ds, de, "WSAEADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address"); + add_errcode("WSAEADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address"); #endif #ifdef WSAEALREADY - inscode(d, ds, de, "WSAEALREADY", WSAEALREADY, "Operation already in progress"); + add_errcode("WSAEALREADY", WSAEALREADY, "Operation already in progress"); #endif #ifdef WSAEPROTONOSUPPORT - inscode(d, ds, de, "WSAEPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported"); + add_errcode("WSAEPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported"); #endif #ifdef WSASYSNOTREADY - inscode(d, ds, de, "WSASYSNOTREADY", WSASYSNOTREADY, "Error WSASYSNOTREADY"); + add_errcode("WSASYSNOTREADY", WSASYSNOTREADY, "Error WSASYSNOTREADY"); #endif #ifdef WSAEWOULDBLOCK - inscode(d, ds, de, "WSAEWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block"); + add_errcode("WSAEWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block"); #endif #ifdef WSAEPFNOSUPPORT - inscode(d, ds, de, "WSAEPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported"); + add_errcode("WSAEPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported"); #endif #ifdef WSAEOPNOTSUPP - inscode(d, ds, de, "WSAEOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint"); + add_errcode("WSAEOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint"); #endif #ifdef WSAEISCONN - inscode(d, ds, de, "WSAEISCONN", WSAEISCONN, "Transport endpoint is already connected"); + add_errcode("WSAEISCONN", WSAEISCONN, "Transport endpoint is already connected"); #endif #ifdef WSAEDQUOT - inscode(d, ds, de, "WSAEDQUOT", WSAEDQUOT, "Quota exceeded"); + add_errcode("WSAEDQUOT", WSAEDQUOT, "Quota exceeded"); #endif #ifdef WSAENOTCONN - inscode(d, ds, de, "WSAENOTCONN", WSAENOTCONN, "Transport endpoint is not connected"); + add_errcode("WSAENOTCONN", WSAENOTCONN, "Transport endpoint is not connected"); #endif #ifdef WSAEREMOTE - inscode(d, ds, de, "WSAEREMOTE", WSAEREMOTE, "Object is remote"); + add_errcode("WSAEREMOTE", WSAEREMOTE, "Object is remote"); #endif #ifdef WSAEINVAL - inscode(d, ds, de, "WSAEINVAL", WSAEINVAL, "Invalid argument"); + add_errcode("WSAEINVAL", WSAEINVAL, "Invalid argument"); #endif #ifdef WSAEINPROGRESS - inscode(d, ds, de, "WSAEINPROGRESS", WSAEINPROGRESS, "Operation now in progress"); + add_errcode("WSAEINPROGRESS", WSAEINPROGRESS, "Operation now in progress"); #endif #ifdef WSAGETSELECTEVEN - inscode(d, ds, de, "WSAGETSELECTEVEN", WSAGETSELECTEVEN, "Error WSAGETSELECTEVEN"); + add_errcode("WSAGETSELECTEVEN", WSAGETSELECTEVEN, "Error WSAGETSELECTEVEN"); #endif #ifdef WSAESOCKTNOSUPPORT - inscode(d, ds, de, "WSAESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported"); + add_errcode("WSAESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported"); #endif #ifdef WSAGETASYNCERRO - inscode(d, ds, de, "WSAGETASYNCERRO", WSAGETASYNCERRO, "Error WSAGETASYNCERRO"); + add_errcode("WSAGETASYNCERRO", WSAGETASYNCERRO, "Error WSAGETASYNCERRO"); #endif #ifdef WSAMAKESELECTREPL - inscode(d, ds, de, "WSAMAKESELECTREPL", WSAMAKESELECTREPL, "Error WSAMAKESELECTREPL"); + add_errcode("WSAMAKESELECTREPL", WSAMAKESELECTREPL, "Error WSAMAKESELECTREPL"); #endif #ifdef WSAGETASYNCBUFLE - inscode(d, ds, de, "WSAGETASYNCBUFLE", WSAGETASYNCBUFLE, "Error WSAGETASYNCBUFLE"); + add_errcode("WSAGETASYNCBUFLE", WSAGETASYNCBUFLE, "Error WSAGETASYNCBUFLE"); #endif #ifdef WSAEDESTADDRREQ - inscode(d, ds, de, "WSAEDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required"); + add_errcode("WSAEDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required"); #endif #ifdef WSAECONNREFUSED - inscode(d, ds, de, "WSAECONNREFUSED", WSAECONNREFUSED, "Connection refused"); + add_errcode("WSAECONNREFUSED", WSAECONNREFUSED, "Connection refused"); #endif #ifdef WSAENETRESET - inscode(d, ds, de, "WSAENETRESET", WSAENETRESET, "Network dropped connection because of reset"); + add_errcode("WSAENETRESET", WSAENETRESET, "Network dropped connection because of reset"); #endif #ifdef WSAN - inscode(d, ds, de, "WSAN", WSAN, "Error WSAN"); + add_errcode("WSAN", WSAN, "Error WSAN"); #endif #ifdef ENOMEDIUM - inscode(d, ds, de, "ENOMEDIUM", ENOMEDIUM, "No medium found"); + add_errcode("ENOMEDIUM", ENOMEDIUM, "No medium found"); #endif #ifdef EMEDIUMTYPE - inscode(d, ds, de, "EMEDIUMTYPE", EMEDIUMTYPE, "Wrong medium type"); + add_errcode("EMEDIUMTYPE", EMEDIUMTYPE, "Wrong medium type"); #endif #ifdef ECANCELED - inscode(d, ds, de, "ECANCELED", ECANCELED, "Operation Canceled"); + add_errcode("ECANCELED", ECANCELED, "Operation Canceled"); #endif #ifdef ENOKEY - inscode(d, ds, de, "ENOKEY", ENOKEY, "Required key not available"); + add_errcode("ENOKEY", ENOKEY, "Required key not available"); #endif #ifdef EKEYEXPIRED - inscode(d, ds, de, "EKEYEXPIRED", EKEYEXPIRED, "Key has expired"); + add_errcode("EKEYEXPIRED", EKEYEXPIRED, "Key has expired"); #endif #ifdef EKEYREVOKED - inscode(d, ds, de, "EKEYREVOKED", EKEYREVOKED, "Key has been revoked"); + add_errcode("EKEYREVOKED", EKEYREVOKED, "Key has been revoked"); #endif #ifdef EKEYREJECTED - inscode(d, ds, de, "EKEYREJECTED", EKEYREJECTED, "Key was rejected by service"); + add_errcode("EKEYREJECTED", EKEYREJECTED, "Key was rejected by service"); #endif #ifdef EOWNERDEAD - inscode(d, ds, de, "EOWNERDEAD", EOWNERDEAD, "Owner died"); + add_errcode("EOWNERDEAD", EOWNERDEAD, "Owner died"); #endif #ifdef ENOTRECOVERABLE - inscode(d, ds, de, "ENOTRECOVERABLE", ENOTRECOVERABLE, "State not recoverable"); + add_errcode("ENOTRECOVERABLE", ENOTRECOVERABLE, "State not recoverable"); #endif #ifdef ERFKILL - inscode(d, ds, de, "ERFKILL", ERFKILL, "Operation not possible due to RF-kill"); + add_errcode("ERFKILL", ERFKILL, "Operation not possible due to RF-kill"); #endif /* Solaris-specific errnos */ #ifdef ECANCELED - inscode(d, ds, de, "ECANCELED", ECANCELED, "Operation canceled"); + add_errcode("ECANCELED", ECANCELED, "Operation canceled"); #endif #ifdef ENOTSUP - inscode(d, ds, de, "ENOTSUP", ENOTSUP, "Operation not supported"); + add_errcode("ENOTSUP", ENOTSUP, "Operation not supported"); #endif #ifdef EOWNERDEAD - inscode(d, ds, de, "EOWNERDEAD", EOWNERDEAD, "Process died with the lock"); + add_errcode("EOWNERDEAD", EOWNERDEAD, "Process died with the lock"); #endif #ifdef ENOTRECOVERABLE - inscode(d, ds, de, "ENOTRECOVERABLE", ENOTRECOVERABLE, "Lock is not recoverable"); + add_errcode("ENOTRECOVERABLE", ENOTRECOVERABLE, "Lock is not recoverable"); #endif #ifdef ELOCKUNMAPPED - inscode(d, ds, de, "ELOCKUNMAPPED", ELOCKUNMAPPED, "Locked lock was unmapped"); + add_errcode("ELOCKUNMAPPED", ELOCKUNMAPPED, "Locked lock was unmapped"); #endif #ifdef ENOTACTIVE - inscode(d, ds, de, "ENOTACTIVE", ENOTACTIVE, "Facility is not active"); + add_errcode("ENOTACTIVE", ENOTACTIVE, "Facility is not active"); #endif /* MacOSX specific errnos */ #ifdef EAUTH - inscode(d, ds, de, "EAUTH", EAUTH, "Authentication error"); + add_errcode("EAUTH", EAUTH, "Authentication error"); #endif #ifdef EBADARCH - inscode(d, ds, de, "EBADARCH", EBADARCH, "Bad CPU type in executable"); + add_errcode("EBADARCH", EBADARCH, "Bad CPU type in executable"); #endif #ifdef EBADEXEC - inscode(d, ds, de, "EBADEXEC", EBADEXEC, "Bad executable (or shared library)"); + add_errcode("EBADEXEC", EBADEXEC, "Bad executable (or shared library)"); #endif #ifdef EBADMACHO - inscode(d, ds, de, "EBADMACHO", EBADMACHO, "Malformed Mach-o file"); + add_errcode("EBADMACHO", EBADMACHO, "Malformed Mach-o file"); #endif #ifdef EBADRPC - inscode(d, ds, de, "EBADRPC", EBADRPC, "RPC struct is bad"); + add_errcode("EBADRPC", EBADRPC, "RPC struct is bad"); #endif #ifdef EDEVERR - inscode(d, ds, de, "EDEVERR", EDEVERR, "Device error"); + add_errcode("EDEVERR", EDEVERR, "Device error"); #endif #ifdef EFTYPE - inscode(d, ds, de, "EFTYPE", EFTYPE, "Inappropriate file type or format"); + add_errcode("EFTYPE", EFTYPE, "Inappropriate file type or format"); #endif #ifdef ENEEDAUTH - inscode(d, ds, de, "ENEEDAUTH", ENEEDAUTH, "Need authenticator"); + add_errcode("ENEEDAUTH", ENEEDAUTH, "Need authenticator"); #endif #ifdef ENOATTR - inscode(d, ds, de, "ENOATTR", ENOATTR, "Attribute not found"); + add_errcode("ENOATTR", ENOATTR, "Attribute not found"); #endif #ifdef ENOPOLICY - inscode(d, ds, de, "ENOPOLICY", ENOPOLICY, "Policy not found"); + add_errcode("ENOPOLICY", ENOPOLICY, "Policy not found"); #endif #ifdef EPROCLIM - inscode(d, ds, de, "EPROCLIM", EPROCLIM, "Too many processes"); + add_errcode("EPROCLIM", EPROCLIM, "Too many processes"); #endif #ifdef EPROCUNAVAIL - inscode(d, ds, de, "EPROCUNAVAIL", EPROCUNAVAIL, "Bad procedure for program"); + add_errcode("EPROCUNAVAIL", EPROCUNAVAIL, "Bad procedure for program"); #endif #ifdef EPROGMISMATCH - inscode(d, ds, de, "EPROGMISMATCH", EPROGMISMATCH, "Program version wrong"); + add_errcode("EPROGMISMATCH", EPROGMISMATCH, "Program version wrong"); #endif #ifdef EPROGUNAVAIL - inscode(d, ds, de, "EPROGUNAVAIL", EPROGUNAVAIL, "RPC prog. not avail"); + add_errcode("EPROGUNAVAIL", EPROGUNAVAIL, "RPC prog. not avail"); #endif #ifdef EPWROFF - inscode(d, ds, de, "EPWROFF", EPWROFF, "Device power is off"); + add_errcode("EPWROFF", EPWROFF, "Device power is off"); #endif #ifdef ERPCMISMATCH - inscode(d, ds, de, "ERPCMISMATCH", ERPCMISMATCH, "RPC version wrong"); + add_errcode("ERPCMISMATCH", ERPCMISMATCH, "RPC version wrong"); #endif #ifdef ESHLIBVERS - inscode(d, ds, de, "ESHLIBVERS", ESHLIBVERS, "Shared library version mismatch"); + add_errcode("ESHLIBVERS", ESHLIBVERS, "Shared library version mismatch"); #endif - Py_DECREF(de); - return m; + Py_DECREF(error_dict); + return 0; +} + +static PyModuleDef_Slot errno_slots[] = { + {Py_mod_exec, errno_exec}, + {0, NULL} +}; + +PyDoc_STRVAR(errno__doc__, +"This module makes available standard errno system symbols.\n\ +\n\ +The value of each symbol is the corresponding integer value,\n\ +e.g., on most systems, errno.ENOENT equals the integer 2.\n\ +\n\ +The dictionary errno.errorcode maps numeric codes to symbol names,\n\ +e.g., errno.errorcode[2] could be the string 'ENOENT'.\n\ +\n\ +Symbols that are not relevant to the underlying system are not defined.\n\ +\n\ +To map error codes to error messages, use the function os.strerror(),\n\ +e.g. os.strerror(2) could return 'No such file or directory'."); + +static struct PyModuleDef errnomodule = { + PyModuleDef_HEAD_INIT, + .m_name = "errno", + .m_doc = errno__doc__, + .m_size = 0, + .m_methods = errno_methods, + .m_slots = errno_slots, +}; + +PyMODINIT_FUNC +PyInit_errno(void) +{ + return PyModuleDef_Init(&errnomodule); } diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 230cde49..e7a28503 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1,7 +1,6 @@ #include "Python.h" #include "pycore_initconfig.h" #include "pycore_traceback.h" -#include "pythread.h" #include #include #include @@ -19,8 +18,6 @@ /* Allocate at maximum 100 MiB of the stack to raise the stack overflow */ #define STACK_OVERFLOW_MAX_SIZE (100 * 1024 * 1024) -#define FAULTHANDLER_LATER - #ifndef MS_WINDOWS /* register() is useless on Windows, because only SIGSEGV, SIGABRT and SIGILL can be handled by the process, and these signals can only be used @@ -60,7 +57,6 @@ static struct { #endif } fatal_error = {0, NULL, -1, 0}; -#ifdef FAULTHANDLER_LATER static struct { PyObject *file; int fd; @@ -77,7 +73,6 @@ static struct { /* released by child thread when joined */ PyThread_type_lock running; } thread; -#endif #ifdef FAULTHANDLER_USER typedef struct { @@ -125,7 +120,13 @@ static fault_handler_t faulthandler_handlers[] = { static const size_t faulthandler_nsignals = \ Py_ARRAY_LENGTH(faulthandler_handlers); -#ifdef HAVE_SIGALTSTACK +/* Using an alternative stack requires sigaltstack() + and sigaction() SA_ONSTACK */ +#if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION) +# define FAULTHANDLER_USE_ALT_STACK +#endif + +#ifdef FAULTHANDLER_USE_ALT_STACK static stack_t stack; static stack_t old_stack; #endif @@ -172,7 +173,7 @@ faulthandler_get_fileno(PyObject **file_ptr) return fd; } - result = _PyObject_CallMethodId(file, &PyId_fileno, NULL); + result = _PyObject_CallMethodIdNoArgs(file, &PyId_fileno); if (result == NULL) return -1; @@ -190,7 +191,7 @@ faulthandler_get_fileno(PyObject **file_ptr) return -1; } - result = _PyObject_CallMethodId(file, &PyId_flush, NULL); + result = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); if (result != NULL) Py_DECREF(result); else { @@ -427,6 +428,36 @@ faulthandler_exc_handler(struct _EXCEPTION_POINTERS *exc_info) } #endif + +#ifdef FAULTHANDLER_USE_ALT_STACK +static int +faulthandler_allocate_stack(void) +{ + if (stack.ss_sp != NULL) { + return 0; + } + /* Allocate an alternate stack for faulthandler() signal handler + to be able to execute a signal handler on a stack overflow error */ + stack.ss_sp = PyMem_Malloc(stack.ss_size); + if (stack.ss_sp == NULL) { + PyErr_NoMemory(); + return -1; + } + + int err = sigaltstack(&stack, &old_stack); + if (err) { + /* Release the stack to retry sigaltstack() next time */ + PyMem_Free(stack.ss_sp); + stack.ss_sp = NULL; + + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + return 0; +} +#endif + + /* Install the handler for fatal signals, faulthandler_fatal_error(). */ static int @@ -437,32 +468,35 @@ faulthandler_enable(void) } fatal_error.enabled = 1; +#ifdef FAULTHANDLER_USE_ALT_STACK + if (faulthandler_allocate_stack() < 0) { + return -1; + } +#endif + for (size_t i=0; i < faulthandler_nsignals; i++) { fault_handler_t *handler; -#ifdef HAVE_SIGACTION - struct sigaction action; -#endif int err; handler = &faulthandler_handlers[i]; assert(!handler->enabled); #ifdef HAVE_SIGACTION + struct sigaction action; action.sa_handler = faulthandler_fatal_error; sigemptyset(&action.sa_mask); /* Do not prevent the signal from being received from within its own signal handler */ action.sa_flags = SA_NODEFER; -#ifdef HAVE_SIGALTSTACK - if (stack.ss_sp != NULL) { - /* Call the signal handler on an alternate signal stack - provided by sigaltstack() */ - action.sa_flags |= SA_ONSTACK; - } +#ifdef FAULTHANDLER_USE_ALT_STACK + assert(stack.ss_sp != NULL); + /* Call the signal handler on an alternate signal stack + provided by sigaltstack() */ + action.sa_flags |= SA_ONSTACK; #endif err = sigaction(handler->signum, &action, &handler->previous); #else handler->previous = signal(handler->signum, - faulthandler_fatal_error); + faulthandler_fatal_error); err = (handler->previous == SIG_ERR); #endif if (err) { @@ -505,7 +539,7 @@ faulthandler_py_enable(PyObject *self, PyObject *args, PyObject *kwargs) Py_XSETREF(fatal_error.file, file); fatal_error.fd = fd; fatal_error.all_threads = all_threads; - fatal_error.interp = tstate->interp; + fatal_error.interp = PyThreadState_GetInterpreter(tstate); if (faulthandler_enable() < 0) { return NULL; @@ -550,8 +584,6 @@ faulthandler_is_enabled(PyObject *self, PyObject *Py_UNUSED(ignored)) return PyBool_FromLong(fatal_error.enabled); } -#ifdef FAULTHANDLER_LATER - static void faulthandler_thread(void *unused) { @@ -592,6 +624,11 @@ faulthandler_thread(void *unused) static void cancel_dump_traceback_later(void) { + /* If not scheduled, nothing to cancel */ + if (!thread.cancel_event) { + return; + } + /* Notify cancellation */ PyThread_release_lock(thread.cancel_event); @@ -676,17 +713,37 @@ faulthandler_dump_traceback_later(PyObject *self, } tstate = get_thread_state(); - if (tstate == NULL) + if (tstate == NULL) { return NULL; + } fd = faulthandler_get_fileno(&file); - if (fd < 0) + if (fd < 0) { return NULL; + } + + if (!thread.running) { + thread.running = PyThread_allocate_lock(); + if (!thread.running) { + return PyErr_NoMemory(); + } + } + if (!thread.cancel_event) { + thread.cancel_event = PyThread_allocate_lock(); + if (!thread.cancel_event || !thread.running) { + return PyErr_NoMemory(); + } + + /* cancel_event starts to be acquired: it's only released to cancel + the thread. */ + PyThread_acquire_lock(thread.cancel_event, 1); + } /* format the timeout */ header = format_timeout(timeout_us); - if (header == NULL) + if (header == NULL) { return PyErr_NoMemory(); + } header_len = strlen(header); /* Cancel previous thread, if running */ @@ -698,7 +755,7 @@ faulthandler_dump_traceback_later(PyObject *self, /* the downcast is safe: we check that 0 < timeout_us < PY_TIMEOUT_MAX */ thread.timeout_us = (PY_TIMEOUT_T)timeout_us; thread.repeat = repeat; - thread.interp = tstate->interp; + thread.interp = PyThreadState_GetInterpreter(tstate); thread.exit = exit; thread.header = header; thread.header_len = header_len; @@ -726,11 +783,11 @@ faulthandler_cancel_dump_traceback_later_py(PyObject *self, cancel_dump_traceback_later(); Py_RETURN_NONE; } -#endif /* FAULTHANDLER_LATER */ + #ifdef FAULTHANDLER_USER static int -faulthandler_register(int signum, int chain, _Py_sighandler_t *p_previous) +faulthandler_register(int signum, int chain, _Py_sighandler_t *previous_p) { #ifdef HAVE_SIGACTION struct sigaction action; @@ -745,19 +802,19 @@ faulthandler_register(int signum, int chain, _Py_sighandler_t *p_previous) own signal handler */ action.sa_flags = SA_NODEFER; } -#ifdef HAVE_SIGALTSTACK - if (stack.ss_sp != NULL) { - /* Call the signal handler on an alternate signal stack - provided by sigaltstack() */ - action.sa_flags |= SA_ONSTACK; - } +#ifdef FAULTHANDLER_USE_ALT_STACK + assert(stack.ss_sp != NULL); + /* Call the signal handler on an alternate signal stack + provided by sigaltstack() */ + action.sa_flags |= SA_ONSTACK; #endif - return sigaction(signum, &action, p_previous); + return sigaction(signum, &action, previous_p); #else _Py_sighandler_t previous; previous = signal(signum, faulthandler_user); - if (p_previous != NULL) - *p_previous = previous; + if (previous_p != NULL) { + *previous_p = previous; + } return (previous == SIG_ERR); #endif } @@ -853,14 +910,19 @@ faulthandler_register_py(PyObject *self, return NULL; if (user_signals == NULL) { - user_signals = PyMem_Malloc(NSIG * sizeof(user_signal_t)); + user_signals = PyMem_Calloc(NSIG, sizeof(user_signal_t)); if (user_signals == NULL) return PyErr_NoMemory(); - memset(user_signals, 0, NSIG * sizeof(user_signal_t)); } user = &user_signals[signum]; if (!user->enabled) { +#ifdef FAULTHANDLER_USE_ALT_STACK + if (faulthandler_allocate_stack() < 0) { + return NULL; + } +#endif + err = faulthandler_register(signum, chain, &previous); if (err) { PyErr_SetFromErrno(PyExc_OSError); @@ -875,7 +937,7 @@ faulthandler_register_py(PyObject *self, user->fd = fd; user->all_threads = all_threads; user->chain = chain; - user->interp = tstate->interp; + user->interp = PyThreadState_GetInterpreter(tstate); user->enabled = 1; Py_RETURN_NONE; @@ -1001,24 +1063,10 @@ faulthandler_sigsegv(PyObject *self, PyObject *args) Py_RETURN_NONE; } -static void +static void _Py_NO_RETURN faulthandler_fatal_error_thread(void *plock) { -#ifndef __clang__ - PyThread_type_lock *lock = (PyThread_type_lock *)plock; -#endif - Py_FatalError("in new thread"); - -#ifndef __clang__ - /* Issue #28152: Py_FatalError() is declared with - __attribute__((__noreturn__)). GCC emits a warning without - "PyThread_release_lock()" (compiler bug?), but Clang is smarter and - emits a warning on the return. */ - - /* notify the caller that we are done */ - PyThread_release_lock(lock); -#endif } static PyObject * @@ -1094,7 +1142,7 @@ faulthandler_fatal_error_py(PyObject *self, PyObject *args) Py_RETURN_NONE; } -#if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION) +#if defined(FAULTHANDLER_USE_ALT_STACK) #define FAULTHANDLER_STACK_OVERFLOW static uintptr_t @@ -1149,15 +1197,13 @@ faulthandler_stack_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) size, depth); return NULL; } -#endif /* defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION) */ +#endif /* defined(FAULTHANDLER_USE_ALT_STACK) && defined(HAVE_SIGACTION) */ static int faulthandler_traverse(PyObject *module, visitproc visit, void *arg) { -#ifdef FAULTHANDLER_LATER Py_VISIT(thread.file); -#endif #ifdef FAULTHANDLER_USER if (user_signals != NULL) { for (size_t signum=0; signum < NSIG; signum++) @@ -1198,7 +1244,6 @@ static PyMethodDef module_methods[] = { PyDoc_STR("dump_traceback(file=sys.stderr, all_threads=True): " "dump the traceback of the current thread, or of all threads " "if all_threads is True, into file")}, -#ifdef FAULTHANDLER_LATER {"dump_traceback_later", (PyCFunction)(void(*)(void))faulthandler_dump_traceback_later, METH_VARARGS|METH_KEYWORDS, PyDoc_STR("dump_traceback_later(timeout, repeat=False, file=sys.stderrn, exit=False):\n" @@ -1209,8 +1254,6 @@ static PyMethodDef module_methods[] = { faulthandler_cancel_dump_traceback_later_py, METH_NOARGS, PyDoc_STR("cancel_dump_traceback_later():\ncancel the previous call " "to dump_traceback_later().")}, -#endif - #ifdef FAULTHANDLER_USER {"register", (PyCFunction)(void(*)(void))faulthandler_register_py, METH_VARARGS|METH_KEYWORDS, @@ -1223,7 +1266,6 @@ static PyMethodDef module_methods[] = { PyDoc_STR("unregister(signum): unregister the handler of the signal " "'signum' registered by register()")}, #endif - {"_read_null", faulthandler_read_null, METH_NOARGS, PyDoc_STR("_read_null(): read from NULL, raise " "a SIGSEGV or SIGBUS signal depending on the platform")}, @@ -1312,7 +1354,7 @@ faulthandler_init_enable(void) return -1; } - PyObject *res = _PyObject_CallMethodId(module, &PyId_enable, NULL); + PyObject *res = _PyObject_CallMethodIdNoArgs(module, &PyId_enable); Py_DECREF(module); if (res == NULL) { return -1; @@ -1325,37 +1367,18 @@ faulthandler_init_enable(void) PyStatus _PyFaulthandler_Init(int enable) { -#ifdef HAVE_SIGALTSTACK - int err; - - /* Try to allocate an alternate stack for faulthandler() signal handler to - * be able to allocate memory on the stack, even on a stack overflow. If it - * fails, ignore the error. */ +#ifdef FAULTHANDLER_USE_ALT_STACK + memset(&stack, 0, sizeof(stack)); stack.ss_flags = 0; /* bpo-21131: allocate dedicated stack of SIGSTKSZ*2 bytes, instead of just SIGSTKSZ bytes. Calling the previous signal handler in faulthandler signal handler uses more than SIGSTKSZ bytes of stack memory on some platforms. */ stack.ss_size = SIGSTKSZ * 2; - stack.ss_sp = PyMem_Malloc(stack.ss_size); - if (stack.ss_sp != NULL) { - err = sigaltstack(&stack, &old_stack); - if (err) { - PyMem_Free(stack.ss_sp); - stack.ss_sp = NULL; - } - } -#endif -#ifdef FAULTHANDLER_LATER - thread.file = NULL; - thread.cancel_event = PyThread_allocate_lock(); - thread.running = PyThread_allocate_lock(); - if (!thread.cancel_event || !thread.running) { - return _PyStatus_ERR("failed to allocate locks for faulthandler"); - } - PyThread_acquire_lock(thread.cancel_event, 1); #endif + memset(&thread, 0, sizeof(thread)); + if (enable) { if (faulthandler_init_enable() < 0) { return _PyStatus_ERR("failed to enable faulthandler"); @@ -1366,7 +1389,6 @@ _PyFaulthandler_Init(int enable) void _PyFaulthandler_Fini(void) { -#ifdef FAULTHANDLER_LATER /* later */ if (thread.cancel_event) { cancel_dump_traceback_later(); @@ -1378,7 +1400,6 @@ void _PyFaulthandler_Fini(void) PyThread_free_lock(thread.running); thread.running = NULL; } -#endif #ifdef FAULTHANDLER_USER /* user */ @@ -1393,7 +1414,8 @@ void _PyFaulthandler_Fini(void) /* fatal */ faulthandler_disable(); -#ifdef HAVE_SIGALTSTACK + +#ifdef FAULTHANDLER_USE_ALT_STACK if (stack.ss_sp != NULL) { /* Fetch the current alt stack */ stack_t current_stack; diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index a7d21930..43f9b22f 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -513,12 +513,24 @@ all_ins(PyObject* m) #ifdef F_SETLKW if (PyModule_AddIntMacro(m, F_SETLKW)) return -1; #endif +#ifdef F_OFD_GETLK + if (PyModule_AddIntMacro(m, F_OFD_GETLK)) return -1; +#endif +#ifdef F_OFD_SETLK + if (PyModule_AddIntMacro(m, F_OFD_SETLK)) return -1; +#endif +#ifdef F_OFD_SETLKW + if (PyModule_AddIntMacro(m, F_OFD_SETLKW)) return -1; +#endif #ifdef F_GETOWN if (PyModule_AddIntMacro(m, F_GETOWN)) return -1; #endif #ifdef F_SETOWN if (PyModule_AddIntMacro(m, F_SETOWN)) return -1; #endif +#ifdef F_GETPATH + if (PyModule_AddIntMacro(m, F_GETPATH)) return -1; +#endif #ifdef F_GETSIG if (PyModule_AddIntMacro(m, F_GETSIG)) return -1; #endif @@ -674,8 +686,10 @@ PyInit_fcntl(void) return NULL; /* Add some symbolic constants to the module */ - if (all_ins(m) < 0) + if (all_ins(m) < 0) { + Py_DECREF(m); return NULL; + } return m; } diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 5a6a81d8..56dcb101 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -25,19 +25,25 @@ #include "Python.h" #include "pycore_context.h" +#include "pycore_initconfig.h" +#include "pycore_interp.h" // PyInterpreterState.gc #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "frameobject.h" /* for PyFrame_ClearFreeList */ +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pydtrace.h" -#include "pytime.h" /* for _PyTime_GetMonotonicClock() */ +#include "pytime.h" // _PyTime_GetMonotonicClock() + +typedef struct _gc_runtime_state GCState; /*[clinic input] module gc [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=b5c9690ecc842d79]*/ -#define GC_DEBUG (0) /* Enable more asserts */ + +#ifdef Py_DEBUG +# define GC_DEBUG +#endif #define GC_NEXT _PyGCHead_NEXT #define GC_PREV _PyGCHead_PREV @@ -111,9 +117,6 @@ gc_decref(PyGC_Head *g) g->_gc_prev -= 1 << _PyGC_PREV_SHIFT; } -/* Python string to use if unhandled exception occurs */ -static PyObject *gc_str = NULL; - /* set for debugging information */ #define DEBUG_STATS (1<<0) /* print collection statistics */ #define DEBUG_COLLECTABLE (1<<1) /* print collectable objects */ @@ -123,14 +126,14 @@ static PyObject *gc_str = NULL; DEBUG_UNCOLLECTABLE | \ DEBUG_SAVEALL -#define GEN_HEAD(state, n) (&(state)->generations[n].head) +#define GEN_HEAD(gcstate, n) (&(gcstate)->generations[n].head) void -_PyGC_Initialize(struct _gc_runtime_state *state) +_PyGC_InitState(GCState *gcstate) { - state->enabled = 1; /* automatic collection enabled? */ + gcstate->enabled = 1; /* automatic collection enabled? */ -#define _GEN_HEAD(n) GEN_HEAD(state, n) +#define _GEN_HEAD(n) GEN_HEAD(gcstate, n) struct gc_generation generations[NUM_GENERATIONS] = { /* PyGC_Head, threshold, count */ {{(uintptr_t)_GEN_HEAD(0), (uintptr_t)_GEN_HEAD(0)}, 700, 0}, @@ -138,16 +141,31 @@ _PyGC_Initialize(struct _gc_runtime_state *state) {{(uintptr_t)_GEN_HEAD(2), (uintptr_t)_GEN_HEAD(2)}, 10, 0}, }; for (int i = 0; i < NUM_GENERATIONS; i++) { - state->generations[i] = generations[i]; + gcstate->generations[i] = generations[i]; }; - state->generation0 = GEN_HEAD(state, 0); + gcstate->generation0 = GEN_HEAD(gcstate, 0); struct gc_generation permanent_generation = { - {(uintptr_t)&state->permanent_generation.head, - (uintptr_t)&state->permanent_generation.head}, 0, 0 + {(uintptr_t)&gcstate->permanent_generation.head, + (uintptr_t)&gcstate->permanent_generation.head}, 0, 0 }; - state->permanent_generation = permanent_generation; + gcstate->permanent_generation = permanent_generation; } + +PyStatus +_PyGC_Init(PyThreadState *tstate) +{ + GCState *gcstate = &tstate->interp->gc; + if (gcstate->garbage == NULL) { + gcstate->garbage = PyList_New(0); + if (gcstate->garbage == NULL) { + return _PyStatus_NO_MEMORY(); + } + } + return _PyStatus_OK(); +} + + /* _gc_prev values --------------- @@ -298,8 +316,18 @@ gc_list_size(PyGC_Head *list) return n; } +/* Walk the list and mark all objects as non-collecting */ +static inline void +gc_list_clear_collecting(PyGC_Head *collectable) +{ + PyGC_Head *gc; + for (gc = GC_NEXT(collectable); gc != collectable; gc = GC_NEXT(gc)) { + gc_clear_collecting(gc); + } +} + /* Append objects in a GC list to a Python list. - * Return 0 if all OK, < 0 if error (out of memory for list). + * Return 0 if all OK, < 0 if error (out of memory for list) */ static int append_objects(PyObject *py_list, PyGC_Head *gc_list) @@ -316,25 +344,60 @@ append_objects(PyObject *py_list, PyGC_Head *gc_list) return 0; } -#if GC_DEBUG +// Constants for validate_list's flags argument. +enum flagstates {collecting_clear_unreachable_clear, + collecting_clear_unreachable_set, + collecting_set_unreachable_clear, + collecting_set_unreachable_set}; + +#ifdef GC_DEBUG // validate_list checks list consistency. And it works as document -// describing when expected_mask is set / unset. +// describing when flags are expected to be set / unset. +// `head` must be a doubly-linked gc list, although it's fine (expected!) if +// the prev and next pointers are "polluted" with flags. +// What's checked: +// - The `head` pointers are not polluted. +// - The objects' PREV_MASK_COLLECTING and NEXT_MASK_UNREACHABLE flags are all +// `set or clear, as specified by the 'flags' argument. +// - The prev and next pointers are mutually consistent. static void -validate_list(PyGC_Head *head, uintptr_t expected_mask) +validate_list(PyGC_Head *head, enum flagstates flags) { + assert((head->_gc_prev & PREV_MASK_COLLECTING) == 0); + assert((head->_gc_next & NEXT_MASK_UNREACHABLE) == 0); + uintptr_t prev_value = 0, next_value = 0; + switch (flags) { + case collecting_clear_unreachable_clear: + break; + case collecting_set_unreachable_clear: + prev_value = PREV_MASK_COLLECTING; + break; + case collecting_clear_unreachable_set: + next_value = NEXT_MASK_UNREACHABLE; + break; + case collecting_set_unreachable_set: + prev_value = PREV_MASK_COLLECTING; + next_value = NEXT_MASK_UNREACHABLE; + break; + default: + assert(! "bad internal flags argument"); + } PyGC_Head *prev = head; PyGC_Head *gc = GC_NEXT(head); while (gc != head) { - assert(GC_NEXT(gc) != NULL); - assert(GC_PREV(gc) == prev); - assert((gc->_gc_prev & PREV_MASK_COLLECTING) == expected_mask); + PyGC_Head *trueprev = GC_PREV(gc); + PyGC_Head *truenext = (PyGC_Head *)(gc->_gc_next & ~NEXT_MASK_UNREACHABLE); + assert(truenext != NULL); + assert(trueprev == prev); + assert((gc->_gc_prev & PREV_MASK_COLLECTING) == prev_value); + assert((gc->_gc_next & NEXT_MASK_UNREACHABLE) == next_value); prev = gc; - gc = GC_NEXT(gc); + gc = truenext; } assert(prev == GC_PREV(head)); } #else -#define validate_list(x,y) do{}while(0) +#define validate_list(x, y) do{}while(0) #endif /*** end of list stuff ***/ @@ -377,7 +440,7 @@ visit_decref(PyObject *op, void *parent) { _PyObject_ASSERT(_PyObject_CAST(parent), !_PyObject_IsFreed(op)); - if (PyObject_IS_GC(op)) { + if (_PyObject_IS_GC(op)) { PyGC_Head *gc = AS_GC(op); /* We're only interested in gc_refs for objects in the * generation being collected, which can be recognized @@ -413,17 +476,23 @@ subtract_refs(PyGC_Head *containers) static int visit_reachable(PyObject *op, PyGC_Head *reachable) { - if (!PyObject_IS_GC(op)) { + if (!_PyObject_IS_GC(op)) { return 0; } PyGC_Head *gc = AS_GC(op); const Py_ssize_t gc_refs = gc_get_refs(gc); - // Ignore untracked objects and objects in other generation. - if (gc->_gc_next == 0 || !gc_is_collecting(gc)) { + // Ignore objects in other generation. + // This also skips objects "to the left" of the current position in + // move_unreachable's scan of the 'young' list - they've already been + // traversed, and no longer have the PREV_MASK_COLLECTING flag. + if (! gc_is_collecting(gc)) { return 0; } + // It would be a logic error elsewhere if the collecting flag were set on + // an untracked object. + assert(gc->_gc_next != 0); if (gc->_gc_next & NEXT_MASK_UNREACHABLE) { /* This had gc_refs = 0 when move_unreachable got @@ -432,7 +501,8 @@ visit_reachable(PyObject *op, PyGC_Head *reachable) * and move_unreachable will eventually get to it * again. */ - // Manually unlink gc from unreachable list because + // Manually unlink gc from unreachable list because the list functions + // don't work right in the presence of NEXT_MASK_UNREACHABLE flags. PyGC_Head *prev = GC_PREV(gc); PyGC_Head *next = (PyGC_Head*)(gc->_gc_next & ~NEXT_MASK_UNREACHABLE); _PyObject_ASSERT(FROM_GC(prev), @@ -533,8 +603,9 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) PyGC_Head *last = GC_PREV(unreachable); // NOTE: Since all objects in unreachable set has // NEXT_MASK_UNREACHABLE flag, we set it unconditionally. - // But this may set the flat to unreachable too. - // move_legacy_finalizers() should care about it. + // But this may pollute the unreachable list head's 'next' pointer + // too. That's semantically senseless but expedient here - the + // damage is repaired when this function ends. last->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)gc); _PyGCHead_SET_PREV(gc, last); gc->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)unreachable); @@ -544,6 +615,8 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) } // young->_gc_prev must be last element remained in the list. young->_gc_prev = (uintptr_t)prev; + // don't let the pollution of the list head's next pointer leak + unreachable->_gc_next &= ~NEXT_MASK_UNREACHABLE; } static void @@ -579,7 +652,7 @@ untrack_dicts(PyGC_Head *head) static int has_legacy_finalizer(PyObject *op) { - return op->ob_type->tp_del != NULL; + return Py_TYPE(op)->tp_del != NULL; } /* Move the objects in unreachable with tp_del slots into `finalizers`. @@ -591,7 +664,7 @@ static void move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers) { PyGC_Head *gc, *next; - unreachable->_gc_next &= ~NEXT_MASK_UNREACHABLE; + assert((unreachable->_gc_next & NEXT_MASK_UNREACHABLE) == 0); /* March over unreachable. Move objects with finalizers into * `finalizers`. @@ -610,11 +683,27 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers) } } +static inline void +clear_unreachable_mask(PyGC_Head *unreachable) +{ + /* Check that the list head does not have the unreachable bit set */ + assert(((uintptr_t)unreachable & NEXT_MASK_UNREACHABLE) == 0); + + PyGC_Head *gc, *next; + assert((unreachable->_gc_next & NEXT_MASK_UNREACHABLE) == 0); + for (gc = GC_NEXT(unreachable); gc != unreachable; gc = next) { + _PyObject_ASSERT((PyObject*)FROM_GC(gc), gc->_gc_next & NEXT_MASK_UNREACHABLE); + gc->_gc_next &= ~NEXT_MASK_UNREACHABLE; + next = (PyGC_Head*)gc->_gc_next; + } + validate_list(unreachable, collecting_set_unreachable_clear); +} + /* A traversal callback for move_legacy_finalizer_reachable. */ static int visit_move(PyObject *op, PyGC_Head *tolist) { - if (PyObject_IS_GC(op)) { + if (_PyObject_IS_GC(op)) { PyGC_Head *gc = AS_GC(op); if (gc_is_collecting(gc)) { gc_list_move(gc, tolist); @@ -698,7 +787,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) /* It supports weakrefs. Does it have any? */ wrlist = (PyWeakReference **) - PyObject_GET_WEAKREFS_LISTPTR(op); + _PyObject_GET_WEAKREFS_LISTPTR(op); /* `op` may have some weakrefs. March over the list, clear * all the weakrefs, and move the weakrefs with callbacks @@ -782,7 +871,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) _PyObject_ASSERT(op, callback != NULL); /* copy-paste of weakrefobject.c's handle_callback() */ - temp = PyObject_CallFunctionObjArgs(callback, wr, NULL); + temp = PyObject_CallOneArg(callback, (PyObject *)wr); if (temp == NULL) PyErr_WriteUnraisable(callback); else @@ -827,23 +916,20 @@ debug_cycle(const char *msg, PyObject *op) * merged into the old list regardless. */ static void -handle_legacy_finalizers(struct _gc_runtime_state *state, +handle_legacy_finalizers(PyThreadState *tstate, + GCState *gcstate, PyGC_Head *finalizers, PyGC_Head *old) { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); + assert(gcstate->garbage != NULL); PyGC_Head *gc = GC_NEXT(finalizers); - if (state->garbage == NULL) { - state->garbage = PyList_New(0); - if (state->garbage == NULL) - Py_FatalError("gc couldn't create gc.garbage list"); - } for (; gc != finalizers; gc = GC_NEXT(gc)) { PyObject *op = FROM_GC(gc); - if ((state->debug & DEBUG_SAVEALL) || has_legacy_finalizer(op)) { - if (PyList_Append(state->garbage, op) < 0) { - PyErr_Clear(); + if ((gcstate->debug & DEBUG_SAVEALL) || has_legacy_finalizer(op)) { + if (PyList_Append(gcstate->garbage, op) < 0) { + _PyErr_Clear(tstate); break; } } @@ -857,7 +943,7 @@ handle_legacy_finalizers(struct _gc_runtime_state *state, * list, due to refcounts falling to 0. */ static void -finalize_garbage(PyGC_Head *collectable) +finalize_garbage(PyThreadState *tstate, PyGC_Head *collectable) { destructor finalize; PyGC_Head seen; @@ -881,52 +967,22 @@ finalize_garbage(PyGC_Head *collectable) _PyGCHead_SET_FINALIZED(gc); Py_INCREF(op); finalize(op); - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); Py_DECREF(op); } } gc_list_merge(&seen, collectable); } -/* Walk the collectable list and check that they are really unreachable - from the outside (some objects could have been resurrected by a - finalizer). */ -static int -check_garbage(PyGC_Head *collectable) -{ - int ret = 0; - PyGC_Head *gc; - for (gc = GC_NEXT(collectable); gc != collectable; gc = GC_NEXT(gc)) { - // Use gc_refs and break gc_prev again. - gc_set_refs(gc, Py_REFCNT(FROM_GC(gc))); - _PyObject_ASSERT(FROM_GC(gc), gc_get_refs(gc) != 0); - } - subtract_refs(collectable); - PyGC_Head *prev = collectable; - for (gc = GC_NEXT(collectable); gc != collectable; gc = GC_NEXT(gc)) { - _PyObject_ASSERT_WITH_MSG(FROM_GC(gc), - gc_get_refs(gc) >= 0, - "refcount is too small"); - if (gc_get_refs(gc) != 0) { - ret = -1; - } - // Restore gc_prev here. - _PyGCHead_SET_PREV(gc, prev); - gc_clear_collecting(gc); - prev = gc; - } - return ret; -} - /* Break reference cycles by clearing the containers involved. This is * tricky business as the lists can be changing and we don't know which * objects may be freed. It is possible I screwed something up here. */ static void -delete_garbage(struct _gc_runtime_state *state, +delete_garbage(PyThreadState *tstate, GCState *gcstate, PyGC_Head *collectable, PyGC_Head *old) { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); while (!gc_list_is_empty(collectable)) { PyGC_Head *gc = GC_NEXT(collectable); @@ -935,10 +991,10 @@ delete_garbage(struct _gc_runtime_state *state, _PyObject_ASSERT_WITH_MSG(op, Py_REFCNT(op) > 0, "refcount is too small"); - if (state->debug & DEBUG_SAVEALL) { - assert(state->garbage != NULL); - if (PyList_Append(state->garbage, op) < 0) { - PyErr_Clear(); + if (gcstate->debug & DEBUG_SAVEALL) { + assert(gcstate->garbage != NULL); + if (PyList_Append(gcstate->garbage, op) < 0) { + _PyErr_Clear(tstate); } } else { @@ -946,7 +1002,7 @@ delete_garbage(struct _gc_runtime_state *state, if ((clear = Py_TYPE(op)->tp_clear) != NULL) { Py_INCREF(op); (void) clear(op); - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { _PyErr_WriteUnraisableMsg("in tp_clear of", (PyObject*)Py_TYPE(op)); } @@ -955,6 +1011,7 @@ delete_garbage(struct _gc_runtime_state *state, } if (GC_NEXT(collectable) == gc) { /* object is still alive, move it, it may die later */ + gc_clear_collecting(gc); gc_list_move(gc, old); } } @@ -968,22 +1025,18 @@ delete_garbage(struct _gc_runtime_state *state, static void clear_freelists(void) { - (void)PyMethod_ClearFreeList(); - (void)PyFrame_ClearFreeList(); - (void)PyCFunction_ClearFreeList(); - (void)PyTuple_ClearFreeList(); - (void)PyUnicode_ClearFreeList(); - (void)PyFloat_ClearFreeList(); - (void)PyList_ClearFreeList(); - (void)PyDict_ClearFreeList(); - (void)PySet_ClearFreeList(); - (void)PyAsyncGen_ClearFreeLists(); - (void)PyContext_ClearFreeList(); + _PyFrame_ClearFreeList(); + _PyTuple_ClearFreeList(); + _PyFloat_ClearFreeList(); + _PyList_ClearFreeList(); + _PyDict_ClearFreeList(); + _PyAsyncGen_ClearFreeLists(); + _PyContext_ClearFreeList(); } -// Show stats for objects in each gennerations. +// Show stats for objects in each generations static void -show_stats_each_generations(struct _gc_runtime_state *state) +show_stats_each_generations(GCState *gcstate) { char buf[100]; size_t pos = 0; @@ -991,19 +1044,130 @@ show_stats_each_generations(struct _gc_runtime_state *state) for (int i = 0; i < NUM_GENERATIONS && pos < sizeof(buf); i++) { pos += PyOS_snprintf(buf+pos, sizeof(buf)-pos, " %"PY_FORMAT_SIZE_T"d", - gc_list_size(GEN_HEAD(state, i))); + gc_list_size(GEN_HEAD(gcstate, i))); } PySys_FormatStderr( "gc: objects in each generation:%s\n" "gc: objects in permanent generation: %zd\n", - buf, gc_list_size(&state->permanent_generation.head)); + buf, gc_list_size(&gcstate->permanent_generation.head)); +} + +/* Deduce which objects among "base" are unreachable from outside the list + and move them to 'unreachable'. The process consist in the following steps: + +1. Copy all reference counts to a different field (gc_prev is used to hold + this copy to save memory). +2. Traverse all objects in "base" and visit all referred objects using + "tp_traverse" and for every visited object, subtract 1 to the reference + count (the one that we copied in the previous step). After this step, all + objects that can be reached directly from outside must have strictly positive + reference count, while all unreachable objects must have a count of exactly 0. +3. Identify all unreachable objects (the ones with 0 reference count) and move + them to the "unreachable" list. This step also needs to move back to "base" all + objects that were initially marked as unreachable but are referred transitively + by the reachable objects (the ones with strictly positive reference count). + +Contracts: + + * The "base" has to be a valid list with no mask set. + + * The "unreachable" list must be uninitialized (this function calls + gc_list_init over 'unreachable'). + +IMPORTANT: This function leaves 'unreachable' with the NEXT_MASK_UNREACHABLE +flag set but it does not clear it to skip unnecessary iteration. Before the +flag is cleared (for example, by using 'clear_unreachable_mask' function or +by a call to 'move_legacy_finalizers'), the 'unreachable' list is not a normal +list and we can not use most gc_list_* functions for it. */ +static inline void +deduce_unreachable(PyGC_Head *base, PyGC_Head *unreachable) { + validate_list(base, collecting_clear_unreachable_clear); + /* Using ob_refcnt and gc_refs, calculate which objects in the + * container set are reachable from outside the set (i.e., have a + * refcount greater than 0 when all the references within the + * set are taken into account). + */ + update_refs(base); // gc_prev is used for gc_refs + subtract_refs(base); + + /* Leave everything reachable from outside base in base, and move + * everything else (in base) to unreachable. + * + * NOTE: This used to move the reachable objects into a reachable + * set instead. But most things usually turn out to be reachable, + * so it's more efficient to move the unreachable things. It "sounds slick" + * to move the unreachable objects, until you think about it - the reason it + * pays isn't actually obvious. + * + * Suppose we create objects A, B, C in that order. They appear in the young + * generation in the same order. If B points to A, and C to B, and C is + * reachable from outside, then the adjusted refcounts will be 0, 0, and 1 + * respectively. + * + * When move_unreachable finds A, A is moved to the unreachable list. The + * same for B when it's first encountered. Then C is traversed, B is moved + * _back_ to the reachable list. B is eventually traversed, and then A is + * moved back to the reachable list. + * + * So instead of not moving at all, the reachable objects B and A are moved + * twice each. Why is this a win? A straightforward algorithm to move the + * reachable objects instead would move A, B, and C once each. + * + * The key is that this dance leaves the objects in order C, B, A - it's + * reversed from the original order. On all _subsequent_ scans, none of + * them will move. Since most objects aren't in cycles, this can save an + * unbounded number of moves across an unbounded number of later collections. + * It can cost more only the first time the chain is scanned. + * + * Drawback: move_unreachable is also used to find out what's still trash + * after finalizers may resurrect objects. In _that_ case most unreachable + * objects will remain unreachable, so it would be more efficient to move + * the reachable objects instead. But this is a one-time cost, probably not + * worth complicating the code to speed just a little. + */ + gc_list_init(unreachable); + move_unreachable(base, unreachable); // gc_prev is pointer again + validate_list(base, collecting_clear_unreachable_clear); + validate_list(unreachable, collecting_set_unreachable_set); +} + +/* Handle objects that may have resurrected after a call to 'finalize_garbage', moving + them to 'old_generation' and placing the rest on 'still_unreachable'. + + Contracts: + * After this function 'unreachable' must not be used anymore and 'still_unreachable' + will contain the objects that did not resurrect. + + * The "still_unreachable" list must be uninitialized (this function calls + gc_list_init over 'still_unreachable'). + +IMPORTANT: After a call to this function, the 'still_unreachable' set will have the +PREV_MARK_COLLECTING set, but the objects in this set are going to be removed so +we can skip the expense of clearing the flag to avoid extra iteration. */ +static inline void +handle_resurrected_objects(PyGC_Head *unreachable, PyGC_Head* still_unreachable, + PyGC_Head *old_generation) +{ + // Remove the PREV_MASK_COLLECTING from unreachable + // to prepare it for a new call to 'deduce_unreachable' + gc_list_clear_collecting(unreachable); + + // After the call to deduce_unreachable, the 'still_unreachable' set will + // have the PREV_MARK_COLLECTING set, but the objects are going to be + // removed so we can skip the expense of clearing the flag. + PyGC_Head* resurrected = unreachable; + deduce_unreachable(resurrected, still_unreachable); + clear_unreachable_mask(still_unreachable); + + // Move the resurrected objects to the old generation for future collection. + gc_list_merge(resurrected, old_generation); } /* This is the main function. Read this to understand how the * collection process works. */ static Py_ssize_t -collect(struct _gc_runtime_state *state, int generation, +collect(PyThreadState *tstate, int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable, int nofail) { int i; @@ -1015,10 +1179,11 @@ collect(struct _gc_runtime_state *state, int generation, PyGC_Head finalizers; /* objects with, & reachable from, __del__ */ PyGC_Head *gc; _PyTime_t t1 = 0; /* initialize to prevent a compiler warning */ + GCState *gcstate = &tstate->interp->gc; - if (state->debug & DEBUG_STATS) { + if (gcstate->debug & DEBUG_STATS) { PySys_WriteStderr("gc: collecting generation %d...\n", generation); - show_stats_each_generations(state); + show_stats_each_generations(gcstate); t1 = _PyTime_GetMonotonicClock(); } @@ -1027,56 +1192,39 @@ collect(struct _gc_runtime_state *state, int generation, /* update collection and allocation counters */ if (generation+1 < NUM_GENERATIONS) - state->generations[generation+1].count += 1; + gcstate->generations[generation+1].count += 1; for (i = 0; i <= generation; i++) - state->generations[i].count = 0; + gcstate->generations[i].count = 0; /* merge younger generations with one we are currently collecting */ for (i = 0; i < generation; i++) { - gc_list_merge(GEN_HEAD(state, i), GEN_HEAD(state, generation)); + gc_list_merge(GEN_HEAD(gcstate, i), GEN_HEAD(gcstate, generation)); } /* handy references */ - young = GEN_HEAD(state, generation); + young = GEN_HEAD(gcstate, generation); if (generation < NUM_GENERATIONS-1) - old = GEN_HEAD(state, generation+1); + old = GEN_HEAD(gcstate, generation+1); else old = young; + validate_list(old, collecting_clear_unreachable_clear); - validate_list(young, 0); - validate_list(old, 0); - /* Using ob_refcnt and gc_refs, calculate which objects in the - * container set are reachable from outside the set (i.e., have a - * refcount greater than 0 when all the references within the - * set are taken into account). - */ - update_refs(young); // gc_prev is used for gc_refs - subtract_refs(young); - - /* Leave everything reachable from outside young in young, and move - * everything else (in young) to unreachable. - * NOTE: This used to move the reachable objects into a reachable - * set instead. But most things usually turn out to be reachable, - * so it's more efficient to move the unreachable things. - */ - gc_list_init(&unreachable); - move_unreachable(young, &unreachable); // gc_prev is pointer again - validate_list(young, 0); + deduce_unreachable(young, &unreachable); untrack_tuples(young); /* Move reachable objects to next generation. */ if (young != old) { if (generation == NUM_GENERATIONS - 2) { - state->long_lived_pending += gc_list_size(young); + gcstate->long_lived_pending += gc_list_size(young); } gc_list_merge(young, old); } else { - /* We only untrack dicts in full collections, to avoid quadratic + /* We only un-track dicts in full collections, to avoid quadratic dict build-up. See issue #14775. */ untrack_dicts(young); - state->long_lived_pending = 0; - state->long_lived_total = gc_list_size(young); + gcstate->long_lived_pending = 0; + gcstate->long_lived_total = gc_list_size(young); } /* All objects in unreachable are trash, but objects reachable from @@ -1092,11 +1240,11 @@ collect(struct _gc_runtime_state *state, int generation, */ move_legacy_finalizer_reachable(&finalizers); - validate_list(&finalizers, 0); - validate_list(&unreachable, PREV_MASK_COLLECTING); + validate_list(&finalizers, collecting_clear_unreachable_clear); + validate_list(&unreachable, collecting_set_unreachable_clear); /* Print debugging information. */ - if (state->debug & DEBUG_COLLECTABLE) { + if (gcstate->debug & DEBUG_COLLECTABLE) { for (gc = GC_NEXT(&unreachable); gc != &unreachable; gc = GC_NEXT(gc)) { debug_cycle("collectable", FROM_GC(gc)); } @@ -1105,32 +1253,33 @@ collect(struct _gc_runtime_state *state, int generation, /* Clear weakrefs and invoke callbacks as necessary. */ m += handle_weakrefs(&unreachable, old); - validate_list(old, 0); - validate_list(&unreachable, PREV_MASK_COLLECTING); + validate_list(old, collecting_clear_unreachable_clear); + validate_list(&unreachable, collecting_set_unreachable_clear); /* Call tp_finalize on objects which have one. */ - finalize_garbage(&unreachable); + finalize_garbage(tstate, &unreachable); - if (check_garbage(&unreachable)) { // clear PREV_MASK_COLLECTING here - gc_list_merge(&unreachable, old); - } - else { - /* Call tp_clear on objects in the unreachable set. This will cause - * the reference cycles to be broken. It may also cause some objects - * in finalizers to be freed. - */ - m += gc_list_size(&unreachable); - delete_garbage(state, &unreachable, old); - } + /* Handle any objects that may have resurrected after the call + * to 'finalize_garbage' and continue the collection with the + * objects that are still unreachable */ + PyGC_Head final_unreachable; + handle_resurrected_objects(&unreachable, &final_unreachable, old); + + /* Call tp_clear on objects in the final_unreachable set. This will cause + * the reference cycles to be broken. It may also cause some objects + * in finalizers to be freed. + */ + m += gc_list_size(&final_unreachable); + delete_garbage(tstate, gcstate, &final_unreachable, old); /* Collect statistics on uncollectable objects found and print * debugging information. */ for (gc = GC_NEXT(&finalizers); gc != &finalizers; gc = GC_NEXT(gc)) { n++; - if (state->debug & DEBUG_UNCOLLECTABLE) + if (gcstate->debug & DEBUG_UNCOLLECTABLE) debug_cycle("uncollectable", FROM_GC(gc)); } - if (state->debug & DEBUG_STATS) { + if (gcstate->debug & DEBUG_STATS) { double d = _PyTime_AsSecondsDouble(_PyTime_GetMonotonicClock() - t1); PySys_WriteStderr( "gc: done, %" PY_FORMAT_SIZE_T "d unreachable, " @@ -1142,8 +1291,8 @@ collect(struct _gc_runtime_state *state, int generation, * reachable list of garbage. The programmer has to deal with * this if they insist on creating this type of structure. */ - handle_legacy_finalizers(state, &finalizers, old); - validate_list(old, 0); + handle_legacy_finalizers(tstate, gcstate, &finalizers, old); + validate_list(old, collecting_clear_unreachable_clear); /* Clear free list only during the collection of the highest * generation */ @@ -1151,15 +1300,12 @@ collect(struct _gc_runtime_state *state, int generation, clear_freelists(); } - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { if (nofail) { - PyErr_Clear(); + _PyErr_Clear(tstate); } else { - if (gc_str == NULL) - gc_str = PyUnicode_FromString("garbage collection"); - PyErr_WriteUnraisable(gc_str); - Py_FatalError("unexpected exception during garbage collection"); + _PyErr_WriteUnraisableMsg("in garbage collection", NULL); } } @@ -1171,38 +1317,39 @@ collect(struct _gc_runtime_state *state, int generation, *n_uncollectable = n; } - struct gc_generation_stats *stats = &state->generation_stats[generation]; + struct gc_generation_stats *stats = &gcstate->generation_stats[generation]; stats->collections++; stats->collected += m; stats->uncollectable += n; if (PyDTrace_GC_DONE_ENABLED()) { - PyDTrace_GC_DONE(n+m); + PyDTrace_GC_DONE(n + m); } - assert(!PyErr_Occurred()); - return n+m; + assert(!_PyErr_Occurred(tstate)); + return n + m; } /* Invoke progress callbacks to notify clients that garbage collection * is starting or stopping */ static void -invoke_gc_callback(struct _gc_runtime_state *state, const char *phase, +invoke_gc_callback(PyThreadState *tstate, const char *phase, int generation, Py_ssize_t collected, Py_ssize_t uncollectable) { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); /* we may get called very early */ - if (state->callbacks == NULL) { + GCState *gcstate = &tstate->interp->gc; + if (gcstate->callbacks == NULL) { return; } /* The local variable cannot be rebound, check it for sanity */ - assert(PyList_CheckExact(state->callbacks)); + assert(PyList_CheckExact(gcstate->callbacks)); PyObject *info = NULL; - if (PyList_GET_SIZE(state->callbacks) != 0) { + if (PyList_GET_SIZE(gcstate->callbacks) != 0) { info = Py_BuildValue("{sisnsn}", "generation", generation, "collected", collected, @@ -1212,8 +1359,8 @@ invoke_gc_callback(struct _gc_runtime_state *state, const char *phase, return; } } - for (Py_ssize_t i=0; icallbacks); i++) { - PyObject *r, *cb = PyList_GET_ITEM(state->callbacks, i); + for (Py_ssize_t i=0; icallbacks); i++) { + PyObject *r, *cb = PyList_GET_ITEM(gcstate->callbacks, i); Py_INCREF(cb); /* make sure cb doesn't go away */ r = PyObject_CallFunction(cb, "sO", phase, info); if (r == NULL) { @@ -1225,41 +1372,74 @@ invoke_gc_callback(struct _gc_runtime_state *state, const char *phase, Py_DECREF(cb); } Py_XDECREF(info); - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); } /* Perform garbage collection of a generation and invoke * progress callbacks. */ static Py_ssize_t -collect_with_callback(struct _gc_runtime_state *state, int generation) +collect_with_callback(PyThreadState *tstate, int generation) { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); Py_ssize_t result, collected, uncollectable; - invoke_gc_callback(state, "start", generation, 0, 0); - result = collect(state, generation, &collected, &uncollectable, 0); - invoke_gc_callback(state, "stop", generation, collected, uncollectable); - assert(!PyErr_Occurred()); + invoke_gc_callback(tstate, "start", generation, 0, 0); + result = collect(tstate, generation, &collected, &uncollectable, 0); + invoke_gc_callback(tstate, "stop", generation, collected, uncollectable); + assert(!_PyErr_Occurred(tstate)); return result; } static Py_ssize_t -collect_generations(struct _gc_runtime_state *state) +collect_generations(PyThreadState *tstate) { + GCState *gcstate = &tstate->interp->gc; /* Find the oldest generation (highest numbered) where the count * exceeds the threshold. Objects in the that generation and * generations younger than it will be collected. */ Py_ssize_t n = 0; for (int i = NUM_GENERATIONS-1; i >= 0; i--) { - if (state->generations[i].count > state->generations[i].threshold) { + if (gcstate->generations[i].count > gcstate->generations[i].threshold) { /* Avoid quadratic performance degradation in number - of tracked objects. See comments at the beginning - of this file, and issue #4074. + of tracked objects (see also issue #4074): + + To limit the cost of garbage collection, there are two strategies; + - make each collection faster, e.g. by scanning fewer objects + - do less collections + This heuristic is about the latter strategy. + + In addition to the various configurable thresholds, we only trigger a + full collection if the ratio + + long_lived_pending / long_lived_total + + is above a given value (hardwired to 25%). + + The reason is that, while "non-full" collections (i.e., collections of + the young and middle generations) will always examine roughly the same + number of objects -- determined by the aforementioned thresholds --, + the cost of a full collection is proportional to the total number of + long-lived objects, which is virtually unbounded. + + Indeed, it has been remarked that doing a full collection every + of object creations entails a dramatic performance + degradation in workloads which consist in creating and storing lots of + long-lived objects (e.g. building a large list of GC-tracked objects would + show quadratic performance, instead of linear as expected: see issue #4074). + + Using the above ratio, instead, yields amortized linear performance in + the total number of objects (the effect of which can be summarized + thusly: "each full garbage collection is more and more costly as the + number of objects grows, but we do fewer and fewer of them"). + + This heuristic was suggested by Martin von Löwis on python-dev in + June 2008. His original analysis and proposal can be found at: + http://mail.python.org/pipermail/python-dev/2008-June/080579.html */ if (i == NUM_GENERATIONS - 1 - && state->long_lived_pending < state->long_lived_total / 4) + && gcstate->long_lived_pending < gcstate->long_lived_total / 4) continue; - n = collect_with_callback(state, i); + n = collect_with_callback(tstate, i); break; } } @@ -1278,7 +1458,9 @@ static PyObject * gc_enable_impl(PyObject *module) /*[clinic end generated code: output=45a427e9dce9155c input=81ac4940ca579707]*/ { - _PyRuntime.gc.enabled = 1; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + gcstate->enabled = 1; Py_RETURN_NONE; } @@ -1292,7 +1474,9 @@ static PyObject * gc_disable_impl(PyObject *module) /*[clinic end generated code: output=97d1030f7aa9d279 input=8c2e5a14e800d83b]*/ { - _PyRuntime.gc.enabled = 0; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + gcstate->enabled = 0; Py_RETURN_NONE; } @@ -1306,7 +1490,9 @@ static int gc_isenabled_impl(PyObject *module) /*[clinic end generated code: output=1874298331c49130 input=30005e0422373b31]*/ { - return _PyRuntime.gc.enabled; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + return gcstate->enabled; } /*[clinic input] @@ -1327,22 +1513,23 @@ static Py_ssize_t gc_collect_impl(PyObject *module, int generation) /*[clinic end generated code: output=b697e633043233c7 input=40720128b682d879]*/ { + PyThreadState *tstate = _PyThreadState_GET(); if (generation < 0 || generation >= NUM_GENERATIONS) { - PyErr_SetString(PyExc_ValueError, "invalid generation"); + _PyErr_SetString(tstate, PyExc_ValueError, "invalid generation"); return -1; } - struct _gc_runtime_state *state = &_PyRuntime.gc; + GCState *gcstate = &tstate->interp->gc; Py_ssize_t n; - if (state->collecting) { + if (gcstate->collecting) { /* already collecting, don't do anything */ n = 0; } else { - state->collecting = 1; - n = collect_with_callback(state, generation); - state->collecting = 0; + gcstate->collecting = 1; + n = collect_with_callback(tstate, generation); + gcstate->collecting = 0; } return n; } @@ -1369,8 +1556,9 @@ static PyObject * gc_set_debug_impl(PyObject *module, int flags) /*[clinic end generated code: output=7c8366575486b228 input=5e5ce15e84fbed15]*/ { - _PyRuntime.gc.debug = flags; - + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + gcstate->debug = flags; Py_RETURN_NONE; } @@ -1384,7 +1572,9 @@ static int gc_get_debug_impl(PyObject *module) /*[clinic end generated code: output=91242f3506cd1e50 input=91a101e1c3b98366]*/ { - return _PyRuntime.gc.debug; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + return gcstate->debug; } PyDoc_STRVAR(gc_set_thresh__doc__, @@ -1396,15 +1586,16 @@ PyDoc_STRVAR(gc_set_thresh__doc__, static PyObject * gc_set_threshold(PyObject *self, PyObject *args) { - struct _gc_runtime_state *state = &_PyRuntime.gc; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; if (!PyArg_ParseTuple(args, "i|ii:set_threshold", - &state->generations[0].threshold, - &state->generations[1].threshold, - &state->generations[2].threshold)) + &gcstate->generations[0].threshold, + &gcstate->generations[1].threshold, + &gcstate->generations[2].threshold)) return NULL; for (int i = 3; i < NUM_GENERATIONS; i++) { /* generations higher than 2 get the same threshold */ - state->generations[i].threshold = state->generations[2].threshold; + gcstate->generations[i].threshold = gcstate->generations[2].threshold; } Py_RETURN_NONE; } @@ -1419,11 +1610,12 @@ static PyObject * gc_get_threshold_impl(PyObject *module) /*[clinic end generated code: output=7902bc9f41ecbbd8 input=286d79918034d6e6]*/ { - struct _gc_runtime_state *state = &_PyRuntime.gc; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; return Py_BuildValue("(iii)", - state->generations[0].threshold, - state->generations[1].threshold, - state->generations[2].threshold); + gcstate->generations[0].threshold, + gcstate->generations[1].threshold, + gcstate->generations[2].threshold); } /*[clinic input] @@ -1436,11 +1628,12 @@ static PyObject * gc_get_count_impl(PyObject *module) /*[clinic end generated code: output=354012e67b16398f input=a392794a08251751]*/ { - struct _gc_runtime_state *state = &_PyRuntime.gc; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; return Py_BuildValue("(iii)", - state->generations[0].count, - state->generations[1].count, - state->generations[2].count); + gcstate->generations[0].count, + gcstate->generations[1].count, + gcstate->generations[2].count); } static int @@ -1479,13 +1672,16 @@ Return the list of objects that directly refer to any of objs."); static PyObject * gc_get_referrers(PyObject *self, PyObject *args) { + PyThreadState *tstate = _PyThreadState_GET(); int i; PyObject *result = PyList_New(0); - if (!result) return NULL; + if (!result) { + return NULL; + } - struct _gc_runtime_state *state = &_PyRuntime.gc; + GCState *gcstate = &tstate->interp->gc; for (i = 0; i < NUM_GENERATIONS; i++) { - if (!(gc_referrers_for(args, GEN_HEAD(state, i), result))) { + if (!(gc_referrers_for(args, GEN_HEAD(gcstate, i), result))) { Py_DECREF(result); return NULL; } @@ -1517,7 +1713,7 @@ gc_get_referents(PyObject *self, PyObject *args) traverseproc traverse; PyObject *obj = PyTuple_GET_ITEM(args, i); - if (! PyObject_IS_GC(obj)) + if (!_PyObject_IS_GC(obj)) continue; traverse = Py_TYPE(obj)->tp_traverse; if (! traverse) @@ -1545,9 +1741,10 @@ static PyObject * gc_get_objects_impl(PyObject *module, Py_ssize_t generation) /*[clinic end generated code: output=48b35fea4ba6cb0e input=ef7da9df9806754c]*/ { + PyThreadState *tstate = _PyThreadState_GET(); int i; PyObject* result; - struct _gc_runtime_state *state = &_PyRuntime.gc; + GCState *gcstate = &tstate->interp->gc; result = PyList_New(0); if (result == NULL) { @@ -1557,20 +1754,20 @@ gc_get_objects_impl(PyObject *module, Py_ssize_t generation) /* If generation is passed, we extract only that generation */ if (generation != -1) { if (generation >= NUM_GENERATIONS) { - PyErr_Format(PyExc_ValueError, - "generation parameter must be less than the number of " - "available generations (%i)", - NUM_GENERATIONS); + _PyErr_Format(tstate, PyExc_ValueError, + "generation parameter must be less than the number of " + "available generations (%i)", + NUM_GENERATIONS); goto error; } if (generation < 0) { - PyErr_SetString(PyExc_ValueError, - "generation parameter cannot be negative"); + _PyErr_SetString(tstate, PyExc_ValueError, + "generation parameter cannot be negative"); goto error; } - if (append_objects(result, GEN_HEAD(state, generation))) { + if (append_objects(result, GEN_HEAD(gcstate, generation))) { goto error; } @@ -1579,7 +1776,7 @@ gc_get_objects_impl(PyObject *module, Py_ssize_t generation) /* If generation is not passed or None, get all objects from all generations */ for (i = 0; i < NUM_GENERATIONS; i++) { - if (append_objects(result, GEN_HEAD(state, i))) { + if (append_objects(result, GEN_HEAD(gcstate, i))) { goto error; } } @@ -1602,12 +1799,13 @@ gc_get_stats_impl(PyObject *module) { int i; struct gc_generation_stats stats[NUM_GENERATIONS], *st; + PyThreadState *tstate = _PyThreadState_GET(); /* To get consistent values despite allocations while constructing the result list, we use a snapshot of the running stats. */ - struct _gc_runtime_state *state = &_PyRuntime.gc; + GCState *gcstate = &tstate->interp->gc; for (i = 0; i < NUM_GENERATIONS; i++) { - stats[i] = state->generation_stats[i]; + stats[i] = gcstate->generation_stats[i]; } PyObject *result = PyList_New(0); @@ -1655,7 +1853,7 @@ gc_is_tracked(PyObject *module, PyObject *obj) { PyObject *result; - if (PyObject_IS_GC(obj) && _PyObject_GC_IS_TRACKED(obj)) + if (_PyObject_IS_GC(obj) && _PyObject_GC_IS_TRACKED(obj)) result = Py_True; else result = Py_False; @@ -1663,6 +1861,25 @@ gc_is_tracked(PyObject *module, PyObject *obj) return result; } +/*[clinic input] +gc.is_finalized + + obj: object + / + +Returns true if the object has been already finalized by the GC. +[clinic start generated code]*/ + +static PyObject * +gc_is_finalized(PyObject *module, PyObject *obj) +/*[clinic end generated code: output=e1516ac119a918ed input=201d0c58f69ae390]*/ +{ + if (_PyObject_IS_GC(obj) && _PyGCHead_FINALIZED(AS_GC(obj))) { + Py_RETURN_TRUE; + } + Py_RETURN_FALSE; +} + /*[clinic input] gc.freeze @@ -1677,10 +1894,11 @@ static PyObject * gc_freeze_impl(PyObject *module) /*[clinic end generated code: output=502159d9cdc4c139 input=b602b16ac5febbe5]*/ { - struct _gc_runtime_state *state = &_PyRuntime.gc; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; for (int i = 0; i < NUM_GENERATIONS; ++i) { - gc_list_merge(GEN_HEAD(state, i), &state->permanent_generation.head); - state->generations[i].count = 0; + gc_list_merge(GEN_HEAD(gcstate, i), &gcstate->permanent_generation.head); + gcstate->generations[i].count = 0; } Py_RETURN_NONE; } @@ -1697,8 +1915,10 @@ static PyObject * gc_unfreeze_impl(PyObject *module) /*[clinic end generated code: output=1c15f2043b25e169 input=2dd52b170f4cef6c]*/ { - struct _gc_runtime_state *state = &_PyRuntime.gc; - gc_list_merge(&state->permanent_generation.head, GEN_HEAD(state, NUM_GENERATIONS-1)); + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + gc_list_merge(&gcstate->permanent_generation.head, + GEN_HEAD(gcstate, NUM_GENERATIONS-1)); Py_RETURN_NONE; } @@ -1712,7 +1932,9 @@ static Py_ssize_t gc_get_freeze_count_impl(PyObject *module) /*[clinic end generated code: output=61cbd9f43aa032e1 input=45ffbc65cfe2a6ed]*/ { - return gc_list_size(&_PyRuntime.gc.permanent_generation.head); + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + return gc_list_size(&gcstate->permanent_generation.head); } @@ -1731,6 +1953,7 @@ PyDoc_STRVAR(gc__doc__, "get_threshold() -- Return the current the collection thresholds.\n" "get_objects() -- Return a list of all objects tracked by the collector.\n" "is_tracked() -- Returns true if a given object is tracked.\n" +"is_finalized() -- Returns true if a given object has been already finalized.\n" "get_referrers() -- Return the list of objects that refer to an object.\n" "get_referents() -- Return the list of objects that an object refers to.\n" "freeze() -- Freeze all tracked objects and ignore them for future collections.\n" @@ -1750,6 +1973,7 @@ static PyMethodDef GcMethods[] = { GC_GET_OBJECTS_METHODDEF GC_GET_STATS_METHODDEF GC_IS_TRACKED_METHODDEF + GC_IS_FINALIZED_METHODDEF {"get_referrers", gc_get_referrers, METH_VARARGS, gc_get_referrers__doc__}, {"get_referents", gc_get_referents, METH_VARARGS, @@ -1775,34 +1999,38 @@ static struct PyModuleDef gcmodule = { PyMODINIT_FUNC PyInit_gc(void) { - PyObject *m; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; - m = PyModule_Create(&gcmodule); + PyObject *m = PyModule_Create(&gcmodule); if (m == NULL) { return NULL; } - struct _gc_runtime_state *state = &_PyRuntime.gc; - if (state->garbage == NULL) { - state->garbage = PyList_New(0); - if (state->garbage == NULL) + if (gcstate->garbage == NULL) { + gcstate->garbage = PyList_New(0); + if (gcstate->garbage == NULL) { return NULL; + } } - Py_INCREF(state->garbage); - if (PyModule_AddObject(m, "garbage", state->garbage) < 0) + Py_INCREF(gcstate->garbage); + if (PyModule_AddObject(m, "garbage", gcstate->garbage) < 0) { return NULL; + } - if (state->callbacks == NULL) { - state->callbacks = PyList_New(0); - if (state->callbacks == NULL) + if (gcstate->callbacks == NULL) { + gcstate->callbacks = PyList_New(0); + if (gcstate->callbacks == NULL) { return NULL; + } } - Py_INCREF(state->callbacks); - if (PyModule_AddObject(m, "callbacks", state->callbacks) < 0) + Py_INCREF(gcstate->callbacks); + if (PyModule_AddObject(m, "callbacks", gcstate->callbacks) < 0) { return NULL; + } -#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return NULL +#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) { return NULL; } ADD_INT(DEBUG_STATS); ADD_INT(DEBUG_COLLECTABLE); ADD_INT(DEBUG_UNCOLLECTABLE); @@ -1816,23 +2044,25 @@ PyInit_gc(void) Py_ssize_t PyGC_Collect(void) { - struct _gc_runtime_state *state = &_PyRuntime.gc; - if (!state->enabled) { + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + + if (!gcstate->enabled) { return 0; } Py_ssize_t n; - if (state->collecting) { + if (gcstate->collecting) { /* already collecting, don't do anything */ n = 0; } else { PyObject *exc, *value, *tb; - state->collecting = 1; - PyErr_Fetch(&exc, &value, &tb); - n = collect_with_callback(state, NUM_GENERATIONS - 1); - PyErr_Restore(exc, value, tb); - state->collecting = 0; + gcstate->collecting = 1; + _PyErr_Fetch(tstate, &exc, &value, &tb); + n = collect_with_callback(tstate, NUM_GENERATIONS - 1); + _PyErr_Restore(tstate, exc, value, tb); + gcstate->collecting = 0; } return n; @@ -1847,9 +2077,10 @@ _PyGC_CollectIfEnabled(void) Py_ssize_t _PyGC_CollectNoFail(void) { - assert(!PyErr_Occurred()); + PyThreadState *tstate = _PyThreadState_GET(); + assert(!_PyErr_Occurred(tstate)); - struct _gc_runtime_state *state = &_PyRuntime.gc; + GCState *gcstate = &tstate->interp->gc; Py_ssize_t n; /* Ideally, this function is only called on interpreter shutdown, @@ -1858,25 +2089,25 @@ _PyGC_CollectNoFail(void) during interpreter shutdown (and then never finish it). See http://bugs.python.org/issue8713#msg195178 for an example. */ - if (state->collecting) { + if (gcstate->collecting) { n = 0; } else { - state->collecting = 1; - n = collect(state, NUM_GENERATIONS - 1, NULL, NULL, 1); - state->collecting = 0; + gcstate->collecting = 1; + n = collect(tstate, NUM_GENERATIONS - 1, NULL, NULL, 1); + gcstate->collecting = 0; } return n; } void -_PyGC_DumpShutdownStats(_PyRuntimeState *runtime) +_PyGC_DumpShutdownStats(PyThreadState *tstate) { - struct _gc_runtime_state *state = &runtime->gc; - if (!(state->debug & DEBUG_SAVEALL) - && state->garbage != NULL && PyList_GET_SIZE(state->garbage) > 0) { + GCState *gcstate = &tstate->interp->gc; + if (!(gcstate->debug & DEBUG_SAVEALL) + && gcstate->garbage != NULL && PyList_GET_SIZE(gcstate->garbage) > 0) { const char *message; - if (state->debug & DEBUG_UNCOLLECTABLE) + if (gcstate->debug & DEBUG_UNCOLLECTABLE) message = "gc: %zd uncollectable objects at " \ "shutdown"; else @@ -1887,13 +2118,13 @@ _PyGC_DumpShutdownStats(_PyRuntimeState *runtime) already. */ if (PyErr_WarnExplicitFormat(PyExc_ResourceWarning, "gc", 0, "gc", NULL, message, - PyList_GET_SIZE(state->garbage))) + PyList_GET_SIZE(gcstate->garbage))) PyErr_WriteUnraisable(NULL); - if (state->debug & DEBUG_UNCOLLECTABLE) { + if (gcstate->debug & DEBUG_UNCOLLECTABLE) { PyObject *repr = NULL, *bytes = NULL; - repr = PyObject_Repr(state->garbage); + repr = PyObject_Repr(gcstate->garbage); if (!repr || !(bytes = PyUnicode_EncodeFSDefault(repr))) - PyErr_WriteUnraisable(state->garbage); + PyErr_WriteUnraisable(gcstate->garbage); else { PySys_WriteStderr( " %s\n", @@ -1907,11 +2138,11 @@ _PyGC_DumpShutdownStats(_PyRuntimeState *runtime) } void -_PyGC_Fini(_PyRuntimeState *runtime) +_PyGC_Fini(PyThreadState *tstate) { - struct _gc_runtime_state *state = &runtime->gc; - Py_CLEAR(state->garbage); - Py_CLEAR(state->callbacks); + GCState *gcstate = &tstate->interp->gc; + Py_CLEAR(gcstate->garbage); + Py_CLEAR(gcstate->callbacks); } /* for debugging */ @@ -1921,6 +2152,21 @@ _PyGC_Dump(PyGC_Head *g) _PyObject_Dump(FROM_GC(g)); } + +#ifdef Py_DEBUG +static int +visit_validate(PyObject *op, void *parent_raw) +{ + PyObject *parent = _PyObject_CAST(parent_raw); + if (_PyObject_IsFreed(op)) { + _PyObject_ASSERT_FAILED_MSG(parent, + "PyObject_GC_Track() object is not valid"); + } + return 0; +} +#endif + + /* extension modules might be compiled with GC support so these functions must always be available */ @@ -1934,6 +2180,13 @@ PyObject_GC_Track(void *op_raw) "by the garbage collector"); } _PyObject_GC_TRACK(op); + +#ifdef Py_DEBUG + /* Check that the object is valid: validate objects traversed + by tp_traverse() */ + traverseproc traverse = Py_TYPE(op)->tp_traverse; + (void)traverse(op, visit_validate, op); +#endif } void @@ -1948,36 +2201,48 @@ PyObject_GC_UnTrack(void *op_raw) } } +int +PyObject_IS_GC(PyObject *obj) +{ + return _PyObject_IS_GC(obj); +} + static PyObject * _PyObject_GC_Alloc(int use_calloc, size_t basicsize) { - struct _gc_runtime_state *state = &_PyRuntime.gc; - PyObject *op; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head)) { + return _PyErr_NoMemory(tstate); + } + size_t size = sizeof(PyGC_Head) + basicsize; + PyGC_Head *g; - size_t size; - if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head)) - return PyErr_NoMemory(); - size = sizeof(PyGC_Head) + basicsize; - if (use_calloc) + if (use_calloc) { g = (PyGC_Head *)PyObject_Calloc(1, size); - else + } + else { g = (PyGC_Head *)PyObject_Malloc(size); - if (g == NULL) - return PyErr_NoMemory(); + } + if (g == NULL) { + return _PyErr_NoMemory(tstate); + } assert(((uintptr_t)g & 3) == 0); // g must be aligned 4bytes boundary + g->_gc_next = 0; g->_gc_prev = 0; - state->generations[0].count++; /* number of allocated GC objects */ - if (state->generations[0].count > state->generations[0].threshold && - state->enabled && - state->generations[0].threshold && - !state->collecting && - !PyErr_Occurred()) { - state->collecting = 1; - collect_generations(state); - state->collecting = 0; - } - op = FROM_GC(g); + gcstate->generations[0].count++; /* number of allocated GC objects */ + if (gcstate->generations[0].count > gcstate->generations[0].threshold && + gcstate->enabled && + gcstate->generations[0].threshold && + !gcstate->collecting && + !_PyErr_Occurred(tstate)) + { + gcstate->collecting = 1; + collect_generations(tstate); + gcstate->collecting = 0; + } + PyObject *op = FROM_GC(g); return op; } @@ -2033,7 +2298,7 @@ _PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems) if (g == NULL) return (PyVarObject *)PyErr_NoMemory(); op = (PyVarObject *) FROM_GC(g); - Py_SIZE(op) = nitems; + Py_SET_SIZE(op, nitems); return op; } @@ -2044,9 +2309,28 @@ PyObject_GC_Del(void *op) if (_PyObject_GC_IS_TRACKED(op)) { gc_list_remove(g); } - struct _gc_runtime_state *state = &_PyRuntime.gc; - if (state->generations[0].count > 0) { - state->generations[0].count--; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + if (gcstate->generations[0].count > 0) { + gcstate->generations[0].count--; } PyObject_FREE(g); } + +int +PyObject_GC_IsTracked(PyObject* obj) +{ + if (_PyObject_IS_GC(obj) && _PyObject_GC_IS_TRACKED(obj)) { + return 1; + } + return 0; +} + +int +PyObject_GC_IsFinalized(PyObject *obj) +{ + if (_PyObject_IS_GC(obj) && _PyGCHead_FINALIZED(AS_GC(obj))) { + return 1; + } + return 0; +} diff --git a/Modules/getpath.c b/Modules/getpath.c index b727f669..a84c8586 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -1,11 +1,10 @@ /* Return the initial module search path. */ #include "Python.h" -#include "pycore_initconfig.h" -#include "osdefs.h" #include "pycore_fileutils.h" +#include "pycore_initconfig.h" #include "pycore_pathconfig.h" -#include "pycore_pystate.h" +#include "osdefs.h" // DELIM #include #include @@ -95,7 +94,7 @@ * process to find the installed Python tree. * * An embedding application can use Py_SetPath() to override all of - * these authomatic path computations. + * these automatic path computations. * * NOTE: Windows MSVC builds use PC/getpathp.c instead! */ @@ -105,14 +104,17 @@ extern "C" { #endif -#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH) -#error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined" +#if (!defined(PREFIX) || !defined(EXEC_PREFIX) \ + || !defined(VERSION) || !defined(VPATH)) +#error "PREFIX, EXEC_PREFIX, VERSION and VPATH macros must be defined" #endif #ifndef LANDMARK #define LANDMARK L"os.py" #endif +#define BUILD_LANDMARK L"Modules/Setup.local" + #define DECODE_LOCALE_ERR(NAME, LEN) \ ((LEN) == (size_t)-2) \ ? _PyStatus_ERR("cannot decode " NAME) \ @@ -123,17 +125,24 @@ extern "C" { typedef struct { wchar_t *path_env; /* PATH environment variable */ - wchar_t *pythonpath; /* PYTHONPATH macro */ - wchar_t *prefix; /* PREFIX macro */ - wchar_t *exec_prefix; /* EXEC_PREFIX macro */ + wchar_t *pythonpath_macro; /* PYTHONPATH macro */ + wchar_t *prefix_macro; /* PREFIX macro */ + wchar_t *exec_prefix_macro; /* EXEC_PREFIX macro */ + wchar_t *vpath_macro; /* VPATH macro */ - wchar_t *lib_python; /* "lib/pythonX.Y" */ + wchar_t *lib_python; /* / "pythonX.Y" */ int prefix_found; /* found platform independent libraries? */ int exec_prefix_found; /* found the platform dependent libraries? */ int warnings; const wchar_t *pythonpath_env; + const wchar_t *platlibdir; + + wchar_t *argv0_path; + wchar_t *zip_path; + wchar_t *prefix; + wchar_t *exec_prefix; } PyCalculatePath; static const wchar_t delimiter[2] = {DELIM, '\0'}; @@ -183,25 +192,6 @@ isfile(const wchar_t *filename) } -/* Is module -- check for .pyc too */ -static int -ismodule(wchar_t *filename, size_t filename_len) -{ - if (isfile(filename)) { - return 1; - } - - /* Check for the compiled version of prefix. */ - if (wcslen(filename) + 2 <= filename_len) { - wcscat(filename, L"c"); - if (isfile(filename)) { - return 1; - } - } - return 0; -} - - /* Is executable file */ static int isxfile(const wchar_t *filename) @@ -222,7 +212,7 @@ isxfile(const wchar_t *filename) /* Is directory */ static int -isdir(wchar_t *filename) +isdir(const wchar_t *filename) { struct stat buf; if (_Py_wstat(filename, &buf) != 0) { @@ -236,36 +226,83 @@ isdir(wchar_t *filename) /* Add a path component, by appending stuff to buffer. - buflen: 'buffer' length in characters including trailing NUL. */ + buflen: 'buffer' length in characters including trailing NUL. + + If path2 is empty: + + - if path doesn't end with SEP and is not empty, add SEP to path + - otherwise, do nothing. */ static PyStatus -joinpath(wchar_t *buffer, const wchar_t *stuff, size_t buflen) +joinpath(wchar_t *path, const wchar_t *path2, size_t path_len) { - size_t n, k; - if (stuff[0] != SEP) { - n = wcslen(buffer); - if (n >= buflen) { + size_t n; + if (!_Py_isabs(path2)) { + n = wcslen(path); + if (n >= path_len) { return PATHLEN_ERR(); } - if (n > 0 && buffer[n-1] != SEP) { - buffer[n++] = SEP; + if (n > 0 && path[n-1] != SEP) { + path[n++] = SEP; } } else { n = 0; } - k = wcslen(stuff); - if (n + k >= buflen) { + size_t k = wcslen(path2); + if (n + k >= path_len) { return PATHLEN_ERR(); } - wcsncpy(buffer+n, stuff, k); - buffer[n+k] = '\0'; + wcsncpy(path + n, path2, k); + path[n + k] = '\0'; return _PyStatus_OK(); } +static wchar_t* +substring(const wchar_t *str, size_t len) +{ + wchar_t *substr = PyMem_RawMalloc((len + 1) * sizeof(wchar_t)); + if (substr == NULL) { + return NULL; + } + + if (len) { + memcpy(substr, str, len * sizeof(wchar_t)); + } + substr[len] = L'\0'; + return substr; +} + + +static wchar_t* +joinpath2(const wchar_t *path, const wchar_t *path2) +{ + if (_Py_isabs(path2)) { + return _PyMem_RawWcsdup(path2); + } + + size_t len = wcslen(path); + int add_sep = (len > 0 && path[len - 1] != SEP); + len += add_sep; + len += wcslen(path2); + + wchar_t *new_path = PyMem_RawMalloc((len + 1) * sizeof(wchar_t)); + if (new_path == NULL) { + return NULL; + } + + wcscpy(new_path, path); + if (add_sep) { + wcscat(new_path, separator); + } + wcscat(new_path, path2); + return new_path; +} + + static inline int safe_wcscpy(wchar_t *dst, const wchar_t *src, size_t n) { @@ -280,27 +317,27 @@ safe_wcscpy(wchar_t *dst, const wchar_t *src, size_t n) /* copy_absolute requires that path be allocated at least - 'pathlen' characters (including trailing NUL). */ + 'abs_path_len' characters (including trailing NUL). */ static PyStatus -copy_absolute(wchar_t *path, const wchar_t *p, size_t pathlen) +copy_absolute(wchar_t *abs_path, const wchar_t *path, size_t abs_path_len) { - if (p[0] == SEP) { - if (safe_wcscpy(path, p, pathlen) < 0) { + if (_Py_isabs(path)) { + if (safe_wcscpy(abs_path, path, abs_path_len) < 0) { return PATHLEN_ERR(); } } else { - if (!_Py_wgetcwd(path, pathlen)) { + if (!_Py_wgetcwd(abs_path, abs_path_len)) { /* unable to get the current directory */ - if (safe_wcscpy(path, p, pathlen) < 0) { + if (safe_wcscpy(abs_path, path, abs_path_len) < 0) { return PATHLEN_ERR(); } return _PyStatus_OK(); } - if (p[0] == '.' && p[1] == SEP) { - p += 2; + if (path[0] == '.' && path[1] == SEP) { + path += 2; } - PyStatus status = joinpath(path, p, pathlen); + PyStatus status = joinpath(abs_path, path, abs_path_len); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -311,21 +348,58 @@ copy_absolute(wchar_t *path, const wchar_t *p, size_t pathlen) /* path_len: path length in characters including trailing NUL */ static PyStatus -absolutize(wchar_t *path, size_t path_len) +absolutize(wchar_t **path_p) { - if (path[0] == SEP) { - return _PyStatus_OK(); - } + assert(!_Py_isabs(*path_p)); wchar_t abs_path[MAXPATHLEN+1]; + wchar_t *path = *path_p; + PyStatus status = copy_absolute(abs_path, path, Py_ARRAY_LENGTH(abs_path)); if (_PyStatus_EXCEPTION(status)) { return status; } - if (safe_wcscpy(path, abs_path, path_len) < 0) { - return PATHLEN_ERR(); + PyMem_RawFree(*path_p); + *path_p = _PyMem_RawWcsdup(abs_path); + if (*path_p == NULL) { + return _PyStatus_NO_MEMORY(); + } + return _PyStatus_OK(); +} + + +/* Is module -- check for .pyc too */ +static PyStatus +ismodule(const wchar_t *path, int *result) +{ + wchar_t *filename = joinpath2(path, LANDMARK); + if (filename == NULL) { + return _PyStatus_NO_MEMORY(); + } + + if (isfile(filename)) { + PyMem_RawFree(filename); + *result = 1; + return _PyStatus_OK(); } + + /* Check for the compiled version of prefix. */ + size_t len = wcslen(filename); + wchar_t *pyc = PyMem_RawMalloc((len + 2) * sizeof(wchar_t)); + if (pyc == NULL) { + PyMem_RawFree(filename); + return _PyStatus_NO_MEMORY(); + } + + memcpy(pyc, filename, len * sizeof(wchar_t)); + pyc[len] = L'c'; + pyc[len + 1] = L'\0'; + *result = isfile(pyc); + + PyMem_RawFree(filename); + PyMem_RawFree(pyc); + return _PyStatus_OK(); } @@ -337,8 +411,10 @@ absolutize(wchar_t *path, size_t path_len) /* pathlen: 'path' length in characters including trailing NUL */ static PyStatus -add_exe_suffix(wchar_t *progpath, size_t progpathlen) +add_exe_suffix(wchar_t **progpath_p) { + wchar_t *progpath = *progpath_p; + /* Check for already have an executable suffix */ size_t n = wcslen(progpath); size_t s = wcslen(EXE_SUFFIX); @@ -346,17 +422,22 @@ add_exe_suffix(wchar_t *progpath, size_t progpathlen) return _PyStatus_OK(); } - if (n + s >= progpathlen) { - return PATHLEN_ERR(); + wchar_t *progpath2 = PyMem_RawMalloc((n + s + 1) * sizeof(wchar_t)); + if (progpath2 == NULL) { + return _PyStatus_NO_MEMORY(); } - wcsncpy(progpath + n, EXE_SUFFIX, s); - progpath[n+s] = '\0'; - if (!isxfile(progpath)) { - /* Path that added suffix is invalid: truncate (remove suffix) */ - progpath[n] = '\0'; - } + memcpy(progpath2, progpath, n * sizeof(wchar_t)); + memcpy(progpath2 + n, EXE_SUFFIX, s * sizeof(wchar_t)); + progpath2[n+s] = L'\0'; + if (isxfile(progpath2)) { + PyMem_RawFree(*progpath_p); + *progpath_p = progpath2; + } + else { + PyMem_RawFree(progpath2); + } return _PyStatus_OK(); } #endif @@ -367,13 +448,8 @@ add_exe_suffix(wchar_t *progpath, size_t progpathlen) */ static PyStatus search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - const wchar_t *argv0_path, wchar_t *prefix, size_t prefix_len, int *found) { - wchar_t path[MAXPATHLEN+1]; - memset(path, 0, sizeof(path)); - size_t path_len = Py_ARRAY_LENGTH(path); - PyStatus status; /* If PYTHONHOME is set, we believe it unconditionally */ @@ -394,49 +470,51 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, return _PyStatus_OK(); } - /* Check to see if argv[0] is in the build directory */ - if (safe_wcscpy(path, argv0_path, path_len) < 0) { - return PATHLEN_ERR(); - } - status = joinpath(path, L"Modules/Setup.local", path_len); - if (_PyStatus_EXCEPTION(status)) { - return status; + /* Check to see if argv0_path is in the build directory + + Path: / */ + wchar_t *path = joinpath2(calculate->argv0_path, BUILD_LANDMARK); + if (path == NULL) { + return _PyStatus_NO_MEMORY(); } - if (isfile(path)) { - /* Check VPATH to see if argv0_path is in the build directory. - VPATH can be empty. */ - wchar_t *vpath = Py_DecodeLocale(VPATH, NULL); - if (vpath != NULL) { - /* Path: / / Lib / LANDMARK */ - if (safe_wcscpy(prefix, argv0_path, prefix_len) < 0) { - return PATHLEN_ERR(); - } - status = joinpath(prefix, vpath, prefix_len); - PyMem_RawFree(vpath); - if (_PyStatus_EXCEPTION(status)) { - return status; - } + int is_build_dir = isfile(path); + PyMem_RawFree(path); - status = joinpath(prefix, L"Lib", prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - status = joinpath(prefix, LANDMARK, prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } + if (is_build_dir) { + /* argv0_path is the build directory (BUILD_LANDMARK exists), + now also check LANDMARK using ismodule(). */ - if (ismodule(prefix, prefix_len)) { - *found = -1; - reduce(prefix); - return _PyStatus_OK(); - } + /* Path: / / Lib */ + /* or if VPATH is empty: / Lib */ + if (safe_wcscpy(prefix, calculate->argv0_path, prefix_len) < 0) { + return PATHLEN_ERR(); + } + + status = joinpath(prefix, calculate->vpath_macro, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + status = joinpath(prefix, L"Lib", prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + int module; + status = ismodule(prefix, &module); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + if (module) { + /* BUILD_LANDMARK and LANDMARK found */ + *found = -1; + return _PyStatus_OK(); } } /* Search from argv0_path, until root is found */ - status = copy_absolute(prefix, argv0_path, prefix_len); + status = copy_absolute(prefix, calculate->argv0_path, prefix_len); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -448,14 +526,14 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, if (_PyStatus_EXCEPTION(status)) { return status; } - status = joinpath(prefix, LANDMARK, prefix_len); + + int module; + status = ismodule(prefix, &module); if (_PyStatus_EXCEPTION(status)) { return status; } - - if (ismodule(prefix, prefix_len)) { + if (module) { *found = 1; - reduce(prefix); return _PyStatus_OK(); } prefix[n] = L'\0'; @@ -464,21 +542,21 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, /* Look at configure's PREFIX. Path: / / LANDMARK */ - if (safe_wcscpy(prefix, calculate->prefix, prefix_len) < 0) { + if (safe_wcscpy(prefix, calculate->prefix_macro, prefix_len) < 0) { return PATHLEN_ERR(); } status = joinpath(prefix, calculate->lib_python, prefix_len); if (_PyStatus_EXCEPTION(status)) { return status; } - status = joinpath(prefix, LANDMARK, prefix_len); + + int module; + status = ismodule(prefix, &module); if (_PyStatus_EXCEPTION(status)) { return status; } - - if (ismodule(prefix, prefix_len)) { + if (module) { *found = 1; - reduce(prefix); return _PyStatus_OK(); } @@ -489,13 +567,14 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, static PyStatus -calculate_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - const wchar_t *argv0_path, - wchar_t *prefix, size_t prefix_len) +calculate_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) { - PyStatus status; + wchar_t prefix[MAXPATHLEN+1]; + memset(prefix, 0, sizeof(prefix)); + size_t prefix_len = Py_ARRAY_LENGTH(prefix); - status = search_for_prefix(calculate, pathconfig, argv0_path, + PyStatus status; + status = search_for_prefix(calculate, pathconfig, prefix, prefix_len, &calculate->prefix_found); if (_PyStatus_EXCEPTION(status)) { @@ -507,21 +586,23 @@ calculate_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, fprintf(stderr, "Could not find platform independent libraries \n"); } - if (safe_wcscpy(prefix, calculate->prefix, prefix_len) < 0) { - return PATHLEN_ERR(); - } - status = joinpath(prefix, calculate->lib_python, prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } + + calculate->prefix = joinpath2(calculate->prefix_macro, + calculate->lib_python); + } + else { + calculate->prefix = _PyMem_RawWcsdup(prefix); + } + + if (calculate->prefix == NULL) { + return _PyStatus_NO_MEMORY(); } return _PyStatus_OK(); } static PyStatus -calculate_set_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - wchar_t *prefix) +calculate_set_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) { /* Reduce prefix and exec_prefix to their essence, * e.g. /usr/local/lib/python1.5 is reduced to /usr/local. @@ -529,21 +610,32 @@ calculate_set_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, * return the compiled-in defaults instead. */ if (calculate->prefix_found > 0) { + wchar_t *prefix = _PyMem_RawWcsdup(calculate->prefix); + if (prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } + reduce(prefix); reduce(prefix); - /* The prefix is the root directory, but reduce() chopped - * off the "/". */ - if (!prefix[0]) { - wcscpy(prefix, separator); + if (prefix[0]) { + pathconfig->prefix = prefix; + } + else { + PyMem_RawFree(prefix); + + /* The prefix is the root directory, but reduce() chopped + off the "/". */ + pathconfig->prefix = _PyMem_RawWcsdup(separator); + if (pathconfig->prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } } - pathconfig->prefix = _PyMem_RawWcsdup(prefix); } else { - pathconfig->prefix = _PyMem_RawWcsdup(calculate->prefix); - } - - if (pathconfig->prefix == NULL) { - return _PyStatus_NO_MEMORY(); + pathconfig->prefix = _PyMem_RawWcsdup(calculate->prefix_macro); + if (pathconfig->prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } } return _PyStatus_OK(); } @@ -556,28 +648,18 @@ calculate_pybuilddir(const wchar_t *argv0_path, { PyStatus status; - wchar_t filename[MAXPATHLEN+1]; - memset(filename, 0, sizeof(filename)); - size_t filename_len = Py_ARRAY_LENGTH(filename); - /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" is written by setup.py and contains the relative path to the location of shared library modules. Filename: / "pybuilddir.txt" */ - if (safe_wcscpy(filename, argv0_path, filename_len) < 0) { - return PATHLEN_ERR(); - } - status = joinpath(filename, L"pybuilddir.txt", filename_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - if (!isfile(filename)) { - return _PyStatus_OK(); + wchar_t *filename = joinpath2(argv0_path, L"pybuilddir.txt"); + if (filename == NULL) { + return _PyStatus_NO_MEMORY(); } FILE *fp = _Py_wfopen(filename, L"rb"); + PyMem_RawFree(filename); if (fp == NULL) { errno = 0; return _PyStatus_OK(); @@ -615,7 +697,6 @@ calculate_pybuilddir(const wchar_t *argv0_path, */ static PyStatus search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - const wchar_t *argv0_path, wchar_t *exec_prefix, size_t exec_prefix_len, int *found) { @@ -649,8 +730,8 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, /* Check for pybuilddir.txt */ assert(*found == 0); - status = calculate_pybuilddir(argv0_path, exec_prefix, exec_prefix_len, - found); + status = calculate_pybuilddir(calculate->argv0_path, + exec_prefix, exec_prefix_len, found); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -659,7 +740,7 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, } /* Search from argv0_path, until root is found */ - status = copy_absolute(exec_prefix, argv0_path, exec_prefix_len); + status = copy_absolute(exec_prefix, calculate->argv0_path, exec_prefix_len); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -686,7 +767,7 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, /* Look at configure's EXEC_PREFIX. Path: / / "lib-dynload" */ - if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { + if (safe_wcscpy(exec_prefix, calculate->exec_prefix_macro, exec_prefix_len) < 0) { return PATHLEN_ERR(); } status = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); @@ -709,13 +790,14 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, static PyStatus -calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - const wchar_t *argv0_path, - wchar_t *exec_prefix, size_t exec_prefix_len) +calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) { PyStatus status; + wchar_t exec_prefix[MAXPATHLEN+1]; + memset(exec_prefix, 0, sizeof(exec_prefix)); + size_t exec_prefix_len = Py_ARRAY_LENGTH(exec_prefix); - status = search_for_exec_prefix(calculate, pathconfig, argv0_path, + status = search_for_exec_prefix(calculate, pathconfig, exec_prefix, exec_prefix_len, &calculate->exec_prefix_found); if (_PyStatus_EXCEPTION(status)) { @@ -727,62 +809,159 @@ calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, fprintf(stderr, "Could not find platform dependent libraries \n"); } - if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { - return PATHLEN_ERR(); + + /* / "lib-dynload" */ + wchar_t *lib_dynload = joinpath2(calculate->platlibdir, + L"lib-dynload"); + if (lib_dynload == NULL) { + return _PyStatus_NO_MEMORY(); } - status = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; + + calculate->exec_prefix = joinpath2(calculate->exec_prefix_macro, + lib_dynload); + PyMem_RawFree(lib_dynload); + + if (calculate->exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } + } + else { + /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */ + calculate->exec_prefix = _PyMem_RawWcsdup(exec_prefix); + if (calculate->exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); } } - /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */ return _PyStatus_OK(); } static PyStatus calculate_set_exec_prefix(PyCalculatePath *calculate, - _PyPathConfig *pathconfig, - wchar_t *exec_prefix) + _PyPathConfig *pathconfig) { if (calculate->exec_prefix_found > 0) { + wchar_t *exec_prefix = _PyMem_RawWcsdup(calculate->exec_prefix); + if (exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } + reduce(exec_prefix); reduce(exec_prefix); reduce(exec_prefix); - if (!exec_prefix[0]) { - wcscpy(exec_prefix, separator); - } - pathconfig->exec_prefix = _PyMem_RawWcsdup(exec_prefix); + if (exec_prefix[0]) { + pathconfig->exec_prefix = exec_prefix; + } + else { + /* empty string: use SEP instead */ + PyMem_RawFree(exec_prefix); + + /* The exec_prefix is the root directory, but reduce() chopped + off the "/". */ + pathconfig->exec_prefix = _PyMem_RawWcsdup(separator); + if (pathconfig->exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } + } } else { - pathconfig->exec_prefix = _PyMem_RawWcsdup(calculate->exec_prefix); + pathconfig->exec_prefix = _PyMem_RawWcsdup(calculate->exec_prefix_macro); + if (pathconfig->exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } } + return _PyStatus_OK(); +} - if (pathconfig->exec_prefix == NULL) { - return _PyStatus_NO_MEMORY(); + +/* Similar to shutil.which(). + If found, write the path into *abs_path_p. */ +static PyStatus +calculate_which(const wchar_t *path_env, wchar_t *program_name, + wchar_t **abs_path_p) +{ + while (1) { + wchar_t *delim = wcschr(path_env, DELIM); + wchar_t *abs_path; + + if (delim) { + wchar_t *path = substring(path_env, delim - path_env); + if (path == NULL) { + return _PyStatus_NO_MEMORY(); + } + abs_path = joinpath2(path, program_name); + PyMem_RawFree(path); + } + else { + abs_path = joinpath2(path_env, program_name); + } + + if (abs_path == NULL) { + return _PyStatus_NO_MEMORY(); + } + + if (isxfile(abs_path)) { + *abs_path_p = abs_path; + return _PyStatus_OK(); + } + PyMem_RawFree(abs_path); + + if (!delim) { + break; + } + path_env = delim + 1; } + /* not found */ return _PyStatus_OK(); } +#ifdef __APPLE__ static PyStatus -calculate_program_full_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) +calculate_program_macos(wchar_t **abs_path_p) { - PyStatus status; - wchar_t program_full_path[MAXPATHLEN + 1]; - const size_t program_full_path_len = Py_ARRAY_LENGTH(program_full_path); - memset(program_full_path, 0, sizeof(program_full_path)); - -#ifdef __APPLE__ char execpath[MAXPATHLEN + 1]; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 uint32_t nsexeclength = Py_ARRAY_LENGTH(execpath) - 1; #else unsigned long nsexeclength = Py_ARRAY_LENGTH(execpath) - 1; #endif -#endif + + /* On Mac OS X, if a script uses an interpreter of the form + "#!/opt/python2.3/bin/python", the kernel only passes "python" + as argv[0], which falls through to the $PATH search below. + If /opt/python2.3/bin isn't in your path, or is near the end, + this algorithm may incorrectly find /usr/bin/python. To work + around this, we can use _NSGetExecutablePath to get a better + hint of what the intended interpreter was, although this + will fail if a relative path was used. but in that case, + absolutize() should help us out below + */ + if (_NSGetExecutablePath(execpath, &nsexeclength) != 0 + || (wchar_t)execpath[0] != SEP) + { + /* _NSGetExecutablePath() failed or the path is relative */ + return _PyStatus_OK(); + } + + size_t len; + *abs_path_p = Py_DecodeLocale(execpath, &len); + if (*abs_path_p == NULL) { + return DECODE_LOCALE_ERR("executable path", len); + } + return _PyStatus_OK(); +} +#endif /* __APPLE__ */ + + +static PyStatus +calculate_program_impl(PyCalculatePath *calculate, _PyPathConfig *pathconfig) +{ + assert(pathconfig->program_full_path == NULL); + + PyStatus status; /* If there is no slash in the argv0 path, then we have to * assume python is on the user's $PATH, since there's no @@ -790,98 +969,40 @@ calculate_program_full_path(PyCalculatePath *calculate, _PyPathConfig *pathconfi * $PATH isn't exported, you lose. */ if (wcschr(pathconfig->program_name, SEP)) { - if (safe_wcscpy(program_full_path, pathconfig->program_name, - program_full_path_len) < 0) { - return PATHLEN_ERR(); + pathconfig->program_full_path = _PyMem_RawWcsdup(pathconfig->program_name); + if (pathconfig->program_full_path == NULL) { + return _PyStatus_NO_MEMORY(); } + return _PyStatus_OK(); } + #ifdef __APPLE__ - /* On Mac OS X, if a script uses an interpreter of the form - * "#!/opt/python2.3/bin/python", the kernel only passes "python" - * as argv[0], which falls through to the $PATH search below. - * If /opt/python2.3/bin isn't in your path, or is near the end, - * this algorithm may incorrectly find /usr/bin/python. To work - * around this, we can use _NSGetExecutablePath to get a better - * hint of what the intended interpreter was, although this - * will fail if a relative path was used. but in that case, - * absolutize() should help us out below - */ - else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) && - execpath[0] == SEP) - { - size_t len; - wchar_t *path = Py_DecodeLocale(execpath, &len); - if (path == NULL) { - return DECODE_LOCALE_ERR("executable path", len); - } - if (safe_wcscpy(program_full_path, path, program_full_path_len) < 0) { - PyMem_RawFree(path); - return PATHLEN_ERR(); - } - PyMem_RawFree(path); + wchar_t *abs_path = NULL; + status = calculate_program_macos(&abs_path); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + if (abs_path) { + pathconfig->program_full_path = abs_path; + return _PyStatus_OK(); } #endif /* __APPLE__ */ - else if (calculate->path_env) { - wchar_t *path = calculate->path_env; - while (1) { - wchar_t *delim = wcschr(path, DELIM); - - if (delim) { - size_t len = delim - path; - if (len >= program_full_path_len) { - return PATHLEN_ERR(); - } - wcsncpy(program_full_path, path, len); - program_full_path[len] = '\0'; - } - else { - if (safe_wcscpy(program_full_path, path, - program_full_path_len) < 0) { - return PATHLEN_ERR(); - } - } - - status = joinpath(program_full_path, pathconfig->program_name, - program_full_path_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - if (isxfile(program_full_path)) { - break; - } - if (!delim) { - program_full_path[0] = L'\0'; - break; - } - path = delim + 1; - } - } - else { - program_full_path[0] = '\0'; - } - if (program_full_path[0] != SEP && program_full_path[0] != '\0') { - status = absolutize(program_full_path, program_full_path_len); + if (calculate->path_env) { + wchar_t *abs_path = NULL; + status = calculate_which(calculate->path_env, pathconfig->program_name, + &abs_path); if (_PyStatus_EXCEPTION(status)) { return status; } - } -#if defined(__CYGWIN__) || defined(__MINGW32__) - /* For these platforms it is necessary to ensure that the .exe suffix - * is appended to the filename, otherwise there is potential for - * sys.executable to return the name of a directory under the same - * path (bpo-28441). - */ - if (program_full_path[0] != '\0') { - status = add_exe_suffix(program_full_path, program_full_path_len); - if (_PyStatus_EXCEPTION(status)) { - return status; + if (abs_path) { + pathconfig->program_full_path = abs_path; + return _PyStatus_OK(); } } -#endif - pathconfig->program_full_path = _PyMem_RawWcsdup(program_full_path); + /* In the last resort, use an empty string */ + pathconfig->program_full_path = _PyMem_RawWcsdup(L""); if (pathconfig->program_full_path == NULL) { return _PyStatus_NO_MEMORY(); } @@ -889,159 +1010,281 @@ calculate_program_full_path(PyCalculatePath *calculate, _PyPathConfig *pathconfi } +/* Calculate pathconfig->program_full_path */ static PyStatus -calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_path, - wchar_t *argv0_path, size_t argv0_path_len) +calculate_program(PyCalculatePath *calculate, _PyPathConfig *pathconfig) { - if (safe_wcscpy(argv0_path, program_full_path, argv0_path_len) < 0) { - return PATHLEN_ERR(); + PyStatus status; + + status = calculate_program_impl(calculate, pathconfig); + if (_PyStatus_EXCEPTION(status)) { + return status; } -#ifdef WITH_NEXT_FRAMEWORK - NSModule pythonModule; + if (pathconfig->program_full_path[0] != '\0') { + /* program_full_path is not empty */ - /* On Mac OS X we have a special case if we're running from a framework. - ** This is because the python home should be set relative to the library, - ** which is in the framework, not relative to the executable, which may - ** be outside of the framework. Except when we're in the build directory... - */ - pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize")); - /* Use dylib functions to find out where the framework was loaded from */ - const char* modPath = NSLibraryNameForModule(pythonModule); - if (modPath != NULL) { - /* We're in a framework. */ - /* See if we might be in the build directory. The framework in the - ** build directory is incomplete, it only has the .dylib and a few - ** needed symlinks, it doesn't have the Lib directories and such. - ** If we're running with the framework from the build directory we must - ** be running the interpreter in the build directory, so we use the - ** build-directory-specific logic to find Lib and such. - */ - PyStatus status; - size_t len; - wchar_t* wbuf = Py_DecodeLocale(modPath, &len); - if (wbuf == NULL) { - return DECODE_LOCALE_ERR("framework location", len); - } - - if (safe_wcscpy(argv0_path, wbuf, argv0_path_len) < 0) { - return PATHLEN_ERR(); - } - reduce(argv0_path); - status = joinpath(argv0_path, calculate->lib_python, argv0_path_len); - if (_PyStatus_EXCEPTION(status)) { - PyMem_RawFree(wbuf); - return status; + /* Make sure that program_full_path is an absolute path */ + if (!_Py_isabs(pathconfig->program_full_path)) { + status = absolutize(&pathconfig->program_full_path); + if (_PyStatus_EXCEPTION(status)) { + return status; + } } - status = joinpath(argv0_path, LANDMARK, argv0_path_len); + +#if defined(__CYGWIN__) || defined(__MINGW32__) + /* For these platforms it is necessary to ensure that the .exe suffix + * is appended to the filename, otherwise there is potential for + * sys.executable to return the name of a directory under the same + * path (bpo-28441). + */ + status = add_exe_suffix(&pathconfig->program_full_path); if (_PyStatus_EXCEPTION(status)) { - PyMem_RawFree(wbuf); return status; } - if (!ismodule(argv0_path, Py_ARRAY_LENGTH(argv0_path))) { - /* We are in the build directory so use the name of the - executable - we know that the absolute path is passed */ - if (safe_wcscpy(argv0_path, program_full_path, - argv0_path_len) < 0) { - return PATHLEN_ERR(); - } - } - else { - /* Use the location of the library as the program_full_path */ - if (safe_wcscpy(argv0_path, wbuf, argv0_path_len) < 0) { - return PATHLEN_ERR(); - } - } - PyMem_RawFree(wbuf); - } #endif + } + return _PyStatus_OK(); +} + #if HAVE_READLINK - wchar_t tmpbuffer[MAXPATHLEN + 1]; - const size_t buflen = Py_ARRAY_LENGTH(tmpbuffer); - int linklen = _Py_wreadlink(program_full_path, tmpbuffer, buflen); - while (linklen != -1) { - if (tmpbuffer[0] == SEP) { - /* tmpbuffer should never be longer than MAXPATHLEN, - but extra check does not hurt */ - if (safe_wcscpy(argv0_path, tmpbuffer, argv0_path_len) < 0) { - return PATHLEN_ERR(); +static PyStatus +resolve_symlinks(wchar_t **path_p) +{ + wchar_t new_path[MAXPATHLEN + 1]; + const size_t new_path_len = Py_ARRAY_LENGTH(new_path); + unsigned int nlink = 0; + + while (1) { + int linklen = _Py_wreadlink(*path_p, new_path, new_path_len); + if (linklen == -1) { + /* not a symbolic link: we are done */ + break; + } + + if (_Py_isabs(new_path)) { + PyMem_RawFree(*path_p); + *path_p = _PyMem_RawWcsdup(new_path); + if (*path_p == NULL) { + return _PyStatus_NO_MEMORY(); } } else { - /* Interpret relative to program_full_path */ - PyStatus status; - reduce(argv0_path); - status = joinpath(argv0_path, tmpbuffer, argv0_path_len); - if (_PyStatus_EXCEPTION(status)) { - return status; + /* new_path is relative to path */ + reduce(*path_p); + + wchar_t *abs_path = joinpath2(*path_p, new_path); + if (abs_path == NULL) { + return _PyStatus_NO_MEMORY(); } + + PyMem_RawFree(*path_p); + *path_p = abs_path; + } + + nlink++; + /* 40 is the Linux kernel 4.2 limit */ + if (nlink >= 40) { + return _PyStatus_ERR("maximum number of symbolic links reached"); } - linklen = _Py_wreadlink(argv0_path, tmpbuffer, buflen); } + return _PyStatus_OK(); +} #endif /* HAVE_READLINK */ - reduce(argv0_path); - /* At this point, argv0_path is guaranteed to be less than - MAXPATHLEN bytes long. */ + +#ifdef WITH_NEXT_FRAMEWORK +static PyStatus +calculate_argv0_path_framework(PyCalculatePath *calculate, _PyPathConfig *pathconfig) +{ + NSModule pythonModule; + + /* On Mac OS X we have a special case if we're running from a framework. + This is because the python home should be set relative to the library, + which is in the framework, not relative to the executable, which may + be outside of the framework. Except when we're in the build + directory... */ + pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize")); + + /* Use dylib functions to find out where the framework was loaded from */ + const char* modPath = NSLibraryNameForModule(pythonModule); + if (modPath == NULL) { + return _PyStatus_OK(); + } + + /* We're in a framework. + See if we might be in the build directory. The framework in the + build directory is incomplete, it only has the .dylib and a few + needed symlinks, it doesn't have the Lib directories and such. + If we're running with the framework from the build directory we must + be running the interpreter in the build directory, so we use the + build-directory-specific logic to find Lib and such. */ + size_t len; + wchar_t* wbuf = Py_DecodeLocale(modPath, &len); + if (wbuf == NULL) { + return DECODE_LOCALE_ERR("framework location", len); + } + + /* Path: reduce(modPath) / lib_python / LANDMARK */ + PyStatus status; + + wchar_t *parent = _PyMem_RawWcsdup(wbuf); + if (parent == NULL) { + status = _PyStatus_NO_MEMORY(); + goto done; + } + + reduce(parent); + wchar_t *lib_python = joinpath2(parent, calculate->lib_python); + PyMem_RawFree(parent); + + if (lib_python == NULL) { + status = _PyStatus_NO_MEMORY(); + goto done; + } + + int module; + status = ismodule(lib_python, &module); + PyMem_RawFree(lib_python); + + if (_PyStatus_EXCEPTION(status)) { + goto done; + } + if (!module) { + /* We are in the build directory so use the name of the + executable - we know that the absolute path is passed */ + PyMem_RawFree(calculate->argv0_path); + calculate->argv0_path = _PyMem_RawWcsdup(pathconfig->program_full_path); + if (calculate->argv0_path == NULL) { + status = _PyStatus_NO_MEMORY(); + goto done; + } + + status = _PyStatus_OK(); + goto done; + } + + /* Use the location of the library as argv0_path */ + PyMem_RawFree(calculate->argv0_path); + calculate->argv0_path = wbuf; return _PyStatus_OK(); + +done: + PyMem_RawFree(wbuf); + return status; } +#endif -/* Search for an "pyvenv.cfg" environment configuration file, first in the - executable's directory and then in the parent directory. - If found, open it for use when searching for prefixes. -*/ static PyStatus -calculate_read_pyenv(PyCalculatePath *calculate, - wchar_t *argv0_path, size_t argv0_path_len) +calculate_argv0_path(PyCalculatePath *calculate, + _PyPathConfig *pathconfig) { PyStatus status; - const wchar_t *env_cfg = L"pyvenv.cfg"; - FILE *env_file; - wchar_t filename[MAXPATHLEN+1]; - const size_t filename_len = Py_ARRAY_LENGTH(filename); - memset(filename, 0, sizeof(filename)); + calculate->argv0_path = _PyMem_RawWcsdup(pathconfig->program_full_path); + if (calculate->argv0_path == NULL) { + return _PyStatus_NO_MEMORY(); + } - /* Filename: / "pyvenv.cfg" */ - if (safe_wcscpy(filename, argv0_path, filename_len) < 0) { - return PATHLEN_ERR(); +#ifdef WITH_NEXT_FRAMEWORK + status = calculate_argv0_path_framework(calculate, pathconfig); + if (_PyStatus_EXCEPTION(status)) { + return status; } +#endif - status = joinpath(filename, env_cfg, filename_len); + status = resolve_symlinks(&calculate->argv0_path); if (_PyStatus_EXCEPTION(status)) { return status; } - env_file = _Py_wfopen(filename, L"r"); - if (env_file == NULL) { + + reduce(calculate->argv0_path); + + return _PyStatus_OK(); +} + + +static PyStatus +calculate_open_pyenv(PyCalculatePath *calculate, FILE **env_file_p) +{ + *env_file_p = NULL; + + const wchar_t *env_cfg = L"pyvenv.cfg"; + + /* Filename: / "pyvenv.cfg" */ + wchar_t *filename = joinpath2(calculate->argv0_path, env_cfg); + if (filename == NULL) { + return _PyStatus_NO_MEMORY(); + } + + *env_file_p = _Py_wfopen(filename, L"r"); + PyMem_RawFree(filename); + + if (*env_file_p != NULL) { + return _PyStatus_OK(); + + } + + /* fopen() failed: reset errno */ + errno = 0; + + /* Path: / "pyvenv.cfg" */ + wchar_t *parent = _PyMem_RawWcsdup(calculate->argv0_path); + if (parent == NULL) { + return _PyStatus_NO_MEMORY(); + } + reduce(parent); + + filename = joinpath2(parent, env_cfg); + PyMem_RawFree(parent); + if (filename == NULL) { + return _PyStatus_NO_MEMORY(); + } + + *env_file_p = _Py_wfopen(filename, L"r"); + PyMem_RawFree(filename); + + if (*env_file_p == NULL) { + /* fopen() failed: reset errno */ errno = 0; + } + return _PyStatus_OK(); +} - /* Filename: / "pyvenv.cfg" */ - reduce(filename); - reduce(filename); - status = joinpath(filename, env_cfg, filename_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - env_file = _Py_wfopen(filename, L"r"); - if (env_file == NULL) { - errno = 0; - return _PyStatus_OK(); - } +/* Search for an "pyvenv.cfg" environment configuration file, first in the + executable's directory and then in the parent directory. + If found, open it for use when searching for prefixes. + + Write the 'home' variable of pyvenv.cfg into calculate->argv0_path. */ +static PyStatus +calculate_read_pyenv(PyCalculatePath *calculate) +{ + PyStatus status; + FILE *env_file = NULL; + + status = calculate_open_pyenv(calculate, &env_file); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + if (env_file == NULL) { + /* pyvenv.cfg not found */ + return _PyStatus_OK(); } /* Look for a 'home' variable and set argv0_path to it, if found */ - wchar_t home[MAXPATHLEN+1]; - memset(home, 0, sizeof(home)); + wchar_t *home = NULL; + status = _Py_FindEnvConfigValue(env_file, L"home", &home); + if (_PyStatus_EXCEPTION(status)) { + fclose(env_file); + return status; + } - if (_Py_FindEnvConfigValue(env_file, L"home", - home, Py_ARRAY_LENGTH(home))) { - if (safe_wcscpy(argv0_path, home, argv0_path_len) < 0) { - fclose(env_file); - return PATHLEN_ERR(); - } + if (home) { + PyMem_RawFree(calculate->argv0_path); + calculate->argv0_path = home; } fclose(env_file); return _PyStatus_OK(); @@ -1049,43 +1292,57 @@ calculate_read_pyenv(PyCalculatePath *calculate, static PyStatus -calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix, - wchar_t *zip_path, size_t zip_path_len) +calculate_zip_path(PyCalculatePath *calculate) { - PyStatus status; + PyStatus res; + + /* Path: / "pythonXY.zip" */ + wchar_t *path = joinpath2(calculate->platlibdir, + L"python" Py_STRINGIFY(PY_MAJOR_VERSION) Py_STRINGIFY(PY_MINOR_VERSION) + L".zip"); + if (path == NULL) { + return _PyStatus_NO_MEMORY(); + } if (calculate->prefix_found > 0) { - /* Use the reduced prefix returned by Py_GetPrefix() */ - if (safe_wcscpy(zip_path, prefix, zip_path_len) < 0) { - return PATHLEN_ERR(); + /* Use the reduced prefix returned by Py_GetPrefix() + + Path: / / "pythonXY.zip" */ + wchar_t *parent = _PyMem_RawWcsdup(calculate->prefix); + if (parent == NULL) { + res = _PyStatus_NO_MEMORY(); + goto done; } - reduce(zip_path); - reduce(zip_path); + reduce(parent); + reduce(parent); + calculate->zip_path = joinpath2(parent, path); + PyMem_RawFree(parent); } else { - if (safe_wcscpy(zip_path, calculate->prefix, zip_path_len) < 0) { - return PATHLEN_ERR(); - } + calculate->zip_path = joinpath2(calculate->prefix_macro, path); } - status = joinpath(zip_path, L"lib/python00.zip", zip_path_len); - if (_PyStatus_EXCEPTION(status)) { - return status; + + if (calculate->zip_path == NULL) { + res = _PyStatus_NO_MEMORY(); + goto done; } /* Replace "00" with version */ - size_t bufsz = wcslen(zip_path); - zip_path[bufsz - 6] = VERSION[0]; - zip_path[bufsz - 5] = VERSION[2]; - return _PyStatus_OK(); + size_t len = wcslen(calculate->zip_path); + calculate->zip_path[len - 6] = VERSION[0]; + calculate->zip_path[len - 5] = VERSION[2]; + + res = _PyStatus_OK(); + +done: + PyMem_RawFree(path); + return res; } static PyStatus calculate_module_search_path(PyCalculatePath *calculate, - _PyPathConfig *pathconfig, - const wchar_t *prefix, - const wchar_t *exec_prefix, - const wchar_t *zip_path) + _PyPathConfig *pathconfig) { /* Calculate size of return buffer */ size_t bufsz = 0; @@ -1093,12 +1350,12 @@ calculate_module_search_path(PyCalculatePath *calculate, bufsz += wcslen(calculate->pythonpath_env) + 1; } - wchar_t *defpath = calculate->pythonpath; - size_t prefixsz = wcslen(prefix) + 1; + wchar_t *defpath = calculate->pythonpath_macro; + size_t prefixsz = wcslen(calculate->prefix) + 1; while (1) { wchar_t *delim = wcschr(defpath, DELIM); - if (defpath[0] != SEP) { + if (!_Py_isabs(defpath)) { /* Paths are relative to prefix */ bufsz += prefixsz; } @@ -1113,8 +1370,8 @@ calculate_module_search_path(PyCalculatePath *calculate, defpath = delim + 1; } - bufsz += wcslen(zip_path) + 1; - bufsz += wcslen(exec_prefix) + 1; + bufsz += wcslen(calculate->zip_path) + 1; + bufsz += wcslen(calculate->exec_prefix) + 1; /* Allocate the buffer */ wchar_t *buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t)); @@ -1130,19 +1387,19 @@ calculate_module_search_path(PyCalculatePath *calculate, } /* Next is the default zip path */ - wcscat(buf, zip_path); + wcscat(buf, calculate->zip_path); wcscat(buf, delimiter); /* Next goes merge of compile-time $PYTHONPATH with * dynamically located prefix. */ - defpath = calculate->pythonpath; + defpath = calculate->pythonpath_macro; while (1) { wchar_t *delim = wcschr(defpath, DELIM); - if (defpath[0] != SEP) { - wcscat(buf, prefix); - if (prefixsz >= 2 && prefix[prefixsz - 2] != SEP && + if (!_Py_isabs(defpath)) { + wcscat(buf, calculate->prefix); + if (prefixsz >= 2 && calculate->prefix[prefixsz - 2] != SEP && defpath[0] != (delim ? DELIM : L'\0')) { /* not empty */ @@ -1165,7 +1422,7 @@ calculate_module_search_path(PyCalculatePath *calculate, wcscat(buf, delimiter); /* Finally, on goes the directory for dynamic-load modules */ - wcscat(buf, exec_prefix); + wcscat(buf, calculate->exec_prefix); pathconfig->module_search_path = buf; return _PyStatus_OK(); @@ -1176,6 +1433,11 @@ static PyStatus calculate_init(PyCalculatePath *calculate, const PyConfig *config) { size_t len; + + calculate->warnings = config->pathconfig_warnings; + calculate->pythonpath_env = config->pythonpath_env; + calculate->platlibdir = config->platlibdir; + const char *path = getenv("PATH"); if (path) { calculate->path_env = Py_DecodeLocale(path, &len); @@ -1184,26 +1446,34 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config) } } - calculate->pythonpath = Py_DecodeLocale(PYTHONPATH, &len); - if (!calculate->pythonpath) { - return DECODE_LOCALE_ERR("PYTHONPATH define", len); + /* Decode macros */ + calculate->pythonpath_macro = Py_DecodeLocale(PYTHONPATH, &len); + if (!calculate->pythonpath_macro) { + return DECODE_LOCALE_ERR("PYTHONPATH macro", len); } - - calculate->prefix = Py_DecodeLocale(PREFIX, &len); - if (!calculate->prefix) { - return DECODE_LOCALE_ERR("PREFIX define", len); + calculate->prefix_macro = Py_DecodeLocale(PREFIX, &len); + if (!calculate->prefix_macro) { + return DECODE_LOCALE_ERR("PREFIX macro", len); } - calculate->exec_prefix = Py_DecodeLocale(EXEC_PREFIX, &len); - if (!calculate->exec_prefix) { - return DECODE_LOCALE_ERR("EXEC_PREFIX define", len); + calculate->exec_prefix_macro = Py_DecodeLocale(EXEC_PREFIX, &len); + if (!calculate->exec_prefix_macro) { + return DECODE_LOCALE_ERR("EXEC_PREFIX macro", len); } - calculate->lib_python = Py_DecodeLocale("lib/python" VERSION, &len); - if (!calculate->lib_python) { - return DECODE_LOCALE_ERR("EXEC_PREFIX define", len); + calculate->vpath_macro = Py_DecodeLocale(VPATH, &len); + if (!calculate->vpath_macro) { + return DECODE_LOCALE_ERR("VPATH macro", len); } - calculate->warnings = config->pathconfig_warnings; - calculate->pythonpath_env = config->pythonpath_env; + // / "pythonX.Y" + wchar_t *pyversion = Py_DecodeLocale("python" VERSION, &len); + if (!pyversion) { + return DECODE_LOCALE_ERR("VERSION macro", len); + } + calculate->lib_python = joinpath2(config->platlibdir, pyversion); + PyMem_RawFree(pyversion); + if (calculate->lib_python == NULL) { + return _PyStatus_NO_MEMORY(); + } return _PyStatus_OK(); } @@ -1212,11 +1482,16 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config) static void calculate_free(PyCalculatePath *calculate) { - PyMem_RawFree(calculate->pythonpath); - PyMem_RawFree(calculate->prefix); - PyMem_RawFree(calculate->exec_prefix); + PyMem_RawFree(calculate->pythonpath_macro); + PyMem_RawFree(calculate->prefix_macro); + PyMem_RawFree(calculate->exec_prefix_macro); + PyMem_RawFree(calculate->vpath_macro); PyMem_RawFree(calculate->lib_python); PyMem_RawFree(calculate->path_env); + PyMem_RawFree(calculate->zip_path); + PyMem_RawFree(calculate->argv0_path); + PyMem_RawFree(calculate->prefix); + PyMem_RawFree(calculate->exec_prefix); } @@ -1226,84 +1501,66 @@ calculate_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) PyStatus status; if (pathconfig->program_full_path == NULL) { - status = calculate_program_full_path(calculate, pathconfig); + status = calculate_program(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } } - wchar_t argv0_path[MAXPATHLEN+1]; - memset(argv0_path, 0, sizeof(argv0_path)); - - status = calculate_argv0_path(calculate, pathconfig->program_full_path, - argv0_path, Py_ARRAY_LENGTH(argv0_path)); + status = calculate_argv0_path(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } /* If a pyvenv.cfg configure file is found, argv0_path is overriden with its 'home' variable. */ - status = calculate_read_pyenv(calculate, - argv0_path, Py_ARRAY_LENGTH(argv0_path)); + status = calculate_read_pyenv(calculate); if (_PyStatus_EXCEPTION(status)) { return status; } - wchar_t prefix[MAXPATHLEN+1]; - memset(prefix, 0, sizeof(prefix)); - status = calculate_prefix(calculate, pathconfig, - argv0_path, - prefix, Py_ARRAY_LENGTH(prefix)); + status = calculate_prefix(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } - wchar_t zip_path[MAXPATHLEN+1]; /* ".../lib/pythonXY.zip" */ - memset(zip_path, 0, sizeof(zip_path)); - - status = calculate_zip_path(calculate, prefix, - zip_path, Py_ARRAY_LENGTH(zip_path)); + status = calculate_zip_path(calculate); if (_PyStatus_EXCEPTION(status)) { return status; } - wchar_t exec_prefix[MAXPATHLEN+1]; - memset(exec_prefix, 0, sizeof(exec_prefix)); - status = calculate_exec_prefix(calculate, pathconfig, argv0_path, - exec_prefix, Py_ARRAY_LENGTH(exec_prefix)); + status = calculate_exec_prefix(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } - if ((!calculate->prefix_found || !calculate->exec_prefix_found) && - calculate->warnings) + if ((!calculate->prefix_found || !calculate->exec_prefix_found) + && calculate->warnings) { fprintf(stderr, "Consider setting $PYTHONHOME to [:]\n"); } if (pathconfig->module_search_path == NULL) { - status = calculate_module_search_path(calculate, pathconfig, - prefix, exec_prefix, zip_path); + status = calculate_module_search_path(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } } if (pathconfig->prefix == NULL) { - status = calculate_set_prefix(calculate, pathconfig, prefix); + status = calculate_set_prefix(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } } if (pathconfig->exec_prefix == NULL) { - status = calculate_set_exec_prefix(calculate, pathconfig, exec_prefix); + status = calculate_set_exec_prefix(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } } - return _PyStatus_OK(); } @@ -1355,6 +1612,10 @@ _PyPathConfig_Calculate(_PyPathConfig *pathconfig, const PyConfig *config) goto done; } + /* program_full_path must an either an empty string or an absolute path */ + assert(wcslen(pathconfig->program_full_path) == 0 + || _Py_isabs(pathconfig->program_full_path)); + status = _PyStatus_OK(); done: diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c index ab766b98..cdb3ae85 100644 --- a/Modules/grpmodule.c +++ b/Modules/grpmodule.c @@ -34,8 +34,21 @@ static PyStructSequence_Desc struct_group_type_desc = { }; -static int initialized; -static PyTypeObject StructGrpType; +typedef struct { + PyTypeObject *StructGrpType; +} grpmodulestate; + +static inline grpmodulestate* +get_grp_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (grpmodulestate *)state; +} + +#define modulestate_global get_grp_state(PyState_FindModule(&grpmodule)) + +static struct PyModuleDef grpmodule; #define DEFAULT_BUFFER_SIZE 1024 @@ -43,10 +56,10 @@ static PyObject * mkgrent(struct group *p) { int setIndex = 0; - PyObject *v = PyStructSequence_New(&StructGrpType), *w; + PyObject *v, *w; char **member; - if (v == NULL) + if ((v = PyStructSequence_New(modulestate_global->StructGrpType)) == NULL) return NULL; if ((w = PyList_New(0)) == NULL) { @@ -111,7 +124,7 @@ grp_getgrgid_impl(PyObject *module, PyObject *id) PyErr_Clear(); if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "group id must be int, not %.200", - id->ob_type->tp_name) < 0) { + Py_TYPE(id)->tp_name) < 0) { return NULL; } py_int_id = PyNumber_Long(id); @@ -314,36 +327,52 @@ users are not explicitly listed as members of the groups they are in\n\ according to the password database. Check both databases to get\n\ complete membership information.)"); +static int grpmodule_traverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(get_grp_state(m)->StructGrpType); + return 0; +} + +static int grpmodule_clear(PyObject *m) { + Py_CLEAR(get_grp_state(m)->StructGrpType); + return 0; +} +static void grpmodule_free(void *m) { + grpmodule_clear((PyObject *)m); +} static struct PyModuleDef grpmodule = { PyModuleDef_HEAD_INIT, "grp", grp__doc__, - -1, + sizeof(grpmodulestate), grp_methods, NULL, - NULL, - NULL, - NULL + grpmodule_traverse, + grpmodule_clear, + grpmodule_free, }; PyMODINIT_FUNC PyInit_grp(void) { - PyObject *m, *d; - m = PyModule_Create(&grpmodule); - if (m == NULL) + PyObject *m; + if ((m = PyState_FindModule(&grpmodule)) != NULL) { + Py_INCREF(m); + return m; + } + + if ((m = PyModule_Create(&grpmodule)) == NULL) { return NULL; - d = PyModule_GetDict(m); - if (!initialized) { - if (PyStructSequence_InitType2(&StructGrpType, - &struct_group_type_desc) < 0) - return NULL; } - if (PyDict_SetItemString(d, "struct_group", - (PyObject *)&StructGrpType) < 0) + + grpmodulestate *state = PyModule_GetState(m); + state->StructGrpType = PyStructSequence_NewType(&struct_group_type_desc); + if (state->StructGrpType == NULL) { return NULL; - initialized = 1; + } + + Py_INCREF(state->StructGrpType); + PyModule_AddObject(m, "struct_group", (PyObject *) state->StructGrpType); return m; } diff --git a/Modules/hashtable.c b/Modules/hashtable.c deleted file mode 100644 index 4a36a1e7..00000000 --- a/Modules/hashtable.c +++ /dev/null @@ -1,524 +0,0 @@ -/* The implementation of the hash table (_Py_hashtable_t) is based on the - cfuhash project: - http://sourceforge.net/projects/libcfu/ - - Copyright of cfuhash: - ---------------------------------- - Creation date: 2005-06-24 21:22:40 - Authors: Don - Change log: - - Copyright (c) 2005 Don Owens - All rights reserved. - - This code is released under the BSD license: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - ---------------------------------- -*/ - -#include "Python.h" -#include "hashtable.h" - -#define HASHTABLE_MIN_SIZE 16 -#define HASHTABLE_HIGH 0.50 -#define HASHTABLE_LOW 0.10 -#define HASHTABLE_REHASH_FACTOR 2.0 / (HASHTABLE_LOW + HASHTABLE_HIGH) - -#define BUCKETS_HEAD(SLIST) \ - ((_Py_hashtable_entry_t *)_Py_SLIST_HEAD(&(SLIST))) -#define TABLE_HEAD(HT, BUCKET) \ - ((_Py_hashtable_entry_t *)_Py_SLIST_HEAD(&(HT)->buckets[BUCKET])) -#define ENTRY_NEXT(ENTRY) \ - ((_Py_hashtable_entry_t *)_Py_SLIST_ITEM_NEXT(ENTRY)) -#define HASHTABLE_ITEM_SIZE(HT) \ - (sizeof(_Py_hashtable_entry_t) + (HT)->key_size + (HT)->data_size) - -#define ENTRY_READ_PDATA(TABLE, ENTRY, DATA_SIZE, PDATA) \ - do { \ - assert((DATA_SIZE) == (TABLE)->data_size); \ - memcpy((PDATA), _Py_HASHTABLE_ENTRY_PDATA(TABLE, (ENTRY)), \ - (DATA_SIZE)); \ - } while (0) - -#define ENTRY_WRITE_PDATA(TABLE, ENTRY, DATA_SIZE, PDATA) \ - do { \ - assert((DATA_SIZE) == (TABLE)->data_size); \ - memcpy((void *)_Py_HASHTABLE_ENTRY_PDATA((TABLE), (ENTRY)), \ - (PDATA), (DATA_SIZE)); \ - } while (0) - -/* Forward declaration */ -static void hashtable_rehash(_Py_hashtable_t *ht); - -static void -_Py_slist_init(_Py_slist_t *list) -{ - list->head = NULL; -} - - -static void -_Py_slist_prepend(_Py_slist_t *list, _Py_slist_item_t *item) -{ - item->next = list->head; - list->head = item; -} - - -static void -_Py_slist_remove(_Py_slist_t *list, _Py_slist_item_t *previous, - _Py_slist_item_t *item) -{ - if (previous != NULL) - previous->next = item->next; - else - list->head = item->next; -} - - -Py_uhash_t -_Py_hashtable_hash_ptr(struct _Py_hashtable_t *ht, const void *pkey) -{ - void *key; - - _Py_HASHTABLE_READ_KEY(ht, pkey, key); - return (Py_uhash_t)_Py_HashPointer(key); -} - - -int -_Py_hashtable_compare_direct(_Py_hashtable_t *ht, const void *pkey, - const _Py_hashtable_entry_t *entry) -{ - const void *pkey2 = _Py_HASHTABLE_ENTRY_PKEY(entry); - return (memcmp(pkey, pkey2, ht->key_size) == 0); -} - - -/* makes sure the real size of the buckets array is a power of 2 */ -static size_t -round_size(size_t s) -{ - size_t i; - if (s < HASHTABLE_MIN_SIZE) - return HASHTABLE_MIN_SIZE; - i = 1; - while (i < s) - i <<= 1; - return i; -} - - -_Py_hashtable_t * -_Py_hashtable_new_full(size_t key_size, size_t data_size, - size_t init_size, - _Py_hashtable_hash_func hash_func, - _Py_hashtable_compare_func compare_func, - _Py_hashtable_allocator_t *allocator) -{ - _Py_hashtable_t *ht; - size_t buckets_size; - _Py_hashtable_allocator_t alloc; - - if (allocator == NULL) { - alloc.malloc = PyMem_RawMalloc; - alloc.free = PyMem_RawFree; - } - else - alloc = *allocator; - - ht = (_Py_hashtable_t *)alloc.malloc(sizeof(_Py_hashtable_t)); - if (ht == NULL) - return ht; - - ht->num_buckets = round_size(init_size); - ht->entries = 0; - ht->key_size = key_size; - ht->data_size = data_size; - - buckets_size = ht->num_buckets * sizeof(ht->buckets[0]); - ht->buckets = alloc.malloc(buckets_size); - if (ht->buckets == NULL) { - alloc.free(ht); - return NULL; - } - memset(ht->buckets, 0, buckets_size); - - ht->hash_func = hash_func; - ht->compare_func = compare_func; - ht->alloc = alloc; - return ht; -} - - -_Py_hashtable_t * -_Py_hashtable_new(size_t key_size, size_t data_size, - _Py_hashtable_hash_func hash_func, - _Py_hashtable_compare_func compare_func) -{ - return _Py_hashtable_new_full(key_size, data_size, - HASHTABLE_MIN_SIZE, - hash_func, compare_func, - NULL); -} - - -size_t -_Py_hashtable_size(_Py_hashtable_t *ht) -{ - size_t size; - - size = sizeof(_Py_hashtable_t); - - /* buckets */ - size += ht->num_buckets * sizeof(_Py_hashtable_entry_t *); - - /* entries */ - size += ht->entries * HASHTABLE_ITEM_SIZE(ht); - - return size; -} - - -#ifdef Py_DEBUG -void -_Py_hashtable_print_stats(_Py_hashtable_t *ht) -{ - size_t size; - size_t chain_len, max_chain_len, total_chain_len, nchains; - _Py_hashtable_entry_t *entry; - size_t hv; - double load; - - size = _Py_hashtable_size(ht); - - load = (double)ht->entries / ht->num_buckets; - - max_chain_len = 0; - total_chain_len = 0; - nchains = 0; - for (hv = 0; hv < ht->num_buckets; hv++) { - entry = TABLE_HEAD(ht, hv); - if (entry != NULL) { - chain_len = 0; - for (; entry; entry = ENTRY_NEXT(entry)) { - chain_len++; - } - if (chain_len > max_chain_len) - max_chain_len = chain_len; - total_chain_len += chain_len; - nchains++; - } - } - printf("hash table %p: entries=%" - PY_FORMAT_SIZE_T "u/%" PY_FORMAT_SIZE_T "u (%.0f%%), ", - (void *)ht, ht->entries, ht->num_buckets, load * 100.0); - if (nchains) - printf("avg_chain_len=%.1f, ", (double)total_chain_len / nchains); - printf("max_chain_len=%" PY_FORMAT_SIZE_T "u, %" PY_FORMAT_SIZE_T "u KiB\n", - max_chain_len, size / 1024); -} -#endif - - -_Py_hashtable_entry_t * -_Py_hashtable_get_entry(_Py_hashtable_t *ht, - size_t key_size, const void *pkey) -{ - Py_uhash_t key_hash; - size_t index; - _Py_hashtable_entry_t *entry; - - assert(key_size == ht->key_size); - - key_hash = ht->hash_func(ht, pkey); - index = key_hash & (ht->num_buckets - 1); - - for (entry = TABLE_HEAD(ht, index); entry != NULL; entry = ENTRY_NEXT(entry)) { - if (entry->key_hash == key_hash && ht->compare_func(ht, pkey, entry)) - break; - } - - return entry; -} - - -static int -_Py_hashtable_pop_entry(_Py_hashtable_t *ht, size_t key_size, const void *pkey, - void *data, size_t data_size) -{ - Py_uhash_t key_hash; - size_t index; - _Py_hashtable_entry_t *entry, *previous; - - assert(key_size == ht->key_size); - - key_hash = ht->hash_func(ht, pkey); - index = key_hash & (ht->num_buckets - 1); - - previous = NULL; - for (entry = TABLE_HEAD(ht, index); entry != NULL; entry = ENTRY_NEXT(entry)) { - if (entry->key_hash == key_hash && ht->compare_func(ht, pkey, entry)) - break; - previous = entry; - } - - if (entry == NULL) - return 0; - - _Py_slist_remove(&ht->buckets[index], (_Py_slist_item_t *)previous, - (_Py_slist_item_t *)entry); - ht->entries--; - - if (data != NULL) - ENTRY_READ_PDATA(ht, entry, data_size, data); - ht->alloc.free(entry); - - if ((float)ht->entries / (float)ht->num_buckets < HASHTABLE_LOW) - hashtable_rehash(ht); - return 1; -} - - -int -_Py_hashtable_set(_Py_hashtable_t *ht, size_t key_size, const void *pkey, - size_t data_size, const void *data) -{ - Py_uhash_t key_hash; - size_t index; - _Py_hashtable_entry_t *entry; - - assert(key_size == ht->key_size); - - assert(data != NULL || data_size == 0); -#ifndef NDEBUG - /* Don't write the assertion on a single line because it is interesting - to know the duplicated entry if the assertion failed. The entry can - be read using a debugger. */ - entry = _Py_hashtable_get_entry(ht, key_size, pkey); - assert(entry == NULL); -#endif - - key_hash = ht->hash_func(ht, pkey); - index = key_hash & (ht->num_buckets - 1); - - entry = ht->alloc.malloc(HASHTABLE_ITEM_SIZE(ht)); - if (entry == NULL) { - /* memory allocation failed */ - return -1; - } - - entry->key_hash = key_hash; - memcpy((void *)_Py_HASHTABLE_ENTRY_PKEY(entry), pkey, ht->key_size); - if (data) - ENTRY_WRITE_PDATA(ht, entry, data_size, data); - - _Py_slist_prepend(&ht->buckets[index], (_Py_slist_item_t*)entry); - ht->entries++; - - if ((float)ht->entries / (float)ht->num_buckets > HASHTABLE_HIGH) - hashtable_rehash(ht); - return 0; -} - - -int -_Py_hashtable_get(_Py_hashtable_t *ht, size_t key_size,const void *pkey, - size_t data_size, void *data) -{ - _Py_hashtable_entry_t *entry; - - assert(data != NULL); - - entry = _Py_hashtable_get_entry(ht, key_size, pkey); - if (entry == NULL) - return 0; - ENTRY_READ_PDATA(ht, entry, data_size, data); - return 1; -} - - -int -_Py_hashtable_pop(_Py_hashtable_t *ht, size_t key_size, const void *pkey, - size_t data_size, void *data) -{ - assert(data != NULL); - return _Py_hashtable_pop_entry(ht, key_size, pkey, data, data_size); -} - - -/* Code commented since the function is not needed in Python */ -#if 0 -void -_Py_hashtable_delete(_Py_hashtable_t *ht, size_t key_size, const void *pkey) -{ -#ifndef NDEBUG - int found = _Py_hashtable_pop_entry(ht, key_size, pkey, NULL, 0); - assert(found); -#else - (void)_Py_hashtable_pop_entry(ht, key_size, pkey, NULL, 0); -#endif -} -#endif - - -int -_Py_hashtable_foreach(_Py_hashtable_t *ht, - _Py_hashtable_foreach_func func, - void *arg) -{ - _Py_hashtable_entry_t *entry; - size_t hv; - - for (hv = 0; hv < ht->num_buckets; hv++) { - for (entry = TABLE_HEAD(ht, hv); entry; entry = ENTRY_NEXT(entry)) { - int res = func(ht, entry, arg); - if (res) - return res; - } - } - return 0; -} - - -static void -hashtable_rehash(_Py_hashtable_t *ht) -{ - size_t buckets_size, new_size, bucket; - _Py_slist_t *old_buckets = NULL; - size_t old_num_buckets; - - new_size = round_size((size_t)(ht->entries * HASHTABLE_REHASH_FACTOR)); - if (new_size == ht->num_buckets) - return; - - old_num_buckets = ht->num_buckets; - - buckets_size = new_size * sizeof(ht->buckets[0]); - old_buckets = ht->buckets; - ht->buckets = ht->alloc.malloc(buckets_size); - if (ht->buckets == NULL) { - /* cancel rehash on memory allocation failure */ - ht->buckets = old_buckets ; - /* memory allocation failed */ - return; - } - memset(ht->buckets, 0, buckets_size); - - ht->num_buckets = new_size; - - for (bucket = 0; bucket < old_num_buckets; bucket++) { - _Py_hashtable_entry_t *entry, *next; - for (entry = BUCKETS_HEAD(old_buckets[bucket]); entry != NULL; entry = next) { - size_t entry_index; - - - assert(ht->hash_func(ht, _Py_HASHTABLE_ENTRY_PKEY(entry)) == entry->key_hash); - next = ENTRY_NEXT(entry); - entry_index = entry->key_hash & (new_size - 1); - - _Py_slist_prepend(&ht->buckets[entry_index], (_Py_slist_item_t*)entry); - } - } - - ht->alloc.free(old_buckets); -} - - -void -_Py_hashtable_clear(_Py_hashtable_t *ht) -{ - _Py_hashtable_entry_t *entry, *next; - size_t i; - - for (i=0; i < ht->num_buckets; i++) { - for (entry = TABLE_HEAD(ht, i); entry != NULL; entry = next) { - next = ENTRY_NEXT(entry); - ht->alloc.free(entry); - } - _Py_slist_init(&ht->buckets[i]); - } - ht->entries = 0; - hashtable_rehash(ht); -} - - -void -_Py_hashtable_destroy(_Py_hashtable_t *ht) -{ - size_t i; - - for (i = 0; i < ht->num_buckets; i++) { - _Py_slist_item_t *entry = ht->buckets[i].head; - while (entry) { - _Py_slist_item_t *entry_next = entry->next; - ht->alloc.free(entry); - entry = entry_next; - } - } - - ht->alloc.free(ht->buckets); - ht->alloc.free(ht); -} - - -_Py_hashtable_t * -_Py_hashtable_copy(_Py_hashtable_t *src) -{ - const size_t key_size = src->key_size; - const size_t data_size = src->data_size; - _Py_hashtable_t *dst; - _Py_hashtable_entry_t *entry; - size_t bucket; - int err; - - dst = _Py_hashtable_new_full(key_size, data_size, - src->num_buckets, - src->hash_func, - src->compare_func, - &src->alloc); - if (dst == NULL) - return NULL; - - for (bucket=0; bucket < src->num_buckets; bucket++) { - entry = TABLE_HEAD(src, bucket); - for (; entry; entry = ENTRY_NEXT(entry)) { - const void *pkey = _Py_HASHTABLE_ENTRY_PKEY(entry); - const void *pdata = _Py_HASHTABLE_ENTRY_PDATA(src, entry); - err = _Py_hashtable_set(dst, key_size, pkey, data_size, pdata); - if (err) { - _Py_hashtable_destroy(dst); - return NULL; - } - } - } - return dst; -} diff --git a/Modules/hashtable.h b/Modules/hashtable.h deleted file mode 100644 index dbec23d2..00000000 --- a/Modules/hashtable.h +++ /dev/null @@ -1,211 +0,0 @@ -#ifndef Py_HASHTABLE_H -#define Py_HASHTABLE_H -/* The whole API is private */ -#ifndef Py_LIMITED_API - -/* Single linked list */ - -typedef struct _Py_slist_item_s { - struct _Py_slist_item_s *next; -} _Py_slist_item_t; - -typedef struct { - _Py_slist_item_t *head; -} _Py_slist_t; - -#define _Py_SLIST_ITEM_NEXT(ITEM) (((_Py_slist_item_t *)ITEM)->next) - -#define _Py_SLIST_HEAD(SLIST) (((_Py_slist_t *)SLIST)->head) - - -/* _Py_hashtable: table entry */ - -typedef struct { - /* used by _Py_hashtable_t.buckets to link entries */ - _Py_slist_item_t _Py_slist_item; - - Py_uhash_t key_hash; - - /* key (key_size bytes) and then data (data_size bytes) follows */ -} _Py_hashtable_entry_t; - -#define _Py_HASHTABLE_ENTRY_PKEY(ENTRY) \ - ((const void *)((char *)(ENTRY) \ - + sizeof(_Py_hashtable_entry_t))) - -#define _Py_HASHTABLE_ENTRY_PDATA(TABLE, ENTRY) \ - ((const void *)((char *)(ENTRY) \ - + sizeof(_Py_hashtable_entry_t) \ - + (TABLE)->key_size)) - -/* Get a key value from pkey: use memcpy() rather than a pointer dereference - to avoid memory alignment issues. */ -#define _Py_HASHTABLE_READ_KEY(TABLE, PKEY, DST_KEY) \ - do { \ - assert(sizeof(DST_KEY) == (TABLE)->key_size); \ - memcpy(&(DST_KEY), (PKEY), sizeof(DST_KEY)); \ - } while (0) - -#define _Py_HASHTABLE_ENTRY_READ_KEY(TABLE, ENTRY, KEY) \ - do { \ - assert(sizeof(KEY) == (TABLE)->key_size); \ - memcpy(&(KEY), _Py_HASHTABLE_ENTRY_PKEY(ENTRY), sizeof(KEY)); \ - } while (0) - -#define _Py_HASHTABLE_ENTRY_READ_DATA(TABLE, ENTRY, DATA) \ - do { \ - assert(sizeof(DATA) == (TABLE)->data_size); \ - memcpy(&(DATA), _Py_HASHTABLE_ENTRY_PDATA(TABLE, (ENTRY)), \ - sizeof(DATA)); \ - } while (0) - -#define _Py_HASHTABLE_ENTRY_WRITE_DATA(TABLE, ENTRY, DATA) \ - do { \ - assert(sizeof(DATA) == (TABLE)->data_size); \ - memcpy((void *)_Py_HASHTABLE_ENTRY_PDATA((TABLE), (ENTRY)), \ - &(DATA), sizeof(DATA)); \ - } while (0) - - -/* _Py_hashtable: prototypes */ - -/* Forward declaration */ -struct _Py_hashtable_t; - -typedef Py_uhash_t (*_Py_hashtable_hash_func) (struct _Py_hashtable_t *ht, - const void *pkey); -typedef int (*_Py_hashtable_compare_func) (struct _Py_hashtable_t *ht, - const void *pkey, - const _Py_hashtable_entry_t *he); - -typedef struct { - /* allocate a memory block */ - void* (*malloc) (size_t size); - - /* release a memory block */ - void (*free) (void *ptr); -} _Py_hashtable_allocator_t; - - -/* _Py_hashtable: table */ - -typedef struct _Py_hashtable_t { - size_t num_buckets; - size_t entries; /* Total number of entries in the table. */ - _Py_slist_t *buckets; - size_t key_size; - size_t data_size; - - _Py_hashtable_hash_func hash_func; - _Py_hashtable_compare_func compare_func; - _Py_hashtable_allocator_t alloc; -} _Py_hashtable_t; - -/* hash a pointer (void*) */ -PyAPI_FUNC(Py_uhash_t) _Py_hashtable_hash_ptr( - struct _Py_hashtable_t *ht, - const void *pkey); - -/* comparison using memcmp() */ -PyAPI_FUNC(int) _Py_hashtable_compare_direct( - _Py_hashtable_t *ht, - const void *pkey, - const _Py_hashtable_entry_t *entry); - -PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new( - size_t key_size, - size_t data_size, - _Py_hashtable_hash_func hash_func, - _Py_hashtable_compare_func compare_func); - -PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new_full( - size_t key_size, - size_t data_size, - size_t init_size, - _Py_hashtable_hash_func hash_func, - _Py_hashtable_compare_func compare_func, - _Py_hashtable_allocator_t *allocator); - -PyAPI_FUNC(void) _Py_hashtable_destroy(_Py_hashtable_t *ht); - -/* Return a copy of the hash table */ -PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_copy(_Py_hashtable_t *src); - -PyAPI_FUNC(void) _Py_hashtable_clear(_Py_hashtable_t *ht); - -typedef int (*_Py_hashtable_foreach_func) (_Py_hashtable_t *ht, - _Py_hashtable_entry_t *entry, - void *arg); - -/* Call func() on each entry of the hashtable. - Iteration stops if func() result is non-zero, in this case it's the result - of the call. Otherwise, the function returns 0. */ -PyAPI_FUNC(int) _Py_hashtable_foreach( - _Py_hashtable_t *ht, - _Py_hashtable_foreach_func func, - void *arg); - -PyAPI_FUNC(size_t) _Py_hashtable_size(_Py_hashtable_t *ht); - -/* Add a new entry to the hash. The key must not be present in the hash table. - Return 0 on success, -1 on memory error. - - Don't call directly this function, - but use _Py_HASHTABLE_SET() and _Py_HASHTABLE_SET_NODATA() macros */ -PyAPI_FUNC(int) _Py_hashtable_set( - _Py_hashtable_t *ht, - size_t key_size, - const void *pkey, - size_t data_size, - const void *data); - -#define _Py_HASHTABLE_SET(TABLE, KEY, DATA) \ - _Py_hashtable_set(TABLE, sizeof(KEY), &(KEY), sizeof(DATA), &(DATA)) - -#define _Py_HASHTABLE_SET_NODATA(TABLE, KEY) \ - _Py_hashtable_set(TABLE, sizeof(KEY), &(KEY), 0, NULL) - - -/* Get an entry. - Return NULL if the key does not exist. - - Don't call directly this function, but use _Py_HASHTABLE_GET_ENTRY() - macro */ -PyAPI_FUNC(_Py_hashtable_entry_t*) _Py_hashtable_get_entry( - _Py_hashtable_t *ht, - size_t key_size, - const void *pkey); - -#define _Py_HASHTABLE_GET_ENTRY(TABLE, KEY) \ - _Py_hashtable_get_entry(TABLE, sizeof(KEY), &(KEY)) - - -/* Get data from an entry. Copy entry data into data and return 1 if the entry - exists, return 0 if the entry does not exist. - - Don't call directly this function, but use _Py_HASHTABLE_GET() macro */ -PyAPI_FUNC(int) _Py_hashtable_get( - _Py_hashtable_t *ht, - size_t key_size, - const void *pkey, - size_t data_size, - void *data); - -#define _Py_HASHTABLE_GET(TABLE, KEY, DATA) \ - _Py_hashtable_get(TABLE, sizeof(KEY), &(KEY), sizeof(DATA), &(DATA)) - - -/* Don't call directly this function, but use _Py_HASHTABLE_POP() macro */ -PyAPI_FUNC(int) _Py_hashtable_pop( - _Py_hashtable_t *ht, - size_t key_size, - const void *pkey, - size_t data_size, - void *data); - -#define _Py_HASHTABLE_POP(TABLE, KEY, DATA) \ - _Py_hashtable_pop(TABLE, sizeof(KEY), &(KEY), sizeof(DATA), &(DATA)) - - -#endif /* Py_LIMITED_API */ -#endif diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index eba59ba1..18fcebdf 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -2,7 +2,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_tupleobject.h" -#include "structmember.h" +#include // offsetof() /* Itertools module written and maintained by Raymond D. Hettinger @@ -134,7 +134,7 @@ groupby_step(groupbyobject *gbo) newkey = newvalue; Py_INCREF(newvalue); } else { - newkey = PyObject_CallFunctionObjArgs(gbo->keyfunc, newvalue, NULL); + newkey = PyObject_CallOneArg(gbo->keyfunc, newvalue); if (newkey == NULL) { Py_DECREF(newvalue); return -1; @@ -455,8 +455,6 @@ typedef struct { PyObject *weakreflist; } teeobject; -static PyTypeObject teedataobject_type; - static PyObject * teedataobject_newinternal(PyObject *it) { @@ -527,7 +525,7 @@ teedataobject_traverse(teedataobject *tdo, visitproc visit, void * arg) static void teedataobject_safe_decref(PyObject *obj) { - while (obj && Py_TYPE(obj) == &teedataobject_type && + while (obj && Py_IS_TYPE(obj, &teedataobject_type) && Py_REFCNT(obj) == 1) { PyObject *nextlink = ((teedataobject *)obj)->nextlink; ((teedataobject *)obj)->nextlink = NULL; @@ -614,7 +612,7 @@ itertools_teedataobject_impl(PyTypeObject *type, PyObject *it, if (len == LINKCELLS) { if (next != Py_None) { - if (Py_TYPE(next) != &teedataobject_type) + if (!Py_IS_TYPE(next, &teedataobject_type)) goto err; assert(tdo->nextlink == NULL); Py_INCREF(next); @@ -682,8 +680,6 @@ static PyTypeObject teedataobject_type = { }; -static PyTypeObject tee_type; - static PyObject * tee_next(teeobject *to) { @@ -949,8 +945,6 @@ typedef struct { int firstpass; } cycleobject; -static PyTypeObject cycle_type; - /*[clinic input] @classmethod itertools.cycle.__new__ @@ -1060,10 +1054,10 @@ cycle_reduce(cycleobject *lz, PyObject *Py_UNUSED(ignored)) } Py_DECREF(res); } - return Py_BuildValue("O(N)(Oi)", Py_TYPE(lz), it, lz->saved, 1); + return Py_BuildValue("O(N)(OO)", Py_TYPE(lz), it, lz->saved, Py_True); } - return Py_BuildValue("O(O)(Oi)", Py_TYPE(lz), lz->it, lz->saved, - lz->firstpass); + return Py_BuildValue("O(O)(OO)", Py_TYPE(lz), lz->it, lz->saved, + lz->firstpass ? Py_True : Py_False); } static PyObject * @@ -1147,8 +1141,6 @@ typedef struct { long start; } dropwhileobject; -static PyTypeObject dropwhile_type; - /*[clinic input] @classmethod itertools.dropwhile.__new__ @@ -1219,7 +1211,7 @@ dropwhile_next(dropwhileobject *lz) if (lz->start == 1) return item; - good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; @@ -1314,8 +1306,6 @@ typedef struct { long stop; } takewhileobject; -static PyTypeObject takewhile_type; - /*[clinic input] @classmethod itertools.takewhile.__new__ @@ -1382,7 +1372,7 @@ takewhile_next(takewhileobject *lz) if (item == NULL) return NULL; - good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; @@ -1734,8 +1724,6 @@ typedef struct { PyObject *it; } starmapobject; -static PyTypeObject starmap_type; - /*[clinic input] @classmethod itertools.starmap.__new__ @@ -2040,6 +2028,8 @@ static PyMethodDef chain_methods[] = { reduce_doc}, {"__setstate__", (PyCFunction)chain_setstate, METH_O, setstate_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -2452,8 +2442,6 @@ typedef struct { int stopped; /* set to 1 when the iterator is exhausted */ } combinationsobject; -static PyTypeObject combinations_type; - /*[clinic input] @classmethod @@ -2786,8 +2774,6 @@ typedef struct { int stopped; /* set to 1 when the cwr iterator is exhausted */ } cwrobject; -static PyTypeObject cwr_type; - /*[clinic input] @classmethod itertools.combinations_with_replacement.__new__ @@ -3076,12 +3062,15 @@ static PyTypeObject cwr_type = { /* permutations object ******************************************************** def permutations(iterable, r=None): - 'permutations(range(3), 2) --> (0,1) (0,2) (1,0) (1,2) (2,0) (2,1)' + # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC + # permutations(range(3)) --> 012 021 102 120 201 210 pool = tuple(iterable) n = len(pool) r = n if r is None else r - indices = range(n) - cycles = range(n-r+1, n+1)[::-1] + if r > n: + return + indices = list(range(n)) + cycles = list(range(n, n-r, -1)) yield tuple(pool[i] for i in indices[:r]) while n: for i in reversed(range(r)): @@ -3108,8 +3097,6 @@ typedef struct { int stopped; /* set to 1 when the iterator is exhausted */ } permutationsobject; -static PyTypeObject permutations_type; - /*[clinic input] @classmethod itertools.permutations.__new__ @@ -3469,8 +3456,6 @@ typedef struct { PyObject *initial; } accumulateobject; -static PyTypeObject accumulate_type; - /*[clinic input] @classmethod itertools.accumulate.__new__ @@ -3682,8 +3667,6 @@ typedef struct { PyObject *selectors; } compressobject; -static PyTypeObject compress_type; - /*[clinic input] @classmethod itertools.compress.__new__ @@ -3842,8 +3825,6 @@ typedef struct { PyObject *it; } filterfalseobject; -static PyTypeObject filterfalse_type; - /*[clinic input] @classmethod itertools.filterfalse.__new__ @@ -3915,7 +3896,7 @@ filterfalse_next(filterfalseobject *lz) ok = PyObject_IsTrue(item); } else { PyObject *good; - good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; @@ -4014,8 +3995,6 @@ slow_mode: when cnt == PY_SSIZE_T_MAX, step is not int(1), or cnt is a float. Either long_cnt or long_step may be a float, Fraction, or Decimal. */ -static PyTypeObject count_type; - /*[clinic input] @classmethod itertools.count.__new__ @@ -4253,17 +4232,17 @@ repeat_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { repeatobject *ro; PyObject *element; - Py_ssize_t cnt = -1, n_kwds = 0; + Py_ssize_t cnt = -1, n_args; static char *kwargs[] = {"object", "times", NULL}; + n_args = PyTuple_GET_SIZE(args); + if (kwds != NULL) + n_args += PyDict_GET_SIZE(kwds); if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|n:repeat", kwargs, &element, &cnt)) return NULL; - - if (kwds != NULL) - n_kwds = PyDict_GET_SIZE(kwds); /* Does user supply times argument? */ - if ((PyTuple_Size(args) + n_kwds == 2) && cnt < 0) + if (n_args == 2 && cnt < 0) cnt = 0; ro = (repeatobject *)type->tp_alloc(type, 0); @@ -4698,31 +4677,9 @@ combinations(p, r)\n\ combinations_with_replacement(p, r)\n\ "); - -static PyMethodDef module_methods[] = { - ITERTOOLS_TEE_METHODDEF - {NULL, NULL} /* sentinel */ -}; - - -static struct PyModuleDef itertoolsmodule = { - PyModuleDef_HEAD_INIT, - "itertools", - module_doc, - -1, - module_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit_itertools(void) +static int +itertoolsmodule_exec(PyObject *m) { - int i; - PyObject *m; - const char *name; PyTypeObject *typelist[] = { &accumulate_type, &combinations_type, @@ -4743,22 +4700,45 @@ PyInit_itertools(void) &groupby_type, &_grouper_type, &tee_type, - &teedataobject_type, - NULL + &teedataobject_type }; - Py_TYPE(&teedataobject_type) = &PyType_Type; - m = PyModule_Create(&itertoolsmodule); - if (m == NULL) - return NULL; + Py_SET_TYPE(&teedataobject_type, &PyType_Type); - for (i=0 ; typelist[i] != NULL ; i++) { - if (PyType_Ready(typelist[i]) < 0) - return NULL; - name = _PyType_Name(typelist[i]); - Py_INCREF(typelist[i]); - PyModule_AddObject(m, name, (PyObject *)typelist[i]); + for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) { + if (PyModule_AddType(m, typelist[i]) < 0) { + return -1; + } } - return m; + return 0; +} + +static struct PyModuleDef_Slot itertoolsmodule_slots[] = { + {Py_mod_exec, itertoolsmodule_exec}, + {0, NULL} +}; + +static PyMethodDef module_methods[] = { + ITERTOOLS_TEE_METHODDEF + {NULL, NULL} /* sentinel */ +}; + + +static struct PyModuleDef itertoolsmodule = { + PyModuleDef_HEAD_INIT, + "itertools", + module_doc, + 0, + module_methods, + itertoolsmodule_slots, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit_itertools(void) +{ + return PyModuleDef_Init(&itertoolsmodule); } diff --git a/Modules/main.c b/Modules/main.c index 70be4cfa..2cc891f6 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -1,25 +1,22 @@ /* Python interpreter main program */ #include "Python.h" -#include "pycore_initconfig.h" -#include "pycore_pylifecycle.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" - -#ifdef __FreeBSD__ -# include /* fedisableexcept() */ -#endif +#include "pycore_initconfig.h" // _PyArgv +#include "pycore_interp.h" // _PyInterpreterState.sysdict +#include "pycore_pathconfig.h" // _PyPathConfig_ComputeSysPath0() +#include "pycore_pylifecycle.h" // _Py_PreInitializeFromPyArgv() +#include "pycore_pystate.h" // _PyInterpreterState_GET() /* Includes for exit_sigint() */ -#include /* perror() */ +#include // perror() #ifdef HAVE_SIGNAL_H -# include /* SIGINT */ +# include // SIGINT #endif #if defined(HAVE_GETPID) && defined(HAVE_UNISTD_H) -# include /* getpid() */ +# include // getpid() #endif #ifdef MS_WINDOWS -# include /* STATUS_CONTROL_C_EXIT */ +# include // STATUS_CONTROL_C_EXIT #endif /* End of includes for exit_sigint() */ @@ -43,15 +40,6 @@ pymain_init(const _PyArgv *args) return status; } - /* 754 requires that FP exceptions run in "no stop" mode by default, - * and until C vendors implement C99's ways to control FP exceptions, - * Python requires non-stop mode. Alas, some platforms enable FP - * exceptions by default. Here we disable them. - */ -#ifdef __FreeBSD__ - fedisableexcept(FE_OVERFLOW); -#endif - PyPreConfig preconfig; PyPreConfig_InitPythonConfig(&preconfig); @@ -290,7 +278,7 @@ pymain_run_module(const wchar_t *modname, int set_argv0) Py_DECREF(runmodule); return pymain_exit_err_print(); } - runargs = Py_BuildValue("(Oi)", module, set_argv0); + runargs = PyTuple_Pack(2, module, set_argv0 ? Py_True : Py_False); if (runargs == NULL) { fprintf(stderr, "Could not create arguments for runpy._run_module_as_main\n"); @@ -299,7 +287,11 @@ pymain_run_module(const wchar_t *modname, int set_argv0) Py_DECREF(module); return pymain_exit_err_print(); } + _Py_UnhandledKeyboardInterrupt = 0; result = PyObject_Call(runmodule, runargs, NULL); + if (!result && PyErr_Occurred() == PyExc_KeyboardInterrupt) { + _Py_UnhandledKeyboardInterrupt = 1; + } Py_DECREF(runpy); Py_DECREF(runmodule); Py_DECREF(module); @@ -313,7 +305,7 @@ pymain_run_module(const wchar_t *modname, int set_argv0) static int -pymain_run_file(PyConfig *config, PyCompilerFlags *cf) +pymain_run_file(const PyConfig *config, PyCompilerFlags *cf) { const wchar_t *filename = config->run_filename; if (PySys_Audit("cpython.run_file", "u", filename) < 0) { @@ -550,9 +542,9 @@ pymain_repl(PyConfig *config, PyCompilerFlags *cf, int *exitcode) static void pymain_run_python(int *exitcode) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); /* pymain_run_stdin() modify the config */ - PyConfig *config = &interp->config; + PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(interp); PyObject *main_importer_path = NULL; if (config->run_filename != NULL) { diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index b78fcedd..4aa7e655 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -53,6 +53,7 @@ raised for division by zero and mod by zero. */ #include "Python.h" +#include "pycore_dtoa.h" #include "_math.h" #include "clinic/mathmodule.c.h" @@ -646,7 +647,7 @@ m_remainder(double x, double y) Warning: some subtlety here. What we *want* to know at this point is whether the remainder m is less than, equal to, or greater than half of absy. However, we can't do that comparison directly because we - can't be sure that 0.5*absy is representable (the mutiplication + can't be sure that 0.5*absy is representable (the multiplication might incur precision loss due to underflow). So instead we compare m with the complement c = absy - m: m < 0.5*absy if and only if m < c, and so on. The catch is that absy - m might also not be @@ -825,37 +826,125 @@ m_log10(double x) } -/*[clinic input] -math.gcd +static PyObject * +math_gcd(PyObject *module, PyObject * const *args, Py_ssize_t nargs) +{ + PyObject *res, *x; + Py_ssize_t i; - x as a: object - y as b: object - / + if (nargs == 0) { + return PyLong_FromLong(0); + } + res = PyNumber_Index(args[0]); + if (res == NULL) { + return NULL; + } + if (nargs == 1) { + Py_SETREF(res, PyNumber_Absolute(res)); + return res; + } + for (i = 1; i < nargs; i++) { + x = PyNumber_Index(args[i]); + if (x == NULL) { + Py_DECREF(res); + return NULL; + } + if (res == _PyLong_One) { + /* Fast path: just check arguments. + It is okay to use identity comparison here. */ + Py_DECREF(x); + continue; + } + Py_SETREF(res, _PyLong_GCD(res, x)); + Py_DECREF(x); + if (res == NULL) { + return NULL; + } + } + return res; +} + +PyDoc_STRVAR(math_gcd_doc, +"gcd($module, *integers)\n" +"--\n" +"\n" +"Greatest Common Divisor."); -greatest common divisor of x and y -[clinic start generated code]*/ static PyObject * -math_gcd_impl(PyObject *module, PyObject *a, PyObject *b) -/*[clinic end generated code: output=7b2e0c151bd7a5d8 input=c2691e57fb2a98fa]*/ +long_lcm(PyObject *a, PyObject *b) { - PyObject *g; + PyObject *g, *m, *f, *ab; - a = PyNumber_Index(a); - if (a == NULL) + if (Py_SIZE(a) == 0 || Py_SIZE(b) == 0) { + return PyLong_FromLong(0); + } + g = _PyLong_GCD(a, b); + if (g == NULL) { return NULL; - b = PyNumber_Index(b); - if (b == NULL) { - Py_DECREF(a); + } + f = PyNumber_FloorDivide(a, g); + Py_DECREF(g); + if (f == NULL) { return NULL; } - g = _PyLong_GCD(a, b); - Py_DECREF(a); - Py_DECREF(b); - return g; + m = PyNumber_Multiply(f, b); + Py_DECREF(f); + if (m == NULL) { + return NULL; + } + ab = PyNumber_Absolute(m); + Py_DECREF(m); + return ab; +} + + +static PyObject * +math_lcm(PyObject *module, PyObject * const *args, Py_ssize_t nargs) +{ + PyObject *res, *x; + Py_ssize_t i; + + if (nargs == 0) { + return PyLong_FromLong(1); + } + res = PyNumber_Index(args[0]); + if (res == NULL) { + return NULL; + } + if (nargs == 1) { + Py_SETREF(res, PyNumber_Absolute(res)); + return res; + } + for (i = 1; i < nargs; i++) { + x = PyNumber_Index(args[i]); + if (x == NULL) { + Py_DECREF(res); + return NULL; + } + if (res == _PyLong_Zero) { + /* Fast path: just check arguments. + It is okay to use identity comparison here. */ + Py_DECREF(x); + continue; + } + Py_SETREF(res, long_lcm(res, x)); + Py_DECREF(x); + if (res == NULL) { + return NULL; + } + } + return res; } +PyDoc_STRVAR(math_lcm_doc, +"lcm($module, *integers)\n" +"--\n" +"\n" +"Least Common Multiple."); + + /* Call is_error when errno != 0, and where x is the result libm * returned. is_error will usually set up an exception and return * true (1), but may return false (0) without setting up an exception. @@ -936,9 +1025,7 @@ math_1_to_whatever(PyObject *arg, double (*func) (double), if (x == -1.0 && PyErr_Occurred()) return NULL; errno = 0; - PyFPE_START_PROTECT("in math_1", return 0); r = (*func)(x); - PyFPE_END_PROTECT(r); if (Py_IS_NAN(r) && !Py_IS_NAN(x)) { PyErr_SetString(PyExc_ValueError, "math domain error"); /* invalid arg */ @@ -972,9 +1059,7 @@ math_1a(PyObject *arg, double (*func) (double)) if (x == -1.0 && PyErr_Occurred()) return NULL; errno = 0; - PyFPE_START_PROTECT("in math_1a", return 0); r = (*func)(x); - PyFPE_END_PROTECT(r); if (errno && is_error(r)) return NULL; return PyFloat_FromDouble(r); @@ -1013,12 +1098,6 @@ math_1(PyObject *arg, double (*func) (double), int can_overflow) return math_1_to_whatever(arg, func, PyFloat_FromDouble, can_overflow); } -static PyObject * -math_1_to_int(PyObject *arg, double (*func) (double), int can_overflow) -{ - return math_1_to_whatever(arg, func, PyLong_FromDouble, can_overflow); -} - static PyObject * math_2(PyObject *const *args, Py_ssize_t nargs, double (*func) (double, double), const char *funcname) @@ -1035,9 +1114,7 @@ math_2(PyObject *const *args, Py_ssize_t nargs, return NULL; } errno = 0; - PyFPE_START_PROTECT("in math_2", return 0); r = (*func)(x, y); - PyFPE_END_PROTECT(r); if (Py_IS_NAN(r)) { if (!Py_IS_NAN(x) && !Py_IS_NAN(y)) errno = EDOM; @@ -1076,19 +1153,22 @@ math_2(PyObject *const *args, Py_ssize_t nargs, FUNC1(acos, acos, 0, "acos($module, x, /)\n--\n\n" - "Return the arc cosine (measured in radians) of x.") + "Return the arc cosine (measured in radians) of x.\n\n" + "The result is between 0 and pi.") FUNC1(acosh, m_acosh, 0, "acosh($module, x, /)\n--\n\n" "Return the inverse hyperbolic cosine of x.") FUNC1(asin, asin, 0, "asin($module, x, /)\n--\n\n" - "Return the arc sine (measured in radians) of x.") + "Return the arc sine (measured in radians) of x.\n\n" + "The result is between -pi/2 and pi/2.") FUNC1(asinh, m_asinh, 0, "asinh($module, x, /)\n--\n\n" "Return the inverse hyperbolic sine of x.") FUNC1(atan, atan, 0, "atan($module, x, /)\n--\n\n" - "Return the arc tangent (measured in radians) of x.") + "Return the arc tangent (measured in radians) of x.\n\n" + "The result is between -pi/2 and pi/2.") FUNC2(atan2, m_atan2, "atan2($module, y, x, /)\n--\n\n" "Return the arc tangent (measured in radians) of y/x.\n\n" @@ -1113,17 +1193,22 @@ math_ceil(PyObject *module, PyObject *number) /*[clinic end generated code: output=6c3b8a78bc201c67 input=2725352806399cab]*/ { _Py_IDENTIFIER(__ceil__); - PyObject *method, *result; - method = _PyObject_LookupSpecial(number, &PyId___ceil__); - if (method == NULL) { + if (!PyFloat_CheckExact(number)) { + PyObject *method = _PyObject_LookupSpecial(number, &PyId___ceil__); + if (method != NULL) { + PyObject *result = _PyObject_CallNoArg(method); + Py_DECREF(method); + return result; + } if (PyErr_Occurred()) return NULL; - return math_1_to_int(number, ceil, 0); } - result = _PyObject_CallNoArg(method); - Py_DECREF(method); - return result; + double x = PyFloat_AsDouble(number); + if (x == -1.0 && PyErr_Occurred()) + return NULL; + + return PyLong_FromDouble(ceil(x)); } FUNC2(copysign, copysign, @@ -1170,18 +1255,28 @@ static PyObject * math_floor(PyObject *module, PyObject *number) /*[clinic end generated code: output=c6a65c4884884b8a input=63af6b5d7ebcc3d6]*/ { + double x; + _Py_IDENTIFIER(__floor__); - PyObject *method, *result; - method = _PyObject_LookupSpecial(number, &PyId___floor__); - if (method == NULL) { + if (PyFloat_CheckExact(number)) { + x = PyFloat_AS_DOUBLE(number); + } + else + { + PyObject *method = _PyObject_LookupSpecial(number, &PyId___floor__); + if (method != NULL) { + PyObject *result = _PyObject_CallNoArg(method); + Py_DECREF(method); + return result; + } if (PyErr_Occurred()) return NULL; - return math_1_to_int(number, floor, 0); + x = PyFloat_AsDouble(number); + if (x == -1.0 && PyErr_Occurred()) + return NULL; } - result = _PyObject_CallNoArg(method); - Py_DECREF(method); - return result; + return PyLong_FromDouble(floor(x)); } FUNC1A(gamma, m_tgamma, @@ -1337,8 +1432,6 @@ math_fsum(PyObject *module, PyObject *seq) if (iter == NULL) return NULL; - PyFPE_START_PROTECT("fsum", Py_DECREF(iter); return NULL) - for(;;) { /* for x in iterable */ assert(0 <= n && n <= m); assert((m == NUM_PARTIALS && p == ps) || @@ -1433,7 +1526,6 @@ math_fsum(PyObject *module, PyObject *seq) sum = PyFloat_FromDouble(hi); _fsum_error: - PyFPE_END_PROTECT(hi) Py_DECREF(iter); if (p != ps) PyMem_Free(p); @@ -1447,28 +1539,6 @@ math_fsum(PyObject *module, PyObject *seq) #undef NUM_PARTIALS -/* Return the smallest integer k such that n < 2**k, or 0 if n == 0. - * Equivalent to floor(lg(x))+1. Also equivalent to: bitwidth_of_type - - * count_leading_zero_bits(x) - */ - -/* XXX: This routine does more or less the same thing as - * bits_in_digit() in Objects/longobject.c. Someday it would be nice to - * consolidate them. On BSD, there's a library function called fls() - * that we could use, and GCC provides __builtin_clz(). - */ - -static unsigned long -bit_length(unsigned long n) -{ - unsigned long len = 0; - while (n != 0) { - ++len; - n >>= 1; - } - return len; -} - static unsigned long count_set_bits(unsigned long n) { @@ -1883,7 +1953,7 @@ factorial_partial_product(unsigned long start, unsigned long stop, /* find midpoint of range(start, stop), rounded up to next odd number. */ midpoint = (start + num_operands) | 1; left = factorial_partial_product(start, midpoint, - bit_length(midpoint - 2)); + _Py_bit_length(midpoint - 2)); if (left == NULL) goto error; right = factorial_partial_product(midpoint, stop, max_bits); @@ -1913,7 +1983,7 @@ factorial_odd_part(unsigned long n) Py_INCREF(outer); upper = 3; - for (i = bit_length(n) - 2; i >= 0; i--) { + for (i = _Py_bit_length(n) - 2; i >= 0; i--) { v = n >> i; if (v <= 2) continue; @@ -1923,7 +1993,7 @@ factorial_odd_part(unsigned long n) /* Here inner is the product of all odd integers j in the range (0, n/2**(i+1)]. The factorial_partial_product call below gives the product of all odd integers j in the range (n/2**(i+1), n/2**i]. */ - partial = factorial_partial_product(lower, upper, bit_length(upper-2)); + partial = factorial_partial_product(lower, upper, _Py_bit_length(upper-2)); /* inner *= partial */ if (partial == NULL) goto error; @@ -1985,6 +2055,12 @@ math_factorial(PyObject *module, PyObject *arg) PyObject *result, *odd_part, *pyint_form; if (PyFloat_Check(arg)) { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "Using factorial() with floats is deprecated", + 1) < 0) + { + return NULL; + } PyObject *lx; double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg); if (!(Py_IS_FINITE(dx) && dx == floor(dx))) { @@ -2056,6 +2132,10 @@ math_trunc(PyObject *module, PyObject *x) _Py_IDENTIFIER(__trunc__); PyObject *trunc, *result; + if (PyFloat_CheckExact(x)) { + return PyFloat_Type.tp_as_number->nb_int(x); + } + if (Py_TYPE(x)->tp_dict == NULL) { if (PyType_Ready(Py_TYPE(x)) < 0) return NULL; @@ -2098,9 +2178,7 @@ math_frexp_impl(PyObject *module, double x) i = 0; } else { - PyFPE_START_PROTECT("in math_frexp", return 0); x = frexp(x, &i); - PyFPE_END_PROTECT(x); } return Py_BuildValue("(di)", x, i); } @@ -2155,9 +2233,7 @@ math_ldexp_impl(PyObject *module, double x, PyObject *i) errno = 0; } else { errno = 0; - PyFPE_START_PROTECT("in math_ldexp", return 0); r = ldexp(x, (int)exp); - PyFPE_END_PROTECT(r); if (Py_IS_INFINITY(r)) errno = ERANGE; } @@ -2194,9 +2270,7 @@ math_modf_impl(PyObject *module, double x) } errno = 0; - PyFPE_START_PROTECT("in math_modf", return 0); x = modf(x, &y); - PyFPE_END_PROTECT(x); return Py_BuildValue("(dd)", x, y); } @@ -2343,9 +2417,7 @@ math_fmod_impl(PyObject *module, double x, double y) if (Py_IS_INFINITY(y) && Py_IS_FINITE(x)) return PyFloat_FromDouble(x); errno = 0; - PyFPE_START_PROTECT("in math_fmod", return 0); r = fmod(x, y); - PyFPE_END_PROTECT(r); if (Py_IS_NAN(r)) { if (!Py_IS_NAN(x) && !Py_IS_NAN(y)) errno = EDOM; @@ -2633,9 +2705,7 @@ math_pow_impl(PyObject *module, double x, double y) else { /* let libm handle finite**finite */ errno = 0; - PyFPE_START_PROTECT("in math_pow", return 0); r = pow(x, y); - PyFPE_END_PROTECT(r); /* a NaN result should arise only from (-ve)**(finite non-integer); in this case we want to raise ValueError. */ if (!Py_IS_FINITE(r)) { @@ -3301,6 +3371,85 @@ error: } +/*[clinic input] +math.nextafter + + x: double + y: double + / + +Return the next floating-point value after x towards y. +[clinic start generated code]*/ + +static PyObject * +math_nextafter_impl(PyObject *module, double x, double y) +/*[clinic end generated code: output=750c8266c1c540ce input=02b2d50cd1d9f9b6]*/ +{ +#if defined(_AIX) + if (x == y) { + /* On AIX 7.1, libm nextafter(-0.0, +0.0) returns -0.0. + Bug fixed in bos.adt.libm 7.2.2.0 by APAR IV95512. */ + return PyFloat_FromDouble(y); + } +#endif + return PyFloat_FromDouble(nextafter(x, y)); +} + + +/*[clinic input] +math.ulp -> double + + x: double + / + +Return the value of the least significant bit of the float x. +[clinic start generated code]*/ + +static double +math_ulp_impl(PyObject *module, double x) +/*[clinic end generated code: output=f5207867a9384dd4 input=31f9bfbbe373fcaa]*/ +{ + if (Py_IS_NAN(x)) { + return x; + } + x = fabs(x); + if (Py_IS_INFINITY(x)) { + return x; + } + double inf = m_inf(); + double x2 = nextafter(x, inf); + if (Py_IS_INFINITY(x2)) { + /* special case: x is the largest positive representable float */ + x2 = nextafter(x, -inf); + return x - x2; + } + return x2 - x; +} + +static int +math_exec(PyObject *module) +{ + if (PyModule_AddObject(module, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) { + return -1; + } + if (PyModule_AddObject(module, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) { + return -1; + } + // 2pi + if (PyModule_AddObject(module, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) { + return -1; + } + if (PyModule_AddObject(module, "inf", PyFloat_FromDouble(m_inf())) < 0) { + return -1; + } +#if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN) + if (PyModule_AddObject(module, "nan", PyFloat_FromDouble(m_nan())) < 0) { + return -1; + } +#endif + return 0; +} + static PyMethodDef math_methods[] = { {"acos", math_acos, METH_O, math_acos_doc}, {"acosh", math_acosh, METH_O, math_acosh_doc}, @@ -3326,13 +3475,14 @@ static PyMethodDef math_methods[] = { MATH_FREXP_METHODDEF MATH_FSUM_METHODDEF {"gamma", math_gamma, METH_O, math_gamma_doc}, - MATH_GCD_METHODDEF + {"gcd", (PyCFunction)(void(*)(void))math_gcd, METH_FASTCALL, math_gcd_doc}, {"hypot", (PyCFunction)(void(*)(void))math_hypot, METH_FASTCALL, math_hypot_doc}, MATH_ISCLOSE_METHODDEF MATH_ISFINITE_METHODDEF MATH_ISINF_METHODDEF MATH_ISNAN_METHODDEF MATH_ISQRT_METHODDEF + {"lcm", (PyCFunction)(void(*)(void))math_lcm, METH_FASTCALL, math_lcm_doc}, MATH_LDEXP_METHODDEF {"lgamma", math_lgamma, METH_O, math_lgamma_doc}, MATH_LOG_METHODDEF @@ -3352,44 +3502,31 @@ static PyMethodDef math_methods[] = { MATH_PROD_METHODDEF MATH_PERM_METHODDEF MATH_COMB_METHODDEF + MATH_NEXTAFTER_METHODDEF + MATH_ULP_METHODDEF {NULL, NULL} /* sentinel */ }; +static PyModuleDef_Slot math_slots[] = { + {Py_mod_exec, math_exec}, + {0, NULL} +}; PyDoc_STRVAR(module_doc, "This module provides access to the mathematical functions\n" "defined by the C standard."); - static struct PyModuleDef mathmodule = { PyModuleDef_HEAD_INIT, - "math", - module_doc, - -1, - math_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "math", + .m_doc = module_doc, + .m_size = 0, + .m_methods = math_methods, + .m_slots = math_slots, }; PyMODINIT_FUNC PyInit_math(void) { - PyObject *m; - - m = PyModule_Create(&mathmodule); - if (m == NULL) - goto finally; - - PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI)); - PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E)); - PyModule_AddObject(m, "tau", PyFloat_FromDouble(Py_MATH_TAU)); /* 2pi */ - PyModule_AddObject(m, "inf", PyFloat_FromDouble(m_inf())); -#if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN) - PyModule_AddObject(m, "nan", PyFloat_FromDouble(m_nan())); -#endif - - finally: - return m; + return PyModuleDef_Init(&mathmodule); } diff --git a/Modules/md5module.c b/Modules/md5module.c index c2ebaaf6..e4d9db40 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -503,13 +503,15 @@ static PyTypeObject MD5type = { _md5.md5 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new MD5 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_md5_md5_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=2cfd0f8c091b97e6 input=d12ef8f72d684f7b]*/ +_md5_md5_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=587071f76254a4ac input=7a144a1905636985]*/ { MD5object *new; Py_buffer buf; @@ -550,9 +552,6 @@ static struct PyMethodDef MD5_functions[] = { /* Initialize this module. */ -#define insint(n,v) { PyModule_AddIntConstant(m,n,v); } - - static struct PyModuleDef _md5module = { PyModuleDef_HEAD_INIT, "_md5", @@ -570,13 +569,15 @@ PyInit__md5(void) { PyObject *m; - Py_TYPE(&MD5type) = &PyType_Type; - if (PyType_Ready(&MD5type) < 0) + Py_SET_TYPE(&MD5type, &PyType_Type); + if (PyType_Ready(&MD5type) < 0) { return NULL; + } m = PyModule_Create(&_md5module); - if (m == NULL) + if (m == NULL) { return NULL; + } Py_INCREF((PyObject *)&MD5type); PyModule_AddObject(m, "MD5Type", (PyObject *)&MD5type); diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 18758861..a3e22d0a 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -20,7 +20,7 @@ #define PY_SSIZE_T_CLEAN #include -#include "structmember.h" +#include // offsetof() #ifndef MS_WINDOWS #define UNIX @@ -97,7 +97,7 @@ typedef struct { #else off_t offset; #endif - int exports; + Py_ssize_t exports; #ifdef MS_WINDOWS HANDLE map_handle; @@ -692,7 +692,52 @@ mmap__exit__method(PyObject *self, PyObject *args) { _Py_IDENTIFIER(close); - return _PyObject_CallMethodId(self, &PyId_close, NULL); + return _PyObject_CallMethodIdNoArgs(self, &PyId_close); +} + +static PyObject * +mmap__repr__method(PyObject *self) +{ + mmap_object *mobj = (mmap_object *)self; + +#ifdef MS_WINDOWS +#define _Py_FORMAT_OFFSET "lld" + if (mobj->map_handle == NULL) +#elif defined(UNIX) +# ifdef HAVE_LARGEFILE_SUPPORT +# define _Py_FORMAT_OFFSET "lld" +# else +# define _Py_FORMAT_OFFSET "ld" +# endif + if (mobj->data == NULL) +#endif + { + return PyUnicode_FromFormat("<%s closed=True>", Py_TYPE(self)->tp_name); + } else { + const char *access_str; + + switch (mobj->access) { + case ACCESS_DEFAULT: + access_str = "ACCESS_DEFAULT"; + break; + case ACCESS_READ: + access_str = "ACCESS_READ"; + break; + case ACCESS_WRITE: + access_str = "ACCESS_WRITE"; + break; + case ACCESS_COPY: + access_str = "ACCESS_COPY"; + break; + default: + Py_UNREACHABLE(); + } + + return PyUnicode_FromFormat("<%s closed=False, access=%s, length=%zd, " + "pos=%zd, offset=%" _Py_FORMAT_OFFSET ">", + Py_TYPE(self)->tp_name, access_str, + mobj->size, mobj->pos, mobj->offset); + } } #ifdef MS_WINDOWS @@ -1044,23 +1089,23 @@ static PyTypeObject mmap_object_type = { sizeof(mmap_object), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ - (destructor) mmap_object_dealloc, /* tp_dealloc */ + (destructor)mmap_object_dealloc, /* tp_dealloc */ 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - 0, /* tp_repr */ + (reprfunc)mmap__repr__method, /* tp_repr */ 0, /* tp_as_number */ - &mmap_as_sequence, /*tp_as_sequence*/ - &mmap_as_mapping, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - PyObject_GenericGetAttr, /*tp_getattro*/ - 0, /*tp_setattro*/ - &mmap_as_buffer, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - mmap_doc, /*tp_doc*/ + &mmap_as_sequence, /* tp_as_sequence */ + &mmap_as_mapping, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + &mmap_as_buffer, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + mmap_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c index f7712d97..2a1ac108 100644 --- a/Modules/ossaudiodev.c +++ b/Modules/ossaudiodev.c @@ -14,14 +14,12 @@ * (c) 2002 Gregory P. Ward. All Rights Reserved. * (c) 2002 Python Software Foundation. All Rights Reserved. * - * XXX need a license statement - * * $Id$ */ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #ifdef HAVE_FCNTL_H #include @@ -539,7 +537,7 @@ oss_exit(PyObject *self, PyObject *unused) { _Py_IDENTIFIER(close); - PyObject *ret = _PyObject_CallMethodId(self, &PyId_close, NULL); + PyObject *ret = _PyObject_CallMethodIdNoArgs(self, &PyId_close); if (!ret) return NULL; Py_DECREF(ret); diff --git a/Modules/overlapped.c b/Modules/overlapped.c index 27aac70f..cd7869fa 100644 --- a/Modules/overlapped.c +++ b/Modules/overlapped.c @@ -8,7 +8,7 @@ Check itemsize */ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #define WINDOWS_LEAN_AND_MEAN #include @@ -1856,12 +1856,10 @@ PyInit__overlapped(void) if (initialize_function_pointers() < 0) return NULL; - if (PyType_Ready(&OverlappedType) < 0) - return NULL; - m = PyModule_Create(&overlapped_module); - if (PyModule_AddObject(m, "Overlapped", (PyObject *)&OverlappedType) < 0) + if (PyModule_AddType(m, &OverlappedType) < 0) { return NULL; + } d = PyModule_GetDict(m); diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index 079d00f3..24b0ffbe 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -256,7 +256,7 @@ PyTypeObject PyST_Type = { /* PyST_Type isn't subclassable, so just check ob_type */ -#define PyST_Object_Check(v) ((v)->ob_type == &PyST_Type) +#define PyST_Object_Check(v) Py_IS_TYPE(v, &PyST_Type) static int parser_compare_nodes(node *left, node *right) @@ -1080,25 +1080,20 @@ parser__pickler(PyObject *self, PyObject *args) NOTE(ARGUNUSED(self)) PyObject *result = NULL; PyObject *st = NULL; - PyObject *empty_dict = NULL; if (PyArg_ParseTuple(args, "O!:_pickler", &PyST_Type, &st)) { PyObject *newargs; PyObject *tuple; - if ((empty_dict = PyDict_New()) == NULL) - goto finally; - if ((newargs = Py_BuildValue("Oi", st, 1)) == NULL) - goto finally; - tuple = parser_st2tuple((PyST_Object*)NULL, newargs, empty_dict); + if ((newargs = PyTuple_Pack(2, st, Py_True)) == NULL) + return NULL; + tuple = parser_st2tuple((PyST_Object*)NULL, newargs, NULL); if (tuple != NULL) { result = Py_BuildValue("O(O)", pickle_constructor, tuple); Py_DECREF(tuple); } Py_DECREF(newargs); } - finally: - Py_XDECREF(empty_dict); return (result); } @@ -1158,6 +1153,12 @@ PyInit_parser(void) { PyObject *module, *copyreg; + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "The parser module is deprecated and will be removed " + "in future versions of Python", 7) != 0) { + return NULL; + } + if (PyType_Ready(&PyST_Type) < 0) return NULL; module = PyModule_Create(&parsermodule); diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 726e3723..01e8bcbd 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1,4 +1,3 @@ - /* POSIX module implementation */ /* This file is also used for Windows NT/MS-Win. In that case the @@ -8,8 +7,6 @@ of the compiler used. Different compilers define their own feature test macro, e.g. '_MSC_VER'. */ - - #ifdef __APPLE__ /* * Step 1 of support for weak-linking a number of symbols existing on @@ -35,10 +32,10 @@ # include #endif -#include "pycore_ceval.h" /* _PyEval_ReInitThreads() */ -#include "pycore_pystate.h" /* _PyRuntime */ -#include "pythread.h" -#include "structmember.h" +#include "pycore_ceval.h" // _PyEval_ReInitThreads() +#include "pycore_import.h" // _PyImport_ReInitLock() +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "structmember.h" // PyMemberDef #ifndef MS_WINDOWS # include "posixmodule.h" #else @@ -48,7 +45,7 @@ /* On android API level 21, 'AT_EACCESS' is not declared although * HAVE_FACCESSAT is defined. */ #ifdef __ANDROID__ -#undef HAVE_FACCESSAT +# undef HAVE_FACCESSAT #endif #include /* needed for ctermid() */ @@ -65,86 +62,89 @@ corresponding Unix manual entries for more information on calls."); #ifdef HAVE_SYS_UIO_H -#include +# include #endif #ifdef HAVE_SYS_SYSMACROS_H /* GNU C Library: major(), minor(), makedev() */ -#include +# include #endif #ifdef HAVE_SYS_TYPES_H -#include +# include #endif /* HAVE_SYS_TYPES_H */ #ifdef HAVE_SYS_STAT_H -#include +# include #endif /* HAVE_SYS_STAT_H */ #ifdef HAVE_SYS_WAIT_H -#include /* For WNOHANG */ +# include // WNOHANG +#endif +#ifdef HAVE_LINUX_WAIT_H +# include // P_PIDFD #endif #ifdef HAVE_SIGNAL_H -#include +# include #endif #ifdef HAVE_FCNTL_H -#include -#endif /* HAVE_FCNTL_H */ +# include +#endif #ifdef HAVE_GRP_H -#include +# include #endif #ifdef HAVE_SYSEXITS_H -#include -#endif /* HAVE_SYSEXITS_H */ +# include +#endif #ifdef HAVE_SYS_LOADAVG_H -#include +# include #endif #ifdef HAVE_SYS_SENDFILE_H -#include +# include #endif #if defined(__APPLE__) -#include +# include #endif #ifdef HAVE_SCHED_H -#include +# include #endif #ifdef HAVE_COPY_FILE_RANGE -#include +# include #endif #if !defined(CPU_ALLOC) && defined(HAVE_SCHED_SETAFFINITY) -#undef HAVE_SCHED_SETAFFINITY +# undef HAVE_SCHED_SETAFFINITY #endif #if defined(HAVE_SYS_XATTR_H) && defined(__GLIBC__) && !defined(__FreeBSD_kernel__) && !defined(__GNU__) -#define USE_XATTRS +# define USE_XATTRS #endif #ifdef USE_XATTRS -#include +# include #endif #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__APPLE__) -#ifdef HAVE_SYS_SOCKET_H -#include -#endif +# ifdef HAVE_SYS_SOCKET_H +# include +# endif #endif #ifdef HAVE_DLFCN_H -#include +# include #endif #ifdef __hpux -#include +# include #endif #if defined(__DragonFly__) || \ @@ -152,7 +152,7 @@ corresponding Unix manual entries for more information on calls."); defined(__FreeBSD__) || \ defined(__NetBSD__) || \ defined(__APPLE__) -#include +# include #endif #ifdef HAVE_LINUX_RANDOM_H @@ -177,45 +177,47 @@ corresponding Unix manual entries for more information on calls."); /* Various compilers have only certain posix functions */ /* XXX Gosh I wish these were all moved into pyconfig.h */ #if defined(__WATCOMC__) && !defined(__QNX__) /* Watcom compiler */ -#define HAVE_OPENDIR 1 -#define HAVE_SYSTEM 1 -#include -#else -#ifdef _MSC_VER /* Microsoft compiler */ -#define HAVE_GETPPID 1 -#define HAVE_GETLOGIN 1 -#define HAVE_SPAWNV 1 -#define HAVE_EXECV 1 -#define HAVE_WSPAWNV 1 -#define HAVE_WEXECV 1 -#define HAVE_PIPE 1 -#define HAVE_SYSTEM 1 -#define HAVE_CWAIT 1 -#define HAVE_FSYNC 1 -#define fsync _commit -#else -/* Unix functions that the configure script doesn't check for */ -#ifndef __VXWORKS__ -#define HAVE_EXECV 1 -#define HAVE_FORK 1 -#if defined(__USLC__) && defined(__SCO_VERSION__) /* SCO UDK Compiler */ -#define HAVE_FORK1 1 -#endif -#endif -#define HAVE_GETEGID 1 -#define HAVE_GETEUID 1 -#define HAVE_GETGID 1 -#define HAVE_GETPPID 1 -#define HAVE_GETUID 1 -#define HAVE_KILL 1 -#define HAVE_OPENDIR 1 -#define HAVE_PIPE 1 -#define HAVE_SYSTEM 1 -#define HAVE_WAIT 1 -#define HAVE_TTYNAME 1 -#endif /* _MSC_VER */ +# define HAVE_OPENDIR 1 +# define HAVE_SYSTEM 1 +# include +#else +# ifdef _MSC_VER + /* Microsoft compiler */ +# define HAVE_GETPPID 1 +# define HAVE_GETLOGIN 1 +# define HAVE_SPAWNV 1 +# define HAVE_EXECV 1 +# define HAVE_WSPAWNV 1 +# define HAVE_WEXECV 1 +# define HAVE_PIPE 1 +# define HAVE_SYSTEM 1 +# define HAVE_CWAIT 1 +# define HAVE_FSYNC 1 +# define fsync _commit +# else + /* Unix functions that the configure script doesn't check for */ +# ifndef __VXWORKS__ +# define HAVE_EXECV 1 +# define HAVE_FORK 1 +# if defined(__USLC__) && defined(__SCO_VERSION__) /* SCO UDK Compiler */ +# define HAVE_FORK1 1 +# endif +# endif +# define HAVE_GETEGID 1 +# define HAVE_GETEUID 1 +# define HAVE_GETGID 1 +# define HAVE_GETPPID 1 +# define HAVE_GETUID 1 +# define HAVE_KILL 1 +# define HAVE_OPENDIR 1 +# define HAVE_PIPE 1 +# define HAVE_SYSTEM 1 +# define HAVE_WAIT 1 +# define HAVE_TTYNAME 1 +# endif /* _MSC_VER */ #endif /* ! __WATCOMC__ || __QNX__ */ +_Py_IDENTIFIER(__fspath__); /*[clinic input] # one of the few times we lie about this name! @@ -234,123 +236,119 @@ extern char *ctermid_r(char *); #endif /* !_MSC_VER */ #if defined(__VXWORKS__) -#include -#include -#include -#include -#ifndef _P_WAIT -#define _P_WAIT 0 -#define _P_NOWAIT 1 -#define _P_NOWAITO 1 -#endif +# include +# include +# include +# include +# ifndef _P_WAIT +# define _P_WAIT 0 +# define _P_NOWAIT 1 +# define _P_NOWAITO 1 +# endif #endif /* __VXWORKS__ */ #ifdef HAVE_POSIX_SPAWN -#include +# include #endif #ifdef HAVE_UTIME_H -#include +# include #endif /* HAVE_UTIME_H */ #ifdef HAVE_SYS_UTIME_H -#include -#define HAVE_UTIME_H /* pretend we do for the rest of this file */ +# include +# define HAVE_UTIME_H /* pretend we do for the rest of this file */ #endif /* HAVE_SYS_UTIME_H */ #ifdef HAVE_SYS_TIMES_H -#include +# include #endif /* HAVE_SYS_TIMES_H */ #ifdef HAVE_SYS_PARAM_H -#include +# include #endif /* HAVE_SYS_PARAM_H */ #ifdef HAVE_SYS_UTSNAME_H -#include +# include #endif /* HAVE_SYS_UTSNAME_H */ #ifdef HAVE_DIRENT_H -#include -#define NAMLEN(dirent) strlen((dirent)->d_name) -#else -#if defined(__WATCOMC__) && !defined(__QNX__) -#include -#define NAMLEN(dirent) strlen((dirent)->d_name) +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) #else -#define dirent direct -#define NAMLEN(dirent) (dirent)->d_namlen -#endif -#ifdef HAVE_SYS_NDIR_H -#include -#endif -#ifdef HAVE_SYS_DIR_H -#include -#endif -#ifdef HAVE_NDIR_H -#include -#endif +# if defined(__WATCOMC__) && !defined(__QNX__) +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) +# else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# endif +# ifdef HAVE_SYS_NDIR_H +# include +# endif +# ifdef HAVE_SYS_DIR_H +# include +# endif +# ifdef HAVE_NDIR_H +# include +# endif #endif #ifdef _MSC_VER -#ifdef HAVE_DIRECT_H -#include -#endif -#ifdef HAVE_IO_H -#include -#endif -#ifdef HAVE_PROCESS_H -#include -#endif -#ifndef IO_REPARSE_TAG_SYMLINK -#define IO_REPARSE_TAG_SYMLINK (0xA000000CL) -#endif -#ifndef IO_REPARSE_TAG_MOUNT_POINT -#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) -#endif -#include "osdefs.h" -#include -#include -#include /* for ShellExecute() */ -#include /* for UNLEN */ -#define HAVE_SYMLINK +# ifdef HAVE_DIRECT_H +# include +# endif +# ifdef HAVE_IO_H +# include +# endif +# ifdef HAVE_PROCESS_H +# include +# endif +# ifndef IO_REPARSE_TAG_SYMLINK +# define IO_REPARSE_TAG_SYMLINK (0xA000000CL) +# endif +# ifndef IO_REPARSE_TAG_MOUNT_POINT +# define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) +# endif +# include "osdefs.h" // SEP +# include +# include +# include // ShellExecute() +# include // UNLEN +# define HAVE_SYMLINK #endif /* _MSC_VER */ #ifndef MAXPATHLEN -#if defined(PATH_MAX) && PATH_MAX > 1024 -#define MAXPATHLEN PATH_MAX -#else -#define MAXPATHLEN 1024 -#endif +# if defined(PATH_MAX) && PATH_MAX > 1024 +# define MAXPATHLEN PATH_MAX +# else +# define MAXPATHLEN 1024 +# endif #endif /* MAXPATHLEN */ #ifdef UNION_WAIT -/* Emulate some macros on systems that have a union instead of macros */ - -#ifndef WIFEXITED -#define WIFEXITED(u_wait) (!(u_wait).w_termsig && !(u_wait).w_coredump) -#endif - -#ifndef WEXITSTATUS -#define WEXITSTATUS(u_wait) (WIFEXITED(u_wait)?((u_wait).w_retcode):-1) -#endif - -#ifndef WTERMSIG -#define WTERMSIG(u_wait) ((u_wait).w_termsig) -#endif - -#define WAIT_TYPE union wait -#define WAIT_STATUS_INT(s) (s.w_status) - -#else /* !UNION_WAIT */ -#define WAIT_TYPE int -#define WAIT_STATUS_INT(s) (s) + /* Emulate some macros on systems that have a union instead of macros */ +# ifndef WIFEXITED +# define WIFEXITED(u_wait) (!(u_wait).w_termsig && !(u_wait).w_coredump) +# endif +# ifndef WEXITSTATUS +# define WEXITSTATUS(u_wait) (WIFEXITED(u_wait)?((u_wait).w_retcode):-1) +# endif +# ifndef WTERMSIG +# define WTERMSIG(u_wait) ((u_wait).w_termsig) +# endif +# define WAIT_TYPE union wait +# define WAIT_STATUS_INT(s) (s.w_status) +#else + /* !UNION_WAIT */ +# define WAIT_TYPE int +# define WAIT_STATUS_INT(s) (s) #endif /* UNION_WAIT */ /* Don't use the "_r" form if we don't need it (also, won't have a prototype for it, at least on Solaris -- maybe others as well?). */ #if defined(HAVE_CTERMID_R) -#define USE_CTERMID_R +# define USE_CTERMID_R #endif /* choose the appropriate stat and fstat functions and return structs */ @@ -358,56 +356,56 @@ extern char *ctermid_r(char *); #undef FSTAT #undef STRUCT_STAT #ifdef MS_WINDOWS -# define STAT win32_stat -# define LSTAT win32_lstat -# define FSTAT _Py_fstat_noraise -# define STRUCT_STAT struct _Py_stat_struct +# define STAT win32_stat +# define LSTAT win32_lstat +# define FSTAT _Py_fstat_noraise +# define STRUCT_STAT struct _Py_stat_struct #else -# define STAT stat -# define LSTAT lstat -# define FSTAT fstat -# define STRUCT_STAT struct stat +# define STAT stat +# define LSTAT lstat +# define FSTAT fstat +# define STRUCT_STAT struct stat #endif #if defined(MAJOR_IN_MKDEV) -#include +# include #else -#if defined(MAJOR_IN_SYSMACROS) -#include -#endif -#if defined(HAVE_MKNOD) && defined(HAVE_SYS_MKDEV_H) -#include -#endif +# if defined(MAJOR_IN_SYSMACROS) +# include +# endif +# if defined(HAVE_MKNOD) && defined(HAVE_SYS_MKDEV_H) +# include +# endif #endif #ifdef MS_WINDOWS -#define INITFUNC PyInit_nt -#define MODNAME "nt" +# define INITFUNC PyInit_nt +# define MODNAME "nt" #else -#define INITFUNC PyInit_posix -#define MODNAME "posix" +# define INITFUNC PyInit_posix +# define MODNAME "posix" #endif #if defined(__sun) /* Something to implement in autoconf, not present in autoconf 2.69 */ -#define HAVE_STRUCT_STAT_ST_FSTYPE 1 +# define HAVE_STRUCT_STAT_ST_FSTYPE 1 #endif /* memfd_create is either defined in sys/mman.h or sys/memfd.h * linux/memfd.h defines additional flags */ #ifdef HAVE_SYS_MMAN_H -#include +# include #endif #ifdef HAVE_SYS_MEMFD_H -#include +# include #endif #ifdef HAVE_LINUX_MEMFD_H -#include +# include #endif #ifdef _Py_MEMORY_SANITIZER -# include +# include #endif #ifdef HAVE_FORK @@ -432,7 +430,7 @@ run_at_forkers(PyObject *lst, int reverse) for (i = 0; i < PyList_GET_SIZE(cpy); i++) { PyObject *func, *res; func = PyList_GET_ITEM(cpy, i); - res = PyObject_CallObject(func, NULL); + res = _PyObject_CallNoArg(func); if (res == NULL) PyErr_WriteUnraisable(func); else @@ -446,7 +444,7 @@ run_at_forkers(PyObject *lst, int reverse) void PyOS_BeforeFork(void) { - run_at_forkers(_PyInterpreterState_Get()->before_forkers, 1); + run_at_forkers(_PyInterpreterState_GET()->before_forkers, 1); _PyImport_AcquireLock(); } @@ -457,7 +455,7 @@ PyOS_AfterFork_Parent(void) if (_PyImport_ReleaseLock() <= 0) Py_FatalError("failed releasing import lock after fork"); - run_at_forkers(_PyInterpreterState_Get()->after_forkers_parent, 0); + run_at_forkers(_PyInterpreterState_GET()->after_forkers_parent, 0); } void @@ -471,7 +469,7 @@ PyOS_AfterFork_Child(void) _PyRuntimeState_ReInitThreads(runtime); _PyInterpreterState_DeleteExceptMain(runtime); - run_at_forkers(_PyInterpreterState_Get()->after_forkers_child, 0); + run_at_forkers(_PyInterpreterState_GET()->after_forkers_child, 0); } static int @@ -486,7 +484,8 @@ register_at_forker(PyObject **lst, PyObject *func) } return PyList_Append(*lst, func); } -#endif +#endif /* HAVE_FORK */ + /* Legacy wrapper */ void @@ -536,7 +535,7 @@ _Py_Uid_Converter(PyObject *obj, void *p) if (index == NULL) { PyErr_Format(PyExc_TypeError, "uid should be integer, not %.200s", - Py_TYPE(obj)->tp_name); + _PyType_Name(Py_TYPE(obj))); return 0; } @@ -642,7 +641,7 @@ _Py_Gid_Converter(PyObject *obj, void *p) if (index == NULL) { PyErr_Format(PyExc_TypeError, "gid should be integer, not %.200s", - Py_TYPE(obj)->tp_name); + _PyType_Name(Py_TYPE(obj))); return 0; } @@ -809,11 +808,40 @@ dir_fd_converter(PyObject *o, void *p) else { PyErr_Format(PyExc_TypeError, "argument should be integer or None, not %.200s", - Py_TYPE(o)->tp_name); + _PyType_Name(Py_TYPE(o))); return 0; } } +typedef struct { + PyObject *billion; + PyObject *DirEntryType; + PyObject *ScandirIteratorType; +#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) + PyObject *SchedParamType; +#endif + PyObject *StatResultType; + PyObject *StatVFSResultType; + PyObject *TerminalSizeType; + PyObject *TimesResultType; + PyObject *UnameResultType; +#if defined(HAVE_WAITID) && !defined(__APPLE__) + PyObject *WaitidResultType; +#endif +#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) + PyObject *struct_rusage; +#endif + PyObject *st_mode; +} _posixstate; + + +static inline _posixstate* +get_posix_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_posixstate *)state; +} /* * A PyArg_ParseTuple "converter" function @@ -983,7 +1011,6 @@ path_converter(PyObject *o, void *p) if (!is_index && !is_buffer && !is_unicode && !is_bytes) { /* Inline PyOS_FSPath() for better error messages. */ - _Py_IDENTIFIER(__fspath__); PyObject *func, *res; func = _PyObject_LookupSpecial(o, &PyId___fspath__); @@ -1004,8 +1031,8 @@ path_converter(PyObject *o, void *p) else { PyErr_Format(PyExc_TypeError, "expected %.200s.__fspath__() to return str or bytes, " - "not %.200s", Py_TYPE(o)->tp_name, - Py_TYPE(res)->tp_name); + "not %.200s", _PyType_Name(Py_TYPE(o)), + _PyType_Name(Py_TYPE(res))); Py_DECREF(res); goto error_exit; } @@ -1057,7 +1084,7 @@ path_converter(PyObject *o, void *p) path->allow_fd ? "string, bytes, os.PathLike or integer" : path->nullable ? "string, bytes, os.PathLike or None" : "string, bytes or os.PathLike", - Py_TYPE(o)->tp_name)) { + _PyType_Name(Py_TYPE(o)))) { goto error_exit; } bytes = PyBytes_FromObject(o); @@ -1088,7 +1115,7 @@ path_converter(PyObject *o, void *p) path->allow_fd ? "string, bytes, os.PathLike or integer" : path->nullable ? "string, bytes, os.PathLike or None" : "string, bytes or os.PathLike", - Py_TYPE(o)->tp_name); + _PyType_Name(Py_TYPE(o))); goto error_exit; } @@ -2046,14 +2073,6 @@ static PyStructSequence_Desc waitid_result_desc = { waitid_result_fields, 5 }; -static PyTypeObject* WaitidResultType; -#endif - -static int initialized; -static PyTypeObject* StatResultType; -static PyTypeObject* StatVFSResultType; -#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) -static PyTypeObject* SchedParamType; #endif static newfunc structseq_new; @@ -2079,11 +2098,64 @@ statresult_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return (PyObject*)result; } +static int +_posix_clear(PyObject *module) +{ + _posixstate *state = get_posix_state(module); + Py_CLEAR(state->billion); + Py_CLEAR(state->DirEntryType); + Py_CLEAR(state->ScandirIteratorType); +#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) + Py_CLEAR(state->SchedParamType); +#endif + Py_CLEAR(state->StatResultType); + Py_CLEAR(state->StatVFSResultType); + Py_CLEAR(state->TerminalSizeType); + Py_CLEAR(state->TimesResultType); + Py_CLEAR(state->UnameResultType); +#if defined(HAVE_WAITID) && !defined(__APPLE__) + Py_CLEAR(state->WaitidResultType); +#endif +#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) + Py_CLEAR(state->struct_rusage); +#endif + Py_CLEAR(state->st_mode); + return 0; +} + +static int +_posix_traverse(PyObject *module, visitproc visit, void *arg) +{ + _posixstate *state = get_posix_state(module); + Py_VISIT(state->billion); + Py_VISIT(state->DirEntryType); + Py_VISIT(state->ScandirIteratorType); +#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) + Py_VISIT(state->SchedParamType); +#endif + Py_VISIT(state->StatResultType); + Py_VISIT(state->StatVFSResultType); + Py_VISIT(state->TerminalSizeType); + Py_VISIT(state->TimesResultType); + Py_VISIT(state->UnameResultType); +#if defined(HAVE_WAITID) && !defined(__APPLE__) + Py_VISIT(state->WaitidResultType); +#endif +#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) + Py_VISIT(state->struct_rusage); +#endif + Py_VISIT(state->st_mode); + return 0; +} -static PyObject *billion = NULL; +static void +_posix_free(void *module) +{ + _posix_clear((PyObject *)module); +} static void -fill_time(PyObject *v, int index, time_t sec, unsigned long nsec) +fill_time(PyObject *module, PyObject *v, int index, time_t sec, unsigned long nsec) { PyObject *s = _PyLong_FromTime_t(sec); PyObject *ns_fractional = PyLong_FromUnsignedLong(nsec); @@ -2094,7 +2166,7 @@ fill_time(PyObject *v, int index, time_t sec, unsigned long nsec) if (!(s && ns_fractional)) goto exit; - s_in_ns = PyNumber_Multiply(s, billion); + s_in_ns = PyNumber_Multiply(s, get_posix_state(module)->billion); if (!s_in_ns) goto exit; @@ -2124,10 +2196,11 @@ exit: /* pack a system stat C structure into the Python stat tuple (used by posix_stat() and posix_fstat()) */ static PyObject* -_pystat_fromstructstat(STRUCT_STAT *st) +_pystat_fromstructstat(PyObject *module, STRUCT_STAT *st) { unsigned long ansec, mnsec, cnsec; - PyObject *v = PyStructSequence_New(StatResultType); + PyObject *StatResultType = get_posix_state(module)->StatResultType; + PyObject *v = PyStructSequence_New((PyTypeObject *)StatResultType); if (v == NULL) return NULL; @@ -2165,9 +2238,9 @@ _pystat_fromstructstat(STRUCT_STAT *st) #else ansec = mnsec = cnsec = 0; #endif - fill_time(v, 7, st->st_atime, ansec); - fill_time(v, 8, st->st_mtime, mnsec); - fill_time(v, 9, st->st_ctime, cnsec); + fill_time(module, v, 7, st->st_atime, ansec); + fill_time(module, v, 8, st->st_mtime, mnsec); + fill_time(module, v, 9, st->st_ctime, cnsec); #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX, @@ -2229,7 +2302,7 @@ _pystat_fromstructstat(STRUCT_STAT *st) static PyObject * -posix_do_stat(const char *function_name, path_t *path, +posix_do_stat(PyObject *module, const char *function_name, path_t *path, int dir_fd, int follow_symlinks) { STRUCT_STAT st; @@ -2274,7 +2347,7 @@ posix_do_stat(const char *function_name, path_t *path, return path_error(path); } - return _pystat_fromstructstat(&st); + return _pystat_fromstructstat(module, &st); } /*[python input] @@ -2569,13 +2642,8 @@ class confstr_confname_converter(path_confname_converter): class sysconf_confname_converter(path_confname_converter): converter="conv_sysconf_confname" -class sched_param_converter(CConverter): - type = 'struct sched_param' - converter = 'convert_sched_param' - impl_by_reference = True; - [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=418fce0e01144461]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=f1c8ae8d744f6c8b]*/ /*[clinic input] @@ -2612,7 +2680,7 @@ static PyObject * os_stat_impl(PyObject *module, path_t *path, int dir_fd, int follow_symlinks) /*[clinic end generated code: output=7d4976e6f18a59c5 input=01d362ebcc06996b]*/ { - return posix_do_stat("stat", path, dir_fd, follow_symlinks); + return posix_do_stat(module, "stat", path, dir_fd, follow_symlinks); } @@ -2636,7 +2704,7 @@ os_lstat_impl(PyObject *module, path_t *path, int dir_fd) /*[clinic end generated code: output=ef82a5d35ce8ab37 input=0b7474765927b925]*/ { int follow_symlinks = 0; - return posix_do_stat("lstat", path, dir_fd, follow_symlinks); + return posix_do_stat(module, "lstat", path, dir_fd, follow_symlinks); } @@ -2773,13 +2841,24 @@ static PyObject * os_ttyname_impl(PyObject *module, int fd) /*[clinic end generated code: output=c424d2e9d1cd636a input=9ff5a58b08115c55]*/ { - char *ret; - ret = ttyname(fd); - if (ret == NULL) { + long size = sysconf(_SC_TTY_NAME_MAX); + if (size == -1) { + return posix_error(); + } + char *buffer = (char *)PyMem_RawMalloc(size); + if (buffer == NULL) { + return PyErr_NoMemory(); + } + int ret = ttyname_r(fd, buffer, size); + if (ret != 0) { + PyMem_RawFree(buffer); + errno = ret; return posix_error(); } - return PyUnicode_DecodeFSDefault(ret); + PyObject *res = PyUnicode_DecodeFSDefault(buffer); + PyMem_RawFree(buffer); + return res; } #endif @@ -3894,29 +3973,25 @@ static PyObject * os__getfullpathname_impl(PyObject *module, path_t *path) /*[clinic end generated code: output=bb8679d56845bc9b input=332ed537c29d0a3e]*/ { - wchar_t woutbuf[MAX_PATH], *woutbufp = woutbuf; - wchar_t *wtemp; - DWORD result; - PyObject *v; + wchar_t *abspath; - result = GetFullPathNameW(path->wide, - Py_ARRAY_LENGTH(woutbuf), - woutbuf, &wtemp); - if (result > Py_ARRAY_LENGTH(woutbuf)) { - woutbufp = PyMem_New(wchar_t, result); - if (!woutbufp) - return PyErr_NoMemory(); - result = GetFullPathNameW(path->wide, result, woutbufp, &wtemp); + /* _Py_abspath() is implemented with GetFullPathNameW() on Windows */ + if (_Py_abspath(path->wide, &abspath) < 0) { + return win32_error_object("GetFullPathNameW", path->object); } - if (result) { - v = PyUnicode_FromWideChar(woutbufp, wcslen(woutbufp)); - if (path->narrow) - Py_SETREF(v, PyUnicode_EncodeFSDefault(v)); - } else - v = win32_error_object("GetFullPathNameW", path->object); - if (woutbufp != woutbuf) - PyMem_Free(woutbufp); - return v; + if (abspath == NULL) { + return PyErr_NoMemory(); + } + + PyObject *str = PyUnicode_FromWideChar(abspath, wcslen(abspath)); + PyMem_RawFree(abspath); + if (str == NULL) { + return NULL; + } + if (path->narrow) { + Py_SETREF(str, PyUnicode_EncodeFSDefault(str)); + } + return str; } @@ -4562,15 +4637,12 @@ or via the attributes sysname, nodename, release, version, and machine.\n\ See os.uname for more information."); static PyStructSequence_Desc uname_result_desc = { - "uname_result", /* name */ + MODNAME ".uname_result", /* name */ uname_result__doc__, /* doc */ uname_result_fields, 5 }; -static PyTypeObject* UnameResultType; - - #ifdef HAVE_UNAME /*[clinic input] os.uname @@ -4596,7 +4668,8 @@ os_uname_impl(PyObject *module) if (res < 0) return posix_error(); - value = PyStructSequence_New(UnameResultType); + PyObject *UnameResultType = get_posix_state(module)->UnameResultType; + value = PyStructSequence_New((PyTypeObject *)UnameResultType); if (value == NULL) return NULL; @@ -4773,17 +4846,17 @@ utime_default(utime_t *ut, const char *path) #endif static int -split_py_long_to_s_and_ns(PyObject *py_long, time_t *s, long *ns) +split_py_long_to_s_and_ns(PyObject *module, PyObject *py_long, time_t *s, long *ns) { int result = 0; PyObject *divmod; - divmod = PyNumber_Divmod(py_long, billion); + divmod = PyNumber_Divmod(py_long, get_posix_state(module)->billion); if (!divmod) goto exit; if (!PyTuple_Check(divmod) || PyTuple_GET_SIZE(divmod) != 2) { PyErr_Format(PyExc_TypeError, "%.200s.__divmod__() must return a 2-tuple, not %.200s", - Py_TYPE(py_long)->tp_name, Py_TYPE(divmod)->tp_name); + _PyType_Name(Py_TYPE(py_long)), _PyType_Name(Py_TYPE(divmod))); goto exit; } *s = _PyLong_AsTime_t(PyTuple_GET_ITEM(divmod, 0)); @@ -4889,9 +4962,9 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, return NULL; } utime.now = 0; - if (!split_py_long_to_s_and_ns(PyTuple_GET_ITEM(ns, 0), + if (!split_py_long_to_s_and_ns(module, PyTuple_GET_ITEM(ns, 0), &utime.atime_s, &utime.atime_ns) || - !split_py_long_to_s_and_ns(PyTuple_GET_ITEM(ns, 1), + !split_py_long_to_s_and_ns(module, PyTuple_GET_ITEM(ns, 1), &utime.mtime_s, &utime.mtime_ns)) { return NULL; } @@ -5342,11 +5415,11 @@ enum posix_spawn_file_actions_identifier { #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) static int -convert_sched_param(PyObject *param, struct sched_param *res); +convert_sched_param(PyObject *module, PyObject *param, struct sched_param *res); #endif static int -parse_posix_spawn_flags(const char *func_name, PyObject *setpgroup, +parse_posix_spawn_flags(PyObject *module, const char *func_name, PyObject *setpgroup, int resetids, int setsid, PyObject *setsigmask, PyObject *setsigdef, PyObject *scheduler, posix_spawnattr_t *attrp) @@ -5416,11 +5489,15 @@ parse_posix_spawn_flags(const char *func_name, PyObject *setpgroup, if (scheduler) { #ifdef POSIX_SPAWN_SETSCHEDULER PyObject *py_schedpolicy; + PyObject *schedparam_obj; struct sched_param schedparam; - if (!PyArg_ParseTuple(scheduler, "OO&" + if (!PyArg_ParseTuple(scheduler, "OO" ";A scheduler tuple must have two elements", - &py_schedpolicy, convert_sched_param, &schedparam)) { + &py_schedpolicy, &schedparam_obj)) { + goto fail; + } + if (!convert_sched_param(module, schedparam_obj, &schedparam)) { goto fail; } if (py_schedpolicy != Py_None) { @@ -5649,7 +5726,7 @@ py_posix_spawn(int use_posix_spawnp, PyObject *module, path_t *path, PyObject *a file_actionsp = &file_actions_buf; } - if (parse_posix_spawn_flags(func_name, setpgroup, resetids, setsid, + if (parse_posix_spawn_flags(module, func_name, setpgroup, resetids, setsid, setsigmask, setsigdef, scheduler, &attr)) { goto exit; } @@ -6059,7 +6136,7 @@ check_null_or_callable(PyObject *obj, const char* obj_name) { if (obj && !PyCallable_Check(obj)) { PyErr_Format(PyExc_TypeError, "'%s' must be callable, not %s", - obj_name, Py_TYPE(obj)->tp_name); + obj_name, _PyType_Name(Py_TYPE(obj))); return -1; } return 0; @@ -6099,7 +6176,7 @@ os_register_at_fork_impl(PyObject *module, PyObject *before, check_null_or_callable(after_in_parent, "after_in_parent")) { return NULL; } - interp = _PyInterpreterState_Get(); + interp = _PyInterpreterState_GET(); if (register_at_forker(&interp->before_forkers, before)) { return NULL; @@ -6130,7 +6207,7 @@ os_fork1_impl(PyObject *module) { pid_t pid; - if (_PyInterpreterState_Get() != PyInterpreterState_Main()) { + if (_PyInterpreterState_GET() != PyInterpreterState_Main()) { PyErr_SetString(PyExc_RuntimeError, "fork not supported for subinterpreters"); return NULL; } @@ -6164,9 +6241,10 @@ os_fork_impl(PyObject *module) /*[clinic end generated code: output=3626c81f98985d49 input=13c956413110eeaa]*/ { pid_t pid; - - if (_PyInterpreterState_Get() != PyInterpreterState_Main()) { - PyErr_SetString(PyExc_RuntimeError, "fork not supported for subinterpreters"); + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (interp->config._isolated_interpreter) { + PyErr_SetString(PyExc_RuntimeError, + "fork not supported for isolated subinterpreters"); return NULL; } if (PySys_Audit("os.fork", NULL) < 0) { @@ -6237,14 +6315,14 @@ os.sched_getscheduler pid: pid_t / -Get the scheduling policy for the process identifiedy by pid. +Get the scheduling policy for the process identified by pid. Passing 0 for pid returns the scheduling policy for the calling process. [clinic start generated code]*/ static PyObject * os_sched_getscheduler_impl(PyObject *module, pid_t pid) -/*[clinic end generated code: output=dce4c0bd3f1b34c8 input=5f14cfd1f189e1a0]*/ +/*[clinic end generated code: output=dce4c0bd3f1b34c8 input=8d99dac505485ac8]*/ { int policy; @@ -6266,12 +6344,12 @@ os.sched_param.__new__ sched_priority: object A scheduling parameter. -Current has only one field: sched_priority"); +Currently has only one field: sched_priority [clinic start generated code]*/ static PyObject * os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority) -/*[clinic end generated code: output=48f4067d60f48c13 input=ab4de35a9a7811f2]*/ +/*[clinic end generated code: output=48f4067d60f48c13 input=eb42909a2c0e3e6c]*/ { PyObject *res; @@ -6283,7 +6361,6 @@ os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority) return res; } - PyDoc_VAR(os_sched_param__doc__); static PyStructSequence_Field sched_param_fields[] = { @@ -6299,11 +6376,11 @@ static PyStructSequence_Desc sched_param_desc = { }; static int -convert_sched_param(PyObject *param, struct sched_param *res) +convert_sched_param(PyObject *module, PyObject *param, struct sched_param *res) { long priority; - if (Py_TYPE(param) != SchedParamType) { + if (!Py_IS_TYPE(param, (PyTypeObject *)get_posix_state(module)->SchedParamType)) { PyErr_SetString(PyExc_TypeError, "must have a sched_param object"); return 0; } @@ -6326,7 +6403,7 @@ os.sched_setscheduler pid: pid_t policy: int - param: sched_param + param as param_obj: object / Set the scheduling policy for the process identified by pid. @@ -6337,15 +6414,20 @@ param is an instance of sched_param. static PyObject * os_sched_setscheduler_impl(PyObject *module, pid_t pid, int policy, - struct sched_param *param) -/*[clinic end generated code: output=b0ac0a70d3b1d705 input=c581f9469a5327dd]*/ + PyObject *param_obj) +/*[clinic end generated code: output=cde27faa55dc993e input=73013d731bd8fbe9]*/ { + struct sched_param param; + if (!convert_sched_param(module, param_obj, ¶m)) { + return NULL; + } + /* ** sched_setscheduler() returns 0 in Linux, but the previous ** scheduling policy under Solaris/Illumos, and others. ** On error, -1 is returned in all Operating Systems. */ - if (sched_setscheduler(pid, policy, param) == -1) + if (sched_setscheduler(pid, policy, ¶m) == -1) return posix_error(); Py_RETURN_NONE; } @@ -6374,7 +6456,8 @@ os_sched_getparam_impl(PyObject *module, pid_t pid) if (sched_getparam(pid, ¶m)) return posix_error(); - result = PyStructSequence_New(SchedParamType); + PyObject *SchedParamType = get_posix_state(module)->SchedParamType; + result = PyStructSequence_New((PyTypeObject *)SchedParamType); if (!result) return NULL; priority = PyLong_FromLong(param.sched_priority); @@ -6390,7 +6473,7 @@ os_sched_getparam_impl(PyObject *module, pid_t pid) /*[clinic input] os.sched_setparam pid: pid_t - param: sched_param + param as param_obj: object / Set scheduling parameters for the process identified by pid. @@ -6400,11 +6483,15 @@ param should be an instance of sched_param. [clinic start generated code]*/ static PyObject * -os_sched_setparam_impl(PyObject *module, pid_t pid, - struct sched_param *param) -/*[clinic end generated code: output=8af013f78a32b591 input=6b8d6dfcecdc21bd]*/ +os_sched_setparam_impl(PyObject *module, pid_t pid, PyObject *param_obj) +/*[clinic end generated code: output=f19fe020a53741c1 input=27b98337c8b2dcc7]*/ { - if (sched_setparam(pid, param)) + struct sched_param param; + if (!convert_sched_param(module, param_obj, ¶m)) { + return NULL; + } + + if (sched_setparam(pid, ¶m)) return posix_error(); Py_RETURN_NONE; } @@ -6773,7 +6860,7 @@ os_forkpty_impl(PyObject *module) int master_fd = -1; pid_t pid; - if (_PyInterpreterState_Get() != PyInterpreterState_Main()) { + if (_PyInterpreterState_GET() != PyInterpreterState_Main()) { PyErr_SetString(PyExc_RuntimeError, "fork not supported for subinterpreters"); return NULL; } @@ -6868,23 +6955,46 @@ os_getpid_impl(PyObject *module) #ifdef HAVE_GETGROUPLIST -/* AC 3.5: funny apple logic below */ -PyDoc_STRVAR(posix_getgrouplist__doc__, -"getgrouplist(user, group) -> list of groups to which a user belongs\n\n\ -Returns a list of groups to which a user belongs.\n\n\ - user: username to lookup\n\ - group: base group id of the user"); +#ifdef __APPLE__ +/*[clinic input] +os.getgrouplist + + user: str + username to lookup + group as basegid: int + base group id of the user + / + +Returns a list of groups to which a user belongs. +[clinic start generated code]*/ + +static PyObject * +os_getgrouplist_impl(PyObject *module, const char *user, int basegid) +/*[clinic end generated code: output=6e734697b8c26de0 input=f8d870374b09a490]*/ +#else +/*[clinic input] +os.getgrouplist + + user: str + username to lookup + group as basegid: gid_t + base group id of the user + / + +Returns a list of groups to which a user belongs. +[clinic start generated code]*/ static PyObject * -posix_getgrouplist(PyObject *self, PyObject *args) +os_getgrouplist_impl(PyObject *module, const char *user, gid_t basegid) +/*[clinic end generated code: output=0ebd7fb70115575b input=cc61d5c20b08958d]*/ +#endif { - const char *user; int i, ngroups; PyObject *list; #ifdef __APPLE__ - int *groups, basegid; + int *groups; #else - gid_t *groups, basegid; + gid_t *groups; #endif /* @@ -6897,15 +7007,6 @@ posix_getgrouplist(PyObject *self, PyObject *args) */ ngroups = 1 + MAX_GROUPS; -#ifdef __APPLE__ - if (!PyArg_ParseTuple(args, "si:getgrouplist", &user, &basegid)) - return NULL; -#else - if (!PyArg_ParseTuple(args, "sO&:getgrouplist", &user, - _Py_Gid_Converter, &basegid)) - return NULL; -#endif - while (1) { #ifdef __APPLE__ groups = PyMem_New(int, ngroups); @@ -7076,40 +7177,47 @@ os_getgroups_impl(PyObject *module) #endif /* HAVE_GETGROUPS */ #ifdef HAVE_INITGROUPS -PyDoc_STRVAR(posix_initgroups__doc__, -"initgroups(username, gid) -> None\n\n\ -Call the system initgroups() to initialize the group access list with all of\n\ -the groups of which the specified username is a member, plus the specified\n\ -group id."); +#ifdef __APPLE__ +/*[clinic input] +os.initgroups + + username as oname: FSConverter + gid: int + / + +Initialize the group access list. + +Call the system initgroups() to initialize the group access list with all of +the groups of which the specified username is a member, plus the specified +group id. +[clinic start generated code]*/ -/* AC 3.5: funny apple logic */ static PyObject * -posix_initgroups(PyObject *self, PyObject *args) -{ - PyObject *oname; - const char *username; - int res; -#ifdef __APPLE__ - int gid; +os_initgroups_impl(PyObject *module, PyObject *oname, int gid) +/*[clinic end generated code: output=7f074d30a425fd3a input=df3d54331b0af204]*/ #else - gid_t gid; -#endif +/*[clinic input] +os.initgroups -#ifdef __APPLE__ - if (!PyArg_ParseTuple(args, "O&i:initgroups", - PyUnicode_FSConverter, &oname, - &gid)) -#else - if (!PyArg_ParseTuple(args, "O&O&:initgroups", - PyUnicode_FSConverter, &oname, - _Py_Gid_Converter, &gid)) + username as oname: FSConverter + gid: gid_t + / + +Initialize the group access list. + +Call the system initgroups() to initialize the group access list with all of +the groups of which the specified username is a member, plus the specified +group id. +[clinic start generated code]*/ + +static PyObject * +os_initgroups_impl(PyObject *module, PyObject *oname, gid_t gid) +/*[clinic end generated code: output=59341244521a9e3f input=0cb91bdc59a4c564]*/ #endif - return NULL; - username = PyBytes_AS_STRING(oname); +{ + const char *username = PyBytes_AS_STRING(oname); - res = initgroups(username, gid); - Py_DECREF(oname); - if (res == -1) + if (initgroups(username, gid) == -1) return PyErr_SetFromErrno(PyExc_OSError); Py_RETURN_NONE; @@ -7609,27 +7717,31 @@ os_setgroups(PyObject *module, PyObject *groups) #if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) static PyObject * -wait_helper(pid_t pid, int status, struct rusage *ru) +wait_helper(PyObject *module, pid_t pid, int status, struct rusage *ru) { PyObject *result; - static PyObject *struct_rusage; - _Py_IDENTIFIER(struct_rusage); + PyObject *struct_rusage; if (pid == -1) return posix_error(); - if (struct_rusage == NULL) { - PyObject *m = PyImport_ImportModuleNoBlock("resource"); - if (m == NULL) - return NULL; - struct_rusage = _PyObject_GetAttrId(m, &PyId_struct_rusage); - Py_DECREF(m); - if (struct_rusage == NULL) - return NULL; + // If wait succeeded but no child was ready to report status, ru will not + // have been populated. + if (pid == 0) { + memset(ru, 0, sizeof(*ru)); } + PyObject *m = PyImport_ImportModuleNoBlock("resource"); + if (m == NULL) + return NULL; + struct_rusage = PyObject_GetAttr(m, get_posix_state(module)->struct_rusage); + Py_DECREF(m); + if (struct_rusage == NULL) + return NULL; + /* XXX(nnorwitz): Copied (w/mods) from resource.c, there should be only one. */ result = PyStructSequence_New((PyTypeObject*) struct_rusage); + Py_DECREF(struct_rusage); if (!result) return NULL; @@ -7698,7 +7810,7 @@ os_wait3_impl(PyObject *module, int options) if (pid < 0) return (!async_err) ? posix_error() : NULL; - return wait_helper(pid, WAIT_STATUS_INT(status), &ru); + return wait_helper(module, pid, WAIT_STATUS_INT(status), &ru); } #endif /* HAVE_WAIT3 */ @@ -7735,7 +7847,7 @@ os_wait4_impl(PyObject *module, pid_t pid, int options) if (res < 0) return (!async_err) ? posix_error() : NULL; - return wait_helper(res, WAIT_STATUS_INT(status), &ru); + return wait_helper(module, res, WAIT_STATUS_INT(status), &ru); } #endif /* HAVE_WAIT4 */ @@ -7780,7 +7892,8 @@ os_waitid_impl(PyObject *module, idtype_t idtype, id_t id, int options) if (si.si_pid == 0) Py_RETURN_NONE; - result = PyStructSequence_New(WaitidResultType); + PyObject *WaitidResultType = get_posix_state(module)->WaitidResultType; + result = PyStructSequence_New((PyTypeObject *)WaitidResultType); if (!result) return NULL; @@ -7906,6 +8019,30 @@ os_wait_impl(PyObject *module) } #endif /* HAVE_WAIT */ +#if defined(__linux__) && defined(__NR_pidfd_open) +/*[clinic input] +os.pidfd_open + pid: pid_t + flags: unsigned_int = 0 + +Return a file descriptor referring to the process *pid*. + +The descriptor can be used to perform process management without races and +signals. +[clinic start generated code]*/ + +static PyObject * +os_pidfd_open_impl(PyObject *module, pid_t pid, unsigned int flags) +/*[clinic end generated code: output=5c7252698947dc41 input=c3fd99ce947ccfef]*/ +{ + int fd = syscall(__NR_pidfd_open, pid, flags); + if (fd < 0) { + return posix_error(); + } + return PyLong_FromLong(fd); +} +#endif + #if defined(HAVE_READLINK) || defined(MS_WINDOWS) /*[clinic input] @@ -8242,8 +8379,6 @@ static PyStructSequence_Desc times_result_desc = { 5 }; -static PyTypeObject* TimesResultType; - #ifdef MS_WINDOWS #define HAVE_TIMES /* mandatory, for the method table */ #endif @@ -8251,11 +8386,12 @@ static PyTypeObject* TimesResultType; #ifdef HAVE_TIMES static PyObject * -build_times_result(double user, double system, +build_times_result(PyObject *module, double user, double system, double children_user, double children_system, double elapsed) { - PyObject *value = PyStructSequence_New(TimesResultType); + PyObject *TimesResultType = get_posix_state(module)->TimesResultType; + PyObject *value = PyStructSequence_New((PyTypeObject *)TimesResultType); if (value == NULL) return NULL; @@ -8310,7 +8446,7 @@ os_times_impl(PyObject *module) 1e7 is one second in such units; 1e-7 the inverse. 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7. */ - return build_times_result( + return build_times_result(module, (double)(user.dwHighDateTime*429.4967296 + user.dwLowDateTime*1e-7), (double)(kernel.dwHighDateTime*429.4967296 + @@ -8329,7 +8465,7 @@ os_times_impl(PyObject *module) c = times(&t); if (c == (clock_t) -1) return posix_error(); - return build_times_result( + return build_times_result(module, (double)t.tms_utime / ticks_per_second, (double)t.tms_stime / ticks_per_second, (double)t.tms_cutime / ticks_per_second, @@ -8563,10 +8699,13 @@ _fdwalk_close_func(void *lohi, int fd) int lo = ((int *)lohi)[0]; int hi = ((int *)lohi)[1]; - if (fd >= hi) + if (fd >= hi) { return 1; - else if (fd >= lo) - close(fd); + } + else if (fd >= lo) { + /* Ignore errors */ + (void)close(fd); + } return 0; } #endif /* HAVE_FDWALK */ @@ -8587,8 +8726,6 @@ os_closerange_impl(PyObject *module, int fd_low, int fd_high) { #ifdef HAVE_FDWALK int lohi[2]; -#else - int i; #endif Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH @@ -8597,8 +8734,20 @@ os_closerange_impl(PyObject *module, int fd_low, int fd_high) lohi[1] = fd_high; fdwalk(_fdwalk_close_func, lohi); #else - for (i = Py_MAX(fd_low, 0); i < fd_high; i++) - close(i); + fd_low = Py_MAX(fd_low, 0); +#ifdef __FreeBSD__ + if (fd_high >= sysconf(_SC_OPEN_MAX)) { + /* Any errors encountered while closing file descriptors are ignored */ + closefrom(fd_low); + } + else +#endif + { + for (int i = fd_low; i < fd_high; i++) { + /* Ignore errors */ + (void)close(i); + } + } #endif _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS @@ -8965,11 +9114,10 @@ os_readv_impl(PyObject *module, int fd, PyObject *buffers) #ifdef HAVE_PREAD /*[clinic input] -# TODO length should be size_t! but Python doesn't support parsing size_t yet. os.pread fd: int - length: int + length: Py_ssize_t offset: Py_off_t / @@ -8980,8 +9128,8 @@ the beginning of the file. The file offset remains unchanged. [clinic start generated code]*/ static PyObject * -os_pread_impl(PyObject *module, int fd, int length, Py_off_t offset) -/*[clinic end generated code: output=435b29ee32b54a78 input=084948dcbaa35d4c]*/ +os_pread_impl(PyObject *module, int fd, Py_ssize_t length, Py_off_t offset) +/*[clinic end generated code: output=3f875c1eef82e32f input=85cb4a5589627144]*/ { Py_ssize_t n; int async_err = 0; @@ -9120,47 +9268,77 @@ os_write_impl(PyObject *module, int fd, Py_buffer *data) } #ifdef HAVE_SENDFILE -PyDoc_STRVAR(posix_sendfile__doc__, -"sendfile(out, in, offset, count) -> byteswritten\n\ -sendfile(out, in, offset, count[, headers][, trailers], flags=0)\n\ - -> byteswritten\n\ -Copy count bytes from file descriptor in to file descriptor out."); +#ifdef __APPLE__ +/*[clinic input] +os.sendfile + + out_fd: int + in_fd: int + offset: Py_off_t + count as sbytes: Py_off_t + headers: object(c_default="NULL") = () + trailers: object(c_default="NULL") = () + flags: int = 0 + +Copy count bytes from file descriptor in_fd to file descriptor out_fd. +[clinic start generated code]*/ + +static PyObject * +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset, + Py_off_t sbytes, PyObject *headers, PyObject *trailers, + int flags) +/*[clinic end generated code: output=81c4bcd143f5c82b input=b0d72579d4c69afa]*/ +#elif defined(__FreeBSD__) || defined(__DragonFly__) +/*[clinic input] +os.sendfile + + out_fd: int + in_fd: int + offset: Py_off_t + count: Py_ssize_t + headers: object(c_default="NULL") = () + trailers: object(c_default="NULL") = () + flags: int = 0 + +Copy count bytes from file descriptor in_fd to file descriptor out_fd. +[clinic start generated code]*/ + +static PyObject * +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset, + Py_ssize_t count, PyObject *headers, PyObject *trailers, + int flags) +/*[clinic end generated code: output=329ea009bdd55afc input=338adb8ff84ae8cd]*/ +#else +/*[clinic input] +os.sendfile + + out_fd: int + in_fd: int + offset as offobj: object + count: Py_ssize_t + +Copy count bytes from file descriptor in_fd to file descriptor out_fd. +[clinic start generated code]*/ -/* AC 3.5: don't bother converting, has optional group*/ static PyObject * -posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict) +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj, + Py_ssize_t count) +/*[clinic end generated code: output=ae81216e40f167d8 input=76d64058c74477ba]*/ +#endif { - int in, out; Py_ssize_t ret; int async_err = 0; - off_t offset; #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__APPLE__) #ifndef __APPLE__ - Py_ssize_t len; + off_t sbytes; #endif - PyObject *headers = NULL, *trailers = NULL; Py_buffer *hbuf, *tbuf; - off_t sbytes; struct sf_hdtr sf; - int flags = 0; - /* Beware that "in" clashes with Python's own "in" operator keyword */ - static char *keywords[] = {"out", "in", - "offset", "count", - "headers", "trailers", "flags", NULL}; sf.headers = NULL; sf.trailers = NULL; -#ifdef __APPLE__ - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiO&O&|OOi:sendfile", - keywords, &out, &in, Py_off_t_converter, &offset, Py_off_t_converter, &sbytes, -#else - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiO&n|OOi:sendfile", - keywords, &out, &in, Py_off_t_converter, &offset, &len, -#endif - &headers, &trailers, &flags)) - return NULL; if (headers != NULL) { if (!PySequence_Check(headers)) { PyErr_SetString(PyExc_TypeError, @@ -9222,9 +9400,9 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict) do { Py_BEGIN_ALLOW_THREADS #ifdef __APPLE__ - ret = sendfile(in, out, offset, &sbytes, &sf, flags); + ret = sendfile(in_fd, out_fd, offset, &sbytes, &sf, flags); #else - ret = sendfile(in, out, offset, len, &sf, &sbytes, flags); + ret = sendfile(in_fd, out_fd, offset, count, &sf, &sbytes, flags); #endif Py_END_ALLOW_THREADS } while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); @@ -9259,18 +9437,11 @@ done: #endif #else - Py_ssize_t count; - PyObject *offobj; - static char *keywords[] = {"out", "in", - "offset", "count", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiOn:sendfile", - keywords, &out, &in, &offobj, &count)) - return NULL; #ifdef __linux__ if (offobj == Py_None) { do { Py_BEGIN_ALLOW_THREADS - ret = sendfile(out, in, NULL, count); + ret = sendfile(out_fd, in_fd, NULL, count); Py_END_ALLOW_THREADS } while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); if (ret < 0) @@ -9278,12 +9449,31 @@ done: return Py_BuildValue("n", ret); } #endif + off_t offset; if (!Py_off_t_converter(offobj, &offset)) return NULL; +#if defined(__sun) && defined(__SVR4) + // On Solaris, sendfile raises EINVAL rather than returning 0 + // when the offset is equal or bigger than the in_fd size. + struct stat st; + + do { + Py_BEGIN_ALLOW_THREADS + ret = fstat(in_fd, &st); + Py_END_ALLOW_THREADS + } while (ret != 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); + if (ret < 0) + return (!async_err) ? posix_error() : NULL; + + if (offset >= st.st_size) { + return Py_BuildValue("i", 0); + } +#endif + do { Py_BEGIN_ALLOW_THREADS - ret = sendfile(out, in, &offset, count); + ret = sendfile(out_fd, in_fd, &offset, count); Py_END_ALLOW_THREADS } while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); if (ret < 0) @@ -9298,8 +9488,8 @@ done: /*[clinic input] os._fcopyfile - infd: int - outfd: int + in_fd: int + out_fd: int flags: int / @@ -9307,13 +9497,13 @@ Efficiently copy content or metadata of 2 regular file descriptors (macOS). [clinic start generated code]*/ static PyObject * -os__fcopyfile_impl(PyObject *module, int infd, int outfd, int flags) -/*[clinic end generated code: output=8e8885c721ec38e3 input=69e0770e600cb44f]*/ +os__fcopyfile_impl(PyObject *module, int in_fd, int out_fd, int flags) +/*[clinic end generated code: output=c9d1a35a992e401b input=1e34638a86948795]*/ { int ret; Py_BEGIN_ALLOW_THREADS - ret = fcopyfile(infd, outfd, NULL, flags); + ret = fcopyfile(in_fd, out_fd, NULL, flags); Py_END_ALLOW_THREADS if (ret < 0) return posix_error(); @@ -9354,7 +9544,7 @@ os_fstat_impl(PyObject *module, int fd) #endif } - return _pystat_fromstructstat(&st); + return _pystat_fromstructstat(module, &st); } @@ -10080,45 +10270,11 @@ os_posix_fadvise_impl(PyObject *module, int fd, Py_off_t offset, } #endif /* HAVE_POSIX_FADVISE && !POSIX_FADVISE_AIX_BUG */ -#ifdef HAVE_PUTENV - -/* Save putenv() parameters as values here, so we can collect them when they - * get re-set with another call for the same key. */ -static PyObject *posix_putenv_garbage; - -static void -posix_putenv_garbage_setitem(PyObject *name, PyObject *value) -{ - /* Install the first arg and newstr in posix_putenv_garbage; - * this will cause previous value to be collected. This has to - * happen after the real putenv() call because the old value - * was still accessible until then. */ - if (PyDict_SetItem(posix_putenv_garbage, name, value)) - /* really not much we can do; just leak */ - PyErr_Clear(); - else - Py_DECREF(value); -} - #ifdef MS_WINDOWS -/*[clinic input] -os.putenv - - name: unicode - value: unicode - / - -Change or add an environment variable. -[clinic start generated code]*/ - -static PyObject * -os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) -/*[clinic end generated code: output=d29a567d6b2327d2 input=ba586581c2e6105f]*/ +static PyObject* +win32_putenv(PyObject *name, PyObject *value) { - const wchar_t *env; - Py_ssize_t size; - /* Search from index 1 because on Windows starting '=' is allowed for defining hidden environment variables. */ if (PyUnicode_GET_LENGTH(name) == 0 || @@ -10127,38 +10283,73 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) PyErr_SetString(PyExc_ValueError, "illegal environment variable name"); return NULL; } - PyObject *unicode = PyUnicode_FromFormat("%U=%U", name, value); + PyObject *unicode; + if (value != NULL) { + unicode = PyUnicode_FromFormat("%U=%U", name, value); + } + else { + unicode = PyUnicode_FromFormat("%U=", name); + } if (unicode == NULL) { return NULL; } - env = PyUnicode_AsUnicodeAndSize(unicode, &size); - if (env == NULL) - goto error; + Py_ssize_t size; + /* PyUnicode_AsWideCharString() rejects embedded null characters */ + wchar_t *env = PyUnicode_AsWideCharString(unicode, &size); + Py_DECREF(unicode); + + if (env == NULL) { + return NULL; + } if (size > _MAX_ENV) { PyErr_Format(PyExc_ValueError, "the environment variable is longer than %u characters", _MAX_ENV); - goto error; - } - if (wcslen(env) != (size_t)size) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - goto error; + PyMem_Free(env); + return NULL; } - if (_wputenv(env)) { + /* _wputenv() and SetEnvironmentVariableW() update the environment in the + Process Environment Block (PEB). _wputenv() also updates CRT 'environ' + and '_wenviron' variables, whereas SetEnvironmentVariableW() does not. + + Prefer _wputenv() to be compatible with C libraries using CRT + variables and CRT functions using these variables (ex: getenv()). */ + int err = _wputenv(env); + PyMem_Free(env); + + if (err) { posix_error(); - goto error; + return NULL; } - posix_putenv_garbage_setitem(name, unicode); Py_RETURN_NONE; +} +#endif -error: - Py_DECREF(unicode); - return NULL; + +#ifdef MS_WINDOWS +/*[clinic input] +os.putenv + + name: unicode + value: unicode + / + +Change or add an environment variable. +[clinic start generated code]*/ + +static PyObject * +os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) +/*[clinic end generated code: output=d29a567d6b2327d2 input=ba586581c2e6105f]*/ +{ + if (PySys_Audit("os.putenv", "OO", name, value) < 0) { + return NULL; + } + return win32_putenv(name, value); } -#else /* MS_WINDOWS */ +#else /*[clinic input] os.putenv @@ -10173,8 +10364,6 @@ static PyObject * os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) /*[clinic end generated code: output=d29a567d6b2327d2 input=a97bc6152f688d31]*/ { - PyObject *bytes = NULL; - char *env; const char *name_string = PyBytes_AS_STRING(name); const char *value_string = PyBytes_AS_STRING(value); @@ -10182,28 +10371,38 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) PyErr_SetString(PyExc_ValueError, "illegal environment variable name"); return NULL; } + if (PySys_Audit("os.putenv", "OO", name, value) < 0) { return NULL; } - bytes = PyBytes_FromFormat("%s=%s", name_string, value_string); - if (bytes == NULL) { - return NULL; - } - env = PyBytes_AS_STRING(bytes); - if (putenv(env)) { - Py_DECREF(bytes); + if (setenv(name_string, value_string, 1)) { return posix_error(); } - - posix_putenv_garbage_setitem(name, bytes); Py_RETURN_NONE; } -#endif /* MS_WINDOWS */ -#endif /* HAVE_PUTENV */ +#endif /* !defined(MS_WINDOWS) */ -#ifdef HAVE_UNSETENV +#ifdef MS_WINDOWS +/*[clinic input] +os.unsetenv + name: unicode + / + +Delete an environment variable. +[clinic start generated code]*/ + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name) +/*[clinic end generated code: output=54c4137ab1834f02 input=4d6a1747cc526d2f]*/ +{ + if (PySys_Audit("os.unsetenv", "(O)", name) < 0) { + return NULL; + } + return win32_putenv(name, NULL); +} +#else /*[clinic input] os.unsetenv name: FSConverter @@ -10216,37 +10415,21 @@ static PyObject * os_unsetenv_impl(PyObject *module, PyObject *name) /*[clinic end generated code: output=54c4137ab1834f02 input=2bb5288a599c7107]*/ { -#ifndef HAVE_BROKEN_UNSETENV - int err; -#endif - if (PySys_Audit("os.unsetenv", "(O)", name) < 0) { return NULL; } - #ifdef HAVE_BROKEN_UNSETENV unsetenv(PyBytes_AS_STRING(name)); #else - err = unsetenv(PyBytes_AS_STRING(name)); - if (err) + int err = unsetenv(PyBytes_AS_STRING(name)); + if (err) { return posix_error(); + } #endif - /* Remove the key from posix_putenv_garbage; - * this will cause it to be collected. This has to - * happen after the real unsetenv() call because the - * old value was still accessible until then. - */ - if (PyDict_DelItem(posix_putenv_garbage, name)) { - /* really not much we can do; just leak */ - if (!PyErr_ExceptionMatches(PyExc_KeyError)) { - return NULL; - } - PyErr_Clear(); - } Py_RETURN_NONE; } -#endif /* HAVE_UNSETENV */ +#endif /* !MS_WINDOWS */ /*[clinic input] @@ -10447,8 +10630,9 @@ os_WSTOPSIG_impl(PyObject *module, int status) #include static PyObject* -_pystatvfs_fromstructstatvfs(struct statvfs st) { - PyObject *v = PyStructSequence_New(StatVFSResultType); +_pystatvfs_fromstructstatvfs(PyObject *module, struct statvfs st) { + PyObject *StatVFSResultType = get_posix_state(module)->StatVFSResultType; + PyObject *v = PyStructSequence_New((PyTypeObject *)StatVFSResultType); if (v == NULL) return NULL; @@ -10524,7 +10708,7 @@ os_fstatvfs_impl(PyObject *module, int fd) if (result != 0) return (!async_err) ? posix_error() : NULL; - return _pystatvfs_fromstructstatvfs(st); + return _pystatvfs_fromstructstatvfs(module, st); } #endif /* defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H) */ @@ -10571,7 +10755,7 @@ os_statvfs_impl(PyObject *module, path_t *path) return path_error(path); } - return _pystatvfs_fromstructstatvfs(st); + return _pystatvfs_fromstructstatvfs(module, st); } #endif /* defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H) */ @@ -11325,6 +11509,9 @@ static struct constdef posix_constants_sysconf[] = { #ifdef _SC_PAGE_SIZE {"SC_PAGE_SIZE", _SC_PAGE_SIZE}, #endif +#ifdef _SC_AIX_REALMEM + {"SC_AIX_REALMEM", _SC_AIX_REALMEM}, +#endif #ifdef _SC_PASS_MAX {"SC_PASS_MAX", _SC_PASS_MAX}, #endif @@ -12247,8 +12434,6 @@ os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags) /* Terminal size querying */ -static PyTypeObject* TerminalSizeType; - PyDoc_STRVAR(TerminalSize_docstring, "A tuple of (columns, lines) for holding terminal window size"); @@ -12266,29 +12451,34 @@ static PyStructSequence_Desc TerminalSize_desc = { }; #if defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL) -/* AC 3.5: fd should accept None */ -PyDoc_STRVAR(termsize__doc__, - "Return the size of the terminal window as (columns, lines).\n" \ - "\n" \ - "The optional argument fd (default standard output) specifies\n" \ - "which file descriptor should be queried.\n" \ - "\n" \ - "If the file descriptor is not connected to a terminal, an OSError\n" \ - "is thrown.\n" \ - "\n" \ - "This function will only be defined if an implementation is\n" \ - "available for this system.\n" \ - "\n" \ - "shutil.get_terminal_size is the high-level function which should\n" \ - "normally be used, os.get_terminal_size is the low-level implementation."); +/*[clinic input] +os.get_terminal_size -static PyObject* -get_terminal_size(PyObject *self, PyObject *args) + fd: int(c_default="fileno(stdout)", py_default="") = -1 + / + +Return the size of the terminal window as (columns, lines). + +The optional argument fd (default standard output) specifies +which file descriptor should be queried. + +If the file descriptor is not connected to a terminal, an OSError +is thrown. + +This function will only be defined if an implementation is +available for this system. + +shutil.get_terminal_size is the high-level function which should +normally be used, os.get_terminal_size is the low-level implementation. +[clinic start generated code]*/ + +static PyObject * +os_get_terminal_size_impl(PyObject *module, int fd) +/*[clinic end generated code: output=fbab93acef980508 input=ead5679b82ddb920]*/ { int columns, lines; PyObject *termsize; - int fd = fileno(stdout); /* Under some conditions stdout may not be connected and * fileno(stdout) may point to an invalid file descriptor. For example * GUI apps don't have valid standard streams by default. @@ -12297,9 +12487,6 @@ get_terminal_size(PyObject *self, PyObject *args) * the ioctl below will fail returning EBADF. This is what we want. */ - if (!PyArg_ParseTuple(args, "|i", &fd)) - return NULL; - #ifdef TERMSIZE_USE_IOCTL { struct winsize w; @@ -12339,7 +12526,8 @@ get_terminal_size(PyObject *self, PyObject *args) } #endif /* TERMSIZE_USE_CONIO */ - termsize = PyStructSequence_New(TerminalSizeType); + PyObject *TerminalSizeType = get_posix_state(module)->TerminalSizeType; + termsize = PyStructSequence_New((PyTypeObject *)TerminalSizeType); if (termsize == NULL) return NULL; PyStructSequence_SET_ITEM(termsize, 0, PyLong_FromLong(columns)); @@ -12369,8 +12557,6 @@ os_cpu_count_impl(PyObject *module) { int ncpu = 0; #ifdef MS_WINDOWS - /* Declare prototype here to avoid pulling in all of the Win7 APIs in 3.8 */ - DWORD WINAPI GetActiveProcessorCount(WORD group); ncpu = GetActiveProcessorCount(ALL_PROCESSOR_GROUPS); #elif defined(__hpux) ncpu = mpctl(MPC_GETNUMSPUS, NULL, NULL); @@ -12539,9 +12725,9 @@ os_set_blocking_impl(PyObject *module, int fd, int blocking) /*[clinic input] -class os.DirEntry "DirEntry *" "&DirEntryType" +class os.DirEntry "DirEntry *" "DirEntryType" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3138f09f7c683f1d]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3c18c7a448247980]*/ typedef struct { PyObject_HEAD @@ -12562,29 +12748,43 @@ typedef struct { #endif } DirEntry; +static PyObject * +_disabled_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyErr_Format(PyExc_TypeError, + "cannot create '%.100s' instances", _PyType_Name(type)); + return NULL; +} + static void DirEntry_dealloc(DirEntry *entry) { + PyTypeObject *tp = Py_TYPE(entry); Py_XDECREF(entry->name); Py_XDECREF(entry->path); Py_XDECREF(entry->stat); Py_XDECREF(entry->lstat); - Py_TYPE(entry)->tp_free((PyObject *)entry); + freefunc free_func = PyType_GetSlot(tp, Py_tp_free); + free_func(entry); + Py_DECREF(tp); } /* Forward reference */ static int -DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits); +DirEntry_test_mode(PyTypeObject *defining_class, DirEntry *self, + int follow_symlinks, unsigned short mode_bits); /*[clinic input] os.DirEntry.is_symlink -> bool + defining_class: defining_class + / Return True if the entry is a symbolic link; cached per entry. [clinic start generated code]*/ static int -os_DirEntry_is_symlink_impl(DirEntry *self) -/*[clinic end generated code: output=42244667d7bcfc25 input=1605a1b4b96976c3]*/ +os_DirEntry_is_symlink_impl(DirEntry *self, PyTypeObject *defining_class) +/*[clinic end generated code: output=293096d589b6d47c input=e9acc5ee4d511113]*/ { #ifdef MS_WINDOWS return (self->win32_lstat.st_mode & S_IFMT) == S_IFLNK; @@ -12593,15 +12793,15 @@ os_DirEntry_is_symlink_impl(DirEntry *self) if (self->d_type != DT_UNKNOWN) return self->d_type == DT_LNK; else - return DirEntry_test_mode(self, 0, S_IFLNK); + return DirEntry_test_mode(defining_class, self, 0, S_IFLNK); #else /* POSIX without d_type */ - return DirEntry_test_mode(self, 0, S_IFLNK); + return DirEntry_test_mode(defining_class, self, 0, S_IFLNK); #endif } static PyObject * -DirEntry_fetch_stat(DirEntry *self, int follow_symlinks) +DirEntry_fetch_stat(PyObject *module, DirEntry *self, int follow_symlinks) { int result; STRUCT_STAT st; @@ -12637,17 +12837,18 @@ DirEntry_fetch_stat(DirEntry *self, int follow_symlinks) if (result != 0) return path_object_error(self->path); - return _pystat_fromstructstat(&st); + return _pystat_fromstructstat(module, &st); } static PyObject * -DirEntry_get_lstat(DirEntry *self) +DirEntry_get_lstat(PyTypeObject *defining_class, DirEntry *self) { if (!self->lstat) { + PyObject *module = PyType_GetModule(defining_class); #ifdef MS_WINDOWS - self->lstat = _pystat_fromstructstat(&self->win32_lstat); + self->lstat = _pystat_fromstructstat(module, &self->win32_lstat); #else /* POSIX */ - self->lstat = DirEntry_fetch_stat(self, 0); + self->lstat = DirEntry_fetch_stat(module, self, 0); #endif } Py_XINCREF(self->lstat); @@ -12656,6 +12857,8 @@ DirEntry_get_lstat(DirEntry *self) /*[clinic input] os.DirEntry.stat + defining_class: defining_class + / * follow_symlinks: bool = True @@ -12663,20 +12866,26 @@ Return stat_result object for the entry; cached per entry. [clinic start generated code]*/ static PyObject * -os_DirEntry_stat_impl(DirEntry *self, int follow_symlinks) -/*[clinic end generated code: output=008593b3a6d01305 input=280d14c1d6f1d00d]*/ +os_DirEntry_stat_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks) +/*[clinic end generated code: output=23f803e19c3e780e input=e816273c4e67ee98]*/ { - if (!follow_symlinks) - return DirEntry_get_lstat(self); + if (!follow_symlinks) { + return DirEntry_get_lstat(defining_class, self); + } if (!self->stat) { - int result = os_DirEntry_is_symlink_impl(self); - if (result == -1) + int result = os_DirEntry_is_symlink_impl(self, defining_class); + if (result == -1) { return NULL; - else if (result) - self->stat = DirEntry_fetch_stat(self, 1); - else - self->stat = DirEntry_get_lstat(self); + } + if (result) { + PyObject *module = PyType_GetModule(defining_class); + self->stat = DirEntry_fetch_stat(module, self, 1); + } + else { + self->stat = DirEntry_get_lstat(defining_class, self); + } } Py_XINCREF(self->stat); @@ -12685,7 +12894,8 @@ os_DirEntry_stat_impl(DirEntry *self, int follow_symlinks) /* Set exception and return -1 on error, 0 for False, 1 for True */ static int -DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits) +DirEntry_test_mode(PyTypeObject *defining_class, DirEntry *self, + int follow_symlinks, unsigned short mode_bits) { PyObject *stat = NULL; PyObject *st_mode = NULL; @@ -12698,7 +12908,6 @@ DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits #ifdef MS_WINDOWS unsigned long dir_bits; #endif - _Py_IDENTIFIER(st_mode); #ifdef MS_WINDOWS is_symlink = (self->win32_lstat.st_mode & S_IFMT) == S_IFLNK; @@ -12711,7 +12920,7 @@ DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits #if defined(MS_WINDOWS) || defined(HAVE_DIRENT_D_TYPE) if (need_stat) { #endif - stat = os_DirEntry_stat_impl(self, follow_symlinks); + stat = os_DirEntry_stat_impl(self, defining_class, follow_symlinks); if (!stat) { if (PyErr_ExceptionMatches(PyExc_FileNotFoundError)) { /* If file doesn't exist (anymore), then return False @@ -12721,7 +12930,8 @@ DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits } goto error; } - st_mode = _PyObject_GetAttrId(stat, &PyId_st_mode); + _posixstate* state = get_posix_state(PyType_GetModule(defining_class)); + st_mode = PyObject_GetAttr(stat, state->st_mode); if (!st_mode) goto error; @@ -12764,6 +12974,8 @@ error: /*[clinic input] os.DirEntry.is_dir -> bool + defining_class: defining_class + / * follow_symlinks: bool = True @@ -12771,14 +12983,17 @@ Return True if the entry is a directory; cached per entry. [clinic start generated code]*/ static int -os_DirEntry_is_dir_impl(DirEntry *self, int follow_symlinks) -/*[clinic end generated code: output=ad2e8d54365da287 input=0135232766f53f58]*/ +os_DirEntry_is_dir_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks) +/*[clinic end generated code: output=0cd453b9c0987fdf input=1a4ffd6dec9920cb]*/ { - return DirEntry_test_mode(self, follow_symlinks, S_IFDIR); + return DirEntry_test_mode(defining_class, self, follow_symlinks, S_IFDIR); } /*[clinic input] os.DirEntry.is_file -> bool + defining_class: defining_class + / * follow_symlinks: bool = True @@ -12786,10 +13001,11 @@ Return True if the entry is a file; cached per entry. [clinic start generated code]*/ static int -os_DirEntry_is_file_impl(DirEntry *self, int follow_symlinks) -/*[clinic end generated code: output=8462ade481d8a476 input=0dc90be168b041ee]*/ +os_DirEntry_is_file_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks) +/*[clinic end generated code: output=f7c277ab5ba80908 input=0a64c5a12e802e3b]*/ { - return DirEntry_test_mode(self, follow_symlinks, S_IFREG); + return DirEntry_test_mode(defining_class, self, follow_symlinks, S_IFREG); } /*[clinic input] @@ -12866,42 +13082,29 @@ static PyMethodDef DirEntry_methods[] = { OS_DIRENTRY_STAT_METHODDEF OS_DIRENTRY_INODE_METHODDEF OS_DIRENTRY___FSPATH___METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL} }; -static PyTypeObject DirEntryType = { - PyVarObject_HEAD_INIT(NULL, 0) - MODNAME ".DirEntry", /* tp_name */ - sizeof(DirEntry), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)DirEntry_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)DirEntry_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - DirEntry_methods, /* tp_methods */ - DirEntry_members, /* tp_members */ +static PyType_Slot DirEntryType_slots[] = { + {Py_tp_new, _disabled_new}, + {Py_tp_dealloc, DirEntry_dealloc}, + {Py_tp_repr, DirEntry_repr}, + {Py_tp_methods, DirEntry_methods}, + {Py_tp_members, DirEntry_members}, + {0, 0}, }; +static PyType_Spec DirEntryType_spec = { + MODNAME ".DirEntry", + sizeof(DirEntry), + 0, + Py_TPFLAGS_DEFAULT, + DirEntryType_slots +}; + + #ifdef MS_WINDOWS static wchar_t * @@ -12938,14 +13141,15 @@ join_path_filenameW(const wchar_t *path_wide, const wchar_t *filename) } static PyObject * -DirEntry_from_find_data(path_t *path, WIN32_FIND_DATAW *dataW) +DirEntry_from_find_data(PyObject *module, path_t *path, WIN32_FIND_DATAW *dataW) { DirEntry *entry; BY_HANDLE_FILE_INFORMATION file_info; ULONG reparse_tag; wchar_t *joined_path; - entry = PyObject_New(DirEntry, &DirEntryType); + PyObject *DirEntryType = get_posix_state(module)->DirEntryType; + entry = PyObject_New(DirEntry, (PyTypeObject *)DirEntryType); if (!entry) return NULL; entry->name = NULL; @@ -13022,8 +13226,8 @@ join_path_filename(const char *path_narrow, const char* filename, Py_ssize_t fil } static PyObject * -DirEntry_from_posix_info(path_t *path, const char *name, Py_ssize_t name_len, - ino_t d_ino +DirEntry_from_posix_info(PyObject *module, path_t *path, const char *name, + Py_ssize_t name_len, ino_t d_ino #ifdef HAVE_DIRENT_D_TYPE , unsigned char d_type #endif @@ -13032,7 +13236,8 @@ DirEntry_from_posix_info(path_t *path, const char *name, Py_ssize_t name_len, DirEntry *entry; char *joined_path; - entry = PyObject_New(DirEntry, &DirEntryType); + PyObject *DirEntryType = get_posix_state(module)->DirEntryType; + entry = PyObject_New(DirEntry, (PyTypeObject *)DirEntryType); if (!entry) return NULL; entry->name = NULL; @@ -13151,8 +13356,10 @@ ScandirIterator_iternext(ScandirIterator *iterator) /* Skip over . and .. */ if (wcscmp(file_data->cFileName, L".") != 0 && - wcscmp(file_data->cFileName, L"..") != 0) { - entry = DirEntry_from_find_data(&iterator->path, file_data); + wcscmp(file_data->cFileName, L"..") != 0) + { + PyObject *module = PyType_GetModule(Py_TYPE(iterator)); + entry = DirEntry_from_find_data(module, &iterator->path, file_data); if (!entry) break; return entry; @@ -13223,10 +13430,12 @@ ScandirIterator_iternext(ScandirIterator *iterator) is_dot = direntp->d_name[0] == '.' && (name_len == 1 || (direntp->d_name[1] == '.' && name_len == 2)); if (!is_dot) { - entry = DirEntry_from_posix_info(&iterator->path, direntp->d_name, - name_len, direntp->d_ino + PyObject *module = PyType_GetModule(Py_TYPE(iterator)); + entry = DirEntry_from_posix_info(module, + &iterator->path, direntp->d_name, + name_len, direntp->d_ino #ifdef HAVE_DIRENT_D_TYPE - , direntp->d_type + , direntp->d_type #endif ); if (!entry) @@ -13294,10 +13503,13 @@ ScandirIterator_finalize(ScandirIterator *iterator) static void ScandirIterator_dealloc(ScandirIterator *iterator) { + PyTypeObject *tp = Py_TYPE(iterator); if (PyObject_CallFinalizerFromDealloc((PyObject *)iterator) < 0) return; - Py_TYPE(iterator)->tp_free((PyObject *)iterator); + freefunc free_func = PyType_GetSlot(tp, Py_tp_free); + free_func(iterator); + Py_DECREF(tp); } static PyMethodDef ScandirIterator_methods[] = { @@ -13307,56 +13519,24 @@ static PyMethodDef ScandirIterator_methods[] = { {NULL} }; -static PyTypeObject ScandirIteratorType = { - PyVarObject_HEAD_INIT(NULL, 0) - MODNAME ".ScandirIterator", /* tp_name */ - sizeof(ScandirIterator), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)ScandirIterator_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)ScandirIterator_iternext, /* tp_iternext */ - ScandirIterator_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ - 0, /* tp_del */ - 0, /* tp_version_tag */ - (destructor)ScandirIterator_finalize, /* tp_finalize */ +static PyType_Slot ScandirIteratorType_slots[] = { + {Py_tp_new, _disabled_new}, + {Py_tp_dealloc, ScandirIterator_dealloc}, + {Py_tp_finalize, ScandirIterator_finalize}, + {Py_tp_iter, PyObject_SelfIter}, + {Py_tp_iternext, ScandirIterator_iternext}, + {Py_tp_methods, ScandirIterator_methods}, + {0, 0}, +}; + +static PyType_Spec ScandirIteratorType_spec = { + MODNAME ".ScandirIterator", + sizeof(ScandirIterator), + 0, + // bpo-40549: Py_TPFLAGS_BASETYPE should not be used, since + // PyType_GetModule(Py_TYPE(self)) doesn't work on a subclass instance. + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE, + ScandirIteratorType_slots }; /*[clinic input] @@ -13392,7 +13572,8 @@ os_scandir_impl(PyObject *module, path_t *path) return NULL; } - iterator = PyObject_New(ScandirIterator, &ScandirIteratorType); + PyObject *ScandirIteratorType = get_posix_state(module)->ScandirIteratorType; + iterator = PyObject_New(ScandirIterator, (PyTypeObject *)ScandirIteratorType); if (!iterator) return NULL; @@ -13482,7 +13663,6 @@ PyOS_FSPath(PyObject *path) { /* For error message reasons, this function is manually inlined in path_converter(). */ - _Py_IDENTIFIER(__fspath__); PyObject *func = NULL; PyObject *path_repr = NULL; @@ -13496,7 +13676,7 @@ PyOS_FSPath(PyObject *path) return PyErr_Format(PyExc_TypeError, "expected str, bytes or os.PathLike object, " "not %.200s", - Py_TYPE(path)->tp_name); + _PyType_Name(Py_TYPE(path))); } path_repr = _PyObject_CallNoArg(func); @@ -13508,8 +13688,8 @@ PyOS_FSPath(PyObject *path) if (!(PyUnicode_Check(path_repr) || PyBytes_Check(path_repr))) { PyErr_Format(PyExc_TypeError, "expected %.200s.__fspath__() to return str or bytes, " - "not %.200s", Py_TYPE(path)->tp_name, - Py_TYPE(path_repr)->tp_name); + "not %.200s", _PyType_Name(Py_TYPE(path)), + _PyType_Name(Py_TYPE(path_repr))); Py_DECREF(path_repr); return NULL; } @@ -13709,6 +13889,105 @@ os__remove_dll_directory_impl(PyObject *module, PyObject *cookie) #endif + +/* Only check if WIFEXITED is available: expect that it comes + with WEXITSTATUS, WIFSIGNALED, etc. + + os.waitstatus_to_exitcode() is implemented in C and not in Python, so + subprocess can safely call it during late Python finalization without + risking that used os attributes were set to None by _PyImport_Cleanup(). */ +#if defined(WIFEXITED) || defined(MS_WINDOWS) +/*[clinic input] +os.waitstatus_to_exitcode + + status as status_obj: object + +Convert a wait status to an exit code. + +On Unix: + +* If WIFEXITED(status) is true, return WEXITSTATUS(status). +* If WIFSIGNALED(status) is true, return -WTERMSIG(status). +* Otherwise, raise a ValueError. + +On Windows, return status shifted right by 8 bits. + +On Unix, if the process is being traced or if waitpid() was called with +WUNTRACED option, the caller must first check if WIFSTOPPED(status) is true. +This function must not be called if WIFSTOPPED(status) is true. +[clinic start generated code]*/ + +static PyObject * +os_waitstatus_to_exitcode_impl(PyObject *module, PyObject *status_obj) +/*[clinic end generated code: output=db50b1b0ba3c7153 input=7fe2d7fdaea3db42]*/ +{ + if (PyFloat_Check(status_obj)) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + return NULL; + } +#ifndef MS_WINDOWS + int status = _PyLong_AsInt(status_obj); + if (status == -1 && PyErr_Occurred()) { + return NULL; + } + + WAIT_TYPE wait_status; + WAIT_STATUS_INT(wait_status) = status; + int exitcode; + if (WIFEXITED(wait_status)) { + exitcode = WEXITSTATUS(wait_status); + /* Sanity check to provide warranty on the function behavior. + It should not occur in practice */ + if (exitcode < 0) { + PyErr_Format(PyExc_ValueError, "invalid WEXITSTATUS: %i", exitcode); + return NULL; + } + } + else if (WIFSIGNALED(wait_status)) { + int signum = WTERMSIG(wait_status); + /* Sanity check to provide warranty on the function behavior. + It should not occurs in practice */ + if (signum <= 0) { + PyErr_Format(PyExc_ValueError, "invalid WTERMSIG: %i", signum); + return NULL; + } + exitcode = -signum; + } else if (WIFSTOPPED(wait_status)) { + /* Status only received if the process is being traced + or if waitpid() was called with WUNTRACED option. */ + int signum = WSTOPSIG(wait_status); + PyErr_Format(PyExc_ValueError, + "process stopped by delivery of signal %i", + signum); + return NULL; + } + else { + PyErr_Format(PyExc_ValueError, "invalid wait status: %i", status); + return NULL; + } + return PyLong_FromLong(exitcode); +#else + /* Windows implementation: see os.waitpid() implementation + which uses _cwait(). */ + unsigned long long status = PyLong_AsUnsignedLongLong(status_obj); + if (status == (unsigned long long)-1 && PyErr_Occurred()) { + return NULL; + } + + unsigned long long exitcode = (status >> 8); + /* ExitProcess() accepts an UINT type: + reject exit code which doesn't fit in an UINT */ + if (exitcode > UINT_MAX) { + PyErr_Format(PyExc_ValueError, "invalid exit code: %llu", exitcode); + return NULL; + } + return PyLong_FromUnsignedLong((unsigned long)exitcode); +#endif +} +#endif + + static PyMethodDef posix_methods[] = { OS_STAT_METHODDEF @@ -13773,9 +14052,7 @@ static PyMethodDef posix_methods[] = { OS_GETEGID_METHODDEF OS_GETEUID_METHODDEF OS_GETGID_METHODDEF -#ifdef HAVE_GETGROUPLIST - {"getgrouplist", posix_getgrouplist, METH_VARARGS, posix_getgrouplist__doc__}, -#endif + OS_GETGROUPLIST_METHODDEF OS_GETGROUPS_METHODDEF OS_GETPID_METHODDEF OS_GETPGRP_METHODDEF @@ -13785,9 +14062,7 @@ static PyMethodDef posix_methods[] = { OS_KILL_METHODDEF OS_KILLPG_METHODDEF OS_PLOCK_METHODDEF -#ifdef MS_WINDOWS OS_STARTFILE_METHODDEF -#endif OS_SETUID_METHODDEF OS_SETEUID_METHODDEF OS_SETREUID_METHODDEF @@ -13795,9 +14070,7 @@ static PyMethodDef posix_methods[] = { OS_SETEGID_METHODDEF OS_SETREGID_METHODDEF OS_SETGROUPS_METHODDEF -#ifdef HAVE_INITGROUPS - {"initgroups", posix_initgroups, METH_VARARGS, posix_initgroups__doc__}, -#endif /* HAVE_INITGROUPS */ + OS_INITGROUPS_METHODDEF OS_GETPGID_METHODDEF OS_SETPGRP_METHODDEF OS_WAIT_METHODDEF @@ -13805,6 +14078,7 @@ static PyMethodDef posix_methods[] = { OS_WAIT4_METHODDEF OS_WAITID_METHODDEF OS_WAITPID_METHODDEF + OS_PIDFD_OPEN_METHODDEF OS_GETSID_METHODDEF OS_SETSID_METHODDEF OS_SETPGID_METHODDEF @@ -13826,10 +14100,7 @@ static PyMethodDef posix_methods[] = { OS_WRITEV_METHODDEF OS_PWRITE_METHODDEF OS_PWRITEV_METHODDEF -#ifdef HAVE_SENDFILE - {"sendfile", (PyCFunction)(void(*)(void))posix_sendfile, METH_VARARGS | METH_KEYWORDS, - posix_sendfile__doc__}, -#endif + OS_SENDFILE_METHODDEF OS_FSTAT_METHODDEF OS_ISATTY_METHODDEF OS_PIPE_METHODDEF @@ -13881,26 +14152,21 @@ static PyMethodDef posix_methods[] = { OS_REMOVEXATTR_METHODDEF OS_LISTXATTR_METHODDEF -#if defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL) - {"get_terminal_size", get_terminal_size, METH_VARARGS, termsize__doc__}, -#endif + OS_GET_TERMINAL_SIZE_METHODDEF OS_CPU_COUNT_METHODDEF OS_GET_INHERITABLE_METHODDEF OS_SET_INHERITABLE_METHODDEF OS_GET_HANDLE_INHERITABLE_METHODDEF OS_SET_HANDLE_INHERITABLE_METHODDEF -#ifndef MS_WINDOWS OS_GET_BLOCKING_METHODDEF OS_SET_BLOCKING_METHODDEF -#endif OS_SCANDIR_METHODDEF OS_FSPATH_METHODDEF OS_GETRANDOM_METHODDEF OS_MEMFD_CREATE_METHODDEF -#ifdef MS_WINDOWS OS__ADD_DLL_DIRECTORY_METHODDEF OS__REMOVE_DLL_DIRECTORY_METHODDEF -#endif + OS_WAITSTATUS_TO_EXITCODE_METHODDEF {NULL, NULL} /* Sentinel */ }; @@ -14208,6 +14474,9 @@ all_ins(PyObject *m) if (PyModule_AddIntMacro(m, P_PID)) return -1; if (PyModule_AddIntMacro(m, P_PGID)) return -1; if (PyModule_AddIntMacro(m, P_ALL)) return -1; +#ifdef P_PIDFD + if (PyModule_AddIntMacro(m, P_PIDFD)) return -1; +#endif #endif #ifdef WEXITED if (PyModule_AddIntMacro(m, WEXITED)) return -1; @@ -14221,12 +14490,18 @@ all_ins(PyObject *m) #ifdef CLD_EXITED if (PyModule_AddIntMacro(m, CLD_EXITED)) return -1; #endif +#ifdef CLD_KILLED + if (PyModule_AddIntMacro(m, CLD_KILLED)) return -1; +#endif #ifdef CLD_DUMPED if (PyModule_AddIntMacro(m, CLD_DUMPED)) return -1; #endif #ifdef CLD_TRAPPED if (PyModule_AddIntMacro(m, CLD_TRAPPED)) return -1; #endif +#ifdef CLD_STOPPED + if (PyModule_AddIntMacro(m, CLD_STOPPED)) return -1; +#endif #ifdef CLD_CONTINUED if (PyModule_AddIntMacro(m, CLD_CONTINUED)) return -1; #endif @@ -14412,19 +14687,6 @@ all_ins(PyObject *m) } -static struct PyModuleDef posixmodule = { - PyModuleDef_HEAD_INIT, - MODNAME, - posix__doc__, - -1, - posix_methods, - NULL, - NULL, - NULL, - NULL -}; - - static const char * const have_functions[] = { #ifdef HAVE_FACCESSAT @@ -14559,122 +14821,122 @@ static const char * const have_functions[] = { }; -PyMODINIT_FUNC -INITFUNC(void) +static int +posixmodule_exec(PyObject *m) { - PyObject *m, *v; - PyObject *list; - const char * const *trace; - - m = PyModule_Create(&posixmodule); - if (m == NULL) - return NULL; + _posixstate *state = get_posix_state(m); /* Initialize environ dictionary */ - v = convertenviron(); + PyObject *v = convertenviron(); Py_XINCREF(v); if (v == NULL || PyModule_AddObject(m, "environ", v) != 0) - return NULL; + return -1; Py_DECREF(v); if (all_ins(m)) - return NULL; + return -1; if (setup_confname_tables(m)) - return NULL; + return -1; Py_INCREF(PyExc_OSError); PyModule_AddObject(m, "error", PyExc_OSError); -#ifdef HAVE_PUTENV - if (posix_putenv_garbage == NULL) - posix_putenv_garbage = PyDict_New(); -#endif - - if (!initialized) { #if defined(HAVE_WAITID) && !defined(__APPLE__) - waitid_result_desc.name = MODNAME ".waitid_result"; - WaitidResultType = PyStructSequence_NewType(&waitid_result_desc); - if (WaitidResultType == NULL) { - return NULL; - } + waitid_result_desc.name = MODNAME ".waitid_result"; + PyObject *WaitidResultType = (PyObject *)PyStructSequence_NewType(&waitid_result_desc); + if (WaitidResultType == NULL) { + return -1; + } + Py_INCREF(WaitidResultType); + PyModule_AddObject(m, "waitid_result", WaitidResultType); + state->WaitidResultType = WaitidResultType; #endif - stat_result_desc.name = "os.stat_result"; /* see issue #19209 */ - stat_result_desc.fields[7].name = PyStructSequence_UnnamedField; - stat_result_desc.fields[8].name = PyStructSequence_UnnamedField; - stat_result_desc.fields[9].name = PyStructSequence_UnnamedField; - StatResultType = PyStructSequence_NewType(&stat_result_desc); - if (StatResultType == NULL) { - return NULL; - } - structseq_new = StatResultType->tp_new; - StatResultType->tp_new = statresult_new; + stat_result_desc.name = "os.stat_result"; /* see issue #19209 */ + stat_result_desc.fields[7].name = PyStructSequence_UnnamedField; + stat_result_desc.fields[8].name = PyStructSequence_UnnamedField; + stat_result_desc.fields[9].name = PyStructSequence_UnnamedField; + PyObject *StatResultType = (PyObject *)PyStructSequence_NewType(&stat_result_desc); + if (StatResultType == NULL) { + return -1; + } + Py_INCREF(StatResultType); + PyModule_AddObject(m, "stat_result", StatResultType); + state->StatResultType = StatResultType; + structseq_new = ((PyTypeObject *)StatResultType)->tp_new; + ((PyTypeObject *)StatResultType)->tp_new = statresult_new; - statvfs_result_desc.name = "os.statvfs_result"; /* see issue #19209 */ - StatVFSResultType = PyStructSequence_NewType(&statvfs_result_desc); - if (StatVFSResultType == NULL) { - return NULL; - } + statvfs_result_desc.name = "os.statvfs_result"; /* see issue #19209 */ + PyObject *StatVFSResultType = (PyObject *)PyStructSequence_NewType(&statvfs_result_desc); + if (StatVFSResultType == NULL) { + return -1; + } + Py_INCREF(StatVFSResultType); + PyModule_AddObject(m, "statvfs_result", StatVFSResultType); + state->StatVFSResultType = StatVFSResultType; #ifdef NEED_TICKS_PER_SECOND # if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK) - ticks_per_second = sysconf(_SC_CLK_TCK); + ticks_per_second = sysconf(_SC_CLK_TCK); # elif defined(HZ) - ticks_per_second = HZ; + ticks_per_second = HZ; # else - ticks_per_second = 60; /* magic fallback value; may be bogus */ + ticks_per_second = 60; /* magic fallback value; may be bogus */ # endif #endif #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) - sched_param_desc.name = MODNAME ".sched_param"; - SchedParamType = PyStructSequence_NewType(&sched_param_desc); - if (SchedParamType == NULL) { - return NULL; - } - SchedParamType->tp_new = os_sched_param; + sched_param_desc.name = MODNAME ".sched_param"; + PyObject *SchedParamType = (PyObject *)PyStructSequence_NewType(&sched_param_desc); + if (SchedParamType == NULL) { + return -1; + } + Py_INCREF(SchedParamType); + PyModule_AddObject(m, "sched_param", SchedParamType); + state->SchedParamType = SchedParamType; + ((PyTypeObject *)SchedParamType)->tp_new = os_sched_param; #endif - /* initialize TerminalSize_info */ - TerminalSizeType = PyStructSequence_NewType(&TerminalSize_desc); - if (TerminalSizeType == NULL) { - return NULL; - } + /* initialize TerminalSize_info */ + PyObject *TerminalSizeType = (PyObject *)PyStructSequence_NewType(&TerminalSize_desc); + if (TerminalSizeType == NULL) { + return -1; + } + Py_INCREF(TerminalSizeType); + PyModule_AddObject(m, "terminal_size", TerminalSizeType); + state->TerminalSizeType = TerminalSizeType; - /* initialize scandir types */ - if (PyType_Ready(&ScandirIteratorType) < 0) - return NULL; - if (PyType_Ready(&DirEntryType) < 0) - return NULL; + /* initialize scandir types */ + PyObject *ScandirIteratorType = PyType_FromModuleAndSpec(m, &ScandirIteratorType_spec, NULL); + if (ScandirIteratorType == NULL) { + return -1; } -#if defined(HAVE_WAITID) && !defined(__APPLE__) - Py_INCREF((PyObject*) WaitidResultType); - PyModule_AddObject(m, "waitid_result", (PyObject*) WaitidResultType); -#endif - Py_INCREF((PyObject*) StatResultType); - PyModule_AddObject(m, "stat_result", (PyObject*) StatResultType); - Py_INCREF((PyObject*) StatVFSResultType); - PyModule_AddObject(m, "statvfs_result", - (PyObject*) StatVFSResultType); + state->ScandirIteratorType = ScandirIteratorType; -#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) - Py_INCREF(SchedParamType); - PyModule_AddObject(m, "sched_param", (PyObject *)SchedParamType); -#endif + PyObject *DirEntryType = PyType_FromModuleAndSpec(m, &DirEntryType_spec, NULL); + if (DirEntryType == NULL) { + return -1; + } + Py_INCREF(DirEntryType); + PyModule_AddObject(m, "DirEntry", DirEntryType); + state->DirEntryType = DirEntryType; times_result_desc.name = MODNAME ".times_result"; - TimesResultType = PyStructSequence_NewType(×_result_desc); + PyObject *TimesResultType = (PyObject *)PyStructSequence_NewType(×_result_desc); if (TimesResultType == NULL) { - return NULL; + return -1; } - PyModule_AddObject(m, "times_result", (PyObject *)TimesResultType); + Py_INCREF(TimesResultType); + PyModule_AddObject(m, "times_result", TimesResultType); + state->TimesResultType = TimesResultType; - uname_result_desc.name = MODNAME ".uname_result"; - UnameResultType = PyStructSequence_NewType(&uname_result_desc); + PyTypeObject *UnameResultType = PyStructSequence_NewType(&uname_result_desc); if (UnameResultType == NULL) { - return NULL; + return -1; } + Py_INCREF(UnameResultType); PyModule_AddObject(m, "uname_result", (PyObject *)UnameResultType); + state->UnameResultType = (PyObject *)UnameResultType; #ifdef __APPLE__ /* @@ -14690,7 +14952,7 @@ INITFUNC(void) #ifdef HAVE_FSTATVFS if (fstatvfs == NULL) { if (PyObject_DelAttrString(m, "fstatvfs") == -1) { - return NULL; + return -1; } } #endif /* HAVE_FSTATVFS */ @@ -14698,7 +14960,7 @@ INITFUNC(void) #ifdef HAVE_STATVFS if (statvfs == NULL) { if (PyObject_DelAttrString(m, "statvfs") == -1) { - return NULL; + return -1; } } #endif /* HAVE_STATVFS */ @@ -14706,7 +14968,7 @@ INITFUNC(void) # ifdef HAVE_LCHOWN if (lchown == NULL) { if (PyObject_DelAttrString(m, "lchown") == -1) { - return NULL; + return -1; } } #endif /* HAVE_LCHOWN */ @@ -14714,12 +14976,16 @@ INITFUNC(void) #endif /* __APPLE__ */ - Py_INCREF(TerminalSizeType); - PyModule_AddObject(m, "terminal_size", (PyObject*)TerminalSizeType); - - billion = PyLong_FromLong(1000000000); - if (!billion) - return NULL; + if ((state->billion = PyLong_FromLong(1000000000)) == NULL) + return -1; +#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) + state->struct_rusage = PyUnicode_InternFromString("struct_rusage"); + if (state->struct_rusage == NULL) + return -1; +#endif + state->st_mode = PyUnicode_InternFromString("st_mode"); + if (state->st_mode == NULL) + return -1; /* suppress "function not used" warnings */ { @@ -14735,25 +15001,45 @@ INITFUNC(void) * provide list of locally available functions * so os.py can populate support_* lists */ - list = PyList_New(0); - if (!list) - return NULL; - for (trace = have_functions; *trace; trace++) { + PyObject *list = PyList_New(0); + if (!list) { + return -1; + } + for (const char * const *trace = have_functions; *trace; trace++) { PyObject *unicode = PyUnicode_DecodeASCII(*trace, strlen(*trace), NULL); if (!unicode) - return NULL; + return -1; if (PyList_Append(list, unicode)) - return NULL; + return -1; Py_DECREF(unicode); } PyModule_AddObject(m, "_have_functions", list); - Py_INCREF((PyObject *) &DirEntryType); - PyModule_AddObject(m, "DirEntry", (PyObject *)&DirEntryType); + return 0; +} - initialized = 1; - return m; +static PyModuleDef_Slot posixmodile_slots[] = { + {Py_mod_exec, posixmodule_exec}, + {0, NULL} +}; + +static struct PyModuleDef posixmodule = { + PyModuleDef_HEAD_INIT, + .m_name = MODNAME, + .m_doc = posix__doc__, + .m_size = sizeof(_posixstate), + .m_methods = posix_methods, + .m_slots = posixmodile_slots, + .m_traverse = _posix_traverse, + .m_clear = _posix_clear, + .m_free = _posix_free, +}; + +PyMODINIT_FUNC +INITFUNC(void) +{ + return PyModuleDef_Init(&posixmodule); } #ifdef __cplusplus diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c index e0232b8d..901a3ed9 100644 --- a/Modules/pwdmodule.c +++ b/Modules/pwdmodule.c @@ -47,8 +47,21 @@ The uid and gid items are integers, all others are strings. An\n\ exception is raised if the entry asked for cannot be found."); -static int initialized; -static PyTypeObject StructPwdType; +typedef struct { + PyTypeObject *StructPwdType; +} pwdmodulestate; + +static inline pwdmodulestate* +get_pwd_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (pwdmodulestate *)state; +} + +#define modulestate_global get_pwd_state(PyState_FindModule(&pwdmodule)) + +static struct PyModuleDef pwdmodule; #define DEFAULT_BUFFER_SIZE 1024 @@ -69,7 +82,7 @@ static PyObject * mkpwent(struct passwd *p) { int setIndex = 0; - PyObject *v = PyStructSequence_New(&StructPwdType); + PyObject *v = PyStructSequence_New(modulestate_global->StructPwdType); if (v == NULL) return NULL; @@ -310,16 +323,28 @@ static PyMethodDef pwd_methods[] = { {NULL, NULL} /* sentinel */ }; +static int pwdmodule_traverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(get_pwd_state(m)->StructPwdType); + return 0; +} +static int pwdmodule_clear(PyObject *m) { + Py_CLEAR(get_pwd_state(m)->StructPwdType); + return 0; +} +static void pwdmodule_free(void *m) { + pwdmodule_clear((PyObject *)m); +} + static struct PyModuleDef pwdmodule = { PyModuleDef_HEAD_INIT, "pwd", pwd__doc__, - -1, + sizeof(pwdmodulestate), pwd_methods, NULL, - NULL, - NULL, - NULL + pwdmodule_traverse, + pwdmodule_clear, + pwdmodule_free, }; @@ -327,17 +352,19 @@ PyMODINIT_FUNC PyInit_pwd(void) { PyObject *m; - m = PyModule_Create(&pwdmodule); - if (m == NULL) + if ((m = PyState_FindModule(&pwdmodule)) != NULL) { + Py_INCREF(m); + return m; + } + if ((m = PyModule_Create(&pwdmodule)) == NULL) return NULL; - if (!initialized) { - if (PyStructSequence_InitType2(&StructPwdType, - &struct_pwd_type_desc) < 0) - return NULL; - initialized = 1; + pwdmodulestate *state = PyModule_GetState(m); + state->StructPwdType = PyStructSequence_NewType(&struct_pwd_type_desc); + if (state->StructPwdType == NULL) { + return NULL; } - Py_INCREF((PyObject *) &StructPwdType); - PyModule_AddObject(m, "struct_passwd", (PyObject *) &StructPwdType); + Py_INCREF(state->StructPwdType); + PyModule_AddObject(m, "struct_passwd", (PyObject *) state->StructPwdType); return m; } diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index df1a69b6..12ae66d9 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1,7 +1,7 @@ #include "Python.h" #include -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "frameobject.h" #include "expat.h" @@ -119,7 +119,7 @@ set_error(xmlparseobject *self, enum XML_Error code) XML_ErrorString(code), lineno, column); if (buffer == NULL) return NULL; - err = PyObject_CallFunctionObjArgs(ErrorObject, buffer, NULL); + err = PyObject_CallOneArg(ErrorObject, buffer); Py_DECREF(buffer); if ( err != NULL && set_error_attr(err, "code", code) @@ -208,7 +208,7 @@ call_with_frame(const char *funcname, int lineno, PyObject* func, PyObject* args { PyObject *res; - res = PyEval_CallObject(func, args); + res = PyObject_Call(func, args, NULL); if (res == NULL) { _PyTraceback_Add(funcname, __FILE__, lineno); XML_StopParser(self->itself, XML_FALSE); @@ -938,7 +938,6 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, new_parser->handlers = 0; new_parser->intern = self->intern; Py_XINCREF(new_parser->intern); - PyObject_GC_Track(new_parser); if (self->buffer != NULL) { new_parser->buffer = PyMem_Malloc(new_parser->buffer_size); @@ -975,6 +974,8 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, handler_info[i].handler); } } + + PyObject_GC_Track(new_parser); return (PyObject *)new_parser; } @@ -1059,7 +1060,7 @@ PyUnknownEncodingHandler(void *encodingHandlerData, static unsigned char template_buffer[256] = {0}; PyObject* u; int i; - void *data; + const void *data; unsigned int kind; if (PyErr_Occurred()) @@ -1122,7 +1123,6 @@ newxmlparseobject(const char *encoding, const char *namespace_separator, PyObjec self->handlers = NULL; self->intern = intern; Py_XINCREF(self->intern); - PyObject_GC_Track(self); /* namespace_separator is either NULL or contains one char + \0 */ self->itself = XML_ParserCreate_MM(encoding, &ExpatMemoryHandler, @@ -1152,6 +1152,7 @@ newxmlparseobject(const char *encoding, const char *namespace_separator, PyObjec } clear_handlers(self, 1); + PyObject_GC_Track(self); return (PyObject*)self; } diff --git a/Modules/readline.c b/Modules/readline.c index 081657fb..12d6cc78 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -86,13 +86,18 @@ typedef struct { PyObject *endidx; } readlinestate; - -#define readline_state(o) ((readlinestate *)PyModule_GetState(o)) +static inline readlinestate* +get_readline_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (readlinestate *)state; +} static int readline_clear(PyObject *m) { - readlinestate *state = readline_state(m); + readlinestate *state = get_readline_state(m); Py_CLEAR(state->completion_display_matches_hook); Py_CLEAR(state->startup_hook); Py_CLEAR(state->pre_input_hook); @@ -105,7 +110,7 @@ readline_clear(PyObject *m) static int readline_traverse(PyObject *m, visitproc visit, void *arg) { - readlinestate *state = readline_state(m); + readlinestate *state = get_readline_state(m); Py_VISIT(state->completion_display_matches_hook); Py_VISIT(state->startup_hook); Py_VISIT(state->pre_input_hook); @@ -229,7 +234,7 @@ static PyObject * write_history_file(PyObject *self, PyObject *args) { PyObject *filename_obj = Py_None, *filename_bytes; - char *filename; + const char *filename; int err; if (!PyArg_ParseTuple(args, "|O:write_history_file", &filename_obj)) return NULL; @@ -265,7 +270,7 @@ append_history_file(PyObject *self, PyObject *args) { int nelements; PyObject *filename_obj = Py_None, *filename_bytes; - char *filename; + const char *filename; int err; if (!PyArg_ParseTuple(args, "i|O:append_history_file", &nelements, &filename_obj)) return NULL; @@ -864,7 +869,7 @@ on_hook(PyObject *func) int result = 0; if (func != NULL) { PyObject *r; - r = _PyObject_CallNoArg(func); + r = PyObject_CallNoArgs(func); if (r == NULL) goto error; if (r == Py_None) @@ -1063,15 +1068,16 @@ done: } -/* Helper to initialize GNU readline properly. */ - -static void +/* Helper to initialize GNU readline properly. + Return -1 on memory allocation failure, return 0 on success. */ +static int setup_readline(readlinestate *mod_state) { #ifdef SAVE_LOCALE char *saved_locale = strdup(setlocale(LC_CTYPE, NULL)); - if (!saved_locale) - Py_FatalError("not enough memory to save locale"); + if (!saved_locale) { + return -1; + } #endif /* The name must be defined before initialization */ @@ -1147,6 +1153,7 @@ setup_readline(readlinestate *mod_state) rl_initialize(); RESTORE_LOCALE(saved_locale) + return 0; } /* Wrapper around GNU readline that handles signals differently. */ @@ -1354,7 +1361,10 @@ PyInit_readline(void) mod_state = (readlinestate *) PyModule_GetState(m); PyOS_ReadlineFunctionPointer = call_readline; - setup_readline(mod_state); + if (setup_readline(mod_state) < 0) { + PyErr_NoMemory(); + goto error; + } return m; diff --git a/Modules/resource.c b/Modules/resource.c index afde03c6..ddbf80be 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -340,155 +340,174 @@ resource_methods[] = { /* Module initialization */ -static struct PyModuleDef resourcemodule = { - PyModuleDef_HEAD_INIT, - "resource", - NULL, - -1, - resource_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit_resource(void) +static int +resource_exec(PyObject *module) { - PyObject *m, *v; - - /* Create the module and add the functions */ - m = PyModule_Create(&resourcemodule); - if (m == NULL) - return NULL; +#define ADD_INT(module, value) \ + do { \ + if (PyModule_AddIntConstant(module, #value, value) < 0) { \ + return -1; \ + } \ + } while (0) /* Add some symbolic constants to the module */ Py_INCREF(PyExc_OSError); - PyModule_AddObject(m, "error", PyExc_OSError); + if (PyModule_AddObject(module, "error", PyExc_OSError) < 0) { + Py_DECREF(PyExc_OSError); + return -1; + } if (!initialized) { if (PyStructSequence_InitType2(&StructRUsageType, &struct_rusage_desc) < 0) - return NULL; + return -1; } - Py_INCREF(&StructRUsageType); - PyModule_AddObject(m, "struct_rusage", - (PyObject*) &StructRUsageType); + if(PyModule_AddType(module, &StructRUsageType) < 0) { + return -1; + } /* insert constants */ #ifdef RLIMIT_CPU - PyModule_AddIntMacro(m, RLIMIT_CPU); + ADD_INT(module, RLIMIT_CPU); #endif #ifdef RLIMIT_FSIZE - PyModule_AddIntMacro(m, RLIMIT_FSIZE); + ADD_INT(module, RLIMIT_FSIZE); #endif #ifdef RLIMIT_DATA - PyModule_AddIntMacro(m, RLIMIT_DATA); + ADD_INT(module, RLIMIT_DATA); #endif #ifdef RLIMIT_STACK - PyModule_AddIntMacro(m, RLIMIT_STACK); + ADD_INT(module, RLIMIT_STACK); #endif #ifdef RLIMIT_CORE - PyModule_AddIntMacro(m, RLIMIT_CORE); + ADD_INT(module, RLIMIT_CORE); #endif #ifdef RLIMIT_NOFILE - PyModule_AddIntMacro(m, RLIMIT_NOFILE); + ADD_INT(module, RLIMIT_NOFILE); #endif #ifdef RLIMIT_OFILE - PyModule_AddIntMacro(m, RLIMIT_OFILE); + ADD_INT(module, RLIMIT_OFILE); #endif #ifdef RLIMIT_VMEM - PyModule_AddIntMacro(m, RLIMIT_VMEM); + ADD_INT(module, RLIMIT_VMEM); #endif #ifdef RLIMIT_AS - PyModule_AddIntMacro(m, RLIMIT_AS); + ADD_INT(module, RLIMIT_AS); #endif #ifdef RLIMIT_RSS - PyModule_AddIntMacro(m, RLIMIT_RSS); + ADD_INT(module, RLIMIT_RSS); #endif #ifdef RLIMIT_NPROC - PyModule_AddIntMacro(m, RLIMIT_NPROC); + ADD_INT(module, RLIMIT_NPROC); #endif #ifdef RLIMIT_MEMLOCK - PyModule_AddIntMacro(m, RLIMIT_MEMLOCK); + ADD_INT(module, RLIMIT_MEMLOCK); #endif #ifdef RLIMIT_SBSIZE - PyModule_AddIntMacro(m, RLIMIT_SBSIZE); + ADD_INT(module, RLIMIT_SBSIZE); #endif /* Linux specific */ #ifdef RLIMIT_MSGQUEUE - PyModule_AddIntMacro(m, RLIMIT_MSGQUEUE); + ADD_INT(module, RLIMIT_MSGQUEUE); #endif #ifdef RLIMIT_NICE - PyModule_AddIntMacro(m, RLIMIT_NICE); + ADD_INT(module, RLIMIT_NICE); #endif #ifdef RLIMIT_RTPRIO - PyModule_AddIntMacro(m, RLIMIT_RTPRIO); + ADD_INT(module, RLIMIT_RTPRIO); #endif #ifdef RLIMIT_RTTIME - PyModule_AddIntMacro(m, RLIMIT_RTTIME); + ADD_INT(module, RLIMIT_RTTIME); #endif #ifdef RLIMIT_SIGPENDING - PyModule_AddIntMacro(m, RLIMIT_SIGPENDING); + ADD_INT(module, RLIMIT_SIGPENDING); #endif /* target */ #ifdef RUSAGE_SELF - PyModule_AddIntMacro(m, RUSAGE_SELF); + ADD_INT(module, RUSAGE_SELF); #endif #ifdef RUSAGE_CHILDREN - PyModule_AddIntMacro(m, RUSAGE_CHILDREN); + ADD_INT(module, RUSAGE_CHILDREN); #endif #ifdef RUSAGE_BOTH - PyModule_AddIntMacro(m, RUSAGE_BOTH); + ADD_INT(module, RUSAGE_BOTH); #endif #ifdef RUSAGE_THREAD - PyModule_AddIntMacro(m, RUSAGE_THREAD); + ADD_INT(module, RUSAGE_THREAD); #endif /* FreeBSD specific */ #ifdef RLIMIT_SWAP - PyModule_AddIntMacro(m, RLIMIT_SWAP); + ADD_INT(module, RLIMIT_SWAP); #endif #ifdef RLIMIT_SBSIZE - PyModule_AddIntMacro(m, RLIMIT_SBSIZE); + ADD_INT(module, RLIMIT_SBSIZE); #endif #ifdef RLIMIT_NPTS - PyModule_AddIntMacro(m, RLIMIT_NPTS); + ADD_INT(module, RLIMIT_NPTS); #endif + PyObject *v; if (sizeof(RLIM_INFINITY) > sizeof(long)) { v = PyLong_FromLongLong((long long) RLIM_INFINITY); } else { v = PyLong_FromLong((long) RLIM_INFINITY); } - if (v) { - PyModule_AddObject(m, "RLIM_INFINITY", v); + if (!v) { + return -1; + } + + if (PyModule_AddObject(module, "RLIM_INFINITY", v) < 0) { + Py_DECREF(v); + return -1; } + initialized = 1; - return m; + return 0; + +#undef ADD_INT +} + +static struct PyModuleDef_Slot resource_slots[] = { + {Py_mod_exec, resource_exec}, + {0, NULL} +}; + +static struct PyModuleDef resourcemodule = { + PyModuleDef_HEAD_INIT, + .m_name = "resource", + .m_size = 0, + .m_methods = resource_methods, + .m_slots = resource_slots, +}; + +PyMODINIT_FUNC +PyInit_resource(void) +{ + return PyModuleDef_Init(&resourcemodule); } diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index a71b6422..fb71e919 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -9,7 +9,7 @@ #endif #include "Python.h" -#include +#include "structmember.h" // PyMemberDef #ifdef HAVE_SYS_DEVPOLL_H #include @@ -58,14 +58,35 @@ extern void bzero(void *, int); # define SOCKET int #endif +typedef struct { + PyObject *close; + PyTypeObject *poll_Type; + PyTypeObject *devpoll_Type; + PyTypeObject *pyEpoll_Type; + PyTypeObject *kqueue_event_Type; + PyTypeObject *kqueue_queue_Type; +} _selectstate; + +static struct PyModuleDef selectmodule; + +static inline _selectstate* +get_select_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_selectstate *)state; +} + +#define _selectstate_global get_select_state(PyState_FindModule(&selectmodule)) + /*[clinic input] module select class select.poll "pollObject *" "&poll_Type" class select.devpoll "devpollObject *" "&devpoll_Type" class select.epoll "pyEpoll_Object *" "&pyEpoll_Type" -class select.kqueue "kqueue_queue_Object *" "&kqueue_queue_Type" +class select.kqueue "kqueue_queue_Object *" "_selectstate_global->kqueue_queue_Type" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ded80abdad2b7552]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=41071028e0ede093]*/ static int fildes_converter(PyObject *o, void *p) @@ -400,8 +421,6 @@ typedef struct { int poll_running; } pollObject; -static PyTypeObject poll_Type; - /* Update the malloc'ed array of pollfds to match the dictionary contained within a pollObject. Return 1 on success, 0 on an error. */ @@ -709,7 +728,7 @@ static pollObject * newPollObject(void) { pollObject *self; - self = PyObject_New(pollObject, &poll_Type); + self = PyObject_New(pollObject, _selectstate_global->poll_Type); if (self == NULL) return NULL; /* ufd_uptodate is a Boolean, denoting whether the @@ -725,17 +744,28 @@ newPollObject(void) return self; } +static PyObject * +poll_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyErr_Format(PyExc_TypeError, "Cannot create '%.200s' instances", _PyType_Name(type)); + return NULL; +} + static void poll_dealloc(pollObject *self) { + PyObject* type = (PyObject *)Py_TYPE(self); if (self->ufds != NULL) PyMem_DEL(self->ufds); Py_XDECREF(self->dict); PyObject_Del(self); + Py_DECREF(type); } #ifdef HAVE_SYS_DEVPOLL_H +static PyMethodDef devpoll_methods[]; + typedef struct { PyObject_HEAD int fd_devpoll; @@ -744,8 +774,6 @@ typedef struct { struct pollfd *fds; } devpollObject; -static PyTypeObject devpoll_Type; - static PyObject * devpoll_err_closed(void) { @@ -1091,7 +1119,7 @@ newDevPollObject(void) return NULL; } - self = PyObject_New(devpollObject, &devpoll_Type); + self = PyObject_New(devpollObject, _selectstate_global->devpoll_Type); if (self == NULL) { close(fd_devpoll); PyMem_DEL(fds); @@ -1105,14 +1133,39 @@ newDevPollObject(void) return self; } +static PyObject * +devpoll_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyErr_Format(PyExc_TypeError, "Cannot create '%.200s' instances", _PyType_Name(type)); + return NULL; +} + static void devpoll_dealloc(devpollObject *self) { + PyObject *type = (PyObject *)Py_TYPE(self); (void)devpoll_internal_close(self); PyMem_DEL(self->fds); PyObject_Del(self); + Py_DECREF(type); } +static PyType_Slot devpoll_Type_slots[] = { + {Py_tp_dealloc, devpoll_dealloc}, + {Py_tp_getset, devpoll_getsetlist}, + {Py_tp_methods, devpoll_methods}, + {Py_tp_new, devpoll_new}, + {0, 0}, +}; + +static PyType_Spec devpoll_Type_spec = { + "select.devpoll", + sizeof(devpollObject), + 0, + Py_TPFLAGS_DEFAULT, + devpoll_Type_slots +}; + #endif /* HAVE_SYS_DEVPOLL_H */ @@ -1201,8 +1254,7 @@ typedef struct { SOCKET epfd; /* epoll control file descriptor */ } pyEpoll_Object; -static PyTypeObject pyEpoll_Type; -#define pyepoll_CHECK(op) (PyObject_TypeCheck((op), &pyEpoll_Type)) +#define pyepoll_CHECK(op) (PyObject_TypeCheck((op), _selectstate_global->pyEpoll_Type)) static PyObject * pyepoll_err_closed(void) @@ -1230,9 +1282,10 @@ static PyObject * newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd) { pyEpoll_Object *self; - - assert(type != NULL && type->tp_alloc != NULL); - self = (pyEpoll_Object *) type->tp_alloc(type, 0); + assert(type != NULL); + allocfunc epoll_alloc = PyType_GetSlot(type, Py_tp_alloc); + assert(epoll_alloc != NULL); + self = (pyEpoll_Object *) epoll_alloc(type, 0); if (self == NULL) return NULL; @@ -1307,8 +1360,11 @@ select_epoll_impl(PyTypeObject *type, int sizehint, int flags) static void pyepoll_dealloc(pyEpoll_Object *self) { + PyTypeObject* type = Py_TYPE(self); (void)pyepoll_internal_close(self); - Py_TYPE(self)->tp_free(self); + freefunc epoll_free = PyType_GetSlot(type, Py_tp_free); + epoll_free((PyObject *)self); + Py_DECREF((PyObject *)type); } /*[clinic input] @@ -1400,11 +1456,6 @@ pyepoll_internal_ctl(int epfd, int op, int fd, unsigned int events) * though this argument is ignored. */ Py_BEGIN_ALLOW_THREADS result = epoll_ctl(epfd, op, fd, &ev); - if (errno == EBADF) { - /* fd already closed */ - result = 0; - errno = 0; - } Py_END_ALLOW_THREADS break; default: @@ -1632,9 +1683,7 @@ select_epoll___exit___impl(pyEpoll_Object *self, PyObject *exc_type, PyObject *exc_value, PyObject *exc_tb) /*[clinic end generated code: output=c480f38ce361748e input=7ae81a5a4c1a98d8]*/ { - _Py_IDENTIFIER(close); - - return _PyObject_CallMethodId((PyObject *)self, &PyId_close, NULL); + return PyObject_CallMethodObjArgs((PyObject *)self, _selectstate_global->close, NULL); } static PyGetSetDef pyepoll_getsetlist[] = { @@ -1643,6 +1692,15 @@ static PyGetSetDef pyepoll_getsetlist[] = { {0}, }; +PyDoc_STRVAR(pyepoll_doc, +"select.epoll(sizehint=-1, flags=0)\n\ +\n\ +Returns an epolling object\n\ +\n\ +sizehint must be a positive integer or -1 for the default size. The\n\ +sizehint is used to optimize internal data structures. It doesn't limit\n\ +the maximum number of monitored events."); + #endif /* HAVE_EPOLL */ #ifdef HAVE_KQUEUE @@ -1699,18 +1757,14 @@ typedef struct { struct kevent e; } kqueue_event_Object; -static PyTypeObject kqueue_event_Type; - -#define kqueue_event_Check(op) (PyObject_TypeCheck((op), &kqueue_event_Type)) +#define kqueue_event_Check(op) (PyObject_TypeCheck((op), _selectstate_global->kqueue_event_Type)) typedef struct { PyObject_HEAD SOCKET kqfd; /* kqueue control fd */ } kqueue_queue_Object; -static PyTypeObject kqueue_queue_Type; - -#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type)) +#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), _selectstate_global->kqueue_queue_Type)) #if (SIZEOF_UINTPTR_T != SIZEOF_VOID_P) # error uintptr_t does not match void *! @@ -1870,6 +1924,24 @@ kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o, Py_RETURN_RICHCOMPARE(result, 0, op); } +static PyType_Slot kqueue_event_Type_slots[] = { + {Py_tp_doc, (void*)kqueue_event_doc}, + {Py_tp_init, kqueue_event_init}, + {Py_tp_members, kqueue_event_members}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_repr, kqueue_event_repr}, + {Py_tp_richcompare, kqueue_event_richcompare}, + {0, 0}, +}; + +static PyType_Spec kqueue_event_Type_spec = { + "select.kevent", + sizeof(kqueue_event_Object), + 0, + Py_TPFLAGS_DEFAULT, + kqueue_event_Type_slots +}; + static PyObject * kqueue_queue_err_closed(void) { @@ -1896,8 +1968,10 @@ static PyObject * newKqueue_Object(PyTypeObject *type, SOCKET fd) { kqueue_queue_Object *self; - assert(type != NULL && type->tp_alloc != NULL); - self = (kqueue_queue_Object *) type->tp_alloc(type, 0); + assert(type != NULL); + allocfunc queue_alloc = PyType_GetSlot(type, Py_tp_alloc); + assert(queue_alloc != NULL); + self = (kqueue_queue_Object *) queue_alloc(type, 0); if (self == NULL) { return NULL; } @@ -1954,8 +2028,11 @@ select_kqueue_impl(PyTypeObject *type) static void kqueue_queue_dealloc(kqueue_queue_Object *self) { + PyTypeObject* type = Py_TYPE(self); kqueue_queue_internal_close(self); - Py_TYPE(self)->tp_free(self); + freefunc kqueue_free = PyType_GetSlot(type, Py_tp_free); + kqueue_free((PyObject *)self); + Py_DECREF((PyObject *)type); } /*[clinic input] @@ -2072,7 +2149,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist, PyErr_Format(PyExc_TypeError, "timeout argument must be a number " "or None, got %.200s", - Py_TYPE(otimeout)->tp_name); + _PyType_Name(Py_TYPE(otimeout))); return NULL; } @@ -2168,7 +2245,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist, for (i = 0; i < gotevents; i++) { kqueue_event_Object *ch; - ch = PyObject_New(kqueue_event_Object, &kqueue_event_Type); + ch = PyObject_New(kqueue_event_Object, _selectstate_global->kqueue_event_Type); if (ch == NULL) { goto error; } @@ -2210,38 +2287,20 @@ static PyMethodDef poll_methods[] = { {NULL, NULL} /* sentinel */ }; -static PyTypeObject poll_Type = { - /* The ob_type field must be initialized in the module init function - * to be portable to Windows without using C++. */ - PyVarObject_HEAD_INIT(NULL, 0) - "select.poll", /*tp_name*/ - sizeof(pollObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)poll_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - poll_methods, /*tp_methods*/ + +static PyType_Slot poll_Type_slots[] = { + {Py_tp_dealloc, poll_dealloc}, + {Py_tp_methods, poll_methods}, + {Py_tp_new, poll_new}, + {0, 0}, +}; + +static PyType_Spec poll_Type_spec = { + "select.poll", + sizeof(pollObject), + 0, + Py_TPFLAGS_DEFAULT, + poll_Type_slots }; #ifdef HAVE_SYS_DEVPOLL_H @@ -2256,42 +2315,6 @@ static PyMethodDef devpoll_methods[] = { {NULL, NULL} /* sentinel */ }; -static PyTypeObject devpoll_Type = { - /* The ob_type field must be initialized in the module init function - * to be portable to Windows without using C++. */ - PyVarObject_HEAD_INIT(NULL, 0) - "select.devpoll", /*tp_name*/ - sizeof(devpollObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)devpoll_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - devpoll_methods, /*tp_methods*/ - 0, /* tp_members */ - devpoll_getsetlist, /* tp_getset */ -}; - #endif /* HAVE_SYS_DEVPOLL_H */ #endif /* HAVE_POLL */ @@ -2311,94 +2334,28 @@ static PyMethodDef pyepoll_methods[] = { {NULL, NULL}, }; -static PyTypeObject pyEpoll_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "select.epoll", /* tp_name */ - sizeof(pyEpoll_Object), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pyepoll_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - select_epoll__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - pyepoll_methods, /* tp_methods */ - 0, /* tp_members */ - pyepoll_getsetlist, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - select_epoll, /* tp_new */ - 0, /* tp_free */ +static PyType_Slot pyEpoll_Type_slots[] = { + {Py_tp_dealloc, pyepoll_dealloc}, + {Py_tp_doc, (void*)pyepoll_doc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_getset, pyepoll_getsetlist}, + {Py_tp_methods, pyepoll_methods}, + {Py_tp_new, select_epoll}, + {0, 0}, +}; + +static PyType_Spec pyEpoll_Type_spec = { + "select.epoll", + sizeof(pyEpoll_Object), + 0, + Py_TPFLAGS_DEFAULT, + pyEpoll_Type_slots }; #endif /* HAVE_EPOLL */ #ifdef HAVE_KQUEUE -static PyTypeObject kqueue_event_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "select.kevent", /* tp_name */ - sizeof(kqueue_event_Object), /* tp_basicsize */ - 0, /* tp_itemsize */ - 0, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)kqueue_event_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - kqueue_event_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - (richcmpfunc)kqueue_event_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - kqueue_event_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)kqueue_event_init, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ -}; - static PyMethodDef kqueue_queue_methods[] = { SELECT_KQUEUE_FROMFD_METHODDEF SELECT_KQUEUE_CLOSE_METHODDEF @@ -2407,46 +2364,21 @@ static PyMethodDef kqueue_queue_methods[] = { {NULL, NULL}, }; -static PyTypeObject kqueue_queue_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "select.kqueue", /* tp_name */ - sizeof(kqueue_queue_Object), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)kqueue_queue_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - select_kqueue__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - kqueue_queue_methods, /* tp_methods */ - 0, /* tp_members */ - kqueue_queue_getsetlist, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - select_kqueue, /* tp_new */ - 0, /* tp_free */ +static PyType_Slot kqueue_queue_Type_slots[] = { + {Py_tp_dealloc, kqueue_queue_dealloc}, + {Py_tp_doc, (void*)select_kqueue__doc__}, + {Py_tp_getset, kqueue_queue_getsetlist}, + {Py_tp_methods, kqueue_queue_methods}, + {Py_tp_new, select_kqueue}, + {0, 0}, +}; + +static PyType_Spec kqueue_queue_Type_spec = { + "select.kqueue", + sizeof(kqueue_queue_Object), + 0, + Py_TPFLAGS_DEFAULT, + kqueue_queue_Type_slots }; #endif /* HAVE_KQUEUE */ @@ -2472,21 +2404,49 @@ PyDoc_STRVAR(module_doc, On Windows, only sockets are supported; on Unix, all file descriptors."); + +static int +_select_traverse(PyObject *module, visitproc visit, void *arg) +{ + Py_VISIT(get_select_state(module)->close); + Py_VISIT(get_select_state(module)->poll_Type); + Py_VISIT(get_select_state(module)->devpoll_Type); + Py_VISIT(get_select_state(module)->pyEpoll_Type); + Py_VISIT(get_select_state(module)->kqueue_event_Type); + Py_VISIT(get_select_state(module)->kqueue_queue_Type); + return 0; +} + +static int +_select_clear(PyObject *module) +{ + Py_CLEAR(get_select_state(module)->close); + Py_CLEAR(get_select_state(module)->poll_Type); + Py_CLEAR(get_select_state(module)->devpoll_Type); + Py_CLEAR(get_select_state(module)->pyEpoll_Type); + Py_CLEAR(get_select_state(module)->kqueue_event_Type); + Py_CLEAR(get_select_state(module)->kqueue_queue_Type); + return 0; +} + +static void +_select_free(void *module) +{ + _select_clear((PyObject *)module); +} + static struct PyModuleDef selectmodule = { PyModuleDef_HEAD_INIT, "select", module_doc, - -1, + sizeof(_selectstate), select_methods, NULL, - NULL, - NULL, - NULL + _select_traverse, + _select_clear, + _select_free, }; - - - PyMODINIT_FUNC PyInit_select(void) { @@ -2495,6 +2455,8 @@ PyInit_select(void) if (m == NULL) return NULL; + get_select_state(m)->close = PyUnicode_InternFromString("close"); + Py_INCREF(PyExc_OSError); PyModule_AddObject(m, "error", PyExc_OSError); @@ -2516,8 +2478,12 @@ PyInit_select(void) #else { #endif - if (PyType_Ready(&poll_Type) < 0) + PyObject *poll_Type = PyType_FromSpec(&poll_Type_spec); + if (poll_Type == NULL) return NULL; + get_select_state(m)->poll_Type = (PyTypeObject *)poll_Type; + Py_INCREF(poll_Type); + PyModule_AddIntMacro(m, POLLIN); PyModule_AddIntMacro(m, POLLPRI); PyModule_AddIntMacro(m, POLLOUT); @@ -2548,17 +2514,20 @@ PyInit_select(void) #endif /* HAVE_POLL */ #ifdef HAVE_SYS_DEVPOLL_H - if (PyType_Ready(&devpoll_Type) < 0) + PyObject *devpoll_Type = PyType_FromSpec(&devpoll_Type_spec); + if (devpoll_Type == NULL) return NULL; + get_select_state(m)->devpoll_Type = (PyTypeObject *)devpoll_Type; + Py_INCREF(devpoll_Type); #endif #ifdef HAVE_EPOLL - Py_TYPE(&pyEpoll_Type) = &PyType_Type; - if (PyType_Ready(&pyEpoll_Type) < 0) + PyObject *pyEpoll_Type = PyType_FromSpec(&pyEpoll_Type_spec); + if (pyEpoll_Type == NULL) return NULL; - - Py_INCREF(&pyEpoll_Type); - PyModule_AddObject(m, "epoll", (PyObject *) &pyEpoll_Type); + get_select_state(m)->pyEpoll_Type = (PyTypeObject *)pyEpoll_Type; + Py_INCREF(pyEpoll_Type); + PyModule_AddObject(m, "epoll", (PyObject *)get_select_state(m)->pyEpoll_Type); PyModule_AddIntMacro(m, EPOLLIN); PyModule_AddIntMacro(m, EPOLLOUT); @@ -2600,19 +2569,19 @@ PyInit_select(void) #endif /* HAVE_EPOLL */ #ifdef HAVE_KQUEUE - kqueue_event_Type.tp_new = PyType_GenericNew; - Py_TYPE(&kqueue_event_Type) = &PyType_Type; - if(PyType_Ready(&kqueue_event_Type) < 0) + PyObject *kqueue_event_Type = PyType_FromSpec(&kqueue_event_Type_spec); + if (kqueue_event_Type == NULL) return NULL; + get_select_state(m)->kqueue_event_Type = (PyTypeObject *)kqueue_event_Type; + Py_INCREF(get_select_state(m)->kqueue_event_Type); + PyModule_AddObject(m, "kevent", kqueue_event_Type); - Py_INCREF(&kqueue_event_Type); - PyModule_AddObject(m, "kevent", (PyObject *)&kqueue_event_Type); - - Py_TYPE(&kqueue_queue_Type) = &PyType_Type; - if(PyType_Ready(&kqueue_queue_Type) < 0) + PyObject *kqueue_queue_Type = PyType_FromSpec(&kqueue_queue_Type_spec); + if (kqueue_queue_Type == NULL) return NULL; - Py_INCREF(&kqueue_queue_Type); - PyModule_AddObject(m, "kqueue", (PyObject *)&kqueue_queue_Type); + get_select_state(m)->kqueue_queue_Type = (PyTypeObject *)kqueue_queue_Type; + Py_INCREF(get_select_state(m)->kqueue_queue_Type); + PyModule_AddObject(m, "kqueue", kqueue_queue_Type); /* event filters */ PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ); diff --git a/Modules/sha1module.c b/Modules/sha1module.c index ce2ad267..b0656d83 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -480,13 +480,15 @@ static PyTypeObject SHA1type = { _sha1.sha1 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new SHA1 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_sha1_sha1_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=e5982830d1dece51 input=27ea54281d995ec2]*/ +_sha1_sha1_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=6f8b3af05126e18e input=bd54b68e2bf36a8a]*/ { SHA1object *new; Py_buffer buf; @@ -527,9 +529,6 @@ static struct PyMethodDef SHA1_functions[] = { /* Initialize this module. */ -#define insint(n,v) { PyModule_AddIntConstant(m,n,v); } - - static struct PyModuleDef _sha1module = { PyModuleDef_HEAD_INIT, "_sha1", @@ -547,13 +546,15 @@ PyInit__sha1(void) { PyObject *m; - Py_TYPE(&SHA1type) = &PyType_Type; - if (PyType_Ready(&SHA1type) < 0) + Py_SET_TYPE(&SHA1type, &PyType_Type); + if (PyType_Ready(&SHA1type) < 0) { return NULL; + } m = PyModule_Create(&_sha1module); - if (m == NULL) + if (m == NULL) { return NULL; + } Py_INCREF((PyObject *)&SHA1type); PyModule_AddObject(m, "SHA1Type", (PyObject *)&SHA1type); diff --git a/Modules/sha256module.c b/Modules/sha256module.c index b8d6c4cf..8edb1d53 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -17,7 +17,8 @@ /* SHA objects */ #include "Python.h" -#include "structmember.h" +#include "pycore_byteswap.h" // _Py_bswap32() +#include "structmember.h" // PyMemberDef #include "hashlib.h" #include "pystrhex.h" @@ -30,12 +31,7 @@ class SHA256Type "SHAobject *" "&PyType_Type" /* Some useful types */ typedef unsigned char SHA_BYTE; - -#if SIZEOF_INT == 4 -typedef unsigned int SHA_INT32; /* 32-bit integer */ -#else -/* not defined. compilation will die. */ -#endif +typedef uint32_t SHA_INT32; /* 32-bit integer */ /* The SHA block size and message digest sizes, in bytes */ @@ -61,14 +57,9 @@ typedef struct { #if PY_LITTLE_ENDIAN static void longReverse(SHA_INT32 *buffer, int byteCount) { - SHA_INT32 value; - byteCount /= sizeof(*buffer); - while (byteCount--) { - value = *buffer; - value = ( ( value & 0xFF00FF00L ) >> 8 ) | \ - ( ( value & 0x00FF00FFL ) << 8 ); - *buffer++ = ( value << 16 ) | ( value >> 16 ); + for (; byteCount--; buffer++) { + *buffer = _Py_bswap32(*buffer); } } #endif @@ -413,7 +404,7 @@ SHA256Type_copy_impl(SHAobject *self) { SHAobject *newobj; - if (Py_TYPE(self) == &SHA256type) { + if (Py_IS_TYPE(self, &SHA256type)) { if ( (newobj = newSHA256object())==NULL) return NULL; } else { @@ -601,13 +592,15 @@ static PyTypeObject SHA256type = { _sha256.sha256 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new SHA-256 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_sha256_sha256_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=fa644436dcea5c31 input=09cce3fb855056b2]*/ +_sha256_sha256_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=a1de327e8e1185cf input=9be86301aeb14ea5]*/ { SHAobject *new; Py_buffer buf; @@ -641,13 +634,15 @@ _sha256_sha256_impl(PyObject *module, PyObject *string) _sha256.sha224 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new SHA-224 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_sha256_sha224_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=21e3ba22c3404f93 input=27a04ba24c353a73]*/ +_sha256_sha224_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=08be6b36569bc69c input=9fcfb46e460860ac]*/ { SHAobject *new; Py_buffer buf; @@ -689,9 +684,6 @@ static struct PyMethodDef SHA_functions[] = { /* Initialize this module. */ -#define insint(n,v) { PyModule_AddIntConstant(m,n,v); } - - static struct PyModuleDef _sha256module = { PyModuleDef_HEAD_INIT, "_sha256", @@ -709,12 +701,14 @@ PyInit__sha256(void) { PyObject *m; - Py_TYPE(&SHA224type) = &PyType_Type; - if (PyType_Ready(&SHA224type) < 0) + Py_SET_TYPE(&SHA224type, &PyType_Type); + if (PyType_Ready(&SHA224type) < 0) { return NULL; - Py_TYPE(&SHA256type) = &PyType_Type; - if (PyType_Ready(&SHA256type) < 0) + } + Py_SET_TYPE(&SHA256type, &PyType_Type); + if (PyType_Ready(&SHA256type) < 0) { return NULL; + } m = PyModule_Create(&_sha256module); if (m == NULL) diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 98b97917..561ef8ef 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -17,7 +17,8 @@ /* SHA objects */ #include "Python.h" -#include "structmember.h" +#include "pycore_byteswap.h" // _Py_bswap32() +#include "structmember.h" // PyMemberDef #include "hashlib.h" #include "pystrhex.h" @@ -30,13 +31,8 @@ class SHA512Type "SHAobject *" "&PyType_Type" /* Some useful types */ typedef unsigned char SHA_BYTE; - -#if SIZEOF_INT == 4 -typedef unsigned int SHA_INT32; /* 32-bit integer */ -typedef unsigned long long SHA_INT64; /* 64-bit integer */ -#else -/* not defined. compilation will die. */ -#endif +typedef uint32_t SHA_INT32; /* 32-bit integer */ +typedef uint64_t SHA_INT64; /* 64-bit integer */ /* The SHA block size and message digest sizes, in bytes */ @@ -62,22 +58,9 @@ typedef struct { #if PY_LITTLE_ENDIAN static void longReverse(SHA_INT64 *buffer, int byteCount) { - SHA_INT64 value; - byteCount /= sizeof(*buffer); - while (byteCount--) { - value = *buffer; - - ((unsigned char*)buffer)[0] = (unsigned char)(value >> 56) & 0xff; - ((unsigned char*)buffer)[1] = (unsigned char)(value >> 48) & 0xff; - ((unsigned char*)buffer)[2] = (unsigned char)(value >> 40) & 0xff; - ((unsigned char*)buffer)[3] = (unsigned char)(value >> 32) & 0xff; - ((unsigned char*)buffer)[4] = (unsigned char)(value >> 24) & 0xff; - ((unsigned char*)buffer)[5] = (unsigned char)(value >> 16) & 0xff; - ((unsigned char*)buffer)[6] = (unsigned char)(value >> 8) & 0xff; - ((unsigned char*)buffer)[7] = (unsigned char)(value ) & 0xff; - - buffer++; + for (; byteCount--; buffer++) { + *buffer = _Py_bswap64(*buffer); } } #endif @@ -478,7 +461,7 @@ SHA512Type_copy_impl(SHAobject *self) { SHAobject *newobj; - if (((PyObject*)self)->ob_type == &SHA512type) { + if (Py_IS_TYPE((PyObject*)self, &SHA512type)) { if ( (newobj = newSHA512object())==NULL) return NULL; } else { @@ -666,13 +649,15 @@ static PyTypeObject SHA512type = { _sha512.sha512 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new SHA-512 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_sha512_sha512_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=8b865a2df73bd387 input=e69bad9ae9b6a308]*/ +_sha512_sha512_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=a8d9e5f9e6a0831c input=23b4daebc2ebb9c9]*/ { SHAobject *new; Py_buffer buf; @@ -706,13 +691,15 @@ _sha512_sha512_impl(PyObject *module, PyObject *string) _sha512.sha384 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new SHA-384 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_sha512_sha384_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=ae4b2e26decf81e8 input=c9327788d4ea4545]*/ +_sha512_sha384_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=da7d594a08027ac3 input=59ef72f039a6b431]*/ { SHAobject *new; Py_buffer buf; @@ -754,9 +741,6 @@ static struct PyMethodDef SHA_functions[] = { /* Initialize this module. */ -#define insint(n,v) { PyModule_AddIntConstant(m,n,v); } - - static struct PyModuleDef _sha512module = { PyModuleDef_HEAD_INIT, "_sha512", @@ -774,16 +758,19 @@ PyInit__sha512(void) { PyObject *m; - Py_TYPE(&SHA384type) = &PyType_Type; - if (PyType_Ready(&SHA384type) < 0) + Py_SET_TYPE(&SHA384type, &PyType_Type); + if (PyType_Ready(&SHA384type) < 0) { return NULL; - Py_TYPE(&SHA512type) = &PyType_Type; - if (PyType_Ready(&SHA512type) < 0) + } + Py_SET_TYPE(&SHA512type, &PyType_Type); + if (PyType_Ready(&SHA512type) < 0) { return NULL; + } m = PyModule_Create(&_sha512module); - if (m == NULL) + if (m == NULL) { return NULL; + } Py_INCREF((PyObject *)&SHA384type); PyModule_AddObject(m, "SHA384Type", (PyObject *)&SHA384type); diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 119fc355..9041848c 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -5,8 +5,10 @@ #include "Python.h" #include "pycore_atomic.h" +#include "pycore_call.h" #include "pycore_ceval.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #ifndef MS_WINDOWS #include "posixmodule.h" @@ -25,6 +27,9 @@ #ifdef HAVE_SIGNAL_H #include #endif +#ifdef HAVE_SYS_SYSCALL_H +#include +#endif #ifdef HAVE_SYS_STAT_H #include #endif @@ -99,8 +104,6 @@ class sigset_t_converter(CConverter): may not be the thread that received the signal. */ -#include "pythread.h" - static volatile struct { _Py_atomic_int tripped; PyObject *func; @@ -186,21 +189,6 @@ itimer_retval(struct itimerval *iv) } #endif -static int -is_main_interp(_PyRuntimeState *runtime, PyInterpreterState *interp) -{ - unsigned long thread = PyThread_get_thread_ident(); - return (thread == runtime->main_thread - && interp == runtime->interpreters.main); -} - -static int -is_main(_PyRuntimeState *runtime) -{ - PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; - return is_main_interp(runtime, interp); -} - static PyObject * signal_default_int_handler(PyObject *self, PyObject *args) { @@ -262,10 +250,11 @@ trip_signal(int sig_num) cleared in PyErr_CheckSignals() before .tripped. */ _Py_atomic_store(&is_tripped, 1); + /* Signals are always handled by the main interpreter */ + PyInterpreterState *interp = _PyRuntime.interpreters.main; + /* Notify ceval.c */ - _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - _PyEval_SignalReceived(&runtime->ceval); + _PyEval_SignalReceived(interp); /* And then write to the wakeup fd *after* setting all the globals and doing the _PyEval_SignalReceived. We used to write to the wakeup fd @@ -303,9 +292,9 @@ trip_signal(int sig_num) if (wakeup.warn_on_full_buffer || last_error != WSAEWOULDBLOCK) { - /* Py_AddPendingCall() isn't signal-safe, but we + /* _PyEval_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _PyEval_AddPendingCall(tstate, &runtime->ceval, + _PyEval_AddPendingCall(interp, report_wakeup_send_error, (void *)(intptr_t) last_error); } @@ -322,9 +311,9 @@ trip_signal(int sig_num) if (wakeup.warn_on_full_buffer || (errno != EWOULDBLOCK && errno != EAGAIN)) { - /* Py_AddPendingCall() isn't signal-safe, but we + /* _PyEval_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _PyEval_AddPendingCall(tstate, &runtime->ceval, + _PyEval_AddPendingCall(interp, report_wakeup_write_error, (void *)(intptr_t)errno); } @@ -481,43 +470,53 @@ signal_signal_impl(PyObject *module, int signalnum, PyObject *handler) } #endif - _PyRuntimeState *runtime = &_PyRuntime; - if (!is_main(runtime)) { - PyErr_SetString(PyExc_ValueError, - "signal only works in main thread"); + PyThreadState *tstate = _PyThreadState_GET(); + if (!_Py_ThreadCanHandleSignals(tstate->interp)) { + _PyErr_SetString(tstate, PyExc_ValueError, + "signal only works in main thread " + "of the main interpreter"); return NULL; } if (signalnum < 1 || signalnum >= NSIG) { - PyErr_SetString(PyExc_ValueError, - "signal number out of range"); + _PyErr_SetString(tstate, PyExc_ValueError, + "signal number out of range"); return NULL; } - if (handler == IgnoreHandler) + if (handler == IgnoreHandler) { func = SIG_IGN; - else if (handler == DefaultHandler) + } + else if (handler == DefaultHandler) { func = SIG_DFL; + } else if (!PyCallable_Check(handler)) { - PyErr_SetString(PyExc_TypeError, -"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object"); - return NULL; + _PyErr_SetString(tstate, PyExc_TypeError, + "signal handler must be signal.SIG_IGN, " + "signal.SIG_DFL, or a callable object"); + return NULL; } - else + else { func = signal_handler; + } + /* Check for pending signals before changing signal handler */ - if (_PyErr_CheckSignals()) { + if (_PyErr_CheckSignalsTstate(tstate)) { return NULL; } if (PyOS_setsig(signalnum, func) == SIG_ERR) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } + old_handler = Handlers[signalnum].func; Py_INCREF(handler); Handlers[signalnum].func = handler; - if (old_handler != NULL) + + if (old_handler != NULL) { return old_handler; - else + } + else { Py_RETURN_NONE; + } } @@ -699,10 +698,11 @@ signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds) return NULL; #endif - _PyRuntimeState *runtime = &_PyRuntime; - if (!is_main(runtime)) { - PyErr_SetString(PyExc_ValueError, - "set_wakeup_fd only works in main thread"); + PyThreadState *tstate = _PyThreadState_GET(); + if (!_Py_ThreadCanHandleSignals(tstate->interp)) { + _PyErr_SetString(tstate, PyExc_ValueError, + "set_wakeup_fd only works in main thread " + "of the main interpreter"); return NULL; } @@ -728,12 +728,13 @@ signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds) fd = (int)sockfd; if ((SOCKET_T)fd != sockfd) { - PyErr_SetString(PyExc_ValueError, "invalid fd"); + _PyErr_SetString(tstate, PyExc_ValueError, "invalid fd"); return NULL; } - if (_Py_fstat(fd, &status) != 0) + if (_Py_fstat(fd, &status) != 0) { return NULL; + } /* on Windows, a file cannot be set to non-blocking mode */ } @@ -765,9 +766,9 @@ signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds) if (blocking < 0) return NULL; if (blocking) { - PyErr_Format(PyExc_ValueError, - "the fd %i must be in non-blocking mode", - fd); + _PyErr_Format(tstate, PyExc_ValueError, + "the fd %i must be in non-blocking mode", + fd); return NULL; } } @@ -1260,6 +1261,38 @@ signal_pthread_kill_impl(PyObject *module, unsigned long thread_id, #endif /* #if defined(HAVE_PTHREAD_KILL) */ +#if defined(__linux__) && defined(__NR_pidfd_send_signal) +/*[clinic input] +signal.pidfd_send_signal + + pidfd: int + signalnum: int + siginfo: object = None + flags: int = 0 + / + +Send a signal to a process referred to by a pid file descriptor. +[clinic start generated code]*/ + +static PyObject * +signal_pidfd_send_signal_impl(PyObject *module, int pidfd, int signalnum, + PyObject *siginfo, int flags) +/*[clinic end generated code: output=2d59f04a75d9cbdf input=2a6543a1f4ac2000]*/ + +{ + if (siginfo != Py_None) { + PyErr_SetString(PyExc_TypeError, "siginfo must be None"); + return NULL; + } + if (syscall(__NR_pidfd_send_signal, pidfd, signalnum, NULL, flags) < 0) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + Py_RETURN_NONE; +} +#endif + + /* List of functions defined in the module -- some of the methoddefs are defined to nothing if the corresponding C function is not available. */ @@ -1275,6 +1308,7 @@ static PyMethodDef signal_methods[] = { {"set_wakeup_fd", (PyCFunction)(void(*)(void))signal_set_wakeup_fd, METH_VARARGS | METH_KEYWORDS, set_wakeup_fd_doc}, SIGNAL_SIGINTERRUPT_METHODDEF SIGNAL_PAUSE_METHODDEF + SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF SIGNAL_PTHREAD_KILL_METHODDEF SIGNAL_PTHREAD_SIGMASK_METHODDEF SIGNAL_SIGPENDING_METHODDEF @@ -1641,24 +1675,22 @@ finisignal(void) int PyErr_CheckSignals(void) { - _PyRuntimeState *runtime = &_PyRuntime; - if (!is_main(runtime)) { + PyThreadState *tstate = _PyThreadState_GET(); + if (!_Py_ThreadCanHandleSignals(tstate->interp)) { return 0; } - return _PyErr_CheckSignals(); + return _PyErr_CheckSignalsTstate(tstate); } /* Declared in cpython/pyerrors.h */ int -_PyErr_CheckSignals(void) +_PyErr_CheckSignalsTstate(PyThreadState *tstate) { - int i; - PyObject *f; - - if (!_Py_atomic_load(&is_tripped)) + if (!_Py_atomic_load(&is_tripped)) { return 0; + } /* * The is_tripped variable is meant to speed up the calls to @@ -1676,33 +1708,48 @@ _PyErr_CheckSignals(void) */ _Py_atomic_store(&is_tripped, 0); - if (!(f = (PyObject *)PyEval_GetFrame())) - f = Py_None; + PyObject *frame = (PyObject *)tstate->frame; + if (!frame) { + frame = Py_None; + } - for (i = 1; i < NSIG; i++) { - if (_Py_atomic_load_relaxed(&Handlers[i].tripped)) { - PyObject *result = NULL; - PyObject *arglist = Py_BuildValue("(iO)", i, f); - _Py_atomic_store_relaxed(&Handlers[i].tripped, 0); - - if (arglist) { - result = PyEval_CallObject(Handlers[i].func, - arglist); - Py_DECREF(arglist); - } - if (!result) { - _Py_atomic_store(&is_tripped, 1); - return -1; - } + for (int i = 1; i < NSIG; i++) { + if (!_Py_atomic_load_relaxed(&Handlers[i].tripped)) { + continue; + } + _Py_atomic_store_relaxed(&Handlers[i].tripped, 0); - Py_DECREF(result); + PyObject *arglist = Py_BuildValue("(iO)", i, frame); + PyObject *result; + if (arglist) { + result = _PyObject_Call(tstate, Handlers[i].func, arglist, NULL); + Py_DECREF(arglist); + } + else { + result = NULL; } + if (!result) { + /* On error, re-schedule a call to _PyErr_CheckSignalsTstate() */ + _Py_atomic_store(&is_tripped, 1); + return -1; + } + + Py_DECREF(result); } return 0; } + +int +_PyErr_CheckSignals(void) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyErr_CheckSignalsTstate(tstate); +} + + /* Simulate the effect of a signal.SIGINT signal arriving. The next time PyErr_CheckSignals is called, the Python SIGINT signal handler will be raised. @@ -1737,15 +1784,17 @@ PyOS_FiniInterrupts(void) int _PyOS_InterruptOccurred(PyThreadState *tstate) { - if (_Py_atomic_load_relaxed(&Handlers[SIGINT].tripped)) { - _PyRuntimeState *runtime = &_PyRuntime; - if (!is_main_interp(runtime, tstate->interp)) { - return 0; - } - _Py_atomic_store_relaxed(&Handlers[SIGINT].tripped, 0); - return 1; + _Py_EnsureTstateNotNULL(tstate); + if (!_Py_ThreadCanHandleSignals(tstate->interp)) { + return 0; } - return 0; + + if (!_Py_atomic_load_relaxed(&Handlers[SIGINT].tripped)) { + return 0; + } + + _Py_atomic_store_relaxed(&Handlers[SIGINT].tripped, 0); + return 1; } @@ -1782,8 +1831,8 @@ _PySignal_AfterFork(void) int _PyOS_IsMainThread(void) { - _PyRuntimeState *runtime = &_PyRuntime; - return is_main(runtime); + PyInterpreterState *interp = _PyInterpreterState_GET(); + return _Py_ThreadCanHandleSignals(interp); } #ifdef MS_WINDOWS diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 5dc5f4e0..76ef606e 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -101,7 +101,7 @@ Local naming conventions: #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #ifdef _Py_MEMORY_SANITIZER # include @@ -146,7 +146,7 @@ recvfrom_into(buffer[, nbytes, [, flags])\n\ sendall(data[, flags]) -- send all data\n\ send(data[, flags]) -- send data, may not send all of it\n\ sendto(data[, flags], addr) -- send data to a given address\n\ -setblocking(0 | 1) -- set or clear the blocking I/O flag\n\ +setblocking(bool) -- set or clear the blocking I/O flag\n\ getblocking() -- return True if socket is blocking, False if non-blocking\n\ setsockopt(level, optname, value[, optlen]) -- set socket options\n\ settimeout(None | float) -- set or clear the timeout\n\ @@ -234,13 +234,8 @@ http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82& #define RELEASE_GETADDRINFO_LOCK #endif -#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK) -# include "pythread.h" -#endif - - #if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__) -# include +# include #endif @@ -478,13 +473,12 @@ remove_unusable_flags(PyObject *m) #endif #ifdef MS_WIN32 -#undef EAFNOSUPPORT -#define EAFNOSUPPORT WSAEAFNOSUPPORT -#define snprintf _snprintf +# undef EAFNOSUPPORT +# define EAFNOSUPPORT WSAEAFNOSUPPORT #endif #ifndef SOCKETCLOSE -#define SOCKETCLOSE close +# define SOCKETCLOSE close #endif #if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__) @@ -520,6 +514,15 @@ remove_unusable_flags(PyObject *m) #endif #endif +#ifdef MS_WINDOWS +#define sockaddr_rc SOCKADDR_BTH_REDEF + +#define USE_BLUETOOTH 1 +#define AF_BLUETOOTH AF_BTH +#define BTPROTO_RFCOMM BTHPROTO_RFCOMM +#define _BT_RC_MEMB(sa, memb) ((sa)->memb) +#endif + /* Convert "sock_addr_t *" to "struct sockaddr *". */ #define SAS2SA(x) (&((x)->sa)) @@ -649,7 +652,7 @@ set_herror(int h_error) PyObject *v; #ifdef HAVE_HSTRERROR - v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error)); + v = Py_BuildValue("(is)", h_error, hstrerror(h_error)); #else v = Py_BuildValue("(is)", h_error, "host not found"); #endif @@ -1267,12 +1270,23 @@ setbdaddr(const char *name, bdaddr_t *bdaddr) n = sscanf(name, "%X:%X:%X:%X:%X:%X%c", &b5, &b4, &b3, &b2, &b1, &b0, &ch); if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) { + +#ifdef MS_WINDOWS + *bdaddr = (ULONGLONG)(b0 & 0xFF); + *bdaddr |= ((ULONGLONG)(b1 & 0xFF) << 8); + *bdaddr |= ((ULONGLONG)(b2 & 0xFF) << 16); + *bdaddr |= ((ULONGLONG)(b3 & 0xFF) << 24); + *bdaddr |= ((ULONGLONG)(b4 & 0xFF) << 32); + *bdaddr |= ((ULONGLONG)(b5 & 0xFF) << 40); +#else bdaddr->b[0] = b0; bdaddr->b[1] = b1; bdaddr->b[2] = b2; bdaddr->b[3] = b3; bdaddr->b[4] = b4; bdaddr->b[5] = b5; +#endif + return 6; } else { PyErr_SetString(PyExc_OSError, "bad bluetooth address"); @@ -1289,9 +1303,23 @@ makebdaddr(bdaddr_t *bdaddr) { char buf[(6 * 2) + 5 + 1]; +#ifdef MS_WINDOWS + int i; + unsigned int octets[6]; + + for (i = 0; i < 6; ++i) { + octets[i] = ((*bdaddr) >> (8 * i)) & 0xFF; + } + + sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", + octets[5], octets[4], octets[3], + octets[2], octets[1], octets[0]); +#else sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", bdaddr->b[5], bdaddr->b[4], bdaddr->b[3], bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]); +#endif + return PyUnicode_FromString(buf); } #endif @@ -1389,6 +1417,7 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) case AF_BLUETOOTH: switch (proto) { +#ifdef BTPROTO_L2CAP case BTPROTO_L2CAP: { struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr; @@ -1403,6 +1432,8 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) return ret; } +#endif /* BTPROTO_L2CAP */ + case BTPROTO_RFCOMM: { struct sockaddr_rc *a = (struct sockaddr_rc *) addr; @@ -1417,6 +1448,7 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) return ret; } +#ifdef BTPROTO_HCI case BTPROTO_HCI: { struct sockaddr_hci *a = (struct sockaddr_hci *) addr; @@ -1436,6 +1468,7 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) return makebdaddr(&_BT_SCO_MEMB(a, bdaddr)); } #endif /* !__FreeBSD__ */ +#endif /* BTPROTO_HCI */ default: PyErr_SetString(PyExc_ValueError, @@ -1522,6 +1555,16 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) a->can_addr.tp.tx_id); } #endif /* CAN_ISOTP */ +#ifdef CAN_J1939 + case CAN_J1939: + { + return Py_BuildValue("O&KkB", PyUnicode_DecodeFSDefault, + ifname, + a->can_addr.j1939.name, + a->can_addr.j1939.pgn, + a->can_addr.j1939.addr); + } +#endif /* CAN_J1939 */ default: { return Py_BuildValue("(O&)", PyUnicode_DecodeFSDefault, @@ -1631,7 +1674,7 @@ idna_converter(PyObject *obj, struct maybe_idna *data) } else { PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s", - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); return 0; } if (strlen(data->buf) != len) { @@ -1649,14 +1692,13 @@ idna_converter(PyObject *obj, struct maybe_idna *data) static int getsockaddrarg(PySocketSockObject *s, PyObject *args, - struct sockaddr *addr_ret, int *len_ret, const char *caller) + sock_addr_t *addrbuf, int *len_ret, const char *caller) { switch (s->sock_family) { #if defined(AF_UNIX) case AF_UNIX: { - struct sockaddr_un* addr; Py_buffer path; int retval = 0; @@ -1674,7 +1716,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, } assert(path.len >= 0); - addr = (struct sockaddr_un*)addr_ret; + struct sockaddr_un* addr = &addrbuf->un; #ifdef __linux__ if (path.len > 0 && *(const char *)path.buf == 0) { /* Linux abstract namespace extension */ @@ -1709,9 +1751,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #if defined(AF_NETLINK) case AF_NETLINK: { - struct sockaddr_nl* addr; int pid, groups; - addr = (struct sockaddr_nl *)addr_ret; + struct sockaddr_nl* addr = &addrbuf->nl; if (!PyTuple_Check(args)) { PyErr_Format( PyExc_TypeError, @@ -1737,9 +1778,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #if defined(AF_QIPCRTR) case AF_QIPCRTR: { - struct sockaddr_qrtr* addr; unsigned int node, port; - addr = (struct sockaddr_qrtr *)addr_ret; + struct sockaddr_qrtr* addr = &addrbuf->sq; if (!PyTuple_Check(args)) { PyErr_Format( PyExc_TypeError, @@ -1761,9 +1801,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #if defined(AF_VSOCK) case AF_VSOCK: { - struct sockaddr_vm* addr; + struct sockaddr_vm* addr = &addrbuf->vm; int port, cid; - addr = (struct sockaddr_vm *)addr_ret; memset(addr, 0, sizeof(struct sockaddr_vm)); if (!PyTuple_Check(args)) { PyErr_Format( @@ -1791,7 +1830,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, case AF_INET: { - struct sockaddr_in* addr; struct maybe_idna host = {NULL, NULL}; int port, result; if (!PyTuple_Check(args)) { @@ -1813,7 +1851,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, } return 0; } - addr=(struct sockaddr_in*)addr_ret; + struct sockaddr_in* addr = &addrbuf->in; result = setipaddr(host.buf, (struct sockaddr *)addr, sizeof(*addr), AF_INET); idna_cleanup(&host); @@ -1834,7 +1872,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #ifdef ENABLE_IPV6 case AF_INET6: { - struct sockaddr_in6* addr; struct maybe_idna host = {NULL, NULL}; int port, result; unsigned int flowinfo, scope_id; @@ -1859,7 +1896,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, } return 0; } - addr = (struct sockaddr_in6*)addr_ret; + struct sockaddr_in6* addr = &addrbuf->in6; result = setipaddr(host.buf, (struct sockaddr *)addr, sizeof(*addr), AF_INET6); idna_cleanup(&host); @@ -1890,12 +1927,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, case AF_BLUETOOTH: { switch (s->sock_proto) { +#ifdef BTPROTO_L2CAP case BTPROTO_L2CAP: { - struct sockaddr_l2 *addr; const char *straddr; - addr = (struct sockaddr_l2 *)addr_ret; + struct sockaddr_l2 *addr = &addrbuf->bt_l2; memset(addr, 0, sizeof(struct sockaddr_l2)); _BT_L2_MEMB(addr, family) = AF_BLUETOOTH; if (!PyArg_ParseTuple(args, "si", &straddr, @@ -1910,12 +1947,11 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, *len_ret = sizeof *addr; return 1; } +#endif /* BTPROTO_L2CAP */ case BTPROTO_RFCOMM: { - struct sockaddr_rc *addr; const char *straddr; - - addr = (struct sockaddr_rc *)addr_ret; + struct sockaddr_rc *addr = &addrbuf->bt_rc; _BT_RC_MEMB(addr, family) = AF_BLUETOOTH; if (!PyArg_ParseTuple(args, "si", &straddr, &_BT_RC_MEMB(addr, channel))) { @@ -1929,9 +1965,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, *len_ret = sizeof *addr; return 1; } +#ifdef BTPROTO_HCI case BTPROTO_HCI: { - struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret; + struct sockaddr_hci *addr = &addrbuf->bt_hci; #if defined(__NetBSD__) || defined(__DragonFly__) const char *straddr; _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; @@ -1957,10 +1994,9 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #if !defined(__FreeBSD__) case BTPROTO_SCO: { - struct sockaddr_sco *addr; const char *straddr; - addr = (struct sockaddr_sco *)addr_ret; + struct sockaddr_sco *addr = &addrbuf->bt_sco; _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH; if (!PyBytes_Check(args)) { PyErr_Format(PyExc_OSError, @@ -1975,6 +2011,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 1; } #endif /* !__FreeBSD__ */ +#endif /* BTPROTO_HCI */ default: PyErr_Format(PyExc_OSError, "%s(): unknown Bluetooth protocol", caller); @@ -1986,7 +2023,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX) case AF_PACKET: { - struct sockaddr_ll* addr; struct ifreq ifr; const char *interfaceName; int protoNumber; @@ -2037,7 +2073,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, PyBuffer_Release(&haddr); return 0; } - addr = (struct sockaddr_ll*)addr_ret; + struct sockaddr_ll* addr = &addrbuf->ll; addr->sll_family = AF_PACKET; addr->sll_protocol = htons((short)protoNumber); addr->sll_ifindex = ifr.ifr_ifindex; @@ -2060,7 +2096,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, { unsigned int atype, v1, v2, v3; unsigned int scope = TIPC_CLUSTER_SCOPE; - struct sockaddr_tipc *addr; if (!PyTuple_Check(args)) { PyErr_Format( @@ -2078,7 +2113,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 0; } - addr = (struct sockaddr_tipc *) addr_ret; + struct sockaddr_tipc *addr = &addrbuf->tipc; memset(addr, 0, sizeof(struct sockaddr_tipc)); addr->family = AF_TIPC; @@ -2119,11 +2154,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #endif #if defined(CAN_RAW) || defined(CAN_BCM) { - struct sockaddr_can *addr; PyObject *interfaceName; struct ifreq ifr; Py_ssize_t len; - addr = (struct sockaddr_can *)addr_ret; + struct sockaddr_can *addr = &addrbuf->can; if (!PyTuple_Check(args)) { PyErr_Format(PyExc_TypeError, @@ -2170,13 +2204,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #ifdef CAN_ISOTP case CAN_ISOTP: { - struct sockaddr_can *addr; PyObject *interfaceName; struct ifreq ifr; Py_ssize_t len; unsigned long int rx_id, tx_id; - addr = (struct sockaddr_can *)addr_ret; + struct sockaddr_can *addr = &addrbuf->can; if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter, &interfaceName, @@ -2213,6 +2246,55 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 1; } #endif /* CAN_ISOTP */ +#ifdef CAN_J1939 + case CAN_J1939: + { + PyObject *interfaceName; + struct ifreq ifr; + Py_ssize_t len; + uint64_t j1939_name; + uint32_t j1939_pgn; + uint8_t j1939_addr; + + struct sockaddr_can *addr = &addrbuf->can; + + if (!PyArg_ParseTuple(args, "O&KkB", PyUnicode_FSConverter, + &interfaceName, + &j1939_name, + &j1939_pgn, + &j1939_addr)) + return 0; + + len = PyBytes_GET_SIZE(interfaceName); + + if (len == 0) { + ifr.ifr_ifindex = 0; + } else if ((size_t)len < sizeof(ifr.ifr_name)) { + strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name)); + ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0'; + if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) { + s->errorhandler(); + Py_DECREF(interfaceName); + return 0; + } + } else { + PyErr_SetString(PyExc_OSError, + "AF_CAN interface name too long"); + Py_DECREF(interfaceName); + return 0; + } + + addr->can_family = AF_CAN; + addr->can_ifindex = ifr.ifr_ifindex; + addr->can_addr.j1939.name = j1939_name; + addr->can_addr.j1939.pgn = j1939_pgn; + addr->can_addr.j1939.addr = j1939_addr; + + *len_ret = sizeof(*addr); + Py_DECREF(interfaceName); + return 1; + } +#endif /* CAN_J1939 */ default: PyErr_Format(PyExc_OSError, "%s(): unsupported CAN protocol", caller); @@ -2226,9 +2308,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #ifdef SYSPROTO_CONTROL case SYSPROTO_CONTROL: { - struct sockaddr_ctl *addr; - - addr = (struct sockaddr_ctl *)addr_ret; + struct sockaddr_ctl *addr = &addrbuf->ctl; addr->sc_family = AF_SYSTEM; addr->ss_sysaddr = AF_SYS_CONTROL; @@ -2280,10 +2360,9 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #ifdef HAVE_SOCKADDR_ALG case AF_ALG: { - struct sockaddr_alg *sa; const char *type; const char *name; - sa = (struct sockaddr_alg *)addr_ret; + struct sockaddr_alg *sa = &addrbuf->alg; memset(sa, 0, sizeof(*sa)); sa->salg_family = AF_ALG; @@ -2396,12 +2475,15 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) switch(s->sock_proto) { +#ifdef BTPROTO_L2CAP case BTPROTO_L2CAP: *len_ret = sizeof (struct sockaddr_l2); return 1; +#endif /* BTPROTO_L2CAP */ case BTPROTO_RFCOMM: *len_ret = sizeof (struct sockaddr_rc); return 1; +#ifdef BTPROTO_HCI case BTPROTO_HCI: *len_ret = sizeof (struct sockaddr_hci); return 1; @@ -2410,6 +2492,7 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) *len_ret = sizeof (struct sockaddr_sco); return 1; #endif /* !__FreeBSD__ */ +#endif /* BTPROTO_HCI */ default: PyErr_SetString(PyExc_OSError, "getsockaddrlen: " "unknown BT protocol"); @@ -3063,7 +3146,7 @@ sock_bind(PySocketSockObject *s, PyObject *addro) int addrlen; int res; - if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) { + if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "bind")) { return NULL; } @@ -3233,7 +3316,7 @@ sock_connect(PySocketSockObject *s, PyObject *addro) int addrlen; int res; - if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect")) { + if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect")) { return NULL; } @@ -3264,7 +3347,7 @@ sock_connect_ex(PySocketSockObject *s, PyObject *addro) int addrlen; int res; - if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect_ex")) { + if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect_ex")) { return NULL; } @@ -4269,7 +4352,7 @@ sock_sendto(PySocketSockObject *s, PyObject *args) return select_error(); } - if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "sendto")) { + if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "sendto")) { PyBuffer_Release(&pbuf); return NULL; } @@ -4404,7 +4487,7 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args) /* Parse destination address. */ if (addr_arg != NULL && addr_arg != Py_None) { - if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen, + if (!getsockaddrarg(s, addr_arg, &addrbuf, &addrlen, "sendmsg")) { goto finally; @@ -7071,7 +7154,7 @@ PyInit__socket(void) } #endif - Py_TYPE(&sock_type) = &PyType_Type; + Py_SET_TYPE(&sock_type, &PyType_Type); m = PyModule_Create(&socketmodule); if (m == NULL) return NULL; @@ -7285,23 +7368,29 @@ PyInit__socket(void) #ifdef USE_BLUETOOTH PyModule_AddIntMacro(m, AF_BLUETOOTH); +#ifdef BTPROTO_L2CAP PyModule_AddIntMacro(m, BTPROTO_L2CAP); +#endif /* BTPROTO_L2CAP */ +#ifdef BTPROTO_HCI PyModule_AddIntMacro(m, BTPROTO_HCI); PyModule_AddIntMacro(m, SOL_HCI); #if !defined(__NetBSD__) && !defined(__DragonFly__) PyModule_AddIntMacro(m, HCI_FILTER); -#endif #if !defined(__FreeBSD__) -#if !defined(__NetBSD__) && !defined(__DragonFly__) PyModule_AddIntMacro(m, HCI_TIME_STAMP); -#endif PyModule_AddIntMacro(m, HCI_DATA_DIR); - PyModule_AddIntMacro(m, BTPROTO_SCO); -#endif +#endif /* !__FreeBSD__ */ +#endif /* !__NetBSD__ && !__DragonFly__ */ +#endif /* BTPROTO_HCI */ +#ifdef BTPROTO_RFCOMM PyModule_AddIntMacro(m, BTPROTO_RFCOMM); +#endif /* BTPROTO_RFCOMM */ PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00"); PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF"); -#endif +#ifdef BTPROTO_SCO + PyModule_AddIntMacro(m, BTPROTO_SCO); +#endif /* BTPROTO_SCO */ +#endif /* USE_BLUETOOTH */ #ifdef AF_CAN /* Controller Area Network */ @@ -7656,6 +7745,9 @@ PyInit__socket(void) #ifdef CAN_ISOTP PyModule_AddIntMacro(m, CAN_ISOTP); #endif +#ifdef CAN_J1939 + PyModule_AddIntMacro(m, CAN_J1939); +#endif #endif #ifdef HAVE_LINUX_CAN_RAW_H PyModule_AddIntMacro(m, CAN_RAW_FILTER); @@ -7666,6 +7758,9 @@ PyInit__socket(void) #ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES); #endif +#ifdef HAVE_LINUX_CAN_RAW_JOIN_FILTERS + PyModule_AddIntMacro(m, CAN_RAW_JOIN_FILTERS); +#endif #ifdef HAVE_LINUX_CAN_BCM_H PyModule_AddIntMacro(m, CAN_BCM); @@ -7700,6 +7795,37 @@ PyInit__socket(void) PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME); #endif #endif +#ifdef HAVE_LINUX_CAN_J1939_H + PyModule_AddIntMacro(m, J1939_MAX_UNICAST_ADDR); + PyModule_AddIntMacro(m, J1939_IDLE_ADDR); + PyModule_AddIntMacro(m, J1939_NO_ADDR); + PyModule_AddIntMacro(m, J1939_NO_NAME); + PyModule_AddIntMacro(m, J1939_PGN_REQUEST); + PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_CLAIMED); + PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_COMMANDED); + PyModule_AddIntMacro(m, J1939_PGN_PDU1_MAX); + PyModule_AddIntMacro(m, J1939_PGN_MAX); + PyModule_AddIntMacro(m, J1939_NO_PGN); + + /* J1939 socket options */ + PyModule_AddIntMacro(m, SO_J1939_FILTER); + PyModule_AddIntMacro(m, SO_J1939_PROMISC); + PyModule_AddIntMacro(m, SO_J1939_SEND_PRIO); + PyModule_AddIntMacro(m, SO_J1939_ERRQUEUE); + + PyModule_AddIntMacro(m, SCM_J1939_DEST_ADDR); + PyModule_AddIntMacro(m, SCM_J1939_DEST_NAME); + PyModule_AddIntMacro(m, SCM_J1939_PRIO); + PyModule_AddIntMacro(m, SCM_J1939_ERRQUEUE); + + PyModule_AddIntMacro(m, J1939_NLA_PAD); + PyModule_AddIntMacro(m, J1939_NLA_BYTES_ACKED); + + PyModule_AddIntMacro(m, J1939_EE_INFO_NONE); + PyModule_AddIntMacro(m, J1939_EE_INFO_TX_ABORT); + + PyModule_AddIntMacro(m, J1939_FILTER_MAX); +#endif #ifdef SOL_RDS PyModule_AddIntMacro(m, SOL_RDS); #endif @@ -7768,6 +7894,17 @@ PyInit__socket(void) #else PyModule_AddIntConstant(m, "IPPROTO_UDP", 17); #endif +#ifdef IPPROTO_UDPLITE + PyModule_AddIntMacro(m, IPPROTO_UDPLITE); + #ifndef UDPLITE_SEND_CSCOV + #define UDPLITE_SEND_CSCOV 10 + #endif + PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV); + #ifndef UDPLITE_RECV_CSCOV + #define UDPLITE_RECV_CSCOV 11 + #endif + PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV); +#endif #ifdef IPPROTO_IDP PyModule_AddIntMacro(m, IPPROTO_IDP); #endif diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index dff1f8f4..ba2c9f5c 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -14,6 +14,47 @@ #else /* MS_WINDOWS */ # include + +/* + * If Windows has bluetooth support, include bluetooth constants. + */ +#ifdef AF_BTH +# include +# include + +/* + * The current implementation assumes the bdaddr in the sockaddr structs + * will be a bdaddr_t. We treat this as an opaque type: on *nix systems, it + * will be a struct with a single member (an array of six bytes). On windows, + * we typedef this to ULONGLONG to match the Windows definition. + */ +typedef ULONGLONG bdaddr_t; + +/* + * Redefine SOCKADDR_BTH to provide names compatible with _BT_RC_MEMB() macros. + */ +struct SOCKADDR_BTH_REDEF { + union { + USHORT addressFamily; + USHORT family; + }; + + union { + ULONGLONG btAddr; + bdaddr_t bdaddr; + }; + + GUID serviceClassId; + + union { + ULONG port; + ULONG channel; + }; + +}; +# include +#endif + /* Windows 'supports' CMSG_LEN, but does not follow the POSIX standard * interface at all, so there is no point including the code that * attempts to use it. @@ -103,6 +144,10 @@ typedef int socklen_t; #include #endif +#ifdef HAVE_LINUX_CAN_J1939_H +#include +#endif + #ifdef HAVE_SYS_SYS_DOMAIN_H #include #endif @@ -194,11 +239,18 @@ typedef union sock_addr { struct sockaddr_in6 in6; struct sockaddr_storage storage; #endif -#ifdef HAVE_BLUETOOTH_BLUETOOTH_H +#if defined(HAVE_BLUETOOTH_H) && defined(__FreeBSD__) + struct sockaddr_l2cap bt_l2; + struct sockaddr_rfcomm bt_rc; + struct sockaddr_sco bt_sco; + struct sockaddr_hci bt_hci; +#elif defined(HAVE_BLUETOOTH_BLUETOOTH_H) struct sockaddr_l2 bt_l2; struct sockaddr_rc bt_rc; struct sockaddr_sco bt_sco; struct sockaddr_hci bt_hci; +#elif defined(MS_WINDOWS) + struct SOCKADDR_BTH_REDEF bt_rc; #endif #ifdef HAVE_NETPACKET_PACKET_H struct sockaddr_ll ll; @@ -218,6 +270,9 @@ typedef union sock_addr { #ifdef AF_VSOCK struct sockaddr_vm vm; #endif +#ifdef HAVE_LINUX_TIPC_H + struct sockaddr_tipc tipc; +#endif } sock_addr_t; /* The object holding a socket. It holds some extra information, diff --git a/Modules/sre.h b/Modules/sre.h index a7284881..9b0d8b19 100644 --- a/Modules/sre.h +++ b/Modules/sre.h @@ -54,17 +54,17 @@ typedef struct { typedef struct SRE_REPEAT_T { Py_ssize_t count; - SRE_CODE* pattern; /* points to REPEAT operator arguments */ - void* last_ptr; /* helper to check for infinite loops */ + const SRE_CODE* pattern; /* points to REPEAT operator arguments */ + const void* last_ptr; /* helper to check for infinite loops */ struct SRE_REPEAT_T *prev; /* points to previous repeat context */ } SRE_REPEAT; typedef struct { /* string pointers */ - void* ptr; /* current position (also end of current slice) */ - void* beginning; /* start of original string */ - void* start; /* start of current slice */ - void* end; /* end of original string */ + const void* ptr; /* current position (also end of current slice) */ + const void* beginning; /* start of original string */ + const void* start; /* start of current slice */ + const void* end; /* end of original string */ /* attributes for the match object */ PyObject* string; Py_buffer buffer; @@ -74,7 +74,7 @@ typedef struct { /* registers */ Py_ssize_t lastindex; Py_ssize_t lastmark; - void** mark; + const void** mark; int match_all; int must_advance; /* dynamically allocated stuff */ diff --git a/Modules/sre_lib.h b/Modules/sre_lib.h index 437ab43f..9cc78632 100644 --- a/Modules/sre_lib.h +++ b/Modules/sre_lib.h @@ -13,7 +13,7 @@ /* This file is included three times, with different character settings */ LOCAL(int) -SRE(at)(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at) +SRE(at)(SRE_STATE* state, const SRE_CHAR* ptr, SRE_CODE at) { /* check if pointer is at given position */ @@ -101,7 +101,7 @@ SRE(at)(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at) } LOCAL(int) -SRE(charset)(SRE_STATE* state, SRE_CODE* set, SRE_CODE ch) +SRE(charset)(SRE_STATE* state, const SRE_CODE* set, SRE_CODE ch) { /* check if character is a member of the given set */ @@ -188,7 +188,7 @@ SRE(charset)(SRE_STATE* state, SRE_CODE* set, SRE_CODE ch) } LOCAL(int) -SRE(charset_loc_ignore)(SRE_STATE* state, SRE_CODE* set, SRE_CODE ch) +SRE(charset_loc_ignore)(SRE_STATE* state, const SRE_CODE* set, SRE_CODE ch) { SRE_CODE lo, up; lo = sre_lower_locale(ch); @@ -199,15 +199,15 @@ SRE(charset_loc_ignore)(SRE_STATE* state, SRE_CODE* set, SRE_CODE ch) return up != lo && SRE(charset)(state, set, up); } -LOCAL(Py_ssize_t) SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int toplevel); +LOCAL(Py_ssize_t) SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel); LOCAL(Py_ssize_t) -SRE(count)(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount) +SRE(count)(SRE_STATE* state, const SRE_CODE* pattern, Py_ssize_t maxcount) { SRE_CODE chr; SRE_CHAR c; - SRE_CHAR* ptr = (SRE_CHAR *)state->ptr; - SRE_CHAR* end = (SRE_CHAR *)state->end; + const SRE_CHAR* ptr = (const SRE_CHAR *)state->ptr; + const SRE_CHAR* end = (const SRE_CHAR *)state->end; Py_ssize_t i; /* adjust end */ @@ -335,14 +335,14 @@ SRE(count)(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount) #if 0 /* not used in this release */ LOCAL(int) -SRE(info)(SRE_STATE* state, SRE_CODE* pattern) +SRE(info)(SRE_STATE* state, const SRE_CODE* pattern) { /* check if an SRE_OP_INFO block matches at the current position. returns the number of SRE_CODE objects to skip if successful, 0 if no match */ - SRE_CHAR* end = (SRE_CHAR*) state->end; - SRE_CHAR* ptr = (SRE_CHAR*) state->ptr; + const SRE_CHAR* end = (const SRE_CHAR*) state->end; + const SRE_CHAR* ptr = (const SRE_CHAR*) state->ptr; Py_ssize_t i; /* check minimal length */ @@ -531,8 +531,8 @@ do { \ typedef struct { Py_ssize_t last_ctx_pos; Py_ssize_t jump; - SRE_CHAR* ptr; - SRE_CODE* pattern; + const SRE_CHAR* ptr; + const SRE_CODE* pattern; Py_ssize_t count; Py_ssize_t lastmark; Py_ssize_t lastindex; @@ -546,9 +546,9 @@ typedef struct { /* check if string matches the given pattern. returns <0 for error, 0 for failure, and 1 for success */ LOCAL(Py_ssize_t) -SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int toplevel) +SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) { - SRE_CHAR* end = (SRE_CHAR *)state->end; + const SRE_CHAR* end = (const SRE_CHAR *)state->end; Py_ssize_t alloc_pos, ctx_pos = -1; Py_ssize_t i, ret = 0; Py_ssize_t jump; diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c index 66ea2703..cdc94a60 100644 --- a/Modules/syslogmodule.c +++ b/Modules/syslogmodule.c @@ -50,7 +50,7 @@ Revision history: /* syslog module */ #include "Python.h" -#include "osdefs.h" +#include "osdefs.h" // SEP #include @@ -99,7 +99,7 @@ syslog_get_argv(void) if (slash == -2) return NULL; if (slash != -1) { - return PyUnicode_Substring(scriptobj, slash, scriptlen); + return PyUnicode_Substring(scriptobj, slash + 1, scriptlen); } else { Py_INCREF(scriptobj); return(scriptobj); @@ -261,72 +261,55 @@ static PyMethodDef syslog_methods[] = { {NULL, NULL, 0} }; -/* Initialization function for the module */ - - -static struct PyModuleDef syslogmodule = { - PyModuleDef_HEAD_INIT, - "syslog", - NULL, - -1, - syslog_methods, - NULL, - NULL, - NULL, - NULL -}; -PyMODINIT_FUNC -PyInit_syslog(void) +static int +syslog_exec(PyObject *module) { - PyObject *m; - - /* Create the module and add the functions */ - m = PyModule_Create(&syslogmodule); - if (m == NULL) - return NULL; - - /* Add some symbolic constants to the module */ - +#define ADD_INT_MACRO(module, macro) \ + do { \ + if (PyModule_AddIntConstant(module, #macro, macro) < 0) { \ + return -1; \ + } \ + } while (0) /* Priorities */ - PyModule_AddIntMacro(m, LOG_EMERG); - PyModule_AddIntMacro(m, LOG_ALERT); - PyModule_AddIntMacro(m, LOG_CRIT); - PyModule_AddIntMacro(m, LOG_ERR); - PyModule_AddIntMacro(m, LOG_WARNING); - PyModule_AddIntMacro(m, LOG_NOTICE); - PyModule_AddIntMacro(m, LOG_INFO); - PyModule_AddIntMacro(m, LOG_DEBUG); + ADD_INT_MACRO(module, LOG_EMERG); + ADD_INT_MACRO(module, LOG_ALERT); + ADD_INT_MACRO(module, LOG_CRIT); + ADD_INT_MACRO(module, LOG_ERR); + ADD_INT_MACRO(module, LOG_WARNING); + ADD_INT_MACRO(module, LOG_NOTICE); + ADD_INT_MACRO(module, LOG_INFO); + ADD_INT_MACRO(module, LOG_DEBUG); /* openlog() option flags */ - PyModule_AddIntMacro(m, LOG_PID); - PyModule_AddIntMacro(m, LOG_CONS); - PyModule_AddIntMacro(m, LOG_NDELAY); + ADD_INT_MACRO(module, LOG_PID); + ADD_INT_MACRO(module, LOG_CONS); + ADD_INT_MACRO(module, LOG_NDELAY); #ifdef LOG_ODELAY - PyModule_AddIntMacro(m, LOG_ODELAY); + ADD_INT_MACRO(module, LOG_ODELAY); #endif #ifdef LOG_NOWAIT - PyModule_AddIntMacro(m, LOG_NOWAIT); + ADD_INT_MACRO(module, LOG_NOWAIT); #endif #ifdef LOG_PERROR - PyModule_AddIntMacro(m, LOG_PERROR); + ADD_INT_MACRO(module, LOG_PERROR); #endif /* Facilities */ - PyModule_AddIntMacro(m, LOG_KERN); - PyModule_AddIntMacro(m, LOG_USER); - PyModule_AddIntMacro(m, LOG_MAIL); - PyModule_AddIntMacro(m, LOG_DAEMON); - PyModule_AddIntMacro(m, LOG_AUTH); - PyModule_AddIntMacro(m, LOG_LPR); - PyModule_AddIntMacro(m, LOG_LOCAL0); - PyModule_AddIntMacro(m, LOG_LOCAL1); - PyModule_AddIntMacro(m, LOG_LOCAL2); - PyModule_AddIntMacro(m, LOG_LOCAL3); - PyModule_AddIntMacro(m, LOG_LOCAL4); - PyModule_AddIntMacro(m, LOG_LOCAL5); - PyModule_AddIntMacro(m, LOG_LOCAL6); - PyModule_AddIntMacro(m, LOG_LOCAL7); + ADD_INT_MACRO(module, LOG_KERN); + ADD_INT_MACRO(module, LOG_USER); + ADD_INT_MACRO(module, LOG_MAIL); + ADD_INT_MACRO(module, LOG_DAEMON); + ADD_INT_MACRO(module, LOG_AUTH); + ADD_INT_MACRO(module, LOG_LPR); + ADD_INT_MACRO(module, LOG_LOCAL0); + ADD_INT_MACRO(module, LOG_LOCAL1); + ADD_INT_MACRO(module, LOG_LOCAL2); + ADD_INT_MACRO(module, LOG_LOCAL3); + ADD_INT_MACRO(module, LOG_LOCAL4); + ADD_INT_MACRO(module, LOG_LOCAL5); + ADD_INT_MACRO(module, LOG_LOCAL6); + ADD_INT_MACRO(module, LOG_LOCAL7); #ifndef LOG_SYSLOG #define LOG_SYSLOG LOG_DAEMON @@ -341,14 +324,35 @@ PyInit_syslog(void) #define LOG_CRON LOG_DAEMON #endif - PyModule_AddIntMacro(m, LOG_SYSLOG); - PyModule_AddIntMacro(m, LOG_CRON); - PyModule_AddIntMacro(m, LOG_UUCP); - PyModule_AddIntMacro(m, LOG_NEWS); + ADD_INT_MACRO(module, LOG_SYSLOG); + ADD_INT_MACRO(module, LOG_CRON); + ADD_INT_MACRO(module, LOG_UUCP); + ADD_INT_MACRO(module, LOG_NEWS); #ifdef LOG_AUTHPRIV - PyModule_AddIntMacro(m, LOG_AUTHPRIV); + ADD_INT_MACRO(module, LOG_AUTHPRIV); #endif - return m; + return 0; } + +static PyModuleDef_Slot syslog_slots[] = { + {Py_mod_exec, syslog_exec}, + {0, NULL} +}; + +/* Initialization function for the module */ + +static struct PyModuleDef syslogmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "syslog", + .m_size = 0, + .m_methods = syslog_methods, + .m_slots = syslog_slots, +}; + +PyMODINIT_FUNC +PyInit_syslog(void) +{ + return PyModuleDef_Init(&syslogmodule); +} \ No newline at end of file diff --git a/Modules/termios.c b/Modules/termios.c index aee7f12c..75e5e523 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -39,7 +39,19 @@ All functions in this module take a file descriptor fd as their first\n\ argument. This can be an integer file descriptor, such as returned by\n\ sys.stdin.fileno(), or a file object, such as sys.stdin itself."); -static PyObject *TermiosError; +typedef struct { + PyObject *TermiosError; +} termiosmodulestate; + +static inline termiosmodulestate* +get_termios_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (termiosmodulestate *)state; +} + +#define modulestate_global get_termios_state(PyState_FindModule(&termiosmodule)) static int fdconv(PyObject* obj, void* p) { @@ -53,6 +65,8 @@ static int fdconv(PyObject* obj, void* p) return 0; } +static struct PyModuleDef termiosmodule; + PyDoc_STRVAR(termios_tcgetattr__doc__, "tcgetattr(fd) -> list_of_attrs\n\ \n\ @@ -80,7 +94,7 @@ termios_tcgetattr(PyObject *self, PyObject *args) return NULL; if (tcgetattr(fd, &mode) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(modulestate_global->TermiosError); ispeed = cfgetispeed(&mode); ospeed = cfgetospeed(&mode); @@ -160,8 +174,9 @@ termios_tcsetattr(PyObject *self, PyObject *args) } /* Get the old mode, in case there are any hidden fields... */ + termiosmodulestate *state = modulestate_global; if (tcgetattr(fd, &mode) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(state->TermiosError); mode.c_iflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 0)); mode.c_oflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 1)); mode.c_cflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 2)); @@ -194,11 +209,11 @@ termios_tcsetattr(PyObject *self, PyObject *args) } if (cfsetispeed(&mode, (speed_t) ispeed) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(state->TermiosError); if (cfsetospeed(&mode, (speed_t) ospeed) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(state->TermiosError); if (tcsetattr(fd, when, &mode) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(state->TermiosError); Py_RETURN_NONE; } @@ -219,7 +234,7 @@ termios_tcsendbreak(PyObject *self, PyObject *args) fdconv, &fd, &duration)) return NULL; if (tcsendbreak(fd, duration) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(modulestate_global->TermiosError); Py_RETURN_NONE; } @@ -238,7 +253,7 @@ termios_tcdrain(PyObject *self, PyObject *args) fdconv, &fd)) return NULL; if (tcdrain(fd) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(modulestate_global->TermiosError); Py_RETURN_NONE; } @@ -260,7 +275,7 @@ termios_tcflush(PyObject *self, PyObject *args) fdconv, &fd, &queue)) return NULL; if (tcflush(fd, queue) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(modulestate_global->TermiosError); Py_RETURN_NONE; } @@ -282,7 +297,7 @@ termios_tcflow(PyObject *self, PyObject *args) fdconv, &fd, &action)) return NULL; if (tcflow(fd, action) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(modulestate_global->TermiosError); Py_RETURN_NONE; } @@ -606,6 +621,39 @@ static struct constant { #ifdef B460800 {"B460800", B460800}, #endif +#ifdef B500000 + {"B500000", B500000}, +#endif +#ifdef B576000 + { "B576000", B576000}, +#endif +#ifdef B921600 + { "B921600", B921600}, +#endif +#ifdef B1000000 + { "B1000000", B1000000}, +#endif +#ifdef B1152000 + { "B1152000", B1152000}, +#endif +#ifdef B1500000 + { "B1500000", B1500000}, +#endif +#ifdef B2000000 + { "B2000000", B2000000}, +#endif +#ifdef B2500000 + { "B2500000", B2500000}, +#endif +#ifdef B3000000 + { "B3000000", B3000000}, +#endif +#ifdef B3500000 + { "B3500000", B3500000}, +#endif +#ifdef B4000000 + { "B4000000", B4000000}, +#endif #ifdef CBAUD {"CBAUD", CBAUD}, #endif @@ -935,17 +983,30 @@ static struct constant { {NULL, 0} }; +static int termiosmodule_traverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(get_termios_state(m)->TermiosError); + return 0; +} + +static int termiosmodule_clear(PyObject *m) { + Py_CLEAR(get_termios_state(m)->TermiosError); + return 0; +} + +static void termiosmodule_free(void *m) { + termiosmodule_clear((PyObject *)m); +} static struct PyModuleDef termiosmodule = { PyModuleDef_HEAD_INIT, "termios", termios__doc__, - -1, + sizeof(termiosmodulestate), termios_methods, NULL, - NULL, - NULL, - NULL + termiosmodule_traverse, + termiosmodule_clear, + termiosmodule_free, }; PyMODINIT_FUNC @@ -954,15 +1015,22 @@ PyInit_termios(void) PyObject *m; struct constant *constant = termios_constants; - m = PyModule_Create(&termiosmodule); - if (m == NULL) + if ((m = PyState_FindModule(&termiosmodule)) != NULL) { + Py_INCREF(m); + return m; + } + + if ((m = PyModule_Create(&termiosmodule)) == NULL) { return NULL; + } - if (TermiosError == NULL) { - TermiosError = PyErr_NewException("termios.error", NULL, NULL); + termiosmodulestate *state = get_termios_state(m); + state->TermiosError = PyErr_NewException("termios.error", NULL, NULL); + if (state->TermiosError == NULL) { + return NULL; } - Py_INCREF(TermiosError); - PyModule_AddObject(m, "error", TermiosError); + Py_INCREF(state->TermiosError); + PyModule_AddObject(m, "error", state->TermiosError); while (constant->name != NULL) { PyModule_AddIntConstant(m, constant->name, constant->value); diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 5e0010c8..8a4d149b 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -24,14 +24,17 @@ # include #endif +#if defined(_AIX) +# include +#endif + #if defined(__WATCOMC__) && !defined(__QNX__) -#include +# include #else -#ifdef MS_WINDOWS -#define WIN32_LEAN_AND_MEAN -#include -#include "pythread.h" -#endif /* MS_WINDOWS */ +# ifdef MS_WINDOWS +# define WIN32_LEAN_AND_MEAN +# include +# endif /* MS_WINDOWS */ #endif /* !__WATCOMC__ || __QNX__ */ #ifdef _Py_MEMORY_SANITIZER @@ -550,7 +553,7 @@ gettmarg(PyObject *args, struct tm *p, const char *format) p->tm_wday = (p->tm_wday + 1) % 7; p->tm_yday--; #ifdef HAVE_STRUCT_TM_TM_ZONE - if (Py_TYPE(args) == &StructTimeType) { + if (Py_IS_TYPE(args, &StructTimeType)) { PyObject *item; item = PyStructSequence_GET_ITEM(args, 9); if (item != Py_None) { @@ -1344,6 +1347,30 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) return 0; } +#elif defined(_AIX) +#define HAVE_THREAD_TIME +static int +_PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) +{ + /* bpo-40192: On AIX, thread_cputime() is preferred: it has nanosecond + resolution, whereas clock_gettime(CLOCK_THREAD_CPUTIME_ID) + has a resolution of 10 ms. */ + thread_cputime_t tc; + if (thread_cputime(-1, &tc) != 0) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + if (info) { + info->implementation = "thread_cputime()"; + info->monotonic = 1; + info->adjustable = 0; + info->resolution = 1e-9; + } + *tp = _PyTime_FromNanoseconds(tc.stime + tc.utime); + return 0; +} + #elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) #define HAVE_THREAD_TIME static int @@ -1736,75 +1763,88 @@ if it is 1, the time is given in the DST time zone;\n\ if it is -1, mktime() should guess based on the date and time.\n"); - -static struct PyModuleDef timemodule = { - PyModuleDef_HEAD_INIT, - "time", - module_doc, - -1, - time_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit_time(void) +static int +time_exec(PyObject *module) { - PyObject *m; - m = PyModule_Create(&timemodule); - if (m == NULL) - return NULL; - /* Set, or reset, module variables like time.timezone */ - if (init_timezone(m) < 0) { - return NULL; + if (init_timezone(module) < 0) { + return -1; } #if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_SETTIME) || defined(HAVE_CLOCK_GETRES) #ifdef CLOCK_REALTIME - PyModule_AddIntMacro(m, CLOCK_REALTIME); + if (PyModule_AddIntMacro(module, CLOCK_REALTIME) < 0) { + return -1; + } #endif #ifdef CLOCK_MONOTONIC - PyModule_AddIntMacro(m, CLOCK_MONOTONIC); + if (PyModule_AddIntMacro(module, CLOCK_MONOTONIC) < 0) { + return -1; + } #endif #ifdef CLOCK_MONOTONIC_RAW - PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW); + if (PyModule_AddIntMacro(module, CLOCK_MONOTONIC_RAW) < 0) { + return -1; + } #endif #ifdef CLOCK_HIGHRES - PyModule_AddIntMacro(m, CLOCK_HIGHRES); + if (PyModule_AddIntMacro(module, CLOCK_HIGHRES) < 0) { + return -1; + } #endif #ifdef CLOCK_PROCESS_CPUTIME_ID - PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID); + if (PyModule_AddIntMacro(module, CLOCK_PROCESS_CPUTIME_ID) < 0) { + return -1; + } #endif #ifdef CLOCK_THREAD_CPUTIME_ID - PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID); + if (PyModule_AddIntMacro(module, CLOCK_THREAD_CPUTIME_ID) < 0) { + return -1; + } #endif #ifdef CLOCK_PROF - PyModule_AddIntMacro(m, CLOCK_PROF); + if (PyModule_AddIntMacro(module, CLOCK_PROF) < 0) { + return -1; + } #endif #ifdef CLOCK_BOOTTIME - PyModule_AddIntMacro(m, CLOCK_BOOTTIME); + if (PyModule_AddIntMacro(module, CLOCK_BOOTTIME) < 0) { + return -1; + } +#endif +#ifdef CLOCK_TAI + if (PyModule_AddIntMacro(module, CLOCK_TAI) < 0) { + return -1; + } #endif #ifdef CLOCK_UPTIME - PyModule_AddIntMacro(m, CLOCK_UPTIME); + if (PyModule_AddIntMacro(module, CLOCK_UPTIME) < 0) { + return -1; + } #endif #ifdef CLOCK_UPTIME_RAW - PyModule_AddIntMacro(m, CLOCK_UPTIME_RAW); + if (PyModule_AddIntMacro(module, CLOCK_UPTIME_RAW) < 0) { + return -1; + } #endif #endif /* defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_SETTIME) || defined(HAVE_CLOCK_GETRES) */ if (!initialized) { if (PyStructSequence_InitType2(&StructTimeType, - &struct_time_type_desc) < 0) - return NULL; + &struct_time_type_desc) < 0) { + return -1; + } + } + if (PyModule_AddIntConstant(module, "_STRUCT_TM_ITEMS", 11)) { + return -1; } Py_INCREF(&StructTimeType); - PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11); - PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType); + if (PyModule_AddObject(module, "struct_time", (PyObject*) &StructTimeType)) { + Py_DECREF(&StructTimeType); + return -1; + } initialized = 1; #if defined(__linux__) && !defined(__GLIBC__) @@ -1814,10 +1854,30 @@ PyInit_time(void) utc_string = tm.tm_zone; #endif - if (PyErr_Occurred()) { - return NULL; - } - return m; + return 0; +} + +static struct PyModuleDef_Slot time_slots[] = { + {Py_mod_exec, time_exec}, + {0, NULL} +}; + +static struct PyModuleDef timemodule = { + PyModuleDef_HEAD_INIT, + "time", + module_doc, + 0, + time_methods, + time_slots, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit_time(void) +{ + return PyModuleDef_Init(&timemodule); } /* Implement pysleep() for various platforms. diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index 5e8ba602..8a1198a2 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -17,7 +17,7 @@ #include "Python.h" #include "ucnhash.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include @@ -92,7 +92,7 @@ static PyMemberDef DB_members[] = { /* forward declaration */ static PyTypeObject UCD_Type; -#define UCD_Check(o) (Py_TYPE(o)==&UCD_Type) +#define UCD_Check(o) Py_IS_TYPE(o, &UCD_Type) static PyObject* new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4), @@ -496,7 +496,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k) Py_UCS4 *output; Py_ssize_t i, o, osize; int kind; - void *data; + const void *data; /* Longest decomposition in Unicode 3.2: U+FDFA */ Py_UCS4 stack[20]; Py_ssize_t space, isize; @@ -623,7 +623,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k) } static int -find_nfc_index(PyObject *self, struct reindex* nfc, Py_UCS4 code) +find_nfc_index(const struct reindex* nfc, Py_UCS4 code) { unsigned int index; for (index = 0; nfc[index].start; index++) { @@ -643,7 +643,7 @@ nfc_nfkc(PyObject *self, PyObject *input, int k) { PyObject *result; int kind; - void *data; + const void *data; Py_UCS4 *output; Py_ssize_t i, i1, o, len; int f,l,index,index1,comb; @@ -709,7 +709,7 @@ nfc_nfkc(PyObject *self, PyObject *input, int k) } /* code is still input[i] here */ - f = find_nfc_index(self, nfc_first, code); + f = find_nfc_index(nfc_first, code); if (f == -1) { output[o++] = code; i++; @@ -732,7 +732,7 @@ nfc_nfkc(PyObject *self, PyObject *input, int k) continue; } } - l = find_nfc_index(self, nfc_last, code1); + l = find_nfc_index(nfc_last, code1); /* i1 cannot be combined with i. If i1 is a starter, we don't need to look further. Otherwise, record the combining class. */ @@ -757,7 +757,7 @@ nfc_nfkc(PyObject *self, PyObject *input, int k) assert(cskipped < 20); skipped[cskipped++] = i1; i1++; - f = find_nfc_index(self, nfc_first, output[o]); + f = find_nfc_index(nfc_first, output[o]); if (f == -1) break; } @@ -795,7 +795,7 @@ typedef enum {YES = 0, MAYBE = 1, NO = 2} QuickcheckResult; */ static QuickcheckResult is_normalized_quickcheck(PyObject *self, PyObject *input, - int nfc, int k, bool yes_only) + bool nfc, bool k, bool yes_only) { /* An older version of the database is requested, quickchecks must be disabled. */ @@ -804,7 +804,7 @@ is_normalized_quickcheck(PyObject *self, PyObject *input, Py_ssize_t i, len; int kind; - void *data; + const void *data; unsigned char prev_combining = 0; /* The two quickcheck bits at this shift have type QuickcheckResult. */ @@ -869,25 +869,25 @@ unicodedata_UCD_is_normalized_impl(PyObject *self, PyObject *form, } PyObject *result; - int nfc = 0; - int k = 0; + bool nfc = false; + bool k = false; QuickcheckResult m; PyObject *cmp; int match = 0; if (_PyUnicode_EqualToASCIIId(form, &PyId_NFC)) { - nfc = 1; + nfc = true; } else if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKC)) { - nfc = 1; - k = 1; + nfc = true; + k = true; } else if (_PyUnicode_EqualToASCIIId(form, &PyId_NFD)) { /* matches default values for `nfc` and `k` */ } else if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKD)) { - k = 1; + k = true; } else { PyErr_SetString(PyExc_ValueError, "invalid normalization form"); @@ -940,28 +940,28 @@ unicodedata_UCD_normalize_impl(PyObject *self, PyObject *form, } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFC)) { - if (is_normalized_quickcheck(self, input, 1, 0, true) == YES) { + if (is_normalized_quickcheck(self, input, true, false, true) == YES) { Py_INCREF(input); return input; } return nfc_nfkc(self, input, 0); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKC)) { - if (is_normalized_quickcheck(self, input, 1, 1, true) == YES) { + if (is_normalized_quickcheck(self, input, true, true, true) == YES) { Py_INCREF(input); return input; } return nfc_nfkc(self, input, 1); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFD)) { - if (is_normalized_quickcheck(self, input, 0, 0, true) == YES) { + if (is_normalized_quickcheck(self, input, false, false, true) == YES) { Py_INCREF(input); return input; } return nfd_nfkd(self, input, 0); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKD)) { - if (is_normalized_quickcheck(self, input, 0, 1, true) == YES) { + if (is_normalized_quickcheck(self, input, false, true, true) == YES) { Py_INCREF(input); return input; } @@ -987,7 +987,7 @@ _gethash(const char *s, int len, int scale) unsigned long h = 0; unsigned long ix; for (i = 0; i < len; i++) { - h = (h * scale) + (unsigned char) Py_TOUPPER(Py_CHARMASK(s[i])); + h = (h * scale) + (unsigned char) Py_TOUPPER(s[i]); ix = h & 0xff000000; if (ix) h = (h ^ ((ix>>24) & 0xff)) & 0x00ffffff; @@ -1031,13 +1031,14 @@ static int is_unified_ideograph(Py_UCS4 code) { return - (0x3400 <= code && code <= 0x4DB5) || /* CJK Ideograph Extension A */ - (0x4E00 <= code && code <= 0x9FEF) || /* CJK Ideograph */ - (0x20000 <= code && code <= 0x2A6D6) || /* CJK Ideograph Extension B */ + (0x3400 <= code && code <= 0x4DBF) || /* CJK Ideograph Extension A */ + (0x4E00 <= code && code <= 0x9FFC) || /* CJK Ideograph */ + (0x20000 <= code && code <= 0x2A6DD) || /* CJK Ideograph Extension B */ (0x2A700 <= code && code <= 0x2B734) || /* CJK Ideograph Extension C */ (0x2B740 <= code && code <= 0x2B81D) || /* CJK Ideograph Extension D */ (0x2B820 <= code && code <= 0x2CEA1) || /* CJK Ideograph Extension E */ - (0x2CEB0 <= code && code <= 0x2EBEF); /* CJK Ideograph Extension F */ + (0x2CEB0 <= code && code <= 0x2EBE0) || /* CJK Ideograph Extension F */ + (0x30000 <= code && code <= 0x3134A); /* CJK Ideograph Extension G */ } /* macros used to determine if the given code point is in the PUA range that @@ -1157,7 +1158,7 @@ _cmpname(PyObject *self, int code, const char* name, int namelen) if (!_getucname(self, code, buffer, NAME_MAXLEN, 1)) return 0; for (i = 0; i < namelen; i++) { - if (Py_TOUPPER(Py_CHARMASK(name[i])) != buffer[i]) + if (Py_TOUPPER(name[i]) != buffer[i]) return 0; } return buffer[namelen] == '\0'; @@ -1455,7 +1456,7 @@ PyInit_unicodedata(void) { PyObject *m, *v; - Py_TYPE(&UCD_Type) = &PyType_Type; + Py_SET_TYPE(&UCD_Type, &PyType_Type); m = PyModule_Create(&unicodedatamodule); if (!m) diff --git a/Modules/unicodedata_db.h b/Modules/unicodedata_db.h index 286287d0..da938761 100644 --- a/Modules/unicodedata_db.h +++ b/Modules/unicodedata_db.h @@ -1,6 +1,6 @@ /* this file was generated by Tools/unicode/makeunicodedata.py 3.3 */ -#define UNIDATA_VERSION "12.1.0" +#define UNIDATA_VERSION "13.0.0" /* a list of unique database records */ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {0, 0, 0, 0, 0, 0}, @@ -335,6 +335,8 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {9, 0, 12, 0, 5, 0}, {9, 0, 5, 0, 5, 0}, {4, 9, 1, 0, 5, 0}, + {4, 0, 14, 0, 2, 0}, + {5, 6, 1, 0, 2, 0}, {30, 0, 1, 0, 5, 170}, {5, 216, 1, 0, 5, 0}, {5, 226, 1, 0, 5, 0}, @@ -346,8 +348,8 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { }; /* Reindexing of NFC first characters. */ -#define TOTAL_FIRST 376 -#define TOTAL_LAST 62 +#define TOTAL_FIRST 377 +#define TOTAL_LAST 63 struct reindex{int start;short count,index;}; static struct reindex nfc_first[] = { { 60, 2, 0}, @@ -560,6 +562,7 @@ static struct reindex nfc_first[] = { { 70471, 0, 372}, { 70841, 0, 373}, { 71096, 1, 374}, + { 71989, 0, 376}, {0,0,0} }; @@ -603,6 +606,7 @@ static struct reindex nfc_last[] = { { 70842, 0, 59}, { 70845, 0, 60}, { 71087, 0, 61}, + { 71984, 0, 62}, {0,0,0} }; @@ -736,40 +740,40 @@ static const unsigned short index1[] = { 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 138, 41, 41, 145, 138, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 138, 157, 138, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 138, 167, 168, 138, 169, 170, 171, 172, - 138, 173, 174, 138, 175, 176, 177, 138, 138, 178, 179, 180, 181, 138, - 182, 138, 183, 41, 41, 41, 41, 41, 41, 41, 184, 185, 41, 186, 138, 138, + 149, 150, 151, 152, 153, 154, 155, 156, 138, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 138, 168, 169, 138, 170, 171, 172, 173, + 138, 174, 175, 176, 177, 178, 179, 138, 138, 180, 181, 182, 183, 138, + 184, 138, 185, 41, 41, 41, 41, 41, 41, 41, 186, 187, 41, 188, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 41, 41, 41, 41, 41, 41, 41, 41, 187, 138, 138, + 138, 138, 138, 138, 138, 41, 41, 41, 41, 41, 41, 41, 41, 189, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 41, 41, 41, 41, 188, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 41, 41, 41, 41, 190, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 41, 41, 41, 41, 189, 190, 191, 192, 138, 138, 138, 138, 193, - 194, 195, 196, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 138, 138, 41, 41, 41, 41, 191, 192, 193, 194, 138, 138, 138, 138, 195, + 196, 197, 198, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 197, 101, 101, 101, 101, 101, - 198, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 101, 101, 101, 101, 101, 101, 101, 101, 199, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 200, 201, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 101, 101, 199, 101, 101, 200, 138, 138, 138, + 138, 138, 138, 138, 138, 101, 101, 202, 101, 101, 203, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 201, 202, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 204, 205, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 78, 203, - 204, 205, 206, 207, 208, 138, 209, 210, 211, 212, 213, 214, 215, 216, 78, - 78, 78, 78, 217, 218, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 219, 138, 220, 138, 138, 221, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 222, 223, 224, 138, 138, 138, 138, 138, 225, 226, 227, 138, - 228, 229, 138, 138, 230, 231, 232, 233, 234, 138, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 78, 206, + 207, 208, 209, 210, 211, 138, 212, 213, 214, 215, 216, 217, 218, 219, 78, + 78, 78, 78, 220, 221, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 222, 138, 223, 138, 138, 224, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 225, 226, 227, 138, 138, 138, 138, 138, 228, 229, 230, 138, + 231, 232, 138, 138, 233, 234, 235, 236, 237, 138, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 138, 138, 138, 138, 138, 138, 138, 138, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, @@ -794,22 +798,22 @@ static const unsigned short index1[] = { 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 251, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 256, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 252, 101, 253, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 257, 101, 258, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 254, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 259, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 255, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 122, 122, 122, 122, 256, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 101, 101, 101, 260, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 122, 122, 122, 122, 261, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 262, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, @@ -1209,7 +1213,7 @@ static const unsigned short index1[] = { 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 257, 138, 258, 259, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 263, 138, 264, 265, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, @@ -1282,7 +1286,7 @@ static const unsigned short index1[] = { 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 260, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 266, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, @@ -1319,7 +1323,7 @@ static const unsigned short index1[] = { 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 260, + 121, 266, }; static const unsigned short index2[] = { @@ -1452,172 +1456,171 @@ static const unsigned short index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 0, 118, 118, 118, 118, 118, 118, 118, 118, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 108, 86, 81, 81, 86, 81, 81, 86, 81, 81, 81, - 86, 86, 86, 121, 122, 123, 81, 81, 81, 86, 81, 81, 86, 86, 81, 81, 81, - 81, 81, 135, 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 141, 48, 48, 48, 48, 48, 48, 48, 141, 48, - 48, 141, 48, 48, 48, 48, 48, 135, 140, 142, 48, 140, 140, 140, 135, 135, - 135, 135, 135, 135, 135, 135, 140, 140, 140, 140, 143, 140, 140, 48, 81, - 86, 81, 81, 135, 135, 135, 144, 144, 144, 144, 144, 144, 144, 144, 48, - 48, 135, 135, 83, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 83, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, - 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 0, 0, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 0, 0, 48, 48, 48, 48, 0, - 0, 146, 48, 147, 140, 140, 135, 135, 135, 135, 0, 0, 140, 140, 0, 0, 148, - 148, 143, 48, 0, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 144, 144, 0, 144, - 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 48, 48, 85, 85, 149, 149, 149, 149, 149, 149, 80, 85, 48, 83, 81, 0, 0, - 135, 135, 140, 0, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 0, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 144, 0, 48, 144, 0, 48, - 48, 0, 0, 146, 0, 140, 140, 140, 135, 135, 0, 0, 0, 0, 135, 135, 0, 0, - 135, 135, 143, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 48, 0, - 144, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 135, 135, 48, 48, 48, 135, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 135, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, - 48, 0, 0, 146, 48, 140, 140, 140, 135, 135, 135, 135, 135, 0, 135, 135, - 140, 0, 140, 140, 143, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 83, 85, 0, 0, 0, 0, 0, 0, 0, 48, 135, 135, 135, 135, 135, 135, - 0, 135, 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, - 48, 48, 0, 0, 146, 48, 147, 135, 140, 135, 135, 135, 135, 0, 0, 140, 148, - 0, 0, 148, 148, 143, 0, 0, 0, 0, 0, 0, 0, 0, 150, 147, 0, 0, 0, 0, 144, - 144, 0, 48, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 80, 48, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 135, 48, 0, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 0, 48, - 48, 141, 48, 0, 0, 0, 48, 48, 0, 48, 0, 48, 48, 0, 0, 0, 48, 48, 0, 0, 0, - 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, - 0, 0, 0, 147, 140, 135, 140, 140, 0, 0, 0, 140, 140, 140, 0, 148, 148, - 148, 143, 0, 0, 48, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, - 149, 26, 26, 26, 26, 26, 26, 85, 26, 0, 0, 0, 0, 0, 135, 140, 140, 140, - 135, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, - 0, 0, 48, 135, 135, 135, 140, 140, 140, 140, 0, 135, 135, 151, 0, 135, - 135, 135, 143, 0, 0, 0, 0, 0, 0, 0, 152, 153, 0, 48, 48, 48, 0, 0, 0, 0, - 0, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 0, 0, 0, 0, 0, 0, 0, 83, 154, 154, 154, 154, 154, 154, 154, 80, 48, - 135, 140, 140, 83, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, - 48, 48, 0, 0, 146, 48, 140, 155, 148, 140, 147, 140, 140, 0, 155, 148, - 148, 0, 148, 148, 135, 143, 0, 0, 0, 0, 0, 0, 0, 147, 147, 0, 0, 0, 0, 0, - 0, 0, 48, 0, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 135, 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 143, 143, 48, 147, 140, 140, 135, 135, 135, 135, 0, 140, - 140, 140, 0, 148, 148, 148, 143, 48, 80, 0, 0, 0, 0, 48, 48, 48, 147, - 149, 149, 149, 149, 149, 149, 149, 48, 48, 48, 135, 135, 0, 0, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 80, 48, 48, 48, 48, 48, 48, 0, 0, 140, 140, 0, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 156, 0, 0, 0, 0, 147, 140, 140, 135, - 135, 135, 0, 135, 0, 140, 140, 148, 140, 148, 148, 148, 147, 0, 0, 0, 0, - 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 140, 140, - 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 135, 48, 157, 135, 135, 135, 135, 158, 158, 143, 0, 0, 0, - 0, 85, 48, 48, 48, 48, 48, 48, 53, 135, 159, 159, 159, 159, 135, 135, - 135, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 83, 83, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 48, 0, 48, 48, 48, 48, 48, 0, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 135, 48, 157, 135, 135, 135, 135, 160, 160, 143, 135, 135, 48, 0, 0, 48, - 48, 48, 48, 48, 0, 53, 0, 161, 161, 161, 161, 135, 135, 0, 0, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 157, 157, 48, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 48, 80, 80, 80, 83, 83, 83, 83, 83, 83, 83, 83, 162, 83, - 83, 83, 83, 83, 83, 80, 83, 80, 80, 80, 86, 86, 80, 80, 80, 80, 80, 80, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 80, 86, 80, 86, 80, 163, 164, 165, 164, - 165, 140, 140, 48, 48, 48, 144, 48, 48, 48, 48, 0, 48, 48, 48, 48, 144, + 118, 118, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 108, 86, 81, 81, 86, + 81, 81, 86, 81, 81, 81, 86, 86, 86, 121, 122, 123, 81, 81, 81, 86, 81, + 81, 86, 86, 81, 81, 81, 81, 81, 135, 135, 135, 140, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 141, 48, 48, 48, + 48, 48, 48, 48, 141, 48, 48, 141, 48, 48, 48, 48, 48, 135, 140, 142, 48, + 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 140, 140, 140, + 140, 143, 140, 140, 48, 81, 86, 81, 81, 135, 135, 135, 144, 144, 144, + 144, 144, 144, 144, 144, 48, 48, 135, 135, 83, 83, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 83, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 135, 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, + 0, 0, 0, 48, 48, 48, 48, 0, 0, 146, 48, 147, 140, 140, 135, 135, 135, + 135, 0, 0, 140, 140, 0, 0, 148, 148, 143, 48, 0, 0, 0, 0, 0, 0, 0, 0, + 147, 0, 0, 0, 0, 144, 144, 0, 144, 48, 48, 135, 135, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 48, 48, 85, 85, 149, 149, 149, 149, + 149, 149, 80, 85, 48, 83, 81, 0, 0, 135, 135, 140, 0, 48, 48, 48, 48, 48, + 48, 0, 0, 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 144, 0, 48, 144, 0, 48, 48, 0, 0, 146, 0, 140, 140, 140, 135, + 135, 0, 0, 0, 0, 135, 135, 0, 0, 135, 135, 143, 0, 0, 0, 135, 0, 0, 0, 0, + 0, 0, 0, 144, 144, 144, 48, 0, 144, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 135, 135, 48, 48, 48, 135, 83, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, + 48, 0, 48, 48, 48, 48, 48, 0, 0, 146, 48, 140, 140, 140, 135, 135, 135, + 135, 135, 0, 135, 135, 140, 0, 140, 140, 143, 0, 0, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 83, 85, 0, 0, 0, 0, 0, 0, 0, 48, 135, 135, + 135, 135, 135, 135, 0, 135, 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, + 48, 0, 48, 48, 48, 48, 48, 0, 0, 146, 48, 147, 135, 140, 135, 135, 135, + 135, 0, 0, 140, 148, 0, 0, 148, 148, 143, 0, 0, 0, 0, 0, 0, 0, 135, 150, + 147, 0, 0, 0, 0, 144, 144, 0, 48, 48, 48, 135, 135, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 80, 48, 149, 149, 149, 149, 149, 149, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 48, 0, 48, 48, 48, 48, 48, 48, 0, 0, + 0, 48, 48, 48, 0, 48, 48, 141, 48, 0, 0, 0, 48, 48, 0, 48, 0, 48, 48, 0, + 0, 0, 48, 48, 0, 0, 0, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 0, 0, 0, 0, 147, 140, 135, 140, 140, 0, 0, 0, 140, + 140, 140, 0, 148, 148, 148, 143, 0, 0, 48, 0, 0, 0, 0, 0, 0, 147, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 149, 149, 149, 26, 26, 26, 26, 26, 26, 85, 26, 0, 0, 0, 0, + 0, 135, 140, 140, 140, 135, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, + 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 135, 135, 135, 140, 140, 140, 140, + 0, 135, 135, 151, 0, 135, 135, 135, 143, 0, 0, 0, 0, 0, 0, 0, 152, 153, + 0, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 83, 154, 154, 154, + 154, 154, 154, 154, 80, 48, 135, 140, 140, 83, 48, 48, 48, 48, 48, 48, + 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 0, 0, 146, 48, 140, 155, 148, 140, + 147, 140, 140, 0, 155, 148, 148, 0, 148, 148, 135, 143, 0, 0, 0, 0, 0, 0, + 0, 147, 147, 0, 0, 0, 0, 0, 0, 0, 48, 0, 48, 48, 135, 135, 0, 0, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 48, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 135, 135, 140, 140, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 143, 143, 48, 147, 140, 140, 135, + 135, 135, 135, 0, 140, 140, 140, 0, 148, 148, 148, 143, 48, 80, 0, 0, 0, + 0, 48, 48, 48, 147, 149, 149, 149, 149, 149, 149, 149, 48, 48, 48, 135, + 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 80, 48, 48, 48, 48, 48, 48, 0, 135, + 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 156, 0, 0, + 0, 0, 147, 140, 140, 135, 135, 135, 0, 135, 0, 140, 140, 148, 140, 148, + 148, 148, 147, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 0, 0, 140, 140, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 48, 157, 135, 135, 135, 135, + 158, 158, 143, 0, 0, 0, 0, 85, 48, 48, 48, 48, 48, 48, 53, 135, 159, 159, + 159, 159, 135, 135, 135, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 48, 0, 48, + 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 135, 48, 157, 135, 135, 135, 135, 160, 160, 143, 135, + 135, 48, 0, 0, 48, 48, 48, 48, 48, 0, 53, 0, 161, 161, 161, 161, 135, + 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 157, + 157, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 80, 80, 80, 83, 83, 83, 83, 83, + 83, 83, 83, 162, 83, 83, 83, 83, 83, 83, 80, 83, 80, 80, 80, 86, 86, 80, + 80, 80, 80, 80, 80, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 80, 86, 80, 86, 80, + 163, 164, 165, 164, 165, 140, 140, 48, 48, 48, 144, 48, 48, 48, 48, 0, 48, 48, 48, 48, 144, 48, 48, 48, 48, 144, 48, 48, 48, 48, 144, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 144, 48, 48, 48, 0, 0, 0, 0, 166, - 167, 168, 169, 168, 168, 170, 168, 170, 167, 167, 167, 167, 135, 140, - 167, 168, 81, 81, 143, 83, 81, 81, 48, 48, 48, 48, 48, 135, 135, 135, - 135, 135, 135, 168, 135, 135, 135, 135, 0, 135, 135, 135, 135, 168, 135, - 135, 135, 135, 168, 135, 135, 135, 135, 168, 135, 135, 135, 135, 168, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 168, 135, - 135, 135, 0, 80, 80, 80, 80, 80, 80, 80, 80, 86, 80, 80, 80, 80, 80, 80, - 0, 80, 80, 83, 83, 83, 83, 83, 80, 80, 80, 80, 83, 83, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 141, 48, 48, 48, 48, 140, 140, 135, 150, 135, - 135, 140, 135, 135, 135, 135, 135, 146, 140, 143, 143, 140, 140, 135, - 135, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 83, 83, 83, - 83, 83, 83, 48, 48, 48, 48, 48, 48, 140, 140, 135, 135, 48, 48, 48, 48, - 135, 135, 135, 48, 140, 140, 140, 48, 48, 140, 140, 140, 140, 140, 140, - 140, 48, 48, 48, 135, 135, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 135, 140, 140, 135, 135, 140, 140, 140, 140, 140, 140, - 86, 48, 140, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 140, 140, - 140, 135, 80, 80, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 48, 48, 144, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 144, 48, 48, + 48, 0, 0, 0, 0, 166, 167, 168, 169, 168, 168, 170, 168, 170, 167, 167, + 167, 167, 135, 140, 167, 168, 81, 81, 143, 83, 81, 81, 48, 48, 48, 48, + 48, 135, 135, 135, 135, 135, 135, 168, 135, 135, 135, 135, 0, 135, 135, + 135, 135, 168, 135, 135, 135, 135, 168, 135, 135, 135, 135, 168, 135, + 135, 135, 135, 168, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 168, 135, 135, 135, 0, 80, 80, 80, 80, 80, 80, 80, 80, 86, 80, + 80, 80, 80, 80, 80, 0, 80, 80, 83, 83, 83, 83, 83, 80, 80, 80, 80, 83, + 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 141, 48, 48, 48, 48, 140, + 140, 135, 150, 135, 135, 140, 135, 135, 135, 135, 135, 146, 140, 143, + 143, 140, 140, 135, 135, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 83, 83, 83, 83, 83, 83, 48, 48, 48, 48, 48, 48, 140, 140, 135, 135, + 48, 48, 48, 48, 135, 135, 135, 48, 140, 140, 140, 48, 48, 140, 140, 140, + 140, 140, 140, 140, 48, 48, 48, 135, 135, 135, 135, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 135, 140, 140, 135, 135, 140, 140, 140, + 140, 140, 140, 86, 48, 140, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 140, 140, 140, 135, 80, 80, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 0, 44, 0, 0, 0, 0, 0, 44, 0, 0, 47, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 44, 0, 0, 0, 0, 0, 44, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 83, 51, 47, 47, 47, 171, 171, 171, 171, 171, 171, 171, 171, + 47, 47, 47, 47, 47, 47, 47, 83, 51, 47, 47, 47, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 48, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 48, 48, 48, 48, + 171, 171, 171, 171, 171, 171, 171, 48, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 172, 172, 172, 172, 172, 172, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, - 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, - 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, + 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, - 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, - 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, + 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 81, 81, - 81, 83, 83, 83, 83, 83, 83, 83, 83, 83, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, + 81, 81, 81, 83, 83, 83, 83, 83, 83, 83, 83, 83, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 47, 47, 47, 47, 47, 47, 0, 0, - 84, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 47, 47, 47, 47, 47, 47, + 0, 0, 84, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -1636,45 +1639,46 @@ static const unsigned short index2[] = { 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 80, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 173, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 164, 165, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 80, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 173, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 164, 165, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 83, 83, 83, 174, 174, 174, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 48, 48, 48, 48, 135, 135, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 135, 135, 143, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 0, 48, 48, 48, 0, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 83, 83, 83, 174, 174, 174, 48, 48, 48, 48, 48, 48, + 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 0, 48, 48, 48, 48, 135, 135, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 135, 135, 143, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 0, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 140, - 135, 135, 135, 135, 135, 135, 135, 140, 140, 140, 140, 140, 140, 140, - 140, 135, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 135, 143, - 135, 83, 83, 83, 53, 83, 83, 83, 85, 48, 81, 0, 0, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, - 84, 138, 138, 138, 138, 135, 135, 135, 175, 0, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, + 140, 135, 135, 135, 135, 135, 135, 135, 140, 140, 140, 140, 140, 140, + 140, 140, 135, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 143, 135, 83, 83, 83, 53, 83, 83, 83, 85, 48, 81, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, + 138, 84, 138, 138, 138, 138, 135, 135, 135, 175, 0, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, - 48, 48, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 88, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 88, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 0, 135, 135, 135, 140, 140, 140, 140, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 135, 135, 135, 140, 140, 140, 140, 135, 135, 140, 140, 140, 0, 0, 0, 0, 140, 140, 135, 140, 140, 140, 140, 140, 140, 87, 81, 86, 0, 0, 0, 0, 26, 0, 0, 0, 138, 138, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -1698,37 +1702,37 @@ static const unsigned short index2[] = { 145, 145, 145, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, 83, 53, 83, 83, 83, 83, 83, 83, 0, 0, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 81, 81, 86, - 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 82, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, - 140, 48, 141, 48, 141, 48, 141, 48, 141, 48, 141, 48, 48, 48, 141, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, + 135, 140, 48, 141, 48, 141, 48, 141, 48, 141, 48, 141, 48, 48, 48, 141, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 146, 147, 135, - 135, 135, 135, 135, 148, 135, 148, 140, 140, 148, 148, 135, 148, 176, 48, - 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 81, 86, 81, 81, 81, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 0, 0, 0, 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 146, 147, + 135, 135, 135, 135, 135, 148, 135, 148, 140, 140, 148, 148, 135, 148, + 176, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 81, 86, 81, 81, 81, 81, 81, 81, 81, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 0, 0, 0, 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 140, 135, 135, 135, 135, 140, 140, 135, 135, 176, 143, 135, - 135, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, + 48, 48, 48, 48, 48, 140, 135, 135, 135, 135, 140, 140, 135, 135, 176, + 143, 135, 135, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 146, 140, 135, 135, 140, 140, 140, 135, 140, 135, - 135, 135, 176, 176, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 146, 140, 135, 135, 140, 140, 140, 135, + 140, 135, 135, 135, 176, 176, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, - 140, 140, 140, 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, - 140, 140, 135, 146, 0, 0, 0, 83, 83, 83, 83, 83, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 0, 0, 0, 48, 48, 48, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, + 140, 140, 140, 140, 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, + 135, 140, 140, 135, 146, 0, 0, 0, 83, 83, 83, 83, 83, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 48, 48, 48, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 53, 53, 53, 53, 53, 53, 83, 83, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, - 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 48, 53, 53, 53, 53, 53, 53, 83, 83, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 44, 44, 44, 83, 83, 83, - 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 83, 177, 86, 86, - 86, 86, 86, 81, 81, 86, 86, 86, 86, 81, 140, 177, 177, 177, 177, 177, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 44, 44, 44, 83, 83, + 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 83, 177, 86, + 86, 86, 86, 86, 81, 81, 86, 86, 86, 86, 81, 140, 177, 177, 177, 177, 177, 177, 177, 48, 48, 48, 48, 86, 48, 48, 48, 48, 48, 48, 81, 48, 48, 140, 81, 81, 48, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, @@ -1941,33 +1945,33 @@ static const unsigned short index2[] = { 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 248, 26, 44, 44, 44, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 248, 26, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 0, 44, 47, 44, 44, 44, 47, 47, 44, 47, 44, 47, 44, 47, 44, 44, - 44, 44, 47, 44, 47, 47, 44, 47, 47, 47, 47, 47, 47, 51, 51, 44, 44, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 47, 26, 26, 26, 26, 26, 26, 44, 47, - 44, 47, 81, 81, 81, 44, 47, 0, 0, 0, 0, 0, 138, 138, 138, 138, 154, 138, - 138, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 0, 44, 47, 44, 44, 44, 47, 47, 44, 47, 44, 47, 44, 47, 44, + 44, 44, 44, 47, 44, 47, 47, 44, 47, 47, 47, 47, 47, 47, 51, 51, 44, 44, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 47, 26, 26, 26, 26, 26, 26, 44, + 47, 44, 47, 81, 81, 81, 44, 47, 0, 0, 0, 0, 0, 138, 138, 138, 138, 154, + 138, 138, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 0, 47, 0, 0, 0, 0, 0, 47, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 47, 47, 47, 47, 0, 47, 0, 0, 0, 0, 0, 47, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, - 51, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, + 0, 51, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, @@ -1979,9 +1983,9 @@ static const unsigned short index2[] = { 138, 84, 138, 138, 84, 138, 28, 36, 138, 138, 28, 36, 164, 165, 164, 165, 164, 165, 164, 165, 138, 138, 138, 138, 138, 52, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 84, 84, 138, 138, 138, 138, 84, 138, 197, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 26, 26, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 241, 241, 241, 241, 249, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, @@ -2039,26 +2043,27 @@ static const unsigned short index2[] = { 269, 0, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 171, 171, 171, 171, 171, 171, 171, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 272, 272, 272, 272, 272, 272, 272, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 0, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 0, 271, 271, 271, 271, - 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 273, 273, 273, + 273, 273, 273, 273, 273, 249, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 273, 273, 273, 273, 273, 273, - 273, 273, 249, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 249, 249, 249, 270, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 249, 249, 249, 270, 271, 271, 271, 271, 271, 271, - 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, @@ -2069,17 +2074,17 @@ static const unsigned short index2[] = { 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 249, + 272, 272, 249, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2092,11 +2097,11 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 171, + 26, 26, 26, 26, 26, 26, 26, 26, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2104,10 +2109,9 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 252, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 252, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2115,44 +2119,45 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 241, 241, 241, 241, 241, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 53, 53, 53, 53, 53, 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 53, 138, 138, 138, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 48, 53, 53, 53, 53, 53, 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 53, 138, 138, 138, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 48, 81, 82, 82, 82, 138, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 138, 52, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 48, 81, 82, 82, 82, 138, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 138, 52, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 51, 51, 81, 81, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 47, 51, 51, 81, 81, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 81, - 81, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 54, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 47, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 48, 48, 48, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 81, 81, 83, + 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 54, 54, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 47, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 51, - 47, 47, 47, 47, 47, 47, 47, 47, 44, 47, 44, 47, 44, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 52, 275, 275, 44, 47, 44, 47, 48, 44, 47, 44, 47, 47, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 51, 47, 47, + 47, 47, 47, 47, 47, 47, 44, 47, 44, 47, 44, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 52, 275, 275, 44, 47, 44, 47, 48, 44, 47, 44, 47, 47, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 44, 44, 44, 44, 47, 44, 44, 44, 44, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 0, 0, 44, 47, 44, 44, 44, 0, 0, 0, 0, 0, 0, + 47, 44, 44, 44, 44, 44, 47, 44, 44, 44, 44, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 0, 0, 44, 47, 44, 44, 44, 44, 47, 44, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 51, 51, 47, 48, - 48, 48, 48, 48, 48, 48, 135, 48, 48, 48, 143, 48, 48, 48, 48, 135, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 47, 48, 51, 51, 47, 48, 48, + 48, 48, 48, 48, 48, 135, 48, 48, 48, 143, 48, 48, 48, 48, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 140, 140, 135, 135, 140, 26, 26, 26, 26, 0, 0, 0, 0, 149, + 48, 48, 48, 140, 140, 135, 135, 140, 26, 26, 26, 26, 143, 0, 0, 0, 149, 149, 149, 149, 149, 149, 80, 80, 85, 227, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -2199,15 +2204,15 @@ static const unsigned short index2[] = { 48, 48, 48, 48, 48, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 275, 51, 51, 51, 51, - 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 54, 54, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 140, 140, 135, 140, 140, 135, 140, 140, 83, 140, 143, 0, 0, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 265, + 48, 48, 48, 48, 140, 140, 135, 140, 140, 135, 140, 140, 83, 140, 143, 0, + 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, @@ -2219,12 +2224,12 @@ static const unsigned short index2[] = { 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 0, 0, 0, 276, 276, 276, 276, 276, 276, 276, 276, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, @@ -2233,7 +2238,7 @@ static const unsigned short index2[] = { 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, @@ -2242,7 +2247,7 @@ static const unsigned short index2[] = { 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 278, 278, 278, 278, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, @@ -2252,14 +2257,14 @@ static const unsigned short index2[] = { 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 171, 171, - 278, 171, 278, 171, 171, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 171, 278, 171, 278, 171, 171, 278, 278, 171, 171, 171, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 171, + 171, 278, 171, 278, 171, 171, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 171, 278, 171, 278, 171, 171, 278, 278, 171, 171, 171, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 0, 0, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 0, 0, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, @@ -2267,22 +2272,22 @@ static const unsigned short index2[] = { 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, - 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, - 35, 0, 0, 0, 0, 0, 279, 280, 279, 281, 281, 281, 281, 281, 281, 281, 281, - 281, 217, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, - 279, 0, 279, 279, 279, 279, 279, 0, 279, 0, 279, 279, 0, 279, 279, 0, - 279, 279, 279, 279, 279, 279, 279, 279, 279, 281, 131, 131, 131, 131, + 278, 278, 278, 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, + 35, 35, 35, 0, 0, 0, 0, 0, 279, 280, 279, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 217, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 0, 279, 279, 279, 279, 279, 0, 279, 0, 279, 279, 0, 279, + 279, 0, 279, 279, 279, 279, 279, 279, 279, 279, 279, 281, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, @@ -2299,8 +2304,8 @@ static const unsigned short index2[] = { 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 283, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 283, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, @@ -2369,9 +2374,9 @@ static const unsigned short index2[] = { 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 154, 154, 154, 154, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 154, 154, 26, 80, 80, 0, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2520,188 +2525,202 @@ static const unsigned short index2[] = { 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 325, 325, 325, 325, 325, 325, - 325, 325, 325, 325, 107, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 86, 86, 81, 81, 81, 86, 81, 86, 86, 86, 86, 330, 330, 330, - 330, 113, 113, 113, 113, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 0, 81, 81, 102, 0, 0, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 107, 0, + 0, 0, 0, 0, 0, 0, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 86, 86, 81, + 81, 81, 86, 81, 86, 86, 86, 86, 330, 330, 330, 330, 113, 113, 113, 113, + 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 140, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 107, 107, 325, 325, 325, 325, 325, 325, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 135, 140, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 143, 83, 83, 83, 83, 83, 83, 83, + 0, 0, 0, 0, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, + 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 141, 48, 141, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 141, 48, 48, 48, 48, 140, 140, 140, 135, + 135, 135, 135, 140, 140, 143, 142, 83, 83, 190, 83, 83, 83, 83, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 190, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, + 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, + 0, 0, 81, 81, 81, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 143, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 135, 135, 140, 48, 48, 48, 48, + 48, 48, 48, 48, 150, 135, 135, 135, 135, 140, 135, 151, 151, 135, 135, + 135, 143, 143, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 83, + 83, 83, 83, 48, 140, 140, 48, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 141, 48, 141, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 141, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, 135, 140, 140, 143, - 142, 83, 83, 190, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 81, 81, 81, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 146, 83, 83, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 150, 135, - 135, 135, 135, 140, 135, 151, 151, 135, 135, 135, 143, 143, 0, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 83, 83, 83, 83, 48, 140, 140, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 146, 83, 83, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, - 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 135, 140, + 176, 48, 48, 48, 48, 83, 83, 83, 83, 135, 146, 135, 135, 83, 140, 135, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 83, 48, 83, 83, 83, + 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 140, 176, 48, 48, 48, 48, 83, 83, - 83, 83, 135, 146, 135, 135, 83, 0, 0, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 48, 83, 48, 83, 83, 83, 0, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, - 140, 135, 135, 135, 140, 140, 135, 176, 146, 135, 83, 83, 83, 83, 83, 83, - 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, 140, 140, 135, 176, + 146, 135, 83, 83, 83, 83, 83, 83, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, - 48, 48, 0, 48, 0, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 83, 0, - 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 140, - 140, 140, 135, 135, 135, 135, 135, 135, 146, 143, 0, 0, 0, 0, 0, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 135, 135, - 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 0, 0, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, - 0, 146, 146, 48, 147, 140, 135, 140, 140, 140, 140, 0, 0, 140, 140, 0, 0, - 148, 148, 176, 0, 0, 48, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 48, 48, - 48, 48, 48, 140, 140, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 81, 81, - 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 83, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, - 135, 135, 135, 135, 135, 140, 140, 143, 135, 135, 140, 146, 48, 48, 48, - 48, 83, 83, 83, 83, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 0, 83, 0, 83, 81, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 135, 140, 140, 140, 135, 135, 135, 135, 135, 135, + 146, 143, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 0, 0, 0, 0, 0, 0, 135, 135, 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, + 48, 48, 0, 48, 48, 48, 48, 48, 0, 146, 146, 48, 147, 140, 135, 140, 140, + 140, 140, 0, 0, 140, 140, 0, 0, 148, 148, 176, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 147, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 140, 140, 0, 0, 81, 81, 81, + 81, 81, 81, 81, 0, 0, 0, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 147, 140, 140, 135, 135, 135, 135, 135, 135, 140, - 150, 148, 148, 147, 148, 135, 135, 140, 143, 146, 48, 48, 83, 48, 0, 0, - 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, + 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 140, 140, 143, + 135, 135, 140, 146, 48, 48, 48, 48, 83, 83, 83, 83, 83, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 83, 83, 0, 83, 81, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 147, 140, 140, 135, 135, 135, 135, 0, 0, 140, 140, 148, 148, 135, - 135, 140, 143, 146, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 48, 48, 48, 48, 135, 135, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 147, 140, + 140, 135, 135, 135, 135, 135, 135, 140, 150, 148, 148, 147, 148, 135, + 135, 140, 143, 146, 48, 48, 83, 48, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 147, 140, 140, 135, + 135, 135, 135, 0, 0, 140, 140, 148, 148, 135, 135, 140, 143, 146, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 48, 48, 48, 48, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 140, 140, 135, - 140, 143, 135, 83, 83, 83, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 140, - 135, 140, 140, 135, 135, 135, 135, 135, 135, 176, 146, 48, 0, 0, 0, 0, 0, - 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, + 135, 135, 135, 135, 135, 140, 140, 135, 140, 143, 135, 83, 83, 83, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 135, 140, 135, 140, 140, 135, 135, 135, + 135, 135, 135, 176, 146, 48, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 135, 135, 135, 140, 140, 135, - 135, 135, 135, 140, 135, 135, 135, 135, 143, 0, 0, 0, 0, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 149, 149, 83, 83, 83, 80, 0, 0, 0, 0, + 48, 48, 48, 0, 0, 135, 135, 135, 140, 140, 135, 135, 135, 135, 140, 135, + 135, 135, 135, 143, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 149, 149, 83, 83, 83, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, - 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 135, 140, 143, 146, 83, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 140, 143, 146, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, - 135, 0, 0, 135, 135, 140, 140, 140, 140, 143, 48, 83, 48, 140, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 0, 0, 48, 48, 48, + 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 147, 140, 140, + 140, 140, 140, 0, 140, 148, 0, 0, 135, 135, 176, 143, 48, 140, 48, 140, + 146, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48, 135, 135, 135, 135, 135, 135, 155, 155, 135, 135, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, - 143, 135, 135, 135, 135, 140, 48, 135, 135, 135, 135, 83, 83, 83, 83, 83, - 83, 83, 83, 143, 0, 0, 0, 0, 0, 0, 0, 0, 48, 135, 135, 135, 135, 135, - 135, 140, 140, 135, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 140, 135, - 143, 83, 83, 83, 48, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, + 140, 135, 135, 135, 135, 0, 0, 135, 135, 140, 140, 140, 140, 143, 48, 83, + 48, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 135, 135, 135, 135, 135, 135, 155, 155, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, - 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 135, 143, 135, 135, 135, 135, 140, 48, 135, 135, 135, + 135, 83, 83, 83, 83, 83, 83, 83, 83, 143, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 135, 135, 135, 135, 135, 135, 140, 140, 135, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 135, 135, - 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, 140, 331, 48, - 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 0, 140, 135, 135, 135, 135, 135, 135, 135, 140, 135, - 135, 140, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 140, 135, 143, 83, 83, 83, 48, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 135, 135, 135, 135, 135, 135, 0, 0, 0, 135, 0, 135, 135, 0, 135, 135, - 135, 146, 135, 143, 143, 48, 135, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, - 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 140, 140, 140, 140, 140, 0, 135, 135, 0, 140, 140, 135, 140, 143, 48, 0, - 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 140, 135, 135, 135, 135, 135, 135, 135, 0, 135, 135, 135, + 135, 135, 135, 140, 331, 48, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 0, 0, 0, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 0, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 140, 135, 135, 135, + 135, 135, 135, 135, 140, 135, 135, 140, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 0, 0, 0, 135, + 0, 135, 135, 0, 135, 135, 135, 146, 135, 143, 143, 48, 135, 0, 0, 0, 0, + 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, + 0, 0, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, 0, 135, 135, 0, 140, + 140, 135, 140, 143, 48, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 140, 140, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 26, 26, 26, 26, 26, 26, 26, 26, 85, 85, 85, 85, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, + 135, 140, 140, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 26, 26, 26, 26, 26, 26, + 26, 26, 85, 85, 85, 85, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, @@ -2709,78 +2728,78 @@ static const unsigned short index2[] = { 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 0, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, + 174, 174, 174, 174, 174, 174, 174, 0, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 190, 190, 190, 190, - 190, 190, 190, 190, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 0, 190, 190, 190, 190, 190, 190, 190, 190, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 83, 83, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, + 0, 0, 0, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 177, 177, 177, 177, 177, 83, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, + 177, 177, 177, 177, 177, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 81, - 81, 81, 81, 81, 81, 81, 83, 83, 83, 83, 83, 80, 80, 80, 80, 53, 53, 53, - 53, 83, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 0, 149, 149, 149, 149, 149, 149, 149, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 81, 81, 81, 81, 81, 81, 81, 83, 83, + 83, 83, 83, 80, 80, 80, 80, 53, 53, 53, 53, 83, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 149, 149, + 149, 149, 149, 149, 149, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 0, 0, 0, 135, 48, 140, 140, 140, 140, 140, 140, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, + 0, 135, 48, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, - 135, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0, 0, 0, 0, + 140, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 252, 251, 252, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 252, 252, 251, 252, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 333, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2788,22 +2807,27 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 0, 0, 0, 0, - 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2813,79 +2837,88 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 80, 135, 177, 83, - 175, 175, 175, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 80, 135, 177, 83, 175, 175, 175, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 334, 334, 334, 334, 334, 334, 334, + 335, 335, 177, 177, 177, 80, 80, 80, 336, 335, 335, 335, 335, 335, 175, + 175, 175, 175, 175, 175, 175, 175, 86, 86, 86, 86, 86, 86, 86, 86, 80, + 80, 81, 81, 81, 81, 81, 86, 86, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 332, 332, 332, 332, 332, 332, 332, 333, 333, 177, 177, 177, - 80, 80, 80, 334, 333, 333, 333, 333, 333, 175, 175, 175, 175, 175, 175, - 175, 175, 86, 86, 86, 86, 86, 86, 86, 86, 80, 80, 81, 81, 81, 81, 81, 86, - 86, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 332, 332, 332, 332, 332, - 332, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 334, 334, 334, 334, 334, 334, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 81, 81, - 81, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 81, 81, 81, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, + 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, - 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 49, 0, 49, 49, 0, 0, 49, 0, 0, 49, 49, 0, 0, 49, 49, - 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 0, 35, 0, 35, - 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 0, 49, 49, 0, 0, + 49, 0, 0, 49, 49, 0, 0, 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, + 49, 35, 35, 35, 35, 0, 35, 0, 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 49, 49, 0, 49, 49, 49, 49, 0, 0, 49, 49, 49, 49, + 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 49, 49, 0, 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 0, 49, 0, 0, 0, + 49, 49, 49, 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, - 0, 49, 49, 49, 49, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 0, 49, 49, 49, - 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 0, 49, 49, - 49, 49, 0, 49, 49, 49, 49, 49, 0, 49, 0, 0, 0, 49, 49, 49, 49, 49, 49, - 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, @@ -2895,69 +2928,60 @@ static const unsigned short index2[] = { 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 337, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 337, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 337, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, + 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 337, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 335, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 335, 35, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 337, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, - 35, 35, 35, 49, 35, 0, 0, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 135, + 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 35, 0, 0, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 80, 80, 80, - 80, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 80, 80, 80, 80, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 80, 80, 80, 80, 80, 80, 80, 80, - 135, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 135, 80, 80, - 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 80, + 80, 80, 80, 80, 80, 80, 80, 135, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 135, 80, 80, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, - 81, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 81, 81, 0, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 81, 81, 81, 81, 81, 81, 81, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 81, 81, + 0, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 53, 53, 53, 53, 53, 53, 53, 0, - 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 48, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 53, 53, 53, + 53, 53, 53, 53, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 0, 0, 0, 0, 48, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 81, 81, 81, 81, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 0, 0, 0, 0, 0, 85, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 48, 48, 48, 48, 48, 48, 81, 81, 81, 81, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 0, 0, 0, 0, 0, 85, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, @@ -2971,110 +2995,111 @@ static const unsigned short index2[] = { 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 0, 0, 325, 325, 325, 325, 325, 325, 325, 325, 325, - 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, - 327, 327, 327, 327, 327, 327, 327, 328, 328, 328, 328, 328, 328, 328, + 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 328, 328, 328, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, - 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 81, 81, - 81, 81, 81, 81, 146, 137, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 0, 0, 0, 0, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 328, 328, 328, 81, 81, 81, 81, 81, 81, 146, 137, 0, 0, 0, 0, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 0, 0, 0, 0, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 330, 330, 330, 330, 330, 330, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 133, 330, 330, 330, - 111, 330, 330, 330, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 330, 133, 330, 330, 330, 111, 330, 330, 330, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 330, 330, 330, 330, 330, 330, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 133, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 330, 133, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 330, 330, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 0, 131, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, + 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, - 0, 131, 0, 0, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 0, 131, 131, 131, 131, 0, 131, 0, 131, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, - 131, 0, 131, 0, 131, 0, 131, 131, 131, 0, 131, 131, 0, 131, 0, 0, 131, 0, - 131, 0, 131, 0, 131, 0, 131, 0, 131, 131, 0, 131, 0, 0, 131, 131, 131, - 131, 0, 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, - 131, 131, 131, 0, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 0, 0, 0, 0, 0, 131, 131, 131, 0, 131, 131, 131, 131, - 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, + 131, 131, 0, 131, 131, 0, 131, 0, 0, 131, 0, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, 0, 131, 0, 0, 0, + 0, 0, 0, 131, 0, 0, 0, 0, 131, 0, 131, 0, 131, 0, 131, 131, 131, 0, 131, + 131, 0, 131, 0, 0, 131, 0, 131, 0, 131, 0, 131, 0, 131, 0, 131, 131, 0, + 131, 0, 0, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 0, + 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, 0, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 131, 131, + 131, 0, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, + 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 241, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 154, 154, 0, 0, 0, 244, 244, 244, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 154, 154, + 26, 26, 26, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 337, 26, + 244, 244, 244, 244, 339, 26, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 224, 224, 224, 0, 0, 0, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 270, 338, 244, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 272, 272, 272, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 224, 224, 224, 26, 26, 26, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 270, 340, 244, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 272, 272, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 0, 0, 0, 0, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 0, 0, 0, 0, 0, 0, 0, 272, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 0, 0, 0, 0, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 0, 0, 0, 0, 0, 0, 0, 272, + 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, + 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 241, 241, - 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 26, 26, 26, 241, 26, 26, 26, 241, 241, 241, 339, 339, 339, 339, 339, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, + 26, 26, 26, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 26, 26, 26, 241, 26, 26, 26, 241, 241, 241, 341, + 341, 341, 341, 341, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 26, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, @@ -3087,116 +3112,130 @@ static const unsigned short index2[] = { 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, - 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 241, 241, 241, 26, 26, - 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 241, 241, 0, 0, 0, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, - 241, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 241, 26, 26, + 26, 241, 241, 241, 26, 26, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 0, 0, 0, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, - 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 0, 241, 241, 241, 241, 241, 241, 241, 241, + 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 241, 241, 241, 241, 0, 0, - 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, - 241, 241, 241, 241, 241, 241, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 0, 0, 241, 241, 241, 241, 0, 0, 0, 0, 241, 241, 241, 0, 0, 0, - 0, 0, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, - 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, + 0, 241, 241, 241, 241, 241, 0, 0, 0, 241, 241, 241, 0, 0, 0, 0, 0, 241, + 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 241, 241, + 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -3204,9 +3243,9 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -3217,23 +3256,31 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 0, 0, 0, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, @@ -3246,8 +3293,8 @@ static const unsigned short index2[] = { 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, @@ -3256,7 +3303,7 @@ static const unsigned short index2[] = { 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 0, 0, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 0, 0, }; /* decomposition data */ @@ -3744,375 +3791,355 @@ static const unsigned int decomp_data[] = { 50, 52, 26085, 770, 50, 53, 26085, 770, 50, 54, 26085, 770, 50, 55, 26085, 770, 50, 56, 26085, 770, 50, 57, 26085, 770, 51, 48, 26085, 770, 51, 49, 26085, 778, 103, 97, 108, 259, 1098, 259, 1100, 259, 42863, 259, - 294, 259, 339, 259, 42791, 259, 43831, 259, 619, 259, 43858, 256, 35912, - 256, 26356, 256, 36554, 256, 36040, 256, 28369, 256, 20018, 256, 21477, - 256, 40860, 256, 40860, 256, 22865, 256, 37329, 256, 21895, 256, 22856, - 256, 25078, 256, 30313, 256, 32645, 256, 34367, 256, 34746, 256, 35064, - 256, 37007, 256, 27138, 256, 27931, 256, 28889, 256, 29662, 256, 33853, - 256, 37226, 256, 39409, 256, 20098, 256, 21365, 256, 27396, 256, 29211, - 256, 34349, 256, 40478, 256, 23888, 256, 28651, 256, 34253, 256, 35172, - 256, 25289, 256, 33240, 256, 34847, 256, 24266, 256, 26391, 256, 28010, - 256, 29436, 256, 37070, 256, 20358, 256, 20919, 256, 21214, 256, 25796, - 256, 27347, 256, 29200, 256, 30439, 256, 32769, 256, 34310, 256, 34396, - 256, 36335, 256, 38706, 256, 39791, 256, 40442, 256, 30860, 256, 31103, - 256, 32160, 256, 33737, 256, 37636, 256, 40575, 256, 35542, 256, 22751, - 256, 24324, 256, 31840, 256, 32894, 256, 29282, 256, 30922, 256, 36034, - 256, 38647, 256, 22744, 256, 23650, 256, 27155, 256, 28122, 256, 28431, - 256, 32047, 256, 32311, 256, 38475, 256, 21202, 256, 32907, 256, 20956, - 256, 20940, 256, 31260, 256, 32190, 256, 33777, 256, 38517, 256, 35712, - 256, 25295, 256, 27138, 256, 35582, 256, 20025, 256, 23527, 256, 24594, - 256, 29575, 256, 30064, 256, 21271, 256, 30971, 256, 20415, 256, 24489, - 256, 19981, 256, 27852, 256, 25976, 256, 32034, 256, 21443, 256, 22622, - 256, 30465, 256, 33865, 256, 35498, 256, 27578, 256, 36784, 256, 27784, - 256, 25342, 256, 33509, 256, 25504, 256, 30053, 256, 20142, 256, 20841, - 256, 20937, 256, 26753, 256, 31975, 256, 33391, 256, 35538, 256, 37327, - 256, 21237, 256, 21570, 256, 22899, 256, 24300, 256, 26053, 256, 28670, - 256, 31018, 256, 38317, 256, 39530, 256, 40599, 256, 40654, 256, 21147, - 256, 26310, 256, 27511, 256, 36706, 256, 24180, 256, 24976, 256, 25088, - 256, 25754, 256, 28451, 256, 29001, 256, 29833, 256, 31178, 256, 32244, - 256, 32879, 256, 36646, 256, 34030, 256, 36899, 256, 37706, 256, 21015, - 256, 21155, 256, 21693, 256, 28872, 256, 35010, 256, 35498, 256, 24265, - 256, 24565, 256, 25467, 256, 27566, 256, 31806, 256, 29557, 256, 20196, - 256, 22265, 256, 23527, 256, 23994, 256, 24604, 256, 29618, 256, 29801, - 256, 32666, 256, 32838, 256, 37428, 256, 38646, 256, 38728, 256, 38936, - 256, 20363, 256, 31150, 256, 37300, 256, 38584, 256, 24801, 256, 20102, - 256, 20698, 256, 23534, 256, 23615, 256, 26009, 256, 27138, 256, 29134, - 256, 30274, 256, 34044, 256, 36988, 256, 40845, 256, 26248, 256, 38446, - 256, 21129, 256, 26491, 256, 26611, 256, 27969, 256, 28316, 256, 29705, - 256, 30041, 256, 30827, 256, 32016, 256, 39006, 256, 20845, 256, 25134, - 256, 38520, 256, 20523, 256, 23833, 256, 28138, 256, 36650, 256, 24459, - 256, 24900, 256, 26647, 256, 29575, 256, 38534, 256, 21033, 256, 21519, - 256, 23653, 256, 26131, 256, 26446, 256, 26792, 256, 27877, 256, 29702, - 256, 30178, 256, 32633, 256, 35023, 256, 35041, 256, 37324, 256, 38626, - 256, 21311, 256, 28346, 256, 21533, 256, 29136, 256, 29848, 256, 34298, - 256, 38563, 256, 40023, 256, 40607, 256, 26519, 256, 28107, 256, 33256, - 256, 31435, 256, 31520, 256, 31890, 256, 29376, 256, 28825, 256, 35672, - 256, 20160, 256, 33590, 256, 21050, 256, 20999, 256, 24230, 256, 25299, - 256, 31958, 256, 23429, 256, 27934, 256, 26292, 256, 36667, 256, 34892, - 256, 38477, 256, 35211, 256, 24275, 256, 20800, 256, 21952, 256, 22618, - 256, 26228, 256, 20958, 256, 29482, 256, 30410, 256, 31036, 256, 31070, - 256, 31077, 256, 31119, 256, 38742, 256, 31934, 256, 32701, 256, 34322, - 256, 35576, 256, 36920, 256, 37117, 256, 39151, 256, 39164, 256, 39208, - 256, 40372, 256, 37086, 256, 38583, 256, 20398, 256, 20711, 256, 20813, - 256, 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, 256, 22120, - 256, 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, 256, 24936, - 256, 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, 256, 26757, - 256, 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, 256, 29730, - 256, 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, 256, 31062, - 256, 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, 256, 31680, - 256, 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, 256, 33261, - 256, 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, 256, 35585, - 256, 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, 256, 38627, - 256, 38911, 256, 38971, 256, 24693, 256, 148206, 256, 33304, 256, 20006, - 256, 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, 256, 21191, - 256, 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, 256, 22618, - 256, 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, 256, 24274, - 256, 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, 256, 24840, - 256, 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, 256, 25628, - 256, 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, 256, 26454, - 256, 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, 256, 28450, - 256, 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, 256, 29482, - 256, 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, 256, 30410, - 256, 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, 256, 31409, - 256, 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, 256, 32773, - 256, 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, 256, 35222, - 256, 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, 256, 35565, - 256, 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, 256, 37273, - 256, 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, 256, 38911, - 256, 38923, 256, 38971, 256, 39698, 256, 40860, 256, 141386, 256, 141380, - 256, 144341, 256, 15261, 256, 16408, 256, 16441, 256, 152137, 256, - 154832, 256, 163539, 256, 40771, 256, 40846, 514, 102, 102, 514, 102, - 105, 514, 102, 108, 770, 102, 102, 105, 770, 102, 102, 108, 514, 383, - 116, 514, 115, 116, 514, 1396, 1398, 514, 1396, 1381, 514, 1396, 1387, - 514, 1406, 1398, 514, 1396, 1389, 512, 1497, 1460, 512, 1522, 1463, 262, - 1506, 262, 1488, 262, 1491, 262, 1492, 262, 1499, 262, 1500, 262, 1501, - 262, 1512, 262, 1514, 262, 43, 512, 1513, 1473, 512, 1513, 1474, 512, - 64329, 1473, 512, 64329, 1474, 512, 1488, 1463, 512, 1488, 1464, 512, - 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 512, 1491, 1468, 512, 1492, - 1468, 512, 1493, 1468, 512, 1494, 1468, 512, 1496, 1468, 512, 1497, 1468, - 512, 1498, 1468, 512, 1499, 1468, 512, 1500, 1468, 512, 1502, 1468, 512, - 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 512, 1508, 1468, 512, 1510, - 1468, 512, 1511, 1468, 512, 1512, 1468, 512, 1513, 1468, 512, 1514, 1468, - 512, 1493, 1465, 512, 1489, 1471, 512, 1499, 1471, 512, 1508, 1471, 514, - 1488, 1500, 267, 1649, 268, 1649, 267, 1659, 268, 1659, 269, 1659, 270, - 1659, 267, 1662, 268, 1662, 269, 1662, 270, 1662, 267, 1664, 268, 1664, - 269, 1664, 270, 1664, 267, 1658, 268, 1658, 269, 1658, 270, 1658, 267, - 1663, 268, 1663, 269, 1663, 270, 1663, 267, 1657, 268, 1657, 269, 1657, - 270, 1657, 267, 1700, 268, 1700, 269, 1700, 270, 1700, 267, 1702, 268, - 1702, 269, 1702, 270, 1702, 267, 1668, 268, 1668, 269, 1668, 270, 1668, - 267, 1667, 268, 1667, 269, 1667, 270, 1667, 267, 1670, 268, 1670, 269, - 1670, 270, 1670, 267, 1671, 268, 1671, 269, 1671, 270, 1671, 267, 1677, - 268, 1677, 267, 1676, 268, 1676, 267, 1678, 268, 1678, 267, 1672, 268, - 1672, 267, 1688, 268, 1688, 267, 1681, 268, 1681, 267, 1705, 268, 1705, - 269, 1705, 270, 1705, 267, 1711, 268, 1711, 269, 1711, 270, 1711, 267, - 1715, 268, 1715, 269, 1715, 270, 1715, 267, 1713, 268, 1713, 269, 1713, - 270, 1713, 267, 1722, 268, 1722, 267, 1723, 268, 1723, 269, 1723, 270, - 1723, 267, 1728, 268, 1728, 267, 1729, 268, 1729, 269, 1729, 270, 1729, - 267, 1726, 268, 1726, 269, 1726, 270, 1726, 267, 1746, 268, 1746, 267, - 1747, 268, 1747, 267, 1709, 268, 1709, 269, 1709, 270, 1709, 267, 1735, - 268, 1735, 267, 1734, 268, 1734, 267, 1736, 268, 1736, 267, 1655, 267, - 1739, 268, 1739, 267, 1733, 268, 1733, 267, 1737, 268, 1737, 267, 1744, - 268, 1744, 269, 1744, 270, 1744, 269, 1609, 270, 1609, 523, 1574, 1575, - 524, 1574, 1575, 523, 1574, 1749, 524, 1574, 1749, 523, 1574, 1608, 524, - 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 523, 1574, 1734, 524, 1574, - 1734, 523, 1574, 1736, 524, 1574, 1736, 523, 1574, 1744, 524, 1574, 1744, - 525, 1574, 1744, 523, 1574, 1609, 524, 1574, 1609, 525, 1574, 1609, 267, - 1740, 268, 1740, 269, 1740, 270, 1740, 523, 1574, 1580, 523, 1574, 1581, - 523, 1574, 1605, 523, 1574, 1609, 523, 1574, 1610, 523, 1576, 1580, 523, - 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 523, 1576, 1609, 523, 1576, - 1610, 523, 1578, 1580, 523, 1578, 1581, 523, 1578, 1582, 523, 1578, 1605, - 523, 1578, 1609, 523, 1578, 1610, 523, 1579, 1580, 523, 1579, 1605, 523, - 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 523, 1580, 1605, 523, 1581, - 1580, 523, 1581, 1605, 523, 1582, 1580, 523, 1582, 1581, 523, 1582, 1605, - 523, 1587, 1580, 523, 1587, 1581, 523, 1587, 1582, 523, 1587, 1605, 523, - 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 523, 1590, 1581, 523, 1590, - 1582, 523, 1590, 1605, 523, 1591, 1581, 523, 1591, 1605, 523, 1592, 1605, - 523, 1593, 1580, 523, 1593, 1605, 523, 1594, 1580, 523, 1594, 1605, 523, - 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 523, 1601, 1605, 523, 1601, - 1609, 523, 1601, 1610, 523, 1602, 1581, 523, 1602, 1605, 523, 1602, 1609, - 523, 1602, 1610, 523, 1603, 1575, 523, 1603, 1580, 523, 1603, 1581, 523, - 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 523, 1603, 1609, 523, 1603, - 1610, 523, 1604, 1580, 523, 1604, 1581, 523, 1604, 1582, 523, 1604, 1605, - 523, 1604, 1609, 523, 1604, 1610, 523, 1605, 1580, 523, 1605, 1581, 523, - 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 523, 1605, 1610, 523, 1606, - 1580, 523, 1606, 1581, 523, 1606, 1582, 523, 1606, 1605, 523, 1606, 1609, - 523, 1606, 1610, 523, 1607, 1580, 523, 1607, 1605, 523, 1607, 1609, 523, - 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 523, 1610, 1582, 523, 1610, - 1605, 523, 1610, 1609, 523, 1610, 1610, 523, 1584, 1648, 523, 1585, 1648, - 523, 1609, 1648, 779, 32, 1612, 1617, 779, 32, 1613, 1617, 779, 32, 1614, - 1617, 779, 32, 1615, 1617, 779, 32, 1616, 1617, 779, 32, 1617, 1648, 524, - 1574, 1585, 524, 1574, 1586, 524, 1574, 1605, 524, 1574, 1606, 524, 1574, - 1609, 524, 1574, 1610, 524, 1576, 1585, 524, 1576, 1586, 524, 1576, 1605, - 524, 1576, 1606, 524, 1576, 1609, 524, 1576, 1610, 524, 1578, 1585, 524, - 1578, 1586, 524, 1578, 1605, 524, 1578, 1606, 524, 1578, 1609, 524, 1578, - 1610, 524, 1579, 1585, 524, 1579, 1586, 524, 1579, 1605, 524, 1579, 1606, - 524, 1579, 1609, 524, 1579, 1610, 524, 1601, 1609, 524, 1601, 1610, 524, - 1602, 1609, 524, 1602, 1610, 524, 1603, 1575, 524, 1603, 1604, 524, 1603, - 1605, 524, 1603, 1609, 524, 1603, 1610, 524, 1604, 1605, 524, 1604, 1609, - 524, 1604, 1610, 524, 1605, 1575, 524, 1605, 1605, 524, 1606, 1585, 524, - 1606, 1586, 524, 1606, 1605, 524, 1606, 1606, 524, 1606, 1609, 524, 1606, - 1610, 524, 1609, 1648, 524, 1610, 1585, 524, 1610, 1586, 524, 1610, 1605, - 524, 1610, 1606, 524, 1610, 1609, 524, 1610, 1610, 525, 1574, 1580, 525, - 1574, 1581, 525, 1574, 1582, 525, 1574, 1605, 525, 1574, 1607, 525, 1576, - 1580, 525, 1576, 1581, 525, 1576, 1582, 525, 1576, 1605, 525, 1576, 1607, - 525, 1578, 1580, 525, 1578, 1581, 525, 1578, 1582, 525, 1578, 1605, 525, - 1578, 1607, 525, 1579, 1605, 525, 1580, 1581, 525, 1580, 1605, 525, 1581, - 1580, 525, 1581, 1605, 525, 1582, 1580, 525, 1582, 1605, 525, 1587, 1580, - 525, 1587, 1581, 525, 1587, 1582, 525, 1587, 1605, 525, 1589, 1581, 525, - 1589, 1582, 525, 1589, 1605, 525, 1590, 1580, 525, 1590, 1581, 525, 1590, - 1582, 525, 1590, 1605, 525, 1591, 1581, 525, 1592, 1605, 525, 1593, 1580, - 525, 1593, 1605, 525, 1594, 1580, 525, 1594, 1605, 525, 1601, 1580, 525, - 1601, 1581, 525, 1601, 1582, 525, 1601, 1605, 525, 1602, 1581, 525, 1602, - 1605, 525, 1603, 1580, 525, 1603, 1581, 525, 1603, 1582, 525, 1603, 1604, - 525, 1603, 1605, 525, 1604, 1580, 525, 1604, 1581, 525, 1604, 1582, 525, - 1604, 1605, 525, 1604, 1607, 525, 1605, 1580, 525, 1605, 1581, 525, 1605, - 1582, 525, 1605, 1605, 525, 1606, 1580, 525, 1606, 1581, 525, 1606, 1582, - 525, 1606, 1605, 525, 1606, 1607, 525, 1607, 1580, 525, 1607, 1605, 525, - 1607, 1648, 525, 1610, 1580, 525, 1610, 1581, 525, 1610, 1582, 525, 1610, - 1605, 525, 1610, 1607, 526, 1574, 1605, 526, 1574, 1607, 526, 1576, 1605, - 526, 1576, 1607, 526, 1578, 1605, 526, 1578, 1607, 526, 1579, 1605, 526, - 1579, 1607, 526, 1587, 1605, 526, 1587, 1607, 526, 1588, 1605, 526, 1588, - 1607, 526, 1603, 1604, 526, 1603, 1605, 526, 1604, 1605, 526, 1606, 1605, - 526, 1606, 1607, 526, 1610, 1605, 526, 1610, 1607, 782, 1600, 1614, 1617, - 782, 1600, 1615, 1617, 782, 1600, 1616, 1617, 523, 1591, 1609, 523, 1591, - 1610, 523, 1593, 1609, 523, 1593, 1610, 523, 1594, 1609, 523, 1594, 1610, - 523, 1587, 1609, 523, 1587, 1610, 523, 1588, 1609, 523, 1588, 1610, 523, - 1581, 1609, 523, 1581, 1610, 523, 1580, 1609, 523, 1580, 1610, 523, 1582, - 1609, 523, 1582, 1610, 523, 1589, 1609, 523, 1589, 1610, 523, 1590, 1609, - 523, 1590, 1610, 523, 1588, 1580, 523, 1588, 1581, 523, 1588, 1582, 523, - 1588, 1605, 523, 1588, 1585, 523, 1587, 1585, 523, 1589, 1585, 523, 1590, - 1585, 524, 1591, 1609, 524, 1591, 1610, 524, 1593, 1609, 524, 1593, 1610, - 524, 1594, 1609, 524, 1594, 1610, 524, 1587, 1609, 524, 1587, 1610, 524, - 1588, 1609, 524, 1588, 1610, 524, 1581, 1609, 524, 1581, 1610, 524, 1580, - 1609, 524, 1580, 1610, 524, 1582, 1609, 524, 1582, 1610, 524, 1589, 1609, - 524, 1589, 1610, 524, 1590, 1609, 524, 1590, 1610, 524, 1588, 1580, 524, - 1588, 1581, 524, 1588, 1582, 524, 1588, 1605, 524, 1588, 1585, 524, 1587, - 1585, 524, 1589, 1585, 524, 1590, 1585, 525, 1588, 1580, 525, 1588, 1581, - 525, 1588, 1582, 525, 1588, 1605, 525, 1587, 1607, 525, 1588, 1607, 525, - 1591, 1605, 526, 1587, 1580, 526, 1587, 1581, 526, 1587, 1582, 526, 1588, - 1580, 526, 1588, 1581, 526, 1588, 1582, 526, 1591, 1605, 526, 1592, 1605, - 524, 1575, 1611, 523, 1575, 1611, 781, 1578, 1580, 1605, 780, 1578, 1581, - 1580, 781, 1578, 1581, 1580, 781, 1578, 1581, 1605, 781, 1578, 1582, - 1605, 781, 1578, 1605, 1580, 781, 1578, 1605, 1581, 781, 1578, 1605, - 1582, 780, 1580, 1605, 1581, 781, 1580, 1605, 1581, 780, 1581, 1605, - 1610, 780, 1581, 1605, 1609, 781, 1587, 1581, 1580, 781, 1587, 1580, - 1581, 780, 1587, 1580, 1609, 780, 1587, 1605, 1581, 781, 1587, 1605, - 1581, 781, 1587, 1605, 1580, 780, 1587, 1605, 1605, 781, 1587, 1605, - 1605, 780, 1589, 1581, 1581, 781, 1589, 1581, 1581, 780, 1589, 1605, - 1605, 780, 1588, 1581, 1605, 781, 1588, 1581, 1605, 780, 1588, 1580, - 1610, 780, 1588, 1605, 1582, 781, 1588, 1605, 1582, 780, 1588, 1605, - 1605, 781, 1588, 1605, 1605, 780, 1590, 1581, 1609, 780, 1590, 1582, - 1605, 781, 1590, 1582, 1605, 780, 1591, 1605, 1581, 781, 1591, 1605, - 1581, 781, 1591, 1605, 1605, 780, 1591, 1605, 1610, 780, 1593, 1580, - 1605, 780, 1593, 1605, 1605, 781, 1593, 1605, 1605, 780, 1593, 1605, - 1609, 780, 1594, 1605, 1605, 780, 1594, 1605, 1610, 780, 1594, 1605, - 1609, 780, 1601, 1582, 1605, 781, 1601, 1582, 1605, 780, 1602, 1605, - 1581, 780, 1602, 1605, 1605, 780, 1604, 1581, 1605, 780, 1604, 1581, - 1610, 780, 1604, 1581, 1609, 781, 1604, 1580, 1580, 780, 1604, 1580, - 1580, 780, 1604, 1582, 1605, 781, 1604, 1582, 1605, 780, 1604, 1605, - 1581, 781, 1604, 1605, 1581, 781, 1605, 1581, 1580, 781, 1605, 1581, - 1605, 780, 1605, 1581, 1610, 781, 1605, 1580, 1581, 781, 1605, 1580, - 1605, 781, 1605, 1582, 1580, 781, 1605, 1582, 1605, 781, 1605, 1580, - 1582, 781, 1607, 1605, 1580, 781, 1607, 1605, 1605, 781, 1606, 1581, - 1605, 780, 1606, 1581, 1609, 780, 1606, 1580, 1605, 781, 1606, 1580, - 1605, 780, 1606, 1580, 1609, 780, 1606, 1605, 1610, 780, 1606, 1605, - 1609, 780, 1610, 1605, 1605, 781, 1610, 1605, 1605, 780, 1576, 1582, - 1610, 780, 1578, 1580, 1610, 780, 1578, 1580, 1609, 780, 1578, 1582, - 1610, 780, 1578, 1582, 1609, 780, 1578, 1605, 1610, 780, 1578, 1605, - 1609, 780, 1580, 1605, 1610, 780, 1580, 1581, 1609, 780, 1580, 1605, - 1609, 780, 1587, 1582, 1609, 780, 1589, 1581, 1610, 780, 1588, 1581, - 1610, 780, 1590, 1581, 1610, 780, 1604, 1580, 1610, 780, 1604, 1605, - 1610, 780, 1610, 1581, 1610, 780, 1610, 1580, 1610, 780, 1610, 1605, - 1610, 780, 1605, 1605, 1610, 780, 1602, 1605, 1610, 780, 1606, 1581, - 1610, 781, 1602, 1605, 1581, 781, 1604, 1581, 1605, 780, 1593, 1605, - 1610, 780, 1603, 1605, 1610, 781, 1606, 1580, 1581, 780, 1605, 1582, - 1610, 781, 1604, 1580, 1605, 780, 1603, 1605, 1605, 780, 1604, 1580, - 1605, 780, 1606, 1580, 1581, 780, 1580, 1581, 1610, 780, 1581, 1580, - 1610, 780, 1605, 1580, 1610, 780, 1601, 1605, 1610, 780, 1576, 1581, - 1610, 781, 1603, 1605, 1605, 781, 1593, 1580, 1605, 781, 1589, 1605, - 1605, 780, 1587, 1582, 1610, 780, 1606, 1580, 1610, 779, 1589, 1604, - 1746, 779, 1602, 1604, 1746, 1035, 1575, 1604, 1604, 1607, 1035, 1575, - 1603, 1576, 1585, 1035, 1605, 1581, 1605, 1583, 1035, 1589, 1604, 1593, - 1605, 1035, 1585, 1587, 1608, 1604, 1035, 1593, 1604, 1610, 1607, 1035, - 1608, 1587, 1604, 1605, 779, 1589, 1604, 1609, 4619, 1589, 1604, 1609, - 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, - 1604, 1605, 2059, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1035, - 1585, 1740, 1575, 1604, 265, 44, 265, 12289, 265, 12290, 265, 58, 265, - 59, 265, 33, 265, 63, 265, 12310, 265, 12311, 265, 8230, 265, 8229, 265, - 8212, 265, 8211, 265, 95, 265, 95, 265, 40, 265, 41, 265, 123, 265, 125, - 265, 12308, 265, 12309, 265, 12304, 265, 12305, 265, 12298, 265, 12299, - 265, 12296, 265, 12297, 265, 12300, 265, 12301, 265, 12302, 265, 12303, - 265, 91, 265, 93, 258, 8254, 258, 8254, 258, 8254, 258, 8254, 258, 95, - 258, 95, 258, 95, 271, 44, 271, 12289, 271, 46, 271, 59, 271, 58, 271, - 63, 271, 33, 271, 8212, 271, 40, 271, 41, 271, 123, 271, 125, 271, 12308, - 271, 12309, 271, 35, 271, 38, 271, 42, 271, 43, 271, 45, 271, 60, 271, - 62, 271, 61, 271, 92, 271, 36, 271, 37, 271, 64, 523, 32, 1611, 526, - 1600, 1611, 523, 32, 1612, 523, 32, 1613, 523, 32, 1614, 526, 1600, 1614, - 523, 32, 1615, 526, 1600, 1615, 523, 32, 1616, 526, 1600, 1616, 523, 32, - 1617, 526, 1600, 1617, 523, 32, 1618, 526, 1600, 1618, 267, 1569, 267, - 1570, 268, 1570, 267, 1571, 268, 1571, 267, 1572, 268, 1572, 267, 1573, - 268, 1573, 267, 1574, 268, 1574, 269, 1574, 270, 1574, 267, 1575, 268, - 1575, 267, 1576, 268, 1576, 269, 1576, 270, 1576, 267, 1577, 268, 1577, - 267, 1578, 268, 1578, 269, 1578, 270, 1578, 267, 1579, 268, 1579, 269, - 1579, 270, 1579, 267, 1580, 268, 1580, 269, 1580, 270, 1580, 267, 1581, - 268, 1581, 269, 1581, 270, 1581, 267, 1582, 268, 1582, 269, 1582, 270, - 1582, 267, 1583, 268, 1583, 267, 1584, 268, 1584, 267, 1585, 268, 1585, - 267, 1586, 268, 1586, 267, 1587, 268, 1587, 269, 1587, 270, 1587, 267, - 1588, 268, 1588, 269, 1588, 270, 1588, 267, 1589, 268, 1589, 269, 1589, - 270, 1589, 267, 1590, 268, 1590, 269, 1590, 270, 1590, 267, 1591, 268, - 1591, 269, 1591, 270, 1591, 267, 1592, 268, 1592, 269, 1592, 270, 1592, - 267, 1593, 268, 1593, 269, 1593, 270, 1593, 267, 1594, 268, 1594, 269, - 1594, 270, 1594, 267, 1601, 268, 1601, 269, 1601, 270, 1601, 267, 1602, - 268, 1602, 269, 1602, 270, 1602, 267, 1603, 268, 1603, 269, 1603, 270, - 1603, 267, 1604, 268, 1604, 269, 1604, 270, 1604, 267, 1605, 268, 1605, - 269, 1605, 270, 1605, 267, 1606, 268, 1606, 269, 1606, 270, 1606, 267, - 1607, 268, 1607, 269, 1607, 270, 1607, 267, 1608, 268, 1608, 267, 1609, - 268, 1609, 267, 1610, 268, 1610, 269, 1610, 270, 1610, 523, 1604, 1570, - 524, 1604, 1570, 523, 1604, 1571, 524, 1604, 1571, 523, 1604, 1573, 524, - 1604, 1573, 523, 1604, 1575, 524, 1604, 1575, 264, 33, 264, 34, 264, 35, - 264, 36, 264, 37, 264, 38, 264, 39, 264, 40, 264, 41, 264, 42, 264, 43, - 264, 44, 264, 45, 264, 46, 264, 47, 264, 48, 264, 49, 264, 50, 264, 51, - 264, 52, 264, 53, 264, 54, 264, 55, 264, 56, 264, 57, 264, 58, 264, 59, - 264, 60, 264, 61, 264, 62, 264, 63, 264, 64, 264, 65, 264, 66, 264, 67, - 264, 68, 264, 69, 264, 70, 264, 71, 264, 72, 264, 73, 264, 74, 264, 75, - 264, 76, 264, 77, 264, 78, 264, 79, 264, 80, 264, 81, 264, 82, 264, 83, - 264, 84, 264, 85, 264, 86, 264, 87, 264, 88, 264, 89, 264, 90, 264, 91, - 264, 92, 264, 93, 264, 94, 264, 95, 264, 96, 264, 97, 264, 98, 264, 99, - 264, 100, 264, 101, 264, 102, 264, 103, 264, 104, 264, 105, 264, 106, - 264, 107, 264, 108, 264, 109, 264, 110, 264, 111, 264, 112, 264, 113, - 264, 114, 264, 115, 264, 116, 264, 117, 264, 118, 264, 119, 264, 120, - 264, 121, 264, 122, 264, 123, 264, 124, 264, 125, 264, 126, 264, 10629, - 264, 10630, 272, 12290, 272, 12300, 272, 12301, 272, 12289, 272, 12539, - 272, 12530, 272, 12449, 272, 12451, 272, 12453, 272, 12455, 272, 12457, - 272, 12515, 272, 12517, 272, 12519, 272, 12483, 272, 12540, 272, 12450, - 272, 12452, 272, 12454, 272, 12456, 272, 12458, 272, 12459, 272, 12461, - 272, 12463, 272, 12465, 272, 12467, 272, 12469, 272, 12471, 272, 12473, - 272, 12475, 272, 12477, 272, 12479, 272, 12481, 272, 12484, 272, 12486, - 272, 12488, 272, 12490, 272, 12491, 272, 12492, 272, 12493, 272, 12494, - 272, 12495, 272, 12498, 272, 12501, 272, 12504, 272, 12507, 272, 12510, - 272, 12511, 272, 12512, 272, 12513, 272, 12514, 272, 12516, 272, 12518, - 272, 12520, 272, 12521, 272, 12522, 272, 12523, 272, 12524, 272, 12525, - 272, 12527, 272, 12531, 272, 12441, 272, 12442, 272, 12644, 272, 12593, - 272, 12594, 272, 12595, 272, 12596, 272, 12597, 272, 12598, 272, 12599, - 272, 12600, 272, 12601, 272, 12602, 272, 12603, 272, 12604, 272, 12605, - 272, 12606, 272, 12607, 272, 12608, 272, 12609, 272, 12610, 272, 12611, - 272, 12612, 272, 12613, 272, 12614, 272, 12615, 272, 12616, 272, 12617, - 272, 12618, 272, 12619, 272, 12620, 272, 12621, 272, 12622, 272, 12623, - 272, 12624, 272, 12625, 272, 12626, 272, 12627, 272, 12628, 272, 12629, - 272, 12630, 272, 12631, 272, 12632, 272, 12633, 272, 12634, 272, 12635, - 272, 12636, 272, 12637, 272, 12638, 272, 12639, 272, 12640, 272, 12641, - 272, 12642, 272, 12643, 264, 162, 264, 163, 264, 172, 264, 175, 264, 166, - 264, 165, 264, 8361, 272, 9474, 272, 8592, 272, 8593, 272, 8594, 272, - 8595, 272, 9632, 272, 9675, 512, 69785, 69818, 512, 69787, 69818, 512, - 69797, 69818, 512, 69937, 69927, 512, 69938, 69927, 512, 70471, 70462, - 512, 70471, 70487, 512, 70841, 70842, 512, 70841, 70832, 512, 70841, - 70845, 512, 71096, 71087, 512, 71097, 71087, 512, 119127, 119141, 512, - 119128, 119141, 512, 119135, 119150, 512, 119135, 119151, 512, 119135, - 119152, 512, 119135, 119153, 512, 119135, 119154, 512, 119225, 119141, - 512, 119226, 119141, 512, 119227, 119150, 512, 119228, 119150, 512, - 119227, 119151, 512, 119228, 119151, 262, 65, 262, 66, 262, 67, 262, 68, - 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, - 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, - 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, - 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, - 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, - 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, - 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, - 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, - 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, - 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, - 262, 100, 262, 101, 262, 102, 262, 103, 262, 105, 262, 106, 262, 107, + 294, 259, 339, 259, 42791, 259, 43831, 259, 619, 259, 43858, 259, 653, + 256, 35912, 256, 26356, 256, 36554, 256, 36040, 256, 28369, 256, 20018, + 256, 21477, 256, 40860, 256, 40860, 256, 22865, 256, 37329, 256, 21895, + 256, 22856, 256, 25078, 256, 30313, 256, 32645, 256, 34367, 256, 34746, + 256, 35064, 256, 37007, 256, 27138, 256, 27931, 256, 28889, 256, 29662, + 256, 33853, 256, 37226, 256, 39409, 256, 20098, 256, 21365, 256, 27396, + 256, 29211, 256, 34349, 256, 40478, 256, 23888, 256, 28651, 256, 34253, + 256, 35172, 256, 25289, 256, 33240, 256, 34847, 256, 24266, 256, 26391, + 256, 28010, 256, 29436, 256, 37070, 256, 20358, 256, 20919, 256, 21214, + 256, 25796, 256, 27347, 256, 29200, 256, 30439, 256, 32769, 256, 34310, + 256, 34396, 256, 36335, 256, 38706, 256, 39791, 256, 40442, 256, 30860, + 256, 31103, 256, 32160, 256, 33737, 256, 37636, 256, 40575, 256, 35542, + 256, 22751, 256, 24324, 256, 31840, 256, 32894, 256, 29282, 256, 30922, + 256, 36034, 256, 38647, 256, 22744, 256, 23650, 256, 27155, 256, 28122, + 256, 28431, 256, 32047, 256, 32311, 256, 38475, 256, 21202, 256, 32907, + 256, 20956, 256, 20940, 256, 31260, 256, 32190, 256, 33777, 256, 38517, + 256, 35712, 256, 25295, 256, 27138, 256, 35582, 256, 20025, 256, 23527, + 256, 24594, 256, 29575, 256, 30064, 256, 21271, 256, 30971, 256, 20415, + 256, 24489, 256, 19981, 256, 27852, 256, 25976, 256, 32034, 256, 21443, + 256, 22622, 256, 30465, 256, 33865, 256, 35498, 256, 27578, 256, 36784, + 256, 27784, 256, 25342, 256, 33509, 256, 25504, 256, 30053, 256, 20142, + 256, 20841, 256, 20937, 256, 26753, 256, 31975, 256, 33391, 256, 35538, + 256, 37327, 256, 21237, 256, 21570, 256, 22899, 256, 24300, 256, 26053, + 256, 28670, 256, 31018, 256, 38317, 256, 39530, 256, 40599, 256, 40654, + 256, 21147, 256, 26310, 256, 27511, 256, 36706, 256, 24180, 256, 24976, + 256, 25088, 256, 25754, 256, 28451, 256, 29001, 256, 29833, 256, 31178, + 256, 32244, 256, 32879, 256, 36646, 256, 34030, 256, 36899, 256, 37706, + 256, 21015, 256, 21155, 256, 21693, 256, 28872, 256, 35010, 256, 35498, + 256, 24265, 256, 24565, 256, 25467, 256, 27566, 256, 31806, 256, 29557, + 256, 20196, 256, 22265, 256, 23527, 256, 23994, 256, 24604, 256, 29618, + 256, 29801, 256, 32666, 256, 32838, 256, 37428, 256, 38646, 256, 38728, + 256, 38936, 256, 20363, 256, 31150, 256, 37300, 256, 38584, 256, 24801, + 256, 20102, 256, 20698, 256, 23534, 256, 23615, 256, 26009, 256, 27138, + 256, 29134, 256, 30274, 256, 34044, 256, 36988, 256, 40845, 256, 26248, + 256, 38446, 256, 21129, 256, 26491, 256, 26611, 256, 27969, 256, 28316, + 256, 29705, 256, 30041, 256, 30827, 256, 32016, 256, 39006, 256, 20845, + 256, 25134, 256, 38520, 256, 20523, 256, 23833, 256, 28138, 256, 36650, + 256, 24459, 256, 24900, 256, 26647, 256, 29575, 256, 38534, 256, 21033, + 256, 21519, 256, 23653, 256, 26131, 256, 26446, 256, 26792, 256, 27877, + 256, 29702, 256, 30178, 256, 32633, 256, 35023, 256, 35041, 256, 37324, + 256, 38626, 256, 21311, 256, 28346, 256, 21533, 256, 29136, 256, 29848, + 256, 34298, 256, 38563, 256, 40023, 256, 40607, 256, 26519, 256, 28107, + 256, 33256, 256, 31435, 256, 31520, 256, 31890, 256, 29376, 256, 28825, + 256, 35672, 256, 20160, 256, 33590, 256, 21050, 256, 20999, 256, 24230, + 256, 25299, 256, 31958, 256, 23429, 256, 27934, 256, 26292, 256, 36667, + 256, 34892, 256, 38477, 256, 35211, 256, 24275, 256, 20800, 256, 21952, + 256, 22618, 256, 26228, 256, 20958, 256, 29482, 256, 30410, 256, 31036, + 256, 31070, 256, 31077, 256, 31119, 256, 38742, 256, 31934, 256, 32701, + 256, 34322, 256, 35576, 256, 36920, 256, 37117, 256, 39151, 256, 39164, + 256, 39208, 256, 40372, 256, 37086, 256, 38583, 256, 20398, 256, 20711, + 256, 20813, 256, 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, + 256, 22120, 256, 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, + 256, 24936, 256, 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, + 256, 26757, 256, 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, + 256, 29730, 256, 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, + 256, 31062, 256, 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, + 256, 31680, 256, 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, + 256, 33261, 256, 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, + 256, 35585, 256, 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, + 256, 38627, 256, 38911, 256, 38971, 256, 24693, 256, 148206, 256, 33304, + 256, 20006, 256, 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, + 256, 21191, 256, 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, + 256, 22618, 256, 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, + 256, 24274, 256, 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, + 256, 24840, 256, 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, + 256, 25628, 256, 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, + 256, 26454, 256, 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, + 256, 28450, 256, 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, + 256, 29482, 256, 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, + 256, 30410, 256, 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, + 256, 31409, 256, 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, + 256, 32773, 256, 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, + 256, 35222, 256, 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, + 256, 35565, 256, 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, + 256, 37273, 256, 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, + 256, 38911, 256, 38923, 256, 38971, 256, 39698, 256, 40860, 256, 141386, + 256, 141380, 256, 144341, 256, 15261, 256, 16408, 256, 16441, 256, + 152137, 256, 154832, 256, 163539, 256, 40771, 256, 40846, 514, 102, 102, + 514, 102, 105, 514, 102, 108, 770, 102, 102, 105, 770, 102, 102, 108, + 514, 383, 116, 514, 115, 116, 514, 1396, 1398, 514, 1396, 1381, 514, + 1396, 1387, 514, 1406, 1398, 514, 1396, 1389, 512, 1497, 1460, 512, 1522, + 1463, 262, 1506, 262, 1488, 262, 1491, 262, 1492, 262, 1499, 262, 1500, + 262, 1501, 262, 1512, 262, 1514, 262, 43, 512, 1513, 1473, 512, 1513, + 1474, 512, 64329, 1473, 512, 64329, 1474, 512, 1488, 1463, 512, 1488, + 1464, 512, 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 512, 1491, 1468, + 512, 1492, 1468, 512, 1493, 1468, 512, 1494, 1468, 512, 1496, 1468, 512, + 1497, 1468, 512, 1498, 1468, 512, 1499, 1468, 512, 1500, 1468, 512, 1502, + 1468, 512, 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 512, 1508, 1468, + 512, 1510, 1468, 512, 1511, 1468, 512, 1512, 1468, 512, 1513, 1468, 512, + 1514, 1468, 512, 1493, 1465, 512, 1489, 1471, 512, 1499, 1471, 512, 1508, + 1471, 514, 1488, 1500, 267, 1649, 268, 1649, 267, 1659, 268, 1659, 269, + 1659, 270, 1659, 267, 1662, 268, 1662, 269, 1662, 270, 1662, 267, 1664, + 268, 1664, 269, 1664, 270, 1664, 267, 1658, 268, 1658, 269, 1658, 270, + 1658, 267, 1663, 268, 1663, 269, 1663, 270, 1663, 267, 1657, 268, 1657, + 269, 1657, 270, 1657, 267, 1700, 268, 1700, 269, 1700, 270, 1700, 267, + 1702, 268, 1702, 269, 1702, 270, 1702, 267, 1668, 268, 1668, 269, 1668, + 270, 1668, 267, 1667, 268, 1667, 269, 1667, 270, 1667, 267, 1670, 268, + 1670, 269, 1670, 270, 1670, 267, 1671, 268, 1671, 269, 1671, 270, 1671, + 267, 1677, 268, 1677, 267, 1676, 268, 1676, 267, 1678, 268, 1678, 267, + 1672, 268, 1672, 267, 1688, 268, 1688, 267, 1681, 268, 1681, 267, 1705, + 268, 1705, 269, 1705, 270, 1705, 267, 1711, 268, 1711, 269, 1711, 270, + 1711, 267, 1715, 268, 1715, 269, 1715, 270, 1715, 267, 1713, 268, 1713, + 269, 1713, 270, 1713, 267, 1722, 268, 1722, 267, 1723, 268, 1723, 269, + 1723, 270, 1723, 267, 1728, 268, 1728, 267, 1729, 268, 1729, 269, 1729, + 270, 1729, 267, 1726, 268, 1726, 269, 1726, 270, 1726, 267, 1746, 268, + 1746, 267, 1747, 268, 1747, 267, 1709, 268, 1709, 269, 1709, 270, 1709, + 267, 1735, 268, 1735, 267, 1734, 268, 1734, 267, 1736, 268, 1736, 267, + 1655, 267, 1739, 268, 1739, 267, 1733, 268, 1733, 267, 1737, 268, 1737, + 267, 1744, 268, 1744, 269, 1744, 270, 1744, 269, 1609, 270, 1609, 523, + 1574, 1575, 524, 1574, 1575, 523, 1574, 1749, 524, 1574, 1749, 523, 1574, + 1608, 524, 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 523, 1574, 1734, + 524, 1574, 1734, 523, 1574, 1736, 524, 1574, 1736, 523, 1574, 1744, 524, + 1574, 1744, 525, 1574, 1744, 523, 1574, 1609, 524, 1574, 1609, 525, 1574, + 1609, 267, 1740, 268, 1740, 269, 1740, 270, 1740, 523, 1574, 1580, 523, + 1574, 1581, 523, 1574, 1605, 523, 1574, 1609, 523, 1574, 1610, 523, 1576, + 1580, 523, 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 523, 1576, 1609, + 523, 1576, 1610, 523, 1578, 1580, 523, 1578, 1581, 523, 1578, 1582, 523, + 1578, 1605, 523, 1578, 1609, 523, 1578, 1610, 523, 1579, 1580, 523, 1579, + 1605, 523, 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 523, 1580, 1605, + 523, 1581, 1580, 523, 1581, 1605, 523, 1582, 1580, 523, 1582, 1581, 523, + 1582, 1605, 523, 1587, 1580, 523, 1587, 1581, 523, 1587, 1582, 523, 1587, + 1605, 523, 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 523, 1590, 1581, + 523, 1590, 1582, 523, 1590, 1605, 523, 1591, 1581, 523, 1591, 1605, 523, + 1592, 1605, 523, 1593, 1580, 523, 1593, 1605, 523, 1594, 1580, 523, 1594, + 1605, 523, 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 523, 1601, 1605, + 523, 1601, 1609, 523, 1601, 1610, 523, 1602, 1581, 523, 1602, 1605, 523, + 1602, 1609, 523, 1602, 1610, 523, 1603, 1575, 523, 1603, 1580, 523, 1603, + 1581, 523, 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 523, 1603, 1609, + 523, 1603, 1610, 523, 1604, 1580, 523, 1604, 1581, 523, 1604, 1582, 523, + 1604, 1605, 523, 1604, 1609, 523, 1604, 1610, 523, 1605, 1580, 523, 1605, + 1581, 523, 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 523, 1605, 1610, + 523, 1606, 1580, 523, 1606, 1581, 523, 1606, 1582, 523, 1606, 1605, 523, + 1606, 1609, 523, 1606, 1610, 523, 1607, 1580, 523, 1607, 1605, 523, 1607, + 1609, 523, 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 523, 1610, 1582, + 523, 1610, 1605, 523, 1610, 1609, 523, 1610, 1610, 523, 1584, 1648, 523, + 1585, 1648, 523, 1609, 1648, 779, 32, 1612, 1617, 779, 32, 1613, 1617, + 779, 32, 1614, 1617, 779, 32, 1615, 1617, 779, 32, 1616, 1617, 779, 32, + 1617, 1648, 524, 1574, 1585, 524, 1574, 1586, 524, 1574, 1605, 524, 1574, + 1606, 524, 1574, 1609, 524, 1574, 1610, 524, 1576, 1585, 524, 1576, 1586, + 524, 1576, 1605, 524, 1576, 1606, 524, 1576, 1609, 524, 1576, 1610, 524, + 1578, 1585, 524, 1578, 1586, 524, 1578, 1605, 524, 1578, 1606, 524, 1578, + 1609, 524, 1578, 1610, 524, 1579, 1585, 524, 1579, 1586, 524, 1579, 1605, + 524, 1579, 1606, 524, 1579, 1609, 524, 1579, 1610, 524, 1601, 1609, 524, + 1601, 1610, 524, 1602, 1609, 524, 1602, 1610, 524, 1603, 1575, 524, 1603, + 1604, 524, 1603, 1605, 524, 1603, 1609, 524, 1603, 1610, 524, 1604, 1605, + 524, 1604, 1609, 524, 1604, 1610, 524, 1605, 1575, 524, 1605, 1605, 524, + 1606, 1585, 524, 1606, 1586, 524, 1606, 1605, 524, 1606, 1606, 524, 1606, + 1609, 524, 1606, 1610, 524, 1609, 1648, 524, 1610, 1585, 524, 1610, 1586, + 524, 1610, 1605, 524, 1610, 1606, 524, 1610, 1609, 524, 1610, 1610, 525, + 1574, 1580, 525, 1574, 1581, 525, 1574, 1582, 525, 1574, 1605, 525, 1574, + 1607, 525, 1576, 1580, 525, 1576, 1581, 525, 1576, 1582, 525, 1576, 1605, + 525, 1576, 1607, 525, 1578, 1580, 525, 1578, 1581, 525, 1578, 1582, 525, + 1578, 1605, 525, 1578, 1607, 525, 1579, 1605, 525, 1580, 1581, 525, 1580, + 1605, 525, 1581, 1580, 525, 1581, 1605, 525, 1582, 1580, 525, 1582, 1605, + 525, 1587, 1580, 525, 1587, 1581, 525, 1587, 1582, 525, 1587, 1605, 525, + 1589, 1581, 525, 1589, 1582, 525, 1589, 1605, 525, 1590, 1580, 525, 1590, + 1581, 525, 1590, 1582, 525, 1590, 1605, 525, 1591, 1581, 525, 1592, 1605, + 525, 1593, 1580, 525, 1593, 1605, 525, 1594, 1580, 525, 1594, 1605, 525, + 1601, 1580, 525, 1601, 1581, 525, 1601, 1582, 525, 1601, 1605, 525, 1602, + 1581, 525, 1602, 1605, 525, 1603, 1580, 525, 1603, 1581, 525, 1603, 1582, + 525, 1603, 1604, 525, 1603, 1605, 525, 1604, 1580, 525, 1604, 1581, 525, + 1604, 1582, 525, 1604, 1605, 525, 1604, 1607, 525, 1605, 1580, 525, 1605, + 1581, 525, 1605, 1582, 525, 1605, 1605, 525, 1606, 1580, 525, 1606, 1581, + 525, 1606, 1582, 525, 1606, 1605, 525, 1606, 1607, 525, 1607, 1580, 525, + 1607, 1605, 525, 1607, 1648, 525, 1610, 1580, 525, 1610, 1581, 525, 1610, + 1582, 525, 1610, 1605, 525, 1610, 1607, 526, 1574, 1605, 526, 1574, 1607, + 526, 1576, 1605, 526, 1576, 1607, 526, 1578, 1605, 526, 1578, 1607, 526, + 1579, 1605, 526, 1579, 1607, 526, 1587, 1605, 526, 1587, 1607, 526, 1588, + 1605, 526, 1588, 1607, 526, 1603, 1604, 526, 1603, 1605, 526, 1604, 1605, + 526, 1606, 1605, 526, 1606, 1607, 526, 1610, 1605, 526, 1610, 1607, 782, + 1600, 1614, 1617, 782, 1600, 1615, 1617, 782, 1600, 1616, 1617, 523, + 1591, 1609, 523, 1591, 1610, 523, 1593, 1609, 523, 1593, 1610, 523, 1594, + 1609, 523, 1594, 1610, 523, 1587, 1609, 523, 1587, 1610, 523, 1588, 1609, + 523, 1588, 1610, 523, 1581, 1609, 523, 1581, 1610, 523, 1580, 1609, 523, + 1580, 1610, 523, 1582, 1609, 523, 1582, 1610, 523, 1589, 1609, 523, 1589, + 1610, 523, 1590, 1609, 523, 1590, 1610, 523, 1588, 1580, 523, 1588, 1581, + 523, 1588, 1582, 523, 1588, 1605, 523, 1588, 1585, 523, 1587, 1585, 523, + 1589, 1585, 523, 1590, 1585, 524, 1591, 1609, 524, 1591, 1610, 524, 1593, + 1609, 524, 1593, 1610, 524, 1594, 1609, 524, 1594, 1610, 524, 1587, 1609, + 524, 1587, 1610, 524, 1588, 1609, 524, 1588, 1610, 524, 1581, 1609, 524, + 1581, 1610, 524, 1580, 1609, 524, 1580, 1610, 524, 1582, 1609, 524, 1582, + 1610, 524, 1589, 1609, 524, 1589, 1610, 524, 1590, 1609, 524, 1590, 1610, + 524, 1588, 1580, 524, 1588, 1581, 524, 1588, 1582, 524, 1588, 1605, 524, + 1588, 1585, 524, 1587, 1585, 524, 1589, 1585, 524, 1590, 1585, 525, 1588, + 1580, 525, 1588, 1581, 525, 1588, 1582, 525, 1588, 1605, 525, 1587, 1607, + 525, 1588, 1607, 525, 1591, 1605, 526, 1587, 1580, 526, 1587, 1581, 526, + 1587, 1582, 526, 1588, 1580, 526, 1588, 1581, 526, 1588, 1582, 526, 1591, + 1605, 526, 1592, 1605, 524, 1575, 1611, 523, 1575, 1611, 781, 1578, 1580, + 1605, 780, 1578, 1581, 1580, 781, 1578, 1581, 1580, 781, 1578, 1581, + 1605, 781, 1578, 1582, 1605, 781, 1578, 1605, 1580, 781, 1578, 1605, + 1581, 781, 1578, 1605, 1582, 780, 1580, 1605, 1581, 781, 1580, 1605, + 1581, 780, 1581, 1605, 1610, 780, 1581, 1605, 1609, 781, 1587, 1581, + 1580, 781, 1587, 1580, 1581, 780, 1587, 1580, 1609, 780, 1587, 1605, + 1581, 781, 1587, 1605, 1581, 781, 1587, 1605, 1580, 780, 1587, 1605, + 1605, 781, 1587, 1605, 1605, 780, 1589, 1581, 1581, 781, 1589, 1581, + 1581, 780, 1589, 1605, 1605, 780, 1588, 1581, 1605, 781, 1588, 1581, + 1605, 780, 1588, 1580, 1610, 780, 1588, 1605, 1582, 781, 1588, 1605, + 1582, 780, 1588, 1605, 1605, 781, 1588, 1605, 1605, 780, 1590, 1581, + 1609, 780, 1590, 1582, 1605, 781, 1590, 1582, 1605, 780, 1591, 1605, + 1581, 781, 1591, 1605, 1581, 781, 1591, 1605, 1605, 780, 1591, 1605, + 1610, 780, 1593, 1580, 1605, 780, 1593, 1605, 1605, 781, 1593, 1605, + 1605, 780, 1593, 1605, 1609, 780, 1594, 1605, 1605, 780, 1594, 1605, + 1610, 780, 1594, 1605, 1609, 780, 1601, 1582, 1605, 781, 1601, 1582, + 1605, 780, 1602, 1605, 1581, 780, 1602, 1605, 1605, 780, 1604, 1581, + 1605, 780, 1604, 1581, 1610, 780, 1604, 1581, 1609, 781, 1604, 1580, + 1580, 780, 1604, 1580, 1580, 780, 1604, 1582, 1605, 781, 1604, 1582, + 1605, 780, 1604, 1605, 1581, 781, 1604, 1605, 1581, 781, 1605, 1581, + 1580, 781, 1605, 1581, 1605, 780, 1605, 1581, 1610, 781, 1605, 1580, + 1581, 781, 1605, 1580, 1605, 781, 1605, 1582, 1580, 781, 1605, 1582, + 1605, 781, 1605, 1580, 1582, 781, 1607, 1605, 1580, 781, 1607, 1605, + 1605, 781, 1606, 1581, 1605, 780, 1606, 1581, 1609, 780, 1606, 1580, + 1605, 781, 1606, 1580, 1605, 780, 1606, 1580, 1609, 780, 1606, 1605, + 1610, 780, 1606, 1605, 1609, 780, 1610, 1605, 1605, 781, 1610, 1605, + 1605, 780, 1576, 1582, 1610, 780, 1578, 1580, 1610, 780, 1578, 1580, + 1609, 780, 1578, 1582, 1610, 780, 1578, 1582, 1609, 780, 1578, 1605, + 1610, 780, 1578, 1605, 1609, 780, 1580, 1605, 1610, 780, 1580, 1581, + 1609, 780, 1580, 1605, 1609, 780, 1587, 1582, 1609, 780, 1589, 1581, + 1610, 780, 1588, 1581, 1610, 780, 1590, 1581, 1610, 780, 1604, 1580, + 1610, 780, 1604, 1605, 1610, 780, 1610, 1581, 1610, 780, 1610, 1580, + 1610, 780, 1610, 1605, 1610, 780, 1605, 1605, 1610, 780, 1602, 1605, + 1610, 780, 1606, 1581, 1610, 781, 1602, 1605, 1581, 781, 1604, 1581, + 1605, 780, 1593, 1605, 1610, 780, 1603, 1605, 1610, 781, 1606, 1580, + 1581, 780, 1605, 1582, 1610, 781, 1604, 1580, 1605, 780, 1603, 1605, + 1605, 780, 1604, 1580, 1605, 780, 1606, 1580, 1581, 780, 1580, 1581, + 1610, 780, 1581, 1580, 1610, 780, 1605, 1580, 1610, 780, 1601, 1605, + 1610, 780, 1576, 1581, 1610, 781, 1603, 1605, 1605, 781, 1593, 1580, + 1605, 781, 1589, 1605, 1605, 780, 1587, 1582, 1610, 780, 1606, 1580, + 1610, 779, 1589, 1604, 1746, 779, 1602, 1604, 1746, 1035, 1575, 1604, + 1604, 1607, 1035, 1575, 1603, 1576, 1585, 1035, 1605, 1581, 1605, 1583, + 1035, 1589, 1604, 1593, 1605, 1035, 1585, 1587, 1608, 1604, 1035, 1593, + 1604, 1610, 1607, 1035, 1608, 1587, 1604, 1605, 779, 1589, 1604, 1609, + 4619, 1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, + 1607, 32, 1608, 1587, 1604, 1605, 2059, 1580, 1604, 32, 1580, 1604, 1575, + 1604, 1607, 1035, 1585, 1740, 1575, 1604, 265, 44, 265, 12289, 265, + 12290, 265, 58, 265, 59, 265, 33, 265, 63, 265, 12310, 265, 12311, 265, + 8230, 265, 8229, 265, 8212, 265, 8211, 265, 95, 265, 95, 265, 40, 265, + 41, 265, 123, 265, 125, 265, 12308, 265, 12309, 265, 12304, 265, 12305, + 265, 12298, 265, 12299, 265, 12296, 265, 12297, 265, 12300, 265, 12301, + 265, 12302, 265, 12303, 265, 91, 265, 93, 258, 8254, 258, 8254, 258, + 8254, 258, 8254, 258, 95, 258, 95, 258, 95, 271, 44, 271, 12289, 271, 46, + 271, 59, 271, 58, 271, 63, 271, 33, 271, 8212, 271, 40, 271, 41, 271, + 123, 271, 125, 271, 12308, 271, 12309, 271, 35, 271, 38, 271, 42, 271, + 43, 271, 45, 271, 60, 271, 62, 271, 61, 271, 92, 271, 36, 271, 37, 271, + 64, 523, 32, 1611, 526, 1600, 1611, 523, 32, 1612, 523, 32, 1613, 523, + 32, 1614, 526, 1600, 1614, 523, 32, 1615, 526, 1600, 1615, 523, 32, 1616, + 526, 1600, 1616, 523, 32, 1617, 526, 1600, 1617, 523, 32, 1618, 526, + 1600, 1618, 267, 1569, 267, 1570, 268, 1570, 267, 1571, 268, 1571, 267, + 1572, 268, 1572, 267, 1573, 268, 1573, 267, 1574, 268, 1574, 269, 1574, + 270, 1574, 267, 1575, 268, 1575, 267, 1576, 268, 1576, 269, 1576, 270, + 1576, 267, 1577, 268, 1577, 267, 1578, 268, 1578, 269, 1578, 270, 1578, + 267, 1579, 268, 1579, 269, 1579, 270, 1579, 267, 1580, 268, 1580, 269, + 1580, 270, 1580, 267, 1581, 268, 1581, 269, 1581, 270, 1581, 267, 1582, + 268, 1582, 269, 1582, 270, 1582, 267, 1583, 268, 1583, 267, 1584, 268, + 1584, 267, 1585, 268, 1585, 267, 1586, 268, 1586, 267, 1587, 268, 1587, + 269, 1587, 270, 1587, 267, 1588, 268, 1588, 269, 1588, 270, 1588, 267, + 1589, 268, 1589, 269, 1589, 270, 1589, 267, 1590, 268, 1590, 269, 1590, + 270, 1590, 267, 1591, 268, 1591, 269, 1591, 270, 1591, 267, 1592, 268, + 1592, 269, 1592, 270, 1592, 267, 1593, 268, 1593, 269, 1593, 270, 1593, + 267, 1594, 268, 1594, 269, 1594, 270, 1594, 267, 1601, 268, 1601, 269, + 1601, 270, 1601, 267, 1602, 268, 1602, 269, 1602, 270, 1602, 267, 1603, + 268, 1603, 269, 1603, 270, 1603, 267, 1604, 268, 1604, 269, 1604, 270, + 1604, 267, 1605, 268, 1605, 269, 1605, 270, 1605, 267, 1606, 268, 1606, + 269, 1606, 270, 1606, 267, 1607, 268, 1607, 269, 1607, 270, 1607, 267, + 1608, 268, 1608, 267, 1609, 268, 1609, 267, 1610, 268, 1610, 269, 1610, + 270, 1610, 523, 1604, 1570, 524, 1604, 1570, 523, 1604, 1571, 524, 1604, + 1571, 523, 1604, 1573, 524, 1604, 1573, 523, 1604, 1575, 524, 1604, 1575, + 264, 33, 264, 34, 264, 35, 264, 36, 264, 37, 264, 38, 264, 39, 264, 40, + 264, 41, 264, 42, 264, 43, 264, 44, 264, 45, 264, 46, 264, 47, 264, 48, + 264, 49, 264, 50, 264, 51, 264, 52, 264, 53, 264, 54, 264, 55, 264, 56, + 264, 57, 264, 58, 264, 59, 264, 60, 264, 61, 264, 62, 264, 63, 264, 64, + 264, 65, 264, 66, 264, 67, 264, 68, 264, 69, 264, 70, 264, 71, 264, 72, + 264, 73, 264, 74, 264, 75, 264, 76, 264, 77, 264, 78, 264, 79, 264, 80, + 264, 81, 264, 82, 264, 83, 264, 84, 264, 85, 264, 86, 264, 87, 264, 88, + 264, 89, 264, 90, 264, 91, 264, 92, 264, 93, 264, 94, 264, 95, 264, 96, + 264, 97, 264, 98, 264, 99, 264, 100, 264, 101, 264, 102, 264, 103, 264, + 104, 264, 105, 264, 106, 264, 107, 264, 108, 264, 109, 264, 110, 264, + 111, 264, 112, 264, 113, 264, 114, 264, 115, 264, 116, 264, 117, 264, + 118, 264, 119, 264, 120, 264, 121, 264, 122, 264, 123, 264, 124, 264, + 125, 264, 126, 264, 10629, 264, 10630, 272, 12290, 272, 12300, 272, + 12301, 272, 12289, 272, 12539, 272, 12530, 272, 12449, 272, 12451, 272, + 12453, 272, 12455, 272, 12457, 272, 12515, 272, 12517, 272, 12519, 272, + 12483, 272, 12540, 272, 12450, 272, 12452, 272, 12454, 272, 12456, 272, + 12458, 272, 12459, 272, 12461, 272, 12463, 272, 12465, 272, 12467, 272, + 12469, 272, 12471, 272, 12473, 272, 12475, 272, 12477, 272, 12479, 272, + 12481, 272, 12484, 272, 12486, 272, 12488, 272, 12490, 272, 12491, 272, + 12492, 272, 12493, 272, 12494, 272, 12495, 272, 12498, 272, 12501, 272, + 12504, 272, 12507, 272, 12510, 272, 12511, 272, 12512, 272, 12513, 272, + 12514, 272, 12516, 272, 12518, 272, 12520, 272, 12521, 272, 12522, 272, + 12523, 272, 12524, 272, 12525, 272, 12527, 272, 12531, 272, 12441, 272, + 12442, 272, 12644, 272, 12593, 272, 12594, 272, 12595, 272, 12596, 272, + 12597, 272, 12598, 272, 12599, 272, 12600, 272, 12601, 272, 12602, 272, + 12603, 272, 12604, 272, 12605, 272, 12606, 272, 12607, 272, 12608, 272, + 12609, 272, 12610, 272, 12611, 272, 12612, 272, 12613, 272, 12614, 272, + 12615, 272, 12616, 272, 12617, 272, 12618, 272, 12619, 272, 12620, 272, + 12621, 272, 12622, 272, 12623, 272, 12624, 272, 12625, 272, 12626, 272, + 12627, 272, 12628, 272, 12629, 272, 12630, 272, 12631, 272, 12632, 272, + 12633, 272, 12634, 272, 12635, 272, 12636, 272, 12637, 272, 12638, 272, + 12639, 272, 12640, 272, 12641, 272, 12642, 272, 12643, 264, 162, 264, + 163, 264, 172, 264, 175, 264, 166, 264, 165, 264, 8361, 272, 9474, 272, + 8592, 272, 8593, 272, 8594, 272, 8595, 272, 9632, 272, 9675, 512, 69785, + 69818, 512, 69787, 69818, 512, 69797, 69818, 512, 69937, 69927, 512, + 69938, 69927, 512, 70471, 70462, 512, 70471, 70487, 512, 70841, 70842, + 512, 70841, 70832, 512, 70841, 70845, 512, 71096, 71087, 512, 71097, + 71087, 512, 71989, 71984, 512, 119127, 119141, 512, 119128, 119141, 512, + 119135, 119150, 512, 119135, 119151, 512, 119135, 119152, 512, 119135, + 119153, 512, 119135, 119154, 512, 119225, 119141, 512, 119226, 119141, + 512, 119227, 119150, 512, 119228, 119150, 512, 119227, 119151, 512, + 119228, 119151, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, + 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, + 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, + 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, + 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, + 262, 102, 262, 103, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, + 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, + 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, + 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, + 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, + 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, + 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, + 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, + 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, + 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 67, 262, + 68, 262, 71, 262, 74, 262, 75, 262, 78, 262, 79, 262, 80, 262, 81, 262, + 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, + 97, 262, 98, 262, 99, 262, 100, 262, 102, 262, 104, 262, 105, 262, 106, + 262, 107, 262, 108, 262, 109, 262, 110, 262, 112, 262, 113, 262, 114, + 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, + 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, + 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, + 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, + 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, - 262, 65, 262, 67, 262, 68, 262, 71, 262, 74, 262, 75, 262, 78, 262, 79, - 262, 80, 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, - 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 102, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, - 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, - 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, - 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, - 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, - 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, - 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, - 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, - 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, - 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, - 262, 71, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, - 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, - 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, - 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, - 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, - 262, 69, 262, 70, 262, 71, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, - 262, 79, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, - 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, - 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, - 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, - 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, - 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, - 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, - 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, - 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, - 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, - 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, - 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, - 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, - 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, - 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, - 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, - 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, - 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, - 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, - 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, - 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, + 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, 262, 74, 262, 75, + 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 83, 262, 84, + 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, + 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, + 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, + 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, + 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, + 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 79, 262, 83, 262, 84, + 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, @@ -4136,24 +4163,28 @@ static const unsigned int decomp_data[] = { 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, - 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, - 305, 262, 567, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, - 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, - 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, - 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, - 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, - 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, - 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, - 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, - 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, - 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, - 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, - 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, - 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, - 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, - 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, - 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, - 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, + 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, + 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, + 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, + 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, + 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, + 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, + 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, + 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, + 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, + 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, + 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, + 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, + 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, + 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, + 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, + 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, + 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, + 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, + 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, + 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, + 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, + 119, 262, 120, 262, 121, 262, 122, 262, 305, 262, 567, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, @@ -4178,152 +4209,170 @@ static const unsigned int decomp_data[] = { 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, - 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 988, 262, 989, 262, - 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, - 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, - 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, - 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, - 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, - 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, - 56, 262, 57, 262, 1575, 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262, - 1586, 262, 1581, 262, 1591, 262, 1610, 262, 1603, 262, 1604, 262, 1605, - 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, - 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, - 262, 1592, 262, 1594, 262, 1646, 262, 1722, 262, 1697, 262, 1647, 262, - 1576, 262, 1580, 262, 1607, 262, 1581, 262, 1610, 262, 1603, 262, 1604, + 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, + 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, + 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, + 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, + 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, + 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, + 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, + 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, + 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, + 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, + 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, + 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, + 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, + 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, + 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, + 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, + 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, + 1009, 262, 982, 262, 988, 262, 989, 262, 48, 262, 49, 262, 50, 262, 51, + 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, + 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, + 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, + 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, + 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, + 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 1575, 262, + 1576, 262, 1580, 262, 1583, 262, 1608, 262, 1586, 262, 1581, 262, 1591, + 262, 1610, 262, 1603, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, + 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, + 262, 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 262, + 1646, 262, 1722, 262, 1697, 262, 1647, 262, 1576, 262, 1580, 262, 1607, + 262, 1581, 262, 1610, 262, 1603, 262, 1604, 262, 1605, 262, 1606, 262, + 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1588, 262, 1578, + 262, 1579, 262, 1582, 262, 1590, 262, 1594, 262, 1580, 262, 1581, 262, + 1610, 262, 1604, 262, 1606, 262, 1587, 262, 1593, 262, 1589, 262, 1602, + 262, 1588, 262, 1582, 262, 1590, 262, 1594, 262, 1722, 262, 1647, 262, + 1576, 262, 1580, 262, 1607, 262, 1581, 262, 1591, 262, 1610, 262, 1603, 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, - 1602, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1590, 262, 1594, - 262, 1580, 262, 1581, 262, 1610, 262, 1604, 262, 1606, 262, 1587, 262, - 1593, 262, 1589, 262, 1602, 262, 1588, 262, 1582, 262, 1590, 262, 1594, - 262, 1722, 262, 1647, 262, 1576, 262, 1580, 262, 1607, 262, 1581, 262, - 1591, 262, 1610, 262, 1603, 262, 1605, 262, 1606, 262, 1587, 262, 1593, - 262, 1601, 262, 1589, 262, 1602, 262, 1588, 262, 1578, 262, 1579, 262, - 1582, 262, 1590, 262, 1592, 262, 1594, 262, 1646, 262, 1697, 262, 1575, - 262, 1576, 262, 1580, 262, 1583, 262, 1607, 262, 1608, 262, 1586, 262, - 1581, 262, 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, - 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, - 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, - 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262, 1586, 262, 1581, 262, - 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 1593, - 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, 262, - 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 514, 48, 46, - 514, 48, 44, 514, 49, 44, 514, 50, 44, 514, 51, 44, 514, 52, 44, 514, 53, - 44, 514, 54, 44, 514, 55, 44, 514, 56, 44, 514, 57, 44, 770, 40, 65, 41, - 770, 40, 66, 41, 770, 40, 67, 41, 770, 40, 68, 41, 770, 40, 69, 41, 770, - 40, 70, 41, 770, 40, 71, 41, 770, 40, 72, 41, 770, 40, 73, 41, 770, 40, - 74, 41, 770, 40, 75, 41, 770, 40, 76, 41, 770, 40, 77, 41, 770, 40, 78, - 41, 770, 40, 79, 41, 770, 40, 80, 41, 770, 40, 81, 41, 770, 40, 82, 41, - 770, 40, 83, 41, 770, 40, 84, 41, 770, 40, 85, 41, 770, 40, 86, 41, 770, - 40, 87, 41, 770, 40, 88, 41, 770, 40, 89, 41, 770, 40, 90, 41, 770, - 12308, 83, 12309, 263, 67, 263, 82, 519, 67, 68, 519, 87, 90, 266, 65, - 266, 66, 266, 67, 266, 68, 266, 69, 266, 70, 266, 71, 266, 72, 266, 73, - 266, 74, 266, 75, 266, 76, 266, 77, 266, 78, 266, 79, 266, 80, 266, 81, - 266, 82, 266, 83, 266, 84, 266, 85, 266, 86, 266, 87, 266, 88, 266, 89, - 266, 90, 522, 72, 86, 522, 77, 86, 522, 83, 68, 522, 83, 83, 778, 80, 80, - 86, 522, 87, 67, 515, 77, 67, 515, 77, 68, 515, 77, 82, 522, 68, 74, 522, - 12411, 12363, 522, 12467, 12467, 266, 12469, 266, 25163, 266, 23383, 266, - 21452, 266, 12487, 266, 20108, 266, 22810, 266, 35299, 266, 22825, 266, - 20132, 266, 26144, 266, 28961, 266, 26009, 266, 21069, 266, 24460, 266, - 20877, 266, 26032, 266, 21021, 266, 32066, 266, 29983, 266, 36009, 266, - 22768, 266, 21561, 266, 28436, 266, 25237, 266, 25429, 266, 19968, 266, - 19977, 266, 36938, 266, 24038, 266, 20013, 266, 21491, 266, 25351, 266, - 36208, 266, 25171, 266, 31105, 266, 31354, 266, 21512, 266, 28288, 266, - 26377, 266, 26376, 266, 30003, 266, 21106, 266, 21942, 266, 37197, 770, - 12308, 26412, 12309, 770, 12308, 19977, 12309, 770, 12308, 20108, 12309, - 770, 12308, 23433, 12309, 770, 12308, 28857, 12309, 770, 12308, 25171, - 12309, 770, 12308, 30423, 12309, 770, 12308, 21213, 12309, 770, 12308, - 25943, 12309, 263, 24471, 263, 21487, 256, 20029, 256, 20024, 256, 20033, - 256, 131362, 256, 20320, 256, 20398, 256, 20411, 256, 20482, 256, 20602, - 256, 20633, 256, 20711, 256, 20687, 256, 13470, 256, 132666, 256, 20813, - 256, 20820, 256, 20836, 256, 20855, 256, 132380, 256, 13497, 256, 20839, - 256, 20877, 256, 132427, 256, 20887, 256, 20900, 256, 20172, 256, 20908, - 256, 20917, 256, 168415, 256, 20981, 256, 20995, 256, 13535, 256, 21051, - 256, 21062, 256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, - 256, 21220, 256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, - 256, 21329, 256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, - 256, 21375, 256, 133676, 256, 28784, 256, 21450, 256, 21471, 256, 133987, - 256, 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, - 256, 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, - 256, 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, - 256, 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, - 256, 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, - 256, 22577, 256, 22700, 256, 136420, 256, 22770, 256, 22775, 256, 22790, - 256, 22810, 256, 22818, 256, 22882, 256, 136872, 256, 136938, 256, 23020, - 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076, - 256, 23304, 256, 23358, 256, 23358, 256, 137672, 256, 23491, 256, 23512, - 256, 23527, 256, 23539, 256, 138008, 256, 23551, 256, 23558, 256, 24403, - 256, 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744, 256, 23693, - 256, 138724, 256, 23875, 256, 138726, 256, 23918, 256, 23915, 256, 23932, - 256, 24033, 256, 24034, 256, 14383, 256, 24061, 256, 24104, 256, 24125, - 256, 24169, 256, 14434, 256, 139651, 256, 14460, 256, 24240, 256, 24243, - 256, 24246, 256, 24266, 256, 172946, 256, 24318, 256, 140081, 256, - 140081, 256, 33281, 256, 24354, 256, 24354, 256, 14535, 256, 144056, 256, - 156122, 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, - 24535, 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, - 141012, 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, - 24954, 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, - 25074, 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, - 25300, 256, 25424, 256, 142092, 256, 25405, 256, 25340, 256, 25448, 256, - 25475, 256, 25572, 256, 142321, 256, 25634, 256, 25541, 256, 25513, 256, - 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256, - 25935, 256, 25964, 256, 143370, 256, 26083, 256, 26360, 256, 26185, 256, - 15129, 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885, 256, - 26368, 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395, 256, - 26401, 256, 26462, 256, 26451, 256, 144323, 256, 15177, 256, 26618, 256, - 26501, 256, 26706, 256, 26757, 256, 144493, 256, 26766, 256, 26655, 256, - 26900, 256, 15261, 256, 26946, 256, 27043, 256, 27114, 256, 27304, 256, - 145059, 256, 27355, 256, 15384, 256, 27425, 256, 145575, 256, 27476, 256, - 15438, 256, 27506, 256, 27551, 256, 27578, 256, 27579, 256, 146061, 256, - 138507, 256, 146170, 256, 27726, 256, 146620, 256, 27839, 256, 27853, - 256, 27751, 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, - 256, 28024, 256, 28037, 256, 146718, 256, 27956, 256, 28207, 256, 28270, - 256, 15667, 256, 28363, 256, 28359, 256, 147153, 256, 28153, 256, 28526, - 256, 147294, 256, 147342, 256, 28614, 256, 28729, 256, 28702, 256, 28699, - 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, 132389, - 256, 28997, 256, 148067, 256, 29084, 256, 148395, 256, 29224, 256, 29237, - 256, 29264, 256, 149000, 256, 29312, 256, 29333, 256, 149301, 256, - 149524, 256, 29562, 256, 29579, 256, 16044, 256, 29605, 256, 16056, 256, - 16056, 256, 29767, 256, 29788, 256, 29809, 256, 29829, 256, 29898, 256, - 16155, 256, 29988, 256, 150582, 256, 30014, 256, 150674, 256, 30064, 256, - 139679, 256, 30224, 256, 151457, 256, 151480, 256, 151620, 256, 16380, - 256, 16392, 256, 30452, 256, 151795, 256, 151794, 256, 151833, 256, - 151859, 256, 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, 256, - 30603, 256, 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, 256, - 30924, 256, 16611, 256, 153126, 256, 31062, 256, 153242, 256, 153285, - 256, 31119, 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, - 256, 153980, 256, 154279, 256, 154279, 256, 31470, 256, 16898, 256, - 154539, 256, 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, 256, - 17056, 256, 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, 256, - 17153, 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, 256, - 156231, 256, 17241, 256, 156377, 256, 32634, 256, 156478, 256, 32661, - 256, 32762, 256, 32773, 256, 156890, 256, 156963, 256, 32864, 256, - 157096, 256, 32880, 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, - 17419, 256, 33086, 256, 23221, 256, 157607, 256, 157621, 256, 144275, - 256, 144284, 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, - 256, 33419, 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, - 256, 33510, 256, 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, - 256, 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, - 256, 33740, 256, 33756, 256, 158774, 256, 159083, 256, 158933, 256, - 17707, 256, 34033, 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, - 159532, 256, 17757, 256, 17761, 256, 159665, 256, 159954, 256, 17771, - 256, 34384, 256, 34396, 256, 34407, 256, 34409, 256, 34473, 256, 34440, - 256, 34574, 256, 34530, 256, 34681, 256, 34600, 256, 34667, 256, 34694, - 256, 17879, 256, 34785, 256, 34817, 256, 17913, 256, 34912, 256, 34915, - 256, 161383, 256, 35031, 256, 35038, 256, 17973, 256, 35066, 256, 13499, - 256, 161966, 256, 162150, 256, 18110, 256, 18119, 256, 35488, 256, 35565, - 256, 35722, 256, 35925, 256, 162984, 256, 36011, 256, 36033, 256, 36123, - 256, 36215, 256, 163631, 256, 133124, 256, 36299, 256, 36284, 256, 36336, - 256, 133342, 256, 36564, 256, 36664, 256, 165330, 256, 165357, 256, - 37012, 256, 37105, 256, 37137, 256, 165678, 256, 37147, 256, 37432, 256, - 37591, 256, 37592, 256, 37500, 256, 37881, 256, 37909, 256, 166906, 256, - 38283, 256, 18837, 256, 38327, 256, 167287, 256, 18918, 256, 38595, 256, - 23986, 256, 38691, 256, 168261, 256, 168474, 256, 19054, 256, 19062, 256, - 38880, 256, 168970, 256, 19122, 256, 169110, 256, 38923, 256, 38923, 256, - 38953, 256, 169398, 256, 39138, 256, 19251, 256, 39209, 256, 39335, 256, - 39362, 256, 39422, 256, 19406, 256, 170800, 256, 39698, 256, 40000, 256, - 40189, 256, 19662, 256, 19693, 256, 40295, 256, 172238, 256, 19704, 256, - 172293, 256, 172558, 256, 172689, 256, 40635, 256, 19798, 256, 40697, - 256, 40702, 256, 40709, 256, 40719, 256, 40726, 256, 40763, 256, 173568, + 1602, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1590, 262, 1592, + 262, 1594, 262, 1646, 262, 1697, 262, 1575, 262, 1576, 262, 1580, 262, + 1583, 262, 1607, 262, 1608, 262, 1586, 262, 1581, 262, 1591, 262, 1610, + 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, + 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, + 262, 1584, 262, 1590, 262, 1592, 262, 1594, 262, 1576, 262, 1580, 262, + 1583, 262, 1608, 262, 1586, 262, 1581, 262, 1591, 262, 1610, 262, 1604, + 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, + 1602, 262, 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, + 262, 1590, 262, 1592, 262, 1594, 514, 48, 46, 514, 48, 44, 514, 49, 44, + 514, 50, 44, 514, 51, 44, 514, 52, 44, 514, 53, 44, 514, 54, 44, 514, 55, + 44, 514, 56, 44, 514, 57, 44, 770, 40, 65, 41, 770, 40, 66, 41, 770, 40, + 67, 41, 770, 40, 68, 41, 770, 40, 69, 41, 770, 40, 70, 41, 770, 40, 71, + 41, 770, 40, 72, 41, 770, 40, 73, 41, 770, 40, 74, 41, 770, 40, 75, 41, + 770, 40, 76, 41, 770, 40, 77, 41, 770, 40, 78, 41, 770, 40, 79, 41, 770, + 40, 80, 41, 770, 40, 81, 41, 770, 40, 82, 41, 770, 40, 83, 41, 770, 40, + 84, 41, 770, 40, 85, 41, 770, 40, 86, 41, 770, 40, 87, 41, 770, 40, 88, + 41, 770, 40, 89, 41, 770, 40, 90, 41, 770, 12308, 83, 12309, 263, 67, + 263, 82, 519, 67, 68, 519, 87, 90, 266, 65, 266, 66, 266, 67, 266, 68, + 266, 69, 266, 70, 266, 71, 266, 72, 266, 73, 266, 74, 266, 75, 266, 76, + 266, 77, 266, 78, 266, 79, 266, 80, 266, 81, 266, 82, 266, 83, 266, 84, + 266, 85, 266, 86, 266, 87, 266, 88, 266, 89, 266, 90, 522, 72, 86, 522, + 77, 86, 522, 83, 68, 522, 83, 83, 778, 80, 80, 86, 522, 87, 67, 515, 77, + 67, 515, 77, 68, 515, 77, 82, 522, 68, 74, 522, 12411, 12363, 522, 12467, + 12467, 266, 12469, 266, 25163, 266, 23383, 266, 21452, 266, 12487, 266, + 20108, 266, 22810, 266, 35299, 266, 22825, 266, 20132, 266, 26144, 266, + 28961, 266, 26009, 266, 21069, 266, 24460, 266, 20877, 266, 26032, 266, + 21021, 266, 32066, 266, 29983, 266, 36009, 266, 22768, 266, 21561, 266, + 28436, 266, 25237, 266, 25429, 266, 19968, 266, 19977, 266, 36938, 266, + 24038, 266, 20013, 266, 21491, 266, 25351, 266, 36208, 266, 25171, 266, + 31105, 266, 31354, 266, 21512, 266, 28288, 266, 26377, 266, 26376, 266, + 30003, 266, 21106, 266, 21942, 266, 37197, 770, 12308, 26412, 12309, 770, + 12308, 19977, 12309, 770, 12308, 20108, 12309, 770, 12308, 23433, 12309, + 770, 12308, 28857, 12309, 770, 12308, 25171, 12309, 770, 12308, 30423, + 12309, 770, 12308, 21213, 12309, 770, 12308, 25943, 12309, 263, 24471, + 263, 21487, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, + 54, 262, 55, 262, 56, 262, 57, 256, 20029, 256, 20024, 256, 20033, 256, + 131362, 256, 20320, 256, 20398, 256, 20411, 256, 20482, 256, 20602, 256, + 20633, 256, 20711, 256, 20687, 256, 13470, 256, 132666, 256, 20813, 256, + 20820, 256, 20836, 256, 20855, 256, 132380, 256, 13497, 256, 20839, 256, + 20877, 256, 132427, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, + 20917, 256, 168415, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, + 21062, 256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, + 21220, 256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, + 21329, 256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, + 21375, 256, 133676, 256, 28784, 256, 21450, 256, 21471, 256, 133987, 256, + 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 256, + 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 256, + 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 256, + 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 256, + 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 256, + 22577, 256, 22700, 256, 136420, 256, 22770, 256, 22775, 256, 22790, 256, + 22810, 256, 22818, 256, 22882, 256, 136872, 256, 136938, 256, 23020, 256, + 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076, 256, + 23304, 256, 23358, 256, 23358, 256, 137672, 256, 23491, 256, 23512, 256, + 23527, 256, 23539, 256, 138008, 256, 23551, 256, 23558, 256, 24403, 256, + 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744, 256, 23693, 256, + 138724, 256, 23875, 256, 138726, 256, 23918, 256, 23915, 256, 23932, 256, + 24033, 256, 24034, 256, 14383, 256, 24061, 256, 24104, 256, 24125, 256, + 24169, 256, 14434, 256, 139651, 256, 14460, 256, 24240, 256, 24243, 256, + 24246, 256, 24266, 256, 172946, 256, 24318, 256, 140081, 256, 140081, + 256, 33281, 256, 24354, 256, 24354, 256, 14535, 256, 144056, 256, 156122, + 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 24535, + 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 141012, + 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, 24954, + 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, 25074, + 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, 25300, + 256, 25424, 256, 142092, 256, 25405, 256, 25340, 256, 25448, 256, 25475, + 256, 25572, 256, 142321, 256, 25634, 256, 25541, 256, 25513, 256, 14894, + 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256, 25935, + 256, 25964, 256, 143370, 256, 26083, 256, 26360, 256, 26185, 256, 15129, + 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885, 256, 26368, + 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395, 256, 26401, + 256, 26462, 256, 26451, 256, 144323, 256, 15177, 256, 26618, 256, 26501, + 256, 26706, 256, 26757, 256, 144493, 256, 26766, 256, 26655, 256, 26900, + 256, 15261, 256, 26946, 256, 27043, 256, 27114, 256, 27304, 256, 145059, + 256, 27355, 256, 15384, 256, 27425, 256, 145575, 256, 27476, 256, 15438, + 256, 27506, 256, 27551, 256, 27578, 256, 27579, 256, 146061, 256, 138507, + 256, 146170, 256, 27726, 256, 146620, 256, 27839, 256, 27853, 256, 27751, + 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, + 256, 28037, 256, 146718, 256, 27956, 256, 28207, 256, 28270, 256, 15667, + 256, 28363, 256, 28359, 256, 147153, 256, 28153, 256, 28526, 256, 147294, + 256, 147342, 256, 28614, 256, 28729, 256, 28702, 256, 28699, 256, 15766, + 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, 132389, 256, 28997, + 256, 148067, 256, 29084, 256, 148395, 256, 29224, 256, 29237, 256, 29264, + 256, 149000, 256, 29312, 256, 29333, 256, 149301, 256, 149524, 256, + 29562, 256, 29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, + 29767, 256, 29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, + 29988, 256, 150582, 256, 30014, 256, 150674, 256, 30064, 256, 139679, + 256, 30224, 256, 151457, 256, 151480, 256, 151620, 256, 16380, 256, + 16392, 256, 30452, 256, 151795, 256, 151794, 256, 151833, 256, 151859, + 256, 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, 256, 30603, + 256, 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, 256, 30924, + 256, 16611, 256, 153126, 256, 31062, 256, 153242, 256, 153285, 256, + 31119, 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, + 153980, 256, 154279, 256, 154279, 256, 31470, 256, 16898, 256, 154539, + 256, 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, 256, 17056, + 256, 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, 256, 17153, + 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, 256, 156231, + 256, 17241, 256, 156377, 256, 32634, 256, 156478, 256, 32661, 256, 32762, + 256, 32773, 256, 156890, 256, 156963, 256, 32864, 256, 157096, 256, + 32880, 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, + 33086, 256, 23221, 256, 157607, 256, 157621, 256, 144275, 256, 144284, + 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419, + 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510, + 256, 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, 256, 33571, + 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, 256, 33740, + 256, 33756, 256, 158774, 256, 159083, 256, 158933, 256, 17707, 256, + 34033, 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, 159532, 256, + 17757, 256, 17761, 256, 159665, 256, 159954, 256, 17771, 256, 34384, 256, + 34396, 256, 34407, 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, + 34530, 256, 34681, 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, + 34785, 256, 34817, 256, 17913, 256, 34912, 256, 34915, 256, 161383, 256, + 35031, 256, 35038, 256, 17973, 256, 35066, 256, 13499, 256, 161966, 256, + 162150, 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, + 35925, 256, 162984, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256, + 163631, 256, 133124, 256, 36299, 256, 36284, 256, 36336, 256, 133342, + 256, 36564, 256, 36664, 256, 165330, 256, 165357, 256, 37012, 256, 37105, + 256, 37137, 256, 165678, 256, 37147, 256, 37432, 256, 37591, 256, 37592, + 256, 37500, 256, 37881, 256, 37909, 256, 166906, 256, 38283, 256, 18837, + 256, 38327, 256, 167287, 256, 18918, 256, 38595, 256, 23986, 256, 38691, + 256, 168261, 256, 168474, 256, 19054, 256, 19062, 256, 38880, 256, + 168970, 256, 19122, 256, 169110, 256, 38923, 256, 38923, 256, 38953, 256, + 169398, 256, 39138, 256, 19251, 256, 39209, 256, 39335, 256, 39362, 256, + 39422, 256, 19406, 256, 170800, 256, 39698, 256, 40000, 256, 40189, 256, + 19662, 256, 19693, 256, 40295, 256, 172238, 256, 19704, 256, 172293, 256, + 172558, 256, 172689, 256, 40635, 256, 19798, 256, 40697, 256, 40702, 256, + 40709, 256, 40719, 256, 40726, 256, 40763, 256, 173568, }; /* index tables for the decomposition data */ @@ -4353,8 +4402,7 @@ static const unsigned char decomp_index1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, 80, 0, - 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 81, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4368,11 +4416,12 @@ static const unsigned char decomp_index1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, 85, - 86, 87, 88, 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 93, 0, 0, 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 85, 86, + 87, 88, 89, 90, 91, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 93, 94, 0, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4393,7 +4442,7 @@ static const unsigned char decomp_index1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 98, 99, 100, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 101, 102, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4692,7 +4741,7 @@ static const unsigned char decomp_index1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const unsigned short decomp_index2[] = { @@ -5124,802 +5173,821 @@ static const unsigned short decomp_index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6659, 6661, 6663, 6665, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6667, 6669, 6671, 6673, 6675, 6677, 6679, 6681, - 6683, 6685, 6687, 6689, 6691, 6693, 6695, 6697, 6699, 6701, 6703, 6705, - 6707, 6709, 6711, 6713, 6715, 6717, 6719, 6721, 6723, 6725, 6727, 6729, - 6731, 6733, 6735, 6737, 6739, 6741, 6743, 6745, 6747, 6749, 6751, 6753, - 6755, 6757, 6759, 6761, 6763, 6765, 6767, 6769, 6771, 6773, 6775, 6777, - 6779, 6781, 6783, 6785, 6787, 6789, 6791, 6793, 6795, 6797, 6799, 6801, - 6803, 6805, 6807, 6809, 6811, 6813, 6815, 6817, 6819, 6821, 6823, 6825, - 6827, 6829, 6831, 6833, 6835, 6837, 6839, 6841, 6843, 6845, 6847, 6849, - 6851, 6853, 6855, 6857, 6859, 6861, 6863, 6865, 6867, 6869, 6871, 6873, - 6875, 6877, 6879, 6881, 6883, 6885, 6887, 6889, 6891, 6893, 6895, 6897, - 6899, 6901, 6903, 6905, 6907, 6909, 6911, 6913, 6915, 6917, 6919, 6921, - 6923, 6925, 6927, 6929, 6931, 6933, 6935, 6937, 6939, 6941, 6943, 6945, - 6947, 6949, 6951, 6953, 6955, 6957, 6959, 6961, 6963, 6965, 6967, 6969, - 6971, 6973, 6975, 6977, 6979, 6981, 6983, 6985, 6987, 6989, 6991, 6993, - 6995, 6997, 6999, 7001, 7003, 7005, 7007, 7009, 7011, 7013, 7015, 7017, - 7019, 7021, 7023, 7025, 7027, 7029, 7031, 7033, 7035, 7037, 7039, 7041, - 7043, 7045, 7047, 7049, 7051, 7053, 7055, 7057, 7059, 7061, 7063, 7065, - 7067, 7069, 7071, 7073, 7075, 7077, 7079, 7081, 7083, 7085, 7087, 7089, - 7091, 7093, 7095, 7097, 7099, 7101, 7103, 7105, 7107, 7109, 7111, 7113, - 7115, 7117, 7119, 7121, 7123, 7125, 7127, 7129, 7131, 7133, 7135, 7137, - 7139, 7141, 7143, 7145, 7147, 7149, 7151, 7153, 7155, 7157, 7159, 7161, - 7163, 7165, 7167, 7169, 7171, 7173, 7175, 7177, 7179, 7181, 7183, 7185, - 7187, 7189, 7191, 7193, 7195, 7197, 7199, 7201, 7203, 7205, 0, 0, 7207, - 0, 7209, 0, 0, 7211, 7213, 7215, 7217, 7219, 7221, 7223, 7225, 7227, - 7229, 0, 7231, 0, 7233, 0, 0, 7235, 7237, 0, 0, 0, 7239, 7241, 7243, - 7245, 7247, 7249, 7251, 7253, 7255, 7257, 7259, 7261, 7263, 7265, 7267, - 7269, 7271, 7273, 7275, 7277, 7279, 7281, 7283, 7285, 7287, 7289, 7291, - 7293, 7295, 7297, 7299, 7301, 7303, 7305, 7307, 7309, 7311, 7313, 7315, - 7317, 7319, 7321, 7323, 7325, 7327, 7329, 7331, 7333, 7335, 7337, 7339, - 7341, 7343, 7345, 7347, 7349, 7351, 7353, 7355, 7357, 7359, 7361, 7363, - 7365, 7367, 7369, 7371, 7373, 0, 0, 7375, 7377, 7379, 7381, 7383, 7385, - 7387, 7389, 7391, 7393, 7395, 7397, 7399, 7401, 7403, 7405, 7407, 7409, - 7411, 7413, 7415, 7417, 7419, 7421, 7423, 7425, 7427, 7429, 7431, 7433, - 7435, 7437, 7439, 7441, 7443, 7445, 7447, 7449, 7451, 7453, 7455, 7457, - 7459, 7461, 7463, 7465, 7467, 7469, 7471, 7473, 7475, 7477, 7479, 7481, - 7483, 7485, 7487, 7489, 7491, 7493, 7495, 7497, 7499, 7501, 7503, 7505, - 7507, 7509, 7511, 7513, 7515, 7517, 7519, 7521, 7523, 7525, 7527, 7529, - 7531, 7533, 7535, 7537, 7539, 7541, 7543, 7545, 7547, 7549, 7551, 7553, - 7555, 7557, 7559, 7561, 7563, 7565, 7567, 7569, 7571, 7573, 7575, 7577, - 7579, 7581, 7583, 7585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7587, - 7590, 7593, 7596, 7600, 7604, 7607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7610, 7613, 7616, 7619, 7622, 0, 0, 0, 0, 0, 7625, 0, 7628, 7631, 7633, - 7635, 7637, 7639, 7641, 7643, 7645, 7647, 7649, 7651, 7654, 7657, 7660, - 7663, 7666, 7669, 7672, 7675, 7678, 7681, 7684, 7687, 0, 7690, 7693, - 7696, 7699, 7702, 0, 7705, 0, 7708, 7711, 0, 7714, 7717, 0, 7720, 7723, - 7726, 7729, 7732, 7735, 7738, 7741, 7744, 7747, 7750, 7752, 7754, 7756, - 7758, 7760, 7762, 7764, 7766, 7768, 7770, 7772, 7774, 7776, 7778, 7780, - 7782, 7784, 7786, 7788, 7790, 7792, 7794, 7796, 7798, 7800, 7802, 7804, - 7806, 7808, 7810, 7812, 7814, 7816, 7818, 7820, 7822, 7824, 7826, 7828, - 7830, 7832, 7834, 7836, 7838, 7840, 7842, 7844, 7846, 7848, 7850, 7852, - 7854, 7856, 7858, 7860, 7862, 7864, 7866, 7868, 7870, 7872, 7874, 7876, - 7878, 7880, 7882, 7884, 7886, 7888, 7890, 7892, 7894, 7896, 7898, 7900, - 7902, 7904, 7906, 7908, 7910, 7912, 7914, 7916, 7918, 7920, 7922, 7924, - 7926, 7928, 7930, 7932, 7934, 7936, 7938, 7940, 7942, 7944, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7946, 7948, 7950, 7952, 7954, 7956, 7958, 7960, 7962, - 7964, 7966, 7968, 7970, 7972, 7974, 7976, 7978, 7980, 7982, 7984, 7986, - 7988, 7990, 7992, 7995, 7998, 8001, 8004, 8007, 8010, 8013, 8016, 8019, - 8022, 8025, 8028, 8031, 8034, 8037, 8040, 8043, 8046, 8048, 8050, 8052, - 8054, 8057, 8060, 8063, 8066, 8069, 8072, 8075, 8078, 8081, 8084, 8087, - 8090, 8093, 8096, 8099, 8102, 8105, 8108, 8111, 8114, 8117, 8120, 8123, - 8126, 8129, 8132, 8135, 8138, 8141, 8144, 8147, 8150, 8153, 8156, 8159, - 8162, 8165, 8168, 8171, 8174, 8177, 8180, 8183, 8186, 8189, 8192, 8195, - 8198, 8201, 8204, 8207, 8210, 8213, 8216, 8219, 8222, 8225, 8228, 8231, - 8234, 8237, 8240, 8243, 8246, 8249, 8252, 8255, 8258, 8261, 8264, 8267, - 8270, 8273, 8276, 8279, 8282, 8285, 8288, 8291, 8294, 8297, 8300, 8303, - 8306, 8309, 8312, 8315, 8318, 8321, 8324, 8327, 8330, 8333, 8336, 8340, - 8344, 8348, 8352, 8356, 8360, 8363, 8366, 8369, 8372, 8375, 8378, 8381, - 8384, 8387, 8390, 8393, 8396, 8399, 8402, 8405, 8408, 8411, 8414, 8417, - 8420, 8423, 8426, 8429, 8432, 8435, 8438, 8441, 8444, 8447, 8450, 8453, - 8456, 8459, 8462, 8465, 8468, 8471, 8474, 8477, 8480, 8483, 8486, 8489, - 8492, 8495, 8498, 8501, 8504, 8507, 8510, 8513, 8516, 8519, 8522, 8525, - 8528, 8531, 8534, 8537, 8540, 8543, 8546, 8549, 8552, 8555, 8558, 8561, - 8564, 8567, 8570, 8573, 8576, 8579, 8582, 8585, 8588, 8591, 8594, 8597, - 8600, 8603, 8606, 8609, 8612, 8615, 8618, 8621, 8624, 8627, 8630, 8633, - 8636, 8639, 8642, 8645, 8648, 8651, 8654, 8657, 8660, 8663, 8666, 8669, - 8672, 8675, 8678, 8681, 8684, 8687, 8690, 8693, 8696, 8699, 8702, 8705, - 8708, 8711, 8714, 8717, 8720, 8723, 8726, 8729, 8732, 8735, 8738, 8741, - 8744, 8747, 8750, 8753, 8756, 8759, 8762, 8765, 8768, 8771, 8774, 8777, - 8780, 8783, 8786, 8790, 8794, 8798, 8801, 8804, 8807, 8810, 8813, 8816, - 8819, 8822, 8825, 8828, 8831, 8834, 8837, 8840, 8843, 8846, 8849, 8852, - 8855, 8858, 8861, 8864, 8867, 8870, 8873, 8876, 8879, 8882, 8885, 8888, - 8891, 8894, 8897, 8900, 8903, 8906, 8909, 8912, 8915, 8918, 8921, 8924, - 8927, 8930, 8933, 8936, 8939, 8942, 8945, 8948, 8951, 8954, 8957, 8960, - 8963, 8966, 8969, 8972, 8975, 8978, 8981, 8984, 8987, 8990, 8993, 8996, - 8999, 9002, 9005, 9008, 9011, 9014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9017, 9021, 9025, 9029, 9033, 9037, 9041, 9045, 9049, - 9053, 9057, 9061, 9065, 9069, 9073, 9077, 9081, 9085, 9089, 9093, 9097, - 9101, 9105, 9109, 9113, 9117, 9121, 9125, 9129, 9133, 9137, 9141, 9145, - 9149, 9153, 9157, 9161, 9165, 9169, 9173, 9177, 9181, 9185, 9189, 9193, - 9197, 9201, 9205, 9209, 9213, 9217, 9221, 9225, 9229, 9233, 9237, 9241, - 9245, 9249, 9253, 9257, 9261, 9265, 9269, 0, 0, 9273, 9277, 9281, 9285, - 9289, 9293, 9297, 9301, 9305, 9309, 9313, 9317, 9321, 9325, 9329, 9333, - 9337, 9341, 9345, 9349, 9353, 9357, 9361, 9365, 9369, 9373, 9377, 9381, - 9385, 9389, 9393, 9397, 9401, 9405, 9409, 9413, 9417, 9421, 9425, 9429, - 9433, 9437, 9441, 9445, 9449, 9453, 9457, 9461, 9465, 9469, 9473, 9477, - 9481, 9485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9489, 9493, - 9497, 9502, 9507, 9512, 9517, 9522, 9527, 9532, 9536, 9555, 9564, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9569, 9571, 9573, - 9575, 9577, 9579, 9581, 9583, 9585, 9587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9589, 9591, 9593, 9595, 9597, 9599, - 9601, 9603, 9605, 9607, 9609, 9611, 9613, 9615, 9617, 9619, 9621, 9623, - 9625, 9627, 9629, 0, 0, 9631, 9633, 9635, 9637, 9639, 9641, 9643, 9645, - 9647, 9649, 9651, 9653, 0, 9655, 9657, 9659, 9661, 9663, 9665, 9667, - 9669, 9671, 9673, 9675, 9677, 9679, 9681, 9683, 9685, 9687, 9689, 9691, - 0, 9693, 9695, 9697, 9699, 0, 0, 0, 0, 9701, 9704, 9707, 0, 9710, 0, - 9713, 9716, 9719, 9722, 9725, 9728, 9731, 9734, 9737, 9740, 9743, 9745, - 9747, 9749, 9751, 9753, 9755, 9757, 9759, 9761, 9763, 9765, 9767, 9769, - 9771, 9773, 9775, 9777, 9779, 9781, 9783, 9785, 9787, 9789, 9791, 9793, - 9795, 9797, 9799, 9801, 9803, 9805, 9807, 9809, 9811, 9813, 9815, 9817, - 9819, 9821, 9823, 9825, 9827, 9829, 9831, 9833, 9835, 9837, 9839, 9841, - 9843, 9845, 9847, 9849, 9851, 9853, 9855, 9857, 9859, 9861, 9863, 9865, - 9867, 9869, 9871, 9873, 9875, 9877, 9879, 9881, 9883, 9885, 9887, 9889, - 9891, 9893, 9895, 9897, 9899, 9901, 9903, 9905, 9907, 9909, 9911, 9913, - 9915, 9917, 9919, 9921, 9923, 9925, 9927, 9929, 9931, 9933, 9935, 9937, - 9939, 9941, 9943, 9945, 9947, 9949, 9951, 9953, 9955, 9957, 9959, 9961, - 9963, 9965, 9967, 9969, 9971, 9973, 9975, 9977, 9980, 9983, 9986, 9989, - 9992, 9995, 9998, 0, 0, 0, 0, 10001, 10003, 10005, 10007, 10009, 10011, - 10013, 10015, 10017, 10019, 10021, 10023, 10025, 10027, 10029, 10031, - 10033, 10035, 10037, 10039, 10041, 10043, 10045, 10047, 10049, 10051, - 10053, 10055, 10057, 10059, 10061, 10063, 10065, 10067, 10069, 10071, - 10073, 10075, 10077, 10079, 10081, 10083, 10085, 10087, 10089, 10091, - 10093, 10095, 10097, 10099, 10101, 10103, 10105, 10107, 10109, 10111, - 10113, 10115, 10117, 10119, 10121, 10123, 10125, 10127, 10129, 10131, - 10133, 10135, 10137, 10139, 10141, 10143, 10145, 10147, 10149, 10151, - 10153, 10155, 10157, 10159, 10161, 10163, 10165, 10167, 10169, 10171, - 10173, 10175, 10177, 10179, 10181, 10183, 10185, 10187, 10189, 10191, - 10193, 10195, 10197, 10199, 10201, 10203, 10205, 10207, 10209, 10211, - 10213, 10215, 10217, 10219, 10221, 10223, 10225, 10227, 10229, 10231, - 10233, 10235, 10237, 10239, 10241, 10243, 10245, 10247, 10249, 10251, - 10253, 10255, 10257, 10259, 10261, 10263, 10265, 10267, 10269, 10271, - 10273, 10275, 10277, 10279, 10281, 10283, 10285, 10287, 10289, 10291, - 10293, 10295, 10297, 10299, 10301, 10303, 10305, 10307, 10309, 10311, - 10313, 10315, 10317, 10319, 10321, 10323, 10325, 10327, 10329, 10331, - 10333, 10335, 10337, 10339, 10341, 10343, 10345, 10347, 10349, 10351, - 10353, 10355, 10357, 10359, 10361, 10363, 10365, 10367, 10369, 10371, - 10373, 10375, 10377, 10379, 0, 0, 0, 10381, 10383, 10385, 10387, 10389, - 10391, 0, 0, 10393, 10395, 10397, 10399, 10401, 10403, 0, 0, 10405, - 10407, 10409, 10411, 10413, 10415, 0, 0, 10417, 10419, 10421, 0, 0, 0, - 10423, 10425, 10427, 10429, 10431, 10433, 10435, 0, 10437, 10439, 10441, - 10443, 10445, 10447, 10449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10451, 0, 10454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10460, 10463, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10466, 10469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10472, - 10475, 0, 10478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10481, 10484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10487, 10490, 10493, 10496, 10499, 10502, 10505, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10508, 10511, 10514, 10517, 10520, - 10523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10526, 10528, 10530, - 10532, 10534, 10536, 10538, 10540, 10542, 10544, 10546, 10548, 10550, - 10552, 10554, 10556, 10558, 10560, 10562, 10564, 10566, 10568, 10570, - 10572, 10574, 10576, 10578, 10580, 10582, 10584, 10586, 10588, 10590, - 10592, 10594, 10596, 10598, 10600, 10602, 10604, 10606, 10608, 10610, - 10612, 10614, 10616, 10618, 10620, 10622, 10624, 10626, 10628, 10630, - 10632, 10634, 10636, 10638, 10640, 10642, 10644, 10646, 10648, 10650, - 10652, 10654, 10656, 10658, 10660, 10662, 10664, 10666, 10668, 10670, - 10672, 10674, 10676, 10678, 10680, 10682, 10684, 10686, 10688, 10690, - 10692, 10694, 0, 10696, 10698, 10700, 10702, 10704, 10706, 10708, 10710, - 10712, 10714, 10716, 10718, 10720, 10722, 10724, 10726, 10728, 10730, - 10732, 10734, 10736, 10738, 10740, 10742, 10744, 10746, 10748, 10750, - 10752, 10754, 10756, 10758, 10760, 10762, 10764, 10766, 10768, 10770, - 10772, 10774, 10776, 10778, 10780, 10782, 10784, 10786, 10788, 10790, - 10792, 10794, 10796, 10798, 10800, 10802, 10804, 10806, 10808, 10810, - 10812, 10814, 10816, 10818, 10820, 10822, 10824, 10826, 10828, 10830, - 10832, 10834, 10836, 0, 10838, 10840, 0, 0, 10842, 0, 0, 10844, 10846, 0, - 0, 10848, 10850, 10852, 10854, 0, 10856, 10858, 10860, 10862, 10864, - 10866, 10868, 10870, 10872, 10874, 10876, 10878, 0, 10880, 0, 10882, - 10884, 10886, 10888, 10890, 10892, 10894, 0, 10896, 10898, 10900, 10902, - 10904, 10906, 10908, 10910, 10912, 10914, 10916, 10918, 10920, 10922, - 10924, 10926, 10928, 10930, 10932, 10934, 10936, 10938, 10940, 10942, - 10944, 10946, 10948, 10950, 10952, 10954, 10956, 10958, 10960, 10962, - 10964, 10966, 10968, 10970, 10972, 10974, 10976, 10978, 10980, 10982, - 10984, 10986, 10988, 10990, 10992, 10994, 10996, 10998, 11000, 11002, - 11004, 11006, 11008, 11010, 11012, 11014, 11016, 11018, 11020, 11022, - 11024, 0, 11026, 11028, 11030, 11032, 0, 0, 11034, 11036, 11038, 11040, - 11042, 11044, 11046, 11048, 0, 11050, 11052, 11054, 11056, 11058, 11060, - 11062, 0, 11064, 11066, 11068, 11070, 11072, 11074, 11076, 11078, 11080, - 11082, 11084, 11086, 11088, 11090, 11092, 11094, 11096, 11098, 11100, - 11102, 11104, 11106, 11108, 11110, 11112, 11114, 11116, 11118, 0, 11120, - 11122, 11124, 11126, 0, 11128, 11130, 11132, 11134, 11136, 0, 11138, 0, - 0, 0, 11140, 11142, 11144, 11146, 11148, 11150, 11152, 0, 11154, 11156, - 11158, 11160, 11162, 11164, 11166, 11168, 11170, 11172, 11174, 11176, - 11178, 11180, 11182, 11184, 11186, 11188, 11190, 11192, 11194, 11196, - 11198, 11200, 11202, 11204, 11206, 11208, 11210, 11212, 11214, 11216, - 11218, 11220, 11222, 11224, 11226, 11228, 11230, 11232, 11234, 11236, - 11238, 11240, 11242, 11244, 11246, 11248, 11250, 11252, 11254, 11256, - 11258, 11260, 11262, 11264, 11266, 11268, 11270, 11272, 11274, 11276, - 11278, 11280, 11282, 11284, 11286, 11288, 11290, 11292, 11294, 11296, - 11298, 11300, 11302, 11304, 11306, 11308, 11310, 11312, 11314, 11316, - 11318, 11320, 11322, 11324, 11326, 11328, 11330, 11332, 11334, 11336, - 11338, 11340, 11342, 11344, 11346, 11348, 11350, 11352, 11354, 11356, - 11358, 11360, 11362, 11364, 11366, 11368, 11370, 11372, 11374, 11376, - 11378, 11380, 11382, 11384, 11386, 11388, 11390, 11392, 11394, 11396, - 11398, 11400, 11402, 11404, 11406, 11408, 11410, 11412, 11414, 11416, - 11418, 11420, 11422, 11424, 11426, 11428, 11430, 11432, 11434, 11436, - 11438, 11440, 11442, 11444, 11446, 11448, 11450, 11452, 11454, 11456, - 11458, 11460, 11462, 11464, 11466, 11468, 11470, 11472, 11474, 11476, - 11478, 11480, 11482, 11484, 11486, 11488, 11490, 11492, 11494, 11496, - 11498, 11500, 11502, 11504, 11506, 11508, 11510, 11512, 11514, 11516, - 11518, 11520, 11522, 11524, 11526, 11528, 11530, 11532, 11534, 11536, - 11538, 11540, 11542, 11544, 11546, 11548, 11550, 11552, 11554, 11556, - 11558, 11560, 11562, 11564, 11566, 11568, 11570, 11572, 11574, 11576, - 11578, 11580, 11582, 11584, 11586, 11588, 11590, 11592, 11594, 11596, - 11598, 11600, 11602, 11604, 11606, 11608, 11610, 11612, 11614, 11616, - 11618, 11620, 11622, 11624, 11626, 11628, 11630, 11632, 11634, 11636, - 11638, 11640, 11642, 11644, 11646, 11648, 11650, 11652, 11654, 11656, - 11658, 11660, 11662, 11664, 11666, 11668, 11670, 11672, 11674, 11676, - 11678, 11680, 11682, 11684, 11686, 11688, 11690, 11692, 11694, 11696, - 11698, 11700, 11702, 11704, 11706, 11708, 11710, 11712, 11714, 11716, - 11718, 11720, 11722, 11724, 11726, 11728, 11730, 11732, 11734, 11736, - 11738, 11740, 11742, 11744, 11746, 11748, 11750, 11752, 11754, 11756, - 11758, 11760, 11762, 11764, 11766, 11768, 11770, 11772, 11774, 11776, - 11778, 11780, 11782, 11784, 11786, 11788, 11790, 11792, 11794, 11796, - 11798, 11800, 11802, 11804, 11806, 11808, 11810, 11812, 11814, 11816, - 11818, 11820, 11822, 11824, 11826, 11828, 11830, 11832, 0, 0, 11834, - 11836, 11838, 11840, 11842, 11844, 11846, 11848, 11850, 11852, 11854, - 11856, 11858, 11860, 11862, 11864, 11866, 11868, 11870, 11872, 11874, - 11876, 11878, 11880, 11882, 11884, 11886, 11888, 11890, 11892, 11894, - 11896, 11898, 11900, 11902, 11904, 11906, 11908, 11910, 11912, 11914, - 11916, 11918, 11920, 11922, 11924, 11926, 11928, 11930, 11932, 11934, - 11936, 11938, 11940, 11942, 11944, 11946, 11948, 11950, 11952, 11954, - 11956, 11958, 11960, 11962, 11964, 11966, 11968, 11970, 11972, 11974, - 11976, 11978, 11980, 11982, 11984, 11986, 11988, 11990, 11992, 11994, - 11996, 11998, 12000, 12002, 12004, 12006, 12008, 12010, 12012, 12014, - 12016, 12018, 12020, 12022, 12024, 12026, 12028, 12030, 12032, 12034, - 12036, 12038, 12040, 12042, 12044, 12046, 12048, 12050, 12052, 12054, - 12056, 12058, 12060, 12062, 12064, 12066, 12068, 12070, 12072, 12074, - 12076, 12078, 12080, 12082, 12084, 12086, 12088, 12090, 12092, 12094, - 12096, 12098, 12100, 12102, 12104, 12106, 12108, 12110, 12112, 12114, - 12116, 12118, 12120, 12122, 12124, 12126, 12128, 12130, 12132, 12134, - 12136, 12138, 12140, 12142, 12144, 12146, 12148, 12150, 12152, 12154, - 12156, 12158, 12160, 12162, 12164, 12166, 12168, 12170, 12172, 12174, - 12176, 12178, 12180, 12182, 12184, 12186, 12188, 12190, 12192, 12194, - 12196, 12198, 12200, 12202, 12204, 12206, 12208, 12210, 12212, 12214, - 12216, 12218, 12220, 12222, 12224, 12226, 12228, 12230, 12232, 12234, - 12236, 12238, 12240, 12242, 12244, 12246, 12248, 12250, 12252, 12254, - 12256, 12258, 12260, 12262, 12264, 12266, 12268, 12270, 12272, 12274, - 12276, 12278, 12280, 12282, 12284, 12286, 12288, 12290, 12292, 12294, - 12296, 12298, 12300, 12302, 12304, 12306, 12308, 12310, 12312, 12314, - 12316, 12318, 12320, 12322, 12324, 12326, 12328, 12330, 12332, 12334, - 12336, 12338, 12340, 12342, 12344, 12346, 12348, 12350, 12352, 12354, - 12356, 12358, 12360, 12362, 12364, 12366, 12368, 12370, 12372, 12374, - 12376, 12378, 12380, 12382, 12384, 12386, 12388, 12390, 12392, 12394, - 12396, 12398, 12400, 12402, 12404, 12406, 12408, 12410, 12412, 12414, - 12416, 0, 0, 12418, 12420, 12422, 12424, 12426, 12428, 12430, 12432, - 12434, 12436, 12438, 12440, 12442, 12444, 12446, 12448, 12450, 12452, - 12454, 12456, 12458, 12460, 12462, 12464, 12466, 12468, 12470, 12472, - 12474, 12476, 12478, 12480, 12482, 12484, 12486, 12488, 12490, 12492, - 12494, 12496, 12498, 12500, 12502, 12504, 12506, 12508, 12510, 12512, - 12514, 12516, 12518, 12520, 12522, 12524, 0, 12526, 12528, 12530, 12532, - 12534, 12536, 12538, 12540, 12542, 12544, 12546, 12548, 12550, 12552, - 12554, 12556, 12558, 12560, 12562, 12564, 12566, 12568, 12570, 12572, - 12574, 12576, 12578, 0, 12580, 12582, 0, 12584, 0, 0, 12586, 0, 12588, - 12590, 12592, 12594, 12596, 12598, 12600, 12602, 12604, 12606, 0, 12608, - 12610, 12612, 12614, 0, 12616, 0, 12618, 0, 0, 0, 0, 0, 0, 12620, 0, 0, - 0, 0, 12622, 0, 12624, 0, 12626, 0, 12628, 12630, 12632, 0, 12634, 12636, - 0, 12638, 0, 0, 12640, 0, 12642, 0, 12644, 0, 12646, 0, 12648, 0, 12650, - 12652, 0, 12654, 0, 0, 12656, 12658, 12660, 12662, 0, 12664, 12666, - 12668, 12670, 12672, 12674, 12676, 0, 12678, 12680, 12682, 12684, 0, - 12686, 12688, 12690, 12692, 0, 12694, 0, 12696, 12698, 12700, 12702, - 12704, 12706, 12708, 12710, 12712, 12714, 0, 12716, 12718, 12720, 12722, - 12724, 12726, 12728, 12730, 12732, 12734, 12736, 12738, 12740, 12742, - 12744, 12746, 12748, 0, 0, 0, 0, 0, 12750, 12752, 12754, 0, 12756, 12758, - 12760, 12762, 12764, 0, 12766, 12768, 12770, 12772, 12774, 12776, 12778, - 12780, 12782, 12784, 12786, 12788, 12790, 12792, 12794, 12796, 12798, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12800, 12803, - 12806, 12809, 12812, 12815, 12818, 12821, 12824, 12827, 12830, 0, 0, 0, - 0, 0, 12833, 12837, 12841, 12845, 12849, 12853, 12857, 12861, 12865, - 12869, 12873, 12877, 12881, 12885, 12889, 12893, 12897, 12901, 12905, - 12909, 12913, 12917, 12921, 12925, 12929, 12933, 12937, 12941, 12943, - 12945, 12948, 0, 12951, 12953, 12955, 12957, 12959, 12961, 12963, 12965, - 12967, 12969, 12971, 12973, 12975, 12977, 12979, 12981, 12983, 12985, - 12987, 12989, 12991, 12993, 12995, 12997, 12999, 13001, 13003, 13006, - 13009, 13012, 13015, 13019, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13022, 13025, 13028, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 13031, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13034, - 13037, 13040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13042, 13044, 13046, - 13048, 13050, 13052, 13054, 13056, 13058, 13060, 13062, 13064, 13066, - 13068, 13070, 13072, 13074, 13076, 13078, 13080, 13082, 13084, 13086, - 13088, 13090, 13092, 13094, 13096, 13098, 13100, 13102, 13104, 13106, - 13108, 13110, 13112, 13114, 13116, 13118, 13120, 13122, 13124, 13126, - 13128, 0, 0, 0, 0, 13130, 13134, 13138, 13142, 13146, 13150, 13154, - 13158, 13162, 0, 0, 0, 0, 0, 0, 0, 13166, 13168, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13170, 13172, 13174, 13176, - 13178, 13180, 13182, 13184, 13186, 13188, 13190, 13192, 13194, 13196, - 13198, 13200, 13202, 13204, 13206, 13208, 13210, 13212, 13214, 13216, - 13218, 13220, 13222, 13224, 13226, 13228, 13230, 13232, 13234, 13236, - 13238, 13240, 13242, 13244, 13246, 13248, 13250, 13252, 13254, 13256, - 13258, 13260, 13262, 13264, 13266, 13268, 13270, 13272, 13274, 13276, - 13278, 13280, 13282, 13284, 13286, 13288, 13290, 13292, 13294, 13296, - 13298, 13300, 13302, 13304, 13306, 13308, 13310, 13312, 13314, 13316, - 13318, 13320, 13322, 13324, 13326, 13328, 13330, 13332, 13334, 13336, - 13338, 13340, 13342, 13344, 13346, 13348, 13350, 13352, 13354, 13356, - 13358, 13360, 13362, 13364, 13366, 13368, 13370, 13372, 13374, 13376, - 13378, 13380, 13382, 13384, 13386, 13388, 13390, 13392, 13394, 13396, - 13398, 13400, 13402, 13404, 13406, 13408, 13410, 13412, 13414, 13416, - 13418, 13420, 13422, 13424, 13426, 13428, 13430, 13432, 13434, 13436, - 13438, 13440, 13442, 13444, 13446, 13448, 13450, 13452, 13454, 13456, - 13458, 13460, 13462, 13464, 13466, 13468, 13470, 13472, 13474, 13476, - 13478, 13480, 13482, 13484, 13486, 13488, 13490, 13492, 13494, 13496, - 13498, 13500, 13502, 13504, 13506, 13508, 13510, 13512, 13514, 13516, - 13518, 13520, 13522, 13524, 13526, 13528, 13530, 13532, 13534, 13536, - 13538, 13540, 13542, 13544, 13546, 13548, 13550, 13552, 13554, 13556, - 13558, 13560, 13562, 13564, 13566, 13568, 13570, 13572, 13574, 13576, - 13578, 13580, 13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, - 13598, 13600, 13602, 13604, 13606, 13608, 13610, 13612, 13614, 13616, - 13618, 13620, 13622, 13624, 13626, 13628, 13630, 13632, 13634, 13636, - 13638, 13640, 13642, 13644, 13646, 13648, 13650, 13652, 13654, 13656, - 13658, 13660, 13662, 13664, 13666, 13668, 13670, 13672, 13674, 13676, - 13678, 13680, 13682, 13684, 13686, 13688, 13690, 13692, 13694, 13696, - 13698, 13700, 13702, 13704, 13706, 13708, 13710, 13712, 13714, 13716, - 13718, 13720, 13722, 13724, 13726, 13728, 13730, 13732, 13734, 13736, - 13738, 13740, 13742, 13744, 13746, 13748, 13750, 13752, 13754, 13756, - 13758, 13760, 13762, 13764, 13766, 13768, 13770, 13772, 13774, 13776, - 13778, 13780, 13782, 13784, 13786, 13788, 13790, 13792, 13794, 13796, - 13798, 13800, 13802, 13804, 13806, 13808, 13810, 13812, 13814, 13816, - 13818, 13820, 13822, 13824, 13826, 13828, 13830, 13832, 13834, 13836, - 13838, 13840, 13842, 13844, 13846, 13848, 13850, 13852, 13854, 13856, - 13858, 13860, 13862, 13864, 13866, 13868, 13870, 13872, 13874, 13876, - 13878, 13880, 13882, 13884, 13886, 13888, 13890, 13892, 13894, 13896, - 13898, 13900, 13902, 13904, 13906, 13908, 13910, 13912, 13914, 13916, - 13918, 13920, 13922, 13924, 13926, 13928, 13930, 13932, 13934, 13936, - 13938, 13940, 13942, 13944, 13946, 13948, 13950, 13952, 13954, 13956, - 13958, 13960, 13962, 13964, 13966, 13968, 13970, 13972, 13974, 13976, - 13978, 13980, 13982, 13984, 13986, 13988, 13990, 13992, 13994, 13996, - 13998, 14000, 14002, 14004, 14006, 14008, 14010, 14012, 14014, 14016, - 14018, 14020, 14022, 14024, 14026, 14028, 14030, 14032, 14034, 14036, - 14038, 14040, 14042, 14044, 14046, 14048, 14050, 14052, 14054, 14056, - 14058, 14060, 14062, 14064, 14066, 14068, 14070, 14072, 14074, 14076, - 14078, 14080, 14082, 14084, 14086, 14088, 14090, 14092, 14094, 14096, - 14098, 14100, 14102, 14104, 14106, 14108, 14110, 14112, 14114, 14116, - 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132, 14134, 14136, - 14138, 14140, 14142, 14144, 14146, 14148, 14150, 14152, 14154, 14156, - 14158, 14160, 14162, 14164, 14166, 14168, 14170, 14172, 14174, 14176, - 14178, 14180, 14182, 14184, 14186, 14188, 14190, 14192, 14194, 14196, - 14198, 14200, 14202, 14204, 14206, 14208, 14210, 14212, 14214, 14216, - 14218, 14220, 14222, 14224, 14226, 14228, 14230, 14232, 14234, 14236, - 14238, 14240, 14242, 14244, 14246, 14248, 14250, 14252, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6669, 6671, 6673, 6675, 6677, 6679, 6681, 6683, + 6685, 6687, 6689, 6691, 6693, 6695, 6697, 6699, 6701, 6703, 6705, 6707, + 6709, 6711, 6713, 6715, 6717, 6719, 6721, 6723, 6725, 6727, 6729, 6731, + 6733, 6735, 6737, 6739, 6741, 6743, 6745, 6747, 6749, 6751, 6753, 6755, + 6757, 6759, 6761, 6763, 6765, 6767, 6769, 6771, 6773, 6775, 6777, 6779, + 6781, 6783, 6785, 6787, 6789, 6791, 6793, 6795, 6797, 6799, 6801, 6803, + 6805, 6807, 6809, 6811, 6813, 6815, 6817, 6819, 6821, 6823, 6825, 6827, + 6829, 6831, 6833, 6835, 6837, 6839, 6841, 6843, 6845, 6847, 6849, 6851, + 6853, 6855, 6857, 6859, 6861, 6863, 6865, 6867, 6869, 6871, 6873, 6875, + 6877, 6879, 6881, 6883, 6885, 6887, 6889, 6891, 6893, 6895, 6897, 6899, + 6901, 6903, 6905, 6907, 6909, 6911, 6913, 6915, 6917, 6919, 6921, 6923, + 6925, 6927, 6929, 6931, 6933, 6935, 6937, 6939, 6941, 6943, 6945, 6947, + 6949, 6951, 6953, 6955, 6957, 6959, 6961, 6963, 6965, 6967, 6969, 6971, + 6973, 6975, 6977, 6979, 6981, 6983, 6985, 6987, 6989, 6991, 6993, 6995, + 6997, 6999, 7001, 7003, 7005, 7007, 7009, 7011, 7013, 7015, 7017, 7019, + 7021, 7023, 7025, 7027, 7029, 7031, 7033, 7035, 7037, 7039, 7041, 7043, + 7045, 7047, 7049, 7051, 7053, 7055, 7057, 7059, 7061, 7063, 7065, 7067, + 7069, 7071, 7073, 7075, 7077, 7079, 7081, 7083, 7085, 7087, 7089, 7091, + 7093, 7095, 7097, 7099, 7101, 7103, 7105, 7107, 7109, 7111, 7113, 7115, + 7117, 7119, 7121, 7123, 7125, 7127, 7129, 7131, 7133, 7135, 7137, 7139, + 7141, 7143, 7145, 7147, 7149, 7151, 7153, 7155, 7157, 7159, 7161, 7163, + 7165, 7167, 7169, 7171, 7173, 7175, 7177, 7179, 7181, 7183, 7185, 7187, + 7189, 7191, 7193, 7195, 7197, 7199, 7201, 7203, 7205, 7207, 0, 0, 7209, + 0, 7211, 0, 0, 7213, 7215, 7217, 7219, 7221, 7223, 7225, 7227, 7229, + 7231, 0, 7233, 0, 7235, 0, 0, 7237, 7239, 0, 0, 0, 7241, 7243, 7245, + 7247, 7249, 7251, 7253, 7255, 7257, 7259, 7261, 7263, 7265, 7267, 7269, + 7271, 7273, 7275, 7277, 7279, 7281, 7283, 7285, 7287, 7289, 7291, 7293, + 7295, 7297, 7299, 7301, 7303, 7305, 7307, 7309, 7311, 7313, 7315, 7317, + 7319, 7321, 7323, 7325, 7327, 7329, 7331, 7333, 7335, 7337, 7339, 7341, + 7343, 7345, 7347, 7349, 7351, 7353, 7355, 7357, 7359, 7361, 7363, 7365, + 7367, 7369, 7371, 7373, 7375, 0, 0, 7377, 7379, 7381, 7383, 7385, 7387, + 7389, 7391, 7393, 7395, 7397, 7399, 7401, 7403, 7405, 7407, 7409, 7411, + 7413, 7415, 7417, 7419, 7421, 7423, 7425, 7427, 7429, 7431, 7433, 7435, + 7437, 7439, 7441, 7443, 7445, 7447, 7449, 7451, 7453, 7455, 7457, 7459, + 7461, 7463, 7465, 7467, 7469, 7471, 7473, 7475, 7477, 7479, 7481, 7483, + 7485, 7487, 7489, 7491, 7493, 7495, 7497, 7499, 7501, 7503, 7505, 7507, + 7509, 7511, 7513, 7515, 7517, 7519, 7521, 7523, 7525, 7527, 7529, 7531, + 7533, 7535, 7537, 7539, 7541, 7543, 7545, 7547, 7549, 7551, 7553, 7555, + 7557, 7559, 7561, 7563, 7565, 7567, 7569, 7571, 7573, 7575, 7577, 7579, + 7581, 7583, 7585, 7587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7589, + 7592, 7595, 7598, 7602, 7606, 7609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7612, 7615, 7618, 7621, 7624, 0, 0, 0, 0, 0, 7627, 0, 7630, 7633, 7635, + 7637, 7639, 7641, 7643, 7645, 7647, 7649, 7651, 7653, 7656, 7659, 7662, + 7665, 7668, 7671, 7674, 7677, 7680, 7683, 7686, 7689, 0, 7692, 7695, + 7698, 7701, 7704, 0, 7707, 0, 7710, 7713, 0, 7716, 7719, 0, 7722, 7725, + 7728, 7731, 7734, 7737, 7740, 7743, 7746, 7749, 7752, 7754, 7756, 7758, + 7760, 7762, 7764, 7766, 7768, 7770, 7772, 7774, 7776, 7778, 7780, 7782, + 7784, 7786, 7788, 7790, 7792, 7794, 7796, 7798, 7800, 7802, 7804, 7806, + 7808, 7810, 7812, 7814, 7816, 7818, 7820, 7822, 7824, 7826, 7828, 7830, + 7832, 7834, 7836, 7838, 7840, 7842, 7844, 7846, 7848, 7850, 7852, 7854, + 7856, 7858, 7860, 7862, 7864, 7866, 7868, 7870, 7872, 7874, 7876, 7878, + 7880, 7882, 7884, 7886, 7888, 7890, 7892, 7894, 7896, 7898, 7900, 7902, + 7904, 7906, 7908, 7910, 7912, 7914, 7916, 7918, 7920, 7922, 7924, 7926, + 7928, 7930, 7932, 7934, 7936, 7938, 7940, 7942, 7944, 7946, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7948, 7950, 7952, 7954, 7956, 7958, 7960, 7962, 7964, + 7966, 7968, 7970, 7972, 7974, 7976, 7978, 7980, 7982, 7984, 7986, 7988, + 7990, 7992, 7994, 7997, 8000, 8003, 8006, 8009, 8012, 8015, 8018, 8021, + 8024, 8027, 8030, 8033, 8036, 8039, 8042, 8045, 8048, 8050, 8052, 8054, + 8056, 8059, 8062, 8065, 8068, 8071, 8074, 8077, 8080, 8083, 8086, 8089, + 8092, 8095, 8098, 8101, 8104, 8107, 8110, 8113, 8116, 8119, 8122, 8125, + 8128, 8131, 8134, 8137, 8140, 8143, 8146, 8149, 8152, 8155, 8158, 8161, + 8164, 8167, 8170, 8173, 8176, 8179, 8182, 8185, 8188, 8191, 8194, 8197, + 8200, 8203, 8206, 8209, 8212, 8215, 8218, 8221, 8224, 8227, 8230, 8233, + 8236, 8239, 8242, 8245, 8248, 8251, 8254, 8257, 8260, 8263, 8266, 8269, + 8272, 8275, 8278, 8281, 8284, 8287, 8290, 8293, 8296, 8299, 8302, 8305, + 8308, 8311, 8314, 8317, 8320, 8323, 8326, 8329, 8332, 8335, 8338, 8342, + 8346, 8350, 8354, 8358, 8362, 8365, 8368, 8371, 8374, 8377, 8380, 8383, + 8386, 8389, 8392, 8395, 8398, 8401, 8404, 8407, 8410, 8413, 8416, 8419, + 8422, 8425, 8428, 8431, 8434, 8437, 8440, 8443, 8446, 8449, 8452, 8455, + 8458, 8461, 8464, 8467, 8470, 8473, 8476, 8479, 8482, 8485, 8488, 8491, + 8494, 8497, 8500, 8503, 8506, 8509, 8512, 8515, 8518, 8521, 8524, 8527, + 8530, 8533, 8536, 8539, 8542, 8545, 8548, 8551, 8554, 8557, 8560, 8563, + 8566, 8569, 8572, 8575, 8578, 8581, 8584, 8587, 8590, 8593, 8596, 8599, + 8602, 8605, 8608, 8611, 8614, 8617, 8620, 8623, 8626, 8629, 8632, 8635, + 8638, 8641, 8644, 8647, 8650, 8653, 8656, 8659, 8662, 8665, 8668, 8671, + 8674, 8677, 8680, 8683, 8686, 8689, 8692, 8695, 8698, 8701, 8704, 8707, + 8710, 8713, 8716, 8719, 8722, 8725, 8728, 8731, 8734, 8737, 8740, 8743, + 8746, 8749, 8752, 8755, 8758, 8761, 8764, 8767, 8770, 8773, 8776, 8779, + 8782, 8785, 8788, 8792, 8796, 8800, 8803, 8806, 8809, 8812, 8815, 8818, + 8821, 8824, 8827, 8830, 8833, 8836, 8839, 8842, 8845, 8848, 8851, 8854, + 8857, 8860, 8863, 8866, 8869, 8872, 8875, 8878, 8881, 8884, 8887, 8890, + 8893, 8896, 8899, 8902, 8905, 8908, 8911, 8914, 8917, 8920, 8923, 8926, + 8929, 8932, 8935, 8938, 8941, 8944, 8947, 8950, 8953, 8956, 8959, 8962, + 8965, 8968, 8971, 8974, 8977, 8980, 8983, 8986, 8989, 8992, 8995, 8998, + 9001, 9004, 9007, 9010, 9013, 9016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9019, 9023, 9027, 9031, 9035, 9039, 9043, 9047, 9051, + 9055, 9059, 9063, 9067, 9071, 9075, 9079, 9083, 9087, 9091, 9095, 9099, + 9103, 9107, 9111, 9115, 9119, 9123, 9127, 9131, 9135, 9139, 9143, 9147, + 9151, 9155, 9159, 9163, 9167, 9171, 9175, 9179, 9183, 9187, 9191, 9195, + 9199, 9203, 9207, 9211, 9215, 9219, 9223, 9227, 9231, 9235, 9239, 9243, + 9247, 9251, 9255, 9259, 9263, 9267, 9271, 0, 0, 9275, 9279, 9283, 9287, + 9291, 9295, 9299, 9303, 9307, 9311, 9315, 9319, 9323, 9327, 9331, 9335, + 9339, 9343, 9347, 9351, 9355, 9359, 9363, 9367, 9371, 9375, 9379, 9383, + 9387, 9391, 9395, 9399, 9403, 9407, 9411, 9415, 9419, 9423, 9427, 9431, + 9435, 9439, 9443, 9447, 9451, 9455, 9459, 9463, 9467, 9471, 9475, 9479, + 9483, 9487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9491, 9495, + 9499, 9504, 9509, 9514, 9519, 9524, 9529, 9534, 9538, 9557, 9566, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9571, 9573, 9575, + 9577, 9579, 9581, 9583, 9585, 9587, 9589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9591, 9593, 9595, 9597, 9599, 9601, + 9603, 9605, 9607, 9609, 9611, 9613, 9615, 9617, 9619, 9621, 9623, 9625, + 9627, 9629, 9631, 0, 0, 9633, 9635, 9637, 9639, 9641, 9643, 9645, 9647, + 9649, 9651, 9653, 9655, 0, 9657, 9659, 9661, 9663, 9665, 9667, 9669, + 9671, 9673, 9675, 9677, 9679, 9681, 9683, 9685, 9687, 9689, 9691, 9693, + 0, 9695, 9697, 9699, 9701, 0, 0, 0, 0, 9703, 9706, 9709, 0, 9712, 0, + 9715, 9718, 9721, 9724, 9727, 9730, 9733, 9736, 9739, 9742, 9745, 9747, + 9749, 9751, 9753, 9755, 9757, 9759, 9761, 9763, 9765, 9767, 9769, 9771, + 9773, 9775, 9777, 9779, 9781, 9783, 9785, 9787, 9789, 9791, 9793, 9795, + 9797, 9799, 9801, 9803, 9805, 9807, 9809, 9811, 9813, 9815, 9817, 9819, + 9821, 9823, 9825, 9827, 9829, 9831, 9833, 9835, 9837, 9839, 9841, 9843, + 9845, 9847, 9849, 9851, 9853, 9855, 9857, 9859, 9861, 9863, 9865, 9867, + 9869, 9871, 9873, 9875, 9877, 9879, 9881, 9883, 9885, 9887, 9889, 9891, + 9893, 9895, 9897, 9899, 9901, 9903, 9905, 9907, 9909, 9911, 9913, 9915, + 9917, 9919, 9921, 9923, 9925, 9927, 9929, 9931, 9933, 9935, 9937, 9939, + 9941, 9943, 9945, 9947, 9949, 9951, 9953, 9955, 9957, 9959, 9961, 9963, + 9965, 9967, 9969, 9971, 9973, 9975, 9977, 9979, 9982, 9985, 9988, 9991, + 9994, 9997, 10000, 0, 0, 0, 0, 10003, 10005, 10007, 10009, 10011, 10013, + 10015, 10017, 10019, 10021, 10023, 10025, 10027, 10029, 10031, 10033, + 10035, 10037, 10039, 10041, 10043, 10045, 10047, 10049, 10051, 10053, + 10055, 10057, 10059, 10061, 10063, 10065, 10067, 10069, 10071, 10073, + 10075, 10077, 10079, 10081, 10083, 10085, 10087, 10089, 10091, 10093, + 10095, 10097, 10099, 10101, 10103, 10105, 10107, 10109, 10111, 10113, + 10115, 10117, 10119, 10121, 10123, 10125, 10127, 10129, 10131, 10133, + 10135, 10137, 10139, 10141, 10143, 10145, 10147, 10149, 10151, 10153, + 10155, 10157, 10159, 10161, 10163, 10165, 10167, 10169, 10171, 10173, + 10175, 10177, 10179, 10181, 10183, 10185, 10187, 10189, 10191, 10193, + 10195, 10197, 10199, 10201, 10203, 10205, 10207, 10209, 10211, 10213, + 10215, 10217, 10219, 10221, 10223, 10225, 10227, 10229, 10231, 10233, + 10235, 10237, 10239, 10241, 10243, 10245, 10247, 10249, 10251, 10253, + 10255, 10257, 10259, 10261, 10263, 10265, 10267, 10269, 10271, 10273, + 10275, 10277, 10279, 10281, 10283, 10285, 10287, 10289, 10291, 10293, + 10295, 10297, 10299, 10301, 10303, 10305, 10307, 10309, 10311, 10313, + 10315, 10317, 10319, 10321, 10323, 10325, 10327, 10329, 10331, 10333, + 10335, 10337, 10339, 10341, 10343, 10345, 10347, 10349, 10351, 10353, + 10355, 10357, 10359, 10361, 10363, 10365, 10367, 10369, 10371, 10373, + 10375, 10377, 10379, 10381, 0, 0, 0, 10383, 10385, 10387, 10389, 10391, + 10393, 0, 0, 10395, 10397, 10399, 10401, 10403, 10405, 0, 0, 10407, + 10409, 10411, 10413, 10415, 10417, 0, 0, 10419, 10421, 10423, 0, 0, 0, + 10425, 10427, 10429, 10431, 10433, 10435, 10437, 0, 10439, 10441, 10443, + 10445, 10447, 10449, 10451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10453, 0, 10456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10462, 10465, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10468, 10471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10474, + 10477, 0, 10480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10483, 10486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10489, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10492, 10495, 10498, 10501, + 10504, 10507, 10510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10513, + 10516, 10519, 10522, 10525, 10528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10531, 10533, 10535, 10537, 10539, 10541, 10543, 10545, 10547, + 10549, 10551, 10553, 10555, 10557, 10559, 10561, 10563, 10565, 10567, + 10569, 10571, 10573, 10575, 10577, 10579, 10581, 10583, 10585, 10587, + 10589, 10591, 10593, 10595, 10597, 10599, 10601, 10603, 10605, 10607, + 10609, 10611, 10613, 10615, 10617, 10619, 10621, 10623, 10625, 10627, + 10629, 10631, 10633, 10635, 10637, 10639, 10641, 10643, 10645, 10647, + 10649, 10651, 10653, 10655, 10657, 10659, 10661, 10663, 10665, 10667, + 10669, 10671, 10673, 10675, 10677, 10679, 10681, 10683, 10685, 10687, + 10689, 10691, 10693, 10695, 10697, 10699, 0, 10701, 10703, 10705, 10707, + 10709, 10711, 10713, 10715, 10717, 10719, 10721, 10723, 10725, 10727, + 10729, 10731, 10733, 10735, 10737, 10739, 10741, 10743, 10745, 10747, + 10749, 10751, 10753, 10755, 10757, 10759, 10761, 10763, 10765, 10767, + 10769, 10771, 10773, 10775, 10777, 10779, 10781, 10783, 10785, 10787, + 10789, 10791, 10793, 10795, 10797, 10799, 10801, 10803, 10805, 10807, + 10809, 10811, 10813, 10815, 10817, 10819, 10821, 10823, 10825, 10827, + 10829, 10831, 10833, 10835, 10837, 10839, 10841, 0, 10843, 10845, 0, 0, + 10847, 0, 0, 10849, 10851, 0, 0, 10853, 10855, 10857, 10859, 0, 10861, + 10863, 10865, 10867, 10869, 10871, 10873, 10875, 10877, 10879, 10881, + 10883, 0, 10885, 0, 10887, 10889, 10891, 10893, 10895, 10897, 10899, 0, + 10901, 10903, 10905, 10907, 10909, 10911, 10913, 10915, 10917, 10919, + 10921, 10923, 10925, 10927, 10929, 10931, 10933, 10935, 10937, 10939, + 10941, 10943, 10945, 10947, 10949, 10951, 10953, 10955, 10957, 10959, + 10961, 10963, 10965, 10967, 10969, 10971, 10973, 10975, 10977, 10979, + 10981, 10983, 10985, 10987, 10989, 10991, 10993, 10995, 10997, 10999, + 11001, 11003, 11005, 11007, 11009, 11011, 11013, 11015, 11017, 11019, + 11021, 11023, 11025, 11027, 11029, 0, 11031, 11033, 11035, 11037, 0, 0, + 11039, 11041, 11043, 11045, 11047, 11049, 11051, 11053, 0, 11055, 11057, + 11059, 11061, 11063, 11065, 11067, 0, 11069, 11071, 11073, 11075, 11077, + 11079, 11081, 11083, 11085, 11087, 11089, 11091, 11093, 11095, 11097, + 11099, 11101, 11103, 11105, 11107, 11109, 11111, 11113, 11115, 11117, + 11119, 11121, 11123, 0, 11125, 11127, 11129, 11131, 0, 11133, 11135, + 11137, 11139, 11141, 0, 11143, 0, 0, 0, 11145, 11147, 11149, 11151, + 11153, 11155, 11157, 0, 11159, 11161, 11163, 11165, 11167, 11169, 11171, + 11173, 11175, 11177, 11179, 11181, 11183, 11185, 11187, 11189, 11191, + 11193, 11195, 11197, 11199, 11201, 11203, 11205, 11207, 11209, 11211, + 11213, 11215, 11217, 11219, 11221, 11223, 11225, 11227, 11229, 11231, + 11233, 11235, 11237, 11239, 11241, 11243, 11245, 11247, 11249, 11251, + 11253, 11255, 11257, 11259, 11261, 11263, 11265, 11267, 11269, 11271, + 11273, 11275, 11277, 11279, 11281, 11283, 11285, 11287, 11289, 11291, + 11293, 11295, 11297, 11299, 11301, 11303, 11305, 11307, 11309, 11311, + 11313, 11315, 11317, 11319, 11321, 11323, 11325, 11327, 11329, 11331, + 11333, 11335, 11337, 11339, 11341, 11343, 11345, 11347, 11349, 11351, + 11353, 11355, 11357, 11359, 11361, 11363, 11365, 11367, 11369, 11371, + 11373, 11375, 11377, 11379, 11381, 11383, 11385, 11387, 11389, 11391, + 11393, 11395, 11397, 11399, 11401, 11403, 11405, 11407, 11409, 11411, + 11413, 11415, 11417, 11419, 11421, 11423, 11425, 11427, 11429, 11431, + 11433, 11435, 11437, 11439, 11441, 11443, 11445, 11447, 11449, 11451, + 11453, 11455, 11457, 11459, 11461, 11463, 11465, 11467, 11469, 11471, + 11473, 11475, 11477, 11479, 11481, 11483, 11485, 11487, 11489, 11491, + 11493, 11495, 11497, 11499, 11501, 11503, 11505, 11507, 11509, 11511, + 11513, 11515, 11517, 11519, 11521, 11523, 11525, 11527, 11529, 11531, + 11533, 11535, 11537, 11539, 11541, 11543, 11545, 11547, 11549, 11551, + 11553, 11555, 11557, 11559, 11561, 11563, 11565, 11567, 11569, 11571, + 11573, 11575, 11577, 11579, 11581, 11583, 11585, 11587, 11589, 11591, + 11593, 11595, 11597, 11599, 11601, 11603, 11605, 11607, 11609, 11611, + 11613, 11615, 11617, 11619, 11621, 11623, 11625, 11627, 11629, 11631, + 11633, 11635, 11637, 11639, 11641, 11643, 11645, 11647, 11649, 11651, + 11653, 11655, 11657, 11659, 11661, 11663, 11665, 11667, 11669, 11671, + 11673, 11675, 11677, 11679, 11681, 11683, 11685, 11687, 11689, 11691, + 11693, 11695, 11697, 11699, 11701, 11703, 11705, 11707, 11709, 11711, + 11713, 11715, 11717, 11719, 11721, 11723, 11725, 11727, 11729, 11731, + 11733, 11735, 11737, 11739, 11741, 11743, 11745, 11747, 11749, 11751, + 11753, 11755, 11757, 11759, 11761, 11763, 11765, 11767, 11769, 11771, + 11773, 11775, 11777, 11779, 11781, 11783, 11785, 11787, 11789, 11791, + 11793, 11795, 11797, 11799, 11801, 11803, 11805, 11807, 11809, 11811, + 11813, 11815, 11817, 11819, 11821, 11823, 11825, 11827, 11829, 11831, + 11833, 11835, 11837, 0, 0, 11839, 11841, 11843, 11845, 11847, 11849, + 11851, 11853, 11855, 11857, 11859, 11861, 11863, 11865, 11867, 11869, + 11871, 11873, 11875, 11877, 11879, 11881, 11883, 11885, 11887, 11889, + 11891, 11893, 11895, 11897, 11899, 11901, 11903, 11905, 11907, 11909, + 11911, 11913, 11915, 11917, 11919, 11921, 11923, 11925, 11927, 11929, + 11931, 11933, 11935, 11937, 11939, 11941, 11943, 11945, 11947, 11949, + 11951, 11953, 11955, 11957, 11959, 11961, 11963, 11965, 11967, 11969, + 11971, 11973, 11975, 11977, 11979, 11981, 11983, 11985, 11987, 11989, + 11991, 11993, 11995, 11997, 11999, 12001, 12003, 12005, 12007, 12009, + 12011, 12013, 12015, 12017, 12019, 12021, 12023, 12025, 12027, 12029, + 12031, 12033, 12035, 12037, 12039, 12041, 12043, 12045, 12047, 12049, + 12051, 12053, 12055, 12057, 12059, 12061, 12063, 12065, 12067, 12069, + 12071, 12073, 12075, 12077, 12079, 12081, 12083, 12085, 12087, 12089, + 12091, 12093, 12095, 12097, 12099, 12101, 12103, 12105, 12107, 12109, + 12111, 12113, 12115, 12117, 12119, 12121, 12123, 12125, 12127, 12129, + 12131, 12133, 12135, 12137, 12139, 12141, 12143, 12145, 12147, 12149, + 12151, 12153, 12155, 12157, 12159, 12161, 12163, 12165, 12167, 12169, + 12171, 12173, 12175, 12177, 12179, 12181, 12183, 12185, 12187, 12189, + 12191, 12193, 12195, 12197, 12199, 12201, 12203, 12205, 12207, 12209, + 12211, 12213, 12215, 12217, 12219, 12221, 12223, 12225, 12227, 12229, + 12231, 12233, 12235, 12237, 12239, 12241, 12243, 12245, 12247, 12249, + 12251, 12253, 12255, 12257, 12259, 12261, 12263, 12265, 12267, 12269, + 12271, 12273, 12275, 12277, 12279, 12281, 12283, 12285, 12287, 12289, + 12291, 12293, 12295, 12297, 12299, 12301, 12303, 12305, 12307, 12309, + 12311, 12313, 12315, 12317, 12319, 12321, 12323, 12325, 12327, 12329, + 12331, 12333, 12335, 12337, 12339, 12341, 12343, 12345, 12347, 12349, + 12351, 12353, 12355, 12357, 12359, 12361, 12363, 12365, 12367, 12369, + 12371, 12373, 12375, 12377, 12379, 12381, 12383, 12385, 12387, 12389, + 12391, 12393, 12395, 12397, 12399, 12401, 12403, 12405, 12407, 12409, + 12411, 12413, 12415, 12417, 12419, 12421, 0, 0, 12423, 12425, 12427, + 12429, 12431, 12433, 12435, 12437, 12439, 12441, 12443, 12445, 12447, + 12449, 12451, 12453, 12455, 12457, 12459, 12461, 12463, 12465, 12467, + 12469, 12471, 12473, 12475, 12477, 12479, 12481, 12483, 12485, 12487, + 12489, 12491, 12493, 12495, 12497, 12499, 12501, 12503, 12505, 12507, + 12509, 12511, 12513, 12515, 12517, 12519, 12521, 12523, 12525, 12527, + 12529, 0, 12531, 12533, 12535, 12537, 12539, 12541, 12543, 12545, 12547, + 12549, 12551, 12553, 12555, 12557, 12559, 12561, 12563, 12565, 12567, + 12569, 12571, 12573, 12575, 12577, 12579, 12581, 12583, 0, 12585, 12587, + 0, 12589, 0, 0, 12591, 0, 12593, 12595, 12597, 12599, 12601, 12603, + 12605, 12607, 12609, 12611, 0, 12613, 12615, 12617, 12619, 0, 12621, 0, + 12623, 0, 0, 0, 0, 0, 0, 12625, 0, 0, 0, 0, 12627, 0, 12629, 0, 12631, 0, + 12633, 12635, 12637, 0, 12639, 12641, 0, 12643, 0, 0, 12645, 0, 12647, 0, + 12649, 0, 12651, 0, 12653, 0, 12655, 12657, 0, 12659, 0, 0, 12661, 12663, + 12665, 12667, 0, 12669, 12671, 12673, 12675, 12677, 12679, 12681, 0, + 12683, 12685, 12687, 12689, 0, 12691, 12693, 12695, 12697, 0, 12699, 0, + 12701, 12703, 12705, 12707, 12709, 12711, 12713, 12715, 12717, 12719, 0, + 12721, 12723, 12725, 12727, 12729, 12731, 12733, 12735, 12737, 12739, + 12741, 12743, 12745, 12747, 12749, 12751, 12753, 0, 0, 0, 0, 0, 12755, + 12757, 12759, 0, 12761, 12763, 12765, 12767, 12769, 0, 12771, 12773, + 12775, 12777, 12779, 12781, 12783, 12785, 12787, 12789, 12791, 12793, + 12795, 12797, 12799, 12801, 12803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12805, 12808, 12811, 12814, 12817, 12820, 12823, + 12826, 12829, 12832, 12835, 0, 0, 0, 0, 0, 12838, 12842, 12846, 12850, + 12854, 12858, 12862, 12866, 12870, 12874, 12878, 12882, 12886, 12890, + 12894, 12898, 12902, 12906, 12910, 12914, 12918, 12922, 12926, 12930, + 12934, 12938, 12942, 12946, 12948, 12950, 12953, 0, 12956, 12958, 12960, + 12962, 12964, 12966, 12968, 12970, 12972, 12974, 12976, 12978, 12980, + 12982, 12984, 12986, 12988, 12990, 12992, 12994, 12996, 12998, 13000, + 13002, 13004, 13006, 13008, 13011, 13014, 13017, 13020, 13024, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13027, 13030, 13033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13036, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13039, 13042, 13045, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13047, 13049, 13051, 13053, 13055, 13057, 13059, + 13061, 13063, 13065, 13067, 13069, 13071, 13073, 13075, 13077, 13079, + 13081, 13083, 13085, 13087, 13089, 13091, 13093, 13095, 13097, 13099, + 13101, 13103, 13105, 13107, 13109, 13111, 13113, 13115, 13117, 13119, + 13121, 13123, 13125, 13127, 13129, 13131, 13133, 0, 0, 0, 0, 13135, + 13139, 13143, 13147, 13151, 13155, 13159, 13163, 13167, 0, 0, 0, 0, 0, 0, + 0, 13171, 13173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13175, 13177, + 13179, 13181, 13183, 13185, 13187, 13189, 13191, 13193, 0, 0, 0, 0, 0, 0, + 13195, 13197, 13199, 13201, 13203, 13205, 13207, 13209, 13211, 13213, + 13215, 13217, 13219, 13221, 13223, 13225, 13227, 13229, 13231, 13233, + 13235, 13237, 13239, 13241, 13243, 13245, 13247, 13249, 13251, 13253, + 13255, 13257, 13259, 13261, 13263, 13265, 13267, 13269, 13271, 13273, + 13275, 13277, 13279, 13281, 13283, 13285, 13287, 13289, 13291, 13293, + 13295, 13297, 13299, 13301, 13303, 13305, 13307, 13309, 13311, 13313, + 13315, 13317, 13319, 13321, 13323, 13325, 13327, 13329, 13331, 13333, + 13335, 13337, 13339, 13341, 13343, 13345, 13347, 13349, 13351, 13353, + 13355, 13357, 13359, 13361, 13363, 13365, 13367, 13369, 13371, 13373, + 13375, 13377, 13379, 13381, 13383, 13385, 13387, 13389, 13391, 13393, + 13395, 13397, 13399, 13401, 13403, 13405, 13407, 13409, 13411, 13413, + 13415, 13417, 13419, 13421, 13423, 13425, 13427, 13429, 13431, 13433, + 13435, 13437, 13439, 13441, 13443, 13445, 13447, 13449, 13451, 13453, + 13455, 13457, 13459, 13461, 13463, 13465, 13467, 13469, 13471, 13473, + 13475, 13477, 13479, 13481, 13483, 13485, 13487, 13489, 13491, 13493, + 13495, 13497, 13499, 13501, 13503, 13505, 13507, 13509, 13511, 13513, + 13515, 13517, 13519, 13521, 13523, 13525, 13527, 13529, 13531, 13533, + 13535, 13537, 13539, 13541, 13543, 13545, 13547, 13549, 13551, 13553, + 13555, 13557, 13559, 13561, 13563, 13565, 13567, 13569, 13571, 13573, + 13575, 13577, 13579, 13581, 13583, 13585, 13587, 13589, 13591, 13593, + 13595, 13597, 13599, 13601, 13603, 13605, 13607, 13609, 13611, 13613, + 13615, 13617, 13619, 13621, 13623, 13625, 13627, 13629, 13631, 13633, + 13635, 13637, 13639, 13641, 13643, 13645, 13647, 13649, 13651, 13653, + 13655, 13657, 13659, 13661, 13663, 13665, 13667, 13669, 13671, 13673, + 13675, 13677, 13679, 13681, 13683, 13685, 13687, 13689, 13691, 13693, + 13695, 13697, 13699, 13701, 13703, 13705, 13707, 13709, 13711, 13713, + 13715, 13717, 13719, 13721, 13723, 13725, 13727, 13729, 13731, 13733, + 13735, 13737, 13739, 13741, 13743, 13745, 13747, 13749, 13751, 13753, + 13755, 13757, 13759, 13761, 13763, 13765, 13767, 13769, 13771, 13773, + 13775, 13777, 13779, 13781, 13783, 13785, 13787, 13789, 13791, 13793, + 13795, 13797, 13799, 13801, 13803, 13805, 13807, 13809, 13811, 13813, + 13815, 13817, 13819, 13821, 13823, 13825, 13827, 13829, 13831, 13833, + 13835, 13837, 13839, 13841, 13843, 13845, 13847, 13849, 13851, 13853, + 13855, 13857, 13859, 13861, 13863, 13865, 13867, 13869, 13871, 13873, + 13875, 13877, 13879, 13881, 13883, 13885, 13887, 13889, 13891, 13893, + 13895, 13897, 13899, 13901, 13903, 13905, 13907, 13909, 13911, 13913, + 13915, 13917, 13919, 13921, 13923, 13925, 13927, 13929, 13931, 13933, + 13935, 13937, 13939, 13941, 13943, 13945, 13947, 13949, 13951, 13953, + 13955, 13957, 13959, 13961, 13963, 13965, 13967, 13969, 13971, 13973, + 13975, 13977, 13979, 13981, 13983, 13985, 13987, 13989, 13991, 13993, + 13995, 13997, 13999, 14001, 14003, 14005, 14007, 14009, 14011, 14013, + 14015, 14017, 14019, 14021, 14023, 14025, 14027, 14029, 14031, 14033, + 14035, 14037, 14039, 14041, 14043, 14045, 14047, 14049, 14051, 14053, + 14055, 14057, 14059, 14061, 14063, 14065, 14067, 14069, 14071, 14073, + 14075, 14077, 14079, 14081, 14083, 14085, 14087, 14089, 14091, 14093, + 14095, 14097, 14099, 14101, 14103, 14105, 14107, 14109, 14111, 14113, + 14115, 14117, 14119, 14121, 14123, 14125, 14127, 14129, 14131, 14133, + 14135, 14137, 14139, 14141, 14143, 14145, 14147, 14149, 14151, 14153, + 14155, 14157, 14159, 14161, 14163, 14165, 14167, 14169, 14171, 14173, + 14175, 14177, 14179, 14181, 14183, 14185, 14187, 14189, 14191, 14193, + 14195, 14197, 14199, 14201, 14203, 14205, 14207, 14209, 14211, 14213, + 14215, 14217, 14219, 14221, 14223, 14225, 14227, 14229, 14231, 14233, + 14235, 14237, 14239, 14241, 14243, 14245, 14247, 14249, 14251, 14253, + 14255, 14257, 14259, 14261, 14263, 14265, 14267, 14269, 14271, 14273, + 14275, 14277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, }; /* NFC pairs */ #define COMP_SHIFT 2 static const unsigned short comp_index[] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, - 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 12, 0, 13, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 20, 0, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, - 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 33, 34, 35, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 39, 0, - 40, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 47, 0, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, - 51, 52, 53, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 56, 0, 57, 58, 59, 0, - 0, 0, 0, 0, 0, 0, 0, 60, 0, 61, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 63, 64, 65, 0, 66, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 71, 72, 73, 0, - 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 77, 0, 78, 79, 80, 81, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 85, - 0, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 104, 0, 0, 105, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 107, 108, 109, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 112, 113, - 114, 115, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 124, 0, 0, 125, 0, 0, 0, 0, - 0, 0, 0, 0, 126, 127, 128, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 130, 131, 132, 133, 134, 135, 0, 0, 0, 0, 0, 0, 0, 0, 136, 137, 138, 139, - 140, 141, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 144, 145, 146, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 148, 149, 150, 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, - 158, 159, 160, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 163, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 165, 0, 166, 167, 168, 0, 0, 0, 0, 0, 0, - 0, 0, 169, 0, 0, 170, 171, 172, 173, 174, 0, 0, 0, 0, 0, 0, 0, 0, 175, - 176, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 179, 180, 181, 182, - 183, 184, 185, 0, 0, 0, 0, 0, 0, 0, 0, 186, 187, 188, 189, 190, 191, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 196, 197, 198, 199, 200, 0, 0, 0, 0, 0, 0, 0, 0, 201, 202, - 203, 204, 205, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 208, 0, 209, - 210, 211, 0, 0, 0, 0, 0, 0, 0, 0, 212, 213, 214, 215, 216, 217, 218, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 221, 222, 223, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, 228, 0, 229, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 230, 231, 232, 0, 233, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 235, - 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 238, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 242, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 244, 245, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 249, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 251, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 255, 256, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 0, - 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, - 263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 264, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 266, 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, 270, 271, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 277, 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 279, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 282, - 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 298, 299, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 301, 0, 302, 0, 303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 305, 306, 0, 307, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 308, 0, 309, 0, 310, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 315, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 322, 0, 0, - 323, 0, 0, 324, 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 326, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 327, 0, 0, 0, 328, 0, 0, 329, 0, 0, 0, 0, 0, 0, 0, 0, 330, - 331, 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 0, 0, 0, 334, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 336, 337, 338, 0, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 340, 0, 0, 341, - 0, 0, 0, 342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 345, 346, 0, - 0, 347, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 350, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 352, 0, 0, 353, 0, 0, 0, 0, 0, 0, 0, 0, - 354, 355, 0, 356, 0, 0, 0, 357, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 359, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 361, 362, 363, 0, 364, 0, 0, 365, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, - 0, 367, 0, 0, 0, 368, 0, 0, 0, 0, 0, 0, 0, 369, 0, 0, 0, 0, 0, 0, 370, 0, - 0, 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 374, 375, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 379, 380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 381, 382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 385, 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 389, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, 397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 398, 399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401, 402, 403, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 406, 407, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 410, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 11, 0, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, + 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 32, 33, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 36, + 37, 38, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 0, 50, 0, 51, 52, 53, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 64, 65, 0, 66, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 71, + 72, 73, 74, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 77, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 78, 79, 0, 80, 81, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 84, 85, 86, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 90, 0, 91, + 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 100, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 101, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, + 104, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 107, 108, 109, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 111, 112, 0, 113, 114, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, + 118, 119, 120, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 123, 0, + 124, 0, 0, 0, 0, 0, 0, 0, 0, 125, 126, 127, 128, 0, 129, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 130, 0, 131, 132, 133, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 136, 137, 138, 139, 140, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 144, 145, 146, 0, 147, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 148, 149, 150, 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 155, 156, 157, 158, 159, 160, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 162, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 165, 166, + 167, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 170, 171, 172, 173, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 178, 179, 180, 0, 181, 182, 183, 0, 0, 0, 0, 0, 0, 0, 0, 184, 185, + 186, 187, 188, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 191, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 194, 195, 196, 197, 198, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 199, 200, 201, 0, 202, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 204, 205, 206, 207, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 210, 211, + 212, 213, 214, 215, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 0, 0, 218, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 220, 221, 222, 0, 223, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 226, + 227, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 238, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, + 249, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 252, 253, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 257, 0, 258, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 260, 261, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 266, + 267, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 270, 271, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 273, 274, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 279, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 282, + 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 285, 286, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 288, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 301, 302, 303, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305, 306, + 307, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 310, 311, 0, 312, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 314, 0, 315, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, + 0, 328, 329, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 332, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, 335, 0, 0, 0, 336, 0, 0, 0, 0, 0, + 0, 0, 337, 338, 339, 0, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 341, 0, 0, + 342, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 345, 346, 347, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 349, 0, 0, 0, 350, 0, 0, 351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, + 0, 0, 354, 355, 356, 0, 357, 0, 0, 358, 359, 0, 0, 0, 0, 0, 0, 0, 360, 0, + 0, 0, 361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 363, 364, 0, 0, + 365, 0, 0, 0, 0, 0, 0, 0, 0, 366, 367, 0, 368, 0, 0, 0, 369, 0, 0, 0, 0, + 0, 0, 0, 370, 371, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, 375, 376, 377, 378, 0, 0, + 379, 0, 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, 381, 0, 0, 0, 382, 0, 0, 0, 0, 0, + 0, 0, 383, 384, 0, 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 0, + 0, 0, 0, 0, 0, 389, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 393, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 395, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 399, 400, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 404, 405, 406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 407, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 410, 411, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 413, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 422, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, - 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 430, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 436, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, 438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 443, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 453, 0, 0, 0, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 456, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 461, 462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, - 0, 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 475, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476, 0, 0, 0, 0, 0, 0, 0, 477, 0, 0, - 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 0, 0, 479, 0, 0, 0, 0, 0, 0, 480, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 483, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 486, 0, 0, - 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 488, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 0, 0, - 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 494, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 0, 0, - 0, 0, 0, 0, 0, 501, 0, 0, 0, 0, 0, 0, 502, 0, 0, 0, 0, 0, 0, 0, 0, 503, - 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 505, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 508, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 510, 0, 0, 0, 0, 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 512, 0, - 0, 0, 0, 0, 0, 0, 0, 513, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 0, 0, - 515, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0, 0, 0, 0, 0, 0, 517, 0, 0, 0, 0, 0, - 0, 518, 0, 0, 0, 0, 0, 0, 0, 519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 521, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 523, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, - 0, 0, 526, 0, 0, 0, 0, 0, 0, 0, 527, 0, 0, 0, 0, 0, 0, 528, 0, 0, 0, 0, - 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 530, 0, 0, 0, 0, 0, 0, 0, 531, 0, 0, - 0, 0, 0, 0, 532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 533, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 538, 0, 0, 0, 0, 0, 0, 0, 0, 539, 0, 0, 0, 0, 0, 0, 540, 0, 0, - 0, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 547, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 550, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, 0, 554, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 556, 0, 0, 0, 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 558, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 567, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 570, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 576, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 579, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 588, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 594, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 597, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 601, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 603, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 604, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 606, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 609, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 612, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 615, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 618, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 621, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 630, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 633, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 636, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 639, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 642, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 645, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 654, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 656, + 0, 0, 0, 0, 0, 0, 0, 417, 418, 419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 422, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 430, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 432, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 436, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 442, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 445, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 455, 456, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 465, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, 0, 0, 0, 470, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476, 477, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 483, 0, 0, 0, 0, + 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 485, 0, 0, 0, 0, 0, 0, 486, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 492, 0, 0, 0, + 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 495, + 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 501, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 502, 0, 0, 0, 0, 0, 0, 0, 0, 503, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 505, 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 507, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 508, 0, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0, + 0, 0, 0, 510, 0, 0, 0, 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 517, 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 0, 0, 0, 0, 519, 0, 0, 0, 0, 0, 0, 0, 0, 520, 0, 0, 0, 0, 0, 0, 521, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 522, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 527, 0, + 0, 0, 0, 0, 0, 0, 0, 528, 0, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 530, 0, 0, 0, 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, 0, 532, 533, 0, 0, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 535, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, 0, 0, + 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 538, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 539, 540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 542, 0, 0, + 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 0, 545, 0, + 0, 0, 0, 0, 0, 0, 546, 547, 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, 0, 0, 0, 0, + 549, 0, 0, 0, 0, 0, 0, 550, 0, 0, 0, 0, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, + 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 556, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 560, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 0, 0, 0, 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 567, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 570, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 572, 0, 0, 0, 0, 0, 0, 0, 573, 0, 0, 0, 0, 0, 0, 574, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 576, 0, 0, 0, 0, 0, 0, 0, 577, 578, 0, 0, 0, 0, 0, 579, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 583, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 595, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 598, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 601, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 604, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 610, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 621, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 623, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 626, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 629, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 632, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 635, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 639, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 642, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 645, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 654, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, 661, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 664, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 665, 666, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 675, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 678, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 681, }; static const unsigned int comp_data[] = { - 0, 0, 0, 0, 0, 0, 0, 8814, 0, 8800, 0, 0, 0, 0, 0, 8815, 0, 0, 192, 193, + 0, 0, 0, 0, 0, 0, 0, 8814, 0, 0, 8800, 0, 0, 8815, 0, 0, 0, 192, 193, 194, 195, 256, 258, 550, 196, 7842, 197, 0, 461, 512, 514, 0, 0, 0, 7840, - 0, 7680, 0, 0, 260, 0, 0, 0, 0, 0, 7682, 0, 0, 7684, 0, 0, 0, 0, 7686, 0, - 0, 0, 0, 262, 264, 0, 0, 0, 266, 0, 0, 0, 0, 268, 0, 0, 0, 0, 0, 199, 0, - 0, 7690, 0, 0, 0, 0, 270, 0, 7692, 0, 0, 0, 7696, 0, 7698, 0, 0, 7694, 0, - 0, 0, 200, 201, 202, 7868, 274, 276, 278, 203, 7866, 0, 0, 282, 516, 518, - 0, 0, 0, 7864, 0, 0, 0, 552, 280, 7704, 0, 7706, 0, 0, 7710, 0, 0, 0, 0, - 500, 284, 0, 7712, 286, 288, 0, 0, 0, 0, 486, 0, 0, 0, 0, 0, 290, 0, 0, - 292, 0, 0, 0, 7714, 7718, 0, 0, 0, 542, 0, 7716, 0, 0, 0, 7720, 0, 0, - 7722, 0, 0, 0, 0, 0, 204, 205, 206, 296, 298, 300, 304, 207, 7880, 0, 0, - 463, 520, 522, 0, 0, 0, 7882, 302, 0, 0, 7724, 0, 0, 308, 0, 0, 0, 0, - 7728, 0, 488, 0, 0, 0, 0, 0, 7730, 0, 0, 0, 310, 7732, 0, 0, 0, 0, 313, - 0, 0, 0, 0, 0, 317, 0, 7734, 0, 0, 0, 315, 0, 7740, 0, 0, 7738, 0, 0, 0, - 0, 7742, 7744, 0, 0, 0, 0, 0, 0, 7746, 504, 323, 0, 209, 0, 0, 7748, 0, - 0, 0, 0, 327, 0, 7750, 0, 0, 0, 325, 0, 7754, 0, 0, 7752, 0, 0, 0, 210, - 211, 212, 213, 332, 334, 558, 214, 7886, 0, 336, 465, 524, 526, 0, 0, - 416, 7884, 490, 0, 0, 0, 0, 7764, 0, 0, 0, 0, 7766, 0, 0, 0, 0, 340, - 7768, 0, 0, 0, 0, 344, 528, 530, 0, 0, 0, 7770, 0, 0, 0, 342, 7774, 0, 0, - 0, 0, 346, 348, 0, 0, 0, 7776, 0, 0, 0, 0, 352, 0, 7778, 0, 0, 536, 350, - 0, 0, 7786, 0, 0, 0, 0, 356, 0, 0, 0, 0, 0, 7788, 0, 0, 538, 354, 0, - 7792, 0, 0, 7790, 0, 0, 0, 217, 218, 219, 360, 362, 364, 0, 220, 7910, + 0, 7680, 0, 0, 260, 0, 0, 7682, 0, 0, 7684, 0, 0, 0, 0, 7686, 0, 262, + 264, 0, 0, 0, 266, 0, 0, 0, 0, 268, 0, 199, 0, 0, 0, 7690, 0, 0, 0, 0, + 270, 0, 0, 0, 0, 0, 7692, 0, 0, 0, 7696, 0, 7698, 0, 0, 7694, 0, 0, 0, 0, + 200, 201, 202, 7868, 274, 276, 278, 203, 7866, 0, 0, 282, 516, 518, 0, 0, + 0, 7864, 0, 0, 0, 552, 280, 7704, 0, 7706, 0, 0, 0, 7710, 0, 500, 284, 0, + 7712, 286, 288, 0, 0, 0, 0, 486, 0, 290, 0, 0, 0, 292, 0, 0, 0, 7714, + 7718, 0, 0, 0, 542, 0, 0, 0, 0, 0, 7716, 0, 0, 0, 7720, 0, 0, 7722, 0, 0, + 204, 205, 206, 296, 298, 300, 304, 207, 7880, 0, 0, 463, 520, 522, 0, 0, + 0, 7882, 0, 0, 0, 0, 302, 0, 0, 7724, 0, 0, 0, 308, 0, 7728, 0, 0, 0, 0, + 0, 488, 0, 7730, 0, 0, 0, 310, 0, 0, 0, 0, 7732, 0, 0, 0, 0, 0, 313, 0, + 317, 0, 0, 0, 0, 0, 7734, 0, 0, 0, 315, 0, 7740, 0, 0, 7738, 0, 0, 0, 0, + 0, 7742, 0, 0, 0, 0, 7744, 0, 0, 7746, 0, 504, 323, 0, 209, 0, 0, 7748, + 0, 0, 0, 0, 327, 0, 7750, 0, 0, 0, 325, 0, 7754, 0, 0, 7752, 0, 0, 0, 0, + 210, 211, 212, 213, 332, 334, 558, 214, 7886, 0, 336, 465, 524, 526, 0, + 0, 416, 7884, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 7764, 7766, 0, 0, 0, 0, 0, + 340, 0, 0, 0, 0, 7768, 344, 528, 530, 0, 0, 0, 7770, 0, 0, 0, 342, 0, 0, + 0, 0, 7774, 0, 346, 348, 0, 0, 0, 7776, 0, 0, 0, 0, 352, 0, 7778, 0, 0, + 536, 350, 0, 0, 0, 7786, 0, 0, 0, 0, 356, 0, 7788, 0, 0, 538, 354, 0, + 7792, 0, 0, 7790, 0, 0, 0, 0, 217, 218, 219, 360, 362, 364, 0, 220, 7910, 366, 368, 467, 532, 534, 0, 0, 431, 7908, 7794, 0, 0, 0, 370, 7798, 0, - 7796, 0, 0, 0, 7804, 0, 0, 0, 0, 0, 7806, 7808, 7810, 372, 0, 0, 0, 7814, - 7812, 0, 7816, 0, 0, 7818, 7820, 0, 0, 7922, 221, 374, 7928, 562, 0, - 7822, 376, 7926, 0, 0, 0, 0, 7924, 0, 0, 0, 0, 0, 377, 7824, 0, 0, 0, - 379, 0, 0, 0, 0, 381, 0, 0, 0, 0, 0, 7826, 7828, 0, 0, 0, 224, 225, 226, - 227, 257, 259, 551, 228, 7843, 229, 0, 462, 513, 515, 0, 0, 0, 7841, 0, - 7681, 0, 0, 261, 0, 7683, 0, 0, 0, 0, 0, 0, 7685, 7687, 0, 0, 0, 0, 263, - 265, 0, 0, 0, 267, 0, 0, 0, 0, 269, 0, 231, 0, 0, 7691, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 0, 7693, 0, 0, 0, 7697, 0, 7699, 0, 0, 7695, 0, 0, 0, 232, - 233, 234, 7869, 275, 277, 279, 235, 7867, 0, 0, 283, 517, 519, 0, 0, 0, - 7865, 0, 0, 0, 553, 281, 7705, 0, 7707, 0, 0, 7711, 0, 0, 0, 0, 501, 285, - 0, 7713, 287, 289, 0, 0, 0, 0, 487, 0, 291, 0, 0, 293, 0, 0, 0, 7715, + 7796, 7804, 0, 0, 0, 0, 0, 7806, 0, 7808, 7810, 372, 0, 0, 0, 7814, 7812, + 0, 7816, 0, 0, 0, 7818, 7820, 0, 0, 0, 7922, 221, 374, 7928, 562, 0, + 7822, 376, 7926, 0, 0, 0, 0, 7924, 0, 0, 377, 7824, 0, 0, 0, 379, 381, 0, + 0, 0, 0, 0, 7826, 0, 0, 0, 0, 7828, 224, 225, 226, 227, 257, 259, 551, + 228, 7843, 229, 0, 462, 513, 515, 0, 0, 0, 7841, 0, 7681, 0, 0, 261, 0, + 0, 7683, 0, 0, 7685, 0, 0, 0, 0, 7687, 0, 0, 0, 0, 0, 263, 265, 0, 0, 0, + 267, 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, 231, 0, 0, 0, 7691, 271, 0, 0, 0, 0, + 0, 7693, 0, 0, 0, 7697, 0, 7699, 0, 0, 7695, 232, 233, 234, 7869, 275, + 277, 279, 235, 7867, 0, 0, 283, 517, 519, 0, 0, 0, 7865, 0, 0, 0, 553, + 281, 7705, 0, 7707, 0, 0, 0, 7711, 0, 0, 0, 0, 0, 501, 285, 0, 7713, 287, + 289, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 291, 0, 0, 0, 293, 0, 0, 0, 7715, 7719, 0, 0, 0, 543, 0, 0, 0, 0, 0, 7717, 0, 0, 0, 7721, 0, 0, 7723, 0, - 7830, 0, 0, 0, 236, 237, 238, 297, 299, 301, 0, 239, 7881, 0, 0, 464, - 521, 523, 0, 0, 0, 7883, 0, 0, 0, 0, 303, 0, 0, 7725, 0, 0, 309, 0, 0, 0, - 0, 496, 0, 0, 0, 7729, 0, 0, 0, 0, 0, 489, 0, 7731, 0, 0, 0, 311, 0, 0, - 0, 0, 7733, 0, 0, 0, 0, 314, 0, 318, 0, 0, 0, 0, 0, 7735, 0, 0, 0, 316, - 0, 7741, 0, 0, 7739, 0, 0, 0, 0, 7743, 0, 0, 0, 0, 7745, 0, 0, 7747, 0, - 0, 0, 0, 505, 324, 0, 241, 0, 0, 7749, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, - 7751, 0, 0, 0, 326, 0, 7755, 0, 0, 7753, 0, 0, 0, 242, 243, 244, 245, - 333, 335, 559, 246, 7887, 0, 337, 466, 525, 527, 0, 0, 417, 7885, 0, 0, - 0, 0, 491, 0, 0, 0, 0, 7765, 7767, 0, 0, 0, 0, 341, 0, 0, 0, 0, 7769, 0, - 0, 0, 0, 345, 529, 531, 0, 0, 0, 7771, 0, 0, 0, 343, 0, 0, 0, 0, 7775, 0, - 0, 0, 0, 347, 349, 0, 0, 0, 7777, 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, 7779, - 0, 0, 537, 351, 0, 0, 7787, 7831, 0, 0, 0, 357, 0, 7789, 0, 0, 539, 355, - 0, 7793, 0, 0, 7791, 0, 0, 0, 249, 250, 251, 361, 363, 365, 0, 252, 7911, - 367, 369, 468, 533, 535, 0, 0, 432, 7909, 7795, 0, 0, 0, 371, 7799, 0, - 7797, 0, 0, 0, 7805, 0, 7807, 0, 0, 0, 0, 7809, 7811, 373, 0, 0, 0, 7815, - 7813, 0, 7832, 0, 0, 0, 7817, 0, 0, 7819, 7821, 0, 0, 7923, 253, 375, - 7929, 563, 0, 7823, 255, 7927, 7833, 0, 0, 0, 7925, 0, 378, 7825, 0, 0, - 0, 380, 0, 0, 0, 0, 382, 0, 7827, 0, 0, 0, 0, 7829, 0, 0, 0, 8173, 901, - 0, 0, 8129, 0, 7846, 7844, 0, 7850, 7848, 0, 0, 0, 0, 0, 478, 0, 0, 506, - 0, 0, 0, 0, 0, 508, 0, 0, 482, 0, 0, 7688, 0, 0, 0, 0, 7872, 7870, 0, - 7876, 0, 0, 0, 0, 7874, 0, 0, 7726, 0, 0, 0, 0, 7890, 7888, 0, 7894, 0, - 0, 0, 0, 7892, 0, 0, 7756, 0, 0, 556, 0, 0, 7758, 0, 0, 554, 0, 0, 510, - 0, 0, 0, 0, 475, 471, 0, 0, 469, 0, 0, 473, 0, 0, 7847, 7845, 0, 7851, - 7849, 0, 0, 0, 0, 0, 479, 0, 0, 507, 0, 0, 0, 0, 0, 509, 0, 0, 483, 0, 0, - 7689, 0, 0, 0, 0, 7873, 7871, 0, 7877, 0, 0, 0, 0, 7875, 0, 0, 7727, 0, - 0, 0, 0, 7891, 7889, 0, 7895, 0, 0, 0, 0, 7893, 0, 0, 7757, 0, 0, 557, 0, - 0, 7759, 0, 0, 555, 0, 0, 511, 0, 0, 0, 0, 476, 472, 0, 0, 470, 0, 0, - 474, 0, 0, 7856, 7854, 0, 7860, 7858, 0, 0, 0, 0, 0, 7857, 7855, 0, 7861, - 0, 0, 0, 0, 7859, 0, 7700, 7702, 0, 0, 0, 0, 7701, 7703, 7760, 7762, 0, - 0, 0, 0, 7761, 7763, 0, 0, 7780, 0, 7781, 0, 0, 0, 0, 0, 7782, 0, 7783, - 0, 0, 0, 0, 7800, 0, 0, 0, 0, 0, 7801, 0, 0, 0, 7802, 0, 7803, 0, 0, 0, - 0, 7835, 0, 0, 0, 7900, 7898, 0, 7904, 0, 0, 0, 0, 7902, 0, 0, 0, 0, - 7906, 7901, 7899, 0, 7905, 7903, 0, 0, 0, 0, 7907, 0, 0, 0, 0, 7914, - 7912, 0, 7918, 0, 0, 0, 0, 7916, 0, 0, 0, 0, 7920, 7915, 7913, 0, 7919, - 7917, 0, 0, 0, 0, 7921, 0, 0, 0, 494, 0, 0, 492, 0, 0, 0, 0, 0, 493, 0, - 480, 0, 0, 0, 0, 0, 481, 0, 0, 7708, 0, 0, 0, 0, 0, 7709, 560, 0, 0, 0, - 0, 0, 561, 0, 0, 0, 0, 495, 0, 0, 8122, 902, 0, 0, 8121, 8120, 7944, - 7945, 0, 0, 0, 0, 0, 8124, 8136, 904, 0, 0, 0, 0, 7960, 7961, 0, 0, 8138, - 905, 7976, 7977, 0, 0, 0, 0, 0, 8140, 8154, 906, 0, 0, 8153, 8152, 0, - 938, 0, 0, 7992, 7993, 0, 0, 8184, 908, 8008, 8009, 0, 0, 0, 0, 0, 8172, - 0, 0, 8170, 910, 0, 0, 8169, 8168, 0, 939, 0, 0, 0, 8025, 0, 0, 8186, - 911, 0, 0, 0, 0, 8040, 8041, 0, 8188, 0, 0, 0, 0, 0, 8116, 0, 8132, 0, 0, - 0, 0, 8048, 940, 0, 0, 8113, 8112, 7936, 7937, 0, 0, 0, 0, 8118, 8115, - 8050, 941, 0, 0, 0, 0, 7952, 7953, 0, 0, 8052, 942, 7968, 7969, 0, 0, 0, - 0, 8134, 8131, 8054, 943, 0, 0, 8145, 8144, 0, 970, 0, 0, 7984, 7985, - 8150, 0, 0, 0, 0, 0, 8056, 972, 8000, 8001, 0, 0, 0, 0, 8164, 8165, 0, 0, - 8058, 973, 0, 0, 8161, 8160, 0, 971, 0, 0, 8016, 8017, 0, 0, 0, 0, 8166, - 0, 8060, 974, 0, 0, 0, 0, 8032, 8033, 8182, 8179, 0, 0, 0, 0, 8146, 912, - 0, 0, 8151, 0, 8162, 944, 0, 0, 8167, 0, 0, 0, 0, 0, 0, 8180, 0, 979, 0, - 0, 0, 0, 0, 980, 0, 1031, 0, 0, 0, 1232, 0, 1234, 0, 0, 0, 1027, 1024, 0, - 0, 0, 0, 1238, 0, 1025, 0, 0, 0, 1217, 0, 1244, 0, 0, 0, 0, 0, 1246, 0, - 0, 1037, 0, 0, 0, 1250, 1049, 0, 1252, 0, 0, 0, 1036, 0, 0, 0, 1254, 0, - 0, 1262, 1038, 0, 1264, 0, 0, 1266, 0, 0, 1268, 0, 0, 0, 0, 0, 1272, 0, - 1260, 0, 0, 0, 1233, 0, 1235, 0, 0, 0, 1107, 1104, 0, 0, 0, 0, 1239, 0, - 1105, 0, 0, 0, 1218, 0, 1245, 0, 0, 0, 0, 0, 1247, 0, 0, 1117, 0, 0, 0, - 1251, 1081, 0, 1253, 0, 0, 0, 1116, 0, 0, 0, 1255, 0, 0, 1263, 1118, 0, - 1265, 0, 0, 1267, 0, 0, 1269, 0, 0, 0, 0, 0, 1273, 0, 1261, 0, 0, 0, 0, - 0, 1111, 0, 0, 1142, 0, 1143, 0, 0, 0, 0, 1242, 0, 0, 0, 0, 0, 1243, 0, - 1258, 0, 0, 0, 0, 0, 1259, 1570, 1571, 1573, 0, 0, 0, 0, 1572, 0, 1574, - 0, 0, 0, 0, 0, 1730, 0, 1747, 0, 0, 0, 0, 0, 1728, 0, 0, 0, 2345, 0, - 2353, 0, 0, 0, 0, 0, 2356, 0, 0, 2507, 2508, 0, 0, 2891, 2888, 2892, 0, - 0, 0, 2964, 0, 0, 0, 0, 3018, 3020, 0, 0, 0, 0, 3019, 0, 0, 0, 3144, 0, - 0, 0, 3264, 3274, 3271, 3272, 0, 0, 0, 0, 3275, 0, 0, 0, 3402, 3404, 0, - 0, 0, 0, 3403, 0, 0, 0, 3546, 3548, 3550, 0, 0, 0, 3549, 4134, 0, 0, 0, - 0, 0, 0, 6918, 0, 6920, 0, 0, 0, 0, 0, 6922, 0, 6924, 0, 0, 0, 0, 0, - 6926, 0, 6930, 0, 0, 0, 0, 0, 6971, 0, 6973, 0, 0, 0, 0, 0, 6976, 0, - 6977, 0, 0, 0, 0, 0, 6979, 0, 0, 7736, 0, 7737, 0, 0, 0, 0, 0, 7772, 0, - 7773, 0, 0, 0, 7784, 0, 0, 0, 0, 0, 7785, 0, 7852, 0, 0, 7862, 0, 0, - 7853, 0, 0, 7863, 0, 0, 7878, 0, 0, 0, 0, 0, 7879, 0, 7896, 0, 0, 0, 0, - 0, 7897, 0, 0, 0, 7938, 7940, 0, 0, 7942, 8064, 7939, 7941, 0, 0, 7943, - 8065, 0, 0, 0, 0, 0, 8066, 0, 8067, 0, 0, 0, 0, 0, 8068, 0, 8069, 0, 0, - 0, 0, 0, 8070, 0, 8071, 0, 0, 0, 0, 7946, 7948, 0, 0, 7950, 8072, 7947, - 7949, 0, 0, 7951, 8073, 0, 0, 0, 0, 0, 8074, 0, 8075, 0, 0, 0, 0, 0, - 8076, 0, 8077, 0, 0, 0, 0, 0, 8078, 0, 8079, 0, 0, 0, 0, 7954, 7956, - 7955, 7957, 0, 0, 0, 0, 7962, 7964, 7963, 7965, 0, 0, 0, 0, 7970, 7972, - 0, 0, 7974, 8080, 7971, 7973, 0, 0, 7975, 8081, 0, 0, 0, 0, 0, 8082, 0, - 8083, 0, 0, 0, 0, 0, 8084, 0, 8085, 0, 0, 0, 0, 0, 8086, 0, 8087, 0, 0, - 0, 0, 7978, 7980, 0, 0, 7982, 8088, 7979, 7981, 0, 0, 7983, 8089, 0, 0, - 0, 0, 0, 8090, 0, 8091, 0, 0, 0, 0, 0, 8092, 0, 8093, 0, 0, 0, 0, 0, - 8094, 0, 8095, 0, 0, 0, 0, 7986, 7988, 0, 0, 7990, 0, 7987, 7989, 0, 0, - 7991, 0, 0, 0, 0, 0, 7994, 7996, 0, 0, 7998, 0, 7995, 7997, 0, 0, 7999, - 0, 0, 0, 0, 0, 8002, 8004, 8003, 8005, 0, 0, 0, 0, 8010, 8012, 8011, - 8013, 0, 0, 0, 0, 8018, 8020, 0, 0, 8022, 0, 8019, 8021, 0, 0, 8023, 0, - 0, 0, 0, 0, 8027, 8029, 0, 0, 8031, 0, 8034, 8036, 0, 0, 8038, 8096, 0, - 0, 0, 0, 8035, 8037, 0, 0, 8039, 8097, 0, 8098, 0, 0, 0, 0, 0, 8099, 0, - 8100, 0, 0, 0, 0, 0, 8101, 0, 8102, 0, 0, 0, 0, 0, 8103, 8042, 8044, 0, - 0, 8046, 8104, 0, 0, 0, 0, 8043, 8045, 0, 0, 8047, 8105, 0, 8106, 0, 0, - 0, 0, 0, 8107, 0, 8108, 0, 0, 0, 0, 0, 8109, 0, 8110, 0, 0, 0, 0, 0, - 8111, 0, 8114, 0, 0, 0, 0, 0, 8130, 0, 8178, 0, 0, 0, 0, 0, 8119, 8141, - 8142, 0, 0, 8143, 0, 0, 0, 0, 0, 0, 8135, 0, 8183, 0, 0, 0, 0, 8157, - 8158, 0, 0, 8159, 0, 0, 0, 0, 8602, 0, 8603, 0, 0, 0, 0, 0, 8622, 0, - 8653, 0, 0, 0, 0, 0, 8655, 0, 8654, 0, 0, 0, 0, 0, 8708, 0, 8713, 0, 0, - 0, 0, 0, 8716, 0, 8740, 0, 0, 0, 0, 0, 8742, 0, 8769, 0, 0, 0, 0, 0, - 8772, 0, 8775, 0, 0, 0, 0, 0, 8777, 0, 8813, 0, 0, 0, 0, 0, 8802, 0, - 8816, 0, 0, 0, 0, 0, 8817, 0, 8820, 0, 0, 0, 0, 0, 8821, 0, 8824, 0, 0, - 0, 0, 0, 8825, 0, 8832, 0, 0, 0, 0, 0, 8833, 0, 8928, 0, 0, 0, 0, 0, - 8929, 0, 8836, 0, 0, 0, 0, 0, 8837, 0, 8840, 0, 0, 0, 0, 0, 8841, 0, - 8930, 0, 0, 0, 0, 0, 8931, 0, 8876, 0, 0, 0, 0, 0, 8877, 0, 8878, 0, 0, - 0, 0, 0, 8879, 0, 8938, 0, 0, 0, 0, 0, 8939, 0, 8940, 0, 0, 0, 0, 0, - 8941, 0, 0, 12436, 0, 12364, 0, 0, 0, 0, 0, 12366, 0, 12368, 0, 0, 0, 0, - 0, 12370, 0, 12372, 0, 0, 0, 0, 0, 12374, 0, 12376, 0, 0, 0, 0, 0, 12378, - 0, 12380, 0, 0, 0, 0, 0, 12382, 0, 12384, 0, 0, 0, 0, 0, 12386, 0, 12389, - 0, 0, 0, 0, 0, 12391, 0, 12393, 0, 0, 0, 0, 0, 12400, 12401, 12403, - 12404, 0, 0, 0, 0, 12406, 12407, 12409, 12410, 0, 0, 0, 0, 12412, 12413, - 12446, 0, 0, 0, 0, 0, 12532, 0, 12460, 0, 0, 0, 0, 0, 12462, 0, 12464, 0, - 0, 0, 0, 0, 12466, 0, 12468, 0, 0, 0, 0, 0, 12470, 0, 12472, 0, 0, 0, 0, - 0, 12474, 0, 12476, 0, 0, 0, 0, 0, 12478, 0, 12480, 0, 0, 0, 0, 0, 12482, - 0, 12485, 0, 0, 0, 0, 0, 12487, 0, 12489, 0, 0, 0, 0, 0, 12496, 12497, - 12499, 12500, 0, 0, 0, 0, 12502, 12503, 12505, 12506, 0, 0, 0, 0, 12508, - 12509, 12535, 0, 0, 0, 0, 0, 12536, 0, 12537, 0, 0, 0, 0, 0, 12538, 0, - 12542, 0, 0, 0, 69786, 0, 0, 0, 0, 0, 69788, 0, 69803, 0, 0, 0, 0, 0, 0, - 69934, 0, 69935, 0, 0, 70475, 70476, 0, 0, 70844, 70843, 70846, 0, 0, - 71098, 0, 0, 0, 0, 0, 71099, + 7830, 236, 237, 238, 297, 299, 301, 0, 239, 7881, 0, 0, 464, 521, 523, 0, + 0, 0, 7883, 0, 0, 0, 0, 303, 0, 0, 7725, 0, 0, 0, 309, 0, 0, 0, 0, 496, + 0, 0, 0, 0, 7729, 0, 489, 0, 0, 0, 0, 0, 7731, 0, 0, 0, 311, 7733, 0, 0, + 0, 0, 0, 314, 0, 318, 0, 0, 0, 0, 0, 7735, 0, 0, 0, 316, 0, 7741, 0, 0, + 7739, 0, 7743, 0, 0, 0, 0, 7745, 0, 0, 7747, 0, 0, 0, 0, 0, 505, 324, 0, + 241, 0, 0, 7749, 0, 0, 0, 0, 328, 0, 7751, 0, 0, 0, 326, 0, 7755, 0, 0, + 7753, 0, 0, 0, 0, 242, 243, 244, 245, 333, 335, 559, 246, 7887, 0, 337, + 466, 525, 527, 0, 0, 417, 7885, 491, 0, 0, 0, 0, 0, 7765, 0, 0, 0, 0, + 7767, 0, 341, 0, 0, 0, 0, 7769, 0, 0, 0, 0, 345, 529, 531, 0, 0, 0, 7771, + 0, 0, 0, 343, 0, 0, 0, 0, 7775, 0, 347, 349, 0, 0, 0, 7777, 0, 0, 0, 0, + 353, 0, 7779, 0, 0, 537, 351, 0, 0, 0, 7787, 7831, 0, 0, 0, 357, 0, 0, 0, + 0, 0, 7789, 0, 0, 539, 355, 0, 7793, 0, 0, 7791, 0, 0, 0, 0, 249, 250, + 251, 361, 363, 365, 0, 252, 7911, 367, 369, 468, 533, 535, 0, 0, 432, + 7909, 7795, 0, 0, 0, 371, 7799, 0, 7797, 0, 0, 0, 0, 7805, 0, 7807, 0, 0, + 0, 0, 0, 7809, 7811, 373, 0, 0, 0, 7815, 7813, 0, 7832, 0, 0, 0, 7817, 0, + 0, 0, 7819, 7821, 0, 0, 0, 7923, 253, 375, 7929, 563, 0, 7823, 255, 7927, + 7833, 0, 0, 0, 7925, 0, 0, 378, 7825, 0, 0, 0, 380, 0, 0, 0, 0, 382, 0, + 7827, 0, 0, 0, 0, 7829, 0, 0, 0, 0, 8173, 901, 0, 0, 0, 0, 0, 0, 8129, 0, + 0, 7846, 7844, 0, 7850, 0, 0, 0, 0, 7848, 0, 0, 478, 0, 0, 0, 506, 0, 0, + 508, 0, 0, 482, 0, 0, 0, 7688, 0, 7872, 7870, 0, 7876, 0, 0, 0, 0, 7874, + 0, 0, 0, 7726, 0, 0, 0, 0, 0, 7890, 7888, 0, 7894, 0, 0, 0, 0, 7892, 0, + 0, 0, 7756, 0, 0, 556, 0, 0, 7758, 0, 0, 0, 554, 0, 0, 0, 510, 0, 0, 0, + 0, 0, 475, 471, 0, 0, 469, 0, 0, 473, 0, 0, 0, 7847, 7845, 0, 7851, 0, 0, + 0, 0, 7849, 0, 0, 479, 0, 0, 0, 507, 0, 0, 509, 0, 0, 483, 0, 0, 0, 7689, + 0, 7873, 7871, 0, 7877, 0, 0, 0, 0, 7875, 0, 0, 0, 7727, 0, 0, 0, 0, 0, + 7891, 7889, 0, 7895, 0, 0, 0, 0, 7893, 0, 0, 0, 7757, 0, 0, 557, 0, 0, + 7759, 0, 0, 0, 555, 0, 0, 0, 511, 0, 0, 0, 0, 0, 476, 472, 0, 0, 470, 0, + 0, 474, 0, 0, 0, 7856, 7854, 0, 7860, 0, 0, 0, 0, 7858, 0, 0, 7857, 7855, + 0, 7861, 0, 0, 0, 0, 7859, 0, 0, 7700, 7702, 0, 0, 0, 0, 0, 7701, 7703, + 0, 0, 0, 0, 0, 7760, 7762, 0, 7761, 7763, 0, 0, 0, 7780, 0, 0, 7781, 0, + 0, 7782, 0, 0, 0, 0, 0, 0, 7783, 0, 7800, 0, 0, 7801, 0, 0, 0, 0, 7802, + 0, 0, 7803, 0, 0, 0, 0, 0, 7835, 0, 0, 0, 0, 7900, 7898, 0, 7904, 0, 0, + 0, 0, 7902, 7906, 0, 0, 0, 0, 0, 7901, 7899, 0, 7905, 0, 0, 0, 0, 7903, + 0, 0, 0, 0, 7907, 0, 7914, 7912, 0, 7918, 0, 0, 0, 0, 7916, 0, 0, 0, 0, + 7920, 0, 7915, 7913, 0, 7919, 7917, 0, 0, 0, 0, 7921, 0, 0, 0, 0, 494, 0, + 0, 0, 492, 0, 0, 493, 0, 0, 480, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 7708, 0, + 0, 7709, 0, 560, 0, 0, 0, 0, 0, 0, 561, 0, 495, 0, 0, 0, 8122, 902, 0, 0, + 8121, 8120, 0, 0, 0, 0, 7944, 7945, 0, 0, 0, 0, 0, 8124, 0, 8136, 904, 0, + 0, 0, 0, 7960, 7961, 0, 0, 0, 8138, 905, 0, 0, 0, 0, 7976, 7977, 0, 8140, + 0, 0, 0, 0, 0, 8154, 906, 0, 0, 8153, 8152, 0, 938, 0, 0, 7992, 7993, 0, + 0, 0, 8184, 908, 0, 0, 0, 0, 8008, 8009, 0, 0, 0, 0, 0, 0, 8172, 0, 0, 0, + 8170, 910, 0, 0, 8169, 8168, 0, 939, 0, 0, 0, 8025, 0, 0, 0, 8186, 911, + 8040, 8041, 0, 0, 0, 0, 0, 8188, 0, 0, 8116, 0, 0, 8132, 0, 0, 0, 0, 0, + 8048, 940, 0, 0, 8113, 8112, 0, 0, 0, 0, 7936, 7937, 0, 0, 0, 0, 8118, + 8115, 0, 0, 0, 0, 0, 8050, 941, 7952, 7953, 0, 0, 0, 8052, 942, 0, 0, 0, + 0, 7968, 7969, 0, 0, 0, 0, 8134, 8131, 0, 8054, 943, 0, 0, 8145, 8144, 0, + 970, 0, 0, 7984, 7985, 8150, 0, 0, 0, 0, 0, 0, 8056, 972, 0, 0, 0, 0, + 8000, 8001, 0, 8164, 8165, 0, 0, 0, 8058, 973, 0, 0, 8161, 8160, 0, 971, + 0, 0, 0, 0, 0, 0, 8016, 8017, 0, 0, 0, 0, 8166, 0, 0, 8060, 974, 0, 0, 0, + 0, 8032, 8033, 8182, 8179, 0, 0, 0, 0, 0, 8146, 912, 0, 0, 0, 0, 0, 0, + 8151, 0, 0, 8162, 944, 0, 0, 8167, 0, 0, 0, 8180, 0, 0, 979, 0, 0, 0, 0, + 0, 980, 0, 0, 1031, 0, 0, 0, 0, 1232, 0, 1234, 0, 0, 0, 0, 1027, 0, 1024, + 0, 0, 0, 0, 1238, 0, 1025, 1217, 0, 1244, 0, 0, 1246, 0, 0, 0, 1037, 0, + 0, 0, 1250, 1049, 0, 1252, 0, 0, 0, 0, 1036, 0, 0, 0, 0, 1254, 0, 0, 0, + 1262, 1038, 0, 1264, 0, 0, 1266, 0, 0, 0, 1268, 0, 0, 0, 0, 0, 0, 1272, + 0, 0, 1260, 0, 0, 0, 0, 1233, 0, 1235, 0, 0, 0, 0, 1107, 0, 1104, 0, 0, + 0, 0, 1239, 0, 1105, 1218, 0, 1245, 0, 0, 1247, 0, 0, 0, 1117, 0, 0, 0, + 1251, 1081, 0, 1253, 0, 0, 0, 0, 1116, 0, 0, 0, 0, 1255, 0, 0, 0, 1263, + 1118, 0, 1265, 0, 0, 1267, 0, 0, 0, 1269, 0, 0, 0, 0, 0, 0, 1273, 0, 0, + 1261, 0, 0, 1111, 0, 0, 0, 1142, 0, 0, 1143, 0, 0, 0, 0, 0, 1242, 0, 0, + 1243, 0, 0, 1258, 0, 0, 0, 0, 0, 0, 1259, 0, 1570, 1571, 1573, 0, 1572, + 0, 0, 1574, 0, 0, 0, 0, 0, 0, 1730, 0, 0, 1747, 0, 0, 1728, 0, 0, 0, 0, + 2345, 0, 0, 2353, 0, 0, 2356, 0, 0, 0, 2507, 2508, 0, 0, 0, 2891, 2888, + 2892, 2964, 0, 0, 0, 0, 0, 3018, 3020, 0, 3019, 0, 0, 0, 0, 3144, 0, 0, + 0, 0, 3264, 0, 3274, 3271, 3272, 0, 3275, 0, 0, 0, 0, 3402, 3404, 0, + 3403, 0, 0, 0, 0, 3546, 3548, 3550, 0, 0, 0, 0, 3549, 0, 0, 0, 0, 0, + 4134, 0, 0, 0, 6918, 0, 0, 6920, 0, 0, 6922, 0, 0, 6924, 0, 0, 0, 0, 0, + 0, 6926, 0, 0, 6930, 0, 0, 6971, 0, 0, 6973, 0, 0, 0, 0, 0, 0, 6976, 0, + 0, 6977, 0, 0, 6979, 0, 0, 0, 7736, 0, 0, 7737, 0, 0, 0, 0, 0, 0, 7772, + 0, 0, 7773, 0, 0, 0, 0, 7784, 0, 0, 7785, 0, 0, 7852, 0, 0, 7862, 0, 0, + 0, 7853, 0, 0, 7863, 0, 0, 0, 7878, 0, 0, 7879, 0, 0, 7896, 0, 0, 7897, + 0, 0, 0, 0, 7938, 7940, 0, 0, 7942, 8064, 0, 7939, 7941, 0, 0, 7943, + 8065, 0, 0, 8066, 0, 0, 0, 0, 0, 0, 8067, 0, 0, 8068, 0, 0, 8069, 0, 0, + 8070, 0, 0, 0, 0, 0, 0, 8071, 0, 7946, 7948, 0, 0, 7950, 8072, 0, 7947, + 7949, 0, 0, 7951, 8073, 0, 0, 8074, 0, 0, 0, 0, 0, 0, 8075, 0, 0, 8076, + 0, 0, 8077, 0, 0, 8078, 0, 0, 0, 0, 0, 0, 8079, 0, 7954, 7956, 0, 7955, + 7957, 0, 0, 0, 0, 0, 7962, 7964, 0, 0, 0, 0, 0, 7963, 7965, 0, 7970, + 7972, 0, 0, 7974, 8080, 0, 7971, 7973, 0, 0, 7975, 8081, 0, 0, 8082, 0, + 0, 0, 0, 0, 0, 8083, 0, 0, 8084, 0, 0, 8085, 0, 0, 8086, 0, 0, 0, 0, 0, + 0, 8087, 0, 7978, 7980, 0, 0, 7982, 8088, 0, 7979, 7981, 0, 0, 7983, + 8089, 0, 0, 8090, 0, 0, 0, 0, 0, 0, 8091, 0, 0, 8092, 0, 0, 8093, 0, 0, + 8094, 0, 0, 0, 0, 0, 0, 8095, 0, 7986, 7988, 0, 0, 7990, 0, 0, 7987, + 7989, 0, 0, 7991, 0, 0, 0, 0, 0, 0, 7994, 7996, 0, 0, 0, 0, 0, 0, 7998, + 0, 0, 7995, 7997, 0, 0, 7999, 0, 0, 8002, 8004, 0, 8003, 8005, 0, 0, 0, + 0, 0, 8010, 8012, 0, 0, 0, 0, 0, 8011, 8013, 0, 8018, 8020, 0, 0, 8022, + 0, 0, 8019, 8021, 0, 0, 8023, 0, 0, 0, 0, 0, 0, 8027, 8029, 0, 0, 0, 0, + 0, 0, 8031, 0, 0, 8034, 8036, 0, 0, 8038, 8096, 0, 8035, 8037, 0, 0, + 8039, 8097, 0, 0, 8098, 0, 0, 8099, 0, 0, 0, 0, 0, 0, 8100, 0, 0, 8101, + 0, 0, 8102, 0, 0, 8103, 0, 0, 0, 0, 0, 8042, 8044, 0, 0, 8046, 8104, 0, + 8043, 8045, 0, 0, 8047, 8105, 0, 0, 8106, 0, 0, 8107, 0, 0, 0, 0, 0, 0, + 8108, 0, 0, 8109, 0, 0, 8110, 0, 0, 8111, 0, 0, 0, 0, 0, 0, 8114, 0, 0, + 8130, 0, 0, 8178, 0, 0, 8119, 0, 0, 0, 0, 0, 8141, 8142, 0, 0, 8143, 0, + 0, 0, 8135, 0, 0, 8183, 0, 0, 0, 0, 0, 8157, 8158, 0, 0, 0, 0, 0, 0, + 8159, 0, 8602, 0, 0, 8603, 0, 0, 0, 0, 0, 0, 8622, 0, 0, 8653, 0, 0, + 8655, 0, 0, 8654, 0, 0, 0, 0, 0, 0, 8708, 0, 0, 8713, 0, 0, 8716, 0, 0, + 8740, 0, 0, 0, 0, 0, 0, 8742, 0, 0, 8769, 0, 0, 8772, 0, 0, 8775, 0, 0, + 0, 0, 0, 0, 8777, 0, 0, 8813, 0, 0, 8802, 0, 0, 8816, 0, 0, 0, 0, 0, 0, + 8817, 0, 0, 8820, 0, 0, 8821, 0, 0, 8824, 0, 0, 0, 0, 0, 0, 8825, 0, 0, + 8832, 0, 0, 8833, 0, 0, 8928, 0, 0, 0, 0, 0, 0, 8929, 0, 0, 8836, 0, 0, + 8837, 0, 0, 8840, 0, 0, 0, 0, 0, 0, 8841, 0, 0, 8930, 0, 0, 8931, 0, 0, + 8876, 0, 0, 0, 0, 0, 0, 8877, 0, 0, 8878, 0, 0, 8879, 0, 0, 8938, 0, 0, + 0, 0, 0, 0, 8939, 0, 0, 8940, 0, 0, 8941, 0, 0, 0, 12436, 0, 0, 12364, 0, + 0, 0, 0, 0, 0, 12366, 0, 0, 12368, 0, 0, 12370, 0, 0, 12372, 0, 0, 0, 0, + 0, 0, 12374, 0, 0, 12376, 0, 0, 12378, 0, 0, 12380, 0, 0, 0, 0, 0, 0, + 12382, 0, 0, 12384, 0, 0, 12386, 0, 0, 12389, 0, 0, 0, 0, 0, 0, 12391, 0, + 0, 12393, 0, 0, 12400, 12401, 0, 12403, 12404, 0, 0, 0, 0, 0, 12406, + 12407, 0, 0, 0, 0, 0, 12409, 12410, 0, 12412, 12413, 0, 12446, 0, 0, 0, + 0, 0, 0, 12532, 0, 0, 12460, 0, 0, 12462, 0, 0, 12464, 0, 0, 0, 0, 0, 0, + 12466, 0, 0, 12468, 0, 0, 12470, 0, 0, 12472, 0, 0, 0, 0, 0, 0, 12474, 0, + 0, 12476, 0, 0, 12478, 0, 0, 12480, 0, 0, 0, 0, 0, 0, 12482, 0, 0, 12485, + 0, 0, 12487, 0, 0, 12489, 0, 0, 0, 0, 0, 0, 12496, 12497, 0, 0, 0, 0, 0, + 12499, 12500, 0, 12502, 12503, 0, 12505, 12506, 0, 0, 0, 0, 0, 12508, + 12509, 0, 0, 0, 0, 0, 12535, 0, 0, 12536, 0, 0, 12537, 0, 0, 0, 0, 0, 0, + 12538, 0, 0, 12542, 0, 0, 0, 0, 69786, 0, 0, 69788, 0, 0, 69803, 0, 0, 0, + 69934, 0, 0, 69935, 0, 0, 0, 70475, 70476, 0, 0, 0, 70844, 70843, 70846, + 0, 0, 0, 71098, 0, 0, 71099, 0, 0, 0, 71992, }; static const change_record change_records_3_2_0[] = { @@ -6008,53 +6076,56 @@ static const unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 114, 115, 116, 117, 118, 119, 2, 2, 120, 121, 122, 2, 123, 124, 125, 126, 127, 128, 2, 129, 130, 131, 132, 133, 134, 2, 51, 51, 135, 2, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 2, - 147, 2, 148, 149, 150, 151, 152, 153, 154, 155, 156, 2, 157, 158, 2, 159, - 160, 161, 162, 2, 163, 164, 2, 165, 166, 167, 2, 2, 168, 169, 170, 171, - 2, 172, 2, 173, 51, 51, 51, 51, 51, 51, 51, 174, 175, 51, 176, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 51, - 51, 51, 51, 177, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 178, 2, 2, 2, 2, 2, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 2, 158, 159, 2, + 160, 161, 162, 163, 2, 164, 165, 166, 167, 168, 169, 2, 2, 170, 171, 172, + 173, 2, 174, 2, 175, 51, 51, 51, 51, 51, 51, 51, 176, 177, 51, 178, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, + 51, 51, 51, 51, 179, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 180, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 179, 180, 181, - 182, 2, 2, 2, 2, 89, 183, 184, 185, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 181, 182, + 183, 184, 2, 2, 2, 2, 185, 186, 187, 188, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 103, 51, 51, 51, 51, 51, 186, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 51, 51, 51, 103, 51, 51, 51, 51, 51, 51, 51, 51, 51, 189, 190, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 187, 51, 51, 188, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 189, 190, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 191, 51, + 51, 192, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 193, 194, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 191, 192, 193, 194, 195, 2, 2, 196, 2, - 2, 2, 197, 198, 199, 51, 51, 51, 51, 51, 200, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 201, 2, 202, 2, 2, 203, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 204, 205, 2, - 2, 2, 2, 2, 206, 207, 208, 2, 209, 210, 2, 2, 211, 212, 213, 214, 215, 2, - 51, 51, 51, 51, 51, 51, 51, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 225, 226, 98, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 87, 227, 2, 228, 229, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 195, 196, 197, 198, 199, + 2, 2, 200, 2, 2, 2, 201, 202, 203, 51, 51, 51, 51, 51, 204, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 205, 2, 206, 2, 2, 207, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 51, 208, 209, 2, 2, 2, 2, 2, 210, 211, 212, 2, 213, 214, 2, 2, 215, 216, + 51, 217, 218, 2, 51, 51, 51, 51, 51, 51, 51, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 51, 228, 2, 2, 2, 2, 2, 2, 2, 2, 229, 230, 98, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 87, 231, 2, 232, 233, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 230, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 231, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 232, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 234, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 235, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 236, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 233, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 237, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 238, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 239, 51, 240, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 234, 51, 235, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 236, 51, 51, + 51, 51, 51, 51, 241, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 242, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 234, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 237, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 230, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 51, 51, 51, 51, 51, 243, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -6287,9 +6358,9 @@ static const unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 244, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 238, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -6351,9 +6422,7 @@ static const unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static const unsigned char changes_3_2_0_data[] = { @@ -6439,8 +6508,8 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6467,7 +6536,7 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6485,12 +6554,12 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 20, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6607,7 +6676,7 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -6741,7 +6810,7 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -6770,7 +6839,7 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6790,8 +6859,8 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, @@ -6838,8 +6907,8 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, @@ -6894,7 +6963,7 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6919,11 +6988,11 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, @@ -6958,7 +7027,7 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -7045,7 +7114,7 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -7152,192 +7221,208 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, - 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, - 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, - 0, 9, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7352,160 +7437,160 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, + 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 57, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, - 9, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, - 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, 0, 9, - 9, 0, 9, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 9, 0, 9, 0, 0, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, 9, + 0, 9, 0, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, + 9, 0, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, @@ -7517,9 +7602,9 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -7537,54 +7622,65 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, - 9, 9, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7594,42 +7690,47 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, diff --git a/Modules/unicodename_db.h b/Modules/unicodename_db.h index 60521106..793d5109 100644 --- a/Modules/unicodename_db.h +++ b/Modules/unicodename_db.h @@ -4,8 +4,8 @@ /* lexicon */ static const unsigned char lexicon[] = { - 76, 69, 84, 84, 69, 210, 83, 73, 71, 206, 87, 73, 84, 200, 83, 77, 65, - 76, 204, 83, 89, 76, 76, 65, 66, 76, 197, 67, 65, 80, 73, 84, 65, 204, + 76, 69, 84, 84, 69, 210, 83, 77, 65, 76, 204, 83, 73, 71, 206, 87, 73, + 84, 200, 83, 89, 76, 76, 65, 66, 76, 197, 67, 65, 80, 73, 84, 65, 204, 72, 73, 69, 82, 79, 71, 76, 89, 80, 200, 76, 65, 84, 73, 206, 65, 82, 65, 66, 73, 195, 67, 85, 78, 69, 73, 70, 79, 82, 205, 89, 201, 67, 74, 203, 77, 65, 84, 72, 69, 77, 65, 84, 73, 67, 65, 204, 69, 71, 89, 80, 84, 73, @@ -13,942 +13,946 @@ static const unsigned char lexicon[] = { 66, 79, 204, 68, 73, 71, 73, 212, 86, 79, 87, 69, 204, 84, 65, 78, 71, 85, 212, 70, 79, 82, 77, 128, 67, 65, 78, 65, 68, 73, 65, 206, 83, 89, 76, 76, 65, 66, 73, 67, 211, 83, 73, 71, 78, 87, 82, 73, 84, 73, 78, 199, - 84, 73, 77, 69, 211, 66, 65, 77, 85, 205, 65, 78, 196, 66, 79, 76, 196, - 65, 78, 65, 84, 79, 76, 73, 65, 206, 72, 65, 78, 71, 85, 204, 76, 73, 78, - 69, 65, 210, 78, 85, 77, 66, 69, 210, 71, 82, 69, 69, 203, 76, 73, 71, - 65, 84, 85, 82, 197, 77, 85, 83, 73, 67, 65, 204, 69, 84, 72, 73, 79, 80, - 73, 195, 70, 79, 210, 67, 79, 77, 66, 73, 78, 73, 78, 199, 193, 67, 89, - 82, 73, 76, 76, 73, 195, 73, 84, 65, 76, 73, 195, 84, 65, 77, 73, 204, - 78, 85, 83, 72, 213, 82, 65, 68, 73, 67, 65, 204, 83, 65, 78, 83, 45, 83, - 69, 82, 73, 198, 67, 73, 82, 67, 76, 69, 196, 83, 81, 85, 65, 82, 197, - 70, 73, 78, 65, 204, 84, 65, 201, 76, 69, 70, 212, 65, 82, 82, 79, 87, - 128, 68, 79, 85, 66, 76, 197, 82, 73, 71, 72, 212, 86, 65, 201, 83, 73, - 71, 78, 128, 72, 69, 78, 84, 65, 73, 71, 65, 78, 193, 65, 66, 79, 86, 69, - 128, 66, 76, 65, 67, 203, 87, 72, 73, 84, 197, 66, 69, 76, 79, 87, 128, - 65, 82, 82, 79, 215, 86, 65, 82, 73, 65, 84, 73, 79, 206, 65, 128, 66, - 82, 65, 73, 76, 76, 197, 80, 65, 84, 84, 69, 82, 206, 85, 128, 66, 89, - 90, 65, 78, 84, 73, 78, 197, 73, 128, 73, 83, 79, 76, 65, 84, 69, 196, - 75, 65, 84, 65, 75, 65, 78, 193, 79, 128, 77, 79, 68, 73, 70, 73, 69, - 210, 194, 77, 89, 65, 78, 77, 65, 210, 68, 79, 212, 79, 198, 77, 65, 82, - 75, 128, 75, 65, 78, 71, 88, 201, 75, 73, 75, 65, 75, 85, 201, 77, 69, - 78, 68, 197, 84, 73, 66, 69, 84, 65, 206, 86, 69, 82, 84, 73, 67, 65, - 204, 73, 78, 73, 84, 73, 65, 204, 72, 69, 65, 86, 217, 72, 77, 79, 78, - 199, 77, 69, 69, 205, 67, 79, 80, 84, 73, 195, 75, 72, 77, 69, 210, 65, - 66, 79, 86, 197, 82, 73, 71, 72, 84, 87, 65, 82, 68, 211, 67, 65, 82, 82, - 73, 69, 210, 89, 69, 200, 71, 69, 79, 82, 71, 73, 65, 206, 67, 72, 69, - 82, 79, 75, 69, 197, 77, 79, 78, 71, 79, 76, 73, 65, 206, 79, 78, 197, - 80, 76, 85, 211, 84, 87, 207, 79, 78, 69, 128, 68, 69, 86, 65, 78, 65, - 71, 65, 82, 201, 84, 87, 79, 128, 83, 81, 85, 65, 82, 69, 196, 80, 72, - 65, 83, 69, 45, 197, 83, 89, 77, 66, 79, 76, 128, 83, 84, 82, 79, 75, 69, - 128, 76, 69, 70, 84, 87, 65, 82, 68, 211, 67, 79, 78, 83, 79, 78, 65, 78, - 212, 77, 73, 65, 207, 86, 79, 67, 65, 76, 73, 195, 66, 79, 216, 77, 73, - 68, 68, 76, 197, 84, 73, 76, 197, 68, 85, 80, 76, 79, 89, 65, 206, 84, - 72, 82, 69, 197, 74, 79, 78, 71, 83, 69, 79, 78, 199, 77, 65, 82, 203, - 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, 196, 84, 72, 65, 205, 71, - 79, 78, 68, 201, 72, 79, 79, 75, 128, 72, 69, 66, 82, 69, 215, 85, 208, - 71, 76, 65, 71, 79, 76, 73, 84, 73, 195, 76, 79, 215, 79, 86, 69, 210, - 83, 73, 89, 65, 209, 68, 82, 65, 87, 73, 78, 71, 211, 72, 73, 71, 200, - 77, 65, 76, 65, 89, 65, 76, 65, 205, 73, 78, 68, 69, 216, 80, 65, 72, 65, - 87, 200, 84, 72, 82, 69, 69, 128, 68, 79, 87, 206, 70, 79, 85, 82, 128, - 67, 72, 79, 83, 69, 79, 78, 199, 72, 65, 76, 70, 87, 73, 68, 84, 200, 72, - 65, 78, 68, 45, 70, 73, 83, 212, 77, 69, 82, 79, 73, 84, 73, 195, 66, 65, - 76, 73, 78, 69, 83, 197, 72, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 73, 195, 83, 67, 82, 73, 80, 212, 70, 73, 86, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 205, 80, 72, 65, 83, 69, 45, 196, 84, 79, 128, 65, 76, 67, - 72, 69, 77, 73, 67, 65, 204, 65, 76, 69, 198, 84, 79, 78, 197, 83, 73, - 78, 72, 65, 76, 193, 66, 65, 82, 128, 75, 65, 128, 78, 85, 77, 69, 82, - 73, 195, 72, 65, 76, 198, 66, 82, 65, 72, 77, 201, 72, 85, 78, 71, 65, - 82, 73, 65, 206, 80, 65, 128, 84, 72, 85, 77, 194, 84, 85, 82, 78, 69, - 196, 89, 65, 128, 66, 65, 82, 194, 77, 65, 128, 83, 73, 88, 128, 72, 65, - 200, 82, 65, 128, 84, 72, 79, 85, 83, 65, 78, 68, 128, 69, 73, 71, 72, - 84, 128, 76, 65, 128, 78, 79, 82, 84, 200, 70, 85, 76, 76, 87, 73, 68, - 84, 200, 76, 73, 71, 72, 212, 78, 65, 128, 83, 69, 86, 69, 78, 128, 66, - 82, 65, 67, 75, 69, 84, 128, 69, 81, 85, 65, 204, 76, 79, 78, 199, 78, - 73, 78, 69, 128, 83, 65, 128, 84, 65, 199, 68, 79, 77, 73, 78, 207, 65, - 67, 85, 84, 69, 128, 70, 82, 65, 75, 84, 85, 210, 72, 73, 82, 65, 71, 65, - 78, 193, 84, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 210, 70, 82, 65, - 67, 84, 73, 79, 206, 79, 80, 69, 206, 80, 72, 65, 83, 69, 45, 195, 84, - 69, 76, 85, 71, 213, 90, 90, 89, 88, 128, 90, 90, 89, 84, 128, 90, 90, - 89, 82, 88, 128, 90, 90, 89, 82, 128, 90, 90, 89, 80, 128, 90, 90, 89, - 65, 128, 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, 128, - 90, 90, 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, 83, - 89, 65, 128, 90, 90, 83, 65, 128, 90, 90, 79, 88, 128, 90, 90, 79, 80, - 128, 90, 90, 79, 128, 90, 90, 73, 88, 128, 90, 90, 73, 84, 128, 90, 90, - 73, 80, 128, 90, 90, 73, 69, 88, 128, 90, 90, 73, 69, 84, 128, 90, 90, - 73, 69, 80, 128, 90, 90, 73, 69, 128, 90, 90, 73, 128, 90, 90, 69, 88, - 128, 90, 90, 69, 80, 128, 90, 90, 69, 69, 128, 90, 90, 69, 128, 90, 90, - 65, 88, 128, 90, 90, 65, 84, 128, 90, 90, 65, 80, 128, 90, 90, 65, 65, - 128, 90, 90, 65, 128, 90, 89, 71, 79, 83, 128, 90, 87, 83, 80, 128, 90, - 87, 78, 74, 128, 90, 87, 78, 66, 83, 80, 128, 90, 87, 74, 128, 90, 87, - 202, 90, 87, 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, - 128, 90, 85, 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 85, - 77, 128, 90, 85, 66, 85, 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 213, - 90, 83, 72, 65, 128, 90, 82, 65, 128, 90, 81, 65, 80, 72, 193, 90, 79, - 84, 128, 90, 79, 79, 128, 90, 79, 77, 66, 73, 69, 128, 90, 79, 65, 128, - 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, 74, 69, 128, 90, - 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 80, 80, 69, 82, 45, 77, - 79, 85, 84, 200, 90, 73, 78, 79, 82, 128, 90, 73, 76, 68, 69, 128, 90, - 73, 71, 90, 65, 199, 90, 73, 71, 128, 90, 73, 68, 193, 90, 73, 66, 128, - 90, 73, 194, 90, 73, 51, 128, 90, 201, 90, 72, 89, 88, 128, 90, 72, 89, - 84, 128, 90, 72, 89, 82, 88, 128, 90, 72, 89, 82, 128, 90, 72, 89, 80, - 128, 90, 72, 89, 128, 90, 72, 87, 69, 128, 90, 72, 87, 65, 128, 90, 72, - 85, 88, 128, 90, 72, 85, 84, 128, 90, 72, 85, 82, 88, 128, 90, 72, 85, - 82, 128, 90, 72, 85, 80, 128, 90, 72, 85, 79, 88, 128, 90, 72, 85, 79, - 80, 128, 90, 72, 85, 79, 128, 90, 72, 85, 128, 90, 72, 79, 88, 128, 90, - 72, 79, 84, 128, 90, 72, 79, 80, 128, 90, 72, 79, 79, 128, 90, 72, 79, - 73, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, 128, 90, 72, 73, - 76, 128, 90, 72, 73, 128, 90, 72, 69, 88, 128, 90, 72, 69, 84, 128, 90, - 72, 69, 80, 128, 90, 72, 69, 69, 128, 90, 72, 69, 128, 90, 72, 197, 90, - 72, 65, 89, 73, 78, 128, 90, 72, 65, 88, 128, 90, 72, 65, 84, 128, 90, - 72, 65, 82, 128, 90, 72, 65, 80, 128, 90, 72, 65, 73, 78, 128, 90, 72, - 65, 65, 128, 90, 72, 65, 128, 90, 72, 128, 90, 69, 85, 83, 128, 90, 69, - 84, 65, 128, 90, 69, 82, 79, 128, 90, 69, 82, 207, 90, 69, 78, 128, 90, - 69, 77, 76, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, 90, 69, 66, 82, - 193, 90, 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, - 45, 89, 79, 68, 72, 128, 90, 65, 89, 73, 78, 128, 90, 65, 89, 73, 206, - 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, 128, 90, 65, 82, 81, - 65, 128, 90, 65, 82, 76, 128, 90, 65, 81, 69, 198, 90, 65, 78, 65, 66, - 65, 90, 65, 210, 90, 65, 77, 88, 128, 90, 65, 76, 128, 90, 65, 204, 90, - 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90, 65, 72, 128, 90, - 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 65, 55, 128, 90, 193, - 90, 48, 49, 54, 72, 128, 90, 48, 49, 54, 71, 128, 90, 48, 49, 54, 70, - 128, 90, 48, 49, 54, 69, 128, 90, 48, 49, 54, 68, 128, 90, 48, 49, 54, - 67, 128, 90, 48, 49, 54, 66, 128, 90, 48, 49, 54, 65, 128, 90, 48, 49, - 54, 128, 90, 48, 49, 53, 73, 128, 90, 48, 49, 53, 72, 128, 90, 48, 49, - 53, 71, 128, 90, 48, 49, 53, 70, 128, 90, 48, 49, 53, 69, 128, 90, 48, - 49, 53, 68, 128, 90, 48, 49, 53, 67, 128, 90, 48, 49, 53, 66, 128, 90, - 48, 49, 53, 65, 128, 90, 48, 49, 53, 128, 90, 48, 49, 52, 128, 90, 48, - 49, 51, 128, 90, 48, 49, 50, 128, 90, 48, 49, 49, 128, 90, 48, 49, 48, - 128, 90, 48, 48, 57, 128, 90, 48, 48, 56, 128, 90, 48, 48, 55, 128, 90, - 48, 48, 54, 128, 90, 48, 48, 53, 65, 128, 90, 48, 48, 53, 128, 90, 48, - 48, 52, 65, 128, 90, 48, 48, 52, 128, 90, 48, 48, 51, 66, 128, 90, 48, - 48, 51, 65, 128, 90, 48, 48, 51, 128, 90, 48, 48, 50, 68, 128, 90, 48, - 48, 50, 67, 128, 90, 48, 48, 50, 66, 128, 90, 48, 48, 50, 65, 128, 90, - 48, 48, 50, 128, 90, 48, 48, 49, 128, 90, 128, 218, 89, 89, 88, 128, 89, - 89, 84, 128, 89, 89, 82, 88, 128, 89, 89, 82, 128, 89, 89, 80, 128, 89, - 89, 69, 128, 89, 89, 65, 65, 128, 89, 89, 65, 128, 89, 89, 128, 89, 87, - 79, 79, 128, 89, 87, 79, 128, 89, 87, 73, 73, 128, 89, 87, 73, 128, 89, - 87, 69, 128, 89, 87, 65, 65, 128, 89, 87, 65, 128, 89, 86, 128, 89, 85, - 88, 128, 89, 85, 87, 79, 81, 128, 89, 85, 85, 75, 65, 76, 69, 65, 80, 73, - 78, 84, 85, 128, 89, 85, 85, 128, 89, 85, 84, 128, 89, 85, 83, 128, 89, - 85, 211, 89, 85, 82, 88, 128, 89, 85, 82, 128, 89, 85, 81, 128, 89, 85, - 209, 89, 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, 79, 84, 128, 89, 85, - 79, 80, 128, 89, 85, 79, 77, 128, 89, 85, 79, 128, 89, 85, 78, 128, 89, - 85, 77, 128, 89, 85, 74, 128, 89, 85, 73, 128, 89, 85, 69, 81, 128, 89, - 85, 69, 128, 89, 85, 68, 72, 128, 89, 85, 68, 200, 89, 85, 65, 78, 128, - 89, 85, 65, 69, 78, 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, 45, 89, 69, - 128, 89, 85, 45, 85, 128, 89, 85, 45, 79, 128, 89, 85, 45, 73, 128, 89, - 85, 45, 69, 79, 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, 69, 128, 89, - 85, 45, 65, 128, 89, 85, 45, 52, 128, 89, 85, 45, 51, 128, 89, 85, 45, - 50, 128, 89, 85, 45, 49, 128, 89, 85, 128, 89, 213, 89, 82, 89, 128, 89, - 80, 83, 73, 76, 73, 128, 89, 80, 79, 82, 82, 79, 73, 128, 89, 80, 79, 75, - 82, 73, 83, 73, 83, 128, 89, 80, 79, 75, 82, 73, 83, 73, 211, 89, 80, 79, - 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 89, 79, 89, 128, 89, 79, 88, - 128, 89, 79, 87, 68, 128, 89, 79, 85, 84, 72, 70, 85, 76, 78, 69, 83, 83, - 128, 89, 79, 85, 84, 72, 70, 85, 204, 89, 79, 213, 89, 79, 84, 128, 89, - 79, 82, 73, 128, 89, 79, 81, 128, 89, 79, 209, 89, 79, 80, 128, 89, 79, - 79, 128, 89, 79, 77, 79, 128, 89, 79, 71, 72, 128, 89, 79, 68, 128, 89, - 79, 196, 89, 79, 65, 128, 89, 79, 45, 89, 79, 128, 89, 79, 45, 89, 69, - 79, 128, 89, 79, 45, 89, 65, 69, 128, 89, 79, 45, 89, 65, 128, 89, 79, - 45, 79, 128, 89, 79, 45, 73, 128, 89, 79, 45, 69, 79, 128, 89, 79, 45, - 65, 69, 128, 89, 79, 45, 65, 128, 89, 79, 45, 54, 128, 89, 79, 45, 53, - 128, 89, 79, 45, 52, 128, 89, 79, 45, 51, 128, 89, 79, 45, 50, 128, 89, - 79, 45, 49, 128, 89, 207, 89, 73, 90, 69, 84, 128, 89, 73, 88, 128, 89, - 73, 87, 78, 128, 89, 73, 84, 128, 89, 73, 80, 128, 89, 73, 78, 71, 128, - 89, 73, 73, 128, 89, 73, 72, 128, 89, 73, 199, 89, 73, 69, 88, 128, 89, - 73, 69, 84, 128, 89, 73, 69, 80, 128, 89, 73, 69, 69, 128, 89, 73, 69, - 128, 89, 73, 68, 68, 73, 83, 200, 89, 73, 45, 85, 128, 89, 73, 128, 89, - 72, 69, 128, 89, 70, 69, 83, 73, 83, 128, 89, 70, 69, 83, 73, 211, 89, - 70, 69, 206, 89, 69, 89, 128, 89, 69, 87, 128, 89, 69, 85, 88, 128, 89, - 69, 85, 82, 65, 69, 128, 89, 69, 85, 81, 128, 89, 69, 85, 77, 128, 89, - 69, 85, 65, 69, 84, 128, 89, 69, 85, 65, 69, 128, 89, 69, 84, 73, 86, - 128, 89, 69, 83, 84, 85, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 83, - 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 89, 69, 83, 73, 69, 85, 78, 71, - 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, 65, 78, - 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 77, 73, 69, 85, - 77, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, 75, 128, - 89, 69, 83, 73, 69, 85, 78, 71, 45, 75, 72, 73, 69, 85, 75, 72, 128, 89, - 69, 83, 73, 69, 85, 78, 71, 45, 72, 73, 69, 85, 72, 128, 89, 69, 83, 73, - 69, 85, 78, 71, 128, 89, 69, 82, 85, 128, 89, 69, 82, 213, 89, 69, 82, - 73, 128, 89, 69, 82, 65, 200, 89, 69, 82, 128, 89, 69, 79, 82, 73, 78, - 72, 73, 69, 85, 72, 128, 89, 69, 79, 45, 89, 65, 128, 89, 69, 79, 45, 85, - 128, 89, 69, 79, 45, 79, 128, 89, 69, 78, 73, 83, 69, 201, 89, 69, 78, - 65, 80, 128, 89, 69, 78, 128, 89, 69, 206, 89, 69, 76, 76, 79, 87, 128, - 89, 69, 76, 76, 79, 215, 89, 69, 73, 78, 128, 89, 69, 72, 128, 89, 69, - 69, 71, 128, 89, 69, 69, 128, 89, 69, 65, 210, 89, 69, 65, 128, 89, 65, - 90, 90, 128, 89, 65, 90, 72, 128, 89, 65, 90, 128, 89, 65, 89, 68, 128, - 89, 65, 89, 65, 78, 78, 65, 128, 89, 65, 89, 128, 89, 65, 87, 78, 73, 78, - 199, 89, 65, 87, 78, 128, 89, 65, 87, 128, 89, 65, 86, 128, 89, 65, 85, - 128, 89, 65, 84, 84, 128, 89, 65, 84, 73, 128, 89, 65, 84, 72, 128, 89, - 65, 84, 128, 89, 65, 83, 83, 128, 89, 65, 83, 72, 128, 89, 65, 83, 128, - 89, 65, 82, 82, 128, 89, 65, 82, 78, 128, 89, 65, 82, 128, 89, 65, 210, - 89, 65, 81, 128, 89, 65, 80, 128, 89, 65, 78, 83, 65, 89, 65, 128, 89, - 65, 78, 71, 128, 89, 65, 78, 199, 89, 65, 78, 128, 89, 65, 77, 79, 75, - 128, 89, 65, 77, 65, 75, 75, 65, 78, 128, 89, 65, 77, 128, 89, 65, 76, - 128, 89, 65, 75, 72, 72, 128, 89, 65, 75, 72, 128, 89, 65, 75, 65, 83, - 72, 128, 89, 65, 75, 128, 89, 65, 74, 85, 82, 86, 69, 68, 73, 195, 89, - 65, 74, 128, 89, 65, 73, 128, 89, 65, 72, 72, 128, 89, 65, 72, 128, 89, - 65, 71, 78, 128, 89, 65, 71, 72, 72, 128, 89, 65, 71, 72, 128, 89, 65, - 71, 128, 89, 65, 70, 213, 89, 65, 70, 128, 89, 65, 69, 77, 77, 65, 69, - 128, 89, 65, 68, 72, 128, 89, 65, 68, 68, 72, 128, 89, 65, 68, 68, 128, - 89, 65, 68, 128, 89, 65, 67, 72, 128, 89, 65, 66, 72, 128, 89, 65, 66, - 128, 89, 65, 65, 82, 85, 128, 89, 65, 65, 73, 128, 89, 65, 65, 68, 79, - 128, 89, 65, 45, 89, 79, 128, 89, 65, 45, 85, 128, 89, 65, 45, 79, 128, - 89, 65, 45, 53, 128, 89, 65, 45, 52, 128, 89, 65, 45, 51, 128, 89, 65, - 45, 50, 128, 89, 65, 45, 49, 128, 89, 48, 48, 56, 128, 89, 48, 48, 55, - 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, 89, 48, 48, 52, 128, 89, - 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, 48, 49, 65, 128, 89, 48, - 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, 88, 128, 88, 89, 85, 128, - 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, 82, 128, 88, 89, 80, 128, - 88, 89, 79, 79, 74, 128, 88, 89, 79, 79, 128, 88, 89, 79, 128, 88, 89, - 73, 128, 88, 89, 69, 69, 205, 88, 89, 69, 69, 128, 88, 89, 69, 128, 88, - 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, 88, 87, 73, 128, 88, 87, - 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, 128, 88, 87, 65, 128, 88, - 87, 128, 88, 215, 88, 86, 69, 128, 88, 86, 65, 128, 88, 85, 79, 88, 128, - 88, 85, 79, 128, 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, 84, 72, 73, 89, - 65, 128, 88, 79, 88, 128, 88, 79, 84, 128, 88, 79, 82, 128, 88, 79, 80, - 72, 128, 88, 79, 80, 128, 88, 79, 65, 128, 88, 79, 128, 88, 73, 88, 128, - 88, 73, 84, 128, 88, 73, 82, 79, 206, 88, 73, 80, 128, 88, 73, 69, 88, - 128, 88, 73, 69, 84, 128, 88, 73, 69, 80, 128, 88, 73, 69, 128, 88, 73, - 65, 78, 71, 81, 201, 88, 73, 65, 66, 128, 88, 73, 128, 88, 71, 128, 88, - 69, 89, 78, 128, 88, 69, 83, 84, 69, 211, 88, 69, 72, 128, 88, 69, 69, - 128, 88, 69, 128, 88, 65, 85, 83, 128, 88, 65, 85, 128, 88, 65, 80, 72, - 128, 88, 65, 78, 128, 88, 65, 65, 128, 88, 65, 128, 88, 48, 48, 56, 65, - 128, 88, 48, 48, 56, 128, 88, 48, 48, 55, 128, 88, 48, 48, 54, 65, 128, - 88, 48, 48, 54, 128, 88, 48, 48, 53, 128, 88, 48, 48, 52, 66, 128, 88, - 48, 48, 52, 65, 128, 88, 48, 48, 52, 128, 88, 48, 48, 51, 128, 88, 48, - 48, 50, 128, 88, 48, 48, 49, 128, 88, 45, 216, 87, 90, 128, 87, 89, 78, - 78, 128, 87, 89, 78, 206, 87, 86, 73, 128, 87, 86, 69, 128, 87, 86, 65, - 128, 87, 86, 128, 87, 85, 80, 128, 87, 85, 79, 88, 128, 87, 85, 79, 80, - 128, 87, 85, 79, 128, 87, 85, 78, 74, 207, 87, 85, 78, 128, 87, 85, 76, - 85, 128, 87, 85, 76, 213, 87, 85, 73, 128, 87, 85, 69, 128, 87, 85, 65, - 69, 84, 128, 87, 85, 65, 69, 78, 128, 87, 85, 128, 87, 82, 217, 87, 82, - 79, 78, 71, 128, 87, 82, 73, 83, 212, 87, 82, 73, 78, 75, 76, 69, 83, - 128, 87, 82, 73, 78, 75, 76, 69, 211, 87, 82, 73, 78, 75, 76, 69, 68, - 128, 87, 82, 69, 83, 84, 76, 69, 82, 83, 128, 87, 82, 69, 78, 67, 72, - 128, 87, 82, 69, 65, 84, 200, 87, 82, 65, 80, 80, 69, 196, 87, 82, 65, - 80, 128, 87, 79, 88, 128, 87, 79, 87, 128, 87, 79, 82, 83, 72, 73, 80, - 128, 87, 79, 82, 82, 73, 69, 196, 87, 79, 82, 76, 196, 87, 79, 82, 75, - 69, 82, 128, 87, 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, 82, 68, 83, - 80, 65, 67, 69, 128, 87, 79, 82, 196, 87, 79, 80, 128, 87, 79, 79, 78, - 128, 87, 79, 79, 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69, 197, 87, - 79, 79, 68, 128, 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 69, 78, 211, - 87, 79, 77, 69, 206, 87, 79, 77, 65, 78, 211, 87, 79, 77, 65, 78, 128, - 87, 79, 77, 65, 206, 87, 79, 76, 79, 83, 79, 128, 87, 79, 76, 198, 87, - 79, 69, 128, 87, 79, 65, 128, 87, 79, 45, 55, 128, 87, 79, 45, 54, 128, - 87, 79, 45, 53, 128, 87, 79, 45, 52, 128, 87, 79, 45, 51, 128, 87, 79, - 45, 50, 128, 87, 79, 45, 49, 128, 87, 73, 84, 72, 79, 85, 212, 87, 73, - 84, 72, 73, 78, 128, 87, 73, 84, 72, 73, 206, 87, 73, 82, 69, 196, 87, - 73, 78, 84, 69, 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 75, - 128, 87, 73, 78, 74, 65, 128, 87, 73, 78, 71, 83, 128, 87, 73, 78, 69, - 128, 87, 73, 78, 197, 87, 73, 78, 68, 85, 128, 87, 73, 78, 68, 79, 87, - 128, 87, 73, 78, 68, 128, 87, 73, 78, 196, 87, 73, 78, 128, 87, 73, 76, - 84, 69, 196, 87, 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, 76, 217, - 87, 73, 71, 71, 76, 69, 83, 128, 87, 73, 68, 84, 72, 128, 87, 73, 68, 69, - 78, 73, 78, 199, 87, 73, 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, 73, 68, - 197, 87, 73, 65, 78, 71, 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, 128, - 87, 73, 45, 53, 128, 87, 73, 45, 52, 128, 87, 73, 45, 51, 128, 87, 73, - 45, 50, 128, 87, 73, 45, 49, 128, 87, 72, 79, 76, 197, 87, 72, 73, 84, - 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, 69, 128, 87, - 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, 82, 128, 87, - 72, 69, 69, 76, 67, 72, 65, 73, 210, 87, 72, 69, 69, 76, 128, 87, 72, 69, - 69, 204, 87, 72, 69, 65, 84, 128, 87, 72, 65, 76, 69, 128, 87, 72, 128, - 87, 71, 128, 87, 69, 88, 128, 87, 69, 85, 88, 128, 87, 69, 212, 87, 69, - 83, 84, 69, 82, 206, 87, 69, 83, 84, 45, 67, 82, 69, 197, 87, 69, 83, 84, - 128, 87, 69, 83, 212, 87, 69, 80, 128, 87, 69, 79, 128, 87, 69, 78, 128, - 87, 69, 76, 76, 128, 87, 69, 73, 71, 72, 212, 87, 69, 73, 69, 82, 83, 84, - 82, 65, 83, 211, 87, 69, 73, 128, 87, 69, 69, 78, 128, 87, 69, 68, 71, - 69, 45, 84, 65, 73, 76, 69, 196, 87, 69, 68, 71, 69, 128, 87, 69, 68, 68, - 73, 78, 71, 128, 87, 69, 66, 128, 87, 69, 65, 82, 217, 87, 69, 65, 80, - 79, 78, 128, 87, 69, 45, 52, 128, 87, 69, 45, 51, 128, 87, 69, 45, 50, - 128, 87, 69, 45, 49, 128, 87, 67, 128, 87, 66, 128, 87, 65, 89, 128, 87, - 65, 217, 87, 65, 88, 73, 78, 199, 87, 65, 88, 128, 87, 65, 87, 45, 65, - 89, 73, 78, 45, 82, 69, 83, 72, 128, 87, 65, 87, 128, 87, 65, 215, 87, - 65, 86, 217, 87, 65, 86, 73, 78, 199, 87, 65, 86, 69, 83, 128, 87, 65, - 86, 69, 128, 87, 65, 86, 197, 87, 65, 85, 128, 87, 65, 84, 84, 79, 128, - 87, 65, 84, 69, 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, 69, 82, 128, 87, - 65, 84, 69, 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, 128, 87, 65, 83, - 84, 73, 78, 71, 128, 87, 65, 83, 84, 69, 66, 65, 83, 75, 69, 84, 128, 87, - 65, 83, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, 128, 87, 65, 83, - 76, 193, 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 65, 76, 76, 65, - 205, 87, 65, 82, 78, 73, 78, 199, 87, 65, 82, 65, 78, 199, 87, 65, 81, - 70, 65, 128, 87, 65, 80, 128, 87, 65, 78, 73, 78, 199, 87, 65, 78, 71, - 75, 85, 79, 81, 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 67, - 72, 207, 87, 65, 78, 128, 87, 65, 76, 76, 80, 76, 65, 78, 197, 87, 65, - 76, 76, 128, 87, 65, 76, 204, 87, 65, 76, 75, 128, 87, 65, 76, 203, 87, - 65, 73, 84, 73, 78, 71, 128, 87, 65, 73, 83, 84, 128, 87, 65, 73, 128, - 87, 65, 70, 70, 76, 69, 128, 87, 65, 69, 78, 128, 87, 65, 69, 128, 87, - 65, 68, 68, 65, 128, 87, 65, 65, 86, 85, 128, 87, 65, 45, 53, 128, 87, - 65, 45, 52, 128, 87, 65, 45, 51, 128, 87, 65, 45, 50, 128, 87, 65, 45, - 49, 128, 87, 48, 50, 53, 128, 87, 48, 50, 52, 65, 128, 87, 48, 50, 52, - 128, 87, 48, 50, 51, 128, 87, 48, 50, 50, 128, 87, 48, 50, 49, 128, 87, - 48, 50, 48, 128, 87, 48, 49, 57, 128, 87, 48, 49, 56, 65, 128, 87, 48, - 49, 56, 128, 87, 48, 49, 55, 65, 128, 87, 48, 49, 55, 128, 87, 48, 49, - 54, 128, 87, 48, 49, 53, 128, 87, 48, 49, 52, 65, 128, 87, 48, 49, 52, - 128, 87, 48, 49, 51, 128, 87, 48, 49, 50, 128, 87, 48, 49, 49, 128, 87, - 48, 49, 48, 65, 128, 87, 48, 49, 48, 128, 87, 48, 48, 57, 65, 128, 87, - 48, 48, 57, 128, 87, 48, 48, 56, 128, 87, 48, 48, 55, 128, 87, 48, 48, - 54, 128, 87, 48, 48, 53, 128, 87, 48, 48, 52, 128, 87, 48, 48, 51, 65, - 128, 87, 48, 48, 51, 128, 87, 48, 48, 50, 128, 87, 48, 48, 49, 128, 86, - 90, 77, 69, 84, 128, 86, 89, 88, 128, 86, 89, 84, 128, 86, 89, 82, 88, - 128, 86, 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, 87, 74, 128, 86, - 87, 65, 128, 86, 87, 128, 86, 85, 88, 128, 86, 85, 85, 128, 86, 85, 84, - 128, 86, 85, 82, 88, 128, 86, 85, 82, 128, 86, 85, 80, 128, 86, 85, 76, - 71, 65, 210, 86, 85, 76, 67, 65, 78, 85, 83, 128, 86, 85, 69, 81, 128, - 86, 84, 83, 128, 86, 84, 128, 86, 83, 57, 57, 128, 86, 83, 57, 56, 128, - 86, 83, 57, 55, 128, 86, 83, 57, 54, 128, 86, 83, 57, 53, 128, 86, 83, - 57, 52, 128, 86, 83, 57, 51, 128, 86, 83, 57, 50, 128, 86, 83, 57, 49, - 128, 86, 83, 57, 48, 128, 86, 83, 57, 128, 86, 83, 56, 57, 128, 86, 83, - 56, 56, 128, 86, 83, 56, 55, 128, 86, 83, 56, 54, 128, 86, 83, 56, 53, - 128, 86, 83, 56, 52, 128, 86, 83, 56, 51, 128, 86, 83, 56, 50, 128, 86, - 83, 56, 49, 128, 86, 83, 56, 48, 128, 86, 83, 56, 128, 86, 83, 55, 57, - 128, 86, 83, 55, 56, 128, 86, 83, 55, 55, 128, 86, 83, 55, 54, 128, 86, - 83, 55, 53, 128, 86, 83, 55, 52, 128, 86, 83, 55, 51, 128, 86, 83, 55, - 50, 128, 86, 83, 55, 49, 128, 86, 83, 55, 48, 128, 86, 83, 55, 128, 86, - 83, 54, 57, 128, 86, 83, 54, 56, 128, 86, 83, 54, 55, 128, 86, 83, 54, - 54, 128, 86, 83, 54, 53, 128, 86, 83, 54, 52, 128, 86, 83, 54, 51, 128, - 86, 83, 54, 50, 128, 86, 83, 54, 49, 128, 86, 83, 54, 48, 128, 86, 83, - 54, 128, 86, 83, 53, 57, 128, 86, 83, 53, 56, 128, 86, 83, 53, 55, 128, - 86, 83, 53, 54, 128, 86, 83, 53, 53, 128, 86, 83, 53, 52, 128, 86, 83, - 53, 51, 128, 86, 83, 53, 50, 128, 86, 83, 53, 49, 128, 86, 83, 53, 48, - 128, 86, 83, 53, 128, 86, 83, 52, 57, 128, 86, 83, 52, 56, 128, 86, 83, - 52, 55, 128, 86, 83, 52, 54, 128, 86, 83, 52, 53, 128, 86, 83, 52, 52, - 128, 86, 83, 52, 51, 128, 86, 83, 52, 50, 128, 86, 83, 52, 49, 128, 86, - 83, 52, 48, 128, 86, 83, 52, 128, 86, 83, 51, 57, 128, 86, 83, 51, 56, - 128, 86, 83, 51, 55, 128, 86, 83, 51, 54, 128, 86, 83, 51, 53, 128, 86, - 83, 51, 52, 128, 86, 83, 51, 51, 128, 86, 83, 51, 50, 128, 86, 83, 51, - 49, 128, 86, 83, 51, 48, 128, 86, 83, 51, 128, 86, 83, 50, 57, 128, 86, - 83, 50, 56, 128, 86, 83, 50, 55, 128, 86, 83, 50, 54, 128, 86, 83, 50, - 53, 54, 128, 86, 83, 50, 53, 53, 128, 86, 83, 50, 53, 52, 128, 86, 83, - 50, 53, 51, 128, 86, 83, 50, 53, 50, 128, 86, 83, 50, 53, 49, 128, 86, - 83, 50, 53, 48, 128, 86, 83, 50, 53, 128, 86, 83, 50, 52, 57, 128, 86, - 83, 50, 52, 56, 128, 86, 83, 50, 52, 55, 128, 86, 83, 50, 52, 54, 128, - 86, 83, 50, 52, 53, 128, 86, 83, 50, 52, 52, 128, 86, 83, 50, 52, 51, - 128, 86, 83, 50, 52, 50, 128, 86, 83, 50, 52, 49, 128, 86, 83, 50, 52, - 48, 128, 86, 83, 50, 52, 128, 86, 83, 50, 51, 57, 128, 86, 83, 50, 51, - 56, 128, 86, 83, 50, 51, 55, 128, 86, 83, 50, 51, 54, 128, 86, 83, 50, - 51, 53, 128, 86, 83, 50, 51, 52, 128, 86, 83, 50, 51, 51, 128, 86, 83, - 50, 51, 50, 128, 86, 83, 50, 51, 49, 128, 86, 83, 50, 51, 48, 128, 86, - 83, 50, 51, 128, 86, 83, 50, 50, 57, 128, 86, 83, 50, 50, 56, 128, 86, - 83, 50, 50, 55, 128, 86, 83, 50, 50, 54, 128, 86, 83, 50, 50, 53, 128, - 86, 83, 50, 50, 52, 128, 86, 83, 50, 50, 51, 128, 86, 83, 50, 50, 50, - 128, 86, 83, 50, 50, 49, 128, 86, 83, 50, 50, 48, 128, 86, 83, 50, 50, - 128, 86, 83, 50, 49, 57, 128, 86, 83, 50, 49, 56, 128, 86, 83, 50, 49, - 55, 128, 86, 83, 50, 49, 54, 128, 86, 83, 50, 49, 53, 128, 86, 83, 50, - 49, 52, 128, 86, 83, 50, 49, 51, 128, 86, 83, 50, 49, 50, 128, 86, 83, - 50, 49, 49, 128, 86, 83, 50, 49, 48, 128, 86, 83, 50, 49, 128, 86, 83, - 50, 48, 57, 128, 86, 83, 50, 48, 56, 128, 86, 83, 50, 48, 55, 128, 86, - 83, 50, 48, 54, 128, 86, 83, 50, 48, 53, 128, 86, 83, 50, 48, 52, 128, - 86, 83, 50, 48, 51, 128, 86, 83, 50, 48, 50, 128, 86, 83, 50, 48, 49, - 128, 86, 83, 50, 48, 48, 128, 86, 83, 50, 48, 128, 86, 83, 50, 128, 86, - 83, 49, 57, 57, 128, 86, 83, 49, 57, 56, 128, 86, 83, 49, 57, 55, 128, - 86, 83, 49, 57, 54, 128, 86, 83, 49, 57, 53, 128, 86, 83, 49, 57, 52, - 128, 86, 83, 49, 57, 51, 128, 86, 83, 49, 57, 50, 128, 86, 83, 49, 57, - 49, 128, 86, 83, 49, 57, 48, 128, 86, 83, 49, 57, 128, 86, 83, 49, 56, - 57, 128, 86, 83, 49, 56, 56, 128, 86, 83, 49, 56, 55, 128, 86, 83, 49, - 56, 54, 128, 86, 83, 49, 56, 53, 128, 86, 83, 49, 56, 52, 128, 86, 83, - 49, 56, 51, 128, 86, 83, 49, 56, 50, 128, 86, 83, 49, 56, 49, 128, 86, - 83, 49, 56, 48, 128, 86, 83, 49, 56, 128, 86, 83, 49, 55, 57, 128, 86, - 83, 49, 55, 56, 128, 86, 83, 49, 55, 55, 128, 86, 83, 49, 55, 54, 128, - 86, 83, 49, 55, 53, 128, 86, 83, 49, 55, 52, 128, 86, 83, 49, 55, 51, - 128, 86, 83, 49, 55, 50, 128, 86, 83, 49, 55, 49, 128, 86, 83, 49, 55, - 48, 128, 86, 83, 49, 55, 128, 86, 83, 49, 54, 57, 128, 86, 83, 49, 54, - 56, 128, 86, 83, 49, 54, 55, 128, 86, 83, 49, 54, 54, 128, 86, 83, 49, - 54, 53, 128, 86, 83, 49, 54, 52, 128, 86, 83, 49, 54, 51, 128, 86, 83, - 49, 54, 50, 128, 86, 83, 49, 54, 49, 128, 86, 83, 49, 54, 48, 128, 86, - 83, 49, 54, 128, 86, 83, 49, 53, 57, 128, 86, 83, 49, 53, 56, 128, 86, - 83, 49, 53, 55, 128, 86, 83, 49, 53, 54, 128, 86, 83, 49, 53, 53, 128, - 86, 83, 49, 53, 52, 128, 86, 83, 49, 53, 51, 128, 86, 83, 49, 53, 50, - 128, 86, 83, 49, 53, 49, 128, 86, 83, 49, 53, 48, 128, 86, 83, 49, 53, - 128, 86, 83, 49, 52, 57, 128, 86, 83, 49, 52, 56, 128, 86, 83, 49, 52, - 55, 128, 86, 83, 49, 52, 54, 128, 86, 83, 49, 52, 53, 128, 86, 83, 49, - 52, 52, 128, 86, 83, 49, 52, 51, 128, 86, 83, 49, 52, 50, 128, 86, 83, - 49, 52, 49, 128, 86, 83, 49, 52, 48, 128, 86, 83, 49, 52, 128, 86, 83, - 49, 51, 57, 128, 86, 83, 49, 51, 56, 128, 86, 83, 49, 51, 55, 128, 86, - 83, 49, 51, 54, 128, 86, 83, 49, 51, 53, 128, 86, 83, 49, 51, 52, 128, - 86, 83, 49, 51, 51, 128, 86, 83, 49, 51, 50, 128, 86, 83, 49, 51, 49, - 128, 86, 83, 49, 51, 48, 128, 86, 83, 49, 51, 128, 86, 83, 49, 50, 57, - 128, 86, 83, 49, 50, 56, 128, 86, 83, 49, 50, 55, 128, 86, 83, 49, 50, - 54, 128, 86, 83, 49, 50, 53, 128, 86, 83, 49, 50, 52, 128, 86, 83, 49, - 50, 51, 128, 86, 83, 49, 50, 50, 128, 86, 83, 49, 50, 49, 128, 86, 83, - 49, 50, 48, 128, 86, 83, 49, 50, 128, 86, 83, 49, 49, 57, 128, 86, 83, - 49, 49, 56, 128, 86, 83, 49, 49, 55, 128, 86, 83, 49, 49, 54, 128, 86, - 83, 49, 49, 53, 128, 86, 83, 49, 49, 52, 128, 86, 83, 49, 49, 51, 128, - 86, 83, 49, 49, 50, 128, 86, 83, 49, 49, 49, 128, 86, 83, 49, 49, 48, - 128, 86, 83, 49, 49, 128, 86, 83, 49, 48, 57, 128, 86, 83, 49, 48, 56, - 128, 86, 83, 49, 48, 55, 128, 86, 83, 49, 48, 54, 128, 86, 83, 49, 48, - 53, 128, 86, 83, 49, 48, 52, 128, 86, 83, 49, 48, 51, 128, 86, 83, 49, - 48, 50, 128, 86, 83, 49, 48, 49, 128, 86, 83, 49, 48, 48, 128, 86, 83, - 49, 48, 128, 86, 83, 49, 128, 86, 83, 128, 86, 82, 65, 67, 72, 89, 128, - 86, 79, 88, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, 82, 73, 69, 210, 86, - 79, 87, 128, 86, 79, 85, 128, 86, 79, 84, 128, 86, 79, 211, 86, 79, 80, - 128, 86, 79, 79, 73, 128, 86, 79, 79, 128, 86, 79, 77, 73, 84, 73, 78, - 71, 128, 86, 79, 77, 128, 86, 79, 76, 85, 77, 197, 86, 79, 76, 84, 65, - 71, 197, 86, 79, 76, 76, 69, 89, 66, 65, 76, 76, 128, 86, 79, 76, 67, 65, - 78, 79, 128, 86, 79, 76, 65, 80, 85, 203, 86, 79, 73, 196, 86, 79, 73, - 67, 73, 78, 71, 128, 86, 79, 73, 67, 69, 76, 69, 83, 211, 86, 79, 73, 67, - 69, 196, 86, 79, 68, 128, 86, 79, 67, 65, 76, 73, 90, 65, 84, 73, 79, - 206, 86, 79, 67, 65, 204, 86, 79, 128, 86, 73, 89, 79, 128, 86, 73, 88, - 128, 86, 73, 84, 82, 73, 79, 76, 45, 50, 128, 86, 73, 84, 82, 73, 79, 76, - 128, 86, 73, 84, 65, 69, 45, 50, 128, 86, 73, 84, 65, 69, 128, 86, 73, - 84, 128, 86, 73, 83, 73, 71, 79, 84, 72, 73, 195, 86, 73, 83, 65, 82, 71, - 65, 89, 65, 128, 86, 73, 83, 65, 82, 71, 65, 128, 86, 73, 83, 65, 82, 71, - 193, 86, 73, 82, 73, 65, 77, 128, 86, 73, 82, 71, 79, 128, 86, 73, 82, - 71, 65, 128, 86, 73, 82, 65, 77, 65, 128, 86, 73, 80, 128, 86, 73, 79, - 76, 73, 78, 128, 86, 73, 78, 69, 71, 65, 82, 45, 51, 128, 86, 73, 78, 69, - 71, 65, 82, 45, 50, 128, 86, 73, 78, 69, 71, 65, 82, 128, 86, 73, 78, 69, - 71, 65, 210, 86, 73, 78, 69, 128, 86, 73, 78, 197, 86, 73, 78, 128, 86, - 73, 76, 76, 65, 71, 69, 128, 86, 73, 73, 128, 86, 73, 71, 73, 78, 84, 73, - 76, 69, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87, 73, 78, 199, 86, 73, - 69, 87, 68, 65, 84, 193, 86, 73, 69, 84, 128, 86, 73, 69, 212, 86, 73, - 69, 80, 128, 86, 73, 69, 128, 86, 73, 68, 74, 45, 50, 128, 86, 73, 68, - 74, 128, 86, 73, 68, 69, 79, 67, 65, 83, 83, 69, 84, 84, 69, 128, 86, 73, - 68, 69, 207, 86, 73, 68, 65, 128, 86, 73, 67, 84, 79, 82, 217, 86, 73, - 66, 82, 65, 84, 73, 79, 206, 86, 72, 65, 128, 86, 70, 65, 128, 86, 69, - 89, 90, 128, 86, 69, 88, 128, 86, 69, 87, 128, 86, 69, 215, 86, 69, 85, - 88, 128, 86, 69, 85, 77, 128, 86, 69, 85, 65, 69, 80, 69, 78, 128, 86, - 69, 85, 65, 69, 128, 86, 69, 83, 84, 65, 128, 86, 69, 83, 84, 128, 86, - 69, 83, 83, 69, 204, 86, 69, 82, 217, 86, 69, 82, 84, 73, 67, 65, 76, 76, - 89, 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 54, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 54, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, - 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 51, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 50, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 54, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 53, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, - 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 52, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 51, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 53, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 53, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, - 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 53, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 52, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 52, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 52, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, - 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 54, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 53, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 51, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 51, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, - 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 48, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 54, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 50, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 50, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, - 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 49, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 48, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 49, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 49, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, - 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 50, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 49, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 48, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 48, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, - 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 51, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 50, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 48, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 128, - 86, 69, 82, 83, 73, 67, 76, 69, 128, 86, 69, 82, 83, 197, 86, 69, 82, 71, - 69, 128, 86, 69, 82, 68, 73, 71, 82, 73, 83, 128, 86, 69, 82, 128, 86, - 69, 80, 128, 86, 69, 78, 68, 128, 86, 69, 76, 73, 128, 86, 69, 73, 76, - 128, 86, 69, 72, 73, 67, 76, 69, 128, 86, 69, 72, 128, 86, 69, 200, 86, - 69, 69, 128, 86, 69, 197, 86, 69, 68, 69, 128, 86, 69, 67, 84, 79, 210, - 86, 65, 89, 65, 78, 78, 65, 128, 86, 65, 88, 128, 86, 65, 86, 128, 86, - 65, 214, 86, 65, 85, 128, 86, 65, 84, 72, 89, 128, 86, 65, 84, 128, 86, - 65, 83, 84, 78, 69, 83, 211, 86, 65, 83, 73, 83, 128, 86, 65, 82, 89, - 211, 86, 65, 82, 73, 75, 65, 128, 86, 65, 82, 73, 65, 78, 84, 128, 86, - 65, 82, 73, 65, 78, 212, 86, 65, 82, 73, 65, 128, 86, 65, 82, 73, 193, - 86, 65, 82, 69, 73, 65, 201, 86, 65, 82, 69, 73, 193, 86, 65, 82, 65, 65, - 75, 65, 78, 128, 86, 65, 80, 79, 85, 82, 83, 128, 86, 65, 80, 128, 86, - 65, 78, 69, 128, 86, 65, 77, 80, 73, 82, 69, 128, 86, 65, 77, 65, 71, 79, - 77, 85, 75, 72, 65, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, 72, 193, 86, - 65, 76, 76, 69, 89, 128, 86, 65, 75, 65, 73, 89, 65, 82, 65, 65, 128, 86, - 65, 74, 128, 86, 65, 73, 128, 86, 65, 72, 128, 86, 65, 200, 86, 65, 65, - 86, 85, 128, 86, 65, 65, 128, 86, 48, 52, 48, 65, 128, 86, 48, 52, 48, - 128, 86, 48, 51, 57, 128, 86, 48, 51, 56, 128, 86, 48, 51, 55, 65, 128, - 86, 48, 51, 55, 128, 86, 48, 51, 54, 128, 86, 48, 51, 53, 128, 86, 48, - 51, 52, 128, 86, 48, 51, 51, 65, 128, 86, 48, 51, 51, 128, 86, 48, 51, - 50, 128, 86, 48, 51, 49, 65, 128, 86, 48, 51, 49, 128, 86, 48, 51, 48, - 65, 128, 86, 48, 51, 48, 128, 86, 48, 50, 57, 65, 128, 86, 48, 50, 57, - 128, 86, 48, 50, 56, 65, 128, 86, 48, 50, 56, 128, 86, 48, 50, 55, 128, - 86, 48, 50, 54, 128, 86, 48, 50, 53, 128, 86, 48, 50, 52, 128, 86, 48, - 50, 51, 65, 128, 86, 48, 50, 51, 128, 86, 48, 50, 50, 128, 86, 48, 50, - 49, 128, 86, 48, 50, 48, 76, 128, 86, 48, 50, 48, 75, 128, 86, 48, 50, - 48, 74, 128, 86, 48, 50, 48, 73, 128, 86, 48, 50, 48, 72, 128, 86, 48, - 50, 48, 71, 128, 86, 48, 50, 48, 70, 128, 86, 48, 50, 48, 69, 128, 86, - 48, 50, 48, 68, 128, 86, 48, 50, 48, 67, 128, 86, 48, 50, 48, 66, 128, - 86, 48, 50, 48, 65, 128, 86, 48, 50, 48, 128, 86, 48, 49, 57, 128, 86, - 48, 49, 56, 128, 86, 48, 49, 55, 128, 86, 48, 49, 54, 128, 86, 48, 49, - 53, 128, 86, 48, 49, 52, 128, 86, 48, 49, 51, 128, 86, 48, 49, 50, 66, - 128, 86, 48, 49, 50, 65, 128, 86, 48, 49, 50, 128, 86, 48, 49, 49, 67, - 128, 86, 48, 49, 49, 66, 128, 86, 48, 49, 49, 65, 128, 86, 48, 49, 49, - 128, 86, 48, 49, 48, 128, 86, 48, 48, 57, 128, 86, 48, 48, 56, 128, 86, - 48, 48, 55, 66, 128, 86, 48, 48, 55, 65, 128, 86, 48, 48, 55, 128, 86, - 48, 48, 54, 128, 86, 48, 48, 53, 128, 86, 48, 48, 52, 128, 86, 48, 48, - 51, 128, 86, 48, 48, 50, 65, 128, 86, 48, 48, 50, 128, 86, 48, 48, 49, - 73, 128, 86, 48, 48, 49, 72, 128, 86, 48, 48, 49, 71, 128, 86, 48, 48, - 49, 70, 128, 86, 48, 48, 49, 69, 128, 86, 48, 48, 49, 68, 128, 86, 48, - 48, 49, 67, 128, 86, 48, 48, 49, 66, 128, 86, 48, 48, 49, 65, 128, 86, - 48, 48, 49, 128, 85, 90, 85, 128, 85, 90, 72, 65, 75, 75, 85, 128, 85, - 90, 51, 128, 85, 90, 179, 85, 89, 65, 78, 78, 65, 128, 85, 89, 128, 85, - 87, 85, 128, 85, 85, 89, 65, 78, 78, 65, 128, 85, 85, 85, 85, 128, 85, - 85, 85, 51, 128, 85, 85, 85, 50, 128, 85, 85, 69, 128, 85, 84, 85, 75, - 73, 128, 85, 83, 83, 85, 51, 128, 85, 83, 83, 85, 128, 85, 83, 72, 88, - 128, 85, 83, 72, 85, 77, 88, 128, 85, 83, 72, 69, 78, 78, 65, 128, 85, - 83, 72, 50, 128, 85, 83, 72, 128, 85, 83, 200, 85, 83, 69, 196, 85, 83, - 69, 45, 50, 128, 85, 83, 69, 45, 49, 128, 85, 83, 69, 128, 85, 83, 197, - 85, 82, 85, 218, 85, 82, 85, 83, 128, 85, 82, 85, 68, 65, 128, 85, 82, - 85, 68, 193, 85, 82, 85, 128, 85, 82, 213, 85, 82, 78, 128, 85, 82, 73, - 78, 69, 128, 85, 82, 73, 51, 128, 85, 82, 73, 128, 85, 82, 65, 78, 85, - 83, 128, 85, 82, 65, 128, 85, 82, 52, 128, 85, 82, 50, 128, 85, 82, 178, - 85, 80, 87, 65, 82, 68, 83, 128, 85, 80, 87, 65, 82, 68, 211, 85, 80, 87, - 65, 82, 68, 128, 85, 80, 87, 65, 82, 196, 85, 80, 84, 85, 82, 78, 128, - 85, 80, 83, 73, 76, 79, 78, 128, 85, 80, 83, 73, 76, 79, 206, 85, 80, 83, - 73, 68, 69, 45, 68, 79, 87, 206, 85, 80, 82, 73, 71, 72, 212, 85, 80, 80, - 69, 82, 128, 85, 80, 80, 69, 210, 85, 80, 65, 68, 72, 77, 65, 78, 73, 89, - 65, 128, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, 85, 79, 78, 128, - 85, 79, 71, 128, 85, 78, 78, 128, 85, 78, 77, 65, 82, 82, 73, 69, 196, - 85, 78, 75, 78, 79, 87, 78, 128, 85, 78, 75, 128, 85, 78, 73, 86, 69, 82, - 83, 65, 204, 85, 78, 73, 84, 89, 128, 85, 78, 73, 84, 69, 196, 85, 78, - 73, 84, 128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, 78, 73, 79, - 206, 85, 78, 73, 70, 79, 82, 77, 128, 85, 78, 73, 70, 73, 69, 196, 85, - 78, 73, 67, 79, 82, 206, 85, 78, 69, 86, 69, 206, 85, 78, 68, 207, 85, - 78, 68, 69, 82, 84, 73, 69, 128, 85, 78, 68, 69, 82, 76, 73, 78, 197, 85, - 78, 68, 69, 82, 68, 79, 84, 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 85, - 78, 68, 69, 82, 128, 85, 78, 68, 69, 210, 85, 78, 67, 73, 193, 85, 78, - 67, 69, 82, 84, 65, 73, 78, 84, 217, 85, 78, 66, 76, 69, 78, 68, 69, 196, - 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, 128, 85, 78, 65, 80, 128, 85, - 78, 65, 77, 85, 83, 69, 196, 85, 78, 65, 128, 85, 206, 85, 77, 85, 77, - 128, 85, 77, 85, 205, 85, 77, 66, 82, 69, 76, 76, 65, 128, 85, 77, 66, - 82, 69, 76, 76, 193, 85, 77, 66, 73, 78, 128, 85, 75, 85, 128, 85, 75, - 82, 65, 73, 78, 73, 65, 206, 85, 75, 65, 82, 65, 128, 85, 75, 65, 82, - 193, 85, 75, 128, 85, 73, 76, 76, 69, 65, 78, 78, 128, 85, 73, 71, 72, - 85, 210, 85, 72, 68, 128, 85, 71, 65, 82, 73, 84, 73, 195, 85, 69, 89, - 128, 85, 69, 78, 128, 85, 69, 73, 128, 85, 69, 69, 128, 85, 69, 65, 128, - 85, 68, 85, 71, 128, 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, 84, - 193, 85, 68, 65, 65, 84, 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, 66, - 85, 70, 73, 76, 73, 128, 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, 68, - 65, 77, 65, 128, 85, 66, 128, 85, 65, 84, 72, 128, 85, 65, 78, 71, 128, - 85, 65, 128, 85, 178, 85, 48, 52, 50, 128, 85, 48, 52, 49, 128, 85, 48, - 52, 48, 128, 85, 48, 51, 57, 128, 85, 48, 51, 56, 128, 85, 48, 51, 55, - 128, 85, 48, 51, 54, 128, 85, 48, 51, 53, 128, 85, 48, 51, 52, 128, 85, - 48, 51, 51, 128, 85, 48, 51, 50, 65, 128, 85, 48, 51, 50, 128, 85, 48, - 51, 49, 128, 85, 48, 51, 48, 128, 85, 48, 50, 57, 65, 128, 85, 48, 50, - 57, 128, 85, 48, 50, 56, 128, 85, 48, 50, 55, 128, 85, 48, 50, 54, 128, - 85, 48, 50, 53, 128, 85, 48, 50, 52, 128, 85, 48, 50, 51, 65, 128, 85, - 48, 50, 51, 128, 85, 48, 50, 50, 128, 85, 48, 50, 49, 128, 85, 48, 50, - 48, 128, 85, 48, 49, 57, 128, 85, 48, 49, 56, 128, 85, 48, 49, 55, 128, - 85, 48, 49, 54, 128, 85, 48, 49, 53, 128, 85, 48, 49, 52, 128, 85, 48, - 49, 51, 128, 85, 48, 49, 50, 128, 85, 48, 49, 49, 128, 85, 48, 49, 48, - 128, 85, 48, 48, 57, 128, 85, 48, 48, 56, 128, 85, 48, 48, 55, 128, 85, - 48, 48, 54, 66, 128, 85, 48, 48, 54, 65, 128, 85, 48, 48, 54, 128, 85, - 48, 48, 53, 128, 85, 48, 48, 52, 128, 85, 48, 48, 51, 128, 85, 48, 48, - 50, 128, 85, 48, 48, 49, 128, 85, 45, 83, 72, 65, 80, 69, 196, 85, 45, - 73, 45, 73, 128, 85, 45, 69, 79, 45, 69, 85, 128, 85, 45, 66, 82, 74, 71, - 85, 128, 85, 45, 53, 128, 84, 90, 85, 128, 84, 90, 79, 65, 128, 84, 90, - 79, 128, 84, 90, 73, 210, 84, 90, 73, 128, 84, 90, 69, 69, 128, 84, 90, - 69, 128, 84, 90, 65, 65, 128, 84, 90, 65, 128, 84, 90, 128, 84, 89, 210, - 84, 89, 80, 69, 45, 183, 84, 89, 80, 69, 45, 54, 128, 84, 89, 80, 69, 45, - 182, 84, 89, 80, 69, 45, 53, 128, 84, 89, 80, 69, 45, 181, 84, 89, 80, - 69, 45, 52, 128, 84, 89, 80, 69, 45, 180, 84, 89, 80, 69, 45, 51, 128, - 84, 89, 80, 69, 45, 179, 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 49, - 45, 50, 128, 84, 89, 80, 69, 45, 177, 84, 89, 80, 197, 84, 89, 79, 128, - 84, 89, 73, 128, 84, 89, 69, 128, 84, 89, 65, 89, 128, 84, 89, 65, 128, - 84, 88, 87, 86, 128, 84, 88, 87, 214, 84, 88, 72, 69, 69, 202, 84, 88, - 65, 128, 84, 87, 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, 87, 79, - 45, 84, 72, 73, 82, 84, 89, 128, 84, 87, 79, 45, 76, 73, 78, 197, 84, 87, - 79, 45, 72, 69, 65, 68, 69, 196, 84, 87, 79, 45, 69, 205, 84, 87, 79, 45, - 67, 73, 82, 67, 76, 197, 84, 87, 73, 83, 84, 73, 78, 71, 128, 84, 87, 73, - 83, 84, 69, 196, 84, 87, 73, 73, 128, 84, 87, 73, 128, 84, 87, 69, 78, - 84, 89, 45, 84, 87, 79, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 207, 84, - 87, 69, 78, 84, 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, 84, 89, - 45, 83, 73, 88, 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, 78, 128, - 84, 87, 69, 78, 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, - 78, 73, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, 84, - 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, 89, 45, - 70, 73, 86, 197, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 200, 84, - 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, 87, 69, 78, 84, 89, - 128, 84, 87, 69, 78, 84, 217, 84, 87, 69, 78, 84, 73, 69, 84, 72, 83, - 128, 84, 87, 69, 78, 84, 73, 69, 84, 72, 128, 84, 87, 69, 76, 86, 69, 45, - 84, 72, 73, 82, 84, 89, 128, 84, 87, 69, 76, 86, 69, 128, 84, 87, 69, 76, - 86, 197, 84, 87, 69, 76, 70, 84, 72, 83, 128, 84, 87, 69, 76, 70, 84, 72, - 128, 84, 87, 69, 128, 84, 87, 65, 65, 128, 84, 87, 65, 128, 84, 86, 82, - 73, 68, 79, 128, 84, 86, 73, 77, 65, 68, 85, 210, 84, 85, 88, 69, 68, 79, - 128, 84, 85, 88, 128, 84, 85, 85, 77, 85, 128, 84, 85, 85, 128, 84, 85, - 84, 84, 89, 128, 84, 85, 84, 69, 89, 65, 83, 65, 84, 128, 84, 85, 84, + 84, 73, 77, 69, 211, 66, 65, 77, 85, 205, 65, 78, 196, 83, 67, 82, 73, + 80, 212, 66, 79, 76, 196, 65, 78, 65, 84, 79, 76, 73, 65, 206, 72, 65, + 78, 71, 85, 204, 78, 85, 77, 66, 69, 210, 76, 73, 78, 69, 65, 210, 71, + 82, 69, 69, 203, 76, 73, 71, 65, 84, 85, 82, 197, 77, 85, 83, 73, 67, 65, + 204, 69, 84, 72, 73, 79, 80, 73, 195, 75, 72, 73, 84, 65, 206, 67, 79, + 77, 66, 73, 78, 73, 78, 199, 70, 79, 210, 193, 67, 89, 82, 73, 76, 76, + 73, 195, 73, 84, 65, 76, 73, 195, 84, 65, 77, 73, 204, 78, 85, 83, 72, + 213, 76, 69, 70, 212, 67, 73, 82, 67, 76, 69, 196, 82, 65, 68, 73, 67, + 65, 204, 83, 65, 78, 83, 45, 83, 69, 82, 73, 198, 83, 81, 85, 65, 82, + 197, 82, 73, 71, 72, 212, 70, 73, 78, 65, 204, 84, 65, 201, 65, 82, 82, + 79, 87, 128, 68, 79, 85, 66, 76, 197, 86, 65, 201, 83, 73, 71, 78, 128, + 65, 66, 79, 86, 69, 128, 72, 69, 78, 84, 65, 73, 71, 65, 78, 193, 66, 76, + 65, 67, 203, 65, 82, 82, 79, 215, 87, 72, 73, 84, 197, 66, 69, 76, 79, + 87, 128, 65, 128, 86, 65, 82, 73, 65, 84, 73, 79, 206, 66, 82, 65, 73, + 76, 76, 197, 80, 65, 84, 84, 69, 82, 206, 85, 128, 66, 89, 90, 65, 78, + 84, 73, 78, 197, 73, 128, 73, 83, 79, 76, 65, 84, 69, 196, 77, 79, 68, + 73, 70, 73, 69, 210, 79, 128, 75, 65, 84, 65, 75, 65, 78, 193, 194, 77, + 65, 82, 75, 128, 68, 79, 212, 77, 89, 65, 78, 77, 65, 210, 79, 198, 75, + 65, 78, 71, 88, 201, 75, 73, 75, 65, 75, 85, 201, 77, 69, 78, 68, 197, + 86, 69, 82, 84, 73, 67, 65, 204, 77, 73, 68, 68, 76, 197, 84, 73, 66, 69, + 84, 65, 206, 72, 69, 65, 86, 217, 73, 78, 73, 84, 73, 65, 204, 72, 77, + 79, 78, 199, 79, 78, 197, 77, 69, 69, 205, 67, 79, 80, 84, 73, 195, 75, + 72, 77, 69, 210, 82, 73, 71, 72, 84, 87, 65, 82, 68, 211, 65, 66, 79, 86, + 197, 67, 65, 82, 82, 73, 69, 210, 89, 69, 200, 71, 69, 79, 82, 71, 73, + 65, 206, 67, 72, 69, 82, 79, 75, 69, 197, 77, 79, 78, 71, 79, 76, 73, 65, + 206, 79, 78, 69, 128, 80, 76, 85, 211, 84, 87, 207, 84, 87, 79, 128, 66, + 79, 216, 76, 79, 87, 69, 210, 68, 69, 86, 65, 78, 65, 71, 65, 82, 201, + 83, 81, 85, 65, 82, 69, 196, 83, 89, 77, 66, 79, 76, 128, 80, 72, 65, 83, + 69, 45, 197, 83, 84, 82, 79, 75, 69, 128, 84, 72, 82, 69, 197, 85, 80, + 80, 69, 210, 76, 69, 70, 84, 87, 65, 82, 68, 211, 84, 207, 67, 79, 78, + 83, 79, 78, 65, 78, 212, 77, 73, 65, 207, 86, 79, 67, 65, 76, 73, 195, + 68, 82, 65, 87, 73, 78, 71, 211, 84, 73, 76, 197, 68, 85, 80, 76, 79, 89, + 65, 206, 77, 65, 82, 203, 74, 79, 78, 71, 83, 69, 79, 78, 199, 80, 65, + 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, 196, 84, 72, 65, 205, 71, 79, 78, + 68, 201, 72, 79, 79, 75, 128, 72, 69, 66, 82, 69, 215, 85, 208, 71, 76, + 65, 71, 79, 76, 73, 84, 73, 195, 76, 79, 215, 84, 72, 82, 69, 69, 128, + 70, 79, 85, 82, 128, 77, 65, 76, 65, 89, 65, 76, 65, 205, 79, 86, 69, + 210, 83, 73, 89, 65, 209, 72, 65, 76, 198, 72, 73, 71, 200, 73, 78, 68, + 69, 216, 80, 65, 72, 65, 87, 200, 68, 79, 87, 206, 67, 72, 79, 83, 69, + 79, 78, 199, 72, 65, 128, 72, 65, 76, 70, 87, 73, 68, 84, 200, 72, 65, + 78, 68, 45, 70, 73, 83, 212, 77, 69, 82, 79, 73, 84, 73, 195, 66, 65, 76, + 73, 78, 69, 83, 197, 73, 68, 69, 79, 71, 82, 65, 80, 72, 73, 195, 70, 73, + 86, 69, 128, 76, 73, 71, 72, 212, 73, 68, 69, 79, 71, 82, 65, 205, 80, + 72, 65, 83, 69, 45, 196, 84, 79, 128, 65, 76, 67, 72, 69, 77, 73, 67, 65, + 204, 65, 76, 69, 198, 84, 79, 78, 197, 83, 73, 78, 72, 65, 76, 193, 75, + 65, 128, 66, 65, 82, 128, 78, 85, 77, 69, 82, 73, 195, 84, 85, 82, 78, + 69, 196, 66, 82, 65, 72, 77, 201, 80, 65, 128, 82, 65, 128, 89, 65, 128, + 72, 85, 78, 71, 65, 82, 73, 65, 206, 83, 73, 88, 128, 84, 72, 85, 77, + 194, 77, 65, 128, 66, 65, 82, 194, 69, 73, 71, 72, 84, 128, 66, 76, 79, + 67, 203, 72, 65, 200, 76, 65, 128, 78, 79, 82, 84, 200, 83, 69, 86, 69, + 78, 128, 84, 72, 79, 85, 83, 65, 78, 68, 128, 78, 65, 128, 78, 73, 78, + 69, 128, 70, 85, 76, 76, 87, 73, 68, 84, 200, 76, 79, 78, 199, 66, 82, + 65, 67, 75, 69, 84, 128, 69, 81, 85, 65, 204, 83, 65, 128, 84, 65, 128, + 84, 65, 199, 68, 79, 77, 73, 78, 207, 90, 90, 89, 88, 128, 90, 90, 89, + 84, 128, 90, 90, 89, 82, 88, 128, 90, 90, 89, 82, 128, 90, 90, 89, 80, + 128, 90, 90, 89, 65, 128, 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, 90, + 85, 82, 88, 128, 90, 90, 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, 85, + 128, 90, 90, 83, 89, 65, 128, 90, 90, 83, 65, 128, 90, 90, 79, 88, 128, + 90, 90, 79, 80, 128, 90, 90, 79, 128, 90, 90, 73, 88, 128, 90, 90, 73, + 84, 128, 90, 90, 73, 80, 128, 90, 90, 73, 69, 88, 128, 90, 90, 73, 69, + 84, 128, 90, 90, 73, 69, 80, 128, 90, 90, 73, 69, 128, 90, 90, 73, 128, + 90, 90, 69, 88, 128, 90, 90, 69, 80, 128, 90, 90, 69, 69, 128, 90, 90, + 69, 128, 90, 90, 65, 88, 128, 90, 90, 65, 84, 128, 90, 90, 65, 80, 128, + 90, 90, 65, 65, 128, 90, 90, 65, 128, 90, 89, 71, 79, 83, 128, 90, 87, + 83, 80, 128, 90, 87, 78, 74, 128, 90, 87, 78, 66, 83, 80, 128, 90, 87, + 74, 128, 90, 87, 202, 90, 87, 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, + 128, 90, 85, 84, 128, 90, 85, 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, + 79, 128, 90, 85, 77, 128, 90, 85, 66, 85, 82, 128, 90, 85, 53, 128, 90, + 85, 181, 90, 213, 90, 83, 72, 65, 128, 90, 82, 65, 128, 90, 81, 65, 80, + 72, 193, 90, 79, 84, 128, 90, 79, 79, 128, 90, 79, 77, 66, 73, 69, 128, + 90, 79, 65, 128, 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, + 74, 69, 128, 90, 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 80, + 80, 69, 82, 45, 77, 79, 85, 84, 200, 90, 73, 78, 79, 82, 128, 90, 73, 76, + 68, 69, 128, 90, 73, 71, 90, 65, 199, 90, 73, 71, 128, 90, 73, 68, 193, + 90, 73, 66, 128, 90, 73, 194, 90, 73, 51, 128, 90, 201, 90, 72, 89, 88, + 128, 90, 72, 89, 84, 128, 90, 72, 89, 82, 88, 128, 90, 72, 89, 82, 128, + 90, 72, 89, 80, 128, 90, 72, 89, 128, 90, 72, 87, 69, 128, 90, 72, 87, + 65, 128, 90, 72, 85, 88, 128, 90, 72, 85, 84, 128, 90, 72, 85, 82, 88, + 128, 90, 72, 85, 82, 128, 90, 72, 85, 80, 128, 90, 72, 85, 79, 88, 128, + 90, 72, 85, 79, 80, 128, 90, 72, 85, 79, 128, 90, 72, 85, 128, 90, 72, + 79, 88, 128, 90, 72, 79, 84, 128, 90, 72, 79, 80, 128, 90, 72, 79, 79, + 128, 90, 72, 79, 73, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, + 128, 90, 72, 73, 76, 128, 90, 72, 73, 128, 90, 72, 69, 88, 128, 90, 72, + 69, 84, 128, 90, 72, 69, 80, 128, 90, 72, 69, 69, 128, 90, 72, 69, 128, + 90, 72, 197, 90, 72, 65, 89, 73, 78, 128, 90, 72, 65, 88, 128, 90, 72, + 65, 84, 128, 90, 72, 65, 82, 128, 90, 72, 65, 80, 128, 90, 72, 65, 73, + 78, 128, 90, 72, 65, 65, 128, 90, 72, 65, 128, 90, 72, 128, 90, 69, 85, + 83, 128, 90, 69, 84, 65, 128, 90, 69, 82, 79, 128, 90, 69, 82, 207, 90, + 69, 78, 128, 90, 69, 77, 76, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, + 90, 69, 66, 82, 193, 90, 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 90, + 65, 89, 73, 78, 45, 89, 79, 68, 72, 128, 90, 65, 89, 73, 78, 128, 90, 65, + 89, 73, 206, 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, 128, + 90, 65, 82, 81, 65, 128, 90, 65, 82, 76, 128, 90, 65, 81, 69, 198, 90, + 65, 78, 65, 66, 65, 90, 65, 210, 90, 65, 77, 88, 128, 90, 65, 76, 128, + 90, 65, 204, 90, 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90, + 65, 72, 128, 90, 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 65, + 55, 128, 90, 193, 90, 48, 49, 54, 72, 128, 90, 48, 49, 54, 71, 128, 90, + 48, 49, 54, 70, 128, 90, 48, 49, 54, 69, 128, 90, 48, 49, 54, 68, 128, + 90, 48, 49, 54, 67, 128, 90, 48, 49, 54, 66, 128, 90, 48, 49, 54, 65, + 128, 90, 48, 49, 54, 128, 90, 48, 49, 53, 73, 128, 90, 48, 49, 53, 72, + 128, 90, 48, 49, 53, 71, 128, 90, 48, 49, 53, 70, 128, 90, 48, 49, 53, + 69, 128, 90, 48, 49, 53, 68, 128, 90, 48, 49, 53, 67, 128, 90, 48, 49, + 53, 66, 128, 90, 48, 49, 53, 65, 128, 90, 48, 49, 53, 128, 90, 48, 49, + 52, 128, 90, 48, 49, 51, 128, 90, 48, 49, 50, 128, 90, 48, 49, 49, 128, + 90, 48, 49, 48, 128, 90, 48, 48, 57, 128, 90, 48, 48, 56, 128, 90, 48, + 48, 55, 128, 90, 48, 48, 54, 128, 90, 48, 48, 53, 65, 128, 90, 48, 48, + 53, 128, 90, 48, 48, 52, 65, 128, 90, 48, 48, 52, 128, 90, 48, 48, 51, + 66, 128, 90, 48, 48, 51, 65, 128, 90, 48, 48, 51, 128, 90, 48, 48, 50, + 68, 128, 90, 48, 48, 50, 67, 128, 90, 48, 48, 50, 66, 128, 90, 48, 48, + 50, 65, 128, 90, 48, 48, 50, 128, 90, 48, 48, 49, 128, 90, 128, 218, 89, + 89, 88, 128, 89, 89, 84, 128, 89, 89, 82, 88, 128, 89, 89, 82, 128, 89, + 89, 80, 128, 89, 89, 69, 128, 89, 89, 65, 65, 128, 89, 89, 65, 128, 89, + 89, 128, 89, 87, 79, 79, 128, 89, 87, 79, 128, 89, 87, 73, 73, 128, 89, + 87, 73, 128, 89, 87, 69, 128, 89, 87, 65, 65, 128, 89, 87, 65, 128, 89, + 86, 128, 89, 85, 88, 128, 89, 85, 87, 79, 81, 128, 89, 85, 85, 75, 65, + 76, 69, 65, 80, 73, 78, 84, 85, 128, 89, 85, 85, 128, 89, 85, 84, 128, + 89, 85, 83, 128, 89, 85, 211, 89, 85, 82, 88, 128, 89, 85, 82, 128, 89, + 85, 81, 128, 89, 85, 209, 89, 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, + 79, 84, 128, 89, 85, 79, 80, 128, 89, 85, 79, 77, 128, 89, 85, 79, 128, + 89, 85, 78, 128, 89, 85, 77, 128, 89, 85, 74, 128, 89, 85, 73, 128, 89, + 85, 69, 81, 128, 89, 85, 69, 128, 89, 85, 68, 72, 128, 89, 85, 68, 200, + 89, 85, 65, 78, 128, 89, 85, 65, 69, 78, 128, 89, 85, 45, 89, 69, 79, + 128, 89, 85, 45, 89, 69, 128, 89, 85, 45, 85, 128, 89, 85, 45, 79, 128, + 89, 85, 45, 73, 128, 89, 85, 45, 69, 79, 128, 89, 85, 45, 69, 128, 89, + 85, 45, 65, 69, 128, 89, 85, 45, 65, 128, 89, 85, 45, 52, 128, 89, 85, + 45, 51, 128, 89, 85, 45, 50, 128, 89, 85, 45, 49, 128, 89, 85, 128, 89, + 213, 89, 82, 89, 128, 89, 80, 83, 73, 76, 73, 128, 89, 80, 79, 82, 82, + 79, 73, 128, 89, 80, 79, 75, 82, 73, 83, 73, 83, 128, 89, 80, 79, 75, 82, + 73, 83, 73, 211, 89, 80, 79, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, + 89, 79, 89, 128, 89, 79, 88, 128, 89, 79, 87, 68, 128, 89, 79, 85, 84, + 72, 70, 85, 76, 78, 69, 83, 83, 128, 89, 79, 85, 84, 72, 70, 85, 204, 89, + 79, 213, 89, 79, 84, 128, 89, 79, 212, 89, 79, 82, 73, 128, 89, 79, 81, + 128, 89, 79, 209, 89, 79, 80, 128, 89, 79, 79, 128, 89, 79, 77, 79, 128, + 89, 79, 71, 72, 128, 89, 79, 68, 128, 89, 79, 196, 89, 79, 65, 128, 89, + 79, 45, 89, 79, 128, 89, 79, 45, 89, 69, 79, 128, 89, 79, 45, 89, 65, 69, + 128, 89, 79, 45, 89, 65, 128, 89, 79, 45, 79, 128, 89, 79, 45, 73, 128, + 89, 79, 45, 69, 79, 128, 89, 79, 45, 65, 69, 128, 89, 79, 45, 65, 128, + 89, 79, 45, 54, 128, 89, 79, 45, 53, 128, 89, 79, 45, 52, 128, 89, 79, + 45, 51, 128, 89, 79, 45, 50, 128, 89, 79, 45, 49, 128, 89, 207, 89, 73, + 90, 69, 84, 128, 89, 73, 88, 128, 89, 73, 87, 78, 128, 89, 73, 84, 128, + 89, 73, 80, 128, 89, 73, 78, 71, 128, 89, 73, 73, 128, 89, 73, 72, 128, + 89, 73, 199, 89, 73, 69, 88, 128, 89, 73, 69, 84, 128, 89, 73, 69, 80, + 128, 89, 73, 69, 69, 128, 89, 73, 69, 128, 89, 73, 68, 68, 73, 83, 200, + 89, 73, 45, 85, 128, 89, 73, 128, 89, 72, 69, 128, 89, 72, 65, 128, 89, + 70, 69, 83, 73, 83, 128, 89, 70, 69, 83, 73, 211, 89, 70, 69, 206, 89, + 69, 90, 73, 68, 201, 89, 69, 89, 128, 89, 69, 87, 128, 89, 69, 85, 88, + 128, 89, 69, 85, 82, 65, 69, 128, 89, 69, 85, 81, 128, 89, 69, 85, 77, + 128, 89, 69, 85, 65, 69, 84, 128, 89, 69, 85, 65, 69, 128, 89, 69, 84, + 73, 86, 128, 89, 69, 83, 84, 85, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, + 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 89, 69, 83, 73, 69, 85, + 78, 71, 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, + 65, 78, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 77, 73, + 69, 85, 77, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, + 75, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 75, 72, 73, 69, 85, 75, 72, + 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 72, 73, 69, 85, 72, 128, 89, 69, + 83, 73, 69, 85, 78, 71, 128, 89, 69, 82, 85, 128, 89, 69, 82, 213, 89, + 69, 82, 73, 128, 89, 69, 82, 65, 200, 89, 69, 82, 128, 89, 69, 79, 82, + 73, 78, 72, 73, 69, 85, 72, 128, 89, 69, 79, 45, 89, 65, 128, 89, 69, 79, + 45, 85, 128, 89, 69, 79, 45, 79, 128, 89, 69, 78, 73, 83, 69, 201, 89, + 69, 78, 65, 80, 128, 89, 69, 78, 128, 89, 69, 206, 89, 69, 76, 76, 79, + 87, 128, 89, 69, 76, 76, 79, 215, 89, 69, 73, 78, 128, 89, 69, 72, 128, + 89, 69, 69, 71, 128, 89, 69, 69, 128, 89, 69, 65, 210, 89, 69, 65, 128, + 89, 65, 90, 90, 128, 89, 65, 90, 72, 128, 89, 65, 90, 128, 89, 65, 89, + 68, 128, 89, 65, 89, 65, 78, 78, 65, 128, 89, 65, 89, 128, 89, 65, 87, + 78, 73, 78, 199, 89, 65, 87, 78, 128, 89, 65, 87, 128, 89, 65, 86, 128, + 89, 65, 85, 128, 89, 65, 84, 84, 128, 89, 65, 84, 73, 128, 89, 65, 84, + 72, 128, 89, 65, 84, 128, 89, 65, 83, 83, 128, 89, 65, 83, 72, 128, 89, + 65, 83, 128, 89, 65, 82, 82, 128, 89, 65, 82, 78, 128, 89, 65, 82, 128, + 89, 65, 210, 89, 65, 81, 128, 89, 65, 80, 128, 89, 65, 78, 83, 65, 89, + 65, 128, 89, 65, 78, 71, 128, 89, 65, 78, 199, 89, 65, 78, 128, 89, 65, + 77, 79, 75, 128, 89, 65, 77, 65, 75, 75, 65, 78, 128, 89, 65, 77, 128, + 89, 65, 76, 128, 89, 65, 75, 72, 72, 128, 89, 65, 75, 72, 128, 89, 65, + 75, 65, 83, 72, 128, 89, 65, 75, 128, 89, 65, 74, 85, 82, 86, 69, 68, 73, + 195, 89, 65, 74, 128, 89, 65, 73, 128, 89, 65, 72, 72, 128, 89, 65, 72, + 128, 89, 65, 71, 78, 128, 89, 65, 71, 72, 72, 128, 89, 65, 71, 72, 128, + 89, 65, 71, 128, 89, 65, 70, 213, 89, 65, 70, 128, 89, 65, 69, 77, 77, + 65, 69, 128, 89, 65, 68, 72, 128, 89, 65, 68, 68, 72, 128, 89, 65, 68, + 68, 128, 89, 65, 68, 128, 89, 65, 67, 72, 128, 89, 65, 66, 72, 128, 89, + 65, 66, 128, 89, 65, 65, 82, 85, 128, 89, 65, 65, 73, 128, 89, 65, 65, + 68, 79, 128, 89, 65, 45, 89, 79, 128, 89, 65, 45, 85, 128, 89, 65, 45, + 79, 128, 89, 65, 45, 53, 128, 89, 65, 45, 52, 128, 89, 65, 45, 51, 128, + 89, 65, 45, 50, 128, 89, 65, 45, 49, 128, 89, 48, 48, 56, 128, 89, 48, + 48, 55, 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, 89, 48, 48, 52, + 128, 89, 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, 48, 49, 65, 128, + 89, 48, 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, 88, 128, 88, 89, + 85, 128, 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, 82, 128, 88, 89, + 80, 128, 88, 89, 79, 79, 74, 128, 88, 89, 79, 79, 128, 88, 89, 79, 128, + 88, 89, 73, 128, 88, 89, 69, 69, 205, 88, 89, 69, 69, 128, 88, 89, 69, + 128, 88, 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, 88, 87, 73, 128, + 88, 87, 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, 128, 88, 87, 65, + 128, 88, 87, 128, 88, 215, 88, 86, 69, 128, 88, 86, 65, 128, 88, 85, 79, + 88, 128, 88, 85, 79, 128, 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, 84, + 72, 73, 89, 65, 128, 88, 79, 88, 128, 88, 79, 84, 128, 88, 79, 82, 128, + 88, 79, 80, 72, 128, 88, 79, 80, 128, 88, 79, 65, 128, 88, 79, 128, 88, + 73, 88, 128, 88, 73, 84, 128, 88, 73, 82, 79, 206, 88, 73, 80, 128, 88, + 73, 69, 88, 128, 88, 73, 69, 84, 128, 88, 73, 69, 80, 128, 88, 73, 69, + 128, 88, 73, 65, 78, 71, 81, 201, 88, 73, 65, 66, 128, 88, 73, 128, 88, + 72, 69, 89, 78, 128, 88, 71, 128, 88, 69, 89, 78, 128, 88, 69, 83, 84, + 69, 211, 88, 69, 72, 128, 88, 69, 69, 128, 88, 69, 128, 88, 65, 85, 83, + 128, 88, 65, 85, 128, 88, 65, 80, 72, 128, 88, 65, 78, 128, 88, 65, 65, + 128, 88, 65, 128, 88, 48, 48, 56, 65, 128, 88, 48, 48, 56, 128, 88, 48, + 48, 55, 128, 88, 48, 48, 54, 65, 128, 88, 48, 48, 54, 128, 88, 48, 48, + 53, 128, 88, 48, 48, 52, 66, 128, 88, 48, 48, 52, 65, 128, 88, 48, 48, + 52, 128, 88, 48, 48, 51, 128, 88, 48, 48, 50, 128, 88, 48, 48, 49, 128, + 88, 45, 216, 87, 90, 128, 87, 89, 78, 78, 128, 87, 89, 78, 206, 87, 86, + 73, 128, 87, 86, 69, 128, 87, 86, 65, 128, 87, 86, 128, 87, 85, 80, 128, + 87, 85, 79, 88, 128, 87, 85, 79, 80, 128, 87, 85, 79, 128, 87, 85, 78, + 74, 207, 87, 85, 78, 128, 87, 85, 76, 85, 128, 87, 85, 76, 213, 87, 85, + 73, 128, 87, 85, 69, 128, 87, 85, 65, 69, 84, 128, 87, 85, 65, 69, 78, + 128, 87, 85, 128, 87, 82, 217, 87, 82, 79, 78, 71, 128, 87, 82, 73, 83, + 212, 87, 82, 73, 78, 75, 76, 69, 83, 128, 87, 82, 73, 78, 75, 76, 69, + 211, 87, 82, 73, 78, 75, 76, 69, 68, 128, 87, 82, 69, 83, 84, 76, 69, 82, + 83, 128, 87, 82, 69, 78, 67, 72, 128, 87, 82, 69, 65, 84, 200, 87, 82, + 65, 80, 80, 69, 196, 87, 82, 65, 80, 128, 87, 79, 88, 128, 87, 79, 87, + 128, 87, 79, 82, 83, 72, 73, 80, 128, 87, 79, 82, 82, 73, 69, 196, 87, + 79, 82, 77, 128, 87, 79, 82, 76, 196, 87, 79, 82, 75, 69, 82, 128, 87, + 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, 82, 68, 83, 80, 65, 67, 69, + 128, 87, 79, 82, 196, 87, 79, 80, 128, 87, 79, 79, 78, 128, 87, 79, 79, + 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69, 197, 87, 79, 79, 68, 128, + 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 69, 78, 211, 87, 79, 77, 69, + 206, 87, 79, 77, 65, 78, 211, 87, 79, 77, 65, 78, 128, 87, 79, 77, 65, + 206, 87, 79, 76, 79, 83, 79, 128, 87, 79, 76, 198, 87, 79, 69, 128, 87, + 79, 65, 128, 87, 79, 45, 55, 128, 87, 79, 45, 54, 128, 87, 79, 45, 53, + 128, 87, 79, 45, 52, 128, 87, 79, 45, 51, 128, 87, 79, 45, 50, 128, 87, + 79, 45, 49, 128, 87, 73, 84, 72, 79, 85, 212, 87, 73, 84, 72, 73, 78, + 128, 87, 73, 84, 72, 73, 206, 87, 73, 82, 69, 196, 87, 73, 78, 84, 69, + 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 75, 128, 87, 73, 78, + 74, 65, 128, 87, 73, 78, 71, 83, 128, 87, 73, 78, 69, 128, 87, 73, 78, + 197, 87, 73, 78, 68, 85, 128, 87, 73, 78, 68, 79, 87, 128, 87, 73, 78, + 68, 128, 87, 73, 78, 196, 87, 73, 78, 128, 87, 73, 76, 84, 69, 196, 87, + 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, 76, 217, 87, 73, 71, 71, 76, + 69, 83, 128, 87, 73, 68, 84, 72, 128, 87, 73, 68, 69, 78, 73, 78, 199, + 87, 73, 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, 73, 68, 197, 87, 73, 65, + 78, 71, 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, 128, 87, 73, 45, 53, + 128, 87, 73, 45, 52, 128, 87, 73, 45, 51, 128, 87, 73, 45, 50, 128, 87, + 73, 45, 49, 128, 87, 72, 79, 76, 197, 87, 72, 73, 84, 69, 45, 70, 69, 65, + 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, 69, 128, 87, 72, 69, 69, 76, 69, + 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, 82, 128, 87, 72, 69, 69, 76, 67, + 72, 65, 73, 210, 87, 72, 69, 69, 76, 128, 87, 72, 69, 69, 204, 87, 72, + 69, 65, 84, 128, 87, 72, 65, 76, 69, 128, 87, 72, 128, 87, 71, 128, 87, + 69, 88, 128, 87, 69, 85, 88, 128, 87, 69, 212, 87, 69, 83, 84, 69, 82, + 206, 87, 69, 83, 84, 45, 67, 82, 69, 197, 87, 69, 83, 84, 128, 87, 69, + 83, 212, 87, 69, 80, 128, 87, 69, 79, 128, 87, 69, 78, 128, 87, 69, 76, + 76, 128, 87, 69, 73, 71, 72, 212, 87, 69, 73, 69, 82, 83, 84, 82, 65, 83, + 211, 87, 69, 73, 128, 87, 69, 69, 78, 128, 87, 69, 68, 71, 69, 45, 84, + 65, 73, 76, 69, 196, 87, 69, 68, 71, 69, 128, 87, 69, 68, 68, 73, 78, 71, + 128, 87, 69, 66, 128, 87, 69, 65, 82, 217, 87, 69, 65, 80, 79, 78, 128, + 87, 69, 45, 52, 128, 87, 69, 45, 51, 128, 87, 69, 45, 50, 128, 87, 69, + 45, 49, 128, 87, 67, 128, 87, 66, 128, 87, 65, 89, 128, 87, 65, 217, 87, + 65, 88, 73, 78, 199, 87, 65, 88, 128, 87, 65, 87, 45, 65, 89, 73, 78, 45, + 82, 69, 83, 72, 128, 87, 65, 87, 128, 87, 65, 215, 87, 65, 86, 217, 87, + 65, 86, 73, 78, 199, 87, 65, 86, 69, 83, 128, 87, 65, 86, 69, 128, 87, + 65, 86, 197, 87, 65, 85, 128, 87, 65, 84, 84, 79, 128, 87, 65, 84, 69, + 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, 69, 82, 128, 87, 65, 84, 69, + 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, 128, 87, 65, 83, 84, 73, 78, + 71, 128, 87, 65, 83, 84, 69, 66, 65, 83, 75, 69, 84, 128, 87, 65, 83, 83, + 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, 128, 87, 65, 83, 76, 193, + 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 65, 76, 76, 65, 205, 87, + 65, 82, 78, 73, 78, 199, 87, 65, 82, 65, 78, 199, 87, 65, 81, 70, 65, + 128, 87, 65, 80, 128, 87, 65, 78, 73, 78, 199, 87, 65, 78, 71, 75, 85, + 79, 81, 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 68, 128, + 87, 65, 78, 67, 72, 207, 87, 65, 78, 128, 87, 65, 76, 76, 80, 76, 65, 78, + 197, 87, 65, 76, 76, 128, 87, 65, 76, 204, 87, 65, 76, 75, 128, 87, 65, + 76, 203, 87, 65, 73, 84, 73, 78, 71, 128, 87, 65, 73, 83, 84, 128, 87, + 65, 73, 128, 87, 65, 70, 70, 76, 69, 128, 87, 65, 69, 78, 128, 87, 65, + 69, 128, 87, 65, 68, 68, 65, 128, 87, 65, 65, 86, 85, 128, 87, 65, 45, + 53, 128, 87, 65, 45, 52, 128, 87, 65, 45, 51, 128, 87, 65, 45, 50, 128, + 87, 65, 45, 49, 128, 87, 48, 50, 53, 128, 87, 48, 50, 52, 65, 128, 87, + 48, 50, 52, 128, 87, 48, 50, 51, 128, 87, 48, 50, 50, 128, 87, 48, 50, + 49, 128, 87, 48, 50, 48, 128, 87, 48, 49, 57, 128, 87, 48, 49, 56, 65, + 128, 87, 48, 49, 56, 128, 87, 48, 49, 55, 65, 128, 87, 48, 49, 55, 128, + 87, 48, 49, 54, 128, 87, 48, 49, 53, 128, 87, 48, 49, 52, 65, 128, 87, + 48, 49, 52, 128, 87, 48, 49, 51, 128, 87, 48, 49, 50, 128, 87, 48, 49, + 49, 128, 87, 48, 49, 48, 65, 128, 87, 48, 49, 48, 128, 87, 48, 48, 57, + 65, 128, 87, 48, 48, 57, 128, 87, 48, 48, 56, 128, 87, 48, 48, 55, 128, + 87, 48, 48, 54, 128, 87, 48, 48, 53, 128, 87, 48, 48, 52, 128, 87, 48, + 48, 51, 65, 128, 87, 48, 48, 51, 128, 87, 48, 48, 50, 128, 87, 48, 48, + 49, 128, 86, 90, 77, 69, 84, 128, 86, 89, 88, 128, 86, 89, 84, 128, 86, + 89, 82, 88, 128, 86, 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, 87, + 74, 128, 86, 87, 65, 128, 86, 87, 128, 86, 85, 88, 128, 86, 85, 85, 128, + 86, 85, 84, 128, 86, 85, 82, 88, 128, 86, 85, 82, 128, 86, 85, 80, 128, + 86, 85, 76, 71, 65, 210, 86, 85, 76, 67, 65, 78, 85, 83, 128, 86, 85, 69, + 81, 128, 86, 84, 83, 128, 86, 84, 128, 86, 83, 57, 57, 128, 86, 83, 57, + 56, 128, 86, 83, 57, 55, 128, 86, 83, 57, 54, 128, 86, 83, 57, 53, 128, + 86, 83, 57, 52, 128, 86, 83, 57, 51, 128, 86, 83, 57, 50, 128, 86, 83, + 57, 49, 128, 86, 83, 57, 48, 128, 86, 83, 57, 128, 86, 83, 56, 57, 128, + 86, 83, 56, 56, 128, 86, 83, 56, 55, 128, 86, 83, 56, 54, 128, 86, 83, + 56, 53, 128, 86, 83, 56, 52, 128, 86, 83, 56, 51, 128, 86, 83, 56, 50, + 128, 86, 83, 56, 49, 128, 86, 83, 56, 48, 128, 86, 83, 56, 128, 86, 83, + 55, 57, 128, 86, 83, 55, 56, 128, 86, 83, 55, 55, 128, 86, 83, 55, 54, + 128, 86, 83, 55, 53, 128, 86, 83, 55, 52, 128, 86, 83, 55, 51, 128, 86, + 83, 55, 50, 128, 86, 83, 55, 49, 128, 86, 83, 55, 48, 128, 86, 83, 55, + 128, 86, 83, 54, 57, 128, 86, 83, 54, 56, 128, 86, 83, 54, 55, 128, 86, + 83, 54, 54, 128, 86, 83, 54, 53, 128, 86, 83, 54, 52, 128, 86, 83, 54, + 51, 128, 86, 83, 54, 50, 128, 86, 83, 54, 49, 128, 86, 83, 54, 48, 128, + 86, 83, 54, 128, 86, 83, 53, 57, 128, 86, 83, 53, 56, 128, 86, 83, 53, + 55, 128, 86, 83, 53, 54, 128, 86, 83, 53, 53, 128, 86, 83, 53, 52, 128, + 86, 83, 53, 51, 128, 86, 83, 53, 50, 128, 86, 83, 53, 49, 128, 86, 83, + 53, 48, 128, 86, 83, 53, 128, 86, 83, 52, 57, 128, 86, 83, 52, 56, 128, + 86, 83, 52, 55, 128, 86, 83, 52, 54, 128, 86, 83, 52, 53, 128, 86, 83, + 52, 52, 128, 86, 83, 52, 51, 128, 86, 83, 52, 50, 128, 86, 83, 52, 49, + 128, 86, 83, 52, 48, 128, 86, 83, 52, 128, 86, 83, 51, 57, 128, 86, 83, + 51, 56, 128, 86, 83, 51, 55, 128, 86, 83, 51, 54, 128, 86, 83, 51, 53, + 128, 86, 83, 51, 52, 128, 86, 83, 51, 51, 128, 86, 83, 51, 50, 128, 86, + 83, 51, 49, 128, 86, 83, 51, 48, 128, 86, 83, 51, 128, 86, 83, 50, 57, + 128, 86, 83, 50, 56, 128, 86, 83, 50, 55, 128, 86, 83, 50, 54, 128, 86, + 83, 50, 53, 54, 128, 86, 83, 50, 53, 53, 128, 86, 83, 50, 53, 52, 128, + 86, 83, 50, 53, 51, 128, 86, 83, 50, 53, 50, 128, 86, 83, 50, 53, 49, + 128, 86, 83, 50, 53, 48, 128, 86, 83, 50, 53, 128, 86, 83, 50, 52, 57, + 128, 86, 83, 50, 52, 56, 128, 86, 83, 50, 52, 55, 128, 86, 83, 50, 52, + 54, 128, 86, 83, 50, 52, 53, 128, 86, 83, 50, 52, 52, 128, 86, 83, 50, + 52, 51, 128, 86, 83, 50, 52, 50, 128, 86, 83, 50, 52, 49, 128, 86, 83, + 50, 52, 48, 128, 86, 83, 50, 52, 128, 86, 83, 50, 51, 57, 128, 86, 83, + 50, 51, 56, 128, 86, 83, 50, 51, 55, 128, 86, 83, 50, 51, 54, 128, 86, + 83, 50, 51, 53, 128, 86, 83, 50, 51, 52, 128, 86, 83, 50, 51, 51, 128, + 86, 83, 50, 51, 50, 128, 86, 83, 50, 51, 49, 128, 86, 83, 50, 51, 48, + 128, 86, 83, 50, 51, 128, 86, 83, 50, 50, 57, 128, 86, 83, 50, 50, 56, + 128, 86, 83, 50, 50, 55, 128, 86, 83, 50, 50, 54, 128, 86, 83, 50, 50, + 53, 128, 86, 83, 50, 50, 52, 128, 86, 83, 50, 50, 51, 128, 86, 83, 50, + 50, 50, 128, 86, 83, 50, 50, 49, 128, 86, 83, 50, 50, 48, 128, 86, 83, + 50, 50, 128, 86, 83, 50, 49, 57, 128, 86, 83, 50, 49, 56, 128, 86, 83, + 50, 49, 55, 128, 86, 83, 50, 49, 54, 128, 86, 83, 50, 49, 53, 128, 86, + 83, 50, 49, 52, 128, 86, 83, 50, 49, 51, 128, 86, 83, 50, 49, 50, 128, + 86, 83, 50, 49, 49, 128, 86, 83, 50, 49, 48, 128, 86, 83, 50, 49, 128, + 86, 83, 50, 48, 57, 128, 86, 83, 50, 48, 56, 128, 86, 83, 50, 48, 55, + 128, 86, 83, 50, 48, 54, 128, 86, 83, 50, 48, 53, 128, 86, 83, 50, 48, + 52, 128, 86, 83, 50, 48, 51, 128, 86, 83, 50, 48, 50, 128, 86, 83, 50, + 48, 49, 128, 86, 83, 50, 48, 48, 128, 86, 83, 50, 48, 128, 86, 83, 50, + 128, 86, 83, 49, 57, 57, 128, 86, 83, 49, 57, 56, 128, 86, 83, 49, 57, + 55, 128, 86, 83, 49, 57, 54, 128, 86, 83, 49, 57, 53, 128, 86, 83, 49, + 57, 52, 128, 86, 83, 49, 57, 51, 128, 86, 83, 49, 57, 50, 128, 86, 83, + 49, 57, 49, 128, 86, 83, 49, 57, 48, 128, 86, 83, 49, 57, 128, 86, 83, + 49, 56, 57, 128, 86, 83, 49, 56, 56, 128, 86, 83, 49, 56, 55, 128, 86, + 83, 49, 56, 54, 128, 86, 83, 49, 56, 53, 128, 86, 83, 49, 56, 52, 128, + 86, 83, 49, 56, 51, 128, 86, 83, 49, 56, 50, 128, 86, 83, 49, 56, 49, + 128, 86, 83, 49, 56, 48, 128, 86, 83, 49, 56, 128, 86, 83, 49, 55, 57, + 128, 86, 83, 49, 55, 56, 128, 86, 83, 49, 55, 55, 128, 86, 83, 49, 55, + 54, 128, 86, 83, 49, 55, 53, 128, 86, 83, 49, 55, 52, 128, 86, 83, 49, + 55, 51, 128, 86, 83, 49, 55, 50, 128, 86, 83, 49, 55, 49, 128, 86, 83, + 49, 55, 48, 128, 86, 83, 49, 55, 128, 86, 83, 49, 54, 57, 128, 86, 83, + 49, 54, 56, 128, 86, 83, 49, 54, 55, 128, 86, 83, 49, 54, 54, 128, 86, + 83, 49, 54, 53, 128, 86, 83, 49, 54, 52, 128, 86, 83, 49, 54, 51, 128, + 86, 83, 49, 54, 50, 128, 86, 83, 49, 54, 49, 128, 86, 83, 49, 54, 48, + 128, 86, 83, 49, 54, 128, 86, 83, 49, 53, 57, 128, 86, 83, 49, 53, 56, + 128, 86, 83, 49, 53, 55, 128, 86, 83, 49, 53, 54, 128, 86, 83, 49, 53, + 53, 128, 86, 83, 49, 53, 52, 128, 86, 83, 49, 53, 51, 128, 86, 83, 49, + 53, 50, 128, 86, 83, 49, 53, 49, 128, 86, 83, 49, 53, 48, 128, 86, 83, + 49, 53, 128, 86, 83, 49, 52, 57, 128, 86, 83, 49, 52, 56, 128, 86, 83, + 49, 52, 55, 128, 86, 83, 49, 52, 54, 128, 86, 83, 49, 52, 53, 128, 86, + 83, 49, 52, 52, 128, 86, 83, 49, 52, 51, 128, 86, 83, 49, 52, 50, 128, + 86, 83, 49, 52, 49, 128, 86, 83, 49, 52, 48, 128, 86, 83, 49, 52, 128, + 86, 83, 49, 51, 57, 128, 86, 83, 49, 51, 56, 128, 86, 83, 49, 51, 55, + 128, 86, 83, 49, 51, 54, 128, 86, 83, 49, 51, 53, 128, 86, 83, 49, 51, + 52, 128, 86, 83, 49, 51, 51, 128, 86, 83, 49, 51, 50, 128, 86, 83, 49, + 51, 49, 128, 86, 83, 49, 51, 48, 128, 86, 83, 49, 51, 128, 86, 83, 49, + 50, 57, 128, 86, 83, 49, 50, 56, 128, 86, 83, 49, 50, 55, 128, 86, 83, + 49, 50, 54, 128, 86, 83, 49, 50, 53, 128, 86, 83, 49, 50, 52, 128, 86, + 83, 49, 50, 51, 128, 86, 83, 49, 50, 50, 128, 86, 83, 49, 50, 49, 128, + 86, 83, 49, 50, 48, 128, 86, 83, 49, 50, 128, 86, 83, 49, 49, 57, 128, + 86, 83, 49, 49, 56, 128, 86, 83, 49, 49, 55, 128, 86, 83, 49, 49, 54, + 128, 86, 83, 49, 49, 53, 128, 86, 83, 49, 49, 52, 128, 86, 83, 49, 49, + 51, 128, 86, 83, 49, 49, 50, 128, 86, 83, 49, 49, 49, 128, 86, 83, 49, + 49, 48, 128, 86, 83, 49, 49, 128, 86, 83, 49, 48, 57, 128, 86, 83, 49, + 48, 56, 128, 86, 83, 49, 48, 55, 128, 86, 83, 49, 48, 54, 128, 86, 83, + 49, 48, 53, 128, 86, 83, 49, 48, 52, 128, 86, 83, 49, 48, 51, 128, 86, + 83, 49, 48, 50, 128, 86, 83, 49, 48, 49, 128, 86, 83, 49, 48, 48, 128, + 86, 83, 49, 48, 128, 86, 83, 49, 128, 86, 83, 128, 86, 82, 65, 67, 72, + 89, 128, 86, 79, 88, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, 82, 73, 69, + 210, 86, 79, 87, 128, 86, 79, 85, 128, 86, 79, 84, 128, 86, 79, 211, 86, + 79, 80, 128, 86, 79, 79, 73, 128, 86, 79, 79, 128, 86, 79, 77, 73, 84, + 73, 78, 71, 128, 86, 79, 77, 128, 86, 79, 76, 85, 77, 197, 86, 79, 76, + 84, 65, 71, 197, 86, 79, 76, 76, 69, 89, 66, 65, 76, 76, 128, 86, 79, 76, + 67, 65, 78, 79, 128, 86, 79, 76, 65, 80, 85, 203, 86, 79, 73, 68, 69, + 196, 86, 79, 73, 196, 86, 79, 73, 67, 73, 78, 71, 128, 86, 79, 73, 67, + 69, 76, 69, 83, 211, 86, 79, 73, 67, 69, 196, 86, 79, 68, 128, 86, 79, + 67, 65, 76, 73, 90, 65, 84, 73, 79, 206, 86, 79, 67, 65, 204, 86, 79, + 128, 86, 73, 89, 79, 128, 86, 73, 88, 128, 86, 73, 84, 82, 73, 79, 76, + 45, 50, 128, 86, 73, 84, 82, 73, 79, 76, 128, 86, 73, 84, 65, 69, 45, 50, + 128, 86, 73, 84, 65, 69, 128, 86, 73, 84, 128, 86, 73, 83, 73, 71, 79, + 84, 72, 73, 195, 86, 73, 83, 65, 82, 71, 65, 89, 65, 128, 86, 73, 83, 65, + 82, 71, 65, 128, 86, 73, 83, 65, 82, 71, 193, 86, 73, 82, 73, 65, 77, + 128, 86, 73, 82, 71, 79, 128, 86, 73, 82, 71, 65, 128, 86, 73, 82, 65, + 77, 65, 128, 86, 73, 80, 128, 86, 73, 79, 76, 73, 78, 128, 86, 73, 78, + 69, 71, 65, 82, 45, 51, 128, 86, 73, 78, 69, 71, 65, 82, 45, 50, 128, 86, + 73, 78, 69, 71, 65, 82, 128, 86, 73, 78, 69, 71, 65, 210, 86, 73, 78, 69, + 128, 86, 73, 78, 197, 86, 73, 78, 128, 86, 73, 76, 76, 65, 71, 69, 128, + 86, 73, 73, 128, 86, 73, 71, 73, 78, 84, 73, 76, 69, 128, 86, 73, 69, 88, + 128, 86, 73, 69, 87, 73, 78, 199, 86, 73, 69, 87, 68, 65, 84, 193, 86, + 73, 69, 84, 78, 65, 77, 69, 83, 197, 86, 73, 69, 84, 128, 86, 73, 69, + 212, 86, 73, 69, 80, 128, 86, 73, 69, 128, 86, 73, 68, 74, 45, 50, 128, + 86, 73, 68, 74, 128, 86, 73, 68, 69, 79, 67, 65, 83, 83, 69, 84, 84, 69, + 128, 86, 73, 68, 69, 207, 86, 73, 68, 65, 128, 86, 73, 67, 84, 79, 82, + 217, 86, 73, 66, 82, 65, 84, 73, 79, 206, 86, 72, 65, 128, 86, 70, 65, + 128, 86, 69, 89, 90, 128, 86, 69, 88, 128, 86, 69, 87, 128, 86, 69, 215, + 86, 69, 85, 88, 128, 86, 69, 85, 77, 128, 86, 69, 85, 65, 69, 80, 69, 78, + 128, 86, 69, 85, 65, 69, 128, 86, 69, 83, 84, 65, 128, 86, 69, 83, 84, + 128, 86, 69, 83, 83, 69, 204, 86, 69, 82, 217, 86, 69, 82, 84, 73, 67, + 65, 76, 76, 89, 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 54, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 54, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, + 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 50, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 49, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 53, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 53, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, + 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 51, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 50, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 53, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 52, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, + 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 52, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 51, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 52, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 52, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, + 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 53, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 52, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 51, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 51, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, + 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 54, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 53, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 50, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 50, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, + 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 48, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 54, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 49, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 49, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, + 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 49, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 48, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 48, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 48, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, + 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 50, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 49, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 128, 86, 69, 82, 83, 73, 67, 76, 69, 128, 86, 69, 82, 83, 197, + 86, 69, 82, 71, 69, 128, 86, 69, 82, 68, 73, 71, 82, 73, 83, 128, 86, 69, + 82, 128, 86, 69, 80, 128, 86, 69, 78, 68, 128, 86, 69, 76, 73, 128, 86, + 69, 73, 76, 128, 86, 69, 72, 73, 67, 76, 69, 128, 86, 69, 72, 128, 86, + 69, 200, 86, 69, 69, 128, 86, 69, 197, 86, 69, 68, 69, 128, 86, 69, 67, + 84, 79, 210, 86, 65, 89, 65, 78, 78, 65, 128, 86, 65, 88, 128, 86, 65, + 86, 128, 86, 65, 214, 86, 65, 85, 128, 86, 65, 84, 72, 89, 128, 86, 65, + 84, 128, 86, 65, 83, 84, 78, 69, 83, 211, 86, 65, 83, 73, 83, 128, 86, + 65, 82, 89, 211, 86, 65, 82, 73, 75, 65, 128, 86, 65, 82, 73, 65, 78, 84, + 128, 86, 65, 82, 73, 65, 78, 212, 86, 65, 82, 73, 65, 128, 86, 65, 82, + 73, 193, 86, 65, 82, 69, 73, 65, 201, 86, 65, 82, 69, 73, 193, 86, 65, + 82, 65, 65, 75, 65, 78, 128, 86, 65, 80, 79, 85, 82, 83, 128, 86, 65, 80, + 128, 86, 65, 78, 69, 128, 86, 65, 77, 80, 73, 82, 69, 128, 86, 65, 77, + 65, 71, 79, 77, 85, 75, 72, 65, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, + 72, 193, 86, 65, 76, 76, 69, 89, 128, 86, 65, 75, 65, 73, 89, 65, 82, 65, + 65, 128, 86, 65, 74, 128, 86, 65, 73, 128, 86, 65, 72, 128, 86, 65, 200, + 86, 65, 65, 86, 85, 128, 86, 65, 65, 128, 86, 193, 86, 48, 52, 48, 65, + 128, 86, 48, 52, 48, 128, 86, 48, 51, 57, 128, 86, 48, 51, 56, 128, 86, + 48, 51, 55, 65, 128, 86, 48, 51, 55, 128, 86, 48, 51, 54, 128, 86, 48, + 51, 53, 128, 86, 48, 51, 52, 128, 86, 48, 51, 51, 65, 128, 86, 48, 51, + 51, 128, 86, 48, 51, 50, 128, 86, 48, 51, 49, 65, 128, 86, 48, 51, 49, + 128, 86, 48, 51, 48, 65, 128, 86, 48, 51, 48, 128, 86, 48, 50, 57, 65, + 128, 86, 48, 50, 57, 128, 86, 48, 50, 56, 65, 128, 86, 48, 50, 56, 128, + 86, 48, 50, 55, 128, 86, 48, 50, 54, 128, 86, 48, 50, 53, 128, 86, 48, + 50, 52, 128, 86, 48, 50, 51, 65, 128, 86, 48, 50, 51, 128, 86, 48, 50, + 50, 128, 86, 48, 50, 49, 128, 86, 48, 50, 48, 76, 128, 86, 48, 50, 48, + 75, 128, 86, 48, 50, 48, 74, 128, 86, 48, 50, 48, 73, 128, 86, 48, 50, + 48, 72, 128, 86, 48, 50, 48, 71, 128, 86, 48, 50, 48, 70, 128, 86, 48, + 50, 48, 69, 128, 86, 48, 50, 48, 68, 128, 86, 48, 50, 48, 67, 128, 86, + 48, 50, 48, 66, 128, 86, 48, 50, 48, 65, 128, 86, 48, 50, 48, 128, 86, + 48, 49, 57, 128, 86, 48, 49, 56, 128, 86, 48, 49, 55, 128, 86, 48, 49, + 54, 128, 86, 48, 49, 53, 128, 86, 48, 49, 52, 128, 86, 48, 49, 51, 128, + 86, 48, 49, 50, 66, 128, 86, 48, 49, 50, 65, 128, 86, 48, 49, 50, 128, + 86, 48, 49, 49, 67, 128, 86, 48, 49, 49, 66, 128, 86, 48, 49, 49, 65, + 128, 86, 48, 49, 49, 128, 86, 48, 49, 48, 128, 86, 48, 48, 57, 128, 86, + 48, 48, 56, 128, 86, 48, 48, 55, 66, 128, 86, 48, 48, 55, 65, 128, 86, + 48, 48, 55, 128, 86, 48, 48, 54, 128, 86, 48, 48, 53, 128, 86, 48, 48, + 52, 128, 86, 48, 48, 51, 128, 86, 48, 48, 50, 65, 128, 86, 48, 48, 50, + 128, 86, 48, 48, 49, 73, 128, 86, 48, 48, 49, 72, 128, 86, 48, 48, 49, + 71, 128, 86, 48, 48, 49, 70, 128, 86, 48, 48, 49, 69, 128, 86, 48, 48, + 49, 68, 128, 86, 48, 48, 49, 67, 128, 86, 48, 48, 49, 66, 128, 86, 48, + 48, 49, 65, 128, 86, 48, 48, 49, 128, 85, 90, 85, 128, 85, 90, 72, 65, + 75, 75, 85, 128, 85, 90, 51, 128, 85, 90, 179, 85, 89, 65, 78, 78, 65, + 128, 85, 89, 128, 85, 87, 85, 128, 85, 85, 89, 65, 78, 78, 65, 128, 85, + 85, 85, 85, 128, 85, 85, 85, 51, 128, 85, 85, 85, 50, 128, 85, 85, 69, + 128, 85, 84, 85, 75, 73, 128, 85, 83, 83, 85, 51, 128, 85, 83, 83, 85, + 128, 85, 83, 72, 88, 128, 85, 83, 72, 85, 77, 88, 128, 85, 83, 72, 69, + 78, 78, 65, 128, 85, 83, 72, 50, 128, 85, 83, 72, 128, 85, 83, 200, 85, + 83, 69, 196, 85, 83, 69, 45, 50, 128, 85, 83, 69, 45, 49, 128, 85, 83, + 69, 128, 85, 83, 197, 85, 82, 85, 218, 85, 82, 85, 83, 128, 85, 82, 85, + 68, 65, 128, 85, 82, 85, 68, 193, 85, 82, 85, 128, 85, 82, 213, 85, 82, + 78, 128, 85, 82, 73, 78, 69, 128, 85, 82, 73, 51, 128, 85, 82, 73, 128, + 85, 82, 65, 78, 85, 83, 128, 85, 82, 65, 128, 85, 82, 52, 128, 85, 82, + 50, 128, 85, 82, 178, 85, 210, 85, 80, 87, 65, 82, 68, 83, 128, 85, 80, + 87, 65, 82, 68, 211, 85, 80, 87, 65, 82, 68, 128, 85, 80, 87, 65, 82, + 196, 85, 80, 84, 85, 82, 78, 128, 85, 80, 83, 73, 76, 79, 78, 128, 85, + 80, 83, 73, 76, 79, 206, 85, 80, 83, 73, 68, 69, 45, 68, 79, 87, 206, 85, + 80, 82, 73, 71, 72, 212, 85, 80, 80, 69, 82, 128, 85, 80, 65, 68, 72, 77, + 65, 78, 73, 89, 65, 128, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, 85, + 79, 78, 128, 85, 79, 71, 128, 85, 78, 78, 128, 85, 78, 77, 65, 82, 82, + 73, 69, 196, 85, 78, 75, 78, 79, 87, 78, 128, 85, 78, 75, 128, 85, 78, + 73, 86, 69, 82, 83, 65, 204, 85, 78, 73, 84, 89, 128, 85, 78, 73, 84, 69, + 196, 85, 78, 73, 84, 128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, + 78, 73, 79, 206, 85, 78, 73, 70, 79, 82, 77, 128, 85, 78, 73, 70, 73, 69, + 196, 85, 78, 73, 67, 79, 82, 206, 85, 78, 69, 86, 69, 206, 85, 78, 68, + 207, 85, 78, 68, 69, 82, 84, 73, 69, 128, 85, 78, 68, 69, 82, 76, 73, 78, + 197, 85, 78, 68, 69, 82, 68, 79, 84, 128, 85, 78, 68, 69, 82, 66, 65, 82, + 128, 85, 78, 68, 69, 82, 128, 85, 78, 68, 69, 210, 85, 78, 67, 73, 193, + 85, 78, 67, 69, 82, 84, 65, 73, 78, 84, 217, 85, 78, 66, 76, 69, 78, 68, + 69, 196, 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, 128, 85, 78, 65, 80, + 128, 85, 78, 65, 77, 85, 83, 69, 196, 85, 78, 65, 128, 85, 206, 85, 77, + 85, 77, 128, 85, 77, 85, 205, 85, 77, 66, 82, 69, 76, 76, 65, 128, 85, + 77, 66, 82, 69, 76, 76, 193, 85, 77, 66, 73, 78, 128, 85, 75, 85, 128, + 85, 75, 82, 65, 73, 78, 73, 65, 206, 85, 75, 65, 82, 65, 128, 85, 75, 65, + 82, 193, 85, 75, 128, 85, 73, 76, 76, 69, 65, 78, 78, 128, 85, 73, 71, + 72, 85, 210, 85, 72, 68, 128, 85, 71, 65, 82, 73, 84, 73, 195, 85, 69, + 89, 128, 85, 69, 78, 128, 85, 69, 73, 128, 85, 69, 69, 128, 85, 69, 65, + 128, 85, 68, 85, 71, 128, 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, + 84, 193, 85, 68, 65, 65, 84, 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, + 66, 85, 70, 73, 76, 73, 128, 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, + 68, 65, 77, 65, 128, 85, 66, 128, 85, 65, 84, 72, 128, 85, 65, 78, 71, + 128, 85, 65, 128, 85, 178, 85, 48, 52, 50, 128, 85, 48, 52, 49, 128, 85, + 48, 52, 48, 128, 85, 48, 51, 57, 128, 85, 48, 51, 56, 128, 85, 48, 51, + 55, 128, 85, 48, 51, 54, 128, 85, 48, 51, 53, 128, 85, 48, 51, 52, 128, + 85, 48, 51, 51, 128, 85, 48, 51, 50, 65, 128, 85, 48, 51, 50, 128, 85, + 48, 51, 49, 128, 85, 48, 51, 48, 128, 85, 48, 50, 57, 65, 128, 85, 48, + 50, 57, 128, 85, 48, 50, 56, 128, 85, 48, 50, 55, 128, 85, 48, 50, 54, + 128, 85, 48, 50, 53, 128, 85, 48, 50, 52, 128, 85, 48, 50, 51, 65, 128, + 85, 48, 50, 51, 128, 85, 48, 50, 50, 128, 85, 48, 50, 49, 128, 85, 48, + 50, 48, 128, 85, 48, 49, 57, 128, 85, 48, 49, 56, 128, 85, 48, 49, 55, + 128, 85, 48, 49, 54, 128, 85, 48, 49, 53, 128, 85, 48, 49, 52, 128, 85, + 48, 49, 51, 128, 85, 48, 49, 50, 128, 85, 48, 49, 49, 128, 85, 48, 49, + 48, 128, 85, 48, 48, 57, 128, 85, 48, 48, 56, 128, 85, 48, 48, 55, 128, + 85, 48, 48, 54, 66, 128, 85, 48, 48, 54, 65, 128, 85, 48, 48, 54, 128, + 85, 48, 48, 53, 128, 85, 48, 48, 52, 128, 85, 48, 48, 51, 128, 85, 48, + 48, 50, 128, 85, 48, 48, 49, 128, 85, 45, 83, 72, 65, 80, 69, 196, 85, + 45, 73, 45, 73, 128, 85, 45, 69, 79, 45, 69, 85, 128, 85, 45, 66, 82, 74, + 71, 85, 128, 85, 45, 53, 128, 84, 90, 85, 128, 84, 90, 79, 65, 128, 84, + 90, 79, 128, 84, 90, 73, 210, 84, 90, 73, 128, 84, 90, 69, 69, 128, 84, + 90, 69, 128, 84, 90, 65, 65, 128, 84, 90, 65, 128, 84, 90, 128, 84, 89, + 210, 84, 89, 80, 69, 45, 183, 84, 89, 80, 69, 45, 54, 128, 84, 89, 80, + 69, 45, 182, 84, 89, 80, 69, 45, 53, 128, 84, 89, 80, 69, 45, 181, 84, + 89, 80, 69, 45, 52, 128, 84, 89, 80, 69, 45, 180, 84, 89, 80, 69, 45, 51, + 128, 84, 89, 80, 69, 45, 179, 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, + 45, 49, 45, 50, 128, 84, 89, 80, 69, 45, 177, 84, 89, 80, 197, 84, 89, + 79, 128, 84, 89, 73, 128, 84, 89, 69, 128, 84, 89, 65, 89, 128, 84, 89, + 65, 128, 84, 88, 87, 86, 128, 84, 88, 87, 214, 84, 88, 72, 69, 69, 202, + 84, 88, 65, 128, 84, 87, 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, + 87, 79, 45, 84, 72, 73, 82, 84, 89, 128, 84, 87, 79, 45, 76, 73, 78, 197, + 84, 87, 79, 45, 72, 69, 65, 68, 69, 196, 84, 87, 79, 45, 69, 205, 84, 87, + 79, 45, 67, 73, 82, 67, 76, 197, 84, 87, 73, 83, 84, 73, 78, 71, 128, 84, + 87, 73, 83, 84, 69, 196, 84, 87, 73, 73, 128, 84, 87, 73, 128, 84, 87, + 69, 78, 84, 89, 45, 84, 87, 79, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, + 207, 84, 87, 69, 78, 84, 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, + 84, 89, 45, 83, 73, 88, 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, + 78, 128, 84, 87, 69, 78, 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, + 89, 45, 78, 73, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, + 128, 84, 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, + 89, 45, 70, 73, 86, 197, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, + 200, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, 87, 69, 78, + 84, 89, 128, 84, 87, 69, 78, 84, 217, 84, 87, 69, 78, 84, 73, 69, 84, 72, + 83, 128, 84, 87, 69, 78, 84, 73, 69, 84, 72, 128, 84, 87, 69, 76, 86, 69, + 45, 84, 72, 73, 82, 84, 89, 128, 84, 87, 69, 76, 86, 69, 128, 84, 87, 69, + 76, 86, 197, 84, 87, 69, 76, 70, 84, 72, 83, 128, 84, 87, 69, 76, 70, 84, + 72, 128, 84, 87, 69, 128, 84, 87, 65, 65, 128, 84, 87, 65, 128, 84, 86, + 82, 73, 68, 79, 128, 84, 86, 73, 77, 65, 68, 85, 210, 84, 85, 88, 69, 68, + 79, 128, 84, 85, 88, 128, 84, 85, 85, 77, 85, 128, 84, 85, 85, 128, 84, + 85, 84, 84, 89, 128, 84, 85, 84, 69, 89, 65, 83, 65, 84, 128, 84, 85, 84, 128, 84, 85, 82, 88, 128, 84, 85, 82, 85, 128, 84, 85, 82, 84, 76, 69, 128, 84, 85, 82, 79, 50, 128, 84, 85, 82, 78, 83, 84, 73, 76, 69, 128, 84, 85, 82, 206, 84, 85, 82, 75, 73, 83, 200, 84, 85, 82, 75, 73, 195, 84, 85, 82, 75, 69, 89, 128, 84, 85, 82, 66, 65, 78, 128, 84, 85, 82, - 128, 84, 85, 80, 78, 73, 128, 84, 85, 80, 128, 84, 85, 79, 88, 128, 84, - 85, 79, 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, 85, 78, 78, - 89, 128, 84, 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 66, 76, 69, 210, - 84, 85, 77, 65, 69, 128, 84, 85, 77, 128, 84, 85, 205, 84, 85, 76, 73, - 80, 128, 84, 85, 75, 87, 69, 78, 84, 73, 83, 128, 84, 85, 75, 128, 84, - 85, 71, 82, 73, 203, 84, 85, 71, 50, 128, 84, 85, 71, 178, 84, 85, 66, - 69, 128, 84, 85, 66, 128, 84, 85, 65, 82, 69, 199, 84, 85, 65, 69, 80, - 128, 84, 85, 65, 69, 128, 84, 85, 45, 84, 79, 128, 84, 85, 45, 52, 128, - 84, 85, 45, 51, 128, 84, 85, 45, 50, 128, 84, 85, 45, 49, 128, 84, 213, - 84, 84, 85, 85, 128, 84, 84, 85, 68, 68, 65, 71, 128, 84, 84, 85, 68, 68, - 65, 65, 71, 128, 84, 84, 85, 128, 84, 84, 84, 72, 65, 128, 84, 84, 84, - 65, 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, 128, 84, 84, 83, 73, 128, - 84, 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, 84, 84, 83, 65, 128, 84, - 84, 79, 79, 128, 84, 84, 73, 73, 128, 84, 84, 73, 128, 84, 84, 72, 87, - 69, 128, 84, 84, 72, 85, 128, 84, 84, 72, 79, 79, 128, 84, 84, 72, 79, - 128, 84, 84, 72, 73, 128, 84, 84, 72, 69, 69, 128, 84, 84, 72, 69, 128, - 84, 84, 72, 65, 65, 128, 84, 84, 72, 128, 84, 84, 69, 72, 69, 72, 128, - 84, 84, 69, 72, 69, 200, 84, 84, 69, 72, 128, 84, 84, 69, 200, 84, 84, - 69, 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 84, 84, 65, 85, 128, - 84, 84, 65, 73, 128, 84, 84, 65, 65, 128, 84, 84, 50, 128, 84, 83, 87, - 69, 128, 84, 83, 87, 66, 128, 84, 83, 87, 65, 128, 84, 83, 86, 128, 84, - 83, 83, 69, 128, 84, 83, 83, 65, 128, 84, 83, 79, 214, 84, 83, 73, 85, - 128, 84, 83, 72, 85, 71, 83, 128, 84, 83, 72, 79, 79, 75, 128, 84, 83, - 72, 79, 79, 203, 84, 83, 72, 79, 79, 74, 128, 84, 83, 72, 69, 83, 128, - 84, 83, 72, 69, 71, 128, 84, 83, 72, 69, 199, 84, 83, 72, 69, 69, 74, - 128, 84, 83, 72, 69, 128, 84, 83, 72, 65, 194, 84, 83, 72, 65, 128, 84, - 83, 69, 82, 69, 128, 84, 83, 69, 69, 66, 128, 84, 83, 65, 68, 73, 128, - 84, 83, 65, 68, 201, 84, 83, 65, 66, 128, 84, 83, 65, 65, 68, 73, 89, - 128, 84, 83, 65, 65, 128, 84, 83, 193, 84, 211, 84, 82, 89, 66, 76, 73, - 79, 206, 84, 82, 85, 84, 72, 128, 84, 82, 85, 78, 75, 128, 84, 82, 85, - 78, 67, 65, 84, 69, 196, 84, 82, 85, 77, 80, 69, 84, 128, 84, 82, 85, 77, - 80, 45, 57, 128, 84, 82, 85, 77, 80, 45, 56, 128, 84, 82, 85, 77, 80, 45, - 55, 128, 84, 82, 85, 77, 80, 45, 54, 128, 84, 82, 85, 77, 80, 45, 53, - 128, 84, 82, 85, 77, 80, 45, 52, 128, 84, 82, 85, 77, 80, 45, 51, 128, - 84, 82, 85, 77, 80, 45, 50, 49, 128, 84, 82, 85, 77, 80, 45, 50, 48, 128, - 84, 82, 85, 77, 80, 45, 50, 128, 84, 82, 85, 77, 80, 45, 49, 57, 128, 84, - 82, 85, 77, 80, 45, 49, 56, 128, 84, 82, 85, 77, 80, 45, 49, 55, 128, 84, - 82, 85, 77, 80, 45, 49, 54, 128, 84, 82, 85, 77, 80, 45, 49, 53, 128, 84, - 82, 85, 77, 80, 45, 49, 52, 128, 84, 82, 85, 77, 80, 45, 49, 51, 128, 84, - 82, 85, 77, 80, 45, 49, 50, 128, 84, 82, 85, 77, 80, 45, 49, 49, 128, 84, - 82, 85, 77, 80, 45, 49, 48, 128, 84, 82, 85, 77, 80, 45, 49, 128, 84, 82, - 85, 69, 128, 84, 82, 85, 197, 84, 82, 85, 67, 75, 128, 84, 82, 79, 80, - 73, 67, 65, 204, 84, 82, 79, 80, 72, 89, 128, 84, 82, 79, 77, 73, 75, 79, - 83, 89, 78, 65, 71, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 80, 83, 73, - 70, 73, 83, 84, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 80, 65, 82, 65, - 75, 65, 76, 69, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 78, 128, 84, - 82, 79, 77, 73, 75, 79, 206, 84, 82, 79, 77, 73, 75, 79, 76, 89, 71, 73, - 83, 77, 65, 128, 84, 82, 79, 76, 76, 69, 89, 66, 85, 83, 128, 84, 82, 79, - 76, 76, 69, 89, 128, 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, 84, 82, 79, - 69, 90, 69, 78, 73, 65, 206, 84, 82, 73, 85, 77, 80, 72, 128, 84, 82, 73, - 84, 79, 211, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 82, 73, - 83, 73, 77, 79, 85, 128, 84, 82, 73, 83, 69, 77, 69, 128, 84, 82, 73, 80, - 79, 68, 128, 84, 82, 73, 80, 76, 73, 128, 84, 82, 73, 80, 76, 69, 128, - 84, 82, 73, 80, 76, 197, 84, 82, 73, 79, 206, 84, 82, 73, 76, 76, 73, 79, - 78, 83, 128, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 73, 71, 82, 65, 77, - 77, 79, 211, 84, 82, 73, 71, 82, 65, 205, 84, 82, 73, 71, 79, 82, 71, 79, - 78, 128, 84, 82, 73, 70, 79, 78, 73, 65, 83, 128, 84, 82, 73, 70, 79, 76, - 73, 65, 84, 197, 84, 82, 73, 68, 69, 78, 84, 128, 84, 82, 73, 68, 69, 78, - 212, 84, 82, 73, 67, 79, 76, 79, 78, 128, 84, 82, 73, 65, 78, 71, 85, 76, - 65, 210, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, 85, 78, 196, 84, 82, - 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, 68, 69, 196, 84, 82, 73, 65, 78, - 71, 76, 69, 128, 84, 82, 73, 65, 78, 71, 76, 197, 84, 82, 73, 65, 128, - 84, 82, 73, 128, 84, 82, 69, 83, 73, 76, 76, 79, 128, 84, 82, 69, 78, 68, - 128, 84, 82, 69, 78, 196, 84, 82, 69, 77, 79, 76, 79, 45, 51, 128, 84, - 82, 69, 77, 79, 76, 79, 45, 50, 128, 84, 82, 69, 77, 79, 76, 79, 45, 49, - 128, 84, 82, 69, 69, 128, 84, 82, 69, 197, 84, 82, 69, 68, 69, 67, 73, - 76, 69, 128, 84, 82, 69, 65, 68, 73, 78, 71, 128, 84, 82, 65, 89, 128, - 84, 82, 65, 86, 69, 76, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 84, 82, - 65, 86, 69, 76, 45, 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 84, 82, 65, - 80, 69, 90, 73, 85, 77, 128, 84, 82, 65, 78, 83, 86, 69, 82, 83, 65, 204, - 84, 82, 65, 78, 83, 80, 79, 83, 73, 84, 73, 79, 206, 84, 82, 65, 78, 83, - 80, 76, 85, 84, 79, 128, 84, 82, 65, 78, 83, 77, 73, 212, 84, 82, 65, 78, - 83, 77, 73, 83, 83, 73, 79, 78, 128, 84, 82, 65, 78, 83, 77, 73, 83, 83, - 73, 79, 206, 84, 82, 65, 77, 87, 65, 89, 128, 84, 82, 65, 77, 128, 84, - 82, 65, 205, 84, 82, 65, 73, 78, 128, 84, 82, 65, 73, 206, 84, 82, 65, - 73, 76, 73, 78, 199, 84, 82, 65, 70, 70, 73, 67, 128, 84, 82, 65, 70, 70, - 73, 195, 84, 82, 65, 68, 73, 84, 73, 79, 78, 65, 204, 84, 82, 65, 68, - 197, 84, 82, 65, 67, 84, 79, 82, 128, 84, 82, 65, 67, 75, 66, 65, 76, 76, - 128, 84, 82, 65, 67, 75, 128, 84, 82, 65, 128, 84, 82, 128, 84, 79, 88, - 128, 84, 79, 87, 69, 82, 128, 84, 79, 87, 65, 82, 68, 211, 84, 79, 86, - 128, 84, 79, 85, 82, 78, 79, 73, 211, 84, 79, 85, 67, 72, 84, 79, 78, - 197, 84, 79, 85, 67, 72, 73, 78, 199, 84, 79, 85, 67, 72, 69, 211, 84, - 79, 85, 67, 200, 84, 79, 84, 65, 204, 84, 79, 84, 128, 84, 79, 83, 128, - 84, 79, 82, 84, 79, 73, 83, 197, 84, 79, 82, 83, 79, 45, 87, 65, 76, 76, - 80, 76, 65, 78, 197, 84, 79, 82, 83, 79, 45, 70, 76, 79, 79, 82, 80, 76, - 65, 78, 197, 84, 79, 82, 83, 79, 128, 84, 79, 82, 78, 65, 68, 79, 128, - 84, 79, 82, 67, 85, 76, 85, 83, 128, 84, 79, 82, 67, 85, 76, 85, 211, 84, - 79, 82, 67, 72, 128, 84, 79, 81, 128, 84, 79, 80, 66, 65, 82, 128, 84, - 79, 80, 45, 76, 73, 71, 72, 84, 69, 196, 84, 79, 80, 128, 84, 79, 208, - 84, 79, 79, 84, 72, 128, 84, 79, 79, 78, 128, 84, 79, 79, 76, 66, 79, 88, - 128, 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, 69, 128, 84, 79, 78, - 71, 85, 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45, 86, 128, 84, 79, - 78, 69, 45, 83, 128, 84, 79, 78, 69, 45, 77, 128, 84, 79, 78, 69, 45, 74, - 128, 84, 79, 78, 69, 45, 71, 128, 84, 79, 78, 69, 45, 68, 128, 84, 79, - 78, 69, 45, 66, 128, 84, 79, 78, 69, 45, 56, 128, 84, 79, 78, 69, 45, 55, - 128, 84, 79, 78, 69, 45, 54, 128, 84, 79, 78, 69, 45, 53, 128, 84, 79, - 78, 69, 45, 52, 128, 84, 79, 78, 69, 45, 51, 128, 84, 79, 78, 69, 45, 50, - 128, 84, 79, 78, 69, 45, 49, 128, 84, 79, 78, 69, 128, 84, 79, 78, 65, - 204, 84, 79, 77, 80, 73, 128, 84, 79, 77, 65, 84, 79, 128, 84, 79, 76, - 79, 78, 71, 128, 84, 79, 75, 89, 207, 84, 79, 73, 76, 69, 84, 128, 84, - 79, 71, 69, 84, 72, 69, 82, 128, 84, 79, 68, 207, 84, 79, 65, 78, 68, 65, - 75, 72, 73, 65, 84, 128, 84, 79, 65, 128, 84, 79, 45, 82, 65, 128, 84, - 79, 45, 54, 128, 84, 79, 45, 53, 128, 84, 79, 45, 52, 128, 84, 79, 45, - 51, 128, 84, 79, 45, 50, 128, 84, 79, 45, 49, 128, 84, 78, 128, 84, 76, - 86, 128, 84, 76, 85, 128, 84, 76, 79, 128, 84, 76, 73, 128, 84, 76, 72, - 89, 65, 128, 84, 76, 72, 87, 69, 128, 84, 76, 72, 85, 128, 84, 76, 72, - 79, 79, 128, 84, 76, 72, 79, 128, 84, 76, 72, 73, 128, 84, 76, 72, 69, - 69, 128, 84, 76, 72, 69, 128, 84, 76, 72, 65, 128, 84, 76, 69, 69, 128, - 84, 76, 65, 128, 84, 74, 69, 128, 84, 73, 88, 128, 84, 73, 87, 82, 128, - 84, 73, 87, 78, 128, 84, 73, 87, 65, 218, 84, 73, 84, 85, 65, 69, 80, - 128, 84, 73, 84, 76, 79, 128, 84, 73, 84, 76, 207, 84, 73, 84, 193, 84, - 73, 84, 128, 84, 73, 82, 89, 65, 75, 128, 84, 73, 82, 84, 193, 84, 73, - 82, 79, 78, 73, 65, 206, 84, 73, 82, 72, 85, 84, 193, 84, 73, 82, 69, - 196, 84, 73, 82, 128, 84, 73, 210, 84, 73, 80, 80, 73, 128, 84, 73, 80, - 69, 72, 65, 128, 84, 73, 80, 128, 84, 73, 208, 84, 73, 78, 89, 128, 84, - 73, 78, 217, 84, 73, 78, 78, 69, 128, 84, 73, 78, 67, 84, 85, 82, 69, - 128, 84, 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83, 128, 84, 73, - 77, 69, 210, 84, 73, 77, 69, 128, 84, 73, 76, 84, 73, 78, 71, 128, 84, - 73, 76, 84, 73, 78, 199, 84, 73, 76, 84, 128, 84, 73, 76, 69, 83, 128, - 84, 73, 76, 68, 69, 128, 84, 73, 76, 68, 197, 84, 73, 76, 128, 84, 73, - 204, 84, 73, 75, 69, 85, 84, 45, 84, 72, 73, 69, 85, 84, 72, 128, 84, 73, - 75, 69, 85, 84, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 84, - 73, 75, 69, 85, 84, 45, 83, 73, 79, 83, 128, 84, 73, 75, 69, 85, 84, 45, - 82, 73, 69, 85, 76, 128, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, - 128, 84, 73, 75, 69, 85, 84, 45, 77, 73, 69, 85, 77, 128, 84, 73, 75, 69, - 85, 84, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 67, - 73, 69, 85, 67, 128, 84, 73, 75, 69, 85, 84, 45, 67, 72, 73, 69, 85, 67, - 72, 128, 84, 73, 75, 69, 85, 84, 128, 84, 73, 75, 69, 85, 212, 84, 73, - 71, 72, 84, 76, 89, 45, 67, 76, 79, 83, 69, 196, 84, 73, 71, 72, 212, 84, - 73, 71, 69, 82, 128, 84, 73, 71, 69, 210, 84, 73, 70, 73, 78, 65, 71, - 200, 84, 73, 69, 88, 128, 84, 73, 69, 80, 128, 84, 73, 197, 84, 73, 67, - 75, 69, 84, 83, 128, 84, 73, 67, 75, 69, 84, 128, 84, 73, 67, 75, 128, - 84, 73, 67, 203, 84, 73, 65, 82, 65, 128, 84, 73, 50, 128, 84, 73, 45, - 55, 128, 84, 73, 45, 54, 128, 84, 73, 45, 53, 128, 84, 73, 45, 52, 128, - 84, 73, 45, 51, 128, 84, 73, 45, 50, 128, 84, 73, 45, 49, 128, 84, 72, - 90, 128, 84, 72, 89, 79, 79, 205, 84, 72, 87, 79, 79, 128, 84, 72, 87, - 79, 128, 84, 72, 87, 73, 73, 128, 84, 72, 87, 73, 128, 84, 72, 87, 69, - 69, 128, 84, 72, 87, 65, 65, 128, 84, 72, 87, 65, 128, 84, 72, 85, 82, - 211, 84, 72, 85, 82, 73, 83, 65, 218, 84, 72, 85, 78, 71, 128, 84, 72, - 85, 78, 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, 72, 85, 78, 68, 69, 82, - 128, 84, 72, 85, 78, 68, 69, 210, 84, 72, 85, 77, 66, 211, 84, 72, 85, - 77, 66, 128, 84, 72, 82, 79, 87, 73, 78, 199, 84, 72, 82, 79, 85, 71, 72, - 128, 84, 72, 82, 79, 85, 71, 200, 84, 72, 82, 69, 69, 45, 84, 72, 73, 82, - 84, 89, 128, 84, 72, 82, 69, 69, 45, 81, 85, 65, 82, 84, 69, 210, 84, 72, - 82, 69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 72, 82, 69, 69, 45, 76, 73, - 78, 197, 84, 72, 82, 69, 69, 45, 76, 69, 71, 71, 69, 196, 84, 72, 82, 69, - 69, 45, 72, 85, 78, 68, 82, 69, 68, 45, 65, 78, 68, 45, 84, 87, 69, 78, - 84, 73, 69, 84, 72, 128, 84, 72, 82, 69, 69, 45, 69, 205, 84, 72, 82, 69, - 69, 45, 68, 79, 212, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 69, 45, - 67, 73, 82, 67, 76, 197, 84, 72, 82, 69, 65, 68, 128, 84, 72, 79, 85, 83, - 65, 78, 68, 83, 128, 84, 72, 79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, - 83, 65, 78, 196, 84, 72, 79, 85, 71, 72, 212, 84, 72, 79, 85, 128, 84, - 72, 79, 82, 78, 128, 84, 72, 79, 82, 206, 84, 72, 79, 78, 71, 128, 84, - 72, 79, 77, 128, 84, 72, 79, 74, 128, 84, 72, 79, 65, 128, 84, 72, 207, - 84, 72, 73, 85, 84, 72, 128, 84, 72, 73, 84, 65, 128, 84, 72, 73, 82, 84, - 89, 45, 83, 69, 67, 79, 78, 68, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, - 67, 79, 78, 196, 84, 72, 73, 82, 84, 89, 45, 79, 78, 69, 128, 84, 72, 73, - 82, 84, 89, 45, 70, 73, 86, 197, 84, 72, 73, 82, 84, 217, 84, 72, 73, 82, - 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, 206, 84, 72, 73, 82, 68, - 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 82, 68, 45, 83, 84, 65, 71, - 197, 84, 72, 73, 82, 68, 128, 84, 72, 73, 82, 196, 84, 72, 73, 78, 75, - 73, 78, 199, 84, 72, 73, 78, 71, 128, 84, 72, 73, 73, 128, 84, 72, 73, - 71, 72, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, 73, 67, 203, 84, 72, - 73, 65, 66, 128, 84, 72, 69, 89, 128, 84, 72, 69, 84, 72, 69, 128, 84, - 72, 69, 84, 72, 128, 84, 72, 69, 84, 65, 128, 84, 72, 69, 84, 193, 84, - 72, 69, 83, 80, 73, 65, 206, 84, 72, 69, 83, 69, 79, 83, 128, 84, 72, 69, - 83, 69, 79, 211, 84, 72, 69, 211, 84, 72, 69, 82, 77, 79, 77, 69, 84, 69, - 82, 128, 84, 72, 69, 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 84, 72, - 69, 82, 69, 70, 79, 82, 69, 128, 84, 72, 69, 82, 197, 84, 72, 69, 206, - 84, 72, 69, 77, 65, 84, 73, 83, 77, 79, 211, 84, 72, 69, 77, 65, 128, 84, - 72, 69, 77, 193, 84, 72, 69, 72, 128, 84, 72, 69, 200, 84, 72, 69, 65, - 128, 84, 72, 197, 84, 72, 65, 87, 128, 84, 72, 65, 78, 84, 72, 65, 75, - 72, 65, 84, 128, 84, 72, 65, 78, 78, 65, 128, 84, 72, 65, 78, 128, 84, - 72, 65, 206, 84, 72, 65, 77, 69, 68, 72, 128, 84, 72, 65, 76, 128, 84, - 72, 65, 204, 84, 72, 65, 74, 128, 84, 72, 65, 201, 84, 72, 65, 72, 65, - 78, 128, 84, 72, 65, 65, 78, 193, 84, 72, 65, 65, 76, 85, 128, 84, 72, - 45, 67, 82, 69, 197, 84, 69, 88, 84, 128, 84, 69, 88, 212, 84, 69, 88, - 128, 84, 69, 86, 73, 82, 128, 84, 69, 85, 84, 69, 85, 88, 128, 84, 69, - 85, 84, 69, 85, 87, 69, 78, 128, 84, 69, 85, 84, 128, 84, 69, 85, 78, - 128, 84, 69, 85, 65, 69, 81, 128, 84, 69, 85, 65, 69, 78, 128, 84, 69, - 85, 128, 84, 69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, 69, 84, 82, 65, - 83, 69, 77, 69, 128, 84, 69, 84, 82, 65, 80, 76, 73, 128, 84, 69, 84, 82, - 65, 71, 82, 65, 205, 84, 69, 84, 82, 65, 70, 79, 78, 73, 65, 83, 128, 84, - 69, 84, 72, 128, 84, 69, 84, 200, 84, 69, 84, 65, 82, 84, 79, 211, 84, - 69, 84, 65, 82, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 69, 84, 128, 84, - 69, 212, 84, 69, 83, 212, 84, 69, 83, 83, 69, 82, 65, 128, 84, 69, 83, - 83, 69, 82, 193, 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83, 200, 84, - 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 69, 82, 77, 73, 78, 65, 204, - 84, 69, 80, 128, 84, 69, 78, 85, 84, 79, 128, 84, 69, 78, 85, 128, 84, - 69, 78, 213, 84, 69, 78, 84, 72, 128, 84, 69, 78, 84, 128, 84, 69, 78, - 83, 69, 128, 84, 69, 78, 83, 197, 84, 69, 78, 83, 128, 84, 69, 78, 211, - 84, 69, 78, 78, 73, 211, 84, 69, 78, 71, 197, 84, 69, 78, 45, 84, 72, 73, - 82, 84, 89, 128, 84, 69, 78, 128, 84, 69, 206, 84, 69, 77, 80, 85, 211, - 84, 69, 77, 80, 76, 69, 128, 84, 69, 76, 85, 128, 84, 69, 76, 79, 85, - 211, 84, 69, 76, 76, 69, 210, 84, 69, 76, 73, 83, 72, 193, 84, 69, 76, - 69, 86, 73, 83, 73, 79, 78, 128, 84, 69, 76, 69, 83, 67, 79, 80, 69, 128, - 84, 69, 76, 69, 80, 72, 79, 78, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, - 197, 84, 69, 76, 69, 73, 65, 128, 84, 69, 76, 69, 71, 82, 65, 80, 200, - 84, 69, 75, 128, 84, 69, 73, 87, 83, 128, 84, 69, 71, 69, 72, 128, 84, - 69, 69, 84, 72, 128, 84, 69, 69, 84, 200, 84, 69, 69, 78, 83, 128, 84, - 69, 69, 69, 69, 128, 84, 69, 197, 84, 69, 68, 85, 78, 71, 128, 84, 69, - 68, 68, 217, 84, 69, 65, 82, 211, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, - 80, 79, 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, - 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, - 84, 69, 65, 82, 45, 79, 70, 198, 84, 69, 65, 67, 85, 208, 84, 69, 45, 85, - 128, 84, 69, 45, 57, 128, 84, 69, 45, 56, 128, 84, 69, 45, 55, 128, 84, - 69, 45, 54, 128, 84, 69, 45, 53, 128, 84, 69, 45, 52, 128, 84, 69, 45, - 51, 128, 84, 69, 45, 50, 128, 84, 69, 45, 49, 128, 84, 67, 72, 69, 72, - 69, 72, 128, 84, 67, 72, 69, 72, 69, 200, 84, 67, 72, 69, 72, 128, 84, - 67, 72, 69, 200, 84, 67, 72, 69, 128, 84, 195, 84, 65, 89, 128, 84, 65, - 88, 73, 128, 84, 65, 88, 128, 84, 65, 87, 69, 76, 76, 69, 77, 69, 212, - 84, 65, 87, 65, 128, 84, 65, 87, 128, 84, 65, 215, 84, 65, 86, 73, 89, - 65, 78, 73, 128, 84, 65, 86, 128, 84, 65, 214, 84, 65, 85, 82, 85, 83, - 128, 84, 65, 85, 77, 128, 84, 65, 213, 84, 65, 84, 87, 69, 69, 76, 128, - 84, 65, 84, 87, 69, 69, 204, 84, 65, 84, 84, 79, 79, 69, 196, 84, 65, 84, - 128, 84, 65, 83, 83, 73, 128, 84, 65, 83, 128, 84, 65, 82, 85, 78, 71, - 128, 84, 65, 82, 84, 65, 82, 45, 50, 128, 84, 65, 82, 84, 65, 82, 128, - 84, 65, 82, 71, 69, 84, 128, 84, 65, 81, 128, 84, 65, 80, 69, 82, 128, - 84, 65, 80, 197, 84, 65, 80, 128, 84, 65, 79, 128, 84, 65, 78, 78, 69, - 196, 84, 65, 78, 71, 69, 82, 73, 78, 69, 128, 84, 65, 78, 71, 69, 78, 84, - 128, 84, 65, 78, 71, 69, 78, 212, 84, 65, 78, 199, 84, 65, 78, 65, 66, - 65, 84, 193, 84, 65, 78, 65, 128, 84, 65, 78, 128, 84, 65, 77, 73, 78, - 71, 128, 84, 65, 77, 65, 206, 84, 65, 77, 128, 84, 65, 76, 76, 217, 84, - 65, 76, 76, 128, 84, 65, 76, 204, 84, 65, 76, 73, 78, 71, 128, 84, 65, - 76, 73, 78, 199, 84, 65, 76, 69, 78, 84, 83, 128, 84, 65, 76, 69, 78, - 212, 84, 65, 75, 82, 201, 84, 65, 75, 72, 65, 76, 76, 85, 83, 128, 84, - 65, 75, 69, 79, 85, 212, 84, 65, 75, 69, 128, 84, 65, 75, 52, 128, 84, - 65, 75, 180, 84, 65, 75, 128, 84, 65, 73, 83, 89, 79, 85, 128, 84, 65, - 73, 76, 76, 69, 83, 211, 84, 65, 73, 76, 128, 84, 65, 73, 204, 84, 65, - 72, 65, 76, 65, 128, 84, 65, 72, 128, 84, 65, 200, 84, 65, 71, 66, 65, - 78, 87, 193, 84, 65, 71, 65, 76, 79, 199, 84, 65, 71, 128, 84, 65, 69, - 206, 84, 65, 67, 79, 128, 84, 65, 67, 75, 128, 84, 65, 67, 203, 84, 65, - 66, 85, 76, 65, 84, 73, 79, 78, 128, 84, 65, 66, 85, 76, 65, 84, 73, 79, - 206, 84, 65, 66, 83, 128, 84, 65, 66, 76, 69, 128, 84, 65, 66, 76, 197, - 84, 65, 66, 128, 84, 65, 194, 84, 65, 65, 83, 72, 65, 69, 128, 84, 65, - 65, 81, 128, 84, 65, 65, 77, 128, 84, 65, 65, 76, 85, 74, 193, 84, 65, - 65, 73, 128, 84, 65, 65, 70, 128, 84, 65, 50, 128, 84, 65, 45, 82, 79, - 76, 128, 84, 65, 45, 52, 128, 84, 65, 45, 51, 128, 84, 65, 45, 50, 128, - 84, 65, 45, 49, 128, 84, 48, 51, 54, 128, 84, 48, 51, 53, 128, 84, 48, - 51, 52, 128, 84, 48, 51, 51, 65, 128, 84, 48, 51, 51, 128, 84, 48, 51, - 50, 65, 128, 84, 48, 51, 50, 128, 84, 48, 51, 49, 128, 84, 48, 51, 48, - 128, 84, 48, 50, 57, 128, 84, 48, 50, 56, 128, 84, 48, 50, 55, 128, 84, - 48, 50, 54, 128, 84, 48, 50, 53, 128, 84, 48, 50, 52, 128, 84, 48, 50, - 51, 128, 84, 48, 50, 50, 128, 84, 48, 50, 49, 128, 84, 48, 50, 48, 128, - 84, 48, 49, 57, 128, 84, 48, 49, 56, 128, 84, 48, 49, 55, 128, 84, 48, - 49, 54, 65, 128, 84, 48, 49, 54, 128, 84, 48, 49, 53, 128, 84, 48, 49, - 52, 128, 84, 48, 49, 51, 128, 84, 48, 49, 50, 128, 84, 48, 49, 49, 65, - 128, 84, 48, 49, 49, 128, 84, 48, 49, 48, 128, 84, 48, 48, 57, 65, 128, - 84, 48, 48, 57, 128, 84, 48, 48, 56, 65, 128, 84, 48, 48, 56, 128, 84, - 48, 48, 55, 65, 128, 84, 48, 48, 55, 128, 84, 48, 48, 54, 128, 84, 48, - 48, 53, 128, 84, 48, 48, 52, 128, 84, 48, 48, 51, 65, 128, 84, 48, 48, - 51, 128, 84, 48, 48, 50, 128, 84, 48, 48, 49, 128, 84, 45, 83, 72, 73, - 82, 84, 128, 84, 45, 82, 69, 88, 128, 83, 90, 90, 128, 83, 90, 87, 71, - 128, 83, 90, 87, 65, 128, 83, 90, 85, 128, 83, 90, 79, 128, 83, 90, 73, - 128, 83, 90, 69, 69, 128, 83, 90, 69, 128, 83, 90, 65, 65, 128, 83, 90, - 65, 128, 83, 90, 128, 83, 89, 88, 128, 83, 89, 84, 128, 83, 89, 83, 84, - 69, 205, 83, 89, 82, 88, 128, 83, 89, 82, 77, 65, 84, 73, 75, 73, 128, - 83, 89, 82, 77, 65, 128, 83, 89, 82, 73, 78, 71, 69, 128, 83, 89, 82, 73, - 65, 195, 83, 89, 82, 128, 83, 89, 80, 128, 83, 89, 79, 85, 87, 65, 128, - 83, 89, 78, 69, 86, 77, 65, 128, 83, 89, 78, 68, 69, 83, 77, 79, 211, 83, - 89, 78, 67, 72, 82, 79, 78, 79, 85, 211, 83, 89, 78, 65, 71, 79, 71, 85, - 69, 128, 83, 89, 78, 65, 71, 77, 193, 83, 89, 78, 65, 70, 73, 128, 83, - 89, 78, 128, 83, 89, 77, 77, 69, 84, 82, 89, 128, 83, 89, 77, 77, 69, 84, - 82, 73, 195, 83, 89, 77, 66, 79, 76, 83, 128, 83, 89, 77, 66, 79, 76, - 211, 83, 89, 77, 66, 79, 76, 45, 57, 128, 83, 89, 77, 66, 79, 76, 45, 56, - 128, 83, 89, 77, 66, 79, 76, 45, 55, 128, 83, 89, 77, 66, 79, 76, 45, 54, - 128, 83, 89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, 45, - 53, 51, 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, 79, - 76, 45, 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, - 66, 79, 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, 89, - 77, 66, 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, 128, - 83, 89, 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, - 51, 128, 83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, - 45, 52, 48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, 79, - 76, 45, 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, - 66, 79, 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, - 89, 77, 66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, - 128, 83, 89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, 50, - 57, 128, 83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, - 45, 50, 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, - 79, 76, 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, - 77, 66, 79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, 128, - 83, 89, 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, 50, - 128, 83, 89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, - 49, 56, 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, 79, - 76, 45, 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, - 66, 79, 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, - 89, 77, 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, - 128, 83, 89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, 45, - 49, 128, 83, 89, 76, 79, 84, 201, 83, 89, 73, 128, 83, 89, 128, 83, 87, - 90, 128, 83, 87, 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, - 82, 68, 128, 83, 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 82, 204, - 83, 87, 73, 77, 83, 85, 73, 84, 128, 83, 87, 73, 77, 77, 73, 78, 71, 128, - 83, 87, 73, 77, 77, 69, 82, 128, 83, 87, 73, 73, 128, 83, 87, 73, 128, - 83, 87, 71, 128, 83, 87, 69, 69, 84, 128, 83, 87, 69, 69, 212, 83, 87, - 69, 65, 84, 128, 83, 87, 69, 65, 212, 83, 87, 65, 83, 200, 83, 87, 65, - 80, 80, 73, 78, 71, 128, 83, 87, 65, 78, 128, 83, 87, 65, 65, 128, 83, - 87, 128, 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65, 128, 83, - 86, 65, 82, 73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83, 85, 84, - 82, 193, 83, 85, 84, 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, - 85, 83, 72, 73, 128, 83, 85, 82, 89, 65, 128, 83, 85, 82, 88, 128, 83, - 85, 82, 82, 79, 85, 78, 68, 128, 83, 85, 82, 82, 79, 85, 78, 196, 83, 85, - 82, 70, 69, 82, 128, 83, 85, 82, 70, 65, 67, 197, 83, 85, 82, 69, 128, - 83, 85, 82, 65, 78, 71, 128, 83, 85, 82, 57, 128, 83, 85, 82, 128, 83, - 85, 210, 83, 85, 80, 82, 65, 76, 73, 78, 69, 65, 210, 83, 85, 80, 69, 82, - 86, 73, 83, 69, 128, 83, 85, 80, 69, 82, 86, 73, 76, 76, 65, 73, 78, 128, - 83, 85, 80, 69, 82, 83, 69, 84, 128, 83, 85, 80, 69, 82, 83, 69, 212, 83, - 85, 80, 69, 82, 83, 67, 82, 73, 80, 212, 83, 85, 80, 69, 82, 73, 77, 80, - 79, 83, 69, 196, 83, 85, 80, 69, 82, 72, 69, 82, 79, 128, 83, 85, 80, 69, - 82, 70, 73, 88, 69, 196, 83, 85, 80, 69, 210, 83, 85, 80, 128, 83, 85, - 79, 88, 128, 83, 85, 79, 80, 128, 83, 85, 79, 128, 83, 85, 78, 83, 69, - 212, 83, 85, 78, 82, 73, 83, 69, 128, 83, 85, 78, 82, 73, 83, 197, 83, - 85, 78, 71, 76, 65, 83, 83, 69, 83, 128, 83, 85, 78, 71, 128, 83, 85, 78, - 70, 76, 79, 87, 69, 82, 128, 83, 85, 78, 68, 65, 78, 69, 83, 197, 83, 85, - 78, 128, 83, 85, 206, 83, 85, 77, 77, 69, 82, 128, 83, 85, 77, 77, 65, - 84, 73, 79, 78, 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 83, 85, 77, 65, - 83, 72, 128, 83, 85, 77, 128, 83, 85, 76, 70, 85, 82, 128, 83, 85, 75, - 85, 78, 128, 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83, 85, 75, 213, - 83, 85, 73, 84, 65, 66, 76, 69, 128, 83, 85, 73, 212, 83, 85, 72, 85, 82, - 128, 83, 85, 69, 128, 83, 85, 68, 50, 128, 83, 85, 68, 128, 83, 85, 67, - 75, 73, 78, 199, 83, 85, 67, 75, 69, 68, 128, 83, 85, 67, 203, 83, 85, - 67, 67, 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, 67, - 67, 69, 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, 73, - 84, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, - 84, 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, - 85, 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, - 73, 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, - 73, 78, 69, 65, 210, 83, 85, 66, 76, 73, 77, 65, 84, 73, 79, 78, 128, 83, - 85, 66, 76, 73, 77, 65, 84, 69, 45, 51, 128, 83, 85, 66, 76, 73, 77, 65, - 84, 69, 45, 50, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 128, 83, 85, 66, - 76, 73, 77, 65, 84, 197, 83, 85, 66, 74, 79, 73, 78, 69, 82, 128, 83, 85, - 66, 74, 79, 73, 78, 69, 196, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, - 73, 84, 79, 128, 83, 85, 66, 71, 82, 79, 85, 80, 128, 83, 85, 66, 71, 82, - 79, 85, 208, 83, 85, 66, 128, 83, 85, 65, 77, 128, 83, 85, 65, 69, 84, - 128, 83, 85, 65, 69, 78, 128, 83, 85, 65, 69, 128, 83, 85, 65, 66, 128, - 83, 85, 65, 128, 83, 85, 45, 56, 128, 83, 85, 45, 55, 128, 83, 85, 45, - 54, 128, 83, 85, 45, 53, 128, 83, 85, 45, 52, 128, 83, 85, 45, 51, 128, - 83, 85, 45, 50, 128, 83, 85, 45, 49, 128, 83, 213, 83, 84, 88, 128, 83, - 84, 87, 65, 128, 83, 84, 85, 80, 65, 128, 83, 84, 85, 70, 70, 69, 196, - 83, 84, 85, 68, 89, 128, 83, 84, 85, 68, 73, 207, 83, 84, 85, 67, 75, 45, - 79, 85, 212, 83, 84, 83, 128, 83, 84, 82, 79, 78, 199, 83, 84, 82, 79, - 75, 69, 83, 128, 83, 84, 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, - 57, 128, 83, 84, 82, 79, 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, - 55, 128, 83, 84, 82, 79, 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, - 53, 128, 83, 84, 82, 79, 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, - 51, 128, 83, 84, 82, 79, 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, - 49, 49, 128, 83, 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, - 69, 45, 49, 128, 83, 84, 82, 79, 75, 197, 83, 84, 82, 73, 80, 69, 128, - 83, 84, 82, 73, 78, 71, 128, 83, 84, 82, 73, 78, 199, 83, 84, 82, 73, 75, - 69, 84, 72, 82, 79, 85, 71, 72, 128, 83, 84, 82, 73, 75, 197, 83, 84, 82, - 73, 68, 69, 128, 83, 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, 69, 84, 67, - 72, 69, 196, 83, 84, 82, 69, 84, 67, 72, 128, 83, 84, 82, 69, 83, 211, - 83, 84, 82, 69, 78, 71, 84, 72, 128, 83, 84, 82, 69, 65, 77, 69, 82, 128, - 83, 84, 82, 65, 87, 66, 69, 82, 82, 89, 128, 83, 84, 82, 65, 87, 128, 83, - 84, 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77, 128, 83, - 84, 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 65, - 73, 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, 83, 128, - 83, 84, 82, 65, 73, 71, 72, 84, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, - 84, 82, 65, 73, 70, 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, - 128, 83, 84, 79, 86, 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, - 87, 65, 84, 67, 72, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, - 80, 80, 65, 71, 69, 128, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, - 79, 78, 69, 128, 83, 84, 79, 67, 75, 128, 83, 84, 79, 67, 203, 83, 84, - 73, 82, 82, 85, 208, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, - 83, 84, 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 73, 67, 75, 73, - 78, 199, 83, 84, 73, 67, 203, 83, 84, 69, 84, 72, 79, 83, 67, 79, 80, 69, + 128, 84, 85, 210, 84, 85, 80, 78, 73, 128, 84, 85, 80, 128, 84, 85, 79, + 88, 128, 84, 85, 79, 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, + 85, 78, 78, 89, 128, 84, 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 66, 76, + 69, 210, 84, 85, 77, 65, 69, 128, 84, 85, 77, 128, 84, 85, 205, 84, 85, + 76, 73, 80, 128, 84, 85, 75, 87, 69, 78, 84, 73, 83, 128, 84, 85, 75, + 128, 84, 85, 71, 82, 73, 203, 84, 85, 71, 50, 128, 84, 85, 71, 178, 84, + 85, 66, 69, 128, 84, 85, 66, 128, 84, 85, 65, 82, 69, 199, 84, 85, 65, + 69, 80, 128, 84, 85, 65, 69, 128, 84, 85, 45, 84, 79, 128, 84, 85, 45, + 52, 128, 84, 85, 45, 51, 128, 84, 85, 45, 50, 128, 84, 85, 45, 49, 128, + 84, 213, 84, 84, 85, 85, 128, 84, 84, 85, 68, 68, 65, 71, 128, 84, 84, + 85, 68, 68, 65, 65, 71, 128, 84, 84, 85, 128, 84, 84, 84, 72, 65, 128, + 84, 84, 84, 65, 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, 128, 84, 84, + 83, 73, 128, 84, 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, 84, 84, 83, + 65, 128, 84, 84, 79, 79, 128, 84, 84, 73, 73, 128, 84, 84, 73, 128, 84, + 84, 72, 87, 69, 128, 84, 84, 72, 85, 128, 84, 84, 72, 79, 79, 128, 84, + 84, 72, 79, 128, 84, 84, 72, 73, 128, 84, 84, 72, 69, 69, 128, 84, 84, + 72, 69, 128, 84, 84, 72, 65, 65, 128, 84, 84, 72, 128, 84, 84, 69, 72, + 69, 72, 128, 84, 84, 69, 72, 69, 200, 84, 84, 69, 72, 128, 84, 84, 69, + 200, 84, 84, 69, 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 84, 84, + 65, 85, 128, 84, 84, 65, 73, 128, 84, 84, 65, 65, 128, 84, 84, 50, 128, + 84, 83, 87, 69, 128, 84, 83, 87, 66, 128, 84, 83, 87, 65, 128, 84, 83, + 86, 128, 84, 83, 83, 69, 128, 84, 83, 83, 65, 128, 84, 83, 79, 214, 84, + 83, 73, 85, 128, 84, 83, 72, 85, 71, 83, 128, 84, 83, 72, 79, 79, 75, + 128, 84, 83, 72, 79, 79, 203, 84, 83, 72, 79, 79, 74, 128, 84, 83, 72, + 69, 83, 128, 84, 83, 72, 69, 71, 128, 84, 83, 72, 69, 199, 84, 83, 72, + 69, 69, 74, 128, 84, 83, 72, 69, 128, 84, 83, 72, 65, 194, 84, 83, 72, + 65, 128, 84, 83, 69, 82, 69, 128, 84, 83, 69, 69, 66, 128, 84, 83, 65, + 68, 73, 128, 84, 83, 65, 68, 201, 84, 83, 65, 66, 128, 84, 83, 65, 65, + 68, 73, 89, 128, 84, 83, 65, 65, 128, 84, 83, 193, 84, 211, 84, 82, 89, + 66, 76, 73, 79, 206, 84, 82, 85, 84, 72, 128, 84, 82, 85, 78, 75, 128, + 84, 82, 85, 78, 67, 65, 84, 69, 196, 84, 82, 85, 77, 80, 69, 84, 128, 84, + 82, 85, 77, 80, 45, 57, 128, 84, 82, 85, 77, 80, 45, 56, 128, 84, 82, 85, + 77, 80, 45, 55, 128, 84, 82, 85, 77, 80, 45, 54, 128, 84, 82, 85, 77, 80, + 45, 53, 128, 84, 82, 85, 77, 80, 45, 52, 128, 84, 82, 85, 77, 80, 45, 51, + 128, 84, 82, 85, 77, 80, 45, 50, 49, 128, 84, 82, 85, 77, 80, 45, 50, 48, + 128, 84, 82, 85, 77, 80, 45, 50, 128, 84, 82, 85, 77, 80, 45, 49, 57, + 128, 84, 82, 85, 77, 80, 45, 49, 56, 128, 84, 82, 85, 77, 80, 45, 49, 55, + 128, 84, 82, 85, 77, 80, 45, 49, 54, 128, 84, 82, 85, 77, 80, 45, 49, 53, + 128, 84, 82, 85, 77, 80, 45, 49, 52, 128, 84, 82, 85, 77, 80, 45, 49, 51, + 128, 84, 82, 85, 77, 80, 45, 49, 50, 128, 84, 82, 85, 77, 80, 45, 49, 49, + 128, 84, 82, 85, 77, 80, 45, 49, 48, 128, 84, 82, 85, 77, 80, 45, 49, + 128, 84, 82, 85, 69, 128, 84, 82, 85, 197, 84, 82, 85, 67, 75, 128, 84, + 82, 79, 80, 73, 67, 65, 204, 84, 82, 79, 80, 72, 89, 128, 84, 82, 79, 77, + 73, 75, 79, 83, 89, 78, 65, 71, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, + 80, 83, 73, 70, 73, 83, 84, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 80, + 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, + 78, 128, 84, 82, 79, 77, 73, 75, 79, 206, 84, 82, 79, 77, 73, 75, 79, 76, + 89, 71, 73, 83, 77, 65, 128, 84, 82, 79, 76, 76, 69, 89, 66, 85, 83, 128, + 84, 82, 79, 76, 76, 69, 89, 128, 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, + 84, 82, 79, 69, 90, 69, 78, 73, 65, 206, 84, 82, 73, 85, 77, 80, 72, 128, + 84, 82, 73, 84, 79, 211, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, + 84, 82, 73, 83, 73, 77, 79, 85, 128, 84, 82, 73, 83, 69, 77, 69, 128, 84, + 82, 73, 80, 79, 68, 128, 84, 82, 73, 80, 76, 73, 128, 84, 82, 73, 80, 76, + 69, 128, 84, 82, 73, 80, 76, 197, 84, 82, 73, 79, 206, 84, 82, 73, 76, + 76, 73, 79, 78, 83, 128, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 73, 71, + 82, 65, 77, 77, 79, 211, 84, 82, 73, 71, 82, 65, 205, 84, 82, 73, 71, 79, + 82, 71, 79, 78, 128, 84, 82, 73, 70, 79, 78, 73, 65, 83, 128, 84, 82, 73, + 70, 79, 76, 73, 65, 84, 197, 84, 82, 73, 68, 69, 78, 84, 128, 84, 82, 73, + 68, 69, 78, 212, 84, 82, 73, 67, 79, 76, 79, 78, 128, 84, 82, 73, 65, 78, + 71, 85, 76, 65, 210, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, 85, 78, + 196, 84, 82, 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, 68, 69, 196, 84, 82, + 73, 65, 78, 71, 76, 69, 128, 84, 82, 73, 65, 78, 71, 76, 197, 84, 82, 73, + 65, 128, 84, 82, 73, 128, 84, 82, 69, 83, 73, 76, 76, 79, 128, 84, 82, + 69, 78, 68, 128, 84, 82, 69, 78, 196, 84, 82, 69, 77, 79, 76, 79, 45, 51, + 128, 84, 82, 69, 77, 79, 76, 79, 45, 50, 128, 84, 82, 69, 77, 79, 76, 79, + 45, 49, 128, 84, 82, 69, 69, 128, 84, 82, 69, 197, 84, 82, 69, 68, 69, + 67, 73, 76, 69, 128, 84, 82, 69, 65, 68, 73, 78, 71, 128, 84, 82, 65, 89, + 128, 84, 82, 65, 86, 69, 76, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 84, + 82, 65, 86, 69, 76, 45, 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 84, 82, + 65, 80, 69, 90, 73, 85, 77, 128, 84, 82, 65, 80, 128, 84, 82, 65, 78, 83, + 86, 69, 82, 83, 65, 204, 84, 82, 65, 78, 83, 80, 79, 83, 73, 84, 73, 79, + 206, 84, 82, 65, 78, 83, 80, 76, 85, 84, 79, 128, 84, 82, 65, 78, 83, 77, + 73, 212, 84, 82, 65, 78, 83, 77, 73, 83, 83, 73, 79, 78, 128, 84, 82, 65, + 78, 83, 77, 73, 83, 83, 73, 79, 206, 84, 82, 65, 77, 87, 65, 89, 128, 84, + 82, 65, 77, 128, 84, 82, 65, 205, 84, 82, 65, 73, 78, 128, 84, 82, 65, + 73, 206, 84, 82, 65, 73, 76, 73, 78, 199, 84, 82, 65, 70, 70, 73, 67, + 128, 84, 82, 65, 70, 70, 73, 195, 84, 82, 65, 68, 73, 84, 73, 79, 78, 65, + 204, 84, 82, 65, 68, 197, 84, 82, 65, 67, 84, 79, 82, 128, 84, 82, 65, + 67, 75, 66, 65, 76, 76, 128, 84, 82, 65, 67, 75, 128, 84, 82, 65, 128, + 84, 82, 128, 84, 79, 88, 128, 84, 79, 87, 69, 82, 128, 84, 79, 87, 65, + 82, 68, 211, 84, 79, 86, 128, 84, 79, 85, 82, 78, 79, 73, 211, 84, 79, + 85, 67, 72, 84, 79, 78, 197, 84, 79, 85, 67, 72, 73, 78, 199, 84, 79, 85, + 67, 72, 69, 211, 84, 79, 85, 67, 200, 84, 79, 84, 65, 204, 84, 79, 84, + 128, 84, 79, 83, 128, 84, 79, 82, 84, 79, 73, 83, 197, 84, 79, 82, 83, + 79, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 84, 79, 82, 83, 79, 45, 70, + 76, 79, 79, 82, 80, 76, 65, 78, 197, 84, 79, 82, 83, 79, 128, 84, 79, 82, + 78, 65, 68, 79, 128, 84, 79, 82, 67, 85, 76, 85, 83, 128, 84, 79, 82, 67, + 85, 76, 85, 211, 84, 79, 82, 67, 72, 128, 84, 79, 81, 128, 84, 79, 80, + 66, 65, 82, 128, 84, 79, 80, 45, 76, 73, 71, 72, 84, 69, 196, 84, 79, 80, + 128, 84, 79, 208, 84, 79, 79, 84, 72, 66, 82, 85, 83, 72, 128, 84, 79, + 79, 84, 72, 128, 84, 79, 79, 78, 128, 84, 79, 79, 76, 66, 79, 88, 128, + 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, 69, 128, 84, 79, 78, 71, 85, + 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45, 86, 128, 84, 79, 78, 69, + 45, 83, 128, 84, 79, 78, 69, 45, 77, 128, 84, 79, 78, 69, 45, 74, 128, + 84, 79, 78, 69, 45, 71, 128, 84, 79, 78, 69, 45, 68, 128, 84, 79, 78, 69, + 45, 66, 128, 84, 79, 78, 69, 45, 56, 128, 84, 79, 78, 69, 45, 55, 128, + 84, 79, 78, 69, 45, 54, 128, 84, 79, 78, 69, 45, 53, 128, 84, 79, 78, 69, + 45, 52, 128, 84, 79, 78, 69, 45, 51, 128, 84, 79, 78, 69, 45, 50, 128, + 84, 79, 78, 69, 45, 49, 128, 84, 79, 78, 69, 128, 84, 79, 78, 65, 204, + 84, 79, 77, 80, 73, 128, 84, 79, 77, 65, 84, 79, 128, 84, 79, 76, 79, 78, + 71, 128, 84, 79, 75, 89, 207, 84, 79, 73, 76, 69, 84, 128, 84, 79, 71, + 69, 84, 72, 69, 82, 128, 84, 79, 68, 207, 84, 79, 65, 78, 68, 65, 75, 72, + 73, 65, 84, 128, 84, 79, 65, 128, 84, 79, 45, 82, 65, 128, 84, 79, 45, + 54, 128, 84, 79, 45, 53, 128, 84, 79, 45, 52, 128, 84, 79, 45, 51, 128, + 84, 79, 45, 50, 128, 84, 79, 45, 49, 128, 84, 78, 128, 84, 76, 86, 128, + 84, 76, 85, 128, 84, 76, 79, 128, 84, 76, 73, 128, 84, 76, 72, 89, 65, + 128, 84, 76, 72, 87, 69, 128, 84, 76, 72, 85, 128, 84, 76, 72, 79, 79, + 128, 84, 76, 72, 79, 128, 84, 76, 72, 73, 128, 84, 76, 72, 69, 69, 128, + 84, 76, 72, 69, 128, 84, 76, 72, 65, 128, 84, 76, 69, 69, 128, 84, 76, + 65, 128, 84, 74, 69, 128, 84, 73, 88, 128, 84, 73, 87, 82, 128, 84, 73, + 87, 78, 128, 84, 73, 87, 65, 218, 84, 73, 84, 85, 65, 69, 80, 128, 84, + 73, 84, 76, 79, 128, 84, 73, 84, 76, 207, 84, 73, 84, 193, 84, 73, 84, + 128, 84, 73, 82, 89, 65, 75, 128, 84, 73, 82, 84, 193, 84, 73, 82, 79, + 78, 73, 65, 206, 84, 73, 82, 72, 85, 84, 193, 84, 73, 82, 69, 196, 84, + 73, 82, 128, 84, 73, 210, 84, 73, 80, 80, 73, 128, 84, 73, 80, 69, 72, + 65, 128, 84, 73, 80, 128, 84, 73, 208, 84, 73, 78, 89, 128, 84, 73, 78, + 217, 84, 73, 78, 78, 69, 128, 84, 73, 78, 67, 84, 85, 82, 69, 128, 84, + 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83, 128, 84, 73, 77, 69, + 210, 84, 73, 77, 69, 128, 84, 73, 76, 84, 73, 78, 71, 128, 84, 73, 76, + 84, 73, 78, 199, 84, 73, 76, 84, 128, 84, 73, 76, 69, 83, 128, 84, 73, + 76, 68, 69, 128, 84, 73, 76, 68, 197, 84, 73, 76, 128, 84, 73, 204, 84, + 73, 75, 69, 85, 84, 45, 84, 72, 73, 69, 85, 84, 72, 128, 84, 73, 75, 69, + 85, 84, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, + 69, 85, 84, 45, 83, 73, 79, 83, 128, 84, 73, 75, 69, 85, 84, 45, 82, 73, + 69, 85, 76, 128, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 84, + 73, 75, 69, 85, 84, 45, 77, 73, 69, 85, 77, 128, 84, 73, 75, 69, 85, 84, + 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 67, 73, 69, + 85, 67, 128, 84, 73, 75, 69, 85, 84, 45, 67, 72, 73, 69, 85, 67, 72, 128, + 84, 73, 75, 69, 85, 84, 128, 84, 73, 75, 69, 85, 212, 84, 73, 71, 72, 84, + 76, 89, 45, 67, 76, 79, 83, 69, 196, 84, 73, 71, 72, 212, 84, 73, 71, 69, + 82, 128, 84, 73, 71, 69, 210, 84, 73, 70, 73, 78, 65, 71, 200, 84, 73, + 69, 88, 128, 84, 73, 69, 80, 128, 84, 73, 197, 84, 73, 67, 75, 69, 84, + 83, 128, 84, 73, 67, 75, 69, 84, 128, 84, 73, 67, 75, 128, 84, 73, 67, + 203, 84, 73, 65, 82, 65, 128, 84, 73, 50, 128, 84, 73, 45, 55, 128, 84, + 73, 45, 54, 128, 84, 73, 45, 53, 128, 84, 73, 45, 52, 128, 84, 73, 45, + 51, 128, 84, 73, 45, 50, 128, 84, 73, 45, 49, 128, 84, 72, 90, 128, 84, + 72, 89, 79, 79, 205, 84, 72, 87, 79, 79, 128, 84, 72, 87, 79, 128, 84, + 72, 87, 73, 73, 128, 84, 72, 87, 73, 128, 84, 72, 87, 69, 69, 128, 84, + 72, 87, 65, 65, 128, 84, 72, 87, 65, 128, 84, 72, 85, 82, 211, 84, 72, + 85, 82, 73, 83, 65, 218, 84, 72, 85, 78, 71, 128, 84, 72, 85, 78, 68, 69, + 82, 83, 84, 79, 82, 77, 128, 84, 72, 85, 78, 68, 69, 82, 128, 84, 72, 85, + 78, 68, 69, 210, 84, 72, 85, 77, 66, 211, 84, 72, 85, 77, 66, 128, 84, + 72, 82, 79, 87, 73, 78, 199, 84, 72, 82, 79, 85, 71, 72, 128, 84, 72, 82, + 79, 85, 71, 200, 84, 72, 82, 69, 69, 45, 84, 72, 73, 82, 84, 89, 128, 84, + 72, 82, 69, 69, 45, 81, 85, 65, 82, 84, 69, 210, 84, 72, 82, 69, 69, 45, + 80, 69, 82, 45, 69, 205, 84, 72, 82, 69, 69, 45, 76, 73, 78, 197, 84, 72, + 82, 69, 69, 45, 76, 69, 71, 71, 69, 196, 84, 72, 82, 69, 69, 45, 72, 85, + 78, 68, 82, 69, 68, 45, 65, 78, 68, 45, 84, 87, 69, 78, 84, 73, 69, 84, + 72, 128, 84, 72, 82, 69, 69, 45, 69, 205, 84, 72, 82, 69, 69, 45, 68, 79, + 212, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 69, 45, 67, 73, 82, 67, + 76, 197, 84, 72, 82, 69, 65, 68, 128, 84, 72, 79, 85, 83, 65, 78, 68, 83, + 128, 84, 72, 79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, 83, 65, 78, + 196, 84, 72, 79, 85, 71, 72, 212, 84, 72, 79, 85, 128, 84, 72, 79, 82, + 78, 128, 84, 72, 79, 82, 206, 84, 72, 79, 78, 71, 128, 84, 72, 79, 78, + 199, 84, 72, 79, 77, 128, 84, 72, 79, 74, 128, 84, 72, 79, 65, 128, 84, + 72, 207, 84, 72, 73, 85, 84, 72, 128, 84, 72, 73, 84, 65, 128, 84, 72, + 73, 82, 84, 89, 45, 83, 69, 67, 79, 78, 68, 128, 84, 72, 73, 82, 84, 89, + 45, 83, 69, 67, 79, 78, 196, 84, 72, 73, 82, 84, 89, 45, 79, 78, 69, 128, + 84, 72, 73, 82, 84, 89, 45, 70, 73, 86, 197, 84, 72, 73, 82, 84, 217, 84, + 72, 73, 82, 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, 206, 84, 72, + 73, 82, 68, 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 82, 68, 45, 83, + 84, 65, 71, 197, 84, 72, 73, 82, 68, 128, 84, 72, 73, 82, 196, 84, 72, + 73, 78, 75, 73, 78, 199, 84, 72, 73, 78, 71, 128, 84, 72, 73, 73, 128, + 84, 72, 73, 71, 72, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, 73, 67, + 203, 84, 72, 73, 65, 66, 128, 84, 72, 69, 89, 128, 84, 72, 69, 84, 72, + 69, 128, 84, 72, 69, 84, 72, 128, 84, 72, 69, 84, 65, 128, 84, 72, 69, + 84, 193, 84, 72, 69, 83, 80, 73, 65, 206, 84, 72, 69, 83, 69, 79, 83, + 128, 84, 72, 69, 83, 69, 79, 211, 84, 72, 69, 211, 84, 72, 69, 82, 77, + 79, 77, 69, 84, 69, 82, 128, 84, 72, 69, 82, 77, 79, 68, 89, 78, 65, 77, + 73, 67, 128, 84, 72, 69, 82, 69, 70, 79, 82, 69, 128, 84, 72, 69, 82, + 197, 84, 72, 69, 206, 84, 72, 69, 77, 65, 84, 73, 83, 77, 79, 211, 84, + 72, 69, 77, 65, 128, 84, 72, 69, 77, 193, 84, 72, 69, 72, 128, 84, 72, + 69, 200, 84, 72, 69, 65, 128, 84, 72, 197, 84, 72, 65, 87, 128, 84, 72, + 65, 78, 84, 72, 65, 75, 72, 65, 84, 128, 84, 72, 65, 78, 78, 65, 128, 84, + 72, 65, 78, 128, 84, 72, 65, 206, 84, 72, 65, 77, 69, 68, 72, 128, 84, + 72, 65, 76, 128, 84, 72, 65, 204, 84, 72, 65, 74, 128, 84, 72, 65, 201, + 84, 72, 65, 72, 65, 78, 128, 84, 72, 65, 65, 78, 193, 84, 72, 65, 65, 76, + 85, 128, 84, 72, 45, 67, 82, 69, 197, 84, 69, 88, 84, 128, 84, 69, 88, + 212, 84, 69, 88, 128, 84, 69, 86, 73, 82, 128, 84, 69, 85, 84, 69, 85, + 88, 128, 84, 69, 85, 84, 69, 85, 87, 69, 78, 128, 84, 69, 85, 84, 128, + 84, 69, 85, 78, 128, 84, 69, 85, 65, 69, 81, 128, 84, 69, 85, 65, 69, 78, + 128, 84, 69, 85, 128, 84, 69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, + 69, 84, 82, 65, 83, 69, 77, 69, 128, 84, 69, 84, 82, 65, 80, 76, 73, 128, + 84, 69, 84, 82, 65, 71, 82, 65, 205, 84, 69, 84, 82, 65, 70, 79, 78, 73, + 65, 83, 128, 84, 69, 84, 72, 128, 84, 69, 84, 200, 84, 69, 84, 65, 82, + 84, 79, 211, 84, 69, 84, 65, 82, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, + 69, 84, 128, 84, 69, 212, 84, 69, 83, 212, 84, 69, 83, 83, 69, 82, 65, + 128, 84, 69, 83, 83, 69, 82, 193, 84, 69, 83, 83, 65, 82, 79, 206, 84, + 69, 83, 200, 84, 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 69, 82, 77, + 73, 78, 65, 204, 84, 69, 80, 128, 84, 69, 78, 85, 84, 79, 128, 84, 69, + 78, 85, 128, 84, 69, 78, 213, 84, 69, 78, 84, 72, 128, 84, 69, 78, 84, + 128, 84, 69, 78, 83, 69, 128, 84, 69, 78, 83, 197, 84, 69, 78, 83, 128, + 84, 69, 78, 211, 84, 69, 78, 78, 73, 211, 84, 69, 78, 71, 197, 84, 69, + 78, 45, 84, 72, 73, 82, 84, 89, 128, 84, 69, 78, 128, 84, 69, 206, 84, + 69, 77, 80, 85, 211, 84, 69, 77, 80, 76, 69, 128, 84, 69, 76, 85, 71, + 213, 84, 69, 76, 85, 128, 84, 69, 76, 79, 85, 211, 84, 69, 76, 76, 69, + 210, 84, 69, 76, 73, 83, 72, 193, 84, 69, 76, 69, 86, 73, 83, 73, 79, 78, + 128, 84, 69, 76, 69, 83, 67, 79, 80, 69, 128, 84, 69, 76, 69, 80, 72, 79, + 78, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, 197, 84, 69, 76, 69, 73, 65, + 128, 84, 69, 76, 69, 71, 82, 65, 80, 200, 84, 69, 75, 128, 84, 69, 73, + 87, 83, 128, 84, 69, 71, 69, 72, 128, 84, 69, 69, 84, 72, 128, 84, 69, + 69, 84, 200, 84, 69, 69, 78, 83, 128, 84, 69, 69, 69, 69, 128, 84, 69, + 197, 84, 69, 68, 85, 78, 71, 128, 84, 69, 68, 68, 217, 84, 69, 65, 82, + 211, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 80, 79, 75, 69, 196, 84, 69, + 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, 75, 69, 196, 84, 69, 65, 82, + 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, 84, 69, 65, 82, 45, 79, 70, + 198, 84, 69, 65, 82, 128, 84, 69, 65, 80, 79, 84, 128, 84, 69, 65, 67, + 85, 208, 84, 69, 65, 128, 84, 69, 45, 85, 128, 84, 69, 45, 57, 128, 84, + 69, 45, 56, 128, 84, 69, 45, 55, 128, 84, 69, 45, 54, 128, 84, 69, 45, + 53, 128, 84, 69, 45, 52, 128, 84, 69, 45, 51, 128, 84, 69, 45, 50, 128, + 84, 69, 45, 49, 128, 84, 67, 72, 69, 72, 69, 72, 128, 84, 67, 72, 69, 72, + 69, 200, 84, 67, 72, 69, 72, 128, 84, 67, 72, 69, 200, 84, 67, 72, 69, + 128, 84, 195, 84, 65, 89, 128, 84, 65, 88, 73, 128, 84, 65, 88, 128, 84, + 65, 87, 69, 76, 76, 69, 77, 69, 212, 84, 65, 87, 65, 128, 84, 65, 87, + 128, 84, 65, 215, 84, 65, 86, 73, 89, 65, 78, 73, 128, 84, 65, 86, 128, + 84, 65, 214, 84, 65, 85, 82, 85, 83, 128, 84, 65, 85, 77, 128, 84, 65, + 213, 84, 65, 84, 87, 69, 69, 76, 128, 84, 65, 84, 87, 69, 69, 204, 84, + 65, 84, 84, 79, 79, 69, 196, 84, 65, 84, 128, 84, 65, 83, 83, 73, 128, + 84, 65, 83, 128, 84, 65, 82, 85, 78, 71, 128, 84, 65, 82, 84, 65, 82, 45, + 50, 128, 84, 65, 82, 84, 65, 82, 128, 84, 65, 82, 71, 69, 84, 128, 84, + 65, 81, 128, 84, 65, 80, 69, 82, 128, 84, 65, 80, 197, 84, 65, 80, 128, + 84, 65, 79, 128, 84, 65, 78, 78, 69, 196, 84, 65, 78, 71, 69, 82, 73, 78, + 69, 128, 84, 65, 78, 71, 69, 78, 84, 128, 84, 65, 78, 71, 69, 78, 212, + 84, 65, 78, 199, 84, 65, 78, 65, 66, 65, 84, 193, 84, 65, 78, 65, 128, + 84, 65, 78, 128, 84, 65, 77, 73, 78, 71, 128, 84, 65, 77, 65, 206, 84, + 65, 77, 65, 76, 69, 128, 84, 65, 77, 128, 84, 65, 76, 76, 217, 84, 65, + 76, 76, 128, 84, 65, 76, 204, 84, 65, 76, 73, 78, 71, 128, 84, 65, 76, + 73, 78, 199, 84, 65, 76, 69, 78, 84, 83, 128, 84, 65, 76, 69, 78, 212, + 84, 65, 75, 82, 201, 84, 65, 75, 72, 65, 76, 76, 85, 83, 128, 84, 65, 75, + 69, 79, 85, 212, 84, 65, 75, 69, 128, 84, 65, 75, 52, 128, 84, 65, 75, + 180, 84, 65, 75, 128, 84, 65, 73, 83, 89, 79, 85, 128, 84, 65, 73, 76, + 76, 69, 83, 211, 84, 65, 73, 76, 128, 84, 65, 73, 204, 84, 65, 72, 65, + 76, 65, 128, 84, 65, 72, 128, 84, 65, 200, 84, 65, 71, 66, 65, 78, 87, + 193, 84, 65, 71, 65, 76, 79, 199, 84, 65, 71, 128, 84, 65, 69, 206, 84, + 65, 67, 79, 128, 84, 65, 67, 75, 128, 84, 65, 67, 203, 84, 65, 66, 85, + 76, 65, 84, 73, 79, 78, 128, 84, 65, 66, 85, 76, 65, 84, 73, 79, 206, 84, + 65, 66, 83, 128, 84, 65, 66, 76, 69, 128, 84, 65, 66, 76, 197, 84, 65, + 66, 128, 84, 65, 194, 84, 65, 65, 83, 72, 65, 69, 128, 84, 65, 65, 81, + 128, 84, 65, 65, 77, 128, 84, 65, 65, 76, 85, 74, 193, 84, 65, 65, 73, + 128, 84, 65, 65, 70, 128, 84, 65, 50, 128, 84, 65, 45, 82, 79, 76, 128, + 84, 65, 45, 52, 128, 84, 65, 45, 51, 128, 84, 65, 45, 50, 128, 84, 65, + 45, 49, 128, 84, 48, 51, 54, 128, 84, 48, 51, 53, 128, 84, 48, 51, 52, + 128, 84, 48, 51, 51, 65, 128, 84, 48, 51, 51, 128, 84, 48, 51, 50, 65, + 128, 84, 48, 51, 50, 128, 84, 48, 51, 49, 128, 84, 48, 51, 48, 128, 84, + 48, 50, 57, 128, 84, 48, 50, 56, 128, 84, 48, 50, 55, 128, 84, 48, 50, + 54, 128, 84, 48, 50, 53, 128, 84, 48, 50, 52, 128, 84, 48, 50, 51, 128, + 84, 48, 50, 50, 128, 84, 48, 50, 49, 128, 84, 48, 50, 48, 128, 84, 48, + 49, 57, 128, 84, 48, 49, 56, 128, 84, 48, 49, 55, 128, 84, 48, 49, 54, + 65, 128, 84, 48, 49, 54, 128, 84, 48, 49, 53, 128, 84, 48, 49, 52, 128, + 84, 48, 49, 51, 128, 84, 48, 49, 50, 128, 84, 48, 49, 49, 65, 128, 84, + 48, 49, 49, 128, 84, 48, 49, 48, 128, 84, 48, 48, 57, 65, 128, 84, 48, + 48, 57, 128, 84, 48, 48, 56, 65, 128, 84, 48, 48, 56, 128, 84, 48, 48, + 55, 65, 128, 84, 48, 48, 55, 128, 84, 48, 48, 54, 128, 84, 48, 48, 53, + 128, 84, 48, 48, 52, 128, 84, 48, 48, 51, 65, 128, 84, 48, 48, 51, 128, + 84, 48, 48, 50, 128, 84, 48, 48, 49, 128, 84, 45, 83, 72, 73, 82, 84, + 128, 84, 45, 82, 69, 88, 128, 83, 90, 90, 128, 83, 90, 87, 71, 128, 83, + 90, 87, 65, 128, 83, 90, 85, 128, 83, 90, 79, 128, 83, 90, 73, 128, 83, + 90, 69, 69, 128, 83, 90, 69, 128, 83, 90, 65, 65, 128, 83, 90, 65, 128, + 83, 90, 128, 83, 89, 88, 128, 83, 89, 84, 128, 83, 89, 83, 84, 69, 205, + 83, 89, 82, 88, 128, 83, 89, 82, 77, 65, 84, 73, 75, 73, 128, 83, 89, 82, + 77, 65, 128, 83, 89, 82, 73, 78, 71, 69, 128, 83, 89, 82, 73, 65, 195, + 83, 89, 82, 128, 83, 89, 80, 128, 83, 89, 79, 85, 87, 65, 128, 83, 89, + 78, 69, 86, 77, 65, 128, 83, 89, 78, 68, 69, 83, 77, 79, 211, 83, 89, 78, + 67, 72, 82, 79, 78, 79, 85, 211, 83, 89, 78, 65, 71, 79, 71, 85, 69, 128, + 83, 89, 78, 65, 71, 77, 193, 83, 89, 78, 65, 70, 73, 128, 83, 89, 78, + 128, 83, 89, 77, 77, 69, 84, 82, 89, 128, 83, 89, 77, 77, 69, 84, 82, 73, + 195, 83, 89, 77, 66, 79, 76, 83, 128, 83, 89, 77, 66, 79, 76, 211, 83, + 89, 77, 66, 79, 76, 45, 57, 128, 83, 89, 77, 66, 79, 76, 45, 56, 128, 83, + 89, 77, 66, 79, 76, 45, 55, 128, 83, 89, 77, 66, 79, 76, 45, 54, 128, 83, + 89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, 45, 53, 51, + 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, 79, 76, 45, + 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, 66, 79, + 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, 89, 77, 66, + 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, 128, 83, 89, + 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 51, 128, + 83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, 45, 52, + 48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, 79, 76, 45, + 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, 66, 79, + 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, 89, 77, + 66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, 128, 83, + 89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, 50, 57, 128, + 83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, 45, 50, + 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, 79, 76, + 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, 77, 66, + 79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, 128, 83, 89, + 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, 50, 128, 83, + 89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, 49, 56, + 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, 79, 76, 45, + 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, 66, 79, + 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, 89, 77, + 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, 128, 83, + 89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, 45, 49, 128, + 83, 89, 76, 79, 84, 201, 83, 89, 73, 128, 83, 89, 128, 83, 87, 90, 128, + 83, 87, 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, 82, 68, + 128, 83, 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 82, 204, 83, 87, + 73, 77, 83, 85, 73, 84, 128, 83, 87, 73, 77, 77, 73, 78, 71, 128, 83, 87, + 73, 77, 77, 69, 82, 128, 83, 87, 73, 73, 128, 83, 87, 73, 128, 83, 87, + 71, 128, 83, 87, 69, 69, 84, 128, 83, 87, 69, 69, 212, 83, 87, 69, 65, + 84, 128, 83, 87, 69, 65, 212, 83, 87, 65, 83, 200, 83, 87, 65, 80, 80, + 73, 78, 71, 128, 83, 87, 65, 78, 128, 83, 87, 65, 65, 128, 83, 87, 128, + 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65, 128, 83, 86, 65, 82, + 73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83, 85, 84, 82, 193, 83, + 85, 84, 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, 85, 83, 72, 73, + 128, 83, 85, 82, 89, 65, 128, 83, 85, 82, 88, 128, 83, 85, 82, 82, 79, + 85, 78, 68, 128, 83, 85, 82, 82, 79, 85, 78, 196, 83, 85, 82, 70, 69, 82, + 128, 83, 85, 82, 70, 65, 67, 197, 83, 85, 82, 69, 128, 83, 85, 82, 65, + 78, 71, 128, 83, 85, 82, 57, 128, 83, 85, 82, 128, 83, 85, 210, 83, 85, + 80, 82, 65, 76, 73, 78, 69, 65, 210, 83, 85, 80, 69, 82, 86, 73, 83, 69, + 128, 83, 85, 80, 69, 82, 86, 73, 76, 76, 65, 73, 78, 128, 83, 85, 80, 69, + 82, 83, 69, 84, 128, 83, 85, 80, 69, 82, 83, 69, 212, 83, 85, 80, 69, 82, + 83, 67, 82, 73, 80, 212, 83, 85, 80, 69, 82, 73, 77, 80, 79, 83, 69, 196, + 83, 85, 80, 69, 82, 72, 69, 82, 79, 128, 83, 85, 80, 69, 82, 70, 73, 88, + 69, 196, 83, 85, 80, 69, 210, 83, 85, 80, 128, 83, 85, 79, 88, 128, 83, + 85, 79, 80, 128, 83, 85, 79, 128, 83, 85, 78, 83, 69, 212, 83, 85, 78, + 82, 73, 83, 69, 128, 83, 85, 78, 82, 73, 83, 197, 83, 85, 78, 71, 76, 65, + 83, 83, 69, 83, 128, 83, 85, 78, 71, 128, 83, 85, 78, 70, 76, 79, 87, 69, + 82, 128, 83, 85, 78, 68, 65, 78, 69, 83, 197, 83, 85, 78, 128, 83, 85, + 206, 83, 85, 77, 77, 69, 82, 128, 83, 85, 77, 77, 65, 84, 73, 79, 78, + 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 83, 85, 77, 65, 83, 72, 128, + 83, 85, 77, 128, 83, 85, 76, 70, 85, 82, 128, 83, 85, 75, 85, 78, 128, + 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83, 85, 75, 213, 83, 85, 73, + 84, 65, 66, 76, 69, 128, 83, 85, 73, 212, 83, 85, 72, 85, 82, 128, 83, + 85, 69, 128, 83, 85, 68, 50, 128, 83, 85, 68, 128, 83, 85, 67, 75, 73, + 78, 199, 83, 85, 67, 75, 69, 68, 128, 83, 85, 67, 203, 83, 85, 67, 67, + 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, 67, 67, 69, + 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, 73, 84, + 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, 84, + 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, 85, + 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, 73, + 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, 73, + 78, 69, 65, 210, 83, 85, 66, 76, 73, 77, 65, 84, 73, 79, 78, 128, 83, 85, + 66, 76, 73, 77, 65, 84, 69, 45, 51, 128, 83, 85, 66, 76, 73, 77, 65, 84, + 69, 45, 50, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 128, 83, 85, 66, 76, + 73, 77, 65, 84, 197, 83, 85, 66, 74, 79, 73, 78, 69, 82, 128, 83, 85, 66, + 74, 79, 73, 78, 69, 196, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, 73, + 84, 79, 128, 83, 85, 66, 71, 82, 79, 85, 80, 128, 83, 85, 66, 71, 82, 79, + 85, 208, 83, 85, 66, 128, 83, 85, 65, 77, 128, 83, 85, 65, 69, 84, 128, + 83, 85, 65, 69, 78, 128, 83, 85, 65, 69, 128, 83, 85, 65, 66, 128, 83, + 85, 65, 128, 83, 85, 45, 56, 128, 83, 85, 45, 55, 128, 83, 85, 45, 54, + 128, 83, 85, 45, 53, 128, 83, 85, 45, 52, 128, 83, 85, 45, 51, 128, 83, + 85, 45, 50, 128, 83, 85, 45, 49, 128, 83, 213, 83, 84, 88, 128, 83, 84, + 87, 65, 128, 83, 84, 85, 80, 65, 128, 83, 84, 85, 70, 70, 69, 196, 83, + 84, 85, 68, 89, 128, 83, 84, 85, 68, 73, 207, 83, 84, 85, 67, 75, 45, 79, + 85, 212, 83, 84, 83, 128, 83, 84, 82, 79, 78, 199, 83, 84, 82, 79, 75, + 69, 83, 128, 83, 84, 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, 57, + 128, 83, 84, 82, 79, 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, 55, + 128, 83, 84, 82, 79, 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, 53, + 128, 83, 84, 82, 79, 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, 51, + 128, 83, 84, 82, 79, 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, 49, + 49, 128, 83, 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, 69, + 45, 49, 128, 83, 84, 82, 79, 75, 197, 83, 84, 82, 73, 80, 69, 128, 83, + 84, 82, 73, 78, 71, 128, 83, 84, 82, 73, 78, 199, 83, 84, 82, 73, 75, 69, + 84, 72, 82, 79, 85, 71, 72, 128, 83, 84, 82, 73, 75, 197, 83, 84, 82, 73, + 68, 69, 128, 83, 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, 69, 84, 67, 72, + 69, 196, 83, 84, 82, 69, 84, 67, 72, 128, 83, 84, 82, 69, 83, 211, 83, + 84, 82, 69, 78, 71, 84, 72, 128, 83, 84, 82, 69, 65, 77, 69, 82, 128, 83, + 84, 82, 65, 87, 66, 69, 82, 82, 89, 128, 83, 84, 82, 65, 87, 128, 83, 84, + 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77, 128, 83, 84, + 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 65, 73, + 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, 83, 128, 83, + 84, 82, 65, 73, 71, 72, 84, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, 84, + 82, 65, 73, 70, 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, + 83, 84, 79, 86, 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, 87, 65, + 84, 67, 72, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, 80, 80, + 65, 71, 69, 128, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, 79, 78, + 69, 128, 83, 84, 79, 67, 75, 128, 83, 84, 79, 67, 203, 83, 84, 73, 82, + 82, 85, 208, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, 83, 84, + 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 73, 67, 75, 73, 78, + 199, 83, 84, 73, 67, 203, 83, 84, 69, 84, 72, 79, 83, 67, 79, 80, 69, 128, 83, 84, 69, 82, 69, 79, 128, 83, 84, 69, 80, 128, 83, 84, 69, 78, 79, 71, 82, 65, 80, 72, 73, 195, 83, 84, 69, 77, 128, 83, 84, 69, 65, 77, 217, 83, 84, 69, 65, 77, 73, 78, 199, 83, 84, 69, 65, 77, 128, 83, 84, @@ -1080,95 +1084,136 @@ static const unsigned char lexicon[] = { 69, 45, 83, 72, 73, 70, 84, 45, 51, 128, 83, 73, 78, 71, 76, 69, 45, 83, 72, 73, 70, 84, 45, 50, 128, 83, 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, 83, 73, 78, 71, 76, 69, 128, 83, 73, 78, 71, 76, 197, 83, 73, 78, 71, 65, - 65, 84, 128, 83, 73, 78, 197, 83, 73, 78, 68, 72, 201, 83, 73, 206, 83, - 73, 77, 85, 76, 84, 65, 78, 69, 79, 85, 83, 128, 83, 73, 77, 85, 76, 84, - 65, 78, 69, 79, 85, 211, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 83, 73, - 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65, 210, 83, 73, 77, 65, 78, - 83, 73, 211, 83, 73, 77, 65, 76, 85, 78, 71, 85, 206, 83, 73, 77, 65, - 128, 83, 73, 76, 86, 69, 82, 128, 83, 73, 76, 75, 128, 83, 73, 76, 73, - 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, 84, 84, 69, 128, 83, 73, 76, 72, - 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, 51, 128, 83, 73, 75, 73, 128, - 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 71, 78, 83, 128, 83, 73, - 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, 73, 71, 69, 204, 83, 73, 71, - 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, 83, 73, 69, 69, 128, 83, 73, - 68, 69, 87, 65, 89, 211, 83, 73, 68, 69, 128, 83, 73, 68, 197, 83, 73, - 68, 68, 72, 73, 128, 83, 73, 68, 68, 72, 65, 77, 128, 83, 73, 68, 68, 72, - 65, 205, 83, 73, 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, 75, 76, 69, - 128, 83, 73, 66, 197, 83, 73, 65, 128, 83, 73, 45, 54, 128, 83, 73, 45, - 53, 128, 83, 73, 45, 52, 128, 83, 73, 45, 51, 128, 83, 73, 45, 50, 128, - 83, 73, 45, 49, 128, 83, 201, 83, 72, 89, 88, 128, 83, 72, 89, 84, 128, - 83, 72, 89, 82, 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, 80, 128, 83, - 72, 89, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, 72, 87, 79, - 89, 128, 83, 72, 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, 72, 87, 73, - 73, 128, 83, 72, 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, 87, 197, 83, - 72, 87, 65, 65, 128, 83, 72, 87, 65, 128, 83, 72, 86, 128, 83, 72, 85, - 88, 128, 83, 72, 85, 85, 128, 83, 72, 85, 84, 84, 76, 69, 67, 79, 67, 75, - 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88, 128, 83, 72, 85, 82, 128, - 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128, 83, 72, 85, 79, 80, 128, - 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, 83, 72, 85, 76, 128, 83, 72, - 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, 69, 78, 83, 72, - 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, 65, 78, 71, 88, - 73, 128, 83, 72, 85, 50, 128, 83, 72, 85, 178, 83, 72, 85, 128, 83, 72, - 84, 65, 80, 73, 67, 128, 83, 72, 84, 65, 128, 83, 72, 82, 85, 71, 128, - 83, 72, 82, 73, 78, 69, 128, 83, 72, 82, 73, 77, 80, 128, 83, 72, 82, 73, - 73, 128, 83, 72, 82, 73, 128, 83, 72, 79, 89, 128, 83, 72, 79, 88, 128, - 83, 72, 79, 87, 69, 82, 128, 83, 72, 79, 85, 76, 68, 69, 82, 69, 196, 83, - 72, 79, 85, 76, 68, 69, 210, 83, 72, 79, 85, 128, 83, 72, 79, 84, 128, - 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, 82, 84, 211, 83, 72, 79, 82, 84, - 72, 65, 78, 196, 83, 72, 79, 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 82, - 84, 67, 65, 75, 69, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 89, - 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 84, 89, 210, 83, 72, - 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, 79, 204, 83, 72, 79, 82, 84, 45, - 84, 87, 73, 71, 45, 79, 83, 211, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, - 45, 78, 65, 85, 196, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 77, 65, - 68, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 72, 65, 71, 65, 76, - 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 66, 74, 65, 82, 75, 65, - 206, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 65, 210, 83, 72, 79, 82, - 84, 128, 83, 72, 79, 82, 212, 83, 72, 79, 81, 128, 83, 72, 79, 209, 83, - 72, 79, 80, 80, 73, 78, 199, 83, 72, 79, 80, 128, 83, 72, 79, 79, 84, 73, - 78, 199, 83, 72, 79, 79, 84, 128, 83, 72, 79, 79, 73, 128, 83, 72, 79, - 79, 128, 83, 72, 79, 71, 201, 83, 72, 79, 199, 83, 72, 79, 69, 83, 128, - 83, 72, 79, 69, 128, 83, 72, 79, 197, 83, 72, 79, 67, 75, 69, 196, 83, - 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, 73, 89, 89, 65, 65, 76, 65, 65, - 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, 84, 193, 83, 72, 73, 82, 212, - 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, 82, 128, 83, 72, 73, 210, 83, - 72, 73, 81, 128, 83, 72, 73, 78, 84, 207, 83, 72, 73, 78, 73, 71, 128, - 83, 72, 73, 78, 68, 193, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, - 72, 73, 77, 193, 83, 72, 73, 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, - 78, 128, 83, 72, 73, 73, 128, 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, - 68, 128, 83, 72, 73, 68, 128, 83, 72, 73, 196, 83, 72, 72, 65, 128, 83, - 72, 72, 193, 83, 72, 69, 88, 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, - 85, 88, 128, 83, 72, 69, 85, 79, 81, 128, 83, 72, 69, 85, 65, 69, 81, 84, - 85, 128, 83, 72, 69, 85, 65, 69, 81, 128, 83, 72, 69, 85, 65, 69, 128, - 83, 72, 69, 84, 128, 83, 72, 69, 212, 83, 72, 69, 83, 72, 76, 65, 77, - 128, 83, 72, 69, 83, 72, 73, 71, 128, 83, 72, 69, 83, 72, 73, 199, 83, - 72, 69, 83, 72, 50, 128, 83, 72, 69, 83, 72, 128, 83, 72, 69, 83, 200, - 83, 72, 69, 81, 69, 204, 83, 72, 69, 80, 128, 83, 72, 69, 78, 128, 83, - 72, 69, 76, 76, 128, 83, 72, 69, 76, 204, 83, 72, 69, 76, 70, 128, 83, - 72, 69, 73, 128, 83, 72, 69, 71, 57, 128, 83, 72, 69, 69, 80, 128, 83, - 72, 69, 69, 78, 85, 128, 83, 72, 69, 69, 78, 128, 83, 72, 69, 69, 206, - 83, 72, 69, 69, 128, 83, 72, 69, 45, 71, 79, 65, 84, 128, 83, 72, 197, - 83, 72, 67, 72, 79, 79, 73, 128, 83, 72, 67, 72, 65, 128, 83, 72, 65, 89, - 128, 83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, 128, 83, - 72, 65, 86, 73, 65, 206, 83, 72, 65, 86, 69, 196, 83, 72, 65, 85, 128, - 83, 72, 65, 84, 128, 83, 72, 65, 82, 85, 128, 83, 72, 65, 82, 213, 83, - 72, 65, 82, 80, 128, 83, 72, 65, 82, 208, 83, 72, 65, 82, 75, 128, 83, - 72, 65, 82, 65, 68, 193, 83, 72, 65, 82, 65, 128, 83, 72, 65, 82, 50, - 128, 83, 72, 65, 82, 178, 83, 72, 65, 80, 73, 78, 71, 128, 83, 72, 65, - 80, 69, 83, 128, 83, 72, 65, 80, 197, 83, 72, 65, 80, 128, 83, 72, 65, - 78, 71, 128, 83, 72, 65, 78, 128, 83, 72, 65, 206, 83, 72, 65, 77, 82, - 79, 67, 75, 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, 84, 128, 83, 72, 65, - 76, 76, 79, 215, 83, 72, 65, 75, 84, 73, 128, 83, 72, 65, 75, 73, 78, 71, - 128, 83, 72, 65, 75, 73, 78, 199, 83, 72, 65, 75, 69, 82, 128, 83, 72, - 65, 75, 128, 83, 72, 65, 73, 128, 83, 72, 65, 70, 84, 128, 83, 72, 65, - 70, 212, 83, 72, 65, 68, 79, 87, 69, 196, 83, 72, 65, 68, 69, 196, 83, - 72, 65, 68, 69, 128, 83, 72, 65, 68, 68, 65, 128, 83, 72, 65, 68, 68, - 193, 83, 72, 65, 68, 128, 83, 72, 65, 196, 83, 72, 65, 66, 54, 128, 83, - 72, 65, 65, 128, 83, 72, 65, 54, 128, 83, 72, 65, 182, 83, 72, 65, 51, - 128, 83, 72, 65, 179, 83, 71, 82, 193, 83, 71, 79, 210, 83, 71, 67, 128, - 83, 71, 65, 215, 83, 71, 65, 194, 83, 71, 128, 83, 69, 89, 75, 128, 83, - 69, 88, 84, 85, 76, 193, 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 88, 84, - 65, 78, 211, 83, 69, 86, 69, 82, 65, 78, 67, 69, 128, 83, 69, 86, 69, 78, + 65, 84, 128, 83, 73, 78, 197, 83, 73, 78, 68, 72, 201, 83, 73, 78, 128, + 83, 73, 206, 83, 73, 77, 85, 76, 84, 65, 78, 69, 79, 85, 83, 128, 83, 73, + 77, 85, 76, 84, 65, 78, 69, 79, 85, 211, 83, 73, 77, 80, 76, 73, 70, 73, + 69, 196, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65, 210, + 83, 73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, 76, 85, 78, 71, 85, 206, + 83, 73, 77, 65, 128, 83, 73, 76, 86, 69, 82, 128, 83, 73, 76, 75, 128, + 83, 73, 76, 73, 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, 84, 84, 69, 128, + 83, 73, 76, 72, 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, 51, 128, 83, 73, + 75, 73, 128, 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 71, 78, 83, + 128, 83, 73, 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, 73, 71, 69, 204, + 83, 73, 71, 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, 83, 73, 69, 69, + 128, 83, 73, 68, 69, 87, 65, 89, 211, 83, 73, 68, 69, 128, 83, 73, 68, + 197, 83, 73, 68, 68, 72, 73, 128, 83, 73, 68, 68, 72, 65, 77, 128, 83, + 73, 68, 68, 72, 65, 205, 83, 73, 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, + 75, 76, 69, 128, 83, 73, 66, 197, 83, 73, 65, 128, 83, 73, 45, 54, 128, + 83, 73, 45, 53, 128, 83, 73, 45, 52, 128, 83, 73, 45, 51, 128, 83, 73, + 45, 50, 128, 83, 73, 45, 49, 128, 83, 201, 83, 72, 89, 88, 128, 83, 72, + 89, 84, 128, 83, 72, 89, 82, 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, + 80, 128, 83, 72, 89, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, + 72, 87, 79, 89, 128, 83, 72, 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, + 72, 87, 73, 73, 128, 83, 72, 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, + 87, 197, 83, 72, 87, 65, 65, 128, 83, 72, 87, 65, 128, 83, 72, 86, 128, + 83, 72, 85, 88, 128, 83, 72, 85, 85, 128, 83, 72, 85, 84, 84, 76, 69, 67, + 79, 67, 75, 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88, 128, 83, 72, + 85, 82, 128, 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128, 83, 72, 85, + 79, 80, 128, 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, 83, 72, 85, 76, + 128, 83, 72, 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, + 69, 78, 83, 72, 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, + 65, 78, 71, 88, 73, 128, 83, 72, 85, 50, 128, 83, 72, 85, 178, 83, 72, + 85, 128, 83, 72, 84, 65, 80, 73, 67, 128, 83, 72, 84, 65, 128, 83, 72, + 82, 85, 71, 128, 83, 72, 82, 73, 78, 69, 128, 83, 72, 82, 73, 77, 80, + 128, 83, 72, 82, 73, 73, 128, 83, 72, 82, 73, 128, 83, 72, 79, 89, 128, + 83, 72, 79, 88, 128, 83, 72, 79, 87, 69, 82, 128, 83, 72, 79, 85, 76, 68, + 69, 82, 69, 196, 83, 72, 79, 85, 76, 68, 69, 210, 83, 72, 79, 85, 128, + 83, 72, 79, 84, 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, 82, 84, + 211, 83, 72, 79, 82, 84, 72, 65, 78, 196, 83, 72, 79, 82, 84, 69, 78, 69, + 82, 128, 83, 72, 79, 82, 84, 67, 65, 75, 69, 128, 83, 72, 79, 82, 84, 45, + 84, 87, 73, 71, 45, 89, 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, + 45, 84, 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, 79, 204, + 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83, 211, 83, 72, 79, 82, + 84, 45, 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 72, 79, 82, 84, 45, 84, + 87, 73, 71, 45, 77, 65, 68, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, + 45, 72, 65, 71, 65, 76, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, + 66, 74, 65, 82, 75, 65, 206, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, + 65, 210, 83, 72, 79, 82, 84, 128, 83, 72, 79, 82, 212, 83, 72, 79, 81, + 128, 83, 72, 79, 209, 83, 72, 79, 80, 80, 73, 78, 199, 83, 72, 79, 80, + 128, 83, 72, 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, 128, 83, 72, + 79, 79, 73, 128, 83, 72, 79, 79, 128, 83, 72, 79, 71, 201, 83, 72, 79, + 199, 83, 72, 79, 69, 83, 128, 83, 72, 79, 69, 128, 83, 72, 79, 197, 83, + 72, 79, 67, 75, 69, 196, 83, 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, + 73, 89, 89, 65, 65, 76, 65, 65, 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, + 84, 193, 83, 72, 73, 82, 212, 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, + 82, 128, 83, 72, 73, 210, 83, 72, 73, 81, 128, 83, 72, 73, 78, 84, 207, + 83, 72, 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, 193, 83, 72, 73, 206, + 83, 72, 73, 77, 65, 128, 83, 72, 73, 77, 193, 83, 72, 73, 77, 128, 83, + 72, 73, 205, 83, 72, 73, 73, 78, 128, 83, 72, 73, 73, 128, 83, 72, 73, + 70, 212, 83, 72, 73, 69, 76, 68, 128, 83, 72, 73, 68, 128, 83, 72, 73, + 196, 83, 72, 72, 65, 128, 83, 72, 72, 193, 83, 72, 69, 88, 128, 83, 72, + 69, 86, 65, 128, 83, 72, 69, 85, 88, 128, 83, 72, 69, 85, 79, 81, 128, + 83, 72, 69, 85, 65, 69, 81, 84, 85, 128, 83, 72, 69, 85, 65, 69, 81, 128, + 83, 72, 69, 85, 65, 69, 128, 83, 72, 69, 84, 128, 83, 72, 69, 212, 83, + 72, 69, 83, 72, 76, 65, 77, 128, 83, 72, 69, 83, 72, 73, 71, 128, 83, 72, + 69, 83, 72, 73, 199, 83, 72, 69, 83, 72, 50, 128, 83, 72, 69, 83, 72, + 128, 83, 72, 69, 83, 200, 83, 72, 69, 81, 69, 204, 83, 72, 69, 80, 128, + 83, 72, 69, 78, 128, 83, 72, 69, 76, 76, 128, 83, 72, 69, 76, 204, 83, + 72, 69, 76, 70, 128, 83, 72, 69, 73, 128, 83, 72, 69, 71, 57, 128, 83, + 72, 69, 69, 80, 128, 83, 72, 69, 69, 78, 85, 128, 83, 72, 69, 69, 78, + 128, 83, 72, 69, 69, 206, 83, 72, 69, 69, 128, 83, 72, 69, 45, 71, 79, + 65, 84, 128, 83, 72, 197, 83, 72, 67, 72, 79, 79, 73, 128, 83, 72, 67, + 72, 65, 128, 83, 72, 65, 89, 128, 83, 72, 65, 88, 128, 83, 72, 65, 86, + 73, 89, 65, 78, 73, 128, 83, 72, 65, 86, 73, 65, 206, 83, 72, 65, 86, 69, + 196, 83, 72, 65, 85, 128, 83, 72, 65, 84, 128, 83, 72, 65, 82, 85, 128, + 83, 72, 65, 82, 213, 83, 72, 65, 82, 80, 128, 83, 72, 65, 82, 208, 83, + 72, 65, 82, 75, 128, 83, 72, 65, 82, 65, 68, 193, 83, 72, 65, 82, 65, + 128, 83, 72, 65, 82, 50, 128, 83, 72, 65, 82, 178, 83, 72, 65, 80, 73, + 78, 71, 128, 83, 72, 65, 80, 69, 83, 128, 83, 72, 65, 80, 197, 83, 72, + 65, 80, 128, 83, 72, 65, 78, 71, 128, 83, 72, 65, 78, 128, 83, 72, 65, + 206, 83, 72, 65, 77, 82, 79, 67, 75, 128, 83, 72, 65, 76, 83, 72, 69, 76, + 69, 84, 128, 83, 72, 65, 76, 76, 79, 215, 83, 72, 65, 75, 84, 73, 128, + 83, 72, 65, 75, 73, 78, 71, 128, 83, 72, 65, 75, 73, 78, 199, 83, 72, 65, + 75, 69, 82, 128, 83, 72, 65, 75, 128, 83, 72, 65, 73, 128, 83, 72, 65, + 70, 84, 128, 83, 72, 65, 70, 212, 83, 72, 65, 68, 79, 87, 69, 196, 83, + 72, 65, 68, 69, 196, 83, 72, 65, 68, 69, 128, 83, 72, 65, 68, 197, 83, + 72, 65, 68, 68, 65, 128, 83, 72, 65, 68, 68, 193, 83, 72, 65, 68, 128, + 83, 72, 65, 196, 83, 72, 65, 66, 54, 128, 83, 72, 65, 65, 128, 83, 72, + 65, 54, 128, 83, 72, 65, 182, 83, 72, 65, 51, 128, 83, 72, 65, 179, 83, + 71, 82, 193, 83, 71, 79, 210, 83, 71, 67, 128, 83, 71, 65, 215, 83, 71, + 65, 194, 83, 71, 128, 83, 69, 89, 75, 128, 83, 69, 88, 84, 85, 76, 193, + 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 88, 84, 65, 78, 84, 45, 54, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, 52, 54, 128, 83, 69, 88, 84, + 65, 78, 84, 45, 52, 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 52, 53, + 128, 83, 69, 88, 84, 65, 78, 84, 45, 52, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 51, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 51, 53, 54, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 51, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, 51, + 52, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 51, 52, 53, 54, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 51, 52, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, + 51, 52, 128, 83, 69, 88, 84, 65, 78, 84, 45, 51, 128, 83, 69, 88, 84, 65, + 78, 84, 45, 50, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 53, 54, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 50, 53, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 50, 52, 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 52, 53, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 50, 52, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 50, 51, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 51, 53, 54, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 50, 51, 53, 128, 83, 69, 88, 84, 65, 78, + 84, 45, 50, 51, 52, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 51, 52, + 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 51, 52, 53, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 50, 51, 52, 128, 83, 69, 88, 84, 65, 78, 84, 45, + 50, 51, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 128, 83, 69, 88, 84, 65, + 78, 84, 45, 49, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 53, 54, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 49, 53, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 49, 52, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 52, 53, 54, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 49, 52, 53, 128, 83, 69, 88, 84, 65, 78, + 84, 45, 49, 52, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 51, 54, 128, 83, + 69, 88, 84, 65, 78, 84, 45, 49, 51, 53, 54, 128, 83, 69, 88, 84, 65, 78, + 84, 45, 49, 51, 52, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 51, 52, + 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 51, 52, 53, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 49, 51, 52, 128, 83, 69, 88, 84, 65, 78, 84, 45, + 49, 51, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 54, 128, 83, 69, 88, + 84, 65, 78, 84, 45, 49, 50, 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, + 49, 50, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 52, 54, 128, 83, + 69, 88, 84, 65, 78, 84, 45, 49, 50, 52, 53, 54, 128, 83, 69, 88, 84, 65, + 78, 84, 45, 49, 50, 52, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, + 52, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 51, 54, 128, 83, 69, 88, + 84, 65, 78, 84, 45, 49, 50, 51, 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 49, 50, 51, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 51, 52, + 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 51, 52, 53, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 49, 50, 51, 52, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 49, 50, 51, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 49, 128, 83, 69, 88, 84, 65, 78, 211, 83, 69, 87, + 73, 78, 199, 83, 69, 86, 69, 82, 65, 78, 67, 69, 128, 83, 69, 86, 69, 78, 84, 89, 128, 83, 69, 86, 69, 78, 84, 217, 83, 69, 86, 69, 78, 84, 72, 128, 83, 69, 86, 69, 78, 84, 69, 69, 78, 128, 83, 69, 86, 69, 78, 84, 69, 69, 206, 83, 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 83, 69, 86, @@ -1372,425 +1417,430 @@ static const unsigned char lexicon[] = { 76, 69, 67, 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 128, 83, 69, 76, 69, 67, 84, 79, 210, 83, 69, 76, 69, 67, 84, 69, 196, 83, 69, 73, 83, 77, 65, 128, 83, 69, 73, 83, 77, 193, 83, 69, 72, 128, 83, 69, - 71, 79, 76, 128, 83, 69, 71, 78, 79, 128, 83, 69, 71, 77, 69, 78, 84, - 128, 83, 69, 69, 86, 128, 83, 69, 69, 78, 85, 128, 83, 69, 69, 78, 128, - 83, 69, 69, 206, 83, 69, 69, 68, 76, 73, 78, 71, 128, 83, 69, 69, 45, 78, - 79, 45, 69, 86, 73, 204, 83, 69, 68, 78, 65, 128, 83, 69, 67, 84, 79, 82, - 128, 83, 69, 67, 84, 73, 79, 78, 128, 83, 69, 67, 84, 73, 79, 206, 83, - 69, 67, 82, 69, 84, 128, 83, 69, 67, 65, 78, 84, 128, 83, 69, 66, 65, 84, - 66, 69, 73, 212, 83, 69, 65, 84, 128, 83, 69, 65, 76, 128, 83, 69, 65, - 71, 85, 76, 204, 83, 69, 45, 53, 128, 83, 69, 45, 52, 128, 83, 69, 45, - 51, 128, 83, 68, 79, 78, 199, 83, 68, 128, 83, 67, 87, 65, 128, 83, 67, - 82, 85, 80, 76, 69, 128, 83, 67, 82, 79, 76, 76, 128, 83, 67, 82, 73, 80, - 84, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 69, 69, 206, 83, 67, - 82, 69, 65, 77, 73, 78, 199, 83, 67, 79, 82, 80, 73, 85, 83, 128, 83, 67, - 79, 82, 80, 73, 79, 78, 128, 83, 67, 79, 82, 69, 128, 83, 67, 79, 79, 84, - 69, 82, 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 67, 73, 128, 83, - 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, 79, 69, 68, 69, - 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 79, 204, 83, 67, - 72, 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, 67, 69, 80, 84, 69, - 210, 83, 67, 65, 82, 70, 128, 83, 67, 65, 78, 68, 73, 67, 85, 83, 128, - 83, 67, 65, 78, 68, 73, 67, 85, 211, 83, 67, 65, 206, 83, 67, 65, 76, 69, - 83, 128, 83, 66, 85, 194, 83, 66, 82, 85, 204, 83, 65, 89, 73, 83, 201, - 83, 65, 89, 65, 78, 78, 65, 128, 83, 65, 89, 128, 83, 65, 88, 79, 80, 72, - 79, 78, 69, 128, 83, 65, 88, 73, 77, 65, 84, 65, 128, 83, 65, 87, 65, 78, - 128, 83, 65, 87, 128, 83, 65, 86, 79, 85, 82, 73, 78, 199, 83, 65, 85, - 82, 79, 80, 79, 68, 128, 83, 65, 85, 82, 65, 83, 72, 84, 82, 193, 83, 65, - 85, 73, 76, 128, 83, 65, 85, 67, 69, 82, 128, 83, 65, 84, 85, 82, 78, - 128, 83, 65, 84, 75, 65, 65, 78, 75, 85, 85, 128, 83, 65, 84, 75, 65, 65, - 78, 128, 83, 65, 84, 69, 76, 76, 73, 84, 69, 128, 83, 65, 84, 69, 76, 76, - 73, 84, 197, 83, 65, 84, 67, 72, 69, 76, 128, 83, 65, 84, 65, 78, 71, 65, - 128, 83, 65, 83, 72, 128, 83, 65, 83, 65, 75, 128, 83, 65, 82, 73, 128, - 83, 65, 82, 193, 83, 65, 82, 128, 83, 65, 81, 128, 83, 65, 80, 65, 128, - 83, 65, 78, 89, 79, 79, 71, 193, 83, 65, 78, 89, 65, 75, 193, 83, 65, 78, - 84, 73, 73, 77, 85, 128, 83, 65, 78, 83, 75, 82, 73, 212, 83, 65, 78, 78, - 89, 65, 128, 83, 65, 78, 71, 65, 50, 128, 83, 65, 78, 68, 87, 73, 67, 72, - 128, 83, 65, 78, 68, 72, 201, 83, 65, 78, 68, 65, 76, 128, 83, 65, 78, - 65, 72, 128, 83, 65, 78, 128, 83, 65, 77, 89, 79, 203, 83, 65, 77, 86, - 65, 84, 128, 83, 65, 77, 80, 73, 128, 83, 65, 77, 80, 72, 65, 79, 128, - 83, 65, 77, 75, 65, 128, 83, 65, 77, 69, 75, 72, 128, 83, 65, 77, 69, 75, - 200, 83, 65, 77, 66, 65, 128, 83, 65, 77, 65, 82, 73, 84, 65, 206, 83, - 65, 77, 128, 83, 65, 76, 84, 73, 82, 69, 128, 83, 65, 76, 84, 73, 76, 76, - 79, 128, 83, 65, 76, 84, 45, 50, 128, 83, 65, 76, 84, 128, 83, 65, 76, - 212, 83, 65, 76, 76, 65, 76, 76, 65, 72, 79, 213, 83, 65, 76, 76, 193, - 83, 65, 76, 65, 205, 83, 65, 76, 65, 68, 128, 83, 65, 76, 65, 128, 83, - 65, 76, 45, 65, 77, 77, 79, 78, 73, 65, 67, 128, 83, 65, 76, 128, 83, 65, - 75, 84, 65, 128, 83, 65, 75, 79, 84, 128, 83, 65, 75, 73, 78, 128, 83, - 65, 75, 72, 193, 83, 65, 75, 69, 85, 65, 69, 128, 83, 65, 75, 197, 83, - 65, 74, 68, 65, 72, 128, 83, 65, 73, 76, 66, 79, 65, 84, 128, 83, 65, 73, - 76, 128, 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 72, 128, 83, 65, 71, - 73, 84, 84, 65, 82, 73, 85, 83, 128, 83, 65, 71, 65, 128, 83, 65, 71, - 128, 83, 65, 199, 83, 65, 70, 72, 65, 128, 83, 65, 70, 69, 84, 217, 83, - 65, 68, 72, 69, 128, 83, 65, 68, 72, 197, 83, 65, 68, 69, 128, 83, 65, - 68, 128, 83, 65, 196, 83, 65, 67, 82, 73, 70, 73, 67, 73, 65, 204, 83, - 65, 65, 73, 128, 83, 65, 65, 68, 72, 85, 128, 83, 65, 45, 73, 128, 83, - 65, 45, 56, 128, 83, 65, 45, 55, 128, 83, 65, 45, 54, 128, 83, 65, 45, - 53, 128, 83, 65, 45, 52, 128, 83, 65, 45, 51, 128, 83, 65, 45, 50, 128, - 83, 65, 45, 49, 128, 83, 48, 52, 54, 128, 83, 48, 52, 53, 128, 83, 48, - 52, 52, 128, 83, 48, 52, 51, 128, 83, 48, 52, 50, 128, 83, 48, 52, 49, - 128, 83, 48, 52, 48, 128, 83, 48, 51, 57, 128, 83, 48, 51, 56, 128, 83, - 48, 51, 55, 128, 83, 48, 51, 54, 128, 83, 48, 51, 53, 65, 128, 83, 48, - 51, 53, 128, 83, 48, 51, 52, 128, 83, 48, 51, 51, 128, 83, 48, 51, 50, - 128, 83, 48, 51, 49, 128, 83, 48, 51, 48, 128, 83, 48, 50, 57, 128, 83, - 48, 50, 56, 128, 83, 48, 50, 55, 128, 83, 48, 50, 54, 66, 128, 83, 48, - 50, 54, 65, 128, 83, 48, 50, 54, 128, 83, 48, 50, 53, 128, 83, 48, 50, - 52, 128, 83, 48, 50, 51, 128, 83, 48, 50, 50, 128, 83, 48, 50, 49, 128, - 83, 48, 50, 48, 128, 83, 48, 49, 57, 128, 83, 48, 49, 56, 128, 83, 48, - 49, 55, 65, 128, 83, 48, 49, 55, 128, 83, 48, 49, 54, 128, 83, 48, 49, - 53, 128, 83, 48, 49, 52, 66, 128, 83, 48, 49, 52, 65, 128, 83, 48, 49, - 52, 128, 83, 48, 49, 51, 128, 83, 48, 49, 50, 128, 83, 48, 49, 49, 128, - 83, 48, 49, 48, 128, 83, 48, 48, 57, 128, 83, 48, 48, 56, 128, 83, 48, - 48, 55, 128, 83, 48, 48, 54, 65, 128, 83, 48, 48, 54, 128, 83, 48, 48, - 53, 128, 83, 48, 48, 52, 128, 83, 48, 48, 51, 128, 83, 48, 48, 50, 65, - 128, 83, 48, 48, 50, 128, 83, 48, 48, 49, 128, 83, 45, 87, 128, 83, 45, - 83, 72, 65, 80, 69, 196, 82, 89, 89, 128, 82, 89, 88, 128, 82, 89, 84, - 128, 82, 89, 82, 88, 128, 82, 89, 82, 128, 82, 89, 80, 128, 82, 87, 79, - 79, 128, 82, 87, 79, 128, 82, 87, 73, 73, 128, 82, 87, 73, 128, 82, 87, - 69, 69, 128, 82, 87, 69, 128, 82, 87, 65, 72, 65, 128, 82, 87, 65, 65, - 128, 82, 87, 65, 128, 82, 85, 88, 128, 82, 85, 85, 66, 85, 82, 85, 128, - 82, 85, 85, 128, 82, 85, 84, 128, 82, 85, 83, 83, 73, 65, 206, 82, 85, - 83, 73, 128, 82, 85, 82, 88, 128, 82, 85, 82, 128, 82, 85, 80, 73, 73, - 128, 82, 85, 80, 69, 197, 82, 85, 80, 128, 82, 85, 79, 88, 128, 82, 85, - 79, 80, 128, 82, 85, 79, 128, 82, 85, 78, 79, 85, 84, 128, 82, 85, 78, - 78, 73, 78, 199, 82, 85, 78, 78, 69, 82, 128, 82, 85, 78, 73, 195, 82, - 85, 78, 128, 82, 85, 77, 201, 82, 85, 77, 65, 201, 82, 85, 77, 128, 82, - 85, 205, 82, 85, 76, 69, 82, 128, 82, 85, 76, 69, 45, 68, 69, 76, 65, 89, - 69, 68, 128, 82, 85, 76, 69, 128, 82, 85, 76, 65, 73, 128, 82, 85, 75, - 75, 65, 75, 72, 65, 128, 82, 85, 73, 83, 128, 82, 85, 71, 66, 217, 82, - 85, 68, 73, 77, 69, 78, 84, 193, 82, 85, 66, 76, 197, 82, 85, 194, 82, - 85, 65, 128, 82, 85, 45, 54, 128, 82, 85, 45, 53, 128, 82, 85, 45, 52, - 128, 82, 85, 45, 51, 128, 82, 85, 45, 50, 128, 82, 85, 45, 49, 128, 82, - 84, 72, 65, 78, 199, 82, 84, 69, 128, 82, 84, 65, 71, 83, 128, 82, 84, - 65, 71, 211, 82, 82, 89, 88, 128, 82, 82, 89, 84, 128, 82, 82, 89, 82, - 88, 128, 82, 82, 89, 82, 128, 82, 82, 89, 80, 128, 82, 82, 85, 88, 128, - 82, 82, 85, 85, 128, 82, 82, 85, 84, 128, 82, 82, 85, 82, 88, 128, 82, - 82, 85, 82, 128, 82, 82, 85, 80, 128, 82, 82, 85, 79, 88, 128, 82, 82, - 85, 79, 128, 82, 82, 85, 128, 82, 82, 82, 65, 128, 82, 82, 79, 88, 128, - 82, 82, 79, 84, 128, 82, 82, 79, 80, 128, 82, 82, 79, 79, 128, 82, 82, - 79, 128, 82, 82, 73, 73, 128, 82, 82, 73, 128, 82, 82, 69, 88, 128, 82, - 82, 69, 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, 72, 128, 82, 82, 69, - 200, 82, 82, 69, 69, 128, 82, 82, 69, 128, 82, 82, 65, 88, 128, 82, 82, - 65, 85, 128, 82, 82, 65, 73, 128, 82, 82, 65, 65, 128, 82, 79, 87, 66, - 79, 65, 84, 128, 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, 68, 45, 84, - 73, 80, 80, 69, 196, 82, 79, 84, 85, 78, 68, 65, 128, 82, 79, 84, 65, 84, - 73, 79, 78, 83, 128, 82, 79, 84, 65, 84, 73, 79, 78, 45, 87, 65, 76, 76, - 80, 76, 65, 78, 197, 82, 79, 84, 65, 84, 73, 79, 78, 45, 70, 76, 79, 79, - 82, 80, 76, 65, 78, 197, 82, 79, 84, 65, 84, 73, 79, 78, 128, 82, 79, 84, - 65, 84, 73, 79, 206, 82, 79, 84, 65, 84, 69, 196, 82, 79, 83, 72, 128, - 82, 79, 83, 69, 84, 84, 69, 128, 82, 79, 83, 69, 128, 82, 79, 79, 84, - 128, 82, 79, 79, 83, 84, 69, 82, 128, 82, 79, 79, 77, 128, 82, 79, 79, - 75, 128, 82, 79, 79, 203, 82, 79, 79, 70, 128, 82, 79, 77, 65, 78, 73, - 65, 206, 82, 79, 77, 65, 206, 82, 79, 77, 128, 82, 79, 76, 76, 73, 78, - 199, 82, 79, 76, 76, 69, 210, 82, 79, 76, 76, 69, 68, 45, 85, 208, 82, - 79, 76, 204, 82, 79, 72, 73, 78, 71, 89, 193, 82, 79, 71, 128, 82, 79, - 196, 82, 79, 67, 75, 69, 84, 128, 82, 79, 67, 203, 82, 79, 67, 128, 82, - 79, 66, 79, 212, 82, 79, 66, 65, 84, 128, 82, 79, 65, 83, 84, 69, 196, - 82, 79, 65, 82, 128, 82, 79, 65, 128, 82, 79, 45, 54, 128, 82, 79, 45, - 53, 128, 82, 79, 45, 52, 128, 82, 79, 45, 51, 128, 82, 79, 45, 50, 128, - 82, 79, 45, 49, 128, 82, 78, 89, 73, 78, 199, 82, 78, 79, 79, 78, 128, - 82, 78, 79, 79, 206, 82, 78, 65, 205, 82, 77, 84, 128, 82, 76, 79, 128, - 82, 76, 77, 128, 82, 76, 73, 128, 82, 76, 69, 128, 82, 74, 69, 211, 82, - 74, 69, 128, 82, 74, 197, 82, 73, 86, 69, 82, 128, 82, 73, 84, 85, 65, - 76, 128, 82, 73, 84, 84, 79, 82, 85, 128, 82, 73, 84, 83, 73, 128, 82, - 73, 83, 73, 78, 199, 82, 73, 83, 72, 128, 82, 73, 82, 65, 128, 82, 73, - 80, 80, 76, 197, 82, 73, 80, 128, 82, 73, 78, 71, 211, 82, 73, 78, 71, - 73, 78, 199, 82, 73, 78, 71, 69, 196, 82, 73, 78, 70, 79, 82, 90, 65, 78, - 68, 79, 128, 82, 73, 206, 82, 73, 77, 71, 66, 65, 128, 82, 73, 77, 128, - 82, 73, 75, 82, 73, 75, 128, 82, 73, 71, 86, 69, 68, 73, 195, 82, 73, 71, - 72, 84, 87, 65, 82, 68, 83, 128, 82, 73, 71, 72, 84, 72, 65, 78, 196, 82, - 73, 71, 72, 84, 45, 84, 79, 45, 76, 69, 70, 212, 82, 73, 71, 72, 84, 45, - 83, 73, 68, 197, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 79, 87, 69, 196, - 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 69, 196, 82, 73, 71, 72, 84, 45, - 80, 79, 73, 78, 84, 73, 78, 199, 82, 73, 71, 72, 84, 45, 76, 73, 71, 72, - 84, 69, 196, 82, 73, 71, 72, 84, 45, 72, 65, 78, 68, 69, 196, 82, 73, 71, - 72, 84, 45, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 70, 65, 67, 73, 78, - 199, 82, 73, 71, 72, 84, 128, 82, 73, 70, 76, 69, 128, 82, 73, 69, 85, - 76, 45, 89, 69, 83, 73, 69, 85, 78, 71, 128, 82, 73, 69, 85, 76, 45, 89, - 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 45, 72, 73, 69, 85, 72, 128, 82, - 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 82, - 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 45, 72, 73, 69, 85, 72, 128, - 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, - 45, 84, 72, 73, 69, 85, 84, 72, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, - 78, 71, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, - 78, 71, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, - 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 75, - 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 83, 73, 79, 83, 128, 82, - 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 84, 73, 75, 69, 85, 84, 128, - 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 82, - 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 80, 72, 73, 69, 85, 80, 72, - 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 72, 73, 69, 85, 72, - 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, - 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 65, 78, - 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 78, 73, 69, 85, 78, 128, 82, - 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 83, 73, 79, 83, 128, 82, 73, - 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 75, 73, 89, 69, 79, 75, 128, 82, - 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 72, 73, 69, 85, 72, 128, 82, - 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 128, 82, 73, 69, 85, 76, 45, 75, - 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 75, - 73, 89, 69, 79, 75, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, - 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 75, 65, 80, 89, 69, - 79, 85, 78, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 72, 73, 69, - 85, 72, 128, 82, 73, 69, 85, 76, 45, 67, 73, 69, 85, 67, 128, 82, 73, 69, - 85, 204, 82, 73, 69, 76, 128, 82, 73, 69, 69, 128, 82, 73, 67, 75, 83, - 72, 65, 87, 128, 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, 128, 82, 73, - 67, 197, 82, 73, 66, 66, 79, 78, 128, 82, 73, 66, 66, 79, 206, 82, 73, - 65, 204, 82, 73, 45, 55, 128, 82, 73, 45, 54, 128, 82, 73, 45, 53, 128, - 82, 73, 45, 52, 128, 82, 73, 45, 51, 128, 82, 73, 45, 50, 128, 82, 73, - 45, 49, 128, 82, 72, 79, 84, 73, 195, 82, 72, 79, 128, 82, 72, 207, 82, - 72, 73, 78, 79, 67, 69, 82, 79, 83, 128, 82, 72, 65, 128, 82, 72, 128, - 82, 71, 89, 73, 78, 71, 83, 128, 82, 71, 89, 65, 78, 128, 82, 71, 89, - 193, 82, 69, 86, 79, 76, 86, 73, 78, 199, 82, 69, 86, 79, 76, 85, 84, 73, - 79, 78, 128, 82, 69, 86, 77, 65, 128, 82, 69, 86, 73, 65, 128, 82, 69, - 86, 69, 82, 83, 69, 68, 45, 83, 67, 72, 87, 65, 128, 82, 69, 86, 69, 82, - 83, 69, 68, 128, 82, 69, 86, 69, 82, 83, 69, 196, 82, 69, 86, 69, 82, 83, - 197, 82, 69, 85, 88, 128, 82, 69, 85, 128, 82, 69, 84, 85, 82, 78, 128, - 82, 69, 84, 85, 82, 206, 82, 69, 84, 82, 79, 70, 76, 69, 216, 82, 69, 84, - 82, 69, 65, 84, 128, 82, 69, 84, 79, 82, 84, 128, 82, 69, 83, 85, 80, 73, - 78, 85, 83, 128, 82, 69, 83, 84, 82, 79, 79, 77, 128, 82, 69, 83, 84, 82, - 73, 67, 84, 69, 196, 82, 69, 83, 84, 128, 82, 69, 83, 80, 79, 78, 83, 69, - 128, 82, 69, 83, 79, 85, 82, 67, 69, 128, 82, 69, 83, 79, 76, 85, 84, 73, - 79, 78, 128, 82, 69, 83, 73, 83, 84, 65, 78, 67, 69, 128, 82, 69, 83, 73, - 68, 69, 78, 67, 69, 128, 82, 69, 83, 72, 45, 65, 89, 73, 78, 45, 68, 65, - 76, 69, 84, 72, 128, 82, 69, 83, 72, 45, 65, 89, 73, 78, 128, 82, 69, 83, - 200, 82, 69, 82, 69, 78, 71, 71, 65, 78, 128, 82, 69, 82, 69, 75, 65, 78, - 128, 82, 69, 80, 82, 69, 83, 69, 78, 84, 128, 82, 69, 80, 76, 65, 67, 69, - 77, 69, 78, 212, 82, 69, 80, 72, 65, 128, 82, 69, 80, 72, 128, 82, 69, - 80, 69, 84, 73, 84, 73, 79, 206, 82, 69, 80, 69, 65, 84, 69, 196, 82, 69, - 80, 69, 65, 84, 128, 82, 69, 80, 69, 65, 212, 82, 69, 80, 65, 89, 65, - 128, 82, 69, 80, 65, 128, 82, 69, 80, 193, 82, 69, 78, 84, 79, 71, 69, - 78, 128, 82, 69, 78, 128, 82, 69, 206, 82, 69, 77, 85, 128, 82, 69, 77, - 73, 78, 68, 69, 210, 82, 69, 77, 69, 68, 89, 128, 82, 69, 76, 73, 71, 73, - 79, 78, 128, 82, 69, 76, 73, 69, 86, 69, 196, 82, 69, 76, 69, 65, 83, 69, - 128, 82, 69, 76, 65, 88, 69, 68, 128, 82, 69, 76, 65, 84, 73, 79, 78, 65, - 204, 82, 69, 76, 65, 84, 73, 79, 78, 128, 82, 69, 76, 65, 65, 128, 82, - 69, 74, 65, 78, 199, 82, 69, 73, 87, 65, 128, 82, 69, 73, 196, 82, 69, - 73, 128, 82, 69, 71, 85, 76, 85, 83, 45, 52, 128, 82, 69, 71, 85, 76, 85, - 83, 45, 51, 128, 82, 69, 71, 85, 76, 85, 83, 45, 50, 128, 82, 69, 71, 85, - 76, 85, 83, 128, 82, 69, 71, 85, 76, 85, 211, 82, 69, 71, 73, 83, 84, 69, - 82, 69, 196, 82, 69, 71, 73, 79, 78, 65, 204, 82, 69, 71, 73, 65, 45, 50, - 128, 82, 69, 71, 73, 65, 128, 82, 69, 70, 79, 82, 77, 69, 196, 82, 69, - 70, 69, 82, 69, 78, 67, 197, 82, 69, 68, 85, 80, 76, 73, 67, 65, 84, 73, - 79, 78, 128, 82, 69, 67, 89, 67, 76, 73, 78, 199, 82, 69, 67, 89, 67, 76, - 69, 196, 82, 69, 67, 84, 73, 76, 73, 78, 69, 65, 210, 82, 69, 67, 84, 65, - 78, 71, 85, 76, 65, 210, 82, 69, 67, 84, 65, 78, 71, 76, 69, 128, 82, 69, - 67, 84, 65, 78, 71, 76, 197, 82, 69, 67, 82, 69, 65, 84, 73, 79, 78, 65, - 204, 82, 69, 67, 79, 82, 68, 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, - 128, 82, 69, 67, 79, 82, 68, 128, 82, 69, 67, 79, 82, 196, 82, 69, 67, - 73, 84, 65, 84, 73, 86, 197, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, - 67, 69, 73, 86, 69, 82, 128, 82, 69, 67, 69, 73, 86, 69, 210, 82, 69, 67, - 69, 73, 80, 84, 128, 82, 69, 65, 76, 71, 65, 82, 45, 50, 128, 82, 69, 65, - 76, 71, 65, 82, 128, 82, 69, 65, 72, 77, 85, 75, 128, 82, 69, 65, 67, 72, - 128, 82, 69, 45, 52, 128, 82, 69, 45, 51, 128, 82, 69, 45, 50, 128, 82, - 69, 45, 49, 128, 82, 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, - 65, 90, 79, 82, 128, 82, 65, 89, 83, 128, 82, 65, 89, 211, 82, 65, 89, - 65, 78, 78, 65, 128, 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, 128, - 82, 65, 84, 72, 193, 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, 83, - 87, 65, 68, 73, 128, 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65, 128, - 82, 65, 81, 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, 197, - 82, 65, 78, 65, 128, 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, 66, - 65, 84, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 75, 65, 65, 82, 65, - 65, 78, 83, 65, 89, 65, 128, 82, 65, 73, 83, 73, 78, 199, 82, 65, 73, 83, - 69, 68, 128, 82, 65, 73, 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, - 82, 65, 73, 76, 87, 65, 89, 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, - 76, 128, 82, 65, 73, 68, 207, 82, 65, 73, 68, 65, 128, 82, 65, 72, 77, - 65, 84, 85, 76, 76, 65, 200, 82, 65, 72, 128, 82, 65, 70, 69, 128, 82, - 65, 69, 77, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, - 73, 79, 128, 82, 65, 68, 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, - 65, 196, 82, 65, 67, 81, 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, - 65, 67, 73, 78, 199, 82, 65, 67, 67, 79, 79, 78, 128, 82, 65, 66, 66, 73, - 84, 128, 82, 65, 66, 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73, 128, - 82, 65, 51, 128, 82, 65, 50, 128, 82, 65, 45, 75, 65, 82, 65, 128, 82, - 65, 45, 52, 128, 82, 65, 45, 51, 128, 82, 65, 45, 50, 128, 82, 65, 45, - 49, 128, 82, 48, 50, 57, 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, - 82, 48, 50, 54, 128, 82, 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, - 50, 51, 128, 82, 48, 50, 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, - 128, 82, 48, 49, 57, 128, 82, 48, 49, 56, 128, 82, 48, 49, 55, 128, 82, - 48, 49, 54, 65, 128, 82, 48, 49, 54, 128, 82, 48, 49, 53, 128, 82, 48, - 49, 52, 128, 82, 48, 49, 51, 128, 82, 48, 49, 50, 128, 82, 48, 49, 49, - 128, 82, 48, 49, 48, 65, 128, 82, 48, 49, 48, 128, 82, 48, 48, 57, 128, - 82, 48, 48, 56, 128, 82, 48, 48, 55, 128, 82, 48, 48, 54, 128, 82, 48, - 48, 53, 128, 82, 48, 48, 52, 128, 82, 48, 48, 51, 66, 128, 82, 48, 48, - 51, 65, 128, 82, 48, 48, 51, 128, 82, 48, 48, 50, 65, 128, 82, 48, 48, - 50, 128, 82, 48, 48, 49, 128, 82, 45, 67, 82, 69, 197, 81, 89, 88, 128, - 81, 89, 85, 128, 81, 89, 84, 128, 81, 89, 82, 88, 128, 81, 89, 82, 128, - 81, 89, 80, 128, 81, 89, 79, 128, 81, 89, 73, 128, 81, 89, 69, 69, 128, - 81, 89, 69, 128, 81, 89, 65, 65, 128, 81, 89, 65, 128, 81, 89, 128, 81, - 87, 73, 128, 81, 87, 69, 69, 128, 81, 87, 69, 128, 81, 87, 65, 65, 128, - 81, 87, 65, 128, 81, 85, 88, 128, 81, 85, 86, 128, 81, 85, 85, 86, 128, - 81, 85, 85, 128, 81, 85, 84, 128, 81, 85, 83, 72, 83, 72, 65, 89, 65, - 128, 81, 85, 82, 88, 128, 81, 85, 82, 128, 81, 85, 80, 128, 81, 85, 79, - 88, 128, 81, 85, 79, 84, 197, 81, 85, 79, 84, 65, 84, 73, 79, 206, 81, - 85, 79, 84, 128, 81, 85, 79, 80, 128, 81, 85, 79, 128, 81, 85, 75, 128, - 81, 85, 73, 78, 84, 73, 76, 69, 128, 81, 85, 73, 78, 84, 69, 83, 83, 69, - 78, 67, 69, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, - 73, 78, 67, 85, 78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, - 73, 76, 212, 81, 85, 73, 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, - 128, 81, 85, 70, 128, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, 85, - 69, 83, 84, 73, 79, 78, 128, 81, 85, 69, 83, 84, 73, 79, 206, 81, 85, 69, - 69, 78, 128, 81, 85, 69, 69, 206, 81, 85, 69, 128, 81, 85, 66, 85, 84, - 83, 128, 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, - 82, 83, 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, - 128, 81, 85, 65, 78, 84, 73, 84, 217, 81, 85, 65, 68, 82, 85, 80, 76, - 197, 81, 85, 65, 68, 82, 65, 78, 84, 128, 81, 85, 65, 68, 82, 65, 78, - 212, 81, 85, 65, 68, 67, 79, 76, 79, 78, 128, 81, 85, 65, 68, 128, 81, - 85, 65, 196, 81, 85, 65, 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, - 79, 84, 128, 81, 79, 80, 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, - 81, 79, 79, 128, 81, 79, 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, - 128, 81, 79, 128, 81, 78, 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, - 81, 73, 84, 128, 81, 73, 80, 128, 81, 73, 73, 128, 81, 73, 70, 128, 81, - 73, 69, 88, 128, 81, 73, 69, 84, 128, 81, 73, 69, 80, 128, 81, 73, 69, - 128, 81, 73, 128, 81, 72, 87, 73, 128, 81, 72, 87, 69, 69, 128, 81, 72, - 87, 69, 128, 81, 72, 87, 65, 65, 128, 81, 72, 87, 65, 128, 81, 72, 85, - 128, 81, 72, 79, 80, 72, 128, 81, 72, 79, 128, 81, 72, 73, 128, 81, 72, - 69, 69, 128, 81, 72, 69, 128, 81, 72, 65, 85, 128, 81, 72, 65, 65, 128, - 81, 72, 65, 128, 81, 71, 65, 128, 81, 69, 84, 65, 78, 65, 128, 81, 69, - 69, 128, 81, 69, 128, 81, 65, 89, 128, 81, 65, 85, 128, 81, 65, 84, 65, - 78, 128, 81, 65, 82, 78, 69, 217, 81, 65, 82, 128, 81, 65, 81, 128, 81, - 65, 80, 72, 128, 81, 65, 77, 65, 84, 83, 128, 81, 65, 77, 65, 84, 211, - 81, 65, 76, 193, 81, 65, 73, 82, 84, 72, 82, 65, 128, 81, 65, 73, 128, - 81, 65, 70, 128, 81, 65, 198, 81, 65, 68, 77, 65, 128, 81, 65, 65, 73, - 128, 81, 65, 65, 70, 85, 128, 81, 65, 65, 70, 128, 81, 48, 48, 55, 128, - 81, 48, 48, 54, 128, 81, 48, 48, 53, 128, 81, 48, 48, 52, 128, 81, 48, - 48, 51, 128, 81, 48, 48, 50, 128, 81, 48, 48, 49, 128, 80, 90, 128, 80, - 89, 88, 128, 80, 89, 84, 128, 80, 89, 82, 88, 128, 80, 89, 82, 128, 80, - 89, 80, 128, 80, 87, 79, 89, 128, 80, 87, 79, 79, 128, 80, 87, 79, 128, - 80, 87, 207, 80, 87, 73, 73, 128, 80, 87, 73, 128, 80, 87, 69, 69, 128, - 80, 87, 69, 128, 80, 87, 65, 65, 128, 80, 87, 128, 80, 86, 128, 80, 85, - 90, 90, 76, 197, 80, 85, 88, 128, 80, 85, 85, 84, 128, 80, 85, 85, 128, - 80, 85, 84, 82, 69, 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, 128, 80, - 85, 212, 80, 85, 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, 73, 75, 65, - 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, 128, 80, 85, 82, 83, - 69, 128, 80, 85, 82, 80, 76, 197, 80, 85, 82, 78, 65, 77, 65, 128, 80, - 85, 82, 73, 84, 89, 128, 80, 85, 82, 73, 70, 89, 128, 80, 85, 82, 128, - 80, 85, 81, 128, 80, 85, 80, 128, 80, 85, 79, 88, 128, 80, 85, 79, 80, - 128, 80, 85, 79, 128, 80, 85, 78, 71, 65, 65, 77, 128, 80, 85, 78, 71, - 128, 80, 85, 78, 67, 84, 85, 211, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, - 78, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, 80, - 128, 80, 85, 77, 128, 80, 85, 70, 70, 69, 68, 128, 80, 85, 69, 128, 80, - 85, 67, 75, 128, 80, 85, 66, 76, 73, 195, 80, 85, 194, 80, 85, 65, 81, - 128, 80, 85, 65, 69, 128, 80, 85, 65, 67, 72, 85, 197, 80, 85, 50, 128, - 80, 85, 49, 128, 80, 85, 128, 80, 84, 72, 65, 72, 193, 80, 84, 69, 128, - 80, 83, 73, 76, 201, 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, - 77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, - 69, 83, 77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, - 73, 83, 84, 79, 76, 89, 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, - 65, 76, 84, 69, 210, 80, 83, 128, 80, 82, 79, 86, 69, 128, 80, 82, 79, - 84, 79, 86, 65, 82, 89, 211, 80, 82, 79, 84, 79, 211, 80, 82, 79, 84, 69, - 67, 84, 69, 196, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, - 128, 80, 82, 79, 83, 69, 82, 80, 73, 78, 65, 128, 80, 82, 79, 80, 79, 82, - 84, 73, 79, 78, 65, 204, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128, 80, - 82, 79, 80, 69, 82, 84, 217, 80, 82, 79, 80, 69, 76, 76, 69, 210, 80, 82, - 79, 79, 70, 128, 80, 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 76, 65, - 84, 73, 79, 78, 197, 80, 82, 79, 74, 69, 67, 84, 79, 82, 128, 80, 82, 79, - 74, 69, 67, 84, 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, - 128, 80, 82, 79, 72, 73, 66, 73, 84, 69, 196, 80, 82, 79, 71, 82, 69, 83, - 83, 128, 80, 82, 79, 71, 82, 65, 205, 80, 82, 79, 70, 79, 85, 78, 68, - 128, 80, 82, 79, 68, 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, - 82, 79, 66, 73, 78, 199, 80, 82, 73, 86, 65, 84, 69, 128, 80, 82, 73, 86, - 65, 84, 197, 80, 82, 73, 86, 65, 67, 217, 80, 82, 73, 83, 72, 84, 72, 65, - 77, 65, 84, 82, 193, 80, 82, 73, 78, 84, 83, 128, 80, 82, 73, 78, 84, 69, - 82, 128, 80, 82, 73, 78, 84, 69, 210, 80, 82, 73, 78, 84, 128, 80, 82, - 73, 78, 212, 80, 82, 73, 78, 67, 69, 83, 83, 128, 80, 82, 73, 78, 67, 69, - 128, 80, 82, 73, 77, 69, 128, 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, - 79, 85, 211, 80, 82, 69, 84, 90, 69, 76, 128, 80, 82, 69, 83, 83, 69, - 196, 80, 82, 69, 83, 69, 84, 128, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, - 79, 206, 80, 82, 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, - 79, 78, 68, 69, 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, - 80, 82, 69, 71, 78, 65, 78, 212, 80, 82, 69, 70, 73, 88, 69, 196, 80, 82, - 69, 70, 65, 67, 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, - 82, 69, 67, 69, 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, - 82, 69, 67, 69, 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, - 67, 69, 68, 69, 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 89, 69, - 210, 80, 82, 65, 77, 45, 80, 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, - 201, 80, 82, 65, 77, 45, 77, 85, 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, - 79, 217, 80, 82, 65, 77, 45, 66, 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, - 85, 79, 206, 80, 82, 65, 77, 45, 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, - 69, 201, 80, 82, 65, 77, 128, 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, - 128, 80, 80, 77, 128, 80, 80, 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, - 80, 79, 87, 69, 82, 211, 80, 79, 87, 69, 82, 128, 80, 79, 87, 69, 210, - 80, 79, 87, 68, 69, 82, 69, 196, 80, 79, 87, 68, 69, 82, 128, 80, 79, 85, - 78, 196, 80, 79, 85, 76, 84, 82, 217, 80, 79, 85, 67, 72, 128, 80, 79, - 84, 65, 84, 79, 128, 80, 79, 84, 65, 66, 76, 197, 80, 79, 212, 80, 79, - 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 79, 83, 84, 66, 79, 88, 128, - 80, 79, 83, 84, 65, 204, 80, 79, 83, 84, 128, 80, 79, 83, 212, 80, 79, - 83, 83, 69, 83, 83, 73, 79, 78, 128, 80, 79, 83, 83, 69, 83, 83, 73, 79, - 206, 80, 79, 83, 73, 84, 73, 79, 78, 83, 128, 80, 79, 83, 73, 84, 73, 79, - 78, 128, 80, 79, 83, 69, 73, 68, 79, 78, 128, 80, 79, 82, 84, 65, 66, 76, - 197, 80, 79, 82, 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, - 85, 211, 80, 79, 80, 80, 73, 78, 199, 80, 79, 80, 80, 69, 82, 128, 80, - 79, 80, 67, 79, 82, 78, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, - 68, 76, 69, 128, 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 206, - 80, 79, 77, 77, 69, 69, 128, 80, 79, 77, 77, 69, 197, 80, 79, 76, 79, - 128, 80, 79, 76, 73, 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, 79, 76, - 201, 80, 79, 76, 69, 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, 84, 73, - 69, 128, 80, 79, 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, 80, 79, - 73, 78, 84, 79, 128, 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, 84, - 69, 196, 80, 79, 73, 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, 84, - 82, 217, 80, 79, 69, 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, 80, - 79, 67, 75, 69, 212, 80, 79, 65, 128, 80, 79, 128, 80, 207, 80, 78, 69, - 85, 77, 65, 84, 65, 128, 80, 76, 85, 84, 207, 80, 76, 85, 84, 65, 128, - 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, 83, 128, 80, 76, 85, - 82, 65, 76, 128, 80, 76, 85, 77, 69, 196, 80, 76, 85, 77, 128, 80, 76, - 85, 75, 128, 80, 76, 85, 71, 128, 80, 76, 85, 128, 80, 76, 79, 87, 128, - 80, 76, 79, 80, 72, 85, 128, 80, 76, 72, 65, 85, 128, 80, 76, 69, 84, 72, - 82, 79, 78, 128, 80, 76, 69, 65, 68, 73, 78, 199, 80, 76, 68, 128, 80, - 76, 65, 89, 73, 78, 199, 80, 76, 65, 84, 69, 128, 80, 76, 65, 83, 84, 73, - 67, 83, 128, 80, 76, 65, 78, 69, 84, 128, 80, 76, 65, 78, 69, 128, 80, - 76, 65, 78, 67, 203, 80, 76, 65, 75, 128, 80, 76, 65, 71, 73, 79, 211, - 80, 76, 65, 67, 69, 72, 79, 76, 68, 69, 82, 128, 80, 76, 65, 67, 69, 72, - 79, 76, 68, 69, 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, - 90, 73, 67, 65, 84, 79, 128, 80, 73, 90, 90, 65, 128, 80, 73, 88, 128, - 80, 73, 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, - 67, 72, 70, 79, 82, 203, 80, 73, 84, 128, 80, 73, 83, 84, 79, 76, 128, - 80, 73, 83, 69, 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, - 73, 71, 128, 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, - 73, 82, 65, 67, 89, 128, 80, 73, 82, 50, 128, 80, 73, 80, 73, 78, 71, - 128, 80, 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, 80, 65, 69, - 77, 66, 65, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, 204, 80, - 73, 78, 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, 78, 67, 72, - 73, 78, 199, 80, 73, 78, 65, 82, 66, 79, 82, 65, 83, 128, 80, 73, 76, 76, - 128, 80, 73, 76, 197, 80, 73, 76, 67, 82, 79, 215, 80, 73, 75, 85, 82, - 85, 128, 80, 73, 75, 79, 128, 80, 73, 71, 128, 80, 73, 199, 80, 73, 69, - 88, 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, - 69, 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, - 85, 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, - 45, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, - 85, 80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, - 85, 78, 128, 80, 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, - 85, 80, 45, 75, 72, 73, 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, - 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, - 128, 80, 73, 69, 85, 208, 80, 73, 69, 84, 128, 80, 73, 69, 80, 128, 80, - 73, 69, 69, 84, 128, 80, 73, 69, 69, 81, 128, 80, 73, 69, 67, 69, 128, - 80, 73, 69, 128, 80, 73, 67, 84, 85, 82, 69, 128, 80, 73, 67, 75, 69, 84, - 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84, 79, 82, 85, 128, 80, - 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80, 201, 80, 72, 87, 65, - 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85, 210, 80, 72, 85, 78, - 71, 128, 80, 72, 82, 65, 83, 69, 128, 80, 72, 79, 78, 69, 83, 128, 80, - 72, 79, 76, 85, 83, 128, 80, 72, 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, - 79, 65, 128, 80, 72, 79, 128, 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, - 72, 73, 78, 84, 72, 85, 128, 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, - 211, 80, 72, 73, 76, 73, 80, 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, - 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, - 73, 79, 83, 128, 80, 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, - 80, 72, 73, 69, 85, 80, 72, 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, - 85, 80, 200, 80, 72, 73, 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, - 69, 128, 80, 72, 65, 83, 69, 45, 198, 80, 72, 65, 83, 69, 45, 194, 80, - 72, 65, 83, 69, 45, 193, 80, 72, 65, 82, 89, 78, 71, 69, 65, 204, 80, 72, - 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, 77, 128, 80, 72, 65, 73, - 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80, 193, 80, 72, 65, 66, 128, - 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, 71, 128, - 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, 84, 65, 69, 128, 80, 69, - 85, 84, 128, 80, 69, 84, 82, 201, 80, 69, 84, 65, 83, 84, 79, 75, 79, 85, - 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84, 65, - 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, 128, - 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, 83, 72, 178, 80, 69, - 83, 69, 84, 193, 80, 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, 83, - 80, 69, 67, 84, 73, 86, 69, 128, 80, 69, 82, 83, 79, 78, 65, 204, 80, 69, - 82, 83, 79, 78, 128, 80, 69, 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, + 71, 79, 76, 128, 83, 69, 71, 78, 79, 128, 83, 69, 71, 77, 69, 78, 84, 69, + 196, 83, 69, 71, 77, 69, 78, 84, 128, 83, 69, 69, 86, 128, 83, 69, 69, + 78, 85, 128, 83, 69, 69, 78, 128, 83, 69, 69, 206, 83, 69, 69, 68, 76, + 73, 78, 71, 128, 83, 69, 69, 45, 78, 79, 45, 69, 86, 73, 204, 83, 69, 68, + 78, 65, 128, 83, 69, 67, 84, 79, 82, 128, 83, 69, 67, 84, 73, 79, 78, + 128, 83, 69, 67, 84, 73, 79, 206, 83, 69, 67, 82, 69, 84, 128, 83, 69, + 67, 65, 78, 84, 128, 83, 69, 66, 65, 84, 66, 69, 73, 212, 83, 69, 65, 84, + 128, 83, 69, 65, 76, 128, 83, 69, 65, 71, 85, 76, 204, 83, 69, 45, 53, + 128, 83, 69, 45, 52, 128, 83, 69, 45, 51, 128, 83, 68, 79, 78, 199, 83, + 68, 128, 83, 67, 87, 65, 128, 83, 67, 82, 85, 80, 76, 69, 128, 83, 67, + 82, 79, 76, 76, 128, 83, 67, 82, 73, 80, 84, 128, 83, 67, 82, 69, 87, 68, + 82, 73, 86, 69, 82, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 69, 69, + 206, 83, 67, 82, 69, 65, 77, 73, 78, 199, 83, 67, 79, 82, 80, 73, 85, 83, + 128, 83, 67, 79, 82, 80, 73, 79, 78, 128, 83, 67, 79, 82, 69, 128, 83, + 67, 79, 79, 84, 69, 82, 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 67, + 73, 128, 83, 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, + 79, 69, 68, 69, 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 79, + 204, 83, 67, 72, 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, 67, + 69, 80, 84, 69, 210, 83, 67, 65, 82, 70, 128, 83, 67, 65, 78, 68, 73, 67, + 85, 83, 128, 83, 67, 65, 78, 68, 73, 67, 85, 211, 83, 67, 65, 206, 83, + 67, 65, 76, 69, 83, 128, 83, 66, 85, 194, 83, 66, 82, 85, 204, 83, 65, + 89, 73, 83, 201, 83, 65, 89, 65, 78, 78, 65, 128, 83, 65, 89, 128, 83, + 65, 88, 79, 80, 72, 79, 78, 69, 128, 83, 65, 88, 73, 77, 65, 84, 65, 128, + 83, 65, 87, 65, 78, 128, 83, 65, 87, 128, 83, 65, 86, 79, 85, 82, 73, 78, + 199, 83, 65, 85, 82, 79, 80, 79, 68, 128, 83, 65, 85, 82, 65, 83, 72, 84, + 82, 193, 83, 65, 85, 73, 76, 128, 83, 65, 85, 67, 69, 82, 128, 83, 65, + 84, 85, 82, 78, 128, 83, 65, 84, 75, 65, 65, 78, 75, 85, 85, 128, 83, 65, + 84, 75, 65, 65, 78, 128, 83, 65, 84, 69, 76, 76, 73, 84, 69, 128, 83, 65, + 84, 69, 76, 76, 73, 84, 197, 83, 65, 84, 67, 72, 69, 76, 128, 83, 65, 84, + 65, 78, 71, 65, 128, 83, 65, 83, 72, 128, 83, 65, 83, 65, 75, 128, 83, + 65, 82, 73, 128, 83, 65, 82, 193, 83, 65, 82, 128, 83, 65, 81, 128, 83, + 65, 80, 65, 128, 83, 65, 78, 89, 79, 79, 71, 193, 83, 65, 78, 89, 65, 75, + 193, 83, 65, 78, 84, 73, 73, 77, 85, 128, 83, 65, 78, 83, 75, 82, 73, + 212, 83, 65, 78, 78, 89, 65, 128, 83, 65, 78, 71, 65, 50, 128, 83, 65, + 78, 68, 87, 73, 67, 72, 128, 83, 65, 78, 68, 72, 201, 83, 65, 78, 68, 65, + 76, 128, 83, 65, 78, 65, 72, 128, 83, 65, 78, 128, 83, 65, 77, 89, 79, + 203, 83, 65, 77, 86, 65, 84, 128, 83, 65, 77, 80, 73, 128, 83, 65, 77, + 80, 72, 65, 79, 128, 83, 65, 77, 75, 65, 128, 83, 65, 77, 69, 75, 72, + 128, 83, 65, 77, 69, 75, 200, 83, 65, 77, 66, 65, 128, 83, 65, 77, 65, + 82, 73, 84, 65, 206, 83, 65, 77, 128, 83, 65, 76, 84, 73, 82, 69, 128, + 83, 65, 76, 84, 73, 82, 197, 83, 65, 76, 84, 73, 76, 76, 79, 128, 83, 65, + 76, 84, 45, 50, 128, 83, 65, 76, 84, 128, 83, 65, 76, 212, 83, 65, 76, + 76, 65, 76, 76, 65, 72, 79, 213, 83, 65, 76, 76, 193, 83, 65, 76, 65, + 205, 83, 65, 76, 65, 68, 128, 83, 65, 76, 65, 128, 83, 65, 76, 45, 65, + 77, 77, 79, 78, 73, 65, 67, 128, 83, 65, 76, 128, 83, 65, 75, 84, 65, + 128, 83, 65, 75, 79, 84, 128, 83, 65, 75, 73, 78, 128, 83, 65, 75, 72, + 193, 83, 65, 75, 69, 85, 65, 69, 128, 83, 65, 75, 197, 83, 65, 74, 68, + 65, 72, 128, 83, 65, 73, 76, 66, 79, 65, 84, 128, 83, 65, 73, 76, 128, + 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 72, 128, 83, 65, 71, 73, 84, 84, + 65, 82, 73, 85, 83, 128, 83, 65, 71, 65, 128, 83, 65, 71, 128, 83, 65, + 199, 83, 65, 70, 72, 65, 128, 83, 65, 70, 69, 84, 217, 83, 65, 68, 72, + 69, 128, 83, 65, 68, 72, 197, 83, 65, 68, 69, 128, 83, 65, 68, 128, 83, + 65, 196, 83, 65, 67, 82, 73, 70, 73, 67, 73, 65, 204, 83, 65, 65, 73, + 128, 83, 65, 65, 68, 72, 85, 128, 83, 65, 45, 73, 128, 83, 65, 45, 56, + 128, 83, 65, 45, 55, 128, 83, 65, 45, 54, 128, 83, 65, 45, 53, 128, 83, + 65, 45, 52, 128, 83, 65, 45, 51, 128, 83, 65, 45, 50, 128, 83, 65, 45, + 49, 128, 83, 48, 52, 54, 128, 83, 48, 52, 53, 128, 83, 48, 52, 52, 128, + 83, 48, 52, 51, 128, 83, 48, 52, 50, 128, 83, 48, 52, 49, 128, 83, 48, + 52, 48, 128, 83, 48, 51, 57, 128, 83, 48, 51, 56, 128, 83, 48, 51, 55, + 128, 83, 48, 51, 54, 128, 83, 48, 51, 53, 65, 128, 83, 48, 51, 53, 128, + 83, 48, 51, 52, 128, 83, 48, 51, 51, 128, 83, 48, 51, 50, 128, 83, 48, + 51, 49, 128, 83, 48, 51, 48, 128, 83, 48, 50, 57, 128, 83, 48, 50, 56, + 128, 83, 48, 50, 55, 128, 83, 48, 50, 54, 66, 128, 83, 48, 50, 54, 65, + 128, 83, 48, 50, 54, 128, 83, 48, 50, 53, 128, 83, 48, 50, 52, 128, 83, + 48, 50, 51, 128, 83, 48, 50, 50, 128, 83, 48, 50, 49, 128, 83, 48, 50, + 48, 128, 83, 48, 49, 57, 128, 83, 48, 49, 56, 128, 83, 48, 49, 55, 65, + 128, 83, 48, 49, 55, 128, 83, 48, 49, 54, 128, 83, 48, 49, 53, 128, 83, + 48, 49, 52, 66, 128, 83, 48, 49, 52, 65, 128, 83, 48, 49, 52, 128, 83, + 48, 49, 51, 128, 83, 48, 49, 50, 128, 83, 48, 49, 49, 128, 83, 48, 49, + 48, 128, 83, 48, 48, 57, 128, 83, 48, 48, 56, 128, 83, 48, 48, 55, 128, + 83, 48, 48, 54, 65, 128, 83, 48, 48, 54, 128, 83, 48, 48, 53, 128, 83, + 48, 48, 52, 128, 83, 48, 48, 51, 128, 83, 48, 48, 50, 65, 128, 83, 48, + 48, 50, 128, 83, 48, 48, 49, 128, 83, 45, 87, 128, 83, 45, 83, 72, 65, + 80, 69, 196, 82, 89, 89, 128, 82, 89, 88, 128, 82, 89, 84, 128, 82, 89, + 82, 88, 128, 82, 89, 82, 128, 82, 89, 80, 128, 82, 87, 79, 79, 128, 82, + 87, 79, 128, 82, 87, 73, 73, 128, 82, 87, 73, 128, 82, 87, 69, 69, 128, + 82, 87, 69, 128, 82, 87, 65, 72, 65, 128, 82, 87, 65, 65, 128, 82, 87, + 65, 128, 82, 85, 88, 128, 82, 85, 85, 66, 85, 82, 85, 128, 82, 85, 85, + 128, 82, 85, 84, 128, 82, 85, 83, 83, 73, 65, 206, 82, 85, 83, 73, 128, + 82, 85, 82, 88, 128, 82, 85, 82, 128, 82, 85, 80, 73, 73, 128, 82, 85, + 80, 69, 197, 82, 85, 80, 128, 82, 85, 79, 88, 128, 82, 85, 79, 80, 128, + 82, 85, 79, 128, 82, 85, 78, 79, 85, 84, 128, 82, 85, 78, 78, 73, 78, + 199, 82, 85, 78, 78, 69, 82, 128, 82, 85, 78, 73, 195, 82, 85, 78, 128, + 82, 85, 77, 201, 82, 85, 77, 65, 201, 82, 85, 77, 128, 82, 85, 205, 82, + 85, 76, 69, 82, 128, 82, 85, 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, 128, + 82, 85, 76, 69, 128, 82, 85, 76, 65, 73, 128, 82, 85, 75, 75, 65, 75, 72, + 65, 128, 82, 85, 73, 83, 128, 82, 85, 71, 66, 217, 82, 85, 68, 73, 77, + 69, 78, 84, 193, 82, 85, 66, 76, 197, 82, 85, 194, 82, 85, 65, 128, 82, + 85, 45, 54, 128, 82, 85, 45, 53, 128, 82, 85, 45, 52, 128, 82, 85, 45, + 51, 128, 82, 85, 45, 50, 128, 82, 85, 45, 49, 128, 82, 84, 72, 65, 78, + 199, 82, 84, 69, 128, 82, 84, 65, 71, 83, 128, 82, 84, 65, 71, 211, 82, + 82, 89, 88, 128, 82, 82, 89, 84, 128, 82, 82, 89, 82, 88, 128, 82, 82, + 89, 82, 128, 82, 82, 89, 80, 128, 82, 82, 85, 88, 128, 82, 82, 85, 85, + 128, 82, 82, 85, 84, 128, 82, 82, 85, 82, 88, 128, 82, 82, 85, 82, 128, + 82, 82, 85, 80, 128, 82, 82, 85, 79, 88, 128, 82, 82, 85, 79, 128, 82, + 82, 85, 128, 82, 82, 82, 65, 128, 82, 82, 79, 88, 128, 82, 82, 79, 84, + 128, 82, 82, 79, 80, 128, 82, 82, 79, 79, 128, 82, 82, 79, 128, 82, 82, + 73, 73, 128, 82, 82, 73, 128, 82, 82, 69, 88, 128, 82, 82, 69, 84, 128, + 82, 82, 69, 80, 128, 82, 82, 69, 72, 128, 82, 82, 69, 200, 82, 82, 69, + 69, 128, 82, 82, 69, 128, 82, 82, 65, 88, 128, 82, 82, 65, 85, 128, 82, + 82, 65, 73, 128, 82, 82, 65, 65, 128, 82, 79, 87, 66, 79, 65, 84, 128, + 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, 68, 45, 84, 73, 80, 80, 69, + 196, 82, 79, 84, 85, 78, 68, 65, 128, 82, 79, 84, 65, 84, 73, 79, 78, 83, + 128, 82, 79, 84, 65, 84, 73, 79, 78, 45, 87, 65, 76, 76, 80, 76, 65, 78, + 197, 82, 79, 84, 65, 84, 73, 79, 78, 45, 70, 76, 79, 79, 82, 80, 76, 65, + 78, 197, 82, 79, 84, 65, 84, 73, 79, 78, 128, 82, 79, 84, 65, 84, 73, 79, + 206, 82, 79, 84, 65, 84, 69, 196, 82, 79, 83, 72, 128, 82, 79, 83, 69, + 84, 84, 69, 128, 82, 79, 83, 69, 128, 82, 79, 79, 84, 128, 82, 79, 79, + 83, 84, 69, 82, 128, 82, 79, 79, 77, 128, 82, 79, 79, 75, 128, 82, 79, + 79, 203, 82, 79, 79, 70, 128, 82, 79, 77, 65, 78, 73, 65, 206, 82, 79, + 77, 65, 206, 82, 79, 77, 128, 82, 79, 76, 76, 73, 78, 199, 82, 79, 76, + 76, 69, 210, 82, 79, 76, 76, 69, 68, 45, 85, 208, 82, 79, 76, 204, 82, + 79, 72, 73, 78, 71, 89, 193, 82, 79, 71, 128, 82, 79, 196, 82, 79, 67, + 75, 69, 84, 128, 82, 79, 67, 203, 82, 79, 67, 128, 82, 79, 66, 79, 212, + 82, 79, 66, 65, 84, 128, 82, 79, 65, 83, 84, 69, 196, 82, 79, 65, 82, + 128, 82, 79, 65, 128, 82, 79, 45, 54, 128, 82, 79, 45, 53, 128, 82, 79, + 45, 52, 128, 82, 79, 45, 51, 128, 82, 79, 45, 50, 128, 82, 79, 45, 49, + 128, 82, 78, 89, 73, 78, 199, 82, 78, 79, 79, 78, 128, 82, 78, 79, 79, + 206, 82, 78, 65, 205, 82, 77, 84, 128, 82, 76, 79, 128, 82, 76, 77, 128, + 82, 76, 73, 128, 82, 76, 69, 128, 82, 74, 69, 211, 82, 74, 69, 128, 82, + 74, 197, 82, 73, 84, 85, 65, 76, 128, 82, 73, 84, 84, 79, 82, 85, 128, + 82, 73, 84, 83, 73, 128, 82, 73, 83, 73, 78, 199, 82, 73, 83, 72, 128, + 82, 73, 82, 65, 128, 82, 73, 80, 80, 76, 197, 82, 73, 80, 128, 82, 73, + 78, 71, 211, 82, 73, 78, 71, 73, 78, 199, 82, 73, 78, 71, 69, 196, 82, + 73, 78, 70, 79, 82, 90, 65, 78, 68, 79, 128, 82, 73, 206, 82, 73, 77, 71, + 66, 65, 128, 82, 73, 77, 128, 82, 73, 75, 82, 73, 75, 128, 82, 73, 71, + 86, 69, 68, 73, 195, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, 82, 73, + 71, 72, 84, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 84, 79, 45, 76, 69, + 70, 212, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 82, 73, 71, 72, 84, 45, + 83, 72, 65, 68, 79, 87, 69, 196, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, + 69, 196, 82, 73, 71, 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 82, 73, + 71, 72, 84, 45, 76, 73, 71, 72, 84, 69, 196, 82, 73, 71, 72, 84, 45, 72, + 65, 78, 68, 69, 196, 82, 73, 71, 72, 84, 45, 72, 65, 78, 196, 82, 73, 71, + 72, 84, 45, 70, 65, 67, 73, 78, 199, 82, 73, 71, 72, 84, 128, 82, 73, 70, + 76, 69, 128, 82, 73, 69, 85, 76, 45, 89, 69, 83, 73, 69, 85, 78, 71, 128, + 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 45, + 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, + 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, + 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, + 84, 128, 82, 73, 69, 85, 76, 45, 84, 72, 73, 69, 85, 84, 72, 128, 82, 73, + 69, 85, 76, 45, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 82, 73, + 69, 85, 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 82, 73, 69, 85, + 76, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, + 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, + 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, + 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, + 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, + 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, + 80, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, + 80, 128, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, + 69, 85, 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, + 78, 73, 69, 85, 78, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, + 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 75, + 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, + 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 128, + 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 128, + 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 72, 73, 69, 85, 72, + 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, + 76, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 82, 73, + 69, 85, 76, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 67, 73, + 69, 85, 67, 128, 82, 73, 69, 85, 204, 82, 73, 69, 76, 128, 82, 73, 69, + 69, 128, 82, 73, 67, 75, 83, 72, 65, 87, 128, 82, 73, 67, 69, 77, 128, + 82, 73, 67, 69, 128, 82, 73, 67, 197, 82, 73, 66, 66, 79, 78, 128, 82, + 73, 66, 66, 79, 206, 82, 73, 65, 204, 82, 73, 45, 55, 128, 82, 73, 45, + 54, 128, 82, 73, 45, 53, 128, 82, 73, 45, 52, 128, 82, 73, 45, 51, 128, + 82, 73, 45, 50, 128, 82, 73, 45, 49, 128, 82, 72, 79, 84, 73, 195, 82, + 72, 79, 128, 82, 72, 207, 82, 72, 73, 78, 79, 67, 69, 82, 79, 83, 128, + 82, 72, 65, 128, 82, 72, 128, 82, 71, 89, 73, 78, 71, 83, 128, 82, 71, + 89, 65, 78, 128, 82, 71, 89, 193, 82, 69, 86, 79, 76, 86, 73, 78, 199, + 82, 69, 86, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 86, 77, 65, 128, 82, + 69, 86, 73, 65, 128, 82, 69, 86, 69, 82, 83, 69, 68, 45, 83, 67, 72, 87, + 65, 128, 82, 69, 86, 69, 82, 83, 69, 68, 128, 82, 69, 86, 69, 82, 83, 69, + 196, 82, 69, 86, 69, 82, 83, 197, 82, 69, 85, 88, 128, 82, 69, 85, 128, + 82, 69, 84, 85, 82, 78, 128, 82, 69, 84, 85, 82, 206, 82, 69, 84, 82, 79, + 70, 76, 69, 216, 82, 69, 84, 82, 69, 65, 84, 128, 82, 69, 84, 79, 82, 84, + 128, 82, 69, 83, 85, 80, 73, 78, 85, 83, 128, 82, 69, 83, 84, 82, 79, 79, + 77, 128, 82, 69, 83, 84, 82, 73, 67, 84, 69, 196, 82, 69, 83, 84, 128, + 82, 69, 83, 80, 79, 78, 83, 69, 128, 82, 69, 83, 79, 85, 82, 67, 69, 128, + 82, 69, 83, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 83, 73, 83, 84, 65, + 78, 67, 69, 128, 82, 69, 83, 73, 68, 69, 78, 67, 69, 128, 82, 69, 83, 72, + 45, 65, 89, 73, 78, 45, 68, 65, 76, 69, 84, 72, 128, 82, 69, 83, 72, 45, + 65, 89, 73, 78, 128, 82, 69, 83, 200, 82, 69, 82, 69, 78, 71, 71, 65, 78, + 128, 82, 69, 82, 69, 75, 65, 78, 128, 82, 69, 80, 82, 69, 83, 69, 78, 84, + 128, 82, 69, 80, 76, 65, 67, 69, 77, 69, 78, 212, 82, 69, 80, 72, 65, + 128, 82, 69, 80, 72, 128, 82, 69, 80, 69, 84, 73, 84, 73, 79, 206, 82, + 69, 80, 69, 65, 84, 69, 196, 82, 69, 80, 69, 65, 84, 128, 82, 69, 80, 69, + 65, 212, 82, 69, 80, 65, 89, 65, 128, 82, 69, 80, 65, 128, 82, 69, 80, + 193, 82, 69, 78, 84, 79, 71, 69, 78, 128, 82, 69, 78, 128, 82, 69, 206, + 82, 69, 77, 85, 128, 82, 69, 77, 73, 78, 68, 69, 210, 82, 69, 77, 69, 68, + 89, 128, 82, 69, 76, 73, 71, 73, 79, 78, 128, 82, 69, 76, 73, 69, 86, 69, + 196, 82, 69, 76, 69, 65, 83, 69, 128, 82, 69, 76, 65, 88, 69, 68, 128, + 82, 69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, 76, 65, 84, 73, 79, 78, + 128, 82, 69, 76, 65, 65, 128, 82, 69, 74, 65, 78, 199, 82, 69, 73, 87, + 65, 128, 82, 69, 73, 196, 82, 69, 73, 128, 82, 69, 71, 85, 76, 85, 83, + 45, 52, 128, 82, 69, 71, 85, 76, 85, 83, 45, 51, 128, 82, 69, 71, 85, 76, + 85, 83, 45, 50, 128, 82, 69, 71, 85, 76, 85, 83, 128, 82, 69, 71, 85, 76, + 85, 211, 82, 69, 71, 73, 83, 84, 69, 82, 69, 196, 82, 69, 71, 73, 79, 78, + 65, 204, 82, 69, 71, 73, 65, 45, 50, 128, 82, 69, 71, 73, 65, 128, 82, + 69, 70, 79, 82, 77, 69, 196, 82, 69, 70, 69, 82, 69, 78, 67, 197, 82, 69, + 68, 85, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 82, 69, 67, 89, 67, 76, + 73, 78, 199, 82, 69, 67, 89, 67, 76, 69, 196, 82, 69, 67, 84, 73, 76, 73, + 78, 69, 65, 210, 82, 69, 67, 84, 65, 78, 71, 85, 76, 65, 210, 82, 69, 67, + 84, 65, 78, 71, 76, 69, 128, 82, 69, 67, 84, 65, 78, 71, 76, 197, 82, 69, + 67, 82, 69, 65, 84, 73, 79, 78, 65, 204, 82, 69, 67, 79, 82, 68, 73, 78, + 199, 82, 69, 67, 79, 82, 68, 69, 82, 128, 82, 69, 67, 79, 82, 68, 128, + 82, 69, 67, 79, 82, 196, 82, 69, 67, 73, 84, 65, 84, 73, 86, 197, 82, 69, + 67, 69, 80, 84, 73, 86, 197, 82, 69, 67, 69, 73, 86, 69, 82, 128, 82, 69, + 67, 69, 73, 86, 69, 210, 82, 69, 67, 69, 73, 80, 84, 128, 82, 69, 65, 76, + 71, 65, 82, 45, 50, 128, 82, 69, 65, 76, 71, 65, 82, 128, 82, 69, 65, 72, + 77, 85, 75, 128, 82, 69, 65, 68, 73, 78, 199, 82, 69, 65, 67, 72, 128, + 82, 69, 45, 52, 128, 82, 69, 45, 51, 128, 82, 69, 45, 50, 128, 82, 69, + 45, 49, 128, 82, 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, 65, + 90, 79, 82, 128, 82, 65, 89, 83, 128, 82, 65, 89, 211, 82, 65, 89, 65, + 78, 78, 65, 128, 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, 128, 82, + 65, 84, 72, 193, 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, 83, 87, + 65, 68, 73, 128, 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65, 128, 82, + 65, 81, 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, 197, 82, + 65, 78, 65, 128, 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, 66, 65, + 84, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 75, 65, 65, 82, 65, 65, + 78, 83, 65, 89, 65, 128, 82, 65, 73, 83, 73, 78, 199, 82, 65, 73, 83, 69, + 68, 128, 82, 65, 73, 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, 82, + 65, 73, 76, 87, 65, 89, 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, 76, + 128, 82, 65, 73, 68, 207, 82, 65, 73, 68, 65, 128, 82, 65, 72, 77, 65, + 84, 85, 76, 76, 65, 200, 82, 65, 72, 128, 82, 65, 70, 69, 128, 82, 65, + 69, 77, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, 73, + 79, 128, 82, 65, 68, 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, + 196, 82, 65, 67, 81, 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, 65, + 67, 73, 78, 199, 82, 65, 67, 67, 79, 79, 78, 128, 82, 65, 66, 66, 73, 84, + 128, 82, 65, 66, 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73, 128, 82, + 65, 51, 128, 82, 65, 50, 128, 82, 65, 45, 75, 65, 82, 65, 128, 82, 65, + 45, 52, 128, 82, 65, 45, 51, 128, 82, 65, 45, 50, 128, 82, 65, 45, 49, + 128, 82, 48, 50, 57, 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, 82, + 48, 50, 54, 128, 82, 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, 50, + 51, 128, 82, 48, 50, 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, 128, + 82, 48, 49, 57, 128, 82, 48, 49, 56, 128, 82, 48, 49, 55, 128, 82, 48, + 49, 54, 65, 128, 82, 48, 49, 54, 128, 82, 48, 49, 53, 128, 82, 48, 49, + 52, 128, 82, 48, 49, 51, 128, 82, 48, 49, 50, 128, 82, 48, 49, 49, 128, + 82, 48, 49, 48, 65, 128, 82, 48, 49, 48, 128, 82, 48, 48, 57, 128, 82, + 48, 48, 56, 128, 82, 48, 48, 55, 128, 82, 48, 48, 54, 128, 82, 48, 48, + 53, 128, 82, 48, 48, 52, 128, 82, 48, 48, 51, 66, 128, 82, 48, 48, 51, + 65, 128, 82, 48, 48, 51, 128, 82, 48, 48, 50, 65, 128, 82, 48, 48, 50, + 128, 82, 48, 48, 49, 128, 82, 45, 67, 82, 69, 197, 81, 89, 88, 128, 81, + 89, 85, 128, 81, 89, 84, 128, 81, 89, 82, 88, 128, 81, 89, 82, 128, 81, + 89, 80, 128, 81, 89, 79, 128, 81, 89, 73, 128, 81, 89, 69, 69, 128, 81, + 89, 69, 128, 81, 89, 65, 65, 128, 81, 89, 65, 128, 81, 89, 128, 81, 87, + 73, 128, 81, 87, 69, 69, 128, 81, 87, 69, 128, 81, 87, 65, 65, 128, 81, + 87, 65, 128, 81, 85, 88, 128, 81, 85, 86, 128, 81, 85, 85, 86, 128, 81, + 85, 85, 128, 81, 85, 84, 128, 81, 85, 83, 72, 83, 72, 65, 89, 65, 128, + 81, 85, 82, 88, 128, 81, 85, 82, 128, 81, 85, 80, 128, 81, 85, 79, 88, + 128, 81, 85, 79, 84, 197, 81, 85, 79, 84, 65, 84, 73, 79, 206, 81, 85, + 79, 84, 128, 81, 85, 79, 80, 128, 81, 85, 79, 128, 81, 85, 75, 128, 81, + 85, 73, 78, 84, 73, 76, 69, 128, 81, 85, 73, 78, 84, 69, 83, 83, 69, 78, + 67, 69, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, 73, + 78, 67, 85, 78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, 73, + 76, 212, 81, 85, 73, 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, 128, + 81, 85, 70, 128, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, 85, 69, 83, + 84, 73, 79, 78, 128, 81, 85, 69, 83, 84, 73, 79, 206, 81, 85, 69, 69, 78, + 128, 81, 85, 69, 69, 206, 81, 85, 69, 128, 81, 85, 66, 85, 84, 83, 128, + 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, 82, 83, + 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, 128, + 81, 85, 65, 78, 84, 73, 84, 217, 81, 85, 65, 68, 82, 85, 80, 76, 197, 81, + 85, 65, 68, 82, 65, 78, 84, 128, 81, 85, 65, 68, 82, 65, 78, 212, 81, 85, + 65, 68, 67, 79, 76, 79, 78, 128, 81, 85, 65, 68, 128, 81, 85, 65, 196, + 81, 85, 65, 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, 79, 84, 128, + 81, 79, 80, 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, 81, 79, 79, + 128, 81, 79, 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, 128, 81, 79, + 128, 81, 78, 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, 81, 73, 84, + 128, 81, 73, 80, 128, 81, 73, 73, 128, 81, 73, 70, 128, 81, 73, 69, 88, + 128, 81, 73, 69, 84, 128, 81, 73, 69, 80, 128, 81, 73, 69, 128, 81, 73, + 128, 81, 72, 87, 73, 128, 81, 72, 87, 69, 69, 128, 81, 72, 87, 69, 128, + 81, 72, 87, 65, 65, 128, 81, 72, 87, 65, 128, 81, 72, 85, 128, 81, 72, + 79, 80, 72, 128, 81, 72, 79, 128, 81, 72, 73, 128, 81, 72, 69, 69, 128, + 81, 72, 69, 128, 81, 72, 65, 85, 128, 81, 72, 65, 65, 128, 81, 72, 65, + 128, 81, 71, 65, 128, 81, 69, 84, 65, 78, 65, 128, 81, 69, 69, 128, 81, + 69, 128, 81, 65, 89, 128, 81, 65, 85, 128, 81, 65, 84, 65, 78, 128, 81, + 65, 82, 78, 69, 217, 81, 65, 82, 128, 81, 65, 81, 128, 81, 65, 80, 72, + 128, 81, 65, 77, 65, 84, 83, 128, 81, 65, 77, 65, 84, 211, 81, 65, 76, + 193, 81, 65, 73, 82, 84, 72, 82, 65, 128, 81, 65, 73, 128, 81, 65, 70, + 128, 81, 65, 198, 81, 65, 68, 77, 65, 128, 81, 65, 65, 73, 128, 81, 65, + 65, 70, 85, 128, 81, 65, 65, 70, 128, 81, 48, 48, 55, 128, 81, 48, 48, + 54, 128, 81, 48, 48, 53, 128, 81, 48, 48, 52, 128, 81, 48, 48, 51, 128, + 81, 48, 48, 50, 128, 81, 48, 48, 49, 128, 80, 90, 128, 80, 89, 88, 128, + 80, 89, 84, 128, 80, 89, 82, 88, 128, 80, 89, 82, 128, 80, 89, 80, 128, + 80, 87, 79, 89, 128, 80, 87, 79, 79, 128, 80, 87, 79, 128, 80, 87, 207, + 80, 87, 73, 73, 128, 80, 87, 73, 128, 80, 87, 69, 69, 128, 80, 87, 69, + 128, 80, 87, 65, 65, 128, 80, 87, 128, 80, 86, 128, 80, 85, 90, 90, 76, + 197, 80, 85, 88, 128, 80, 85, 85, 84, 128, 80, 85, 85, 128, 80, 85, 84, + 82, 69, 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, 128, 80, 85, 212, + 80, 85, 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, 73, 75, 65, 128, 80, + 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, 128, 80, 85, 82, 83, 69, 128, + 80, 85, 82, 80, 76, 197, 80, 85, 82, 78, 65, 77, 65, 128, 80, 85, 82, 73, + 84, 89, 128, 80, 85, 82, 73, 70, 89, 128, 80, 85, 82, 128, 80, 85, 81, + 128, 80, 85, 80, 128, 80, 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, + 79, 128, 80, 85, 78, 71, 65, 65, 77, 128, 80, 85, 78, 71, 128, 80, 85, + 78, 67, 84, 85, 211, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 78, 128, 80, + 85, 78, 67, 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, 80, 128, 80, 85, 77, + 128, 80, 85, 70, 70, 69, 68, 128, 80, 85, 69, 128, 80, 85, 67, 75, 128, + 80, 85, 66, 76, 73, 195, 80, 85, 194, 80, 85, 65, 81, 128, 80, 85, 65, + 69, 128, 80, 85, 65, 67, 72, 85, 197, 80, 85, 50, 128, 80, 85, 49, 128, + 80, 85, 128, 80, 84, 72, 65, 72, 193, 80, 84, 69, 128, 80, 83, 73, 76, + 201, 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 80, + 83, 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, + 128, 80, 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, 73, 83, 84, 79, + 76, 89, 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, 65, 76, 84, 69, + 210, 80, 83, 128, 80, 82, 79, 86, 69, 128, 80, 82, 79, 84, 79, 86, 65, + 82, 89, 211, 80, 82, 79, 84, 79, 211, 80, 82, 79, 84, 69, 67, 84, 69, + 196, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 80, 82, + 79, 83, 69, 82, 80, 73, 78, 65, 128, 80, 82, 79, 80, 79, 82, 84, 73, 79, + 78, 65, 204, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128, 80, 82, 79, 80, + 69, 82, 84, 217, 80, 82, 79, 80, 69, 76, 76, 69, 210, 80, 82, 79, 79, 70, + 128, 80, 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 76, 65, 84, 73, 79, + 78, 197, 80, 82, 79, 74, 69, 67, 84, 79, 82, 128, 80, 82, 79, 74, 69, 67, + 84, 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80, 82, + 79, 72, 73, 66, 73, 84, 69, 196, 80, 82, 79, 71, 82, 69, 83, 83, 128, 80, + 82, 79, 71, 82, 65, 205, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, 82, 79, + 68, 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 79, 66, 73, 78, + 199, 80, 82, 73, 86, 65, 84, 69, 128, 80, 82, 73, 86, 65, 84, 197, 80, + 82, 73, 86, 65, 67, 217, 80, 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, + 193, 80, 82, 73, 78, 84, 83, 128, 80, 82, 73, 78, 84, 69, 82, 128, 80, + 82, 73, 78, 84, 69, 210, 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, + 80, 82, 73, 78, 67, 69, 83, 83, 128, 80, 82, 73, 78, 67, 69, 128, 80, 82, + 73, 77, 69, 128, 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, 79, 85, 211, + 80, 82, 69, 84, 90, 69, 76, 128, 80, 82, 69, 83, 83, 69, 196, 80, 82, 69, + 83, 69, 84, 128, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, 79, 206, 80, 82, + 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, 79, 78, 68, 69, + 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, 80, 82, 69, 71, + 78, 65, 78, 212, 80, 82, 69, 70, 73, 88, 69, 196, 80, 82, 69, 70, 65, 67, + 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, 82, 69, 67, 69, + 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, 82, 69, 67, 69, + 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, 67, 69, 68, 69, + 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 89, 69, 210, 80, 82, 65, + 77, 45, 80, 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, + 45, 77, 85, 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, + 77, 45, 66, 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, + 65, 77, 45, 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, + 77, 128, 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, + 80, 80, 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, + 211, 80, 79, 87, 69, 82, 128, 80, 79, 87, 69, 210, 80, 79, 87, 68, 69, + 82, 69, 196, 80, 79, 87, 68, 69, 82, 128, 80, 79, 85, 78, 196, 80, 79, + 85, 76, 84, 82, 217, 80, 79, 85, 67, 72, 128, 80, 79, 84, 84, 69, 196, + 80, 79, 84, 65, 84, 79, 128, 80, 79, 84, 65, 66, 76, 197, 80, 79, 212, + 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 79, 83, 84, 66, 79, + 88, 128, 80, 79, 83, 84, 65, 204, 80, 79, 83, 84, 128, 80, 79, 83, 212, + 80, 79, 83, 83, 69, 83, 83, 73, 79, 78, 128, 80, 79, 83, 83, 69, 83, 83, + 73, 79, 206, 80, 79, 83, 73, 84, 73, 79, 78, 83, 128, 80, 79, 83, 73, 84, + 73, 79, 78, 128, 80, 79, 83, 69, 73, 68, 79, 78, 128, 80, 79, 82, 84, 65, + 66, 76, 197, 80, 79, 82, 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, + 67, 84, 85, 211, 80, 79, 80, 80, 73, 78, 199, 80, 79, 80, 80, 69, 82, + 128, 80, 79, 80, 67, 79, 82, 78, 128, 80, 79, 80, 128, 80, 79, 208, 80, + 79, 79, 68, 76, 69, 128, 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, + 79, 206, 80, 79, 77, 77, 69, 69, 128, 80, 79, 77, 77, 69, 197, 80, 79, + 76, 79, 128, 80, 79, 76, 73, 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, + 79, 76, 201, 80, 79, 76, 69, 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, + 84, 73, 69, 128, 80, 79, 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, + 80, 79, 73, 78, 84, 79, 128, 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, + 78, 84, 69, 196, 80, 79, 73, 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, + 69, 84, 82, 217, 80, 79, 69, 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, + 128, 80, 79, 67, 75, 69, 212, 80, 79, 65, 128, 80, 79, 128, 80, 207, 80, + 78, 69, 85, 77, 65, 84, 65, 128, 80, 76, 85, 84, 207, 80, 76, 85, 84, 65, + 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, 83, 128, 80, + 76, 85, 82, 65, 76, 128, 80, 76, 85, 78, 71, 69, 82, 128, 80, 76, 85, 77, + 69, 196, 80, 76, 85, 77, 128, 80, 76, 85, 75, 128, 80, 76, 85, 71, 128, + 80, 76, 85, 128, 80, 76, 79, 87, 128, 80, 76, 79, 80, 72, 85, 128, 80, + 76, 72, 65, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, 128, 80, 76, 69, 65, + 68, 73, 78, 199, 80, 76, 68, 128, 80, 76, 65, 89, 73, 78, 199, 80, 76, + 65, 84, 69, 128, 80, 76, 65, 83, 84, 73, 67, 83, 128, 80, 76, 65, 78, 84, + 128, 80, 76, 65, 78, 69, 84, 128, 80, 76, 65, 78, 69, 128, 80, 76, 65, + 78, 67, 203, 80, 76, 65, 75, 128, 80, 76, 65, 71, 73, 79, 211, 80, 76, + 65, 67, 69, 72, 79, 76, 68, 69, 82, 128, 80, 76, 65, 67, 69, 72, 79, 76, + 68, 69, 210, 80, 76, 65, 67, 197, 80, 76, 65, 67, 65, 82, 68, 128, 80, + 76, 65, 128, 80, 73, 90, 90, 73, 67, 65, 84, 79, 128, 80, 73, 90, 90, 65, + 128, 80, 73, 88, 128, 80, 73, 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, + 82, 75, 128, 80, 73, 84, 67, 72, 70, 79, 82, 203, 80, 73, 84, 128, 80, + 73, 83, 84, 79, 76, 128, 80, 73, 83, 69, 76, 69, 72, 128, 80, 73, 83, 67, + 69, 83, 128, 80, 73, 82, 73, 71, 128, 80, 73, 82, 73, 199, 80, 73, 82, + 73, 69, 69, 78, 128, 80, 73, 82, 65, 67, 89, 128, 80, 73, 82, 50, 128, + 80, 73, 80, 73, 78, 71, 128, 80, 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, + 128, 80, 73, 80, 65, 69, 77, 66, 65, 128, 80, 73, 80, 128, 80, 73, 78, + 87, 72, 69, 69, 204, 80, 73, 78, 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, + 197, 80, 73, 78, 67, 72, 73, 78, 199, 80, 73, 78, 67, 72, 69, 196, 80, + 73, 78, 65, 84, 65, 128, 80, 73, 78, 65, 82, 66, 79, 82, 65, 83, 128, 80, + 73, 76, 76, 128, 80, 73, 76, 197, 80, 73, 76, 67, 82, 79, 215, 80, 73, + 75, 85, 82, 85, 128, 80, 73, 75, 79, 128, 80, 73, 71, 128, 80, 73, 199, + 80, 73, 69, 88, 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, + 128, 80, 73, 69, 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, + 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 80, + 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, + 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, + 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, + 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, + 69, 85, 80, 45, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, + 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, + 78, 73, 69, 85, 78, 128, 80, 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, + 80, 73, 69, 85, 80, 45, 75, 72, 73, 69, 85, 75, 72, 128, 80, 73, 69, 85, + 80, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, + 85, 67, 72, 128, 80, 73, 69, 85, 208, 80, 73, 69, 84, 128, 80, 73, 69, + 80, 128, 80, 73, 69, 69, 84, 128, 80, 73, 69, 69, 81, 128, 80, 73, 69, + 67, 69, 128, 80, 73, 69, 128, 80, 73, 67, 84, 85, 82, 69, 128, 80, 73, + 67, 75, 85, 208, 80, 73, 67, 75, 69, 84, 128, 80, 73, 67, 75, 128, 80, + 73, 65, 83, 85, 84, 79, 82, 85, 128, 80, 73, 65, 83, 77, 193, 80, 73, 65, + 78, 79, 128, 80, 201, 80, 72, 87, 65, 128, 80, 72, 85, 84, 72, 65, 79, + 128, 80, 72, 85, 210, 80, 72, 85, 78, 71, 128, 80, 72, 82, 65, 83, 69, + 128, 80, 72, 79, 78, 69, 83, 128, 80, 72, 79, 76, 85, 83, 128, 80, 72, + 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, 79, 65, 128, 80, 72, 79, 128, + 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, 72, 73, 78, 84, 72, 85, 128, + 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, 211, 80, 72, 73, 76, 73, 80, + 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84, 72, 73, 69, 85, 84, + 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79, 83, 128, 80, 72, 73, + 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72, 73, 69, 85, 80, 72, + 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, 85, 80, 200, 80, 72, 73, + 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, 69, 128, 80, 72, 65, 83, + 69, 45, 198, 80, 72, 65, 83, 69, 45, 195, 80, 72, 65, 83, 69, 45, 194, + 80, 72, 65, 83, 69, 45, 193, 80, 72, 65, 82, 89, 78, 71, 69, 65, 204, 80, + 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, 77, 128, 80, 72, 65, + 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80, 193, 80, 72, 65, 66, + 128, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, 71, + 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, 84, 65, 69, 128, 80, + 69, 85, 84, 128, 80, 69, 84, 82, 201, 80, 69, 84, 65, 83, 84, 79, 75, 79, + 85, 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84, + 65, 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, + 128, 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, 83, 72, 178, 80, + 69, 83, 69, 84, 193, 80, 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, + 83, 80, 69, 67, 84, 73, 86, 69, 128, 80, 69, 82, 83, 79, 78, 65, 204, 80, + 69, 82, 83, 79, 78, 128, 80, 69, 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, 206, 80, 69, 82, 83, 69, 86, 69, 82, 73, 78, 199, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 82, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 210, 80, 69, 82, 78, 73, 206, 80, 69, 82, 77, 73, 84, 84, 69, @@ -1801,849 +1851,853 @@ static const unsigned char lexicon[] = { 69, 67, 84, 193, 80, 69, 82, 67, 85, 83, 83, 73, 86, 69, 128, 80, 69, 82, 67, 69, 78, 212, 80, 69, 80, 80, 69, 82, 128, 80, 69, 80, 69, 84, 128, 80, 69, 80, 69, 212, 80, 69, 79, 82, 84, 200, 80, 69, 79, 80, 76, 69, - 128, 80, 69, 78, 84, 65, 84, 72, 76, 79, 78, 128, 80, 69, 78, 84, 65, 83, - 69, 77, 69, 128, 80, 69, 78, 84, 65, 71, 82, 65, 77, 128, 80, 69, 78, 84, - 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, 128, 80, 69, 78, 83, 73, 86, - 197, 80, 69, 78, 78, 217, 80, 69, 78, 78, 65, 78, 84, 128, 80, 69, 78, - 73, 72, 73, 128, 80, 69, 78, 71, 85, 73, 78, 128, 80, 69, 78, 71, 75, 65, - 76, 128, 80, 69, 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, 78, 67, - 73, 76, 128, 80, 69, 76, 65, 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, - 79, 206, 80, 69, 73, 84, 72, 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, - 69, 200, 80, 69, 72, 128, 80, 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, - 69, 83, 72, 73, 128, 80, 69, 69, 80, 128, 80, 69, 69, 77, 128, 80, 69, - 69, 73, 128, 80, 69, 69, 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 83, - 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 128, 80, 69, 68, 69, 83, 84, - 65, 76, 128, 80, 69, 68, 69, 83, 84, 65, 204, 80, 69, 68, 65, 204, 80, - 69, 65, 78, 85, 84, 83, 128, 80, 69, 65, 75, 211, 80, 69, 65, 67, 79, 67, - 75, 128, 80, 69, 65, 67, 72, 128, 80, 69, 65, 67, 69, 128, 80, 69, 65, - 67, 197, 80, 68, 73, 128, 80, 68, 70, 128, 80, 68, 128, 80, 67, 128, 80, - 65, 90, 69, 82, 128, 80, 65, 89, 69, 82, 79, 75, 128, 80, 65, 89, 65, 78, - 78, 65, 128, 80, 65, 89, 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, 80, - 65, 87, 206, 80, 65, 215, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, - 85, 83, 197, 80, 65, 85, 128, 80, 65, 213, 80, 65, 84, 84, 69, 82, 78, - 128, 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 65, 84, 72, 65, 75, - 75, 85, 128, 80, 65, 84, 200, 80, 65, 84, 65, 75, 128, 80, 65, 84, 65, - 72, 128, 80, 65, 84, 128, 80, 65, 83, 85, 81, 128, 80, 65, 83, 83, 80, - 79, 82, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 85, 80, - 45, 79, 85, 84, 80, 85, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, - 76, 45, 68, 79, 87, 78, 45, 79, 85, 84, 80, 85, 212, 80, 65, 83, 83, 73, - 77, 66, 65, 78, 71, 128, 80, 65, 83, 83, 69, 78, 71, 69, 210, 80, 65, 83, - 83, 69, 196, 80, 65, 83, 72, 84, 65, 128, 80, 65, 83, 72, 65, 69, 128, - 80, 65, 83, 69, 81, 128, 80, 65, 83, 65, 78, 71, 65, 206, 80, 65, 82, 85, - 77, 128, 80, 65, 82, 84, 217, 80, 65, 82, 84, 78, 69, 82, 83, 72, 73, - 208, 80, 65, 82, 84, 73, 65, 76, 76, 89, 45, 82, 69, 67, 89, 67, 76, 69, - 196, 80, 65, 82, 84, 73, 65, 204, 80, 65, 82, 84, 72, 73, 65, 206, 80, - 65, 82, 212, 80, 65, 82, 82, 79, 84, 128, 80, 65, 82, 75, 128, 80, 65, - 82, 73, 67, 72, 79, 78, 128, 80, 65, 82, 69, 83, 84, 73, 71, 77, 69, 78, - 79, 206, 80, 65, 82, 69, 82, 69, 78, 128, 80, 65, 82, 69, 78, 84, 72, 69, - 83, 73, 83, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 80, 65, 82, - 69, 78, 84, 72, 69, 83, 69, 211, 80, 65, 82, 65, 80, 72, 82, 65, 83, 197, - 80, 65, 82, 65, 76, 76, 69, 76, 79, 71, 82, 65, 77, 128, 80, 65, 82, 65, - 76, 76, 69, 76, 128, 80, 65, 82, 65, 76, 76, 69, 204, 80, 65, 82, 65, 75, - 76, 73, 84, 73, 75, 73, 128, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 201, - 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 193, 80, 65, 82, 65, 71, 82, 65, - 80, 72, 85, 211, 80, 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 80, 65, - 82, 65, 71, 82, 65, 80, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 200, 80, - 65, 82, 65, 67, 72, 85, 84, 69, 128, 80, 65, 82, 65, 128, 80, 65, 82, - 128, 80, 65, 80, 89, 82, 85, 83, 128, 80, 65, 80, 69, 82, 67, 76, 73, 80, - 83, 128, 80, 65, 80, 69, 82, 67, 76, 73, 80, 128, 80, 65, 80, 69, 82, - 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, 80, 65, 208, 80, 65, 207, 80, - 65, 78, 89, 85, 75, 85, 128, 80, 65, 78, 89, 73, 75, 85, 128, 80, 65, 78, - 89, 69, 67, 69, 75, 128, 80, 65, 78, 89, 65, 78, 71, 71, 65, 128, 80, 65, - 78, 89, 65, 75, 82, 65, 128, 80, 65, 78, 84, 73, 128, 80, 65, 78, 83, 73, - 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 65, 78, 83, 73, 79, 83, 45, 75, - 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 80, 65, 78, 79, 78, - 71, 79, 78, 65, 78, 128, 80, 65, 78, 79, 76, 79, 78, 71, 128, 80, 65, 78, - 71, 87, 73, 83, 65, 68, 128, 80, 65, 78, 71, 82, 65, 78, 71, 75, 69, 80, - 128, 80, 65, 78, 71, 79, 76, 65, 84, 128, 80, 65, 78, 71, 76, 79, 78, 71, - 128, 80, 65, 78, 71, 76, 65, 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, - 128, 80, 65, 78, 71, 75, 65, 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, - 128, 80, 65, 78, 71, 128, 80, 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, - 80, 65, 78, 68, 193, 80, 65, 78, 67, 65, 75, 69, 83, 128, 80, 65, 78, 65, - 77, 128, 80, 65, 78, 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, 128, - 80, 65, 206, 80, 65, 77, 85, 78, 71, 75, 65, 72, 128, 80, 65, 77, 85, 68, - 80, 79, 68, 128, 80, 65, 77, 83, 72, 65, 69, 128, 80, 65, 77, 80, 72, 89, - 76, 73, 65, 206, 80, 65, 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, 77, 69, - 80, 69, 84, 128, 80, 65, 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, 65, 68, - 65, 128, 80, 65, 77, 65, 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, 128, - 80, 65, 76, 79, 67, 72, 75, 65, 128, 80, 65, 76, 77, 89, 82, 69, 78, 197, - 80, 65, 76, 77, 211, 80, 65, 76, 77, 128, 80, 65, 76, 205, 80, 65, 76, - 76, 65, 87, 65, 128, 80, 65, 76, 76, 65, 83, 128, 80, 65, 76, 201, 80, - 65, 76, 69, 84, 84, 69, 128, 80, 65, 76, 65, 85, 78, 199, 80, 65, 76, 65, - 84, 65, 76, 73, 90, 69, 196, 80, 65, 76, 65, 84, 65, 76, 73, 90, 65, 84, - 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 204, 80, 65, 75, 80, 65, 203, - 80, 65, 73, 89, 65, 78, 78, 79, 73, 128, 80, 65, 73, 82, 84, 72, 82, 65, - 128, 80, 65, 73, 82, 69, 196, 80, 65, 73, 78, 84, 66, 82, 85, 83, 72, - 128, 80, 65, 73, 128, 80, 65, 72, 76, 65, 86, 201, 80, 65, 72, 128, 80, - 65, 71, 79, 68, 65, 128, 80, 65, 71, 69, 83, 128, 80, 65, 71, 69, 82, - 128, 80, 65, 71, 197, 80, 65, 68, 77, 193, 80, 65, 68, 68, 76, 197, 80, - 65, 68, 68, 73, 78, 199, 80, 65, 68, 193, 80, 65, 68, 128, 80, 65, 67, - 75, 73, 78, 71, 128, 80, 65, 67, 75, 65, 71, 69, 128, 80, 65, 65, 84, 85, - 128, 80, 65, 65, 83, 69, 78, 84, 79, 128, 80, 65, 65, 82, 65, 77, 128, - 80, 65, 65, 82, 65, 69, 128, 80, 65, 65, 77, 128, 80, 65, 65, 73, 128, - 80, 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, 80, 50, 128, - 80, 48, 49, 49, 128, 80, 48, 49, 48, 128, 80, 48, 48, 57, 128, 80, 48, - 48, 56, 128, 80, 48, 48, 55, 128, 80, 48, 48, 54, 128, 80, 48, 48, 53, - 128, 80, 48, 48, 52, 128, 80, 48, 48, 51, 65, 128, 80, 48, 48, 51, 128, - 80, 48, 48, 50, 128, 80, 48, 48, 49, 65, 128, 80, 48, 48, 49, 128, 79, - 89, 83, 84, 69, 82, 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, - 78, 78, 65, 128, 79, 88, 73, 65, 128, 79, 88, 73, 193, 79, 88, 69, 73, - 65, 201, 79, 88, 69, 73, 193, 79, 87, 76, 128, 79, 86, 69, 82, 82, 73, - 68, 69, 128, 79, 86, 69, 82, 76, 79, 78, 199, 79, 86, 69, 82, 76, 73, 78, - 69, 128, 79, 86, 69, 82, 76, 65, 89, 128, 79, 86, 69, 82, 76, 65, 217, - 79, 86, 69, 82, 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76, 65, 80, - 128, 79, 86, 69, 82, 76, 65, 73, 68, 128, 79, 86, 69, 82, 72, 69, 65, 84, - 69, 196, 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 76, 128, 79, 86, - 65, 204, 79, 85, 84, 76, 73, 78, 69, 196, 79, 85, 84, 76, 73, 78, 69, - 128, 79, 85, 84, 69, 210, 79, 85, 84, 66, 79, 216, 79, 85, 78, 75, 73, - 193, 79, 85, 78, 67, 69, 128, 79, 85, 78, 67, 197, 79, 84, 85, 128, 79, - 84, 84, 79, 77, 65, 206, 79, 84, 84, 69, 82, 128, 79, 84, 84, 65, 86, - 193, 79, 84, 84, 128, 79, 84, 72, 69, 82, 211, 79, 84, 72, 69, 210, 79, - 84, 72, 65, 76, 65, 206, 79, 84, 72, 65, 76, 128, 79, 83, 77, 65, 78, 89, - 193, 79, 83, 67, 128, 79, 83, 65, 71, 197, 79, 82, 84, 72, 79, 71, 79, - 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, 216, 79, 82, 78, 65, 84, 197, - 79, 82, 78, 65, 77, 69, 78, 84, 83, 128, 79, 82, 78, 65, 77, 69, 78, 84, - 128, 79, 82, 78, 65, 77, 69, 78, 212, 79, 82, 75, 72, 79, 206, 79, 82, - 73, 89, 193, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, 73, 71, 73, 78, - 128, 79, 82, 69, 45, 50, 128, 79, 82, 68, 73, 78, 65, 204, 79, 82, 68, - 69, 210, 79, 82, 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, 85, 84, 65, 78, - 128, 79, 82, 65, 78, 71, 197, 79, 80, 84, 73, 79, 206, 79, 80, 84, 73, - 67, 65, 204, 79, 80, 80, 82, 69, 83, 83, 73, 79, 78, 128, 79, 80, 80, 79, - 83, 73, 84, 73, 79, 78, 128, 79, 80, 80, 79, 83, 73, 78, 199, 79, 80, 80, - 79, 83, 69, 128, 79, 80, 72, 73, 85, 67, 72, 85, 83, 128, 79, 80, 69, 82, - 65, 84, 79, 82, 128, 79, 80, 69, 82, 65, 84, 79, 210, 79, 80, 69, 82, 65, - 84, 73, 78, 199, 79, 80, 69, 78, 73, 78, 199, 79, 80, 69, 78, 45, 80, - 128, 79, 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, 79, 80, 69, 78, - 45, 79, 128, 79, 80, 69, 78, 45, 207, 79, 80, 69, 78, 45, 72, 69, 65, 68, - 69, 196, 79, 80, 69, 78, 45, 67, 73, 82, 67, 85, 73, 84, 45, 79, 85, 84, - 80, 85, 212, 79, 80, 69, 78, 128, 79, 79, 90, 69, 128, 79, 79, 89, 65, - 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, 77, 85, 128, 79, 79, 72, 128, - 79, 79, 69, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, 79, 78, 85, - 128, 79, 78, 83, 85, 128, 79, 78, 78, 128, 79, 78, 75, 65, 82, 128, 79, - 78, 73, 79, 78, 128, 79, 78, 69, 83, 69, 76, 70, 128, 79, 78, 69, 45, 87, - 65, 217, 79, 78, 69, 45, 84, 72, 73, 82, 84, 89, 128, 79, 78, 69, 45, 80, - 73, 69, 67, 197, 79, 78, 69, 45, 76, 73, 78, 197, 79, 78, 69, 45, 72, 85, - 78, 68, 82, 69, 68, 45, 65, 78, 68, 45, 83, 73, 88, 84, 73, 69, 84, 72, - 128, 79, 78, 67, 79, 77, 73, 78, 199, 79, 78, 65, 80, 128, 79, 78, 45, - 79, 70, 198, 79, 77, 73, 83, 83, 73, 79, 206, 79, 77, 73, 67, 82, 79, 78, - 128, 79, 77, 73, 67, 82, 79, 206, 79, 77, 69, 71, 65, 128, 79, 77, 69, - 71, 193, 79, 77, 65, 76, 79, 78, 128, 79, 76, 73, 86, 69, 128, 79, 76, - 73, 71, 79, 206, 79, 76, 68, 128, 79, 75, 84, 207, 79, 75, 65, 82, 65, - 128, 79, 75, 65, 82, 193, 79, 74, 73, 66, 87, 65, 217, 79, 74, 69, 79, - 78, 128, 79, 73, 78, 128, 79, 73, 76, 128, 79, 73, 204, 79, 72, 77, 128, - 79, 72, 205, 79, 71, 82, 69, 128, 79, 71, 79, 78, 69, 75, 128, 79, 71, - 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, 70, 73, 67, 69, 82, 128, - 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, 197, 79, 70, 70, 128, - 79, 69, 89, 128, 79, 69, 82, 128, 79, 69, 75, 128, 79, 69, 69, 128, 79, - 68, 69, 78, 128, 79, 68, 68, 128, 79, 68, 196, 79, 67, 84, 79, 80, 85, - 83, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, 84, 69, 212, 79, 67, - 84, 65, 71, 79, 78, 65, 204, 79, 67, 84, 65, 71, 79, 78, 128, 79, 67, - 210, 79, 67, 76, 79, 67, 75, 128, 79, 67, 67, 76, 85, 83, 73, 79, 78, - 128, 79, 66, 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, 79, 66, 83, 69, 82, - 86, 69, 210, 79, 66, 79, 76, 211, 79, 66, 79, 204, 79, 66, 79, 70, 73, - 76, 73, 128, 79, 66, 76, 73, 81, 85, 197, 79, 66, 74, 69, 67, 212, 79, - 66, 69, 76, 85, 83, 128, 79, 66, 69, 76, 79, 83, 128, 79, 66, 128, 79, - 65, 89, 128, 79, 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, 76, 73, 128, - 79, 193, 79, 48, 53, 49, 128, 79, 48, 53, 48, 66, 128, 79, 48, 53, 48, - 65, 128, 79, 48, 53, 48, 128, 79, 48, 52, 57, 128, 79, 48, 52, 56, 128, - 79, 48, 52, 55, 128, 79, 48, 52, 54, 128, 79, 48, 52, 53, 128, 79, 48, - 52, 52, 128, 79, 48, 52, 51, 128, 79, 48, 52, 50, 128, 79, 48, 52, 49, - 128, 79, 48, 52, 48, 128, 79, 48, 51, 57, 128, 79, 48, 51, 56, 128, 79, - 48, 51, 55, 128, 79, 48, 51, 54, 68, 128, 79, 48, 51, 54, 67, 128, 79, - 48, 51, 54, 66, 128, 79, 48, 51, 54, 65, 128, 79, 48, 51, 54, 128, 79, - 48, 51, 53, 128, 79, 48, 51, 52, 128, 79, 48, 51, 51, 65, 128, 79, 48, - 51, 51, 128, 79, 48, 51, 50, 128, 79, 48, 51, 49, 128, 79, 48, 51, 48, - 65, 128, 79, 48, 51, 48, 128, 79, 48, 50, 57, 65, 128, 79, 48, 50, 57, - 128, 79, 48, 50, 56, 128, 79, 48, 50, 55, 128, 79, 48, 50, 54, 128, 79, - 48, 50, 53, 65, 128, 79, 48, 50, 53, 128, 79, 48, 50, 52, 65, 128, 79, - 48, 50, 52, 128, 79, 48, 50, 51, 128, 79, 48, 50, 50, 128, 79, 48, 50, - 49, 128, 79, 48, 50, 48, 65, 128, 79, 48, 50, 48, 128, 79, 48, 49, 57, - 65, 128, 79, 48, 49, 57, 128, 79, 48, 49, 56, 128, 79, 48, 49, 55, 128, - 79, 48, 49, 54, 128, 79, 48, 49, 53, 128, 79, 48, 49, 52, 128, 79, 48, - 49, 51, 128, 79, 48, 49, 50, 128, 79, 48, 49, 49, 128, 79, 48, 49, 48, - 67, 128, 79, 48, 49, 48, 66, 128, 79, 48, 49, 48, 65, 128, 79, 48, 49, - 48, 128, 79, 48, 48, 57, 128, 79, 48, 48, 56, 128, 79, 48, 48, 55, 128, - 79, 48, 48, 54, 70, 128, 79, 48, 48, 54, 69, 128, 79, 48, 48, 54, 68, - 128, 79, 48, 48, 54, 67, 128, 79, 48, 48, 54, 66, 128, 79, 48, 48, 54, - 65, 128, 79, 48, 48, 54, 128, 79, 48, 48, 53, 65, 128, 79, 48, 48, 53, - 128, 79, 48, 48, 52, 128, 79, 48, 48, 51, 128, 79, 48, 48, 50, 128, 79, - 48, 48, 49, 65, 128, 79, 48, 48, 49, 128, 79, 45, 89, 69, 128, 79, 45, - 79, 45, 73, 128, 79, 45, 69, 128, 78, 90, 89, 88, 128, 78, 90, 89, 84, - 128, 78, 90, 89, 82, 88, 128, 78, 90, 89, 82, 128, 78, 90, 89, 80, 128, - 78, 90, 89, 128, 78, 90, 85, 88, 128, 78, 90, 85, 82, 88, 128, 78, 90, - 85, 82, 128, 78, 90, 85, 81, 128, 78, 90, 85, 80, 128, 78, 90, 85, 79, - 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 206, 78, 90, 85, 128, 78, 90, - 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, 73, 84, - 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, 69, 80, - 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, 69, 88, 128, 78, 90, - 69, 85, 77, 128, 78, 90, 69, 128, 78, 90, 65, 88, 128, 78, 90, 65, 84, - 128, 78, 90, 65, 81, 128, 78, 90, 65, 80, 128, 78, 90, 65, 128, 78, 90, - 193, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, 89, 85, 85, 128, 78, - 89, 85, 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, 78, 89, - 85, 79, 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 78, 128, 78, 89, 85, - 69, 128, 78, 89, 85, 128, 78, 89, 79, 88, 128, 78, 89, 79, 84, 128, 78, - 89, 79, 80, 128, 78, 89, 79, 79, 128, 78, 89, 79, 78, 128, 78, 89, 79, - 65, 128, 78, 89, 79, 128, 78, 89, 74, 65, 128, 78, 89, 73, 88, 128, 78, - 89, 73, 84, 128, 78, 89, 73, 212, 78, 89, 73, 211, 78, 89, 73, 210, 78, - 89, 73, 80, 128, 78, 89, 73, 78, 45, 68, 79, 128, 78, 89, 73, 78, 128, - 78, 89, 73, 73, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, 84, 128, - 78, 89, 73, 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 65, 75, 69, 78, - 199, 78, 89, 73, 128, 78, 89, 201, 78, 89, 72, 65, 128, 78, 89, 69, 84, - 128, 78, 89, 69, 212, 78, 89, 69, 78, 128, 78, 89, 69, 72, 128, 78, 89, - 69, 200, 78, 89, 69, 69, 128, 78, 89, 69, 128, 78, 89, 196, 78, 89, 67, - 65, 128, 78, 89, 65, 85, 128, 78, 89, 65, 74, 128, 78, 89, 65, 73, 128, - 78, 89, 65, 72, 128, 78, 89, 65, 69, 77, 65, 69, 128, 78, 89, 65, 65, - 128, 78, 87, 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, 128, 78, 87, - 73, 128, 78, 87, 69, 128, 78, 87, 65, 65, 128, 78, 87, 65, 128, 78, 87, - 128, 78, 86, 128, 78, 85, 88, 128, 78, 85, 85, 78, 128, 78, 85, 85, 128, - 78, 85, 84, 73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, 212, 78, 85, - 82, 88, 128, 78, 85, 82, 128, 78, 85, 80, 128, 78, 85, 79, 88, 128, 78, - 85, 79, 80, 128, 78, 85, 79, 128, 78, 85, 78, 85, 90, 128, 78, 85, 78, - 85, 218, 78, 85, 78, 71, 128, 78, 85, 78, 65, 86, 85, 212, 78, 85, 78, - 65, 86, 73, 203, 78, 85, 78, 128, 78, 85, 206, 78, 85, 77, 69, 82, 207, - 78, 85, 77, 69, 82, 65, 84, 79, 210, 78, 85, 77, 69, 82, 65, 204, 78, 85, - 77, 66, 69, 82, 83, 128, 78, 85, 77, 66, 69, 82, 128, 78, 85, 77, 128, - 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, 85, 76, 128, 78, 85, 75, 84, - 65, 128, 78, 85, 75, 84, 193, 78, 85, 69, 78, 71, 128, 78, 85, 69, 128, - 78, 85, 66, 73, 65, 206, 78, 85, 65, 69, 128, 78, 85, 49, 49, 128, 78, - 85, 49, 177, 78, 85, 48, 50, 50, 65, 128, 78, 85, 48, 50, 50, 128, 78, - 85, 48, 50, 49, 128, 78, 85, 48, 50, 48, 128, 78, 85, 48, 49, 57, 128, - 78, 85, 48, 49, 56, 65, 128, 78, 85, 48, 49, 56, 128, 78, 85, 48, 49, 55, - 128, 78, 85, 48, 49, 54, 128, 78, 85, 48, 49, 53, 128, 78, 85, 48, 49, - 52, 128, 78, 85, 48, 49, 51, 128, 78, 85, 48, 49, 50, 128, 78, 85, 48, - 49, 49, 65, 128, 78, 85, 48, 49, 49, 128, 78, 85, 48, 49, 48, 65, 128, - 78, 85, 48, 49, 48, 128, 78, 85, 48, 48, 57, 128, 78, 85, 48, 48, 56, - 128, 78, 85, 48, 48, 55, 128, 78, 85, 48, 48, 54, 128, 78, 85, 48, 48, - 53, 128, 78, 85, 48, 48, 52, 128, 78, 85, 48, 48, 51, 128, 78, 85, 48, - 48, 50, 128, 78, 85, 48, 48, 49, 128, 78, 85, 45, 51, 128, 78, 85, 45, - 50, 128, 78, 85, 45, 49, 128, 78, 84, 88, 73, 86, 128, 78, 84, 88, 65, - 128, 78, 84, 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, 85, 74, 128, 78, - 84, 213, 78, 84, 83, 65, 85, 128, 78, 84, 83, 65, 128, 78, 84, 79, 81, - 80, 69, 78, 128, 78, 84, 79, 71, 128, 78, 84, 79, 199, 78, 84, 73, 69, - 197, 78, 84, 72, 65, 85, 128, 78, 84, 69, 85, 78, 71, 66, 65, 128, 78, - 84, 69, 85, 77, 128, 78, 84, 69, 78, 128, 78, 84, 69, 69, 128, 78, 84, - 65, 80, 128, 78, 84, 65, 208, 78, 84, 65, 65, 128, 78, 84, 65, 128, 78, - 83, 85, 79, 212, 78, 83, 85, 78, 128, 78, 83, 85, 77, 128, 78, 83, 79, - 77, 128, 78, 83, 73, 69, 69, 84, 128, 78, 83, 73, 69, 69, 80, 128, 78, - 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, 128, 78, 83, 72, 85, 212, 78, - 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, 69, 128, 78, 83, 72, 73, 69, 69, - 128, 78, 83, 72, 69, 69, 128, 78, 83, 72, 65, 81, 128, 78, 83, 72, 65, - 128, 78, 83, 69, 85, 65, 69, 78, 128, 78, 83, 69, 78, 128, 78, 83, 65, - 128, 78, 82, 89, 88, 128, 78, 82, 89, 84, 128, 78, 82, 89, 82, 88, 128, - 78, 82, 89, 82, 128, 78, 82, 89, 80, 128, 78, 82, 89, 128, 78, 82, 85, - 88, 128, 78, 82, 85, 84, 128, 78, 82, 85, 82, 88, 128, 78, 82, 85, 82, - 128, 78, 82, 85, 80, 128, 78, 82, 85, 65, 128, 78, 82, 85, 128, 78, 82, - 79, 88, 128, 78, 82, 79, 80, 128, 78, 82, 79, 128, 78, 82, 69, 88, 128, - 78, 82, 69, 84, 128, 78, 82, 69, 211, 78, 82, 69, 80, 128, 78, 82, 69, - 128, 78, 82, 65, 88, 128, 78, 82, 65, 84, 128, 78, 82, 65, 80, 128, 78, - 82, 65, 128, 78, 81, 73, 71, 128, 78, 81, 65, 128, 78, 80, 76, 65, 128, - 78, 80, 65, 128, 78, 79, 89, 128, 78, 79, 88, 128, 78, 79, 87, 67, 128, - 78, 79, 86, 73, 76, 69, 128, 78, 79, 86, 69, 77, 66, 69, 82, 128, 78, 79, - 84, 84, 79, 128, 78, 79, 84, 69, 83, 128, 78, 79, 84, 69, 72, 69, 65, 68, - 128, 78, 79, 84, 69, 72, 69, 65, 196, 78, 79, 84, 69, 66, 79, 79, 75, - 128, 78, 79, 84, 69, 66, 79, 79, 203, 78, 79, 84, 69, 128, 78, 79, 84, - 197, 78, 79, 84, 67, 72, 69, 196, 78, 79, 84, 67, 72, 128, 78, 79, 84, - 65, 84, 73, 79, 206, 78, 79, 84, 128, 78, 79, 212, 78, 79, 83, 69, 128, - 78, 79, 83, 197, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, 82, 84, 72, - 69, 82, 206, 78, 79, 82, 84, 72, 69, 65, 83, 84, 45, 80, 79, 73, 78, 84, - 73, 78, 199, 78, 79, 82, 77, 65, 204, 78, 79, 82, 68, 73, 195, 78, 79, - 210, 78, 79, 80, 128, 78, 79, 79, 78, 85, 128, 78, 79, 79, 128, 78, 79, - 78, 70, 79, 82, 75, 73, 78, 71, 128, 78, 79, 78, 45, 80, 79, 84, 65, 66, - 76, 197, 78, 79, 78, 45, 74, 79, 73, 78, 69, 82, 128, 78, 79, 78, 45, 66, - 82, 69, 65, 75, 73, 78, 199, 78, 79, 78, 128, 78, 79, 77, 73, 83, 77, - 193, 78, 79, 77, 73, 78, 65, 204, 78, 79, 75, 72, 85, 75, 128, 78, 79, - 68, 69, 128, 78, 79, 65, 128, 78, 79, 45, 66, 82, 69, 65, 203, 78, 79, - 45, 53, 128, 78, 79, 45, 52, 128, 78, 79, 45, 51, 128, 78, 79, 45, 50, - 128, 78, 79, 45, 49, 128, 78, 78, 85, 85, 128, 78, 78, 85, 128, 78, 78, - 79, 79, 128, 78, 78, 79, 128, 78, 78, 78, 85, 85, 128, 78, 78, 78, 85, - 128, 78, 78, 78, 79, 79, 128, 78, 78, 78, 79, 128, 78, 78, 78, 73, 73, - 128, 78, 78, 78, 73, 128, 78, 78, 78, 69, 69, 128, 78, 78, 78, 69, 128, - 78, 78, 78, 65, 85, 128, 78, 78, 78, 65, 73, 128, 78, 78, 78, 65, 65, - 128, 78, 78, 78, 65, 128, 78, 78, 78, 128, 78, 78, 72, 65, 128, 78, 78, - 71, 79, 79, 128, 78, 78, 71, 79, 128, 78, 78, 71, 73, 73, 128, 78, 78, - 71, 73, 128, 78, 78, 71, 65, 65, 128, 78, 78, 71, 65, 128, 78, 78, 71, - 128, 78, 78, 66, 83, 80, 128, 78, 77, 128, 78, 76, 65, 85, 128, 78, 76, - 48, 50, 48, 128, 78, 76, 48, 49, 57, 128, 78, 76, 48, 49, 56, 128, 78, - 76, 48, 49, 55, 65, 128, 78, 76, 48, 49, 55, 128, 78, 76, 48, 49, 54, - 128, 78, 76, 48, 49, 53, 128, 78, 76, 48, 49, 52, 128, 78, 76, 48, 49, - 51, 128, 78, 76, 48, 49, 50, 128, 78, 76, 48, 49, 49, 128, 78, 76, 48, - 49, 48, 128, 78, 76, 48, 48, 57, 128, 78, 76, 48, 48, 56, 128, 78, 76, - 48, 48, 55, 128, 78, 76, 48, 48, 54, 128, 78, 76, 48, 48, 53, 65, 128, - 78, 76, 48, 48, 53, 128, 78, 76, 48, 48, 52, 128, 78, 76, 48, 48, 51, - 128, 78, 76, 48, 48, 50, 128, 78, 76, 48, 48, 49, 128, 78, 76, 128, 78, - 75, 79, 77, 128, 78, 75, 207, 78, 75, 73, 78, 68, 73, 128, 78, 75, 65, - 85, 128, 78, 75, 65, 65, 82, 65, 69, 128, 78, 75, 65, 128, 78, 74, 89, - 88, 128, 78, 74, 89, 84, 128, 78, 74, 89, 82, 88, 128, 78, 74, 89, 82, - 128, 78, 74, 89, 80, 128, 78, 74, 89, 128, 78, 74, 85, 88, 128, 78, 74, - 85, 82, 88, 128, 78, 74, 85, 82, 128, 78, 74, 85, 81, 65, 128, 78, 74, - 85, 80, 128, 78, 74, 85, 79, 88, 128, 78, 74, 85, 79, 128, 78, 74, 85, - 69, 81, 128, 78, 74, 85, 65, 69, 128, 78, 74, 85, 128, 78, 74, 79, 88, - 128, 78, 74, 79, 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 79, 128, 78, - 74, 79, 128, 78, 74, 73, 88, 128, 78, 74, 73, 84, 128, 78, 74, 73, 80, - 128, 78, 74, 73, 69, 88, 128, 78, 74, 73, 69, 84, 128, 78, 74, 73, 69, - 80, 128, 78, 74, 73, 69, 69, 128, 78, 74, 73, 69, 128, 78, 74, 73, 128, - 78, 74, 201, 78, 74, 69, 85, 88, 128, 78, 74, 69, 85, 84, 128, 78, 74, - 69, 85, 65, 69, 78, 65, 128, 78, 74, 69, 85, 65, 69, 77, 128, 78, 74, 69, - 69, 69, 69, 128, 78, 74, 69, 69, 128, 78, 74, 69, 197, 78, 74, 69, 128, - 78, 74, 65, 81, 128, 78, 74, 65, 80, 128, 78, 74, 65, 69, 77, 76, 73, - 128, 78, 74, 65, 69, 77, 128, 78, 74, 65, 65, 128, 78, 73, 88, 128, 78, - 73, 84, 82, 69, 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85, 71, 85, - 128, 78, 73, 80, 128, 78, 73, 78, 84, 72, 128, 78, 73, 78, 69, 84, 89, - 128, 78, 73, 78, 69, 84, 217, 78, 73, 78, 69, 84, 69, 69, 78, 128, 78, - 73, 78, 69, 84, 69, 69, 206, 78, 73, 78, 69, 45, 84, 72, 73, 82, 84, 89, - 128, 78, 73, 78, 197, 78, 73, 78, 68, 65, 50, 128, 78, 73, 78, 68, 65, - 178, 78, 73, 78, 57, 128, 78, 73, 78, 128, 78, 73, 77, 128, 78, 73, 205, - 78, 73, 75, 79, 76, 83, 66, 85, 82, 199, 78, 73, 75, 72, 65, 72, 73, 84, - 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 75, 65, 128, 78, 73, 72, - 83, 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, 65, 77, 73, 78, 128, 78, - 73, 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, 72, 84, 128, 78, 73, 71, - 72, 212, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 78, 73, 69, 88, 128, - 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 78, 73, 69, 85, 78, - 45, 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, 78, 45, 83, 73, 79, - 83, 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, 128, 78, 73, 69, 85, - 78, 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, 45, 80, 65, 78, 83, - 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128, 78, - 73, 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, 69, 85, 78, 45, 67, - 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, 73, 69, 85, 67, 72, - 128, 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78, 73, - 66, 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 73, 45, 84, 69, 128, 78, - 73, 45, 55, 128, 78, 73, 45, 54, 128, 78, 73, 45, 53, 128, 78, 73, 45, - 52, 128, 78, 73, 45, 51, 128, 78, 73, 45, 50, 128, 78, 73, 45, 49, 128, - 78, 72, 85, 69, 128, 78, 72, 74, 65, 128, 78, 72, 128, 78, 71, 89, 69, - 128, 78, 71, 86, 69, 128, 78, 71, 85, 85, 128, 78, 71, 85, 79, 88, 128, - 78, 71, 85, 79, 84, 128, 78, 71, 85, 79, 128, 78, 71, 85, 65, 78, 128, - 78, 71, 85, 65, 69, 84, 128, 78, 71, 85, 65, 69, 128, 78, 71, 79, 88, - 128, 78, 71, 79, 85, 128, 78, 71, 79, 213, 78, 71, 79, 84, 128, 78, 71, - 79, 81, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, 128, 78, 71, 79, 77, - 128, 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, 78, 71, 207, 78, 71, - 75, 89, 69, 69, 128, 78, 71, 75, 87, 65, 69, 78, 128, 78, 71, 75, 85, 80, - 128, 78, 71, 75, 85, 78, 128, 78, 71, 75, 85, 77, 128, 78, 71, 75, 85, - 69, 78, 90, 69, 85, 77, 128, 78, 71, 75, 85, 197, 78, 71, 75, 73, 78, 68, - 201, 78, 71, 75, 73, 69, 69, 128, 78, 71, 75, 69, 85, 88, 128, 78, 71, - 75, 69, 85, 82, 73, 128, 78, 71, 75, 69, 85, 65, 69, 81, 128, 78, 71, 75, - 69, 85, 65, 69, 77, 128, 78, 71, 75, 65, 81, 128, 78, 71, 75, 65, 80, - 128, 78, 71, 75, 65, 65, 77, 73, 128, 78, 71, 75, 65, 128, 78, 71, 73, - 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71, 73, 69, 128, 78, 71, 72, - 65, 128, 78, 71, 71, 87, 65, 69, 78, 128, 78, 71, 71, 85, 82, 65, 69, - 128, 78, 71, 71, 85, 80, 128, 78, 71, 71, 85, 79, 81, 128, 78, 71, 71, - 85, 79, 209, 78, 71, 71, 85, 79, 78, 128, 78, 71, 71, 85, 79, 77, 128, - 78, 71, 71, 85, 77, 128, 78, 71, 71, 85, 69, 69, 84, 128, 78, 71, 71, 85, - 65, 69, 83, 72, 65, 197, 78, 71, 71, 85, 65, 69, 206, 78, 71, 71, 85, 65, - 128, 78, 71, 71, 85, 128, 78, 71, 71, 79, 79, 128, 78, 71, 71, 79, 128, - 78, 71, 71, 73, 128, 78, 71, 71, 69, 85, 88, 128, 78, 71, 71, 69, 85, 65, - 69, 84, 128, 78, 71, 71, 69, 85, 65, 69, 128, 78, 71, 71, 69, 213, 78, - 71, 71, 69, 78, 128, 78, 71, 71, 69, 69, 84, 128, 78, 71, 71, 69, 69, 69, - 69, 128, 78, 71, 71, 69, 69, 128, 78, 71, 71, 69, 128, 78, 71, 71, 65, - 80, 128, 78, 71, 71, 65, 65, 77, 65, 69, 128, 78, 71, 71, 65, 65, 77, - 128, 78, 71, 71, 65, 65, 128, 78, 71, 71, 128, 78, 71, 69, 88, 128, 78, - 71, 69, 85, 82, 69, 85, 84, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78, - 128, 78, 71, 69, 69, 128, 78, 71, 69, 65, 68, 65, 76, 128, 78, 71, 65, - 88, 128, 78, 71, 65, 85, 128, 78, 71, 65, 84, 128, 78, 71, 65, 211, 78, - 71, 65, 81, 128, 78, 71, 65, 80, 128, 78, 71, 65, 78, 71, 85, 128, 78, - 71, 65, 78, 128, 78, 71, 65, 73, 128, 78, 71, 65, 72, 128, 78, 71, 65, - 65, 73, 128, 78, 71, 193, 78, 70, 128, 78, 69, 88, 212, 78, 69, 88, 128, - 78, 69, 87, 83, 80, 65, 80, 69, 82, 128, 78, 69, 87, 76, 73, 78, 69, 128, - 78, 69, 87, 76, 73, 78, 197, 78, 69, 87, 193, 78, 69, 87, 128, 78, 69, - 215, 78, 69, 85, 84, 82, 65, 76, 128, 78, 69, 85, 84, 82, 65, 204, 78, - 69, 85, 84, 69, 82, 128, 78, 69, 84, 87, 79, 82, 75, 69, 196, 78, 69, - 212, 78, 69, 83, 84, 69, 196, 78, 69, 83, 83, 85, 83, 128, 78, 69, 82, + 128, 80, 69, 79, 80, 76, 197, 80, 69, 78, 84, 65, 84, 72, 76, 79, 78, + 128, 80, 69, 78, 84, 65, 83, 69, 77, 69, 128, 80, 69, 78, 84, 65, 71, 82, + 65, 77, 128, 80, 69, 78, 84, 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, + 128, 80, 69, 78, 83, 73, 86, 197, 80, 69, 78, 78, 217, 80, 69, 78, 78, + 65, 78, 84, 128, 80, 69, 78, 73, 72, 73, 128, 80, 69, 78, 71, 85, 73, 78, + 128, 80, 69, 78, 71, 75, 65, 76, 128, 80, 69, 78, 69, 84, 82, 65, 84, 73, + 79, 78, 128, 80, 69, 78, 67, 73, 76, 128, 80, 69, 206, 80, 69, 76, 65, + 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, 79, 206, 80, 69, 73, 84, 72, + 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, 69, 200, 80, 69, 72, 128, 80, + 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, 69, 83, 72, 73, 128, 80, 69, + 69, 80, 128, 80, 69, 69, 77, 128, 80, 69, 69, 73, 128, 80, 69, 69, 128, + 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 83, 128, 80, 69, 68, 69, 83, 84, + 82, 73, 65, 78, 128, 80, 69, 68, 69, 83, 84, 65, 76, 128, 80, 69, 68, 69, + 83, 84, 65, 204, 80, 69, 68, 65, 204, 80, 69, 65, 78, 85, 84, 83, 128, + 80, 69, 65, 75, 211, 80, 69, 65, 67, 79, 67, 75, 128, 80, 69, 65, 67, 72, + 128, 80, 69, 65, 67, 69, 128, 80, 69, 65, 67, 197, 80, 68, 73, 128, 80, + 68, 70, 128, 80, 68, 128, 80, 67, 128, 80, 65, 90, 69, 82, 128, 80, 65, + 89, 69, 82, 79, 75, 128, 80, 65, 89, 65, 78, 78, 65, 128, 80, 65, 89, + 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, 80, 65, 87, 206, 80, 65, 215, + 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, 85, 83, 197, 80, 65, 85, + 128, 80, 65, 213, 80, 65, 84, 84, 217, 80, 65, 84, 84, 69, 82, 78, 128, + 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 65, 84, 72, 65, 75, 75, + 85, 128, 80, 65, 84, 200, 80, 65, 84, 65, 75, 128, 80, 65, 84, 65, 72, + 128, 80, 65, 84, 128, 80, 65, 83, 85, 81, 128, 80, 65, 83, 83, 80, 79, + 82, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 85, 80, 45, + 79, 85, 84, 80, 85, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, + 45, 68, 79, 87, 78, 45, 79, 85, 84, 80, 85, 212, 80, 65, 83, 83, 73, 77, + 66, 65, 78, 71, 128, 80, 65, 83, 83, 69, 78, 71, 69, 210, 80, 65, 83, 83, + 69, 196, 80, 65, 83, 72, 84, 65, 128, 80, 65, 83, 72, 65, 69, 128, 80, + 65, 83, 69, 81, 128, 80, 65, 83, 65, 78, 71, 65, 206, 80, 65, 82, 85, 77, + 128, 80, 65, 82, 84, 217, 80, 65, 82, 84, 78, 69, 82, 83, 72, 73, 208, + 80, 65, 82, 84, 73, 65, 76, 76, 89, 45, 82, 69, 67, 89, 67, 76, 69, 196, + 80, 65, 82, 84, 73, 65, 204, 80, 65, 82, 84, 72, 73, 65, 206, 80, 65, 82, + 212, 80, 65, 82, 82, 79, 84, 128, 80, 65, 82, 75, 128, 80, 65, 82, 73, + 67, 72, 79, 78, 128, 80, 65, 82, 69, 83, 84, 73, 71, 77, 69, 78, 79, 206, + 80, 65, 82, 69, 82, 69, 78, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, + 83, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 80, 65, 82, 69, 78, + 84, 72, 69, 83, 69, 211, 80, 65, 82, 65, 80, 72, 82, 65, 83, 197, 80, 65, + 82, 65, 76, 76, 69, 76, 79, 71, 82, 65, 77, 128, 80, 65, 82, 65, 76, 76, + 69, 76, 128, 80, 65, 82, 65, 76, 76, 69, 204, 80, 65, 82, 65, 75, 76, 73, + 84, 73, 75, 73, 128, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 201, 80, 65, + 82, 65, 75, 65, 76, 69, 83, 77, 193, 80, 65, 82, 65, 71, 82, 65, 80, 72, + 85, 211, 80, 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 80, 65, 82, 65, + 71, 82, 65, 80, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 200, 80, 65, 82, + 65, 67, 72, 85, 84, 69, 128, 80, 65, 82, 65, 128, 80, 65, 82, 128, 80, + 65, 80, 89, 82, 85, 83, 128, 80, 65, 80, 69, 82, 67, 76, 73, 80, 83, 128, + 80, 65, 80, 69, 82, 67, 76, 73, 80, 128, 80, 65, 80, 69, 82, 128, 80, 65, + 80, 69, 210, 80, 65, 80, 128, 80, 65, 208, 80, 65, 207, 80, 65, 78, 89, + 85, 75, 85, 128, 80, 65, 78, 89, 73, 75, 85, 128, 80, 65, 78, 89, 69, 67, + 69, 75, 128, 80, 65, 78, 89, 65, 78, 71, 71, 65, 128, 80, 65, 78, 89, 65, + 75, 82, 65, 128, 80, 65, 78, 84, 73, 128, 80, 65, 78, 83, 73, 79, 83, 45, + 80, 73, 69, 85, 80, 128, 80, 65, 78, 83, 73, 79, 83, 45, 75, 65, 80, 89, + 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 80, 65, 78, 79, 78, 71, 79, 78, + 65, 78, 128, 80, 65, 78, 79, 76, 79, 78, 71, 128, 80, 65, 78, 71, 87, 73, + 83, 65, 68, 128, 80, 65, 78, 71, 82, 65, 78, 71, 75, 69, 80, 128, 80, 65, + 78, 71, 79, 76, 65, 84, 128, 80, 65, 78, 71, 76, 79, 78, 71, 128, 80, 65, + 78, 71, 76, 65, 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, 128, 80, 65, + 78, 71, 75, 65, 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, 128, 80, 65, 78, + 71, 128, 80, 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, 80, 65, 78, 68, + 193, 80, 65, 78, 67, 65, 75, 69, 83, 128, 80, 65, 78, 65, 77, 128, 80, + 65, 78, 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, 128, 80, 65, 206, + 80, 65, 77, 85, 78, 71, 75, 65, 72, 128, 80, 65, 77, 85, 68, 80, 79, 68, + 128, 80, 65, 77, 83, 72, 65, 69, 128, 80, 65, 77, 80, 72, 89, 76, 73, 65, + 206, 80, 65, 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, 77, 69, 80, 69, 84, + 128, 80, 65, 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, 65, 68, 65, 128, + 80, 65, 77, 65, 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, 128, 80, 65, 76, + 79, 67, 72, 75, 65, 128, 80, 65, 76, 77, 89, 82, 69, 78, 197, 80, 65, 76, + 77, 211, 80, 65, 76, 77, 128, 80, 65, 76, 205, 80, 65, 76, 76, 65, 87, + 65, 128, 80, 65, 76, 76, 65, 83, 128, 80, 65, 76, 201, 80, 65, 76, 69, + 84, 84, 69, 128, 80, 65, 76, 65, 85, 78, 199, 80, 65, 76, 65, 84, 65, 76, + 73, 90, 69, 196, 80, 65, 76, 65, 84, 65, 76, 73, 90, 65, 84, 73, 79, 78, + 128, 80, 65, 76, 65, 84, 65, 204, 80, 65, 75, 80, 65, 203, 80, 65, 73, + 89, 65, 78, 78, 79, 73, 128, 80, 65, 73, 82, 84, 72, 82, 65, 128, 80, 65, + 73, 82, 69, 196, 80, 65, 73, 78, 84, 66, 82, 85, 83, 72, 128, 80, 65, 73, + 128, 80, 65, 72, 76, 65, 86, 201, 80, 65, 72, 128, 80, 65, 71, 79, 68, + 65, 128, 80, 65, 71, 69, 83, 128, 80, 65, 71, 69, 82, 128, 80, 65, 71, + 197, 80, 65, 68, 77, 193, 80, 65, 68, 68, 76, 197, 80, 65, 68, 68, 73, + 78, 199, 80, 65, 68, 193, 80, 65, 68, 128, 80, 65, 67, 75, 73, 78, 71, + 128, 80, 65, 67, 75, 65, 71, 69, 128, 80, 65, 65, 84, 85, 128, 80, 65, + 65, 83, 69, 78, 84, 79, 128, 80, 65, 65, 82, 65, 77, 128, 80, 65, 65, 82, + 65, 69, 128, 80, 65, 65, 77, 128, 80, 65, 65, 73, 128, 80, 65, 65, 45, + 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, 80, 50, 128, 80, 48, 49, 49, + 128, 80, 48, 49, 48, 128, 80, 48, 48, 57, 128, 80, 48, 48, 56, 128, 80, + 48, 48, 55, 128, 80, 48, 48, 54, 128, 80, 48, 48, 53, 128, 80, 48, 48, + 52, 128, 80, 48, 48, 51, 65, 128, 80, 48, 48, 51, 128, 80, 48, 48, 50, + 128, 80, 48, 48, 49, 65, 128, 80, 48, 48, 49, 128, 79, 89, 83, 84, 69, + 82, 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, 78, 78, 65, + 128, 79, 88, 73, 65, 128, 79, 88, 73, 193, 79, 88, 69, 73, 65, 201, 79, + 88, 69, 73, 193, 79, 87, 76, 128, 79, 86, 69, 82, 82, 73, 68, 69, 128, + 79, 86, 69, 82, 76, 79, 78, 199, 79, 86, 69, 82, 76, 73, 78, 69, 128, 79, + 86, 69, 82, 76, 65, 89, 128, 79, 86, 69, 82, 76, 65, 217, 79, 86, 69, 82, + 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76, 65, 80, 128, 79, 86, 69, + 82, 76, 65, 73, 68, 128, 79, 86, 69, 82, 76, 65, 73, 196, 79, 86, 69, 82, + 72, 69, 65, 84, 69, 196, 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 76, + 128, 79, 86, 65, 204, 79, 85, 84, 76, 73, 78, 69, 196, 79, 85, 84, 76, + 73, 78, 69, 128, 79, 85, 84, 69, 210, 79, 85, 84, 66, 79, 216, 79, 85, + 78, 75, 73, 193, 79, 85, 78, 67, 69, 128, 79, 85, 78, 67, 197, 79, 84, + 85, 128, 79, 84, 84, 79, 77, 65, 206, 79, 84, 84, 69, 82, 128, 79, 84, + 84, 65, 86, 193, 79, 84, 84, 128, 79, 84, 72, 69, 82, 211, 79, 84, 72, + 69, 210, 79, 84, 72, 65, 76, 65, 206, 79, 84, 72, 65, 76, 128, 79, 83, + 77, 65, 78, 89, 193, 79, 83, 67, 128, 79, 83, 65, 71, 197, 79, 82, 84, + 72, 79, 71, 79, 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, 216, 79, 82, 78, + 65, 84, 197, 79, 82, 78, 65, 77, 69, 78, 84, 83, 128, 79, 82, 78, 65, 77, + 69, 78, 84, 128, 79, 82, 78, 65, 77, 69, 78, 212, 79, 82, 75, 72, 79, + 206, 79, 82, 73, 89, 193, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, 73, + 71, 73, 78, 128, 79, 82, 69, 45, 50, 128, 79, 82, 68, 73, 78, 65, 204, + 79, 82, 68, 69, 210, 79, 82, 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, 85, + 84, 65, 78, 128, 79, 82, 65, 78, 71, 197, 79, 80, 84, 73, 79, 206, 79, + 80, 84, 73, 67, 65, 204, 79, 80, 80, 82, 69, 83, 83, 73, 79, 78, 128, 79, + 80, 80, 79, 83, 73, 84, 73, 79, 78, 128, 79, 80, 80, 79, 83, 73, 78, 199, + 79, 80, 80, 79, 83, 69, 128, 79, 80, 72, 73, 85, 67, 72, 85, 83, 128, 79, + 80, 69, 82, 65, 84, 79, 82, 128, 79, 80, 69, 82, 65, 84, 79, 210, 79, 80, + 69, 82, 65, 84, 73, 78, 199, 79, 80, 69, 78, 73, 78, 199, 79, 80, 69, 78, + 45, 80, 128, 79, 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, 79, 80, + 69, 78, 45, 79, 128, 79, 80, 69, 78, 45, 207, 79, 80, 69, 78, 45, 72, 69, + 65, 68, 69, 196, 79, 80, 69, 78, 45, 67, 73, 82, 67, 85, 73, 84, 45, 79, + 85, 84, 80, 85, 212, 79, 80, 69, 78, 128, 79, 80, 69, 206, 79, 79, 90, + 69, 128, 79, 79, 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, 77, + 85, 128, 79, 79, 72, 128, 79, 79, 69, 128, 79, 79, 66, 79, 79, 70, 73, + 76, 73, 128, 79, 78, 85, 128, 79, 78, 83, 85, 128, 79, 78, 78, 128, 79, + 78, 75, 65, 82, 128, 79, 78, 73, 79, 78, 128, 79, 78, 69, 83, 69, 76, 70, + 128, 79, 78, 69, 45, 87, 65, 217, 79, 78, 69, 45, 84, 72, 73, 82, 84, 89, + 128, 79, 78, 69, 45, 80, 73, 69, 67, 197, 79, 78, 69, 45, 76, 73, 78, + 197, 79, 78, 69, 45, 72, 85, 78, 68, 82, 69, 68, 45, 65, 78, 68, 45, 83, + 73, 88, 84, 73, 69, 84, 72, 128, 79, 78, 67, 79, 77, 73, 78, 199, 79, 78, + 65, 80, 128, 79, 78, 45, 79, 70, 198, 79, 77, 73, 83, 83, 73, 79, 206, + 79, 77, 73, 67, 82, 79, 78, 128, 79, 77, 73, 67, 82, 79, 206, 79, 77, 69, + 71, 65, 128, 79, 77, 69, 71, 193, 79, 77, 65, 76, 79, 78, 128, 79, 76, + 73, 86, 69, 128, 79, 76, 73, 71, 79, 206, 79, 76, 68, 128, 79, 75, 84, + 207, 79, 75, 65, 82, 65, 128, 79, 75, 65, 82, 193, 79, 74, 73, 66, 87, + 65, 217, 79, 74, 69, 79, 78, 128, 79, 73, 78, 128, 79, 73, 76, 128, 79, + 73, 204, 79, 72, 77, 128, 79, 72, 205, 79, 71, 82, 69, 128, 79, 71, 79, + 78, 69, 75, 128, 79, 71, 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, + 70, 73, 67, 69, 82, 128, 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, + 197, 79, 70, 70, 128, 79, 69, 89, 128, 79, 69, 82, 128, 79, 69, 75, 128, + 79, 69, 69, 128, 79, 68, 69, 78, 128, 79, 68, 68, 128, 79, 68, 196, 79, + 67, 84, 79, 80, 85, 83, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, 84, + 69, 212, 79, 67, 84, 65, 71, 79, 78, 65, 204, 79, 67, 84, 65, 71, 79, 78, + 128, 79, 67, 210, 79, 67, 76, 79, 67, 75, 128, 79, 67, 67, 76, 85, 83, + 73, 79, 78, 128, 79, 66, 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, 79, 66, + 83, 69, 82, 86, 69, 210, 79, 66, 79, 76, 211, 79, 66, 79, 204, 79, 66, + 79, 70, 73, 76, 73, 128, 79, 66, 76, 73, 81, 85, 197, 79, 66, 74, 69, 67, + 212, 79, 66, 69, 76, 85, 83, 128, 79, 66, 69, 76, 79, 83, 128, 79, 66, + 128, 79, 65, 89, 128, 79, 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, 76, + 73, 128, 79, 193, 79, 48, 53, 49, 128, 79, 48, 53, 48, 66, 128, 79, 48, + 53, 48, 65, 128, 79, 48, 53, 48, 128, 79, 48, 52, 57, 128, 79, 48, 52, + 56, 128, 79, 48, 52, 55, 128, 79, 48, 52, 54, 128, 79, 48, 52, 53, 128, + 79, 48, 52, 52, 128, 79, 48, 52, 51, 128, 79, 48, 52, 50, 128, 79, 48, + 52, 49, 128, 79, 48, 52, 48, 128, 79, 48, 51, 57, 128, 79, 48, 51, 56, + 128, 79, 48, 51, 55, 128, 79, 48, 51, 54, 68, 128, 79, 48, 51, 54, 67, + 128, 79, 48, 51, 54, 66, 128, 79, 48, 51, 54, 65, 128, 79, 48, 51, 54, + 128, 79, 48, 51, 53, 128, 79, 48, 51, 52, 128, 79, 48, 51, 51, 65, 128, + 79, 48, 51, 51, 128, 79, 48, 51, 50, 128, 79, 48, 51, 49, 128, 79, 48, + 51, 48, 65, 128, 79, 48, 51, 48, 128, 79, 48, 50, 57, 65, 128, 79, 48, + 50, 57, 128, 79, 48, 50, 56, 128, 79, 48, 50, 55, 128, 79, 48, 50, 54, + 128, 79, 48, 50, 53, 65, 128, 79, 48, 50, 53, 128, 79, 48, 50, 52, 65, + 128, 79, 48, 50, 52, 128, 79, 48, 50, 51, 128, 79, 48, 50, 50, 128, 79, + 48, 50, 49, 128, 79, 48, 50, 48, 65, 128, 79, 48, 50, 48, 128, 79, 48, + 49, 57, 65, 128, 79, 48, 49, 57, 128, 79, 48, 49, 56, 128, 79, 48, 49, + 55, 128, 79, 48, 49, 54, 128, 79, 48, 49, 53, 128, 79, 48, 49, 52, 128, + 79, 48, 49, 51, 128, 79, 48, 49, 50, 128, 79, 48, 49, 49, 128, 79, 48, + 49, 48, 67, 128, 79, 48, 49, 48, 66, 128, 79, 48, 49, 48, 65, 128, 79, + 48, 49, 48, 128, 79, 48, 48, 57, 128, 79, 48, 48, 56, 128, 79, 48, 48, + 55, 128, 79, 48, 48, 54, 70, 128, 79, 48, 48, 54, 69, 128, 79, 48, 48, + 54, 68, 128, 79, 48, 48, 54, 67, 128, 79, 48, 48, 54, 66, 128, 79, 48, + 48, 54, 65, 128, 79, 48, 48, 54, 128, 79, 48, 48, 53, 65, 128, 79, 48, + 48, 53, 128, 79, 48, 48, 52, 128, 79, 48, 48, 51, 128, 79, 48, 48, 50, + 128, 79, 48, 48, 49, 65, 128, 79, 48, 48, 49, 128, 79, 45, 89, 69, 128, + 79, 45, 79, 45, 73, 128, 79, 45, 69, 128, 78, 90, 89, 88, 128, 78, 90, + 89, 84, 128, 78, 90, 89, 82, 88, 128, 78, 90, 89, 82, 128, 78, 90, 89, + 80, 128, 78, 90, 89, 128, 78, 90, 85, 88, 128, 78, 90, 85, 82, 88, 128, + 78, 90, 85, 82, 128, 78, 90, 85, 81, 128, 78, 90, 85, 80, 128, 78, 90, + 85, 79, 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 206, 78, 90, 85, 128, + 78, 90, 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, + 73, 84, 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, + 69, 80, 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, 69, 88, 128, + 78, 90, 69, 85, 77, 128, 78, 90, 69, 128, 78, 90, 65, 88, 128, 78, 90, + 65, 84, 128, 78, 90, 65, 81, 128, 78, 90, 65, 80, 128, 78, 90, 65, 128, + 78, 90, 193, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, 89, 85, 85, + 128, 78, 89, 85, 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, + 78, 89, 85, 79, 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 78, 128, 78, + 89, 85, 69, 128, 78, 89, 85, 128, 78, 89, 79, 88, 128, 78, 89, 79, 84, + 128, 78, 89, 79, 80, 128, 78, 89, 79, 79, 128, 78, 89, 79, 78, 128, 78, + 89, 79, 65, 128, 78, 89, 79, 128, 78, 89, 74, 65, 128, 78, 89, 73, 88, + 128, 78, 89, 73, 84, 128, 78, 89, 73, 212, 78, 89, 73, 211, 78, 89, 73, + 210, 78, 89, 73, 80, 128, 78, 89, 73, 78, 45, 68, 79, 128, 78, 89, 73, + 78, 128, 78, 89, 73, 73, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, + 84, 128, 78, 89, 73, 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 65, + 75, 69, 78, 199, 78, 89, 73, 128, 78, 89, 201, 78, 89, 72, 65, 128, 78, + 89, 69, 84, 128, 78, 89, 69, 212, 78, 89, 69, 78, 128, 78, 89, 69, 72, + 128, 78, 89, 69, 200, 78, 89, 69, 69, 128, 78, 89, 69, 128, 78, 89, 196, + 78, 89, 67, 65, 128, 78, 89, 65, 85, 128, 78, 89, 65, 74, 128, 78, 89, + 65, 73, 128, 78, 89, 65, 72, 128, 78, 89, 65, 69, 77, 65, 69, 128, 78, + 89, 65, 65, 128, 78, 87, 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, + 128, 78, 87, 73, 128, 78, 87, 69, 128, 78, 87, 65, 65, 128, 78, 87, 65, + 128, 78, 87, 128, 78, 86, 128, 78, 85, 88, 128, 78, 85, 85, 78, 128, 78, + 85, 85, 128, 78, 85, 84, 73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, + 212, 78, 85, 82, 88, 128, 78, 85, 82, 128, 78, 85, 80, 128, 78, 85, 79, + 88, 128, 78, 85, 79, 80, 128, 78, 85, 79, 128, 78, 85, 78, 85, 90, 128, + 78, 85, 78, 85, 218, 78, 85, 78, 71, 128, 78, 85, 78, 65, 86, 85, 212, + 78, 85, 78, 65, 86, 73, 203, 78, 85, 78, 128, 78, 85, 206, 78, 85, 77, + 69, 82, 207, 78, 85, 77, 69, 82, 65, 84, 79, 210, 78, 85, 77, 69, 82, 65, + 204, 78, 85, 77, 66, 69, 82, 83, 128, 78, 85, 77, 66, 69, 82, 128, 78, + 85, 77, 128, 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, 85, 76, 128, 78, + 85, 75, 84, 65, 128, 78, 85, 75, 84, 193, 78, 85, 69, 78, 71, 128, 78, + 85, 69, 128, 78, 85, 66, 73, 65, 206, 78, 85, 65, 69, 128, 78, 85, 49, + 49, 128, 78, 85, 49, 177, 78, 85, 48, 50, 50, 65, 128, 78, 85, 48, 50, + 50, 128, 78, 85, 48, 50, 49, 128, 78, 85, 48, 50, 48, 128, 78, 85, 48, + 49, 57, 128, 78, 85, 48, 49, 56, 65, 128, 78, 85, 48, 49, 56, 128, 78, + 85, 48, 49, 55, 128, 78, 85, 48, 49, 54, 128, 78, 85, 48, 49, 53, 128, + 78, 85, 48, 49, 52, 128, 78, 85, 48, 49, 51, 128, 78, 85, 48, 49, 50, + 128, 78, 85, 48, 49, 49, 65, 128, 78, 85, 48, 49, 49, 128, 78, 85, 48, + 49, 48, 65, 128, 78, 85, 48, 49, 48, 128, 78, 85, 48, 48, 57, 128, 78, + 85, 48, 48, 56, 128, 78, 85, 48, 48, 55, 128, 78, 85, 48, 48, 54, 128, + 78, 85, 48, 48, 53, 128, 78, 85, 48, 48, 52, 128, 78, 85, 48, 48, 51, + 128, 78, 85, 48, 48, 50, 128, 78, 85, 48, 48, 49, 128, 78, 85, 45, 51, + 128, 78, 85, 45, 50, 128, 78, 85, 45, 49, 128, 78, 84, 88, 73, 86, 128, + 78, 84, 88, 65, 128, 78, 84, 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, + 85, 74, 128, 78, 84, 213, 78, 84, 83, 65, 85, 128, 78, 84, 83, 65, 128, + 78, 84, 79, 81, 80, 69, 78, 128, 78, 84, 79, 71, 128, 78, 84, 79, 199, + 78, 84, 73, 69, 197, 78, 84, 72, 65, 85, 128, 78, 84, 69, 85, 78, 71, 66, + 65, 128, 78, 84, 69, 85, 77, 128, 78, 84, 69, 78, 128, 78, 84, 69, 69, + 128, 78, 84, 65, 80, 128, 78, 84, 65, 208, 78, 84, 65, 65, 128, 78, 84, + 65, 128, 78, 83, 85, 79, 212, 78, 83, 85, 78, 128, 78, 83, 85, 77, 128, + 78, 83, 79, 77, 128, 78, 83, 73, 69, 69, 84, 128, 78, 83, 73, 69, 69, 80, + 128, 78, 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, 128, 78, 83, 72, 85, + 212, 78, 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, 69, 128, 78, 83, 72, + 73, 69, 69, 128, 78, 83, 72, 69, 69, 128, 78, 83, 72, 65, 81, 128, 78, + 83, 72, 65, 128, 78, 83, 69, 85, 65, 69, 78, 128, 78, 83, 69, 78, 128, + 78, 83, 65, 128, 78, 82, 89, 88, 128, 78, 82, 89, 84, 128, 78, 82, 89, + 82, 88, 128, 78, 82, 89, 82, 128, 78, 82, 89, 80, 128, 78, 82, 89, 128, + 78, 82, 85, 88, 128, 78, 82, 85, 84, 128, 78, 82, 85, 82, 88, 128, 78, + 82, 85, 82, 128, 78, 82, 85, 80, 128, 78, 82, 85, 65, 128, 78, 82, 85, + 128, 78, 82, 79, 88, 128, 78, 82, 79, 80, 128, 78, 82, 79, 128, 78, 82, + 69, 88, 128, 78, 82, 69, 84, 128, 78, 82, 69, 211, 78, 82, 69, 80, 128, + 78, 82, 69, 128, 78, 82, 65, 88, 128, 78, 82, 65, 84, 128, 78, 82, 65, + 80, 128, 78, 82, 65, 128, 78, 81, 73, 71, 128, 78, 81, 65, 128, 78, 80, + 76, 65, 128, 78, 80, 65, 128, 78, 79, 89, 128, 78, 79, 88, 128, 78, 79, + 87, 67, 128, 78, 79, 86, 73, 76, 69, 128, 78, 79, 86, 69, 77, 66, 69, 82, + 128, 78, 79, 84, 84, 79, 128, 78, 79, 84, 69, 83, 128, 78, 79, 84, 69, + 72, 69, 65, 68, 128, 78, 79, 84, 69, 72, 69, 65, 196, 78, 79, 84, 69, 66, + 79, 79, 75, 128, 78, 79, 84, 69, 66, 79, 79, 203, 78, 79, 84, 69, 128, + 78, 79, 84, 197, 78, 79, 84, 67, 72, 69, 196, 78, 79, 84, 67, 72, 128, + 78, 79, 84, 65, 84, 73, 79, 206, 78, 79, 84, 128, 78, 79, 212, 78, 79, + 83, 69, 128, 78, 79, 83, 197, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, + 79, 82, 84, 72, 69, 82, 206, 78, 79, 82, 84, 72, 69, 65, 83, 84, 45, 80, + 79, 73, 78, 84, 73, 78, 199, 78, 79, 82, 77, 65, 204, 78, 79, 82, 68, 73, + 195, 78, 79, 210, 78, 79, 80, 128, 78, 79, 79, 78, 85, 128, 78, 79, 79, + 128, 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, 128, 78, 79, 78, 45, 80, 79, + 84, 65, 66, 76, 197, 78, 79, 78, 45, 74, 79, 73, 78, 69, 82, 128, 78, 79, + 78, 45, 66, 82, 69, 65, 75, 73, 78, 199, 78, 79, 78, 128, 78, 79, 77, 73, + 83, 77, 193, 78, 79, 77, 73, 78, 65, 204, 78, 79, 75, 72, 85, 75, 128, + 78, 79, 68, 69, 128, 78, 79, 65, 128, 78, 79, 45, 66, 82, 69, 65, 203, + 78, 79, 45, 53, 128, 78, 79, 45, 52, 128, 78, 79, 45, 51, 128, 78, 79, + 45, 50, 128, 78, 79, 45, 49, 128, 78, 78, 85, 85, 128, 78, 78, 85, 128, + 78, 78, 79, 79, 128, 78, 78, 79, 128, 78, 78, 78, 85, 85, 128, 78, 78, + 78, 85, 128, 78, 78, 78, 79, 79, 128, 78, 78, 78, 79, 128, 78, 78, 78, + 73, 73, 128, 78, 78, 78, 73, 128, 78, 78, 78, 69, 69, 128, 78, 78, 78, + 69, 128, 78, 78, 78, 65, 85, 128, 78, 78, 78, 65, 73, 128, 78, 78, 78, + 65, 65, 128, 78, 78, 78, 65, 128, 78, 78, 78, 128, 78, 78, 72, 65, 128, + 78, 78, 71, 79, 79, 128, 78, 78, 71, 79, 128, 78, 78, 71, 73, 73, 128, + 78, 78, 71, 73, 128, 78, 78, 71, 65, 65, 128, 78, 78, 71, 65, 128, 78, + 78, 71, 128, 78, 78, 66, 83, 80, 128, 78, 77, 128, 78, 76, 65, 85, 128, + 78, 76, 48, 50, 48, 128, 78, 76, 48, 49, 57, 128, 78, 76, 48, 49, 56, + 128, 78, 76, 48, 49, 55, 65, 128, 78, 76, 48, 49, 55, 128, 78, 76, 48, + 49, 54, 128, 78, 76, 48, 49, 53, 128, 78, 76, 48, 49, 52, 128, 78, 76, + 48, 49, 51, 128, 78, 76, 48, 49, 50, 128, 78, 76, 48, 49, 49, 128, 78, + 76, 48, 49, 48, 128, 78, 76, 48, 48, 57, 128, 78, 76, 48, 48, 56, 128, + 78, 76, 48, 48, 55, 128, 78, 76, 48, 48, 54, 128, 78, 76, 48, 48, 53, 65, + 128, 78, 76, 48, 48, 53, 128, 78, 76, 48, 48, 52, 128, 78, 76, 48, 48, + 51, 128, 78, 76, 48, 48, 50, 128, 78, 76, 48, 48, 49, 128, 78, 76, 128, + 78, 75, 79, 77, 128, 78, 75, 207, 78, 75, 73, 78, 68, 73, 128, 78, 75, + 65, 85, 128, 78, 75, 65, 65, 82, 65, 69, 128, 78, 75, 65, 128, 78, 74, + 89, 88, 128, 78, 74, 89, 84, 128, 78, 74, 89, 82, 88, 128, 78, 74, 89, + 82, 128, 78, 74, 89, 80, 128, 78, 74, 89, 128, 78, 74, 85, 88, 128, 78, + 74, 85, 82, 88, 128, 78, 74, 85, 82, 128, 78, 74, 85, 81, 65, 128, 78, + 74, 85, 80, 128, 78, 74, 85, 79, 88, 128, 78, 74, 85, 79, 128, 78, 74, + 85, 69, 81, 128, 78, 74, 85, 65, 69, 128, 78, 74, 85, 128, 78, 74, 79, + 88, 128, 78, 74, 79, 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 79, 128, + 78, 74, 79, 128, 78, 74, 73, 88, 128, 78, 74, 73, 84, 128, 78, 74, 73, + 80, 128, 78, 74, 73, 69, 88, 128, 78, 74, 73, 69, 84, 128, 78, 74, 73, + 69, 80, 128, 78, 74, 73, 69, 69, 128, 78, 74, 73, 69, 128, 78, 74, 73, + 128, 78, 74, 201, 78, 74, 69, 85, 88, 128, 78, 74, 69, 85, 84, 128, 78, + 74, 69, 85, 65, 69, 78, 65, 128, 78, 74, 69, 85, 65, 69, 77, 128, 78, 74, + 69, 69, 69, 69, 128, 78, 74, 69, 69, 128, 78, 74, 69, 197, 78, 74, 69, + 128, 78, 74, 65, 81, 128, 78, 74, 65, 80, 128, 78, 74, 65, 69, 77, 76, + 73, 128, 78, 74, 65, 69, 77, 128, 78, 74, 65, 65, 128, 78, 73, 88, 128, + 78, 73, 84, 82, 69, 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85, 71, 85, + 128, 78, 73, 80, 128, 78, 73, 78, 84, 72, 128, 78, 73, 78, 74, 65, 128, + 78, 73, 78, 69, 84, 89, 128, 78, 73, 78, 69, 84, 217, 78, 73, 78, 69, 84, + 69, 69, 78, 128, 78, 73, 78, 69, 84, 69, 69, 206, 78, 73, 78, 69, 45, 84, + 72, 73, 82, 84, 89, 128, 78, 73, 78, 197, 78, 73, 78, 68, 65, 50, 128, + 78, 73, 78, 68, 65, 178, 78, 73, 78, 57, 128, 78, 73, 78, 128, 78, 73, + 77, 128, 78, 73, 205, 78, 73, 75, 79, 76, 83, 66, 85, 82, 199, 78, 73, + 75, 72, 65, 72, 73, 84, 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 75, + 65, 128, 78, 73, 72, 83, 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, 65, + 77, 73, 78, 128, 78, 73, 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, 72, + 84, 128, 78, 73, 71, 72, 212, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, + 78, 73, 69, 88, 128, 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, + 78, 73, 69, 85, 78, 45, 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, + 78, 45, 83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, + 128, 78, 73, 69, 85, 78, 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, + 45, 80, 65, 78, 83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, + 69, 79, 75, 128, 78, 73, 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, + 69, 85, 78, 45, 67, 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, + 73, 69, 85, 67, 72, 128, 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, + 73, 69, 128, 78, 73, 66, 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 73, + 45, 84, 69, 128, 78, 73, 45, 55, 128, 78, 73, 45, 54, 128, 78, 73, 45, + 53, 128, 78, 73, 45, 52, 128, 78, 73, 45, 51, 128, 78, 73, 45, 50, 128, + 78, 73, 45, 49, 128, 78, 72, 85, 69, 128, 78, 72, 74, 65, 128, 78, 72, + 65, 89, 128, 78, 72, 128, 78, 71, 89, 69, 128, 78, 71, 86, 69, 128, 78, + 71, 85, 85, 128, 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, 78, + 71, 85, 79, 128, 78, 71, 85, 65, 78, 128, 78, 71, 85, 65, 69, 84, 128, + 78, 71, 85, 65, 69, 128, 78, 71, 79, 88, 128, 78, 71, 79, 85, 128, 78, + 71, 79, 213, 78, 71, 79, 84, 128, 78, 71, 79, 81, 128, 78, 71, 79, 80, + 128, 78, 71, 79, 78, 128, 78, 71, 79, 77, 128, 78, 71, 79, 69, 72, 128, + 78, 71, 79, 69, 200, 78, 71, 207, 78, 71, 75, 89, 69, 69, 128, 78, 71, + 75, 87, 65, 69, 78, 128, 78, 71, 75, 85, 80, 128, 78, 71, 75, 85, 78, + 128, 78, 71, 75, 85, 77, 128, 78, 71, 75, 85, 69, 78, 90, 69, 85, 77, + 128, 78, 71, 75, 85, 197, 78, 71, 75, 73, 78, 68, 201, 78, 71, 75, 73, + 69, 69, 128, 78, 71, 75, 69, 85, 88, 128, 78, 71, 75, 69, 85, 82, 73, + 128, 78, 71, 75, 69, 85, 65, 69, 81, 128, 78, 71, 75, 69, 85, 65, 69, 77, + 128, 78, 71, 75, 65, 81, 128, 78, 71, 75, 65, 80, 128, 78, 71, 75, 65, + 65, 77, 73, 128, 78, 71, 75, 65, 128, 78, 71, 73, 69, 88, 128, 78, 71, + 73, 69, 80, 128, 78, 71, 73, 69, 128, 78, 71, 72, 65, 128, 78, 71, 71, + 87, 65, 69, 78, 128, 78, 71, 71, 85, 82, 65, 69, 128, 78, 71, 71, 85, 80, + 128, 78, 71, 71, 85, 79, 81, 128, 78, 71, 71, 85, 79, 209, 78, 71, 71, + 85, 79, 78, 128, 78, 71, 71, 85, 79, 77, 128, 78, 71, 71, 85, 77, 128, + 78, 71, 71, 85, 69, 69, 84, 128, 78, 71, 71, 85, 65, 69, 83, 72, 65, 197, + 78, 71, 71, 85, 65, 69, 206, 78, 71, 71, 85, 65, 128, 78, 71, 71, 85, + 128, 78, 71, 71, 79, 79, 128, 78, 71, 71, 79, 128, 78, 71, 71, 73, 128, + 78, 71, 71, 69, 85, 88, 128, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 71, + 71, 69, 85, 65, 69, 128, 78, 71, 71, 69, 213, 78, 71, 71, 69, 78, 128, + 78, 71, 71, 69, 69, 84, 128, 78, 71, 71, 69, 69, 69, 69, 128, 78, 71, 71, + 69, 69, 128, 78, 71, 71, 69, 128, 78, 71, 71, 65, 80, 128, 78, 71, 71, + 65, 65, 77, 65, 69, 128, 78, 71, 71, 65, 65, 77, 128, 78, 71, 71, 65, 65, + 128, 78, 71, 71, 128, 78, 71, 69, 88, 128, 78, 71, 69, 85, 82, 69, 85, + 84, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78, 128, 78, 71, 69, 69, 128, + 78, 71, 69, 65, 68, 65, 76, 128, 78, 71, 65, 88, 128, 78, 71, 65, 85, + 128, 78, 71, 65, 84, 128, 78, 71, 65, 211, 78, 71, 65, 81, 128, 78, 71, + 65, 80, 128, 78, 71, 65, 78, 71, 85, 128, 78, 71, 65, 78, 128, 78, 71, + 65, 73, 128, 78, 71, 65, 72, 128, 78, 71, 65, 65, 73, 128, 78, 71, 193, + 78, 70, 128, 78, 69, 88, 212, 78, 69, 88, 128, 78, 69, 87, 83, 80, 65, + 80, 69, 82, 128, 78, 69, 87, 76, 73, 78, 69, 128, 78, 69, 87, 76, 73, 78, + 197, 78, 69, 87, 193, 78, 69, 87, 128, 78, 69, 215, 78, 69, 85, 84, 82, + 65, 76, 128, 78, 69, 85, 84, 82, 65, 204, 78, 69, 85, 84, 69, 82, 128, + 78, 69, 84, 87, 79, 82, 75, 69, 196, 78, 69, 212, 78, 69, 83, 84, 73, 78, + 199, 78, 69, 83, 84, 69, 196, 78, 69, 83, 83, 85, 83, 128, 78, 69, 82, 196, 78, 69, 81, 85, 68, 65, 65, 128, 78, 69, 80, 84, 85, 78, 69, 128, 78, 69, 80, 84, 85, 78, 197, 78, 69, 80, 128, 78, 69, 79, 128, 78, 69, 207, 78, 69, 78, 79, 69, 128, 78, 69, 78, 65, 78, 79, 128, 78, 69, 78, 128, 78, 69, 76, 128, 78, 69, 73, 84, 72, 69, 210, 78, 69, 71, 65, 84, 73, 86, 197, 78, 69, 71, 65, 84, 73, 79, 206, 78, 69, 71, 65, 84, 69, - 196, 78, 69, 67, 75, 84, 73, 69, 128, 78, 69, 67, 75, 128, 78, 69, 66, - 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 69, 45, 75, 79, 128, 78, 68, 85, - 88, 128, 78, 68, 85, 84, 128, 78, 68, 85, 82, 88, 128, 78, 68, 85, 82, - 128, 78, 68, 85, 80, 128, 78, 68, 85, 78, 128, 78, 68, 213, 78, 68, 79, - 88, 128, 78, 68, 79, 84, 128, 78, 68, 79, 80, 128, 78, 68, 79, 79, 128, - 78, 68, 79, 78, 128, 78, 68, 79, 77, 66, 85, 128, 78, 68, 79, 76, 197, - 78, 68, 73, 88, 128, 78, 68, 73, 84, 128, 78, 68, 73, 81, 128, 78, 68, - 73, 80, 128, 78, 68, 73, 69, 88, 128, 78, 68, 73, 69, 128, 78, 68, 73, - 68, 65, 128, 78, 68, 73, 65, 81, 128, 78, 68, 69, 88, 128, 78, 68, 69, - 85, 88, 128, 78, 68, 69, 85, 84, 128, 78, 68, 69, 85, 65, 69, 82, 69, 69, - 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, 128, 78, 68, 69, 128, 78, 68, - 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, 65, 80, 128, 78, 68, 65, 77, - 128, 78, 68, 65, 65, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 68, 65, 65, - 128, 78, 68, 65, 193, 78, 67, 72, 65, 85, 128, 78, 67, 65, 128, 78, 66, - 89, 88, 128, 78, 66, 89, 84, 128, 78, 66, 89, 82, 88, 128, 78, 66, 89, - 82, 128, 78, 66, 89, 80, 128, 78, 66, 89, 128, 78, 66, 85, 88, 128, 78, - 66, 85, 84, 128, 78, 66, 85, 82, 88, 128, 78, 66, 85, 82, 128, 78, 66, - 85, 80, 128, 78, 66, 85, 128, 78, 66, 79, 88, 128, 78, 66, 79, 84, 128, - 78, 66, 79, 80, 128, 78, 66, 79, 128, 78, 66, 73, 88, 128, 78, 66, 73, - 84, 128, 78, 66, 73, 80, 128, 78, 66, 73, 69, 88, 128, 78, 66, 73, 69, - 80, 128, 78, 66, 73, 69, 128, 78, 66, 73, 128, 78, 66, 72, 128, 78, 66, - 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, 65, 80, 128, 78, 66, 65, 128, - 78, 65, 90, 65, 210, 78, 65, 89, 65, 78, 78, 65, 128, 78, 65, 89, 128, - 78, 65, 88, 73, 65, 206, 78, 65, 88, 128, 78, 65, 85, 84, 72, 83, 128, - 78, 65, 85, 83, 69, 65, 84, 69, 196, 78, 65, 85, 68, 73, 218, 78, 65, 84, - 85, 82, 65, 204, 78, 65, 84, 73, 79, 78, 65, 204, 78, 65, 83, 75, 65, 80, - 201, 78, 65, 83, 72, 73, 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, 79, - 78, 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, 79, 206, 78, 65, 83, 65, - 204, 78, 65, 82, 82, 79, 215, 78, 65, 82, 128, 78, 65, 81, 128, 78, 65, - 79, 211, 78, 65, 78, 83, 65, 78, 65, 81, 128, 78, 65, 78, 71, 77, 79, 78, - 84, 72, 79, 128, 78, 65, 78, 68, 73, 78, 65, 71, 65, 82, 201, 78, 65, 78, - 68, 128, 78, 65, 78, 65, 128, 78, 65, 77, 69, 128, 78, 65, 77, 197, 78, - 65, 77, 50, 128, 78, 65, 75, 128, 78, 65, 73, 82, 193, 78, 65, 73, 204, - 78, 65, 71, 82, 201, 78, 65, 71, 65, 82, 128, 78, 65, 71, 65, 128, 78, - 65, 71, 193, 78, 65, 71, 128, 78, 65, 199, 78, 65, 69, 128, 78, 65, 66, - 76, 65, 128, 78, 65, 66, 65, 84, 65, 69, 65, 206, 78, 65, 65, 83, 73, 75, - 89, 65, 89, 65, 128, 78, 65, 65, 75, 83, 73, 75, 89, 65, 89, 65, 128, 78, - 65, 65, 73, 128, 78, 65, 193, 78, 65, 52, 128, 78, 65, 50, 128, 78, 65, - 45, 57, 128, 78, 65, 45, 56, 128, 78, 65, 45, 55, 128, 78, 65, 45, 54, - 128, 78, 65, 45, 53, 128, 78, 65, 45, 52, 128, 78, 65, 45, 51, 128, 78, - 65, 45, 50, 128, 78, 65, 45, 49, 128, 78, 48, 52, 50, 128, 78, 48, 52, - 49, 128, 78, 48, 52, 48, 128, 78, 48, 51, 57, 128, 78, 48, 51, 56, 128, - 78, 48, 51, 55, 65, 128, 78, 48, 51, 55, 128, 78, 48, 51, 54, 128, 78, - 48, 51, 53, 65, 128, 78, 48, 51, 53, 128, 78, 48, 51, 52, 65, 128, 78, - 48, 51, 52, 128, 78, 48, 51, 51, 65, 128, 78, 48, 51, 51, 128, 78, 48, - 51, 50, 128, 78, 48, 51, 49, 128, 78, 48, 51, 48, 128, 78, 48, 50, 57, - 128, 78, 48, 50, 56, 128, 78, 48, 50, 55, 128, 78, 48, 50, 54, 128, 78, - 48, 50, 53, 65, 128, 78, 48, 50, 53, 128, 78, 48, 50, 52, 128, 78, 48, - 50, 51, 128, 78, 48, 50, 50, 128, 78, 48, 50, 49, 128, 78, 48, 50, 48, - 128, 78, 48, 49, 57, 128, 78, 48, 49, 56, 66, 128, 78, 48, 49, 56, 65, - 128, 78, 48, 49, 56, 128, 78, 48, 49, 55, 128, 78, 48, 49, 54, 128, 78, - 48, 49, 53, 128, 78, 48, 49, 52, 128, 78, 48, 49, 51, 128, 78, 48, 49, - 50, 128, 78, 48, 49, 49, 128, 78, 48, 49, 48, 128, 78, 48, 48, 57, 128, - 78, 48, 48, 56, 128, 78, 48, 48, 55, 128, 78, 48, 48, 54, 128, 78, 48, - 48, 53, 128, 78, 48, 48, 52, 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, - 128, 78, 48, 48, 49, 128, 78, 45, 77, 85, 45, 77, 79, 45, 50, 128, 78, - 45, 77, 85, 45, 77, 79, 45, 49, 128, 78, 45, 67, 82, 69, 197, 78, 45, 65, - 82, 217, 77, 89, 88, 128, 77, 89, 84, 128, 77, 89, 83, 76, 73, 84, 69, - 128, 77, 89, 80, 128, 77, 89, 65, 128, 77, 89, 193, 77, 89, 128, 77, 87, - 79, 79, 128, 77, 87, 79, 128, 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, - 87, 69, 69, 128, 77, 87, 69, 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, - 77, 87, 128, 77, 215, 77, 86, 83, 128, 77, 86, 79, 80, 128, 77, 86, 73, - 128, 77, 86, 69, 85, 65, 69, 78, 71, 65, 77, 128, 77, 86, 128, 77, 214, - 77, 85, 88, 128, 77, 85, 85, 86, 85, 90, 72, 65, 75, 75, 85, 128, 77, 85, - 85, 83, 73, 75, 65, 84, 79, 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, - 193, 77, 85, 85, 128, 77, 85, 84, 72, 65, 76, 73, 89, 65, 128, 77, 85, - 84, 128, 77, 85, 83, 73, 67, 128, 77, 85, 83, 73, 195, 77, 85, 83, 72, - 82, 79, 79, 77, 128, 77, 85, 83, 72, 51, 128, 77, 85, 83, 72, 179, 77, - 85, 83, 72, 128, 77, 85, 83, 200, 77, 85, 83, 128, 77, 85, 82, 88, 128, - 77, 85, 82, 71, 85, 50, 128, 77, 85, 82, 69, 128, 77, 85, 82, 68, 65, - 128, 77, 85, 82, 68, 193, 77, 85, 82, 128, 77, 85, 81, 68, 65, 77, 128, - 77, 85, 80, 128, 77, 85, 79, 88, 128, 77, 85, 79, 84, 128, 77, 85, 79, - 80, 128, 77, 85, 79, 77, 65, 69, 128, 77, 85, 79, 128, 77, 85, 78, 83, - 85, 66, 128, 77, 85, 78, 65, 72, 128, 77, 85, 78, 128, 77, 85, 76, 84, - 73, 83, 69, 84, 128, 77, 85, 76, 84, 73, 83, 69, 212, 77, 85, 76, 84, 73, - 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 77, 85, 76, 84, 73, 80, 76, 73, - 67, 65, 84, 73, 79, 206, 77, 85, 76, 84, 73, 80, 76, 69, 128, 77, 85, 76, - 84, 73, 80, 76, 197, 77, 85, 76, 84, 73, 79, 67, 85, 76, 65, 210, 77, 85, - 76, 84, 73, 77, 65, 80, 128, 77, 85, 76, 84, 201, 77, 85, 76, 84, 65, 78, - 201, 77, 85, 75, 80, 72, 82, 69, 78, 71, 128, 77, 85, 75, 75, 85, 82, 85, - 78, 73, 128, 77, 85, 73, 78, 128, 77, 85, 71, 83, 128, 77, 85, 71, 128, - 77, 85, 199, 77, 85, 69, 78, 128, 77, 85, 69, 128, 77, 85, 67, 72, 128, - 77, 85, 67, 200, 77, 85, 67, 65, 65, 68, 128, 77, 85, 65, 83, 128, 77, - 85, 65, 78, 128, 77, 85, 65, 69, 128, 77, 85, 45, 71, 65, 65, 72, 76, 65, - 193, 77, 85, 45, 52, 128, 77, 85, 45, 51, 128, 77, 85, 45, 50, 128, 77, - 85, 45, 49, 128, 77, 213, 77, 84, 65, 86, 82, 85, 76, 201, 77, 83, 128, - 77, 82, 207, 77, 210, 77, 80, 65, 128, 77, 79, 89, 65, 73, 128, 77, 79, - 88, 128, 77, 79, 86, 73, 197, 77, 79, 86, 69, 211, 77, 79, 86, 69, 77, - 69, 78, 84, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 77, 79, 86, 69, 77, - 69, 78, 84, 45, 72, 73, 78, 71, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, - 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 77, 79, 86, 69, 77, 69, 78, 84, - 45, 68, 73, 65, 71, 79, 78, 65, 204, 77, 79, 86, 69, 77, 69, 78, 84, 128, - 77, 79, 86, 69, 77, 69, 78, 212, 77, 79, 86, 69, 196, 77, 79, 86, 69, - 128, 77, 79, 85, 84, 72, 128, 77, 79, 85, 83, 69, 128, 77, 79, 85, 83, - 197, 77, 79, 85, 78, 84, 65, 73, 78, 83, 128, 77, 79, 85, 78, 84, 65, 73, - 78, 128, 77, 79, 85, 78, 84, 65, 73, 206, 77, 79, 85, 78, 212, 77, 79, - 85, 78, 68, 128, 77, 79, 85, 78, 196, 77, 79, 84, 79, 82, 87, 65, 89, - 128, 77, 79, 84, 79, 82, 73, 90, 69, 196, 77, 79, 84, 79, 82, 67, 89, 67, - 76, 69, 128, 77, 79, 84, 79, 210, 77, 79, 84, 72, 69, 82, 128, 77, 79, - 84, 72, 69, 210, 77, 79, 84, 128, 77, 79, 83, 81, 85, 73, 84, 79, 128, - 77, 79, 83, 81, 85, 69, 128, 77, 79, 82, 84, 85, 85, 77, 128, 77, 79, 82, - 84, 65, 82, 128, 77, 79, 82, 80, 72, 79, 76, 79, 71, 73, 67, 65, 204, 77, - 79, 82, 78, 73, 78, 71, 128, 77, 79, 80, 128, 77, 79, 79, 83, 69, 45, 67, - 82, 69, 197, 77, 79, 79, 78, 128, 77, 79, 79, 206, 77, 79, 79, 77, 80, - 85, 81, 128, 77, 79, 79, 77, 69, 85, 84, 128, 77, 79, 79, 68, 128, 77, - 79, 79, 196, 77, 79, 79, 128, 77, 79, 78, 84, 73, 69, 69, 78, 128, 77, - 79, 78, 84, 72, 128, 77, 79, 78, 84, 200, 77, 79, 78, 83, 84, 69, 82, - 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, 197, 77, 79, 78, 79, 83, 80, 65, - 67, 197, 77, 79, 78, 79, 82, 65, 73, 76, 128, 77, 79, 78, 79, 71, 82, 65, - 80, 200, 77, 79, 78, 79, 71, 82, 65, 77, 77, 79, 211, 77, 79, 78, 79, 71, - 82, 65, 205, 77, 79, 78, 79, 70, 79, 78, 73, 65, 83, 128, 77, 79, 78, 79, - 67, 85, 76, 65, 210, 77, 79, 78, 79, 67, 76, 69, 128, 77, 79, 78, 75, 69, - 89, 128, 77, 79, 78, 75, 69, 217, 77, 79, 78, 73, 128, 77, 79, 78, 71, - 75, 69, 85, 65, 69, 81, 128, 77, 79, 78, 69, 89, 45, 77, 79, 85, 84, 200, - 77, 79, 78, 69, 217, 77, 79, 78, 128, 77, 79, 206, 77, 79, 76, 128, 77, - 79, 72, 65, 77, 77, 65, 196, 77, 79, 68, 85, 76, 207, 77, 79, 68, 73, 70, - 73, 69, 82, 45, 57, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 56, 128, 77, - 79, 68, 73, 70, 73, 69, 82, 45, 55, 128, 77, 79, 68, 73, 70, 73, 69, 82, - 45, 54, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 53, 128, 77, 79, 68, 73, - 70, 73, 69, 82, 45, 52, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 51, 128, - 77, 79, 68, 73, 70, 73, 69, 82, 45, 50, 128, 77, 79, 68, 73, 70, 73, 69, - 82, 45, 49, 54, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 53, 128, 77, - 79, 68, 73, 70, 73, 69, 82, 45, 49, 52, 128, 77, 79, 68, 73, 70, 73, 69, - 82, 45, 49, 51, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 50, 128, 77, - 79, 68, 73, 70, 73, 69, 82, 45, 49, 49, 128, 77, 79, 68, 73, 70, 73, 69, - 82, 45, 49, 48, 128, 77, 79, 68, 73, 70, 73, 69, 82, 128, 77, 79, 68, - 201, 77, 79, 68, 69, 83, 84, 89, 128, 77, 79, 68, 69, 82, 206, 77, 79, - 68, 69, 77, 128, 77, 79, 68, 69, 76, 83, 128, 77, 79, 68, 69, 76, 128, - 77, 79, 68, 69, 128, 77, 79, 66, 73, 76, 197, 77, 79, 65, 128, 77, 79, - 45, 54, 128, 77, 79, 45, 53, 128, 77, 79, 45, 52, 128, 77, 79, 45, 51, - 128, 77, 207, 77, 78, 89, 65, 205, 77, 78, 65, 83, 128, 77, 77, 83, 80, - 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, 77, 76, 128, 77, 75, 80, 65, - 82, 65, 209, 77, 73, 88, 128, 77, 73, 84, 128, 77, 73, 83, 82, 65, 128, - 77, 73, 82, 73, 66, 65, 65, 82, 85, 128, 77, 73, 82, 73, 128, 77, 73, 82, - 69, 68, 128, 77, 73, 80, 128, 77, 73, 78, 89, 128, 77, 73, 78, 85, 83, - 45, 79, 82, 45, 80, 76, 85, 211, 77, 73, 78, 85, 83, 128, 77, 73, 78, 73, - 83, 84, 69, 82, 128, 77, 73, 78, 73, 77, 73, 90, 69, 128, 77, 73, 78, 73, - 77, 65, 128, 77, 73, 78, 73, 68, 73, 83, 67, 128, 77, 73, 78, 73, 66, 85, - 83, 128, 77, 73, 77, 69, 128, 77, 73, 77, 128, 77, 73, 76, 76, 73, 79, - 78, 83, 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 73, 76, 76, 69, 84, - 128, 77, 73, 76, 76, 197, 77, 73, 76, 204, 77, 73, 76, 75, 217, 77, 73, - 76, 75, 128, 77, 73, 76, 73, 84, 65, 82, 217, 77, 73, 76, 128, 77, 73, - 75, 85, 82, 79, 78, 128, 77, 73, 75, 82, 79, 206, 77, 73, 75, 82, 73, - 128, 77, 73, 73, 78, 128, 77, 73, 73, 77, 128, 77, 73, 73, 128, 77, 73, - 199, 77, 73, 69, 88, 128, 77, 73, 69, 85, 77, 45, 84, 73, 75, 69, 85, 84, - 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 77, - 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 77, 73, - 69, 85, 77, 45, 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, 77, 45, 80, 73, - 69, 85, 80, 45, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, - 85, 80, 128, 77, 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 77, - 73, 69, 85, 77, 45, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 67, - 73, 69, 85, 67, 128, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, 72, - 128, 77, 73, 69, 85, 205, 77, 73, 69, 80, 128, 77, 73, 69, 69, 128, 77, - 73, 69, 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, 68, 68, 76, 69, 45, 87, - 69, 76, 83, 200, 77, 73, 68, 68, 76, 69, 128, 77, 73, 68, 45, 76, 69, 86, - 69, 204, 77, 73, 196, 77, 73, 67, 82, 79, 83, 67, 79, 80, 69, 128, 77, - 73, 67, 82, 79, 80, 72, 79, 78, 69, 128, 77, 73, 67, 82, 79, 66, 69, 128, - 77, 73, 67, 82, 207, 77, 73, 67, 210, 77, 73, 45, 55, 128, 77, 73, 45, - 54, 128, 77, 73, 45, 53, 128, 77, 73, 45, 52, 128, 77, 73, 45, 51, 128, - 77, 73, 45, 50, 128, 77, 73, 45, 49, 128, 77, 72, 90, 128, 77, 72, 65, - 128, 77, 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, - 82, 88, 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, - 88, 128, 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, - 77, 71, 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, - 79, 128, 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, - 71, 69, 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 66, 85, - 128, 77, 71, 66, 79, 79, 128, 77, 71, 66, 79, 70, 85, 77, 128, 77, 71, - 66, 79, 128, 77, 71, 66, 73, 128, 77, 71, 66, 69, 85, 78, 128, 77, 71, - 66, 69, 78, 128, 77, 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, - 66, 65, 83, 65, 81, 128, 77, 71, 66, 65, 83, 65, 128, 77, 71, 65, 88, - 128, 77, 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, 128, 77, 71, - 128, 77, 70, 79, 78, 128, 77, 70, 79, 206, 77, 70, 79, 128, 77, 70, 73, - 89, 65, 81, 128, 77, 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, 128, 77, - 70, 69, 85, 81, 128, 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, 65, 128, - 77, 69, 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, 69, 85, - 81, 128, 77, 69, 85, 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, 69, 85, - 78, 128, 77, 69, 84, 82, 79, 128, 77, 69, 84, 82, 73, 67, 65, 204, 77, - 69, 84, 82, 73, 65, 128, 77, 69, 84, 82, 69, 84, 69, 211, 77, 69, 84, 79, - 66, 69, 76, 85, 83, 128, 77, 69, 84, 69, 75, 128, 77, 69, 84, 69, 71, - 128, 77, 69, 84, 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, - 73, 65, 206, 77, 69, 83, 83, 65, 71, 69, 128, 77, 69, 83, 83, 65, 71, - 197, 77, 69, 83, 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, - 69, 82, 80, 69, 82, 83, 79, 78, 128, 77, 69, 82, 75, 72, 65, 128, 77, 69, - 82, 75, 72, 193, 77, 69, 82, 73, 68, 73, 65, 78, 83, 128, 77, 69, 82, 73, - 128, 77, 69, 82, 71, 69, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, 69, - 82, 67, 85, 82, 217, 77, 69, 78, 79, 82, 65, 200, 77, 69, 78, 79, 69, - 128, 77, 69, 78, 68, 85, 84, 128, 77, 69, 78, 128, 77, 69, 77, 79, 128, - 77, 69, 77, 66, 69, 82, 83, 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, - 77, 69, 77, 66, 69, 210, 77, 69, 77, 45, 81, 79, 80, 72, 128, 77, 69, 77, - 128, 77, 69, 205, 77, 69, 76, 79, 68, 73, 195, 77, 69, 76, 73, 75, 128, - 77, 69, 73, 90, 73, 128, 77, 69, 71, 65, 84, 79, 78, 128, 77, 69, 71, 65, - 80, 72, 79, 78, 69, 128, 77, 69, 71, 65, 76, 73, 128, 77, 69, 69, 84, 79, - 82, 85, 128, 77, 69, 69, 84, 69, 201, 77, 69, 69, 84, 128, 77, 69, 69, - 77, 85, 128, 77, 69, 69, 77, 128, 77, 69, 69, 202, 77, 69, 69, 69, 69, - 128, 77, 69, 68, 73, 85, 77, 128, 77, 69, 68, 73, 85, 205, 77, 69, 68, - 73, 69, 86, 65, 204, 77, 69, 68, 73, 67, 73, 78, 69, 128, 77, 69, 68, 73, - 67, 65, 204, 77, 69, 68, 73, 65, 204, 77, 69, 68, 69, 70, 65, 73, 68, 82, - 73, 206, 77, 69, 68, 65, 76, 128, 77, 69, 67, 72, 65, 78, 73, 67, 65, - 204, 77, 69, 65, 84, 128, 77, 69, 65, 212, 77, 69, 65, 83, 85, 82, 69, - 196, 77, 69, 65, 83, 85, 82, 69, 128, 77, 69, 65, 83, 85, 82, 197, 77, - 69, 45, 77, 65, 128, 77, 69, 45, 50, 128, 77, 69, 45, 49, 128, 77, 68, - 85, 206, 77, 196, 77, 67, 72, 213, 77, 67, 72, 65, 206, 77, 195, 77, 66, - 85, 85, 128, 77, 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, 66, 85, - 69, 128, 77, 66, 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, 77, 66, - 79, 79, 128, 77, 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, 212, 77, - 66, 73, 82, 73, 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, 85, 88, - 128, 77, 66, 69, 85, 82, 73, 128, 77, 66, 69, 85, 77, 128, 77, 66, 69, - 82, 65, 69, 128, 77, 66, 69, 78, 128, 77, 66, 69, 69, 75, 69, 69, 84, - 128, 77, 66, 69, 69, 128, 77, 66, 69, 128, 77, 66, 65, 81, 128, 77, 66, - 65, 78, 89, 73, 128, 77, 66, 65, 65, 82, 65, 69, 128, 77, 66, 65, 65, 75, - 69, 84, 128, 77, 66, 65, 65, 128, 77, 66, 65, 193, 77, 66, 193, 77, 66, - 52, 128, 77, 66, 51, 128, 77, 66, 50, 128, 77, 65, 89, 69, 203, 77, 65, - 89, 65, 78, 78, 65, 128, 77, 65, 89, 65, 206, 77, 65, 89, 128, 77, 65, - 88, 73, 77, 73, 90, 69, 128, 77, 65, 88, 73, 77, 65, 128, 77, 65, 88, - 128, 77, 65, 85, 128, 77, 65, 84, 84, 79, 67, 75, 128, 77, 65, 84, 82, - 73, 88, 128, 77, 65, 84, 69, 82, 73, 65, 76, 83, 128, 77, 65, 84, 128, - 77, 65, 83, 213, 77, 65, 83, 83, 73, 78, 71, 128, 77, 65, 83, 83, 65, 71, - 69, 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 75, 128, 77, 65, 83, 72, - 70, 65, 65, 84, 128, 77, 65, 83, 72, 50, 128, 77, 65, 83, 67, 85, 76, 73, - 78, 197, 77, 65, 83, 65, 82, 65, 205, 77, 65, 82, 89, 128, 77, 65, 82, - 87, 65, 82, 201, 77, 65, 82, 85, 75, 85, 128, 77, 65, 82, 84, 89, 82, 73, - 193, 77, 65, 82, 84, 73, 65, 204, 77, 65, 82, 82, 89, 73, 78, 199, 77, - 65, 82, 82, 73, 65, 71, 197, 77, 65, 82, 82, 65, 84, 65, 78, 128, 77, 65, - 82, 75, 211, 77, 65, 82, 75, 69, 82, 128, 77, 65, 82, 75, 45, 52, 128, - 77, 65, 82, 75, 45, 51, 128, 77, 65, 82, 75, 45, 50, 128, 77, 65, 82, 75, - 45, 49, 128, 77, 65, 82, 69, 128, 77, 65, 82, 67, 72, 69, 206, 77, 65, - 82, 67, 72, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, 67, 67, 65, - 84, 79, 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 83, 73, - 84, 69, 128, 77, 65, 82, 66, 85, 84, 65, 128, 77, 65, 82, 66, 85, 84, - 193, 77, 65, 82, 128, 77, 65, 81, 65, 70, 128, 77, 65, 81, 128, 77, 65, - 80, 76, 197, 77, 65, 80, 73, 81, 128, 77, 65, 208, 77, 65, 79, 128, 77, - 65, 78, 85, 65, 204, 77, 65, 78, 84, 69, 76, 80, 73, 69, 67, 197, 77, 65, - 78, 83, 89, 79, 78, 128, 77, 65, 78, 83, 85, 65, 69, 128, 77, 65, 78, 78, - 65, 218, 77, 65, 78, 78, 65, 128, 77, 65, 78, 73, 67, 72, 65, 69, 65, - 206, 77, 65, 78, 71, 79, 128, 77, 65, 78, 71, 65, 76, 65, 77, 128, 77, - 65, 78, 68, 65, 82, 73, 78, 128, 77, 65, 78, 68, 65, 73, 76, 73, 78, 199, - 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72, 213, 77, 65, 78, 65, - 212, 77, 65, 78, 65, 67, 76, 69, 83, 128, 77, 65, 76, 84, 69, 83, 197, - 77, 65, 76, 69, 69, 82, 73, 128, 77, 65, 76, 69, 128, 77, 65, 76, 197, - 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, 128, 77, 65, 75, - 83, 85, 82, 193, 77, 65, 75, 65, 83, 65, 210, 77, 65, 73, 90, 69, 128, - 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, 73, 75, 72, 85, - 128, 77, 65, 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78, 128, 77, 65, - 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 76, 66, 79, 216, 77, 65, 73, 75, - 85, 82, 79, 128, 77, 65, 73, 68, 69, 78, 128, 77, 65, 73, 128, 77, 65, - 72, 74, 79, 78, 199, 77, 65, 72, 72, 65, 128, 77, 65, 72, 65, 80, 82, 65, - 78, 65, 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, 65, 72, 65, 74, 65, - 78, 201, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, 65, 72, 128, - 77, 65, 71, 78, 73, 70, 89, 73, 78, 199, 77, 65, 71, 78, 69, 84, 128, 77, - 65, 71, 69, 128, 77, 65, 69, 83, 73, 128, 77, 65, 69, 78, 89, 73, 128, - 77, 65, 69, 78, 74, 69, 84, 128, 77, 65, 69, 77, 86, 69, 85, 88, 128, 77, - 65, 69, 77, 75, 80, 69, 78, 128, 77, 65, 69, 77, 71, 66, 73, 69, 69, 128, - 77, 65, 69, 77, 66, 71, 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 65, 128, - 77, 65, 69, 77, 128, 77, 65, 69, 76, 69, 69, 128, 77, 65, 69, 75, 69, 85, - 80, 128, 77, 65, 68, 89, 65, 128, 77, 65, 68, 85, 128, 77, 65, 68, 68, - 65, 72, 128, 77, 65, 68, 68, 65, 200, 77, 65, 68, 68, 65, 128, 77, 65, - 68, 68, 193, 77, 65, 67, 82, 79, 78, 45, 71, 82, 65, 86, 69, 128, 77, 65, - 67, 82, 79, 78, 45, 66, 82, 69, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, - 65, 67, 85, 84, 69, 128, 77, 65, 67, 82, 79, 78, 128, 77, 65, 67, 82, 79, - 206, 77, 65, 67, 72, 73, 78, 69, 128, 77, 65, 65, 89, 89, 65, 65, 128, - 77, 65, 65, 73, 128, 77, 65, 65, 128, 77, 65, 50, 128, 77, 65, 45, 55, - 128, 77, 65, 45, 54, 128, 77, 65, 45, 53, 128, 77, 65, 45, 52, 128, 77, - 65, 45, 51, 128, 77, 65, 45, 50, 128, 77, 65, 45, 49, 128, 77, 49, 57, - 183, 77, 49, 57, 182, 77, 49, 57, 181, 77, 49, 57, 180, 77, 49, 57, 179, - 77, 49, 57, 178, 77, 49, 57, 177, 77, 49, 57, 176, 77, 49, 56, 185, 77, - 49, 56, 184, 77, 49, 56, 183, 77, 49, 56, 182, 77, 49, 56, 181, 77, 49, - 56, 180, 77, 49, 56, 179, 77, 49, 56, 178, 77, 49, 56, 177, 77, 49, 56, - 176, 77, 49, 55, 185, 77, 49, 55, 184, 77, 49, 55, 183, 77, 49, 55, 182, - 77, 49, 55, 181, 77, 49, 55, 180, 77, 49, 55, 179, 77, 49, 55, 178, 77, - 49, 55, 177, 77, 49, 55, 176, 77, 49, 54, 185, 77, 49, 54, 184, 77, 49, - 54, 183, 77, 49, 54, 182, 77, 49, 54, 181, 77, 49, 54, 180, 77, 49, 54, - 179, 77, 49, 54, 178, 77, 49, 54, 177, 77, 49, 54, 176, 77, 49, 53, 185, - 77, 49, 53, 184, 77, 49, 53, 183, 77, 49, 53, 182, 77, 49, 53, 181, 77, - 49, 53, 180, 77, 49, 53, 179, 77, 49, 53, 178, 77, 49, 53, 177, 77, 49, - 53, 176, 77, 49, 52, 185, 77, 49, 52, 184, 77, 49, 52, 183, 77, 49, 52, - 182, 77, 49, 52, 181, 77, 49, 52, 180, 77, 49, 52, 179, 77, 49, 52, 178, - 77, 49, 52, 177, 77, 49, 52, 176, 77, 49, 51, 185, 77, 49, 51, 184, 77, - 49, 51, 183, 77, 49, 51, 182, 77, 49, 51, 181, 77, 49, 51, 180, 77, 49, - 51, 179, 77, 49, 51, 178, 77, 49, 51, 177, 77, 49, 51, 176, 77, 49, 50, - 185, 77, 49, 50, 184, 77, 49, 50, 183, 77, 49, 50, 182, 77, 49, 50, 181, - 77, 49, 50, 180, 77, 49, 50, 179, 77, 49, 50, 178, 77, 49, 50, 177, 77, - 49, 50, 176, 77, 49, 49, 185, 77, 49, 49, 184, 77, 49, 49, 183, 77, 49, - 49, 182, 77, 49, 49, 181, 77, 49, 49, 180, 77, 49, 49, 179, 77, 49, 49, - 178, 77, 49, 49, 177, 77, 49, 49, 176, 77, 49, 48, 185, 77, 49, 48, 184, - 77, 49, 48, 183, 77, 49, 48, 182, 77, 49, 48, 181, 77, 49, 48, 180, 77, - 49, 48, 179, 77, 49, 48, 178, 77, 49, 48, 177, 77, 49, 48, 176, 77, 48, - 57, 185, 77, 48, 57, 184, 77, 48, 57, 183, 77, 48, 57, 182, 77, 48, 57, - 181, 77, 48, 57, 180, 77, 48, 57, 179, 77, 48, 57, 178, 77, 48, 57, 177, - 77, 48, 57, 176, 77, 48, 56, 185, 77, 48, 56, 184, 77, 48, 56, 183, 77, - 48, 56, 182, 77, 48, 56, 181, 77, 48, 56, 180, 77, 48, 56, 179, 77, 48, - 56, 178, 77, 48, 56, 177, 77, 48, 56, 176, 77, 48, 55, 185, 77, 48, 55, - 184, 77, 48, 55, 183, 77, 48, 55, 182, 77, 48, 55, 181, 77, 48, 55, 180, - 77, 48, 55, 179, 77, 48, 55, 178, 77, 48, 55, 177, 77, 48, 55, 176, 77, - 48, 54, 185, 77, 48, 54, 184, 77, 48, 54, 183, 77, 48, 54, 182, 77, 48, - 54, 181, 77, 48, 54, 180, 77, 48, 54, 179, 77, 48, 54, 178, 77, 48, 54, - 177, 77, 48, 54, 176, 77, 48, 53, 185, 77, 48, 53, 184, 77, 48, 53, 183, - 77, 48, 53, 182, 77, 48, 53, 181, 77, 48, 53, 180, 77, 48, 53, 179, 77, - 48, 53, 178, 77, 48, 53, 177, 77, 48, 53, 176, 77, 48, 52, 185, 77, 48, - 52, 184, 77, 48, 52, 183, 77, 48, 52, 182, 77, 48, 52, 181, 77, 48, 52, - 52, 128, 77, 48, 52, 180, 77, 48, 52, 51, 128, 77, 48, 52, 179, 77, 48, - 52, 50, 128, 77, 48, 52, 178, 77, 48, 52, 49, 128, 77, 48, 52, 177, 77, - 48, 52, 48, 65, 128, 77, 48, 52, 48, 128, 77, 48, 52, 176, 77, 48, 51, - 57, 128, 77, 48, 51, 185, 77, 48, 51, 56, 128, 77, 48, 51, 184, 77, 48, - 51, 55, 128, 77, 48, 51, 183, 77, 48, 51, 54, 128, 77, 48, 51, 182, 77, - 48, 51, 53, 128, 77, 48, 51, 181, 77, 48, 51, 52, 128, 77, 48, 51, 180, - 77, 48, 51, 51, 66, 128, 77, 48, 51, 51, 65, 128, 77, 48, 51, 51, 128, - 77, 48, 51, 179, 77, 48, 51, 50, 128, 77, 48, 51, 178, 77, 48, 51, 49, - 65, 128, 77, 48, 51, 49, 128, 77, 48, 51, 177, 77, 48, 51, 48, 128, 77, - 48, 51, 176, 77, 48, 50, 57, 128, 77, 48, 50, 185, 77, 48, 50, 56, 65, - 128, 77, 48, 50, 56, 128, 77, 48, 50, 184, 77, 48, 50, 55, 128, 77, 48, - 50, 183, 77, 48, 50, 54, 128, 77, 48, 50, 182, 77, 48, 50, 53, 128, 77, - 48, 50, 181, 77, 48, 50, 52, 65, 128, 77, 48, 50, 52, 128, 77, 48, 50, - 180, 77, 48, 50, 51, 128, 77, 48, 50, 179, 77, 48, 50, 50, 65, 128, 77, - 48, 50, 50, 128, 77, 48, 50, 178, 77, 48, 50, 49, 128, 77, 48, 50, 177, - 77, 48, 50, 48, 128, 77, 48, 50, 176, 77, 48, 49, 57, 128, 77, 48, 49, - 185, 77, 48, 49, 56, 128, 77, 48, 49, 184, 77, 48, 49, 55, 65, 128, 77, - 48, 49, 55, 128, 77, 48, 49, 183, 77, 48, 49, 54, 65, 128, 77, 48, 49, - 54, 128, 77, 48, 49, 182, 77, 48, 49, 53, 65, 128, 77, 48, 49, 53, 128, - 77, 48, 49, 181, 77, 48, 49, 52, 128, 77, 48, 49, 180, 77, 48, 49, 51, - 128, 77, 48, 49, 179, 77, 48, 49, 50, 72, 128, 77, 48, 49, 50, 71, 128, - 77, 48, 49, 50, 70, 128, 77, 48, 49, 50, 69, 128, 77, 48, 49, 50, 68, - 128, 77, 48, 49, 50, 67, 128, 77, 48, 49, 50, 66, 128, 77, 48, 49, 50, - 65, 128, 77, 48, 49, 50, 128, 77, 48, 49, 178, 77, 48, 49, 49, 128, 77, - 48, 49, 177, 77, 48, 49, 48, 65, 128, 77, 48, 49, 48, 128, 77, 48, 49, - 176, 77, 48, 48, 57, 128, 77, 48, 48, 185, 77, 48, 48, 56, 128, 77, 48, - 48, 184, 77, 48, 48, 55, 128, 77, 48, 48, 183, 77, 48, 48, 54, 128, 77, - 48, 48, 182, 77, 48, 48, 53, 128, 77, 48, 48, 181, 77, 48, 48, 52, 128, - 77, 48, 48, 180, 77, 48, 48, 51, 65, 128, 77, 48, 48, 51, 128, 77, 48, - 48, 179, 77, 48, 48, 50, 128, 77, 48, 48, 178, 77, 48, 48, 49, 66, 128, - 77, 48, 48, 49, 65, 128, 77, 48, 48, 49, 128, 77, 48, 48, 177, 76, 218, - 76, 89, 89, 128, 76, 89, 88, 128, 76, 89, 84, 128, 76, 89, 82, 88, 128, - 76, 89, 82, 128, 76, 89, 80, 128, 76, 89, 73, 84, 128, 76, 89, 73, 78, - 199, 76, 89, 68, 73, 65, 206, 76, 89, 67, 73, 65, 206, 76, 88, 128, 76, - 87, 79, 79, 128, 76, 87, 79, 128, 76, 87, 73, 73, 128, 76, 87, 73, 128, - 76, 87, 69, 128, 76, 87, 65, 65, 128, 76, 87, 65, 128, 76, 85, 88, 128, - 76, 85, 85, 128, 76, 85, 84, 128, 76, 85, 82, 88, 128, 76, 85, 80, 128, - 76, 85, 79, 88, 128, 76, 85, 79, 84, 128, 76, 85, 79, 80, 128, 76, 85, - 79, 128, 76, 85, 78, 71, 83, 73, 128, 76, 85, 78, 65, 84, 197, 76, 85, - 205, 76, 85, 76, 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, 128, 76, - 85, 72, 128, 76, 85, 200, 76, 85, 71, 71, 65, 71, 69, 128, 76, 85, 71, - 65, 76, 128, 76, 85, 71, 65, 204, 76, 85, 69, 128, 76, 85, 197, 76, 85, - 66, 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, 76, 85, 50, 128, 76, - 85, 178, 76, 82, 79, 128, 76, 82, 77, 128, 76, 82, 73, 128, 76, 82, 69, - 128, 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, 197, 76, - 79, 88, 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87, 69, 210, 76, 79, - 87, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 76, 79, 87, 45, 77, 73, - 196, 76, 79, 87, 45, 70, 65, 76, 76, 73, 78, 199, 76, 79, 87, 45, 185, - 76, 79, 86, 197, 76, 79, 85, 82, 69, 128, 76, 79, 85, 68, 83, 80, 69, 65, - 75, 69, 82, 128, 76, 79, 85, 68, 76, 217, 76, 79, 84, 85, 83, 128, 76, - 79, 84, 85, 211, 76, 79, 84, 73, 79, 206, 76, 79, 84, 128, 76, 79, 83, - 83, 76, 69, 83, 83, 128, 76, 79, 82, 82, 89, 128, 76, 79, 82, 82, 65, 73, - 78, 69, 128, 76, 79, 81, 128, 76, 79, 80, 128, 76, 79, 79, 84, 128, 76, - 79, 79, 80, 69, 196, 76, 79, 79, 80, 128, 76, 79, 79, 208, 76, 79, 79, - 78, 128, 76, 79, 79, 203, 76, 79, 79, 128, 76, 79, 78, 83, 85, 77, 128, - 76, 79, 78, 71, 65, 128, 76, 79, 78, 71, 193, 76, 79, 78, 71, 45, 76, 69, - 71, 71, 69, 196, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 89, 82, - 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 83, 79, 204, 76, 79, - 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, 76, 79, 78, 71, 45, - 66, 82, 65, 78, 67, 72, 45, 77, 65, 68, 210, 76, 79, 78, 71, 45, 66, 82, - 65, 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 76, 79, 78, 71, 45, 66, 82, - 65, 78, 67, 72, 45, 65, 210, 76, 79, 77, 77, 65, 69, 128, 76, 79, 77, - 128, 76, 79, 205, 76, 79, 76, 76, 73, 80, 79, 80, 128, 76, 79, 76, 76, - 128, 76, 79, 71, 210, 76, 79, 71, 79, 84, 89, 80, 197, 76, 79, 71, 79, - 71, 82, 65, 205, 76, 79, 71, 128, 76, 79, 68, 69, 83, 84, 79, 78, 69, - 128, 76, 79, 67, 79, 77, 79, 84, 73, 86, 69, 128, 76, 79, 67, 75, 73, 78, - 71, 45, 83, 72, 73, 70, 212, 76, 79, 67, 203, 76, 79, 67, 65, 84, 73, 86, - 69, 128, 76, 79, 67, 65, 84, 73, 79, 78, 45, 87, 65, 76, 76, 80, 76, 65, - 78, 197, 76, 79, 67, 65, 84, 73, 79, 78, 45, 70, 76, 79, 79, 82, 80, 76, - 65, 78, 197, 76, 79, 67, 65, 84, 73, 79, 78, 128, 76, 79, 67, 65, 84, 73, - 79, 206, 76, 79, 66, 83, 84, 69, 82, 128, 76, 79, 65, 128, 76, 78, 128, - 76, 76, 85, 85, 128, 76, 76, 79, 79, 128, 76, 76, 76, 85, 85, 128, 76, - 76, 76, 85, 128, 76, 76, 76, 79, 79, 128, 76, 76, 76, 79, 128, 76, 76, - 76, 73, 73, 128, 76, 76, 76, 73, 128, 76, 76, 76, 69, 69, 128, 76, 76, - 76, 69, 128, 76, 76, 76, 65, 85, 128, 76, 76, 76, 65, 73, 128, 76, 76, - 76, 65, 65, 128, 76, 76, 76, 65, 128, 76, 76, 76, 128, 76, 76, 72, 65, - 128, 76, 76, 65, 77, 65, 128, 76, 74, 85, 68, 73, 74, 69, 128, 76, 74, - 69, 128, 76, 74, 128, 76, 73, 90, 65, 82, 68, 128, 76, 73, 88, 128, 76, - 73, 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, 84, 76, 69, 128, 76, - 73, 84, 84, 76, 197, 76, 73, 84, 84, 69, 210, 76, 73, 84, 82, 193, 76, - 73, 84, 200, 76, 73, 83, 213, 76, 73, 83, 128, 76, 73, 82, 193, 76, 73, - 81, 85, 73, 196, 76, 73, 81, 128, 76, 73, 80, 83, 84, 73, 67, 75, 128, - 76, 73, 80, 211, 76, 73, 208, 76, 73, 78, 75, 73, 78, 199, 76, 73, 78, - 75, 69, 196, 76, 73, 78, 203, 76, 73, 78, 71, 83, 65, 128, 76, 73, 78, - 69, 83, 128, 76, 73, 78, 69, 211, 76, 73, 78, 69, 45, 57, 128, 76, 73, - 78, 69, 45, 55, 128, 76, 73, 78, 69, 45, 51, 128, 76, 73, 78, 69, 45, 49, - 128, 76, 73, 77, 77, 85, 52, 128, 76, 73, 77, 77, 85, 50, 128, 76, 73, - 77, 77, 85, 128, 76, 73, 77, 77, 213, 76, 73, 77, 73, 84, 69, 196, 76, - 73, 77, 73, 84, 65, 84, 73, 79, 78, 128, 76, 73, 77, 73, 84, 128, 76, 73, - 77, 69, 128, 76, 73, 77, 66, 213, 76, 73, 77, 66, 211, 76, 73, 77, 194, - 76, 73, 76, 89, 128, 76, 73, 76, 73, 84, 72, 128, 76, 73, 76, 128, 76, - 73, 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, 71, 72, 84, 78, 73, 78, 199, - 76, 73, 71, 72, 84, 72, 79, 85, 83, 69, 128, 76, 73, 71, 72, 84, 128, 76, - 73, 71, 65, 84, 73, 78, 199, 76, 73, 70, 84, 69, 82, 128, 76, 73, 70, 69, - 128, 76, 73, 69, 88, 128, 76, 73, 69, 84, 128, 76, 73, 69, 80, 128, 76, - 73, 69, 69, 128, 76, 73, 69, 128, 76, 73, 68, 128, 76, 73, 67, 75, 73, - 78, 199, 76, 73, 66, 82, 65, 128, 76, 73, 66, 69, 82, 84, 89, 128, 76, - 73, 65, 66, 73, 76, 73, 84, 217, 76, 72, 73, 73, 128, 76, 72, 65, 86, 73, - 89, 65, 78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65, 128, 76, 72, 128, - 76, 69, 90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 73, 84, 65, 84, 73, 78, - 71, 128, 76, 69, 85, 77, 128, 76, 69, 85, 65, 69, 80, 128, 76, 69, 85, - 65, 69, 77, 128, 76, 69, 85, 128, 76, 69, 213, 76, 69, 84, 84, 69, 82, - 83, 128, 76, 69, 84, 84, 69, 82, 128, 76, 69, 212, 76, 69, 83, 83, 69, - 210, 76, 69, 83, 83, 45, 84, 72, 65, 78, 128, 76, 69, 83, 83, 45, 84, 72, - 65, 206, 76, 69, 83, 72, 128, 76, 69, 80, 67, 72, 193, 76, 69, 80, 128, - 76, 69, 79, 80, 65, 82, 68, 128, 76, 69, 79, 128, 76, 69, 78, 84, 73, 67, - 85, 76, 65, 210, 76, 69, 78, 73, 83, 128, 76, 69, 78, 73, 211, 76, 69, - 78, 71, 84, 72, 69, 78, 69, 82, 128, 76, 69, 78, 71, 84, 72, 45, 55, 128, - 76, 69, 78, 71, 84, 72, 45, 54, 128, 76, 69, 78, 71, 84, 72, 45, 53, 128, - 76, 69, 78, 71, 84, 72, 45, 52, 128, 76, 69, 78, 71, 84, 72, 45, 51, 128, - 76, 69, 78, 71, 84, 72, 45, 50, 128, 76, 69, 78, 71, 84, 72, 45, 49, 128, - 76, 69, 78, 71, 84, 200, 76, 69, 78, 71, 65, 128, 76, 69, 78, 71, 193, - 76, 69, 77, 79, 78, 128, 76, 69, 77, 79, 73, 128, 76, 69, 76, 69, 84, - 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, 77, 65, 128, 76, - 69, 73, 77, 77, 193, 76, 69, 73, 128, 76, 69, 71, 83, 128, 76, 69, 71, - 73, 79, 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, 71, 128, 76, 69, - 199, 76, 69, 70, 84, 87, 65, 82, 68, 83, 128, 76, 69, 70, 84, 45, 84, 79, - 45, 82, 73, 71, 72, 212, 76, 69, 70, 84, 45, 83, 84, 69, 205, 76, 69, 70, - 84, 45, 83, 73, 68, 197, 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, - 69, 70, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 76, 69, 70, 84, 45, 76, - 73, 71, 72, 84, 69, 196, 76, 69, 70, 84, 45, 72, 65, 78, 68, 69, 196, 76, - 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, 84, 45, 70, 65, 67, 73, 78, - 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, 69, 87, 65, 128, 76, 69, - 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 68, 71, 69, 82, 128, 76, - 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 70, 217, 76, 69, 65, 70, 128, - 76, 69, 65, 198, 76, 69, 65, 68, 69, 82, 128, 76, 69, 65, 196, 76, 68, - 65, 78, 128, 76, 68, 50, 128, 76, 67, 201, 76, 67, 197, 76, 65, 90, 217, - 76, 65, 89, 65, 78, 78, 65, 128, 76, 65, 88, 128, 76, 65, 87, 128, 76, - 65, 215, 76, 65, 85, 76, 65, 128, 76, 65, 85, 75, 65, 218, 76, 65, 85, - 74, 128, 76, 65, 85, 71, 72, 73, 78, 71, 128, 76, 65, 84, 73, 78, 65, 84, - 197, 76, 65, 84, 73, 75, 128, 76, 65, 84, 69, 82, 65, 204, 76, 65, 84, - 197, 76, 65, 83, 212, 76, 65, 82, 89, 78, 71, 69, 65, 204, 76, 65, 82, - 201, 76, 65, 82, 71, 69, 83, 84, 128, 76, 65, 82, 71, 69, 210, 76, 65, - 82, 71, 69, 128, 76, 65, 82, 71, 197, 76, 65, 81, 128, 76, 65, 80, 65, - 81, 128, 76, 65, 207, 76, 65, 78, 84, 69, 82, 78, 128, 76, 65, 78, 71, - 85, 65, 71, 197, 76, 65, 78, 69, 83, 128, 76, 65, 78, 196, 76, 65, 78, - 128, 76, 65, 77, 80, 128, 76, 65, 77, 69, 68, 72, 128, 76, 65, 77, 69, - 68, 128, 76, 65, 77, 69, 196, 76, 65, 77, 69, 128, 76, 65, 77, 197, 76, - 65, 77, 68, 65, 128, 76, 65, 77, 68, 128, 76, 65, 77, 66, 68, 193, 76, - 65, 77, 65, 68, 72, 128, 76, 65, 76, 128, 76, 65, 204, 76, 65, 75, 75, - 72, 65, 78, 71, 89, 65, 79, 128, 76, 65, 75, 72, 65, 78, 128, 76, 65, 75, - 72, 128, 76, 65, 75, 200, 76, 65, 75, 45, 55, 52, 57, 128, 76, 65, 75, - 45, 55, 50, 52, 128, 76, 65, 75, 45, 54, 54, 56, 128, 76, 65, 75, 45, 54, - 52, 56, 128, 76, 65, 75, 45, 54, 52, 184, 76, 65, 75, 45, 54, 51, 54, - 128, 76, 65, 75, 45, 54, 49, 55, 128, 76, 65, 75, 45, 54, 49, 183, 76, - 65, 75, 45, 54, 48, 56, 128, 76, 65, 75, 45, 53, 53, 48, 128, 76, 65, 75, - 45, 52, 57, 53, 128, 76, 65, 75, 45, 52, 57, 51, 128, 76, 65, 75, 45, 52, - 57, 50, 128, 76, 65, 75, 45, 52, 57, 48, 128, 76, 65, 75, 45, 52, 56, 51, - 128, 76, 65, 75, 45, 52, 55, 48, 128, 76, 65, 75, 45, 52, 53, 55, 128, - 76, 65, 75, 45, 52, 53, 48, 128, 76, 65, 75, 45, 52, 52, 57, 128, 76, 65, - 75, 45, 52, 52, 185, 76, 65, 75, 45, 52, 52, 49, 128, 76, 65, 75, 45, 51, - 57, 48, 128, 76, 65, 75, 45, 51, 56, 52, 128, 76, 65, 75, 45, 51, 56, 51, - 128, 76, 65, 75, 45, 51, 52, 56, 128, 76, 65, 75, 45, 51, 52, 55, 128, - 76, 65, 75, 45, 51, 52, 51, 128, 76, 65, 75, 45, 50, 54, 54, 128, 76, 65, - 75, 45, 50, 54, 53, 128, 76, 65, 75, 45, 50, 51, 56, 128, 76, 65, 75, 45, - 50, 50, 56, 128, 76, 65, 75, 45, 50, 50, 53, 128, 76, 65, 75, 45, 50, 50, - 48, 128, 76, 65, 75, 45, 50, 49, 57, 128, 76, 65, 75, 45, 50, 49, 48, - 128, 76, 65, 75, 45, 49, 52, 50, 128, 76, 65, 75, 45, 49, 51, 48, 128, - 76, 65, 75, 45, 48, 57, 50, 128, 76, 65, 75, 45, 48, 56, 49, 128, 76, 65, - 75, 45, 48, 56, 177, 76, 65, 75, 45, 48, 56, 48, 128, 76, 65, 75, 45, 48, - 55, 185, 76, 65, 75, 45, 48, 54, 50, 128, 76, 65, 75, 45, 48, 53, 49, - 128, 76, 65, 75, 45, 48, 53, 48, 128, 76, 65, 75, 45, 48, 51, 48, 128, - 76, 65, 75, 45, 48, 50, 53, 128, 76, 65, 75, 45, 48, 50, 49, 128, 76, 65, - 75, 45, 48, 50, 48, 128, 76, 65, 75, 45, 48, 48, 51, 128, 76, 65, 74, 65, - 78, 89, 65, 76, 65, 78, 128, 76, 65, 73, 78, 199, 76, 65, 201, 76, 65, - 72, 83, 72, 85, 128, 76, 65, 72, 128, 76, 65, 71, 85, 83, 128, 76, 65, - 71, 213, 76, 65, 71, 65, 82, 128, 76, 65, 71, 65, 210, 76, 65, 71, 65, - 66, 128, 76, 65, 71, 65, 194, 76, 65, 69, 86, 128, 76, 65, 69, 128, 76, - 65, 68, 217, 76, 65, 67, 82, 79, 83, 83, 197, 76, 65, 67, 75, 128, 76, - 65, 67, 65, 128, 76, 65, 66, 79, 85, 82, 73, 78, 71, 128, 76, 65, 66, 79, - 82, 128, 76, 65, 66, 73, 65, 76, 73, 90, 65, 84, 73, 79, 206, 76, 65, 66, - 73, 65, 204, 76, 65, 66, 69, 76, 128, 76, 65, 66, 65, 84, 128, 76, 65, - 194, 76, 65, 65, 78, 65, 69, 128, 76, 65, 65, 78, 128, 76, 65, 65, 77, - 85, 128, 76, 65, 65, 77, 128, 76, 65, 65, 73, 128, 76, 54, 128, 76, 52, - 128, 76, 51, 128, 76, 50, 128, 76, 48, 48, 54, 65, 128, 76, 48, 48, 50, - 65, 128, 76, 45, 84, 89, 80, 197, 76, 45, 83, 72, 65, 80, 69, 196, 75, - 89, 85, 82, 73, 73, 128, 75, 89, 85, 128, 75, 89, 79, 128, 75, 89, 76, - 73, 83, 77, 65, 128, 75, 89, 73, 128, 75, 89, 69, 128, 75, 89, 65, 84, - 72, 79, 211, 75, 89, 65, 65, 128, 75, 89, 65, 128, 75, 88, 87, 73, 128, - 75, 88, 87, 69, 69, 128, 75, 88, 87, 69, 128, 75, 88, 87, 65, 65, 128, - 75, 88, 87, 65, 128, 75, 88, 85, 128, 75, 88, 79, 128, 75, 88, 73, 128, - 75, 88, 69, 69, 128, 75, 88, 69, 128, 75, 88, 65, 65, 128, 75, 88, 65, - 128, 75, 87, 86, 128, 75, 87, 85, 51, 49, 56, 128, 75, 87, 79, 79, 128, - 75, 87, 79, 128, 75, 87, 77, 128, 75, 87, 73, 73, 128, 75, 87, 73, 128, - 75, 87, 69, 69, 128, 75, 87, 69, 128, 75, 87, 66, 128, 75, 87, 65, 89, - 128, 75, 87, 65, 69, 84, 128, 75, 87, 65, 65, 128, 75, 86, 65, 128, 75, - 86, 128, 75, 85, 90, 72, 73, 128, 75, 85, 88, 128, 75, 85, 86, 128, 75, - 85, 85, 72, 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, - 72, 85, 50, 128, 75, 85, 83, 72, 85, 178, 75, 85, 82, 88, 128, 75, 85, - 82, 85, 90, 69, 73, 82, 79, 128, 75, 85, 82, 84, 128, 75, 85, 82, 79, 79, - 78, 69, 128, 75, 85, 82, 128, 75, 85, 210, 75, 85, 81, 128, 75, 85, 79, - 88, 128, 75, 85, 79, 80, 128, 75, 85, 79, 208, 75, 85, 79, 77, 128, 75, - 85, 79, 128, 75, 85, 78, 71, 128, 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, + 196, 78, 69, 69, 68, 76, 69, 128, 78, 69, 67, 75, 84, 73, 69, 128, 78, + 69, 67, 75, 128, 78, 69, 66, 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 69, + 45, 75, 79, 128, 78, 68, 85, 88, 128, 78, 68, 85, 84, 128, 78, 68, 85, + 82, 88, 128, 78, 68, 85, 82, 128, 78, 68, 85, 80, 128, 78, 68, 85, 78, + 128, 78, 68, 213, 78, 68, 79, 88, 128, 78, 68, 79, 84, 128, 78, 68, 79, + 80, 128, 78, 68, 79, 79, 128, 78, 68, 79, 78, 128, 78, 68, 79, 77, 66, + 85, 128, 78, 68, 79, 76, 197, 78, 68, 73, 88, 128, 78, 68, 73, 84, 128, + 78, 68, 73, 81, 128, 78, 68, 73, 80, 128, 78, 68, 73, 69, 88, 128, 78, + 68, 73, 69, 128, 78, 68, 73, 68, 65, 128, 78, 68, 73, 65, 81, 128, 78, + 68, 69, 88, 128, 78, 68, 69, 85, 88, 128, 78, 68, 69, 85, 84, 128, 78, + 68, 69, 85, 65, 69, 82, 69, 69, 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, + 128, 78, 68, 69, 128, 78, 68, 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, + 65, 80, 128, 78, 68, 65, 77, 128, 78, 68, 65, 65, 78, 71, 71, 69, 85, 65, + 69, 84, 128, 78, 68, 65, 65, 128, 78, 68, 65, 193, 78, 67, 72, 65, 85, + 128, 78, 67, 65, 128, 78, 66, 89, 88, 128, 78, 66, 89, 84, 128, 78, 66, + 89, 82, 88, 128, 78, 66, 89, 82, 128, 78, 66, 89, 80, 128, 78, 66, 89, + 128, 78, 66, 85, 88, 128, 78, 66, 85, 84, 128, 78, 66, 85, 82, 88, 128, + 78, 66, 85, 82, 128, 78, 66, 85, 80, 128, 78, 66, 85, 128, 78, 66, 79, + 88, 128, 78, 66, 79, 84, 128, 78, 66, 79, 80, 128, 78, 66, 79, 128, 78, + 66, 73, 88, 128, 78, 66, 73, 84, 128, 78, 66, 73, 80, 128, 78, 66, 73, + 69, 88, 128, 78, 66, 73, 69, 80, 128, 78, 66, 73, 69, 128, 78, 66, 73, + 128, 78, 66, 72, 128, 78, 66, 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, + 65, 80, 128, 78, 66, 65, 128, 78, 65, 90, 65, 210, 78, 65, 89, 65, 78, + 78, 65, 128, 78, 65, 89, 128, 78, 65, 88, 73, 65, 206, 78, 65, 88, 128, + 78, 65, 85, 84, 72, 83, 128, 78, 65, 85, 83, 69, 65, 84, 69, 196, 78, 65, + 85, 68, 73, 218, 78, 65, 84, 85, 82, 65, 204, 78, 65, 84, 73, 79, 78, 65, + 204, 78, 65, 83, 75, 65, 80, 201, 78, 65, 83, 72, 73, 128, 78, 65, 83, + 65, 76, 73, 90, 65, 84, 73, 79, 78, 128, 78, 65, 83, 65, 76, 73, 90, 65, + 84, 73, 79, 206, 78, 65, 83, 65, 204, 78, 65, 82, 82, 79, 215, 78, 65, + 82, 128, 78, 65, 81, 128, 78, 65, 79, 211, 78, 65, 78, 83, 65, 78, 65, + 81, 128, 78, 65, 78, 71, 77, 79, 78, 84, 72, 79, 128, 78, 65, 78, 68, 73, + 78, 65, 71, 65, 82, 201, 78, 65, 78, 68, 128, 78, 65, 78, 65, 128, 78, + 65, 77, 69, 128, 78, 65, 77, 197, 78, 65, 77, 50, 128, 78, 65, 75, 128, + 78, 65, 73, 82, 193, 78, 65, 73, 204, 78, 65, 71, 82, 201, 78, 65, 71, + 65, 82, 128, 78, 65, 71, 65, 128, 78, 65, 71, 193, 78, 65, 71, 128, 78, + 65, 199, 78, 65, 69, 128, 78, 65, 66, 76, 65, 128, 78, 65, 66, 65, 84, + 65, 69, 65, 206, 78, 65, 65, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, + 75, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, 73, 128, 78, 65, 193, + 78, 65, 52, 128, 78, 65, 50, 128, 78, 65, 45, 57, 128, 78, 65, 45, 56, + 128, 78, 65, 45, 55, 128, 78, 65, 45, 54, 128, 78, 65, 45, 53, 128, 78, + 65, 45, 52, 128, 78, 65, 45, 51, 128, 78, 65, 45, 50, 128, 78, 65, 45, + 49, 128, 78, 48, 52, 50, 128, 78, 48, 52, 49, 128, 78, 48, 52, 48, 128, + 78, 48, 51, 57, 128, 78, 48, 51, 56, 128, 78, 48, 51, 55, 65, 128, 78, + 48, 51, 55, 128, 78, 48, 51, 54, 128, 78, 48, 51, 53, 65, 128, 78, 48, + 51, 53, 128, 78, 48, 51, 52, 65, 128, 78, 48, 51, 52, 128, 78, 48, 51, + 51, 65, 128, 78, 48, 51, 51, 128, 78, 48, 51, 50, 128, 78, 48, 51, 49, + 128, 78, 48, 51, 48, 128, 78, 48, 50, 57, 128, 78, 48, 50, 56, 128, 78, + 48, 50, 55, 128, 78, 48, 50, 54, 128, 78, 48, 50, 53, 65, 128, 78, 48, + 50, 53, 128, 78, 48, 50, 52, 128, 78, 48, 50, 51, 128, 78, 48, 50, 50, + 128, 78, 48, 50, 49, 128, 78, 48, 50, 48, 128, 78, 48, 49, 57, 128, 78, + 48, 49, 56, 66, 128, 78, 48, 49, 56, 65, 128, 78, 48, 49, 56, 128, 78, + 48, 49, 55, 128, 78, 48, 49, 54, 128, 78, 48, 49, 53, 128, 78, 48, 49, + 52, 128, 78, 48, 49, 51, 128, 78, 48, 49, 50, 128, 78, 48, 49, 49, 128, + 78, 48, 49, 48, 128, 78, 48, 48, 57, 128, 78, 48, 48, 56, 128, 78, 48, + 48, 55, 128, 78, 48, 48, 54, 128, 78, 48, 48, 53, 128, 78, 48, 48, 52, + 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, 128, 78, 48, 48, 49, 128, 78, + 45, 77, 85, 45, 77, 79, 45, 50, 128, 78, 45, 77, 85, 45, 77, 79, 45, 49, + 128, 78, 45, 67, 82, 69, 197, 78, 45, 65, 82, 217, 77, 89, 88, 128, 77, + 89, 84, 128, 77, 89, 83, 76, 73, 84, 69, 128, 77, 89, 80, 128, 77, 89, + 65, 128, 77, 89, 193, 77, 89, 128, 77, 87, 79, 79, 128, 77, 87, 79, 128, + 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, 87, 69, 69, 128, 77, 87, 69, + 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, 77, 87, 128, 77, 215, 77, 86, + 83, 128, 77, 86, 79, 80, 128, 77, 86, 73, 128, 77, 86, 69, 85, 65, 69, + 78, 71, 65, 77, 128, 77, 86, 128, 77, 214, 77, 85, 88, 128, 77, 85, 85, + 86, 85, 90, 72, 65, 75, 75, 85, 128, 77, 85, 85, 83, 73, 75, 65, 84, 79, + 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, 193, 77, 85, 85, 128, 77, + 85, 84, 72, 65, 76, 73, 89, 65, 128, 77, 85, 84, 128, 77, 85, 83, 73, 67, + 128, 77, 85, 83, 73, 195, 77, 85, 83, 72, 82, 79, 79, 77, 128, 77, 85, + 83, 72, 51, 128, 77, 85, 83, 72, 179, 77, 85, 83, 72, 128, 77, 85, 83, + 200, 77, 85, 83, 128, 77, 85, 82, 88, 128, 77, 85, 82, 71, 85, 50, 128, + 77, 85, 82, 69, 128, 77, 85, 82, 68, 65, 128, 77, 85, 82, 68, 193, 77, + 85, 82, 128, 77, 85, 81, 68, 65, 77, 128, 77, 85, 80, 128, 77, 85, 79, + 88, 128, 77, 85, 79, 84, 128, 77, 85, 79, 80, 128, 77, 85, 79, 77, 65, + 69, 128, 77, 85, 79, 128, 77, 85, 78, 83, 85, 66, 128, 77, 85, 78, 65, + 72, 128, 77, 85, 78, 128, 77, 85, 76, 84, 73, 83, 69, 84, 128, 77, 85, + 76, 84, 73, 83, 69, 212, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, + 79, 78, 128, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 206, 77, + 85, 76, 84, 73, 80, 76, 69, 128, 77, 85, 76, 84, 73, 80, 76, 197, 77, 85, + 76, 84, 73, 79, 67, 85, 76, 65, 210, 77, 85, 76, 84, 73, 77, 65, 80, 128, + 77, 85, 76, 84, 201, 77, 85, 76, 84, 65, 78, 201, 77, 85, 75, 80, 72, 82, + 69, 78, 71, 128, 77, 85, 75, 75, 85, 82, 85, 78, 73, 128, 77, 85, 73, 78, + 128, 77, 85, 71, 83, 128, 77, 85, 71, 128, 77, 85, 199, 77, 85, 69, 78, + 128, 77, 85, 69, 128, 77, 85, 67, 72, 128, 77, 85, 67, 200, 77, 85, 67, + 65, 65, 68, 128, 77, 85, 65, 83, 128, 77, 85, 65, 78, 128, 77, 85, 65, + 69, 128, 77, 85, 45, 71, 65, 65, 72, 76, 65, 193, 77, 85, 45, 52, 128, + 77, 85, 45, 51, 128, 77, 85, 45, 50, 128, 77, 85, 45, 49, 128, 77, 213, + 77, 84, 65, 86, 82, 85, 76, 201, 77, 83, 128, 77, 82, 207, 77, 210, 77, + 80, 65, 128, 77, 79, 89, 65, 73, 128, 77, 79, 88, 128, 77, 79, 86, 73, + 197, 77, 79, 86, 69, 211, 77, 79, 86, 69, 77, 69, 78, 84, 45, 87, 65, 76, + 76, 80, 76, 65, 78, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, 72, 73, 78, + 71, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, 70, 76, 79, 79, 82, 80, 76, + 65, 78, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, 68, 73, 65, 71, 79, 78, + 65, 204, 77, 79, 86, 69, 77, 69, 78, 84, 128, 77, 79, 86, 69, 77, 69, 78, + 212, 77, 79, 86, 69, 196, 77, 79, 86, 69, 128, 77, 79, 85, 84, 72, 128, + 77, 79, 85, 83, 69, 128, 77, 79, 85, 83, 197, 77, 79, 85, 78, 84, 65, 73, + 78, 83, 128, 77, 79, 85, 78, 84, 65, 73, 78, 128, 77, 79, 85, 78, 84, 65, + 73, 206, 77, 79, 85, 78, 212, 77, 79, 85, 78, 68, 128, 77, 79, 85, 78, + 196, 77, 79, 84, 79, 82, 87, 65, 89, 128, 77, 79, 84, 79, 82, 73, 90, 69, + 196, 77, 79, 84, 79, 82, 67, 89, 67, 76, 69, 128, 77, 79, 84, 79, 210, + 77, 79, 84, 72, 69, 82, 128, 77, 79, 84, 72, 69, 210, 77, 79, 84, 128, + 77, 79, 83, 81, 85, 73, 84, 79, 128, 77, 79, 83, 81, 85, 69, 128, 77, 79, + 82, 84, 85, 85, 77, 128, 77, 79, 82, 84, 65, 82, 128, 77, 79, 82, 80, 72, + 79, 76, 79, 71, 73, 67, 65, 204, 77, 79, 82, 78, 73, 78, 71, 128, 77, 79, + 80, 128, 77, 79, 79, 83, 69, 45, 67, 82, 69, 197, 77, 79, 79, 78, 128, + 77, 79, 79, 206, 77, 79, 79, 77, 80, 85, 81, 128, 77, 79, 79, 77, 69, 85, + 84, 128, 77, 79, 79, 68, 128, 77, 79, 79, 196, 77, 79, 79, 128, 77, 79, + 78, 84, 73, 69, 69, 78, 128, 77, 79, 78, 84, 72, 128, 77, 79, 78, 84, + 200, 77, 79, 78, 83, 84, 69, 82, 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, + 197, 77, 79, 78, 79, 83, 80, 65, 67, 197, 77, 79, 78, 79, 82, 65, 73, 76, + 128, 77, 79, 78, 79, 71, 82, 65, 80, 200, 77, 79, 78, 79, 71, 82, 65, 77, + 77, 79, 211, 77, 79, 78, 79, 71, 82, 65, 205, 77, 79, 78, 79, 70, 79, 78, + 73, 65, 83, 128, 77, 79, 78, 79, 67, 85, 76, 65, 210, 77, 79, 78, 79, 67, + 76, 69, 128, 77, 79, 78, 75, 69, 89, 128, 77, 79, 78, 75, 69, 217, 77, + 79, 78, 73, 128, 77, 79, 78, 71, 75, 69, 85, 65, 69, 81, 128, 77, 79, 78, + 69, 89, 45, 77, 79, 85, 84, 200, 77, 79, 78, 69, 217, 77, 79, 78, 128, + 77, 79, 206, 77, 79, 76, 128, 77, 79, 72, 65, 77, 77, 65, 196, 77, 79, + 68, 85, 76, 207, 77, 79, 68, 73, 70, 73, 69, 82, 45, 57, 128, 77, 79, 68, + 73, 70, 73, 69, 82, 45, 56, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 55, + 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 54, 128, 77, 79, 68, 73, 70, 73, + 69, 82, 45, 53, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 52, 128, 77, 79, + 68, 73, 70, 73, 69, 82, 45, 51, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, + 50, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 54, 128, 77, 79, 68, 73, + 70, 73, 69, 82, 45, 49, 53, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, + 52, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 51, 128, 77, 79, 68, 73, + 70, 73, 69, 82, 45, 49, 50, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, + 49, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 48, 128, 77, 79, 68, 73, + 70, 73, 69, 82, 128, 77, 79, 68, 201, 77, 79, 68, 69, 83, 84, 89, 128, + 77, 79, 68, 69, 82, 206, 77, 79, 68, 69, 77, 128, 77, 79, 68, 69, 76, 83, + 128, 77, 79, 68, 69, 76, 128, 77, 79, 68, 69, 128, 77, 79, 66, 73, 76, + 197, 77, 79, 65, 128, 77, 79, 45, 54, 128, 77, 79, 45, 53, 128, 77, 79, + 45, 52, 128, 77, 79, 45, 51, 128, 77, 207, 77, 78, 89, 65, 205, 77, 78, + 65, 83, 128, 77, 77, 83, 80, 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, + 77, 76, 128, 77, 75, 80, 65, 82, 65, 209, 77, 73, 88, 128, 77, 73, 84, + 128, 77, 73, 83, 82, 65, 128, 77, 73, 82, 82, 79, 82, 128, 77, 73, 82, + 73, 66, 65, 65, 82, 85, 128, 77, 73, 82, 73, 128, 77, 73, 82, 69, 68, + 128, 77, 73, 80, 128, 77, 73, 78, 89, 128, 77, 73, 78, 85, 83, 45, 79, + 82, 45, 80, 76, 85, 211, 77, 73, 78, 85, 83, 128, 77, 73, 78, 73, 83, 84, + 69, 82, 128, 77, 73, 78, 73, 77, 73, 90, 69, 128, 77, 73, 78, 73, 77, 65, + 128, 77, 73, 78, 73, 68, 73, 83, 67, 128, 77, 73, 78, 73, 66, 85, 83, + 128, 77, 73, 77, 69, 128, 77, 73, 77, 128, 77, 73, 76, 76, 73, 79, 78, + 83, 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 73, 76, 76, 69, 84, 128, + 77, 73, 76, 76, 197, 77, 73, 76, 204, 77, 73, 76, 75, 217, 77, 73, 76, + 75, 128, 77, 73, 76, 73, 84, 65, 82, 217, 77, 73, 76, 128, 77, 73, 75, + 85, 82, 79, 78, 128, 77, 73, 75, 82, 79, 206, 77, 73, 75, 82, 73, 128, + 77, 73, 73, 78, 128, 77, 73, 73, 77, 128, 77, 73, 73, 128, 77, 73, 199, + 77, 73, 69, 88, 128, 77, 73, 69, 85, 77, 45, 84, 73, 75, 69, 85, 84, 128, + 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 77, 73, + 69, 85, 77, 45, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 77, 73, 69, + 85, 77, 45, 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, + 85, 80, 45, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, + 80, 128, 77, 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 77, 73, + 69, 85, 77, 45, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 67, 73, + 69, 85, 67, 128, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, 72, 128, + 77, 73, 69, 85, 205, 77, 73, 69, 80, 128, 77, 73, 69, 69, 128, 77, 73, + 69, 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, 68, 68, 76, 69, 45, 87, 69, + 76, 83, 200, 77, 73, 68, 68, 76, 69, 128, 77, 73, 68, 45, 76, 69, 86, 69, + 204, 77, 73, 196, 77, 73, 67, 82, 79, 83, 67, 79, 80, 69, 128, 77, 73, + 67, 82, 79, 80, 72, 79, 78, 69, 128, 77, 73, 67, 82, 79, 66, 69, 128, 77, + 73, 67, 82, 207, 77, 73, 67, 210, 77, 73, 45, 55, 128, 77, 73, 45, 54, + 128, 77, 73, 45, 53, 128, 77, 73, 45, 52, 128, 77, 73, 45, 51, 128, 77, + 73, 45, 50, 128, 77, 73, 45, 49, 128, 77, 72, 90, 128, 77, 72, 65, 128, + 77, 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, 82, + 88, 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, 88, + 128, 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, 77, + 71, 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, 79, + 128, 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, 71, + 69, 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 66, 85, 128, + 77, 71, 66, 79, 79, 128, 77, 71, 66, 79, 70, 85, 77, 128, 77, 71, 66, 79, + 128, 77, 71, 66, 73, 128, 77, 71, 66, 69, 85, 78, 128, 77, 71, 66, 69, + 78, 128, 77, 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, 66, 65, + 83, 65, 81, 128, 77, 71, 66, 65, 83, 65, 128, 77, 71, 65, 88, 128, 77, + 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, 128, 77, 71, 128, 77, + 70, 79, 78, 128, 77, 70, 79, 206, 77, 70, 79, 128, 77, 70, 73, 89, 65, + 81, 128, 77, 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, 128, 77, 70, 69, + 85, 81, 128, 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, 65, 128, 77, 69, + 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, 69, 85, 81, 128, + 77, 69, 85, 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, 69, 85, 78, 128, + 77, 69, 84, 82, 79, 128, 77, 69, 84, 82, 73, 67, 65, 204, 77, 69, 84, 82, + 73, 65, 128, 77, 69, 84, 82, 69, 84, 69, 211, 77, 69, 84, 79, 66, 69, 76, + 85, 83, 128, 77, 69, 84, 69, 75, 128, 77, 69, 84, 69, 71, 128, 77, 69, + 84, 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, 73, 65, 206, + 77, 69, 83, 83, 65, 71, 69, 128, 77, 69, 83, 83, 65, 71, 197, 77, 69, 83, + 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, 69, 82, 80, 69, + 82, 83, 79, 78, 128, 77, 69, 82, 75, 72, 65, 128, 77, 69, 82, 75, 72, + 193, 77, 69, 82, 73, 68, 73, 65, 78, 83, 128, 77, 69, 82, 73, 128, 77, + 69, 82, 71, 69, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, 69, 82, 67, 85, + 82, 217, 77, 69, 78, 79, 82, 65, 200, 77, 69, 78, 79, 69, 128, 77, 69, + 78, 68, 85, 84, 128, 77, 69, 78, 128, 77, 69, 77, 79, 128, 77, 69, 77, + 66, 69, 82, 83, 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, 77, 69, 77, + 66, 69, 210, 77, 69, 77, 45, 81, 79, 80, 72, 128, 77, 69, 77, 128, 77, + 69, 205, 77, 69, 76, 79, 68, 73, 195, 77, 69, 76, 73, 75, 128, 77, 69, + 73, 90, 73, 128, 77, 69, 71, 65, 84, 79, 78, 128, 77, 69, 71, 65, 80, 72, + 79, 78, 69, 128, 77, 69, 71, 65, 76, 73, 128, 77, 69, 69, 84, 79, 82, 85, + 128, 77, 69, 69, 84, 69, 201, 77, 69, 69, 84, 128, 77, 69, 69, 77, 85, + 128, 77, 69, 69, 77, 128, 77, 69, 69, 202, 77, 69, 69, 69, 69, 128, 77, + 69, 68, 73, 85, 77, 128, 77, 69, 68, 73, 85, 205, 77, 69, 68, 73, 69, 86, + 65, 204, 77, 69, 68, 73, 67, 73, 78, 69, 128, 77, 69, 68, 73, 67, 65, + 204, 77, 69, 68, 73, 65, 204, 77, 69, 68, 69, 70, 65, 73, 68, 82, 73, + 206, 77, 69, 68, 65, 76, 128, 77, 69, 67, 72, 65, 78, 73, 67, 65, 204, + 77, 69, 65, 84, 128, 77, 69, 65, 212, 77, 69, 65, 83, 85, 82, 69, 196, + 77, 69, 65, 83, 85, 82, 69, 128, 77, 69, 65, 83, 85, 82, 197, 77, 69, 45, + 77, 65, 128, 77, 69, 45, 50, 128, 77, 69, 45, 49, 128, 77, 68, 85, 206, + 77, 196, 77, 67, 72, 213, 77, 67, 72, 65, 206, 77, 195, 77, 66, 85, 85, + 128, 77, 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, 66, 85, 69, 128, + 77, 66, 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, 77, 66, 79, 79, + 128, 77, 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, 212, 77, 66, 73, + 82, 73, 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, 85, 88, 128, 77, + 66, 69, 85, 82, 73, 128, 77, 66, 69, 85, 77, 128, 77, 66, 69, 82, 65, 69, + 128, 77, 66, 69, 78, 128, 77, 66, 69, 69, 75, 69, 69, 84, 128, 77, 66, + 69, 69, 128, 77, 66, 69, 128, 77, 66, 65, 81, 128, 77, 66, 65, 78, 89, + 73, 128, 77, 66, 65, 65, 82, 65, 69, 128, 77, 66, 65, 65, 75, 69, 84, + 128, 77, 66, 65, 65, 128, 77, 66, 65, 193, 77, 66, 193, 77, 66, 52, 128, + 77, 66, 51, 128, 77, 66, 50, 128, 77, 65, 89, 69, 203, 77, 65, 89, 65, + 78, 78, 65, 128, 77, 65, 89, 65, 206, 77, 65, 89, 128, 77, 65, 88, 73, + 77, 73, 90, 69, 128, 77, 65, 88, 73, 77, 65, 128, 77, 65, 88, 128, 77, + 65, 85, 128, 77, 65, 84, 84, 79, 67, 75, 128, 77, 65, 84, 82, 73, 88, + 128, 77, 65, 84, 69, 82, 73, 65, 76, 83, 128, 77, 65, 84, 128, 77, 65, + 83, 213, 77, 65, 83, 83, 73, 78, 71, 128, 77, 65, 83, 83, 65, 71, 69, + 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 75, 128, 77, 65, 83, 203, 77, + 65, 83, 72, 70, 65, 65, 84, 128, 77, 65, 83, 72, 50, 128, 77, 65, 83, 67, + 85, 76, 73, 78, 197, 77, 65, 83, 65, 82, 65, 205, 77, 65, 82, 89, 128, + 77, 65, 82, 87, 65, 82, 201, 77, 65, 82, 85, 75, 85, 128, 77, 65, 82, 84, + 89, 82, 73, 193, 77, 65, 82, 84, 73, 65, 204, 77, 65, 82, 82, 89, 73, 78, + 199, 77, 65, 82, 82, 73, 65, 71, 197, 77, 65, 82, 82, 65, 84, 65, 78, + 128, 77, 65, 82, 75, 211, 77, 65, 82, 75, 69, 82, 128, 77, 65, 82, 75, + 45, 52, 128, 77, 65, 82, 75, 45, 51, 128, 77, 65, 82, 75, 45, 50, 128, + 77, 65, 82, 75, 45, 49, 128, 77, 65, 82, 69, 128, 77, 65, 82, 67, 72, 69, + 206, 77, 65, 82, 67, 72, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, + 67, 67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, 82, 67, + 65, 83, 73, 84, 69, 128, 77, 65, 82, 66, 85, 84, 65, 128, 77, 65, 82, 66, + 85, 84, 193, 77, 65, 82, 128, 77, 65, 81, 65, 70, 128, 77, 65, 81, 128, + 77, 65, 80, 76, 197, 77, 65, 80, 73, 81, 128, 77, 65, 208, 77, 65, 79, + 128, 77, 65, 78, 85, 65, 204, 77, 65, 78, 84, 69, 76, 80, 73, 69, 67, + 197, 77, 65, 78, 83, 89, 79, 78, 128, 77, 65, 78, 83, 85, 65, 69, 128, + 77, 65, 78, 78, 65, 218, 77, 65, 78, 78, 65, 128, 77, 65, 78, 73, 67, 72, + 65, 69, 65, 206, 77, 65, 78, 71, 79, 128, 77, 65, 78, 71, 65, 76, 65, 77, + 128, 77, 65, 78, 68, 65, 82, 73, 78, 128, 77, 65, 78, 68, 65, 73, 76, 73, + 78, 199, 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72, 213, 77, 65, + 78, 65, 212, 77, 65, 78, 65, 67, 76, 69, 83, 128, 77, 65, 77, 77, 79, 84, + 72, 128, 77, 65, 76, 84, 69, 83, 197, 77, 65, 76, 69, 69, 82, 73, 128, + 77, 65, 76, 197, 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, + 128, 77, 65, 75, 83, 85, 82, 193, 77, 65, 75, 65, 83, 65, 210, 77, 65, + 73, 90, 69, 128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, + 73, 75, 72, 85, 128, 77, 65, 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78, + 128, 77, 65, 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 76, 66, 79, 216, + 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, 73, 68, 69, 78, 128, 77, 65, 73, + 128, 77, 65, 72, 74, 79, 78, 199, 77, 65, 72, 72, 65, 128, 77, 65, 72, + 65, 80, 82, 65, 78, 65, 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, 65, + 72, 65, 74, 65, 78, 201, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, + 65, 72, 128, 77, 65, 71, 78, 73, 70, 89, 73, 78, 199, 77, 65, 71, 78, 69, + 84, 128, 77, 65, 71, 73, 195, 77, 65, 71, 69, 128, 77, 65, 69, 83, 73, + 128, 77, 65, 69, 78, 89, 73, 128, 77, 65, 69, 78, 74, 69, 84, 128, 77, + 65, 69, 77, 86, 69, 85, 88, 128, 77, 65, 69, 77, 75, 80, 69, 78, 128, 77, + 65, 69, 77, 71, 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 71, 66, 73, 69, + 69, 128, 77, 65, 69, 77, 66, 65, 128, 77, 65, 69, 77, 128, 77, 65, 69, + 76, 69, 69, 128, 77, 65, 69, 75, 69, 85, 80, 128, 77, 65, 68, 89, 65, + 128, 77, 65, 68, 85, 128, 77, 65, 68, 68, 65, 72, 128, 77, 65, 68, 68, + 65, 200, 77, 65, 68, 68, 65, 128, 77, 65, 68, 68, 193, 77, 65, 67, 82, + 79, 78, 45, 71, 82, 65, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, 66, 82, + 69, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, 65, 67, 85, 84, 69, 128, 77, + 65, 67, 82, 79, 78, 128, 77, 65, 67, 82, 79, 206, 77, 65, 67, 72, 73, 78, + 69, 128, 77, 65, 65, 89, 89, 65, 65, 128, 77, 65, 65, 73, 128, 77, 65, + 65, 128, 77, 65, 50, 128, 77, 65, 45, 55, 128, 77, 65, 45, 54, 128, 77, + 65, 45, 53, 128, 77, 65, 45, 52, 128, 77, 65, 45, 51, 128, 77, 65, 45, + 50, 128, 77, 65, 45, 49, 128, 77, 49, 57, 183, 77, 49, 57, 182, 77, 49, + 57, 181, 77, 49, 57, 180, 77, 49, 57, 179, 77, 49, 57, 178, 77, 49, 57, + 177, 77, 49, 57, 176, 77, 49, 56, 185, 77, 49, 56, 184, 77, 49, 56, 183, + 77, 49, 56, 182, 77, 49, 56, 181, 77, 49, 56, 180, 77, 49, 56, 179, 77, + 49, 56, 178, 77, 49, 56, 177, 77, 49, 56, 176, 77, 49, 55, 185, 77, 49, + 55, 184, 77, 49, 55, 183, 77, 49, 55, 182, 77, 49, 55, 181, 77, 49, 55, + 180, 77, 49, 55, 179, 77, 49, 55, 178, 77, 49, 55, 177, 77, 49, 55, 176, + 77, 49, 54, 185, 77, 49, 54, 184, 77, 49, 54, 183, 77, 49, 54, 182, 77, + 49, 54, 181, 77, 49, 54, 180, 77, 49, 54, 179, 77, 49, 54, 178, 77, 49, + 54, 177, 77, 49, 54, 176, 77, 49, 53, 185, 77, 49, 53, 184, 77, 49, 53, + 183, 77, 49, 53, 182, 77, 49, 53, 181, 77, 49, 53, 180, 77, 49, 53, 179, + 77, 49, 53, 178, 77, 49, 53, 177, 77, 49, 53, 176, 77, 49, 52, 185, 77, + 49, 52, 184, 77, 49, 52, 183, 77, 49, 52, 182, 77, 49, 52, 181, 77, 49, + 52, 180, 77, 49, 52, 179, 77, 49, 52, 178, 77, 49, 52, 177, 77, 49, 52, + 176, 77, 49, 51, 185, 77, 49, 51, 184, 77, 49, 51, 183, 77, 49, 51, 182, + 77, 49, 51, 181, 77, 49, 51, 180, 77, 49, 51, 179, 77, 49, 51, 178, 77, + 49, 51, 177, 77, 49, 51, 176, 77, 49, 50, 185, 77, 49, 50, 184, 77, 49, + 50, 183, 77, 49, 50, 182, 77, 49, 50, 181, 77, 49, 50, 180, 77, 49, 50, + 179, 77, 49, 50, 178, 77, 49, 50, 177, 77, 49, 50, 176, 77, 49, 49, 185, + 77, 49, 49, 184, 77, 49, 49, 183, 77, 49, 49, 182, 77, 49, 49, 181, 77, + 49, 49, 180, 77, 49, 49, 179, 77, 49, 49, 178, 77, 49, 49, 177, 77, 49, + 49, 176, 77, 49, 48, 185, 77, 49, 48, 184, 77, 49, 48, 183, 77, 49, 48, + 182, 77, 49, 48, 181, 77, 49, 48, 180, 77, 49, 48, 179, 77, 49, 48, 178, + 77, 49, 48, 177, 77, 49, 48, 176, 77, 48, 57, 185, 77, 48, 57, 184, 77, + 48, 57, 183, 77, 48, 57, 182, 77, 48, 57, 181, 77, 48, 57, 180, 77, 48, + 57, 179, 77, 48, 57, 178, 77, 48, 57, 177, 77, 48, 57, 176, 77, 48, 56, + 185, 77, 48, 56, 184, 77, 48, 56, 183, 77, 48, 56, 182, 77, 48, 56, 181, + 77, 48, 56, 180, 77, 48, 56, 179, 77, 48, 56, 178, 77, 48, 56, 177, 77, + 48, 56, 176, 77, 48, 55, 185, 77, 48, 55, 184, 77, 48, 55, 183, 77, 48, + 55, 182, 77, 48, 55, 181, 77, 48, 55, 180, 77, 48, 55, 179, 77, 48, 55, + 178, 77, 48, 55, 177, 77, 48, 55, 176, 77, 48, 54, 185, 77, 48, 54, 184, + 77, 48, 54, 183, 77, 48, 54, 182, 77, 48, 54, 181, 77, 48, 54, 180, 77, + 48, 54, 179, 77, 48, 54, 178, 77, 48, 54, 177, 77, 48, 54, 176, 77, 48, + 53, 185, 77, 48, 53, 184, 77, 48, 53, 183, 77, 48, 53, 182, 77, 48, 53, + 181, 77, 48, 53, 180, 77, 48, 53, 179, 77, 48, 53, 178, 77, 48, 53, 177, + 77, 48, 53, 176, 77, 48, 52, 185, 77, 48, 52, 184, 77, 48, 52, 183, 77, + 48, 52, 182, 77, 48, 52, 181, 77, 48, 52, 52, 128, 77, 48, 52, 180, 77, + 48, 52, 51, 128, 77, 48, 52, 179, 77, 48, 52, 50, 128, 77, 48, 52, 178, + 77, 48, 52, 49, 128, 77, 48, 52, 177, 77, 48, 52, 48, 65, 128, 77, 48, + 52, 48, 128, 77, 48, 52, 176, 77, 48, 51, 57, 128, 77, 48, 51, 185, 77, + 48, 51, 56, 128, 77, 48, 51, 184, 77, 48, 51, 55, 128, 77, 48, 51, 183, + 77, 48, 51, 54, 128, 77, 48, 51, 182, 77, 48, 51, 53, 128, 77, 48, 51, + 181, 77, 48, 51, 52, 128, 77, 48, 51, 180, 77, 48, 51, 51, 66, 128, 77, + 48, 51, 51, 65, 128, 77, 48, 51, 51, 128, 77, 48, 51, 179, 77, 48, 51, + 50, 128, 77, 48, 51, 178, 77, 48, 51, 49, 65, 128, 77, 48, 51, 49, 128, + 77, 48, 51, 177, 77, 48, 51, 48, 128, 77, 48, 51, 176, 77, 48, 50, 57, + 128, 77, 48, 50, 185, 77, 48, 50, 56, 65, 128, 77, 48, 50, 56, 128, 77, + 48, 50, 184, 77, 48, 50, 55, 128, 77, 48, 50, 183, 77, 48, 50, 54, 128, + 77, 48, 50, 182, 77, 48, 50, 53, 128, 77, 48, 50, 181, 77, 48, 50, 52, + 65, 128, 77, 48, 50, 52, 128, 77, 48, 50, 180, 77, 48, 50, 51, 128, 77, + 48, 50, 179, 77, 48, 50, 50, 65, 128, 77, 48, 50, 50, 128, 77, 48, 50, + 178, 77, 48, 50, 49, 128, 77, 48, 50, 177, 77, 48, 50, 48, 128, 77, 48, + 50, 176, 77, 48, 49, 57, 128, 77, 48, 49, 185, 77, 48, 49, 56, 128, 77, + 48, 49, 184, 77, 48, 49, 55, 65, 128, 77, 48, 49, 55, 128, 77, 48, 49, + 183, 77, 48, 49, 54, 65, 128, 77, 48, 49, 54, 128, 77, 48, 49, 182, 77, + 48, 49, 53, 65, 128, 77, 48, 49, 53, 128, 77, 48, 49, 181, 77, 48, 49, + 52, 128, 77, 48, 49, 180, 77, 48, 49, 51, 128, 77, 48, 49, 179, 77, 48, + 49, 50, 72, 128, 77, 48, 49, 50, 71, 128, 77, 48, 49, 50, 70, 128, 77, + 48, 49, 50, 69, 128, 77, 48, 49, 50, 68, 128, 77, 48, 49, 50, 67, 128, + 77, 48, 49, 50, 66, 128, 77, 48, 49, 50, 65, 128, 77, 48, 49, 50, 128, + 77, 48, 49, 178, 77, 48, 49, 49, 128, 77, 48, 49, 177, 77, 48, 49, 48, + 65, 128, 77, 48, 49, 48, 128, 77, 48, 49, 176, 77, 48, 48, 57, 128, 77, + 48, 48, 185, 77, 48, 48, 56, 128, 77, 48, 48, 184, 77, 48, 48, 55, 128, + 77, 48, 48, 183, 77, 48, 48, 54, 128, 77, 48, 48, 182, 77, 48, 48, 53, + 128, 77, 48, 48, 181, 77, 48, 48, 52, 128, 77, 48, 48, 180, 77, 48, 48, + 51, 65, 128, 77, 48, 48, 51, 128, 77, 48, 48, 179, 77, 48, 48, 50, 128, + 77, 48, 48, 178, 77, 48, 48, 49, 66, 128, 77, 48, 48, 49, 65, 128, 77, + 48, 48, 49, 128, 77, 48, 48, 177, 76, 218, 76, 89, 89, 128, 76, 89, 88, + 128, 76, 89, 84, 128, 76, 89, 82, 88, 128, 76, 89, 82, 128, 76, 89, 80, + 128, 76, 89, 73, 84, 128, 76, 89, 73, 78, 199, 76, 89, 68, 73, 65, 206, + 76, 89, 67, 73, 65, 206, 76, 88, 128, 76, 87, 79, 79, 128, 76, 87, 79, + 128, 76, 87, 73, 73, 128, 76, 87, 73, 128, 76, 87, 69, 128, 76, 87, 65, + 65, 128, 76, 87, 65, 128, 76, 85, 88, 128, 76, 85, 85, 128, 76, 85, 84, + 128, 76, 85, 82, 88, 128, 76, 85, 80, 128, 76, 85, 79, 88, 128, 76, 85, + 79, 84, 128, 76, 85, 79, 80, 128, 76, 85, 79, 128, 76, 85, 78, 71, 83, + 73, 128, 76, 85, 78, 71, 83, 128, 76, 85, 78, 65, 84, 197, 76, 85, 205, + 76, 85, 76, 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, 128, 76, 85, + 72, 128, 76, 85, 200, 76, 85, 71, 71, 65, 71, 69, 128, 76, 85, 71, 65, + 76, 128, 76, 85, 71, 65, 204, 76, 85, 69, 128, 76, 85, 197, 76, 85, 66, + 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, 76, 85, 50, 128, 76, 85, + 178, 76, 82, 79, 128, 76, 82, 77, 128, 76, 82, 73, 128, 76, 82, 69, 128, + 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, 197, 76, 79, 88, + 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87, 45, 82, 69, 86, 69, 82, 83, + 69, 68, 45, 185, 76, 79, 87, 45, 77, 73, 196, 76, 79, 87, 45, 70, 65, 76, + 76, 73, 78, 199, 76, 79, 87, 45, 185, 76, 79, 86, 197, 76, 79, 85, 82, + 69, 128, 76, 79, 85, 68, 83, 80, 69, 65, 75, 69, 82, 128, 76, 79, 85, 68, + 76, 217, 76, 79, 84, 85, 83, 128, 76, 79, 84, 85, 211, 76, 79, 84, 73, + 79, 206, 76, 79, 84, 128, 76, 79, 83, 83, 76, 69, 83, 83, 128, 76, 79, + 82, 82, 89, 128, 76, 79, 82, 82, 65, 73, 78, 69, 128, 76, 79, 81, 128, + 76, 79, 80, 128, 76, 79, 79, 84, 128, 76, 79, 79, 80, 69, 196, 76, 79, + 79, 80, 128, 76, 79, 79, 208, 76, 79, 79, 78, 128, 76, 79, 79, 203, 76, + 79, 79, 128, 76, 79, 78, 83, 85, 77, 128, 76, 79, 78, 71, 65, 128, 76, + 79, 78, 71, 193, 76, 79, 78, 71, 45, 76, 69, 71, 71, 69, 196, 76, 79, 78, + 71, 45, 66, 82, 65, 78, 67, 72, 45, 89, 82, 128, 76, 79, 78, 71, 45, 66, + 82, 65, 78, 67, 72, 45, 83, 79, 204, 76, 79, 78, 71, 45, 66, 82, 65, 78, + 67, 72, 45, 79, 83, 211, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, + 77, 65, 68, 210, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 72, 65, + 71, 65, 76, 204, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 65, 210, + 76, 79, 77, 77, 65, 69, 128, 76, 79, 77, 128, 76, 79, 205, 76, 79, 76, + 76, 73, 80, 79, 80, 128, 76, 79, 76, 76, 128, 76, 79, 71, 210, 76, 79, + 71, 79, 84, 89, 80, 197, 76, 79, 71, 79, 71, 82, 65, 205, 76, 79, 71, + 128, 76, 79, 68, 69, 83, 84, 79, 78, 69, 128, 76, 79, 67, 79, 77, 79, 84, + 73, 86, 69, 128, 76, 79, 67, 75, 73, 78, 71, 45, 83, 72, 73, 70, 212, 76, + 79, 67, 65, 84, 73, 86, 69, 128, 76, 79, 67, 65, 84, 73, 79, 78, 45, 87, + 65, 76, 76, 80, 76, 65, 78, 197, 76, 79, 67, 65, 84, 73, 79, 78, 45, 70, + 76, 79, 79, 82, 80, 76, 65, 78, 197, 76, 79, 67, 65, 84, 73, 79, 78, 128, + 76, 79, 67, 65, 84, 73, 79, 206, 76, 79, 66, 83, 84, 69, 82, 128, 76, 79, + 65, 128, 76, 78, 128, 76, 76, 85, 85, 128, 76, 76, 79, 79, 128, 76, 76, + 76, 85, 85, 128, 76, 76, 76, 85, 128, 76, 76, 76, 79, 79, 128, 76, 76, + 76, 79, 128, 76, 76, 76, 73, 73, 128, 76, 76, 76, 73, 128, 76, 76, 76, + 69, 69, 128, 76, 76, 76, 69, 128, 76, 76, 76, 65, 85, 128, 76, 76, 76, + 65, 73, 128, 76, 76, 76, 65, 65, 128, 76, 76, 76, 65, 128, 76, 76, 76, + 128, 76, 76, 72, 65, 128, 76, 76, 65, 77, 65, 128, 76, 74, 85, 68, 73, + 74, 69, 128, 76, 74, 69, 128, 76, 74, 128, 76, 73, 90, 65, 82, 68, 128, + 76, 73, 88, 128, 76, 73, 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, + 84, 76, 69, 128, 76, 73, 84, 84, 76, 197, 76, 73, 84, 84, 69, 210, 76, + 73, 84, 82, 193, 76, 73, 84, 200, 76, 73, 83, 213, 76, 73, 83, 128, 76, + 73, 82, 193, 76, 73, 81, 85, 73, 196, 76, 73, 81, 128, 76, 73, 80, 83, + 84, 73, 67, 75, 128, 76, 73, 80, 211, 76, 73, 208, 76, 73, 78, 75, 73, + 78, 199, 76, 73, 78, 75, 69, 196, 76, 73, 78, 203, 76, 73, 78, 71, 83, + 65, 128, 76, 73, 78, 69, 83, 128, 76, 73, 78, 69, 211, 76, 73, 78, 69, + 45, 57, 128, 76, 73, 78, 69, 45, 55, 128, 76, 73, 78, 69, 45, 51, 128, + 76, 73, 78, 69, 45, 49, 128, 76, 73, 77, 77, 85, 52, 128, 76, 73, 77, 77, + 85, 50, 128, 76, 73, 77, 77, 85, 128, 76, 73, 77, 77, 213, 76, 73, 77, + 73, 84, 69, 196, 76, 73, 77, 73, 84, 65, 84, 73, 79, 78, 128, 76, 73, 77, + 73, 84, 128, 76, 73, 77, 69, 128, 76, 73, 77, 66, 213, 76, 73, 77, 66, + 211, 76, 73, 77, 194, 76, 73, 76, 89, 128, 76, 73, 76, 73, 84, 72, 128, + 76, 73, 76, 128, 76, 73, 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, 71, 72, + 84, 78, 73, 78, 199, 76, 73, 71, 72, 84, 72, 79, 85, 83, 69, 128, 76, 73, + 71, 72, 84, 128, 76, 73, 71, 65, 84, 73, 78, 199, 76, 73, 70, 84, 69, 82, + 128, 76, 73, 70, 69, 128, 76, 73, 69, 88, 128, 76, 73, 69, 84, 128, 76, + 73, 69, 80, 128, 76, 73, 69, 69, 128, 76, 73, 69, 128, 76, 73, 68, 128, + 76, 73, 67, 75, 73, 78, 199, 76, 73, 66, 82, 65, 128, 76, 73, 66, 69, 82, + 84, 89, 128, 76, 73, 65, 66, 73, 76, 73, 84, 217, 76, 72, 73, 73, 128, + 76, 72, 65, 86, 73, 89, 65, 78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65, + 128, 76, 72, 128, 76, 69, 90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 73, + 84, 65, 84, 73, 78, 71, 128, 76, 69, 85, 77, 128, 76, 69, 85, 65, 69, 80, + 128, 76, 69, 85, 65, 69, 77, 128, 76, 69, 85, 128, 76, 69, 213, 76, 69, + 84, 84, 69, 82, 83, 128, 76, 69, 84, 84, 69, 82, 128, 76, 69, 212, 76, + 69, 83, 83, 69, 210, 76, 69, 83, 83, 45, 84, 72, 65, 78, 128, 76, 69, 83, + 83, 45, 84, 72, 65, 206, 76, 69, 83, 72, 128, 76, 69, 80, 67, 72, 193, + 76, 69, 80, 128, 76, 69, 79, 80, 65, 82, 68, 128, 76, 69, 79, 128, 76, + 69, 78, 84, 73, 67, 85, 76, 65, 210, 76, 69, 78, 73, 83, 128, 76, 69, 78, + 73, 211, 76, 69, 78, 71, 84, 72, 69, 78, 69, 82, 128, 76, 69, 78, 71, 84, + 72, 45, 55, 128, 76, 69, 78, 71, 84, 72, 45, 54, 128, 76, 69, 78, 71, 84, + 72, 45, 53, 128, 76, 69, 78, 71, 84, 72, 45, 52, 128, 76, 69, 78, 71, 84, + 72, 45, 51, 128, 76, 69, 78, 71, 84, 72, 45, 50, 128, 76, 69, 78, 71, 84, + 72, 45, 49, 128, 76, 69, 78, 71, 84, 200, 76, 69, 78, 71, 65, 128, 76, + 69, 78, 71, 193, 76, 69, 77, 79, 78, 128, 76, 69, 77, 79, 73, 128, 76, + 69, 76, 69, 84, 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, + 77, 65, 128, 76, 69, 73, 77, 77, 193, 76, 69, 73, 128, 76, 69, 71, 83, + 128, 76, 69, 71, 73, 79, 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, + 71, 128, 76, 69, 199, 76, 69, 70, 84, 87, 65, 82, 68, 83, 128, 76, 69, + 70, 84, 45, 84, 79, 45, 82, 73, 71, 72, 212, 76, 69, 70, 84, 45, 83, 84, + 69, 205, 76, 69, 70, 84, 45, 83, 73, 68, 197, 76, 69, 70, 84, 45, 83, 72, + 65, 68, 69, 196, 76, 69, 70, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 76, + 69, 70, 84, 45, 76, 73, 71, 72, 84, 69, 196, 76, 69, 70, 84, 45, 72, 65, + 78, 68, 69, 196, 76, 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, 84, 45, + 70, 65, 67, 73, 78, 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, 69, 87, + 65, 128, 76, 69, 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 68, 71, + 69, 82, 128, 76, 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 78, 73, 78, + 199, 76, 69, 65, 70, 217, 76, 69, 65, 70, 128, 76, 69, 65, 198, 76, 69, + 65, 68, 69, 82, 128, 76, 69, 65, 196, 76, 68, 65, 78, 128, 76, 68, 50, + 128, 76, 67, 201, 76, 67, 197, 76, 65, 90, 217, 76, 65, 89, 65, 78, 78, + 65, 128, 76, 65, 88, 128, 76, 65, 87, 128, 76, 65, 215, 76, 65, 85, 76, + 65, 128, 76, 65, 85, 75, 65, 218, 76, 65, 85, 74, 128, 76, 65, 85, 71, + 72, 73, 78, 71, 128, 76, 65, 84, 73, 78, 65, 84, 197, 76, 65, 84, 73, 75, + 128, 76, 65, 84, 69, 82, 65, 204, 76, 65, 84, 197, 76, 65, 83, 212, 76, + 65, 82, 89, 78, 71, 69, 65, 204, 76, 65, 82, 201, 76, 65, 82, 71, 69, 83, + 84, 128, 76, 65, 82, 71, 69, 210, 76, 65, 82, 71, 69, 128, 76, 65, 82, + 71, 197, 76, 65, 81, 128, 76, 65, 80, 65, 81, 128, 76, 65, 207, 76, 65, + 78, 84, 69, 82, 78, 128, 76, 65, 78, 71, 85, 65, 71, 197, 76, 65, 78, 69, + 83, 128, 76, 65, 78, 196, 76, 65, 78, 128, 76, 65, 77, 80, 128, 76, 65, + 77, 69, 68, 72, 128, 76, 65, 77, 69, 68, 128, 76, 65, 77, 69, 196, 76, + 65, 77, 69, 128, 76, 65, 77, 197, 76, 65, 77, 68, 65, 128, 76, 65, 77, + 68, 128, 76, 65, 77, 66, 68, 193, 76, 65, 77, 65, 68, 72, 128, 76, 65, + 76, 128, 76, 65, 204, 76, 65, 75, 75, 72, 65, 78, 71, 89, 65, 79, 128, + 76, 65, 75, 72, 65, 78, 128, 76, 65, 75, 72, 128, 76, 65, 75, 200, 76, + 65, 75, 45, 55, 52, 57, 128, 76, 65, 75, 45, 55, 50, 52, 128, 76, 65, 75, + 45, 54, 54, 56, 128, 76, 65, 75, 45, 54, 52, 56, 128, 76, 65, 75, 45, 54, + 52, 184, 76, 65, 75, 45, 54, 51, 54, 128, 76, 65, 75, 45, 54, 49, 55, + 128, 76, 65, 75, 45, 54, 49, 183, 76, 65, 75, 45, 54, 48, 56, 128, 76, + 65, 75, 45, 53, 53, 48, 128, 76, 65, 75, 45, 52, 57, 53, 128, 76, 65, 75, + 45, 52, 57, 51, 128, 76, 65, 75, 45, 52, 57, 50, 128, 76, 65, 75, 45, 52, + 57, 48, 128, 76, 65, 75, 45, 52, 56, 51, 128, 76, 65, 75, 45, 52, 55, 48, + 128, 76, 65, 75, 45, 52, 53, 55, 128, 76, 65, 75, 45, 52, 53, 48, 128, + 76, 65, 75, 45, 52, 52, 57, 128, 76, 65, 75, 45, 52, 52, 185, 76, 65, 75, + 45, 52, 52, 49, 128, 76, 65, 75, 45, 51, 57, 48, 128, 76, 65, 75, 45, 51, + 56, 52, 128, 76, 65, 75, 45, 51, 56, 51, 128, 76, 65, 75, 45, 51, 52, 56, + 128, 76, 65, 75, 45, 51, 52, 55, 128, 76, 65, 75, 45, 51, 52, 51, 128, + 76, 65, 75, 45, 50, 54, 54, 128, 76, 65, 75, 45, 50, 54, 53, 128, 76, 65, + 75, 45, 50, 51, 56, 128, 76, 65, 75, 45, 50, 50, 56, 128, 76, 65, 75, 45, + 50, 50, 53, 128, 76, 65, 75, 45, 50, 50, 48, 128, 76, 65, 75, 45, 50, 49, + 57, 128, 76, 65, 75, 45, 50, 49, 48, 128, 76, 65, 75, 45, 49, 52, 50, + 128, 76, 65, 75, 45, 49, 51, 48, 128, 76, 65, 75, 45, 48, 57, 50, 128, + 76, 65, 75, 45, 48, 56, 49, 128, 76, 65, 75, 45, 48, 56, 177, 76, 65, 75, + 45, 48, 56, 48, 128, 76, 65, 75, 45, 48, 55, 185, 76, 65, 75, 45, 48, 54, + 50, 128, 76, 65, 75, 45, 48, 53, 49, 128, 76, 65, 75, 45, 48, 53, 48, + 128, 76, 65, 75, 45, 48, 51, 48, 128, 76, 65, 75, 45, 48, 50, 53, 128, + 76, 65, 75, 45, 48, 50, 49, 128, 76, 65, 75, 45, 48, 50, 48, 128, 76, 65, + 75, 45, 48, 48, 51, 128, 76, 65, 74, 65, 78, 89, 65, 76, 65, 78, 128, 76, + 65, 73, 78, 199, 76, 65, 201, 76, 65, 72, 83, 72, 85, 128, 76, 65, 72, + 128, 76, 65, 71, 85, 83, 128, 76, 65, 71, 213, 76, 65, 71, 65, 82, 128, + 76, 65, 71, 65, 210, 76, 65, 71, 65, 66, 128, 76, 65, 71, 65, 194, 76, + 65, 69, 86, 128, 76, 65, 69, 128, 76, 65, 68, 217, 76, 65, 68, 68, 69, + 82, 128, 76, 65, 67, 82, 79, 83, 83, 197, 76, 65, 67, 75, 128, 76, 65, + 67, 65, 128, 76, 65, 66, 79, 85, 82, 73, 78, 71, 128, 76, 65, 66, 79, 82, + 128, 76, 65, 66, 73, 65, 76, 73, 90, 65, 84, 73, 79, 206, 76, 65, 66, 73, + 65, 204, 76, 65, 66, 69, 76, 128, 76, 65, 66, 65, 84, 128, 76, 65, 194, + 76, 65, 65, 78, 65, 69, 128, 76, 65, 65, 78, 128, 76, 65, 65, 77, 85, + 128, 76, 65, 65, 77, 128, 76, 65, 65, 73, 128, 76, 54, 128, 76, 52, 128, + 76, 51, 128, 76, 50, 128, 76, 48, 48, 54, 65, 128, 76, 48, 48, 50, 65, + 128, 76, 45, 84, 89, 80, 197, 76, 45, 83, 72, 65, 80, 69, 196, 75, 89, + 85, 82, 73, 73, 128, 75, 89, 85, 128, 75, 89, 79, 128, 75, 89, 76, 73, + 83, 77, 65, 128, 75, 89, 73, 128, 75, 89, 69, 128, 75, 89, 65, 84, 72, + 79, 211, 75, 89, 65, 65, 128, 75, 89, 65, 128, 75, 88, 87, 73, 128, 75, + 88, 87, 69, 69, 128, 75, 88, 87, 69, 128, 75, 88, 87, 65, 65, 128, 75, + 88, 87, 65, 128, 75, 88, 85, 128, 75, 88, 79, 128, 75, 88, 73, 128, 75, + 88, 69, 69, 128, 75, 88, 69, 128, 75, 88, 65, 65, 128, 75, 88, 65, 128, + 75, 87, 86, 128, 75, 87, 85, 51, 49, 56, 128, 75, 87, 79, 79, 128, 75, + 87, 79, 128, 75, 87, 77, 128, 75, 87, 73, 73, 128, 75, 87, 73, 128, 75, + 87, 69, 69, 128, 75, 87, 69, 128, 75, 87, 66, 128, 75, 87, 65, 89, 128, + 75, 87, 65, 69, 84, 128, 75, 87, 65, 65, 128, 75, 86, 65, 128, 75, 86, + 128, 75, 85, 90, 72, 73, 128, 75, 85, 88, 128, 75, 85, 86, 128, 75, 85, + 85, 72, 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, 72, + 85, 50, 128, 75, 85, 83, 72, 85, 178, 75, 85, 82, 88, 128, 75, 85, 82, + 85, 90, 69, 73, 82, 79, 128, 75, 85, 82, 84, 128, 75, 85, 82, 79, 79, 78, + 69, 128, 75, 85, 82, 128, 75, 85, 210, 75, 85, 81, 128, 75, 85, 79, 88, + 128, 75, 85, 79, 80, 128, 75, 85, 79, 208, 75, 85, 79, 77, 128, 75, 85, + 79, 128, 75, 85, 78, 71, 128, 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, 128, 75, 85, 76, 128, 75, 85, 204, 75, 85, 71, 128, 75, 85, 69, 84, 128, 75, 85, 66, 128, 75, 85, 65, 86, 128, 75, 85, 65, 66, 128, 75, 85, 65, 128, 75, 85, 55, 128, 75, 85, 52, 128, 75, 85, 180, 75, 85, 51, 128, 75, @@ -2674,1256 +2728,1257 @@ static const unsigned char lexicon[] = { 79, 77, 128, 75, 79, 69, 84, 128, 75, 79, 66, 128, 75, 79, 65, 76, 65, 128, 75, 79, 65, 128, 75, 79, 45, 75, 73, 128, 75, 79, 45, 51, 128, 75, 79, 45, 50, 128, 75, 79, 45, 49, 128, 75, 78, 85, 67, 75, 76, 69, 83, - 128, 75, 78, 85, 67, 75, 76, 69, 128, 75, 78, 79, 66, 83, 128, 75, 78, - 73, 71, 72, 84, 45, 82, 79, 79, 75, 128, 75, 78, 73, 71, 72, 84, 45, 81, - 85, 69, 69, 78, 128, 75, 78, 73, 71, 72, 84, 45, 66, 73, 83, 72, 79, 80, - 128, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, 212, 75, 78, 73, - 70, 69, 128, 75, 78, 73, 70, 197, 75, 78, 69, 69, 76, 73, 78, 199, 75, - 77, 128, 75, 205, 75, 76, 73, 84, 79, 78, 128, 75, 76, 65, 83, 77, 65, - 128, 75, 76, 65, 83, 77, 193, 75, 76, 65, 128, 75, 76, 128, 75, 75, 79, - 128, 75, 75, 73, 128, 75, 75, 69, 69, 128, 75, 75, 69, 128, 75, 75, 65, - 128, 75, 75, 128, 75, 74, 69, 128, 75, 73, 89, 69, 79, 75, 45, 84, 73, - 75, 69, 85, 84, 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, 75, - 73, 89, 69, 79, 75, 128, 75, 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, - 128, 75, 73, 89, 69, 79, 75, 45, 80, 73, 69, 85, 80, 128, 75, 73, 89, 69, - 79, 75, 45, 78, 73, 69, 85, 78, 128, 75, 73, 89, 69, 79, 75, 45, 75, 72, - 73, 69, 85, 75, 72, 128, 75, 73, 89, 69, 79, 75, 45, 67, 72, 73, 69, 85, - 67, 72, 128, 75, 73, 89, 69, 79, 203, 75, 73, 88, 128, 75, 73, 87, 73, - 70, 82, 85, 73, 84, 128, 75, 73, 87, 128, 75, 73, 86, 128, 75, 73, 84, - 69, 128, 75, 73, 84, 128, 75, 73, 83, 83, 73, 78, 199, 75, 73, 83, 83, - 128, 75, 73, 83, 211, 75, 73, 83, 73, 77, 53, 128, 75, 73, 83, 73, 77, - 181, 75, 73, 83, 72, 128, 75, 73, 83, 65, 76, 128, 75, 73, 82, 79, 87, - 65, 84, 84, 79, 128, 75, 73, 82, 79, 77, 69, 69, 84, 79, 82, 85, 128, 75, - 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75, 73, 82, 79, 128, 75, 73, 82, - 71, 72, 73, 218, 75, 73, 81, 128, 75, 73, 80, 128, 75, 73, 208, 75, 73, - 78, 83, 72, 73, 80, 128, 75, 73, 78, 78, 193, 75, 73, 78, 68, 69, 82, 71, - 65, 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, 75, 73, 76, 76, 69, - 82, 128, 75, 73, 73, 90, 72, 128, 75, 73, 73, 128, 75, 73, 72, 128, 75, - 73, 69, 88, 128, 75, 73, 69, 86, 65, 206, 75, 73, 69, 80, 128, 75, 73, - 69, 69, 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, 75, 73, 196, 75, 73, - 67, 75, 128, 75, 73, 66, 128, 75, 73, 65, 86, 128, 75, 73, 65, 66, 128, - 75, 73, 45, 56, 128, 75, 73, 45, 55, 128, 75, 73, 45, 54, 128, 75, 73, - 45, 53, 128, 75, 73, 45, 52, 128, 75, 73, 45, 51, 128, 75, 73, 45, 50, - 128, 75, 73, 45, 49, 128, 75, 72, 90, 128, 75, 72, 87, 65, 73, 128, 75, - 72, 85, 69, 78, 45, 76, 85, 197, 75, 72, 85, 69, 206, 75, 72, 85, 68, 65, - 87, 65, 68, 201, 75, 72, 85, 68, 65, 77, 128, 75, 72, 85, 65, 84, 128, - 75, 72, 79, 85, 128, 75, 72, 79, 212, 75, 72, 79, 78, 78, 65, 128, 75, - 72, 79, 78, 128, 75, 72, 79, 77, 85, 84, 128, 75, 72, 79, 74, 75, 201, - 75, 72, 79, 128, 75, 72, 207, 75, 72, 77, 213, 75, 72, 73, 84, 128, 75, - 72, 73, 78, 89, 65, 128, 75, 72, 73, 69, 85, 75, 200, 75, 72, 73, 128, - 75, 72, 201, 75, 72, 72, 79, 128, 75, 72, 72, 65, 128, 75, 72, 69, 84, - 72, 128, 75, 72, 69, 73, 128, 75, 72, 69, 69, 128, 75, 72, 69, 128, 75, - 72, 65, 86, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, 201, 75, 72, 65, 82, - 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, 78, 199, 75, 72, 65, 78, 68, - 193, 75, 72, 65, 77, 84, 201, 75, 72, 65, 75, 65, 83, 83, 73, 65, 206, - 75, 72, 65, 73, 128, 75, 72, 65, 72, 128, 75, 72, 65, 200, 75, 72, 65, - 66, 128, 75, 72, 65, 65, 128, 75, 71, 128, 75, 69, 89, 67, 65, 80, 128, - 75, 69, 89, 67, 65, 208, 75, 69, 89, 66, 79, 65, 82, 68, 128, 75, 69, 89, - 66, 79, 65, 82, 196, 75, 69, 88, 128, 75, 69, 86, 128, 75, 69, 85, 89, - 69, 85, 88, 128, 75, 69, 85, 83, 72, 69, 85, 65, 69, 80, 128, 75, 69, 85, - 83, 69, 85, 88, 128, 75, 69, 85, 80, 85, 81, 128, 75, 69, 85, 79, 212, - 75, 69, 85, 77, 128, 75, 69, 85, 75, 69, 85, 84, 78, 68, 65, 128, 75, 69, - 85, 75, 65, 81, 128, 75, 69, 85, 65, 69, 84, 77, 69, 85, 78, 128, 75, 69, - 85, 65, 69, 82, 73, 128, 75, 69, 84, 84, 201, 75, 69, 83, 72, 50, 128, - 75, 69, 82, 69, 84, 128, 75, 69, 79, 87, 128, 75, 69, 78, 84, 73, 77, 65, - 84, 65, 128, 75, 69, 78, 84, 73, 77, 65, 84, 193, 75, 69, 78, 84, 73, 77, - 193, 75, 69, 78, 65, 84, 128, 75, 69, 78, 128, 75, 69, 206, 75, 69, 77, - 80, 85, 76, 128, 75, 69, 77, 80, 85, 204, 75, 69, 77, 80, 76, 73, 128, - 75, 69, 77, 80, 76, 201, 75, 69, 77, 80, 72, 82, 69, 78, 71, 128, 75, 69, - 77, 66, 65, 78, 71, 128, 75, 69, 76, 86, 73, 206, 75, 69, 72, 69, 72, - 128, 75, 69, 72, 69, 200, 75, 69, 72, 128, 75, 69, 70, 85, 76, 65, 128, - 75, 69, 69, 86, 128, 75, 69, 69, 83, 85, 128, 75, 69, 69, 80, 73, 78, - 199, 75, 69, 69, 78, 71, 128, 75, 69, 69, 66, 128, 75, 69, 66, 128, 75, - 69, 65, 65, 69, 128, 75, 67, 65, 76, 128, 75, 66, 128, 75, 65, 90, 65, - 75, 200, 75, 65, 89, 65, 78, 78, 65, 128, 75, 65, 89, 65, 200, 75, 65, - 88, 128, 75, 65, 87, 86, 128, 75, 65, 87, 73, 128, 75, 65, 87, 66, 128, - 75, 65, 86, 89, 75, 65, 128, 75, 65, 86, 89, 75, 193, 75, 65, 86, 128, - 75, 65, 85, 86, 128, 75, 65, 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, - 85, 66, 128, 75, 65, 84, 79, 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, - 75, 65, 84, 72, 65, 75, 193, 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, - 65, 84, 65, 86, 193, 75, 65, 84, 65, 75, 65, 78, 65, 45, 72, 73, 82, 65, - 71, 65, 78, 193, 75, 65, 83, 82, 65, 84, 65, 78, 128, 75, 65, 83, 82, 65, - 84, 65, 206, 75, 65, 83, 82, 65, 128, 75, 65, 83, 82, 193, 75, 65, 83, - 75, 65, 76, 128, 75, 65, 83, 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, - 201, 75, 65, 82, 83, 72, 65, 78, 65, 128, 75, 65, 82, 79, 82, 73, 73, - 128, 75, 65, 82, 79, 82, 65, 78, 128, 75, 65, 82, 79, 82, 128, 75, 65, - 82, 207, 75, 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, 128, 75, 65, - 82, 65, 78, 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, 71, 80, - 73, 69, 85, 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, 69, 85, 76, - 128, 75, 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, 128, 75, - 65, 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, 80, 80, 65, - 128, 75, 65, 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, 72, 128, 75, - 65, 80, 65, 76, 128, 75, 65, 80, 65, 128, 75, 65, 208, 75, 65, 78, 84, - 65, 74, 193, 75, 65, 78, 78, 65, 68, 193, 75, 65, 78, 71, 65, 82, 79, 79, - 128, 75, 65, 78, 71, 128, 75, 65, 78, 199, 75, 65, 78, 65, 75, 79, 128, - 75, 65, 77, 52, 128, 75, 65, 77, 50, 128, 75, 65, 77, 128, 75, 65, 75, - 79, 128, 75, 65, 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, 75, 65, 203, - 75, 65, 73, 86, 128, 75, 65, 73, 84, 72, 201, 75, 65, 73, 82, 73, 128, - 75, 65, 73, 66, 128, 75, 65, 73, 128, 75, 65, 201, 75, 65, 70, 65, 128, - 75, 65, 70, 128, 75, 65, 198, 75, 65, 68, 53, 128, 75, 65, 68, 181, 75, - 65, 68, 52, 128, 75, 65, 68, 51, 128, 75, 65, 68, 179, 75, 65, 68, 50, - 128, 75, 65, 68, 128, 75, 65, 66, 193, 75, 65, 66, 128, 75, 65, 65, 86, - 128, 75, 65, 65, 73, 128, 75, 65, 65, 70, 85, 128, 75, 65, 65, 70, 128, - 75, 65, 65, 67, 85, 128, 75, 65, 65, 66, 65, 128, 75, 65, 65, 66, 128, - 75, 65, 50, 128, 75, 65, 178, 75, 65, 45, 75, 69, 128, 75, 65, 45, 57, - 128, 75, 65, 45, 56, 128, 75, 65, 45, 55, 128, 75, 65, 45, 54, 128, 75, - 65, 45, 53, 128, 75, 65, 45, 52, 128, 75, 65, 45, 51, 128, 75, 65, 45, - 50, 128, 75, 65, 45, 49, 49, 128, 75, 65, 45, 49, 48, 128, 75, 65, 45, - 49, 128, 75, 48, 48, 56, 128, 75, 48, 48, 55, 128, 75, 48, 48, 54, 128, - 75, 48, 48, 53, 128, 75, 48, 48, 52, 128, 75, 48, 48, 51, 128, 75, 48, - 48, 50, 128, 75, 48, 48, 49, 128, 74, 87, 65, 128, 74, 85, 85, 128, 74, - 85, 84, 128, 74, 85, 83, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, 128, 74, - 85, 80, 73, 84, 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, 80, 128, - 74, 85, 78, 79, 128, 74, 85, 78, 71, 83, 69, 79, 78, 199, 74, 85, 78, 69, - 128, 74, 85, 76, 89, 128, 74, 85, 71, 71, 76, 73, 78, 71, 128, 74, 85, - 69, 85, 73, 128, 74, 85, 68, 85, 76, 128, 74, 85, 68, 71, 69, 128, 74, - 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, 83, 200, 74, 79, 89, 83, 84, 73, - 67, 75, 128, 74, 79, 89, 79, 85, 211, 74, 79, 89, 128, 74, 79, 86, 69, - 128, 74, 79, 212, 74, 79, 78, 71, 128, 74, 79, 78, 193, 74, 79, 75, 69, - 82, 128, 74, 79, 73, 78, 84, 83, 128, 74, 79, 73, 78, 69, 68, 128, 74, - 79, 73, 78, 128, 74, 79, 65, 128, 74, 78, 89, 65, 128, 74, 74, 89, 88, - 128, 74, 74, 89, 84, 128, 74, 74, 89, 80, 128, 74, 74, 89, 128, 74, 74, - 85, 88, 128, 74, 74, 85, 84, 128, 74, 74, 85, 82, 88, 128, 74, 74, 85, - 82, 128, 74, 74, 85, 80, 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, 79, - 80, 128, 74, 74, 85, 79, 128, 74, 74, 85, 128, 74, 74, 79, 88, 128, 74, - 74, 79, 84, 128, 74, 74, 79, 80, 128, 74, 74, 79, 128, 74, 74, 73, 88, - 128, 74, 74, 73, 84, 128, 74, 74, 73, 80, 128, 74, 74, 73, 69, 88, 128, - 74, 74, 73, 69, 84, 128, 74, 74, 73, 69, 80, 128, 74, 74, 73, 69, 128, - 74, 74, 73, 128, 74, 74, 69, 69, 128, 74, 74, 69, 128, 74, 74, 65, 128, - 74, 73, 76, 128, 74, 73, 73, 77, 128, 74, 73, 73, 128, 74, 73, 72, 86, - 65, 77, 85, 76, 73, 89, 65, 128, 74, 73, 71, 83, 65, 215, 74, 73, 65, - 128, 74, 72, 79, 88, 128, 74, 72, 79, 128, 74, 72, 69, 72, 128, 74, 72, - 65, 89, 73, 78, 128, 74, 72, 65, 78, 128, 74, 72, 65, 77, 128, 74, 72, - 65, 65, 128, 74, 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, - 76, 69, 77, 128, 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, - 128, 74, 69, 72, 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, - 69, 69, 77, 128, 74, 69, 69, 205, 74, 69, 65, 78, 83, 128, 74, 65, 89, - 78, 128, 74, 65, 89, 73, 78, 128, 74, 65, 89, 65, 78, 78, 65, 128, 74, - 65, 87, 128, 74, 65, 86, 73, 89, 65, 78, 73, 128, 74, 65, 86, 65, 78, 69, - 83, 197, 74, 65, 85, 128, 74, 65, 82, 128, 74, 65, 80, 65, 78, 69, 83, - 197, 74, 65, 80, 65, 78, 128, 74, 65, 78, 85, 65, 82, 89, 128, 74, 65, - 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, 72, 79, 85, 128, 74, 65, 73, 206, - 74, 65, 73, 128, 74, 65, 72, 128, 74, 65, 68, 69, 128, 74, 65, 67, 75, - 83, 128, 74, 65, 67, 75, 45, 79, 45, 76, 65, 78, 84, 69, 82, 78, 128, 74, - 65, 67, 203, 74, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 73, 90, 72, - 73, 84, 83, 65, 128, 73, 90, 72, 73, 84, 83, 193, 73, 90, 72, 69, 128, - 73, 90, 65, 75, 65, 89, 193, 73, 89, 69, 75, 128, 73, 89, 65, 78, 78, 65, - 128, 73, 85, 74, 65, 128, 73, 84, 211, 73, 84, 69, 82, 65, 84, 73, 79, - 206, 73, 84, 69, 77, 128, 73, 83, 83, 72, 65, 82, 128, 73, 83, 79, 83, - 67, 69, 76, 69, 211, 73, 83, 79, 78, 128, 73, 83, 79, 206, 73, 83, 79, - 76, 65, 84, 69, 128, 73, 83, 76, 65, 78, 68, 128, 73, 83, 69, 78, 45, 73, - 83, 69, 78, 128, 73, 83, 65, 75, 73, 193, 73, 83, 45, 80, 73, 76, 76, 65, - 128, 73, 82, 85, 89, 65, 78, 78, 65, 128, 73, 82, 85, 85, 89, 65, 78, 78, - 65, 128, 73, 82, 79, 78, 45, 67, 79, 80, 80, 69, 210, 73, 82, 79, 78, - 128, 73, 82, 66, 128, 73, 79, 84, 73, 70, 73, 69, 196, 73, 79, 84, 65, - 84, 69, 196, 73, 79, 84, 65, 128, 73, 79, 84, 193, 73, 79, 82, 128, 73, - 79, 78, 71, 128, 73, 79, 68, 72, 65, 68, 72, 128, 73, 78, 86, 73, 83, 73, - 66, 76, 197, 73, 78, 86, 69, 82, 84, 69, 68, 128, 73, 78, 86, 69, 82, 84, - 69, 196, 73, 78, 86, 69, 82, 84, 69, 66, 82, 65, 84, 69, 128, 73, 78, 86, - 69, 82, 83, 197, 73, 78, 84, 82, 79, 68, 85, 67, 69, 82, 128, 73, 78, 84, - 73, 128, 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, 73, 195, 73, 78, 84, - 69, 82, 83, 69, 67, 84, 73, 79, 78, 128, 73, 78, 84, 69, 82, 83, 69, 67, - 84, 73, 79, 206, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 78, 199, 73, 78, - 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, 73, 78, 84, 69, 82, 82, 79, 66, - 65, 78, 199, 73, 78, 84, 69, 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, - 84, 69, 82, 76, 79, 67, 75, 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, - 65, 210, 73, 78, 84, 69, 82, 76, 65, 67, 69, 196, 73, 78, 84, 69, 82, 73, - 79, 210, 73, 78, 84, 69, 82, 69, 83, 212, 73, 78, 84, 69, 82, 67, 65, 76, - 65, 84, 69, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 78, 128, 73, 78, - 84, 69, 71, 82, 65, 84, 73, 79, 206, 73, 78, 84, 69, 71, 82, 65, 76, 128, - 73, 78, 84, 69, 71, 82, 65, 204, 73, 78, 83, 85, 76, 65, 210, 73, 78, 83, - 84, 82, 85, 77, 69, 78, 84, 65, 204, 73, 78, 83, 73, 68, 69, 128, 73, 78, - 83, 73, 68, 197, 73, 78, 83, 69, 82, 84, 73, 79, 206, 73, 78, 83, 69, 82, - 212, 73, 78, 83, 69, 67, 84, 128, 73, 78, 83, 67, 82, 73, 80, 84, 73, 79, - 78, 65, 204, 73, 78, 80, 85, 212, 73, 78, 78, 79, 67, 69, 78, 67, 69, - 128, 73, 78, 78, 78, 128, 73, 78, 78, 69, 82, 128, 73, 78, 78, 69, 210, - 73, 78, 78, 128, 73, 78, 73, 78, 71, 85, 128, 73, 78, 72, 73, 66, 73, - 212, 73, 78, 72, 69, 82, 69, 78, 212, 73, 78, 72, 65, 76, 69, 128, 73, - 78, 71, 87, 65, 90, 128, 73, 78, 70, 79, 82, 77, 65, 84, 73, 79, 206, 73, - 78, 70, 76, 85, 69, 78, 67, 69, 128, 73, 78, 70, 73, 78, 73, 84, 89, 128, - 73, 78, 70, 73, 78, 73, 84, 217, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, - 73, 78, 68, 73, 82, 69, 67, 212, 73, 78, 68, 73, 67, 84, 73, 79, 206, 73, - 78, 68, 73, 67, 65, 84, 79, 82, 128, 73, 78, 68, 73, 67, 65, 84, 79, 210, - 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, 206, 73, 78, 68, 69, 88, 128, - 73, 78, 68, 69, 80, 69, 78, 68, 69, 78, 212, 73, 78, 67, 82, 69, 77, 69, - 78, 84, 128, 73, 78, 67, 82, 69, 65, 83, 69, 211, 73, 78, 67, 82, 69, 65, - 83, 69, 128, 73, 78, 67, 82, 69, 65, 83, 197, 73, 78, 67, 79, 77, 80, 76, - 69, 84, 197, 73, 78, 67, 79, 77, 73, 78, 199, 73, 78, 67, 76, 85, 68, 73, - 78, 199, 73, 78, 67, 72, 128, 73, 78, 66, 79, 216, 73, 78, 65, 80, 128, - 73, 78, 45, 65, 76, 65, 70, 128, 73, 77, 80, 69, 82, 73, 65, 204, 73, 77, - 80, 69, 82, 70, 69, 67, 84, 85, 205, 73, 77, 80, 69, 82, 70, 69, 67, 84, - 65, 128, 73, 77, 80, 69, 82, 70, 69, 67, 84, 193, 73, 77, 78, 128, 73, - 77, 73, 83, 69, 79, 211, 73, 77, 73, 78, 51, 128, 73, 77, 73, 78, 128, - 73, 77, 73, 206, 73, 77, 73, 70, 84, 72, 79, 82, 79, 78, 128, 73, 77, 73, - 70, 84, 72, 79, 82, 65, 128, 73, 77, 73, 70, 79, 78, 79, 78, 128, 73, 77, - 73, 68, 73, 65, 82, 71, 79, 78, 128, 73, 77, 65, 71, 197, 73, 76, 85, 89, - 65, 78, 78, 65, 128, 73, 76, 85, 89, 128, 73, 76, 85, 85, 89, 65, 78, 78, - 65, 128, 73, 76, 85, 84, 128, 73, 76, 73, 77, 77, 85, 52, 128, 73, 76, - 73, 77, 77, 85, 51, 128, 73, 76, 73, 77, 77, 85, 128, 73, 76, 73, 77, 77, - 213, 73, 76, 50, 128, 73, 75, 65, 82, 65, 128, 73, 75, 65, 82, 193, 73, - 74, 128, 73, 73, 89, 65, 78, 78, 65, 128, 73, 71, 73, 128, 73, 71, 201, - 73, 71, 71, 87, 83, 128, 73, 70, 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, - 73, 75, 69, 85, 84, 128, 73, 69, 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, - 72, 128, 73, 69, 85, 78, 71, 45, 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, - 71, 45, 80, 73, 69, 85, 80, 128, 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, - 85, 80, 72, 128, 73, 69, 85, 78, 71, 45, 67, 73, 69, 85, 67, 128, 73, 69, - 85, 78, 71, 45, 67, 72, 73, 69, 85, 67, 72, 128, 73, 69, 85, 78, 199, 73, - 68, 76, 69, 128, 73, 68, 73, 77, 128, 73, 68, 73, 205, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 57, 49, 52, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 57, 48, 52, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 56, 68, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 56, 67, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 56, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 68, 52, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 65, 55, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 57, 56, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 55, 54, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 55, 53, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 55, 53, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 54, 69, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 54, 55, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 54, 55, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 54, 50, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 66, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 54, 53, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 54, 53, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 54, 51, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 48, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 57, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 53, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 54, 50, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 53, 70, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 68, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 56, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 53, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 57, 50, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 53, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 53, 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 53, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 48, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 53, 51, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 53, 50, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 50, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 52, 69, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 52, 69, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 52, 69, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 200, 73, 68, 69, 78, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, - 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 73, 67, 79, 78, 128, 73, 67, - 72, 79, 85, 128, 73, 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, - 83, 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, - 67, 45, 89, 82, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, 65, - 128, 73, 48, 49, 53, 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, 73, - 48, 49, 50, 128, 73, 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, 48, - 49, 48, 65, 128, 73, 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, 48, - 48, 57, 128, 73, 48, 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, - 128, 73, 48, 48, 53, 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, - 73, 48, 48, 51, 128, 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, - 89, 85, 128, 73, 45, 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, - 69, 128, 73, 45, 89, 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, - 89, 65, 128, 73, 45, 79, 45, 73, 128, 73, 45, 79, 128, 73, 45, 69, 85, - 128, 73, 45, 66, 69, 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, 73, - 45, 65, 128, 72, 90, 90, 90, 71, 128, 72, 90, 90, 90, 128, 72, 90, 90, - 80, 128, 72, 90, 90, 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, 90, - 84, 128, 72, 90, 71, 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, 72, - 89, 80, 79, 68, 73, 65, 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, 78, - 65, 84, 73, 79, 206, 72, 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, - 72, 89, 80, 72, 69, 78, 128, 72, 89, 80, 72, 69, 206, 72, 89, 71, 73, 69, - 73, 65, 128, 72, 89, 71, 73, 69, 65, 128, 72, 88, 87, 71, 128, 72, 88, - 85, 79, 88, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79, 80, 128, 72, - 88, 85, 79, 128, 72, 88, 79, 88, 128, 72, 88, 79, 84, 128, 72, 88, 79, - 80, 128, 72, 88, 79, 128, 72, 88, 73, 88, 128, 72, 88, 73, 84, 128, 72, - 88, 73, 80, 128, 72, 88, 73, 69, 88, 128, 72, 88, 73, 69, 84, 128, 72, - 88, 73, 69, 80, 128, 72, 88, 73, 69, 128, 72, 88, 73, 128, 72, 88, 69, - 88, 128, 72, 88, 69, 80, 128, 72, 88, 69, 128, 72, 88, 65, 88, 128, 72, - 88, 65, 84, 128, 72, 88, 65, 80, 128, 72, 88, 65, 128, 72, 87, 85, 128, - 72, 87, 65, 73, 82, 128, 72, 87, 65, 72, 128, 72, 85, 86, 65, 128, 72, - 85, 83, 72, 69, 196, 72, 85, 83, 72, 128, 72, 85, 82, 65, 78, 128, 72, - 85, 79, 84, 128, 72, 85, 78, 68, 82, 69, 68, 83, 128, 72, 85, 78, 68, 82, - 69, 68, 211, 72, 85, 78, 68, 82, 69, 68, 128, 72, 85, 78, 68, 82, 69, - 196, 72, 85, 78, 128, 72, 85, 77, 208, 72, 85, 77, 65, 78, 128, 72, 85, - 77, 65, 206, 72, 85, 76, 50, 128, 72, 85, 73, 73, 84, 79, 128, 72, 85, - 71, 71, 73, 78, 199, 72, 85, 66, 50, 128, 72, 85, 66, 178, 72, 85, 66, - 128, 72, 85, 65, 82, 65, 68, 68, 79, 128, 72, 85, 65, 78, 128, 72, 85, - 45, 51, 128, 72, 85, 45, 50, 128, 72, 85, 45, 49, 128, 72, 84, 83, 128, - 72, 84, 74, 128, 72, 82, 89, 86, 78, 73, 193, 72, 80, 87, 71, 128, 72, - 80, 65, 128, 72, 80, 128, 72, 79, 85, 83, 197, 72, 79, 85, 82, 71, 76, - 65, 83, 83, 128, 72, 79, 85, 82, 71, 76, 65, 83, 211, 72, 79, 85, 82, - 128, 72, 79, 85, 210, 72, 79, 84, 69, 76, 128, 72, 79, 84, 65, 128, 72, - 79, 83, 80, 73, 84, 65, 76, 128, 72, 79, 82, 83, 69, 128, 72, 79, 82, 83, - 197, 72, 79, 82, 82, 128, 72, 79, 82, 78, 83, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 54, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 54, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, - 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, - 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, - 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 49, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 52, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 52, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, - 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, - 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, - 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 52, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 49, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 49, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, - 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, - 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, - 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 48, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 72, 79, 82, - 73, 128, 72, 79, 82, 193, 72, 79, 79, 85, 128, 72, 79, 79, 82, 85, 128, - 72, 79, 79, 80, 128, 72, 79, 79, 78, 128, 72, 79, 79, 75, 69, 68, 128, - 72, 79, 79, 75, 69, 196, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79, 78, - 69, 217, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, 84, - 72, 69, 84, 73, 195, 72, 79, 76, 79, 128, 72, 79, 76, 76, 79, 215, 72, - 79, 76, 69, 128, 72, 79, 76, 68, 73, 78, 199, 72, 79, 76, 65, 77, 128, - 72, 79, 76, 65, 205, 72, 79, 75, 65, 128, 72, 79, 67, 75, 69, 217, 72, - 79, 67, 72, 79, 128, 72, 79, 45, 56, 128, 72, 79, 45, 55, 128, 72, 79, - 45, 54, 128, 72, 79, 45, 53, 128, 72, 79, 45, 52, 128, 72, 79, 45, 51, - 128, 72, 79, 45, 50, 128, 72, 79, 45, 49, 128, 72, 78, 85, 84, 128, 72, - 78, 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 85, 66, 128, 72, 78, - 79, 88, 128, 72, 78, 79, 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, - 128, 72, 78, 73, 84, 128, 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, - 72, 78, 73, 69, 84, 128, 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, - 72, 78, 73, 128, 72, 78, 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, - 128, 72, 78, 65, 88, 128, 72, 78, 65, 85, 128, 72, 78, 65, 84, 128, 72, - 78, 65, 80, 128, 72, 78, 65, 128, 72, 77, 89, 88, 128, 72, 77, 89, 82, - 88, 128, 72, 77, 89, 82, 128, 72, 77, 89, 80, 128, 72, 77, 89, 128, 72, - 77, 85, 88, 128, 72, 77, 85, 84, 128, 72, 77, 85, 82, 88, 128, 72, 77, - 85, 82, 128, 72, 77, 85, 80, 128, 72, 77, 85, 79, 88, 128, 72, 77, 85, - 79, 80, 128, 72, 77, 85, 79, 128, 72, 77, 85, 128, 72, 77, 79, 88, 128, - 72, 77, 79, 84, 128, 72, 77, 79, 80, 128, 72, 77, 79, 128, 72, 77, 73, - 88, 128, 72, 77, 73, 84, 128, 72, 77, 73, 80, 128, 72, 77, 73, 69, 88, - 128, 72, 77, 73, 69, 80, 128, 72, 77, 73, 69, 128, 72, 77, 73, 128, 72, - 77, 69, 128, 72, 77, 65, 88, 128, 72, 77, 65, 84, 128, 72, 77, 65, 80, - 128, 72, 77, 65, 128, 72, 76, 89, 88, 128, 72, 76, 89, 84, 128, 72, 76, - 89, 82, 88, 128, 72, 76, 89, 82, 128, 72, 76, 89, 80, 128, 72, 76, 89, - 128, 72, 76, 85, 88, 128, 72, 76, 85, 84, 128, 72, 76, 85, 82, 88, 128, - 72, 76, 85, 82, 128, 72, 76, 85, 80, 128, 72, 76, 85, 79, 88, 128, 72, - 76, 85, 79, 80, 128, 72, 76, 85, 79, 128, 72, 76, 85, 128, 72, 76, 79, - 88, 128, 72, 76, 79, 80, 128, 72, 76, 79, 128, 72, 76, 73, 88, 128, 72, - 76, 73, 84, 128, 72, 76, 73, 80, 128, 72, 76, 73, 69, 88, 128, 72, 76, - 73, 69, 80, 128, 72, 76, 73, 69, 128, 72, 76, 73, 128, 72, 76, 69, 88, - 128, 72, 76, 69, 80, 128, 72, 76, 69, 128, 72, 76, 65, 88, 128, 72, 76, - 65, 85, 128, 72, 76, 65, 84, 128, 72, 76, 65, 80, 128, 72, 76, 65, 128, - 72, 76, 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 89, 79, 128, 72, - 73, 84, 84, 73, 78, 199, 72, 73, 83, 84, 79, 82, 73, 195, 72, 73, 82, 73, - 81, 128, 72, 73, 80, 80, 79, 80, 79, 84, 65, 77, 85, 83, 128, 72, 73, 78, - 71, 69, 68, 128, 72, 73, 78, 71, 69, 196, 72, 73, 78, 71, 69, 128, 72, - 73, 78, 68, 213, 72, 73, 75, 73, 78, 199, 72, 73, 71, 72, 45, 83, 80, 69, - 69, 196, 72, 73, 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 72, - 73, 71, 72, 45, 76, 79, 215, 72, 73, 71, 72, 45, 72, 69, 69, 76, 69, 196, - 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 83, 73, 79, 83, 128, 72, 73, - 69, 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, 73, 69, 85, 72, 45, 80, 73, - 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, 73, 69, 85, 78, 128, 72, 73, - 69, 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, 73, 69, 85, 200, 72, 73, 69, - 82, 79, 71, 76, 89, 80, 72, 73, 195, 72, 73, 69, 128, 72, 73, 68, 73, 78, + 128, 75, 78, 85, 67, 75, 76, 69, 128, 75, 78, 79, 84, 128, 75, 78, 79, + 66, 83, 128, 75, 78, 73, 71, 72, 84, 45, 82, 79, 79, 75, 128, 75, 78, 73, + 71, 72, 84, 45, 81, 85, 69, 69, 78, 128, 75, 78, 73, 71, 72, 84, 45, 66, + 73, 83, 72, 79, 80, 128, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, + 212, 75, 78, 73, 70, 69, 128, 75, 78, 73, 70, 197, 75, 78, 69, 69, 76, + 73, 78, 199, 75, 77, 128, 75, 205, 75, 76, 73, 84, 79, 78, 128, 75, 76, + 65, 83, 77, 65, 128, 75, 76, 65, 83, 77, 193, 75, 76, 65, 128, 75, 76, + 128, 75, 75, 79, 128, 75, 75, 73, 128, 75, 75, 69, 69, 128, 75, 75, 69, + 128, 75, 75, 65, 128, 75, 75, 128, 75, 74, 69, 128, 75, 73, 89, 69, 79, + 75, 45, 84, 73, 75, 69, 85, 84, 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, + 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 75, 73, 89, 69, 79, 75, 45, 82, + 73, 69, 85, 76, 128, 75, 73, 89, 69, 79, 75, 45, 80, 73, 69, 85, 80, 128, + 75, 73, 89, 69, 79, 75, 45, 78, 73, 69, 85, 78, 128, 75, 73, 89, 69, 79, + 75, 45, 75, 72, 73, 69, 85, 75, 72, 128, 75, 73, 89, 69, 79, 75, 45, 67, + 72, 73, 69, 85, 67, 72, 128, 75, 73, 89, 69, 79, 203, 75, 73, 88, 128, + 75, 73, 87, 73, 70, 82, 85, 73, 84, 128, 75, 73, 87, 128, 75, 73, 86, + 128, 75, 73, 84, 69, 128, 75, 73, 84, 128, 75, 73, 83, 83, 73, 78, 199, + 75, 73, 83, 83, 128, 75, 73, 83, 211, 75, 73, 83, 73, 77, 53, 128, 75, + 73, 83, 73, 77, 181, 75, 73, 83, 72, 128, 75, 73, 83, 65, 76, 128, 75, + 73, 82, 79, 87, 65, 84, 84, 79, 128, 75, 73, 82, 79, 77, 69, 69, 84, 79, + 82, 85, 128, 75, 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75, 73, 82, 79, + 128, 75, 73, 82, 71, 72, 73, 218, 75, 73, 81, 128, 75, 73, 80, 128, 75, + 73, 208, 75, 73, 78, 83, 72, 73, 80, 128, 75, 73, 78, 78, 193, 75, 73, + 78, 68, 69, 82, 71, 65, 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, + 75, 73, 76, 76, 69, 82, 128, 75, 73, 73, 90, 72, 128, 75, 73, 73, 128, + 75, 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 86, 65, 206, 75, 73, + 69, 80, 128, 75, 73, 69, 69, 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, + 75, 73, 196, 75, 73, 67, 75, 128, 75, 73, 66, 128, 75, 73, 65, 86, 128, + 75, 73, 65, 66, 128, 75, 73, 45, 56, 128, 75, 73, 45, 55, 128, 75, 73, + 45, 54, 128, 75, 73, 45, 53, 128, 75, 73, 45, 52, 128, 75, 73, 45, 51, + 128, 75, 73, 45, 50, 128, 75, 73, 45, 49, 128, 75, 72, 90, 128, 75, 72, + 87, 65, 73, 128, 75, 72, 85, 69, 78, 45, 76, 85, 197, 75, 72, 85, 69, + 206, 75, 72, 85, 68, 65, 87, 65, 68, 201, 75, 72, 85, 68, 65, 77, 128, + 75, 72, 85, 65, 84, 128, 75, 72, 79, 85, 128, 75, 72, 79, 212, 75, 72, + 79, 78, 78, 65, 128, 75, 72, 79, 78, 128, 75, 72, 79, 77, 85, 84, 128, + 75, 72, 79, 74, 75, 201, 75, 72, 79, 128, 75, 72, 207, 75, 72, 77, 213, + 75, 72, 73, 84, 128, 75, 72, 73, 78, 89, 65, 128, 75, 72, 73, 69, 85, 75, + 200, 75, 72, 73, 128, 75, 72, 201, 75, 72, 72, 79, 128, 75, 72, 72, 65, + 128, 75, 72, 69, 84, 72, 128, 75, 72, 69, 73, 128, 75, 72, 69, 69, 128, + 75, 72, 69, 128, 75, 72, 65, 86, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, + 201, 75, 72, 65, 82, 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, 78, 199, + 75, 72, 65, 78, 68, 193, 75, 72, 65, 77, 84, 201, 75, 72, 65, 75, 65, 83, + 83, 73, 65, 206, 75, 72, 65, 73, 128, 75, 72, 65, 72, 128, 75, 72, 65, + 200, 75, 72, 65, 70, 128, 75, 72, 65, 66, 128, 75, 72, 65, 65, 128, 75, + 71, 128, 75, 69, 89, 67, 65, 80, 128, 75, 69, 89, 67, 65, 208, 75, 69, + 89, 66, 79, 65, 82, 68, 128, 75, 69, 89, 66, 79, 65, 82, 196, 75, 69, 88, + 128, 75, 69, 86, 128, 75, 69, 85, 89, 69, 85, 88, 128, 75, 69, 85, 83, + 72, 69, 85, 65, 69, 80, 128, 75, 69, 85, 83, 69, 85, 88, 128, 75, 69, 85, + 80, 85, 81, 128, 75, 69, 85, 79, 212, 75, 69, 85, 77, 128, 75, 69, 85, + 75, 69, 85, 84, 78, 68, 65, 128, 75, 69, 85, 75, 65, 81, 128, 75, 69, 85, + 65, 69, 84, 77, 69, 85, 78, 128, 75, 69, 85, 65, 69, 82, 73, 128, 75, 69, + 84, 84, 201, 75, 69, 83, 72, 50, 128, 75, 69, 82, 69, 84, 128, 75, 69, + 79, 87, 128, 75, 69, 78, 84, 73, 77, 65, 84, 65, 128, 75, 69, 78, 84, 73, + 77, 65, 84, 193, 75, 69, 78, 84, 73, 77, 193, 75, 69, 78, 65, 84, 128, + 75, 69, 78, 128, 75, 69, 206, 75, 69, 77, 80, 85, 76, 128, 75, 69, 77, + 80, 85, 204, 75, 69, 77, 80, 76, 73, 128, 75, 69, 77, 80, 76, 201, 75, + 69, 77, 80, 72, 82, 69, 78, 71, 128, 75, 69, 77, 66, 65, 78, 71, 128, 75, + 69, 76, 86, 73, 206, 75, 69, 72, 69, 72, 128, 75, 69, 72, 69, 200, 75, + 69, 72, 128, 75, 69, 70, 85, 76, 65, 128, 75, 69, 69, 86, 128, 75, 69, + 69, 83, 85, 128, 75, 69, 69, 80, 73, 78, 199, 75, 69, 69, 78, 71, 128, + 75, 69, 69, 66, 128, 75, 69, 66, 128, 75, 69, 65, 65, 69, 128, 75, 67, + 65, 76, 128, 75, 66, 128, 75, 65, 90, 65, 75, 200, 75, 65, 89, 65, 78, + 78, 65, 128, 75, 65, 89, 65, 200, 75, 65, 88, 128, 75, 65, 87, 86, 128, + 75, 65, 87, 73, 128, 75, 65, 87, 66, 128, 75, 65, 86, 89, 75, 65, 128, + 75, 65, 86, 89, 75, 193, 75, 65, 86, 128, 75, 65, 85, 86, 128, 75, 65, + 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, 85, 66, 128, 75, 65, 84, 79, + 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, 75, 65, 84, 72, 65, 75, 193, + 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, 65, 84, 65, 86, 193, 75, 65, + 84, 65, 75, 65, 78, 65, 45, 72, 73, 82, 65, 71, 65, 78, 193, 75, 65, 83, + 82, 65, 84, 65, 78, 128, 75, 65, 83, 82, 65, 84, 65, 206, 75, 65, 83, 82, + 65, 128, 75, 65, 83, 82, 193, 75, 65, 83, 75, 65, 76, 128, 75, 65, 83, + 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, 201, 75, 65, 82, 83, 72, 65, 78, + 65, 128, 75, 65, 82, 79, 82, 73, 73, 128, 75, 65, 82, 79, 82, 65, 78, + 128, 75, 65, 82, 79, 82, 128, 75, 65, 82, 207, 75, 65, 82, 69, 206, 75, + 65, 82, 65, 84, 84, 79, 128, 75, 65, 82, 65, 78, 128, 75, 65, 80, 89, 69, + 79, 85, 78, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 75, 65, 80, 89, + 69, 79, 85, 78, 82, 73, 69, 85, 76, 128, 75, 65, 80, 89, 69, 79, 85, 78, + 80, 72, 73, 69, 85, 80, 72, 128, 75, 65, 80, 89, 69, 79, 85, 78, 77, 73, + 69, 85, 77, 128, 75, 65, 80, 80, 65, 128, 75, 65, 80, 80, 193, 75, 65, + 80, 79, 128, 75, 65, 80, 72, 128, 75, 65, 80, 65, 76, 128, 75, 65, 80, + 65, 128, 75, 65, 208, 75, 65, 78, 84, 65, 74, 193, 75, 65, 78, 78, 65, + 68, 193, 75, 65, 78, 71, 65, 82, 79, 79, 128, 75, 65, 78, 71, 128, 75, + 65, 78, 199, 75, 65, 78, 65, 75, 79, 128, 75, 65, 77, 52, 128, 75, 65, + 77, 50, 128, 75, 65, 77, 128, 75, 65, 75, 79, 128, 75, 65, 75, 65, 66, + 65, 84, 128, 75, 65, 75, 128, 75, 65, 203, 75, 65, 73, 86, 128, 75, 65, + 73, 84, 72, 201, 75, 65, 73, 82, 73, 128, 75, 65, 73, 66, 128, 75, 65, + 73, 128, 75, 65, 201, 75, 65, 70, 65, 128, 75, 65, 70, 128, 75, 65, 198, + 75, 65, 68, 53, 128, 75, 65, 68, 181, 75, 65, 68, 52, 128, 75, 65, 68, + 51, 128, 75, 65, 68, 179, 75, 65, 68, 50, 128, 75, 65, 68, 128, 75, 65, + 66, 193, 75, 65, 66, 128, 75, 65, 65, 86, 128, 75, 65, 65, 73, 128, 75, + 65, 65, 70, 85, 128, 75, 65, 65, 70, 128, 75, 65, 65, 67, 85, 128, 75, + 65, 65, 66, 65, 128, 75, 65, 65, 66, 128, 75, 65, 50, 128, 75, 65, 178, + 75, 65, 45, 75, 69, 128, 75, 65, 45, 57, 128, 75, 65, 45, 56, 128, 75, + 65, 45, 55, 128, 75, 65, 45, 54, 128, 75, 65, 45, 53, 128, 75, 65, 45, + 52, 128, 75, 65, 45, 51, 128, 75, 65, 45, 50, 128, 75, 65, 45, 49, 49, + 128, 75, 65, 45, 49, 48, 128, 75, 65, 45, 49, 128, 75, 48, 48, 56, 128, + 75, 48, 48, 55, 128, 75, 48, 48, 54, 128, 75, 48, 48, 53, 128, 75, 48, + 48, 52, 128, 75, 48, 48, 51, 128, 75, 48, 48, 50, 128, 75, 48, 48, 49, + 128, 74, 87, 65, 128, 74, 85, 85, 128, 74, 85, 84, 128, 74, 85, 83, 84, + 73, 70, 73, 67, 65, 84, 73, 79, 78, 128, 74, 85, 80, 73, 84, 69, 82, 128, + 74, 85, 79, 84, 128, 74, 85, 79, 80, 128, 74, 85, 78, 79, 128, 74, 85, + 78, 71, 83, 69, 79, 78, 199, 74, 85, 78, 69, 128, 74, 85, 76, 89, 128, + 74, 85, 71, 71, 76, 73, 78, 71, 128, 74, 85, 69, 85, 73, 128, 74, 85, 68, + 85, 76, 128, 74, 85, 68, 71, 69, 128, 74, 85, 68, 69, 79, 45, 83, 80, 65, + 78, 73, 83, 200, 74, 79, 89, 83, 84, 73, 67, 75, 128, 74, 79, 89, 79, 85, + 211, 74, 79, 89, 128, 74, 79, 86, 69, 128, 74, 79, 212, 74, 79, 78, 71, + 128, 74, 79, 78, 193, 74, 79, 75, 69, 82, 128, 74, 79, 73, 78, 84, 83, + 128, 74, 79, 73, 78, 69, 68, 128, 74, 79, 73, 78, 128, 74, 79, 65, 128, + 74, 78, 89, 65, 128, 74, 74, 89, 88, 128, 74, 74, 89, 84, 128, 74, 74, + 89, 80, 128, 74, 74, 89, 128, 74, 74, 85, 88, 128, 74, 74, 85, 84, 128, + 74, 74, 85, 82, 88, 128, 74, 74, 85, 82, 128, 74, 74, 85, 80, 128, 74, + 74, 85, 79, 88, 128, 74, 74, 85, 79, 80, 128, 74, 74, 85, 79, 128, 74, + 74, 85, 128, 74, 74, 79, 88, 128, 74, 74, 79, 84, 128, 74, 74, 79, 80, + 128, 74, 74, 79, 128, 74, 74, 73, 88, 128, 74, 74, 73, 84, 128, 74, 74, + 73, 80, 128, 74, 74, 73, 69, 88, 128, 74, 74, 73, 69, 84, 128, 74, 74, + 73, 69, 80, 128, 74, 74, 73, 69, 128, 74, 74, 73, 128, 74, 74, 69, 69, + 128, 74, 74, 69, 128, 74, 74, 65, 128, 74, 73, 76, 128, 74, 73, 73, 77, + 128, 74, 73, 73, 128, 74, 73, 72, 86, 65, 77, 85, 76, 73, 89, 65, 128, + 74, 73, 71, 83, 65, 215, 74, 73, 65, 128, 74, 72, 79, 88, 128, 74, 72, + 79, 128, 74, 72, 69, 72, 128, 74, 72, 65, 89, 73, 78, 128, 74, 72, 65, + 78, 128, 74, 72, 65, 77, 128, 74, 72, 65, 65, 128, 74, 72, 65, 128, 74, + 69, 85, 128, 74, 69, 82, 85, 83, 65, 76, 69, 77, 128, 74, 69, 82, 65, + 206, 74, 69, 82, 65, 128, 74, 69, 82, 128, 74, 69, 72, 128, 74, 69, 200, + 74, 69, 71, 79, 71, 65, 78, 128, 74, 69, 69, 77, 128, 74, 69, 69, 205, + 74, 69, 65, 78, 83, 128, 74, 65, 89, 78, 128, 74, 65, 89, 73, 78, 128, + 74, 65, 89, 65, 78, 78, 65, 128, 74, 65, 87, 128, 74, 65, 86, 73, 89, 65, + 78, 73, 128, 74, 65, 86, 65, 78, 69, 83, 197, 74, 65, 85, 128, 74, 65, + 82, 128, 74, 65, 80, 65, 78, 69, 83, 197, 74, 65, 80, 65, 78, 128, 74, + 65, 78, 85, 65, 82, 89, 128, 74, 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, + 85, 72, 79, 85, 128, 74, 65, 73, 206, 74, 65, 73, 128, 74, 65, 72, 128, + 74, 65, 68, 69, 128, 74, 65, 67, 75, 83, 128, 74, 65, 67, 75, 45, 79, 45, + 76, 65, 78, 84, 69, 82, 78, 128, 74, 65, 67, 203, 74, 45, 83, 73, 77, 80, + 76, 73, 70, 73, 69, 196, 73, 90, 72, 73, 84, 83, 65, 128, 73, 90, 72, 73, + 84, 83, 193, 73, 90, 72, 69, 128, 73, 90, 65, 75, 65, 89, 193, 73, 89, + 69, 75, 128, 73, 89, 65, 78, 78, 65, 128, 73, 85, 74, 65, 128, 73, 84, + 211, 73, 84, 69, 82, 65, 84, 73, 79, 206, 73, 84, 69, 77, 128, 73, 83, + 83, 72, 65, 82, 128, 73, 83, 79, 83, 67, 69, 76, 69, 211, 73, 83, 79, 78, + 128, 73, 83, 79, 206, 73, 83, 79, 76, 65, 84, 69, 128, 73, 83, 76, 65, + 78, 68, 128, 73, 83, 69, 78, 45, 73, 83, 69, 78, 128, 73, 83, 65, 75, 73, + 193, 73, 83, 45, 80, 73, 76, 76, 65, 128, 73, 82, 85, 89, 65, 78, 78, 65, + 128, 73, 82, 85, 85, 89, 65, 78, 78, 65, 128, 73, 82, 79, 78, 45, 67, 79, + 80, 80, 69, 210, 73, 82, 79, 78, 128, 73, 82, 66, 128, 73, 79, 84, 73, + 70, 73, 69, 196, 73, 79, 84, 65, 84, 69, 196, 73, 79, 84, 65, 128, 73, + 79, 84, 193, 73, 79, 82, 128, 73, 79, 78, 71, 128, 73, 79, 68, 72, 65, + 68, 72, 128, 73, 78, 86, 73, 83, 73, 66, 76, 197, 73, 78, 86, 69, 82, 84, + 69, 68, 128, 73, 78, 86, 69, 82, 84, 69, 196, 73, 78, 86, 69, 82, 84, 69, + 66, 82, 65, 84, 69, 128, 73, 78, 86, 69, 82, 83, 197, 73, 78, 84, 82, 79, + 68, 85, 67, 69, 82, 128, 73, 78, 84, 73, 128, 73, 78, 84, 69, 82, 83, 89, + 76, 76, 65, 66, 73, 195, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 78, + 128, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 206, 73, 78, 84, 69, 82, + 83, 69, 67, 84, 73, 78, 199, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 71, + 128, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 199, 73, 78, 84, 69, 82, 80, + 79, 76, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, 76, 79, 67, 75, 69, 196, + 73, 78, 84, 69, 82, 76, 73, 78, 69, 65, 210, 73, 78, 84, 69, 82, 76, 65, + 67, 69, 196, 73, 78, 84, 69, 82, 73, 79, 210, 73, 78, 84, 69, 82, 69, 83, + 212, 73, 78, 84, 69, 82, 67, 65, 76, 65, 84, 69, 128, 73, 78, 84, 69, 71, + 82, 65, 84, 73, 79, 78, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 206, + 73, 78, 84, 69, 71, 82, 65, 76, 128, 73, 78, 84, 69, 71, 82, 65, 204, 73, + 78, 83, 85, 76, 65, 210, 73, 78, 83, 84, 82, 85, 77, 69, 78, 84, 65, 204, + 73, 78, 83, 73, 68, 69, 128, 73, 78, 83, 73, 68, 197, 73, 78, 83, 69, 82, + 84, 73, 79, 206, 73, 78, 83, 69, 82, 212, 73, 78, 83, 69, 67, 84, 128, + 73, 78, 83, 67, 82, 73, 80, 84, 73, 79, 78, 65, 204, 73, 78, 80, 85, 212, + 73, 78, 78, 79, 67, 69, 78, 67, 69, 128, 73, 78, 78, 78, 128, 73, 78, 78, + 69, 82, 128, 73, 78, 78, 69, 210, 73, 78, 78, 128, 73, 78, 73, 78, 71, + 85, 128, 73, 78, 72, 73, 66, 73, 212, 73, 78, 72, 69, 82, 69, 78, 212, + 73, 78, 72, 65, 76, 69, 128, 73, 78, 71, 87, 65, 90, 128, 73, 78, 70, 79, + 82, 77, 65, 84, 73, 79, 206, 73, 78, 70, 76, 85, 69, 78, 67, 69, 128, 73, + 78, 70, 73, 78, 73, 84, 89, 128, 73, 78, 70, 73, 78, 73, 84, 217, 73, 78, + 68, 85, 83, 84, 82, 73, 65, 204, 73, 78, 68, 73, 82, 69, 67, 212, 73, 78, + 68, 73, 67, 84, 73, 79, 206, 73, 78, 68, 73, 67, 65, 84, 79, 82, 128, 73, + 78, 68, 73, 67, 65, 84, 79, 210, 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, + 206, 73, 78, 68, 69, 88, 128, 73, 78, 68, 69, 80, 69, 78, 68, 69, 78, + 212, 73, 78, 67, 82, 69, 77, 69, 78, 84, 128, 73, 78, 67, 82, 69, 65, 83, + 69, 211, 73, 78, 67, 82, 69, 65, 83, 69, 128, 73, 78, 67, 82, 69, 65, 83, + 197, 73, 78, 67, 79, 77, 80, 76, 69, 84, 197, 73, 78, 67, 79, 77, 73, 78, + 199, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, 78, 67, 72, 128, 73, 78, + 66, 79, 216, 73, 78, 65, 80, 128, 73, 78, 45, 65, 76, 65, 70, 128, 73, + 77, 80, 69, 82, 73, 65, 204, 73, 77, 80, 69, 82, 70, 69, 67, 84, 85, 205, + 73, 77, 80, 69, 82, 70, 69, 67, 84, 65, 128, 73, 77, 80, 69, 82, 70, 69, + 67, 84, 193, 73, 77, 78, 128, 73, 77, 73, 83, 69, 79, 211, 73, 77, 73, + 78, 51, 128, 73, 77, 73, 78, 128, 73, 77, 73, 206, 73, 77, 73, 70, 84, + 72, 79, 82, 79, 78, 128, 73, 77, 73, 70, 84, 72, 79, 82, 65, 128, 73, 77, + 73, 70, 79, 78, 79, 78, 128, 73, 77, 73, 68, 73, 65, 82, 71, 79, 78, 128, + 73, 77, 65, 71, 197, 73, 76, 85, 89, 65, 78, 78, 65, 128, 73, 76, 85, 89, + 128, 73, 76, 85, 85, 89, 65, 78, 78, 65, 128, 73, 76, 85, 84, 128, 73, + 76, 73, 77, 77, 85, 52, 128, 73, 76, 73, 77, 77, 85, 51, 128, 73, 76, 73, + 77, 77, 85, 128, 73, 76, 73, 77, 77, 213, 73, 76, 50, 128, 73, 75, 65, + 82, 65, 128, 73, 75, 65, 82, 193, 73, 74, 128, 73, 73, 89, 65, 78, 78, + 65, 128, 73, 71, 73, 128, 73, 71, 201, 73, 71, 71, 87, 83, 128, 73, 70, + 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, 73, 75, 69, 85, 84, 128, 73, 69, + 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, 72, 128, 73, 69, 85, 78, 71, 45, + 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, 71, 45, 80, 73, 69, 85, 80, 128, + 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, 85, 80, 72, 128, 73, 69, 85, 78, + 71, 45, 67, 73, 69, 85, 67, 128, 73, 69, 85, 78, 71, 45, 67, 72, 73, 69, + 85, 67, 72, 128, 73, 69, 85, 78, 199, 73, 68, 76, 69, 128, 73, 68, 73, + 77, 128, 73, 68, 73, 205, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 57, 49, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 57, 48, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 68, + 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 67, 65, 57, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 57, 69, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 55, 68, 52, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 55, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 55, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 54, + 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 51, 51, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 49, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 69, + 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 50, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 54, 54, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 54, 53, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, + 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 53, 55, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 53, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 54, 51, 48, 55, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 54, 50, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 54, 50, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, + 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 70, 56, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 68, 69, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 53, 66, 56, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 53, 66, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 53, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 57, + 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 56, 70, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 53, 66, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 53, 52, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 51, + 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 68, 68, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 55, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, + 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 56, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 50, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 200, 73, 68, 69, 78, + 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, 128, 73, 68, 69, 78, 84, 73, 67, + 65, 204, 73, 67, 79, 78, 128, 73, 67, 72, 79, 85, 128, 73, 67, 72, 79, + 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, 83, 128, 73, 67, 72, 65, 68, 73, + 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, 67, 45, 89, 82, 128, 73, 66, 73, + 70, 73, 76, 73, 128, 73, 65, 85, 68, 65, 128, 73, 48, 49, 53, 128, 73, + 48, 49, 52, 128, 73, 48, 49, 51, 128, 73, 48, 49, 50, 128, 73, 48, 49, + 49, 65, 128, 73, 48, 49, 49, 128, 73, 48, 49, 48, 65, 128, 73, 48, 49, + 48, 128, 73, 48, 48, 57, 65, 128, 73, 48, 48, 57, 128, 73, 48, 48, 56, + 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, 128, 73, 48, 48, 53, 65, 128, + 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, 73, 48, 48, 51, 128, 73, 48, + 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, 89, 85, 128, 73, 45, 89, 79, + 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, 69, 128, 73, 45, 89, 65, 69, + 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, 89, 65, 128, 73, 45, 79, 45, + 73, 128, 73, 45, 79, 128, 73, 45, 69, 85, 128, 73, 45, 66, 69, 65, 77, + 128, 73, 45, 65, 82, 65, 69, 65, 128, 73, 45, 65, 128, 72, 90, 90, 90, + 71, 128, 72, 90, 90, 90, 128, 72, 90, 90, 80, 128, 72, 90, 90, 128, 72, + 90, 87, 71, 128, 72, 90, 87, 128, 72, 90, 84, 128, 72, 90, 71, 128, 72, + 89, 83, 84, 69, 82, 69, 83, 73, 211, 72, 89, 80, 79, 68, 73, 65, 83, 84, + 79, 76, 69, 128, 72, 89, 80, 72, 69, 78, 65, 84, 73, 79, 206, 72, 89, 80, + 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, 72, 89, 80, 72, 69, 78, 128, 72, + 89, 80, 72, 69, 206, 72, 89, 71, 73, 69, 73, 65, 128, 72, 89, 71, 73, 69, + 65, 128, 72, 88, 87, 71, 128, 72, 88, 85, 79, 88, 128, 72, 88, 85, 79, + 84, 128, 72, 88, 85, 79, 80, 128, 72, 88, 85, 79, 128, 72, 88, 79, 88, + 128, 72, 88, 79, 84, 128, 72, 88, 79, 80, 128, 72, 88, 79, 128, 72, 88, + 73, 88, 128, 72, 88, 73, 84, 128, 72, 88, 73, 80, 128, 72, 88, 73, 69, + 88, 128, 72, 88, 73, 69, 84, 128, 72, 88, 73, 69, 80, 128, 72, 88, 73, + 69, 128, 72, 88, 73, 128, 72, 88, 69, 88, 128, 72, 88, 69, 80, 128, 72, + 88, 69, 128, 72, 88, 65, 88, 128, 72, 88, 65, 84, 128, 72, 88, 65, 80, + 128, 72, 88, 65, 128, 72, 87, 85, 128, 72, 87, 65, 73, 82, 128, 72, 87, + 65, 72, 128, 72, 85, 86, 65, 128, 72, 85, 83, 72, 69, 196, 72, 85, 83, + 72, 128, 72, 85, 82, 65, 78, 128, 72, 85, 79, 84, 128, 72, 85, 78, 68, + 82, 69, 68, 83, 128, 72, 85, 78, 68, 82, 69, 68, 211, 72, 85, 78, 68, 82, + 69, 68, 128, 72, 85, 78, 68, 82, 69, 196, 72, 85, 78, 128, 72, 85, 77, + 208, 72, 85, 77, 65, 78, 128, 72, 85, 77, 65, 206, 72, 85, 76, 50, 128, + 72, 85, 73, 73, 84, 79, 128, 72, 85, 71, 71, 73, 78, 71, 128, 72, 85, 71, + 71, 73, 78, 199, 72, 85, 66, 50, 128, 72, 85, 66, 178, 72, 85, 66, 128, + 72, 85, 65, 82, 65, 68, 68, 79, 128, 72, 85, 65, 78, 128, 72, 85, 45, 51, + 128, 72, 85, 45, 50, 128, 72, 85, 45, 49, 128, 72, 84, 83, 128, 72, 84, + 74, 128, 72, 82, 89, 86, 78, 73, 193, 72, 80, 87, 71, 128, 72, 80, 65, + 128, 72, 80, 128, 72, 79, 85, 83, 197, 72, 79, 85, 82, 71, 76, 65, 83, + 83, 128, 72, 79, 85, 82, 71, 76, 65, 83, 211, 72, 79, 85, 82, 128, 72, + 79, 85, 210, 72, 79, 84, 69, 76, 128, 72, 79, 84, 65, 128, 72, 79, 83, + 80, 73, 84, 65, 76, 128, 72, 79, 82, 83, 69, 128, 72, 79, 82, 83, 197, + 72, 79, 82, 82, 128, 72, 79, 82, 78, 83, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, + 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, + 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, + 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 51, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 50, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 49, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, + 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, + 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, + 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 54, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 53, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 52, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, + 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, + 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, + 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 50, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 49, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 48, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 72, 79, 82, 73, + 128, 72, 79, 82, 193, 72, 79, 79, 85, 128, 72, 79, 79, 82, 85, 128, 72, + 79, 79, 80, 128, 72, 79, 79, 78, 128, 72, 79, 79, 75, 69, 68, 128, 72, + 79, 79, 75, 69, 196, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79, 78, 69, + 217, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, 84, 72, + 69, 84, 73, 195, 72, 79, 76, 79, 128, 72, 79, 76, 76, 79, 215, 72, 79, + 76, 69, 128, 72, 79, 76, 68, 73, 78, 199, 72, 79, 76, 65, 77, 128, 72, + 79, 76, 65, 205, 72, 79, 75, 65, 128, 72, 79, 67, 75, 69, 217, 72, 79, + 67, 72, 79, 128, 72, 79, 45, 56, 128, 72, 79, 45, 55, 128, 72, 79, 45, + 54, 128, 72, 79, 45, 53, 128, 72, 79, 45, 52, 128, 72, 79, 45, 51, 128, + 72, 79, 45, 50, 128, 72, 79, 45, 49, 128, 72, 78, 85, 84, 128, 72, 78, + 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 85, 66, 128, 72, 78, 79, + 88, 128, 72, 78, 79, 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, 128, + 72, 78, 73, 84, 128, 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, 72, + 78, 73, 69, 84, 128, 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, 72, + 78, 73, 128, 72, 78, 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, 128, + 72, 78, 65, 88, 128, 72, 78, 65, 85, 128, 72, 78, 65, 84, 128, 72, 78, + 65, 80, 128, 72, 78, 65, 128, 72, 77, 89, 88, 128, 72, 77, 89, 82, 88, + 128, 72, 77, 89, 82, 128, 72, 77, 89, 80, 128, 72, 77, 89, 128, 72, 77, + 85, 88, 128, 72, 77, 85, 84, 128, 72, 77, 85, 82, 88, 128, 72, 77, 85, + 82, 128, 72, 77, 85, 80, 128, 72, 77, 85, 79, 88, 128, 72, 77, 85, 79, + 80, 128, 72, 77, 85, 79, 128, 72, 77, 85, 128, 72, 77, 79, 88, 128, 72, + 77, 79, 84, 128, 72, 77, 79, 80, 128, 72, 77, 79, 128, 72, 77, 73, 88, + 128, 72, 77, 73, 84, 128, 72, 77, 73, 80, 128, 72, 77, 73, 69, 88, 128, + 72, 77, 73, 69, 80, 128, 72, 77, 73, 69, 128, 72, 77, 73, 128, 72, 77, + 69, 128, 72, 77, 65, 88, 128, 72, 77, 65, 84, 128, 72, 77, 65, 80, 128, + 72, 77, 65, 128, 72, 76, 89, 88, 128, 72, 76, 89, 84, 128, 72, 76, 89, + 82, 88, 128, 72, 76, 89, 82, 128, 72, 76, 89, 80, 128, 72, 76, 89, 128, + 72, 76, 85, 88, 128, 72, 76, 85, 84, 128, 72, 76, 85, 82, 88, 128, 72, + 76, 85, 82, 128, 72, 76, 85, 80, 128, 72, 76, 85, 79, 88, 128, 72, 76, + 85, 79, 80, 128, 72, 76, 85, 79, 128, 72, 76, 85, 128, 72, 76, 79, 88, + 128, 72, 76, 79, 80, 128, 72, 76, 79, 128, 72, 76, 73, 88, 128, 72, 76, + 73, 84, 128, 72, 76, 73, 80, 128, 72, 76, 73, 69, 88, 128, 72, 76, 73, + 69, 80, 128, 72, 76, 73, 69, 128, 72, 76, 73, 128, 72, 76, 69, 88, 128, + 72, 76, 69, 80, 128, 72, 76, 69, 128, 72, 76, 65, 88, 128, 72, 76, 65, + 85, 128, 72, 76, 65, 84, 128, 72, 76, 65, 80, 128, 72, 76, 65, 128, 72, + 76, 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 89, 79, 128, 72, 73, + 84, 84, 73, 78, 199, 72, 73, 83, 84, 79, 82, 73, 195, 72, 73, 82, 73, 81, + 128, 72, 73, 80, 80, 79, 80, 79, 84, 65, 77, 85, 83, 128, 72, 73, 78, 71, + 69, 68, 128, 72, 73, 78, 71, 69, 196, 72, 73, 78, 71, 69, 128, 72, 73, + 78, 68, 213, 72, 73, 75, 73, 78, 199, 72, 73, 71, 72, 45, 83, 80, 69, 69, + 196, 72, 73, 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 72, 73, + 71, 72, 45, 76, 79, 215, 72, 73, 71, 72, 45, 72, 69, 69, 76, 69, 196, 72, + 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 83, 73, 79, 83, 128, 72, 73, 69, + 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, 73, 69, 85, 72, 45, 80, 73, 69, + 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, 73, 69, 85, 78, 128, 72, 73, 69, + 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, 73, 69, 85, 200, 72, 73, 69, 82, + 79, 71, 76, 89, 80, 72, 73, 195, 72, 73, 69, 128, 72, 73, 68, 73, 78, 199, 72, 73, 68, 69, 84, 128, 72, 73, 68, 69, 128, 72, 73, 66, 73, 83, 67, 85, 83, 128, 72, 73, 45, 82, 69, 83, 128, 72, 73, 45, 55, 128, 72, 73, 45, 54, 128, 72, 73, 45, 53, 128, 72, 73, 45, 52, 128, 72, 73, 45, @@ -3945,128 +4000,129 @@ static const unsigned char lexicon[] = { 65, 82, 84, 45, 83, 72, 65, 80, 69, 196, 72, 69, 65, 82, 84, 128, 72, 69, 65, 82, 212, 72, 69, 65, 82, 73, 78, 199, 72, 69, 65, 82, 45, 78, 79, 45, 69, 86, 73, 204, 72, 69, 65, 68, 83, 84, 82, 79, 75, 69, 128, 72, 69, 65, - 68, 83, 84, 79, 78, 197, 72, 69, 65, 68, 83, 67, 65, 82, 70, 128, 72, 69, - 65, 68, 80, 72, 79, 78, 69, 128, 72, 69, 65, 68, 73, 78, 71, 128, 72, 69, - 65, 68, 45, 66, 65, 78, 68, 65, 71, 69, 128, 72, 69, 45, 55, 128, 72, 69, - 45, 54, 128, 72, 69, 45, 53, 128, 72, 69, 45, 52, 128, 72, 69, 45, 51, - 128, 72, 69, 45, 50, 128, 72, 69, 45, 49, 128, 72, 68, 82, 128, 72, 67, - 128, 72, 66, 65, 83, 65, 45, 69, 83, 65, 83, 193, 72, 66, 65, 83, 193, - 72, 65, 89, 65, 78, 78, 65, 128, 72, 65, 87, 74, 128, 72, 65, 86, 69, - 128, 72, 65, 85, 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 65, 213, 72, - 65, 84, 82, 65, 206, 72, 65, 84, 72, 73, 128, 72, 65, 84, 69, 128, 72, - 65, 84, 67, 72, 73, 78, 199, 72, 65, 84, 65, 198, 72, 65, 83, 69, 210, - 72, 65, 83, 65, 78, 84, 65, 128, 72, 65, 82, 80, 79, 79, 78, 128, 72, 65, - 82, 80, 79, 79, 206, 72, 65, 82, 77, 79, 78, 73, 67, 128, 72, 65, 82, 75, - 76, 69, 65, 206, 72, 65, 82, 68, 78, 69, 83, 83, 128, 72, 65, 82, 196, - 72, 65, 82, 66, 65, 72, 65, 89, 128, 72, 65, 80, 80, 217, 72, 65, 78, 85, - 78, 79, 207, 72, 65, 78, 73, 70, 201, 72, 65, 78, 71, 90, 72, 79, 213, - 72, 65, 78, 68, 83, 72, 65, 75, 69, 128, 72, 65, 78, 68, 83, 128, 72, 65, - 78, 68, 211, 72, 65, 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69, - 128, 72, 65, 78, 68, 66, 65, 76, 76, 128, 72, 65, 78, 68, 66, 65, 71, - 128, 72, 65, 78, 68, 45, 79, 86, 65, 76, 128, 72, 65, 78, 68, 45, 79, 86, - 65, 204, 72, 65, 78, 68, 45, 72, 79, 79, 75, 128, 72, 65, 78, 68, 45, 72, - 79, 79, 203, 72, 65, 78, 68, 45, 72, 73, 78, 71, 69, 128, 72, 65, 78, 68, - 45, 72, 73, 78, 71, 197, 72, 65, 78, 68, 45, 70, 76, 65, 84, 128, 72, 65, - 78, 68, 45, 70, 76, 65, 212, 72, 65, 78, 68, 45, 70, 73, 83, 84, 128, 72, - 65, 78, 68, 45, 67, 85, 82, 76, 73, 67, 85, 69, 128, 72, 65, 78, 68, 45, - 67, 85, 82, 76, 73, 67, 85, 197, 72, 65, 78, 68, 45, 67, 85, 80, 128, 72, - 65, 78, 68, 45, 67, 85, 208, 72, 65, 78, 68, 45, 67, 76, 65, 87, 128, 72, - 65, 78, 68, 45, 67, 76, 65, 215, 72, 65, 78, 68, 45, 67, 73, 82, 67, 76, - 69, 128, 72, 65, 78, 68, 45, 67, 73, 82, 67, 76, 197, 72, 65, 78, 68, 45, - 65, 78, 71, 76, 69, 128, 72, 65, 78, 68, 45, 65, 78, 71, 76, 197, 72, 65, - 78, 68, 128, 72, 65, 78, 45, 65, 75, 65, 84, 128, 72, 65, 77, 90, 65, - 128, 72, 65, 77, 90, 193, 72, 65, 77, 83, 84, 69, 210, 72, 65, 77, 77, - 69, 82, 128, 72, 65, 77, 77, 69, 210, 72, 65, 77, 66, 85, 82, 71, 69, 82, - 128, 72, 65, 76, 81, 65, 128, 72, 65, 76, 79, 128, 72, 65, 76, 70, 45, - 67, 73, 82, 67, 76, 197, 72, 65, 76, 70, 45, 50, 128, 72, 65, 76, 70, 45, - 49, 128, 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, - 76, 65, 78, 84, 65, 128, 72, 65, 73, 84, 85, 128, 72, 65, 73, 211, 72, - 65, 73, 82, 67, 85, 84, 128, 72, 65, 71, 76, 65, 218, 72, 65, 71, 76, - 128, 72, 65, 70, 85, 75, 72, 65, 128, 72, 65, 70, 85, 75, 72, 128, 72, - 65, 69, 71, 204, 72, 65, 68, 69, 83, 128, 72, 65, 65, 82, 85, 128, 72, - 65, 65, 77, 128, 72, 65, 193, 72, 65, 45, 72, 65, 128, 72, 65, 45, 57, - 128, 72, 65, 45, 56, 128, 72, 65, 45, 55, 128, 72, 65, 45, 54, 128, 72, - 65, 45, 53, 128, 72, 65, 45, 52, 128, 72, 65, 45, 51, 128, 72, 65, 45, - 50, 128, 72, 65, 45, 49, 49, 128, 72, 65, 45, 49, 48, 128, 72, 65, 45, - 49, 128, 72, 48, 48, 56, 128, 72, 48, 48, 55, 128, 72, 48, 48, 54, 65, - 128, 72, 48, 48, 54, 128, 72, 48, 48, 53, 128, 72, 48, 48, 52, 128, 72, - 48, 48, 51, 128, 72, 48, 48, 50, 128, 72, 48, 48, 49, 128, 72, 45, 84, - 89, 80, 197, 71, 89, 85, 128, 71, 89, 79, 78, 128, 71, 89, 79, 128, 71, - 89, 73, 128, 71, 89, 70, 213, 71, 89, 69, 69, 128, 71, 89, 65, 83, 128, - 71, 89, 65, 65, 128, 71, 89, 65, 128, 71, 89, 128, 71, 87, 85, 128, 71, - 87, 73, 128, 71, 87, 69, 69, 128, 71, 87, 69, 128, 71, 87, 65, 65, 128, - 71, 87, 65, 128, 71, 86, 65, 78, 71, 128, 71, 86, 128, 71, 85, 82, 85, - 83, 72, 128, 71, 85, 82, 85, 78, 128, 71, 85, 82, 77, 85, 75, 72, 201, - 71, 85, 82, 65, 77, 85, 84, 79, 78, 128, 71, 85, 82, 55, 128, 71, 85, 78, - 85, 128, 71, 85, 78, 213, 71, 85, 78, 74, 65, 76, 193, 71, 85, 205, 71, - 85, 76, 128, 71, 85, 74, 65, 82, 65, 84, 201, 71, 85, 73, 84, 65, 82, - 128, 71, 85, 73, 68, 197, 71, 85, 199, 71, 85, 69, 73, 128, 71, 85, 69, - 72, 128, 71, 85, 69, 200, 71, 85, 68, 128, 71, 85, 196, 71, 85, 65, 82, - 68, 83, 77, 65, 78, 128, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, 128, - 71, 85, 65, 82, 68, 69, 196, 71, 85, 65, 82, 68, 128, 71, 85, 65, 82, 65, - 78, 201, 71, 85, 193, 71, 85, 178, 71, 84, 69, 210, 71, 83, 85, 77, 128, - 71, 83, 85, 205, 71, 82, 213, 71, 82, 79, 87, 73, 78, 199, 71, 82, 79, - 85, 78, 68, 128, 71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84, 65, 128, 71, - 82, 73, 78, 78, 73, 78, 199, 71, 82, 73, 77, 65, 67, 73, 78, 199, 71, 82, - 69, 71, 79, 82, 73, 65, 206, 71, 82, 69, 69, 78, 128, 71, 82, 69, 69, - 206, 71, 82, 69, 65, 84, 78, 69, 83, 83, 128, 71, 82, 69, 65, 84, 69, 82, - 45, 84, 72, 65, 78, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 206, - 71, 82, 69, 65, 84, 69, 210, 71, 82, 69, 65, 212, 71, 82, 65, 86, 69, 89, - 65, 82, 196, 71, 82, 65, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 71, 82, - 65, 86, 69, 45, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, 128, 71, 82, - 65, 86, 197, 71, 82, 65, 84, 69, 82, 128, 71, 82, 65, 83, 83, 128, 71, - 82, 65, 83, 211, 71, 82, 65, 83, 208, 71, 82, 65, 80, 72, 69, 77, 197, - 71, 82, 65, 80, 69, 83, 128, 71, 82, 65, 78, 84, 72, 193, 71, 82, 65, 77, - 77, 193, 71, 82, 65, 73, 78, 128, 71, 82, 65, 68, 85, 65, 84, 73, 79, - 206, 71, 82, 65, 68, 85, 65, 76, 128, 71, 82, 65, 67, 69, 128, 71, 82, - 65, 67, 197, 71, 80, 65, 128, 71, 79, 82, 84, 72, 77, 73, 75, 79, 206, - 71, 79, 82, 84, 128, 71, 79, 82, 73, 76, 76, 65, 128, 71, 79, 82, 71, 79, - 84, 69, 82, 73, 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, - 78, 128, 71, 79, 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, 82, - 65, 128, 71, 79, 79, 196, 71, 79, 78, 71, 128, 71, 79, 76, 70, 69, 82, - 128, 71, 79, 76, 68, 128, 71, 79, 75, 128, 71, 79, 73, 78, 199, 71, 79, - 71, 71, 76, 69, 83, 128, 71, 79, 66, 76, 73, 78, 128, 71, 79, 65, 76, - 128, 71, 79, 65, 204, 71, 79, 65, 128, 71, 78, 89, 73, 83, 128, 71, 78, - 65, 86, 73, 89, 65, 78, 73, 128, 71, 76, 79, 87, 73, 78, 199, 71, 76, 79, - 86, 69, 83, 128, 71, 76, 79, 86, 69, 128, 71, 76, 79, 84, 84, 65, 204, - 71, 76, 79, 66, 197, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71, 76, 69, 73, - 67, 200, 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128, 71, 74, 69, - 128, 71, 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128, 71, 73, 83, - 200, 71, 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 73, - 82, 76, 211, 71, 73, 82, 76, 128, 71, 73, 82, 65, 70, 70, 197, 71, 73, - 82, 51, 128, 71, 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, 82, 178, 71, - 73, 80, 128, 71, 73, 78, 73, 73, 128, 71, 73, 77, 69, 76, 128, 71, 73, - 77, 69, 204, 71, 73, 77, 128, 71, 73, 71, 65, 128, 71, 73, 71, 128, 71, - 73, 70, 212, 71, 73, 69, 84, 128, 71, 73, 68, 73, 77, 128, 71, 73, 66, - 66, 79, 85, 211, 71, 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71, - 72, 90, 128, 71, 72, 87, 65, 128, 71, 72, 85, 78, 78, 65, 128, 71, 72, - 85, 78, 78, 193, 71, 72, 85, 128, 71, 72, 79, 85, 128, 71, 72, 79, 83, - 84, 128, 71, 72, 79, 128, 71, 72, 73, 77, 69, 76, 128, 71, 72, 73, 128, - 71, 72, 72, 65, 128, 71, 72, 69, 89, 83, 128, 71, 72, 69, 85, 88, 128, - 71, 72, 69, 85, 78, 128, 71, 72, 69, 85, 71, 72, 69, 85, 65, 69, 77, 128, - 71, 72, 69, 85, 71, 72, 69, 78, 128, 71, 72, 69, 85, 65, 69, 82, 65, 69, - 128, 71, 72, 69, 85, 65, 69, 71, 72, 69, 85, 65, 69, 128, 71, 72, 69, 84, - 128, 71, 72, 69, 69, 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, - 78, 128, 71, 72, 65, 82, 65, 69, 128, 71, 72, 65, 80, 128, 71, 72, 65, - 78, 128, 71, 72, 65, 77, 77, 65, 128, 71, 72, 65, 77, 65, 76, 128, 71, - 72, 65, 73, 78, 85, 128, 71, 72, 65, 73, 78, 128, 71, 72, 65, 73, 206, - 71, 72, 65, 68, 128, 71, 72, 65, 65, 77, 65, 69, 128, 71, 72, 65, 65, - 128, 71, 71, 87, 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, 87, 69, 128, - 71, 71, 87, 65, 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, 88, 128, 71, - 71, 85, 84, 128, 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, 128, 71, 71, - 85, 79, 88, 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 80, 128, 71, - 71, 85, 79, 128, 71, 71, 79, 88, 128, 71, 71, 79, 84, 128, 71, 71, 79, - 80, 128, 71, 71, 73, 88, 128, 71, 71, 73, 84, 128, 71, 71, 73, 69, 88, - 128, 71, 71, 73, 69, 80, 128, 71, 71, 73, 69, 128, 71, 71, 69, 88, 128, - 71, 71, 69, 84, 128, 71, 71, 69, 80, 128, 71, 71, 65, 88, 128, 71, 71, - 65, 84, 128, 71, 69, 84, 193, 71, 69, 83, 84, 85, 82, 69, 128, 71, 69, - 83, 72, 85, 128, 71, 69, 83, 72, 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, - 206, 71, 69, 83, 72, 50, 128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, - 71, 69, 82, 77, 65, 206, 71, 69, 82, 69, 83, 72, 128, 71, 69, 82, 69, 83, - 200, 71, 69, 79, 77, 69, 84, 82, 73, 67, 65, 76, 76, 217, 71, 69, 79, 77, - 69, 84, 82, 73, 195, 71, 69, 78, 84, 76, 197, 71, 69, 78, 73, 84, 73, 86, - 69, 128, 71, 69, 78, 73, 75, 201, 71, 69, 78, 73, 69, 128, 71, 69, 78, - 69, 82, 73, 195, 71, 69, 78, 69, 82, 65, 76, 128, 71, 69, 77, 73, 78, 73, + 68, 83, 84, 79, 78, 69, 128, 72, 69, 65, 68, 83, 84, 79, 78, 197, 72, 69, + 65, 68, 83, 67, 65, 82, 70, 128, 72, 69, 65, 68, 80, 72, 79, 78, 69, 128, + 72, 69, 65, 68, 73, 78, 71, 128, 72, 69, 65, 68, 45, 66, 65, 78, 68, 65, + 71, 69, 128, 72, 69, 45, 55, 128, 72, 69, 45, 54, 128, 72, 69, 45, 53, + 128, 72, 69, 45, 52, 128, 72, 69, 45, 51, 128, 72, 69, 45, 50, 128, 72, + 69, 45, 49, 128, 72, 68, 82, 128, 72, 67, 128, 72, 66, 65, 83, 65, 45, + 69, 83, 65, 83, 193, 72, 66, 65, 83, 193, 72, 65, 89, 65, 78, 78, 65, + 128, 72, 65, 87, 74, 128, 72, 65, 86, 69, 128, 72, 65, 85, 80, 84, 83, + 84, 73, 77, 77, 69, 128, 72, 65, 213, 72, 65, 84, 82, 65, 206, 72, 65, + 84, 72, 73, 128, 72, 65, 84, 69, 128, 72, 65, 84, 67, 72, 73, 78, 199, + 72, 65, 84, 65, 198, 72, 65, 83, 69, 210, 72, 65, 83, 65, 78, 84, 65, + 128, 72, 65, 82, 80, 79, 79, 78, 128, 72, 65, 82, 80, 79, 79, 206, 72, + 65, 82, 77, 79, 78, 73, 67, 128, 72, 65, 82, 75, 76, 69, 65, 206, 72, 65, + 82, 68, 78, 69, 83, 83, 128, 72, 65, 82, 196, 72, 65, 82, 66, 65, 72, 65, + 89, 128, 72, 65, 80, 80, 217, 72, 65, 78, 85, 78, 79, 207, 72, 65, 78, + 73, 70, 201, 72, 65, 78, 71, 90, 72, 79, 213, 72, 65, 78, 68, 83, 72, 65, + 75, 69, 128, 72, 65, 78, 68, 83, 128, 72, 65, 78, 68, 211, 72, 65, 78, + 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69, 128, 72, 65, 78, 68, 66, 65, + 76, 76, 128, 72, 65, 78, 68, 66, 65, 71, 128, 72, 65, 78, 68, 45, 79, 86, + 65, 76, 128, 72, 65, 78, 68, 45, 79, 86, 65, 204, 72, 65, 78, 68, 45, 72, + 79, 79, 75, 128, 72, 65, 78, 68, 45, 72, 79, 79, 203, 72, 65, 78, 68, 45, + 72, 73, 78, 71, 69, 128, 72, 65, 78, 68, 45, 72, 73, 78, 71, 197, 72, 65, + 78, 68, 45, 70, 76, 65, 84, 128, 72, 65, 78, 68, 45, 70, 76, 65, 212, 72, + 65, 78, 68, 45, 70, 73, 83, 84, 128, 72, 65, 78, 68, 45, 67, 85, 82, 76, + 73, 67, 85, 69, 128, 72, 65, 78, 68, 45, 67, 85, 82, 76, 73, 67, 85, 197, + 72, 65, 78, 68, 45, 67, 85, 80, 128, 72, 65, 78, 68, 45, 67, 85, 208, 72, + 65, 78, 68, 45, 67, 76, 65, 87, 128, 72, 65, 78, 68, 45, 67, 76, 65, 215, + 72, 65, 78, 68, 45, 67, 73, 82, 67, 76, 69, 128, 72, 65, 78, 68, 45, 67, + 73, 82, 67, 76, 197, 72, 65, 78, 68, 45, 65, 78, 71, 76, 69, 128, 72, 65, + 78, 68, 45, 65, 78, 71, 76, 197, 72, 65, 78, 68, 128, 72, 65, 78, 45, 65, + 75, 65, 84, 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 90, 193, 72, 65, + 77, 83, 84, 69, 210, 72, 65, 77, 77, 69, 82, 128, 72, 65, 77, 77, 69, + 210, 72, 65, 77, 66, 85, 82, 71, 69, 82, 128, 72, 65, 76, 81, 65, 128, + 72, 65, 76, 79, 128, 72, 65, 76, 70, 45, 67, 73, 82, 67, 76, 197, 72, 65, + 76, 70, 45, 50, 128, 72, 65, 76, 70, 45, 49, 128, 72, 65, 76, 70, 128, + 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, 76, 65, 78, 84, 65, 128, 72, 65, + 73, 84, 85, 128, 72, 65, 73, 211, 72, 65, 73, 82, 67, 85, 84, 128, 72, + 65, 71, 76, 65, 218, 72, 65, 71, 76, 128, 72, 65, 70, 85, 75, 72, 65, + 128, 72, 65, 70, 85, 75, 72, 128, 72, 65, 69, 71, 204, 72, 65, 68, 69, + 83, 128, 72, 65, 65, 82, 85, 128, 72, 65, 65, 77, 128, 72, 65, 193, 72, + 65, 45, 72, 65, 128, 72, 65, 45, 57, 128, 72, 65, 45, 56, 128, 72, 65, + 45, 55, 128, 72, 65, 45, 54, 128, 72, 65, 45, 53, 128, 72, 65, 45, 52, + 128, 72, 65, 45, 51, 128, 72, 65, 45, 50, 128, 72, 65, 45, 49, 49, 128, + 72, 65, 45, 49, 48, 128, 72, 65, 45, 49, 128, 72, 48, 48, 56, 128, 72, + 48, 48, 55, 128, 72, 48, 48, 54, 65, 128, 72, 48, 48, 54, 128, 72, 48, + 48, 53, 128, 72, 48, 48, 52, 128, 72, 48, 48, 51, 128, 72, 48, 48, 50, + 128, 72, 48, 48, 49, 128, 72, 45, 84, 89, 80, 197, 71, 89, 85, 128, 71, + 89, 79, 78, 128, 71, 89, 79, 128, 71, 89, 73, 128, 71, 89, 70, 213, 71, + 89, 69, 69, 128, 71, 89, 65, 83, 128, 71, 89, 65, 65, 128, 71, 89, 65, + 128, 71, 89, 128, 71, 87, 85, 128, 71, 87, 73, 128, 71, 87, 69, 69, 128, + 71, 87, 69, 128, 71, 87, 65, 65, 128, 71, 87, 65, 128, 71, 87, 128, 71, + 86, 65, 78, 71, 128, 71, 86, 128, 71, 85, 82, 85, 83, 72, 128, 71, 85, + 82, 85, 78, 128, 71, 85, 82, 77, 85, 75, 72, 201, 71, 85, 82, 65, 77, 85, + 84, 79, 78, 128, 71, 85, 82, 55, 128, 71, 85, 78, 85, 128, 71, 85, 78, + 213, 71, 85, 78, 74, 65, 76, 193, 71, 85, 205, 71, 85, 76, 128, 71, 85, + 74, 65, 82, 65, 84, 201, 71, 85, 73, 84, 65, 82, 128, 71, 85, 73, 68, + 197, 71, 85, 199, 71, 85, 69, 73, 128, 71, 85, 69, 72, 128, 71, 85, 69, + 200, 71, 85, 68, 128, 71, 85, 196, 71, 85, 65, 82, 68, 83, 77, 65, 78, + 128, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, 128, 71, 85, 65, 82, 68, + 69, 196, 71, 85, 65, 82, 68, 128, 71, 85, 65, 82, 65, 78, 201, 71, 85, + 193, 71, 85, 178, 71, 84, 69, 210, 71, 83, 85, 77, 128, 71, 83, 85, 205, + 71, 82, 213, 71, 82, 79, 87, 73, 78, 199, 71, 82, 79, 85, 78, 68, 128, + 71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84, 65, 128, 71, 82, 73, 78, 78, + 73, 78, 199, 71, 82, 73, 77, 65, 67, 73, 78, 199, 71, 82, 69, 71, 79, 82, + 73, 65, 206, 71, 82, 69, 69, 78, 128, 71, 82, 69, 69, 206, 71, 82, 69, + 65, 84, 78, 69, 83, 83, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, + 78, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 206, 71, 82, 69, 65, + 84, 69, 210, 71, 82, 69, 65, 212, 71, 82, 65, 86, 69, 89, 65, 82, 196, + 71, 82, 65, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 71, 82, 65, 86, 69, + 45, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, 128, 71, 82, 65, 86, 197, + 71, 82, 65, 84, 69, 82, 128, 71, 82, 65, 83, 83, 128, 71, 82, 65, 83, + 211, 71, 82, 65, 83, 208, 71, 82, 65, 80, 72, 69, 77, 197, 71, 82, 65, + 80, 69, 83, 128, 71, 82, 65, 78, 84, 72, 193, 71, 82, 65, 77, 77, 193, + 71, 82, 65, 73, 78, 128, 71, 82, 65, 68, 85, 65, 84, 73, 79, 206, 71, 82, + 65, 68, 85, 65, 76, 128, 71, 82, 65, 67, 69, 128, 71, 82, 65, 67, 197, + 71, 80, 65, 128, 71, 79, 82, 84, 72, 77, 73, 75, 79, 206, 71, 79, 82, 84, + 128, 71, 79, 82, 73, 76, 76, 65, 128, 71, 79, 82, 71, 79, 84, 69, 82, 73, + 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, 71, 79, + 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, 82, 65, 128, 71, 79, + 79, 196, 71, 79, 78, 71, 128, 71, 79, 76, 70, 69, 82, 128, 71, 79, 76, + 68, 128, 71, 79, 75, 128, 71, 79, 73, 78, 199, 71, 79, 71, 71, 76, 69, + 83, 128, 71, 79, 66, 76, 73, 78, 128, 71, 79, 65, 76, 128, 71, 79, 65, + 204, 71, 79, 65, 128, 71, 78, 89, 73, 83, 128, 71, 78, 65, 86, 73, 89, + 65, 78, 73, 128, 71, 76, 79, 87, 73, 78, 199, 71, 76, 79, 86, 69, 83, + 128, 71, 76, 79, 86, 69, 128, 71, 76, 79, 84, 84, 65, 204, 71, 76, 79, + 66, 197, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71, 76, 69, 73, 67, 200, + 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128, 71, 74, 69, 128, 71, + 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128, 71, 73, 83, 200, 71, + 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 73, 82, 76, + 211, 71, 73, 82, 76, 128, 71, 73, 82, 65, 70, 70, 197, 71, 73, 82, 51, + 128, 71, 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, 82, 178, 71, 73, 80, + 128, 71, 73, 78, 73, 73, 128, 71, 73, 77, 69, 76, 128, 71, 73, 77, 69, + 204, 71, 73, 77, 128, 71, 73, 71, 65, 128, 71, 73, 71, 128, 71, 73, 70, + 212, 71, 73, 69, 84, 128, 71, 73, 68, 73, 77, 128, 71, 73, 66, 66, 79, + 85, 211, 71, 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71, 72, 90, + 128, 71, 72, 87, 65, 128, 71, 72, 85, 78, 78, 65, 128, 71, 72, 85, 78, + 78, 193, 71, 72, 85, 128, 71, 72, 79, 85, 128, 71, 72, 79, 83, 84, 128, + 71, 72, 79, 128, 71, 72, 73, 77, 69, 76, 128, 71, 72, 73, 128, 71, 72, + 72, 65, 128, 71, 72, 69, 89, 83, 128, 71, 72, 69, 85, 88, 128, 71, 72, + 69, 85, 78, 128, 71, 72, 69, 85, 71, 72, 69, 85, 65, 69, 77, 128, 71, 72, + 69, 85, 71, 72, 69, 78, 128, 71, 72, 69, 85, 65, 69, 82, 65, 69, 128, 71, + 72, 69, 85, 65, 69, 71, 72, 69, 85, 65, 69, 128, 71, 72, 69, 84, 128, 71, + 72, 69, 69, 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, 78, 128, + 71, 72, 65, 82, 65, 69, 128, 71, 72, 65, 80, 128, 71, 72, 65, 78, 128, + 71, 72, 65, 77, 77, 65, 128, 71, 72, 65, 77, 65, 76, 128, 71, 72, 65, 73, + 78, 85, 128, 71, 72, 65, 73, 78, 128, 71, 72, 65, 73, 206, 71, 72, 65, + 68, 128, 71, 72, 65, 65, 77, 65, 69, 128, 71, 72, 65, 65, 128, 71, 71, + 87, 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, 87, 69, 128, 71, 71, 87, + 65, 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, 88, 128, 71, 71, 85, 84, + 128, 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, 128, 71, 71, 85, 79, 88, + 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 80, 128, 71, 71, 85, 79, + 128, 71, 71, 79, 88, 128, 71, 71, 79, 84, 128, 71, 71, 79, 80, 128, 71, + 71, 73, 88, 128, 71, 71, 73, 84, 128, 71, 71, 73, 69, 88, 128, 71, 71, + 73, 69, 80, 128, 71, 71, 73, 69, 128, 71, 71, 69, 88, 128, 71, 71, 69, + 84, 128, 71, 71, 69, 80, 128, 71, 71, 65, 88, 128, 71, 71, 65, 84, 128, + 71, 69, 84, 193, 71, 69, 83, 84, 85, 82, 69, 128, 71, 69, 83, 72, 85, + 128, 71, 69, 83, 72, 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, 206, 71, + 69, 83, 72, 50, 128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, 71, 69, 82, + 77, 65, 206, 71, 69, 82, 69, 83, 72, 128, 71, 69, 82, 69, 83, 200, 71, + 69, 79, 77, 69, 84, 82, 73, 67, 65, 76, 76, 217, 71, 69, 79, 77, 69, 84, + 82, 73, 195, 71, 69, 78, 84, 76, 197, 71, 69, 78, 73, 84, 73, 86, 69, + 128, 71, 69, 78, 73, 75, 201, 71, 69, 78, 73, 69, 128, 71, 69, 78, 69, + 82, 73, 195, 71, 69, 78, 69, 82, 65, 76, 128, 71, 69, 77, 73, 78, 73, 128, 71, 69, 77, 73, 78, 65, 84, 73, 79, 206, 71, 69, 77, 73, 78, 65, 84, 197, 71, 69, 205, 71, 69, 69, 77, 128, 71, 69, 68, 79, 76, 65, 128, 71, 69, 68, 69, 128, 71, 69, 66, 207, 71, 69, 66, 193, 71, 69, 65, 82, 128, @@ -4125,12 +4181,13 @@ static const unsigned char lexicon[] = { 128, 70, 82, 69, 78, 67, 200, 70, 82, 69, 69, 90, 73, 78, 199, 70, 82, 69, 69, 128, 70, 82, 69, 197, 70, 82, 65, 78, 75, 211, 70, 82, 65, 78, 195, 70, 82, 65, 77, 69, 83, 128, 70, 82, 65, 77, 69, 128, 70, 82, 65, - 77, 197, 70, 82, 65, 71, 82, 65, 78, 84, 128, 70, 82, 65, 71, 77, 69, 78, - 84, 128, 70, 79, 88, 128, 70, 79, 216, 70, 79, 85, 82, 84, 69, 69, 78, - 128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, 85, 82, 45, 84, 72, 73, 82, - 84, 89, 128, 70, 79, 85, 82, 45, 83, 84, 82, 73, 78, 199, 70, 79, 85, 82, - 45, 80, 69, 82, 45, 69, 205, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, 79, - 85, 210, 70, 79, 85, 78, 84, 65, 73, 78, 128, 70, 79, 85, 78, 84, 65, 73, + 77, 197, 70, 82, 65, 75, 84, 85, 210, 70, 82, 65, 71, 82, 65, 78, 84, + 128, 70, 82, 65, 71, 77, 69, 78, 84, 128, 70, 82, 65, 67, 84, 73, 79, + 206, 70, 79, 88, 128, 70, 79, 216, 70, 79, 85, 82, 84, 69, 69, 78, 128, + 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, 85, 82, 45, 84, 72, 73, 82, 84, + 89, 128, 70, 79, 85, 82, 45, 83, 84, 82, 73, 78, 199, 70, 79, 85, 82, 45, + 80, 69, 82, 45, 69, 205, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, 79, 85, + 210, 70, 79, 85, 78, 84, 65, 73, 78, 128, 70, 79, 85, 78, 84, 65, 73, 206, 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 79, 82, 87, 65, 82, 68, 128, 70, 79, 82, 87, 65, 82, 196, 70, 79, 82, 84, 89, 45, 70, 73, 86, 197, 70, 79, 82, 84, 89, 128, 70, 79, 82, 84, 217, 70, 79, 82, 84, 85, @@ -4143,163 +4200,165 @@ static const unsigned char lexicon[] = { 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, 84, 66, 65, 76, 76, 128, 70, 79, 79, 84, 128, 70, 79, 79, 76, 128, 70, 79, 79, 68, 128, 70, 79, 79, 128, 70, 79, 78, 212, 70, 79, 78, 71, 77, 65, 78, 128, 70, 79, - 77, 128, 70, 79, 76, 76, 89, 128, 70, 79, 76, 76, 79, 87, 73, 78, 71, - 128, 70, 79, 76, 68, 69, 82, 128, 70, 79, 76, 68, 69, 196, 70, 79, 71, - 71, 89, 128, 70, 79, 71, 128, 70, 207, 70, 77, 128, 70, 76, 89, 73, 78, - 199, 70, 76, 89, 128, 70, 76, 85, 84, 84, 69, 82, 73, 78, 71, 128, 70, - 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, 85, 84, 69, 128, 70, 76, 85, - 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, 199, 70, 76, 79, 87, 69, 82, 83, - 128, 70, 76, 79, 87, 69, 210, 70, 76, 79, 85, 82, 73, 83, 72, 128, 70, - 76, 79, 82, 69, 84, 84, 69, 128, 70, 76, 79, 82, 65, 204, 70, 76, 79, 80, - 80, 217, 70, 76, 79, 79, 82, 128, 70, 76, 79, 79, 210, 70, 76, 73, 80, - 128, 70, 76, 73, 71, 72, 84, 128, 70, 76, 73, 67, 203, 70, 76, 69, 88, - 85, 83, 128, 70, 76, 69, 88, 69, 196, 70, 76, 69, 88, 128, 70, 76, 69, - 85, 82, 79, 78, 128, 70, 76, 69, 85, 82, 45, 68, 69, 45, 76, 73, 83, 128, - 70, 76, 65, 84, 84, 69, 78, 69, 196, 70, 76, 65, 84, 78, 69, 83, 83, 128, - 70, 76, 65, 84, 66, 82, 69, 65, 68, 128, 70, 76, 65, 83, 72, 128, 70, 76, - 65, 77, 73, 78, 71, 79, 128, 70, 76, 65, 77, 69, 128, 70, 76, 65, 71, 83, - 128, 70, 76, 65, 71, 45, 53, 128, 70, 76, 65, 71, 45, 52, 128, 70, 76, - 65, 71, 45, 51, 128, 70, 76, 65, 71, 45, 50, 128, 70, 76, 65, 71, 45, 49, - 128, 70, 76, 65, 71, 128, 70, 76, 65, 199, 70, 76, 65, 128, 70, 76, 128, - 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 70, 73, 88, 128, 70, 73, 86, 69, - 45, 84, 72, 73, 82, 84, 89, 128, 70, 73, 86, 69, 45, 76, 73, 78, 197, 70, - 73, 84, 90, 80, 65, 84, 82, 73, 67, 203, 70, 73, 84, 65, 128, 70, 73, 84, - 128, 70, 73, 83, 84, 69, 196, 70, 73, 83, 72, 73, 78, 199, 70, 73, 83, - 72, 72, 79, 79, 75, 128, 70, 73, 83, 72, 72, 79, 79, 203, 70, 73, 83, 72, - 69, 89, 69, 128, 70, 73, 83, 72, 128, 70, 73, 83, 200, 70, 73, 82, 83, - 212, 70, 73, 82, 73, 128, 70, 73, 82, 69, 87, 79, 82, 75, 83, 128, 70, - 73, 82, 69, 87, 79, 82, 203, 70, 73, 82, 69, 67, 82, 65, 67, 75, 69, 82, - 128, 70, 73, 82, 69, 128, 70, 73, 82, 197, 70, 73, 80, 128, 70, 73, 78, - 73, 84, 197, 70, 73, 78, 71, 69, 82, 83, 128, 70, 73, 78, 71, 69, 82, - 211, 70, 73, 78, 71, 69, 82, 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, 69, - 82, 69, 196, 70, 73, 78, 71, 69, 82, 45, 80, 79, 83, 212, 70, 73, 78, 71, - 69, 82, 128, 70, 73, 78, 71, 69, 210, 70, 73, 78, 65, 78, 67, 73, 65, 76, - 128, 70, 73, 78, 65, 76, 128, 70, 73, 76, 205, 70, 73, 76, 76, 69, 82, - 45, 50, 128, 70, 73, 76, 76, 69, 82, 45, 49, 128, 70, 73, 76, 76, 69, 82, - 128, 70, 73, 76, 76, 69, 196, 70, 73, 76, 76, 128, 70, 73, 76, 204, 70, - 73, 76, 197, 70, 73, 73, 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, - 73, 71, 85, 82, 69, 45, 50, 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, - 73, 71, 85, 82, 197, 70, 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, - 70, 73, 70, 84, 217, 70, 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, - 128, 70, 73, 70, 84, 69, 69, 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, - 73, 69, 76, 68, 128, 70, 73, 69, 76, 196, 70, 72, 84, 79, 82, 193, 70, - 70, 76, 128, 70, 70, 73, 128, 70, 69, 85, 88, 128, 70, 69, 85, 70, 69, - 85, 65, 69, 84, 128, 70, 69, 84, 72, 128, 70, 69, 83, 84, 73, 86, 65, 76, - 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, 82, 73, 211, 70, 69, 82, 77, - 65, 84, 65, 128, 70, 69, 82, 77, 65, 84, 193, 70, 69, 79, 200, 70, 69, - 78, 199, 70, 69, 78, 67, 69, 82, 128, 70, 69, 78, 67, 69, 128, 70, 69, - 77, 73, 78, 73, 78, 197, 70, 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, - 197, 70, 69, 76, 76, 79, 87, 83, 72, 73, 80, 128, 70, 69, 73, 128, 70, - 69, 72, 213, 70, 69, 72, 128, 70, 69, 200, 70, 69, 69, 78, 71, 128, 70, - 69, 69, 77, 128, 70, 69, 69, 68, 128, 70, 69, 69, 196, 70, 69, 69, 128, - 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, 69, 65, 84, 72, 69, 82, 128, 70, - 69, 65, 84, 72, 69, 210, 70, 69, 65, 82, 78, 128, 70, 69, 65, 82, 70, 85, - 204, 70, 69, 65, 82, 128, 70, 65, 89, 65, 78, 78, 65, 128, 70, 65, 89, - 128, 70, 65, 88, 128, 70, 65, 216, 70, 65, 84, 73, 71, 85, 69, 128, 70, - 65, 84, 72, 69, 82, 128, 70, 65, 84, 72, 69, 210, 70, 65, 84, 72, 65, 84, - 65, 78, 128, 70, 65, 84, 72, 65, 84, 65, 206, 70, 65, 84, 72, 65, 128, - 70, 65, 84, 72, 193, 70, 65, 84, 128, 70, 65, 83, 84, 128, 70, 65, 82, - 83, 201, 70, 65, 82, 128, 70, 65, 81, 128, 70, 65, 80, 128, 70, 65, 78, - 71, 128, 70, 65, 78, 69, 82, 79, 83, 73, 211, 70, 65, 78, 128, 70, 65, - 77, 73, 76, 89, 128, 70, 65, 77, 128, 70, 65, 76, 76, 69, 206, 70, 65, - 76, 65, 70, 69, 76, 128, 70, 65, 74, 128, 70, 65, 73, 82, 89, 128, 70, - 65, 73, 76, 85, 82, 69, 128, 70, 65, 73, 72, 85, 128, 70, 65, 73, 66, - 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, 128, 70, 65, 67, 84, 79, 82, - 89, 128, 70, 65, 67, 84, 79, 210, 70, 65, 67, 83, 73, 77, 73, 76, 197, - 70, 65, 67, 73, 78, 71, 83, 128, 70, 65, 67, 69, 45, 54, 128, 70, 65, 67, - 69, 45, 53, 128, 70, 65, 67, 69, 45, 52, 128, 70, 65, 67, 69, 45, 51, - 128, 70, 65, 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 49, 128, 70, 65, - 65, 77, 65, 69, 128, 70, 65, 65, 73, 128, 70, 65, 65, 70, 85, 128, 70, - 48, 53, 51, 128, 70, 48, 53, 50, 128, 70, 48, 53, 49, 67, 128, 70, 48, - 53, 49, 66, 128, 70, 48, 53, 49, 65, 128, 70, 48, 53, 49, 128, 70, 48, - 53, 48, 128, 70, 48, 52, 57, 128, 70, 48, 52, 56, 128, 70, 48, 52, 55, - 65, 128, 70, 48, 52, 55, 128, 70, 48, 52, 54, 65, 128, 70, 48, 52, 54, - 128, 70, 48, 52, 53, 65, 128, 70, 48, 52, 53, 128, 70, 48, 52, 52, 128, - 70, 48, 52, 51, 128, 70, 48, 52, 50, 128, 70, 48, 52, 49, 128, 70, 48, - 52, 48, 128, 70, 48, 51, 57, 128, 70, 48, 51, 56, 65, 128, 70, 48, 51, - 56, 128, 70, 48, 51, 55, 65, 128, 70, 48, 51, 55, 128, 70, 48, 51, 54, - 128, 70, 48, 51, 53, 128, 70, 48, 51, 52, 128, 70, 48, 51, 51, 128, 70, - 48, 51, 50, 128, 70, 48, 51, 49, 65, 128, 70, 48, 51, 49, 128, 70, 48, - 51, 48, 128, 70, 48, 50, 57, 128, 70, 48, 50, 56, 128, 70, 48, 50, 55, - 128, 70, 48, 50, 54, 128, 70, 48, 50, 53, 128, 70, 48, 50, 52, 128, 70, - 48, 50, 51, 128, 70, 48, 50, 50, 128, 70, 48, 50, 49, 65, 128, 70, 48, - 50, 49, 128, 70, 48, 50, 48, 128, 70, 48, 49, 57, 128, 70, 48, 49, 56, - 128, 70, 48, 49, 55, 128, 70, 48, 49, 54, 128, 70, 48, 49, 53, 128, 70, - 48, 49, 52, 128, 70, 48, 49, 51, 65, 128, 70, 48, 49, 51, 128, 70, 48, - 49, 50, 128, 70, 48, 49, 49, 128, 70, 48, 49, 48, 128, 70, 48, 48, 57, - 128, 70, 48, 48, 56, 128, 70, 48, 48, 55, 128, 70, 48, 48, 54, 128, 70, - 48, 48, 53, 128, 70, 48, 48, 52, 128, 70, 48, 48, 51, 128, 70, 48, 48, - 50, 128, 70, 48, 48, 49, 65, 128, 70, 48, 48, 49, 128, 69, 90, 83, 128, - 69, 90, 200, 69, 90, 69, 78, 128, 69, 90, 69, 206, 69, 90, 128, 69, 89, - 89, 89, 128, 69, 89, 69, 83, 128, 69, 89, 69, 211, 69, 89, 69, 76, 65, - 83, 72, 69, 211, 69, 89, 69, 71, 76, 65, 83, 83, 69, 83, 128, 69, 89, 69, - 71, 65, 90, 69, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 69, 89, 69, 71, - 65, 90, 69, 45, 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 69, 89, 69, 66, - 82, 79, 87, 211, 69, 89, 69, 66, 82, 79, 215, 69, 89, 197, 69, 89, 66, - 69, 89, 70, 73, 76, 73, 128, 69, 89, 65, 78, 78, 65, 128, 69, 88, 84, 82, - 69, 77, 69, 76, 217, 69, 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, 84, 82, - 73, 65, 204, 69, 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, 65, 45, - 72, 73, 71, 200, 69, 88, 84, 82, 193, 69, 88, 84, 73, 78, 71, 85, 73, 83, - 72, 69, 82, 128, 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, 84, 69, - 78, 68, 69, 68, 128, 69, 88, 84, 69, 78, 68, 69, 196, 69, 88, 80, 82, 69, - 83, 83, 73, 79, 78, 76, 69, 83, 211, 69, 88, 80, 79, 78, 69, 78, 212, 69, - 88, 80, 76, 79, 68, 73, 78, 199, 69, 88, 79, 128, 69, 88, 207, 69, 88, - 73, 83, 84, 83, 128, 69, 88, 73, 83, 84, 128, 69, 88, 72, 65, 85, 83, 84, - 73, 79, 78, 128, 69, 88, 72, 65, 76, 69, 128, 69, 88, 67, 76, 65, 77, 65, - 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, - 67, 73, 84, 69, 77, 69, 78, 84, 128, 69, 88, 67, 72, 65, 78, 71, 69, 128, - 69, 88, 67, 69, 83, 83, 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, - 87, 69, 128, 69, 86, 69, 82, 217, 69, 86, 69, 82, 71, 82, 69, 69, 206, - 69, 86, 69, 78, 73, 78, 71, 128, 69, 85, 82, 79, 80, 69, 65, 206, 69, 85, - 82, 79, 80, 69, 45, 65, 70, 82, 73, 67, 65, 128, 69, 85, 82, 79, 45, 67, - 85, 82, 82, 69, 78, 67, 217, 69, 85, 82, 207, 69, 85, 76, 69, 210, 69, - 85, 45, 85, 128, 69, 85, 45, 79, 128, 69, 85, 45, 69, 85, 128, 69, 85, - 45, 69, 79, 128, 69, 85, 45, 69, 128, 69, 85, 45, 65, 128, 69, 84, 88, - 128, 69, 84, 78, 65, 72, 84, 65, 128, 69, 84, 72, 69, 204, 69, 84, 69, - 82, 79, 206, 69, 84, 69, 82, 78, 73, 84, 89, 128, 69, 84, 69, 82, 78, 73, - 84, 217, 69, 84, 66, 128, 69, 83, 90, 128, 69, 83, 85, 75, 85, 85, 68, - 79, 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, 128, 69, 83, 84, 73, 77, 65, - 84, 69, 196, 69, 83, 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, - 72, 49, 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 67, 128, 69, 83, - 65, 128, 69, 83, 45, 84, 69, 128, 69, 83, 45, 51, 128, 69, 83, 45, 50, - 128, 69, 83, 45, 49, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, - 196, 69, 82, 82, 128, 69, 82, 73, 211, 69, 82, 73, 78, 50, 128, 69, 82, - 73, 78, 178, 69, 82, 71, 128, 69, 82, 65, 83, 197, 69, 81, 85, 73, 86, - 65, 76, 69, 78, 212, 69, 81, 85, 73, 76, 65, 84, 69, 82, 65, 204, 69, 81, - 85, 73, 72, 79, 80, 80, 69, 82, 128, 69, 81, 85, 73, 72, 79, 80, 80, 69, - 210, 69, 81, 85, 73, 68, 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, 65, - 210, 69, 81, 85, 65, 76, 83, 128, 69, 81, 85, 65, 76, 211, 69, 81, 85, - 65, 76, 128, 69, 80, 83, 73, 76, 79, 78, 128, 69, 80, 83, 73, 76, 79, - 206, 69, 80, 79, 67, 72, 128, 69, 80, 73, 71, 82, 65, 80, 72, 73, 195, - 69, 80, 73, 68, 65, 85, 82, 69, 65, 206, 69, 80, 69, 78, 84, 72, 69, 84, - 73, 195, 69, 80, 69, 71, 69, 82, 77, 65, 128, 69, 80, 65, 67, 212, 69, - 79, 84, 128, 69, 79, 77, 128, 69, 79, 76, 72, 88, 128, 69, 79, 76, 128, - 69, 79, 72, 128, 69, 78, 89, 128, 69, 78, 86, 69, 76, 79, 80, 69, 128, - 69, 78, 86, 69, 76, 79, 80, 197, 69, 78, 85, 77, 69, 82, 65, 84, 73, 79, - 206, 69, 78, 84, 82, 89, 45, 50, 128, 69, 78, 84, 82, 89, 45, 49, 128, - 69, 78, 84, 82, 89, 128, 69, 78, 84, 82, 217, 69, 78, 84, 72, 85, 83, 73, - 65, 83, 77, 128, 69, 78, 84, 69, 82, 80, 82, 73, 83, 69, 128, 69, 78, 84, - 69, 82, 73, 78, 199, 69, 78, 84, 69, 82, 128, 69, 78, 84, 69, 210, 69, - 78, 84, 45, 83, 72, 65, 80, 69, 196, 69, 78, 81, 85, 73, 82, 89, 128, 69, - 78, 81, 128, 69, 78, 79, 211, 69, 78, 78, 73, 128, 69, 78, 78, 128, 69, - 78, 76, 65, 82, 71, 69, 77, 69, 78, 84, 128, 69, 78, 71, 73, 78, 69, 128, - 69, 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, 78, 68, 73, 78, 199, 69, 78, - 68, 69, 80, 128, 69, 78, 68, 69, 65, 86, 79, 85, 82, 128, 69, 78, 67, 79, - 85, 78, 84, 69, 82, 83, 128, 69, 78, 67, 76, 79, 83, 85, 82, 69, 83, 128, - 69, 78, 67, 76, 79, 83, 85, 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, - 199, 69, 78, 67, 128, 69, 78, 65, 82, 88, 73, 211, 69, 78, 65, 82, 77, - 79, 78, 73, 79, 211, 69, 77, 80, 84, 217, 69, 77, 80, 72, 65, 84, 73, - 195, 69, 77, 80, 72, 65, 83, 73, 211, 69, 77, 79, 74, 201, 69, 77, 66, - 82, 79, 73, 68, 69, 82, 89, 128, 69, 77, 66, 76, 69, 77, 128, 69, 77, 66, - 69, 76, 76, 73, 83, 72, 77, 69, 78, 84, 128, 69, 77, 66, 69, 68, 68, 73, - 78, 71, 128, 69, 76, 89, 77, 65, 73, 195, 69, 76, 89, 128, 69, 76, 84, - 128, 69, 76, 76, 73, 80, 84, 73, 195, 69, 76, 76, 73, 80, 83, 73, 83, - 128, 69, 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, 76, - 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69, 78, - 128, 69, 76, 69, 86, 69, 206, 69, 76, 69, 86, 65, 84, 85, 211, 69, 76, - 69, 80, 72, 65, 78, 84, 128, 69, 76, 69, 77, 69, 78, 212, 69, 76, 69, 67, - 84, 82, 73, 67, 65, 204, 69, 76, 69, 67, 84, 82, 73, 195, 69, 76, 66, 65, - 83, 65, 206, 69, 76, 65, 77, 73, 84, 69, 128, 69, 76, 65, 77, 73, 84, + 78, 68, 85, 69, 128, 70, 79, 77, 128, 70, 79, 76, 76, 89, 128, 70, 79, + 76, 76, 79, 87, 73, 78, 71, 128, 70, 79, 76, 68, 69, 82, 128, 70, 79, 76, + 68, 69, 196, 70, 79, 71, 71, 89, 128, 70, 79, 71, 128, 70, 207, 70, 77, + 128, 70, 76, 89, 73, 78, 199, 70, 76, 89, 128, 70, 76, 85, 84, 84, 69, + 82, 73, 78, 71, 128, 70, 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, 85, + 84, 69, 128, 70, 76, 85, 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, 199, + 70, 76, 79, 87, 69, 82, 83, 128, 70, 76, 79, 87, 69, 210, 70, 76, 79, 85, + 82, 73, 83, 72, 128, 70, 76, 79, 82, 69, 84, 84, 69, 128, 70, 76, 79, 82, + 65, 204, 70, 76, 79, 80, 80, 217, 70, 76, 79, 79, 82, 128, 70, 76, 79, + 79, 210, 70, 76, 73, 80, 128, 70, 76, 73, 71, 72, 84, 128, 70, 76, 73, + 67, 203, 70, 76, 69, 88, 85, 83, 128, 70, 76, 69, 88, 69, 196, 70, 76, + 69, 88, 128, 70, 76, 69, 85, 82, 79, 78, 128, 70, 76, 69, 85, 82, 45, 68, + 69, 45, 76, 73, 83, 128, 70, 76, 65, 84, 84, 69, 78, 69, 196, 70, 76, 65, + 84, 78, 69, 83, 83, 128, 70, 76, 65, 84, 66, 82, 69, 65, 68, 128, 70, 76, + 65, 83, 72, 128, 70, 76, 65, 77, 73, 78, 71, 79, 128, 70, 76, 65, 77, 69, + 128, 70, 76, 65, 71, 83, 128, 70, 76, 65, 71, 45, 53, 128, 70, 76, 65, + 71, 45, 52, 128, 70, 76, 65, 71, 45, 51, 128, 70, 76, 65, 71, 45, 50, + 128, 70, 76, 65, 71, 45, 49, 128, 70, 76, 65, 71, 128, 70, 76, 65, 199, + 70, 76, 65, 128, 70, 76, 128, 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, + 70, 73, 88, 128, 70, 73, 86, 69, 45, 84, 72, 73, 82, 84, 89, 128, 70, 73, + 86, 69, 45, 76, 73, 78, 197, 70, 73, 84, 90, 80, 65, 84, 82, 73, 67, 203, + 70, 73, 84, 65, 128, 70, 73, 84, 128, 70, 73, 83, 84, 69, 196, 70, 73, + 83, 72, 73, 78, 199, 70, 73, 83, 72, 72, 79, 79, 75, 128, 70, 73, 83, 72, + 72, 79, 79, 203, 70, 73, 83, 72, 69, 89, 69, 128, 70, 73, 83, 72, 128, + 70, 73, 83, 200, 70, 73, 82, 83, 212, 70, 73, 82, 73, 128, 70, 73, 82, + 69, 87, 79, 82, 75, 83, 128, 70, 73, 82, 69, 87, 79, 82, 203, 70, 73, 82, + 69, 67, 82, 65, 67, 75, 69, 82, 128, 70, 73, 82, 69, 128, 70, 73, 82, + 197, 70, 73, 80, 128, 70, 73, 78, 73, 84, 197, 70, 73, 78, 71, 69, 82, + 83, 128, 70, 73, 78, 71, 69, 82, 211, 70, 73, 78, 71, 69, 82, 78, 65, 73, + 76, 83, 128, 70, 73, 78, 71, 69, 82, 69, 196, 70, 73, 78, 71, 69, 82, 45, + 80, 79, 83, 212, 70, 73, 78, 71, 69, 82, 128, 70, 73, 78, 71, 69, 210, + 70, 73, 78, 65, 78, 67, 73, 65, 76, 128, 70, 73, 78, 65, 76, 128, 70, 73, + 76, 205, 70, 73, 76, 76, 69, 82, 45, 50, 128, 70, 73, 76, 76, 69, 82, 45, + 49, 128, 70, 73, 76, 76, 69, 82, 128, 70, 73, 76, 76, 69, 196, 70, 73, + 76, 76, 128, 70, 73, 76, 204, 70, 73, 76, 197, 70, 73, 73, 128, 70, 73, + 71, 85, 82, 69, 45, 51, 128, 70, 73, 71, 85, 82, 69, 45, 50, 128, 70, 73, + 71, 85, 82, 69, 45, 49, 128, 70, 73, 71, 85, 82, 69, 128, 70, 73, 71, 85, + 82, 197, 70, 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, 70, 73, 70, + 84, 217, 70, 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, 128, 70, 73, + 70, 84, 69, 69, 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, 73, 69, 76, 68, + 128, 70, 73, 69, 76, 196, 70, 72, 84, 79, 82, 193, 70, 70, 76, 128, 70, + 70, 73, 128, 70, 69, 85, 88, 128, 70, 69, 85, 70, 69, 85, 65, 69, 84, + 128, 70, 69, 84, 72, 128, 70, 69, 83, 84, 73, 86, 65, 76, 128, 70, 69, + 82, 82, 89, 128, 70, 69, 82, 82, 73, 211, 70, 69, 82, 77, 65, 84, 65, + 128, 70, 69, 82, 77, 65, 84, 193, 70, 69, 79, 200, 70, 69, 78, 199, 70, + 69, 78, 67, 69, 82, 128, 70, 69, 78, 67, 69, 128, 70, 69, 77, 73, 78, 73, + 78, 197, 70, 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, 197, 70, 69, + 76, 76, 79, 87, 83, 72, 73, 80, 128, 70, 69, 73, 128, 70, 69, 72, 213, + 70, 69, 72, 128, 70, 69, 200, 70, 69, 69, 78, 71, 128, 70, 69, 69, 77, + 128, 70, 69, 69, 68, 128, 70, 69, 69, 196, 70, 69, 69, 128, 70, 69, 66, + 82, 85, 65, 82, 89, 128, 70, 69, 65, 84, 72, 69, 82, 128, 70, 69, 65, 84, + 72, 69, 210, 70, 69, 65, 82, 78, 128, 70, 69, 65, 82, 70, 85, 204, 70, + 69, 65, 82, 128, 70, 65, 89, 65, 78, 78, 65, 128, 70, 65, 89, 128, 70, + 65, 88, 128, 70, 65, 216, 70, 65, 84, 73, 71, 85, 69, 128, 70, 65, 84, + 72, 69, 82, 128, 70, 65, 84, 72, 69, 210, 70, 65, 84, 72, 65, 84, 65, 78, + 128, 70, 65, 84, 72, 65, 84, 65, 206, 70, 65, 84, 72, 65, 128, 70, 65, + 84, 72, 193, 70, 65, 84, 128, 70, 65, 83, 84, 128, 70, 65, 82, 83, 201, + 70, 65, 82, 128, 70, 65, 81, 128, 70, 65, 80, 128, 70, 65, 78, 71, 128, + 70, 65, 78, 69, 82, 79, 83, 73, 211, 70, 65, 78, 128, 70, 65, 77, 73, 76, + 89, 128, 70, 65, 77, 128, 70, 65, 76, 76, 69, 206, 70, 65, 76, 65, 70, + 69, 76, 128, 70, 65, 74, 128, 70, 65, 73, 82, 89, 128, 70, 65, 73, 76, + 85, 82, 69, 128, 70, 65, 73, 72, 85, 128, 70, 65, 73, 66, 128, 70, 65, + 72, 82, 69, 78, 72, 69, 73, 84, 128, 70, 65, 67, 84, 79, 82, 89, 128, 70, + 65, 67, 84, 79, 210, 70, 65, 67, 83, 73, 77, 73, 76, 197, 70, 65, 67, 73, + 78, 71, 83, 128, 70, 65, 67, 69, 45, 54, 128, 70, 65, 67, 69, 45, 53, + 128, 70, 65, 67, 69, 45, 52, 128, 70, 65, 67, 69, 45, 51, 128, 70, 65, + 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 49, 128, 70, 65, 65, 77, 65, 69, + 128, 70, 65, 65, 73, 128, 70, 65, 65, 70, 85, 128, 70, 48, 53, 51, 128, + 70, 48, 53, 50, 128, 70, 48, 53, 49, 67, 128, 70, 48, 53, 49, 66, 128, + 70, 48, 53, 49, 65, 128, 70, 48, 53, 49, 128, 70, 48, 53, 48, 128, 70, + 48, 52, 57, 128, 70, 48, 52, 56, 128, 70, 48, 52, 55, 65, 128, 70, 48, + 52, 55, 128, 70, 48, 52, 54, 65, 128, 70, 48, 52, 54, 128, 70, 48, 52, + 53, 65, 128, 70, 48, 52, 53, 128, 70, 48, 52, 52, 128, 70, 48, 52, 51, + 128, 70, 48, 52, 50, 128, 70, 48, 52, 49, 128, 70, 48, 52, 48, 128, 70, + 48, 51, 57, 128, 70, 48, 51, 56, 65, 128, 70, 48, 51, 56, 128, 70, 48, + 51, 55, 65, 128, 70, 48, 51, 55, 128, 70, 48, 51, 54, 128, 70, 48, 51, + 53, 128, 70, 48, 51, 52, 128, 70, 48, 51, 51, 128, 70, 48, 51, 50, 128, + 70, 48, 51, 49, 65, 128, 70, 48, 51, 49, 128, 70, 48, 51, 48, 128, 70, + 48, 50, 57, 128, 70, 48, 50, 56, 128, 70, 48, 50, 55, 128, 70, 48, 50, + 54, 128, 70, 48, 50, 53, 128, 70, 48, 50, 52, 128, 70, 48, 50, 51, 128, + 70, 48, 50, 50, 128, 70, 48, 50, 49, 65, 128, 70, 48, 50, 49, 128, 70, + 48, 50, 48, 128, 70, 48, 49, 57, 128, 70, 48, 49, 56, 128, 70, 48, 49, + 55, 128, 70, 48, 49, 54, 128, 70, 48, 49, 53, 128, 70, 48, 49, 52, 128, + 70, 48, 49, 51, 65, 128, 70, 48, 49, 51, 128, 70, 48, 49, 50, 128, 70, + 48, 49, 49, 128, 70, 48, 49, 48, 128, 70, 48, 48, 57, 128, 70, 48, 48, + 56, 128, 70, 48, 48, 55, 128, 70, 48, 48, 54, 128, 70, 48, 48, 53, 128, + 70, 48, 48, 52, 128, 70, 48, 48, 51, 128, 70, 48, 48, 50, 128, 70, 48, + 48, 49, 65, 128, 70, 48, 48, 49, 128, 69, 90, 83, 128, 69, 90, 200, 69, + 90, 69, 78, 128, 69, 90, 69, 206, 69, 90, 128, 69, 89, 89, 89, 128, 69, + 89, 69, 83, 128, 69, 89, 69, 211, 69, 89, 69, 76, 65, 83, 72, 69, 211, + 69, 89, 69, 71, 76, 65, 83, 83, 69, 83, 128, 69, 89, 69, 71, 65, 90, 69, + 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 69, 89, 69, 71, 65, 90, 69, 45, + 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 69, 89, 69, 66, 82, 79, 87, 211, + 69, 89, 69, 66, 82, 79, 215, 69, 89, 197, 69, 89, 66, 69, 89, 70, 73, 76, + 73, 128, 69, 89, 65, 78, 78, 65, 128, 69, 88, 84, 82, 69, 77, 69, 76, + 217, 69, 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, 84, 82, 73, 65, 204, 69, + 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, 65, 45, 72, 73, 71, 200, + 69, 88, 84, 82, 193, 69, 88, 84, 73, 78, 71, 85, 73, 83, 72, 69, 82, 128, + 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, 84, 69, 78, 68, 69, 68, + 128, 69, 88, 84, 69, 78, 68, 69, 196, 69, 88, 80, 82, 69, 83, 83, 73, 79, + 78, 76, 69, 83, 211, 69, 88, 80, 79, 78, 69, 78, 212, 69, 88, 80, 76, 79, + 68, 73, 78, 199, 69, 88, 79, 128, 69, 88, 207, 69, 88, 73, 83, 84, 83, + 128, 69, 88, 73, 83, 84, 128, 69, 88, 72, 65, 85, 83, 84, 73, 79, 78, + 128, 69, 88, 72, 65, 76, 69, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, + 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, 67, 73, 84, + 69, 77, 69, 78, 84, 128, 69, 88, 67, 72, 65, 78, 71, 69, 128, 69, 88, 67, + 69, 83, 83, 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, 87, 69, + 128, 69, 86, 69, 82, 217, 69, 86, 69, 82, 71, 82, 69, 69, 206, 69, 86, + 69, 78, 73, 78, 71, 128, 69, 85, 82, 79, 80, 69, 65, 206, 69, 85, 82, 79, + 80, 69, 45, 65, 70, 82, 73, 67, 65, 128, 69, 85, 82, 79, 45, 67, 85, 82, + 82, 69, 78, 67, 217, 69, 85, 82, 207, 69, 85, 76, 69, 210, 69, 85, 45, + 85, 128, 69, 85, 45, 79, 128, 69, 85, 45, 69, 85, 128, 69, 85, 45, 69, + 79, 128, 69, 85, 45, 69, 128, 69, 85, 45, 65, 128, 69, 84, 88, 128, 69, + 84, 78, 65, 72, 84, 65, 128, 69, 84, 72, 69, 204, 69, 84, 69, 82, 79, + 206, 69, 84, 69, 82, 78, 73, 84, 89, 128, 69, 84, 69, 82, 78, 73, 84, + 217, 69, 84, 66, 128, 69, 83, 90, 128, 69, 83, 85, 75, 85, 85, 68, 79, + 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, 128, 69, 83, 84, 73, 77, 65, 84, + 69, 196, 69, 83, 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, 72, + 49, 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 67, 128, 69, 83, 65, + 128, 69, 83, 45, 84, 69, 128, 69, 83, 45, 51, 128, 69, 83, 45, 50, 128, + 69, 83, 45, 49, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, 196, 69, + 82, 82, 128, 69, 82, 73, 211, 69, 82, 73, 78, 50, 128, 69, 82, 73, 78, + 178, 69, 82, 71, 128, 69, 82, 65, 83, 197, 69, 81, 85, 73, 86, 65, 76, + 69, 78, 212, 69, 81, 85, 73, 76, 65, 84, 69, 82, 65, 204, 69, 81, 85, 73, + 72, 79, 80, 80, 69, 82, 128, 69, 81, 85, 73, 72, 79, 80, 80, 69, 210, 69, + 81, 85, 73, 68, 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, 65, 210, 69, 81, + 85, 65, 76, 83, 128, 69, 81, 85, 65, 76, 211, 69, 81, 85, 65, 76, 128, + 69, 80, 83, 73, 76, 79, 78, 128, 69, 80, 83, 73, 76, 79, 206, 69, 80, 79, + 67, 72, 128, 69, 80, 73, 71, 82, 65, 80, 72, 73, 195, 69, 80, 73, 68, 65, + 85, 82, 69, 65, 206, 69, 80, 69, 78, 84, 72, 69, 84, 73, 195, 69, 80, 69, + 71, 69, 82, 77, 65, 128, 69, 80, 65, 67, 212, 69, 79, 84, 128, 69, 79, + 77, 128, 69, 79, 76, 72, 88, 128, 69, 79, 76, 128, 69, 79, 72, 128, 69, + 78, 89, 128, 69, 78, 86, 69, 76, 79, 80, 69, 128, 69, 78, 86, 69, 76, 79, + 80, 197, 69, 78, 85, 77, 69, 82, 65, 84, 73, 79, 206, 69, 78, 84, 82, 89, + 45, 50, 128, 69, 78, 84, 82, 89, 45, 49, 128, 69, 78, 84, 82, 89, 128, + 69, 78, 84, 82, 217, 69, 78, 84, 72, 85, 83, 73, 65, 83, 77, 128, 69, 78, + 84, 69, 82, 80, 82, 73, 83, 69, 128, 69, 78, 84, 69, 82, 73, 78, 199, 69, + 78, 84, 69, 82, 128, 69, 78, 84, 69, 210, 69, 78, 84, 45, 83, 72, 65, 80, + 69, 196, 69, 78, 81, 85, 73, 82, 89, 128, 69, 78, 81, 128, 69, 78, 79, + 211, 69, 78, 78, 73, 128, 69, 78, 78, 128, 69, 78, 76, 65, 82, 71, 69, + 77, 69, 78, 84, 128, 69, 78, 71, 73, 78, 69, 128, 69, 78, 68, 79, 70, 79, + 78, 79, 78, 128, 69, 78, 68, 73, 78, 199, 69, 78, 68, 69, 80, 128, 69, + 78, 68, 69, 65, 86, 79, 85, 82, 128, 69, 78, 67, 79, 85, 78, 84, 69, 82, + 83, 128, 69, 78, 67, 76, 79, 83, 85, 82, 69, 83, 128, 69, 78, 67, 76, 79, + 83, 85, 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, 199, 69, 78, 67, + 128, 69, 78, 65, 82, 88, 73, 211, 69, 78, 65, 82, 77, 79, 78, 73, 79, + 211, 69, 77, 80, 84, 217, 69, 77, 80, 72, 65, 84, 73, 195, 69, 77, 80, + 72, 65, 83, 73, 211, 69, 77, 79, 74, 201, 69, 77, 66, 82, 79, 73, 68, 69, + 82, 89, 128, 69, 77, 66, 76, 69, 77, 128, 69, 77, 66, 69, 76, 76, 73, 83, + 72, 77, 69, 78, 84, 128, 69, 77, 66, 69, 68, 68, 73, 78, 71, 128, 69, 76, + 89, 77, 65, 73, 195, 69, 76, 89, 128, 69, 76, 84, 128, 69, 76, 76, 73, + 80, 84, 73, 195, 69, 76, 76, 73, 80, 83, 73, 83, 128, 69, 76, 76, 73, 80, + 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, 76, 73, 70, 128, 69, 76, 69, + 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69, 78, 128, + 69, 76, 69, 86, 69, 206, 69, 76, 69, 86, 65, 84, 85, 211, 69, 76, 69, 86, + 65, 84, 79, 82, 128, 69, 76, 69, 80, 72, 65, 78, 84, 128, 69, 76, 69, 77, + 69, 78, 212, 69, 76, 69, 67, 84, 82, 79, 78, 73, 67, 83, 128, 69, 76, 69, + 67, 84, 82, 73, 67, 65, 204, 69, 76, 69, 67, 84, 82, 73, 195, 69, 76, 66, + 65, 83, 65, 206, 69, 76, 65, 77, 73, 84, 69, 128, 69, 76, 65, 77, 73, 84, 197, 69, 76, 65, 70, 82, 79, 78, 128, 69, 75, 83, 84, 82, 69, 80, 84, 79, 78, 128, 69, 75, 83, 128, 69, 75, 70, 79, 78, 73, 84, 73, 75, 79, 78, 128, 69, 75, 65, 82, 65, 128, 69, 75, 65, 77, 128, 69, 74, 69, 67, 212, @@ -4518,26 +4577,27 @@ static const unsigned char lexicon[] = { 83, 128, 68, 79, 76, 76, 65, 210, 68, 79, 76, 73, 85, 77, 128, 68, 79, 75, 77, 65, 73, 128, 68, 79, 73, 84, 128, 68, 79, 73, 78, 199, 68, 79, 73, 128, 68, 79, 71, 82, 193, 68, 79, 71, 128, 68, 79, 199, 68, 79, 69, - 211, 68, 79, 68, 69, 75, 65, 84, 65, 128, 68, 79, 67, 85, 77, 69, 78, 84, - 128, 68, 79, 67, 85, 77, 69, 78, 212, 68, 79, 66, 82, 79, 128, 68, 79, - 65, 67, 72, 65, 83, 72, 77, 69, 69, 128, 68, 79, 65, 67, 72, 65, 83, 72, - 77, 69, 197, 68, 79, 65, 128, 68, 79, 45, 79, 128, 68, 78, 193, 68, 77, - 128, 68, 205, 68, 76, 85, 128, 68, 76, 79, 128, 68, 76, 73, 128, 68, 76, - 72, 89, 65, 128, 68, 76, 72, 65, 128, 68, 76, 69, 69, 128, 68, 76, 65, - 128, 68, 76, 128, 68, 75, 65, 82, 128, 68, 75, 65, 210, 68, 74, 69, 82, - 86, 73, 128, 68, 74, 69, 82, 86, 128, 68, 74, 69, 128, 68, 74, 65, 128, - 68, 73, 90, 90, 217, 68, 73, 89, 193, 68, 73, 86, 79, 82, 67, 197, 68, - 73, 86, 73, 83, 73, 79, 78, 128, 68, 73, 86, 73, 83, 73, 79, 206, 68, 73, - 86, 73, 78, 199, 68, 73, 86, 73, 78, 65, 84, 73, 79, 78, 128, 68, 73, 86, - 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, 82, 83, 128, 68, 73, 86, 73, - 68, 69, 82, 128, 68, 73, 86, 73, 68, 69, 196, 68, 73, 86, 73, 68, 69, - 128, 68, 73, 86, 73, 68, 197, 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, - 128, 68, 73, 84, 84, 207, 68, 73, 83, 84, 79, 82, 84, 73, 79, 78, 128, - 68, 73, 83, 84, 73, 78, 71, 85, 73, 83, 72, 128, 68, 73, 83, 84, 73, 76, - 76, 128, 68, 73, 83, 83, 79, 76, 86, 69, 45, 50, 128, 68, 73, 83, 83, 79, - 76, 86, 69, 128, 68, 73, 83, 80, 85, 84, 69, 196, 68, 73, 83, 80, 69, 82, - 83, 73, 79, 78, 128, 68, 73, 83, 75, 128, 68, 73, 83, 73, 77, 79, 85, - 128, 68, 73, 83, 72, 128, 68, 73, 83, 67, 79, 78, 84, 73, 78, 85, 79, 85, + 211, 68, 79, 68, 79, 128, 68, 79, 68, 69, 75, 65, 84, 65, 128, 68, 79, + 67, 85, 77, 69, 78, 84, 128, 68, 79, 67, 85, 77, 69, 78, 212, 68, 79, 66, + 82, 79, 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 69, 128, 68, 79, 65, + 67, 72, 65, 83, 72, 77, 69, 197, 68, 79, 65, 128, 68, 79, 45, 79, 128, + 68, 78, 193, 68, 77, 128, 68, 205, 68, 76, 85, 128, 68, 76, 79, 128, 68, + 76, 73, 128, 68, 76, 72, 89, 65, 128, 68, 76, 72, 65, 128, 68, 76, 69, + 69, 128, 68, 76, 65, 128, 68, 76, 128, 68, 75, 65, 82, 128, 68, 75, 65, + 210, 68, 74, 69, 82, 86, 73, 128, 68, 74, 69, 82, 86, 128, 68, 74, 69, + 128, 68, 74, 65, 128, 68, 73, 90, 90, 217, 68, 73, 89, 193, 68, 73, 86, + 79, 82, 67, 197, 68, 73, 86, 73, 83, 73, 79, 78, 128, 68, 73, 86, 73, 83, + 73, 79, 206, 68, 73, 86, 73, 78, 199, 68, 73, 86, 73, 78, 65, 84, 73, 79, + 78, 128, 68, 73, 86, 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, 82, 83, + 128, 68, 73, 86, 73, 68, 69, 82, 128, 68, 73, 86, 73, 68, 69, 196, 68, + 73, 86, 73, 68, 69, 128, 68, 73, 86, 73, 68, 197, 68, 73, 86, 69, 211, + 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, 73, 84, 84, 207, 68, 73, + 83, 84, 79, 82, 84, 73, 79, 78, 128, 68, 73, 83, 84, 73, 78, 71, 85, 73, + 83, 72, 128, 68, 73, 83, 84, 73, 76, 76, 128, 68, 73, 83, 83, 79, 76, 86, + 69, 45, 50, 128, 68, 73, 83, 83, 79, 76, 86, 69, 128, 68, 73, 83, 80, 85, + 84, 69, 196, 68, 73, 83, 80, 69, 82, 83, 73, 79, 78, 128, 68, 73, 83, 75, + 128, 68, 73, 83, 73, 77, 79, 85, 128, 68, 73, 83, 72, 128, 68, 73, 83, + 71, 85, 73, 83, 69, 196, 68, 73, 83, 67, 79, 78, 84, 73, 78, 85, 79, 85, 211, 68, 73, 83, 195, 68, 73, 83, 65, 80, 80, 79, 73, 78, 84, 69, 196, 68, 73, 83, 65, 66, 76, 69, 196, 68, 73, 82, 71, 193, 68, 73, 82, 69, 67, 84, 76, 217, 68, 73, 82, 69, 67, 84, 73, 79, 78, 65, 204, 68, 73, 82, 69, @@ -4686,25 +4746,26 @@ static const unsigned char lexicon[] = { 85, 82, 86, 69, 196, 67, 85, 82, 86, 69, 128, 67, 85, 82, 86, 197, 67, 85, 82, 83, 73, 86, 197, 67, 85, 82, 82, 217, 67, 85, 82, 82, 69, 78, 84, 128, 67, 85, 82, 82, 69, 78, 212, 67, 85, 82, 76, 217, 67, 85, 82, 76, - 73, 78, 199, 67, 85, 82, 76, 128, 67, 85, 82, 128, 67, 85, 80, 80, 69, - 68, 128, 67, 85, 80, 80, 69, 196, 67, 85, 80, 73, 68, 79, 128, 67, 85, - 80, 67, 65, 75, 69, 128, 67, 85, 79, 88, 128, 67, 85, 79, 80, 128, 67, - 85, 79, 128, 67, 85, 205, 67, 85, 76, 84, 73, 86, 65, 84, 73, 79, 206, - 67, 85, 67, 85, 77, 66, 69, 82, 128, 67, 85, 66, 69, 68, 128, 67, 85, 66, - 69, 128, 67, 85, 66, 197, 67, 85, 65, 84, 82, 73, 76, 76, 79, 128, 67, - 85, 65, 84, 82, 73, 76, 76, 207, 67, 85, 65, 205, 67, 83, 73, 128, 67, - 82, 89, 83, 84, 65, 204, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, - 195, 67, 82, 89, 73, 78, 199, 67, 82, 85, 90, 69, 73, 82, 207, 67, 82, - 85, 67, 73, 70, 79, 82, 205, 67, 82, 85, 67, 73, 66, 76, 69, 45, 53, 128, - 67, 82, 85, 67, 73, 66, 76, 69, 45, 52, 128, 67, 82, 85, 67, 73, 66, 76, - 69, 45, 51, 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 50, 128, 67, 82, 85, - 67, 73, 66, 76, 69, 128, 67, 82, 79, 87, 78, 128, 67, 82, 79, 83, 83, 73, - 78, 71, 128, 67, 82, 79, 83, 83, 73, 78, 199, 67, 82, 79, 83, 83, 72, 65, - 84, 67, 200, 67, 82, 79, 83, 83, 69, 68, 45, 84, 65, 73, 76, 128, 67, 82, - 79, 83, 83, 69, 68, 128, 67, 82, 79, 83, 83, 69, 196, 67, 82, 79, 83, 83, - 66, 79, 78, 69, 83, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, 211, - 67, 82, 79, 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 79, 73, 83, 83, 65, - 78, 84, 128, 67, 82, 79, 67, 85, 211, 67, 82, 79, 67, 79, 68, 73, 76, 69, + 73, 78, 199, 67, 85, 82, 76, 69, 196, 67, 85, 82, 76, 128, 67, 85, 82, + 128, 67, 85, 80, 80, 69, 68, 128, 67, 85, 80, 80, 69, 196, 67, 85, 80, + 73, 68, 79, 128, 67, 85, 80, 67, 65, 75, 69, 128, 67, 85, 79, 88, 128, + 67, 85, 79, 80, 128, 67, 85, 79, 128, 67, 85, 205, 67, 85, 76, 84, 73, + 86, 65, 84, 73, 79, 206, 67, 85, 67, 85, 77, 66, 69, 82, 128, 67, 85, 66, + 69, 68, 128, 67, 85, 66, 69, 128, 67, 85, 66, 197, 67, 85, 65, 84, 82, + 73, 76, 76, 79, 128, 67, 85, 65, 84, 82, 73, 76, 76, 207, 67, 85, 65, + 205, 67, 83, 73, 128, 67, 82, 89, 83, 84, 65, 204, 67, 82, 89, 80, 84, + 79, 71, 82, 65, 77, 77, 73, 195, 67, 82, 89, 73, 78, 199, 67, 82, 85, 90, + 69, 73, 82, 207, 67, 82, 85, 67, 73, 70, 79, 82, 205, 67, 82, 85, 67, 73, + 66, 76, 69, 45, 53, 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 52, 128, 67, + 82, 85, 67, 73, 66, 76, 69, 45, 51, 128, 67, 82, 85, 67, 73, 66, 76, 69, + 45, 50, 128, 67, 82, 85, 67, 73, 66, 76, 69, 128, 67, 82, 79, 87, 78, + 128, 67, 82, 79, 83, 83, 73, 78, 71, 128, 67, 82, 79, 83, 83, 73, 78, + 199, 67, 82, 79, 83, 83, 72, 65, 84, 67, 200, 67, 82, 79, 83, 83, 69, 68, + 45, 84, 65, 73, 76, 128, 67, 82, 79, 83, 83, 69, 68, 128, 67, 82, 79, 83, + 83, 69, 196, 67, 82, 79, 83, 83, 66, 79, 78, 69, 83, 128, 67, 82, 79, 83, + 83, 66, 65, 82, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, 211, 67, + 82, 79, 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 79, 73, 83, 83, 65, 78, + 84, 128, 67, 82, 79, 67, 85, 211, 67, 82, 79, 67, 79, 68, 73, 76, 69, 128, 67, 82, 73, 67, 75, 69, 84, 128, 67, 82, 73, 67, 75, 69, 212, 67, 82, 69, 83, 67, 69, 78, 84, 83, 128, 67, 82, 69, 83, 67, 69, 78, 84, 128, 67, 82, 69, 83, 67, 69, 78, 212, 67, 82, 69, 68, 73, 212, 67, 82, 69, 65, @@ -4748,605 +4809,616 @@ static const unsigned char lexicon[] = { 85, 84, 69, 82, 128, 67, 79, 77, 80, 82, 69, 83, 83, 73, 79, 78, 128, 67, 79, 77, 80, 82, 69, 83, 83, 69, 196, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 78, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 212, 67, 79, 77, 80, 76, 73, 65, 78, 67, - 69, 128, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, 128, 67, 79, 77, 80, 76, - 69, 84, 69, 68, 128, 67, 79, 77, 80, 76, 69, 77, 69, 78, 84, 128, 67, 79, - 77, 80, 65, 83, 83, 128, 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, 77, 77, - 79, 206, 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, 65, 78, - 68, 128, 67, 79, 77, 77, 65, 128, 67, 79, 77, 77, 193, 67, 79, 77, 69, - 84, 128, 67, 79, 77, 66, 73, 78, 69, 68, 128, 67, 79, 77, 66, 73, 78, 65, - 84, 73, 79, 78, 128, 67, 79, 77, 66, 128, 67, 79, 76, 85, 77, 78, 128, - 67, 79, 76, 79, 82, 128, 67, 79, 76, 76, 73, 83, 73, 79, 206, 67, 79, 76, - 76, 128, 67, 79, 76, 196, 67, 79, 70, 70, 73, 78, 128, 67, 79, 69, 78, - 71, 128, 67, 79, 69, 78, 199, 67, 79, 68, 65, 128, 67, 79, 67, 79, 78, - 85, 84, 128, 67, 79, 67, 75, 84, 65, 73, 204, 67, 79, 65, 84, 128, 67, + 79, 78, 69, 78, 84, 45, 55, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 54, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 54, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 54, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 54, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 54, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 212, 67, 79, 77, 80, 76, 73, 65, + 78, 67, 69, 128, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, 128, 67, 79, 77, + 80, 76, 69, 84, 69, 68, 128, 67, 79, 77, 80, 76, 69, 77, 69, 78, 84, 128, + 67, 79, 77, 80, 65, 83, 83, 128, 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, + 77, 77, 79, 206, 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, + 65, 78, 68, 128, 67, 79, 77, 77, 65, 128, 67, 79, 77, 77, 193, 67, 79, + 77, 69, 84, 128, 67, 79, 77, 66, 73, 78, 69, 68, 128, 67, 79, 77, 66, 73, + 78, 65, 84, 73, 79, 78, 128, 67, 79, 77, 66, 128, 67, 79, 76, 85, 77, 78, + 128, 67, 79, 76, 79, 82, 128, 67, 79, 76, 76, 73, 83, 73, 79, 206, 67, + 79, 76, 76, 128, 67, 79, 76, 196, 67, 79, 73, 78, 128, 67, 79, 70, 70, + 73, 78, 128, 67, 79, 69, 78, 71, 128, 67, 79, 69, 78, 199, 67, 79, 68, + 65, 128, 67, 79, 67, 79, 78, 85, 84, 128, 67, 79, 67, 75, 84, 65, 73, + 204, 67, 79, 67, 75, 82, 79, 65, 67, 72, 128, 67, 79, 65, 84, 128, 67, 79, 65, 83, 84, 69, 82, 128, 67, 79, 65, 128, 67, 77, 128, 67, 205, 67, 76, 85, 83, 84, 69, 82, 45, 73, 78, 73, 84, 73, 65, 204, 67, 76, 85, 83, 84, 69, 82, 45, 70, 73, 78, 65, 204, 67, 76, 85, 83, 84, 69, 210, 67, 76, @@ -5373,38 +5445,40 @@ static const unsigned char lexicon[] = { 73, 82, 67, 76, 73, 78, 199, 67, 73, 82, 67, 76, 69, 83, 128, 67, 73, 82, 67, 76, 69, 211, 67, 73, 82, 67, 76, 69, 68, 128, 67, 73, 80, 128, 67, 73, 78, 78, 65, 66, 65, 82, 128, 67, 73, 78, 69, 77, 65, 128, 67, 73, - 206, 67, 73, 205, 67, 73, 73, 128, 67, 73, 69, 88, 128, 67, 73, 69, 85, - 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, - 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, 69, 85, 78, 71, - 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, 69, 80, 128, 67, - 73, 69, 128, 67, 72, 89, 88, 128, 67, 72, 89, 84, 128, 67, 72, 89, 82, - 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, 80, 128, 67, 72, 87, 86, 128, - 67, 72, 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, 67, 72, - 128, 67, 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, 88, 128, - 67, 72, 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, 79, 128, - 67, 72, 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 89, 83, 65, 78, 84, - 72, 69, 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, 128, 67, 72, 82, 79, - 78, 79, 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, 193, 67, 72, - 82, 73, 86, 73, 128, 67, 72, 82, 73, 83, 84, 77, 65, 83, 128, 67, 72, 82, - 73, 83, 84, 77, 65, 211, 67, 72, 79, 89, 128, 67, 72, 79, 88, 128, 67, - 72, 79, 84, 128, 67, 72, 79, 82, 69, 86, 77, 193, 67, 72, 79, 80, 83, 84, - 73, 67, 75, 83, 128, 67, 72, 79, 80, 128, 67, 72, 79, 75, 69, 128, 67, - 72, 79, 69, 128, 67, 72, 79, 67, 79, 76, 65, 84, 197, 67, 72, 79, 65, - 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, - 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, 69, 85, - 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, 67, 72, 73, - 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, - 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, 79, 78, 128, 67, 72, - 73, 82, 69, 84, 128, 67, 72, 73, 80, 77, 85, 78, 75, 128, 67, 72, 73, 78, - 79, 79, 203, 67, 72, 73, 78, 71, 128, 67, 72, 73, 78, 69, 83, 197, 67, - 72, 73, 78, 128, 67, 72, 73, 77, 69, 128, 67, 72, 73, 76, 76, 213, 67, - 72, 73, 76, 68, 82, 69, 206, 67, 72, 73, 76, 68, 128, 67, 72, 73, 76, - 128, 67, 72, 73, 75, 201, 67, 72, 73, 69, 85, 67, 72, 45, 75, 72, 73, 69, - 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, 45, 72, 73, 69, 85, 72, 128, - 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, 67, 75, 69, 78, 128, 67, 72, 73, - 67, 75, 128, 67, 72, 73, 128, 67, 72, 201, 67, 72, 72, 65, 128, 67, 72, - 69, 88, 128, 67, 72, 69, 86, 82, 79, 206, 67, 72, 69, 84, 128, 67, 72, - 69, 83, 84, 78, 85, 84, 128, 67, 72, 69, 83, 84, 128, 67, 72, 69, 83, + 206, 67, 73, 77, 128, 67, 73, 205, 67, 73, 73, 128, 67, 73, 69, 88, 128, + 67, 73, 69, 85, 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, + 73, 69, 85, 67, 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, + 69, 85, 78, 71, 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, + 69, 80, 128, 67, 73, 69, 128, 67, 72, 89, 88, 128, 67, 72, 89, 84, 128, + 67, 72, 89, 82, 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, 80, 128, 67, + 72, 87, 86, 128, 67, 72, 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, + 85, 82, 67, 72, 128, 67, 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, + 85, 79, 88, 128, 67, 72, 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, + 72, 85, 79, 128, 67, 72, 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, + 89, 83, 65, 78, 84, 72, 69, 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, + 128, 67, 72, 82, 79, 78, 79, 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, + 82, 79, 193, 67, 72, 82, 73, 86, 73, 128, 67, 72, 82, 73, 83, 84, 77, 65, + 83, 128, 67, 72, 82, 73, 83, 84, 77, 65, 211, 67, 72, 79, 89, 128, 67, + 72, 79, 88, 128, 67, 72, 79, 84, 128, 67, 72, 79, 82, 69, 86, 77, 193, + 67, 72, 79, 82, 65, 83, 77, 73, 65, 206, 67, 72, 79, 80, 83, 84, 73, 67, + 75, 83, 128, 67, 72, 79, 80, 128, 67, 72, 79, 75, 69, 128, 67, 72, 79, + 69, 128, 67, 72, 79, 67, 79, 76, 65, 84, 197, 67, 72, 79, 65, 128, 67, + 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 67, + 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, + 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, 67, 72, 73, 84, 85, + 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 67, + 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, 79, 78, 128, 67, 72, 73, 82, + 69, 84, 128, 67, 72, 73, 80, 77, 85, 78, 75, 128, 67, 72, 73, 78, 79, 79, + 203, 67, 72, 73, 78, 71, 128, 67, 72, 73, 78, 69, 83, 197, 67, 72, 73, + 78, 128, 67, 72, 73, 77, 69, 128, 67, 72, 73, 77, 128, 67, 72, 73, 76, + 76, 213, 67, 72, 73, 76, 68, 82, 69, 206, 67, 72, 73, 76, 68, 128, 67, + 72, 73, 76, 128, 67, 72, 73, 75, 201, 67, 72, 73, 69, 85, 67, 72, 45, 75, + 72, 73, 69, 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, 45, 72, 73, 69, + 85, 72, 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, 67, 75, 69, 78, + 128, 67, 72, 73, 67, 75, 128, 67, 72, 73, 128, 67, 72, 201, 67, 72, 72, + 73, 77, 128, 67, 72, 72, 65, 128, 67, 72, 69, 88, 128, 67, 72, 69, 86, + 82, 79, 78, 128, 67, 72, 69, 86, 82, 79, 206, 67, 72, 69, 84, 128, 67, + 72, 69, 83, 84, 78, 85, 84, 128, 67, 72, 69, 83, 84, 128, 67, 72, 69, 83, 211, 67, 72, 69, 82, 89, 128, 67, 72, 69, 82, 82, 217, 67, 72, 69, 82, 82, 73, 69, 83, 128, 67, 72, 69, 81, 85, 69, 82, 69, 196, 67, 72, 69, 80, 128, 67, 72, 69, 73, 78, 65, 80, 128, 67, 72, 69, 73, 75, 72, 69, 73, @@ -5768,350 +5842,774 @@ static const unsigned char lexicon[] = { 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 66, 49, 55, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 66, 49, 55, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 66, 49, 55, 48, 128, 67, 72, 65, 82, 65, 67, - 84, 69, 82, 128, 67, 72, 65, 82, 128, 67, 72, 65, 80, 84, 69, 82, 128, - 67, 72, 65, 80, 128, 67, 72, 65, 78, 71, 128, 67, 72, 65, 78, 128, 67, - 72, 65, 77, 75, 79, 128, 67, 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, - 77, 73, 76, 73, 128, 67, 72, 65, 205, 67, 72, 65, 75, 77, 193, 67, 72, - 65, 73, 78, 83, 128, 67, 72, 65, 68, 65, 128, 67, 72, 65, 196, 67, 72, - 65, 65, 128, 67, 71, 74, 128, 67, 69, 88, 128, 67, 69, 86, 73, 84, 85, - 128, 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 77, 79, 78, 89, 128, 67, - 69, 82, 69, 75, 128, 67, 69, 82, 45, 87, 65, 128, 67, 69, 80, 128, 67, - 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, - 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, - 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, - 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 73, 69, - 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 72, 73, 69, - 85, 67, 72, 128, 67, 69, 78, 84, 85, 82, 73, 65, 204, 67, 69, 78, 84, 82, - 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, 69, 68, 128, 67, 69, 78, 84, 82, - 69, 196, 67, 69, 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, 197, 67, 69, - 78, 84, 82, 65, 76, 73, 90, 65, 84, 73, 79, 206, 67, 69, 78, 128, 67, 69, - 76, 84, 73, 195, 67, 69, 76, 83, 73, 85, 83, 128, 67, 69, 76, 69, 66, 82, - 65, 84, 73, 79, 78, 128, 67, 69, 73, 82, 84, 128, 67, 69, 73, 76, 73, 78, - 71, 128, 67, 69, 73, 76, 73, 78, 199, 67, 69, 69, 86, 128, 67, 69, 69, - 66, 128, 67, 69, 69, 128, 67, 69, 68, 73, 76, 76, 65, 128, 67, 69, 68, - 73, 76, 76, 193, 67, 69, 68, 201, 67, 69, 67, 69, 75, 128, 67, 69, 67, - 65, 75, 128, 67, 69, 67, 65, 203, 67, 69, 65, 76, 67, 128, 67, 67, 85, - 128, 67, 67, 79, 128, 67, 67, 73, 128, 67, 67, 72, 85, 128, 67, 67, 72, - 79, 128, 67, 67, 72, 73, 128, 67, 67, 72, 72, 85, 128, 67, 67, 72, 72, - 79, 128, 67, 67, 72, 72, 73, 128, 67, 67, 72, 72, 69, 69, 128, 67, 67, - 72, 72, 69, 128, 67, 67, 72, 72, 65, 65, 128, 67, 67, 72, 72, 65, 128, - 67, 67, 72, 69, 69, 128, 67, 67, 72, 69, 128, 67, 67, 72, 65, 65, 128, - 67, 67, 72, 65, 128, 67, 67, 72, 128, 67, 67, 69, 69, 128, 67, 67, 69, - 128, 67, 67, 65, 65, 128, 67, 67, 65, 128, 67, 65, 89, 78, 128, 67, 65, - 89, 65, 78, 78, 65, 128, 67, 65, 88, 128, 67, 65, 86, 69, 128, 67, 65, - 85, 84, 73, 79, 206, 67, 65, 85, 76, 68, 82, 79, 78, 128, 67, 65, 85, 68, - 65, 128, 67, 65, 85, 67, 65, 83, 73, 65, 206, 67, 65, 85, 128, 67, 65, - 84, 65, 87, 65, 128, 67, 65, 84, 128, 67, 65, 212, 67, 65, 83, 84, 76, - 69, 128, 67, 65, 83, 75, 69, 212, 67, 65, 82, 89, 83, 84, 73, 65, 206, - 67, 65, 82, 84, 87, 72, 69, 69, 76, 128, 67, 65, 82, 84, 82, 73, 68, 71, - 69, 128, 67, 65, 82, 84, 128, 67, 65, 82, 211, 67, 65, 82, 82, 79, 84, - 128, 67, 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, 80, 69, 78, 84, 82, - 217, 67, 65, 82, 208, 67, 65, 82, 79, 85, 83, 69, 204, 67, 65, 82, 79, - 78, 128, 67, 65, 82, 79, 206, 67, 65, 82, 73, 203, 67, 65, 82, 73, 65, - 206, 67, 65, 82, 69, 84, 128, 67, 65, 82, 69, 212, 67, 65, 82, 197, 67, - 65, 82, 68, 83, 128, 67, 65, 82, 68, 128, 67, 65, 82, 196, 67, 65, 82, - 128, 67, 65, 210, 67, 65, 80, 85, 212, 67, 65, 80, 84, 73, 86, 69, 128, - 67, 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, 65, 80, 80, 69, 196, 67, 65, - 80, 79, 128, 67, 65, 80, 73, 84, 85, 76, 85, 77, 128, 67, 65, 80, 73, 84, - 65, 76, 128, 67, 65, 78, 84, 73, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, - 79, 69, 128, 67, 65, 78, 78, 79, 78, 128, 67, 65, 78, 78, 69, 196, 67, - 65, 78, 199, 67, 65, 78, 69, 128, 67, 65, 78, 68, 89, 128, 67, 65, 78, - 68, 82, 65, 66, 73, 78, 68, 85, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, - 68, 213, 67, 65, 78, 68, 82, 65, 128, 67, 65, 78, 68, 82, 193, 67, 65, - 78, 68, 76, 69, 128, 67, 65, 78, 67, 69, 82, 128, 67, 65, 78, 67, 69, 76, - 76, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, 128, 67, 65, 78, 67, 69, - 204, 67, 65, 78, 128, 67, 65, 77, 80, 73, 78, 71, 128, 67, 65, 77, 78, - 85, 195, 67, 65, 77, 69, 82, 65, 128, 67, 65, 77, 69, 82, 193, 67, 65, - 77, 69, 76, 128, 67, 65, 76, 89, 65, 128, 67, 65, 76, 89, 193, 67, 65, - 76, 88, 128, 67, 65, 76, 76, 128, 67, 65, 76, 204, 67, 65, 76, 69, 78, - 68, 65, 82, 128, 67, 65, 76, 69, 78, 68, 65, 210, 67, 65, 76, 67, 85, 76, - 65, 84, 79, 82, 128, 67, 65, 76, 67, 128, 67, 65, 75, 82, 65, 128, 67, - 65, 75, 197, 67, 65, 73, 128, 67, 65, 72, 128, 67, 65, 69, 83, 85, 82, - 65, 128, 67, 65, 68, 85, 67, 69, 85, 83, 128, 67, 65, 68, 193, 67, 65, - 67, 84, 85, 83, 128, 67, 65, 66, 76, 69, 87, 65, 89, 128, 67, 65, 66, 73, - 78, 69, 84, 128, 67, 65, 66, 66, 65, 71, 69, 45, 84, 82, 69, 69, 128, 67, - 65, 65, 78, 71, 128, 67, 65, 65, 73, 128, 67, 193, 67, 48, 50, 52, 128, - 67, 48, 50, 51, 128, 67, 48, 50, 50, 128, 67, 48, 50, 49, 128, 67, 48, - 50, 48, 128, 67, 48, 49, 57, 128, 67, 48, 49, 56, 128, 67, 48, 49, 55, - 128, 67, 48, 49, 54, 128, 67, 48, 49, 53, 128, 67, 48, 49, 52, 128, 67, - 48, 49, 51, 128, 67, 48, 49, 50, 128, 67, 48, 49, 49, 128, 67, 48, 49, - 48, 65, 128, 67, 48, 49, 48, 128, 67, 48, 48, 57, 128, 67, 48, 48, 56, - 128, 67, 48, 48, 55, 128, 67, 48, 48, 54, 128, 67, 48, 48, 53, 128, 67, - 48, 48, 52, 128, 67, 48, 48, 51, 128, 67, 48, 48, 50, 67, 128, 67, 48, - 48, 50, 66, 128, 67, 48, 48, 50, 65, 128, 67, 48, 48, 50, 128, 67, 48, - 48, 49, 128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 67, 45, 51, - 57, 128, 67, 45, 49, 56, 128, 66, 90, 85, 78, 199, 66, 90, 72, 201, 66, - 89, 84, 197, 66, 89, 69, 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, - 82, 65, 73, 78, 73, 65, 206, 66, 88, 71, 128, 66, 87, 73, 128, 66, 87, - 69, 69, 128, 66, 87, 69, 128, 66, 87, 65, 128, 66, 85, 85, 77, 73, 83, - 72, 128, 66, 85, 84, 84, 79, 78, 128, 66, 85, 84, 84, 79, 206, 66, 85, - 84, 84, 69, 82, 70, 76, 89, 128, 66, 85, 84, 84, 69, 82, 128, 66, 85, - 212, 66, 85, 83, 84, 211, 66, 85, 83, 212, 66, 85, 83, 83, 89, 69, 82, - 85, 128, 66, 85, 83, 73, 78, 69, 83, 211, 66, 85, 211, 66, 85, 82, 213, - 66, 85, 82, 82, 73, 84, 79, 128, 66, 85, 82, 50, 128, 66, 85, 210, 66, - 85, 79, 88, 128, 66, 85, 79, 80, 128, 66, 85, 78, 78, 217, 66, 85, 78, - 71, 128, 66, 85, 77, 80, 217, 66, 85, 76, 85, 71, 128, 66, 85, 76, 85, - 199, 66, 85, 76, 76, 83, 69, 89, 69, 128, 66, 85, 76, 76, 211, 66, 85, - 76, 76, 72, 79, 82, 78, 128, 66, 85, 76, 76, 72, 79, 82, 206, 66, 85, 76, - 76, 69, 84, 128, 66, 85, 76, 76, 69, 212, 66, 85, 76, 76, 128, 66, 85, - 76, 66, 128, 66, 85, 75, 89, 128, 66, 85, 73, 76, 68, 73, 78, 71, 83, - 128, 66, 85, 73, 76, 68, 73, 78, 71, 128, 66, 85, 73, 76, 68, 73, 78, - 199, 66, 85, 72, 73, 196, 66, 85, 71, 73, 78, 69, 83, 197, 66, 85, 71, - 128, 66, 85, 70, 70, 65, 76, 79, 128, 66, 85, 68, 128, 66, 85, 67, 75, - 76, 69, 128, 66, 85, 66, 66, 76, 69, 83, 128, 66, 85, 66, 66, 76, 69, - 128, 66, 83, 84, 65, 82, 128, 66, 83, 75, 85, 210, 66, 83, 75, 65, 173, - 66, 83, 68, 85, 211, 66, 82, 85, 83, 200, 66, 82, 79, 87, 206, 66, 82, - 79, 79, 77, 128, 66, 82, 79, 78, 90, 69, 128, 66, 82, 79, 75, 69, 206, - 66, 82, 79, 67, 67, 79, 76, 73, 128, 66, 82, 79, 65, 196, 66, 82, 73, 83, - 84, 76, 69, 128, 66, 82, 73, 71, 72, 84, 78, 69, 83, 211, 66, 82, 73, 69, - 70, 83, 128, 66, 82, 73, 69, 70, 67, 65, 83, 69, 128, 66, 82, 73, 68, 71, - 197, 66, 82, 73, 68, 197, 66, 82, 73, 67, 75, 128, 66, 82, 73, 128, 66, - 82, 69, 86, 73, 83, 128, 66, 82, 69, 86, 69, 45, 77, 65, 67, 82, 79, 78, - 128, 66, 82, 69, 86, 197, 66, 82, 69, 65, 84, 200, 66, 82, 69, 65, 83, - 84, 45, 70, 69, 69, 68, 73, 78, 71, 128, 66, 82, 69, 65, 75, 84, 72, 82, - 79, 85, 71, 72, 128, 66, 82, 68, 193, 66, 82, 65, 78, 67, 72, 73, 78, - 199, 66, 82, 65, 78, 67, 72, 69, 83, 128, 66, 82, 65, 78, 67, 72, 128, - 66, 82, 65, 78, 67, 200, 66, 82, 65, 75, 67, 69, 84, 128, 66, 82, 65, 73, - 78, 128, 66, 82, 65, 67, 75, 69, 84, 69, 196, 66, 82, 65, 67, 75, 69, - 212, 66, 82, 65, 67, 69, 128, 66, 81, 128, 66, 80, 72, 128, 66, 79, 89, - 211, 66, 79, 89, 128, 66, 79, 88, 73, 78, 199, 66, 79, 87, 84, 73, 69, - 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, 76, 73, 78, 71, 128, 66, 79, - 87, 76, 128, 66, 79, 87, 204, 66, 79, 87, 73, 78, 199, 66, 79, 215, 66, - 79, 85, 81, 85, 69, 84, 128, 66, 79, 85, 81, 85, 69, 212, 66, 79, 85, 78, - 68, 65, 82, 217, 66, 79, 84, 84, 79, 77, 45, 83, 72, 65, 68, 69, 196, 66, - 79, 84, 84, 79, 77, 45, 76, 73, 71, 72, 84, 69, 196, 66, 79, 84, 84, 79, - 77, 128, 66, 79, 84, 84, 79, 205, 66, 79, 84, 84, 76, 69, 128, 66, 79, - 84, 84, 76, 197, 66, 79, 84, 200, 66, 79, 82, 85, 84, 79, 128, 66, 79, - 82, 65, 88, 45, 51, 128, 66, 79, 82, 65, 88, 45, 50, 128, 66, 79, 82, 65, - 88, 128, 66, 79, 80, 79, 77, 79, 70, 207, 66, 79, 79, 84, 83, 128, 66, - 79, 79, 84, 128, 66, 79, 79, 77, 69, 82, 65, 78, 71, 128, 66, 79, 79, 75, - 83, 128, 66, 79, 79, 75, 77, 65, 82, 75, 128, 66, 79, 79, 75, 77, 65, 82, - 203, 66, 79, 78, 69, 128, 66, 79, 77, 66, 128, 66, 79, 77, 128, 66, 79, - 76, 84, 128, 66, 79, 76, 212, 66, 79, 72, 65, 73, 82, 73, 195, 66, 79, - 68, 89, 128, 66, 79, 68, 217, 66, 79, 65, 82, 128, 66, 79, 65, 128, 66, - 76, 85, 69, 128, 66, 76, 85, 197, 66, 76, 79, 87, 73, 78, 199, 66, 76, - 79, 87, 70, 73, 83, 72, 128, 66, 76, 79, 215, 66, 76, 79, 83, 83, 79, 77, - 128, 66, 76, 79, 79, 68, 128, 66, 76, 79, 78, 196, 66, 76, 79, 67, 75, + 84, 69, 82, 45, 49, 56, 67, 68, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 68, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 68, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 68, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 68, + 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 68, 48, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 70, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 69, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 68, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 67, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 67, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 67, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 67, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, + 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 55, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 54, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 53, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 52, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 67, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 67, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 67, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 67, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, + 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 69, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 68, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 67, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 66, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 66, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 66, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 66, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 66, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, + 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 53, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 52, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 51, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 50, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 66, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 66, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 65, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 65, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, + 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 67, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 66, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 65, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 57, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 65, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 65, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 65, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 65, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, + 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 51, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 50, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 49, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 48, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 57, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 57, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 57, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 57, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, + 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 65, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 57, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 56, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 55, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 57, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 57, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 57, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 57, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, + 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 49, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 48, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 70, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 69, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 56, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 56, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 56, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 56, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, + 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 56, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 55, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 54, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 53, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 56, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 56, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 56, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 56, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, + 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 70, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 69, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 68, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 67, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 55, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 55, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 55, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 55, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, + 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 54, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 53, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 52, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 51, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 55, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 55, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 55, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 54, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, + 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 68, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 67, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 66, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 65, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 54, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 54, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 54, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 54, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, + 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 52, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 51, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 50, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 49, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 54, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 53, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 53, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 53, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, + 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 66, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 65, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 57, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 56, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 53, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 53, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 53, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 53, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, + 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 50, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 49, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 48, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 70, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 52, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 52, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 52, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 52, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, + 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 57, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 56, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 55, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 54, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 52, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 52, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 52, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 52, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, + 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 48, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 70, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 69, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 68, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 51, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 51, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 51, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 51, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, + 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 55, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 54, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 53, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 52, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 51, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 51, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 51, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 51, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, + 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 69, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 68, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 67, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 66, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 50, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 50, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 50, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 50, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, + 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 53, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 52, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 51, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 50, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 50, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 50, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 49, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 49, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, + 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 67, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 66, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 65, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 57, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 49, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 49, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 49, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 49, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, + 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 51, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 50, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 49, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 48, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 48, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 48, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 48, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 48, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, + 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 65, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 57, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 56, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 55, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 48, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 48, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 48, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 48, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, + 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 49, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 48, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 70, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 69, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 70, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 70, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 70, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 70, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, + 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 56, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 55, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 54, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 53, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 70, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 70, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 70, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 70, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, + 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 70, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 69, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 68, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 67, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 69, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 69, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 69, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 69, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, + 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 54, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 53, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 52, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 51, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 69, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 69, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 69, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 68, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, + 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 68, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 67, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 66, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 65, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 68, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 68, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 68, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 68, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, + 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 52, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 51, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 50, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 49, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 68, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 67, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 67, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 67, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, + 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 66, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 65, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 57, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 56, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 67, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 67, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 67, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 67, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, + 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 50, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 49, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 48, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 70, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 66, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 66, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 66, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 66, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, + 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 57, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 56, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 55, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 54, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 66, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 66, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 66, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 66, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, + 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 48, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 70, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 69, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 68, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 65, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 65, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 65, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 65, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, + 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 55, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 54, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 53, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 52, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 65, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 65, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 65, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 65, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, + 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 69, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 68, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 67, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 66, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 57, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 57, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 57, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 57, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, + 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 53, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 52, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 51, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 50, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 57, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 57, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 56, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 56, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, + 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 67, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 66, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 65, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 57, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 56, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 56, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 56, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 56, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, + 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 51, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 50, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 49, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 48, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 55, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 55, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 55, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 55, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, + 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 65, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 57, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 56, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 55, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 55, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 55, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 55, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 55, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, + 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 49, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 48, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 70, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 69, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 54, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 54, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 54, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 54, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, + 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 56, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 55, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 54, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 53, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 54, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 54, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 54, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 54, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, + 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 70, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 69, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 68, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 67, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 53, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 53, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 53, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 53, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, + 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 54, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 53, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 52, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 51, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 53, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 53, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 53, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 52, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, + 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 68, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 67, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 66, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 65, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 52, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 52, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 52, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 52, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, + 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 52, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 51, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 50, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 49, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 52, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 51, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 51, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 51, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, + 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 66, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 65, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 57, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 56, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 51, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 51, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 51, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 51, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, + 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 50, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 49, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 48, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 70, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 50, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 50, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 50, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 50, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, + 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 57, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 56, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 55, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 54, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 50, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 50, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 50, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 50, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, + 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 48, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 70, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 69, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 68, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 49, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 49, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 49, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 49, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, + 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 55, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 54, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 53, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 52, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 49, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 49, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 49, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 49, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, + 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 69, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 68, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 67, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 66, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 48, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 48, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 48, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 48, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, + 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 53, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 52, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 51, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 50, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 48, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 48, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 210, 67, 72, 65, 82, 128, 67, 72, 65, 80, + 84, 69, 82, 128, 67, 72, 65, 80, 128, 67, 72, 65, 78, 71, 128, 67, 72, + 65, 78, 128, 67, 72, 65, 77, 75, 79, 128, 67, 72, 65, 77, 73, 76, 79, 78, + 128, 67, 72, 65, 77, 73, 76, 73, 128, 67, 72, 65, 205, 67, 72, 65, 75, + 77, 193, 67, 72, 65, 73, 78, 83, 128, 67, 72, 65, 68, 65, 128, 67, 72, + 65, 196, 67, 72, 65, 65, 128, 67, 71, 74, 128, 67, 69, 88, 128, 67, 69, + 86, 73, 84, 85, 128, 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 77, 79, 78, + 89, 128, 67, 69, 82, 69, 75, 128, 67, 69, 82, 45, 87, 65, 128, 67, 69, + 80, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, + 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, + 65, 78, 71, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, + 85, 77, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, + 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, + 72, 73, 69, 85, 67, 72, 128, 67, 69, 78, 84, 85, 82, 73, 65, 204, 67, 69, + 78, 84, 82, 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, 69, 68, 128, 67, 69, + 78, 84, 82, 69, 196, 67, 69, 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, + 197, 67, 69, 78, 84, 82, 65, 76, 73, 90, 65, 84, 73, 79, 206, 67, 69, 78, + 128, 67, 69, 76, 84, 73, 195, 67, 69, 76, 83, 73, 85, 83, 128, 67, 69, + 76, 69, 66, 82, 65, 84, 73, 79, 78, 128, 67, 69, 73, 82, 84, 128, 67, 69, + 73, 76, 73, 78, 71, 128, 67, 69, 73, 76, 73, 78, 199, 67, 69, 69, 86, + 128, 67, 69, 69, 66, 128, 67, 69, 69, 128, 67, 69, 68, 73, 76, 76, 65, + 128, 67, 69, 68, 73, 76, 76, 193, 67, 69, 68, 201, 67, 69, 67, 69, 75, + 128, 67, 69, 67, 65, 75, 128, 67, 69, 67, 65, 203, 67, 69, 65, 76, 67, + 128, 67, 67, 85, 128, 67, 67, 79, 128, 67, 67, 73, 128, 67, 67, 72, 85, + 128, 67, 67, 72, 79, 128, 67, 67, 72, 73, 128, 67, 67, 72, 72, 85, 128, + 67, 67, 72, 72, 79, 128, 67, 67, 72, 72, 73, 128, 67, 67, 72, 72, 69, 69, + 128, 67, 67, 72, 72, 69, 128, 67, 67, 72, 72, 65, 65, 128, 67, 67, 72, + 72, 65, 128, 67, 67, 72, 69, 69, 128, 67, 67, 72, 69, 128, 67, 67, 72, + 65, 65, 128, 67, 67, 72, 65, 128, 67, 67, 72, 128, 67, 67, 69, 69, 128, + 67, 67, 65, 65, 128, 67, 65, 89, 78, 128, 67, 65, 89, 65, 78, 78, 65, + 128, 67, 65, 88, 128, 67, 65, 86, 69, 128, 67, 65, 85, 84, 73, 79, 206, + 67, 65, 85, 76, 68, 82, 79, 78, 128, 67, 65, 85, 68, 65, 128, 67, 65, 85, + 67, 65, 83, 73, 65, 206, 67, 65, 85, 128, 67, 65, 84, 65, 87, 65, 128, + 67, 65, 84, 128, 67, 65, 212, 67, 65, 83, 84, 76, 69, 128, 67, 65, 83, + 75, 69, 212, 67, 65, 82, 89, 83, 84, 73, 65, 206, 67, 65, 82, 84, 87, 72, + 69, 69, 76, 128, 67, 65, 82, 84, 82, 73, 68, 71, 69, 128, 67, 65, 82, 84, + 128, 67, 65, 82, 211, 67, 65, 82, 82, 79, 84, 128, 67, 65, 82, 82, 73, + 65, 71, 197, 67, 65, 82, 80, 69, 78, 84, 82, 217, 67, 65, 82, 208, 67, + 65, 82, 79, 85, 83, 69, 204, 67, 65, 82, 79, 78, 128, 67, 65, 82, 79, + 206, 67, 65, 82, 73, 203, 67, 65, 82, 73, 65, 206, 67, 65, 82, 69, 84, + 128, 67, 65, 82, 69, 212, 67, 65, 82, 197, 67, 65, 82, 68, 83, 128, 67, + 65, 82, 196, 67, 65, 82, 128, 67, 65, 210, 67, 65, 80, 85, 212, 67, 65, + 80, 84, 73, 86, 69, 128, 67, 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, 65, + 80, 80, 69, 196, 67, 65, 80, 79, 128, 67, 65, 80, 73, 84, 85, 76, 85, 77, + 128, 67, 65, 80, 73, 84, 65, 76, 128, 67, 65, 78, 84, 73, 76, 76, 65, 84, + 73, 79, 206, 67, 65, 78, 79, 69, 128, 67, 65, 78, 78, 79, 78, 128, 67, + 65, 78, 78, 69, 196, 67, 65, 78, 199, 67, 65, 78, 69, 128, 67, 65, 78, + 68, 89, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 85, 128, 67, 65, 78, + 68, 82, 65, 66, 73, 78, 68, 213, 67, 65, 78, 68, 82, 65, 128, 67, 65, 78, + 68, 82, 193, 67, 65, 78, 68, 76, 69, 128, 67, 65, 78, 67, 69, 82, 128, + 67, 65, 78, 67, 69, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, + 128, 67, 65, 78, 67, 69, 204, 67, 65, 78, 128, 67, 65, 77, 80, 73, 78, + 71, 128, 67, 65, 77, 78, 85, 195, 67, 65, 77, 69, 82, 65, 128, 67, 65, + 77, 69, 82, 193, 67, 65, 77, 69, 76, 128, 67, 65, 76, 89, 65, 128, 67, + 65, 76, 89, 193, 67, 65, 76, 88, 128, 67, 65, 76, 76, 128, 67, 65, 76, + 204, 67, 65, 76, 69, 78, 68, 65, 82, 128, 67, 65, 76, 69, 78, 68, 65, + 210, 67, 65, 76, 67, 85, 76, 65, 84, 79, 82, 128, 67, 65, 76, 67, 128, + 67, 65, 75, 82, 65, 128, 67, 65, 75, 197, 67, 65, 73, 128, 67, 65, 72, + 128, 67, 65, 69, 83, 85, 82, 65, 128, 67, 65, 68, 85, 67, 69, 85, 83, + 128, 67, 65, 68, 193, 67, 65, 67, 84, 85, 83, 128, 67, 65, 66, 76, 69, + 87, 65, 89, 128, 67, 65, 66, 73, 78, 69, 84, 128, 67, 65, 66, 66, 65, 71, + 69, 45, 84, 82, 69, 69, 128, 67, 65, 65, 78, 71, 128, 67, 65, 65, 73, + 128, 67, 193, 67, 48, 50, 52, 128, 67, 48, 50, 51, 128, 67, 48, 50, 50, + 128, 67, 48, 50, 49, 128, 67, 48, 50, 48, 128, 67, 48, 49, 57, 128, 67, + 48, 49, 56, 128, 67, 48, 49, 55, 128, 67, 48, 49, 54, 128, 67, 48, 49, + 53, 128, 67, 48, 49, 52, 128, 67, 48, 49, 51, 128, 67, 48, 49, 50, 128, + 67, 48, 49, 49, 128, 67, 48, 49, 48, 65, 128, 67, 48, 49, 48, 128, 67, + 48, 48, 57, 128, 67, 48, 48, 56, 128, 67, 48, 48, 55, 128, 67, 48, 48, + 54, 128, 67, 48, 48, 53, 128, 67, 48, 48, 52, 128, 67, 48, 48, 51, 128, + 67, 48, 48, 50, 67, 128, 67, 48, 48, 50, 66, 128, 67, 48, 48, 50, 65, + 128, 67, 48, 48, 50, 128, 67, 48, 48, 49, 128, 67, 45, 83, 73, 77, 80, + 76, 73, 70, 73, 69, 196, 67, 45, 51, 57, 128, 67, 45, 49, 56, 128, 66, + 90, 85, 78, 199, 66, 90, 72, 201, 66, 89, 84, 197, 66, 89, 69, 76, 79, + 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, 82, 65, 73, 78, 73, 65, 206, 66, + 88, 71, 128, 66, 87, 73, 128, 66, 87, 69, 69, 128, 66, 87, 69, 128, 66, + 87, 65, 128, 66, 85, 85, 77, 73, 83, 72, 128, 66, 85, 84, 84, 79, 78, + 128, 66, 85, 84, 84, 79, 206, 66, 85, 84, 84, 69, 82, 70, 76, 89, 128, + 66, 85, 84, 84, 69, 82, 128, 66, 85, 212, 66, 85, 83, 84, 211, 66, 85, + 83, 212, 66, 85, 83, 83, 89, 69, 82, 85, 128, 66, 85, 83, 73, 78, 69, 83, + 211, 66, 85, 211, 66, 85, 82, 213, 66, 85, 82, 82, 73, 84, 79, 128, 66, + 85, 82, 50, 128, 66, 85, 210, 66, 85, 79, 88, 128, 66, 85, 79, 80, 128, + 66, 85, 78, 78, 217, 66, 85, 78, 71, 128, 66, 85, 77, 80, 217, 66, 85, + 76, 85, 71, 128, 66, 85, 76, 85, 199, 66, 85, 76, 76, 83, 69, 89, 69, + 128, 66, 85, 76, 76, 211, 66, 85, 76, 76, 72, 79, 82, 78, 128, 66, 85, + 76, 76, 72, 79, 82, 206, 66, 85, 76, 76, 69, 84, 128, 66, 85, 76, 76, 69, + 212, 66, 85, 76, 76, 128, 66, 85, 76, 66, 128, 66, 85, 75, 89, 128, 66, + 85, 73, 76, 68, 73, 78, 71, 83, 128, 66, 85, 73, 76, 68, 73, 78, 71, 128, + 66, 85, 73, 76, 68, 73, 78, 199, 66, 85, 72, 73, 196, 66, 85, 71, 73, 78, + 69, 83, 197, 66, 85, 71, 128, 66, 85, 70, 70, 65, 76, 79, 128, 66, 85, + 68, 128, 66, 85, 67, 75, 76, 69, 128, 66, 85, 67, 75, 69, 84, 128, 66, + 85, 66, 66, 76, 69, 83, 128, 66, 85, 66, 66, 76, 69, 128, 66, 85, 66, 66, + 76, 197, 66, 83, 84, 65, 82, 128, 66, 83, 75, 85, 210, 66, 83, 75, 65, + 173, 66, 83, 68, 85, 211, 66, 82, 85, 83, 200, 66, 82, 79, 87, 206, 66, + 82, 79, 79, 77, 128, 66, 82, 79, 78, 90, 69, 128, 66, 82, 79, 75, 69, + 206, 66, 82, 79, 67, 67, 79, 76, 73, 128, 66, 82, 79, 65, 196, 66, 82, + 73, 83, 84, 76, 69, 128, 66, 82, 73, 71, 72, 84, 78, 69, 83, 211, 66, 82, + 73, 69, 70, 83, 128, 66, 82, 73, 69, 70, 67, 65, 83, 69, 128, 66, 82, 73, + 68, 71, 197, 66, 82, 73, 68, 197, 66, 82, 73, 67, 75, 128, 66, 82, 73, + 128, 66, 82, 69, 86, 73, 83, 128, 66, 82, 69, 86, 69, 45, 77, 65, 67, 82, + 79, 78, 128, 66, 82, 69, 86, 197, 66, 82, 69, 65, 84, 200, 66, 82, 69, + 65, 83, 84, 45, 70, 69, 69, 68, 73, 78, 71, 128, 66, 82, 69, 65, 75, 84, + 72, 82, 79, 85, 71, 72, 128, 66, 82, 68, 193, 66, 82, 65, 78, 67, 72, 73, + 78, 199, 66, 82, 65, 78, 67, 72, 69, 83, 128, 66, 82, 65, 78, 67, 72, + 128, 66, 82, 65, 78, 67, 200, 66, 82, 65, 75, 67, 69, 84, 128, 66, 82, + 65, 73, 78, 128, 66, 82, 65, 67, 75, 69, 84, 69, 196, 66, 82, 65, 67, 75, + 69, 212, 66, 82, 65, 67, 69, 128, 66, 81, 128, 66, 80, 72, 128, 66, 79, + 89, 211, 66, 79, 89, 128, 66, 79, 88, 73, 78, 199, 66, 79, 87, 84, 73, + 69, 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, 76, 73, 78, 71, 128, 66, + 79, 87, 76, 128, 66, 79, 87, 204, 66, 79, 87, 73, 78, 199, 66, 79, 215, + 66, 79, 85, 81, 85, 69, 84, 128, 66, 79, 85, 81, 85, 69, 212, 66, 79, 85, + 78, 68, 65, 82, 217, 66, 79, 84, 84, 79, 77, 45, 83, 72, 65, 68, 69, 196, + 66, 79, 84, 84, 79, 77, 45, 76, 73, 71, 72, 84, 69, 196, 66, 79, 84, 84, + 79, 77, 128, 66, 79, 84, 84, 79, 205, 66, 79, 84, 84, 76, 69, 128, 66, + 79, 84, 84, 76, 197, 66, 79, 84, 200, 66, 79, 82, 85, 84, 79, 128, 66, + 79, 82, 65, 88, 45, 51, 128, 66, 79, 82, 65, 88, 45, 50, 128, 66, 79, 82, + 65, 88, 128, 66, 79, 80, 79, 77, 79, 70, 207, 66, 79, 79, 84, 83, 128, + 66, 79, 79, 84, 128, 66, 79, 79, 77, 69, 82, 65, 78, 71, 128, 66, 79, 79, + 75, 83, 128, 66, 79, 79, 75, 77, 65, 82, 75, 128, 66, 79, 79, 75, 77, 65, + 82, 203, 66, 79, 78, 69, 128, 66, 79, 77, 66, 128, 66, 79, 77, 128, 66, + 79, 76, 84, 128, 66, 79, 76, 212, 66, 79, 72, 65, 73, 82, 73, 195, 66, + 79, 68, 89, 128, 66, 79, 68, 217, 66, 79, 65, 82, 128, 66, 79, 65, 128, + 66, 76, 85, 69, 66, 69, 82, 82, 73, 69, 83, 128, 66, 76, 85, 69, 128, 66, + 76, 85, 197, 66, 76, 79, 87, 73, 78, 199, 66, 76, 79, 87, 70, 73, 83, 72, + 128, 66, 76, 79, 215, 66, 76, 79, 83, 83, 79, 77, 128, 66, 76, 79, 79, + 68, 128, 66, 76, 79, 78, 196, 66, 76, 79, 67, 75, 45, 55, 128, 66, 76, + 79, 67, 75, 45, 54, 128, 66, 76, 79, 67, 75, 45, 53, 128, 66, 76, 79, 67, + 75, 45, 52, 128, 66, 76, 79, 67, 75, 45, 51, 128, 66, 76, 79, 67, 75, 45, + 50, 128, 66, 76, 79, 67, 75, 45, 49, 51, 53, 56, 128, 66, 76, 79, 67, 75, 128, 66, 76, 73, 78, 203, 66, 76, 65, 78, 75, 128, 66, 76, 65, 78, 203, 66, 76, 65, 68, 197, 66, 76, 65, 67, 75, 76, 69, 84, 84, 69, 210, 66, 76, 65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67, 75, 45, 76, 69, 84, 84, 69, 210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 66, 76, 65, 67, 75, 128, 66, 75, 65, 173, 66, 73, 84, 84, 69, 82, 128, 66, 73, 84, 73, 78, 199, 66, 73, 84, 197, 66, 73, 84, 67, 79, 73, 206, 66, 73, - 83, 77, 85, 84, 200, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, 73, 83, 72, - 79, 208, 66, 73, 83, 69, 67, 84, 73, 78, 199, 66, 73, 83, 65, 72, 128, - 66, 73, 82, 85, 128, 66, 73, 82, 84, 72, 68, 65, 217, 66, 73, 82, 71, 65, - 128, 66, 73, 82, 71, 193, 66, 73, 82, 68, 128, 66, 73, 79, 72, 65, 90, - 65, 82, 196, 66, 73, 78, 79, 86, 73, 76, 69, 128, 66, 73, 78, 79, 67, 85, - 76, 65, 210, 66, 73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, 128, 66, - 73, 78, 65, 82, 217, 66, 73, 76, 76, 73, 79, 78, 83, 128, 66, 73, 76, 76, - 73, 65, 82, 68, 83, 128, 66, 73, 76, 76, 69, 196, 66, 73, 76, 65, 66, 73, - 65, 204, 66, 73, 75, 73, 78, 73, 128, 66, 73, 71, 128, 66, 73, 199, 66, - 73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, 66, 73, 68, 65, 75, 85, - 79, 206, 66, 73, 67, 89, 67, 76, 73, 83, 84, 128, 66, 73, 67, 89, 67, 76, - 69, 83, 128, 66, 73, 67, 89, 67, 76, 69, 128, 66, 73, 67, 69, 80, 83, - 128, 66, 73, 66, 76, 69, 45, 67, 82, 69, 197, 66, 73, 66, 128, 66, 201, - 66, 72, 85, 128, 66, 72, 79, 79, 128, 66, 72, 79, 128, 66, 72, 73, 128, - 66, 72, 69, 84, 72, 128, 66, 72, 69, 69, 128, 66, 72, 69, 128, 66, 72, - 65, 84, 84, 73, 80, 82, 79, 76, 213, 66, 72, 65, 77, 128, 66, 72, 65, 73, - 75, 83, 85, 75, 201, 66, 72, 65, 65, 128, 66, 72, 65, 128, 66, 69, 89, - 89, 65, 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, 82, 65, 71, 69, 128, - 66, 69, 86, 69, 82, 65, 71, 197, 66, 69, 84, 87, 69, 69, 78, 128, 66, 69, - 84, 87, 69, 69, 206, 66, 69, 84, 72, 128, 66, 69, 84, 65, 128, 66, 69, - 84, 193, 66, 69, 212, 66, 69, 83, 73, 68, 197, 66, 69, 82, 75, 65, 78, - 65, 206, 66, 69, 82, 66, 69, 210, 66, 69, 80, 128, 66, 69, 79, 82, 195, - 66, 69, 78, 90, 69, 78, 197, 66, 69, 78, 84, 207, 66, 69, 78, 84, 128, - 66, 69, 78, 212, 66, 69, 78, 71, 65, 76, 201, 66, 69, 78, 68, 69, 128, - 66, 69, 78, 68, 128, 66, 69, 78, 196, 66, 69, 206, 66, 69, 76, 84, 128, - 66, 69, 76, 212, 66, 69, 76, 79, 215, 66, 69, 76, 76, 72, 79, 208, 66, - 69, 76, 76, 128, 66, 69, 76, 204, 66, 69, 76, 71, 84, 72, 79, 210, 66, - 69, 73, 84, 72, 128, 66, 69, 72, 73, 78, 196, 66, 69, 72, 69, 72, 128, - 66, 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, 66, 69, 71, 73, 78, - 78, 73, 78, 71, 128, 66, 69, 71, 73, 78, 78, 69, 82, 128, 66, 69, 71, 73, - 206, 66, 69, 70, 79, 82, 197, 66, 69, 69, 84, 76, 69, 128, 66, 69, 69, - 84, 65, 128, 66, 69, 69, 210, 66, 69, 69, 72, 73, 86, 69, 128, 66, 69, - 69, 72, 128, 66, 69, 69, 200, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, - 65, 86, 69, 210, 66, 69, 65, 84, 73, 78, 199, 66, 69, 65, 84, 128, 66, - 69, 65, 82, 68, 69, 196, 66, 69, 65, 82, 128, 66, 69, 65, 210, 66, 69, - 65, 78, 128, 66, 69, 65, 77, 69, 196, 66, 69, 65, 68, 83, 128, 66, 69, - 65, 67, 200, 66, 67, 65, 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, - 66, 66, 89, 84, 128, 66, 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, - 88, 128, 66, 66, 85, 84, 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, - 128, 66, 66, 85, 80, 128, 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, - 128, 66, 66, 85, 79, 128, 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, - 79, 84, 128, 66, 66, 79, 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, - 66, 66, 73, 80, 128, 66, 66, 73, 69, 88, 128, 66, 66, 73, 69, 84, 128, - 66, 66, 73, 69, 80, 128, 66, 66, 73, 69, 128, 66, 66, 73, 128, 66, 66, - 69, 88, 128, 66, 66, 69, 80, 128, 66, 66, 69, 69, 128, 66, 66, 69, 128, - 66, 66, 65, 88, 128, 66, 66, 65, 84, 128, 66, 66, 65, 80, 128, 66, 66, - 65, 65, 128, 66, 66, 65, 128, 66, 65, 89, 65, 78, 78, 65, 128, 66, 65, - 85, 128, 66, 65, 84, 84, 69, 82, 89, 128, 66, 65, 84, 72, 84, 85, 66, - 128, 66, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 66, 65, 84, 72, 128, - 66, 65, 84, 200, 66, 65, 84, 65, 203, 66, 65, 83, 83, 65, 128, 66, 65, - 83, 83, 193, 66, 65, 83, 75, 69, 84, 66, 65, 76, 204, 66, 65, 83, 72, 75, - 73, 210, 66, 65, 83, 72, 128, 66, 65, 83, 69, 76, 73, 78, 197, 66, 65, - 83, 69, 66, 65, 76, 76, 128, 66, 65, 83, 69, 128, 66, 65, 83, 197, 66, - 65, 82, 83, 128, 66, 65, 82, 211, 66, 65, 82, 82, 73, 69, 82, 128, 66, - 65, 82, 82, 69, 75, 72, 128, 66, 65, 82, 82, 69, 69, 128, 66, 65, 82, 82, - 69, 197, 66, 65, 82, 76, 73, 78, 69, 128, 66, 65, 82, 76, 69, 89, 128, - 66, 65, 82, 73, 89, 79, 79, 83, 65, 78, 128, 66, 65, 82, 66, 69, 210, 66, - 65, 82, 65, 50, 128, 66, 65, 210, 66, 65, 78, 84, 79, 67, 128, 66, 65, - 78, 75, 78, 79, 84, 197, 66, 65, 78, 75, 128, 66, 65, 78, 203, 66, 65, - 78, 74, 79, 128, 66, 65, 78, 68, 128, 66, 65, 78, 65, 78, 65, 128, 66, - 65, 78, 50, 128, 66, 65, 78, 178, 66, 65, 77, 66, 79, 79, 83, 128, 66, - 65, 77, 66, 79, 79, 128, 66, 65, 76, 85, 68, 65, 128, 66, 65, 76, 76, 80, - 79, 73, 78, 212, 66, 65, 76, 76, 79, 84, 128, 66, 65, 76, 76, 79, 212, - 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, 75, 69, 196, 66, 65, 76, 76, - 79, 79, 78, 128, 66, 65, 76, 76, 69, 212, 66, 65, 76, 68, 128, 66, 65, - 76, 65, 71, 128, 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, 82, 75, 65, - 78, 128, 66, 65, 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, 66, 65, 72, - 73, 82, 71, 79, 77, 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, 50, 128, 66, - 65, 72, 65, 82, 178, 66, 65, 72, 128, 66, 65, 71, 85, 69, 84, 84, 197, - 66, 65, 71, 83, 128, 66, 65, 71, 71, 65, 71, 197, 66, 65, 71, 69, 76, - 128, 66, 65, 71, 65, 128, 66, 65, 71, 51, 128, 66, 65, 199, 66, 65, 68, - 77, 73, 78, 84, 79, 206, 66, 65, 68, 71, 69, 82, 128, 66, 65, 68, 71, 69, - 128, 66, 65, 68, 128, 66, 65, 196, 66, 65, 67, 84, 82, 73, 65, 206, 66, - 65, 67, 79, 78, 128, 66, 65, 67, 75, 87, 65, 82, 68, 128, 66, 65, 67, 75, - 83, 80, 65, 67, 69, 128, 66, 65, 67, 75, 83, 76, 65, 83, 72, 128, 66, 65, - 67, 75, 83, 76, 65, 83, 200, 66, 65, 67, 75, 83, 76, 65, 78, 84, 69, 196, - 66, 65, 67, 75, 72, 65, 78, 196, 66, 65, 67, 75, 45, 84, 73, 76, 84, 69, - 196, 66, 65, 67, 75, 128, 66, 65, 67, 203, 66, 65, 66, 89, 128, 66, 65, - 66, 217, 66, 65, 65, 82, 69, 82, 85, 128, 66, 65, 45, 50, 128, 66, 51, - 48, 53, 128, 66, 50, 53, 180, 66, 50, 52, 183, 66, 50, 52, 179, 66, 50, - 52, 178, 66, 50, 52, 177, 66, 50, 52, 176, 66, 50, 51, 179, 66, 50, 51, - 177, 66, 50, 51, 176, 66, 50, 50, 181, 66, 50, 50, 176, 66, 49, 57, 177, - 66, 49, 55, 182, 66, 49, 55, 179, 66, 49, 54, 57, 128, 66, 49, 54, 56, - 128, 66, 49, 54, 55, 128, 66, 49, 54, 54, 128, 66, 49, 54, 53, 128, 66, - 49, 54, 52, 128, 66, 49, 54, 179, 66, 49, 54, 178, 66, 49, 54, 49, 128, - 66, 49, 54, 48, 128, 66, 49, 53, 185, 66, 49, 53, 56, 128, 66, 49, 53, - 55, 128, 66, 49, 53, 182, 66, 49, 53, 53, 128, 66, 49, 53, 52, 128, 66, - 49, 53, 51, 128, 66, 49, 53, 50, 128, 66, 49, 53, 177, 66, 49, 53, 48, - 128, 66, 49, 52, 54, 128, 66, 49, 52, 181, 66, 49, 52, 50, 128, 66, 49, - 52, 177, 66, 49, 52, 176, 66, 49, 51, 181, 66, 49, 51, 179, 66, 49, 51, - 50, 128, 66, 49, 51, 177, 66, 49, 51, 176, 66, 49, 50, 184, 66, 49, 50, - 183, 66, 49, 50, 181, 66, 49, 50, 179, 66, 49, 50, 178, 66, 49, 50, 177, - 66, 49, 50, 176, 66, 49, 48, 57, 205, 66, 49, 48, 57, 198, 66, 49, 48, - 56, 205, 66, 49, 48, 56, 198, 66, 49, 48, 55, 205, 66, 49, 48, 55, 198, - 66, 49, 48, 54, 205, 66, 49, 48, 54, 198, 66, 49, 48, 53, 205, 66, 49, - 48, 53, 198, 66, 49, 48, 181, 66, 49, 48, 180, 66, 49, 48, 178, 66, 49, - 48, 176, 66, 48, 57, 177, 66, 48, 57, 176, 66, 48, 56, 57, 128, 66, 48, - 56, 183, 66, 48, 56, 54, 128, 66, 48, 56, 181, 66, 48, 56, 51, 128, 66, - 48, 56, 50, 128, 66, 48, 56, 177, 66, 48, 56, 176, 66, 48, 55, 57, 128, - 66, 48, 55, 184, 66, 48, 55, 183, 66, 48, 55, 182, 66, 48, 55, 181, 66, - 48, 55, 180, 66, 48, 55, 179, 66, 48, 55, 178, 66, 48, 55, 177, 66, 48, - 55, 176, 66, 48, 54, 185, 66, 48, 54, 184, 66, 48, 54, 183, 66, 48, 54, - 182, 66, 48, 54, 181, 66, 48, 54, 52, 128, 66, 48, 54, 51, 128, 66, 48, - 54, 178, 66, 48, 54, 177, 66, 48, 54, 176, 66, 48, 53, 185, 66, 48, 53, - 184, 66, 48, 53, 183, 66, 48, 53, 54, 128, 66, 48, 53, 181, 66, 48, 53, - 180, 66, 48, 53, 179, 66, 48, 53, 178, 66, 48, 53, 177, 66, 48, 53, 176, - 66, 48, 52, 57, 128, 66, 48, 52, 184, 66, 48, 52, 55, 128, 66, 48, 52, - 182, 66, 48, 52, 181, 66, 48, 52, 180, 66, 48, 52, 179, 66, 48, 52, 178, - 66, 48, 52, 177, 66, 48, 52, 176, 66, 48, 51, 185, 66, 48, 51, 184, 66, - 48, 51, 183, 66, 48, 51, 182, 66, 48, 51, 52, 128, 66, 48, 51, 179, 66, - 48, 51, 178, 66, 48, 51, 177, 66, 48, 51, 176, 66, 48, 50, 185, 66, 48, - 50, 184, 66, 48, 50, 183, 66, 48, 50, 182, 66, 48, 50, 181, 66, 48, 50, - 180, 66, 48, 50, 179, 66, 48, 50, 50, 128, 66, 48, 50, 177, 66, 48, 50, - 176, 66, 48, 49, 57, 128, 66, 48, 49, 56, 128, 66, 48, 49, 183, 66, 48, - 49, 182, 66, 48, 49, 181, 66, 48, 49, 180, 66, 48, 49, 179, 66, 48, 49, - 178, 66, 48, 49, 177, 66, 48, 49, 176, 66, 48, 48, 57, 128, 66, 48, 48, - 185, 66, 48, 48, 56, 128, 66, 48, 48, 184, 66, 48, 48, 55, 128, 66, 48, - 48, 183, 66, 48, 48, 54, 128, 66, 48, 48, 182, 66, 48, 48, 53, 65, 128, - 66, 48, 48, 53, 128, 66, 48, 48, 181, 66, 48, 48, 52, 128, 66, 48, 48, - 180, 66, 48, 48, 51, 128, 66, 48, 48, 179, 66, 48, 48, 50, 128, 66, 48, - 48, 178, 66, 48, 48, 49, 128, 66, 48, 48, 177, 65, 90, 85, 128, 65, 89, - 66, 128, 65, 89, 65, 72, 128, 65, 88, 69, 128, 65, 87, 69, 128, 65, 87, - 65, 217, 65, 86, 79, 67, 65, 68, 79, 128, 65, 86, 69, 83, 84, 65, 206, - 65, 86, 69, 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, - 89, 65, 128, 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, - 65, 128, 65, 85, 84, 85, 77, 78, 128, 65, 85, 84, 79, 77, 79, 66, 73, 76, - 69, 128, 65, 85, 84, 79, 77, 65, 84, 69, 196, 65, 85, 84, 207, 65, 85, - 83, 84, 82, 65, 204, 65, 85, 82, 73, 80, 73, 71, 77, 69, 78, 84, 128, 65, - 85, 82, 65, 77, 65, 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, - 90, 68, 65, 65, 45, 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, - 65, 85, 78, 78, 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, 71, 77, 69, 78, - 84, 65, 84, 73, 79, 206, 65, 85, 69, 128, 65, 85, 66, 69, 82, 71, 73, 78, - 69, 128, 65, 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, 65, 78, 128, 65, - 84, 84, 69, 78, 84, 73, 79, 78, 128, 65, 84, 84, 65, 203, 65, 84, 84, 65, - 67, 72, 69, 196, 65, 84, 79, 205, 65, 84, 78, 65, 200, 65, 84, 77, 65, - 65, 85, 128, 65, 84, 73, 89, 65, 128, 65, 84, 73, 85, 128, 65, 84, 73, - 75, 82, 65, 77, 65, 128, 65, 84, 72, 76, 69, 84, 73, 195, 65, 84, 72, 65, - 82, 86, 65, 86, 69, 68, 73, 195, 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, - 65, 84, 72, 45, 84, 72, 65, 76, 65, 84, 72, 65, 128, 65, 83, 90, 128, 65, - 83, 89, 85, 82, 193, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, - 217, 65, 83, 84, 82, 79, 78, 79, 77, 73, 67, 65, 204, 65, 83, 84, 82, 79, - 76, 79, 71, 73, 67, 65, 204, 65, 83, 84, 82, 65, 69, 65, 128, 65, 83, 84, - 79, 78, 73, 83, 72, 69, 196, 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 83, - 84, 69, 82, 73, 83, 75, 211, 65, 83, 84, 69, 82, 73, 83, 75, 128, 65, 83, - 84, 69, 82, 73, 83, 203, 65, 83, 84, 69, 82, 73, 83, 67, 85, 83, 128, 65, - 83, 83, 89, 82, 73, 65, 206, 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, 65, - 83, 80, 73, 82, 65, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82, 65, 84, 69, - 196, 65, 83, 80, 69, 82, 128, 65, 83, 73, 65, 45, 65, 85, 83, 84, 82, 65, - 76, 73, 65, 128, 65, 83, 72, 71, 65, 66, 128, 65, 83, 72, 69, 83, 128, - 65, 83, 72, 57, 128, 65, 83, 72, 51, 128, 65, 83, 72, 178, 65, 83, 67, - 69, 78, 84, 128, 65, 83, 67, 69, 78, 68, 73, 78, 199, 65, 83, 65, 76, 50, - 128, 65, 83, 45, 83, 65, 74, 68, 65, 128, 65, 82, 85, 72, 85, 65, 128, - 65, 82, 84, 211, 65, 82, 84, 73, 83, 212, 65, 82, 84, 73, 67, 85, 76, 65, - 84, 69, 196, 65, 82, 84, 65, 66, 197, 65, 82, 84, 65, 128, 65, 82, 83, - 69, 79, 83, 128, 65, 82, 83, 69, 79, 211, 65, 82, 83, 69, 78, 73, 67, - 128, 65, 82, 82, 79, 87, 83, 128, 65, 82, 82, 79, 87, 211, 65, 82, 82, - 79, 87, 72, 69, 65, 68, 83, 128, 65, 82, 82, 79, 87, 72, 69, 65, 68, 128, - 65, 82, 82, 79, 87, 72, 69, 65, 196, 65, 82, 82, 79, 87, 45, 84, 65, 73, - 76, 128, 65, 82, 82, 73, 86, 73, 78, 71, 128, 65, 82, 82, 73, 86, 69, - 128, 65, 82, 82, 65, 89, 128, 65, 82, 80, 69, 71, 71, 73, 65, 84, 207, - 65, 82, 79, 85, 83, 73, 78, 199, 65, 82, 79, 85, 82, 193, 65, 82, 79, 85, - 78, 68, 45, 80, 82, 79, 70, 73, 76, 69, 128, 65, 82, 79, 85, 78, 196, 65, - 82, 77, 89, 128, 65, 82, 77, 79, 85, 82, 128, 65, 82, 77, 69, 78, 73, 65, - 206, 65, 82, 77, 128, 65, 82, 205, 65, 82, 76, 65, 85, 199, 65, 82, 75, - 84, 73, 75, 207, 65, 82, 75, 65, 66, 128, 65, 82, 75, 65, 65, 78, 85, - 128, 65, 82, 73, 83, 84, 69, 82, 65, 128, 65, 82, 73, 83, 84, 69, 82, - 193, 65, 82, 73, 69, 83, 128, 65, 82, 71, 79, 84, 69, 82, 73, 128, 65, - 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, 65, 82, 71, 73, 128, - 65, 82, 69, 80, 65, 128, 65, 82, 69, 65, 128, 65, 82, 68, 72, 65, 86, 73, - 83, 65, 82, 71, 65, 128, 65, 82, 68, 72, 65, 67, 65, 78, 68, 82, 65, 128, - 65, 82, 67, 72, 65, 73, 79, 78, 128, 65, 82, 67, 72, 65, 73, 79, 206, 65, - 82, 67, 72, 65, 73, 195, 65, 82, 67, 200, 65, 82, 67, 128, 65, 82, 195, - 65, 82, 65, 77, 65, 73, 195, 65, 82, 65, 69, 65, 69, 128, 65, 82, 65, 69, - 65, 45, 85, 128, 65, 82, 65, 69, 65, 45, 73, 128, 65, 82, 65, 69, 65, 45, - 69, 79, 128, 65, 82, 65, 69, 65, 45, 69, 128, 65, 82, 65, 69, 65, 45, 65, - 128, 65, 82, 65, 68, 128, 65, 82, 65, 196, 65, 82, 65, 66, 73, 67, 45, - 73, 78, 68, 73, 195, 65, 82, 65, 66, 73, 65, 206, 65, 82, 45, 82, 85, 66, - 128, 65, 82, 45, 82, 65, 72, 77, 65, 206, 65, 82, 45, 82, 65, 72, 69, 69, - 77, 128, 65, 81, 85, 65, 82, 73, 85, 83, 128, 65, 81, 85, 65, 70, 79, 82, - 84, 73, 83, 128, 65, 81, 85, 193, 65, 80, 85, 206, 65, 80, 82, 73, 76, - 128, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 76, 217, 65, 80, 80, 82, - 79, 88, 73, 77, 65, 84, 69, 128, 65, 80, 80, 82, 79, 65, 67, 72, 69, 211, - 65, 80, 80, 82, 79, 65, 67, 72, 128, 65, 80, 80, 76, 73, 67, 65, 84, 73, - 79, 78, 128, 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, 206, 65, 80, 79, 84, - 72, 69, 83, 128, 65, 80, 79, 84, 72, 69, 77, 65, 128, 65, 80, 79, 83, 84, - 82, 79, 80, 72, 69, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 83, 128, 65, - 80, 79, 83, 84, 82, 79, 70, 79, 211, 65, 80, 79, 83, 84, 82, 79, 70, 79, - 201, 65, 80, 79, 76, 76, 79, 78, 128, 65, 80, 79, 68, 69, 88, 73, 65, - 128, 65, 80, 79, 68, 69, 82, 77, 193, 65, 80, 76, 79, 85, 78, 128, 65, - 80, 76, 201, 65, 80, 204, 65, 80, 73, 78, 128, 65, 80, 69, 83, 207, 65, - 80, 67, 128, 65, 80, 65, 82, 84, 128, 65, 80, 65, 65, 84, 79, 128, 65, - 79, 85, 128, 65, 79, 82, 128, 65, 78, 85, 83, 86, 65, 82, 65, 89, 65, - 128, 65, 78, 85, 83, 86, 65, 82, 65, 128, 65, 78, 85, 83, 86, 65, 82, - 193, 65, 78, 85, 68, 65, 84, 84, 65, 128, 65, 78, 85, 68, 65, 84, 84, - 193, 65, 78, 84, 73, 82, 69, 83, 84, 82, 73, 67, 84, 73, 79, 78, 128, 65, - 78, 84, 73, 77, 79, 78, 89, 45, 50, 128, 65, 78, 84, 73, 77, 79, 78, 89, - 128, 65, 78, 84, 73, 77, 79, 78, 217, 65, 78, 84, 73, 77, 79, 78, 73, 65, - 84, 69, 128, 65, 78, 84, 73, 75, 69, 78, 79, 77, 65, 128, 65, 78, 84, 73, - 75, 69, 78, 79, 75, 89, 76, 73, 83, 77, 65, 128, 65, 78, 84, 73, 70, 79, - 78, 73, 65, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, 83, 69, 45, - 82, 79, 84, 65, 84, 69, 196, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, - 83, 69, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, 83, 197, 65, 78, - 84, 69, 78, 78, 65, 128, 65, 78, 84, 69, 78, 78, 193, 65, 78, 84, 65, 82, - 71, 79, 77, 85, 75, 72, 65, 128, 65, 78, 83, 85, 218, 65, 78, 83, 72, 69, - 128, 65, 78, 80, 69, 65, 128, 65, 78, 207, 65, 78, 78, 85, 73, 84, 217, - 65, 78, 78, 79, 84, 65, 84, 73, 79, 206, 65, 78, 78, 65, 65, 85, 128, 65, - 78, 75, 72, 128, 65, 78, 74, 73, 128, 65, 78, 73, 77, 65, 76, 128, 65, - 78, 72, 85, 128, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, 71, 85, 73, 83, - 72, 69, 196, 65, 78, 71, 83, 84, 82, 79, 205, 65, 78, 71, 82, 217, 65, - 78, 71, 76, 73, 67, 65, 78, 193, 65, 78, 71, 76, 69, 68, 128, 65, 78, 71, - 76, 69, 196, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, 128, 65, 78, 71, 75, - 65, 128, 65, 78, 71, 69, 210, 65, 78, 71, 69, 76, 128, 65, 78, 71, 69, - 68, 128, 65, 78, 68, 65, 80, 128, 65, 78, 67, 79, 82, 65, 128, 65, 78, - 67, 72, 79, 82, 128, 65, 78, 65, 84, 82, 73, 67, 72, 73, 83, 77, 65, 128, + 83, 79, 78, 128, 66, 73, 83, 77, 85, 84, 200, 66, 73, 83, 77, 73, 76, 76, + 65, 200, 66, 73, 83, 72, 79, 208, 66, 73, 83, 69, 67, 84, 73, 78, 199, + 66, 73, 83, 65, 72, 128, 66, 73, 82, 85, 128, 66, 73, 82, 84, 72, 68, 65, + 217, 66, 73, 82, 71, 65, 128, 66, 73, 82, 71, 193, 66, 73, 82, 68, 128, + 66, 73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 78, 79, 86, 73, 76, 69, 128, + 66, 73, 78, 79, 67, 85, 76, 65, 210, 66, 73, 78, 68, 73, 78, 199, 66, 73, + 78, 68, 73, 128, 66, 73, 78, 65, 82, 217, 66, 73, 76, 76, 73, 79, 78, 83, + 128, 66, 73, 76, 76, 73, 65, 82, 68, 83, 128, 66, 73, 76, 76, 69, 196, + 66, 73, 76, 65, 66, 73, 65, 204, 66, 73, 75, 73, 78, 73, 128, 66, 73, 71, + 128, 66, 73, 199, 66, 73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, + 66, 73, 68, 65, 75, 85, 79, 206, 66, 73, 67, 89, 67, 76, 73, 83, 84, 128, + 66, 73, 67, 89, 67, 76, 69, 83, 128, 66, 73, 67, 89, 67, 76, 69, 128, 66, + 73, 67, 69, 80, 83, 128, 66, 73, 66, 76, 69, 45, 67, 82, 69, 197, 66, 73, + 66, 128, 66, 201, 66, 72, 85, 128, 66, 72, 79, 79, 128, 66, 72, 79, 128, + 66, 72, 73, 128, 66, 72, 69, 84, 72, 128, 66, 72, 69, 69, 128, 66, 72, + 69, 128, 66, 72, 65, 84, 84, 73, 80, 82, 79, 76, 213, 66, 72, 65, 77, + 128, 66, 72, 65, 73, 75, 83, 85, 75, 201, 66, 72, 65, 65, 128, 66, 72, + 65, 128, 66, 69, 89, 89, 65, 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, + 82, 65, 71, 69, 128, 66, 69, 86, 69, 82, 65, 71, 197, 66, 69, 84, 87, 69, + 69, 78, 128, 66, 69, 84, 87, 69, 69, 206, 66, 69, 84, 72, 128, 66, 69, + 84, 65, 128, 66, 69, 84, 193, 66, 69, 212, 66, 69, 83, 73, 68, 197, 66, + 69, 82, 75, 65, 78, 65, 206, 66, 69, 82, 66, 69, 210, 66, 69, 80, 128, + 66, 69, 79, 82, 195, 66, 69, 78, 90, 69, 78, 197, 66, 69, 78, 84, 207, + 66, 69, 78, 84, 128, 66, 69, 78, 212, 66, 69, 78, 71, 65, 76, 201, 66, + 69, 78, 68, 69, 128, 66, 69, 78, 68, 128, 66, 69, 78, 196, 66, 69, 206, + 66, 69, 76, 84, 128, 66, 69, 76, 212, 66, 69, 76, 79, 215, 66, 69, 76, + 76, 72, 79, 208, 66, 69, 76, 76, 128, 66, 69, 76, 204, 66, 69, 76, 71, + 84, 72, 79, 210, 66, 69, 73, 84, 72, 128, 66, 69, 72, 73, 78, 196, 66, + 69, 72, 69, 72, 128, 66, 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, + 66, 69, 71, 73, 78, 78, 73, 78, 71, 128, 66, 69, 71, 73, 78, 78, 69, 82, + 128, 66, 69, 71, 73, 206, 66, 69, 70, 79, 82, 197, 66, 69, 69, 84, 76, + 69, 128, 66, 69, 69, 84, 65, 128, 66, 69, 69, 210, 66, 69, 69, 72, 73, + 86, 69, 128, 66, 69, 69, 72, 128, 66, 69, 69, 200, 66, 69, 67, 65, 85, + 83, 69, 128, 66, 69, 65, 86, 69, 82, 128, 66, 69, 65, 86, 69, 210, 66, + 69, 65, 84, 73, 78, 199, 66, 69, 65, 84, 128, 66, 69, 65, 82, 68, 69, + 196, 66, 69, 65, 82, 128, 66, 69, 65, 210, 66, 69, 65, 78, 128, 66, 69, + 65, 77, 69, 196, 66, 69, 65, 68, 83, 128, 66, 69, 65, 67, 200, 66, 67, + 65, 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, 66, 66, 89, 84, 128, + 66, 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, 88, 128, 66, 66, 85, + 84, 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, 128, 66, 66, 85, 80, + 128, 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, 128, 66, 66, 85, 79, + 128, 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, 79, 84, 128, 66, 66, + 79, 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, 66, 66, 73, 80, 128, + 66, 66, 73, 69, 88, 128, 66, 66, 73, 69, 84, 128, 66, 66, 73, 69, 80, + 128, 66, 66, 73, 69, 128, 66, 66, 73, 128, 66, 66, 69, 88, 128, 66, 66, + 69, 80, 128, 66, 66, 69, 69, 128, 66, 66, 65, 88, 128, 66, 66, 65, 84, + 128, 66, 66, 65, 80, 128, 66, 66, 65, 65, 128, 66, 65, 89, 65, 78, 78, + 65, 128, 66, 65, 85, 128, 66, 65, 84, 84, 69, 82, 89, 128, 66, 65, 84, + 72, 84, 85, 66, 128, 66, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 66, 65, + 84, 72, 128, 66, 65, 84, 200, 66, 65, 84, 65, 203, 66, 65, 83, 83, 65, + 128, 66, 65, 83, 83, 193, 66, 65, 83, 75, 69, 84, 66, 65, 76, 204, 66, + 65, 83, 72, 75, 73, 210, 66, 65, 83, 72, 128, 66, 65, 83, 69, 76, 73, 78, + 197, 66, 65, 83, 69, 66, 65, 76, 76, 128, 66, 65, 83, 69, 128, 66, 65, + 83, 197, 66, 65, 82, 83, 128, 66, 65, 82, 211, 66, 65, 82, 82, 73, 69, + 82, 128, 66, 65, 82, 82, 69, 75, 72, 128, 66, 65, 82, 82, 69, 69, 128, + 66, 65, 82, 82, 69, 197, 66, 65, 82, 76, 73, 78, 69, 128, 66, 65, 82, 76, + 69, 89, 128, 66, 65, 82, 73, 89, 79, 79, 83, 65, 78, 128, 66, 65, 82, 66, + 69, 210, 66, 65, 82, 65, 50, 128, 66, 65, 210, 66, 65, 78, 84, 79, 67, + 128, 66, 65, 78, 75, 78, 79, 84, 197, 66, 65, 78, 75, 128, 66, 65, 78, + 203, 66, 65, 78, 74, 79, 128, 66, 65, 78, 68, 128, 66, 65, 78, 65, 78, + 65, 128, 66, 65, 78, 50, 128, 66, 65, 78, 178, 66, 65, 77, 66, 79, 79, + 83, 128, 66, 65, 77, 66, 79, 79, 128, 66, 65, 76, 85, 68, 65, 128, 66, + 65, 76, 76, 80, 79, 73, 78, 212, 66, 65, 76, 76, 79, 84, 128, 66, 65, 76, + 76, 79, 212, 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, 75, 69, 196, 66, + 65, 76, 76, 79, 79, 78, 128, 66, 65, 76, 76, 69, 212, 66, 65, 76, 68, + 128, 66, 65, 76, 65, 71, 128, 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, + 82, 75, 65, 78, 128, 66, 65, 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, + 66, 65, 72, 73, 82, 71, 79, 77, 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, + 50, 128, 66, 65, 72, 65, 82, 178, 66, 65, 72, 128, 66, 65, 71, 85, 69, + 84, 84, 197, 66, 65, 71, 83, 128, 66, 65, 71, 71, 65, 71, 197, 66, 65, + 71, 69, 76, 128, 66, 65, 71, 65, 128, 66, 65, 71, 51, 128, 66, 65, 199, + 66, 65, 68, 77, 73, 78, 84, 79, 206, 66, 65, 68, 71, 69, 82, 128, 66, 65, + 68, 71, 69, 128, 66, 65, 196, 66, 65, 67, 84, 82, 73, 65, 206, 66, 65, + 67, 79, 78, 128, 66, 65, 67, 75, 87, 65, 82, 68, 128, 66, 65, 67, 75, 83, + 80, 65, 67, 69, 128, 66, 65, 67, 75, 83, 76, 65, 83, 72, 128, 66, 65, 67, + 75, 83, 76, 65, 83, 200, 66, 65, 67, 75, 83, 76, 65, 78, 84, 69, 196, 66, + 65, 67, 75, 72, 65, 78, 196, 66, 65, 67, 75, 45, 84, 73, 76, 84, 69, 196, + 66, 65, 67, 75, 128, 66, 65, 67, 203, 66, 65, 66, 89, 128, 66, 65, 66, + 217, 66, 65, 65, 82, 69, 82, 85, 128, 66, 65, 45, 50, 128, 66, 51, 48, + 53, 128, 66, 50, 53, 180, 66, 50, 52, 183, 66, 50, 52, 179, 66, 50, 52, + 178, 66, 50, 52, 177, 66, 50, 52, 176, 66, 50, 51, 179, 66, 50, 51, 177, + 66, 50, 51, 176, 66, 50, 50, 181, 66, 50, 50, 176, 66, 49, 57, 177, 66, + 49, 55, 182, 66, 49, 55, 179, 66, 49, 54, 57, 128, 66, 49, 54, 56, 128, + 66, 49, 54, 55, 128, 66, 49, 54, 54, 128, 66, 49, 54, 53, 128, 66, 49, + 54, 52, 128, 66, 49, 54, 179, 66, 49, 54, 178, 66, 49, 54, 49, 128, 66, + 49, 54, 48, 128, 66, 49, 53, 185, 66, 49, 53, 56, 128, 66, 49, 53, 55, + 128, 66, 49, 53, 182, 66, 49, 53, 53, 128, 66, 49, 53, 52, 128, 66, 49, + 53, 51, 128, 66, 49, 53, 50, 128, 66, 49, 53, 177, 66, 49, 53, 48, 128, + 66, 49, 52, 54, 128, 66, 49, 52, 181, 66, 49, 52, 50, 128, 66, 49, 52, + 177, 66, 49, 52, 176, 66, 49, 51, 181, 66, 49, 51, 179, 66, 49, 51, 50, + 128, 66, 49, 51, 177, 66, 49, 51, 176, 66, 49, 50, 184, 66, 49, 50, 183, + 66, 49, 50, 181, 66, 49, 50, 179, 66, 49, 50, 178, 66, 49, 50, 177, 66, + 49, 50, 176, 66, 49, 48, 57, 205, 66, 49, 48, 57, 198, 66, 49, 48, 56, + 205, 66, 49, 48, 56, 198, 66, 49, 48, 55, 205, 66, 49, 48, 55, 198, 66, + 49, 48, 54, 205, 66, 49, 48, 54, 198, 66, 49, 48, 53, 205, 66, 49, 48, + 53, 198, 66, 49, 48, 181, 66, 49, 48, 180, 66, 49, 48, 178, 66, 49, 48, + 176, 66, 48, 57, 177, 66, 48, 57, 176, 66, 48, 56, 57, 128, 66, 48, 56, + 183, 66, 48, 56, 54, 128, 66, 48, 56, 181, 66, 48, 56, 51, 128, 66, 48, + 56, 50, 128, 66, 48, 56, 177, 66, 48, 56, 176, 66, 48, 55, 57, 128, 66, + 48, 55, 184, 66, 48, 55, 183, 66, 48, 55, 182, 66, 48, 55, 181, 66, 48, + 55, 180, 66, 48, 55, 179, 66, 48, 55, 178, 66, 48, 55, 177, 66, 48, 55, + 176, 66, 48, 54, 185, 66, 48, 54, 184, 66, 48, 54, 183, 66, 48, 54, 182, + 66, 48, 54, 181, 66, 48, 54, 52, 128, 66, 48, 54, 51, 128, 66, 48, 54, + 178, 66, 48, 54, 177, 66, 48, 54, 176, 66, 48, 53, 185, 66, 48, 53, 184, + 66, 48, 53, 183, 66, 48, 53, 54, 128, 66, 48, 53, 181, 66, 48, 53, 180, + 66, 48, 53, 179, 66, 48, 53, 178, 66, 48, 53, 177, 66, 48, 53, 176, 66, + 48, 52, 57, 128, 66, 48, 52, 184, 66, 48, 52, 55, 128, 66, 48, 52, 182, + 66, 48, 52, 181, 66, 48, 52, 180, 66, 48, 52, 179, 66, 48, 52, 178, 66, + 48, 52, 177, 66, 48, 52, 176, 66, 48, 51, 185, 66, 48, 51, 184, 66, 48, + 51, 183, 66, 48, 51, 182, 66, 48, 51, 52, 128, 66, 48, 51, 179, 66, 48, + 51, 178, 66, 48, 51, 177, 66, 48, 51, 176, 66, 48, 50, 185, 66, 48, 50, + 184, 66, 48, 50, 183, 66, 48, 50, 182, 66, 48, 50, 181, 66, 48, 50, 180, + 66, 48, 50, 179, 66, 48, 50, 50, 128, 66, 48, 50, 177, 66, 48, 50, 176, + 66, 48, 49, 57, 128, 66, 48, 49, 56, 128, 66, 48, 49, 183, 66, 48, 49, + 182, 66, 48, 49, 181, 66, 48, 49, 180, 66, 48, 49, 179, 66, 48, 49, 178, + 66, 48, 49, 177, 66, 48, 49, 176, 66, 48, 48, 57, 128, 66, 48, 48, 185, + 66, 48, 48, 56, 128, 66, 48, 48, 184, 66, 48, 48, 55, 128, 66, 48, 48, + 183, 66, 48, 48, 54, 128, 66, 48, 48, 182, 66, 48, 48, 53, 65, 128, 66, + 48, 48, 53, 128, 66, 48, 48, 181, 66, 48, 48, 52, 128, 66, 48, 48, 180, + 66, 48, 48, 51, 128, 66, 48, 48, 179, 66, 48, 48, 50, 128, 66, 48, 48, + 178, 66, 48, 48, 49, 128, 66, 48, 48, 177, 65, 90, 85, 128, 65, 89, 66, + 128, 65, 89, 65, 72, 128, 65, 88, 69, 128, 65, 87, 69, 128, 65, 87, 65, + 217, 65, 86, 79, 67, 65, 68, 79, 128, 65, 86, 69, 83, 84, 65, 206, 65, + 86, 69, 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, 89, + 65, 128, 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, 65, + 128, 65, 85, 84, 85, 77, 78, 128, 65, 85, 84, 79, 77, 79, 66, 73, 76, 69, + 128, 65, 85, 84, 79, 77, 65, 84, 69, 196, 65, 85, 84, 207, 65, 85, 83, + 84, 82, 65, 204, 65, 85, 82, 73, 80, 73, 71, 77, 69, 78, 84, 128, 65, 85, + 82, 65, 77, 65, 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, 90, + 68, 65, 65, 45, 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, 65, + 85, 78, 78, 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, 71, 77, 69, 78, 84, + 65, 84, 73, 79, 206, 65, 85, 69, 128, 65, 85, 66, 69, 82, 71, 73, 78, 69, + 128, 65, 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, 65, 78, 128, 65, 84, + 84, 69, 78, 84, 73, 79, 78, 128, 65, 84, 84, 65, 203, 65, 84, 84, 65, 67, + 72, 69, 196, 65, 84, 79, 205, 65, 84, 78, 65, 200, 65, 84, 77, 65, 65, + 85, 128, 65, 84, 73, 89, 65, 128, 65, 84, 73, 85, 128, 65, 84, 73, 75, + 82, 65, 77, 65, 128, 65, 84, 72, 76, 69, 84, 73, 195, 65, 84, 72, 65, 82, + 86, 65, 86, 69, 68, 73, 195, 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 65, + 84, 72, 45, 84, 72, 65, 76, 65, 84, 72, 65, 128, 65, 83, 90, 128, 65, 83, + 89, 85, 82, 193, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, + 65, 83, 84, 82, 79, 78, 79, 77, 73, 67, 65, 204, 65, 83, 84, 82, 79, 76, + 79, 71, 73, 67, 65, 204, 65, 83, 84, 82, 65, 69, 65, 128, 65, 83, 84, 79, + 78, 73, 83, 72, 69, 196, 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 83, 84, + 69, 82, 73, 83, 75, 211, 65, 83, 84, 69, 82, 73, 83, 75, 128, 65, 83, 84, + 69, 82, 73, 83, 203, 65, 83, 84, 69, 82, 73, 83, 67, 85, 83, 128, 65, 83, + 83, 89, 82, 73, 65, 206, 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, 65, 83, + 80, 73, 82, 65, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82, 65, 84, 69, 196, + 65, 83, 80, 69, 82, 128, 65, 83, 73, 65, 45, 65, 85, 83, 84, 82, 65, 76, + 73, 65, 128, 65, 83, 72, 71, 65, 66, 128, 65, 83, 72, 69, 83, 128, 65, + 83, 72, 57, 128, 65, 83, 72, 51, 128, 65, 83, 72, 178, 65, 83, 67, 73, + 193, 65, 83, 67, 69, 78, 84, 128, 65, 83, 67, 69, 78, 68, 73, 78, 199, + 65, 83, 65, 76, 50, 128, 65, 83, 45, 83, 65, 74, 68, 65, 128, 65, 82, 85, + 72, 85, 65, 128, 65, 82, 84, 211, 65, 82, 84, 73, 83, 212, 65, 82, 84, + 73, 67, 85, 76, 65, 84, 69, 196, 65, 82, 84, 65, 66, 197, 65, 82, 84, 65, + 128, 65, 82, 83, 69, 79, 83, 128, 65, 82, 83, 69, 79, 211, 65, 82, 83, + 69, 78, 73, 67, 128, 65, 82, 82, 79, 87, 83, 128, 65, 82, 82, 79, 87, + 211, 65, 82, 82, 79, 87, 72, 69, 65, 68, 83, 128, 65, 82, 82, 79, 87, 72, + 69, 65, 68, 45, 83, 72, 65, 80, 69, 196, 65, 82, 82, 79, 87, 72, 69, 65, + 68, 128, 65, 82, 82, 79, 87, 72, 69, 65, 196, 65, 82, 82, 79, 87, 45, 84, + 65, 73, 76, 128, 65, 82, 82, 73, 86, 73, 78, 71, 128, 65, 82, 82, 73, 86, + 69, 128, 65, 82, 82, 65, 89, 128, 65, 82, 80, 69, 71, 71, 73, 65, 84, + 207, 65, 82, 79, 85, 83, 73, 78, 199, 65, 82, 79, 85, 82, 193, 65, 82, + 79, 85, 78, 68, 45, 80, 82, 79, 70, 73, 76, 69, 128, 65, 82, 79, 85, 78, + 196, 65, 82, 77, 89, 128, 65, 82, 77, 211, 65, 82, 77, 79, 85, 82, 128, + 65, 82, 77, 69, 78, 73, 65, 206, 65, 82, 77, 128, 65, 82, 205, 65, 82, + 76, 65, 85, 199, 65, 82, 75, 84, 73, 75, 207, 65, 82, 75, 65, 66, 128, + 65, 82, 75, 65, 65, 78, 85, 128, 65, 82, 73, 83, 84, 69, 82, 65, 128, 65, + 82, 73, 83, 84, 69, 82, 193, 65, 82, 73, 69, 83, 128, 65, 82, 71, 79, 84, + 69, 82, 73, 128, 65, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, + 65, 82, 71, 73, 128, 65, 82, 69, 80, 65, 128, 65, 82, 69, 65, 128, 65, + 82, 68, 72, 65, 86, 73, 83, 65, 82, 71, 65, 128, 65, 82, 68, 72, 65, 67, + 65, 78, 68, 82, 65, 128, 65, 82, 67, 72, 65, 73, 79, 78, 128, 65, 82, 67, + 72, 65, 73, 79, 206, 65, 82, 67, 72, 65, 73, 195, 65, 82, 67, 200, 65, + 82, 67, 128, 65, 82, 195, 65, 82, 65, 77, 65, 73, 195, 65, 82, 65, 69, + 65, 69, 128, 65, 82, 65, 69, 65, 45, 85, 128, 65, 82, 65, 69, 65, 45, 73, + 128, 65, 82, 65, 69, 65, 45, 69, 79, 128, 65, 82, 65, 69, 65, 45, 69, + 128, 65, 82, 65, 69, 65, 45, 65, 128, 65, 82, 65, 68, 128, 65, 82, 65, + 196, 65, 82, 65, 66, 73, 67, 45, 73, 78, 68, 73, 195, 65, 82, 65, 66, 73, + 65, 206, 65, 82, 45, 82, 85, 66, 128, 65, 82, 45, 82, 65, 72, 77, 65, + 206, 65, 82, 45, 82, 65, 72, 69, 69, 77, 128, 65, 81, 85, 65, 82, 73, 85, + 83, 128, 65, 81, 85, 65, 70, 79, 82, 84, 73, 83, 128, 65, 81, 85, 193, + 65, 80, 85, 206, 65, 80, 82, 73, 76, 128, 65, 80, 80, 82, 79, 88, 73, 77, + 65, 84, 69, 76, 217, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 128, 65, + 80, 80, 82, 79, 65, 67, 72, 69, 211, 65, 80, 80, 82, 79, 65, 67, 72, 128, + 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 65, 80, 80, 76, 73, 67, + 65, 84, 73, 79, 206, 65, 80, 79, 84, 72, 69, 83, 128, 65, 80, 79, 84, 72, + 69, 77, 65, 128, 65, 80, 79, 83, 84, 82, 79, 80, 72, 69, 128, 65, 80, 79, + 83, 84, 82, 79, 70, 79, 83, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 211, + 65, 80, 79, 83, 84, 82, 79, 70, 79, 201, 65, 80, 79, 76, 76, 79, 78, 128, + 65, 80, 79, 68, 69, 88, 73, 65, 128, 65, 80, 79, 68, 69, 82, 77, 193, 65, + 80, 76, 79, 85, 78, 128, 65, 80, 76, 201, 65, 80, 204, 65, 80, 73, 78, + 128, 65, 80, 69, 83, 207, 65, 80, 67, 128, 65, 80, 65, 82, 84, 128, 65, + 80, 65, 65, 84, 79, 128, 65, 79, 85, 128, 65, 79, 82, 128, 65, 78, 85, + 83, 86, 65, 82, 65, 89, 65, 128, 65, 78, 85, 83, 86, 65, 82, 65, 128, 65, + 78, 85, 83, 86, 65, 82, 193, 65, 78, 85, 68, 65, 84, 84, 65, 128, 65, 78, + 85, 68, 65, 84, 84, 193, 65, 78, 84, 73, 82, 69, 83, 84, 82, 73, 67, 84, + 73, 79, 78, 128, 65, 78, 84, 73, 77, 79, 78, 89, 45, 50, 128, 65, 78, 84, + 73, 77, 79, 78, 89, 128, 65, 78, 84, 73, 77, 79, 78, 217, 65, 78, 84, 73, + 77, 79, 78, 73, 65, 84, 69, 128, 65, 78, 84, 73, 75, 69, 78, 79, 77, 65, + 128, 65, 78, 84, 73, 75, 69, 78, 79, 75, 89, 76, 73, 83, 77, 65, 128, 65, + 78, 84, 73, 70, 79, 78, 73, 65, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, + 87, 73, 83, 69, 45, 82, 79, 84, 65, 84, 69, 196, 65, 78, 84, 73, 67, 76, + 79, 67, 75, 87, 73, 83, 69, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, + 73, 83, 197, 65, 78, 84, 69, 78, 78, 65, 128, 65, 78, 84, 69, 78, 78, + 193, 65, 78, 84, 65, 82, 71, 79, 77, 85, 75, 72, 65, 128, 65, 78, 83, 85, + 218, 65, 78, 83, 72, 69, 128, 65, 78, 80, 69, 65, 128, 65, 78, 207, 65, + 78, 78, 85, 73, 84, 217, 65, 78, 78, 79, 84, 65, 84, 73, 79, 206, 65, 78, + 78, 65, 65, 85, 128, 65, 78, 75, 72, 128, 65, 78, 74, 73, 128, 65, 78, + 73, 77, 65, 76, 128, 65, 78, 72, 85, 128, 65, 78, 71, 85, 76, 65, 82, + 128, 65, 78, 71, 85, 73, 83, 72, 69, 196, 65, 78, 71, 83, 84, 82, 79, + 205, 65, 78, 71, 82, 217, 65, 78, 71, 76, 73, 67, 65, 78, 193, 65, 78, + 71, 76, 69, 68, 128, 65, 78, 71, 76, 69, 196, 65, 78, 71, 75, 72, 65, 78, + 75, 72, 85, 128, 65, 78, 71, 75, 65, 128, 65, 78, 71, 69, 210, 65, 78, + 71, 69, 76, 128, 65, 78, 71, 69, 68, 128, 65, 78, 68, 65, 80, 128, 65, + 78, 67, 79, 82, 65, 128, 65, 78, 67, 72, 79, 82, 128, 65, 78, 65, 84, 82, + 73, 67, 72, 73, 83, 77, 65, 128, 65, 78, 65, 84, 79, 77, 73, 67, 65, 204, 65, 78, 65, 80, 128, 65, 78, 45, 78, 73, 83, 70, 128, 65, 77, 85, 76, 69, 84, 128, 65, 77, 80, 83, 128, 65, 77, 80, 72, 79, 82, 65, 128, 65, 77, 80, 69, 82, 83, 65, 78, 68, 128, 65, 77, 80, 69, 82, 83, 65, 78, 196, 65, @@ -6134,13570 +6632,13634 @@ static const unsigned char lexicon[] = { 65, 76, 69, 82, 84, 128, 65, 76, 69, 80, 72, 128, 65, 76, 69, 77, 66, 73, 67, 128, 65, 76, 69, 70, 128, 65, 76, 66, 65, 78, 73, 65, 206, 65, 76, 65, 89, 72, 69, 128, 65, 76, 65, 89, 72, 197, 65, 76, 65, 82, 205, 65, - 76, 65, 80, 72, 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, 84, - 73, 69, 83, 69, 76, 83, 75, 65, 66, 128, 65, 75, 83, 65, 128, 65, 75, 72, - 77, 73, 77, 73, 195, 65, 75, 66, 65, 210, 65, 75, 65, 82, 65, 128, 65, - 75, 65, 82, 193, 65, 73, 89, 65, 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, - 203, 65, 73, 86, 65, 128, 65, 73, 84, 79, 206, 65, 73, 82, 80, 76, 65, - 78, 69, 128, 65, 73, 82, 80, 76, 65, 78, 197, 65, 73, 78, 213, 65, 73, - 78, 78, 128, 65, 73, 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, - 72, 86, 85, 83, 128, 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, - 72, 79, 205, 65, 72, 65, 78, 199, 65, 72, 65, 71, 71, 65, 210, 65, 72, - 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, 71, 79, 71, 201, 65, 71, 71, - 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, 71, 82, 65, 86, 65, 84, 69, - 196, 65, 71, 65, 73, 78, 83, 212, 65, 71, 65, 73, 78, 128, 65, 70, 84, - 69, 210, 65, 70, 83, 65, 65, 81, 128, 65, 70, 82, 73, 67, 65, 206, 65, - 70, 79, 82, 69, 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 70, 71, 72, - 65, 78, 201, 65, 70, 70, 82, 73, 67, 65, 84, 73, 79, 206, 65, 70, 70, 73, - 216, 65, 69, 89, 65, 78, 78, 65, 128, 65, 69, 89, 128, 65, 69, 83, 67, - 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, 67, 128, 65, 69, 83, 128, - 65, 69, 82, 73, 65, 204, 65, 69, 82, 128, 65, 69, 76, 65, 45, 80, 73, 76, - 76, 65, 128, 65, 69, 76, 128, 65, 69, 75, 128, 65, 69, 71, 69, 65, 206, - 65, 69, 71, 128, 65, 69, 69, 89, 65, 78, 78, 65, 128, 65, 69, 69, 128, - 65, 69, 68, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 68, 128, 65, 69, 66, - 128, 65, 68, 86, 65, 78, 84, 65, 71, 69, 128, 65, 68, 86, 65, 78, 67, 69, - 128, 65, 68, 85, 76, 84, 128, 65, 68, 77, 73, 83, 83, 73, 79, 206, 65, - 68, 77, 69, 84, 79, 83, 128, 65, 68, 76, 65, 205, 65, 68, 72, 69, 83, 73, - 86, 197, 65, 68, 69, 71, 128, 65, 68, 69, 199, 65, 68, 68, 82, 69, 83, - 83, 69, 196, 65, 68, 68, 82, 69, 83, 211, 65, 68, 68, 65, 75, 128, 65, - 68, 65, 203, 65, 67, 85, 84, 69, 45, 77, 65, 67, 82, 79, 78, 128, 65, 67, - 85, 84, 69, 45, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 128, 65, 67, - 85, 84, 197, 65, 67, 84, 85, 65, 76, 76, 217, 65, 67, 84, 73, 86, 65, 84, - 197, 65, 67, 82, 79, 80, 72, 79, 78, 73, 195, 65, 67, 75, 78, 79, 87, 76, - 69, 68, 71, 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, 84, 73, 79, 78, 128, - 65, 67, 67, 79, 85, 78, 212, 65, 67, 67, 79, 77, 77, 79, 68, 65, 84, 73, - 79, 78, 128, 65, 67, 67, 69, 80, 84, 128, 65, 67, 67, 69, 78, 84, 45, 83, - 84, 65, 67, 67, 65, 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, - 69, 78, 212, 65, 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, - 65, 66, 85, 78, 68, 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, - 206, 65, 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, - 76, 73, 128, 65, 66, 65, 67, 85, 83, 128, 65, 66, 178, 65, 66, 49, 57, - 49, 128, 65, 66, 49, 56, 56, 128, 65, 66, 49, 56, 48, 128, 65, 66, 49, - 55, 49, 128, 65, 66, 49, 54, 52, 128, 65, 66, 49, 51, 49, 66, 128, 65, - 66, 49, 51, 49, 65, 128, 65, 66, 49, 50, 51, 128, 65, 66, 49, 50, 50, - 128, 65, 66, 49, 50, 48, 128, 65, 66, 49, 49, 56, 128, 65, 66, 48, 56, - 55, 128, 65, 66, 48, 56, 54, 128, 65, 66, 48, 56, 53, 128, 65, 66, 48, - 56, 50, 128, 65, 66, 48, 56, 49, 128, 65, 66, 48, 56, 48, 128, 65, 66, - 48, 55, 57, 128, 65, 66, 48, 55, 56, 128, 65, 66, 48, 55, 55, 128, 65, - 66, 48, 55, 54, 128, 65, 66, 48, 55, 52, 128, 65, 66, 48, 55, 51, 128, - 65, 66, 48, 55, 48, 128, 65, 66, 48, 54, 57, 128, 65, 66, 48, 54, 55, - 128, 65, 66, 48, 54, 54, 128, 65, 66, 48, 54, 53, 128, 65, 66, 48, 54, - 49, 128, 65, 66, 48, 54, 48, 128, 65, 66, 48, 53, 57, 128, 65, 66, 48, - 53, 56, 128, 65, 66, 48, 53, 55, 128, 65, 66, 48, 53, 54, 128, 65, 66, - 48, 53, 53, 128, 65, 66, 48, 53, 52, 128, 65, 66, 48, 53, 51, 128, 65, - 66, 48, 53, 49, 128, 65, 66, 48, 53, 48, 128, 65, 66, 48, 52, 57, 128, - 65, 66, 48, 52, 56, 128, 65, 66, 48, 52, 55, 128, 65, 66, 48, 52, 54, - 128, 65, 66, 48, 52, 53, 128, 65, 66, 48, 52, 52, 128, 65, 66, 48, 52, - 49, 128, 65, 66, 48, 52, 48, 128, 65, 66, 48, 51, 57, 128, 65, 66, 48, - 51, 56, 128, 65, 66, 48, 51, 55, 128, 65, 66, 48, 51, 52, 128, 65, 66, - 48, 51, 49, 128, 65, 66, 48, 51, 48, 128, 65, 66, 48, 50, 57, 128, 65, - 66, 48, 50, 56, 128, 65, 66, 48, 50, 55, 128, 65, 66, 48, 50, 54, 128, - 65, 66, 48, 50, 52, 128, 65, 66, 48, 50, 51, 77, 128, 65, 66, 48, 50, 51, - 128, 65, 66, 48, 50, 50, 77, 128, 65, 66, 48, 50, 50, 70, 128, 65, 66, - 48, 50, 50, 128, 65, 66, 48, 50, 49, 77, 128, 65, 66, 48, 50, 49, 70, - 128, 65, 66, 48, 50, 49, 128, 65, 66, 48, 50, 48, 128, 65, 66, 48, 49, - 55, 128, 65, 66, 48, 49, 54, 128, 65, 66, 48, 49, 51, 128, 65, 66, 48, - 49, 49, 128, 65, 66, 48, 49, 48, 128, 65, 66, 48, 48, 57, 128, 65, 66, - 48, 48, 56, 128, 65, 66, 48, 48, 55, 128, 65, 66, 48, 48, 54, 128, 65, - 66, 48, 48, 53, 128, 65, 66, 48, 48, 52, 128, 65, 66, 48, 48, 51, 128, - 65, 66, 48, 48, 50, 128, 65, 66, 48, 48, 49, 128, 65, 65, 90, 72, 65, 65, - 75, 75, 85, 128, 65, 65, 89, 73, 78, 128, 65, 65, 89, 65, 78, 78, 65, - 128, 65, 65, 89, 128, 65, 65, 87, 128, 65, 65, 79, 128, 65, 65, 74, 128, - 65, 65, 66, 65, 65, 70, 73, 76, 73, 128, 65, 65, 48, 51, 50, 128, 65, 65, - 48, 51, 49, 128, 65, 65, 48, 51, 48, 128, 65, 65, 48, 50, 57, 128, 65, - 65, 48, 50, 56, 128, 65, 65, 48, 50, 55, 128, 65, 65, 48, 50, 54, 128, - 65, 65, 48, 50, 53, 128, 65, 65, 48, 50, 52, 128, 65, 65, 48, 50, 51, - 128, 65, 65, 48, 50, 50, 128, 65, 65, 48, 50, 49, 128, 65, 65, 48, 50, - 48, 128, 65, 65, 48, 49, 57, 128, 65, 65, 48, 49, 56, 128, 65, 65, 48, - 49, 55, 128, 65, 65, 48, 49, 54, 128, 65, 65, 48, 49, 53, 128, 65, 65, - 48, 49, 52, 128, 65, 65, 48, 49, 51, 128, 65, 65, 48, 49, 50, 128, 65, - 65, 48, 49, 49, 128, 65, 65, 48, 49, 48, 128, 65, 65, 48, 48, 57, 128, - 65, 65, 48, 48, 56, 128, 65, 65, 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, - 65, 128, 65, 65, 48, 48, 55, 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, - 48, 53, 128, 65, 65, 48, 48, 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, - 48, 48, 50, 128, 65, 65, 48, 48, 49, 128, 65, 56, 48, 55, 128, 65, 56, - 48, 54, 128, 65, 56, 48, 53, 128, 65, 56, 48, 52, 128, 65, 56, 48, 51, - 128, 65, 56, 48, 50, 128, 65, 56, 48, 49, 128, 65, 56, 48, 48, 128, 65, - 55, 51, 178, 65, 55, 50, 182, 65, 55, 49, 183, 65, 55, 49, 181, 65, 55, - 49, 180, 65, 55, 49, 179, 65, 55, 49, 178, 65, 55, 49, 177, 65, 55, 49, - 176, 65, 55, 48, 57, 45, 182, 65, 55, 48, 57, 45, 180, 65, 55, 48, 57, - 45, 179, 65, 55, 48, 57, 45, 178, 65, 55, 48, 185, 65, 55, 48, 184, 65, - 55, 48, 183, 65, 55, 48, 182, 65, 55, 48, 181, 65, 55, 48, 180, 65, 55, - 48, 179, 65, 55, 48, 178, 65, 55, 48, 177, 65, 54, 54, 52, 128, 65, 54, - 54, 51, 128, 65, 54, 54, 50, 128, 65, 54, 54, 49, 128, 65, 54, 54, 48, - 128, 65, 54, 53, 57, 128, 65, 54, 53, 56, 128, 65, 54, 53, 55, 128, 65, - 54, 53, 54, 128, 65, 54, 53, 53, 128, 65, 54, 53, 52, 128, 65, 54, 53, - 51, 128, 65, 54, 53, 50, 128, 65, 54, 53, 49, 128, 65, 54, 52, 57, 128, - 65, 54, 52, 56, 128, 65, 54, 52, 54, 128, 65, 54, 52, 53, 128, 65, 54, - 52, 52, 128, 65, 54, 52, 51, 128, 65, 54, 52, 50, 128, 65, 54, 52, 48, - 128, 65, 54, 51, 56, 128, 65, 54, 51, 55, 128, 65, 54, 51, 52, 128, 65, - 54, 50, 57, 128, 65, 54, 50, 56, 128, 65, 54, 50, 55, 128, 65, 54, 50, - 54, 128, 65, 54, 50, 52, 128, 65, 54, 50, 51, 128, 65, 54, 50, 50, 128, - 65, 54, 50, 49, 128, 65, 54, 50, 48, 128, 65, 54, 49, 57, 128, 65, 54, - 49, 56, 128, 65, 54, 49, 55, 128, 65, 54, 49, 54, 128, 65, 54, 49, 53, - 128, 65, 54, 49, 52, 128, 65, 54, 49, 51, 128, 65, 54, 49, 50, 128, 65, - 54, 49, 49, 128, 65, 54, 49, 48, 128, 65, 54, 48, 57, 128, 65, 54, 48, - 56, 128, 65, 54, 48, 54, 128, 65, 54, 48, 52, 128, 65, 54, 48, 51, 128, - 65, 54, 48, 50, 128, 65, 54, 48, 49, 128, 65, 54, 48, 48, 128, 65, 53, - 57, 56, 128, 65, 53, 57, 54, 128, 65, 53, 57, 53, 128, 65, 53, 57, 52, - 128, 65, 53, 57, 50, 128, 65, 53, 57, 49, 128, 65, 53, 56, 57, 128, 65, - 53, 56, 56, 128, 65, 53, 56, 55, 128, 65, 53, 56, 54, 128, 65, 53, 56, - 53, 128, 65, 53, 56, 52, 128, 65, 53, 56, 51, 128, 65, 53, 56, 50, 128, - 65, 53, 56, 49, 128, 65, 53, 56, 48, 128, 65, 53, 55, 57, 128, 65, 53, - 55, 56, 128, 65, 53, 55, 55, 128, 65, 53, 55, 54, 128, 65, 53, 55, 53, - 128, 65, 53, 55, 52, 128, 65, 53, 55, 51, 128, 65, 53, 55, 50, 128, 65, - 53, 55, 49, 128, 65, 53, 55, 48, 128, 65, 53, 54, 57, 128, 65, 53, 54, - 56, 128, 65, 53, 54, 54, 128, 65, 53, 54, 53, 128, 65, 53, 54, 52, 128, - 65, 53, 54, 51, 128, 65, 53, 53, 57, 128, 65, 53, 53, 55, 128, 65, 53, - 53, 54, 128, 65, 53, 53, 53, 128, 65, 53, 53, 52, 128, 65, 53, 53, 51, - 128, 65, 53, 53, 50, 128, 65, 53, 53, 49, 128, 65, 53, 53, 48, 128, 65, - 53, 52, 57, 128, 65, 53, 52, 56, 128, 65, 53, 52, 55, 128, 65, 53, 52, - 53, 128, 65, 53, 52, 50, 128, 65, 53, 52, 49, 128, 65, 53, 52, 48, 128, - 65, 53, 51, 57, 128, 65, 53, 51, 56, 128, 65, 53, 51, 55, 128, 65, 53, - 51, 54, 128, 65, 53, 51, 53, 128, 65, 53, 51, 52, 128, 65, 53, 51, 50, - 128, 65, 53, 51, 49, 128, 65, 53, 51, 48, 128, 65, 53, 50, 57, 128, 65, - 53, 50, 56, 128, 65, 53, 50, 55, 128, 65, 53, 50, 54, 128, 65, 53, 50, - 53, 128, 65, 53, 50, 52, 128, 65, 53, 50, 51, 128, 65, 53, 50, 50, 128, - 65, 53, 50, 49, 128, 65, 53, 50, 48, 128, 65, 53, 49, 57, 128, 65, 53, - 49, 56, 128, 65, 53, 49, 55, 128, 65, 53, 49, 54, 128, 65, 53, 49, 53, - 128, 65, 53, 49, 52, 128, 65, 53, 49, 51, 128, 65, 53, 49, 50, 128, 65, - 53, 49, 49, 128, 65, 53, 49, 48, 128, 65, 53, 48, 57, 128, 65, 53, 48, - 56, 128, 65, 53, 48, 55, 128, 65, 53, 48, 54, 128, 65, 53, 48, 53, 128, - 65, 53, 48, 52, 128, 65, 53, 48, 51, 128, 65, 53, 48, 50, 128, 65, 53, - 48, 49, 128, 65, 52, 57, 55, 128, 65, 52, 57, 54, 128, 65, 52, 57, 53, - 128, 65, 52, 57, 52, 128, 65, 52, 57, 51, 128, 65, 52, 57, 50, 128, 65, - 52, 57, 49, 128, 65, 52, 57, 48, 128, 65, 52, 56, 57, 128, 65, 52, 56, - 56, 128, 65, 52, 56, 55, 128, 65, 52, 56, 54, 128, 65, 52, 56, 53, 128, - 65, 52, 56, 52, 128, 65, 52, 56, 51, 128, 65, 52, 56, 50, 128, 65, 52, - 56, 49, 128, 65, 52, 56, 48, 128, 65, 52, 55, 57, 128, 65, 52, 55, 56, - 128, 65, 52, 55, 55, 128, 65, 52, 55, 54, 128, 65, 52, 55, 53, 128, 65, - 52, 55, 52, 128, 65, 52, 55, 51, 128, 65, 52, 55, 50, 128, 65, 52, 55, - 49, 128, 65, 52, 55, 48, 128, 65, 52, 54, 57, 128, 65, 52, 54, 56, 128, - 65, 52, 54, 55, 128, 65, 52, 54, 54, 128, 65, 52, 54, 53, 128, 65, 52, - 54, 52, 128, 65, 52, 54, 51, 128, 65, 52, 54, 50, 128, 65, 52, 54, 49, - 128, 65, 52, 54, 48, 128, 65, 52, 53, 57, 128, 65, 52, 53, 56, 128, 65, - 52, 53, 55, 65, 128, 65, 52, 53, 55, 128, 65, 52, 53, 54, 128, 65, 52, - 53, 53, 128, 65, 52, 53, 52, 128, 65, 52, 53, 51, 128, 65, 52, 53, 50, - 128, 65, 52, 53, 49, 128, 65, 52, 53, 48, 65, 128, 65, 52, 53, 48, 128, - 65, 52, 52, 57, 128, 65, 52, 52, 56, 128, 65, 52, 52, 55, 128, 65, 52, - 52, 54, 128, 65, 52, 52, 53, 128, 65, 52, 52, 52, 128, 65, 52, 52, 51, - 128, 65, 52, 52, 50, 128, 65, 52, 52, 49, 128, 65, 52, 52, 48, 128, 65, - 52, 51, 57, 128, 65, 52, 51, 56, 128, 65, 52, 51, 55, 128, 65, 52, 51, - 54, 128, 65, 52, 51, 53, 128, 65, 52, 51, 52, 128, 65, 52, 51, 51, 128, - 65, 52, 51, 50, 128, 65, 52, 51, 49, 128, 65, 52, 51, 48, 128, 65, 52, - 50, 57, 128, 65, 52, 50, 56, 128, 65, 52, 50, 55, 128, 65, 52, 50, 54, - 128, 65, 52, 50, 53, 128, 65, 52, 50, 52, 128, 65, 52, 50, 51, 128, 65, - 52, 50, 50, 128, 65, 52, 50, 49, 128, 65, 52, 50, 48, 128, 65, 52, 49, - 57, 128, 65, 52, 49, 56, 45, 86, 65, 83, 128, 65, 52, 49, 56, 128, 65, - 52, 49, 55, 45, 86, 65, 83, 128, 65, 52, 49, 55, 128, 65, 52, 49, 54, 45, - 86, 65, 83, 128, 65, 52, 49, 54, 128, 65, 52, 49, 53, 45, 86, 65, 83, - 128, 65, 52, 49, 53, 128, 65, 52, 49, 52, 45, 86, 65, 83, 128, 65, 52, - 49, 52, 128, 65, 52, 49, 51, 45, 86, 65, 83, 128, 65, 52, 49, 51, 128, - 65, 52, 49, 50, 45, 86, 65, 83, 128, 65, 52, 49, 50, 128, 65, 52, 49, 49, - 45, 86, 65, 83, 128, 65, 52, 49, 49, 128, 65, 52, 49, 48, 193, 65, 52, - 49, 48, 45, 86, 65, 83, 128, 65, 52, 49, 176, 65, 52, 48, 57, 45, 86, 65, - 83, 128, 65, 52, 48, 57, 128, 65, 52, 48, 56, 45, 86, 65, 83, 128, 65, - 52, 48, 56, 128, 65, 52, 48, 55, 45, 86, 65, 83, 128, 65, 52, 48, 55, - 128, 65, 52, 48, 54, 45, 86, 65, 83, 128, 65, 52, 48, 54, 128, 65, 52, - 48, 53, 45, 86, 65, 83, 128, 65, 52, 48, 53, 128, 65, 52, 48, 52, 45, 86, - 65, 83, 128, 65, 52, 48, 52, 128, 65, 52, 48, 51, 45, 86, 65, 83, 128, - 65, 52, 48, 51, 128, 65, 52, 48, 50, 45, 86, 65, 83, 128, 65, 52, 48, 50, - 128, 65, 52, 48, 49, 45, 86, 65, 83, 128, 65, 52, 48, 49, 128, 65, 52, - 48, 48, 45, 86, 65, 83, 128, 65, 52, 48, 48, 128, 65, 51, 57, 57, 128, - 65, 51, 57, 56, 128, 65, 51, 57, 55, 128, 65, 51, 57, 54, 128, 65, 51, - 57, 53, 128, 65, 51, 57, 52, 128, 65, 51, 57, 179, 65, 51, 57, 50, 128, - 65, 51, 57, 49, 128, 65, 51, 57, 48, 128, 65, 51, 56, 57, 128, 65, 51, - 56, 56, 128, 65, 51, 56, 55, 128, 65, 51, 56, 54, 65, 128, 65, 51, 56, - 54, 128, 65, 51, 56, 53, 128, 65, 51, 56, 52, 128, 65, 51, 56, 51, 65, - 128, 65, 51, 56, 179, 65, 51, 56, 50, 128, 65, 51, 56, 49, 65, 128, 65, - 51, 56, 49, 128, 65, 51, 56, 48, 128, 65, 51, 55, 57, 128, 65, 51, 55, - 56, 128, 65, 51, 55, 55, 128, 65, 51, 55, 54, 128, 65, 51, 55, 53, 128, - 65, 51, 55, 52, 128, 65, 51, 55, 51, 128, 65, 51, 55, 50, 128, 65, 51, - 55, 49, 65, 128, 65, 51, 55, 49, 128, 65, 51, 55, 48, 128, 65, 51, 54, - 57, 128, 65, 51, 54, 56, 65, 128, 65, 51, 54, 56, 128, 65, 51, 54, 55, - 128, 65, 51, 54, 54, 128, 65, 51, 54, 53, 128, 65, 51, 54, 52, 65, 128, - 65, 51, 54, 52, 128, 65, 51, 54, 51, 128, 65, 51, 54, 50, 128, 65, 51, - 54, 49, 128, 65, 51, 54, 48, 128, 65, 51, 53, 57, 65, 128, 65, 51, 53, - 57, 128, 65, 51, 53, 56, 128, 65, 51, 53, 55, 128, 65, 51, 53, 54, 128, - 65, 51, 53, 53, 128, 65, 51, 53, 52, 128, 65, 51, 53, 51, 128, 65, 51, - 53, 50, 128, 65, 51, 53, 49, 128, 65, 51, 53, 48, 128, 65, 51, 52, 57, - 128, 65, 51, 52, 56, 128, 65, 51, 52, 55, 128, 65, 51, 52, 54, 128, 65, - 51, 52, 53, 128, 65, 51, 52, 52, 128, 65, 51, 52, 51, 128, 65, 51, 52, - 50, 128, 65, 51, 52, 49, 128, 65, 51, 52, 48, 128, 65, 51, 51, 57, 128, - 65, 51, 51, 56, 128, 65, 51, 51, 55, 128, 65, 51, 51, 54, 67, 128, 65, - 51, 51, 54, 66, 128, 65, 51, 51, 54, 65, 128, 65, 51, 51, 54, 128, 65, - 51, 51, 53, 128, 65, 51, 51, 52, 128, 65, 51, 51, 51, 128, 65, 51, 51, - 50, 67, 128, 65, 51, 51, 50, 66, 128, 65, 51, 51, 50, 65, 128, 65, 51, - 51, 50, 128, 65, 51, 51, 49, 128, 65, 51, 51, 48, 128, 65, 51, 50, 57, - 65, 128, 65, 51, 50, 57, 128, 65, 51, 50, 56, 128, 65, 51, 50, 55, 128, - 65, 51, 50, 54, 128, 65, 51, 50, 53, 128, 65, 51, 50, 52, 128, 65, 51, - 50, 51, 128, 65, 51, 50, 50, 128, 65, 51, 50, 49, 128, 65, 51, 50, 48, - 128, 65, 51, 49, 57, 128, 65, 51, 49, 56, 128, 65, 51, 49, 55, 128, 65, - 51, 49, 54, 128, 65, 51, 49, 53, 128, 65, 51, 49, 52, 128, 65, 51, 49, - 51, 67, 128, 65, 51, 49, 51, 66, 128, 65, 51, 49, 51, 65, 128, 65, 51, - 49, 51, 128, 65, 51, 49, 50, 128, 65, 51, 49, 49, 128, 65, 51, 49, 48, - 128, 65, 51, 48, 57, 67, 128, 65, 51, 48, 57, 66, 128, 65, 51, 48, 57, - 65, 128, 65, 51, 48, 57, 128, 65, 51, 48, 56, 128, 65, 51, 48, 55, 128, - 65, 51, 48, 54, 128, 65, 51, 48, 53, 128, 65, 51, 48, 52, 128, 65, 51, - 48, 51, 128, 65, 51, 48, 50, 128, 65, 51, 48, 49, 128, 65, 51, 48, 48, - 128, 65, 50, 57, 57, 65, 128, 65, 50, 57, 57, 128, 65, 50, 57, 56, 128, - 65, 50, 57, 55, 128, 65, 50, 57, 54, 128, 65, 50, 57, 53, 128, 65, 50, - 57, 52, 65, 128, 65, 50, 57, 52, 128, 65, 50, 57, 51, 128, 65, 50, 57, - 50, 128, 65, 50, 57, 49, 128, 65, 50, 57, 48, 128, 65, 50, 56, 57, 65, - 128, 65, 50, 56, 57, 128, 65, 50, 56, 56, 128, 65, 50, 56, 55, 128, 65, - 50, 56, 54, 128, 65, 50, 56, 53, 128, 65, 50, 56, 52, 128, 65, 50, 56, - 51, 128, 65, 50, 56, 50, 128, 65, 50, 56, 49, 128, 65, 50, 56, 48, 128, - 65, 50, 55, 57, 128, 65, 50, 55, 56, 128, 65, 50, 55, 55, 128, 65, 50, - 55, 54, 128, 65, 50, 55, 53, 128, 65, 50, 55, 52, 128, 65, 50, 55, 51, - 128, 65, 50, 55, 50, 128, 65, 50, 55, 49, 128, 65, 50, 55, 48, 128, 65, - 50, 54, 57, 128, 65, 50, 54, 56, 128, 65, 50, 54, 55, 65, 128, 65, 50, - 54, 55, 128, 65, 50, 54, 54, 128, 65, 50, 54, 53, 128, 65, 50, 54, 52, - 128, 65, 50, 54, 51, 128, 65, 50, 54, 50, 128, 65, 50, 54, 49, 128, 65, - 50, 54, 48, 128, 65, 50, 53, 57, 128, 65, 50, 53, 56, 128, 65, 50, 53, - 55, 128, 65, 50, 53, 54, 128, 65, 50, 53, 53, 128, 65, 50, 53, 52, 128, - 65, 50, 53, 51, 128, 65, 50, 53, 50, 128, 65, 50, 53, 49, 128, 65, 50, - 53, 48, 128, 65, 50, 52, 57, 128, 65, 50, 52, 56, 128, 65, 50, 52, 55, - 128, 65, 50, 52, 54, 128, 65, 50, 52, 53, 128, 65, 50, 52, 52, 128, 65, - 50, 52, 51, 128, 65, 50, 52, 50, 128, 65, 50, 52, 49, 128, 65, 50, 52, - 48, 128, 65, 50, 51, 57, 128, 65, 50, 51, 56, 128, 65, 50, 51, 55, 128, - 65, 50, 51, 54, 128, 65, 50, 51, 53, 128, 65, 50, 51, 52, 128, 65, 50, - 51, 51, 128, 65, 50, 51, 50, 128, 65, 50, 51, 49, 128, 65, 50, 51, 48, - 128, 65, 50, 50, 57, 128, 65, 50, 50, 56, 128, 65, 50, 50, 55, 65, 128, - 65, 50, 50, 55, 128, 65, 50, 50, 54, 128, 65, 50, 50, 53, 128, 65, 50, - 50, 52, 128, 65, 50, 50, 51, 128, 65, 50, 50, 50, 128, 65, 50, 50, 49, - 128, 65, 50, 50, 48, 128, 65, 50, 49, 57, 128, 65, 50, 49, 56, 128, 65, - 50, 49, 55, 128, 65, 50, 49, 54, 65, 128, 65, 50, 49, 54, 128, 65, 50, - 49, 53, 65, 128, 65, 50, 49, 53, 128, 65, 50, 49, 52, 128, 65, 50, 49, - 51, 128, 65, 50, 49, 50, 128, 65, 50, 49, 49, 128, 65, 50, 49, 48, 128, - 65, 50, 48, 57, 65, 128, 65, 50, 48, 57, 128, 65, 50, 48, 56, 128, 65, - 50, 48, 55, 65, 128, 65, 50, 48, 55, 128, 65, 50, 48, 54, 128, 65, 50, - 48, 53, 128, 65, 50, 48, 52, 128, 65, 50, 48, 51, 128, 65, 50, 48, 50, - 66, 128, 65, 50, 48, 50, 65, 128, 65, 50, 48, 50, 128, 65, 50, 48, 49, - 128, 65, 50, 48, 48, 128, 65, 49, 57, 57, 128, 65, 49, 57, 56, 128, 65, - 49, 57, 55, 128, 65, 49, 57, 54, 128, 65, 49, 57, 53, 128, 65, 49, 57, - 52, 128, 65, 49, 57, 51, 128, 65, 49, 57, 50, 128, 65, 49, 57, 49, 128, - 65, 49, 57, 48, 128, 65, 49, 56, 57, 128, 65, 49, 56, 56, 128, 65, 49, - 56, 55, 128, 65, 49, 56, 54, 128, 65, 49, 56, 53, 128, 65, 49, 56, 52, - 128, 65, 49, 56, 51, 128, 65, 49, 56, 50, 128, 65, 49, 56, 49, 128, 65, - 49, 56, 48, 128, 65, 49, 55, 57, 128, 65, 49, 55, 56, 128, 65, 49, 55, - 55, 128, 65, 49, 55, 54, 128, 65, 49, 55, 53, 128, 65, 49, 55, 52, 128, - 65, 49, 55, 51, 128, 65, 49, 55, 50, 128, 65, 49, 55, 49, 128, 65, 49, - 55, 48, 128, 65, 49, 54, 57, 128, 65, 49, 54, 56, 128, 65, 49, 54, 55, - 128, 65, 49, 54, 54, 128, 65, 49, 54, 53, 128, 65, 49, 54, 52, 128, 65, - 49, 54, 51, 128, 65, 49, 54, 50, 128, 65, 49, 54, 49, 128, 65, 49, 54, - 48, 128, 65, 49, 53, 57, 128, 65, 49, 53, 56, 128, 65, 49, 53, 55, 128, - 65, 49, 53, 54, 128, 65, 49, 53, 53, 128, 65, 49, 53, 52, 128, 65, 49, - 53, 51, 128, 65, 49, 53, 50, 128, 65, 49, 53, 49, 128, 65, 49, 53, 48, - 128, 65, 49, 52, 57, 128, 65, 49, 52, 56, 128, 65, 49, 52, 55, 128, 65, - 49, 52, 54, 128, 65, 49, 52, 53, 128, 65, 49, 52, 52, 128, 65, 49, 52, - 51, 128, 65, 49, 52, 50, 128, 65, 49, 52, 49, 128, 65, 49, 52, 48, 128, - 65, 49, 51, 57, 128, 65, 49, 51, 56, 128, 65, 49, 51, 55, 128, 65, 49, - 51, 54, 128, 65, 49, 51, 53, 65, 128, 65, 49, 51, 53, 128, 65, 49, 51, - 52, 128, 65, 49, 51, 51, 128, 65, 49, 51, 50, 128, 65, 49, 51, 49, 67, - 128, 65, 49, 51, 49, 128, 65, 49, 51, 48, 128, 65, 49, 50, 57, 128, 65, - 49, 50, 56, 128, 65, 49, 50, 55, 128, 65, 49, 50, 54, 128, 65, 49, 50, - 53, 65, 128, 65, 49, 50, 53, 128, 65, 49, 50, 52, 128, 65, 49, 50, 51, - 128, 65, 49, 50, 50, 128, 65, 49, 50, 49, 128, 65, 49, 50, 48, 66, 128, - 65, 49, 50, 48, 128, 65, 49, 49, 57, 128, 65, 49, 49, 56, 128, 65, 49, - 49, 55, 128, 65, 49, 49, 54, 128, 65, 49, 49, 53, 65, 128, 65, 49, 49, - 53, 128, 65, 49, 49, 52, 128, 65, 49, 49, 51, 128, 65, 49, 49, 50, 128, - 65, 49, 49, 49, 128, 65, 49, 49, 48, 66, 128, 65, 49, 49, 48, 65, 128, - 65, 49, 49, 48, 128, 65, 49, 48, 57, 128, 65, 49, 48, 56, 128, 65, 49, - 48, 55, 67, 128, 65, 49, 48, 55, 66, 128, 65, 49, 48, 55, 65, 128, 65, - 49, 48, 55, 128, 65, 49, 48, 54, 128, 65, 49, 48, 53, 66, 128, 65, 49, - 48, 53, 65, 128, 65, 49, 48, 53, 128, 65, 49, 48, 52, 67, 128, 65, 49, - 48, 52, 66, 128, 65, 49, 48, 52, 65, 128, 65, 49, 48, 52, 128, 65, 49, - 48, 51, 128, 65, 49, 48, 50, 65, 128, 65, 49, 48, 50, 128, 65, 49, 48, - 49, 65, 128, 65, 49, 48, 49, 128, 65, 49, 48, 48, 65, 128, 65, 49, 48, - 48, 45, 49, 48, 50, 128, 65, 49, 48, 48, 128, 65, 48, 57, 57, 128, 65, - 48, 57, 56, 65, 128, 65, 48, 57, 56, 128, 65, 48, 57, 55, 65, 128, 65, - 48, 57, 55, 128, 65, 48, 57, 54, 128, 65, 48, 57, 53, 128, 65, 48, 57, - 52, 128, 65, 48, 57, 51, 128, 65, 48, 57, 50, 128, 65, 48, 57, 49, 128, - 65, 48, 57, 48, 128, 65, 48, 56, 57, 128, 65, 48, 56, 56, 128, 65, 48, - 56, 55, 128, 65, 48, 56, 54, 128, 65, 48, 56, 53, 128, 65, 48, 56, 52, - 128, 65, 48, 56, 51, 128, 65, 48, 56, 50, 128, 65, 48, 56, 49, 128, 65, - 48, 56, 48, 128, 65, 48, 55, 57, 128, 65, 48, 55, 56, 128, 65, 48, 55, - 55, 128, 65, 48, 55, 54, 128, 65, 48, 55, 53, 128, 65, 48, 55, 52, 128, - 65, 48, 55, 51, 128, 65, 48, 55, 50, 128, 65, 48, 55, 49, 128, 65, 48, - 55, 48, 128, 65, 48, 54, 57, 128, 65, 48, 54, 56, 128, 65, 48, 54, 55, - 128, 65, 48, 54, 54, 67, 128, 65, 48, 54, 54, 66, 128, 65, 48, 54, 54, - 65, 128, 65, 48, 54, 54, 128, 65, 48, 54, 53, 128, 65, 48, 54, 52, 128, - 65, 48, 54, 51, 128, 65, 48, 54, 50, 128, 65, 48, 54, 49, 128, 65, 48, - 54, 48, 128, 65, 48, 53, 57, 128, 65, 48, 53, 56, 128, 65, 48, 53, 55, - 128, 65, 48, 53, 54, 128, 65, 48, 53, 53, 128, 65, 48, 53, 52, 128, 65, - 48, 53, 51, 128, 65, 48, 53, 50, 128, 65, 48, 53, 49, 128, 65, 48, 53, - 48, 128, 65, 48, 52, 57, 128, 65, 48, 52, 56, 128, 65, 48, 52, 55, 128, - 65, 48, 52, 54, 66, 128, 65, 48, 52, 54, 65, 128, 65, 48, 52, 54, 128, - 65, 48, 52, 53, 65, 128, 65, 48, 52, 53, 128, 65, 48, 52, 52, 128, 65, - 48, 52, 51, 65, 128, 65, 48, 52, 51, 128, 65, 48, 52, 50, 65, 128, 65, - 48, 52, 50, 128, 65, 48, 52, 49, 65, 128, 65, 48, 52, 49, 128, 65, 48, - 52, 48, 65, 128, 65, 48, 52, 48, 128, 65, 48, 51, 57, 65, 128, 65, 48, - 51, 57, 128, 65, 48, 51, 56, 128, 65, 48, 51, 55, 128, 65, 48, 51, 54, - 128, 65, 48, 51, 53, 128, 65, 48, 51, 52, 128, 65, 48, 51, 51, 128, 65, - 48, 51, 50, 65, 128, 65, 48, 50, 56, 66, 128, 65, 48, 50, 54, 65, 128, - 65, 48, 49, 55, 65, 128, 65, 48, 49, 52, 65, 128, 65, 48, 49, 48, 65, - 128, 65, 48, 48, 54, 66, 128, 65, 48, 48, 54, 65, 128, 65, 48, 48, 53, - 65, 128, 65, 45, 87, 79, 128, 65, 45, 69, 85, 128, 45, 85, 205, 45, 80, - 72, 82, 85, 128, 45, 75, 72, 89, 85, 196, 45, 75, 72, 89, 73, 76, 128, - 45, 68, 90, 85, 196, 45, 67, 72, 65, 210, 45, 67, 72, 65, 76, 128, + 76, 65, 80, 72, 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, 85, + 82, 213, 65, 75, 84, 73, 69, 83, 69, 76, 83, 75, 65, 66, 128, 65, 75, 83, + 65, 128, 65, 75, 72, 77, 73, 77, 73, 195, 65, 75, 66, 65, 210, 65, 75, + 65, 82, 65, 128, 65, 75, 65, 82, 193, 65, 73, 89, 65, 78, 78, 65, 128, + 65, 73, 86, 73, 76, 73, 203, 65, 73, 86, 65, 128, 65, 73, 84, 79, 206, + 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 82, 80, 76, 65, 78, 197, 65, + 73, 78, 213, 65, 73, 78, 78, 128, 65, 73, 76, 77, 128, 65, 73, 75, 65, + 82, 65, 128, 65, 73, 72, 86, 85, 83, 128, 65, 72, 83, 68, 65, 128, 65, + 72, 83, 65, 128, 65, 72, 79, 205, 65, 72, 65, 78, 199, 65, 72, 65, 71, + 71, 65, 210, 65, 72, 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, 71, 79, + 71, 201, 65, 71, 71, 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, 71, 82, + 65, 86, 65, 84, 69, 196, 65, 71, 65, 73, 78, 83, 212, 65, 71, 65, 73, 78, + 128, 65, 70, 84, 69, 210, 65, 70, 83, 65, 65, 81, 128, 65, 70, 82, 73, + 67, 65, 206, 65, 70, 79, 82, 69, 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, + 65, 70, 71, 72, 65, 78, 201, 65, 70, 70, 82, 73, 67, 65, 84, 73, 79, 206, + 65, 70, 70, 73, 216, 65, 69, 89, 65, 78, 78, 65, 128, 65, 69, 89, 128, + 65, 69, 83, 67, 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, 67, 128, 65, + 69, 83, 128, 65, 69, 82, 73, 65, 204, 65, 69, 82, 128, 65, 69, 76, 65, + 45, 80, 73, 76, 76, 65, 128, 65, 69, 76, 128, 65, 69, 75, 128, 65, 69, + 71, 69, 65, 206, 65, 69, 71, 128, 65, 69, 69, 89, 65, 78, 78, 65, 128, + 65, 69, 69, 128, 65, 69, 68, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 68, + 128, 65, 69, 66, 128, 65, 68, 86, 65, 78, 84, 65, 71, 69, 128, 65, 68, + 86, 65, 78, 67, 69, 128, 65, 68, 85, 76, 84, 128, 65, 68, 77, 73, 83, 83, + 73, 79, 206, 65, 68, 77, 69, 84, 79, 83, 128, 65, 68, 76, 65, 205, 65, + 68, 72, 69, 83, 73, 86, 197, 65, 68, 69, 71, 128, 65, 68, 69, 199, 65, + 68, 68, 82, 69, 83, 83, 69, 196, 65, 68, 68, 82, 69, 83, 211, 65, 68, 68, + 65, 75, 128, 65, 68, 65, 203, 65, 67, 85, 84, 69, 45, 77, 65, 67, 82, 79, + 78, 128, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, + 69, 128, 65, 67, 85, 84, 197, 65, 67, 84, 85, 65, 76, 76, 217, 65, 67, + 84, 73, 86, 65, 84, 197, 65, 67, 82, 79, 80, 72, 79, 78, 73, 195, 65, 67, + 75, 78, 79, 87, 76, 69, 68, 71, 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, + 84, 73, 79, 78, 128, 65, 67, 67, 79, 85, 78, 212, 65, 67, 67, 79, 82, 68, + 73, 79, 78, 128, 65, 67, 67, 79, 77, 77, 79, 68, 65, 84, 73, 79, 78, 128, + 65, 67, 67, 69, 80, 84, 128, 65, 67, 67, 69, 78, 84, 45, 83, 84, 65, 67, + 67, 65, 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, 69, 78, + 212, 65, 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, 65, 66, + 85, 78, 68, 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, 206, 65, + 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, 76, 73, + 128, 65, 66, 65, 67, 85, 83, 128, 65, 66, 178, 65, 66, 49, 57, 49, 128, + 65, 66, 49, 56, 56, 128, 65, 66, 49, 56, 48, 128, 65, 66, 49, 55, 49, + 128, 65, 66, 49, 54, 52, 128, 65, 66, 49, 51, 49, 66, 128, 65, 66, 49, + 51, 49, 65, 128, 65, 66, 49, 50, 51, 128, 65, 66, 49, 50, 50, 128, 65, + 66, 49, 50, 48, 128, 65, 66, 49, 49, 56, 128, 65, 66, 48, 56, 55, 128, + 65, 66, 48, 56, 54, 128, 65, 66, 48, 56, 53, 128, 65, 66, 48, 56, 50, + 128, 65, 66, 48, 56, 49, 128, 65, 66, 48, 56, 48, 128, 65, 66, 48, 55, + 57, 128, 65, 66, 48, 55, 56, 128, 65, 66, 48, 55, 55, 128, 65, 66, 48, + 55, 54, 128, 65, 66, 48, 55, 52, 128, 65, 66, 48, 55, 51, 128, 65, 66, + 48, 55, 48, 128, 65, 66, 48, 54, 57, 128, 65, 66, 48, 54, 55, 128, 65, + 66, 48, 54, 54, 128, 65, 66, 48, 54, 53, 128, 65, 66, 48, 54, 49, 128, + 65, 66, 48, 54, 48, 128, 65, 66, 48, 53, 57, 128, 65, 66, 48, 53, 56, + 128, 65, 66, 48, 53, 55, 128, 65, 66, 48, 53, 54, 128, 65, 66, 48, 53, + 53, 128, 65, 66, 48, 53, 52, 128, 65, 66, 48, 53, 51, 128, 65, 66, 48, + 53, 49, 128, 65, 66, 48, 53, 48, 128, 65, 66, 48, 52, 57, 128, 65, 66, + 48, 52, 56, 128, 65, 66, 48, 52, 55, 128, 65, 66, 48, 52, 54, 128, 65, + 66, 48, 52, 53, 128, 65, 66, 48, 52, 52, 128, 65, 66, 48, 52, 49, 128, + 65, 66, 48, 52, 48, 128, 65, 66, 48, 51, 57, 128, 65, 66, 48, 51, 56, + 128, 65, 66, 48, 51, 55, 128, 65, 66, 48, 51, 52, 128, 65, 66, 48, 51, + 49, 128, 65, 66, 48, 51, 48, 128, 65, 66, 48, 50, 57, 128, 65, 66, 48, + 50, 56, 128, 65, 66, 48, 50, 55, 128, 65, 66, 48, 50, 54, 128, 65, 66, + 48, 50, 52, 128, 65, 66, 48, 50, 51, 77, 128, 65, 66, 48, 50, 51, 128, + 65, 66, 48, 50, 50, 77, 128, 65, 66, 48, 50, 50, 70, 128, 65, 66, 48, 50, + 50, 128, 65, 66, 48, 50, 49, 77, 128, 65, 66, 48, 50, 49, 70, 128, 65, + 66, 48, 50, 49, 128, 65, 66, 48, 50, 48, 128, 65, 66, 48, 49, 55, 128, + 65, 66, 48, 49, 54, 128, 65, 66, 48, 49, 51, 128, 65, 66, 48, 49, 49, + 128, 65, 66, 48, 49, 48, 128, 65, 66, 48, 48, 57, 128, 65, 66, 48, 48, + 56, 128, 65, 66, 48, 48, 55, 128, 65, 66, 48, 48, 54, 128, 65, 66, 48, + 48, 53, 128, 65, 66, 48, 48, 52, 128, 65, 66, 48, 48, 51, 128, 65, 66, + 48, 48, 50, 128, 65, 66, 48, 48, 49, 128, 65, 65, 90, 72, 65, 65, 75, 75, + 85, 128, 65, 65, 89, 73, 78, 128, 65, 65, 89, 65, 78, 78, 65, 128, 65, + 65, 89, 128, 65, 65, 87, 128, 65, 65, 79, 128, 65, 65, 74, 128, 65, 65, + 66, 65, 65, 70, 73, 76, 73, 128, 65, 65, 48, 51, 50, 128, 65, 65, 48, 51, + 49, 128, 65, 65, 48, 51, 48, 128, 65, 65, 48, 50, 57, 128, 65, 65, 48, + 50, 56, 128, 65, 65, 48, 50, 55, 128, 65, 65, 48, 50, 54, 128, 65, 65, + 48, 50, 53, 128, 65, 65, 48, 50, 52, 128, 65, 65, 48, 50, 51, 128, 65, + 65, 48, 50, 50, 128, 65, 65, 48, 50, 49, 128, 65, 65, 48, 50, 48, 128, + 65, 65, 48, 49, 57, 128, 65, 65, 48, 49, 56, 128, 65, 65, 48, 49, 55, + 128, 65, 65, 48, 49, 54, 128, 65, 65, 48, 49, 53, 128, 65, 65, 48, 49, + 52, 128, 65, 65, 48, 49, 51, 128, 65, 65, 48, 49, 50, 128, 65, 65, 48, + 49, 49, 128, 65, 65, 48, 49, 48, 128, 65, 65, 48, 48, 57, 128, 65, 65, + 48, 48, 56, 128, 65, 65, 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, 65, + 128, 65, 65, 48, 48, 55, 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, 48, + 53, 128, 65, 65, 48, 48, 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, 48, + 48, 50, 128, 65, 65, 48, 48, 49, 128, 65, 56, 48, 55, 128, 65, 56, 48, + 54, 128, 65, 56, 48, 53, 128, 65, 56, 48, 52, 128, 65, 56, 48, 51, 128, + 65, 56, 48, 50, 128, 65, 56, 48, 49, 128, 65, 56, 48, 48, 128, 65, 55, + 51, 178, 65, 55, 50, 182, 65, 55, 49, 183, 65, 55, 49, 181, 65, 55, 49, + 180, 65, 55, 49, 179, 65, 55, 49, 178, 65, 55, 49, 177, 65, 55, 49, 176, + 65, 55, 48, 57, 45, 182, 65, 55, 48, 57, 45, 180, 65, 55, 48, 57, 45, + 179, 65, 55, 48, 57, 45, 178, 65, 55, 48, 185, 65, 55, 48, 184, 65, 55, + 48, 183, 65, 55, 48, 182, 65, 55, 48, 181, 65, 55, 48, 180, 65, 55, 48, + 179, 65, 55, 48, 178, 65, 55, 48, 177, 65, 54, 54, 52, 128, 65, 54, 54, + 51, 128, 65, 54, 54, 50, 128, 65, 54, 54, 49, 128, 65, 54, 54, 48, 128, + 65, 54, 53, 57, 128, 65, 54, 53, 56, 128, 65, 54, 53, 55, 128, 65, 54, + 53, 54, 128, 65, 54, 53, 53, 128, 65, 54, 53, 52, 128, 65, 54, 53, 51, + 128, 65, 54, 53, 50, 128, 65, 54, 53, 49, 128, 65, 54, 52, 57, 128, 65, + 54, 52, 56, 128, 65, 54, 52, 54, 128, 65, 54, 52, 53, 128, 65, 54, 52, + 52, 128, 65, 54, 52, 51, 128, 65, 54, 52, 50, 128, 65, 54, 52, 48, 128, + 65, 54, 51, 56, 128, 65, 54, 51, 55, 128, 65, 54, 51, 52, 128, 65, 54, + 50, 57, 128, 65, 54, 50, 56, 128, 65, 54, 50, 55, 128, 65, 54, 50, 54, + 128, 65, 54, 50, 52, 128, 65, 54, 50, 51, 128, 65, 54, 50, 50, 128, 65, + 54, 50, 49, 128, 65, 54, 50, 48, 128, 65, 54, 49, 57, 128, 65, 54, 49, + 56, 128, 65, 54, 49, 55, 128, 65, 54, 49, 54, 128, 65, 54, 49, 53, 128, + 65, 54, 49, 52, 128, 65, 54, 49, 51, 128, 65, 54, 49, 50, 128, 65, 54, + 49, 49, 128, 65, 54, 49, 48, 128, 65, 54, 48, 57, 128, 65, 54, 48, 56, + 128, 65, 54, 48, 54, 128, 65, 54, 48, 52, 128, 65, 54, 48, 51, 128, 65, + 54, 48, 50, 128, 65, 54, 48, 49, 128, 65, 54, 48, 48, 128, 65, 53, 57, + 56, 128, 65, 53, 57, 54, 128, 65, 53, 57, 53, 128, 65, 53, 57, 52, 128, + 65, 53, 57, 50, 128, 65, 53, 57, 49, 128, 65, 53, 56, 57, 128, 65, 53, + 56, 56, 128, 65, 53, 56, 55, 128, 65, 53, 56, 54, 128, 65, 53, 56, 53, + 128, 65, 53, 56, 52, 128, 65, 53, 56, 51, 128, 65, 53, 56, 50, 128, 65, + 53, 56, 49, 128, 65, 53, 56, 48, 128, 65, 53, 55, 57, 128, 65, 53, 55, + 56, 128, 65, 53, 55, 55, 128, 65, 53, 55, 54, 128, 65, 53, 55, 53, 128, + 65, 53, 55, 52, 128, 65, 53, 55, 51, 128, 65, 53, 55, 50, 128, 65, 53, + 55, 49, 128, 65, 53, 55, 48, 128, 65, 53, 54, 57, 128, 65, 53, 54, 56, + 128, 65, 53, 54, 54, 128, 65, 53, 54, 53, 128, 65, 53, 54, 52, 128, 65, + 53, 54, 51, 128, 65, 53, 53, 57, 128, 65, 53, 53, 55, 128, 65, 53, 53, + 54, 128, 65, 53, 53, 53, 128, 65, 53, 53, 52, 128, 65, 53, 53, 51, 128, + 65, 53, 53, 50, 128, 65, 53, 53, 49, 128, 65, 53, 53, 48, 128, 65, 53, + 52, 57, 128, 65, 53, 52, 56, 128, 65, 53, 52, 55, 128, 65, 53, 52, 53, + 128, 65, 53, 52, 50, 128, 65, 53, 52, 49, 128, 65, 53, 52, 48, 128, 65, + 53, 51, 57, 128, 65, 53, 51, 56, 128, 65, 53, 51, 55, 128, 65, 53, 51, + 54, 128, 65, 53, 51, 53, 128, 65, 53, 51, 52, 128, 65, 53, 51, 50, 128, + 65, 53, 51, 49, 128, 65, 53, 51, 48, 128, 65, 53, 50, 57, 128, 65, 53, + 50, 56, 128, 65, 53, 50, 55, 128, 65, 53, 50, 54, 128, 65, 53, 50, 53, + 128, 65, 53, 50, 52, 128, 65, 53, 50, 51, 128, 65, 53, 50, 50, 128, 65, + 53, 50, 49, 128, 65, 53, 50, 48, 128, 65, 53, 49, 57, 128, 65, 53, 49, + 56, 128, 65, 53, 49, 55, 128, 65, 53, 49, 54, 128, 65, 53, 49, 53, 128, + 65, 53, 49, 52, 128, 65, 53, 49, 51, 128, 65, 53, 49, 50, 128, 65, 53, + 49, 49, 128, 65, 53, 49, 48, 128, 65, 53, 48, 57, 128, 65, 53, 48, 56, + 128, 65, 53, 48, 55, 128, 65, 53, 48, 54, 128, 65, 53, 48, 53, 128, 65, + 53, 48, 52, 128, 65, 53, 48, 51, 128, 65, 53, 48, 50, 128, 65, 53, 48, + 49, 128, 65, 52, 57, 55, 128, 65, 52, 57, 54, 128, 65, 52, 57, 53, 128, + 65, 52, 57, 52, 128, 65, 52, 57, 51, 128, 65, 52, 57, 50, 128, 65, 52, + 57, 49, 128, 65, 52, 57, 48, 128, 65, 52, 56, 57, 128, 65, 52, 56, 56, + 128, 65, 52, 56, 55, 128, 65, 52, 56, 54, 128, 65, 52, 56, 53, 128, 65, + 52, 56, 52, 128, 65, 52, 56, 51, 128, 65, 52, 56, 50, 128, 65, 52, 56, + 49, 128, 65, 52, 56, 48, 128, 65, 52, 55, 57, 128, 65, 52, 55, 56, 128, + 65, 52, 55, 55, 128, 65, 52, 55, 54, 128, 65, 52, 55, 53, 128, 65, 52, + 55, 52, 128, 65, 52, 55, 51, 128, 65, 52, 55, 50, 128, 65, 52, 55, 49, + 128, 65, 52, 55, 48, 128, 65, 52, 54, 57, 128, 65, 52, 54, 56, 128, 65, + 52, 54, 55, 128, 65, 52, 54, 54, 128, 65, 52, 54, 53, 128, 65, 52, 54, + 52, 128, 65, 52, 54, 51, 128, 65, 52, 54, 50, 128, 65, 52, 54, 49, 128, + 65, 52, 54, 48, 128, 65, 52, 53, 57, 128, 65, 52, 53, 56, 128, 65, 52, + 53, 55, 65, 128, 65, 52, 53, 55, 128, 65, 52, 53, 54, 128, 65, 52, 53, + 53, 128, 65, 52, 53, 52, 128, 65, 52, 53, 51, 128, 65, 52, 53, 50, 128, + 65, 52, 53, 49, 128, 65, 52, 53, 48, 65, 128, 65, 52, 53, 48, 128, 65, + 52, 52, 57, 128, 65, 52, 52, 56, 128, 65, 52, 52, 55, 128, 65, 52, 52, + 54, 128, 65, 52, 52, 53, 128, 65, 52, 52, 52, 128, 65, 52, 52, 51, 128, + 65, 52, 52, 50, 128, 65, 52, 52, 49, 128, 65, 52, 52, 48, 128, 65, 52, + 51, 57, 128, 65, 52, 51, 56, 128, 65, 52, 51, 55, 128, 65, 52, 51, 54, + 128, 65, 52, 51, 53, 128, 65, 52, 51, 52, 128, 65, 52, 51, 51, 128, 65, + 52, 51, 50, 128, 65, 52, 51, 49, 128, 65, 52, 51, 48, 128, 65, 52, 50, + 57, 128, 65, 52, 50, 56, 128, 65, 52, 50, 55, 128, 65, 52, 50, 54, 128, + 65, 52, 50, 53, 128, 65, 52, 50, 52, 128, 65, 52, 50, 51, 128, 65, 52, + 50, 50, 128, 65, 52, 50, 49, 128, 65, 52, 50, 48, 128, 65, 52, 49, 57, + 128, 65, 52, 49, 56, 45, 86, 65, 83, 128, 65, 52, 49, 56, 128, 65, 52, + 49, 55, 45, 86, 65, 83, 128, 65, 52, 49, 55, 128, 65, 52, 49, 54, 45, 86, + 65, 83, 128, 65, 52, 49, 54, 128, 65, 52, 49, 53, 45, 86, 65, 83, 128, + 65, 52, 49, 53, 128, 65, 52, 49, 52, 45, 86, 65, 83, 128, 65, 52, 49, 52, + 128, 65, 52, 49, 51, 45, 86, 65, 83, 128, 65, 52, 49, 51, 128, 65, 52, + 49, 50, 45, 86, 65, 83, 128, 65, 52, 49, 50, 128, 65, 52, 49, 49, 45, 86, + 65, 83, 128, 65, 52, 49, 49, 128, 65, 52, 49, 48, 193, 65, 52, 49, 48, + 45, 86, 65, 83, 128, 65, 52, 49, 176, 65, 52, 48, 57, 45, 86, 65, 83, + 128, 65, 52, 48, 57, 128, 65, 52, 48, 56, 45, 86, 65, 83, 128, 65, 52, + 48, 56, 128, 65, 52, 48, 55, 45, 86, 65, 83, 128, 65, 52, 48, 55, 128, + 65, 52, 48, 54, 45, 86, 65, 83, 128, 65, 52, 48, 54, 128, 65, 52, 48, 53, + 45, 86, 65, 83, 128, 65, 52, 48, 53, 128, 65, 52, 48, 52, 45, 86, 65, 83, + 128, 65, 52, 48, 52, 128, 65, 52, 48, 51, 45, 86, 65, 83, 128, 65, 52, + 48, 51, 128, 65, 52, 48, 50, 45, 86, 65, 83, 128, 65, 52, 48, 50, 128, + 65, 52, 48, 49, 45, 86, 65, 83, 128, 65, 52, 48, 49, 128, 65, 52, 48, 48, + 45, 86, 65, 83, 128, 65, 52, 48, 48, 128, 65, 51, 57, 57, 128, 65, 51, + 57, 56, 128, 65, 51, 57, 55, 128, 65, 51, 57, 54, 128, 65, 51, 57, 53, + 128, 65, 51, 57, 52, 128, 65, 51, 57, 179, 65, 51, 57, 50, 128, 65, 51, + 57, 49, 128, 65, 51, 57, 48, 128, 65, 51, 56, 57, 128, 65, 51, 56, 56, + 128, 65, 51, 56, 55, 128, 65, 51, 56, 54, 65, 128, 65, 51, 56, 54, 128, + 65, 51, 56, 53, 128, 65, 51, 56, 52, 128, 65, 51, 56, 51, 65, 128, 65, + 51, 56, 179, 65, 51, 56, 50, 128, 65, 51, 56, 49, 65, 128, 65, 51, 56, + 49, 128, 65, 51, 56, 48, 128, 65, 51, 55, 57, 128, 65, 51, 55, 56, 128, + 65, 51, 55, 55, 128, 65, 51, 55, 54, 128, 65, 51, 55, 53, 128, 65, 51, + 55, 52, 128, 65, 51, 55, 51, 128, 65, 51, 55, 50, 128, 65, 51, 55, 49, + 65, 128, 65, 51, 55, 49, 128, 65, 51, 55, 48, 128, 65, 51, 54, 57, 128, + 65, 51, 54, 56, 65, 128, 65, 51, 54, 56, 128, 65, 51, 54, 55, 128, 65, + 51, 54, 54, 128, 65, 51, 54, 53, 128, 65, 51, 54, 52, 65, 128, 65, 51, + 54, 52, 128, 65, 51, 54, 51, 128, 65, 51, 54, 50, 128, 65, 51, 54, 49, + 128, 65, 51, 54, 48, 128, 65, 51, 53, 57, 65, 128, 65, 51, 53, 57, 128, + 65, 51, 53, 56, 128, 65, 51, 53, 55, 128, 65, 51, 53, 54, 128, 65, 51, + 53, 53, 128, 65, 51, 53, 52, 128, 65, 51, 53, 51, 128, 65, 51, 53, 50, + 128, 65, 51, 53, 49, 128, 65, 51, 53, 48, 128, 65, 51, 52, 57, 128, 65, + 51, 52, 56, 128, 65, 51, 52, 55, 128, 65, 51, 52, 54, 128, 65, 51, 52, + 53, 128, 65, 51, 52, 52, 128, 65, 51, 52, 51, 128, 65, 51, 52, 50, 128, + 65, 51, 52, 49, 128, 65, 51, 52, 48, 128, 65, 51, 51, 57, 128, 65, 51, + 51, 56, 128, 65, 51, 51, 55, 128, 65, 51, 51, 54, 67, 128, 65, 51, 51, + 54, 66, 128, 65, 51, 51, 54, 65, 128, 65, 51, 51, 54, 128, 65, 51, 51, + 53, 128, 65, 51, 51, 52, 128, 65, 51, 51, 51, 128, 65, 51, 51, 50, 67, + 128, 65, 51, 51, 50, 66, 128, 65, 51, 51, 50, 65, 128, 65, 51, 51, 50, + 128, 65, 51, 51, 49, 128, 65, 51, 51, 48, 128, 65, 51, 50, 57, 65, 128, + 65, 51, 50, 57, 128, 65, 51, 50, 56, 128, 65, 51, 50, 55, 128, 65, 51, + 50, 54, 128, 65, 51, 50, 53, 128, 65, 51, 50, 52, 128, 65, 51, 50, 51, + 128, 65, 51, 50, 50, 128, 65, 51, 50, 49, 128, 65, 51, 50, 48, 128, 65, + 51, 49, 57, 128, 65, 51, 49, 56, 128, 65, 51, 49, 55, 128, 65, 51, 49, + 54, 128, 65, 51, 49, 53, 128, 65, 51, 49, 52, 128, 65, 51, 49, 51, 67, + 128, 65, 51, 49, 51, 66, 128, 65, 51, 49, 51, 65, 128, 65, 51, 49, 51, + 128, 65, 51, 49, 50, 128, 65, 51, 49, 49, 128, 65, 51, 49, 48, 128, 65, + 51, 48, 57, 67, 128, 65, 51, 48, 57, 66, 128, 65, 51, 48, 57, 65, 128, + 65, 51, 48, 57, 128, 65, 51, 48, 56, 128, 65, 51, 48, 55, 128, 65, 51, + 48, 54, 128, 65, 51, 48, 53, 128, 65, 51, 48, 52, 128, 65, 51, 48, 51, + 128, 65, 51, 48, 50, 128, 65, 51, 48, 49, 128, 65, 51, 48, 48, 128, 65, + 50, 57, 57, 65, 128, 65, 50, 57, 57, 128, 65, 50, 57, 56, 128, 65, 50, + 57, 55, 128, 65, 50, 57, 54, 128, 65, 50, 57, 53, 128, 65, 50, 57, 52, + 65, 128, 65, 50, 57, 52, 128, 65, 50, 57, 51, 128, 65, 50, 57, 50, 128, + 65, 50, 57, 49, 128, 65, 50, 57, 48, 128, 65, 50, 56, 57, 65, 128, 65, + 50, 56, 57, 128, 65, 50, 56, 56, 128, 65, 50, 56, 55, 128, 65, 50, 56, + 54, 128, 65, 50, 56, 53, 128, 65, 50, 56, 52, 128, 65, 50, 56, 51, 128, + 65, 50, 56, 50, 128, 65, 50, 56, 49, 128, 65, 50, 56, 48, 128, 65, 50, + 55, 57, 128, 65, 50, 55, 56, 128, 65, 50, 55, 55, 128, 65, 50, 55, 54, + 128, 65, 50, 55, 53, 128, 65, 50, 55, 52, 128, 65, 50, 55, 51, 128, 65, + 50, 55, 50, 128, 65, 50, 55, 49, 128, 65, 50, 55, 48, 128, 65, 50, 54, + 57, 128, 65, 50, 54, 56, 128, 65, 50, 54, 55, 65, 128, 65, 50, 54, 55, + 128, 65, 50, 54, 54, 128, 65, 50, 54, 53, 128, 65, 50, 54, 52, 128, 65, + 50, 54, 51, 128, 65, 50, 54, 50, 128, 65, 50, 54, 49, 128, 65, 50, 54, + 48, 128, 65, 50, 53, 57, 128, 65, 50, 53, 56, 128, 65, 50, 53, 55, 128, + 65, 50, 53, 54, 128, 65, 50, 53, 53, 128, 65, 50, 53, 52, 128, 65, 50, + 53, 51, 128, 65, 50, 53, 50, 128, 65, 50, 53, 49, 128, 65, 50, 53, 48, + 128, 65, 50, 52, 57, 128, 65, 50, 52, 56, 128, 65, 50, 52, 55, 128, 65, + 50, 52, 54, 128, 65, 50, 52, 53, 128, 65, 50, 52, 52, 128, 65, 50, 52, + 51, 128, 65, 50, 52, 50, 128, 65, 50, 52, 49, 128, 65, 50, 52, 48, 128, + 65, 50, 51, 57, 128, 65, 50, 51, 56, 128, 65, 50, 51, 55, 128, 65, 50, + 51, 54, 128, 65, 50, 51, 53, 128, 65, 50, 51, 52, 128, 65, 50, 51, 51, + 128, 65, 50, 51, 50, 128, 65, 50, 51, 49, 128, 65, 50, 51, 48, 128, 65, + 50, 50, 57, 128, 65, 50, 50, 56, 128, 65, 50, 50, 55, 65, 128, 65, 50, + 50, 55, 128, 65, 50, 50, 54, 128, 65, 50, 50, 53, 128, 65, 50, 50, 52, + 128, 65, 50, 50, 51, 128, 65, 50, 50, 50, 128, 65, 50, 50, 49, 128, 65, + 50, 50, 48, 128, 65, 50, 49, 57, 128, 65, 50, 49, 56, 128, 65, 50, 49, + 55, 128, 65, 50, 49, 54, 65, 128, 65, 50, 49, 54, 128, 65, 50, 49, 53, + 65, 128, 65, 50, 49, 53, 128, 65, 50, 49, 52, 128, 65, 50, 49, 51, 128, + 65, 50, 49, 50, 128, 65, 50, 49, 49, 128, 65, 50, 49, 48, 128, 65, 50, + 48, 57, 65, 128, 65, 50, 48, 57, 128, 65, 50, 48, 56, 128, 65, 50, 48, + 55, 65, 128, 65, 50, 48, 55, 128, 65, 50, 48, 54, 128, 65, 50, 48, 53, + 128, 65, 50, 48, 52, 128, 65, 50, 48, 51, 128, 65, 50, 48, 50, 66, 128, + 65, 50, 48, 50, 65, 128, 65, 50, 48, 50, 128, 65, 50, 48, 49, 128, 65, + 50, 48, 48, 128, 65, 49, 57, 57, 128, 65, 49, 57, 56, 128, 65, 49, 57, + 55, 128, 65, 49, 57, 54, 128, 65, 49, 57, 53, 128, 65, 49, 57, 52, 128, + 65, 49, 57, 51, 128, 65, 49, 57, 50, 128, 65, 49, 57, 49, 128, 65, 49, + 57, 48, 128, 65, 49, 56, 57, 128, 65, 49, 56, 56, 128, 65, 49, 56, 55, + 128, 65, 49, 56, 54, 128, 65, 49, 56, 53, 128, 65, 49, 56, 52, 128, 65, + 49, 56, 51, 128, 65, 49, 56, 50, 128, 65, 49, 56, 49, 128, 65, 49, 56, + 48, 128, 65, 49, 55, 57, 128, 65, 49, 55, 56, 128, 65, 49, 55, 55, 128, + 65, 49, 55, 54, 128, 65, 49, 55, 53, 128, 65, 49, 55, 52, 128, 65, 49, + 55, 51, 128, 65, 49, 55, 50, 128, 65, 49, 55, 49, 128, 65, 49, 55, 48, + 128, 65, 49, 54, 57, 128, 65, 49, 54, 56, 128, 65, 49, 54, 55, 128, 65, + 49, 54, 54, 128, 65, 49, 54, 53, 128, 65, 49, 54, 52, 128, 65, 49, 54, + 51, 128, 65, 49, 54, 50, 128, 65, 49, 54, 49, 128, 65, 49, 54, 48, 128, + 65, 49, 53, 57, 128, 65, 49, 53, 56, 128, 65, 49, 53, 55, 128, 65, 49, + 53, 54, 128, 65, 49, 53, 53, 128, 65, 49, 53, 52, 128, 65, 49, 53, 51, + 128, 65, 49, 53, 50, 128, 65, 49, 53, 49, 128, 65, 49, 53, 48, 128, 65, + 49, 52, 57, 128, 65, 49, 52, 56, 128, 65, 49, 52, 55, 128, 65, 49, 52, + 54, 128, 65, 49, 52, 53, 128, 65, 49, 52, 52, 128, 65, 49, 52, 51, 128, + 65, 49, 52, 50, 128, 65, 49, 52, 49, 128, 65, 49, 52, 48, 128, 65, 49, + 51, 57, 128, 65, 49, 51, 56, 128, 65, 49, 51, 55, 128, 65, 49, 51, 54, + 128, 65, 49, 51, 53, 65, 128, 65, 49, 51, 53, 128, 65, 49, 51, 52, 128, + 65, 49, 51, 51, 128, 65, 49, 51, 50, 128, 65, 49, 51, 49, 67, 128, 65, + 49, 51, 49, 128, 65, 49, 51, 48, 128, 65, 49, 50, 57, 128, 65, 49, 50, + 56, 128, 65, 49, 50, 55, 128, 65, 49, 50, 54, 128, 65, 49, 50, 53, 65, + 128, 65, 49, 50, 53, 128, 65, 49, 50, 52, 128, 65, 49, 50, 51, 128, 65, + 49, 50, 50, 128, 65, 49, 50, 49, 128, 65, 49, 50, 48, 66, 128, 65, 49, + 50, 48, 128, 65, 49, 49, 57, 128, 65, 49, 49, 56, 128, 65, 49, 49, 55, + 128, 65, 49, 49, 54, 128, 65, 49, 49, 53, 65, 128, 65, 49, 49, 53, 128, + 65, 49, 49, 52, 128, 65, 49, 49, 51, 128, 65, 49, 49, 50, 128, 65, 49, + 49, 49, 128, 65, 49, 49, 48, 66, 128, 65, 49, 49, 48, 65, 128, 65, 49, + 49, 48, 128, 65, 49, 48, 57, 128, 65, 49, 48, 56, 128, 65, 49, 48, 55, + 67, 128, 65, 49, 48, 55, 66, 128, 65, 49, 48, 55, 65, 128, 65, 49, 48, + 55, 128, 65, 49, 48, 54, 128, 65, 49, 48, 53, 66, 128, 65, 49, 48, 53, + 65, 128, 65, 49, 48, 53, 128, 65, 49, 48, 52, 67, 128, 65, 49, 48, 52, + 66, 128, 65, 49, 48, 52, 65, 128, 65, 49, 48, 52, 128, 65, 49, 48, 51, + 128, 65, 49, 48, 50, 65, 128, 65, 49, 48, 50, 128, 65, 49, 48, 49, 65, + 128, 65, 49, 48, 49, 128, 65, 49, 48, 48, 65, 128, 65, 49, 48, 48, 45, + 49, 48, 50, 128, 65, 49, 48, 48, 128, 65, 48, 57, 57, 128, 65, 48, 57, + 56, 65, 128, 65, 48, 57, 56, 128, 65, 48, 57, 55, 65, 128, 65, 48, 57, + 55, 128, 65, 48, 57, 54, 128, 65, 48, 57, 53, 128, 65, 48, 57, 52, 128, + 65, 48, 57, 51, 128, 65, 48, 57, 50, 128, 65, 48, 57, 49, 128, 65, 48, + 57, 48, 128, 65, 48, 56, 57, 128, 65, 48, 56, 56, 128, 65, 48, 56, 55, + 128, 65, 48, 56, 54, 128, 65, 48, 56, 53, 128, 65, 48, 56, 52, 128, 65, + 48, 56, 51, 128, 65, 48, 56, 50, 128, 65, 48, 56, 49, 128, 65, 48, 56, + 48, 128, 65, 48, 55, 57, 128, 65, 48, 55, 56, 128, 65, 48, 55, 55, 128, + 65, 48, 55, 54, 128, 65, 48, 55, 53, 128, 65, 48, 55, 52, 128, 65, 48, + 55, 51, 128, 65, 48, 55, 50, 128, 65, 48, 55, 49, 128, 65, 48, 55, 48, + 128, 65, 48, 54, 57, 128, 65, 48, 54, 56, 128, 65, 48, 54, 55, 128, 65, + 48, 54, 54, 67, 128, 65, 48, 54, 54, 66, 128, 65, 48, 54, 54, 65, 128, + 65, 48, 54, 54, 128, 65, 48, 54, 53, 128, 65, 48, 54, 52, 128, 65, 48, + 54, 51, 128, 65, 48, 54, 50, 128, 65, 48, 54, 49, 128, 65, 48, 54, 48, + 128, 65, 48, 53, 57, 128, 65, 48, 53, 56, 128, 65, 48, 53, 55, 128, 65, + 48, 53, 54, 128, 65, 48, 53, 53, 128, 65, 48, 53, 52, 128, 65, 48, 53, + 51, 128, 65, 48, 53, 50, 128, 65, 48, 53, 49, 128, 65, 48, 53, 48, 128, + 65, 48, 52, 57, 128, 65, 48, 52, 56, 128, 65, 48, 52, 55, 128, 65, 48, + 52, 54, 66, 128, 65, 48, 52, 54, 65, 128, 65, 48, 52, 54, 128, 65, 48, + 52, 53, 65, 128, 65, 48, 52, 53, 128, 65, 48, 52, 52, 128, 65, 48, 52, + 51, 65, 128, 65, 48, 52, 51, 128, 65, 48, 52, 50, 65, 128, 65, 48, 52, + 50, 128, 65, 48, 52, 49, 65, 128, 65, 48, 52, 49, 128, 65, 48, 52, 48, + 65, 128, 65, 48, 52, 48, 128, 65, 48, 51, 57, 65, 128, 65, 48, 51, 57, + 128, 65, 48, 51, 56, 128, 65, 48, 51, 55, 128, 65, 48, 51, 54, 128, 65, + 48, 51, 53, 128, 65, 48, 51, 52, 128, 65, 48, 51, 51, 128, 65, 48, 51, + 50, 65, 128, 65, 48, 50, 56, 66, 128, 65, 48, 50, 54, 65, 128, 65, 48, + 49, 55, 65, 128, 65, 48, 49, 52, 65, 128, 65, 48, 49, 48, 65, 128, 65, + 48, 48, 54, 66, 128, 65, 48, 48, 54, 65, 128, 65, 48, 48, 53, 65, 128, + 65, 45, 87, 79, 128, 65, 45, 69, 85, 128, 45, 85, 205, 45, 80, 72, 82, + 85, 128, 45, 75, 72, 89, 85, 196, 45, 75, 72, 89, 73, 76, 128, 45, 68, + 90, 85, 196, 45, 67, 72, 65, 210, 45, 67, 72, 65, 76, 128, }; static const unsigned int lexicon_offset[] = { - 0, 0, 6, 10, 14, 19, 27, 34, 44, 49, 55, 64, 66, 69, 81, 89, 102, 108, - 113, 118, 124, 129, 137, 146, 157, 162, 167, 170, 174, 183, 189, 195, - 201, 206, 214, 221, 229, 171, 232, 241, 242, 250, 256, 261, 266, 273, - 283, 290, 296, 301, 304, 308, 314, 320, 325, 328, 333, 343, 349, 354, - 359, 365, 370, 379, 381, 388, 395, 397, 406, 347, 408, 416, 424, 426, - 434, 435, 442, 445, 447, 452, 458, 465, 470, 477, 485, 492, 497, 502, - 506, 512, 517, 522, 532, 539, 542, 550, 558, 567, 570, 574, 577, 581, - 591, 595, 602, 609, 616, 623, 632, 641, 645, 652, 655, 661, 665, 673, - 678, 687, 265, 691, 704, 708, 713, 718, 724, 726, 736, 739, 743, 748, - 756, 760, 769, 774, 780, 786, 790, 795, 803, 812, 821, 829, 837, 840, - 793, 851, 857, 862, 870, 877, 880, 890, 894, 898, 905, 909, 912, 919, - 923, 614, 929, 938, 941, 946, 952, 955, 959, 962, 966, 969, 972, 981, - 987, 990, 995, 1004, 1009, 576, 1012, 1018, 1026, 1031, 1035, 1040, 1043, - 1046, 1052, 1058, 1065, 1073, 1076, 1085, 1093, 1097, 1104, 1110, 1115, - 1120, 1126, 1131, 1136, 1141, 1145, 1150, 1156, 1161, 1166, 1170, 1176, - 1181, 1186, 1191, 1195, 1200, 1205, 1210, 1216, 1222, 1228, 1233, 1237, - 1242, 1247, 1252, 1256, 1261, 1266, 1271, 1276, 1111, 1116, 1121, 1127, - 1132, 1280, 1142, 1286, 1291, 1296, 1303, 1307, 1310, 1319, 1146, 1323, - 1151, 1157, 1162, 1327, 1332, 1337, 1341, 1345, 1351, 1355, 1167, 1358, - 1360, 1177, 1365, 1369, 1182, 1375, 1187, 1379, 1383, 1390, 1192, 1394, - 1399, 1403, 1406, 1410, 1196, 1201, 1415, 1421, 1206, 1433, 1439, 1445, - 1451, 1211, 1223, 1229, 1455, 1459, 1463, 1466, 1234, 1470, 1472, 1477, - 1482, 1488, 1493, 1498, 1502, 1507, 1512, 1517, 1522, 1528, 1533, 1538, - 1544, 1550, 1555, 1559, 1564, 1569, 1574, 1579, 1584, 1588, 1596, 1601, - 1605, 1610, 1615, 1620, 1625, 1629, 1632, 1639, 1644, 1649, 1654, 1659, - 1665, 1670, 1674, 1238, 1677, 1682, 1687, 1692, 1243, 1696, 1700, 1707, - 1248, 1714, 1719, 1253, 1723, 1725, 1730, 1741, 1747, 1257, 1752, 1761, - 1262, 1766, 1772, 1777, 1267, 1782, 1791, 1796, 1800, 1803, 1808, 1812, - 1816, 1820, 1823, 1827, 1272, 1832, 1277, 1836, 1838, 1844, 1850, 1856, - 1862, 1868, 1874, 1880, 1886, 1891, 1897, 1903, 1909, 1915, 1921, 1927, - 1933, 1939, 1945, 1950, 1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, - 1995, 2001, 2006, 2012, 2017, 2023, 2029, 2034, 2040, 2046, 2052, 2058, - 2063, 2068, 2070, 2071, 2075, 2079, 2084, 2088, 2092, 2096, 2101, 2105, - 2108, 2113, 2117, 2122, 2126, 2130, 2135, 2139, 2142, 2146, 2152, 2166, - 2170, 2174, 2178, 2181, 2186, 2190, 2194, 2197, 2201, 2206, 2211, 2216, - 2221, 2225, 2229, 2233, 2237, 2241, 2246, 2250, 2255, 2259, 2264, 2270, - 2277, 2283, 2288, 2293, 2298, 2304, 2309, 2315, 2320, 2325, 2330, 2335, - 2340, 2343, 2345, 1128, 2349, 2356, 2364, 2374, 2383, 2397, 2401, 2405, - 2410, 2423, 2431, 2434, 2438, 2443, 2447, 2450, 2454, 2458, 2463, 1736, - 2468, 2472, 2475, 2479, 2485, 2492, 2499, 2505, 2510, 2515, 2521, 2527, - 2532, 2537, 2542, 2547, 2552, 2557, 2482, 2562, 1727, 2564, 2570, 2574, - 2579, 2583, 2587, 1635, 1749, 2592, 2596, 2600, 2603, 2608, 2613, 2618, - 2623, 2627, 2634, 2639, 2642, 2646, 2653, 2659, 2663, 2667, 2671, 2676, - 2683, 2688, 2693, 2700, 2706, 2712, 2718, 2739, 2753, 2770, 2785, 2801, - 2818, 2833, 2842, 2847, 2851, 2856, 2861, 2865, 2877, 2884, 2890, 2273, - 2896, 2903, 2909, 2913, 2916, 2923, 2929, 2934, 2938, 2943, 2947, 2951, - 2093, 2955, 2960, 2965, 2969, 2974, 2982, 2986, 2993, 2998, 3002, 3006, - 3010, 3015, 3020, 3025, 3029, 3034, 3039, 3043, 3048, 3053, 3057, 3060, - 3064, 3068, 3076, 3081, 3085, 3089, 3095, 3104, 3108, 3112, 3118, 3123, - 3130, 3134, 3144, 3148, 3152, 3157, 3161, 3166, 3172, 3177, 3181, 3185, - 3189, 2495, 3197, 3202, 3208, 3213, 3217, 3222, 3227, 3231, 3237, 3242, - 2097, 3248, 3254, 3259, 3264, 3269, 3274, 3279, 3284, 3289, 3294, 3299, - 3304, 3309, 3314, 3319, 3324, 3330, 3335, 1143, 101, 3341, 3345, 3349, - 3353, 3358, 3362, 3366, 3372, 3377, 3381, 3385, 3390, 3395, 3399, 3404, - 3408, 3411, 3415, 3420, 3424, 3429, 3433, 3436, 3438, 3442, 3446, 3451, - 3455, 3458, 3471, 3475, 3479, 3483, 3488, 3492, 3496, 3499, 3503, 3507, - 3512, 3516, 3521, 3526, 3531, 3535, 3542, 3547, 3550, 3553, 3558, 3564, - 3568, 3572, 3575, 3580, 3584, 3589, 3593, 3597, 3600, 3606, 3611, 3616, - 3622, 3627, 3632, 3638, 3644, 3649, 3654, 3659, 3664, 964, 654, 3667, - 3670, 3675, 3679, 3683, 3687, 3691, 3694, 3698, 3703, 3708, 3712, 3717, - 3721, 3726, 3730, 3734, 3738, 3744, 3750, 3753, 3756, 150, 3762, 3767, - 3776, 3784, 3793, 3803, 3810, 3816, 3823, 3828, 3832, 3836, 3844, 3851, - 3856, 3863, 3868, 3872, 3882, 3886, 3890, 3895, 3900, 3910, 2109, 3915, - 3919, 3922, 3928, 3933, 3939, 3945, 3950, 3957, 3961, 3965, 3969, 3974, - 3979, 3984, 3989, 3994, 3999, 592, 575, 1304, 4004, 4011, 4018, 4024, - 4029, 4036, 4043, 4048, 4054, 4060, 4065, 4069, 4075, 4082, 4087, 4091, - 4095, 2118, 4101, 4109, 4115, 4123, 807, 4129, 4137, 4148, 4152, 4162, - 4168, 4173, 4178, 4183, 4188, 2123, 4193, 4198, 4213, 4219, 4226, 4237, - 4247, 4253, 4258, 4264, 4270, 4273, 4276, 4280, 4285, 4288, 4295, 4304, - 4309, 4313, 4317, 4321, 4325, 4330, 4336, 4347, 4351, 3416, 4356, 4368, - 4374, 4382, 4386, 4391, 4398, 4403, 4408, 4413, 1504, 4418, 4421, 4424, - 4428, 4431, 4437, 4441, 4455, 4459, 4462, 4466, 4472, 4478, 4483, 4487, - 4491, 4497, 4508, 4514, 4519, 4525, 4529, 4537, 4549, 4559, 4565, 4570, - 4579, 4587, 4594, 4600, 4606, 4610, 4616, 4625, 4634, 4640, 4644, 4653, - 4658, 4662, 4667, 4671, 4679, 4685, 4689, 4696, 4701, 4705, 4711, 2131, - 4717, 4722, 4727, 4732, 4737, 1320, 4742, 4747, 4753, 4758, 4763, 4768, - 4773, 4778, 4783, 4789, 4794, 4800, 4805, 4810, 4815, 4821, 4826, 4831, - 4836, 4841, 4847, 4852, 4858, 4863, 4868, 4873, 4878, 4883, 4888, 4894, - 4899, 4904, 312, 369, 4909, 4915, 4919, 4923, 4928, 4932, 4936, 4939, - 4943, 4947, 4950, 4954, 4958, 4962, 4967, 4971, 4975, 4981, 4990, 4714, - 4995, 4999, 5002, 5007, 5012, 5017, 5022, 5027, 5032, 5037, 5042, 5047, - 5052, 5056, 5061, 5066, 5071, 5076, 5081, 5086, 5091, 5096, 5101, 5106, - 5110, 5115, 5120, 5125, 5130, 5135, 5140, 5145, 5150, 5155, 5160, 5164, - 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5204, 5209, 5214, 5218, 5223, - 5228, 5233, 5238, 5243, 5248, 5253, 5258, 5263, 5268, 5272, 5277, 5282, - 5287, 5292, 5297, 5302, 5307, 5312, 5317, 5322, 5326, 5331, 5336, 5341, - 5346, 5351, 5356, 5361, 5366, 5371, 5376, 5380, 5385, 5390, 5395, 5400, - 5406, 5412, 5418, 5424, 5430, 5436, 5442, 5447, 5453, 5459, 5465, 5471, - 5477, 5483, 5489, 5495, 5501, 5507, 5512, 5518, 5524, 5530, 5536, 5542, - 5548, 5554, 5560, 5566, 5572, 5577, 5583, 5589, 5595, 5601, 5607, 5613, - 5619, 5625, 5631, 5637, 5642, 5648, 5654, 5660, 5666, 5672, 5678, 5684, - 5690, 5696, 5702, 5707, 5713, 5719, 5725, 5731, 5737, 5743, 5749, 5755, - 5761, 5767, 5772, 5776, 5782, 5788, 5794, 5800, 5806, 5812, 5818, 5824, - 5830, 5836, 5841, 5847, 5853, 5859, 5865, 5871, 5877, 5883, 5889, 5895, - 5901, 5906, 5912, 5918, 5924, 5930, 5936, 5942, 5948, 5954, 5960, 5966, - 5971, 5977, 5983, 5989, 5995, 6001, 6007, 6013, 6019, 6025, 6031, 6036, - 6042, 6048, 6054, 6060, 6066, 6072, 6078, 6084, 6090, 6096, 6101, 6107, - 6113, 6119, 6125, 6131, 6137, 6143, 6149, 6155, 6161, 6166, 6172, 6178, - 6184, 6190, 6196, 6202, 6208, 6214, 6220, 6226, 6231, 6237, 6243, 6249, - 6255, 6261, 6267, 6273, 6279, 6285, 6291, 6296, 6302, 6308, 6314, 6320, - 6326, 6332, 6338, 6344, 6350, 6356, 6361, 6367, 6373, 6379, 6385, 6391, - 6397, 6403, 6409, 6415, 6421, 6426, 6430, 6433, 6440, 6444, 6457, 6461, - 6465, 6469, 6472, 6476, 6481, 6485, 6494, 6498, 6504, 6511, 6522, 6530, - 6537, 6541, 6549, 6558, 6564, 6568, 6580, 6585, 6588, 6593, 6597, 6607, - 6615, 6623, 6629, 6633, 6643, 6653, 6661, 6668, 6675, 6681, 6687, 6694, - 6698, 6705, 6715, 6725, 6733, 6740, 6745, 6749, 6753, 6761, 6765, 6775, - 6780, 6787, 6795, 6800, 6804, 6809, 6813, 6820, 6825, 6839, 6844, 6849, - 6856, 3680, 6865, 6869, 6873, 6878, 6882, 6886, 6889, 6894, 6899, 6908, - 6914, 6920, 6925, 6931, 6935, 6946, 6956, 6971, 6986, 7001, 7016, 7031, - 7046, 7061, 7076, 7091, 7106, 7121, 7136, 7151, 7166, 7181, 7196, 7211, - 7226, 7241, 7256, 7271, 7286, 7301, 7316, 7331, 7346, 7361, 7376, 7391, - 7406, 7421, 7436, 7451, 7466, 7481, 7496, 7511, 7526, 7541, 7556, 7571, - 7586, 7601, 7616, 7631, 7646, 7661, 7676, 7691, 7700, 7709, 7714, 7720, - 7730, 7734, 7738, 7743, 7748, 7753, 7761, 7765, 7768, 7772, 3139, 7775, - 7780, 346, 520, 7786, 7794, 7798, 7802, 7805, 7809, 7815, 7819, 7827, - 7833, 7838, 7845, 7853, 7860, 7866, 7871, 7878, 7884, 7893, 7901, 7905, - 7910, 7918, 7930, 7941, 7948, 7959, 7963, 7967, 7971, 7974, 7980, 3443, - 7984, 7990, 7995, 8000, 8005, 8011, 8016, 8021, 8026, 8031, 8037, 8042, - 8047, 8053, 8058, 8064, 8069, 8075, 8080, 8086, 8091, 8096, 8101, 8106, - 8111, 8117, 8122, 8127, 8132, 8138, 8144, 8150, 8156, 8162, 8168, 8174, - 8180, 8186, 8192, 8198, 8204, 8209, 8214, 8219, 8224, 8229, 8234, 8239, - 8244, 8250, 8256, 8261, 8267, 8273, 8279, 8284, 8289, 8294, 8299, 8305, - 8311, 8316, 8321, 8326, 8331, 8336, 8342, 8347, 8353, 8359, 8365, 8371, - 8377, 8383, 8389, 8395, 8401, 2140, 7804, 8406, 8410, 8418, 8422, 8425, - 8432, 8435, 8439, 8447, 8452, 8457, 8448, 8462, 2167, 8466, 8472, 8478, - 8483, 8488, 8495, 8503, 8508, 8512, 8515, 8519, 8525, 8531, 8535, 1679, - 572, 8538, 8542, 8547, 8553, 8558, 8562, 8565, 8569, 8575, 8580, 8584, - 8591, 8595, 8599, 8603, 792, 1063, 8606, 8614, 8621, 8628, 8634, 8641, - 8649, 8656, 8667, 8674, 8680, 8685, 8697, 1163, 1328, 1333, 8708, 8712, - 1338, 8716, 8720, 8729, 8737, 8741, 8750, 8756, 8762, 8767, 8771, 8777, - 8782, 8790, 8797, 2838, 8804, 8810, 8814, 8823, 8832, 8841, 8850, 8856, - 8861, 8866, 8877, 8886, 8898, 8903, 8911, 2226, 8915, 8917, 8922, 8926, - 8935, 8943, 1342, 165, 3722, 3727, 8949, 8953, 8962, 8968, 8973, 8976, - 8985, 2238, 8991, 2830, 8995, 9003, 9007, 9011, 9015, 9019, 2247, 9023, - 9028, 9035, 9041, 9047, 9050, 9052, 9055, 9063, 9071, 9079, 9082, 9087, - 2260, 9092, 8459, 9095, 9097, 9102, 9107, 9112, 9117, 9122, 9127, 9132, - 9137, 9142, 9147, 9153, 9158, 9163, 9168, 9174, 9179, 9184, 9189, 9194, - 9199, 9204, 9210, 9215, 9220, 9225, 9230, 9235, 9240, 9245, 9250, 9255, - 9260, 9265, 9270, 9275, 9280, 9285, 9290, 9295, 9301, 9307, 9312, 9317, - 9322, 9327, 9332, 2271, 2278, 2284, 9337, 9345, 9351, 9359, 2310, 2316, - 9367, 2321, 2326, 2331, 2336, 9371, 9375, 9380, 9384, 9388, 9392, 9397, - 9401, 9406, 9410, 9413, 9416, 9422, 9429, 9435, 9442, 9448, 9455, 9461, - 9468, 9474, 9480, 9489, 9495, 9499, 9503, 9507, 9511, 9516, 9520, 9525, - 9529, 9535, 9539, 9544, 9551, 9562, 9570, 9580, 9586, 9596, 9605, 9612, - 9617, 9621, 9632, 9642, 9655, 9666, 9679, 9690, 9702, 9714, 9726, 9737, - 9750, 9763, 9770, 9776, 9787, 9797, 9811, 9818, 9824, 9833, 9841, 9845, - 9850, 9854, 9861, 9869, 9876, 9880, 9886, 9890, 9896, 9906, 9910, 9915, - 9920, 9927, 9933, 8636, 9943, 9947, 9954, 9960, 9967, 9974, 1062, 9978, - 9984, 9988, 9993, 9998, 10003, 10007, 10013, 10021, 10028, 10034, 10038, - 10041, 10047, 10057, 10061, 10067, 10072, 10076, 10081, 10085, 10091, - 10097, 10102, 10108, 10113, 10118, 10123, 2163, 10128, 10130, 10135, - 10143, 10152, 10156, 10162, 10167, 10172, 10177, 10182, 10188, 10193, - 10198, 4493, 10203, 10208, 10212, 10218, 10223, 10229, 10234, 10239, - 10245, 10250, 10157, 10256, 10260, 10267, 10273, 10278, 10282, 6835, - 10287, 10296, 10301, 10306, 9031, 9038, 10311, 3012, 10315, 10320, 10325, - 10330, 10168, 10334, 10339, 10344, 10173, 10348, 10178, 10353, 10360, - 10367, 10373, 10380, 10386, 10392, 10397, 10404, 10409, 10414, 10419, - 10425, 10183, 10189, 10431, 10437, 10442, 10447, 10455, 10194, 10460, - 10463, 10465, 10473, 10479, 10485, 10494, 10502, 10510, 10518, 10526, - 10534, 10542, 10550, 10558, 10567, 10576, 10584, 10593, 10602, 10611, - 10620, 10629, 10638, 10647, 10656, 10665, 10674, 10682, 10687, 10691, - 10697, 10705, 10712, 10727, 10744, 10763, 10772, 10780, 10795, 10806, - 10814, 10824, 10834, 10842, 10848, 10860, 10869, 10877, 10884, 10891, - 10898, 10904, 10909, 10919, 10927, 10937, 10944, 10954, 10964, 10974, - 10982, 10989, 10998, 11008, 11022, 11037, 11046, 11054, 11059, 11063, - 11072, 11078, 11083, 11093, 11103, 11113, 11118, 11122, 11132, 11141, - 11146, 11162, 11179, 11189, 11200, 11213, 11224, 11232, 11245, 11257, - 11265, 11270, 11274, 11280, 11285, 11293, 11301, 11308, 11319, 11324, - 11332, 11342, 11348, 11352, 11355, 11359, 11365, 11372, 11376, 11384, - 11393, 11401, 11408, 11413, 11418, 11422, 11426, 11434, 11449, 11465, - 11471, 11479, 11488, 11496, 11502, 11506, 11513, 11524, 11528, 11531, - 11537, 11542, 10199, 11550, 11556, 11563, 11569, 11574, 11581, 11588, - 11595, 11602, 11609, 11616, 11623, 11630, 11637, 11644, 11651, 11658, - 11665, 11672, 11679, 11684, 10740, 11689, 11695, 11702, 11709, 11714, - 11721, 11730, 11734, 11746, 11750, 11756, 11761, 11766, 11771, 11776, - 11781, 9069, 11786, 11789, 11793, 11797, 11801, 11805, 11811, 11817, - 11822, 11828, 11833, 11838, 11844, 11849, 11854, 9923, 11859, 11863, - 11867, 11871, 11876, 11881, 11886, 11894, 11900, 11905, 11909, 11913, - 11920, 11925, 11933, 11940, 11945, 11949, 11952, 11958, 11965, 11969, - 11972, 11977, 11981, 4532, 11987, 11996, 46, 12004, 12010, 12015, 12020, - 12028, 12035, 12040, 6770, 12046, 12052, 12057, 12061, 12064, 12079, - 12098, 12110, 12123, 12136, 12149, 12163, 12176, 12191, 12198, 10204, - 12204, 12218, 12223, 12229, 12234, 12242, 12247, 8819, 12252, 12255, - 12263, 12270, 12275, 12279, 12285, 12289, 12294, 12299, 12304, 12309, - 12314, 12319, 3017, 10822, 12324, 12328, 12334, 12340, 12345, 12351, - 12356, 10213, 12362, 12368, 12373, 12378, 12386, 12392, 12405, 12413, - 12420, 12426, 10219, 12432, 12440, 12448, 12455, 12468, 12481, 12493, - 12503, 12515, 12543, 12551, 12560, 12567, 12579, 12586, 12596, 12605, - 12613, 12620, 12625, 12631, 10224, 12636, 12642, 12647, 12652, 10230, - 12657, 12660, 12667, 12673, 12687, 12700, 12711, 9555, 12722, 12728, - 12737, 12745, 12752, 12758, 12769, 12775, 12780, 12788, 4020, 12794, - 12799, 12071, 12805, 12812, 12817, 10235, 12823, 12828, 12835, 12841, - 12847, 12852, 12860, 12868, 12875, 12879, 12891, 12905, 12915, 12920, - 12924, 12935, 12941, 12946, 12951, 10240, 12955, 10246, 12960, 12963, - 12968, 12980, 12987, 12992, 12996, 13004, 13009, 13013, 13018, 13022, - 13029, 13035, 10251, 10158, 13042, 3022, 12, 13049, 13054, 13058, 13062, - 13068, 13076, 13086, 13091, 13096, 13103, 13110, 13114, 13125, 13135, - 13144, 13153, 13165, 13170, 13174, 13182, 13196, 13200, 13203, 13207, - 13215, 13222, 13230, 13234, 13245, 13253, 13257, 13264, 13269, 13273, - 13279, 13284, 13290, 13295, 13300, 13304, 13310, 13315, 13326, 13330, - 13333, 13339, 13346, 13351, 13357, 13363, 13370, 13381, 13391, 13401, - 13410, 13417, 13426, 13430, 10261, 10268, 10274, 10279, 13436, 13442, - 13448, 13453, 13459, 10283, 13465, 13468, 13475, 13480, 13485, 13500, - 13516, 13531, 13539, 13545, 13550, 13555, 13560, 13565, 13570, 13575, - 13580, 13585, 13590, 1055, 357, 13595, 13603, 13610, 13616, 13621, 13626, - 10288, 13628, 13632, 13637, 13641, 13651, 13656, 13660, 13663, 13672, - 13676, 13679, 13686, 10297, 13691, 13694, 13702, 13709, 13717, 13721, - 13727, 13731, 13738, 13747, 13754, 13750, 13761, 13765, 13771, 13775, - 13779, 13783, 13789, 13799, 13807, 13814, 13818, 13826, 13831, 13835, - 13842, 13847, 13851, 13856, 13861, 13865, 13872, 13878, 13886, 13892, - 13897, 13907, 13914, 13919, 13924, 13928, 13932, 13940, 4362, 13948, - 13953, 10302, 13957, 13964, 13968, 13971, 13979, 13986, 13990, 6625, - 13994, 13999, 14004, 14008, 14019, 14029, 14034, 14040, 14045, 14049, - 14052, 14060, 14065, 14070, 14077, 14082, 10307, 14087, 14091, 14098, - 14103, 14108, 14113, 6793, 14118, 14123, 14128, 14133, 14139, 14144, - 14150, 14155, 14160, 14165, 14170, 14175, 14180, 14185, 14190, 14195, - 14200, 14205, 14210, 14215, 14220, 14225, 14230, 14236, 14241, 14246, - 14251, 14256, 14261, 14267, 14272, 14277, 14283, 14288, 14294, 14299, - 14305, 14310, 14315, 14320, 14325, 14331, 14336, 14341, 14346, 14354, - 985, 112, 14360, 14364, 14369, 14374, 14378, 14382, 14386, 14391, 14395, - 14400, 14404, 14407, 14411, 14415, 14421, 14426, 14436, 14442, 14450, - 14456, 14460, 14464, 14471, 14479, 14488, 14499, 14509, 14516, 14523, - 14527, 14536, 14545, 14553, 14560, 14569, 14578, 14587, 14596, 14606, - 14616, 14626, 14636, 14646, 14655, 14665, 14675, 14685, 14695, 14705, - 14715, 14725, 14734, 14744, 14754, 14764, 14774, 14784, 14794, 14803, - 14813, 14823, 14833, 14843, 14853, 14863, 14873, 14883, 14893, 14902, - 14912, 14922, 14932, 14942, 14952, 14962, 14972, 14982, 14992, 15002, - 15011, 15017, 1172, 15021, 15024, 15028, 15033, 15040, 15046, 15051, - 15055, 15060, 15069, 15078, 15086, 15091, 15095, 15099, 15105, 15110, - 15116, 10316, 15121, 15126, 15135, 15140, 10326, 15145, 15148, 15154, - 15162, 10331, 15169, 15173, 15177, 15182, 15186, 15196, 15202, 15208, - 15213, 15222, 15230, 15237, 15244, 15249, 15256, 15261, 15265, 15268, - 15279, 15289, 15302, 15311, 15319, 15330, 15342, 15352, 15362, 15367, - 15371, 15376, 15381, 15385, 15391, 15399, 15406, 15417, 15422, 15432, - 15441, 15445, 15448, 15455, 15465, 15474, 15481, 15485, 15492, 15498, - 15503, 15508, 15512, 15064, 15521, 15525, 15531, 15535, 15540, 15544, - 15551, 15558, 15562, 15571, 15579, 15587, 15594, 15602, 15614, 15625, - 15635, 15642, 15648, 15657, 15668, 15677, 15689, 15701, 15713, 15723, - 15732, 15742, 15751, 15759, 15766, 15775, 15783, 15787, 15792, 15798, - 15804, 15809, 15814, 15818, 15823, 15828, 15833, 15838, 15843, 15848, - 15853, 8480, 15858, 15860, 15864, 15869, 15875, 15882, 15888, 15894, - 15903, 15907, 15913, 15921, 15928, 15937, 15946, 15955, 15964, 15973, - 15982, 15991, 16000, 16010, 16020, 16029, 16035, 16042, 16049, 16055, - 16069, 16075, 16082, 16090, 16099, 16107, 16113, 16122, 16131, 16142, - 16148, 16158, 16166, 16173, 16181, 16190, 16203, 16212, 16220, 16227, - 16240, 16246, 16252, 16262, 16271, 16280, 16285, 16289, 16295, 16301, - 16306, 16313, 16320, 9937, 16325, 16330, 16337, 16345, 16350, 16362, - 16369, 16374, 16386, 14417, 16391, 16397, 16405, 16411, 16416, 16424, - 16432, 16439, 16447, 16453, 16461, 16469, 16475, 16483, 16489, 16494, - 16500, 16507, 16513, 16518, 16522, 16533, 16541, 16549, 16555, 16560, - 16567, 16576, 16582, 16587, 16595, 16602, 16611, 16625, 4306, 16629, - 16634, 16639, 16645, 16650, 16655, 16659, 16664, 16669, 16674, 8479, - 16679, 16684, 16689, 16694, 16699, 16703, 16708, 16713, 16718, 16723, - 16729, 16735, 13723, 16740, 16746, 16751, 16756, 16761, 10335, 16766, - 16771, 16776, 16781, 16786, 16800, 16817, 16835, 16847, 16860, 16877, - 16893, 16910, 16920, 16939, 16950, 16961, 16972, 2727, 16983, 16994, - 17005, 17022, 17033, 17044, 17049, 10340, 17054, 17058, 2420, 17062, - 17065, 17071, 17079, 17087, 17093, 17102, 17109, 17114, 17122, 17130, - 17137, 17141, 17146, 17152, 17159, 17167, 17174, 17186, 17193, 17199, - 17207, 17212, 17218, 17224, 17229, 13494, 17236, 17245, 17251, 17256, - 17264, 17273, 17281, 17288, 17294, 17302, 17309, 17315, 17321, 17328, - 17335, 17341, 17347, 17356, 17364, 17369, 17379, 17386, 17392, 17400, - 17406, 17414, 17422, 17429, 17442, 17449, 17458, 17467, 17476, 17484, - 17494, 17501, 17506, 3876, 17513, 17518, 1288, 17522, 17529, 16680, - 17533, 17539, 17543, 17551, 17563, 17568, 17575, 17581, 17586, 17593, - 16685, 17597, 17601, 17605, 16690, 17609, 16695, 17613, 17620, 17625, - 17629, 17636, 17640, 17648, 17655, 17660, 17668, 17672, 17679, 17696, - 17705, 17714, 17718, 17721, 17727, 17735, 17741, 17746, 17750, 17755, - 17760, 17765, 17770, 17775, 17780, 3954, 17785, 17787, 17795, 17802, - 17812, 17824, 17829, 17833, 17839, 17844, 17852, 17856, 17862, 17867, - 17873, 17876, 17883, 17891, 17898, 17904, 17909, 17915, 17920, 17927, - 17933, 17938, 17945, 17950, 17954, 17960, 17966, 17970, 17977, 17983, - 17988, 17994, 18002, 18010, 18017, 18023, 18028, 18034, 18040, 18048, - 18053, 18058, 18066, 18072, 18078, 18083, 18090, 18095, 18099, 18105, - 18111, 18116, 18123, 18128, 18134, 18137, 18143, 18154, 18160, 18163, - 18167, 18171, 18185, 18198, 18210, 18216, 18221, 18228, 18234, 18240, - 18251, 18263, 18275, 18285, 18294, 18302, 18309, 18320, 18330, 18340, - 18348, 18351, 16709, 18356, 18361, 16714, 16865, 18369, 18382, 18397, - 18408, 16882, 18426, 18439, 18452, 18463, 12086, 18474, 18487, 18506, - 18517, 18528, 18539, 2748, 18552, 18556, 18564, 18575, 18586, 18594, - 18609, 18624, 18635, 18642, 18648, 18656, 18660, 18666, 18669, 18682, - 18694, 18704, 18712, 18719, 18727, 18737, 18742, 18749, 18754, 18761, - 18772, 18782, 18788, 18793, 18798, 16719, 18802, 18808, 18814, 18819, - 18824, 18829, 18833, 16724, 16730, 18837, 16736, 18842, 18850, 18855, - 18859, 18866, 18874, 18881, 18890, 18897, 18901, 18905, 18910, 18915, - 18920, 18925, 18930, 10179, 18935, 18937, 18942, 18947, 18953, 18958, - 18963, 18968, 18973, 18977, 18983, 18989, 18994, 19000, 19005, 19010, - 19014, 19020, 19025, 19029, 19034, 19039, 19051, 19056, 19062, 19067, - 19072, 19078, 19084, 19089, 19094, 19099, 19106, 19112, 19123, 19130, - 19139, 19144, 19148, 263, 19152, 19160, 19165, 19171, 19178, 19185, - 19191, 19196, 19201, 19206, 19213, 19223, 19231, 19236, 19241, 19248, - 19254, 19263, 19273, 19283, 19297, 19311, 19325, 19339, 19354, 19369, - 19386, 19404, 19417, 19423, 19428, 19433, 19437, 19445, 19450, 19458, - 19464, 19470, 19475, 19480, 19484, 19490, 19495, 19499, 19506, 19511, - 19515, 19526, 19532, 19537, 19542, 19549, 19554, 19558, 3839, 19563, - 19569, 19576, 16741, 19582, 19586, 19592, 19597, 19602, 19606, 19612, - 19617, 19622, 19629, 19634, 15198, 19638, 19643, 19647, 19652, 19658, - 19664, 19671, 19681, 19689, 19696, 19701, 19705, 19714, 19722, 19729, - 19736, 19742, 19747, 19753, 19758, 19763, 19769, 19774, 19780, 19785, - 19791, 19797, 19804, 19810, 19815, 19820, 10405, 19829, 19832, 19840, - 19846, 19851, 19856, 19866, 19873, 19879, 19884, 19889, 19895, 19900, - 19906, 19911, 19917, 19924, 19930, 19936, 19941, 19949, 19956, 19961, - 19966, 19972, 19977, 19981, 19990, 20001, 20008, 20015, 20023, 20030, - 20037, 20042, 20047, 20053, 20058, 20066, 20072, 20078, 20085, 20091, - 20096, 20100, 20106, 20111, 20116, 20120, 20125, 1361, 8504, 3036, 20129, - 20133, 20137, 20141, 20145, 20149, 20152, 20157, 20164, 20172, 16752, - 20179, 20189, 20197, 20204, 20212, 20222, 20231, 20244, 20249, 20254, - 20262, 20269, 15307, 15316, 20276, 20286, 20301, 20307, 20314, 20321, - 20328, 20334, 20340, 20351, 20359, 20367, 20377, 20387, 20396, 16757, - 20405, 20411, 20417, 20426, 20434, 20442, 20447, 20456, 20464, 20476, - 20486, 20496, 20506, 20515, 20527, 20537, 20547, 20558, 20565, 20570, - 20577, 20589, 20601, 20613, 20625, 20637, 20649, 20661, 20673, 20685, - 20697, 20708, 20720, 20732, 20744, 20756, 20768, 20780, 20792, 20804, - 20816, 20828, 20839, 20851, 20863, 20875, 20887, 20899, 20911, 20923, - 20935, 20947, 20959, 20970, 20982, 20994, 21006, 21018, 21030, 21042, - 21054, 21066, 21078, 21090, 21101, 21113, 21125, 21137, 21149, 21161, - 21173, 21185, 21197, 21209, 21221, 21232, 21244, 21256, 21268, 21280, - 21292, 21304, 21316, 21328, 21340, 21352, 21363, 21375, 21387, 21399, - 21411, 21423, 21435, 21447, 21459, 21471, 21483, 21494, 21506, 21518, - 21530, 21542, 21555, 21568, 21581, 21594, 21607, 21620, 21633, 21645, - 21658, 21671, 21684, 21697, 21710, 21723, 21736, 21749, 21762, 21775, - 21787, 21800, 21813, 21826, 21839, 21852, 21865, 21878, 21891, 21904, - 21917, 21929, 21942, 21955, 21968, 21981, 21994, 22007, 22020, 22033, - 22046, 22059, 22071, 22084, 22097, 22110, 22123, 22136, 22149, 22162, - 22175, 22188, 22201, 22213, 22226, 22239, 22252, 22265, 22278, 22291, - 22304, 22317, 22330, 22343, 22355, 22366, 22379, 22392, 22405, 22418, - 22431, 22444, 22457, 22470, 22483, 22496, 22508, 22521, 22534, 22547, - 22560, 22573, 22586, 22599, 22612, 22625, 22638, 22650, 22663, 22676, - 22689, 22702, 22715, 22728, 22741, 22754, 22767, 22780, 22792, 22805, - 22818, 22831, 22844, 22857, 22870, 22883, 22896, 22909, 22922, 22934, - 22947, 22960, 22973, 22986, 22999, 23012, 23025, 23038, 23051, 23064, - 23076, 23089, 23102, 23115, 23128, 23141, 23154, 23167, 23180, 23193, - 23206, 23218, 23231, 23244, 23257, 23270, 23283, 23296, 23309, 23322, - 23335, 23348, 23360, 23373, 23386, 23399, 23412, 23425, 23438, 23451, - 23464, 23477, 23490, 23502, 23515, 23528, 23541, 23554, 23567, 23580, - 23593, 23606, 23619, 23632, 23644, 23657, 23670, 23683, 23696, 23709, - 23722, 23735, 23748, 23761, 23774, 23786, 23797, 23806, 23814, 23822, - 23829, 23835, 23839, 23845, 23851, 23859, 23864, 23870, 23875, 23879, - 23888, 10184, 23899, 23905, 23912, 23920, 23927, 12680, 12694, 23934, - 23941, 23950, 23955, 23960, 23967, 23972, 23977, 8520, 8526, 8532, 23982, - 23987, 23990, 23995, 24003, 24010, 24017, 24024, 24030, 24039, 24048, - 24057, 24063, 24071, 24080, 24084, 24090, 24095, 24105, 24112, 24118, - 24126, 24132, 24139, 24145, 24155, 24164, 24168, 24175, 24179, 24184, - 24190, 24198, 24202, 24212, 16767, 24221, 24227, 24231, 24240, 24249, - 24259, 24265, 16772, 24272, 24279, 24290, 24298, 24308, 24317, 24325, - 9902, 24333, 24338, 24344, 24349, 24353, 24357, 24361, 10923, 24366, - 24374, 24381, 24390, 24398, 24405, 24412, 24421, 24427, 976, 24434, - 24440, 24444, 24450, 24457, 24463, 24471, 24477, 24484, 24490, 24496, - 24505, 24509, 24517, 24526, 24533, 24538, 24542, 24553, 24558, 24563, - 24569, 24574, 24587, 8747, 24591, 24597, 24603, 24609, 24614, 24622, - 24626, 24633, 24642, 24647, 17045, 24655, 24659, 24671, 24676, 24680, - 24683, 24689, 24695, 24701, 24706, 24711, 24715, 24718, 24729, 24734, - 10456, 24741, 24746, 24751, 24756, 24761, 24766, 24771, 24776, 24781, - 10461, 24786, 24791, 24796, 24801, 24806, 24811, 24816, 24821, 24826, - 24831, 24836, 24841, 24847, 24852, 24857, 24862, 24867, 24872, 24877, - 24882, 24887, 24892, 24898, 24904, 24909, 24914, 24919, 24924, 24929, - 24934, 24939, 24944, 24949, 24955, 24960, 24965, 24970, 24976, 24982, - 24987, 24992, 24997, 25002, 25007, 25012, 25017, 25022, 25028, 25033, - 25038, 25043, 25048, 25054, 25059, 25064, 25068, 1284, 145, 25076, 25080, - 25084, 25088, 25093, 25097, 15204, 2346, 25101, 25106, 25110, 25115, - 25119, 25124, 25128, 25134, 25139, 25143, 25147, 25155, 25159, 25163, - 25170, 25175, 25180, 25184, 25190, 25195, 25199, 25204, 25209, 25213, - 25220, 25227, 25234, 25239, 25243, 25247, 25252, 25256, 25259, 25265, - 25278, 25283, 25289, 25298, 25303, 10683, 25308, 25317, 25322, 25325, - 25329, 25334, 25339, 25344, 25349, 25354, 2844, 2849, 25359, 25365, - 25369, 25375, 3800, 25380, 25385, 25390, 25396, 25401, 16138, 25406, - 25411, 25416, 25421, 25427, 25432, 25437, 25443, 25448, 25452, 25457, - 25462, 25467, 25472, 25477, 25481, 25486, 25490, 25495, 25500, 25505, - 25510, 25514, 25519, 25523, 25528, 25533, 25538, 25453, 3045, 25458, - 25543, 25551, 25558, 11017, 25570, 25578, 25588, 25606, 25625, 25634, - 25642, 25463, 25649, 25654, 25662, 25468, 25667, 25672, 25680, 25685, - 25690, 25694, 25473, 25699, 25707, 25712, 25716, 25723, 25729, 25738, - 25742, 25750, 25754, 25757, 25764, 25768, 25772, 25777, 25783, 25790, - 25795, 9929, 25799, 25804, 25809, 25814, 25819, 25824, 1689, 1694, 25829, - 25835, 25841, 25846, 25850, 25854, 25858, 25862, 25866, 25870, 25874, - 25878, 25881, 25887, 25894, 25902, 25908, 25914, 25919, 25924, 25930, - 25934, 25939, 25946, 16044, 16051, 25952, 25964, 25967, 25974, 25978, - 19187, 25985, 25993, 26004, 26013, 26026, 26036, 26050, 26062, 26076, - 26089, 26101, 26111, 26123, 26129, 26135, 26150, 26174, 26192, 26211, - 26224, 26238, 26256, 26272, 26289, 26307, 26318, 26337, 26354, 26374, - 26392, 26404, 26418, 26432, 26444, 26461, 26480, 26498, 26510, 26528, - 26547, 16925, 26560, 26580, 26592, 12117, 26604, 26609, 26614, 26619, - 26628, 26634, 26639, 26643, 26650, 26656, 26660, 26665, 26670, 26675, - 26680, 26685, 26690, 2440, 26695, 26701, 26705, 26708, 26719, 26723, - 26726, 26734, 26740, 14356, 26744, 26753, 26764, 26770, 26776, 26791, - 26800, 26808, 26815, 26820, 26824, 26831, 26837, 26846, 26854, 26861, - 26871, 26880, 26890, 26895, 26904, 26913, 26924, 26935, 26945, 26962, - 4450, 26972, 26976, 26986, 26994, 27004, 27015, 27021, 27026, 27036, - 27044, 27051, 27057, 27064, 27069, 25501, 27073, 27082, 27086, 27089, - 27094, 27102, 27109, 27118, 27126, 27134, 27142, 27152, 27161, 27167, - 27173, 27179, 27183, 25506, 25511, 27187, 27197, 27207, 27217, 27225, - 27232, 27242, 27250, 27258, 27264, 27272, 782, 27281, 17126, 599, 27295, - 27304, 27312, 27323, 27334, 27344, 27353, 27365, 27374, 27383, 27390, - 27396, 27406, 27415, 27424, 27432, 27440, 27450, 27458, 27466, 27472, - 27477, 27482, 27487, 7915, 27492, 27495, 27499, 27504, 27510, 27515, - 27519, 11142, 25524, 25529, 27527, 27533, 27539, 27544, 27549, 27553, - 27561, 27567, 27573, 27577, 3824, 27585, 27590, 27595, 27599, 27603, - 11266, 27610, 27618, 27632, 27639, 27646, 27652, 11275, 11281, 27660, - 27668, 27675, 27680, 27685, 25534, 27691, 27702, 27706, 27711, 2679, - 27716, 27727, 27733, 27738, 27742, 27746, 27749, 27756, 27763, 27769, - 27777, 27784, 27790, 27794, 7955, 27799, 27803, 27807, 27815, 27820, - 27825, 27830, 1717, 27835, 27840, 27845, 27850, 27855, 27860, 27865, - 27870, 27875, 27880, 27885, 27890, 27895, 27900, 27906, 27911, 27916, - 27921, 27926, 27931, 27936, 27942, 27947, 27952, 27957, 27962, 27967, - 27972, 27977, 27983, 27989, 27994, 28000, 28005, 28010, 5, 28016, 28020, - 28024, 28028, 28033, 28037, 28041, 28045, 28049, 28054, 28058, 28063, - 28067, 28070, 28074, 28079, 28083, 28088, 28092, 28096, 28100, 28105, - 28109, 28113, 28123, 28128, 28132, 28136, 28141, 28146, 28155, 28160, - 28165, 28169, 28173, 28182, 28195, 28207, 28216, 28225, 28230, 28236, - 28241, 28245, 28249, 28259, 28268, 28276, 28282, 28287, 28291, 28298, - 28308, 28317, 28325, 12474, 28333, 28341, 28350, 28359, 28367, 28377, - 28382, 28386, 28390, 28393, 28395, 28399, 28403, 28408, 28413, 28417, - 28421, 28424, 28428, 28431, 28435, 28438, 28441, 28445, 28451, 28455, - 28459, 28463, 28467, 28472, 28477, 28482, 28486, 28489, 28494, 28500, - 28505, 28511, 28516, 28520, 28526, 28530, 28534, 28539, 28543, 28548, - 28553, 28557, 28561, 28568, 28572, 28575, 28579, 28583, 28589, 28595, - 28599, 28603, 28608, 28615, 28621, 28625, 28634, 28638, 28642, 28645, - 28651, 28656, 28662, 1417, 1769, 28667, 28672, 28677, 28682, 28687, - 28692, 28697, 2150, 747, 28702, 28705, 28709, 28713, 28718, 28722, 17138, - 28726, 28731, 28736, 28740, 28743, 28748, 28752, 28757, 28761, 17142, - 28766, 28769, 28772, 28778, 28782, 28787, 28791, 28804, 28808, 28811, - 28819, 28828, 28835, 28840, 28846, 28852, 28860, 28867, 28874, 28878, - 28882, 28886, 28891, 28896, 28900, 28908, 28913, 28920, 28932, 28943, - 28948, 28952, 28959, 28963, 28968, 28974, 28977, 28982, 28987, 28994, - 28998, 29002, 29005, 29011, 8642, 2350, 29015, 29020, 29036, 10734, - 29056, 29065, 29081, 29085, 29092, 29095, 29101, 29111, 29117, 29126, - 29141, 29152, 29164, 29175, 29183, 29192, 29198, 29207, 29217, 29227, - 29238, 29249, 29259, 29268, 29275, 29284, 29292, 29299, 29306, 29314, - 29321, 29328, 29341, 29348, 29356, 29363, 29369, 29374, 29383, 29390, - 29396, 29401, 29409, 29417, 29424, 29431, 26996, 29443, 29455, 29469, - 29477, 29485, 29493, 29500, 29512, 29521, 29530, 29538, 29546, 29554, - 29561, 29567, 29576, 29584, 29594, 29603, 29613, 29622, 29631, 29639, - 29644, 29648, 29651, 29655, 29659, 29663, 29667, 29671, 29677, 29683, - 29688, 29696, 17200, 29703, 29708, 29715, 29721, 29728, 17208, 29735, - 29738, 29750, 29758, 29764, 29769, 29773, 29784, 29794, 29804, 11205, - 29813, 29822, 29830, 29840, 29849, 29856, 29863, 29871, 29875, 17219, - 29878, 29885, 29889, 4394, 29895, 29898, 29905, 29911, 29916, 29923, - 29929, 29933, 29938, 29942, 29951, 29958, 29964, 8700, 29971, 29979, - 29986, 29992, 29997, 30003, 30009, 30017, 30023, 30027, 30030, 30032, - 29656, 11218, 30041, 30046, 30052, 30062, 30067, 30074, 30080, 30085, - 30090, 30095, 30099, 30104, 30111, 30117, 30126, 30134, 30138, 30145, - 30151, 30160, 30167, 4648, 30173, 30179, 30184, 30191, 30203, 30214, - 30219, 30223, 30233, 30239, 30243, 30248, 30258, 30267, 30271, 30278, - 30286, 30293, 30299, 30304, 30312, 30319, 30324, 30331, 30343, 30352, - 30356, 15130, 30364, 30374, 30378, 30386, 28815, 30397, 30402, 30406, - 30413, 30420, 25186, 29581, 30425, 30429, 30432, 26324, 30437, 30451, - 30467, 30485, 30504, 30521, 30539, 26343, 30556, 30576, 26360, 30588, - 30600, 18413, 30612, 26380, 30626, 30638, 12130, 30652, 30657, 30662, - 30667, 30673, 30679, 30685, 30689, 30697, 30704, 30709, 30719, 30725, - 11692, 30731, 30733, 30738, 30746, 30750, 30107, 30756, 30763, 13395, - 13405, 30770, 30777, 30787, 30792, 30796, 30799, 30805, 30813, 30825, - 30835, 30851, 30864, 30878, 18431, 30892, 30899, 30903, 30906, 30911, - 30915, 30922, 30929, 30936, 30946, 30951, 30956, 30961, 30969, 30977, - 30982, 30991, 27017, 3485, 30996, 30999, 31002, 31007, 31014, 31019, - 31024, 31040, 31048, 31056, 10498, 31064, 31069, 31073, 31079, 31084, - 31090, 31093, 31099, 31111, 31119, 31126, 31132, 31139, 31150, 31164, - 31177, 31183, 31192, 31198, 31207, 31219, 31230, 31240, 31249, 31258, - 31266, 31277, 8682, 31284, 31291, 31297, 31302, 31308, 31315, 31326, - 31336, 31346, 31355, 31361, 31368, 31373, 31381, 31388, 31396, 31404, - 31416, 6904, 1094, 31423, 31432, 31440, 31446, 31452, 31457, 31461, - 31464, 31470, 31477, 31482, 31487, 31492, 31496, 31508, 31519, 31528, - 31536, 17401, 31541, 31549, 31554, 31562, 31568, 31574, 13388, 9497, - 31579, 31583, 31587, 31590, 31593, 31599, 31607, 31615, 31619, 31623, - 31628, 31632, 31635, 31644, 31649, 31653, 31656, 31664, 31675, 31684, - 31688, 31694, 31700, 31704, 31710, 31718, 31740, 31764, 31775, 31784, - 31790, 31797, 31804, 31810, 31818, 31824, 31829, 31840, 31858, 31865, - 31873, 31877, 31884, 31889, 31898, 31911, 31919, 31931, 31942, 31953, - 31963, 31977, 31986, 31994, 32006, 10751, 32017, 32028, 32039, 32051, - 32061, 32070, 32080, 32085, 32089, 32097, 32108, 32118, 32124, 32129, - 32133, 32136, 32139, 32147, 32155, 32164, 32174, 32183, 32189, 32203, - 2762, 32225, 32236, 32245, 32255, 32267, 32276, 32285, 32295, 32303, - 32311, 32320, 32325, 32336, 32341, 32350, 32356, 32367, 32371, 32374, - 32384, 32393, 32401, 32411, 32421, 32429, 32438, 32445, 32453, 32460, - 32469, 32478, 32483, 32488, 32492, 32500, 32507, 32511, 32519, 32526, - 32537, 32552, 32559, 32565, 32575, 32584, 32590, 32601, 32605, 32612, - 32616, 32623, 32629, 16275, 32635, 32639, 32644, 32650, 32657, 32661, - 32665, 32673, 32681, 32687, 32696, 32703, 32710, 32715, 32720, 32730, - 27071, 32734, 32737, 32742, 32747, 32752, 32757, 32762, 32767, 32772, - 32777, 32783, 32788, 32793, 32799, 1134, 725, 32804, 32811, 32820, 2398, - 32827, 32832, 32836, 32842, 1183, 653, 32847, 311, 32851, 32860, 32868, - 32877, 32885, 32892, 32903, 32911, 32920, 32930, 32938, 32943, 11373, - 32947, 32955, 32963, 32968, 17155, 4008, 32974, 32980, 32986, 6462, - 32991, 32995, 33002, 33008, 33014, 33018, 33024, 33029, 33036, 1376, - 33042, 33049, 33053, 1283, 6470, 33058, 33068, 33076, 33082, 33092, - 33101, 33109, 33115, 33120, 33128, 33135, 12911, 33141, 33148, 33153, - 33160, 33170, 1436, 230, 2149, 33176, 33182, 33189, 33200, 33211, 33219, - 33226, 33236, 33245, 33253, 33262, 33269, 33276, 33289, 33296, 33302, - 33313, 33332, 1188, 33337, 33342, 33350, 3891, 33354, 33359, 33363, - 33367, 1380, 28422, 33377, 33381, 33386, 33390, 33396, 3758, 33402, - 33410, 33417, 33428, 33437, 33445, 33470, 33478, 33483, 3892, 377, 33489, - 33497, 33505, 33512, 33518, 33523, 2218, 12332, 33530, 33536, 29934, - 30209, 33542, 613, 106, 33546, 33550, 33556, 715, 10371, 33561, 33568, - 33574, 33578, 33582, 1581, 33585, 33589, 17669, 33592, 33597, 33604, - 33610, 8713, 33615, 33623, 33630, 33636, 25696, 33640, 33644, 33648, - 33652, 3962, 19497, 33656, 33661, 33665, 33668, 33676, 33684, 33689, - 33698, 33706, 33709, 33716, 33726, 33738, 33746, 33751, 33755, 33763, - 33770, 33776, 33783, 33790, 33793, 33797, 33801, 1391, 33811, 33813, - 33818, 33824, 33830, 33835, 33840, 33845, 33850, 33855, 33860, 33865, - 33870, 33875, 33880, 33885, 33890, 33895, 33900, 33906, 33912, 33918, - 33924, 33929, 33934, 33939, 33945, 33950, 33955, 33960, 33966, 33971, - 33977, 33982, 33987, 33992, 33997, 34003, 34008, 34014, 34019, 34024, - 34029, 34034, 34040, 34045, 34051, 34056, 34061, 34066, 34071, 34076, - 34081, 34086, 34091, 34096, 34102, 34108, 34114, 34119, 34124, 34129, - 34134, 34140, 34146, 34152, 34158, 34164, 34170, 34175, 34181, 34186, - 34191, 34196, 34201, 34207, 2486, 34212, 2493, 2500, 2886, 34217, 2506, - 2516, 34223, 2548, 2553, 2558, 34227, 34232, 34237, 34243, 34248, 34253, - 34257, 34262, 34268, 34273, 34278, 34283, 34289, 34294, 34298, 34302, - 34307, 34312, 34317, 34322, 34327, 34333, 34339, 34344, 34348, 34353, - 34359, 34363, 34368, 34373, 34378, 34383, 34387, 34390, 34395, 34400, - 34405, 34410, 34415, 34421, 34427, 34432, 34437, 34442, 34446, 34451, - 34456, 34461, 34466, 34471, 34476, 34480, 34485, 34490, 34495, 34499, - 34503, 34507, 34512, 34520, 34525, 34530, 34536, 34542, 34548, 34553, - 34561, 34565, 34568, 34573, 34578, 34582, 34587, 34592, 34596, 34601, - 34605, 34608, 34613, 4104, 20257, 34618, 34623, 34628, 34633, 34641, - 24401, 33046, 10010, 34646, 34651, 34655, 34660, 34664, 34668, 34673, - 34677, 34680, 34683, 34687, 34692, 34696, 34704, 34708, 34711, 34716, - 34720, 34724, 34729, 34734, 34738, 34744, 34749, 34754, 34761, 34768, - 34772, 34775, 34781, 34790, 34797, 34805, 34812, 34816, 34821, 34825, - 34829, 34835, 34840, 34846, 34850, 34856, 34861, 34866, 34870, 34877, - 34883, 34889, 34895, 34901, 34908, 34914, 34920, 34926, 34932, 34938, - 34944, 34950, 34957, 34963, 34970, 34976, 34982, 34988, 34994, 35000, - 35006, 35012, 35018, 35024, 35030, 35035, 35040, 13266, 35045, 35051, - 35056, 35061, 35066, 35071, 35074, 35080, 35085, 35093, 35098, 35102, - 35107, 35113, 35122, 35128, 35133, 35138, 35143, 35147, 35152, 35156, - 35161, 35166, 35171, 35176, 35183, 35190, 35196, 35202, 35207, 19116, - 35214, 35220, 35227, 35233, 35239, 35244, 35252, 35257, 10916, 35261, - 35266, 35271, 35277, 35282, 35287, 35291, 35296, 35301, 35307, 35312, - 35317, 35322, 35326, 35331, 35336, 35340, 35345, 35350, 35354, 35359, - 35363, 35368, 35373, 35378, 35382, 35387, 35391, 35396, 35400, 35404, - 35408, 17825, 35413, 35420, 35429, 35435, 35441, 35450, 35458, 35467, - 35475, 35480, 35484, 35491, 35497, 35505, 35509, 35512, 35517, 35521, - 35530, 35538, 35556, 35562, 1435, 35568, 35571, 35575, 25836, 25842, - 35581, 35585, 35596, 35607, 35618, 35630, 35634, 35641, 35648, 35655, - 35660, 35664, 35672, 35677, 35682, 35687, 35692, 6527, 1050, 24400, - 35697, 35702, 35706, 35711, 35715, 35721, 35726, 35732, 35737, 35743, - 35748, 35754, 35759, 35765, 35771, 35777, 35782, 35738, 35744, 35786, - 35791, 35797, 35802, 35808, 35813, 35819, 35824, 35749, 11983, 35828, - 35760, 35766, 35772, 2978, 3672, 35834, 35837, 35842, 35848, 35854, - 35860, 35867, 35873, 35879, 35885, 35891, 35897, 35903, 35909, 35915, - 35921, 35927, 35933, 35939, 35946, 35952, 35958, 35964, 35970, 35976, - 35979, 35984, 35987, 35994, 35999, 36007, 36011, 36016, 36021, 36027, - 36032, 36037, 36041, 36046, 36052, 36057, 36063, 36068, 36074, 36079, - 36085, 36091, 36095, 36100, 36105, 36110, 36115, 36119, 36124, 36129, - 36134, 36140, 36146, 36152, 36158, 36163, 36167, 36170, 36176, 36182, - 36191, 36199, 36206, 36211, 36215, 36219, 36224, 17615, 36229, 36237, - 36243, 4050, 1293, 36248, 36252, 8763, 36258, 36264, 36271, 8772, 36275, - 36281, 36288, 36294, 36303, 36311, 36323, 36327, 36334, 36340, 36345, - 36349, 36353, 36356, 36366, 36375, 36383, 35739, 36388, 36398, 36408, - 36418, 36424, 36429, 36439, 36444, 36457, 36471, 36482, 36494, 36506, - 36520, 36533, 36545, 36557, 16966, 36571, 36576, 36581, 36585, 36589, - 36593, 36597, 36603, 36608, 36613, 36618, 36623, 36628, 36633, 1758, - 31228, 36638, 36643, 35787, 36648, 36651, 36656, 36661, 36666, 36672, - 36678, 18733, 11558, 36683, 36689, 36696, 18365, 36702, 36707, 36712, - 36716, 36721, 36726, 35792, 36731, 36736, 36741, 36747, 35798, 36752, - 36755, 36762, 36770, 36776, 36782, 36788, 36799, 36804, 36811, 36818, - 36825, 36833, 36842, 36851, 36857, 36863, 36871, 35803, 36876, 36882, - 36888, 35809, 36893, 36898, 36906, 36914, 36920, 36927, 36933, 36940, - 36947, 36953, 36961, 36971, 36978, 36984, 36989, 36995, 37000, 37005, - 37012, 37021, 37029, 37034, 37040, 37047, 37055, 37061, 37066, 37072, - 37081, 37088, 32169, 37094, 37098, 37103, 37112, 37117, 37122, 37127, - 14446, 37135, 37140, 37145, 37150, 37154, 37159, 37164, 37171, 37176, - 37181, 37186, 35814, 24329, 37192, 2589, 155, 37195, 37198, 37202, 37206, - 37216, 37224, 37231, 37235, 37239, 37242, 37250, 37257, 37264, 30163, - 37273, 37276, 37282, 37289, 37293, 37301, 37309, 37316, 37320, 37324, - 37327, 37333, 37340, 37344, 37348, 37355, 37363, 37371, 35750, 37378, - 37386, 37391, 37403, 11639, 11646, 11653, 11660, 11667, 11674, 578, 404, - 37409, 37414, 37419, 37425, 37430, 37435, 4071, 37440, 37443, 37448, - 37453, 37458, 37463, 37468, 37475, 25960, 37480, 37485, 37490, 37495, - 37500, 37506, 37511, 37517, 35990, 37523, 37528, 37534, 37540, 37550, - 37555, 37560, 37564, 37569, 37574, 37579, 37584, 37597, 37602, 25574, - 19579, 978, 37606, 37612, 37616, 37621, 37626, 37632, 37637, 37642, - 37646, 37651, 37656, 37662, 37667, 37672, 1298, 37676, 37681, 37686, - 37691, 37695, 37700, 37705, 37710, 37716, 37722, 37727, 37731, 37735, - 37740, 37745, 37750, 37754, 37759, 37767, 37771, 37777, 37781, 37788, - 37797, 19350, 35761, 37803, 37810, 37818, 37825, 37831, 37844, 37856, - 37861, 37867, 37871, 2905, 37875, 37879, 37335, 37888, 37899, 37910, - 37915, 32232, 37920, 37925, 37929, 32352, 25847, 37934, 37938, 37943, - 35767, 24436, 37947, 37952, 37958, 37963, 37967, 37971, 37974, 37978, - 37984, 37993, 38004, 38016, 35773, 38021, 38024, 38028, 38032, 38037, - 38042, 38047, 38052, 38057, 38062, 38067, 38072, 341, 38077, 38082, - 38087, 38092, 38097, 38102, 38108, 38113, 38118, 38124, 38129, 38135, - 38140, 38146, 38151, 38156, 38161, 38166, 38171, 38176, 38181, 38186, - 38192, 38197, 38202, 38207, 38212, 38217, 38222, 38227, 38233, 38239, - 38244, 38249, 38254, 38259, 38264, 38269, 38274, 38279, 38284, 38289, - 38294, 38299, 38304, 38309, 38314, 38319, 38324, 38329, 38339, 38349, - 38355, 331, 9, 38360, 38364, 38368, 38376, 38380, 38384, 38387, 16395, - 38390, 38395, 38399, 38404, 38408, 38413, 38417, 38422, 38426, 38429, - 38431, 38435, 38440, 38444, 38455, 38458, 38460, 38464, 38476, 38488, - 38497, 38501, 38511, 38515, 38521, 38526, 38535, 38541, 38546, 38551, - 38555, 38559, 38564, 38571, 38576, 38582, 38587, 38591, 38598, 29589, - 29599, 38602, 38607, 38612, 38617, 38624, 38628, 38635, 38641, 8918, - 38645, 38654, 38662, 38677, 38691, 38700, 38708, 38719, 38728, 38733, - 38740, 38750, 7924, 38760, 38765, 38770, 38774, 38777, 38782, 38786, - 38791, 38795, 38802, 38807, 38812, 38817, 38827, 38832, 38837, 38842, - 9883, 38847, 38849, 38857, 38860, 38863, 38865, 38869, 38875, 38879, - 38884, 38889, 38907, 38921, 38940, 38957, 38966, 38974, 38979, 38984, - 1428, 38990, 38996, 39001, 39011, 39020, 39028, 39033, 39039, 39044, - 39053, 39062, 39073, 39078, 39085, 39091, 39095, 39104, 39111, 39119, - 39126, 39139, 39147, 39151, 39161, 39166, 39170, 39178, 39186, 39191, - 39195, 39199, 39208, 39214, 39219, 39227, 39237, 39246, 39255, 39264, - 39275, 39283, 39294, 39303, 39311, 39318, 39324, 39329, 39340, 39351, - 39356, 39360, 39363, 39367, 39375, 39381, 39392, 39403, 39414, 39425, - 39436, 39447, 39458, 39469, 39481, 39493, 39505, 39517, 39529, 39541, - 39553, 39562, 39566, 39574, 39580, 39586, 39593, 39599, 39604, 39610, - 39614, 39619, 39624, 39629, 38334, 38344, 2460, 39634, 39636, 39641, - 39646, 39651, 39654, 39656, 39660, 39663, 39670, 39674, 11229, 39678, - 39684, 39694, 39699, 39705, 39709, 39714, 39727, 30057, 39733, 39742, - 39751, 20480, 39758, 39767, 36404, 39775, 39780, 39784, 39793, 39801, - 39808, 39813, 39817, 39822, 39827, 39835, 39839, 39847, 39853, 39859, - 39864, 39869, 39873, 39876, 39881, 39894, 39910, 26450, 39927, 39939, - 39956, 39968, 39982, 26467, 26486, 39994, 40006, 2779, 40020, 40025, - 40030, 40035, 40039, 40046, 40058, 40065, 40074, 40077, 40088, 40099, - 40107, 40112, 40116, 40121, 40126, 40131, 40136, 40141, 40146, 36868, - 927, 40151, 40155, 40159, 40162, 40167, 40172, 40178, 40183, 40188, - 40194, 40200, 40205, 40209, 40214, 40219, 40224, 40228, 40231, 40237, - 40242, 40247, 40252, 40256, 40261, 40267, 40275, 30336, 40280, 40285, - 40292, 40298, 40304, 40309, 40317, 25969, 40324, 40329, 40334, 40339, - 40343, 40346, 40351, 40355, 40359, 40366, 40372, 40378, 40384, 40391, - 40396, 40402, 39181, 40406, 40410, 40415, 40428, 40433, 40439, 40447, - 40454, 40462, 40472, 40478, 40484, 40490, 40494, 40503, 40511, 40518, - 40523, 40528, 12006, 40533, 40543, 40550, 40556, 40566, 40571, 40577, - 40585, 3924, 40592, 40599, 40605, 40612, 3930, 40616, 40621, 40632, - 40639, 40645, 40654, 40658, 4502, 40661, 40668, 40674, 40680, 40688, - 40698, 33513, 40705, 40713, 40719, 40724, 40730, 40735, 40739, 29901, - 40745, 40752, 40758, 40766, 40775, 40782, 40788, 40799, 27269, 40805, - 40815, 40820, 40824, 40832, 40840, 40847, 40853, 40858, 10874, 6502, - 40863, 40867, 40869, 40873, 40878, 40880, 40885, 40891, 40896, 40901, - 40908, 37471, 40914, 40919, 40923, 40928, 40932, 40941, 40945, 40951, - 40958, 40964, 40971, 40976, 40985, 40990, 40994, 40999, 41006, 41014, - 41022, 41027, 24492, 41031, 41034, 41038, 41042, 12429, 944, 41046, - 41051, 41059, 41064, 41068, 41077, 41084, 41088, 41092, 41100, 41107, - 15728, 41117, 41121, 41125, 41133, 41141, 41147, 41152, 41161, 15476, - 41167, 41176, 41183, 41188, 41195, 41202, 41210, 41217, 41225, 41233, - 41242, 41247, 41254, 41261, 41268, 41275, 41282, 41287, 41294, 41300, - 41317, 41325, 41335, 41343, 41350, 439, 41354, 41360, 41364, 41369, - 38724, 41375, 41378, 41382, 41388, 41399, 41407, 3935, 41415, 41421, - 41427, 41437, 41443, 41452, 41461, 41471, 41478, 41484, 41489, 3941, - 3947, 41498, 41505, 41513, 41518, 41522, 41529, 41537, 41544, 41551, - 41557, 41566, 41576, 41582, 41590, 41599, 41606, 41614, 41621, 25249, - 41625, 41632, 41638, 41648, 41657, 41665, 41676, 41680, 41690, 41697, - 41702, 41708, 41715, 41723, 41732, 41741, 41751, 41762, 41769, 41774, - 41781, 3193, 41789, 41795, 41800, 41807, 41813, 41819, 41824, 41837, - 41850, 41863, 41870, 41876, 41884, 41892, 41897, 41901, 41905, 41910, - 41915, 41920, 41925, 41930, 41935, 1397, 41940, 41944, 41948, 41952, - 41956, 41960, 41964, 41968, 41972, 41976, 41980, 41984, 41988, 41992, - 41996, 42000, 42004, 42008, 42012, 42016, 42020, 42024, 42028, 42032, - 42036, 42040, 42044, 42048, 42052, 42056, 42060, 42064, 42068, 42072, - 42076, 42080, 42084, 42088, 42092, 42096, 42100, 42104, 42108, 42112, - 42116, 42120, 42124, 42128, 42132, 42136, 42140, 42144, 42148, 42152, - 42156, 42160, 42164, 42168, 42172, 42176, 42180, 42184, 42188, 42192, - 42196, 42200, 42204, 42208, 42212, 42216, 42220, 42224, 42228, 42232, - 42236, 42240, 42244, 42248, 42252, 42256, 42260, 42264, 42268, 42272, - 42276, 42280, 42284, 42288, 42292, 42296, 42300, 42304, 42308, 42312, - 42316, 42320, 42324, 42328, 42332, 42336, 42340, 42344, 42348, 42352, - 42356, 42360, 42364, 42368, 42372, 42376, 42380, 42384, 42388, 42392, - 42396, 42400, 42404, 42408, 42412, 42416, 42420, 42424, 42428, 42432, - 42436, 42440, 42444, 42448, 42452, 42456, 42460, 42464, 42468, 42472, - 42476, 42480, 42484, 42488, 42492, 42496, 42500, 42504, 42508, 42512, - 42516, 42520, 42524, 42528, 42532, 42536, 42540, 42544, 42548, 42552, - 42557, 42561, 42566, 42570, 42575, 42579, 42584, 42588, 42594, 42599, - 42603, 42608, 42612, 42617, 42621, 42626, 42630, 42635, 42639, 42644, - 42648, 42653, 42657, 42663, 42669, 42674, 42678, 42683, 42687, 42693, - 42698, 42702, 42707, 42711, 42716, 42720, 42726, 42731, 42735, 42740, - 42744, 42749, 42753, 42758, 42762, 42768, 42773, 42777, 42782, 42786, - 42792, 42797, 42801, 42806, 42810, 42815, 42819, 42824, 42828, 42833, - 42837, 42843, 42848, 42852, 42858, 42863, 42867, 42873, 42878, 42882, - 42887, 42891, 42896, 42900, 42906, 42912, 42918, 42924, 42930, 42936, - 42942, 42948, 42953, 42957, 42962, 42966, 42972, 42977, 42981, 42986, - 42990, 42995, 42999, 43004, 43008, 43013, 43017, 43022, 43026, 43031, - 43035, 43041, 43046, 43050, 43055, 43059, 43065, 43071, 43076, 127, 63, - 43080, 43082, 43086, 43090, 43094, 43099, 43103, 43107, 43112, 10787, - 43117, 43123, 1703, 6943, 43129, 43132, 43137, 43141, 43146, 43150, - 43154, 43159, 11790, 43163, 43167, 43171, 571, 43175, 17934, 43180, - 43184, 43189, 43194, 43199, 43203, 43210, 30081, 43216, 43219, 43223, - 43228, 43234, 43238, 43241, 43249, 43255, 43260, 43264, 43267, 43271, - 43277, 43281, 43285, 3723, 3728, 14558, 43288, 43292, 43296, 43300, - 43304, 43312, 43319, 43323, 15426, 43330, 43335, 43349, 43356, 43367, - 361, 43372, 43376, 43382, 43394, 43400, 43406, 43411, 43417, 43421, - 33786, 43430, 43436, 43445, 43449, 43453, 43458, 43464, 43469, 43473, - 43478, 43482, 43486, 43493, 43499, 43504, 43515, 43530, 43545, 43560, - 43576, 43594, 11704, 43608, 43615, 43619, 43622, 43631, 43636, 43640, - 43648, 18568, 43656, 43660, 43670, 43681, 33711, 43694, 43698, 43707, - 43725, 43744, 43753, 43761, 43769, 11069, 11903, 43773, 25859, 43776, - 34700, 43781, 11068, 43786, 43792, 43797, 43803, 43808, 43814, 43819, - 43825, 43830, 43836, 43842, 43848, 43853, 43809, 43815, 43857, 43820, - 43826, 43831, 43862, 43837, 43843, 8931, 4327, 43868, 43876, 43880, - 43883, 43890, 43894, 43899, 43904, 43911, 43917, 43923, 43928, 17247, - 43932, 29918, 43936, 43940, 43944, 43950, 43954, 32103, 43963, 10043, - 43967, 10469, 43970, 43977, 43983, 43987, 13867, 43994, 44000, 44005, - 44012, 44019, 44026, 32872, 8828, 44033, 44040, 44047, 44053, 44058, - 44065, 44076, 44082, 44087, 44092, 44097, 44101, 44106, 44113, 43810, - 44117, 44127, 44136, 44147, 44153, 44161, 44168, 44173, 44178, 44183, - 44188, 44193, 44197, 44201, 44208, 44214, 44222, 2353, 29018, 11806, - 11818, 11823, 11829, 44231, 11834, 11839, 11845, 44236, 44246, 44250, - 11850, 44255, 19777, 44258, 44263, 44267, 40069, 44278, 44283, 44290, - 44297, 44301, 44304, 44312, 11717, 44319, 44322, 44328, 44338, 6554, - 44347, 44352, 44358, 44362, 44370, 44374, 44384, 44390, 44395, 44406, - 44415, 44424, 44433, 44442, 44451, 44460, 44469, 44475, 44481, 44486, - 44492, 44498, 44504, 44509, 44512, 44519, 44525, 44529, 44534, 44541, - 44548, 44552, 44555, 44565, 44578, 44587, 44596, 44607, 44620, 44632, - 44643, 44652, 44663, 44668, 44677, 44682, 11855, 44688, 44695, 44703, - 44708, 44713, 30127, 44717, 44724, 4267, 25, 44728, 44733, 19626, 44737, - 44740, 44743, 32289, 44747, 32881, 44755, 44759, 44763, 44766, 44772, - 44778, 44783, 35838, 44792, 44800, 44806, 44813, 32272, 44817, 32503, - 44821, 44830, 44834, 44842, 44848, 44854, 44859, 44863, 32907, 44869, - 44872, 44880, 44888, 4649, 44894, 44898, 44902, 44907, 44914, 44920, - 44925, 44930, 44934, 44940, 44945, 44951, 4555, 766, 44958, 44962, 44965, - 44977, 44984, 44989, 17807, 44993, 45001, 45009, 45017, 45025, 45032, - 45040, 45048, 45055, 45063, 45071, 45079, 45087, 45095, 45103, 45111, - 45119, 45127, 45135, 45143, 45150, 45158, 45166, 45174, 45182, 45190, - 45198, 45206, 45214, 45222, 45230, 45238, 45246, 45254, 45262, 45270, - 45278, 45286, 45294, 45302, 45309, 45317, 45324, 45332, 45340, 45348, - 45356, 45364, 45372, 45380, 45388, 45399, 25285, 45404, 45407, 45414, - 45418, 45424, 45428, 45434, 45439, 45445, 45450, 45455, 45459, 45463, - 45471, 45476, 45481, 45491, 45497, 45510, 45516, 45522, 45528, 45531, - 45538, 45543, 45549, 45554, 19522, 903, 45559, 45562, 45565, 45568, - 35922, 35928, 45571, 35934, 35947, 35953, 35959, 45577, 35965, 35971, - 45583, 45589, 18, 45597, 45604, 45608, 45612, 45620, 36757, 45624, 45628, - 45635, 45640, 45644, 45649, 45655, 45660, 45666, 45671, 45675, 45679, - 45683, 45688, 45692, 45697, 45701, 45705, 45712, 45717, 45721, 45725, - 45730, 45734, 45739, 45743, 45747, 45752, 45758, 18091, 18096, 45763, - 45767, 45770, 45776, 45780, 45784, 24286, 45789, 45793, 45799, 45806, - 45812, 45817, 38753, 45827, 45832, 45840, 45844, 45847, 36772, 45851, - 4620, 45856, 45861, 45865, 45870, 45874, 45879, 15494, 45890, 45894, - 45897, 45901, 45906, 45910, 45915, 45920, 45924, 45928, 45932, 45935, - 45939, 45942, 45947, 45952, 45957, 45962, 45967, 45972, 8415, 15510, - 45977, 45980, 45986, 45991, 45997, 46002, 46008, 46013, 46019, 46024, - 46030, 46036, 46042, 46047, 46051, 46055, 46062, 46071, 46087, 46103, - 46113, 32179, 46120, 46124, 46129, 46134, 46138, 46142, 41736, 46148, - 46153, 46157, 46164, 46169, 46174, 46178, 46181, 46185, 46191, 31031, - 46195, 24599, 46200, 46207, 46215, 46221, 46228, 46236, 46242, 46246, - 46251, 46257, 46265, 46270, 46274, 46283, 10768, 46291, 46295, 46303, - 46310, 46315, 46320, 46325, 46329, 46332, 46338, 46342, 46345, 46349, - 46356, 46361, 46365, 46371, 46375, 46381, 46386, 46391, 30422, 35985, - 46396, 46405, 46413, 46419, 46431, 46444, 46458, 46465, 46471, 46477, - 46482, 46490, 46493, 46495, 46502, 46509, 46515, 46519, 8414, 46522, - 46526, 46530, 46535, 46539, 46543, 46546, 46550, 46564, 26516, 46583, - 46596, 46609, 46622, 26534, 46637, 2732, 46652, 46658, 46662, 46672, - 46676, 46680, 46685, 46689, 46696, 46701, 46705, 46712, 46718, 46723, - 46729, 46739, 46751, 46762, 46767, 46774, 46778, 46782, 46785, 46793, - 18589, 4039, 46798, 18124, 46811, 46818, 46825, 46831, 46835, 46839, - 46844, 46850, 46855, 46861, 46865, 46869, 46872, 46877, 46881, 46886, - 46891, 46896, 46901, 46906, 46911, 46916, 46921, 46926, 8469, 18135, - 46931, 46935, 46941, 46950, 46955, 46964, 46971, 41572, 46977, 46982, - 46986, 46993, 46998, 47005, 47011, 47015, 47018, 47022, 47027, 2810, - 47034, 47041, 47045, 47048, 47053, 47058, 47064, 47069, 47074, 47078, - 47083, 47093, 47098, 47104, 47109, 44979, 47115, 47121, 47131, 47136, - 47141, 47145, 47150, 7926, 7938, 47155, 47158, 47165, 47171, 47180, 9963, - 39321, 47188, 47192, 47196, 36820, 47204, 47215, 47223, 41784, 47230, - 47235, 47240, 47251, 47258, 47269, 36844, 24616, 47277, 1022, 47282, - 15917, 47288, 32263, 47294, 47299, 47309, 47318, 47325, 47331, 47335, - 47338, 47345, 47351, 47358, 47364, 47374, 47382, 47388, 47394, 47399, - 47403, 47410, 47415, 47421, 47428, 47434, 46531, 47439, 47443, 15959, - 15968, 15977, 15986, 15995, 16024, 620, 16033, 47449, 47454, 47457, - 47463, 47471, 1315, 47476, 47480, 47485, 47490, 47495, 47502, 47508, - 47512, 47517, 47523, 47527, 35995, 47532, 47537, 47546, 47553, 47563, - 47569, 32307, 47586, 47595, 47603, 47609, 47614, 47621, 47627, 47635, - 47644, 47652, 47660, 47666, 47670, 47675, 47683, 33392, 36853, 47689, - 47708, 18492, 47722, 47738, 47752, 47758, 47763, 47768, 47773, 47779, - 36859, 47784, 47787, 47794, 47801, 47810, 47815, 47819, 420, 3100, 47826, - 47831, 47836, 31400, 47624, 47840, 47845, 47853, 47857, 47860, 47865, - 47871, 47877, 47882, 47886, 32380, 47889, 47894, 47898, 47901, 47906, - 47910, 47915, 47920, 47924, 47929, 47933, 47937, 47941, 24282, 24293, - 47946, 47951, 47957, 47962, 47968, 47974, 30987, 47979, 47983, 47986, - 47992, 47997, 48002, 48007, 48012, 48017, 48022, 48027, 48032, 48038, - 48044, 24379, 18795, 48049, 48054, 48059, 48064, 48069, 48074, 48079, - 48084, 450, 68, 36012, 36017, 36022, 36028, 36033, 36038, 48089, 36042, - 48093, 48097, 48101, 36047, 36053, 48115, 36064, 36069, 48123, 48128, - 36075, 48133, 48138, 48147, 48152, 48157, 48166, 48172, 48178, 48184, - 36092, 48197, 48206, 48212, 36096, 48216, 36101, 48221, 36106, 36111, - 48224, 48229, 48233, 48239, 15735, 48246, 15745, 48253, 48258, 36116, - 48262, 48267, 48272, 48277, 48282, 48286, 48291, 48296, 48302, 48307, - 48312, 48318, 48324, 48329, 48333, 48338, 48343, 48348, 48352, 48357, - 48362, 48367, 48373, 48379, 48385, 48390, 48394, 48399, 48403, 36120, - 36125, 36130, 48407, 48411, 48416, 48420, 48432, 36135, 36141, 36147, - 36159, 48438, 29955, 48442, 48447, 48451, 48456, 48463, 48468, 48473, - 48478, 48482, 48486, 48496, 48501, 48506, 48510, 48514, 48517, 48525, - 48530, 36207, 48534, 1407, 48540, 48545, 48551, 48559, 48563, 48572, - 48580, 48584, 48588, 48596, 48602, 48610, 48626, 48630, 48634, 48638, - 48643, 48649, 48664, 36244, 1711, 14075, 48668, 1294, 1309, 48680, 48688, - 48695, 48700, 48707, 48712, 10452, 963, 2575, 11882, 48719, 10350, 48724, - 48727, 48736, 1202, 48741, 46702, 48748, 48757, 48762, 48766, 48774, - 25915, 2631, 48781, 12382, 48791, 48797, 2371, 2381, 48806, 48815, 48825, - 48836, 3508, 39695, 48841, 4234, 4245, 19560, 1207, 48845, 48853, 48860, - 48865, 48869, 48873, 48878, 27530, 47029, 11973, 48886, 48895, 48904, - 48912, 48925, 48932, 48943, 48948, 48961, 48974, 48986, 48998, 49010, - 49021, 49034, 49045, 49056, 49066, 49074, 49082, 49094, 49106, 49117, - 49126, 49134, 49141, 49153, 49160, 49166, 49175, 49181, 49188, 49201, - 49206, 49216, 49221, 49227, 49232, 43984, 49236, 46334, 49243, 49250, - 49258, 49265, 2588, 49272, 49283, 49293, 49302, 49310, 49320, 49328, - 49337, 49347, 49356, 49361, 49367, 49373, 4083, 49384, 49394, 49403, - 49412, 49420, 49430, 49438, 49447, 49452, 49457, 49462, 1636, 47, 49470, - 49478, 49489, 49500, 19181, 49510, 49514, 49521, 49527, 49532, 49536, - 49547, 49557, 49566, 49577, 19599, 19604, 49582, 49591, 49596, 49606, - 49611, 49619, 49627, 49634, 49640, 1598, 259, 49644, 49650, 49655, 49658, - 2119, 2597, 49666, 49670, 49673, 1452, 49679, 16224, 1212, 49684, 49697, - 2721, 2742, 49711, 49723, 49735, 2756, 2773, 2788, 2804, 2821, 49749, - 49761, 2836, 49775, 1218, 1224, 1230, 12253, 49780, 49785, 49790, 49794, - 49809, 49824, 49839, 49854, 49869, 49884, 49899, 49914, 49929, 49944, - 49959, 49974, 49989, 50004, 50019, 50034, 50049, 50064, 50079, 50094, - 50109, 50124, 50139, 50154, 50169, 50184, 50199, 50214, 50229, 50244, - 50259, 50274, 50289, 50304, 50319, 50334, 50349, 50364, 50379, 50394, - 50409, 50424, 50439, 50454, 50469, 50484, 50499, 50514, 50529, 50544, - 50559, 50574, 50589, 50604, 50619, 50634, 50649, 50664, 50679, 50694, - 50709, 50724, 50739, 50754, 50769, 50784, 50799, 50814, 50829, 50844, - 50859, 50874, 50889, 50904, 50919, 50934, 50949, 50964, 50979, 50994, - 51009, 51024, 51039, 51054, 51069, 51084, 51099, 51114, 51129, 51144, - 51159, 51174, 51189, 51204, 51219, 51234, 51249, 51264, 51279, 51294, - 51309, 51324, 51339, 51354, 51369, 51384, 51399, 51414, 51429, 51444, - 51459, 51474, 51489, 51504, 51519, 51534, 51549, 51564, 51579, 51594, - 51609, 51624, 51639, 51654, 51669, 51684, 51699, 51714, 51729, 51744, - 51759, 51774, 51789, 51804, 51819, 51834, 51849, 51864, 51879, 51894, - 51909, 51924, 51939, 51954, 51969, 51984, 51999, 52014, 52029, 52044, - 52059, 52074, 52089, 52104, 52119, 52134, 52149, 52164, 52179, 52194, - 52209, 52224, 52239, 52254, 52269, 52284, 52299, 52314, 52329, 52344, - 52359, 52374, 52389, 52404, 52419, 52434, 52449, 52464, 52479, 52494, - 52509, 52524, 52539, 52554, 52569, 52584, 52599, 52614, 52629, 52644, - 52659, 52674, 52689, 52704, 52719, 52734, 52749, 52764, 52779, 52794, - 52809, 52824, 52839, 52854, 52869, 52884, 52899, 52914, 52929, 52944, - 52959, 52974, 52989, 53004, 53019, 53034, 53049, 53064, 53079, 53094, - 53109, 53124, 53139, 53154, 53169, 53184, 53199, 53214, 53229, 53244, - 53259, 53274, 53289, 53304, 53319, 53334, 53349, 53364, 53379, 53394, - 53409, 53424, 53439, 53454, 53469, 53484, 53499, 53514, 53529, 53544, - 53559, 53574, 53589, 53604, 53619, 53634, 53649, 53664, 53679, 53694, - 53709, 53724, 53739, 53754, 53769, 53784, 53799, 53814, 53829, 53844, - 53859, 53874, 53889, 53904, 53919, 53934, 53949, 53964, 53979, 53994, - 54009, 54024, 54039, 54054, 54069, 54084, 54099, 54114, 54129, 54144, - 54159, 54174, 54189, 54204, 54219, 54234, 54249, 54264, 54279, 54294, - 54309, 54324, 54339, 54354, 54369, 54384, 54399, 54414, 54429, 54444, - 54459, 54474, 54489, 54504, 54519, 54534, 54549, 54564, 54579, 54594, - 54609, 54624, 54639, 54654, 54669, 54684, 54699, 54714, 54729, 54744, - 54759, 54774, 54789, 54804, 54819, 54834, 54849, 54864, 54879, 54894, - 54909, 54924, 54939, 54954, 54969, 54984, 54999, 55014, 55029, 55044, - 55059, 55074, 55089, 55104, 55119, 55134, 55149, 55164, 55179, 55194, - 55209, 55224, 55239, 55254, 55269, 55284, 55299, 55314, 55329, 55344, - 55359, 55374, 55389, 55404, 55419, 55434, 55449, 55464, 55479, 55494, - 55509, 55524, 55539, 55554, 55569, 55584, 55599, 55614, 55629, 55644, - 55659, 55674, 55689, 55704, 55719, 55734, 55749, 55764, 55779, 55794, - 55809, 55824, 55839, 55854, 55869, 55884, 55899, 55914, 55929, 55944, - 55959, 55974, 55989, 56004, 56019, 56034, 56049, 56064, 56079, 56094, - 56109, 56124, 56139, 56154, 56169, 56184, 56199, 56214, 56229, 56244, - 56259, 56274, 56289, 56304, 56319, 56334, 56349, 56364, 56379, 56394, - 56409, 56424, 56439, 56454, 56469, 56484, 56499, 56514, 56529, 56544, - 56559, 56574, 56589, 56604, 56619, 56634, 56649, 56664, 56679, 56694, - 56709, 56724, 56739, 56754, 56769, 56784, 56799, 56814, 56829, 56844, - 56859, 56874, 56889, 56904, 56919, 56934, 56949, 56964, 56979, 56994, - 57009, 57024, 57039, 57054, 57069, 57084, 57099, 57114, 57129, 57144, - 57159, 57174, 57189, 57204, 57219, 57234, 57249, 57264, 57279, 57294, - 57309, 57324, 57339, 57354, 57369, 57384, 57399, 57414, 57429, 57444, - 57459, 57474, 57489, 57504, 57519, 57534, 57549, 57564, 57579, 57594, - 57609, 57625, 57641, 57657, 57673, 57689, 57705, 57721, 57737, 57753, - 57769, 57785, 57801, 57817, 57833, 57849, 57865, 57881, 57897, 57913, - 57929, 57945, 57961, 57977, 57993, 58009, 58025, 58041, 58057, 58073, - 58089, 58105, 58121, 58137, 58153, 58169, 58185, 58201, 58217, 58233, - 58249, 58265, 58281, 58297, 58313, 58329, 58345, 58361, 58377, 58393, - 58409, 58425, 58441, 58457, 58473, 58489, 58505, 58521, 58537, 58553, - 58569, 58585, 58601, 58617, 58633, 58649, 58665, 58681, 58697, 58713, - 58729, 58745, 58761, 58777, 58793, 58809, 58825, 58841, 58857, 58873, - 58889, 58905, 58921, 58937, 58953, 58969, 58985, 59001, 59017, 59033, - 59049, 59065, 59081, 59097, 59113, 59129, 59145, 59161, 59177, 59193, - 59209, 59225, 59241, 59257, 59273, 59289, 59305, 59321, 59337, 59353, - 59369, 59385, 59401, 59417, 59433, 59449, 59465, 59481, 59497, 59513, - 59529, 59545, 59561, 59577, 59593, 59609, 59625, 59641, 59657, 59673, - 59689, 59705, 59721, 59737, 59753, 59769, 59785, 59801, 59817, 59833, - 59849, 59865, 59881, 59897, 59913, 59929, 59945, 59961, 59977, 59993, - 60009, 60025, 60041, 60057, 60073, 60089, 60105, 60121, 60137, 60153, - 60169, 60185, 60201, 60217, 60233, 60249, 60265, 60281, 60297, 60313, - 60329, 60345, 60361, 60377, 60393, 60409, 60425, 60441, 60457, 60473, - 60489, 60505, 60521, 60537, 60553, 60569, 60585, 60601, 60617, 60633, - 60649, 60665, 60681, 60697, 60713, 60729, 60745, 60761, 60777, 60793, - 60809, 60825, 60841, 60857, 60873, 60889, 60905, 60921, 60937, 60953, - 60969, 60985, 61001, 61017, 61033, 61049, 61065, 61081, 61097, 61113, - 61129, 61145, 61161, 61177, 61193, 61209, 61225, 61241, 61257, 61273, - 61289, 61305, 61321, 61337, 61353, 61369, 61385, 61401, 61417, 61433, - 61449, 61465, 61481, 61497, 61513, 61529, 61545, 61561, 61577, 61593, - 61609, 61625, 61641, 61657, 61673, 61689, 61705, 61721, 61737, 61753, - 61769, 61785, 61801, 61817, 61833, 61849, 61865, 61881, 61897, 61913, - 61929, 61945, 61961, 61977, 61993, 62009, 62025, 62041, 62057, 62073, - 62089, 62105, 62121, 62137, 62153, 62169, 62185, 62201, 62217, 62233, - 62249, 62265, 62281, 62297, 62313, 62329, 62345, 62361, 62377, 62393, - 62409, 62425, 62441, 62457, 62473, 62489, 62505, 62521, 62537, 62553, - 62569, 62585, 62601, 62617, 62633, 62649, 62665, 62681, 62697, 62713, - 62729, 62745, 62761, 62777, 62793, 62809, 62825, 62841, 62857, 62873, - 62889, 62905, 62921, 62937, 62953, 62969, 62985, 63001, 63017, 63033, - 63049, 63065, 63081, 63097, 63113, 63129, 63145, 63161, 63177, 63193, - 63209, 63225, 63241, 63257, 63273, 63289, 63305, 63321, 63337, 63353, - 63369, 63385, 63401, 63417, 63433, 63449, 63465, 63481, 63497, 63513, - 63529, 63545, 63561, 63577, 63593, 63609, 63625, 63641, 63657, 63673, - 63689, 63705, 63721, 63737, 63753, 63769, 63785, 63801, 63817, 63833, - 63849, 63865, 63881, 63897, 63913, 63929, 63945, 63961, 63977, 63993, - 64009, 64025, 64041, 64057, 64073, 64089, 64105, 64121, 64137, 64153, - 64169, 64185, 64201, 64217, 64233, 64249, 64265, 64281, 64297, 64313, - 64329, 64345, 64361, 64377, 64393, 64409, 64425, 64441, 64457, 64473, - 64489, 64505, 64521, 64537, 64553, 64569, 64585, 64601, 64617, 64633, - 64649, 64665, 64681, 64697, 64713, 64729, 64745, 64761, 64777, 64793, - 64809, 64825, 64841, 64857, 64873, 64889, 64905, 64921, 64937, 64953, - 64969, 64985, 65001, 65017, 65033, 65049, 65065, 65081, 65097, 65113, - 65129, 65145, 65161, 65177, 65193, 65209, 65225, 65241, 65257, 65273, - 65289, 65305, 65321, 65337, 65353, 65369, 65385, 65401, 65417, 65433, - 65449, 65465, 65481, 65497, 65513, 65529, 65545, 65561, 65577, 65593, - 65609, 65625, 65641, 65657, 65673, 65689, 65705, 65721, 65737, 65753, - 65769, 65785, 65801, 65817, 65833, 65849, 65865, 65881, 65897, 65913, - 65929, 65945, 65961, 65977, 65993, 66009, 66025, 66041, 66057, 66073, - 66089, 66105, 66121, 66137, 66153, 66169, 66185, 66201, 66217, 66233, - 66249, 66265, 66281, 66290, 66305, 17090, 66314, 66319, 66325, 66331, - 66341, 66349, 17343, 18025, 11298, 66362, 1460, 1464, 66370, 4163, 31515, - 7863, 66376, 66381, 66386, 66391, 66396, 66402, 66407, 66413, 66418, - 66424, 66429, 66434, 66439, 66444, 66450, 66455, 66460, 66465, 66470, - 66475, 66480, 66485, 66491, 66496, 66502, 66509, 2635, 66514, 66520, - 9347, 66524, 66529, 66536, 66544, 4174, 4179, 4184, 4189, 65, 66548, - 66554, 66559, 66564, 66568, 66573, 66577, 66581, 12325, 66585, 66595, - 66608, 66619, 66632, 66639, 66645, 66653, 11807, 66660, 66665, 66671, - 66677, 66683, 66688, 66693, 66698, 66703, 66707, 66712, 66717, 66722, - 66728, 66734, 66740, 66745, 66749, 66754, 66759, 66763, 66768, 66773, - 66778, 66782, 12341, 12352, 12357, 1503, 66786, 66792, 1508, 19026, - 66797, 19035, 66802, 66808, 66813, 1539, 66819, 1545, 1551, 12387, 66824, - 66833, 66841, 66849, 66856, 66860, 66864, 66870, 66875, 35651, 66880, - 66887, 66894, 66899, 66903, 66907, 66916, 66921, 66926, 66931, 1556, 264, - 66936, 66940, 19161, 984, 66944, 66951, 66956, 66960, 19197, 1560, 44141, - 66963, 66968, 66978, 66987, 66992, 66996, 67002, 1565, 46983, 67007, - 67016, 67022, 67027, 67032, 12626, 12632, 67038, 67050, 67067, 67084, - 67101, 67118, 67135, 67152, 67169, 67186, 67203, 67220, 67237, 67254, - 67271, 67288, 67305, 67322, 67339, 67356, 67373, 67390, 67407, 67424, - 67441, 67458, 67475, 67492, 67509, 67526, 67543, 67560, 67577, 67594, - 67611, 67628, 67645, 67662, 67679, 67696, 67713, 67730, 67747, 67764, - 67781, 67798, 67815, 67832, 67849, 67866, 67883, 67894, 67904, 67909, - 1570, 67913, 67918, 67924, 67929, 67934, 67941, 10369, 1575, 67947, - 67956, 31894, 67961, 67972, 12643, 67982, 67987, 67993, 67998, 68005, - 68011, 68016, 1580, 19491, 68021, 68027, 12653, 68033, 68038, 68043, - 68048, 68053, 68058, 68063, 68068, 1585, 4638, 68073, 68078, 68084, - 68089, 68094, 68099, 68104, 68109, 68114, 68119, 68124, 68130, 68136, - 68142, 68147, 68151, 68156, 68161, 68165, 68170, 68175, 68180, 68185, - 68189, 68194, 68200, 68205, 68210, 68214, 68219, 68224, 68230, 68235, - 68240, 68246, 68252, 68257, 68261, 68266, 68271, 68276, 68280, 68285, - 68290, 68295, 68301, 68307, 68312, 68316, 68320, 68325, 68330, 68335, - 33586, 68339, 68344, 68349, 68355, 68360, 68365, 68369, 68374, 68379, - 68385, 68390, 68395, 68401, 68407, 68412, 68416, 68421, 68426, 68430, - 68435, 68440, 68445, 68451, 68457, 68462, 68466, 68471, 68476, 68480, - 68485, 68490, 68495, 68500, 68504, 68507, 68510, 68515, 68520, 36371, - 68527, 68535, 68541, 3840, 31837, 68554, 68561, 68567, 68573, 4014, - 68578, 12795, 68584, 68594, 68609, 68617, 12800, 68628, 68633, 68644, - 68656, 68668, 68680, 2827, 68692, 68697, 68709, 68713, 68719, 68725, - 68730, 68739, 68746, 68751, 68756, 68761, 68766, 68771, 68776, 1602, - 18664, 68781, 68786, 47049, 68790, 68794, 68799, 68803, 19639, 68808, - 68811, 68816, 68824, 68832, 1606, 12836, 12842, 1611, 68840, 68847, - 68852, 68861, 68871, 68878, 68883, 68888, 1616, 68895, 68900, 19759, - 68904, 68909, 68916, 68922, 68926, 68939, 68945, 68956, 68966, 68973, - 19781, 10263, 10270, 4248, 4254, 68980, 1621, 68985, 68994, 69000, 69008, - 69015, 69021, 69028, 69040, 69046, 69051, 69058, 69070, 69081, 69090, - 69100, 69110, 4142, 69118, 35445, 35454, 19821, 69131, 69136, 69141, - 69146, 69151, 69156, 69161, 1626, 1630, 69166, 69170, 69173, 69184, - 69189, 1640, 69197, 69202, 69207, 19880, 69219, 69222, 69228, 69234, - 69239, 69247, 1645, 69252, 69257, 69265, 69273, 69280, 69289, 69297, - 69306, 69310, 1650, 69319, 1655, 24467, 69324, 69331, 69337, 19967, - 69345, 69355, 69361, 69366, 69374, 69381, 69390, 69398, 69408, 69417, - 69427, 69436, 69447, 69457, 69467, 69476, 69486, 69500, 69513, 69522, - 69530, 69540, 69549, 69561, 69572, 69583, 69593, 19259, 69598, 12988, - 69607, 69613, 69618, 69625, 69632, 69638, 18870, 69648, 69654, 69659, - 69670, 69677, 69684, 69689, 69697, 13005, 13010, 69705, 69711, 69715, - 4232, 4243, 20043, 47137, 69723, 69729, 69734, 69742, 69749, 14056, - 69754, 69760, 69766, 1666, 69771, 69774, 69780, 69785, 69790, 69795, - 69800, 69805, 69810, 69815, 69820, 69826, 69832, 1373, 69837, 69842, - 69847, 69853, 69858, 69863, 69868, 69873, 69878, 69883, 1675, 13, 69889, - 69893, 69898, 69902, 69906, 69910, 36652, 69915, 26735, 69920, 69925, - 69929, 69932, 69936, 69940, 69945, 69949, 69954, 69958, 69964, 40163, - 40168, 40173, 69967, 69974, 69980, 69988, 46755, 69998, 40179, 36916, - 36667, 36673, 40195, 36679, 70003, 70008, 70012, 36949, 70019, 70022, - 70026, 70034, 70041, 70046, 70049, 70054, 70059, 70063, 70067, 70070, - 70080, 70092, 70099, 70105, 36684, 70112, 38567, 70115, 9364, 1108, - 70118, 70122, 70127, 4057, 70131, 70134, 15778, 70141, 70148, 70161, - 70169, 70178, 70187, 70193, 70198, 70208, 70221, 70233, 70240, 70245, - 70254, 70267, 41831, 70285, 70290, 70297, 70303, 70308, 844, 70313, - 70321, 70328, 70335, 31341, 866, 70341, 70347, 70357, 70365, 70371, - 70376, 36703, 6637, 36717, 70380, 70390, 70395, 70403, 70413, 70428, - 70434, 70440, 36727, 70445, 35793, 70449, 70454, 70461, 70466, 70470, - 70475, 70483, 19824, 70490, 70495, 70499, 6678, 36753, 70503, 70509, 330, - 70519, 70526, 70533, 70539, 70546, 70551, 70560, 15409, 66972, 66982, - 70566, 70574, 70578, 70582, 70586, 70590, 70595, 70599, 70605, 70613, - 70618, 70623, 70630, 70635, 70639, 70644, 70648, 70652, 70658, 70664, - 70669, 70673, 70678, 70682, 36877, 70686, 36883, 36889, 70691, 70697, - 70704, 70709, 70713, 35810, 19478, 70716, 70720, 70725, 70732, 70738, - 70742, 70747, 46351, 70753, 70757, 70764, 70768, 70773, 70779, 70785, - 70791, 70803, 70812, 70822, 70828, 70835, 70840, 70845, 70849, 70852, - 70858, 70865, 70870, 70875, 70882, 70889, 70896, 70902, 70907, 70912, - 70920, 36894, 2465, 70925, 70930, 70936, 70941, 70947, 70952, 70957, - 70962, 70968, 36915, 70973, 70979, 70985, 70991, 36985, 70996, 71001, - 71006, 36996, 71011, 71016, 71021, 71027, 71033, 37001, 71038, 71043, - 71048, 37056, 37062, 71053, 71058, 37067, 37089, 32170, 37095, 37099, - 71063, 13757, 71067, 71075, 71081, 71089, 71096, 71102, 71112, 71118, - 71125, 12225, 37113, 71131, 71144, 71153, 71159, 71168, 71174, 71180, - 71187, 27078, 71195, 71202, 71212, 71220, 71223, 37057, 71228, 71235, - 71240, 71244, 71248, 71253, 71257, 4371, 71262, 71267, 71272, 40257, - 40262, 71276, 40276, 71281, 40281, 71286, 71292, 40293, 40299, 40305, - 71297, 71303, 25970, 71314, 71317, 71329, 71337, 37136, 71341, 71350, - 71360, 71369, 37146, 71374, 71381, 71390, 71396, 71404, 71411, 71418, - 6729, 4978, 71423, 37068, 71429, 71432, 71438, 71445, 71450, 71455, - 26982, 71459, 71465, 71471, 71476, 71481, 71485, 71491, 71497, 38451, - 71502, 41446, 43251, 43257, 37177, 37182, 71506, 71510, 71514, 71517, - 71530, 71536, 71540, 71543, 71548, 38820, 71552, 35815, 24408, 71558, - 6658, 6666, 10069, 71561, 71566, 71571, 71576, 71581, 71586, 71591, - 71596, 71601, 71606, 71612, 71617, 71622, 71628, 71633, 71638, 71643, - 71648, 71653, 71658, 71664, 71669, 71675, 71680, 71685, 71690, 71695, - 71700, 71705, 71710, 71715, 71720, 71725, 71731, 71736, 71741, 71746, - 71751, 71756, 71761, 71767, 71772, 71777, 71782, 71787, 71792, 71797, - 71802, 71807, 71812, 71818, 71823, 71828, 71833, 71838, 71844, 71850, - 71855, 71861, 71866, 71871, 71876, 71881, 71886, 1453, 156, 71891, 71895, - 71899, 71903, 28871, 71907, 71911, 71916, 71920, 71925, 71929, 71934, - 71939, 71944, 71948, 71952, 71957, 71961, 15488, 71966, 71970, 71977, - 71987, 17688, 71996, 72005, 72009, 72014, 72019, 72023, 72027, 28659, - 3183, 72031, 72037, 20325, 72041, 72050, 72058, 72064, 72069, 72081, - 72093, 72098, 72102, 72107, 72111, 72117, 72123, 72128, 72138, 72148, - 72154, 72162, 72167, 72171, 72177, 72182, 72189, 72195, 72200, 72209, - 72218, 72222, 18204, 72225, 72234, 72242, 72254, 72265, 72276, 72285, - 72289, 72298, 72306, 72316, 72324, 72331, 72341, 72347, 72352, 72359, - 72368, 72374, 72379, 72386, 72392, 72403, 60, 35588, 72409, 30253, 30263, - 72415, 72423, 72430, 72436, 72440, 72450, 72461, 72469, 72478, 72483, - 72488, 72493, 72497, 72501, 20272, 72509, 72513, 72519, 72529, 72536, - 72542, 72548, 40356, 72552, 72554, 72557, 72563, 72567, 72578, 72588, - 72594, 72601, 72608, 15425, 72616, 72622, 72631, 72640, 72646, 11169, - 72652, 72658, 72663, 72668, 72675, 72680, 72687, 72693, 72698, 72706, - 72719, 72728, 72737, 69462, 69472, 72747, 72753, 72762, 72768, 72774, - 72781, 72788, 72795, 72802, 72809, 72814, 72818, 72822, 72825, 72835, - 72839, 72851, 9733, 72860, 72871, 72876, 72880, 69481, 72886, 72893, - 72902, 72910, 72918, 72923, 72927, 72932, 72937, 72947, 72955, 72967, - 72972, 72976, 72980, 72986, 72994, 73001, 73013, 73021, 73032, 73039, - 73045, 73055, 73061, 73065, 73074, 73083, 73090, 73096, 73101, 73105, - 73109, 73113, 73122, 73131, 73140, 73146, 73152, 73158, 73163, 73170, - 73176, 73184, 73191, 73197, 14520, 73202, 73208, 73212, 16579, 73216, - 73221, 73231, 73236, 73245, 73251, 73257, 73265, 73272, 73276, 73280, - 73287, 73293, 73301, 73308, 73314, 73325, 73329, 73333, 73337, 73340, - 73346, 73351, 73356, 73360, 73364, 73373, 73381, 73388, 73394, 73401, - 27708, 46480, 73406, 73414, 73418, 73422, 73425, 73433, 73440, 73446, - 73455, 73463, 73469, 73474, 73478, 73483, 73488, 73492, 73496, 73500, - 73505, 73514, 73518, 73525, 43360, 73529, 73535, 73543, 73547, 73553, - 73561, 73567, 73572, 73583, 73591, 73597, 73606, 26117, 73614, 73621, - 73628, 73635, 73642, 73649, 49969, 15240, 73656, 73663, 73668, 40392, - 4603, 73674, 73679, 73684, 73690, 73696, 73702, 73707, 73712, 73717, - 73722, 73728, 73733, 73739, 73744, 73750, 73755, 73760, 73765, 73770, - 73775, 73780, 73785, 73791, 73796, 73802, 73807, 73812, 73817, 73822, - 73827, 73832, 73838, 73843, 73848, 73853, 73858, 73863, 73868, 73873, - 73878, 73883, 73888, 73894, 73899, 73904, 73909, 73914, 73919, 73924, - 73929, 73934, 73940, 73945, 73950, 73955, 73960, 73965, 73970, 73975, - 73980, 73985, 73990, 73995, 74000, 74006, 1830, 282, 74011, 44259, 74015, - 74018, 74023, 74027, 74030, 3554, 74035, 74040, 74044, 74053, 74064, - 74081, 74099, 74107, 72914, 74114, 74117, 74127, 74134, 74143, 74159, - 74168, 74178, 74183, 74196, 74206, 74215, 74223, 74237, 74245, 74254, - 74258, 74261, 74268, 74274, 74285, 74292, 74304, 74315, 74326, 74335, - 74342, 1213, 772, 74352, 2668, 74356, 74361, 74370, 1013, 8806, 23861, - 74378, 74386, 74400, 74413, 74417, 74422, 74427, 74432, 74438, 74444, - 74449, 9356, 17731, 74454, 74458, 74466, 9793, 74471, 74477, 74486, - 74494, 1683, 12849, 1023, 4286, 74498, 74502, 74511, 74521, 2419, 31065, - 74530, 74536, 19731, 31080, 74542, 4451, 13231, 74548, 74555, 69179, - 74559, 74563, 74569, 74574, 74579, 3773, 160, 3799, 74584, 74596, 74600, - 74604, 74610, 74615, 31914, 74619, 13219, 2862, 4, 74624, 74634, 74645, - 74656, 74666, 74672, 74683, 74690, 74696, 74702, 74710, 74717, 74723, - 74733, 74743, 74753, 74762, 27065, 1225, 74767, 74771, 74775, 74781, - 74785, 2885, 2891, 9353, 2274, 74789, 74793, 74802, 74810, 74821, 74829, - 74837, 74843, 74848, 74859, 74870, 74878, 74884, 74889, 10978, 74899, - 74907, 74911, 74915, 74920, 74924, 74936, 32363, 17633, 74943, 74953, - 74959, 74965, 7739, 11080, 74975, 74986, 74997, 75007, 75016, 75020, - 75027, 1015, 1095, 75037, 75042, 75050, 68905, 75058, 75063, 75074, - 75081, 75095, 16388, 504, 75105, 75112, 75116, 75120, 75128, 75137, - 75145, 19776, 75151, 75165, 75172, 75178, 75186, 75195, 75202, 75212, - 75220, 75227, 75235, 75242, 4250, 116, 75250, 75261, 75265, 75277, 75283, - 13427, 204, 75288, 10401, 75293, 2930, 75297, 75304, 75310, 75321, 75331, - 75339, 75346, 9744, 75353, 75362, 75370, 4331, 75383, 4348, 75387, 75392, - 75398, 75403, 75408, 75413, 2935, 540, 75419, 75432, 75436, 75441, 2940, - 1829, 892, 75445, 4352, 75453, 75459, 75463, 783, 75473, 75482, 75487, - 3790, 75491, 17382, 17389, 53331, 75495, 4383, 4260, 15118, 75503, 75510, - 75515, 27129, 75519, 75526, 75532, 75537, 75542, 17402, 192, 75547, - 75559, 75565, 75573, 2952, 1720, 75581, 75583, 75588, 75593, 75598, - 75604, 75609, 75614, 75619, 75624, 75629, 75634, 75640, 75645, 75650, - 75655, 75660, 75665, 75670, 75675, 75680, 75686, 75691, 75696, 75701, - 75707, 75712, 75718, 75723, 75728, 75733, 75738, 75743, 75748, 75753, - 75759, 75764, 75770, 75775, 75780, 75785, 75790, 75795, 75800, 75805, - 75810, 9425, 9438, 4399, 4404, 4409, 4414, 26, 75816, 75822, 75827, - 75832, 75837, 75843, 75848, 75852, 75856, 75861, 75867, 75871, 75877, - 75882, 75887, 75893, 75898, 75902, 75907, 75912, 75916, 75919, 75921, - 75925, 75928, 75935, 75940, 75944, 75949, 75953, 75957, 75961, 75970, - 75974, 37410, 75977, 37415, 75984, 75989, 37420, 75998, 76007, 37426, - 76012, 37431, 76021, 76026, 13470, 76030, 76035, 76040, 37436, 76044, - 76053, 48174, 76057, 76060, 76064, 9024, 76070, 76073, 76078, 76083, - 76087, 4072, 37441, 76090, 76094, 76097, 76108, 76113, 76117, 76123, - 76131, 76144, 76148, 76156, 76165, 76171, 76176, 76182, 76186, 76192, - 76198, 76206, 76211, 76215, 76222, 76228, 76236, 76245, 76253, 37444, - 76260, 76270, 76279, 76287, 76298, 76311, 76316, 76321, 76325, 76334, - 76340, 76347, 76360, 76372, 76383, 76395, 76402, 76411, 76420, 76429, - 76436, 76442, 76449, 76457, 76464, 76472, 76481, 76489, 76496, 76504, - 76513, 76521, 76530, 76540, 76549, 76557, 76564, 76572, 76581, 76589, - 76598, 76608, 76617, 76625, 76634, 76644, 76653, 76663, 76674, 76684, - 76693, 76701, 76708, 76716, 76725, 76733, 76742, 76752, 76761, 76769, - 76778, 76788, 76797, 76807, 76818, 76828, 76837, 76845, 76854, 76864, - 76873, 76883, 76894, 76904, 76913, 76923, 76934, 76944, 76955, 76967, - 76978, 76988, 76997, 77005, 77012, 77020, 77029, 77037, 77046, 77056, - 77065, 77073, 77082, 77092, 77101, 77111, 77122, 77132, 77141, 77149, - 77158, 77168, 77177, 77187, 77198, 77208, 77217, 77227, 77238, 77248, - 77259, 77271, 77282, 77292, 77301, 77309, 77318, 77328, 77337, 77347, - 77358, 77368, 77377, 77387, 77398, 77408, 77419, 77431, 77442, 77452, - 77461, 77471, 77482, 77492, 77503, 77515, 77526, 77536, 77547, 77559, - 77570, 77582, 77595, 77607, 77618, 77628, 77637, 77645, 77652, 77660, - 77669, 77677, 77686, 77696, 77705, 77713, 77722, 77732, 77741, 77751, - 77762, 77772, 77781, 77789, 77798, 77808, 77817, 77827, 77838, 77848, - 77857, 77867, 77878, 77888, 77899, 77911, 77922, 77932, 77941, 77949, - 77958, 77968, 77977, 77987, 77998, 78008, 78017, 78027, 78038, 78048, - 78059, 78071, 78082, 78092, 78101, 78111, 78122, 78132, 78143, 78155, - 78166, 78176, 78187, 78199, 78210, 78222, 78235, 78247, 78258, 78268, - 78277, 78285, 78294, 78304, 78313, 78323, 78334, 78344, 78353, 78363, - 78374, 78384, 78395, 78407, 78418, 78428, 78437, 78447, 78458, 78468, - 78479, 78491, 78502, 78512, 78523, 78535, 78546, 78558, 78571, 78583, - 78594, 78604, 78613, 78623, 78634, 78644, 78655, 78667, 78678, 78688, - 78699, 78711, 78722, 78734, 78747, 78759, 78770, 78780, 78791, 78803, - 78814, 78826, 78839, 78851, 78862, 78874, 78887, 78899, 78912, 78926, - 78939, 78951, 78962, 78972, 78981, 78989, 78996, 79001, 79005, 8837, - 79012, 79017, 37454, 79023, 79028, 37459, 79034, 23983, 29818, 79039, - 79045, 79053, 79059, 79065, 79072, 79079, 79084, 79089, 79093, 79098, - 79102, 79105, 79109, 79118, 79127, 79135, 79141, 79153, 79164, 79168, - 3245, 8812, 79173, 79176, 79179, 79181, 79185, 79189, 79193, 79199, - 79204, 29881, 79209, 79213, 79216, 79221, 79225, 79232, 79238, 79242, - 6822, 79246, 79251, 37481, 79255, 79262, 79271, 79279, 79285, 79296, - 79304, 79313, 79321, 79328, 79335, 79341, 79352, 37486, 79357, 79368, - 79380, 79388, 79399, 79408, 79416, 79427, 79432, 79440, 2630, 79445, - 39762, 79458, 79462, 79474, 79482, 79487, 79495, 79506, 20490, 79515, - 79521, 79528, 79536, 79542, 37496, 79547, 4377, 66345, 79554, 79557, - 79565, 79578, 79591, 79604, 79617, 79624, 79635, 79644, 79649, 49786, - 49791, 79653, 79657, 79665, 79672, 79681, 79689, 79695, 79704, 79712, - 79719, 79727, 79731, 79740, 79749, 79759, 79772, 79785, 79795, 37501, - 79801, 79808, 79814, 79820, 37507, 79825, 79828, 79832, 79840, 79849, - 49569, 79857, 79866, 79874, 79881, 79889, 79899, 79908, 79917, 38949, - 79926, 79937, 79952, 79962, 10434, 24737, 79971, 79976, 79981, 79985, - 18862, 79990, 79995, 80001, 80006, 80011, 80017, 80022, 80027, 24697, - 80032, 80039, 80047, 80055, 80063, 80068, 80075, 80082, 80087, 1738, - 80091, 80095, 80103, 80111, 37524, 80117, 80123, 80135, 80141, 80148, - 80152, 80159, 80164, 80171, 80177, 80184, 80195, 80205, 80215, 80227, - 80233, 80241, 80247, 80257, 80267, 37551, 80276, 80285, 80291, 80303, - 80314, 80321, 80326, 80330, 80338, 80344, 80349, 80354, 80361, 80369, - 80381, 80391, 80400, 80409, 80417, 80424, 39595, 27496, 80430, 80435, - 80439, 80443, 80448, 80456, 80462, 80473, 80486, 80491, 80498, 37556, - 80503, 80515, 80524, 80532, 80542, 80553, 80566, 80573, 80582, 80591, - 80599, 80604, 80610, 80614, 1442, 80619, 80624, 80629, 80634, 80640, - 80645, 80650, 80656, 80662, 80667, 80671, 80676, 80681, 80686, 66912, - 80691, 80696, 80701, 80706, 80712, 80718, 80723, 80727, 80732, 18861, - 80737, 80743, 80748, 80754, 80759, 80764, 80769, 80774, 80778, 80784, - 80789, 80798, 80803, 80808, 80813, 80818, 80822, 80829, 80835, 4707, - 20088, 3210, 80840, 80844, 80849, 80853, 80857, 80861, 53586, 80865, - 80790, 80867, 80877, 37565, 80880, 80885, 80894, 80900, 6791, 37570, - 80904, 80910, 80915, 80921, 80926, 80930, 80937, 80942, 80952, 80961, - 80965, 80971, 80977, 80983, 80987, 80995, 81002, 81010, 81018, 37575, - 81025, 81028, 81039, 81046, 81052, 81057, 81061, 81067, 81075, 81082, - 81087, 81091, 81100, 81108, 81114, 81119, 37580, 81126, 26955, 81138, - 81144, 81149, 81155, 81162, 81168, 24430, 31538, 81174, 81179, 81185, - 81189, 81201, 80823, 80830, 24629, 81211, 81216, 81223, 81229, 81236, - 81242, 81253, 81258, 81266, 10139, 81271, 81274, 81280, 81284, 81288, - 81291, 81297, 81303, 37297, 4708, 1457, 15537, 81310, 81316, 81322, - 81328, 81334, 81340, 81346, 81352, 81358, 81363, 81368, 81373, 81378, - 81383, 81388, 81393, 81398, 81403, 81408, 81413, 81418, 81423, 81429, - 81434, 81439, 81445, 81450, 81455, 81461, 81467, 81473, 81479, 81485, - 81491, 81497, 81503, 81509, 81514, 81519, 81525, 81530, 81535, 81541, - 81546, 81551, 81556, 81561, 81566, 81571, 81576, 81581, 81586, 81591, - 81596, 81601, 81607, 81612, 81617, 81622, 81628, 81633, 81638, 81643, - 81648, 81654, 81659, 81664, 81669, 81674, 81679, 81684, 81689, 81694, - 81699, 81704, 81709, 81714, 81719, 81724, 81729, 81734, 81739, 81744, - 81749, 81755, 81760, 81765, 81770, 81775, 81780, 81785, 81790, 979, 169, - 81795, 81799, 81803, 81808, 81816, 81820, 81827, 81835, 81839, 81852, - 81860, 81865, 81870, 30316, 81874, 81879, 81883, 81888, 81892, 81900, - 81904, 23991, 81909, 81913, 69719, 81917, 81920, 81928, 81936, 81944, - 81949, 81954, 81961, 81968, 81974, 81980, 81985, 81992, 81997, 82005, - 74405, 82012, 82017, 69491, 82024, 82029, 82033, 82040, 82046, 82053, - 69518, 13542, 82061, 82066, 82071, 82075, 82078, 82089, 82098, 82104, - 82109, 82113, 82123, 82132, 47965, 82136, 82140, 82147, 82160, 82166, - 82174, 82183, 82194, 82205, 82216, 82227, 82236, 82242, 82251, 82259, - 82269, 82282, 82290, 82297, 82308, 82314, 82319, 82324, 82330, 82340, - 82346, 82356, 82364, 82371, 82381, 82390, 80505, 82398, 82404, 82412, - 82418, 72959, 82425, 82430, 82433, 82437, 82443, 82447, 82450, 82458, - 82464, 82470, 82478, 82490, 82502, 82509, 82514, 82518, 82529, 82537, - 82544, 82556, 82564, 82571, 82579, 82586, 82592, 82597, 82607, 82616, - 82624, 82629, 82639, 82648, 48830, 82655, 82659, 82664, 82672, 82679, - 82685, 82689, 82699, 82710, 82718, 82725, 82737, 82749, 82758, 79448, - 82765, 82775, 82787, 82798, 82812, 82820, 82830, 82837, 82845, 82858, - 82870, 82879, 82887, 82897, 82908, 82920, 82929, 82939, 82949, 82958, - 82965, 82974, 82989, 82997, 83007, 83016, 83024, 83037, 66315, 83052, - 83062, 83071, 83083, 83093, 83105, 83116, 83130, 83144, 83158, 83172, - 83186, 83200, 83214, 83228, 83242, 83256, 83270, 83284, 83298, 83312, - 83326, 83340, 83354, 83368, 83382, 83396, 83410, 83424, 83438, 83452, - 83466, 83480, 83494, 83508, 83522, 83536, 83550, 83564, 83578, 83592, - 83606, 83620, 83634, 83648, 83662, 83676, 83690, 83704, 83718, 83732, - 83746, 83760, 83774, 83788, 83802, 83816, 83830, 83844, 83858, 83872, - 83886, 83900, 83914, 83928, 83942, 83956, 83970, 83984, 83998, 84012, - 84026, 84040, 84054, 84068, 84082, 84096, 84110, 84124, 84138, 84152, - 84166, 84180, 84194, 84208, 84222, 84236, 84250, 84264, 84278, 84292, - 84306, 84320, 84334, 84348, 84362, 84376, 84390, 84404, 84418, 84432, - 84446, 84460, 84474, 84488, 84502, 84516, 84530, 84544, 84558, 84572, - 84586, 84600, 84614, 84628, 84642, 84656, 84670, 84684, 84698, 84712, - 84726, 84740, 84754, 84768, 84782, 84796, 84810, 84824, 84838, 84852, - 84866, 84880, 84894, 84908, 84922, 84936, 84950, 84964, 84978, 84992, - 85006, 85020, 85034, 85048, 85062, 85076, 85090, 85104, 85118, 85132, - 85146, 85160, 85174, 85188, 85202, 85216, 85230, 85244, 85258, 85272, - 85286, 85300, 85314, 85328, 85342, 85356, 85370, 85384, 85398, 85412, - 85426, 85440, 85454, 85468, 85482, 85496, 85510, 85524, 85538, 85552, - 85566, 85580, 85594, 85608, 85622, 85636, 85650, 85664, 85678, 85692, - 85706, 85720, 85734, 85748, 85762, 85776, 85790, 85804, 85818, 85832, - 85846, 85860, 85874, 85888, 85902, 85916, 85930, 85944, 85958, 85972, - 85986, 86000, 86014, 86028, 86042, 86056, 86070, 86084, 86098, 86112, - 86126, 86140, 86154, 86168, 86182, 86196, 86210, 86224, 86238, 86252, - 86266, 86280, 86294, 86308, 86322, 86336, 86350, 86364, 86378, 86392, - 86406, 86420, 86434, 86448, 86462, 86476, 86490, 86504, 86518, 86532, - 86546, 86560, 86574, 86588, 86602, 86616, 86630, 86644, 86658, 86672, - 86686, 86700, 86714, 86728, 86742, 86756, 86770, 86784, 86798, 86812, - 86826, 86840, 86854, 86868, 86882, 86896, 86910, 86924, 86938, 86952, - 86966, 86980, 86994, 87008, 87022, 87036, 87050, 87064, 87078, 87092, - 87106, 87120, 87134, 87148, 87162, 87176, 87190, 87204, 87218, 87232, - 87246, 87260, 87274, 87288, 87302, 87316, 87330, 87344, 87358, 87372, - 87386, 87400, 87414, 87428, 87442, 87456, 87470, 87484, 87498, 87512, - 87526, 87540, 87554, 87568, 87582, 87596, 87610, 87624, 87638, 87652, - 87666, 87680, 87694, 87708, 87722, 87736, 87750, 87764, 87778, 87792, - 87806, 87820, 87834, 87848, 87862, 87876, 87890, 87904, 87918, 87932, - 87946, 87960, 87974, 87988, 88002, 88016, 88030, 88044, 88058, 88072, - 88086, 88100, 88114, 88128, 88142, 88156, 88170, 88184, 88198, 88212, - 88226, 88240, 88254, 88268, 88282, 88296, 88310, 88324, 88338, 88352, - 88366, 88380, 88394, 88408, 88422, 88436, 88450, 88464, 88478, 88492, - 88506, 88520, 88534, 88548, 88562, 88576, 88590, 88604, 88618, 88632, - 88646, 88660, 88674, 88688, 88702, 88716, 88730, 88744, 88758, 88772, - 88786, 88800, 88814, 88828, 88842, 88856, 88870, 88884, 88898, 88912, - 88926, 88940, 88954, 88968, 88982, 88996, 89010, 89024, 89038, 89052, - 89066, 89080, 89094, 89108, 89122, 89136, 89150, 89164, 89178, 89192, - 89206, 89220, 89234, 89248, 89262, 89276, 89290, 89304, 89318, 89332, - 89346, 89360, 89374, 89388, 89402, 89416, 89430, 89444, 89458, 89472, - 89486, 89500, 89514, 89528, 89542, 89556, 89570, 89584, 89598, 89612, - 89626, 89640, 89654, 89668, 89682, 89696, 89710, 89724, 89738, 89752, - 89766, 89780, 89794, 89808, 89822, 89836, 89850, 89864, 89878, 89892, - 89906, 89920, 89934, 89948, 89962, 89976, 89990, 90004, 90018, 90032, - 90046, 90060, 90074, 90088, 90102, 90116, 90130, 90144, 90158, 90172, - 90186, 90200, 90214, 90228, 90242, 90256, 90270, 90284, 90298, 90312, - 90326, 90340, 90354, 90368, 90382, 90396, 90410, 90424, 90438, 90452, - 90466, 90480, 90494, 90508, 90522, 90536, 90550, 90564, 90578, 90592, - 90606, 90620, 90634, 90648, 90662, 90676, 90690, 90704, 90718, 90732, - 90746, 90760, 90774, 90788, 90802, 90816, 90830, 90844, 90858, 90872, - 90886, 90900, 90914, 90928, 90942, 90956, 90970, 90984, 90998, 91012, - 91026, 91040, 91054, 91068, 91082, 91096, 91110, 91124, 91138, 91152, - 91166, 91180, 91194, 91208, 91222, 91236, 91250, 91264, 91278, 91292, - 91306, 91320, 91334, 91348, 91362, 91376, 91390, 91404, 91418, 91432, - 91446, 91460, 91474, 91488, 91502, 91516, 91530, 91544, 91558, 91572, - 91586, 91600, 91614, 91628, 91642, 91656, 91670, 91684, 91698, 91712, - 91726, 91740, 91754, 91768, 91782, 91796, 91810, 91824, 91838, 91852, - 91866, 91880, 91894, 91908, 91922, 91936, 91950, 91964, 91978, 91992, - 92006, 92020, 92034, 92048, 92062, 92076, 92090, 92104, 92118, 92132, - 92146, 92160, 92174, 92188, 92202, 92216, 92230, 92244, 92258, 92272, - 92286, 92300, 92314, 92328, 92342, 92356, 92370, 92384, 92398, 92412, - 92426, 92440, 92454, 92468, 92482, 92496, 92510, 92524, 92538, 92552, - 92566, 92580, 92594, 92608, 92622, 92636, 92650, 92664, 92678, 92692, - 92706, 92720, 92734, 92748, 92762, 92776, 92790, 92804, 92818, 92832, - 92846, 92860, 92874, 92888, 92902, 92916, 92930, 92944, 92958, 92972, - 92986, 93000, 93014, 93028, 93042, 93056, 93070, 93084, 93098, 93112, - 93126, 93140, 93154, 93168, 93182, 93196, 93210, 93224, 93238, 93252, - 93266, 93280, 93294, 93308, 93322, 93336, 93350, 93364, 93378, 93392, - 93406, 93420, 93434, 93448, 93462, 93476, 93490, 93504, 93518, 93532, - 93546, 93560, 93574, 93588, 93602, 93616, 93630, 93644, 93658, 93672, - 93686, 93695, 93706, 93717, 93727, 93738, 93746, 93754, 93760, 93770, - 93778, 93784, 33472, 93789, 93795, 93804, 93816, 93821, 93828, 10992, - 20510, 93834, 93843, 93848, 93852, 93859, 93865, 93870, 93875, 93883, - 93891, 93896, 93904, 13996, 93908, 93911, 93913, 93928, 93941, 93948, - 93954, 93965, 93970, 93974, 93979, 93986, 93992, 93997, 94005, 74999, - 75009, 94011, 94018, 94028, 12212, 94035, 94040, 33710, 94049, 94054, - 94061, 94071, 94079, 94087, 94096, 94105, 94111, 94117, 94124, 94131, - 94136, 94140, 94148, 69535, 94153, 94162, 94170, 94177, 94182, 94186, - 94195, 94201, 94204, 94208, 94217, 94227, 81847, 94236, 94240, 94248, - 94252, 94258, 94269, 94279, 20519, 94290, 94299, 94307, 94315, 94322, - 69554, 9590, 94330, 94334, 94343, 94350, 94353, 31419, 94356, 94360, - 94365, 94382, 94394, 12170, 94406, 94411, 94416, 94421, 24081, 94425, - 94430, 94435, 94441, 94446, 6436, 94451, 24085, 94456, 94461, 94467, - 94474, 94479, 94484, 94490, 94496, 94502, 94507, 94513, 94517, 94531, - 94539, 94547, 94553, 94558, 94565, 94575, 94584, 94589, 94594, 94599, - 94607, 94618, 94623, 94629, 94634, 94643, 68029, 4637, 94648, 94666, - 94685, 94698, 94712, 94728, 94735, 94742, 94751, 94758, 94764, 94771, - 94776, 94782, 94788, 94796, 94802, 94807, 94812, 94828, 12183, 94842, - 94849, 94857, 94863, 94867, 94870, 94875, 94880, 94887, 94892, 94901, - 94907, 94912, 94918, 94924, 94933, 94942, 41290, 94947, 94955, 94964, - 13611, 94973, 94979, 94987, 94993, 94999, 95005, 95010, 95017, 95023, - 13622, 95028, 95031, 95036, 37607, 95046, 95055, 95060, 95066, 95071, - 95079, 95086, 95097, 95113, 95129, 95145, 95161, 95177, 95193, 95209, - 95225, 95241, 95257, 95273, 95289, 95305, 95321, 95337, 95353, 95369, - 95385, 95401, 95417, 95433, 95449, 95465, 95481, 95497, 95513, 95529, - 95545, 95561, 95577, 95593, 95609, 95625, 95641, 95657, 95673, 95689, - 95705, 95721, 95737, 95753, 95769, 95785, 95801, 95817, 95833, 95849, - 95865, 95881, 95897, 95913, 95929, 95945, 95961, 95977, 95993, 96009, - 96025, 96041, 96057, 96073, 96089, 96105, 96121, 96137, 96153, 96169, - 96185, 96201, 96217, 96233, 96249, 96265, 96281, 96297, 96313, 96329, - 96345, 96361, 96377, 96393, 96409, 96425, 96441, 96457, 96473, 96489, - 96505, 96521, 96537, 96553, 96569, 96585, 96601, 96617, 96633, 96649, - 96665, 96681, 96697, 96713, 96729, 96745, 96761, 96777, 96793, 96809, - 96825, 96841, 96857, 96873, 96889, 96905, 96921, 96937, 96953, 96969, - 96985, 97001, 97017, 97033, 97049, 97065, 97081, 97097, 97113, 97129, - 97145, 97161, 97177, 97193, 97209, 97225, 97241, 97257, 97273, 97289, - 97305, 97321, 97337, 97353, 97369, 97385, 97401, 97417, 97433, 97449, - 97465, 97481, 97497, 97513, 97529, 97545, 97561, 97577, 97593, 97609, - 97625, 97641, 97657, 97673, 97689, 97705, 97721, 97737, 97753, 97769, - 97785, 97801, 97817, 97833, 97849, 97865, 97881, 97897, 97913, 97929, - 97945, 97961, 97977, 97993, 98009, 98025, 98041, 98057, 98073, 98089, - 98105, 98121, 98137, 98153, 98169, 98185, 98201, 98217, 98233, 98249, - 98265, 98281, 98297, 98313, 98329, 98345, 98361, 98377, 98393, 98409, - 98425, 98441, 98457, 98473, 98489, 98505, 98521, 98537, 98553, 98569, - 98585, 98601, 98617, 98633, 98649, 98665, 98681, 98697, 98713, 98729, - 98745, 98761, 98777, 98793, 98809, 98825, 98841, 98857, 98873, 98889, - 98905, 98921, 98937, 98953, 98969, 98985, 99001, 99017, 99033, 99049, - 99065, 99081, 99097, 99113, 99129, 99145, 99161, 99177, 99193, 99209, - 99225, 99241, 99257, 99273, 99289, 99305, 99321, 99337, 99353, 99369, - 99385, 99401, 99417, 99433, 99449, 99465, 99481, 99497, 99513, 99529, - 99545, 99561, 99577, 99593, 99609, 99625, 99641, 99657, 99673, 99689, - 99705, 99721, 99737, 99753, 99769, 99785, 99801, 99817, 99833, 99849, - 99865, 99881, 99897, 99913, 99929, 99945, 99961, 99977, 99993, 100009, - 100025, 100041, 100057, 100073, 100089, 100105, 100121, 100137, 100153, - 100169, 100185, 100201, 100217, 100233, 100249, 100265, 100281, 100297, - 100313, 100329, 100345, 100361, 100377, 100393, 100409, 100425, 100441, - 100457, 100473, 100489, 100505, 100521, 100537, 100553, 100569, 100585, - 100601, 100617, 100633, 100649, 100665, 100681, 100697, 100713, 100729, - 100745, 100761, 100777, 100793, 100809, 100825, 100841, 100857, 100873, - 100889, 100905, 100921, 100937, 100953, 100969, 100985, 101001, 101017, - 101033, 101049, 101065, 101081, 101097, 101113, 101129, 101145, 101161, - 101177, 101193, 101209, 101225, 101241, 101257, 101273, 101289, 101305, - 101321, 101337, 101353, 101369, 101385, 101401, 101417, 101433, 101443, - 101448, 101456, 74328, 101461, 101467, 101472, 101479, 101488, 101496, - 101500, 4231, 101506, 101513, 101519, 101523, 19842, 44355, 3219, 101528, - 101532, 101536, 101543, 101549, 101558, 101564, 101571, 101575, 101596, - 101618, 101634, 101651, 101670, 101679, 101689, 101697, 101704, 101711, - 101717, 31280, 101731, 101735, 101741, 101749, 101761, 101767, 101775, - 101782, 101787, 101792, 101796, 101804, 101811, 101815, 101821, 101827, - 101832, 3879, 49986, 101838, 101842, 101846, 101850, 101855, 101860, - 101865, 101871, 101877, 101883, 101890, 101896, 101903, 101909, 101915, - 101920, 101926, 101931, 101935, 101940, 101944, 101949, 50001, 101953, - 101958, 101966, 101970, 101975, 101982, 101991, 101997, 102006, 102010, - 102017, 102021, 102024, 102031, 102037, 102046, 102056, 102066, 102071, - 102075, 102082, 102090, 102099, 102103, 102111, 102117, 102122, 102127, - 102133, 102139, 102144, 102148, 102154, 102159, 102163, 102167, 102170, - 102175, 102183, 102193, 102199, 102204, 102214, 47161, 102222, 102234, - 102240, 102247, 102253, 102257, 102262, 102268, 102280, 102291, 102298, - 102304, 102311, 102318, 102330, 102337, 102343, 24165, 102347, 102355, - 102361, 102368, 102374, 102380, 102386, 102391, 102396, 102401, 102405, - 102414, 102422, 102433, 7696, 102438, 19278, 102444, 102448, 102452, - 102456, 102464, 102473, 102477, 102484, 102493, 102501, 102514, 102520, - 101945, 34610, 102525, 102527, 102532, 102537, 102542, 102547, 102552, - 102557, 102562, 102567, 102572, 102577, 102582, 102587, 102592, 102597, - 102603, 102608, 102613, 102618, 102623, 102628, 102633, 102638, 102643, - 102649, 102655, 102661, 102666, 102671, 102683, 102688, 1872, 54, 102693, - 102698, 37617, 102702, 37622, 37627, 37633, 37638, 102706, 37643, 25306, - 102728, 102732, 102736, 102741, 102745, 37647, 102749, 102757, 102764, - 102770, 102780, 37652, 102787, 102790, 102795, 102799, 102808, 10802, - 102816, 37657, 25150, 102819, 102823, 102831, 1347, 102836, 37668, - 102839, 102844, 29608, 29618, 40892, 102849, 102854, 102859, 102864, - 102870, 102875, 102884, 102889, 102898, 102906, 102913, 102919, 102924, - 102929, 102934, 102944, 102953, 102961, 102966, 102974, 102978, 102986, - 102990, 102997, 103005, 37472, 44090, 103012, 103018, 103023, 103028, - 14031, 32595, 103033, 103038, 103043, 103049, 103056, 103062, 103071, - 103076, 103084, 103094, 103101, 103111, 103117, 103122, 103128, 103132, - 20541, 103139, 41844, 103152, 103157, 103163, 103178, 35667, 72741, - 103191, 103195, 103204, 103213, 103220, 103226, 103234, 103240, 103249, - 103256, 44210, 103262, 103265, 103269, 103273, 103277, 11546, 103283, - 103290, 103296, 103304, 103309, 103313, 27656, 103319, 103322, 103330, - 103337, 103345, 103358, 103372, 103379, 103385, 103392, 103398, 37682, - 103402, 103409, 103417, 103425, 103431, 37687, 103439, 103445, 103450, - 103460, 103466, 103475, 35462, 40263, 103483, 103488, 103493, 103497, - 103502, 103506, 103514, 103519, 17374, 18148, 103523, 103528, 37692, - 17527, 103532, 103537, 103541, 103548, 103557, 103561, 103569, 103575, - 103580, 103586, 8879, 103591, 103597, 103602, 103607, 103618, 103627, - 103639, 103654, 37980, 103660, 19397, 37696, 103664, 103671, 103677, - 103681, 27780, 103688, 103695, 46451, 103704, 103710, 103719, 103725, - 103730, 103738, 103744, 103749, 37706, 103754, 103763, 103772, 102286, - 103781, 103788, 103794, 103800, 103809, 103819, 103825, 103833, 103840, - 103844, 37711, 103847, 37717, 1386, 103852, 103860, 103868, 103878, - 103887, 103895, 103902, 103912, 37728, 103916, 103918, 103922, 103927, - 103931, 103935, 103941, 103946, 103950, 103961, 103966, 103975, 103980, - 3224, 103984, 103991, 103995, 104004, 104012, 104020, 104027, 104032, - 104037, 71293, 104041, 104044, 104050, 104058, 104064, 104068, 104073, - 104080, 104085, 104090, 104094, 104101, 104107, 104112, 40294, 104116, - 104119, 104124, 104128, 104133, 104140, 104145, 104149, 45518, 104157, - 29627, 29636, 104163, 104169, 104175, 104180, 104184, 104187, 104197, - 104206, 104211, 104217, 104224, 104230, 104234, 104242, 104247, 40300, - 82100, 104251, 104259, 104265, 104272, 104277, 104284, 104289, 104293, - 104298, 66531, 104304, 104310, 10078, 104315, 104320, 104324, 104329, - 104334, 104339, 104343, 104348, 104353, 104359, 104364, 104369, 104375, - 104381, 104386, 104390, 104395, 104400, 104405, 104409, 27779, 104414, - 104419, 104425, 104431, 104437, 104442, 104446, 104451, 104456, 104461, - 104465, 104470, 104475, 104480, 104485, 50256, 104489, 37736, 104497, - 104501, 104509, 104517, 104528, 104533, 104537, 25779, 79551, 104542, - 104548, 104553, 4542, 104563, 104570, 104575, 104583, 104592, 104597, - 104601, 104606, 104610, 104618, 104626, 104633, 74590, 104639, 104647, - 104654, 104665, 104671, 104677, 37746, 104680, 104687, 104695, 104700, - 104704, 31770, 69123, 104710, 104715, 104722, 104727, 9970, 104731, - 104739, 104746, 104753, 104762, 104769, 104775, 104789, 104797, 6517, - 104559, 104803, 104808, 104814, 104818, 104821, 104829, 104836, 104841, - 104854, 104861, 104867, 104871, 104879, 104884, 104891, 104897, 104902, - 69394, 104907, 104910, 104919, 104926, 104932, 104936, 104939, 104947, - 104953, 104962, 104972, 104982, 104991, 105002, 105010, 105021, 105026, - 105030, 105035, 105039, 41023, 105047, 24493, 41032, 105052, 97700, - 97716, 97732, 97748, 97764, 105057, 97796, 97812, 97828, 97844, 97956, - 97972, 105061, 98004, 98020, 105065, 105069, 105073, 105077, 98260, - 98292, 105081, 98324, 105085, 105089, 98468, 98484, 98500, 98516, 105093, - 98580, 98596, 105097, 98724, 98740, 98756, 98772, 98788, 98804, 98820, - 98836, 98852, 98868, 98980, 98996, 99012, 99028, 99044, 99060, 99076, - 99092, 99108, 99124, 105101, 100916, 101028, 101092, 101108, 101124, - 101140, 101156, 101172, 101284, 101300, 101316, 105105, 101364, 105109, - 101396, 101412, 101428, 105113, 105118, 105123, 105128, 105133, 105138, - 105143, 105147, 105151, 105156, 105161, 105165, 105170, 105175, 105179, - 105184, 105189, 105194, 105199, 105203, 105208, 105213, 105217, 105222, - 105226, 105230, 105234, 105238, 105243, 105247, 105251, 105255, 105259, - 105263, 105267, 105271, 105275, 105279, 105284, 105289, 105294, 105299, - 105304, 105309, 105314, 105319, 105324, 105329, 105333, 105337, 105341, - 105345, 105349, 105353, 105358, 105362, 105367, 105371, 105376, 105381, - 105385, 105389, 105394, 105398, 105402, 105406, 105410, 105414, 105418, - 105422, 105426, 105430, 105434, 105438, 105442, 105446, 105450, 105455, - 105460, 105464, 105468, 105472, 105476, 105480, 105484, 105489, 105493, - 105497, 105501, 105505, 105509, 105513, 105518, 105522, 105527, 105531, - 105535, 105539, 105543, 105547, 105551, 105555, 105559, 105563, 105567, - 105571, 105576, 105580, 105584, 105588, 105592, 105596, 105600, 105604, - 105608, 105612, 105616, 105620, 105625, 105629, 105633, 105638, 105643, - 105647, 105651, 105655, 105659, 105663, 105667, 105671, 105675, 105680, - 105684, 105689, 105693, 105698, 105702, 105707, 105711, 105717, 105722, - 105726, 105731, 105735, 105740, 105744, 105749, 105753, 105758, 1461, - 105762, 2966, 1726, 26950, 1634, 29563, 105766, 2975, 105770, 1316, - 105775, 1258, 105779, 105783, 2999, 105787, 105795, 105802, 105809, - 105823, 3003, 7803, 105832, 105840, 105847, 105858, 105867, 105871, - 105878, 105890, 105903, 105916, 105927, 105932, 105939, 105951, 105955, - 3007, 13692, 105965, 105970, 105979, 105989, 105994, 3011, 106002, - 106006, 106011, 106018, 106024, 106029, 106038, 106046, 106058, 106068, - 1263, 15119, 106081, 106085, 106091, 106105, 106117, 106129, 106137, - 106147, 106156, 106165, 106174, 106182, 106193, 106201, 4550, 106211, - 106222, 106231, 106237, 106252, 106259, 106265, 106270, 41162, 106275, - 3035, 15123, 106279, 106286, 9901, 106295, 106301, 3040, 37152, 106310, - 69023, 106317, 106321, 106327, 106338, 106344, 106349, 106356, 106362, - 106370, 106377, 106383, 106394, 106404, 106413, 106424, 106433, 106440, - 106446, 106456, 106464, 106470, 106485, 106491, 106496, 106503, 106511, - 106515, 106518, 106524, 106531, 106537, 106545, 106554, 106562, 106568, - 106577, 49571, 106591, 106596, 106602, 17133, 106607, 106620, 106632, - 106641, 106649, 106656, 106660, 106664, 106667, 106674, 106681, 106689, - 106697, 106706, 106714, 17038, 106722, 106727, 106731, 106743, 106750, - 106757, 106766, 906, 106776, 106785, 106796, 3061, 106800, 106804, - 106810, 106823, 106835, 106845, 106854, 106866, 30368, 106877, 106885, - 106894, 106905, 106916, 106926, 106936, 106944, 106953, 106961, 13139, - 106968, 106972, 106975, 106980, 106985, 106989, 106995, 1268, 107002, - 107006, 13780, 107010, 107021, 107030, 107038, 107047, 107055, 107071, - 107082, 107091, 107099, 107111, 107122, 107138, 107148, 107169, 107183, - 107196, 107204, 107211, 7849, 107224, 107229, 107235, 6526, 107241, - 107244, 107251, 107261, 8981, 107268, 107273, 107278, 107285, 107290, - 107298, 107307, 107315, 107320, 107329, 107336, 11040, 11049, 107342, - 107353, 107359, 107364, 107370, 3077, 3082, 107376, 977, 107382, 107389, - 107396, 107409, 107414, 2261, 87, 107422, 107429, 107434, 107442, 107452, - 107461, 107467, 107476, 107484, 107494, 107498, 107502, 107507, 107511, - 107523, 3105, 107531, 107539, 107544, 107555, 107566, 107578, 107589, - 107599, 107608, 24534, 107613, 107619, 107624, 107634, 107644, 107649, - 32484, 107655, 107660, 107669, 24546, 107673, 4654, 16, 107678, 107687, - 107694, 107701, 107707, 107712, 107716, 107722, 32508, 107727, 107732, - 69685, 107737, 107742, 107748, 107754, 107762, 107767, 107775, 107782, - 107788, 107793, 45394, 49465, 107799, 1797, 32, 107809, 107822, 107827, - 107835, 107840, 107846, 3131, 32563, 107851, 107859, 107866, 107871, - 107876, 107885, 4233, 4244, 70891, 107893, 107897, 1661, 1809, 107902, - 107907, 107914, 32916, 1813, 302, 107921, 107927, 107932, 3153, 107936, - 107941, 107948, 1817, 107953, 107959, 107964, 107976, 6757, 107986, - 107993, 1824, 107999, 108004, 108011, 108018, 108033, 108040, 108051, - 108056, 108064, 2696, 108068, 108080, 108085, 108089, 108095, 32362, - 2266, 108099, 108110, 108114, 108118, 108124, 108128, 108137, 108141, - 108152, 108156, 2312, 36969, 108160, 108170, 108178, 3244, 108184, - 108193, 108201, 10439, 108206, 108214, 108219, 108223, 108232, 108239, - 108245, 3214, 17197, 108249, 108262, 108280, 108285, 108293, 108301, - 108311, 11344, 15241, 108323, 108336, 108343, 108357, 108364, 108380, - 108387, 108393, 24584, 14454, 108400, 108407, 108417, 108426, 50255, - 108438, 108446, 50390, 108453, 108456, 108462, 108468, 108474, 108480, - 108486, 108493, 108500, 108506, 108512, 108518, 108524, 108530, 108536, - 108542, 108548, 108554, 108560, 108566, 108572, 108578, 108584, 108590, - 108596, 108602, 108608, 108614, 108620, 108626, 108632, 108638, 108644, - 108650, 108656, 108662, 108668, 108674, 108680, 108686, 108692, 108698, - 108704, 108710, 108716, 108722, 108728, 108734, 108740, 108746, 108752, - 108758, 108764, 108770, 108776, 108782, 108788, 108794, 108800, 108806, - 108813, 108819, 108826, 108833, 108839, 108846, 108853, 108859, 108865, - 108871, 108877, 108883, 108889, 108895, 108901, 108907, 108913, 108919, - 108925, 108931, 108937, 108943, 3228, 10412, 108949, 108959, 108965, - 108973, 108977, 106014, 3232, 108981, 102515, 24294, 14066, 4158, 108985, - 3238, 108989, 108999, 109005, 109011, 109017, 109023, 109029, 109035, - 109041, 109047, 109053, 109059, 109065, 109071, 109077, 109083, 109089, - 109095, 109101, 109107, 109113, 109119, 109125, 109131, 109137, 109143, - 109149, 109156, 109163, 109169, 109175, 109181, 109187, 109193, 109199, - 1273, 109205, 109210, 109215, 109220, 109225, 109230, 109235, 109240, - 109245, 109249, 109253, 109257, 109261, 109265, 109269, 109273, 109277, - 109281, 109287, 109293, 109299, 109305, 109309, 109313, 109317, 109321, - 109325, 109329, 109333, 109337, 109341, 109346, 109351, 109356, 109361, - 109366, 109371, 109376, 109381, 109386, 109391, 109396, 109401, 109406, - 109411, 109416, 109421, 109426, 109431, 109436, 109441, 109446, 109451, - 109456, 109461, 109466, 109471, 109476, 109481, 109486, 109491, 109496, - 109501, 109506, 109511, 109516, 109521, 109526, 109531, 109536, 109541, - 109546, 109551, 109556, 109561, 109566, 109571, 109576, 109581, 109586, - 109591, 109596, 109601, 109606, 109611, 109616, 109621, 109626, 109631, - 109636, 109641, 109646, 109651, 109656, 109661, 109666, 109671, 109676, - 109681, 109686, 109691, 109696, 109701, 109706, 109711, 109716, 109721, - 109726, 109731, 109736, 109741, 109746, 109751, 109756, 109761, 109766, - 109771, 109776, 109781, 109786, 109791, 109796, 109801, 109806, 109811, - 109816, 109821, 109826, 109831, 109836, 109841, 109846, 109851, 109856, - 109861, 109866, 109871, 109876, 109881, 109886, 109891, 109896, 109901, - 109906, 109911, 109916, 109921, 109926, 109931, 109936, 109941, 109946, - 109951, 109956, 109961, 109966, 109971, 109976, 109981, 109986, 109991, - 109996, 110001, 110006, 110011, 110016, 110021, 110026, 110031, 110036, - 110041, 110046, 110051, 110056, 110061, 110066, 110071, 110076, 110081, - 110086, 110091, 110096, 110101, 110106, 110111, 110116, 110121, 110126, - 110131, 110136, 110141, 110146, 110151, 110156, 110161, 110166, 110171, - 110176, 110181, 110186, 110191, 110196, 110201, 110206, 110211, 110216, - 110221, 110226, 110231, 110237, 110242, 110247, 110252, 110257, 110262, - 110267, 110272, 110278, 110283, 110288, 110293, 110298, 110303, 110308, - 110313, 110318, 110323, 110328, 110333, 110338, 110343, 110348, 110353, - 110358, 110363, 110368, 110373, 110378, 110383, 110388, 110393, 110398, - 110403, 110408, 110413, 110418, 110423, 110428, 110433, 110438, 110447, - 110452, 110461, 110466, 110475, 110480, 110489, 110494, 110503, 110508, - 110517, 110522, 110531, 110536, 110545, 110550, 110555, 110564, 110568, - 110577, 110582, 110591, 110596, 110605, 110610, 110619, 110624, 110633, - 110638, 110647, 110652, 110661, 110666, 110675, 110680, 110689, 110694, - 110703, 110708, 110713, 110718, 110723, 110728, 110733, 110738, 110742, - 110747, 110752, 110757, 110762, 110767, 110772, 110778, 110783, 110788, - 110793, 110799, 110803, 110808, 110814, 110819, 110824, 110829, 110834, - 110839, 110844, 110849, 110854, 110859, 110864, 110870, 110875, 110880, - 110885, 110891, 110896, 110901, 110906, 110911, 110917, 110922, 110927, - 110932, 110937, 110942, 110948, 110953, 110958, 110963, 110968, 110973, - 110978, 110983, 110988, 110993, 110998, 111003, 111008, 111013, 111018, - 111023, 111028, 111033, 111038, 111043, 111048, 111053, 111058, 111063, - 111069, 111075, 111081, 111086, 111091, 111096, 111101, 111107, 111113, - 111119, 111124, 111129, 111134, 111140, 111145, 111150, 111155, 111160, - 111165, 111170, 111175, 111180, 111185, 111190, 111195, 111200, 111205, - 111210, 111215, 111220, 111226, 111232, 111238, 111243, 111248, 111253, - 111258, 111264, 111270, 111276, 111281, 111286, 111291, 111296, 111301, - 111306, 111311, 111316, 111321, 18785, 111326, 111332, 111337, 111342, - 111347, 111352, 111357, 111363, 111368, 111373, 111378, 111383, 111388, - 111394, 111399, 111404, 111409, 111414, 111419, 111424, 111429, 111434, - 111439, 111444, 111449, 111454, 111459, 111464, 111469, 111474, 111479, - 111484, 111489, 111494, 111499, 111504, 111510, 111515, 111520, 111525, - 111530, 111535, 111540, 111545, 111550, 111555, 111560, 111565, 111570, - 111575, 111580, 111585, 111590, 111595, 111600, 111605, 111610, 111615, - 111620, 111625, 111630, 111635, 111640, 111645, 111650, 111655, 111660, - 111665, 111670, 111675, 111680, 111685, 111690, 111695, 111700, 111705, - 111710, 111716, 111721, 111726, 111731, 111736, 111741, 111746, 111751, - 111756, 111761, 111766, 111771, 111777, 111782, 111788, 111793, 111798, - 111803, 111808, 111813, 111818, 111824, 111829, 111834, 111840, 111845, - 111850, 111855, 111860, 111865, 111871, 111877, 111882, 111887, 14088, - 111892, 111897, 111902, 111907, 111912, 111917, 111922, 111927, 111932, - 111937, 111942, 111947, 111952, 111957, 111962, 111967, 111972, 111977, - 111982, 111987, 111992, 111997, 112002, 112007, 112012, 112017, 112022, - 112027, 112032, 112037, 112042, 112047, 112052, 112057, 112062, 112067, - 112072, 112077, 112082, 112087, 112092, 112097, 112102, 112107, 112112, - 112117, 112122, 112127, 112132, 112137, 112142, 112147, 112152, 112157, - 112162, 112167, 112172, 112177, 112182, 112187, 112192, 112197, 112202, - 112207, 112212, 112218, 112223, 112228, 112233, 112238, 112244, 112249, - 112254, 112259, 112264, 112269, 112274, 112280, 112285, 112290, 112295, - 112300, 112305, 112311, 112316, 112321, 112326, 112331, 112336, 112342, - 112347, 112352, 112357, 112362, 112367, 112373, 112379, 112384, 112389, - 112394, 112400, 112406, 112412, 112417, 112422, 112428, 112434, 112439, - 112445, 112451, 112457, 112462, 112467, 112473, 112478, 112484, 112489, - 112495, 112504, 112509, 112514, 112520, 112525, 112531, 112536, 112541, - 112546, 112551, 112556, 112561, 112566, 112571, 112576, 112581, 112586, - 112591, 112596, 112601, 112606, 112611, 112616, 112621, 112626, 112631, - 112636, 112641, 112646, 112651, 112656, 112661, 112666, 112671, 112676, - 112681, 112686, 112692, 112698, 112704, 112709, 112714, 112719, 112724, - 112729, 112734, 112739, 112744, 112749, 112754, 112759, 112764, 112769, - 112774, 112779, 112784, 112789, 112794, 112799, 112804, 112810, 112816, - 112821, 112827, 112832, 112837, 112843, 112848, 112854, 112859, 112865, - 112870, 112876, 112881, 112887, 112892, 112897, 112902, 112907, 112912, - 112917, 112922, 109000, 109006, 109012, 109018, 112928, 109024, 109030, - 112934, 109036, 109042, 109048, 109054, 109060, 109066, 109072, 109078, - 109084, 112940, 109090, 109096, 109102, 112946, 109108, 109114, 109120, - 109126, 112952, 109132, 109138, 109144, 109164, 112958, 112964, 109170, - 112970, 109176, 109182, 109188, 109194, 109200, 112976, 3255, 3260, - 112981, 3275, 3280, 3285, 112986, 112989, 112995, 113001, 113008, 113013, - 113018, 2317, + 0, 0, 6, 11, 15, 19, 27, 34, 44, 49, 55, 64, 66, 69, 81, 89, 102, 108, + 113, 118, 124, 129, 137, 146, 157, 162, 167, 170, 176, 180, 189, 195, + 201, 207, 212, 220, 227, 235, 241, 250, 177, 253, 254, 262, 268, 273, + 278, 282, 289, 296, 306, 312, 317, 322, 325, 331, 337, 340, 345, 351, + 361, 366, 371, 376, 382, 384, 393, 400, 407, 409, 418, 349, 420, 428, + 436, 438, 446, 447, 452, 455, 462, 464, 470, 477, 482, 490, 496, 503, + 508, 515, 520, 523, 527, 533, 538, 548, 553, 560, 563, 571, 579, 588, + 592, 596, 599, 603, 606, 611, 621, 628, 635, 642, 649, 654, 659, 668, + 670, 679, 683, 690, 698, 702, 710, 714, 277, 723, 736, 740, 745, 750, + 756, 758, 768, 771, 777, 782, 791, 795, 800, 804, 808, 813, 819, 823, + 831, 834, 843, 852, 860, 868, 780, 879, 884, 889, 897, 904, 907, 917, + 921, 925, 932, 935, 939, 946, 952, 633, 958, 961, 964, 967, 976, 980, + 985, 988, 992, 998, 1003, 1006, 1009, 1014, 1020, 1029, 1032, 1037, 1046, + 598, 1050, 1058, 1063, 1066, 1069, 1072, 1078, 1083, 1088, 1094, 1099, + 1104, 1109, 1113, 1118, 1124, 1129, 1134, 1138, 1144, 1149, 1154, 1159, + 1163, 1168, 1173, 1178, 1184, 1190, 1196, 1201, 1205, 1210, 1215, 1220, + 1224, 1229, 1234, 1239, 1244, 1079, 1084, 1089, 1095, 1100, 1248, 1110, + 1254, 1259, 1264, 1271, 1275, 1278, 1287, 1114, 1291, 1119, 1125, 1130, + 1295, 1300, 1305, 1309, 1313, 1319, 1323, 1135, 1326, 1328, 1145, 1333, + 1337, 1150, 1343, 1155, 1347, 1351, 1358, 1160, 1362, 1367, 1371, 1374, + 1378, 1164, 1169, 1383, 1389, 1174, 1401, 1407, 1413, 1419, 1179, 1191, + 1197, 1423, 1427, 1431, 1434, 1202, 1438, 1440, 1445, 1450, 1456, 1461, + 1466, 1470, 1475, 1480, 1485, 1490, 1496, 1501, 1506, 1512, 1518, 1523, + 1527, 1532, 1537, 1542, 1547, 1552, 1556, 1564, 1569, 1573, 1578, 1583, + 1588, 1593, 1597, 1600, 1607, 1612, 1617, 1622, 1627, 1633, 1638, 1642, + 1206, 1645, 1650, 1655, 1660, 1211, 1664, 1668, 1675, 1216, 1682, 1687, + 1221, 1691, 1693, 1698, 1709, 1715, 1225, 1720, 1729, 1230, 1734, 1740, + 1745, 1235, 1750, 1759, 1764, 1768, 1771, 1776, 1780, 1784, 1788, 1791, + 1795, 1240, 1800, 1245, 1804, 1806, 1812, 1818, 1824, 1830, 1836, 1842, + 1848, 1854, 1859, 1865, 1871, 1877, 1883, 1889, 1895, 1901, 1907, 1913, + 1918, 1923, 1928, 1933, 1938, 1943, 1948, 1953, 1958, 1963, 1969, 1974, + 1980, 1985, 1991, 1997, 2002, 2008, 2014, 2020, 2026, 2031, 2036, 2038, + 2039, 2043, 2047, 2052, 2056, 2060, 2064, 2069, 2073, 2076, 2081, 2085, + 2090, 2094, 2098, 2103, 2107, 2110, 2114, 2120, 2134, 2138, 2142, 2146, + 2149, 2154, 2158, 2162, 2165, 2169, 2174, 2179, 2184, 2189, 2193, 2197, + 2201, 2205, 2209, 2214, 2218, 2223, 2227, 2232, 2238, 2245, 2251, 2256, + 2261, 2266, 2272, 2277, 2283, 2288, 2293, 2298, 2303, 2308, 2311, 2313, + 1096, 2317, 2324, 2332, 2342, 2351, 2365, 2369, 2373, 2378, 2391, 2399, + 2402, 2406, 2409, 2414, 2418, 2421, 2425, 2429, 2434, 1704, 2439, 2443, + 2446, 2450, 2456, 2463, 2470, 2476, 2481, 2486, 2492, 2498, 2503, 2508, + 2513, 2518, 2523, 2528, 2453, 2533, 1695, 2535, 2541, 2545, 2550, 2554, + 2558, 1603, 1717, 2563, 2567, 2571, 2574, 2579, 2584, 2589, 2594, 2598, + 2605, 2610, 2613, 2617, 2621, 2628, 2634, 2638, 2644, 2648, 2652, 2657, + 2664, 2669, 2674, 2681, 2687, 2693, 2699, 2720, 2734, 2751, 2766, 2782, + 2799, 2814, 2823, 2828, 2832, 2837, 2842, 2846, 2858, 2865, 2871, 2241, + 2877, 2884, 2890, 2894, 2897, 2904, 2910, 2915, 2919, 2924, 2928, 2932, + 2061, 2936, 2941, 2946, 2950, 2955, 2963, 2967, 2974, 2979, 2983, 2987, + 2991, 2996, 3001, 3006, 3010, 3015, 3020, 3024, 3029, 3034, 3038, 3041, + 3045, 3049, 3057, 3062, 3066, 3070, 3076, 3085, 3089, 3093, 3099, 3104, + 3111, 3115, 3125, 3129, 3133, 3138, 3142, 3147, 3153, 3158, 3162, 3166, + 3170, 2466, 3178, 3183, 3189, 3194, 3198, 3203, 3208, 3212, 3218, 3223, + 2065, 3229, 3235, 3240, 3245, 3250, 3255, 3260, 3265, 3270, 3275, 3280, + 3285, 3290, 3295, 3300, 3305, 3311, 3316, 1111, 101, 3322, 3326, 3330, + 3334, 3339, 3343, 3347, 3353, 3358, 3362, 3366, 3371, 3376, 3380, 3385, + 3389, 3392, 3396, 3401, 3405, 3410, 3414, 3417, 3419, 3423, 3427, 3432, + 3436, 3439, 3452, 3456, 3460, 3464, 3469, 3473, 3477, 3480, 3484, 3488, + 3493, 3497, 3502, 3507, 3512, 3516, 3523, 3528, 3531, 3537, 3540, 3545, + 3551, 3555, 3559, 3562, 3567, 3571, 3576, 3580, 3584, 3587, 3593, 3598, + 3603, 3609, 3614, 3619, 3625, 3631, 3636, 3641, 3646, 3651, 978, 605, + 3654, 3657, 3662, 3666, 3670, 3674, 3678, 3681, 3685, 3690, 3695, 3699, + 3704, 3708, 3713, 3717, 3721, 3725, 3731, 3737, 3740, 3743, 150, 3749, + 3754, 3763, 3771, 3780, 3790, 3797, 3803, 3810, 3815, 3819, 3823, 3831, + 3838, 3843, 3848, 3855, 3860, 3864, 3874, 3878, 3882, 3887, 3892, 3902, + 2077, 3907, 3911, 3914, 3920, 3925, 3931, 3937, 3942, 3949, 3953, 3957, + 3961, 3966, 3971, 3976, 3981, 3986, 3991, 600, 597, 1272, 3996, 4003, + 4010, 4016, 4021, 4028, 4035, 4040, 4046, 4052, 4057, 4061, 4067, 4074, + 4079, 4083, 4087, 2086, 4093, 4101, 4107, 4115, 838, 4121, 4129, 4140, + 4144, 4154, 4160, 4165, 4170, 4175, 4180, 2091, 4185, 4190, 4205, 4211, + 4218, 4229, 4239, 4245, 4250, 4256, 4262, 4265, 4268, 4272, 4277, 4280, + 4287, 4296, 4301, 4305, 4309, 4313, 4317, 4322, 4328, 4339, 4343, 3397, + 4348, 4360, 4366, 4374, 4378, 4383, 4390, 4395, 4400, 4405, 1472, 4410, + 4413, 4416, 4420, 4423, 4429, 4433, 4447, 4451, 4454, 4458, 4464, 4470, + 4475, 4479, 4483, 4489, 4500, 4506, 4511, 4517, 4521, 4529, 4541, 4551, + 4557, 4562, 4571, 4579, 4586, 4592, 4598, 4602, 4608, 4617, 4626, 4631, + 4637, 4641, 4650, 4655, 4659, 4664, 4668, 4676, 4682, 4686, 4693, 4698, + 4702, 4708, 2099, 4714, 4719, 4724, 4729, 4734, 1288, 4739, 4744, 4750, + 4755, 4760, 4765, 4770, 4775, 4780, 4786, 4791, 4797, 4802, 4807, 4812, + 4818, 4823, 4828, 4833, 4838, 4844, 4849, 4855, 4860, 4865, 4870, 4875, + 4880, 4885, 4891, 4896, 4901, 329, 370, 4906, 4912, 4916, 4920, 4925, + 4929, 4933, 4936, 4940, 4944, 4947, 4951, 4955, 4959, 4964, 4968, 4972, + 4978, 4987, 4711, 4992, 4996, 4999, 5004, 5009, 5014, 5019, 5024, 5029, + 5034, 5039, 5044, 5049, 5053, 5058, 5063, 5068, 5073, 5078, 5083, 5088, + 5093, 5098, 5103, 5107, 5112, 5117, 5122, 5127, 5132, 5137, 5142, 5147, + 5152, 5157, 5161, 5166, 5171, 5176, 5181, 5186, 5191, 5196, 5201, 5206, + 5211, 5215, 5220, 5225, 5230, 5235, 5240, 5245, 5250, 5255, 5260, 5265, + 5269, 5274, 5279, 5284, 5289, 5294, 5299, 5304, 5309, 5314, 5319, 5323, + 5328, 5333, 5338, 5343, 5348, 5353, 5358, 5363, 5368, 5373, 5377, 5382, + 5387, 5392, 5397, 5403, 5409, 5415, 5421, 5427, 5433, 5439, 5444, 5450, + 5456, 5462, 5468, 5474, 5480, 5486, 5492, 5498, 5504, 5509, 5515, 5521, + 5527, 5533, 5539, 5545, 5551, 5557, 5563, 5569, 5574, 5580, 5586, 5592, + 5598, 5604, 5610, 5616, 5622, 5628, 5634, 5639, 5645, 5651, 5657, 5663, + 5669, 5675, 5681, 5687, 5693, 5699, 5704, 5710, 5716, 5722, 5728, 5734, + 5740, 5746, 5752, 5758, 5764, 5769, 5773, 5779, 5785, 5791, 5797, 5803, + 5809, 5815, 5821, 5827, 5833, 5838, 5844, 5850, 5856, 5862, 5868, 5874, + 5880, 5886, 5892, 5898, 5903, 5909, 5915, 5921, 5927, 5933, 5939, 5945, + 5951, 5957, 5963, 5968, 5974, 5980, 5986, 5992, 5998, 6004, 6010, 6016, + 6022, 6028, 6033, 6039, 6045, 6051, 6057, 6063, 6069, 6075, 6081, 6087, + 6093, 6098, 6104, 6110, 6116, 6122, 6128, 6134, 6140, 6146, 6152, 6158, + 6163, 6169, 6175, 6181, 6187, 6193, 6199, 6205, 6211, 6217, 6223, 6228, + 6234, 6240, 6246, 6252, 6258, 6264, 6270, 6276, 6282, 6288, 6293, 6299, + 6305, 6311, 6317, 6323, 6329, 6335, 6341, 6347, 6353, 6358, 6364, 6370, + 6376, 6382, 6388, 6394, 6400, 6406, 6412, 6418, 6423, 6427, 6430, 6437, + 6441, 6454, 6458, 6462, 6466, 6469, 6473, 6478, 6482, 6491, 6495, 6501, + 6508, 6519, 6527, 6534, 6540, 6544, 6552, 6561, 6567, 6571, 6583, 6588, + 6591, 6596, 6600, 6610, 6618, 6626, 6632, 6636, 6646, 6656, 6664, 6671, + 6678, 6684, 6690, 6697, 6701, 6708, 6718, 6728, 6736, 6743, 6748, 6752, + 6756, 6764, 6768, 6778, 6783, 6790, 6798, 6808, 6813, 6817, 6822, 6826, + 6833, 6838, 6852, 6857, 6862, 6869, 3667, 6878, 6882, 6886, 6891, 6895, + 6899, 6902, 6907, 6912, 6921, 6927, 6933, 6938, 6944, 6948, 6959, 6969, + 6984, 6999, 7014, 7029, 7044, 7059, 7074, 7089, 7104, 7119, 7134, 7149, + 7164, 7179, 7194, 7209, 7224, 7239, 7254, 7269, 7284, 7299, 7314, 7329, + 7344, 7359, 7374, 7389, 7404, 7419, 7434, 7449, 7464, 7479, 7494, 7509, + 7524, 7539, 7554, 7569, 7584, 7599, 7614, 7629, 7644, 7659, 7674, 7689, + 7704, 7713, 7722, 7727, 7733, 7743, 7747, 7751, 7756, 7761, 7766, 7774, + 7778, 7781, 7785, 3120, 7788, 7793, 348, 551, 7799, 7807, 7811, 7815, + 7818, 7822, 7828, 7832, 7840, 7846, 7851, 7858, 7866, 7873, 7879, 7884, + 7891, 7897, 7906, 7914, 7918, 7923, 7931, 7943, 7954, 7961, 7972, 7976, + 7980, 7984, 7987, 7993, 3424, 7997, 7999, 8005, 8010, 8015, 8020, 8026, + 8031, 8036, 8041, 8046, 8052, 8057, 8062, 8068, 8073, 8079, 8084, 8090, + 8095, 8101, 8106, 8111, 8116, 8121, 8126, 8132, 8137, 8142, 8147, 8153, + 8159, 8165, 8171, 8177, 8183, 8189, 8195, 8201, 8207, 8213, 8219, 8224, + 8229, 8234, 8239, 8244, 8249, 8254, 8259, 8265, 8271, 8276, 8282, 8288, + 8294, 8299, 8304, 8309, 8314, 8320, 8326, 8331, 8336, 8341, 8346, 8351, + 8357, 8362, 8368, 8374, 8380, 8386, 8392, 8398, 8404, 8410, 8416, 2108, + 7817, 8421, 8425, 8433, 8437, 8440, 8447, 8450, 8454, 8462, 8467, 8472, + 8463, 8477, 2135, 8481, 8487, 8493, 8498, 8503, 8510, 8518, 8523, 8527, + 8530, 8534, 8540, 8546, 8550, 1647, 594, 8553, 8557, 8562, 8568, 8573, + 8577, 8580, 8584, 8590, 8595, 8599, 8606, 8610, 8614, 8618, 779, 8621, + 8623, 8631, 8638, 8645, 8651, 8658, 8666, 8673, 8684, 8691, 8697, 8709, + 1131, 1296, 1301, 8720, 8724, 1306, 8728, 8732, 8741, 8749, 8753, 8762, + 8768, 8774, 8779, 8783, 8789, 8794, 8802, 8809, 2819, 8816, 8822, 8826, + 8835, 8844, 8853, 8862, 8868, 8873, 8878, 8889, 8898, 8910, 8915, 8923, + 2194, 8927, 8929, 8934, 8938, 8947, 8955, 1310, 165, 3709, 3714, 8961, + 8965, 8974, 8980, 8985, 8988, 8997, 2206, 9003, 2811, 9007, 9015, 9019, + 9023, 9027, 9031, 2215, 9035, 9040, 9047, 9053, 9059, 9062, 9064, 9067, + 9075, 9083, 9091, 9094, 9099, 2228, 9104, 8474, 9107, 9109, 9114, 9119, + 9124, 9129, 9134, 9139, 9144, 9149, 9154, 9159, 9165, 9170, 9175, 9180, + 9186, 9191, 9196, 9201, 9206, 9211, 9216, 9222, 9227, 9232, 9237, 9242, + 9247, 9252, 9257, 9262, 9267, 9272, 9277, 9282, 9287, 9292, 9297, 9302, + 9307, 9313, 9319, 9324, 9329, 9334, 9339, 9344, 2239, 2246, 2252, 9349, + 9357, 9363, 9371, 2278, 2284, 9379, 2289, 2294, 2299, 2304, 9383, 9387, + 9392, 9396, 9400, 9404, 9409, 9413, 9418, 9422, 9425, 9428, 9434, 9441, + 9447, 9454, 9460, 9467, 9473, 9480, 9486, 9492, 9501, 9507, 9511, 9515, + 9519, 9523, 9528, 9532, 9537, 9541, 9547, 9551, 9556, 9563, 9574, 9582, + 9592, 9598, 9608, 9617, 9624, 9629, 9633, 9644, 9654, 9667, 9678, 9691, + 9702, 9714, 9726, 9738, 9749, 9762, 9775, 9782, 9788, 9799, 9809, 9823, + 9830, 9836, 9845, 9853, 9857, 9862, 9866, 9873, 9881, 9888, 9892, 9898, + 9902, 9908, 9918, 9922, 9927, 9932, 9939, 9945, 8653, 9955, 9959, 9966, + 9972, 9979, 9986, 9990, 9993, 9999, 10003, 10008, 10013, 10018, 10022, + 10028, 10036, 10043, 10049, 10053, 10056, 10062, 10072, 10076, 10082, + 10087, 10091, 10096, 10100, 10106, 10112, 10117, 10123, 10128, 10133, + 10138, 2131, 10143, 10145, 10150, 10158, 10167, 10171, 10177, 10182, + 10187, 10192, 10197, 10203, 10208, 10213, 4485, 10218, 10223, 10227, + 10233, 10238, 10244, 10249, 10254, 10260, 10265, 10172, 10271, 10275, + 10282, 10288, 10293, 10297, 6848, 10302, 10311, 10316, 10321, 9043, 9050, + 10326, 2993, 10330, 10335, 10340, 10345, 10183, 10349, 10354, 10359, + 10188, 10363, 10193, 10368, 10375, 10382, 10388, 10395, 10401, 10407, + 10412, 10419, 10424, 10429, 10434, 10440, 10198, 10204, 10446, 10452, + 10457, 10462, 10470, 10209, 10475, 10478, 10480, 10488, 10494, 10500, + 10509, 10517, 10525, 10533, 10541, 10549, 10557, 10565, 10573, 10582, + 10591, 10599, 10608, 10617, 10626, 10635, 10644, 10653, 10662, 10671, + 10680, 10689, 10697, 10702, 10706, 10712, 10720, 10727, 10742, 10759, + 10778, 10787, 10795, 10810, 10821, 10829, 10839, 10849, 10857, 10863, + 10875, 10884, 10892, 10899, 10906, 10913, 10919, 10924, 10934, 10942, + 10952, 10959, 10969, 10979, 10989, 10997, 11004, 11013, 11023, 11037, + 11052, 11061, 11069, 11074, 11078, 11087, 11093, 11098, 11108, 11118, + 11128, 11133, 11137, 11147, 11156, 11161, 11177, 11194, 11204, 11209, + 11220, 11233, 11244, 11252, 11265, 11277, 11285, 11290, 11294, 11300, + 11305, 11313, 11321, 11328, 11339, 11344, 11352, 11362, 11368, 11372, + 11375, 11379, 11385, 11392, 11396, 11404, 11413, 11421, 11428, 11433, + 11438, 11442, 11446, 11454, 11469, 11485, 11491, 11499, 11508, 11516, + 11522, 11526, 11533, 11544, 11548, 11551, 11562, 11568, 11573, 10214, + 11581, 11587, 11594, 11600, 11605, 11612, 11619, 11626, 11633, 11640, + 11647, 11654, 11661, 11668, 11675, 11682, 11689, 11696, 11703, 11710, + 11715, 10755, 11720, 11726, 11733, 11740, 11745, 11752, 11761, 11765, + 11777, 11781, 11787, 11792, 11797, 11802, 11807, 11812, 11817, 11820, + 11824, 11828, 11832, 11836, 11842, 11848, 11853, 11859, 11864, 11869, + 11875, 11880, 11885, 9935, 11890, 11894, 11898, 11902, 11907, 11912, + 11917, 11925, 11931, 11936, 11940, 11944, 11951, 11956, 11964, 11971, + 11976, 11980, 11983, 11989, 11996, 12000, 12003, 12008, 12012, 4524, + 12018, 12027, 46, 12035, 12041, 12046, 12051, 12059, 12066, 12071, 6773, + 12077, 12083, 12088, 12092, 12095, 12110, 12129, 12141, 12154, 12167, + 12180, 12194, 12207, 12222, 12229, 10219, 12235, 12249, 12254, 12260, + 12265, 12273, 12278, 8831, 12283, 12286, 12294, 12301, 12306, 12310, + 12316, 12320, 12325, 12330, 12335, 12340, 12345, 12350, 2998, 10837, + 12355, 12359, 12365, 12371, 12376, 12382, 12387, 10228, 12393, 12399, + 12404, 12409, 12417, 12423, 12436, 12444, 12451, 12457, 10234, 12463, + 12471, 12479, 12486, 12499, 12512, 12524, 12534, 12546, 12574, 12582, + 12591, 12598, 12610, 12617, 12627, 12636, 12644, 12651, 12656, 12662, + 10239, 12667, 12673, 12678, 12683, 12688, 10245, 12693, 12696, 12703, + 12709, 12723, 12736, 12747, 9567, 12758, 12764, 12773, 12781, 12788, + 12794, 12805, 12811, 12816, 12824, 4012, 12830, 12835, 12102, 12841, + 12848, 12853, 10250, 12859, 12864, 12871, 12877, 12883, 12888, 12896, + 12904, 12911, 12915, 12927, 12941, 12951, 12956, 12960, 12971, 12977, + 12982, 12987, 10255, 12991, 10261, 12996, 12999, 13004, 13016, 13023, + 13028, 13032, 13040, 13045, 13049, 13054, 13058, 13065, 13071, 10266, + 10173, 13078, 3003, 17, 13085, 13090, 13094, 13098, 13104, 13112, 13122, + 13127, 13132, 13139, 13146, 13150, 13161, 13171, 13180, 13189, 13201, + 13206, 13210, 13218, 13232, 13236, 13239, 13243, 13251, 13258, 13266, + 13270, 13281, 13289, 13293, 13300, 13305, 13309, 13315, 13320, 13326, + 13331, 13336, 13340, 13346, 13351, 13362, 13366, 13369, 13375, 13382, + 13388, 13393, 13399, 13405, 13412, 13423, 13433, 13443, 13452, 13459, + 13468, 13472, 10276, 10283, 10289, 10294, 13478, 13484, 13490, 13495, + 13501, 10298, 13507, 13510, 13517, 13522, 13527, 13542, 13558, 13573, + 13581, 13586, 13593, 13599, 13603, 13608, 13613, 13618, 13623, 13628, + 13633, 13638, 13643, 13648, 1561, 374, 13653, 13661, 13668, 13674, 13679, + 13684, 10303, 13686, 13690, 13695, 13699, 13709, 13714, 13718, 13721, + 13730, 13734, 13737, 13744, 10312, 13749, 13752, 13760, 13767, 13775, + 13779, 13785, 13789, 13796, 13805, 13812, 13808, 13819, 13823, 13829, + 13833, 13837, 13841, 13847, 13857, 13865, 13872, 13876, 13884, 13889, + 13893, 13900, 13905, 13912, 13916, 13921, 13926, 13930, 13937, 13943, + 13951, 13957, 13962, 13972, 13979, 13984, 13989, 13993, 13997, 14005, + 4354, 14013, 14018, 10317, 14022, 14029, 14033, 14036, 14044, 14051, + 14055, 6628, 14059, 14064, 14069, 14073, 14084, 14094, 14099, 14105, + 14110, 14114, 14117, 14125, 14130, 14135, 14142, 14147, 10322, 14152, + 14156, 14163, 14168, 14173, 14178, 6796, 14183, 14188, 14193, 14198, + 14204, 14209, 14215, 14220, 14225, 14230, 14235, 14240, 14245, 14250, + 14255, 14260, 14265, 14270, 14275, 14280, 14285, 14290, 14295, 14301, + 14306, 14311, 14316, 14321, 14326, 14332, 14337, 14342, 14348, 14353, + 14359, 14364, 14370, 14375, 14380, 14385, 14390, 14396, 14401, 14406, + 14411, 14419, 996, 112, 14425, 14429, 14434, 14439, 14443, 14447, 14451, + 14456, 14460, 14465, 14469, 14472, 14476, 14480, 14486, 14491, 14501, + 14507, 14515, 14521, 14525, 14529, 14536, 14544, 14553, 14564, 14574, + 14581, 14588, 14592, 14601, 14610, 14618, 14625, 14634, 14643, 14652, + 14661, 14671, 14681, 14691, 14701, 14711, 14720, 14730, 14740, 14750, + 14760, 14770, 14780, 14790, 14799, 14809, 14819, 14829, 14839, 14849, + 14859, 14868, 14878, 14888, 14898, 14908, 14918, 14928, 14938, 14948, + 14958, 14967, 14977, 14987, 14997, 15007, 15017, 15027, 15037, 15047, + 15057, 15067, 15076, 15082, 1140, 15086, 15089, 15093, 15098, 15105, + 15111, 15116, 15120, 15125, 15134, 15143, 15151, 15156, 15160, 15164, + 15170, 15175, 15181, 10331, 15186, 15191, 15200, 15205, 10341, 15210, + 15213, 15219, 15227, 10346, 15234, 15238, 15242, 15247, 15251, 15261, + 15267, 15273, 15278, 15287, 15295, 15302, 15309, 15314, 15321, 15326, + 15330, 15333, 15344, 15354, 15367, 15376, 15384, 15395, 15407, 15417, + 15427, 15432, 15436, 15441, 15446, 15450, 15456, 15464, 15471, 15482, + 15487, 15497, 15506, 15510, 15513, 15520, 15530, 15539, 15546, 15550, + 15557, 15563, 15568, 15573, 15577, 15129, 15586, 15590, 15596, 15600, + 15605, 15609, 15616, 15623, 15627, 15636, 15644, 15652, 15659, 15667, + 15679, 15690, 15700, 15707, 15713, 15722, 15733, 15742, 15754, 15766, + 15778, 15788, 15797, 15807, 15816, 15824, 15831, 15840, 15848, 15852, + 15857, 15863, 15869, 15874, 15879, 15883, 15888, 15893, 15898, 15903, + 15908, 15913, 15918, 8495, 15923, 15925, 15929, 15934, 15940, 15947, + 15953, 15959, 15968, 15972, 15978, 15986, 15993, 16002, 16011, 16020, + 16029, 16038, 16047, 16056, 16065, 16075, 16085, 16094, 16100, 16107, + 16114, 16120, 16134, 16140, 16147, 16155, 16164, 16172, 16178, 16187, + 16196, 16207, 16213, 16223, 16231, 16238, 16246, 16255, 16268, 16277, + 16285, 16292, 16305, 16311, 16317, 16327, 16336, 16345, 16350, 16354, + 16360, 16366, 16371, 16378, 16385, 9949, 16390, 16395, 16402, 16410, + 16415, 16427, 16434, 16439, 16451, 14482, 16456, 16462, 16470, 16476, + 16481, 16489, 16497, 16504, 16512, 16518, 16526, 16534, 16540, 16548, + 16554, 16559, 16565, 16572, 16578, 16583, 16587, 16598, 16606, 16614, + 16620, 16625, 16632, 16641, 16647, 16652, 16660, 16667, 16676, 16690, + 4298, 16694, 16699, 16704, 16710, 16715, 16720, 16724, 16729, 16734, + 16739, 8494, 16744, 16749, 16754, 16759, 16764, 16768, 16773, 16778, + 16783, 16788, 16794, 16800, 13781, 16805, 16811, 16816, 16821, 16826, + 10350, 16831, 16836, 16841, 16846, 16851, 16865, 16882, 16900, 16912, + 16925, 16942, 16958, 16975, 16985, 17004, 17015, 17026, 17037, 2708, + 17048, 17059, 17070, 17087, 17098, 17109, 17114, 10355, 17119, 17123, + 2388, 17127, 17130, 17136, 17144, 17152, 17158, 17167, 17174, 17179, + 17187, 17195, 17202, 17206, 17211, 17217, 17224, 17232, 17239, 17251, + 17258, 17264, 17272, 17277, 17283, 17289, 17294, 13536, 17301, 17310, + 17316, 17321, 17329, 17338, 17346, 17353, 17359, 17367, 17374, 17380, + 17386, 17393, 17400, 17406, 17412, 17421, 17429, 17434, 17444, 17451, + 17457, 17465, 17471, 17479, 17487, 17494, 17507, 17514, 17523, 17532, + 17541, 17549, 17559, 17566, 17571, 3868, 17578, 17583, 1256, 17587, + 17594, 16745, 17598, 17604, 17608, 17616, 17628, 17633, 17640, 17646, + 17651, 17658, 16750, 17662, 17666, 17670, 16755, 17674, 16760, 17678, + 17685, 17690, 17694, 17701, 17705, 17713, 17720, 17725, 17733, 17737, + 17744, 17761, 17770, 17779, 17783, 17786, 17792, 17800, 17806, 17811, + 17815, 17820, 17825, 17830, 17835, 17840, 17845, 3946, 17850, 17852, + 17860, 17867, 17877, 17889, 17894, 17898, 17904, 17909, 17917, 17921, + 17927, 17932, 17938, 17941, 17948, 17956, 17963, 17969, 17974, 17980, + 17985, 17992, 17998, 18003, 18010, 18015, 18019, 18025, 18031, 18035, + 18042, 18048, 18053, 18059, 18067, 18075, 18082, 18088, 18093, 18099, + 18105, 18113, 18118, 18123, 18131, 18137, 18143, 18148, 18155, 18160, + 18164, 18170, 18176, 18181, 18188, 18193, 18199, 18202, 18208, 18219, + 18225, 18228, 18232, 18236, 18250, 18263, 18275, 18281, 18286, 18293, + 18299, 18305, 18316, 18328, 18340, 18350, 18359, 18367, 18374, 18385, + 18395, 18405, 18413, 18416, 16774, 18421, 18426, 16779, 16930, 18434, + 18447, 18462, 18473, 16947, 18491, 18504, 18517, 18528, 12117, 18539, + 18552, 18571, 18582, 18593, 18604, 2729, 18617, 18621, 18629, 18640, + 18651, 18659, 18674, 18689, 18700, 18707, 18713, 18721, 18725, 18731, + 18735, 18738, 18751, 18763, 18773, 18781, 18788, 18796, 18806, 18811, + 18818, 18823, 18830, 18841, 18851, 18857, 18862, 18867, 16784, 18871, + 18877, 18883, 18888, 18893, 18898, 18902, 16789, 16795, 18906, 16801, + 18911, 18919, 18924, 18928, 18935, 18943, 18950, 18959, 18966, 18970, + 18974, 18979, 18984, 18989, 18994, 18999, 10194, 19004, 19006, 19011, + 19016, 19022, 19027, 19032, 19037, 19042, 19046, 19052, 19058, 19063, + 19069, 19074, 19079, 19083, 19089, 19094, 19098, 19103, 19108, 19120, + 19125, 19131, 19136, 19141, 19147, 19153, 19158, 19163, 19168, 19175, + 19181, 19192, 19199, 19208, 19213, 19217, 275, 19221, 19229, 19234, + 19240, 19247, 19254, 19260, 19265, 19270, 19275, 19282, 19292, 19300, + 19305, 19310, 19317, 19323, 19332, 19342, 19352, 19366, 19380, 19394, + 19408, 19423, 19438, 19455, 19473, 19486, 19492, 19497, 19502, 19506, + 19514, 19519, 19527, 19533, 19539, 19544, 19549, 19553, 19559, 19564, + 19568, 19575, 19580, 19584, 19595, 19601, 19606, 19611, 19618, 19623, + 19627, 3826, 19632, 19638, 19645, 16806, 19651, 19655, 19661, 19666, + 19671, 19675, 19681, 19686, 19691, 19698, 19703, 15263, 19707, 19712, + 19716, 19721, 19727, 19733, 19740, 19750, 19758, 19765, 19770, 19774, + 19783, 19791, 19798, 19805, 19811, 19816, 19822, 19827, 19832, 19838, + 19843, 19849, 19854, 19860, 19866, 19873, 19879, 19884, 19889, 10420, + 19898, 19901, 19909, 19915, 19920, 19925, 19935, 19942, 19948, 19953, + 19958, 19964, 19969, 19975, 19980, 19986, 19993, 19999, 20005, 20010, + 20018, 20025, 20030, 20035, 20041, 20046, 20050, 20059, 20070, 20077, + 20084, 20092, 20099, 20106, 20111, 20116, 20122, 20127, 20135, 20141, + 20147, 20152, 20159, 20165, 20170, 20174, 20180, 20185, 20190, 20194, + 20199, 1329, 8519, 3017, 20203, 20207, 20211, 20215, 20219, 20223, 20226, + 20231, 20238, 20246, 20256, 20267, 20277, 20288, 20300, 20311, 20321, + 20332, 20344, 20355, 20367, 20380, 20392, 20403, 20413, 20424, 20436, + 20447, 20460, 20472, 20483, 20495, 20508, 20520, 20533, 20547, 20560, + 20572, 20583, 20593, 20604, 20616, 20627, 20639, 20652, 20664, 20675, + 20687, 20700, 20713, 20727, 20740, 20752, 20763, 20775, 20788, 20800, + 20813, 20827, 20840, 20852, 20865, 20879, 20892, 20906, 20920, 20933, + 20945, 20956, 20966, 16817, 20973, 20979, 20989, 20997, 21004, 21012, + 21022, 21031, 21044, 21049, 21054, 21062, 21069, 15372, 15381, 21076, + 21086, 21101, 21107, 21114, 21121, 21128, 21134, 21140, 21151, 21159, + 21167, 21177, 21187, 21196, 16822, 21205, 21211, 21217, 21226, 21234, + 21242, 21247, 21256, 21264, 21276, 21286, 21296, 21306, 21315, 21327, + 21337, 21347, 21358, 21365, 21370, 21377, 21389, 21401, 21413, 21425, + 21437, 21449, 21461, 21473, 21485, 21497, 21508, 21520, 21532, 21544, + 21556, 21568, 21580, 21592, 21604, 21616, 21628, 21639, 21651, 21663, + 21675, 21687, 21699, 21711, 21723, 21735, 21747, 21759, 21770, 21782, + 21794, 21806, 21818, 21830, 21842, 21854, 21866, 21878, 21890, 21901, + 21913, 21925, 21937, 21949, 21961, 21973, 21985, 21997, 22009, 22021, + 22032, 22044, 22056, 22068, 22080, 22092, 22104, 22116, 22128, 22140, + 22152, 22163, 22175, 22187, 22199, 22211, 22223, 22235, 22247, 22259, + 22271, 22283, 22294, 22306, 22318, 22330, 22342, 22355, 22368, 22381, + 22394, 22407, 22420, 22433, 22445, 22458, 22471, 22484, 22497, 22510, + 22523, 22536, 22549, 22562, 22575, 22587, 22600, 22613, 22626, 22639, + 22652, 22665, 22678, 22691, 22704, 22717, 22729, 22742, 22755, 22768, + 22781, 22794, 22807, 22820, 22833, 22846, 22859, 22871, 22884, 22897, + 22910, 22923, 22936, 22949, 22962, 22975, 22988, 23001, 23013, 23026, + 23039, 23052, 23065, 23078, 23091, 23104, 23117, 23130, 23143, 23155, + 23166, 23179, 23192, 23205, 23218, 23231, 23244, 23257, 23270, 23283, + 23296, 23308, 23321, 23334, 23347, 23360, 23373, 23386, 23399, 23412, + 23425, 23438, 23450, 23463, 23476, 23489, 23502, 23515, 23528, 23541, + 23554, 23567, 23580, 23592, 23605, 23618, 23631, 23644, 23657, 23670, + 23683, 23696, 23709, 23722, 23734, 23747, 23760, 23773, 23786, 23799, + 23812, 23825, 23838, 23851, 23864, 23876, 23889, 23902, 23915, 23928, + 23941, 23954, 23967, 23980, 23993, 24006, 24018, 24031, 24044, 24057, + 24070, 24083, 24096, 24109, 24122, 24135, 24148, 24160, 24173, 24186, + 24199, 24212, 24225, 24238, 24251, 24264, 24277, 24290, 24302, 24315, + 24328, 24341, 24354, 24367, 24380, 24393, 24406, 24419, 24432, 24444, + 24457, 24470, 24483, 24496, 24509, 24522, 24535, 24548, 24561, 24574, + 24586, 24597, 24606, 24614, 24622, 24629, 24635, 24639, 24645, 24651, + 24660, 24668, 24673, 24679, 24684, 24688, 24697, 10199, 24708, 24714, + 24721, 24729, 24736, 12716, 12730, 24743, 24750, 24759, 24764, 24769, + 24776, 24781, 24786, 8535, 8541, 8547, 24791, 24796, 24799, 24804, 24812, + 24819, 24826, 24838, 24845, 24851, 24860, 24869, 24878, 24884, 24892, + 24901, 24905, 24911, 24916, 24926, 24933, 24939, 24947, 24953, 24960, + 24966, 24976, 24985, 24989, 24996, 25000, 25005, 25011, 25019, 25023, + 25033, 16832, 25042, 25048, 25052, 25061, 25070, 25080, 25086, 16837, + 25093, 25100, 25111, 25119, 25129, 25138, 25146, 9914, 25154, 25159, + 25165, 25170, 25174, 25178, 25182, 10938, 25187, 25195, 25202, 25211, + 25219, 25226, 25233, 25242, 25248, 1024, 25255, 25261, 25265, 25271, + 25278, 25284, 25292, 25298, 25305, 25311, 25317, 25326, 25330, 25338, + 25345, 25354, 25361, 25366, 25370, 25381, 25386, 25391, 25397, 25402, + 25415, 8759, 25419, 25425, 25431, 25437, 25442, 25450, 25454, 25461, + 25470, 25475, 17110, 25483, 25487, 25499, 25504, 25508, 25511, 25517, + 25523, 25529, 25534, 25539, 25543, 25546, 25557, 25562, 10471, 25569, + 25574, 25579, 25584, 25589, 25594, 25599, 25604, 25609, 10476, 25614, + 25619, 25624, 25629, 25634, 25639, 25644, 25649, 25654, 25659, 25664, + 25669, 25675, 25680, 25685, 25690, 25695, 25700, 25705, 25710, 25715, + 25720, 25726, 25732, 25737, 25742, 25747, 25752, 25757, 25762, 25767, + 25772, 25777, 25783, 25788, 25793, 25798, 25804, 25810, 25815, 25820, + 25825, 25830, 25835, 25840, 25845, 25850, 25856, 25861, 25866, 25871, + 25876, 25882, 25887, 25892, 25896, 1252, 145, 25904, 25908, 25912, 25916, + 25921, 25925, 15269, 2314, 25929, 25934, 25938, 25943, 25947, 25952, + 25956, 25962, 25967, 25971, 25975, 25983, 25987, 25991, 25998, 26003, + 26008, 26012, 26018, 26023, 26027, 26032, 26037, 26041, 26048, 26055, + 26062, 26067, 26071, 26075, 26080, 26084, 26087, 26093, 26106, 26111, + 26117, 26126, 26131, 10698, 26136, 26145, 26150, 26153, 26157, 26162, + 26167, 26172, 26177, 26182, 2825, 2830, 26187, 26193, 26197, 26203, 3787, + 26208, 26213, 26218, 26224, 26229, 16203, 26234, 26239, 26244, 26249, + 26255, 26260, 26265, 26271, 26276, 26280, 26285, 26290, 26295, 26300, + 26305, 26309, 26314, 26318, 26323, 26328, 26333, 26338, 26342, 26347, + 26351, 26356, 26361, 26366, 26281, 3026, 26286, 26371, 26379, 26386, + 11032, 26398, 26406, 26416, 26434, 26453, 26462, 26470, 26291, 26477, + 26482, 26490, 26296, 26495, 26500, 26508, 26513, 26518, 26522, 26301, + 26527, 26535, 26540, 26544, 26551, 26557, 26566, 26570, 26578, 26582, + 26585, 20054, 26592, 26596, 26600, 26605, 26611, 26618, 26623, 9941, + 26627, 26632, 26637, 26642, 26647, 26652, 1657, 1662, 26657, 26663, + 26669, 26674, 26678, 26682, 26686, 26690, 26694, 26698, 26702, 26706, + 24832, 26709, 26716, 26724, 26730, 26736, 26741, 26746, 26752, 26756, + 26761, 26768, 16109, 16116, 26774, 26786, 26789, 26796, 26800, 19256, + 26807, 26815, 26826, 26835, 26848, 26858, 26872, 26884, 26898, 26911, + 26923, 26933, 26945, 26951, 26957, 26972, 26996, 27014, 27033, 27046, + 27060, 27078, 27094, 27111, 27129, 27140, 27159, 27176, 27196, 27214, + 27226, 27240, 27254, 27266, 27283, 27302, 27320, 27332, 27350, 27369, + 16990, 27382, 27402, 27414, 12148, 27426, 27431, 27436, 27441, 27450, + 27456, 27461, 27465, 27472, 27478, 27482, 27487, 27492, 27497, 27502, + 27507, 27512, 2411, 27517, 27523, 27527, 27530, 27541, 27545, 27548, + 27556, 27562, 14421, 27566, 27575, 27586, 27592, 27598, 27613, 27622, + 27630, 27637, 27642, 27646, 27653, 27659, 27668, 27676, 27683, 27693, + 27702, 27712, 27717, 27726, 27735, 27746, 27757, 27767, 27784, 4442, + 27794, 27798, 27808, 27816, 27826, 27837, 27843, 27848, 27858, 27866, + 27873, 27879, 27886, 27891, 26329, 27895, 27904, 27908, 27911, 27916, + 27924, 27931, 27940, 27948, 27956, 27964, 27974, 27983, 27989, 27995, + 28001, 28005, 26334, 26339, 28009, 28019, 28029, 28039, 28047, 28054, + 28064, 28072, 28080, 28086, 28094, 773, 28103, 17191, 625, 28117, 28126, + 28134, 28145, 28156, 28166, 28175, 28187, 28196, 28205, 28212, 28218, + 28228, 28237, 28246, 28254, 28262, 28272, 28280, 28288, 28295, 28301, + 28306, 28311, 28316, 7928, 28321, 28324, 28328, 28333, 28339, 28344, + 28348, 11157, 26352, 26357, 28356, 28362, 28368, 28373, 28378, 28382, + 28390, 28396, 28402, 28406, 3811, 28414, 28419, 28424, 28428, 28432, + 11286, 28439, 28447, 28461, 28468, 28475, 28481, 11295, 11301, 28489, + 28497, 28504, 28509, 28514, 26362, 28520, 28531, 28535, 28540, 2660, + 28545, 28556, 28562, 28567, 28571, 28575, 28578, 28585, 28592, 28598, + 28606, 28613, 28619, 28623, 7968, 28628, 28632, 28636, 28644, 28649, + 28654, 28659, 1685, 28664, 28669, 28674, 28679, 28684, 28689, 28694, + 28699, 28704, 28709, 28714, 28719, 28724, 28729, 28735, 28740, 28745, + 28750, 28755, 28760, 28765, 28771, 28776, 28781, 28786, 28791, 28796, + 28801, 28806, 28812, 28818, 28823, 28829, 28834, 28839, 5, 28845, 28849, + 28853, 28857, 28862, 28866, 28870, 28874, 28878, 28883, 28887, 28892, + 28896, 28899, 28903, 28908, 28912, 28917, 28921, 28925, 28929, 28934, + 28938, 28942, 28952, 28957, 28961, 28965, 28970, 28975, 28984, 28989, + 28994, 28998, 29002, 29011, 29024, 29036, 29045, 29054, 29059, 29065, + 29070, 29074, 29078, 29088, 29097, 29105, 29111, 29116, 29120, 29127, + 29137, 29146, 29154, 12505, 29162, 29170, 29179, 29188, 29196, 29206, + 29211, 29215, 29219, 29222, 29224, 29228, 29232, 29237, 29242, 29246, + 29250, 29253, 29257, 29260, 29264, 29267, 29270, 29274, 29280, 29284, + 29288, 29292, 29296, 29301, 29306, 29311, 29315, 29318, 29323, 29329, + 29334, 29340, 29345, 29349, 29355, 29359, 29363, 29368, 29372, 29377, + 29382, 29386, 29390, 29397, 29401, 29404, 29408, 29412, 29418, 29424, + 29428, 29432, 29437, 29444, 29450, 29454, 29463, 29467, 29471, 29474, + 29480, 29485, 29491, 1385, 1737, 29496, 29501, 29506, 29511, 29516, + 29521, 29526, 2118, 799, 29531, 29534, 29538, 29542, 29547, 29551, 17203, + 29555, 29560, 29565, 29569, 29572, 29577, 29581, 29586, 29590, 17207, + 29595, 29598, 29601, 29607, 29611, 29616, 29620, 29633, 29637, 29640, + 29648, 29657, 29664, 29669, 29675, 29681, 29689, 29696, 29703, 29707, + 29711, 29715, 29720, 29725, 29729, 29737, 29742, 29749, 29761, 29772, + 29777, 29781, 29788, 29792, 29797, 29803, 29806, 29811, 29816, 29823, + 29827, 29831, 29834, 29840, 8659, 2318, 29844, 29849, 29865, 10749, + 29885, 29894, 29910, 29914, 29921, 29924, 29930, 29940, 29946, 29955, + 29970, 29981, 29993, 30004, 30012, 30021, 30027, 30036, 30046, 30056, + 30067, 30078, 30088, 30097, 30104, 30113, 30121, 30128, 30135, 30143, + 30150, 30157, 30170, 30177, 30185, 30192, 30198, 30203, 30212, 30219, + 30225, 30230, 30238, 30246, 30253, 30260, 27818, 30272, 30284, 30298, + 30306, 30314, 30322, 30329, 30341, 30350, 30359, 30367, 30375, 30383, + 30390, 30396, 30405, 30413, 30423, 30432, 30442, 30451, 30460, 30468, + 30473, 30477, 30480, 30484, 30488, 30492, 30496, 30500, 30506, 30512, + 30517, 30525, 17265, 30532, 30537, 30544, 30550, 30556, 30563, 13589, + 30570, 30573, 30585, 30593, 30599, 30604, 30608, 30619, 30629, 30639, + 11225, 30648, 30657, 30665, 30675, 30684, 30691, 30698, 30706, 30710, + 17284, 30713, 30720, 30724, 4386, 30730, 30733, 30740, 30746, 30751, + 30758, 30764, 30768, 30773, 30777, 30786, 30793, 30799, 8712, 30806, + 30814, 30821, 30827, 30832, 30838, 30844, 30852, 30858, 30862, 30865, + 30867, 30485, 11238, 30876, 30881, 30887, 30897, 30902, 30909, 30917, + 30923, 30928, 30933, 30938, 30942, 30947, 30954, 30960, 30969, 30977, + 30981, 30988, 30994, 31003, 31009, 31016, 4645, 31022, 31028, 31033, + 31040, 31052, 31063, 31068, 31076, 31080, 31090, 31096, 31100, 31105, + 31115, 31124, 31128, 31135, 31143, 31150, 31156, 31161, 31169, 31176, + 31181, 31188, 31200, 31209, 31213, 15195, 31221, 31231, 31235, 31243, + 31250, 31257, 29644, 31268, 31273, 31277, 31284, 31291, 26014, 30410, + 31296, 31300, 31303, 27146, 31308, 31322, 31338, 31356, 31375, 31392, + 31410, 27165, 31427, 31447, 27182, 31459, 31471, 18478, 31483, 27202, + 31497, 31509, 12161, 31523, 31528, 31533, 31538, 31544, 31550, 31556, + 31560, 31568, 31574, 31581, 31586, 31596, 31602, 11723, 31608, 31610, + 31615, 31623, 31627, 30950, 31633, 31640, 13437, 13447, 31647, 31654, + 31664, 31669, 31673, 31676, 31682, 31690, 31702, 31712, 31728, 31741, + 31755, 18496, 31769, 31776, 31780, 31783, 31788, 31792, 31799, 31806, + 31813, 31820, 31830, 31835, 31840, 31845, 31853, 31861, 31866, 31875, + 27839, 3466, 31880, 31883, 31886, 31891, 31898, 31903, 31908, 31924, + 31932, 31940, 10513, 31948, 31953, 31957, 31963, 31968, 31974, 31977, + 31983, 31995, 32003, 32010, 32016, 32023, 32034, 32048, 32061, 32067, + 32076, 32082, 32091, 32103, 32114, 32124, 32133, 32142, 32150, 32161, + 656, 32168, 32175, 32181, 32186, 32192, 32199, 32205, 32216, 32226, + 32236, 32245, 32251, 32258, 32263, 32271, 32278, 32286, 32294, 32306, + 6917, 32313, 32316, 32325, 32333, 32339, 32345, 32350, 32354, 32357, + 32363, 32370, 32375, 32380, 32385, 32389, 32401, 32412, 32421, 32429, + 17466, 32434, 32442, 32447, 32455, 32461, 32467, 13430, 9509, 32472, + 32476, 32480, 32483, 32486, 32492, 32500, 32508, 32512, 32516, 32521, + 32525, 32528, 32537, 32542, 32546, 32549, 32554, 32562, 32573, 32582, + 32586, 32592, 32598, 32602, 32608, 32616, 32638, 32662, 32673, 32682, + 32688, 32695, 32702, 32708, 32716, 32722, 32727, 32738, 32756, 32763, + 32771, 32775, 32782, 32787, 32796, 32809, 32817, 32829, 32840, 32851, + 32861, 32875, 32884, 32892, 32904, 10766, 32915, 32926, 32937, 32949, + 32959, 32968, 32978, 32983, 32987, 32995, 33006, 33016, 33022, 33027, + 33031, 33034, 33037, 33045, 33053, 33062, 33072, 33081, 33087, 33101, + 2743, 33123, 33134, 33143, 33153, 33165, 33174, 33183, 33193, 33201, + 33209, 33218, 33223, 33234, 33239, 33248, 33254, 33265, 33269, 33272, + 33282, 33291, 33299, 33309, 33319, 33327, 33336, 33343, 33351, 33358, + 33367, 33376, 33381, 33386, 33390, 33398, 33405, 33409, 33417, 33424, + 33435, 33450, 33457, 33463, 33473, 33482, 33488, 33499, 33503, 33510, + 33514, 33521, 33527, 16340, 33533, 33537, 33542, 33548, 33555, 33559, + 33563, 33571, 33579, 33585, 33594, 33601, 33608, 33613, 33618, 33628, + 27893, 33632, 33635, 33640, 33645, 33650, 33655, 33660, 33665, 33670, + 33675, 33681, 33686, 33691, 33697, 1102, 757, 33702, 33709, 33718, 2366, + 33725, 33730, 33734, 33740, 1151, 604, 33745, 328, 33749, 33758, 33766, + 33775, 33783, 33790, 33801, 33809, 33818, 33826, 33836, 33844, 33849, + 11393, 33853, 33861, 33869, 33874, 17220, 4000, 33880, 33886, 33892, + 6459, 33897, 33901, 33908, 33914, 33920, 33924, 33930, 33935, 33942, + 1344, 33948, 33955, 33959, 1251, 6467, 33964, 33974, 33982, 33988, 33998, + 34007, 34015, 34021, 34026, 34034, 34041, 12947, 34047, 34054, 34059, + 34066, 34076, 1404, 251, 2117, 34082, 34088, 34095, 34106, 34117, 34125, + 34132, 34142, 34151, 34159, 34168, 34175, 34182, 34195, 34202, 34208, + 34219, 34238, 34243, 1156, 34247, 34252, 34260, 3883, 34264, 34269, + 34273, 34277, 1348, 29251, 34287, 34291, 34296, 34300, 34306, 3745, + 34312, 34320, 34327, 34338, 34347, 34355, 34380, 34388, 34393, 3884, 391, + 34399, 34407, 34415, 34422, 34428, 34433, 2186, 12363, 34440, 34446, + 30769, 31058, 34452, 632, 106, 34456, 34460, 34466, 747, 10386, 34471, + 34478, 34484, 34488, 34492, 1549, 34495, 34499, 17734, 34502, 34507, + 34514, 34520, 8725, 34525, 34533, 34540, 34546, 26524, 34550, 34554, + 34558, 34562, 3954, 19566, 34566, 34571, 34575, 34578, 34586, 34594, + 34599, 34608, 34616, 34619, 34626, 34636, 34648, 34656, 34661, 34665, + 34673, 34680, 34686, 34693, 34700, 34703, 34707, 34711, 1359, 34721, + 34723, 34728, 34734, 34740, 34745, 34750, 34755, 34760, 34765, 34770, + 34775, 34780, 34785, 34790, 34795, 34800, 34805, 34810, 34816, 34822, + 34828, 34834, 34839, 34844, 34849, 34855, 34860, 34865, 34870, 34876, + 34881, 34887, 34892, 34897, 34902, 34907, 34913, 34918, 34924, 34929, + 34934, 34939, 34944, 34950, 34955, 34961, 34966, 34971, 34976, 34981, + 34986, 34991, 34996, 35001, 35006, 35012, 35018, 35024, 35029, 35034, + 35039, 35044, 35050, 35056, 35062, 35068, 35074, 35080, 35085, 35091, + 35096, 35101, 35106, 35111, 35117, 2457, 35122, 2464, 2471, 2867, 35127, + 2477, 2487, 35133, 2519, 2524, 2529, 35137, 35142, 35147, 35153, 35158, + 35163, 35167, 35172, 35178, 35183, 35188, 35193, 35199, 35204, 35208, + 35212, 35217, 35222, 35227, 35232, 35237, 35243, 35249, 35254, 35258, + 35263, 35269, 35273, 35278, 35283, 35288, 35293, 35297, 35300, 35305, + 35310, 35315, 35320, 35325, 35331, 35337, 35342, 35347, 35352, 35356, + 35361, 35366, 35371, 35376, 35381, 35386, 35390, 35395, 35400, 35405, + 35409, 35413, 35417, 35422, 35430, 35435, 35440, 35446, 35452, 35458, + 35463, 35471, 35475, 35478, 35483, 35488, 35492, 35497, 35502, 35506, + 35511, 35515, 35518, 35523, 4096, 21057, 35528, 35533, 35538, 35543, + 35551, 25222, 33952, 10025, 35556, 35561, 35565, 35570, 35574, 35578, + 35583, 35587, 35590, 35593, 35597, 35602, 35606, 35614, 35618, 35621, + 35626, 35630, 35634, 35639, 35644, 35648, 35654, 35659, 35664, 35671, + 35678, 35682, 35685, 35691, 35700, 35707, 35715, 35722, 35726, 35731, + 35735, 35739, 35745, 35750, 35756, 35760, 35766, 35771, 35776, 35780, + 35787, 35793, 35799, 35805, 35811, 35818, 35824, 35830, 35836, 35842, + 35848, 35854, 35860, 35867, 35873, 35880, 35886, 35892, 35898, 35904, + 35910, 35916, 35922, 35928, 35934, 35940, 35945, 35950, 13302, 35955, + 35961, 35966, 35971, 35976, 35981, 35984, 35990, 35995, 36003, 36008, + 36012, 36017, 36023, 36032, 36038, 36043, 36048, 36053, 36057, 36062, + 36066, 36071, 36076, 36081, 36086, 36093, 36100, 36106, 36112, 36117, + 19185, 36124, 36130, 36137, 36143, 36149, 36154, 36162, 36167, 10931, + 36171, 36176, 36181, 36187, 36192, 36197, 36201, 36206, 36211, 36217, + 36222, 36227, 36232, 36236, 36241, 36246, 36250, 36255, 36260, 36264, + 36269, 36273, 36278, 36283, 36288, 36292, 36297, 36301, 36306, 36310, + 36314, 36318, 17890, 36323, 36330, 36339, 36345, 36351, 36360, 36368, + 36377, 36385, 36390, 36394, 36401, 36407, 36415, 36419, 36422, 36427, + 36431, 36440, 36448, 36466, 36472, 1403, 36478, 36481, 36485, 26664, + 26670, 36491, 36495, 36506, 36517, 36528, 36540, 36544, 36551, 36558, + 36565, 36570, 36574, 36582, 36587, 36592, 36597, 36602, 6524, 1076, + 25221, 36607, 36612, 36616, 36621, 36625, 36631, 36636, 36642, 36647, + 36653, 36658, 36664, 36669, 36675, 36681, 36687, 36692, 36648, 36654, + 36696, 36701, 36707, 36712, 36718, 36723, 36729, 36734, 36659, 12014, + 36738, 36670, 36676, 36682, 2959, 3659, 36744, 36747, 36752, 36758, + 36764, 36770, 36777, 36783, 36789, 36795, 36801, 36807, 36813, 36819, + 36825, 36831, 36837, 36843, 36849, 36856, 36862, 36868, 36874, 36880, + 36886, 36889, 36894, 36897, 36904, 36909, 36917, 36921, 36926, 36931, + 36937, 36942, 36947, 36951, 36956, 36962, 36967, 36973, 36978, 36984, + 36989, 36995, 37001, 37005, 37010, 37015, 37020, 37025, 37029, 37034, + 37039, 37044, 37050, 37056, 37062, 37068, 37073, 37077, 37080, 37086, + 37092, 37101, 37109, 37116, 37121, 37125, 37129, 37134, 17680, 37139, + 37147, 37153, 4042, 1261, 37158, 37162, 8775, 37168, 37174, 37181, 8784, + 37185, 37191, 37197, 37204, 37210, 37219, 37227, 37239, 37243, 37250, + 37256, 37261, 37265, 37269, 37272, 37282, 37291, 37299, 36649, 37304, + 37314, 37324, 37334, 37340, 37345, 37355, 37360, 37373, 37387, 37398, + 37410, 37422, 37436, 37449, 37461, 37473, 17031, 37487, 37492, 37497, + 37501, 37505, 37509, 37513, 37519, 37524, 37529, 37534, 37539, 37544, + 37549, 1726, 32112, 37554, 37559, 37564, 36697, 37569, 37572, 37577, + 37582, 37587, 37593, 37599, 18802, 11589, 37604, 37610, 37617, 18430, + 37623, 37628, 37633, 37637, 37642, 37647, 36702, 37652, 37657, 37662, + 37668, 36708, 37673, 37676, 37683, 37691, 37697, 37703, 37709, 37720, + 37725, 37732, 37739, 37746, 37754, 37763, 37772, 37778, 37784, 37792, + 36713, 37797, 37803, 37809, 36719, 37814, 37819, 37827, 37835, 37841, + 37848, 37854, 37861, 37868, 37874, 37882, 37892, 37899, 37905, 37910, + 37916, 37921, 37926, 37933, 37942, 37950, 37955, 37961, 37968, 37976, + 37982, 37987, 37993, 38002, 38009, 33067, 38015, 38019, 38024, 38033, + 38038, 38043, 38048, 14511, 38056, 38061, 38066, 38071, 38075, 38080, + 38085, 38092, 38097, 38102, 38107, 36724, 25150, 38113, 2560, 155, 38116, + 38119, 38123, 38127, 38137, 38145, 38152, 38156, 38160, 38163, 38171, + 38178, 38185, 31012, 38194, 38197, 38204, 38210, 38217, 38221, 38229, + 38237, 38244, 38248, 38252, 38255, 38261, 38268, 38272, 38276, 38283, + 38291, 38299, 38306, 36660, 38313, 38321, 38326, 38338, 11670, 11677, + 11684, 11691, 11698, 11705, 589, 416, 38344, 38349, 38354, 38360, 38365, + 38370, 4063, 38375, 38378, 38383, 38388, 38393, 38398, 38403, 38410, + 26782, 38415, 38420, 38425, 38430, 38435, 38441, 38446, 38452, 36900, + 38458, 38463, 38469, 38475, 38485, 38490, 38495, 38499, 38504, 38509, + 38514, 38519, 38532, 38537, 26402, 19648, 1026, 38541, 38547, 38551, + 38556, 38561, 38567, 38572, 38577, 38581, 38586, 38591, 38597, 38602, + 38607, 1266, 38611, 38616, 38621, 38626, 38630, 38635, 38640, 38645, + 38651, 38657, 38662, 38666, 38670, 38675, 38680, 38685, 38689, 38694, + 38702, 38706, 38712, 38716, 38723, 38732, 19419, 36671, 38738, 38745, + 38753, 38760, 38766, 38779, 38791, 38796, 38802, 38806, 2886, 38810, + 38814, 38263, 38823, 38834, 38845, 38850, 33130, 38855, 38860, 38864, + 33250, 26675, 38869, 38873, 38878, 36677, 25257, 38882, 38887, 38893, + 38898, 38902, 38906, 38909, 38913, 38919, 38928, 38939, 38951, 36683, + 38956, 38959, 38963, 38967, 38972, 38977, 38982, 38987, 38992, 38997, + 39002, 39007, 359, 39012, 39017, 39022, 39027, 39032, 39037, 39043, + 39048, 39053, 39059, 39064, 39070, 39075, 39081, 39086, 39091, 39096, + 39101, 39106, 39111, 39116, 39121, 39127, 39132, 39137, 39142, 39147, + 39152, 39157, 39162, 39168, 39174, 39179, 39184, 39189, 39194, 39199, + 39204, 39209, 39214, 39219, 39224, 39229, 39234, 39239, 39244, 39249, + 39254, 39259, 39264, 39274, 39284, 39290, 343, 14, 39295, 39299, 39303, + 39311, 39315, 39319, 39322, 16460, 39325, 39330, 39334, 39339, 39343, + 39348, 39352, 39357, 39361, 39364, 39366, 39370, 39375, 39379, 39390, + 39393, 39395, 39399, 39411, 39423, 39432, 39436, 39446, 39450, 39456, + 39461, 39470, 39476, 39481, 39486, 39490, 39494, 39499, 39506, 39511, + 39517, 39522, 39526, 39533, 30418, 30428, 39537, 39542, 39547, 39552, + 39559, 39563, 39570, 39576, 8930, 39580, 39589, 39597, 39612, 39626, + 39635, 39643, 39654, 39663, 39668, 39675, 39685, 7937, 39695, 39700, + 39705, 39709, 39712, 39717, 39721, 39726, 39730, 39737, 39742, 39747, + 39752, 39762, 39767, 39772, 39777, 9895, 39782, 39784, 39792, 39795, + 39798, 39800, 39804, 39810, 39814, 39819, 39824, 39842, 39856, 39875, + 39892, 39901, 39909, 39914, 39919, 1396, 39925, 39931, 39936, 39946, + 39955, 39963, 39968, 39974, 39979, 39988, 39997, 40008, 40013, 40020, + 40026, 40030, 40039, 40046, 40054, 40061, 40074, 40082, 40086, 40096, + 40101, 40105, 40113, 40121, 40126, 40130, 40134, 40143, 40149, 40154, + 40162, 40172, 40181, 40190, 40199, 40210, 40218, 40229, 40238, 40246, + 40253, 40259, 40264, 40275, 40286, 40291, 40295, 40298, 40302, 40310, + 40316, 40327, 40338, 40349, 40360, 40371, 40382, 40393, 40404, 40416, + 40428, 40440, 40452, 40464, 40476, 40488, 40497, 40501, 40509, 40515, + 40521, 40528, 40534, 40539, 40545, 40549, 40554, 40559, 40564, 39269, + 39279, 2431, 40569, 40571, 40576, 40581, 40586, 40589, 40591, 40595, + 40598, 40605, 40609, 11249, 40613, 40619, 40626, 40636, 40641, 40647, + 40651, 40656, 40669, 30892, 40675, 40684, 40693, 21280, 40700, 40709, + 37320, 40717, 40722, 40726, 40735, 40743, 40750, 40755, 40759, 40764, + 40769, 40777, 40781, 40789, 40795, 40801, 40806, 40811, 40815, 40818, + 40823, 40836, 40852, 27272, 40869, 40881, 40898, 40910, 40924, 27289, + 27308, 40936, 40948, 2760, 40962, 40967, 40972, 40977, 40981, 40988, + 41000, 41007, 41016, 41019, 41030, 41041, 41049, 41054, 41058, 41063, + 41068, 41073, 41078, 41083, 41088, 37789, 956, 41093, 41097, 41101, + 41104, 41109, 41114, 41120, 41125, 41130, 41136, 41142, 41147, 41151, + 41156, 41161, 41166, 41170, 41173, 41179, 41184, 41189, 41194, 41198, + 41203, 41209, 41217, 31193, 41222, 41227, 41234, 41240, 41246, 41251, + 41259, 26791, 41266, 41271, 41276, 41281, 41285, 41288, 41293, 41297, + 41301, 41308, 41314, 41320, 41326, 41333, 41338, 41344, 40116, 41348, + 41352, 41357, 41370, 41375, 41381, 41389, 41396, 41404, 41414, 41420, + 41426, 41432, 41436, 41445, 41453, 41460, 41465, 41470, 12037, 41475, + 41485, 41492, 41498, 41508, 41513, 41519, 41527, 3916, 41534, 41541, + 41547, 41554, 3922, 41558, 41563, 41574, 41581, 41587, 41596, 41600, + 4494, 41603, 41610, 41616, 41622, 41630, 41640, 34423, 41647, 41655, + 41661, 41666, 41672, 41677, 41681, 30736, 41687, 41694, 41700, 41708, + 41717, 41724, 41730, 41741, 28091, 41747, 41757, 41762, 41766, 41774, + 41782, 41789, 41795, 41800, 10889, 6499, 41805, 41809, 41811, 41815, + 41820, 41822, 41827, 41833, 41838, 41843, 41850, 38406, 41856, 41861, + 41865, 41870, 41874, 41883, 41887, 41893, 41900, 41906, 41913, 41918, + 41927, 41932, 41936, 41941, 41948, 41956, 41964, 41969, 25313, 41973, + 41976, 41980, 41984, 12460, 983, 41988, 41993, 42001, 42006, 42010, + 42019, 42026, 42030, 42034, 42042, 42049, 15793, 42059, 42063, 42067, + 42075, 42083, 42089, 42094, 42098, 42107, 15541, 42113, 42122, 42129, + 42134, 42141, 42148, 42156, 42163, 42171, 42179, 42188, 42193, 42200, + 42207, 42214, 42221, 42228, 42233, 42240, 42246, 42263, 42271, 42281, + 42289, 42296, 459, 42300, 42306, 42310, 42315, 39659, 42321, 42324, + 42328, 42334, 42345, 42353, 3927, 42361, 42367, 42373, 42383, 42389, + 42398, 42407, 42417, 42424, 42430, 42435, 3933, 3939, 42444, 42452, + 42459, 13907, 42467, 42471, 42478, 42486, 42493, 42500, 42506, 42515, + 42525, 42531, 42539, 42548, 42555, 42563, 42570, 26077, 42574, 42581, + 42587, 42597, 42606, 42614, 42625, 42629, 42639, 42646, 42651, 42656, + 42662, 42669, 42677, 42686, 42695, 42705, 42716, 42723, 42728, 42735, + 3174, 42743, 42749, 42754, 42761, 42767, 42773, 42778, 42791, 42804, + 42817, 42824, 42830, 42838, 42846, 42851, 42855, 42859, 42864, 42869, + 42874, 42879, 42884, 42889, 1365, 42894, 42898, 42902, 42906, 42910, + 42914, 42918, 42922, 42926, 42930, 42934, 42938, 42942, 42946, 42950, + 42954, 42958, 42962, 42966, 42970, 42974, 42978, 42982, 42986, 42990, + 42994, 42998, 43002, 43006, 43010, 43014, 43018, 43022, 43026, 43030, + 43034, 43038, 43042, 43046, 43050, 43054, 43058, 43062, 43066, 43070, + 43074, 43078, 43082, 43086, 43090, 43094, 43098, 43102, 43106, 43110, + 43114, 43118, 43122, 43126, 43130, 43134, 43138, 43142, 43146, 43150, + 43154, 43158, 43162, 43166, 43170, 43174, 43178, 43182, 43186, 43190, + 43194, 43198, 43202, 43206, 43210, 43214, 43218, 43222, 43226, 43230, + 43234, 43238, 43242, 43246, 43250, 43254, 43258, 43262, 43266, 43270, + 43274, 43278, 43282, 43286, 43290, 43294, 43298, 43302, 43306, 43310, + 43314, 43318, 43322, 43326, 43330, 43334, 43338, 43342, 43346, 43350, + 43354, 43358, 43362, 43366, 43370, 43374, 43378, 43382, 43386, 43390, + 43394, 43398, 43402, 43406, 43410, 43414, 43418, 43422, 43426, 43430, + 43434, 43438, 43442, 43446, 43450, 43454, 43458, 43462, 43466, 43470, + 43474, 43478, 43482, 43486, 43490, 43494, 43498, 43502, 43506, 43511, + 43515, 43520, 43524, 43529, 43533, 43538, 43542, 43548, 43553, 43557, + 43562, 43566, 43571, 43575, 43580, 43584, 43589, 43593, 43598, 43602, + 43607, 43611, 43617, 43623, 43628, 43632, 43637, 43641, 43647, 43652, + 43656, 43661, 43665, 43670, 43674, 43680, 43685, 43689, 43694, 43698, + 43703, 43707, 43712, 43716, 43722, 43727, 43731, 43736, 43740, 43746, + 43751, 43755, 43760, 43764, 43769, 43773, 43778, 43782, 43787, 43791, + 43797, 43802, 43806, 43812, 43817, 43821, 43827, 43832, 43836, 43841, + 43845, 43850, 43854, 43860, 43866, 43872, 43878, 43884, 43890, 43896, + 43902, 43907, 43911, 43916, 43920, 43926, 43931, 43935, 43940, 43944, + 43949, 43953, 43958, 43962, 43967, 43971, 43976, 43980, 43985, 43989, + 43995, 44000, 44004, 44009, 44013, 44019, 44025, 44030, 127, 63, 44034, + 44036, 44040, 44044, 44048, 44053, 44057, 44061, 44066, 10802, 44071, + 44077, 1671, 6956, 44083, 44086, 44091, 44095, 44100, 44104, 44108, + 44113, 11821, 44117, 44121, 44125, 593, 44129, 17999, 44134, 44138, + 44143, 44148, 44153, 44157, 44164, 44170, 30924, 44176, 44179, 44183, + 44188, 44194, 44198, 44201, 44209, 44215, 44220, 44224, 44227, 44231, + 44237, 44241, 44245, 3710, 3715, 14623, 44248, 44252, 44256, 44260, + 44264, 44272, 44279, 44283, 15491, 44290, 44304, 44311, 44322, 378, + 44327, 44331, 44337, 44349, 44355, 44361, 44366, 44372, 44376, 34696, + 44385, 44391, 44400, 44404, 44408, 44413, 44419, 44424, 44428, 44433, + 44437, 44441, 44448, 44454, 44459, 44470, 44485, 44500, 44515, 44531, + 44549, 11735, 44563, 44570, 44574, 44577, 44586, 44591, 44595, 44603, + 18633, 44611, 44615, 44625, 44636, 34621, 999, 44649, 44658, 44676, + 44695, 44704, 44712, 44720, 11084, 11934, 44724, 26687, 44727, 35610, + 44732, 11083, 44737, 44743, 44748, 44754, 44759, 44765, 44770, 44776, + 44781, 44787, 44793, 44799, 44804, 44760, 44766, 44808, 44771, 44777, + 44782, 44813, 44788, 44794, 8943, 4319, 44819, 44827, 44831, 44834, + 44841, 44845, 44850, 44855, 44862, 44868, 44874, 44879, 17312, 44883, + 30753, 44887, 44891, 44895, 44901, 44905, 33001, 44914, 10058, 44918, + 10484, 44921, 44928, 44934, 44938, 13932, 44945, 44951, 44956, 44963, + 44970, 44977, 33770, 8840, 44984, 44991, 44998, 45004, 45009, 45016, + 45027, 45033, 45038, 45043, 45048, 45052, 45057, 45064, 44761, 45068, + 45078, 45087, 45098, 45104, 45112, 45119, 45124, 45129, 45134, 45139, + 45144, 45148, 45152, 45159, 45165, 45173, 2321, 29847, 11837, 11849, + 11854, 11860, 45182, 11865, 11870, 11876, 45187, 45197, 45201, 11881, + 45206, 19846, 45209, 45214, 45218, 41011, 45229, 45234, 45241, 45248, + 45252, 45255, 45263, 11748, 45270, 45273, 45279, 45289, 6557, 45298, + 45303, 45309, 45313, 45321, 45325, 45335, 45341, 45346, 45357, 45366, + 45375, 45384, 45393, 45402, 45411, 45420, 45426, 45432, 45437, 45443, + 45449, 45455, 45460, 45463, 45470, 45476, 45480, 45485, 45492, 45499, + 45503, 45506, 45516, 45529, 45538, 45547, 45558, 45571, 45583, 45594, + 45603, 45614, 45619, 45628, 45633, 11886, 45639, 45646, 45654, 45661, + 45666, 45671, 30970, 45675, 45682, 4259, 25, 45686, 45691, 19695, 45695, + 45698, 45701, 33187, 45705, 33779, 45713, 45717, 45721, 45724, 45730, + 45736, 45741, 36748, 45750, 45758, 45764, 45771, 33170, 45775, 33401, + 45779, 45788, 45792, 45800, 45806, 45812, 45817, 45821, 33805, 45827, + 45830, 45838, 45846, 4646, 45852, 45856, 45860, 45865, 45872, 45878, + 45883, 45888, 45892, 45898, 45903, 45909, 4547, 788, 45916, 45920, 45923, + 45935, 45942, 45947, 17872, 45951, 45959, 45967, 45975, 45983, 45990, + 45998, 46006, 46013, 46021, 46029, 46037, 46045, 46053, 46061, 46069, + 46077, 46085, 46093, 46101, 46108, 46116, 46124, 46132, 46140, 46148, + 46156, 46164, 46172, 46180, 46188, 46196, 46204, 46212, 46220, 46228, + 46236, 46244, 46252, 46260, 46267, 46275, 46282, 46290, 46298, 46306, + 46314, 46322, 46330, 46338, 46346, 46357, 26113, 46362, 46365, 46372, + 46376, 46382, 46386, 46392, 46397, 46403, 46408, 46413, 46417, 46421, + 46428, 46436, 46441, 46446, 46456, 46462, 46475, 46481, 46487, 46493, + 46496, 46503, 46508, 46514, 46519, 19591, 930, 46524, 46527, 46530, + 46533, 36832, 36838, 46536, 36844, 36857, 36863, 36869, 46542, 36875, + 36881, 46548, 46554, 10, 46562, 46569, 46573, 46577, 46585, 37678, 46589, + 46593, 46600, 46605, 46609, 46614, 46620, 46625, 46631, 46636, 46640, + 46644, 46648, 46653, 46657, 46662, 46666, 46670, 46677, 46682, 46686, + 46690, 46695, 46699, 46704, 46708, 46712, 46717, 46723, 18156, 18161, + 46728, 46732, 46735, 46741, 46745, 46749, 25107, 46754, 46758, 46764, + 46771, 46777, 46782, 39688, 46792, 46797, 46805, 46809, 46812, 37693, + 46816, 4612, 46821, 46826, 46830, 46835, 46839, 46844, 15559, 46855, + 46859, 46862, 46866, 46871, 46875, 46880, 46885, 46889, 46893, 46897, + 46900, 46904, 46907, 46912, 46917, 46922, 46927, 46932, 46937, 8430, + 15575, 46942, 46945, 46951, 46956, 46962, 46967, 46973, 46978, 46984, + 46989, 46995, 47001, 47007, 47012, 47016, 47020, 47027, 47036, 47052, + 47068, 47078, 33077, 47085, 47089, 47094, 47099, 47103, 47107, 42690, + 47113, 47118, 47122, 47129, 47134, 47139, 47143, 47146, 47150, 47156, + 31915, 47160, 25427, 47165, 47172, 47180, 47186, 47193, 47201, 47207, + 47211, 47216, 47222, 47230, 47235, 47239, 47248, 10783, 47256, 47260, + 47268, 47275, 47280, 47285, 47290, 47294, 47297, 47303, 47307, 47310, + 47314, 47321, 47326, 47330, 47336, 47340, 47346, 47351, 47356, 31293, + 36895, 47361, 47370, 47378, 47383, 47389, 47401, 47414, 47428, 47435, + 47441, 47447, 47452, 47460, 47463, 47465, 47472, 47479, 47485, 47489, + 8429, 47492, 47496, 47500, 47505, 47509, 47513, 47516, 47520, 47534, + 27338, 47553, 47566, 47579, 47592, 27356, 47607, 2713, 47622, 47628, + 47632, 47642, 47646, 47650, 47655, 47659, 47666, 47671, 47675, 47682, + 47688, 47693, 47699, 47709, 47721, 47732, 47737, 47744, 47748, 47752, + 47755, 47763, 18654, 4031, 47768, 18189, 47781, 47788, 47795, 47801, + 47805, 47809, 47814, 47820, 47825, 47831, 47835, 47839, 47842, 47847, + 47851, 47856, 47861, 47866, 47871, 47876, 47881, 47886, 47891, 47896, + 8484, 18200, 47901, 47905, 47911, 47920, 47925, 47934, 47941, 42521, + 47947, 47952, 47956, 47963, 47968, 47975, 47981, 47985, 47988, 47992, + 47997, 2791, 48004, 48011, 48015, 48018, 48023, 48028, 48034, 48039, + 48044, 48048, 48053, 48063, 48068, 48074, 48079, 45937, 48085, 48091, + 48101, 48106, 48111, 48115, 48120, 48125, 7939, 7951, 48130, 48133, + 48140, 48146, 48155, 9975, 40256, 48163, 48167, 48171, 37741, 48179, + 48190, 48198, 42738, 48205, 48210, 48215, 48226, 48233, 48244, 37765, + 25444, 48252, 1054, 48257, 15982, 48263, 33161, 48269, 48274, 48284, + 48293, 48300, 48306, 48310, 48313, 48320, 48326, 48333, 48339, 48349, + 48357, 48363, 48369, 48374, 48378, 48385, 48390, 48396, 48403, 48409, + 47501, 48414, 48418, 16024, 16033, 16042, 16051, 16060, 16089, 646, + 16098, 48424, 48429, 48432, 48438, 48446, 1283, 48451, 48455, 48460, + 48465, 48470, 48477, 48483, 48487, 48492, 48498, 48502, 36905, 48507, + 48512, 48521, 48528, 48538, 48544, 33205, 48561, 48570, 48578, 48584, + 48589, 48596, 48602, 48610, 48619, 48627, 48635, 48641, 48645, 48650, + 48658, 34302, 37774, 48664, 48683, 18557, 48697, 48713, 48727, 48733, + 48738, 48743, 48748, 48754, 37780, 48759, 48762, 48769, 48776, 48785, + 48790, 48794, 442, 3081, 48801, 48806, 48811, 32290, 48599, 48815, 48820, + 48828, 48832, 48835, 48840, 48846, 48852, 48857, 48861, 33278, 48864, + 48869, 48873, 48876, 48881, 48885, 48890, 48895, 48899, 48904, 48908, + 48912, 48916, 25103, 25114, 48921, 48926, 48932, 48937, 48943, 48949, + 31871, 48954, 48958, 48961, 48967, 48972, 48977, 48982, 48987, 48992, + 48997, 49002, 49007, 49013, 49019, 25200, 18864, 49024, 49029, 49034, + 49039, 49044, 49049, 49054, 49059, 450, 68, 36922, 36927, 36932, 36938, + 36943, 36948, 49064, 36952, 49068, 49072, 49076, 36957, 36963, 49090, + 36974, 36979, 49098, 49103, 36985, 49108, 49113, 49122, 49127, 49132, + 49141, 49147, 49153, 49159, 37002, 49172, 49181, 49187, 37006, 49191, + 37011, 49196, 37016, 37021, 49199, 49204, 49208, 49214, 15800, 49221, + 15810, 49228, 49233, 37026, 49237, 49242, 49247, 49252, 49257, 49261, + 49266, 49271, 49277, 49282, 49287, 49293, 49299, 49304, 49308, 49313, + 49318, 49323, 49327, 49332, 49337, 49342, 49348, 49354, 49360, 49365, + 49369, 49374, 49378, 37030, 37035, 37040, 49382, 49386, 49391, 49395, + 49407, 37045, 37051, 37057, 37069, 49413, 30790, 49417, 49422, 49426, + 49431, 49438, 49443, 49448, 49453, 49457, 49461, 49471, 49476, 49481, + 49485, 49489, 49492, 49500, 49505, 37117, 49509, 1375, 49515, 49520, + 49526, 49534, 49538, 49547, 49555, 49559, 49563, 49571, 49577, 49585, + 49601, 49605, 49609, 49613, 49618, 49624, 49639, 37154, 1679, 14140, + 49643, 1262, 1277, 49655, 49663, 49670, 49675, 49682, 49687, 10467, 977, + 2546, 11913, 49694, 10365, 49699, 49702, 49711, 1170, 49716, 47672, + 49723, 49732, 49737, 49741, 49749, 26737, 2602, 49756, 12413, 49766, + 49772, 2339, 2349, 49781, 49790, 49800, 49811, 3489, 40637, 49816, 4226, + 4237, 19629, 1175, 49820, 49828, 49835, 49840, 49844, 49848, 49853, + 28359, 47999, 12004, 49861, 49870, 49879, 49887, 49900, 49907, 49918, + 49923, 49936, 49949, 49961, 49973, 49985, 49996, 50009, 50020, 50031, + 50041, 50049, 50057, 50069, 50081, 50092, 50101, 50109, 50116, 50128, + 50135, 50141, 50150, 50156, 50163, 50176, 50181, 50191, 50196, 50202, + 50207, 44935, 50211, 47299, 50218, 50225, 50233, 50240, 2559, 50247, + 50258, 50268, 50277, 50285, 50295, 50303, 50312, 50322, 50331, 50336, + 50342, 50348, 4075, 50359, 50369, 50378, 50387, 50395, 50405, 50413, + 50422, 50427, 50432, 50437, 1604, 47, 50445, 50453, 50464, 50475, 19250, + 50485, 50489, 50496, 50502, 50507, 50511, 50522, 50532, 50541, 50552, + 19668, 19673, 50557, 50566, 50571, 50581, 50586, 50594, 50602, 50609, + 50615, 1566, 271, 50619, 50625, 50630, 50633, 2087, 2568, 50641, 50645, + 50648, 1420, 50654, 16289, 1180, 50659, 50672, 2702, 2723, 50686, 50698, + 50710, 2737, 2754, 2769, 2785, 2802, 50724, 50736, 2817, 50750, 1186, + 1192, 1198, 12284, 50755, 50760, 50765, 50769, 50784, 50799, 50814, + 50829, 50844, 50859, 50874, 50889, 50904, 50919, 50934, 50949, 50964, + 50979, 50994, 51009, 51024, 51039, 51054, 51069, 51084, 51099, 51114, + 51129, 51144, 51159, 51174, 51189, 51204, 51219, 51234, 51249, 51264, + 51279, 51294, 51309, 51324, 51339, 51354, 51369, 51384, 51399, 51414, + 51429, 51444, 51459, 51474, 51489, 51504, 51519, 51534, 51549, 51564, + 51579, 51594, 51609, 51624, 51639, 51654, 51669, 51684, 51699, 51714, + 51729, 51744, 51759, 51774, 51789, 51804, 51819, 51834, 51849, 51864, + 51879, 51894, 51909, 51924, 51939, 51954, 51969, 51984, 51999, 52014, + 52029, 52044, 52059, 52074, 52089, 52104, 52119, 52134, 52149, 52164, + 52179, 52194, 52209, 52224, 52239, 52254, 52269, 52284, 52299, 52314, + 52329, 52344, 52359, 52374, 52389, 52404, 52419, 52434, 52449, 52464, + 52479, 52494, 52509, 52524, 52539, 52554, 52569, 52584, 52599, 52614, + 52629, 52644, 52659, 52674, 52689, 52704, 52719, 52734, 52749, 52764, + 52779, 52794, 52809, 52824, 52839, 52854, 52869, 52884, 52899, 52914, + 52929, 52944, 52959, 52974, 52989, 53004, 53019, 53034, 53049, 53064, + 53079, 53094, 53109, 53124, 53139, 53154, 53169, 53184, 53199, 53214, + 53229, 53244, 53259, 53274, 53289, 53304, 53319, 53334, 53349, 53364, + 53379, 53394, 53409, 53424, 53439, 53454, 53469, 53484, 53499, 53514, + 53529, 53544, 53559, 53574, 53589, 53604, 53619, 53634, 53649, 53664, + 53679, 53694, 53709, 53724, 53739, 53754, 53769, 53784, 53799, 53814, + 53829, 53844, 53859, 53874, 53889, 53904, 53919, 53934, 53949, 53964, + 53979, 53994, 54009, 54024, 54039, 54054, 54069, 54084, 54099, 54114, + 54129, 54144, 54159, 54174, 54189, 54204, 54219, 54234, 54249, 54264, + 54279, 54294, 54309, 54324, 54339, 54354, 54369, 54384, 54399, 54414, + 54429, 54444, 54459, 54474, 54489, 54504, 54519, 54534, 54549, 54564, + 54579, 54594, 54609, 54624, 54639, 54654, 54669, 54684, 54699, 54714, + 54729, 54744, 54759, 54774, 54789, 54804, 54819, 54834, 54849, 54864, + 54879, 54894, 54909, 54924, 54939, 54954, 54969, 54984, 54999, 55014, + 55029, 55044, 55059, 55074, 55089, 55104, 55119, 55134, 55149, 55164, + 55179, 55194, 55209, 55224, 55239, 55254, 55269, 55284, 55299, 55314, + 55329, 55344, 55359, 55374, 55389, 55404, 55419, 55434, 55449, 55464, + 55479, 55494, 55509, 55524, 55539, 55554, 55569, 55584, 55599, 55614, + 55629, 55644, 55659, 55674, 55689, 55704, 55719, 55734, 55749, 55764, + 55779, 55794, 55809, 55824, 55839, 55854, 55869, 55884, 55899, 55914, + 55929, 55944, 55959, 55974, 55989, 56004, 56019, 56034, 56049, 56064, + 56079, 56094, 56109, 56124, 56139, 56154, 56169, 56184, 56199, 56214, + 56229, 56244, 56259, 56274, 56289, 56304, 56319, 56334, 56349, 56364, + 56379, 56394, 56409, 56424, 56439, 56454, 56469, 56484, 56499, 56514, + 56529, 56544, 56559, 56574, 56589, 56604, 56619, 56634, 56649, 56664, + 56679, 56694, 56709, 56724, 56739, 56754, 56769, 56784, 56799, 56814, + 56829, 56844, 56859, 56874, 56889, 56904, 56919, 56934, 56949, 56964, + 56979, 56994, 57009, 57024, 57039, 57054, 57069, 57084, 57099, 57114, + 57129, 57144, 57159, 57174, 57189, 57204, 57219, 57234, 57249, 57264, + 57279, 57294, 57309, 57324, 57339, 57354, 57369, 57384, 57399, 57414, + 57429, 57444, 57459, 57474, 57489, 57504, 57519, 57534, 57549, 57564, + 57579, 57594, 57609, 57624, 57639, 57654, 57669, 57684, 57699, 57714, + 57729, 57744, 57759, 57774, 57789, 57804, 57819, 57834, 57849, 57864, + 57879, 57894, 57909, 57924, 57939, 57954, 57969, 57984, 57999, 58014, + 58029, 58044, 58059, 58074, 58089, 58104, 58119, 58134, 58149, 58164, + 58179, 58194, 58209, 58224, 58239, 58254, 58269, 58284, 58299, 58314, + 58329, 58344, 58359, 58374, 58389, 58404, 58419, 58434, 58449, 58464, + 58479, 58494, 58509, 58524, 58539, 58554, 58569, 58584, 58600, 58616, + 58632, 58648, 58664, 58680, 58696, 58712, 58728, 58744, 58760, 58776, + 58792, 58808, 58824, 58840, 58856, 58872, 58888, 58904, 58920, 58936, + 58952, 58968, 58984, 59000, 59016, 59032, 59048, 59064, 59080, 59096, + 59112, 59128, 59144, 59160, 59176, 59192, 59208, 59224, 59240, 59256, + 59272, 59288, 59304, 59320, 59336, 59352, 59368, 59384, 59400, 59416, + 59432, 59448, 59464, 59480, 59496, 59512, 59528, 59544, 59560, 59576, + 59592, 59608, 59624, 59640, 59656, 59672, 59688, 59704, 59720, 59736, + 59752, 59768, 59784, 59800, 59816, 59832, 59848, 59864, 59880, 59896, + 59912, 59928, 59944, 59960, 59976, 59992, 60008, 60024, 60040, 60056, + 60072, 60088, 60104, 60120, 60136, 60152, 60168, 60184, 60200, 60216, + 60232, 60248, 60264, 60280, 60296, 60312, 60328, 60344, 60360, 60376, + 60392, 60408, 60424, 60440, 60456, 60472, 60488, 60504, 60520, 60536, + 60552, 60568, 60584, 60600, 60616, 60632, 60648, 60664, 60680, 60696, + 60712, 60728, 60744, 60760, 60776, 60792, 60808, 60824, 60840, 60856, + 60872, 60888, 60904, 60920, 60936, 60952, 60968, 60984, 61000, 61016, + 61032, 61048, 61064, 61080, 61096, 61112, 61128, 61144, 61160, 61176, + 61192, 61208, 61224, 61240, 61256, 61272, 61288, 61304, 61320, 61336, + 61352, 61368, 61384, 61400, 61416, 61432, 61448, 61464, 61480, 61496, + 61512, 61528, 61544, 61560, 61576, 61592, 61608, 61624, 61640, 61656, + 61672, 61688, 61704, 61720, 61736, 61752, 61768, 61784, 61800, 61816, + 61832, 61848, 61864, 61880, 61896, 61912, 61928, 61944, 61960, 61976, + 61992, 62008, 62024, 62040, 62056, 62072, 62088, 62104, 62120, 62136, + 62152, 62168, 62184, 62200, 62216, 62232, 62248, 62264, 62280, 62296, + 62312, 62328, 62344, 62360, 62376, 62392, 62408, 62424, 62440, 62456, + 62472, 62488, 62504, 62520, 62536, 62552, 62568, 62584, 62600, 62616, + 62632, 62648, 62664, 62680, 62696, 62712, 62728, 62744, 62760, 62776, + 62792, 62808, 62824, 62840, 62856, 62872, 62888, 62904, 62920, 62936, + 62952, 62968, 62984, 63000, 63016, 63032, 63048, 63064, 63080, 63096, + 63112, 63128, 63144, 63160, 63176, 63192, 63208, 63224, 63240, 63256, + 63272, 63288, 63304, 63320, 63336, 63352, 63368, 63384, 63400, 63416, + 63432, 63448, 63464, 63480, 63496, 63512, 63528, 63544, 63560, 63576, + 63592, 63608, 63624, 63640, 63656, 63672, 63688, 63704, 63720, 63736, + 63752, 63768, 63784, 63800, 63816, 63832, 63848, 63864, 63880, 63896, + 63912, 63928, 63944, 63960, 63976, 63992, 64008, 64024, 64040, 64056, + 64072, 64088, 64104, 64120, 64136, 64152, 64168, 64184, 64200, 64216, + 64232, 64248, 64264, 64280, 64296, 64312, 64328, 64344, 64360, 64376, + 64392, 64408, 64424, 64440, 64456, 64472, 64488, 64504, 64520, 64536, + 64552, 64568, 64584, 64600, 64616, 64632, 64648, 64664, 64680, 64696, + 64712, 64728, 64744, 64760, 64776, 64792, 64808, 64824, 64840, 64856, + 64872, 64888, 64904, 64920, 64936, 64952, 64968, 64984, 65000, 65016, + 65032, 65048, 65064, 65080, 65096, 65112, 65128, 65144, 65160, 65176, + 65192, 65208, 65224, 65240, 65256, 65272, 65288, 65304, 65320, 65336, + 65352, 65368, 65384, 65400, 65416, 65432, 65448, 65464, 65480, 65496, + 65512, 65528, 65544, 65560, 65576, 65592, 65608, 65624, 65640, 65656, + 65672, 65688, 65704, 65720, 65736, 65752, 65768, 65784, 65800, 65816, + 65832, 65848, 65864, 65880, 65896, 65912, 65928, 65944, 65960, 65976, + 65992, 66008, 66024, 66040, 66056, 66072, 66088, 66104, 66120, 66136, + 66152, 66168, 66184, 66200, 66216, 66232, 66248, 66264, 66280, 66296, + 66312, 66328, 66344, 66360, 66376, 66392, 66408, 66424, 66440, 66456, + 66472, 66488, 66504, 66520, 66536, 66552, 66568, 66584, 66600, 66616, + 66632, 66648, 66664, 66680, 66696, 66712, 66728, 66744, 66760, 66776, + 66792, 66808, 66824, 66840, 66856, 66872, 66888, 66904, 66920, 66936, + 66952, 66968, 66984, 67000, 67016, 67032, 67048, 67064, 67080, 67096, + 67112, 67128, 67144, 67160, 67176, 67192, 67208, 67224, 67240, 67256, + 67265, 67280, 17155, 67289, 67294, 67300, 67306, 67316, 67324, 17408, + 18090, 11318, 67337, 1428, 1432, 67345, 4155, 32408, 7876, 67351, 67356, + 67361, 67366, 67371, 67377, 67382, 67388, 67393, 67399, 67404, 67409, + 67414, 67419, 67425, 67430, 67435, 67440, 67445, 67450, 67455, 67460, + 67466, 67471, 67477, 67484, 2606, 67489, 67495, 9359, 67499, 67504, + 67511, 67519, 4166, 4171, 4176, 4181, 65, 67523, 67529, 67534, 67539, + 67543, 67548, 67552, 67556, 12356, 67560, 67570, 67583, 67594, 67607, + 67614, 67620, 67628, 11838, 67635, 67640, 67646, 67652, 67658, 67663, + 67668, 67673, 67678, 67682, 67687, 67692, 67697, 67703, 67709, 67715, + 67720, 67724, 67729, 67734, 67738, 67743, 67748, 67753, 67757, 12372, + 12383, 12388, 1471, 67761, 67767, 1476, 19095, 67772, 19104, 1486, 67777, + 67783, 67788, 1507, 67794, 1513, 1519, 12418, 67799, 67808, 67816, 67824, + 67831, 67835, 67839, 67845, 67850, 36561, 67855, 67862, 67870, 67877, + 67882, 67886, 67890, 67899, 67904, 67909, 67914, 1524, 276, 67919, 67923, + 19230, 995, 67927, 67934, 67939, 67943, 19266, 1528, 45092, 67946, 67951, + 67961, 67970, 67975, 67979, 67985, 1533, 47953, 67990, 67999, 68005, + 68010, 68015, 12657, 12663, 68021, 68033, 68050, 68067, 68084, 68101, + 68118, 68135, 68152, 68169, 68186, 68203, 68220, 68237, 68254, 68271, + 68288, 68305, 68322, 68339, 68356, 68373, 68390, 68407, 68424, 68441, + 68458, 68475, 68492, 68509, 68526, 68543, 68560, 68577, 68594, 68611, + 68628, 68645, 68662, 68679, 68696, 68713, 68730, 68747, 68764, 68781, + 68798, 68815, 68832, 68849, 68866, 68877, 68887, 68892, 1538, 68896, + 68901, 68907, 68912, 68917, 68924, 10384, 1543, 68930, 68939, 32792, + 68944, 68955, 12679, 68965, 68970, 68976, 68981, 68988, 68994, 68999, + 1548, 19560, 69004, 69010, 12689, 69016, 69021, 69026, 69031, 69036, + 69041, 69046, 69051, 1553, 4635, 69056, 69061, 69067, 69072, 69077, + 69082, 69087, 69092, 69097, 69102, 69107, 69113, 69119, 69125, 69130, + 69134, 69139, 69144, 69148, 69153, 69158, 69163, 69168, 69172, 69177, + 69183, 69188, 69193, 69197, 69202, 69207, 69213, 69218, 69223, 69229, + 69235, 69240, 69244, 69249, 69254, 69259, 69263, 69268, 69273, 69278, + 69284, 69290, 69295, 69299, 69303, 69308, 69313, 69318, 34496, 69322, + 69327, 69332, 69338, 69343, 69348, 69352, 69357, 69362, 69368, 69373, + 69378, 69384, 69390, 69395, 69399, 69404, 69409, 69413, 69418, 69423, + 69428, 69434, 69440, 69445, 69449, 69454, 69459, 69463, 69468, 69473, + 69478, 69483, 69487, 69490, 69493, 69498, 69503, 37287, 69510, 69518, + 48553, 69524, 3827, 32735, 69537, 69544, 69550, 69556, 4006, 69561, + 12831, 69567, 69577, 69592, 69600, 12836, 69611, 69616, 69627, 69639, + 69651, 69663, 2808, 69675, 69680, 69692, 69696, 69702, 69708, 69713, + 69722, 69729, 69734, 69739, 69744, 69749, 69754, 69759, 1570, 18729, + 69764, 69769, 48019, 69773, 69777, 69782, 69786, 19708, 69791, 69794, + 69799, 69807, 69815, 1574, 12872, 12878, 1579, 69823, 69830, 69835, + 69844, 69854, 69861, 69866, 69871, 1584, 69878, 69883, 19828, 69887, + 69892, 69899, 69905, 69909, 69922, 69928, 69939, 69949, 69956, 19850, + 10278, 10285, 4240, 4246, 69963, 1589, 69968, 69977, 69983, 69991, 69998, + 70004, 70011, 70023, 70029, 70034, 70041, 70053, 70064, 70074, 70083, + 70093, 70103, 4134, 70111, 36355, 36364, 19890, 70124, 70129, 70134, + 70139, 70144, 70149, 70154, 1594, 1598, 70159, 70163, 70166, 70177, + 70182, 19916, 1608, 70190, 70195, 70200, 19949, 70212, 70215, 70221, + 70227, 70232, 70240, 1613, 70245, 70250, 70258, 70266, 70273, 70282, + 70290, 70299, 70303, 1618, 70312, 1623, 25288, 70317, 70324, 70330, + 20036, 70338, 70348, 70354, 70359, 70367, 70374, 70383, 70391, 70401, + 70410, 70420, 70429, 70440, 70450, 70460, 70469, 70479, 70493, 70506, + 70515, 70523, 70533, 70542, 70554, 70565, 70576, 70586, 19328, 70591, + 13024, 70600, 70606, 70611, 70618, 70625, 70631, 18939, 70641, 70647, + 70652, 70663, 70670, 70677, 70682, 70690, 13041, 13046, 70698, 70704, + 70708, 4224, 4235, 20112, 48107, 70716, 70722, 70727, 70735, 70742, + 14121, 70747, 70753, 70759, 1634, 70764, 70767, 70773, 70778, 70783, + 70788, 70793, 70798, 70803, 70808, 70813, 70819, 70825, 1341, 70830, + 70835, 70840, 70846, 70851, 70856, 70861, 70866, 70871, 70876, 1643, 18, + 70882, 70886, 70891, 70895, 70899, 70903, 37573, 70908, 27557, 70913, + 70918, 70922, 70925, 70929, 70933, 70938, 70942, 70947, 70951, 70954, + 70960, 41105, 41110, 41115, 70963, 70970, 70976, 70984, 47725, 70994, + 41121, 37837, 37588, 37594, 41137, 37600, 70999, 71004, 71008, 37870, + 71015, 71018, 71022, 71030, 71037, 71042, 71045, 71050, 71055, 71059, + 71063, 71066, 71076, 71088, 71095, 71101, 37605, 71108, 39502, 71111, + 9376, 13386, 71114, 71118, 71123, 4049, 71127, 71130, 15843, 71137, + 71144, 71157, 71165, 71174, 71183, 71189, 71194, 71204, 71217, 71229, + 71236, 71241, 71250, 71263, 42785, 71281, 71286, 71293, 71299, 71304, + 872, 71309, 71317, 71324, 71331, 32231, 893, 71337, 71343, 71353, 71361, + 71367, 71372, 37624, 6640, 37638, 71376, 71386, 71391, 71399, 71409, + 71424, 71430, 71436, 37648, 71441, 36703, 71445, 71450, 71457, 71462, + 71466, 71471, 71479, 19893, 71486, 71491, 71495, 6681, 37674, 71499, + 71505, 342, 71515, 71522, 71529, 71535, 71542, 71547, 71556, 15474, + 67955, 67965, 71562, 71570, 71574, 71578, 71582, 71586, 71591, 71595, + 71601, 71609, 71614, 71619, 71626, 71631, 71635, 71640, 71644, 71648, + 71654, 71660, 71665, 71669, 71674, 71678, 37798, 71682, 37804, 37810, + 71687, 71693, 71700, 71705, 71709, 36720, 19547, 71712, 71716, 71721, + 71728, 71734, 71738, 71743, 47316, 71749, 71753, 71760, 71764, 71769, + 71775, 71781, 71787, 71799, 71808, 71818, 71824, 71831, 71836, 71841, + 71845, 71848, 71854, 71861, 71866, 71871, 71878, 71885, 71892, 71898, + 71903, 71908, 71916, 37815, 2436, 71921, 71926, 71932, 71937, 71943, + 71948, 71953, 71958, 71964, 37836, 71969, 71975, 71981, 71987, 37906, + 71992, 71997, 72002, 37917, 72007, 72012, 72017, 72023, 72029, 37922, + 72034, 72039, 72044, 37977, 37983, 72049, 72054, 37988, 38010, 33068, + 38016, 38020, 72059, 13815, 72063, 72071, 72077, 72085, 72092, 72098, + 72108, 72114, 72121, 12256, 38034, 72127, 72140, 72149, 72155, 72164, + 72170, 72176, 72183, 27900, 72191, 72198, 72208, 72216, 72219, 37978, + 72224, 72231, 72236, 72240, 72244, 72249, 72253, 4363, 72258, 72263, + 72268, 41199, 41204, 72272, 41218, 72277, 41223, 72282, 72288, 41235, + 41241, 41247, 72293, 72299, 26792, 72310, 72313, 72325, 72333, 38057, + 72337, 72346, 72356, 72365, 38067, 72370, 72377, 72386, 72392, 72400, + 72407, 72414, 6732, 4975, 72419, 37989, 72425, 72428, 72434, 72441, + 72446, 72451, 27804, 72455, 72461, 72467, 72472, 72477, 72481, 72487, + 72493, 39386, 72498, 42392, 44211, 44217, 38098, 38103, 72502, 72506, + 72510, 72513, 72526, 72532, 72536, 72539, 72544, 39755, 72548, 36725, + 25229, 72554, 6661, 6669, 10084, 72557, 72562, 72567, 72572, 72577, + 72582, 72587, 72592, 72597, 72602, 72608, 72613, 72618, 72624, 72629, + 72634, 72639, 72644, 72649, 72654, 72660, 72665, 72671, 72676, 72681, + 72686, 72691, 72696, 72701, 72706, 72711, 72716, 72721, 72727, 72732, + 72737, 72742, 72747, 72752, 72757, 72763, 72768, 72773, 72778, 72783, + 72788, 72793, 72798, 72803, 72808, 72814, 72819, 72824, 72829, 72834, + 72840, 72846, 72851, 72857, 72862, 72867, 72872, 72877, 72882, 1421, 156, + 72887, 72891, 72895, 72899, 29700, 72903, 72907, 72912, 72916, 72921, + 72925, 72930, 72935, 72940, 72944, 72948, 72953, 72957, 15553, 72962, + 72966, 72973, 72983, 17753, 72992, 73001, 73005, 73010, 73015, 73019, + 73023, 29488, 3164, 73027, 73033, 21125, 73037, 73046, 73054, 73060, + 73065, 73077, 73089, 73094, 73098, 73103, 73107, 73113, 73119, 73124, + 73134, 73144, 73150, 73158, 73163, 73167, 73173, 73178, 73185, 73191, + 73196, 73203, 73212, 73221, 73229, 73233, 18269, 73236, 73245, 73253, + 73265, 73276, 73287, 73296, 73300, 73309, 73317, 73327, 73335, 73342, + 73352, 73358, 73363, 73370, 73379, 73385, 73390, 73397, 73403, 73414, 60, + 36498, 73420, 31110, 31120, 73426, 73434, 73441, 73447, 73451, 73461, + 73472, 73480, 73489, 73494, 73499, 73504, 73508, 73512, 73520, 21072, + 73527, 73531, 73537, 73547, 73554, 73560, 73566, 41298, 73570, 73572, + 73575, 73581, 73585, 73596, 73606, 73612, 73619, 73626, 15490, 73634, + 73640, 73649, 73658, 73664, 11184, 73670, 73676, 73681, 73686, 73693, + 73698, 73705, 73711, 73716, 73724, 73737, 73746, 73755, 70455, 70465, + 73765, 73771, 73780, 73786, 73792, 73799, 73806, 73813, 73820, 73827, + 73832, 73836, 73840, 73843, 73853, 73857, 73869, 9745, 73878, 73889, + 73894, 73898, 70474, 73904, 73911, 73920, 73928, 73936, 73941, 73945, + 73950, 73955, 73965, 73973, 73985, 73990, 73994, 73998, 74004, 74012, + 74019, 74031, 74039, 74050, 74057, 74063, 74073, 74079, 74083, 74092, + 74101, 74108, 74114, 74119, 74123, 74127, 74131, 74140, 74149, 74158, + 74165, 74171, 74177, 74183, 74188, 74195, 74201, 74209, 74216, 74222, + 14585, 74227, 74233, 74237, 16644, 74241, 74246, 74256, 74261, 74270, + 74276, 74282, 74290, 74297, 74301, 74305, 74312, 74318, 74326, 74333, + 74339, 74350, 74354, 74358, 74362, 74365, 74371, 74376, 74381, 74385, + 74389, 74398, 74406, 74413, 74419, 74426, 28537, 47450, 74431, 74439, + 74443, 74447, 74450, 74458, 74465, 74471, 74480, 74488, 74494, 74499, + 74503, 74508, 74513, 74517, 74521, 74525, 74530, 74539, 74543, 74550, + 44315, 74554, 74560, 74568, 74572, 74578, 74586, 74592, 74597, 74608, + 74616, 74622, 74631, 26939, 74639, 74646, 74653, 74660, 74667, 74674, + 50944, 15305, 74681, 74688, 74693, 41334, 4595, 74699, 74704, 74709, + 74715, 74721, 74727, 74732, 74737, 74742, 74747, 74753, 74758, 74764, + 74769, 74775, 74780, 74785, 74790, 74795, 74800, 74805, 74810, 74816, + 74821, 74827, 74832, 74837, 74842, 74847, 74852, 74857, 74863, 74868, + 74873, 74878, 74883, 74888, 74893, 74898, 74903, 74908, 74913, 74919, + 74924, 74929, 74934, 74939, 74944, 74949, 74954, 74959, 74965, 74970, + 74975, 74980, 74985, 74990, 74995, 75000, 75005, 75010, 75015, 75020, + 75025, 75031, 1798, 305, 75036, 45210, 75040, 75043, 75048, 75052, 75055, + 3533, 75060, 75065, 75069, 75078, 75089, 75106, 75124, 75132, 73932, + 75139, 75142, 75152, 75159, 75168, 75184, 75193, 75203, 75208, 75221, + 75231, 75240, 75248, 75262, 75270, 75279, 75283, 75286, 75293, 75299, + 75310, 75317, 75329, 75340, 75351, 75360, 75367, 1181, 811, 75377, 2649, + 75381, 75386, 75395, 1015, 8818, 24670, 75403, 75411, 75425, 75438, + 75442, 75447, 75452, 75457, 75463, 75469, 75474, 9368, 17796, 75479, + 75483, 75491, 9805, 75496, 75502, 75511, 75519, 1651, 12885, 1055, 4278, + 75523, 75527, 75536, 75546, 2387, 31949, 75555, 75561, 19800, 31964, + 75567, 4443, 13267, 75573, 75580, 70172, 75584, 75588, 75594, 75599, + 75604, 3760, 160, 3786, 75609, 75621, 75625, 75629, 75635, 75640, 32812, + 75644, 13255, 2843, 4, 75649, 75659, 75670, 75681, 75691, 75697, 75708, + 75715, 75721, 75727, 75735, 75742, 75748, 75758, 75768, 75778, 75787, + 27887, 1193, 75792, 75796, 75800, 75806, 75810, 2866, 2872, 9365, 2242, + 75814, 75818, 75827, 75835, 75846, 75854, 75862, 75868, 75873, 75884, + 75895, 75903, 75909, 75914, 10993, 75924, 75932, 75936, 75940, 75945, + 75949, 75961, 33261, 17698, 75968, 75978, 75984, 75990, 7752, 11095, + 76000, 76011, 76022, 76032, 76041, 76045, 76052, 1017, 2636, 76062, + 76067, 76075, 69888, 76083, 76088, 76099, 76106, 76120, 16453, 525, + 76130, 76137, 76141, 76145, 76153, 76162, 76170, 76176, 19845, 76181, + 76195, 76202, 76208, 76216, 76225, 76234, 76241, 76253, 76263, 76271, + 76278, 76286, 76293, 4242, 116, 76301, 76312, 76316, 76328, 76334, 13469, + 210, 76339, 10416, 76344, 2911, 76348, 76355, 76361, 76372, 76382, 76390, + 76397, 9756, 76404, 76413, 76421, 4323, 76434, 4340, 76438, 76443, 76449, + 76454, 76459, 76464, 2916, 561, 76470, 76483, 76487, 76492, 2921, 1797, + 919, 76496, 4344, 76504, 76510, 76514, 774, 76524, 76533, 76538, 3777, + 76542, 17447, 17454, 54306, 76546, 4375, 4252, 15183, 76554, 76561, + 76566, 27951, 76570, 76577, 76583, 76588, 76593, 13582, 204, 76598, + 76610, 76616, 76624, 2933, 1688, 76632, 76634, 76639, 76644, 76649, + 76655, 76660, 76665, 76670, 76675, 76680, 76685, 76691, 76696, 76701, + 76706, 76711, 76716, 76721, 76726, 76731, 76737, 76742, 76747, 76752, + 76758, 76763, 76769, 76774, 76779, 76784, 76789, 76794, 76799, 76804, + 76810, 76815, 76821, 76826, 76831, 76836, 76841, 76846, 76851, 76856, + 76861, 9437, 9450, 4391, 4396, 4401, 4406, 26, 76867, 76873, 76878, + 76883, 76888, 76894, 76899, 76903, 76907, 76912, 76918, 76922, 76928, + 76933, 76938, 76944, 76949, 76953, 76958, 76963, 76967, 76970, 76972, + 76976, 76979, 76986, 76991, 76995, 77000, 77004, 77008, 77012, 77021, + 77025, 38345, 77028, 38350, 77035, 77040, 38355, 77049, 77058, 38361, + 77063, 38366, 77072, 77077, 13512, 77081, 77086, 77091, 38371, 77095, + 77104, 49149, 77108, 77111, 77115, 9036, 77121, 77124, 77129, 77134, + 77138, 4064, 38376, 77141, 77145, 77148, 77159, 77164, 77168, 77174, + 77182, 77195, 77199, 77207, 77216, 77222, 77227, 77233, 77237, 77243, + 77249, 77257, 77262, 77266, 77273, 77279, 77287, 77296, 77304, 38379, + 77311, 77321, 77330, 77338, 77349, 77362, 77367, 77372, 77376, 77385, + 77391, 77398, 77411, 77423, 77434, 77446, 77453, 77462, 77471, 77480, + 77487, 77493, 77500, 77508, 77515, 77523, 77532, 77540, 77547, 77555, + 77564, 77572, 77581, 77591, 77600, 77608, 77615, 77623, 77632, 77640, + 77649, 77659, 77668, 77676, 77685, 77695, 77704, 77714, 77725, 77735, + 77744, 77752, 77759, 77767, 77776, 77784, 77793, 77803, 77812, 77820, + 77829, 77839, 77848, 77858, 77869, 77879, 77888, 77896, 77905, 77915, + 77924, 77934, 77945, 77955, 77964, 77974, 77985, 77995, 78006, 78018, + 78029, 78039, 78048, 78056, 78063, 78071, 78080, 78088, 78097, 78107, + 78116, 78124, 78133, 78143, 78152, 78162, 78173, 78183, 78192, 78200, + 78209, 78219, 78228, 78238, 78249, 78259, 78268, 78278, 78289, 78299, + 78310, 78322, 78333, 78343, 78352, 78360, 78369, 78379, 78388, 78398, + 78409, 78419, 78428, 78438, 78449, 78459, 78470, 78482, 78493, 78503, + 78512, 78522, 78533, 78543, 78554, 78566, 78577, 78587, 78598, 78610, + 78621, 78633, 78646, 78658, 78669, 78679, 78688, 78696, 78703, 78711, + 78720, 78728, 78737, 78747, 78756, 78764, 78773, 78783, 78792, 78802, + 78813, 78823, 78832, 78840, 78849, 78859, 78868, 78878, 78889, 78899, + 78908, 78918, 78929, 78939, 78950, 78962, 78973, 78983, 78992, 79000, + 79009, 79019, 79028, 79038, 79049, 79059, 79068, 79078, 79089, 79099, + 79110, 79122, 79133, 79143, 79152, 79162, 79173, 79183, 79194, 79206, + 79217, 79227, 79238, 79250, 79261, 79273, 79286, 79298, 79309, 79319, + 79328, 79336, 79345, 79355, 79364, 79374, 79385, 79395, 79404, 79414, + 79425, 79435, 79446, 79458, 79469, 79479, 79488, 79498, 79509, 79519, + 79530, 79542, 79553, 79563, 79574, 79586, 79597, 79609, 79622, 79634, + 79645, 79655, 79664, 79674, 79685, 79695, 79706, 79718, 79729, 79739, + 79750, 79762, 79773, 79785, 79798, 79810, 79821, 79831, 79842, 79854, + 79865, 79877, 79890, 79902, 79913, 79925, 79938, 79950, 79963, 79977, + 79990, 80002, 80013, 80023, 80032, 80040, 80047, 80052, 80056, 8849, + 80063, 80068, 38389, 80074, 80079, 38394, 80085, 24792, 30653, 80090, + 80096, 80104, 80110, 80116, 80123, 80130, 80135, 80140, 80144, 80149, + 80153, 80156, 80160, 80165, 80174, 80183, 80191, 80197, 80209, 80220, + 80224, 3226, 8824, 80229, 80232, 80235, 80237, 80241, 80245, 80249, + 80255, 80260, 30716, 80265, 80269, 80272, 80277, 80281, 80288, 80294, + 80298, 6835, 80302, 80307, 38416, 80311, 80318, 80327, 80335, 80341, + 80352, 80360, 80369, 80377, 80384, 80391, 80397, 80402, 80413, 38421, + 80418, 80429, 80441, 80449, 80460, 80469, 80477, 80488, 80493, 80501, + 2601, 80506, 80515, 40704, 80528, 80532, 80544, 80552, 80557, 80565, + 80576, 21290, 80585, 80591, 80598, 80606, 80612, 38431, 80617, 4369, + 67320, 80624, 80627, 80635, 80648, 80661, 80674, 80687, 80694, 80705, + 80714, 80719, 50761, 50766, 80723, 80727, 80735, 80742, 80751, 80759, + 80765, 80774, 80782, 80789, 80797, 80801, 80810, 80819, 80829, 80842, + 80855, 80865, 38436, 80871, 80878, 80884, 80890, 38442, 80895, 80898, + 80902, 80910, 80919, 50544, 80927, 80936, 80944, 80951, 80959, 80969, + 80978, 80987, 39884, 80996, 81007, 81022, 81032, 10449, 25565, 81041, + 81046, 81051, 81055, 18931, 81060, 81065, 81071, 81076, 81081, 81087, + 81092, 81097, 25525, 81102, 81109, 81117, 81125, 81133, 81138, 81145, + 81152, 81157, 1706, 81161, 81165, 81173, 81181, 38459, 81187, 81193, + 81205, 81211, 81218, 81222, 81229, 81234, 81241, 81247, 81254, 81265, + 81275, 81285, 81297, 81303, 81311, 81317, 81327, 81337, 38486, 81346, + 81355, 81361, 81373, 81384, 81391, 81396, 81400, 81408, 81414, 81419, + 81424, 81431, 81439, 81451, 81461, 81470, 81479, 81487, 81494, 40530, + 28325, 81500, 81505, 81509, 81513, 81518, 81526, 81532, 81543, 81556, + 81561, 81568, 38491, 81573, 81585, 81594, 81602, 81612, 81623, 81636, + 81643, 81652, 81661, 81669, 81674, 81680, 81684, 1410, 81689, 81694, + 81699, 81704, 81710, 81715, 81720, 81726, 81732, 81737, 81741, 81746, + 81751, 81756, 67895, 81761, 81766, 81771, 81776, 81782, 81788, 81793, + 81797, 81802, 18930, 81807, 81813, 81818, 81824, 81829, 81834, 81839, + 81844, 81848, 81854, 81859, 81868, 81873, 81878, 81883, 81888, 81892, + 81899, 81905, 4704, 20162, 3191, 81910, 81914, 81919, 81923, 81927, + 81931, 54561, 81935, 81860, 81937, 81947, 38500, 81950, 81955, 81964, + 81970, 6794, 38505, 81974, 81980, 81985, 81991, 81996, 82000, 82007, + 82012, 82022, 82031, 82035, 82041, 82047, 82053, 82057, 82065, 82072, + 82080, 82088, 38510, 82095, 82098, 82109, 82116, 82122, 82127, 82131, + 82137, 82145, 82152, 82157, 82161, 82170, 82178, 82184, 82189, 38515, + 82196, 27777, 82208, 82214, 82219, 82225, 82232, 82238, 25251, 32431, + 82244, 82249, 82255, 82259, 82271, 81893, 81900, 25457, 82281, 82286, + 82293, 82299, 82306, 82312, 82323, 82328, 82336, 10154, 82341, 82344, + 82350, 82354, 82358, 82361, 82367, 82373, 38225, 4705, 1425, 15602, + 82380, 82386, 82392, 82398, 82404, 82410, 82416, 82422, 82428, 82433, + 82438, 82443, 82448, 82453, 82458, 82463, 82468, 82473, 82478, 82483, + 82488, 82493, 82499, 82504, 82509, 82515, 82520, 82525, 82531, 82537, + 82543, 82549, 82555, 82561, 82567, 82573, 82579, 82584, 82589, 82595, + 82600, 82605, 82611, 82616, 82621, 82626, 82631, 82636, 82641, 82646, + 82651, 82656, 82661, 82666, 82671, 82677, 82682, 82687, 82692, 82698, + 82703, 82708, 82713, 82718, 82724, 82729, 82734, 82739, 82744, 82749, + 82754, 82759, 82764, 82769, 82774, 82779, 82784, 82789, 82794, 82799, + 82804, 82809, 82814, 82819, 82825, 82830, 82835, 82840, 82845, 82850, + 82855, 82860, 1027, 169, 82865, 82869, 82873, 82878, 82886, 82890, 82897, + 82905, 82909, 82922, 82930, 82935, 82940, 31173, 82944, 82949, 82953, + 82958, 82962, 82970, 82974, 24800, 82979, 82983, 70712, 82987, 82990, + 82998, 83006, 83014, 83019, 83024, 83031, 83038, 83044, 83050, 83055, + 83062, 83067, 83075, 75430, 83082, 83087, 70484, 83094, 83100, 83105, + 83109, 83116, 83122, 83129, 70511, 13596, 83137, 83142, 83147, 83151, + 83154, 83165, 83174, 83180, 83185, 83189, 83199, 83208, 48940, 83212, + 83216, 83223, 83236, 83242, 83250, 83259, 83270, 83281, 83292, 83303, + 83312, 83318, 83327, 83335, 83345, 83358, 83366, 83373, 83384, 83393, + 83399, 83404, 83409, 83415, 83425, 83431, 83441, 83449, 83456, 83466, + 83475, 81575, 83483, 83489, 83497, 83503, 73977, 83510, 83515, 83518, + 83522, 83528, 83532, 83535, 83543, 83549, 83555, 83563, 83575, 83587, + 83594, 83599, 83603, 83614, 83622, 83629, 83641, 83649, 83656, 83664, + 83671, 83677, 83682, 83692, 83701, 83709, 83714, 83724, 83733, 49805, + 83740, 83744, 83749, 83757, 83764, 83770, 83774, 83784, 83795, 83803, + 83810, 83822, 83834, 83843, 80518, 83850, 83860, 83872, 83883, 83897, + 83905, 83915, 83922, 83930, 83943, 83955, 83964, 83972, 83982, 83993, + 84005, 84014, 84024, 84034, 84043, 84050, 84059, 84074, 84082, 84092, + 84101, 84109, 84122, 67290, 84137, 84147, 84156, 84168, 84178, 84190, + 84201, 84215, 84229, 84243, 84257, 84271, 84285, 84299, 84313, 84327, + 84341, 84355, 84369, 84383, 84397, 84411, 84425, 84439, 84453, 84467, + 84481, 84495, 84509, 84523, 84537, 84551, 84565, 84579, 84593, 84607, + 84621, 84635, 84649, 84663, 84677, 84691, 84705, 84719, 84733, 84747, + 84761, 84775, 84789, 84803, 84817, 84831, 84845, 84859, 84873, 84887, + 84901, 84915, 84929, 84943, 84957, 84971, 84985, 84999, 85013, 85027, + 85041, 85055, 85069, 85083, 85097, 85111, 85125, 85139, 85153, 85167, + 85181, 85195, 85209, 85223, 85237, 85251, 85265, 85279, 85293, 85307, + 85321, 85335, 85349, 85363, 85377, 85391, 85405, 85419, 85433, 85447, + 85461, 85475, 85489, 85503, 85517, 85531, 85545, 85559, 85573, 85587, + 85601, 85615, 85629, 85643, 85657, 85671, 85685, 85699, 85713, 85727, + 85741, 85755, 85769, 85783, 85797, 85811, 85825, 85839, 85853, 85867, + 85881, 85895, 85909, 85923, 85937, 85951, 85965, 85979, 85993, 86007, + 86021, 86035, 86049, 86063, 86077, 86091, 86105, 86119, 86133, 86147, + 86161, 86175, 86189, 86203, 86217, 86231, 86245, 86259, 86273, 86287, + 86301, 86315, 86329, 86343, 86357, 86371, 86385, 86399, 86413, 86427, + 86441, 86455, 86469, 86483, 86497, 86511, 86525, 86539, 86553, 86567, + 86581, 86595, 86609, 86623, 86637, 86651, 86665, 86679, 86693, 86707, + 86721, 86735, 86749, 86763, 86777, 86791, 86805, 86819, 86833, 86847, + 86861, 86875, 86889, 86903, 86917, 86931, 86945, 86959, 86973, 86987, + 87001, 87015, 87029, 87043, 87057, 87071, 87085, 87099, 87113, 87127, + 87141, 87155, 87169, 87183, 87197, 87211, 87225, 87239, 87253, 87267, + 87281, 87295, 87309, 87323, 87337, 87351, 87365, 87379, 87393, 87407, + 87421, 87435, 87449, 87463, 87477, 87491, 87505, 87519, 87533, 87547, + 87561, 87575, 87589, 87603, 87617, 87631, 87645, 87659, 87673, 87687, + 87701, 87715, 87729, 87743, 87757, 87771, 87785, 87799, 87813, 87827, + 87841, 87855, 87869, 87883, 87897, 87911, 87925, 87939, 87953, 87967, + 87981, 87995, 88009, 88023, 88037, 88051, 88065, 88079, 88093, 88107, + 88121, 88135, 88149, 88163, 88177, 88191, 88205, 88219, 88233, 88247, + 88261, 88275, 88289, 88303, 88317, 88331, 88345, 88359, 88373, 88387, + 88401, 88415, 88429, 88443, 88457, 88471, 88485, 88499, 88513, 88527, + 88541, 88555, 88569, 88583, 88597, 88611, 88625, 88639, 88653, 88667, + 88681, 88695, 88709, 88723, 88737, 88751, 88765, 88779, 88793, 88807, + 88821, 88835, 88849, 88863, 88877, 88891, 88905, 88919, 88933, 88947, + 88961, 88975, 88989, 89003, 89017, 89031, 89045, 89059, 89073, 89087, + 89101, 89115, 89129, 89143, 89157, 89171, 89185, 89199, 89213, 89227, + 89241, 89255, 89269, 89283, 89297, 89311, 89325, 89339, 89353, 89367, + 89381, 89395, 89409, 89423, 89437, 89451, 89465, 89479, 89493, 89507, + 89521, 89535, 89549, 89563, 89577, 89591, 89605, 89619, 89633, 89647, + 89661, 89675, 89689, 89703, 89717, 89731, 89745, 89759, 89773, 89787, + 89801, 89815, 89829, 89843, 89857, 89871, 89885, 89899, 89913, 89927, + 89941, 89955, 89969, 89983, 89997, 90011, 90025, 90039, 90053, 90067, + 90081, 90095, 90109, 90123, 90137, 90151, 90165, 90179, 90193, 90207, + 90221, 90235, 90249, 90263, 90277, 90291, 90305, 90319, 90333, 90347, + 90361, 90375, 90389, 90403, 90417, 90431, 90445, 90459, 90473, 90487, + 90501, 90515, 90529, 90543, 90557, 90571, 90585, 90599, 90613, 90627, + 90641, 90655, 90669, 90683, 90697, 90711, 90725, 90739, 90753, 90767, + 90781, 90795, 90809, 90823, 90837, 90851, 90865, 90879, 90893, 90907, + 90921, 90935, 90949, 90963, 90977, 90991, 91005, 91019, 91033, 91047, + 91061, 91075, 91089, 91103, 91117, 91131, 91145, 91159, 91173, 91187, + 91201, 91215, 91229, 91243, 91257, 91271, 91285, 91299, 91313, 91327, + 91341, 91355, 91369, 91383, 91397, 91411, 91425, 91439, 91453, 91467, + 91481, 91495, 91509, 91523, 91537, 91551, 91565, 91579, 91593, 91607, + 91621, 91635, 91649, 91663, 91677, 91691, 91705, 91719, 91733, 91747, + 91761, 91775, 91789, 91803, 91817, 91831, 91845, 91859, 91873, 91887, + 91901, 91915, 91929, 91943, 91957, 91971, 91985, 91999, 92013, 92027, + 92041, 92055, 92069, 92083, 92097, 92111, 92125, 92139, 92153, 92167, + 92181, 92195, 92209, 92223, 92237, 92251, 92265, 92279, 92293, 92307, + 92321, 92335, 92349, 92363, 92377, 92391, 92405, 92419, 92433, 92447, + 92461, 92475, 92489, 92503, 92517, 92531, 92545, 92559, 92573, 92587, + 92601, 92615, 92629, 92643, 92657, 92671, 92685, 92699, 92713, 92727, + 92741, 92755, 92769, 92783, 92797, 92811, 92825, 92839, 92853, 92867, + 92881, 92895, 92909, 92923, 92937, 92951, 92965, 92979, 92993, 93007, + 93021, 93035, 93049, 93063, 93077, 93091, 93105, 93119, 93133, 93147, + 93161, 93175, 93189, 93203, 93217, 93231, 93245, 93259, 93273, 93287, + 93301, 93315, 93329, 93343, 93357, 93371, 93385, 93399, 93413, 93427, + 93441, 93455, 93469, 93483, 93497, 93511, 93525, 93539, 93553, 93567, + 93581, 93595, 93609, 93623, 93637, 93651, 93665, 93679, 93693, 93707, + 93721, 93735, 93749, 93763, 93777, 93791, 93805, 93819, 93833, 93847, + 93861, 93875, 93889, 93903, 93917, 93931, 93945, 93959, 93973, 93987, + 94001, 94015, 94029, 94043, 94057, 94071, 94085, 94099, 94113, 94127, + 94141, 94155, 94169, 94183, 94197, 94211, 94225, 94239, 94253, 94267, + 94281, 94295, 94309, 94323, 94337, 94351, 94365, 94379, 94393, 94407, + 94421, 94435, 94449, 94463, 94477, 94491, 94505, 94519, 94533, 94547, + 94561, 94575, 94589, 94603, 94617, 94631, 94645, 94659, 94673, 94687, + 94701, 94715, 94729, 94743, 94757, 94771, 94785, 94799, 94813, 94827, + 94841, 94855, 94869, 94883, 94897, 94911, 94925, 94939, 94953, 94962, + 94973, 94984, 94994, 95005, 95013, 95021, 95027, 95037, 95045, 95051, + 34382, 95056, 95062, 95071, 95083, 95088, 95095, 11007, 21310, 95101, + 95110, 95115, 95119, 95124, 95131, 95137, 95142, 95147, 95155, 95163, + 95173, 95178, 95186, 14061, 95190, 95193, 95195, 95210, 95223, 95230, + 95236, 95247, 95252, 95256, 95261, 95268, 95274, 95279, 95287, 76024, + 76034, 95293, 95300, 95310, 12243, 95317, 95322, 34620, 95331, 95336, + 95343, 95353, 95361, 95369, 95378, 95387, 95393, 95399, 95406, 95413, + 95418, 95422, 95430, 70528, 95435, 95444, 95452, 95459, 95464, 95468, + 95477, 95483, 95486, 95490, 95499, 95509, 82917, 95518, 95522, 95530, + 95534, 95540, 95551, 95561, 21319, 95572, 95581, 95589, 95597, 95604, + 70547, 9602, 95612, 95616, 95625, 95632, 95635, 95639, 32309, 95642, + 95646, 95651, 95668, 95680, 12201, 95692, 95697, 95702, 95707, 24902, + 95711, 95716, 95721, 95727, 95732, 6433, 95737, 24906, 95742, 95747, + 95753, 95760, 95765, 95770, 95776, 95782, 95788, 95793, 95799, 95803, + 95817, 95825, 95833, 95839, 95844, 95851, 95861, 95870, 95875, 95880, + 95885, 95893, 95903, 95914, 95919, 95925, 95930, 95939, 69012, 4634, + 95944, 95962, 95981, 95994, 96008, 96024, 96031, 96038, 96047, 96054, + 96060, 96067, 96072, 96078, 96083, 96089, 96097, 96103, 96108, 96113, + 96129, 12214, 96143, 96150, 96158, 96164, 96168, 96171, 96177, 96182, + 96187, 96195, 96202, 96207, 96216, 96222, 96227, 96233, 96239, 96248, + 96257, 42236, 96262, 96270, 96279, 13669, 96288, 96294, 96302, 96308, + 96314, 96320, 96325, 96332, 96338, 13680, 96343, 96346, 96351, 38542, + 96361, 96370, 96375, 96381, 96386, 96394, 96401, 96412, 96428, 96444, + 96460, 96476, 96492, 96508, 96524, 96540, 96556, 96572, 96588, 96604, + 96620, 96636, 96652, 96668, 96684, 96700, 96716, 96732, 96748, 96764, + 96780, 96796, 96812, 96828, 96844, 96860, 96876, 96892, 96908, 96924, + 96940, 96956, 96972, 96988, 97004, 97020, 97036, 97052, 97068, 97084, + 97100, 97116, 97132, 97148, 97164, 97180, 97196, 97212, 97228, 97244, + 97260, 97276, 97292, 97308, 97324, 97340, 97356, 97372, 97388, 97404, + 97420, 97436, 97452, 97468, 97484, 97500, 97516, 97532, 97548, 97564, + 97580, 97596, 97612, 97628, 97644, 97660, 97676, 97692, 97708, 97724, + 97740, 97756, 97772, 97788, 97804, 97820, 97836, 97852, 97868, 97884, + 97900, 97916, 97932, 97948, 97964, 97980, 97996, 98012, 98028, 98044, + 98060, 98076, 98092, 98108, 98124, 98140, 98156, 98172, 98188, 98204, + 98220, 98236, 98252, 98268, 98284, 98300, 98316, 98332, 98348, 98364, + 98380, 98396, 98412, 98428, 98444, 98460, 98476, 98492, 98508, 98524, + 98540, 98556, 98572, 98588, 98604, 98620, 98636, 98652, 98668, 98684, + 98700, 98716, 98732, 98748, 98764, 98780, 98796, 98812, 98828, 98844, + 98860, 98876, 98892, 98908, 98924, 98940, 98956, 98972, 98988, 99004, + 99020, 99036, 99052, 99068, 99084, 99100, 99116, 99132, 99148, 99164, + 99180, 99196, 99212, 99228, 99244, 99260, 99276, 99292, 99308, 99324, + 99340, 99356, 99372, 99388, 99404, 99420, 99436, 99452, 99468, 99484, + 99500, 99516, 99532, 99548, 99564, 99580, 99596, 99612, 99628, 99644, + 99660, 99676, 99692, 99708, 99724, 99740, 99756, 99772, 99788, 99804, + 99820, 99836, 99852, 99868, 99884, 99900, 99916, 99932, 99948, 99964, + 99980, 99996, 100012, 100028, 100044, 100060, 100076, 100092, 100108, + 100124, 100140, 100156, 100172, 100188, 100204, 100220, 100236, 100252, + 100268, 100284, 100300, 100316, 100332, 100348, 100364, 100380, 100396, + 100412, 100428, 100444, 100460, 100476, 100492, 100508, 100524, 100540, + 100556, 100572, 100588, 100604, 100620, 100636, 100652, 100668, 100684, + 100700, 100716, 100732, 100748, 100764, 100780, 100796, 100812, 100828, + 100844, 100860, 100876, 100892, 100908, 100924, 100940, 100956, 100972, + 100988, 101004, 101020, 101036, 101052, 101068, 101084, 101100, 101116, + 101132, 101148, 101164, 101180, 101196, 101212, 101228, 101244, 101260, + 101276, 101292, 101308, 101324, 101340, 101356, 101372, 101388, 101404, + 101420, 101436, 101452, 101468, 101484, 101500, 101516, 101532, 101548, + 101564, 101580, 101596, 101612, 101628, 101644, 101660, 101676, 101692, + 101708, 101724, 101740, 101756, 101772, 101788, 101804, 101820, 101836, + 101852, 101868, 101884, 101900, 101916, 101932, 101948, 101964, 101980, + 101996, 102012, 102028, 102044, 102060, 102076, 102092, 102108, 102124, + 102140, 102156, 102172, 102188, 102204, 102220, 102236, 102252, 102268, + 102284, 102300, 102316, 102332, 102348, 102364, 102380, 102396, 102412, + 102428, 102444, 102460, 102476, 102492, 102508, 102524, 102540, 102556, + 102572, 102588, 102604, 102620, 102636, 102652, 102668, 102684, 102700, + 102716, 102732, 102748, 102764, 102780, 102796, 102812, 102828, 102844, + 102860, 102876, 102892, 102908, 102924, 102940, 102956, 102972, 102988, + 103004, 103020, 103036, 103052, 103068, 103084, 103100, 103116, 103132, + 103148, 103164, 103180, 103196, 103212, 103228, 103244, 103260, 103276, + 103292, 103308, 103324, 103340, 103356, 103372, 103388, 103404, 103420, + 103436, 103452, 103468, 103484, 103500, 103516, 103532, 103548, 103564, + 103580, 103596, 103612, 103628, 103644, 103660, 103676, 103692, 103708, + 103724, 103740, 103756, 103772, 103788, 103804, 103820, 103836, 103852, + 103868, 103884, 103900, 103916, 103932, 103948, 103964, 103980, 103996, + 104012, 104028, 104044, 104060, 104076, 104092, 104108, 104124, 104140, + 104156, 104172, 104188, 104204, 104220, 104236, 104252, 104268, 104284, + 104300, 104316, 104332, 104348, 104364, 104380, 104396, 104412, 104428, + 104444, 104460, 104476, 104492, 104508, 104524, 104540, 104556, 104572, + 104588, 104604, 104620, 104636, 104652, 104668, 104684, 104700, 104716, + 104732, 104748, 104764, 104780, 104796, 104812, 104828, 104844, 104860, + 104876, 104892, 104908, 104924, 104940, 104956, 104972, 104988, 105004, + 105020, 105036, 105052, 105068, 105084, 105100, 105116, 105132, 105148, + 105164, 105180, 105196, 105212, 105228, 105244, 105260, 105276, 105292, + 105308, 105324, 105340, 105356, 105372, 105388, 105404, 105420, 105436, + 105452, 105468, 105484, 105500, 105516, 105532, 105548, 105564, 105580, + 105596, 105612, 105628, 105644, 105660, 105676, 105692, 105708, 105724, + 105740, 105756, 105772, 105788, 105804, 105820, 105836, 105852, 105868, + 105884, 105900, 105916, 105932, 105948, 105964, 105980, 105996, 106012, + 106028, 106044, 106060, 106076, 106092, 106108, 106124, 106140, 106156, + 106172, 106188, 106204, 106220, 106236, 106252, 106268, 106284, 106300, + 106316, 106332, 106348, 106364, 106380, 106396, 106412, 106428, 106444, + 106460, 106476, 106492, 106508, 106524, 106540, 106556, 106572, 106588, + 106604, 106620, 106636, 106652, 106668, 106684, 106700, 106716, 106732, + 106748, 106764, 106780, 106796, 106812, 106828, 106844, 106860, 106876, + 106892, 106908, 106924, 106940, 106956, 106972, 106988, 107004, 107020, + 107036, 107052, 107068, 107084, 107100, 107116, 107132, 107148, 107164, + 107180, 107196, 107212, 107228, 107244, 107260, 107276, 107292, 107308, + 107324, 107340, 107356, 107372, 107388, 107404, 107420, 107436, 107452, + 107468, 107484, 107500, 107516, 107532, 107548, 107564, 107580, 107596, + 107612, 107628, 107644, 107660, 107676, 107692, 107708, 107724, 107740, + 107756, 107772, 107788, 107804, 107820, 107836, 107852, 107868, 107884, + 107900, 107916, 107932, 107948, 107964, 107980, 107996, 108012, 108028, + 108044, 108060, 108076, 108092, 108108, 108124, 108140, 108156, 108172, + 108188, 108204, 108220, 108236, 108252, 108268, 108284, 108300, 108316, + 108332, 108348, 108364, 108380, 108396, 108412, 108428, 108444, 108460, + 108476, 108492, 108508, 108524, 108540, 108556, 108572, 108588, 108604, + 108620, 108636, 108652, 108668, 108684, 108700, 108716, 108732, 108748, + 108764, 108780, 108796, 108812, 108828, 108844, 108860, 108876, 108892, + 108908, 108924, 108940, 108956, 108972, 108988, 109004, 109020, 109036, + 109052, 109068, 109084, 109100, 109116, 109132, 109148, 109164, 109180, + 109196, 109212, 109228, 109244, 109260, 109276, 109292, 109308, 109324, + 109340, 109356, 109372, 109388, 109404, 109420, 109436, 109452, 109468, + 109484, 109500, 109516, 109532, 109548, 109564, 109580, 109596, 109612, + 109628, 109644, 109660, 109676, 109692, 109708, 109724, 109740, 109756, + 109772, 109788, 109804, 109820, 109836, 109852, 109868, 109884, 109900, + 109916, 109932, 109948, 109964, 109980, 109996, 110012, 110028, 110044, + 110060, 110076, 110092, 110108, 110124, 110140, 110156, 110172, 110188, + 110204, 110220, 110236, 110252, 110268, 110278, 110287, 110292, 110300, + 75353, 110305, 110311, 110316, 110323, 110332, 110340, 110344, 4223, + 110350, 110357, 110363, 110367, 19911, 45306, 3200, 110372, 110376, + 110380, 110387, 110393, 110402, 110408, 110415, 110419, 110440, 110462, + 110478, 110495, 110514, 110523, 110533, 110541, 110548, 110555, 110561, + 32164, 110575, 110579, 110585, 110593, 110605, 110611, 110619, 110626, + 110631, 110636, 110640, 110648, 110655, 110659, 110665, 110671, 110676, + 3871, 50961, 110682, 110686, 110690, 110694, 110699, 110704, 110709, + 110715, 110721, 110727, 110734, 110740, 110747, 110753, 110759, 110764, + 110770, 110775, 110779, 102872, 110784, 102936, 50976, 110789, 110794, + 110802, 110806, 110811, 110818, 110827, 110833, 110842, 110846, 110853, + 110857, 110860, 110867, 110873, 110882, 110892, 110902, 110907, 110911, + 110918, 110926, 110935, 110939, 110947, 110953, 110958, 110963, 110969, + 110975, 110980, 110984, 31071, 110990, 110994, 110998, 111001, 111006, + 111014, 111024, 111030, 111035, 111045, 48136, 111053, 111065, 111071, + 111078, 111084, 111088, 111093, 111099, 111111, 111122, 111129, 111135, + 111142, 111149, 111161, 111168, 111174, 24986, 111178, 111186, 111192, + 111199, 111205, 111211, 111217, 111222, 111227, 111232, 111236, 111245, + 111253, 111264, 7709, 111269, 19347, 111275, 111279, 111283, 111287, + 111295, 111304, 111308, 111315, 111324, 111332, 111345, 111351, 103448, + 35520, 111356, 111358, 111363, 111368, 111373, 111378, 111383, 111388, + 111393, 111398, 111403, 111408, 111413, 111418, 111423, 111428, 111434, + 111439, 111444, 111449, 111454, 111459, 111464, 111469, 111474, 111480, + 111486, 111492, 111497, 111502, 111514, 111519, 1840, 54, 111524, 111529, + 38552, 111533, 38557, 38562, 38568, 38573, 111537, 38578, 26134, 111559, + 111563, 111567, 111572, 111576, 38582, 111580, 111588, 111595, 111601, + 111611, 38587, 111618, 111621, 111626, 111630, 111639, 10817, 111647, + 38592, 25978, 111650, 111654, 111662, 1315, 111667, 38603, 111670, + 111675, 30437, 30447, 41834, 111680, 111685, 111690, 111695, 111701, + 111706, 111715, 111720, 111729, 111737, 111744, 111750, 111755, 111760, + 111765, 111775, 111784, 111792, 111797, 111805, 111809, 111817, 111821, + 111828, 111835, 111843, 111850, 38407, 45041, 111856, 111862, 111867, + 111872, 14096, 11556, 111877, 111882, 111887, 111893, 111900, 111906, + 111915, 111920, 111928, 111938, 111945, 111955, 111961, 111966, 111972, + 111976, 21341, 111983, 42798, 111996, 112001, 112007, 112022, 36577, + 73759, 112035, 112039, 112048, 112057, 112064, 112070, 112078, 112084, + 112093, 112100, 45161, 112106, 112109, 112113, 112117, 112121, 11577, + 112127, 112134, 112140, 112148, 112153, 112157, 28485, 112163, 112166, + 112174, 112181, 112189, 112202, 112216, 112223, 112229, 112236, 112242, + 38617, 112246, 112253, 112261, 112269, 112275, 38622, 112283, 112289, + 112294, 112304, 112310, 112319, 36372, 41205, 112327, 112332, 112337, + 112341, 112346, 112350, 112358, 112363, 17439, 18213, 48158, 112367, + 112372, 38627, 17592, 112376, 112388, 112393, 112397, 112404, 112413, + 112417, 112425, 112431, 112436, 112444, 112452, 112460, 112468, 112476, + 112484, 112495, 112501, 8891, 112506, 112512, 112517, 112522, 112533, + 112542, 112554, 112569, 38915, 112575, 19466, 38631, 112579, 112586, + 112592, 112596, 28609, 112603, 112609, 112616, 47421, 112625, 112631, + 112640, 112646, 112651, 112659, 112665, 112670, 38641, 112675, 112684, + 112693, 111117, 112702, 112709, 112715, 112721, 112730, 112740, 112746, + 112754, 112761, 112765, 38646, 112768, 38652, 1354, 112773, 112781, + 112789, 112799, 112808, 112816, 112823, 112833, 38663, 112837, 112839, + 112843, 112848, 112852, 112856, 112862, 112867, 112871, 112882, 112887, + 112896, 112901, 3205, 112905, 112912, 112916, 112925, 112933, 112941, + 112948, 112953, 112958, 72289, 112962, 112965, 112971, 112979, 112985, + 112989, 112994, 113001, 113006, 113011, 113015, 113022, 113028, 113033, + 41236, 113037, 113040, 113045, 113049, 113054, 113061, 113066, 113070, + 46483, 113078, 30456, 30465, 113084, 113090, 113096, 113101, 113105, + 113108, 113118, 113127, 113132, 113138, 113145, 113151, 113155, 113163, + 113168, 41242, 83176, 113172, 113180, 113187, 113193, 113200, 113205, + 113212, 113217, 113221, 113226, 67506, 113232, 113238, 10093, 113243, + 113248, 113252, 113257, 113262, 113267, 113271, 113276, 113281, 113287, + 113292, 113297, 113303, 113309, 113314, 113318, 113323, 113328, 113333, + 113337, 28608, 113342, 113347, 113353, 113359, 113365, 113370, 113374, + 113379, 113384, 107224, 113389, 113394, 113399, 113404, 107288, 51231, + 113409, 38671, 113417, 113421, 113429, 113437, 113448, 113453, 113457, + 26607, 80621, 113462, 113468, 113473, 4534, 113483, 113490, 113495, + 113503, 113512, 113517, 113521, 113526, 113530, 113538, 113546, 113553, + 75615, 113559, 113567, 113574, 113585, 113591, 113597, 38681, 113600, + 113607, 113615, 113620, 113624, 32668, 70116, 113630, 113635, 113642, + 113647, 9982, 113651, 113659, 113666, 113673, 113682, 113689, 113695, + 113709, 113717, 6514, 113479, 113723, 113728, 113734, 113738, 113741, + 113749, 113756, 113761, 113774, 113781, 113787, 113791, 113799, 113804, + 113811, 113817, 113822, 70387, 113827, 113830, 113839, 113846, 107496, + 113852, 113855, 113863, 113869, 113878, 113888, 113898, 113907, 113918, + 113926, 113937, 113942, 113946, 113951, 113955, 41965, 113963, 25314, + 41974, 113968, 99015, 99031, 99047, 99063, 99079, 113973, 99111, 99127, + 99143, 99159, 99271, 99287, 113977, 99319, 99335, 113981, 113985, 113989, + 113993, 99575, 99607, 113997, 99639, 114001, 114005, 99783, 99799, 99815, + 99831, 114009, 99895, 99911, 114013, 100039, 100055, 100071, 100087, + 100103, 100119, 100135, 100151, 100167, 100183, 100295, 100311, 100327, + 100343, 100359, 100375, 100391, 100407, 100423, 100439, 114017, 102231, + 102343, 102407, 102423, 102439, 102455, 102471, 102487, 102599, 102615, + 102631, 114021, 102679, 114025, 102711, 102727, 102743, 114029, 114034, + 114039, 114044, 114049, 114054, 114059, 114063, 114067, 114072, 114077, + 114081, 114086, 114091, 114095, 114100, 114105, 114110, 114115, 114119, + 114124, 114129, 114133, 114138, 114142, 114146, 114150, 114154, 114159, + 114163, 114167, 114171, 114175, 114179, 114183, 114187, 114191, 114195, + 114200, 114205, 114210, 114215, 114220, 114225, 114230, 114235, 114240, + 114245, 114249, 114253, 114257, 114261, 114265, 114269, 114274, 114278, + 114283, 114287, 114292, 114297, 114301, 114305, 114310, 114314, 114318, + 114322, 114326, 114330, 114334, 114338, 114342, 114346, 114350, 114354, + 114358, 114362, 114366, 114371, 114376, 114380, 114384, 114388, 114392, + 114396, 114400, 114405, 114409, 114413, 114417, 114421, 114425, 114429, + 114434, 114438, 114443, 114447, 114451, 114455, 114459, 114463, 114467, + 114471, 114475, 114479, 114483, 114487, 114492, 114496, 114500, 114504, + 114508, 114512, 114516, 114520, 114524, 114528, 114532, 114536, 114541, + 114545, 114549, 114554, 114559, 114563, 114567, 114571, 114575, 114579, + 114583, 114587, 114591, 114596, 114600, 114605, 114609, 114614, 114618, + 114623, 114627, 114633, 114638, 114642, 114647, 114651, 114656, 114660, + 114665, 114669, 114674, 1429, 114678, 2947, 1694, 27772, 1602, 30392, + 114682, 2956, 114686, 1284, 114691, 1226, 114695, 114699, 2980, 114703, + 114711, 114718, 114725, 114739, 2984, 7816, 114748, 114756, 114763, + 114774, 114783, 114787, 114794, 114806, 114819, 114832, 114843, 114848, + 114855, 114867, 114871, 2988, 13750, 114881, 114886, 114895, 114905, + 114910, 2992, 114918, 114922, 114927, 114934, 114940, 114945, 114954, + 114962, 114974, 114984, 1231, 15184, 114997, 115001, 115007, 115021, + 115033, 115045, 115053, 115063, 115072, 115081, 115090, 115098, 115109, + 115117, 4542, 115127, 115138, 115147, 115153, 115168, 115175, 115181, + 115186, 42108, 115191, 3016, 15188, 115195, 115200, 115207, 9913, 115216, + 115222, 3021, 38073, 115231, 70006, 115238, 115242, 115248, 115259, + 115265, 115270, 115277, 115283, 115291, 115298, 115304, 115315, 115331, + 115341, 115350, 115361, 115370, 115377, 115383, 115393, 115401, 115407, + 115422, 115428, 115433, 115437, 115444, 115452, 115456, 115459, 115465, + 115472, 115478, 115486, 115495, 115503, 115509, 115518, 50546, 115532, + 115537, 115543, 17198, 115548, 115561, 115573, 115582, 115590, 115597, + 115601, 115605, 115608, 115615, 115622, 115630, 115638, 115647, 115655, + 17103, 115663, 115668, 115672, 115684, 115691, 115698, 115707, 936, + 115717, 115726, 115737, 3042, 115741, 115745, 115751, 115764, 115776, + 115786, 115795, 115807, 31225, 115818, 115826, 115835, 115846, 115857, + 115867, 115877, 115885, 115894, 115902, 13175, 115909, 115913, 115916, + 115921, 115926, 115930, 115936, 1236, 115943, 115947, 13838, 115951, + 115962, 115971, 115979, 115988, 115996, 116012, 116023, 116032, 116040, + 116052, 116063, 116079, 116089, 116110, 116124, 116137, 116145, 116152, + 7862, 116165, 116170, 116176, 6523, 116182, 116185, 116192, 116202, 8993, + 116209, 116214, 116219, 116226, 116231, 116239, 116248, 116256, 116261, + 116270, 116277, 11055, 11064, 116283, 116294, 116300, 116305, 116311, + 3058, 3063, 116317, 1025, 116323, 116330, 116337, 116350, 116360, 116365, + 2229, 87, 116373, 116380, 116385, 116393, 116403, 116412, 116418, 116427, + 116435, 116445, 116449, 116453, 116458, 116462, 116474, 3086, 116482, + 116490, 116495, 116506, 116517, 116529, 116540, 116550, 116559, 25362, + 116564, 116570, 116575, 116585, 116595, 116600, 33382, 116606, 116611, + 116620, 25374, 116624, 4651, 8, 116629, 116638, 116645, 116652, 116658, + 116663, 116667, 116673, 33406, 116678, 116683, 70678, 116688, 116693, + 116699, 116705, 116713, 116718, 116726, 116733, 116739, 116744, 46352, + 50440, 116750, 1765, 32, 116760, 116765, 116778, 116783, 116791, 116796, + 116802, 3112, 33461, 116807, 116815, 116822, 116827, 116832, 116841, + 4225, 4236, 71887, 116849, 116853, 1629, 1777, 116858, 116863, 116870, + 33814, 1781, 323, 116877, 116883, 116888, 3134, 116892, 116897, 116904, + 1785, 116909, 116915, 116920, 116932, 6760, 116942, 116949, 1792, 116955, + 116960, 116967, 116974, 116989, 116996, 117007, 117012, 117020, 2677, + 117024, 117036, 117041, 117045, 117051, 33260, 2234, 117055, 117066, + 117070, 117074, 117080, 117084, 117093, 117097, 117108, 117112, 2280, + 37890, 117116, 117126, 117134, 3225, 117140, 117149, 117157, 10454, + 117162, 117170, 117175, 117179, 117188, 117195, 117201, 3195, 17262, + 117205, 117218, 42811, 117236, 117241, 117249, 117257, 117267, 11364, + 15306, 117279, 117292, 117299, 117309, 117323, 117330, 117346, 117353, + 117359, 25412, 14519, 117366, 117373, 117383, 117392, 51230, 117404, + 117412, 51365, 117419, 117422, 117428, 117434, 117440, 117446, 117452, + 117459, 117466, 117472, 117478, 117484, 117490, 117496, 117502, 117508, + 117514, 117520, 117526, 117532, 117538, 117544, 117550, 117556, 117562, + 117568, 117574, 117580, 117586, 117592, 117598, 117604, 117610, 117616, + 117622, 117628, 117634, 117640, 117646, 117652, 117658, 117664, 117670, + 117676, 117682, 117688, 117694, 117700, 117706, 117712, 117718, 117724, + 117730, 117736, 117742, 117748, 117754, 117760, 117766, 117772, 117779, + 117785, 117792, 117799, 117805, 117812, 117819, 117825, 117831, 117837, + 117843, 117849, 117855, 117861, 117867, 117873, 117879, 117885, 117891, + 117897, 117903, 117909, 3209, 10427, 117915, 117925, 117931, 117939, + 117943, 114930, 3213, 117947, 111346, 25115, 14131, 4150, 117951, 3219, + 117955, 117965, 117971, 117977, 117983, 117989, 117995, 118001, 118007, + 118013, 118019, 118025, 118031, 118037, 118043, 118049, 118055, 118061, + 118067, 118073, 118079, 118085, 118091, 118097, 118103, 118109, 118115, + 118122, 118129, 118135, 118141, 118147, 118153, 118159, 118165, 1241, + 118171, 118176, 118181, 118186, 118191, 118196, 118201, 118206, 118211, + 118215, 118219, 118223, 118227, 118231, 118235, 118239, 118243, 118247, + 118253, 118259, 118265, 118271, 118275, 118279, 118283, 118287, 118291, + 118295, 118299, 118303, 118307, 118312, 118317, 118322, 118327, 118332, + 118337, 118342, 118347, 118352, 118357, 118362, 118367, 118372, 118377, + 118382, 118387, 118392, 118397, 118402, 118407, 118412, 118417, 118422, + 118427, 118432, 118437, 118442, 118447, 118452, 118457, 118462, 118467, + 118472, 118477, 118482, 118487, 118492, 118497, 118502, 118507, 118512, + 118517, 118522, 118527, 118532, 118537, 118542, 118547, 118552, 118557, + 118562, 118567, 118572, 118577, 118582, 118587, 118592, 118597, 118602, + 118607, 118612, 118617, 118622, 118627, 118632, 118637, 118642, 118647, + 118652, 118657, 118662, 118667, 118672, 118677, 118682, 118687, 118692, + 118697, 118702, 118707, 118712, 118717, 118722, 118727, 118732, 118737, + 118742, 118747, 118752, 118757, 118762, 118767, 118772, 118777, 118782, + 118787, 118792, 118797, 118802, 118807, 118812, 118817, 118822, 118827, + 118832, 118837, 118842, 118847, 118852, 118857, 118862, 118867, 118872, + 118877, 118882, 118887, 118892, 118897, 118902, 118907, 118912, 118917, + 118922, 118927, 118932, 118937, 118942, 118947, 118952, 118957, 118962, + 118967, 118972, 118977, 118982, 118987, 118992, 118997, 119002, 119007, + 119012, 119017, 119022, 119027, 119032, 119037, 119042, 119047, 119052, + 119057, 119062, 119067, 119072, 119077, 119082, 119087, 119092, 119097, + 119102, 119107, 119112, 119117, 119122, 119127, 119132, 119137, 119142, + 119147, 119152, 119157, 119162, 119167, 119172, 119177, 119182, 119187, + 119192, 119197, 119203, 119208, 119213, 119218, 119223, 119228, 119233, + 119238, 119244, 119249, 119254, 119259, 119264, 119269, 119274, 119279, + 119284, 119289, 119294, 119299, 119304, 119309, 119314, 119319, 119324, + 119329, 119334, 119339, 119344, 119349, 119354, 119359, 119364, 119369, + 119374, 119379, 119384, 119389, 119394, 119399, 119404, 119413, 119418, + 119427, 119432, 119441, 119446, 119455, 119460, 119469, 119474, 119483, + 119488, 119497, 119502, 119511, 119516, 119521, 119530, 119534, 119543, + 119548, 119557, 119562, 119571, 119576, 119585, 119590, 119599, 119604, + 119613, 119618, 119627, 119632, 119641, 119646, 119655, 119660, 119669, + 119674, 119679, 119684, 119689, 119694, 119699, 119704, 119708, 119713, + 119718, 119723, 119728, 119733, 119738, 119744, 119749, 119754, 119759, + 119765, 119769, 119774, 119780, 119785, 119790, 119795, 119800, 119805, + 119810, 119815, 119820, 119825, 119830, 119836, 119841, 119846, 119851, + 119857, 119862, 119867, 119872, 119877, 119883, 119888, 119893, 119898, + 119903, 119908, 119914, 119919, 119924, 119929, 119934, 119939, 119944, + 119949, 119954, 119959, 119964, 119969, 119974, 119979, 119984, 119989, + 119994, 119999, 120004, 120009, 120014, 120019, 120024, 120029, 120035, + 120041, 120047, 120052, 120057, 120062, 120067, 120073, 120079, 120085, + 120090, 120095, 120100, 120106, 120111, 120116, 120121, 120126, 120131, + 120136, 120141, 120146, 120151, 120156, 120161, 120166, 120171, 120176, + 120181, 120186, 120192, 120198, 120204, 120209, 120214, 120219, 120224, + 120230, 120236, 120242, 120247, 120252, 120257, 120262, 120267, 120272, + 120277, 120282, 120287, 18854, 120292, 120298, 120303, 120308, 120313, + 120318, 120323, 120329, 120334, 120339, 120344, 120349, 120354, 120360, + 120365, 120370, 120375, 120380, 120385, 120390, 120395, 120400, 120405, + 120410, 120415, 120420, 120425, 120430, 120435, 120440, 120445, 120450, + 120455, 120460, 120465, 120470, 120476, 120481, 120486, 120491, 120496, + 120501, 120506, 120511, 120516, 120521, 120526, 120531, 120536, 120541, + 120546, 120551, 120556, 120561, 120566, 120571, 120576, 120581, 120586, + 120591, 120596, 120601, 120606, 120611, 120616, 120621, 120626, 120631, + 120636, 120641, 120646, 120651, 120656, 120661, 120666, 120671, 120676, + 120682, 120687, 120692, 120697, 120702, 120707, 120712, 120717, 120722, + 120727, 120732, 120737, 120743, 120748, 120754, 120759, 120764, 120769, + 120774, 120779, 120784, 120790, 120795, 120800, 120806, 120811, 120816, + 120821, 120826, 120831, 120837, 120843, 120848, 120853, 14153, 120858, + 120863, 120868, 120873, 120878, 120883, 120888, 120893, 120898, 120903, + 120908, 120913, 120918, 120923, 120928, 120933, 120938, 120943, 120948, + 120953, 120958, 120963, 120968, 120973, 120978, 120983, 120988, 120993, + 120998, 121003, 121008, 121013, 121018, 121023, 121028, 121033, 121038, + 121043, 121048, 121053, 121058, 121063, 121068, 121073, 121078, 121083, + 121088, 121093, 121098, 121103, 121108, 121113, 121118, 121123, 121128, + 121133, 121138, 121143, 121148, 121153, 121158, 121163, 121168, 121173, + 121178, 121184, 121189, 121194, 121199, 121204, 121210, 121215, 121220, + 121225, 121230, 121235, 121240, 121246, 121251, 121256, 121261, 121266, + 121271, 121277, 121282, 121287, 121292, 121297, 121302, 121308, 121313, + 121318, 121323, 121328, 121333, 121339, 121345, 121350, 121355, 121360, + 121366, 121372, 121378, 121383, 121388, 121394, 121400, 121405, 121411, + 121417, 121423, 121428, 121433, 121439, 121444, 121450, 121455, 121461, + 121470, 121475, 121480, 121486, 121491, 121497, 121502, 121507, 121512, + 121517, 121522, 121527, 121532, 121537, 121542, 121547, 121552, 121557, + 121562, 121567, 121572, 121577, 121582, 121587, 121592, 121597, 121602, + 121607, 121612, 121617, 121622, 121627, 121632, 121637, 121642, 121647, + 121652, 121658, 121664, 121670, 121675, 121680, 121685, 121690, 121695, + 121700, 121705, 121710, 121715, 121720, 121725, 121730, 121735, 121740, + 121745, 121750, 121755, 121760, 121765, 121770, 121776, 121782, 121787, + 121793, 121798, 121803, 121809, 121814, 121820, 121825, 121831, 121836, + 121842, 121847, 121853, 121858, 121863, 121868, 121873, 121878, 121883, + 121888, 117966, 117972, 117978, 117984, 121894, 117990, 117996, 121900, + 118002, 118008, 118014, 118020, 118026, 118032, 118038, 118044, 118050, + 121906, 118056, 118062, 118068, 121912, 118074, 118080, 118086, 118092, + 121918, 118098, 118104, 118110, 118130, 121924, 121930, 118136, 121936, + 118142, 118148, 118154, 118160, 118166, 121942, 3236, 3241, 121947, 3256, + 3261, 3266, 121952, 121955, 121961, 121967, 121974, 121979, 121984, 2285, }; /* code->name phrasebook */ -#define phrasebook_shift 7 -#define phrasebook_short 194 +#define phrasebook_shift 8 +#define phrasebook_short 191 static const unsigned char phrasebook[] = { - 0, 205, 148, 236, 90, 78, 211, 62, 78, 31, 55, 239, 10, 55, 213, 45, 55, - 251, 111, 251, 30, 50, 213, 140, 53, 213, 140, 250, 179, 98, 55, 244, - 159, 231, 6, 234, 217, 204, 226, 205, 177, 17, 195, 79, 17, 100, 17, 102, - 17, 134, 17, 136, 17, 146, 17, 167, 17, 178, 17, 171, 17, 182, 244, 168, - 207, 105, 222, 140, 55, 236, 172, 55, 233, 94, 55, 211, 79, 78, 244, 157, - 250, 168, 8, 6, 1, 63, 8, 6, 1, 250, 112, 8, 6, 1, 247, 207, 8, 6, 1, - 240, 231, 8, 6, 1, 69, 8, 6, 1, 236, 49, 8, 6, 1, 234, 190, 8, 6, 1, 233, - 15, 8, 6, 1, 68, 8, 6, 1, 225, 217, 8, 6, 1, 225, 80, 8, 6, 1, 159, 8, 6, - 1, 221, 136, 8, 6, 1, 218, 55, 8, 6, 1, 72, 8, 6, 1, 214, 3, 8, 6, 1, - 211, 167, 8, 6, 1, 144, 8, 6, 1, 209, 80, 8, 6, 1, 203, 216, 8, 6, 1, 66, - 8, 6, 1, 199, 230, 8, 6, 1, 197, 199, 8, 6, 1, 196, 222, 8, 6, 1, 196, - 148, 8, 6, 1, 195, 158, 50, 47, 179, 210, 90, 205, 177, 53, 47, 179, 244, - 241, 252, 22, 126, 222, 75, 233, 101, 252, 22, 8, 4, 1, 63, 8, 4, 1, 250, - 112, 8, 4, 1, 247, 207, 8, 4, 1, 240, 231, 8, 4, 1, 69, 8, 4, 1, 236, 49, - 8, 4, 1, 234, 190, 8, 4, 1, 233, 15, 8, 4, 1, 68, 8, 4, 1, 225, 217, 8, - 4, 1, 225, 80, 8, 4, 1, 159, 8, 4, 1, 221, 136, 8, 4, 1, 218, 55, 8, 4, - 1, 72, 8, 4, 1, 214, 3, 8, 4, 1, 211, 167, 8, 4, 1, 144, 8, 4, 1, 209, - 80, 8, 4, 1, 203, 216, 8, 4, 1, 66, 8, 4, 1, 199, 230, 8, 4, 1, 197, 199, - 8, 4, 1, 196, 222, 8, 4, 1, 196, 148, 8, 4, 1, 195, 158, 50, 241, 18, - 179, 83, 222, 75, 53, 241, 18, 179, 202, 84, 216, 44, 205, 148, 226, 17, - 236, 90, 78, 247, 39, 55, 212, 63, 55, 241, 17, 55, 196, 60, 55, 248, 33, - 154, 208, 133, 55, 239, 150, 241, 105, 55, 235, 170, 214, 67, 226, 68, - 222, 179, 52, 251, 91, 211, 62, 78, 216, 19, 55, 205, 186, 231, 7, 210, - 149, 55, 220, 114, 239, 231, 55, 212, 124, 55, 204, 95, 102, 204, 95, - 134, 252, 10, 252, 22, 219, 69, 55, 212, 179, 55, 112, 238, 253, 247, 50, - 204, 95, 100, 220, 13, 214, 67, 226, 68, 210, 17, 52, 251, 91, 211, 62, - 78, 197, 217, 191, 97, 211, 87, 197, 217, 191, 97, 232, 225, 197, 217, - 191, 115, 211, 85, 226, 17, 211, 79, 78, 8, 6, 1, 39, 3, 233, 100, 8, 6, - 1, 39, 3, 186, 8, 6, 1, 39, 3, 244, 240, 8, 6, 1, 39, 3, 202, 84, 8, 6, - 1, 39, 3, 239, 150, 8, 6, 1, 39, 3, 210, 3, 57, 8, 6, 1, 251, 245, 8, 6, - 1, 247, 208, 3, 247, 50, 8, 6, 1, 237, 136, 3, 233, 100, 8, 6, 1, 237, - 136, 3, 186, 8, 6, 1, 237, 136, 3, 244, 240, 8, 6, 1, 237, 136, 3, 239, - 150, 8, 6, 1, 230, 249, 3, 233, 100, 8, 6, 1, 230, 249, 3, 186, 8, 6, 1, - 230, 249, 3, 244, 240, 8, 6, 1, 230, 249, 3, 239, 150, 8, 6, 1, 236, 121, - 8, 6, 1, 218, 56, 3, 202, 84, 8, 6, 1, 177, 3, 233, 100, 8, 6, 1, 177, 3, - 186, 8, 6, 1, 177, 3, 244, 240, 8, 6, 1, 177, 3, 202, 84, 8, 6, 1, 177, - 3, 239, 150, 218, 118, 55, 8, 6, 1, 177, 3, 106, 8, 6, 1, 118, 3, 233, - 100, 8, 6, 1, 118, 3, 186, 8, 6, 1, 118, 3, 244, 240, 8, 6, 1, 118, 3, - 239, 150, 8, 6, 1, 196, 149, 3, 186, 8, 6, 1, 202, 162, 8, 4, 1, 207, 13, - 209, 80, 8, 4, 1, 39, 3, 233, 100, 8, 4, 1, 39, 3, 186, 8, 4, 1, 39, 3, - 244, 240, 8, 4, 1, 39, 3, 202, 84, 8, 4, 1, 39, 3, 239, 150, 8, 4, 1, 39, - 3, 210, 3, 57, 8, 4, 1, 251, 245, 8, 4, 1, 247, 208, 3, 247, 50, 8, 4, 1, - 237, 136, 3, 233, 100, 8, 4, 1, 237, 136, 3, 186, 8, 4, 1, 237, 136, 3, - 244, 240, 8, 4, 1, 237, 136, 3, 239, 150, 8, 4, 1, 230, 249, 3, 233, 100, - 8, 4, 1, 230, 249, 3, 186, 8, 4, 1, 230, 249, 3, 244, 240, 8, 4, 1, 230, - 249, 3, 239, 150, 8, 4, 1, 236, 121, 8, 4, 1, 218, 56, 3, 202, 84, 8, 4, - 1, 177, 3, 233, 100, 8, 4, 1, 177, 3, 186, 8, 4, 1, 177, 3, 244, 240, 8, - 4, 1, 177, 3, 202, 84, 8, 4, 1, 177, 3, 239, 150, 239, 54, 55, 8, 4, 1, - 177, 3, 106, 8, 4, 1, 118, 3, 233, 100, 8, 4, 1, 118, 3, 186, 8, 4, 1, - 118, 3, 244, 240, 8, 4, 1, 118, 3, 239, 150, 8, 4, 1, 196, 149, 3, 186, - 8, 4, 1, 202, 162, 8, 4, 1, 196, 149, 3, 239, 150, 8, 6, 1, 39, 3, 220, - 114, 8, 4, 1, 39, 3, 220, 114, 8, 6, 1, 39, 3, 248, 47, 8, 4, 1, 39, 3, - 248, 47, 8, 6, 1, 39, 3, 214, 151, 8, 4, 1, 39, 3, 214, 151, 8, 6, 1, - 247, 208, 3, 186, 8, 4, 1, 247, 208, 3, 186, 8, 6, 1, 247, 208, 3, 244, - 240, 8, 4, 1, 247, 208, 3, 244, 240, 8, 6, 1, 247, 208, 3, 76, 57, 8, 4, - 1, 247, 208, 3, 76, 57, 8, 6, 1, 247, 208, 3, 247, 106, 8, 4, 1, 247, - 208, 3, 247, 106, 8, 6, 1, 240, 232, 3, 247, 106, 8, 4, 1, 240, 232, 3, - 247, 106, 8, 6, 1, 240, 232, 3, 106, 8, 4, 1, 240, 232, 3, 106, 8, 6, 1, - 237, 136, 3, 220, 114, 8, 4, 1, 237, 136, 3, 220, 114, 8, 6, 1, 237, 136, - 3, 248, 47, 8, 4, 1, 237, 136, 3, 248, 47, 8, 6, 1, 237, 136, 3, 76, 57, - 8, 4, 1, 237, 136, 3, 76, 57, 8, 6, 1, 237, 136, 3, 214, 151, 8, 4, 1, - 237, 136, 3, 214, 151, 8, 6, 1, 237, 136, 3, 247, 106, 8, 4, 1, 237, 136, - 3, 247, 106, 8, 6, 1, 234, 191, 3, 244, 240, 8, 4, 1, 234, 191, 3, 244, - 240, 8, 6, 1, 234, 191, 3, 248, 47, 8, 4, 1, 234, 191, 3, 248, 47, 8, 6, - 1, 234, 191, 3, 76, 57, 8, 4, 1, 234, 191, 3, 76, 57, 8, 6, 1, 234, 191, - 3, 247, 50, 8, 4, 1, 234, 191, 3, 247, 50, 8, 6, 1, 233, 16, 3, 244, 240, - 8, 4, 1, 233, 16, 3, 244, 240, 8, 6, 1, 233, 16, 3, 106, 8, 4, 1, 233, - 16, 3, 106, 8, 6, 1, 230, 249, 3, 202, 84, 8, 4, 1, 230, 249, 3, 202, 84, - 8, 6, 1, 230, 249, 3, 220, 114, 8, 4, 1, 230, 249, 3, 220, 114, 8, 6, 1, - 230, 249, 3, 248, 47, 8, 4, 1, 230, 249, 3, 248, 47, 8, 6, 1, 230, 249, - 3, 214, 151, 8, 4, 1, 230, 249, 3, 214, 151, 8, 6, 1, 230, 249, 3, 76, - 57, 8, 4, 1, 238, 252, 68, 8, 6, 33, 226, 118, 8, 4, 33, 226, 118, 8, 6, - 1, 225, 218, 3, 244, 240, 8, 4, 1, 225, 218, 3, 244, 240, 8, 6, 1, 225, - 81, 3, 247, 50, 8, 4, 1, 225, 81, 3, 247, 50, 8, 4, 1, 223, 210, 8, 6, 1, - 223, 100, 3, 186, 8, 4, 1, 223, 100, 3, 186, 8, 6, 1, 223, 100, 3, 247, - 50, 8, 4, 1, 223, 100, 3, 247, 50, 8, 6, 1, 223, 100, 3, 247, 106, 8, 4, - 1, 223, 100, 3, 247, 106, 8, 6, 1, 223, 100, 3, 112, 238, 253, 8, 4, 1, - 223, 100, 3, 112, 238, 253, 8, 6, 1, 223, 100, 3, 106, 8, 4, 1, 223, 100, - 3, 106, 8, 6, 1, 218, 56, 3, 186, 8, 4, 1, 218, 56, 3, 186, 8, 6, 1, 218, - 56, 3, 247, 50, 8, 4, 1, 218, 56, 3, 247, 50, 8, 6, 1, 218, 56, 3, 247, - 106, 8, 4, 1, 218, 56, 3, 247, 106, 8, 4, 1, 218, 56, 212, 37, 247, 219, - 251, 30, 8, 6, 1, 236, 215, 8, 4, 1, 236, 215, 8, 6, 1, 177, 3, 220, 114, - 8, 4, 1, 177, 3, 220, 114, 8, 6, 1, 177, 3, 248, 47, 8, 4, 1, 177, 3, - 248, 47, 8, 6, 1, 177, 3, 52, 186, 8, 4, 1, 177, 3, 52, 186, 8, 6, 33, - 214, 164, 8, 4, 33, 214, 164, 8, 6, 1, 211, 32, 3, 186, 8, 4, 1, 211, 32, - 3, 186, 8, 6, 1, 211, 32, 3, 247, 50, 8, 4, 1, 211, 32, 3, 247, 50, 8, 6, - 1, 211, 32, 3, 247, 106, 8, 4, 1, 211, 32, 3, 247, 106, 8, 6, 1, 209, 81, - 3, 186, 8, 4, 1, 209, 81, 3, 186, 8, 6, 1, 209, 81, 3, 244, 240, 8, 4, 1, - 209, 81, 3, 244, 240, 8, 6, 1, 209, 81, 3, 247, 50, 8, 4, 1, 209, 81, 3, - 247, 50, 8, 6, 1, 209, 81, 3, 247, 106, 8, 4, 1, 209, 81, 3, 247, 106, 8, - 6, 1, 203, 217, 3, 247, 50, 8, 4, 1, 203, 217, 3, 247, 50, 8, 6, 1, 203, - 217, 3, 247, 106, 8, 4, 1, 203, 217, 3, 247, 106, 8, 6, 1, 203, 217, 3, - 106, 8, 4, 1, 203, 217, 3, 106, 8, 6, 1, 118, 3, 202, 84, 8, 4, 1, 118, - 3, 202, 84, 8, 6, 1, 118, 3, 220, 114, 8, 4, 1, 118, 3, 220, 114, 8, 6, - 1, 118, 3, 248, 47, 8, 4, 1, 118, 3, 248, 47, 8, 6, 1, 118, 3, 210, 3, - 57, 8, 4, 1, 118, 3, 210, 3, 57, 8, 6, 1, 118, 3, 52, 186, 8, 4, 1, 118, - 3, 52, 186, 8, 6, 1, 118, 3, 214, 151, 8, 4, 1, 118, 3, 214, 151, 8, 6, - 1, 197, 200, 3, 244, 240, 8, 4, 1, 197, 200, 3, 244, 240, 8, 6, 1, 196, - 149, 3, 244, 240, 8, 4, 1, 196, 149, 3, 244, 240, 8, 6, 1, 196, 149, 3, - 239, 150, 8, 6, 1, 195, 159, 3, 186, 8, 4, 1, 195, 159, 3, 186, 8, 6, 1, - 195, 159, 3, 76, 57, 8, 4, 1, 195, 159, 3, 76, 57, 8, 6, 1, 195, 159, 3, - 247, 106, 8, 4, 1, 195, 159, 3, 247, 106, 8, 4, 1, 181, 209, 80, 8, 4, 1, - 74, 3, 106, 8, 6, 1, 74, 3, 122, 8, 6, 1, 74, 3, 201, 240, 8, 4, 1, 74, - 3, 201, 240, 8, 6, 1, 152, 167, 8, 4, 1, 152, 167, 8, 6, 1, 192, 72, 8, - 6, 1, 247, 208, 3, 122, 8, 4, 1, 247, 208, 3, 122, 8, 6, 1, 251, 220, - 240, 231, 8, 6, 1, 240, 232, 3, 122, 8, 6, 1, 240, 232, 3, 201, 240, 8, - 4, 1, 240, 232, 3, 201, 240, 8, 4, 1, 163, 239, 212, 8, 6, 1, 210, 89, - 69, 8, 6, 1, 208, 163, 8, 6, 1, 192, 69, 8, 6, 1, 236, 50, 3, 122, 8, 4, - 1, 236, 50, 3, 122, 8, 6, 1, 234, 191, 3, 122, 8, 6, 1, 234, 94, 8, 4, 1, - 231, 44, 8, 6, 1, 226, 7, 8, 6, 1, 230, 249, 3, 106, 8, 6, 1, 225, 81, 3, - 122, 8, 4, 1, 225, 81, 3, 122, 8, 4, 1, 223, 100, 3, 154, 8, 4, 1, 222, - 247, 3, 106, 8, 6, 1, 163, 221, 136, 8, 6, 1, 218, 56, 3, 50, 122, 8, 4, - 1, 218, 56, 3, 181, 53, 222, 172, 8, 6, 1, 177, 3, 112, 202, 84, 8, 6, 1, - 177, 3, 231, 102, 8, 4, 1, 177, 3, 231, 102, 8, 6, 1, 214, 146, 8, 4, 1, - 214, 146, 8, 6, 1, 214, 4, 3, 122, 8, 4, 1, 214, 4, 3, 122, 8, 1, 195, - 220, 8, 6, 1, 152, 102, 8, 4, 1, 152, 102, 8, 6, 1, 236, 141, 8, 1, 210, - 89, 236, 142, 221, 225, 8, 4, 1, 203, 217, 3, 213, 215, 122, 8, 6, 1, - 203, 217, 3, 122, 8, 4, 1, 203, 217, 3, 122, 8, 6, 1, 203, 217, 3, 210, - 95, 122, 8, 6, 1, 118, 3, 231, 102, 8, 4, 1, 118, 3, 231, 102, 8, 6, 1, - 200, 28, 8, 6, 1, 199, 231, 3, 122, 8, 6, 1, 196, 149, 3, 122, 8, 4, 1, - 196, 149, 3, 122, 8, 6, 1, 195, 159, 3, 106, 8, 4, 1, 195, 159, 3, 106, - 8, 6, 1, 236, 52, 8, 6, 1, 236, 53, 210, 88, 8, 4, 1, 236, 53, 210, 88, - 8, 4, 1, 236, 53, 3, 203, 135, 8, 1, 99, 3, 106, 8, 6, 1, 152, 146, 8, 4, - 1, 152, 146, 8, 1, 226, 17, 233, 152, 204, 227, 3, 106, 8, 1, 196, 225, - 8, 1, 239, 205, 244, 215, 8, 1, 222, 218, 244, 215, 8, 1, 251, 124, 244, - 215, 8, 1, 210, 95, 244, 215, 8, 6, 1, 237, 158, 3, 247, 106, 8, 6, 1, - 240, 232, 3, 4, 1, 195, 159, 3, 247, 106, 8, 4, 1, 237, 158, 3, 247, 106, - 8, 6, 1, 222, 41, 8, 6, 1, 223, 100, 3, 4, 1, 225, 217, 8, 4, 1, 222, 41, - 8, 6, 1, 216, 165, 8, 6, 1, 218, 56, 3, 4, 1, 225, 217, 8, 4, 1, 216, - 165, 8, 6, 1, 39, 3, 247, 106, 8, 4, 1, 39, 3, 247, 106, 8, 6, 1, 230, - 249, 3, 247, 106, 8, 4, 1, 230, 249, 3, 247, 106, 8, 6, 1, 177, 3, 247, - 106, 8, 4, 1, 177, 3, 247, 106, 8, 6, 1, 118, 3, 247, 106, 8, 4, 1, 118, - 3, 247, 106, 8, 6, 1, 118, 3, 239, 151, 26, 220, 114, 8, 4, 1, 118, 3, - 239, 151, 26, 220, 114, 8, 6, 1, 118, 3, 239, 151, 26, 186, 8, 4, 1, 118, - 3, 239, 151, 26, 186, 8, 6, 1, 118, 3, 239, 151, 26, 247, 106, 8, 4, 1, - 118, 3, 239, 151, 26, 247, 106, 8, 6, 1, 118, 3, 239, 151, 26, 233, 100, - 8, 4, 1, 118, 3, 239, 151, 26, 233, 100, 8, 4, 1, 163, 69, 8, 6, 1, 39, - 3, 239, 151, 26, 220, 114, 8, 4, 1, 39, 3, 239, 151, 26, 220, 114, 8, 6, - 1, 39, 3, 76, 90, 26, 220, 114, 8, 4, 1, 39, 3, 76, 90, 26, 220, 114, 8, - 6, 1, 251, 246, 3, 220, 114, 8, 4, 1, 251, 246, 3, 220, 114, 8, 6, 1, - 234, 191, 3, 106, 8, 4, 1, 234, 191, 3, 106, 8, 6, 1, 234, 191, 3, 247, - 106, 8, 4, 1, 234, 191, 3, 247, 106, 8, 6, 1, 225, 81, 3, 247, 106, 8, 4, - 1, 225, 81, 3, 247, 106, 8, 6, 1, 177, 3, 214, 151, 8, 4, 1, 177, 3, 214, - 151, 8, 6, 1, 177, 3, 214, 152, 26, 220, 114, 8, 4, 1, 177, 3, 214, 152, - 26, 220, 114, 8, 6, 1, 236, 53, 3, 247, 106, 8, 4, 1, 236, 53, 3, 247, - 106, 8, 4, 1, 225, 218, 3, 247, 106, 8, 6, 1, 237, 157, 8, 6, 1, 240, - 232, 3, 4, 1, 195, 158, 8, 4, 1, 237, 157, 8, 6, 1, 234, 191, 3, 186, 8, - 4, 1, 234, 191, 3, 186, 8, 6, 1, 231, 41, 8, 6, 1, 196, 225, 8, 6, 1, - 218, 56, 3, 233, 100, 8, 4, 1, 218, 56, 3, 233, 100, 8, 6, 1, 39, 3, 210, - 3, 90, 26, 186, 8, 4, 1, 39, 3, 210, 3, 90, 26, 186, 8, 6, 1, 251, 246, - 3, 186, 8, 4, 1, 251, 246, 3, 186, 8, 6, 1, 177, 3, 204, 196, 26, 186, 8, - 4, 1, 177, 3, 204, 196, 26, 186, 8, 6, 1, 39, 3, 52, 233, 100, 8, 4, 1, - 39, 3, 52, 233, 100, 8, 6, 1, 39, 3, 226, 17, 248, 47, 8, 4, 1, 39, 3, - 226, 17, 248, 47, 8, 6, 1, 237, 136, 3, 52, 233, 100, 8, 4, 1, 237, 136, - 3, 52, 233, 100, 8, 6, 1, 237, 136, 3, 226, 17, 248, 47, 8, 4, 1, 237, - 136, 3, 226, 17, 248, 47, 8, 6, 1, 230, 249, 3, 52, 233, 100, 8, 4, 1, - 230, 249, 3, 52, 233, 100, 8, 6, 1, 230, 249, 3, 226, 17, 248, 47, 8, 4, - 1, 230, 249, 3, 226, 17, 248, 47, 8, 6, 1, 177, 3, 52, 233, 100, 8, 4, 1, - 177, 3, 52, 233, 100, 8, 6, 1, 177, 3, 226, 17, 248, 47, 8, 4, 1, 177, 3, - 226, 17, 248, 47, 8, 6, 1, 211, 32, 3, 52, 233, 100, 8, 4, 1, 211, 32, 3, - 52, 233, 100, 8, 6, 1, 211, 32, 3, 226, 17, 248, 47, 8, 4, 1, 211, 32, 3, - 226, 17, 248, 47, 8, 6, 1, 118, 3, 52, 233, 100, 8, 4, 1, 118, 3, 52, - 233, 100, 8, 6, 1, 118, 3, 226, 17, 248, 47, 8, 4, 1, 118, 3, 226, 17, - 248, 47, 8, 6, 1, 209, 81, 3, 244, 160, 60, 8, 4, 1, 209, 81, 3, 244, - 160, 60, 8, 6, 1, 203, 217, 3, 244, 160, 60, 8, 4, 1, 203, 217, 3, 244, - 160, 60, 8, 6, 1, 195, 239, 8, 4, 1, 195, 239, 8, 6, 1, 233, 16, 3, 247, - 106, 8, 4, 1, 233, 16, 3, 247, 106, 8, 6, 1, 218, 56, 3, 181, 53, 222, - 172, 8, 4, 1, 240, 232, 3, 241, 21, 8, 6, 1, 214, 39, 8, 4, 1, 214, 39, - 8, 6, 1, 195, 159, 3, 122, 8, 4, 1, 195, 159, 3, 122, 8, 6, 1, 39, 3, 76, - 57, 8, 4, 1, 39, 3, 76, 57, 8, 6, 1, 237, 136, 3, 247, 50, 8, 4, 1, 237, - 136, 3, 247, 50, 8, 6, 1, 177, 3, 239, 151, 26, 220, 114, 8, 4, 1, 177, - 3, 239, 151, 26, 220, 114, 8, 6, 1, 177, 3, 202, 85, 26, 220, 114, 8, 4, - 1, 177, 3, 202, 85, 26, 220, 114, 8, 6, 1, 177, 3, 76, 57, 8, 4, 1, 177, - 3, 76, 57, 8, 6, 1, 177, 3, 76, 90, 26, 220, 114, 8, 4, 1, 177, 3, 76, - 90, 26, 220, 114, 8, 6, 1, 196, 149, 3, 220, 114, 8, 4, 1, 196, 149, 3, - 220, 114, 8, 4, 1, 223, 100, 3, 241, 21, 8, 4, 1, 218, 56, 3, 241, 21, 8, - 4, 1, 203, 217, 3, 241, 21, 8, 4, 1, 238, 252, 225, 217, 8, 4, 1, 240, - 51, 239, 110, 8, 4, 1, 211, 98, 239, 110, 8, 6, 1, 39, 3, 106, 8, 6, 1, - 247, 208, 3, 106, 8, 4, 1, 247, 208, 3, 106, 8, 6, 1, 223, 100, 3, 154, - 8, 6, 1, 203, 217, 3, 239, 147, 106, 8, 4, 1, 209, 81, 3, 204, 63, 203, - 135, 8, 4, 1, 195, 159, 3, 204, 63, 203, 135, 8, 6, 1, 233, 152, 204, - 226, 8, 4, 1, 233, 152, 204, 226, 8, 6, 1, 74, 3, 106, 8, 6, 1, 118, 154, - 8, 6, 1, 163, 199, 230, 8, 6, 1, 237, 136, 3, 106, 8, 4, 1, 237, 136, 3, - 106, 8, 6, 1, 225, 218, 3, 106, 8, 4, 1, 225, 218, 3, 106, 8, 6, 1, 4, - 211, 168, 3, 231, 165, 203, 135, 8, 4, 1, 211, 168, 3, 231, 165, 203, - 135, 8, 6, 1, 211, 32, 3, 106, 8, 4, 1, 211, 32, 3, 106, 8, 6, 1, 196, - 149, 3, 106, 8, 4, 1, 196, 149, 3, 106, 8, 4, 1, 163, 63, 8, 4, 1, 251, - 134, 8, 4, 1, 163, 251, 134, 8, 4, 1, 74, 3, 122, 8, 4, 1, 192, 72, 8, 4, - 1, 247, 208, 3, 241, 21, 8, 4, 1, 240, 232, 3, 203, 135, 8, 4, 1, 240, - 232, 3, 122, 8, 4, 1, 210, 89, 69, 8, 4, 1, 208, 163, 8, 4, 1, 208, 164, - 3, 122, 8, 4, 1, 192, 69, 8, 4, 1, 210, 89, 192, 69, 8, 4, 1, 210, 89, - 192, 237, 136, 3, 122, 8, 4, 1, 244, 203, 210, 89, 192, 69, 8, 4, 1, 238, - 252, 225, 218, 3, 106, 8, 4, 1, 234, 191, 3, 122, 8, 4, 1, 145, 234, 190, - 8, 1, 4, 6, 234, 190, 8, 4, 1, 234, 94, 8, 4, 1, 210, 208, 231, 102, 8, - 4, 1, 163, 233, 15, 8, 4, 1, 233, 16, 3, 122, 8, 4, 1, 232, 100, 3, 122, - 8, 4, 1, 230, 249, 3, 106, 8, 4, 1, 226, 7, 8, 1, 4, 6, 68, 8, 4, 1, 223, - 100, 3, 112, 202, 84, 8, 4, 1, 223, 100, 3, 248, 225, 8, 4, 1, 223, 100, - 3, 210, 95, 122, 8, 4, 1, 222, 125, 8, 4, 1, 163, 221, 136, 8, 4, 1, 163, - 221, 137, 3, 181, 222, 172, 8, 4, 1, 221, 137, 3, 122, 8, 4, 1, 218, 56, - 3, 50, 122, 8, 4, 1, 218, 56, 3, 210, 95, 122, 8, 1, 4, 6, 218, 55, 8, 4, - 1, 249, 74, 72, 8, 1, 4, 6, 214, 164, 8, 4, 1, 244, 203, 214, 124, 8, 4, - 1, 212, 246, 8, 4, 1, 163, 144, 8, 4, 1, 163, 211, 32, 3, 181, 222, 172, - 8, 4, 1, 163, 211, 32, 3, 122, 8, 4, 1, 211, 32, 3, 181, 222, 172, 8, 4, - 1, 211, 32, 3, 203, 135, 8, 4, 1, 211, 32, 3, 235, 108, 8, 4, 1, 210, 89, - 211, 32, 3, 235, 108, 8, 1, 4, 6, 144, 8, 1, 4, 6, 226, 17, 144, 8, 4, 1, - 209, 81, 3, 122, 8, 4, 1, 236, 141, 8, 4, 1, 238, 252, 225, 218, 3, 204, - 196, 26, 122, 8, 4, 1, 205, 91, 210, 89, 236, 141, 8, 4, 1, 236, 142, 3, - 241, 21, 8, 4, 1, 163, 203, 216, 8, 4, 1, 203, 217, 3, 210, 95, 122, 8, - 4, 1, 118, 154, 8, 4, 1, 200, 28, 8, 4, 1, 199, 231, 3, 122, 8, 4, 1, - 163, 199, 230, 8, 4, 1, 163, 197, 199, 8, 4, 1, 163, 196, 148, 8, 1, 4, - 6, 196, 148, 8, 4, 1, 195, 159, 3, 210, 95, 122, 8, 4, 1, 195, 159, 3, - 241, 21, 8, 4, 1, 236, 52, 8, 4, 1, 236, 53, 3, 241, 21, 8, 1, 233, 152, - 204, 226, 8, 1, 212, 253, 198, 244, 234, 241, 8, 1, 226, 17, 233, 152, - 204, 226, 8, 1, 204, 204, 247, 207, 8, 1, 248, 168, 244, 215, 8, 1, 4, 6, - 250, 112, 8, 4, 1, 244, 203, 192, 69, 8, 1, 4, 6, 234, 191, 3, 122, 8, 1, - 4, 6, 233, 15, 8, 4, 1, 225, 218, 3, 241, 57, 8, 4, 1, 163, 225, 80, 8, - 1, 4, 6, 159, 8, 4, 1, 211, 168, 3, 122, 8, 1, 233, 152, 204, 227, 3, - 106, 8, 1, 210, 89, 233, 152, 204, 227, 3, 106, 8, 4, 1, 237, 158, 239, - 110, 8, 4, 1, 239, 178, 239, 110, 8, 4, 1, 237, 158, 239, 111, 3, 241, - 21, 8, 4, 1, 201, 115, 239, 110, 8, 4, 1, 203, 7, 239, 110, 8, 4, 1, 203, - 75, 239, 111, 3, 241, 21, 8, 4, 1, 235, 167, 239, 110, 8, 4, 1, 221, 193, - 239, 110, 8, 4, 1, 221, 138, 239, 110, 8, 1, 248, 168, 213, 44, 8, 1, - 248, 176, 213, 44, 8, 4, 1, 163, 233, 16, 3, 235, 108, 8, 4, 1, 163, 233, - 16, 3, 235, 109, 26, 203, 135, 73, 1, 4, 233, 15, 73, 1, 4, 233, 16, 3, - 122, 73, 1, 4, 225, 217, 73, 1, 4, 144, 73, 1, 4, 163, 144, 73, 1, 4, - 163, 211, 32, 3, 122, 73, 1, 4, 6, 226, 17, 144, 73, 1, 4, 197, 199, 73, - 1, 4, 196, 148, 73, 1, 212, 19, 73, 1, 52, 212, 19, 73, 1, 163, 244, 159, - 73, 1, 251, 30, 73, 1, 210, 89, 244, 159, 73, 1, 53, 157, 210, 2, 73, 1, - 50, 157, 210, 2, 73, 1, 233, 152, 204, 226, 73, 1, 210, 89, 233, 152, - 204, 226, 73, 1, 50, 250, 217, 73, 1, 53, 250, 217, 73, 1, 124, 250, 217, - 73, 1, 135, 250, 217, 73, 1, 244, 241, 252, 22, 247, 106, 73, 1, 83, 222, - 75, 73, 1, 220, 114, 73, 1, 252, 10, 252, 22, 73, 1, 233, 101, 252, 22, - 73, 1, 126, 83, 222, 75, 73, 1, 126, 220, 114, 73, 1, 126, 233, 101, 252, - 22, 73, 1, 126, 252, 10, 252, 22, 73, 1, 201, 177, 244, 168, 73, 1, 157, - 201, 177, 244, 168, 73, 1, 247, 35, 53, 157, 210, 2, 73, 1, 247, 35, 50, - 157, 210, 2, 73, 1, 124, 203, 147, 73, 1, 135, 203, 147, 73, 1, 98, 55, - 73, 1, 219, 16, 55, 248, 47, 76, 57, 210, 3, 57, 214, 151, 4, 202, 84, - 52, 252, 10, 252, 22, 73, 1, 210, 73, 122, 73, 1, 241, 62, 252, 22, 73, - 1, 4, 234, 94, 73, 1, 4, 159, 73, 1, 4, 209, 80, 73, 1, 4, 196, 222, 73, - 1, 4, 210, 89, 233, 152, 204, 226, 73, 1, 236, 74, 152, 154, 73, 1, 130, - 152, 154, 73, 1, 219, 65, 152, 154, 73, 1, 126, 152, 154, 73, 1, 236, 73, - 152, 154, 73, 1, 196, 13, 239, 202, 152, 78, 73, 1, 196, 96, 239, 202, - 152, 78, 73, 1, 198, 242, 73, 1, 200, 68, 73, 1, 52, 251, 30, 73, 1, 126, - 135, 250, 217, 73, 1, 126, 124, 250, 217, 73, 1, 126, 50, 250, 217, 73, - 1, 126, 53, 250, 217, 73, 1, 126, 210, 2, 73, 1, 112, 233, 101, 252, 22, - 73, 1, 112, 52, 233, 101, 252, 22, 73, 1, 112, 52, 252, 10, 252, 22, 73, - 1, 126, 202, 84, 73, 1, 210, 215, 244, 168, 73, 1, 248, 243, 130, 202, - 11, 73, 1, 236, 222, 130, 202, 11, 73, 1, 248, 243, 126, 202, 11, 73, 1, - 236, 222, 126, 202, 11, 73, 1, 206, 246, 73, 1, 192, 206, 246, 73, 1, - 126, 50, 51, 38, 233, 101, 252, 22, 38, 252, 10, 252, 22, 38, 244, 241, - 252, 22, 38, 202, 84, 38, 220, 114, 38, 214, 19, 38, 248, 47, 38, 76, 57, - 38, 239, 150, 38, 231, 165, 57, 38, 210, 3, 57, 38, 52, 252, 10, 252, 22, - 38, 247, 106, 38, 83, 222, 76, 57, 38, 52, 83, 222, 76, 57, 38, 52, 233, - 101, 252, 22, 38, 247, 133, 38, 226, 17, 248, 47, 38, 163, 244, 160, 57, - 38, 244, 160, 57, 38, 210, 89, 244, 160, 57, 38, 244, 160, 90, 210, 22, - 38, 233, 101, 252, 23, 60, 38, 252, 10, 252, 23, 60, 38, 50, 203, 148, - 60, 38, 53, 203, 148, 60, 38, 50, 251, 91, 57, 38, 231, 102, 38, 50, 157, - 210, 3, 60, 38, 124, 203, 148, 60, 38, 135, 203, 148, 60, 38, 98, 2, 60, - 38, 219, 16, 2, 60, 38, 213, 213, 231, 165, 60, 38, 210, 95, 231, 165, - 60, 38, 76, 60, 38, 239, 151, 60, 38, 210, 3, 60, 38, 244, 160, 60, 38, - 247, 50, 38, 214, 151, 38, 83, 222, 76, 60, 38, 248, 40, 60, 38, 226, 17, - 52, 250, 252, 60, 38, 247, 107, 60, 38, 244, 241, 252, 23, 60, 38, 248, - 48, 60, 38, 226, 17, 248, 48, 60, 38, 202, 85, 60, 38, 220, 115, 60, 38, - 126, 222, 75, 38, 52, 126, 222, 75, 38, 202, 85, 214, 20, 38, 206, 182, - 204, 196, 214, 20, 38, 181, 204, 196, 214, 20, 38, 206, 182, 205, 178, - 214, 20, 38, 181, 205, 178, 214, 20, 38, 53, 157, 210, 3, 60, 38, 226, - 17, 248, 40, 60, 38, 47, 60, 38, 208, 141, 60, 38, 196, 223, 57, 38, 83, - 202, 84, 38, 52, 214, 19, 38, 233, 101, 152, 78, 38, 252, 10, 152, 78, - 38, 32, 213, 38, 38, 32, 223, 232, 38, 32, 239, 144, 201, 248, 38, 32, - 195, 225, 38, 248, 40, 57, 38, 236, 172, 2, 60, 38, 52, 83, 222, 76, 60, - 38, 50, 251, 91, 60, 38, 216, 19, 202, 85, 57, 38, 231, 171, 57, 38, 251, - 139, 180, 202, 30, 57, 38, 50, 53, 61, 60, 38, 200, 24, 61, 60, 38, 233, - 107, 225, 124, 38, 53, 250, 218, 57, 38, 50, 157, 210, 3, 57, 38, 235, - 164, 38, 196, 223, 60, 38, 50, 250, 218, 60, 38, 53, 250, 218, 60, 38, - 53, 250, 218, 26, 124, 250, 218, 60, 38, 53, 157, 210, 3, 57, 38, 76, 90, - 210, 22, 38, 250, 180, 60, 38, 52, 210, 3, 60, 38, 195, 24, 57, 38, 52, - 248, 48, 60, 38, 52, 248, 47, 38, 52, 220, 114, 38, 52, 220, 115, 60, 38, - 52, 202, 84, 38, 52, 226, 17, 248, 47, 38, 52, 91, 61, 60, 38, 8, 4, 1, - 63, 38, 8, 4, 1, 69, 38, 8, 4, 1, 68, 38, 8, 4, 1, 72, 38, 8, 4, 1, 66, - 38, 8, 4, 1, 247, 207, 38, 8, 4, 1, 240, 231, 38, 8, 4, 1, 233, 15, 38, - 8, 4, 1, 221, 136, 38, 8, 4, 1, 144, 38, 8, 4, 1, 203, 216, 38, 8, 4, 1, - 199, 230, 38, 8, 4, 1, 196, 222, 32, 6, 1, 232, 88, 32, 4, 1, 232, 88, - 32, 6, 1, 250, 251, 208, 222, 32, 4, 1, 250, 251, 208, 222, 32, 215, 142, - 55, 32, 221, 203, 215, 142, 55, 32, 6, 1, 213, 196, 239, 118, 32, 4, 1, - 213, 196, 239, 118, 32, 195, 225, 32, 4, 210, 89, 221, 173, 206, 87, 105, - 32, 4, 237, 250, 221, 173, 206, 87, 105, 32, 4, 210, 89, 237, 250, 221, - 173, 206, 87, 105, 32, 211, 79, 78, 32, 6, 1, 195, 232, 32, 201, 248, 32, - 239, 144, 201, 248, 32, 6, 1, 251, 135, 3, 201, 248, 32, 251, 74, 203, - 35, 32, 6, 1, 236, 175, 3, 201, 248, 32, 6, 1, 236, 127, 3, 201, 248, 32, - 6, 1, 226, 8, 3, 201, 248, 32, 6, 1, 214, 123, 3, 201, 248, 32, 6, 1, - 200, 29, 3, 201, 248, 32, 6, 1, 214, 125, 3, 201, 248, 32, 4, 1, 226, 8, - 3, 239, 144, 26, 201, 248, 32, 6, 1, 251, 134, 32, 6, 1, 248, 206, 32, 6, - 1, 234, 94, 32, 6, 1, 239, 212, 32, 6, 1, 236, 174, 32, 6, 1, 195, 78, - 32, 6, 1, 236, 126, 32, 6, 1, 202, 199, 32, 6, 1, 226, 7, 32, 6, 1, 225, - 2, 32, 6, 1, 222, 245, 32, 6, 1, 218, 145, 32, 6, 1, 215, 186, 32, 6, 1, - 196, 196, 32, 6, 1, 214, 122, 32, 6, 1, 212, 220, 32, 6, 1, 210, 74, 32, - 6, 1, 206, 86, 32, 6, 1, 203, 89, 32, 6, 1, 200, 28, 32, 6, 1, 212, 246, - 32, 6, 1, 245, 75, 32, 6, 1, 211, 238, 32, 6, 1, 214, 124, 32, 6, 1, 226, - 8, 3, 239, 143, 32, 6, 1, 200, 29, 3, 239, 143, 32, 4, 1, 251, 135, 3, - 201, 248, 32, 4, 1, 236, 175, 3, 201, 248, 32, 4, 1, 236, 127, 3, 201, - 248, 32, 4, 1, 226, 8, 3, 201, 248, 32, 4, 1, 200, 29, 3, 239, 144, 26, - 201, 248, 32, 4, 1, 251, 134, 32, 4, 1, 248, 206, 32, 4, 1, 234, 94, 32, - 4, 1, 239, 212, 32, 4, 1, 236, 174, 32, 4, 1, 195, 78, 32, 4, 1, 236, - 126, 32, 4, 1, 202, 199, 32, 4, 1, 226, 7, 32, 4, 1, 225, 2, 32, 4, 1, - 222, 245, 32, 4, 1, 218, 145, 32, 4, 1, 215, 186, 32, 4, 1, 196, 196, 32, - 4, 1, 214, 122, 32, 4, 1, 212, 220, 32, 4, 1, 210, 74, 32, 4, 1, 48, 206, - 86, 32, 4, 1, 206, 86, 32, 4, 1, 203, 89, 32, 4, 1, 200, 28, 32, 4, 1, - 212, 246, 32, 4, 1, 245, 75, 32, 4, 1, 211, 238, 32, 4, 1, 214, 124, 32, - 4, 1, 226, 8, 3, 239, 143, 32, 4, 1, 200, 29, 3, 239, 143, 32, 4, 1, 214, - 123, 3, 201, 248, 32, 4, 1, 200, 29, 3, 201, 248, 32, 4, 1, 214, 125, 3, - 201, 248, 32, 6, 225, 32, 105, 32, 248, 207, 105, 32, 202, 200, 105, 32, - 200, 29, 3, 231, 165, 105, 32, 200, 29, 3, 252, 10, 26, 231, 165, 105, - 32, 200, 29, 3, 239, 151, 26, 231, 165, 105, 32, 212, 247, 105, 32, 212, - 221, 105, 32, 225, 32, 105, 32, 1, 250, 251, 223, 236, 32, 4, 1, 250, - 251, 223, 236, 32, 1, 204, 236, 32, 4, 1, 204, 236, 32, 1, 239, 118, 32, - 4, 1, 239, 118, 32, 1, 223, 236, 32, 4, 1, 223, 236, 32, 1, 208, 222, 32, - 4, 1, 208, 222, 88, 6, 1, 206, 247, 88, 4, 1, 206, 247, 88, 6, 1, 235, - 174, 88, 4, 1, 235, 174, 88, 6, 1, 224, 129, 88, 4, 1, 224, 129, 88, 6, - 1, 231, 156, 88, 4, 1, 231, 156, 88, 6, 1, 234, 89, 88, 4, 1, 234, 89, - 88, 6, 1, 206, 213, 88, 4, 1, 206, 213, 88, 6, 1, 239, 228, 88, 4, 1, - 239, 228, 32, 225, 3, 105, 32, 210, 75, 105, 32, 221, 173, 206, 87, 105, - 32, 1, 195, 232, 32, 6, 202, 200, 105, 32, 221, 173, 236, 175, 105, 32, - 210, 89, 221, 173, 236, 175, 105, 32, 6, 1, 206, 198, 32, 4, 1, 206, 198, - 32, 6, 221, 173, 206, 87, 105, 32, 6, 1, 208, 219, 32, 4, 1, 208, 219, - 32, 210, 75, 3, 204, 196, 105, 32, 6, 210, 89, 221, 173, 206, 87, 105, - 32, 6, 237, 250, 221, 173, 206, 87, 105, 32, 6, 210, 89, 237, 250, 221, - 173, 206, 87, 105, 40, 6, 1, 226, 148, 3, 233, 100, 40, 6, 1, 226, 12, - 40, 6, 1, 239, 46, 40, 6, 1, 233, 161, 40, 6, 1, 200, 84, 226, 147, 40, - 6, 1, 237, 153, 40, 6, 1, 247, 217, 68, 40, 6, 1, 196, 24, 40, 6, 1, 225, - 193, 40, 6, 1, 222, 40, 40, 6, 1, 216, 157, 40, 6, 1, 201, 101, 40, 6, 1, - 224, 38, 40, 6, 1, 230, 249, 3, 233, 100, 40, 6, 1, 206, 182, 66, 40, 6, - 1, 237, 149, 40, 6, 1, 63, 40, 6, 1, 249, 9, 40, 6, 1, 199, 118, 40, 6, - 1, 233, 216, 40, 6, 1, 239, 252, 40, 6, 1, 226, 147, 40, 6, 1, 195, 65, - 40, 6, 1, 195, 88, 40, 6, 1, 68, 40, 6, 1, 206, 182, 68, 40, 6, 1, 155, - 40, 6, 1, 237, 7, 40, 6, 1, 236, 241, 40, 6, 1, 236, 230, 40, 6, 1, 72, - 40, 6, 1, 213, 92, 40, 6, 1, 236, 163, 40, 6, 1, 236, 151, 40, 6, 1, 203, - 68, 40, 6, 1, 66, 40, 6, 1, 237, 47, 40, 6, 1, 142, 40, 6, 1, 201, 107, - 40, 6, 1, 245, 103, 40, 6, 1, 207, 50, 40, 6, 1, 207, 2, 40, 6, 1, 232, - 173, 55, 40, 6, 1, 196, 47, 40, 6, 1, 205, 186, 55, 40, 6, 1, 69, 40, 6, - 1, 195, 217, 40, 6, 1, 164, 40, 4, 1, 63, 40, 4, 1, 249, 9, 40, 4, 1, - 199, 118, 40, 4, 1, 233, 216, 40, 4, 1, 239, 252, 40, 4, 1, 226, 147, 40, - 4, 1, 195, 65, 40, 4, 1, 195, 88, 40, 4, 1, 68, 40, 4, 1, 206, 182, 68, - 40, 4, 1, 155, 40, 4, 1, 237, 7, 40, 4, 1, 236, 241, 40, 4, 1, 236, 230, - 40, 4, 1, 72, 40, 4, 1, 213, 92, 40, 4, 1, 236, 163, 40, 4, 1, 236, 151, - 40, 4, 1, 203, 68, 40, 4, 1, 66, 40, 4, 1, 237, 47, 40, 4, 1, 142, 40, 4, - 1, 201, 107, 40, 4, 1, 245, 103, 40, 4, 1, 207, 50, 40, 4, 1, 207, 2, 40, - 4, 1, 232, 173, 55, 40, 4, 1, 196, 47, 40, 4, 1, 205, 186, 55, 40, 4, 1, - 69, 40, 4, 1, 195, 217, 40, 4, 1, 164, 40, 4, 1, 226, 148, 3, 233, 100, - 40, 4, 1, 226, 12, 40, 4, 1, 239, 46, 40, 4, 1, 233, 161, 40, 4, 1, 200, - 84, 226, 147, 40, 4, 1, 237, 153, 40, 4, 1, 247, 217, 68, 40, 4, 1, 196, - 24, 40, 4, 1, 225, 193, 40, 4, 1, 222, 40, 40, 4, 1, 216, 157, 40, 4, 1, - 201, 101, 40, 4, 1, 224, 38, 40, 4, 1, 230, 249, 3, 233, 100, 40, 4, 1, - 206, 182, 66, 40, 4, 1, 237, 149, 40, 6, 1, 214, 124, 40, 4, 1, 214, 124, - 40, 6, 1, 196, 84, 40, 4, 1, 196, 84, 40, 6, 1, 226, 5, 69, 40, 4, 1, - 226, 5, 69, 40, 6, 1, 222, 47, 195, 182, 40, 4, 1, 222, 47, 195, 182, 40, - 6, 1, 226, 5, 222, 47, 195, 182, 40, 4, 1, 226, 5, 222, 47, 195, 182, 40, - 6, 1, 248, 171, 195, 182, 40, 4, 1, 248, 171, 195, 182, 40, 6, 1, 226, 5, - 248, 171, 195, 182, 40, 4, 1, 226, 5, 248, 171, 195, 182, 40, 6, 1, 223, - 203, 40, 4, 1, 223, 203, 40, 6, 1, 211, 238, 40, 4, 1, 211, 238, 40, 6, - 1, 235, 103, 40, 4, 1, 235, 103, 40, 6, 1, 225, 219, 40, 4, 1, 225, 219, - 40, 6, 1, 225, 220, 3, 52, 233, 101, 252, 22, 40, 4, 1, 225, 220, 3, 52, - 233, 101, 252, 22, 40, 6, 1, 200, 87, 40, 4, 1, 200, 87, 40, 6, 1, 209, - 187, 214, 124, 40, 4, 1, 209, 187, 214, 124, 40, 6, 1, 214, 125, 3, 202, - 54, 40, 4, 1, 214, 125, 3, 202, 54, 40, 6, 1, 214, 49, 40, 4, 1, 214, 49, - 40, 6, 1, 223, 236, 40, 4, 1, 223, 236, 40, 202, 158, 55, 38, 40, 202, - 54, 38, 40, 213, 214, 38, 40, 240, 63, 212, 119, 38, 40, 211, 232, 212, - 119, 38, 40, 212, 103, 38, 40, 231, 58, 202, 158, 55, 38, 40, 219, 27, - 55, 40, 6, 1, 206, 182, 230, 249, 3, 203, 135, 40, 4, 1, 206, 182, 230, - 249, 3, 203, 135, 40, 6, 1, 207, 101, 55, 40, 4, 1, 207, 101, 55, 40, 6, - 1, 236, 164, 3, 202, 111, 40, 4, 1, 236, 164, 3, 202, 111, 40, 6, 1, 233, - 217, 3, 200, 27, 40, 4, 1, 233, 217, 3, 200, 27, 40, 6, 1, 233, 217, 3, - 106, 40, 4, 1, 233, 217, 3, 106, 40, 6, 1, 233, 217, 3, 112, 122, 40, 4, - 1, 233, 217, 3, 112, 122, 40, 6, 1, 195, 66, 3, 239, 195, 40, 4, 1, 195, - 66, 3, 239, 195, 40, 6, 1, 195, 89, 3, 239, 195, 40, 4, 1, 195, 89, 3, - 239, 195, 40, 6, 1, 225, 70, 3, 239, 195, 40, 4, 1, 225, 70, 3, 239, 195, - 40, 6, 1, 225, 70, 3, 83, 106, 40, 4, 1, 225, 70, 3, 83, 106, 40, 6, 1, - 225, 70, 3, 106, 40, 4, 1, 225, 70, 3, 106, 40, 6, 1, 249, 62, 155, 40, - 4, 1, 249, 62, 155, 40, 6, 1, 236, 231, 3, 239, 195, 40, 4, 1, 236, 231, - 3, 239, 195, 40, 6, 33, 236, 231, 233, 216, 40, 4, 33, 236, 231, 233, - 216, 40, 6, 1, 213, 93, 3, 112, 122, 40, 4, 1, 213, 93, 3, 112, 122, 40, - 6, 1, 252, 29, 142, 40, 4, 1, 252, 29, 142, 40, 6, 1, 236, 152, 3, 239, - 195, 40, 4, 1, 236, 152, 3, 239, 195, 40, 6, 1, 203, 69, 3, 239, 195, 40, - 4, 1, 203, 69, 3, 239, 195, 40, 6, 1, 204, 218, 66, 40, 4, 1, 204, 218, - 66, 40, 6, 1, 204, 218, 118, 3, 106, 40, 4, 1, 204, 218, 118, 3, 106, 40, - 6, 1, 233, 4, 3, 239, 195, 40, 4, 1, 233, 4, 3, 239, 195, 40, 6, 33, 203, - 69, 201, 107, 40, 4, 33, 203, 69, 201, 107, 40, 6, 1, 245, 104, 3, 239, - 195, 40, 4, 1, 245, 104, 3, 239, 195, 40, 6, 1, 245, 104, 3, 83, 106, 40, - 4, 1, 245, 104, 3, 83, 106, 40, 6, 1, 206, 224, 40, 4, 1, 206, 224, 40, - 6, 1, 252, 29, 245, 103, 40, 4, 1, 252, 29, 245, 103, 40, 6, 1, 252, 29, - 245, 104, 3, 239, 195, 40, 4, 1, 252, 29, 245, 104, 3, 239, 195, 40, 1, - 213, 203, 40, 6, 1, 195, 66, 3, 248, 47, 40, 4, 1, 195, 66, 3, 248, 47, - 40, 6, 1, 225, 70, 3, 122, 40, 4, 1, 225, 70, 3, 122, 40, 6, 1, 237, 8, - 3, 203, 135, 40, 4, 1, 237, 8, 3, 203, 135, 40, 6, 1, 236, 231, 3, 122, - 40, 4, 1, 236, 231, 3, 122, 40, 6, 1, 236, 231, 3, 203, 135, 40, 4, 1, - 236, 231, 3, 203, 135, 40, 6, 1, 224, 140, 245, 103, 40, 4, 1, 224, 140, - 245, 103, 40, 6, 1, 236, 242, 3, 203, 135, 40, 4, 1, 236, 242, 3, 203, - 135, 40, 4, 1, 213, 203, 40, 6, 1, 39, 3, 248, 47, 40, 4, 1, 39, 3, 248, - 47, 40, 6, 1, 39, 3, 239, 150, 40, 4, 1, 39, 3, 239, 150, 40, 6, 33, 39, - 226, 147, 40, 4, 33, 39, 226, 147, 40, 6, 1, 226, 148, 3, 248, 47, 40, 4, - 1, 226, 148, 3, 248, 47, 40, 6, 1, 208, 163, 40, 4, 1, 208, 163, 40, 6, - 1, 208, 164, 3, 239, 150, 40, 4, 1, 208, 164, 3, 239, 150, 40, 6, 1, 195, - 66, 3, 239, 150, 40, 4, 1, 195, 66, 3, 239, 150, 40, 6, 1, 195, 89, 3, - 239, 150, 40, 4, 1, 195, 89, 3, 239, 150, 40, 6, 1, 252, 29, 237, 153, - 40, 4, 1, 252, 29, 237, 153, 40, 6, 1, 230, 249, 3, 220, 114, 40, 4, 1, - 230, 249, 3, 220, 114, 40, 6, 1, 230, 249, 3, 239, 150, 40, 4, 1, 230, - 249, 3, 239, 150, 40, 6, 1, 177, 3, 239, 150, 40, 4, 1, 177, 3, 239, 150, - 40, 6, 1, 249, 74, 72, 40, 4, 1, 249, 74, 72, 40, 6, 1, 249, 74, 177, 3, - 239, 150, 40, 4, 1, 249, 74, 177, 3, 239, 150, 40, 6, 1, 237, 136, 3, - 239, 150, 40, 4, 1, 237, 136, 3, 239, 150, 40, 6, 1, 118, 3, 220, 114, - 40, 4, 1, 118, 3, 220, 114, 40, 6, 1, 118, 3, 239, 150, 40, 4, 1, 118, 3, - 239, 150, 40, 6, 1, 118, 3, 52, 186, 40, 4, 1, 118, 3, 52, 186, 40, 6, 1, - 245, 104, 3, 239, 150, 40, 4, 1, 245, 104, 3, 239, 150, 40, 6, 1, 233, - 217, 3, 239, 195, 40, 4, 1, 233, 217, 3, 239, 195, 40, 6, 1, 196, 48, 3, - 239, 150, 40, 4, 1, 196, 48, 3, 239, 150, 40, 6, 1, 233, 217, 3, 204, - 196, 26, 122, 40, 4, 1, 233, 217, 3, 204, 196, 26, 122, 40, 6, 1, 233, 4, - 3, 122, 40, 4, 1, 233, 4, 3, 122, 40, 6, 1, 233, 4, 3, 106, 40, 4, 1, - 233, 4, 3, 106, 40, 6, 1, 223, 246, 239, 252, 40, 4, 1, 223, 246, 239, - 252, 40, 6, 1, 223, 246, 239, 46, 40, 4, 1, 223, 246, 239, 46, 40, 6, 1, - 223, 246, 195, 15, 40, 4, 1, 223, 246, 195, 15, 40, 6, 1, 223, 246, 237, - 145, 40, 4, 1, 223, 246, 237, 145, 40, 6, 1, 223, 246, 222, 40, 40, 4, 1, - 223, 246, 222, 40, 40, 6, 1, 223, 246, 216, 157, 40, 4, 1, 223, 246, 216, - 157, 40, 6, 1, 223, 246, 206, 8, 40, 4, 1, 223, 246, 206, 8, 40, 6, 1, - 223, 246, 202, 48, 40, 4, 1, 223, 246, 202, 48, 40, 6, 1, 210, 89, 195, - 88, 40, 4, 1, 210, 89, 195, 88, 40, 6, 1, 237, 8, 3, 122, 40, 4, 1, 237, - 8, 3, 122, 40, 6, 1, 222, 122, 40, 4, 1, 222, 122, 40, 6, 1, 210, 77, 40, - 4, 1, 210, 77, 40, 6, 1, 196, 118, 40, 4, 1, 196, 118, 40, 6, 1, 211, - 159, 40, 4, 1, 211, 159, 40, 6, 1, 197, 109, 40, 4, 1, 197, 109, 40, 6, - 1, 251, 160, 155, 40, 4, 1, 251, 160, 155, 40, 6, 1, 237, 8, 3, 112, 122, - 40, 4, 1, 237, 8, 3, 112, 122, 40, 6, 1, 236, 231, 3, 112, 122, 40, 4, 1, - 236, 231, 3, 112, 122, 40, 6, 1, 213, 93, 3, 239, 195, 40, 4, 1, 213, 93, - 3, 239, 195, 40, 6, 1, 206, 225, 3, 239, 195, 40, 4, 1, 206, 225, 3, 239, - 195, 40, 6, 1, 236, 231, 3, 50, 122, 40, 4, 1, 236, 231, 3, 50, 122, 40, - 6, 1, 237, 137, 40, 4, 1, 237, 137, 40, 6, 1, 240, 45, 40, 4, 1, 240, 45, - 40, 6, 1, 237, 8, 3, 239, 195, 40, 4, 1, 237, 8, 3, 239, 195, 250, 230, - 6, 1, 250, 119, 250, 230, 6, 1, 248, 223, 250, 230, 6, 1, 233, 179, 250, - 230, 6, 1, 240, 136, 250, 230, 6, 1, 237, 60, 250, 230, 6, 1, 195, 115, - 250, 230, 6, 1, 237, 40, 250, 230, 6, 1, 236, 128, 250, 230, 6, 1, 149, - 250, 230, 6, 1, 195, 65, 250, 230, 6, 1, 226, 55, 250, 230, 6, 1, 222, - 44, 250, 230, 6, 1, 196, 200, 250, 230, 6, 1, 247, 174, 250, 230, 6, 1, - 224, 182, 250, 230, 6, 1, 231, 193, 250, 230, 6, 1, 225, 214, 250, 230, - 6, 1, 233, 227, 250, 230, 6, 1, 245, 93, 250, 230, 6, 1, 219, 164, 250, - 230, 6, 1, 196, 24, 250, 230, 6, 1, 216, 4, 250, 230, 6, 1, 207, 50, 250, - 230, 6, 1, 198, 248, 250, 230, 6, 1, 247, 16, 250, 230, 6, 1, 213, 72, - 250, 230, 6, 1, 225, 175, 250, 230, 6, 1, 169, 250, 230, 6, 1, 208, 119, - 250, 230, 6, 1, 199, 39, 250, 230, 6, 1, 202, 51, 250, 230, 6, 1, 210, - 142, 250, 230, 6, 1, 244, 182, 250, 230, 6, 1, 196, 8, 250, 230, 6, 1, - 212, 154, 250, 230, 6, 1, 224, 193, 250, 230, 6, 1, 214, 149, 250, 230, - 6, 1, 235, 176, 250, 230, 73, 1, 50, 157, 210, 2, 250, 230, 251, 30, 250, - 230, 236, 234, 78, 250, 230, 236, 90, 78, 250, 230, 244, 159, 250, 230, - 211, 79, 78, 250, 230, 252, 30, 78, 250, 230, 4, 1, 163, 250, 119, 250, - 230, 4, 1, 250, 119, 250, 230, 4, 1, 248, 223, 250, 230, 4, 1, 233, 179, - 250, 230, 4, 1, 240, 136, 250, 230, 4, 1, 237, 60, 250, 230, 4, 1, 195, - 115, 250, 230, 4, 1, 237, 40, 250, 230, 4, 1, 236, 128, 250, 230, 4, 1, - 149, 250, 230, 4, 1, 195, 65, 250, 230, 4, 1, 226, 55, 250, 230, 4, 1, - 222, 44, 250, 230, 4, 1, 196, 200, 250, 230, 4, 1, 247, 174, 250, 230, 4, - 1, 224, 182, 250, 230, 4, 1, 231, 193, 250, 230, 4, 1, 225, 214, 250, - 230, 4, 1, 233, 227, 250, 230, 4, 1, 245, 93, 250, 230, 4, 1, 219, 164, - 250, 230, 4, 1, 196, 24, 250, 230, 4, 1, 216, 4, 250, 230, 4, 1, 207, 50, - 250, 230, 4, 1, 198, 248, 250, 230, 4, 1, 247, 16, 250, 230, 4, 1, 213, - 72, 250, 230, 4, 1, 225, 175, 250, 230, 4, 1, 169, 250, 230, 4, 1, 208, - 119, 250, 230, 4, 1, 199, 39, 250, 230, 4, 1, 202, 51, 250, 230, 4, 1, - 210, 142, 250, 230, 4, 1, 244, 182, 250, 230, 4, 1, 196, 8, 250, 230, 4, - 1, 212, 154, 250, 230, 4, 1, 224, 193, 250, 230, 4, 1, 214, 149, 250, - 230, 4, 1, 235, 176, 250, 230, 4, 33, 237, 61, 196, 8, 250, 230, 4, 1, - 11, 3, 106, 250, 230, 234, 217, 204, 226, 250, 230, 231, 7, 210, 21, 250, - 230, 236, 124, 55, 222, 183, 250, 230, 236, 124, 55, 250, 230, 237, 222, - 55, 123, 252, 23, 236, 119, 123, 252, 23, 208, 120, 123, 252, 23, 207, - 27, 123, 252, 23, 195, 100, 211, 142, 123, 252, 23, 195, 100, 234, 113, - 123, 252, 23, 202, 66, 123, 252, 23, 210, 86, 123, 252, 23, 195, 98, 123, - 252, 23, 213, 124, 123, 252, 23, 196, 37, 123, 252, 23, 202, 240, 123, - 252, 23, 234, 22, 123, 252, 23, 234, 23, 218, 102, 123, 252, 23, 234, 20, - 123, 252, 23, 211, 143, 213, 156, 123, 252, 23, 203, 30, 234, 41, 123, - 252, 23, 213, 98, 123, 252, 23, 250, 159, 232, 240, 123, 252, 23, 218, - 112, 123, 252, 23, 220, 86, 123, 252, 23, 219, 153, 123, 252, 23, 219, - 154, 224, 194, 123, 252, 23, 240, 72, 123, 252, 23, 211, 154, 123, 252, - 23, 203, 30, 211, 137, 123, 252, 23, 196, 50, 248, 224, 195, 238, 123, - 252, 23, 214, 131, 123, 252, 23, 226, 106, 123, 252, 23, 239, 229, 123, - 252, 23, 195, 22, 123, 117, 220, 8, 244, 249, 123, 212, 111, 206, 227, - 123, 212, 111, 232, 164, 208, 120, 123, 212, 111, 232, 164, 213, 115, - 123, 212, 111, 232, 164, 211, 147, 123, 212, 111, 232, 33, 123, 212, 111, - 201, 104, 123, 212, 111, 208, 120, 123, 212, 111, 213, 115, 123, 212, - 111, 211, 147, 123, 212, 111, 231, 177, 123, 212, 111, 231, 178, 232, - 166, 36, 199, 122, 123, 212, 111, 211, 83, 123, 212, 111, 240, 121, 214, - 73, 220, 42, 123, 212, 111, 219, 142, 123, 211, 214, 220, 39, 123, 212, - 111, 210, 227, 123, 211, 214, 213, 126, 123, 212, 111, 206, 212, 238, - 253, 123, 212, 111, 206, 66, 238, 253, 123, 211, 214, 205, 187, 213, 117, - 123, 117, 200, 33, 238, 253, 123, 117, 221, 203, 238, 253, 123, 211, 214, - 215, 139, 232, 239, 123, 212, 111, 211, 148, 211, 142, 123, 1, 251, 164, - 123, 1, 248, 208, 123, 1, 233, 177, 123, 1, 240, 101, 123, 1, 232, 147, - 123, 1, 199, 122, 123, 1, 195, 92, 123, 1, 232, 89, 123, 1, 203, 1, 123, - 1, 195, 241, 123, 1, 48, 225, 35, 123, 1, 225, 35, 123, 1, 222, 241, 123, - 1, 48, 219, 171, 123, 1, 219, 171, 123, 1, 48, 215, 138, 123, 1, 215, - 138, 123, 1, 208, 225, 123, 1, 250, 117, 123, 1, 48, 213, 92, 123, 1, - 213, 92, 123, 1, 48, 201, 108, 123, 1, 201, 108, 123, 1, 211, 106, 123, - 1, 210, 109, 123, 1, 206, 211, 123, 1, 203, 85, 123, 195, 242, 201, 180, - 123, 33, 196, 22, 52, 199, 122, 123, 33, 196, 22, 199, 123, 195, 241, - 123, 33, 196, 22, 52, 195, 241, 123, 211, 214, 234, 22, 123, 211, 214, - 234, 20, 9, 31, 55, 9, 2, 208, 218, 9, 235, 35, 220, 24, 9, 2, 209, 3, 9, - 2, 208, 221, 9, 31, 117, 57, 251, 9, 241, 37, 209, 200, 251, 9, 235, 0, - 209, 200, 9, 210, 191, 251, 9, 213, 46, 219, 29, 55, 251, 9, 213, 46, - 203, 24, 202, 159, 55, 251, 222, 55, 9, 244, 159, 9, 240, 59, 207, 90, 9, - 212, 113, 199, 102, 55, 9, 2, 219, 8, 9, 2, 208, 235, 251, 167, 197, 133, - 9, 2, 251, 167, 250, 184, 9, 2, 210, 225, 251, 166, 9, 2, 210, 233, 251, - 144, 251, 82, 9, 2, 203, 126, 9, 4, 130, 203, 139, 9, 4, 130, 33, 151, 3, - 222, 250, 3, 196, 64, 9, 4, 130, 195, 106, 9, 4, 235, 200, 9, 4, 240, 95, - 9, 4, 224, 238, 9, 207, 105, 9, 1, 78, 9, 201, 165, 76, 211, 214, 78, 9, - 211, 79, 78, 9, 1, 224, 242, 196, 64, 9, 1, 232, 213, 9, 1, 151, 3, 220, - 110, 57, 9, 1, 151, 3, 232, 214, 57, 9, 1, 197, 118, 3, 232, 214, 57, 9, - 1, 151, 3, 232, 214, 60, 9, 1, 93, 3, 232, 214, 57, 9, 1, 251, 164, 9, 1, - 248, 239, 9, 1, 203, 42, 220, 35, 9, 1, 203, 41, 9, 1, 202, 213, 9, 1, - 225, 189, 9, 1, 232, 236, 9, 1, 224, 142, 9, 1, 240, 107, 9, 1, 202, 225, - 9, 1, 210, 142, 9, 1, 195, 106, 9, 1, 208, 125, 9, 1, 206, 251, 9, 1, - 209, 8, 9, 1, 240, 130, 9, 1, 203, 139, 9, 1, 195, 109, 9, 1, 251, 194, - 9, 1, 233, 225, 9, 1, 224, 192, 3, 99, 238, 251, 57, 9, 1, 224, 192, 3, - 115, 238, 251, 60, 9, 1, 235, 204, 93, 3, 226, 17, 199, 230, 9, 1, 235, - 204, 93, 3, 99, 238, 251, 57, 9, 1, 235, 204, 93, 3, 115, 238, 251, 57, - 9, 203, 91, 9, 1, 235, 176, 9, 1, 211, 152, 9, 1, 225, 35, 9, 1, 222, - 249, 9, 1, 219, 185, 9, 1, 216, 31, 9, 1, 232, 113, 9, 1, 197, 117, 9, 1, - 151, 220, 69, 9, 1, 196, 64, 9, 235, 198, 9, 240, 93, 9, 224, 236, 9, - 235, 200, 9, 240, 95, 9, 224, 238, 9, 207, 40, 9, 204, 119, 9, 220, 108, - 57, 9, 232, 214, 57, 9, 232, 214, 60, 9, 204, 143, 251, 164, 9, 226, 17, - 240, 95, 9, 117, 216, 32, 233, 196, 9, 194, 241, 9, 18, 2, 4, 199, 231, - 57, 9, 18, 2, 226, 17, 4, 199, 231, 57, 9, 18, 2, 76, 60, 9, 210, 89, - 240, 95, 9, 235, 201, 3, 99, 238, 250, 9, 197, 119, 232, 214, 60, 251, 9, - 17, 195, 79, 251, 9, 17, 100, 251, 9, 17, 102, 251, 9, 17, 134, 251, 9, - 17, 136, 251, 9, 17, 146, 251, 9, 17, 167, 251, 9, 17, 178, 251, 9, 17, - 171, 251, 9, 17, 182, 9, 213, 45, 55, 9, 239, 244, 207, 90, 9, 202, 158, - 207, 90, 9, 235, 101, 212, 109, 205, 7, 9, 1, 238, 252, 248, 239, 9, 1, - 238, 252, 211, 152, 9, 1, 204, 95, 251, 164, 9, 1, 151, 197, 134, 9, 1, - 151, 3, 197, 119, 232, 214, 57, 9, 1, 151, 3, 197, 119, 232, 214, 60, 9, - 1, 130, 232, 213, 9, 1, 130, 232, 214, 251, 164, 9, 1, 130, 232, 214, - 197, 117, 9, 1, 118, 3, 232, 214, 57, 9, 1, 130, 232, 214, 196, 64, 9, 1, - 201, 70, 9, 1, 201, 68, 9, 1, 248, 249, 9, 1, 203, 42, 3, 210, 2, 9, 1, - 203, 42, 3, 115, 238, 251, 90, 237, 230, 9, 1, 213, 72, 9, 1, 203, 39, 9, - 1, 248, 237, 9, 1, 168, 3, 232, 214, 57, 9, 1, 168, 3, 99, 238, 251, 83, - 57, 9, 1, 215, 95, 9, 1, 237, 162, 9, 1, 168, 3, 115, 238, 251, 57, 9, 1, - 203, 72, 9, 1, 203, 70, 9, 1, 240, 36, 9, 1, 240, 108, 3, 210, 2, 9, 1, - 240, 108, 3, 76, 60, 9, 1, 240, 108, 3, 76, 248, 227, 26, 4, 203, 139, 9, - 1, 240, 114, 9, 1, 240, 38, 9, 1, 237, 191, 9, 1, 240, 108, 3, 115, 238, - 251, 90, 237, 230, 9, 1, 240, 108, 3, 235, 7, 238, 251, 57, 9, 1, 209, - 173, 9, 1, 210, 143, 3, 4, 199, 230, 9, 1, 210, 143, 3, 210, 2, 9, 1, - 210, 143, 3, 76, 60, 9, 1, 210, 143, 3, 4, 199, 231, 60, 9, 1, 210, 143, - 3, 76, 248, 227, 26, 76, 57, 9, 1, 210, 143, 3, 99, 238, 251, 57, 9, 1, - 225, 186, 9, 1, 210, 143, 3, 235, 7, 238, 251, 57, 9, 1, 208, 126, 3, 76, - 248, 227, 26, 76, 57, 9, 1, 208, 126, 3, 115, 238, 251, 60, 9, 1, 208, - 126, 3, 115, 238, 251, 248, 227, 26, 115, 238, 251, 57, 9, 1, 209, 9, 3, - 99, 238, 251, 60, 9, 1, 209, 9, 3, 115, 238, 251, 57, 9, 1, 203, 140, 3, - 115, 238, 251, 57, 9, 1, 251, 195, 3, 115, 238, 251, 57, 9, 1, 238, 252, - 235, 176, 9, 1, 235, 177, 3, 76, 218, 162, 60, 9, 1, 235, 177, 3, 76, 60, - 9, 1, 199, 111, 9, 1, 235, 177, 3, 115, 238, 251, 60, 9, 1, 213, 70, 9, - 1, 211, 153, 3, 76, 57, 9, 1, 211, 153, 3, 115, 238, 251, 57, 9, 1, 224, - 191, 9, 1, 204, 63, 225, 35, 9, 1, 225, 36, 3, 210, 2, 9, 1, 225, 36, 3, - 76, 57, 9, 1, 217, 73, 9, 1, 225, 36, 3, 115, 238, 251, 60, 9, 1, 234, - 110, 9, 1, 234, 111, 3, 210, 2, 9, 1, 216, 250, 9, 1, 234, 111, 3, 99, - 238, 251, 60, 9, 1, 233, 63, 9, 1, 234, 111, 3, 115, 238, 251, 57, 9, 1, - 222, 250, 3, 4, 199, 230, 9, 1, 222, 250, 3, 76, 57, 9, 1, 222, 250, 3, - 115, 238, 251, 57, 9, 1, 222, 250, 3, 115, 238, 251, 60, 9, 1, 216, 32, - 3, 76, 60, 9, 1, 216, 32, 233, 196, 9, 1, 209, 235, 9, 1, 216, 32, 3, - 210, 2, 9, 1, 216, 32, 3, 115, 238, 251, 57, 9, 1, 232, 114, 239, 24, 9, - 1, 203, 73, 3, 76, 57, 9, 1, 232, 114, 3, 93, 57, 9, 1, 232, 114, 233, - 141, 9, 1, 232, 114, 233, 142, 3, 232, 214, 57, 9, 1, 203, 42, 220, 36, - 233, 141, 9, 1, 197, 118, 3, 210, 2, 9, 1, 224, 67, 214, 164, 9, 1, 214, - 164, 9, 1, 66, 9, 1, 195, 217, 9, 1, 224, 67, 195, 217, 9, 1, 197, 118, - 3, 99, 238, 251, 57, 9, 1, 199, 118, 9, 1, 235, 204, 196, 64, 9, 1, 93, - 3, 203, 135, 9, 1, 93, 3, 4, 199, 230, 9, 1, 197, 118, 3, 76, 57, 9, 1, - 69, 9, 1, 93, 3, 115, 238, 251, 60, 9, 1, 93, 249, 72, 9, 1, 93, 249, 73, - 3, 232, 214, 57, 9, 234, 217, 204, 226, 9, 1, 251, 245, 9, 4, 130, 33, - 209, 9, 3, 222, 250, 3, 151, 220, 69, 9, 4, 130, 33, 211, 153, 3, 222, - 250, 3, 151, 220, 69, 9, 4, 130, 87, 84, 20, 9, 4, 130, 222, 250, 251, - 164, 9, 4, 130, 225, 189, 9, 4, 130, 115, 238, 250, 9, 4, 130, 208, 125, - 9, 236, 222, 77, 250, 121, 9, 205, 3, 77, 209, 132, 237, 8, 232, 28, 9, - 4, 130, 209, 185, 195, 79, 9, 4, 130, 200, 31, 210, 162, 195, 79, 9, 4, - 130, 238, 252, 232, 138, 77, 224, 142, 9, 4, 130, 87, 70, 20, 9, 4, 126, - 208, 125, 9, 4, 130, 220, 109, 9, 4, 197, 117, 9, 4, 196, 64, 9, 4, 130, - 196, 64, 9, 4, 130, 216, 31, 9, 212, 149, 77, 208, 249, 9, 236, 232, 247, - 37, 126, 204, 226, 9, 236, 232, 247, 37, 130, 204, 226, 9, 209, 185, 130, - 204, 227, 3, 235, 135, 247, 36, 9, 4, 126, 219, 185, 9, 1, 240, 108, 3, - 226, 17, 199, 230, 9, 1, 210, 143, 3, 226, 17, 199, 230, 236, 79, 251, 9, - 17, 195, 79, 236, 79, 251, 9, 17, 100, 236, 79, 251, 9, 17, 102, 236, 79, - 251, 9, 17, 134, 236, 79, 251, 9, 17, 136, 236, 79, 251, 9, 17, 146, 236, - 79, 251, 9, 17, 167, 236, 79, 251, 9, 17, 178, 236, 79, 251, 9, 17, 171, - 236, 79, 251, 9, 17, 182, 9, 1, 206, 252, 3, 76, 60, 9, 1, 240, 131, 3, - 76, 60, 9, 1, 233, 226, 3, 76, 60, 9, 2, 206, 65, 251, 111, 9, 2, 206, - 65, 212, 70, 219, 164, 9, 1, 232, 114, 3, 226, 17, 199, 230, 203, 236, - 236, 222, 77, 213, 153, 203, 236, 204, 90, 234, 217, 204, 226, 203, 236, - 204, 145, 234, 217, 204, 226, 203, 236, 204, 90, 244, 168, 203, 236, 204, - 145, 244, 168, 203, 236, 231, 155, 244, 168, 203, 236, 244, 169, 206, 4, - 222, 184, 203, 236, 244, 169, 206, 4, 210, 22, 203, 236, 204, 90, 244, - 169, 206, 4, 222, 184, 203, 236, 204, 145, 244, 169, 206, 4, 210, 22, - 203, 236, 241, 123, 203, 236, 232, 171, 214, 184, 203, 236, 232, 171, - 219, 140, 203, 236, 232, 171, 250, 181, 203, 236, 252, 30, 78, 203, 236, - 1, 251, 169, 203, 236, 1, 204, 95, 251, 169, 203, 236, 1, 248, 205, 203, - 236, 1, 234, 100, 203, 236, 1, 234, 101, 234, 77, 203, 236, 1, 240, 104, - 203, 236, 1, 238, 252, 240, 105, 209, 251, 203, 236, 1, 232, 147, 203, - 236, 1, 197, 117, 203, 236, 1, 195, 106, 203, 236, 1, 232, 87, 203, 236, - 1, 202, 253, 203, 236, 1, 202, 254, 234, 77, 203, 236, 1, 195, 200, 203, - 236, 1, 195, 201, 232, 147, 203, 236, 1, 225, 5, 203, 236, 1, 222, 248, - 203, 236, 1, 219, 25, 203, 236, 1, 215, 138, 203, 236, 1, 207, 98, 203, - 236, 1, 48, 207, 98, 203, 236, 1, 69, 203, 236, 1, 213, 92, 203, 236, 1, - 210, 89, 213, 92, 203, 236, 1, 209, 5, 203, 236, 1, 211, 146, 203, 236, - 1, 209, 251, 203, 236, 1, 206, 211, 203, 236, 1, 203, 82, 203, 236, 1, - 213, 30, 248, 190, 203, 236, 1, 213, 30, 233, 223, 203, 236, 1, 213, 30, - 239, 171, 203, 236, 211, 228, 57, 203, 236, 211, 228, 60, 203, 236, 211, - 228, 237, 249, 203, 236, 195, 4, 57, 203, 236, 195, 4, 60, 203, 236, 195, - 4, 237, 249, 203, 236, 210, 186, 57, 203, 236, 210, 186, 60, 203, 236, - 237, 250, 195, 12, 231, 154, 203, 236, 237, 250, 195, 12, 251, 83, 203, - 236, 232, 152, 57, 203, 236, 232, 152, 60, 203, 236, 232, 151, 237, 249, - 203, 236, 236, 145, 57, 203, 236, 236, 145, 60, 203, 236, 209, 96, 203, - 236, 235, 170, 238, 253, 203, 236, 211, 56, 203, 236, 209, 126, 203, 236, - 99, 83, 238, 251, 57, 203, 236, 99, 83, 238, 251, 60, 203, 236, 115, 238, - 251, 57, 203, 236, 115, 238, 251, 60, 203, 236, 214, 182, 222, 76, 57, - 203, 236, 214, 182, 222, 76, 60, 203, 236, 218, 88, 203, 236, 249, 71, - 203, 236, 1, 205, 182, 195, 72, 203, 236, 1, 205, 182, 224, 135, 203, - 236, 1, 205, 182, 235, 189, 9, 1, 248, 240, 3, 115, 238, 251, 231, 104, - 60, 9, 1, 248, 240, 3, 76, 248, 227, 26, 115, 238, 251, 57, 9, 1, 248, - 240, 3, 115, 238, 251, 212, 107, 200, 24, 60, 9, 1, 248, 240, 3, 115, - 238, 251, 212, 107, 200, 24, 248, 227, 26, 99, 238, 251, 57, 9, 1, 248, - 240, 3, 99, 238, 251, 248, 227, 26, 76, 57, 9, 1, 248, 240, 3, 226, 17, - 4, 199, 231, 60, 9, 1, 248, 240, 3, 4, 199, 230, 9, 1, 168, 3, 99, 238, - 251, 57, 9, 1, 168, 3, 115, 238, 251, 212, 107, 200, 24, 60, 9, 1, 240, - 108, 3, 99, 238, 251, 199, 50, 248, 227, 26, 4, 203, 139, 9, 1, 240, 108, - 3, 226, 17, 4, 199, 231, 60, 9, 1, 210, 143, 3, 106, 9, 1, 208, 126, 3, - 235, 7, 238, 251, 57, 9, 1, 251, 195, 3, 99, 238, 251, 57, 9, 1, 251, - 195, 3, 115, 238, 251, 212, 107, 237, 231, 57, 9, 1, 251, 195, 3, 99, - 238, 251, 199, 50, 57, 9, 1, 235, 177, 3, 99, 238, 251, 60, 9, 1, 235, - 177, 3, 115, 238, 251, 212, 107, 200, 24, 60, 9, 1, 224, 192, 3, 76, 57, - 9, 1, 224, 192, 3, 115, 238, 251, 57, 9, 1, 224, 192, 3, 115, 238, 251, - 212, 107, 200, 24, 60, 9, 1, 87, 3, 76, 57, 9, 1, 87, 3, 76, 60, 9, 1, - 216, 32, 3, 99, 238, 251, 60, 9, 1, 216, 32, 3, 4, 203, 139, 9, 1, 216, - 32, 3, 4, 199, 230, 9, 1, 222, 250, 3, 154, 9, 1, 210, 143, 3, 99, 238, - 251, 199, 50, 57, 9, 1, 210, 143, 3, 232, 214, 57, 9, 1, 208, 126, 3, 99, - 238, 251, 199, 50, 57, 9, 1, 168, 3, 4, 9, 1, 203, 140, 60, 9, 1, 168, 3, - 4, 9, 1, 203, 140, 26, 99, 238, 250, 9, 1, 208, 126, 3, 4, 9, 1, 203, - 140, 26, 99, 238, 250, 9, 1, 210, 143, 3, 4, 9, 1, 203, 140, 26, 99, 238, - 250, 9, 1, 168, 3, 4, 9, 1, 203, 140, 57, 9, 1, 151, 3, 236, 79, 251, 9, - 17, 99, 57, 9, 1, 151, 3, 236, 79, 251, 9, 17, 115, 57, 9, 1, 235, 204, - 93, 3, 236, 79, 251, 9, 17, 99, 57, 9, 1, 235, 204, 93, 3, 236, 79, 251, - 9, 17, 115, 57, 9, 1, 235, 204, 93, 3, 236, 79, 251, 9, 17, 235, 7, 60, - 9, 1, 197, 118, 3, 236, 79, 251, 9, 17, 99, 57, 9, 1, 197, 118, 3, 236, - 79, 251, 9, 17, 115, 57, 9, 1, 93, 249, 73, 3, 236, 79, 251, 9, 17, 99, - 57, 9, 1, 93, 249, 73, 3, 236, 79, 251, 9, 17, 115, 57, 9, 1, 168, 3, - 236, 79, 251, 9, 17, 235, 7, 60, 9, 1, 208, 126, 3, 236, 79, 251, 9, 17, - 235, 7, 57, 9, 1, 208, 126, 3, 226, 17, 199, 230, 9, 1, 225, 36, 3, 99, - 238, 251, 57, 202, 230, 1, 232, 246, 202, 230, 1, 207, 5, 202, 230, 1, - 216, 30, 202, 230, 1, 210, 244, 202, 230, 1, 249, 143, 202, 230, 1, 222, - 119, 202, 230, 1, 225, 50, 202, 230, 1, 251, 151, 202, 230, 1, 199, 150, - 202, 230, 1, 219, 184, 202, 230, 1, 235, 237, 202, 230, 1, 239, 174, 202, - 230, 1, 202, 232, 202, 230, 1, 223, 79, 202, 230, 1, 234, 119, 202, 230, - 1, 233, 147, 202, 230, 1, 208, 124, 202, 230, 1, 240, 57, 202, 230, 1, - 195, 95, 202, 230, 1, 203, 84, 202, 230, 1, 196, 129, 202, 230, 1, 213, - 106, 202, 230, 1, 225, 198, 202, 230, 1, 245, 106, 202, 230, 1, 201, 77, - 202, 230, 1, 232, 79, 202, 230, 1, 224, 145, 202, 230, 1, 202, 231, 202, - 230, 1, 195, 113, 202, 230, 1, 206, 250, 202, 230, 1, 209, 12, 202, 230, - 1, 240, 134, 202, 230, 1, 149, 202, 230, 1, 195, 11, 202, 230, 1, 251, - 191, 202, 230, 1, 233, 224, 202, 230, 1, 211, 156, 202, 230, 1, 197, 159, - 202, 230, 252, 32, 202, 230, 252, 133, 202, 230, 230, 204, 202, 230, 237, - 53, 202, 230, 200, 107, 202, 230, 214, 101, 202, 230, 237, 63, 202, 230, - 236, 69, 202, 230, 214, 181, 202, 230, 214, 189, 202, 230, 204, 119, 202, - 230, 1, 217, 244, 216, 114, 17, 195, 79, 216, 114, 17, 100, 216, 114, 17, - 102, 216, 114, 17, 134, 216, 114, 17, 136, 216, 114, 17, 146, 216, 114, - 17, 167, 216, 114, 17, 178, 216, 114, 17, 171, 216, 114, 17, 182, 216, - 114, 1, 63, 216, 114, 1, 237, 54, 216, 114, 1, 68, 216, 114, 1, 69, 216, - 114, 1, 66, 216, 114, 1, 214, 102, 216, 114, 1, 72, 216, 114, 1, 240, - 122, 216, 114, 1, 218, 55, 216, 114, 1, 249, 145, 216, 114, 1, 161, 216, - 114, 1, 189, 216, 114, 1, 225, 214, 216, 114, 1, 247, 16, 216, 114, 1, - 240, 136, 216, 114, 1, 169, 216, 114, 1, 209, 181, 216, 114, 1, 183, 216, - 114, 1, 234, 65, 216, 114, 1, 235, 239, 216, 114, 1, 155, 216, 114, 1, - 172, 216, 114, 1, 218, 1, 197, 23, 216, 114, 1, 166, 216, 114, 1, 215, - 109, 216, 114, 1, 176, 216, 114, 1, 142, 216, 114, 1, 197, 166, 216, 114, - 1, 164, 216, 114, 1, 215, 110, 197, 23, 216, 114, 1, 225, 121, 225, 214, - 216, 114, 1, 225, 121, 247, 16, 216, 114, 1, 225, 121, 169, 216, 114, 38, - 206, 182, 130, 202, 11, 216, 114, 38, 206, 182, 126, 202, 11, 216, 114, - 38, 206, 182, 209, 250, 202, 11, 216, 114, 38, 181, 239, 194, 202, 11, - 216, 114, 38, 181, 130, 202, 11, 216, 114, 38, 181, 126, 202, 11, 216, - 114, 38, 181, 209, 250, 202, 11, 216, 114, 38, 217, 208, 78, 216, 114, - 38, 52, 76, 57, 216, 114, 130, 152, 251, 30, 216, 114, 126, 152, 251, 30, - 216, 114, 16, 214, 103, 239, 208, 216, 114, 16, 234, 64, 216, 114, 244, - 159, 216, 114, 236, 90, 78, 216, 114, 223, 52, 216, 114, 240, 83, 216, - 114, 238, 255, 55, 216, 114, 203, 116, 55, 208, 228, 1, 251, 171, 208, - 228, 1, 248, 145, 208, 228, 1, 234, 99, 208, 228, 1, 240, 106, 208, 228, - 1, 225, 225, 208, 228, 1, 249, 143, 208, 228, 1, 195, 82, 208, 228, 1, - 225, 234, 208, 228, 1, 202, 57, 208, 228, 1, 195, 181, 208, 228, 1, 225, - 51, 208, 228, 1, 223, 75, 208, 228, 1, 219, 25, 208, 228, 1, 215, 138, - 208, 228, 1, 206, 63, 208, 228, 1, 226, 86, 208, 228, 1, 235, 153, 208, - 228, 1, 201, 111, 208, 228, 1, 211, 76, 208, 228, 1, 209, 251, 208, 228, - 1, 207, 24, 208, 228, 1, 203, 161, 208, 228, 117, 226, 86, 208, 228, 117, - 226, 85, 208, 228, 117, 214, 176, 208, 228, 117, 240, 120, 208, 228, 73, - 1, 236, 179, 195, 181, 208, 228, 117, 236, 179, 195, 181, 208, 228, 18, - 2, 181, 69, 208, 228, 18, 2, 69, 208, 228, 18, 2, 214, 18, 252, 168, 208, - 228, 18, 2, 181, 252, 168, 208, 228, 18, 2, 252, 168, 208, 228, 18, 2, - 214, 18, 63, 208, 228, 18, 2, 181, 63, 208, 228, 18, 2, 63, 208, 228, 73, - 1, 206, 182, 63, 208, 228, 18, 2, 206, 182, 63, 208, 228, 18, 2, 181, 66, - 208, 228, 18, 2, 66, 208, 228, 73, 1, 68, 208, 228, 18, 2, 181, 68, 208, - 228, 18, 2, 68, 208, 228, 18, 2, 72, 208, 228, 18, 2, 204, 119, 208, 228, - 117, 217, 93, 208, 228, 211, 214, 217, 93, 208, 228, 211, 214, 251, 219, - 208, 228, 211, 214, 251, 96, 208, 228, 211, 214, 249, 49, 208, 228, 211, - 214, 250, 160, 208, 228, 211, 214, 206, 199, 208, 228, 252, 30, 78, 208, - 228, 211, 214, 219, 174, 211, 112, 208, 228, 211, 214, 195, 19, 208, 228, - 211, 214, 211, 112, 208, 228, 211, 214, 195, 112, 208, 228, 211, 214, - 201, 0, 208, 228, 211, 214, 250, 236, 208, 228, 211, 214, 205, 187, 220, - 10, 208, 228, 211, 214, 251, 77, 220, 58, 1, 232, 220, 220, 58, 1, 252, - 117, 220, 58, 1, 251, 217, 220, 58, 1, 252, 6, 220, 58, 1, 251, 209, 220, - 58, 1, 199, 251, 220, 58, 1, 250, 114, 220, 58, 1, 225, 234, 220, 58, 1, - 250, 157, 220, 58, 1, 251, 176, 220, 58, 1, 251, 181, 220, 58, 1, 251, - 173, 220, 58, 1, 251, 123, 220, 58, 1, 251, 106, 220, 58, 1, 250, 202, - 220, 58, 1, 226, 86, 220, 58, 1, 251, 46, 220, 58, 1, 250, 170, 220, 58, - 1, 251, 18, 220, 58, 1, 251, 14, 220, 58, 1, 250, 195, 220, 58, 1, 250, - 168, 220, 58, 1, 237, 175, 220, 58, 1, 225, 43, 220, 58, 1, 251, 194, - 220, 58, 251, 223, 78, 220, 58, 198, 246, 78, 220, 58, 234, 36, 78, 220, - 58, 211, 213, 203, 236, 1, 131, 217, 71, 203, 236, 1, 131, 225, 214, 203, - 236, 1, 131, 215, 109, 203, 236, 1, 131, 201, 78, 203, 236, 1, 131, 216, - 86, 203, 236, 1, 131, 216, 68, 203, 236, 1, 131, 248, 197, 203, 236, 1, - 131, 169, 203, 236, 1, 131, 222, 37, 203, 236, 1, 131, 222, 26, 203, 236, - 1, 131, 205, 80, 9, 1, 248, 240, 3, 4, 199, 231, 60, 9, 1, 248, 240, 3, - 232, 214, 57, 9, 1, 225, 190, 3, 99, 238, 251, 57, 9, 1, 203, 140, 3, 99, - 238, 251, 57, 9, 1, 235, 177, 3, 76, 248, 227, 26, 115, 238, 251, 57, 9, - 1, 211, 153, 3, 76, 60, 9, 1, 222, 250, 3, 52, 154, 9, 1, 87, 3, 115, - 238, 251, 57, 9, 1, 93, 3, 99, 238, 251, 248, 227, 26, 232, 214, 57, 9, - 1, 93, 3, 99, 238, 251, 248, 227, 26, 76, 57, 9, 1, 210, 143, 3, 221, - 225, 9, 1, 197, 118, 3, 76, 197, 38, 9, 1, 209, 214, 196, 64, 9, 1, 126, - 251, 164, 9, 1, 240, 108, 3, 115, 238, 251, 60, 9, 1, 209, 9, 3, 115, - 238, 251, 60, 9, 1, 234, 111, 3, 226, 17, 106, 9, 1, 204, 218, 197, 117, - 9, 1, 195, 107, 3, 226, 17, 199, 231, 57, 9, 1, 251, 195, 3, 115, 238, - 251, 60, 9, 1, 225, 36, 3, 76, 60, 9, 1, 248, 240, 3, 4, 87, 57, 9, 1, - 213, 73, 3, 4, 87, 57, 9, 1, 203, 42, 3, 4, 203, 42, 57, 9, 1, 210, 143, - 3, 4, 216, 32, 57, 9, 1, 93, 3, 99, 238, 251, 248, 227, 26, 4, 216, 32, - 57, 9, 1, 251, 220, 235, 176, 9, 1, 251, 220, 211, 152, 9, 1, 251, 220, - 216, 31, 9, 4, 126, 197, 117, 9, 4, 130, 197, 9, 251, 11, 9, 4, 130, 209, - 8, 9, 4, 130, 251, 194, 9, 4, 130, 211, 152, 9, 4, 130, 216, 32, 3, 224, - 238, 9, 4, 126, 216, 32, 3, 224, 238, 9, 4, 130, 197, 9, 250, 167, 9, 4, - 130, 197, 9, 250, 201, 9, 4, 130, 197, 9, 251, 105, 9, 4, 130, 197, 9, - 208, 243, 9, 4, 130, 197, 9, 211, 116, 9, 4, 130, 197, 9, 197, 140, 9, 4, - 130, 235, 35, 220, 24, 9, 4, 130, 2, 209, 3, 9, 239, 71, 236, 222, 77, - 250, 121, 9, 163, 240, 96, 60, 9, 241, 18, 235, 200, 9, 241, 18, 240, 95, - 9, 241, 18, 224, 238, 9, 241, 18, 235, 198, 9, 241, 18, 240, 93, 9, 241, - 18, 224, 236, 9, 152, 97, 76, 57, 9, 152, 99, 238, 251, 57, 9, 152, 221, - 226, 57, 9, 152, 97, 76, 60, 9, 152, 99, 238, 251, 60, 9, 152, 221, 226, - 60, 9, 192, 235, 198, 9, 192, 240, 93, 9, 192, 224, 236, 9, 4, 130, 197, - 117, 9, 235, 201, 3, 210, 2, 9, 235, 201, 3, 76, 57, 9, 224, 239, 3, 76, - 60, 9, 50, 250, 218, 57, 9, 53, 250, 218, 57, 9, 50, 250, 218, 60, 9, 53, - 250, 218, 60, 9, 52, 53, 250, 218, 57, 9, 52, 53, 250, 218, 90, 3, 238, - 253, 9, 53, 250, 218, 90, 3, 238, 253, 9, 240, 96, 3, 238, 253, 9, 117, - 206, 96, 216, 32, 233, 196, 101, 2, 226, 17, 247, 133, 101, 2, 247, 133, - 101, 2, 251, 51, 101, 2, 199, 2, 101, 1, 206, 182, 63, 101, 1, 63, 101, - 1, 252, 168, 101, 1, 68, 101, 1, 226, 120, 101, 1, 66, 101, 1, 199, 245, - 101, 1, 110, 144, 101, 1, 110, 159, 101, 1, 247, 136, 69, 101, 1, 206, - 182, 69, 101, 1, 69, 101, 1, 251, 200, 101, 1, 247, 136, 72, 101, 1, 206, - 182, 72, 101, 1, 72, 101, 1, 250, 150, 101, 1, 155, 101, 1, 224, 146, - 101, 1, 234, 123, 101, 1, 233, 230, 101, 1, 217, 71, 101, 1, 247, 174, - 101, 1, 247, 16, 101, 1, 225, 214, 101, 1, 225, 180, 101, 1, 215, 109, - 101, 1, 201, 78, 101, 1, 201, 66, 101, 1, 240, 41, 101, 1, 240, 25, 101, - 1, 216, 86, 101, 1, 189, 101, 1, 202, 233, 101, 1, 240, 136, 101, 1, 239, - 176, 101, 1, 176, 101, 1, 216, 68, 101, 1, 161, 101, 1, 213, 6, 101, 1, - 249, 145, 101, 1, 248, 197, 101, 1, 166, 101, 1, 164, 101, 1, 169, 101, - 1, 209, 181, 101, 1, 172, 101, 1, 222, 37, 101, 1, 222, 26, 101, 1, 199, - 152, 101, 1, 207, 50, 101, 1, 205, 80, 101, 1, 183, 101, 1, 142, 101, 18, - 2, 214, 164, 101, 18, 2, 214, 100, 101, 2, 215, 149, 101, 2, 250, 132, - 101, 18, 2, 252, 168, 101, 18, 2, 68, 101, 18, 2, 226, 120, 101, 18, 2, - 66, 101, 18, 2, 199, 245, 101, 18, 2, 110, 144, 101, 18, 2, 110, 209, - 182, 101, 18, 2, 247, 136, 69, 101, 18, 2, 206, 182, 69, 101, 18, 2, 69, - 101, 18, 2, 251, 200, 101, 18, 2, 247, 136, 72, 101, 18, 2, 206, 182, 72, - 101, 18, 2, 72, 101, 18, 2, 250, 150, 101, 2, 199, 7, 101, 18, 2, 212, - 11, 69, 101, 18, 2, 250, 127, 101, 214, 127, 101, 204, 206, 2, 200, 101, - 101, 204, 206, 2, 251, 53, 101, 233, 101, 252, 22, 101, 252, 10, 252, 22, - 101, 18, 2, 247, 136, 181, 69, 101, 18, 2, 200, 99, 101, 18, 2, 199, 244, - 101, 1, 211, 159, 101, 1, 224, 127, 101, 1, 233, 205, 101, 1, 195, 115, - 101, 1, 240, 30, 101, 1, 210, 77, 101, 1, 235, 239, 101, 1, 195, 167, - 101, 1, 110, 209, 182, 101, 1, 110, 222, 38, 101, 18, 2, 110, 159, 101, - 18, 2, 110, 222, 38, 101, 240, 88, 101, 52, 240, 88, 101, 17, 195, 79, - 101, 17, 100, 101, 17, 102, 101, 17, 134, 101, 17, 136, 101, 17, 146, - 101, 17, 167, 101, 17, 178, 101, 17, 171, 101, 17, 182, 101, 252, 30, 55, - 101, 2, 130, 205, 147, 238, 253, 101, 1, 247, 136, 63, 101, 1, 214, 164, - 101, 1, 214, 100, 101, 1, 250, 127, 101, 1, 200, 99, 101, 1, 199, 244, - 101, 1, 220, 16, 240, 41, 101, 1, 195, 74, 101, 1, 85, 164, 101, 1, 234, - 10, 101, 1, 225, 158, 101, 1, 233, 152, 204, 226, 101, 1, 240, 31, 101, - 1, 249, 45, 248, 219, 251, 80, 248, 219, 2, 247, 133, 248, 219, 2, 251, - 51, 248, 219, 2, 199, 2, 248, 219, 1, 63, 248, 219, 1, 252, 168, 248, - 219, 1, 68, 248, 219, 1, 226, 120, 248, 219, 1, 66, 248, 219, 1, 199, - 245, 248, 219, 1, 110, 144, 248, 219, 1, 110, 159, 248, 219, 1, 69, 248, - 219, 1, 251, 200, 248, 219, 1, 72, 248, 219, 1, 250, 150, 248, 219, 1, - 155, 248, 219, 1, 224, 146, 248, 219, 1, 234, 123, 248, 219, 1, 233, 230, - 248, 219, 1, 217, 71, 248, 219, 1, 247, 174, 248, 219, 1, 247, 16, 248, - 219, 1, 225, 214, 248, 219, 1, 225, 180, 248, 219, 1, 215, 109, 248, 219, - 1, 201, 78, 248, 219, 1, 201, 66, 248, 219, 1, 240, 41, 248, 219, 1, 240, - 25, 248, 219, 1, 216, 86, 248, 219, 1, 189, 248, 219, 1, 202, 233, 248, - 219, 1, 240, 136, 248, 219, 1, 239, 176, 248, 219, 1, 176, 248, 219, 1, - 161, 248, 219, 1, 213, 6, 248, 219, 1, 249, 145, 248, 219, 1, 248, 197, - 248, 219, 1, 166, 248, 219, 1, 164, 248, 219, 1, 169, 248, 219, 1, 172, - 248, 219, 1, 207, 50, 248, 219, 1, 205, 80, 248, 219, 1, 183, 248, 219, - 1, 142, 248, 219, 2, 215, 149, 248, 219, 2, 250, 132, 248, 219, 18, 2, - 252, 168, 248, 219, 18, 2, 68, 248, 219, 18, 2, 226, 120, 248, 219, 18, - 2, 66, 248, 219, 18, 2, 199, 245, 248, 219, 18, 2, 110, 144, 248, 219, - 18, 2, 110, 209, 182, 248, 219, 18, 2, 69, 248, 219, 18, 2, 251, 200, - 248, 219, 18, 2, 72, 248, 219, 18, 2, 250, 150, 248, 219, 2, 199, 7, 248, - 219, 1, 224, 137, 189, 248, 219, 250, 151, 222, 158, 78, 248, 219, 1, - 209, 181, 248, 219, 1, 210, 77, 248, 219, 1, 195, 167, 248, 219, 1, 110, - 209, 182, 248, 219, 1, 110, 222, 38, 248, 219, 18, 2, 110, 159, 248, 219, - 18, 2, 110, 222, 38, 248, 219, 17, 195, 79, 248, 219, 17, 100, 248, 219, - 17, 102, 248, 219, 17, 134, 248, 219, 17, 136, 248, 219, 17, 146, 248, - 219, 17, 167, 248, 219, 17, 178, 248, 219, 17, 171, 248, 219, 17, 182, - 248, 219, 1, 210, 252, 3, 112, 239, 146, 248, 219, 1, 210, 252, 3, 221, - 203, 239, 146, 248, 219, 209, 108, 78, 248, 219, 209, 108, 55, 248, 219, - 241, 17, 215, 141, 100, 248, 219, 241, 17, 215, 141, 102, 248, 219, 241, - 17, 215, 141, 134, 248, 219, 241, 17, 215, 141, 136, 248, 219, 241, 17, - 215, 141, 97, 222, 141, 202, 223, 202, 218, 239, 206, 248, 219, 241, 17, - 239, 207, 206, 23, 248, 219, 225, 235, 248, 219, 234, 90, 78, 248, 219, - 1, 199, 115, 251, 51, 248, 219, 252, 30, 55, 248, 219, 208, 215, 78, 233, - 42, 2, 252, 5, 248, 163, 233, 42, 2, 248, 163, 233, 42, 2, 199, 2, 233, - 42, 1, 63, 233, 42, 1, 252, 168, 233, 42, 1, 68, 233, 42, 1, 226, 120, - 233, 42, 1, 66, 233, 42, 1, 199, 245, 233, 42, 1, 237, 54, 233, 42, 1, - 251, 200, 233, 42, 1, 214, 102, 233, 42, 1, 250, 150, 233, 42, 1, 155, - 233, 42, 1, 224, 146, 233, 42, 1, 234, 123, 233, 42, 1, 233, 230, 233, - 42, 1, 217, 71, 233, 42, 1, 247, 174, 233, 42, 1, 247, 16, 233, 42, 1, - 225, 214, 233, 42, 1, 225, 180, 233, 42, 1, 215, 109, 233, 42, 1, 201, - 78, 233, 42, 1, 201, 66, 233, 42, 1, 240, 41, 233, 42, 1, 240, 25, 233, - 42, 1, 216, 86, 233, 42, 1, 189, 233, 42, 1, 202, 233, 233, 42, 1, 240, - 136, 233, 42, 1, 239, 176, 233, 42, 1, 176, 233, 42, 1, 161, 233, 42, 1, - 213, 6, 233, 42, 1, 249, 145, 233, 42, 1, 248, 197, 233, 42, 1, 166, 233, - 42, 1, 164, 233, 42, 1, 169, 233, 42, 1, 172, 233, 42, 1, 222, 37, 233, - 42, 1, 199, 152, 233, 42, 1, 207, 50, 233, 42, 1, 183, 233, 42, 1, 142, - 233, 42, 2, 215, 149, 233, 42, 18, 2, 252, 168, 233, 42, 18, 2, 68, 233, - 42, 18, 2, 226, 120, 233, 42, 18, 2, 66, 233, 42, 18, 2, 199, 245, 233, - 42, 18, 2, 237, 54, 233, 42, 18, 2, 251, 200, 233, 42, 18, 2, 214, 102, - 233, 42, 18, 2, 250, 150, 233, 42, 2, 199, 7, 233, 42, 2, 200, 103, 233, - 42, 1, 224, 127, 233, 42, 1, 233, 205, 233, 42, 1, 195, 115, 233, 42, 1, - 209, 181, 233, 42, 1, 235, 239, 233, 42, 17, 195, 79, 233, 42, 17, 100, - 233, 42, 17, 102, 233, 42, 17, 134, 233, 42, 17, 136, 233, 42, 17, 146, - 233, 42, 17, 167, 233, 42, 17, 178, 233, 42, 17, 171, 233, 42, 17, 182, - 233, 42, 202, 65, 233, 42, 252, 4, 233, 42, 225, 255, 233, 42, 200, 17, - 233, 42, 237, 15, 214, 107, 233, 42, 2, 196, 104, 233, 42, 252, 30, 55, - 233, 58, 2, 247, 133, 233, 58, 2, 251, 51, 233, 58, 2, 199, 2, 233, 58, - 1, 63, 233, 58, 1, 252, 168, 233, 58, 1, 68, 233, 58, 1, 226, 120, 233, - 58, 1, 66, 233, 58, 1, 199, 245, 233, 58, 1, 110, 144, 233, 58, 1, 110, - 159, 233, 58, 18, 247, 136, 69, 233, 58, 1, 69, 233, 58, 1, 251, 200, - 233, 58, 18, 247, 136, 72, 233, 58, 1, 72, 233, 58, 1, 250, 150, 233, 58, - 1, 155, 233, 58, 1, 224, 146, 233, 58, 1, 234, 123, 233, 58, 1, 233, 230, - 233, 58, 1, 217, 71, 233, 58, 1, 247, 174, 233, 58, 1, 247, 16, 233, 58, - 1, 225, 214, 233, 58, 1, 225, 180, 233, 58, 1, 215, 109, 233, 58, 1, 201, - 78, 233, 58, 1, 201, 66, 233, 58, 1, 240, 41, 233, 58, 1, 240, 25, 233, - 58, 1, 216, 86, 233, 58, 1, 189, 233, 58, 1, 202, 233, 233, 58, 1, 240, - 136, 233, 58, 1, 239, 176, 233, 58, 1, 176, 233, 58, 1, 161, 233, 58, 1, - 213, 6, 233, 58, 1, 249, 145, 233, 58, 1, 248, 197, 233, 58, 1, 166, 233, - 58, 1, 164, 233, 58, 1, 169, 233, 58, 1, 172, 233, 58, 1, 222, 37, 233, - 58, 1, 199, 152, 233, 58, 1, 207, 50, 233, 58, 1, 205, 80, 233, 58, 1, - 183, 233, 58, 1, 142, 233, 58, 2, 215, 149, 233, 58, 2, 250, 132, 233, - 58, 18, 2, 252, 168, 233, 58, 18, 2, 68, 233, 58, 18, 2, 226, 120, 233, - 58, 18, 2, 66, 233, 58, 18, 2, 199, 245, 233, 58, 18, 2, 110, 144, 233, - 58, 18, 2, 110, 209, 182, 233, 58, 18, 2, 247, 136, 69, 233, 58, 18, 2, - 69, 233, 58, 18, 2, 251, 200, 233, 58, 18, 2, 247, 136, 72, 233, 58, 18, - 2, 72, 233, 58, 18, 2, 250, 150, 233, 58, 2, 199, 7, 233, 58, 214, 127, - 233, 58, 1, 110, 209, 182, 233, 58, 1, 110, 222, 38, 233, 58, 18, 2, 110, - 159, 233, 58, 18, 2, 110, 222, 38, 233, 58, 17, 195, 79, 233, 58, 17, - 100, 233, 58, 17, 102, 233, 58, 17, 134, 233, 58, 17, 136, 233, 58, 17, - 146, 233, 58, 17, 167, 233, 58, 17, 178, 233, 58, 17, 171, 233, 58, 17, - 182, 233, 58, 252, 30, 55, 233, 58, 209, 108, 55, 233, 58, 1, 195, 74, - 233, 58, 2, 204, 119, 233, 58, 2, 207, 40, 233, 58, 2, 220, 107, 233, 58, - 2, 202, 153, 215, 150, 57, 233, 58, 2, 244, 250, 215, 150, 57, 233, 58, - 2, 200, 217, 215, 150, 57, 214, 62, 2, 247, 133, 214, 62, 2, 251, 51, - 214, 62, 2, 199, 2, 214, 62, 1, 63, 214, 62, 1, 252, 168, 214, 62, 1, 68, - 214, 62, 1, 226, 120, 214, 62, 1, 66, 214, 62, 1, 199, 245, 214, 62, 1, - 110, 144, 214, 62, 1, 110, 159, 214, 62, 1, 69, 214, 62, 1, 251, 200, - 214, 62, 1, 72, 214, 62, 1, 250, 150, 214, 62, 1, 155, 214, 62, 1, 224, - 146, 214, 62, 1, 234, 123, 214, 62, 1, 233, 230, 214, 62, 1, 217, 71, - 214, 62, 1, 247, 174, 214, 62, 1, 247, 16, 214, 62, 1, 225, 214, 214, 62, - 1, 225, 180, 214, 62, 1, 215, 109, 214, 62, 1, 201, 78, 214, 62, 1, 201, - 66, 214, 62, 1, 240, 41, 214, 62, 1, 240, 25, 214, 62, 1, 216, 86, 214, - 62, 1, 189, 214, 62, 1, 202, 233, 214, 62, 1, 240, 136, 214, 62, 1, 239, - 176, 214, 62, 1, 176, 214, 62, 1, 161, 214, 62, 1, 213, 6, 214, 62, 1, - 249, 145, 214, 62, 1, 248, 197, 214, 62, 1, 166, 214, 62, 1, 164, 214, - 62, 1, 169, 214, 62, 1, 172, 214, 62, 1, 222, 37, 214, 62, 1, 199, 152, - 214, 62, 1, 207, 50, 214, 62, 1, 205, 80, 214, 62, 1, 183, 214, 62, 1, - 142, 214, 62, 2, 215, 149, 214, 62, 2, 250, 132, 214, 62, 18, 2, 252, - 168, 214, 62, 18, 2, 68, 214, 62, 18, 2, 226, 120, 214, 62, 18, 2, 66, - 214, 62, 18, 2, 199, 245, 214, 62, 18, 2, 110, 144, 214, 62, 18, 2, 110, - 209, 182, 214, 62, 18, 2, 69, 214, 62, 18, 2, 251, 200, 214, 62, 18, 2, - 72, 214, 62, 18, 2, 250, 150, 214, 62, 2, 199, 7, 214, 62, 251, 201, 222, - 158, 78, 214, 62, 250, 151, 222, 158, 78, 214, 62, 1, 209, 181, 214, 62, - 1, 210, 77, 214, 62, 1, 195, 167, 214, 62, 1, 110, 209, 182, 214, 62, 1, - 110, 222, 38, 214, 62, 18, 2, 110, 159, 214, 62, 18, 2, 110, 222, 38, - 214, 62, 17, 195, 79, 214, 62, 17, 100, 214, 62, 17, 102, 214, 62, 17, - 134, 214, 62, 17, 136, 214, 62, 17, 146, 214, 62, 17, 167, 214, 62, 17, - 178, 214, 62, 17, 171, 214, 62, 17, 182, 214, 62, 225, 235, 214, 62, 1, - 197, 166, 214, 62, 191, 97, 211, 87, 214, 62, 191, 97, 232, 225, 214, 62, - 191, 115, 211, 85, 214, 62, 191, 97, 206, 21, 214, 62, 191, 97, 237, 26, - 214, 62, 191, 115, 206, 18, 42, 2, 251, 51, 42, 2, 199, 2, 42, 1, 63, 42, - 1, 252, 168, 42, 1, 68, 42, 1, 226, 120, 42, 1, 66, 42, 1, 199, 245, 42, - 1, 69, 42, 1, 237, 54, 42, 1, 251, 200, 42, 1, 72, 42, 1, 214, 102, 42, - 1, 250, 150, 42, 1, 155, 42, 1, 217, 71, 42, 1, 247, 174, 42, 1, 225, - 214, 42, 1, 215, 109, 42, 1, 201, 78, 42, 1, 216, 86, 42, 1, 189, 42, 1, - 176, 42, 1, 216, 68, 42, 1, 161, 42, 1, 166, 42, 1, 164, 42, 1, 169, 42, - 1, 209, 181, 42, 1, 172, 42, 1, 222, 37, 42, 1, 222, 26, 42, 1, 199, 152, - 42, 1, 207, 50, 42, 1, 205, 80, 42, 1, 183, 42, 1, 142, 42, 18, 2, 252, - 168, 42, 18, 2, 68, 42, 18, 2, 226, 120, 42, 18, 2, 66, 42, 18, 2, 199, - 245, 42, 18, 2, 69, 42, 18, 2, 237, 54, 42, 18, 2, 251, 200, 42, 18, 2, - 72, 42, 18, 2, 214, 102, 42, 18, 2, 250, 150, 42, 2, 199, 7, 42, 214, - 127, 42, 250, 151, 222, 158, 78, 42, 17, 195, 79, 42, 17, 100, 42, 17, - 102, 42, 17, 134, 42, 17, 136, 42, 17, 146, 42, 17, 167, 42, 17, 178, 42, - 17, 171, 42, 17, 182, 42, 31, 203, 23, 42, 31, 97, 231, 57, 42, 31, 97, - 170, 42, 240, 54, 55, 42, 218, 198, 55, 42, 196, 67, 55, 42, 239, 248, - 55, 42, 241, 74, 55, 42, 250, 203, 90, 55, 42, 209, 108, 55, 42, 31, 55, - 194, 194, 2, 38, 247, 134, 57, 194, 194, 2, 247, 133, 194, 194, 2, 251, - 51, 194, 194, 2, 199, 2, 194, 194, 2, 38, 251, 52, 57, 194, 194, 1, 63, - 194, 194, 1, 252, 168, 194, 194, 1, 68, 194, 194, 1, 226, 120, 194, 194, - 1, 66, 194, 194, 1, 199, 245, 194, 194, 1, 110, 144, 194, 194, 1, 110, - 159, 194, 194, 1, 69, 194, 194, 1, 237, 54, 194, 194, 1, 251, 200, 194, - 194, 1, 72, 194, 194, 1, 214, 102, 194, 194, 1, 250, 150, 194, 194, 1, - 155, 194, 194, 1, 224, 146, 194, 194, 1, 234, 123, 194, 194, 1, 233, 230, - 194, 194, 1, 217, 71, 194, 194, 1, 247, 174, 194, 194, 1, 247, 16, 194, - 194, 1, 225, 214, 194, 194, 1, 225, 180, 194, 194, 1, 215, 109, 194, 194, - 1, 201, 78, 194, 194, 1, 201, 66, 194, 194, 1, 240, 41, 194, 194, 1, 240, - 25, 194, 194, 1, 216, 86, 194, 194, 1, 189, 194, 194, 1, 202, 233, 194, - 194, 1, 240, 136, 194, 194, 1, 239, 176, 194, 194, 1, 176, 194, 194, 1, - 161, 194, 194, 1, 213, 6, 194, 194, 1, 249, 145, 194, 194, 1, 248, 197, - 194, 194, 1, 166, 194, 194, 1, 164, 194, 194, 1, 169, 194, 194, 1, 209, - 181, 194, 194, 1, 172, 194, 194, 1, 222, 37, 194, 194, 1, 222, 26, 194, - 194, 1, 199, 152, 194, 194, 1, 207, 50, 194, 194, 1, 205, 80, 194, 194, - 1, 183, 194, 194, 1, 142, 194, 194, 2, 250, 132, 194, 194, 18, 2, 252, - 168, 194, 194, 18, 2, 68, 194, 194, 18, 2, 226, 120, 194, 194, 18, 2, 66, - 194, 194, 18, 2, 199, 245, 194, 194, 18, 2, 110, 144, 194, 194, 18, 2, - 110, 209, 182, 194, 194, 18, 2, 69, 194, 194, 18, 2, 237, 54, 194, 194, - 18, 2, 251, 200, 194, 194, 18, 2, 72, 194, 194, 18, 2, 214, 102, 194, - 194, 18, 2, 250, 150, 194, 194, 2, 199, 7, 194, 194, 222, 158, 78, 194, - 194, 251, 201, 222, 158, 78, 194, 194, 1, 201, 113, 194, 194, 1, 237, - 156, 194, 194, 1, 209, 162, 194, 194, 1, 110, 209, 182, 194, 194, 1, 110, - 222, 38, 194, 194, 18, 2, 110, 159, 194, 194, 18, 2, 110, 222, 38, 194, - 194, 17, 195, 79, 194, 194, 17, 100, 194, 194, 17, 102, 194, 194, 17, - 134, 194, 194, 17, 136, 194, 194, 17, 146, 194, 194, 17, 167, 194, 194, - 17, 178, 194, 194, 17, 171, 194, 194, 17, 182, 194, 194, 2, 206, 100, - 194, 194, 191, 17, 195, 80, 36, 214, 168, 212, 57, 77, 136, 194, 194, - 191, 17, 97, 36, 214, 168, 212, 57, 77, 136, 194, 194, 191, 17, 99, 36, - 214, 168, 212, 57, 77, 136, 194, 194, 191, 17, 115, 36, 214, 168, 212, - 57, 77, 136, 194, 194, 191, 17, 97, 36, 236, 103, 212, 57, 77, 136, 194, - 194, 191, 17, 99, 36, 236, 103, 212, 57, 77, 136, 194, 194, 191, 17, 115, - 36, 236, 103, 212, 57, 77, 136, 194, 194, 2, 200, 250, 225, 11, 2, 205, - 147, 247, 133, 225, 11, 2, 247, 133, 225, 11, 2, 251, 51, 225, 11, 2, - 199, 2, 225, 11, 2, 206, 100, 225, 11, 1, 63, 225, 11, 1, 252, 168, 225, - 11, 1, 68, 225, 11, 1, 226, 120, 225, 11, 1, 66, 225, 11, 1, 199, 245, - 225, 11, 1, 110, 144, 225, 11, 1, 110, 159, 225, 11, 1, 69, 225, 11, 1, - 237, 54, 225, 11, 1, 251, 200, 225, 11, 1, 72, 225, 11, 1, 214, 102, 225, - 11, 1, 250, 150, 225, 11, 1, 155, 225, 11, 1, 224, 146, 225, 11, 1, 234, - 123, 225, 11, 1, 233, 230, 225, 11, 1, 217, 71, 225, 11, 1, 247, 174, - 225, 11, 1, 247, 16, 225, 11, 1, 225, 214, 225, 11, 1, 225, 180, 225, 11, - 1, 215, 109, 225, 11, 1, 201, 78, 225, 11, 1, 201, 66, 225, 11, 1, 240, - 41, 225, 11, 1, 240, 25, 225, 11, 1, 216, 86, 225, 11, 1, 189, 225, 11, - 1, 202, 233, 225, 11, 1, 240, 136, 225, 11, 1, 239, 176, 225, 11, 1, 176, - 225, 11, 1, 161, 225, 11, 1, 213, 6, 225, 11, 1, 249, 145, 225, 11, 1, - 248, 197, 225, 11, 1, 166, 225, 11, 1, 164, 225, 11, 1, 169, 225, 11, 1, - 209, 181, 225, 11, 1, 172, 225, 11, 1, 222, 37, 225, 11, 1, 199, 152, - 225, 11, 1, 207, 50, 225, 11, 1, 205, 80, 225, 11, 1, 183, 225, 11, 1, - 142, 225, 11, 2, 215, 149, 225, 11, 2, 250, 132, 225, 11, 18, 2, 252, - 168, 225, 11, 18, 2, 68, 225, 11, 18, 2, 226, 120, 225, 11, 18, 2, 66, - 225, 11, 18, 2, 199, 245, 225, 11, 18, 2, 110, 144, 225, 11, 18, 2, 110, - 209, 182, 225, 11, 18, 2, 69, 225, 11, 18, 2, 237, 54, 225, 11, 18, 2, - 251, 200, 225, 11, 18, 2, 72, 225, 11, 18, 2, 214, 102, 225, 11, 18, 2, - 250, 150, 225, 11, 2, 199, 7, 225, 11, 222, 158, 78, 225, 11, 251, 201, - 222, 158, 78, 225, 11, 1, 235, 239, 225, 11, 1, 110, 209, 182, 225, 11, - 1, 110, 222, 38, 225, 11, 18, 2, 110, 159, 225, 11, 18, 2, 110, 222, 38, - 225, 11, 17, 195, 79, 225, 11, 17, 100, 225, 11, 17, 102, 225, 11, 17, - 134, 225, 11, 17, 136, 225, 11, 17, 146, 225, 11, 17, 167, 225, 11, 17, - 178, 225, 11, 17, 171, 225, 11, 17, 182, 225, 11, 2, 225, 165, 225, 11, - 2, 200, 34, 131, 2, 38, 251, 52, 57, 131, 2, 247, 133, 131, 2, 251, 51, - 131, 2, 199, 2, 131, 1, 63, 131, 1, 252, 168, 131, 1, 68, 131, 1, 226, - 120, 131, 1, 66, 131, 1, 199, 245, 131, 1, 110, 144, 131, 1, 110, 159, - 131, 1, 69, 131, 1, 237, 54, 131, 1, 251, 200, 131, 1, 72, 131, 1, 214, - 102, 131, 1, 250, 150, 131, 1, 155, 131, 1, 224, 146, 131, 1, 234, 123, - 131, 1, 233, 230, 131, 1, 217, 71, 131, 1, 247, 174, 131, 1, 247, 16, - 131, 1, 225, 214, 131, 1, 225, 180, 131, 1, 215, 109, 131, 1, 201, 78, - 131, 1, 201, 66, 131, 1, 240, 41, 131, 1, 240, 25, 131, 1, 216, 86, 131, - 1, 189, 131, 1, 202, 233, 131, 1, 240, 136, 131, 1, 239, 176, 131, 1, - 176, 131, 1, 216, 68, 131, 1, 161, 131, 1, 213, 6, 131, 1, 249, 145, 131, - 1, 248, 197, 131, 1, 166, 131, 1, 164, 131, 1, 169, 131, 1, 209, 181, - 131, 1, 172, 131, 1, 222, 37, 131, 1, 222, 26, 131, 1, 199, 152, 131, 1, - 207, 50, 131, 1, 205, 80, 131, 1, 183, 131, 1, 142, 131, 1, 201, 47, 131, - 2, 83, 249, 80, 199, 7, 131, 2, 244, 243, 199, 7, 131, 2, 250, 132, 131, - 18, 2, 252, 168, 131, 18, 2, 68, 131, 18, 2, 226, 120, 131, 18, 2, 66, - 131, 18, 2, 199, 245, 131, 18, 2, 110, 144, 131, 18, 2, 110, 209, 182, - 131, 18, 2, 69, 131, 18, 2, 237, 54, 131, 18, 2, 251, 200, 131, 18, 2, - 72, 131, 18, 2, 214, 102, 131, 18, 2, 250, 150, 131, 2, 199, 7, 131, 1, - 76, 210, 116, 131, 2, 213, 156, 131, 1, 245, 64, 221, 136, 131, 1, 245, - 64, 196, 148, 131, 1, 245, 64, 222, 27, 131, 250, 151, 222, 158, 78, 131, - 191, 97, 214, 115, 131, 191, 97, 235, 17, 131, 191, 115, 237, 22, 131, - 191, 97, 200, 237, 131, 191, 97, 203, 14, 131, 191, 115, 200, 236, 131, - 191, 97, 235, 148, 131, 1, 250, 251, 226, 120, 131, 1, 110, 209, 182, - 131, 1, 110, 222, 38, 131, 18, 2, 110, 159, 131, 18, 2, 110, 222, 38, - 131, 17, 195, 79, 131, 17, 100, 131, 17, 102, 131, 17, 134, 131, 17, 136, - 131, 17, 146, 131, 17, 167, 131, 17, 178, 131, 17, 171, 131, 17, 182, - 131, 31, 203, 23, 131, 31, 97, 231, 57, 131, 31, 97, 170, 131, 191, 97, - 211, 87, 131, 191, 97, 232, 225, 131, 191, 115, 211, 85, 131, 191, 97, - 206, 21, 131, 191, 97, 237, 26, 131, 191, 115, 206, 18, 131, 240, 59, 78, - 131, 1, 245, 64, 216, 87, 131, 1, 245, 64, 218, 55, 131, 1, 245, 64, 209, - 182, 131, 1, 245, 64, 159, 131, 1, 245, 64, 222, 38, 131, 1, 245, 64, - 225, 80, 153, 2, 251, 50, 153, 2, 199, 1, 153, 1, 250, 120, 153, 1, 252, - 121, 153, 1, 251, 225, 153, 1, 251, 240, 153, 1, 225, 224, 153, 1, 226, - 119, 153, 1, 199, 236, 153, 1, 199, 239, 153, 1, 225, 250, 153, 1, 225, - 251, 153, 1, 226, 105, 153, 1, 226, 107, 153, 1, 236, 70, 153, 1, 237, - 49, 153, 1, 251, 183, 153, 1, 214, 7, 153, 1, 214, 95, 153, 1, 250, 135, - 153, 1, 251, 137, 224, 214, 153, 1, 220, 88, 224, 214, 153, 1, 251, 137, - 234, 68, 153, 1, 220, 88, 234, 68, 153, 1, 225, 10, 217, 241, 153, 1, - 208, 209, 234, 68, 153, 1, 251, 137, 247, 83, 153, 1, 220, 88, 247, 83, - 153, 1, 251, 137, 225, 196, 153, 1, 220, 88, 225, 196, 153, 1, 203, 159, - 217, 241, 153, 1, 203, 159, 208, 208, 217, 242, 153, 1, 208, 209, 225, - 196, 153, 1, 251, 137, 201, 74, 153, 1, 220, 88, 201, 74, 153, 1, 251, - 137, 240, 32, 153, 1, 220, 88, 240, 32, 153, 1, 218, 84, 217, 194, 153, - 1, 208, 209, 240, 32, 153, 1, 251, 137, 203, 76, 153, 1, 220, 88, 203, - 76, 153, 1, 251, 137, 240, 52, 153, 1, 220, 88, 240, 52, 153, 1, 240, 84, - 217, 194, 153, 1, 208, 209, 240, 52, 153, 1, 251, 137, 213, 100, 153, 1, - 220, 88, 213, 100, 153, 1, 251, 137, 249, 47, 153, 1, 220, 88, 249, 47, - 153, 1, 219, 249, 153, 1, 251, 117, 249, 47, 153, 1, 196, 74, 153, 1, - 210, 190, 153, 1, 240, 84, 222, 206, 153, 1, 199, 120, 153, 1, 203, 159, - 208, 179, 153, 1, 218, 84, 208, 179, 153, 1, 240, 84, 208, 179, 153, 1, - 232, 153, 153, 1, 218, 84, 222, 206, 153, 1, 235, 191, 153, 2, 251, 172, - 153, 18, 2, 251, 235, 153, 18, 2, 224, 171, 251, 242, 153, 18, 2, 239, - 119, 251, 242, 153, 18, 2, 224, 171, 225, 247, 153, 18, 2, 239, 119, 225, - 247, 153, 18, 2, 224, 171, 213, 242, 153, 18, 2, 239, 119, 213, 242, 153, - 18, 2, 234, 112, 153, 18, 2, 223, 247, 153, 18, 2, 239, 119, 223, 247, - 153, 18, 2, 223, 249, 239, 226, 153, 18, 2, 223, 248, 232, 247, 251, 235, - 153, 18, 2, 223, 248, 232, 247, 239, 119, 251, 235, 153, 18, 2, 223, 248, - 232, 247, 234, 67, 153, 18, 2, 234, 67, 153, 222, 50, 17, 195, 79, 153, - 222, 50, 17, 100, 153, 222, 50, 17, 102, 153, 222, 50, 17, 134, 153, 222, - 50, 17, 136, 153, 222, 50, 17, 146, 153, 222, 50, 17, 167, 153, 222, 50, - 17, 178, 153, 222, 50, 17, 171, 153, 222, 50, 17, 182, 153, 18, 2, 239, - 119, 234, 112, 153, 18, 2, 239, 119, 234, 67, 153, 211, 214, 223, 165, - 202, 228, 190, 224, 12, 225, 31, 202, 228, 190, 224, 118, 224, 141, 202, - 228, 190, 224, 118, 224, 109, 202, 228, 190, 224, 118, 224, 104, 202, - 228, 190, 224, 118, 224, 114, 202, 228, 190, 224, 118, 210, 211, 202, - 228, 190, 216, 253, 216, 240, 202, 228, 190, 245, 50, 247, 5, 202, 228, - 190, 245, 50, 245, 60, 202, 228, 190, 245, 50, 247, 4, 202, 228, 190, - 205, 201, 205, 200, 202, 228, 190, 245, 50, 245, 46, 202, 228, 190, 196, - 4, 196, 11, 202, 228, 190, 239, 29, 247, 13, 202, 228, 190, 202, 30, 213, - 114, 202, 228, 190, 202, 170, 202, 222, 202, 228, 190, 202, 170, 217, - 217, 202, 228, 190, 202, 170, 212, 223, 202, 228, 190, 216, 51, 217, 101, - 202, 228, 190, 239, 29, 239, 227, 202, 228, 190, 202, 30, 203, 106, 202, - 228, 190, 202, 170, 202, 136, 202, 228, 190, 202, 170, 202, 229, 202, - 228, 190, 202, 170, 202, 165, 202, 228, 190, 216, 51, 215, 186, 202, 228, - 190, 248, 117, 249, 110, 202, 228, 190, 212, 118, 212, 150, 202, 228, - 190, 212, 235, 212, 225, 202, 228, 190, 235, 52, 235, 239, 202, 228, 190, - 212, 235, 212, 255, 202, 228, 190, 235, 52, 235, 210, 202, 228, 190, 212, - 235, 208, 223, 202, 228, 190, 218, 252, 166, 202, 228, 190, 196, 4, 196, - 105, 202, 228, 190, 209, 233, 209, 133, 202, 228, 190, 209, 140, 202, - 228, 190, 222, 8, 222, 68, 202, 228, 190, 221, 191, 202, 228, 190, 197, - 35, 197, 156, 202, 228, 190, 205, 201, 208, 239, 202, 228, 190, 205, 201, - 209, 104, 202, 228, 190, 205, 201, 204, 163, 202, 228, 190, 231, 194, - 232, 35, 202, 228, 190, 222, 8, 245, 29, 202, 228, 190, 177, 251, 97, - 202, 228, 190, 231, 194, 216, 41, 202, 228, 190, 213, 217, 202, 228, 190, - 208, 203, 63, 202, 228, 190, 220, 82, 232, 211, 202, 228, 190, 208, 203, - 252, 168, 202, 228, 190, 208, 203, 251, 123, 202, 228, 190, 208, 203, 68, - 202, 228, 190, 208, 203, 226, 120, 202, 228, 190, 208, 203, 200, 99, 202, - 228, 190, 208, 203, 200, 97, 202, 228, 190, 208, 203, 66, 202, 228, 190, - 208, 203, 199, 245, 202, 228, 190, 212, 237, 202, 228, 241, 17, 16, 249, - 111, 202, 228, 190, 208, 203, 69, 202, 228, 190, 208, 203, 251, 245, 202, - 228, 190, 208, 203, 72, 202, 228, 190, 208, 203, 251, 201, 220, 76, 202, - 228, 190, 208, 203, 251, 201, 220, 77, 202, 228, 190, 222, 253, 202, 228, - 190, 220, 73, 202, 228, 190, 220, 74, 202, 228, 190, 220, 82, 237, 14, - 202, 228, 190, 220, 82, 202, 169, 202, 228, 190, 220, 82, 201, 183, 202, - 228, 190, 220, 82, 245, 108, 202, 228, 190, 202, 220, 202, 228, 190, 216, - 187, 202, 228, 190, 196, 99, 202, 228, 190, 235, 42, 202, 228, 17, 195, - 79, 202, 228, 17, 100, 202, 228, 17, 102, 202, 228, 17, 134, 202, 228, - 17, 136, 202, 228, 17, 146, 202, 228, 17, 167, 202, 228, 17, 178, 202, - 228, 17, 171, 202, 228, 17, 182, 202, 228, 190, 251, 92, 202, 228, 190, - 224, 115, 222, 232, 1, 224, 11, 222, 232, 1, 224, 118, 204, 108, 222, - 232, 1, 224, 118, 203, 117, 222, 232, 1, 213, 210, 233, 230, 222, 232, 1, - 216, 252, 222, 232, 1, 244, 182, 222, 232, 1, 213, 210, 247, 16, 222, - 232, 1, 205, 201, 203, 117, 222, 232, 1, 213, 210, 225, 180, 222, 232, 1, - 215, 73, 222, 232, 1, 213, 210, 215, 109, 222, 232, 1, 213, 210, 201, 78, - 222, 232, 1, 213, 210, 201, 66, 222, 232, 1, 213, 210, 240, 41, 222, 232, - 1, 213, 210, 240, 25, 222, 232, 1, 213, 210, 216, 86, 222, 232, 1, 239, - 28, 222, 232, 1, 149, 222, 232, 1, 202, 170, 204, 108, 222, 232, 1, 202, - 170, 203, 117, 222, 232, 1, 213, 210, 239, 176, 222, 232, 1, 216, 50, - 222, 232, 1, 248, 116, 222, 232, 1, 212, 117, 222, 232, 1, 212, 235, 204, - 108, 222, 232, 1, 235, 52, 203, 117, 222, 232, 1, 212, 235, 203, 117, - 222, 232, 1, 235, 52, 204, 108, 222, 232, 1, 213, 210, 248, 197, 222, - 232, 1, 218, 251, 222, 232, 1, 196, 3, 222, 232, 1, 222, 8, 222, 68, 222, - 232, 1, 222, 8, 221, 223, 222, 232, 1, 197, 34, 222, 232, 1, 208, 211, - 207, 50, 222, 232, 1, 208, 211, 205, 80, 222, 232, 1, 205, 201, 204, 108, - 222, 232, 1, 231, 194, 204, 108, 222, 232, 1, 213, 210, 222, 37, 222, - 232, 1, 72, 222, 232, 1, 231, 194, 203, 117, 222, 232, 236, 247, 222, - 232, 18, 2, 63, 222, 232, 18, 2, 220, 82, 225, 17, 222, 232, 18, 2, 252, - 168, 222, 232, 18, 2, 251, 123, 222, 232, 18, 2, 68, 222, 232, 18, 2, - 226, 120, 222, 232, 18, 2, 196, 148, 222, 232, 18, 2, 195, 168, 222, 232, - 18, 2, 66, 222, 232, 18, 2, 199, 245, 222, 232, 2, 213, 210, 199, 7, 222, - 232, 18, 2, 220, 82, 223, 245, 222, 232, 207, 100, 2, 222, 7, 222, 232, - 207, 100, 2, 215, 73, 222, 232, 18, 2, 69, 222, 232, 18, 2, 237, 33, 222, - 232, 18, 2, 72, 222, 232, 18, 2, 250, 122, 222, 232, 18, 2, 251, 200, - 222, 232, 224, 12, 172, 222, 232, 152, 220, 82, 237, 14, 222, 232, 152, - 220, 82, 202, 169, 222, 232, 152, 220, 82, 202, 122, 222, 232, 152, 220, - 82, 247, 91, 222, 232, 247, 139, 78, 222, 232, 216, 196, 222, 232, 17, - 195, 79, 222, 232, 17, 100, 222, 232, 17, 102, 222, 232, 17, 134, 222, - 232, 17, 136, 222, 232, 17, 146, 222, 232, 17, 167, 222, 232, 17, 178, - 222, 232, 17, 171, 222, 232, 17, 182, 222, 232, 231, 194, 216, 50, 222, - 232, 231, 194, 218, 251, 222, 232, 1, 224, 119, 233, 144, 222, 232, 1, - 224, 119, 215, 73, 82, 5, 214, 127, 82, 117, 233, 78, 196, 16, 219, 96, - 201, 119, 63, 82, 117, 233, 78, 196, 16, 219, 96, 255, 169, 209, 237, - 249, 11, 166, 82, 117, 233, 78, 196, 16, 219, 96, 255, 169, 233, 78, 201, - 99, 166, 82, 117, 84, 196, 16, 219, 96, 219, 209, 166, 82, 117, 244, 199, - 196, 16, 219, 96, 207, 57, 166, 82, 117, 247, 111, 196, 16, 219, 96, 212, - 224, 207, 43, 166, 82, 117, 196, 16, 219, 96, 201, 99, 207, 43, 166, 82, - 117, 208, 177, 207, 42, 82, 117, 248, 24, 196, 16, 219, 95, 82, 117, 248, - 138, 206, 192, 196, 16, 219, 95, 82, 117, 226, 22, 201, 98, 82, 117, 239, - 219, 201, 99, 248, 23, 82, 117, 207, 42, 82, 117, 215, 78, 207, 42, 82, - 117, 201, 99, 207, 42, 82, 117, 215, 78, 201, 99, 207, 42, 82, 117, 210, - 5, 245, 89, 205, 97, 207, 42, 82, 117, 210, 81, 233, 112, 207, 42, 82, - 117, 247, 111, 255, 173, 209, 145, 219, 208, 181, 247, 142, 82, 117, 233, - 78, 201, 98, 82, 221, 247, 2, 247, 14, 209, 144, 82, 221, 247, 2, 222, - 120, 209, 144, 82, 250, 174, 2, 207, 53, 234, 51, 255, 174, 209, 144, 82, - 250, 174, 2, 255, 171, 161, 82, 250, 174, 2, 208, 148, 201, 93, 82, 2, - 210, 185, 239, 43, 234, 50, 82, 2, 210, 185, 239, 43, 233, 146, 82, 2, - 210, 185, 239, 43, 233, 79, 82, 2, 210, 185, 217, 237, 234, 50, 82, 2, - 210, 185, 217, 237, 233, 146, 82, 2, 210, 185, 239, 43, 210, 185, 217, - 236, 82, 17, 195, 79, 82, 17, 100, 82, 17, 102, 82, 17, 134, 82, 17, 136, - 82, 17, 146, 82, 17, 167, 82, 17, 178, 82, 17, 171, 82, 17, 182, 82, 17, - 157, 100, 82, 17, 157, 102, 82, 17, 157, 134, 82, 17, 157, 136, 82, 17, - 157, 146, 82, 17, 157, 167, 82, 17, 157, 178, 82, 17, 157, 171, 82, 17, - 157, 182, 82, 17, 157, 195, 79, 82, 117, 248, 26, 209, 144, 82, 117, 217, - 62, 247, 209, 215, 90, 195, 13, 82, 117, 247, 111, 255, 173, 209, 145, - 247, 210, 219, 41, 247, 142, 82, 117, 217, 62, 247, 209, 207, 54, 209, - 144, 82, 117, 245, 104, 219, 95, 82, 117, 201, 114, 255, 170, 82, 117, - 233, 61, 209, 145, 233, 18, 82, 117, 233, 61, 209, 145, 233, 24, 82, 117, - 251, 98, 224, 136, 233, 18, 82, 117, 251, 98, 224, 136, 233, 24, 82, 2, - 196, 91, 201, 97, 82, 2, 220, 38, 201, 97, 82, 1, 155, 82, 1, 224, 146, - 82, 1, 234, 123, 82, 1, 233, 230, 82, 1, 217, 71, 82, 1, 247, 174, 82, 1, - 247, 16, 82, 1, 225, 214, 82, 1, 215, 109, 82, 1, 201, 78, 82, 1, 201, - 66, 82, 1, 240, 41, 82, 1, 240, 25, 82, 1, 216, 86, 82, 1, 189, 82, 1, - 202, 233, 82, 1, 240, 136, 82, 1, 239, 176, 82, 1, 176, 82, 1, 161, 82, - 1, 213, 6, 82, 1, 249, 145, 82, 1, 248, 197, 82, 1, 166, 82, 1, 201, 113, - 82, 1, 201, 103, 82, 1, 237, 156, 82, 1, 237, 150, 82, 1, 197, 166, 82, - 1, 195, 74, 82, 1, 195, 115, 82, 1, 255, 176, 82, 1, 164, 82, 1, 169, 82, - 1, 172, 82, 1, 207, 50, 82, 1, 205, 80, 82, 1, 183, 82, 1, 142, 82, 1, - 63, 82, 1, 223, 201, 82, 1, 235, 97, 169, 82, 1, 224, 36, 82, 1, 209, - 181, 82, 18, 2, 252, 168, 82, 18, 2, 68, 82, 18, 2, 226, 120, 82, 18, 2, - 66, 82, 18, 2, 199, 245, 82, 18, 2, 110, 144, 82, 18, 2, 110, 209, 182, - 82, 18, 2, 110, 159, 82, 18, 2, 110, 222, 38, 82, 18, 2, 69, 82, 18, 2, - 237, 54, 82, 18, 2, 72, 82, 18, 2, 214, 102, 82, 2, 209, 243, 204, 173, - 217, 72, 209, 232, 82, 2, 209, 237, 249, 10, 82, 18, 2, 210, 89, 68, 82, - 18, 2, 210, 89, 226, 120, 82, 2, 215, 90, 195, 14, 217, 245, 240, 136, - 82, 2, 205, 215, 222, 199, 82, 117, 232, 227, 82, 117, 213, 202, 82, 2, - 222, 202, 209, 144, 82, 2, 196, 96, 209, 144, 82, 2, 222, 203, 201, 114, - 247, 142, 82, 2, 219, 211, 247, 142, 82, 2, 233, 82, 247, 143, 210, 79, - 82, 2, 233, 82, 219, 197, 210, 79, 82, 2, 226, 17, 219, 211, 247, 142, - 82, 204, 152, 2, 222, 203, 201, 114, 247, 142, 82, 204, 152, 2, 219, 211, - 247, 142, 82, 204, 152, 2, 226, 17, 219, 211, 247, 142, 82, 204, 152, 1, - 155, 82, 204, 152, 1, 224, 146, 82, 204, 152, 1, 234, 123, 82, 204, 152, - 1, 233, 230, 82, 204, 152, 1, 217, 71, 82, 204, 152, 1, 247, 174, 82, - 204, 152, 1, 247, 16, 82, 204, 152, 1, 225, 214, 82, 204, 152, 1, 215, - 109, 82, 204, 152, 1, 201, 78, 82, 204, 152, 1, 201, 66, 82, 204, 152, 1, - 240, 41, 82, 204, 152, 1, 240, 25, 82, 204, 152, 1, 216, 86, 82, 204, - 152, 1, 189, 82, 204, 152, 1, 202, 233, 82, 204, 152, 1, 240, 136, 82, - 204, 152, 1, 239, 176, 82, 204, 152, 1, 176, 82, 204, 152, 1, 161, 82, - 204, 152, 1, 213, 6, 82, 204, 152, 1, 249, 145, 82, 204, 152, 1, 248, - 197, 82, 204, 152, 1, 166, 82, 204, 152, 1, 201, 113, 82, 204, 152, 1, - 201, 103, 82, 204, 152, 1, 237, 156, 82, 204, 152, 1, 237, 150, 82, 204, - 152, 1, 197, 166, 82, 204, 152, 1, 195, 74, 82, 204, 152, 1, 195, 115, - 82, 204, 152, 1, 255, 176, 82, 204, 152, 1, 164, 82, 204, 152, 1, 169, - 82, 204, 152, 1, 172, 82, 204, 152, 1, 207, 50, 82, 204, 152, 1, 205, 80, - 82, 204, 152, 1, 183, 82, 204, 152, 1, 142, 82, 204, 152, 1, 63, 82, 204, - 152, 1, 223, 201, 82, 204, 152, 1, 235, 97, 197, 166, 82, 204, 152, 1, - 235, 97, 164, 82, 204, 152, 1, 235, 97, 169, 82, 223, 188, 209, 141, 224, - 146, 82, 223, 188, 209, 141, 224, 147, 247, 210, 219, 41, 247, 142, 82, - 247, 126, 2, 85, 249, 0, 82, 247, 126, 2, 175, 249, 0, 82, 247, 126, 2, - 247, 130, 203, 58, 82, 247, 126, 2, 208, 176, 255, 175, 82, 16, 237, 217, - 248, 21, 82, 16, 210, 184, 209, 244, 82, 16, 213, 229, 234, 49, 82, 16, - 210, 184, 209, 245, 210, 81, 233, 111, 82, 16, 212, 224, 161, 82, 16, - 216, 28, 248, 21, 82, 16, 216, 28, 248, 22, 215, 78, 255, 172, 82, 16, - 216, 28, 248, 22, 233, 80, 255, 172, 82, 16, 216, 28, 248, 22, 247, 210, - 255, 172, 82, 2, 210, 185, 217, 237, 210, 185, 239, 42, 82, 2, 210, 185, - 217, 237, 233, 79, 82, 117, 248, 25, 206, 192, 233, 193, 219, 96, 210, - 80, 82, 117, 218, 253, 196, 16, 233, 193, 219, 96, 210, 80, 82, 117, 215, - 78, 201, 98, 82, 117, 84, 248, 54, 209, 234, 196, 16, 219, 96, 219, 209, - 166, 82, 117, 244, 199, 248, 54, 209, 234, 196, 16, 219, 96, 207, 57, - 166, 210, 21, 204, 69, 55, 222, 183, 204, 69, 55, 210, 21, 204, 69, 2, 3, - 238, 250, 222, 183, 204, 69, 2, 3, 238, 250, 82, 117, 222, 194, 219, 212, - 209, 144, 82, 117, 201, 209, 219, 212, 209, 144, 75, 1, 155, 75, 1, 224, - 146, 75, 1, 234, 123, 75, 1, 233, 230, 75, 1, 217, 71, 75, 1, 247, 174, - 75, 1, 247, 16, 75, 1, 225, 214, 75, 1, 225, 180, 75, 1, 215, 109, 75, 1, - 216, 52, 75, 1, 201, 78, 75, 1, 201, 66, 75, 1, 240, 41, 75, 1, 240, 25, - 75, 1, 216, 86, 75, 1, 189, 75, 1, 202, 233, 75, 1, 240, 136, 75, 1, 239, - 176, 75, 1, 176, 75, 1, 161, 75, 1, 213, 6, 75, 1, 249, 145, 75, 1, 248, - 197, 75, 1, 166, 75, 1, 164, 75, 1, 169, 75, 1, 172, 75, 1, 197, 166, 75, - 1, 183, 75, 1, 142, 75, 1, 222, 37, 75, 1, 63, 75, 1, 207, 25, 63, 75, 1, - 68, 75, 1, 226, 120, 75, 1, 66, 75, 1, 199, 245, 75, 1, 69, 75, 1, 218, - 216, 69, 75, 1, 72, 75, 1, 250, 150, 75, 18, 2, 203, 120, 252, 168, 75, - 18, 2, 252, 168, 75, 18, 2, 68, 75, 18, 2, 226, 120, 75, 18, 2, 66, 75, - 18, 2, 199, 245, 75, 18, 2, 69, 75, 18, 2, 251, 200, 75, 18, 2, 218, 216, - 226, 120, 75, 18, 2, 218, 216, 72, 75, 18, 2, 237, 136, 57, 75, 2, 251, - 51, 75, 2, 76, 60, 75, 2, 199, 2, 75, 2, 199, 7, 75, 2, 250, 199, 75, - 108, 2, 219, 194, 164, 75, 108, 2, 219, 194, 169, 75, 108, 2, 219, 194, - 197, 166, 75, 108, 2, 219, 194, 142, 75, 1, 233, 96, 183, 75, 17, 195, - 79, 75, 17, 100, 75, 17, 102, 75, 17, 134, 75, 17, 136, 75, 17, 146, 75, - 17, 167, 75, 17, 178, 75, 17, 171, 75, 17, 182, 75, 2, 222, 47, 208, 132, - 75, 2, 208, 132, 75, 16, 222, 0, 75, 16, 244, 152, 75, 16, 251, 221, 75, - 16, 234, 29, 75, 1, 207, 50, 75, 1, 205, 80, 75, 1, 110, 144, 75, 1, 110, - 209, 182, 75, 1, 110, 159, 75, 1, 110, 222, 38, 75, 18, 2, 110, 144, 75, - 18, 2, 110, 209, 182, 75, 18, 2, 110, 159, 75, 18, 2, 110, 222, 38, 75, - 1, 218, 216, 217, 71, 75, 1, 218, 216, 225, 180, 75, 1, 218, 216, 249, - 45, 75, 1, 218, 216, 249, 40, 75, 108, 2, 218, 216, 219, 194, 176, 75, - 108, 2, 218, 216, 219, 194, 166, 75, 108, 2, 218, 216, 219, 194, 172, 75, - 1, 207, 56, 224, 248, 207, 50, 75, 18, 2, 207, 56, 224, 248, 236, 116, - 75, 152, 117, 207, 56, 224, 248, 232, 161, 75, 152, 117, 207, 56, 224, - 248, 224, 210, 212, 234, 75, 1, 197, 86, 211, 179, 224, 248, 202, 233, - 75, 1, 197, 86, 211, 179, 224, 248, 211, 185, 75, 18, 2, 197, 86, 211, - 179, 224, 248, 236, 116, 75, 18, 2, 197, 86, 211, 179, 224, 248, 200, 99, - 75, 2, 197, 86, 211, 179, 224, 248, 202, 10, 75, 2, 197, 86, 211, 179, - 224, 248, 202, 9, 75, 2, 197, 86, 211, 179, 224, 248, 202, 8, 75, 2, 197, - 86, 211, 179, 224, 248, 202, 7, 75, 2, 197, 86, 211, 179, 224, 248, 202, - 6, 75, 1, 237, 67, 211, 179, 224, 248, 216, 86, 75, 1, 237, 67, 211, 179, - 224, 248, 195, 175, 75, 1, 237, 67, 211, 179, 224, 248, 233, 195, 75, 18, - 2, 234, 44, 224, 248, 68, 75, 18, 2, 224, 215, 214, 164, 75, 18, 2, 224, - 215, 66, 75, 18, 2, 224, 215, 237, 54, 75, 1, 207, 25, 155, 75, 1, 207, - 25, 224, 146, 75, 1, 207, 25, 234, 123, 75, 1, 207, 25, 247, 174, 75, 1, - 207, 25, 195, 115, 75, 1, 207, 25, 215, 109, 75, 1, 207, 25, 240, 136, - 75, 1, 207, 25, 176, 75, 1, 207, 25, 213, 6, 75, 1, 207, 25, 235, 239, - 75, 1, 207, 25, 249, 145, 75, 1, 207, 25, 202, 233, 75, 1, 207, 25, 142, - 75, 108, 2, 207, 25, 219, 194, 197, 166, 75, 18, 2, 207, 25, 252, 168, - 75, 18, 2, 207, 25, 69, 75, 18, 2, 207, 25, 237, 136, 57, 75, 18, 2, 207, - 25, 48, 196, 148, 75, 2, 207, 25, 202, 9, 75, 2, 207, 25, 202, 8, 75, 2, - 207, 25, 202, 6, 75, 2, 207, 25, 202, 5, 75, 2, 207, 25, 241, 91, 202, 9, - 75, 2, 207, 25, 241, 91, 202, 8, 75, 2, 207, 25, 241, 91, 236, 233, 202, - 11, 75, 1, 209, 119, 213, 212, 235, 239, 75, 2, 209, 119, 213, 212, 202, - 6, 75, 207, 25, 17, 195, 79, 75, 207, 25, 17, 100, 75, 207, 25, 17, 102, - 75, 207, 25, 17, 134, 75, 207, 25, 17, 136, 75, 207, 25, 17, 146, 75, - 207, 25, 17, 167, 75, 207, 25, 17, 178, 75, 207, 25, 17, 171, 75, 207, - 25, 17, 182, 75, 2, 224, 139, 202, 10, 75, 2, 224, 139, 202, 8, 75, 18, - 2, 251, 186, 63, 75, 18, 2, 251, 186, 251, 200, 75, 16, 207, 25, 100, 75, - 16, 207, 25, 236, 89, 94, 6, 1, 251, 106, 94, 6, 1, 249, 93, 94, 6, 1, - 234, 93, 94, 6, 1, 239, 6, 94, 6, 1, 236, 230, 94, 6, 1, 199, 16, 94, 6, - 1, 195, 82, 94, 6, 1, 203, 114, 94, 6, 1, 226, 86, 94, 6, 1, 225, 17, 94, - 6, 1, 222, 222, 94, 6, 1, 220, 62, 94, 6, 1, 217, 211, 94, 6, 1, 214, - 119, 94, 6, 1, 213, 157, 94, 6, 1, 195, 70, 94, 6, 1, 210, 229, 94, 6, 1, - 208, 219, 94, 6, 1, 203, 101, 94, 6, 1, 200, 72, 94, 6, 1, 212, 254, 94, - 6, 1, 224, 134, 94, 6, 1, 233, 221, 94, 6, 1, 211, 144, 94, 6, 1, 206, - 211, 94, 6, 1, 245, 62, 94, 6, 1, 247, 142, 94, 6, 1, 225, 162, 94, 6, 1, - 245, 0, 94, 6, 1, 247, 0, 94, 6, 1, 196, 206, 94, 6, 1, 225, 177, 94, 6, - 1, 232, 242, 94, 6, 1, 232, 147, 94, 6, 1, 232, 58, 94, 6, 1, 197, 109, - 94, 6, 1, 232, 175, 94, 6, 1, 231, 181, 94, 6, 1, 196, 5, 94, 6, 1, 251, - 234, 94, 1, 251, 106, 94, 1, 249, 93, 94, 1, 234, 93, 94, 1, 239, 6, 94, - 1, 236, 230, 94, 1, 199, 16, 94, 1, 195, 82, 94, 1, 203, 114, 94, 1, 226, - 86, 94, 1, 225, 17, 94, 1, 222, 222, 94, 1, 220, 62, 94, 1, 217, 211, 94, - 1, 214, 119, 94, 1, 213, 157, 94, 1, 195, 70, 94, 1, 210, 229, 94, 1, - 208, 219, 94, 1, 203, 101, 94, 1, 200, 72, 94, 1, 212, 254, 94, 1, 224, - 134, 94, 1, 233, 221, 94, 1, 211, 144, 94, 1, 206, 211, 94, 1, 245, 62, - 94, 1, 247, 142, 94, 1, 225, 162, 94, 1, 245, 0, 94, 1, 247, 0, 94, 1, - 196, 206, 94, 1, 225, 177, 94, 1, 232, 242, 94, 1, 232, 147, 94, 1, 232, - 58, 94, 1, 197, 109, 94, 1, 232, 175, 94, 1, 231, 181, 94, 1, 235, 153, - 94, 1, 196, 5, 94, 1, 236, 249, 94, 1, 163, 234, 93, 94, 1, 251, 194, 94, - 213, 154, 207, 90, 73, 1, 94, 217, 211, 94, 1, 251, 234, 94, 1, 232, 173, - 55, 94, 1, 223, 73, 55, 29, 137, 224, 48, 29, 137, 205, 72, 29, 137, 216, - 208, 29, 137, 202, 97, 29, 137, 205, 61, 29, 137, 210, 54, 29, 137, 219, - 56, 29, 137, 212, 206, 29, 137, 205, 69, 29, 137, 206, 52, 29, 137, 205, - 66, 29, 137, 226, 143, 29, 137, 245, 6, 29, 137, 205, 76, 29, 137, 245, - 71, 29, 137, 224, 122, 29, 137, 202, 191, 29, 137, 212, 244, 29, 137, - 232, 55, 29, 137, 216, 204, 29, 137, 205, 70, 29, 137, 216, 198, 29, 137, - 216, 202, 29, 137, 202, 94, 29, 137, 210, 42, 29, 137, 205, 68, 29, 137, - 210, 52, 29, 137, 224, 254, 29, 137, 219, 49, 29, 137, 225, 1, 29, 137, - 212, 201, 29, 137, 212, 199, 29, 137, 212, 187, 29, 137, 212, 195, 29, - 137, 212, 193, 29, 137, 212, 190, 29, 137, 212, 192, 29, 137, 212, 189, - 29, 137, 212, 194, 29, 137, 212, 204, 29, 137, 212, 205, 29, 137, 212, - 188, 29, 137, 212, 198, 29, 137, 224, 255, 29, 137, 224, 253, 29, 137, - 206, 45, 29, 137, 206, 43, 29, 137, 206, 35, 29, 137, 206, 38, 29, 137, - 206, 44, 29, 137, 206, 40, 29, 137, 206, 39, 29, 137, 206, 37, 29, 137, - 206, 48, 29, 137, 206, 50, 29, 137, 206, 51, 29, 137, 206, 46, 29, 137, - 206, 36, 29, 137, 206, 41, 29, 137, 206, 49, 29, 137, 245, 53, 29, 137, - 245, 51, 29, 137, 247, 29, 29, 137, 247, 27, 29, 137, 213, 174, 29, 137, - 226, 138, 29, 137, 226, 129, 29, 137, 226, 137, 29, 137, 226, 134, 29, - 137, 226, 132, 29, 137, 226, 136, 29, 137, 205, 73, 29, 137, 226, 141, - 29, 137, 226, 142, 29, 137, 226, 130, 29, 137, 226, 135, 29, 137, 196, - 46, 29, 137, 245, 5, 29, 137, 245, 54, 29, 137, 245, 52, 29, 137, 247, - 30, 29, 137, 247, 28, 29, 137, 245, 69, 29, 137, 245, 70, 29, 137, 245, - 55, 29, 137, 247, 31, 29, 137, 212, 242, 29, 137, 225, 0, 29, 137, 205, - 74, 29, 137, 196, 52, 29, 137, 224, 39, 29, 137, 216, 200, 29, 137, 216, - 206, 29, 137, 216, 205, 29, 137, 202, 91, 29, 137, 235, 134, 29, 225, - 102, 235, 134, 29, 225, 102, 63, 29, 225, 102, 251, 245, 29, 225, 102, - 164, 29, 225, 102, 196, 118, 29, 225, 102, 236, 192, 29, 225, 102, 69, - 29, 225, 102, 196, 56, 29, 225, 102, 196, 69, 29, 225, 102, 72, 29, 225, - 102, 197, 166, 29, 225, 102, 197, 157, 29, 225, 102, 214, 164, 29, 225, - 102, 196, 3, 29, 225, 102, 66, 29, 225, 102, 197, 91, 29, 225, 102, 197, - 109, 29, 225, 102, 197, 70, 29, 225, 102, 195, 217, 29, 225, 102, 236, - 116, 29, 225, 102, 196, 24, 29, 225, 102, 68, 29, 225, 102, 255, 164, 29, - 225, 102, 255, 163, 29, 225, 102, 196, 132, 29, 225, 102, 196, 130, 29, - 225, 102, 236, 190, 29, 225, 102, 236, 189, 29, 225, 102, 236, 191, 29, - 225, 102, 196, 55, 29, 225, 102, 196, 54, 29, 225, 102, 215, 18, 29, 225, - 102, 215, 19, 29, 225, 102, 215, 12, 29, 225, 102, 215, 17, 29, 225, 102, - 215, 15, 29, 225, 102, 195, 247, 29, 225, 102, 195, 246, 29, 225, 102, - 195, 245, 29, 225, 102, 195, 248, 29, 225, 102, 195, 249, 29, 225, 102, - 200, 172, 29, 225, 102, 200, 171, 29, 225, 102, 200, 169, 29, 225, 102, - 200, 165, 29, 225, 102, 200, 166, 29, 225, 102, 195, 212, 29, 225, 102, - 195, 209, 29, 225, 102, 195, 210, 29, 225, 102, 195, 204, 29, 225, 102, - 195, 205, 29, 225, 102, 195, 206, 29, 225, 102, 195, 208, 29, 225, 102, - 236, 110, 29, 225, 102, 236, 112, 29, 225, 102, 196, 23, 29, 225, 102, - 230, 244, 29, 225, 102, 230, 236, 29, 225, 102, 230, 239, 29, 225, 102, - 230, 237, 29, 225, 102, 230, 241, 29, 225, 102, 230, 243, 29, 225, 102, - 251, 6, 29, 225, 102, 251, 3, 29, 225, 102, 251, 1, 29, 225, 102, 251, 2, - 29, 225, 102, 205, 77, 29, 225, 102, 255, 165, 29, 225, 102, 196, 131, - 29, 225, 102, 196, 53, 29, 225, 102, 215, 14, 29, 225, 102, 215, 13, 29, - 116, 224, 48, 29, 116, 205, 72, 29, 116, 224, 41, 29, 116, 216, 208, 29, - 116, 216, 206, 29, 116, 216, 205, 29, 116, 202, 97, 29, 116, 210, 54, 29, - 116, 210, 49, 29, 116, 210, 46, 29, 116, 210, 39, 29, 116, 210, 34, 29, - 116, 210, 29, 29, 116, 210, 40, 29, 116, 210, 52, 29, 116, 219, 56, 29, - 116, 212, 206, 29, 116, 212, 195, 29, 116, 206, 52, 29, 116, 205, 66, 29, - 116, 226, 143, 29, 116, 245, 6, 29, 116, 245, 71, 29, 116, 224, 122, 29, - 116, 202, 191, 29, 116, 212, 244, 29, 116, 232, 55, 29, 116, 224, 42, 29, - 116, 224, 40, 29, 116, 216, 204, 29, 116, 216, 198, 29, 116, 216, 200, - 29, 116, 216, 203, 29, 116, 216, 199, 29, 116, 202, 94, 29, 116, 202, 91, - 29, 116, 210, 47, 29, 116, 210, 42, 29, 116, 210, 28, 29, 116, 210, 27, - 29, 116, 205, 68, 29, 116, 210, 44, 29, 116, 210, 43, 29, 116, 210, 36, - 29, 116, 210, 38, 29, 116, 210, 51, 29, 116, 210, 31, 29, 116, 210, 41, - 29, 116, 210, 50, 29, 116, 210, 26, 29, 116, 219, 52, 29, 116, 219, 47, - 29, 116, 219, 49, 29, 116, 219, 46, 29, 116, 219, 44, 29, 116, 219, 50, - 29, 116, 219, 55, 29, 116, 219, 53, 29, 116, 225, 1, 29, 116, 212, 197, - 29, 116, 212, 198, 29, 116, 212, 203, 29, 116, 224, 255, 29, 116, 206, - 45, 29, 116, 206, 35, 29, 116, 206, 38, 29, 116, 206, 40, 29, 116, 213, - 174, 29, 116, 226, 138, 29, 116, 226, 131, 29, 116, 205, 73, 29, 116, - 226, 139, 29, 116, 196, 46, 29, 116, 196, 40, 29, 116, 196, 41, 29, 116, - 212, 242, 29, 116, 225, 0, 29, 116, 232, 53, 29, 116, 232, 51, 29, 116, - 232, 54, 29, 116, 232, 52, 29, 116, 196, 52, 29, 116, 224, 44, 29, 116, - 224, 43, 29, 116, 224, 47, 29, 116, 224, 45, 29, 116, 224, 46, 29, 116, - 205, 70, 35, 5, 142, 35, 5, 231, 75, 35, 5, 232, 71, 35, 5, 232, 246, 35, - 5, 232, 118, 35, 5, 232, 147, 35, 5, 231, 193, 35, 5, 231, 184, 35, 5, - 172, 35, 5, 221, 191, 35, 5, 222, 109, 35, 5, 223, 82, 35, 5, 222, 188, - 35, 5, 222, 197, 35, 5, 222, 7, 35, 5, 221, 159, 35, 5, 232, 80, 35, 5, - 232, 74, 35, 5, 232, 76, 35, 5, 232, 79, 35, 5, 232, 77, 35, 5, 232, 78, - 35, 5, 232, 75, 35, 5, 232, 73, 35, 5, 166, 35, 5, 218, 145, 35, 5, 219, - 78, 35, 5, 220, 119, 35, 5, 219, 188, 35, 5, 219, 207, 35, 5, 218, 251, - 35, 5, 218, 72, 35, 5, 203, 227, 35, 5, 203, 221, 35, 5, 203, 223, 35, 5, - 203, 226, 35, 5, 203, 224, 35, 5, 203, 225, 35, 5, 203, 222, 35, 5, 203, - 220, 35, 5, 169, 35, 5, 209, 140, 35, 5, 210, 72, 35, 5, 210, 244, 35, 5, - 210, 155, 35, 5, 210, 183, 35, 5, 209, 232, 35, 5, 209, 98, 35, 5, 183, - 35, 5, 204, 172, 35, 5, 206, 112, 35, 5, 209, 13, 35, 5, 208, 129, 35, 5, - 208, 147, 35, 5, 205, 200, 35, 5, 204, 67, 35, 5, 207, 50, 35, 5, 206, - 151, 35, 5, 206, 223, 35, 5, 207, 45, 35, 5, 206, 253, 35, 5, 206, 255, - 35, 5, 206, 198, 35, 5, 206, 130, 35, 5, 211, 159, 35, 5, 211, 97, 35, 5, - 211, 121, 35, 5, 211, 158, 35, 5, 211, 138, 35, 5, 211, 139, 35, 5, 211, - 109, 35, 5, 211, 108, 35, 5, 211, 50, 35, 5, 211, 46, 35, 5, 211, 49, 35, - 5, 211, 47, 35, 5, 211, 48, 35, 5, 211, 135, 35, 5, 211, 127, 35, 5, 211, - 130, 35, 5, 211, 134, 35, 5, 211, 131, 35, 5, 211, 132, 35, 5, 211, 129, - 35, 5, 211, 126, 35, 5, 211, 122, 35, 5, 211, 125, 35, 5, 211, 123, 35, - 5, 211, 124, 35, 5, 249, 145, 35, 5, 248, 21, 35, 5, 248, 184, 35, 5, - 249, 143, 35, 5, 248, 251, 35, 5, 249, 9, 35, 5, 248, 116, 35, 5, 247, - 224, 35, 5, 199, 152, 35, 5, 197, 220, 35, 5, 199, 34, 35, 5, 199, 151, - 35, 5, 199, 113, 35, 5, 199, 118, 35, 5, 198, 248, 35, 5, 197, 209, 35, - 5, 189, 35, 5, 201, 40, 35, 5, 202, 122, 35, 5, 203, 162, 35, 5, 203, 48, - 35, 5, 203, 68, 35, 5, 149, 35, 5, 200, 245, 35, 5, 247, 174, 35, 5, 241, - 41, 35, 5, 245, 11, 35, 5, 247, 173, 35, 5, 247, 49, 35, 5, 247, 57, 35, - 5, 244, 182, 35, 5, 240, 254, 35, 5, 196, 208, 35, 5, 196, 177, 35, 5, - 196, 196, 35, 5, 196, 207, 35, 5, 196, 201, 35, 5, 196, 202, 35, 5, 196, - 185, 35, 5, 196, 184, 35, 5, 196, 170, 35, 5, 196, 166, 35, 5, 196, 169, - 35, 5, 196, 167, 35, 5, 196, 168, 35, 5, 176, 35, 5, 215, 186, 35, 5, - 216, 223, 35, 5, 217, 244, 35, 5, 217, 107, 35, 5, 217, 118, 35, 5, 216, - 50, 35, 5, 215, 118, 35, 5, 215, 109, 35, 5, 215, 66, 35, 5, 215, 89, 35, - 5, 215, 108, 35, 5, 215, 97, 35, 5, 215, 98, 35, 5, 215, 73, 35, 5, 215, - 56, 35, 5, 233, 152, 63, 35, 5, 233, 152, 66, 35, 5, 233, 152, 68, 35, 5, - 233, 152, 252, 168, 35, 5, 233, 152, 237, 54, 35, 5, 233, 152, 69, 35, 5, - 233, 152, 72, 35, 5, 233, 152, 197, 166, 35, 5, 155, 35, 5, 223, 187, 35, - 5, 224, 101, 35, 5, 225, 55, 35, 5, 224, 200, 35, 5, 224, 209, 35, 5, - 224, 11, 35, 5, 224, 6, 35, 5, 223, 136, 35, 5, 223, 129, 35, 5, 223, - 135, 35, 5, 223, 130, 35, 5, 223, 131, 35, 5, 223, 122, 35, 5, 223, 116, - 35, 5, 223, 118, 35, 5, 223, 121, 35, 5, 223, 119, 35, 5, 223, 120, 35, - 5, 223, 117, 35, 5, 223, 115, 35, 5, 223, 111, 35, 5, 223, 114, 35, 5, - 223, 112, 35, 5, 223, 113, 35, 5, 197, 166, 35, 5, 196, 243, 35, 5, 197, - 70, 35, 5, 197, 160, 35, 5, 197, 98, 35, 5, 197, 109, 35, 5, 197, 34, 35, - 5, 197, 26, 35, 5, 212, 253, 63, 35, 5, 212, 253, 66, 35, 5, 212, 253, - 68, 35, 5, 212, 253, 252, 168, 35, 5, 212, 253, 237, 54, 35, 5, 212, 253, - 69, 35, 5, 212, 253, 72, 35, 5, 195, 115, 35, 5, 194, 255, 35, 5, 195, - 33, 35, 5, 195, 113, 35, 5, 195, 85, 35, 5, 195, 88, 35, 5, 195, 11, 35, - 5, 194, 242, 35, 5, 195, 74, 35, 5, 195, 51, 35, 5, 195, 60, 35, 5, 195, - 73, 35, 5, 195, 64, 35, 5, 195, 65, 35, 5, 195, 57, 35, 5, 195, 42, 35, - 5, 164, 35, 5, 195, 217, 35, 5, 196, 24, 35, 5, 196, 129, 35, 5, 196, 66, - 35, 5, 196, 69, 35, 5, 196, 3, 35, 5, 195, 243, 35, 5, 240, 136, 35, 5, - 237, 201, 35, 5, 239, 152, 35, 5, 240, 135, 35, 5, 239, 237, 35, 5, 239, - 252, 35, 5, 239, 28, 35, 5, 237, 167, 35, 5, 240, 41, 35, 5, 240, 6, 35, - 5, 240, 18, 35, 5, 240, 40, 35, 5, 240, 28, 35, 5, 240, 29, 35, 5, 240, - 11, 35, 5, 239, 253, 35, 5, 225, 214, 35, 5, 225, 110, 35, 5, 225, 172, - 35, 5, 225, 213, 35, 5, 225, 191, 35, 5, 225, 193, 35, 5, 225, 129, 35, - 5, 225, 88, 35, 5, 234, 123, 35, 5, 233, 76, 35, 5, 233, 192, 35, 5, 234, - 120, 35, 5, 234, 40, 35, 5, 234, 48, 35, 5, 233, 144, 35, 5, 233, 143, - 35, 5, 233, 34, 35, 5, 233, 30, 35, 5, 233, 33, 35, 5, 233, 31, 35, 5, - 233, 32, 35, 5, 234, 10, 35, 5, 233, 246, 35, 5, 234, 0, 35, 5, 234, 9, - 35, 5, 234, 4, 35, 5, 234, 5, 35, 5, 233, 250, 35, 5, 233, 235, 35, 5, - 202, 233, 35, 5, 202, 142, 35, 5, 202, 195, 35, 5, 202, 232, 35, 5, 202, - 215, 35, 5, 202, 217, 35, 5, 202, 169, 35, 5, 202, 133, 35, 5, 247, 16, - 35, 5, 245, 30, 35, 5, 245, 75, 35, 5, 247, 15, 35, 5, 245, 99, 35, 5, - 245, 103, 35, 5, 245, 49, 35, 5, 245, 19, 35, 5, 213, 6, 35, 5, 212, 226, - 35, 5, 212, 246, 35, 5, 213, 5, 35, 5, 212, 248, 35, 5, 212, 249, 35, 5, - 212, 234, 35, 5, 212, 222, 35, 5, 201, 113, 35, 5, 201, 86, 35, 5, 201, - 92, 35, 5, 201, 112, 35, 5, 201, 106, 35, 5, 201, 107, 35, 5, 201, 90, - 35, 5, 201, 84, 35, 5, 200, 186, 35, 5, 200, 178, 35, 5, 200, 182, 35, 5, - 200, 185, 35, 5, 200, 183, 35, 5, 200, 184, 35, 5, 200, 180, 35, 5, 200, - 179, 35, 5, 235, 239, 35, 5, 234, 223, 35, 5, 235, 153, 35, 5, 235, 238, - 35, 5, 235, 182, 35, 5, 235, 189, 35, 5, 235, 51, 35, 5, 234, 201, 35, 5, - 161, 35, 5, 211, 227, 35, 5, 212, 220, 35, 5, 213, 243, 35, 5, 213, 79, - 35, 5, 213, 92, 35, 5, 212, 117, 35, 5, 211, 185, 35, 5, 209, 88, 35, 5, - 218, 61, 35, 5, 234, 195, 35, 38, 234, 36, 26, 18, 222, 158, 78, 35, 38, - 18, 222, 158, 78, 35, 38, 234, 36, 78, 35, 208, 133, 78, 35, 197, 8, 35, - 234, 217, 204, 226, 35, 244, 159, 35, 207, 105, 35, 244, 168, 35, 212, - 32, 244, 168, 35, 211, 79, 78, 35, 213, 154, 207, 90, 35, 17, 100, 35, - 17, 102, 35, 17, 134, 35, 17, 136, 35, 17, 146, 35, 17, 167, 35, 17, 178, - 35, 17, 171, 35, 17, 182, 35, 31, 203, 23, 35, 31, 200, 234, 35, 31, 202, - 177, 35, 31, 235, 14, 35, 31, 235, 145, 35, 31, 206, 13, 35, 31, 207, 65, - 35, 31, 237, 20, 35, 31, 216, 174, 35, 31, 231, 57, 35, 31, 203, 24, 170, - 35, 5, 208, 138, 218, 72, 35, 5, 218, 68, 35, 5, 218, 69, 35, 5, 218, 70, - 35, 5, 208, 138, 247, 224, 35, 5, 247, 221, 35, 5, 247, 222, 35, 5, 247, - 223, 35, 5, 208, 138, 234, 201, 35, 5, 234, 197, 35, 5, 234, 198, 35, 5, - 234, 199, 35, 5, 208, 138, 211, 185, 35, 5, 211, 181, 35, 5, 211, 182, - 35, 5, 211, 183, 35, 202, 12, 117, 196, 6, 35, 202, 12, 117, 239, 197, - 35, 202, 12, 117, 210, 8, 35, 202, 12, 117, 206, 182, 210, 8, 35, 202, - 12, 117, 239, 126, 35, 202, 12, 117, 224, 181, 35, 202, 12, 117, 245, 57, - 35, 202, 12, 117, 232, 60, 35, 202, 12, 117, 239, 196, 35, 202, 12, 117, - 223, 152, 95, 1, 63, 95, 1, 69, 95, 1, 68, 95, 1, 72, 95, 1, 66, 95, 1, - 199, 230, 95, 1, 234, 123, 95, 1, 155, 95, 1, 234, 48, 95, 1, 233, 192, - 95, 1, 233, 144, 95, 1, 233, 76, 95, 1, 233, 36, 95, 1, 142, 95, 1, 232, - 147, 95, 1, 232, 71, 95, 1, 231, 193, 95, 1, 231, 75, 95, 1, 231, 44, 95, - 1, 172, 95, 1, 222, 197, 95, 1, 222, 109, 95, 1, 222, 7, 95, 1, 221, 191, - 95, 1, 221, 160, 95, 1, 166, 95, 1, 219, 207, 95, 1, 219, 78, 95, 1, 218, - 251, 95, 1, 218, 145, 95, 1, 176, 95, 1, 231, 217, 95, 1, 217, 231, 95, - 1, 217, 118, 95, 1, 216, 223, 95, 1, 216, 50, 95, 1, 215, 186, 95, 1, - 215, 120, 95, 1, 211, 96, 95, 1, 211, 82, 95, 1, 211, 75, 95, 1, 211, 65, - 95, 1, 211, 54, 95, 1, 211, 52, 95, 1, 183, 95, 1, 209, 80, 95, 1, 208, - 147, 95, 1, 206, 112, 95, 1, 205, 200, 95, 1, 204, 172, 95, 1, 204, 72, - 95, 1, 240, 136, 95, 1, 189, 95, 1, 239, 252, 95, 1, 203, 68, 95, 1, 239, - 152, 95, 1, 202, 122, 95, 1, 239, 28, 95, 1, 237, 201, 95, 1, 237, 170, - 95, 1, 239, 40, 95, 1, 202, 47, 95, 1, 202, 46, 95, 1, 202, 35, 95, 1, - 202, 34, 95, 1, 202, 33, 95, 1, 202, 32, 95, 1, 201, 113, 95, 1, 201, - 107, 95, 1, 201, 92, 95, 1, 201, 90, 95, 1, 201, 86, 95, 1, 201, 85, 95, - 1, 197, 166, 95, 1, 197, 109, 95, 1, 197, 70, 95, 1, 197, 34, 95, 1, 196, - 243, 95, 1, 196, 230, 95, 1, 164, 95, 1, 196, 69, 95, 1, 196, 24, 95, 1, - 196, 3, 95, 1, 195, 217, 95, 1, 195, 176, 95, 1, 218, 79, 95, 4, 1, 196, - 69, 95, 4, 1, 196, 24, 95, 4, 1, 196, 3, 95, 4, 1, 195, 217, 95, 4, 1, - 195, 176, 95, 4, 1, 218, 79, 21, 22, 231, 7, 21, 22, 69, 21, 22, 252, - 132, 21, 22, 68, 21, 22, 226, 120, 21, 22, 72, 21, 22, 214, 102, 21, 22, - 196, 147, 214, 102, 21, 22, 92, 237, 54, 21, 22, 92, 68, 21, 22, 63, 21, - 22, 252, 168, 21, 22, 197, 109, 21, 22, 197, 87, 197, 109, 21, 22, 197, - 70, 21, 22, 197, 87, 197, 70, 21, 22, 197, 54, 21, 22, 197, 87, 197, 54, - 21, 22, 197, 34, 21, 22, 197, 87, 197, 34, 21, 22, 197, 15, 21, 22, 197, - 87, 197, 15, 21, 22, 217, 205, 197, 15, 21, 22, 197, 166, 21, 22, 197, - 87, 197, 166, 21, 22, 197, 160, 21, 22, 197, 87, 197, 160, 21, 22, 217, - 205, 197, 160, 21, 22, 251, 200, 21, 22, 196, 147, 197, 199, 21, 22, 233, - 152, 204, 226, 21, 22, 48, 186, 21, 22, 48, 233, 100, 21, 22, 48, 248, - 85, 157, 210, 2, 21, 22, 48, 201, 243, 157, 210, 2, 21, 22, 48, 53, 157, - 210, 2, 21, 22, 48, 210, 2, 21, 22, 48, 52, 186, 21, 22, 48, 52, 206, - 182, 83, 204, 183, 21, 22, 48, 112, 238, 253, 21, 22, 48, 206, 182, 231, - 155, 106, 21, 22, 48, 212, 125, 21, 22, 48, 135, 203, 147, 21, 22, 236, - 230, 21, 22, 226, 86, 21, 22, 214, 119, 21, 22, 251, 106, 21, 22, 213, - 92, 21, 22, 213, 241, 21, 22, 212, 220, 21, 22, 212, 182, 21, 22, 212, - 117, 21, 22, 212, 91, 21, 22, 196, 147, 212, 91, 21, 22, 92, 232, 118, - 21, 22, 92, 232, 71, 21, 22, 161, 21, 22, 213, 243, 21, 22, 211, 183, 21, - 22, 197, 87, 211, 183, 21, 22, 211, 181, 21, 22, 197, 87, 211, 181, 21, - 22, 211, 180, 21, 22, 197, 87, 211, 180, 21, 22, 211, 178, 21, 22, 197, - 87, 211, 178, 21, 22, 211, 177, 21, 22, 197, 87, 211, 177, 21, 22, 211, - 185, 21, 22, 197, 87, 211, 185, 21, 22, 211, 184, 21, 22, 197, 87, 211, - 184, 21, 22, 196, 147, 211, 184, 21, 22, 214, 3, 21, 22, 197, 87, 214, 3, - 21, 22, 92, 233, 15, 21, 22, 203, 68, 21, 22, 203, 160, 21, 22, 202, 122, - 21, 22, 202, 99, 21, 22, 149, 21, 22, 201, 247, 21, 22, 196, 147, 201, - 247, 21, 22, 92, 239, 237, 21, 22, 92, 239, 152, 21, 22, 189, 21, 22, - 203, 162, 21, 22, 200, 243, 21, 22, 197, 87, 200, 243, 21, 22, 200, 221, - 21, 22, 197, 87, 200, 221, 21, 22, 200, 220, 21, 22, 197, 87, 200, 220, - 21, 22, 102, 21, 22, 197, 87, 102, 21, 22, 200, 211, 21, 22, 197, 87, - 200, 211, 21, 22, 200, 245, 21, 22, 197, 87, 200, 245, 21, 22, 200, 244, - 21, 22, 197, 87, 200, 244, 21, 22, 217, 205, 200, 244, 21, 22, 203, 216, - 21, 22, 201, 73, 21, 22, 201, 57, 21, 22, 201, 55, 21, 22, 201, 78, 21, - 22, 224, 209, 21, 22, 225, 49, 21, 22, 224, 101, 21, 22, 224, 80, 21, 22, - 224, 11, 21, 22, 223, 242, 21, 22, 196, 147, 223, 242, 21, 22, 155, 21, - 22, 225, 55, 21, 22, 223, 131, 21, 22, 197, 87, 223, 131, 21, 22, 223, - 129, 21, 22, 197, 87, 223, 129, 21, 22, 223, 128, 21, 22, 197, 87, 223, - 128, 21, 22, 223, 126, 21, 22, 197, 87, 223, 126, 21, 22, 223, 125, 21, - 22, 197, 87, 223, 125, 21, 22, 223, 136, 21, 22, 197, 87, 223, 136, 21, - 22, 223, 135, 21, 22, 197, 87, 223, 135, 21, 22, 217, 205, 223, 135, 21, - 22, 225, 80, 21, 22, 223, 137, 21, 22, 205, 158, 224, 193, 21, 22, 205, - 158, 224, 81, 21, 22, 205, 158, 224, 1, 21, 22, 205, 158, 225, 33, 21, - 22, 247, 57, 21, 22, 247, 172, 21, 22, 245, 11, 21, 22, 245, 1, 21, 22, - 244, 182, 21, 22, 241, 117, 21, 22, 196, 147, 241, 117, 21, 22, 247, 174, - 21, 22, 247, 173, 21, 22, 240, 252, 21, 22, 197, 87, 240, 252, 21, 22, - 240, 250, 21, 22, 197, 87, 240, 250, 21, 22, 240, 249, 21, 22, 197, 87, - 240, 249, 21, 22, 240, 248, 21, 22, 197, 87, 240, 248, 21, 22, 240, 247, - 21, 22, 197, 87, 240, 247, 21, 22, 240, 254, 21, 22, 197, 87, 240, 254, - 21, 22, 240, 253, 21, 22, 197, 87, 240, 253, 21, 22, 217, 205, 240, 253, - 21, 22, 247, 207, 21, 22, 208, 178, 202, 235, 21, 22, 219, 207, 21, 22, - 220, 118, 21, 22, 219, 78, 21, 22, 219, 40, 21, 22, 218, 251, 21, 22, - 218, 195, 21, 22, 196, 147, 218, 195, 21, 22, 166, 21, 22, 220, 119, 21, - 22, 218, 70, 21, 22, 197, 87, 218, 70, 21, 22, 218, 68, 21, 22, 197, 87, - 218, 68, 21, 22, 218, 67, 21, 22, 197, 87, 218, 67, 21, 22, 218, 66, 21, - 22, 197, 87, 218, 66, 21, 22, 218, 65, 21, 22, 197, 87, 218, 65, 21, 22, - 218, 72, 21, 22, 197, 87, 218, 72, 21, 22, 218, 71, 21, 22, 197, 87, 218, - 71, 21, 22, 217, 205, 218, 71, 21, 22, 221, 136, 21, 22, 197, 87, 221, - 136, 21, 22, 219, 82, 21, 22, 250, 166, 221, 136, 21, 22, 208, 178, 221, - 136, 21, 22, 217, 118, 21, 22, 217, 243, 21, 22, 216, 223, 21, 22, 216, - 190, 21, 22, 216, 50, 21, 22, 216, 33, 21, 22, 196, 147, 216, 33, 21, 22, - 176, 21, 22, 217, 244, 21, 22, 215, 116, 21, 22, 197, 87, 215, 116, 21, - 22, 215, 118, 21, 22, 197, 87, 215, 118, 21, 22, 215, 117, 21, 22, 197, - 87, 215, 117, 21, 22, 217, 205, 215, 117, 21, 22, 218, 55, 21, 22, 92, - 217, 73, 21, 22, 216, 228, 21, 22, 222, 197, 21, 22, 223, 81, 21, 22, - 222, 109, 21, 22, 222, 91, 21, 22, 222, 7, 21, 22, 221, 229, 21, 22, 196, - 147, 221, 229, 21, 22, 172, 21, 22, 223, 82, 21, 22, 221, 157, 21, 22, - 197, 87, 221, 157, 21, 22, 221, 156, 21, 22, 197, 87, 221, 156, 21, 22, - 221, 155, 21, 22, 197, 87, 221, 155, 21, 22, 221, 154, 21, 22, 197, 87, - 221, 154, 21, 22, 221, 153, 21, 22, 197, 87, 221, 153, 21, 22, 221, 159, - 21, 22, 197, 87, 221, 159, 21, 22, 221, 158, 21, 22, 197, 87, 221, 158, - 21, 22, 159, 21, 22, 197, 87, 159, 21, 22, 219, 194, 159, 21, 22, 208, - 147, 21, 22, 209, 11, 21, 22, 206, 112, 21, 22, 206, 84, 21, 22, 205, - 200, 21, 22, 205, 171, 21, 22, 196, 147, 205, 171, 21, 22, 183, 21, 22, - 209, 13, 21, 22, 204, 62, 21, 22, 197, 87, 204, 62, 21, 22, 204, 56, 21, - 22, 197, 87, 204, 56, 21, 22, 204, 55, 21, 22, 197, 87, 204, 55, 21, 22, - 204, 50, 21, 22, 197, 87, 204, 50, 21, 22, 204, 49, 21, 22, 197, 87, 204, - 49, 21, 22, 204, 67, 21, 22, 197, 87, 204, 67, 21, 22, 204, 66, 21, 22, - 197, 87, 204, 66, 21, 22, 217, 205, 204, 66, 21, 22, 209, 80, 21, 22, - 250, 166, 209, 80, 21, 22, 204, 68, 21, 22, 248, 133, 209, 80, 21, 22, - 218, 188, 206, 7, 21, 22, 217, 205, 205, 252, 21, 22, 217, 205, 209, 78, - 21, 22, 217, 205, 205, 96, 21, 22, 217, 205, 204, 175, 21, 22, 217, 205, - 205, 251, 21, 22, 217, 205, 208, 150, 21, 22, 206, 255, 21, 22, 206, 223, - 21, 22, 206, 218, 21, 22, 206, 198, 21, 22, 206, 190, 21, 22, 207, 50, - 21, 22, 207, 45, 21, 22, 206, 127, 21, 22, 197, 87, 206, 127, 21, 22, - 206, 126, 21, 22, 197, 87, 206, 126, 21, 22, 206, 125, 21, 22, 197, 87, - 206, 125, 21, 22, 206, 124, 21, 22, 197, 87, 206, 124, 21, 22, 206, 123, - 21, 22, 197, 87, 206, 123, 21, 22, 206, 130, 21, 22, 197, 87, 206, 130, - 21, 22, 206, 129, 21, 22, 197, 87, 206, 129, 21, 22, 207, 52, 21, 22, - 196, 69, 21, 22, 196, 127, 21, 22, 196, 24, 21, 22, 196, 14, 21, 22, 196, - 3, 21, 22, 195, 237, 21, 22, 196, 147, 195, 237, 21, 22, 164, 21, 22, - 196, 129, 21, 22, 195, 173, 21, 22, 197, 87, 195, 173, 21, 22, 195, 172, - 21, 22, 197, 87, 195, 172, 21, 22, 195, 171, 21, 22, 197, 87, 195, 171, - 21, 22, 195, 170, 21, 22, 197, 87, 195, 170, 21, 22, 195, 169, 21, 22, - 197, 87, 195, 169, 21, 22, 195, 175, 21, 22, 197, 87, 195, 175, 21, 22, - 195, 174, 21, 22, 197, 87, 195, 174, 21, 22, 217, 205, 195, 174, 21, 22, - 196, 148, 21, 22, 248, 182, 196, 148, 21, 22, 197, 87, 196, 148, 21, 22, - 208, 178, 196, 24, 21, 22, 210, 183, 21, 22, 211, 31, 210, 183, 21, 22, - 197, 87, 222, 197, 21, 22, 210, 243, 21, 22, 210, 72, 21, 22, 210, 9, 21, - 22, 209, 232, 21, 22, 209, 206, 21, 22, 197, 87, 222, 7, 21, 22, 169, 21, - 22, 210, 244, 21, 22, 197, 87, 172, 21, 22, 209, 97, 21, 22, 197, 87, - 209, 97, 21, 22, 144, 21, 22, 197, 87, 144, 21, 22, 219, 194, 144, 21, - 22, 235, 189, 21, 22, 235, 236, 21, 22, 235, 153, 21, 22, 235, 139, 21, - 22, 235, 51, 21, 22, 235, 40, 21, 22, 235, 239, 21, 22, 235, 238, 21, 22, - 234, 200, 21, 22, 197, 87, 234, 200, 21, 22, 236, 49, 21, 22, 202, 217, - 21, 22, 218, 53, 202, 217, 21, 22, 202, 195, 21, 22, 218, 53, 202, 195, - 21, 22, 202, 189, 21, 22, 218, 53, 202, 189, 21, 22, 202, 169, 21, 22, - 202, 164, 21, 22, 202, 233, 21, 22, 202, 232, 21, 22, 202, 132, 21, 22, - 197, 87, 202, 132, 21, 22, 202, 235, 21, 22, 201, 64, 21, 22, 201, 62, - 21, 22, 201, 61, 21, 22, 201, 66, 21, 22, 201, 67, 21, 22, 200, 204, 21, - 22, 200, 203, 21, 22, 200, 202, 21, 22, 200, 206, 21, 22, 215, 137, 232, - 147, 21, 22, 215, 137, 232, 71, 21, 22, 215, 137, 232, 43, 21, 22, 215, - 137, 231, 193, 21, 22, 215, 137, 231, 166, 21, 22, 215, 137, 142, 21, 22, - 215, 137, 232, 246, 21, 22, 215, 137, 233, 15, 21, 22, 215, 136, 233, 15, - 21, 22, 232, 27, 21, 22, 211, 155, 21, 22, 211, 121, 21, 22, 211, 115, - 21, 22, 211, 109, 21, 22, 211, 104, 21, 22, 211, 159, 21, 22, 211, 158, - 21, 22, 211, 167, 21, 22, 202, 43, 21, 22, 202, 41, 21, 22, 202, 40, 21, - 22, 202, 44, 21, 22, 197, 87, 210, 183, 21, 22, 197, 87, 210, 72, 21, 22, - 197, 87, 209, 232, 21, 22, 197, 87, 169, 21, 22, 217, 69, 21, 22, 217, - 19, 21, 22, 217, 15, 21, 22, 216, 252, 21, 22, 216, 247, 21, 22, 217, 71, - 21, 22, 217, 70, 21, 22, 217, 73, 21, 22, 216, 79, 21, 22, 208, 178, 206, - 255, 21, 22, 208, 178, 206, 223, 21, 22, 208, 178, 206, 198, 21, 22, 208, - 178, 207, 50, 21, 22, 197, 13, 202, 217, 21, 22, 197, 13, 202, 195, 21, - 22, 197, 13, 202, 169, 21, 22, 197, 13, 202, 233, 21, 22, 197, 13, 202, - 235, 21, 22, 222, 116, 21, 22, 222, 115, 21, 22, 222, 114, 21, 22, 222, - 113, 21, 22, 222, 122, 21, 22, 222, 121, 21, 22, 222, 123, 21, 22, 202, - 234, 202, 217, 21, 22, 202, 234, 202, 195, 21, 22, 202, 234, 202, 189, - 21, 22, 202, 234, 202, 169, 21, 22, 202, 234, 202, 164, 21, 22, 202, 234, - 202, 233, 21, 22, 202, 234, 202, 232, 21, 22, 202, 234, 202, 235, 21, 22, - 251, 184, 250, 112, 21, 22, 248, 133, 69, 21, 22, 248, 133, 68, 21, 22, - 248, 133, 72, 21, 22, 248, 133, 63, 21, 22, 248, 133, 197, 109, 21, 22, - 248, 133, 197, 70, 21, 22, 248, 133, 197, 34, 21, 22, 248, 133, 197, 166, - 21, 22, 248, 133, 217, 118, 21, 22, 248, 133, 216, 223, 21, 22, 248, 133, - 216, 50, 21, 22, 248, 133, 176, 21, 22, 248, 133, 224, 209, 21, 22, 248, - 133, 224, 101, 21, 22, 248, 133, 224, 11, 21, 22, 248, 133, 155, 21, 22, - 208, 178, 232, 147, 21, 22, 208, 178, 232, 71, 21, 22, 208, 178, 231, - 193, 21, 22, 208, 178, 142, 21, 22, 92, 233, 198, 21, 22, 92, 233, 202, - 21, 22, 92, 233, 216, 21, 22, 92, 233, 215, 21, 22, 92, 233, 204, 21, 22, - 92, 233, 230, 21, 22, 92, 209, 140, 21, 22, 92, 209, 232, 21, 22, 92, - 210, 183, 21, 22, 92, 210, 155, 21, 22, 92, 210, 72, 21, 22, 92, 169, 21, - 22, 92, 196, 243, 21, 22, 92, 197, 34, 21, 22, 92, 197, 109, 21, 22, 92, - 197, 98, 21, 22, 92, 197, 70, 21, 22, 92, 197, 166, 21, 22, 92, 231, 36, - 21, 22, 92, 231, 37, 21, 22, 92, 231, 40, 21, 22, 92, 231, 39, 21, 22, - 92, 231, 38, 21, 22, 92, 231, 43, 21, 22, 92, 202, 142, 21, 22, 92, 202, - 169, 21, 22, 92, 202, 217, 21, 22, 92, 202, 215, 21, 22, 92, 202, 195, - 21, 22, 92, 202, 233, 21, 22, 92, 201, 45, 21, 22, 92, 201, 55, 21, 22, - 92, 201, 73, 21, 22, 92, 201, 72, 21, 22, 92, 201, 57, 21, 22, 92, 201, - 78, 21, 22, 92, 211, 227, 21, 22, 92, 212, 117, 21, 22, 92, 213, 92, 21, - 22, 92, 213, 79, 21, 22, 92, 212, 220, 21, 22, 92, 161, 21, 22, 92, 214, - 3, 21, 22, 92, 233, 76, 21, 22, 92, 233, 144, 21, 22, 92, 234, 48, 21, - 22, 92, 234, 40, 21, 22, 92, 233, 192, 21, 22, 92, 234, 123, 21, 22, 92, - 224, 110, 21, 22, 92, 224, 117, 21, 22, 92, 224, 131, 21, 22, 92, 224, - 130, 21, 22, 92, 224, 124, 21, 22, 92, 224, 146, 21, 22, 92, 224, 31, 21, - 22, 92, 224, 32, 21, 22, 92, 224, 35, 21, 22, 92, 224, 34, 21, 22, 92, - 224, 33, 21, 22, 92, 224, 36, 21, 22, 92, 224, 37, 21, 22, 92, 215, 186, - 21, 22, 92, 216, 50, 21, 22, 92, 217, 118, 21, 22, 92, 217, 107, 21, 22, - 92, 216, 223, 21, 22, 92, 176, 21, 22, 92, 218, 145, 21, 22, 92, 218, - 251, 21, 22, 92, 219, 207, 21, 22, 92, 219, 188, 21, 22, 92, 219, 78, 21, - 22, 92, 166, 21, 22, 92, 195, 217, 21, 22, 92, 196, 3, 21, 22, 92, 196, - 69, 21, 22, 92, 196, 66, 21, 22, 92, 196, 24, 21, 22, 92, 164, 21, 22, - 92, 225, 110, 21, 22, 208, 178, 225, 110, 21, 22, 92, 225, 129, 21, 22, - 92, 225, 193, 21, 22, 92, 225, 191, 21, 22, 92, 225, 172, 21, 22, 208, - 178, 225, 172, 21, 22, 92, 225, 214, 21, 22, 92, 225, 143, 21, 22, 92, - 225, 147, 21, 22, 92, 225, 157, 21, 22, 92, 225, 156, 21, 22, 92, 225, - 155, 21, 22, 92, 225, 158, 21, 22, 92, 221, 191, 21, 22, 92, 222, 7, 21, - 22, 92, 222, 197, 21, 22, 92, 222, 188, 21, 22, 92, 222, 109, 21, 22, 92, - 172, 21, 22, 92, 239, 33, 21, 22, 92, 239, 34, 21, 22, 92, 239, 39, 21, - 22, 92, 239, 38, 21, 22, 92, 239, 35, 21, 22, 92, 239, 40, 21, 22, 92, - 222, 112, 21, 22, 92, 222, 114, 21, 22, 92, 222, 118, 21, 22, 92, 222, - 117, 21, 22, 92, 222, 116, 21, 22, 92, 222, 122, 21, 22, 92, 202, 38, 21, - 22, 92, 202, 40, 21, 22, 92, 202, 43, 21, 22, 92, 202, 42, 21, 22, 92, - 202, 41, 21, 22, 92, 202, 44, 21, 22, 92, 202, 33, 21, 22, 92, 202, 34, - 21, 22, 92, 202, 46, 21, 22, 92, 202, 45, 21, 22, 92, 202, 35, 21, 22, - 92, 202, 47, 21, 22, 92, 194, 255, 21, 22, 92, 195, 11, 21, 22, 92, 195, - 88, 21, 22, 92, 195, 85, 21, 22, 92, 195, 33, 21, 22, 92, 195, 115, 21, - 22, 92, 195, 158, 21, 22, 92, 84, 195, 158, 21, 22, 92, 237, 143, 21, 22, - 92, 237, 144, 21, 22, 92, 237, 153, 21, 22, 92, 237, 152, 21, 22, 92, - 237, 147, 21, 22, 92, 237, 156, 21, 22, 92, 204, 172, 21, 22, 92, 205, - 200, 21, 22, 92, 208, 147, 21, 22, 92, 208, 129, 21, 22, 92, 206, 112, - 21, 22, 92, 183, 21, 22, 92, 206, 151, 21, 22, 92, 206, 198, 21, 22, 92, - 206, 255, 21, 22, 92, 206, 253, 21, 22, 92, 206, 223, 21, 22, 92, 207, - 50, 21, 22, 92, 207, 52, 21, 22, 92, 201, 86, 21, 22, 92, 201, 90, 21, - 22, 92, 201, 107, 21, 22, 92, 201, 106, 21, 22, 92, 201, 92, 21, 22, 92, - 201, 113, 21, 22, 92, 245, 30, 21, 22, 92, 245, 49, 21, 22, 92, 245, 103, - 21, 22, 92, 245, 99, 21, 22, 92, 245, 75, 21, 22, 92, 247, 16, 21, 22, - 92, 201, 48, 21, 22, 92, 201, 49, 21, 22, 92, 201, 52, 21, 22, 92, 201, - 51, 21, 22, 92, 201, 50, 21, 22, 92, 201, 53, 21, 22, 245, 76, 55, 21, - 22, 234, 217, 204, 226, 21, 22, 211, 151, 21, 22, 217, 67, 21, 22, 216, - 76, 21, 22, 216, 75, 21, 22, 216, 74, 21, 22, 216, 73, 21, 22, 216, 78, - 21, 22, 216, 77, 21, 22, 197, 13, 202, 130, 21, 22, 197, 13, 202, 129, - 21, 22, 197, 13, 202, 128, 21, 22, 197, 13, 202, 127, 21, 22, 197, 13, - 202, 126, 21, 22, 197, 13, 202, 133, 21, 22, 197, 13, 202, 132, 21, 22, - 197, 13, 48, 202, 235, 21, 22, 248, 133, 197, 199, 214, 153, 205, 149, - 78, 214, 153, 1, 248, 233, 214, 153, 1, 221, 177, 214, 153, 1, 235, 186, - 214, 153, 1, 208, 251, 214, 153, 1, 216, 172, 214, 153, 1, 200, 111, 214, - 153, 1, 240, 109, 214, 153, 1, 202, 71, 214, 153, 1, 244, 171, 214, 153, - 1, 247, 44, 214, 153, 1, 218, 128, 214, 153, 1, 233, 123, 214, 153, 1, - 217, 57, 214, 153, 1, 204, 219, 214, 153, 1, 209, 127, 214, 153, 1, 251, - 196, 214, 153, 1, 214, 106, 214, 153, 1, 200, 21, 214, 153, 1, 237, 80, - 214, 153, 1, 226, 11, 214, 153, 1, 237, 81, 214, 153, 1, 214, 72, 214, - 153, 1, 200, 88, 214, 153, 1, 226, 126, 214, 153, 1, 237, 78, 214, 153, - 1, 213, 69, 214, 153, 235, 185, 78, 214, 153, 210, 89, 235, 185, 78, 209, - 116, 1, 235, 175, 235, 166, 235, 190, 236, 49, 209, 116, 1, 199, 230, - 209, 116, 1, 200, 6, 200, 22, 66, 209, 116, 1, 195, 220, 209, 116, 1, - 196, 148, 209, 116, 1, 197, 199, 209, 116, 1, 202, 135, 202, 134, 202, - 162, 209, 116, 1, 236, 121, 209, 116, 1, 251, 70, 63, 209, 116, 1, 214, - 54, 72, 209, 116, 1, 252, 26, 63, 209, 116, 1, 251, 229, 209, 116, 1, - 221, 236, 72, 209, 116, 1, 206, 175, 72, 209, 116, 1, 72, 209, 116, 1, - 214, 164, 209, 116, 1, 214, 119, 209, 116, 1, 210, 222, 210, 235, 210, - 140, 144, 209, 116, 1, 224, 225, 209, 116, 1, 247, 40, 209, 116, 1, 224, - 226, 225, 80, 209, 116, 1, 234, 190, 209, 116, 1, 236, 215, 209, 116, 1, - 234, 43, 233, 21, 234, 190, 209, 116, 1, 234, 83, 209, 116, 1, 196, 235, - 196, 226, 197, 199, 209, 116, 1, 232, 237, 233, 15, 209, 116, 1, 232, - 241, 233, 15, 209, 116, 1, 221, 238, 233, 15, 209, 116, 1, 206, 178, 233, - 15, 209, 116, 1, 217, 200, 215, 99, 217, 201, 218, 55, 209, 116, 1, 206, - 176, 218, 55, 209, 116, 1, 237, 247, 209, 116, 1, 225, 245, 225, 249, - 225, 236, 68, 209, 116, 1, 69, 209, 116, 1, 225, 183, 225, 217, 209, 116, - 1, 234, 24, 209, 116, 1, 221, 239, 251, 245, 209, 116, 1, 206, 180, 63, - 209, 116, 1, 225, 228, 236, 188, 209, 116, 1, 213, 25, 213, 50, 214, 3, - 209, 116, 1, 251, 157, 236, 186, 209, 116, 1, 205, 155, 209, 80, 209, - 116, 1, 206, 88, 221, 235, 209, 80, 209, 116, 1, 206, 174, 209, 80, 209, - 116, 1, 247, 207, 209, 116, 1, 195, 158, 209, 116, 1, 202, 52, 202, 64, - 200, 188, 203, 216, 209, 116, 1, 206, 173, 203, 216, 209, 116, 1, 240, - 231, 209, 116, 1, 248, 211, 248, 214, 248, 139, 250, 112, 209, 116, 1, - 206, 179, 250, 112, 209, 116, 1, 237, 246, 209, 116, 1, 214, 86, 209, - 116, 1, 237, 34, 237, 41, 69, 209, 116, 1, 220, 51, 220, 63, 221, 136, - 209, 116, 1, 221, 237, 221, 136, 209, 116, 1, 206, 177, 221, 136, 209, - 116, 1, 222, 212, 223, 59, 221, 246, 159, 209, 116, 1, 237, 248, 209, - 116, 1, 226, 59, 209, 116, 1, 226, 60, 209, 116, 1, 240, 123, 240, 129, - 240, 231, 209, 116, 1, 214, 47, 236, 120, 72, 209, 116, 1, 237, 76, 209, - 116, 1, 226, 9, 209, 116, 1, 240, 251, 209, 116, 1, 247, 157, 209, 116, - 1, 247, 56, 209, 116, 1, 205, 13, 209, 116, 1, 221, 234, 209, 116, 1, - 206, 172, 209, 116, 1, 230, 200, 209, 116, 1, 211, 167, 209, 116, 1, 196, - 222, 209, 116, 206, 62, 211, 213, 209, 116, 218, 120, 211, 213, 209, 116, - 241, 62, 211, 213, 209, 116, 250, 233, 105, 209, 116, 200, 247, 105, 209, - 116, 248, 231, 105, 209, 116, 1, 225, 80, 209, 116, 1, 207, 52, 209, 116, - 1, 214, 102, 209, 116, 1, 234, 247, 247, 95, 214, 53, 209, 116, 1, 234, - 247, 247, 95, 225, 248, 209, 116, 1, 234, 247, 247, 95, 237, 40, 209, - 116, 1, 234, 247, 247, 95, 252, 25, 209, 116, 1, 234, 247, 247, 95, 251, - 229, 203, 142, 1, 63, 203, 142, 1, 68, 203, 142, 1, 66, 203, 142, 1, 155, - 203, 142, 1, 234, 123, 203, 142, 1, 217, 71, 203, 142, 1, 189, 203, 142, - 1, 240, 136, 203, 142, 1, 176, 203, 142, 1, 161, 203, 142, 1, 249, 145, - 203, 142, 1, 166, 203, 142, 1, 164, 203, 142, 1, 172, 203, 142, 1, 197, - 166, 203, 142, 1, 183, 203, 142, 1, 142, 203, 142, 18, 2, 68, 203, 142, - 18, 2, 66, 203, 142, 2, 199, 7, 232, 179, 1, 63, 232, 179, 1, 68, 232, - 179, 1, 66, 232, 179, 1, 155, 232, 179, 1, 234, 123, 232, 179, 1, 217, - 71, 232, 179, 1, 189, 232, 179, 1, 240, 136, 232, 179, 1, 176, 232, 179, - 1, 161, 232, 179, 1, 249, 145, 232, 179, 1, 166, 232, 179, 1, 164, 232, - 179, 1, 169, 232, 179, 1, 172, 232, 179, 1, 197, 166, 232, 179, 1, 183, - 232, 179, 1, 142, 232, 179, 18, 2, 68, 232, 179, 18, 2, 66, 232, 179, 2, - 213, 194, 212, 239, 206, 62, 211, 213, 212, 239, 52, 211, 213, 248, 13, - 1, 63, 248, 13, 1, 68, 248, 13, 1, 66, 248, 13, 1, 155, 248, 13, 1, 234, - 123, 248, 13, 1, 217, 71, 248, 13, 1, 189, 248, 13, 1, 240, 136, 248, 13, - 1, 176, 248, 13, 1, 161, 248, 13, 1, 249, 145, 248, 13, 1, 166, 248, 13, - 1, 164, 248, 13, 1, 169, 248, 13, 1, 172, 248, 13, 1, 197, 166, 248, 13, - 1, 183, 248, 13, 1, 142, 248, 13, 18, 2, 68, 248, 13, 18, 2, 66, 203, - 141, 1, 63, 203, 141, 1, 68, 203, 141, 1, 66, 203, 141, 1, 155, 203, 141, - 1, 234, 123, 203, 141, 1, 217, 71, 203, 141, 1, 189, 203, 141, 1, 240, - 136, 203, 141, 1, 176, 203, 141, 1, 161, 203, 141, 1, 249, 145, 203, 141, - 1, 166, 203, 141, 1, 164, 203, 141, 1, 172, 203, 141, 1, 197, 166, 203, - 141, 1, 183, 203, 141, 18, 2, 68, 203, 141, 18, 2, 66, 89, 1, 155, 89, 1, - 224, 146, 89, 1, 224, 11, 89, 1, 224, 117, 89, 1, 216, 252, 89, 1, 247, - 174, 89, 1, 247, 16, 89, 1, 244, 182, 89, 1, 245, 49, 89, 1, 215, 73, 89, - 1, 240, 136, 89, 1, 201, 66, 89, 1, 239, 28, 89, 1, 201, 61, 89, 1, 216, - 56, 89, 1, 189, 89, 1, 202, 233, 89, 1, 149, 89, 1, 202, 169, 89, 1, 216, - 50, 89, 1, 249, 145, 89, 1, 213, 6, 89, 1, 212, 117, 89, 1, 212, 234, 89, - 1, 218, 251, 89, 1, 196, 3, 89, 1, 209, 232, 89, 1, 222, 7, 89, 1, 198, - 248, 89, 1, 207, 50, 89, 1, 205, 39, 89, 1, 183, 89, 1, 142, 89, 1, 172, - 89, 1, 211, 159, 89, 226, 73, 18, 211, 145, 89, 226, 73, 18, 211, 158, - 89, 226, 73, 18, 211, 121, 89, 226, 73, 18, 211, 115, 89, 226, 73, 18, - 211, 97, 89, 226, 73, 18, 211, 66, 89, 226, 73, 18, 211, 54, 89, 226, 73, - 18, 211, 53, 89, 226, 73, 18, 209, 89, 89, 226, 73, 18, 209, 82, 89, 226, - 73, 18, 221, 151, 89, 226, 73, 18, 221, 139, 89, 226, 73, 18, 211, 139, - 89, 226, 73, 18, 211, 151, 89, 226, 73, 18, 211, 105, 200, 201, 100, 89, - 226, 73, 18, 211, 105, 200, 201, 102, 89, 226, 73, 18, 211, 141, 89, 18, - 226, 57, 251, 18, 89, 18, 226, 57, 252, 168, 89, 18, 2, 252, 168, 89, 18, - 2, 68, 89, 18, 2, 226, 120, 89, 18, 2, 196, 148, 89, 18, 2, 195, 168, 89, - 18, 2, 66, 89, 18, 2, 199, 245, 89, 18, 2, 200, 114, 89, 18, 2, 214, 164, - 89, 18, 2, 164, 89, 18, 2, 226, 147, 89, 18, 2, 69, 89, 18, 2, 251, 245, - 89, 18, 2, 251, 200, 89, 18, 2, 214, 102, 89, 18, 2, 250, 150, 89, 2, - 216, 188, 89, 2, 210, 177, 89, 2, 195, 179, 89, 2, 218, 83, 89, 2, 201, - 168, 89, 2, 249, 82, 89, 2, 209, 221, 89, 2, 202, 21, 89, 2, 225, 24, 89, - 2, 251, 202, 89, 2, 208, 220, 208, 212, 89, 2, 199, 4, 89, 2, 244, 174, - 89, 2, 249, 52, 89, 2, 224, 138, 89, 2, 249, 77, 89, 2, 247, 145, 212, - 183, 223, 143, 89, 2, 222, 165, 201, 247, 89, 2, 248, 199, 89, 2, 212, - 236, 218, 138, 89, 2, 223, 240, 89, 241, 17, 16, 210, 56, 89, 2, 250, - 131, 89, 2, 250, 153, 89, 17, 195, 79, 89, 17, 100, 89, 17, 102, 89, 17, - 134, 89, 17, 136, 89, 17, 146, 89, 17, 167, 89, 17, 178, 89, 17, 171, 89, - 17, 182, 89, 16, 222, 165, 250, 155, 205, 174, 89, 16, 222, 165, 250, - 155, 218, 104, 89, 16, 222, 165, 250, 155, 212, 182, 89, 16, 222, 165, - 250, 155, 248, 234, 89, 16, 222, 165, 250, 155, 247, 249, 89, 16, 222, - 165, 250, 155, 212, 49, 89, 16, 222, 165, 250, 155, 212, 43, 89, 16, 222, - 165, 250, 155, 212, 41, 89, 16, 222, 165, 250, 155, 212, 47, 89, 16, 222, - 165, 250, 155, 212, 45, 96, 248, 154, 96, 236, 247, 96, 244, 159, 96, - 234, 217, 204, 226, 96, 244, 168, 96, 235, 7, 238, 250, 96, 202, 20, 205, - 186, 231, 7, 96, 206, 104, 5, 248, 81, 220, 24, 96, 220, 59, 244, 159, - 96, 220, 59, 234, 217, 204, 226, 96, 216, 170, 96, 234, 246, 62, 208, - 115, 100, 96, 234, 246, 62, 208, 115, 102, 96, 234, 246, 62, 208, 115, - 134, 96, 18, 207, 90, 96, 17, 195, 79, 96, 17, 100, 96, 17, 102, 96, 17, - 134, 96, 17, 136, 96, 17, 146, 96, 17, 167, 96, 17, 178, 96, 17, 171, 96, - 17, 182, 96, 1, 63, 96, 1, 69, 96, 1, 68, 96, 1, 72, 96, 1, 66, 96, 1, - 214, 164, 96, 1, 200, 99, 96, 1, 237, 54, 96, 1, 176, 96, 1, 251, 97, 96, - 1, 249, 145, 96, 1, 161, 96, 1, 211, 159, 96, 1, 234, 123, 96, 1, 166, - 96, 1, 172, 96, 1, 183, 96, 1, 207, 50, 96, 1, 189, 96, 1, 240, 136, 96, - 1, 247, 16, 96, 1, 225, 214, 96, 1, 164, 96, 1, 169, 96, 1, 197, 166, 96, - 1, 235, 239, 96, 1, 155, 96, 1, 224, 146, 96, 1, 201, 113, 96, 1, 195, - 115, 96, 1, 232, 246, 96, 1, 195, 3, 96, 1, 222, 122, 96, 1, 195, 60, 96, - 1, 245, 75, 96, 1, 202, 20, 181, 18, 55, 96, 1, 202, 20, 69, 96, 1, 202, - 20, 68, 96, 1, 202, 20, 72, 96, 1, 202, 20, 66, 96, 1, 202, 20, 214, 164, - 96, 1, 202, 20, 200, 99, 96, 1, 202, 20, 251, 97, 96, 1, 202, 20, 249, - 145, 96, 1, 202, 20, 161, 96, 1, 202, 20, 211, 159, 96, 1, 202, 20, 234, - 123, 96, 1, 202, 20, 166, 96, 1, 202, 20, 189, 96, 1, 202, 20, 240, 136, - 96, 1, 202, 20, 247, 16, 96, 1, 202, 20, 225, 214, 96, 1, 202, 20, 201, - 113, 96, 1, 202, 20, 164, 96, 1, 202, 20, 197, 166, 96, 1, 202, 20, 155, - 96, 1, 202, 20, 234, 120, 96, 1, 202, 20, 232, 246, 96, 1, 202, 20, 225, - 171, 96, 1, 202, 20, 216, 213, 96, 1, 202, 20, 237, 156, 96, 1, 206, 104, - 69, 96, 1, 206, 104, 68, 96, 1, 206, 104, 225, 225, 96, 1, 206, 104, 200, - 99, 96, 1, 206, 104, 66, 96, 1, 206, 104, 251, 97, 96, 1, 206, 104, 155, - 96, 1, 206, 104, 234, 123, 96, 1, 206, 104, 142, 96, 1, 206, 104, 161, - 96, 1, 206, 104, 207, 50, 96, 1, 206, 104, 189, 96, 1, 206, 104, 240, - 136, 96, 1, 206, 104, 225, 214, 96, 1, 206, 104, 235, 239, 96, 1, 206, - 104, 234, 120, 96, 1, 206, 104, 232, 246, 96, 1, 206, 104, 201, 113, 96, - 1, 206, 104, 195, 115, 96, 1, 206, 104, 210, 244, 96, 1, 206, 104, 247, - 16, 96, 1, 206, 104, 195, 74, 96, 1, 220, 59, 68, 96, 1, 220, 59, 155, - 96, 1, 220, 59, 169, 96, 1, 220, 59, 235, 239, 96, 1, 220, 59, 195, 74, - 96, 1, 247, 17, 3, 99, 238, 250, 96, 1, 251, 156, 234, 103, 251, 52, 100, - 96, 1, 251, 156, 234, 103, 199, 3, 100, 96, 1, 251, 156, 234, 103, 240, - 97, 96, 1, 251, 156, 234, 103, 200, 109, 96, 1, 251, 156, 234, 103, 226, - 17, 200, 109, 96, 1, 251, 156, 234, 103, 249, 96, 96, 1, 251, 156, 234, - 103, 115, 249, 96, 96, 1, 251, 156, 234, 103, 63, 96, 1, 251, 156, 234, - 103, 68, 96, 1, 251, 156, 234, 103, 155, 96, 1, 251, 156, 234, 103, 217, - 71, 96, 1, 251, 156, 234, 103, 247, 174, 96, 1, 251, 156, 234, 103, 201, - 78, 96, 1, 251, 156, 234, 103, 201, 66, 96, 1, 251, 156, 234, 103, 240, - 41, 96, 1, 251, 156, 234, 103, 216, 86, 96, 1, 251, 156, 234, 103, 189, - 96, 1, 251, 156, 234, 103, 240, 136, 96, 1, 251, 156, 234, 103, 161, 96, - 1, 251, 156, 234, 103, 213, 6, 96, 1, 251, 156, 234, 103, 205, 80, 96, 1, - 251, 156, 234, 103, 195, 74, 96, 1, 251, 156, 234, 103, 195, 115, 96, 1, - 251, 156, 234, 103, 251, 209, 96, 1, 202, 20, 251, 156, 234, 103, 189, - 96, 1, 202, 20, 251, 156, 234, 103, 195, 74, 96, 1, 220, 59, 251, 156, - 234, 103, 233, 230, 96, 1, 220, 59, 251, 156, 234, 103, 217, 71, 96, 1, - 220, 59, 251, 156, 234, 103, 247, 174, 96, 1, 220, 59, 251, 156, 234, - 103, 225, 180, 96, 1, 220, 59, 251, 156, 234, 103, 201, 78, 96, 1, 220, - 59, 251, 156, 234, 103, 240, 25, 96, 1, 220, 59, 251, 156, 234, 103, 189, - 96, 1, 220, 59, 251, 156, 234, 103, 239, 176, 96, 1, 220, 59, 251, 156, - 234, 103, 205, 80, 96, 1, 220, 59, 251, 156, 234, 103, 240, 245, 96, 1, - 220, 59, 251, 156, 234, 103, 195, 74, 96, 1, 220, 59, 251, 156, 234, 103, - 195, 115, 96, 1, 251, 156, 234, 103, 157, 66, 96, 1, 251, 156, 234, 103, - 157, 164, 96, 1, 220, 59, 251, 156, 234, 103, 248, 197, 96, 1, 251, 156, - 234, 103, 240, 124, 96, 1, 220, 59, 251, 156, 234, 103, 222, 122, 21, 22, - 214, 8, 21, 22, 250, 122, 21, 22, 252, 122, 21, 22, 197, 112, 21, 22, - 212, 55, 21, 22, 213, 101, 21, 22, 211, 176, 21, 22, 203, 77, 21, 22, - 224, 216, 21, 22, 223, 133, 21, 22, 219, 251, 21, 22, 216, 1, 21, 22, - 217, 195, 21, 22, 222, 207, 21, 22, 205, 153, 21, 22, 208, 180, 21, 22, - 206, 160, 21, 22, 207, 3, 21, 22, 206, 122, 21, 22, 195, 226, 21, 22, - 196, 75, 21, 22, 210, 191, 21, 22, 215, 115, 21, 22, 214, 141, 215, 115, - 21, 22, 215, 114, 21, 22, 214, 141, 215, 114, 21, 22, 215, 113, 21, 22, - 214, 141, 215, 113, 21, 22, 215, 112, 21, 22, 214, 141, 215, 112, 21, 22, - 209, 94, 21, 22, 209, 93, 21, 22, 209, 92, 21, 22, 209, 91, 21, 22, 209, - 90, 21, 22, 209, 98, 21, 22, 214, 141, 214, 3, 21, 22, 214, 141, 203, - 216, 21, 22, 214, 141, 225, 80, 21, 22, 214, 141, 247, 207, 21, 22, 214, - 141, 221, 136, 21, 22, 214, 141, 218, 55, 21, 22, 214, 141, 209, 80, 21, - 22, 214, 141, 207, 52, 21, 22, 237, 67, 197, 199, 21, 22, 197, 86, 197, - 199, 21, 22, 48, 4, 210, 2, 21, 22, 48, 210, 215, 238, 253, 21, 22, 211, - 31, 209, 95, 21, 22, 197, 87, 221, 229, 21, 22, 197, 87, 223, 82, 21, 22, - 202, 131, 21, 22, 202, 133, 21, 22, 201, 58, 21, 22, 201, 60, 21, 22, - 201, 65, 21, 22, 202, 37, 21, 22, 202, 39, 21, 22, 208, 178, 206, 127, - 21, 22, 208, 178, 206, 190, 21, 22, 208, 178, 231, 166, 21, 22, 92, 233, - 29, 21, 22, 92, 239, 210, 234, 40, 21, 22, 92, 234, 120, 21, 22, 92, 233, - 34, 21, 22, 208, 178, 225, 90, 21, 22, 92, 225, 88, 21, 22, 248, 254, - 239, 210, 159, 21, 22, 248, 254, 239, 210, 144, 21, 22, 92, 239, 205, - 209, 80, 222, 85, 198, 226, 222, 135, 222, 85, 1, 155, 222, 85, 1, 224, - 146, 222, 85, 1, 234, 123, 222, 85, 1, 233, 230, 222, 85, 1, 217, 71, - 222, 85, 1, 247, 174, 222, 85, 1, 247, 16, 222, 85, 1, 225, 214, 222, 85, - 1, 225, 180, 222, 85, 1, 196, 97, 222, 85, 1, 189, 222, 85, 1, 202, 233, - 222, 85, 1, 240, 136, 222, 85, 1, 239, 176, 222, 85, 1, 176, 222, 85, 1, - 161, 222, 85, 1, 213, 6, 222, 85, 1, 249, 145, 222, 85, 1, 248, 197, 222, - 85, 1, 166, 222, 85, 1, 164, 222, 85, 1, 169, 222, 85, 1, 172, 222, 85, - 1, 197, 166, 222, 85, 1, 207, 50, 222, 85, 1, 205, 80, 222, 85, 1, 183, - 222, 85, 1, 142, 222, 85, 1, 233, 25, 222, 85, 1, 201, 217, 222, 85, 18, - 2, 63, 222, 85, 18, 2, 68, 222, 85, 18, 2, 66, 222, 85, 18, 2, 237, 54, - 222, 85, 18, 2, 251, 200, 222, 85, 18, 2, 214, 102, 222, 85, 18, 2, 250, - 150, 222, 85, 18, 2, 69, 222, 85, 18, 2, 72, 222, 85, 204, 152, 1, 164, - 222, 85, 204, 152, 1, 169, 222, 85, 204, 152, 1, 197, 166, 222, 85, 4, 1, - 155, 222, 85, 4, 1, 217, 71, 222, 85, 4, 1, 251, 51, 222, 85, 4, 1, 189, - 222, 85, 4, 1, 176, 222, 85, 4, 1, 161, 222, 85, 4, 1, 166, 222, 85, 4, - 1, 169, 222, 85, 4, 1, 172, 222, 85, 2, 218, 125, 222, 85, 2, 224, 188, - 222, 85, 2, 209, 14, 222, 85, 2, 221, 229, 222, 85, 236, 90, 78, 222, 85, - 211, 79, 78, 222, 85, 17, 195, 79, 222, 85, 17, 100, 222, 85, 17, 102, - 222, 85, 17, 134, 222, 85, 17, 136, 222, 85, 17, 146, 222, 85, 17, 167, - 222, 85, 17, 178, 222, 85, 17, 171, 222, 85, 17, 182, 49, 222, 198, 1, - 155, 49, 222, 198, 1, 196, 208, 49, 222, 198, 1, 217, 71, 49, 222, 198, - 1, 201, 113, 49, 222, 198, 1, 183, 49, 222, 198, 1, 164, 49, 222, 198, 1, - 189, 49, 222, 198, 1, 202, 233, 49, 222, 198, 1, 172, 49, 222, 198, 1, - 161, 49, 222, 198, 1, 213, 6, 49, 222, 198, 1, 166, 49, 222, 198, 1, 235, - 239, 49, 222, 198, 1, 199, 152, 49, 222, 198, 1, 142, 49, 222, 198, 1, - 211, 159, 49, 222, 198, 1, 224, 146, 49, 222, 198, 1, 201, 103, 49, 222, - 198, 1, 176, 49, 222, 198, 1, 63, 49, 222, 198, 1, 68, 49, 222, 198, 1, - 237, 54, 49, 222, 198, 1, 237, 40, 49, 222, 198, 1, 66, 49, 222, 198, 1, - 214, 102, 49, 222, 198, 1, 72, 49, 222, 198, 1, 200, 99, 49, 222, 198, 1, - 69, 49, 222, 198, 1, 250, 148, 49, 222, 198, 1, 251, 200, 49, 222, 198, - 1, 202, 9, 49, 222, 198, 1, 202, 8, 49, 222, 198, 1, 202, 7, 49, 222, - 198, 1, 202, 6, 49, 222, 198, 1, 202, 5, 217, 83, 49, 221, 185, 1, 130, - 211, 159, 217, 83, 49, 221, 185, 1, 126, 211, 159, 217, 83, 49, 221, 185, - 1, 130, 155, 217, 83, 49, 221, 185, 1, 130, 196, 208, 217, 83, 49, 221, - 185, 1, 130, 217, 71, 217, 83, 49, 221, 185, 1, 126, 155, 217, 83, 49, - 221, 185, 1, 126, 196, 208, 217, 83, 49, 221, 185, 1, 126, 217, 71, 217, - 83, 49, 221, 185, 1, 130, 201, 113, 217, 83, 49, 221, 185, 1, 130, 183, - 217, 83, 49, 221, 185, 1, 130, 164, 217, 83, 49, 221, 185, 1, 126, 201, - 113, 217, 83, 49, 221, 185, 1, 126, 183, 217, 83, 49, 221, 185, 1, 126, - 164, 217, 83, 49, 221, 185, 1, 130, 189, 217, 83, 49, 221, 185, 1, 130, - 202, 233, 217, 83, 49, 221, 185, 1, 130, 176, 217, 83, 49, 221, 185, 1, - 126, 189, 217, 83, 49, 221, 185, 1, 126, 202, 233, 217, 83, 49, 221, 185, - 1, 126, 176, 217, 83, 49, 221, 185, 1, 130, 161, 217, 83, 49, 221, 185, - 1, 130, 213, 6, 217, 83, 49, 221, 185, 1, 130, 166, 217, 83, 49, 221, - 185, 1, 126, 161, 217, 83, 49, 221, 185, 1, 126, 213, 6, 217, 83, 49, - 221, 185, 1, 126, 166, 217, 83, 49, 221, 185, 1, 130, 235, 239, 217, 83, - 49, 221, 185, 1, 130, 199, 152, 217, 83, 49, 221, 185, 1, 130, 172, 217, - 83, 49, 221, 185, 1, 126, 235, 239, 217, 83, 49, 221, 185, 1, 126, 199, - 152, 217, 83, 49, 221, 185, 1, 126, 172, 217, 83, 49, 221, 185, 1, 130, - 142, 217, 83, 49, 221, 185, 1, 130, 240, 136, 217, 83, 49, 221, 185, 1, - 130, 249, 145, 217, 83, 49, 221, 185, 1, 126, 142, 217, 83, 49, 221, 185, - 1, 126, 240, 136, 217, 83, 49, 221, 185, 1, 126, 249, 145, 217, 83, 49, - 221, 185, 1, 130, 223, 138, 217, 83, 49, 221, 185, 1, 130, 196, 174, 217, - 83, 49, 221, 185, 1, 126, 223, 138, 217, 83, 49, 221, 185, 1, 126, 196, - 174, 217, 83, 49, 221, 185, 1, 130, 204, 163, 217, 83, 49, 221, 185, 1, - 126, 204, 163, 217, 83, 49, 221, 185, 18, 2, 18, 206, 170, 217, 83, 49, - 221, 185, 18, 2, 252, 168, 217, 83, 49, 221, 185, 18, 2, 226, 120, 217, - 83, 49, 221, 185, 18, 2, 66, 217, 83, 49, 221, 185, 18, 2, 199, 245, 217, - 83, 49, 221, 185, 18, 2, 69, 217, 83, 49, 221, 185, 18, 2, 251, 245, 217, - 83, 49, 221, 185, 18, 2, 72, 217, 83, 49, 221, 185, 18, 2, 214, 190, 217, - 83, 49, 221, 185, 18, 2, 200, 99, 217, 83, 49, 221, 185, 18, 2, 250, 122, - 217, 83, 49, 221, 185, 18, 2, 252, 122, 217, 83, 49, 221, 185, 18, 2, - 199, 237, 217, 83, 49, 221, 185, 18, 2, 214, 8, 217, 83, 49, 221, 185, - 18, 2, 214, 187, 217, 83, 49, 221, 185, 18, 2, 200, 94, 217, 83, 49, 221, - 185, 18, 2, 225, 225, 217, 83, 49, 221, 185, 1, 48, 199, 230, 217, 83, - 49, 221, 185, 1, 48, 217, 73, 217, 83, 49, 221, 185, 1, 48, 218, 55, 217, - 83, 49, 221, 185, 1, 48, 221, 136, 217, 83, 49, 221, 185, 1, 48, 225, 80, - 217, 83, 49, 221, 185, 1, 48, 240, 231, 217, 83, 49, 221, 185, 1, 48, - 250, 112, 217, 83, 49, 221, 185, 152, 220, 28, 217, 83, 49, 221, 185, - 152, 220, 27, 217, 83, 49, 221, 185, 17, 195, 79, 217, 83, 49, 221, 185, - 17, 100, 217, 83, 49, 221, 185, 17, 102, 217, 83, 49, 221, 185, 17, 134, - 217, 83, 49, 221, 185, 17, 136, 217, 83, 49, 221, 185, 17, 146, 217, 83, - 49, 221, 185, 17, 167, 217, 83, 49, 221, 185, 17, 178, 217, 83, 49, 221, - 185, 17, 171, 217, 83, 49, 221, 185, 17, 182, 217, 83, 49, 221, 185, 120, - 17, 100, 217, 83, 49, 221, 185, 2, 223, 65, 217, 83, 49, 221, 185, 2, - 223, 64, 89, 16, 213, 111, 89, 16, 218, 105, 224, 3, 89, 16, 212, 183, - 224, 3, 89, 16, 248, 235, 224, 3, 89, 16, 247, 250, 224, 3, 89, 16, 212, - 50, 224, 3, 89, 16, 212, 44, 224, 3, 89, 16, 212, 42, 224, 3, 89, 16, - 212, 48, 224, 3, 89, 16, 212, 46, 224, 3, 89, 16, 240, 82, 224, 3, 89, - 16, 240, 78, 224, 3, 89, 16, 240, 77, 224, 3, 89, 16, 240, 80, 224, 3, - 89, 16, 240, 79, 224, 3, 89, 16, 240, 76, 224, 3, 89, 16, 200, 253, 89, - 16, 218, 105, 209, 219, 89, 16, 212, 183, 209, 219, 89, 16, 248, 235, - 209, 219, 89, 16, 247, 250, 209, 219, 89, 16, 212, 50, 209, 219, 89, 16, - 212, 44, 209, 219, 89, 16, 212, 42, 209, 219, 89, 16, 212, 48, 209, 219, - 89, 16, 212, 46, 209, 219, 89, 16, 240, 82, 209, 219, 89, 16, 240, 78, - 209, 219, 89, 16, 240, 77, 209, 219, 89, 16, 240, 80, 209, 219, 89, 16, - 240, 79, 209, 219, 89, 16, 240, 76, 209, 219, 248, 14, 1, 155, 248, 14, - 1, 234, 123, 248, 14, 1, 217, 71, 248, 14, 1, 217, 14, 248, 14, 1, 161, - 248, 14, 1, 249, 145, 248, 14, 1, 166, 248, 14, 1, 218, 151, 248, 14, 1, - 189, 248, 14, 1, 240, 136, 248, 14, 1, 176, 248, 14, 1, 215, 252, 248, - 14, 1, 247, 174, 248, 14, 1, 225, 214, 248, 14, 1, 215, 109, 248, 14, 1, - 215, 100, 248, 14, 1, 164, 248, 14, 1, 169, 248, 14, 1, 172, 248, 14, 1, - 199, 152, 248, 14, 1, 183, 248, 14, 1, 63, 248, 14, 1, 142, 248, 14, 18, - 2, 68, 248, 14, 18, 2, 66, 248, 14, 18, 2, 69, 248, 14, 18, 2, 72, 248, - 14, 18, 2, 251, 245, 248, 14, 213, 208, 248, 14, 236, 222, 77, 208, 132, - 49, 120, 1, 130, 155, 49, 120, 1, 130, 224, 146, 49, 120, 1, 130, 223, - 122, 49, 120, 1, 126, 155, 49, 120, 1, 126, 223, 122, 49, 120, 1, 126, - 224, 146, 49, 120, 1, 217, 71, 49, 120, 1, 130, 247, 174, 49, 120, 1, - 130, 247, 16, 49, 120, 1, 126, 247, 174, 49, 120, 1, 126, 183, 49, 120, - 1, 126, 247, 16, 49, 120, 1, 215, 109, 49, 120, 1, 210, 197, 49, 120, 1, - 130, 210, 195, 49, 120, 1, 240, 136, 49, 120, 1, 126, 210, 195, 49, 120, - 1, 210, 206, 49, 120, 1, 130, 189, 49, 120, 1, 130, 202, 233, 49, 120, 1, - 126, 189, 49, 120, 1, 126, 202, 233, 49, 120, 1, 176, 49, 120, 1, 249, - 145, 49, 120, 1, 130, 161, 49, 120, 1, 130, 213, 6, 49, 120, 1, 130, 235, - 239, 49, 120, 1, 126, 161, 49, 120, 1, 126, 235, 239, 49, 120, 1, 126, - 213, 6, 49, 120, 1, 166, 49, 120, 1, 126, 164, 49, 120, 1, 130, 164, 49, - 120, 1, 169, 49, 120, 1, 209, 129, 49, 120, 1, 172, 49, 120, 1, 221, 184, - 49, 120, 1, 197, 166, 49, 120, 1, 130, 207, 50, 49, 120, 1, 130, 205, 80, - 49, 120, 1, 130, 183, 49, 120, 1, 130, 142, 49, 120, 1, 222, 37, 49, 120, - 1, 63, 49, 120, 1, 126, 142, 49, 120, 1, 68, 49, 120, 1, 226, 120, 49, - 120, 1, 66, 49, 120, 1, 199, 245, 49, 120, 1, 237, 54, 49, 120, 1, 214, - 102, 49, 120, 1, 223, 65, 49, 120, 1, 233, 96, 183, 49, 120, 108, 2, 219, - 194, 169, 49, 120, 108, 2, 219, 194, 172, 49, 120, 108, 2, 223, 83, 203, - 111, 223, 54, 49, 120, 2, 220, 82, 225, 14, 223, 54, 49, 120, 108, 2, 48, - 217, 71, 49, 120, 108, 2, 126, 161, 49, 120, 108, 2, 130, 210, 196, 214, - 73, 126, 161, 49, 120, 108, 2, 166, 49, 120, 108, 2, 249, 145, 49, 120, - 108, 2, 183, 49, 120, 2, 208, 244, 49, 120, 18, 2, 63, 49, 120, 18, 2, - 220, 82, 208, 199, 49, 120, 18, 2, 252, 168, 49, 120, 18, 2, 203, 120, - 252, 168, 49, 120, 18, 2, 68, 49, 120, 18, 2, 226, 120, 49, 120, 18, 2, - 200, 99, 49, 120, 18, 2, 199, 244, 49, 120, 18, 2, 66, 49, 120, 18, 2, - 199, 245, 49, 120, 18, 2, 72, 49, 120, 18, 2, 214, 191, 60, 49, 120, 18, - 2, 214, 8, 49, 120, 18, 2, 69, 49, 120, 18, 2, 251, 245, 49, 120, 18, 2, - 214, 102, 49, 120, 18, 2, 251, 200, 49, 120, 18, 2, 120, 251, 200, 49, - 120, 18, 2, 214, 191, 57, 49, 120, 2, 220, 82, 225, 13, 49, 120, 2, 202, - 10, 49, 120, 2, 202, 9, 49, 120, 2, 224, 106, 202, 8, 49, 120, 2, 224, - 106, 202, 7, 49, 120, 2, 224, 106, 202, 6, 49, 120, 2, 210, 252, 232, - 245, 49, 120, 2, 220, 82, 208, 229, 49, 120, 2, 224, 105, 224, 250, 49, - 120, 38, 241, 44, 238, 253, 49, 120, 231, 157, 17, 195, 79, 49, 120, 231, - 157, 17, 100, 49, 120, 231, 157, 17, 102, 49, 120, 231, 157, 17, 134, 49, - 120, 231, 157, 17, 136, 49, 120, 231, 157, 17, 146, 49, 120, 231, 157, - 17, 167, 49, 120, 231, 157, 17, 178, 49, 120, 231, 157, 17, 171, 49, 120, - 231, 157, 17, 182, 49, 120, 120, 17, 195, 79, 49, 120, 120, 17, 100, 49, - 120, 120, 17, 102, 49, 120, 120, 17, 134, 49, 120, 120, 17, 136, 49, 120, - 120, 17, 146, 49, 120, 120, 17, 167, 49, 120, 120, 17, 178, 49, 120, 120, - 17, 171, 49, 120, 120, 17, 182, 49, 120, 2, 197, 64, 49, 120, 2, 197, 63, - 49, 120, 2, 208, 184, 49, 120, 2, 224, 177, 49, 120, 2, 231, 85, 49, 120, - 2, 239, 12, 49, 120, 2, 210, 89, 209, 194, 210, 206, 49, 120, 2, 220, 82, - 196, 98, 49, 120, 2, 225, 48, 49, 120, 2, 225, 47, 49, 120, 2, 208, 194, - 49, 120, 2, 208, 193, 49, 120, 2, 232, 182, 49, 120, 2, 247, 171, 38, - 237, 240, 244, 241, 252, 22, 38, 239, 149, 38, 226, 63, 38, 237, 231, 51, - 38, 201, 165, 238, 253, 38, 196, 221, 60, 38, 197, 56, 222, 76, 60, 38, - 192, 117, 60, 38, 52, 192, 117, 60, 38, 175, 247, 38, 204, 196, 60, 38, - 204, 182, 247, 38, 204, 196, 60, 38, 213, 142, 57, 38, 52, 213, 142, 57, - 38, 213, 142, 60, 38, 213, 142, 214, 20, 141, 2, 200, 82, 210, 59, 141, - 2, 200, 82, 247, 135, 141, 2, 247, 53, 141, 2, 204, 86, 141, 2, 248, 151, - 141, 1, 251, 179, 141, 1, 251, 180, 203, 50, 141, 1, 226, 116, 141, 1, - 226, 117, 203, 50, 141, 1, 200, 85, 141, 1, 200, 86, 203, 50, 141, 1, - 210, 252, 210, 122, 141, 1, 210, 252, 210, 123, 203, 50, 141, 1, 223, 83, - 222, 159, 141, 1, 223, 83, 222, 160, 203, 50, 141, 1, 237, 12, 141, 1, - 251, 197, 141, 1, 214, 137, 141, 1, 214, 138, 203, 50, 141, 1, 155, 141, - 1, 225, 70, 220, 85, 141, 1, 234, 123, 141, 1, 234, 124, 233, 129, 141, - 1, 217, 71, 141, 1, 247, 174, 141, 1, 247, 175, 223, 69, 141, 1, 225, - 214, 141, 1, 225, 215, 225, 184, 141, 1, 215, 109, 141, 1, 203, 169, 222, - 217, 141, 1, 203, 169, 218, 100, 220, 85, 141, 1, 240, 137, 218, 100, - 251, 136, 141, 1, 240, 137, 218, 100, 220, 85, 141, 1, 218, 1, 210, 209, - 141, 1, 189, 141, 1, 203, 169, 203, 81, 141, 1, 240, 136, 141, 1, 240, - 137, 220, 106, 141, 1, 176, 141, 1, 161, 141, 1, 213, 244, 225, 6, 141, - 1, 249, 145, 141, 1, 249, 146, 224, 189, 141, 1, 166, 141, 1, 164, 141, - 1, 169, 141, 1, 172, 141, 1, 197, 166, 141, 1, 209, 23, 209, 0, 141, 1, - 209, 23, 208, 206, 141, 1, 183, 141, 1, 142, 141, 2, 210, 112, 141, 18, - 2, 203, 50, 141, 18, 2, 200, 81, 141, 18, 2, 200, 82, 208, 202, 141, 18, - 2, 204, 121, 141, 18, 2, 204, 122, 226, 108, 141, 18, 2, 210, 252, 210, - 122, 141, 18, 2, 210, 252, 210, 123, 203, 50, 141, 18, 2, 223, 83, 222, - 159, 141, 18, 2, 223, 83, 222, 160, 203, 50, 141, 18, 2, 203, 121, 141, - 18, 2, 203, 122, 210, 122, 141, 18, 2, 203, 122, 203, 50, 141, 18, 2, - 203, 122, 210, 123, 203, 50, 141, 18, 2, 213, 48, 141, 18, 2, 213, 49, - 203, 50, 141, 252, 1, 252, 0, 141, 1, 225, 36, 208, 201, 141, 1, 224, - 112, 208, 201, 141, 1, 200, 181, 208, 201, 141, 1, 237, 48, 208, 201, - 141, 1, 199, 119, 208, 201, 141, 1, 195, 105, 208, 201, 141, 1, 250, 171, - 208, 201, 141, 17, 195, 79, 141, 17, 100, 141, 17, 102, 141, 17, 134, - 141, 17, 136, 141, 17, 146, 141, 17, 167, 141, 17, 178, 141, 17, 171, - 141, 17, 182, 141, 213, 171, 141, 213, 200, 141, 197, 48, 141, 247, 108, - 213, 193, 141, 247, 108, 206, 81, 141, 247, 108, 213, 139, 141, 213, 199, - 141, 34, 16, 239, 4, 141, 34, 16, 239, 209, 141, 34, 16, 237, 184, 141, - 34, 16, 240, 86, 141, 34, 16, 240, 87, 204, 86, 141, 34, 16, 239, 94, - 141, 34, 16, 240, 128, 141, 34, 16, 239, 185, 141, 34, 16, 240, 110, 141, - 34, 16, 240, 87, 234, 42, 141, 34, 16, 38, 203, 43, 141, 34, 16, 38, 236, - 219, 141, 34, 16, 38, 224, 184, 141, 34, 16, 38, 224, 186, 141, 34, 16, - 38, 225, 188, 141, 34, 16, 38, 224, 185, 3, 225, 188, 141, 34, 16, 38, - 224, 187, 3, 225, 188, 141, 34, 16, 38, 248, 220, 141, 34, 16, 38, 233, - 133, 141, 34, 16, 210, 20, 192, 237, 195, 141, 34, 16, 210, 20, 192, 240, - 126, 141, 34, 16, 210, 20, 244, 203, 201, 26, 141, 34, 16, 210, 20, 244, - 203, 203, 131, 141, 34, 16, 222, 182, 192, 213, 185, 141, 34, 16, 222, - 182, 192, 211, 211, 141, 34, 16, 222, 182, 244, 203, 212, 145, 141, 34, - 16, 222, 182, 244, 203, 212, 129, 141, 34, 16, 222, 182, 192, 212, 171, - 204, 110, 2, 213, 168, 204, 110, 2, 213, 181, 204, 110, 2, 213, 177, 204, - 110, 1, 63, 204, 110, 1, 68, 204, 110, 1, 66, 204, 110, 1, 251, 245, 204, - 110, 1, 72, 204, 110, 1, 69, 204, 110, 1, 236, 116, 204, 110, 1, 155, - 204, 110, 1, 211, 159, 204, 110, 1, 234, 123, 204, 110, 1, 217, 71, 204, - 110, 1, 247, 174, 204, 110, 1, 225, 214, 204, 110, 1, 195, 115, 204, 110, - 1, 215, 109, 204, 110, 1, 189, 204, 110, 1, 240, 136, 204, 110, 1, 176, - 204, 110, 1, 161, 204, 110, 1, 235, 239, 204, 110, 1, 199, 152, 204, 110, - 1, 249, 145, 204, 110, 1, 166, 204, 110, 1, 164, 204, 110, 1, 169, 204, - 110, 1, 172, 204, 110, 1, 197, 166, 204, 110, 1, 183, 204, 110, 1, 196, - 208, 204, 110, 1, 142, 204, 110, 108, 2, 213, 197, 204, 110, 108, 2, 213, - 170, 204, 110, 108, 2, 213, 167, 204, 110, 18, 2, 213, 184, 204, 110, 18, - 2, 213, 166, 204, 110, 18, 2, 213, 190, 204, 110, 18, 2, 213, 176, 204, - 110, 18, 2, 213, 198, 204, 110, 18, 2, 213, 186, 204, 110, 2, 213, 201, - 204, 110, 2, 199, 7, 204, 110, 108, 2, 213, 127, 166, 204, 110, 108, 2, - 213, 127, 197, 166, 204, 110, 1, 224, 146, 204, 110, 1, 204, 43, 204, - 110, 17, 195, 79, 204, 110, 17, 100, 204, 110, 17, 102, 204, 110, 17, - 134, 204, 110, 17, 136, 204, 110, 17, 146, 204, 110, 17, 167, 204, 110, - 17, 178, 204, 110, 17, 171, 204, 110, 17, 182, 204, 110, 250, 132, 204, - 110, 1, 210, 92, 204, 110, 1, 222, 132, 204, 110, 1, 248, 197, 204, 110, - 1, 48, 225, 80, 204, 110, 1, 48, 221, 136, 249, 55, 1, 63, 249, 55, 1, - 206, 73, 63, 249, 55, 1, 142, 249, 55, 1, 206, 73, 142, 249, 55, 1, 220, - 57, 142, 249, 55, 1, 249, 145, 249, 55, 1, 224, 247, 249, 145, 249, 55, - 1, 161, 249, 55, 1, 206, 73, 161, 249, 55, 1, 176, 249, 55, 1, 220, 57, - 176, 249, 55, 1, 197, 166, 249, 55, 1, 206, 73, 197, 166, 249, 55, 1, - 213, 216, 197, 166, 249, 55, 1, 234, 123, 249, 55, 1, 206, 73, 234, 123, - 249, 55, 1, 225, 214, 249, 55, 1, 240, 136, 249, 55, 1, 169, 249, 55, 1, - 206, 73, 169, 249, 55, 1, 166, 249, 55, 1, 206, 73, 166, 249, 55, 1, 205, - 157, 189, 249, 55, 1, 216, 23, 189, 249, 55, 1, 183, 249, 55, 1, 206, 73, - 183, 249, 55, 1, 220, 57, 183, 249, 55, 1, 164, 249, 55, 1, 206, 73, 164, - 249, 55, 1, 217, 71, 249, 55, 1, 172, 249, 55, 1, 206, 73, 172, 249, 55, - 1, 215, 109, 249, 55, 1, 247, 174, 249, 55, 1, 217, 159, 249, 55, 1, 219, - 241, 249, 55, 1, 68, 249, 55, 1, 66, 249, 55, 2, 202, 14, 249, 55, 18, 2, - 69, 249, 55, 18, 2, 213, 216, 69, 249, 55, 18, 2, 237, 54, 249, 55, 18, - 2, 68, 249, 55, 18, 2, 224, 247, 68, 249, 55, 18, 2, 72, 249, 55, 18, 2, - 224, 247, 72, 249, 55, 18, 2, 66, 249, 55, 18, 2, 118, 36, 206, 73, 183, - 249, 55, 108, 2, 217, 73, 249, 55, 108, 2, 233, 15, 249, 55, 213, 179, - 249, 55, 213, 175, 249, 55, 16, 248, 161, 218, 1, 219, 141, 249, 55, 16, - 248, 161, 212, 175, 249, 55, 16, 248, 161, 225, 107, 249, 55, 16, 248, - 161, 213, 179, 222, 143, 1, 155, 222, 143, 1, 224, 29, 222, 143, 1, 224, - 146, 222, 143, 1, 234, 123, 222, 143, 1, 233, 160, 222, 143, 1, 217, 71, - 222, 143, 1, 247, 174, 222, 143, 1, 247, 16, 222, 143, 1, 225, 214, 222, - 143, 1, 215, 109, 222, 143, 1, 189, 222, 143, 1, 202, 233, 222, 143, 1, - 240, 136, 222, 143, 1, 176, 222, 143, 1, 161, 222, 143, 1, 212, 150, 222, - 143, 1, 213, 6, 222, 143, 1, 235, 239, 222, 143, 1, 235, 95, 222, 143, 1, - 249, 145, 222, 143, 1, 248, 137, 222, 143, 1, 166, 222, 143, 1, 219, 2, - 222, 143, 1, 201, 113, 222, 143, 1, 201, 103, 222, 143, 1, 237, 156, 222, - 143, 1, 164, 222, 143, 1, 169, 222, 143, 1, 172, 222, 143, 1, 142, 222, - 143, 1, 232, 25, 222, 143, 1, 199, 152, 222, 143, 1, 183, 222, 143, 1, - 207, 50, 222, 143, 1, 197, 166, 222, 143, 1, 63, 222, 143, 204, 152, 1, - 164, 222, 143, 204, 152, 1, 169, 222, 143, 18, 2, 252, 168, 222, 143, 18, - 2, 68, 222, 143, 18, 2, 72, 222, 143, 18, 2, 214, 102, 222, 143, 18, 2, - 66, 222, 143, 18, 2, 199, 245, 222, 143, 18, 2, 69, 222, 143, 108, 2, - 225, 80, 222, 143, 108, 2, 221, 136, 222, 143, 108, 2, 159, 222, 143, - 108, 2, 218, 55, 222, 143, 108, 2, 214, 3, 222, 143, 108, 2, 144, 222, - 143, 108, 2, 203, 216, 222, 143, 108, 2, 215, 81, 222, 143, 108, 2, 225, - 13, 222, 143, 2, 210, 207, 222, 143, 2, 215, 149, 222, 143, 211, 214, - 203, 164, 222, 143, 211, 214, 215, 93, 202, 125, 203, 164, 222, 143, 211, - 214, 247, 25, 222, 143, 211, 214, 201, 95, 247, 25, 222, 143, 211, 214, - 201, 94, 222, 143, 17, 195, 79, 222, 143, 17, 100, 222, 143, 17, 102, - 222, 143, 17, 134, 222, 143, 17, 136, 222, 143, 17, 146, 222, 143, 17, - 167, 222, 143, 17, 178, 222, 143, 17, 171, 222, 143, 17, 182, 222, 143, - 1, 201, 78, 222, 143, 1, 201, 66, 222, 143, 1, 240, 41, 214, 135, 245, - 68, 17, 195, 79, 214, 135, 245, 68, 17, 100, 214, 135, 245, 68, 17, 102, - 214, 135, 245, 68, 17, 134, 214, 135, 245, 68, 17, 136, 214, 135, 245, - 68, 17, 146, 214, 135, 245, 68, 17, 167, 214, 135, 245, 68, 17, 178, 214, - 135, 245, 68, 17, 171, 214, 135, 245, 68, 17, 182, 214, 135, 245, 68, 1, - 172, 214, 135, 245, 68, 1, 250, 168, 214, 135, 245, 68, 1, 251, 217, 214, - 135, 245, 68, 1, 251, 97, 214, 135, 245, 68, 1, 251, 173, 214, 135, 245, - 68, 1, 223, 82, 214, 135, 245, 68, 1, 252, 130, 214, 135, 245, 68, 1, - 252, 131, 214, 135, 245, 68, 1, 252, 129, 214, 135, 245, 68, 1, 252, 123, - 214, 135, 245, 68, 1, 222, 109, 214, 135, 245, 68, 1, 225, 248, 214, 135, - 245, 68, 1, 226, 121, 214, 135, 245, 68, 1, 226, 14, 214, 135, 245, 68, - 1, 226, 1, 214, 135, 245, 68, 1, 221, 191, 214, 135, 245, 68, 1, 200, - 106, 214, 135, 245, 68, 1, 200, 104, 214, 135, 245, 68, 1, 200, 42, 214, - 135, 245, 68, 1, 199, 237, 214, 135, 245, 68, 1, 222, 197, 214, 135, 245, - 68, 1, 236, 183, 214, 135, 245, 68, 1, 237, 57, 214, 135, 245, 68, 1, - 236, 230, 214, 135, 245, 68, 1, 236, 155, 214, 135, 245, 68, 1, 222, 7, - 214, 135, 245, 68, 1, 214, 44, 214, 135, 245, 68, 1, 214, 186, 214, 135, - 245, 68, 1, 214, 29, 214, 135, 245, 68, 1, 214, 149, 214, 135, 245, 68, - 218, 146, 201, 43, 214, 135, 245, 68, 234, 118, 201, 44, 214, 135, 245, - 68, 218, 140, 201, 44, 214, 135, 245, 68, 210, 137, 214, 135, 245, 68, - 213, 4, 214, 135, 245, 68, 251, 208, 214, 135, 245, 68, 211, 214, 218, - 136, 214, 135, 245, 68, 211, 214, 52, 218, 136, 40, 4, 1, 209, 185, 199, - 118, 40, 4, 1, 221, 233, 239, 252, 40, 4, 1, 217, 210, 72, 40, 4, 1, 197, - 62, 236, 151, 40, 4, 1, 203, 120, 203, 68, 40, 4, 1, 202, 150, 203, 68, - 40, 4, 1, 203, 120, 232, 173, 55, 40, 4, 1, 203, 120, 196, 84, 40, 4, 1, - 200, 67, 200, 87, 94, 218, 147, 6, 1, 251, 106, 94, 218, 147, 6, 1, 249, - 93, 94, 218, 147, 6, 1, 234, 93, 94, 218, 147, 6, 1, 239, 6, 94, 218, - 147, 6, 1, 236, 230, 94, 218, 147, 6, 1, 199, 16, 94, 218, 147, 6, 1, - 195, 82, 94, 218, 147, 6, 1, 203, 114, 94, 218, 147, 6, 1, 226, 86, 94, - 218, 147, 6, 1, 225, 17, 94, 218, 147, 6, 1, 222, 222, 94, 218, 147, 6, - 1, 220, 62, 94, 218, 147, 6, 1, 217, 211, 94, 218, 147, 6, 1, 214, 119, - 94, 218, 147, 6, 1, 213, 157, 94, 218, 147, 6, 1, 195, 70, 94, 218, 147, - 6, 1, 210, 229, 94, 218, 147, 6, 1, 208, 219, 94, 218, 147, 6, 1, 203, - 101, 94, 218, 147, 6, 1, 200, 72, 94, 218, 147, 6, 1, 212, 254, 94, 218, - 147, 6, 1, 224, 134, 94, 218, 147, 6, 1, 233, 221, 94, 218, 147, 6, 1, - 211, 144, 94, 218, 147, 6, 1, 206, 211, 94, 218, 147, 6, 1, 245, 62, 94, - 218, 147, 6, 1, 247, 142, 94, 218, 147, 6, 1, 225, 162, 94, 218, 147, 6, - 1, 245, 0, 94, 218, 147, 6, 1, 247, 0, 94, 218, 147, 6, 1, 196, 206, 94, - 218, 147, 6, 1, 225, 177, 94, 218, 147, 6, 1, 232, 242, 94, 218, 147, 6, - 1, 232, 147, 94, 218, 147, 6, 1, 232, 58, 94, 218, 147, 6, 1, 197, 109, - 94, 218, 147, 6, 1, 232, 175, 94, 218, 147, 6, 1, 231, 181, 94, 218, 147, - 6, 1, 235, 153, 94, 218, 147, 6, 1, 196, 5, 94, 218, 147, 6, 1, 236, 249, - 94, 218, 147, 6, 1, 163, 234, 93, 94, 218, 147, 6, 1, 251, 194, 94, 218, - 147, 6, 1, 251, 234, 94, 218, 147, 6, 1, 232, 173, 55, 94, 218, 147, 6, - 1, 223, 73, 55, 204, 110, 211, 214, 248, 161, 204, 79, 204, 110, 211, - 214, 248, 161, 213, 180, 204, 110, 211, 214, 248, 161, 211, 201, 204, - 110, 211, 214, 248, 161, 247, 159, 204, 110, 211, 214, 248, 161, 222, - 133, 208, 198, 204, 110, 211, 214, 248, 161, 225, 70, 208, 198, 204, 110, - 211, 214, 248, 161, 240, 137, 208, 198, 204, 110, 211, 214, 248, 161, - 249, 146, 208, 198, 199, 115, 152, 224, 243, 199, 115, 152, 207, 16, 199, - 115, 152, 212, 29, 199, 115, 2, 216, 191, 199, 115, 2, 196, 106, 219, 61, - 204, 70, 199, 115, 152, 196, 106, 251, 213, 226, 73, 204, 70, 199, 115, - 152, 196, 106, 226, 73, 204, 70, 199, 115, 152, 196, 106, 224, 231, 226, - 73, 204, 70, 199, 115, 152, 247, 136, 60, 199, 115, 152, 196, 106, 224, - 231, 226, 73, 204, 71, 208, 165, 199, 115, 152, 52, 204, 70, 199, 115, - 152, 201, 165, 204, 70, 199, 115, 152, 224, 231, 251, 53, 199, 115, 152, - 76, 60, 199, 115, 152, 99, 238, 251, 60, 199, 115, 152, 115, 238, 251, - 60, 199, 115, 152, 210, 10, 224, 242, 226, 73, 204, 70, 199, 115, 152, - 250, 165, 226, 73, 204, 70, 199, 115, 2, 199, 3, 204, 70, 199, 115, 2, - 199, 3, 200, 101, 199, 115, 2, 210, 89, 199, 3, 200, 101, 199, 115, 2, - 199, 3, 251, 53, 199, 115, 2, 210, 89, 199, 3, 251, 53, 199, 115, 2, 199, - 3, 200, 102, 3, 203, 135, 199, 115, 2, 199, 3, 251, 54, 3, 203, 135, 199, - 115, 2, 251, 52, 251, 68, 199, 115, 2, 251, 52, 249, 112, 199, 115, 2, - 251, 52, 199, 142, 199, 115, 2, 251, 52, 199, 143, 3, 203, 135, 199, 115, - 2, 202, 58, 199, 115, 2, 232, 83, 181, 251, 51, 199, 115, 2, 181, 251, - 51, 199, 115, 2, 209, 142, 181, 251, 51, 199, 115, 2, 251, 52, 200, 108, - 218, 127, 199, 115, 2, 250, 247, 199, 115, 2, 209, 194, 250, 247, 199, - 115, 152, 247, 136, 57, 199, 115, 2, 225, 165, 199, 115, 2, 200, 34, 199, - 115, 2, 250, 163, 199, 115, 152, 210, 3, 57, 199, 115, 152, 52, 210, 3, - 57, 199, 115, 2, 52, 251, 52, 251, 68, 8, 1, 4, 6, 63, 8, 1, 4, 6, 251, - 245, 8, 4, 1, 163, 251, 245, 8, 1, 4, 6, 249, 74, 250, 112, 8, 1, 4, 6, - 247, 207, 8, 1, 4, 6, 240, 231, 8, 1, 4, 6, 236, 121, 8, 1, 4, 6, 69, 8, - 4, 1, 163, 192, 69, 8, 4, 1, 163, 68, 8, 1, 4, 6, 225, 217, 8, 1, 4, 6, - 225, 80, 8, 1, 4, 6, 223, 100, 3, 106, 8, 1, 4, 6, 221, 136, 8, 1, 4, 6, - 210, 89, 218, 55, 8, 1, 4, 6, 72, 8, 1, 4, 6, 192, 72, 8, 4, 1, 206, 96, - 72, 8, 4, 1, 206, 96, 192, 72, 8, 4, 1, 206, 96, 177, 3, 106, 8, 4, 1, - 163, 214, 164, 8, 1, 4, 6, 214, 39, 8, 4, 1, 201, 243, 157, 72, 8, 4, 1, - 248, 85, 157, 72, 8, 1, 4, 6, 214, 3, 8, 1, 4, 6, 210, 89, 144, 8, 1, 4, - 6, 163, 144, 8, 1, 4, 6, 203, 216, 8, 1, 4, 6, 66, 8, 4, 1, 206, 96, 66, - 8, 4, 1, 206, 96, 239, 148, 66, 8, 4, 1, 206, 96, 163, 221, 136, 8, 1, 4, - 6, 199, 230, 8, 1, 4, 6, 197, 199, 8, 1, 4, 6, 195, 158, 8, 1, 4, 6, 236, - 52, 8, 1, 198, 244, 222, 223, 205, 119, 8, 1, 251, 194, 32, 1, 4, 6, 234, - 94, 32, 1, 4, 6, 222, 245, 32, 1, 4, 6, 212, 220, 32, 1, 4, 6, 210, 74, - 32, 1, 4, 6, 211, 238, 40, 1, 4, 6, 237, 7, 73, 1, 6, 63, 73, 1, 6, 251, - 245, 73, 1, 6, 250, 112, 73, 1, 6, 249, 74, 250, 112, 73, 1, 6, 240, 231, - 73, 1, 6, 69, 73, 1, 6, 210, 89, 69, 73, 1, 6, 234, 190, 73, 1, 6, 233, - 15, 73, 1, 6, 68, 73, 1, 6, 225, 217, 73, 1, 6, 225, 80, 73, 1, 6, 159, - 73, 1, 6, 221, 136, 73, 1, 6, 218, 55, 73, 1, 6, 210, 89, 218, 55, 73, 1, - 6, 72, 73, 1, 6, 214, 39, 73, 1, 6, 214, 3, 73, 1, 6, 144, 73, 1, 6, 203, - 216, 73, 1, 6, 66, 73, 1, 6, 197, 199, 73, 1, 4, 63, 73, 1, 4, 163, 63, - 73, 1, 4, 251, 134, 73, 1, 4, 163, 251, 245, 73, 1, 4, 250, 112, 73, 1, - 4, 240, 231, 73, 1, 4, 69, 73, 1, 4, 208, 163, 73, 1, 4, 192, 69, 73, 1, - 4, 163, 192, 69, 73, 1, 4, 234, 190, 73, 1, 4, 163, 68, 73, 1, 4, 225, - 80, 73, 1, 4, 221, 136, 73, 1, 4, 236, 215, 73, 1, 4, 72, 73, 1, 4, 192, - 72, 73, 1, 4, 201, 243, 157, 72, 73, 1, 4, 248, 85, 157, 72, 73, 1, 4, - 214, 3, 73, 1, 4, 203, 216, 73, 1, 4, 66, 73, 1, 4, 206, 96, 66, 73, 1, - 4, 163, 221, 136, 73, 1, 4, 199, 230, 73, 1, 4, 251, 194, 73, 1, 4, 248, - 206, 73, 1, 4, 32, 234, 94, 73, 1, 4, 239, 212, 73, 1, 4, 32, 212, 246, - 73, 1, 4, 245, 75, 8, 204, 143, 4, 1, 68, 8, 204, 143, 4, 1, 144, 8, 204, - 143, 4, 1, 66, 8, 204, 143, 4, 1, 199, 230, 32, 204, 143, 4, 1, 248, 206, - 32, 204, 143, 4, 1, 234, 94, 32, 204, 143, 4, 1, 210, 74, 32, 204, 143, - 4, 1, 212, 246, 32, 204, 143, 4, 1, 245, 75, 8, 4, 1, 200, 99, 8, 4, 1, - 74, 3, 112, 202, 84, 8, 4, 1, 240, 232, 3, 112, 202, 84, 8, 4, 1, 236, - 50, 3, 112, 202, 84, 8, 4, 1, 221, 137, 3, 112, 202, 84, 8, 4, 1, 218, - 56, 3, 112, 202, 84, 8, 4, 1, 214, 4, 3, 112, 202, 84, 8, 4, 1, 211, 32, - 3, 112, 202, 84, 8, 4, 1, 211, 32, 3, 235, 109, 26, 112, 202, 84, 8, 4, - 1, 209, 81, 3, 112, 202, 84, 8, 4, 1, 203, 217, 3, 112, 202, 84, 8, 4, 1, - 195, 159, 3, 112, 202, 84, 8, 4, 1, 163, 234, 190, 73, 1, 40, 236, 230, - 8, 4, 1, 226, 39, 234, 190, 8, 4, 1, 202, 236, 3, 204, 200, 8, 4, 6, 1, - 230, 249, 3, 106, 8, 4, 1, 226, 8, 3, 106, 8, 4, 1, 214, 4, 3, 106, 8, 4, - 6, 1, 118, 3, 106, 8, 4, 1, 200, 29, 3, 106, 8, 4, 1, 74, 3, 213, 215, - 122, 8, 4, 1, 240, 232, 3, 213, 215, 122, 8, 4, 1, 236, 50, 3, 213, 215, - 122, 8, 4, 1, 234, 191, 3, 213, 215, 122, 8, 4, 1, 225, 81, 3, 213, 215, - 122, 8, 4, 1, 223, 100, 3, 213, 215, 122, 8, 4, 1, 221, 137, 3, 213, 215, - 122, 8, 4, 1, 218, 56, 3, 213, 215, 122, 8, 4, 1, 214, 4, 3, 213, 215, - 122, 8, 4, 1, 211, 32, 3, 213, 215, 122, 8, 4, 1, 209, 81, 3, 213, 215, - 122, 8, 4, 1, 236, 142, 3, 213, 215, 122, 8, 4, 1, 199, 231, 3, 213, 215, - 122, 8, 4, 1, 196, 223, 3, 213, 215, 122, 8, 4, 1, 195, 159, 3, 213, 215, - 122, 8, 4, 1, 39, 3, 210, 95, 122, 8, 4, 1, 251, 135, 3, 210, 95, 122, 8, - 4, 1, 240, 232, 3, 231, 165, 26, 203, 135, 8, 4, 1, 237, 136, 3, 210, 95, - 122, 8, 4, 1, 192, 237, 136, 3, 210, 95, 122, 8, 4, 1, 210, 89, 192, 237, - 136, 3, 210, 95, 122, 8, 4, 1, 208, 164, 3, 210, 95, 122, 8, 4, 1, 230, - 249, 3, 210, 95, 122, 8, 4, 1, 192, 177, 3, 210, 95, 122, 8, 4, 1, 236, - 142, 3, 210, 95, 122, 8, 4, 1, 118, 3, 210, 95, 122, 8, 4, 1, 236, 53, 3, - 210, 95, 122, 73, 1, 4, 163, 251, 134, 73, 1, 4, 247, 207, 73, 1, 4, 247, - 208, 3, 241, 21, 73, 1, 4, 236, 121, 73, 1, 4, 210, 89, 192, 69, 73, 1, - 4, 236, 49, 73, 1, 4, 238, 252, 225, 218, 3, 106, 73, 1, 4, 145, 234, - 190, 73, 1, 4, 163, 233, 15, 73, 1, 4, 230, 249, 3, 106, 73, 1, 4, 226, - 7, 73, 1, 4, 6, 68, 73, 1, 4, 6, 230, 249, 3, 106, 73, 1, 4, 225, 218, 3, - 241, 57, 73, 1, 4, 223, 100, 3, 210, 95, 122, 73, 1, 4, 223, 100, 3, 213, - 215, 122, 73, 1, 4, 6, 159, 73, 1, 4, 221, 137, 3, 122, 73, 1, 4, 163, - 221, 137, 3, 181, 222, 172, 73, 1, 4, 218, 56, 3, 50, 122, 73, 1, 4, 218, - 56, 3, 210, 95, 122, 73, 1, 4, 6, 218, 55, 73, 1, 4, 249, 74, 72, 73, 1, - 4, 212, 246, 73, 1, 4, 209, 81, 3, 122, 73, 1, 4, 236, 141, 73, 1, 4, - 203, 217, 3, 213, 215, 122, 73, 1, 4, 118, 154, 73, 1, 4, 200, 28, 73, 1, - 4, 6, 66, 73, 1, 4, 199, 231, 3, 122, 73, 1, 4, 163, 199, 230, 73, 1, 4, - 195, 158, 73, 1, 4, 195, 159, 3, 210, 95, 122, 73, 1, 4, 195, 159, 3, - 241, 21, 73, 1, 4, 236, 52, 73, 1, 4, 202, 199, 38, 237, 250, 233, 101, - 252, 22, 38, 237, 250, 252, 10, 252, 22, 38, 205, 213, 60, 38, 204, 77, - 78, 38, 220, 113, 38, 233, 98, 38, 220, 111, 38, 252, 8, 38, 233, 99, 38, - 252, 9, 38, 8, 4, 1, 211, 32, 60, 38, 248, 46, 38, 220, 112, 38, 52, 244, - 241, 57, 38, 214, 152, 57, 38, 195, 24, 60, 38, 225, 249, 60, 38, 200, - 22, 57, 38, 200, 5, 57, 38, 8, 4, 1, 235, 79, 192, 39, 57, 38, 8, 4, 1, - 251, 245, 38, 8, 4, 1, 251, 49, 38, 8, 4, 1, 250, 133, 38, 8, 4, 1, 247, - 208, 247, 50, 38, 8, 4, 1, 226, 39, 240, 231, 38, 8, 4, 1, 236, 121, 38, - 8, 4, 1, 234, 190, 38, 8, 1, 4, 6, 234, 190, 38, 8, 4, 1, 225, 80, 38, 8, - 4, 1, 159, 38, 8, 1, 4, 6, 159, 38, 8, 1, 4, 6, 221, 136, 38, 8, 4, 1, - 218, 55, 38, 8, 1, 4, 6, 218, 55, 38, 8, 1, 4, 6, 144, 38, 8, 4, 1, 211, - 32, 209, 188, 38, 8, 4, 1, 209, 80, 38, 8, 4, 1, 181, 209, 80, 38, 8, 4, - 1, 195, 158, 38, 8, 4, 1, 251, 134, 38, 8, 4, 1, 250, 112, 38, 8, 4, 1, - 248, 206, 38, 8, 4, 1, 208, 163, 38, 8, 4, 1, 236, 49, 38, 8, 4, 1, 223, - 100, 3, 52, 112, 202, 84, 38, 8, 4, 1, 177, 3, 175, 247, 38, 106, 38, 8, - 4, 1, 214, 3, 38, 8, 4, 1, 236, 141, 38, 8, 4, 1, 118, 3, 175, 247, 38, - 106, 38, 8, 4, 1, 197, 199, 38, 8, 4, 1, 39, 3, 239, 150, 38, 8, 4, 1, - 177, 3, 239, 150, 38, 8, 4, 1, 118, 3, 239, 150, 38, 124, 203, 148, 57, - 38, 224, 222, 90, 210, 22, 38, 224, 222, 90, 222, 184, 38, 76, 90, 222, - 184, 38, 197, 62, 226, 17, 248, 40, 60, 38, 239, 221, 78, 38, 52, 226, - 17, 248, 48, 60, 38, 251, 139, 180, 202, 30, 60, 38, 50, 250, 218, 57, - 38, 53, 250, 218, 26, 135, 250, 218, 60, 8, 6, 1, 39, 3, 210, 3, 60, 8, - 4, 1, 39, 3, 210, 3, 60, 8, 6, 1, 74, 3, 76, 57, 8, 4, 1, 74, 3, 76, 57, - 8, 6, 1, 74, 3, 76, 60, 8, 4, 1, 74, 3, 76, 60, 8, 6, 1, 74, 3, 222, 76, - 60, 8, 4, 1, 74, 3, 222, 76, 60, 8, 6, 1, 247, 208, 3, 247, 51, 26, 186, - 8, 4, 1, 247, 208, 3, 247, 51, 26, 186, 8, 6, 1, 240, 232, 3, 76, 57, 8, - 4, 1, 240, 232, 3, 76, 57, 8, 6, 1, 240, 232, 3, 76, 60, 8, 4, 1, 240, - 232, 3, 76, 60, 8, 6, 1, 240, 232, 3, 222, 76, 60, 8, 4, 1, 240, 232, 3, - 222, 76, 60, 8, 6, 1, 240, 232, 3, 247, 50, 8, 4, 1, 240, 232, 3, 247, - 50, 8, 6, 1, 240, 232, 3, 244, 241, 60, 8, 4, 1, 240, 232, 3, 244, 241, - 60, 8, 6, 1, 237, 136, 3, 220, 115, 26, 233, 100, 8, 4, 1, 237, 136, 3, - 220, 115, 26, 233, 100, 8, 6, 1, 237, 136, 3, 220, 115, 26, 186, 8, 4, 1, - 237, 136, 3, 220, 115, 26, 186, 8, 6, 1, 237, 136, 3, 244, 241, 60, 8, 4, - 1, 237, 136, 3, 244, 241, 60, 8, 6, 1, 237, 136, 3, 202, 85, 60, 8, 4, 1, - 237, 136, 3, 202, 85, 60, 8, 6, 1, 237, 136, 3, 247, 51, 26, 248, 47, 8, - 4, 1, 237, 136, 3, 247, 51, 26, 248, 47, 8, 6, 1, 236, 50, 3, 76, 57, 8, - 4, 1, 236, 50, 3, 76, 57, 8, 6, 1, 234, 191, 3, 220, 114, 8, 4, 1, 234, - 191, 3, 220, 114, 8, 6, 1, 233, 16, 3, 76, 57, 8, 4, 1, 233, 16, 3, 76, - 57, 8, 6, 1, 233, 16, 3, 76, 60, 8, 4, 1, 233, 16, 3, 76, 60, 8, 6, 1, - 233, 16, 3, 239, 150, 8, 4, 1, 233, 16, 3, 239, 150, 8, 6, 1, 233, 16, 3, - 247, 50, 8, 4, 1, 233, 16, 3, 247, 50, 8, 6, 1, 233, 16, 3, 248, 48, 60, - 8, 4, 1, 233, 16, 3, 248, 48, 60, 8, 6, 1, 230, 249, 3, 202, 85, 60, 8, - 4, 1, 230, 249, 3, 202, 85, 60, 8, 6, 1, 230, 249, 3, 239, 151, 26, 186, - 8, 4, 1, 230, 249, 3, 239, 151, 26, 186, 8, 6, 1, 225, 81, 3, 186, 8, 4, - 1, 225, 81, 3, 186, 8, 6, 1, 225, 81, 3, 76, 60, 8, 4, 1, 225, 81, 3, 76, - 60, 8, 6, 1, 225, 81, 3, 222, 76, 60, 8, 4, 1, 225, 81, 3, 222, 76, 60, - 8, 6, 1, 223, 100, 3, 76, 60, 8, 4, 1, 223, 100, 3, 76, 60, 8, 6, 1, 223, - 100, 3, 76, 248, 227, 26, 220, 114, 8, 4, 1, 223, 100, 3, 76, 248, 227, - 26, 220, 114, 8, 6, 1, 223, 100, 3, 222, 76, 60, 8, 4, 1, 223, 100, 3, - 222, 76, 60, 8, 6, 1, 223, 100, 3, 244, 241, 60, 8, 4, 1, 223, 100, 3, - 244, 241, 60, 8, 6, 1, 221, 137, 3, 186, 8, 4, 1, 221, 137, 3, 186, 8, 6, - 1, 221, 137, 3, 76, 57, 8, 4, 1, 221, 137, 3, 76, 57, 8, 6, 1, 221, 137, - 3, 76, 60, 8, 4, 1, 221, 137, 3, 76, 60, 8, 6, 1, 218, 56, 3, 76, 57, 8, - 4, 1, 218, 56, 3, 76, 57, 8, 6, 1, 218, 56, 3, 76, 60, 8, 4, 1, 218, 56, - 3, 76, 60, 8, 6, 1, 218, 56, 3, 222, 76, 60, 8, 4, 1, 218, 56, 3, 222, - 76, 60, 8, 6, 1, 218, 56, 3, 244, 241, 60, 8, 4, 1, 218, 56, 3, 244, 241, - 60, 8, 6, 1, 177, 3, 202, 85, 26, 186, 8, 4, 1, 177, 3, 202, 85, 26, 186, - 8, 6, 1, 177, 3, 202, 85, 26, 239, 150, 8, 4, 1, 177, 3, 202, 85, 26, - 239, 150, 8, 6, 1, 177, 3, 220, 115, 26, 233, 100, 8, 4, 1, 177, 3, 220, - 115, 26, 233, 100, 8, 6, 1, 177, 3, 220, 115, 26, 186, 8, 4, 1, 177, 3, - 220, 115, 26, 186, 8, 6, 1, 214, 4, 3, 186, 8, 4, 1, 214, 4, 3, 186, 8, - 6, 1, 214, 4, 3, 76, 57, 8, 4, 1, 214, 4, 3, 76, 57, 8, 6, 1, 211, 32, 3, - 76, 57, 8, 4, 1, 211, 32, 3, 76, 57, 8, 6, 1, 211, 32, 3, 76, 60, 8, 4, - 1, 211, 32, 3, 76, 60, 8, 6, 1, 211, 32, 3, 76, 248, 227, 26, 220, 114, - 8, 4, 1, 211, 32, 3, 76, 248, 227, 26, 220, 114, 8, 6, 1, 211, 32, 3, - 222, 76, 60, 8, 4, 1, 211, 32, 3, 222, 76, 60, 8, 6, 1, 209, 81, 3, 76, - 57, 8, 4, 1, 209, 81, 3, 76, 57, 8, 6, 1, 209, 81, 3, 76, 60, 8, 4, 1, - 209, 81, 3, 76, 60, 8, 6, 1, 209, 81, 3, 252, 10, 26, 76, 57, 8, 4, 1, - 209, 81, 3, 252, 10, 26, 76, 57, 8, 6, 1, 209, 81, 3, 247, 107, 26, 76, - 57, 8, 4, 1, 209, 81, 3, 247, 107, 26, 76, 57, 8, 6, 1, 209, 81, 3, 76, - 248, 227, 26, 76, 57, 8, 4, 1, 209, 81, 3, 76, 248, 227, 26, 76, 57, 8, - 6, 1, 203, 217, 3, 76, 57, 8, 4, 1, 203, 217, 3, 76, 57, 8, 6, 1, 203, - 217, 3, 76, 60, 8, 4, 1, 203, 217, 3, 76, 60, 8, 6, 1, 203, 217, 3, 222, - 76, 60, 8, 4, 1, 203, 217, 3, 222, 76, 60, 8, 6, 1, 203, 217, 3, 244, - 241, 60, 8, 4, 1, 203, 217, 3, 244, 241, 60, 8, 6, 1, 118, 3, 239, 151, - 60, 8, 4, 1, 118, 3, 239, 151, 60, 8, 6, 1, 118, 3, 202, 85, 60, 8, 4, 1, - 118, 3, 202, 85, 60, 8, 6, 1, 118, 3, 244, 241, 60, 8, 4, 1, 118, 3, 244, - 241, 60, 8, 6, 1, 118, 3, 202, 85, 26, 186, 8, 4, 1, 118, 3, 202, 85, 26, - 186, 8, 6, 1, 118, 3, 220, 115, 26, 239, 150, 8, 4, 1, 118, 3, 220, 115, - 26, 239, 150, 8, 6, 1, 199, 231, 3, 202, 84, 8, 4, 1, 199, 231, 3, 202, - 84, 8, 6, 1, 199, 231, 3, 76, 60, 8, 4, 1, 199, 231, 3, 76, 60, 8, 6, 1, - 197, 200, 3, 233, 100, 8, 4, 1, 197, 200, 3, 233, 100, 8, 6, 1, 197, 200, - 3, 186, 8, 4, 1, 197, 200, 3, 186, 8, 6, 1, 197, 200, 3, 239, 150, 8, 4, - 1, 197, 200, 3, 239, 150, 8, 6, 1, 197, 200, 3, 76, 57, 8, 4, 1, 197, - 200, 3, 76, 57, 8, 6, 1, 197, 200, 3, 76, 60, 8, 4, 1, 197, 200, 3, 76, - 60, 8, 6, 1, 196, 223, 3, 76, 57, 8, 4, 1, 196, 223, 3, 76, 57, 8, 6, 1, - 196, 223, 3, 239, 150, 8, 4, 1, 196, 223, 3, 239, 150, 8, 6, 1, 196, 149, - 3, 76, 57, 8, 4, 1, 196, 149, 3, 76, 57, 8, 6, 1, 195, 159, 3, 244, 240, - 8, 4, 1, 195, 159, 3, 244, 240, 8, 6, 1, 195, 159, 3, 76, 60, 8, 4, 1, - 195, 159, 3, 76, 60, 8, 6, 1, 195, 159, 3, 222, 76, 60, 8, 4, 1, 195, - 159, 3, 222, 76, 60, 8, 4, 1, 233, 16, 3, 222, 76, 60, 8, 4, 1, 203, 217, - 3, 239, 150, 8, 4, 1, 197, 200, 3, 210, 3, 57, 8, 4, 1, 196, 149, 3, 210, - 3, 57, 8, 4, 1, 39, 3, 53, 157, 210, 2, 8, 4, 1, 181, 209, 81, 3, 76, 57, - 8, 4, 1, 181, 209, 81, 3, 239, 147, 106, 8, 4, 1, 181, 209, 81, 3, 130, - 106, 8, 6, 1, 207, 13, 209, 80, 8, 4, 1, 239, 212, 8, 6, 1, 39, 3, 76, - 60, 8, 4, 1, 39, 3, 76, 60, 8, 6, 1, 39, 3, 231, 165, 57, 8, 4, 1, 39, 3, - 231, 165, 57, 8, 6, 1, 39, 3, 244, 241, 26, 186, 8, 4, 1, 39, 3, 244, - 241, 26, 186, 8, 6, 1, 39, 3, 244, 241, 26, 233, 100, 8, 4, 1, 39, 3, - 244, 241, 26, 233, 100, 8, 6, 1, 39, 3, 244, 241, 26, 231, 165, 57, 8, 4, - 1, 39, 3, 244, 241, 26, 231, 165, 57, 8, 6, 1, 39, 3, 244, 241, 26, 202, - 84, 8, 4, 1, 39, 3, 244, 241, 26, 202, 84, 8, 6, 1, 39, 3, 244, 241, 26, - 76, 60, 8, 4, 1, 39, 3, 244, 241, 26, 76, 60, 8, 6, 1, 39, 3, 248, 48, - 26, 186, 8, 4, 1, 39, 3, 248, 48, 26, 186, 8, 6, 1, 39, 3, 248, 48, 26, - 233, 100, 8, 4, 1, 39, 3, 248, 48, 26, 233, 100, 8, 6, 1, 39, 3, 248, 48, - 26, 231, 165, 57, 8, 4, 1, 39, 3, 248, 48, 26, 231, 165, 57, 8, 6, 1, 39, - 3, 248, 48, 26, 202, 84, 8, 4, 1, 39, 3, 248, 48, 26, 202, 84, 8, 6, 1, - 39, 3, 248, 48, 26, 76, 60, 8, 4, 1, 39, 3, 248, 48, 26, 76, 60, 8, 6, 1, - 237, 136, 3, 76, 60, 8, 4, 1, 237, 136, 3, 76, 60, 8, 6, 1, 237, 136, 3, - 231, 165, 57, 8, 4, 1, 237, 136, 3, 231, 165, 57, 8, 6, 1, 237, 136, 3, - 202, 84, 8, 4, 1, 237, 136, 3, 202, 84, 8, 6, 1, 237, 136, 3, 244, 241, - 26, 186, 8, 4, 1, 237, 136, 3, 244, 241, 26, 186, 8, 6, 1, 237, 136, 3, - 244, 241, 26, 233, 100, 8, 4, 1, 237, 136, 3, 244, 241, 26, 233, 100, 8, - 6, 1, 237, 136, 3, 244, 241, 26, 231, 165, 57, 8, 4, 1, 237, 136, 3, 244, - 241, 26, 231, 165, 57, 8, 6, 1, 237, 136, 3, 244, 241, 26, 202, 84, 8, 4, - 1, 237, 136, 3, 244, 241, 26, 202, 84, 8, 6, 1, 237, 136, 3, 244, 241, - 26, 76, 60, 8, 4, 1, 237, 136, 3, 244, 241, 26, 76, 60, 8, 6, 1, 230, - 249, 3, 231, 165, 57, 8, 4, 1, 230, 249, 3, 231, 165, 57, 8, 6, 1, 230, - 249, 3, 76, 60, 8, 4, 1, 230, 249, 3, 76, 60, 8, 6, 1, 177, 3, 76, 60, 8, - 4, 1, 177, 3, 76, 60, 8, 6, 1, 177, 3, 231, 165, 57, 8, 4, 1, 177, 3, - 231, 165, 57, 8, 6, 1, 177, 3, 244, 241, 26, 186, 8, 4, 1, 177, 3, 244, - 241, 26, 186, 8, 6, 1, 177, 3, 244, 241, 26, 233, 100, 8, 4, 1, 177, 3, - 244, 241, 26, 233, 100, 8, 6, 1, 177, 3, 244, 241, 26, 231, 165, 57, 8, - 4, 1, 177, 3, 244, 241, 26, 231, 165, 57, 8, 6, 1, 177, 3, 244, 241, 26, - 202, 84, 8, 4, 1, 177, 3, 244, 241, 26, 202, 84, 8, 6, 1, 177, 3, 244, - 241, 26, 76, 60, 8, 4, 1, 177, 3, 244, 241, 26, 76, 60, 8, 6, 1, 177, 3, - 231, 103, 26, 186, 8, 4, 1, 177, 3, 231, 103, 26, 186, 8, 6, 1, 177, 3, - 231, 103, 26, 233, 100, 8, 4, 1, 177, 3, 231, 103, 26, 233, 100, 8, 6, 1, - 177, 3, 231, 103, 26, 231, 165, 57, 8, 4, 1, 177, 3, 231, 103, 26, 231, - 165, 57, 8, 6, 1, 177, 3, 231, 103, 26, 202, 84, 8, 4, 1, 177, 3, 231, - 103, 26, 202, 84, 8, 6, 1, 177, 3, 231, 103, 26, 76, 60, 8, 4, 1, 177, 3, - 231, 103, 26, 76, 60, 8, 6, 1, 118, 3, 76, 60, 8, 4, 1, 118, 3, 76, 60, - 8, 6, 1, 118, 3, 231, 165, 57, 8, 4, 1, 118, 3, 231, 165, 57, 8, 6, 1, - 118, 3, 231, 103, 26, 186, 8, 4, 1, 118, 3, 231, 103, 26, 186, 8, 6, 1, - 118, 3, 231, 103, 26, 233, 100, 8, 4, 1, 118, 3, 231, 103, 26, 233, 100, - 8, 6, 1, 118, 3, 231, 103, 26, 231, 165, 57, 8, 4, 1, 118, 3, 231, 103, - 26, 231, 165, 57, 8, 6, 1, 118, 3, 231, 103, 26, 202, 84, 8, 4, 1, 118, - 3, 231, 103, 26, 202, 84, 8, 6, 1, 118, 3, 231, 103, 26, 76, 60, 8, 4, 1, - 118, 3, 231, 103, 26, 76, 60, 8, 6, 1, 196, 149, 3, 233, 100, 8, 4, 1, - 196, 149, 3, 233, 100, 8, 6, 1, 196, 149, 3, 76, 60, 8, 4, 1, 196, 149, - 3, 76, 60, 8, 6, 1, 196, 149, 3, 231, 165, 57, 8, 4, 1, 196, 149, 3, 231, - 165, 57, 8, 6, 1, 196, 149, 3, 202, 84, 8, 4, 1, 196, 149, 3, 202, 84, 8, - 6, 1, 219, 62, 222, 38, 8, 4, 1, 219, 62, 222, 38, 8, 6, 1, 219, 62, 199, - 230, 8, 4, 1, 219, 62, 199, 230, 8, 6, 1, 196, 149, 3, 221, 225, 8, 4, 1, - 196, 149, 3, 221, 225, 32, 4, 1, 251, 135, 3, 211, 231, 32, 4, 1, 251, - 135, 3, 240, 62, 32, 4, 1, 251, 135, 3, 211, 232, 26, 199, 133, 32, 4, 1, - 251, 135, 3, 240, 63, 26, 199, 133, 32, 4, 1, 251, 135, 3, 211, 232, 26, - 214, 9, 32, 4, 1, 251, 135, 3, 240, 63, 26, 214, 9, 32, 4, 1, 251, 135, - 3, 211, 232, 26, 213, 38, 32, 4, 1, 251, 135, 3, 240, 63, 26, 213, 38, - 32, 6, 1, 251, 135, 3, 211, 231, 32, 6, 1, 251, 135, 3, 240, 62, 32, 6, - 1, 251, 135, 3, 211, 232, 26, 199, 133, 32, 6, 1, 251, 135, 3, 240, 63, - 26, 199, 133, 32, 6, 1, 251, 135, 3, 211, 232, 26, 214, 9, 32, 6, 1, 251, - 135, 3, 240, 63, 26, 214, 9, 32, 6, 1, 251, 135, 3, 211, 232, 26, 213, - 38, 32, 6, 1, 251, 135, 3, 240, 63, 26, 213, 38, 32, 4, 1, 236, 175, 3, - 211, 231, 32, 4, 1, 236, 175, 3, 240, 62, 32, 4, 1, 236, 175, 3, 211, - 232, 26, 199, 133, 32, 4, 1, 236, 175, 3, 240, 63, 26, 199, 133, 32, 4, - 1, 236, 175, 3, 211, 232, 26, 214, 9, 32, 4, 1, 236, 175, 3, 240, 63, 26, - 214, 9, 32, 6, 1, 236, 175, 3, 211, 231, 32, 6, 1, 236, 175, 3, 240, 62, - 32, 6, 1, 236, 175, 3, 211, 232, 26, 199, 133, 32, 6, 1, 236, 175, 3, - 240, 63, 26, 199, 133, 32, 6, 1, 236, 175, 3, 211, 232, 26, 214, 9, 32, - 6, 1, 236, 175, 3, 240, 63, 26, 214, 9, 32, 4, 1, 236, 127, 3, 211, 231, - 32, 4, 1, 236, 127, 3, 240, 62, 32, 4, 1, 236, 127, 3, 211, 232, 26, 199, - 133, 32, 4, 1, 236, 127, 3, 240, 63, 26, 199, 133, 32, 4, 1, 236, 127, 3, - 211, 232, 26, 214, 9, 32, 4, 1, 236, 127, 3, 240, 63, 26, 214, 9, 32, 4, - 1, 236, 127, 3, 211, 232, 26, 213, 38, 32, 4, 1, 236, 127, 3, 240, 63, - 26, 213, 38, 32, 6, 1, 236, 127, 3, 211, 231, 32, 6, 1, 236, 127, 3, 240, - 62, 32, 6, 1, 236, 127, 3, 211, 232, 26, 199, 133, 32, 6, 1, 236, 127, 3, - 240, 63, 26, 199, 133, 32, 6, 1, 236, 127, 3, 211, 232, 26, 214, 9, 32, - 6, 1, 236, 127, 3, 240, 63, 26, 214, 9, 32, 6, 1, 236, 127, 3, 211, 232, - 26, 213, 38, 32, 6, 1, 236, 127, 3, 240, 63, 26, 213, 38, 32, 4, 1, 226, - 8, 3, 211, 231, 32, 4, 1, 226, 8, 3, 240, 62, 32, 4, 1, 226, 8, 3, 211, - 232, 26, 199, 133, 32, 4, 1, 226, 8, 3, 240, 63, 26, 199, 133, 32, 4, 1, - 226, 8, 3, 211, 232, 26, 214, 9, 32, 4, 1, 226, 8, 3, 240, 63, 26, 214, - 9, 32, 4, 1, 226, 8, 3, 211, 232, 26, 213, 38, 32, 4, 1, 226, 8, 3, 240, - 63, 26, 213, 38, 32, 6, 1, 226, 8, 3, 211, 231, 32, 6, 1, 226, 8, 3, 240, - 62, 32, 6, 1, 226, 8, 3, 211, 232, 26, 199, 133, 32, 6, 1, 226, 8, 3, - 240, 63, 26, 199, 133, 32, 6, 1, 226, 8, 3, 211, 232, 26, 214, 9, 32, 6, - 1, 226, 8, 3, 240, 63, 26, 214, 9, 32, 6, 1, 226, 8, 3, 211, 232, 26, - 213, 38, 32, 6, 1, 226, 8, 3, 240, 63, 26, 213, 38, 32, 4, 1, 214, 123, - 3, 211, 231, 32, 4, 1, 214, 123, 3, 240, 62, 32, 4, 1, 214, 123, 3, 211, - 232, 26, 199, 133, 32, 4, 1, 214, 123, 3, 240, 63, 26, 199, 133, 32, 4, - 1, 214, 123, 3, 211, 232, 26, 214, 9, 32, 4, 1, 214, 123, 3, 240, 63, 26, - 214, 9, 32, 6, 1, 214, 123, 3, 211, 231, 32, 6, 1, 214, 123, 3, 240, 62, - 32, 6, 1, 214, 123, 3, 211, 232, 26, 199, 133, 32, 6, 1, 214, 123, 3, - 240, 63, 26, 199, 133, 32, 6, 1, 214, 123, 3, 211, 232, 26, 214, 9, 32, - 6, 1, 214, 123, 3, 240, 63, 26, 214, 9, 32, 4, 1, 200, 29, 3, 211, 231, - 32, 4, 1, 200, 29, 3, 240, 62, 32, 4, 1, 200, 29, 3, 211, 232, 26, 199, - 133, 32, 4, 1, 200, 29, 3, 240, 63, 26, 199, 133, 32, 4, 1, 200, 29, 3, - 211, 232, 26, 214, 9, 32, 4, 1, 200, 29, 3, 240, 63, 26, 214, 9, 32, 4, - 1, 200, 29, 3, 211, 232, 26, 213, 38, 32, 4, 1, 200, 29, 3, 240, 63, 26, - 213, 38, 32, 6, 1, 200, 29, 3, 240, 62, 32, 6, 1, 200, 29, 3, 240, 63, - 26, 199, 133, 32, 6, 1, 200, 29, 3, 240, 63, 26, 214, 9, 32, 6, 1, 200, - 29, 3, 240, 63, 26, 213, 38, 32, 4, 1, 214, 125, 3, 211, 231, 32, 4, 1, - 214, 125, 3, 240, 62, 32, 4, 1, 214, 125, 3, 211, 232, 26, 199, 133, 32, - 4, 1, 214, 125, 3, 240, 63, 26, 199, 133, 32, 4, 1, 214, 125, 3, 211, - 232, 26, 214, 9, 32, 4, 1, 214, 125, 3, 240, 63, 26, 214, 9, 32, 4, 1, - 214, 125, 3, 211, 232, 26, 213, 38, 32, 4, 1, 214, 125, 3, 240, 63, 26, - 213, 38, 32, 6, 1, 214, 125, 3, 211, 231, 32, 6, 1, 214, 125, 3, 240, 62, - 32, 6, 1, 214, 125, 3, 211, 232, 26, 199, 133, 32, 6, 1, 214, 125, 3, - 240, 63, 26, 199, 133, 32, 6, 1, 214, 125, 3, 211, 232, 26, 214, 9, 32, - 6, 1, 214, 125, 3, 240, 63, 26, 214, 9, 32, 6, 1, 214, 125, 3, 211, 232, - 26, 213, 38, 32, 6, 1, 214, 125, 3, 240, 63, 26, 213, 38, 32, 4, 1, 251, - 135, 3, 199, 133, 32, 4, 1, 251, 135, 3, 214, 9, 32, 4, 1, 236, 175, 3, - 199, 133, 32, 4, 1, 236, 175, 3, 214, 9, 32, 4, 1, 236, 127, 3, 199, 133, - 32, 4, 1, 236, 127, 3, 214, 9, 32, 4, 1, 226, 8, 3, 199, 133, 32, 4, 1, - 226, 8, 3, 214, 9, 32, 4, 1, 214, 123, 3, 199, 133, 32, 4, 1, 214, 123, - 3, 214, 9, 32, 4, 1, 200, 29, 3, 199, 133, 32, 4, 1, 200, 29, 3, 214, 9, - 32, 4, 1, 214, 125, 3, 199, 133, 32, 4, 1, 214, 125, 3, 214, 9, 32, 4, 1, - 251, 135, 3, 211, 232, 26, 195, 225, 32, 4, 1, 251, 135, 3, 240, 63, 26, - 195, 225, 32, 4, 1, 251, 135, 3, 211, 232, 26, 199, 134, 26, 195, 225, - 32, 4, 1, 251, 135, 3, 240, 63, 26, 199, 134, 26, 195, 225, 32, 4, 1, - 251, 135, 3, 211, 232, 26, 214, 10, 26, 195, 225, 32, 4, 1, 251, 135, 3, - 240, 63, 26, 214, 10, 26, 195, 225, 32, 4, 1, 251, 135, 3, 211, 232, 26, - 213, 39, 26, 195, 225, 32, 4, 1, 251, 135, 3, 240, 63, 26, 213, 39, 26, - 195, 225, 32, 6, 1, 251, 135, 3, 211, 232, 26, 211, 245, 32, 6, 1, 251, - 135, 3, 240, 63, 26, 211, 245, 32, 6, 1, 251, 135, 3, 211, 232, 26, 199, - 134, 26, 211, 245, 32, 6, 1, 251, 135, 3, 240, 63, 26, 199, 134, 26, 211, - 245, 32, 6, 1, 251, 135, 3, 211, 232, 26, 214, 10, 26, 211, 245, 32, 6, - 1, 251, 135, 3, 240, 63, 26, 214, 10, 26, 211, 245, 32, 6, 1, 251, 135, - 3, 211, 232, 26, 213, 39, 26, 211, 245, 32, 6, 1, 251, 135, 3, 240, 63, - 26, 213, 39, 26, 211, 245, 32, 4, 1, 236, 127, 3, 211, 232, 26, 195, 225, - 32, 4, 1, 236, 127, 3, 240, 63, 26, 195, 225, 32, 4, 1, 236, 127, 3, 211, - 232, 26, 199, 134, 26, 195, 225, 32, 4, 1, 236, 127, 3, 240, 63, 26, 199, - 134, 26, 195, 225, 32, 4, 1, 236, 127, 3, 211, 232, 26, 214, 10, 26, 195, - 225, 32, 4, 1, 236, 127, 3, 240, 63, 26, 214, 10, 26, 195, 225, 32, 4, 1, - 236, 127, 3, 211, 232, 26, 213, 39, 26, 195, 225, 32, 4, 1, 236, 127, 3, - 240, 63, 26, 213, 39, 26, 195, 225, 32, 6, 1, 236, 127, 3, 211, 232, 26, - 211, 245, 32, 6, 1, 236, 127, 3, 240, 63, 26, 211, 245, 32, 6, 1, 236, - 127, 3, 211, 232, 26, 199, 134, 26, 211, 245, 32, 6, 1, 236, 127, 3, 240, - 63, 26, 199, 134, 26, 211, 245, 32, 6, 1, 236, 127, 3, 211, 232, 26, 214, - 10, 26, 211, 245, 32, 6, 1, 236, 127, 3, 240, 63, 26, 214, 10, 26, 211, - 245, 32, 6, 1, 236, 127, 3, 211, 232, 26, 213, 39, 26, 211, 245, 32, 6, - 1, 236, 127, 3, 240, 63, 26, 213, 39, 26, 211, 245, 32, 4, 1, 214, 125, - 3, 211, 232, 26, 195, 225, 32, 4, 1, 214, 125, 3, 240, 63, 26, 195, 225, - 32, 4, 1, 214, 125, 3, 211, 232, 26, 199, 134, 26, 195, 225, 32, 4, 1, - 214, 125, 3, 240, 63, 26, 199, 134, 26, 195, 225, 32, 4, 1, 214, 125, 3, - 211, 232, 26, 214, 10, 26, 195, 225, 32, 4, 1, 214, 125, 3, 240, 63, 26, - 214, 10, 26, 195, 225, 32, 4, 1, 214, 125, 3, 211, 232, 26, 213, 39, 26, - 195, 225, 32, 4, 1, 214, 125, 3, 240, 63, 26, 213, 39, 26, 195, 225, 32, - 6, 1, 214, 125, 3, 211, 232, 26, 211, 245, 32, 6, 1, 214, 125, 3, 240, - 63, 26, 211, 245, 32, 6, 1, 214, 125, 3, 211, 232, 26, 199, 134, 26, 211, - 245, 32, 6, 1, 214, 125, 3, 240, 63, 26, 199, 134, 26, 211, 245, 32, 6, - 1, 214, 125, 3, 211, 232, 26, 214, 10, 26, 211, 245, 32, 6, 1, 214, 125, - 3, 240, 63, 26, 214, 10, 26, 211, 245, 32, 6, 1, 214, 125, 3, 211, 232, - 26, 213, 39, 26, 211, 245, 32, 6, 1, 214, 125, 3, 240, 63, 26, 213, 39, - 26, 211, 245, 32, 4, 1, 251, 135, 3, 198, 224, 32, 4, 1, 251, 135, 3, - 220, 114, 32, 4, 1, 251, 135, 3, 199, 134, 26, 195, 225, 32, 4, 1, 251, - 135, 3, 195, 225, 32, 4, 1, 251, 135, 3, 214, 10, 26, 195, 225, 32, 4, 1, - 251, 135, 3, 213, 38, 32, 4, 1, 251, 135, 3, 213, 39, 26, 195, 225, 32, - 6, 1, 251, 135, 3, 198, 224, 32, 6, 1, 251, 135, 3, 220, 114, 32, 6, 1, - 251, 135, 3, 199, 133, 32, 6, 1, 251, 135, 3, 214, 9, 32, 6, 1, 251, 135, - 3, 211, 245, 32, 223, 232, 32, 211, 245, 32, 211, 231, 32, 213, 38, 32, - 239, 144, 26, 213, 38, 32, 4, 1, 236, 127, 3, 199, 134, 26, 195, 225, 32, - 4, 1, 236, 127, 3, 195, 225, 32, 4, 1, 236, 127, 3, 214, 10, 26, 195, - 225, 32, 4, 1, 236, 127, 3, 213, 38, 32, 4, 1, 236, 127, 3, 213, 39, 26, - 195, 225, 32, 6, 1, 236, 175, 3, 199, 133, 32, 6, 1, 236, 175, 3, 214, 9, - 32, 6, 1, 236, 127, 3, 199, 133, 32, 6, 1, 236, 127, 3, 214, 9, 32, 6, 1, - 236, 127, 3, 211, 245, 32, 211, 232, 26, 199, 133, 32, 211, 232, 26, 214, - 9, 32, 211, 232, 26, 213, 38, 32, 4, 1, 226, 8, 3, 198, 224, 32, 4, 1, - 226, 8, 3, 220, 114, 32, 4, 1, 226, 8, 3, 239, 144, 26, 199, 133, 32, 4, - 1, 226, 8, 3, 239, 144, 26, 214, 9, 32, 4, 1, 226, 8, 3, 213, 38, 32, 4, - 1, 226, 8, 3, 239, 144, 26, 213, 38, 32, 6, 1, 226, 8, 3, 198, 224, 32, - 6, 1, 226, 8, 3, 220, 114, 32, 6, 1, 226, 8, 3, 199, 133, 32, 6, 1, 226, - 8, 3, 214, 9, 32, 240, 63, 26, 199, 133, 32, 240, 63, 26, 214, 9, 32, - 240, 63, 26, 213, 38, 32, 4, 1, 200, 29, 3, 198, 224, 32, 4, 1, 200, 29, - 3, 220, 114, 32, 4, 1, 200, 29, 3, 239, 144, 26, 199, 133, 32, 4, 1, 200, - 29, 3, 239, 144, 26, 214, 9, 32, 4, 1, 210, 75, 3, 211, 231, 32, 4, 1, - 210, 75, 3, 240, 62, 32, 4, 1, 200, 29, 3, 213, 38, 32, 4, 1, 200, 29, 3, - 239, 144, 26, 213, 38, 32, 6, 1, 200, 29, 3, 198, 224, 32, 6, 1, 200, 29, - 3, 220, 114, 32, 6, 1, 200, 29, 3, 199, 133, 32, 6, 1, 200, 29, 3, 214, - 9, 32, 6, 1, 210, 75, 3, 240, 62, 32, 239, 144, 26, 199, 133, 32, 239, - 144, 26, 214, 9, 32, 199, 133, 32, 4, 1, 214, 125, 3, 199, 134, 26, 195, - 225, 32, 4, 1, 214, 125, 3, 195, 225, 32, 4, 1, 214, 125, 3, 214, 10, 26, - 195, 225, 32, 4, 1, 214, 125, 3, 213, 38, 32, 4, 1, 214, 125, 3, 213, 39, - 26, 195, 225, 32, 6, 1, 214, 123, 3, 199, 133, 32, 6, 1, 214, 123, 3, - 214, 9, 32, 6, 1, 214, 125, 3, 199, 133, 32, 6, 1, 214, 125, 3, 214, 9, - 32, 6, 1, 214, 125, 3, 211, 245, 32, 214, 9, 32, 240, 62, 236, 231, 211, - 94, 236, 242, 211, 94, 236, 231, 205, 148, 236, 242, 205, 148, 202, 148, - 205, 148, 235, 5, 205, 148, 206, 27, 205, 148, 235, 143, 205, 148, 211, - 214, 205, 148, 202, 188, 205, 148, 232, 234, 205, 148, 195, 80, 197, 59, - 205, 148, 195, 80, 197, 59, 216, 36, 195, 80, 197, 59, 225, 124, 222, - 175, 78, 210, 13, 78, 231, 7, 216, 37, 231, 7, 235, 143, 240, 65, 236, - 231, 240, 65, 236, 242, 240, 65, 231, 155, 154, 52, 83, 222, 75, 52, 126, - 222, 75, 50, 206, 62, 211, 62, 78, 53, 206, 62, 211, 62, 78, 206, 62, - 221, 207, 211, 62, 78, 206, 62, 232, 45, 211, 62, 78, 50, 52, 211, 62, - 78, 53, 52, 211, 62, 78, 52, 221, 207, 211, 62, 78, 52, 232, 45, 211, 62, - 78, 240, 118, 52, 240, 118, 248, 5, 201, 177, 248, 5, 97, 76, 222, 195, - 99, 76, 222, 195, 231, 155, 236, 247, 231, 5, 212, 110, 222, 76, 207, 90, - 213, 154, 207, 90, 222, 175, 236, 240, 210, 13, 236, 240, 212, 88, 239, - 84, 235, 22, 222, 175, 214, 17, 210, 13, 214, 17, 217, 210, 216, 44, 205, - 148, 213, 46, 219, 29, 55, 213, 46, 203, 24, 202, 159, 55, 212, 19, 52, - 212, 19, 201, 165, 212, 19, 210, 89, 212, 19, 210, 89, 52, 212, 19, 210, - 89, 201, 165, 212, 19, 247, 110, 206, 62, 222, 179, 251, 91, 211, 62, 78, - 206, 62, 210, 17, 251, 91, 211, 62, 78, 210, 154, 78, 52, 236, 90, 78, - 226, 26, 214, 19, 200, 59, 190, 202, 107, 247, 111, 226, 43, 212, 110, - 250, 177, 231, 8, 248, 5, 191, 205, 248, 50, 47, 248, 62, 3, 211, 73, 53, - 47, 248, 62, 3, 211, 73, 52, 211, 79, 78, 211, 79, 236, 90, 78, 236, 90, - 211, 79, 78, 202, 60, 2, 236, 128, 210, 89, 212, 179, 55, 58, 107, 248, - 5, 58, 91, 248, 5, 126, 250, 179, 210, 89, 207, 105, 244, 204, 200, 36, - 99, 250, 178, 251, 150, 199, 49, 244, 157, 219, 16, 55, 204, 46, 240, 65, - 226, 17, 200, 59, 235, 63, 211, 214, 78, 115, 76, 211, 213, 211, 90, 212, - 19, 235, 7, 76, 211, 213, 235, 101, 76, 211, 213, 99, 76, 211, 213, 235, - 7, 76, 78, 237, 250, 241, 61, 201, 176, 83, 235, 7, 238, 250, 219, 190, - 13, 205, 148, 197, 9, 225, 124, 234, 215, 251, 25, 226, 15, 202, 76, 226, - 15, 207, 90, 226, 15, 212, 125, 222, 175, 225, 240, 210, 13, 225, 240, - 235, 113, 204, 182, 225, 240, 212, 88, 239, 84, 225, 240, 226, 56, 203, - 248, 204, 64, 252, 12, 203, 248, 204, 64, 226, 56, 9, 235, 24, 207, 19, - 252, 12, 9, 235, 24, 207, 19, 217, 204, 17, 207, 20, 216, 40, 17, 207, - 20, 204, 95, 195, 79, 204, 95, 8, 4, 1, 68, 204, 95, 136, 204, 95, 146, - 204, 95, 167, 204, 95, 178, 204, 95, 171, 204, 95, 182, 204, 95, 98, 55, - 204, 95, 219, 15, 204, 95, 236, 172, 55, 204, 95, 50, 213, 140, 204, 95, - 53, 213, 140, 204, 95, 8, 4, 1, 218, 55, 204, 143, 195, 79, 204, 143, - 100, 204, 143, 102, 204, 143, 134, 204, 143, 136, 204, 143, 146, 204, - 143, 167, 204, 143, 178, 204, 143, 171, 204, 143, 182, 204, 143, 98, 55, - 204, 143, 219, 15, 204, 143, 236, 172, 55, 204, 143, 50, 213, 140, 204, - 143, 53, 213, 140, 8, 204, 143, 4, 1, 63, 8, 204, 143, 4, 1, 69, 8, 204, - 143, 4, 1, 72, 8, 204, 143, 4, 1, 196, 222, 8, 204, 143, 4, 1, 208, 163, - 8, 204, 143, 4, 1, 233, 15, 8, 204, 143, 4, 1, 225, 80, 8, 204, 143, 4, - 1, 159, 8, 204, 143, 4, 1, 221, 136, 8, 204, 143, 4, 1, 218, 55, 8, 204, - 143, 4, 1, 214, 3, 8, 204, 143, 4, 1, 209, 80, 8, 204, 143, 4, 1, 203, - 216, 236, 107, 55, 244, 169, 55, 241, 46, 55, 234, 243, 234, 248, 55, - 222, 55, 55, 219, 30, 55, 217, 228, 55, 213, 23, 55, 209, 108, 55, 197, - 17, 55, 217, 83, 206, 241, 55, 239, 5, 55, 236, 108, 55, 224, 70, 55, - 201, 27, 55, 237, 228, 55, 234, 21, 213, 58, 55, 213, 20, 55, 233, 71, - 55, 250, 140, 55, 231, 81, 55, 247, 52, 55, 222, 45, 201, 223, 55, 205, - 128, 55, 203, 21, 55, 226, 71, 209, 108, 55, 201, 6, 222, 55, 55, 216, - 26, 117, 55, 220, 60, 55, 209, 131, 55, 222, 224, 55, 248, 144, 55, 38, - 50, 232, 169, 57, 38, 53, 232, 169, 57, 38, 181, 83, 222, 76, 214, 20, - 38, 206, 182, 83, 222, 76, 214, 20, 38, 251, 65, 61, 57, 38, 244, 205, - 61, 57, 38, 50, 61, 57, 38, 53, 61, 57, 38, 210, 3, 214, 20, 38, 244, - 205, 210, 3, 214, 20, 38, 251, 65, 210, 3, 214, 20, 38, 115, 238, 251, - 57, 38, 235, 7, 238, 251, 57, 38, 236, 226, 244, 249, 38, 236, 226, 205, - 94, 38, 236, 226, 239, 140, 38, 236, 226, 244, 250, 249, 133, 38, 50, 53, - 61, 57, 38, 236, 226, 208, 154, 38, 236, 226, 224, 149, 38, 236, 226, - 200, 26, 212, 107, 201, 180, 38, 210, 90, 205, 178, 214, 20, 38, 52, 83, - 204, 196, 214, 20, 38, 251, 75, 105, 38, 201, 165, 200, 61, 38, 197, 62, - 248, 40, 57, 38, 107, 61, 214, 20, 38, 181, 52, 205, 178, 214, 20, 38, - 91, 232, 169, 3, 165, 237, 230, 38, 107, 232, 169, 3, 165, 237, 230, 38, - 50, 61, 60, 38, 53, 61, 60, 38, 250, 180, 57, 252, 18, 214, 159, 252, 2, - 202, 30, 202, 218, 204, 153, 237, 241, 6, 247, 207, 239, 231, 247, 42, - 247, 37, 222, 76, 105, 247, 112, 214, 159, 247, 166, 200, 71, 236, 109, - 241, 137, 208, 151, 239, 231, 235, 221, 145, 4, 234, 190, 145, 6, 233, - 15, 248, 134, 6, 233, 15, 237, 241, 6, 233, 15, 212, 144, 241, 137, 212, - 144, 241, 138, 127, 99, 212, 220, 145, 6, 68, 248, 134, 6, 68, 145, 6, - 159, 145, 4, 159, 223, 100, 74, 249, 80, 105, 237, 241, 6, 218, 55, 215, - 140, 55, 205, 162, 210, 166, 241, 104, 145, 6, 214, 3, 237, 241, 6, 214, - 3, 237, 241, 6, 211, 167, 145, 6, 144, 248, 134, 6, 144, 237, 241, 6, - 144, 212, 27, 203, 128, 210, 102, 207, 81, 78, 203, 34, 55, 201, 213, - 117, 55, 199, 101, 237, 241, 6, 195, 158, 214, 38, 55, 214, 148, 55, 226, - 17, 214, 148, 55, 248, 134, 6, 195, 158, 163, 32, 4, 1, 226, 7, 224, 190, - 55, 251, 85, 55, 145, 6, 250, 112, 248, 134, 6, 247, 207, 236, 133, 105, - 145, 4, 69, 145, 6, 69, 145, 6, 236, 49, 163, 6, 236, 49, 145, 6, 221, - 136, 145, 4, 72, 151, 105, 248, 209, 105, 233, 178, 105, 240, 102, 105, - 226, 61, 205, 160, 209, 194, 6, 211, 167, 235, 224, 55, 237, 241, 4, 212, - 220, 237, 241, 4, 234, 94, 237, 241, 6, 234, 94, 237, 241, 6, 212, 220, - 237, 241, 218, 54, 204, 114, 163, 45, 6, 234, 190, 163, 45, 6, 159, 210, - 89, 45, 6, 159, 163, 45, 6, 196, 148, 237, 241, 41, 6, 240, 231, 237, - 241, 41, 4, 240, 231, 237, 241, 41, 4, 69, 237, 241, 41, 4, 68, 237, 241, - 41, 4, 225, 217, 211, 249, 222, 75, 163, 251, 111, 213, 46, 55, 251, 175, - 163, 4, 236, 49, 16, 36, 208, 228, 205, 160, 197, 217, 191, 97, 207, 67, - 197, 217, 191, 97, 216, 173, 197, 217, 191, 97, 203, 14, 197, 217, 191, - 97, 202, 184, 197, 217, 191, 99, 202, 181, 197, 217, 191, 97, 235, 148, - 197, 217, 191, 99, 235, 147, 197, 217, 191, 115, 235, 147, 197, 217, 191, - 235, 7, 235, 147, 197, 217, 191, 97, 206, 17, 197, 217, 191, 235, 101, - 206, 15, 197, 217, 191, 97, 237, 26, 197, 217, 191, 115, 237, 24, 197, - 217, 191, 235, 101, 237, 24, 197, 217, 191, 207, 71, 237, 24, 191, 215, - 141, 100, 209, 208, 215, 142, 100, 209, 208, 215, 142, 102, 209, 208, - 215, 142, 134, 209, 208, 215, 142, 136, 209, 208, 215, 142, 146, 209, - 208, 215, 142, 167, 209, 208, 215, 142, 178, 209, 208, 215, 142, 171, - 209, 208, 215, 142, 182, 209, 208, 215, 142, 203, 23, 209, 208, 215, 142, - 236, 252, 209, 208, 215, 142, 200, 239, 209, 208, 215, 142, 235, 145, - 209, 208, 215, 142, 97, 231, 57, 209, 208, 215, 142, 235, 101, 231, 57, - 209, 208, 215, 142, 97, 170, 4, 209, 208, 215, 142, 100, 4, 209, 208, - 215, 142, 102, 4, 209, 208, 215, 142, 134, 4, 209, 208, 215, 142, 136, 4, - 209, 208, 215, 142, 146, 4, 209, 208, 215, 142, 167, 4, 209, 208, 215, - 142, 178, 4, 209, 208, 215, 142, 171, 4, 209, 208, 215, 142, 182, 4, 209, - 208, 215, 142, 203, 23, 4, 209, 208, 215, 142, 236, 252, 4, 209, 208, - 215, 142, 200, 239, 4, 209, 208, 215, 142, 235, 145, 4, 209, 208, 215, - 142, 97, 231, 57, 4, 209, 208, 215, 142, 235, 101, 231, 57, 4, 209, 208, - 215, 142, 97, 170, 209, 208, 215, 142, 97, 202, 159, 247, 208, 240, 231, - 209, 208, 215, 142, 235, 101, 170, 209, 208, 215, 142, 203, 24, 170, 209, - 208, 215, 142, 210, 89, 97, 231, 57, 8, 4, 1, 210, 89, 247, 207, 209, - 208, 215, 142, 206, 29, 222, 219, 20, 209, 208, 215, 142, 235, 146, 237, - 75, 20, 209, 208, 215, 142, 235, 146, 170, 209, 208, 215, 142, 97, 231, - 58, 170, 197, 217, 191, 195, 80, 202, 181, 163, 17, 102, 163, 17, 134, - 107, 51, 200, 24, 51, 91, 51, 237, 231, 51, 50, 53, 51, 124, 135, 51, - 173, 197, 89, 51, 173, 237, 69, 51, 205, 159, 237, 69, 51, 205, 159, 197, - 89, 51, 107, 61, 3, 106, 91, 61, 3, 106, 107, 197, 123, 51, 91, 197, 123, - 51, 107, 99, 232, 135, 51, 200, 24, 99, 232, 135, 51, 91, 99, 232, 135, - 51, 237, 231, 99, 232, 135, 51, 107, 61, 3, 203, 135, 91, 61, 3, 203, - 135, 107, 61, 234, 235, 154, 200, 24, 61, 234, 235, 154, 91, 61, 234, - 235, 154, 237, 231, 61, 234, 235, 154, 124, 135, 61, 3, 249, 66, 107, 61, - 3, 122, 91, 61, 3, 122, 107, 61, 3, 221, 225, 91, 61, 3, 221, 225, 50, - 53, 197, 123, 51, 50, 53, 61, 3, 106, 237, 231, 195, 24, 51, 200, 24, 61, - 3, 202, 68, 222, 174, 200, 24, 61, 3, 202, 68, 210, 11, 237, 231, 61, 3, - 202, 68, 222, 174, 237, 231, 61, 3, 202, 68, 210, 11, 91, 61, 3, 241, - 102, 237, 230, 237, 231, 61, 3, 241, 102, 222, 174, 251, 65, 201, 243, - 207, 108, 51, 244, 205, 201, 243, 207, 108, 51, 173, 197, 89, 61, 202, - 30, 181, 154, 107, 61, 202, 30, 249, 80, 127, 91, 61, 202, 30, 154, 251, - 65, 192, 244, 250, 51, 244, 205, 192, 244, 250, 51, 107, 232, 169, 3, - 165, 200, 23, 107, 232, 169, 3, 165, 237, 230, 200, 24, 232, 169, 3, 165, - 210, 11, 200, 24, 232, 169, 3, 165, 222, 174, 91, 232, 169, 3, 165, 200, - 23, 91, 232, 169, 3, 165, 237, 230, 237, 231, 232, 169, 3, 165, 210, 11, - 237, 231, 232, 169, 3, 165, 222, 174, 91, 61, 127, 107, 51, 200, 24, 61, - 107, 77, 237, 231, 51, 107, 61, 127, 91, 51, 107, 213, 219, 250, 214, - 200, 24, 213, 219, 250, 214, 91, 213, 219, 250, 214, 237, 231, 213, 219, - 250, 214, 107, 232, 169, 127, 91, 232, 168, 91, 232, 169, 127, 107, 232, - 168, 107, 52, 61, 3, 106, 50, 53, 52, 61, 3, 106, 91, 52, 61, 3, 106, - 107, 52, 51, 200, 24, 52, 51, 91, 52, 51, 237, 231, 52, 51, 50, 53, 52, - 51, 124, 135, 52, 51, 173, 197, 89, 52, 51, 173, 237, 69, 52, 51, 205, - 159, 237, 69, 52, 51, 205, 159, 197, 89, 52, 51, 107, 201, 165, 51, 91, - 201, 165, 51, 107, 205, 87, 51, 91, 205, 87, 51, 200, 24, 61, 3, 52, 106, - 237, 231, 61, 3, 52, 106, 107, 240, 64, 51, 200, 24, 240, 64, 51, 91, - 240, 64, 51, 237, 231, 240, 64, 51, 107, 61, 202, 30, 154, 91, 61, 202, - 30, 154, 107, 59, 51, 200, 24, 59, 51, 91, 59, 51, 237, 231, 59, 51, 200, - 24, 59, 61, 234, 235, 154, 200, 24, 59, 61, 214, 120, 213, 82, 200, 24, - 59, 61, 214, 120, 213, 83, 3, 231, 155, 154, 200, 24, 59, 61, 214, 120, - 213, 83, 3, 83, 154, 200, 24, 59, 52, 51, 200, 24, 59, 52, 61, 214, 120, - 213, 82, 91, 59, 61, 234, 235, 197, 148, 173, 197, 89, 61, 202, 30, 241, - 101, 205, 159, 237, 69, 61, 202, 30, 241, 101, 124, 135, 59, 51, 53, 61, - 3, 4, 244, 249, 237, 231, 61, 107, 77, 200, 24, 51, 115, 91, 250, 214, - 107, 61, 3, 83, 106, 91, 61, 3, 83, 106, 50, 53, 61, 3, 83, 106, 107, 61, - 3, 52, 83, 106, 91, 61, 3, 52, 83, 106, 50, 53, 61, 3, 52, 83, 106, 107, - 214, 90, 51, 91, 214, 90, 51, 50, 53, 214, 90, 51, 36, 251, 146, 244, - 153, 213, 132, 239, 124, 202, 208, 236, 85, 202, 208, 239, 19, 216, 19, - 236, 86, 236, 232, 207, 76, 226, 75, 217, 239, 237, 0, 214, 159, 216, 19, - 251, 107, 237, 0, 214, 159, 4, 237, 0, 214, 159, 241, 131, 250, 203, 219, - 168, 239, 19, 216, 19, 241, 133, 250, 203, 219, 168, 4, 241, 131, 250, - 203, 219, 168, 236, 222, 77, 211, 251, 218, 54, 212, 5, 218, 54, 241, - 108, 218, 54, 204, 114, 219, 16, 55, 219, 14, 55, 76, 212, 125, 239, 54, - 205, 248, 207, 77, 219, 15, 250, 180, 214, 82, 210, 3, 214, 82, 248, 6, - 214, 82, 47, 209, 200, 241, 37, 209, 200, 235, 0, 209, 200, 211, 247, - 149, 226, 63, 53, 251, 90, 251, 90, 219, 201, 251, 90, 205, 127, 251, 90, - 239, 57, 239, 19, 216, 19, 239, 61, 213, 146, 149, 216, 19, 213, 146, - 149, 221, 249, 251, 100, 221, 249, 214, 72, 226, 23, 200, 51, 226, 37, - 52, 226, 37, 201, 165, 226, 37, 241, 125, 226, 37, 204, 84, 226, 37, 198, - 236, 226, 37, 244, 205, 226, 37, 244, 205, 241, 125, 226, 37, 251, 65, - 241, 125, 226, 37, 202, 207, 248, 253, 210, 194, 211, 248, 76, 219, 15, - 236, 93, 234, 27, 211, 248, 231, 170, 202, 85, 214, 82, 210, 89, 202, 84, - 226, 17, 222, 204, 209, 80, 206, 64, 197, 122, 196, 253, 212, 5, 216, 19, - 202, 84, 219, 16, 202, 84, 250, 172, 180, 149, 216, 19, 250, 172, 180, - 149, 251, 21, 180, 149, 251, 21, 247, 232, 216, 19, 252, 11, 180, 149, - 217, 103, 251, 21, 216, 28, 252, 11, 180, 149, 251, 139, 180, 149, 216, - 19, 251, 139, 180, 149, 251, 139, 180, 214, 73, 180, 149, 201, 165, 202, - 84, 251, 147, 180, 149, 236, 165, 149, 234, 26, 236, 165, 149, 239, 125, - 248, 203, 251, 23, 202, 218, 222, 83, 234, 26, 180, 149, 251, 21, 180, - 202, 30, 214, 73, 202, 218, 226, 102, 214, 159, 226, 102, 77, 214, 73, - 251, 21, 180, 149, 244, 169, 236, 171, 236, 172, 244, 168, 210, 3, 226, - 87, 180, 149, 210, 3, 180, 149, 241, 94, 149, 236, 132, 236, 170, 149, - 205, 8, 236, 171, 239, 213, 180, 149, 180, 202, 30, 247, 219, 239, 232, - 219, 201, 247, 218, 211, 77, 180, 149, 216, 19, 180, 149, 230, 193, 149, - 216, 19, 230, 193, 149, 204, 203, 236, 165, 149, 222, 140, 214, 73, 180, - 149, 233, 94, 214, 73, 180, 149, 222, 140, 127, 180, 149, 233, 94, 127, - 180, 149, 222, 140, 247, 232, 216, 19, 180, 149, 233, 94, 247, 232, 216, - 19, 180, 149, 218, 135, 222, 139, 218, 135, 233, 93, 248, 203, 216, 19, - 236, 165, 149, 216, 19, 222, 139, 216, 19, 233, 93, 217, 103, 222, 140, - 216, 28, 180, 149, 217, 103, 233, 94, 216, 28, 180, 149, 222, 140, 214, - 73, 236, 165, 149, 233, 94, 214, 73, 236, 165, 149, 217, 103, 222, 140, - 216, 28, 236, 165, 149, 217, 103, 233, 94, 216, 28, 236, 165, 149, 222, - 140, 214, 73, 233, 93, 233, 94, 214, 73, 222, 139, 217, 103, 222, 140, - 216, 28, 233, 93, 217, 103, 233, 94, 216, 28, 222, 139, 212, 35, 204, - 133, 212, 36, 214, 73, 180, 149, 204, 134, 214, 73, 180, 149, 212, 36, - 214, 73, 236, 165, 149, 204, 134, 214, 73, 236, 165, 149, 239, 19, 216, - 19, 212, 38, 239, 19, 216, 19, 204, 135, 204, 142, 214, 159, 204, 94, - 214, 159, 216, 19, 39, 204, 142, 214, 159, 216, 19, 39, 204, 94, 214, - 159, 204, 142, 77, 214, 73, 180, 149, 204, 94, 77, 214, 73, 180, 149, - 217, 103, 39, 204, 142, 77, 216, 28, 180, 149, 217, 103, 39, 204, 94, 77, - 216, 28, 180, 149, 204, 142, 77, 3, 216, 19, 180, 149, 204, 94, 77, 3, - 216, 19, 180, 149, 218, 115, 218, 116, 218, 117, 218, 116, 200, 51, 47, - 226, 102, 214, 159, 47, 214, 63, 214, 159, 47, 226, 102, 77, 214, 73, - 180, 149, 47, 214, 63, 77, 214, 73, 180, 149, 47, 247, 125, 47, 241, 27, - 46, 212, 125, 46, 219, 15, 46, 202, 76, 46, 239, 54, 205, 248, 46, 76, - 214, 82, 46, 210, 3, 214, 82, 46, 250, 180, 214, 82, 46, 236, 171, 46, - 240, 65, 103, 212, 125, 103, 219, 15, 103, 202, 76, 103, 76, 214, 82, 53, - 203, 147, 50, 203, 147, 135, 203, 147, 124, 203, 147, 250, 183, 218, 240, - 201, 142, 235, 30, 201, 165, 83, 249, 80, 53, 201, 3, 52, 83, 249, 80, - 52, 53, 201, 3, 239, 19, 216, 19, 211, 241, 216, 19, 201, 142, 239, 19, - 216, 19, 235, 31, 217, 106, 52, 83, 249, 80, 52, 53, 201, 3, 212, 36, - 200, 64, 210, 136, 204, 134, 200, 64, 210, 136, 216, 25, 204, 156, 214, - 159, 241, 131, 250, 203, 216, 25, 204, 155, 216, 25, 204, 156, 77, 214, - 73, 180, 149, 241, 131, 250, 203, 216, 25, 204, 156, 214, 73, 180, 149, - 214, 63, 214, 159, 226, 102, 214, 159, 218, 122, 232, 92, 241, 142, 220, - 1, 226, 34, 196, 181, 217, 219, 216, 27, 53, 251, 91, 3, 250, 253, 53, - 201, 180, 218, 54, 221, 249, 251, 100, 218, 54, 221, 249, 214, 72, 218, - 54, 226, 23, 218, 54, 200, 51, 239, 141, 214, 82, 76, 214, 82, 205, 8, - 214, 82, 239, 54, 202, 76, 248, 71, 50, 216, 25, 235, 223, 207, 104, 212, - 5, 53, 216, 25, 235, 223, 207, 104, 212, 5, 50, 207, 104, 212, 5, 53, - 207, 104, 212, 5, 210, 89, 202, 85, 236, 171, 241, 18, 221, 249, 214, 72, - 241, 18, 221, 249, 251, 100, 52, 204, 141, 52, 204, 93, 52, 226, 23, 52, - 200, 51, 212, 155, 180, 26, 213, 146, 149, 222, 140, 3, 238, 253, 233, - 94, 3, 238, 253, 199, 48, 218, 135, 222, 139, 199, 48, 218, 135, 233, 93, - 222, 140, 180, 202, 30, 214, 73, 233, 93, 233, 94, 180, 202, 30, 214, 73, - 222, 139, 180, 202, 30, 214, 73, 222, 139, 180, 202, 30, 214, 73, 233, - 93, 180, 202, 30, 214, 73, 212, 35, 180, 202, 30, 214, 73, 204, 133, 239, - 19, 216, 19, 212, 39, 214, 73, 236, 173, 239, 19, 216, 19, 204, 136, 214, - 73, 236, 173, 216, 19, 47, 226, 102, 77, 214, 73, 180, 149, 216, 19, 47, - 214, 63, 77, 214, 73, 180, 149, 47, 226, 102, 77, 214, 73, 216, 19, 180, - 149, 47, 214, 63, 77, 214, 73, 216, 19, 180, 149, 222, 140, 247, 232, - 216, 19, 236, 165, 149, 233, 94, 247, 232, 216, 19, 236, 165, 149, 212, - 36, 247, 232, 216, 19, 236, 165, 149, 204, 134, 247, 232, 216, 19, 236, - 165, 149, 216, 19, 216, 25, 204, 156, 214, 159, 239, 19, 216, 19, 241, - 133, 250, 203, 216, 25, 204, 155, 216, 19, 216, 25, 204, 156, 77, 214, - 73, 180, 149, 239, 19, 216, 19, 241, 133, 250, 203, 216, 25, 204, 156, - 214, 73, 236, 173, 83, 236, 247, 219, 61, 231, 155, 236, 247, 124, 53, - 239, 147, 236, 247, 135, 53, 239, 147, 236, 247, 237, 0, 77, 3, 181, 231, - 155, 106, 237, 0, 77, 3, 83, 249, 80, 250, 169, 236, 222, 77, 231, 155, - 106, 4, 237, 0, 77, 3, 83, 249, 80, 250, 169, 236, 222, 77, 231, 155, - 106, 237, 0, 77, 3, 76, 57, 237, 0, 77, 3, 214, 26, 4, 237, 0, 77, 3, - 214, 26, 237, 0, 77, 3, 200, 62, 237, 0, 77, 3, 99, 231, 155, 204, 183, - 241, 131, 3, 181, 231, 155, 106, 241, 131, 3, 83, 249, 80, 250, 169, 236, - 222, 77, 231, 155, 106, 4, 241, 131, 3, 83, 249, 80, 250, 169, 236, 222, - 77, 231, 155, 106, 241, 131, 3, 214, 26, 4, 241, 131, 3, 214, 26, 195, - 159, 216, 17, 249, 123, 219, 167, 239, 142, 55, 237, 2, 51, 231, 87, 124, - 250, 217, 135, 250, 217, 211, 255, 213, 26, 197, 119, 222, 75, 50, 247, - 45, 53, 247, 45, 50, 235, 69, 53, 235, 69, 248, 85, 53, 241, 63, 248, 85, - 50, 241, 63, 201, 243, 53, 241, 63, 201, 243, 50, 241, 63, 210, 89, 216, - 19, 55, 47, 221, 198, 250, 253, 208, 122, 208, 131, 203, 34, 210, 167, - 212, 79, 226, 68, 199, 22, 205, 94, 212, 149, 77, 226, 33, 55, 163, 216, - 19, 55, 197, 129, 231, 89, 201, 243, 50, 241, 101, 201, 243, 53, 241, - 101, 248, 85, 50, 241, 101, 248, 85, 53, 241, 101, 201, 243, 157, 226, - 37, 248, 85, 157, 226, 37, 234, 230, 205, 219, 124, 250, 218, 248, 204, - 99, 231, 155, 249, 68, 214, 75, 224, 153, 236, 161, 202, 30, 202, 218, - 210, 22, 196, 223, 226, 87, 39, 210, 164, 248, 70, 224, 151, 222, 179, - 251, 91, 179, 210, 17, 251, 91, 179, 236, 161, 202, 30, 202, 218, 222, - 184, 248, 215, 210, 2, 240, 241, 251, 147, 250, 226, 203, 247, 201, 228, - 209, 113, 239, 104, 214, 64, 241, 146, 203, 103, 205, 233, 241, 90, 241, - 89, 251, 40, 234, 213, 16, 230, 242, 251, 40, 234, 213, 16, 205, 85, 211, - 94, 251, 40, 234, 213, 16, 211, 95, 236, 173, 251, 40, 234, 213, 16, 211, - 95, 239, 61, 251, 40, 234, 213, 16, 211, 95, 239, 140, 251, 40, 234, 213, - 16, 211, 95, 225, 116, 251, 40, 234, 213, 16, 211, 95, 244, 249, 251, 40, - 234, 213, 16, 244, 250, 204, 234, 251, 40, 234, 213, 16, 244, 250, 225, - 116, 251, 40, 234, 213, 16, 205, 249, 154, 251, 40, 234, 213, 16, 249, - 134, 154, 251, 40, 234, 213, 16, 211, 95, 205, 248, 251, 40, 234, 213, - 16, 211, 95, 249, 133, 251, 40, 234, 213, 16, 211, 95, 222, 139, 251, 40, - 234, 213, 16, 211, 95, 233, 93, 251, 40, 234, 213, 16, 107, 199, 140, - 251, 40, 234, 213, 16, 91, 199, 140, 251, 40, 234, 213, 16, 211, 95, 107, - 51, 251, 40, 234, 213, 16, 211, 95, 91, 51, 251, 40, 234, 213, 16, 244, - 250, 249, 133, 251, 40, 234, 213, 16, 135, 203, 148, 200, 62, 251, 40, - 234, 213, 16, 239, 213, 204, 234, 251, 40, 234, 213, 16, 211, 95, 135, - 247, 110, 251, 40, 234, 213, 16, 211, 95, 239, 212, 251, 40, 234, 213, - 16, 135, 203, 148, 225, 116, 251, 40, 234, 213, 16, 200, 24, 199, 140, - 251, 40, 234, 213, 16, 211, 95, 200, 24, 51, 251, 40, 234, 213, 16, 124, - 203, 148, 214, 26, 251, 40, 234, 213, 16, 239, 225, 204, 234, 251, 40, - 234, 213, 16, 211, 95, 124, 247, 110, 251, 40, 234, 213, 16, 211, 95, - 239, 224, 251, 40, 234, 213, 16, 124, 203, 148, 225, 116, 251, 40, 234, - 213, 16, 237, 231, 199, 140, 251, 40, 234, 213, 16, 211, 95, 237, 231, - 51, 251, 40, 234, 213, 16, 211, 61, 200, 62, 251, 40, 234, 213, 16, 239, - 213, 200, 62, 251, 40, 234, 213, 16, 239, 141, 200, 62, 251, 40, 234, - 213, 16, 225, 117, 200, 62, 251, 40, 234, 213, 16, 244, 250, 200, 62, - 251, 40, 234, 213, 16, 124, 206, 195, 225, 116, 251, 40, 234, 213, 16, - 211, 61, 211, 94, 251, 40, 234, 213, 16, 244, 250, 205, 7, 251, 40, 234, - 213, 16, 211, 95, 244, 168, 251, 40, 234, 213, 16, 124, 203, 148, 239, - 150, 251, 40, 234, 213, 16, 239, 225, 239, 150, 251, 40, 234, 213, 16, - 205, 8, 239, 150, 251, 40, 234, 213, 16, 225, 117, 239, 150, 251, 40, - 234, 213, 16, 244, 250, 239, 150, 251, 40, 234, 213, 16, 135, 206, 195, - 204, 234, 251, 40, 234, 213, 16, 50, 206, 195, 204, 234, 251, 40, 234, - 213, 16, 202, 85, 239, 150, 251, 40, 234, 213, 16, 233, 94, 239, 150, - 251, 40, 234, 213, 16, 244, 160, 154, 251, 40, 234, 213, 16, 239, 225, - 202, 84, 251, 40, 234, 213, 16, 195, 23, 251, 40, 234, 213, 16, 204, 235, - 202, 84, 251, 40, 234, 213, 16, 207, 106, 200, 62, 251, 40, 234, 213, 16, - 211, 95, 216, 19, 236, 173, 251, 40, 234, 213, 16, 211, 95, 211, 78, 251, - 40, 234, 213, 16, 135, 247, 111, 202, 84, 251, 40, 234, 213, 16, 124, - 247, 111, 202, 84, 251, 40, 234, 213, 16, 226, 7, 251, 40, 234, 213, 16, - 210, 74, 251, 40, 234, 213, 16, 214, 124, 251, 40, 234, 213, 16, 251, - 135, 200, 62, 251, 40, 234, 213, 16, 236, 175, 200, 62, 251, 40, 234, - 213, 16, 226, 8, 200, 62, 251, 40, 234, 213, 16, 214, 125, 200, 62, 251, - 40, 234, 213, 16, 251, 134, 216, 19, 245, 102, 78, 53, 251, 91, 3, 237, - 231, 195, 24, 51, 206, 163, 192, 248, 70, 248, 230, 105, 83, 222, 76, 3, - 112, 238, 253, 226, 43, 105, 241, 126, 200, 60, 105, 239, 77, 200, 60, - 105, 236, 234, 105, 241, 161, 105, 59, 47, 3, 247, 37, 83, 222, 75, 236, - 205, 105, 251, 126, 224, 154, 105, 232, 105, 105, 46, 231, 155, 249, 80, - 3, 216, 16, 46, 201, 181, 237, 235, 248, 33, 244, 250, 3, 216, 22, 51, - 200, 58, 105, 218, 200, 105, 231, 3, 105, 214, 91, 233, 14, 105, 214, 91, - 223, 98, 105, 213, 120, 105, 213, 119, 105, 239, 86, 241, 16, 16, 235, - 24, 102, 205, 183, 105, 251, 40, 234, 213, 16, 211, 94, 239, 244, 207, - 91, 224, 154, 105, 212, 21, 213, 227, 217, 76, 213, 227, 212, 16, 208, - 155, 105, 244, 221, 208, 155, 105, 50, 213, 141, 200, 33, 122, 50, 213, - 141, 236, 77, 50, 213, 141, 221, 203, 122, 53, 213, 141, 200, 33, 122, - 53, 213, 141, 236, 77, 53, 213, 141, 221, 203, 122, 50, 47, 248, 62, 200, - 33, 241, 101, 50, 47, 248, 62, 236, 77, 50, 47, 248, 62, 221, 203, 241, - 101, 53, 47, 248, 62, 200, 33, 241, 101, 53, 47, 248, 62, 236, 77, 53, - 47, 248, 62, 221, 203, 241, 101, 50, 241, 18, 248, 62, 200, 33, 122, 50, - 241, 18, 248, 62, 112, 212, 212, 50, 241, 18, 248, 62, 221, 203, 122, - 241, 18, 248, 62, 236, 77, 53, 241, 18, 248, 62, 200, 33, 122, 53, 241, - 18, 248, 62, 112, 212, 212, 53, 241, 18, 248, 62, 221, 203, 122, 226, 38, - 236, 77, 231, 155, 222, 76, 236, 77, 200, 33, 50, 214, 73, 221, 203, 53, - 241, 18, 248, 62, 208, 132, 200, 33, 53, 214, 73, 221, 203, 50, 241, 18, - 248, 62, 208, 132, 204, 115, 201, 242, 204, 115, 248, 84, 201, 243, 47, - 179, 248, 85, 47, 179, 248, 85, 47, 248, 62, 127, 201, 243, 47, 179, 44, - 16, 248, 84, 50, 83, 111, 222, 75, 53, 83, 111, 222, 75, 231, 155, 208, - 174, 222, 74, 231, 155, 208, 174, 222, 73, 231, 155, 208, 174, 222, 72, - 231, 155, 208, 174, 222, 71, 239, 204, 16, 175, 83, 26, 201, 243, 210, - 22, 239, 204, 16, 175, 83, 26, 248, 85, 210, 22, 239, 204, 16, 175, 83, - 3, 244, 249, 239, 204, 16, 175, 135, 26, 231, 155, 3, 244, 249, 239, 204, - 16, 175, 124, 26, 231, 155, 3, 244, 249, 239, 204, 16, 175, 83, 3, 201, - 180, 239, 204, 16, 175, 135, 26, 231, 155, 3, 201, 180, 239, 204, 16, - 175, 124, 26, 231, 155, 3, 201, 180, 239, 204, 16, 175, 83, 26, 197, 122, - 239, 204, 16, 175, 135, 26, 231, 155, 3, 197, 122, 239, 204, 16, 175, - 124, 26, 231, 155, 3, 197, 122, 239, 204, 16, 175, 135, 26, 231, 154, - 239, 204, 16, 175, 124, 26, 231, 154, 239, 204, 16, 175, 83, 26, 201, - 243, 222, 184, 239, 204, 16, 175, 83, 26, 248, 85, 222, 184, 47, 235, 37, - 210, 94, 105, 237, 16, 105, 83, 222, 76, 236, 77, 219, 137, 248, 47, 219, - 137, 181, 127, 206, 181, 219, 137, 206, 182, 127, 221, 240, 219, 137, - 181, 127, 99, 206, 167, 219, 137, 99, 206, 168, 127, 221, 240, 219, 137, - 99, 206, 168, 225, 125, 219, 137, 201, 161, 219, 137, 202, 249, 219, 137, - 213, 53, 237, 73, 233, 85, 234, 207, 201, 243, 213, 140, 248, 85, 213, - 140, 201, 243, 241, 18, 179, 248, 85, 241, 18, 179, 201, 243, 201, 231, - 206, 245, 179, 248, 85, 201, 231, 206, 245, 179, 59, 201, 197, 248, 215, - 210, 3, 3, 244, 249, 204, 216, 235, 80, 252, 26, 241, 15, 237, 1, 226, - 23, 239, 244, 236, 81, 105, 58, 210, 17, 52, 201, 180, 58, 222, 179, 52, - 201, 180, 58, 200, 35, 52, 201, 180, 58, 237, 234, 52, 201, 180, 58, 210, - 17, 52, 201, 181, 3, 83, 154, 58, 222, 179, 52, 201, 181, 3, 83, 154, 58, - 210, 17, 201, 181, 3, 52, 83, 154, 251, 168, 244, 206, 204, 223, 202, 77, - 244, 206, 231, 90, 3, 235, 60, 208, 217, 58, 219, 190, 222, 179, 201, - 180, 58, 219, 190, 210, 17, 201, 180, 58, 219, 190, 200, 35, 201, 180, - 58, 219, 190, 237, 234, 201, 180, 52, 83, 154, 58, 47, 36, 204, 226, 58, - 244, 250, 36, 210, 168, 212, 59, 105, 212, 59, 214, 118, 105, 212, 59, - 214, 120, 105, 212, 59, 205, 244, 105, 214, 178, 236, 68, 105, 16, 36, - 215, 146, 16, 36, 205, 3, 77, 232, 134, 16, 36, 205, 3, 77, 202, 237, 16, - 36, 236, 222, 77, 202, 237, 16, 36, 236, 222, 77, 201, 202, 16, 36, 236, - 208, 16, 36, 252, 14, 16, 36, 248, 229, 16, 36, 249, 132, 16, 36, 231, - 155, 203, 149, 16, 36, 222, 76, 235, 180, 16, 36, 83, 203, 149, 16, 36, - 235, 24, 235, 180, 16, 36, 247, 102, 210, 93, 16, 36, 206, 219, 214, 34, - 16, 36, 206, 219, 226, 86, 16, 36, 240, 60, 222, 66, 236, 143, 16, 36, - 239, 183, 241, 121, 100, 16, 36, 239, 183, 241, 121, 102, 16, 36, 239, - 183, 241, 121, 134, 16, 36, 239, 183, 241, 121, 136, 16, 36, 217, 104, - 252, 14, 16, 36, 203, 242, 226, 149, 16, 36, 236, 222, 77, 201, 203, 248, - 126, 16, 36, 247, 140, 16, 36, 236, 222, 77, 219, 189, 16, 36, 204, 139, - 16, 36, 236, 143, 16, 36, 235, 138, 207, 90, 16, 36, 233, 84, 207, 90, - 16, 36, 210, 169, 207, 90, 16, 36, 200, 50, 207, 90, 16, 36, 205, 148, - 16, 36, 239, 222, 248, 130, 105, 192, 248, 70, 16, 36, 217, 79, 16, 36, - 239, 223, 235, 24, 102, 16, 36, 204, 140, 235, 24, 102, 214, 174, 122, - 214, 174, 247, 11, 214, 174, 235, 27, 214, 174, 226, 17, 235, 27, 214, - 174, 248, 226, 248, 18, 214, 174, 248, 78, 202, 107, 214, 174, 248, 58, - 249, 85, 230, 192, 214, 174, 251, 113, 77, 245, 101, 214, 174, 240, 65, - 214, 174, 241, 4, 252, 18, 215, 144, 214, 174, 52, 249, 133, 46, 17, 100, - 46, 17, 102, 46, 17, 134, 46, 17, 136, 46, 17, 146, 46, 17, 167, 46, 17, - 178, 46, 17, 171, 46, 17, 182, 46, 31, 203, 23, 46, 31, 236, 252, 46, 31, - 200, 239, 46, 31, 202, 179, 46, 31, 235, 1, 46, 31, 235, 149, 46, 31, - 206, 23, 46, 31, 207, 68, 46, 31, 237, 28, 46, 31, 216, 176, 46, 31, 200, - 234, 119, 17, 100, 119, 17, 102, 119, 17, 134, 119, 17, 136, 119, 17, - 146, 119, 17, 167, 119, 17, 178, 119, 17, 171, 119, 17, 182, 119, 31, - 203, 23, 119, 31, 236, 252, 119, 31, 200, 239, 119, 31, 202, 179, 119, - 31, 235, 1, 119, 31, 235, 149, 119, 31, 206, 23, 119, 31, 207, 68, 119, - 31, 237, 28, 119, 31, 216, 176, 119, 31, 200, 234, 17, 97, 234, 217, 204, - 226, 17, 99, 234, 217, 204, 226, 17, 115, 234, 217, 204, 226, 17, 235, 7, - 234, 217, 204, 226, 17, 235, 101, 234, 217, 204, 226, 17, 206, 29, 234, - 217, 204, 226, 17, 207, 71, 234, 217, 204, 226, 17, 237, 31, 234, 217, - 204, 226, 17, 216, 179, 234, 217, 204, 226, 31, 203, 24, 234, 217, 204, - 226, 31, 236, 253, 234, 217, 204, 226, 31, 200, 240, 234, 217, 204, 226, - 31, 202, 180, 234, 217, 204, 226, 31, 235, 2, 234, 217, 204, 226, 31, - 235, 150, 234, 217, 204, 226, 31, 206, 24, 234, 217, 204, 226, 31, 207, - 69, 234, 217, 204, 226, 31, 237, 29, 234, 217, 204, 226, 31, 216, 177, - 234, 217, 204, 226, 31, 200, 235, 234, 217, 204, 226, 119, 8, 4, 1, 63, - 119, 8, 4, 1, 250, 112, 119, 8, 4, 1, 247, 207, 119, 8, 4, 1, 240, 231, - 119, 8, 4, 1, 69, 119, 8, 4, 1, 236, 49, 119, 8, 4, 1, 234, 190, 119, 8, - 4, 1, 233, 15, 119, 8, 4, 1, 68, 119, 8, 4, 1, 225, 217, 119, 8, 4, 1, - 225, 80, 119, 8, 4, 1, 159, 119, 8, 4, 1, 221, 136, 119, 8, 4, 1, 218, - 55, 119, 8, 4, 1, 72, 119, 8, 4, 1, 214, 3, 119, 8, 4, 1, 211, 167, 119, - 8, 4, 1, 144, 119, 8, 4, 1, 209, 80, 119, 8, 4, 1, 203, 216, 119, 8, 4, - 1, 66, 119, 8, 4, 1, 199, 230, 119, 8, 4, 1, 197, 199, 119, 8, 4, 1, 196, - 222, 119, 8, 4, 1, 196, 148, 119, 8, 4, 1, 195, 158, 46, 8, 6, 1, 63, 46, - 8, 6, 1, 250, 112, 46, 8, 6, 1, 247, 207, 46, 8, 6, 1, 240, 231, 46, 8, - 6, 1, 69, 46, 8, 6, 1, 236, 49, 46, 8, 6, 1, 234, 190, 46, 8, 6, 1, 233, - 15, 46, 8, 6, 1, 68, 46, 8, 6, 1, 225, 217, 46, 8, 6, 1, 225, 80, 46, 8, - 6, 1, 159, 46, 8, 6, 1, 221, 136, 46, 8, 6, 1, 218, 55, 46, 8, 6, 1, 72, - 46, 8, 6, 1, 214, 3, 46, 8, 6, 1, 211, 167, 46, 8, 6, 1, 144, 46, 8, 6, - 1, 209, 80, 46, 8, 6, 1, 203, 216, 46, 8, 6, 1, 66, 46, 8, 6, 1, 199, - 230, 46, 8, 6, 1, 197, 199, 46, 8, 6, 1, 196, 222, 46, 8, 6, 1, 196, 148, - 46, 8, 6, 1, 195, 158, 46, 8, 4, 1, 63, 46, 8, 4, 1, 250, 112, 46, 8, 4, - 1, 247, 207, 46, 8, 4, 1, 240, 231, 46, 8, 4, 1, 69, 46, 8, 4, 1, 236, - 49, 46, 8, 4, 1, 234, 190, 46, 8, 4, 1, 233, 15, 46, 8, 4, 1, 68, 46, 8, - 4, 1, 225, 217, 46, 8, 4, 1, 225, 80, 46, 8, 4, 1, 159, 46, 8, 4, 1, 221, - 136, 46, 8, 4, 1, 218, 55, 46, 8, 4, 1, 72, 46, 8, 4, 1, 214, 3, 46, 8, - 4, 1, 211, 167, 46, 8, 4, 1, 144, 46, 8, 4, 1, 209, 80, 46, 8, 4, 1, 203, - 216, 46, 8, 4, 1, 66, 46, 8, 4, 1, 199, 230, 46, 8, 4, 1, 197, 199, 46, - 8, 4, 1, 196, 222, 46, 8, 4, 1, 196, 148, 46, 8, 4, 1, 195, 158, 46, 17, - 195, 79, 217, 104, 46, 31, 236, 252, 217, 104, 46, 31, 200, 239, 217, - 104, 46, 31, 202, 179, 217, 104, 46, 31, 235, 1, 217, 104, 46, 31, 235, - 149, 217, 104, 46, 31, 206, 23, 217, 104, 46, 31, 207, 68, 217, 104, 46, - 31, 237, 28, 217, 104, 46, 31, 216, 176, 217, 104, 46, 31, 200, 234, 52, - 46, 17, 100, 52, 46, 17, 102, 52, 46, 17, 134, 52, 46, 17, 136, 52, 46, - 17, 146, 52, 46, 17, 167, 52, 46, 17, 178, 52, 46, 17, 171, 52, 46, 17, - 182, 52, 46, 31, 203, 23, 217, 104, 46, 17, 195, 79, 111, 129, 175, 231, - 154, 111, 129, 85, 231, 154, 111, 129, 175, 199, 100, 111, 129, 85, 199, - 100, 111, 129, 175, 201, 165, 240, 66, 231, 154, 111, 129, 85, 201, 165, - 240, 66, 231, 154, 111, 129, 175, 201, 165, 240, 66, 199, 100, 111, 129, - 85, 201, 165, 240, 66, 199, 100, 111, 129, 175, 211, 90, 240, 66, 231, - 154, 111, 129, 85, 211, 90, 240, 66, 231, 154, 111, 129, 175, 211, 90, - 240, 66, 199, 100, 111, 129, 85, 211, 90, 240, 66, 199, 100, 111, 129, - 175, 135, 26, 210, 22, 111, 129, 135, 175, 26, 53, 232, 120, 111, 129, - 135, 85, 26, 53, 222, 95, 111, 129, 85, 135, 26, 210, 22, 111, 129, 175, - 135, 26, 222, 184, 111, 129, 135, 175, 26, 50, 232, 120, 111, 129, 135, - 85, 26, 50, 222, 95, 111, 129, 85, 135, 26, 222, 184, 111, 129, 175, 124, - 26, 210, 22, 111, 129, 124, 175, 26, 53, 232, 120, 111, 129, 124, 85, 26, - 53, 222, 95, 111, 129, 85, 124, 26, 210, 22, 111, 129, 175, 124, 26, 222, - 184, 111, 129, 124, 175, 26, 50, 232, 120, 111, 129, 124, 85, 26, 50, - 222, 95, 111, 129, 85, 124, 26, 222, 184, 111, 129, 175, 83, 26, 210, 22, - 111, 129, 83, 175, 26, 53, 232, 120, 111, 129, 124, 85, 26, 53, 135, 222, - 95, 111, 129, 135, 85, 26, 53, 124, 222, 95, 111, 129, 83, 85, 26, 53, - 222, 95, 111, 129, 135, 175, 26, 53, 124, 232, 120, 111, 129, 124, 175, - 26, 53, 135, 232, 120, 111, 129, 85, 83, 26, 210, 22, 111, 129, 175, 83, - 26, 222, 184, 111, 129, 83, 175, 26, 50, 232, 120, 111, 129, 124, 85, 26, - 50, 135, 222, 95, 111, 129, 135, 85, 26, 50, 124, 222, 95, 111, 129, 83, - 85, 26, 50, 222, 95, 111, 129, 135, 175, 26, 50, 124, 232, 120, 111, 129, - 124, 175, 26, 50, 135, 232, 120, 111, 129, 85, 83, 26, 222, 184, 111, - 129, 175, 135, 26, 231, 154, 111, 129, 50, 85, 26, 53, 135, 222, 95, 111, - 129, 53, 85, 26, 50, 135, 222, 95, 111, 129, 135, 175, 26, 231, 155, 232, - 120, 111, 129, 135, 85, 26, 231, 155, 222, 95, 111, 129, 53, 175, 26, 50, - 135, 232, 120, 111, 129, 50, 175, 26, 53, 135, 232, 120, 111, 129, 85, - 135, 26, 231, 154, 111, 129, 175, 124, 26, 231, 154, 111, 129, 50, 85, - 26, 53, 124, 222, 95, 111, 129, 53, 85, 26, 50, 124, 222, 95, 111, 129, - 124, 175, 26, 231, 155, 232, 120, 111, 129, 124, 85, 26, 231, 155, 222, - 95, 111, 129, 53, 175, 26, 50, 124, 232, 120, 111, 129, 50, 175, 26, 53, - 124, 232, 120, 111, 129, 85, 124, 26, 231, 154, 111, 129, 175, 83, 26, - 231, 154, 111, 129, 50, 85, 26, 53, 83, 222, 95, 111, 129, 53, 85, 26, - 50, 83, 222, 95, 111, 129, 83, 175, 26, 231, 155, 232, 120, 111, 129, - 124, 85, 26, 135, 231, 155, 222, 95, 111, 129, 135, 85, 26, 124, 231, - 155, 222, 95, 111, 129, 83, 85, 26, 231, 155, 222, 95, 111, 129, 50, 124, - 85, 26, 53, 135, 222, 95, 111, 129, 53, 124, 85, 26, 50, 135, 222, 95, - 111, 129, 50, 135, 85, 26, 53, 124, 222, 95, 111, 129, 53, 135, 85, 26, - 50, 124, 222, 95, 111, 129, 135, 175, 26, 124, 231, 155, 232, 120, 111, - 129, 124, 175, 26, 135, 231, 155, 232, 120, 111, 129, 53, 175, 26, 50, - 83, 232, 120, 111, 129, 50, 175, 26, 53, 83, 232, 120, 111, 129, 85, 83, - 26, 231, 154, 111, 129, 175, 52, 240, 66, 231, 154, 111, 129, 85, 52, - 240, 66, 231, 154, 111, 129, 175, 52, 240, 66, 199, 100, 111, 129, 85, - 52, 240, 66, 199, 100, 111, 129, 52, 231, 154, 111, 129, 52, 199, 100, - 111, 129, 135, 206, 62, 26, 53, 237, 245, 111, 129, 135, 52, 26, 53, 206, - 61, 111, 129, 52, 135, 26, 210, 22, 111, 129, 135, 206, 62, 26, 50, 237, - 245, 111, 129, 135, 52, 26, 50, 206, 61, 111, 129, 52, 135, 26, 222, 184, - 111, 129, 124, 206, 62, 26, 53, 237, 245, 111, 129, 124, 52, 26, 53, 206, - 61, 111, 129, 52, 124, 26, 210, 22, 111, 129, 124, 206, 62, 26, 50, 237, - 245, 111, 129, 124, 52, 26, 50, 206, 61, 111, 129, 52, 124, 26, 222, 184, - 111, 129, 83, 206, 62, 26, 53, 237, 245, 111, 129, 83, 52, 26, 53, 206, - 61, 111, 129, 52, 83, 26, 210, 22, 111, 129, 83, 206, 62, 26, 50, 237, - 245, 111, 129, 83, 52, 26, 50, 206, 61, 111, 129, 52, 83, 26, 222, 184, - 111, 129, 135, 206, 62, 26, 231, 155, 237, 245, 111, 129, 135, 52, 26, - 231, 155, 206, 61, 111, 129, 52, 135, 26, 231, 154, 111, 129, 124, 206, - 62, 26, 231, 155, 237, 245, 111, 129, 124, 52, 26, 231, 155, 206, 61, - 111, 129, 52, 124, 26, 231, 154, 111, 129, 83, 206, 62, 26, 231, 155, - 237, 245, 111, 129, 83, 52, 26, 231, 155, 206, 61, 111, 129, 52, 83, 26, - 231, 154, 111, 129, 175, 250, 254, 135, 26, 210, 22, 111, 129, 175, 250, - 254, 135, 26, 222, 184, 111, 129, 175, 250, 254, 124, 26, 222, 184, 111, - 129, 175, 250, 254, 124, 26, 210, 22, 111, 129, 175, 239, 147, 200, 33, - 53, 202, 30, 221, 203, 222, 184, 111, 129, 175, 239, 147, 200, 33, 50, - 202, 30, 221, 203, 210, 22, 111, 129, 175, 239, 147, 241, 61, 111, 129, - 175, 222, 184, 111, 129, 175, 200, 36, 111, 129, 175, 210, 22, 111, 129, - 175, 237, 235, 111, 129, 85, 222, 184, 111, 129, 85, 200, 36, 111, 129, - 85, 210, 22, 111, 129, 85, 237, 235, 111, 129, 175, 50, 26, 85, 210, 22, - 111, 129, 175, 124, 26, 85, 237, 235, 111, 129, 85, 50, 26, 175, 210, 22, - 111, 129, 85, 124, 26, 175, 237, 235, 200, 33, 157, 248, 126, 221, 203, - 97, 237, 27, 248, 126, 221, 203, 97, 211, 88, 248, 126, 221, 203, 115, - 237, 25, 248, 126, 221, 203, 157, 248, 126, 221, 203, 235, 101, 237, 25, - 248, 126, 221, 203, 115, 211, 86, 248, 126, 221, 203, 207, 71, 237, 25, - 248, 126, 234, 217, 248, 126, 50, 207, 71, 237, 25, 248, 126, 50, 115, - 211, 86, 248, 126, 50, 235, 101, 237, 25, 248, 126, 50, 157, 248, 126, - 50, 115, 237, 25, 248, 126, 50, 97, 211, 88, 248, 126, 50, 97, 237, 27, - 248, 126, 53, 157, 248, 126, 175, 207, 39, 219, 190, 207, 39, 240, 71, - 207, 39, 200, 33, 97, 237, 27, 248, 126, 53, 97, 237, 27, 248, 126, 211, - 92, 221, 203, 222, 184, 211, 92, 221, 203, 210, 22, 211, 92, 200, 33, - 222, 184, 211, 92, 200, 33, 50, 26, 221, 203, 50, 26, 221, 203, 210, 22, - 211, 92, 200, 33, 50, 26, 221, 203, 210, 22, 211, 92, 200, 33, 50, 26, - 200, 33, 53, 26, 221, 203, 222, 184, 211, 92, 200, 33, 50, 26, 200, 33, - 53, 26, 221, 203, 210, 22, 211, 92, 200, 33, 210, 22, 211, 92, 200, 33, - 53, 26, 221, 203, 222, 184, 211, 92, 200, 33, 53, 26, 221, 203, 50, 26, - 221, 203, 210, 22, 58, 205, 94, 59, 205, 94, 59, 47, 3, 209, 185, 241, - 100, 59, 47, 241, 132, 58, 4, 205, 94, 47, 3, 231, 155, 235, 136, 47, 3, - 83, 235, 136, 47, 3, 214, 55, 241, 56, 235, 136, 47, 3, 200, 33, 50, 202, - 30, 221, 203, 53, 235, 136, 47, 3, 200, 33, 53, 202, 30, 221, 203, 50, - 235, 136, 47, 3, 239, 147, 241, 56, 235, 136, 58, 4, 205, 94, 59, 4, 205, - 94, 58, 210, 163, 59, 210, 163, 58, 83, 210, 163, 59, 83, 210, 163, 58, - 213, 144, 59, 213, 144, 58, 200, 35, 201, 180, 59, 200, 35, 201, 180, 58, - 200, 35, 4, 201, 180, 59, 200, 35, 4, 201, 180, 58, 210, 17, 201, 180, - 59, 210, 17, 201, 180, 58, 210, 17, 4, 201, 180, 59, 210, 17, 4, 201, - 180, 58, 210, 17, 212, 108, 59, 210, 17, 212, 108, 58, 237, 234, 201, - 180, 59, 237, 234, 201, 180, 58, 237, 234, 4, 201, 180, 59, 237, 234, 4, - 201, 180, 58, 222, 179, 201, 180, 59, 222, 179, 201, 180, 58, 222, 179, - 4, 201, 180, 59, 222, 179, 4, 201, 180, 58, 222, 179, 212, 108, 59, 222, - 179, 212, 108, 58, 239, 140, 59, 239, 140, 59, 239, 141, 241, 132, 58, 4, - 239, 140, 235, 110, 221, 198, 59, 244, 249, 237, 250, 244, 249, 244, 250, - 3, 83, 235, 136, 248, 1, 58, 244, 249, 244, 250, 3, 50, 157, 248, 136, - 244, 250, 3, 53, 157, 248, 136, 244, 250, 3, 221, 203, 157, 248, 136, - 244, 250, 3, 200, 33, 157, 248, 136, 244, 250, 3, 200, 33, 53, 211, 92, - 248, 136, 244, 250, 3, 251, 147, 247, 232, 200, 33, 50, 211, 92, 248, - 136, 50, 157, 58, 244, 249, 53, 157, 58, 244, 249, 226, 19, 248, 5, 226, - 19, 59, 244, 249, 200, 33, 157, 226, 19, 59, 244, 249, 221, 203, 157, - 226, 19, 59, 244, 249, 200, 33, 50, 211, 92, 244, 243, 250, 253, 200, 33, - 53, 211, 92, 244, 243, 250, 253, 221, 203, 53, 211, 92, 244, 243, 250, - 253, 221, 203, 50, 211, 92, 244, 243, 250, 253, 200, 33, 157, 244, 249, - 221, 203, 157, 244, 249, 58, 221, 203, 53, 201, 180, 58, 221, 203, 50, - 201, 180, 58, 200, 33, 50, 201, 180, 58, 200, 33, 53, 201, 180, 59, 248, - 5, 47, 3, 50, 157, 248, 136, 47, 3, 53, 157, 248, 136, 47, 3, 200, 33, - 50, 239, 147, 157, 248, 136, 47, 3, 221, 203, 53, 239, 147, 157, 248, - 136, 59, 47, 3, 83, 248, 150, 222, 75, 59, 200, 35, 201, 181, 3, 238, - 253, 200, 35, 201, 181, 3, 50, 157, 248, 136, 200, 35, 201, 181, 3, 53, - 157, 248, 136, 222, 228, 244, 249, 59, 47, 3, 200, 33, 50, 211, 91, 59, - 47, 3, 221, 203, 50, 211, 91, 59, 47, 3, 221, 203, 53, 211, 91, 59, 47, - 3, 200, 33, 53, 211, 91, 59, 244, 250, 3, 200, 33, 50, 211, 91, 59, 244, - 250, 3, 221, 203, 50, 211, 91, 59, 244, 250, 3, 221, 203, 53, 211, 91, - 59, 244, 250, 3, 200, 33, 53, 211, 91, 200, 33, 50, 201, 180, 200, 33, - 53, 201, 180, 221, 203, 50, 201, 180, 59, 219, 190, 205, 94, 58, 219, - 190, 205, 94, 59, 219, 190, 4, 205, 94, 58, 219, 190, 4, 205, 94, 221, - 203, 53, 201, 180, 58, 204, 112, 3, 210, 188, 244, 194, 200, 76, 205, - 202, 244, 162, 58, 205, 7, 59, 205, 7, 222, 92, 202, 137, 204, 111, 250, - 198, 216, 42, 239, 194, 216, 42, 241, 141, 214, 78, 58, 203, 33, 59, 203, - 33, 249, 99, 248, 70, 249, 99, 111, 3, 245, 101, 249, 99, 111, 3, 196, - 222, 208, 230, 200, 77, 3, 210, 218, 237, 208, 231, 96, 248, 201, 59, - 206, 191, 212, 212, 58, 206, 191, 212, 212, 207, 26, 210, 89, 209, 194, - 235, 66, 232, 127, 248, 5, 58, 50, 212, 107, 226, 72, 58, 53, 212, 107, - 226, 72, 59, 50, 212, 107, 226, 72, 59, 124, 212, 107, 226, 72, 59, 53, - 212, 107, 226, 72, 59, 135, 212, 107, 226, 72, 205, 255, 26, 241, 60, - 247, 86, 55, 210, 230, 55, 248, 158, 55, 247, 165, 251, 79, 214, 56, 241, - 61, 245, 76, 210, 74, 241, 62, 77, 221, 220, 241, 62, 77, 225, 182, 205, - 8, 26, 241, 71, 235, 204, 105, 251, 254, 207, 29, 232, 217, 26, 206, 103, - 213, 91, 105, 196, 13, 196, 95, 201, 170, 36, 232, 122, 201, 170, 36, - 223, 1, 201, 170, 36, 235, 118, 201, 170, 36, 202, 138, 201, 170, 36, - 197, 50, 201, 170, 36, 197, 127, 201, 170, 36, 218, 169, 201, 170, 36, - 237, 72, 197, 78, 77, 239, 168, 59, 234, 229, 235, 233, 59, 205, 218, - 235, 233, 58, 205, 218, 235, 233, 59, 204, 112, 3, 210, 188, 235, 113, - 211, 88, 218, 189, 222, 221, 211, 88, 218, 189, 219, 158, 235, 172, 55, - 237, 72, 220, 67, 55, 225, 95, 208, 192, 200, 16, 217, 94, 212, 121, 250, - 239, 203, 87, 234, 35, 247, 138, 222, 146, 199, 5, 222, 106, 208, 157, - 208, 255, 247, 120, 251, 15, 212, 160, 59, 245, 83, 224, 73, 59, 245, 83, - 211, 80, 59, 245, 83, 209, 203, 59, 245, 83, 248, 148, 59, 245, 83, 224, - 19, 59, 245, 83, 213, 103, 58, 245, 83, 224, 73, 58, 245, 83, 211, 80, - 58, 245, 83, 209, 203, 58, 245, 83, 248, 148, 58, 245, 83, 224, 19, 58, - 245, 83, 213, 103, 58, 205, 146, 204, 124, 59, 232, 127, 204, 124, 59, - 239, 141, 204, 124, 58, 244, 191, 204, 124, 59, 205, 146, 204, 124, 58, - 232, 127, 204, 124, 58, 239, 141, 204, 124, 59, 244, 191, 204, 124, 231, - 96, 205, 99, 211, 88, 216, 13, 237, 27, 216, 13, 249, 5, 237, 27, 216, 8, - 249, 5, 206, 22, 216, 8, 218, 89, 235, 83, 55, 218, 89, 217, 203, 55, - 218, 89, 207, 13, 55, 197, 89, 203, 236, 241, 61, 237, 69, 203, 236, 241, - 61, 200, 46, 210, 159, 105, 210, 159, 16, 36, 200, 200, 212, 140, 210, - 159, 16, 36, 200, 198, 212, 140, 210, 159, 16, 36, 200, 197, 212, 140, - 210, 159, 16, 36, 200, 195, 212, 140, 210, 159, 16, 36, 200, 193, 212, - 140, 210, 159, 16, 36, 200, 191, 212, 140, 210, 159, 16, 36, 200, 189, - 212, 140, 210, 159, 16, 36, 234, 32, 220, 2, 58, 200, 46, 210, 159, 105, - 210, 160, 213, 162, 105, 213, 131, 213, 162, 105, 213, 37, 213, 162, 55, - 197, 76, 105, 239, 133, 235, 232, 239, 133, 235, 231, 239, 133, 235, 230, - 239, 133, 235, 229, 239, 133, 235, 228, 239, 133, 235, 227, 59, 244, 250, - 3, 76, 210, 22, 59, 244, 250, 3, 99, 238, 250, 58, 244, 250, 3, 59, 76, - 210, 22, 58, 244, 250, 3, 99, 59, 238, 250, 218, 205, 36, 196, 95, 218, - 205, 36, 196, 12, 239, 114, 36, 233, 95, 196, 95, 239, 114, 36, 222, 138, - 196, 12, 239, 114, 36, 222, 138, 196, 95, 239, 114, 36, 233, 95, 196, 12, - 59, 235, 93, 58, 235, 93, 232, 217, 26, 212, 216, 251, 102, 241, 59, 204, - 47, 205, 17, 77, 251, 228, 208, 175, 251, 163, 235, 62, 234, 45, 205, 17, - 77, 232, 94, 250, 158, 105, 235, 78, 214, 30, 59, 205, 7, 115, 222, 70, - 241, 118, 210, 22, 115, 222, 70, 241, 118, 222, 184, 197, 138, 55, 130, - 198, 237, 55, 237, 240, 235, 172, 55, 237, 240, 220, 67, 55, 226, 29, - 235, 172, 26, 220, 67, 55, 220, 67, 26, 235, 172, 55, 220, 67, 3, 204, - 196, 55, 220, 67, 3, 204, 196, 26, 220, 67, 26, 235, 172, 55, 83, 220, - 67, 3, 204, 196, 55, 231, 155, 220, 67, 3, 204, 196, 55, 219, 190, 59, - 244, 249, 219, 190, 58, 244, 249, 219, 190, 4, 59, 244, 249, 220, 21, - 105, 239, 52, 105, 200, 43, 213, 130, 105, 244, 173, 234, 212, 200, 12, - 217, 86, 247, 22, 213, 209, 225, 101, 199, 45, 245, 56, 58, 218, 190, - 222, 89, 207, 61, 207, 102, 211, 70, 207, 79, 205, 190, 249, 103, 249, - 65, 103, 224, 153, 59, 237, 220, 220, 62, 59, 237, 220, 224, 73, 58, 237, - 220, 220, 62, 58, 237, 220, 224, 73, 205, 203, 197, 37, 205, 206, 204, - 112, 248, 236, 244, 194, 210, 217, 58, 205, 202, 202, 139, 244, 195, 26, - 210, 217, 163, 59, 206, 191, 212, 212, 163, 58, 206, 191, 212, 212, 59, - 239, 141, 226, 87, 205, 94, 241, 55, 222, 235, 239, 81, 247, 116, 214, - 81, 212, 216, 247, 117, 205, 237, 232, 104, 3, 59, 241, 61, 46, 241, 55, - 222, 235, 247, 12, 216, 51, 236, 199, 251, 131, 214, 111, 50, 197, 113, - 201, 210, 58, 200, 212, 50, 197, 113, 201, 210, 59, 200, 212, 50, 197, - 113, 201, 210, 58, 50, 222, 236, 219, 157, 59, 50, 222, 236, 219, 157, - 237, 215, 205, 228, 55, 85, 59, 237, 234, 201, 180, 50, 244, 203, 236, - 199, 103, 208, 230, 235, 213, 239, 147, 226, 87, 59, 244, 250, 226, 87, - 58, 205, 94, 58, 201, 144, 210, 100, 50, 236, 198, 210, 100, 50, 236, - 197, 250, 173, 16, 36, 200, 16, 85, 244, 250, 3, 204, 196, 26, 99, 238, - 251, 57, 213, 54, 210, 19, 226, 31, 213, 54, 222, 181, 226, 31, 213, 54, - 226, 17, 213, 54, 58, 241, 62, 214, 120, 206, 220, 206, 208, 206, 156, - 245, 22, 247, 94, 232, 32, 206, 30, 234, 46, 197, 37, 231, 69, 234, 46, - 3, 232, 186, 220, 44, 16, 36, 222, 94, 218, 169, 200, 77, 214, 120, 233, - 85, 235, 8, 235, 94, 226, 87, 231, 175, 235, 162, 208, 250, 47, 235, 7, - 241, 100, 206, 2, 230, 202, 206, 6, 213, 29, 3, 249, 103, 203, 15, 225, - 202, 249, 85, 105, 232, 131, 233, 97, 105, 234, 220, 211, 215, 241, 28, - 214, 120, 58, 205, 94, 59, 235, 94, 3, 231, 155, 112, 58, 204, 197, 58, - 209, 4, 208, 161, 200, 33, 248, 131, 208, 161, 58, 208, 161, 221, 203, - 248, 131, 208, 161, 59, 208, 161, 59, 85, 245, 102, 78, 203, 34, 222, 4, - 55, 203, 104, 237, 214, 251, 187, 236, 194, 210, 215, 235, 106, 210, 215, - 232, 209, 199, 32, 232, 209, 196, 246, 232, 209, 221, 203, 53, 213, 64, - 213, 64, 200, 33, 53, 213, 64, 59, 216, 212, 58, 216, 212, 245, 102, 78, - 85, 245, 102, 78, 218, 118, 196, 222, 85, 218, 118, 196, 222, 249, 99, - 196, 222, 85, 249, 99, 196, 222, 214, 30, 32, 241, 61, 85, 32, 241, 61, - 192, 247, 37, 241, 61, 85, 192, 247, 37, 241, 61, 8, 241, 61, 207, 37, - 59, 8, 241, 61, 214, 30, 8, 241, 61, 220, 64, 241, 61, 205, 8, 77, 240, - 58, 235, 7, 203, 53, 250, 179, 235, 7, 249, 100, 250, 179, 85, 235, 7, - 249, 100, 250, 179, 235, 7, 244, 189, 250, 179, 58, 235, 7, 212, 109, - 205, 7, 59, 235, 7, 212, 109, 205, 7, 205, 141, 204, 206, 214, 30, 59, - 205, 7, 46, 59, 205, 7, 192, 247, 37, 58, 205, 7, 58, 247, 37, 59, 205, - 7, 214, 30, 58, 205, 7, 85, 214, 30, 58, 205, 7, 212, 170, 205, 7, 207, - 37, 59, 205, 7, 85, 250, 179, 192, 247, 37, 250, 179, 237, 31, 205, 110, - 250, 179, 237, 31, 212, 109, 58, 205, 7, 237, 31, 212, 109, 212, 170, - 205, 7, 206, 29, 212, 109, 58, 205, 7, 237, 31, 212, 109, 210, 161, 58, - 205, 7, 85, 237, 31, 212, 109, 210, 161, 58, 205, 7, 200, 240, 212, 109, - 58, 205, 7, 206, 24, 212, 109, 250, 179, 203, 53, 250, 179, 192, 247, 37, - 203, 53, 250, 179, 85, 203, 53, 250, 179, 206, 29, 213, 17, 58, 26, 59, - 235, 65, 58, 235, 65, 59, 235, 65, 237, 31, 213, 17, 214, 30, 58, 235, - 65, 46, 192, 247, 37, 237, 31, 212, 109, 205, 7, 85, 203, 53, 212, 170, - 250, 179, 205, 204, 202, 101, 201, 173, 205, 204, 85, 245, 79, 205, 204, - 205, 143, 85, 205, 143, 249, 100, 250, 179, 237, 31, 203, 53, 211, 250, - 250, 179, 85, 237, 31, 203, 53, 211, 250, 250, 179, 241, 62, 78, 207, 37, - 59, 244, 249, 217, 104, 103, 241, 62, 78, 221, 203, 53, 237, 210, 59, - 205, 94, 200, 33, 53, 237, 210, 59, 205, 94, 221, 203, 53, 207, 37, 59, - 205, 94, 200, 33, 53, 207, 37, 59, 205, 94, 58, 211, 79, 117, 214, 59, - 59, 211, 79, 117, 214, 59, 59, 236, 90, 117, 214, 59, 58, 239, 141, 219, - 16, 59, 196, 222, 85, 236, 90, 117, 105, 175, 83, 154, 219, 190, 83, 154, - 85, 83, 154, 85, 206, 62, 163, 244, 160, 211, 62, 117, 214, 59, 85, 206, - 62, 244, 160, 211, 62, 117, 214, 59, 85, 52, 163, 244, 160, 211, 62, 117, - 214, 59, 85, 52, 244, 160, 211, 62, 117, 214, 59, 85, 126, 206, 62, 244, - 160, 211, 62, 117, 214, 59, 85, 126, 52, 244, 160, 211, 62, 117, 214, 59, - 241, 10, 204, 244, 213, 154, 2, 214, 59, 85, 236, 90, 117, 214, 59, 85, - 232, 127, 236, 90, 117, 214, 59, 85, 58, 232, 126, 209, 194, 85, 58, 232, - 127, 248, 5, 235, 66, 232, 126, 209, 194, 235, 66, 232, 127, 248, 5, 219, - 190, 50, 213, 141, 214, 59, 219, 190, 53, 213, 141, 214, 59, 219, 190, - 235, 79, 50, 213, 141, 214, 59, 219, 190, 235, 79, 53, 213, 141, 214, 59, - 219, 190, 222, 179, 251, 91, 248, 62, 214, 59, 219, 190, 210, 17, 251, - 91, 248, 62, 214, 59, 85, 222, 179, 251, 91, 211, 62, 117, 214, 59, 85, - 210, 17, 251, 91, 211, 62, 117, 214, 59, 85, 222, 179, 251, 91, 248, 62, - 214, 59, 85, 210, 17, 251, 91, 248, 62, 214, 59, 175, 50, 201, 231, 206, - 245, 248, 62, 214, 59, 175, 53, 201, 231, 206, 245, 248, 62, 214, 59, - 219, 190, 50, 241, 18, 248, 62, 214, 59, 219, 190, 53, 241, 18, 248, 62, - 214, 59, 239, 93, 217, 104, 46, 17, 100, 239, 93, 217, 104, 46, 17, 102, - 239, 93, 217, 104, 46, 17, 134, 239, 93, 217, 104, 46, 17, 136, 239, 93, - 217, 104, 46, 17, 146, 239, 93, 217, 104, 46, 17, 167, 239, 93, 217, 104, - 46, 17, 178, 239, 93, 217, 104, 46, 17, 171, 239, 93, 217, 104, 46, 17, - 182, 239, 93, 217, 104, 46, 31, 203, 23, 239, 93, 46, 45, 17, 100, 239, - 93, 46, 45, 17, 102, 239, 93, 46, 45, 17, 134, 239, 93, 46, 45, 17, 136, - 239, 93, 46, 45, 17, 146, 239, 93, 46, 45, 17, 167, 239, 93, 46, 45, 17, - 178, 239, 93, 46, 45, 17, 171, 239, 93, 46, 45, 17, 182, 239, 93, 46, 45, - 31, 203, 23, 239, 93, 217, 104, 46, 45, 17, 100, 239, 93, 217, 104, 46, - 45, 17, 102, 239, 93, 217, 104, 46, 45, 17, 134, 239, 93, 217, 104, 46, - 45, 17, 136, 239, 93, 217, 104, 46, 45, 17, 146, 239, 93, 217, 104, 46, - 45, 17, 167, 239, 93, 217, 104, 46, 45, 17, 178, 239, 93, 217, 104, 46, - 45, 17, 171, 239, 93, 217, 104, 46, 45, 17, 182, 239, 93, 217, 104, 46, - 45, 31, 203, 23, 85, 197, 61, 91, 51, 85, 98, 55, 85, 219, 16, 55, 85, - 239, 54, 55, 85, 205, 159, 237, 69, 51, 85, 91, 51, 85, 173, 237, 69, 51, - 237, 225, 212, 111, 91, 51, 85, 209, 186, 91, 51, 201, 179, 91, 51, 85, - 201, 179, 91, 51, 240, 64, 201, 179, 91, 51, 85, 240, 64, 201, 179, 91, - 51, 58, 91, 51, 202, 154, 201, 241, 91, 250, 217, 202, 154, 248, 83, 91, - 250, 217, 58, 91, 250, 217, 85, 58, 241, 10, 237, 231, 26, 91, 51, 85, - 58, 241, 10, 200, 24, 26, 91, 51, 205, 91, 58, 91, 51, 85, 241, 154, 58, - 91, 51, 210, 16, 59, 91, 51, 222, 178, 59, 91, 51, 249, 137, 207, 37, 59, - 91, 51, 234, 232, 207, 37, 59, 91, 51, 85, 221, 203, 210, 15, 59, 91, 51, - 85, 200, 33, 210, 15, 59, 91, 51, 216, 15, 221, 203, 210, 15, 59, 91, 51, - 241, 18, 221, 225, 216, 15, 200, 33, 210, 15, 59, 91, 51, 46, 85, 59, 91, - 51, 197, 72, 91, 51, 248, 135, 205, 159, 237, 69, 51, 248, 135, 91, 51, - 248, 135, 173, 237, 69, 51, 85, 248, 135, 205, 159, 237, 69, 51, 85, 248, - 135, 91, 51, 85, 248, 135, 173, 237, 69, 51, 203, 55, 91, 51, 85, 203, - 54, 91, 51, 197, 99, 91, 51, 85, 197, 99, 91, 51, 214, 87, 91, 51, 52, - 241, 18, 221, 225, 115, 239, 103, 251, 90, 59, 201, 181, 241, 132, 4, 59, - 201, 180, 213, 32, 192, 204, 141, 192, 204, 93, 50, 209, 79, 249, 123, - 239, 218, 53, 209, 79, 249, 123, 239, 218, 214, 73, 3, 76, 226, 41, 210, - 90, 205, 178, 212, 34, 204, 141, 204, 94, 212, 34, 205, 177, 83, 249, 80, - 3, 231, 155, 106, 13, 209, 250, 239, 146, 181, 239, 53, 13, 235, 213, - 239, 146, 103, 221, 249, 251, 100, 103, 221, 249, 214, 72, 59, 239, 141, - 3, 247, 35, 238, 253, 26, 3, 238, 253, 237, 0, 77, 214, 85, 200, 23, 221, - 203, 53, 241, 102, 3, 238, 253, 200, 33, 50, 241, 102, 3, 238, 253, 50, - 214, 32, 225, 127, 53, 214, 32, 225, 127, 234, 217, 214, 32, 225, 127, - 222, 228, 124, 203, 147, 222, 228, 135, 203, 147, 50, 26, 53, 52, 201, 3, - 50, 26, 53, 203, 147, 50, 218, 122, 181, 53, 203, 147, 181, 50, 203, 147, - 124, 203, 148, 3, 244, 250, 57, 221, 199, 239, 60, 247, 219, 231, 155, - 209, 124, 59, 241, 153, 239, 140, 59, 241, 153, 239, 141, 3, 107, 202, - 111, 59, 241, 153, 239, 141, 3, 91, 202, 111, 59, 47, 3, 107, 202, 111, - 59, 47, 3, 91, 202, 111, 13, 50, 59, 47, 179, 13, 53, 59, 47, 179, 13, - 50, 251, 91, 179, 13, 53, 251, 91, 179, 13, 50, 52, 251, 91, 179, 13, 53, - 52, 251, 91, 179, 13, 50, 59, 201, 231, 206, 245, 179, 13, 53, 59, 201, - 231, 206, 245, 179, 13, 50, 235, 79, 213, 140, 13, 53, 235, 79, 213, 140, - 200, 24, 211, 90, 51, 237, 231, 211, 90, 51, 251, 65, 234, 85, 244, 250, - 51, 244, 205, 234, 85, 244, 250, 51, 53, 61, 3, 46, 212, 125, 181, 107, - 51, 181, 91, 51, 181, 50, 53, 51, 181, 107, 52, 51, 181, 91, 52, 51, 181, - 50, 53, 52, 51, 181, 107, 61, 234, 235, 154, 181, 91, 61, 234, 235, 154, - 181, 107, 52, 61, 234, 235, 154, 181, 91, 52, 61, 234, 235, 154, 181, 91, - 205, 87, 51, 64, 65, 248, 129, 64, 65, 238, 249, 64, 65, 238, 121, 64, - 65, 238, 248, 64, 65, 238, 57, 64, 65, 238, 184, 64, 65, 238, 120, 64, - 65, 238, 247, 64, 65, 238, 25, 64, 65, 238, 152, 64, 65, 238, 88, 64, 65, - 238, 215, 64, 65, 238, 56, 64, 65, 238, 183, 64, 65, 238, 119, 64, 65, - 238, 246, 64, 65, 238, 9, 64, 65, 238, 136, 64, 65, 238, 72, 64, 65, 238, - 199, 64, 65, 238, 40, 64, 65, 238, 167, 64, 65, 238, 103, 64, 65, 238, - 230, 64, 65, 238, 24, 64, 65, 238, 151, 64, 65, 238, 87, 64, 65, 238, - 214, 64, 65, 238, 55, 64, 65, 238, 182, 64, 65, 238, 118, 64, 65, 238, - 245, 64, 65, 238, 1, 64, 65, 238, 128, 64, 65, 238, 64, 64, 65, 238, 191, - 64, 65, 238, 32, 64, 65, 238, 159, 64, 65, 238, 95, 64, 65, 238, 222, 64, - 65, 238, 16, 64, 65, 238, 143, 64, 65, 238, 79, 64, 65, 238, 206, 64, 65, - 238, 47, 64, 65, 238, 174, 64, 65, 238, 110, 64, 65, 238, 237, 64, 65, - 238, 8, 64, 65, 238, 135, 64, 65, 238, 71, 64, 65, 238, 198, 64, 65, 238, - 39, 64, 65, 238, 166, 64, 65, 238, 102, 64, 65, 238, 229, 64, 65, 238, - 23, 64, 65, 238, 150, 64, 65, 238, 86, 64, 65, 238, 213, 64, 65, 238, 54, - 64, 65, 238, 181, 64, 65, 238, 117, 64, 65, 238, 244, 64, 65, 237, 253, - 64, 65, 238, 124, 64, 65, 238, 60, 64, 65, 238, 187, 64, 65, 238, 28, 64, - 65, 238, 155, 64, 65, 238, 91, 64, 65, 238, 218, 64, 65, 238, 12, 64, 65, - 238, 139, 64, 65, 238, 75, 64, 65, 238, 202, 64, 65, 238, 43, 64, 65, - 238, 170, 64, 65, 238, 106, 64, 65, 238, 233, 64, 65, 238, 4, 64, 65, - 238, 131, 64, 65, 238, 67, 64, 65, 238, 194, 64, 65, 238, 35, 64, 65, - 238, 162, 64, 65, 238, 98, 64, 65, 238, 225, 64, 65, 238, 19, 64, 65, - 238, 146, 64, 65, 238, 82, 64, 65, 238, 209, 64, 65, 238, 50, 64, 65, - 238, 177, 64, 65, 238, 113, 64, 65, 238, 240, 64, 65, 238, 0, 64, 65, - 238, 127, 64, 65, 238, 63, 64, 65, 238, 190, 64, 65, 238, 31, 64, 65, - 238, 158, 64, 65, 238, 94, 64, 65, 238, 221, 64, 65, 238, 15, 64, 65, - 238, 142, 64, 65, 238, 78, 64, 65, 238, 205, 64, 65, 238, 46, 64, 65, - 238, 173, 64, 65, 238, 109, 64, 65, 238, 236, 64, 65, 238, 7, 64, 65, - 238, 134, 64, 65, 238, 70, 64, 65, 238, 197, 64, 65, 238, 38, 64, 65, - 238, 165, 64, 65, 238, 101, 64, 65, 238, 228, 64, 65, 238, 22, 64, 65, - 238, 149, 64, 65, 238, 85, 64, 65, 238, 212, 64, 65, 238, 53, 64, 65, - 238, 180, 64, 65, 238, 116, 64, 65, 238, 243, 64, 65, 237, 251, 64, 65, - 238, 122, 64, 65, 238, 58, 64, 65, 238, 185, 64, 65, 238, 26, 64, 65, - 238, 153, 64, 65, 238, 89, 64, 65, 238, 216, 64, 65, 238, 10, 64, 65, - 238, 137, 64, 65, 238, 73, 64, 65, 238, 200, 64, 65, 238, 41, 64, 65, - 238, 168, 64, 65, 238, 104, 64, 65, 238, 231, 64, 65, 238, 2, 64, 65, - 238, 129, 64, 65, 238, 65, 64, 65, 238, 192, 64, 65, 238, 33, 64, 65, - 238, 160, 64, 65, 238, 96, 64, 65, 238, 223, 64, 65, 238, 17, 64, 65, - 238, 144, 64, 65, 238, 80, 64, 65, 238, 207, 64, 65, 238, 48, 64, 65, - 238, 175, 64, 65, 238, 111, 64, 65, 238, 238, 64, 65, 237, 254, 64, 65, - 238, 125, 64, 65, 238, 61, 64, 65, 238, 188, 64, 65, 238, 29, 64, 65, - 238, 156, 64, 65, 238, 92, 64, 65, 238, 219, 64, 65, 238, 13, 64, 65, - 238, 140, 64, 65, 238, 76, 64, 65, 238, 203, 64, 65, 238, 44, 64, 65, - 238, 171, 64, 65, 238, 107, 64, 65, 238, 234, 64, 65, 238, 5, 64, 65, - 238, 132, 64, 65, 238, 68, 64, 65, 238, 195, 64, 65, 238, 36, 64, 65, - 238, 163, 64, 65, 238, 99, 64, 65, 238, 226, 64, 65, 238, 20, 64, 65, - 238, 147, 64, 65, 238, 83, 64, 65, 238, 210, 64, 65, 238, 51, 64, 65, - 238, 178, 64, 65, 238, 114, 64, 65, 238, 241, 64, 65, 237, 252, 64, 65, - 238, 123, 64, 65, 238, 59, 64, 65, 238, 186, 64, 65, 238, 27, 64, 65, - 238, 154, 64, 65, 238, 90, 64, 65, 238, 217, 64, 65, 238, 11, 64, 65, - 238, 138, 64, 65, 238, 74, 64, 65, 238, 201, 64, 65, 238, 42, 64, 65, - 238, 169, 64, 65, 238, 105, 64, 65, 238, 232, 64, 65, 238, 3, 64, 65, - 238, 130, 64, 65, 238, 66, 64, 65, 238, 193, 64, 65, 238, 34, 64, 65, - 238, 161, 64, 65, 238, 97, 64, 65, 238, 224, 64, 65, 238, 18, 64, 65, - 238, 145, 64, 65, 238, 81, 64, 65, 238, 208, 64, 65, 238, 49, 64, 65, - 238, 176, 64, 65, 238, 112, 64, 65, 238, 239, 64, 65, 237, 255, 64, 65, - 238, 126, 64, 65, 238, 62, 64, 65, 238, 189, 64, 65, 238, 30, 64, 65, - 238, 157, 64, 65, 238, 93, 64, 65, 238, 220, 64, 65, 238, 14, 64, 65, - 238, 141, 64, 65, 238, 77, 64, 65, 238, 204, 64, 65, 238, 45, 64, 65, - 238, 172, 64, 65, 238, 108, 64, 65, 238, 235, 64, 65, 238, 6, 64, 65, - 238, 133, 64, 65, 238, 69, 64, 65, 238, 196, 64, 65, 238, 37, 64, 65, - 238, 164, 64, 65, 238, 100, 64, 65, 238, 227, 64, 65, 238, 21, 64, 65, - 238, 148, 64, 65, 238, 84, 64, 65, 238, 211, 64, 65, 238, 52, 64, 65, - 238, 179, 64, 65, 238, 115, 64, 65, 238, 242, 91, 200, 215, 61, 3, 83, - 106, 91, 200, 215, 61, 3, 52, 83, 106, 107, 52, 61, 3, 83, 106, 91, 52, - 61, 3, 83, 106, 50, 53, 52, 61, 3, 83, 106, 91, 200, 215, 61, 234, 235, - 154, 107, 52, 61, 234, 235, 154, 91, 52, 61, 234, 235, 154, 237, 231, 61, - 3, 231, 155, 106, 200, 24, 61, 3, 231, 155, 106, 200, 24, 201, 165, 51, - 237, 231, 201, 165, 51, 107, 52, 240, 66, 51, 91, 52, 240, 66, 51, 107, - 201, 165, 240, 66, 51, 91, 201, 165, 240, 66, 51, 91, 200, 215, 201, 165, - 240, 66, 51, 91, 61, 3, 237, 250, 204, 243, 200, 24, 61, 202, 30, 154, - 237, 231, 61, 202, 30, 154, 91, 61, 3, 203, 136, 3, 83, 106, 91, 61, 3, - 203, 136, 3, 52, 83, 106, 91, 200, 215, 61, 3, 203, 135, 91, 200, 215, - 61, 3, 203, 136, 3, 83, 106, 91, 200, 215, 61, 3, 203, 136, 3, 52, 83, - 106, 107, 250, 219, 91, 250, 219, 107, 52, 250, 219, 91, 52, 250, 219, - 107, 61, 202, 30, 58, 239, 140, 91, 61, 202, 30, 58, 239, 140, 107, 61, - 234, 235, 249, 80, 202, 30, 58, 239, 140, 91, 61, 234, 235, 249, 80, 202, - 30, 58, 239, 140, 173, 197, 89, 26, 205, 159, 237, 69, 51, 173, 237, 69, - 26, 205, 159, 197, 89, 51, 173, 197, 89, 61, 3, 122, 173, 237, 69, 61, 3, - 122, 205, 159, 237, 69, 61, 3, 122, 205, 159, 197, 89, 61, 3, 122, 173, - 197, 89, 61, 26, 173, 237, 69, 51, 173, 237, 69, 61, 26, 205, 159, 237, - 69, 51, 205, 159, 237, 69, 61, 26, 205, 159, 197, 89, 51, 205, 159, 197, - 89, 61, 26, 173, 197, 89, 51, 209, 250, 239, 147, 241, 55, 235, 213, 239, - 146, 235, 213, 239, 147, 241, 55, 209, 250, 239, 146, 205, 159, 237, 69, - 61, 241, 55, 173, 237, 69, 51, 173, 237, 69, 61, 241, 55, 205, 159, 237, - 69, 51, 235, 213, 239, 147, 241, 55, 173, 237, 69, 51, 209, 250, 239, - 147, 241, 55, 205, 159, 237, 69, 51, 173, 237, 69, 61, 241, 55, 173, 197, - 89, 51, 173, 197, 89, 61, 241, 55, 173, 237, 69, 51, 197, 123, 61, 212, - 107, 239, 83, 210, 22, 61, 212, 107, 91, 202, 209, 241, 8, 200, 23, 61, - 212, 107, 91, 202, 209, 241, 8, 237, 230, 61, 212, 107, 237, 231, 202, - 209, 241, 8, 222, 174, 61, 212, 107, 237, 231, 202, 209, 241, 8, 210, 11, - 210, 14, 250, 254, 244, 205, 51, 222, 177, 250, 254, 251, 65, 51, 201, - 243, 250, 254, 251, 65, 51, 248, 85, 250, 254, 251, 65, 51, 201, 243, - 250, 254, 244, 205, 61, 3, 219, 15, 201, 243, 250, 254, 251, 65, 61, 3, - 212, 125, 221, 203, 53, 207, 107, 244, 205, 51, 221, 203, 50, 207, 107, - 251, 65, 51, 251, 65, 244, 203, 244, 250, 51, 244, 205, 244, 203, 244, - 250, 51, 91, 61, 90, 206, 182, 107, 51, 107, 61, 90, 206, 182, 91, 51, - 206, 182, 91, 61, 90, 107, 51, 91, 61, 3, 98, 60, 107, 61, 3, 98, 60, 91, - 61, 202, 145, 196, 222, 50, 53, 61, 202, 145, 4, 244, 249, 200, 24, 200, - 215, 61, 234, 235, 4, 244, 249, 50, 165, 124, 53, 165, 135, 232, 168, 50, - 165, 135, 53, 165, 124, 232, 168, 124, 165, 53, 135, 165, 50, 232, 168, - 124, 165, 50, 135, 165, 53, 232, 168, 50, 165, 124, 53, 165, 124, 232, - 168, 124, 165, 53, 135, 165, 53, 232, 168, 50, 165, 135, 53, 165, 135, - 232, 168, 124, 165, 50, 135, 165, 50, 232, 168, 107, 232, 169, 3, 165, - 124, 202, 30, 154, 91, 232, 169, 3, 165, 124, 202, 30, 154, 200, 24, 232, - 169, 3, 165, 53, 202, 30, 154, 237, 231, 232, 169, 3, 165, 53, 202, 30, - 154, 107, 232, 169, 3, 165, 135, 202, 30, 154, 91, 232, 169, 3, 165, 135, - 202, 30, 154, 200, 24, 232, 169, 3, 165, 50, 202, 30, 154, 237, 231, 232, - 169, 3, 165, 50, 202, 30, 154, 107, 232, 169, 3, 165, 124, 234, 235, 154, - 91, 232, 169, 3, 165, 124, 234, 235, 154, 200, 24, 232, 169, 3, 165, 53, - 234, 235, 154, 237, 231, 232, 169, 3, 165, 53, 234, 235, 154, 107, 232, - 169, 3, 165, 135, 234, 235, 154, 91, 232, 169, 3, 165, 135, 234, 235, - 154, 200, 24, 232, 169, 3, 165, 50, 234, 235, 154, 237, 231, 232, 169, 3, - 165, 50, 234, 235, 154, 107, 232, 169, 3, 165, 124, 90, 107, 232, 169, 3, - 165, 237, 235, 200, 24, 232, 169, 3, 165, 50, 248, 210, 200, 24, 232, - 169, 3, 165, 210, 22, 91, 232, 169, 3, 165, 124, 90, 91, 232, 169, 3, - 165, 237, 235, 237, 231, 232, 169, 3, 165, 50, 248, 210, 237, 231, 232, - 169, 3, 165, 210, 22, 107, 232, 169, 3, 165, 124, 90, 91, 232, 169, 3, - 165, 200, 36, 107, 232, 169, 3, 165, 135, 90, 91, 232, 169, 3, 165, 237, - 235, 91, 232, 169, 3, 165, 124, 90, 107, 232, 169, 3, 165, 200, 36, 91, - 232, 169, 3, 165, 135, 90, 107, 232, 169, 3, 165, 237, 235, 107, 232, - 169, 3, 165, 124, 90, 181, 240, 65, 107, 232, 169, 3, 165, 135, 248, 227, - 181, 240, 65, 91, 232, 169, 3, 165, 124, 90, 181, 240, 65, 91, 232, 169, - 3, 165, 135, 248, 227, 181, 240, 65, 200, 24, 232, 169, 3, 165, 50, 248, - 210, 237, 231, 232, 169, 3, 165, 210, 22, 237, 231, 232, 169, 3, 165, 50, - 248, 210, 200, 24, 232, 169, 3, 165, 210, 22, 53, 52, 61, 3, 209, 185, - 232, 137, 236, 172, 2, 90, 91, 51, 202, 85, 214, 83, 90, 91, 51, 107, 61, - 90, 202, 85, 214, 82, 91, 61, 90, 202, 85, 214, 82, 91, 61, 90, 251, 139, - 180, 149, 222, 140, 90, 107, 51, 107, 61, 202, 145, 222, 139, 233, 94, - 90, 91, 51, 204, 142, 90, 91, 51, 107, 61, 202, 145, 204, 141, 204, 94, - 90, 107, 51, 50, 235, 112, 203, 135, 53, 235, 112, 203, 135, 124, 235, - 112, 203, 135, 135, 235, 112, 203, 135, 201, 165, 83, 249, 80, 239, 218, - 195, 159, 216, 17, 205, 105, 195, 159, 216, 17, 200, 201, 244, 168, 50, - 59, 241, 18, 179, 53, 59, 241, 18, 179, 50, 59, 213, 140, 53, 59, 213, - 140, 195, 159, 216, 17, 50, 226, 102, 179, 195, 159, 216, 17, 53, 226, - 102, 179, 195, 159, 216, 17, 50, 248, 162, 179, 195, 159, 216, 17, 53, - 248, 162, 179, 50, 47, 248, 62, 3, 200, 62, 53, 47, 248, 62, 3, 200, 62, - 50, 47, 248, 62, 3, 202, 112, 226, 87, 201, 243, 241, 101, 53, 47, 248, - 62, 3, 202, 112, 226, 87, 248, 85, 241, 101, 50, 47, 248, 62, 3, 202, - 112, 226, 87, 248, 85, 241, 101, 53, 47, 248, 62, 3, 202, 112, 226, 87, - 201, 243, 241, 101, 50, 251, 91, 248, 62, 3, 238, 253, 53, 251, 91, 248, - 62, 3, 238, 253, 50, 250, 254, 222, 140, 179, 53, 250, 254, 233, 94, 179, - 52, 50, 250, 254, 233, 94, 179, 52, 53, 250, 254, 222, 140, 179, 50, 58, - 201, 231, 206, 245, 179, 53, 58, 201, 231, 206, 245, 179, 237, 250, 235, - 169, 83, 195, 24, 222, 75, 219, 201, 251, 91, 214, 85, 222, 184, 53, 251, - 91, 199, 132, 3, 205, 94, 219, 201, 53, 251, 91, 3, 238, 253, 251, 91, 3, - 209, 81, 226, 41, 252, 10, 251, 90, 205, 127, 251, 91, 214, 85, 222, 184, - 205, 127, 251, 91, 214, 85, 200, 36, 163, 251, 90, 210, 89, 251, 90, 251, - 91, 3, 200, 62, 210, 89, 251, 91, 3, 200, 62, 214, 182, 251, 91, 214, 85, - 200, 36, 214, 182, 251, 91, 214, 85, 237, 235, 219, 201, 251, 91, 3, 192, - 250, 232, 236, 218, 226, 87, 61, 212, 107, 124, 26, 210, 22, 219, 201, - 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, 107, 124, 26, 222, - 184, 219, 201, 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, - 107, 135, 26, 210, 22, 219, 201, 251, 91, 3, 192, 250, 232, 236, 218, - 226, 87, 61, 212, 107, 135, 26, 222, 184, 219, 201, 251, 91, 3, 192, 250, - 232, 236, 218, 226, 87, 61, 212, 107, 53, 26, 200, 36, 219, 201, 251, 91, - 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, 107, 50, 26, 200, 36, 219, - 201, 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, 107, 53, 26, - 237, 235, 219, 201, 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, - 212, 107, 50, 26, 237, 235, 210, 89, 236, 232, 207, 76, 236, 232, 207, - 77, 3, 214, 26, 236, 232, 207, 77, 3, 4, 244, 250, 57, 236, 232, 207, 77, - 3, 53, 61, 57, 236, 232, 207, 77, 3, 50, 61, 57, 244, 250, 3, 231, 155, - 154, 46, 83, 154, 46, 213, 145, 46, 210, 90, 205, 177, 46, 213, 32, 244, - 250, 239, 60, 247, 219, 231, 155, 249, 80, 26, 201, 243, 157, 239, 60, - 247, 219, 83, 154, 244, 250, 3, 204, 96, 196, 222, 46, 251, 63, 239, 54, - 55, 124, 61, 202, 145, 244, 249, 46, 59, 248, 5, 46, 248, 5, 46, 222, - 139, 46, 233, 93, 244, 250, 3, 4, 244, 250, 202, 30, 202, 218, 210, 22, - 244, 250, 3, 99, 231, 155, 204, 184, 202, 30, 202, 218, 210, 22, 103, - 209, 250, 239, 147, 205, 248, 103, 235, 213, 239, 147, 205, 248, 103, - 250, 179, 103, 4, 244, 249, 103, 205, 94, 99, 225, 126, 205, 92, 201, - 181, 3, 76, 57, 201, 181, 3, 200, 62, 209, 81, 226, 87, 201, 180, 201, - 181, 3, 207, 84, 250, 169, 248, 84, 53, 201, 181, 90, 50, 201, 180, 50, - 201, 181, 248, 210, 83, 154, 83, 249, 80, 248, 210, 53, 201, 180, 248, - 72, 3, 50, 157, 248, 136, 248, 72, 3, 53, 157, 248, 136, 58, 248, 71, 24, - 3, 50, 157, 248, 136, 24, 3, 53, 157, 248, 136, 59, 231, 89, 58, 231, 89, - 50, 197, 56, 235, 169, 53, 197, 56, 235, 169, 50, 52, 197, 56, 235, 169, - 53, 52, 197, 56, 235, 169, 226, 79, 226, 63, 202, 108, 127, 226, 63, 226, - 64, 217, 106, 3, 83, 154, 237, 244, 218, 122, 47, 3, 241, 124, 214, 31, - 226, 76, 250, 202, 206, 144, 212, 5, 236, 172, 2, 26, 205, 250, 213, 145, - 236, 172, 2, 26, 205, 250, 213, 146, 3, 202, 85, 57, 230, 193, 202, 30, - 26, 205, 250, 213, 145, 233, 155, 205, 6, 202, 206, 237, 234, 201, 181, - 3, 50, 157, 248, 136, 237, 234, 201, 181, 3, 53, 157, 248, 136, 58, 239, - 141, 3, 135, 51, 58, 221, 198, 59, 244, 250, 3, 135, 51, 58, 244, 250, 3, - 135, 51, 236, 154, 59, 205, 94, 236, 154, 58, 205, 94, 236, 154, 59, 239, - 140, 236, 154, 58, 239, 140, 236, 154, 59, 244, 249, 236, 154, 58, 244, - 249, 209, 123, 210, 90, 205, 178, 214, 82, 205, 178, 3, 214, 26, 210, 90, - 205, 178, 3, 231, 155, 106, 248, 171, 205, 177, 248, 171, 210, 90, 205, - 177, 52, 212, 125, 201, 165, 212, 125, 222, 179, 241, 10, 251, 91, 179, - 210, 17, 241, 10, 251, 91, 179, 202, 69, 219, 13, 218, 54, 46, 76, 214, - 82, 218, 54, 46, 98, 214, 82, 218, 54, 46, 24, 214, 82, 218, 54, 200, 52, - 214, 83, 3, 238, 253, 218, 54, 200, 52, 214, 83, 3, 212, 125, 218, 54, - 47, 226, 24, 214, 82, 218, 54, 47, 200, 52, 214, 82, 99, 221, 249, 26, - 214, 82, 99, 221, 249, 214, 73, 214, 82, 218, 54, 24, 214, 82, 218, 219, - 99, 204, 117, 204, 115, 3, 226, 37, 211, 90, 226, 38, 214, 82, 235, 121, - 213, 134, 226, 37, 226, 38, 3, 52, 106, 226, 38, 250, 130, 3, 205, 248, - 244, 242, 234, 214, 251, 65, 226, 35, 222, 76, 226, 36, 3, 210, 162, 213, - 113, 250, 227, 212, 101, 222, 76, 226, 36, 3, 207, 107, 213, 113, 250, - 227, 212, 101, 222, 76, 226, 36, 216, 19, 226, 81, 202, 218, 212, 101, - 226, 38, 250, 227, 39, 212, 111, 214, 82, 211, 84, 226, 38, 214, 82, 226, - 38, 3, 107, 61, 3, 122, 226, 38, 3, 24, 55, 226, 38, 3, 226, 23, 226, 38, - 3, 200, 51, 226, 38, 3, 214, 26, 226, 38, 3, 200, 62, 225, 127, 222, 228, - 50, 201, 181, 214, 82, 195, 159, 216, 17, 208, 169, 241, 160, 195, 159, - 216, 17, 208, 169, 212, 166, 195, 159, 216, 17, 208, 169, 212, 0, 98, 2, - 3, 4, 244, 250, 57, 98, 2, 3, 244, 241, 252, 23, 57, 98, 2, 3, 202, 85, - 57, 98, 2, 3, 76, 60, 98, 2, 3, 202, 85, 60, 98, 2, 3, 204, 143, 102, 98, - 2, 3, 58, 201, 180, 219, 16, 2, 3, 244, 160, 57, 219, 16, 2, 3, 76, 60, - 219, 16, 2, 3, 235, 213, 238, 250, 219, 16, 2, 3, 209, 250, 238, 250, 98, - 2, 226, 87, 50, 157, 244, 249, 98, 2, 226, 87, 53, 157, 244, 249, 199, - 117, 214, 73, 241, 62, 212, 5, 218, 118, 2, 3, 76, 57, 218, 118, 2, 3, - 200, 62, 207, 104, 212, 6, 3, 248, 85, 244, 202, 205, 222, 212, 5, 218, - 118, 2, 226, 87, 50, 157, 244, 249, 218, 118, 2, 226, 87, 53, 157, 244, - 249, 46, 218, 118, 2, 3, 244, 241, 252, 22, 218, 118, 2, 226, 87, 52, - 244, 249, 46, 239, 54, 55, 98, 2, 226, 87, 201, 180, 219, 16, 2, 226, 87, - 201, 180, 218, 118, 2, 226, 87, 201, 180, 226, 32, 212, 5, 210, 12, 226, - 32, 212, 5, 195, 159, 216, 17, 210, 135, 241, 160, 251, 121, 214, 73, - 241, 108, 226, 24, 3, 238, 253, 200, 52, 3, 219, 16, 55, 200, 52, 3, 214, - 26, 226, 24, 3, 214, 26, 226, 24, 3, 221, 249, 251, 100, 200, 52, 3, 221, - 249, 214, 72, 200, 52, 90, 226, 23, 226, 24, 90, 200, 51, 200, 52, 90, - 249, 80, 90, 226, 23, 226, 24, 90, 249, 80, 90, 200, 51, 200, 52, 248, - 210, 26, 225, 126, 3, 200, 51, 226, 24, 248, 210, 26, 225, 126, 3, 226, - 23, 244, 203, 200, 52, 3, 207, 83, 244, 203, 226, 24, 3, 207, 83, 52, 47, - 226, 23, 52, 47, 200, 51, 244, 203, 200, 52, 3, 207, 84, 26, 205, 222, - 212, 5, 221, 249, 26, 3, 76, 57, 221, 249, 214, 73, 3, 76, 57, 52, 221, - 249, 251, 100, 52, 221, 249, 214, 72, 99, 226, 25, 221, 249, 251, 100, - 99, 226, 25, 221, 249, 214, 72, 205, 232, 222, 228, 214, 72, 205, 232, - 222, 228, 251, 100, 221, 249, 214, 73, 214, 22, 221, 249, 251, 100, 221, - 249, 26, 3, 112, 204, 243, 221, 249, 214, 73, 3, 112, 204, 243, 221, 249, - 26, 3, 231, 155, 240, 65, 221, 249, 214, 73, 3, 231, 155, 240, 65, 221, - 249, 26, 3, 52, 214, 26, 221, 249, 26, 3, 200, 62, 221, 249, 26, 3, 52, - 200, 62, 4, 199, 114, 3, 200, 62, 221, 249, 214, 73, 3, 52, 214, 26, 221, - 249, 214, 73, 3, 52, 200, 62, 195, 159, 216, 17, 239, 7, 251, 55, 195, - 159, 216, 17, 210, 205, 251, 55, 236, 172, 2, 3, 76, 60, 230, 193, 3, 76, - 57, 201, 165, 231, 155, 249, 80, 3, 52, 83, 106, 201, 165, 231, 155, 249, - 80, 3, 201, 165, 83, 106, 202, 85, 214, 83, 3, 76, 57, 202, 85, 214, 83, - 3, 209, 250, 238, 250, 206, 71, 219, 16, 206, 70, 241, 147, 3, 76, 57, - 236, 172, 3, 250, 179, 251, 139, 180, 202, 30, 3, 244, 241, 252, 22, 251, - 21, 180, 214, 73, 180, 149, 236, 172, 2, 90, 98, 55, 98, 2, 90, 236, 172, - 55, 236, 172, 2, 90, 202, 85, 214, 82, 52, 244, 169, 236, 173, 99, 241, - 140, 236, 172, 206, 85, 115, 241, 140, 236, 172, 206, 85, 236, 172, 2, 3, - 99, 238, 251, 90, 26, 99, 238, 251, 60, 236, 165, 3, 235, 7, 238, 251, - 57, 222, 140, 3, 244, 250, 226, 41, 233, 94, 3, 244, 250, 226, 41, 222, - 140, 3, 211, 79, 117, 57, 233, 94, 3, 211, 79, 117, 57, 222, 140, 214, - 73, 205, 250, 180, 149, 233, 94, 214, 73, 205, 250, 180, 149, 222, 140, - 214, 73, 205, 250, 180, 202, 30, 3, 76, 226, 41, 233, 94, 214, 73, 205, - 250, 180, 202, 30, 3, 76, 226, 41, 222, 140, 214, 73, 205, 250, 180, 202, - 30, 3, 76, 57, 233, 94, 214, 73, 205, 250, 180, 202, 30, 3, 76, 57, 222, - 140, 214, 73, 205, 250, 180, 202, 30, 3, 76, 90, 210, 22, 233, 94, 214, - 73, 205, 250, 180, 202, 30, 3, 76, 90, 222, 184, 222, 140, 214, 73, 251, - 22, 233, 94, 214, 73, 251, 22, 222, 140, 26, 206, 60, 216, 19, 180, 149, - 233, 94, 26, 206, 60, 216, 19, 180, 149, 222, 140, 26, 216, 19, 251, 22, - 233, 94, 26, 216, 19, 251, 22, 222, 140, 90, 237, 243, 180, 90, 233, 93, - 233, 94, 90, 237, 243, 180, 90, 222, 139, 222, 140, 90, 206, 71, 214, 73, - 236, 173, 233, 94, 90, 206, 71, 214, 73, 236, 173, 222, 140, 90, 206, 71, - 90, 233, 93, 233, 94, 90, 206, 71, 90, 222, 139, 222, 140, 90, 233, 94, - 90, 237, 243, 236, 173, 233, 94, 90, 222, 140, 90, 237, 243, 236, 173, - 222, 140, 90, 205, 250, 180, 90, 233, 94, 90, 205, 250, 236, 173, 233, - 94, 90, 205, 250, 180, 90, 222, 140, 90, 205, 250, 236, 173, 205, 250, - 180, 202, 30, 214, 73, 222, 139, 205, 250, 180, 202, 30, 214, 73, 233, - 93, 205, 250, 180, 202, 30, 214, 73, 222, 140, 3, 76, 226, 41, 205, 250, - 180, 202, 30, 214, 73, 233, 94, 3, 76, 226, 41, 237, 243, 180, 202, 30, - 214, 73, 222, 139, 237, 243, 180, 202, 30, 214, 73, 233, 93, 237, 243, - 205, 250, 180, 202, 30, 214, 73, 222, 139, 237, 243, 205, 250, 180, 202, - 30, 214, 73, 233, 93, 206, 71, 214, 73, 222, 139, 206, 71, 214, 73, 233, - 93, 206, 71, 90, 222, 140, 90, 236, 172, 55, 206, 71, 90, 233, 94, 90, - 236, 172, 55, 52, 217, 90, 222, 139, 52, 217, 90, 233, 93, 52, 217, 90, - 222, 140, 3, 200, 62, 233, 94, 214, 22, 222, 139, 233, 94, 248, 210, 222, - 139, 222, 140, 244, 203, 247, 219, 241, 11, 233, 94, 244, 203, 247, 219, - 241, 11, 222, 140, 244, 203, 247, 219, 241, 12, 90, 205, 250, 236, 173, - 233, 94, 244, 203, 247, 219, 241, 12, 90, 205, 250, 236, 173, 205, 223, - 202, 222, 222, 226, 202, 222, 205, 223, 202, 223, 214, 73, 180, 149, 222, - 226, 202, 223, 214, 73, 180, 149, 236, 172, 2, 3, 247, 254, 57, 212, 36, - 90, 206, 60, 236, 172, 55, 204, 134, 90, 206, 60, 236, 172, 55, 212, 36, - 90, 206, 60, 216, 19, 180, 149, 204, 134, 90, 206, 60, 216, 19, 180, 149, - 212, 36, 90, 236, 172, 55, 204, 134, 90, 236, 172, 55, 212, 36, 90, 216, - 19, 180, 149, 204, 134, 90, 216, 19, 180, 149, 212, 36, 90, 251, 139, - 180, 149, 204, 134, 90, 251, 139, 180, 149, 212, 36, 90, 216, 19, 251, - 139, 180, 149, 204, 134, 90, 216, 19, 251, 139, 180, 149, 52, 212, 35, - 52, 204, 133, 204, 142, 3, 238, 253, 204, 94, 3, 238, 253, 204, 142, 3, - 98, 2, 60, 204, 94, 3, 98, 2, 60, 204, 142, 3, 218, 118, 2, 60, 204, 94, - 3, 218, 118, 2, 60, 204, 142, 77, 214, 73, 180, 202, 30, 3, 76, 57, 204, - 94, 77, 214, 73, 180, 202, 30, 3, 76, 57, 204, 142, 77, 90, 236, 172, 55, - 204, 94, 77, 90, 236, 172, 55, 204, 142, 77, 90, 202, 85, 214, 82, 204, - 94, 77, 90, 202, 85, 214, 82, 204, 142, 77, 90, 251, 139, 180, 149, 204, - 94, 77, 90, 251, 139, 180, 149, 204, 142, 77, 90, 216, 19, 180, 149, 204, - 94, 77, 90, 216, 19, 180, 149, 47, 50, 192, 111, 214, 82, 47, 53, 192, - 111, 214, 82, 244, 203, 204, 141, 244, 203, 204, 93, 244, 203, 204, 142, - 214, 73, 180, 149, 244, 203, 204, 94, 214, 73, 180, 149, 204, 142, 90, - 204, 93, 204, 94, 90, 204, 141, 204, 142, 90, 204, 141, 204, 94, 90, 204, - 93, 204, 94, 248, 210, 204, 141, 204, 94, 248, 210, 26, 225, 126, 247, - 219, 240, 66, 3, 204, 141, 237, 0, 77, 214, 85, 237, 230, 212, 156, 3, - 203, 49, 201, 242, 201, 198, 226, 23, 235, 25, 216, 34, 206, 182, 50, - 203, 147, 206, 182, 135, 203, 147, 206, 182, 124, 203, 147, 213, 33, 3, - 209, 80, 83, 249, 80, 201, 165, 53, 201, 3, 52, 83, 249, 80, 50, 201, 3, - 83, 249, 80, 52, 50, 201, 3, 52, 83, 249, 80, 52, 50, 201, 3, 181, 240, - 66, 234, 235, 50, 219, 169, 77, 52, 199, 100, 206, 182, 135, 203, 148, 3, - 214, 26, 206, 182, 124, 203, 148, 3, 200, 62, 206, 182, 124, 203, 148, - 90, 206, 182, 135, 203, 147, 52, 135, 203, 147, 52, 124, 203, 147, 52, - 204, 196, 216, 19, 55, 210, 89, 52, 204, 196, 216, 19, 55, 239, 19, 216, - 19, 239, 62, 3, 210, 89, 217, 105, 205, 248, 83, 222, 76, 3, 244, 250, - 57, 83, 222, 76, 3, 244, 250, 60, 135, 203, 148, 3, 244, 250, 60, 213, - 146, 3, 231, 155, 106, 213, 146, 3, 202, 85, 214, 82, 201, 165, 83, 249, - 80, 248, 164, 210, 136, 201, 165, 83, 249, 80, 3, 231, 155, 106, 201, - 165, 244, 169, 214, 82, 201, 165, 217, 90, 222, 139, 201, 165, 217, 90, - 233, 93, 237, 243, 205, 250, 222, 140, 214, 73, 180, 149, 237, 243, 205, - 250, 233, 94, 214, 73, 180, 149, 201, 165, 205, 178, 248, 164, 210, 136, - 222, 228, 201, 165, 83, 249, 80, 214, 82, 52, 205, 178, 214, 82, 59, 83, - 154, 218, 54, 59, 83, 154, 173, 237, 69, 59, 51, 173, 197, 89, 59, 51, - 205, 159, 237, 69, 59, 51, 205, 159, 197, 89, 59, 51, 50, 53, 59, 51, - 107, 58, 51, 200, 24, 58, 51, 237, 231, 58, 51, 173, 237, 69, 58, 51, - 173, 197, 89, 58, 51, 205, 159, 237, 69, 58, 51, 205, 159, 197, 89, 58, - 51, 50, 53, 58, 51, 124, 135, 58, 51, 91, 61, 3, 202, 68, 237, 230, 91, - 61, 3, 202, 68, 200, 23, 107, 61, 3, 202, 68, 237, 230, 107, 61, 3, 202, - 68, 200, 23, 47, 3, 201, 243, 157, 248, 136, 47, 3, 248, 85, 157, 248, - 136, 47, 3, 200, 33, 53, 239, 147, 157, 248, 136, 47, 3, 221, 203, 50, - 239, 147, 157, 248, 136, 239, 141, 3, 50, 157, 248, 136, 239, 141, 3, 53, - 157, 248, 136, 239, 141, 3, 201, 243, 157, 248, 136, 239, 141, 3, 248, - 85, 157, 248, 136, 237, 250, 205, 94, 58, 222, 228, 205, 94, 59, 222, - 228, 205, 94, 58, 199, 48, 4, 205, 94, 59, 199, 48, 4, 205, 94, 58, 213, - 55, 59, 213, 55, 59, 232, 85, 58, 232, 85, 231, 155, 58, 232, 85, 58, - 222, 228, 244, 249, 58, 219, 190, 239, 140, 59, 219, 190, 239, 140, 58, - 219, 190, 221, 198, 59, 219, 190, 221, 198, 58, 4, 239, 140, 58, 4, 221, - 198, 59, 4, 221, 198, 58, 231, 155, 236, 248, 59, 231, 155, 236, 248, 58, - 83, 236, 248, 59, 83, 236, 248, 50, 61, 3, 4, 244, 249, 115, 107, 250, - 214, 50, 61, 3, 46, 212, 125, 181, 107, 205, 87, 51, 107, 200, 215, 61, - 3, 83, 106, 107, 200, 215, 61, 3, 52, 83, 106, 107, 200, 215, 61, 234, - 235, 154, 107, 200, 215, 201, 165, 240, 66, 51, 107, 61, 3, 237, 250, - 204, 243, 107, 61, 3, 203, 136, 3, 83, 106, 107, 61, 3, 203, 136, 3, 52, - 83, 106, 107, 200, 215, 61, 3, 203, 135, 107, 200, 215, 61, 3, 203, 136, - 3, 83, 106, 107, 200, 215, 61, 3, 203, 136, 3, 52, 83, 106, 107, 61, 202, - 145, 196, 222, 197, 123, 61, 212, 107, 239, 83, 222, 184, 236, 172, 2, - 90, 107, 51, 210, 90, 202, 85, 214, 83, 90, 107, 51, 107, 61, 90, 210, - 90, 251, 139, 180, 149, 91, 61, 202, 145, 233, 93, 91, 61, 202, 145, 204, - 93, 107, 211, 90, 51, 91, 211, 90, 51, 210, 90, 202, 85, 214, 83, 90, 91, - 51, 91, 61, 90, 210, 90, 251, 139, 180, 149, 202, 85, 214, 83, 90, 107, - 51, 107, 61, 90, 251, 139, 180, 149, 107, 61, 90, 210, 90, 202, 85, 214, - 82, 91, 61, 90, 210, 90, 202, 85, 214, 82, 237, 231, 201, 179, 195, 24, - 51, 206, 182, 205, 250, 173, 51, 206, 182, 249, 135, 205, 159, 51, 59, - 219, 190, 205, 7, 58, 4, 205, 7, 59, 4, 205, 7, 58, 210, 17, 213, 55, 59, - 210, 17, 213, 55, 85, 222, 228, 244, 249, 85, 214, 28, 3, 214, 28, 226, - 41, 85, 244, 250, 3, 244, 250, 226, 41, 85, 244, 249, 85, 46, 208, 230, - 205, 250, 173, 61, 3, 231, 164, 232, 137, 249, 135, 205, 159, 61, 3, 231, - 164, 203, 135, 205, 250, 173, 61, 3, 231, 155, 203, 135, 249, 135, 205, - 159, 61, 3, 231, 155, 203, 135, 248, 218, 61, 212, 107, 237, 231, 202, - 209, 173, 237, 68, 206, 182, 248, 218, 61, 212, 107, 237, 231, 202, 209, - 173, 237, 68, 107, 201, 179, 51, 200, 24, 201, 179, 51, 91, 201, 179, 51, - 237, 231, 201, 179, 51, 50, 53, 201, 179, 51, 124, 135, 201, 179, 51, - 173, 197, 89, 201, 179, 51, 173, 237, 69, 201, 179, 51, 205, 159, 237, - 69, 201, 179, 51, 205, 159, 197, 89, 201, 179, 51, 107, 201, 179, 240, - 64, 51, 200, 24, 201, 179, 240, 64, 51, 91, 201, 179, 240, 64, 51, 237, - 231, 201, 179, 240, 64, 51, 244, 205, 201, 179, 192, 244, 250, 51, 251, - 65, 201, 179, 192, 244, 250, 51, 107, 201, 179, 61, 202, 30, 154, 200, - 24, 201, 179, 61, 202, 30, 154, 91, 201, 179, 61, 202, 30, 154, 237, 231, - 201, 179, 61, 202, 30, 154, 173, 197, 89, 201, 179, 61, 202, 30, 154, - 173, 237, 69, 201, 179, 61, 202, 30, 154, 205, 159, 237, 69, 201, 179, - 61, 202, 30, 154, 205, 159, 197, 89, 201, 179, 61, 202, 30, 154, 107, - 201, 179, 61, 3, 52, 231, 155, 106, 200, 24, 201, 179, 61, 3, 52, 231, - 155, 106, 91, 201, 179, 61, 3, 52, 231, 155, 106, 237, 231, 201, 179, 61, - 3, 52, 231, 155, 106, 231, 155, 203, 155, 224, 153, 83, 203, 155, 224, - 153, 107, 201, 179, 61, 127, 91, 201, 179, 51, 200, 24, 201, 179, 61, - 107, 77, 237, 231, 201, 179, 51, 91, 201, 179, 61, 127, 107, 201, 179, - 51, 237, 231, 201, 179, 61, 107, 77, 200, 24, 201, 179, 51, 107, 201, - 179, 213, 219, 250, 214, 200, 24, 201, 179, 213, 219, 250, 214, 91, 201, - 179, 213, 219, 250, 214, 237, 231, 201, 179, 213, 219, 250, 214, 107, 58, - 46, 59, 51, 200, 24, 58, 46, 59, 51, 91, 58, 46, 59, 51, 237, 231, 58, - 46, 59, 51, 251, 65, 201, 179, 53, 200, 167, 51, 251, 65, 201, 179, 248, - 85, 200, 167, 51, 251, 65, 201, 179, 50, 200, 167, 51, 251, 65, 201, 179, - 201, 243, 200, 167, 51, 210, 94, 222, 184, 210, 94, 210, 22, 217, 80, - 222, 184, 217, 80, 210, 22, 235, 7, 241, 102, 250, 215, 244, 245, 251, - 64, 91, 58, 51, 202, 154, 201, 241, 107, 236, 166, 250, 217, 202, 154, - 210, 18, 200, 24, 236, 166, 250, 217, 202, 154, 201, 241, 91, 236, 166, - 250, 217, 202, 154, 222, 180, 237, 231, 236, 166, 250, 217, 58, 107, 236, - 166, 250, 217, 58, 200, 24, 236, 166, 250, 217, 58, 91, 236, 166, 250, - 217, 58, 237, 231, 236, 166, 250, 217, 237, 231, 201, 179, 61, 3, 181, - 202, 68, 222, 174, 237, 231, 201, 179, 61, 3, 181, 202, 68, 210, 11, 200, - 24, 201, 179, 61, 3, 181, 202, 68, 222, 174, 200, 24, 201, 179, 61, 3, - 181, 202, 68, 210, 11, 107, 201, 179, 61, 3, 181, 202, 68, 200, 23, 91, - 201, 179, 61, 3, 181, 202, 68, 200, 23, 107, 201, 179, 61, 3, 181, 202, - 68, 237, 230, 91, 201, 179, 61, 3, 181, 202, 68, 237, 230, 58, 241, 10, - 237, 231, 26, 107, 51, 58, 241, 10, 237, 231, 26, 91, 51, 58, 241, 10, - 200, 24, 26, 107, 51, 58, 241, 10, 200, 24, 26, 91, 51, 58, 241, 10, 107, - 26, 200, 24, 51, 58, 241, 10, 91, 26, 200, 24, 51, 58, 241, 10, 107, 26, - 237, 231, 51, 58, 241, 10, 91, 26, 237, 231, 51, 210, 63, 61, 135, 222, - 184, 210, 63, 61, 135, 210, 22, 210, 63, 61, 124, 222, 184, 210, 63, 61, - 124, 210, 22, 210, 63, 61, 50, 200, 36, 210, 63, 61, 53, 200, 36, 210, - 63, 61, 50, 237, 235, 210, 63, 61, 53, 237, 235, 200, 24, 59, 61, 234, - 235, 249, 80, 3, 231, 155, 154, 124, 250, 218, 226, 87, 39, 210, 164, - 248, 70, 214, 22, 59, 205, 92, 214, 22, 59, 26, 58, 205, 92, 214, 22, 58, - 205, 92, 249, 99, 111, 3, 175, 196, 222, 46, 196, 222, 46, 27, 196, 222, - 58, 47, 247, 34, 58, 239, 141, 247, 34, 163, 58, 213, 55, 231, 155, 58, - 214, 173, 58, 214, 173, 58, 219, 190, 200, 35, 201, 181, 247, 34, 58, - 219, 190, 237, 234, 201, 181, 247, 34, 58, 219, 190, 222, 179, 201, 181, - 247, 34, 58, 219, 190, 210, 17, 201, 181, 247, 34, 217, 95, 235, 24, 102, - 201, 243, 157, 58, 244, 249, 248, 85, 157, 58, 244, 249, 175, 235, 7, - 212, 109, 58, 241, 6, 209, 194, 175, 235, 7, 212, 109, 58, 241, 6, 59, - 235, 7, 212, 109, 241, 6, 209, 194, 59, 235, 7, 212, 109, 241, 6, 47, - 212, 79, 226, 68, 200, 66, 55, 233, 84, 78, 212, 122, 235, 24, 102, 212, - 122, 235, 24, 134, 212, 122, 235, 24, 136, 212, 122, 235, 24, 146, 201, - 200, 211, 246, 250, 175, 231, 10, 212, 231, 217, 91, 59, 218, 190, 207, - 113, 58, 239, 141, 214, 120, 241, 61, 201, 143, 175, 218, 190, 250, 210, - 241, 25, 232, 243, 195, 77, 223, 204, 251, 34, 251, 252, 197, 218, 212, - 80, 50, 157, 58, 205, 7, 53, 157, 58, 205, 7, 205, 8, 3, 50, 157, 248, - 136, 205, 8, 3, 53, 157, 248, 136, 107, 200, 215, 61, 3, 201, 181, 250, - 216, 200, 24, 200, 215, 61, 3, 201, 181, 250, 216, 91, 200, 215, 61, 3, - 201, 181, 250, 216, 237, 231, 200, 215, 61, 3, 201, 181, 250, 216, 236, - 156, 235, 24, 100, 236, 156, 235, 24, 102, 208, 130, 209, 103, 250, 174, - 16, 199, 19, 209, 103, 250, 174, 16, 216, 5, 209, 103, 250, 174, 16, 211, - 67, 209, 103, 250, 174, 16, 248, 159, 209, 103, 250, 174, 16, 207, 96, - 209, 103, 250, 174, 16, 201, 192, 236, 172, 2, 3, 226, 64, 60, 200, 48, - 105, 207, 92, 105, 237, 240, 105, 213, 123, 105, 210, 89, 53, 251, 90, - 232, 106, 213, 107, 105, 125, 6, 1, 250, 113, 125, 6, 1, 248, 9, 125, 6, - 1, 199, 116, 125, 6, 1, 233, 159, 125, 6, 1, 239, 23, 125, 6, 1, 196, 38, - 125, 6, 1, 195, 58, 125, 6, 1, 237, 151, 125, 6, 1, 195, 84, 125, 6, 1, - 225, 221, 125, 6, 1, 84, 225, 221, 125, 6, 1, 68, 125, 6, 1, 239, 44, - 125, 6, 1, 225, 23, 125, 6, 1, 222, 39, 125, 6, 1, 218, 59, 125, 6, 1, - 217, 206, 125, 6, 1, 214, 104, 125, 6, 1, 212, 104, 125, 6, 1, 209, 249, - 125, 6, 1, 205, 229, 125, 6, 1, 200, 246, 125, 6, 1, 200, 83, 125, 6, 1, - 234, 238, 125, 6, 1, 232, 91, 125, 6, 1, 214, 40, 125, 6, 1, 213, 92, - 125, 6, 1, 206, 154, 125, 6, 1, 201, 92, 125, 6, 1, 245, 36, 125, 6, 1, - 207, 50, 125, 6, 1, 196, 47, 125, 6, 1, 196, 49, 125, 6, 1, 196, 82, 125, - 6, 1, 205, 123, 142, 125, 6, 1, 195, 217, 125, 6, 1, 4, 195, 182, 125, 6, - 1, 4, 195, 183, 3, 203, 135, 125, 6, 1, 196, 3, 125, 6, 1, 226, 6, 4, - 195, 182, 125, 6, 1, 248, 171, 195, 182, 125, 6, 1, 226, 6, 248, 171, - 195, 182, 125, 6, 1, 235, 103, 125, 6, 1, 225, 219, 125, 6, 1, 206, 153, - 125, 6, 1, 201, 155, 63, 125, 6, 1, 222, 216, 218, 59, 125, 4, 1, 250, - 113, 125, 4, 1, 248, 9, 125, 4, 1, 199, 116, 125, 4, 1, 233, 159, 125, 4, - 1, 239, 23, 125, 4, 1, 196, 38, 125, 4, 1, 195, 58, 125, 4, 1, 237, 151, - 125, 4, 1, 195, 84, 125, 4, 1, 225, 221, 125, 4, 1, 84, 225, 221, 125, 4, - 1, 68, 125, 4, 1, 239, 44, 125, 4, 1, 225, 23, 125, 4, 1, 222, 39, 125, - 4, 1, 218, 59, 125, 4, 1, 217, 206, 125, 4, 1, 214, 104, 125, 4, 1, 212, - 104, 125, 4, 1, 209, 249, 125, 4, 1, 205, 229, 125, 4, 1, 200, 246, 125, - 4, 1, 200, 83, 125, 4, 1, 234, 238, 125, 4, 1, 232, 91, 125, 4, 1, 214, - 40, 125, 4, 1, 213, 92, 125, 4, 1, 206, 154, 125, 4, 1, 201, 92, 125, 4, - 1, 245, 36, 125, 4, 1, 207, 50, 125, 4, 1, 196, 47, 125, 4, 1, 196, 49, - 125, 4, 1, 196, 82, 125, 4, 1, 205, 123, 142, 125, 4, 1, 195, 217, 125, - 4, 1, 4, 195, 182, 125, 4, 1, 4, 195, 183, 3, 203, 135, 125, 4, 1, 196, - 3, 125, 4, 1, 226, 6, 4, 195, 182, 125, 4, 1, 248, 171, 195, 182, 125, 4, - 1, 226, 6, 248, 171, 195, 182, 125, 4, 1, 235, 103, 125, 4, 1, 225, 219, - 125, 4, 1, 206, 153, 125, 4, 1, 201, 155, 63, 125, 4, 1, 222, 216, 218, - 59, 8, 6, 1, 223, 100, 3, 52, 154, 8, 4, 1, 223, 100, 3, 52, 154, 8, 6, - 1, 223, 100, 3, 112, 202, 84, 8, 6, 1, 214, 4, 3, 106, 8, 6, 1, 211, 32, - 3, 203, 135, 8, 4, 1, 39, 3, 106, 8, 4, 1, 203, 217, 3, 239, 147, 106, 8, - 6, 1, 233, 16, 3, 239, 195, 8, 4, 1, 233, 16, 3, 239, 195, 8, 6, 1, 225, - 81, 3, 239, 195, 8, 4, 1, 225, 81, 3, 239, 195, 8, 6, 1, 195, 159, 3, - 239, 195, 8, 4, 1, 195, 159, 3, 239, 195, 8, 6, 1, 251, 134, 8, 6, 1, - 221, 137, 3, 122, 8, 6, 1, 163, 63, 8, 6, 1, 163, 251, 134, 8, 4, 1, 199, - 231, 3, 53, 122, 8, 6, 1, 197, 200, 3, 122, 8, 4, 1, 197, 200, 3, 122, 8, - 4, 1, 199, 231, 3, 241, 21, 8, 6, 1, 157, 233, 15, 8, 4, 1, 157, 233, 15, - 8, 4, 1, 203, 133, 212, 246, 8, 4, 1, 237, 136, 3, 216, 16, 8, 4, 1, 163, - 211, 32, 3, 203, 135, 8, 4, 1, 177, 3, 126, 210, 3, 226, 41, 8, 1, 4, 6, - 163, 69, 8, 204, 143, 4, 1, 225, 217, 73, 1, 6, 199, 230, 8, 6, 1, 209, - 81, 3, 204, 63, 203, 135, 8, 6, 1, 195, 159, 3, 204, 63, 203, 135, 88, 6, - 1, 251, 158, 88, 4, 1, 251, 158, 88, 6, 1, 199, 31, 88, 4, 1, 199, 31, - 88, 6, 1, 234, 94, 88, 4, 1, 234, 94, 88, 6, 1, 240, 103, 88, 4, 1, 240, - 103, 88, 6, 1, 237, 32, 88, 4, 1, 237, 32, 88, 6, 1, 205, 164, 88, 4, 1, - 205, 164, 88, 6, 1, 195, 96, 88, 4, 1, 195, 96, 88, 6, 1, 232, 162, 88, - 4, 1, 232, 162, 88, 6, 1, 202, 197, 88, 4, 1, 202, 197, 88, 6, 1, 230, - 207, 88, 4, 1, 230, 207, 88, 6, 1, 225, 7, 88, 4, 1, 225, 7, 88, 6, 1, - 222, 211, 88, 4, 1, 222, 211, 88, 6, 1, 219, 78, 88, 4, 1, 219, 78, 88, - 6, 1, 216, 223, 88, 4, 1, 216, 223, 88, 6, 1, 223, 203, 88, 4, 1, 223, - 203, 88, 6, 1, 72, 88, 4, 1, 72, 88, 6, 1, 212, 220, 88, 4, 1, 212, 220, - 88, 6, 1, 209, 232, 88, 4, 1, 209, 232, 88, 6, 1, 206, 74, 88, 4, 1, 206, - 74, 88, 6, 1, 203, 89, 88, 4, 1, 203, 89, 88, 6, 1, 200, 114, 88, 4, 1, - 200, 114, 88, 6, 1, 235, 153, 88, 4, 1, 235, 153, 88, 6, 1, 224, 124, 88, - 4, 1, 224, 124, 88, 6, 1, 211, 238, 88, 4, 1, 211, 238, 88, 6, 1, 214, - 96, 88, 4, 1, 214, 96, 88, 6, 1, 239, 145, 251, 164, 88, 4, 1, 239, 145, - 251, 164, 88, 6, 1, 37, 88, 251, 194, 88, 4, 1, 37, 88, 251, 194, 88, 6, - 1, 241, 44, 237, 32, 88, 4, 1, 241, 44, 237, 32, 88, 6, 1, 239, 145, 225, - 7, 88, 4, 1, 239, 145, 225, 7, 88, 6, 1, 239, 145, 216, 223, 88, 4, 1, - 239, 145, 216, 223, 88, 6, 1, 241, 44, 216, 223, 88, 4, 1, 241, 44, 216, - 223, 88, 6, 1, 37, 88, 214, 96, 88, 4, 1, 37, 88, 214, 96, 88, 6, 1, 208, - 222, 88, 4, 1, 208, 222, 88, 6, 1, 241, 59, 206, 247, 88, 4, 1, 241, 59, - 206, 247, 88, 6, 1, 37, 88, 206, 247, 88, 4, 1, 37, 88, 206, 247, 88, 6, - 1, 37, 88, 236, 141, 88, 4, 1, 37, 88, 236, 141, 88, 6, 1, 251, 177, 224, - 129, 88, 4, 1, 251, 177, 224, 129, 88, 6, 1, 239, 145, 231, 156, 88, 4, - 1, 239, 145, 231, 156, 88, 6, 1, 37, 88, 231, 156, 88, 4, 1, 37, 88, 231, - 156, 88, 6, 1, 37, 88, 142, 88, 4, 1, 37, 88, 142, 88, 6, 1, 223, 99, - 142, 88, 4, 1, 223, 99, 142, 88, 6, 1, 37, 88, 232, 112, 88, 4, 1, 37, - 88, 232, 112, 88, 6, 1, 37, 88, 232, 165, 88, 4, 1, 37, 88, 232, 165, 88, - 6, 1, 37, 88, 234, 89, 88, 4, 1, 37, 88, 234, 89, 88, 6, 1, 37, 88, 239, - 47, 88, 4, 1, 37, 88, 239, 47, 88, 6, 1, 37, 88, 206, 213, 88, 4, 1, 37, - 88, 206, 213, 88, 6, 1, 37, 215, 153, 206, 213, 88, 4, 1, 37, 215, 153, - 206, 213, 88, 6, 1, 37, 215, 153, 217, 19, 88, 4, 1, 37, 215, 153, 217, - 19, 88, 6, 1, 37, 215, 153, 215, 89, 88, 4, 1, 37, 215, 153, 215, 89, 88, - 6, 1, 37, 215, 153, 197, 124, 88, 4, 1, 37, 215, 153, 197, 124, 88, 16, - 225, 31, 88, 16, 219, 79, 209, 232, 88, 16, 212, 221, 209, 232, 88, 16, - 204, 252, 88, 16, 203, 90, 209, 232, 88, 16, 224, 125, 209, 232, 88, 16, - 206, 214, 206, 74, 88, 6, 1, 241, 44, 206, 247, 88, 4, 1, 241, 44, 206, - 247, 88, 6, 1, 241, 44, 234, 89, 88, 4, 1, 241, 44, 234, 89, 88, 38, 216, - 224, 57, 88, 38, 205, 116, 250, 187, 88, 38, 205, 116, 222, 148, 88, 6, - 1, 248, 109, 224, 129, 88, 4, 1, 248, 109, 224, 129, 88, 37, 215, 153, - 234, 217, 204, 226, 88, 37, 215, 153, 239, 86, 211, 79, 78, 88, 37, 215, - 153, 226, 66, 211, 79, 78, 88, 37, 215, 153, 199, 102, 239, 59, 88, 191, - 97, 232, 225, 88, 234, 217, 204, 226, 88, 218, 185, 239, 59, 94, 4, 1, - 251, 106, 94, 4, 1, 249, 93, 94, 4, 1, 234, 93, 94, 4, 1, 239, 6, 94, 4, - 1, 236, 230, 94, 4, 1, 199, 16, 94, 4, 1, 195, 82, 94, 4, 1, 203, 114, - 94, 4, 1, 226, 86, 94, 4, 1, 225, 17, 94, 4, 1, 222, 222, 94, 4, 1, 220, - 62, 94, 4, 1, 217, 211, 94, 4, 1, 214, 119, 94, 4, 1, 213, 157, 94, 4, 1, - 195, 70, 94, 4, 1, 210, 229, 94, 4, 1, 208, 219, 94, 4, 1, 203, 101, 94, - 4, 1, 200, 72, 94, 4, 1, 212, 254, 94, 4, 1, 224, 134, 94, 4, 1, 233, - 221, 94, 4, 1, 211, 144, 94, 4, 1, 206, 211, 94, 4, 1, 245, 62, 94, 4, 1, - 247, 142, 94, 4, 1, 225, 162, 94, 4, 1, 245, 0, 94, 4, 1, 247, 0, 94, 4, - 1, 196, 206, 94, 4, 1, 225, 177, 94, 4, 1, 232, 242, 94, 4, 1, 232, 147, - 94, 4, 1, 232, 58, 94, 4, 1, 197, 109, 94, 4, 1, 232, 175, 94, 4, 1, 231, - 181, 94, 4, 1, 196, 5, 94, 4, 1, 251, 234, 202, 104, 1, 164, 202, 104, 1, - 196, 125, 202, 104, 1, 196, 124, 202, 104, 1, 196, 114, 202, 104, 1, 196, - 112, 202, 104, 1, 248, 212, 252, 24, 196, 107, 202, 104, 1, 196, 107, - 202, 104, 1, 196, 122, 202, 104, 1, 196, 119, 202, 104, 1, 196, 121, 202, - 104, 1, 196, 120, 202, 104, 1, 196, 29, 202, 104, 1, 196, 116, 202, 104, - 1, 196, 105, 202, 104, 1, 201, 32, 196, 105, 202, 104, 1, 196, 102, 202, - 104, 1, 196, 110, 202, 104, 1, 248, 212, 252, 24, 196, 110, 202, 104, 1, - 201, 32, 196, 110, 202, 104, 1, 196, 109, 202, 104, 1, 196, 129, 202, - 104, 1, 196, 103, 202, 104, 1, 201, 32, 196, 103, 202, 104, 1, 196, 92, - 202, 104, 1, 201, 32, 196, 92, 202, 104, 1, 196, 24, 202, 104, 1, 196, - 71, 202, 104, 1, 251, 207, 196, 71, 202, 104, 1, 201, 32, 196, 71, 202, - 104, 1, 196, 101, 202, 104, 1, 196, 100, 202, 104, 1, 196, 97, 202, 104, - 1, 201, 32, 196, 111, 202, 104, 1, 201, 32, 196, 95, 202, 104, 1, 196, - 93, 202, 104, 1, 195, 217, 202, 104, 1, 196, 90, 202, 104, 1, 196, 88, - 202, 104, 1, 196, 113, 202, 104, 1, 201, 32, 196, 113, 202, 104, 1, 250, - 118, 196, 113, 202, 104, 1, 196, 87, 202, 104, 1, 196, 85, 202, 104, 1, - 196, 86, 202, 104, 1, 196, 84, 202, 104, 1, 196, 83, 202, 104, 1, 196, - 123, 202, 104, 1, 196, 81, 202, 104, 1, 196, 79, 202, 104, 1, 196, 78, - 202, 104, 1, 196, 75, 202, 104, 1, 196, 72, 202, 104, 1, 203, 80, 196, - 72, 202, 104, 1, 196, 70, 202, 104, 1, 196, 69, 202, 104, 1, 196, 3, 202, - 104, 73, 1, 223, 72, 78, 202, 104, 207, 91, 78, 202, 104, 108, 225, 124, - 35, 5, 222, 6, 35, 5, 218, 244, 35, 5, 209, 224, 35, 5, 205, 192, 35, 5, - 206, 197, 35, 5, 248, 115, 35, 5, 202, 22, 35, 5, 244, 181, 35, 5, 216, - 43, 35, 5, 215, 72, 35, 5, 233, 152, 214, 190, 35, 5, 195, 10, 35, 5, - 239, 26, 35, 5, 240, 10, 35, 5, 225, 128, 35, 5, 202, 168, 35, 5, 245, - 48, 35, 5, 212, 233, 35, 5, 212, 116, 35, 5, 233, 236, 35, 5, 233, 232, - 35, 5, 233, 233, 35, 5, 233, 234, 35, 5, 205, 80, 35, 5, 205, 34, 35, 5, - 205, 47, 35, 5, 205, 79, 35, 5, 205, 52, 35, 5, 205, 53, 35, 5, 205, 39, - 35, 5, 247, 80, 35, 5, 247, 59, 35, 5, 247, 61, 35, 5, 247, 79, 35, 5, - 247, 77, 35, 5, 247, 78, 35, 5, 247, 60, 35, 5, 194, 228, 35, 5, 194, - 206, 35, 5, 194, 219, 35, 5, 194, 227, 35, 5, 194, 222, 35, 5, 194, 223, - 35, 5, 194, 211, 35, 5, 247, 75, 35, 5, 247, 62, 35, 5, 247, 64, 35, 5, - 247, 74, 35, 5, 247, 72, 35, 5, 247, 73, 35, 5, 247, 63, 35, 5, 211, 44, - 35, 5, 211, 34, 35, 5, 211, 40, 35, 5, 211, 43, 35, 5, 211, 41, 35, 5, - 211, 42, 35, 5, 211, 39, 35, 5, 223, 110, 35, 5, 223, 102, 35, 5, 223, - 105, 35, 5, 223, 109, 35, 5, 223, 106, 35, 5, 223, 107, 35, 5, 223, 103, - 35, 5, 196, 164, 35, 5, 196, 151, 35, 5, 196, 159, 35, 5, 196, 163, 35, - 5, 196, 161, 35, 5, 196, 162, 35, 5, 196, 158, 35, 5, 233, 27, 35, 5, - 233, 17, 35, 5, 233, 20, 35, 5, 233, 26, 35, 5, 233, 22, 35, 5, 233, 23, - 35, 5, 233, 19, 38, 40, 1, 249, 9, 38, 40, 1, 199, 118, 38, 40, 1, 233, - 216, 38, 40, 1, 239, 252, 38, 40, 1, 195, 65, 38, 40, 1, 195, 88, 38, 40, - 1, 155, 38, 40, 1, 237, 7, 38, 40, 1, 236, 241, 38, 40, 1, 236, 230, 38, - 40, 1, 72, 38, 40, 1, 213, 92, 38, 40, 1, 236, 163, 38, 40, 1, 236, 151, - 38, 40, 1, 203, 68, 38, 40, 1, 142, 38, 40, 1, 201, 107, 38, 40, 1, 245, - 103, 38, 40, 1, 207, 50, 38, 40, 1, 207, 2, 38, 40, 1, 235, 103, 38, 40, - 1, 236, 147, 38, 40, 1, 63, 38, 40, 1, 226, 147, 38, 40, 1, 239, 45, 38, - 40, 1, 218, 203, 200, 87, 38, 40, 1, 196, 84, 38, 40, 1, 195, 217, 38, - 40, 1, 226, 5, 63, 38, 40, 1, 222, 47, 195, 182, 38, 40, 1, 248, 171, - 195, 182, 38, 40, 1, 226, 5, 248, 171, 195, 182, 53, 251, 91, 204, 138, - 220, 24, 53, 251, 91, 237, 250, 204, 138, 220, 24, 50, 204, 138, 179, 53, - 204, 138, 179, 50, 237, 250, 204, 138, 179, 53, 237, 250, 204, 138, 179, - 210, 215, 226, 28, 220, 24, 210, 215, 237, 250, 226, 28, 220, 24, 237, - 250, 201, 199, 220, 24, 50, 201, 199, 179, 53, 201, 199, 179, 210, 215, - 205, 94, 50, 210, 215, 214, 121, 179, 53, 210, 215, 214, 121, 179, 237, - 55, 241, 98, 213, 152, 235, 26, 213, 152, 210, 89, 235, 26, 213, 152, - 231, 4, 237, 250, 214, 185, 237, 231, 251, 101, 200, 24, 251, 101, 237, - 250, 210, 17, 251, 90, 52, 214, 182, 231, 7, 226, 17, 226, 26, 213, 207, - 248, 57, 231, 8, 3, 239, 150, 202, 85, 3, 210, 3, 57, 50, 126, 213, 143, - 179, 53, 126, 213, 143, 179, 202, 85, 3, 76, 57, 202, 85, 3, 76, 60, 50, - 83, 249, 80, 3, 211, 73, 53, 83, 249, 80, 3, 211, 73, 201, 243, 50, 157, - 179, 201, 243, 53, 157, 179, 248, 85, 50, 157, 179, 248, 85, 53, 157, - 179, 50, 206, 96, 118, 179, 53, 206, 96, 118, 179, 50, 52, 213, 140, 53, - 52, 213, 140, 99, 238, 251, 127, 97, 76, 211, 213, 97, 76, 127, 99, 238, - 251, 211, 213, 103, 235, 7, 76, 211, 213, 235, 101, 76, 78, 210, 89, 211, - 79, 78, 83, 202, 84, 210, 3, 212, 110, 197, 9, 207, 91, 112, 238, 253, - 163, 244, 159, 210, 215, 238, 253, 210, 215, 244, 159, 163, 207, 105, - 240, 119, 3, 50, 233, 70, 240, 119, 3, 53, 233, 70, 163, 240, 118, 201, - 243, 157, 208, 133, 55, 200, 216, 240, 65, 202, 152, 240, 65, 204, 242, - 234, 217, 204, 226, 83, 206, 29, 238, 250, 197, 56, 83, 222, 75, 247, - 123, 52, 231, 7, 210, 89, 244, 159, 52, 221, 204, 211, 62, 78, 240, 66, - 3, 50, 200, 27, 52, 204, 77, 78, 226, 17, 126, 224, 221, 226, 17, 126, - 224, 222, 3, 224, 222, 57, 126, 224, 221, 126, 224, 222, 3, 238, 253, 52, - 205, 19, 244, 159, 237, 250, 205, 177, 201, 165, 240, 118, 219, 191, 244, - 159, 213, 151, 78, 211, 212, 236, 254, 78, 241, 99, 199, 102, 239, 59, - 12, 44, 210, 119, 12, 44, 244, 214, 12, 44, 208, 136, 100, 12, 44, 208, - 136, 102, 12, 44, 208, 136, 134, 12, 44, 213, 28, 12, 44, 248, 70, 12, - 44, 203, 152, 12, 44, 224, 22, 100, 12, 44, 224, 22, 102, 12, 44, 239, - 56, 12, 44, 208, 140, 12, 44, 4, 100, 12, 44, 4, 102, 12, 44, 222, 244, - 100, 12, 44, 222, 244, 102, 12, 44, 222, 244, 134, 12, 44, 222, 244, 136, - 12, 44, 205, 212, 12, 44, 202, 156, 12, 44, 205, 209, 100, 12, 44, 205, - 209, 102, 12, 44, 232, 127, 100, 12, 44, 232, 127, 102, 12, 44, 232, 209, - 12, 44, 210, 204, 12, 44, 245, 45, 12, 44, 204, 111, 12, 44, 218, 189, - 12, 44, 239, 249, 12, 44, 218, 178, 12, 44, 244, 232, 12, 44, 197, 128, - 100, 12, 44, 197, 128, 102, 12, 44, 235, 118, 12, 44, 213, 105, 100, 12, - 44, 213, 105, 102, 12, 44, 206, 69, 157, 201, 191, 201, 118, 12, 44, 241, - 83, 12, 44, 239, 17, 12, 44, 225, 209, 12, 44, 248, 108, 77, 244, 197, - 12, 44, 236, 67, 12, 44, 205, 118, 100, 12, 44, 205, 118, 102, 12, 44, - 249, 95, 12, 44, 206, 76, 12, 44, 247, 204, 206, 76, 12, 44, 217, 89, - 100, 12, 44, 217, 89, 102, 12, 44, 217, 89, 134, 12, 44, 217, 89, 136, - 12, 44, 219, 150, 12, 44, 206, 249, 12, 44, 210, 210, 12, 44, 236, 97, - 12, 44, 214, 133, 12, 44, 248, 29, 100, 12, 44, 248, 29, 102, 12, 44, - 219, 199, 12, 44, 218, 184, 12, 44, 233, 104, 100, 12, 44, 233, 104, 102, - 12, 44, 233, 104, 134, 12, 44, 202, 102, 12, 44, 244, 196, 12, 44, 197, - 89, 100, 12, 44, 197, 89, 102, 12, 44, 247, 204, 208, 129, 12, 44, 206, - 69, 231, 102, 12, 44, 231, 102, 12, 44, 247, 204, 205, 131, 12, 44, 247, - 204, 206, 244, 12, 44, 235, 37, 12, 44, 247, 204, 247, 99, 12, 44, 206, - 69, 197, 150, 12, 44, 197, 151, 100, 12, 44, 197, 151, 102, 12, 44, 244, - 235, 12, 44, 247, 204, 233, 135, 12, 44, 181, 100, 12, 44, 181, 102, 12, - 44, 247, 204, 221, 240, 12, 44, 247, 204, 234, 74, 12, 44, 218, 173, 100, - 12, 44, 218, 173, 102, 12, 44, 210, 217, 12, 44, 248, 118, 12, 44, 247, - 204, 203, 107, 222, 190, 12, 44, 247, 204, 222, 192, 12, 44, 247, 204, - 197, 50, 12, 44, 247, 204, 235, 55, 12, 44, 237, 66, 100, 12, 44, 237, - 66, 102, 12, 44, 237, 66, 134, 12, 44, 247, 204, 237, 65, 12, 44, 232, - 137, 12, 44, 247, 204, 231, 98, 12, 44, 248, 104, 12, 44, 233, 200, 12, - 44, 247, 204, 235, 111, 12, 44, 247, 204, 248, 156, 12, 44, 247, 204, - 208, 233, 12, 44, 206, 69, 197, 79, 12, 44, 206, 69, 196, 61, 12, 44, - 247, 204, 234, 236, 12, 44, 225, 216, 236, 102, 12, 44, 247, 204, 236, - 102, 12, 44, 225, 216, 201, 244, 12, 44, 247, 204, 201, 244, 12, 44, 225, - 216, 237, 223, 12, 44, 247, 204, 237, 223, 12, 44, 201, 1, 12, 44, 225, - 216, 201, 1, 12, 44, 247, 204, 201, 1, 79, 44, 100, 79, 44, 222, 75, 79, - 44, 238, 253, 79, 44, 205, 248, 79, 44, 208, 135, 79, 44, 122, 79, 44, - 102, 79, 44, 222, 104, 79, 44, 220, 62, 79, 44, 222, 169, 79, 44, 236, - 204, 79, 44, 171, 79, 44, 135, 248, 70, 79, 44, 241, 86, 79, 44, 230, - 201, 79, 44, 203, 152, 79, 44, 192, 248, 70, 79, 44, 224, 21, 79, 44, - 212, 58, 79, 44, 196, 255, 79, 44, 205, 107, 79, 44, 53, 192, 248, 70, - 79, 44, 232, 59, 236, 225, 79, 44, 203, 23, 79, 44, 239, 56, 79, 44, 208, - 140, 79, 44, 244, 214, 79, 44, 212, 8, 79, 44, 251, 216, 79, 44, 218, - 164, 79, 44, 236, 225, 79, 44, 237, 72, 79, 44, 208, 168, 79, 44, 233, - 144, 79, 44, 233, 145, 205, 226, 79, 44, 236, 101, 79, 44, 248, 170, 79, - 44, 197, 21, 79, 44, 245, 66, 79, 44, 209, 205, 79, 44, 226, 82, 79, 44, - 205, 224, 79, 44, 222, 243, 79, 44, 241, 96, 79, 44, 205, 98, 79, 44, - 218, 169, 79, 44, 209, 246, 79, 44, 197, 6, 79, 44, 214, 110, 79, 44, - 201, 9, 79, 44, 237, 203, 79, 44, 206, 182, 202, 156, 79, 44, 237, 250, - 244, 214, 79, 44, 181, 204, 202, 79, 44, 99, 232, 184, 79, 44, 206, 188, - 79, 44, 248, 77, 79, 44, 205, 208, 79, 44, 248, 36, 79, 44, 204, 241, 79, - 44, 232, 126, 79, 44, 232, 226, 79, 44, 239, 1, 79, 44, 232, 209, 79, 44, - 248, 57, 79, 44, 210, 204, 79, 44, 208, 153, 79, 44, 239, 88, 79, 44, - 250, 123, 79, 44, 205, 94, 79, 44, 216, 18, 79, 44, 204, 111, 79, 44, - 208, 180, 79, 44, 218, 189, 79, 44, 201, 190, 79, 44, 223, 68, 79, 44, - 204, 226, 79, 44, 239, 249, 79, 44, 197, 104, 79, 44, 239, 29, 216, 18, - 79, 44, 244, 155, 79, 44, 234, 210, 79, 44, 244, 226, 79, 44, 204, 247, - 79, 44, 197, 127, 79, 44, 235, 118, 79, 44, 244, 222, 79, 44, 235, 196, - 79, 44, 52, 196, 222, 79, 44, 157, 201, 191, 201, 118, 79, 44, 205, 239, - 79, 44, 235, 208, 79, 44, 241, 83, 79, 44, 239, 17, 79, 44, 212, 4, 79, - 44, 225, 209, 79, 44, 219, 173, 79, 44, 202, 83, 79, 44, 204, 58, 79, 44, - 222, 98, 79, 44, 200, 2, 79, 44, 235, 151, 79, 44, 248, 108, 77, 244, - 197, 79, 44, 206, 102, 79, 44, 237, 250, 203, 15, 79, 44, 197, 73, 79, - 44, 206, 1, 79, 44, 239, 75, 79, 44, 236, 67, 79, 44, 205, 134, 79, 44, - 51, 79, 44, 204, 228, 79, 44, 205, 117, 79, 44, 201, 216, 79, 44, 233, - 113, 79, 44, 247, 85, 79, 44, 205, 12, 79, 44, 249, 95, 79, 44, 210, 60, - 79, 44, 206, 76, 79, 44, 225, 201, 79, 44, 217, 88, 79, 44, 206, 249, 79, - 44, 235, 184, 79, 44, 214, 133, 79, 44, 251, 100, 79, 44, 212, 132, 79, - 44, 237, 76, 79, 44, 248, 28, 79, 44, 219, 199, 79, 44, 219, 17, 79, 44, - 207, 112, 79, 44, 250, 221, 79, 44, 218, 184, 79, 44, 201, 249, 79, 44, - 214, 80, 79, 44, 248, 112, 79, 44, 204, 224, 79, 44, 244, 167, 79, 44, - 233, 103, 79, 44, 202, 102, 79, 44, 226, 45, 79, 44, 248, 124, 79, 44, - 197, 151, 236, 225, 79, 44, 244, 196, 79, 44, 197, 88, 79, 44, 208, 129, - 79, 44, 231, 102, 79, 44, 205, 131, 79, 44, 199, 144, 79, 44, 249, 4, 79, - 44, 212, 184, 79, 44, 249, 125, 79, 44, 206, 244, 79, 44, 210, 157, 79, - 44, 209, 117, 79, 44, 235, 37, 79, 44, 248, 110, 79, 44, 247, 99, 79, 44, - 248, 141, 79, 44, 218, 186, 79, 44, 197, 150, 79, 44, 244, 235, 79, 44, - 197, 46, 79, 44, 239, 67, 79, 44, 199, 17, 79, 44, 233, 135, 79, 44, 221, - 240, 79, 44, 234, 74, 79, 44, 218, 172, 79, 44, 205, 247, 79, 44, 206, - 182, 203, 134, 248, 156, 79, 44, 210, 217, 79, 44, 248, 118, 79, 44, 196, - 245, 79, 44, 235, 233, 79, 44, 222, 190, 79, 44, 203, 107, 222, 190, 79, - 44, 222, 186, 79, 44, 205, 161, 79, 44, 222, 192, 79, 44, 197, 50, 79, - 44, 235, 55, 79, 44, 237, 65, 79, 44, 232, 137, 79, 44, 234, 252, 79, 44, - 231, 98, 79, 44, 248, 104, 79, 44, 203, 119, 79, 44, 232, 233, 79, 44, - 235, 144, 79, 44, 209, 10, 197, 46, 79, 44, 247, 87, 79, 44, 233, 200, - 79, 44, 235, 111, 79, 44, 248, 156, 79, 44, 208, 233, 79, 44, 239, 234, - 79, 44, 197, 79, 79, 44, 232, 102, 79, 44, 196, 61, 79, 44, 219, 28, 79, - 44, 248, 136, 79, 44, 236, 237, 79, 44, 234, 236, 79, 44, 201, 162, 79, - 44, 237, 206, 79, 44, 210, 198, 79, 44, 216, 20, 79, 44, 236, 102, 79, - 44, 201, 244, 79, 44, 237, 223, 79, 44, 201, 1, 79, 44, 235, 58, 143, - 239, 193, 190, 50, 202, 30, 210, 22, 143, 239, 193, 190, 90, 202, 30, 60, - 143, 239, 193, 190, 50, 202, 30, 112, 26, 210, 22, 143, 239, 193, 190, - 90, 202, 30, 112, 26, 60, 143, 239, 193, 190, 234, 217, 204, 81, 143, - 239, 193, 190, 204, 82, 234, 235, 57, 143, 239, 193, 190, 204, 82, 234, - 235, 60, 143, 239, 193, 190, 204, 82, 234, 235, 222, 184, 143, 239, 193, - 190, 204, 82, 234, 235, 200, 33, 222, 184, 143, 239, 193, 190, 204, 82, - 234, 235, 200, 33, 210, 22, 143, 239, 193, 190, 204, 82, 234, 235, 221, - 203, 222, 184, 143, 239, 193, 190, 214, 24, 143, 205, 148, 143, 244, 159, - 143, 234, 217, 204, 226, 239, 64, 78, 225, 202, 226, 65, 205, 11, 105, - 143, 225, 232, 78, 143, 244, 199, 78, 143, 31, 195, 79, 50, 251, 91, 179, - 53, 251, 91, 179, 50, 52, 251, 91, 179, 53, 52, 251, 91, 179, 50, 241, - 102, 179, 53, 241, 102, 179, 50, 59, 241, 102, 179, 53, 59, 241, 102, - 179, 50, 58, 222, 147, 179, 53, 58, 222, 147, 179, 212, 72, 78, 234, 13, - 78, 50, 201, 231, 206, 245, 179, 53, 201, 231, 206, 245, 179, 50, 59, - 222, 147, 179, 53, 59, 222, 147, 179, 50, 59, 201, 231, 206, 245, 179, - 53, 59, 201, 231, 206, 245, 179, 50, 59, 47, 179, 53, 59, 47, 179, 197, - 123, 240, 65, 210, 89, 52, 212, 20, 211, 62, 78, 52, 212, 20, 211, 62, - 78, 126, 52, 212, 20, 211, 62, 78, 212, 72, 117, 235, 233, 232, 181, 215, - 142, 100, 232, 181, 215, 142, 102, 232, 181, 215, 142, 134, 232, 181, - 215, 142, 136, 232, 181, 215, 142, 146, 232, 181, 215, 142, 167, 232, - 181, 215, 142, 178, 232, 181, 215, 142, 171, 232, 181, 215, 142, 182, - 143, 222, 128, 152, 78, 143, 209, 250, 152, 78, 143, 239, 202, 152, 78, - 143, 236, 203, 152, 78, 29, 206, 62, 76, 152, 78, 29, 52, 76, 152, 78, - 197, 119, 240, 65, 83, 225, 16, 210, 120, 78, 83, 225, 16, 210, 120, 3, - 198, 244, 205, 162, 78, 83, 225, 16, 210, 120, 117, 200, 33, 232, 225, - 83, 225, 16, 210, 120, 3, 198, 244, 205, 162, 117, 200, 33, 232, 225, 83, - 225, 16, 210, 120, 117, 221, 203, 232, 225, 46, 212, 72, 78, 143, 203, - 36, 222, 76, 235, 181, 207, 91, 105, 232, 181, 215, 142, 203, 23, 232, - 181, 215, 142, 200, 234, 232, 181, 215, 142, 202, 177, 83, 143, 225, 232, - 78, 220, 5, 78, 213, 134, 251, 127, 78, 143, 62, 226, 68, 143, 157, 235, - 137, 205, 148, 188, 1, 4, 63, 188, 1, 63, 188, 1, 4, 68, 188, 1, 68, 188, - 1, 4, 66, 188, 1, 66, 188, 1, 4, 69, 188, 1, 69, 188, 1, 4, 72, 188, 1, - 72, 188, 1, 155, 188, 1, 234, 123, 188, 1, 224, 101, 188, 1, 233, 192, - 188, 1, 223, 187, 188, 1, 233, 76, 188, 1, 224, 209, 188, 1, 234, 48, - 188, 1, 224, 11, 188, 1, 233, 144, 188, 1, 183, 188, 1, 195, 115, 188, 1, - 206, 112, 188, 1, 195, 33, 188, 1, 204, 172, 188, 1, 194, 255, 188, 1, - 208, 147, 188, 1, 195, 88, 188, 1, 205, 200, 188, 1, 195, 11, 188, 1, - 189, 188, 1, 240, 136, 188, 1, 202, 122, 188, 1, 239, 152, 188, 1, 4, - 201, 40, 188, 1, 201, 40, 188, 1, 237, 201, 188, 1, 203, 68, 188, 1, 239, - 252, 188, 1, 149, 188, 1, 239, 28, 188, 1, 176, 188, 1, 216, 223, 188, 1, - 215, 186, 188, 1, 217, 118, 188, 1, 216, 50, 188, 1, 142, 188, 1, 249, - 145, 188, 1, 161, 188, 1, 232, 71, 188, 1, 248, 184, 188, 1, 212, 220, - 188, 1, 231, 75, 188, 1, 248, 21, 188, 1, 211, 227, 188, 1, 232, 147, - 188, 1, 249, 9, 188, 1, 213, 92, 188, 1, 231, 193, 188, 1, 248, 116, 188, - 1, 212, 117, 188, 1, 166, 188, 1, 219, 78, 188, 1, 218, 145, 188, 1, 219, - 207, 188, 1, 218, 251, 188, 1, 4, 164, 188, 1, 164, 188, 1, 4, 195, 217, - 188, 1, 195, 217, 188, 1, 4, 196, 3, 188, 1, 196, 3, 188, 1, 169, 188, 1, - 210, 72, 188, 1, 209, 140, 188, 1, 210, 183, 188, 1, 209, 232, 188, 1, 4, - 197, 166, 188, 1, 197, 166, 188, 1, 197, 70, 188, 1, 197, 109, 188, 1, - 197, 34, 188, 1, 218, 55, 188, 1, 197, 220, 188, 1, 4, 155, 188, 1, 4, - 224, 209, 38, 224, 234, 198, 244, 205, 162, 78, 38, 224, 234, 207, 110, - 205, 162, 78, 224, 234, 198, 244, 205, 162, 78, 224, 234, 207, 110, 205, - 162, 78, 188, 225, 232, 78, 188, 198, 244, 225, 232, 78, 188, 239, 111, - 195, 233, 224, 234, 52, 231, 7, 71, 1, 4, 63, 71, 1, 63, 71, 1, 4, 68, - 71, 1, 68, 71, 1, 4, 66, 71, 1, 66, 71, 1, 4, 69, 71, 1, 69, 71, 1, 4, - 72, 71, 1, 72, 71, 1, 155, 71, 1, 234, 123, 71, 1, 224, 101, 71, 1, 233, - 192, 71, 1, 223, 187, 71, 1, 233, 76, 71, 1, 224, 209, 71, 1, 234, 48, - 71, 1, 224, 11, 71, 1, 233, 144, 71, 1, 183, 71, 1, 195, 115, 71, 1, 206, - 112, 71, 1, 195, 33, 71, 1, 204, 172, 71, 1, 194, 255, 71, 1, 208, 147, - 71, 1, 195, 88, 71, 1, 205, 200, 71, 1, 195, 11, 71, 1, 189, 71, 1, 240, - 136, 71, 1, 202, 122, 71, 1, 239, 152, 71, 1, 4, 201, 40, 71, 1, 201, 40, - 71, 1, 237, 201, 71, 1, 203, 68, 71, 1, 239, 252, 71, 1, 149, 71, 1, 239, - 28, 71, 1, 176, 71, 1, 216, 223, 71, 1, 215, 186, 71, 1, 217, 118, 71, 1, - 216, 50, 71, 1, 142, 71, 1, 249, 145, 71, 1, 161, 71, 1, 232, 71, 71, 1, - 248, 184, 71, 1, 212, 220, 71, 1, 231, 75, 71, 1, 248, 21, 71, 1, 211, - 227, 71, 1, 232, 147, 71, 1, 249, 9, 71, 1, 213, 92, 71, 1, 231, 193, 71, - 1, 248, 116, 71, 1, 212, 117, 71, 1, 166, 71, 1, 219, 78, 71, 1, 218, - 145, 71, 1, 219, 207, 71, 1, 218, 251, 71, 1, 4, 164, 71, 1, 164, 71, 1, - 4, 195, 217, 71, 1, 195, 217, 71, 1, 4, 196, 3, 71, 1, 196, 3, 71, 1, - 169, 71, 1, 210, 72, 71, 1, 209, 140, 71, 1, 210, 183, 71, 1, 209, 232, - 71, 1, 4, 197, 166, 71, 1, 197, 166, 71, 1, 197, 70, 71, 1, 197, 109, 71, - 1, 197, 34, 71, 1, 218, 55, 71, 1, 197, 220, 71, 1, 4, 155, 71, 1, 4, - 224, 209, 71, 1, 199, 152, 71, 1, 199, 34, 71, 1, 199, 118, 71, 1, 198, - 248, 71, 112, 238, 253, 224, 234, 211, 252, 205, 162, 78, 71, 225, 232, - 78, 71, 198, 244, 225, 232, 78, 71, 239, 111, 223, 229, 248, 94, 1, 250, - 112, 248, 94, 1, 214, 3, 248, 94, 1, 221, 136, 248, 94, 1, 236, 49, 248, - 94, 1, 240, 231, 248, 94, 1, 203, 216, 248, 94, 1, 218, 55, 248, 94, 1, - 159, 248, 94, 1, 234, 190, 248, 94, 1, 225, 80, 248, 94, 1, 233, 15, 248, - 94, 1, 225, 217, 248, 94, 1, 211, 167, 248, 94, 1, 196, 222, 248, 94, 1, - 195, 75, 248, 94, 1, 247, 18, 248, 94, 1, 207, 52, 248, 94, 1, 144, 248, - 94, 1, 195, 158, 248, 94, 1, 247, 207, 248, 94, 1, 209, 80, 248, 94, 1, - 63, 248, 94, 1, 72, 248, 94, 1, 69, 248, 94, 1, 237, 40, 248, 94, 1, 251, - 200, 248, 94, 1, 237, 33, 248, 94, 1, 250, 150, 248, 94, 1, 214, 39, 248, - 94, 1, 251, 106, 248, 94, 1, 236, 230, 248, 94, 1, 251, 97, 248, 94, 1, - 236, 215, 248, 94, 1, 236, 163, 248, 94, 1, 68, 248, 94, 1, 66, 248, 94, - 1, 225, 230, 248, 94, 1, 199, 230, 248, 94, 1, 217, 73, 248, 94, 1, 233, - 148, 248, 94, 1, 226, 121, 248, 94, 1, 177, 3, 76, 57, 248, 94, 1, 216, - 87, 29, 1, 224, 48, 29, 1, 205, 72, 29, 1, 224, 41, 29, 1, 216, 208, 29, - 1, 216, 206, 29, 1, 216, 205, 29, 1, 202, 97, 29, 1, 205, 61, 29, 1, 210, - 54, 29, 1, 210, 49, 29, 1, 210, 46, 29, 1, 210, 39, 29, 1, 210, 34, 29, - 1, 210, 29, 29, 1, 210, 40, 29, 1, 210, 52, 29, 1, 219, 56, 29, 1, 212, - 206, 29, 1, 205, 69, 29, 1, 212, 195, 29, 1, 206, 52, 29, 1, 205, 66, 29, - 1, 226, 143, 29, 1, 245, 6, 29, 1, 205, 76, 29, 1, 245, 71, 29, 1, 224, - 122, 29, 1, 202, 191, 29, 1, 212, 244, 29, 1, 232, 55, 29, 1, 63, 29, 1, - 251, 245, 29, 1, 164, 29, 1, 196, 118, 29, 1, 236, 192, 29, 1, 69, 29, 1, - 196, 56, 29, 1, 196, 69, 29, 1, 72, 29, 1, 197, 166, 29, 1, 197, 157, 29, - 1, 214, 164, 29, 1, 196, 3, 29, 1, 66, 29, 1, 197, 91, 29, 1, 197, 109, - 29, 1, 197, 70, 29, 1, 195, 217, 29, 1, 236, 116, 29, 1, 196, 24, 29, 1, - 68, 29, 235, 134, 29, 1, 205, 70, 29, 1, 216, 198, 29, 1, 216, 200, 29, - 1, 216, 203, 29, 1, 210, 47, 29, 1, 210, 28, 29, 1, 210, 36, 29, 1, 210, - 41, 29, 1, 210, 26, 29, 1, 219, 49, 29, 1, 219, 46, 29, 1, 219, 50, 29, - 1, 225, 1, 29, 1, 212, 201, 29, 1, 212, 187, 29, 1, 212, 193, 29, 1, 212, - 190, 29, 1, 212, 204, 29, 1, 212, 188, 29, 1, 224, 255, 29, 1, 224, 253, - 29, 1, 206, 45, 29, 1, 206, 43, 29, 1, 206, 35, 29, 1, 206, 40, 29, 1, - 206, 50, 29, 1, 213, 174, 29, 1, 205, 73, 29, 1, 196, 46, 29, 1, 196, 40, - 29, 1, 196, 41, 29, 1, 225, 0, 29, 1, 205, 74, 29, 1, 196, 52, 29, 1, - 195, 247, 29, 1, 195, 246, 29, 1, 195, 249, 29, 1, 195, 204, 29, 1, 195, - 205, 29, 1, 195, 208, 29, 1, 251, 6, 29, 1, 251, 0, 143, 251, 76, 222, - 64, 78, 143, 251, 76, 210, 90, 78, 143, 251, 76, 97, 78, 143, 251, 76, - 99, 78, 143, 251, 76, 115, 78, 143, 251, 76, 235, 7, 78, 143, 251, 76, - 201, 243, 78, 143, 251, 76, 112, 78, 143, 251, 76, 248, 85, 78, 143, 251, - 76, 235, 113, 78, 143, 251, 76, 208, 136, 78, 143, 251, 76, 202, 185, 78, - 143, 251, 76, 235, 0, 78, 143, 251, 76, 232, 123, 78, 143, 251, 76, 237, - 73, 78, 143, 251, 76, 220, 63, 78, 248, 94, 1, 248, 21, 248, 94, 1, 195, - 33, 248, 94, 1, 225, 172, 248, 94, 1, 233, 76, 248, 94, 1, 237, 54, 248, - 94, 1, 236, 212, 248, 94, 1, 214, 102, 248, 94, 1, 214, 106, 248, 94, 1, - 226, 1, 248, 94, 1, 251, 78, 248, 94, 1, 226, 52, 248, 94, 1, 200, 42, - 248, 94, 1, 226, 103, 248, 94, 1, 217, 51, 248, 94, 1, 251, 193, 248, 94, - 1, 250, 145, 248, 94, 1, 251, 123, 248, 94, 1, 214, 127, 248, 94, 1, 214, - 109, 248, 94, 1, 226, 49, 248, 94, 48, 1, 214, 3, 248, 94, 48, 1, 203, - 216, 248, 94, 48, 1, 225, 80, 248, 94, 48, 1, 233, 15, 248, 94, 1, 233, - 231, 248, 94, 1, 222, 123, 248, 94, 1, 194, 235, 12, 204, 196, 203, 216, - 12, 204, 196, 197, 82, 12, 204, 196, 196, 197, 12, 204, 196, 247, 220, - 12, 204, 196, 204, 68, 12, 204, 196, 230, 253, 12, 204, 196, 231, 1, 12, - 204, 196, 231, 84, 12, 204, 196, 230, 254, 12, 204, 196, 203, 219, 12, - 204, 196, 231, 0, 12, 204, 196, 230, 252, 12, 204, 196, 231, 82, 12, 204, - 196, 230, 255, 12, 204, 196, 230, 251, 12, 204, 196, 218, 55, 12, 204, - 196, 233, 15, 12, 204, 196, 209, 80, 12, 204, 196, 214, 3, 12, 204, 196, - 205, 151, 12, 204, 196, 240, 231, 12, 204, 196, 231, 2, 12, 204, 196, - 232, 81, 12, 204, 196, 203, 228, 12, 204, 196, 204, 45, 12, 204, 196, - 205, 23, 12, 204, 196, 207, 58, 12, 204, 196, 213, 96, 12, 204, 196, 211, - 169, 12, 204, 196, 202, 31, 12, 204, 196, 203, 218, 12, 204, 196, 204, - 57, 12, 204, 196, 231, 12, 12, 204, 196, 230, 250, 12, 204, 196, 213, 8, - 12, 204, 196, 211, 167, 71, 1, 4, 223, 187, 71, 1, 4, 206, 112, 71, 1, 4, - 204, 172, 71, 1, 4, 149, 71, 1, 4, 215, 186, 71, 1, 4, 142, 71, 1, 4, - 232, 71, 71, 1, 4, 231, 75, 71, 1, 4, 232, 147, 71, 1, 4, 231, 193, 71, - 1, 4, 218, 145, 71, 1, 4, 169, 71, 1, 4, 210, 72, 71, 1, 4, 209, 140, 71, - 1, 4, 210, 183, 71, 1, 4, 209, 232, 119, 29, 224, 48, 119, 29, 216, 208, - 119, 29, 202, 97, 119, 29, 210, 54, 119, 29, 219, 56, 119, 29, 212, 206, - 119, 29, 206, 52, 119, 29, 226, 143, 119, 29, 245, 6, 119, 29, 245, 71, - 119, 29, 224, 122, 119, 29, 202, 191, 119, 29, 212, 244, 119, 29, 232, - 55, 119, 29, 224, 49, 63, 119, 29, 216, 209, 63, 119, 29, 202, 98, 63, - 119, 29, 210, 55, 63, 119, 29, 219, 57, 63, 119, 29, 212, 207, 63, 119, - 29, 206, 53, 63, 119, 29, 226, 144, 63, 119, 29, 245, 7, 63, 119, 29, - 245, 72, 63, 119, 29, 224, 123, 63, 119, 29, 202, 192, 63, 119, 29, 212, - 245, 63, 119, 29, 232, 56, 63, 119, 29, 245, 7, 66, 119, 223, 233, 190, - 214, 142, 119, 223, 233, 190, 177, 231, 75, 119, 230, 191, 100, 119, 230, - 191, 102, 119, 230, 191, 134, 119, 230, 191, 136, 119, 230, 191, 146, - 119, 230, 191, 167, 119, 230, 191, 178, 119, 230, 191, 171, 119, 230, - 191, 182, 119, 230, 191, 203, 23, 119, 230, 191, 218, 189, 119, 230, 191, - 235, 118, 119, 230, 191, 197, 127, 119, 230, 191, 197, 14, 119, 230, 191, - 219, 143, 119, 230, 191, 237, 72, 119, 230, 191, 204, 111, 119, 230, 191, - 204, 229, 119, 230, 191, 232, 156, 119, 230, 191, 205, 189, 119, 230, - 191, 217, 222, 119, 230, 191, 205, 133, 119, 230, 191, 235, 129, 119, - 230, 191, 241, 148, 119, 230, 191, 223, 71, 119, 230, 191, 210, 113, 119, - 230, 191, 247, 152, 119, 230, 191, 204, 178, 119, 230, 191, 204, 91, 119, - 230, 191, 236, 202, 119, 230, 191, 210, 103, 119, 230, 191, 251, 142, - 119, 230, 191, 235, 161, 119, 230, 191, 210, 101, 119, 230, 191, 207, - 112, 119, 230, 191, 210, 178, 46, 230, 191, 211, 78, 46, 230, 191, 224, - 75, 46, 230, 191, 208, 166, 46, 230, 191, 223, 229, 46, 31, 203, 24, 214, - 120, 58, 205, 94, 46, 31, 200, 235, 214, 120, 58, 205, 94, 46, 31, 202, - 178, 214, 120, 58, 205, 94, 46, 31, 235, 15, 214, 120, 58, 205, 94, 46, - 31, 235, 146, 214, 120, 58, 205, 94, 46, 31, 206, 14, 214, 120, 58, 205, - 94, 46, 31, 207, 66, 214, 120, 58, 205, 94, 46, 31, 237, 21, 214, 120, - 58, 205, 94, 213, 130, 55, 46, 31, 200, 235, 100, 46, 31, 200, 235, 102, - 46, 31, 200, 235, 134, 46, 31, 200, 235, 136, 46, 31, 200, 235, 146, 46, - 31, 200, 235, 167, 46, 31, 200, 235, 178, 46, 31, 200, 235, 171, 46, 31, - 200, 235, 182, 46, 31, 202, 177, 46, 31, 202, 178, 100, 46, 31, 202, 178, - 102, 46, 31, 202, 178, 134, 46, 31, 202, 178, 136, 46, 31, 202, 178, 146, - 46, 29, 224, 48, 46, 29, 216, 208, 46, 29, 202, 97, 46, 29, 210, 54, 46, - 29, 219, 56, 46, 29, 212, 206, 46, 29, 206, 52, 46, 29, 226, 143, 46, 29, - 245, 6, 46, 29, 245, 71, 46, 29, 224, 122, 46, 29, 202, 191, 46, 29, 212, - 244, 46, 29, 232, 55, 46, 29, 224, 49, 63, 46, 29, 216, 209, 63, 46, 29, - 202, 98, 63, 46, 29, 210, 55, 63, 46, 29, 219, 57, 63, 46, 29, 212, 207, - 63, 46, 29, 206, 53, 63, 46, 29, 226, 144, 63, 46, 29, 245, 7, 63, 46, - 29, 245, 72, 63, 46, 29, 224, 123, 63, 46, 29, 202, 192, 63, 46, 29, 212, - 245, 63, 46, 29, 232, 56, 63, 46, 223, 233, 190, 247, 6, 46, 223, 233, - 190, 225, 106, 46, 29, 226, 144, 66, 223, 233, 205, 11, 105, 46, 230, - 191, 100, 46, 230, 191, 102, 46, 230, 191, 134, 46, 230, 191, 136, 46, - 230, 191, 146, 46, 230, 191, 167, 46, 230, 191, 178, 46, 230, 191, 171, - 46, 230, 191, 182, 46, 230, 191, 203, 23, 46, 230, 191, 218, 189, 46, - 230, 191, 235, 118, 46, 230, 191, 197, 127, 46, 230, 191, 197, 14, 46, - 230, 191, 219, 143, 46, 230, 191, 237, 72, 46, 230, 191, 204, 111, 46, - 230, 191, 204, 229, 46, 230, 191, 232, 156, 46, 230, 191, 205, 189, 46, - 230, 191, 217, 222, 46, 230, 191, 205, 133, 46, 230, 191, 235, 129, 46, - 230, 191, 241, 148, 46, 230, 191, 223, 71, 46, 230, 191, 208, 134, 46, - 230, 191, 220, 66, 46, 230, 191, 235, 171, 46, 230, 191, 204, 123, 46, - 230, 191, 236, 94, 46, 230, 191, 212, 15, 46, 230, 191, 250, 154, 46, - 230, 191, 225, 233, 46, 230, 191, 210, 101, 46, 230, 191, 241, 107, 46, - 230, 191, 241, 95, 46, 230, 191, 232, 48, 46, 230, 191, 247, 36, 46, 230, - 191, 221, 208, 46, 230, 191, 222, 184, 46, 230, 191, 210, 22, 46, 230, - 191, 219, 192, 46, 230, 191, 210, 131, 46, 230, 191, 204, 178, 46, 230, - 191, 204, 91, 46, 230, 191, 236, 202, 46, 230, 191, 210, 103, 46, 230, - 191, 251, 142, 46, 230, 191, 216, 194, 46, 31, 202, 178, 167, 46, 31, - 202, 178, 178, 46, 31, 202, 178, 171, 46, 31, 202, 178, 182, 46, 31, 235, - 14, 46, 31, 235, 15, 100, 46, 31, 235, 15, 102, 46, 31, 235, 15, 134, 46, - 31, 235, 15, 136, 46, 31, 235, 15, 146, 46, 31, 235, 15, 167, 46, 31, - 235, 15, 178, 46, 31, 235, 15, 171, 46, 31, 235, 15, 182, 46, 31, 235, - 145, 143, 203, 36, 16, 36, 225, 204, 143, 203, 36, 16, 36, 235, 183, 143, - 203, 36, 16, 36, 220, 31, 143, 203, 36, 16, 36, 251, 20, 143, 203, 36, - 16, 36, 219, 251, 143, 203, 36, 16, 36, 225, 103, 143, 203, 36, 16, 36, - 225, 104, 143, 203, 36, 16, 36, 250, 146, 143, 203, 36, 16, 36, 207, 89, - 143, 203, 36, 16, 36, 214, 170, 143, 203, 36, 16, 36, 216, 6, 143, 203, - 36, 16, 36, 239, 246, 47, 232, 81, 47, 236, 159, 47, 236, 104, 222, 81, - 222, 108, 55, 46, 71, 63, 46, 71, 68, 46, 71, 66, 46, 71, 69, 46, 71, 72, - 46, 71, 155, 46, 71, 224, 101, 46, 71, 223, 187, 46, 71, 224, 209, 46, - 71, 224, 11, 46, 71, 183, 46, 71, 206, 112, 46, 71, 204, 172, 46, 71, - 208, 147, 46, 71, 205, 200, 46, 71, 189, 46, 71, 202, 122, 46, 71, 201, - 40, 46, 71, 203, 68, 46, 71, 149, 46, 71, 176, 46, 71, 216, 223, 46, 71, - 215, 186, 46, 71, 217, 118, 46, 71, 216, 50, 46, 71, 142, 46, 71, 232, - 71, 46, 71, 231, 75, 46, 71, 232, 147, 46, 71, 231, 193, 46, 71, 166, 46, - 71, 219, 78, 46, 71, 218, 145, 46, 71, 219, 207, 46, 71, 218, 251, 46, - 71, 164, 46, 71, 195, 217, 46, 71, 196, 3, 46, 71, 169, 46, 71, 210, 72, - 46, 71, 209, 140, 46, 71, 210, 183, 46, 71, 209, 232, 46, 71, 197, 166, - 46, 71, 197, 70, 46, 71, 197, 109, 46, 71, 197, 34, 47, 236, 162, 217, - 223, 210, 139, 47, 251, 45, 47, 250, 204, 47, 251, 72, 47, 252, 125, 47, - 226, 54, 47, 226, 21, 47, 200, 39, 47, 236, 131, 47, 237, 51, 47, 214, - 105, 47, 214, 98, 47, 225, 29, 47, 224, 249, 47, 224, 244, 47, 234, 78, - 47, 234, 88, 47, 233, 180, 47, 233, 176, 47, 223, 101, 47, 233, 167, 47, - 224, 66, 47, 224, 65, 47, 224, 64, 47, 224, 63, 47, 233, 44, 47, 233, 43, - 47, 223, 150, 47, 223, 153, 47, 224, 196, 47, 223, 231, 47, 223, 239, 47, - 208, 252, 47, 208, 210, 47, 206, 33, 47, 207, 95, 47, 207, 94, 47, 240, - 132, 47, 239, 189, 47, 238, 254, 47, 202, 13, 47, 217, 216, 47, 216, 7, - 47, 232, 230, 47, 213, 237, 47, 213, 236, 47, 249, 142, 47, 212, 217, 47, - 212, 180, 47, 212, 181, 47, 248, 152, 47, 231, 70, 47, 231, 65, 47, 247, - 235, 47, 231, 49, 47, 232, 109, 47, 213, 19, 47, 213, 60, 47, 232, 90, - 47, 213, 56, 47, 213, 74, 47, 248, 246, 47, 212, 106, 47, 248, 90, 47, - 231, 169, 47, 212, 92, 47, 231, 160, 47, 231, 162, 47, 220, 79, 47, 220, - 75, 47, 220, 84, 47, 220, 17, 47, 220, 48, 47, 219, 35, 47, 219, 10, 47, - 219, 9, 47, 219, 180, 47, 219, 177, 47, 219, 181, 47, 196, 128, 47, 196, - 126, 47, 195, 202, 47, 209, 248, 47, 209, 252, 47, 209, 107, 47, 209, - 100, 47, 210, 128, 47, 210, 125, 47, 197, 125, 143, 203, 36, 16, 36, 231, - 92, 195, 79, 143, 203, 36, 16, 36, 231, 92, 100, 143, 203, 36, 16, 36, - 231, 92, 102, 143, 203, 36, 16, 36, 231, 92, 134, 143, 203, 36, 16, 36, - 231, 92, 136, 143, 203, 36, 16, 36, 231, 92, 146, 143, 203, 36, 16, 36, - 231, 92, 167, 143, 203, 36, 16, 36, 231, 92, 178, 143, 203, 36, 16, 36, - 231, 92, 171, 143, 203, 36, 16, 36, 231, 92, 182, 143, 203, 36, 16, 36, - 231, 92, 203, 23, 143, 203, 36, 16, 36, 231, 92, 236, 252, 143, 203, 36, - 16, 36, 231, 92, 200, 239, 143, 203, 36, 16, 36, 231, 92, 202, 179, 143, - 203, 36, 16, 36, 231, 92, 235, 1, 143, 203, 36, 16, 36, 231, 92, 235, - 149, 143, 203, 36, 16, 36, 231, 92, 206, 23, 143, 203, 36, 16, 36, 231, - 92, 207, 68, 143, 203, 36, 16, 36, 231, 92, 237, 28, 143, 203, 36, 16, - 36, 231, 92, 216, 176, 143, 203, 36, 16, 36, 231, 92, 200, 234, 143, 203, - 36, 16, 36, 231, 92, 200, 227, 143, 203, 36, 16, 36, 231, 92, 200, 222, - 143, 203, 36, 16, 36, 231, 92, 200, 224, 143, 203, 36, 16, 36, 231, 92, - 200, 229, 47, 231, 83, 47, 240, 136, 47, 250, 150, 47, 154, 47, 214, 29, - 47, 213, 97, 47, 239, 31, 47, 239, 32, 205, 93, 47, 239, 32, 241, 35, 47, - 225, 230, 47, 236, 162, 217, 223, 232, 110, 47, 236, 162, 217, 223, 203, - 239, 47, 236, 162, 217, 223, 203, 132, 47, 236, 162, 217, 223, 219, 176, - 47, 241, 97, 47, 213, 244, 251, 109, 47, 176, 47, 218, 146, 63, 47, 166, - 47, 155, 47, 224, 212, 47, 219, 246, 47, 234, 66, 47, 247, 158, 47, 224, - 211, 47, 213, 9, 47, 217, 75, 47, 218, 146, 236, 49, 47, 218, 146, 234, - 190, 47, 219, 119, 47, 224, 148, 47, 231, 2, 47, 224, 103, 47, 219, 80, - 47, 233, 194, 47, 202, 124, 47, 218, 146, 159, 47, 219, 3, 47, 239, 41, - 47, 224, 30, 47, 235, 53, 47, 216, 88, 47, 218, 146, 221, 136, 47, 219, - 0, 47, 244, 183, 47, 224, 24, 47, 219, 1, 205, 93, 47, 244, 184, 205, 93, - 47, 221, 137, 205, 93, 47, 224, 25, 205, 93, 47, 219, 1, 241, 35, 47, - 244, 184, 241, 35, 47, 221, 137, 241, 35, 47, 224, 25, 241, 35, 47, 221, - 137, 127, 209, 80, 47, 221, 137, 127, 209, 81, 205, 93, 47, 161, 47, 223, - 223, 47, 218, 151, 47, 233, 118, 47, 210, 234, 47, 210, 235, 127, 209, - 80, 47, 210, 235, 127, 209, 81, 205, 93, 47, 211, 240, 47, 215, 227, 47, - 218, 146, 209, 80, 47, 218, 148, 47, 211, 187, 47, 215, 120, 47, 218, - 146, 199, 230, 47, 218, 79, 47, 223, 139, 47, 218, 80, 219, 180, 47, 211, - 186, 47, 215, 119, 47, 218, 146, 197, 199, 47, 218, 73, 47, 223, 137, 47, - 218, 74, 219, 180, 47, 225, 81, 214, 147, 47, 221, 137, 214, 147, 47, - 251, 123, 47, 248, 65, 47, 247, 81, 47, 247, 58, 47, 247, 208, 127, 224, - 148, 47, 244, 182, 47, 240, 50, 47, 233, 28, 47, 142, 47, 231, 84, 47, - 226, 86, 47, 224, 37, 47, 224, 25, 247, 124, 47, 223, 189, 47, 222, 10, - 47, 222, 9, 47, 221, 250, 47, 221, 152, 47, 219, 247, 205, 224, 47, 219, - 34, 47, 218, 217, 47, 213, 7, 47, 212, 120, 47, 212, 53, 47, 212, 51, 47, - 205, 84, 47, 204, 72, 47, 197, 111, 47, 199, 231, 127, 221, 136, 47, 39, - 127, 221, 136, 143, 203, 36, 16, 36, 240, 54, 100, 143, 203, 36, 16, 36, - 240, 54, 102, 143, 203, 36, 16, 36, 240, 54, 134, 143, 203, 36, 16, 36, - 240, 54, 136, 143, 203, 36, 16, 36, 240, 54, 146, 143, 203, 36, 16, 36, - 240, 54, 167, 143, 203, 36, 16, 36, 240, 54, 178, 143, 203, 36, 16, 36, - 240, 54, 171, 143, 203, 36, 16, 36, 240, 54, 182, 143, 203, 36, 16, 36, - 240, 54, 203, 23, 143, 203, 36, 16, 36, 240, 54, 236, 252, 143, 203, 36, - 16, 36, 240, 54, 200, 239, 143, 203, 36, 16, 36, 240, 54, 202, 179, 143, - 203, 36, 16, 36, 240, 54, 235, 1, 143, 203, 36, 16, 36, 240, 54, 235, - 149, 143, 203, 36, 16, 36, 240, 54, 206, 23, 143, 203, 36, 16, 36, 240, - 54, 207, 68, 143, 203, 36, 16, 36, 240, 54, 237, 28, 143, 203, 36, 16, - 36, 240, 54, 216, 176, 143, 203, 36, 16, 36, 240, 54, 200, 234, 143, 203, - 36, 16, 36, 240, 54, 200, 227, 143, 203, 36, 16, 36, 240, 54, 200, 222, - 143, 203, 36, 16, 36, 240, 54, 200, 224, 143, 203, 36, 16, 36, 240, 54, - 200, 229, 143, 203, 36, 16, 36, 240, 54, 200, 230, 143, 203, 36, 16, 36, - 240, 54, 200, 225, 143, 203, 36, 16, 36, 240, 54, 200, 226, 143, 203, 36, - 16, 36, 240, 54, 200, 233, 143, 203, 36, 16, 36, 240, 54, 200, 228, 143, - 203, 36, 16, 36, 240, 54, 202, 177, 143, 203, 36, 16, 36, 240, 54, 202, - 175, 47, 234, 105, 232, 84, 36, 202, 218, 241, 75, 232, 122, 232, 84, 36, - 202, 218, 210, 171, 237, 72, 232, 84, 36, 239, 122, 250, 169, 202, 218, - 248, 241, 232, 84, 36, 195, 230, 235, 45, 232, 84, 36, 197, 152, 232, 84, - 36, 241, 151, 232, 84, 36, 202, 218, 250, 228, 232, 84, 36, 231, 176, - 202, 19, 232, 84, 36, 4, 203, 115, 232, 84, 36, 201, 193, 232, 84, 36, - 213, 90, 232, 84, 36, 205, 9, 232, 84, 36, 235, 173, 232, 84, 36, 233, - 96, 212, 75, 232, 84, 36, 218, 237, 232, 84, 36, 236, 201, 232, 84, 36, - 235, 46, 232, 84, 36, 197, 7, 214, 120, 202, 218, 239, 247, 232, 84, 36, - 251, 24, 232, 84, 36, 241, 130, 232, 84, 36, 248, 142, 202, 144, 232, 84, - 36, 233, 116, 232, 84, 36, 205, 111, 251, 44, 232, 84, 36, 210, 93, 232, - 84, 36, 226, 48, 232, 84, 36, 233, 96, 203, 115, 232, 84, 36, 218, 165, - 241, 100, 232, 84, 36, 233, 96, 212, 28, 232, 84, 36, 202, 218, 252, 27, - 197, 127, 232, 84, 36, 202, 218, 244, 211, 235, 118, 232, 84, 36, 226, - 62, 232, 84, 36, 237, 177, 232, 84, 36, 210, 96, 232, 84, 36, 233, 96, - 212, 58, 232, 84, 36, 212, 2, 232, 84, 36, 240, 70, 77, 202, 218, 222, - 95, 232, 84, 36, 202, 218, 235, 211, 232, 84, 36, 214, 78, 232, 84, 36, - 214, 177, 232, 84, 36, 239, 217, 232, 84, 36, 239, 239, 232, 84, 36, 226, - 77, 232, 84, 36, 248, 51, 232, 84, 36, 244, 161, 202, 30, 219, 183, 232, - 84, 36, 234, 73, 202, 19, 232, 84, 36, 211, 197, 200, 25, 232, 84, 36, - 214, 77, 232, 84, 36, 202, 218, 197, 93, 232, 84, 36, 210, 84, 232, 84, - 36, 202, 218, 247, 87, 232, 84, 36, 202, 218, 250, 224, 202, 138, 232, - 84, 36, 202, 218, 224, 197, 204, 233, 218, 169, 232, 84, 36, 239, 184, - 232, 84, 36, 202, 218, 220, 20, 220, 80, 232, 84, 36, 252, 28, 232, 84, - 36, 202, 218, 197, 144, 232, 84, 36, 202, 218, 234, 28, 197, 50, 232, 84, - 36, 202, 218, 225, 112, 223, 1, 232, 84, 36, 239, 72, 232, 84, 36, 222, - 82, 232, 84, 36, 226, 51, 201, 117, 232, 84, 36, 4, 212, 28, 232, 84, 36, - 251, 218, 244, 151, 232, 84, 36, 248, 244, 244, 151, 11, 5, 225, 234, 11, - 5, 225, 226, 11, 5, 68, 11, 5, 226, 4, 11, 5, 226, 145, 11, 5, 226, 128, - 11, 5, 226, 147, 11, 5, 226, 146, 11, 5, 250, 168, 11, 5, 250, 124, 11, - 5, 63, 11, 5, 251, 46, 11, 5, 200, 37, 11, 5, 200, 41, 11, 5, 200, 38, - 11, 5, 214, 49, 11, 5, 214, 13, 11, 5, 72, 11, 5, 214, 93, 11, 5, 236, - 95, 11, 5, 69, 11, 5, 196, 243, 11, 5, 248, 145, 11, 5, 248, 140, 11, 5, - 248, 184, 11, 5, 248, 157, 11, 5, 248, 173, 11, 5, 248, 172, 11, 5, 248, - 175, 11, 5, 248, 174, 11, 5, 249, 56, 11, 5, 249, 48, 11, 5, 249, 145, - 11, 5, 249, 81, 11, 5, 247, 247, 11, 5, 247, 251, 11, 5, 247, 248, 11, 5, - 248, 89, 11, 5, 248, 70, 11, 5, 248, 116, 11, 5, 248, 95, 11, 5, 248, - 200, 11, 5, 249, 9, 11, 5, 248, 213, 11, 5, 247, 231, 11, 5, 247, 225, - 11, 5, 248, 21, 11, 5, 247, 246, 11, 5, 247, 239, 11, 5, 247, 244, 11, 5, - 247, 213, 11, 5, 247, 211, 11, 5, 247, 218, 11, 5, 247, 216, 11, 5, 247, - 214, 11, 5, 247, 215, 11, 5, 212, 157, 11, 5, 212, 153, 11, 5, 212, 220, - 11, 5, 212, 169, 11, 5, 212, 186, 11, 5, 212, 213, 11, 5, 212, 209, 11, - 5, 213, 116, 11, 5, 213, 102, 11, 5, 161, 11, 5, 213, 163, 11, 5, 211, - 207, 11, 5, 211, 209, 11, 5, 211, 208, 11, 5, 212, 68, 11, 5, 212, 56, - 11, 5, 212, 117, 11, 5, 212, 87, 11, 5, 211, 193, 11, 5, 211, 189, 11, 5, - 211, 227, 11, 5, 211, 206, 11, 5, 211, 198, 11, 5, 211, 204, 11, 5, 211, - 171, 11, 5, 211, 170, 11, 5, 211, 175, 11, 5, 211, 174, 11, 5, 211, 172, - 11, 5, 211, 173, 11, 5, 249, 30, 11, 5, 249, 29, 11, 5, 249, 36, 11, 5, - 249, 31, 11, 5, 249, 33, 11, 5, 249, 32, 11, 5, 249, 35, 11, 5, 249, 34, - 11, 5, 249, 42, 11, 5, 249, 41, 11, 5, 249, 45, 11, 5, 249, 43, 11, 5, - 249, 21, 11, 5, 249, 23, 11, 5, 249, 22, 11, 5, 249, 26, 11, 5, 249, 25, - 11, 5, 249, 28, 11, 5, 249, 27, 11, 5, 249, 37, 11, 5, 249, 40, 11, 5, - 249, 38, 11, 5, 249, 17, 11, 5, 249, 16, 11, 5, 249, 24, 11, 5, 249, 20, - 11, 5, 249, 18, 11, 5, 249, 19, 11, 5, 249, 13, 11, 5, 249, 12, 11, 5, - 249, 15, 11, 5, 249, 14, 11, 5, 217, 182, 11, 5, 217, 181, 11, 5, 217, - 187, 11, 5, 217, 183, 11, 5, 217, 184, 11, 5, 217, 186, 11, 5, 217, 185, - 11, 5, 217, 190, 11, 5, 217, 189, 11, 5, 217, 192, 11, 5, 217, 191, 11, - 5, 217, 178, 11, 5, 217, 177, 11, 5, 217, 180, 11, 5, 217, 179, 11, 5, - 217, 171, 11, 5, 217, 170, 11, 5, 217, 175, 11, 5, 217, 174, 11, 5, 217, - 172, 11, 5, 217, 173, 11, 5, 217, 165, 11, 5, 217, 164, 11, 5, 217, 169, - 11, 5, 217, 168, 11, 5, 217, 166, 11, 5, 217, 167, 11, 5, 231, 237, 11, - 5, 231, 236, 11, 5, 231, 242, 11, 5, 231, 238, 11, 5, 231, 239, 11, 5, - 231, 241, 11, 5, 231, 240, 11, 5, 231, 245, 11, 5, 231, 244, 11, 5, 231, - 247, 11, 5, 231, 246, 11, 5, 231, 228, 11, 5, 231, 230, 11, 5, 231, 229, - 11, 5, 231, 233, 11, 5, 231, 232, 11, 5, 231, 235, 11, 5, 231, 234, 11, - 5, 231, 224, 11, 5, 231, 223, 11, 5, 231, 231, 11, 5, 231, 227, 11, 5, - 231, 225, 11, 5, 231, 226, 11, 5, 231, 218, 11, 5, 231, 222, 11, 5, 231, - 221, 11, 5, 231, 219, 11, 5, 231, 220, 11, 5, 219, 6, 11, 5, 219, 5, 11, - 5, 219, 78, 11, 5, 219, 12, 11, 5, 219, 42, 11, 5, 219, 60, 11, 5, 219, - 58, 11, 5, 220, 4, 11, 5, 219, 254, 11, 5, 166, 11, 5, 220, 43, 11, 5, - 218, 107, 11, 5, 218, 106, 11, 5, 218, 110, 11, 5, 218, 108, 11, 5, 218, - 180, 11, 5, 218, 153, 11, 5, 218, 251, 11, 5, 218, 187, 11, 5, 219, 130, - 11, 5, 219, 207, 11, 5, 218, 87, 11, 5, 218, 81, 11, 5, 218, 145, 11, 5, - 218, 103, 11, 5, 218, 96, 11, 5, 218, 101, 11, 5, 218, 58, 11, 5, 218, - 57, 11, 5, 218, 63, 11, 5, 218, 60, 11, 5, 235, 104, 11, 5, 235, 98, 11, - 5, 235, 153, 11, 5, 235, 120, 11, 5, 235, 202, 11, 5, 235, 193, 11, 5, - 235, 239, 11, 5, 235, 207, 11, 5, 234, 254, 11, 5, 235, 51, 11, 5, 235, - 32, 11, 5, 234, 206, 11, 5, 234, 205, 11, 5, 234, 223, 11, 5, 234, 211, - 11, 5, 234, 209, 11, 5, 234, 210, 11, 5, 234, 193, 11, 5, 234, 192, 11, - 5, 234, 196, 11, 5, 234, 194, 11, 5, 198, 255, 11, 5, 198, 250, 11, 5, - 199, 34, 11, 5, 199, 8, 11, 5, 199, 23, 11, 5, 199, 20, 11, 5, 199, 26, - 11, 5, 199, 25, 11, 5, 199, 126, 11, 5, 199, 121, 11, 5, 199, 152, 11, 5, - 199, 139, 11, 5, 198, 229, 11, 5, 198, 225, 11, 5, 198, 248, 11, 5, 198, - 231, 11, 5, 199, 38, 11, 5, 199, 106, 11, 5, 197, 213, 11, 5, 197, 211, - 11, 5, 197, 220, 11, 5, 197, 216, 11, 5, 197, 214, 11, 5, 197, 215, 11, - 5, 197, 203, 11, 5, 197, 202, 11, 5, 197, 207, 11, 5, 197, 206, 11, 5, - 197, 204, 11, 5, 197, 205, 11, 5, 239, 65, 11, 5, 239, 51, 11, 5, 239, - 152, 11, 5, 239, 92, 11, 5, 239, 127, 11, 5, 239, 132, 11, 5, 239, 131, - 11, 5, 240, 61, 11, 5, 240, 55, 11, 5, 240, 136, 11, 5, 240, 81, 11, 5, - 237, 182, 11, 5, 237, 183, 11, 5, 238, 253, 11, 5, 237, 229, 11, 5, 239, - 28, 11, 5, 239, 0, 11, 5, 239, 182, 11, 5, 239, 252, 11, 5, 239, 203, 11, - 5, 237, 173, 11, 5, 237, 171, 11, 5, 237, 201, 11, 5, 237, 181, 11, 5, - 237, 176, 11, 5, 237, 179, 11, 5, 202, 57, 11, 5, 202, 49, 11, 5, 202, - 122, 11, 5, 202, 67, 11, 5, 202, 105, 11, 5, 202, 107, 11, 5, 202, 106, - 11, 5, 203, 94, 11, 5, 203, 79, 11, 5, 189, 11, 5, 203, 105, 11, 5, 201, - 15, 11, 5, 201, 14, 11, 5, 201, 17, 11, 5, 201, 16, 11, 5, 201, 229, 11, - 5, 201, 219, 11, 5, 149, 11, 5, 201, 242, 11, 5, 202, 239, 11, 5, 203, - 68, 11, 5, 203, 10, 11, 5, 200, 254, 11, 5, 200, 249, 11, 5, 201, 40, 11, - 5, 201, 13, 11, 5, 200, 255, 11, 5, 201, 10, 11, 5, 240, 13, 11, 5, 240, - 12, 11, 5, 240, 18, 11, 5, 240, 14, 11, 5, 240, 15, 11, 5, 240, 17, 11, - 5, 240, 16, 11, 5, 240, 34, 11, 5, 240, 33, 11, 5, 240, 41, 11, 5, 240, - 35, 11, 5, 240, 3, 11, 5, 240, 5, 11, 5, 240, 4, 11, 5, 240, 8, 11, 5, - 240, 7, 11, 5, 240, 11, 11, 5, 240, 9, 11, 5, 240, 26, 11, 5, 240, 29, - 11, 5, 240, 27, 11, 5, 239, 255, 11, 5, 239, 254, 11, 5, 240, 6, 11, 5, - 240, 2, 11, 5, 240, 0, 11, 5, 240, 1, 11, 5, 217, 137, 11, 5, 217, 136, - 11, 5, 217, 144, 11, 5, 217, 139, 11, 5, 217, 140, 11, 5, 217, 141, 11, - 5, 217, 153, 11, 5, 217, 152, 11, 5, 217, 159, 11, 5, 217, 154, 11, 5, - 217, 129, 11, 5, 217, 128, 11, 5, 217, 135, 11, 5, 217, 130, 11, 5, 217, - 145, 11, 5, 217, 151, 11, 5, 217, 149, 11, 5, 217, 121, 11, 5, 217, 120, - 11, 5, 217, 126, 11, 5, 217, 124, 11, 5, 217, 122, 11, 5, 217, 123, 11, - 5, 231, 203, 11, 5, 231, 202, 11, 5, 231, 209, 11, 5, 231, 204, 11, 5, - 231, 206, 11, 5, 231, 205, 11, 5, 231, 208, 11, 5, 231, 207, 11, 5, 231, - 215, 11, 5, 231, 213, 11, 5, 231, 217, 11, 5, 231, 216, 11, 5, 231, 196, - 11, 5, 231, 197, 11, 5, 231, 200, 11, 5, 231, 199, 11, 5, 231, 201, 11, - 5, 231, 210, 11, 5, 231, 212, 11, 5, 231, 211, 11, 5, 231, 195, 11, 5, - 216, 168, 11, 5, 216, 166, 11, 5, 216, 223, 11, 5, 216, 171, 11, 5, 216, - 197, 11, 5, 216, 211, 11, 5, 216, 210, 11, 5, 217, 197, 11, 5, 176, 11, - 5, 217, 213, 11, 5, 215, 130, 11, 5, 215, 132, 11, 5, 215, 131, 11, 5, - 216, 18, 11, 5, 216, 2, 11, 5, 216, 50, 11, 5, 216, 29, 11, 5, 217, 77, - 11, 5, 217, 118, 11, 5, 217, 96, 11, 5, 215, 125, 11, 5, 215, 121, 11, 5, - 215, 186, 11, 5, 215, 129, 11, 5, 215, 127, 11, 5, 215, 128, 11, 5, 232, - 12, 11, 5, 232, 11, 11, 5, 232, 17, 11, 5, 232, 13, 11, 5, 232, 14, 11, - 5, 232, 16, 11, 5, 232, 15, 11, 5, 232, 23, 11, 5, 232, 21, 11, 5, 232, - 25, 11, 5, 232, 24, 11, 5, 232, 4, 11, 5, 232, 6, 11, 5, 232, 5, 11, 5, - 232, 8, 11, 5, 232, 10, 11, 5, 232, 9, 11, 5, 232, 18, 11, 5, 232, 20, - 11, 5, 232, 19, 11, 5, 232, 0, 11, 5, 231, 255, 11, 5, 232, 7, 11, 5, - 232, 3, 11, 5, 232, 1, 11, 5, 232, 2, 11, 5, 231, 250, 11, 5, 231, 249, - 11, 5, 231, 254, 11, 5, 231, 253, 11, 5, 231, 251, 11, 5, 231, 252, 11, - 5, 222, 51, 11, 5, 222, 43, 11, 5, 222, 109, 11, 5, 222, 61, 11, 5, 222, - 100, 11, 5, 222, 99, 11, 5, 222, 103, 11, 5, 222, 101, 11, 5, 222, 220, - 11, 5, 222, 208, 11, 5, 172, 11, 5, 222, 231, 11, 5, 221, 169, 11, 5, - 221, 168, 11, 5, 221, 171, 11, 5, 221, 170, 11, 5, 221, 216, 11, 5, 221, - 200, 11, 5, 222, 7, 11, 5, 221, 222, 11, 5, 222, 126, 11, 5, 222, 197, - 11, 5, 222, 144, 11, 5, 221, 163, 11, 5, 221, 161, 11, 5, 221, 191, 11, - 5, 221, 167, 11, 5, 221, 165, 11, 5, 221, 166, 11, 5, 221, 141, 11, 5, - 221, 140, 11, 5, 221, 151, 11, 5, 221, 144, 11, 5, 221, 142, 11, 5, 221, - 143, 11, 5, 233, 163, 11, 5, 233, 162, 11, 5, 233, 192, 11, 5, 233, 175, - 11, 5, 233, 184, 11, 5, 233, 183, 11, 5, 233, 186, 11, 5, 233, 185, 11, - 5, 234, 75, 11, 5, 234, 70, 11, 5, 234, 123, 11, 5, 234, 86, 11, 5, 233, - 49, 11, 5, 233, 48, 11, 5, 233, 51, 11, 5, 233, 50, 11, 5, 233, 121, 11, - 5, 233, 119, 11, 5, 233, 144, 11, 5, 233, 130, 11, 5, 234, 14, 11, 5, - 234, 12, 11, 5, 234, 48, 11, 5, 234, 25, 11, 5, 233, 38, 11, 5, 233, 37, - 11, 5, 233, 76, 11, 5, 233, 47, 11, 5, 233, 39, 11, 5, 233, 46, 11, 5, - 224, 55, 11, 5, 224, 50, 11, 5, 224, 101, 11, 5, 224, 69, 11, 5, 224, 82, - 11, 5, 224, 86, 11, 5, 224, 84, 11, 5, 224, 235, 11, 5, 224, 217, 11, 5, - 155, 11, 5, 225, 8, 11, 5, 223, 158, 11, 5, 223, 163, 11, 5, 223, 160, - 11, 5, 223, 230, 11, 5, 223, 225, 11, 5, 224, 11, 11, 5, 223, 237, 11, 5, - 224, 172, 11, 5, 224, 155, 11, 5, 224, 209, 11, 5, 224, 176, 11, 5, 223, - 145, 11, 5, 223, 141, 11, 5, 223, 187, 11, 5, 223, 157, 11, 5, 223, 149, - 11, 5, 223, 154, 11, 5, 233, 252, 11, 5, 233, 251, 11, 5, 234, 0, 11, 5, - 233, 253, 11, 5, 233, 255, 11, 5, 233, 254, 11, 5, 234, 7, 11, 5, 234, 6, - 11, 5, 234, 10, 11, 5, 234, 8, 11, 5, 233, 243, 11, 5, 233, 242, 11, 5, - 233, 245, 11, 5, 233, 244, 11, 5, 233, 248, 11, 5, 233, 247, 11, 5, 233, - 250, 11, 5, 233, 249, 11, 5, 234, 2, 11, 5, 234, 1, 11, 5, 234, 5, 11, 5, - 234, 3, 11, 5, 233, 238, 11, 5, 233, 237, 11, 5, 233, 246, 11, 5, 233, - 241, 11, 5, 233, 239, 11, 5, 233, 240, 11, 5, 219, 97, 11, 5, 219, 98, - 11, 5, 219, 116, 11, 5, 219, 115, 11, 5, 219, 118, 11, 5, 219, 117, 11, - 5, 219, 88, 11, 5, 219, 90, 11, 5, 219, 89, 11, 5, 219, 93, 11, 5, 219, - 92, 11, 5, 219, 95, 11, 5, 219, 94, 11, 5, 219, 99, 11, 5, 219, 101, 11, - 5, 219, 100, 11, 5, 219, 84, 11, 5, 219, 83, 11, 5, 219, 91, 11, 5, 219, - 87, 11, 5, 219, 85, 11, 5, 219, 86, 11, 5, 231, 22, 11, 5, 231, 21, 11, - 5, 231, 28, 11, 5, 231, 23, 11, 5, 231, 25, 11, 5, 231, 24, 11, 5, 231, - 27, 11, 5, 231, 26, 11, 5, 231, 33, 11, 5, 231, 32, 11, 5, 231, 35, 11, - 5, 231, 34, 11, 5, 231, 14, 11, 5, 231, 13, 11, 5, 231, 16, 11, 5, 231, - 15, 11, 5, 231, 18, 11, 5, 231, 17, 11, 5, 231, 20, 11, 5, 231, 19, 11, - 5, 231, 29, 11, 5, 231, 31, 11, 5, 231, 30, 11, 5, 217, 16, 11, 5, 217, - 18, 11, 5, 217, 17, 11, 5, 217, 61, 11, 5, 217, 59, 11, 5, 217, 71, 11, - 5, 217, 64, 11, 5, 216, 233, 11, 5, 216, 232, 11, 5, 216, 234, 11, 5, - 216, 244, 11, 5, 216, 241, 11, 5, 216, 252, 11, 5, 216, 246, 11, 5, 217, - 52, 11, 5, 217, 58, 11, 5, 217, 54, 11, 5, 232, 31, 11, 5, 232, 49, 11, - 5, 232, 58, 11, 5, 232, 165, 11, 5, 232, 154, 11, 5, 142, 11, 5, 232, - 177, 11, 5, 231, 51, 11, 5, 231, 50, 11, 5, 231, 53, 11, 5, 231, 52, 11, - 5, 231, 95, 11, 5, 231, 86, 11, 5, 231, 193, 11, 5, 231, 158, 11, 5, 232, - 86, 11, 5, 232, 147, 11, 5, 232, 98, 11, 5, 197, 130, 11, 5, 197, 115, - 11, 5, 197, 166, 11, 5, 197, 141, 11, 5, 196, 232, 11, 5, 196, 234, 11, - 5, 196, 233, 11, 5, 197, 0, 11, 5, 197, 34, 11, 5, 197, 10, 11, 5, 197, - 83, 11, 5, 197, 109, 11, 5, 197, 90, 11, 5, 195, 18, 11, 5, 195, 17, 11, - 5, 195, 33, 11, 5, 195, 21, 11, 5, 195, 26, 11, 5, 195, 28, 11, 5, 195, - 27, 11, 5, 195, 97, 11, 5, 195, 94, 11, 5, 195, 115, 11, 5, 195, 101, 11, - 5, 194, 248, 11, 5, 194, 250, 11, 5, 194, 249, 11, 5, 195, 6, 11, 5, 195, - 5, 11, 5, 195, 11, 11, 5, 195, 7, 11, 5, 195, 76, 11, 5, 195, 88, 11, 5, - 195, 81, 11, 5, 194, 244, 11, 5, 194, 243, 11, 5, 194, 255, 11, 5, 194, - 247, 11, 5, 194, 245, 11, 5, 194, 246, 11, 5, 194, 230, 11, 5, 194, 229, - 11, 5, 194, 235, 11, 5, 194, 233, 11, 5, 194, 231, 11, 5, 194, 232, 11, - 5, 244, 238, 11, 5, 244, 231, 11, 5, 245, 11, 11, 5, 244, 251, 11, 5, - 245, 8, 11, 5, 245, 2, 11, 5, 245, 10, 11, 5, 245, 9, 11, 5, 247, 92, 11, - 5, 247, 84, 11, 5, 247, 174, 11, 5, 247, 125, 11, 5, 241, 29, 11, 5, 241, - 31, 11, 5, 241, 30, 11, 5, 241, 93, 11, 5, 241, 81, 11, 5, 244, 182, 11, - 5, 241, 112, 11, 5, 247, 20, 11, 5, 247, 57, 11, 5, 247, 26, 11, 5, 241, - 1, 11, 5, 240, 255, 11, 5, 241, 41, 11, 5, 241, 27, 11, 5, 241, 7, 11, 5, - 241, 22, 11, 5, 240, 234, 11, 5, 240, 233, 11, 5, 240, 246, 11, 5, 240, - 240, 11, 5, 240, 235, 11, 5, 240, 237, 11, 5, 194, 213, 11, 5, 194, 212, - 11, 5, 194, 219, 11, 5, 194, 214, 11, 5, 194, 216, 11, 5, 194, 215, 11, - 5, 194, 218, 11, 5, 194, 217, 11, 5, 194, 225, 11, 5, 194, 224, 11, 5, - 194, 228, 11, 5, 194, 226, 11, 5, 194, 209, 11, 5, 194, 211, 11, 5, 194, - 210, 11, 5, 194, 220, 11, 5, 194, 223, 11, 5, 194, 221, 11, 5, 194, 202, - 11, 5, 194, 206, 11, 5, 194, 205, 11, 5, 194, 203, 11, 5, 194, 204, 11, - 5, 194, 196, 11, 5, 194, 195, 11, 5, 194, 201, 11, 5, 194, 199, 11, 5, - 194, 197, 11, 5, 194, 198, 11, 5, 215, 41, 11, 5, 215, 40, 11, 5, 215, - 46, 11, 5, 215, 42, 11, 5, 215, 43, 11, 5, 215, 45, 11, 5, 215, 44, 11, - 5, 215, 51, 11, 5, 215, 50, 11, 5, 215, 54, 11, 5, 215, 53, 11, 5, 215, - 34, 11, 5, 215, 35, 11, 5, 215, 38, 11, 5, 215, 39, 11, 5, 215, 47, 11, - 5, 215, 49, 11, 5, 215, 29, 11, 5, 215, 37, 11, 5, 215, 33, 11, 5, 215, - 30, 11, 5, 215, 31, 11, 5, 215, 24, 11, 5, 215, 23, 11, 5, 215, 28, 11, - 5, 215, 27, 11, 5, 215, 25, 11, 5, 215, 26, 11, 5, 206, 31, 11, 5, 167, - 11, 5, 206, 112, 11, 5, 206, 34, 11, 5, 206, 92, 11, 5, 206, 95, 11, 5, - 206, 93, 11, 5, 208, 199, 11, 5, 208, 183, 11, 5, 183, 11, 5, 208, 207, - 11, 5, 204, 101, 11, 5, 204, 103, 11, 5, 204, 102, 11, 5, 205, 165, 11, - 5, 205, 154, 11, 5, 205, 200, 11, 5, 205, 169, 11, 5, 207, 63, 11, 5, - 208, 147, 11, 5, 207, 93, 11, 5, 204, 76, 11, 5, 204, 73, 11, 5, 204, - 172, 11, 5, 204, 100, 11, 5, 204, 80, 11, 5, 204, 88, 11, 5, 203, 230, - 11, 5, 203, 229, 11, 5, 204, 44, 11, 5, 203, 238, 11, 5, 203, 232, 11, 5, - 203, 237, 11, 5, 205, 41, 11, 5, 205, 40, 11, 5, 205, 47, 11, 5, 205, 42, - 11, 5, 205, 44, 11, 5, 205, 46, 11, 5, 205, 45, 11, 5, 205, 56, 11, 5, - 205, 54, 11, 5, 205, 80, 11, 5, 205, 57, 11, 5, 205, 36, 11, 5, 205, 35, - 11, 5, 205, 39, 11, 5, 205, 37, 11, 5, 205, 50, 11, 5, 205, 53, 11, 5, - 205, 51, 11, 5, 205, 32, 11, 5, 205, 30, 11, 5, 205, 34, 11, 5, 205, 33, - 11, 5, 205, 25, 11, 5, 205, 24, 11, 5, 205, 29, 11, 5, 205, 28, 11, 5, - 205, 26, 11, 5, 205, 27, 11, 5, 195, 69, 11, 5, 195, 68, 11, 5, 195, 74, - 11, 5, 195, 71, 11, 5, 195, 48, 11, 5, 195, 50, 11, 5, 195, 49, 11, 5, - 195, 53, 11, 5, 195, 52, 11, 5, 195, 57, 11, 5, 195, 54, 11, 5, 195, 62, - 11, 5, 195, 61, 11, 5, 195, 65, 11, 5, 195, 63, 11, 5, 195, 44, 11, 5, - 195, 43, 11, 5, 195, 51, 11, 5, 195, 47, 11, 5, 195, 45, 11, 5, 195, 46, - 11, 5, 195, 36, 11, 5, 195, 35, 11, 5, 195, 40, 11, 5, 195, 39, 11, 5, - 195, 37, 11, 5, 195, 38, 11, 5, 245, 109, 11, 5, 245, 105, 11, 5, 247, - 16, 11, 5, 247, 2, 11, 5, 245, 26, 11, 5, 245, 25, 11, 5, 245, 28, 11, 5, - 245, 27, 11, 5, 245, 41, 11, 5, 245, 40, 11, 5, 245, 49, 11, 5, 245, 44, - 11, 5, 245, 80, 11, 5, 245, 78, 11, 5, 245, 103, 11, 5, 245, 88, 11, 5, - 245, 20, 11, 5, 245, 30, 11, 5, 245, 24, 11, 5, 245, 21, 11, 5, 245, 23, - 11, 5, 245, 13, 11, 5, 245, 12, 11, 5, 245, 17, 11, 5, 245, 16, 11, 5, - 245, 14, 11, 5, 245, 15, 11, 5, 209, 177, 11, 5, 209, 181, 11, 5, 209, - 159, 11, 5, 209, 160, 11, 5, 209, 164, 11, 5, 209, 163, 11, 5, 209, 167, - 11, 5, 209, 165, 11, 5, 209, 171, 11, 5, 209, 170, 11, 5, 209, 176, 11, - 5, 209, 172, 11, 5, 209, 155, 11, 5, 209, 153, 11, 5, 209, 161, 11, 5, - 209, 158, 11, 5, 209, 156, 11, 5, 209, 157, 11, 5, 209, 148, 11, 5, 209, - 147, 11, 5, 209, 152, 11, 5, 209, 151, 11, 5, 209, 149, 11, 5, 209, 150, - 11, 5, 215, 250, 11, 5, 215, 249, 11, 5, 215, 252, 11, 5, 215, 251, 11, - 5, 215, 241, 11, 5, 215, 243, 11, 5, 215, 242, 11, 5, 215, 245, 11, 5, - 215, 244, 11, 5, 215, 248, 11, 5, 215, 247, 11, 5, 215, 235, 11, 5, 215, - 234, 11, 5, 215, 240, 11, 5, 215, 238, 11, 5, 215, 236, 11, 5, 215, 237, - 11, 5, 215, 229, 11, 5, 215, 228, 11, 5, 215, 233, 11, 5, 215, 232, 11, - 5, 215, 230, 11, 5, 215, 231, 11, 5, 207, 9, 11, 5, 207, 4, 11, 5, 207, - 50, 11, 5, 207, 22, 11, 5, 206, 139, 11, 5, 206, 141, 11, 5, 206, 140, - 11, 5, 206, 166, 11, 5, 206, 161, 11, 5, 206, 198, 11, 5, 206, 186, 11, - 5, 206, 233, 11, 5, 206, 226, 11, 5, 206, 255, 11, 5, 206, 242, 11, 5, - 206, 135, 11, 5, 206, 132, 11, 5, 206, 151, 11, 5, 206, 138, 11, 5, 206, - 136, 11, 5, 206, 137, 11, 5, 206, 115, 11, 5, 206, 114, 11, 5, 206, 121, - 11, 5, 206, 118, 11, 5, 206, 116, 11, 5, 206, 117, 11, 5, 210, 198, 11, - 5, 210, 192, 11, 5, 169, 11, 5, 210, 204, 11, 5, 209, 110, 11, 5, 209, - 112, 11, 5, 209, 111, 11, 5, 209, 195, 11, 5, 209, 183, 11, 5, 209, 232, - 11, 5, 209, 199, 11, 5, 210, 82, 11, 5, 210, 183, 11, 5, 210, 124, 11, 5, - 209, 102, 11, 5, 209, 99, 11, 5, 209, 140, 11, 5, 209, 109, 11, 5, 209, - 105, 11, 5, 209, 106, 11, 5, 209, 84, 11, 5, 209, 83, 11, 5, 209, 89, 11, - 5, 209, 87, 11, 5, 209, 85, 11, 5, 209, 86, 11, 5, 225, 160, 11, 5, 225, - 159, 11, 5, 225, 172, 11, 5, 225, 161, 11, 5, 225, 168, 11, 5, 225, 167, - 11, 5, 225, 170, 11, 5, 225, 169, 11, 5, 225, 98, 11, 5, 225, 97, 11, 5, - 225, 100, 11, 5, 225, 99, 11, 5, 225, 116, 11, 5, 225, 114, 11, 5, 225, - 129, 11, 5, 225, 118, 11, 5, 225, 91, 11, 5, 225, 89, 11, 5, 225, 110, - 11, 5, 225, 96, 11, 5, 225, 93, 11, 5, 225, 94, 11, 5, 225, 83, 11, 5, - 225, 82, 11, 5, 225, 87, 11, 5, 225, 86, 11, 5, 225, 84, 11, 5, 225, 85, - 11, 5, 211, 113, 11, 5, 211, 111, 11, 5, 211, 121, 11, 5, 211, 114, 11, - 5, 211, 118, 11, 5, 211, 117, 11, 5, 211, 120, 11, 5, 211, 119, 11, 5, - 211, 63, 11, 5, 211, 60, 11, 5, 211, 65, 11, 5, 211, 64, 11, 5, 211, 100, - 11, 5, 211, 99, 11, 5, 211, 109, 11, 5, 211, 103, 11, 5, 211, 55, 11, 5, - 211, 51, 11, 5, 211, 97, 11, 5, 211, 59, 11, 5, 211, 57, 11, 5, 211, 58, - 11, 5, 211, 35, 11, 5, 211, 33, 11, 5, 211, 45, 11, 5, 211, 38, 11, 5, - 211, 36, 11, 5, 211, 37, 11, 5, 225, 149, 11, 5, 225, 148, 11, 5, 225, - 155, 11, 5, 225, 150, 11, 5, 225, 152, 11, 5, 225, 151, 11, 5, 225, 154, - 11, 5, 225, 153, 11, 5, 225, 140, 11, 5, 225, 142, 11, 5, 225, 141, 11, - 5, 225, 145, 11, 5, 225, 144, 11, 5, 225, 147, 11, 5, 225, 146, 11, 5, - 225, 136, 11, 5, 225, 135, 11, 5, 225, 143, 11, 5, 225, 139, 11, 5, 225, - 137, 11, 5, 225, 138, 11, 5, 225, 132, 11, 5, 225, 131, 11, 5, 225, 134, - 11, 5, 225, 133, 11, 5, 216, 141, 11, 5, 216, 140, 11, 5, 216, 148, 11, - 5, 216, 142, 11, 5, 216, 144, 11, 5, 216, 143, 11, 5, 216, 147, 11, 5, - 216, 145, 11, 5, 216, 130, 11, 5, 216, 131, 11, 5, 216, 136, 11, 5, 216, - 135, 11, 5, 216, 139, 11, 5, 216, 137, 11, 5, 216, 125, 11, 5, 216, 134, - 11, 5, 216, 129, 11, 5, 216, 126, 11, 5, 216, 127, 11, 5, 216, 120, 11, - 5, 216, 119, 11, 5, 216, 124, 11, 5, 216, 123, 11, 5, 216, 121, 11, 5, - 216, 122, 11, 5, 215, 76, 11, 5, 215, 75, 11, 5, 215, 89, 11, 5, 215, 80, - 11, 5, 215, 85, 11, 5, 215, 84, 11, 5, 215, 87, 11, 5, 215, 86, 11, 5, - 215, 61, 11, 5, 215, 63, 11, 5, 215, 62, 11, 5, 215, 68, 11, 5, 215, 67, - 11, 5, 215, 73, 11, 5, 215, 69, 11, 5, 215, 59, 11, 5, 215, 57, 11, 5, - 215, 66, 11, 5, 215, 60, 11, 5, 196, 187, 11, 5, 196, 186, 11, 5, 196, - 196, 11, 5, 196, 189, 11, 5, 196, 191, 11, 5, 196, 190, 11, 5, 196, 193, - 11, 5, 196, 192, 11, 5, 196, 175, 11, 5, 196, 176, 11, 5, 196, 180, 11, - 5, 196, 179, 11, 5, 196, 185, 11, 5, 196, 183, 11, 5, 196, 152, 11, 5, - 196, 150, 11, 5, 196, 165, 11, 5, 196, 155, 11, 5, 196, 153, 11, 5, 196, - 154, 11, 5, 196, 9, 11, 5, 196, 7, 11, 5, 196, 24, 11, 5, 196, 10, 11, 5, - 196, 18, 11, 5, 196, 17, 11, 5, 196, 21, 11, 5, 196, 19, 11, 5, 195, 190, - 11, 5, 195, 189, 11, 5, 195, 193, 11, 5, 195, 191, 11, 5, 195, 232, 11, - 5, 195, 227, 11, 5, 196, 3, 11, 5, 195, 236, 11, 5, 195, 181, 11, 5, 195, - 177, 11, 5, 195, 217, 11, 5, 195, 188, 11, 5, 195, 184, 11, 5, 195, 185, - 11, 5, 195, 161, 11, 5, 195, 160, 11, 5, 195, 168, 11, 5, 195, 164, 11, - 5, 195, 162, 11, 5, 195, 163, 11, 44, 211, 100, 11, 44, 222, 109, 11, 44, - 224, 55, 11, 44, 215, 80, 11, 44, 240, 240, 11, 44, 205, 47, 11, 44, 233, - 249, 11, 44, 234, 25, 11, 44, 219, 78, 11, 44, 231, 22, 11, 44, 221, 143, - 11, 44, 249, 17, 11, 44, 218, 187, 11, 44, 196, 3, 11, 44, 211, 193, 11, - 44, 231, 16, 11, 44, 203, 94, 11, 44, 234, 123, 11, 44, 194, 247, 11, 44, - 240, 234, 11, 44, 240, 1, 11, 44, 247, 244, 11, 44, 233, 245, 11, 44, - 215, 69, 11, 44, 201, 40, 11, 44, 214, 93, 11, 44, 225, 136, 11, 44, 195, - 6, 11, 44, 211, 171, 11, 44, 231, 235, 11, 44, 196, 9, 11, 44, 197, 215, - 11, 44, 206, 121, 11, 44, 199, 106, 11, 44, 195, 115, 11, 44, 225, 129, - 11, 44, 215, 33, 11, 44, 225, 134, 11, 44, 233, 121, 11, 44, 225, 154, - 11, 44, 197, 34, 11, 44, 237, 201, 11, 44, 206, 137, 11, 44, 222, 103, - 11, 44, 240, 246, 11, 44, 241, 30, 11, 44, 244, 251, 11, 44, 231, 19, 11, - 44, 207, 9, 11, 44, 194, 246, 11, 44, 206, 186, 11, 44, 245, 103, 11, 44, - 194, 216, 11, 44, 217, 186, 11, 44, 224, 209, 222, 52, 1, 249, 145, 222, - 52, 1, 161, 222, 52, 1, 213, 6, 222, 52, 1, 240, 136, 222, 52, 1, 189, - 222, 52, 1, 202, 233, 222, 52, 1, 234, 123, 222, 52, 1, 155, 222, 52, 1, - 224, 146, 222, 52, 1, 225, 214, 222, 52, 1, 247, 174, 222, 52, 1, 247, - 16, 222, 52, 1, 237, 156, 222, 52, 1, 201, 113, 222, 52, 1, 201, 103, - 222, 52, 1, 166, 222, 52, 1, 176, 222, 52, 1, 172, 222, 52, 1, 183, 222, - 52, 1, 195, 74, 222, 52, 1, 195, 115, 222, 52, 1, 217, 71, 222, 52, 1, - 142, 222, 52, 1, 196, 208, 222, 52, 1, 232, 80, 222, 52, 1, 235, 239, - 222, 52, 1, 197, 166, 222, 52, 1, 207, 50, 222, 52, 1, 164, 222, 52, 1, - 233, 230, 222, 52, 1, 63, 222, 52, 1, 251, 245, 222, 52, 1, 69, 222, 52, - 1, 236, 116, 222, 52, 1, 68, 222, 52, 1, 72, 222, 52, 1, 66, 222, 52, 1, - 200, 99, 222, 52, 1, 200, 92, 222, 52, 1, 214, 164, 222, 52, 1, 152, 218, - 62, 202, 122, 222, 52, 1, 152, 218, 1, 212, 117, 222, 52, 1, 152, 218, - 62, 240, 245, 222, 52, 1, 152, 218, 62, 248, 116, 222, 52, 1, 152, 218, - 62, 176, 222, 52, 1, 152, 218, 62, 225, 181, 222, 52, 211, 214, 244, 159, - 222, 52, 211, 214, 234, 217, 204, 226, 54, 5, 237, 54, 54, 5, 237, 50, - 54, 5, 232, 118, 54, 5, 197, 98, 54, 5, 197, 97, 54, 5, 213, 79, 54, 5, - 248, 191, 54, 5, 248, 251, 54, 5, 219, 233, 54, 5, 223, 218, 54, 5, 219, - 110, 54, 5, 234, 61, 54, 5, 235, 182, 54, 5, 199, 113, 54, 5, 203, 48, - 54, 5, 202, 215, 54, 5, 239, 166, 54, 5, 239, 163, 54, 5, 222, 188, 54, - 5, 210, 155, 54, 5, 239, 237, 54, 5, 217, 150, 54, 5, 208, 129, 54, 5, - 206, 253, 54, 5, 195, 85, 54, 5, 195, 64, 54, 5, 247, 49, 54, 5, 225, - 191, 54, 5, 216, 155, 54, 5, 196, 66, 54, 5, 224, 200, 54, 5, 217, 44, - 54, 5, 234, 40, 54, 5, 219, 188, 54, 5, 217, 107, 54, 5, 215, 97, 54, 5, - 68, 54, 5, 226, 86, 54, 5, 232, 71, 54, 5, 232, 41, 54, 5, 197, 70, 54, - 5, 197, 52, 54, 5, 212, 220, 54, 5, 248, 189, 54, 5, 248, 184, 54, 5, - 219, 226, 54, 5, 223, 215, 54, 5, 219, 107, 54, 5, 234, 57, 54, 5, 235, - 153, 54, 5, 199, 34, 54, 5, 202, 122, 54, 5, 202, 195, 54, 5, 239, 158, - 54, 5, 239, 162, 54, 5, 222, 109, 54, 5, 210, 72, 54, 5, 239, 152, 54, 5, - 217, 144, 54, 5, 206, 112, 54, 5, 206, 223, 54, 5, 195, 33, 54, 5, 195, - 60, 54, 5, 245, 11, 54, 5, 225, 172, 54, 5, 216, 148, 54, 5, 196, 24, 54, - 5, 224, 101, 54, 5, 217, 36, 54, 5, 233, 192, 54, 5, 219, 78, 54, 5, 216, - 223, 54, 5, 215, 89, 54, 5, 63, 54, 5, 251, 106, 54, 5, 217, 66, 54, 5, - 142, 54, 5, 232, 212, 54, 5, 197, 166, 54, 5, 197, 146, 54, 5, 161, 54, - 5, 248, 197, 54, 5, 249, 145, 54, 5, 219, 241, 54, 5, 223, 223, 54, 5, - 223, 221, 54, 5, 219, 114, 54, 5, 234, 65, 54, 5, 235, 239, 54, 5, 199, - 152, 54, 5, 189, 54, 5, 202, 233, 54, 5, 239, 176, 54, 5, 239, 165, 54, - 5, 172, 54, 5, 169, 54, 5, 240, 136, 54, 5, 217, 159, 54, 5, 183, 54, 5, - 207, 50, 54, 5, 195, 115, 54, 5, 195, 74, 54, 5, 247, 174, 54, 5, 225, - 214, 54, 5, 216, 164, 54, 5, 164, 54, 5, 155, 54, 5, 225, 17, 54, 5, 217, - 50, 54, 5, 234, 123, 54, 5, 166, 54, 5, 176, 54, 5, 215, 109, 54, 5, 214, - 102, 54, 5, 214, 97, 54, 5, 231, 166, 54, 5, 197, 15, 54, 5, 197, 11, 54, - 5, 212, 91, 54, 5, 248, 187, 54, 5, 248, 103, 54, 5, 219, 221, 54, 5, - 223, 213, 54, 5, 219, 103, 54, 5, 234, 53, 54, 5, 235, 40, 54, 5, 198, - 233, 54, 5, 201, 247, 54, 5, 202, 164, 54, 5, 239, 155, 54, 5, 239, 160, - 54, 5, 221, 229, 54, 5, 209, 206, 54, 5, 239, 3, 54, 5, 217, 131, 54, 5, - 205, 171, 54, 5, 206, 190, 54, 5, 195, 8, 54, 5, 195, 55, 54, 5, 241, - 117, 54, 5, 225, 119, 54, 5, 216, 138, 54, 5, 195, 237, 54, 5, 223, 242, - 54, 5, 217, 34, 54, 5, 233, 132, 54, 5, 218, 195, 54, 5, 216, 33, 54, 5, - 215, 70, 54, 5, 66, 54, 5, 200, 72, 54, 5, 231, 75, 54, 5, 231, 59, 54, - 5, 196, 243, 54, 5, 196, 236, 54, 5, 211, 227, 54, 5, 248, 186, 54, 5, - 248, 21, 54, 5, 219, 220, 54, 5, 223, 211, 54, 5, 219, 102, 54, 5, 234, - 52, 54, 5, 234, 223, 54, 5, 197, 220, 54, 5, 201, 40, 54, 5, 202, 142, - 54, 5, 239, 153, 54, 5, 239, 159, 54, 5, 221, 191, 54, 5, 209, 140, 54, - 5, 237, 201, 54, 5, 217, 126, 54, 5, 204, 172, 54, 5, 206, 151, 54, 5, - 194, 255, 54, 5, 195, 51, 54, 5, 241, 41, 54, 5, 225, 110, 54, 5, 216, - 134, 54, 5, 195, 217, 54, 5, 223, 187, 54, 5, 217, 33, 54, 5, 233, 76, - 54, 5, 218, 145, 54, 5, 215, 186, 54, 5, 215, 66, 54, 5, 72, 54, 5, 214, - 119, 54, 5, 216, 248, 54, 5, 231, 193, 54, 5, 231, 169, 54, 5, 197, 34, - 54, 5, 197, 16, 54, 5, 212, 117, 54, 5, 248, 188, 54, 5, 248, 116, 54, 5, - 219, 222, 54, 5, 223, 214, 54, 5, 219, 105, 54, 5, 234, 55, 54, 5, 234, - 54, 54, 5, 235, 51, 54, 5, 198, 248, 54, 5, 149, 54, 5, 202, 169, 54, 5, - 239, 156, 54, 5, 239, 161, 54, 5, 222, 7, 54, 5, 209, 232, 54, 5, 239, - 28, 54, 5, 217, 135, 54, 5, 205, 200, 54, 5, 206, 198, 54, 5, 195, 11, - 54, 5, 195, 57, 54, 5, 244, 182, 54, 5, 225, 129, 54, 5, 216, 139, 54, 5, - 196, 3, 54, 5, 224, 11, 54, 5, 217, 35, 54, 5, 233, 144, 54, 5, 218, 251, - 54, 5, 216, 50, 54, 5, 215, 73, 54, 5, 69, 54, 5, 236, 230, 54, 5, 217, - 55, 54, 5, 232, 147, 54, 5, 232, 101, 54, 5, 197, 109, 54, 5, 197, 92, - 54, 5, 213, 92, 54, 5, 248, 192, 54, 5, 249, 9, 54, 5, 219, 234, 54, 5, - 223, 219, 54, 5, 223, 217, 54, 5, 219, 111, 54, 5, 234, 62, 54, 5, 234, - 60, 54, 5, 235, 189, 54, 5, 199, 118, 54, 5, 203, 68, 54, 5, 202, 217, - 54, 5, 239, 167, 54, 5, 239, 164, 54, 5, 222, 197, 54, 5, 210, 183, 54, - 5, 239, 252, 54, 5, 217, 151, 54, 5, 208, 147, 54, 5, 206, 255, 54, 5, - 195, 88, 54, 5, 195, 65, 54, 5, 247, 57, 54, 5, 225, 193, 54, 5, 216, - 157, 54, 5, 196, 69, 54, 5, 224, 209, 54, 5, 217, 45, 54, 5, 217, 41, 54, - 5, 234, 48, 54, 5, 234, 34, 54, 5, 219, 207, 54, 5, 217, 118, 54, 5, 215, - 98, 54, 5, 217, 73, 54, 5, 222, 150, 54, 244, 159, 54, 234, 217, 204, - 226, 54, 211, 79, 78, 54, 5, 217, 134, 235, 239, 54, 5, 217, 134, 155, - 54, 5, 217, 134, 205, 171, 54, 16, 235, 178, 54, 16, 224, 198, 54, 16, - 202, 72, 54, 16, 216, 190, 54, 16, 249, 87, 54, 16, 235, 238, 54, 16, - 203, 162, 54, 16, 240, 86, 54, 16, 239, 2, 54, 16, 223, 164, 54, 16, 201, - 251, 54, 16, 239, 27, 54, 16, 225, 120, 54, 17, 195, 79, 54, 17, 100, 54, - 17, 102, 54, 17, 134, 54, 17, 136, 54, 17, 146, 54, 17, 167, 54, 17, 178, - 54, 17, 171, 54, 17, 182, 54, 5, 217, 134, 166, 54, 5, 217, 134, 239, 28, - 40, 6, 1, 195, 83, 40, 4, 1, 195, 83, 40, 6, 1, 237, 151, 40, 4, 1, 237, - 151, 40, 6, 1, 210, 89, 237, 153, 40, 4, 1, 210, 89, 237, 153, 40, 6, 1, - 226, 7, 40, 4, 1, 226, 7, 40, 6, 1, 239, 45, 40, 4, 1, 239, 45, 40, 6, 1, - 218, 203, 200, 87, 40, 4, 1, 218, 203, 200, 87, 40, 6, 1, 248, 35, 214, - 124, 40, 4, 1, 248, 35, 214, 124, 40, 6, 1, 217, 85, 196, 51, 40, 4, 1, - 217, 85, 196, 51, 40, 6, 1, 196, 48, 3, 249, 139, 196, 51, 40, 4, 1, 196, - 48, 3, 249, 139, 196, 51, 40, 6, 1, 226, 5, 196, 84, 40, 4, 1, 226, 5, - 196, 84, 40, 6, 1, 210, 89, 195, 217, 40, 4, 1, 210, 89, 195, 217, 40, 6, - 1, 226, 5, 63, 40, 4, 1, 226, 5, 63, 40, 6, 1, 244, 203, 222, 47, 195, - 182, 40, 4, 1, 244, 203, 222, 47, 195, 182, 40, 6, 1, 248, 128, 195, 182, - 40, 4, 1, 248, 128, 195, 182, 40, 6, 1, 226, 5, 244, 203, 222, 47, 195, - 182, 40, 4, 1, 226, 5, 244, 203, 222, 47, 195, 182, 40, 6, 1, 196, 5, 40, - 4, 1, 196, 5, 40, 6, 1, 210, 89, 201, 107, 40, 4, 1, 210, 89, 201, 107, - 40, 6, 1, 205, 186, 239, 252, 40, 4, 1, 205, 186, 239, 252, 40, 6, 1, - 205, 186, 237, 7, 40, 4, 1, 205, 186, 237, 7, 40, 6, 1, 205, 186, 236, - 241, 40, 4, 1, 205, 186, 236, 241, 40, 6, 1, 218, 207, 72, 40, 4, 1, 218, - 207, 72, 40, 6, 1, 248, 160, 72, 40, 4, 1, 248, 160, 72, 40, 6, 1, 52, - 218, 207, 72, 40, 4, 1, 52, 218, 207, 72, 40, 1, 218, 121, 72, 38, 40, - 197, 201, 38, 40, 203, 24, 219, 27, 55, 38, 40, 231, 58, 219, 27, 55, 38, - 40, 202, 159, 219, 27, 55, 205, 246, 250, 179, 38, 40, 1, 200, 84, 226, - 147, 38, 40, 1, 68, 38, 40, 1, 196, 24, 38, 40, 1, 66, 38, 40, 1, 232, - 173, 55, 38, 40, 1, 196, 47, 38, 40, 1, 205, 186, 55, 38, 40, 1, 214, - 124, 38, 40, 224, 221, 38, 40, 213, 99, 40, 224, 221, 40, 213, 99, 40, 6, - 1, 237, 166, 40, 4, 1, 237, 166, 40, 6, 1, 237, 142, 40, 4, 1, 237, 142, - 40, 6, 1, 195, 41, 40, 4, 1, 195, 41, 40, 6, 1, 247, 73, 40, 4, 1, 247, - 73, 40, 6, 1, 237, 138, 40, 4, 1, 237, 138, 40, 6, 1, 203, 69, 3, 112, - 122, 40, 4, 1, 203, 69, 3, 112, 122, 40, 6, 1, 200, 243, 40, 4, 1, 200, - 243, 40, 6, 1, 201, 82, 40, 4, 1, 201, 82, 40, 6, 1, 201, 87, 40, 4, 1, - 201, 87, 40, 6, 1, 203, 74, 40, 4, 1, 203, 74, 40, 6, 1, 231, 40, 40, 4, - 1, 231, 40, 40, 6, 1, 206, 127, 40, 4, 1, 206, 127, 40, 6, 1, 52, 72, 40, - 4, 1, 52, 72, 40, 6, 1, 241, 59, 72, 40, 4, 1, 241, 59, 72, 73, 1, 40, - 232, 173, 55, 73, 1, 40, 205, 186, 55, 38, 40, 1, 237, 47, 38, 40, 1, - 226, 5, 69, 25, 1, 63, 25, 1, 155, 25, 1, 66, 25, 1, 223, 187, 25, 1, - 237, 54, 25, 1, 210, 155, 25, 1, 203, 145, 25, 1, 72, 25, 1, 215, 89, 25, - 1, 68, 25, 1, 172, 25, 1, 161, 25, 1, 210, 9, 25, 1, 210, 57, 25, 1, 222, - 187, 25, 1, 219, 187, 25, 1, 203, 162, 25, 1, 217, 157, 25, 1, 216, 162, - 25, 1, 221, 136, 25, 1, 204, 74, 25, 1, 218, 145, 25, 1, 206, 218, 25, 1, - 206, 112, 25, 1, 206, 228, 25, 1, 207, 72, 25, 1, 223, 106, 25, 1, 224, - 172, 25, 1, 215, 154, 25, 1, 215, 186, 25, 1, 216, 133, 25, 1, 195, 234, - 25, 1, 206, 151, 25, 1, 195, 186, 25, 1, 164, 25, 1, 215, 223, 25, 1, - 224, 158, 25, 1, 213, 10, 25, 1, 216, 155, 25, 1, 215, 203, 25, 1, 211, - 218, 25, 1, 196, 240, 25, 1, 213, 79, 25, 1, 235, 182, 25, 1, 209, 140, - 25, 1, 221, 191, 25, 1, 219, 78, 25, 1, 216, 223, 25, 1, 210, 91, 25, 1, - 210, 229, 25, 1, 224, 182, 25, 1, 216, 255, 25, 1, 217, 50, 25, 1, 217, - 71, 25, 1, 206, 198, 25, 1, 211, 223, 25, 1, 234, 223, 25, 1, 235, 44, - 25, 1, 197, 166, 25, 1, 176, 25, 1, 222, 109, 25, 1, 212, 220, 25, 1, - 221, 221, 25, 1, 224, 11, 25, 1, 219, 231, 25, 1, 210, 126, 25, 1, 219, - 164, 25, 1, 166, 25, 1, 202, 122, 25, 1, 224, 101, 25, 1, 218, 251, 25, - 1, 219, 239, 25, 1, 203, 1, 25, 1, 223, 223, 25, 1, 203, 23, 25, 1, 215, - 189, 25, 1, 208, 227, 25, 1, 235, 235, 25, 1, 223, 226, 25, 1, 224, 2, - 25, 38, 117, 223, 235, 25, 38, 117, 201, 25, 25, 216, 161, 25, 234, 217, - 204, 226, 25, 244, 168, 25, 244, 159, 25, 207, 105, 25, 211, 79, 78, 73, - 1, 245, 61, 152, 196, 13, 212, 171, 73, 1, 245, 61, 152, 196, 96, 212, - 171, 73, 1, 245, 61, 152, 196, 13, 207, 23, 73, 1, 245, 61, 152, 196, 96, - 207, 23, 73, 1, 245, 61, 152, 196, 13, 211, 97, 73, 1, 245, 61, 152, 196, - 96, 211, 97, 73, 1, 245, 61, 152, 196, 13, 209, 140, 73, 1, 245, 61, 152, - 196, 96, 209, 140, 73, 1, 236, 74, 237, 250, 152, 154, 73, 1, 130, 237, - 250, 152, 154, 73, 1, 219, 65, 237, 250, 152, 154, 73, 1, 126, 237, 250, - 152, 154, 73, 1, 236, 73, 237, 250, 152, 154, 73, 1, 236, 74, 237, 250, - 222, 176, 152, 154, 73, 1, 130, 237, 250, 222, 176, 152, 154, 73, 1, 219, - 65, 237, 250, 222, 176, 152, 154, 73, 1, 126, 237, 250, 222, 176, 152, - 154, 73, 1, 236, 73, 237, 250, 222, 176, 152, 154, 73, 1, 236, 74, 222, - 176, 152, 154, 73, 1, 130, 222, 176, 152, 154, 73, 1, 219, 65, 222, 176, - 152, 154, 73, 1, 126, 222, 176, 152, 154, 73, 1, 236, 73, 222, 176, 152, - 154, 73, 1, 76, 83, 154, 73, 1, 76, 205, 248, 73, 1, 76, 231, 155, 154, - 73, 1, 221, 203, 53, 241, 102, 251, 90, 73, 1, 210, 215, 124, 51, 73, 1, - 210, 215, 135, 51, 73, 1, 210, 215, 236, 90, 78, 73, 1, 210, 215, 226, - 17, 236, 90, 78, 73, 1, 126, 226, 17, 236, 90, 78, 73, 1, 204, 206, 26, - 130, 202, 11, 73, 1, 204, 206, 26, 126, 202, 11, 8, 6, 1, 237, 42, 251, - 164, 8, 4, 1, 237, 42, 251, 164, 8, 6, 1, 237, 42, 251, 194, 8, 4, 1, - 237, 42, 251, 194, 8, 6, 1, 232, 99, 8, 4, 1, 232, 99, 8, 6, 1, 200, 187, - 8, 4, 1, 200, 187, 8, 6, 1, 201, 184, 8, 4, 1, 201, 184, 8, 6, 1, 241, - 38, 8, 4, 1, 241, 38, 8, 6, 1, 241, 39, 3, 244, 159, 8, 4, 1, 241, 39, 3, - 244, 159, 8, 1, 4, 6, 236, 49, 8, 1, 4, 6, 209, 80, 8, 6, 1, 252, 168, 8, - 4, 1, 252, 168, 8, 6, 1, 251, 49, 8, 4, 1, 251, 49, 8, 6, 1, 250, 150, 8, - 4, 1, 250, 150, 8, 6, 1, 250, 133, 8, 4, 1, 250, 133, 8, 6, 1, 250, 134, - 3, 231, 155, 154, 8, 4, 1, 250, 134, 3, 231, 155, 154, 8, 6, 1, 250, 122, - 8, 4, 1, 250, 122, 8, 6, 1, 210, 89, 247, 208, 3, 238, 253, 8, 4, 1, 210, - 89, 247, 208, 3, 238, 253, 8, 6, 1, 225, 81, 3, 106, 8, 4, 1, 225, 81, 3, - 106, 8, 6, 1, 225, 81, 3, 239, 147, 106, 8, 4, 1, 225, 81, 3, 239, 147, - 106, 8, 6, 1, 225, 81, 3, 204, 196, 26, 239, 147, 106, 8, 4, 1, 225, 81, - 3, 204, 196, 26, 239, 147, 106, 8, 6, 1, 248, 33, 159, 8, 4, 1, 248, 33, - 159, 8, 6, 1, 223, 100, 3, 130, 106, 8, 4, 1, 223, 100, 3, 130, 106, 8, - 6, 1, 177, 3, 181, 204, 196, 214, 20, 8, 4, 1, 177, 3, 181, 204, 196, - 214, 20, 8, 6, 1, 177, 3, 221, 225, 8, 4, 1, 177, 3, 221, 225, 8, 6, 1, - 214, 102, 8, 4, 1, 214, 102, 8, 6, 1, 214, 4, 3, 204, 196, 202, 145, 239, - 195, 8, 4, 1, 214, 4, 3, 204, 196, 202, 145, 239, 195, 8, 6, 1, 214, 4, - 3, 235, 64, 8, 4, 1, 214, 4, 3, 235, 64, 8, 6, 1, 214, 4, 3, 205, 86, - 203, 135, 8, 4, 1, 214, 4, 3, 205, 86, 203, 135, 8, 6, 1, 211, 168, 3, - 204, 196, 202, 145, 239, 195, 8, 4, 1, 211, 168, 3, 204, 196, 202, 145, - 239, 195, 8, 6, 1, 211, 168, 3, 239, 147, 106, 8, 4, 1, 211, 168, 3, 239, - 147, 106, 8, 6, 1, 211, 32, 209, 188, 8, 4, 1, 211, 32, 209, 188, 8, 6, - 1, 209, 121, 209, 188, 8, 4, 1, 209, 121, 209, 188, 8, 6, 1, 199, 231, 3, - 239, 147, 106, 8, 4, 1, 199, 231, 3, 239, 147, 106, 8, 6, 1, 197, 207, 8, - 4, 1, 197, 207, 8, 6, 1, 199, 0, 195, 158, 8, 4, 1, 199, 0, 195, 158, 8, - 6, 1, 202, 163, 3, 106, 8, 4, 1, 202, 163, 3, 106, 8, 6, 1, 202, 163, 3, - 204, 196, 202, 145, 239, 195, 8, 4, 1, 202, 163, 3, 204, 196, 202, 145, - 239, 195, 8, 6, 1, 199, 107, 8, 4, 1, 199, 107, 8, 6, 1, 236, 128, 8, 4, - 1, 236, 128, 8, 6, 1, 225, 248, 8, 4, 1, 225, 248, 8, 6, 1, 241, 155, 8, - 4, 1, 241, 155, 73, 1, 200, 4, 8, 4, 1, 237, 190, 8, 4, 1, 221, 174, 8, - 4, 1, 218, 114, 8, 4, 1, 215, 145, 8, 4, 1, 209, 120, 8, 1, 4, 6, 209, - 120, 8, 4, 1, 201, 22, 8, 4, 1, 200, 79, 8, 6, 1, 226, 39, 240, 231, 8, - 4, 1, 226, 39, 240, 231, 8, 6, 1, 226, 39, 236, 49, 8, 4, 1, 226, 39, - 236, 49, 8, 6, 1, 226, 39, 234, 190, 8, 6, 1, 163, 226, 39, 234, 190, 8, - 4, 1, 163, 226, 39, 234, 190, 8, 6, 1, 163, 159, 8, 4, 1, 163, 159, 8, 6, - 1, 226, 39, 144, 8, 4, 1, 226, 39, 144, 8, 6, 1, 226, 39, 209, 80, 8, 4, - 1, 226, 39, 209, 80, 8, 6, 1, 226, 39, 203, 216, 8, 4, 1, 226, 39, 203, - 216, 73, 1, 126, 244, 241, 252, 22, 73, 1, 244, 168, 73, 1, 206, 182, - 236, 172, 55, 8, 6, 1, 208, 231, 8, 4, 1, 208, 231, 8, 6, 1, 163, 233, - 15, 8, 4, 1, 223, 100, 3, 210, 95, 231, 165, 26, 248, 225, 8, 1, 206, 55, - 238, 253, 8, 6, 1, 218, 56, 3, 239, 195, 8, 4, 1, 218, 56, 3, 239, 195, - 8, 6, 1, 247, 208, 3, 154, 8, 4, 1, 247, 208, 3, 154, 8, 4, 1, 247, 208, - 3, 213, 215, 122, 8, 4, 1, 233, 16, 3, 213, 215, 122, 8, 6, 1, 74, 3, - 235, 64, 8, 4, 1, 74, 3, 235, 64, 8, 6, 1, 236, 50, 3, 106, 8, 4, 1, 236, - 50, 3, 106, 8, 6, 1, 198, 240, 251, 245, 8, 4, 1, 198, 240, 251, 245, 8, - 6, 1, 198, 240, 214, 164, 8, 4, 1, 198, 240, 214, 164, 8, 6, 1, 198, 240, - 200, 99, 8, 4, 1, 198, 240, 200, 99, 8, 6, 1, 234, 191, 3, 214, 182, 106, - 8, 4, 1, 234, 191, 3, 214, 182, 106, 8, 6, 1, 225, 81, 3, 214, 182, 106, - 8, 4, 1, 225, 81, 3, 214, 182, 106, 8, 6, 1, 218, 56, 3, 214, 182, 106, - 8, 4, 1, 218, 56, 3, 214, 182, 106, 8, 6, 1, 211, 32, 3, 214, 182, 106, - 8, 4, 1, 211, 32, 3, 214, 182, 106, 8, 6, 1, 209, 81, 3, 214, 182, 106, - 8, 4, 1, 209, 81, 3, 214, 182, 106, 8, 6, 1, 233, 16, 3, 122, 8, 6, 1, - 210, 89, 192, 69, 8, 6, 1, 145, 234, 190, 8, 6, 1, 223, 100, 3, 248, 225, - 8, 6, 1, 4, 6, 68, 8, 1, 4, 6, 211, 167, 8, 6, 1, 163, 225, 80, 8, 6, 1, - 163, 203, 216, 8, 6, 1, 225, 218, 3, 241, 57, 8, 6, 1, 245, 75, 8, 6, 1, - 248, 206, 8, 4, 1, 248, 206, 8, 6, 1, 214, 124, 8, 4, 1, 214, 124, 8, 6, - 1, 118, 3, 106, 8, 4, 1, 118, 3, 106, 8, 6, 1, 233, 152, 63, 8, 4, 1, - 233, 152, 63, 8, 6, 1, 233, 152, 68, 8, 4, 1, 233, 152, 68, 8, 6, 1, 233, - 152, 66, 8, 4, 1, 233, 152, 66, 8, 6, 1, 251, 87, 197, 199, 8, 4, 1, 251, - 87, 197, 199, 8, 6, 1, 247, 208, 3, 213, 215, 122, 8, 6, 1, 209, 81, 3, - 122, 8, 6, 1, 195, 159, 3, 213, 215, 122, 8, 236, 177, 1, 206, 96, 68, - 73, 1, 6, 233, 16, 3, 106, 73, 1, 4, 33, 214, 164, 8, 1, 4, 6, 163, 221, - 136, 8, 236, 177, 1, 210, 89, 236, 49, 8, 236, 177, 1, 210, 89, 214, 3, - 8, 236, 177, 1, 226, 17, 221, 136, 8, 236, 177, 1, 230, 249, 221, 231, 8, - 236, 177, 1, 250, 251, 221, 136, 204, 41, 217, 232, 1, 63, 204, 41, 217, - 232, 1, 68, 204, 41, 217, 232, 2, 237, 168, 204, 41, 217, 232, 1, 66, - 204, 41, 217, 232, 1, 69, 204, 41, 217, 232, 1, 72, 204, 41, 217, 232, 2, - 232, 167, 204, 41, 217, 232, 1, 224, 11, 204, 41, 217, 232, 1, 224, 117, - 204, 41, 217, 232, 1, 233, 144, 204, 41, 217, 232, 1, 233, 202, 204, 41, - 217, 232, 2, 251, 51, 204, 41, 217, 232, 1, 244, 182, 204, 41, 217, 232, - 1, 245, 49, 204, 41, 217, 232, 1, 225, 129, 204, 41, 217, 232, 1, 225, - 174, 204, 41, 217, 232, 1, 201, 55, 204, 41, 217, 232, 1, 201, 61, 204, - 41, 217, 232, 1, 240, 11, 204, 41, 217, 232, 1, 240, 20, 204, 41, 217, - 232, 1, 149, 204, 41, 217, 232, 1, 202, 169, 204, 41, 217, 232, 1, 239, - 28, 204, 41, 217, 232, 1, 239, 156, 204, 41, 217, 232, 1, 216, 50, 204, - 41, 217, 232, 1, 212, 117, 204, 41, 217, 232, 1, 212, 234, 204, 41, 217, - 232, 1, 248, 116, 204, 41, 217, 232, 1, 248, 188, 204, 41, 217, 232, 1, - 218, 251, 204, 41, 217, 232, 1, 209, 232, 204, 41, 217, 232, 1, 222, 7, - 204, 41, 217, 232, 1, 209, 167, 204, 41, 217, 232, 1, 205, 200, 204, 41, - 217, 232, 1, 231, 193, 204, 41, 217, 232, 18, 2, 63, 204, 41, 217, 232, - 18, 2, 68, 204, 41, 217, 232, 18, 2, 66, 204, 41, 217, 232, 18, 2, 69, - 204, 41, 217, 232, 18, 2, 214, 102, 204, 41, 217, 232, 212, 112, 220, 28, - 204, 41, 217, 232, 212, 112, 220, 27, 204, 41, 217, 232, 212, 112, 220, - 26, 204, 41, 217, 232, 212, 112, 220, 25, 173, 226, 70, 191, 97, 211, 87, - 173, 226, 70, 191, 97, 232, 225, 173, 226, 70, 191, 115, 211, 85, 173, - 226, 70, 191, 97, 206, 21, 173, 226, 70, 191, 97, 237, 26, 173, 226, 70, - 191, 115, 206, 18, 173, 226, 70, 211, 88, 78, 173, 226, 70, 212, 148, 78, - 173, 226, 70, 209, 108, 78, 173, 226, 70, 211, 89, 78, 213, 2, 1, 155, - 213, 2, 1, 224, 146, 213, 2, 1, 234, 123, 213, 2, 1, 217, 71, 213, 2, 1, - 247, 174, 213, 2, 1, 247, 16, 213, 2, 1, 225, 214, 213, 2, 1, 215, 109, - 213, 2, 1, 189, 213, 2, 1, 202, 233, 213, 2, 1, 240, 136, 213, 2, 1, 176, - 213, 2, 1, 161, 213, 2, 1, 213, 6, 213, 2, 1, 249, 145, 213, 2, 1, 166, - 213, 2, 1, 201, 113, 213, 2, 1, 201, 103, 213, 2, 1, 237, 156, 213, 2, 1, - 197, 166, 213, 2, 1, 195, 74, 213, 2, 1, 195, 115, 213, 2, 1, 4, 63, 213, - 2, 1, 164, 213, 2, 1, 169, 213, 2, 1, 172, 213, 2, 1, 207, 50, 213, 2, 1, - 183, 213, 2, 1, 142, 213, 2, 1, 63, 213, 2, 1, 68, 213, 2, 1, 66, 213, 2, - 1, 69, 213, 2, 1, 72, 213, 2, 1, 211, 159, 213, 2, 1, 196, 208, 213, 2, - 1, 235, 239, 213, 2, 1, 234, 10, 213, 2, 1, 237, 54, 213, 2, 204, 152, 1, - 197, 166, 213, 2, 204, 152, 1, 164, 213, 2, 1, 201, 78, 213, 2, 1, 201, - 66, 213, 2, 1, 240, 41, 213, 2, 1, 216, 86, 213, 2, 1, 251, 131, 164, - 213, 2, 1, 198, 243, 207, 50, 213, 2, 1, 198, 244, 142, 213, 2, 1, 250, - 186, 235, 239, 213, 2, 204, 152, 1, 169, 213, 2, 204, 98, 1, 169, 213, 2, - 1, 247, 133, 213, 2, 206, 62, 232, 138, 78, 213, 2, 52, 232, 138, 78, - 213, 2, 117, 207, 42, 213, 2, 117, 52, 207, 42, 208, 188, 2, 251, 51, - 208, 188, 2, 199, 2, 208, 188, 1, 63, 208, 188, 1, 252, 168, 208, 188, 1, - 68, 208, 188, 1, 226, 120, 208, 188, 1, 66, 208, 188, 1, 199, 245, 208, - 188, 1, 110, 144, 208, 188, 1, 110, 209, 182, 208, 188, 1, 110, 159, 208, - 188, 1, 110, 222, 38, 208, 188, 1, 69, 208, 188, 1, 237, 54, 208, 188, 1, - 251, 200, 208, 188, 1, 72, 208, 188, 1, 214, 102, 208, 188, 1, 250, 150, - 208, 188, 1, 155, 208, 188, 1, 224, 146, 208, 188, 1, 234, 123, 208, 188, - 1, 233, 230, 208, 188, 1, 217, 71, 208, 188, 1, 247, 174, 208, 188, 1, - 247, 16, 208, 188, 1, 225, 214, 208, 188, 1, 225, 180, 208, 188, 1, 215, - 109, 208, 188, 1, 201, 78, 208, 188, 1, 201, 66, 208, 188, 1, 240, 41, - 208, 188, 1, 240, 25, 208, 188, 1, 216, 86, 208, 188, 1, 189, 208, 188, - 1, 202, 233, 208, 188, 1, 240, 136, 208, 188, 1, 239, 176, 208, 188, 1, - 176, 208, 188, 1, 161, 208, 188, 1, 213, 6, 208, 188, 1, 249, 145, 208, - 188, 1, 248, 197, 208, 188, 1, 166, 208, 188, 1, 164, 208, 188, 1, 169, - 208, 188, 1, 172, 208, 188, 1, 199, 152, 208, 188, 1, 207, 50, 208, 188, - 1, 205, 80, 208, 188, 1, 183, 208, 188, 1, 142, 208, 188, 1, 222, 37, - 208, 188, 108, 2, 232, 244, 208, 188, 18, 2, 252, 168, 208, 188, 18, 2, - 68, 208, 188, 18, 2, 226, 120, 208, 188, 18, 2, 66, 208, 188, 18, 2, 199, - 245, 208, 188, 18, 2, 110, 144, 208, 188, 18, 2, 110, 209, 182, 208, 188, - 18, 2, 110, 159, 208, 188, 18, 2, 110, 222, 38, 208, 188, 18, 2, 69, 208, - 188, 18, 2, 237, 54, 208, 188, 18, 2, 251, 200, 208, 188, 18, 2, 72, 208, - 188, 18, 2, 214, 102, 208, 188, 18, 2, 250, 150, 208, 188, 2, 199, 7, - 208, 188, 2, 247, 133, 208, 188, 240, 88, 208, 188, 52, 240, 88, 208, - 188, 17, 195, 79, 208, 188, 17, 100, 208, 188, 17, 102, 208, 188, 17, - 134, 208, 188, 17, 136, 208, 188, 17, 146, 208, 188, 17, 167, 208, 188, - 17, 178, 208, 188, 17, 171, 208, 188, 17, 182, 38, 101, 17, 195, 79, 38, - 101, 17, 100, 38, 101, 17, 102, 38, 101, 17, 134, 38, 101, 17, 136, 38, - 101, 17, 146, 38, 101, 17, 167, 38, 101, 17, 178, 38, 101, 17, 171, 38, - 101, 17, 182, 38, 101, 1, 63, 38, 101, 1, 66, 38, 101, 1, 155, 38, 101, - 1, 176, 38, 101, 1, 161, 38, 101, 1, 169, 38, 101, 1, 199, 34, 38, 101, - 2, 250, 132, 101, 2, 205, 147, 247, 133, 101, 2, 247, 134, 199, 7, 101, - 2, 52, 247, 134, 199, 7, 101, 2, 247, 134, 102, 101, 2, 247, 134, 134, - 101, 2, 247, 134, 250, 132, 101, 2, 211, 196, 101, 234, 87, 235, 134, - 101, 247, 110, 101, 232, 130, 101, 2, 206, 100, 101, 225, 206, 214, 127, - 101, 1, 250, 122, 101, 18, 2, 250, 122, 224, 215, 222, 110, 17, 195, 79, - 224, 215, 222, 110, 17, 100, 224, 215, 222, 110, 17, 102, 224, 215, 222, - 110, 17, 134, 224, 215, 222, 110, 17, 136, 224, 215, 222, 110, 17, 146, - 224, 215, 222, 110, 17, 167, 224, 215, 222, 110, 17, 178, 224, 215, 222, - 110, 17, 171, 224, 215, 222, 110, 17, 182, 224, 215, 222, 110, 1, 155, - 224, 215, 222, 110, 1, 224, 146, 224, 215, 222, 110, 1, 234, 123, 224, - 215, 222, 110, 1, 217, 71, 224, 215, 222, 110, 1, 183, 224, 215, 222, - 110, 1, 207, 50, 224, 215, 222, 110, 1, 195, 115, 224, 215, 222, 110, 1, - 215, 109, 224, 215, 222, 110, 1, 189, 224, 215, 222, 110, 1, 231, 79, - 224, 215, 222, 110, 1, 176, 224, 215, 222, 110, 1, 161, 224, 215, 222, - 110, 1, 213, 6, 224, 215, 222, 110, 1, 166, 224, 215, 222, 110, 1, 240, - 136, 224, 215, 222, 110, 1, 249, 145, 224, 215, 222, 110, 1, 169, 224, - 215, 222, 110, 1, 164, 224, 215, 222, 110, 1, 172, 224, 215, 222, 110, 1, - 197, 166, 224, 215, 222, 110, 1, 202, 233, 224, 215, 222, 110, 1, 142, - 224, 215, 222, 110, 1, 199, 152, 224, 215, 222, 110, 1, 247, 174, 224, - 215, 222, 110, 1, 63, 224, 215, 222, 110, 1, 214, 164, 224, 215, 222, - 110, 1, 68, 224, 215, 222, 110, 1, 214, 102, 224, 215, 222, 110, 18, 200, - 99, 224, 215, 222, 110, 18, 69, 224, 215, 222, 110, 18, 66, 224, 215, - 222, 110, 18, 237, 54, 224, 215, 222, 110, 18, 72, 224, 215, 222, 110, - 152, 212, 133, 224, 215, 222, 110, 152, 247, 149, 224, 215, 222, 110, - 152, 247, 150, 212, 133, 224, 215, 222, 110, 2, 240, 250, 224, 215, 222, - 110, 2, 206, 120, 210, 138, 1, 155, 210, 138, 1, 234, 123, 210, 138, 1, - 217, 71, 210, 138, 1, 189, 210, 138, 1, 240, 136, 210, 138, 1, 176, 210, - 138, 1, 161, 210, 138, 1, 249, 145, 210, 138, 1, 166, 210, 138, 1, 247, - 174, 210, 138, 1, 225, 214, 210, 138, 1, 215, 109, 210, 138, 1, 183, 210, - 138, 1, 169, 210, 138, 1, 172, 210, 138, 1, 164, 210, 138, 1, 197, 166, - 210, 138, 1, 142, 210, 138, 1, 219, 241, 210, 138, 1, 217, 50, 210, 138, - 1, 217, 159, 210, 138, 1, 215, 74, 210, 138, 1, 63, 210, 138, 18, 2, 68, - 210, 138, 18, 2, 66, 210, 138, 18, 2, 69, 210, 138, 18, 2, 251, 200, 210, - 138, 18, 2, 72, 210, 138, 18, 2, 250, 150, 210, 138, 18, 2, 236, 116, - 210, 138, 18, 2, 237, 82, 210, 138, 108, 2, 217, 73, 210, 138, 108, 2, - 218, 55, 210, 138, 108, 2, 144, 210, 138, 108, 2, 233, 15, 210, 138, 199, - 7, 210, 138, 208, 133, 78, 29, 137, 202, 93, 29, 137, 202, 92, 29, 137, - 202, 90, 29, 137, 202, 95, 29, 137, 210, 49, 29, 137, 210, 33, 29, 137, - 210, 28, 29, 137, 210, 30, 29, 137, 210, 46, 29, 137, 210, 39, 29, 137, - 210, 32, 29, 137, 210, 51, 29, 137, 210, 34, 29, 137, 210, 53, 29, 137, - 210, 50, 29, 137, 219, 52, 29, 137, 219, 43, 29, 137, 219, 46, 29, 137, - 212, 191, 29, 137, 212, 202, 29, 137, 212, 203, 29, 137, 205, 64, 29, - 137, 226, 133, 29, 137, 226, 140, 29, 137, 205, 75, 29, 137, 205, 62, 29, - 137, 212, 243, 29, 137, 232, 50, 29, 137, 205, 59, 225, 199, 2, 213, 169, - 225, 199, 2, 247, 54, 225, 199, 2, 222, 205, 225, 199, 2, 197, 55, 225, - 199, 1, 63, 225, 199, 1, 230, 249, 224, 219, 225, 199, 1, 68, 225, 199, - 1, 226, 120, 225, 199, 1, 66, 225, 199, 1, 213, 244, 247, 24, 225, 199, - 1, 217, 72, 222, 163, 225, 199, 1, 217, 72, 222, 164, 210, 199, 225, 199, - 1, 69, 225, 199, 1, 251, 200, 225, 199, 1, 72, 225, 199, 1, 155, 225, - 199, 1, 225, 70, 208, 201, 225, 199, 1, 225, 70, 218, 99, 225, 199, 1, - 234, 123, 225, 199, 1, 234, 124, 218, 99, 225, 199, 1, 217, 71, 225, 199, - 1, 247, 174, 225, 199, 1, 247, 175, 218, 99, 225, 199, 1, 225, 214, 225, - 199, 1, 215, 110, 218, 99, 225, 199, 1, 225, 215, 220, 85, 225, 199, 1, - 215, 109, 225, 199, 1, 201, 78, 225, 199, 1, 201, 79, 220, 85, 225, 199, - 1, 240, 41, 225, 199, 1, 240, 42, 220, 85, 225, 199, 1, 218, 1, 218, 99, - 225, 199, 1, 189, 225, 199, 1, 203, 169, 218, 99, 225, 199, 1, 240, 136, - 225, 199, 1, 240, 137, 220, 85, 225, 199, 1, 176, 225, 199, 1, 161, 225, - 199, 1, 213, 244, 218, 99, 225, 199, 1, 249, 145, 225, 199, 1, 249, 146, - 218, 99, 225, 199, 1, 166, 225, 199, 1, 164, 225, 199, 1, 169, 225, 199, - 1, 210, 252, 251, 210, 225, 199, 1, 172, 225, 199, 1, 197, 166, 225, 199, - 1, 209, 23, 218, 99, 225, 199, 1, 209, 23, 220, 85, 225, 199, 1, 183, - 225, 199, 1, 142, 225, 199, 2, 247, 55, 203, 27, 225, 199, 18, 2, 203, - 97, 225, 199, 18, 2, 202, 16, 225, 199, 18, 2, 196, 237, 225, 199, 18, 2, - 196, 238, 219, 175, 225, 199, 18, 2, 204, 121, 225, 199, 18, 2, 204, 122, - 219, 163, 225, 199, 18, 2, 203, 121, 225, 199, 18, 2, 239, 82, 218, 98, - 225, 199, 18, 2, 213, 48, 225, 199, 108, 2, 224, 175, 225, 199, 108, 2, - 213, 62, 225, 199, 108, 2, 247, 159, 225, 199, 213, 182, 225, 199, 50, - 210, 111, 225, 199, 53, 210, 111, 225, 199, 213, 232, 251, 99, 225, 199, - 213, 232, 220, 105, 225, 199, 213, 232, 221, 178, 225, 199, 213, 232, - 197, 48, 225, 199, 213, 232, 213, 183, 225, 199, 213, 232, 222, 67, 225, - 199, 213, 232, 221, 172, 225, 199, 213, 232, 252, 0, 225, 199, 213, 232, - 252, 1, 252, 0, 225, 199, 213, 232, 212, 159, 225, 199, 163, 213, 232, - 212, 159, 225, 199, 213, 178, 225, 199, 17, 195, 79, 225, 199, 17, 100, - 225, 199, 17, 102, 225, 199, 17, 134, 225, 199, 17, 136, 225, 199, 17, - 146, 225, 199, 17, 167, 225, 199, 17, 178, 225, 199, 17, 171, 225, 199, - 17, 182, 225, 199, 213, 232, 202, 59, 201, 19, 225, 199, 213, 232, 225, - 244, 75, 1, 207, 25, 233, 230, 75, 1, 207, 25, 247, 16, 75, 1, 207, 25, - 225, 180, 75, 1, 207, 25, 216, 86, 75, 1, 207, 25, 248, 197, 75, 2, 207, - 25, 208, 185, 75, 73, 1, 207, 25, 210, 156, 75, 1, 49, 223, 53, 215, 109, - 75, 1, 49, 223, 53, 235, 239, 75, 1, 49, 223, 53, 234, 123, 75, 1, 49, - 223, 53, 233, 230, 75, 1, 49, 223, 53, 225, 214, 75, 1, 49, 223, 53, 225, - 180, 75, 1, 49, 223, 53, 240, 41, 75, 1, 49, 223, 53, 240, 25, 75, 1, 49, - 223, 53, 216, 86, 75, 49, 223, 53, 17, 195, 79, 75, 49, 223, 53, 17, 100, - 75, 49, 223, 53, 17, 102, 75, 49, 223, 53, 17, 134, 75, 49, 223, 53, 17, - 136, 75, 49, 223, 53, 17, 146, 75, 49, 223, 53, 17, 167, 75, 49, 223, 53, - 17, 178, 75, 49, 223, 53, 17, 171, 75, 49, 223, 53, 17, 182, 75, 1, 49, - 223, 53, 222, 37, 75, 1, 49, 223, 53, 240, 136, 75, 1, 49, 223, 53, 239, - 176, 75, 1, 49, 223, 53, 249, 145, 75, 1, 49, 223, 53, 248, 197, 247, 9, - 1, 63, 247, 9, 1, 68, 247, 9, 1, 66, 247, 9, 1, 69, 247, 9, 1, 251, 200, - 247, 9, 1, 72, 247, 9, 1, 155, 247, 9, 1, 224, 146, 247, 9, 1, 234, 123, - 247, 9, 1, 233, 230, 247, 9, 1, 216, 236, 247, 9, 1, 217, 71, 247, 9, 1, - 247, 16, 247, 9, 1, 245, 77, 247, 9, 1, 225, 214, 247, 9, 1, 225, 180, - 247, 9, 1, 216, 225, 247, 9, 1, 216, 227, 247, 9, 1, 216, 226, 247, 9, 1, - 189, 247, 9, 1, 202, 233, 247, 9, 1, 240, 136, 247, 9, 1, 239, 176, 247, - 9, 1, 215, 152, 247, 9, 1, 176, 247, 9, 1, 240, 41, 247, 9, 1, 161, 247, - 9, 1, 212, 54, 247, 9, 1, 213, 6, 247, 9, 1, 249, 145, 247, 9, 1, 248, - 197, 247, 9, 1, 218, 133, 247, 9, 1, 166, 247, 9, 1, 249, 45, 247, 9, 1, - 164, 247, 9, 1, 169, 247, 9, 1, 172, 247, 9, 1, 199, 152, 247, 9, 1, 205, - 80, 247, 9, 1, 183, 247, 9, 1, 142, 247, 9, 18, 2, 252, 168, 247, 9, 18, - 2, 68, 247, 9, 18, 2, 226, 120, 247, 9, 18, 2, 237, 33, 247, 9, 18, 2, - 66, 247, 9, 18, 2, 214, 164, 247, 9, 18, 2, 72, 247, 9, 18, 2, 251, 200, - 247, 9, 18, 2, 250, 150, 247, 9, 18, 2, 200, 99, 247, 9, 108, 2, 164, - 247, 9, 108, 2, 169, 247, 9, 108, 2, 172, 247, 9, 108, 2, 197, 166, 247, - 9, 1, 48, 225, 80, 247, 9, 1, 48, 234, 190, 247, 9, 1, 48, 217, 73, 247, - 9, 108, 2, 48, 217, 73, 247, 9, 1, 48, 247, 18, 247, 9, 1, 48, 203, 216, - 247, 9, 1, 48, 218, 55, 247, 9, 1, 48, 214, 3, 247, 9, 1, 48, 196, 148, - 247, 9, 1, 48, 144, 247, 9, 1, 48, 159, 247, 9, 1, 48, 205, 83, 247, 9, - 108, 2, 48, 221, 136, 247, 9, 108, 2, 48, 233, 15, 247, 9, 17, 195, 79, - 247, 9, 17, 100, 247, 9, 17, 102, 247, 9, 17, 134, 247, 9, 17, 136, 247, - 9, 17, 146, 247, 9, 17, 167, 247, 9, 17, 178, 247, 9, 17, 171, 247, 9, - 17, 182, 247, 9, 211, 214, 205, 120, 247, 9, 211, 214, 240, 88, 247, 9, - 211, 214, 52, 240, 88, 247, 9, 211, 214, 201, 165, 240, 88, 75, 1, 224, - 139, 234, 123, 75, 1, 224, 139, 247, 174, 75, 1, 224, 139, 247, 16, 75, - 1, 224, 139, 225, 214, 75, 1, 224, 139, 225, 180, 75, 1, 224, 139, 215, - 109, 75, 1, 224, 139, 201, 78, 75, 1, 224, 139, 201, 66, 75, 1, 224, 139, - 240, 41, 75, 1, 224, 139, 240, 25, 75, 1, 224, 139, 239, 176, 75, 1, 224, - 139, 176, 75, 1, 224, 139, 183, 75, 1, 224, 139, 142, 75, 1, 224, 139, - 232, 80, 75, 1, 224, 139, 235, 239, 75, 73, 1, 224, 139, 210, 156, 75, 1, - 224, 139, 196, 208, 75, 1, 224, 139, 195, 115, 75, 1, 224, 139, 169, 75, - 221, 248, 224, 139, 214, 187, 75, 221, 248, 224, 139, 211, 110, 75, 221, - 248, 224, 139, 231, 248, 75, 16, 251, 186, 236, 89, 75, 16, 251, 186, - 100, 75, 16, 251, 186, 102, 75, 1, 251, 186, 169, 75, 2, 213, 165, 224, - 248, 202, 11, 75, 2, 49, 223, 53, 202, 9, 75, 2, 49, 223, 53, 202, 6, 75, - 1, 206, 128, 213, 212, 247, 16, 75, 1, 206, 128, 213, 212, 207, 50, 49, - 199, 24, 1, 126, 224, 11, 49, 199, 24, 1, 130, 224, 11, 49, 199, 24, 1, - 126, 224, 117, 49, 199, 24, 1, 130, 224, 117, 49, 199, 24, 1, 126, 224, - 126, 49, 199, 24, 1, 130, 224, 126, 49, 199, 24, 1, 126, 233, 144, 49, - 199, 24, 1, 130, 233, 144, 49, 199, 24, 1, 126, 216, 252, 49, 199, 24, 1, - 130, 216, 252, 49, 199, 24, 1, 126, 244, 182, 49, 199, 24, 1, 130, 244, - 182, 49, 199, 24, 1, 126, 245, 49, 49, 199, 24, 1, 130, 245, 49, 49, 199, - 24, 1, 126, 205, 200, 49, 199, 24, 1, 130, 205, 200, 49, 199, 24, 1, 126, - 215, 73, 49, 199, 24, 1, 130, 215, 73, 49, 199, 24, 1, 126, 239, 28, 49, - 199, 24, 1, 130, 239, 28, 49, 199, 24, 1, 126, 149, 49, 199, 24, 1, 130, - 149, 49, 199, 24, 1, 126, 202, 169, 49, 199, 24, 1, 130, 202, 169, 49, - 199, 24, 1, 126, 216, 50, 49, 199, 24, 1, 130, 216, 50, 49, 199, 24, 1, - 126, 248, 116, 49, 199, 24, 1, 130, 248, 116, 49, 199, 24, 1, 126, 212, - 117, 49, 199, 24, 1, 130, 212, 117, 49, 199, 24, 1, 126, 212, 234, 49, - 199, 24, 1, 130, 212, 234, 49, 199, 24, 1, 126, 235, 51, 49, 199, 24, 1, - 130, 235, 51, 49, 199, 24, 1, 126, 218, 251, 49, 199, 24, 1, 130, 218, - 251, 49, 199, 24, 1, 126, 196, 3, 49, 199, 24, 1, 130, 196, 3, 49, 199, - 24, 1, 126, 209, 232, 49, 199, 24, 1, 130, 209, 232, 49, 199, 24, 1, 126, - 222, 7, 49, 199, 24, 1, 130, 222, 7, 49, 199, 24, 1, 126, 198, 248, 49, - 199, 24, 1, 130, 198, 248, 49, 199, 24, 1, 126, 231, 193, 49, 199, 24, 1, - 130, 231, 193, 49, 199, 24, 1, 126, 72, 49, 199, 24, 1, 130, 72, 49, 199, - 24, 220, 82, 225, 13, 49, 199, 24, 18, 252, 168, 49, 199, 24, 18, 68, 49, - 199, 24, 18, 200, 99, 49, 199, 24, 18, 66, 49, 199, 24, 18, 69, 49, 199, - 24, 18, 72, 49, 199, 24, 220, 82, 224, 120, 49, 199, 24, 18, 230, 210, - 49, 199, 24, 18, 200, 98, 49, 199, 24, 18, 200, 114, 49, 199, 24, 18, - 250, 148, 49, 199, 24, 18, 250, 122, 49, 199, 24, 18, 251, 106, 49, 199, - 24, 18, 251, 123, 49, 199, 24, 152, 220, 82, 237, 14, 49, 199, 24, 152, - 220, 82, 215, 151, 49, 199, 24, 152, 220, 82, 202, 169, 49, 199, 24, 152, - 220, 82, 205, 173, 49, 199, 24, 16, 223, 245, 49, 199, 24, 16, 215, 151, - 49, 199, 24, 16, 208, 229, 49, 199, 24, 16, 231, 194, 231, 180, 49, 199, - 24, 16, 224, 0, 223, 255, 219, 182, 219, 248, 1, 69, 219, 182, 219, 248, - 1, 72, 219, 182, 219, 248, 1, 247, 16, 219, 182, 219, 248, 1, 215, 109, - 219, 182, 219, 248, 1, 201, 78, 219, 182, 219, 248, 1, 201, 66, 219, 182, - 219, 248, 1, 240, 41, 219, 182, 219, 248, 1, 240, 25, 219, 182, 219, 248, - 1, 216, 86, 219, 182, 219, 248, 1, 207, 50, 219, 182, 219, 248, 1, 205, - 80, 219, 182, 219, 248, 18, 2, 226, 120, 219, 182, 219, 248, 18, 2, 199, - 245, 219, 182, 219, 248, 18, 2, 252, 132, 219, 182, 219, 248, 18, 2, 250, - 150, 219, 182, 219, 248, 18, 2, 252, 124, 219, 182, 219, 248, 245, 92, - 219, 182, 219, 248, 251, 206, 224, 108, 219, 182, 219, 248, 251, 80, 219, - 182, 219, 248, 5, 210, 117, 78, 219, 182, 219, 248, 197, 9, 210, 117, 78, - 219, 182, 219, 248, 18, 2, 199, 2, 219, 182, 219, 248, 199, 7, 35, 5, - 201, 59, 35, 5, 201, 62, 35, 5, 201, 65, 35, 5, 201, 63, 35, 5, 201, 64, - 35, 5, 201, 61, 35, 5, 240, 19, 35, 5, 240, 21, 35, 5, 240, 24, 35, 5, - 240, 22, 35, 5, 240, 23, 35, 5, 240, 20, 35, 5, 237, 143, 35, 5, 237, - 147, 35, 5, 237, 155, 35, 5, 237, 152, 35, 5, 237, 153, 35, 5, 237, 144, - 35, 5, 247, 71, 35, 5, 247, 65, 35, 5, 247, 67, 35, 5, 247, 70, 35, 5, - 247, 68, 35, 5, 247, 69, 35, 5, 247, 66, 35, 5, 249, 45, 35, 5, 249, 24, - 35, 5, 249, 36, 35, 5, 249, 44, 35, 5, 249, 39, 35, 5, 249, 40, 35, 5, - 249, 28, 8, 4, 1, 249, 74, 251, 134, 8, 4, 1, 39, 210, 87, 8, 4, 1, 248, - 132, 69, 8, 4, 1, 249, 74, 69, 8, 4, 1, 237, 136, 3, 235, 64, 8, 4, 1, - 222, 149, 236, 49, 8, 4, 1, 145, 234, 191, 3, 241, 57, 8, 4, 1, 223, 100, - 3, 226, 17, 222, 204, 209, 80, 8, 4, 1, 223, 100, 3, 52, 112, 202, 84, 8, - 4, 1, 223, 100, 3, 112, 210, 2, 8, 4, 1, 221, 137, 3, 241, 57, 8, 4, 1, - 218, 56, 3, 241, 57, 8, 4, 1, 236, 216, 3, 241, 57, 8, 4, 1, 248, 132, - 72, 8, 4, 1, 248, 132, 177, 3, 106, 8, 4, 1, 192, 177, 3, 106, 8, 4, 1, - 226, 17, 214, 164, 8, 4, 1, 163, 214, 165, 3, 106, 8, 4, 1, 163, 214, - 165, 3, 231, 155, 106, 8, 4, 1, 163, 177, 214, 88, 8, 4, 1, 163, 177, - 214, 89, 3, 106, 8, 4, 1, 204, 231, 144, 8, 1, 4, 6, 211, 32, 3, 53, 222, - 172, 8, 4, 1, 211, 32, 197, 37, 232, 187, 8, 4, 1, 52, 144, 8, 4, 1, 211, - 32, 3, 241, 57, 8, 4, 1, 52, 211, 32, 3, 241, 57, 8, 4, 1, 145, 144, 8, - 4, 1, 145, 211, 32, 3, 210, 2, 8, 4, 1, 249, 64, 236, 141, 8, 4, 1, 118, - 3, 206, 182, 53, 222, 172, 8, 4, 1, 118, 249, 80, 3, 206, 182, 53, 222, - 172, 8, 4, 1, 200, 90, 8, 4, 1, 163, 200, 90, 8, 4, 1, 118, 3, 50, 122, - 8, 4, 1, 245, 75, 8, 4, 1, 245, 76, 3, 126, 53, 210, 2, 8, 4, 1, 245, 76, - 3, 126, 50, 207, 85, 8, 4, 1, 196, 223, 3, 126, 53, 210, 2, 8, 4, 1, 196, - 223, 3, 181, 50, 222, 172, 8, 4, 1, 196, 223, 3, 181, 50, 222, 173, 26, - 126, 53, 210, 2, 8, 4, 1, 196, 223, 3, 181, 50, 222, 173, 3, 207, 85, 8, - 4, 1, 196, 149, 3, 206, 182, 53, 222, 172, 73, 248, 48, 3, 226, 17, 248, - 47, 73, 1, 4, 232, 99, 73, 1, 4, 223, 100, 3, 226, 17, 222, 204, 209, 80, - 73, 1, 4, 223, 100, 3, 112, 202, 84, 73, 1, 4, 118, 3, 50, 122, 8, 4, 1, - 208, 246, 196, 84, 8, 4, 1, 226, 5, 69, 8, 4, 1, 192, 214, 164, 8, 4, 1, - 200, 41, 8, 4, 1, 226, 17, 251, 134, 32, 1, 4, 6, 214, 124, 8, 4, 1, 237, - 158, 239, 111, 3, 210, 95, 122, 8, 4, 1, 201, 115, 239, 111, 3, 210, 95, - 122, 95, 4, 1, 63, 95, 4, 1, 69, 95, 4, 1, 68, 95, 4, 1, 72, 95, 4, 1, - 66, 95, 4, 1, 199, 230, 95, 4, 1, 234, 123, 95, 4, 1, 155, 95, 4, 1, 234, - 48, 95, 4, 1, 233, 192, 95, 4, 1, 233, 144, 95, 4, 1, 233, 76, 95, 4, 1, - 233, 36, 95, 4, 1, 142, 95, 4, 1, 232, 147, 95, 4, 1, 232, 71, 95, 4, 1, - 231, 193, 95, 4, 1, 231, 75, 95, 4, 1, 231, 44, 95, 4, 1, 172, 95, 4, 1, - 222, 197, 95, 4, 1, 222, 109, 95, 4, 1, 222, 7, 95, 4, 1, 221, 191, 95, - 4, 1, 221, 160, 95, 4, 1, 166, 95, 4, 1, 219, 207, 95, 4, 1, 219, 78, 95, - 4, 1, 218, 251, 95, 4, 1, 218, 145, 95, 4, 1, 176, 95, 4, 1, 231, 217, - 95, 4, 1, 217, 231, 95, 4, 1, 217, 118, 95, 4, 1, 216, 223, 95, 4, 1, - 216, 50, 95, 4, 1, 215, 186, 95, 4, 1, 215, 120, 95, 4, 1, 211, 96, 95, - 4, 1, 211, 82, 95, 4, 1, 211, 75, 95, 4, 1, 211, 65, 95, 4, 1, 211, 54, - 95, 4, 1, 211, 52, 95, 4, 1, 183, 95, 4, 1, 209, 80, 95, 4, 1, 208, 147, - 95, 4, 1, 206, 112, 95, 4, 1, 205, 200, 95, 4, 1, 204, 172, 95, 4, 1, - 204, 72, 95, 4, 1, 240, 136, 95, 4, 1, 189, 95, 4, 1, 239, 252, 95, 4, 1, - 203, 68, 95, 4, 1, 239, 152, 95, 4, 1, 202, 122, 95, 4, 1, 239, 28, 95, - 4, 1, 237, 201, 95, 4, 1, 237, 170, 95, 4, 1, 239, 40, 95, 4, 1, 202, 47, - 95, 4, 1, 202, 46, 95, 4, 1, 202, 35, 95, 4, 1, 202, 34, 95, 4, 1, 202, - 33, 95, 4, 1, 202, 32, 95, 4, 1, 201, 113, 95, 4, 1, 201, 107, 95, 4, 1, - 201, 92, 95, 4, 1, 201, 90, 95, 4, 1, 201, 86, 95, 4, 1, 201, 85, 95, 4, - 1, 197, 166, 95, 4, 1, 197, 109, 95, 4, 1, 197, 70, 95, 4, 1, 197, 34, - 95, 4, 1, 196, 243, 95, 4, 1, 196, 230, 95, 4, 1, 164, 219, 182, 219, - 248, 1, 223, 252, 219, 182, 219, 248, 1, 208, 229, 219, 182, 219, 248, 1, - 223, 54, 219, 182, 219, 248, 1, 219, 6, 219, 182, 219, 248, 1, 161, 219, - 182, 219, 248, 1, 176, 219, 182, 219, 248, 1, 245, 67, 219, 182, 219, - 248, 1, 202, 86, 219, 182, 219, 248, 1, 224, 111, 219, 182, 219, 248, 1, - 216, 242, 219, 182, 219, 248, 1, 202, 161, 219, 182, 219, 248, 1, 197, - 154, 219, 182, 219, 248, 1, 196, 95, 219, 182, 219, 248, 1, 231, 64, 219, - 182, 219, 248, 1, 200, 72, 219, 182, 219, 248, 1, 68, 219, 182, 219, 248, - 1, 213, 0, 219, 182, 219, 248, 1, 250, 161, 219, 182, 219, 248, 1, 233, - 136, 219, 182, 219, 248, 1, 225, 178, 219, 182, 219, 248, 1, 210, 224, - 219, 182, 219, 248, 1, 249, 145, 219, 182, 219, 248, 1, 225, 162, 219, - 182, 219, 248, 1, 239, 109, 219, 182, 219, 248, 1, 233, 199, 219, 182, - 219, 248, 1, 239, 154, 219, 182, 219, 248, 1, 248, 194, 219, 182, 219, - 248, 1, 223, 253, 221, 230, 219, 182, 219, 248, 1, 223, 55, 221, 230, - 219, 182, 219, 248, 1, 219, 7, 221, 230, 219, 182, 219, 248, 1, 213, 244, - 221, 230, 219, 182, 219, 248, 1, 218, 1, 221, 230, 219, 182, 219, 248, 1, - 202, 87, 221, 230, 219, 182, 219, 248, 1, 216, 243, 221, 230, 219, 182, - 219, 248, 1, 230, 249, 221, 230, 219, 182, 219, 248, 18, 2, 214, 117, - 219, 182, 219, 248, 18, 2, 226, 84, 219, 182, 219, 248, 18, 2, 251, 104, - 219, 182, 219, 248, 18, 2, 196, 58, 219, 182, 219, 248, 18, 2, 205, 163, - 219, 182, 219, 248, 18, 2, 200, 69, 219, 182, 219, 248, 18, 2, 245, 90, - 219, 182, 219, 248, 18, 2, 215, 135, 219, 182, 219, 248, 245, 91, 219, - 182, 219, 248, 221, 175, 225, 223, 219, 182, 219, 248, 251, 19, 225, 223, - 219, 182, 219, 248, 17, 195, 79, 219, 182, 219, 248, 17, 100, 219, 182, - 219, 248, 17, 102, 219, 182, 219, 248, 17, 134, 219, 182, 219, 248, 17, - 136, 219, 182, 219, 248, 17, 146, 219, 182, 219, 248, 17, 167, 219, 182, - 219, 248, 17, 178, 219, 182, 219, 248, 17, 171, 219, 182, 219, 248, 17, - 182, 29, 225, 102, 215, 11, 29, 225, 102, 215, 16, 29, 225, 102, 195, - 252, 29, 225, 102, 195, 251, 29, 225, 102, 195, 250, 29, 225, 102, 200, - 164, 29, 225, 102, 200, 168, 29, 225, 102, 195, 211, 29, 225, 102, 195, - 207, 29, 225, 102, 236, 115, 29, 225, 102, 236, 113, 29, 225, 102, 236, - 114, 29, 225, 102, 236, 111, 29, 225, 102, 230, 235, 29, 225, 102, 230, - 234, 29, 225, 102, 230, 232, 29, 225, 102, 230, 233, 29, 225, 102, 230, - 238, 29, 225, 102, 230, 231, 29, 225, 102, 230, 230, 29, 225, 102, 230, - 240, 29, 225, 102, 251, 5, 29, 225, 102, 251, 4, 29, 116, 216, 201, 29, - 116, 216, 207, 29, 116, 205, 61, 29, 116, 205, 60, 29, 116, 202, 92, 29, - 116, 202, 90, 29, 116, 202, 89, 29, 116, 202, 95, 29, 116, 202, 96, 29, - 116, 202, 88, 29, 116, 210, 33, 29, 116, 210, 48, 29, 116, 205, 67, 29, - 116, 210, 45, 29, 116, 210, 35, 29, 116, 210, 37, 29, 116, 210, 24, 29, - 116, 210, 25, 29, 116, 224, 254, 29, 116, 219, 51, 29, 116, 219, 45, 29, - 116, 205, 71, 29, 116, 219, 48, 29, 116, 219, 54, 29, 116, 212, 187, 29, - 116, 212, 196, 29, 116, 212, 200, 29, 116, 205, 69, 29, 116, 212, 190, - 29, 116, 212, 204, 29, 116, 212, 205, 29, 116, 206, 44, 29, 116, 206, 47, - 29, 116, 205, 65, 29, 116, 205, 63, 29, 116, 206, 42, 29, 116, 206, 50, - 29, 116, 206, 51, 29, 116, 206, 36, 29, 116, 206, 49, 29, 116, 213, 172, - 29, 116, 213, 173, 29, 116, 196, 42, 29, 116, 196, 45, 29, 116, 245, 4, - 29, 116, 245, 3, 29, 116, 205, 76, 29, 116, 212, 241, 29, 116, 212, 240, - 12, 15, 228, 111, 12, 15, 228, 110, 12, 15, 228, 109, 12, 15, 228, 108, - 12, 15, 228, 107, 12, 15, 228, 106, 12, 15, 228, 105, 12, 15, 228, 104, - 12, 15, 228, 103, 12, 15, 228, 102, 12, 15, 228, 101, 12, 15, 228, 100, - 12, 15, 228, 99, 12, 15, 228, 98, 12, 15, 228, 97, 12, 15, 228, 96, 12, - 15, 228, 95, 12, 15, 228, 94, 12, 15, 228, 93, 12, 15, 228, 92, 12, 15, - 228, 91, 12, 15, 228, 90, 12, 15, 228, 89, 12, 15, 228, 88, 12, 15, 228, - 87, 12, 15, 228, 86, 12, 15, 228, 85, 12, 15, 228, 84, 12, 15, 228, 83, - 12, 15, 228, 82, 12, 15, 228, 81, 12, 15, 228, 80, 12, 15, 228, 79, 12, - 15, 228, 78, 12, 15, 228, 77, 12, 15, 228, 76, 12, 15, 228, 75, 12, 15, - 228, 74, 12, 15, 228, 73, 12, 15, 228, 72, 12, 15, 228, 71, 12, 15, 228, - 70, 12, 15, 228, 69, 12, 15, 228, 68, 12, 15, 228, 67, 12, 15, 228, 66, - 12, 15, 228, 65, 12, 15, 228, 64, 12, 15, 228, 63, 12, 15, 228, 62, 12, - 15, 228, 61, 12, 15, 228, 60, 12, 15, 228, 59, 12, 15, 228, 58, 12, 15, - 228, 57, 12, 15, 228, 56, 12, 15, 228, 55, 12, 15, 228, 54, 12, 15, 228, - 53, 12, 15, 228, 52, 12, 15, 228, 51, 12, 15, 228, 50, 12, 15, 228, 49, - 12, 15, 228, 48, 12, 15, 228, 47, 12, 15, 228, 46, 12, 15, 228, 45, 12, - 15, 228, 44, 12, 15, 228, 43, 12, 15, 228, 42, 12, 15, 228, 41, 12, 15, - 228, 40, 12, 15, 228, 39, 12, 15, 228, 38, 12, 15, 228, 37, 12, 15, 228, - 36, 12, 15, 228, 35, 12, 15, 228, 34, 12, 15, 228, 33, 12, 15, 228, 32, - 12, 15, 228, 31, 12, 15, 228, 30, 12, 15, 228, 29, 12, 15, 228, 28, 12, - 15, 228, 27, 12, 15, 228, 26, 12, 15, 228, 25, 12, 15, 228, 24, 12, 15, - 228, 23, 12, 15, 228, 22, 12, 15, 228, 21, 12, 15, 228, 20, 12, 15, 228, - 19, 12, 15, 228, 18, 12, 15, 228, 17, 12, 15, 228, 16, 12, 15, 228, 15, - 12, 15, 228, 14, 12, 15, 228, 13, 12, 15, 228, 12, 12, 15, 228, 11, 12, - 15, 228, 10, 12, 15, 228, 9, 12, 15, 228, 8, 12, 15, 228, 7, 12, 15, 228, - 6, 12, 15, 228, 5, 12, 15, 228, 4, 12, 15, 228, 3, 12, 15, 228, 2, 12, - 15, 228, 1, 12, 15, 228, 0, 12, 15, 227, 255, 12, 15, 227, 254, 12, 15, - 227, 253, 12, 15, 227, 252, 12, 15, 227, 251, 12, 15, 227, 250, 12, 15, - 227, 249, 12, 15, 227, 248, 12, 15, 227, 247, 12, 15, 227, 246, 12, 15, - 227, 245, 12, 15, 227, 244, 12, 15, 227, 243, 12, 15, 227, 242, 12, 15, - 227, 241, 12, 15, 227, 240, 12, 15, 227, 239, 12, 15, 227, 238, 12, 15, - 227, 237, 12, 15, 227, 236, 12, 15, 227, 235, 12, 15, 227, 234, 12, 15, - 227, 233, 12, 15, 227, 232, 12, 15, 227, 231, 12, 15, 227, 230, 12, 15, - 227, 229, 12, 15, 227, 228, 12, 15, 227, 227, 12, 15, 227, 226, 12, 15, - 227, 225, 12, 15, 227, 224, 12, 15, 227, 223, 12, 15, 227, 222, 12, 15, - 227, 221, 12, 15, 227, 220, 12, 15, 227, 219, 12, 15, 227, 218, 12, 15, - 227, 217, 12, 15, 227, 216, 12, 15, 227, 215, 12, 15, 227, 214, 12, 15, - 227, 213, 12, 15, 227, 212, 12, 15, 227, 211, 12, 15, 227, 210, 12, 15, - 227, 209, 12, 15, 227, 208, 12, 15, 227, 207, 12, 15, 227, 206, 12, 15, - 227, 205, 12, 15, 227, 204, 12, 15, 227, 203, 12, 15, 227, 202, 12, 15, - 227, 201, 12, 15, 227, 200, 12, 15, 227, 199, 12, 15, 227, 198, 12, 15, - 227, 197, 12, 15, 227, 196, 12, 15, 227, 195, 12, 15, 227, 194, 12, 15, - 227, 193, 12, 15, 227, 192, 12, 15, 227, 191, 12, 15, 227, 190, 12, 15, - 227, 189, 12, 15, 227, 188, 12, 15, 227, 187, 12, 15, 227, 186, 12, 15, - 227, 185, 12, 15, 227, 184, 12, 15, 227, 183, 12, 15, 227, 182, 12, 15, - 227, 181, 12, 15, 227, 180, 12, 15, 227, 179, 12, 15, 227, 178, 12, 15, - 227, 177, 12, 15, 227, 176, 12, 15, 227, 175, 12, 15, 227, 174, 12, 15, - 227, 173, 12, 15, 227, 172, 12, 15, 227, 171, 12, 15, 227, 170, 12, 15, - 227, 169, 12, 15, 227, 168, 12, 15, 227, 167, 12, 15, 227, 166, 12, 15, - 227, 165, 12, 15, 227, 164, 12, 15, 227, 163, 12, 15, 227, 162, 12, 15, - 227, 161, 12, 15, 227, 160, 12, 15, 227, 159, 12, 15, 227, 158, 12, 15, - 227, 157, 12, 15, 227, 156, 12, 15, 227, 155, 12, 15, 227, 154, 12, 15, - 227, 153, 12, 15, 227, 152, 12, 15, 227, 151, 12, 15, 227, 150, 12, 15, - 227, 149, 12, 15, 227, 148, 12, 15, 227, 147, 12, 15, 227, 146, 12, 15, - 227, 145, 12, 15, 227, 144, 12, 15, 227, 143, 12, 15, 227, 142, 12, 15, - 227, 141, 12, 15, 227, 140, 12, 15, 227, 139, 12, 15, 227, 138, 12, 15, - 227, 137, 12, 15, 227, 136, 12, 15, 227, 135, 12, 15, 227, 134, 12, 15, - 227, 133, 12, 15, 227, 132, 12, 15, 227, 131, 12, 15, 227, 130, 12, 15, - 227, 129, 12, 15, 227, 128, 12, 15, 227, 127, 12, 15, 227, 126, 12, 15, - 227, 125, 12, 15, 227, 124, 12, 15, 227, 123, 12, 15, 227, 122, 12, 15, - 227, 121, 12, 15, 227, 120, 12, 15, 227, 119, 12, 15, 227, 118, 12, 15, - 227, 117, 12, 15, 227, 116, 12, 15, 227, 115, 12, 15, 227, 114, 12, 15, - 227, 113, 12, 15, 227, 112, 12, 15, 227, 111, 12, 15, 227, 110, 12, 15, - 227, 109, 12, 15, 227, 108, 12, 15, 227, 107, 12, 15, 227, 106, 12, 15, - 227, 105, 12, 15, 227, 104, 12, 15, 227, 103, 12, 15, 227, 102, 12, 15, - 227, 101, 12, 15, 227, 100, 12, 15, 227, 99, 12, 15, 227, 98, 12, 15, - 227, 97, 12, 15, 227, 96, 12, 15, 227, 95, 12, 15, 227, 94, 12, 15, 227, - 93, 12, 15, 227, 92, 12, 15, 227, 91, 12, 15, 227, 90, 12, 15, 227, 89, - 12, 15, 227, 88, 12, 15, 227, 87, 12, 15, 227, 86, 12, 15, 227, 85, 12, - 15, 227, 84, 12, 15, 227, 83, 12, 15, 227, 82, 12, 15, 227, 81, 12, 15, - 227, 80, 12, 15, 227, 79, 12, 15, 227, 78, 12, 15, 227, 77, 12, 15, 227, - 76, 12, 15, 227, 75, 12, 15, 227, 74, 12, 15, 227, 73, 12, 15, 227, 72, - 12, 15, 227, 71, 12, 15, 227, 70, 12, 15, 227, 69, 12, 15, 227, 68, 12, - 15, 227, 67, 12, 15, 227, 66, 12, 15, 227, 65, 12, 15, 227, 64, 12, 15, - 227, 63, 12, 15, 227, 62, 12, 15, 227, 61, 12, 15, 227, 60, 12, 15, 227, - 59, 12, 15, 227, 58, 12, 15, 227, 57, 12, 15, 227, 56, 12, 15, 227, 55, - 12, 15, 227, 54, 12, 15, 227, 53, 12, 15, 227, 52, 12, 15, 227, 51, 12, - 15, 227, 50, 12, 15, 227, 49, 12, 15, 227, 48, 12, 15, 227, 47, 12, 15, - 227, 46, 12, 15, 227, 45, 12, 15, 227, 44, 12, 15, 227, 43, 12, 15, 227, - 42, 12, 15, 227, 41, 12, 15, 227, 40, 12, 15, 227, 39, 12, 15, 227, 38, - 12, 15, 227, 37, 12, 15, 227, 36, 12, 15, 227, 35, 12, 15, 227, 34, 12, - 15, 227, 33, 12, 15, 227, 32, 12, 15, 227, 31, 12, 15, 227, 30, 12, 15, - 227, 29, 12, 15, 227, 28, 12, 15, 227, 27, 12, 15, 227, 26, 12, 15, 227, - 25, 12, 15, 227, 24, 12, 15, 227, 23, 12, 15, 227, 22, 12, 15, 227, 21, - 12, 15, 227, 20, 12, 15, 227, 19, 12, 15, 227, 18, 12, 15, 227, 17, 12, - 15, 227, 16, 12, 15, 227, 15, 12, 15, 227, 14, 12, 15, 227, 13, 12, 15, - 227, 12, 12, 15, 227, 11, 12, 15, 227, 10, 12, 15, 227, 9, 12, 15, 227, - 8, 12, 15, 227, 7, 12, 15, 227, 6, 12, 15, 227, 5, 12, 15, 227, 4, 12, - 15, 227, 3, 12, 15, 227, 2, 12, 15, 227, 1, 12, 15, 227, 0, 12, 15, 226, - 255, 12, 15, 226, 254, 12, 15, 226, 253, 12, 15, 226, 252, 12, 15, 226, - 251, 12, 15, 226, 250, 12, 15, 226, 249, 12, 15, 226, 248, 12, 15, 226, - 247, 12, 15, 226, 246, 12, 15, 226, 245, 12, 15, 226, 244, 12, 15, 226, - 243, 12, 15, 226, 242, 12, 15, 226, 241, 12, 15, 226, 240, 12, 15, 226, - 239, 12, 15, 226, 238, 12, 15, 226, 237, 12, 15, 226, 236, 12, 15, 226, - 235, 12, 15, 226, 234, 12, 15, 226, 233, 12, 15, 226, 232, 12, 15, 226, - 231, 12, 15, 226, 230, 12, 15, 226, 229, 12, 15, 226, 228, 12, 15, 226, - 227, 12, 15, 226, 226, 12, 15, 226, 225, 12, 15, 226, 224, 12, 15, 226, - 223, 12, 15, 226, 222, 12, 15, 226, 221, 12, 15, 226, 220, 12, 15, 226, - 219, 12, 15, 226, 218, 12, 15, 226, 217, 12, 15, 226, 216, 12, 15, 226, - 215, 12, 15, 226, 214, 12, 15, 226, 213, 12, 15, 226, 212, 12, 15, 226, - 211, 12, 15, 226, 210, 12, 15, 226, 209, 12, 15, 226, 208, 12, 15, 226, - 207, 12, 15, 226, 206, 12, 15, 226, 205, 12, 15, 226, 204, 12, 15, 226, - 203, 12, 15, 226, 202, 12, 15, 226, 201, 12, 15, 226, 200, 12, 15, 226, - 199, 12, 15, 226, 198, 12, 15, 226, 197, 12, 15, 226, 196, 12, 15, 226, - 195, 12, 15, 226, 194, 12, 15, 226, 193, 12, 15, 226, 192, 12, 15, 226, - 191, 12, 15, 226, 190, 12, 15, 226, 189, 12, 15, 226, 188, 12, 15, 226, - 187, 12, 15, 226, 186, 12, 15, 226, 185, 12, 15, 226, 184, 12, 15, 226, - 183, 12, 15, 226, 182, 12, 15, 226, 181, 12, 15, 226, 180, 12, 15, 226, - 179, 12, 15, 226, 178, 12, 15, 226, 177, 12, 15, 226, 176, 12, 15, 226, - 175, 12, 15, 226, 174, 12, 15, 226, 173, 12, 15, 226, 172, 12, 15, 226, - 171, 12, 15, 226, 170, 12, 15, 226, 169, 12, 15, 226, 168, 12, 15, 226, - 167, 12, 15, 226, 166, 12, 15, 226, 165, 12, 15, 226, 164, 12, 15, 226, - 163, 12, 15, 226, 162, 12, 15, 226, 161, 12, 15, 226, 160, 12, 15, 226, - 159, 12, 15, 226, 158, 12, 15, 226, 157, 12, 15, 226, 156, 12, 15, 226, - 155, 12, 15, 226, 154, 12, 15, 226, 153, 12, 15, 226, 152, 8, 4, 33, 235, - 157, 8, 4, 33, 235, 153, 8, 4, 33, 235, 96, 8, 4, 33, 235, 156, 8, 4, 33, - 235, 155, 8, 4, 33, 181, 209, 81, 203, 216, 8, 4, 33, 205, 23, 250, 230, - 4, 33, 219, 165, 216, 4, 250, 230, 4, 33, 219, 165, 237, 60, 250, 230, 4, - 33, 219, 165, 226, 55, 250, 230, 4, 33, 199, 40, 216, 4, 250, 230, 4, 33, - 219, 165, 196, 200, 123, 1, 195, 242, 3, 232, 33, 123, 212, 111, 225, - 109, 199, 130, 123, 33, 196, 22, 195, 242, 195, 242, 213, 115, 123, 1, - 251, 126, 250, 117, 123, 1, 197, 62, 251, 164, 123, 1, 197, 62, 240, 101, - 123, 1, 197, 62, 232, 147, 123, 1, 197, 62, 225, 35, 123, 1, 197, 62, - 222, 241, 123, 1, 197, 62, 48, 219, 171, 123, 1, 197, 62, 210, 109, 123, - 1, 197, 62, 203, 85, 123, 1, 251, 126, 98, 55, 123, 1, 206, 212, 3, 206, - 212, 238, 253, 123, 1, 206, 212, 3, 206, 66, 238, 253, 123, 1, 206, 212, - 3, 240, 121, 26, 206, 212, 238, 253, 123, 1, 206, 212, 3, 240, 121, 26, - 206, 66, 238, 253, 123, 1, 151, 3, 213, 115, 123, 1, 151, 3, 211, 147, - 123, 1, 151, 3, 220, 42, 123, 1, 248, 209, 3, 240, 120, 123, 1, 233, 178, - 3, 240, 120, 123, 1, 240, 102, 3, 240, 120, 123, 1, 232, 148, 3, 220, 42, - 123, 1, 199, 123, 3, 240, 120, 123, 1, 195, 93, 3, 240, 120, 123, 1, 203, - 2, 3, 240, 120, 123, 1, 195, 242, 3, 240, 120, 123, 1, 48, 225, 36, 3, - 240, 120, 123, 1, 225, 36, 3, 240, 120, 123, 1, 222, 242, 3, 240, 120, - 123, 1, 219, 172, 3, 240, 120, 123, 1, 215, 139, 3, 240, 120, 123, 1, - 208, 226, 3, 240, 120, 123, 1, 48, 213, 93, 3, 240, 120, 123, 1, 213, 93, - 3, 240, 120, 123, 1, 201, 109, 3, 240, 120, 123, 1, 211, 107, 3, 240, - 120, 123, 1, 210, 110, 3, 240, 120, 123, 1, 206, 212, 3, 240, 120, 123, - 1, 203, 86, 3, 240, 120, 123, 1, 199, 123, 3, 231, 177, 123, 1, 248, 209, - 3, 210, 227, 123, 1, 225, 36, 3, 210, 227, 123, 1, 213, 93, 3, 210, 227, - 123, 33, 151, 222, 241, 9, 1, 151, 197, 135, 70, 20, 9, 1, 151, 197, 135, - 48, 20, 9, 1, 248, 250, 70, 20, 9, 1, 248, 250, 48, 20, 9, 1, 248, 250, - 84, 20, 9, 1, 248, 250, 219, 194, 20, 9, 1, 213, 73, 70, 20, 9, 1, 213, - 73, 48, 20, 9, 1, 213, 73, 84, 20, 9, 1, 213, 73, 219, 194, 20, 9, 1, - 248, 238, 70, 20, 9, 1, 248, 238, 48, 20, 9, 1, 248, 238, 84, 20, 9, 1, - 248, 238, 219, 194, 20, 9, 1, 201, 69, 70, 20, 9, 1, 201, 69, 48, 20, 9, - 1, 201, 69, 84, 20, 9, 1, 201, 69, 219, 194, 20, 9, 1, 203, 40, 70, 20, - 9, 1, 203, 40, 48, 20, 9, 1, 203, 40, 84, 20, 9, 1, 203, 40, 219, 194, - 20, 9, 1, 201, 71, 70, 20, 9, 1, 201, 71, 48, 20, 9, 1, 201, 71, 84, 20, - 9, 1, 201, 71, 219, 194, 20, 9, 1, 199, 112, 70, 20, 9, 1, 199, 112, 48, - 20, 9, 1, 199, 112, 84, 20, 9, 1, 199, 112, 219, 194, 20, 9, 1, 213, 71, - 70, 20, 9, 1, 213, 71, 48, 20, 9, 1, 213, 71, 84, 20, 9, 1, 213, 71, 219, - 194, 20, 9, 1, 237, 163, 70, 20, 9, 1, 237, 163, 48, 20, 9, 1, 237, 163, - 84, 20, 9, 1, 237, 163, 219, 194, 20, 9, 1, 215, 96, 70, 20, 9, 1, 215, - 96, 48, 20, 9, 1, 215, 96, 84, 20, 9, 1, 215, 96, 219, 194, 20, 9, 1, - 203, 73, 70, 20, 9, 1, 203, 73, 48, 20, 9, 1, 203, 73, 84, 20, 9, 1, 203, - 73, 219, 194, 20, 9, 1, 203, 71, 70, 20, 9, 1, 203, 71, 48, 20, 9, 1, - 203, 71, 84, 20, 9, 1, 203, 71, 219, 194, 20, 9, 1, 240, 39, 70, 20, 9, - 1, 240, 39, 48, 20, 9, 1, 240, 115, 70, 20, 9, 1, 240, 115, 48, 20, 9, 1, - 237, 192, 70, 20, 9, 1, 237, 192, 48, 20, 9, 1, 240, 37, 70, 20, 9, 1, - 240, 37, 48, 20, 9, 1, 225, 187, 70, 20, 9, 1, 225, 187, 48, 20, 9, 1, - 209, 174, 70, 20, 9, 1, 209, 174, 48, 20, 9, 1, 224, 192, 70, 20, 9, 1, - 224, 192, 48, 20, 9, 1, 224, 192, 84, 20, 9, 1, 224, 192, 219, 194, 20, - 9, 1, 234, 111, 70, 20, 9, 1, 234, 111, 48, 20, 9, 1, 234, 111, 84, 20, - 9, 1, 234, 111, 219, 194, 20, 9, 1, 233, 64, 70, 20, 9, 1, 233, 64, 48, - 20, 9, 1, 233, 64, 84, 20, 9, 1, 233, 64, 219, 194, 20, 9, 1, 216, 251, - 70, 20, 9, 1, 216, 251, 48, 20, 9, 1, 216, 251, 84, 20, 9, 1, 216, 251, - 219, 194, 20, 9, 1, 216, 32, 233, 197, 70, 20, 9, 1, 216, 32, 233, 197, - 48, 20, 9, 1, 209, 236, 70, 20, 9, 1, 209, 236, 48, 20, 9, 1, 209, 236, - 84, 20, 9, 1, 209, 236, 219, 194, 20, 9, 1, 232, 114, 3, 93, 90, 70, 20, - 9, 1, 232, 114, 3, 93, 90, 48, 20, 9, 1, 232, 114, 233, 142, 70, 20, 9, - 1, 232, 114, 233, 142, 48, 20, 9, 1, 232, 114, 233, 142, 84, 20, 9, 1, - 232, 114, 233, 142, 219, 194, 20, 9, 1, 232, 114, 239, 25, 70, 20, 9, 1, - 232, 114, 239, 25, 48, 20, 9, 1, 232, 114, 239, 25, 84, 20, 9, 1, 232, - 114, 239, 25, 219, 194, 20, 9, 1, 93, 249, 73, 70, 20, 9, 1, 93, 249, 73, - 48, 20, 9, 1, 93, 249, 73, 3, 232, 214, 90, 70, 20, 9, 1, 93, 249, 73, 3, - 232, 214, 90, 48, 20, 9, 16, 76, 57, 9, 16, 76, 60, 9, 16, 99, 238, 251, - 57, 9, 16, 99, 238, 251, 60, 9, 16, 115, 238, 251, 57, 9, 16, 115, 238, - 251, 60, 9, 16, 115, 238, 251, 212, 107, 237, 231, 57, 9, 16, 115, 238, - 251, 212, 107, 237, 231, 60, 9, 16, 235, 7, 238, 251, 57, 9, 16, 235, 7, - 238, 251, 60, 9, 16, 52, 83, 249, 80, 60, 9, 16, 99, 238, 251, 199, 50, - 57, 9, 16, 99, 238, 251, 199, 50, 60, 9, 16, 210, 2, 9, 16, 4, 203, 140, - 57, 9, 16, 4, 203, 140, 60, 9, 1, 217, 74, 70, 20, 9, 1, 217, 74, 48, 20, - 9, 1, 217, 74, 84, 20, 9, 1, 217, 74, 219, 194, 20, 9, 1, 118, 70, 20, 9, - 1, 118, 48, 20, 9, 1, 214, 165, 70, 20, 9, 1, 214, 165, 48, 20, 9, 1, - 195, 218, 70, 20, 9, 1, 195, 218, 48, 20, 9, 1, 118, 3, 232, 214, 90, 70, - 20, 9, 1, 199, 119, 70, 20, 9, 1, 199, 119, 48, 20, 9, 1, 224, 67, 214, - 165, 70, 20, 9, 1, 224, 67, 214, 165, 48, 20, 9, 1, 224, 67, 195, 218, - 70, 20, 9, 1, 224, 67, 195, 218, 48, 20, 9, 1, 237, 136, 70, 20, 9, 1, - 237, 136, 48, 20, 9, 1, 237, 136, 84, 20, 9, 1, 237, 136, 219, 194, 20, - 9, 1, 200, 89, 224, 213, 224, 67, 151, 220, 70, 84, 20, 9, 1, 200, 89, - 224, 213, 224, 67, 151, 220, 70, 219, 194, 20, 9, 33, 93, 3, 232, 214, - 90, 3, 151, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 151, 48, 20, 9, 33, - 93, 3, 232, 214, 90, 3, 251, 246, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, - 251, 246, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 197, 118, 70, 20, 9, 33, - 93, 3, 232, 214, 90, 3, 197, 118, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, - 118, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 118, 48, 20, 9, 33, 93, 3, - 232, 214, 90, 3, 214, 165, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 214, - 165, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 195, 218, 70, 20, 9, 33, 93, - 3, 232, 214, 90, 3, 195, 218, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 237, - 136, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 237, 136, 48, 20, 9, 33, 93, - 3, 232, 214, 90, 3, 237, 136, 84, 20, 9, 33, 200, 89, 224, 67, 93, 3, - 232, 214, 90, 3, 151, 220, 70, 70, 20, 9, 33, 200, 89, 224, 67, 93, 3, - 232, 214, 90, 3, 151, 220, 70, 48, 20, 9, 33, 200, 89, 224, 67, 93, 3, - 232, 214, 90, 3, 151, 220, 70, 84, 20, 9, 1, 235, 204, 93, 70, 20, 9, 1, - 235, 204, 93, 48, 20, 9, 1, 235, 204, 93, 84, 20, 9, 1, 235, 204, 93, - 219, 194, 20, 9, 33, 93, 3, 232, 214, 90, 3, 225, 190, 70, 20, 9, 33, 93, - 3, 232, 214, 90, 3, 168, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 87, 70, - 20, 9, 33, 93, 3, 232, 214, 90, 3, 151, 220, 70, 70, 20, 9, 33, 93, 3, - 232, 214, 90, 3, 93, 70, 20, 9, 33, 248, 240, 3, 225, 190, 70, 20, 9, 33, - 248, 240, 3, 168, 70, 20, 9, 33, 248, 240, 3, 224, 143, 70, 20, 9, 33, - 248, 240, 3, 87, 70, 20, 9, 33, 248, 240, 3, 151, 220, 70, 70, 20, 9, 33, - 248, 240, 3, 93, 70, 20, 9, 33, 203, 42, 3, 225, 190, 70, 20, 9, 33, 203, - 42, 3, 168, 70, 20, 9, 33, 203, 42, 3, 224, 143, 70, 20, 9, 33, 203, 42, - 3, 87, 70, 20, 9, 33, 203, 42, 3, 151, 220, 70, 70, 20, 9, 33, 203, 42, - 3, 93, 70, 20, 9, 33, 202, 214, 3, 225, 190, 70, 20, 9, 33, 202, 214, 3, - 87, 70, 20, 9, 33, 202, 214, 3, 151, 220, 70, 70, 20, 9, 33, 202, 214, 3, - 93, 70, 20, 9, 33, 225, 190, 3, 168, 70, 20, 9, 33, 225, 190, 3, 87, 70, - 20, 9, 33, 168, 3, 225, 190, 70, 20, 9, 33, 168, 3, 87, 70, 20, 9, 33, - 224, 143, 3, 225, 190, 70, 20, 9, 33, 224, 143, 3, 168, 70, 20, 9, 33, - 224, 143, 3, 87, 70, 20, 9, 33, 208, 126, 3, 225, 190, 70, 20, 9, 33, - 208, 126, 3, 168, 70, 20, 9, 33, 208, 126, 3, 224, 143, 70, 20, 9, 33, - 208, 126, 3, 87, 70, 20, 9, 33, 209, 9, 3, 168, 70, 20, 9, 33, 209, 9, 3, - 87, 70, 20, 9, 33, 240, 131, 3, 225, 190, 70, 20, 9, 33, 240, 131, 3, - 168, 70, 20, 9, 33, 240, 131, 3, 224, 143, 70, 20, 9, 33, 240, 131, 3, - 87, 70, 20, 9, 33, 203, 140, 3, 168, 70, 20, 9, 33, 203, 140, 3, 87, 70, - 20, 9, 33, 195, 110, 3, 87, 70, 20, 9, 33, 251, 195, 3, 225, 190, 70, 20, - 9, 33, 251, 195, 3, 87, 70, 20, 9, 33, 233, 226, 3, 225, 190, 70, 20, 9, - 33, 233, 226, 3, 87, 70, 20, 9, 33, 235, 177, 3, 225, 190, 70, 20, 9, 33, - 235, 177, 3, 168, 70, 20, 9, 33, 235, 177, 3, 224, 143, 70, 20, 9, 33, - 235, 177, 3, 87, 70, 20, 9, 33, 235, 177, 3, 151, 220, 70, 70, 20, 9, 33, - 235, 177, 3, 93, 70, 20, 9, 33, 211, 153, 3, 168, 70, 20, 9, 33, 211, - 153, 3, 87, 70, 20, 9, 33, 211, 153, 3, 151, 220, 70, 70, 20, 9, 33, 211, - 153, 3, 93, 70, 20, 9, 33, 225, 36, 3, 151, 70, 20, 9, 33, 225, 36, 3, - 225, 190, 70, 20, 9, 33, 225, 36, 3, 168, 70, 20, 9, 33, 225, 36, 3, 224, - 143, 70, 20, 9, 33, 225, 36, 3, 222, 250, 70, 20, 9, 33, 225, 36, 3, 87, - 70, 20, 9, 33, 225, 36, 3, 151, 220, 70, 70, 20, 9, 33, 225, 36, 3, 93, - 70, 20, 9, 33, 222, 250, 3, 225, 190, 70, 20, 9, 33, 222, 250, 3, 168, - 70, 20, 9, 33, 222, 250, 3, 224, 143, 70, 20, 9, 33, 222, 250, 3, 87, 70, - 20, 9, 33, 222, 250, 3, 151, 220, 70, 70, 20, 9, 33, 222, 250, 3, 93, 70, - 20, 9, 33, 87, 3, 225, 190, 70, 20, 9, 33, 87, 3, 168, 70, 20, 9, 33, 87, - 3, 224, 143, 70, 20, 9, 33, 87, 3, 87, 70, 20, 9, 33, 87, 3, 151, 220, - 70, 70, 20, 9, 33, 87, 3, 93, 70, 20, 9, 33, 216, 32, 3, 225, 190, 70, - 20, 9, 33, 216, 32, 3, 168, 70, 20, 9, 33, 216, 32, 3, 224, 143, 70, 20, - 9, 33, 216, 32, 3, 87, 70, 20, 9, 33, 216, 32, 3, 151, 220, 70, 70, 20, - 9, 33, 216, 32, 3, 93, 70, 20, 9, 33, 232, 114, 3, 225, 190, 70, 20, 9, - 33, 232, 114, 3, 87, 70, 20, 9, 33, 232, 114, 3, 151, 220, 70, 70, 20, 9, - 33, 232, 114, 3, 93, 70, 20, 9, 33, 93, 3, 225, 190, 70, 20, 9, 33, 93, - 3, 168, 70, 20, 9, 33, 93, 3, 224, 143, 70, 20, 9, 33, 93, 3, 87, 70, 20, - 9, 33, 93, 3, 151, 220, 70, 70, 20, 9, 33, 93, 3, 93, 70, 20, 9, 33, 202, - 226, 3, 204, 95, 151, 70, 20, 9, 33, 210, 143, 3, 204, 95, 151, 70, 20, - 9, 33, 151, 220, 70, 3, 204, 95, 151, 70, 20, 9, 33, 207, 41, 3, 240, 94, - 70, 20, 9, 33, 207, 41, 3, 224, 237, 70, 20, 9, 33, 207, 41, 3, 235, 201, - 70, 20, 9, 33, 207, 41, 3, 240, 96, 70, 20, 9, 33, 207, 41, 3, 224, 239, - 70, 20, 9, 33, 207, 41, 3, 204, 95, 151, 70, 20, 9, 33, 93, 3, 232, 214, - 90, 3, 210, 143, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 195, 107, 48, 20, - 9, 33, 93, 3, 232, 214, 90, 3, 87, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, - 216, 32, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 151, 220, 70, 48, 20, 9, - 33, 93, 3, 232, 214, 90, 3, 93, 48, 20, 9, 33, 248, 240, 3, 210, 143, 48, - 20, 9, 33, 248, 240, 3, 195, 107, 48, 20, 9, 33, 248, 240, 3, 87, 48, 20, - 9, 33, 248, 240, 3, 216, 32, 48, 20, 9, 33, 248, 240, 3, 151, 220, 70, - 48, 20, 9, 33, 248, 240, 3, 93, 48, 20, 9, 33, 203, 42, 3, 210, 143, 48, - 20, 9, 33, 203, 42, 3, 195, 107, 48, 20, 9, 33, 203, 42, 3, 87, 48, 20, - 9, 33, 203, 42, 3, 216, 32, 48, 20, 9, 33, 203, 42, 3, 151, 220, 70, 48, - 20, 9, 33, 203, 42, 3, 93, 48, 20, 9, 33, 202, 214, 3, 210, 143, 48, 20, - 9, 33, 202, 214, 3, 195, 107, 48, 20, 9, 33, 202, 214, 3, 87, 48, 20, 9, - 33, 202, 214, 3, 216, 32, 48, 20, 9, 33, 202, 214, 3, 151, 220, 70, 48, - 20, 9, 33, 202, 214, 3, 93, 48, 20, 9, 33, 235, 177, 3, 151, 220, 70, 48, - 20, 9, 33, 235, 177, 3, 93, 48, 20, 9, 33, 211, 153, 3, 151, 220, 70, 48, - 20, 9, 33, 211, 153, 3, 93, 48, 20, 9, 33, 225, 36, 3, 151, 48, 20, 9, - 33, 225, 36, 3, 222, 250, 48, 20, 9, 33, 225, 36, 3, 87, 48, 20, 9, 33, - 225, 36, 3, 151, 220, 70, 48, 20, 9, 33, 225, 36, 3, 93, 48, 20, 9, 33, - 222, 250, 3, 87, 48, 20, 9, 33, 222, 250, 3, 151, 220, 70, 48, 20, 9, 33, - 222, 250, 3, 93, 48, 20, 9, 33, 87, 3, 151, 48, 20, 9, 33, 87, 3, 87, 48, - 20, 9, 33, 216, 32, 3, 210, 143, 48, 20, 9, 33, 216, 32, 3, 195, 107, 48, - 20, 9, 33, 216, 32, 3, 87, 48, 20, 9, 33, 216, 32, 3, 216, 32, 48, 20, 9, - 33, 216, 32, 3, 151, 220, 70, 48, 20, 9, 33, 216, 32, 3, 93, 48, 20, 9, - 33, 151, 220, 70, 3, 204, 95, 151, 48, 20, 9, 33, 93, 3, 210, 143, 48, - 20, 9, 33, 93, 3, 195, 107, 48, 20, 9, 33, 93, 3, 87, 48, 20, 9, 33, 93, - 3, 216, 32, 48, 20, 9, 33, 93, 3, 151, 220, 70, 48, 20, 9, 33, 93, 3, 93, - 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 225, 190, 84, 20, 9, 33, 93, 3, - 232, 214, 90, 3, 168, 84, 20, 9, 33, 93, 3, 232, 214, 90, 3, 224, 143, - 84, 20, 9, 33, 93, 3, 232, 214, 90, 3, 87, 84, 20, 9, 33, 93, 3, 232, - 214, 90, 3, 232, 114, 84, 20, 9, 33, 248, 240, 3, 225, 190, 84, 20, 9, - 33, 248, 240, 3, 168, 84, 20, 9, 33, 248, 240, 3, 224, 143, 84, 20, 9, - 33, 248, 240, 3, 87, 84, 20, 9, 33, 248, 240, 3, 232, 114, 84, 20, 9, 33, - 203, 42, 3, 225, 190, 84, 20, 9, 33, 203, 42, 3, 168, 84, 20, 9, 33, 203, - 42, 3, 224, 143, 84, 20, 9, 33, 203, 42, 3, 87, 84, 20, 9, 33, 203, 42, - 3, 232, 114, 84, 20, 9, 33, 202, 214, 3, 87, 84, 20, 9, 33, 225, 190, 3, - 168, 84, 20, 9, 33, 225, 190, 3, 87, 84, 20, 9, 33, 168, 3, 225, 190, 84, - 20, 9, 33, 168, 3, 87, 84, 20, 9, 33, 224, 143, 3, 225, 190, 84, 20, 9, - 33, 224, 143, 3, 87, 84, 20, 9, 33, 208, 126, 3, 225, 190, 84, 20, 9, 33, - 208, 126, 3, 168, 84, 20, 9, 33, 208, 126, 3, 224, 143, 84, 20, 9, 33, - 208, 126, 3, 87, 84, 20, 9, 33, 209, 9, 3, 168, 84, 20, 9, 33, 209, 9, 3, - 224, 143, 84, 20, 9, 33, 209, 9, 3, 87, 84, 20, 9, 33, 240, 131, 3, 225, - 190, 84, 20, 9, 33, 240, 131, 3, 168, 84, 20, 9, 33, 240, 131, 3, 224, - 143, 84, 20, 9, 33, 240, 131, 3, 87, 84, 20, 9, 33, 203, 140, 3, 168, 84, - 20, 9, 33, 195, 110, 3, 87, 84, 20, 9, 33, 251, 195, 3, 225, 190, 84, 20, - 9, 33, 251, 195, 3, 87, 84, 20, 9, 33, 233, 226, 3, 225, 190, 84, 20, 9, - 33, 233, 226, 3, 87, 84, 20, 9, 33, 235, 177, 3, 225, 190, 84, 20, 9, 33, - 235, 177, 3, 168, 84, 20, 9, 33, 235, 177, 3, 224, 143, 84, 20, 9, 33, - 235, 177, 3, 87, 84, 20, 9, 33, 211, 153, 3, 168, 84, 20, 9, 33, 211, - 153, 3, 87, 84, 20, 9, 33, 225, 36, 3, 225, 190, 84, 20, 9, 33, 225, 36, - 3, 168, 84, 20, 9, 33, 225, 36, 3, 224, 143, 84, 20, 9, 33, 225, 36, 3, - 222, 250, 84, 20, 9, 33, 225, 36, 3, 87, 84, 20, 9, 33, 222, 250, 3, 225, - 190, 84, 20, 9, 33, 222, 250, 3, 168, 84, 20, 9, 33, 222, 250, 3, 224, - 143, 84, 20, 9, 33, 222, 250, 3, 87, 84, 20, 9, 33, 222, 250, 3, 232, - 114, 84, 20, 9, 33, 87, 3, 225, 190, 84, 20, 9, 33, 87, 3, 168, 84, 20, - 9, 33, 87, 3, 224, 143, 84, 20, 9, 33, 87, 3, 87, 84, 20, 9, 33, 216, 32, - 3, 225, 190, 84, 20, 9, 33, 216, 32, 3, 168, 84, 20, 9, 33, 216, 32, 3, - 224, 143, 84, 20, 9, 33, 216, 32, 3, 87, 84, 20, 9, 33, 216, 32, 3, 232, - 114, 84, 20, 9, 33, 232, 114, 3, 225, 190, 84, 20, 9, 33, 232, 114, 3, - 87, 84, 20, 9, 33, 232, 114, 3, 204, 95, 151, 84, 20, 9, 33, 93, 3, 225, - 190, 84, 20, 9, 33, 93, 3, 168, 84, 20, 9, 33, 93, 3, 224, 143, 84, 20, - 9, 33, 93, 3, 87, 84, 20, 9, 33, 93, 3, 232, 114, 84, 20, 9, 33, 93, 3, - 232, 214, 90, 3, 87, 219, 194, 20, 9, 33, 93, 3, 232, 214, 90, 3, 232, - 114, 219, 194, 20, 9, 33, 248, 240, 3, 87, 219, 194, 20, 9, 33, 248, 240, - 3, 232, 114, 219, 194, 20, 9, 33, 203, 42, 3, 87, 219, 194, 20, 9, 33, - 203, 42, 3, 232, 114, 219, 194, 20, 9, 33, 202, 214, 3, 87, 219, 194, 20, - 9, 33, 202, 214, 3, 232, 114, 219, 194, 20, 9, 33, 208, 126, 3, 87, 219, - 194, 20, 9, 33, 208, 126, 3, 232, 114, 219, 194, 20, 9, 33, 206, 252, 3, - 87, 219, 194, 20, 9, 33, 206, 252, 3, 232, 114, 219, 194, 20, 9, 33, 225, - 36, 3, 222, 250, 219, 194, 20, 9, 33, 225, 36, 3, 87, 219, 194, 20, 9, - 33, 222, 250, 3, 87, 219, 194, 20, 9, 33, 216, 32, 3, 87, 219, 194, 20, - 9, 33, 216, 32, 3, 232, 114, 219, 194, 20, 9, 33, 93, 3, 87, 219, 194, - 20, 9, 33, 93, 3, 232, 114, 219, 194, 20, 9, 33, 207, 41, 3, 235, 201, - 219, 194, 20, 9, 33, 207, 41, 3, 240, 96, 219, 194, 20, 9, 33, 207, 41, - 3, 224, 239, 219, 194, 20, 9, 33, 203, 140, 3, 151, 220, 70, 70, 20, 9, - 33, 203, 140, 3, 93, 70, 20, 9, 33, 251, 195, 3, 151, 220, 70, 70, 20, 9, - 33, 251, 195, 3, 93, 70, 20, 9, 33, 233, 226, 3, 151, 220, 70, 70, 20, 9, - 33, 233, 226, 3, 93, 70, 20, 9, 33, 208, 126, 3, 151, 220, 70, 70, 20, 9, - 33, 208, 126, 3, 93, 70, 20, 9, 33, 206, 252, 3, 151, 220, 70, 70, 20, 9, - 33, 206, 252, 3, 93, 70, 20, 9, 33, 168, 3, 151, 220, 70, 70, 20, 9, 33, - 168, 3, 93, 70, 20, 9, 33, 225, 190, 3, 151, 220, 70, 70, 20, 9, 33, 225, - 190, 3, 93, 70, 20, 9, 33, 224, 143, 3, 151, 220, 70, 70, 20, 9, 33, 224, - 143, 3, 93, 70, 20, 9, 33, 209, 9, 3, 151, 220, 70, 70, 20, 9, 33, 209, - 9, 3, 93, 70, 20, 9, 33, 240, 131, 3, 151, 220, 70, 70, 20, 9, 33, 240, - 131, 3, 93, 70, 20, 9, 33, 206, 252, 3, 225, 190, 70, 20, 9, 33, 206, - 252, 3, 168, 70, 20, 9, 33, 206, 252, 3, 224, 143, 70, 20, 9, 33, 206, - 252, 3, 87, 70, 20, 9, 33, 206, 252, 3, 210, 143, 70, 20, 9, 33, 208, - 126, 3, 210, 143, 70, 20, 9, 33, 209, 9, 3, 210, 143, 70, 20, 9, 33, 240, - 131, 3, 210, 143, 70, 20, 9, 33, 203, 140, 3, 151, 220, 70, 48, 20, 9, - 33, 203, 140, 3, 93, 48, 20, 9, 33, 251, 195, 3, 151, 220, 70, 48, 20, 9, - 33, 251, 195, 3, 93, 48, 20, 9, 33, 233, 226, 3, 151, 220, 70, 48, 20, 9, - 33, 233, 226, 3, 93, 48, 20, 9, 33, 208, 126, 3, 151, 220, 70, 48, 20, 9, - 33, 208, 126, 3, 93, 48, 20, 9, 33, 206, 252, 3, 151, 220, 70, 48, 20, 9, - 33, 206, 252, 3, 93, 48, 20, 9, 33, 168, 3, 151, 220, 70, 48, 20, 9, 33, - 168, 3, 93, 48, 20, 9, 33, 225, 190, 3, 151, 220, 70, 48, 20, 9, 33, 225, - 190, 3, 93, 48, 20, 9, 33, 224, 143, 3, 151, 220, 70, 48, 20, 9, 33, 224, - 143, 3, 93, 48, 20, 9, 33, 209, 9, 3, 151, 220, 70, 48, 20, 9, 33, 209, - 9, 3, 93, 48, 20, 9, 33, 240, 131, 3, 151, 220, 70, 48, 20, 9, 33, 240, - 131, 3, 93, 48, 20, 9, 33, 206, 252, 3, 225, 190, 48, 20, 9, 33, 206, - 252, 3, 168, 48, 20, 9, 33, 206, 252, 3, 224, 143, 48, 20, 9, 33, 206, - 252, 3, 87, 48, 20, 9, 33, 206, 252, 3, 210, 143, 48, 20, 9, 33, 208, - 126, 3, 210, 143, 48, 20, 9, 33, 209, 9, 3, 210, 143, 48, 20, 9, 33, 240, - 131, 3, 210, 143, 48, 20, 9, 33, 206, 252, 3, 225, 190, 84, 20, 9, 33, - 206, 252, 3, 168, 84, 20, 9, 33, 206, 252, 3, 224, 143, 84, 20, 9, 33, - 206, 252, 3, 87, 84, 20, 9, 33, 208, 126, 3, 232, 114, 84, 20, 9, 33, - 206, 252, 3, 232, 114, 84, 20, 9, 33, 203, 140, 3, 87, 84, 20, 9, 33, - 208, 126, 3, 225, 190, 219, 194, 20, 9, 33, 208, 126, 3, 168, 219, 194, - 20, 9, 33, 208, 126, 3, 224, 143, 219, 194, 20, 9, 33, 206, 252, 3, 225, - 190, 219, 194, 20, 9, 33, 206, 252, 3, 168, 219, 194, 20, 9, 33, 206, - 252, 3, 224, 143, 219, 194, 20, 9, 33, 203, 140, 3, 87, 219, 194, 20, 9, - 33, 195, 110, 3, 87, 219, 194, 20, 9, 33, 151, 3, 235, 199, 48, 20, 9, - 33, 151, 3, 235, 199, 70, 20, 214, 57, 50, 213, 140, 214, 57, 53, 213, - 140, 9, 33, 203, 42, 3, 225, 190, 3, 87, 84, 20, 9, 33, 203, 42, 3, 168, - 3, 225, 190, 48, 20, 9, 33, 203, 42, 3, 168, 3, 225, 190, 84, 20, 9, 33, - 203, 42, 3, 168, 3, 87, 84, 20, 9, 33, 203, 42, 3, 224, 143, 3, 87, 84, - 20, 9, 33, 203, 42, 3, 87, 3, 225, 190, 84, 20, 9, 33, 203, 42, 3, 87, 3, - 168, 84, 20, 9, 33, 203, 42, 3, 87, 3, 224, 143, 84, 20, 9, 33, 225, 190, - 3, 87, 3, 168, 48, 20, 9, 33, 225, 190, 3, 87, 3, 168, 84, 20, 9, 33, - 168, 3, 87, 3, 93, 48, 20, 9, 33, 168, 3, 87, 3, 151, 220, 70, 48, 20, 9, - 33, 208, 126, 3, 168, 3, 225, 190, 84, 20, 9, 33, 208, 126, 3, 225, 190, - 3, 168, 84, 20, 9, 33, 208, 126, 3, 225, 190, 3, 151, 220, 70, 48, 20, 9, - 33, 208, 126, 3, 87, 3, 168, 48, 20, 9, 33, 208, 126, 3, 87, 3, 168, 84, - 20, 9, 33, 208, 126, 3, 87, 3, 225, 190, 84, 20, 9, 33, 208, 126, 3, 87, - 3, 87, 48, 20, 9, 33, 208, 126, 3, 87, 3, 87, 84, 20, 9, 33, 209, 9, 3, - 168, 3, 168, 48, 20, 9, 33, 209, 9, 3, 168, 3, 168, 84, 20, 9, 33, 209, - 9, 3, 87, 3, 87, 48, 20, 9, 33, 206, 252, 3, 168, 3, 87, 48, 20, 9, 33, - 206, 252, 3, 168, 3, 87, 84, 20, 9, 33, 206, 252, 3, 225, 190, 3, 93, 48, - 20, 9, 33, 206, 252, 3, 87, 3, 224, 143, 48, 20, 9, 33, 206, 252, 3, 87, - 3, 224, 143, 84, 20, 9, 33, 206, 252, 3, 87, 3, 87, 48, 20, 9, 33, 206, - 252, 3, 87, 3, 87, 84, 20, 9, 33, 240, 131, 3, 168, 3, 151, 220, 70, 48, - 20, 9, 33, 240, 131, 3, 224, 143, 3, 87, 48, 20, 9, 33, 240, 131, 3, 224, - 143, 3, 87, 84, 20, 9, 33, 203, 140, 3, 87, 3, 168, 48, 20, 9, 33, 203, - 140, 3, 87, 3, 168, 84, 20, 9, 33, 203, 140, 3, 87, 3, 87, 84, 20, 9, 33, - 203, 140, 3, 87, 3, 93, 48, 20, 9, 33, 251, 195, 3, 225, 190, 3, 87, 48, - 20, 9, 33, 251, 195, 3, 87, 3, 87, 48, 20, 9, 33, 251, 195, 3, 87, 3, 87, - 84, 20, 9, 33, 251, 195, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 233, 226, - 3, 87, 3, 87, 48, 20, 9, 33, 233, 226, 3, 87, 3, 93, 48, 20, 9, 33, 233, - 226, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 235, 177, 3, 224, 143, 3, 87, - 48, 20, 9, 33, 235, 177, 3, 224, 143, 3, 87, 84, 20, 9, 33, 211, 153, 3, - 87, 3, 168, 48, 20, 9, 33, 211, 153, 3, 87, 3, 87, 48, 20, 9, 33, 222, - 250, 3, 168, 3, 87, 48, 20, 9, 33, 222, 250, 3, 168, 3, 93, 48, 20, 9, - 33, 222, 250, 3, 168, 3, 151, 220, 70, 48, 20, 9, 33, 222, 250, 3, 225, - 190, 3, 225, 190, 84, 20, 9, 33, 222, 250, 3, 225, 190, 3, 225, 190, 48, - 20, 9, 33, 222, 250, 3, 224, 143, 3, 87, 48, 20, 9, 33, 222, 250, 3, 224, - 143, 3, 87, 84, 20, 9, 33, 222, 250, 3, 87, 3, 168, 48, 20, 9, 33, 222, - 250, 3, 87, 3, 168, 84, 20, 9, 33, 87, 3, 168, 3, 225, 190, 84, 20, 9, - 33, 87, 3, 168, 3, 87, 84, 20, 9, 33, 87, 3, 168, 3, 93, 48, 20, 9, 33, - 87, 3, 225, 190, 3, 168, 84, 20, 9, 33, 87, 3, 225, 190, 3, 87, 84, 20, - 9, 33, 87, 3, 224, 143, 3, 225, 190, 84, 20, 9, 33, 87, 3, 224, 143, 3, - 87, 84, 20, 9, 33, 87, 3, 225, 190, 3, 224, 143, 84, 20, 9, 33, 232, 114, - 3, 87, 3, 225, 190, 84, 20, 9, 33, 232, 114, 3, 87, 3, 87, 84, 20, 9, 33, - 216, 32, 3, 168, 3, 87, 84, 20, 9, 33, 216, 32, 3, 168, 3, 151, 220, 70, - 48, 20, 9, 33, 216, 32, 3, 225, 190, 3, 87, 48, 20, 9, 33, 216, 32, 3, - 225, 190, 3, 87, 84, 20, 9, 33, 216, 32, 3, 225, 190, 3, 151, 220, 70, - 48, 20, 9, 33, 216, 32, 3, 87, 3, 93, 48, 20, 9, 33, 216, 32, 3, 87, 3, - 151, 220, 70, 48, 20, 9, 33, 93, 3, 87, 3, 87, 48, 20, 9, 33, 93, 3, 87, - 3, 87, 84, 20, 9, 33, 248, 240, 3, 224, 143, 3, 93, 48, 20, 9, 33, 203, - 42, 3, 225, 190, 3, 93, 48, 20, 9, 33, 203, 42, 3, 225, 190, 3, 151, 220, - 70, 48, 20, 9, 33, 203, 42, 3, 224, 143, 3, 93, 48, 20, 9, 33, 203, 42, - 3, 224, 143, 3, 151, 220, 70, 48, 20, 9, 33, 203, 42, 3, 87, 3, 93, 48, - 20, 9, 33, 203, 42, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 225, 190, 3, - 87, 3, 93, 48, 20, 9, 33, 225, 190, 3, 168, 3, 151, 220, 70, 48, 20, 9, - 33, 225, 190, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 208, 126, 3, 224, - 143, 3, 151, 220, 70, 48, 20, 9, 33, 209, 9, 3, 168, 3, 93, 48, 20, 9, - 33, 206, 252, 3, 168, 3, 93, 48, 20, 9, 33, 240, 131, 3, 168, 3, 93, 48, - 20, 9, 33, 222, 250, 3, 225, 190, 3, 93, 48, 20, 9, 33, 222, 250, 3, 87, - 3, 93, 48, 20, 9, 33, 93, 3, 168, 3, 93, 48, 20, 9, 33, 93, 3, 225, 190, - 3, 93, 48, 20, 9, 33, 93, 3, 87, 3, 93, 48, 20, 9, 33, 87, 3, 87, 3, 93, - 48, 20, 9, 33, 211, 153, 3, 87, 3, 93, 48, 20, 9, 33, 216, 32, 3, 168, 3, - 93, 48, 20, 9, 33, 211, 153, 3, 87, 3, 168, 84, 20, 9, 33, 222, 250, 3, - 168, 3, 87, 84, 20, 9, 33, 251, 195, 3, 87, 3, 93, 48, 20, 9, 33, 225, - 36, 3, 87, 3, 93, 48, 20, 9, 33, 216, 32, 3, 225, 190, 3, 168, 84, 20, 9, - 33, 87, 3, 224, 143, 3, 93, 48, 20, 9, 33, 222, 250, 3, 225, 190, 3, 87, - 84, 20, 9, 33, 225, 36, 3, 87, 3, 87, 48, 20, 9, 33, 222, 250, 3, 225, - 190, 3, 87, 48, 20, 9, 33, 216, 32, 3, 225, 190, 3, 168, 48, 20, 9, 33, - 225, 190, 3, 168, 3, 93, 48, 20, 9, 33, 168, 3, 225, 190, 3, 93, 48, 20, - 9, 33, 87, 3, 225, 190, 3, 93, 48, 20, 9, 33, 235, 177, 3, 87, 3, 93, 48, - 20, 9, 33, 248, 240, 3, 168, 3, 93, 48, 20, 9, 33, 225, 36, 3, 87, 3, 87, - 84, 20, 9, 33, 251, 195, 3, 225, 190, 3, 87, 84, 20, 9, 33, 209, 9, 3, - 87, 3, 87, 84, 20, 9, 33, 208, 126, 3, 224, 143, 3, 93, 48, 20, 9, 33, - 216, 32, 3, 225, 190, 3, 93, 48, 20, 9, 33, 208, 236, 199, 255, 250, 203, - 223, 234, 204, 227, 2, 70, 20, 9, 33, 211, 149, 199, 255, 250, 203, 223, - 234, 204, 227, 2, 70, 20, 9, 33, 251, 145, 70, 20, 9, 33, 251, 178, 70, - 20, 9, 33, 218, 218, 70, 20, 9, 33, 208, 237, 70, 20, 9, 33, 210, 200, - 70, 20, 9, 33, 251, 167, 70, 20, 9, 33, 197, 137, 70, 20, 9, 33, 208, - 236, 70, 20, 9, 33, 208, 235, 251, 167, 197, 136, 9, 33, 225, 205, 210, - 64, 55, 9, 33, 248, 147, 251, 12, 251, 13, 62, 208, 113, 62, 208, 2, 62, - 207, 190, 62, 207, 179, 62, 207, 168, 62, 207, 157, 62, 207, 146, 62, - 207, 135, 62, 207, 124, 62, 208, 112, 62, 208, 101, 62, 208, 90, 62, 208, - 79, 62, 208, 68, 62, 208, 57, 62, 208, 46, 212, 25, 235, 24, 36, 83, 244, - 159, 212, 25, 235, 24, 36, 83, 143, 244, 159, 212, 25, 235, 24, 36, 83, - 143, 234, 217, 204, 226, 212, 25, 235, 24, 36, 83, 244, 168, 212, 25, - 235, 24, 36, 83, 207, 105, 212, 25, 235, 24, 36, 83, 236, 90, 78, 212, - 25, 235, 24, 36, 83, 211, 79, 78, 212, 25, 235, 24, 36, 83, 50, 59, 222, - 147, 179, 212, 25, 235, 24, 36, 83, 53, 59, 222, 147, 248, 59, 212, 25, - 235, 24, 36, 83, 231, 155, 236, 247, 38, 33, 50, 232, 225, 38, 33, 53, - 232, 225, 38, 52, 202, 85, 50, 232, 225, 38, 52, 202, 85, 53, 232, 225, - 38, 220, 115, 50, 232, 225, 38, 220, 115, 53, 232, 225, 38, 241, 143, - 220, 114, 38, 33, 50, 157, 60, 38, 33, 53, 157, 60, 38, 202, 85, 50, 157, - 60, 38, 202, 85, 53, 157, 60, 38, 220, 115, 50, 157, 60, 38, 220, 115, - 53, 157, 60, 38, 241, 143, 220, 115, 60, 38, 40, 202, 55, 50, 232, 225, - 38, 40, 202, 55, 53, 232, 225, 212, 25, 235, 24, 36, 83, 99, 76, 222, - 195, 212, 25, 235, 24, 36, 83, 236, 242, 240, 65, 212, 25, 235, 24, 36, - 83, 236, 231, 240, 65, 212, 25, 235, 24, 36, 83, 126, 222, 75, 212, 25, - 235, 24, 36, 83, 197, 119, 126, 222, 75, 212, 25, 235, 24, 36, 83, 50, - 213, 140, 212, 25, 235, 24, 36, 83, 53, 213, 140, 212, 25, 235, 24, 36, - 83, 50, 241, 18, 179, 212, 25, 235, 24, 36, 83, 53, 241, 18, 179, 212, - 25, 235, 24, 36, 83, 50, 201, 231, 206, 245, 179, 212, 25, 235, 24, 36, - 83, 53, 201, 231, 206, 245, 179, 212, 25, 235, 24, 36, 83, 50, 58, 222, - 147, 179, 212, 25, 235, 24, 36, 83, 53, 58, 222, 147, 179, 212, 25, 235, - 24, 36, 83, 50, 52, 251, 91, 179, 212, 25, 235, 24, 36, 83, 53, 52, 251, - 91, 179, 212, 25, 235, 24, 36, 83, 50, 251, 91, 179, 212, 25, 235, 24, - 36, 83, 53, 251, 91, 179, 212, 25, 235, 24, 36, 83, 50, 241, 102, 179, - 212, 25, 235, 24, 36, 83, 53, 241, 102, 179, 212, 25, 235, 24, 36, 83, - 50, 59, 241, 102, 179, 212, 25, 235, 24, 36, 83, 53, 59, 241, 102, 179, - 207, 80, 238, 253, 59, 207, 80, 238, 253, 212, 25, 235, 24, 36, 83, 50, - 47, 179, 212, 25, 235, 24, 36, 83, 53, 47, 179, 240, 64, 214, 19, 247, - 33, 214, 19, 197, 119, 214, 19, 52, 197, 119, 214, 19, 240, 64, 126, 222, - 75, 247, 33, 126, 222, 75, 197, 119, 126, 222, 75, 4, 244, 159, 4, 143, - 244, 159, 4, 234, 217, 204, 226, 4, 207, 105, 4, 244, 168, 4, 211, 79, - 78, 4, 236, 90, 78, 4, 236, 242, 240, 65, 4, 50, 213, 140, 4, 53, 213, - 140, 4, 50, 241, 18, 179, 4, 53, 241, 18, 179, 4, 50, 201, 231, 206, 245, - 179, 4, 53, 201, 231, 206, 245, 179, 4, 31, 55, 4, 251, 111, 4, 250, 179, - 4, 98, 55, 4, 231, 6, 4, 222, 140, 55, 4, 233, 94, 55, 4, 236, 172, 55, - 4, 210, 90, 205, 177, 4, 239, 10, 55, 4, 213, 45, 55, 4, 244, 157, 250, - 168, 9, 235, 199, 70, 20, 9, 203, 92, 3, 235, 199, 57, 9, 240, 94, 70, - 20, 9, 203, 136, 234, 253, 9, 224, 237, 70, 20, 9, 235, 201, 70, 20, 9, - 235, 201, 219, 194, 20, 9, 240, 96, 70, 20, 9, 240, 96, 219, 194, 20, 9, - 224, 239, 70, 20, 9, 224, 239, 219, 194, 20, 9, 207, 41, 70, 20, 9, 207, - 41, 219, 194, 20, 9, 204, 120, 70, 20, 9, 204, 120, 219, 194, 20, 9, 1, - 232, 214, 70, 20, 9, 1, 151, 3, 220, 110, 90, 70, 20, 9, 1, 151, 3, 220, - 110, 90, 48, 20, 9, 1, 151, 3, 232, 214, 90, 70, 20, 9, 1, 151, 3, 232, - 214, 90, 48, 20, 9, 1, 197, 118, 3, 232, 214, 90, 70, 20, 9, 1, 197, 118, - 3, 232, 214, 90, 48, 20, 9, 1, 151, 3, 232, 214, 248, 227, 70, 20, 9, 1, - 151, 3, 232, 214, 248, 227, 48, 20, 9, 1, 93, 3, 232, 214, 90, 70, 20, 9, - 1, 93, 3, 232, 214, 90, 48, 20, 9, 1, 93, 3, 232, 214, 90, 84, 20, 9, 1, - 93, 3, 232, 214, 90, 219, 194, 20, 9, 1, 151, 70, 20, 9, 1, 151, 48, 20, - 9, 1, 248, 240, 70, 20, 9, 1, 248, 240, 48, 20, 9, 1, 248, 240, 84, 20, - 9, 1, 248, 240, 219, 194, 20, 9, 1, 203, 42, 220, 36, 70, 20, 9, 1, 203, - 42, 220, 36, 48, 20, 9, 1, 203, 42, 70, 20, 9, 1, 203, 42, 48, 20, 9, 1, - 203, 42, 84, 20, 9, 1, 203, 42, 219, 194, 20, 9, 1, 202, 214, 70, 20, 9, - 1, 202, 214, 48, 20, 9, 1, 202, 214, 84, 20, 9, 1, 202, 214, 219, 194, - 20, 9, 1, 225, 190, 70, 20, 9, 1, 225, 190, 48, 20, 9, 1, 225, 190, 84, - 20, 9, 1, 225, 190, 219, 194, 20, 9, 1, 168, 70, 20, 9, 1, 168, 48, 20, - 9, 1, 168, 84, 20, 9, 1, 168, 219, 194, 20, 9, 1, 224, 143, 70, 20, 9, 1, - 224, 143, 48, 20, 9, 1, 224, 143, 84, 20, 9, 1, 224, 143, 219, 194, 20, - 9, 1, 240, 108, 70, 20, 9, 1, 240, 108, 48, 20, 9, 1, 202, 226, 70, 20, - 9, 1, 202, 226, 48, 20, 9, 1, 210, 143, 70, 20, 9, 1, 210, 143, 48, 20, - 9, 1, 195, 107, 70, 20, 9, 1, 195, 107, 48, 20, 9, 1, 208, 126, 70, 20, - 9, 1, 208, 126, 48, 20, 9, 1, 208, 126, 84, 20, 9, 1, 208, 126, 219, 194, - 20, 9, 1, 206, 252, 70, 20, 9, 1, 206, 252, 48, 20, 9, 1, 206, 252, 84, - 20, 9, 1, 206, 252, 219, 194, 20, 9, 1, 209, 9, 70, 20, 9, 1, 209, 9, 48, - 20, 9, 1, 209, 9, 84, 20, 9, 1, 209, 9, 219, 194, 20, 9, 1, 240, 131, 70, - 20, 9, 1, 240, 131, 48, 20, 9, 1, 240, 131, 84, 20, 9, 1, 240, 131, 219, - 194, 20, 9, 1, 203, 140, 70, 20, 9, 1, 203, 140, 48, 20, 9, 1, 203, 140, - 84, 20, 9, 1, 203, 140, 219, 194, 20, 9, 1, 195, 110, 70, 20, 9, 1, 195, - 110, 48, 20, 9, 1, 195, 110, 84, 20, 9, 1, 195, 110, 219, 194, 20, 9, 1, - 251, 195, 70, 20, 9, 1, 251, 195, 48, 20, 9, 1, 251, 195, 84, 20, 9, 1, - 251, 195, 219, 194, 20, 9, 1, 233, 226, 70, 20, 9, 1, 233, 226, 48, 20, - 9, 1, 233, 226, 84, 20, 9, 1, 233, 226, 219, 194, 20, 9, 1, 235, 177, 70, - 20, 9, 1, 235, 177, 48, 20, 9, 1, 235, 177, 84, 20, 9, 1, 235, 177, 219, - 194, 20, 9, 1, 211, 153, 70, 20, 9, 1, 211, 153, 48, 20, 9, 1, 211, 153, - 84, 20, 9, 1, 211, 153, 219, 194, 20, 9, 1, 225, 36, 70, 20, 9, 1, 225, - 36, 48, 20, 9, 1, 225, 36, 84, 20, 9, 1, 225, 36, 219, 194, 20, 9, 1, - 222, 250, 70, 20, 9, 1, 222, 250, 48, 20, 9, 1, 222, 250, 84, 20, 9, 1, - 222, 250, 219, 194, 20, 9, 1, 87, 70, 20, 9, 1, 87, 48, 20, 9, 1, 87, 84, - 20, 9, 1, 87, 219, 194, 20, 9, 1, 216, 32, 70, 20, 9, 1, 216, 32, 48, 20, - 9, 1, 216, 32, 84, 20, 9, 1, 216, 32, 219, 194, 20, 9, 1, 232, 114, 70, - 20, 9, 1, 232, 114, 48, 20, 9, 1, 232, 114, 84, 20, 9, 1, 232, 114, 219, - 194, 20, 9, 1, 197, 118, 70, 20, 9, 1, 197, 118, 48, 20, 9, 1, 151, 220, - 70, 70, 20, 9, 1, 151, 220, 70, 48, 20, 9, 1, 93, 70, 20, 9, 1, 93, 48, - 20, 9, 1, 93, 84, 20, 9, 1, 93, 219, 194, 20, 9, 33, 222, 250, 3, 151, 3, - 220, 110, 90, 70, 20, 9, 33, 222, 250, 3, 151, 3, 220, 110, 90, 48, 20, - 9, 33, 222, 250, 3, 151, 3, 232, 214, 90, 70, 20, 9, 33, 222, 250, 3, - 151, 3, 232, 214, 90, 48, 20, 9, 33, 222, 250, 3, 151, 3, 232, 214, 248, - 227, 70, 20, 9, 33, 222, 250, 3, 151, 3, 232, 214, 248, 227, 48, 20, 9, - 33, 222, 250, 3, 151, 70, 20, 9, 33, 222, 250, 3, 151, 48, 20, 195, 80, - 197, 59, 216, 44, 205, 148, 174, 236, 90, 78, 174, 211, 62, 78, 174, 31, - 55, 174, 239, 10, 55, 174, 213, 45, 55, 174, 251, 111, 174, 251, 30, 174, - 50, 213, 140, 174, 53, 213, 140, 174, 250, 179, 174, 98, 55, 174, 244, - 159, 174, 231, 6, 174, 234, 217, 204, 226, 174, 205, 177, 174, 17, 195, - 79, 174, 17, 100, 174, 17, 102, 174, 17, 134, 174, 17, 136, 174, 17, 146, - 174, 17, 167, 174, 17, 178, 174, 17, 171, 174, 17, 182, 174, 244, 168, - 174, 207, 105, 174, 222, 140, 55, 174, 236, 172, 55, 174, 233, 94, 55, - 174, 211, 79, 78, 174, 244, 157, 250, 168, 174, 8, 6, 1, 63, 174, 8, 6, - 1, 250, 112, 174, 8, 6, 1, 247, 207, 174, 8, 6, 1, 240, 231, 174, 8, 6, - 1, 69, 174, 8, 6, 1, 236, 49, 174, 8, 6, 1, 234, 190, 174, 8, 6, 1, 233, - 15, 174, 8, 6, 1, 68, 174, 8, 6, 1, 225, 217, 174, 8, 6, 1, 225, 80, 174, - 8, 6, 1, 159, 174, 8, 6, 1, 221, 136, 174, 8, 6, 1, 218, 55, 174, 8, 6, - 1, 72, 174, 8, 6, 1, 214, 3, 174, 8, 6, 1, 211, 167, 174, 8, 6, 1, 144, - 174, 8, 6, 1, 209, 80, 174, 8, 6, 1, 203, 216, 174, 8, 6, 1, 66, 174, 8, - 6, 1, 199, 230, 174, 8, 6, 1, 197, 199, 174, 8, 6, 1, 196, 222, 174, 8, - 6, 1, 196, 148, 174, 8, 6, 1, 195, 158, 174, 50, 47, 179, 174, 210, 90, - 205, 177, 174, 53, 47, 179, 174, 244, 241, 252, 22, 174, 126, 222, 75, - 174, 233, 101, 252, 22, 174, 8, 4, 1, 63, 174, 8, 4, 1, 250, 112, 174, 8, - 4, 1, 247, 207, 174, 8, 4, 1, 240, 231, 174, 8, 4, 1, 69, 174, 8, 4, 1, - 236, 49, 174, 8, 4, 1, 234, 190, 174, 8, 4, 1, 233, 15, 174, 8, 4, 1, 68, - 174, 8, 4, 1, 225, 217, 174, 8, 4, 1, 225, 80, 174, 8, 4, 1, 159, 174, 8, - 4, 1, 221, 136, 174, 8, 4, 1, 218, 55, 174, 8, 4, 1, 72, 174, 8, 4, 1, - 214, 3, 174, 8, 4, 1, 211, 167, 174, 8, 4, 1, 144, 174, 8, 4, 1, 209, 80, - 174, 8, 4, 1, 203, 216, 174, 8, 4, 1, 66, 174, 8, 4, 1, 199, 230, 174, 8, - 4, 1, 197, 199, 174, 8, 4, 1, 196, 222, 174, 8, 4, 1, 196, 148, 174, 8, - 4, 1, 195, 158, 174, 50, 241, 18, 179, 174, 83, 222, 75, 174, 53, 241, - 18, 179, 174, 202, 84, 174, 50, 59, 213, 140, 174, 53, 59, 213, 140, 138, - 143, 234, 217, 204, 226, 138, 50, 241, 102, 179, 138, 53, 241, 102, 179, - 138, 143, 244, 159, 138, 71, 112, 238, 253, 138, 71, 1, 197, 34, 138, 71, - 1, 4, 63, 138, 71, 1, 4, 68, 138, 71, 1, 4, 66, 138, 71, 1, 4, 69, 138, - 71, 1, 4, 72, 138, 71, 1, 4, 164, 138, 71, 1, 4, 195, 217, 138, 71, 1, 4, - 196, 3, 138, 71, 1, 4, 201, 40, 138, 224, 234, 211, 252, 205, 162, 78, - 138, 71, 1, 63, 138, 71, 1, 68, 138, 71, 1, 66, 138, 71, 1, 69, 138, 71, - 1, 72, 138, 71, 1, 155, 138, 71, 1, 224, 101, 138, 71, 1, 223, 187, 138, - 71, 1, 224, 209, 138, 71, 1, 224, 11, 138, 71, 1, 183, 138, 71, 1, 206, - 112, 138, 71, 1, 204, 172, 138, 71, 1, 208, 147, 138, 71, 1, 205, 200, - 138, 71, 1, 189, 138, 71, 1, 202, 122, 138, 71, 1, 201, 40, 138, 71, 1, - 203, 68, 138, 71, 1, 149, 138, 71, 1, 176, 138, 71, 1, 216, 223, 138, 71, - 1, 215, 186, 138, 71, 1, 217, 118, 138, 71, 1, 216, 50, 138, 71, 1, 142, - 138, 71, 1, 232, 71, 138, 71, 1, 231, 75, 138, 71, 1, 232, 147, 138, 71, - 1, 231, 193, 138, 71, 1, 166, 138, 71, 1, 219, 78, 138, 71, 1, 218, 145, - 138, 71, 1, 219, 207, 138, 71, 1, 218, 251, 138, 71, 1, 164, 138, 71, 1, - 195, 217, 138, 71, 1, 196, 3, 138, 71, 1, 169, 138, 71, 1, 210, 72, 138, - 71, 1, 209, 140, 138, 71, 1, 210, 183, 138, 71, 1, 209, 232, 138, 71, 1, - 197, 166, 138, 71, 1, 218, 55, 138, 71, 198, 244, 205, 162, 78, 138, 71, - 207, 110, 205, 162, 78, 138, 29, 235, 134, 138, 29, 1, 224, 48, 138, 29, - 1, 205, 72, 138, 29, 1, 224, 41, 138, 29, 1, 216, 208, 138, 29, 1, 216, - 206, 138, 29, 1, 216, 205, 138, 29, 1, 202, 97, 138, 29, 1, 205, 61, 138, - 29, 1, 210, 54, 138, 29, 1, 210, 49, 138, 29, 1, 210, 46, 138, 29, 1, - 210, 39, 138, 29, 1, 210, 34, 138, 29, 1, 210, 29, 138, 29, 1, 210, 40, - 138, 29, 1, 210, 52, 138, 29, 1, 219, 56, 138, 29, 1, 212, 206, 138, 29, - 1, 205, 69, 138, 29, 1, 212, 195, 138, 29, 1, 206, 52, 138, 29, 1, 205, - 66, 138, 29, 1, 226, 143, 138, 29, 1, 245, 6, 138, 29, 1, 205, 76, 138, - 29, 1, 245, 71, 138, 29, 1, 224, 122, 138, 29, 1, 202, 191, 138, 29, 1, - 212, 244, 138, 29, 1, 232, 55, 138, 29, 1, 63, 138, 29, 1, 251, 245, 138, - 29, 1, 164, 138, 29, 1, 196, 118, 138, 29, 1, 236, 192, 138, 29, 1, 69, - 138, 29, 1, 196, 56, 138, 29, 1, 196, 69, 138, 29, 1, 72, 138, 29, 1, - 197, 166, 138, 29, 1, 197, 157, 138, 29, 1, 214, 164, 138, 29, 1, 196, 3, - 138, 29, 1, 66, 138, 29, 1, 197, 91, 138, 29, 1, 197, 109, 138, 29, 1, - 197, 70, 138, 29, 1, 195, 217, 138, 29, 1, 236, 116, 138, 29, 1, 196, 24, - 138, 29, 1, 68, 174, 247, 39, 55, 174, 212, 63, 55, 174, 216, 19, 55, - 174, 220, 114, 174, 248, 33, 154, 174, 196, 60, 55, 174, 197, 17, 55, - 138, 235, 19, 175, 199, 100, 138, 107, 51, 138, 200, 24, 51, 138, 91, 51, - 138, 237, 231, 51, 138, 58, 205, 94, 138, 59, 244, 249, 226, 30, 251, 76, - 251, 102, 226, 30, 251, 76, 207, 90, 226, 30, 251, 76, 203, 8, 214, 183, - 210, 114, 246, 255, 210, 114, 246, 255, 30, 74, 5, 250, 96, 63, 30, 74, - 5, 250, 65, 69, 30, 74, 5, 250, 74, 68, 30, 74, 5, 250, 42, 72, 30, 74, - 5, 250, 92, 66, 30, 74, 5, 250, 111, 240, 136, 30, 74, 5, 250, 58, 239, - 252, 30, 74, 5, 250, 98, 239, 152, 30, 74, 5, 250, 88, 239, 28, 30, 74, - 5, 250, 52, 237, 201, 30, 74, 5, 250, 46, 225, 214, 30, 74, 5, 250, 57, - 225, 193, 30, 74, 5, 250, 67, 225, 129, 30, 74, 5, 250, 38, 225, 110, 30, - 74, 5, 250, 26, 155, 30, 74, 5, 250, 59, 224, 209, 30, 74, 5, 250, 36, - 224, 101, 30, 74, 5, 250, 33, 224, 11, 30, 74, 5, 250, 22, 223, 187, 30, - 74, 5, 250, 23, 166, 30, 74, 5, 250, 89, 219, 207, 30, 74, 5, 250, 30, - 219, 78, 30, 74, 5, 250, 87, 218, 251, 30, 74, 5, 250, 79, 218, 145, 30, - 74, 5, 250, 100, 176, 30, 74, 5, 250, 78, 217, 118, 30, 74, 5, 250, 72, - 216, 223, 30, 74, 5, 250, 51, 216, 50, 30, 74, 5, 250, 48, 215, 186, 30, - 74, 5, 250, 107, 161, 30, 74, 5, 250, 31, 213, 92, 30, 74, 5, 250, 64, - 212, 220, 30, 74, 5, 250, 91, 212, 117, 30, 74, 5, 250, 53, 211, 227, 30, - 74, 5, 250, 86, 211, 159, 30, 74, 5, 250, 25, 211, 139, 30, 74, 5, 250, - 81, 211, 121, 30, 74, 5, 250, 70, 211, 109, 30, 74, 5, 250, 43, 169, 30, - 74, 5, 250, 75, 210, 183, 30, 74, 5, 250, 50, 210, 72, 30, 74, 5, 250, - 109, 209, 232, 30, 74, 5, 250, 76, 209, 140, 30, 74, 5, 250, 71, 183, 30, - 74, 5, 250, 94, 208, 147, 30, 74, 5, 250, 62, 206, 112, 30, 74, 5, 250, - 90, 205, 200, 30, 74, 5, 250, 45, 204, 172, 30, 74, 5, 250, 44, 189, 30, - 74, 5, 250, 105, 203, 68, 30, 74, 5, 250, 66, 202, 122, 30, 74, 5, 250, - 103, 149, 30, 74, 5, 250, 34, 201, 40, 30, 74, 5, 250, 49, 197, 166, 30, - 74, 5, 250, 28, 197, 109, 30, 74, 5, 250, 63, 197, 70, 30, 74, 5, 250, - 61, 197, 34, 30, 74, 5, 250, 85, 195, 115, 30, 74, 5, 250, 29, 195, 88, - 30, 74, 5, 250, 82, 195, 11, 30, 74, 5, 250, 77, 254, 177, 30, 74, 5, - 250, 60, 254, 65, 30, 74, 5, 250, 19, 250, 150, 30, 74, 5, 250, 32, 237, - 166, 30, 74, 5, 250, 15, 237, 165, 30, 74, 5, 250, 55, 215, 118, 30, 74, - 5, 250, 73, 211, 225, 30, 74, 5, 250, 41, 211, 229, 30, 74, 5, 250, 27, - 210, 246, 30, 74, 5, 250, 69, 210, 245, 30, 74, 5, 250, 35, 209, 225, 30, - 74, 5, 250, 37, 203, 163, 30, 74, 5, 250, 17, 200, 243, 30, 74, 5, 250, - 14, 102, 30, 74, 16, 250, 84, 30, 74, 16, 250, 83, 30, 74, 16, 250, 80, - 30, 74, 16, 250, 68, 30, 74, 16, 250, 56, 30, 74, 16, 250, 54, 30, 74, - 16, 250, 47, 30, 74, 16, 250, 40, 30, 74, 16, 250, 39, 30, 74, 16, 250, - 24, 30, 74, 16, 250, 21, 30, 74, 16, 250, 20, 30, 74, 16, 250, 18, 30, - 74, 16, 250, 16, 30, 74, 147, 250, 13, 220, 62, 30, 74, 147, 250, 12, - 197, 21, 30, 74, 147, 250, 11, 239, 234, 30, 74, 147, 250, 10, 236, 169, - 30, 74, 147, 250, 9, 220, 29, 30, 74, 147, 250, 8, 205, 15, 30, 74, 147, - 250, 7, 236, 97, 30, 74, 147, 250, 6, 210, 210, 30, 74, 147, 250, 5, 206, - 254, 30, 74, 147, 250, 4, 232, 139, 30, 74, 147, 250, 3, 205, 156, 30, - 74, 147, 250, 2, 248, 114, 30, 74, 147, 250, 1, 241, 83, 30, 74, 147, - 250, 0, 248, 7, 30, 74, 147, 249, 255, 197, 79, 30, 74, 147, 249, 254, - 249, 76, 30, 74, 147, 249, 253, 214, 129, 30, 74, 147, 249, 252, 205, - 126, 30, 74, 147, 249, 251, 240, 239, 30, 74, 218, 205, 249, 250, 225, 4, - 30, 74, 218, 205, 249, 249, 225, 15, 30, 74, 147, 249, 248, 214, 144, 30, - 74, 147, 249, 247, 197, 46, 30, 74, 147, 249, 246, 30, 74, 218, 205, 249, - 245, 250, 244, 30, 74, 218, 205, 249, 244, 219, 156, 30, 74, 147, 249, - 243, 248, 32, 30, 74, 147, 249, 242, 233, 135, 30, 74, 147, 249, 241, 30, - 74, 147, 249, 240, 197, 12, 30, 74, 147, 249, 239, 30, 74, 147, 249, 238, - 30, 74, 147, 249, 237, 231, 102, 30, 74, 147, 249, 236, 30, 74, 147, 249, - 235, 30, 74, 147, 249, 234, 30, 74, 218, 205, 249, 232, 201, 2, 30, 74, - 147, 249, 231, 30, 74, 147, 249, 230, 30, 74, 147, 249, 229, 244, 197, - 30, 74, 147, 249, 228, 30, 74, 147, 249, 227, 30, 74, 147, 249, 226, 234, - 79, 30, 74, 147, 249, 225, 250, 229, 30, 74, 147, 249, 224, 30, 74, 147, - 249, 223, 30, 74, 147, 249, 222, 30, 74, 147, 249, 221, 30, 74, 147, 249, - 220, 30, 74, 147, 249, 219, 30, 74, 147, 249, 218, 30, 74, 147, 249, 217, - 30, 74, 147, 249, 216, 30, 74, 147, 249, 215, 218, 197, 30, 74, 147, 249, - 214, 30, 74, 147, 249, 213, 201, 190, 30, 74, 147, 249, 212, 30, 74, 147, - 249, 211, 30, 74, 147, 249, 210, 30, 74, 147, 249, 209, 30, 74, 147, 249, - 208, 30, 74, 147, 249, 207, 30, 74, 147, 249, 206, 30, 74, 147, 249, 205, - 30, 74, 147, 249, 204, 30, 74, 147, 249, 203, 30, 74, 147, 249, 202, 30, - 74, 147, 249, 201, 232, 103, 30, 74, 147, 249, 180, 235, 33, 30, 74, 147, - 249, 177, 249, 51, 30, 74, 147, 249, 172, 205, 134, 30, 74, 147, 249, - 171, 51, 30, 74, 147, 249, 170, 30, 74, 147, 249, 169, 204, 48, 30, 74, - 147, 249, 168, 30, 74, 147, 249, 167, 30, 74, 147, 249, 166, 197, 74, - 245, 112, 30, 74, 147, 249, 165, 245, 112, 30, 74, 147, 249, 164, 245, - 113, 234, 250, 30, 74, 147, 249, 163, 197, 77, 30, 74, 147, 249, 162, 30, - 74, 147, 249, 161, 30, 74, 218, 205, 249, 160, 239, 87, 30, 74, 147, 249, - 159, 30, 74, 147, 249, 158, 30, 74, 147, 249, 156, 30, 74, 147, 249, 155, - 30, 74, 147, 249, 154, 30, 74, 147, 249, 153, 240, 68, 30, 74, 147, 249, - 152, 30, 74, 147, 249, 151, 30, 74, 147, 249, 150, 30, 74, 147, 249, 149, - 30, 74, 147, 249, 148, 30, 74, 147, 199, 47, 249, 233, 30, 74, 147, 199, - 47, 249, 200, 30, 74, 147, 199, 47, 249, 199, 30, 74, 147, 199, 47, 249, - 198, 30, 74, 147, 199, 47, 249, 197, 30, 74, 147, 199, 47, 249, 196, 30, - 74, 147, 199, 47, 249, 195, 30, 74, 147, 199, 47, 249, 194, 30, 74, 147, - 199, 47, 249, 193, 30, 74, 147, 199, 47, 249, 192, 30, 74, 147, 199, 47, - 249, 191, 30, 74, 147, 199, 47, 249, 190, 30, 74, 147, 199, 47, 249, 189, - 30, 74, 147, 199, 47, 249, 188, 30, 74, 147, 199, 47, 249, 187, 30, 74, - 147, 199, 47, 249, 186, 30, 74, 147, 199, 47, 249, 185, 30, 74, 147, 199, - 47, 249, 184, 30, 74, 147, 199, 47, 249, 183, 30, 74, 147, 199, 47, 249, - 182, 30, 74, 147, 199, 47, 249, 181, 30, 74, 147, 199, 47, 249, 179, 30, - 74, 147, 199, 47, 249, 178, 30, 74, 147, 199, 47, 249, 176, 30, 74, 147, - 199, 47, 249, 175, 30, 74, 147, 199, 47, 249, 174, 30, 74, 147, 199, 47, - 249, 173, 30, 74, 147, 199, 47, 249, 157, 30, 74, 147, 199, 47, 249, 147, - 251, 238, 197, 9, 207, 91, 222, 75, 251, 238, 197, 9, 207, 91, 238, 253, - 251, 238, 245, 102, 78, 251, 238, 31, 100, 251, 238, 31, 102, 251, 238, - 31, 134, 251, 238, 31, 136, 251, 238, 31, 146, 251, 238, 31, 167, 251, - 238, 31, 178, 251, 238, 31, 171, 251, 238, 31, 182, 251, 238, 31, 203, - 23, 251, 238, 31, 200, 234, 251, 238, 31, 202, 177, 251, 238, 31, 235, - 14, 251, 238, 31, 235, 145, 251, 238, 31, 206, 13, 251, 238, 31, 207, 65, - 251, 238, 31, 237, 20, 251, 238, 31, 216, 174, 251, 238, 31, 97, 231, 57, - 251, 238, 31, 99, 231, 57, 251, 238, 31, 115, 231, 57, 251, 238, 31, 235, - 7, 231, 57, 251, 238, 31, 235, 101, 231, 57, 251, 238, 31, 206, 29, 231, - 57, 251, 238, 31, 207, 71, 231, 57, 251, 238, 31, 237, 31, 231, 57, 251, - 238, 31, 216, 179, 231, 57, 251, 238, 31, 97, 170, 251, 238, 31, 99, 170, - 251, 238, 31, 115, 170, 251, 238, 31, 235, 7, 170, 251, 238, 31, 235, - 101, 170, 251, 238, 31, 206, 29, 170, 251, 238, 31, 207, 71, 170, 251, - 238, 31, 237, 31, 170, 251, 238, 31, 216, 179, 170, 251, 238, 31, 203, - 24, 170, 251, 238, 31, 200, 235, 170, 251, 238, 31, 202, 178, 170, 251, - 238, 31, 235, 15, 170, 251, 238, 31, 235, 146, 170, 251, 238, 31, 206, - 14, 170, 251, 238, 31, 207, 66, 170, 251, 238, 31, 237, 21, 170, 251, - 238, 31, 216, 175, 170, 251, 238, 197, 94, 249, 67, 200, 49, 251, 238, - 197, 94, 235, 113, 204, 137, 251, 238, 197, 94, 208, 136, 204, 137, 251, - 238, 197, 94, 202, 185, 204, 137, 251, 238, 197, 94, 235, 0, 204, 137, - 251, 238, 237, 204, 219, 203, 235, 113, 204, 137, 251, 238, 222, 56, 219, - 203, 235, 113, 204, 137, 251, 238, 219, 203, 208, 136, 204, 137, 251, - 238, 219, 203, 202, 185, 204, 137, 32, 252, 13, 250, 152, 97, 211, 87, - 32, 252, 13, 250, 152, 97, 232, 225, 32, 252, 13, 250, 152, 97, 237, 227, - 32, 252, 13, 250, 152, 146, 32, 252, 13, 250, 152, 235, 145, 32, 252, 13, - 250, 152, 235, 101, 231, 57, 32, 252, 13, 250, 152, 235, 101, 170, 32, - 252, 13, 250, 152, 235, 146, 170, 32, 252, 13, 250, 152, 235, 101, 203, - 123, 32, 252, 13, 250, 152, 203, 24, 203, 123, 32, 252, 13, 250, 152, - 235, 146, 203, 123, 32, 252, 13, 250, 152, 97, 231, 58, 203, 123, 32, - 252, 13, 250, 152, 235, 101, 231, 58, 203, 123, 32, 252, 13, 250, 152, - 97, 202, 159, 203, 123, 32, 252, 13, 250, 152, 235, 101, 202, 159, 203, - 123, 32, 252, 13, 250, 152, 235, 101, 204, 255, 32, 252, 13, 250, 152, - 203, 24, 204, 255, 32, 252, 13, 250, 152, 235, 146, 204, 255, 32, 252, - 13, 250, 152, 97, 231, 58, 204, 255, 32, 252, 13, 250, 152, 235, 101, - 231, 58, 204, 255, 32, 252, 13, 250, 152, 97, 202, 159, 204, 255, 32, - 252, 13, 250, 152, 203, 24, 202, 159, 204, 255, 32, 252, 13, 250, 152, - 235, 146, 202, 159, 204, 255, 32, 252, 13, 250, 152, 203, 24, 218, 254, - 32, 252, 13, 232, 97, 97, 212, 135, 32, 252, 13, 202, 201, 100, 32, 252, - 13, 232, 93, 100, 32, 252, 13, 236, 178, 102, 32, 252, 13, 202, 201, 102, - 32, 252, 13, 240, 236, 99, 237, 226, 32, 252, 13, 236, 178, 99, 237, 226, - 32, 252, 13, 201, 156, 146, 32, 252, 13, 201, 156, 203, 23, 32, 252, 13, - 201, 156, 203, 24, 251, 131, 20, 32, 252, 13, 232, 93, 203, 23, 32, 252, - 13, 219, 145, 203, 23, 32, 252, 13, 202, 201, 203, 23, 32, 252, 13, 202, - 201, 202, 177, 32, 252, 13, 201, 156, 235, 145, 32, 252, 13, 201, 156, - 235, 146, 251, 131, 20, 32, 252, 13, 232, 93, 235, 145, 32, 252, 13, 202, - 201, 235, 145, 32, 252, 13, 202, 201, 97, 231, 57, 32, 252, 13, 202, 201, - 115, 231, 57, 32, 252, 13, 236, 178, 235, 101, 231, 57, 32, 252, 13, 201, - 156, 235, 101, 231, 57, 32, 252, 13, 202, 201, 235, 101, 231, 57, 32, - 252, 13, 247, 96, 235, 101, 231, 57, 32, 252, 13, 217, 196, 235, 101, - 231, 57, 32, 252, 13, 202, 201, 97, 170, 32, 252, 13, 202, 201, 235, 101, - 170, 32, 252, 13, 239, 215, 235, 101, 218, 254, 32, 252, 13, 204, 214, - 235, 146, 218, 254, 32, 97, 157, 55, 32, 97, 157, 2, 251, 131, 20, 32, - 99, 202, 182, 55, 32, 115, 211, 86, 55, 32, 196, 67, 55, 32, 203, 124, - 55, 32, 237, 228, 55, 32, 214, 180, 55, 32, 99, 214, 179, 55, 32, 115, - 214, 179, 55, 32, 235, 7, 214, 179, 55, 32, 235, 101, 214, 179, 55, 32, - 219, 139, 55, 32, 223, 108, 249, 67, 55, 32, 222, 49, 55, 32, 214, 36, - 55, 32, 196, 199, 55, 32, 250, 209, 55, 32, 250, 225, 55, 32, 233, 110, - 55, 32, 201, 116, 249, 67, 55, 32, 195, 80, 55, 32, 97, 211, 88, 55, 32, - 206, 54, 55, 32, 226, 67, 55, 216, 39, 55, 209, 208, 207, 62, 55, 209, - 208, 200, 65, 55, 209, 208, 207, 97, 55, 209, 208, 207, 60, 55, 209, 208, - 239, 102, 207, 60, 55, 209, 208, 206, 77, 55, 209, 208, 239, 211, 55, - 209, 208, 211, 71, 55, 209, 208, 207, 78, 55, 209, 208, 237, 180, 55, - 209, 208, 250, 203, 55, 209, 208, 247, 32, 55, 32, 16, 203, 90, 210, 74, - 213, 1, 239, 79, 2, 213, 81, 213, 1, 239, 79, 2, 212, 127, 232, 137, 213, - 1, 239, 79, 2, 203, 93, 232, 137, 213, 1, 239, 79, 2, 247, 119, 213, 1, - 239, 79, 2, 245, 66, 213, 1, 239, 79, 2, 197, 21, 213, 1, 239, 79, 2, - 232, 103, 213, 1, 239, 79, 2, 234, 71, 213, 1, 239, 79, 2, 202, 113, 213, - 1, 239, 79, 2, 51, 213, 1, 239, 79, 2, 248, 77, 213, 1, 239, 79, 2, 206, - 220, 213, 1, 239, 79, 2, 244, 190, 213, 1, 239, 79, 2, 220, 61, 213, 1, - 239, 79, 2, 220, 0, 213, 1, 239, 79, 2, 208, 185, 213, 1, 239, 79, 2, - 222, 104, 213, 1, 239, 79, 2, 248, 98, 213, 1, 239, 79, 2, 247, 103, 212, - 142, 213, 1, 239, 79, 2, 239, 11, 213, 1, 239, 79, 2, 244, 165, 213, 1, - 239, 79, 2, 205, 235, 213, 1, 239, 79, 2, 244, 166, 213, 1, 239, 79, 2, - 248, 248, 213, 1, 239, 79, 2, 206, 207, 213, 1, 239, 79, 2, 231, 102, - 213, 1, 239, 79, 2, 232, 61, 213, 1, 239, 79, 2, 248, 2, 222, 172, 213, - 1, 239, 79, 2, 247, 92, 213, 1, 239, 79, 2, 210, 210, 213, 1, 239, 79, 2, - 237, 79, 213, 1, 239, 79, 2, 237, 236, 213, 1, 239, 79, 2, 201, 18, 213, - 1, 239, 79, 2, 248, 251, 213, 1, 239, 79, 2, 212, 143, 201, 190, 213, 1, - 239, 79, 2, 199, 14, 213, 1, 239, 79, 2, 213, 158, 213, 1, 239, 79, 2, - 209, 197, 213, 1, 239, 79, 2, 222, 88, 213, 1, 239, 79, 2, 214, 14, 249, - 138, 213, 1, 239, 79, 2, 235, 58, 213, 1, 239, 79, 2, 233, 102, 213, 1, - 239, 79, 2, 204, 215, 213, 1, 239, 79, 2, 4, 250, 123, 213, 1, 239, 79, - 2, 197, 119, 249, 89, 213, 1, 239, 79, 2, 38, 214, 182, 106, 221, 149, 1, - 63, 221, 149, 1, 69, 221, 149, 1, 250, 112, 221, 149, 1, 248, 198, 221, - 149, 1, 234, 190, 221, 149, 1, 240, 231, 221, 149, 1, 68, 221, 149, 1, - 197, 199, 221, 149, 1, 195, 158, 221, 149, 1, 202, 235, 221, 149, 1, 225, - 217, 221, 149, 1, 225, 80, 221, 149, 1, 211, 167, 221, 149, 1, 159, 221, - 149, 1, 221, 136, 221, 149, 1, 218, 55, 221, 149, 1, 219, 0, 221, 149, 1, - 216, 87, 221, 149, 1, 66, 221, 149, 1, 214, 3, 221, 149, 1, 224, 37, 221, - 149, 1, 144, 221, 149, 1, 209, 80, 221, 149, 1, 203, 216, 221, 149, 1, - 201, 81, 221, 149, 1, 251, 106, 221, 149, 1, 236, 230, 221, 149, 1, 233, - 15, 221, 149, 1, 196, 222, 247, 109, 1, 63, 247, 109, 1, 213, 245, 247, - 109, 1, 240, 231, 247, 109, 1, 159, 247, 109, 1, 199, 243, 247, 109, 1, - 144, 247, 109, 1, 222, 201, 247, 109, 1, 254, 177, 247, 109, 1, 211, 167, - 247, 109, 1, 250, 112, 247, 109, 1, 221, 136, 247, 109, 1, 72, 247, 109, - 1, 240, 138, 247, 109, 1, 203, 216, 247, 109, 1, 207, 52, 247, 109, 1, - 207, 51, 247, 109, 1, 209, 80, 247, 109, 1, 247, 206, 247, 109, 1, 66, - 247, 109, 1, 216, 87, 247, 109, 1, 196, 222, 247, 109, 1, 218, 55, 247, - 109, 1, 201, 80, 247, 109, 1, 214, 3, 247, 109, 1, 205, 83, 247, 109, 1, - 68, 247, 109, 1, 69, 247, 109, 1, 199, 240, 247, 109, 1, 225, 80, 247, - 109, 1, 225, 71, 247, 109, 1, 217, 161, 247, 109, 1, 199, 245, 247, 109, - 1, 234, 190, 247, 109, 1, 234, 125, 247, 109, 1, 205, 23, 247, 109, 1, - 205, 22, 247, 109, 1, 217, 73, 247, 109, 1, 226, 120, 247, 109, 1, 247, - 205, 247, 109, 1, 201, 81, 247, 109, 1, 199, 242, 247, 109, 1, 209, 182, - 247, 109, 1, 219, 246, 247, 109, 1, 219, 245, 247, 109, 1, 219, 244, 247, - 109, 1, 219, 243, 247, 109, 1, 222, 200, 247, 109, 1, 237, 83, 247, 109, - 1, 199, 241, 88, 236, 181, 202, 158, 78, 88, 236, 181, 17, 100, 88, 236, - 181, 17, 102, 88, 236, 181, 17, 134, 88, 236, 181, 17, 136, 88, 236, 181, - 17, 146, 88, 236, 181, 17, 167, 88, 236, 181, 17, 178, 88, 236, 181, 17, - 171, 88, 236, 181, 17, 182, 88, 236, 181, 31, 203, 23, 88, 236, 181, 31, - 200, 234, 88, 236, 181, 31, 202, 177, 88, 236, 181, 31, 235, 14, 88, 236, - 181, 31, 235, 145, 88, 236, 181, 31, 206, 13, 88, 236, 181, 31, 207, 65, - 88, 236, 181, 31, 237, 20, 88, 236, 181, 31, 216, 174, 88, 236, 181, 31, - 97, 231, 57, 88, 236, 181, 31, 99, 231, 57, 88, 236, 181, 31, 115, 231, - 57, 88, 236, 181, 31, 235, 7, 231, 57, 88, 236, 181, 31, 235, 101, 231, - 57, 88, 236, 181, 31, 206, 29, 231, 57, 88, 236, 181, 31, 207, 71, 231, - 57, 88, 236, 181, 31, 237, 31, 231, 57, 88, 236, 181, 31, 216, 179, 231, - 57, 37, 41, 1, 63, 37, 41, 1, 249, 9, 37, 41, 1, 224, 209, 37, 41, 1, - 239, 252, 37, 41, 1, 69, 37, 41, 1, 199, 118, 37, 41, 1, 195, 88, 37, 41, - 1, 232, 147, 37, 41, 1, 202, 217, 37, 41, 1, 68, 37, 41, 1, 155, 37, 41, - 1, 237, 7, 37, 41, 1, 236, 241, 37, 41, 1, 236, 230, 37, 41, 1, 236, 141, - 37, 41, 1, 72, 37, 41, 1, 213, 92, 37, 41, 1, 206, 255, 37, 41, 1, 223, - 187, 37, 41, 1, 236, 163, 37, 41, 1, 236, 151, 37, 41, 1, 203, 68, 37, - 41, 1, 66, 37, 41, 1, 237, 10, 37, 41, 1, 212, 249, 37, 41, 1, 224, 131, - 37, 41, 1, 237, 47, 37, 41, 1, 236, 153, 37, 41, 1, 245, 103, 37, 41, 1, - 226, 120, 37, 41, 1, 199, 245, 37, 41, 1, 236, 134, 37, 41, 215, 142, - 100, 37, 41, 215, 142, 146, 37, 41, 215, 142, 203, 23, 37, 41, 215, 142, - 235, 145, 37, 41, 1, 196, 69, 37, 41, 1, 216, 23, 201, 107, 37, 41, 1, - 205, 157, 201, 107, 233, 120, 1, 251, 203, 233, 120, 1, 249, 109, 233, - 120, 1, 233, 189, 233, 120, 1, 240, 117, 233, 120, 1, 251, 198, 233, 120, - 1, 211, 150, 233, 120, 1, 225, 229, 233, 120, 1, 232, 238, 233, 120, 1, - 202, 171, 233, 120, 1, 237, 18, 233, 120, 1, 223, 146, 233, 120, 1, 223, - 58, 233, 120, 1, 220, 52, 233, 120, 1, 217, 198, 233, 120, 1, 225, 185, - 233, 120, 1, 200, 7, 233, 120, 1, 213, 218, 233, 120, 1, 216, 174, 233, - 120, 1, 210, 223, 233, 120, 1, 208, 189, 233, 120, 1, 203, 38, 233, 120, - 1, 197, 44, 233, 120, 1, 235, 219, 233, 120, 1, 226, 124, 233, 120, 1, - 231, 41, 233, 120, 1, 214, 48, 233, 120, 1, 216, 179, 231, 57, 37, 213, - 36, 1, 251, 106, 37, 213, 36, 1, 247, 244, 37, 213, 36, 1, 234, 107, 37, - 213, 36, 1, 239, 15, 37, 213, 36, 1, 69, 37, 213, 36, 1, 195, 56, 37, - 213, 36, 1, 237, 148, 37, 213, 36, 1, 195, 96, 37, 213, 36, 1, 237, 146, - 37, 213, 36, 1, 68, 37, 213, 36, 1, 223, 251, 37, 213, 36, 1, 222, 168, - 37, 213, 36, 1, 219, 162, 37, 213, 36, 1, 217, 99, 37, 213, 36, 1, 198, - 232, 37, 213, 36, 1, 213, 78, 37, 213, 36, 1, 210, 141, 37, 213, 36, 1, - 206, 84, 37, 213, 36, 1, 203, 137, 37, 213, 36, 1, 66, 37, 213, 36, 1, - 245, 84, 37, 213, 36, 1, 206, 189, 37, 213, 36, 1, 207, 1, 37, 213, 36, - 1, 195, 219, 37, 213, 36, 1, 196, 47, 37, 213, 36, 1, 72, 37, 213, 36, 1, - 214, 102, 37, 213, 36, 1, 237, 47, 37, 213, 36, 1, 142, 37, 213, 36, 1, - 201, 91, 37, 213, 36, 1, 199, 105, 37, 213, 36, 1, 196, 51, 37, 213, 36, - 1, 196, 49, 37, 213, 36, 1, 196, 84, 37, 213, 36, 1, 226, 147, 37, 213, - 36, 1, 195, 217, 37, 213, 36, 1, 164, 37, 213, 36, 1, 230, 210, 38, 37, - 213, 36, 1, 251, 106, 38, 37, 213, 36, 1, 239, 15, 38, 37, 213, 36, 1, - 195, 96, 38, 37, 213, 36, 1, 217, 99, 38, 37, 213, 36, 1, 206, 84, 200, - 93, 1, 251, 138, 200, 93, 1, 248, 206, 200, 93, 1, 234, 95, 200, 93, 1, - 224, 146, 200, 93, 1, 239, 212, 200, 93, 1, 231, 193, 200, 93, 1, 197, - 34, 200, 93, 1, 195, 78, 200, 93, 1, 231, 94, 200, 93, 1, 203, 1, 200, - 93, 1, 195, 241, 200, 93, 1, 225, 35, 200, 93, 1, 206, 211, 200, 93, 1, - 222, 245, 200, 93, 1, 219, 171, 200, 93, 1, 239, 172, 200, 93, 1, 215, - 138, 200, 93, 1, 194, 255, 200, 93, 1, 208, 224, 200, 93, 1, 251, 194, - 200, 93, 1, 211, 227, 200, 93, 1, 209, 7, 200, 93, 1, 211, 102, 200, 93, - 1, 210, 201, 200, 93, 1, 202, 221, 200, 93, 1, 233, 225, 200, 93, 1, 149, - 200, 93, 1, 68, 200, 93, 1, 66, 200, 93, 1, 205, 34, 200, 93, 197, 9, - 239, 59, 37, 213, 30, 2, 63, 37, 213, 30, 2, 68, 37, 213, 30, 2, 66, 37, - 213, 30, 2, 155, 37, 213, 30, 2, 223, 187, 37, 213, 30, 2, 234, 123, 37, - 213, 30, 2, 233, 76, 37, 213, 30, 2, 196, 208, 37, 213, 30, 2, 247, 174, - 37, 213, 30, 2, 225, 214, 37, 213, 30, 2, 225, 172, 37, 213, 30, 2, 189, - 37, 213, 30, 2, 201, 40, 37, 213, 30, 2, 240, 136, 37, 213, 30, 2, 239, - 152, 37, 213, 30, 2, 237, 201, 37, 213, 30, 2, 202, 233, 37, 213, 30, 2, - 161, 37, 213, 30, 2, 249, 145, 37, 213, 30, 2, 235, 239, 37, 213, 30, 2, - 176, 37, 213, 30, 2, 215, 186, 37, 213, 30, 2, 166, 37, 213, 30, 2, 219, - 78, 37, 213, 30, 2, 218, 145, 37, 213, 30, 2, 164, 37, 213, 30, 2, 199, - 152, 37, 213, 30, 2, 199, 34, 37, 213, 30, 2, 169, 37, 213, 30, 2, 209, - 140, 37, 213, 30, 2, 172, 37, 213, 30, 2, 183, 37, 213, 30, 2, 195, 115, - 37, 213, 30, 2, 207, 50, 37, 213, 30, 2, 205, 80, 37, 213, 30, 2, 142, - 37, 213, 30, 2, 250, 144, 37, 213, 30, 2, 250, 143, 37, 213, 30, 2, 250, - 142, 37, 213, 30, 2, 196, 178, 37, 213, 30, 2, 240, 113, 37, 213, 30, 2, - 240, 112, 37, 213, 30, 2, 249, 120, 37, 213, 30, 2, 247, 226, 37, 213, - 30, 197, 9, 239, 59, 37, 213, 30, 31, 100, 37, 213, 30, 31, 102, 37, 213, - 30, 31, 203, 23, 37, 213, 30, 31, 200, 234, 37, 213, 30, 31, 231, 57, - 239, 192, 6, 1, 181, 68, 239, 192, 6, 1, 181, 69, 239, 192, 6, 1, 181, - 63, 239, 192, 6, 1, 181, 251, 209, 239, 192, 6, 1, 181, 72, 239, 192, 6, - 1, 181, 214, 102, 239, 192, 6, 1, 206, 182, 68, 239, 192, 6, 1, 206, 182, - 69, 239, 192, 6, 1, 206, 182, 63, 239, 192, 6, 1, 206, 182, 251, 209, - 239, 192, 6, 1, 206, 182, 72, 239, 192, 6, 1, 206, 182, 214, 102, 239, - 192, 6, 1, 250, 122, 239, 192, 6, 1, 214, 16, 239, 192, 6, 1, 196, 243, - 239, 192, 6, 1, 196, 66, 239, 192, 6, 1, 233, 15, 239, 192, 6, 1, 213, - 79, 239, 192, 6, 1, 248, 251, 239, 192, 6, 1, 203, 48, 239, 192, 6, 1, - 239, 237, 239, 192, 6, 1, 245, 99, 239, 192, 6, 1, 225, 191, 239, 192, 6, - 1, 224, 216, 239, 192, 6, 1, 234, 69, 239, 192, 6, 1, 237, 47, 239, 192, - 6, 1, 199, 113, 239, 192, 6, 1, 236, 121, 239, 192, 6, 1, 202, 215, 239, - 192, 6, 1, 236, 151, 239, 192, 6, 1, 195, 85, 239, 192, 6, 1, 236, 141, - 239, 192, 6, 1, 195, 64, 239, 192, 6, 1, 236, 163, 239, 192, 6, 1, 237, - 7, 239, 192, 6, 1, 236, 241, 239, 192, 6, 1, 236, 230, 239, 192, 6, 1, - 236, 215, 239, 192, 6, 1, 214, 146, 239, 192, 6, 1, 236, 98, 239, 192, 4, - 1, 181, 68, 239, 192, 4, 1, 181, 69, 239, 192, 4, 1, 181, 63, 239, 192, - 4, 1, 181, 251, 209, 239, 192, 4, 1, 181, 72, 239, 192, 4, 1, 181, 214, - 102, 239, 192, 4, 1, 206, 182, 68, 239, 192, 4, 1, 206, 182, 69, 239, - 192, 4, 1, 206, 182, 63, 239, 192, 4, 1, 206, 182, 251, 209, 239, 192, 4, - 1, 206, 182, 72, 239, 192, 4, 1, 206, 182, 214, 102, 239, 192, 4, 1, 250, - 122, 239, 192, 4, 1, 214, 16, 239, 192, 4, 1, 196, 243, 239, 192, 4, 1, - 196, 66, 239, 192, 4, 1, 233, 15, 239, 192, 4, 1, 213, 79, 239, 192, 4, - 1, 248, 251, 239, 192, 4, 1, 203, 48, 239, 192, 4, 1, 239, 237, 239, 192, - 4, 1, 245, 99, 239, 192, 4, 1, 225, 191, 239, 192, 4, 1, 224, 216, 239, - 192, 4, 1, 234, 69, 239, 192, 4, 1, 237, 47, 239, 192, 4, 1, 199, 113, - 239, 192, 4, 1, 236, 121, 239, 192, 4, 1, 202, 215, 239, 192, 4, 1, 236, - 151, 239, 192, 4, 1, 195, 85, 239, 192, 4, 1, 236, 141, 239, 192, 4, 1, - 195, 64, 239, 192, 4, 1, 236, 163, 239, 192, 4, 1, 237, 7, 239, 192, 4, - 1, 236, 241, 239, 192, 4, 1, 236, 230, 239, 192, 4, 1, 236, 215, 239, - 192, 4, 1, 214, 146, 239, 192, 4, 1, 236, 98, 207, 6, 1, 213, 76, 207, 6, - 1, 201, 229, 207, 6, 1, 224, 89, 207, 6, 1, 235, 182, 207, 6, 1, 202, - 190, 207, 6, 1, 205, 200, 207, 6, 1, 204, 85, 207, 6, 1, 245, 22, 207, 6, - 1, 196, 68, 207, 6, 1, 231, 54, 207, 6, 1, 248, 183, 207, 6, 1, 239, 251, - 207, 6, 1, 234, 109, 207, 6, 1, 198, 227, 207, 6, 1, 202, 196, 207, 6, 1, - 195, 8, 207, 6, 1, 219, 202, 207, 6, 1, 225, 108, 207, 6, 1, 197, 25, - 207, 6, 1, 232, 248, 207, 6, 1, 221, 245, 207, 6, 1, 219, 24, 207, 6, 1, - 226, 127, 207, 6, 1, 237, 45, 207, 6, 1, 250, 195, 207, 6, 1, 251, 250, - 207, 6, 1, 214, 119, 207, 6, 1, 197, 12, 207, 6, 1, 214, 34, 207, 6, 1, - 251, 209, 207, 6, 1, 209, 223, 207, 6, 1, 215, 138, 207, 6, 1, 237, 65, - 207, 6, 1, 251, 214, 207, 6, 1, 230, 201, 207, 6, 1, 200, 36, 207, 6, 1, - 214, 188, 207, 6, 1, 214, 94, 207, 6, 1, 214, 144, 207, 6, 1, 250, 125, - 207, 6, 1, 250, 246, 207, 6, 1, 214, 72, 207, 6, 1, 251, 189, 207, 6, 1, - 236, 155, 207, 6, 1, 250, 222, 207, 6, 1, 237, 76, 207, 6, 1, 230, 209, - 207, 6, 1, 196, 30, 214, 50, 1, 251, 164, 214, 50, 1, 249, 145, 214, 50, - 1, 189, 214, 50, 1, 225, 214, 214, 50, 1, 196, 208, 214, 50, 1, 224, 146, - 214, 50, 1, 239, 236, 214, 50, 1, 169, 214, 50, 1, 183, 214, 50, 1, 206, - 217, 214, 50, 1, 239, 176, 214, 50, 1, 247, 82, 214, 50, 1, 234, 123, - 214, 50, 1, 235, 239, 214, 50, 1, 211, 157, 214, 50, 1, 225, 51, 214, 50, - 1, 223, 78, 214, 50, 1, 219, 38, 214, 50, 1, 215, 122, 214, 50, 1, 197, - 117, 214, 50, 1, 142, 214, 50, 1, 164, 214, 50, 1, 63, 214, 50, 1, 69, - 214, 50, 1, 68, 214, 50, 1, 72, 214, 50, 1, 66, 214, 50, 1, 252, 168, - 214, 50, 1, 237, 54, 214, 50, 1, 214, 102, 214, 50, 17, 195, 79, 214, 50, - 17, 100, 214, 50, 17, 102, 214, 50, 17, 134, 214, 50, 17, 136, 214, 50, - 17, 146, 214, 50, 17, 167, 214, 50, 17, 178, 214, 50, 17, 171, 214, 50, - 17, 182, 214, 52, 6, 1, 63, 214, 52, 6, 1, 251, 200, 214, 52, 6, 1, 251, - 194, 214, 52, 6, 1, 251, 209, 214, 52, 6, 1, 248, 64, 214, 52, 6, 1, 247, - 16, 214, 52, 6, 1, 237, 39, 214, 52, 6, 1, 69, 214, 52, 6, 1, 237, 19, - 214, 52, 6, 1, 142, 214, 52, 6, 1, 231, 11, 214, 52, 6, 1, 68, 214, 52, - 6, 1, 155, 214, 52, 6, 1, 237, 38, 214, 52, 6, 1, 223, 110, 214, 52, 6, - 1, 172, 214, 52, 6, 1, 166, 214, 52, 6, 1, 176, 214, 52, 6, 1, 72, 214, - 52, 6, 1, 214, 143, 214, 52, 6, 1, 161, 214, 52, 6, 1, 237, 37, 214, 52, - 6, 1, 183, 214, 52, 6, 1, 207, 50, 214, 52, 6, 1, 189, 214, 52, 6, 1, - 237, 36, 214, 52, 6, 1, 201, 113, 214, 52, 6, 1, 237, 35, 214, 52, 6, 1, - 201, 103, 214, 52, 6, 1, 239, 176, 214, 52, 6, 1, 66, 214, 52, 6, 1, 197, - 166, 214, 52, 6, 1, 224, 146, 214, 52, 6, 1, 233, 230, 214, 52, 6, 1, - 195, 115, 214, 52, 6, 1, 195, 74, 214, 52, 4, 1, 63, 214, 52, 4, 1, 251, - 200, 214, 52, 4, 1, 251, 194, 214, 52, 4, 1, 251, 209, 214, 52, 4, 1, - 248, 64, 214, 52, 4, 1, 247, 16, 214, 52, 4, 1, 237, 39, 214, 52, 4, 1, - 69, 214, 52, 4, 1, 237, 19, 214, 52, 4, 1, 142, 214, 52, 4, 1, 231, 11, - 214, 52, 4, 1, 68, 214, 52, 4, 1, 155, 214, 52, 4, 1, 237, 38, 214, 52, - 4, 1, 223, 110, 214, 52, 4, 1, 172, 214, 52, 4, 1, 166, 214, 52, 4, 1, - 176, 214, 52, 4, 1, 72, 214, 52, 4, 1, 214, 143, 214, 52, 4, 1, 161, 214, - 52, 4, 1, 237, 37, 214, 52, 4, 1, 183, 214, 52, 4, 1, 207, 50, 214, 52, - 4, 1, 189, 214, 52, 4, 1, 237, 36, 214, 52, 4, 1, 201, 113, 214, 52, 4, - 1, 237, 35, 214, 52, 4, 1, 201, 103, 214, 52, 4, 1, 239, 176, 214, 52, 4, - 1, 66, 214, 52, 4, 1, 197, 166, 214, 52, 4, 1, 224, 146, 214, 52, 4, 1, - 233, 230, 214, 52, 4, 1, 195, 115, 214, 52, 4, 1, 195, 74, 237, 3, 1, 63, - 237, 3, 1, 249, 9, 237, 3, 1, 247, 57, 237, 3, 1, 245, 103, 237, 3, 1, - 239, 252, 237, 3, 1, 217, 151, 237, 3, 1, 239, 167, 237, 3, 1, 237, 33, - 237, 3, 1, 69, 237, 3, 1, 235, 189, 237, 3, 1, 234, 48, 237, 3, 1, 233, - 161, 237, 3, 1, 232, 147, 237, 3, 1, 68, 237, 3, 1, 225, 193, 237, 3, 1, - 224, 209, 237, 3, 1, 222, 197, 237, 3, 1, 222, 32, 237, 3, 1, 219, 207, - 237, 3, 1, 217, 118, 237, 3, 1, 176, 237, 3, 1, 216, 157, 237, 3, 1, 72, - 237, 3, 1, 213, 92, 237, 3, 1, 211, 139, 237, 3, 1, 210, 183, 237, 3, 1, - 209, 176, 237, 3, 1, 208, 147, 237, 3, 1, 206, 255, 237, 3, 1, 203, 68, - 237, 3, 1, 202, 217, 237, 3, 1, 66, 237, 3, 1, 199, 118, 237, 3, 1, 196, - 202, 237, 3, 1, 196, 148, 237, 3, 1, 195, 88, 237, 3, 1, 195, 65, 237, 3, - 1, 233, 216, 237, 3, 1, 233, 222, 237, 3, 1, 224, 131, 247, 89, 251, 165, - 1, 251, 133, 247, 89, 251, 165, 1, 248, 208, 247, 89, 251, 165, 1, 233, - 179, 247, 89, 251, 165, 1, 240, 61, 247, 89, 251, 165, 1, 237, 64, 247, - 89, 251, 165, 1, 195, 99, 247, 89, 251, 165, 1, 236, 58, 247, 89, 251, - 165, 1, 195, 59, 247, 89, 251, 165, 1, 203, 96, 247, 89, 251, 165, 1, - 247, 16, 247, 89, 251, 165, 1, 195, 228, 247, 89, 251, 165, 1, 195, 74, - 247, 89, 251, 165, 1, 226, 0, 247, 89, 251, 165, 1, 207, 50, 247, 89, - 251, 165, 1, 222, 238, 247, 89, 251, 165, 1, 226, 13, 247, 89, 251, 165, - 1, 196, 198, 247, 89, 251, 165, 1, 237, 164, 247, 89, 251, 165, 1, 247, - 116, 247, 89, 251, 165, 1, 225, 173, 247, 89, 251, 165, 1, 224, 251, 247, - 89, 251, 165, 1, 221, 145, 247, 89, 251, 165, 1, 232, 82, 247, 89, 251, - 165, 1, 211, 140, 247, 89, 251, 165, 1, 251, 48, 247, 89, 251, 165, 1, - 245, 39, 247, 89, 251, 165, 1, 245, 75, 247, 89, 251, 165, 1, 240, 243, - 247, 89, 251, 165, 1, 220, 40, 247, 89, 251, 165, 1, 211, 144, 247, 89, - 251, 165, 1, 216, 3, 247, 89, 251, 165, 1, 237, 141, 247, 89, 251, 165, - 1, 207, 33, 247, 89, 251, 165, 1, 225, 194, 247, 89, 251, 165, 1, 214, - 119, 247, 89, 251, 165, 1, 200, 205, 247, 89, 251, 165, 1, 235, 212, 247, - 89, 251, 165, 1, 237, 154, 247, 89, 251, 165, 1, 245, 109, 247, 89, 251, - 165, 1, 213, 65, 247, 89, 251, 165, 1, 233, 206, 247, 89, 251, 165, 1, - 210, 198, 247, 89, 251, 165, 1, 207, 59, 247, 89, 251, 165, 1, 199, 37, - 247, 89, 251, 165, 1, 202, 50, 247, 89, 251, 165, 1, 206, 160, 247, 89, - 251, 165, 1, 225, 227, 247, 89, 251, 165, 1, 240, 244, 247, 89, 251, 165, - 1, 247, 82, 247, 89, 251, 165, 1, 196, 73, 247, 89, 251, 165, 1, 212, - 154, 247, 89, 251, 165, 1, 224, 52, 247, 89, 251, 165, 244, 237, 78, 30, - 39, 2, 252, 116, 30, 39, 2, 252, 115, 30, 39, 2, 252, 114, 30, 39, 2, - 252, 113, 30, 39, 2, 252, 112, 30, 39, 2, 252, 111, 30, 39, 2, 252, 110, - 30, 39, 2, 252, 109, 30, 39, 2, 252, 108, 30, 39, 2, 252, 107, 30, 39, 2, - 252, 106, 30, 39, 2, 252, 105, 30, 39, 2, 252, 104, 30, 39, 2, 252, 103, - 30, 39, 2, 252, 102, 30, 39, 2, 252, 101, 30, 39, 2, 252, 100, 30, 39, 2, - 252, 99, 30, 39, 2, 252, 98, 30, 39, 2, 252, 97, 30, 39, 2, 252, 96, 30, - 39, 2, 252, 95, 30, 39, 2, 252, 94, 30, 39, 2, 252, 93, 30, 39, 2, 252, - 92, 30, 39, 2, 252, 91, 30, 39, 2, 252, 90, 30, 39, 2, 255, 126, 30, 39, - 2, 252, 89, 30, 39, 2, 252, 88, 30, 39, 2, 252, 87, 30, 39, 2, 252, 86, - 30, 39, 2, 252, 85, 30, 39, 2, 252, 84, 30, 39, 2, 252, 83, 30, 39, 2, - 252, 82, 30, 39, 2, 252, 81, 30, 39, 2, 252, 80, 30, 39, 2, 252, 79, 30, - 39, 2, 252, 78, 30, 39, 2, 252, 77, 30, 39, 2, 252, 76, 30, 39, 2, 252, - 75, 30, 39, 2, 252, 74, 30, 39, 2, 252, 73, 30, 39, 2, 252, 72, 30, 39, - 2, 252, 71, 30, 39, 2, 252, 70, 30, 39, 2, 252, 69, 30, 39, 2, 252, 68, - 30, 39, 2, 252, 67, 30, 39, 2, 252, 66, 30, 39, 2, 252, 65, 30, 39, 2, - 252, 64, 30, 39, 2, 252, 63, 30, 39, 2, 252, 62, 30, 39, 2, 252, 61, 30, - 39, 2, 252, 60, 30, 39, 2, 252, 59, 30, 39, 2, 252, 58, 30, 39, 2, 252, - 57, 30, 39, 2, 252, 56, 30, 39, 2, 252, 55, 30, 39, 2, 252, 54, 30, 39, - 2, 252, 53, 30, 39, 2, 252, 52, 30, 39, 2, 252, 51, 30, 39, 2, 252, 50, - 30, 39, 2, 252, 49, 30, 39, 2, 252, 48, 30, 39, 2, 252, 47, 30, 39, 2, - 255, 39, 30, 39, 2, 252, 46, 30, 39, 2, 252, 45, 30, 39, 2, 255, 4, 30, - 39, 2, 252, 44, 30, 39, 2, 252, 43, 30, 39, 2, 252, 42, 30, 39, 2, 252, - 41, 30, 39, 2, 254, 247, 30, 39, 2, 252, 40, 30, 39, 2, 252, 39, 30, 39, - 2, 252, 38, 30, 39, 2, 252, 37, 30, 39, 2, 252, 36, 30, 39, 2, 254, 63, - 30, 39, 2, 254, 62, 30, 39, 2, 254, 61, 30, 39, 2, 254, 60, 30, 39, 2, - 254, 59, 30, 39, 2, 254, 58, 30, 39, 2, 254, 57, 30, 39, 2, 254, 56, 30, - 39, 2, 254, 54, 30, 39, 2, 254, 53, 30, 39, 2, 254, 52, 30, 39, 2, 254, - 51, 30, 39, 2, 254, 50, 30, 39, 2, 254, 49, 30, 39, 2, 254, 47, 30, 39, - 2, 254, 46, 30, 39, 2, 254, 45, 30, 39, 2, 254, 44, 30, 39, 2, 254, 43, - 30, 39, 2, 254, 42, 30, 39, 2, 254, 41, 30, 39, 2, 254, 40, 30, 39, 2, - 254, 39, 30, 39, 2, 254, 38, 30, 39, 2, 254, 37, 30, 39, 2, 254, 36, 30, - 39, 2, 254, 35, 30, 39, 2, 254, 34, 30, 39, 2, 254, 33, 30, 39, 2, 254, - 32, 30, 39, 2, 254, 31, 30, 39, 2, 254, 30, 30, 39, 2, 254, 29, 30, 39, - 2, 254, 27, 30, 39, 2, 254, 26, 30, 39, 2, 254, 25, 30, 39, 2, 254, 21, - 30, 39, 2, 254, 20, 30, 39, 2, 254, 19, 30, 39, 2, 254, 18, 30, 39, 2, - 254, 14, 30, 39, 2, 254, 13, 30, 39, 2, 254, 12, 30, 39, 2, 254, 11, 30, - 39, 2, 254, 10, 30, 39, 2, 254, 9, 30, 39, 2, 254, 8, 30, 39, 2, 254, 7, - 30, 39, 2, 254, 6, 30, 39, 2, 254, 5, 30, 39, 2, 254, 4, 30, 39, 2, 254, - 3, 30, 39, 2, 254, 2, 30, 39, 2, 254, 1, 30, 39, 2, 254, 0, 30, 39, 2, - 253, 255, 30, 39, 2, 253, 254, 30, 39, 2, 253, 253, 30, 39, 2, 253, 252, - 30, 39, 2, 253, 251, 30, 39, 2, 253, 250, 30, 39, 2, 253, 249, 30, 39, 2, - 253, 248, 30, 39, 2, 253, 246, 30, 39, 2, 253, 245, 30, 39, 2, 253, 244, - 30, 39, 2, 253, 243, 30, 39, 2, 253, 242, 30, 39, 2, 253, 240, 30, 39, 2, - 253, 239, 30, 39, 2, 253, 238, 30, 39, 2, 253, 237, 30, 39, 2, 253, 235, - 30, 39, 2, 253, 234, 30, 39, 2, 253, 233, 30, 39, 2, 253, 199, 30, 39, 2, - 253, 197, 30, 39, 2, 253, 195, 30, 39, 2, 253, 193, 30, 39, 2, 253, 191, - 30, 39, 2, 253, 189, 30, 39, 2, 253, 187, 30, 39, 2, 253, 185, 30, 39, 2, - 253, 183, 30, 39, 2, 253, 181, 30, 39, 2, 253, 179, 30, 39, 2, 253, 176, - 30, 39, 2, 253, 174, 30, 39, 2, 253, 172, 30, 39, 2, 253, 170, 30, 39, 2, - 253, 168, 30, 39, 2, 253, 166, 30, 39, 2, 253, 164, 30, 39, 2, 253, 162, - 30, 39, 2, 253, 80, 30, 39, 2, 253, 79, 30, 39, 2, 253, 78, 30, 39, 2, - 253, 77, 30, 39, 2, 253, 76, 30, 39, 2, 253, 75, 30, 39, 2, 253, 73, 30, - 39, 2, 253, 72, 30, 39, 2, 253, 71, 30, 39, 2, 253, 70, 30, 39, 2, 253, - 69, 30, 39, 2, 253, 68, 30, 39, 2, 253, 66, 30, 39, 2, 253, 65, 30, 39, - 2, 253, 61, 30, 39, 2, 253, 60, 30, 39, 2, 253, 58, 30, 39, 2, 253, 57, - 30, 39, 2, 253, 56, 30, 39, 2, 253, 55, 30, 39, 2, 253, 54, 30, 39, 2, - 253, 53, 30, 39, 2, 253, 52, 30, 39, 2, 253, 51, 30, 39, 2, 253, 50, 30, - 39, 2, 253, 49, 30, 39, 2, 253, 48, 30, 39, 2, 253, 47, 30, 39, 2, 253, - 46, 30, 39, 2, 253, 45, 30, 39, 2, 253, 44, 30, 39, 2, 253, 43, 30, 39, - 2, 253, 42, 30, 39, 2, 253, 41, 30, 39, 2, 253, 40, 30, 39, 2, 253, 39, - 30, 39, 2, 253, 38, 30, 39, 2, 253, 37, 30, 39, 2, 253, 36, 30, 39, 2, - 253, 35, 30, 39, 2, 253, 34, 30, 39, 2, 253, 33, 30, 39, 2, 253, 32, 30, - 39, 2, 253, 31, 30, 39, 2, 253, 30, 30, 39, 2, 253, 29, 30, 39, 2, 253, - 28, 30, 39, 2, 253, 27, 30, 39, 2, 253, 26, 30, 39, 2, 253, 25, 30, 39, - 2, 253, 24, 30, 39, 2, 253, 23, 30, 39, 2, 253, 22, 30, 39, 2, 253, 21, - 30, 39, 2, 253, 20, 30, 39, 2, 253, 19, 30, 39, 2, 253, 18, 30, 39, 2, - 253, 17, 30, 39, 2, 253, 16, 30, 39, 2, 253, 15, 30, 39, 2, 253, 14, 30, - 39, 2, 253, 13, 30, 39, 2, 253, 12, 30, 39, 2, 253, 11, 30, 39, 2, 253, - 10, 30, 39, 2, 253, 9, 30, 39, 2, 253, 8, 30, 39, 2, 253, 7, 30, 39, 2, - 253, 6, 30, 39, 2, 253, 5, 30, 39, 2, 253, 4, 30, 39, 2, 253, 3, 30, 39, - 2, 253, 2, 30, 39, 2, 253, 1, 30, 39, 2, 253, 0, 30, 39, 2, 252, 255, 30, - 39, 2, 252, 254, 30, 39, 2, 252, 253, 30, 39, 2, 252, 252, 30, 39, 2, - 252, 251, 30, 39, 2, 252, 250, 30, 39, 2, 252, 249, 30, 39, 2, 252, 248, - 30, 39, 2, 252, 247, 30, 39, 2, 252, 246, 30, 39, 2, 252, 245, 30, 39, 2, - 252, 244, 30, 39, 2, 252, 243, 30, 39, 2, 252, 242, 30, 39, 2, 252, 241, - 30, 39, 2, 252, 240, 30, 39, 2, 252, 239, 30, 39, 2, 252, 238, 30, 39, 2, - 252, 237, 30, 39, 2, 252, 236, 30, 39, 2, 252, 235, 30, 39, 2, 252, 234, - 30, 39, 2, 252, 233, 30, 39, 2, 252, 232, 30, 39, 2, 252, 231, 30, 39, 2, - 252, 230, 30, 39, 2, 252, 229, 30, 39, 2, 252, 228, 30, 39, 2, 252, 227, - 30, 39, 2, 252, 226, 30, 39, 2, 252, 225, 30, 39, 2, 252, 224, 30, 39, 2, - 252, 223, 30, 39, 2, 252, 222, 30, 39, 2, 252, 221, 30, 39, 2, 252, 220, - 30, 39, 2, 252, 219, 30, 39, 2, 252, 218, 30, 39, 2, 252, 217, 30, 39, 2, - 252, 216, 30, 39, 2, 252, 215, 30, 39, 2, 252, 214, 30, 39, 2, 252, 213, - 30, 39, 2, 252, 212, 30, 39, 2, 252, 211, 30, 39, 2, 252, 210, 30, 39, 2, - 252, 209, 30, 39, 2, 252, 208, 30, 39, 2, 252, 207, 30, 39, 2, 252, 206, - 30, 39, 2, 252, 205, 30, 39, 2, 252, 204, 30, 39, 2, 252, 203, 30, 39, 2, - 252, 202, 30, 39, 2, 252, 201, 30, 39, 2, 252, 200, 30, 39, 2, 252, 199, - 30, 39, 2, 252, 198, 63, 30, 39, 2, 252, 197, 250, 112, 30, 39, 2, 252, - 196, 240, 231, 30, 39, 2, 252, 195, 69, 30, 39, 2, 252, 194, 236, 49, 30, - 39, 2, 252, 193, 233, 15, 30, 39, 2, 252, 192, 225, 217, 30, 39, 2, 252, - 191, 225, 80, 30, 39, 2, 252, 190, 159, 30, 39, 2, 252, 189, 223, 87, 30, - 39, 2, 252, 188, 223, 86, 30, 39, 2, 252, 187, 223, 85, 30, 39, 2, 252, - 186, 223, 84, 30, 39, 2, 252, 185, 197, 199, 30, 39, 2, 252, 184, 196, - 222, 30, 39, 2, 252, 183, 196, 148, 30, 39, 2, 252, 182, 214, 124, 30, - 39, 2, 252, 181, 252, 31, 30, 39, 2, 252, 180, 249, 46, 30, 39, 2, 252, - 179, 240, 43, 30, 39, 2, 252, 178, 236, 57, 30, 39, 2, 252, 177, 225, - 193, 30, 39, 2, 252, 176, 30, 39, 2, 252, 175, 30, 39, 2, 252, 174, 30, - 39, 2, 252, 173, 30, 39, 2, 252, 172, 30, 39, 2, 252, 171, 30, 39, 2, - 252, 170, 30, 39, 2, 252, 169, 240, 238, 5, 63, 240, 238, 5, 69, 240, - 238, 5, 68, 240, 238, 5, 72, 240, 238, 5, 66, 240, 238, 5, 225, 214, 240, - 238, 5, 225, 129, 240, 238, 5, 155, 240, 238, 5, 224, 209, 240, 238, 5, - 224, 101, 240, 238, 5, 224, 11, 240, 238, 5, 223, 187, 240, 238, 5, 172, - 240, 238, 5, 222, 197, 240, 238, 5, 222, 109, 240, 238, 5, 222, 7, 240, - 238, 5, 221, 191, 240, 238, 5, 166, 240, 238, 5, 219, 207, 240, 238, 5, - 219, 78, 240, 238, 5, 218, 251, 240, 238, 5, 218, 145, 240, 238, 5, 176, - 240, 238, 5, 217, 118, 240, 238, 5, 216, 223, 240, 238, 5, 216, 50, 240, - 238, 5, 215, 186, 240, 238, 5, 161, 240, 238, 5, 213, 92, 240, 238, 5, - 212, 220, 240, 238, 5, 212, 117, 240, 238, 5, 211, 227, 240, 238, 5, 169, - 240, 238, 5, 210, 183, 240, 238, 5, 210, 72, 240, 238, 5, 209, 232, 240, - 238, 5, 209, 140, 240, 238, 5, 183, 240, 238, 5, 208, 147, 240, 238, 5, - 206, 112, 240, 238, 5, 205, 200, 240, 238, 5, 204, 172, 240, 238, 5, 189, - 240, 238, 5, 203, 68, 240, 238, 5, 202, 122, 240, 238, 5, 149, 240, 238, - 5, 201, 40, 240, 238, 5, 197, 166, 240, 238, 5, 197, 109, 240, 238, 5, - 197, 70, 240, 238, 5, 197, 34, 240, 238, 5, 196, 208, 240, 238, 5, 196, - 202, 240, 238, 5, 195, 115, 240, 238, 5, 195, 11, 226, 88, 250, 255, 1, - 251, 162, 226, 88, 250, 255, 1, 248, 205, 226, 88, 250, 255, 1, 233, 177, - 226, 88, 250, 255, 1, 240, 100, 226, 88, 250, 255, 1, 232, 147, 226, 88, - 250, 255, 1, 197, 117, 226, 88, 250, 255, 1, 195, 92, 226, 88, 250, 255, - 1, 232, 87, 226, 88, 250, 255, 1, 202, 253, 226, 88, 250, 255, 1, 195, - 240, 226, 88, 250, 255, 1, 225, 5, 226, 88, 250, 255, 1, 222, 240, 226, - 88, 250, 255, 1, 219, 171, 226, 88, 250, 255, 1, 215, 138, 226, 88, 250, - 255, 1, 208, 225, 226, 88, 250, 255, 1, 250, 117, 226, 88, 250, 255, 1, - 213, 92, 226, 88, 250, 255, 1, 209, 5, 226, 88, 250, 255, 1, 211, 101, - 226, 88, 250, 255, 1, 210, 109, 226, 88, 250, 255, 1, 206, 211, 226, 88, - 250, 255, 1, 203, 82, 226, 88, 250, 255, 208, 133, 55, 226, 88, 250, 255, - 31, 100, 226, 88, 250, 255, 31, 102, 226, 88, 250, 255, 31, 134, 226, 88, - 250, 255, 31, 203, 23, 226, 88, 250, 255, 31, 200, 234, 226, 88, 250, - 255, 31, 97, 231, 57, 226, 88, 250, 255, 31, 97, 170, 226, 88, 250, 255, - 31, 203, 24, 170, 213, 204, 1, 251, 162, 213, 204, 1, 248, 205, 213, 204, - 1, 233, 177, 213, 204, 1, 240, 100, 213, 204, 1, 232, 147, 213, 204, 1, - 197, 117, 213, 204, 1, 195, 92, 213, 204, 1, 232, 87, 213, 204, 1, 202, - 253, 213, 204, 1, 195, 240, 213, 204, 1, 225, 5, 213, 204, 1, 222, 240, - 213, 204, 1, 219, 171, 213, 204, 1, 48, 215, 138, 213, 204, 1, 215, 138, - 213, 204, 1, 208, 225, 213, 204, 1, 250, 117, 213, 204, 1, 213, 92, 213, - 204, 1, 209, 5, 213, 204, 1, 211, 101, 213, 204, 1, 210, 109, 213, 204, - 1, 206, 211, 213, 204, 1, 203, 82, 213, 204, 222, 179, 235, 77, 213, 204, - 210, 17, 235, 77, 213, 204, 31, 100, 213, 204, 31, 102, 213, 204, 31, - 134, 213, 204, 31, 136, 213, 204, 31, 146, 213, 204, 31, 203, 23, 213, - 204, 31, 200, 234, 217, 240, 1, 48, 251, 162, 217, 240, 1, 251, 162, 217, - 240, 1, 48, 248, 205, 217, 240, 1, 248, 205, 217, 240, 1, 233, 177, 217, - 240, 1, 240, 100, 217, 240, 1, 48, 232, 147, 217, 240, 1, 232, 147, 217, - 240, 1, 197, 117, 217, 240, 1, 195, 92, 217, 240, 1, 232, 87, 217, 240, - 1, 202, 253, 217, 240, 1, 48, 195, 240, 217, 240, 1, 195, 240, 217, 240, - 1, 48, 225, 5, 217, 240, 1, 225, 5, 217, 240, 1, 48, 222, 240, 217, 240, - 1, 222, 240, 217, 240, 1, 48, 219, 171, 217, 240, 1, 219, 171, 217, 240, - 1, 48, 215, 138, 217, 240, 1, 215, 138, 217, 240, 1, 208, 225, 217, 240, - 1, 250, 117, 217, 240, 1, 213, 92, 217, 240, 1, 209, 5, 217, 240, 1, 211, - 101, 217, 240, 1, 210, 109, 217, 240, 1, 48, 206, 211, 217, 240, 1, 206, - 211, 217, 240, 1, 203, 82, 217, 240, 31, 100, 217, 240, 31, 102, 217, - 240, 31, 134, 217, 240, 31, 136, 217, 240, 241, 47, 31, 136, 217, 240, - 31, 146, 217, 240, 31, 203, 23, 217, 240, 31, 200, 234, 217, 240, 31, 97, - 231, 57, 232, 160, 1, 251, 162, 232, 160, 1, 248, 205, 232, 160, 1, 233, - 177, 232, 160, 1, 240, 99, 232, 160, 1, 232, 147, 232, 160, 1, 197, 117, - 232, 160, 1, 195, 90, 232, 160, 1, 232, 87, 232, 160, 1, 202, 253, 232, - 160, 1, 195, 240, 232, 160, 1, 225, 5, 232, 160, 1, 222, 240, 232, 160, - 1, 219, 171, 232, 160, 1, 215, 138, 232, 160, 1, 208, 225, 232, 160, 1, - 250, 115, 232, 160, 1, 213, 92, 232, 160, 1, 209, 5, 232, 160, 1, 211, - 101, 232, 160, 1, 206, 211, 232, 160, 1, 203, 82, 232, 160, 31, 100, 232, - 160, 31, 146, 232, 160, 31, 203, 23, 232, 160, 31, 200, 234, 232, 160, - 31, 97, 231, 57, 212, 232, 1, 251, 159, 212, 232, 1, 248, 208, 212, 232, - 1, 234, 96, 212, 232, 1, 239, 214, 212, 232, 1, 232, 147, 212, 232, 1, - 197, 124, 212, 232, 1, 195, 108, 212, 232, 1, 232, 89, 212, 232, 1, 203, - 1, 212, 232, 1, 195, 241, 212, 232, 1, 225, 35, 212, 232, 1, 222, 246, - 212, 232, 1, 219, 171, 212, 232, 1, 215, 138, 212, 232, 1, 207, 99, 212, - 232, 1, 251, 194, 212, 232, 1, 213, 92, 212, 232, 1, 209, 7, 212, 232, 1, - 211, 106, 212, 232, 1, 209, 196, 212, 232, 1, 206, 211, 212, 232, 1, 203, - 89, 212, 232, 31, 100, 212, 232, 31, 203, 23, 212, 232, 31, 200, 234, - 212, 232, 31, 97, 231, 57, 212, 232, 31, 102, 212, 232, 31, 134, 212, - 232, 197, 9, 207, 90, 221, 148, 1, 63, 221, 148, 1, 250, 112, 221, 148, - 1, 234, 190, 221, 148, 1, 240, 231, 221, 148, 1, 69, 221, 148, 1, 199, - 230, 221, 148, 1, 68, 221, 148, 1, 196, 148, 221, 148, 1, 225, 80, 221, - 148, 1, 159, 221, 148, 1, 221, 136, 221, 148, 1, 218, 55, 221, 148, 1, - 72, 221, 148, 1, 144, 221, 148, 1, 205, 83, 221, 148, 1, 203, 216, 221, - 148, 1, 66, 221, 148, 1, 236, 49, 221, 148, 1, 211, 167, 221, 148, 1, - 209, 80, 221, 148, 1, 201, 81, 221, 148, 1, 251, 106, 221, 148, 1, 236, - 230, 221, 148, 1, 221, 151, 221, 148, 1, 216, 87, 221, 148, 1, 247, 207, - 221, 148, 201, 177, 78, 140, 232, 57, 1, 63, 140, 232, 57, 1, 69, 140, - 232, 57, 1, 68, 140, 232, 57, 1, 72, 140, 232, 57, 1, 164, 140, 232, 57, - 1, 197, 166, 140, 232, 57, 1, 249, 145, 140, 232, 57, 1, 249, 144, 140, - 232, 57, 1, 161, 140, 232, 57, 1, 166, 140, 232, 57, 1, 176, 140, 232, - 57, 1, 217, 255, 140, 232, 57, 1, 217, 118, 140, 232, 57, 1, 217, 116, - 140, 232, 57, 1, 169, 140, 232, 57, 1, 210, 250, 140, 232, 57, 1, 172, - 140, 232, 57, 1, 224, 146, 140, 232, 57, 1, 232, 80, 140, 232, 57, 1, - 183, 140, 232, 57, 1, 209, 21, 140, 232, 57, 1, 208, 147, 140, 232, 57, - 1, 155, 140, 232, 57, 1, 211, 159, 140, 232, 57, 1, 189, 140, 232, 57, 1, - 203, 167, 140, 232, 57, 1, 203, 68, 140, 232, 57, 1, 203, 66, 140, 232, - 57, 1, 149, 140, 232, 57, 1, 240, 136, 140, 232, 57, 16, 199, 28, 140, - 232, 57, 16, 199, 27, 140, 241, 13, 1, 63, 140, 241, 13, 1, 69, 140, 241, - 13, 1, 68, 140, 241, 13, 1, 72, 140, 241, 13, 1, 164, 140, 241, 13, 1, - 197, 166, 140, 241, 13, 1, 249, 145, 140, 241, 13, 1, 161, 140, 241, 13, - 1, 166, 140, 241, 13, 1, 176, 140, 241, 13, 1, 217, 118, 140, 241, 13, 1, - 169, 140, 241, 13, 1, 172, 140, 241, 13, 1, 224, 146, 140, 241, 13, 1, - 232, 80, 140, 241, 13, 1, 183, 140, 241, 13, 1, 250, 251, 183, 140, 241, - 13, 1, 208, 147, 140, 241, 13, 1, 155, 140, 241, 13, 1, 211, 159, 140, - 241, 13, 1, 189, 140, 241, 13, 1, 203, 68, 140, 241, 13, 1, 149, 140, - 241, 13, 1, 240, 136, 140, 241, 13, 191, 236, 253, 200, 241, 140, 241, - 13, 191, 97, 232, 225, 140, 241, 13, 221, 248, 209, 238, 140, 241, 13, - 221, 248, 226, 93, 140, 241, 13, 31, 100, 140, 241, 13, 31, 102, 140, - 241, 13, 31, 134, 140, 241, 13, 31, 136, 140, 241, 13, 31, 146, 140, 241, - 13, 31, 167, 140, 241, 13, 31, 178, 140, 241, 13, 31, 171, 140, 241, 13, - 31, 182, 140, 241, 13, 31, 203, 23, 140, 241, 13, 31, 200, 234, 140, 241, - 13, 31, 202, 177, 140, 241, 13, 31, 235, 14, 140, 241, 13, 31, 235, 145, - 140, 241, 13, 31, 206, 13, 140, 241, 13, 31, 207, 65, 140, 241, 13, 31, - 97, 231, 57, 140, 241, 13, 31, 99, 231, 57, 140, 241, 13, 31, 115, 231, - 57, 140, 241, 13, 31, 235, 7, 231, 57, 140, 241, 13, 31, 235, 101, 231, - 57, 140, 241, 13, 31, 206, 29, 231, 57, 140, 241, 13, 31, 207, 71, 231, - 57, 140, 241, 13, 31, 237, 31, 231, 57, 140, 241, 13, 31, 216, 179, 231, - 57, 140, 241, 13, 31, 97, 170, 140, 241, 13, 31, 99, 170, 140, 241, 13, - 31, 115, 170, 140, 241, 13, 31, 235, 7, 170, 140, 241, 13, 31, 235, 101, - 170, 140, 241, 13, 31, 206, 29, 170, 140, 241, 13, 31, 207, 71, 170, 140, - 241, 13, 31, 237, 31, 170, 140, 241, 13, 31, 216, 179, 170, 140, 241, 13, - 31, 203, 24, 170, 140, 241, 13, 31, 200, 235, 170, 140, 241, 13, 31, 202, - 178, 170, 140, 241, 13, 31, 235, 15, 170, 140, 241, 13, 31, 235, 146, - 170, 140, 241, 13, 31, 206, 14, 170, 140, 241, 13, 31, 207, 66, 170, 140, - 241, 13, 31, 237, 21, 170, 140, 241, 13, 31, 216, 175, 170, 140, 241, 13, - 31, 97, 231, 58, 170, 140, 241, 13, 31, 99, 231, 58, 170, 140, 241, 13, - 31, 115, 231, 58, 170, 140, 241, 13, 31, 235, 7, 231, 58, 170, 140, 241, - 13, 31, 235, 101, 231, 58, 170, 140, 241, 13, 31, 206, 29, 231, 58, 170, - 140, 241, 13, 31, 207, 71, 231, 58, 170, 140, 241, 13, 31, 237, 31, 231, - 58, 170, 140, 241, 13, 31, 216, 179, 231, 58, 170, 140, 241, 13, 191, 97, - 200, 242, 140, 241, 13, 191, 99, 200, 241, 140, 241, 13, 191, 115, 200, - 241, 140, 241, 13, 191, 235, 7, 200, 241, 140, 241, 13, 191, 235, 101, - 200, 241, 140, 241, 13, 191, 206, 29, 200, 241, 140, 241, 13, 191, 207, - 71, 200, 241, 140, 241, 13, 191, 237, 31, 200, 241, 140, 241, 13, 191, - 216, 179, 200, 241, 140, 241, 13, 191, 203, 24, 200, 241, 224, 133, 1, - 63, 224, 133, 18, 2, 68, 224, 133, 18, 2, 66, 224, 133, 18, 2, 110, 144, - 224, 133, 18, 2, 69, 224, 133, 18, 2, 72, 224, 133, 18, 222, 158, 78, - 224, 133, 2, 52, 210, 3, 60, 224, 133, 2, 251, 51, 224, 133, 2, 199, 2, - 224, 133, 1, 155, 224, 133, 1, 224, 146, 224, 133, 1, 234, 123, 224, 133, - 1, 233, 230, 224, 133, 1, 247, 174, 224, 133, 1, 247, 16, 224, 133, 1, - 225, 214, 224, 133, 1, 215, 109, 224, 133, 1, 201, 78, 224, 133, 1, 201, - 66, 224, 133, 1, 240, 41, 224, 133, 1, 240, 25, 224, 133, 1, 216, 86, - 224, 133, 1, 189, 224, 133, 1, 202, 233, 224, 133, 1, 240, 136, 224, 133, - 1, 239, 176, 224, 133, 1, 176, 224, 133, 1, 161, 224, 133, 1, 213, 6, - 224, 133, 1, 249, 145, 224, 133, 1, 248, 197, 224, 133, 1, 166, 224, 133, - 1, 164, 224, 133, 1, 169, 224, 133, 1, 172, 224, 133, 1, 199, 152, 224, - 133, 1, 207, 50, 224, 133, 1, 205, 80, 224, 133, 1, 183, 224, 133, 1, - 195, 115, 224, 133, 1, 142, 224, 133, 1, 224, 36, 224, 133, 1, 201, 46, - 224, 133, 1, 201, 47, 224, 133, 1, 199, 35, 224, 133, 2, 249, 80, 57, - 224, 133, 2, 247, 88, 224, 133, 2, 76, 60, 224, 133, 199, 7, 224, 133, - 17, 100, 224, 133, 17, 102, 224, 133, 17, 134, 224, 133, 17, 136, 224, - 133, 31, 203, 23, 224, 133, 31, 200, 234, 224, 133, 31, 97, 231, 57, 224, - 133, 31, 97, 170, 224, 133, 191, 97, 232, 225, 224, 133, 211, 214, 238, - 253, 224, 133, 211, 214, 4, 244, 249, 224, 133, 211, 214, 244, 249, 224, - 133, 211, 214, 241, 72, 154, 224, 133, 211, 214, 220, 55, 224, 133, 211, - 214, 221, 213, 224, 133, 211, 214, 240, 88, 224, 133, 211, 214, 52, 240, - 88, 224, 133, 211, 214, 222, 69, 37, 205, 159, 251, 10, 1, 232, 147, 37, - 205, 159, 251, 10, 1, 222, 240, 37, 205, 159, 251, 10, 1, 232, 87, 37, - 205, 159, 251, 10, 1, 219, 171, 37, 205, 159, 251, 10, 1, 211, 101, 37, - 205, 159, 251, 10, 1, 197, 117, 37, 205, 159, 251, 10, 1, 206, 211, 37, - 205, 159, 251, 10, 1, 210, 109, 37, 205, 159, 251, 10, 1, 248, 205, 37, - 205, 159, 251, 10, 1, 203, 82, 37, 205, 159, 251, 10, 1, 208, 199, 37, - 205, 159, 251, 10, 1, 225, 5, 37, 205, 159, 251, 10, 1, 215, 138, 37, - 205, 159, 251, 10, 1, 224, 128, 37, 205, 159, 251, 10, 1, 209, 5, 37, - 205, 159, 251, 10, 1, 208, 225, 37, 205, 159, 251, 10, 1, 235, 189, 37, - 205, 159, 251, 10, 1, 251, 164, 37, 205, 159, 251, 10, 1, 250, 115, 37, - 205, 159, 251, 10, 1, 239, 173, 37, 205, 159, 251, 10, 1, 233, 177, 37, - 205, 159, 251, 10, 1, 240, 100, 37, 205, 159, 251, 10, 1, 233, 218, 37, - 205, 159, 251, 10, 1, 202, 253, 37, 205, 159, 251, 10, 1, 195, 90, 37, - 205, 159, 251, 10, 1, 239, 170, 37, 205, 159, 251, 10, 1, 195, 240, 37, - 205, 159, 251, 10, 1, 202, 219, 37, 205, 159, 251, 10, 1, 202, 198, 37, - 205, 159, 251, 10, 31, 100, 37, 205, 159, 251, 10, 31, 235, 145, 37, 205, - 159, 251, 10, 156, 226, 68, 37, 173, 251, 10, 1, 232, 113, 37, 173, 251, - 10, 1, 222, 249, 37, 173, 251, 10, 1, 232, 236, 37, 173, 251, 10, 1, 219, - 185, 37, 173, 251, 10, 1, 211, 152, 37, 173, 251, 10, 1, 197, 117, 37, - 173, 251, 10, 1, 236, 149, 37, 173, 251, 10, 1, 210, 142, 37, 173, 251, - 10, 1, 248, 239, 37, 173, 251, 10, 1, 203, 41, 37, 173, 251, 10, 1, 236, - 150, 37, 173, 251, 10, 1, 225, 35, 37, 173, 251, 10, 1, 216, 31, 37, 173, - 251, 10, 1, 224, 142, 37, 173, 251, 10, 1, 209, 8, 37, 173, 251, 10, 1, - 236, 148, 37, 173, 251, 10, 1, 235, 176, 37, 173, 251, 10, 1, 251, 164, - 37, 173, 251, 10, 1, 251, 194, 37, 173, 251, 10, 1, 240, 130, 37, 173, - 251, 10, 1, 234, 39, 37, 173, 251, 10, 1, 240, 107, 37, 173, 251, 10, 1, - 233, 225, 37, 173, 251, 10, 1, 203, 139, 37, 173, 251, 10, 1, 195, 106, - 37, 173, 251, 10, 1, 202, 225, 37, 173, 251, 10, 1, 196, 64, 37, 173, - 251, 10, 1, 202, 213, 37, 173, 251, 10, 1, 195, 109, 37, 173, 251, 10, - 31, 100, 37, 173, 251, 10, 31, 203, 23, 37, 173, 251, 10, 31, 200, 234, - 220, 53, 1, 251, 162, 220, 53, 1, 248, 205, 220, 53, 1, 248, 190, 220, - 53, 1, 233, 177, 220, 53, 1, 233, 203, 220, 53, 1, 240, 100, 220, 53, 1, - 232, 147, 220, 53, 1, 197, 117, 220, 53, 2, 200, 104, 220, 53, 1, 195, - 92, 220, 53, 1, 195, 67, 220, 53, 1, 225, 195, 220, 53, 1, 225, 176, 220, - 53, 1, 232, 87, 220, 53, 1, 202, 253, 220, 53, 1, 195, 240, 220, 53, 1, - 225, 5, 220, 53, 1, 196, 205, 220, 53, 1, 224, 135, 220, 53, 1, 222, 240, - 220, 53, 1, 239, 169, 220, 53, 1, 202, 224, 220, 53, 1, 219, 171, 220, - 53, 1, 215, 138, 220, 53, 1, 208, 225, 220, 53, 1, 250, 117, 220, 53, 1, - 252, 120, 220, 53, 1, 213, 92, 220, 53, 1, 235, 189, 220, 53, 1, 209, 5, - 220, 53, 1, 211, 101, 220, 53, 1, 196, 182, 220, 53, 1, 211, 128, 220, - 53, 1, 210, 109, 220, 53, 1, 206, 211, 220, 53, 1, 205, 48, 220, 53, 1, - 203, 82, 220, 53, 252, 30, 117, 57, 220, 53, 252, 30, 117, 60, 220, 53, - 31, 100, 220, 53, 31, 146, 220, 53, 31, 203, 23, 220, 53, 31, 200, 234, - 220, 53, 31, 97, 231, 57, 220, 53, 211, 214, 205, 7, 220, 53, 211, 214, - 235, 77, 220, 53, 211, 214, 52, 76, 197, 39, 238, 253, 220, 53, 211, 214, - 76, 197, 39, 238, 253, 220, 53, 211, 214, 238, 253, 220, 53, 211, 214, - 99, 238, 250, 220, 53, 211, 214, 222, 76, 235, 134, 250, 129, 1, 63, 250, - 129, 1, 252, 168, 250, 129, 1, 251, 49, 250, 129, 1, 252, 126, 250, 129, - 1, 251, 106, 250, 129, 1, 252, 128, 250, 129, 1, 251, 245, 250, 129, 1, - 251, 241, 250, 129, 1, 69, 250, 129, 1, 237, 54, 250, 129, 1, 72, 250, - 129, 1, 214, 102, 250, 129, 1, 68, 250, 129, 1, 226, 120, 250, 129, 1, - 66, 250, 129, 1, 199, 245, 250, 129, 1, 224, 209, 250, 129, 1, 196, 202, - 250, 129, 1, 196, 162, 250, 129, 1, 196, 173, 250, 129, 1, 234, 48, 250, - 129, 1, 234, 5, 250, 129, 1, 233, 216, 250, 129, 1, 247, 57, 250, 129, 1, - 225, 193, 250, 129, 1, 203, 68, 250, 129, 1, 202, 217, 250, 129, 1, 239, - 252, 250, 129, 1, 239, 167, 250, 129, 1, 201, 73, 250, 129, 1, 213, 92, - 250, 129, 1, 235, 189, 250, 129, 1, 249, 9, 250, 129, 1, 248, 192, 250, - 129, 1, 217, 58, 250, 129, 1, 216, 229, 250, 129, 1, 216, 230, 250, 129, - 1, 217, 118, 250, 129, 1, 215, 98, 250, 129, 1, 216, 81, 250, 129, 1, - 219, 207, 250, 129, 1, 231, 243, 250, 129, 1, 195, 165, 250, 129, 1, 196, - 69, 250, 129, 1, 199, 118, 250, 129, 1, 210, 183, 250, 129, 1, 222, 197, - 250, 129, 1, 208, 147, 250, 129, 1, 195, 88, 250, 129, 1, 206, 255, 250, - 129, 1, 195, 65, 250, 129, 1, 206, 119, 250, 129, 1, 205, 49, 250, 129, - 1, 232, 147, 250, 129, 252, 30, 78, 202, 70, 99, 238, 251, 127, 97, 76, - 211, 213, 4, 99, 238, 251, 127, 97, 76, 211, 213, 222, 228, 99, 238, 251, - 127, 97, 76, 211, 213, 222, 228, 97, 76, 127, 99, 238, 251, 211, 213, - 222, 228, 99, 209, 255, 127, 97, 210, 3, 211, 213, 222, 228, 97, 210, 3, - 127, 99, 209, 255, 211, 213, 226, 46, 213, 133, 1, 251, 162, 226, 46, - 213, 133, 1, 248, 205, 226, 46, 213, 133, 1, 233, 177, 226, 46, 213, 133, - 1, 240, 100, 226, 46, 213, 133, 1, 232, 147, 226, 46, 213, 133, 1, 197, - 117, 226, 46, 213, 133, 1, 195, 92, 226, 46, 213, 133, 1, 232, 87, 226, - 46, 213, 133, 1, 202, 253, 226, 46, 213, 133, 1, 195, 240, 226, 46, 213, - 133, 1, 225, 5, 226, 46, 213, 133, 1, 222, 240, 226, 46, 213, 133, 1, - 219, 171, 226, 46, 213, 133, 1, 215, 138, 226, 46, 213, 133, 1, 208, 225, - 226, 46, 213, 133, 1, 250, 117, 226, 46, 213, 133, 1, 213, 92, 226, 46, - 213, 133, 1, 209, 5, 226, 46, 213, 133, 1, 211, 101, 226, 46, 213, 133, - 1, 210, 109, 226, 46, 213, 133, 1, 206, 211, 226, 46, 213, 133, 1, 203, - 82, 226, 46, 213, 133, 31, 100, 226, 46, 213, 133, 31, 102, 226, 46, 213, - 133, 31, 134, 226, 46, 213, 133, 31, 136, 226, 46, 213, 133, 31, 203, 23, - 226, 46, 213, 133, 31, 200, 234, 226, 46, 213, 133, 31, 97, 231, 57, 226, - 46, 213, 133, 31, 97, 170, 226, 46, 213, 222, 1, 251, 162, 226, 46, 213, - 222, 1, 248, 205, 226, 46, 213, 222, 1, 233, 177, 226, 46, 213, 222, 1, - 240, 100, 226, 46, 213, 222, 1, 232, 147, 226, 46, 213, 222, 1, 197, 116, - 226, 46, 213, 222, 1, 195, 92, 226, 46, 213, 222, 1, 232, 87, 226, 46, - 213, 222, 1, 202, 253, 226, 46, 213, 222, 1, 195, 240, 226, 46, 213, 222, - 1, 225, 5, 226, 46, 213, 222, 1, 222, 240, 226, 46, 213, 222, 1, 219, - 170, 226, 46, 213, 222, 1, 215, 138, 226, 46, 213, 222, 1, 208, 225, 226, - 46, 213, 222, 1, 213, 92, 226, 46, 213, 222, 1, 209, 5, 226, 46, 213, - 222, 1, 206, 211, 226, 46, 213, 222, 1, 203, 82, 226, 46, 213, 222, 31, - 100, 226, 46, 213, 222, 31, 102, 226, 46, 213, 222, 31, 134, 226, 46, - 213, 222, 31, 136, 226, 46, 213, 222, 31, 203, 23, 226, 46, 213, 222, 31, - 200, 234, 226, 46, 213, 222, 31, 97, 231, 57, 226, 46, 213, 222, 31, 97, - 170, 211, 239, 213, 222, 1, 251, 162, 211, 239, 213, 222, 1, 248, 205, - 211, 239, 213, 222, 1, 233, 177, 211, 239, 213, 222, 1, 240, 100, 211, - 239, 213, 222, 1, 232, 147, 211, 239, 213, 222, 1, 197, 116, 211, 239, - 213, 222, 1, 195, 92, 211, 239, 213, 222, 1, 232, 87, 211, 239, 213, 222, - 1, 195, 240, 211, 239, 213, 222, 1, 225, 5, 211, 239, 213, 222, 1, 222, - 240, 211, 239, 213, 222, 1, 219, 170, 211, 239, 213, 222, 1, 215, 138, - 211, 239, 213, 222, 1, 208, 225, 211, 239, 213, 222, 1, 213, 92, 211, - 239, 213, 222, 1, 209, 5, 211, 239, 213, 222, 1, 206, 211, 211, 239, 213, - 222, 1, 203, 82, 211, 239, 213, 222, 208, 133, 78, 211, 239, 213, 222, - 163, 208, 133, 78, 211, 239, 213, 222, 235, 7, 238, 251, 3, 241, 61, 211, - 239, 213, 222, 235, 7, 238, 251, 3, 238, 253, 211, 239, 213, 222, 31, - 100, 211, 239, 213, 222, 31, 102, 211, 239, 213, 222, 31, 134, 211, 239, - 213, 222, 31, 136, 211, 239, 213, 222, 31, 203, 23, 211, 239, 213, 222, - 31, 200, 234, 211, 239, 213, 222, 31, 97, 231, 57, 37, 201, 7, 1, 214, - 61, 63, 37, 201, 7, 1, 196, 57, 63, 37, 201, 7, 1, 196, 57, 251, 245, 37, - 201, 7, 1, 214, 61, 68, 37, 201, 7, 1, 196, 57, 68, 37, 201, 7, 1, 196, - 57, 69, 37, 201, 7, 1, 214, 61, 72, 37, 201, 7, 1, 214, 61, 214, 164, 37, - 201, 7, 1, 196, 57, 214, 164, 37, 201, 7, 1, 214, 61, 252, 117, 37, 201, - 7, 1, 196, 57, 252, 117, 37, 201, 7, 1, 214, 61, 251, 244, 37, 201, 7, 1, - 196, 57, 251, 244, 37, 201, 7, 1, 214, 61, 251, 217, 37, 201, 7, 1, 196, - 57, 251, 217, 37, 201, 7, 1, 214, 61, 251, 239, 37, 201, 7, 1, 196, 57, - 251, 239, 37, 201, 7, 1, 214, 61, 252, 6, 37, 201, 7, 1, 196, 57, 252, 6, - 37, 201, 7, 1, 214, 61, 251, 243, 37, 201, 7, 1, 214, 61, 236, 56, 37, - 201, 7, 1, 196, 57, 236, 56, 37, 201, 7, 1, 214, 61, 250, 122, 37, 201, - 7, 1, 196, 57, 250, 122, 37, 201, 7, 1, 214, 61, 251, 226, 37, 201, 7, 1, - 196, 57, 251, 226, 37, 201, 7, 1, 214, 61, 251, 237, 37, 201, 7, 1, 196, - 57, 251, 237, 37, 201, 7, 1, 214, 61, 214, 162, 37, 201, 7, 1, 196, 57, - 214, 162, 37, 201, 7, 1, 214, 61, 251, 173, 37, 201, 7, 1, 196, 57, 251, - 173, 37, 201, 7, 1, 214, 61, 251, 236, 37, 201, 7, 1, 214, 61, 236, 245, - 37, 201, 7, 1, 214, 61, 236, 241, 37, 201, 7, 1, 214, 61, 251, 106, 37, - 201, 7, 1, 214, 61, 251, 234, 37, 201, 7, 1, 196, 57, 251, 234, 37, 201, - 7, 1, 214, 61, 236, 207, 37, 201, 7, 1, 196, 57, 236, 207, 37, 201, 7, 1, - 214, 61, 236, 227, 37, 201, 7, 1, 196, 57, 236, 227, 37, 201, 7, 1, 214, - 61, 236, 193, 37, 201, 7, 1, 196, 57, 236, 193, 37, 201, 7, 1, 196, 57, - 251, 97, 37, 201, 7, 1, 214, 61, 236, 215, 37, 201, 7, 1, 196, 57, 251, - 233, 37, 201, 7, 1, 214, 61, 236, 183, 37, 201, 7, 1, 214, 61, 214, 93, - 37, 201, 7, 1, 214, 61, 230, 203, 37, 201, 7, 1, 214, 61, 237, 62, 37, - 201, 7, 1, 196, 57, 237, 62, 37, 201, 7, 1, 214, 61, 251, 18, 37, 201, 7, - 1, 196, 57, 251, 18, 37, 201, 7, 1, 214, 61, 226, 3, 37, 201, 7, 1, 196, - 57, 226, 3, 37, 201, 7, 1, 214, 61, 214, 74, 37, 201, 7, 1, 196, 57, 214, - 74, 37, 201, 7, 1, 214, 61, 251, 14, 37, 201, 7, 1, 196, 57, 251, 14, 37, - 201, 7, 1, 214, 61, 251, 232, 37, 201, 7, 1, 214, 61, 250, 202, 37, 201, - 7, 1, 214, 61, 251, 230, 37, 201, 7, 1, 214, 61, 250, 195, 37, 201, 7, 1, - 196, 57, 250, 195, 37, 201, 7, 1, 214, 61, 236, 141, 37, 201, 7, 1, 196, - 57, 236, 141, 37, 201, 7, 1, 214, 61, 250, 168, 37, 201, 7, 1, 196, 57, - 250, 168, 37, 201, 7, 1, 214, 61, 251, 227, 37, 201, 7, 1, 196, 57, 251, - 227, 37, 201, 7, 1, 214, 61, 214, 49, 37, 201, 7, 1, 214, 61, 249, 63, - 37, 160, 6, 1, 63, 37, 160, 6, 1, 252, 168, 37, 160, 6, 1, 237, 64, 37, - 160, 6, 1, 251, 118, 37, 160, 6, 1, 237, 62, 37, 160, 6, 1, 236, 227, 37, - 160, 6, 1, 237, 59, 37, 160, 6, 1, 237, 58, 37, 160, 6, 1, 251, 100, 37, - 160, 6, 1, 69, 37, 160, 6, 1, 244, 204, 69, 37, 160, 6, 1, 237, 54, 37, - 160, 6, 1, 237, 47, 37, 160, 6, 1, 237, 46, 37, 160, 6, 1, 237, 43, 37, - 160, 6, 1, 237, 40, 37, 160, 6, 1, 68, 37, 160, 6, 1, 226, 120, 37, 160, - 6, 1, 237, 17, 37, 160, 6, 1, 237, 14, 37, 160, 6, 1, 251, 181, 37, 160, - 6, 1, 200, 45, 37, 160, 6, 1, 237, 7, 37, 160, 6, 1, 236, 244, 37, 160, - 6, 1, 236, 241, 37, 160, 6, 1, 236, 230, 37, 160, 6, 1, 236, 193, 37, - 160, 6, 1, 72, 37, 160, 6, 1, 214, 102, 37, 160, 6, 1, 216, 186, 214, - 164, 37, 160, 6, 1, 209, 130, 214, 164, 37, 160, 6, 1, 214, 163, 37, 160, - 6, 1, 236, 183, 37, 160, 6, 1, 236, 235, 37, 160, 6, 1, 236, 163, 37, - 160, 6, 1, 206, 182, 236, 163, 37, 160, 6, 1, 236, 151, 37, 160, 6, 1, - 236, 130, 37, 160, 6, 1, 236, 128, 37, 160, 6, 1, 236, 207, 37, 160, 6, - 1, 236, 117, 37, 160, 6, 1, 237, 60, 37, 160, 6, 1, 66, 37, 160, 6, 1, - 199, 245, 37, 160, 6, 1, 216, 186, 200, 99, 37, 160, 6, 1, 209, 130, 200, - 99, 37, 160, 6, 1, 236, 104, 37, 160, 6, 1, 236, 56, 37, 160, 6, 1, 236, - 51, 37, 160, 6, 1, 236, 206, 55, 37, 160, 6, 1, 200, 4, 37, 160, 4, 1, - 63, 37, 160, 4, 1, 252, 168, 37, 160, 4, 1, 237, 64, 37, 160, 4, 1, 251, - 118, 37, 160, 4, 1, 237, 62, 37, 160, 4, 1, 236, 227, 37, 160, 4, 1, 237, - 59, 37, 160, 4, 1, 237, 58, 37, 160, 4, 1, 251, 100, 37, 160, 4, 1, 69, - 37, 160, 4, 1, 244, 204, 69, 37, 160, 4, 1, 237, 54, 37, 160, 4, 1, 237, - 47, 37, 160, 4, 1, 237, 46, 37, 160, 4, 1, 237, 43, 37, 160, 4, 1, 237, - 40, 37, 160, 4, 1, 68, 37, 160, 4, 1, 226, 120, 37, 160, 4, 1, 237, 17, - 37, 160, 4, 1, 237, 14, 37, 160, 4, 1, 251, 181, 37, 160, 4, 1, 200, 45, - 37, 160, 4, 1, 237, 7, 37, 160, 4, 1, 236, 244, 37, 160, 4, 1, 236, 241, - 37, 160, 4, 1, 236, 230, 37, 160, 4, 1, 236, 193, 37, 160, 4, 1, 72, 37, - 160, 4, 1, 214, 102, 37, 160, 4, 1, 216, 186, 214, 164, 37, 160, 4, 1, - 209, 130, 214, 164, 37, 160, 4, 1, 214, 163, 37, 160, 4, 1, 236, 183, 37, - 160, 4, 1, 236, 235, 37, 160, 4, 1, 236, 163, 37, 160, 4, 1, 206, 182, - 236, 163, 37, 160, 4, 1, 236, 151, 37, 160, 4, 1, 236, 130, 37, 160, 4, - 1, 236, 128, 37, 160, 4, 1, 236, 207, 37, 160, 4, 1, 236, 117, 37, 160, - 4, 1, 237, 60, 37, 160, 4, 1, 66, 37, 160, 4, 1, 199, 245, 37, 160, 4, 1, - 216, 186, 200, 99, 37, 160, 4, 1, 209, 130, 200, 99, 37, 160, 4, 1, 236, - 104, 37, 160, 4, 1, 236, 56, 37, 160, 4, 1, 236, 51, 37, 160, 4, 1, 236, - 206, 55, 37, 160, 4, 1, 200, 4, 37, 160, 31, 100, 37, 160, 31, 146, 37, - 160, 31, 203, 23, 37, 160, 31, 235, 145, 37, 160, 31, 97, 231, 57, 37, - 160, 31, 97, 170, 232, 180, 209, 214, 1, 63, 232, 180, 209, 214, 1, 249, - 145, 232, 180, 209, 214, 1, 161, 232, 180, 209, 214, 1, 189, 232, 180, - 209, 214, 1, 201, 78, 232, 180, 209, 214, 1, 225, 214, 232, 180, 209, - 214, 1, 247, 174, 232, 180, 209, 214, 1, 142, 232, 180, 209, 214, 1, 224, - 146, 232, 180, 209, 214, 1, 235, 239, 232, 180, 209, 214, 1, 240, 136, - 232, 180, 209, 214, 1, 240, 41, 232, 180, 209, 214, 1, 169, 232, 180, - 209, 214, 1, 209, 181, 232, 180, 209, 214, 1, 195, 115, 232, 180, 209, - 214, 1, 183, 232, 180, 209, 214, 1, 207, 50, 232, 180, 209, 214, 1, 155, - 232, 180, 209, 214, 1, 234, 123, 232, 180, 209, 214, 1, 172, 232, 180, - 209, 214, 1, 166, 232, 180, 209, 214, 1, 176, 232, 180, 209, 214, 1, 197, - 166, 232, 180, 209, 214, 1, 224, 72, 197, 166, 232, 180, 209, 214, 1, - 164, 232, 180, 209, 214, 1, 224, 72, 164, 232, 180, 209, 214, 1, 217, 71, - 232, 180, 209, 214, 1, 215, 109, 232, 180, 209, 214, 1, 199, 152, 232, - 180, 209, 214, 18, 63, 232, 180, 209, 214, 18, 68, 232, 180, 209, 214, - 18, 66, 232, 180, 209, 214, 18, 69, 232, 180, 209, 214, 18, 72, 232, 180, - 209, 214, 117, 208, 245, 232, 180, 209, 214, 117, 218, 1, 224, 113, 232, - 180, 209, 214, 2, 232, 174, 232, 180, 209, 214, 2, 203, 138, 232, 180, - 209, 214, 2, 203, 113, 232, 180, 209, 214, 2, 203, 95, 232, 180, 209, - 214, 17, 195, 79, 232, 180, 209, 214, 17, 100, 232, 180, 209, 214, 17, - 102, 232, 180, 209, 214, 17, 134, 232, 180, 209, 214, 17, 136, 232, 180, - 209, 214, 17, 146, 232, 180, 209, 214, 17, 167, 232, 180, 209, 214, 17, - 178, 232, 180, 209, 214, 17, 171, 232, 180, 209, 214, 17, 182, 209, 118, - 17, 100, 209, 118, 17, 102, 209, 118, 17, 134, 209, 118, 17, 136, 209, - 118, 17, 146, 209, 118, 17, 167, 209, 118, 17, 178, 209, 118, 17, 171, - 209, 118, 17, 182, 209, 118, 31, 203, 23, 209, 118, 31, 200, 234, 209, - 118, 31, 202, 177, 209, 118, 31, 235, 14, 209, 118, 31, 235, 145, 209, - 118, 31, 206, 13, 209, 118, 31, 207, 65, 209, 118, 31, 237, 20, 209, 118, - 31, 216, 174, 209, 118, 31, 97, 231, 57, 209, 118, 31, 99, 231, 57, 209, - 118, 31, 115, 231, 57, 209, 118, 31, 235, 7, 231, 57, 209, 118, 31, 235, - 101, 231, 57, 209, 118, 31, 206, 29, 231, 57, 209, 118, 31, 207, 71, 231, - 57, 209, 118, 31, 237, 31, 231, 57, 209, 118, 31, 216, 179, 231, 57, 209, - 118, 191, 97, 232, 225, 209, 118, 191, 97, 211, 87, 209, 118, 191, 97, - 202, 184, 209, 118, 191, 99, 202, 181, 37, 205, 182, 1, 251, 162, 37, - 205, 182, 1, 48, 251, 162, 37, 205, 182, 1, 248, 205, 37, 205, 182, 1, - 48, 248, 205, 37, 205, 182, 1, 233, 177, 37, 205, 182, 1, 232, 147, 37, - 205, 182, 1, 48, 232, 147, 37, 205, 182, 1, 197, 117, 37, 205, 182, 1, - 195, 92, 37, 205, 182, 1, 232, 87, 37, 205, 182, 1, 195, 240, 37, 205, - 182, 1, 225, 5, 37, 205, 182, 1, 222, 240, 37, 205, 182, 1, 219, 171, 37, - 205, 182, 1, 215, 138, 37, 205, 182, 1, 48, 215, 138, 37, 205, 182, 1, - 48, 215, 139, 3, 83, 203, 135, 37, 205, 182, 1, 208, 225, 37, 205, 182, - 1, 250, 117, 37, 205, 182, 1, 251, 131, 250, 117, 37, 205, 182, 1, 213, - 92, 37, 205, 182, 1, 209, 5, 37, 205, 182, 1, 48, 209, 5, 37, 205, 182, - 1, 48, 209, 6, 3, 83, 203, 135, 37, 205, 182, 1, 210, 107, 37, 205, 182, - 1, 206, 211, 37, 205, 182, 1, 203, 82, 37, 205, 182, 1, 48, 203, 82, 37, - 205, 182, 1, 48, 203, 83, 3, 83, 203, 135, 37, 205, 182, 31, 100, 37, - 205, 182, 31, 102, 37, 205, 182, 31, 134, 37, 205, 182, 31, 136, 37, 205, - 182, 31, 146, 37, 205, 182, 31, 203, 23, 37, 205, 182, 31, 200, 234, 37, - 205, 182, 31, 202, 177, 37, 205, 182, 31, 97, 231, 57, 37, 205, 182, 191, - 97, 232, 225, 37, 205, 182, 33, 250, 116, 205, 182, 1, 251, 162, 205, - 182, 1, 248, 205, 205, 182, 1, 233, 177, 205, 182, 1, 232, 147, 205, 182, - 1, 197, 117, 205, 182, 1, 195, 92, 205, 182, 1, 232, 87, 205, 182, 1, - 195, 240, 205, 182, 1, 225, 5, 205, 182, 1, 222, 240, 205, 182, 1, 219, - 171, 205, 182, 1, 215, 138, 205, 182, 1, 208, 225, 205, 182, 1, 250, 117, - 205, 182, 1, 213, 92, 205, 182, 1, 209, 5, 205, 182, 1, 210, 108, 205, - 182, 1, 206, 211, 205, 182, 1, 203, 82, 205, 182, 1, 235, 160, 205, 182, - 1, 222, 142, 205, 182, 226, 73, 206, 211, 205, 182, 38, 76, 60, 205, 182, - 38, 99, 238, 251, 60, 205, 182, 38, 76, 57, 205, 182, 38, 99, 238, 251, - 57, 205, 182, 38, 241, 12, 57, 205, 182, 38, 241, 12, 60, 205, 182, 38, - 231, 165, 57, 205, 182, 38, 231, 165, 60, 205, 182, 38, 181, 231, 165, - 60, 205, 182, 38, 210, 110, 60, 205, 182, 38, 204, 196, 60, 205, 182, 31, - 100, 205, 182, 31, 203, 23, 205, 182, 31, 200, 234, 205, 182, 31, 97, - 231, 57, 205, 182, 211, 214, 99, 83, 249, 68, 205, 182, 211, 214, 99, 83, - 249, 69, 3, 238, 250, 205, 182, 211, 214, 244, 250, 3, 238, 253, 205, - 182, 211, 214, 99, 244, 247, 3, 238, 250, 205, 182, 211, 214, 157, 244, - 250, 3, 238, 253, 236, 243, 1, 251, 162, 236, 243, 1, 248, 205, 236, 243, - 1, 233, 177, 236, 243, 1, 240, 100, 236, 243, 1, 232, 147, 236, 243, 1, - 197, 117, 236, 243, 1, 195, 92, 236, 243, 1, 232, 87, 236, 243, 1, 202, - 253, 236, 243, 1, 195, 240, 236, 243, 1, 225, 5, 236, 243, 1, 222, 240, - 236, 243, 1, 219, 171, 236, 243, 1, 215, 138, 236, 243, 1, 208, 225, 236, - 243, 1, 250, 117, 236, 243, 1, 213, 92, 236, 243, 1, 209, 5, 236, 243, 1, - 211, 101, 236, 243, 1, 210, 109, 236, 243, 1, 206, 211, 236, 243, 1, 203, - 82, 236, 243, 33, 195, 91, 158, 2, 247, 133, 158, 2, 251, 51, 158, 2, - 199, 2, 158, 2, 225, 165, 158, 2, 200, 34, 158, 1, 63, 158, 1, 252, 168, - 158, 1, 68, 158, 1, 226, 120, 158, 1, 66, 158, 1, 199, 245, 158, 1, 110, - 144, 158, 1, 110, 209, 182, 158, 1, 110, 159, 158, 1, 110, 222, 38, 158, - 1, 69, 158, 1, 251, 200, 158, 1, 72, 158, 1, 250, 150, 158, 1, 155, 158, - 1, 224, 146, 158, 1, 234, 123, 158, 1, 233, 230, 158, 1, 217, 71, 158, 1, - 247, 174, 158, 1, 247, 16, 158, 1, 225, 214, 158, 1, 225, 180, 158, 1, - 215, 109, 158, 1, 201, 78, 158, 1, 201, 66, 158, 1, 240, 41, 158, 1, 240, - 25, 158, 1, 216, 86, 158, 1, 189, 158, 1, 202, 233, 158, 1, 240, 136, - 158, 1, 239, 176, 158, 1, 176, 158, 1, 161, 158, 1, 213, 6, 158, 1, 249, - 145, 158, 1, 248, 197, 158, 1, 166, 158, 1, 164, 158, 1, 169, 158, 1, - 172, 158, 1, 199, 152, 158, 1, 207, 50, 158, 1, 205, 80, 158, 1, 183, - 158, 1, 142, 158, 1, 222, 37, 158, 1, 37, 42, 222, 26, 158, 1, 37, 42, - 209, 181, 158, 1, 37, 42, 216, 68, 158, 18, 2, 252, 168, 158, 18, 2, 248, - 193, 252, 168, 158, 18, 2, 68, 158, 18, 2, 226, 120, 158, 18, 2, 66, 158, - 18, 2, 199, 245, 158, 18, 2, 110, 144, 158, 18, 2, 110, 209, 182, 158, - 18, 2, 110, 159, 158, 18, 2, 110, 222, 38, 158, 18, 2, 69, 158, 18, 2, - 251, 200, 158, 18, 2, 72, 158, 18, 2, 250, 150, 158, 199, 7, 158, 240, - 88, 158, 52, 240, 88, 158, 211, 214, 238, 253, 158, 211, 214, 52, 238, - 253, 158, 211, 214, 222, 75, 158, 211, 214, 241, 72, 154, 158, 211, 214, - 221, 213, 158, 31, 100, 158, 31, 102, 158, 31, 134, 158, 31, 136, 158, - 31, 146, 158, 31, 167, 158, 31, 178, 158, 31, 171, 158, 31, 182, 158, 31, - 203, 23, 158, 31, 200, 234, 158, 31, 202, 177, 158, 31, 235, 14, 158, 31, - 235, 145, 158, 31, 206, 13, 158, 31, 207, 65, 158, 31, 237, 20, 158, 31, - 216, 174, 158, 31, 97, 231, 57, 158, 31, 97, 170, 158, 17, 195, 79, 158, - 17, 100, 158, 17, 102, 158, 17, 134, 158, 17, 136, 158, 17, 146, 158, 17, - 167, 158, 17, 178, 158, 17, 171, 158, 17, 182, 158, 31, 225, 124, 225, - 28, 2, 247, 133, 225, 28, 2, 251, 51, 225, 28, 2, 199, 2, 225, 28, 1, 63, - 225, 28, 1, 252, 168, 225, 28, 1, 68, 225, 28, 1, 226, 120, 225, 28, 1, - 66, 225, 28, 1, 199, 245, 225, 28, 1, 69, 225, 28, 1, 251, 200, 225, 28, - 1, 72, 225, 28, 1, 250, 150, 225, 28, 1, 155, 225, 28, 1, 224, 146, 225, - 28, 1, 234, 123, 225, 28, 1, 233, 230, 225, 28, 1, 217, 71, 225, 28, 1, - 247, 174, 225, 28, 1, 247, 16, 225, 28, 1, 225, 214, 225, 28, 1, 225, - 180, 225, 28, 1, 215, 109, 225, 28, 1, 201, 78, 225, 28, 1, 201, 66, 225, - 28, 1, 240, 41, 225, 28, 1, 240, 30, 225, 28, 1, 240, 25, 225, 28, 1, - 210, 77, 225, 28, 1, 216, 86, 225, 28, 1, 189, 225, 28, 1, 202, 233, 225, - 28, 1, 240, 136, 225, 28, 1, 239, 176, 225, 28, 1, 176, 225, 28, 1, 161, - 225, 28, 1, 213, 6, 225, 28, 1, 249, 145, 225, 28, 1, 248, 197, 225, 28, - 1, 166, 225, 28, 1, 164, 225, 28, 1, 169, 225, 28, 1, 172, 225, 28, 1, - 199, 152, 225, 28, 1, 207, 50, 225, 28, 1, 205, 80, 225, 28, 1, 183, 225, - 28, 1, 142, 225, 28, 18, 2, 252, 168, 225, 28, 18, 2, 68, 225, 28, 18, 2, - 226, 120, 225, 28, 18, 2, 66, 225, 28, 18, 2, 199, 245, 225, 28, 18, 2, - 69, 225, 28, 18, 2, 251, 200, 225, 28, 18, 2, 72, 225, 28, 18, 2, 250, - 150, 225, 28, 2, 199, 7, 225, 28, 2, 215, 149, 225, 28, 252, 30, 55, 225, - 28, 236, 196, 55, 225, 28, 31, 55, 225, 28, 208, 133, 78, 225, 28, 52, - 208, 133, 78, 225, 28, 240, 88, 225, 28, 52, 240, 88, 225, 28, 31, 2, 57, - 205, 167, 205, 175, 1, 208, 254, 205, 167, 205, 175, 1, 203, 139, 205, - 167, 205, 175, 1, 249, 115, 205, 167, 205, 175, 1, 247, 163, 205, 167, - 205, 175, 1, 240, 116, 205, 167, 205, 175, 1, 234, 108, 205, 167, 205, - 175, 1, 220, 89, 205, 167, 205, 175, 1, 217, 68, 205, 167, 205, 175, 1, - 223, 57, 205, 167, 205, 175, 1, 217, 231, 205, 167, 205, 175, 1, 199, - 148, 205, 167, 205, 175, 1, 213, 223, 205, 167, 205, 175, 1, 196, 110, - 205, 167, 205, 175, 1, 210, 226, 205, 167, 205, 175, 1, 232, 236, 205, - 167, 205, 175, 1, 225, 33, 205, 167, 205, 175, 1, 225, 208, 205, 167, - 205, 175, 1, 215, 106, 205, 167, 205, 175, 1, 251, 209, 205, 167, 205, - 175, 1, 237, 52, 205, 167, 205, 175, 1, 226, 121, 205, 167, 205, 175, 1, - 200, 92, 205, 167, 205, 175, 1, 214, 149, 205, 167, 205, 175, 1, 237, 40, - 205, 167, 205, 175, 1, 220, 104, 205, 167, 205, 175, 17, 195, 79, 205, - 167, 205, 175, 17, 100, 205, 167, 205, 175, 17, 102, 205, 167, 205, 175, - 17, 134, 205, 167, 205, 175, 17, 136, 205, 167, 205, 175, 17, 146, 205, - 167, 205, 175, 17, 167, 205, 167, 205, 175, 17, 178, 205, 167, 205, 175, - 17, 171, 205, 167, 205, 175, 17, 182, 247, 10, 2, 247, 133, 247, 10, 2, - 251, 51, 247, 10, 2, 199, 2, 247, 10, 1, 252, 168, 247, 10, 1, 68, 247, - 10, 1, 66, 247, 10, 1, 69, 247, 10, 1, 225, 55, 247, 10, 1, 224, 145, - 247, 10, 1, 234, 120, 247, 10, 1, 233, 229, 247, 10, 1, 217, 70, 247, 10, - 1, 247, 173, 247, 10, 1, 247, 15, 247, 10, 1, 225, 213, 247, 10, 1, 225, - 179, 247, 10, 1, 215, 108, 247, 10, 1, 201, 77, 247, 10, 1, 201, 65, 247, - 10, 1, 240, 40, 247, 10, 1, 240, 24, 247, 10, 1, 216, 85, 247, 10, 1, - 203, 162, 247, 10, 1, 202, 232, 247, 10, 1, 240, 135, 247, 10, 1, 239, - 175, 247, 10, 1, 217, 244, 247, 10, 1, 213, 243, 247, 10, 1, 213, 5, 247, - 10, 1, 249, 143, 247, 10, 1, 248, 196, 247, 10, 1, 220, 119, 247, 10, 1, - 195, 166, 247, 10, 1, 196, 129, 247, 10, 1, 210, 244, 247, 10, 1, 223, - 82, 247, 10, 1, 197, 160, 247, 10, 1, 209, 13, 247, 10, 1, 232, 246, 247, - 10, 18, 2, 63, 247, 10, 18, 2, 68, 247, 10, 18, 2, 226, 120, 247, 10, 18, - 2, 66, 247, 10, 18, 2, 199, 245, 247, 10, 18, 2, 69, 247, 10, 18, 2, 251, - 200, 247, 10, 18, 2, 72, 247, 10, 18, 2, 250, 150, 247, 10, 18, 2, 214, - 146, 247, 10, 177, 78, 247, 10, 250, 151, 78, 247, 10, 199, 7, 247, 10, - 220, 117, 247, 10, 17, 195, 79, 247, 10, 17, 100, 247, 10, 17, 102, 247, - 10, 17, 134, 247, 10, 17, 136, 247, 10, 17, 146, 247, 10, 17, 167, 247, - 10, 17, 178, 247, 10, 17, 171, 247, 10, 17, 182, 247, 10, 208, 133, 78, - 247, 10, 240, 88, 247, 10, 52, 240, 88, 247, 10, 211, 79, 78, 247, 10, 1, - 222, 121, 247, 10, 18, 2, 252, 168, 247, 10, 18, 2, 237, 33, 220, 87, 1, - 63, 220, 87, 1, 68, 220, 87, 1, 66, 220, 87, 1, 69, 220, 87, 1, 72, 220, - 87, 1, 155, 220, 87, 1, 224, 146, 220, 87, 1, 234, 123, 220, 87, 1, 233, - 230, 220, 87, 1, 247, 174, 220, 87, 1, 247, 16, 220, 87, 1, 225, 214, - 220, 87, 1, 225, 180, 220, 87, 1, 215, 109, 220, 87, 1, 201, 78, 220, 87, - 1, 201, 66, 220, 87, 1, 240, 41, 220, 87, 1, 240, 25, 220, 87, 1, 216, - 86, 220, 87, 1, 189, 220, 87, 1, 202, 233, 220, 87, 1, 240, 136, 220, 87, - 1, 239, 176, 220, 87, 1, 176, 220, 87, 1, 161, 220, 87, 1, 213, 6, 220, - 87, 1, 249, 145, 220, 87, 1, 248, 197, 220, 87, 1, 166, 220, 87, 1, 169, - 220, 87, 1, 172, 220, 87, 1, 199, 152, 220, 87, 1, 183, 220, 87, 1, 142, - 220, 87, 1, 209, 181, 220, 87, 2, 215, 149, 220, 87, 252, 30, 55, 220, - 87, 208, 133, 78, 220, 87, 33, 206, 159, 207, 15, 2, 247, 133, 207, 15, - 2, 251, 51, 207, 15, 2, 199, 2, 207, 15, 1, 63, 207, 15, 1, 252, 168, - 207, 15, 1, 68, 207, 15, 1, 226, 120, 207, 15, 1, 66, 207, 15, 1, 199, - 245, 207, 15, 1, 110, 144, 207, 15, 1, 110, 209, 182, 207, 15, 1, 110, - 159, 207, 15, 1, 110, 222, 38, 207, 15, 1, 69, 207, 15, 1, 251, 200, 207, - 15, 1, 72, 207, 15, 1, 250, 150, 207, 15, 1, 155, 207, 15, 1, 224, 146, - 207, 15, 1, 234, 123, 207, 15, 1, 233, 230, 207, 15, 1, 217, 71, 207, 15, - 1, 247, 174, 207, 15, 1, 247, 16, 207, 15, 1, 225, 214, 207, 15, 1, 225, - 180, 207, 15, 1, 215, 109, 207, 15, 1, 201, 78, 207, 15, 1, 201, 66, 207, - 15, 1, 240, 41, 207, 15, 1, 240, 25, 207, 15, 1, 216, 86, 207, 15, 1, - 189, 207, 15, 1, 202, 233, 207, 15, 1, 240, 136, 207, 15, 1, 239, 176, - 207, 15, 1, 176, 207, 15, 1, 161, 207, 15, 1, 213, 6, 207, 15, 1, 249, - 145, 207, 15, 1, 248, 197, 207, 15, 1, 166, 207, 15, 1, 164, 207, 15, 1, - 169, 207, 15, 1, 172, 207, 15, 1, 222, 37, 207, 15, 1, 199, 152, 207, 15, - 1, 207, 50, 207, 15, 1, 205, 80, 207, 15, 1, 183, 207, 15, 1, 142, 207, - 15, 18, 2, 252, 168, 207, 15, 18, 2, 68, 207, 15, 18, 2, 226, 120, 207, - 15, 18, 2, 66, 207, 15, 18, 2, 199, 245, 207, 15, 18, 2, 110, 144, 207, - 15, 18, 2, 110, 209, 182, 207, 15, 18, 2, 110, 159, 207, 15, 18, 2, 110, - 222, 38, 207, 15, 18, 2, 69, 207, 15, 18, 2, 251, 200, 207, 15, 18, 2, - 72, 207, 15, 18, 2, 250, 150, 207, 15, 2, 199, 7, 207, 15, 2, 250, 132, - 207, 15, 2, 225, 165, 207, 15, 2, 200, 34, 207, 15, 214, 127, 207, 15, - 240, 88, 207, 15, 52, 240, 88, 207, 15, 252, 30, 55, 207, 15, 207, 90, - 207, 15, 208, 215, 78, 207, 15, 2, 215, 149, 207, 15, 18, 73, 78, 207, - 15, 236, 75, 206, 182, 18, 78, 207, 15, 204, 75, 78, 207, 15, 17, 195, - 79, 207, 15, 17, 100, 207, 15, 17, 102, 207, 15, 17, 134, 207, 15, 17, - 136, 207, 15, 17, 146, 207, 15, 17, 167, 207, 15, 17, 178, 207, 15, 17, - 171, 207, 15, 17, 182, 207, 15, 237, 13, 207, 15, 2, 206, 100, 207, 15, - 232, 130, 207, 15, 241, 128, 55, 207, 15, 208, 133, 220, 28, 207, 15, - 208, 133, 220, 27, 153, 250, 251, 17, 100, 153, 250, 251, 17, 102, 153, - 250, 251, 17, 134, 153, 250, 251, 17, 136, 153, 250, 251, 17, 146, 153, - 250, 251, 17, 167, 153, 250, 251, 17, 178, 153, 250, 251, 17, 171, 153, - 250, 251, 17, 182, 153, 250, 251, 31, 203, 23, 153, 250, 251, 31, 200, - 234, 153, 250, 251, 31, 202, 177, 153, 250, 251, 31, 235, 14, 153, 250, - 251, 31, 235, 145, 153, 250, 251, 31, 206, 13, 153, 250, 251, 31, 207, - 65, 153, 250, 251, 31, 237, 20, 153, 250, 251, 31, 216, 174, 153, 250, - 251, 31, 97, 231, 57, 153, 250, 251, 31, 97, 170, 224, 116, 1, 63, 224, - 116, 1, 252, 168, 224, 116, 1, 68, 224, 116, 1, 66, 224, 116, 1, 69, 224, - 116, 1, 251, 200, 224, 116, 1, 72, 224, 116, 1, 250, 150, 224, 116, 1, - 155, 224, 116, 1, 224, 146, 224, 116, 1, 234, 123, 224, 116, 1, 234, 10, - 224, 116, 1, 233, 230, 224, 116, 1, 217, 71, 224, 116, 1, 247, 174, 224, - 116, 1, 247, 16, 224, 116, 1, 225, 214, 224, 116, 1, 225, 158, 224, 116, - 1, 215, 109, 224, 116, 1, 201, 78, 224, 116, 1, 201, 66, 224, 116, 1, - 240, 41, 224, 116, 1, 240, 25, 224, 116, 1, 216, 86, 224, 116, 1, 189, - 224, 116, 1, 202, 233, 224, 116, 1, 240, 136, 224, 116, 1, 240, 31, 224, - 116, 1, 239, 176, 224, 116, 1, 176, 224, 116, 1, 161, 224, 116, 1, 213, - 6, 224, 116, 1, 249, 145, 224, 116, 1, 249, 45, 224, 116, 1, 248, 197, - 224, 116, 1, 166, 224, 116, 1, 164, 224, 116, 1, 169, 224, 116, 1, 172, - 224, 116, 1, 199, 152, 224, 116, 1, 183, 224, 116, 1, 142, 224, 116, 1, - 222, 37, 224, 116, 18, 2, 252, 168, 224, 116, 18, 2, 68, 224, 116, 18, 2, - 226, 120, 224, 116, 18, 2, 66, 224, 116, 18, 2, 69, 224, 116, 18, 2, 251, - 200, 224, 116, 18, 2, 72, 224, 116, 18, 2, 250, 150, 224, 116, 2, 251, - 51, 224, 116, 2, 199, 7, 224, 116, 2, 215, 149, 224, 116, 2, 207, 40, - 224, 116, 240, 88, 224, 116, 52, 240, 88, 224, 116, 197, 9, 207, 90, 224, - 116, 208, 133, 78, 224, 116, 52, 208, 133, 78, 224, 116, 252, 30, 55, - 224, 116, 2, 204, 119, 218, 124, 1, 63, 218, 124, 1, 68, 218, 124, 1, 66, - 218, 124, 1, 69, 218, 124, 1, 155, 218, 124, 1, 224, 146, 218, 124, 1, - 234, 123, 218, 124, 1, 233, 230, 218, 124, 1, 247, 174, 218, 124, 1, 247, - 16, 218, 124, 1, 225, 214, 218, 124, 1, 225, 158, 218, 124, 1, 215, 109, - 218, 124, 1, 201, 78, 218, 124, 1, 201, 66, 218, 124, 1, 240, 41, 218, - 124, 1, 240, 31, 218, 124, 1, 240, 25, 218, 124, 1, 216, 86, 218, 124, 1, - 189, 218, 124, 1, 202, 233, 218, 124, 1, 240, 136, 218, 124, 1, 239, 176, - 218, 124, 1, 176, 218, 124, 1, 161, 218, 124, 1, 213, 6, 218, 124, 1, - 249, 145, 218, 124, 1, 248, 197, 218, 124, 1, 166, 218, 124, 1, 164, 218, - 124, 1, 169, 218, 124, 1, 172, 218, 124, 1, 199, 152, 218, 124, 1, 183, - 218, 124, 1, 142, 218, 124, 1, 209, 181, 218, 124, 1, 210, 77, 218, 124, - 208, 133, 78, 224, 107, 1, 63, 224, 107, 1, 252, 168, 224, 107, 1, 68, - 224, 107, 1, 226, 120, 224, 107, 1, 66, 224, 107, 1, 199, 245, 224, 107, - 1, 69, 224, 107, 1, 251, 200, 224, 107, 1, 72, 224, 107, 1, 250, 150, - 224, 107, 1, 155, 224, 107, 1, 224, 146, 224, 107, 1, 234, 123, 224, 107, - 1, 234, 10, 224, 107, 1, 233, 230, 224, 107, 1, 217, 71, 224, 107, 1, - 247, 174, 224, 107, 1, 247, 16, 224, 107, 1, 225, 214, 224, 107, 1, 225, - 158, 224, 107, 1, 225, 180, 224, 107, 1, 215, 109, 224, 107, 1, 201, 78, - 224, 107, 1, 201, 66, 224, 107, 1, 240, 41, 224, 107, 1, 240, 31, 224, - 107, 1, 209, 181, 224, 107, 1, 240, 25, 224, 107, 1, 216, 86, 224, 107, - 1, 189, 224, 107, 1, 202, 233, 224, 107, 1, 240, 136, 224, 107, 1, 239, - 176, 224, 107, 1, 176, 224, 107, 1, 161, 224, 107, 1, 213, 6, 224, 107, - 1, 249, 145, 224, 107, 1, 249, 45, 224, 107, 1, 248, 197, 224, 107, 1, - 166, 224, 107, 1, 164, 224, 107, 1, 169, 224, 107, 1, 172, 224, 107, 1, - 199, 152, 224, 107, 1, 207, 50, 224, 107, 1, 183, 224, 107, 1, 142, 224, - 107, 2, 251, 51, 224, 107, 18, 2, 252, 168, 224, 107, 18, 2, 68, 224, - 107, 18, 2, 226, 120, 224, 107, 18, 2, 66, 224, 107, 18, 2, 199, 245, - 224, 107, 18, 2, 69, 224, 107, 18, 2, 251, 200, 224, 107, 18, 2, 72, 224, - 107, 18, 2, 250, 150, 224, 107, 2, 215, 149, 224, 107, 2, 199, 7, 224, - 107, 17, 195, 79, 224, 107, 17, 100, 224, 107, 17, 102, 224, 107, 17, - 134, 224, 107, 17, 136, 224, 107, 17, 146, 224, 107, 17, 167, 224, 107, - 17, 178, 224, 107, 17, 171, 224, 107, 17, 182, 233, 109, 2, 38, 251, 52, - 57, 233, 109, 2, 247, 133, 233, 109, 2, 251, 51, 233, 109, 2, 199, 2, - 233, 109, 1, 63, 233, 109, 1, 252, 168, 233, 109, 1, 68, 233, 109, 1, - 226, 120, 233, 109, 1, 66, 233, 109, 1, 199, 245, 233, 109, 1, 110, 144, - 233, 109, 1, 110, 159, 233, 109, 1, 237, 54, 233, 109, 1, 251, 200, 233, - 109, 1, 214, 102, 233, 109, 1, 250, 150, 233, 109, 1, 155, 233, 109, 1, - 224, 146, 233, 109, 1, 234, 123, 233, 109, 1, 233, 230, 233, 109, 1, 217, - 71, 233, 109, 1, 247, 174, 233, 109, 1, 247, 16, 233, 109, 1, 225, 214, - 233, 109, 1, 225, 180, 233, 109, 1, 215, 109, 233, 109, 1, 201, 78, 233, - 109, 1, 201, 66, 233, 109, 1, 240, 41, 233, 109, 1, 240, 25, 233, 109, 1, - 216, 86, 233, 109, 1, 189, 233, 109, 1, 202, 233, 233, 109, 1, 240, 136, - 233, 109, 1, 239, 176, 233, 109, 1, 176, 233, 109, 1, 161, 233, 109, 1, - 213, 6, 233, 109, 1, 249, 145, 233, 109, 1, 248, 197, 233, 109, 1, 166, - 233, 109, 1, 164, 233, 109, 1, 169, 233, 109, 1, 172, 233, 109, 1, 222, - 37, 233, 109, 1, 199, 152, 233, 109, 1, 207, 50, 233, 109, 1, 205, 80, - 233, 109, 1, 183, 233, 109, 1, 142, 38, 248, 161, 60, 233, 109, 2, 215, - 149, 233, 109, 2, 250, 132, 233, 109, 18, 2, 252, 168, 233, 109, 18, 2, - 68, 233, 109, 18, 2, 226, 120, 233, 109, 18, 2, 66, 233, 109, 18, 2, 199, - 245, 233, 109, 18, 2, 110, 144, 233, 109, 18, 2, 110, 209, 182, 233, 109, - 18, 2, 237, 54, 233, 109, 18, 2, 251, 200, 233, 109, 18, 2, 214, 102, - 233, 109, 18, 2, 250, 150, 233, 109, 2, 199, 7, 233, 109, 214, 127, 233, - 109, 250, 151, 222, 158, 78, 233, 109, 2, 212, 123, 233, 109, 1, 199, - 115, 251, 51, 233, 109, 1, 199, 115, 52, 251, 51, 233, 109, 1, 110, 209, - 182, 233, 109, 1, 110, 222, 38, 233, 109, 18, 2, 110, 159, 233, 109, 18, - 2, 110, 222, 38, 38, 233, 109, 17, 195, 79, 38, 233, 109, 17, 100, 38, - 233, 109, 17, 102, 38, 233, 109, 17, 134, 38, 233, 109, 17, 136, 38, 233, - 109, 17, 146, 38, 233, 109, 17, 167, 38, 233, 109, 1, 63, 38, 233, 109, - 1, 155, 38, 233, 109, 1, 176, 38, 233, 109, 1, 199, 34, 38, 233, 109, 1, - 161, 217, 81, 1, 63, 217, 81, 1, 252, 168, 217, 81, 1, 68, 217, 81, 1, - 226, 120, 217, 81, 1, 66, 217, 81, 1, 199, 245, 217, 81, 1, 110, 144, - 217, 81, 1, 110, 209, 182, 217, 81, 1, 110, 159, 217, 81, 1, 110, 222, - 38, 217, 81, 1, 69, 217, 81, 1, 251, 200, 217, 81, 1, 72, 217, 81, 1, - 250, 150, 217, 81, 1, 155, 217, 81, 1, 224, 146, 217, 81, 1, 234, 123, - 217, 81, 1, 233, 230, 217, 81, 1, 217, 71, 217, 81, 1, 217, 20, 217, 81, - 1, 247, 174, 217, 81, 1, 247, 16, 217, 81, 1, 225, 214, 217, 81, 1, 225, - 180, 217, 81, 1, 215, 109, 217, 81, 1, 215, 91, 217, 81, 1, 201, 78, 217, - 81, 1, 201, 66, 217, 81, 1, 240, 41, 217, 81, 1, 240, 25, 217, 81, 1, - 216, 86, 217, 81, 1, 189, 217, 81, 1, 202, 233, 217, 81, 1, 240, 136, - 217, 81, 1, 239, 176, 217, 81, 1, 176, 217, 81, 1, 216, 227, 217, 81, 1, - 161, 217, 81, 1, 213, 6, 217, 81, 1, 249, 145, 217, 81, 1, 248, 197, 217, - 81, 1, 166, 217, 81, 1, 219, 81, 217, 81, 1, 164, 217, 81, 1, 169, 217, - 81, 1, 210, 77, 217, 81, 1, 172, 217, 81, 1, 222, 122, 217, 81, 1, 197, - 166, 217, 81, 1, 207, 50, 217, 81, 1, 205, 80, 217, 81, 1, 183, 217, 81, - 1, 142, 217, 81, 18, 2, 252, 168, 217, 81, 18, 2, 68, 217, 81, 18, 2, - 226, 120, 217, 81, 18, 2, 66, 217, 81, 18, 2, 199, 245, 217, 81, 18, 2, - 110, 144, 217, 81, 18, 2, 110, 209, 182, 217, 81, 18, 2, 110, 159, 217, - 81, 18, 2, 110, 222, 38, 217, 81, 18, 2, 69, 217, 81, 18, 2, 251, 200, - 217, 81, 18, 2, 72, 217, 81, 18, 2, 250, 150, 217, 81, 2, 199, 7, 217, - 81, 2, 247, 133, 217, 81, 2, 251, 51, 217, 81, 2, 199, 2, 217, 81, 2, - 215, 149, 217, 81, 2, 250, 132, 217, 81, 2, 48, 251, 51, 217, 81, 214, - 127, 217, 81, 206, 99, 217, 81, 240, 88, 217, 81, 52, 240, 88, 217, 81, - 244, 159, 217, 81, 234, 87, 235, 134, 217, 81, 252, 30, 55, 217, 81, 17, - 195, 79, 217, 81, 17, 100, 217, 81, 17, 102, 217, 81, 17, 134, 217, 81, - 17, 136, 217, 81, 17, 146, 217, 81, 17, 167, 217, 81, 17, 178, 217, 81, - 17, 171, 217, 81, 17, 182, 217, 81, 212, 148, 78, 217, 81, 226, 43, 55, - 217, 81, 208, 215, 78, 217, 81, 1, 199, 115, 251, 51, 202, 61, 251, 80, - 202, 61, 1, 63, 202, 61, 1, 252, 168, 202, 61, 1, 68, 202, 61, 1, 226, - 120, 202, 61, 1, 66, 202, 61, 1, 199, 245, 202, 61, 1, 110, 144, 202, 61, - 1, 110, 209, 182, 202, 61, 1, 110, 159, 202, 61, 1, 110, 222, 38, 202, - 61, 1, 69, 202, 61, 1, 251, 200, 202, 61, 1, 72, 202, 61, 1, 250, 150, - 202, 61, 1, 155, 202, 61, 1, 224, 146, 202, 61, 1, 234, 123, 202, 61, 1, - 233, 230, 202, 61, 1, 217, 71, 202, 61, 1, 247, 174, 202, 61, 1, 247, 16, - 202, 61, 1, 225, 214, 202, 61, 1, 225, 180, 202, 61, 1, 215, 109, 202, - 61, 1, 201, 78, 202, 61, 1, 201, 66, 202, 61, 1, 240, 41, 202, 61, 1, - 240, 25, 202, 61, 1, 216, 86, 202, 61, 1, 189, 202, 61, 1, 202, 233, 202, - 61, 1, 240, 136, 202, 61, 1, 239, 176, 202, 61, 1, 176, 202, 61, 1, 161, - 202, 61, 1, 213, 6, 202, 61, 1, 249, 145, 202, 61, 1, 248, 197, 202, 61, - 1, 166, 202, 61, 1, 164, 202, 61, 1, 169, 202, 61, 1, 172, 202, 61, 1, - 199, 152, 202, 61, 1, 207, 50, 202, 61, 1, 205, 80, 202, 61, 1, 183, 202, - 61, 1, 142, 202, 61, 18, 2, 252, 168, 202, 61, 18, 2, 68, 202, 61, 18, 2, - 226, 120, 202, 61, 18, 2, 66, 202, 61, 18, 2, 199, 245, 202, 61, 18, 2, - 110, 144, 202, 61, 18, 2, 110, 209, 182, 202, 61, 18, 2, 110, 159, 202, - 61, 18, 2, 110, 222, 38, 202, 61, 18, 2, 69, 202, 61, 18, 2, 206, 182, - 69, 202, 61, 18, 2, 251, 200, 202, 61, 18, 2, 72, 202, 61, 18, 2, 206, - 182, 72, 202, 61, 18, 2, 250, 150, 202, 61, 2, 247, 133, 202, 61, 2, 251, - 51, 202, 61, 2, 199, 2, 202, 61, 2, 199, 7, 202, 61, 2, 215, 149, 202, - 61, 2, 250, 132, 202, 61, 233, 35, 202, 61, 252, 30, 55, 202, 61, 214, - 127, 202, 61, 17, 195, 79, 202, 61, 17, 100, 202, 61, 17, 102, 202, 61, - 17, 134, 202, 61, 17, 136, 202, 61, 17, 146, 202, 61, 17, 167, 202, 61, - 17, 178, 202, 61, 17, 171, 202, 61, 17, 182, 206, 101, 1, 63, 206, 101, - 1, 252, 168, 206, 101, 1, 68, 206, 101, 1, 226, 120, 206, 101, 1, 66, - 206, 101, 1, 199, 245, 206, 101, 1, 110, 144, 206, 101, 1, 110, 209, 182, - 206, 101, 1, 110, 159, 206, 101, 1, 110, 222, 38, 206, 101, 1, 69, 206, - 101, 1, 251, 200, 206, 101, 1, 72, 206, 101, 1, 250, 150, 206, 101, 1, - 155, 206, 101, 1, 224, 146, 206, 101, 1, 234, 123, 206, 101, 1, 233, 230, - 206, 101, 1, 217, 71, 206, 101, 1, 247, 174, 206, 101, 1, 247, 16, 206, - 101, 1, 225, 214, 206, 101, 1, 225, 180, 206, 101, 1, 215, 109, 206, 101, - 1, 201, 78, 206, 101, 1, 201, 66, 206, 101, 1, 240, 41, 206, 101, 1, 240, - 25, 206, 101, 1, 216, 86, 206, 101, 1, 189, 206, 101, 1, 202, 233, 206, - 101, 1, 240, 136, 206, 101, 1, 239, 176, 206, 101, 1, 176, 206, 101, 1, - 161, 206, 101, 1, 213, 6, 206, 101, 1, 249, 145, 206, 101, 1, 248, 197, - 206, 101, 1, 166, 206, 101, 1, 164, 206, 101, 1, 169, 206, 101, 1, 172, - 206, 101, 1, 199, 152, 206, 101, 1, 207, 50, 206, 101, 1, 205, 80, 206, - 101, 1, 183, 206, 101, 1, 142, 206, 101, 18, 2, 252, 168, 206, 101, 18, - 2, 68, 206, 101, 18, 2, 226, 120, 206, 101, 18, 2, 66, 206, 101, 18, 2, - 199, 245, 206, 101, 18, 2, 110, 144, 206, 101, 18, 2, 110, 209, 182, 206, - 101, 18, 2, 69, 206, 101, 18, 2, 251, 200, 206, 101, 18, 2, 72, 206, 101, - 18, 2, 250, 150, 206, 101, 2, 247, 133, 206, 101, 2, 251, 51, 206, 101, - 2, 199, 2, 206, 101, 2, 199, 7, 206, 101, 2, 215, 149, 206, 101, 2, 206, - 100, 206, 101, 240, 88, 206, 101, 52, 240, 88, 206, 101, 207, 91, 238, - 253, 206, 101, 207, 91, 154, 206, 101, 210, 117, 220, 28, 206, 101, 210, - 117, 220, 27, 206, 101, 210, 117, 220, 26, 206, 101, 236, 222, 77, 202, - 238, 78, 206, 101, 208, 133, 117, 3, 201, 175, 26, 200, 167, 214, 58, - 206, 101, 208, 133, 117, 3, 201, 175, 26, 237, 250, 241, 70, 206, 101, - 208, 133, 117, 3, 210, 189, 26, 237, 250, 241, 70, 206, 101, 208, 133, - 117, 3, 210, 189, 26, 237, 250, 52, 241, 70, 206, 101, 208, 133, 117, 3, - 210, 189, 26, 237, 250, 201, 165, 241, 70, 206, 101, 208, 133, 117, 52, - 210, 2, 206, 101, 208, 133, 117, 52, 210, 3, 3, 210, 188, 206, 101, 208, - 133, 117, 3, 52, 241, 70, 206, 101, 208, 133, 117, 3, 201, 165, 241, 70, - 206, 101, 208, 133, 117, 3, 211, 90, 241, 70, 206, 101, 208, 133, 117, 3, - 207, 88, 241, 70, 206, 101, 208, 133, 117, 3, 244, 247, 26, 210, 188, - 206, 101, 208, 133, 117, 3, 244, 247, 26, 99, 236, 224, 206, 101, 208, - 133, 117, 3, 244, 247, 26, 235, 7, 236, 224, 206, 101, 1, 202, 155, 251, - 131, 68, 206, 101, 1, 200, 217, 251, 131, 68, 206, 101, 1, 200, 217, 251, - 131, 226, 120, 206, 101, 1, 251, 131, 66, 206, 101, 18, 2, 251, 131, 66, - 206, 101, 18, 2, 251, 131, 199, 245, 218, 236, 1, 63, 218, 236, 1, 252, - 168, 218, 236, 1, 68, 218, 236, 1, 226, 120, 218, 236, 1, 66, 218, 236, - 1, 199, 245, 218, 236, 1, 110, 144, 218, 236, 1, 110, 209, 182, 218, 236, - 1, 110, 159, 218, 236, 1, 110, 222, 38, 218, 236, 1, 69, 218, 236, 1, - 251, 200, 218, 236, 1, 72, 218, 236, 1, 250, 150, 218, 236, 1, 155, 218, - 236, 1, 224, 146, 218, 236, 1, 234, 123, 218, 236, 1, 233, 230, 218, 236, - 1, 217, 71, 218, 236, 1, 247, 174, 218, 236, 1, 247, 16, 218, 236, 1, - 225, 214, 218, 236, 1, 225, 180, 218, 236, 1, 215, 109, 218, 236, 1, 201, - 78, 218, 236, 1, 201, 66, 218, 236, 1, 240, 41, 218, 236, 1, 240, 25, - 218, 236, 1, 216, 86, 218, 236, 1, 189, 218, 236, 1, 202, 233, 218, 236, - 1, 240, 136, 218, 236, 1, 239, 176, 218, 236, 1, 176, 218, 236, 1, 161, - 218, 236, 1, 213, 6, 218, 236, 1, 249, 145, 218, 236, 1, 248, 197, 218, - 236, 1, 166, 218, 236, 1, 164, 218, 236, 1, 169, 218, 236, 1, 172, 218, - 236, 1, 199, 152, 218, 236, 1, 207, 50, 218, 236, 1, 205, 80, 218, 236, - 1, 183, 218, 236, 1, 142, 218, 236, 1, 222, 37, 218, 236, 18, 2, 252, - 168, 218, 236, 18, 2, 68, 218, 236, 18, 2, 226, 120, 218, 236, 18, 2, 66, - 218, 236, 18, 2, 199, 245, 218, 236, 18, 2, 110, 144, 218, 236, 18, 2, - 110, 209, 182, 218, 236, 18, 2, 110, 159, 218, 236, 18, 2, 110, 222, 38, - 218, 236, 18, 2, 69, 218, 236, 18, 2, 251, 200, 218, 236, 18, 2, 72, 218, - 236, 18, 2, 250, 150, 218, 236, 2, 251, 51, 218, 236, 2, 199, 2, 218, - 236, 2, 199, 7, 218, 236, 2, 250, 248, 218, 236, 240, 88, 218, 236, 52, - 240, 88, 218, 236, 252, 30, 55, 218, 236, 2, 231, 45, 218, 236, 17, 195, - 79, 218, 236, 17, 100, 218, 236, 17, 102, 218, 236, 17, 134, 218, 236, - 17, 136, 218, 236, 17, 146, 218, 236, 17, 167, 218, 236, 17, 178, 218, - 236, 17, 171, 218, 236, 17, 182, 96, 248, 155, 3, 214, 59, 96, 209, 194, - 248, 154, 96, 52, 248, 155, 3, 214, 59, 96, 201, 165, 248, 155, 3, 214, - 59, 96, 248, 155, 3, 52, 214, 59, 96, 209, 194, 248, 155, 3, 214, 59, 96, - 209, 194, 248, 155, 3, 52, 214, 59, 96, 226, 17, 248, 154, 96, 226, 17, - 248, 155, 3, 52, 214, 59, 96, 204, 51, 248, 154, 96, 204, 51, 248, 155, - 3, 214, 59, 96, 204, 51, 248, 155, 3, 52, 214, 59, 96, 163, 204, 51, 248, - 155, 3, 52, 214, 59, 203, 125, 1, 63, 203, 125, 1, 252, 168, 203, 125, 1, - 68, 203, 125, 1, 226, 120, 203, 125, 1, 66, 203, 125, 1, 199, 245, 203, - 125, 1, 69, 203, 125, 1, 251, 200, 203, 125, 1, 72, 203, 125, 1, 250, - 150, 203, 125, 1, 155, 203, 125, 1, 224, 146, 203, 125, 1, 234, 123, 203, - 125, 1, 233, 230, 203, 125, 1, 217, 71, 203, 125, 1, 247, 174, 203, 125, - 1, 247, 16, 203, 125, 1, 225, 214, 203, 125, 1, 225, 180, 203, 125, 1, - 215, 109, 203, 125, 1, 201, 78, 203, 125, 1, 201, 66, 203, 125, 1, 240, - 41, 203, 125, 1, 240, 25, 203, 125, 1, 216, 86, 203, 125, 1, 189, 203, - 125, 1, 202, 233, 203, 125, 1, 240, 136, 203, 125, 1, 239, 176, 203, 125, - 1, 176, 203, 125, 1, 161, 203, 125, 1, 213, 6, 203, 125, 1, 249, 145, - 203, 125, 1, 248, 197, 203, 125, 1, 166, 203, 125, 1, 164, 203, 125, 1, - 169, 203, 125, 1, 172, 203, 125, 1, 199, 152, 203, 125, 1, 207, 50, 203, - 125, 1, 183, 203, 125, 1, 142, 203, 125, 1, 209, 181, 203, 125, 2, 251, - 51, 203, 125, 2, 199, 2, 203, 125, 18, 2, 252, 168, 203, 125, 18, 2, 68, - 203, 125, 18, 2, 226, 120, 203, 125, 18, 2, 66, 203, 125, 18, 2, 199, - 245, 203, 125, 18, 2, 69, 203, 125, 18, 2, 251, 200, 203, 125, 18, 2, 72, - 203, 125, 18, 2, 250, 150, 203, 125, 2, 199, 7, 203, 125, 2, 215, 149, - 203, 125, 1, 250, 251, 224, 146, 203, 125, 17, 195, 79, 203, 125, 17, - 100, 203, 125, 17, 102, 203, 125, 17, 134, 203, 125, 17, 136, 203, 125, - 17, 146, 203, 125, 17, 167, 203, 125, 17, 178, 203, 125, 17, 171, 203, - 125, 17, 182, 251, 204, 1, 155, 251, 204, 1, 224, 146, 251, 204, 1, 217, - 71, 251, 204, 1, 176, 251, 204, 1, 189, 251, 204, 1, 251, 131, 189, 251, - 204, 1, 161, 251, 204, 1, 213, 6, 251, 204, 1, 249, 145, 251, 204, 1, - 166, 251, 204, 1, 225, 214, 251, 204, 1, 247, 16, 251, 204, 1, 202, 233, - 251, 204, 1, 169, 251, 204, 1, 172, 251, 204, 1, 183, 251, 204, 1, 215, - 109, 251, 204, 1, 142, 251, 204, 1, 63, 251, 204, 1, 240, 136, 251, 204, - 1, 239, 176, 251, 204, 1, 234, 123, 251, 204, 1, 251, 131, 234, 123, 251, - 204, 1, 233, 230, 251, 204, 1, 248, 197, 251, 204, 1, 225, 180, 251, 204, - 1, 251, 131, 249, 145, 251, 204, 108, 2, 219, 194, 172, 251, 204, 108, 2, - 219, 194, 169, 251, 204, 108, 2, 219, 194, 222, 96, 169, 251, 204, 18, 2, - 63, 251, 204, 18, 2, 252, 168, 251, 204, 18, 2, 68, 251, 204, 18, 2, 226, - 120, 251, 204, 18, 2, 66, 251, 204, 18, 2, 199, 245, 251, 204, 18, 2, 69, - 251, 204, 18, 2, 250, 127, 251, 204, 18, 2, 72, 251, 204, 18, 2, 251, - 200, 251, 204, 18, 2, 251, 123, 251, 204, 2, 224, 78, 251, 204, 17, 195, - 79, 251, 204, 17, 100, 251, 204, 17, 102, 251, 204, 17, 134, 251, 204, - 17, 136, 251, 204, 17, 146, 251, 204, 17, 167, 251, 204, 17, 178, 251, - 204, 17, 171, 251, 204, 17, 182, 251, 204, 31, 203, 23, 251, 204, 31, - 200, 234, 251, 204, 2, 4, 208, 132, 251, 204, 2, 208, 132, 251, 204, 2, - 209, 125, 251, 204, 16, 199, 34, 239, 16, 1, 63, 239, 16, 1, 252, 168, - 239, 16, 1, 68, 239, 16, 1, 226, 120, 239, 16, 1, 66, 239, 16, 1, 199, - 245, 239, 16, 1, 69, 239, 16, 1, 251, 200, 239, 16, 1, 72, 239, 16, 1, - 250, 150, 239, 16, 1, 155, 239, 16, 1, 224, 146, 239, 16, 1, 234, 123, - 239, 16, 1, 233, 230, 239, 16, 1, 217, 71, 239, 16, 1, 247, 174, 239, 16, - 1, 247, 16, 239, 16, 1, 225, 214, 239, 16, 1, 225, 180, 239, 16, 1, 215, - 109, 239, 16, 1, 201, 78, 239, 16, 1, 201, 66, 239, 16, 1, 240, 41, 239, - 16, 1, 240, 25, 239, 16, 1, 216, 86, 239, 16, 1, 189, 239, 16, 1, 202, - 233, 239, 16, 1, 240, 136, 239, 16, 1, 239, 176, 239, 16, 1, 176, 239, - 16, 1, 161, 239, 16, 1, 213, 6, 239, 16, 1, 249, 145, 239, 16, 1, 248, - 197, 239, 16, 1, 166, 239, 16, 1, 164, 239, 16, 1, 169, 239, 16, 1, 172, - 239, 16, 1, 199, 152, 239, 16, 1, 207, 50, 239, 16, 1, 205, 80, 239, 16, - 1, 183, 239, 16, 1, 142, 239, 16, 1, 209, 181, 239, 16, 18, 2, 252, 168, - 239, 16, 18, 2, 68, 239, 16, 18, 2, 226, 120, 239, 16, 18, 2, 66, 239, - 16, 18, 2, 199, 245, 239, 16, 18, 2, 110, 144, 239, 16, 18, 2, 110, 209, - 182, 239, 16, 18, 2, 69, 239, 16, 18, 2, 251, 200, 239, 16, 18, 2, 72, - 239, 16, 18, 2, 250, 150, 239, 16, 2, 251, 51, 239, 16, 2, 199, 2, 239, - 16, 2, 199, 7, 239, 16, 2, 215, 149, 239, 16, 252, 30, 55, 197, 139, 244, - 236, 6, 1, 217, 70, 197, 139, 244, 236, 6, 1, 63, 197, 139, 244, 236, 6, - 1, 197, 70, 197, 139, 244, 236, 6, 1, 195, 217, 197, 139, 244, 236, 6, 1, - 164, 197, 139, 244, 236, 6, 1, 196, 3, 197, 139, 244, 236, 6, 1, 226, - 120, 197, 139, 244, 236, 6, 1, 199, 245, 197, 139, 244, 236, 6, 1, 69, - 197, 139, 244, 236, 6, 1, 72, 197, 139, 244, 236, 6, 1, 251, 97, 197, - 139, 244, 236, 6, 1, 234, 123, 197, 139, 244, 236, 6, 1, 224, 11, 197, - 139, 244, 236, 6, 1, 236, 193, 197, 139, 244, 236, 6, 1, 195, 196, 197, - 139, 244, 236, 6, 1, 200, 106, 197, 139, 244, 236, 6, 1, 236, 212, 197, - 139, 244, 236, 6, 1, 214, 167, 197, 139, 244, 236, 6, 1, 201, 73, 197, - 139, 244, 236, 6, 1, 215, 135, 197, 139, 244, 236, 6, 1, 240, 136, 197, - 139, 244, 236, 6, 1, 250, 168, 197, 139, 244, 236, 6, 1, 251, 123, 197, - 139, 244, 236, 6, 1, 248, 21, 197, 139, 244, 236, 6, 1, 211, 227, 197, - 139, 244, 236, 6, 1, 232, 29, 197, 139, 244, 236, 6, 1, 231, 173, 197, - 139, 244, 236, 6, 1, 231, 100, 197, 139, 244, 236, 6, 1, 232, 175, 197, - 139, 244, 236, 6, 1, 205, 31, 197, 139, 244, 236, 6, 1, 206, 84, 197, - 139, 244, 236, 6, 1, 198, 249, 197, 139, 244, 236, 4, 1, 217, 70, 197, - 139, 244, 236, 4, 1, 63, 197, 139, 244, 236, 4, 1, 197, 70, 197, 139, - 244, 236, 4, 1, 195, 217, 197, 139, 244, 236, 4, 1, 164, 197, 139, 244, - 236, 4, 1, 196, 3, 197, 139, 244, 236, 4, 1, 226, 120, 197, 139, 244, - 236, 4, 1, 199, 245, 197, 139, 244, 236, 4, 1, 69, 197, 139, 244, 236, 4, - 1, 72, 197, 139, 244, 236, 4, 1, 251, 97, 197, 139, 244, 236, 4, 1, 234, - 123, 197, 139, 244, 236, 4, 1, 224, 11, 197, 139, 244, 236, 4, 1, 236, - 193, 197, 139, 244, 236, 4, 1, 195, 196, 197, 139, 244, 236, 4, 1, 200, - 106, 197, 139, 244, 236, 4, 1, 236, 212, 197, 139, 244, 236, 4, 1, 214, - 167, 197, 139, 244, 236, 4, 1, 201, 73, 197, 139, 244, 236, 4, 1, 215, - 135, 197, 139, 244, 236, 4, 1, 240, 136, 197, 139, 244, 236, 4, 1, 250, - 168, 197, 139, 244, 236, 4, 1, 251, 123, 197, 139, 244, 236, 4, 1, 248, - 21, 197, 139, 244, 236, 4, 1, 211, 227, 197, 139, 244, 236, 4, 1, 232, - 29, 197, 139, 244, 236, 4, 1, 231, 173, 197, 139, 244, 236, 4, 1, 231, - 100, 197, 139, 244, 236, 4, 1, 232, 175, 197, 139, 244, 236, 4, 1, 205, - 31, 197, 139, 244, 236, 4, 1, 206, 84, 197, 139, 244, 236, 4, 1, 198, - 249, 197, 139, 244, 236, 17, 195, 79, 197, 139, 244, 236, 17, 100, 197, - 139, 244, 236, 17, 102, 197, 139, 244, 236, 17, 134, 197, 139, 244, 236, - 17, 136, 197, 139, 244, 236, 17, 146, 197, 139, 244, 236, 17, 167, 197, - 139, 244, 236, 17, 178, 197, 139, 244, 236, 17, 171, 197, 139, 244, 236, - 17, 182, 197, 139, 244, 236, 31, 203, 23, 197, 139, 244, 236, 31, 200, - 234, 197, 139, 244, 236, 31, 202, 177, 197, 139, 244, 236, 31, 235, 14, - 197, 139, 244, 236, 31, 235, 145, 197, 139, 244, 236, 31, 206, 13, 197, - 139, 244, 236, 31, 207, 65, 197, 139, 244, 236, 31, 237, 20, 197, 139, - 244, 236, 31, 216, 174, 197, 139, 244, 236, 214, 127, 217, 218, 1, 63, - 217, 218, 1, 252, 168, 217, 218, 1, 68, 217, 218, 1, 226, 120, 217, 218, - 1, 66, 217, 218, 1, 199, 245, 217, 218, 1, 110, 144, 217, 218, 1, 110, - 209, 182, 217, 218, 1, 69, 217, 218, 1, 251, 200, 217, 218, 1, 72, 217, - 218, 1, 250, 150, 217, 218, 1, 155, 217, 218, 1, 224, 146, 217, 218, 1, - 234, 123, 217, 218, 1, 233, 230, 217, 218, 1, 217, 71, 217, 218, 1, 247, - 174, 217, 218, 1, 247, 16, 217, 218, 1, 225, 214, 217, 218, 1, 225, 180, - 217, 218, 1, 215, 109, 217, 218, 1, 201, 78, 217, 218, 1, 201, 66, 217, - 218, 1, 240, 41, 217, 218, 1, 240, 25, 217, 218, 1, 216, 86, 217, 218, 1, - 189, 217, 218, 1, 202, 233, 217, 218, 1, 240, 136, 217, 218, 1, 239, 176, - 217, 218, 1, 176, 217, 218, 1, 161, 217, 218, 1, 213, 6, 217, 218, 1, - 249, 145, 217, 218, 1, 248, 197, 217, 218, 1, 166, 217, 218, 1, 164, 217, - 218, 1, 169, 217, 218, 1, 172, 217, 218, 1, 199, 152, 217, 218, 1, 207, - 50, 217, 218, 1, 205, 80, 217, 218, 1, 183, 217, 218, 1, 142, 217, 218, - 1, 222, 37, 217, 218, 1, 209, 181, 217, 218, 18, 2, 252, 168, 217, 218, - 18, 2, 68, 217, 218, 18, 2, 226, 120, 217, 218, 18, 2, 66, 217, 218, 18, - 2, 199, 245, 217, 218, 18, 2, 110, 144, 217, 218, 18, 2, 110, 209, 182, - 217, 218, 18, 2, 69, 217, 218, 18, 2, 251, 200, 217, 218, 18, 2, 72, 217, - 218, 18, 2, 250, 150, 217, 218, 2, 251, 51, 217, 218, 2, 199, 2, 217, - 218, 2, 199, 7, 217, 218, 2, 250, 132, 217, 218, 2, 206, 100, 217, 218, - 232, 130, 217, 218, 18, 2, 212, 11, 69, 195, 102, 47, 1, 63, 195, 102, - 47, 18, 2, 68, 195, 102, 47, 18, 2, 200, 99, 195, 102, 47, 18, 2, 66, - 195, 102, 47, 18, 2, 69, 195, 102, 47, 18, 2, 214, 164, 195, 102, 47, 18, - 2, 72, 195, 102, 47, 18, 2, 251, 200, 195, 102, 47, 18, 2, 250, 150, 195, - 102, 47, 18, 2, 210, 89, 68, 195, 102, 47, 18, 222, 158, 78, 195, 102, - 47, 1, 155, 195, 102, 47, 1, 224, 146, 195, 102, 47, 1, 234, 123, 195, - 102, 47, 1, 233, 230, 195, 102, 47, 1, 217, 71, 195, 102, 47, 1, 247, - 174, 195, 102, 47, 1, 247, 16, 195, 102, 47, 1, 225, 214, 195, 102, 47, - 1, 215, 109, 195, 102, 47, 1, 201, 78, 195, 102, 47, 1, 201, 66, 195, - 102, 47, 1, 240, 41, 195, 102, 47, 1, 240, 25, 195, 102, 47, 1, 216, 86, - 195, 102, 47, 1, 189, 195, 102, 47, 1, 202, 233, 195, 102, 47, 1, 240, - 136, 195, 102, 47, 1, 239, 176, 195, 102, 47, 1, 176, 195, 102, 47, 1, - 161, 195, 102, 47, 1, 213, 6, 195, 102, 47, 1, 249, 145, 195, 102, 47, 1, - 248, 197, 195, 102, 47, 1, 166, 195, 102, 47, 1, 201, 113, 195, 102, 47, - 1, 201, 103, 195, 102, 47, 1, 237, 156, 195, 102, 47, 1, 237, 150, 195, - 102, 47, 1, 195, 74, 195, 102, 47, 1, 195, 115, 195, 102, 47, 1, 255, - 176, 195, 102, 47, 1, 164, 195, 102, 47, 1, 169, 195, 102, 47, 1, 172, - 195, 102, 47, 1, 199, 152, 195, 102, 47, 1, 207, 50, 195, 102, 47, 1, - 205, 80, 195, 102, 47, 1, 183, 195, 102, 47, 1, 142, 195, 102, 47, 1, - 223, 201, 195, 102, 47, 48, 108, 78, 195, 102, 47, 2, 199, 7, 195, 102, - 47, 2, 247, 133, 195, 102, 47, 2, 247, 134, 3, 214, 59, 195, 102, 47, 2, - 247, 136, 3, 214, 59, 195, 102, 47, 2, 251, 51, 195, 102, 47, 2, 199, 2, - 195, 102, 47, 244, 185, 1, 169, 195, 102, 47, 244, 186, 1, 164, 195, 102, - 47, 244, 186, 1, 169, 195, 102, 47, 244, 186, 1, 172, 195, 102, 47, 244, - 186, 1, 199, 152, 195, 102, 47, 84, 232, 138, 78, 195, 102, 47, 244, 199, - 232, 138, 78, 195, 102, 47, 117, 201, 98, 195, 102, 47, 117, 207, 42, - 195, 102, 47, 117, 52, 207, 42, 195, 102, 47, 117, 181, 201, 98, 195, - 102, 47, 84, 237, 242, 232, 138, 78, 195, 102, 47, 244, 199, 237, 242, - 232, 138, 78, 195, 102, 47, 204, 151, 205, 152, 1, 63, 205, 152, 18, 2, - 68, 205, 152, 18, 2, 200, 99, 205, 152, 18, 2, 66, 205, 152, 18, 2, 69, - 205, 152, 18, 2, 72, 205, 152, 18, 2, 214, 164, 205, 152, 18, 2, 251, - 200, 205, 152, 18, 2, 250, 150, 205, 152, 18, 2, 110, 144, 205, 152, 18, - 2, 110, 159, 205, 152, 18, 222, 158, 78, 205, 152, 1, 155, 205, 152, 1, - 224, 146, 205, 152, 1, 234, 123, 205, 152, 1, 233, 230, 205, 152, 1, 217, - 71, 205, 152, 1, 247, 174, 205, 152, 1, 247, 16, 205, 152, 1, 225, 214, - 205, 152, 1, 225, 180, 205, 152, 1, 215, 109, 205, 152, 1, 201, 78, 205, - 152, 1, 201, 66, 205, 152, 1, 240, 41, 205, 152, 1, 240, 25, 205, 152, 1, - 216, 86, 205, 152, 1, 189, 205, 152, 1, 202, 233, 205, 152, 1, 240, 136, - 205, 152, 1, 239, 176, 205, 152, 1, 176, 205, 152, 1, 161, 205, 152, 1, - 213, 6, 205, 152, 1, 249, 145, 205, 152, 1, 248, 197, 205, 152, 1, 166, - 205, 152, 1, 201, 113, 205, 152, 1, 201, 103, 205, 152, 1, 237, 156, 205, - 152, 1, 195, 74, 205, 152, 1, 195, 115, 205, 152, 1, 255, 176, 205, 152, - 1, 164, 205, 152, 1, 169, 205, 152, 1, 172, 205, 152, 1, 199, 152, 205, - 152, 1, 207, 50, 205, 152, 1, 205, 80, 205, 152, 1, 183, 205, 152, 1, - 142, 205, 152, 1, 223, 201, 205, 152, 2, 225, 165, 205, 152, 2, 200, 34, - 205, 152, 244, 185, 1, 169, 205, 152, 244, 185, 1, 172, 205, 152, 244, - 185, 1, 207, 50, 205, 152, 244, 185, 1, 183, 205, 152, 48, 108, 2, 234, - 190, 205, 152, 48, 108, 2, 225, 80, 205, 152, 48, 108, 2, 217, 73, 205, - 152, 48, 108, 2, 240, 231, 205, 152, 48, 108, 2, 218, 55, 205, 152, 48, - 108, 2, 250, 112, 205, 152, 48, 108, 2, 221, 136, 205, 152, 48, 108, 2, - 144, 205, 152, 48, 108, 2, 159, 205, 152, 48, 108, 2, 207, 52, 205, 152, - 48, 108, 2, 209, 80, 205, 152, 48, 108, 2, 255, 176, 205, 152, 2, 251, - 51, 205, 152, 2, 199, 2, 205, 152, 234, 36, 78, 205, 152, 204, 151, 205, - 152, 117, 201, 98, 205, 152, 117, 207, 42, 205, 152, 117, 52, 207, 42, - 205, 152, 117, 212, 123, 205, 152, 232, 138, 117, 3, 218, 190, 26, 204, - 112, 26, 201, 165, 235, 86, 205, 152, 232, 138, 117, 3, 218, 190, 26, - 204, 112, 26, 235, 86, 205, 152, 232, 138, 117, 3, 218, 190, 26, 204, - 111, 205, 152, 203, 9, 220, 28, 205, 152, 203, 9, 220, 27, 213, 109, 244, - 254, 232, 159, 1, 161, 213, 109, 244, 254, 232, 159, 1, 155, 213, 109, - 244, 254, 232, 159, 1, 172, 213, 109, 244, 254, 232, 159, 1, 166, 213, - 109, 244, 254, 232, 159, 1, 240, 136, 213, 109, 244, 254, 232, 159, 1, - 195, 115, 213, 109, 244, 254, 232, 159, 1, 199, 152, 213, 109, 244, 254, - 232, 159, 1, 217, 71, 213, 109, 244, 254, 232, 159, 1, 142, 213, 109, - 244, 254, 232, 159, 1, 234, 123, 213, 109, 244, 254, 232, 159, 1, 224, - 146, 213, 109, 244, 254, 232, 159, 1, 183, 213, 109, 244, 254, 232, 159, - 1, 249, 145, 213, 109, 244, 254, 232, 159, 1, 247, 174, 213, 109, 244, - 254, 232, 159, 1, 189, 213, 109, 244, 254, 232, 159, 1, 202, 233, 213, - 109, 244, 254, 232, 159, 1, 176, 213, 109, 244, 254, 232, 159, 1, 213, 6, - 213, 109, 244, 254, 232, 159, 1, 169, 213, 109, 244, 254, 232, 159, 1, - 235, 239, 213, 109, 244, 254, 232, 159, 1, 247, 16, 213, 109, 244, 254, - 232, 159, 1, 63, 213, 109, 244, 254, 232, 159, 1, 69, 213, 109, 244, 254, - 232, 159, 1, 68, 213, 109, 244, 254, 232, 159, 1, 72, 213, 109, 244, 254, - 232, 159, 1, 66, 213, 109, 244, 254, 232, 159, 1, 200, 114, 213, 109, - 244, 254, 232, 159, 1, 230, 210, 213, 109, 244, 254, 232, 159, 1, 48, - 214, 3, 213, 109, 244, 254, 232, 159, 1, 48, 225, 80, 213, 109, 244, 254, - 232, 159, 1, 48, 203, 216, 213, 109, 244, 254, 232, 159, 1, 48, 221, 136, - 213, 109, 244, 254, 232, 159, 1, 48, 218, 55, 213, 109, 244, 254, 232, - 159, 1, 48, 159, 213, 109, 244, 254, 232, 159, 1, 48, 197, 199, 213, 109, - 244, 254, 232, 159, 1, 48, 217, 73, 213, 109, 244, 254, 232, 159, 1, 48, - 196, 148, 213, 109, 244, 254, 232, 159, 209, 250, 152, 221, 240, 213, - 109, 244, 254, 232, 159, 209, 250, 202, 11, 213, 109, 244, 254, 232, 159, - 208, 215, 233, 152, 204, 226, 213, 109, 244, 254, 232, 159, 209, 250, - 152, 181, 235, 130, 213, 109, 244, 254, 232, 159, 209, 250, 152, 235, - 130, 213, 109, 244, 254, 232, 159, 208, 215, 233, 152, 204, 227, 235, - 130, 213, 109, 244, 254, 232, 159, 208, 215, 152, 221, 240, 213, 109, - 244, 254, 232, 159, 208, 215, 202, 11, 213, 109, 244, 254, 232, 159, 208, - 215, 152, 181, 235, 130, 213, 109, 244, 254, 232, 159, 208, 215, 152, - 235, 130, 213, 109, 244, 254, 232, 159, 219, 64, 202, 11, 213, 109, 244, - 254, 232, 159, 233, 152, 204, 227, 199, 131, 213, 109, 244, 254, 232, - 159, 219, 64, 152, 181, 235, 130, 213, 109, 244, 254, 232, 159, 219, 64, - 152, 235, 130, 213, 109, 244, 254, 232, 159, 221, 206, 152, 221, 240, - 213, 109, 244, 254, 232, 159, 221, 206, 202, 11, 213, 109, 244, 254, 232, - 159, 233, 152, 204, 226, 213, 109, 244, 254, 232, 159, 221, 206, 152, - 181, 235, 130, 213, 109, 244, 254, 232, 159, 221, 206, 152, 235, 130, - 213, 109, 244, 254, 232, 159, 233, 152, 204, 227, 235, 130, 248, 195, 1, - 63, 248, 195, 1, 252, 168, 248, 195, 1, 68, 248, 195, 1, 226, 120, 248, - 195, 1, 66, 248, 195, 1, 199, 245, 248, 195, 1, 110, 144, 248, 195, 1, - 110, 209, 182, 248, 195, 1, 110, 159, 248, 195, 1, 69, 248, 195, 1, 251, - 200, 248, 195, 1, 72, 248, 195, 1, 250, 150, 248, 195, 1, 155, 248, 195, - 1, 224, 146, 248, 195, 1, 234, 123, 248, 195, 1, 233, 230, 248, 195, 1, - 217, 71, 248, 195, 1, 247, 174, 248, 195, 1, 247, 16, 248, 195, 1, 225, - 214, 248, 195, 1, 225, 180, 248, 195, 1, 215, 109, 248, 195, 1, 201, 78, - 248, 195, 1, 201, 66, 248, 195, 1, 240, 41, 248, 195, 1, 240, 25, 248, - 195, 1, 216, 86, 248, 195, 1, 189, 248, 195, 1, 202, 233, 248, 195, 1, - 240, 136, 248, 195, 1, 239, 176, 248, 195, 1, 176, 248, 195, 1, 161, 248, - 195, 1, 213, 6, 248, 195, 1, 249, 145, 248, 195, 1, 248, 197, 248, 195, - 1, 166, 248, 195, 1, 164, 248, 195, 1, 169, 248, 195, 1, 172, 248, 195, - 1, 199, 152, 248, 195, 1, 207, 50, 248, 195, 1, 205, 80, 248, 195, 1, - 183, 248, 195, 1, 142, 248, 195, 18, 2, 252, 168, 248, 195, 18, 2, 68, - 248, 195, 18, 2, 226, 120, 248, 195, 18, 2, 66, 248, 195, 18, 2, 199, - 245, 248, 195, 18, 2, 110, 144, 248, 195, 18, 2, 110, 209, 182, 248, 195, - 18, 2, 110, 159, 248, 195, 18, 2, 69, 248, 195, 18, 2, 251, 200, 248, - 195, 18, 2, 72, 248, 195, 18, 2, 250, 150, 248, 195, 2, 247, 133, 248, - 195, 2, 251, 51, 248, 195, 2, 199, 2, 248, 195, 2, 199, 7, 248, 195, 2, - 250, 132, 248, 195, 240, 88, 248, 195, 52, 240, 88, 248, 195, 197, 9, - 207, 90, 248, 195, 234, 87, 235, 133, 248, 195, 234, 87, 235, 132, 248, - 195, 17, 195, 79, 248, 195, 17, 100, 248, 195, 17, 102, 248, 195, 17, - 134, 248, 195, 17, 136, 248, 195, 17, 146, 248, 195, 17, 167, 248, 195, - 17, 178, 248, 195, 17, 171, 248, 195, 17, 182, 248, 195, 31, 100, 248, - 195, 31, 102, 248, 195, 31, 134, 248, 195, 31, 136, 248, 195, 31, 146, - 248, 195, 31, 167, 248, 195, 31, 178, 248, 195, 31, 171, 248, 195, 31, - 182, 248, 195, 31, 203, 23, 248, 195, 31, 200, 234, 248, 195, 31, 202, - 177, 248, 195, 31, 235, 14, 248, 195, 31, 235, 145, 248, 195, 31, 206, - 13, 248, 195, 31, 207, 65, 248, 195, 31, 237, 20, 248, 195, 31, 216, 174, - 248, 195, 231, 56, 200, 50, 78, 220, 30, 232, 138, 78, 220, 30, 117, 207, - 42, 220, 30, 1, 155, 220, 30, 1, 224, 146, 220, 30, 1, 234, 123, 220, 30, - 1, 217, 71, 220, 30, 1, 247, 174, 220, 30, 1, 247, 16, 220, 30, 1, 225, - 214, 220, 30, 1, 215, 109, 220, 30, 1, 189, 220, 30, 1, 202, 233, 220, - 30, 1, 240, 136, 220, 30, 1, 176, 220, 30, 1, 161, 220, 30, 1, 213, 6, - 220, 30, 1, 249, 145, 220, 30, 1, 166, 220, 30, 1, 201, 113, 220, 30, 1, - 201, 103, 220, 30, 1, 237, 156, 220, 30, 1, 197, 166, 220, 30, 1, 195, - 74, 220, 30, 1, 195, 115, 220, 30, 1, 255, 176, 220, 30, 1, 164, 220, 30, - 1, 169, 220, 30, 1, 172, 220, 30, 1, 207, 50, 220, 30, 1, 183, 220, 30, - 1, 142, 220, 30, 1, 63, 220, 30, 204, 152, 1, 155, 220, 30, 204, 152, 1, - 224, 146, 220, 30, 204, 152, 1, 234, 123, 220, 30, 204, 152, 1, 217, 71, - 220, 30, 204, 152, 1, 247, 174, 220, 30, 204, 152, 1, 247, 16, 220, 30, - 204, 152, 1, 225, 214, 220, 30, 204, 152, 1, 215, 109, 220, 30, 204, 152, - 1, 189, 220, 30, 204, 152, 1, 202, 233, 220, 30, 204, 152, 1, 240, 136, - 220, 30, 204, 152, 1, 176, 220, 30, 204, 152, 1, 161, 220, 30, 204, 152, - 1, 213, 6, 220, 30, 204, 152, 1, 249, 145, 220, 30, 204, 152, 1, 166, - 220, 30, 204, 152, 1, 201, 113, 220, 30, 204, 152, 1, 201, 103, 220, 30, - 204, 152, 1, 237, 156, 220, 30, 204, 152, 1, 197, 166, 220, 30, 204, 152, - 1, 195, 74, 220, 30, 204, 152, 1, 195, 115, 220, 30, 204, 152, 1, 164, - 220, 30, 204, 152, 1, 169, 220, 30, 204, 152, 1, 172, 220, 30, 204, 152, - 1, 207, 50, 220, 30, 204, 152, 1, 183, 220, 30, 204, 152, 1, 142, 220, - 30, 204, 152, 1, 63, 220, 30, 18, 2, 252, 168, 220, 30, 18, 2, 68, 220, - 30, 18, 2, 66, 220, 30, 18, 2, 69, 220, 30, 18, 2, 72, 220, 30, 2, 251, - 51, 220, 30, 2, 247, 133, 220, 14, 121, 1, 63, 220, 14, 121, 1, 252, 168, - 220, 14, 121, 1, 68, 220, 14, 121, 1, 226, 120, 220, 14, 121, 1, 66, 220, - 14, 121, 1, 199, 245, 220, 14, 121, 1, 69, 220, 14, 121, 1, 251, 200, - 220, 14, 121, 1, 72, 220, 14, 121, 1, 250, 150, 220, 14, 121, 1, 155, - 220, 14, 121, 1, 224, 146, 220, 14, 121, 1, 234, 123, 220, 14, 121, 1, - 233, 230, 220, 14, 121, 1, 217, 71, 220, 14, 121, 1, 247, 174, 220, 14, - 121, 1, 247, 16, 220, 14, 121, 1, 225, 214, 220, 14, 121, 1, 225, 180, - 220, 14, 121, 1, 215, 109, 220, 14, 121, 1, 201, 78, 220, 14, 121, 1, - 201, 66, 220, 14, 121, 1, 240, 41, 220, 14, 121, 1, 240, 25, 220, 14, - 121, 1, 216, 86, 220, 14, 121, 1, 189, 220, 14, 121, 1, 202, 233, 220, - 14, 121, 1, 240, 136, 220, 14, 121, 1, 239, 176, 220, 14, 121, 1, 176, - 220, 14, 121, 1, 161, 220, 14, 121, 1, 213, 6, 220, 14, 121, 1, 249, 145, - 220, 14, 121, 1, 248, 197, 220, 14, 121, 1, 166, 220, 14, 121, 1, 164, - 220, 14, 121, 1, 169, 220, 14, 121, 1, 172, 220, 14, 121, 1, 199, 152, - 220, 14, 121, 1, 207, 50, 220, 14, 121, 1, 205, 80, 220, 14, 121, 1, 183, - 220, 14, 121, 1, 142, 220, 14, 121, 1, 222, 37, 220, 14, 121, 1, 223, - 201, 220, 14, 121, 1, 225, 130, 220, 14, 121, 1, 201, 217, 220, 14, 121, - 18, 2, 252, 168, 220, 14, 121, 18, 2, 68, 220, 14, 121, 18, 2, 226, 120, - 220, 14, 121, 18, 2, 66, 220, 14, 121, 18, 2, 199, 245, 220, 14, 121, 18, - 2, 110, 144, 220, 14, 121, 18, 2, 69, 220, 14, 121, 18, 2, 251, 200, 220, - 14, 121, 18, 2, 72, 220, 14, 121, 18, 2, 250, 150, 220, 14, 121, 2, 251, - 51, 220, 14, 121, 2, 199, 2, 220, 14, 121, 2, 215, 149, 220, 14, 121, 2, - 247, 135, 220, 14, 121, 2, 232, 227, 220, 14, 121, 199, 7, 220, 14, 121, - 210, 115, 220, 14, 121, 210, 247, 220, 14, 121, 17, 195, 79, 220, 14, - 121, 17, 100, 220, 14, 121, 17, 102, 220, 14, 121, 17, 134, 220, 14, 121, - 17, 136, 220, 14, 121, 17, 146, 220, 14, 121, 17, 167, 220, 14, 121, 17, - 178, 220, 14, 121, 17, 171, 220, 14, 121, 17, 182, 233, 54, 121, 1, 63, - 233, 54, 121, 1, 252, 168, 233, 54, 121, 1, 68, 233, 54, 121, 1, 226, - 120, 233, 54, 121, 1, 66, 233, 54, 121, 1, 199, 245, 233, 54, 121, 1, - 237, 54, 233, 54, 121, 1, 251, 200, 233, 54, 121, 1, 214, 102, 233, 54, - 121, 1, 250, 150, 233, 54, 121, 1, 164, 233, 54, 121, 1, 199, 152, 233, - 54, 121, 1, 249, 145, 233, 54, 121, 1, 248, 197, 233, 54, 121, 1, 166, - 233, 54, 121, 1, 155, 233, 54, 121, 1, 224, 146, 233, 54, 121, 1, 189, - 233, 54, 121, 1, 202, 233, 233, 54, 121, 1, 172, 233, 54, 121, 1, 234, - 123, 233, 54, 121, 1, 233, 230, 233, 54, 121, 1, 240, 136, 233, 54, 121, - 1, 239, 176, 233, 54, 121, 1, 176, 233, 54, 121, 1, 247, 174, 233, 54, - 121, 1, 247, 16, 233, 54, 121, 1, 201, 78, 233, 54, 121, 1, 201, 66, 233, - 54, 121, 1, 222, 37, 233, 54, 121, 1, 225, 214, 233, 54, 121, 1, 225, - 180, 233, 54, 121, 1, 240, 41, 233, 54, 121, 1, 240, 25, 233, 54, 121, 1, - 217, 71, 233, 54, 121, 1, 161, 233, 54, 121, 1, 213, 6, 233, 54, 121, 1, - 142, 233, 54, 121, 1, 169, 233, 54, 121, 1, 183, 233, 54, 121, 18, 2, - 252, 168, 233, 54, 121, 18, 2, 68, 233, 54, 121, 18, 2, 226, 120, 233, - 54, 121, 18, 2, 66, 233, 54, 121, 18, 2, 199, 245, 233, 54, 121, 18, 2, - 237, 54, 233, 54, 121, 18, 2, 251, 200, 233, 54, 121, 18, 2, 214, 102, - 233, 54, 121, 18, 2, 250, 150, 233, 54, 121, 2, 251, 51, 233, 54, 121, 2, - 199, 2, 233, 54, 121, 199, 7, 233, 54, 121, 214, 127, 233, 54, 121, 17, - 195, 79, 233, 54, 121, 17, 100, 233, 54, 121, 17, 102, 233, 54, 121, 17, - 134, 233, 54, 121, 17, 136, 233, 54, 121, 17, 146, 233, 54, 121, 17, 167, - 233, 54, 121, 17, 178, 233, 54, 121, 17, 171, 233, 54, 121, 17, 182, 220, - 71, 1, 155, 220, 71, 1, 234, 123, 220, 71, 1, 217, 71, 220, 71, 1, 161, - 220, 71, 1, 249, 145, 220, 71, 1, 166, 220, 71, 1, 189, 220, 71, 1, 240, - 136, 220, 71, 1, 176, 220, 71, 1, 247, 174, 220, 71, 1, 225, 214, 220, - 71, 1, 215, 109, 220, 71, 1, 164, 220, 71, 1, 169, 220, 71, 1, 172, 220, - 71, 1, 199, 152, 220, 71, 1, 183, 220, 71, 1, 63, 220, 71, 251, 93, 220, - 71, 18, 2, 68, 220, 71, 18, 2, 66, 220, 71, 18, 2, 69, 220, 71, 18, 2, - 72, 220, 71, 213, 121, 220, 71, 236, 222, 77, 208, 132, 42, 191, 97, 202, - 151, 42, 191, 97, 214, 115, 42, 191, 97, 237, 23, 42, 191, 97, 206, 11, - 42, 191, 97, 235, 17, 42, 191, 97, 202, 173, 42, 191, 115, 237, 22, 42, - 191, 115, 206, 10, 42, 191, 97, 200, 237, 42, 191, 97, 206, 20, 42, 191, - 97, 206, 19, 42, 191, 97, 203, 14, 42, 191, 97, 237, 26, 42, 191, 115, - 200, 236, 42, 191, 115, 206, 18, 42, 191, 97, 235, 148, 42, 191, 97, 211, - 87, 42, 191, 97, 232, 224, 42, 191, 97, 232, 223, 42, 191, 115, 211, 85, - 42, 191, 237, 233, 235, 223, 224, 79, 42, 2, 217, 102, 42, 2, 247, 21, - 42, 2, 252, 119, 42, 2, 199, 233, 42, 2, 218, 82, 42, 2, 223, 151, 42, 2, - 213, 112, 42, 2, 218, 126, 42, 2, 225, 52, 42, 2, 213, 189, 42, 2, 212, - 93, 42, 2, 199, 137, 42, 2, 213, 238, 42, 2, 223, 140, 42, 2, 199, 108, - 42, 197, 85, 241, 33, 55, 42, 237, 204, 241, 33, 55, 42, 222, 237, 55, - 42, 208, 234, 213, 192, 55, 42, 201, 212, 241, 74, 55, 42, 201, 212, 31, - 55, 42, 241, 16, 55, 42, 26, 214, 168, 55, 42, 205, 129, 55, 42, 201, - 228, 55, 42, 226, 87, 212, 76, 55, 42, 205, 1, 234, 235, 55, 42, 2, 218, - 86, 42, 2, 199, 145, 42, 211, 214, 236, 222, 77, 202, 237, 10, 2, 63, 10, - 2, 39, 24, 63, 10, 2, 39, 24, 249, 127, 10, 2, 39, 24, 234, 92, 203, 12, - 10, 2, 39, 24, 142, 10, 2, 39, 24, 226, 122, 10, 2, 39, 24, 223, 61, 233, - 52, 10, 2, 39, 24, 218, 93, 10, 2, 39, 24, 209, 1, 10, 2, 254, 177, 10, - 2, 252, 117, 10, 2, 252, 118, 24, 250, 193, 10, 2, 252, 118, 24, 237, - 187, 233, 52, 10, 2, 252, 118, 24, 234, 105, 10, 2, 252, 118, 24, 234, - 92, 203, 12, 10, 2, 252, 118, 24, 142, 10, 2, 252, 118, 24, 226, 123, - 233, 52, 10, 2, 252, 118, 24, 226, 96, 10, 2, 252, 118, 24, 223, 62, 10, - 2, 252, 118, 24, 206, 239, 10, 2, 252, 118, 24, 118, 98, 118, 98, 66, 10, - 2, 252, 118, 233, 52, 10, 2, 252, 34, 10, 2, 252, 35, 24, 249, 106, 10, - 2, 252, 35, 24, 234, 92, 203, 12, 10, 2, 252, 35, 24, 219, 208, 98, 236, - 230, 10, 2, 252, 35, 24, 207, 48, 10, 2, 252, 35, 24, 203, 129, 10, 2, - 252, 6, 10, 2, 251, 181, 10, 2, 251, 182, 24, 236, 157, 10, 2, 251, 182, - 24, 206, 201, 98, 233, 164, 10, 2, 251, 173, 10, 2, 251, 174, 24, 251, - 173, 10, 2, 251, 174, 24, 239, 105, 10, 2, 251, 174, 24, 233, 164, 10, 2, - 251, 174, 24, 142, 10, 2, 251, 174, 24, 225, 40, 10, 2, 251, 174, 24, - 224, 101, 10, 2, 251, 174, 24, 206, 255, 10, 2, 251, 174, 24, 199, 253, - 10, 2, 251, 170, 10, 2, 251, 162, 10, 2, 251, 119, 10, 2, 251, 120, 24, - 206, 255, 10, 2, 251, 106, 10, 2, 251, 107, 127, 251, 106, 10, 2, 251, - 107, 115, 202, 76, 10, 2, 251, 107, 98, 217, 235, 214, 79, 251, 107, 98, - 217, 234, 10, 2, 251, 107, 98, 217, 235, 205, 93, 10, 2, 251, 71, 10, 2, - 251, 41, 10, 2, 251, 7, 10, 2, 251, 8, 24, 223, 154, 10, 2, 250, 235, 10, - 2, 250, 200, 10, 2, 250, 195, 10, 2, 250, 196, 195, 29, 203, 12, 10, 2, - 250, 196, 225, 44, 203, 12, 10, 2, 250, 196, 127, 250, 196, 201, 29, 127, - 201, 29, 201, 29, 127, 201, 29, 213, 163, 10, 2, 250, 196, 127, 250, 196, - 127, 250, 195, 10, 2, 250, 196, 127, 250, 196, 127, 250, 196, 241, 55, - 250, 196, 127, 250, 196, 127, 250, 195, 10, 2, 250, 193, 10, 2, 250, 189, - 10, 2, 249, 145, 10, 2, 249, 127, 10, 2, 249, 121, 10, 2, 249, 113, 10, - 2, 249, 107, 10, 2, 249, 108, 127, 249, 107, 10, 2, 249, 106, 10, 2, 154, - 10, 2, 249, 79, 10, 2, 248, 184, 10, 2, 248, 185, 24, 63, 10, 2, 248, - 185, 24, 234, 83, 10, 2, 248, 185, 24, 226, 123, 233, 52, 10, 2, 248, 21, - 10, 2, 248, 22, 127, 248, 22, 252, 117, 10, 2, 248, 22, 127, 248, 22, - 200, 72, 10, 2, 248, 22, 241, 55, 248, 21, 10, 2, 247, 255, 10, 2, 248, - 0, 127, 247, 255, 10, 2, 247, 244, 10, 2, 247, 243, 10, 2, 240, 136, 10, - 2, 240, 126, 10, 2, 240, 127, 224, 60, 24, 39, 98, 220, 12, 10, 2, 240, - 127, 224, 60, 24, 251, 119, 10, 2, 240, 127, 224, 60, 24, 249, 106, 10, - 2, 240, 127, 224, 60, 24, 248, 184, 10, 2, 240, 127, 224, 60, 24, 234, - 123, 10, 2, 240, 127, 224, 60, 24, 234, 124, 98, 220, 12, 10, 2, 240, - 127, 224, 60, 24, 233, 192, 10, 2, 240, 127, 224, 60, 24, 233, 173, 10, - 2, 240, 127, 224, 60, 24, 233, 65, 10, 2, 240, 127, 224, 60, 24, 142, 10, - 2, 240, 127, 224, 60, 24, 226, 1, 10, 2, 240, 127, 224, 60, 24, 226, 2, - 98, 221, 191, 10, 2, 240, 127, 224, 60, 24, 225, 25, 10, 2, 240, 127, - 224, 60, 24, 172, 10, 2, 240, 127, 224, 60, 24, 221, 191, 10, 2, 240, - 127, 224, 60, 24, 221, 192, 98, 220, 11, 10, 2, 240, 127, 224, 60, 24, - 221, 174, 10, 2, 240, 127, 224, 60, 24, 217, 118, 10, 2, 240, 127, 224, - 60, 24, 213, 164, 98, 213, 163, 10, 2, 240, 127, 224, 60, 24, 206, 112, - 10, 2, 240, 127, 224, 60, 24, 203, 129, 10, 2, 240, 127, 224, 60, 24, - 200, 116, 98, 233, 173, 10, 2, 240, 127, 224, 60, 24, 199, 253, 10, 2, - 240, 98, 10, 2, 240, 75, 10, 2, 240, 74, 10, 2, 240, 73, 10, 2, 239, 152, - 10, 2, 239, 134, 10, 2, 239, 107, 10, 2, 239, 108, 24, 206, 255, 10, 2, - 239, 105, 10, 2, 239, 95, 10, 2, 239, 96, 224, 241, 118, 233, 53, 239, - 75, 10, 2, 239, 75, 10, 2, 237, 201, 10, 2, 237, 202, 127, 237, 201, 10, - 2, 237, 202, 233, 52, 10, 2, 237, 202, 206, 236, 10, 2, 237, 199, 10, 2, - 237, 200, 24, 236, 138, 10, 2, 237, 198, 10, 2, 237, 195, 10, 2, 237, - 194, 10, 2, 237, 193, 10, 2, 237, 188, 10, 2, 237, 186, 10, 2, 237, 187, - 233, 52, 10, 2, 237, 187, 233, 53, 233, 52, 10, 2, 237, 185, 10, 2, 237, - 178, 10, 2, 69, 10, 2, 237, 136, 24, 213, 163, 10, 2, 237, 136, 127, 237, - 136, 215, 139, 127, 215, 138, 10, 2, 237, 83, 10, 2, 237, 84, 24, 39, 98, - 233, 4, 98, 240, 136, 10, 2, 237, 84, 24, 234, 83, 10, 2, 237, 84, 24, - 219, 78, 10, 2, 237, 84, 24, 208, 241, 10, 2, 237, 84, 24, 206, 255, 10, - 2, 237, 84, 24, 66, 10, 2, 237, 56, 10, 2, 237, 44, 10, 2, 237, 7, 10, 2, - 236, 230, 10, 2, 236, 231, 24, 234, 91, 10, 2, 236, 231, 24, 234, 92, - 203, 12, 10, 2, 236, 231, 24, 219, 207, 10, 2, 236, 231, 241, 55, 236, - 230, 10, 2, 236, 231, 214, 79, 236, 230, 10, 2, 236, 231, 205, 93, 10, 2, - 236, 160, 10, 2, 236, 157, 10, 2, 236, 138, 10, 2, 236, 54, 10, 2, 236, - 55, 24, 63, 10, 2, 236, 55, 24, 39, 98, 222, 251, 10, 2, 236, 55, 24, 39, - 98, 222, 252, 24, 222, 251, 10, 2, 236, 55, 24, 251, 106, 10, 2, 236, 55, - 24, 249, 127, 10, 2, 236, 55, 24, 237, 187, 233, 52, 10, 2, 236, 55, 24, - 237, 187, 233, 53, 233, 52, 10, 2, 236, 55, 24, 142, 10, 2, 236, 55, 24, - 233, 4, 233, 52, 10, 2, 236, 55, 24, 226, 123, 233, 52, 10, 2, 236, 55, - 24, 224, 240, 10, 2, 236, 55, 24, 224, 241, 205, 93, 10, 2, 236, 55, 24, - 223, 178, 10, 2, 236, 55, 24, 172, 10, 2, 236, 55, 24, 222, 252, 24, 222, - 251, 10, 2, 236, 55, 24, 222, 109, 10, 2, 236, 55, 24, 221, 191, 10, 2, - 236, 55, 24, 200, 115, 10, 2, 236, 55, 24, 200, 104, 10, 2, 234, 123, 10, - 2, 234, 124, 233, 52, 10, 2, 234, 121, 10, 2, 234, 122, 24, 39, 98, 240, - 137, 98, 142, 10, 2, 234, 122, 24, 39, 98, 142, 10, 2, 234, 122, 24, 39, - 98, 226, 122, 10, 2, 234, 122, 24, 252, 35, 203, 13, 98, 203, 154, 10, 2, - 234, 122, 24, 251, 106, 10, 2, 234, 122, 24, 250, 195, 10, 2, 234, 122, - 24, 250, 194, 98, 234, 105, 10, 2, 234, 122, 24, 249, 127, 10, 2, 234, - 122, 24, 249, 80, 98, 169, 10, 2, 234, 122, 24, 247, 244, 10, 2, 234, - 122, 24, 247, 245, 98, 169, 10, 2, 234, 122, 24, 240, 136, 10, 2, 234, - 122, 24, 239, 152, 10, 2, 234, 122, 24, 239, 108, 24, 206, 255, 10, 2, - 234, 122, 24, 237, 199, 10, 2, 234, 122, 24, 237, 7, 10, 2, 234, 122, 24, - 237, 8, 98, 172, 10, 2, 234, 122, 24, 236, 230, 10, 2, 234, 122, 24, 236, - 231, 24, 234, 92, 203, 12, 10, 2, 234, 122, 24, 234, 92, 203, 12, 10, 2, - 234, 122, 24, 234, 83, 10, 2, 234, 122, 24, 233, 192, 10, 2, 234, 122, - 24, 233, 190, 10, 2, 234, 122, 24, 233, 191, 98, 63, 10, 2, 234, 122, 24, - 233, 174, 98, 204, 172, 10, 2, 234, 122, 24, 233, 4, 98, 221, 192, 98, - 236, 138, 10, 2, 234, 122, 24, 232, 228, 10, 2, 234, 122, 24, 232, 229, - 98, 172, 10, 2, 234, 122, 24, 232, 72, 98, 222, 109, 10, 2, 234, 122, 24, - 231, 67, 10, 2, 234, 122, 24, 226, 123, 233, 52, 10, 2, 234, 122, 24, - 225, 243, 98, 231, 76, 98, 250, 195, 10, 2, 234, 122, 24, 225, 25, 10, 2, - 234, 122, 24, 224, 240, 10, 2, 234, 122, 24, 224, 87, 10, 2, 234, 122, - 24, 224, 88, 98, 222, 251, 10, 2, 234, 122, 24, 223, 179, 98, 251, 106, - 10, 2, 234, 122, 24, 172, 10, 2, 234, 122, 24, 219, 208, 98, 236, 230, - 10, 2, 234, 122, 24, 219, 78, 10, 2, 234, 122, 24, 215, 138, 10, 2, 234, - 122, 24, 215, 139, 127, 215, 138, 10, 2, 234, 122, 24, 161, 10, 2, 234, - 122, 24, 208, 241, 10, 2, 234, 122, 24, 208, 204, 10, 2, 234, 122, 24, - 206, 255, 10, 2, 234, 122, 24, 207, 0, 98, 201, 10, 10, 2, 234, 122, 24, - 206, 221, 10, 2, 234, 122, 24, 204, 117, 10, 2, 234, 122, 24, 203, 129, - 10, 2, 234, 122, 24, 66, 10, 2, 234, 122, 24, 200, 104, 10, 2, 234, 122, - 24, 200, 105, 98, 237, 201, 10, 2, 234, 122, 127, 234, 121, 10, 2, 234, - 116, 10, 2, 234, 117, 241, 55, 234, 116, 10, 2, 234, 114, 10, 2, 234, - 115, 127, 234, 115, 234, 84, 127, 234, 83, 10, 2, 234, 105, 10, 2, 234, - 106, 234, 115, 127, 234, 115, 234, 84, 127, 234, 83, 10, 2, 234, 104, 10, - 2, 234, 102, 10, 2, 234, 93, 10, 2, 234, 91, 10, 2, 234, 92, 203, 12, 10, - 2, 234, 92, 127, 234, 91, 10, 2, 234, 92, 241, 55, 234, 91, 10, 2, 234, - 83, 10, 2, 234, 82, 10, 2, 234, 76, 10, 2, 234, 17, 10, 2, 234, 18, 24, - 223, 154, 10, 2, 233, 192, 10, 2, 233, 193, 24, 69, 10, 2, 233, 193, 24, - 66, 10, 2, 233, 193, 241, 55, 233, 192, 10, 2, 233, 190, 10, 2, 233, 191, - 127, 233, 190, 10, 2, 233, 191, 241, 55, 233, 190, 10, 2, 233, 187, 10, - 2, 233, 173, 10, 2, 233, 174, 233, 52, 10, 2, 233, 171, 10, 2, 233, 172, - 24, 39, 98, 226, 122, 10, 2, 233, 172, 24, 234, 92, 203, 12, 10, 2, 233, - 172, 24, 226, 122, 10, 2, 233, 172, 24, 221, 192, 98, 226, 122, 10, 2, - 233, 172, 24, 161, 10, 2, 233, 166, 10, 2, 233, 164, 10, 2, 233, 165, - 241, 55, 233, 164, 10, 2, 233, 165, 24, 249, 127, 10, 2, 233, 165, 24, - 203, 129, 10, 2, 233, 165, 203, 12, 10, 2, 233, 76, 10, 2, 233, 77, 241, - 55, 233, 76, 10, 2, 233, 74, 10, 2, 233, 75, 24, 225, 25, 10, 2, 233, 75, - 24, 225, 26, 24, 226, 123, 233, 52, 10, 2, 233, 75, 24, 215, 138, 10, 2, - 233, 75, 24, 208, 242, 98, 201, 28, 10, 2, 233, 75, 233, 52, 10, 2, 233, - 65, 10, 2, 233, 66, 24, 39, 98, 223, 154, 10, 2, 233, 66, 24, 223, 154, - 10, 2, 233, 66, 127, 233, 66, 221, 182, 10, 2, 233, 57, 10, 2, 233, 55, - 10, 2, 233, 56, 24, 206, 255, 10, 2, 233, 46, 10, 2, 233, 45, 10, 2, 233, - 41, 10, 2, 233, 40, 10, 2, 142, 10, 2, 233, 4, 203, 12, 10, 2, 233, 4, - 233, 52, 10, 2, 232, 228, 10, 2, 232, 71, 10, 2, 232, 72, 24, 250, 195, - 10, 2, 232, 72, 24, 250, 193, 10, 2, 232, 72, 24, 249, 127, 10, 2, 232, - 72, 24, 239, 75, 10, 2, 232, 72, 24, 234, 114, 10, 2, 232, 72, 24, 224, - 76, 10, 2, 232, 72, 24, 215, 138, 10, 2, 232, 72, 24, 206, 255, 10, 2, - 232, 72, 24, 66, 10, 2, 231, 75, 10, 2, 231, 67, 10, 2, 231, 68, 24, 251, - 106, 10, 2, 231, 68, 24, 232, 228, 10, 2, 231, 68, 24, 224, 240, 10, 2, - 231, 68, 24, 222, 53, 10, 2, 231, 68, 24, 200, 104, 10, 2, 231, 63, 10, - 2, 68, 10, 2, 230, 249, 63, 10, 2, 230, 205, 10, 2, 226, 150, 10, 2, 226, - 151, 127, 226, 151, 247, 244, 10, 2, 226, 151, 127, 226, 151, 205, 93, - 10, 2, 226, 125, 10, 2, 226, 122, 10, 2, 226, 123, 239, 134, 10, 2, 226, - 123, 210, 72, 10, 2, 226, 123, 127, 226, 123, 206, 205, 127, 206, 205, - 200, 105, 127, 200, 104, 10, 2, 226, 123, 233, 52, 10, 2, 226, 114, 10, - 2, 226, 115, 24, 234, 92, 203, 12, 10, 2, 226, 113, 10, 2, 226, 103, 10, - 2, 226, 104, 24, 203, 129, 10, 2, 226, 104, 241, 55, 226, 103, 10, 2, - 226, 104, 214, 79, 226, 103, 10, 2, 226, 104, 205, 93, 10, 2, 226, 96, - 10, 2, 226, 86, 10, 2, 226, 1, 10, 2, 225, 242, 10, 2, 155, 10, 2, 225, - 70, 24, 63, 10, 2, 225, 70, 24, 252, 6, 10, 2, 225, 70, 24, 252, 7, 98, - 223, 178, 10, 2, 225, 70, 24, 250, 193, 10, 2, 225, 70, 24, 249, 127, 10, - 2, 225, 70, 24, 249, 106, 10, 2, 225, 70, 24, 154, 10, 2, 225, 70, 24, - 248, 184, 10, 2, 225, 70, 24, 236, 157, 10, 2, 225, 70, 24, 236, 138, 10, - 2, 225, 70, 24, 234, 123, 10, 2, 225, 70, 24, 234, 105, 10, 2, 225, 70, - 24, 234, 92, 203, 12, 10, 2, 225, 70, 24, 234, 83, 10, 2, 225, 70, 24, - 234, 84, 98, 207, 49, 98, 63, 10, 2, 225, 70, 24, 233, 192, 10, 2, 225, - 70, 24, 233, 173, 10, 2, 225, 70, 24, 233, 165, 98, 208, 204, 10, 2, 225, - 70, 24, 233, 165, 241, 55, 233, 164, 10, 2, 225, 70, 24, 233, 76, 10, 2, - 225, 70, 24, 233, 45, 10, 2, 225, 70, 24, 226, 122, 10, 2, 225, 70, 24, - 226, 103, 10, 2, 225, 70, 24, 225, 25, 10, 2, 225, 70, 24, 224, 101, 10, - 2, 225, 70, 24, 224, 87, 10, 2, 225, 70, 24, 222, 109, 10, 2, 225, 70, - 24, 221, 191, 10, 2, 225, 70, 24, 219, 207, 10, 2, 225, 70, 24, 219, 208, - 98, 237, 201, 10, 2, 225, 70, 24, 219, 208, 98, 233, 192, 10, 2, 225, 70, - 24, 219, 208, 98, 203, 68, 10, 2, 225, 70, 24, 219, 78, 10, 2, 225, 70, - 24, 219, 79, 98, 215, 133, 10, 2, 225, 70, 24, 217, 118, 10, 2, 225, 70, - 24, 215, 138, 10, 2, 225, 70, 24, 212, 220, 10, 2, 225, 70, 24, 209, 140, - 10, 2, 225, 70, 24, 183, 10, 2, 225, 70, 24, 208, 204, 10, 2, 225, 70, - 24, 207, 50, 10, 2, 225, 70, 24, 206, 255, 10, 2, 225, 70, 24, 206, 221, - 10, 2, 225, 70, 24, 206, 151, 10, 2, 225, 70, 24, 206, 91, 10, 2, 225, - 70, 24, 204, 126, 10, 2, 225, 70, 24, 203, 101, 10, 2, 225, 70, 24, 66, - 10, 2, 225, 70, 24, 200, 115, 10, 2, 225, 70, 24, 200, 104, 10, 2, 225, - 70, 24, 200, 75, 24, 161, 10, 2, 225, 70, 24, 199, 253, 10, 2, 225, 70, - 24, 195, 33, 10, 2, 225, 56, 10, 2, 225, 57, 241, 55, 225, 56, 10, 2, - 225, 45, 10, 2, 225, 42, 10, 2, 225, 40, 10, 2, 225, 39, 10, 2, 225, 37, - 10, 2, 225, 38, 127, 225, 37, 10, 2, 225, 25, 10, 2, 225, 26, 24, 226, - 123, 233, 52, 10, 2, 225, 21, 10, 2, 225, 22, 24, 249, 127, 10, 2, 225, - 22, 241, 55, 225, 21, 10, 2, 225, 19, 10, 2, 225, 18, 10, 2, 224, 240, - 10, 2, 224, 241, 223, 63, 24, 118, 127, 223, 63, 24, 66, 10, 2, 224, 241, - 127, 224, 241, 223, 63, 24, 118, 127, 223, 63, 24, 66, 10, 2, 224, 173, - 10, 2, 224, 101, 10, 2, 224, 102, 24, 249, 127, 10, 2, 224, 102, 24, 66, - 10, 2, 224, 102, 24, 200, 104, 10, 2, 224, 87, 10, 2, 224, 76, 10, 2, - 224, 62, 10, 2, 224, 61, 10, 2, 224, 59, 10, 2, 224, 60, 127, 224, 59, - 10, 2, 223, 187, 10, 2, 223, 188, 127, 232, 72, 24, 250, 194, 223, 188, - 127, 232, 72, 24, 250, 193, 10, 2, 223, 178, 10, 2, 223, 176, 10, 2, 223, - 177, 199, 132, 20, 10, 2, 223, 175, 10, 2, 223, 167, 10, 2, 223, 168, - 233, 52, 10, 2, 223, 166, 10, 2, 223, 154, 10, 2, 223, 155, 214, 79, 223, - 154, 10, 2, 223, 147, 10, 2, 223, 124, 10, 2, 172, 10, 2, 223, 62, 10, 2, - 223, 63, 24, 63, 10, 2, 223, 63, 24, 39, 98, 240, 137, 98, 142, 10, 2, - 223, 63, 24, 39, 98, 234, 83, 10, 2, 223, 63, 24, 39, 98, 222, 251, 10, - 2, 223, 63, 24, 251, 173, 10, 2, 223, 63, 24, 251, 106, 10, 2, 223, 63, - 24, 250, 196, 195, 29, 203, 12, 10, 2, 223, 63, 24, 249, 127, 10, 2, 223, - 63, 24, 248, 184, 10, 2, 223, 63, 24, 240, 75, 10, 2, 223, 63, 24, 236, - 230, 10, 2, 223, 63, 24, 234, 123, 10, 2, 223, 63, 24, 234, 83, 10, 2, - 223, 63, 24, 233, 65, 10, 2, 223, 63, 24, 233, 66, 98, 233, 65, 10, 2, - 223, 63, 24, 142, 10, 2, 223, 63, 24, 232, 228, 10, 2, 223, 63, 24, 232, - 72, 24, 215, 138, 10, 2, 223, 63, 24, 226, 123, 233, 52, 10, 2, 223, 63, - 24, 226, 103, 10, 2, 223, 63, 24, 226, 104, 98, 142, 10, 2, 223, 63, 24, - 226, 104, 98, 221, 191, 10, 2, 223, 63, 24, 224, 101, 10, 2, 223, 63, 24, - 224, 76, 10, 2, 223, 63, 24, 223, 178, 10, 2, 223, 63, 24, 223, 167, 10, - 2, 223, 63, 24, 223, 168, 98, 232, 72, 98, 63, 10, 2, 223, 63, 24, 223, - 62, 10, 2, 223, 63, 24, 222, 53, 10, 2, 223, 63, 24, 221, 191, 10, 2, - 223, 63, 24, 221, 176, 10, 2, 223, 63, 24, 219, 207, 10, 2, 223, 63, 24, - 219, 208, 98, 236, 230, 10, 2, 223, 63, 24, 218, 93, 10, 2, 223, 63, 24, - 217, 118, 10, 2, 223, 63, 24, 207, 0, 98, 204, 117, 10, 2, 223, 63, 24, - 206, 201, 98, 233, 165, 98, 236, 157, 10, 2, 223, 63, 24, 206, 201, 98, - 233, 165, 203, 12, 10, 2, 223, 63, 24, 206, 149, 10, 2, 223, 63, 24, 206, - 150, 98, 206, 149, 10, 2, 223, 63, 24, 204, 117, 10, 2, 223, 63, 24, 203, - 143, 10, 2, 223, 63, 24, 203, 129, 10, 2, 223, 63, 24, 203, 69, 98, 39, - 98, 204, 173, 98, 176, 10, 2, 223, 63, 24, 66, 10, 2, 223, 63, 24, 118, - 98, 63, 10, 2, 223, 63, 24, 118, 98, 118, 98, 66, 10, 2, 223, 63, 24, - 200, 116, 98, 250, 195, 10, 2, 223, 63, 24, 200, 104, 10, 2, 223, 63, 24, - 199, 253, 10, 2, 223, 63, 205, 93, 10, 2, 223, 60, 10, 2, 223, 61, 24, - 206, 255, 10, 2, 223, 61, 24, 207, 0, 98, 204, 117, 10, 2, 223, 61, 233, - 52, 10, 2, 223, 61, 233, 53, 127, 223, 61, 233, 53, 206, 255, 10, 2, 223, - 56, 10, 2, 222, 251, 10, 2, 222, 252, 24, 222, 251, 10, 2, 222, 249, 10, - 2, 222, 250, 24, 223, 154, 10, 2, 222, 250, 24, 223, 155, 98, 209, 140, - 10, 2, 222, 109, 10, 2, 222, 90, 10, 2, 222, 78, 10, 2, 222, 53, 10, 2, - 221, 191, 10, 2, 221, 192, 24, 249, 127, 10, 2, 221, 189, 10, 2, 221, - 190, 24, 251, 173, 10, 2, 221, 190, 24, 249, 127, 10, 2, 221, 190, 24, - 236, 138, 10, 2, 221, 190, 24, 236, 139, 203, 12, 10, 2, 221, 190, 24, - 234, 92, 203, 12, 10, 2, 221, 190, 24, 232, 72, 24, 249, 127, 10, 2, 221, - 190, 24, 226, 103, 10, 2, 221, 190, 24, 225, 42, 10, 2, 221, 190, 24, - 225, 40, 10, 2, 221, 190, 24, 225, 41, 98, 250, 195, 10, 2, 221, 190, 24, - 224, 101, 10, 2, 221, 190, 24, 223, 83, 98, 250, 195, 10, 2, 221, 190, - 24, 223, 62, 10, 2, 221, 190, 24, 219, 208, 98, 236, 230, 10, 2, 221, - 190, 24, 217, 118, 10, 2, 221, 190, 24, 215, 186, 10, 2, 221, 190, 24, - 206, 113, 98, 250, 195, 10, 2, 221, 190, 24, 206, 83, 98, 248, 21, 10, 2, - 221, 190, 24, 201, 28, 10, 2, 221, 190, 203, 12, 10, 2, 221, 190, 241, - 55, 221, 189, 10, 2, 221, 190, 214, 79, 221, 189, 10, 2, 221, 190, 205, - 93, 10, 2, 221, 190, 206, 236, 10, 2, 221, 188, 10, 2, 221, 182, 10, 2, - 221, 183, 127, 221, 182, 10, 2, 221, 183, 214, 79, 221, 182, 10, 2, 221, - 183, 206, 236, 10, 2, 221, 179, 10, 2, 221, 176, 10, 2, 221, 174, 10, 2, - 221, 175, 127, 221, 174, 10, 2, 221, 175, 127, 221, 175, 234, 84, 127, - 234, 83, 10, 2, 166, 10, 2, 220, 128, 24, 203, 129, 10, 2, 220, 128, 233, - 52, 10, 2, 220, 120, 10, 2, 220, 89, 10, 2, 220, 37, 10, 2, 220, 12, 10, - 2, 220, 11, 10, 2, 219, 207, 10, 2, 219, 151, 10, 2, 219, 78, 10, 2, 219, - 23, 10, 2, 218, 145, 10, 2, 218, 146, 127, 218, 145, 10, 2, 218, 130, 10, - 2, 218, 131, 233, 52, 10, 2, 218, 111, 10, 2, 218, 97, 10, 2, 218, 93, - 10, 2, 218, 94, 24, 63, 10, 2, 218, 94, 24, 223, 154, 10, 2, 218, 94, 24, - 195, 115, 10, 2, 218, 94, 127, 218, 93, 10, 2, 218, 94, 127, 218, 94, 24, - 39, 98, 176, 10, 2, 218, 94, 241, 55, 218, 93, 10, 2, 218, 91, 10, 2, - 218, 92, 24, 63, 10, 2, 218, 92, 24, 39, 98, 239, 152, 10, 2, 218, 92, - 24, 239, 152, 10, 2, 218, 92, 233, 52, 10, 2, 176, 10, 2, 217, 247, 10, - 2, 217, 234, 10, 2, 217, 235, 226, 16, 10, 2, 217, 235, 24, 206, 152, - 203, 12, 10, 2, 217, 235, 214, 79, 217, 234, 10, 2, 217, 233, 10, 2, 217, - 226, 215, 124, 10, 2, 217, 225, 10, 2, 217, 224, 10, 2, 217, 118, 10, 2, - 217, 119, 24, 63, 10, 2, 217, 119, 24, 200, 104, 10, 2, 217, 119, 206, - 236, 10, 2, 216, 223, 10, 2, 216, 224, 24, 69, 10, 2, 216, 214, 10, 2, - 216, 184, 10, 2, 216, 185, 24, 234, 92, 203, 12, 10, 2, 216, 185, 24, - 234, 84, 98, 234, 92, 203, 12, 10, 2, 216, 180, 10, 2, 216, 181, 24, 251, - 106, 10, 2, 216, 181, 24, 250, 195, 10, 2, 216, 181, 24, 250, 196, 98, - 250, 195, 10, 2, 216, 181, 24, 233, 65, 10, 2, 216, 181, 24, 219, 208, - 98, 234, 92, 203, 12, 10, 2, 216, 181, 24, 217, 118, 10, 2, 216, 181, 24, - 215, 138, 10, 2, 216, 181, 24, 206, 255, 10, 2, 216, 181, 24, 207, 0, 98, - 39, 251, 106, 10, 2, 216, 181, 24, 207, 0, 98, 250, 195, 10, 2, 216, 181, - 24, 207, 0, 98, 250, 196, 98, 250, 195, 10, 2, 216, 181, 24, 200, 116, - 98, 250, 195, 10, 2, 216, 181, 24, 199, 253, 10, 2, 216, 169, 10, 2, 215, - 186, 10, 2, 215, 155, 10, 2, 215, 138, 10, 2, 215, 139, 223, 61, 24, 234, - 83, 10, 2, 215, 139, 223, 61, 24, 220, 12, 10, 2, 215, 139, 223, 61, 24, - 208, 241, 10, 2, 215, 139, 223, 61, 24, 208, 242, 127, 215, 139, 223, 61, - 24, 208, 241, 10, 2, 215, 139, 223, 61, 24, 199, 253, 10, 2, 215, 139, - 203, 12, 10, 2, 215, 139, 127, 215, 138, 10, 2, 215, 139, 241, 55, 215, - 138, 10, 2, 215, 139, 241, 55, 215, 139, 223, 61, 127, 223, 60, 10, 2, - 215, 133, 10, 2, 215, 134, 252, 35, 24, 250, 189, 10, 2, 215, 134, 252, - 35, 24, 248, 184, 10, 2, 215, 134, 252, 35, 24, 237, 195, 10, 2, 215, - 134, 252, 35, 24, 233, 65, 10, 2, 215, 134, 252, 35, 24, 226, 123, 233, - 52, 10, 2, 215, 134, 252, 35, 24, 225, 40, 10, 2, 215, 134, 252, 35, 24, - 172, 10, 2, 215, 134, 252, 35, 24, 217, 118, 10, 2, 215, 134, 252, 35, - 24, 206, 80, 10, 2, 215, 134, 252, 35, 24, 200, 115, 10, 2, 215, 134, - 224, 60, 24, 248, 184, 10, 2, 215, 134, 224, 60, 24, 248, 185, 66, 10, 2, - 161, 10, 2, 213, 233, 10, 2, 213, 191, 10, 2, 213, 163, 10, 2, 213, 21, - 10, 2, 212, 220, 10, 2, 212, 221, 24, 63, 10, 2, 212, 221, 24, 252, 117, - 10, 2, 212, 221, 24, 248, 184, 10, 2, 212, 221, 24, 248, 21, 10, 2, 212, - 221, 24, 69, 10, 2, 212, 221, 24, 68, 10, 2, 212, 221, 24, 230, 205, 10, - 2, 212, 221, 24, 66, 10, 2, 212, 221, 24, 200, 115, 10, 2, 212, 221, 241, - 55, 212, 220, 10, 2, 212, 161, 10, 2, 212, 162, 24, 225, 21, 10, 2, 212, - 162, 24, 200, 104, 10, 2, 212, 162, 24, 195, 115, 10, 2, 212, 162, 214, - 79, 212, 161, 10, 2, 169, 10, 2, 210, 242, 10, 2, 210, 72, 10, 2, 209, - 140, 10, 2, 183, 10, 2, 209, 2, 215, 124, 10, 2, 209, 1, 10, 2, 209, 2, - 24, 63, 10, 2, 209, 2, 24, 237, 201, 10, 2, 209, 2, 24, 237, 199, 10, 2, - 209, 2, 24, 142, 10, 2, 209, 2, 24, 225, 25, 10, 2, 209, 2, 24, 223, 154, - 10, 2, 209, 2, 24, 221, 174, 10, 2, 209, 2, 24, 219, 78, 10, 2, 209, 2, - 24, 215, 138, 10, 2, 209, 2, 24, 208, 241, 10, 2, 209, 2, 24, 206, 221, - 10, 2, 209, 2, 24, 203, 154, 10, 2, 209, 2, 24, 200, 115, 10, 2, 209, 2, - 24, 200, 110, 10, 2, 209, 2, 24, 200, 79, 10, 2, 209, 2, 24, 200, 21, 10, - 2, 209, 2, 24, 199, 253, 10, 2, 209, 2, 127, 209, 1, 10, 2, 209, 2, 233, - 52, 10, 2, 208, 241, 10, 2, 208, 242, 223, 63, 24, 250, 193, 10, 2, 208, - 213, 10, 2, 208, 204, 10, 2, 207, 50, 10, 2, 207, 48, 10, 2, 207, 49, 24, - 63, 10, 2, 207, 49, 24, 249, 127, 10, 2, 207, 49, 24, 233, 164, 10, 2, - 207, 49, 24, 217, 118, 10, 2, 207, 49, 24, 206, 149, 10, 2, 207, 49, 24, - 201, 10, 10, 2, 207, 49, 24, 66, 10, 2, 207, 49, 24, 118, 98, 63, 10, 2, - 207, 46, 10, 2, 207, 44, 10, 2, 207, 17, 10, 2, 206, 255, 10, 2, 207, 0, - 231, 75, 10, 2, 207, 0, 127, 207, 0, 234, 115, 127, 234, 115, 234, 84, - 127, 234, 83, 10, 2, 207, 0, 127, 207, 0, 203, 155, 127, 203, 155, 234, - 84, 127, 234, 83, 10, 2, 206, 248, 10, 2, 206, 243, 10, 2, 206, 239, 10, - 2, 206, 238, 10, 2, 206, 235, 10, 2, 206, 221, 10, 2, 206, 222, 24, 63, - 10, 2, 206, 222, 24, 226, 103, 10, 2, 206, 215, 10, 2, 206, 216, 24, 63, - 10, 2, 206, 216, 24, 249, 107, 10, 2, 206, 216, 24, 247, 255, 10, 2, 206, - 216, 24, 239, 95, 10, 2, 206, 216, 24, 234, 83, 10, 2, 206, 216, 24, 226, - 122, 10, 2, 206, 216, 24, 226, 123, 233, 52, 10, 2, 206, 216, 24, 223, - 147, 10, 2, 206, 216, 24, 221, 176, 10, 2, 206, 216, 24, 218, 130, 10, 2, - 206, 216, 24, 208, 241, 10, 2, 206, 209, 10, 2, 206, 204, 10, 2, 206, - 205, 203, 12, 10, 2, 206, 205, 127, 206, 205, 247, 245, 127, 247, 244, - 10, 2, 206, 200, 10, 2, 206, 151, 10, 2, 206, 152, 127, 226, 17, 206, - 151, 10, 2, 206, 149, 10, 2, 206, 147, 10, 2, 206, 112, 10, 2, 206, 113, - 233, 52, 10, 2, 206, 91, 10, 2, 206, 89, 10, 2, 206, 90, 127, 206, 90, - 206, 149, 10, 2, 206, 82, 10, 2, 206, 80, 10, 2, 204, 172, 10, 2, 204, - 173, 127, 204, 172, 10, 2, 204, 129, 10, 2, 204, 128, 10, 2, 204, 126, - 10, 2, 204, 117, 10, 2, 204, 116, 10, 2, 204, 88, 10, 2, 204, 87, 10, 2, - 189, 10, 2, 203, 169, 250, 179, 10, 2, 203, 169, 24, 232, 71, 10, 2, 203, - 169, 24, 219, 78, 10, 2, 203, 169, 233, 52, 10, 2, 203, 154, 10, 2, 203, - 155, 127, 203, 155, 216, 224, 127, 216, 224, 239, 76, 127, 239, 75, 10, - 2, 203, 155, 205, 93, 10, 2, 203, 143, 10, 2, 184, 24, 248, 184, 10, 2, - 184, 24, 233, 65, 10, 2, 184, 24, 206, 255, 10, 2, 184, 24, 206, 151, 10, - 2, 184, 24, 201, 28, 10, 2, 184, 24, 200, 104, 10, 2, 203, 129, 10, 2, - 203, 101, 10, 2, 203, 68, 10, 2, 203, 69, 233, 52, 10, 2, 202, 122, 10, - 2, 202, 123, 203, 12, 10, 2, 202, 86, 10, 2, 202, 63, 10, 2, 202, 64, 24, - 203, 129, 10, 2, 202, 64, 127, 202, 63, 10, 2, 202, 64, 127, 202, 64, - 234, 115, 127, 234, 115, 234, 84, 127, 234, 83, 10, 2, 201, 40, 10, 2, - 201, 28, 10, 2, 201, 26, 10, 2, 201, 22, 10, 2, 201, 10, 10, 2, 201, 11, - 127, 201, 11, 195, 116, 127, 195, 115, 10, 2, 66, 10, 2, 118, 233, 65, - 10, 2, 118, 118, 66, 10, 2, 118, 127, 118, 213, 244, 127, 213, 244, 234, - 84, 127, 234, 83, 10, 2, 118, 127, 118, 204, 89, 127, 204, 88, 10, 2, - 118, 127, 118, 118, 210, 89, 127, 118, 210, 88, 10, 2, 200, 115, 10, 2, - 200, 110, 10, 2, 200, 104, 10, 2, 200, 105, 223, 147, 10, 2, 200, 105, - 24, 249, 127, 10, 2, 200, 105, 24, 219, 78, 10, 2, 200, 105, 24, 118, 98, - 118, 98, 66, 10, 2, 200, 105, 24, 118, 98, 118, 98, 118, 233, 52, 10, 2, - 200, 105, 233, 52, 10, 2, 200, 105, 206, 236, 10, 2, 200, 105, 206, 237, - 24, 249, 127, 10, 2, 200, 100, 10, 2, 200, 79, 10, 2, 200, 80, 24, 223, - 62, 10, 2, 200, 80, 24, 219, 208, 98, 240, 136, 10, 2, 200, 80, 24, 207, - 48, 10, 2, 200, 80, 24, 66, 10, 2, 200, 78, 10, 2, 200, 74, 10, 2, 200, - 75, 24, 224, 240, 10, 2, 200, 75, 24, 161, 10, 2, 200, 72, 10, 2, 200, - 73, 233, 52, 10, 2, 200, 21, 10, 2, 200, 22, 241, 55, 200, 21, 10, 2, - 200, 22, 206, 236, 10, 2, 200, 19, 10, 2, 200, 20, 24, 39, 98, 142, 10, - 2, 200, 20, 24, 39, 98, 176, 10, 2, 200, 20, 24, 251, 173, 10, 2, 200, - 20, 24, 142, 10, 2, 200, 20, 24, 215, 138, 10, 2, 200, 20, 24, 200, 115, - 10, 2, 200, 20, 24, 200, 116, 98, 250, 195, 10, 2, 200, 20, 24, 200, 116, - 98, 248, 184, 10, 2, 200, 18, 10, 2, 200, 15, 10, 2, 200, 14, 10, 2, 200, - 10, 10, 2, 200, 11, 24, 63, 10, 2, 200, 11, 24, 250, 189, 10, 2, 200, 11, - 24, 154, 10, 2, 200, 11, 24, 237, 188, 10, 2, 200, 11, 24, 234, 123, 10, - 2, 200, 11, 24, 234, 105, 10, 2, 200, 11, 24, 234, 92, 203, 12, 10, 2, - 200, 11, 24, 234, 83, 10, 2, 200, 11, 24, 233, 76, 10, 2, 200, 11, 24, - 142, 10, 2, 200, 11, 24, 226, 122, 10, 2, 200, 11, 24, 226, 103, 10, 2, - 200, 11, 24, 225, 242, 10, 2, 200, 11, 24, 224, 101, 10, 2, 200, 11, 24, - 221, 174, 10, 2, 200, 11, 24, 219, 23, 10, 2, 200, 11, 24, 161, 10, 2, - 200, 11, 24, 206, 255, 10, 2, 200, 11, 24, 206, 89, 10, 2, 200, 11, 24, - 201, 40, 10, 2, 200, 11, 24, 118, 98, 233, 65, 10, 2, 200, 11, 24, 200, - 104, 10, 2, 200, 11, 24, 200, 8, 10, 2, 200, 8, 10, 2, 200, 9, 24, 66, - 10, 2, 199, 253, 10, 2, 199, 254, 24, 63, 10, 2, 199, 254, 24, 223, 187, - 10, 2, 199, 254, 24, 223, 154, 10, 2, 199, 254, 24, 203, 129, 10, 2, 199, - 249, 10, 2, 199, 252, 10, 2, 199, 250, 10, 2, 199, 246, 10, 2, 199, 234, - 10, 2, 199, 235, 24, 224, 240, 10, 2, 199, 232, 10, 2, 195, 115, 10, 2, - 195, 116, 203, 12, 10, 2, 195, 116, 103, 24, 223, 154, 10, 2, 195, 111, - 10, 2, 195, 103, 10, 2, 195, 87, 10, 2, 195, 33, 10, 2, 195, 34, 127, - 195, 33, 10, 2, 195, 32, 10, 2, 195, 30, 10, 2, 195, 31, 225, 44, 203, - 12, 10, 2, 195, 25, 10, 2, 195, 16, 10, 2, 194, 255, 10, 2, 194, 253, 10, - 2, 194, 254, 24, 63, 10, 2, 194, 252, 10, 2, 194, 251, 10, 2, 225, 9, - 237, 4, 10, 2, 252, 118, 24, 215, 138, 10, 2, 252, 35, 24, 63, 10, 2, - 251, 120, 24, 223, 169, 10, 2, 240, 127, 224, 60, 24, 200, 116, 98, 220, - 12, 10, 2, 240, 125, 10, 2, 239, 76, 98, 206, 151, 10, 2, 237, 200, 24, - 206, 255, 10, 2, 236, 55, 24, 233, 65, 10, 2, 236, 55, 24, 206, 255, 10, - 2, 234, 122, 24, 251, 107, 98, 225, 26, 98, 63, 10, 2, 234, 122, 24, 250, - 193, 10, 2, 234, 47, 10, 2, 233, 181, 10, 2, 231, 48, 10, 2, 225, 70, 24, - 251, 71, 10, 2, 225, 70, 24, 250, 192, 10, 2, 225, 70, 24, 233, 164, 10, - 2, 225, 70, 24, 233, 65, 10, 2, 225, 70, 24, 232, 72, 24, 250, 193, 10, - 2, 225, 70, 24, 221, 174, 10, 2, 225, 70, 24, 161, 10, 2, 225, 70, 24, - 206, 143, 10, 2, 225, 70, 24, 201, 40, 10, 2, 225, 70, 24, 200, 19, 10, - 2, 223, 63, 24, 233, 192, 10, 2, 221, 190, 206, 237, 24, 249, 127, 10, 2, - 221, 190, 24, 236, 139, 98, 222, 251, 10, 2, 221, 190, 24, 206, 151, 10, - 2, 219, 150, 10, 2, 218, 92, 24, 195, 115, 10, 2, 217, 246, 10, 2, 216, - 183, 10, 2, 216, 182, 10, 2, 216, 181, 24, 249, 107, 10, 2, 216, 181, 24, - 233, 192, 10, 2, 215, 156, 209, 194, 216, 175, 239, 230, 10, 2, 213, 22, - 250, 179, 10, 2, 212, 165, 10, 2, 209, 2, 24, 226, 123, 233, 52, 10, 2, - 202, 114, 10, 2, 200, 80, 24, 219, 207, 10, 2, 118, 66, 10, 156, 2, 99, - 250, 195, 10, 156, 2, 115, 250, 195, 10, 156, 2, 235, 7, 250, 195, 10, - 156, 2, 235, 101, 250, 195, 10, 156, 2, 206, 29, 250, 195, 10, 156, 2, - 207, 71, 250, 195, 10, 156, 2, 237, 31, 250, 195, 10, 156, 2, 216, 179, - 250, 195, 10, 156, 2, 115, 239, 75, 10, 156, 2, 235, 7, 239, 75, 10, 156, - 2, 235, 101, 239, 75, 10, 156, 2, 206, 29, 239, 75, 10, 156, 2, 207, 71, - 239, 75, 10, 156, 2, 237, 31, 239, 75, 10, 156, 2, 216, 179, 239, 75, 10, - 156, 2, 235, 7, 66, 10, 156, 2, 235, 101, 66, 10, 156, 2, 206, 29, 66, - 10, 156, 2, 207, 71, 66, 10, 156, 2, 237, 31, 66, 10, 156, 2, 216, 179, - 66, 10, 156, 2, 97, 234, 19, 10, 156, 2, 99, 234, 19, 10, 156, 2, 115, - 234, 19, 10, 156, 2, 235, 7, 234, 19, 10, 156, 2, 235, 101, 234, 19, 10, - 156, 2, 206, 29, 234, 19, 10, 156, 2, 207, 71, 234, 19, 10, 156, 2, 237, - 31, 234, 19, 10, 156, 2, 216, 179, 234, 19, 10, 156, 2, 97, 234, 16, 10, - 156, 2, 99, 234, 16, 10, 156, 2, 115, 234, 16, 10, 156, 2, 235, 7, 234, - 16, 10, 156, 2, 235, 101, 234, 16, 10, 156, 2, 99, 207, 17, 10, 156, 2, - 115, 207, 17, 10, 156, 2, 115, 207, 18, 199, 132, 20, 10, 156, 2, 235, 7, - 207, 17, 10, 156, 2, 235, 101, 207, 17, 10, 156, 2, 206, 29, 207, 17, 10, - 156, 2, 207, 71, 207, 17, 10, 156, 2, 237, 31, 207, 17, 10, 156, 2, 216, - 179, 207, 17, 10, 156, 2, 97, 207, 10, 10, 156, 2, 99, 207, 10, 10, 156, - 2, 115, 207, 10, 10, 156, 2, 115, 207, 11, 199, 132, 20, 10, 156, 2, 235, - 7, 207, 10, 10, 156, 2, 235, 101, 207, 10, 10, 156, 2, 207, 18, 24, 234, - 106, 98, 239, 75, 10, 156, 2, 207, 18, 24, 234, 106, 98, 219, 23, 10, - 156, 2, 97, 247, 240, 10, 156, 2, 99, 247, 240, 10, 156, 2, 115, 247, - 240, 10, 156, 2, 115, 247, 241, 199, 132, 20, 10, 156, 2, 235, 7, 247, - 240, 10, 156, 2, 235, 101, 247, 240, 10, 156, 2, 115, 199, 132, 235, 24, - 236, 140, 10, 156, 2, 115, 199, 132, 235, 24, 236, 137, 10, 156, 2, 235, - 7, 199, 132, 235, 24, 222, 79, 10, 156, 2, 235, 7, 199, 132, 235, 24, - 222, 77, 10, 156, 2, 235, 7, 199, 132, 235, 24, 222, 80, 63, 10, 156, 2, - 235, 7, 199, 132, 235, 24, 222, 80, 250, 112, 10, 156, 2, 206, 29, 199, - 132, 235, 24, 250, 191, 10, 156, 2, 207, 71, 199, 132, 235, 24, 226, 95, - 10, 156, 2, 207, 71, 199, 132, 235, 24, 226, 97, 63, 10, 156, 2, 207, 71, - 199, 132, 235, 24, 226, 97, 250, 112, 10, 156, 2, 237, 31, 199, 132, 235, - 24, 199, 248, 10, 156, 2, 237, 31, 199, 132, 235, 24, 199, 247, 10, 156, - 2, 216, 179, 199, 132, 235, 24, 226, 111, 10, 156, 2, 216, 179, 199, 132, - 235, 24, 226, 110, 10, 156, 2, 216, 179, 199, 132, 235, 24, 226, 109, 10, - 156, 2, 216, 179, 199, 132, 235, 24, 226, 112, 63, 10, 156, 2, 99, 250, - 196, 203, 12, 10, 156, 2, 115, 250, 196, 203, 12, 10, 156, 2, 235, 7, - 250, 196, 203, 12, 10, 156, 2, 235, 101, 250, 196, 203, 12, 10, 156, 2, - 206, 29, 250, 196, 203, 12, 10, 156, 2, 97, 249, 91, 10, 156, 2, 99, 249, - 91, 10, 156, 2, 115, 249, 91, 10, 156, 2, 235, 7, 249, 91, 10, 156, 2, - 235, 7, 249, 92, 199, 132, 20, 10, 156, 2, 235, 101, 249, 91, 10, 156, 2, - 235, 101, 249, 92, 199, 132, 20, 10, 156, 2, 216, 192, 10, 156, 2, 216, - 193, 10, 156, 2, 97, 236, 136, 10, 156, 2, 99, 236, 136, 10, 156, 2, 97, - 202, 185, 239, 75, 10, 156, 2, 99, 202, 182, 239, 75, 10, 156, 2, 235, - 101, 206, 16, 239, 75, 10, 156, 2, 97, 202, 185, 199, 132, 235, 24, 63, - 10, 156, 2, 99, 202, 182, 199, 132, 235, 24, 63, 10, 156, 2, 97, 237, 27, - 250, 195, 10, 156, 2, 97, 211, 88, 250, 195, 10, 156, 2, 37, 250, 182, - 97, 206, 17, 10, 156, 2, 37, 250, 182, 97, 211, 87, 10, 156, 2, 97, 211, - 88, 233, 46, 10, 156, 2, 97, 157, 233, 46, 10, 156, 2, 237, 5, 97, 202, - 184, 10, 156, 2, 237, 5, 99, 202, 181, 10, 156, 2, 237, 5, 235, 14, 10, - 156, 2, 237, 5, 235, 145, 10, 156, 2, 235, 7, 118, 199, 132, 20, 10, 156, - 2, 235, 101, 118, 199, 132, 20, 10, 156, 2, 206, 29, 118, 199, 132, 20, - 10, 156, 2, 207, 71, 118, 199, 132, 20, 10, 156, 2, 237, 31, 118, 199, - 132, 20, 10, 156, 2, 216, 179, 118, 199, 132, 20, 10, 211, 214, 2, 37, - 250, 182, 197, 9, 239, 59, 10, 211, 214, 2, 83, 244, 168, 10, 211, 214, - 2, 239, 147, 244, 168, 10, 211, 214, 2, 239, 147, 201, 176, 10, 211, 214, - 2, 239, 147, 211, 93, 10, 2, 252, 118, 24, 215, 139, 203, 12, 10, 2, 252, - 118, 24, 206, 149, 10, 2, 252, 7, 24, 236, 138, 10, 2, 249, 128, 24, 239, - 76, 203, 12, 10, 2, 249, 114, 24, 252, 34, 10, 2, 249, 114, 24, 216, 223, - 10, 2, 249, 114, 24, 195, 115, 10, 2, 248, 22, 127, 248, 22, 24, 217, - 247, 10, 2, 240, 137, 24, 203, 129, 10, 2, 240, 127, 24, 223, 154, 10, 2, - 239, 108, 24, 226, 122, 10, 2, 239, 108, 24, 118, 118, 66, 10, 2, 239, - 106, 24, 200, 104, 10, 2, 237, 196, 24, 251, 71, 10, 2, 237, 196, 24, - 250, 195, 10, 2, 237, 196, 24, 250, 196, 250, 169, 222, 184, 10, 2, 237, - 196, 24, 239, 95, 10, 2, 237, 196, 24, 237, 188, 10, 2, 237, 196, 24, - 236, 157, 10, 2, 237, 196, 24, 234, 123, 10, 2, 237, 196, 24, 233, 192, - 10, 2, 237, 196, 24, 233, 174, 233, 52, 10, 2, 237, 196, 24, 233, 164, - 10, 2, 237, 196, 24, 142, 10, 2, 237, 196, 24, 232, 71, 10, 2, 237, 196, - 24, 226, 123, 233, 52, 10, 2, 237, 196, 24, 224, 240, 10, 2, 237, 196, - 24, 223, 154, 10, 2, 237, 196, 24, 223, 147, 10, 2, 237, 196, 24, 223, - 148, 98, 224, 240, 10, 2, 237, 196, 24, 223, 50, 10, 2, 237, 196, 24, - 222, 249, 10, 2, 237, 196, 24, 222, 250, 24, 223, 154, 10, 2, 237, 196, - 24, 221, 180, 98, 233, 164, 10, 2, 237, 196, 24, 220, 12, 10, 2, 237, - 196, 24, 219, 151, 10, 2, 237, 196, 24, 219, 78, 10, 2, 237, 196, 24, - 216, 223, 10, 2, 237, 196, 24, 212, 220, 10, 2, 237, 196, 24, 206, 255, - 10, 2, 237, 196, 24, 206, 113, 233, 52, 10, 2, 237, 84, 24, 223, 154, 10, - 2, 237, 84, 24, 213, 163, 10, 2, 236, 158, 196, 222, 10, 2, 236, 139, - 241, 55, 236, 138, 10, 2, 236, 55, 206, 237, 24, 250, 195, 10, 2, 236, - 55, 206, 237, 24, 232, 71, 10, 2, 236, 55, 206, 237, 24, 226, 123, 233, - 52, 10, 2, 236, 55, 206, 237, 24, 172, 10, 2, 236, 55, 206, 237, 24, 222, - 251, 10, 2, 236, 55, 206, 237, 24, 219, 207, 10, 2, 236, 55, 206, 237, - 24, 219, 151, 10, 2, 236, 55, 206, 237, 24, 204, 172, 10, 2, 236, 55, 24, - 204, 172, 10, 2, 234, 122, 24, 249, 113, 10, 2, 234, 122, 24, 239, 108, - 233, 52, 10, 2, 234, 122, 24, 237, 196, 24, 226, 123, 233, 52, 10, 2, - 234, 122, 24, 237, 196, 24, 224, 240, 10, 2, 234, 122, 24, 236, 160, 10, - 2, 234, 122, 24, 234, 123, 10, 2, 234, 122, 24, 234, 84, 98, 239, 152, - 10, 2, 234, 122, 24, 234, 84, 98, 217, 118, 10, 2, 234, 122, 24, 233, 4, - 98, 63, 10, 2, 234, 122, 24, 223, 148, 98, 224, 240, 10, 2, 234, 122, 24, - 222, 249, 10, 2, 234, 122, 24, 222, 250, 24, 223, 154, 10, 2, 234, 122, - 24, 221, 179, 10, 2, 234, 122, 24, 218, 93, 10, 2, 234, 122, 24, 217, - 118, 10, 2, 234, 122, 24, 217, 119, 98, 237, 83, 10, 2, 234, 122, 24, - 217, 119, 98, 233, 192, 10, 2, 234, 122, 24, 206, 215, 10, 2, 234, 122, - 24, 195, 16, 10, 2, 234, 117, 209, 194, 216, 175, 239, 230, 10, 2, 234, - 18, 24, 66, 10, 2, 233, 165, 24, 233, 165, 241, 55, 233, 164, 10, 2, 233, - 75, 24, 226, 123, 233, 52, 10, 2, 233, 66, 98, 233, 165, 24, 203, 129, - 10, 2, 233, 4, 203, 13, 233, 52, 10, 2, 232, 72, 24, 250, 196, 127, 232, - 72, 24, 250, 195, 10, 2, 225, 70, 24, 248, 21, 10, 2, 225, 70, 24, 155, - 10, 2, 225, 70, 24, 118, 118, 66, 10, 2, 225, 70, 24, 200, 21, 10, 2, - 223, 63, 24, 195, 0, 127, 194, 255, 10, 2, 223, 51, 10, 2, 223, 49, 10, - 2, 223, 48, 10, 2, 223, 47, 10, 2, 223, 46, 10, 2, 223, 45, 10, 2, 223, - 44, 10, 2, 223, 43, 127, 223, 43, 233, 52, 10, 2, 223, 42, 10, 2, 223, - 41, 127, 223, 40, 10, 2, 223, 39, 10, 2, 223, 38, 10, 2, 223, 37, 10, 2, - 223, 36, 10, 2, 223, 35, 10, 2, 223, 34, 10, 2, 223, 33, 10, 2, 223, 32, - 10, 2, 223, 31, 10, 2, 223, 30, 10, 2, 223, 29, 10, 2, 223, 28, 10, 2, - 223, 27, 10, 2, 223, 26, 10, 2, 223, 25, 10, 2, 223, 24, 10, 2, 223, 23, - 10, 2, 223, 22, 10, 2, 223, 20, 10, 2, 223, 21, 24, 233, 76, 10, 2, 223, - 21, 24, 226, 122, 10, 2, 223, 21, 24, 213, 164, 98, 221, 188, 10, 2, 223, - 21, 24, 213, 164, 98, 213, 164, 98, 221, 188, 10, 2, 223, 21, 24, 200, - 116, 98, 249, 145, 10, 2, 223, 19, 10, 2, 223, 18, 10, 2, 223, 17, 10, 2, - 223, 16, 10, 2, 223, 15, 10, 2, 223, 14, 10, 2, 223, 13, 10, 2, 223, 12, - 10, 2, 223, 11, 10, 2, 223, 10, 10, 2, 223, 8, 10, 2, 223, 9, 24, 250, - 195, 10, 2, 223, 9, 24, 249, 127, 10, 2, 223, 9, 24, 237, 187, 233, 53, - 233, 52, 10, 2, 223, 9, 24, 223, 178, 10, 2, 223, 9, 24, 172, 10, 2, 223, - 9, 24, 203, 101, 10, 2, 223, 9, 24, 203, 68, 10, 2, 223, 9, 24, 200, 115, - 10, 2, 223, 9, 24, 200, 104, 10, 2, 223, 9, 24, 200, 8, 10, 2, 223, 7, - 10, 2, 223, 5, 10, 2, 223, 6, 24, 237, 199, 10, 2, 223, 6, 24, 234, 123, - 10, 2, 223, 6, 24, 226, 122, 10, 2, 223, 6, 24, 226, 123, 233, 52, 10, 2, - 223, 6, 24, 216, 223, 10, 2, 223, 6, 24, 213, 164, 98, 213, 164, 98, 221, - 188, 10, 2, 223, 6, 24, 206, 240, 98, 224, 101, 10, 2, 223, 6, 24, 200, - 104, 10, 2, 223, 6, 24, 200, 8, 10, 2, 223, 3, 10, 2, 223, 2, 10, 2, 221, - 190, 233, 53, 24, 250, 195, 10, 2, 221, 190, 24, 239, 75, 10, 2, 221, - 190, 24, 232, 228, 10, 2, 221, 190, 24, 213, 163, 10, 2, 221, 190, 24, - 213, 164, 98, 213, 164, 98, 221, 188, 10, 2, 221, 190, 24, 203, 129, 10, - 2, 219, 79, 98, 195, 114, 10, 2, 218, 94, 127, 218, 94, 24, 234, 123, 10, - 2, 218, 94, 127, 218, 94, 24, 225, 25, 10, 2, 216, 181, 24, 239, 108, - 233, 52, 10, 2, 216, 181, 24, 233, 164, 10, 2, 216, 181, 24, 233, 57, 10, - 2, 216, 181, 24, 232, 71, 10, 2, 216, 181, 24, 224, 173, 10, 2, 216, 181, - 24, 223, 46, 10, 2, 216, 181, 24, 220, 12, 10, 2, 216, 181, 24, 213, 164, - 98, 213, 163, 10, 2, 216, 181, 24, 66, 10, 2, 216, 181, 24, 118, 98, 66, - 10, 2, 216, 181, 24, 200, 8, 10, 2, 209, 2, 233, 53, 24, 142, 10, 2, 209, - 2, 24, 236, 230, 10, 2, 209, 2, 24, 207, 0, 250, 169, 222, 184, 10, 2, - 209, 2, 24, 203, 129, 10, 2, 207, 47, 203, 12, 10, 2, 207, 0, 127, 206, - 255, 10, 2, 207, 0, 98, 231, 67, 10, 2, 207, 0, 98, 217, 224, 10, 2, 207, - 0, 98, 208, 204, 10, 2, 206, 150, 98, 237, 196, 24, 216, 223, 10, 2, 206, - 150, 98, 237, 84, 24, 251, 106, 10, 2, 206, 113, 24, 203, 129, 10, 2, - 203, 130, 98, 209, 1, 10, 2, 201, 23, 24, 234, 92, 203, 12, 10, 2, 201, - 23, 24, 115, 239, 75, 10, 2, 200, 20, 226, 16, 10, 2, 200, 20, 24, 200, - 104, 10, 2, 200, 11, 24, 240, 74, 10, 2, 200, 11, 24, 223, 4, 10, 2, 200, - 11, 24, 221, 188, 10, 2, 195, 114, 10, 2, 195, 0, 127, 195, 0, 98, 208, - 204, 10, 2, 194, 254, 24, 115, 239, 76, 203, 12, 14, 7, 255, 161, 14, 7, - 255, 160, 14, 7, 255, 159, 14, 7, 255, 158, 14, 7, 255, 157, 14, 7, 255, - 156, 14, 7, 255, 155, 14, 7, 255, 154, 14, 7, 255, 153, 14, 7, 255, 152, - 14, 7, 255, 151, 14, 7, 255, 150, 14, 7, 255, 149, 14, 7, 255, 147, 14, - 7, 255, 146, 14, 7, 255, 145, 14, 7, 255, 144, 14, 7, 255, 143, 14, 7, - 255, 142, 14, 7, 255, 141, 14, 7, 255, 140, 14, 7, 255, 139, 14, 7, 255, - 138, 14, 7, 255, 137, 14, 7, 255, 136, 14, 7, 255, 135, 14, 7, 255, 134, - 14, 7, 255, 133, 14, 7, 255, 132, 14, 7, 255, 131, 14, 7, 255, 130, 14, - 7, 255, 128, 14, 7, 255, 127, 14, 7, 255, 125, 14, 7, 255, 124, 14, 7, - 255, 123, 14, 7, 255, 122, 14, 7, 255, 121, 14, 7, 255, 120, 14, 7, 255, - 119, 14, 7, 255, 118, 14, 7, 255, 117, 14, 7, 255, 116, 14, 7, 255, 115, - 14, 7, 255, 114, 14, 7, 255, 112, 14, 7, 255, 111, 14, 7, 255, 110, 14, - 7, 255, 108, 14, 7, 255, 107, 14, 7, 255, 106, 14, 7, 255, 105, 14, 7, - 255, 104, 14, 7, 255, 103, 14, 7, 255, 102, 14, 7, 255, 101, 14, 7, 255, - 98, 14, 7, 255, 97, 14, 7, 255, 96, 14, 7, 255, 95, 14, 7, 255, 94, 14, - 7, 255, 93, 14, 7, 255, 92, 14, 7, 255, 91, 14, 7, 255, 90, 14, 7, 255, - 89, 14, 7, 255, 88, 14, 7, 255, 87, 14, 7, 255, 86, 14, 7, 255, 85, 14, - 7, 255, 84, 14, 7, 255, 83, 14, 7, 255, 82, 14, 7, 255, 81, 14, 7, 255, - 80, 14, 7, 255, 79, 14, 7, 255, 75, 14, 7, 255, 74, 14, 7, 255, 73, 14, - 7, 255, 72, 14, 7, 250, 110, 14, 7, 250, 108, 14, 7, 250, 106, 14, 7, - 250, 104, 14, 7, 250, 102, 14, 7, 250, 101, 14, 7, 250, 99, 14, 7, 250, - 97, 14, 7, 250, 95, 14, 7, 250, 93, 14, 7, 247, 203, 14, 7, 247, 202, 14, - 7, 247, 201, 14, 7, 247, 200, 14, 7, 247, 199, 14, 7, 247, 198, 14, 7, - 247, 197, 14, 7, 247, 196, 14, 7, 247, 195, 14, 7, 247, 194, 14, 7, 247, - 193, 14, 7, 247, 192, 14, 7, 247, 191, 14, 7, 247, 190, 14, 7, 247, 189, - 14, 7, 247, 188, 14, 7, 247, 187, 14, 7, 247, 186, 14, 7, 247, 185, 14, - 7, 247, 184, 14, 7, 247, 183, 14, 7, 247, 182, 14, 7, 247, 181, 14, 7, - 247, 180, 14, 7, 247, 179, 14, 7, 247, 178, 14, 7, 247, 177, 14, 7, 247, - 176, 14, 7, 240, 230, 14, 7, 240, 229, 14, 7, 240, 228, 14, 7, 240, 227, - 14, 7, 240, 226, 14, 7, 240, 225, 14, 7, 240, 224, 14, 7, 240, 223, 14, - 7, 240, 222, 14, 7, 240, 221, 14, 7, 240, 220, 14, 7, 240, 219, 14, 7, - 240, 218, 14, 7, 240, 217, 14, 7, 240, 216, 14, 7, 240, 215, 14, 7, 240, - 214, 14, 7, 240, 213, 14, 7, 240, 212, 14, 7, 240, 211, 14, 7, 240, 210, - 14, 7, 240, 209, 14, 7, 240, 208, 14, 7, 240, 207, 14, 7, 240, 206, 14, - 7, 240, 205, 14, 7, 240, 204, 14, 7, 240, 203, 14, 7, 240, 202, 14, 7, - 240, 201, 14, 7, 240, 200, 14, 7, 240, 199, 14, 7, 240, 198, 14, 7, 240, - 197, 14, 7, 240, 196, 14, 7, 240, 195, 14, 7, 240, 194, 14, 7, 240, 193, - 14, 7, 240, 192, 14, 7, 240, 191, 14, 7, 240, 190, 14, 7, 240, 189, 14, - 7, 240, 188, 14, 7, 240, 187, 14, 7, 240, 186, 14, 7, 240, 185, 14, 7, - 240, 184, 14, 7, 240, 183, 14, 7, 240, 182, 14, 7, 240, 181, 14, 7, 240, - 180, 14, 7, 240, 179, 14, 7, 240, 178, 14, 7, 240, 177, 14, 7, 240, 176, - 14, 7, 240, 175, 14, 7, 240, 174, 14, 7, 240, 173, 14, 7, 240, 172, 14, - 7, 240, 171, 14, 7, 240, 170, 14, 7, 240, 169, 14, 7, 240, 168, 14, 7, - 240, 167, 14, 7, 240, 166, 14, 7, 240, 165, 14, 7, 240, 164, 14, 7, 240, - 163, 14, 7, 240, 162, 14, 7, 240, 161, 14, 7, 240, 160, 14, 7, 240, 159, - 14, 7, 240, 158, 14, 7, 240, 157, 14, 7, 240, 156, 14, 7, 240, 155, 14, - 7, 240, 154, 14, 7, 240, 153, 14, 7, 240, 152, 14, 7, 240, 151, 14, 7, - 240, 150, 14, 7, 240, 149, 14, 7, 240, 148, 14, 7, 240, 147, 14, 7, 240, - 146, 14, 7, 240, 145, 14, 7, 240, 144, 14, 7, 240, 143, 14, 7, 240, 142, - 14, 7, 240, 141, 14, 7, 240, 140, 14, 7, 240, 139, 14, 7, 237, 128, 14, - 7, 237, 127, 14, 7, 237, 126, 14, 7, 237, 125, 14, 7, 237, 124, 14, 7, - 237, 123, 14, 7, 237, 122, 14, 7, 237, 121, 14, 7, 237, 120, 14, 7, 237, - 119, 14, 7, 237, 118, 14, 7, 237, 117, 14, 7, 237, 116, 14, 7, 237, 115, - 14, 7, 237, 114, 14, 7, 237, 113, 14, 7, 237, 112, 14, 7, 237, 111, 14, - 7, 237, 110, 14, 7, 237, 109, 14, 7, 237, 108, 14, 7, 237, 107, 14, 7, - 237, 106, 14, 7, 237, 105, 14, 7, 237, 104, 14, 7, 237, 103, 14, 7, 237, - 102, 14, 7, 237, 101, 14, 7, 237, 100, 14, 7, 237, 99, 14, 7, 237, 98, - 14, 7, 237, 97, 14, 7, 237, 96, 14, 7, 237, 95, 14, 7, 237, 94, 14, 7, - 237, 93, 14, 7, 237, 92, 14, 7, 237, 91, 14, 7, 237, 90, 14, 7, 237, 89, - 14, 7, 237, 88, 14, 7, 237, 87, 14, 7, 237, 86, 14, 7, 237, 85, 14, 7, - 236, 48, 14, 7, 236, 47, 14, 7, 236, 46, 14, 7, 236, 45, 14, 7, 236, 44, - 14, 7, 236, 43, 14, 7, 236, 42, 14, 7, 236, 41, 14, 7, 236, 40, 14, 7, - 236, 39, 14, 7, 236, 38, 14, 7, 236, 37, 14, 7, 236, 36, 14, 7, 236, 35, - 14, 7, 236, 34, 14, 7, 236, 33, 14, 7, 236, 32, 14, 7, 236, 31, 14, 7, - 236, 30, 14, 7, 236, 29, 14, 7, 236, 28, 14, 7, 236, 27, 14, 7, 236, 26, - 14, 7, 236, 25, 14, 7, 236, 24, 14, 7, 236, 23, 14, 7, 236, 22, 14, 7, - 236, 21, 14, 7, 236, 20, 14, 7, 236, 19, 14, 7, 236, 18, 14, 7, 236, 17, - 14, 7, 236, 16, 14, 7, 236, 15, 14, 7, 236, 14, 14, 7, 236, 13, 14, 7, - 236, 12, 14, 7, 236, 11, 14, 7, 236, 10, 14, 7, 236, 9, 14, 7, 236, 8, - 14, 7, 236, 7, 14, 7, 236, 6, 14, 7, 236, 5, 14, 7, 236, 4, 14, 7, 236, - 3, 14, 7, 236, 2, 14, 7, 236, 1, 14, 7, 236, 0, 14, 7, 235, 255, 14, 7, - 235, 254, 14, 7, 235, 253, 14, 7, 235, 252, 14, 7, 235, 251, 14, 7, 235, - 250, 14, 7, 235, 249, 14, 7, 235, 248, 14, 7, 235, 247, 14, 7, 235, 246, - 14, 7, 235, 245, 14, 7, 235, 244, 14, 7, 235, 243, 14, 7, 235, 242, 14, - 7, 235, 241, 14, 7, 235, 240, 14, 7, 234, 189, 14, 7, 234, 188, 14, 7, - 234, 187, 14, 7, 234, 186, 14, 7, 234, 185, 14, 7, 234, 184, 14, 7, 234, - 183, 14, 7, 234, 182, 14, 7, 234, 181, 14, 7, 234, 180, 14, 7, 234, 179, - 14, 7, 234, 178, 14, 7, 234, 177, 14, 7, 234, 176, 14, 7, 234, 175, 14, - 7, 234, 174, 14, 7, 234, 173, 14, 7, 234, 172, 14, 7, 234, 171, 14, 7, - 234, 170, 14, 7, 234, 169, 14, 7, 234, 168, 14, 7, 234, 167, 14, 7, 234, - 166, 14, 7, 234, 165, 14, 7, 234, 164, 14, 7, 234, 163, 14, 7, 234, 162, - 14, 7, 234, 161, 14, 7, 234, 160, 14, 7, 234, 159, 14, 7, 234, 158, 14, - 7, 234, 157, 14, 7, 234, 156, 14, 7, 234, 155, 14, 7, 234, 154, 14, 7, - 234, 153, 14, 7, 234, 152, 14, 7, 234, 151, 14, 7, 234, 150, 14, 7, 234, - 149, 14, 7, 234, 148, 14, 7, 234, 147, 14, 7, 234, 146, 14, 7, 234, 145, - 14, 7, 234, 144, 14, 7, 234, 143, 14, 7, 234, 142, 14, 7, 234, 141, 14, - 7, 234, 140, 14, 7, 234, 139, 14, 7, 234, 138, 14, 7, 234, 137, 14, 7, - 234, 136, 14, 7, 234, 135, 14, 7, 234, 134, 14, 7, 234, 133, 14, 7, 234, - 132, 14, 7, 234, 131, 14, 7, 234, 130, 14, 7, 234, 129, 14, 7, 234, 128, - 14, 7, 234, 127, 14, 7, 234, 126, 14, 7, 233, 13, 14, 7, 233, 12, 14, 7, - 233, 11, 14, 7, 233, 10, 14, 7, 233, 9, 14, 7, 233, 8, 14, 7, 233, 7, 14, - 7, 233, 6, 14, 7, 233, 5, 14, 7, 230, 229, 14, 7, 230, 228, 14, 7, 230, - 227, 14, 7, 230, 226, 14, 7, 230, 225, 14, 7, 230, 224, 14, 7, 230, 223, - 14, 7, 230, 222, 14, 7, 230, 221, 14, 7, 230, 220, 14, 7, 230, 219, 14, - 7, 230, 218, 14, 7, 230, 217, 14, 7, 230, 216, 14, 7, 230, 215, 14, 7, - 230, 214, 14, 7, 230, 213, 14, 7, 230, 212, 14, 7, 230, 211, 14, 7, 225, - 79, 14, 7, 225, 78, 14, 7, 225, 77, 14, 7, 225, 76, 14, 7, 225, 75, 14, - 7, 225, 74, 14, 7, 225, 73, 14, 7, 225, 72, 14, 7, 223, 97, 14, 7, 223, - 96, 14, 7, 223, 95, 14, 7, 223, 94, 14, 7, 223, 93, 14, 7, 223, 92, 14, - 7, 223, 91, 14, 7, 223, 90, 14, 7, 223, 89, 14, 7, 223, 88, 14, 7, 221, - 134, 14, 7, 221, 133, 14, 7, 221, 132, 14, 7, 221, 130, 14, 7, 221, 128, - 14, 7, 221, 127, 14, 7, 221, 125, 14, 7, 221, 123, 14, 7, 221, 121, 14, - 7, 221, 119, 14, 7, 221, 117, 14, 7, 221, 115, 14, 7, 221, 113, 14, 7, - 221, 112, 14, 7, 221, 110, 14, 7, 221, 108, 14, 7, 221, 107, 14, 7, 221, - 106, 14, 7, 221, 105, 14, 7, 221, 104, 14, 7, 221, 103, 14, 7, 221, 102, - 14, 7, 221, 101, 14, 7, 221, 100, 14, 7, 221, 98, 14, 7, 221, 96, 14, 7, - 221, 94, 14, 7, 221, 93, 14, 7, 221, 91, 14, 7, 221, 90, 14, 7, 221, 88, - 14, 7, 221, 87, 14, 7, 221, 85, 14, 7, 221, 83, 14, 7, 221, 81, 14, 7, - 221, 79, 14, 7, 221, 77, 14, 7, 221, 76, 14, 7, 221, 74, 14, 7, 221, 72, - 14, 7, 221, 71, 14, 7, 221, 69, 14, 7, 221, 67, 14, 7, 221, 65, 14, 7, - 221, 63, 14, 7, 221, 62, 14, 7, 221, 60, 14, 7, 221, 58, 14, 7, 221, 56, - 14, 7, 221, 55, 14, 7, 221, 53, 14, 7, 221, 51, 14, 7, 221, 50, 14, 7, - 221, 49, 14, 7, 221, 47, 14, 7, 221, 45, 14, 7, 221, 43, 14, 7, 221, 41, - 14, 7, 221, 39, 14, 7, 221, 37, 14, 7, 221, 35, 14, 7, 221, 34, 14, 7, - 221, 32, 14, 7, 221, 30, 14, 7, 221, 28, 14, 7, 221, 26, 14, 7, 218, 50, - 14, 7, 218, 49, 14, 7, 218, 48, 14, 7, 218, 47, 14, 7, 218, 46, 14, 7, - 218, 45, 14, 7, 218, 44, 14, 7, 218, 43, 14, 7, 218, 42, 14, 7, 218, 41, - 14, 7, 218, 40, 14, 7, 218, 39, 14, 7, 218, 38, 14, 7, 218, 37, 14, 7, - 218, 36, 14, 7, 218, 35, 14, 7, 218, 34, 14, 7, 218, 33, 14, 7, 218, 32, - 14, 7, 218, 31, 14, 7, 218, 30, 14, 7, 218, 29, 14, 7, 218, 28, 14, 7, - 218, 27, 14, 7, 218, 26, 14, 7, 218, 25, 14, 7, 218, 24, 14, 7, 218, 23, - 14, 7, 218, 22, 14, 7, 218, 21, 14, 7, 218, 20, 14, 7, 218, 19, 14, 7, - 218, 18, 14, 7, 218, 17, 14, 7, 218, 16, 14, 7, 218, 15, 14, 7, 218, 14, - 14, 7, 218, 13, 14, 7, 218, 12, 14, 7, 218, 11, 14, 7, 218, 10, 14, 7, - 218, 9, 14, 7, 218, 8, 14, 7, 218, 7, 14, 7, 218, 6, 14, 7, 218, 5, 14, - 7, 218, 4, 14, 7, 218, 3, 14, 7, 218, 2, 14, 7, 216, 111, 14, 7, 216, - 110, 14, 7, 216, 109, 14, 7, 216, 108, 14, 7, 216, 107, 14, 7, 216, 106, - 14, 7, 216, 105, 14, 7, 216, 104, 14, 7, 216, 103, 14, 7, 216, 102, 14, - 7, 216, 101, 14, 7, 216, 100, 14, 7, 216, 99, 14, 7, 216, 98, 14, 7, 216, - 97, 14, 7, 216, 96, 14, 7, 216, 95, 14, 7, 216, 94, 14, 7, 216, 93, 14, - 7, 216, 92, 14, 7, 216, 91, 14, 7, 216, 90, 14, 7, 215, 182, 14, 7, 215, - 181, 14, 7, 215, 180, 14, 7, 215, 179, 14, 7, 215, 178, 14, 7, 215, 177, - 14, 7, 215, 176, 14, 7, 215, 175, 14, 7, 215, 174, 14, 7, 215, 173, 14, - 7, 215, 172, 14, 7, 215, 171, 14, 7, 215, 170, 14, 7, 215, 169, 14, 7, - 215, 168, 14, 7, 215, 167, 14, 7, 215, 166, 14, 7, 215, 165, 14, 7, 215, - 164, 14, 7, 215, 163, 14, 7, 215, 162, 14, 7, 215, 161, 14, 7, 215, 160, - 14, 7, 215, 159, 14, 7, 215, 158, 14, 7, 215, 157, 14, 7, 215, 10, 14, 7, - 215, 9, 14, 7, 215, 8, 14, 7, 215, 7, 14, 7, 215, 6, 14, 7, 215, 5, 14, - 7, 215, 4, 14, 7, 215, 3, 14, 7, 215, 2, 14, 7, 215, 1, 14, 7, 215, 0, - 14, 7, 214, 255, 14, 7, 214, 254, 14, 7, 214, 253, 14, 7, 214, 252, 14, - 7, 214, 251, 14, 7, 214, 250, 14, 7, 214, 249, 14, 7, 214, 248, 14, 7, - 214, 247, 14, 7, 214, 246, 14, 7, 214, 245, 14, 7, 214, 244, 14, 7, 214, - 243, 14, 7, 214, 242, 14, 7, 214, 241, 14, 7, 214, 240, 14, 7, 214, 239, - 14, 7, 214, 238, 14, 7, 214, 237, 14, 7, 214, 236, 14, 7, 214, 235, 14, - 7, 214, 234, 14, 7, 214, 233, 14, 7, 214, 232, 14, 7, 214, 231, 14, 7, - 214, 230, 14, 7, 214, 229, 14, 7, 214, 228, 14, 7, 214, 227, 14, 7, 214, - 226, 14, 7, 214, 225, 14, 7, 214, 224, 14, 7, 214, 223, 14, 7, 214, 222, - 14, 7, 214, 221, 14, 7, 214, 220, 14, 7, 214, 219, 14, 7, 214, 218, 14, - 7, 214, 217, 14, 7, 214, 216, 14, 7, 214, 215, 14, 7, 214, 214, 14, 7, - 214, 213, 14, 7, 214, 212, 14, 7, 214, 211, 14, 7, 214, 210, 14, 7, 214, - 209, 14, 7, 214, 208, 14, 7, 214, 207, 14, 7, 214, 206, 14, 7, 214, 205, - 14, 7, 214, 204, 14, 7, 214, 203, 14, 7, 214, 202, 14, 7, 214, 201, 14, - 7, 214, 200, 14, 7, 214, 199, 14, 7, 214, 198, 14, 7, 214, 197, 14, 7, - 214, 196, 14, 7, 214, 195, 14, 7, 214, 194, 14, 7, 214, 193, 14, 7, 214, - 192, 14, 7, 214, 2, 14, 7, 214, 1, 14, 7, 214, 0, 14, 7, 213, 255, 14, 7, - 213, 254, 14, 7, 213, 253, 14, 7, 213, 252, 14, 7, 213, 251, 14, 7, 213, - 250, 14, 7, 213, 249, 14, 7, 213, 248, 14, 7, 213, 247, 14, 7, 213, 246, - 14, 7, 211, 166, 14, 7, 211, 165, 14, 7, 211, 164, 14, 7, 211, 163, 14, - 7, 211, 162, 14, 7, 211, 161, 14, 7, 211, 160, 14, 7, 211, 30, 14, 7, - 211, 29, 14, 7, 211, 28, 14, 7, 211, 27, 14, 7, 211, 26, 14, 7, 211, 25, - 14, 7, 211, 24, 14, 7, 211, 23, 14, 7, 211, 22, 14, 7, 211, 21, 14, 7, - 211, 20, 14, 7, 211, 19, 14, 7, 211, 18, 14, 7, 211, 17, 14, 7, 211, 16, - 14, 7, 211, 15, 14, 7, 211, 14, 14, 7, 211, 13, 14, 7, 211, 12, 14, 7, - 211, 11, 14, 7, 211, 10, 14, 7, 211, 9, 14, 7, 211, 8, 14, 7, 211, 7, 14, - 7, 211, 6, 14, 7, 211, 5, 14, 7, 211, 4, 14, 7, 211, 3, 14, 7, 211, 2, - 14, 7, 211, 1, 14, 7, 211, 0, 14, 7, 210, 255, 14, 7, 210, 254, 14, 7, - 210, 253, 14, 7, 209, 77, 14, 7, 209, 76, 14, 7, 209, 75, 14, 7, 209, 74, - 14, 7, 209, 73, 14, 7, 209, 72, 14, 7, 209, 71, 14, 7, 209, 70, 14, 7, - 209, 69, 14, 7, 209, 68, 14, 7, 209, 67, 14, 7, 209, 66, 14, 7, 209, 65, - 14, 7, 209, 64, 14, 7, 209, 63, 14, 7, 209, 62, 14, 7, 209, 61, 14, 7, - 209, 60, 14, 7, 209, 59, 14, 7, 209, 58, 14, 7, 209, 57, 14, 7, 209, 56, - 14, 7, 209, 55, 14, 7, 209, 54, 14, 7, 209, 53, 14, 7, 209, 52, 14, 7, - 209, 51, 14, 7, 209, 50, 14, 7, 209, 49, 14, 7, 209, 48, 14, 7, 209, 47, - 14, 7, 209, 46, 14, 7, 209, 45, 14, 7, 209, 44, 14, 7, 209, 43, 14, 7, - 209, 42, 14, 7, 209, 41, 14, 7, 209, 40, 14, 7, 209, 39, 14, 7, 209, 38, - 14, 7, 209, 37, 14, 7, 209, 36, 14, 7, 209, 35, 14, 7, 209, 34, 14, 7, - 209, 33, 14, 7, 209, 32, 14, 7, 209, 31, 14, 7, 209, 30, 14, 7, 209, 29, - 14, 7, 209, 28, 14, 7, 209, 27, 14, 7, 209, 26, 14, 7, 209, 25, 14, 7, - 209, 24, 14, 7, 203, 213, 14, 7, 203, 212, 14, 7, 203, 211, 14, 7, 203, - 210, 14, 7, 203, 209, 14, 7, 203, 208, 14, 7, 203, 207, 14, 7, 203, 206, - 14, 7, 203, 205, 14, 7, 203, 204, 14, 7, 203, 203, 14, 7, 203, 202, 14, - 7, 203, 201, 14, 7, 203, 200, 14, 7, 203, 199, 14, 7, 203, 198, 14, 7, - 203, 197, 14, 7, 203, 196, 14, 7, 203, 195, 14, 7, 203, 194, 14, 7, 203, - 193, 14, 7, 203, 192, 14, 7, 203, 191, 14, 7, 203, 190, 14, 7, 203, 189, - 14, 7, 203, 188, 14, 7, 203, 187, 14, 7, 203, 186, 14, 7, 203, 185, 14, - 7, 203, 184, 14, 7, 203, 183, 14, 7, 203, 182, 14, 7, 203, 181, 14, 7, - 203, 180, 14, 7, 203, 179, 14, 7, 203, 178, 14, 7, 203, 177, 14, 7, 203, - 176, 14, 7, 203, 175, 14, 7, 203, 174, 14, 7, 203, 173, 14, 7, 203, 172, - 14, 7, 203, 171, 14, 7, 203, 170, 14, 7, 200, 163, 14, 7, 200, 162, 14, - 7, 200, 161, 14, 7, 200, 160, 14, 7, 200, 159, 14, 7, 200, 158, 14, 7, - 200, 157, 14, 7, 200, 156, 14, 7, 200, 155, 14, 7, 200, 154, 14, 7, 200, - 153, 14, 7, 200, 152, 14, 7, 200, 151, 14, 7, 200, 150, 14, 7, 200, 149, - 14, 7, 200, 148, 14, 7, 200, 147, 14, 7, 200, 146, 14, 7, 200, 145, 14, - 7, 200, 144, 14, 7, 200, 143, 14, 7, 200, 142, 14, 7, 200, 141, 14, 7, - 200, 140, 14, 7, 200, 139, 14, 7, 200, 138, 14, 7, 200, 137, 14, 7, 200, - 136, 14, 7, 200, 135, 14, 7, 200, 134, 14, 7, 200, 133, 14, 7, 200, 132, - 14, 7, 200, 131, 14, 7, 200, 130, 14, 7, 200, 129, 14, 7, 200, 128, 14, - 7, 200, 127, 14, 7, 200, 126, 14, 7, 200, 125, 14, 7, 200, 124, 14, 7, - 200, 123, 14, 7, 200, 122, 14, 7, 200, 121, 14, 7, 200, 120, 14, 7, 200, - 119, 14, 7, 200, 118, 14, 7, 200, 117, 14, 7, 199, 229, 14, 7, 199, 228, - 14, 7, 199, 227, 14, 7, 199, 226, 14, 7, 199, 225, 14, 7, 199, 224, 14, - 7, 199, 223, 14, 7, 199, 222, 14, 7, 199, 221, 14, 7, 199, 220, 14, 7, - 199, 219, 14, 7, 199, 218, 14, 7, 199, 217, 14, 7, 199, 216, 14, 7, 199, - 215, 14, 7, 199, 214, 14, 7, 199, 213, 14, 7, 199, 212, 14, 7, 199, 211, - 14, 7, 199, 210, 14, 7, 199, 209, 14, 7, 199, 208, 14, 7, 199, 207, 14, - 7, 199, 206, 14, 7, 199, 205, 14, 7, 199, 204, 14, 7, 199, 203, 14, 7, - 199, 202, 14, 7, 199, 201, 14, 7, 199, 200, 14, 7, 199, 199, 14, 7, 199, - 198, 14, 7, 199, 197, 14, 7, 199, 196, 14, 7, 199, 195, 14, 7, 199, 194, - 14, 7, 199, 193, 14, 7, 199, 192, 14, 7, 199, 191, 14, 7, 199, 190, 14, - 7, 199, 189, 14, 7, 199, 188, 14, 7, 199, 187, 14, 7, 199, 186, 14, 7, - 199, 185, 14, 7, 199, 184, 14, 7, 199, 183, 14, 7, 199, 182, 14, 7, 199, - 181, 14, 7, 199, 180, 14, 7, 199, 179, 14, 7, 199, 178, 14, 7, 199, 177, - 14, 7, 199, 176, 14, 7, 199, 175, 14, 7, 199, 174, 14, 7, 199, 173, 14, - 7, 199, 172, 14, 7, 199, 171, 14, 7, 199, 170, 14, 7, 199, 169, 14, 7, - 199, 168, 14, 7, 199, 167, 14, 7, 199, 166, 14, 7, 199, 165, 14, 7, 199, - 164, 14, 7, 199, 163, 14, 7, 199, 162, 14, 7, 199, 161, 14, 7, 199, 160, - 14, 7, 199, 159, 14, 7, 199, 158, 14, 7, 199, 157, 14, 7, 199, 156, 14, - 7, 199, 155, 14, 7, 199, 154, 14, 7, 199, 153, 14, 7, 197, 198, 14, 7, - 197, 197, 14, 7, 197, 196, 14, 7, 197, 195, 14, 7, 197, 194, 14, 7, 197, - 193, 14, 7, 197, 192, 14, 7, 197, 191, 14, 7, 197, 190, 14, 7, 197, 189, - 14, 7, 197, 188, 14, 7, 197, 187, 14, 7, 197, 186, 14, 7, 197, 185, 14, - 7, 197, 184, 14, 7, 197, 183, 14, 7, 197, 182, 14, 7, 197, 181, 14, 7, - 197, 180, 14, 7, 197, 179, 14, 7, 197, 178, 14, 7, 197, 177, 14, 7, 197, - 176, 14, 7, 197, 175, 14, 7, 197, 174, 14, 7, 197, 173, 14, 7, 197, 172, - 14, 7, 197, 171, 14, 7, 197, 170, 14, 7, 197, 169, 14, 7, 197, 168, 14, - 7, 197, 167, 14, 7, 196, 220, 14, 7, 196, 219, 14, 7, 196, 218, 14, 7, - 196, 217, 14, 7, 196, 216, 14, 7, 196, 215, 14, 7, 196, 214, 14, 7, 196, - 213, 14, 7, 196, 212, 14, 7, 196, 211, 14, 7, 196, 210, 14, 7, 196, 209, - 14, 7, 196, 146, 14, 7, 196, 145, 14, 7, 196, 144, 14, 7, 196, 143, 14, - 7, 196, 142, 14, 7, 196, 141, 14, 7, 196, 140, 14, 7, 196, 139, 14, 7, - 196, 138, 14, 7, 195, 157, 14, 7, 195, 156, 14, 7, 195, 155, 14, 7, 195, - 154, 14, 7, 195, 153, 14, 7, 195, 152, 14, 7, 195, 151, 14, 7, 195, 150, - 14, 7, 195, 149, 14, 7, 195, 148, 14, 7, 195, 147, 14, 7, 195, 146, 14, - 7, 195, 145, 14, 7, 195, 144, 14, 7, 195, 143, 14, 7, 195, 142, 14, 7, - 195, 141, 14, 7, 195, 140, 14, 7, 195, 139, 14, 7, 195, 138, 14, 7, 195, - 137, 14, 7, 195, 136, 14, 7, 195, 135, 14, 7, 195, 134, 14, 7, 195, 133, - 14, 7, 195, 132, 14, 7, 195, 131, 14, 7, 195, 130, 14, 7, 195, 129, 14, - 7, 195, 128, 14, 7, 195, 127, 14, 7, 195, 126, 14, 7, 195, 125, 14, 7, - 195, 124, 14, 7, 195, 123, 14, 7, 195, 122, 14, 7, 195, 121, 14, 7, 195, - 120, 14, 7, 195, 119, 14, 7, 195, 118, 14, 7, 195, 117, 14, 7, 252, 167, - 14, 7, 252, 166, 14, 7, 252, 165, 14, 7, 252, 164, 14, 7, 252, 163, 14, - 7, 252, 162, 14, 7, 252, 161, 14, 7, 252, 160, 14, 7, 252, 159, 14, 7, - 252, 158, 14, 7, 252, 157, 14, 7, 252, 156, 14, 7, 252, 155, 14, 7, 252, - 154, 14, 7, 252, 153, 14, 7, 252, 152, 14, 7, 252, 151, 14, 7, 252, 150, - 14, 7, 252, 149, 14, 7, 252, 148, 14, 7, 252, 147, 14, 7, 252, 146, 14, - 7, 252, 145, 14, 7, 252, 144, 14, 7, 252, 143, 14, 7, 252, 142, 14, 7, - 252, 141, 14, 7, 252, 140, 14, 7, 252, 139, 14, 7, 252, 138, 14, 7, 252, - 137, 14, 7, 252, 136, 14, 7, 252, 135, 14, 7, 252, 134, 14, 7, 83, 225, - 124, 14, 7, 231, 155, 225, 124, 14, 7, 226, 44, 250, 169, 201, 243, 205, - 2, 14, 7, 226, 44, 250, 169, 248, 85, 205, 2, 14, 7, 226, 44, 250, 169, - 201, 243, 236, 221, 14, 7, 226, 44, 250, 169, 248, 85, 236, 221, 14, 7, - 214, 21, 219, 63, 14, 7, 248, 243, 208, 122, 14, 7, 236, 222, 208, 122, - 28, 7, 255, 161, 28, 7, 255, 160, 28, 7, 255, 159, 28, 7, 255, 158, 28, - 7, 255, 157, 28, 7, 255, 155, 28, 7, 255, 152, 28, 7, 255, 151, 28, 7, - 255, 150, 28, 7, 255, 149, 28, 7, 255, 148, 28, 7, 255, 147, 28, 7, 255, - 146, 28, 7, 255, 145, 28, 7, 255, 144, 28, 7, 255, 142, 28, 7, 255, 141, - 28, 7, 255, 140, 28, 7, 255, 138, 28, 7, 255, 137, 28, 7, 255, 136, 28, - 7, 255, 135, 28, 7, 255, 134, 28, 7, 255, 133, 28, 7, 255, 132, 28, 7, - 255, 131, 28, 7, 255, 130, 28, 7, 255, 129, 28, 7, 255, 128, 28, 7, 255, - 127, 28, 7, 255, 125, 28, 7, 255, 124, 28, 7, 255, 123, 28, 7, 255, 122, - 28, 7, 255, 120, 28, 7, 255, 119, 28, 7, 255, 118, 28, 7, 255, 117, 28, - 7, 255, 116, 28, 7, 255, 115, 28, 7, 255, 114, 28, 7, 255, 113, 28, 7, - 255, 112, 28, 7, 255, 110, 28, 7, 255, 109, 28, 7, 255, 108, 28, 7, 255, - 106, 28, 7, 255, 104, 28, 7, 255, 103, 28, 7, 255, 102, 28, 7, 255, 101, - 28, 7, 255, 100, 28, 7, 255, 99, 28, 7, 255, 98, 28, 7, 255, 97, 28, 7, - 255, 96, 28, 7, 255, 95, 28, 7, 255, 94, 28, 7, 255, 93, 28, 7, 255, 92, - 28, 7, 255, 91, 28, 7, 255, 90, 28, 7, 255, 89, 28, 7, 255, 88, 28, 7, - 255, 87, 28, 7, 255, 86, 28, 7, 255, 85, 28, 7, 255, 84, 28, 7, 255, 83, - 28, 7, 255, 82, 28, 7, 255, 81, 28, 7, 255, 80, 28, 7, 255, 79, 28, 7, - 255, 78, 28, 7, 255, 77, 28, 7, 255, 76, 28, 7, 255, 75, 28, 7, 255, 74, - 28, 7, 255, 73, 28, 7, 255, 72, 28, 7, 255, 71, 28, 7, 255, 70, 28, 7, - 255, 69, 28, 7, 255, 68, 28, 7, 255, 67, 28, 7, 255, 66, 28, 7, 255, 65, - 28, 7, 255, 64, 28, 7, 255, 63, 28, 7, 255, 62, 28, 7, 255, 61, 28, 7, - 255, 60, 28, 7, 255, 59, 28, 7, 255, 58, 28, 7, 255, 57, 28, 7, 255, 56, - 28, 7, 255, 55, 28, 7, 255, 54, 28, 7, 255, 53, 28, 7, 255, 52, 28, 7, - 255, 51, 28, 7, 255, 50, 28, 7, 255, 49, 28, 7, 255, 48, 28, 7, 255, 47, - 28, 7, 255, 46, 28, 7, 255, 45, 28, 7, 255, 44, 28, 7, 255, 43, 28, 7, - 255, 42, 28, 7, 255, 41, 28, 7, 255, 40, 28, 7, 255, 38, 28, 7, 255, 37, - 28, 7, 255, 36, 28, 7, 255, 35, 28, 7, 255, 34, 28, 7, 255, 33, 28, 7, - 255, 32, 28, 7, 255, 31, 28, 7, 255, 30, 28, 7, 255, 29, 28, 7, 255, 28, - 28, 7, 255, 27, 28, 7, 255, 26, 28, 7, 255, 25, 28, 7, 255, 24, 28, 7, - 255, 23, 28, 7, 255, 22, 28, 7, 255, 21, 28, 7, 255, 20, 28, 7, 255, 19, - 28, 7, 255, 18, 28, 7, 255, 17, 28, 7, 255, 16, 28, 7, 255, 15, 28, 7, - 255, 14, 28, 7, 255, 13, 28, 7, 255, 12, 28, 7, 255, 11, 28, 7, 255, 10, - 28, 7, 255, 9, 28, 7, 255, 8, 28, 7, 255, 7, 28, 7, 255, 6, 28, 7, 255, - 5, 28, 7, 255, 3, 28, 7, 255, 2, 28, 7, 255, 1, 28, 7, 255, 0, 28, 7, - 254, 255, 28, 7, 254, 254, 28, 7, 254, 253, 28, 7, 254, 252, 28, 7, 254, - 251, 28, 7, 254, 250, 28, 7, 254, 249, 28, 7, 254, 248, 28, 7, 254, 246, - 28, 7, 254, 245, 28, 7, 254, 244, 28, 7, 254, 243, 28, 7, 254, 242, 28, - 7, 254, 241, 28, 7, 254, 240, 28, 7, 254, 239, 28, 7, 254, 238, 28, 7, - 254, 237, 28, 7, 254, 236, 28, 7, 254, 235, 28, 7, 254, 234, 28, 7, 254, - 233, 28, 7, 254, 232, 28, 7, 254, 231, 28, 7, 254, 230, 28, 7, 254, 229, - 28, 7, 254, 228, 28, 7, 254, 227, 28, 7, 254, 226, 28, 7, 254, 225, 28, - 7, 254, 224, 28, 7, 254, 223, 28, 7, 254, 222, 28, 7, 254, 221, 28, 7, - 254, 220, 28, 7, 254, 219, 28, 7, 254, 218, 28, 7, 254, 217, 28, 7, 254, - 216, 28, 7, 254, 215, 28, 7, 254, 214, 28, 7, 254, 213, 28, 7, 254, 212, - 28, 7, 254, 211, 28, 7, 254, 210, 28, 7, 254, 209, 28, 7, 254, 208, 28, - 7, 254, 207, 28, 7, 254, 206, 28, 7, 254, 205, 28, 7, 254, 204, 28, 7, - 254, 203, 28, 7, 254, 202, 28, 7, 254, 201, 28, 7, 254, 200, 28, 7, 254, - 199, 28, 7, 254, 198, 28, 7, 254, 197, 28, 7, 254, 196, 28, 7, 254, 195, - 28, 7, 254, 194, 28, 7, 254, 193, 28, 7, 254, 192, 28, 7, 254, 191, 28, - 7, 254, 190, 28, 7, 254, 189, 28, 7, 254, 188, 28, 7, 254, 187, 28, 7, - 254, 186, 28, 7, 254, 185, 28, 7, 254, 184, 28, 7, 254, 183, 28, 7, 254, - 182, 28, 7, 254, 181, 28, 7, 254, 180, 28, 7, 254, 179, 28, 7, 254, 178, - 28, 7, 254, 176, 28, 7, 254, 175, 28, 7, 254, 174, 28, 7, 254, 173, 28, - 7, 254, 172, 28, 7, 254, 171, 28, 7, 254, 170, 28, 7, 254, 169, 28, 7, - 254, 168, 28, 7, 254, 167, 28, 7, 254, 166, 28, 7, 254, 165, 28, 7, 254, - 164, 28, 7, 254, 163, 28, 7, 254, 162, 28, 7, 254, 161, 28, 7, 254, 160, - 28, 7, 254, 159, 28, 7, 254, 158, 28, 7, 254, 157, 28, 7, 254, 156, 28, - 7, 254, 155, 28, 7, 254, 154, 28, 7, 254, 153, 28, 7, 254, 152, 28, 7, - 254, 151, 28, 7, 254, 150, 28, 7, 254, 149, 28, 7, 254, 148, 28, 7, 254, - 147, 28, 7, 254, 146, 28, 7, 254, 145, 28, 7, 254, 144, 28, 7, 254, 143, - 28, 7, 254, 142, 28, 7, 254, 141, 28, 7, 254, 140, 28, 7, 254, 139, 28, - 7, 254, 138, 28, 7, 254, 137, 28, 7, 254, 136, 28, 7, 254, 135, 28, 7, - 254, 134, 28, 7, 254, 133, 28, 7, 254, 132, 28, 7, 254, 131, 28, 7, 254, - 130, 28, 7, 254, 129, 28, 7, 254, 128, 28, 7, 254, 127, 28, 7, 254, 126, - 28, 7, 254, 125, 28, 7, 254, 124, 28, 7, 254, 123, 28, 7, 254, 122, 28, - 7, 254, 121, 28, 7, 254, 120, 28, 7, 254, 119, 28, 7, 254, 118, 28, 7, - 254, 117, 28, 7, 254, 116, 28, 7, 254, 115, 28, 7, 254, 114, 28, 7, 254, - 113, 28, 7, 254, 112, 28, 7, 254, 111, 28, 7, 254, 110, 28, 7, 254, 109, - 28, 7, 254, 108, 28, 7, 254, 107, 28, 7, 254, 106, 28, 7, 254, 105, 28, - 7, 254, 104, 28, 7, 254, 103, 28, 7, 254, 102, 28, 7, 254, 101, 28, 7, - 254, 100, 28, 7, 254, 99, 28, 7, 254, 98, 28, 7, 254, 97, 28, 7, 254, 96, - 28, 7, 254, 95, 28, 7, 254, 94, 28, 7, 254, 93, 28, 7, 254, 92, 28, 7, - 254, 91, 28, 7, 254, 90, 28, 7, 254, 89, 28, 7, 254, 88, 28, 7, 254, 87, - 28, 7, 254, 86, 28, 7, 254, 85, 28, 7, 254, 84, 28, 7, 254, 83, 28, 7, - 254, 82, 28, 7, 254, 81, 28, 7, 254, 80, 28, 7, 254, 79, 28, 7, 254, 78, - 28, 7, 254, 77, 28, 7, 254, 76, 28, 7, 254, 75, 28, 7, 254, 74, 28, 7, - 254, 73, 28, 7, 254, 72, 28, 7, 254, 71, 28, 7, 254, 70, 28, 7, 254, 69, - 28, 7, 254, 68, 28, 7, 254, 67, 28, 7, 254, 66, 28, 7, 254, 64, 28, 7, - 254, 63, 28, 7, 254, 62, 28, 7, 254, 61, 28, 7, 254, 60, 28, 7, 254, 59, - 28, 7, 254, 58, 28, 7, 254, 57, 28, 7, 254, 56, 28, 7, 254, 55, 28, 7, - 254, 54, 28, 7, 254, 51, 28, 7, 254, 50, 28, 7, 254, 49, 28, 7, 254, 48, - 28, 7, 254, 44, 28, 7, 254, 43, 28, 7, 254, 42, 28, 7, 254, 41, 28, 7, - 254, 40, 28, 7, 254, 39, 28, 7, 254, 38, 28, 7, 254, 37, 28, 7, 254, 36, - 28, 7, 254, 35, 28, 7, 254, 34, 28, 7, 254, 33, 28, 7, 254, 32, 28, 7, - 254, 31, 28, 7, 254, 30, 28, 7, 254, 29, 28, 7, 254, 28, 28, 7, 254, 27, - 28, 7, 254, 26, 28, 7, 254, 24, 28, 7, 254, 23, 28, 7, 254, 22, 28, 7, - 254, 21, 28, 7, 254, 20, 28, 7, 254, 19, 28, 7, 254, 18, 28, 7, 254, 17, - 28, 7, 254, 16, 28, 7, 254, 15, 28, 7, 254, 14, 28, 7, 254, 13, 28, 7, - 254, 12, 28, 7, 254, 11, 28, 7, 254, 10, 28, 7, 254, 9, 28, 7, 254, 8, - 28, 7, 254, 7, 28, 7, 254, 6, 28, 7, 254, 5, 28, 7, 254, 4, 28, 7, 254, - 3, 28, 7, 254, 2, 28, 7, 254, 1, 28, 7, 254, 0, 28, 7, 253, 255, 28, 7, - 253, 254, 28, 7, 253, 253, 28, 7, 253, 252, 28, 7, 253, 251, 28, 7, 253, - 250, 28, 7, 253, 249, 28, 7, 253, 248, 28, 7, 253, 247, 28, 7, 253, 246, - 28, 7, 253, 245, 28, 7, 253, 244, 28, 7, 253, 243, 28, 7, 253, 242, 28, - 7, 253, 241, 28, 7, 253, 240, 28, 7, 253, 239, 28, 7, 253, 238, 28, 7, - 253, 237, 28, 7, 253, 236, 28, 7, 253, 235, 28, 7, 253, 234, 28, 7, 253, - 233, 28, 7, 253, 232, 28, 7, 253, 231, 28, 7, 253, 230, 28, 7, 253, 229, - 28, 7, 253, 228, 28, 7, 253, 227, 28, 7, 253, 226, 28, 7, 253, 225, 28, - 7, 253, 224, 28, 7, 253, 223, 28, 7, 253, 222, 28, 7, 253, 221, 28, 7, - 253, 220, 28, 7, 253, 219, 210, 252, 214, 73, 210, 72, 28, 7, 253, 218, - 28, 7, 253, 217, 28, 7, 253, 216, 28, 7, 253, 215, 28, 7, 253, 214, 28, - 7, 253, 213, 28, 7, 253, 212, 28, 7, 253, 211, 28, 7, 253, 210, 28, 7, - 253, 209, 28, 7, 253, 208, 28, 7, 253, 207, 171, 28, 7, 253, 206, 28, 7, - 253, 205, 28, 7, 253, 204, 28, 7, 253, 203, 28, 7, 253, 202, 28, 7, 253, - 201, 28, 7, 253, 200, 28, 7, 253, 198, 28, 7, 253, 196, 28, 7, 253, 194, - 28, 7, 253, 192, 28, 7, 253, 190, 28, 7, 253, 188, 28, 7, 253, 186, 28, - 7, 253, 184, 28, 7, 253, 182, 28, 7, 253, 180, 248, 243, 221, 248, 78, - 28, 7, 253, 178, 236, 222, 221, 248, 78, 28, 7, 253, 177, 28, 7, 253, - 175, 28, 7, 253, 173, 28, 7, 253, 171, 28, 7, 253, 169, 28, 7, 253, 167, - 28, 7, 253, 165, 28, 7, 253, 163, 28, 7, 253, 161, 28, 7, 253, 160, 28, - 7, 253, 159, 28, 7, 253, 158, 28, 7, 253, 157, 28, 7, 253, 156, 28, 7, - 253, 155, 28, 7, 253, 154, 28, 7, 253, 153, 28, 7, 253, 152, 28, 7, 253, - 151, 28, 7, 253, 150, 28, 7, 253, 149, 28, 7, 253, 148, 28, 7, 253, 147, - 28, 7, 253, 146, 28, 7, 253, 145, 28, 7, 253, 144, 28, 7, 253, 143, 28, - 7, 253, 142, 28, 7, 253, 141, 28, 7, 253, 140, 28, 7, 253, 139, 28, 7, - 253, 138, 28, 7, 253, 137, 28, 7, 253, 136, 28, 7, 253, 135, 28, 7, 253, - 134, 28, 7, 253, 133, 28, 7, 253, 132, 28, 7, 253, 131, 28, 7, 253, 130, - 28, 7, 253, 129, 28, 7, 253, 128, 28, 7, 253, 127, 28, 7, 253, 126, 28, - 7, 253, 125, 28, 7, 253, 124, 28, 7, 253, 123, 28, 7, 253, 122, 28, 7, - 253, 121, 28, 7, 253, 120, 28, 7, 253, 119, 28, 7, 253, 118, 28, 7, 253, - 117, 28, 7, 253, 116, 28, 7, 253, 115, 28, 7, 253, 114, 28, 7, 253, 113, - 28, 7, 253, 112, 28, 7, 253, 111, 28, 7, 253, 110, 28, 7, 253, 109, 28, - 7, 253, 108, 28, 7, 253, 107, 28, 7, 253, 106, 28, 7, 253, 105, 28, 7, - 253, 104, 28, 7, 253, 103, 28, 7, 253, 102, 28, 7, 253, 101, 28, 7, 253, - 100, 28, 7, 253, 99, 28, 7, 253, 98, 28, 7, 253, 97, 28, 7, 253, 96, 28, - 7, 253, 95, 28, 7, 253, 94, 28, 7, 253, 93, 28, 7, 253, 92, 28, 7, 253, - 91, 28, 7, 253, 90, 28, 7, 253, 89, 28, 7, 253, 88, 28, 7, 253, 87, 28, - 7, 253, 86, 28, 7, 253, 85, 28, 7, 253, 84, 28, 7, 253, 83, 28, 7, 253, - 82, 28, 7, 253, 81, 28, 7, 253, 80, 28, 7, 253, 79, 28, 7, 253, 78, 28, - 7, 253, 77, 28, 7, 253, 76, 28, 7, 253, 75, 28, 7, 253, 74, 28, 7, 253, - 73, 28, 7, 253, 72, 28, 7, 253, 71, 28, 7, 253, 70, 28, 7, 253, 69, 28, - 7, 253, 68, 28, 7, 253, 67, 28, 7, 253, 66, 28, 7, 253, 65, 28, 7, 253, - 64, 28, 7, 253, 63, 28, 7, 253, 62, 28, 7, 253, 61, 28, 7, 253, 60, 28, - 7, 253, 59, 28, 7, 253, 58, 28, 7, 253, 57, 28, 7, 253, 56, 28, 7, 253, - 55, 28, 7, 253, 54, 28, 7, 253, 53, 28, 7, 253, 52, 28, 7, 253, 51, 25, - 1, 212, 252, 217, 4, 219, 120, 25, 1, 212, 252, 234, 56, 235, 43, 25, 1, - 212, 252, 212, 94, 219, 121, 212, 167, 25, 1, 212, 252, 212, 94, 219, - 121, 212, 168, 25, 1, 212, 252, 217, 245, 219, 120, 25, 1, 212, 252, 206, - 146, 25, 1, 212, 252, 202, 56, 219, 120, 25, 1, 212, 252, 215, 55, 219, - 120, 25, 1, 212, 252, 206, 210, 213, 244, 216, 148, 25, 1, 212, 252, 212, - 94, 213, 244, 216, 149, 212, 167, 25, 1, 212, 252, 212, 94, 213, 244, - 216, 149, 212, 168, 25, 1, 212, 252, 220, 99, 25, 1, 212, 252, 201, 41, - 220, 100, 25, 1, 212, 252, 217, 65, 25, 1, 212, 252, 220, 96, 25, 1, 212, - 252, 220, 49, 25, 1, 212, 252, 218, 78, 25, 1, 212, 252, 207, 73, 25, 1, - 212, 252, 215, 195, 25, 1, 212, 252, 224, 165, 25, 1, 212, 252, 216, 115, - 25, 1, 212, 252, 204, 74, 25, 1, 212, 252, 217, 3, 25, 1, 212, 252, 222, - 230, 25, 1, 212, 252, 222, 137, 223, 145, 25, 1, 212, 252, 215, 205, 219, - 128, 25, 1, 212, 252, 220, 103, 25, 1, 212, 252, 213, 125, 25, 1, 212, - 252, 233, 211, 25, 1, 212, 252, 213, 195, 25, 1, 212, 252, 218, 216, 217, - 38, 25, 1, 212, 252, 215, 36, 219, 131, 25, 1, 212, 252, 118, 195, 187, - 217, 238, 25, 1, 212, 252, 233, 212, 25, 1, 212, 252, 215, 205, 215, 206, - 25, 1, 212, 252, 206, 32, 25, 1, 212, 252, 219, 113, 25, 1, 212, 252, - 219, 134, 25, 1, 212, 252, 218, 191, 25, 1, 212, 252, 225, 34, 25, 1, - 212, 252, 213, 244, 222, 185, 25, 1, 212, 252, 217, 160, 222, 185, 25, 1, - 212, 252, 213, 18, 25, 1, 212, 252, 220, 97, 25, 1, 212, 252, 216, 189, - 25, 1, 212, 252, 211, 206, 25, 1, 212, 252, 201, 33, 25, 1, 212, 252, - 221, 187, 25, 1, 212, 252, 205, 172, 25, 1, 212, 252, 202, 242, 25, 1, - 212, 252, 220, 94, 25, 1, 212, 252, 224, 172, 25, 1, 212, 252, 217, 156, - 25, 1, 212, 252, 223, 159, 25, 1, 212, 252, 218, 192, 25, 1, 212, 252, - 206, 142, 25, 1, 212, 252, 221, 241, 25, 1, 212, 252, 235, 114, 25, 1, - 212, 252, 209, 209, 25, 1, 212, 252, 223, 212, 25, 1, 212, 252, 205, 168, - 25, 1, 212, 252, 220, 44, 212, 210, 25, 1, 212, 252, 206, 203, 25, 1, - 212, 252, 215, 204, 25, 1, 212, 252, 206, 184, 215, 216, 195, 195, 25, 1, - 212, 252, 215, 77, 218, 212, 25, 1, 212, 252, 213, 239, 25, 1, 212, 252, - 216, 117, 25, 1, 212, 252, 200, 44, 25, 1, 212, 252, 217, 41, 25, 1, 212, - 252, 220, 93, 25, 1, 212, 252, 216, 160, 25, 1, 212, 252, 219, 236, 25, - 1, 212, 252, 215, 92, 25, 1, 212, 252, 202, 246, 25, 1, 212, 252, 205, - 165, 25, 1, 212, 252, 213, 240, 25, 1, 212, 252, 215, 220, 25, 1, 212, - 252, 220, 101, 25, 1, 212, 252, 215, 89, 25, 1, 212, 252, 224, 252, 25, - 1, 212, 252, 215, 223, 25, 1, 212, 252, 199, 113, 25, 1, 212, 252, 221, - 191, 25, 1, 212, 252, 217, 101, 25, 1, 212, 252, 217, 212, 25, 1, 212, - 252, 219, 235, 25, 1, 212, 251, 215, 218, 25, 1, 212, 251, 201, 41, 220, - 98, 25, 1, 212, 251, 206, 94, 25, 1, 212, 251, 207, 77, 201, 40, 25, 1, - 212, 251, 221, 243, 215, 201, 25, 1, 212, 251, 219, 242, 220, 102, 25, 1, - 212, 251, 224, 85, 25, 1, 212, 251, 196, 32, 25, 1, 212, 251, 219, 237, - 25, 1, 212, 251, 225, 20, 25, 1, 212, 251, 213, 75, 25, 1, 212, 251, 196, - 115, 222, 185, 25, 1, 212, 251, 222, 250, 215, 216, 215, 103, 25, 1, 212, - 251, 215, 198, 206, 229, 25, 1, 212, 251, 217, 127, 216, 163, 25, 1, 212, - 251, 233, 209, 25, 1, 212, 251, 212, 157, 25, 1, 212, 251, 201, 41, 215, - 214, 25, 1, 212, 251, 206, 234, 216, 158, 25, 1, 212, 251, 206, 230, 25, - 1, 212, 251, 219, 121, 202, 245, 25, 1, 212, 251, 219, 224, 219, 238, 25, - 1, 212, 251, 215, 90, 215, 201, 25, 1, 212, 251, 224, 161, 25, 1, 212, - 251, 233, 210, 25, 1, 212, 251, 224, 157, 25, 1, 212, 251, 223, 77, 25, - 1, 212, 251, 213, 128, 25, 1, 212, 251, 199, 42, 25, 1, 212, 251, 217, 5, - 218, 76, 25, 1, 212, 251, 217, 40, 219, 220, 25, 1, 212, 251, 196, 241, - 25, 1, 212, 251, 208, 247, 25, 1, 212, 251, 203, 158, 25, 1, 212, 251, - 219, 133, 25, 1, 212, 251, 217, 24, 25, 1, 212, 251, 217, 25, 222, 227, - 25, 1, 212, 251, 219, 123, 25, 1, 212, 251, 204, 127, 25, 1, 212, 251, - 219, 228, 25, 1, 212, 251, 218, 196, 25, 1, 212, 251, 215, 107, 25, 1, - 212, 251, 211, 210, 25, 1, 212, 251, 219, 132, 217, 42, 25, 1, 212, 251, - 235, 158, 25, 1, 212, 251, 219, 215, 25, 1, 212, 251, 235, 182, 25, 1, - 212, 251, 224, 169, 25, 1, 212, 251, 220, 128, 216, 152, 25, 1, 212, 251, - 220, 128, 216, 128, 25, 1, 212, 251, 222, 136, 25, 1, 212, 251, 217, 48, - 25, 1, 212, 251, 215, 225, 25, 1, 212, 251, 166, 25, 1, 212, 251, 224, - 68, 25, 1, 212, 251, 216, 249, 25, 1, 193, 217, 4, 220, 100, 25, 1, 193, - 215, 54, 25, 1, 193, 195, 195, 25, 1, 193, 197, 143, 25, 1, 193, 217, 41, - 25, 1, 193, 217, 148, 25, 1, 193, 217, 11, 25, 1, 193, 233, 219, 25, 1, - 193, 219, 232, 25, 1, 193, 234, 63, 25, 1, 193, 215, 79, 219, 4, 219, - 135, 25, 1, 193, 215, 192, 219, 223, 25, 1, 193, 219, 229, 25, 1, 193, - 212, 163, 25, 1, 193, 217, 133, 25, 1, 193, 219, 240, 247, 170, 25, 1, - 193, 224, 159, 25, 1, 193, 233, 220, 25, 1, 193, 224, 166, 25, 1, 193, - 195, 218, 218, 109, 25, 1, 193, 215, 48, 25, 1, 193, 219, 217, 25, 1, - 193, 215, 224, 25, 1, 193, 219, 223, 25, 1, 193, 196, 33, 25, 1, 193, - 223, 220, 25, 1, 193, 225, 55, 25, 1, 193, 207, 72, 25, 1, 193, 217, 142, - 25, 1, 193, 203, 156, 25, 1, 193, 216, 132, 25, 1, 193, 202, 56, 195, - 199, 25, 1, 193, 204, 159, 25, 1, 193, 217, 31, 215, 103, 25, 1, 193, - 199, 41, 25, 1, 193, 217, 215, 25, 1, 193, 220, 128, 224, 168, 25, 1, - 193, 215, 206, 25, 1, 193, 217, 26, 25, 1, 193, 222, 231, 25, 1, 193, - 219, 225, 25, 1, 193, 219, 112, 25, 1, 193, 215, 200, 25, 1, 193, 202, - 241, 25, 1, 193, 217, 28, 25, 1, 193, 234, 221, 25, 1, 193, 217, 147, 25, - 1, 193, 215, 226, 25, 1, 193, 215, 222, 25, 1, 193, 247, 253, 25, 1, 193, - 199, 43, 25, 1, 193, 219, 230, 25, 1, 193, 209, 140, 25, 1, 193, 216, - 162, 25, 1, 193, 222, 249, 25, 1, 193, 202, 53, 25, 1, 193, 215, 208, - 216, 249, 25, 1, 193, 216, 154, 25, 1, 193, 224, 172, 25, 1, 193, 217, - 33, 25, 1, 193, 220, 93, 25, 1, 193, 219, 218, 25, 1, 193, 221, 191, 25, - 1, 193, 223, 145, 25, 1, 193, 216, 160, 25, 1, 193, 216, 249, 25, 1, 193, - 196, 231, 25, 1, 193, 217, 29, 25, 1, 193, 215, 211, 25, 1, 193, 215, - 202, 25, 1, 193, 223, 161, 216, 117, 25, 1, 193, 215, 209, 25, 1, 193, - 217, 155, 25, 1, 193, 220, 128, 215, 214, 25, 1, 193, 196, 129, 25, 1, - 193, 217, 154, 25, 1, 193, 206, 145, 25, 1, 193, 207, 75, 25, 1, 193, - 219, 226, 25, 1, 193, 220, 100, 25, 1, 193, 219, 236, 25, 1, 193, 224, - 160, 25, 1, 193, 219, 227, 25, 1, 193, 224, 164, 25, 1, 193, 219, 240, - 212, 215, 25, 1, 193, 195, 178, 25, 1, 193, 216, 150, 25, 1, 193, 219, - 59, 25, 1, 193, 218, 139, 25, 1, 193, 206, 206, 25, 1, 193, 224, 183, - 222, 209, 25, 1, 193, 224, 183, 235, 195, 25, 1, 193, 217, 63, 25, 1, - 193, 217, 212, 25, 1, 193, 222, 57, 25, 1, 193, 212, 176, 25, 1, 193, - 213, 65, 25, 1, 193, 203, 1, 25, 1, 148, 219, 216, 25, 1, 148, 197, 141, - 25, 1, 148, 216, 148, 25, 1, 148, 219, 120, 25, 1, 148, 216, 146, 25, 1, - 148, 222, 102, 25, 1, 148, 216, 151, 25, 1, 148, 215, 221, 25, 1, 148, - 217, 47, 25, 1, 148, 215, 103, 25, 1, 148, 196, 242, 25, 1, 148, 217, 1, - 25, 1, 148, 206, 253, 25, 1, 148, 217, 12, 25, 1, 148, 224, 167, 25, 1, - 148, 202, 243, 25, 1, 148, 206, 232, 25, 1, 148, 216, 159, 25, 1, 148, - 204, 127, 25, 1, 148, 224, 172, 25, 1, 148, 196, 117, 25, 1, 148, 223, - 162, 25, 1, 148, 208, 207, 25, 1, 148, 219, 125, 25, 1, 148, 217, 146, - 25, 1, 148, 220, 65, 25, 1, 148, 219, 131, 25, 1, 148, 207, 74, 25, 1, - 148, 196, 59, 25, 1, 148, 216, 153, 25, 1, 148, 224, 163, 219, 219, 25, - 1, 148, 217, 8, 25, 1, 148, 201, 40, 25, 1, 148, 233, 229, 25, 1, 148, - 216, 254, 25, 1, 148, 235, 159, 25, 1, 148, 217, 150, 25, 1, 148, 219, - 104, 25, 1, 148, 222, 130, 25, 1, 148, 217, 132, 25, 1, 148, 218, 211, - 25, 1, 148, 219, 108, 25, 1, 148, 211, 190, 25, 1, 148, 219, 106, 25, 1, - 148, 219, 122, 25, 1, 148, 221, 174, 25, 1, 148, 215, 213, 25, 1, 148, - 219, 239, 25, 1, 148, 223, 134, 25, 1, 148, 215, 92, 25, 1, 148, 202, - 246, 25, 1, 148, 205, 165, 25, 1, 148, 195, 178, 25, 1, 148, 224, 164, - 25, 1, 148, 210, 228, 25, 1, 148, 203, 47, 25, 1, 148, 217, 9, 25, 1, - 148, 219, 127, 25, 1, 148, 215, 212, 25, 1, 148, 224, 162, 25, 1, 148, - 212, 169, 25, 1, 148, 213, 11, 25, 1, 148, 215, 65, 25, 1, 148, 222, 136, - 25, 1, 148, 217, 48, 25, 1, 148, 219, 124, 25, 1, 148, 217, 21, 25, 1, - 148, 195, 192, 25, 1, 148, 213, 163, 25, 1, 148, 195, 191, 25, 1, 148, - 217, 155, 25, 1, 148, 215, 201, 25, 1, 148, 204, 161, 25, 1, 148, 223, - 166, 25, 1, 148, 217, 37, 25, 1, 148, 217, 6, 25, 1, 148, 201, 15, 25, 1, - 148, 219, 135, 25, 1, 148, 223, 156, 25, 1, 148, 215, 210, 25, 1, 148, - 202, 244, 25, 1, 148, 220, 95, 25, 1, 148, 217, 46, 25, 1, 148, 222, 129, - 25, 1, 148, 217, 27, 25, 1, 148, 215, 215, 25, 1, 148, 216, 132, 25, 1, - 148, 233, 213, 25, 1, 148, 223, 187, 25, 1, 148, 210, 127, 214, 133, 25, - 1, 148, 203, 145, 25, 1, 148, 201, 239, 25, 1, 148, 215, 89, 25, 1, 148, - 210, 9, 25, 1, 148, 222, 187, 25, 1, 148, 219, 187, 25, 1, 148, 221, 136, - 25, 1, 148, 204, 74, 25, 1, 148, 218, 145, 25, 1, 148, 206, 218, 25, 1, - 148, 206, 228, 25, 1, 148, 223, 106, 25, 1, 148, 215, 186, 25, 1, 148, - 206, 151, 25, 1, 148, 215, 203, 25, 1, 148, 213, 79, 25, 1, 148, 216, - 223, 25, 1, 148, 206, 183, 25, 1, 148, 211, 205, 25, 1, 148, 218, 76, 25, - 1, 148, 221, 221, 25, 1, 148, 210, 127, 218, 134, 25, 1, 148, 202, 122, - 25, 1, 148, 215, 189, 25, 1, 148, 219, 240, 178, 25, 1, 148, 208, 205, - 25, 1, 148, 235, 238, 25, 1, 104, 217, 154, 25, 1, 104, 201, 245, 25, 1, - 104, 219, 229, 25, 1, 104, 222, 231, 25, 1, 104, 198, 235, 25, 1, 104, - 221, 227, 25, 1, 104, 213, 243, 25, 1, 104, 205, 176, 25, 1, 104, 210, - 202, 25, 1, 104, 215, 217, 25, 1, 104, 217, 125, 25, 1, 104, 211, 223, - 25, 1, 104, 203, 117, 25, 1, 104, 217, 14, 25, 1, 104, 223, 216, 25, 1, - 104, 196, 234, 25, 1, 104, 208, 129, 25, 1, 104, 217, 38, 25, 1, 104, - 213, 240, 25, 1, 104, 201, 247, 25, 1, 104, 223, 160, 25, 1, 104, 221, - 242, 25, 1, 104, 215, 220, 25, 1, 104, 216, 246, 25, 1, 104, 220, 101, - 25, 1, 104, 217, 7, 25, 1, 104, 216, 245, 25, 1, 104, 215, 219, 25, 1, - 104, 210, 6, 25, 1, 104, 216, 150, 25, 1, 104, 213, 77, 25, 1, 104, 209, - 13, 25, 1, 104, 217, 22, 25, 1, 104, 219, 114, 25, 1, 104, 233, 207, 25, - 1, 104, 217, 10, 25, 1, 104, 216, 161, 25, 1, 104, 220, 43, 25, 1, 104, - 221, 223, 25, 1, 104, 217, 43, 25, 1, 104, 217, 138, 25, 1, 104, 203, - 144, 215, 201, 25, 1, 104, 207, 76, 25, 1, 104, 211, 216, 25, 1, 104, - 217, 158, 205, 184, 25, 1, 104, 217, 30, 215, 103, 25, 1, 104, 196, 20, - 25, 1, 104, 233, 208, 25, 1, 104, 201, 34, 25, 1, 104, 196, 36, 25, 1, - 104, 212, 117, 25, 1, 104, 201, 21, 25, 1, 104, 224, 170, 25, 1, 104, - 204, 160, 25, 1, 104, 202, 245, 25, 1, 104, 199, 44, 25, 1, 104, 197, 84, - 25, 1, 104, 223, 80, 25, 1, 104, 211, 227, 25, 1, 104, 203, 157, 25, 1, - 104, 233, 228, 25, 1, 104, 217, 53, 25, 1, 104, 206, 231, 25, 1, 104, - 219, 109, 25, 1, 104, 219, 233, 25, 1, 104, 215, 52, 25, 1, 104, 216, - 113, 25, 1, 104, 234, 59, 25, 1, 104, 201, 22, 25, 1, 104, 223, 170, 25, - 1, 104, 196, 93, 25, 1, 104, 215, 90, 244, 220, 25, 1, 104, 196, 9, 25, - 1, 104, 219, 126, 25, 1, 104, 217, 143, 25, 1, 104, 212, 211, 25, 1, 104, - 195, 198, 25, 1, 104, 222, 131, 25, 1, 104, 234, 221, 25, 1, 104, 234, - 58, 25, 1, 104, 217, 0, 25, 1, 104, 224, 172, 25, 1, 104, 220, 104, 25, - 1, 104, 217, 13, 25, 1, 104, 233, 214, 25, 1, 104, 235, 239, 25, 1, 104, - 215, 190, 25, 1, 104, 213, 12, 25, 1, 104, 196, 34, 25, 1, 104, 217, 39, - 25, 1, 104, 215, 90, 248, 203, 25, 1, 104, 215, 32, 25, 1, 104, 212, 89, - 25, 1, 104, 219, 59, 25, 1, 104, 234, 219, 25, 1, 104, 217, 238, 25, 1, - 104, 218, 139, 25, 1, 104, 233, 213, 25, 1, 104, 234, 224, 68, 25, 1, - 104, 218, 77, 25, 1, 104, 211, 222, 25, 1, 104, 217, 2, 25, 1, 104, 223, - 145, 25, 1, 104, 212, 208, 25, 1, 104, 215, 204, 25, 1, 104, 196, 35, 25, - 1, 104, 217, 23, 25, 1, 104, 213, 244, 213, 51, 25, 1, 104, 234, 224, - 247, 152, 25, 1, 104, 235, 44, 25, 1, 104, 216, 155, 25, 1, 104, 63, 25, - 1, 104, 201, 239, 25, 1, 104, 72, 25, 1, 104, 68, 25, 1, 104, 222, 229, - 25, 1, 104, 213, 244, 212, 126, 25, 1, 104, 203, 162, 25, 1, 104, 203, - 102, 25, 1, 104, 217, 158, 218, 64, 231, 87, 25, 1, 104, 206, 206, 25, 1, - 104, 196, 31, 25, 1, 104, 216, 239, 25, 1, 104, 195, 203, 25, 1, 104, - 195, 235, 204, 53, 25, 1, 104, 195, 235, 241, 86, 25, 1, 104, 195, 186, - 25, 1, 104, 195, 194, 25, 1, 104, 224, 158, 25, 1, 104, 213, 10, 25, 1, - 104, 216, 156, 236, 176, 25, 1, 104, 211, 218, 25, 1, 104, 196, 240, 25, - 1, 104, 235, 182, 25, 1, 104, 199, 113, 25, 1, 104, 221, 191, 25, 1, 104, - 219, 78, 25, 1, 104, 210, 91, 25, 1, 104, 210, 229, 25, 1, 104, 216, 238, - 25, 1, 104, 217, 71, 25, 1, 104, 206, 198, 25, 1, 104, 206, 183, 25, 1, - 104, 234, 224, 210, 130, 25, 1, 104, 176, 25, 1, 104, 212, 220, 25, 1, - 104, 221, 221, 25, 1, 104, 224, 11, 25, 1, 104, 219, 164, 25, 1, 104, - 166, 25, 1, 104, 220, 40, 25, 1, 104, 202, 247, 25, 1, 104, 224, 101, 25, - 1, 104, 218, 215, 25, 1, 104, 203, 23, 25, 1, 104, 235, 206, 25, 1, 104, - 233, 201, 25, 1, 212, 250, 155, 25, 1, 212, 250, 66, 25, 1, 212, 250, - 223, 187, 25, 1, 212, 250, 237, 54, 25, 1, 212, 250, 210, 155, 25, 1, - 212, 250, 203, 145, 25, 1, 212, 250, 215, 89, 25, 1, 212, 250, 172, 25, - 1, 212, 250, 210, 9, 25, 1, 212, 250, 210, 57, 25, 1, 212, 250, 219, 187, - 25, 1, 212, 250, 203, 162, 25, 1, 212, 250, 217, 157, 25, 1, 212, 250, - 216, 162, 25, 1, 212, 250, 221, 136, 25, 1, 212, 250, 204, 74, 25, 1, - 212, 250, 206, 218, 25, 1, 212, 250, 206, 112, 25, 1, 212, 250, 207, 72, - 25, 1, 212, 250, 223, 106, 25, 1, 212, 250, 224, 172, 25, 1, 212, 250, - 215, 154, 25, 1, 212, 250, 215, 186, 25, 1, 212, 250, 216, 133, 25, 1, - 212, 250, 195, 234, 25, 1, 212, 250, 206, 151, 25, 1, 212, 250, 164, 25, - 1, 212, 250, 215, 223, 25, 1, 212, 250, 213, 10, 25, 1, 212, 250, 215, - 203, 25, 1, 212, 250, 196, 240, 25, 1, 212, 250, 213, 79, 25, 1, 212, - 250, 209, 140, 25, 1, 212, 250, 216, 223, 25, 1, 212, 250, 210, 91, 25, - 1, 212, 250, 224, 182, 25, 1, 212, 250, 216, 255, 25, 1, 212, 250, 217, - 50, 25, 1, 212, 250, 206, 198, 25, 1, 212, 250, 211, 223, 25, 1, 212, - 250, 235, 44, 25, 1, 212, 250, 197, 166, 25, 1, 212, 250, 222, 109, 25, - 1, 212, 250, 221, 221, 25, 1, 212, 250, 224, 11, 25, 1, 212, 250, 219, - 231, 25, 1, 212, 250, 210, 126, 25, 1, 212, 250, 166, 25, 1, 212, 250, - 218, 251, 25, 1, 212, 250, 219, 239, 25, 1, 212, 250, 203, 1, 25, 1, 212, - 250, 223, 223, 25, 1, 212, 250, 208, 227, 25, 1, 212, 250, 197, 219, 218, - 149, 1, 189, 218, 149, 1, 217, 19, 218, 149, 1, 196, 3, 218, 149, 1, 219, - 25, 218, 149, 1, 249, 145, 218, 149, 1, 240, 136, 218, 149, 1, 63, 218, - 149, 1, 212, 246, 218, 149, 1, 224, 141, 218, 149, 1, 232, 178, 218, 149, - 1, 240, 111, 218, 149, 1, 245, 30, 218, 149, 1, 224, 202, 218, 149, 1, - 214, 134, 218, 149, 1, 220, 101, 218, 149, 1, 216, 183, 218, 149, 1, 161, - 218, 149, 1, 214, 102, 218, 149, 1, 72, 218, 149, 1, 209, 232, 218, 149, - 1, 206, 223, 218, 149, 1, 202, 216, 218, 149, 1, 237, 82, 218, 149, 1, - 197, 166, 218, 149, 1, 69, 218, 149, 1, 224, 11, 218, 149, 1, 222, 238, - 218, 149, 1, 172, 218, 149, 1, 232, 235, 218, 149, 1, 210, 72, 218, 149, - 1, 203, 37, 218, 149, 17, 195, 79, 218, 149, 17, 100, 218, 149, 17, 102, - 218, 149, 17, 134, 218, 149, 17, 136, 218, 149, 17, 146, 218, 149, 17, - 167, 218, 149, 17, 178, 218, 149, 17, 171, 218, 149, 17, 182, 218, 149, - 240, 88, 218, 149, 52, 240, 88, 249, 59, 199, 149, 1, 236, 211, 249, 59, - 199, 149, 1, 155, 249, 59, 199, 149, 1, 208, 147, 249, 59, 199, 149, 1, - 235, 239, 249, 59, 199, 149, 1, 219, 234, 249, 59, 199, 149, 1, 196, 21, - 249, 59, 199, 149, 1, 234, 108, 249, 59, 199, 149, 1, 239, 157, 249, 59, - 199, 149, 1, 223, 222, 249, 59, 199, 149, 1, 225, 129, 249, 59, 199, 149, - 1, 231, 42, 249, 59, 199, 149, 1, 197, 166, 249, 59, 199, 149, 1, 195, - 11, 249, 59, 199, 149, 1, 234, 52, 249, 59, 199, 149, 1, 239, 28, 249, - 59, 199, 149, 1, 247, 57, 249, 59, 199, 149, 1, 199, 238, 249, 59, 199, - 149, 1, 149, 249, 59, 199, 149, 1, 249, 145, 249, 59, 199, 149, 1, 197, - 220, 249, 59, 199, 149, 1, 196, 63, 249, 59, 199, 149, 1, 161, 249, 59, - 199, 149, 1, 197, 158, 249, 59, 199, 149, 1, 63, 249, 59, 199, 149, 1, - 72, 249, 59, 199, 149, 1, 214, 102, 249, 59, 199, 149, 1, 66, 249, 59, - 199, 149, 1, 237, 54, 249, 59, 199, 149, 1, 69, 249, 59, 199, 149, 1, 68, - 249, 59, 199, 149, 38, 130, 202, 11, 249, 59, 199, 149, 38, 126, 202, 11, - 249, 59, 199, 149, 38, 219, 65, 202, 11, 249, 59, 199, 149, 38, 221, 205, - 202, 11, 249, 59, 199, 149, 38, 232, 46, 202, 11, 249, 59, 199, 149, 234, - 217, 204, 226, 133, 86, 18, 224, 199, 133, 86, 18, 224, 195, 133, 86, 18, - 224, 90, 133, 86, 18, 224, 53, 133, 86, 18, 224, 227, 133, 86, 18, 224, - 224, 133, 86, 18, 223, 171, 133, 86, 18, 223, 142, 133, 86, 18, 224, 201, - 133, 86, 18, 224, 156, 133, 86, 18, 225, 30, 133, 86, 18, 225, 27, 133, - 86, 18, 223, 241, 133, 86, 18, 223, 238, 133, 86, 18, 224, 220, 133, 86, - 18, 224, 218, 133, 86, 18, 223, 173, 133, 86, 18, 223, 172, 133, 86, 18, - 224, 4, 133, 86, 18, 223, 227, 133, 86, 18, 224, 92, 133, 86, 18, 224, - 91, 133, 86, 18, 225, 45, 133, 86, 18, 224, 223, 133, 86, 18, 223, 132, - 133, 86, 18, 223, 123, 133, 86, 18, 225, 54, 133, 86, 18, 225, 46, 133, - 86, 108, 199, 124, 133, 86, 108, 215, 193, 133, 86, 108, 222, 215, 133, - 86, 108, 232, 158, 133, 86, 108, 216, 89, 133, 86, 108, 210, 193, 133, - 86, 108, 216, 116, 133, 86, 108, 211, 133, 133, 86, 108, 196, 80, 133, - 86, 108, 232, 22, 133, 86, 108, 219, 255, 133, 86, 108, 245, 107, 133, - 86, 108, 217, 162, 133, 86, 108, 231, 214, 133, 86, 108, 212, 134, 133, - 86, 108, 215, 199, 133, 86, 108, 217, 202, 133, 86, 108, 250, 150, 133, - 86, 108, 196, 204, 133, 86, 108, 247, 90, 133, 86, 117, 244, 255, 201, - 31, 133, 86, 117, 244, 255, 205, 200, 133, 86, 117, 244, 255, 224, 174, - 133, 86, 117, 244, 255, 224, 132, 133, 86, 117, 244, 255, 204, 158, 133, - 86, 117, 244, 255, 231, 172, 133, 86, 117, 244, 255, 203, 88, 133, 86, 2, - 198, 230, 202, 166, 133, 86, 2, 198, 230, 201, 102, 247, 48, 133, 86, 2, - 244, 255, 245, 96, 133, 86, 2, 198, 230, 202, 194, 133, 86, 2, 198, 230, - 235, 179, 133, 86, 2, 196, 160, 215, 187, 133, 86, 2, 196, 160, 210, 74, - 133, 86, 2, 196, 160, 201, 222, 133, 86, 2, 196, 160, 235, 220, 133, 86, - 2, 198, 230, 208, 123, 133, 86, 2, 219, 186, 204, 162, 133, 86, 2, 198, - 230, 215, 239, 133, 86, 2, 230, 206, 196, 100, 133, 86, 2, 196, 203, 133, - 86, 2, 244, 255, 201, 89, 209, 215, 133, 86, 17, 195, 79, 133, 86, 17, - 100, 133, 86, 17, 102, 133, 86, 17, 134, 133, 86, 17, 136, 133, 86, 17, - 146, 133, 86, 17, 167, 133, 86, 17, 178, 133, 86, 17, 171, 133, 86, 17, - 182, 133, 86, 31, 203, 18, 133, 86, 31, 231, 55, 133, 86, 31, 203, 24, - 202, 157, 133, 86, 31, 219, 26, 133, 86, 31, 231, 58, 219, 26, 133, 86, - 31, 203, 24, 248, 165, 133, 86, 31, 201, 167, 133, 86, 2, 198, 230, 221, - 186, 133, 86, 2, 196, 157, 133, 86, 2, 232, 17, 133, 86, 2, 202, 183, - 232, 17, 133, 86, 2, 194, 240, 202, 227, 133, 86, 2, 231, 198, 133, 86, - 2, 215, 253, 133, 86, 2, 196, 195, 133, 86, 2, 215, 191, 133, 86, 2, 250, - 133, 133, 86, 2, 200, 209, 247, 47, 133, 86, 2, 219, 186, 201, 105, 133, - 86, 2, 203, 89, 133, 86, 2, 221, 218, 133, 86, 2, 218, 95, 133, 86, 2, - 244, 255, 232, 231, 221, 164, 215, 197, 215, 196, 133, 86, 2, 244, 255, - 241, 40, 201, 96, 133, 86, 2, 244, 255, 200, 207, 133, 86, 2, 244, 255, - 200, 208, 245, 18, 133, 86, 2, 244, 255, 211, 221, 240, 56, 133, 86, 2, - 244, 255, 215, 246, 201, 230, 133, 86, 244, 227, 2, 201, 100, 133, 86, - 244, 227, 2, 196, 65, 133, 86, 244, 227, 2, 222, 54, 133, 86, 244, 227, - 2, 222, 213, 133, 86, 244, 227, 2, 196, 156, 133, 86, 244, 227, 2, 223, - 242, 133, 86, 244, 227, 2, 232, 155, 133, 86, 244, 227, 2, 218, 137, 133, - 86, 244, 227, 2, 202, 167, 133, 86, 244, 227, 2, 201, 110, 133, 86, 244, - 227, 2, 213, 3, 133, 86, 244, 227, 2, 224, 144, 133, 86, 244, 227, 2, - 232, 219, 133, 86, 244, 227, 2, 199, 146, 133, 86, 244, 227, 2, 235, 216, - 133, 86, 244, 227, 2, 196, 107, 133, 86, 244, 227, 2, 201, 83, 133, 86, - 244, 227, 2, 223, 127, 133, 86, 244, 227, 2, 197, 208, 219, 195, 6, 1, - 221, 136, 219, 195, 6, 1, 209, 80, 219, 195, 6, 1, 199, 230, 219, 195, 6, - 1, 197, 199, 219, 195, 6, 1, 250, 162, 219, 195, 6, 1, 195, 158, 219, - 195, 6, 1, 223, 224, 219, 195, 6, 1, 214, 3, 219, 195, 6, 1, 203, 216, - 219, 195, 6, 1, 234, 190, 219, 195, 6, 1, 236, 49, 219, 195, 6, 1, 68, - 219, 195, 6, 1, 225, 80, 219, 195, 6, 1, 63, 219, 195, 6, 1, 225, 217, - 219, 195, 6, 1, 69, 219, 195, 6, 1, 250, 112, 219, 195, 6, 1, 247, 207, - 219, 195, 6, 1, 66, 219, 195, 6, 1, 195, 217, 219, 195, 6, 1, 159, 219, - 195, 6, 1, 211, 167, 219, 195, 6, 1, 231, 84, 219, 195, 6, 1, 215, 111, - 219, 195, 6, 1, 196, 222, 219, 195, 6, 1, 240, 231, 219, 195, 6, 1, 214, - 164, 219, 195, 6, 1, 218, 55, 219, 195, 6, 1, 144, 219, 195, 6, 1, 72, - 219, 195, 6, 1, 251, 200, 219, 195, 6, 1, 196, 148, 219, 195, 4, 1, 221, - 136, 219, 195, 4, 1, 209, 80, 219, 195, 4, 1, 199, 230, 219, 195, 4, 1, - 197, 199, 219, 195, 4, 1, 250, 162, 219, 195, 4, 1, 195, 158, 219, 195, - 4, 1, 223, 224, 219, 195, 4, 1, 214, 3, 219, 195, 4, 1, 203, 216, 219, - 195, 4, 1, 234, 190, 219, 195, 4, 1, 236, 49, 219, 195, 4, 1, 68, 219, - 195, 4, 1, 225, 80, 219, 195, 4, 1, 63, 219, 195, 4, 1, 225, 217, 219, - 195, 4, 1, 69, 219, 195, 4, 1, 250, 112, 219, 195, 4, 1, 247, 207, 219, - 195, 4, 1, 66, 219, 195, 4, 1, 195, 217, 219, 195, 4, 1, 159, 219, 195, - 4, 1, 211, 167, 219, 195, 4, 1, 231, 84, 219, 195, 4, 1, 215, 111, 219, - 195, 4, 1, 196, 222, 219, 195, 4, 1, 240, 231, 219, 195, 4, 1, 214, 164, - 219, 195, 4, 1, 218, 55, 219, 195, 4, 1, 144, 219, 195, 4, 1, 72, 219, - 195, 4, 1, 251, 200, 219, 195, 4, 1, 196, 148, 219, 195, 17, 195, 79, - 219, 195, 17, 100, 219, 195, 17, 102, 219, 195, 17, 134, 219, 195, 17, - 136, 219, 195, 17, 146, 219, 195, 17, 167, 219, 195, 17, 178, 219, 195, - 17, 171, 219, 195, 17, 182, 219, 195, 31, 203, 23, 219, 195, 31, 236, - 252, 219, 195, 31, 200, 239, 219, 195, 31, 202, 179, 219, 195, 31, 235, - 1, 219, 195, 31, 235, 149, 219, 195, 31, 206, 23, 219, 195, 31, 207, 68, - 219, 195, 31, 237, 28, 219, 195, 31, 216, 176, 219, 195, 17, 97, 251, - 131, 20, 219, 195, 17, 99, 251, 131, 20, 219, 195, 17, 115, 251, 131, 20, - 219, 195, 244, 159, 219, 195, 234, 217, 204, 226, 219, 195, 16, 251, 185, - 219, 195, 236, 90, 214, 149, 109, 1, 161, 109, 1, 249, 145, 109, 1, 11, - 161, 109, 1, 212, 150, 109, 1, 166, 109, 1, 219, 81, 109, 1, 250, 251, - 166, 109, 1, 235, 239, 109, 1, 199, 152, 109, 1, 199, 36, 109, 1, 189, - 109, 1, 240, 136, 109, 1, 11, 201, 78, 109, 1, 11, 189, 109, 1, 201, 78, - 109, 1, 240, 41, 109, 1, 176, 109, 1, 216, 227, 109, 1, 11, 216, 86, 109, - 1, 250, 251, 176, 109, 1, 216, 86, 109, 1, 216, 72, 109, 1, 172, 109, 1, - 221, 150, 109, 1, 222, 122, 109, 1, 222, 111, 109, 1, 202, 44, 109, 1, - 239, 37, 109, 1, 202, 36, 109, 1, 239, 36, 109, 1, 155, 109, 1, 234, 123, - 109, 1, 11, 155, 109, 1, 211, 159, 109, 1, 211, 136, 109, 1, 217, 71, - 109, 1, 217, 20, 109, 1, 250, 251, 217, 71, 109, 1, 142, 109, 1, 196, - 208, 109, 1, 233, 230, 109, 1, 233, 205, 109, 1, 201, 88, 109, 1, 237, - 139, 109, 1, 215, 109, 109, 1, 215, 91, 109, 1, 201, 103, 109, 1, 237, - 150, 109, 1, 11, 201, 103, 109, 1, 11, 237, 150, 109, 1, 210, 153, 201, - 103, 109, 1, 207, 50, 109, 1, 205, 80, 109, 1, 195, 74, 109, 1, 195, 1, - 109, 1, 201, 113, 109, 1, 237, 156, 109, 1, 11, 201, 113, 109, 1, 183, - 109, 1, 195, 115, 109, 1, 195, 2, 109, 1, 194, 228, 109, 1, 194, 208, - 109, 1, 250, 251, 194, 228, 109, 1, 194, 200, 109, 1, 194, 207, 109, 1, - 197, 166, 109, 1, 251, 209, 109, 1, 232, 80, 109, 1, 248, 43, 109, 1, - 204, 42, 109, 1, 237, 140, 109, 1, 203, 68, 109, 1, 201, 107, 109, 1, - 209, 143, 109, 2, 108, 73, 154, 109, 1, 217, 207, 109, 2, 250, 185, 109, - 2, 210, 153, 198, 242, 109, 2, 210, 153, 250, 185, 109, 18, 2, 63, 109, - 18, 2, 252, 168, 109, 18, 2, 251, 205, 109, 18, 2, 251, 106, 109, 18, 2, - 251, 97, 109, 18, 2, 72, 109, 18, 2, 214, 102, 109, 18, 2, 197, 34, 109, - 18, 2, 197, 199, 109, 18, 2, 69, 109, 18, 2, 236, 230, 109, 18, 2, 236, - 215, 109, 18, 2, 214, 160, 109, 18, 2, 68, 109, 18, 2, 230, 210, 109, 18, - 2, 230, 209, 109, 18, 2, 230, 208, 109, 18, 2, 226, 12, 109, 18, 2, 226, - 147, 109, 18, 2, 226, 120, 109, 18, 2, 225, 230, 109, 18, 2, 226, 60, - 109, 18, 2, 66, 109, 18, 2, 200, 114, 109, 18, 2, 200, 113, 109, 18, 2, - 200, 112, 109, 18, 2, 199, 245, 109, 18, 2, 200, 96, 109, 18, 2, 200, 56, - 109, 18, 2, 196, 148, 109, 18, 2, 196, 24, 109, 18, 2, 251, 245, 109, 18, - 2, 251, 241, 109, 18, 2, 236, 155, 109, 18, 2, 209, 185, 236, 155, 109, - 18, 2, 236, 163, 109, 18, 2, 209, 185, 236, 163, 109, 18, 2, 251, 200, - 109, 18, 2, 237, 33, 109, 18, 2, 250, 150, 109, 18, 2, 214, 39, 109, 18, - 2, 218, 55, 109, 18, 2, 217, 73, 109, 18, 2, 200, 40, 109, 18, 2, 195, - 197, 109, 18, 2, 214, 154, 109, 18, 2, 214, 161, 109, 18, 2, 197, 210, - 109, 18, 2, 226, 125, 109, 18, 2, 237, 82, 109, 18, 2, 226, 10, 109, 18, - 2, 200, 90, 109, 152, 210, 22, 109, 152, 201, 243, 210, 22, 109, 152, 57, - 109, 152, 60, 109, 1, 202, 9, 109, 1, 202, 8, 109, 1, 202, 7, 109, 1, - 202, 6, 109, 1, 202, 5, 109, 1, 202, 4, 109, 1, 202, 3, 109, 1, 210, 153, - 202, 10, 109, 1, 210, 153, 202, 9, 109, 1, 210, 153, 202, 7, 109, 1, 210, - 153, 202, 6, 109, 1, 210, 153, 202, 5, 109, 1, 210, 153, 202, 3, 19, 225, - 232, 78, 43, 225, 232, 78, 37, 245, 61, 231, 165, 78, 37, 245, 61, 225, - 232, 78, 19, 244, 148, 19, 244, 147, 19, 244, 146, 19, 244, 145, 19, 244, - 144, 19, 244, 143, 19, 244, 142, 19, 244, 141, 19, 244, 140, 19, 244, - 139, 19, 244, 138, 19, 244, 137, 19, 244, 136, 19, 244, 135, 19, 244, - 134, 19, 244, 133, 19, 244, 132, 19, 244, 131, 19, 244, 130, 19, 244, - 129, 19, 244, 128, 19, 244, 127, 19, 244, 126, 19, 244, 125, 19, 244, - 124, 19, 244, 123, 19, 244, 122, 19, 244, 121, 19, 244, 120, 19, 244, - 119, 19, 244, 118, 19, 244, 117, 19, 244, 116, 19, 244, 115, 19, 244, - 114, 19, 244, 113, 19, 244, 112, 19, 244, 111, 19, 244, 110, 19, 244, - 109, 19, 244, 108, 19, 244, 107, 19, 244, 106, 19, 244, 105, 19, 244, - 104, 19, 244, 103, 19, 244, 102, 19, 244, 101, 19, 244, 100, 19, 244, 99, - 19, 244, 98, 19, 244, 97, 19, 244, 96, 19, 244, 95, 19, 244, 94, 19, 244, - 93, 19, 244, 92, 19, 244, 91, 19, 244, 90, 19, 244, 89, 19, 244, 88, 19, - 244, 87, 19, 244, 86, 19, 244, 85, 19, 244, 84, 19, 244, 83, 19, 244, 82, - 19, 244, 81, 19, 244, 80, 19, 244, 79, 19, 244, 78, 19, 244, 77, 19, 244, - 76, 19, 244, 75, 19, 244, 74, 19, 244, 73, 19, 244, 72, 19, 244, 71, 19, - 244, 70, 19, 244, 69, 19, 244, 68, 19, 244, 67, 19, 244, 66, 19, 244, 65, - 19, 244, 64, 19, 244, 63, 19, 244, 62, 19, 244, 61, 19, 244, 60, 19, 244, - 59, 19, 244, 58, 19, 244, 57, 19, 244, 56, 19, 244, 55, 19, 244, 54, 19, - 244, 53, 19, 244, 52, 19, 244, 51, 19, 244, 50, 19, 244, 49, 19, 244, 48, - 19, 244, 47, 19, 244, 46, 19, 244, 45, 19, 244, 44, 19, 244, 43, 19, 244, - 42, 19, 244, 41, 19, 244, 40, 19, 244, 39, 19, 244, 38, 19, 244, 37, 19, - 244, 36, 19, 244, 35, 19, 244, 34, 19, 244, 33, 19, 244, 32, 19, 244, 31, - 19, 244, 30, 19, 244, 29, 19, 244, 28, 19, 244, 27, 19, 244, 26, 19, 244, - 25, 19, 244, 24, 19, 244, 23, 19, 244, 22, 19, 244, 21, 19, 244, 20, 19, - 244, 19, 19, 244, 18, 19, 244, 17, 19, 244, 16, 19, 244, 15, 19, 244, 14, - 19, 244, 13, 19, 244, 12, 19, 244, 11, 19, 244, 10, 19, 244, 9, 19, 244, - 8, 19, 244, 7, 19, 244, 6, 19, 244, 5, 19, 244, 4, 19, 244, 3, 19, 244, - 2, 19, 244, 1, 19, 244, 0, 19, 243, 255, 19, 243, 254, 19, 243, 253, 19, - 243, 252, 19, 243, 251, 19, 243, 250, 19, 243, 249, 19, 243, 248, 19, - 243, 247, 19, 243, 246, 19, 243, 245, 19, 243, 244, 19, 243, 243, 19, - 243, 242, 19, 243, 241, 19, 243, 240, 19, 243, 239, 19, 243, 238, 19, - 243, 237, 19, 243, 236, 19, 243, 235, 19, 243, 234, 19, 243, 233, 19, - 243, 232, 19, 243, 231, 19, 243, 230, 19, 243, 229, 19, 243, 228, 19, - 243, 227, 19, 243, 226, 19, 243, 225, 19, 243, 224, 19, 243, 223, 19, - 243, 222, 19, 243, 221, 19, 243, 220, 19, 243, 219, 19, 243, 218, 19, - 243, 217, 19, 243, 216, 19, 243, 215, 19, 243, 214, 19, 243, 213, 19, - 243, 212, 19, 243, 211, 19, 243, 210, 19, 243, 209, 19, 243, 208, 19, - 243, 207, 19, 243, 206, 19, 243, 205, 19, 243, 204, 19, 243, 203, 19, - 243, 202, 19, 243, 201, 19, 243, 200, 19, 243, 199, 19, 243, 198, 19, - 243, 197, 19, 243, 196, 19, 243, 195, 19, 243, 194, 19, 243, 193, 19, - 243, 192, 19, 243, 191, 19, 243, 190, 19, 243, 189, 19, 243, 188, 19, - 243, 187, 19, 243, 186, 19, 243, 185, 19, 243, 184, 19, 243, 183, 19, - 243, 182, 19, 243, 181, 19, 243, 180, 19, 243, 179, 19, 243, 178, 19, - 243, 177, 19, 243, 176, 19, 243, 175, 19, 243, 174, 19, 243, 173, 19, - 243, 172, 19, 243, 171, 19, 243, 170, 19, 243, 169, 19, 243, 168, 19, - 243, 167, 19, 243, 166, 19, 243, 165, 19, 243, 164, 19, 243, 163, 19, - 243, 162, 19, 243, 161, 19, 243, 160, 19, 243, 159, 19, 243, 158, 19, - 243, 157, 19, 243, 156, 19, 243, 155, 19, 243, 154, 19, 243, 153, 19, - 243, 152, 19, 243, 151, 19, 243, 150, 19, 243, 149, 19, 243, 148, 19, - 243, 147, 19, 243, 146, 19, 243, 145, 19, 243, 144, 19, 243, 143, 19, - 243, 142, 19, 243, 141, 19, 243, 140, 19, 243, 139, 19, 243, 138, 19, - 243, 137, 19, 243, 136, 19, 243, 135, 19, 243, 134, 19, 243, 133, 19, - 243, 132, 19, 243, 131, 19, 243, 130, 19, 243, 129, 19, 243, 128, 19, - 243, 127, 19, 243, 126, 19, 243, 125, 19, 243, 124, 19, 243, 123, 19, - 243, 122, 19, 243, 121, 19, 243, 120, 19, 243, 119, 19, 243, 118, 19, - 243, 117, 19, 243, 116, 19, 243, 115, 19, 243, 114, 19, 243, 113, 19, - 243, 112, 19, 243, 111, 19, 243, 110, 19, 243, 109, 19, 243, 108, 19, - 243, 107, 19, 243, 106, 19, 243, 105, 19, 243, 104, 19, 243, 103, 19, - 243, 102, 19, 243, 101, 19, 243, 100, 19, 243, 99, 19, 243, 98, 19, 243, - 97, 19, 243, 96, 19, 243, 95, 19, 243, 94, 19, 243, 93, 19, 243, 92, 19, - 243, 91, 19, 243, 90, 19, 243, 89, 19, 243, 88, 19, 243, 87, 19, 243, 86, - 19, 243, 85, 19, 243, 84, 19, 243, 83, 19, 243, 82, 19, 243, 81, 19, 243, - 80, 19, 243, 79, 19, 243, 78, 19, 243, 77, 19, 243, 76, 19, 243, 75, 19, - 243, 74, 19, 243, 73, 19, 243, 72, 19, 243, 71, 19, 243, 70, 19, 243, 69, - 19, 243, 68, 19, 243, 67, 19, 243, 66, 19, 243, 65, 19, 243, 64, 19, 243, - 63, 19, 243, 62, 19, 243, 61, 19, 243, 60, 19, 243, 59, 19, 243, 58, 19, - 243, 57, 19, 243, 56, 19, 243, 55, 19, 243, 54, 19, 243, 53, 19, 243, 52, - 19, 243, 51, 19, 243, 50, 19, 243, 49, 19, 243, 48, 19, 243, 47, 19, 243, - 46, 19, 243, 45, 19, 243, 44, 19, 243, 43, 19, 243, 42, 19, 243, 41, 19, - 243, 40, 19, 243, 39, 19, 243, 38, 19, 243, 37, 19, 243, 36, 19, 243, 35, - 19, 243, 34, 19, 243, 33, 19, 243, 32, 19, 243, 31, 19, 243, 30, 19, 243, - 29, 19, 243, 28, 19, 243, 27, 19, 243, 26, 19, 243, 25, 19, 243, 24, 19, - 243, 23, 19, 243, 22, 19, 243, 21, 19, 243, 20, 19, 243, 19, 19, 243, 18, - 19, 243, 17, 19, 243, 16, 19, 243, 15, 19, 243, 14, 19, 243, 13, 19, 243, - 12, 19, 243, 11, 19, 243, 10, 19, 243, 9, 19, 243, 8, 19, 243, 7, 19, - 243, 6, 19, 243, 5, 19, 243, 4, 19, 243, 3, 19, 243, 2, 19, 243, 1, 19, - 243, 0, 19, 242, 255, 19, 242, 254, 19, 242, 253, 19, 242, 252, 19, 242, - 251, 19, 242, 250, 19, 242, 249, 19, 242, 248, 19, 242, 247, 19, 242, - 246, 19, 242, 245, 19, 242, 244, 19, 242, 243, 19, 242, 242, 19, 242, - 241, 19, 242, 240, 19, 242, 239, 19, 242, 238, 19, 242, 237, 19, 242, - 236, 19, 242, 235, 19, 242, 234, 19, 242, 233, 19, 242, 232, 19, 242, - 231, 19, 242, 230, 19, 242, 229, 19, 242, 228, 19, 242, 227, 19, 242, - 226, 19, 242, 225, 19, 242, 224, 19, 242, 223, 19, 242, 222, 19, 242, - 221, 19, 242, 220, 19, 242, 219, 19, 242, 218, 19, 242, 217, 19, 242, - 216, 19, 242, 215, 19, 242, 214, 19, 242, 213, 19, 242, 212, 19, 242, - 211, 19, 242, 210, 19, 242, 209, 19, 242, 208, 19, 242, 207, 19, 242, - 206, 19, 242, 205, 19, 242, 204, 19, 242, 203, 19, 242, 202, 19, 242, - 201, 19, 242, 200, 19, 242, 199, 19, 242, 198, 19, 242, 197, 19, 242, - 196, 19, 242, 195, 19, 242, 194, 19, 242, 193, 19, 242, 192, 19, 242, - 191, 19, 242, 190, 19, 242, 189, 19, 242, 188, 19, 242, 187, 19, 242, - 186, 19, 242, 185, 19, 242, 184, 19, 242, 183, 19, 242, 182, 19, 242, - 181, 19, 242, 180, 19, 242, 179, 19, 242, 178, 19, 242, 177, 19, 242, - 176, 19, 242, 175, 19, 242, 174, 19, 242, 173, 19, 242, 172, 19, 242, - 171, 19, 242, 170, 19, 242, 169, 19, 242, 168, 19, 242, 167, 19, 242, - 166, 19, 242, 165, 19, 242, 164, 19, 242, 163, 19, 242, 162, 19, 242, - 161, 19, 242, 160, 19, 242, 159, 19, 242, 158, 19, 242, 157, 19, 242, - 156, 19, 242, 155, 19, 242, 154, 19, 242, 153, 19, 242, 152, 19, 242, - 151, 19, 242, 150, 19, 242, 149, 19, 242, 148, 19, 242, 147, 19, 242, - 146, 19, 242, 145, 19, 242, 144, 19, 242, 143, 19, 242, 142, 19, 242, - 141, 19, 242, 140, 19, 242, 139, 19, 242, 138, 19, 242, 137, 19, 242, - 136, 19, 242, 135, 19, 242, 134, 19, 242, 133, 19, 242, 132, 19, 242, - 131, 19, 242, 130, 19, 242, 129, 19, 242, 128, 19, 242, 127, 19, 242, - 126, 19, 242, 125, 19, 242, 124, 19, 242, 123, 19, 242, 122, 19, 242, - 121, 19, 242, 120, 19, 242, 119, 19, 242, 118, 19, 242, 117, 19, 242, - 116, 19, 242, 115, 19, 242, 114, 19, 242, 113, 19, 242, 112, 19, 242, - 111, 19, 242, 110, 19, 242, 109, 19, 242, 108, 19, 242, 107, 19, 242, - 106, 19, 242, 105, 19, 242, 104, 19, 242, 103, 19, 242, 102, 19, 242, - 101, 19, 242, 100, 19, 242, 99, 19, 242, 98, 19, 242, 97, 19, 242, 96, - 19, 242, 95, 19, 242, 94, 19, 242, 93, 19, 242, 92, 19, 242, 91, 19, 242, - 90, 19, 242, 89, 19, 242, 88, 19, 242, 87, 19, 242, 86, 19, 242, 85, 19, - 242, 84, 19, 242, 83, 19, 242, 82, 19, 242, 81, 19, 242, 80, 19, 242, 79, - 19, 242, 78, 19, 242, 77, 19, 242, 76, 19, 242, 75, 19, 242, 74, 19, 242, - 73, 19, 242, 72, 19, 242, 71, 19, 242, 70, 19, 242, 69, 19, 242, 68, 19, - 242, 67, 19, 242, 66, 19, 242, 65, 19, 242, 64, 19, 242, 63, 19, 242, 62, - 19, 242, 61, 19, 242, 60, 19, 242, 59, 19, 242, 58, 19, 242, 57, 19, 242, - 56, 19, 242, 55, 19, 242, 54, 19, 242, 53, 19, 242, 52, 19, 242, 51, 19, - 242, 50, 19, 242, 49, 19, 242, 48, 19, 242, 47, 19, 242, 46, 19, 242, 45, - 19, 242, 44, 19, 242, 43, 19, 242, 42, 19, 242, 41, 19, 242, 40, 19, 242, - 39, 19, 242, 38, 19, 242, 37, 19, 242, 36, 19, 242, 35, 19, 242, 34, 19, - 242, 33, 19, 242, 32, 19, 242, 31, 19, 242, 30, 19, 242, 29, 19, 242, 28, - 19, 242, 27, 19, 242, 26, 19, 242, 25, 19, 242, 24, 19, 242, 23, 19, 242, - 22, 19, 242, 21, 19, 242, 20, 19, 242, 19, 19, 242, 18, 19, 242, 17, 19, - 242, 16, 19, 242, 15, 19, 242, 14, 19, 242, 13, 19, 242, 12, 19, 242, 11, - 19, 242, 10, 19, 242, 9, 19, 242, 8, 19, 242, 7, 19, 242, 6, 19, 242, 5, - 19, 242, 4, 19, 242, 3, 19, 242, 2, 19, 242, 1, 19, 242, 0, 19, 241, 255, - 19, 241, 254, 19, 241, 253, 19, 241, 252, 19, 241, 251, 19, 241, 250, 19, - 241, 249, 19, 241, 248, 19, 241, 247, 19, 241, 246, 19, 241, 245, 19, - 241, 244, 19, 241, 243, 19, 241, 242, 19, 241, 241, 19, 241, 240, 19, - 241, 239, 19, 241, 238, 19, 241, 237, 19, 241, 236, 19, 241, 235, 19, - 241, 234, 19, 241, 233, 19, 241, 232, 19, 241, 231, 19, 241, 230, 19, - 241, 229, 19, 241, 228, 19, 241, 227, 19, 241, 226, 19, 241, 225, 19, - 241, 224, 19, 241, 223, 19, 241, 222, 19, 241, 221, 19, 241, 220, 19, - 241, 219, 19, 241, 218, 19, 241, 217, 19, 241, 216, 19, 241, 215, 19, - 241, 214, 19, 241, 213, 19, 241, 212, 19, 241, 211, 19, 241, 210, 19, - 241, 209, 19, 241, 208, 19, 241, 207, 19, 241, 206, 19, 241, 205, 19, - 241, 204, 19, 241, 203, 19, 241, 202, 19, 241, 201, 19, 241, 200, 19, - 241, 199, 19, 241, 198, 19, 241, 197, 19, 241, 196, 19, 241, 195, 19, - 241, 194, 19, 241, 193, 19, 241, 192, 19, 241, 191, 19, 241, 190, 19, - 241, 189, 19, 241, 188, 19, 241, 187, 19, 241, 186, 19, 241, 185, 19, - 241, 184, 19, 241, 183, 19, 241, 182, 19, 241, 181, 19, 241, 180, 19, - 241, 179, 19, 241, 178, 19, 241, 177, 19, 241, 176, 19, 241, 175, 19, - 241, 174, 19, 241, 173, 19, 241, 172, 19, 241, 171, 19, 241, 170, 19, - 241, 169, 19, 241, 168, 19, 241, 167, 19, 241, 166, 19, 241, 165, 19, - 241, 164, 19, 241, 163, 19, 241, 162, 71, 1, 250, 251, 69, 188, 1, 250, - 251, 196, 69, 56, 1, 255, 168, 56, 1, 255, 167, 56, 1, 255, 166, 56, 1, - 255, 162, 56, 1, 230, 248, 56, 1, 230, 247, 56, 1, 230, 246, 56, 1, 230, - 245, 56, 1, 200, 177, 56, 1, 200, 176, 56, 1, 200, 175, 56, 1, 200, 174, - 56, 1, 200, 173, 56, 1, 237, 134, 56, 1, 237, 133, 56, 1, 237, 132, 56, - 1, 237, 131, 56, 1, 237, 130, 56, 1, 215, 22, 56, 1, 215, 21, 56, 1, 215, - 20, 56, 1, 225, 69, 56, 1, 225, 66, 56, 1, 225, 65, 56, 1, 225, 64, 56, - 1, 225, 63, 56, 1, 225, 62, 56, 1, 225, 61, 56, 1, 225, 60, 56, 1, 225, - 59, 56, 1, 225, 68, 56, 1, 225, 67, 56, 1, 225, 58, 56, 1, 224, 100, 56, - 1, 224, 99, 56, 1, 224, 98, 56, 1, 224, 97, 56, 1, 224, 96, 56, 1, 224, - 95, 56, 1, 224, 94, 56, 1, 224, 93, 56, 1, 223, 186, 56, 1, 223, 185, 56, - 1, 223, 184, 56, 1, 223, 183, 56, 1, 223, 182, 56, 1, 223, 181, 56, 1, - 223, 180, 56, 1, 224, 208, 56, 1, 224, 207, 56, 1, 224, 206, 56, 1, 224, - 205, 56, 1, 224, 204, 56, 1, 224, 203, 56, 1, 224, 10, 56, 1, 224, 9, 56, - 1, 224, 8, 56, 1, 224, 7, 56, 1, 209, 22, 56, 1, 209, 21, 56, 1, 209, 20, - 56, 1, 209, 19, 56, 1, 209, 18, 56, 1, 209, 17, 56, 1, 209, 16, 56, 1, - 209, 15, 56, 1, 206, 111, 56, 1, 206, 110, 56, 1, 206, 109, 56, 1, 206, - 108, 56, 1, 206, 107, 56, 1, 206, 106, 56, 1, 204, 171, 56, 1, 204, 170, - 56, 1, 204, 169, 56, 1, 204, 168, 56, 1, 204, 167, 56, 1, 204, 166, 56, - 1, 204, 165, 56, 1, 204, 164, 56, 1, 208, 146, 56, 1, 208, 145, 56, 1, - 208, 144, 56, 1, 208, 143, 56, 1, 208, 142, 56, 1, 205, 199, 56, 1, 205, - 198, 56, 1, 205, 197, 56, 1, 205, 196, 56, 1, 205, 195, 56, 1, 205, 194, - 56, 1, 205, 193, 56, 1, 203, 168, 56, 1, 203, 167, 56, 1, 203, 166, 56, - 1, 203, 165, 56, 1, 202, 121, 56, 1, 202, 120, 56, 1, 202, 119, 56, 1, - 202, 118, 56, 1, 202, 117, 56, 1, 202, 116, 56, 1, 202, 115, 56, 1, 201, - 39, 56, 1, 201, 38, 56, 1, 201, 37, 56, 1, 201, 36, 56, 1, 201, 35, 56, - 1, 203, 67, 56, 1, 203, 66, 56, 1, 203, 65, 56, 1, 203, 64, 56, 1, 203, - 63, 56, 1, 203, 62, 56, 1, 203, 61, 56, 1, 203, 60, 56, 1, 203, 59, 56, - 1, 202, 29, 56, 1, 202, 28, 56, 1, 202, 27, 56, 1, 202, 26, 56, 1, 202, - 25, 56, 1, 202, 24, 56, 1, 202, 23, 56, 1, 218, 0, 56, 1, 217, 255, 56, - 1, 217, 254, 56, 1, 217, 253, 56, 1, 217, 252, 56, 1, 217, 251, 56, 1, - 217, 250, 56, 1, 217, 249, 56, 1, 217, 248, 56, 1, 216, 222, 56, 1, 216, - 221, 56, 1, 216, 220, 56, 1, 216, 219, 56, 1, 216, 218, 56, 1, 216, 217, - 56, 1, 216, 216, 56, 1, 216, 215, 56, 1, 215, 185, 56, 1, 215, 184, 56, - 1, 215, 183, 56, 1, 217, 117, 56, 1, 217, 116, 56, 1, 217, 115, 56, 1, - 217, 114, 56, 1, 217, 113, 56, 1, 217, 112, 56, 1, 217, 111, 56, 1, 216, - 49, 56, 1, 216, 48, 56, 1, 216, 47, 56, 1, 216, 46, 56, 1, 216, 45, 56, - 1, 233, 3, 56, 1, 233, 0, 56, 1, 232, 255, 56, 1, 232, 254, 56, 1, 232, - 253, 56, 1, 232, 252, 56, 1, 232, 251, 56, 1, 232, 250, 56, 1, 232, 249, - 56, 1, 233, 2, 56, 1, 233, 1, 56, 1, 232, 70, 56, 1, 232, 69, 56, 1, 232, - 68, 56, 1, 232, 67, 56, 1, 232, 66, 56, 1, 232, 65, 56, 1, 232, 64, 56, - 1, 231, 74, 56, 1, 231, 73, 56, 1, 231, 72, 56, 1, 232, 146, 56, 1, 232, - 145, 56, 1, 232, 144, 56, 1, 232, 143, 56, 1, 232, 142, 56, 1, 232, 141, - 56, 1, 232, 140, 56, 1, 231, 192, 56, 1, 231, 191, 56, 1, 231, 190, 56, - 1, 231, 189, 56, 1, 231, 188, 56, 1, 231, 187, 56, 1, 231, 186, 56, 1, - 231, 185, 56, 1, 220, 127, 56, 1, 220, 126, 56, 1, 220, 125, 56, 1, 220, - 124, 56, 1, 220, 123, 56, 1, 220, 122, 56, 1, 220, 121, 56, 1, 219, 77, - 56, 1, 219, 76, 56, 1, 219, 75, 56, 1, 219, 74, 56, 1, 219, 73, 56, 1, - 219, 72, 56, 1, 219, 71, 56, 1, 218, 144, 56, 1, 218, 143, 56, 1, 218, - 142, 56, 1, 218, 141, 56, 1, 219, 206, 56, 1, 219, 205, 56, 1, 219, 204, - 56, 1, 218, 250, 56, 1, 218, 249, 56, 1, 218, 248, 56, 1, 218, 247, 56, - 1, 218, 246, 56, 1, 218, 245, 56, 1, 196, 137, 56, 1, 196, 136, 56, 1, - 196, 135, 56, 1, 196, 134, 56, 1, 196, 133, 56, 1, 196, 130, 56, 1, 195, - 216, 56, 1, 195, 215, 56, 1, 195, 214, 56, 1, 195, 213, 56, 1, 196, 2, - 56, 1, 196, 1, 56, 1, 196, 0, 56, 1, 195, 255, 56, 1, 195, 254, 56, 1, - 195, 253, 56, 1, 210, 251, 56, 1, 210, 250, 56, 1, 210, 249, 56, 1, 210, - 248, 56, 1, 210, 71, 56, 1, 210, 70, 56, 1, 210, 69, 56, 1, 210, 68, 56, - 1, 210, 67, 56, 1, 210, 66, 56, 1, 210, 65, 56, 1, 209, 139, 56, 1, 209, - 138, 56, 1, 209, 137, 56, 1, 209, 136, 56, 1, 209, 135, 56, 1, 209, 134, - 56, 1, 210, 182, 56, 1, 210, 181, 56, 1, 210, 180, 56, 1, 210, 179, 56, - 1, 209, 231, 56, 1, 209, 230, 56, 1, 209, 229, 56, 1, 209, 228, 56, 1, - 209, 227, 56, 1, 209, 226, 56, 1, 197, 165, 56, 1, 197, 164, 56, 1, 197, - 163, 56, 1, 197, 162, 56, 1, 197, 161, 56, 1, 197, 69, 56, 1, 197, 68, - 56, 1, 197, 67, 56, 1, 197, 66, 56, 1, 197, 65, 56, 1, 197, 108, 56, 1, - 197, 107, 56, 1, 197, 106, 56, 1, 197, 105, 56, 1, 197, 33, 56, 1, 197, - 32, 56, 1, 197, 31, 56, 1, 197, 30, 56, 1, 197, 29, 56, 1, 197, 28, 56, - 1, 197, 27, 56, 1, 218, 52, 56, 1, 218, 51, 188, 1, 4, 197, 70, 188, 1, - 4, 197, 109, 188, 1, 4, 197, 34, 71, 1, 4, 197, 70, 71, 1, 4, 197, 109, - 71, 1, 4, 197, 34, 71, 1, 4, 218, 55, 43, 246, 254, 43, 246, 253, 43, - 246, 252, 43, 246, 251, 43, 246, 250, 43, 246, 249, 43, 246, 248, 43, - 246, 247, 43, 246, 246, 43, 246, 245, 43, 246, 244, 43, 246, 243, 43, - 246, 242, 43, 246, 241, 43, 246, 240, 43, 246, 239, 43, 246, 238, 43, - 246, 237, 43, 246, 236, 43, 246, 235, 43, 246, 234, 43, 246, 233, 43, - 246, 232, 43, 246, 231, 43, 246, 230, 43, 246, 229, 43, 246, 228, 43, - 246, 227, 43, 246, 226, 43, 246, 225, 43, 246, 224, 43, 246, 223, 43, - 246, 222, 43, 246, 221, 43, 246, 220, 43, 246, 219, 43, 246, 218, 43, - 246, 217, 43, 246, 216, 43, 246, 215, 43, 246, 214, 43, 246, 213, 43, - 246, 212, 43, 246, 211, 43, 246, 210, 43, 246, 209, 43, 246, 208, 43, - 246, 207, 43, 246, 206, 43, 246, 205, 43, 246, 204, 43, 246, 203, 43, - 246, 202, 43, 246, 201, 43, 246, 200, 43, 246, 199, 43, 246, 198, 43, - 246, 197, 43, 246, 196, 43, 246, 195, 43, 246, 194, 43, 246, 193, 43, - 246, 192, 43, 246, 191, 43, 246, 190, 43, 246, 189, 43, 246, 188, 43, - 246, 187, 43, 246, 186, 43, 246, 185, 43, 246, 184, 43, 246, 183, 43, - 246, 182, 43, 246, 181, 43, 246, 180, 43, 246, 179, 43, 246, 178, 43, - 246, 177, 43, 246, 176, 43, 246, 175, 43, 246, 174, 43, 246, 173, 43, - 246, 172, 43, 246, 171, 43, 246, 170, 43, 246, 169, 43, 246, 168, 43, - 246, 167, 43, 246, 166, 43, 246, 165, 43, 246, 164, 43, 246, 163, 43, - 246, 162, 43, 246, 161, 43, 246, 160, 43, 246, 159, 43, 246, 158, 43, - 246, 157, 43, 246, 156, 43, 246, 155, 43, 246, 154, 43, 246, 153, 43, - 246, 152, 43, 246, 151, 43, 246, 150, 43, 246, 149, 43, 246, 148, 43, - 246, 147, 43, 246, 146, 43, 246, 145, 43, 246, 144, 43, 246, 143, 43, - 246, 142, 43, 246, 141, 43, 246, 140, 43, 246, 139, 43, 246, 138, 43, - 246, 137, 43, 246, 136, 43, 246, 135, 43, 246, 134, 43, 246, 133, 43, - 246, 132, 43, 246, 131, 43, 246, 130, 43, 246, 129, 43, 246, 128, 43, - 246, 127, 43, 246, 126, 43, 246, 125, 43, 246, 124, 43, 246, 123, 43, - 246, 122, 43, 246, 121, 43, 246, 120, 43, 246, 119, 43, 246, 118, 43, - 246, 117, 43, 246, 116, 43, 246, 115, 43, 246, 114, 43, 246, 113, 43, - 246, 112, 43, 246, 111, 43, 246, 110, 43, 246, 109, 43, 246, 108, 43, - 246, 107, 43, 246, 106, 43, 246, 105, 43, 246, 104, 43, 246, 103, 43, - 246, 102, 43, 246, 101, 43, 246, 100, 43, 246, 99, 43, 246, 98, 43, 246, - 97, 43, 246, 96, 43, 246, 95, 43, 246, 94, 43, 246, 93, 43, 246, 92, 43, - 246, 91, 43, 246, 90, 43, 246, 89, 43, 246, 88, 43, 246, 87, 43, 246, 86, - 43, 246, 85, 43, 246, 84, 43, 246, 83, 43, 246, 82, 43, 246, 81, 43, 246, - 80, 43, 246, 79, 43, 246, 78, 43, 246, 77, 43, 246, 76, 43, 246, 75, 43, - 246, 74, 43, 246, 73, 43, 246, 72, 43, 246, 71, 43, 246, 70, 43, 246, 69, - 43, 246, 68, 43, 246, 67, 43, 246, 66, 43, 246, 65, 43, 246, 64, 43, 246, - 63, 43, 246, 62, 43, 246, 61, 43, 246, 60, 43, 246, 59, 43, 246, 58, 43, - 246, 57, 43, 246, 56, 43, 246, 55, 43, 246, 54, 43, 246, 53, 43, 246, 52, - 43, 246, 51, 43, 246, 50, 43, 246, 49, 43, 246, 48, 43, 246, 47, 43, 246, - 46, 43, 246, 45, 43, 246, 44, 43, 246, 43, 43, 246, 42, 43, 246, 41, 43, - 246, 40, 43, 246, 39, 43, 246, 38, 43, 246, 37, 43, 246, 36, 43, 246, 35, - 43, 246, 34, 43, 246, 33, 43, 246, 32, 43, 246, 31, 43, 246, 30, 43, 246, - 29, 43, 246, 28, 43, 246, 27, 43, 246, 26, 43, 246, 25, 43, 246, 24, 43, - 246, 23, 43, 246, 22, 43, 246, 21, 43, 246, 20, 43, 246, 19, 43, 246, 18, - 43, 246, 17, 43, 246, 16, 43, 246, 15, 43, 246, 14, 43, 246, 13, 43, 246, - 12, 43, 246, 11, 43, 246, 10, 43, 246, 9, 43, 246, 8, 43, 246, 7, 43, - 246, 6, 43, 246, 5, 43, 246, 4, 43, 246, 3, 43, 246, 2, 43, 246, 1, 43, - 246, 0, 43, 245, 255, 43, 245, 254, 43, 245, 253, 43, 245, 252, 43, 245, - 251, 43, 245, 250, 43, 245, 249, 43, 245, 248, 43, 245, 247, 43, 245, - 246, 43, 245, 245, 43, 245, 244, 43, 245, 243, 43, 245, 242, 43, 245, - 241, 43, 245, 240, 43, 245, 239, 43, 245, 238, 43, 245, 237, 43, 245, - 236, 43, 245, 235, 43, 245, 234, 43, 245, 233, 43, 245, 232, 43, 245, - 231, 43, 245, 230, 43, 245, 229, 43, 245, 228, 43, 245, 227, 43, 245, - 226, 43, 245, 225, 43, 245, 224, 43, 245, 223, 43, 245, 222, 43, 245, - 221, 43, 245, 220, 43, 245, 219, 43, 245, 218, 43, 245, 217, 43, 245, - 216, 43, 245, 215, 43, 245, 214, 43, 245, 213, 43, 245, 212, 43, 245, - 211, 43, 245, 210, 43, 245, 209, 43, 245, 208, 43, 245, 207, 43, 245, - 206, 43, 245, 205, 43, 245, 204, 43, 245, 203, 43, 245, 202, 43, 245, - 201, 43, 245, 200, 43, 245, 199, 43, 245, 198, 43, 245, 197, 43, 245, - 196, 43, 245, 195, 43, 245, 194, 43, 245, 193, 43, 245, 192, 43, 245, - 191, 43, 245, 190, 43, 245, 189, 43, 245, 188, 43, 245, 187, 43, 245, - 186, 43, 245, 185, 43, 245, 184, 43, 245, 183, 43, 245, 182, 43, 245, - 181, 43, 245, 180, 43, 245, 179, 43, 245, 178, 43, 245, 177, 43, 245, - 176, 43, 245, 175, 43, 245, 174, 43, 245, 173, 43, 245, 172, 43, 245, - 171, 43, 245, 170, 43, 245, 169, 43, 245, 168, 43, 245, 167, 43, 245, - 166, 43, 245, 165, 43, 245, 164, 43, 245, 163, 43, 245, 162, 43, 245, - 161, 43, 245, 160, 43, 245, 159, 43, 245, 158, 43, 245, 157, 43, 245, - 156, 43, 245, 155, 43, 245, 154, 43, 245, 153, 43, 245, 152, 43, 245, - 151, 43, 245, 150, 43, 245, 149, 43, 245, 148, 43, 245, 147, 43, 245, - 146, 43, 245, 145, 43, 245, 144, 43, 245, 143, 43, 245, 142, 43, 245, - 141, 43, 245, 140, 43, 245, 139, 43, 245, 138, 43, 245, 137, 43, 245, - 136, 43, 245, 135, 43, 245, 134, 43, 245, 133, 43, 245, 132, 43, 245, - 131, 43, 245, 130, 43, 245, 129, 43, 245, 128, 43, 245, 127, 43, 245, - 126, 43, 245, 125, 43, 245, 124, 43, 245, 123, 43, 245, 122, 43, 245, - 121, 43, 245, 120, 43, 245, 119, 43, 245, 118, 43, 245, 117, 43, 245, - 116, 43, 245, 115, 114, 1, 233, 15, 114, 1, 196, 222, 114, 1, 214, 3, - 114, 1, 203, 216, 114, 1, 236, 49, 114, 1, 225, 80, 114, 1, 159, 114, 1, - 250, 112, 114, 1, 240, 231, 114, 1, 199, 230, 114, 1, 234, 190, 114, 1, - 144, 114, 1, 214, 4, 218, 55, 114, 1, 240, 232, 209, 80, 114, 1, 236, 50, - 218, 55, 114, 1, 225, 81, 221, 136, 114, 1, 211, 32, 209, 80, 114, 1, - 202, 235, 114, 1, 205, 234, 239, 177, 114, 1, 239, 177, 114, 1, 224, 37, - 114, 1, 205, 234, 225, 217, 114, 1, 232, 26, 114, 1, 222, 123, 114, 1, - 210, 78, 114, 1, 221, 136, 114, 1, 218, 55, 114, 1, 225, 217, 114, 1, - 209, 80, 114, 1, 221, 137, 218, 55, 114, 1, 218, 56, 221, 136, 114, 1, - 225, 218, 221, 136, 114, 1, 209, 81, 225, 217, 114, 1, 221, 137, 3, 238, - 253, 114, 1, 218, 56, 3, 238, 253, 114, 1, 225, 218, 3, 238, 253, 114, 1, - 225, 218, 3, 238, 251, 226, 42, 26, 57, 114, 1, 209, 81, 3, 238, 253, - 114, 1, 209, 81, 3, 76, 60, 114, 1, 221, 137, 209, 80, 114, 1, 218, 56, - 209, 80, 114, 1, 225, 218, 209, 80, 114, 1, 209, 81, 209, 80, 114, 1, - 221, 137, 218, 56, 209, 80, 114, 1, 218, 56, 221, 137, 209, 80, 114, 1, - 225, 218, 221, 137, 209, 80, 114, 1, 209, 81, 225, 218, 209, 80, 114, 1, - 225, 218, 209, 81, 3, 238, 253, 114, 1, 225, 218, 218, 55, 114, 1, 225, - 218, 218, 56, 209, 80, 114, 1, 209, 81, 203, 216, 114, 1, 209, 81, 203, - 217, 144, 114, 1, 209, 81, 214, 3, 114, 1, 209, 81, 214, 4, 144, 114, 1, - 203, 217, 209, 80, 114, 1, 203, 217, 211, 32, 209, 80, 114, 1, 197, 199, - 114, 1, 197, 81, 114, 1, 197, 200, 144, 114, 1, 209, 81, 218, 55, 114, 1, - 209, 81, 221, 136, 114, 1, 225, 81, 211, 32, 209, 80, 114, 1, 234, 191, - 211, 32, 209, 80, 114, 1, 209, 81, 225, 80, 114, 1, 209, 81, 225, 81, - 144, 114, 1, 63, 114, 1, 205, 234, 214, 16, 114, 1, 214, 190, 114, 1, 72, - 114, 1, 251, 47, 114, 1, 68, 114, 1, 69, 114, 1, 226, 147, 114, 1, 206, - 182, 68, 114, 1, 200, 90, 114, 1, 237, 54, 114, 1, 205, 234, 237, 40, - 114, 1, 209, 207, 68, 114, 1, 205, 234, 237, 54, 114, 1, 181, 68, 114, 1, - 196, 69, 114, 1, 66, 114, 1, 236, 116, 114, 1, 196, 171, 114, 1, 118, - 218, 55, 114, 1, 181, 66, 114, 1, 209, 207, 66, 114, 1, 200, 92, 114, 1, - 205, 234, 66, 114, 1, 214, 99, 114, 1, 214, 16, 114, 1, 214, 39, 114, 1, - 197, 166, 114, 1, 197, 34, 114, 1, 197, 70, 114, 1, 197, 96, 114, 1, 197, - 1, 114, 1, 217, 209, 66, 114, 1, 217, 209, 72, 114, 1, 217, 209, 68, 114, - 1, 217, 209, 63, 114, 1, 213, 34, 251, 106, 114, 1, 213, 34, 251, 123, - 114, 1, 205, 234, 236, 230, 114, 1, 205, 234, 251, 106, 114, 1, 205, 234, - 214, 119, 114, 1, 110, 221, 136, 114, 251, 224, 50, 231, 155, 208, 137, - 114, 251, 224, 219, 65, 231, 155, 208, 137, 114, 251, 224, 53, 231, 155, - 208, 137, 114, 251, 224, 126, 83, 208, 137, 114, 251, 224, 219, 65, 83, - 208, 137, 114, 251, 224, 130, 83, 208, 137, 114, 251, 224, 250, 156, 208, - 137, 114, 251, 224, 250, 156, 222, 175, 208, 137, 114, 251, 224, 250, - 156, 203, 109, 114, 251, 224, 250, 156, 203, 135, 114, 251, 224, 250, - 156, 237, 136, 122, 114, 251, 224, 250, 156, 230, 249, 122, 114, 251, - 224, 250, 156, 203, 110, 122, 114, 251, 224, 130, 186, 114, 251, 224, - 130, 202, 101, 186, 114, 251, 224, 130, 233, 100, 114, 251, 224, 130, - 181, 233, 100, 114, 251, 224, 130, 238, 253, 114, 251, 224, 130, 244, - 249, 114, 251, 224, 130, 222, 75, 114, 251, 224, 130, 197, 122, 114, 251, - 224, 130, 199, 100, 114, 251, 224, 126, 186, 114, 251, 224, 126, 202, - 101, 186, 114, 251, 224, 126, 233, 100, 114, 251, 224, 126, 181, 233, - 100, 114, 251, 224, 126, 238, 253, 114, 251, 224, 126, 244, 249, 114, - 251, 224, 126, 222, 75, 114, 251, 224, 126, 197, 122, 114, 251, 224, 126, - 199, 100, 114, 251, 224, 126, 51, 114, 2, 177, 3, 241, 61, 114, 202, 193, - 1, 208, 114, 114, 52, 78, 114, 211, 214, 245, 59, 234, 217, 204, 226, - 206, 169, 235, 23, 1, 214, 23, 206, 169, 235, 23, 241, 127, 214, 23, 206, - 169, 235, 23, 135, 204, 241, 206, 169, 235, 23, 124, 204, 241, 67, 34, - 16, 211, 231, 67, 34, 16, 240, 67, 67, 34, 16, 213, 38, 67, 34, 16, 214, - 12, 237, 11, 67, 34, 16, 214, 12, 239, 90, 67, 34, 16, 199, 136, 237, 11, - 67, 34, 16, 199, 136, 239, 90, 67, 34, 16, 224, 230, 67, 34, 16, 203, - 233, 67, 34, 16, 213, 147, 67, 34, 16, 195, 223, 67, 34, 16, 195, 224, - 239, 90, 67, 34, 16, 223, 205, 67, 34, 16, 251, 42, 237, 11, 67, 34, 16, - 236, 84, 237, 11, 67, 34, 16, 203, 35, 67, 34, 16, 224, 178, 67, 34, 16, - 251, 31, 67, 34, 16, 251, 32, 239, 90, 67, 34, 16, 203, 240, 67, 34, 16, - 202, 172, 67, 34, 16, 214, 130, 250, 249, 67, 34, 16, 233, 127, 250, 249, - 67, 34, 16, 211, 230, 67, 34, 16, 247, 7, 67, 34, 16, 199, 125, 67, 34, - 16, 225, 239, 250, 249, 67, 34, 16, 224, 180, 250, 249, 67, 34, 16, 224, - 179, 250, 249, 67, 34, 16, 208, 182, 67, 34, 16, 213, 137, 67, 34, 16, - 204, 251, 251, 35, 67, 34, 16, 214, 11, 250, 249, 67, 34, 16, 199, 135, - 250, 249, 67, 34, 16, 251, 36, 250, 249, 67, 34, 16, 251, 29, 67, 34, 16, - 224, 27, 67, 34, 16, 210, 85, 67, 34, 16, 212, 218, 250, 249, 67, 34, 16, - 202, 74, 67, 34, 16, 251, 103, 67, 34, 16, 208, 117, 67, 34, 16, 203, - 244, 250, 249, 67, 34, 16, 203, 244, 219, 144, 204, 249, 67, 34, 16, 214, - 6, 250, 249, 67, 34, 16, 202, 211, 67, 34, 16, 222, 162, 67, 34, 16, 237, - 159, 67, 34, 16, 201, 182, 67, 34, 16, 203, 4, 67, 34, 16, 223, 208, 67, - 34, 16, 251, 42, 236, 84, 217, 97, 67, 34, 16, 234, 225, 250, 249, 67, - 34, 16, 226, 99, 67, 34, 16, 201, 151, 250, 249, 67, 34, 16, 224, 233, - 201, 150, 67, 34, 16, 213, 67, 67, 34, 16, 211, 235, 67, 34, 16, 223, - 243, 67, 34, 16, 245, 42, 250, 249, 67, 34, 16, 210, 203, 67, 34, 16, - 213, 150, 250, 249, 67, 34, 16, 213, 148, 250, 249, 67, 34, 16, 230, 199, - 67, 34, 16, 217, 220, 67, 34, 16, 213, 16, 67, 34, 16, 223, 244, 251, - 141, 67, 34, 16, 201, 151, 251, 141, 67, 34, 16, 204, 220, 67, 34, 16, - 233, 86, 67, 34, 16, 225, 239, 217, 97, 67, 34, 16, 214, 130, 217, 97, - 67, 34, 16, 214, 12, 217, 97, 67, 34, 16, 213, 15, 67, 34, 16, 223, 228, - 67, 34, 16, 213, 14, 67, 34, 16, 223, 207, 67, 34, 16, 213, 68, 217, 97, - 67, 34, 16, 224, 179, 217, 98, 251, 73, 67, 34, 16, 224, 180, 217, 98, - 251, 73, 67, 34, 16, 195, 221, 67, 34, 16, 251, 32, 217, 97, 67, 34, 16, - 251, 33, 203, 241, 217, 97, 67, 34, 16, 195, 222, 67, 34, 16, 223, 206, - 67, 34, 16, 237, 6, 67, 34, 16, 247, 8, 67, 34, 16, 219, 36, 225, 238, - 67, 34, 16, 199, 136, 217, 97, 67, 34, 16, 212, 218, 217, 97, 67, 34, 16, - 211, 236, 217, 97, 67, 34, 16, 214, 126, 67, 34, 16, 251, 60, 67, 34, 16, - 221, 147, 67, 34, 16, 213, 148, 217, 97, 67, 34, 16, 213, 150, 217, 97, - 67, 34, 16, 236, 122, 213, 149, 67, 34, 16, 223, 104, 67, 34, 16, 251, - 61, 67, 34, 16, 201, 151, 217, 97, 67, 34, 16, 237, 9, 67, 34, 16, 203, - 244, 217, 97, 67, 34, 16, 203, 234, 67, 34, 16, 245, 42, 217, 97, 67, 34, - 16, 236, 180, 67, 34, 16, 208, 118, 217, 97, 67, 34, 16, 196, 188, 224, - 27, 67, 34, 16, 201, 148, 67, 34, 16, 211, 237, 67, 34, 16, 201, 152, 67, - 34, 16, 201, 149, 67, 34, 16, 211, 234, 67, 34, 16, 201, 147, 67, 34, 16, - 211, 233, 67, 34, 16, 233, 126, 67, 34, 16, 250, 241, 67, 34, 16, 236, - 122, 250, 241, 67, 34, 16, 214, 6, 217, 97, 67, 34, 16, 202, 210, 236, - 135, 67, 34, 16, 202, 210, 236, 83, 67, 34, 16, 202, 212, 251, 37, 67, - 34, 16, 202, 204, 225, 32, 251, 28, 67, 34, 16, 224, 232, 67, 34, 16, - 236, 217, 67, 34, 16, 196, 28, 224, 229, 67, 34, 16, 196, 28, 251, 73, - 67, 34, 16, 204, 250, 67, 34, 16, 224, 28, 251, 73, 67, 34, 16, 239, 91, - 250, 249, 67, 34, 16, 223, 209, 250, 249, 67, 34, 16, 223, 209, 251, 141, - 67, 34, 16, 223, 209, 217, 97, 67, 34, 16, 251, 36, 217, 97, 67, 34, 16, - 251, 38, 67, 34, 16, 239, 90, 67, 34, 16, 201, 163, 67, 34, 16, 202, 250, - 67, 34, 16, 223, 232, 67, 34, 16, 222, 167, 236, 210, 245, 32, 67, 34, - 16, 222, 167, 237, 160, 245, 33, 67, 34, 16, 222, 167, 201, 166, 245, 33, - 67, 34, 16, 222, 167, 203, 6, 245, 33, 67, 34, 16, 222, 167, 226, 94, - 245, 32, 67, 34, 16, 233, 127, 217, 98, 251, 73, 67, 34, 16, 233, 127, - 213, 138, 250, 237, 67, 34, 16, 233, 127, 213, 138, 239, 181, 67, 34, 16, - 239, 115, 67, 34, 16, 239, 116, 213, 138, 250, 238, 224, 229, 67, 34, 16, - 239, 116, 213, 138, 250, 238, 251, 73, 67, 34, 16, 239, 116, 213, 138, - 239, 181, 67, 34, 16, 201, 171, 67, 34, 16, 250, 242, 67, 34, 16, 226, - 101, 67, 34, 16, 239, 138, 67, 34, 16, 251, 211, 212, 100, 250, 243, 67, - 34, 16, 251, 211, 250, 240, 67, 34, 16, 251, 211, 250, 243, 67, 34, 16, - 251, 211, 219, 138, 67, 34, 16, 251, 211, 219, 149, 67, 34, 16, 251, 211, - 233, 128, 67, 34, 16, 251, 211, 233, 125, 67, 34, 16, 251, 211, 212, 100, - 233, 128, 67, 34, 16, 220, 18, 211, 243, 230, 197, 67, 34, 16, 220, 18, - 251, 143, 211, 243, 230, 197, 67, 34, 16, 220, 18, 239, 180, 230, 197, - 67, 34, 16, 220, 18, 251, 143, 239, 180, 230, 197, 67, 34, 16, 220, 18, - 201, 158, 230, 197, 67, 34, 16, 220, 18, 201, 172, 67, 34, 16, 220, 18, - 202, 255, 230, 197, 67, 34, 16, 220, 18, 202, 255, 222, 171, 230, 197, - 67, 34, 16, 220, 18, 222, 171, 230, 197, 67, 34, 16, 220, 18, 212, 146, - 230, 197, 67, 34, 16, 225, 246, 203, 28, 230, 198, 67, 34, 16, 251, 33, - 203, 28, 230, 198, 67, 34, 16, 235, 209, 202, 252, 67, 34, 16, 235, 209, - 218, 206, 67, 34, 16, 235, 209, 239, 121, 67, 34, 16, 220, 18, 199, 129, - 230, 197, 67, 34, 16, 220, 18, 211, 242, 230, 197, 67, 34, 16, 220, 18, - 212, 146, 202, 255, 230, 197, 67, 34, 16, 233, 122, 218, 56, 251, 37, 67, - 34, 16, 233, 122, 218, 56, 239, 89, 67, 34, 16, 236, 228, 225, 32, 234, - 225, 198, 228, 67, 34, 16, 226, 100, 67, 34, 16, 226, 98, 67, 34, 16, - 234, 225, 250, 250, 239, 179, 230, 196, 67, 34, 16, 234, 225, 239, 136, - 161, 67, 34, 16, 234, 225, 239, 136, 217, 220, 67, 34, 16, 234, 225, 217, - 214, 230, 197, 67, 34, 16, 234, 225, 239, 136, 239, 152, 67, 34, 16, 234, - 225, 206, 0, 239, 135, 239, 152, 67, 34, 16, 234, 225, 239, 136, 224, - 209, 67, 34, 16, 234, 225, 239, 136, 195, 11, 67, 34, 16, 234, 225, 239, - 136, 216, 224, 224, 229, 67, 34, 16, 234, 225, 239, 136, 216, 224, 251, - 73, 67, 34, 16, 234, 225, 220, 68, 245, 34, 239, 121, 67, 34, 16, 234, - 225, 220, 68, 245, 34, 218, 206, 67, 34, 16, 235, 154, 206, 0, 245, 34, - 199, 128, 67, 34, 16, 234, 225, 206, 0, 245, 34, 203, 245, 67, 34, 16, - 234, 225, 217, 100, 67, 34, 16, 245, 35, 194, 234, 67, 34, 16, 245, 35, - 224, 26, 67, 34, 16, 245, 35, 205, 139, 67, 34, 16, 234, 225, 230, 249, - 196, 27, 203, 0, 67, 34, 16, 234, 225, 236, 229, 251, 62, 67, 34, 16, - 196, 27, 201, 159, 67, 34, 16, 239, 129, 201, 159, 67, 34, 16, 239, 129, - 203, 0, 67, 34, 16, 239, 129, 251, 39, 237, 160, 239, 20, 67, 34, 16, - 239, 129, 218, 204, 203, 5, 239, 20, 67, 34, 16, 239, 129, 239, 112, 236, - 96, 239, 20, 67, 34, 16, 239, 129, 201, 169, 214, 136, 239, 20, 67, 34, - 16, 196, 27, 251, 39, 237, 160, 239, 20, 67, 34, 16, 196, 27, 218, 204, - 203, 5, 239, 20, 67, 34, 16, 196, 27, 239, 112, 236, 96, 239, 20, 67, 34, - 16, 196, 27, 201, 169, 214, 136, 239, 20, 67, 34, 16, 234, 30, 239, 128, - 67, 34, 16, 234, 30, 196, 26, 67, 34, 16, 239, 137, 251, 39, 219, 37, 67, - 34, 16, 239, 137, 251, 39, 219, 179, 67, 34, 16, 239, 137, 239, 90, 67, - 34, 16, 239, 137, 202, 202, 67, 34, 16, 206, 72, 202, 202, 67, 34, 16, - 206, 72, 202, 203, 239, 74, 67, 34, 16, 206, 72, 202, 203, 201, 160, 67, - 34, 16, 206, 72, 202, 203, 202, 248, 67, 34, 16, 206, 72, 250, 211, 67, - 34, 16, 206, 72, 250, 212, 239, 74, 67, 34, 16, 206, 72, 250, 212, 201, - 160, 67, 34, 16, 206, 72, 250, 212, 202, 248, 67, 34, 16, 239, 113, 234, - 11, 67, 34, 16, 239, 120, 214, 39, 67, 34, 16, 204, 236, 67, 34, 16, 250, - 234, 161, 67, 34, 16, 250, 234, 198, 228, 67, 34, 16, 250, 234, 234, 123, - 67, 34, 16, 250, 234, 239, 152, 67, 34, 16, 250, 234, 224, 209, 67, 34, - 16, 250, 234, 195, 11, 67, 34, 16, 250, 234, 216, 223, 67, 34, 16, 224, - 179, 217, 98, 219, 148, 67, 34, 16, 224, 180, 217, 98, 219, 148, 67, 34, - 16, 224, 179, 217, 98, 224, 229, 67, 34, 16, 224, 180, 217, 98, 224, 229, - 67, 34, 16, 224, 28, 224, 229, 67, 34, 16, 233, 127, 217, 98, 224, 229, - 34, 16, 206, 62, 249, 75, 34, 16, 52, 249, 75, 34, 16, 48, 249, 75, 34, - 16, 210, 90, 48, 249, 75, 34, 16, 240, 64, 249, 75, 34, 16, 206, 182, - 249, 75, 34, 16, 50, 210, 120, 55, 34, 16, 53, 210, 120, 55, 34, 16, 210, - 120, 238, 250, 34, 16, 240, 108, 208, 121, 34, 16, 240, 137, 247, 122, - 34, 16, 208, 121, 34, 16, 244, 176, 34, 16, 210, 118, 235, 142, 34, 16, - 210, 118, 235, 141, 34, 16, 210, 118, 235, 140, 34, 16, 235, 164, 34, 16, - 235, 165, 60, 34, 16, 248, 49, 78, 34, 16, 247, 164, 34, 16, 248, 63, 34, - 16, 179, 34, 16, 214, 114, 205, 16, 34, 16, 200, 214, 205, 16, 34, 16, - 202, 149, 205, 16, 34, 16, 235, 6, 205, 16, 34, 16, 235, 100, 205, 16, - 34, 16, 206, 28, 205, 16, 34, 16, 206, 26, 234, 242, 34, 16, 235, 4, 234, - 242, 34, 16, 234, 191, 244, 218, 34, 16, 234, 191, 244, 219, 214, 43, - 251, 132, 34, 16, 234, 191, 244, 219, 214, 43, 249, 58, 34, 16, 247, 208, - 244, 218, 34, 16, 236, 50, 244, 218, 34, 16, 236, 50, 244, 219, 214, 43, - 251, 132, 34, 16, 236, 50, 244, 219, 214, 43, 249, 58, 34, 16, 237, 207, - 244, 217, 34, 16, 237, 207, 244, 216, 34, 16, 218, 120, 219, 203, 210, - 101, 34, 16, 52, 207, 12, 34, 16, 52, 235, 82, 34, 16, 235, 83, 200, 36, - 34, 16, 235, 83, 237, 235, 34, 16, 217, 203, 200, 36, 34, 16, 217, 203, - 237, 235, 34, 16, 207, 13, 200, 36, 34, 16, 207, 13, 237, 235, 34, 16, - 211, 88, 152, 207, 12, 34, 16, 211, 88, 152, 235, 82, 34, 16, 244, 156, - 202, 78, 34, 16, 241, 2, 202, 78, 34, 16, 214, 43, 251, 132, 34, 16, 214, - 43, 249, 58, 34, 16, 211, 69, 251, 132, 34, 16, 211, 69, 249, 58, 34, 16, - 218, 123, 210, 101, 34, 16, 197, 71, 210, 101, 34, 16, 157, 210, 101, 34, - 16, 211, 88, 210, 101, 34, 16, 237, 27, 210, 101, 34, 16, 206, 22, 210, - 101, 34, 16, 202, 174, 210, 101, 34, 16, 206, 12, 210, 101, 34, 16, 97, - 231, 58, 200, 232, 210, 101, 34, 16, 196, 223, 216, 9, 34, 16, 98, 216, - 9, 34, 16, 244, 250, 196, 223, 216, 9, 34, 16, 47, 216, 10, 197, 73, 34, - 16, 47, 216, 10, 248, 136, 34, 16, 201, 181, 216, 10, 124, 197, 73, 34, - 16, 201, 181, 216, 10, 124, 248, 136, 34, 16, 201, 181, 216, 10, 50, 197, - 73, 34, 16, 201, 181, 216, 10, 50, 248, 136, 34, 16, 201, 181, 216, 10, - 53, 197, 73, 34, 16, 201, 181, 216, 10, 53, 248, 136, 34, 16, 201, 181, - 216, 10, 135, 197, 73, 34, 16, 201, 181, 216, 10, 135, 248, 136, 34, 16, - 201, 181, 216, 10, 124, 53, 197, 73, 34, 16, 201, 181, 216, 10, 124, 53, - 248, 136, 34, 16, 218, 190, 216, 10, 197, 73, 34, 16, 218, 190, 216, 10, - 248, 136, 34, 16, 201, 178, 216, 10, 135, 197, 73, 34, 16, 201, 178, 216, - 10, 135, 248, 136, 34, 16, 213, 141, 216, 9, 34, 16, 198, 241, 216, 9, - 34, 16, 216, 10, 248, 136, 34, 16, 215, 147, 216, 9, 34, 16, 244, 187, - 216, 10, 197, 73, 34, 16, 244, 187, 216, 10, 248, 136, 34, 16, 248, 47, - 34, 16, 197, 71, 216, 13, 34, 16, 157, 216, 13, 34, 16, 211, 88, 216, 13, - 34, 16, 237, 27, 216, 13, 34, 16, 206, 22, 216, 13, 34, 16, 202, 174, - 216, 13, 34, 16, 206, 12, 216, 13, 34, 16, 97, 231, 58, 200, 232, 216, - 13, 34, 16, 38, 204, 243, 34, 16, 38, 205, 101, 204, 243, 34, 16, 38, - 201, 189, 34, 16, 38, 201, 188, 34, 16, 38, 201, 187, 34, 16, 235, 125, - 201, 189, 34, 16, 235, 125, 201, 188, 34, 16, 235, 125, 201, 187, 34, 16, - 38, 250, 147, 238, 253, 34, 16, 38, 235, 92, 34, 16, 38, 235, 91, 34, 16, - 38, 235, 90, 34, 16, 38, 235, 89, 34, 16, 38, 235, 88, 34, 16, 248, 243, - 249, 6, 34, 16, 236, 222, 249, 6, 34, 16, 248, 243, 202, 107, 34, 16, - 236, 222, 202, 107, 34, 16, 248, 243, 205, 225, 34, 16, 236, 222, 205, - 225, 34, 16, 248, 243, 212, 227, 34, 16, 236, 222, 212, 227, 34, 16, 38, - 252, 22, 34, 16, 38, 205, 20, 34, 16, 38, 203, 11, 34, 16, 38, 205, 21, - 34, 16, 38, 220, 33, 34, 16, 38, 220, 32, 34, 16, 38, 252, 21, 34, 16, - 38, 221, 210, 34, 16, 250, 223, 200, 36, 34, 16, 250, 223, 237, 235, 34, - 16, 38, 239, 13, 34, 16, 38, 209, 254, 34, 16, 38, 235, 71, 34, 16, 38, - 205, 221, 34, 16, 38, 248, 221, 34, 16, 38, 52, 201, 249, 34, 16, 38, - 201, 165, 201, 249, 34, 16, 210, 4, 34, 16, 204, 154, 34, 16, 195, 158, - 34, 16, 212, 219, 34, 16, 219, 129, 34, 16, 235, 18, 34, 16, 241, 73, 34, - 16, 239, 238, 34, 16, 233, 117, 216, 14, 205, 248, 34, 16, 233, 117, 216, - 14, 216, 51, 205, 248, 34, 16, 201, 218, 34, 16, 201, 4, 34, 16, 226, 17, - 201, 4, 34, 16, 201, 5, 205, 248, 34, 16, 201, 5, 200, 36, 34, 16, 214, - 60, 204, 195, 34, 16, 214, 60, 204, 192, 34, 16, 214, 60, 204, 191, 34, - 16, 214, 60, 204, 190, 34, 16, 214, 60, 204, 189, 34, 16, 214, 60, 204, - 188, 34, 16, 214, 60, 204, 187, 34, 16, 214, 60, 204, 186, 34, 16, 214, - 60, 204, 185, 34, 16, 214, 60, 204, 194, 34, 16, 214, 60, 204, 193, 34, - 16, 232, 157, 34, 16, 217, 110, 34, 16, 236, 222, 77, 204, 232, 34, 16, - 239, 231, 205, 248, 34, 16, 38, 135, 248, 77, 34, 16, 38, 124, 248, 77, - 34, 16, 38, 232, 170, 34, 16, 38, 205, 211, 212, 151, 34, 16, 213, 84, - 78, 34, 16, 213, 84, 124, 78, 34, 16, 157, 213, 84, 78, 34, 16, 233, 154, - 200, 36, 34, 16, 233, 154, 237, 235, 34, 16, 3, 235, 124, 34, 16, 240, - 91, 34, 16, 240, 92, 251, 146, 34, 16, 219, 253, 34, 16, 221, 231, 34, - 16, 248, 44, 34, 16, 207, 109, 197, 73, 34, 16, 207, 109, 248, 136, 34, - 16, 219, 19, 34, 16, 219, 20, 248, 136, 34, 16, 207, 103, 197, 73, 34, - 16, 207, 103, 248, 136, 34, 16, 234, 208, 197, 73, 34, 16, 234, 208, 248, - 136, 34, 16, 221, 232, 213, 43, 210, 101, 34, 16, 221, 232, 226, 91, 210, - 101, 34, 16, 248, 45, 210, 101, 34, 16, 207, 109, 210, 101, 34, 16, 219, - 20, 210, 101, 34, 16, 207, 103, 210, 101, 34, 16, 203, 25, 213, 41, 241, - 32, 211, 253, 213, 42, 34, 16, 203, 25, 213, 41, 241, 32, 211, 253, 226, - 90, 34, 16, 203, 25, 213, 41, 241, 32, 211, 253, 213, 43, 239, 100, 34, - 16, 203, 25, 226, 89, 241, 32, 211, 253, 213, 42, 34, 16, 203, 25, 226, - 89, 241, 32, 211, 253, 226, 90, 34, 16, 203, 25, 226, 89, 241, 32, 211, - 253, 226, 91, 239, 100, 34, 16, 203, 25, 226, 89, 241, 32, 211, 253, 226, - 91, 239, 99, 34, 16, 203, 25, 226, 89, 241, 32, 211, 253, 226, 91, 239, - 98, 34, 16, 241, 64, 34, 16, 233, 89, 247, 208, 244, 218, 34, 16, 233, - 89, 236, 50, 244, 218, 34, 16, 47, 250, 112, 34, 16, 199, 6, 34, 16, 212, - 114, 34, 16, 244, 208, 34, 16, 208, 172, 34, 16, 244, 213, 34, 16, 201, - 236, 34, 16, 212, 82, 34, 16, 212, 83, 235, 74, 34, 16, 208, 173, 235, - 74, 34, 16, 201, 237, 210, 98, 34, 16, 213, 24, 204, 144, 34, 16, 224, - 83, 247, 208, 244, 218, 34, 16, 224, 83, 236, 222, 77, 212, 212, 34, 16, - 224, 83, 48, 216, 13, 34, 16, 224, 83, 210, 170, 78, 34, 16, 224, 83, - 197, 71, 216, 13, 34, 16, 224, 83, 157, 216, 13, 34, 16, 224, 83, 211, - 88, 216, 14, 204, 244, 237, 235, 34, 16, 224, 83, 211, 88, 216, 14, 204, - 244, 200, 36, 34, 16, 224, 83, 237, 27, 216, 14, 204, 244, 237, 235, 34, - 16, 224, 83, 237, 27, 216, 14, 204, 244, 200, 36, 34, 16, 224, 83, 235, - 83, 55, 32, 198, 247, 216, 17, 204, 40, 32, 198, 247, 216, 17, 204, 29, - 32, 198, 247, 216, 17, 204, 19, 32, 198, 247, 216, 17, 204, 12, 32, 198, - 247, 216, 17, 204, 4, 32, 198, 247, 216, 17, 203, 254, 32, 198, 247, 216, - 17, 203, 253, 32, 198, 247, 216, 17, 203, 252, 32, 198, 247, 216, 17, - 203, 251, 32, 198, 247, 216, 17, 204, 39, 32, 198, 247, 216, 17, 204, 38, - 32, 198, 247, 216, 17, 204, 37, 32, 198, 247, 216, 17, 204, 36, 32, 198, - 247, 216, 17, 204, 35, 32, 198, 247, 216, 17, 204, 34, 32, 198, 247, 216, - 17, 204, 33, 32, 198, 247, 216, 17, 204, 32, 32, 198, 247, 216, 17, 204, - 31, 32, 198, 247, 216, 17, 204, 30, 32, 198, 247, 216, 17, 204, 28, 32, - 198, 247, 216, 17, 204, 27, 32, 198, 247, 216, 17, 204, 26, 32, 198, 247, - 216, 17, 204, 25, 32, 198, 247, 216, 17, 204, 24, 32, 198, 247, 216, 17, - 204, 3, 32, 198, 247, 216, 17, 204, 2, 32, 198, 247, 216, 17, 204, 1, 32, - 198, 247, 216, 17, 204, 0, 32, 198, 247, 216, 17, 203, 255, 32, 226, 40, - 216, 17, 204, 40, 32, 226, 40, 216, 17, 204, 29, 32, 226, 40, 216, 17, - 204, 12, 32, 226, 40, 216, 17, 204, 4, 32, 226, 40, 216, 17, 203, 253, - 32, 226, 40, 216, 17, 203, 252, 32, 226, 40, 216, 17, 204, 38, 32, 226, - 40, 216, 17, 204, 37, 32, 226, 40, 216, 17, 204, 36, 32, 226, 40, 216, - 17, 204, 35, 32, 226, 40, 216, 17, 204, 32, 32, 226, 40, 216, 17, 204, - 31, 32, 226, 40, 216, 17, 204, 30, 32, 226, 40, 216, 17, 204, 25, 32, - 226, 40, 216, 17, 204, 24, 32, 226, 40, 216, 17, 204, 23, 32, 226, 40, - 216, 17, 204, 22, 32, 226, 40, 216, 17, 204, 21, 32, 226, 40, 216, 17, - 204, 20, 32, 226, 40, 216, 17, 204, 18, 32, 226, 40, 216, 17, 204, 17, - 32, 226, 40, 216, 17, 204, 16, 32, 226, 40, 216, 17, 204, 15, 32, 226, - 40, 216, 17, 204, 14, 32, 226, 40, 216, 17, 204, 13, 32, 226, 40, 216, - 17, 204, 11, 32, 226, 40, 216, 17, 204, 10, 32, 226, 40, 216, 17, 204, 9, - 32, 226, 40, 216, 17, 204, 8, 32, 226, 40, 216, 17, 204, 7, 32, 226, 40, - 216, 17, 204, 6, 32, 226, 40, 216, 17, 204, 5, 32, 226, 40, 216, 17, 204, - 3, 32, 226, 40, 216, 17, 204, 2, 32, 226, 40, 216, 17, 204, 1, 32, 226, - 40, 216, 17, 204, 0, 32, 226, 40, 216, 17, 203, 255, 38, 32, 34, 201, - 161, 38, 32, 34, 202, 249, 38, 32, 34, 213, 53, 32, 34, 222, 166, 219, - 250, 215, 142, 195, 79, 219, 250, 215, 142, 100, 219, 250, 215, 142, 102, - 219, 250, 215, 142, 134, 219, 250, 215, 142, 136, 219, 250, 215, 142, - 146, 219, 250, 215, 142, 167, 219, 250, 215, 142, 178, 219, 250, 215, - 142, 171, 219, 250, 215, 142, 182, 219, 250, 215, 142, 203, 23, 219, 250, - 215, 142, 236, 252, 219, 250, 215, 142, 200, 239, 219, 250, 215, 142, - 202, 179, 219, 250, 215, 142, 235, 1, 219, 250, 215, 142, 235, 149, 219, - 250, 215, 142, 206, 23, 219, 250, 215, 142, 207, 68, 219, 250, 215, 142, - 237, 28, 219, 250, 215, 142, 216, 176, 218, 205, 36, 237, 72, 239, 114, - 36, 232, 121, 237, 72, 239, 114, 36, 231, 62, 237, 72, 239, 114, 36, 237, - 71, 232, 122, 239, 114, 36, 237, 71, 231, 61, 239, 114, 36, 237, 72, 202, - 251, 36, 247, 36, 202, 251, 36, 234, 217, 244, 249, 202, 251, 36, 219, - 11, 202, 251, 36, 249, 70, 202, 251, 36, 224, 197, 205, 224, 202, 251, - 36, 241, 122, 202, 251, 36, 250, 197, 202, 251, 36, 214, 78, 202, 251, - 36, 248, 55, 214, 34, 202, 251, 36, 239, 233, 214, 73, 239, 66, 202, 251, - 36, 239, 63, 202, 251, 36, 195, 229, 202, 251, 36, 226, 77, 202, 251, 36, - 213, 63, 202, 251, 36, 210, 178, 202, 251, 36, 241, 134, 202, 251, 36, - 231, 176, 249, 138, 202, 251, 36, 197, 152, 202, 251, 36, 235, 46, 202, - 251, 36, 251, 248, 202, 251, 36, 210, 133, 202, 251, 36, 210, 105, 202, - 251, 36, 237, 70, 202, 251, 36, 225, 113, 202, 251, 36, 241, 129, 202, - 251, 36, 236, 220, 202, 251, 36, 237, 172, 202, 251, 36, 247, 3, 202, - 251, 36, 239, 243, 202, 251, 36, 27, 210, 104, 202, 251, 36, 213, 234, - 202, 251, 36, 222, 170, 202, 251, 36, 244, 201, 202, 251, 36, 224, 71, - 202, 251, 36, 234, 72, 202, 251, 36, 204, 207, 202, 251, 36, 211, 202, - 202, 251, 36, 234, 216, 202, 251, 36, 210, 106, 202, 251, 36, 222, 210, - 214, 73, 218, 241, 202, 251, 36, 210, 102, 202, 251, 36, 233, 137, 202, - 30, 219, 183, 202, 251, 36, 236, 223, 202, 251, 36, 204, 221, 202, 251, - 36, 233, 92, 202, 251, 36, 236, 213, 202, 251, 36, 213, 110, 202, 251, - 36, 209, 247, 202, 251, 36, 235, 72, 202, 251, 36, 199, 127, 214, 73, - 197, 131, 202, 251, 36, 241, 139, 202, 251, 36, 219, 202, 202, 251, 36, - 236, 123, 202, 251, 36, 200, 47, 202, 251, 36, 239, 101, 202, 251, 36, - 244, 203, 218, 164, 202, 251, 36, 233, 68, 202, 251, 36, 234, 73, 226, - 86, 202, 251, 36, 220, 6, 202, 251, 36, 252, 17, 202, 251, 36, 236, 239, - 202, 251, 36, 237, 239, 202, 251, 36, 197, 129, 202, 251, 36, 206, 57, - 202, 251, 36, 226, 50, 202, 251, 36, 239, 200, 202, 251, 36, 240, 69, - 202, 251, 36, 239, 97, 202, 251, 36, 236, 87, 202, 251, 36, 207, 64, 202, - 251, 36, 204, 225, 202, 251, 36, 232, 172, 202, 251, 36, 244, 151, 202, - 251, 36, 244, 198, 202, 251, 36, 235, 218, 202, 251, 36, 251, 212, 202, - 251, 36, 244, 150, 202, 251, 36, 214, 120, 202, 218, 199, 103, 202, 251, - 36, 239, 123, 202, 251, 36, 223, 70, 202, 251, 36, 235, 10, 241, 88, 209, - 216, 200, 50, 17, 100, 241, 88, 209, 216, 200, 50, 17, 102, 241, 88, 209, - 216, 200, 50, 17, 134, 241, 88, 209, 216, 200, 50, 17, 136, 241, 88, 209, - 216, 200, 50, 17, 146, 241, 88, 209, 216, 200, 50, 17, 167, 241, 88, 209, - 216, 200, 50, 17, 178, 241, 88, 209, 216, 200, 50, 17, 171, 241, 88, 209, - 216, 200, 50, 17, 182, 241, 88, 209, 216, 203, 19, 17, 100, 241, 88, 209, - 216, 203, 19, 17, 102, 241, 88, 209, 216, 203, 19, 17, 134, 241, 88, 209, - 216, 203, 19, 17, 136, 241, 88, 209, 216, 203, 19, 17, 146, 241, 88, 209, - 216, 203, 19, 17, 167, 241, 88, 209, 216, 203, 19, 17, 178, 241, 88, 209, - 216, 203, 19, 17, 171, 241, 88, 209, 216, 203, 19, 17, 182, 143, 203, - 118, 117, 100, 143, 203, 118, 117, 102, 143, 203, 118, 117, 134, 143, - 203, 118, 117, 136, 143, 203, 118, 117, 146, 203, 118, 117, 100, 203, - 118, 117, 146, 13, 27, 6, 63, 13, 27, 6, 250, 112, 13, 27, 6, 247, 207, - 13, 27, 6, 240, 231, 13, 27, 6, 69, 13, 27, 6, 236, 49, 13, 27, 6, 234, - 190, 13, 27, 6, 233, 15, 13, 27, 6, 68, 13, 27, 6, 225, 217, 13, 27, 6, - 225, 80, 13, 27, 6, 159, 13, 27, 6, 221, 136, 13, 27, 6, 218, 55, 13, 27, - 6, 72, 13, 27, 6, 214, 3, 13, 27, 6, 211, 167, 13, 27, 6, 144, 13, 27, 6, - 209, 80, 13, 27, 6, 203, 216, 13, 27, 6, 66, 13, 27, 6, 199, 230, 13, 27, - 6, 197, 199, 13, 27, 6, 196, 222, 13, 27, 6, 196, 148, 13, 27, 6, 195, - 158, 13, 27, 4, 63, 13, 27, 4, 250, 112, 13, 27, 4, 247, 207, 13, 27, 4, - 240, 231, 13, 27, 4, 69, 13, 27, 4, 236, 49, 13, 27, 4, 234, 190, 13, 27, - 4, 233, 15, 13, 27, 4, 68, 13, 27, 4, 225, 217, 13, 27, 4, 225, 80, 13, - 27, 4, 159, 13, 27, 4, 221, 136, 13, 27, 4, 218, 55, 13, 27, 4, 72, 13, - 27, 4, 214, 3, 13, 27, 4, 211, 167, 13, 27, 4, 144, 13, 27, 4, 209, 80, - 13, 27, 4, 203, 216, 13, 27, 4, 66, 13, 27, 4, 199, 230, 13, 27, 4, 197, - 199, 13, 27, 4, 196, 222, 13, 27, 4, 196, 148, 13, 27, 4, 195, 158, 13, - 41, 6, 63, 13, 41, 6, 250, 112, 13, 41, 6, 247, 207, 13, 41, 6, 240, 231, - 13, 41, 6, 69, 13, 41, 6, 236, 49, 13, 41, 6, 234, 190, 13, 41, 6, 233, - 15, 13, 41, 6, 68, 13, 41, 6, 225, 217, 13, 41, 6, 225, 80, 13, 41, 6, - 159, 13, 41, 6, 221, 136, 13, 41, 6, 218, 55, 13, 41, 6, 72, 13, 41, 6, - 214, 3, 13, 41, 6, 211, 167, 13, 41, 6, 144, 13, 41, 6, 209, 80, 13, 41, - 6, 203, 216, 13, 41, 6, 66, 13, 41, 6, 199, 230, 13, 41, 6, 197, 199, 13, - 41, 6, 196, 222, 13, 41, 6, 196, 148, 13, 41, 6, 195, 158, 13, 41, 4, 63, - 13, 41, 4, 250, 112, 13, 41, 4, 247, 207, 13, 41, 4, 240, 231, 13, 41, 4, - 69, 13, 41, 4, 236, 49, 13, 41, 4, 234, 190, 13, 41, 4, 68, 13, 41, 4, - 225, 217, 13, 41, 4, 225, 80, 13, 41, 4, 159, 13, 41, 4, 221, 136, 13, - 41, 4, 218, 55, 13, 41, 4, 72, 13, 41, 4, 214, 3, 13, 41, 4, 211, 167, - 13, 41, 4, 144, 13, 41, 4, 209, 80, 13, 41, 4, 203, 216, 13, 41, 4, 66, - 13, 41, 4, 199, 230, 13, 41, 4, 197, 199, 13, 41, 4, 196, 222, 13, 41, 4, - 196, 148, 13, 41, 4, 195, 158, 13, 27, 41, 6, 63, 13, 27, 41, 6, 250, - 112, 13, 27, 41, 6, 247, 207, 13, 27, 41, 6, 240, 231, 13, 27, 41, 6, 69, - 13, 27, 41, 6, 236, 49, 13, 27, 41, 6, 234, 190, 13, 27, 41, 6, 233, 15, - 13, 27, 41, 6, 68, 13, 27, 41, 6, 225, 217, 13, 27, 41, 6, 225, 80, 13, - 27, 41, 6, 159, 13, 27, 41, 6, 221, 136, 13, 27, 41, 6, 218, 55, 13, 27, - 41, 6, 72, 13, 27, 41, 6, 214, 3, 13, 27, 41, 6, 211, 167, 13, 27, 41, 6, - 144, 13, 27, 41, 6, 209, 80, 13, 27, 41, 6, 203, 216, 13, 27, 41, 6, 66, - 13, 27, 41, 6, 199, 230, 13, 27, 41, 6, 197, 199, 13, 27, 41, 6, 196, - 222, 13, 27, 41, 6, 196, 148, 13, 27, 41, 6, 195, 158, 13, 27, 41, 4, 63, - 13, 27, 41, 4, 250, 112, 13, 27, 41, 4, 247, 207, 13, 27, 41, 4, 240, - 231, 13, 27, 41, 4, 69, 13, 27, 41, 4, 236, 49, 13, 27, 41, 4, 234, 190, - 13, 27, 41, 4, 233, 15, 13, 27, 41, 4, 68, 13, 27, 41, 4, 225, 217, 13, - 27, 41, 4, 225, 80, 13, 27, 41, 4, 159, 13, 27, 41, 4, 221, 136, 13, 27, - 41, 4, 218, 55, 13, 27, 41, 4, 72, 13, 27, 41, 4, 214, 3, 13, 27, 41, 4, - 211, 167, 13, 27, 41, 4, 144, 13, 27, 41, 4, 209, 80, 13, 27, 41, 4, 203, - 216, 13, 27, 41, 4, 66, 13, 27, 41, 4, 199, 230, 13, 27, 41, 4, 197, 199, - 13, 27, 41, 4, 196, 222, 13, 27, 41, 4, 196, 148, 13, 27, 41, 4, 195, - 158, 13, 145, 6, 63, 13, 145, 6, 247, 207, 13, 145, 6, 240, 231, 13, 145, - 6, 234, 190, 13, 145, 6, 225, 217, 13, 145, 6, 225, 80, 13, 145, 6, 218, - 55, 13, 145, 6, 72, 13, 145, 6, 214, 3, 13, 145, 6, 211, 167, 13, 145, 6, - 209, 80, 13, 145, 6, 203, 216, 13, 145, 6, 66, 13, 145, 6, 199, 230, 13, - 145, 6, 197, 199, 13, 145, 6, 196, 222, 13, 145, 6, 196, 148, 13, 145, 6, - 195, 158, 13, 145, 4, 63, 13, 145, 4, 250, 112, 13, 145, 4, 247, 207, 13, - 145, 4, 240, 231, 13, 145, 4, 236, 49, 13, 145, 4, 233, 15, 13, 145, 4, - 68, 13, 145, 4, 225, 217, 13, 145, 4, 225, 80, 13, 145, 4, 159, 13, 145, - 4, 221, 136, 13, 145, 4, 218, 55, 13, 145, 4, 214, 3, 13, 145, 4, 211, - 167, 13, 145, 4, 144, 13, 145, 4, 209, 80, 13, 145, 4, 203, 216, 13, 145, - 4, 66, 13, 145, 4, 199, 230, 13, 145, 4, 197, 199, 13, 145, 4, 196, 222, - 13, 145, 4, 196, 148, 13, 145, 4, 195, 158, 13, 27, 145, 6, 63, 13, 27, - 145, 6, 250, 112, 13, 27, 145, 6, 247, 207, 13, 27, 145, 6, 240, 231, 13, - 27, 145, 6, 69, 13, 27, 145, 6, 236, 49, 13, 27, 145, 6, 234, 190, 13, - 27, 145, 6, 233, 15, 13, 27, 145, 6, 68, 13, 27, 145, 6, 225, 217, 13, - 27, 145, 6, 225, 80, 13, 27, 145, 6, 159, 13, 27, 145, 6, 221, 136, 13, - 27, 145, 6, 218, 55, 13, 27, 145, 6, 72, 13, 27, 145, 6, 214, 3, 13, 27, - 145, 6, 211, 167, 13, 27, 145, 6, 144, 13, 27, 145, 6, 209, 80, 13, 27, - 145, 6, 203, 216, 13, 27, 145, 6, 66, 13, 27, 145, 6, 199, 230, 13, 27, - 145, 6, 197, 199, 13, 27, 145, 6, 196, 222, 13, 27, 145, 6, 196, 148, 13, - 27, 145, 6, 195, 158, 13, 27, 145, 4, 63, 13, 27, 145, 4, 250, 112, 13, - 27, 145, 4, 247, 207, 13, 27, 145, 4, 240, 231, 13, 27, 145, 4, 69, 13, - 27, 145, 4, 236, 49, 13, 27, 145, 4, 234, 190, 13, 27, 145, 4, 233, 15, - 13, 27, 145, 4, 68, 13, 27, 145, 4, 225, 217, 13, 27, 145, 4, 225, 80, - 13, 27, 145, 4, 159, 13, 27, 145, 4, 221, 136, 13, 27, 145, 4, 218, 55, - 13, 27, 145, 4, 72, 13, 27, 145, 4, 214, 3, 13, 27, 145, 4, 211, 167, 13, - 27, 145, 4, 144, 13, 27, 145, 4, 209, 80, 13, 27, 145, 4, 203, 216, 13, - 27, 145, 4, 66, 13, 27, 145, 4, 199, 230, 13, 27, 145, 4, 197, 199, 13, - 27, 145, 4, 196, 222, 13, 27, 145, 4, 196, 148, 13, 27, 145, 4, 195, 158, - 13, 187, 6, 63, 13, 187, 6, 250, 112, 13, 187, 6, 240, 231, 13, 187, 6, - 69, 13, 187, 6, 236, 49, 13, 187, 6, 234, 190, 13, 187, 6, 225, 217, 13, - 187, 6, 225, 80, 13, 187, 6, 159, 13, 187, 6, 221, 136, 13, 187, 6, 218, - 55, 13, 187, 6, 72, 13, 187, 6, 214, 3, 13, 187, 6, 211, 167, 13, 187, 6, - 209, 80, 13, 187, 6, 203, 216, 13, 187, 6, 66, 13, 187, 6, 199, 230, 13, - 187, 6, 197, 199, 13, 187, 6, 196, 222, 13, 187, 6, 196, 148, 13, 187, 4, - 63, 13, 187, 4, 250, 112, 13, 187, 4, 247, 207, 13, 187, 4, 240, 231, 13, - 187, 4, 69, 13, 187, 4, 236, 49, 13, 187, 4, 234, 190, 13, 187, 4, 233, - 15, 13, 187, 4, 68, 13, 187, 4, 225, 217, 13, 187, 4, 225, 80, 13, 187, - 4, 159, 13, 187, 4, 221, 136, 13, 187, 4, 218, 55, 13, 187, 4, 72, 13, - 187, 4, 214, 3, 13, 187, 4, 211, 167, 13, 187, 4, 144, 13, 187, 4, 209, - 80, 13, 187, 4, 203, 216, 13, 187, 4, 66, 13, 187, 4, 199, 230, 13, 187, - 4, 197, 199, 13, 187, 4, 196, 222, 13, 187, 4, 196, 148, 13, 187, 4, 195, - 158, 13, 237, 241, 6, 63, 13, 237, 241, 6, 250, 112, 13, 237, 241, 6, - 240, 231, 13, 237, 241, 6, 69, 13, 237, 241, 6, 236, 49, 13, 237, 241, 6, - 234, 190, 13, 237, 241, 6, 68, 13, 237, 241, 6, 225, 217, 13, 237, 241, - 6, 225, 80, 13, 237, 241, 6, 159, 13, 237, 241, 6, 221, 136, 13, 237, - 241, 6, 72, 13, 237, 241, 6, 209, 80, 13, 237, 241, 6, 203, 216, 13, 237, - 241, 6, 66, 13, 237, 241, 6, 199, 230, 13, 237, 241, 6, 197, 199, 13, - 237, 241, 6, 196, 222, 13, 237, 241, 6, 196, 148, 13, 237, 241, 4, 63, - 13, 237, 241, 4, 250, 112, 13, 237, 241, 4, 247, 207, 13, 237, 241, 4, - 240, 231, 13, 237, 241, 4, 69, 13, 237, 241, 4, 236, 49, 13, 237, 241, 4, - 234, 190, 13, 237, 241, 4, 233, 15, 13, 237, 241, 4, 68, 13, 237, 241, 4, - 225, 217, 13, 237, 241, 4, 225, 80, 13, 237, 241, 4, 159, 13, 237, 241, - 4, 221, 136, 13, 237, 241, 4, 218, 55, 13, 237, 241, 4, 72, 13, 237, 241, - 4, 214, 3, 13, 237, 241, 4, 211, 167, 13, 237, 241, 4, 144, 13, 237, 241, - 4, 209, 80, 13, 237, 241, 4, 203, 216, 13, 237, 241, 4, 66, 13, 237, 241, - 4, 199, 230, 13, 237, 241, 4, 197, 199, 13, 237, 241, 4, 196, 222, 13, - 237, 241, 4, 196, 148, 13, 237, 241, 4, 195, 158, 13, 27, 187, 6, 63, 13, - 27, 187, 6, 250, 112, 13, 27, 187, 6, 247, 207, 13, 27, 187, 6, 240, 231, - 13, 27, 187, 6, 69, 13, 27, 187, 6, 236, 49, 13, 27, 187, 6, 234, 190, - 13, 27, 187, 6, 233, 15, 13, 27, 187, 6, 68, 13, 27, 187, 6, 225, 217, - 13, 27, 187, 6, 225, 80, 13, 27, 187, 6, 159, 13, 27, 187, 6, 221, 136, - 13, 27, 187, 6, 218, 55, 13, 27, 187, 6, 72, 13, 27, 187, 6, 214, 3, 13, - 27, 187, 6, 211, 167, 13, 27, 187, 6, 144, 13, 27, 187, 6, 209, 80, 13, - 27, 187, 6, 203, 216, 13, 27, 187, 6, 66, 13, 27, 187, 6, 199, 230, 13, - 27, 187, 6, 197, 199, 13, 27, 187, 6, 196, 222, 13, 27, 187, 6, 196, 148, - 13, 27, 187, 6, 195, 158, 13, 27, 187, 4, 63, 13, 27, 187, 4, 250, 112, - 13, 27, 187, 4, 247, 207, 13, 27, 187, 4, 240, 231, 13, 27, 187, 4, 69, - 13, 27, 187, 4, 236, 49, 13, 27, 187, 4, 234, 190, 13, 27, 187, 4, 233, - 15, 13, 27, 187, 4, 68, 13, 27, 187, 4, 225, 217, 13, 27, 187, 4, 225, - 80, 13, 27, 187, 4, 159, 13, 27, 187, 4, 221, 136, 13, 27, 187, 4, 218, - 55, 13, 27, 187, 4, 72, 13, 27, 187, 4, 214, 3, 13, 27, 187, 4, 211, 167, - 13, 27, 187, 4, 144, 13, 27, 187, 4, 209, 80, 13, 27, 187, 4, 203, 216, - 13, 27, 187, 4, 66, 13, 27, 187, 4, 199, 230, 13, 27, 187, 4, 197, 199, - 13, 27, 187, 4, 196, 222, 13, 27, 187, 4, 196, 148, 13, 27, 187, 4, 195, - 158, 13, 45, 6, 63, 13, 45, 6, 250, 112, 13, 45, 6, 247, 207, 13, 45, 6, - 240, 231, 13, 45, 6, 69, 13, 45, 6, 236, 49, 13, 45, 6, 234, 190, 13, 45, - 6, 233, 15, 13, 45, 6, 68, 13, 45, 6, 225, 217, 13, 45, 6, 225, 80, 13, - 45, 6, 159, 13, 45, 6, 221, 136, 13, 45, 6, 218, 55, 13, 45, 6, 72, 13, - 45, 6, 214, 3, 13, 45, 6, 211, 167, 13, 45, 6, 144, 13, 45, 6, 209, 80, - 13, 45, 6, 203, 216, 13, 45, 6, 66, 13, 45, 6, 199, 230, 13, 45, 6, 197, - 199, 13, 45, 6, 196, 222, 13, 45, 6, 196, 148, 13, 45, 6, 195, 158, 13, - 45, 4, 63, 13, 45, 4, 250, 112, 13, 45, 4, 247, 207, 13, 45, 4, 240, 231, - 13, 45, 4, 69, 13, 45, 4, 236, 49, 13, 45, 4, 234, 190, 13, 45, 4, 233, - 15, 13, 45, 4, 68, 13, 45, 4, 225, 217, 13, 45, 4, 225, 80, 13, 45, 4, - 159, 13, 45, 4, 221, 136, 13, 45, 4, 218, 55, 13, 45, 4, 72, 13, 45, 4, - 214, 3, 13, 45, 4, 211, 167, 13, 45, 4, 144, 13, 45, 4, 209, 80, 13, 45, - 4, 203, 216, 13, 45, 4, 66, 13, 45, 4, 199, 230, 13, 45, 4, 197, 199, 13, - 45, 4, 196, 222, 13, 45, 4, 196, 148, 13, 45, 4, 195, 158, 13, 45, 27, 6, - 63, 13, 45, 27, 6, 250, 112, 13, 45, 27, 6, 247, 207, 13, 45, 27, 6, 240, - 231, 13, 45, 27, 6, 69, 13, 45, 27, 6, 236, 49, 13, 45, 27, 6, 234, 190, - 13, 45, 27, 6, 233, 15, 13, 45, 27, 6, 68, 13, 45, 27, 6, 225, 217, 13, - 45, 27, 6, 225, 80, 13, 45, 27, 6, 159, 13, 45, 27, 6, 221, 136, 13, 45, - 27, 6, 218, 55, 13, 45, 27, 6, 72, 13, 45, 27, 6, 214, 3, 13, 45, 27, 6, - 211, 167, 13, 45, 27, 6, 144, 13, 45, 27, 6, 209, 80, 13, 45, 27, 6, 203, - 216, 13, 45, 27, 6, 66, 13, 45, 27, 6, 199, 230, 13, 45, 27, 6, 197, 199, - 13, 45, 27, 6, 196, 222, 13, 45, 27, 6, 196, 148, 13, 45, 27, 6, 195, - 158, 13, 45, 27, 4, 63, 13, 45, 27, 4, 250, 112, 13, 45, 27, 4, 247, 207, - 13, 45, 27, 4, 240, 231, 13, 45, 27, 4, 69, 13, 45, 27, 4, 236, 49, 13, - 45, 27, 4, 234, 190, 13, 45, 27, 4, 233, 15, 13, 45, 27, 4, 68, 13, 45, - 27, 4, 225, 217, 13, 45, 27, 4, 225, 80, 13, 45, 27, 4, 159, 13, 45, 27, - 4, 221, 136, 13, 45, 27, 4, 218, 55, 13, 45, 27, 4, 72, 13, 45, 27, 4, - 214, 3, 13, 45, 27, 4, 211, 167, 13, 45, 27, 4, 144, 13, 45, 27, 4, 209, - 80, 13, 45, 27, 4, 203, 216, 13, 45, 27, 4, 66, 13, 45, 27, 4, 199, 230, - 13, 45, 27, 4, 197, 199, 13, 45, 27, 4, 196, 222, 13, 45, 27, 4, 196, - 148, 13, 45, 27, 4, 195, 158, 13, 45, 41, 6, 63, 13, 45, 41, 6, 250, 112, - 13, 45, 41, 6, 247, 207, 13, 45, 41, 6, 240, 231, 13, 45, 41, 6, 69, 13, - 45, 41, 6, 236, 49, 13, 45, 41, 6, 234, 190, 13, 45, 41, 6, 233, 15, 13, - 45, 41, 6, 68, 13, 45, 41, 6, 225, 217, 13, 45, 41, 6, 225, 80, 13, 45, - 41, 6, 159, 13, 45, 41, 6, 221, 136, 13, 45, 41, 6, 218, 55, 13, 45, 41, - 6, 72, 13, 45, 41, 6, 214, 3, 13, 45, 41, 6, 211, 167, 13, 45, 41, 6, - 144, 13, 45, 41, 6, 209, 80, 13, 45, 41, 6, 203, 216, 13, 45, 41, 6, 66, - 13, 45, 41, 6, 199, 230, 13, 45, 41, 6, 197, 199, 13, 45, 41, 6, 196, - 222, 13, 45, 41, 6, 196, 148, 13, 45, 41, 6, 195, 158, 13, 45, 41, 4, 63, - 13, 45, 41, 4, 250, 112, 13, 45, 41, 4, 247, 207, 13, 45, 41, 4, 240, - 231, 13, 45, 41, 4, 69, 13, 45, 41, 4, 236, 49, 13, 45, 41, 4, 234, 190, - 13, 45, 41, 4, 233, 15, 13, 45, 41, 4, 68, 13, 45, 41, 4, 225, 217, 13, - 45, 41, 4, 225, 80, 13, 45, 41, 4, 159, 13, 45, 41, 4, 221, 136, 13, 45, - 41, 4, 218, 55, 13, 45, 41, 4, 72, 13, 45, 41, 4, 214, 3, 13, 45, 41, 4, - 211, 167, 13, 45, 41, 4, 144, 13, 45, 41, 4, 209, 80, 13, 45, 41, 4, 203, - 216, 13, 45, 41, 4, 66, 13, 45, 41, 4, 199, 230, 13, 45, 41, 4, 197, 199, - 13, 45, 41, 4, 196, 222, 13, 45, 41, 4, 196, 148, 13, 45, 41, 4, 195, - 158, 13, 45, 27, 41, 6, 63, 13, 45, 27, 41, 6, 250, 112, 13, 45, 27, 41, - 6, 247, 207, 13, 45, 27, 41, 6, 240, 231, 13, 45, 27, 41, 6, 69, 13, 45, - 27, 41, 6, 236, 49, 13, 45, 27, 41, 6, 234, 190, 13, 45, 27, 41, 6, 233, - 15, 13, 45, 27, 41, 6, 68, 13, 45, 27, 41, 6, 225, 217, 13, 45, 27, 41, - 6, 225, 80, 13, 45, 27, 41, 6, 159, 13, 45, 27, 41, 6, 221, 136, 13, 45, - 27, 41, 6, 218, 55, 13, 45, 27, 41, 6, 72, 13, 45, 27, 41, 6, 214, 3, 13, - 45, 27, 41, 6, 211, 167, 13, 45, 27, 41, 6, 144, 13, 45, 27, 41, 6, 209, - 80, 13, 45, 27, 41, 6, 203, 216, 13, 45, 27, 41, 6, 66, 13, 45, 27, 41, - 6, 199, 230, 13, 45, 27, 41, 6, 197, 199, 13, 45, 27, 41, 6, 196, 222, - 13, 45, 27, 41, 6, 196, 148, 13, 45, 27, 41, 6, 195, 158, 13, 45, 27, 41, - 4, 63, 13, 45, 27, 41, 4, 250, 112, 13, 45, 27, 41, 4, 247, 207, 13, 45, - 27, 41, 4, 240, 231, 13, 45, 27, 41, 4, 69, 13, 45, 27, 41, 4, 236, 49, - 13, 45, 27, 41, 4, 234, 190, 13, 45, 27, 41, 4, 233, 15, 13, 45, 27, 41, - 4, 68, 13, 45, 27, 41, 4, 225, 217, 13, 45, 27, 41, 4, 225, 80, 13, 45, - 27, 41, 4, 159, 13, 45, 27, 41, 4, 221, 136, 13, 45, 27, 41, 4, 218, 55, - 13, 45, 27, 41, 4, 72, 13, 45, 27, 41, 4, 214, 3, 13, 45, 27, 41, 4, 211, - 167, 13, 45, 27, 41, 4, 144, 13, 45, 27, 41, 4, 209, 80, 13, 45, 27, 41, - 4, 203, 216, 13, 45, 27, 41, 4, 66, 13, 45, 27, 41, 4, 199, 230, 13, 45, - 27, 41, 4, 197, 199, 13, 45, 27, 41, 4, 196, 222, 13, 45, 27, 41, 4, 196, - 148, 13, 45, 27, 41, 4, 195, 158, 13, 218, 201, 6, 63, 13, 218, 201, 6, - 250, 112, 13, 218, 201, 6, 247, 207, 13, 218, 201, 6, 240, 231, 13, 218, - 201, 6, 69, 13, 218, 201, 6, 236, 49, 13, 218, 201, 6, 234, 190, 13, 218, - 201, 6, 233, 15, 13, 218, 201, 6, 68, 13, 218, 201, 6, 225, 217, 13, 218, - 201, 6, 225, 80, 13, 218, 201, 6, 159, 13, 218, 201, 6, 221, 136, 13, - 218, 201, 6, 218, 55, 13, 218, 201, 6, 72, 13, 218, 201, 6, 214, 3, 13, - 218, 201, 6, 211, 167, 13, 218, 201, 6, 144, 13, 218, 201, 6, 209, 80, - 13, 218, 201, 6, 203, 216, 13, 218, 201, 6, 66, 13, 218, 201, 6, 199, - 230, 13, 218, 201, 6, 197, 199, 13, 218, 201, 6, 196, 222, 13, 218, 201, - 6, 196, 148, 13, 218, 201, 6, 195, 158, 13, 218, 201, 4, 63, 13, 218, - 201, 4, 250, 112, 13, 218, 201, 4, 247, 207, 13, 218, 201, 4, 240, 231, - 13, 218, 201, 4, 69, 13, 218, 201, 4, 236, 49, 13, 218, 201, 4, 234, 190, - 13, 218, 201, 4, 233, 15, 13, 218, 201, 4, 68, 13, 218, 201, 4, 225, 217, - 13, 218, 201, 4, 225, 80, 13, 218, 201, 4, 159, 13, 218, 201, 4, 221, - 136, 13, 218, 201, 4, 218, 55, 13, 218, 201, 4, 72, 13, 218, 201, 4, 214, - 3, 13, 218, 201, 4, 211, 167, 13, 218, 201, 4, 144, 13, 218, 201, 4, 209, - 80, 13, 218, 201, 4, 203, 216, 13, 218, 201, 4, 66, 13, 218, 201, 4, 199, - 230, 13, 218, 201, 4, 197, 199, 13, 218, 201, 4, 196, 222, 13, 218, 201, - 4, 196, 148, 13, 218, 201, 4, 195, 158, 13, 41, 4, 238, 252, 68, 13, 41, - 4, 238, 252, 225, 217, 13, 27, 6, 251, 134, 13, 27, 6, 248, 206, 13, 27, - 6, 234, 94, 13, 27, 6, 239, 212, 13, 27, 6, 236, 174, 13, 27, 6, 195, 78, - 13, 27, 6, 236, 126, 13, 27, 6, 202, 199, 13, 27, 6, 226, 7, 13, 27, 6, - 225, 2, 13, 27, 6, 222, 245, 13, 27, 6, 218, 145, 13, 27, 6, 215, 186, - 13, 27, 6, 196, 196, 13, 27, 6, 214, 122, 13, 27, 6, 212, 220, 13, 27, 6, - 210, 74, 13, 27, 6, 202, 200, 105, 13, 27, 6, 206, 86, 13, 27, 6, 203, - 89, 13, 27, 6, 200, 28, 13, 27, 6, 212, 246, 13, 27, 6, 245, 75, 13, 27, - 6, 211, 238, 13, 27, 6, 214, 124, 13, 27, 217, 239, 13, 27, 4, 251, 134, - 13, 27, 4, 248, 206, 13, 27, 4, 234, 94, 13, 27, 4, 239, 212, 13, 27, 4, - 236, 174, 13, 27, 4, 195, 78, 13, 27, 4, 236, 126, 13, 27, 4, 202, 199, - 13, 27, 4, 226, 7, 13, 27, 4, 225, 2, 13, 27, 4, 222, 245, 13, 27, 4, - 218, 145, 13, 27, 4, 215, 186, 13, 27, 4, 196, 196, 13, 27, 4, 214, 122, - 13, 27, 4, 212, 220, 13, 27, 4, 210, 74, 13, 27, 4, 48, 206, 86, 13, 27, - 4, 206, 86, 13, 27, 4, 203, 89, 13, 27, 4, 200, 28, 13, 27, 4, 212, 246, - 13, 27, 4, 245, 75, 13, 27, 4, 211, 238, 13, 27, 4, 214, 124, 13, 27, - 213, 132, 239, 124, 13, 27, 236, 175, 105, 13, 27, 202, 200, 105, 13, 27, - 225, 3, 105, 13, 27, 212, 247, 105, 13, 27, 210, 75, 105, 13, 27, 212, - 221, 105, 13, 41, 6, 251, 134, 13, 41, 6, 248, 206, 13, 41, 6, 234, 94, - 13, 41, 6, 239, 212, 13, 41, 6, 236, 174, 13, 41, 6, 195, 78, 13, 41, 6, - 236, 126, 13, 41, 6, 202, 199, 13, 41, 6, 226, 7, 13, 41, 6, 225, 2, 13, - 41, 6, 222, 245, 13, 41, 6, 218, 145, 13, 41, 6, 215, 186, 13, 41, 6, - 196, 196, 13, 41, 6, 214, 122, 13, 41, 6, 212, 220, 13, 41, 6, 210, 74, - 13, 41, 6, 202, 200, 105, 13, 41, 6, 206, 86, 13, 41, 6, 203, 89, 13, 41, - 6, 200, 28, 13, 41, 6, 212, 246, 13, 41, 6, 245, 75, 13, 41, 6, 211, 238, - 13, 41, 6, 214, 124, 13, 41, 217, 239, 13, 41, 4, 251, 134, 13, 41, 4, - 248, 206, 13, 41, 4, 234, 94, 13, 41, 4, 239, 212, 13, 41, 4, 236, 174, - 13, 41, 4, 195, 78, 13, 41, 4, 236, 126, 13, 41, 4, 202, 199, 13, 41, 4, - 226, 7, 13, 41, 4, 225, 2, 13, 41, 4, 222, 245, 13, 41, 4, 218, 145, 13, - 41, 4, 215, 186, 13, 41, 4, 196, 196, 13, 41, 4, 214, 122, 13, 41, 4, - 212, 220, 13, 41, 4, 210, 74, 13, 41, 4, 48, 206, 86, 13, 41, 4, 206, 86, - 13, 41, 4, 203, 89, 13, 41, 4, 200, 28, 13, 41, 4, 212, 246, 13, 41, 4, - 245, 75, 13, 41, 4, 211, 238, 13, 41, 4, 214, 124, 13, 41, 213, 132, 239, - 124, 13, 41, 236, 175, 105, 13, 41, 202, 200, 105, 13, 41, 225, 3, 105, - 13, 41, 212, 247, 105, 13, 41, 210, 75, 105, 13, 41, 212, 221, 105, 13, - 27, 41, 6, 251, 134, 13, 27, 41, 6, 248, 206, 13, 27, 41, 6, 234, 94, 13, - 27, 41, 6, 239, 212, 13, 27, 41, 6, 236, 174, 13, 27, 41, 6, 195, 78, 13, - 27, 41, 6, 236, 126, 13, 27, 41, 6, 202, 199, 13, 27, 41, 6, 226, 7, 13, - 27, 41, 6, 225, 2, 13, 27, 41, 6, 222, 245, 13, 27, 41, 6, 218, 145, 13, - 27, 41, 6, 215, 186, 13, 27, 41, 6, 196, 196, 13, 27, 41, 6, 214, 122, - 13, 27, 41, 6, 212, 220, 13, 27, 41, 6, 210, 74, 13, 27, 41, 6, 202, 200, - 105, 13, 27, 41, 6, 206, 86, 13, 27, 41, 6, 203, 89, 13, 27, 41, 6, 200, - 28, 13, 27, 41, 6, 212, 246, 13, 27, 41, 6, 245, 75, 13, 27, 41, 6, 211, - 238, 13, 27, 41, 6, 214, 124, 13, 27, 41, 217, 239, 13, 27, 41, 4, 251, - 134, 13, 27, 41, 4, 248, 206, 13, 27, 41, 4, 234, 94, 13, 27, 41, 4, 239, - 212, 13, 27, 41, 4, 236, 174, 13, 27, 41, 4, 195, 78, 13, 27, 41, 4, 236, - 126, 13, 27, 41, 4, 202, 199, 13, 27, 41, 4, 226, 7, 13, 27, 41, 4, 225, - 2, 13, 27, 41, 4, 222, 245, 13, 27, 41, 4, 218, 145, 13, 27, 41, 4, 215, - 186, 13, 27, 41, 4, 196, 196, 13, 27, 41, 4, 214, 122, 13, 27, 41, 4, - 212, 220, 13, 27, 41, 4, 210, 74, 13, 27, 41, 4, 48, 206, 86, 13, 27, 41, - 4, 206, 86, 13, 27, 41, 4, 203, 89, 13, 27, 41, 4, 200, 28, 13, 27, 41, - 4, 212, 246, 13, 27, 41, 4, 245, 75, 13, 27, 41, 4, 211, 238, 13, 27, 41, - 4, 214, 124, 13, 27, 41, 213, 132, 239, 124, 13, 27, 41, 236, 175, 105, - 13, 27, 41, 202, 200, 105, 13, 27, 41, 225, 3, 105, 13, 27, 41, 212, 247, - 105, 13, 27, 41, 210, 75, 105, 13, 27, 41, 212, 221, 105, 13, 45, 27, 6, - 251, 134, 13, 45, 27, 6, 248, 206, 13, 45, 27, 6, 234, 94, 13, 45, 27, 6, - 239, 212, 13, 45, 27, 6, 236, 174, 13, 45, 27, 6, 195, 78, 13, 45, 27, 6, - 236, 126, 13, 45, 27, 6, 202, 199, 13, 45, 27, 6, 226, 7, 13, 45, 27, 6, - 225, 2, 13, 45, 27, 6, 222, 245, 13, 45, 27, 6, 218, 145, 13, 45, 27, 6, - 215, 186, 13, 45, 27, 6, 196, 196, 13, 45, 27, 6, 214, 122, 13, 45, 27, - 6, 212, 220, 13, 45, 27, 6, 210, 74, 13, 45, 27, 6, 202, 200, 105, 13, - 45, 27, 6, 206, 86, 13, 45, 27, 6, 203, 89, 13, 45, 27, 6, 200, 28, 13, - 45, 27, 6, 212, 246, 13, 45, 27, 6, 245, 75, 13, 45, 27, 6, 211, 238, 13, - 45, 27, 6, 214, 124, 13, 45, 27, 217, 239, 13, 45, 27, 4, 251, 134, 13, - 45, 27, 4, 248, 206, 13, 45, 27, 4, 234, 94, 13, 45, 27, 4, 239, 212, 13, - 45, 27, 4, 236, 174, 13, 45, 27, 4, 195, 78, 13, 45, 27, 4, 236, 126, 13, - 45, 27, 4, 202, 199, 13, 45, 27, 4, 226, 7, 13, 45, 27, 4, 225, 2, 13, - 45, 27, 4, 222, 245, 13, 45, 27, 4, 218, 145, 13, 45, 27, 4, 215, 186, - 13, 45, 27, 4, 196, 196, 13, 45, 27, 4, 214, 122, 13, 45, 27, 4, 212, - 220, 13, 45, 27, 4, 210, 74, 13, 45, 27, 4, 48, 206, 86, 13, 45, 27, 4, - 206, 86, 13, 45, 27, 4, 203, 89, 13, 45, 27, 4, 200, 28, 13, 45, 27, 4, - 212, 246, 13, 45, 27, 4, 245, 75, 13, 45, 27, 4, 211, 238, 13, 45, 27, 4, - 214, 124, 13, 45, 27, 213, 132, 239, 124, 13, 45, 27, 236, 175, 105, 13, - 45, 27, 202, 200, 105, 13, 45, 27, 225, 3, 105, 13, 45, 27, 212, 247, - 105, 13, 45, 27, 210, 75, 105, 13, 45, 27, 212, 221, 105, 13, 45, 27, 41, - 6, 251, 134, 13, 45, 27, 41, 6, 248, 206, 13, 45, 27, 41, 6, 234, 94, 13, - 45, 27, 41, 6, 239, 212, 13, 45, 27, 41, 6, 236, 174, 13, 45, 27, 41, 6, - 195, 78, 13, 45, 27, 41, 6, 236, 126, 13, 45, 27, 41, 6, 202, 199, 13, - 45, 27, 41, 6, 226, 7, 13, 45, 27, 41, 6, 225, 2, 13, 45, 27, 41, 6, 222, - 245, 13, 45, 27, 41, 6, 218, 145, 13, 45, 27, 41, 6, 215, 186, 13, 45, - 27, 41, 6, 196, 196, 13, 45, 27, 41, 6, 214, 122, 13, 45, 27, 41, 6, 212, - 220, 13, 45, 27, 41, 6, 210, 74, 13, 45, 27, 41, 6, 202, 200, 105, 13, - 45, 27, 41, 6, 206, 86, 13, 45, 27, 41, 6, 203, 89, 13, 45, 27, 41, 6, - 200, 28, 13, 45, 27, 41, 6, 212, 246, 13, 45, 27, 41, 6, 245, 75, 13, 45, - 27, 41, 6, 211, 238, 13, 45, 27, 41, 6, 214, 124, 13, 45, 27, 41, 217, - 239, 13, 45, 27, 41, 4, 251, 134, 13, 45, 27, 41, 4, 248, 206, 13, 45, - 27, 41, 4, 234, 94, 13, 45, 27, 41, 4, 239, 212, 13, 45, 27, 41, 4, 236, - 174, 13, 45, 27, 41, 4, 195, 78, 13, 45, 27, 41, 4, 236, 126, 13, 45, 27, - 41, 4, 202, 199, 13, 45, 27, 41, 4, 226, 7, 13, 45, 27, 41, 4, 225, 2, - 13, 45, 27, 41, 4, 222, 245, 13, 45, 27, 41, 4, 218, 145, 13, 45, 27, 41, - 4, 215, 186, 13, 45, 27, 41, 4, 196, 196, 13, 45, 27, 41, 4, 214, 122, - 13, 45, 27, 41, 4, 212, 220, 13, 45, 27, 41, 4, 210, 74, 13, 45, 27, 41, - 4, 48, 206, 86, 13, 45, 27, 41, 4, 206, 86, 13, 45, 27, 41, 4, 203, 89, - 13, 45, 27, 41, 4, 200, 28, 13, 45, 27, 41, 4, 212, 246, 13, 45, 27, 41, - 4, 245, 75, 13, 45, 27, 41, 4, 211, 238, 13, 45, 27, 41, 4, 214, 124, 13, - 45, 27, 41, 213, 132, 239, 124, 13, 45, 27, 41, 236, 175, 105, 13, 45, - 27, 41, 202, 200, 105, 13, 45, 27, 41, 225, 3, 105, 13, 45, 27, 41, 212, - 247, 105, 13, 45, 27, 41, 210, 75, 105, 13, 45, 27, 41, 212, 221, 105, - 13, 27, 6, 239, 118, 13, 27, 4, 239, 118, 13, 27, 17, 195, 79, 13, 27, - 17, 100, 13, 27, 17, 102, 13, 27, 17, 134, 13, 27, 17, 136, 13, 27, 17, - 146, 13, 27, 17, 167, 13, 27, 17, 178, 13, 27, 17, 171, 13, 27, 17, 182, - 13, 237, 241, 17, 195, 79, 13, 237, 241, 17, 100, 13, 237, 241, 17, 102, - 13, 237, 241, 17, 134, 13, 237, 241, 17, 136, 13, 237, 241, 17, 146, 13, - 237, 241, 17, 167, 13, 237, 241, 17, 178, 13, 237, 241, 17, 171, 13, 237, - 241, 17, 182, 13, 45, 17, 195, 79, 13, 45, 17, 100, 13, 45, 17, 102, 13, - 45, 17, 134, 13, 45, 17, 136, 13, 45, 17, 146, 13, 45, 17, 167, 13, 45, - 17, 178, 13, 45, 17, 171, 13, 45, 17, 182, 13, 45, 27, 17, 195, 79, 13, - 45, 27, 17, 100, 13, 45, 27, 17, 102, 13, 45, 27, 17, 134, 13, 45, 27, - 17, 136, 13, 45, 27, 17, 146, 13, 45, 27, 17, 167, 13, 45, 27, 17, 178, - 13, 45, 27, 17, 171, 13, 45, 27, 17, 182, 13, 218, 201, 17, 195, 79, 13, - 218, 201, 17, 100, 13, 218, 201, 17, 102, 13, 218, 201, 17, 134, 13, 218, - 201, 17, 136, 13, 218, 201, 17, 146, 13, 218, 201, 17, 167, 13, 218, 201, - 17, 178, 13, 218, 201, 17, 171, 13, 218, 201, 17, 182, 23, 139, 226, 72, - 23, 232, 206, 226, 72, 23, 232, 202, 226, 72, 23, 232, 191, 226, 72, 23, - 232, 195, 226, 72, 23, 232, 208, 226, 72, 23, 139, 132, 248, 217, 23, - 232, 206, 132, 248, 217, 23, 139, 162, 200, 64, 132, 248, 217, 23, 139, - 132, 210, 215, 224, 14, 23, 139, 132, 241, 23, 23, 139, 132, 232, 37, 23, - 139, 132, 232, 38, 221, 208, 23, 232, 206, 132, 232, 39, 23, 139, 132, - 219, 63, 23, 232, 206, 132, 219, 63, 23, 139, 132, 112, 248, 217, 23, - 139, 132, 112, 210, 215, 224, 13, 23, 139, 132, 112, 232, 37, 23, 139, - 132, 124, 112, 232, 37, 23, 139, 132, 232, 38, 112, 200, 36, 23, 139, - 132, 112, 241, 144, 23, 139, 132, 112, 241, 145, 132, 248, 217, 23, 139, - 132, 112, 241, 145, 112, 248, 217, 23, 139, 132, 112, 241, 145, 241, 23, - 23, 139, 132, 112, 241, 145, 232, 37, 23, 139, 132, 112, 241, 58, 23, - 232, 206, 132, 112, 241, 58, 23, 139, 112, 248, 218, 127, 226, 72, 23, - 139, 132, 248, 218, 127, 219, 63, 23, 139, 132, 112, 202, 141, 23, 232, - 206, 132, 112, 202, 141, 23, 139, 132, 112, 204, 218, 162, 248, 217, 23, - 139, 132, 112, 248, 218, 162, 204, 217, 23, 139, 132, 112, 162, 248, 217, - 23, 139, 132, 112, 232, 38, 205, 103, 162, 206, 97, 23, 139, 132, 124, - 112, 232, 38, 162, 206, 97, 23, 139, 132, 124, 112, 232, 38, 162, 241, - 144, 23, 139, 132, 232, 38, 112, 124, 162, 206, 97, 23, 139, 132, 112, - 124, 205, 103, 162, 235, 11, 23, 139, 132, 112, 162, 241, 23, 23, 139, - 132, 112, 162, 244, 248, 23, 139, 132, 112, 162, 231, 163, 23, 139, 132, - 112, 162, 232, 37, 23, 139, 162, 248, 204, 132, 112, 204, 217, 23, 139, - 132, 112, 241, 145, 162, 206, 97, 23, 139, 132, 112, 241, 145, 162, 206, - 98, 241, 144, 23, 139, 132, 112, 241, 145, 162, 206, 98, 248, 217, 23, - 139, 112, 162, 231, 164, 132, 200, 36, 23, 139, 132, 162, 231, 164, 112, - 200, 36, 23, 139, 132, 112, 241, 145, 232, 38, 162, 206, 97, 23, 139, - 132, 112, 241, 59, 162, 206, 97, 23, 139, 132, 112, 241, 145, 162, 235, - 11, 23, 139, 132, 112, 241, 145, 241, 24, 162, 235, 11, 23, 139, 112, - 162, 241, 24, 132, 200, 36, 23, 139, 132, 162, 241, 24, 112, 200, 36, 23, - 139, 112, 162, 46, 132, 200, 36, 23, 139, 112, 162, 46, 132, 232, 37, 23, - 139, 132, 162, 251, 89, 214, 35, 112, 200, 36, 23, 139, 132, 162, 251, - 89, 226, 87, 112, 200, 36, 23, 139, 132, 162, 46, 112, 200, 36, 23, 139, - 132, 112, 162, 241, 145, 232, 37, 23, 139, 132, 112, 162, 251, 89, 214, - 34, 23, 139, 132, 112, 162, 251, 88, 23, 139, 112, 162, 251, 89, 214, 35, - 132, 200, 36, 23, 139, 112, 162, 251, 89, 214, 35, 132, 241, 58, 23, 139, - 112, 162, 251, 89, 132, 200, 36, 23, 139, 132, 162, 231, 164, 112, 232, - 37, 23, 232, 197, 235, 7, 235, 122, 23, 232, 197, 235, 7, 235, 123, 248, - 217, 23, 232, 197, 235, 7, 235, 123, 232, 37, 23, 232, 197, 235, 7, 235, - 123, 241, 144, 23, 232, 197, 235, 7, 235, 123, 241, 145, 205, 112, 23, - 232, 204, 235, 7, 235, 123, 241, 144, 23, 139, 235, 7, 235, 123, 241, - 145, 248, 217, 23, 232, 195, 235, 7, 235, 123, 241, 144, 23, 232, 197, - 235, 101, 235, 123, 205, 102, 23, 232, 197, 232, 116, 235, 101, 235, 123, - 205, 102, 23, 232, 197, 235, 101, 235, 123, 205, 103, 235, 7, 248, 217, - 23, 232, 197, 232, 116, 235, 101, 235, 123, 205, 103, 235, 7, 248, 217, - 23, 232, 197, 235, 101, 235, 123, 205, 103, 248, 217, 23, 232, 197, 232, - 116, 235, 101, 235, 123, 205, 103, 248, 217, 23, 232, 197, 235, 101, 235, - 123, 205, 103, 162, 235, 11, 23, 232, 202, 235, 101, 235, 123, 205, 102, - 23, 232, 202, 235, 101, 235, 123, 205, 103, 214, 92, 23, 232, 195, 235, - 101, 235, 123, 205, 103, 214, 92, 23, 232, 191, 235, 101, 235, 123, 205, - 102, 23, 232, 197, 235, 101, 235, 123, 205, 103, 232, 37, 23, 232, 197, - 235, 101, 235, 123, 205, 103, 232, 38, 162, 206, 97, 23, 232, 197, 235, - 101, 235, 123, 205, 103, 232, 38, 216, 51, 202, 141, 23, 232, 196, 23, - 232, 197, 248, 204, 213, 207, 235, 225, 23, 232, 197, 232, 115, 23, 232, - 197, 162, 206, 97, 23, 232, 197, 232, 116, 162, 206, 97, 23, 232, 197, - 162, 248, 217, 23, 232, 197, 162, 235, 11, 23, 232, 197, 205, 113, 132, - 162, 206, 97, 23, 232, 197, 205, 113, 247, 36, 23, 232, 197, 205, 113, - 247, 37, 162, 206, 97, 23, 232, 197, 205, 113, 247, 37, 162, 206, 98, - 248, 217, 23, 232, 197, 205, 113, 222, 46, 23, 232, 203, 23, 232, 204, - 162, 206, 97, 23, 232, 204, 216, 51, 202, 141, 23, 232, 204, 162, 235, - 11, 23, 232, 193, 241, 20, 23, 232, 192, 23, 232, 202, 214, 92, 23, 232, - 201, 23, 232, 202, 192, 162, 206, 97, 23, 232, 202, 162, 206, 97, 23, - 232, 202, 192, 216, 51, 202, 141, 23, 232, 202, 216, 51, 202, 141, 23, - 232, 202, 192, 162, 235, 11, 23, 232, 202, 162, 235, 11, 23, 232, 200, - 214, 92, 23, 232, 199, 23, 232, 205, 23, 232, 190, 23, 232, 191, 162, - 206, 97, 23, 232, 191, 216, 51, 202, 141, 23, 232, 191, 162, 235, 11, 23, - 232, 195, 214, 92, 23, 232, 195, 192, 162, 235, 11, 23, 232, 194, 23, - 232, 195, 205, 224, 23, 232, 195, 192, 162, 206, 97, 23, 232, 195, 162, - 206, 97, 23, 232, 195, 192, 216, 51, 202, 141, 23, 232, 195, 216, 51, - 202, 141, 23, 232, 195, 162, 206, 98, 201, 225, 226, 72, 23, 232, 195, - 162, 248, 204, 112, 210, 2, 23, 232, 207, 23, 139, 132, 112, 210, 2, 23, - 232, 206, 132, 112, 210, 2, 23, 232, 195, 132, 112, 210, 2, 23, 232, 208, - 132, 112, 210, 2, 23, 232, 195, 222, 46, 23, 139, 132, 112, 210, 3, 248, - 217, 23, 139, 132, 112, 210, 3, 241, 144, 23, 232, 195, 132, 112, 210, 3, - 241, 144, 23, 139, 222, 47, 237, 235, 23, 139, 222, 47, 135, 209, 253, - 204, 217, 23, 139, 222, 47, 135, 209, 253, 241, 9, 23, 139, 222, 47, 135, - 214, 45, 244, 248, 23, 139, 222, 47, 200, 36, 23, 139, 162, 200, 64, 222, - 47, 200, 36, 23, 232, 206, 222, 47, 200, 36, 23, 232, 191, 222, 47, 200, - 36, 23, 232, 208, 222, 47, 200, 36, 23, 139, 222, 47, 210, 215, 224, 14, - 23, 139, 222, 47, 248, 217, 23, 139, 222, 47, 201, 226, 202, 141, 23, - 139, 222, 47, 202, 141, 23, 232, 195, 222, 47, 202, 141, 23, 139, 222, - 47, 132, 202, 141, 23, 232, 195, 222, 47, 132, 202, 141, 23, 232, 208, - 222, 47, 132, 162, 132, 162, 214, 34, 23, 232, 208, 222, 47, 132, 162, - 132, 202, 141, 23, 139, 222, 47, 226, 72, 23, 232, 206, 222, 47, 226, 72, - 23, 232, 195, 222, 47, 226, 72, 23, 232, 208, 222, 47, 226, 72, 23, 139, - 132, 112, 222, 46, 23, 232, 206, 132, 112, 222, 46, 23, 232, 195, 132, - 112, 222, 46, 23, 232, 195, 210, 2, 23, 232, 208, 132, 112, 222, 46, 23, - 139, 132, 112, 241, 62, 222, 46, 23, 232, 206, 132, 112, 241, 62, 222, - 46, 23, 139, 210, 3, 237, 235, 23, 232, 195, 210, 3, 135, 132, 162, 231, - 165, 219, 63, 23, 232, 208, 210, 3, 135, 112, 162, 132, 241, 61, 23, 139, - 210, 3, 200, 36, 23, 139, 210, 3, 210, 215, 224, 14, 23, 139, 210, 3, - 222, 46, 23, 232, 206, 210, 3, 222, 46, 23, 232, 191, 210, 3, 222, 46, - 23, 232, 208, 210, 3, 222, 46, 23, 139, 210, 3, 219, 63, 23, 139, 210, 3, - 112, 241, 144, 23, 139, 210, 3, 112, 210, 215, 224, 13, 23, 139, 210, 3, - 226, 72, 23, 139, 210, 3, 202, 141, 23, 232, 193, 210, 3, 202, 141, 23, - 139, 132, 210, 3, 222, 46, 23, 232, 206, 132, 210, 3, 222, 46, 23, 232, - 200, 132, 210, 3, 222, 47, 214, 119, 23, 232, 193, 132, 210, 3, 222, 47, - 214, 34, 23, 232, 193, 132, 210, 3, 222, 47, 226, 86, 23, 232, 193, 132, - 210, 3, 222, 47, 200, 63, 23, 232, 202, 132, 210, 3, 222, 46, 23, 232, - 195, 132, 210, 3, 222, 46, 23, 232, 208, 132, 210, 3, 222, 47, 214, 34, - 23, 232, 208, 132, 210, 3, 222, 46, 23, 139, 112, 237, 235, 23, 232, 195, - 219, 63, 23, 139, 112, 200, 36, 23, 232, 206, 112, 200, 36, 23, 139, 112, - 210, 215, 224, 14, 23, 139, 112, 124, 162, 206, 97, 23, 232, 193, 112, - 202, 141, 23, 139, 112, 162, 222, 46, 23, 139, 112, 222, 46, 23, 139, - 112, 210, 3, 222, 46, 23, 232, 206, 112, 210, 3, 222, 46, 23, 232, 200, - 112, 210, 3, 222, 47, 214, 119, 23, 232, 202, 112, 210, 3, 222, 46, 23, - 232, 195, 112, 210, 3, 222, 46, 23, 232, 208, 112, 210, 3, 222, 47, 214, - 34, 23, 232, 208, 112, 210, 3, 222, 47, 226, 86, 23, 232, 208, 112, 210, - 3, 222, 46, 23, 232, 206, 112, 210, 3, 222, 47, 248, 217, 23, 232, 204, - 112, 210, 3, 222, 47, 241, 144, 23, 232, 204, 112, 210, 3, 222, 47, 241, - 145, 206, 97, 23, 232, 193, 112, 210, 3, 222, 47, 241, 145, 214, 34, 23, - 232, 193, 112, 210, 3, 222, 47, 241, 145, 226, 86, 23, 232, 193, 112, - 210, 3, 222, 47, 241, 144, 23, 232, 195, 132, 232, 37, 23, 139, 132, 162, - 206, 97, 23, 232, 195, 132, 162, 206, 97, 23, 139, 132, 162, 206, 98, - 162, 239, 146, 23, 139, 132, 162, 206, 98, 162, 241, 144, 23, 139, 132, - 162, 206, 98, 162, 248, 217, 23, 139, 132, 162, 206, 98, 132, 248, 217, - 23, 139, 132, 162, 206, 98, 248, 88, 248, 217, 23, 139, 132, 162, 206, - 98, 132, 232, 39, 23, 139, 132, 162, 235, 12, 132, 204, 217, 23, 139, - 132, 162, 235, 12, 132, 248, 217, 23, 139, 132, 162, 122, 23, 139, 132, - 162, 241, 20, 23, 139, 132, 162, 241, 12, 162, 226, 41, 23, 232, 204, - 132, 162, 241, 12, 162, 226, 41, 23, 139, 132, 162, 241, 12, 162, 200, - 63, 23, 139, 132, 162, 244, 249, 23, 232, 202, 132, 202, 141, 23, 232, - 202, 132, 162, 214, 92, 23, 232, 195, 132, 162, 214, 92, 23, 232, 195, - 132, 162, 222, 227, 23, 232, 195, 132, 202, 141, 23, 232, 195, 132, 162, - 205, 224, 23, 232, 208, 132, 162, 214, 34, 23, 232, 208, 132, 162, 226, - 86, 23, 232, 208, 132, 202, 141, 23, 139, 202, 141, 23, 139, 162, 232, - 115, 23, 139, 162, 206, 98, 239, 146, 23, 139, 162, 206, 98, 241, 144, - 23, 139, 162, 206, 98, 248, 217, 23, 139, 162, 235, 11, 23, 139, 162, - 248, 204, 132, 219, 63, 23, 139, 162, 248, 204, 112, 210, 2, 23, 139, - 162, 248, 204, 210, 3, 222, 46, 23, 139, 162, 200, 64, 99, 235, 122, 23, - 139, 162, 127, 99, 235, 122, 23, 139, 162, 200, 64, 115, 235, 122, 23, - 139, 162, 200, 64, 235, 7, 235, 122, 23, 139, 162, 127, 235, 7, 210, 215, - 224, 13, 23, 232, 198, 23, 139, 232, 115, 23, 201, 227, 206, 61, 23, 201, - 227, 218, 119, 23, 201, 227, 248, 203, 23, 233, 105, 206, 61, 23, 233, - 105, 218, 119, 23, 233, 105, 248, 203, 23, 204, 201, 206, 61, 23, 204, - 201, 218, 119, 23, 204, 201, 248, 203, 23, 248, 29, 206, 61, 23, 248, 29, - 218, 119, 23, 248, 29, 248, 203, 23, 209, 132, 206, 61, 23, 209, 132, - 218, 119, 23, 209, 132, 248, 203, 23, 204, 84, 203, 249, 23, 204, 84, - 248, 203, 23, 205, 90, 222, 228, 206, 61, 23, 205, 90, 4, 206, 61, 23, - 205, 90, 222, 228, 218, 119, 23, 205, 90, 4, 218, 119, 23, 205, 90, 207, - 86, 23, 235, 73, 222, 228, 206, 61, 23, 235, 73, 4, 206, 61, 23, 235, 73, - 222, 228, 218, 119, 23, 235, 73, 4, 218, 119, 23, 235, 73, 207, 86, 23, - 205, 90, 235, 73, 251, 128, 23, 218, 157, 124, 135, 222, 227, 23, 218, - 157, 124, 135, 205, 224, 23, 218, 157, 124, 207, 86, 23, 218, 157, 135, - 207, 86, 23, 218, 157, 124, 135, 251, 129, 222, 227, 23, 218, 157, 124, - 135, 251, 129, 205, 224, 23, 218, 157, 206, 98, 202, 30, 206, 98, 208, - 161, 23, 218, 156, 235, 128, 241, 134, 23, 218, 158, 235, 128, 241, 134, - 23, 218, 156, 206, 62, 204, 218, 205, 224, 23, 218, 156, 206, 62, 204, - 218, 219, 189, 23, 218, 156, 206, 62, 204, 218, 222, 227, 23, 218, 156, - 206, 62, 204, 218, 222, 225, 23, 218, 156, 206, 62, 196, 247, 235, 76, - 23, 218, 156, 52, 204, 217, 23, 218, 156, 52, 196, 247, 235, 76, 23, 218, - 156, 52, 251, 128, 23, 218, 156, 52, 251, 129, 196, 247, 235, 76, 23, - 218, 156, 241, 61, 23, 218, 156, 201, 165, 204, 218, 218, 160, 23, 218, - 156, 201, 165, 196, 247, 235, 76, 23, 218, 156, 201, 165, 251, 128, 23, - 218, 156, 201, 165, 251, 129, 196, 247, 235, 76, 23, 218, 156, 248, 222, - 205, 224, 23, 218, 156, 248, 222, 219, 189, 23, 218, 156, 248, 222, 222, - 227, 23, 218, 156, 241, 102, 205, 224, 23, 218, 156, 241, 102, 219, 189, - 23, 218, 156, 241, 102, 222, 227, 23, 218, 156, 241, 102, 209, 192, 23, - 218, 156, 245, 102, 205, 224, 23, 218, 156, 245, 102, 219, 189, 23, 218, - 156, 245, 102, 222, 227, 23, 218, 156, 111, 205, 224, 23, 218, 156, 111, - 219, 189, 23, 218, 156, 111, 222, 227, 23, 218, 156, 195, 24, 205, 224, - 23, 218, 156, 195, 24, 219, 189, 23, 218, 156, 195, 24, 222, 227, 23, - 218, 156, 213, 87, 205, 224, 23, 218, 156, 213, 87, 219, 189, 23, 218, - 156, 213, 87, 222, 227, 23, 201, 195, 209, 190, 206, 61, 23, 201, 195, - 209, 190, 237, 245, 23, 201, 195, 209, 190, 251, 128, 23, 201, 195, 209, - 191, 206, 61, 23, 201, 195, 209, 191, 237, 245, 23, 201, 195, 209, 191, - 251, 128, 23, 201, 195, 207, 30, 23, 201, 195, 250, 232, 205, 121, 206, - 61, 23, 201, 195, 250, 232, 205, 121, 237, 245, 23, 201, 195, 250, 232, - 205, 121, 201, 164, 23, 218, 159, 250, 126, 205, 224, 23, 218, 159, 250, - 126, 219, 189, 23, 218, 159, 250, 126, 222, 227, 23, 218, 159, 250, 126, - 222, 225, 23, 218, 159, 201, 221, 205, 224, 23, 218, 159, 201, 221, 219, - 189, 23, 218, 159, 201, 221, 222, 227, 23, 218, 159, 201, 221, 222, 225, - 23, 218, 159, 248, 204, 250, 126, 205, 224, 23, 218, 159, 248, 204, 250, - 126, 219, 189, 23, 218, 159, 248, 204, 250, 126, 222, 227, 23, 218, 159, - 248, 204, 250, 126, 222, 225, 23, 218, 159, 248, 204, 201, 221, 205, 224, - 23, 218, 159, 248, 204, 201, 221, 219, 189, 23, 218, 159, 248, 204, 201, - 221, 222, 227, 23, 218, 159, 248, 204, 201, 221, 222, 225, 23, 218, 158, - 206, 62, 204, 218, 205, 224, 23, 218, 158, 206, 62, 204, 218, 219, 189, - 23, 218, 158, 206, 62, 204, 218, 222, 227, 23, 218, 158, 206, 62, 204, - 218, 222, 225, 23, 218, 158, 206, 62, 196, 247, 235, 76, 23, 218, 158, - 52, 204, 217, 23, 218, 158, 52, 196, 247, 235, 76, 23, 218, 158, 52, 251, - 128, 23, 218, 158, 52, 251, 129, 196, 247, 235, 76, 23, 218, 158, 241, - 61, 23, 218, 158, 201, 165, 204, 218, 218, 160, 23, 218, 158, 201, 165, - 196, 247, 235, 76, 23, 218, 158, 201, 165, 251, 129, 218, 160, 23, 218, - 158, 201, 165, 251, 129, 196, 247, 235, 76, 23, 218, 158, 248, 221, 23, - 218, 158, 241, 102, 205, 224, 23, 218, 158, 241, 102, 219, 189, 23, 218, - 158, 241, 102, 222, 227, 23, 218, 158, 245, 101, 23, 218, 158, 111, 205, - 224, 23, 218, 158, 111, 219, 189, 23, 218, 158, 111, 222, 227, 23, 218, - 158, 195, 24, 205, 224, 23, 218, 158, 195, 24, 219, 189, 23, 218, 158, - 195, 24, 222, 227, 23, 218, 158, 213, 87, 205, 224, 23, 218, 158, 213, - 87, 219, 189, 23, 218, 158, 213, 87, 222, 227, 23, 201, 196, 209, 191, - 206, 61, 23, 201, 196, 209, 191, 237, 245, 23, 201, 196, 209, 191, 251, - 128, 23, 201, 196, 209, 190, 206, 61, 23, 201, 196, 209, 190, 237, 245, - 23, 201, 196, 209, 190, 251, 128, 23, 201, 196, 207, 30, 23, 218, 156, - 241, 12, 211, 88, 205, 224, 23, 218, 156, 241, 12, 211, 88, 219, 189, 23, - 218, 156, 241, 12, 211, 88, 222, 227, 23, 218, 156, 241, 12, 211, 88, - 222, 225, 23, 218, 156, 241, 12, 232, 222, 205, 224, 23, 218, 156, 241, - 12, 232, 222, 219, 189, 23, 218, 156, 241, 12, 232, 222, 222, 227, 23, - 218, 156, 241, 12, 232, 222, 222, 225, 23, 218, 156, 241, 12, 202, 147, - 244, 250, 205, 224, 23, 218, 156, 241, 12, 202, 147, 244, 250, 219, 189, - 23, 218, 156, 231, 60, 205, 224, 23, 218, 156, 231, 60, 219, 189, 23, - 218, 156, 231, 60, 222, 227, 23, 218, 156, 221, 226, 205, 224, 23, 218, - 156, 221, 226, 219, 189, 23, 218, 156, 221, 226, 222, 227, 23, 218, 156, - 221, 226, 4, 237, 245, 23, 218, 156, 197, 123, 241, 12, 52, 205, 224, 23, - 218, 156, 197, 123, 241, 12, 52, 219, 189, 23, 218, 156, 197, 123, 241, - 12, 52, 222, 227, 23, 218, 156, 197, 123, 241, 12, 201, 165, 205, 224, - 23, 218, 156, 197, 123, 241, 12, 201, 165, 219, 189, 23, 218, 156, 197, - 123, 241, 12, 201, 165, 222, 227, 23, 218, 156, 241, 12, 202, 209, 204, - 217, 23, 218, 156, 241, 10, 241, 62, 205, 224, 23, 218, 156, 241, 10, - 241, 62, 219, 189, 23, 209, 190, 206, 61, 23, 209, 190, 237, 245, 23, - 209, 190, 251, 130, 23, 218, 156, 207, 30, 23, 218, 156, 241, 12, 232, - 30, 234, 234, 197, 148, 23, 218, 156, 231, 60, 232, 30, 234, 234, 197, - 148, 23, 218, 156, 221, 226, 232, 30, 234, 234, 197, 148, 23, 218, 156, - 197, 123, 232, 30, 234, 234, 197, 148, 23, 209, 190, 206, 62, 232, 30, - 234, 234, 197, 148, 23, 209, 190, 52, 232, 30, 234, 234, 197, 148, 23, - 209, 190, 251, 129, 232, 30, 234, 234, 197, 148, 23, 218, 156, 241, 12, - 232, 30, 245, 82, 23, 218, 156, 231, 60, 232, 30, 245, 82, 23, 218, 156, - 221, 226, 232, 30, 245, 82, 23, 218, 156, 197, 123, 232, 30, 245, 82, 23, - 209, 190, 206, 62, 232, 30, 245, 82, 23, 209, 190, 52, 232, 30, 245, 82, - 23, 209, 190, 251, 129, 232, 30, 245, 82, 23, 218, 156, 197, 123, 239, - 147, 213, 113, 205, 224, 23, 218, 156, 197, 123, 239, 147, 213, 113, 219, - 189, 23, 218, 156, 197, 123, 239, 147, 213, 113, 222, 227, 23, 218, 158, - 241, 12, 232, 30, 247, 46, 205, 224, 23, 218, 158, 241, 12, 232, 30, 247, - 46, 222, 227, 23, 218, 158, 231, 60, 232, 30, 247, 46, 4, 237, 245, 23, - 218, 158, 231, 60, 232, 30, 247, 46, 222, 228, 237, 245, 23, 218, 158, - 231, 60, 232, 30, 247, 46, 4, 201, 164, 23, 218, 158, 231, 60, 232, 30, - 247, 46, 222, 228, 201, 164, 23, 218, 158, 221, 226, 232, 30, 247, 46, 4, - 206, 61, 23, 218, 158, 221, 226, 232, 30, 247, 46, 222, 228, 206, 61, 23, - 218, 158, 221, 226, 232, 30, 247, 46, 4, 237, 245, 23, 218, 158, 221, - 226, 232, 30, 247, 46, 222, 228, 237, 245, 23, 218, 158, 197, 123, 232, - 30, 247, 46, 205, 224, 23, 218, 158, 197, 123, 232, 30, 247, 46, 222, - 227, 23, 209, 191, 206, 62, 232, 30, 247, 45, 23, 209, 191, 52, 232, 30, - 247, 45, 23, 209, 191, 251, 129, 232, 30, 247, 45, 23, 218, 158, 241, 12, - 232, 30, 235, 70, 205, 224, 23, 218, 158, 241, 12, 232, 30, 235, 70, 222, - 227, 23, 218, 158, 231, 60, 232, 30, 235, 70, 4, 237, 245, 23, 218, 158, - 231, 60, 232, 30, 235, 70, 222, 228, 237, 245, 23, 218, 158, 231, 60, - 232, 30, 235, 70, 201, 165, 4, 201, 164, 23, 218, 158, 231, 60, 232, 30, - 235, 70, 201, 165, 222, 228, 201, 164, 23, 218, 158, 221, 226, 232, 30, - 235, 70, 4, 206, 61, 23, 218, 158, 221, 226, 232, 30, 235, 70, 222, 228, - 206, 61, 23, 218, 158, 221, 226, 232, 30, 235, 70, 4, 237, 245, 23, 218, - 158, 221, 226, 232, 30, 235, 70, 222, 228, 237, 245, 23, 218, 158, 197, - 123, 232, 30, 235, 70, 205, 224, 23, 218, 158, 197, 123, 232, 30, 235, - 70, 222, 227, 23, 209, 191, 206, 62, 232, 30, 235, 69, 23, 209, 191, 52, - 232, 30, 235, 69, 23, 209, 191, 251, 129, 232, 30, 235, 69, 23, 218, 158, - 241, 12, 205, 224, 23, 218, 158, 241, 12, 219, 189, 23, 218, 158, 241, - 12, 222, 227, 23, 218, 158, 241, 12, 222, 225, 23, 218, 158, 241, 12, - 244, 163, 23, 218, 158, 231, 60, 205, 224, 23, 218, 158, 221, 226, 205, - 224, 23, 218, 158, 197, 123, 205, 212, 23, 218, 158, 197, 123, 205, 224, - 23, 218, 158, 197, 123, 222, 227, 23, 209, 191, 206, 61, 23, 209, 191, - 237, 245, 23, 209, 191, 251, 128, 23, 218, 158, 207, 31, 213, 145, 23, - 218, 156, 250, 232, 244, 250, 4, 206, 61, 23, 218, 156, 250, 232, 244, - 250, 219, 190, 206, 61, 23, 218, 156, 250, 232, 244, 250, 4, 237, 245, - 23, 218, 156, 250, 232, 244, 250, 219, 190, 237, 245, 23, 218, 158, 250, - 232, 244, 250, 232, 30, 197, 149, 4, 206, 61, 23, 218, 158, 250, 232, - 244, 250, 232, 30, 197, 149, 219, 190, 206, 61, 23, 218, 158, 250, 232, - 244, 250, 232, 30, 197, 149, 222, 228, 206, 61, 23, 218, 158, 250, 232, - 244, 250, 232, 30, 197, 149, 4, 237, 245, 23, 218, 158, 250, 232, 244, - 250, 232, 30, 197, 149, 219, 190, 237, 245, 23, 218, 158, 250, 232, 244, - 250, 232, 30, 197, 149, 222, 228, 237, 245, 23, 218, 156, 196, 247, 244, - 250, 234, 234, 206, 61, 23, 218, 156, 196, 247, 244, 250, 234, 234, 237, - 245, 23, 218, 158, 196, 247, 244, 250, 232, 30, 197, 149, 206, 61, 23, - 218, 158, 196, 247, 244, 250, 232, 30, 197, 149, 237, 245, 23, 218, 156, - 235, 128, 244, 247, 206, 61, 23, 218, 156, 235, 128, 244, 247, 237, 245, - 23, 218, 158, 235, 128, 244, 247, 232, 30, 197, 149, 206, 61, 23, 218, - 158, 235, 128, 244, 247, 232, 30, 197, 149, 237, 245, 23, 237, 161, 250, - 218, 205, 224, 23, 237, 161, 250, 218, 222, 227, 23, 237, 161, 235, 203, - 23, 237, 161, 205, 227, 23, 237, 161, 203, 16, 23, 237, 161, 210, 134, - 23, 237, 161, 206, 67, 23, 237, 161, 206, 68, 251, 128, 23, 237, 161, - 236, 99, 214, 46, 202, 78, 23, 237, 161, 233, 115, 23, 232, 137, 23, 232, - 138, 210, 7, 23, 232, 138, 218, 156, 204, 217, 23, 232, 138, 218, 156, - 202, 81, 23, 232, 138, 218, 158, 204, 217, 23, 232, 138, 218, 156, 241, - 11, 23, 232, 138, 218, 158, 241, 11, 23, 232, 138, 218, 161, 244, 249, - 23, 235, 234, 239, 85, 212, 79, 216, 21, 235, 12, 202, 79, 23, 235, 234, - 239, 85, 212, 79, 216, 21, 124, 214, 73, 237, 235, 23, 235, 234, 239, 85, - 212, 79, 216, 21, 124, 214, 73, 135, 202, 79, 23, 236, 65, 204, 218, 200, - 36, 23, 236, 65, 204, 218, 217, 84, 23, 236, 65, 204, 218, 237, 235, 23, - 237, 219, 236, 65, 217, 85, 237, 235, 23, 237, 219, 236, 65, 135, 217, - 84, 23, 237, 219, 236, 65, 124, 217, 84, 23, 237, 219, 236, 65, 217, 85, - 200, 36, 23, 235, 29, 217, 84, 23, 235, 29, 241, 134, 23, 235, 29, 196, - 250, 23, 236, 60, 214, 92, 23, 236, 60, 205, 89, 23, 236, 60, 244, 202, - 23, 236, 68, 248, 127, 206, 61, 23, 236, 68, 248, 127, 218, 119, 23, 236, - 60, 157, 214, 92, 23, 236, 60, 197, 62, 214, 92, 23, 236, 60, 157, 244, - 202, 23, 236, 60, 197, 60, 218, 160, 23, 236, 68, 197, 43, 23, 236, 61, - 200, 36, 23, 236, 61, 237, 235, 23, 236, 61, 235, 56, 23, 236, 63, 204, - 217, 23, 236, 63, 204, 218, 237, 245, 23, 236, 63, 204, 218, 251, 128, - 23, 236, 64, 204, 217, 23, 236, 64, 204, 218, 237, 245, 23, 236, 64, 204, - 218, 251, 128, 23, 236, 63, 241, 9, 23, 236, 64, 241, 9, 23, 236, 63, - 244, 244, 23, 245, 97, 211, 217, 23, 245, 97, 217, 84, 23, 245, 97, 204, - 131, 23, 203, 17, 245, 97, 232, 48, 23, 203, 17, 245, 97, 219, 63, 23, - 203, 17, 245, 97, 221, 208, 23, 237, 74, 23, 216, 21, 217, 84, 23, 216, - 21, 241, 134, 23, 216, 21, 196, 248, 23, 216, 21, 197, 57, 23, 251, 190, - 248, 120, 214, 34, 23, 251, 190, 204, 130, 226, 86, 23, 251, 190, 248, - 122, 4, 209, 189, 23, 251, 190, 204, 132, 4, 209, 189, 23, 248, 49, 226, - 58, 23, 248, 49, 236, 88, 23, 218, 165, 244, 203, 217, 84, 23, 218, 165, - 244, 203, 235, 11, 23, 218, 165, 244, 203, 241, 134, 23, 218, 165, 205, - 219, 23, 218, 165, 205, 220, 196, 250, 23, 218, 165, 205, 220, 214, 92, - 23, 218, 165, 234, 230, 23, 218, 165, 234, 231, 196, 250, 23, 218, 165, - 234, 231, 214, 92, 23, 218, 165, 192, 244, 249, 23, 218, 165, 192, 235, - 11, 23, 218, 165, 192, 196, 250, 23, 218, 165, 192, 214, 27, 23, 218, - 165, 192, 214, 28, 196, 250, 23, 218, 165, 192, 214, 28, 196, 77, 23, - 218, 165, 192, 210, 163, 23, 218, 165, 192, 210, 164, 196, 250, 23, 218, - 165, 192, 210, 164, 196, 77, 23, 218, 165, 224, 57, 23, 218, 165, 224, - 58, 235, 11, 23, 218, 165, 224, 58, 196, 250, 23, 218, 165, 203, 16, 23, - 218, 165, 203, 17, 235, 11, 23, 218, 165, 203, 17, 204, 131, 23, 222, 60, - 212, 23, 202, 19, 23, 222, 62, 221, 203, 127, 200, 32, 23, 222, 62, 200, - 33, 127, 221, 202, 23, 218, 165, 241, 100, 23, 218, 165, 196, 249, 206, - 61, 23, 218, 165, 196, 249, 237, 245, 23, 201, 250, 204, 237, 214, 35, - 235, 205, 23, 201, 250, 222, 105, 222, 59, 23, 201, 250, 202, 68, 248, - 204, 222, 59, 23, 201, 250, 202, 68, 201, 225, 226, 42, 218, 164, 23, - 201, 250, 226, 42, 218, 165, 210, 134, 23, 201, 250, 218, 155, 251, 215, - 245, 98, 23, 201, 250, 247, 37, 204, 237, 214, 34, 23, 201, 250, 247, 37, - 226, 42, 218, 164, 23, 203, 44, 23, 203, 45, 218, 160, 23, 203, 45, 214, - 120, 201, 249, 23, 203, 45, 214, 120, 201, 250, 218, 160, 23, 203, 45, - 214, 120, 222, 59, 23, 203, 45, 214, 120, 222, 60, 218, 160, 23, 203, 45, - 248, 143, 222, 59, 23, 218, 156, 225, 197, 23, 218, 158, 225, 197, 23, - 217, 109, 23, 232, 233, 23, 236, 91, 23, 206, 164, 232, 36, 205, 122, 23, - 206, 164, 232, 36, 212, 77, 23, 197, 147, 206, 164, 232, 36, 218, 163, - 23, 235, 68, 206, 164, 232, 36, 218, 163, 23, 206, 164, 202, 80, 234, - 235, 197, 153, 23, 201, 232, 204, 218, 204, 205, 23, 201, 232, 241, 10, - 248, 221, 23, 201, 233, 200, 218, 23, 200, 33, 248, 111, 202, 80, 234, - 235, 232, 36, 225, 123, 23, 222, 87, 244, 164, 23, 222, 87, 222, 157, 23, - 222, 87, 222, 156, 23, 222, 87, 222, 155, 23, 222, 87, 222, 154, 23, 222, - 87, 222, 153, 23, 222, 87, 222, 152, 23, 222, 87, 222, 151, 23, 235, 127, - 23, 222, 1, 205, 148, 23, 222, 2, 205, 148, 23, 222, 4, 232, 111, 23, - 222, 4, 197, 58, 23, 222, 4, 239, 199, 23, 222, 4, 232, 138, 217, 109, - 23, 222, 4, 201, 234, 23, 222, 4, 222, 86, 239, 117, 23, 244, 159, 23, - 234, 217, 204, 226, 23, 207, 105, 23, 244, 168, 23, 213, 140, 23, 235, - 137, 218, 227, 23, 235, 137, 218, 226, 23, 235, 137, 218, 225, 23, 235, - 137, 218, 224, 23, 235, 137, 218, 223, 23, 209, 193, 218, 227, 23, 209, - 193, 218, 226, 23, 209, 193, 218, 225, 23, 209, 193, 218, 224, 23, 209, - 193, 218, 223, 23, 209, 193, 218, 222, 23, 209, 193, 218, 221, 23, 209, - 193, 218, 220, 23, 209, 193, 218, 234, 23, 209, 193, 218, 233, 23, 209, - 193, 218, 232, 23, 209, 193, 218, 231, 23, 209, 193, 218, 230, 23, 209, - 193, 218, 229, 23, 209, 193, 218, 228, 38, 125, 1, 250, 113, 38, 125, 1, - 248, 9, 38, 125, 1, 199, 116, 38, 125, 1, 233, 159, 38, 125, 1, 239, 23, - 38, 125, 1, 196, 38, 38, 125, 1, 195, 58, 38, 125, 1, 195, 84, 38, 125, - 1, 225, 221, 38, 125, 1, 84, 225, 221, 38, 125, 1, 68, 38, 125, 1, 239, - 44, 38, 125, 1, 225, 23, 38, 125, 1, 222, 39, 38, 125, 1, 218, 59, 38, - 125, 1, 217, 206, 38, 125, 1, 214, 104, 38, 125, 1, 212, 104, 38, 125, 1, - 209, 249, 38, 125, 1, 205, 229, 38, 125, 1, 200, 246, 38, 125, 1, 200, - 83, 38, 125, 1, 234, 238, 38, 125, 1, 232, 91, 38, 125, 1, 206, 154, 38, - 125, 1, 201, 92, 38, 125, 1, 245, 36, 38, 125, 1, 207, 50, 38, 125, 1, - 196, 47, 38, 125, 1, 196, 49, 38, 125, 1, 196, 82, 38, 125, 1, 195, 217, - 38, 125, 1, 4, 195, 182, 38, 125, 1, 196, 3, 38, 125, 1, 226, 6, 4, 195, - 182, 38, 125, 1, 248, 171, 195, 182, 38, 125, 1, 226, 6, 248, 171, 195, - 182, 38, 125, 1, 235, 103, 215, 88, 211, 224, 86, 1, 166, 215, 88, 211, - 224, 86, 1, 201, 113, 215, 88, 211, 224, 86, 1, 215, 207, 215, 88, 211, - 224, 86, 1, 189, 215, 88, 211, 224, 86, 1, 142, 215, 88, 211, 224, 86, 1, - 176, 215, 88, 211, 224, 86, 1, 196, 208, 215, 88, 211, 224, 86, 1, 216, - 118, 215, 88, 211, 224, 86, 1, 247, 174, 215, 88, 211, 224, 86, 1, 172, - 215, 88, 211, 224, 86, 1, 183, 215, 88, 211, 224, 86, 1, 195, 115, 215, - 88, 211, 224, 86, 1, 217, 163, 215, 88, 211, 224, 86, 1, 215, 194, 215, - 88, 211, 224, 86, 1, 155, 215, 88, 211, 224, 86, 1, 240, 136, 215, 88, - 211, 224, 86, 1, 215, 109, 215, 88, 211, 224, 86, 1, 215, 252, 215, 88, - 211, 224, 86, 1, 199, 152, 215, 88, 211, 224, 86, 1, 215, 188, 215, 88, - 211, 224, 86, 1, 200, 210, 215, 88, 211, 224, 86, 1, 235, 239, 215, 88, - 211, 224, 86, 1, 169, 215, 88, 211, 224, 86, 1, 211, 159, 215, 88, 211, - 224, 86, 1, 164, 215, 88, 211, 224, 86, 1, 215, 254, 215, 88, 211, 224, - 86, 1, 161, 215, 88, 211, 224, 86, 1, 196, 164, 215, 88, 211, 224, 86, 1, - 216, 0, 215, 88, 211, 224, 86, 1, 239, 40, 215, 88, 211, 224, 86, 1, 215, - 255, 215, 88, 211, 224, 86, 1, 232, 236, 215, 88, 211, 224, 86, 1, 219, - 2, 215, 88, 211, 224, 86, 1, 212, 150, 215, 88, 211, 224, 86, 1, 234, - 123, 215, 88, 211, 224, 86, 1, 209, 181, 215, 88, 211, 224, 86, 1, 63, - 215, 88, 211, 224, 86, 1, 252, 168, 215, 88, 211, 224, 86, 1, 68, 215, - 88, 211, 224, 86, 1, 66, 215, 88, 211, 224, 86, 1, 72, 215, 88, 211, 224, - 86, 1, 214, 102, 215, 88, 211, 224, 86, 1, 69, 215, 88, 211, 224, 86, 1, - 237, 54, 215, 88, 211, 224, 86, 1, 197, 199, 215, 88, 211, 224, 86, 202, - 2, 215, 88, 211, 224, 86, 201, 254, 215, 88, 211, 224, 86, 201, 255, 215, - 88, 211, 224, 86, 201, 252, 215, 88, 211, 224, 86, 201, 253, 215, 88, - 211, 224, 86, 202, 0, 215, 88, 211, 224, 86, 202, 1, 215, 88, 211, 224, - 86, 2, 36, 213, 28, 215, 88, 211, 224, 86, 2, 36, 202, 187, 215, 88, 211, - 224, 86, 2, 36, 222, 3, 215, 88, 211, 224, 86, 2, 36, 251, 81, 215, 88, - 211, 224, 86, 2, 36, 226, 18, 215, 88, 211, 224, 86, 2, 196, 172, 196, - 171, 215, 88, 211, 224, 86, 5, 222, 150, 215, 88, 211, 224, 86, 17, 195, - 79, 215, 88, 211, 224, 86, 17, 100, 215, 88, 211, 224, 86, 17, 102, 215, - 88, 211, 224, 86, 17, 134, 215, 88, 211, 224, 86, 17, 136, 215, 88, 211, - 224, 86, 17, 146, 215, 88, 211, 224, 86, 17, 167, 215, 88, 211, 224, 86, - 17, 178, 215, 88, 211, 224, 86, 17, 171, 215, 88, 211, 224, 86, 17, 182, - 215, 88, 211, 224, 86, 221, 248, 215, 104, 215, 88, 211, 224, 86, 46, - 247, 174, 197, 145, 1, 252, 168, 197, 145, 1, 63, 197, 145, 1, 249, 145, - 197, 145, 1, 247, 174, 197, 145, 1, 240, 136, 197, 145, 1, 234, 123, 197, - 145, 1, 164, 197, 145, 1, 213, 6, 197, 145, 1, 172, 197, 145, 1, 176, - 197, 145, 1, 161, 197, 145, 1, 189, 197, 145, 1, 202, 233, 197, 145, 1, - 235, 239, 197, 145, 1, 183, 197, 145, 1, 207, 50, 197, 145, 1, 225, 214, - 197, 145, 1, 195, 115, 197, 145, 1, 197, 166, 197, 145, 1, 199, 152, 197, - 145, 1, 155, 197, 145, 1, 72, 197, 145, 1, 250, 150, 197, 145, 1, 169, - 197, 145, 1, 166, 197, 145, 1, 224, 146, 197, 145, 1, 142, 197, 145, 1, - 69, 197, 145, 1, 68, 197, 145, 1, 217, 71, 197, 145, 1, 66, 197, 145, 1, - 222, 30, 197, 145, 1, 201, 113, 197, 145, 1, 201, 217, 197, 145, 1, 214, - 109, 197, 145, 1, 252, 127, 197, 145, 1, 251, 97, 197, 145, 1, 226, 60, - 197, 145, 1, 214, 119, 197, 145, 1, 236, 230, 197, 145, 1, 252, 128, 197, - 145, 1, 215, 109, 197, 145, 1, 200, 95, 197, 145, 1, 196, 15, 197, 145, - 152, 201, 13, 197, 145, 152, 201, 12, 197, 145, 152, 223, 255, 197, 145, - 152, 223, 254, 197, 145, 17, 195, 79, 197, 145, 17, 100, 197, 145, 17, - 102, 197, 145, 17, 134, 197, 145, 17, 136, 197, 145, 17, 146, 197, 145, - 17, 167, 197, 145, 17, 178, 197, 145, 17, 171, 197, 145, 17, 182, 197, - 145, 216, 235, 55, 81, 80, 5, 221, 135, 224, 101, 81, 80, 5, 221, 131, - 155, 81, 80, 5, 221, 129, 223, 187, 81, 80, 5, 221, 5, 224, 200, 81, 80, - 5, 220, 231, 224, 209, 81, 80, 5, 220, 250, 223, 242, 81, 80, 5, 221, 22, - 224, 11, 81, 80, 5, 220, 147, 223, 174, 81, 80, 5, 221, 126, 197, 70, 81, - 80, 5, 221, 124, 197, 166, 81, 80, 5, 221, 122, 196, 243, 81, 80, 5, 220, - 200, 197, 98, 81, 80, 5, 220, 208, 197, 109, 81, 80, 5, 220, 212, 197, - 15, 81, 80, 5, 221, 25, 197, 34, 81, 80, 5, 220, 132, 196, 239, 81, 80, - 5, 220, 183, 197, 96, 81, 80, 5, 221, 9, 196, 227, 81, 80, 5, 221, 21, - 196, 229, 81, 80, 5, 220, 187, 196, 228, 81, 80, 5, 221, 120, 219, 23, - 81, 80, 5, 221, 118, 220, 62, 81, 80, 5, 221, 116, 218, 113, 81, 80, 5, - 221, 11, 219, 164, 81, 80, 5, 220, 232, 218, 215, 81, 80, 5, 220, 172, - 218, 138, 81, 80, 5, 220, 137, 218, 132, 81, 80, 5, 221, 114, 248, 184, - 81, 80, 5, 221, 111, 249, 145, 81, 80, 5, 221, 109, 248, 21, 81, 80, 5, - 220, 176, 248, 251, 81, 80, 5, 220, 229, 249, 9, 81, 80, 5, 220, 223, - 248, 103, 81, 80, 5, 220, 188, 248, 116, 81, 80, 5, 221, 99, 68, 81, 80, - 5, 221, 97, 63, 81, 80, 5, 221, 95, 66, 81, 80, 5, 220, 163, 237, 54, 81, - 80, 5, 220, 226, 69, 81, 80, 5, 220, 161, 214, 102, 81, 80, 5, 220, 179, - 72, 81, 80, 5, 220, 189, 237, 33, 81, 80, 5, 220, 195, 226, 86, 81, 80, - 5, 220, 191, 226, 86, 81, 80, 5, 220, 131, 251, 106, 81, 80, 5, 220, 148, - 236, 230, 81, 80, 5, 221, 84, 206, 112, 81, 80, 5, 221, 82, 183, 81, 80, - 5, 221, 80, 204, 172, 81, 80, 5, 220, 164, 208, 129, 81, 80, 5, 220, 210, - 208, 147, 81, 80, 5, 220, 190, 205, 171, 81, 80, 5, 220, 247, 205, 200, - 81, 80, 5, 220, 130, 206, 105, 81, 80, 5, 221, 70, 222, 109, 81, 80, 5, - 221, 68, 172, 81, 80, 5, 221, 66, 221, 191, 81, 80, 5, 220, 242, 222, - 188, 81, 80, 5, 220, 253, 222, 197, 81, 80, 5, 221, 16, 221, 229, 81, 80, - 5, 220, 173, 222, 7, 81, 80, 5, 220, 216, 181, 222, 197, 81, 80, 5, 221, - 92, 239, 152, 81, 80, 5, 221, 89, 240, 136, 81, 80, 5, 221, 86, 237, 201, - 81, 80, 5, 220, 237, 239, 237, 81, 80, 5, 220, 146, 239, 3, 81, 80, 5, - 220, 145, 239, 28, 81, 80, 5, 221, 78, 202, 122, 81, 80, 5, 221, 75, 189, - 81, 80, 5, 221, 73, 201, 40, 81, 80, 5, 220, 235, 203, 48, 81, 80, 5, - 221, 15, 203, 68, 81, 80, 5, 220, 222, 201, 247, 81, 80, 5, 221, 1, 149, - 81, 80, 5, 221, 64, 225, 172, 81, 80, 5, 221, 61, 225, 214, 81, 80, 5, - 221, 59, 225, 110, 81, 80, 5, 220, 169, 225, 191, 81, 80, 5, 220, 213, - 225, 193, 81, 80, 5, 220, 166, 225, 119, 81, 80, 5, 221, 7, 225, 129, 81, - 80, 5, 220, 151, 181, 225, 129, 81, 80, 5, 221, 57, 196, 24, 81, 80, 5, - 221, 54, 164, 81, 80, 5, 221, 52, 195, 217, 81, 80, 5, 220, 217, 196, 66, - 81, 80, 5, 220, 246, 196, 69, 81, 80, 5, 220, 185, 195, 237, 81, 80, 5, - 220, 205, 196, 3, 81, 80, 5, 221, 48, 235, 153, 81, 80, 5, 221, 46, 235, - 239, 81, 80, 5, 221, 44, 234, 223, 81, 80, 5, 220, 248, 235, 182, 81, 80, - 5, 220, 251, 235, 189, 81, 80, 5, 220, 193, 235, 40, 81, 80, 5, 220, 238, - 235, 51, 81, 80, 5, 220, 129, 234, 222, 81, 80, 5, 220, 225, 235, 210, - 81, 80, 5, 221, 42, 216, 183, 81, 80, 5, 221, 40, 217, 221, 81, 80, 5, - 221, 38, 215, 138, 81, 80, 5, 220, 209, 217, 101, 81, 80, 5, 220, 157, - 216, 38, 81, 80, 5, 220, 150, 232, 71, 81, 80, 5, 221, 33, 142, 81, 80, - 5, 220, 140, 231, 75, 81, 80, 5, 221, 36, 232, 118, 81, 80, 5, 220, 230, - 232, 147, 81, 80, 5, 221, 31, 231, 166, 81, 80, 5, 220, 186, 231, 193, - 81, 80, 5, 220, 243, 232, 117, 81, 80, 5, 220, 198, 231, 159, 81, 80, 5, - 221, 17, 232, 41, 81, 80, 5, 220, 196, 232, 212, 81, 80, 5, 220, 239, - 231, 59, 81, 80, 5, 221, 18, 232, 101, 81, 80, 5, 220, 133, 231, 169, 81, - 80, 5, 221, 24, 231, 71, 81, 80, 5, 220, 236, 217, 36, 81, 80, 5, 221, - 29, 217, 50, 81, 80, 5, 220, 244, 217, 33, 81, 80, 5, 220, 211, 217, 44, - 81, 80, 5, 220, 180, 217, 45, 81, 80, 5, 220, 170, 217, 34, 81, 80, 5, - 220, 206, 217, 35, 81, 80, 5, 220, 167, 217, 49, 81, 80, 5, 220, 199, - 217, 32, 81, 80, 5, 220, 240, 181, 217, 45, 81, 80, 5, 220, 220, 181, - 217, 34, 81, 80, 5, 220, 143, 181, 217, 35, 81, 80, 5, 220, 171, 233, - 192, 81, 80, 5, 220, 215, 234, 123, 81, 80, 5, 220, 158, 233, 76, 81, 80, - 5, 220, 136, 234, 40, 81, 80, 5, 220, 160, 233, 62, 81, 80, 5, 220, 159, - 233, 72, 81, 80, 5, 220, 142, 217, 55, 81, 80, 5, 221, 13, 216, 248, 81, - 80, 5, 220, 149, 216, 237, 81, 80, 5, 221, 2, 212, 220, 81, 80, 5, 220, - 227, 161, 81, 80, 5, 221, 20, 211, 227, 81, 80, 5, 220, 245, 213, 79, 81, - 80, 5, 221, 19, 213, 92, 81, 80, 5, 220, 224, 212, 91, 81, 80, 5, 221, 4, - 212, 117, 81, 80, 5, 220, 181, 219, 226, 81, 80, 5, 221, 8, 219, 241, 81, - 80, 5, 220, 204, 219, 220, 81, 80, 5, 221, 23, 219, 233, 81, 80, 5, 220, - 138, 219, 233, 81, 80, 5, 220, 254, 219, 234, 81, 80, 5, 220, 154, 219, - 221, 81, 80, 5, 220, 152, 219, 222, 81, 80, 5, 220, 139, 219, 214, 81, - 80, 5, 220, 165, 181, 219, 234, 81, 80, 5, 220, 221, 181, 219, 221, 81, - 80, 5, 220, 184, 181, 219, 222, 81, 80, 5, 220, 194, 223, 215, 81, 80, 5, - 220, 234, 223, 223, 81, 80, 5, 220, 252, 223, 211, 81, 80, 5, 221, 27, - 223, 218, 81, 80, 5, 220, 218, 223, 219, 81, 80, 5, 220, 214, 223, 213, - 81, 80, 5, 220, 168, 223, 214, 81, 80, 5, 220, 202, 234, 57, 81, 80, 5, - 221, 14, 234, 65, 81, 80, 5, 220, 178, 234, 52, 81, 80, 5, 220, 233, 234, - 61, 81, 80, 5, 220, 219, 234, 62, 81, 80, 5, 220, 255, 234, 53, 81, 80, - 5, 221, 0, 234, 55, 81, 80, 5, 220, 155, 169, 81, 80, 5, 220, 203, 217, - 144, 81, 80, 5, 220, 197, 217, 159, 81, 80, 5, 220, 201, 217, 126, 81, - 80, 5, 220, 135, 217, 150, 81, 80, 5, 220, 207, 217, 151, 81, 80, 5, 221, - 3, 217, 131, 81, 80, 5, 221, 6, 217, 135, 81, 80, 5, 220, 174, 216, 164, - 81, 80, 5, 220, 134, 216, 134, 81, 80, 5, 220, 177, 216, 155, 81, 80, 5, - 220, 192, 216, 138, 81, 80, 5, 220, 144, 199, 34, 81, 80, 5, 220, 141, - 199, 152, 81, 80, 5, 220, 175, 197, 220, 81, 80, 5, 220, 153, 199, 113, - 81, 80, 5, 220, 241, 199, 118, 81, 80, 5, 220, 182, 198, 233, 81, 80, 5, - 220, 249, 198, 248, 81, 80, 5, 220, 162, 215, 82, 81, 80, 5, 221, 12, - 215, 102, 81, 80, 5, 220, 156, 215, 64, 81, 80, 5, 220, 228, 215, 94, 81, - 80, 5, 221, 10, 215, 71, 81, 80, 17, 100, 81, 80, 17, 102, 81, 80, 17, - 134, 81, 80, 17, 136, 81, 80, 17, 146, 81, 80, 17, 167, 81, 80, 17, 178, - 81, 80, 17, 171, 81, 80, 17, 182, 81, 80, 38, 31, 203, 46, 81, 80, 38, - 31, 203, 18, 81, 80, 38, 31, 231, 55, 81, 80, 38, 31, 202, 157, 81, 80, - 38, 31, 203, 24, 202, 157, 81, 80, 38, 31, 231, 58, 202, 157, 81, 80, 38, - 31, 219, 26, 251, 253, 6, 1, 251, 152, 251, 253, 6, 1, 240, 133, 251, - 253, 6, 1, 223, 80, 251, 253, 6, 1, 219, 39, 251, 253, 6, 1, 249, 145, - 251, 253, 6, 1, 206, 56, 251, 253, 6, 1, 213, 92, 251, 253, 6, 1, 248, - 192, 251, 253, 6, 1, 169, 251, 253, 6, 1, 69, 251, 253, 6, 1, 235, 239, - 251, 253, 6, 1, 68, 251, 253, 6, 1, 72, 251, 253, 6, 1, 239, 176, 251, - 253, 6, 1, 196, 25, 251, 253, 6, 1, 197, 117, 251, 253, 6, 1, 215, 138, - 251, 253, 6, 1, 225, 35, 251, 253, 6, 1, 164, 251, 253, 6, 1, 66, 251, - 253, 6, 1, 225, 163, 251, 253, 6, 1, 245, 75, 251, 253, 6, 1, 142, 251, - 253, 6, 1, 211, 157, 251, 253, 6, 1, 234, 123, 251, 253, 6, 1, 215, 109, - 251, 253, 6, 1, 201, 40, 251, 253, 6, 1, 216, 227, 251, 253, 6, 1, 199, - 152, 251, 253, 6, 1, 224, 146, 251, 253, 6, 1, 234, 62, 251, 253, 6, 1, - 195, 104, 251, 253, 6, 1, 223, 214, 251, 253, 6, 1, 207, 50, 251, 253, 4, - 1, 251, 152, 251, 253, 4, 1, 240, 133, 251, 253, 4, 1, 223, 80, 251, 253, - 4, 1, 219, 39, 251, 253, 4, 1, 249, 145, 251, 253, 4, 1, 206, 56, 251, - 253, 4, 1, 213, 92, 251, 253, 4, 1, 248, 192, 251, 253, 4, 1, 169, 251, - 253, 4, 1, 69, 251, 253, 4, 1, 235, 239, 251, 253, 4, 1, 68, 251, 253, 4, - 1, 72, 251, 253, 4, 1, 239, 176, 251, 253, 4, 1, 196, 25, 251, 253, 4, 1, - 197, 117, 251, 253, 4, 1, 215, 138, 251, 253, 4, 1, 225, 35, 251, 253, 4, - 1, 164, 251, 253, 4, 1, 66, 251, 253, 4, 1, 225, 163, 251, 253, 4, 1, - 245, 75, 251, 253, 4, 1, 142, 251, 253, 4, 1, 211, 157, 251, 253, 4, 1, - 234, 123, 251, 253, 4, 1, 215, 109, 251, 253, 4, 1, 201, 40, 251, 253, 4, - 1, 216, 227, 251, 253, 4, 1, 199, 152, 251, 253, 4, 1, 224, 146, 251, - 253, 4, 1, 234, 62, 251, 253, 4, 1, 195, 104, 251, 253, 4, 1, 223, 214, - 251, 253, 4, 1, 207, 50, 251, 253, 251, 153, 222, 150, 251, 253, 18, 222, - 150, 251, 253, 234, 36, 78, 251, 253, 232, 213, 251, 253, 108, 218, 235, - 251, 253, 234, 37, 108, 218, 235, 251, 253, 215, 149, 251, 253, 217, 208, - 78, 251, 253, 17, 195, 79, 251, 253, 17, 100, 251, 253, 17, 102, 251, - 253, 17, 134, 251, 253, 17, 136, 251, 253, 17, 146, 251, 253, 17, 167, - 251, 253, 17, 178, 251, 253, 17, 171, 251, 253, 17, 182, 251, 253, 84, - 236, 90, 78, 251, 253, 84, 211, 79, 78, 226, 70, 128, 31, 100, 226, 70, - 128, 31, 102, 226, 70, 128, 31, 134, 226, 70, 128, 31, 136, 226, 70, 128, - 31, 146, 226, 70, 128, 31, 167, 226, 70, 128, 31, 178, 226, 70, 128, 31, - 171, 226, 70, 128, 31, 182, 226, 70, 128, 31, 203, 23, 226, 70, 128, 31, - 200, 234, 226, 70, 128, 31, 202, 177, 226, 70, 128, 31, 235, 14, 226, 70, - 128, 31, 235, 145, 226, 70, 128, 31, 206, 13, 226, 70, 128, 31, 207, 65, - 226, 70, 128, 31, 237, 20, 226, 70, 128, 31, 216, 174, 226, 70, 128, 31, - 97, 231, 57, 226, 70, 128, 31, 99, 231, 57, 226, 70, 128, 31, 115, 231, - 57, 226, 70, 128, 31, 235, 7, 231, 57, 226, 70, 128, 31, 235, 101, 231, - 57, 226, 70, 128, 31, 206, 29, 231, 57, 226, 70, 128, 31, 207, 71, 231, - 57, 226, 70, 128, 31, 237, 31, 231, 57, 226, 70, 128, 31, 216, 179, 231, - 57, 226, 70, 128, 31, 97, 170, 226, 70, 128, 31, 99, 170, 226, 70, 128, - 31, 115, 170, 226, 70, 128, 31, 235, 7, 170, 226, 70, 128, 31, 235, 101, - 170, 226, 70, 128, 31, 206, 29, 170, 226, 70, 128, 31, 207, 71, 170, 226, - 70, 128, 31, 237, 31, 170, 226, 70, 128, 31, 216, 179, 170, 226, 70, 128, - 31, 203, 24, 170, 226, 70, 128, 31, 200, 235, 170, 226, 70, 128, 31, 202, - 178, 170, 226, 70, 128, 31, 235, 15, 170, 226, 70, 128, 31, 235, 146, - 170, 226, 70, 128, 31, 206, 14, 170, 226, 70, 128, 31, 207, 66, 170, 226, - 70, 128, 31, 237, 21, 170, 226, 70, 128, 31, 216, 175, 170, 226, 70, 128, - 31, 222, 255, 226, 70, 128, 31, 222, 254, 226, 70, 128, 223, 0, 78, 226, - 70, 128, 31, 224, 246, 226, 70, 128, 31, 224, 245, 226, 70, 128, 31, 212, - 31, 100, 226, 70, 128, 31, 212, 31, 102, 226, 70, 128, 31, 212, 31, 134, - 226, 70, 128, 31, 212, 31, 136, 226, 70, 128, 31, 212, 31, 146, 226, 70, - 128, 31, 212, 31, 167, 226, 70, 128, 31, 212, 31, 178, 226, 70, 128, 31, - 212, 31, 171, 226, 70, 128, 31, 212, 31, 182, 226, 70, 128, 212, 147, - 226, 70, 128, 191, 97, 211, 87, 226, 70, 128, 191, 97, 232, 225, 226, 70, - 128, 191, 115, 211, 85, 226, 70, 128, 209, 108, 78, 226, 70, 128, 31, - 251, 131, 100, 226, 70, 128, 31, 251, 131, 102, 226, 70, 128, 31, 251, - 131, 203, 24, 170, 226, 70, 128, 251, 131, 223, 0, 78, 214, 41, 128, 31, - 100, 214, 41, 128, 31, 102, 214, 41, 128, 31, 134, 214, 41, 128, 31, 136, - 214, 41, 128, 31, 146, 214, 41, 128, 31, 167, 214, 41, 128, 31, 178, 214, - 41, 128, 31, 171, 214, 41, 128, 31, 182, 214, 41, 128, 31, 203, 23, 214, - 41, 128, 31, 200, 234, 214, 41, 128, 31, 202, 177, 214, 41, 128, 31, 235, - 14, 214, 41, 128, 31, 235, 145, 214, 41, 128, 31, 206, 13, 214, 41, 128, - 31, 207, 65, 214, 41, 128, 31, 237, 20, 214, 41, 128, 31, 216, 174, 214, - 41, 128, 31, 97, 231, 57, 214, 41, 128, 31, 99, 231, 57, 214, 41, 128, - 31, 115, 231, 57, 214, 41, 128, 31, 235, 7, 231, 57, 214, 41, 128, 31, - 235, 101, 231, 57, 214, 41, 128, 31, 206, 29, 231, 57, 214, 41, 128, 31, - 207, 71, 231, 57, 214, 41, 128, 31, 237, 31, 231, 57, 214, 41, 128, 31, - 216, 179, 231, 57, 214, 41, 128, 31, 97, 170, 214, 41, 128, 31, 99, 170, - 214, 41, 128, 31, 115, 170, 214, 41, 128, 31, 235, 7, 170, 214, 41, 128, - 31, 235, 101, 170, 214, 41, 128, 31, 206, 29, 170, 214, 41, 128, 31, 207, - 71, 170, 214, 41, 128, 31, 237, 31, 170, 214, 41, 128, 31, 216, 179, 170, - 214, 41, 128, 31, 203, 24, 170, 214, 41, 128, 31, 200, 235, 170, 214, 41, - 128, 31, 202, 178, 170, 214, 41, 128, 31, 235, 15, 170, 214, 41, 128, 31, - 235, 146, 170, 214, 41, 128, 31, 206, 14, 170, 214, 41, 128, 31, 207, 66, - 170, 214, 41, 128, 31, 237, 21, 170, 214, 41, 128, 31, 216, 175, 170, - 214, 41, 128, 220, 22, 214, 41, 128, 251, 131, 31, 102, 214, 41, 128, - 251, 131, 31, 134, 214, 41, 128, 251, 131, 31, 136, 214, 41, 128, 251, - 131, 31, 146, 214, 41, 128, 251, 131, 31, 167, 214, 41, 128, 251, 131, - 31, 178, 214, 41, 128, 251, 131, 31, 171, 214, 41, 128, 251, 131, 31, - 182, 214, 41, 128, 251, 131, 31, 203, 23, 214, 41, 128, 251, 131, 31, - 235, 7, 231, 57, 214, 41, 128, 251, 131, 31, 206, 29, 231, 57, 214, 41, - 128, 251, 131, 31, 99, 170, 214, 41, 128, 251, 131, 31, 203, 24, 170, - 214, 41, 128, 191, 97, 232, 225, 214, 41, 128, 191, 97, 206, 17, 9, 13, - 251, 164, 9, 13, 248, 239, 9, 13, 225, 189, 9, 13, 240, 107, 9, 13, 197, - 117, 9, 13, 195, 106, 9, 13, 232, 236, 9, 13, 203, 139, 9, 13, 196, 64, - 9, 13, 225, 35, 9, 13, 222, 249, 9, 13, 219, 185, 9, 13, 216, 31, 9, 13, - 208, 125, 9, 13, 251, 194, 9, 13, 235, 176, 9, 13, 209, 8, 9, 13, 211, - 152, 9, 13, 210, 142, 9, 13, 206, 251, 9, 13, 203, 41, 9, 13, 202, 213, - 9, 13, 224, 142, 9, 13, 202, 225, 9, 13, 240, 130, 9, 13, 195, 109, 9, - 13, 233, 225, 9, 13, 238, 252, 248, 239, 9, 13, 238, 252, 216, 31, 9, 13, - 238, 252, 235, 176, 9, 13, 238, 252, 211, 152, 9, 13, 84, 248, 239, 9, - 13, 84, 225, 189, 9, 13, 84, 232, 113, 9, 13, 84, 232, 236, 9, 13, 84, - 196, 64, 9, 13, 84, 225, 35, 9, 13, 84, 222, 249, 9, 13, 84, 219, 185, 9, - 13, 84, 216, 31, 9, 13, 84, 208, 125, 9, 13, 84, 251, 194, 9, 13, 84, - 235, 176, 9, 13, 84, 209, 8, 9, 13, 84, 211, 152, 9, 13, 84, 206, 251, 9, - 13, 84, 203, 41, 9, 13, 84, 202, 213, 9, 13, 84, 224, 142, 9, 13, 84, - 240, 130, 9, 13, 84, 233, 225, 9, 13, 203, 134, 225, 189, 9, 13, 203, - 134, 232, 236, 9, 13, 203, 134, 196, 64, 9, 13, 203, 134, 222, 249, 9, - 13, 203, 134, 216, 31, 9, 13, 203, 134, 208, 125, 9, 13, 203, 134, 251, - 194, 9, 13, 203, 134, 209, 8, 9, 13, 203, 134, 211, 152, 9, 13, 203, 134, - 206, 251, 9, 13, 203, 134, 224, 142, 9, 13, 203, 134, 240, 130, 9, 13, - 203, 134, 233, 225, 9, 13, 203, 134, 238, 252, 216, 31, 9, 13, 203, 134, - 238, 252, 211, 152, 9, 13, 204, 204, 248, 239, 9, 13, 204, 204, 225, 189, - 9, 13, 204, 204, 232, 113, 9, 13, 204, 204, 232, 236, 9, 13, 204, 204, - 203, 139, 9, 13, 204, 204, 196, 64, 9, 13, 204, 204, 225, 35, 9, 13, 204, - 204, 219, 185, 9, 13, 204, 204, 216, 31, 9, 13, 204, 204, 208, 125, 9, - 13, 204, 204, 251, 194, 9, 13, 204, 204, 235, 176, 9, 13, 204, 204, 209, - 8, 9, 13, 204, 204, 211, 152, 9, 13, 204, 204, 206, 251, 9, 13, 204, 204, - 203, 41, 9, 13, 204, 204, 202, 213, 9, 13, 204, 204, 224, 142, 9, 13, - 204, 204, 240, 130, 9, 13, 204, 204, 195, 109, 9, 13, 204, 204, 233, 225, - 9, 13, 204, 204, 238, 252, 248, 239, 9, 13, 204, 204, 238, 252, 235, 176, - 9, 13, 221, 224, 251, 164, 9, 13, 221, 224, 248, 239, 9, 13, 221, 224, - 225, 189, 9, 13, 221, 224, 240, 107, 9, 13, 221, 224, 232, 113, 9, 13, - 221, 224, 197, 117, 9, 13, 221, 224, 195, 106, 9, 13, 221, 224, 232, 236, - 9, 13, 221, 224, 203, 139, 9, 13, 221, 224, 196, 64, 9, 13, 221, 224, - 222, 249, 9, 13, 221, 224, 219, 185, 9, 13, 221, 224, 216, 31, 9, 13, - 221, 224, 208, 125, 9, 13, 221, 224, 251, 194, 9, 13, 221, 224, 235, 176, - 9, 13, 221, 224, 209, 8, 9, 13, 221, 224, 211, 152, 9, 13, 221, 224, 210, - 142, 9, 13, 221, 224, 206, 251, 9, 13, 221, 224, 203, 41, 9, 13, 221, - 224, 202, 213, 9, 13, 221, 224, 224, 142, 9, 13, 221, 224, 202, 225, 9, - 13, 221, 224, 240, 130, 9, 13, 221, 224, 195, 109, 9, 13, 221, 224, 233, - 225, 9, 13, 237, 241, 248, 239, 9, 13, 237, 241, 225, 189, 9, 13, 237, - 241, 240, 107, 9, 13, 237, 241, 197, 117, 9, 13, 237, 241, 195, 106, 9, - 13, 237, 241, 232, 236, 9, 13, 237, 241, 203, 139, 9, 13, 237, 241, 196, - 64, 9, 13, 237, 241, 222, 249, 9, 13, 237, 241, 219, 185, 9, 13, 237, - 241, 216, 31, 9, 13, 237, 241, 208, 125, 9, 13, 237, 241, 251, 194, 9, - 13, 237, 241, 235, 176, 9, 13, 237, 241, 209, 8, 9, 13, 237, 241, 211, - 152, 9, 13, 237, 241, 210, 142, 9, 13, 237, 241, 206, 251, 9, 13, 237, - 241, 203, 41, 9, 13, 237, 241, 202, 213, 9, 13, 237, 241, 224, 142, 9, - 13, 237, 241, 202, 225, 9, 13, 237, 241, 240, 130, 9, 13, 237, 241, 195, - 109, 9, 13, 237, 241, 233, 225, 9, 13, 214, 83, 87, 3, 168, 3, 203, 91, - 9, 13, 214, 83, 168, 3, 240, 107, 220, 83, 113, 237, 69, 197, 50, 220, - 83, 113, 205, 159, 197, 50, 220, 83, 113, 197, 89, 197, 50, 220, 83, 113, - 173, 197, 50, 220, 83, 113, 210, 158, 237, 223, 220, 83, 113, 233, 91, - 237, 223, 220, 83, 113, 59, 237, 223, 220, 83, 113, 97, 77, 245, 114, - 220, 83, 113, 99, 77, 245, 114, 220, 83, 113, 115, 77, 245, 114, 220, 83, - 113, 235, 7, 77, 245, 114, 220, 83, 113, 235, 101, 77, 245, 114, 220, 83, - 113, 206, 29, 77, 245, 114, 220, 83, 113, 207, 71, 77, 245, 114, 220, 83, - 113, 237, 31, 77, 245, 114, 220, 83, 113, 216, 179, 77, 245, 114, 220, - 83, 113, 97, 77, 249, 94, 220, 83, 113, 99, 77, 249, 94, 220, 83, 113, - 115, 77, 249, 94, 220, 83, 113, 235, 7, 77, 249, 94, 220, 83, 113, 235, - 101, 77, 249, 94, 220, 83, 113, 206, 29, 77, 249, 94, 220, 83, 113, 207, - 71, 77, 249, 94, 220, 83, 113, 237, 31, 77, 249, 94, 220, 83, 113, 216, - 179, 77, 249, 94, 220, 83, 113, 97, 77, 244, 246, 220, 83, 113, 99, 77, - 244, 246, 220, 83, 113, 115, 77, 244, 246, 220, 83, 113, 235, 7, 77, 244, - 246, 220, 83, 113, 235, 101, 77, 244, 246, 220, 83, 113, 206, 29, 77, - 244, 246, 220, 83, 113, 207, 71, 77, 244, 246, 220, 83, 113, 237, 31, 77, - 244, 246, 220, 83, 113, 216, 179, 77, 244, 246, 220, 83, 113, 212, 128, - 220, 83, 113, 214, 69, 220, 83, 113, 249, 95, 220, 83, 113, 245, 31, 220, - 83, 113, 205, 100, 220, 83, 113, 204, 113, 220, 83, 113, 250, 136, 220, - 83, 113, 197, 41, 220, 83, 113, 225, 122, 220, 83, 113, 249, 138, 185, - 113, 231, 155, 249, 138, 185, 113, 231, 153, 185, 113, 231, 152, 185, - 113, 231, 151, 185, 113, 231, 150, 185, 113, 231, 149, 185, 113, 231, - 148, 185, 113, 231, 147, 185, 113, 231, 146, 185, 113, 231, 145, 185, - 113, 231, 144, 185, 113, 231, 143, 185, 113, 231, 142, 185, 113, 231, - 141, 185, 113, 231, 140, 185, 113, 231, 139, 185, 113, 231, 138, 185, - 113, 231, 137, 185, 113, 231, 136, 185, 113, 231, 135, 185, 113, 231, - 134, 185, 113, 231, 133, 185, 113, 231, 132, 185, 113, 231, 131, 185, - 113, 231, 130, 185, 113, 231, 129, 185, 113, 231, 128, 185, 113, 231, - 127, 185, 113, 231, 126, 185, 113, 231, 125, 185, 113, 231, 124, 185, - 113, 231, 123, 185, 113, 231, 122, 185, 113, 231, 121, 185, 113, 231, - 120, 185, 113, 231, 119, 185, 113, 231, 118, 185, 113, 231, 117, 185, - 113, 231, 116, 185, 113, 231, 115, 185, 113, 231, 114, 185, 113, 231, - 113, 185, 113, 231, 112, 185, 113, 231, 111, 185, 113, 231, 110, 185, - 113, 231, 109, 185, 113, 231, 108, 185, 113, 231, 107, 185, 113, 231, - 106, 185, 113, 231, 105, 185, 113, 83, 249, 138, 185, 113, 199, 99, 185, - 113, 199, 98, 185, 113, 199, 97, 185, 113, 199, 96, 185, 113, 199, 95, - 185, 113, 199, 94, 185, 113, 199, 93, 185, 113, 199, 92, 185, 113, 199, - 91, 185, 113, 199, 90, 185, 113, 199, 89, 185, 113, 199, 88, 185, 113, - 199, 87, 185, 113, 199, 86, 185, 113, 199, 85, 185, 113, 199, 84, 185, - 113, 199, 83, 185, 113, 199, 82, 185, 113, 199, 81, 185, 113, 199, 80, - 185, 113, 199, 79, 185, 113, 199, 78, 185, 113, 199, 77, 185, 113, 199, - 76, 185, 113, 199, 75, 185, 113, 199, 74, 185, 113, 199, 73, 185, 113, - 199, 72, 185, 113, 199, 71, 185, 113, 199, 70, 185, 113, 199, 69, 185, - 113, 199, 68, 185, 113, 199, 67, 185, 113, 199, 66, 185, 113, 199, 65, - 185, 113, 199, 64, 185, 113, 199, 63, 185, 113, 199, 62, 185, 113, 199, - 61, 185, 113, 199, 60, 185, 113, 199, 59, 185, 113, 199, 58, 185, 113, - 199, 57, 185, 113, 199, 56, 185, 113, 199, 55, 185, 113, 199, 54, 185, - 113, 199, 53, 185, 113, 199, 52, 185, 113, 199, 51, 212, 138, 247, 115, - 249, 138, 212, 138, 247, 115, 252, 16, 77, 205, 145, 212, 138, 247, 115, - 99, 77, 205, 145, 212, 138, 247, 115, 115, 77, 205, 145, 212, 138, 247, - 115, 235, 7, 77, 205, 145, 212, 138, 247, 115, 235, 101, 77, 205, 145, - 212, 138, 247, 115, 206, 29, 77, 205, 145, 212, 138, 247, 115, 207, 71, - 77, 205, 145, 212, 138, 247, 115, 237, 31, 77, 205, 145, 212, 138, 247, - 115, 216, 179, 77, 205, 145, 212, 138, 247, 115, 203, 24, 77, 205, 145, - 212, 138, 247, 115, 225, 212, 77, 205, 145, 212, 138, 247, 115, 224, 20, - 77, 205, 145, 212, 138, 247, 115, 211, 81, 77, 205, 145, 212, 138, 247, - 115, 224, 74, 77, 205, 145, 212, 138, 247, 115, 252, 16, 77, 232, 124, - 212, 138, 247, 115, 99, 77, 232, 124, 212, 138, 247, 115, 115, 77, 232, - 124, 212, 138, 247, 115, 235, 7, 77, 232, 124, 212, 138, 247, 115, 235, - 101, 77, 232, 124, 212, 138, 247, 115, 206, 29, 77, 232, 124, 212, 138, - 247, 115, 207, 71, 77, 232, 124, 212, 138, 247, 115, 237, 31, 77, 232, - 124, 212, 138, 247, 115, 216, 179, 77, 232, 124, 212, 138, 247, 115, 203, - 24, 77, 232, 124, 212, 138, 247, 115, 225, 212, 77, 232, 124, 212, 138, - 247, 115, 224, 20, 77, 232, 124, 212, 138, 247, 115, 211, 81, 77, 232, - 124, 212, 138, 247, 115, 224, 74, 77, 232, 124, 212, 138, 247, 115, 210, - 158, 225, 122, 212, 138, 247, 115, 252, 16, 77, 239, 139, 212, 138, 247, - 115, 99, 77, 239, 139, 212, 138, 247, 115, 115, 77, 239, 139, 212, 138, - 247, 115, 235, 7, 77, 239, 139, 212, 138, 247, 115, 235, 101, 77, 239, - 139, 212, 138, 247, 115, 206, 29, 77, 239, 139, 212, 138, 247, 115, 207, - 71, 77, 239, 139, 212, 138, 247, 115, 237, 31, 77, 239, 139, 212, 138, - 247, 115, 216, 179, 77, 239, 139, 212, 138, 247, 115, 203, 24, 77, 239, - 139, 212, 138, 247, 115, 225, 212, 77, 239, 139, 212, 138, 247, 115, 224, - 20, 77, 239, 139, 212, 138, 247, 115, 211, 81, 77, 239, 139, 212, 138, - 247, 115, 224, 74, 77, 239, 139, 212, 138, 247, 115, 58, 225, 122, 212, - 138, 247, 115, 252, 16, 77, 244, 188, 212, 138, 247, 115, 99, 77, 244, - 188, 212, 138, 247, 115, 115, 77, 244, 188, 212, 138, 247, 115, 235, 7, - 77, 244, 188, 212, 138, 247, 115, 235, 101, 77, 244, 188, 212, 138, 247, - 115, 206, 29, 77, 244, 188, 212, 138, 247, 115, 207, 71, 77, 244, 188, - 212, 138, 247, 115, 237, 31, 77, 244, 188, 212, 138, 247, 115, 216, 179, - 77, 244, 188, 212, 138, 247, 115, 203, 24, 77, 244, 188, 212, 138, 247, - 115, 225, 212, 77, 244, 188, 212, 138, 247, 115, 224, 20, 77, 244, 188, - 212, 138, 247, 115, 211, 81, 77, 244, 188, 212, 138, 247, 115, 224, 74, - 77, 244, 188, 212, 138, 247, 115, 59, 225, 122, 212, 138, 247, 115, 235, - 38, 212, 138, 247, 115, 201, 141, 212, 138, 247, 115, 201, 130, 212, 138, - 247, 115, 201, 127, 212, 138, 247, 115, 201, 126, 212, 138, 247, 115, - 201, 125, 212, 138, 247, 115, 201, 124, 212, 138, 247, 115, 201, 123, - 212, 138, 247, 115, 201, 122, 212, 138, 247, 115, 201, 121, 212, 138, - 247, 115, 201, 140, 212, 138, 247, 115, 201, 139, 212, 138, 247, 115, - 201, 138, 212, 138, 247, 115, 201, 137, 212, 138, 247, 115, 201, 136, - 212, 138, 247, 115, 201, 135, 212, 138, 247, 115, 201, 134, 212, 138, - 247, 115, 201, 133, 212, 138, 247, 115, 201, 132, 212, 138, 247, 115, - 201, 131, 212, 138, 247, 115, 201, 129, 212, 138, 247, 115, 201, 128, 17, - 195, 80, 234, 217, 204, 226, 17, 195, 80, 244, 159, 17, 97, 244, 159, 17, - 99, 244, 159, 17, 115, 244, 159, 17, 235, 7, 244, 159, 17, 235, 101, 244, - 159, 17, 206, 29, 244, 159, 17, 207, 71, 244, 159, 17, 237, 31, 244, 159, - 17, 216, 179, 244, 159, 239, 93, 46, 45, 17, 195, 79, 239, 93, 217, 104, - 46, 45, 17, 195, 79, 119, 8, 6, 1, 63, 119, 8, 6, 1, 250, 112, 119, 8, 6, - 1, 247, 207, 119, 8, 6, 1, 240, 231, 119, 8, 6, 1, 69, 119, 8, 6, 1, 236, - 49, 119, 8, 6, 1, 234, 190, 119, 8, 6, 1, 233, 15, 119, 8, 6, 1, 68, 119, - 8, 6, 1, 225, 217, 119, 8, 6, 1, 225, 80, 119, 8, 6, 1, 159, 119, 8, 6, - 1, 221, 136, 119, 8, 6, 1, 218, 55, 119, 8, 6, 1, 72, 119, 8, 6, 1, 214, - 3, 119, 8, 6, 1, 211, 167, 119, 8, 6, 1, 144, 119, 8, 6, 1, 209, 80, 119, - 8, 6, 1, 203, 216, 119, 8, 6, 1, 66, 119, 8, 6, 1, 199, 230, 119, 8, 6, - 1, 197, 199, 119, 8, 6, 1, 196, 222, 119, 8, 6, 1, 196, 148, 119, 8, 6, - 1, 195, 158, 201, 231, 206, 245, 248, 61, 8, 6, 1, 209, 80, 46, 41, 8, 6, - 1, 247, 207, 46, 41, 8, 6, 1, 144, 46, 247, 58, 46, 196, 224, 241, 106, - 105, 103, 8, 6, 1, 63, 103, 8, 6, 1, 250, 112, 103, 8, 6, 1, 247, 207, - 103, 8, 6, 1, 240, 231, 103, 8, 6, 1, 69, 103, 8, 6, 1, 236, 49, 103, 8, - 6, 1, 234, 190, 103, 8, 6, 1, 233, 15, 103, 8, 6, 1, 68, 103, 8, 6, 1, - 225, 217, 103, 8, 6, 1, 225, 80, 103, 8, 6, 1, 159, 103, 8, 6, 1, 221, - 136, 103, 8, 6, 1, 218, 55, 103, 8, 6, 1, 72, 103, 8, 6, 1, 214, 3, 103, - 8, 6, 1, 211, 167, 103, 8, 6, 1, 144, 103, 8, 6, 1, 209, 80, 103, 8, 6, - 1, 203, 216, 103, 8, 6, 1, 66, 103, 8, 6, 1, 199, 230, 103, 8, 6, 1, 197, - 199, 103, 8, 6, 1, 196, 222, 103, 8, 6, 1, 196, 148, 103, 8, 6, 1, 195, - 158, 103, 231, 44, 103, 218, 79, 103, 208, 149, 103, 205, 83, 103, 212, - 52, 103, 197, 110, 217, 104, 46, 8, 6, 1, 63, 217, 104, 46, 8, 6, 1, 250, - 112, 217, 104, 46, 8, 6, 1, 247, 207, 217, 104, 46, 8, 6, 1, 240, 231, - 217, 104, 46, 8, 6, 1, 69, 217, 104, 46, 8, 6, 1, 236, 49, 217, 104, 46, - 8, 6, 1, 234, 190, 217, 104, 46, 8, 6, 1, 233, 15, 217, 104, 46, 8, 6, 1, - 68, 217, 104, 46, 8, 6, 1, 225, 217, 217, 104, 46, 8, 6, 1, 225, 80, 217, - 104, 46, 8, 6, 1, 159, 217, 104, 46, 8, 6, 1, 221, 136, 217, 104, 46, 8, - 6, 1, 218, 55, 217, 104, 46, 8, 6, 1, 72, 217, 104, 46, 8, 6, 1, 214, 3, - 217, 104, 46, 8, 6, 1, 211, 167, 217, 104, 46, 8, 6, 1, 144, 217, 104, - 46, 8, 6, 1, 209, 80, 217, 104, 46, 8, 6, 1, 203, 216, 217, 104, 46, 8, - 6, 1, 66, 217, 104, 46, 8, 6, 1, 199, 230, 217, 104, 46, 8, 6, 1, 197, - 199, 217, 104, 46, 8, 6, 1, 196, 222, 217, 104, 46, 8, 6, 1, 196, 148, - 217, 104, 46, 8, 6, 1, 195, 158, 210, 215, 219, 213, 55, 210, 215, 219, - 210, 55, 210, 215, 218, 150, 55, 217, 104, 103, 8, 6, 1, 63, 217, 104, - 103, 8, 6, 1, 250, 112, 217, 104, 103, 8, 6, 1, 247, 207, 217, 104, 103, - 8, 6, 1, 240, 231, 217, 104, 103, 8, 6, 1, 69, 217, 104, 103, 8, 6, 1, - 236, 49, 217, 104, 103, 8, 6, 1, 234, 190, 217, 104, 103, 8, 6, 1, 233, - 15, 217, 104, 103, 8, 6, 1, 68, 217, 104, 103, 8, 6, 1, 225, 217, 217, - 104, 103, 8, 6, 1, 225, 80, 217, 104, 103, 8, 6, 1, 159, 217, 104, 103, - 8, 6, 1, 221, 136, 217, 104, 103, 8, 6, 1, 218, 55, 217, 104, 103, 8, 6, - 1, 72, 217, 104, 103, 8, 6, 1, 214, 3, 217, 104, 103, 8, 6, 1, 211, 167, - 217, 104, 103, 8, 6, 1, 144, 217, 104, 103, 8, 6, 1, 209, 80, 217, 104, - 103, 8, 6, 1, 203, 216, 217, 104, 103, 8, 6, 1, 66, 217, 104, 103, 8, 6, - 1, 199, 230, 217, 104, 103, 8, 6, 1, 197, 199, 217, 104, 103, 8, 6, 1, - 196, 222, 217, 104, 103, 8, 6, 1, 196, 148, 217, 104, 103, 8, 6, 1, 195, - 158, 241, 59, 217, 104, 103, 8, 6, 1, 214, 3, 217, 104, 103, 230, 203, - 217, 104, 103, 161, 217, 104, 103, 183, 217, 104, 103, 252, 117, 217, - 104, 103, 197, 110, 47, 239, 48, 103, 244, 230, 103, 241, 113, 103, 234, - 245, 103, 230, 194, 103, 217, 82, 103, 217, 73, 103, 214, 139, 103, 205, - 166, 103, 124, 3, 236, 90, 78, 103, 198, 223, 103, 115, 240, 231, 103, - 208, 136, 208, 154, 103, 99, 225, 80, 103, 235, 7, 225, 80, 103, 237, 31, - 225, 80, 103, 235, 101, 212, 111, 100, 103, 207, 71, 212, 111, 100, 103, - 200, 223, 212, 111, 102, 103, 206, 14, 214, 3, 103, 97, 231, 58, 200, - 235, 214, 3, 103, 8, 4, 1, 240, 231, 103, 232, 150, 103, 232, 149, 103, - 232, 63, 103, 221, 217, 103, 206, 131, 103, 200, 91, 103, 198, 245, 210, - 150, 226, 69, 16, 1, 63, 210, 150, 226, 69, 16, 1, 250, 112, 210, 150, - 226, 69, 16, 1, 247, 207, 210, 150, 226, 69, 16, 1, 240, 231, 210, 150, - 226, 69, 16, 1, 69, 210, 150, 226, 69, 16, 1, 236, 49, 210, 150, 226, 69, - 16, 1, 234, 190, 210, 150, 226, 69, 16, 1, 233, 15, 210, 150, 226, 69, - 16, 1, 68, 210, 150, 226, 69, 16, 1, 225, 217, 210, 150, 226, 69, 16, 1, - 225, 80, 210, 150, 226, 69, 16, 1, 159, 210, 150, 226, 69, 16, 1, 221, - 136, 210, 150, 226, 69, 16, 1, 218, 55, 210, 150, 226, 69, 16, 1, 72, - 210, 150, 226, 69, 16, 1, 214, 3, 210, 150, 226, 69, 16, 1, 211, 167, - 210, 150, 226, 69, 16, 1, 144, 210, 150, 226, 69, 16, 1, 209, 80, 210, - 150, 226, 69, 16, 1, 203, 216, 210, 150, 226, 69, 16, 1, 66, 210, 150, - 226, 69, 16, 1, 199, 230, 210, 150, 226, 69, 16, 1, 197, 199, 210, 150, - 226, 69, 16, 1, 196, 222, 210, 150, 226, 69, 16, 1, 196, 148, 210, 150, - 226, 69, 16, 1, 195, 158, 47, 188, 231, 179, 103, 71, 223, 250, 103, 71, - 183, 103, 12, 200, 54, 228, 138, 103, 12, 200, 54, 228, 142, 103, 12, - 200, 54, 228, 150, 103, 71, 239, 252, 103, 12, 200, 54, 228, 157, 103, - 12, 200, 54, 228, 144, 103, 12, 200, 54, 228, 116, 103, 12, 200, 54, 228, - 143, 103, 12, 200, 54, 228, 156, 103, 12, 200, 54, 228, 130, 103, 12, - 200, 54, 228, 123, 103, 12, 200, 54, 228, 132, 103, 12, 200, 54, 228, - 153, 103, 12, 200, 54, 228, 139, 103, 12, 200, 54, 228, 155, 103, 12, - 200, 54, 228, 131, 103, 12, 200, 54, 228, 154, 103, 12, 200, 54, 228, - 117, 103, 12, 200, 54, 228, 122, 103, 12, 200, 54, 228, 115, 103, 12, - 200, 54, 228, 145, 103, 12, 200, 54, 228, 147, 103, 12, 200, 54, 228, - 125, 103, 12, 200, 54, 228, 136, 103, 12, 200, 54, 228, 134, 103, 12, - 200, 54, 228, 160, 103, 12, 200, 54, 228, 159, 103, 12, 200, 54, 228, - 113, 103, 12, 200, 54, 228, 140, 103, 12, 200, 54, 228, 158, 103, 12, - 200, 54, 228, 149, 103, 12, 200, 54, 228, 135, 103, 12, 200, 54, 228, - 114, 103, 12, 200, 54, 228, 137, 103, 12, 200, 54, 228, 119, 103, 12, - 200, 54, 228, 118, 103, 12, 200, 54, 228, 148, 103, 12, 200, 54, 228, - 126, 103, 12, 200, 54, 228, 128, 103, 12, 200, 54, 228, 129, 103, 12, - 200, 54, 228, 121, 103, 12, 200, 54, 228, 152, 103, 12, 200, 54, 228, - 146, 103, 12, 200, 54, 228, 112, 201, 231, 206, 245, 248, 61, 12, 200, - 54, 228, 127, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, 159, 201, - 231, 206, 245, 248, 61, 12, 200, 54, 228, 157, 201, 231, 206, 245, 248, - 61, 12, 200, 54, 228, 141, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, - 124, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, 137, 201, 231, 206, - 245, 248, 61, 12, 200, 54, 228, 120, 201, 231, 206, 245, 248, 61, 12, - 200, 54, 228, 151, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, 133, - 46, 230, 191, 251, 247, 46, 230, 191, 252, 20, 209, 185, 16, 36, 234, - 223, 209, 185, 16, 36, 221, 191, 209, 185, 16, 36, 206, 165, 209, 185, - 16, 36, 196, 196, 209, 185, 16, 36, 206, 148, 209, 185, 16, 36, 247, 162, - 240, 242, 235, 49, 244, 203, 200, 76, 216, 195, 3, 205, 4, 204, 106, 127, - 218, 168, 204, 105, 244, 234, 250, 169, 237, 174, 204, 104, 127, 248, 10, - 210, 216, 248, 40, 250, 169, 216, 194, 197, 128, 197, 122, 198, 239, 219, - 31, 197, 112, 237, 73, 233, 153, 236, 106, 237, 73, 233, 153, 251, 114, - 237, 73, 233, 153, 250, 188, 233, 153, 3, 219, 155, 217, 83, 218, 190, - 105, 197, 114, 241, 72, 218, 190, 105, 235, 113, 211, 88, 218, 190, 105, - 197, 114, 233, 188, 218, 190, 105, 234, 217, 218, 190, 105, 197, 142, - 233, 188, 218, 190, 105, 222, 221, 211, 88, 218, 190, 105, 197, 142, 241, - 72, 218, 190, 105, 241, 72, 218, 189, 217, 83, 218, 190, 3, 235, 233, - 235, 113, 211, 88, 218, 190, 3, 235, 233, 222, 221, 211, 88, 218, 190, 3, - 235, 233, 234, 217, 218, 190, 3, 235, 233, 204, 112, 3, 235, 233, 233, - 149, 205, 7, 206, 187, 205, 7, 202, 205, 58, 237, 209, 59, 204, 111, 59, - 204, 112, 3, 4, 244, 194, 59, 204, 112, 248, 236, 244, 194, 59, 204, 112, - 248, 236, 244, 195, 3, 210, 217, 244, 195, 3, 210, 217, 244, 195, 3, 205, - 206, 244, 195, 3, 222, 92, 244, 195, 3, 201, 235, 235, 50, 197, 51, 248, - 120, 235, 233, 231, 96, 239, 17, 203, 146, 247, 242, 245, 81, 208, 127, - 236, 100, 201, 190, 239, 245, 201, 190, 213, 207, 201, 190, 247, 167, - 231, 96, 213, 47, 201, 24, 245, 85, 248, 123, 209, 198, 232, 62, 204, - 109, 248, 123, 237, 77, 77, 220, 72, 237, 77, 77, 210, 60, 232, 96, 235, - 7, 222, 193, 244, 193, 220, 41, 222, 192, 235, 214, 222, 192, 222, 193, - 235, 57, 226, 87, 197, 50, 218, 90, 202, 15, 250, 149, 233, 108, 219, - 173, 197, 126, 203, 108, 222, 161, 249, 90, 212, 172, 210, 158, 251, 27, - 233, 91, 251, 27, 213, 85, 213, 89, 245, 86, 204, 209, 232, 218, 205, - 240, 77, 212, 152, 219, 200, 214, 120, 248, 104, 212, 64, 222, 172, 210, - 61, 241, 78, 210, 61, 249, 103, 241, 116, 210, 60, 241, 14, 26, 210, 60, - 204, 246, 248, 74, 205, 144, 248, 53, 234, 243, 234, 239, 209, 222, 204, - 59, 212, 66, 240, 85, 214, 166, 204, 78, 234, 240, 206, 157, 235, 112, - 247, 161, 3, 204, 51, 239, 188, 205, 186, 230, 202, 241, 76, 207, 7, 230, - 201, 230, 202, 241, 76, 237, 238, 241, 115, 245, 47, 154, 247, 132, 221, - 244, 241, 5, 231, 168, 212, 68, 206, 171, 248, 216, 248, 70, 212, 69, 77, - 235, 39, 241, 114, 235, 28, 26, 224, 21, 203, 57, 197, 37, 232, 187, 208, - 248, 248, 87, 26, 241, 27, 197, 47, 233, 157, 244, 178, 233, 157, 201, - 145, 237, 216, 248, 247, 218, 130, 244, 210, 248, 247, 218, 129, 249, - 141, 248, 86, 235, 28, 26, 224, 22, 3, 212, 139, 248, 87, 3, 212, 84, - 241, 103, 212, 86, 210, 62, 196, 254, 212, 26, 248, 153, 247, 160, 225, - 211, 245, 38, 201, 190, 235, 197, 245, 37, 235, 115, 235, 116, 205, 142, - 249, 101, 213, 129, 212, 85, 241, 152, 249, 103, 203, 112, 201, 190, 241, - 59, 235, 87, 212, 173, 239, 242, 225, 202, 239, 9, 247, 104, 204, 208, - 197, 51, 245, 63, 218, 190, 199, 21, 247, 23, 208, 167, 208, 197, 233, - 114, 247, 125, 232, 127, 3, 202, 68, 214, 120, 202, 218, 222, 184, 248, - 80, 77, 235, 61, 219, 33, 219, 196, 210, 129, 210, 62, 34, 224, 152, 3, - 225, 210, 204, 179, 219, 67, 222, 128, 205, 238, 241, 121, 224, 15, 249, - 5, 250, 198, 34, 216, 8, 249, 5, 239, 194, 34, 216, 8, 235, 131, 234, - 249, 251, 251, 202, 109, 247, 105, 231, 98, 235, 163, 197, 77, 209, 211, - 244, 180, 235, 107, 212, 102, 26, 235, 111, 219, 67, 218, 154, 247, 146, - 244, 253, 232, 133, 250, 207, 213, 211, 201, 243, 232, 165, 244, 239, - 203, 15, 202, 110, 244, 225, 248, 113, 213, 40, 250, 205, 199, 30, 234, - 97, 239, 86, 232, 31, 205, 231, 220, 116, 248, 166, 234, 98, 239, 132, - 248, 73, 235, 63, 212, 138, 247, 113, 34, 216, 13, 218, 120, 34, 216, 8, - 208, 181, 233, 59, 34, 224, 151, 201, 120, 199, 9, 34, 208, 159, 209, - 114, 206, 202, 3, 208, 200, 203, 20, 210, 236, 26, 249, 103, 206, 3, 26, - 206, 3, 248, 97, 249, 60, 26, 231, 161, 245, 87, 235, 93, 205, 205, 209, - 115, 204, 83, 205, 106, 219, 196, 201, 146, 231, 99, 210, 237, 251, 115, - 235, 36, 209, 128, 235, 36, 204, 54, 197, 94, 222, 97, 233, 134, 210, - 238, 218, 176, 210, 238, 247, 116, 241, 69, 249, 57, 26, 249, 103, 198, - 238, 235, 152, 231, 182, 204, 238, 26, 249, 103, 230, 202, 231, 182, 204, - 238, 26, 211, 219, 203, 153, 203, 20, 213, 230, 26, 249, 103, 205, 207, - 247, 121, 218, 169, 247, 144, 249, 8, 3, 200, 76, 248, 12, 241, 135, 231, - 88, 248, 10, 244, 233, 239, 198, 231, 88, 248, 11, 244, 223, 248, 11, - 239, 190, 239, 191, 225, 241, 217, 204, 213, 136, 205, 18, 231, 88, 248, - 11, 231, 88, 3, 234, 81, 214, 157, 248, 11, 225, 202, 212, 74, 214, 156, - 236, 105, 212, 74, 214, 156, 231, 97, 249, 84, 250, 138, 203, 29, 220, - 116, 231, 93, 221, 209, 231, 93, 241, 119, 204, 222, 208, 166, 239, 201, - 204, 222, 235, 222, 225, 222, 222, 233, 225, 202, 247, 94, 236, 105, 247, - 94, 59, 213, 59, 58, 213, 59, 197, 120, 59, 235, 93, 197, 120, 58, 235, - 93, 209, 197, 58, 209, 197, 223, 74, 249, 124, 210, 236, 26, 206, 134, - 248, 78, 26, 51, 251, 110, 236, 236, 73, 235, 102, 200, 199, 236, 236, - 73, 235, 102, 200, 196, 236, 236, 73, 235, 102, 200, 194, 236, 236, 73, - 235, 102, 200, 192, 236, 236, 73, 235, 102, 200, 190, 210, 198, 218, 166, - 214, 13, 197, 128, 248, 16, 241, 83, 202, 102, 222, 145, 210, 240, 247, - 92, 237, 223, 241, 67, 197, 80, 205, 214, 205, 212, 231, 98, 210, 210, - 233, 140, 206, 249, 218, 209, 209, 201, 245, 73, 239, 17, 212, 184, 248, - 114, 236, 255, 214, 169, 205, 121, 206, 244, 248, 15, 251, 69, 231, 167, - 223, 66, 248, 245, 235, 111, 201, 145, 235, 111, 248, 121, 201, 1, 232, - 163, 245, 74, 249, 141, 245, 74, 234, 233, 249, 141, 245, 74, 248, 156, - 213, 61, 224, 5, 212, 90, 237, 213, 247, 148, 249, 129, 247, 148, 239, 8, - 218, 167, 235, 233, 241, 84, 235, 233, 202, 103, 235, 233, 210, 241, 235, - 233, 247, 93, 235, 233, 237, 224, 235, 233, 205, 104, 197, 80, 231, 99, - 235, 233, 218, 210, 235, 233, 239, 18, 235, 233, 212, 185, 235, 233, 234, - 237, 235, 233, 232, 215, 235, 233, 197, 24, 235, 233, 249, 3, 235, 233, - 213, 187, 235, 233, 212, 185, 216, 20, 213, 105, 212, 12, 245, 58, 236, - 59, 236, 67, 237, 76, 216, 20, 218, 164, 201, 249, 59, 124, 212, 107, - 249, 136, 226, 72, 59, 135, 212, 107, 249, 136, 226, 72, 59, 50, 212, - 107, 249, 136, 226, 72, 59, 53, 212, 107, 249, 136, 226, 72, 235, 105, - 232, 210, 55, 197, 120, 232, 210, 55, 214, 140, 232, 210, 55, 202, 140, - 124, 55, 202, 140, 135, 55, 244, 224, 232, 185, 55, 192, 232, 185, 55, - 241, 53, 197, 20, 232, 165, 236, 62, 217, 108, 203, 214, 225, 192, 237, - 218, 224, 77, 248, 169, 197, 20, 244, 196, 211, 199, 232, 189, 212, 65, - 220, 50, 206, 194, 250, 164, 206, 194, 232, 47, 206, 194, 197, 20, 208, - 216, 197, 20, 248, 96, 235, 34, 247, 234, 226, 87, 206, 78, 247, 233, - 226, 87, 206, 78, 248, 68, 233, 169, 220, 62, 197, 21, 235, 211, 220, 63, - 26, 197, 22, 231, 176, 232, 184, 99, 219, 165, 231, 176, 232, 184, 99, - 197, 19, 231, 176, 232, 184, 212, 99, 214, 155, 197, 22, 3, 247, 252, - 237, 74, 248, 41, 3, 199, 109, 213, 29, 3, 248, 125, 232, 233, 220, 63, - 3, 233, 73, 212, 221, 220, 45, 220, 63, 3, 201, 9, 214, 132, 220, 62, - 214, 132, 197, 21, 249, 140, 241, 136, 197, 5, 212, 17, 225, 202, 214, - 150, 225, 202, 233, 139, 233, 200, 249, 141, 251, 95, 236, 72, 251, 154, - 251, 155, 218, 199, 226, 92, 205, 254, 226, 61, 239, 187, 213, 28, 233, - 67, 240, 90, 222, 58, 217, 229, 212, 98, 235, 234, 220, 7, 232, 232, 249, - 78, 212, 101, 203, 235, 212, 177, 224, 58, 78, 221, 209, 222, 135, 210, - 2, 234, 38, 204, 228, 224, 57, 248, 79, 241, 87, 3, 232, 126, 197, 101, - 248, 255, 232, 126, 248, 33, 232, 126, 99, 232, 124, 205, 140, 232, 126, - 233, 83, 232, 126, 232, 127, 3, 51, 248, 119, 232, 126, 233, 91, 232, - 126, 196, 62, 232, 126, 211, 200, 232, 126, 232, 127, 3, 210, 62, 210, - 83, 232, 124, 232, 127, 239, 242, 239, 141, 207, 21, 3, 39, 76, 226, 41, - 237, 2, 175, 248, 8, 251, 94, 105, 248, 105, 205, 243, 105, 244, 170, - 105, 205, 115, 204, 61, 105, 237, 209, 240, 66, 105, 212, 178, 77, 212, - 91, 235, 75, 248, 181, 239, 49, 105, 205, 132, 249, 101, 202, 160, 249, - 101, 59, 235, 62, 231, 58, 212, 105, 105, 218, 214, 249, 122, 241, 17, - 236, 92, 85, 239, 10, 55, 241, 74, 247, 114, 249, 83, 3, 196, 60, 55, - 249, 83, 3, 239, 10, 55, 249, 83, 3, 236, 108, 55, 249, 83, 3, 212, 63, - 55, 218, 214, 3, 197, 45, 245, 111, 3, 200, 24, 201, 186, 26, 196, 60, - 55, 208, 139, 213, 27, 241, 157, 248, 39, 219, 21, 235, 67, 239, 73, 214, - 76, 239, 78, 237, 169, 235, 138, 235, 47, 192, 235, 138, 235, 47, 213, - 228, 3, 241, 21, 213, 228, 235, 226, 200, 36, 247, 154, 203, 56, 247, - 154, 247, 115, 226, 72, 245, 111, 3, 200, 24, 201, 185, 245, 111, 3, 237, - 231, 201, 185, 249, 80, 245, 110, 244, 209, 211, 195, 209, 187, 211, 195, - 213, 160, 204, 218, 209, 122, 201, 177, 209, 122, 248, 101, 203, 151, - 222, 189, 216, 11, 216, 12, 3, 239, 241, 241, 86, 244, 203, 248, 102, - 192, 248, 102, 233, 91, 248, 102, 248, 119, 248, 102, 214, 71, 248, 102, - 248, 99, 217, 223, 249, 126, 208, 152, 219, 166, 203, 34, 210, 172, 213, - 226, 235, 194, 220, 116, 208, 196, 251, 66, 211, 220, 252, 3, 221, 211, - 245, 95, 219, 178, 214, 33, 201, 194, 226, 83, 201, 194, 213, 235, 237, - 129, 105, 226, 80, 236, 194, 236, 195, 3, 237, 231, 61, 57, 244, 203, - 220, 78, 3, 221, 201, 235, 93, 244, 203, 220, 78, 3, 210, 215, 235, 93, - 192, 220, 78, 3, 210, 215, 235, 93, 192, 220, 78, 3, 221, 201, 235, 93, - 212, 71, 212, 72, 231, 102, 217, 78, 218, 243, 212, 229, 218, 243, 212, - 230, 3, 91, 61, 250, 169, 222, 184, 199, 33, 218, 242, 218, 243, 212, - 230, 214, 158, 216, 51, 218, 243, 212, 228, 251, 67, 3, 249, 68, 247, - 146, 247, 147, 3, 235, 84, 199, 30, 247, 146, 203, 31, 210, 231, 199, 29, - 235, 131, 211, 254, 212, 81, 204, 240, 212, 40, 249, 7, 200, 219, 91, - 250, 214, 244, 205, 91, 26, 107, 192, 244, 250, 250, 214, 244, 205, 91, - 26, 107, 192, 244, 250, 250, 215, 3, 46, 97, 214, 20, 244, 205, 237, 231, - 26, 200, 24, 192, 244, 250, 250, 214, 251, 65, 237, 231, 26, 200, 24, - 192, 244, 250, 250, 214, 126, 248, 37, 105, 130, 248, 37, 105, 205, 137, - 3, 247, 139, 106, 205, 136, 205, 137, 3, 97, 205, 162, 197, 122, 205, - 137, 3, 115, 205, 162, 197, 121, 249, 50, 237, 2, 212, 130, 222, 179, - 220, 90, 233, 157, 210, 17, 220, 90, 233, 157, 221, 255, 3, 226, 53, 213, - 65, 244, 203, 221, 255, 3, 224, 153, 224, 153, 221, 254, 192, 221, 254, - 248, 229, 248, 230, 3, 247, 139, 106, 248, 100, 222, 66, 105, 210, 232, - 247, 227, 249, 139, 3, 107, 61, 57, 236, 222, 3, 107, 61, 57, 214, 120, - 3, 236, 90, 117, 3, 50, 53, 61, 57, 205, 170, 3, 91, 61, 57, 201, 243, 3, - 200, 24, 61, 57, 216, 51, 97, 200, 64, 237, 29, 105, 224, 150, 203, 23, - 226, 47, 16, 36, 8, 6, 222, 134, 226, 47, 16, 36, 8, 4, 222, 134, 226, - 47, 16, 36, 215, 143, 226, 47, 16, 36, 203, 249, 226, 47, 16, 36, 8, 222, - 134, 235, 118, 237, 2, 201, 238, 196, 252, 232, 216, 215, 126, 26, 248, - 107, 231, 183, 212, 158, 219, 66, 203, 32, 241, 43, 249, 103, 206, 29, - 212, 109, 205, 8, 3, 112, 238, 253, 225, 202, 16, 36, 248, 242, 201, 175, - 236, 238, 58, 47, 247, 227, 59, 47, 247, 227, 222, 228, 210, 158, 244, - 249, 222, 228, 248, 119, 244, 249, 222, 228, 214, 71, 239, 140, 222, 228, - 248, 119, 239, 140, 4, 214, 71, 239, 140, 4, 248, 119, 239, 140, 200, 35, - 210, 158, 201, 180, 237, 234, 210, 158, 201, 180, 200, 35, 4, 210, 158, - 201, 180, 237, 234, 4, 210, 158, 201, 180, 221, 203, 53, 207, 37, 59, - 244, 249, 200, 33, 53, 207, 37, 59, 244, 249, 46, 241, 62, 212, 95, 241, - 62, 212, 96, 3, 232, 222, 60, 241, 62, 212, 95, 216, 15, 50, 207, 108, 3, - 115, 238, 250, 216, 15, 53, 207, 108, 3, 115, 238, 250, 16, 36, 220, 23, - 247, 1, 59, 8, 241, 61, 85, 8, 241, 61, 247, 41, 241, 61, 214, 128, 105, - 237, 237, 77, 213, 90, 225, 53, 218, 182, 203, 243, 219, 161, 3, 216, - 179, 248, 56, 248, 75, 77, 231, 9, 244, 207, 235, 234, 97, 214, 175, 244, - 207, 235, 234, 99, 214, 175, 244, 207, 235, 234, 115, 214, 175, 244, 207, - 235, 234, 235, 7, 214, 175, 244, 207, 235, 234, 235, 101, 214, 175, 244, - 207, 235, 234, 206, 29, 214, 175, 244, 207, 235, 234, 207, 71, 214, 175, - 244, 207, 235, 234, 237, 31, 214, 175, 244, 207, 235, 234, 216, 179, 214, - 175, 244, 207, 235, 234, 203, 24, 214, 175, 244, 207, 235, 234, 236, 253, - 214, 175, 244, 207, 235, 234, 200, 240, 214, 175, 244, 207, 235, 234, - 214, 112, 244, 207, 235, 234, 200, 213, 244, 207, 235, 234, 202, 146, - 244, 207, 235, 234, 235, 3, 244, 207, 235, 234, 235, 99, 244, 207, 235, - 234, 206, 25, 244, 207, 235, 234, 207, 70, 244, 207, 235, 234, 237, 30, - 244, 207, 235, 234, 216, 178, 244, 207, 235, 234, 203, 22, 244, 207, 235, - 234, 236, 251, 244, 207, 235, 234, 200, 238, 53, 205, 136, 53, 205, 137, - 3, 97, 205, 162, 197, 122, 53, 205, 137, 3, 115, 205, 162, 197, 121, 248, - 3, 248, 4, 3, 205, 162, 197, 121, 210, 0, 248, 229, 248, 102, 247, 137, - 220, 47, 244, 206, 58, 205, 255, 26, 241, 60, 216, 51, 212, 164, 231, - 175, 220, 63, 226, 87, 247, 236, 204, 125, 222, 127, 205, 241, 214, 73, - 205, 95, 240, 71, 204, 107, 205, 124, 205, 125, 197, 102, 225, 111, 220, - 63, 240, 89, 50, 232, 210, 203, 34, 210, 172, 203, 34, 210, 173, 3, 213, - 227, 53, 232, 210, 203, 34, 210, 172, 59, 201, 224, 203, 33, 58, 201, - 224, 203, 33, 203, 34, 214, 120, 201, 243, 77, 218, 239, 244, 228, 218, - 243, 212, 229, 249, 139, 77, 236, 194, 205, 14, 236, 194, 236, 195, 3, - 222, 92, 235, 54, 236, 194, 213, 66, 127, 205, 14, 236, 194, 222, 65, - 213, 159, 58, 211, 195, 221, 203, 50, 213, 64, 221, 203, 50, 249, 97, - 213, 65, 221, 203, 50, 235, 9, 213, 65, 221, 203, 50, 213, 220, 221, 203, - 50, 241, 77, 50, 196, 246, 232, 209, 163, 214, 140, 232, 210, 55, 210, - 215, 232, 210, 3, 235, 123, 205, 114, 210, 89, 210, 215, 232, 210, 3, - 235, 123, 205, 114, 210, 89, 202, 140, 124, 55, 210, 89, 202, 140, 135, - 55, 210, 89, 199, 32, 232, 209, 210, 89, 232, 210, 3, 112, 235, 128, 236, - 78, 210, 215, 232, 210, 3, 213, 134, 248, 204, 112, 26, 210, 3, 235, 122, - 59, 135, 212, 107, 50, 232, 210, 226, 72, 206, 96, 59, 50, 212, 107, 226, - 72, 206, 96, 59, 53, 212, 107, 226, 72, 206, 96, 58, 50, 212, 107, 226, - 72, 206, 96, 58, 53, 212, 107, 226, 72, 58, 50, 212, 107, 249, 136, 226, - 72, 58, 53, 212, 107, 249, 136, 226, 72, 206, 96, 59, 124, 212, 107, 226, - 72, 206, 96, 59, 135, 212, 107, 226, 72, 206, 96, 58, 124, 212, 107, 226, - 72, 206, 96, 58, 135, 212, 107, 226, 72, 58, 124, 212, 107, 249, 136, - 226, 72, 58, 135, 212, 107, 249, 136, 226, 72, 58, 232, 126, 239, 186, - 241, 157, 224, 152, 26, 218, 166, 115, 217, 87, 241, 156, 212, 13, 212, - 115, 247, 156, 58, 232, 173, 206, 245, 235, 67, 239, 73, 59, 232, 173, - 206, 245, 235, 67, 239, 73, 205, 186, 206, 245, 235, 67, 239, 73, 203, - 104, 247, 98, 197, 40, 224, 151, 97, 247, 228, 218, 166, 99, 247, 228, - 218, 166, 115, 247, 228, 218, 166, 201, 215, 37, 213, 27, 241, 157, 232, - 173, 239, 73, 208, 154, 212, 14, 230, 195, 235, 194, 230, 195, 214, 76, - 239, 79, 230, 195, 239, 22, 3, 202, 237, 239, 22, 3, 202, 238, 26, 212, - 214, 239, 22, 3, 212, 214, 234, 251, 3, 212, 214, 234, 251, 3, 202, 82, - 234, 251, 3, 251, 107, 196, 222, 58, 235, 47, 235, 47, 192, 235, 47, 247, - 115, 132, 239, 58, 247, 115, 235, 138, 248, 70, 235, 138, 247, 169, 236, - 232, 216, 13, 236, 232, 216, 14, 213, 227, 236, 232, 216, 14, 213, 233, - 216, 13, 216, 14, 213, 227, 216, 14, 213, 233, 236, 232, 239, 21, 236, - 232, 213, 227, 236, 232, 213, 225, 239, 21, 213, 227, 213, 225, 197, 132, - 205, 121, 216, 14, 213, 233, 205, 121, 247, 155, 213, 233, 239, 186, 197, - 49, 219, 18, 219, 252, 214, 23, 244, 205, 53, 26, 50, 207, 108, 250, 214, - 247, 139, 196, 222, 226, 78, 235, 41, 206, 9, 105, 239, 240, 235, 41, - 206, 9, 105, 241, 158, 37, 224, 153, 209, 212, 217, 78, 213, 228, 3, 46, - 202, 237, 204, 230, 245, 110, 240, 119, 224, 21, 222, 59, 205, 135, 232, - 138, 226, 87, 206, 78, 115, 210, 189, 57, 115, 210, 189, 60, 115, 210, - 189, 222, 184, 115, 210, 189, 210, 22, 50, 205, 132, 248, 20, 53, 205, - 132, 248, 20, 99, 205, 132, 248, 19, 115, 205, 132, 248, 19, 50, 202, - 160, 248, 20, 53, 202, 160, 248, 20, 50, 251, 94, 248, 20, 53, 251, 94, - 248, 20, 218, 194, 248, 20, 222, 93, 218, 194, 248, 20, 222, 93, 218, - 193, 249, 99, 111, 3, 249, 98, 249, 99, 145, 196, 222, 249, 99, 111, 3, - 145, 196, 222, 249, 99, 27, 145, 196, 222, 249, 99, 111, 3, 27, 145, 196, - 222, 175, 245, 102, 78, 249, 99, 111, 3, 27, 245, 101, 197, 4, 220, 43, - 218, 171, 234, 218, 202, 17, 201, 220, 204, 253, 77, 222, 107, 206, 79, - 77, 225, 203, 218, 152, 233, 87, 235, 233, 233, 87, 235, 234, 3, 205, - 218, 236, 59, 235, 234, 3, 203, 52, 77, 225, 113, 205, 218, 235, 234, 3, - 192, 218, 164, 205, 218, 235, 234, 3, 192, 218, 165, 26, 205, 218, 236, - 59, 205, 218, 235, 234, 3, 192, 218, 165, 26, 244, 172, 204, 60, 205, - 218, 235, 234, 3, 192, 218, 165, 26, 202, 100, 236, 59, 205, 218, 235, - 234, 3, 232, 221, 205, 218, 235, 234, 3, 231, 101, 197, 42, 235, 233, - 205, 218, 235, 234, 3, 205, 218, 236, 59, 235, 234, 208, 186, 239, 220, - 235, 39, 210, 132, 235, 233, 205, 218, 235, 234, 3, 232, 125, 236, 59, - 205, 218, 235, 234, 3, 204, 107, 205, 217, 235, 233, 217, 85, 235, 233, - 236, 80, 235, 233, 200, 70, 235, 233, 235, 234, 3, 244, 172, 204, 60, - 213, 57, 235, 233, 241, 149, 235, 233, 241, 150, 235, 233, 224, 56, 235, - 233, 235, 234, 202, 143, 39, 224, 57, 224, 56, 235, 234, 3, 205, 218, - 236, 59, 224, 56, 235, 234, 3, 244, 203, 236, 59, 235, 234, 3, 204, 180, - 201, 249, 235, 234, 3, 204, 180, 201, 250, 26, 197, 42, 236, 67, 235, - 234, 3, 204, 180, 201, 250, 26, 202, 100, 236, 59, 239, 80, 235, 233, - 197, 3, 235, 233, 251, 86, 235, 233, 212, 62, 235, 233, 241, 45, 235, - 233, 213, 31, 235, 233, 235, 234, 3, 221, 228, 77, 201, 157, 239, 80, - 247, 232, 210, 132, 235, 233, 234, 229, 235, 234, 3, 192, 218, 164, 251, - 84, 235, 233, 235, 187, 235, 233, 197, 103, 235, 233, 205, 242, 235, 233, - 202, 62, 235, 233, 233, 88, 235, 233, 221, 212, 241, 45, 235, 233, 235, - 234, 3, 192, 218, 164, 231, 47, 235, 233, 235, 234, 3, 192, 218, 165, 26, - 244, 172, 204, 60, 235, 234, 208, 156, 226, 87, 235, 188, 250, 176, 235, - 233, 235, 59, 235, 233, 205, 243, 235, 233, 239, 49, 235, 233, 235, 234, - 197, 37, 218, 164, 235, 234, 3, 219, 193, 220, 9, 233, 87, 247, 93, 235, - 234, 3, 205, 218, 236, 59, 247, 93, 235, 234, 3, 203, 52, 77, 225, 113, - 205, 218, 247, 93, 235, 234, 3, 192, 218, 164, 205, 218, 247, 93, 235, - 234, 3, 232, 125, 236, 59, 247, 93, 235, 234, 3, 196, 244, 205, 219, 224, - 56, 247, 93, 235, 234, 3, 244, 203, 236, 59, 212, 62, 247, 93, 235, 233, - 241, 45, 247, 93, 235, 233, 197, 103, 247, 93, 235, 233, 205, 236, 234, - 229, 235, 233, 205, 236, 205, 218, 235, 233, 200, 30, 235, 233, 235, 234, - 3, 209, 210, 236, 59, 235, 234, 3, 216, 51, 233, 131, 234, 15, 235, 234, - 3, 214, 140, 234, 15, 213, 29, 248, 76, 239, 235, 208, 128, 218, 209, - 232, 129, 218, 209, 205, 138, 218, 209, 232, 176, 213, 29, 210, 213, 97, - 232, 209, 213, 29, 210, 213, 248, 88, 232, 185, 226, 87, 247, 43, 213, - 29, 234, 228, 213, 29, 3, 212, 62, 235, 233, 213, 29, 3, 235, 48, 232, - 184, 173, 197, 89, 212, 107, 222, 192, 205, 159, 197, 89, 212, 107, 222, - 192, 173, 237, 69, 212, 107, 222, 192, 205, 159, 237, 69, 212, 107, 222, - 192, 163, 173, 197, 89, 212, 107, 222, 192, 163, 205, 159, 197, 89, 212, - 107, 222, 192, 163, 173, 237, 69, 212, 107, 222, 192, 163, 205, 159, 237, - 69, 212, 107, 222, 192, 173, 197, 89, 212, 107, 199, 15, 222, 192, 205, - 159, 197, 89, 212, 107, 199, 15, 222, 192, 173, 237, 69, 212, 107, 199, - 15, 222, 192, 205, 159, 237, 69, 212, 107, 199, 15, 222, 192, 85, 173, - 197, 89, 212, 107, 199, 15, 222, 192, 85, 205, 159, 197, 89, 212, 107, - 199, 15, 222, 192, 85, 173, 237, 69, 212, 107, 199, 15, 222, 192, 85, - 205, 159, 237, 69, 212, 107, 199, 15, 222, 192, 173, 197, 89, 212, 107, - 248, 17, 205, 159, 197, 89, 212, 107, 248, 17, 173, 237, 69, 212, 107, - 248, 17, 205, 159, 237, 69, 212, 107, 248, 17, 85, 173, 197, 89, 212, - 107, 248, 17, 85, 205, 159, 197, 89, 212, 107, 248, 17, 85, 173, 237, 69, - 212, 107, 248, 17, 85, 205, 159, 237, 69, 212, 107, 248, 17, 231, 174, - 211, 72, 47, 214, 59, 231, 174, 211, 72, 47, 214, 60, 226, 87, 58, 205, - 94, 205, 179, 211, 72, 47, 214, 59, 205, 179, 211, 72, 47, 214, 60, 226, - 87, 58, 205, 94, 107, 209, 217, 200, 24, 209, 217, 91, 209, 217, 237, - 231, 209, 217, 145, 33, 236, 129, 214, 59, 85, 145, 33, 236, 129, 214, - 59, 33, 192, 236, 129, 214, 59, 85, 33, 192, 236, 129, 214, 59, 85, 251, - 112, 214, 59, 204, 63, 251, 112, 214, 59, 45, 85, 52, 163, 244, 160, 211, - 62, 117, 214, 59, 45, 85, 52, 244, 160, 211, 62, 117, 214, 59, 45, 85, - 126, 52, 244, 160, 211, 62, 117, 214, 59, 85, 226, 27, 214, 59, 45, 226, - 27, 214, 59, 85, 45, 226, 27, 214, 59, 199, 48, 85, 205, 177, 199, 48, - 85, 210, 90, 205, 177, 245, 100, 248, 113, 210, 90, 245, 100, 248, 113, - 209, 217, 232, 108, 204, 248, 221, 252, 210, 220, 247, 116, 232, 44, 201, - 207, 232, 44, 201, 208, 3, 248, 6, 216, 20, 201, 207, 219, 136, 175, 210, - 221, 204, 254, 201, 205, 201, 206, 247, 116, 247, 237, 214, 116, 247, - 237, 201, 153, 247, 238, 204, 226, 219, 22, 251, 116, 235, 119, 236, 214, - 212, 99, 247, 116, 214, 116, 212, 99, 247, 116, 203, 78, 214, 116, 203, - 78, 250, 137, 214, 116, 250, 137, 210, 165, 199, 110, 239, 216, 201, 144, - 250, 208, 221, 219, 201, 214, 218, 202, 218, 170, 210, 219, 204, 77, 210, - 219, 218, 170, 247, 168, 251, 231, 201, 204, 206, 207, 209, 184, 205, - 130, 231, 155, 201, 211, 222, 95, 83, 201, 211, 222, 95, 241, 136, 55, - 212, 99, 247, 100, 210, 83, 222, 95, 201, 177, 235, 94, 214, 120, 212, - 73, 239, 1, 216, 51, 236, 200, 55, 205, 216, 105, 216, 51, 205, 216, 105, - 211, 194, 222, 48, 226, 87, 225, 231, 212, 149, 105, 239, 29, 216, 19, - 222, 48, 105, 212, 67, 197, 128, 105, 216, 35, 197, 128, 105, 248, 180, - 216, 51, 248, 179, 248, 178, 218, 170, 248, 178, 213, 81, 216, 51, 213, - 80, 245, 65, 241, 54, 219, 160, 105, 197, 18, 105, 210, 99, 249, 141, - 105, 202, 18, 197, 128, 244, 200, 206, 162, 249, 53, 249, 51, 213, 118, - 241, 120, 241, 3, 249, 118, 244, 229, 50, 221, 181, 201, 181, 3, 209, - 185, 241, 100, 212, 1, 55, 46, 226, 61, 205, 160, 248, 67, 105, 233, 168, - 105, 241, 92, 26, 222, 239, 205, 243, 252, 19, 206, 185, 249, 117, 248, - 228, 248, 229, 248, 252, 212, 149, 77, 197, 2, 214, 172, 55, 206, 185, - 201, 154, 204, 176, 213, 224, 232, 40, 203, 26, 232, 217, 26, 196, 252, - 206, 220, 214, 145, 237, 206, 218, 174, 210, 220, 201, 216, 218, 177, - 248, 112, 200, 35, 219, 33, 251, 187, 200, 35, 251, 187, 200, 35, 4, 251, - 187, 4, 251, 187, 216, 24, 251, 187, 251, 188, 239, 200, 251, 188, 250, - 220, 208, 195, 214, 116, 235, 119, 236, 214, 239, 130, 221, 252, 213, - 122, 206, 207, 208, 160, 218, 177, 208, 160, 247, 127, 205, 245, 235, 54, - 208, 190, 206, 5, 250, 139, 210, 58, 150, 16, 36, 211, 68, 150, 16, 36, - 251, 189, 150, 16, 36, 235, 118, 150, 16, 36, 237, 72, 150, 16, 36, 197, - 127, 150, 16, 36, 251, 16, 150, 16, 36, 251, 17, 210, 152, 150, 16, 36, - 251, 17, 210, 151, 150, 16, 36, 251, 17, 198, 254, 150, 16, 36, 251, 17, - 198, 253, 150, 16, 36, 199, 12, 150, 16, 36, 199, 11, 150, 16, 36, 199, - 10, 150, 16, 36, 204, 118, 150, 16, 36, 212, 238, 204, 118, 150, 16, 36, - 58, 204, 118, 150, 16, 36, 219, 159, 204, 149, 150, 16, 36, 219, 159, - 204, 148, 150, 16, 36, 219, 159, 204, 147, 150, 16, 36, 244, 252, 150, - 16, 36, 208, 233, 150, 16, 36, 216, 167, 150, 16, 36, 198, 252, 150, 16, - 36, 198, 251, 150, 16, 36, 209, 218, 208, 233, 150, 16, 36, 209, 218, - 208, 232, 150, 16, 36, 233, 135, 150, 16, 36, 206, 75, 150, 16, 36, 225, - 254, 214, 66, 150, 16, 36, 225, 254, 214, 65, 150, 16, 36, 241, 66, 77, - 225, 253, 150, 16, 36, 210, 148, 77, 225, 253, 150, 16, 36, 241, 111, - 214, 66, 150, 16, 36, 225, 252, 214, 66, 150, 16, 36, 204, 150, 77, 241, - 110, 150, 16, 36, 241, 66, 77, 241, 110, 150, 16, 36, 241, 66, 77, 241, - 109, 150, 16, 36, 241, 111, 251, 59, 150, 16, 36, 208, 234, 77, 241, 111, - 251, 59, 150, 16, 36, 204, 150, 77, 208, 234, 77, 241, 110, 150, 16, 36, - 199, 104, 150, 16, 36, 202, 75, 214, 66, 150, 16, 36, 222, 196, 214, 66, - 150, 16, 36, 251, 58, 214, 66, 150, 16, 36, 204, 150, 77, 251, 57, 150, - 16, 36, 208, 234, 77, 251, 57, 150, 16, 36, 204, 150, 77, 208, 234, 77, - 251, 57, 150, 16, 36, 199, 13, 77, 251, 57, 150, 16, 36, 210, 148, 77, - 251, 57, 150, 16, 36, 210, 148, 77, 251, 56, 150, 16, 36, 210, 147, 150, - 16, 36, 210, 146, 150, 16, 36, 210, 145, 150, 16, 36, 210, 144, 150, 16, - 36, 251, 149, 150, 16, 36, 251, 148, 150, 16, 36, 220, 34, 150, 16, 36, - 208, 240, 150, 16, 36, 250, 213, 150, 16, 36, 210, 176, 150, 16, 36, 210, - 175, 150, 16, 36, 250, 141, 150, 16, 36, 248, 146, 214, 66, 150, 16, 36, - 203, 99, 150, 16, 36, 203, 98, 150, 16, 36, 211, 74, 222, 84, 150, 16, - 36, 248, 93, 150, 16, 36, 248, 92, 150, 16, 36, 248, 91, 150, 16, 36, - 251, 125, 150, 16, 36, 214, 144, 150, 16, 36, 205, 117, 150, 16, 36, 202, - 73, 150, 16, 36, 233, 55, 150, 16, 36, 197, 115, 150, 16, 36, 212, 61, - 150, 16, 36, 247, 151, 150, 16, 36, 200, 252, 150, 16, 36, 247, 118, 218, - 183, 150, 16, 36, 208, 170, 77, 225, 115, 150, 16, 36, 247, 165, 150, 16, - 36, 201, 174, 150, 16, 36, 205, 5, 201, 174, 150, 16, 36, 221, 251, 150, - 16, 36, 205, 191, 150, 16, 36, 200, 13, 150, 16, 36, 231, 99, 237, 184, - 150, 16, 36, 250, 190, 150, 16, 36, 212, 69, 250, 190, 150, 16, 36, 248, - 42, 150, 16, 36, 212, 60, 248, 42, 150, 16, 36, 251, 122, 150, 16, 36, - 204, 213, 204, 99, 204, 212, 150, 16, 36, 204, 213, 204, 99, 204, 211, - 150, 16, 36, 204, 146, 150, 16, 36, 212, 33, 150, 16, 36, 239, 68, 150, - 16, 36, 239, 70, 150, 16, 36, 239, 69, 150, 16, 36, 211, 203, 150, 16, - 36, 211, 192, 150, 16, 36, 241, 52, 150, 16, 36, 241, 51, 150, 16, 36, - 241, 50, 150, 16, 36, 241, 49, 150, 16, 36, 241, 48, 150, 16, 36, 251, - 163, 150, 16, 36, 249, 54, 77, 220, 15, 150, 16, 36, 249, 54, 77, 199, - 138, 150, 16, 36, 210, 97, 150, 16, 36, 231, 91, 150, 16, 36, 216, 194, - 150, 16, 36, 240, 53, 150, 16, 36, 218, 197, 150, 16, 36, 157, 237, 221, - 150, 16, 36, 157, 214, 37, 58, 222, 179, 225, 237, 53, 201, 180, 58, 200, - 35, 225, 237, 53, 201, 180, 58, 210, 17, 225, 237, 53, 201, 180, 58, 237, - 234, 225, 237, 53, 201, 180, 58, 205, 236, 4, 244, 249, 219, 190, 27, 59, - 244, 249, 27, 59, 244, 249, 85, 59, 244, 249, 199, 48, 85, 59, 244, 249, - 236, 71, 85, 59, 244, 249, 59, 244, 250, 241, 132, 58, 4, 244, 249, 209, - 187, 203, 100, 58, 202, 70, 205, 94, 58, 205, 236, 4, 205, 94, 175, 59, - 205, 94, 219, 190, 59, 205, 94, 27, 59, 205, 94, 85, 59, 205, 94, 199, - 48, 85, 59, 205, 94, 236, 71, 85, 59, 205, 94, 59, 47, 241, 132, 58, 199, - 48, 4, 205, 94, 59, 47, 241, 132, 58, 219, 190, 205, 94, 47, 203, 100, - 58, 202, 70, 239, 140, 58, 199, 48, 4, 239, 140, 58, 219, 190, 4, 239, - 140, 59, 239, 141, 241, 132, 58, 199, 48, 4, 239, 140, 59, 239, 141, 241, - 132, 58, 219, 190, 239, 140, 239, 141, 203, 100, 58, 202, 70, 221, 198, - 58, 199, 48, 4, 221, 198, 58, 219, 190, 4, 221, 198, 59, 221, 199, 241, - 132, 58, 4, 221, 198, 202, 188, 32, 241, 61, 175, 32, 241, 61, 219, 190, - 32, 241, 61, 27, 32, 241, 61, 199, 48, 27, 32, 241, 61, 199, 48, 85, 32, - 241, 61, 236, 71, 85, 32, 241, 61, 202, 188, 208, 230, 175, 208, 230, - 219, 190, 208, 230, 27, 208, 230, 85, 208, 230, 199, 48, 85, 208, 230, - 236, 71, 85, 208, 230, 175, 235, 101, 205, 110, 250, 179, 219, 190, 235, - 101, 205, 110, 250, 179, 27, 235, 101, 205, 110, 250, 179, 85, 235, 101, - 205, 110, 250, 179, 199, 48, 85, 235, 101, 205, 110, 250, 179, 236, 71, - 85, 235, 101, 205, 110, 250, 179, 175, 206, 29, 205, 110, 250, 179, 219, - 190, 206, 29, 205, 110, 250, 179, 27, 206, 29, 205, 110, 250, 179, 85, - 206, 29, 205, 110, 250, 179, 199, 48, 85, 206, 29, 205, 110, 250, 179, - 236, 71, 85, 206, 29, 205, 110, 250, 179, 175, 237, 31, 205, 110, 250, - 179, 219, 190, 237, 31, 205, 110, 250, 179, 27, 237, 31, 205, 110, 250, - 179, 85, 237, 31, 205, 110, 250, 179, 199, 48, 85, 237, 31, 205, 110, - 250, 179, 175, 115, 212, 109, 58, 205, 7, 219, 190, 115, 212, 109, 58, - 205, 7, 115, 212, 109, 58, 205, 7, 219, 190, 115, 212, 109, 212, 170, - 205, 7, 175, 235, 7, 212, 109, 58, 205, 7, 219, 190, 235, 7, 212, 109, - 58, 205, 7, 235, 7, 212, 109, 58, 205, 7, 219, 190, 235, 7, 212, 109, - 212, 170, 205, 7, 210, 90, 175, 235, 7, 212, 109, 212, 170, 205, 7, 175, - 235, 101, 212, 109, 58, 205, 7, 85, 235, 101, 212, 109, 58, 205, 7, 219, - 190, 206, 29, 212, 109, 58, 205, 7, 85, 206, 29, 212, 109, 58, 205, 7, - 206, 29, 212, 109, 212, 170, 205, 7, 219, 190, 237, 31, 212, 109, 58, - 205, 7, 85, 237, 31, 212, 109, 58, 205, 7, 199, 48, 85, 237, 31, 212, - 109, 58, 205, 7, 85, 237, 31, 212, 109, 212, 170, 205, 7, 175, 200, 240, - 212, 109, 58, 205, 7, 85, 200, 240, 212, 109, 58, 205, 7, 85, 200, 240, - 212, 109, 212, 170, 205, 7, 46, 201, 180, 217, 104, 46, 201, 180, 46, - 205, 94, 217, 104, 46, 205, 94, 222, 228, 214, 71, 244, 249, 222, 228, - 196, 62, 244, 249, 222, 228, 233, 91, 244, 249, 222, 228, 211, 200, 244, - 249, 222, 228, 248, 30, 244, 249, 222, 228, 210, 158, 205, 94, 222, 228, - 248, 119, 205, 94, 222, 228, 214, 71, 205, 94, 222, 228, 196, 62, 205, - 94, 222, 228, 233, 91, 205, 94, 222, 228, 211, 200, 205, 94, 222, 228, - 248, 30, 205, 94, 107, 61, 3, 4, 201, 181, 250, 217, 200, 24, 61, 3, 4, - 201, 181, 250, 217, 91, 61, 3, 4, 201, 181, 250, 217, 237, 231, 61, 3, 4, - 201, 181, 250, 217, 107, 61, 3, 219, 190, 201, 181, 250, 217, 200, 24, - 61, 3, 219, 190, 201, 181, 250, 217, 91, 61, 3, 219, 190, 201, 181, 250, - 217, 237, 231, 61, 3, 219, 190, 201, 181, 250, 217, 107, 61, 3, 222, 228, - 201, 181, 250, 217, 200, 24, 61, 3, 222, 228, 201, 181, 250, 217, 91, 61, - 3, 222, 228, 201, 181, 250, 217, 237, 231, 61, 3, 222, 228, 201, 181, - 250, 217, 107, 61, 3, 4, 236, 166, 250, 217, 200, 24, 61, 3, 4, 236, 166, - 250, 217, 91, 61, 3, 4, 236, 166, 250, 217, 237, 231, 61, 3, 4, 236, 166, - 250, 217, 107, 61, 3, 236, 166, 250, 217, 200, 24, 61, 3, 236, 166, 250, - 217, 91, 61, 3, 236, 166, 250, 217, 237, 231, 61, 3, 236, 166, 250, 217, - 85, 107, 61, 3, 236, 166, 250, 217, 85, 200, 24, 61, 3, 236, 166, 250, - 217, 85, 91, 61, 3, 236, 166, 250, 217, 85, 237, 231, 61, 3, 236, 166, - 250, 217, 85, 107, 61, 3, 222, 228, 236, 166, 250, 217, 85, 200, 24, 61, - 3, 222, 228, 236, 166, 250, 217, 85, 91, 61, 3, 222, 228, 236, 166, 250, - 217, 85, 237, 231, 61, 3, 222, 228, 236, 166, 250, 217, 107, 201, 179, - 61, 3, 217, 210, 207, 35, 200, 24, 201, 179, 61, 3, 217, 210, 207, 35, - 91, 201, 179, 61, 3, 217, 210, 207, 35, 237, 231, 201, 179, 61, 3, 217, - 210, 207, 35, 107, 201, 179, 61, 3, 219, 190, 207, 35, 200, 24, 201, 179, - 61, 3, 219, 190, 207, 35, 91, 201, 179, 61, 3, 219, 190, 207, 35, 237, - 231, 201, 179, 61, 3, 219, 190, 207, 35, 107, 201, 179, 61, 3, 27, 207, - 35, 200, 24, 201, 179, 61, 3, 27, 207, 35, 91, 201, 179, 61, 3, 27, 207, - 35, 237, 231, 201, 179, 61, 3, 27, 207, 35, 107, 201, 179, 61, 3, 85, - 207, 35, 200, 24, 201, 179, 61, 3, 85, 207, 35, 91, 201, 179, 61, 3, 85, - 207, 35, 237, 231, 201, 179, 61, 3, 85, 207, 35, 107, 201, 179, 61, 3, - 199, 48, 85, 207, 35, 200, 24, 201, 179, 61, 3, 199, 48, 85, 207, 35, 91, - 201, 179, 61, 3, 199, 48, 85, 207, 35, 237, 231, 201, 179, 61, 3, 199, - 48, 85, 207, 35, 107, 235, 126, 51, 200, 24, 235, 126, 51, 91, 235, 126, - 51, 237, 231, 235, 126, 51, 107, 103, 51, 200, 24, 103, 51, 91, 103, 51, - 237, 231, 103, 51, 107, 241, 159, 51, 200, 24, 241, 159, 51, 91, 241, - 159, 51, 237, 231, 241, 159, 51, 107, 85, 241, 159, 51, 200, 24, 85, 241, - 159, 51, 91, 85, 241, 159, 51, 237, 231, 85, 241, 159, 51, 107, 85, 51, - 200, 24, 85, 51, 91, 85, 51, 237, 231, 85, 51, 107, 45, 51, 200, 24, 45, - 51, 91, 45, 51, 237, 231, 45, 51, 173, 197, 89, 45, 51, 173, 237, 69, 45, - 51, 205, 159, 237, 69, 45, 51, 205, 159, 197, 89, 45, 51, 50, 53, 45, 51, - 124, 135, 45, 51, 197, 61, 107, 175, 165, 51, 197, 61, 200, 24, 175, 165, - 51, 197, 61, 91, 175, 165, 51, 197, 61, 237, 231, 175, 165, 51, 197, 61, - 173, 197, 89, 175, 165, 51, 197, 61, 173, 237, 69, 175, 165, 51, 197, 61, - 205, 159, 237, 69, 175, 165, 51, 197, 61, 205, 159, 197, 89, 175, 165, - 51, 197, 61, 107, 165, 51, 197, 61, 200, 24, 165, 51, 197, 61, 91, 165, - 51, 197, 61, 237, 231, 165, 51, 197, 61, 173, 197, 89, 165, 51, 197, 61, - 173, 237, 69, 165, 51, 197, 61, 205, 159, 237, 69, 165, 51, 197, 61, 205, - 159, 197, 89, 165, 51, 197, 61, 107, 219, 190, 165, 51, 197, 61, 200, 24, - 219, 190, 165, 51, 197, 61, 91, 219, 190, 165, 51, 197, 61, 237, 231, - 219, 190, 165, 51, 197, 61, 173, 197, 89, 219, 190, 165, 51, 197, 61, - 173, 237, 69, 219, 190, 165, 51, 197, 61, 205, 159, 237, 69, 219, 190, - 165, 51, 197, 61, 205, 159, 197, 89, 219, 190, 165, 51, 197, 61, 107, 85, - 165, 51, 197, 61, 200, 24, 85, 165, 51, 197, 61, 91, 85, 165, 51, 197, - 61, 237, 231, 85, 165, 51, 197, 61, 173, 197, 89, 85, 165, 51, 197, 61, - 173, 237, 69, 85, 165, 51, 197, 61, 205, 159, 237, 69, 85, 165, 51, 197, - 61, 205, 159, 197, 89, 85, 165, 51, 197, 61, 107, 199, 48, 85, 165, 51, - 197, 61, 200, 24, 199, 48, 85, 165, 51, 197, 61, 91, 199, 48, 85, 165, - 51, 197, 61, 237, 231, 199, 48, 85, 165, 51, 197, 61, 173, 197, 89, 199, - 48, 85, 165, 51, 197, 61, 173, 237, 69, 199, 48, 85, 165, 51, 197, 61, - 205, 159, 237, 69, 199, 48, 85, 165, 51, 197, 61, 205, 159, 197, 89, 199, - 48, 85, 165, 51, 107, 201, 181, 250, 217, 200, 24, 201, 181, 250, 217, - 91, 201, 181, 250, 217, 237, 231, 201, 181, 250, 217, 107, 59, 61, 197, - 39, 201, 181, 250, 217, 200, 24, 59, 61, 197, 39, 201, 181, 250, 217, 91, - 59, 61, 197, 39, 201, 181, 250, 217, 237, 231, 59, 61, 197, 39, 201, 181, - 250, 217, 107, 61, 3, 216, 15, 203, 135, 200, 24, 61, 3, 216, 15, 203, - 135, 91, 61, 3, 216, 15, 203, 135, 237, 231, 61, 3, 216, 15, 203, 135, - 85, 61, 207, 36, 197, 59, 100, 85, 61, 207, 36, 197, 59, 99, 202, 181, - 85, 61, 207, 36, 197, 59, 97, 232, 225, 85, 61, 207, 36, 197, 59, 97, - 202, 184, 107, 248, 82, 59, 51, 91, 248, 85, 207, 38, 59, 51, 107, 201, - 243, 207, 38, 59, 51, 91, 201, 243, 207, 38, 59, 51, 107, 222, 178, 59, - 51, 91, 210, 16, 59, 51, 107, 210, 16, 59, 51, 91, 222, 178, 59, 51, 107, - 249, 137, 207, 37, 59, 51, 91, 249, 137, 207, 37, 59, 51, 107, 234, 232, - 207, 37, 59, 51, 91, 234, 232, 207, 37, 59, 51, 59, 61, 207, 36, 197, 59, - 100, 59, 61, 207, 36, 197, 59, 99, 202, 181, 46, 241, 62, 235, 21, 3, - 235, 7, 238, 250, 46, 241, 62, 235, 21, 3, 99, 238, 250, 46, 241, 62, - 235, 20, 50, 157, 244, 250, 3, 235, 7, 238, 250, 50, 157, 244, 250, 3, - 115, 238, 250, 50, 157, 244, 250, 3, 99, 238, 250, 50, 157, 244, 250, 3, - 238, 253, 50, 157, 244, 249, 237, 232, 235, 226, 122, 237, 232, 235, 226, - 216, 15, 122, 237, 232, 235, 226, 231, 165, 3, 238, 253, 237, 232, 235, - 226, 216, 15, 231, 165, 3, 238, 253, 59, 232, 126, 248, 30, 232, 126, - 212, 174, 232, 209, 195, 20, 235, 233, 218, 213, 235, 233, 235, 234, 3, - 202, 205, 217, 92, 235, 233, 202, 186, 235, 233, 235, 234, 3, 232, 136, - 209, 220, 235, 233, 231, 66, 235, 233, 2, 77, 202, 218, 231, 101, 247, - 153, 219, 208, 232, 209, 210, 215, 249, 139, 77, 232, 209, 222, 183, 235, - 106, 210, 21, 235, 106, 232, 183, 232, 210, 3, 132, 26, 112, 235, 123, - 241, 58, 230, 249, 221, 209, 195, 231, 232, 210, 55, 235, 234, 3, 241, - 82, 232, 165, 244, 192, 235, 233, 217, 199, 235, 233, 209, 210, 214, 120, - 202, 218, 235, 70, 222, 214, 237, 212, 235, 233, 221, 146, 235, 233, 235, - 234, 213, 206, 205, 210, 235, 233, 235, 234, 3, 97, 236, 66, 210, 214, - 233, 87, 235, 234, 3, 205, 8, 236, 59, 233, 87, 235, 234, 3, 97, 222, - 228, 26, 97, 4, 236, 67, 235, 234, 3, 235, 128, 241, 85, 244, 203, 222, - 59, 207, 82, 235, 234, 3, 203, 250, 241, 85, 218, 164, 205, 218, 235, - 234, 3, 205, 218, 236, 60, 26, 232, 210, 241, 85, 218, 164, 235, 234, 3, - 192, 218, 165, 198, 234, 206, 196, 235, 234, 3, 236, 82, 232, 137, 212, - 30, 197, 21, 248, 50, 213, 205, 124, 202, 19, 207, 111, 212, 18, 220, 63, - 226, 87, 200, 248, 218, 179, 245, 37, 206, 155, 213, 29, 239, 14, 247, - 97, 225, 105, 235, 168, 218, 238, 213, 52, 196, 251, 197, 128, 212, 97, - 232, 188, 239, 55, 220, 9, 197, 53, 235, 62, 237, 207, 3, 237, 205, 244, - 210, 233, 156, 201, 20, 233, 157, 205, 107, 233, 142, 217, 88, 210, 23, - 235, 113, 212, 149, 219, 196, 208, 136, 212, 149, 219, 196, 202, 185, - 212, 149, 219, 196, 248, 69, 233, 151, 220, 19, 250, 206, 200, 53, 241, - 19, 204, 228, 223, 67, 204, 238, 26, 249, 103, 205, 185, 235, 54, 239, - 78, 241, 65, 250, 128, 241, 34, 249, 130, 212, 66, 247, 101, 249, 116, - 248, 53, 233, 91, 208, 238, 207, 28, 213, 192, 77, 235, 39, 204, 177, - 235, 81, 237, 45, 233, 158, 77, 219, 32, 213, 86, 224, 51, 213, 188, 237, - 189, 235, 16, 241, 115, 203, 127, 248, 70, 245, 43, 248, 75, 3, 205, 107, - 241, 28, 3, 204, 210, 244, 177, 248, 34, 212, 213, 212, 22, 241, 2, 77, - 219, 199, 208, 214, 247, 129, 235, 39, 222, 191, 233, 90, 220, 54, 218, - 190, 247, 160, 249, 119, 205, 218, 235, 234, 3, 205, 218, 236, 60, 26, - 115, 232, 124, 196, 76, 235, 233, 235, 234, 3, 213, 129, 231, 103, 26, - 213, 129, 232, 165, 235, 234, 3, 200, 57, 236, 60, 26, 197, 119, 218, - 164, 214, 25, 235, 233, 234, 244, 235, 233, 235, 234, 3, 212, 136, 236, - 59, 208, 202, 223, 76, 244, 179, 233, 138, 232, 42, 248, 97, 235, 83, - 206, 194, 241, 79, 222, 63, 235, 233, 208, 158, 201, 8, 200, 55, 235, - 233, 237, 79, 237, 197, 249, 56, 207, 14, 214, 15, 234, 255, 235, 233, - 247, 229, 239, 234, 233, 124, 222, 42, 210, 76, 206, 157, 205, 88, 233, - 170, 235, 233, 195, 86, 235, 233, 232, 119, 208, 187, 203, 215, 241, 68, - 225, 12, 222, 34, 213, 88, 232, 34, 213, 135, 210, 239, 222, 5, 218, 181, - 219, 68, 249, 125, 204, 65, 205, 230, 214, 42, 214, 70, 205, 253, 235, - 85, 214, 5, 233, 60, 239, 17, 212, 7, 247, 131, 236, 236, 244, 149, 210, - 158, 232, 233, 236, 236, 244, 149, 241, 18, 232, 233, 236, 236, 244, 149, - 249, 105, 236, 236, 244, 149, 59, 232, 233, 248, 104, 222, 172, 235, 37, - 201, 244, 204, 97, 204, 92, 209, 4, 199, 46, 237, 77, 3, 232, 128, 251, - 199, 218, 175, 197, 75, 220, 46, 197, 75, 219, 198, 250, 231, 219, 198, - 222, 172, 245, 94, 197, 100, 241, 26, 208, 234, 207, 32, 248, 202, 248, - 70, 234, 80, 214, 108, 235, 215, 197, 155, 247, 230, 220, 3, 237, 216, - 230, 202, 241, 36, 205, 10, 213, 28, 224, 23, 213, 28, 239, 250, 213, 28, - 235, 234, 3, 218, 208, 251, 249, 245, 66, 214, 132, 251, 249, 249, 1, - 213, 28, 213, 29, 3, 232, 132, 213, 29, 226, 87, 204, 245, 209, 202, 213, - 29, 244, 212, 213, 29, 226, 87, 221, 214, 212, 78, 220, 92, 235, 217, - 199, 141, 219, 152, 236, 250, 234, 31, 195, 9, 248, 60, 214, 71, 232, - 126, 248, 167, 247, 125, 208, 171, 233, 150, 244, 179, 205, 188, 210, - 158, 233, 182, 236, 194, 235, 117, 225, 166, 211, 188, 212, 212, 203, 3, - 201, 30, 213, 13, 239, 75, 239, 30, 52, 232, 107, 244, 154, 252, 33, 235, - 119, 236, 76, 201, 246, 248, 42, 220, 91, 221, 181, 221, 215, 248, 86, - 205, 108, 77, 202, 156, 249, 104, 77, 196, 89, 209, 4, 212, 176, 203, 51, - 249, 2, 248, 31, 249, 61, 209, 213, 77, 213, 161, 249, 80, 77, 205, 191, - 205, 109, 210, 174, 217, 193, 251, 108, 217, 85, 245, 83, 224, 73, 217, - 85, 245, 83, 211, 80, 217, 85, 245, 83, 209, 203, 217, 85, 245, 83, 248, - 148, 217, 85, 245, 83, 224, 19, 217, 85, 245, 83, 213, 103, 59, 245, 83, - 224, 20, 209, 194, 235, 13, 239, 230, 58, 245, 83, 224, 20, 209, 194, - 235, 13, 239, 230, 217, 85, 245, 83, 224, 20, 209, 194, 235, 13, 239, - 230, 59, 245, 83, 224, 74, 209, 194, 216, 175, 239, 230, 59, 245, 83, - 211, 81, 209, 194, 216, 175, 239, 230, 59, 245, 83, 209, 204, 209, 194, - 216, 175, 239, 230, 59, 245, 83, 248, 149, 209, 194, 216, 175, 239, 230, - 59, 245, 83, 224, 20, 209, 194, 216, 175, 239, 230, 59, 245, 83, 213, - 104, 209, 194, 216, 175, 239, 230, 58, 245, 83, 224, 74, 209, 194, 216, - 175, 239, 230, 58, 245, 83, 211, 81, 209, 194, 216, 175, 239, 230, 58, - 245, 83, 209, 204, 209, 194, 216, 175, 239, 230, 58, 245, 83, 248, 149, - 209, 194, 216, 175, 239, 230, 58, 245, 83, 224, 20, 209, 194, 216, 175, - 239, 230, 58, 245, 83, 213, 104, 209, 194, 216, 175, 239, 230, 217, 85, - 245, 83, 224, 74, 209, 194, 216, 175, 239, 230, 217, 85, 245, 83, 211, - 81, 209, 194, 216, 175, 239, 230, 217, 85, 245, 83, 209, 204, 209, 194, - 216, 175, 239, 230, 217, 85, 245, 83, 248, 149, 209, 194, 216, 175, 239, - 230, 217, 85, 245, 83, 224, 20, 209, 194, 216, 175, 239, 230, 217, 85, - 245, 83, 213, 104, 209, 194, 216, 175, 239, 230, 59, 245, 83, 224, 20, - 209, 194, 97, 231, 58, 202, 176, 239, 230, 58, 245, 83, 224, 20, 209, - 194, 97, 231, 58, 202, 176, 239, 230, 217, 85, 245, 83, 224, 20, 209, - 194, 97, 231, 58, 202, 176, 239, 230, 59, 245, 83, 163, 224, 73, 59, 245, - 83, 163, 211, 80, 59, 245, 83, 163, 209, 203, 59, 245, 83, 163, 248, 148, - 59, 245, 83, 163, 224, 19, 59, 245, 83, 163, 213, 103, 58, 245, 83, 163, - 224, 73, 58, 245, 83, 163, 211, 80, 58, 245, 83, 163, 209, 203, 58, 245, - 83, 163, 248, 148, 58, 245, 83, 163, 224, 19, 58, 245, 83, 163, 213, 103, - 217, 85, 245, 83, 163, 224, 73, 217, 85, 245, 83, 163, 211, 80, 217, 85, - 245, 83, 163, 209, 203, 217, 85, 245, 83, 163, 248, 148, 217, 85, 245, - 83, 163, 224, 19, 217, 85, 245, 83, 163, 213, 103, 59, 245, 83, 224, 20, - 209, 194, 99, 231, 58, 200, 231, 239, 230, 58, 245, 83, 224, 20, 209, - 194, 99, 231, 58, 200, 231, 239, 230, 217, 85, 245, 83, 224, 20, 209, - 194, 99, 231, 58, 200, 231, 239, 230, 59, 245, 83, 224, 74, 209, 194, 99, - 231, 58, 207, 66, 239, 230, 59, 245, 83, 211, 81, 209, 194, 99, 231, 58, - 207, 66, 239, 230, 59, 245, 83, 209, 204, 209, 194, 99, 231, 58, 207, 66, - 239, 230, 59, 245, 83, 248, 149, 209, 194, 99, 231, 58, 207, 66, 239, - 230, 59, 245, 83, 224, 20, 209, 194, 99, 231, 58, 207, 66, 239, 230, 59, - 245, 83, 213, 104, 209, 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, - 224, 74, 209, 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, 211, 81, - 209, 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, 209, 204, 209, - 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, 248, 149, 209, 194, 99, - 231, 58, 207, 66, 239, 230, 58, 245, 83, 224, 20, 209, 194, 99, 231, 58, - 207, 66, 239, 230, 58, 245, 83, 213, 104, 209, 194, 99, 231, 58, 207, 66, - 239, 230, 217, 85, 245, 83, 224, 74, 209, 194, 99, 231, 58, 207, 66, 239, - 230, 217, 85, 245, 83, 211, 81, 209, 194, 99, 231, 58, 207, 66, 239, 230, - 217, 85, 245, 83, 209, 204, 209, 194, 99, 231, 58, 207, 66, 239, 230, - 217, 85, 245, 83, 248, 149, 209, 194, 99, 231, 58, 207, 66, 239, 230, - 217, 85, 245, 83, 224, 20, 209, 194, 99, 231, 58, 207, 66, 239, 230, 217, - 85, 245, 83, 213, 104, 209, 194, 99, 231, 58, 207, 66, 239, 230, 59, 245, - 83, 224, 20, 209, 194, 115, 231, 58, 235, 150, 239, 230, 58, 245, 83, - 224, 20, 209, 194, 115, 231, 58, 235, 150, 239, 230, 217, 85, 245, 83, - 224, 20, 209, 194, 115, 231, 58, 235, 150, 239, 230, 59, 245, 83, 236, - 167, 58, 245, 83, 236, 167, 217, 85, 245, 83, 236, 167, 59, 245, 83, 236, - 168, 209, 194, 216, 175, 239, 230, 58, 245, 83, 236, 168, 209, 194, 216, - 175, 239, 230, 217, 85, 245, 83, 236, 168, 209, 194, 216, 175, 239, 230, - 59, 245, 83, 224, 17, 59, 245, 83, 224, 16, 59, 245, 83, 224, 18, 58, - 245, 83, 224, 17, 58, 245, 83, 224, 16, 58, 245, 83, 224, 18, 196, 194, - 210, 158, 234, 33, 196, 194, 210, 158, 220, 56, 196, 194, 210, 158, 236, - 255, 196, 194, 210, 158, 231, 98, 196, 194, 210, 158, 245, 112, 196, 194, - 210, 158, 247, 128, 196, 194, 210, 158, 205, 180, 196, 194, 58, 234, 33, - 196, 194, 58, 220, 56, 196, 194, 58, 236, 255, 196, 194, 58, 231, 98, - 196, 194, 58, 245, 112, 196, 194, 58, 247, 128, 196, 194, 58, 205, 180, - 249, 102, 206, 193, 214, 113, 204, 52, 248, 38, 206, 167, 237, 211, 77, - 248, 124, 251, 255, 249, 88, 204, 239, 195, 244, 224, 54, 213, 155, 210, - 1, 212, 141, 247, 11, 210, 187, 250, 123, 239, 50, 222, 239, 249, 86, 12, - 15, 230, 190, 12, 15, 230, 189, 12, 15, 230, 188, 12, 15, 230, 187, 12, - 15, 230, 186, 12, 15, 230, 185, 12, 15, 230, 184, 12, 15, 230, 183, 12, - 15, 230, 182, 12, 15, 230, 181, 12, 15, 230, 180, 12, 15, 230, 179, 12, - 15, 230, 178, 12, 15, 230, 177, 12, 15, 230, 176, 12, 15, 230, 175, 12, - 15, 230, 174, 12, 15, 230, 173, 12, 15, 230, 172, 12, 15, 230, 171, 12, - 15, 230, 170, 12, 15, 230, 169, 12, 15, 230, 168, 12, 15, 230, 167, 12, - 15, 230, 166, 12, 15, 230, 165, 12, 15, 230, 164, 12, 15, 230, 163, 12, - 15, 230, 162, 12, 15, 230, 161, 12, 15, 230, 160, 12, 15, 230, 159, 12, - 15, 230, 158, 12, 15, 230, 157, 12, 15, 230, 156, 12, 15, 230, 155, 12, - 15, 230, 154, 12, 15, 230, 153, 12, 15, 230, 152, 12, 15, 230, 151, 12, - 15, 230, 150, 12, 15, 230, 149, 12, 15, 230, 148, 12, 15, 230, 147, 12, - 15, 230, 146, 12, 15, 230, 145, 12, 15, 230, 144, 12, 15, 230, 143, 12, - 15, 230, 142, 12, 15, 230, 141, 12, 15, 230, 140, 12, 15, 230, 139, 12, - 15, 230, 138, 12, 15, 230, 137, 12, 15, 230, 136, 12, 15, 230, 135, 12, - 15, 230, 134, 12, 15, 230, 133, 12, 15, 230, 132, 12, 15, 230, 131, 12, - 15, 230, 130, 12, 15, 230, 129, 12, 15, 230, 128, 12, 15, 230, 127, 12, - 15, 230, 126, 12, 15, 230, 125, 12, 15, 230, 124, 12, 15, 230, 123, 12, - 15, 230, 122, 12, 15, 230, 121, 12, 15, 230, 120, 12, 15, 230, 119, 12, - 15, 230, 118, 12, 15, 230, 117, 12, 15, 230, 116, 12, 15, 230, 115, 12, - 15, 230, 114, 12, 15, 230, 113, 12, 15, 230, 112, 12, 15, 230, 111, 12, - 15, 230, 110, 12, 15, 230, 109, 12, 15, 230, 108, 12, 15, 230, 107, 12, - 15, 230, 106, 12, 15, 230, 105, 12, 15, 230, 104, 12, 15, 230, 103, 12, - 15, 230, 102, 12, 15, 230, 101, 12, 15, 230, 100, 12, 15, 230, 99, 12, - 15, 230, 98, 12, 15, 230, 97, 12, 15, 230, 96, 12, 15, 230, 95, 12, 15, - 230, 94, 12, 15, 230, 93, 12, 15, 230, 92, 12, 15, 230, 91, 12, 15, 230, - 90, 12, 15, 230, 89, 12, 15, 230, 88, 12, 15, 230, 87, 12, 15, 230, 86, - 12, 15, 230, 85, 12, 15, 230, 84, 12, 15, 230, 83, 12, 15, 230, 82, 12, - 15, 230, 81, 12, 15, 230, 80, 12, 15, 230, 79, 12, 15, 230, 78, 12, 15, - 230, 77, 12, 15, 230, 76, 12, 15, 230, 75, 12, 15, 230, 74, 12, 15, 230, - 73, 12, 15, 230, 72, 12, 15, 230, 71, 12, 15, 230, 70, 12, 15, 230, 69, - 12, 15, 230, 68, 12, 15, 230, 67, 12, 15, 230, 66, 12, 15, 230, 65, 12, - 15, 230, 64, 12, 15, 230, 63, 12, 15, 230, 62, 12, 15, 230, 61, 12, 15, - 230, 60, 12, 15, 230, 59, 12, 15, 230, 58, 12, 15, 230, 57, 12, 15, 230, - 56, 12, 15, 230, 55, 12, 15, 230, 54, 12, 15, 230, 53, 12, 15, 230, 52, - 12, 15, 230, 51, 12, 15, 230, 50, 12, 15, 230, 49, 12, 15, 230, 48, 12, - 15, 230, 47, 12, 15, 230, 46, 12, 15, 230, 45, 12, 15, 230, 44, 12, 15, - 230, 43, 12, 15, 230, 42, 12, 15, 230, 41, 12, 15, 230, 40, 12, 15, 230, - 39, 12, 15, 230, 38, 12, 15, 230, 37, 12, 15, 230, 36, 12, 15, 230, 35, - 12, 15, 230, 34, 12, 15, 230, 33, 12, 15, 230, 32, 12, 15, 230, 31, 12, - 15, 230, 30, 12, 15, 230, 29, 12, 15, 230, 28, 12, 15, 230, 27, 12, 15, - 230, 26, 12, 15, 230, 25, 12, 15, 230, 24, 12, 15, 230, 23, 12, 15, 230, - 22, 12, 15, 230, 21, 12, 15, 230, 20, 12, 15, 230, 19, 12, 15, 230, 18, - 12, 15, 230, 17, 12, 15, 230, 16, 12, 15, 230, 15, 12, 15, 230, 14, 12, - 15, 230, 13, 12, 15, 230, 12, 12, 15, 230, 11, 12, 15, 230, 10, 12, 15, - 230, 9, 12, 15, 230, 8, 12, 15, 230, 7, 12, 15, 230, 6, 12, 15, 230, 5, - 12, 15, 230, 4, 12, 15, 230, 3, 12, 15, 230, 2, 12, 15, 230, 1, 12, 15, - 230, 0, 12, 15, 229, 255, 12, 15, 229, 254, 12, 15, 229, 253, 12, 15, - 229, 252, 12, 15, 229, 251, 12, 15, 229, 250, 12, 15, 229, 249, 12, 15, - 229, 248, 12, 15, 229, 247, 12, 15, 229, 246, 12, 15, 229, 245, 12, 15, - 229, 244, 12, 15, 229, 243, 12, 15, 229, 242, 12, 15, 229, 241, 12, 15, - 229, 240, 12, 15, 229, 239, 12, 15, 229, 238, 12, 15, 229, 237, 12, 15, - 229, 236, 12, 15, 229, 235, 12, 15, 229, 234, 12, 15, 229, 233, 12, 15, - 229, 232, 12, 15, 229, 231, 12, 15, 229, 230, 12, 15, 229, 229, 12, 15, - 229, 228, 12, 15, 229, 227, 12, 15, 229, 226, 12, 15, 229, 225, 12, 15, - 229, 224, 12, 15, 229, 223, 12, 15, 229, 222, 12, 15, 229, 221, 12, 15, - 229, 220, 12, 15, 229, 219, 12, 15, 229, 218, 12, 15, 229, 217, 12, 15, - 229, 216, 12, 15, 229, 215, 12, 15, 229, 214, 12, 15, 229, 213, 12, 15, - 229, 212, 12, 15, 229, 211, 12, 15, 229, 210, 12, 15, 229, 209, 12, 15, - 229, 208, 12, 15, 229, 207, 12, 15, 229, 206, 12, 15, 229, 205, 12, 15, - 229, 204, 12, 15, 229, 203, 12, 15, 229, 202, 12, 15, 229, 201, 12, 15, - 229, 200, 12, 15, 229, 199, 12, 15, 229, 198, 12, 15, 229, 197, 12, 15, - 229, 196, 12, 15, 229, 195, 12, 15, 229, 194, 12, 15, 229, 193, 12, 15, - 229, 192, 12, 15, 229, 191, 12, 15, 229, 190, 12, 15, 229, 189, 12, 15, - 229, 188, 12, 15, 229, 187, 12, 15, 229, 186, 12, 15, 229, 185, 12, 15, - 229, 184, 12, 15, 229, 183, 12, 15, 229, 182, 12, 15, 229, 181, 12, 15, - 229, 180, 12, 15, 229, 179, 12, 15, 229, 178, 12, 15, 229, 177, 12, 15, - 229, 176, 12, 15, 229, 175, 12, 15, 229, 174, 12, 15, 229, 173, 12, 15, - 229, 172, 12, 15, 229, 171, 12, 15, 229, 170, 12, 15, 229, 169, 12, 15, - 229, 168, 12, 15, 229, 167, 12, 15, 229, 166, 12, 15, 229, 165, 12, 15, - 229, 164, 12, 15, 229, 163, 12, 15, 229, 162, 12, 15, 229, 161, 12, 15, - 229, 160, 12, 15, 229, 159, 12, 15, 229, 158, 12, 15, 229, 157, 12, 15, - 229, 156, 12, 15, 229, 155, 12, 15, 229, 154, 12, 15, 229, 153, 12, 15, - 229, 152, 12, 15, 229, 151, 12, 15, 229, 150, 12, 15, 229, 149, 12, 15, - 229, 148, 12, 15, 229, 147, 12, 15, 229, 146, 12, 15, 229, 145, 12, 15, - 229, 144, 12, 15, 229, 143, 12, 15, 229, 142, 12, 15, 229, 141, 12, 15, - 229, 140, 12, 15, 229, 139, 12, 15, 229, 138, 12, 15, 229, 137, 12, 15, - 229, 136, 12, 15, 229, 135, 12, 15, 229, 134, 12, 15, 229, 133, 12, 15, - 229, 132, 12, 15, 229, 131, 12, 15, 229, 130, 12, 15, 229, 129, 12, 15, - 229, 128, 12, 15, 229, 127, 12, 15, 229, 126, 12, 15, 229, 125, 12, 15, - 229, 124, 12, 15, 229, 123, 12, 15, 229, 122, 12, 15, 229, 121, 12, 15, - 229, 120, 12, 15, 229, 119, 12, 15, 229, 118, 12, 15, 229, 117, 12, 15, - 229, 116, 12, 15, 229, 115, 12, 15, 229, 114, 12, 15, 229, 113, 12, 15, - 229, 112, 12, 15, 229, 111, 12, 15, 229, 110, 12, 15, 229, 109, 12, 15, - 229, 108, 12, 15, 229, 107, 12, 15, 229, 106, 12, 15, 229, 105, 12, 15, - 229, 104, 12, 15, 229, 103, 12, 15, 229, 102, 12, 15, 229, 101, 12, 15, - 229, 100, 12, 15, 229, 99, 12, 15, 229, 98, 12, 15, 229, 97, 12, 15, 229, - 96, 12, 15, 229, 95, 12, 15, 229, 94, 12, 15, 229, 93, 12, 15, 229, 92, - 12, 15, 229, 91, 12, 15, 229, 90, 12, 15, 229, 89, 12, 15, 229, 88, 12, - 15, 229, 87, 12, 15, 229, 86, 12, 15, 229, 85, 12, 15, 229, 84, 12, 15, - 229, 83, 12, 15, 229, 82, 12, 15, 229, 81, 12, 15, 229, 80, 12, 15, 229, - 79, 12, 15, 229, 78, 12, 15, 229, 77, 12, 15, 229, 76, 12, 15, 229, 75, - 12, 15, 229, 74, 12, 15, 229, 73, 12, 15, 229, 72, 12, 15, 229, 71, 12, - 15, 229, 70, 12, 15, 229, 69, 12, 15, 229, 68, 12, 15, 229, 67, 12, 15, - 229, 66, 12, 15, 229, 65, 12, 15, 229, 64, 12, 15, 229, 63, 12, 15, 229, - 62, 12, 15, 229, 61, 12, 15, 229, 60, 12, 15, 229, 59, 12, 15, 229, 58, - 12, 15, 229, 57, 12, 15, 229, 56, 12, 15, 229, 55, 12, 15, 229, 54, 12, - 15, 229, 53, 12, 15, 229, 52, 12, 15, 229, 51, 12, 15, 229, 50, 12, 15, - 229, 49, 12, 15, 229, 48, 12, 15, 229, 47, 12, 15, 229, 46, 12, 15, 229, - 45, 12, 15, 229, 44, 12, 15, 229, 43, 12, 15, 229, 42, 12, 15, 229, 41, - 12, 15, 229, 40, 12, 15, 229, 39, 12, 15, 229, 38, 12, 15, 229, 37, 12, - 15, 229, 36, 12, 15, 229, 35, 12, 15, 229, 34, 12, 15, 229, 33, 12, 15, - 229, 32, 12, 15, 229, 31, 12, 15, 229, 30, 12, 15, 229, 29, 12, 15, 229, - 28, 12, 15, 229, 27, 12, 15, 229, 26, 12, 15, 229, 25, 12, 15, 229, 24, - 12, 15, 229, 23, 12, 15, 229, 22, 12, 15, 229, 21, 12, 15, 229, 20, 12, - 15, 229, 19, 12, 15, 229, 18, 12, 15, 229, 17, 12, 15, 229, 16, 12, 15, - 229, 15, 12, 15, 229, 14, 12, 15, 229, 13, 12, 15, 229, 12, 12, 15, 229, - 11, 12, 15, 229, 10, 12, 15, 229, 9, 12, 15, 229, 8, 12, 15, 229, 7, 12, - 15, 229, 6, 12, 15, 229, 5, 12, 15, 229, 4, 12, 15, 229, 3, 12, 15, 229, - 2, 12, 15, 229, 1, 12, 15, 229, 0, 12, 15, 228, 255, 12, 15, 228, 254, - 12, 15, 228, 253, 12, 15, 228, 252, 12, 15, 228, 251, 12, 15, 228, 250, - 12, 15, 228, 249, 12, 15, 228, 248, 12, 15, 228, 247, 12, 15, 228, 246, - 12, 15, 228, 245, 12, 15, 228, 244, 12, 15, 228, 243, 12, 15, 228, 242, - 12, 15, 228, 241, 12, 15, 228, 240, 12, 15, 228, 239, 12, 15, 228, 238, - 12, 15, 228, 237, 12, 15, 228, 236, 12, 15, 228, 235, 12, 15, 228, 234, - 12, 15, 228, 233, 12, 15, 228, 232, 12, 15, 228, 231, 12, 15, 228, 230, - 12, 15, 228, 229, 12, 15, 228, 228, 12, 15, 228, 227, 12, 15, 228, 226, - 12, 15, 228, 225, 12, 15, 228, 224, 12, 15, 228, 223, 12, 15, 228, 222, - 12, 15, 228, 221, 12, 15, 228, 220, 12, 15, 228, 219, 12, 15, 228, 218, - 12, 15, 228, 217, 12, 15, 228, 216, 12, 15, 228, 215, 12, 15, 228, 214, - 12, 15, 228, 213, 12, 15, 228, 212, 12, 15, 228, 211, 12, 15, 228, 210, - 12, 15, 228, 209, 12, 15, 228, 208, 12, 15, 228, 207, 12, 15, 228, 206, - 12, 15, 228, 205, 12, 15, 228, 204, 12, 15, 228, 203, 12, 15, 228, 202, - 12, 15, 228, 201, 12, 15, 228, 200, 12, 15, 228, 199, 12, 15, 228, 198, - 12, 15, 228, 197, 12, 15, 228, 196, 12, 15, 228, 195, 12, 15, 228, 194, - 12, 15, 228, 193, 12, 15, 228, 192, 12, 15, 228, 191, 12, 15, 228, 190, - 12, 15, 228, 189, 12, 15, 228, 188, 12, 15, 228, 187, 12, 15, 228, 186, - 12, 15, 228, 185, 12, 15, 228, 184, 12, 15, 228, 183, 12, 15, 228, 182, - 12, 15, 228, 181, 12, 15, 228, 180, 12, 15, 228, 179, 12, 15, 228, 178, - 12, 15, 228, 177, 12, 15, 228, 176, 12, 15, 228, 175, 12, 15, 228, 174, - 12, 15, 228, 173, 12, 15, 228, 172, 12, 15, 228, 171, 12, 15, 228, 170, - 12, 15, 228, 169, 12, 15, 228, 168, 12, 15, 228, 167, 12, 15, 228, 166, - 12, 15, 228, 165, 12, 15, 228, 164, 12, 15, 228, 163, 12, 15, 228, 162, - 12, 15, 228, 161, 222, 234, 203, 143, 184, 205, 148, 184, 236, 90, 78, - 184, 211, 62, 78, 184, 31, 55, 184, 239, 10, 55, 184, 213, 45, 55, 184, - 251, 111, 184, 251, 30, 184, 50, 213, 140, 184, 53, 213, 140, 184, 250, - 179, 184, 98, 55, 184, 244, 159, 184, 231, 6, 184, 234, 217, 204, 226, - 184, 205, 177, 184, 17, 195, 79, 184, 17, 100, 184, 17, 102, 184, 17, - 134, 184, 17, 136, 184, 17, 146, 184, 17, 167, 184, 17, 178, 184, 17, - 171, 184, 17, 182, 184, 244, 168, 184, 207, 105, 184, 222, 140, 55, 184, - 236, 172, 55, 184, 233, 94, 55, 184, 211, 79, 78, 184, 244, 157, 250, - 168, 184, 8, 6, 1, 63, 184, 8, 6, 1, 250, 112, 184, 8, 6, 1, 247, 207, - 184, 8, 6, 1, 240, 231, 184, 8, 6, 1, 69, 184, 8, 6, 1, 236, 49, 184, 8, - 6, 1, 234, 190, 184, 8, 6, 1, 233, 15, 184, 8, 6, 1, 68, 184, 8, 6, 1, - 225, 217, 184, 8, 6, 1, 225, 80, 184, 8, 6, 1, 159, 184, 8, 6, 1, 221, - 136, 184, 8, 6, 1, 218, 55, 184, 8, 6, 1, 72, 184, 8, 6, 1, 214, 3, 184, - 8, 6, 1, 211, 167, 184, 8, 6, 1, 144, 184, 8, 6, 1, 209, 80, 184, 8, 6, - 1, 203, 216, 184, 8, 6, 1, 66, 184, 8, 6, 1, 199, 230, 184, 8, 6, 1, 197, - 199, 184, 8, 6, 1, 196, 222, 184, 8, 6, 1, 196, 148, 184, 8, 6, 1, 195, - 158, 184, 50, 47, 179, 184, 210, 90, 205, 177, 184, 53, 47, 179, 184, - 244, 241, 252, 22, 184, 126, 222, 75, 184, 233, 101, 252, 22, 184, 8, 4, - 1, 63, 184, 8, 4, 1, 250, 112, 184, 8, 4, 1, 247, 207, 184, 8, 4, 1, 240, - 231, 184, 8, 4, 1, 69, 184, 8, 4, 1, 236, 49, 184, 8, 4, 1, 234, 190, - 184, 8, 4, 1, 233, 15, 184, 8, 4, 1, 68, 184, 8, 4, 1, 225, 217, 184, 8, - 4, 1, 225, 80, 184, 8, 4, 1, 159, 184, 8, 4, 1, 221, 136, 184, 8, 4, 1, - 218, 55, 184, 8, 4, 1, 72, 184, 8, 4, 1, 214, 3, 184, 8, 4, 1, 211, 167, - 184, 8, 4, 1, 144, 184, 8, 4, 1, 209, 80, 184, 8, 4, 1, 203, 216, 184, 8, - 4, 1, 66, 184, 8, 4, 1, 199, 230, 184, 8, 4, 1, 197, 199, 184, 8, 4, 1, - 196, 222, 184, 8, 4, 1, 196, 148, 184, 8, 4, 1, 195, 158, 184, 50, 241, - 18, 179, 184, 83, 222, 75, 184, 53, 241, 18, 179, 184, 202, 84, 247, 141, - 203, 143, 62, 208, 35, 62, 208, 24, 62, 208, 13, 62, 208, 1, 62, 207, - 246, 62, 207, 235, 62, 207, 224, 62, 207, 213, 62, 207, 202, 62, 207, - 194, 62, 207, 193, 62, 207, 192, 62, 207, 191, 62, 207, 189, 62, 207, - 188, 62, 207, 187, 62, 207, 186, 62, 207, 185, 62, 207, 184, 62, 207, - 183, 62, 207, 182, 62, 207, 181, 62, 207, 180, 62, 207, 178, 62, 207, - 177, 62, 207, 176, 62, 207, 175, 62, 207, 174, 62, 207, 173, 62, 207, - 172, 62, 207, 171, 62, 207, 170, 62, 207, 169, 62, 207, 167, 62, 207, - 166, 62, 207, 165, 62, 207, 164, 62, 207, 163, 62, 207, 162, 62, 207, - 161, 62, 207, 160, 62, 207, 159, 62, 207, 158, 62, 207, 156, 62, 207, - 155, 62, 207, 154, 62, 207, 153, 62, 207, 152, 62, 207, 151, 62, 207, - 150, 62, 207, 149, 62, 207, 148, 62, 207, 147, 62, 207, 145, 62, 207, - 144, 62, 207, 143, 62, 207, 142, 62, 207, 141, 62, 207, 140, 62, 207, - 139, 62, 207, 138, 62, 207, 137, 62, 207, 136, 62, 207, 134, 62, 207, - 133, 62, 207, 132, 62, 207, 131, 62, 207, 130, 62, 207, 129, 62, 207, - 128, 62, 207, 127, 62, 207, 126, 62, 207, 125, 62, 207, 123, 62, 207, - 122, 62, 207, 121, 62, 207, 120, 62, 207, 119, 62, 207, 118, 62, 207, - 117, 62, 207, 116, 62, 207, 115, 62, 207, 114, 62, 208, 111, 62, 208, - 110, 62, 208, 109, 62, 208, 108, 62, 208, 107, 62, 208, 106, 62, 208, - 105, 62, 208, 104, 62, 208, 103, 62, 208, 102, 62, 208, 100, 62, 208, 99, - 62, 208, 98, 62, 208, 97, 62, 208, 96, 62, 208, 95, 62, 208, 94, 62, 208, - 93, 62, 208, 92, 62, 208, 91, 62, 208, 89, 62, 208, 88, 62, 208, 87, 62, - 208, 86, 62, 208, 85, 62, 208, 84, 62, 208, 83, 62, 208, 82, 62, 208, 81, - 62, 208, 80, 62, 208, 78, 62, 208, 77, 62, 208, 76, 62, 208, 75, 62, 208, - 74, 62, 208, 73, 62, 208, 72, 62, 208, 71, 62, 208, 70, 62, 208, 69, 62, - 208, 67, 62, 208, 66, 62, 208, 65, 62, 208, 64, 62, 208, 63, 62, 208, 62, - 62, 208, 61, 62, 208, 60, 62, 208, 59, 62, 208, 58, 62, 208, 56, 62, 208, - 55, 62, 208, 54, 62, 208, 53, 62, 208, 52, 62, 208, 51, 62, 208, 50, 62, - 208, 49, 62, 208, 48, 62, 208, 47, 62, 208, 45, 62, 208, 44, 62, 208, 43, - 62, 208, 42, 62, 208, 41, 62, 208, 40, 62, 208, 39, 62, 208, 38, 62, 208, - 37, 62, 208, 36, 62, 208, 34, 62, 208, 33, 62, 208, 32, 62, 208, 31, 62, - 208, 30, 62, 208, 29, 62, 208, 28, 62, 208, 27, 62, 208, 26, 62, 208, 25, - 62, 208, 23, 62, 208, 22, 62, 208, 21, 62, 208, 20, 62, 208, 19, 62, 208, - 18, 62, 208, 17, 62, 208, 16, 62, 208, 15, 62, 208, 14, 62, 208, 12, 62, - 208, 11, 62, 208, 10, 62, 208, 9, 62, 208, 8, 62, 208, 7, 62, 208, 6, 62, - 208, 5, 62, 208, 4, 62, 208, 3, 62, 208, 0, 62, 207, 255, 62, 207, 254, - 62, 207, 253, 62, 207, 252, 62, 207, 251, 62, 207, 250, 62, 207, 249, 62, - 207, 248, 62, 207, 247, 62, 207, 245, 62, 207, 244, 62, 207, 243, 62, - 207, 242, 62, 207, 241, 62, 207, 240, 62, 207, 239, 62, 207, 238, 62, - 207, 237, 62, 207, 236, 62, 207, 234, 62, 207, 233, 62, 207, 232, 62, - 207, 231, 62, 207, 230, 62, 207, 229, 62, 207, 228, 62, 207, 227, 62, - 207, 226, 62, 207, 225, 62, 207, 223, 62, 207, 222, 62, 207, 221, 62, - 207, 220, 62, 207, 219, 62, 207, 218, 62, 207, 217, 62, 207, 216, 62, - 207, 215, 62, 207, 214, 62, 207, 212, 62, 207, 211, 62, 207, 210, 62, - 207, 209, 62, 207, 208, 62, 207, 207, 62, 207, 206, 62, 207, 205, 62, - 207, 204, 62, 207, 203, 62, 207, 201, 62, 207, 200, 62, 207, 199, 62, - 207, 198, 62, 207, 197, 62, 207, 196, 62, 207, 195, 215, 146, 215, 148, - 205, 3, 77, 232, 134, 205, 181, 205, 3, 77, 202, 237, 204, 174, 236, 222, - 77, 202, 237, 236, 118, 236, 222, 77, 201, 202, 236, 184, 236, 208, 236, - 209, 252, 14, 252, 15, 251, 161, 248, 232, 249, 132, 248, 27, 190, 203, - 149, 231, 155, 203, 149, 231, 80, 203, 154, 222, 76, 235, 180, 217, 83, - 222, 75, 236, 222, 77, 222, 75, 222, 124, 216, 112, 236, 187, 222, 76, - 203, 149, 83, 203, 149, 197, 222, 235, 24, 235, 180, 235, 157, 247, 102, - 210, 93, 241, 80, 206, 219, 214, 34, 221, 253, 100, 205, 200, 206, 219, - 226, 86, 221, 253, 195, 79, 206, 112, 240, 60, 222, 66, 236, 143, 239, - 39, 239, 183, 241, 121, 100, 240, 49, 239, 183, 241, 121, 102, 240, 48, - 239, 183, 241, 121, 134, 240, 47, 239, 183, 241, 121, 136, 240, 46, 217, - 104, 252, 14, 217, 227, 203, 242, 226, 149, 203, 246, 236, 222, 77, 201, - 203, 248, 126, 236, 125, 247, 140, 247, 142, 236, 222, 77, 219, 189, 236, - 185, 204, 139, 204, 157, 236, 143, 236, 144, 226, 61, 207, 91, 136, 235, - 138, 207, 90, 234, 227, 226, 61, 207, 91, 134, 233, 84, 207, 90, 233, 81, - 226, 61, 207, 91, 102, 210, 169, 207, 90, 209, 146, 226, 61, 207, 91, - 100, 200, 50, 207, 90, 200, 4, 205, 151, 239, 222, 239, 224, 213, 231, - 246, 255, 213, 233, 130, 214, 171, 212, 24, 231, 158, 248, 52, 213, 35, - 232, 95, 248, 66, 216, 51, 248, 52, 232, 95, 217, 188, 226, 72, 226, 74, - 217, 76, 222, 75, 217, 102, 205, 3, 77, 208, 116, 250, 245, 205, 80, 236, - 222, 77, 208, 116, 250, 245, 236, 146, 190, 203, 150, 207, 76, 231, 155, - 203, 150, 207, 76, 231, 77, 190, 203, 150, 3, 225, 92, 231, 155, 203, - 150, 3, 225, 92, 231, 78, 222, 76, 203, 150, 207, 76, 83, 203, 150, 207, - 76, 197, 221, 213, 132, 222, 76, 235, 11, 213, 132, 222, 76, 237, 235, - 212, 137, 213, 132, 222, 76, 249, 131, 213, 132, 222, 76, 200, 36, 212, - 131, 210, 90, 222, 76, 235, 180, 210, 90, 226, 72, 210, 72, 206, 62, 206, - 219, 102, 206, 59, 205, 82, 206, 62, 206, 219, 134, 206, 58, 205, 81, - 239, 183, 241, 121, 204, 198, 240, 44, 212, 9, 200, 3, 100, 212, 9, 200, - 1, 211, 226, 212, 9, 200, 3, 102, 212, 9, 200, 0, 211, 225, 207, 77, 201, - 201, 205, 0, 204, 181, 247, 141, 246, 255, 247, 76, 219, 147, 197, 152, - 218, 73, 205, 3, 77, 233, 69, 250, 245, 205, 3, 77, 211, 244, 250, 245, - 205, 150, 236, 222, 77, 233, 69, 250, 245, 236, 222, 77, 211, 244, 250, - 245, 236, 182, 205, 3, 77, 204, 198, 205, 166, 206, 62, 233, 106, 190, - 226, 20, 207, 55, 206, 62, 190, 226, 20, 208, 162, 241, 121, 207, 87, - 226, 20, 241, 42, 204, 199, 203, 8, 205, 23, 214, 84, 203, 231, 244, 158, - 214, 51, 212, 10, 219, 146, 212, 120, 251, 26, 212, 3, 244, 158, 251, 43, - 217, 176, 206, 121, 8, 6, 1, 233, 230, 8, 4, 1, 233, 230, 247, 19, 251, - 140, 203, 236, 204, 145, 244, 169, 206, 4, 222, 184, 225, 11, 1, 222, 26, - 222, 232, 1, 235, 52, 235, 43, 222, 232, 1, 235, 52, 235, 192, 222, 232, - 1, 209, 232, 222, 232, 1, 222, 7, 82, 117, 248, 138, 206, 192, 233, 193, - 219, 96, 210, 80, 29, 116, 196, 43, 29, 116, 196, 39, 29, 116, 205, 58, - 29, 116, 196, 44, 234, 204, 234, 203, 234, 202, 218, 75, 194, 236, 194, - 237, 194, 239, 221, 195, 209, 240, 221, 197, 209, 242, 213, 95, 221, 194, - 209, 239, 216, 82, 218, 255, 197, 36, 221, 196, 209, 241, 234, 226, 213, - 94, 197, 95, 236, 246, 234, 214, 219, 70, 214, 120, 200, 5, 105, 219, 70, - 240, 66, 105, 107, 201, 179, 61, 3, 52, 83, 106, 91, 201, 179, 61, 3, 52, - 83, 106, 11, 5, 225, 232, 78, 198, 222, 198, 111, 198, 43, 198, 32, 198, - 21, 198, 10, 197, 255, 197, 244, 197, 233, 198, 221, 198, 210, 198, 199, - 198, 188, 198, 177, 198, 166, 198, 155, 212, 25, 235, 24, 36, 83, 53, 59, - 222, 147, 179, 247, 212, 214, 68, 78, 248, 106, 194, 238, 10, 2, 215, - 156, 203, 12, 10, 2, 215, 156, 127, 215, 156, 247, 245, 127, 247, 244, - 219, 195, 6, 1, 233, 15, 219, 195, 6, 1, 217, 73, 219, 195, 4, 1, 233, - 15, 219, 195, 4, 1, 217, 73, 56, 1, 237, 135, 67, 34, 16, 234, 225, 206, - 0, 245, 34, 199, 128, 198, 144, 198, 133, 198, 122, 198, 110, 198, 99, - 198, 88, 198, 77, 198, 66, 198, 55, 198, 47, 198, 46, 198, 45, 198, 44, - 198, 42, 198, 41, 198, 40, 198, 39, 198, 38, 198, 37, 198, 36, 198, 35, - 198, 34, 198, 33, 198, 31, 198, 30, 198, 29, 198, 28, 198, 27, 198, 26, - 198, 25, 198, 24, 198, 23, 198, 22, 198, 20, 198, 19, 198, 18, 198, 17, - 198, 16, 198, 15, 198, 14, 198, 13, 198, 12, 198, 11, 198, 9, 198, 8, - 198, 7, 198, 6, 198, 5, 198, 4, 198, 3, 198, 2, 198, 1, 198, 0, 197, 254, - 197, 253, 197, 252, 197, 251, 197, 250, 197, 249, 197, 248, 197, 247, - 197, 246, 197, 245, 197, 243, 197, 242, 197, 241, 197, 240, 197, 239, - 197, 238, 197, 237, 197, 236, 197, 235, 197, 234, 197, 232, 197, 231, - 197, 230, 197, 229, 197, 228, 197, 227, 197, 226, 197, 225, 197, 224, - 197, 223, 198, 220, 198, 219, 198, 218, 198, 217, 198, 216, 198, 215, - 198, 214, 198, 213, 198, 212, 198, 211, 198, 209, 198, 208, 198, 207, - 198, 206, 198, 205, 198, 204, 198, 203, 198, 202, 198, 201, 198, 200, - 198, 198, 198, 197, 198, 196, 198, 195, 198, 194, 198, 193, 198, 192, - 198, 191, 198, 190, 198, 189, 198, 187, 198, 186, 198, 185, 198, 184, - 198, 183, 198, 182, 198, 181, 198, 180, 198, 179, 198, 178, 198, 176, - 198, 175, 198, 174, 198, 173, 198, 172, 198, 171, 198, 170, 198, 169, - 198, 168, 198, 167, 198, 165, 198, 164, 198, 163, 198, 162, 198, 161, - 198, 160, 198, 159, 198, 158, 198, 157, 198, 156, 198, 154, 198, 153, - 198, 152, 198, 151, 198, 150, 198, 149, 198, 148, 198, 147, 198, 146, - 198, 145, 198, 143, 198, 142, 198, 141, 198, 140, 198, 139, 198, 138, - 198, 137, 198, 136, 198, 135, 198, 134, 198, 132, 198, 131, 198, 130, - 198, 129, 198, 128, 198, 127, 198, 126, 198, 125, 198, 124, 198, 123, - 198, 121, 198, 120, 198, 119, 198, 118, 198, 117, 198, 116, 198, 115, - 198, 114, 198, 113, 198, 112, 198, 109, 198, 108, 198, 107, 198, 106, - 198, 105, 198, 104, 198, 103, 198, 102, 198, 101, 198, 100, 198, 98, 198, - 97, 198, 96, 198, 95, 198, 94, 198, 93, 198, 92, 198, 91, 198, 90, 198, - 89, 198, 87, 198, 86, 198, 85, 198, 84, 198, 83, 198, 82, 198, 81, 198, - 80, 198, 79, 198, 78, 198, 76, 198, 75, 198, 74, 198, 73, 198, 72, 198, - 71, 198, 70, 198, 69, 198, 68, 198, 67, 198, 65, 198, 64, 198, 63, 198, - 62, 198, 61, 198, 60, 198, 59, 198, 58, 198, 57, 198, 56, 198, 54, 198, - 53, 198, 52, 198, 51, 198, 50, 198, 49, 198, 48, 224, 150, 31, 55, 224, - 150, 250, 179, 224, 150, 17, 195, 79, 224, 150, 17, 100, 224, 150, 17, - 102, 224, 150, 17, 134, 224, 150, 17, 136, 224, 150, 17, 146, 224, 150, - 17, 167, 224, 150, 17, 178, 224, 150, 17, 171, 224, 150, 17, 182, 8, 6, - 1, 39, 3, 220, 115, 26, 233, 100, 8, 4, 1, 39, 3, 220, 115, 26, 233, 100, - 8, 6, 1, 237, 136, 3, 83, 222, 76, 60, 8, 4, 1, 237, 136, 3, 83, 222, 76, - 60, 8, 6, 1, 237, 136, 3, 83, 222, 76, 248, 227, 26, 233, 100, 8, 4, 1, - 237, 136, 3, 83, 222, 76, 248, 227, 26, 233, 100, 8, 6, 1, 237, 136, 3, - 83, 222, 76, 248, 227, 26, 186, 8, 4, 1, 237, 136, 3, 83, 222, 76, 248, - 227, 26, 186, 8, 6, 1, 237, 136, 3, 244, 241, 26, 220, 114, 8, 4, 1, 237, - 136, 3, 244, 241, 26, 220, 114, 8, 6, 1, 237, 136, 3, 244, 241, 26, 247, - 106, 8, 4, 1, 237, 136, 3, 244, 241, 26, 247, 106, 8, 6, 1, 230, 249, 3, - 220, 115, 26, 233, 100, 8, 4, 1, 230, 249, 3, 220, 115, 26, 233, 100, 8, - 4, 1, 230, 249, 3, 76, 90, 26, 186, 8, 4, 1, 217, 74, 3, 202, 85, 57, 8, - 6, 1, 177, 3, 83, 222, 76, 60, 8, 4, 1, 177, 3, 83, 222, 76, 60, 8, 6, 1, - 177, 3, 83, 222, 76, 248, 227, 26, 233, 100, 8, 4, 1, 177, 3, 83, 222, - 76, 248, 227, 26, 233, 100, 8, 6, 1, 177, 3, 83, 222, 76, 248, 227, 26, - 186, 8, 4, 1, 177, 3, 83, 222, 76, 248, 227, 26, 186, 8, 6, 1, 209, 81, - 3, 83, 222, 76, 60, 8, 4, 1, 209, 81, 3, 83, 222, 76, 60, 8, 6, 1, 118, - 3, 220, 115, 26, 233, 100, 8, 4, 1, 118, 3, 220, 115, 26, 233, 100, 8, 6, - 1, 39, 3, 214, 152, 26, 186, 8, 4, 1, 39, 3, 214, 152, 26, 186, 8, 6, 1, - 39, 3, 214, 152, 26, 202, 84, 8, 4, 1, 39, 3, 214, 152, 26, 202, 84, 8, - 6, 1, 237, 136, 3, 214, 152, 26, 186, 8, 4, 1, 237, 136, 3, 214, 152, 26, - 186, 8, 6, 1, 237, 136, 3, 214, 152, 26, 202, 84, 8, 4, 1, 237, 136, 3, - 214, 152, 26, 202, 84, 8, 6, 1, 237, 136, 3, 76, 90, 26, 186, 8, 4, 1, - 237, 136, 3, 76, 90, 26, 186, 8, 6, 1, 237, 136, 3, 76, 90, 26, 202, 84, - 8, 4, 1, 237, 136, 3, 76, 90, 26, 202, 84, 8, 4, 1, 230, 249, 3, 76, 90, - 26, 233, 100, 8, 4, 1, 230, 249, 3, 76, 90, 26, 202, 84, 8, 6, 1, 230, - 249, 3, 214, 152, 26, 186, 8, 4, 1, 230, 249, 3, 214, 152, 26, 76, 90, - 26, 186, 8, 6, 1, 230, 249, 3, 214, 152, 26, 202, 84, 8, 4, 1, 230, 249, - 3, 214, 152, 26, 76, 90, 26, 202, 84, 8, 6, 1, 225, 218, 3, 202, 84, 8, - 4, 1, 225, 218, 3, 76, 90, 26, 202, 84, 8, 6, 1, 223, 100, 3, 202, 84, 8, - 4, 1, 223, 100, 3, 202, 84, 8, 6, 1, 221, 137, 3, 202, 84, 8, 4, 1, 221, - 137, 3, 202, 84, 8, 6, 1, 211, 32, 3, 202, 84, 8, 4, 1, 211, 32, 3, 202, - 84, 8, 6, 1, 118, 3, 214, 152, 26, 186, 8, 4, 1, 118, 3, 214, 152, 26, - 186, 8, 6, 1, 118, 3, 214, 152, 26, 202, 84, 8, 4, 1, 118, 3, 214, 152, - 26, 202, 84, 8, 6, 1, 118, 3, 220, 115, 26, 186, 8, 4, 1, 118, 3, 220, - 115, 26, 186, 8, 6, 1, 118, 3, 220, 115, 26, 202, 84, 8, 4, 1, 118, 3, - 220, 115, 26, 202, 84, 8, 4, 1, 251, 246, 3, 233, 100, 8, 4, 1, 192, 177, - 3, 233, 100, 8, 4, 1, 192, 177, 3, 186, 8, 4, 1, 163, 199, 231, 3, 233, - 100, 8, 4, 1, 163, 199, 231, 3, 186, 8, 4, 1, 208, 164, 3, 233, 100, 8, - 4, 1, 208, 164, 3, 186, 8, 4, 1, 231, 164, 208, 164, 3, 233, 100, 8, 4, - 1, 231, 164, 208, 164, 3, 186, 9, 207, 87, 93, 3, 232, 214, 90, 3, 251, - 164, 9, 207, 87, 93, 3, 232, 214, 90, 3, 197, 117, 9, 207, 87, 93, 3, - 232, 214, 90, 3, 151, 220, 69, 9, 207, 87, 93, 3, 232, 214, 90, 3, 214, - 164, 9, 207, 87, 93, 3, 232, 214, 90, 3, 66, 9, 207, 87, 93, 3, 232, 214, - 90, 3, 195, 217, 9, 207, 87, 93, 3, 232, 214, 90, 3, 69, 9, 207, 87, 93, - 3, 232, 214, 90, 3, 251, 245, 9, 207, 87, 216, 32, 3, 224, 191, 248, 219, - 1, 224, 121, 42, 108, 225, 80, 42, 108, 217, 73, 42, 108, 247, 207, 42, - 108, 215, 111, 42, 108, 201, 81, 42, 108, 216, 87, 42, 108, 203, 216, 42, - 108, 218, 55, 42, 108, 214, 3, 42, 108, 221, 136, 42, 108, 196, 148, 42, - 108, 144, 42, 108, 159, 42, 108, 199, 230, 42, 108, 222, 27, 42, 108, - 222, 38, 42, 108, 209, 182, 42, 108, 216, 69, 42, 108, 225, 217, 42, 108, - 207, 52, 42, 108, 205, 83, 42, 108, 209, 80, 42, 108, 233, 15, 42, 108, - 223, 202, 42, 5, 225, 55, 42, 5, 224, 101, 42, 5, 224, 80, 42, 5, 223, - 187, 42, 5, 223, 144, 42, 5, 224, 209, 42, 5, 224, 200, 42, 5, 225, 31, - 42, 5, 224, 11, 42, 5, 223, 242, 42, 5, 224, 228, 42, 5, 217, 70, 42, 5, - 217, 19, 42, 5, 217, 15, 42, 5, 216, 240, 42, 5, 216, 231, 42, 5, 217, - 58, 42, 5, 217, 56, 42, 5, 217, 67, 42, 5, 216, 252, 42, 5, 216, 247, 42, - 5, 217, 60, 42, 5, 247, 173, 42, 5, 245, 11, 42, 5, 245, 1, 42, 5, 241, - 41, 42, 5, 241, 0, 42, 5, 247, 57, 42, 5, 247, 49, 42, 5, 247, 162, 42, - 5, 244, 182, 42, 5, 241, 117, 42, 5, 247, 90, 42, 5, 215, 108, 42, 5, - 215, 89, 42, 5, 215, 83, 42, 5, 215, 66, 42, 5, 215, 58, 42, 5, 215, 98, - 42, 5, 215, 97, 42, 5, 215, 105, 42, 5, 215, 73, 42, 5, 215, 70, 42, 5, - 215, 101, 42, 5, 201, 77, 42, 5, 201, 57, 42, 5, 201, 56, 42, 5, 201, 45, - 42, 5, 201, 42, 42, 5, 201, 73, 42, 5, 201, 72, 42, 5, 201, 76, 42, 5, - 201, 55, 42, 5, 201, 54, 42, 5, 201, 75, 42, 5, 216, 85, 42, 5, 216, 71, - 42, 5, 216, 70, 42, 5, 216, 54, 42, 5, 216, 53, 42, 5, 216, 81, 42, 5, - 216, 80, 42, 5, 216, 84, 42, 5, 216, 56, 42, 5, 216, 55, 42, 5, 216, 83, - 42, 5, 203, 162, 42, 5, 202, 122, 42, 5, 202, 99, 42, 5, 201, 40, 42, 5, - 200, 251, 42, 5, 203, 68, 42, 5, 203, 48, 42, 5, 203, 137, 42, 5, 149, - 42, 5, 201, 247, 42, 5, 203, 89, 42, 5, 217, 244, 42, 5, 216, 223, 42, 5, - 216, 190, 42, 5, 215, 186, 42, 5, 215, 123, 42, 5, 217, 118, 42, 5, 217, - 107, 42, 5, 217, 230, 42, 5, 216, 50, 42, 5, 216, 33, 42, 5, 217, 202, - 42, 5, 213, 243, 42, 5, 212, 220, 42, 5, 212, 182, 42, 5, 211, 227, 42, - 5, 211, 191, 42, 5, 213, 92, 42, 5, 213, 79, 42, 5, 213, 221, 42, 5, 212, - 117, 42, 5, 212, 91, 42, 5, 213, 108, 42, 5, 220, 119, 42, 5, 219, 78, - 42, 5, 219, 40, 42, 5, 218, 145, 42, 5, 218, 85, 42, 5, 219, 207, 42, 5, - 219, 188, 42, 5, 220, 81, 42, 5, 218, 251, 42, 5, 218, 195, 42, 5, 219, - 255, 42, 5, 196, 129, 42, 5, 196, 24, 42, 5, 196, 14, 42, 5, 195, 217, - 42, 5, 195, 180, 42, 5, 196, 69, 42, 5, 196, 66, 42, 5, 196, 108, 42, 5, - 196, 3, 42, 5, 195, 237, 42, 5, 196, 80, 42, 5, 210, 244, 42, 5, 210, 72, - 42, 5, 210, 9, 42, 5, 209, 140, 42, 5, 209, 101, 42, 5, 210, 183, 42, 5, - 210, 155, 42, 5, 210, 224, 42, 5, 209, 232, 42, 5, 209, 206, 42, 5, 210, - 193, 42, 5, 223, 82, 42, 5, 222, 109, 42, 5, 222, 91, 42, 5, 221, 191, - 42, 5, 221, 162, 42, 5, 222, 197, 42, 5, 222, 188, 42, 5, 223, 54, 42, 5, - 222, 7, 42, 5, 221, 229, 42, 5, 222, 215, 42, 5, 199, 151, 42, 5, 199, - 34, 42, 5, 199, 18, 42, 5, 197, 220, 42, 5, 197, 212, 42, 5, 199, 118, - 42, 5, 199, 113, 42, 5, 199, 147, 42, 5, 198, 248, 42, 5, 198, 233, 42, - 5, 199, 124, 42, 5, 222, 25, 42, 5, 222, 20, 42, 5, 222, 19, 42, 5, 222, - 16, 42, 5, 222, 15, 42, 5, 222, 22, 42, 5, 222, 21, 42, 5, 222, 24, 42, - 5, 222, 18, 42, 5, 222, 17, 42, 5, 222, 23, 42, 5, 222, 36, 42, 5, 222, - 29, 42, 5, 222, 28, 42, 5, 222, 12, 42, 5, 222, 11, 42, 5, 222, 32, 42, - 5, 222, 31, 42, 5, 222, 35, 42, 5, 222, 14, 42, 5, 222, 13, 42, 5, 222, - 33, 42, 5, 209, 180, 42, 5, 209, 169, 42, 5, 209, 168, 42, 5, 209, 161, - 42, 5, 209, 154, 42, 5, 209, 176, 42, 5, 209, 175, 42, 5, 209, 179, 42, - 5, 209, 167, 42, 5, 209, 166, 42, 5, 209, 178, 42, 5, 216, 67, 42, 5, - 216, 62, 42, 5, 216, 61, 42, 5, 216, 58, 42, 5, 216, 57, 42, 5, 216, 64, - 42, 5, 216, 63, 42, 5, 216, 66, 42, 5, 216, 60, 42, 5, 216, 59, 42, 5, - 216, 65, 42, 5, 225, 213, 42, 5, 225, 172, 42, 5, 225, 164, 42, 5, 225, - 110, 42, 5, 225, 90, 42, 5, 225, 193, 42, 5, 225, 191, 42, 5, 225, 207, - 42, 5, 225, 129, 42, 5, 225, 119, 42, 5, 225, 200, 42, 5, 207, 45, 42, 5, - 206, 223, 42, 5, 206, 218, 42, 5, 206, 151, 42, 5, 206, 133, 42, 5, 206, - 255, 42, 5, 206, 253, 42, 5, 207, 34, 42, 5, 206, 198, 42, 5, 206, 190, - 42, 5, 207, 8, 42, 5, 205, 79, 42, 5, 205, 47, 42, 5, 205, 43, 42, 5, - 205, 34, 42, 5, 205, 31, 42, 5, 205, 53, 42, 5, 205, 52, 42, 5, 205, 78, - 42, 5, 205, 39, 42, 5, 205, 38, 42, 5, 205, 55, 42, 5, 209, 13, 42, 5, - 206, 112, 42, 5, 206, 84, 42, 5, 204, 172, 42, 5, 204, 74, 42, 5, 208, - 147, 42, 5, 208, 129, 42, 5, 208, 253, 42, 5, 205, 200, 42, 5, 205, 171, - 42, 5, 208, 191, 42, 5, 232, 246, 42, 5, 232, 71, 42, 5, 232, 43, 42, 5, - 231, 75, 42, 5, 231, 46, 42, 5, 232, 147, 42, 5, 232, 118, 42, 5, 232, - 235, 42, 5, 231, 193, 42, 5, 231, 166, 42, 5, 232, 158, 42, 5, 223, 201, - 42, 5, 223, 200, 42, 5, 223, 195, 42, 5, 223, 194, 42, 5, 223, 191, 42, - 5, 223, 190, 42, 5, 223, 197, 42, 5, 223, 196, 42, 5, 223, 199, 42, 5, - 223, 193, 42, 5, 223, 192, 42, 5, 223, 198, 42, 5, 206, 158, 153, 108, 2, - 196, 94, 153, 108, 2, 210, 212, 153, 108, 2, 210, 121, 94, 1, 200, 170, - 89, 108, 2, 244, 175, 155, 89, 108, 2, 244, 175, 224, 146, 89, 108, 2, - 244, 175, 224, 11, 89, 108, 2, 244, 175, 224, 117, 89, 108, 2, 244, 175, - 216, 252, 89, 108, 2, 244, 175, 247, 174, 89, 108, 2, 244, 175, 247, 16, - 89, 108, 2, 244, 175, 244, 182, 89, 108, 2, 244, 175, 245, 49, 89, 108, - 2, 244, 175, 215, 73, 89, 108, 2, 244, 175, 240, 136, 89, 108, 2, 244, - 175, 201, 66, 89, 108, 2, 244, 175, 239, 28, 89, 108, 2, 244, 175, 201, - 61, 89, 108, 2, 244, 175, 176, 89, 108, 2, 244, 175, 189, 89, 108, 2, - 244, 175, 202, 233, 89, 108, 2, 244, 175, 149, 89, 108, 2, 244, 175, 202, - 169, 89, 108, 2, 244, 175, 216, 50, 89, 108, 2, 244, 175, 249, 145, 89, - 108, 2, 244, 175, 213, 6, 89, 108, 2, 244, 175, 212, 117, 89, 108, 2, - 244, 175, 212, 234, 89, 108, 2, 244, 175, 218, 251, 89, 108, 2, 244, 175, - 196, 3, 89, 108, 2, 244, 175, 209, 232, 89, 108, 2, 244, 175, 222, 7, 89, - 108, 2, 244, 175, 198, 248, 89, 108, 2, 244, 175, 207, 50, 89, 108, 2, - 244, 175, 205, 80, 89, 108, 2, 244, 175, 183, 89, 108, 2, 244, 175, 142, - 89, 108, 2, 244, 175, 172, 89, 18, 2, 244, 175, 211, 159, 89, 226, 73, - 18, 2, 244, 175, 211, 97, 89, 226, 73, 18, 2, 244, 175, 209, 89, 89, 226, - 73, 18, 2, 244, 175, 209, 82, 89, 226, 73, 18, 2, 244, 175, 211, 139, 89, - 18, 2, 214, 127, 89, 18, 2, 252, 129, 188, 1, 248, 177, 217, 71, 188, 1, - 248, 177, 217, 19, 188, 1, 248, 177, 216, 240, 188, 1, 248, 177, 217, 58, - 188, 1, 248, 177, 216, 252, 71, 1, 248, 177, 217, 71, 71, 1, 248, 177, - 217, 19, 71, 1, 248, 177, 216, 240, 71, 1, 248, 177, 217, 58, 71, 1, 248, - 177, 216, 252, 71, 1, 251, 192, 247, 57, 71, 1, 251, 192, 201, 40, 71, 1, - 251, 192, 149, 71, 1, 251, 192, 214, 3, 73, 1, 236, 74, 236, 73, 241, - 125, 152, 154, 73, 1, 236, 73, 236, 74, 241, 125, 152, 154, + 0, 202, 160, 233, 204, 77, 208, 142, 77, 31, 57, 236, 127, 57, 210, 133, + 57, 250, 229, 250, 147, 46, 210, 230, 51, 210, 230, 250, 37, 102, 57, + 242, 38, 228, 110, 232, 71, 201, 238, 202, 189, 17, 192, 76, 17, 101, 17, + 104, 17, 133, 17, 134, 17, 151, 17, 170, 17, 179, 17, 174, 17, 182, 242, + 47, 204, 180, 219, 240, 57, 234, 30, 57, 230, 204, 57, 208, 159, 77, 242, + 36, 250, 26, 8, 6, 1, 64, 8, 6, 1, 249, 226, 8, 6, 1, 247, 52, 8, 6, 1, + 238, 95, 8, 6, 1, 71, 8, 6, 1, 233, 163, 8, 6, 1, 232, 44, 8, 6, 1, 230, + 124, 8, 6, 1, 70, 8, 6, 1, 223, 65, 8, 6, 1, 222, 184, 8, 6, 1, 165, 8, + 6, 1, 218, 236, 8, 6, 1, 215, 151, 8, 6, 1, 74, 8, 6, 1, 211, 93, 8, 6, + 1, 208, 247, 8, 6, 1, 150, 8, 6, 1, 206, 158, 8, 6, 1, 200, 228, 8, 6, 1, + 68, 8, 6, 1, 196, 236, 8, 6, 1, 194, 202, 8, 6, 1, 193, 223, 8, 6, 1, + 193, 148, 8, 6, 1, 192, 155, 46, 50, 186, 207, 169, 202, 189, 51, 50, + 186, 242, 122, 251, 143, 132, 219, 175, 230, 211, 251, 143, 8, 2, 1, 64, + 8, 2, 1, 249, 226, 8, 2, 1, 247, 52, 8, 2, 1, 238, 95, 8, 2, 1, 71, 8, 2, + 1, 233, 163, 8, 2, 1, 232, 44, 8, 2, 1, 230, 124, 8, 2, 1, 70, 8, 2, 1, + 223, 65, 8, 2, 1, 222, 184, 8, 2, 1, 165, 8, 2, 1, 218, 236, 8, 2, 1, + 215, 151, 8, 2, 1, 74, 8, 2, 1, 211, 93, 8, 2, 1, 208, 247, 8, 2, 1, 150, + 8, 2, 1, 206, 158, 8, 2, 1, 200, 228, 8, 2, 1, 68, 8, 2, 1, 196, 236, 8, + 2, 1, 194, 202, 8, 2, 1, 193, 223, 8, 2, 1, 193, 148, 8, 2, 1, 192, 155, + 46, 238, 138, 186, 84, 219, 175, 51, 238, 138, 186, 199, 90, 213, 136, + 202, 160, 223, 121, 233, 204, 77, 246, 140, 57, 209, 143, 57, 238, 137, + 57, 193, 60, 57, 247, 136, 161, 205, 209, 57, 237, 14, 238, 227, 57, 233, + 28, 211, 158, 223, 172, 220, 23, 55, 250, 208, 208, 142, 77, 213, 111, + 57, 202, 198, 228, 111, 207, 228, 57, 217, 214, 237, 95, 57, 209, 205, + 57, 201, 107, 104, 201, 107, 133, 251, 130, 251, 143, 216, 166, 57, 210, + 9, 57, 85, 236, 114, 246, 151, 201, 107, 101, 217, 111, 211, 158, 223, + 172, 207, 96, 55, 250, 208, 208, 142, 77, 194, 220, 232, 109, 90, 208, + 167, 194, 220, 232, 109, 90, 230, 78, 194, 220, 232, 109, 112, 208, 165, + 223, 121, 208, 159, 77, 8, 6, 1, 41, 4, 230, 210, 8, 6, 1, 41, 4, 251, + 129, 8, 6, 1, 41, 4, 242, 121, 8, 6, 1, 41, 4, 199, 90, 8, 6, 1, 41, 4, + 237, 14, 8, 6, 1, 41, 4, 207, 82, 58, 8, 6, 1, 251, 108, 8, 6, 1, 247, + 53, 4, 246, 151, 8, 6, 1, 234, 253, 4, 230, 210, 8, 6, 1, 234, 253, 4, + 251, 129, 8, 6, 1, 234, 253, 4, 242, 121, 8, 6, 1, 234, 253, 4, 237, 14, + 8, 6, 1, 228, 97, 4, 230, 210, 8, 6, 1, 228, 97, 4, 251, 129, 8, 6, 1, + 228, 97, 4, 242, 121, 8, 6, 1, 228, 97, 4, 237, 14, 8, 6, 1, 233, 235, 8, + 6, 1, 215, 152, 4, 199, 90, 8, 6, 1, 185, 4, 230, 210, 8, 6, 1, 185, 4, + 251, 129, 8, 6, 1, 185, 4, 242, 121, 8, 6, 1, 185, 4, 199, 90, 8, 6, 1, + 185, 4, 237, 14, 215, 214, 57, 8, 6, 1, 185, 4, 111, 8, 6, 1, 124, 4, + 230, 210, 8, 6, 1, 124, 4, 251, 129, 8, 6, 1, 124, 4, 242, 121, 8, 6, 1, + 124, 4, 237, 14, 8, 6, 1, 193, 149, 4, 251, 129, 8, 6, 1, 199, 168, 8, 2, + 1, 204, 26, 206, 158, 8, 2, 1, 41, 4, 230, 210, 8, 2, 1, 41, 4, 251, 129, + 8, 2, 1, 41, 4, 242, 121, 8, 2, 1, 41, 4, 199, 90, 8, 2, 1, 41, 4, 237, + 14, 8, 2, 1, 41, 4, 207, 82, 58, 8, 2, 1, 251, 108, 8, 2, 1, 247, 53, 4, + 246, 151, 8, 2, 1, 234, 253, 4, 230, 210, 8, 2, 1, 234, 253, 4, 251, 129, + 8, 2, 1, 234, 253, 4, 242, 121, 8, 2, 1, 234, 253, 4, 237, 14, 8, 2, 1, + 228, 97, 4, 230, 210, 8, 2, 1, 228, 97, 4, 251, 129, 8, 2, 1, 228, 97, 4, + 242, 121, 8, 2, 1, 228, 97, 4, 237, 14, 8, 2, 1, 233, 235, 8, 2, 1, 215, + 152, 4, 199, 90, 8, 2, 1, 185, 4, 230, 210, 8, 2, 1, 185, 4, 251, 129, 8, + 2, 1, 185, 4, 242, 121, 8, 2, 1, 185, 4, 199, 90, 8, 2, 1, 185, 4, 237, + 14, 236, 172, 57, 8, 2, 1, 185, 4, 111, 8, 2, 1, 124, 4, 230, 210, 8, 2, + 1, 124, 4, 251, 129, 8, 2, 1, 124, 4, 242, 121, 8, 2, 1, 124, 4, 237, 14, + 8, 2, 1, 193, 149, 4, 251, 129, 8, 2, 1, 199, 168, 8, 2, 1, 193, 149, 4, + 237, 14, 8, 6, 1, 41, 4, 217, 214, 8, 2, 1, 41, 4, 217, 214, 8, 6, 1, 41, + 4, 247, 150, 8, 2, 1, 41, 4, 247, 150, 8, 6, 1, 41, 4, 211, 243, 8, 2, 1, + 41, 4, 211, 243, 8, 6, 1, 247, 53, 4, 251, 129, 8, 2, 1, 247, 53, 4, 251, + 129, 8, 6, 1, 247, 53, 4, 242, 121, 8, 2, 1, 247, 53, 4, 242, 121, 8, 6, + 1, 247, 53, 4, 78, 58, 8, 2, 1, 247, 53, 4, 78, 58, 8, 6, 1, 247, 53, 4, + 246, 207, 8, 2, 1, 247, 53, 4, 246, 207, 8, 6, 1, 238, 96, 4, 246, 207, + 8, 2, 1, 238, 96, 4, 246, 207, 8, 6, 1, 238, 96, 4, 111, 8, 2, 1, 238, + 96, 4, 111, 8, 6, 1, 234, 253, 4, 217, 214, 8, 2, 1, 234, 253, 4, 217, + 214, 8, 6, 1, 234, 253, 4, 247, 150, 8, 2, 1, 234, 253, 4, 247, 150, 8, + 6, 1, 234, 253, 4, 78, 58, 8, 2, 1, 234, 253, 4, 78, 58, 8, 6, 1, 234, + 253, 4, 211, 243, 8, 2, 1, 234, 253, 4, 211, 243, 8, 6, 1, 234, 253, 4, + 246, 207, 8, 2, 1, 234, 253, 4, 246, 207, 8, 6, 1, 232, 45, 4, 242, 121, + 8, 2, 1, 232, 45, 4, 242, 121, 8, 6, 1, 232, 45, 4, 247, 150, 8, 2, 1, + 232, 45, 4, 247, 150, 8, 6, 1, 232, 45, 4, 78, 58, 8, 2, 1, 232, 45, 4, + 78, 58, 8, 6, 1, 232, 45, 4, 246, 151, 8, 2, 1, 232, 45, 4, 246, 151, 8, + 6, 1, 230, 125, 4, 242, 121, 8, 2, 1, 230, 125, 4, 242, 121, 8, 6, 1, + 230, 125, 4, 111, 8, 2, 1, 230, 125, 4, 111, 8, 6, 1, 228, 97, 4, 199, + 90, 8, 2, 1, 228, 97, 4, 199, 90, 8, 6, 1, 228, 97, 4, 217, 214, 8, 2, 1, + 228, 97, 4, 217, 214, 8, 6, 1, 228, 97, 4, 247, 150, 8, 2, 1, 228, 97, 4, + 247, 150, 8, 6, 1, 228, 97, 4, 211, 243, 8, 2, 1, 228, 97, 4, 211, 243, + 8, 6, 1, 228, 97, 4, 78, 58, 8, 2, 1, 236, 113, 70, 8, 6, 34, 223, 222, + 8, 2, 34, 223, 222, 8, 6, 1, 223, 66, 4, 242, 121, 8, 2, 1, 223, 66, 4, + 242, 121, 8, 6, 1, 222, 185, 4, 246, 151, 8, 2, 1, 222, 185, 4, 246, 151, + 8, 2, 1, 221, 56, 8, 6, 1, 220, 202, 4, 251, 129, 8, 2, 1, 220, 202, 4, + 251, 129, 8, 6, 1, 220, 202, 4, 246, 151, 8, 2, 1, 220, 202, 4, 246, 151, + 8, 6, 1, 220, 202, 4, 246, 207, 8, 2, 1, 220, 202, 4, 246, 207, 8, 6, 1, + 220, 202, 4, 85, 236, 114, 8, 2, 1, 220, 202, 4, 85, 236, 114, 8, 6, 1, + 220, 202, 4, 111, 8, 2, 1, 220, 202, 4, 111, 8, 6, 1, 215, 152, 4, 251, + 129, 8, 2, 1, 215, 152, 4, 251, 129, 8, 6, 1, 215, 152, 4, 246, 151, 8, + 2, 1, 215, 152, 4, 246, 151, 8, 6, 1, 215, 152, 4, 246, 207, 8, 2, 1, + 215, 152, 4, 246, 207, 8, 2, 1, 215, 152, 209, 117, 247, 64, 250, 147, 8, + 6, 1, 234, 73, 8, 2, 1, 234, 73, 8, 6, 1, 185, 4, 217, 214, 8, 2, 1, 185, + 4, 217, 214, 8, 6, 1, 185, 4, 247, 150, 8, 2, 1, 185, 4, 247, 150, 8, 6, + 1, 185, 4, 55, 251, 129, 8, 2, 1, 185, 4, 55, 251, 129, 8, 6, 34, 212, 0, + 8, 2, 34, 212, 0, 8, 6, 1, 208, 112, 4, 251, 129, 8, 2, 1, 208, 112, 4, + 251, 129, 8, 6, 1, 208, 112, 4, 246, 151, 8, 2, 1, 208, 112, 4, 246, 151, + 8, 6, 1, 208, 112, 4, 246, 207, 8, 2, 1, 208, 112, 4, 246, 207, 8, 6, 1, + 206, 159, 4, 251, 129, 8, 2, 1, 206, 159, 4, 251, 129, 8, 6, 1, 206, 159, + 4, 242, 121, 8, 2, 1, 206, 159, 4, 242, 121, 8, 6, 1, 206, 159, 4, 246, + 151, 8, 2, 1, 206, 159, 4, 246, 151, 8, 6, 1, 206, 159, 4, 246, 207, 8, + 2, 1, 206, 159, 4, 246, 207, 8, 6, 1, 200, 229, 4, 246, 151, 8, 2, 1, + 200, 229, 4, 246, 151, 8, 6, 1, 200, 229, 4, 246, 207, 8, 2, 1, 200, 229, + 4, 246, 207, 8, 6, 1, 200, 229, 4, 111, 8, 2, 1, 200, 229, 4, 111, 8, 6, + 1, 124, 4, 199, 90, 8, 2, 1, 124, 4, 199, 90, 8, 6, 1, 124, 4, 217, 214, + 8, 2, 1, 124, 4, 217, 214, 8, 6, 1, 124, 4, 247, 150, 8, 2, 1, 124, 4, + 247, 150, 8, 6, 1, 124, 4, 207, 82, 58, 8, 2, 1, 124, 4, 207, 82, 58, 8, + 6, 1, 124, 4, 55, 251, 129, 8, 2, 1, 124, 4, 55, 251, 129, 8, 6, 1, 124, + 4, 211, 243, 8, 2, 1, 124, 4, 211, 243, 8, 6, 1, 194, 203, 4, 242, 121, + 8, 2, 1, 194, 203, 4, 242, 121, 8, 6, 1, 193, 149, 4, 242, 121, 8, 2, 1, + 193, 149, 4, 242, 121, 8, 6, 1, 193, 149, 4, 237, 14, 8, 6, 1, 192, 156, + 4, 251, 129, 8, 2, 1, 192, 156, 4, 251, 129, 8, 6, 1, 192, 156, 4, 78, + 58, 8, 2, 1, 192, 156, 4, 78, 58, 8, 6, 1, 192, 156, 4, 246, 207, 8, 2, + 1, 192, 156, 4, 246, 207, 8, 2, 1, 184, 206, 158, 8, 2, 1, 76, 4, 111, 8, + 6, 1, 76, 4, 128, 8, 6, 1, 76, 4, 198, 246, 8, 2, 1, 76, 4, 198, 246, 8, + 6, 1, 158, 170, 8, 2, 1, 158, 170, 8, 6, 1, 211, 184, 74, 8, 6, 1, 247, + 53, 4, 128, 8, 2, 1, 247, 53, 4, 128, 8, 6, 1, 251, 83, 238, 95, 8, 6, 1, + 238, 96, 4, 128, 8, 6, 1, 238, 96, 4, 198, 246, 8, 2, 1, 238, 96, 4, 198, + 246, 8, 2, 1, 163, 237, 76, 8, 6, 1, 207, 168, 71, 8, 6, 1, 205, 240, 8, + 6, 1, 211, 184, 71, 8, 6, 1, 233, 164, 4, 128, 8, 2, 1, 233, 164, 4, 128, + 8, 6, 1, 232, 45, 4, 128, 8, 6, 1, 231, 204, 8, 2, 1, 228, 148, 8, 6, 1, + 223, 111, 8, 6, 1, 228, 97, 4, 111, 8, 6, 1, 222, 185, 4, 128, 8, 2, 1, + 222, 185, 4, 128, 8, 2, 1, 220, 202, 4, 161, 8, 2, 1, 220, 92, 4, 111, 8, + 6, 1, 163, 218, 236, 8, 6, 1, 215, 152, 4, 46, 128, 8, 2, 1, 215, 152, 4, + 184, 51, 220, 16, 8, 6, 1, 185, 4, 85, 199, 90, 8, 6, 1, 185, 4, 228, + 208, 8, 2, 1, 185, 4, 228, 208, 8, 6, 1, 211, 238, 8, 2, 1, 211, 238, 8, + 6, 1, 211, 94, 4, 128, 8, 2, 1, 211, 94, 4, 128, 8, 1, 192, 217, 8, 6, 1, + 158, 104, 8, 2, 1, 158, 104, 8, 6, 1, 233, 255, 8, 1, 207, 168, 234, 0, + 219, 69, 8, 2, 1, 200, 229, 4, 211, 49, 128, 8, 6, 1, 200, 229, 4, 128, + 8, 2, 1, 200, 229, 4, 128, 8, 6, 1, 200, 229, 4, 207, 174, 128, 8, 6, 1, + 124, 4, 228, 208, 8, 2, 1, 124, 4, 228, 208, 8, 6, 1, 197, 34, 8, 6, 1, + 196, 237, 4, 128, 8, 6, 1, 193, 149, 4, 128, 8, 2, 1, 193, 149, 4, 128, + 8, 6, 1, 192, 156, 4, 111, 8, 2, 1, 192, 156, 4, 111, 8, 6, 1, 233, 166, + 8, 6, 1, 233, 167, 207, 167, 8, 2, 1, 233, 167, 207, 167, 8, 2, 1, 233, + 167, 4, 200, 147, 8, 1, 103, 4, 111, 8, 6, 1, 158, 151, 8, 2, 1, 158, + 151, 8, 1, 223, 121, 231, 6, 201, 239, 4, 111, 8, 1, 193, 226, 8, 1, 237, + 69, 242, 96, 8, 1, 220, 63, 242, 96, 8, 1, 250, 242, 242, 96, 8, 1, 207, + 174, 242, 96, 8, 6, 1, 235, 19, 4, 246, 207, 8, 6, 1, 238, 96, 4, 2, 1, + 192, 156, 4, 246, 207, 8, 2, 1, 235, 19, 4, 246, 207, 8, 6, 1, 219, 141, + 8, 6, 1, 220, 202, 4, 2, 1, 223, 65, 8, 2, 1, 219, 141, 8, 6, 1, 214, 1, + 8, 6, 1, 215, 152, 4, 2, 1, 223, 65, 8, 2, 1, 214, 1, 8, 6, 1, 41, 4, + 246, 207, 8, 2, 1, 41, 4, 246, 207, 8, 6, 1, 228, 97, 4, 246, 207, 8, 2, + 1, 228, 97, 4, 246, 207, 8, 6, 1, 185, 4, 246, 207, 8, 2, 1, 185, 4, 246, + 207, 8, 6, 1, 124, 4, 246, 207, 8, 2, 1, 124, 4, 246, 207, 8, 6, 1, 124, + 4, 237, 15, 26, 217, 214, 8, 2, 1, 124, 4, 237, 15, 26, 217, 214, 8, 6, + 1, 124, 4, 237, 15, 26, 251, 129, 8, 2, 1, 124, 4, 237, 15, 26, 251, 129, + 8, 6, 1, 124, 4, 237, 15, 26, 246, 207, 8, 2, 1, 124, 4, 237, 15, 26, + 246, 207, 8, 6, 1, 124, 4, 237, 15, 26, 230, 210, 8, 2, 1, 124, 4, 237, + 15, 26, 230, 210, 8, 2, 1, 163, 71, 8, 6, 1, 41, 4, 237, 15, 26, 217, + 214, 8, 2, 1, 41, 4, 237, 15, 26, 217, 214, 8, 6, 1, 41, 4, 78, 95, 26, + 217, 214, 8, 2, 1, 41, 4, 78, 95, 26, 217, 214, 8, 6, 1, 251, 109, 4, + 217, 214, 8, 2, 1, 251, 109, 4, 217, 214, 8, 6, 1, 232, 45, 4, 111, 8, 2, + 1, 232, 45, 4, 111, 8, 6, 1, 232, 45, 4, 246, 207, 8, 2, 1, 232, 45, 4, + 246, 207, 8, 6, 1, 222, 185, 4, 246, 207, 8, 2, 1, 222, 185, 4, 246, 207, + 8, 6, 1, 185, 4, 211, 243, 8, 2, 1, 185, 4, 211, 243, 8, 6, 1, 185, 4, + 211, 244, 26, 217, 214, 8, 2, 1, 185, 4, 211, 244, 26, 217, 214, 8, 6, 1, + 233, 167, 4, 246, 207, 8, 2, 1, 233, 167, 4, 246, 207, 8, 2, 1, 223, 66, + 4, 246, 207, 8, 6, 1, 235, 18, 8, 6, 1, 238, 96, 4, 2, 1, 192, 155, 8, 2, + 1, 235, 18, 8, 6, 1, 232, 45, 4, 251, 129, 8, 2, 1, 232, 45, 4, 251, 129, + 8, 6, 1, 228, 145, 8, 6, 1, 193, 226, 8, 6, 1, 215, 152, 4, 230, 210, 8, + 2, 1, 215, 152, 4, 230, 210, 8, 6, 1, 41, 4, 207, 82, 95, 26, 251, 129, + 8, 2, 1, 41, 4, 207, 82, 95, 26, 251, 129, 8, 6, 1, 251, 109, 4, 251, + 129, 8, 2, 1, 251, 109, 4, 251, 129, 8, 6, 1, 185, 4, 201, 208, 26, 251, + 129, 8, 2, 1, 185, 4, 201, 208, 26, 251, 129, 8, 6, 1, 41, 4, 55, 230, + 210, 8, 2, 1, 41, 4, 55, 230, 210, 8, 6, 1, 41, 4, 223, 121, 247, 150, 8, + 2, 1, 41, 4, 223, 121, 247, 150, 8, 6, 1, 234, 253, 4, 55, 230, 210, 8, + 2, 1, 234, 253, 4, 55, 230, 210, 8, 6, 1, 234, 253, 4, 223, 121, 247, + 150, 8, 2, 1, 234, 253, 4, 223, 121, 247, 150, 8, 6, 1, 228, 97, 4, 55, + 230, 210, 8, 2, 1, 228, 97, 4, 55, 230, 210, 8, 6, 1, 228, 97, 4, 223, + 121, 247, 150, 8, 2, 1, 228, 97, 4, 223, 121, 247, 150, 8, 6, 1, 185, 4, + 55, 230, 210, 8, 2, 1, 185, 4, 55, 230, 210, 8, 6, 1, 185, 4, 223, 121, + 247, 150, 8, 2, 1, 185, 4, 223, 121, 247, 150, 8, 6, 1, 208, 112, 4, 55, + 230, 210, 8, 2, 1, 208, 112, 4, 55, 230, 210, 8, 6, 1, 208, 112, 4, 223, + 121, 247, 150, 8, 2, 1, 208, 112, 4, 223, 121, 247, 150, 8, 6, 1, 124, 4, + 55, 230, 210, 8, 2, 1, 124, 4, 55, 230, 210, 8, 6, 1, 124, 4, 223, 121, + 247, 150, 8, 2, 1, 124, 4, 223, 121, 247, 150, 8, 6, 1, 206, 159, 4, 242, + 39, 63, 8, 2, 1, 206, 159, 4, 242, 39, 63, 8, 6, 1, 200, 229, 4, 242, 39, + 63, 8, 2, 1, 200, 229, 4, 242, 39, 63, 8, 6, 1, 192, 237, 8, 2, 1, 192, + 237, 8, 6, 1, 230, 125, 4, 246, 207, 8, 2, 1, 230, 125, 4, 246, 207, 8, + 6, 1, 215, 152, 4, 184, 51, 220, 16, 8, 2, 1, 238, 96, 4, 238, 142, 8, 6, + 1, 211, 130, 8, 2, 1, 211, 130, 8, 6, 1, 192, 156, 4, 128, 8, 2, 1, 192, + 156, 4, 128, 8, 6, 1, 41, 4, 78, 58, 8, 2, 1, 41, 4, 78, 58, 8, 6, 1, + 234, 253, 4, 246, 151, 8, 2, 1, 234, 253, 4, 246, 151, 8, 6, 1, 185, 4, + 237, 15, 26, 217, 214, 8, 2, 1, 185, 4, 237, 15, 26, 217, 214, 8, 6, 1, + 185, 4, 199, 91, 26, 217, 214, 8, 2, 1, 185, 4, 199, 91, 26, 217, 214, 8, + 6, 1, 185, 4, 78, 58, 8, 2, 1, 185, 4, 78, 58, 8, 6, 1, 185, 4, 78, 95, + 26, 217, 214, 8, 2, 1, 185, 4, 78, 95, 26, 217, 214, 8, 6, 1, 193, 149, + 4, 217, 214, 8, 2, 1, 193, 149, 4, 217, 214, 8, 2, 1, 220, 202, 4, 238, + 142, 8, 2, 1, 215, 152, 4, 238, 142, 8, 2, 1, 200, 229, 4, 238, 142, 8, + 2, 1, 236, 113, 223, 65, 8, 2, 1, 237, 171, 236, 230, 8, 2, 1, 208, 178, + 236, 230, 8, 6, 1, 41, 4, 111, 8, 6, 1, 247, 53, 4, 111, 8, 2, 1, 247, + 53, 4, 111, 8, 6, 1, 220, 202, 4, 161, 8, 6, 1, 200, 229, 4, 237, 11, + 111, 8, 2, 1, 206, 159, 4, 201, 75, 200, 147, 8, 2, 1, 192, 156, 4, 201, + 75, 200, 147, 8, 6, 1, 231, 6, 201, 238, 8, 2, 1, 231, 6, 201, 238, 8, 6, + 1, 76, 4, 111, 8, 6, 1, 124, 161, 8, 6, 1, 163, 196, 236, 8, 6, 1, 234, + 253, 4, 111, 8, 2, 1, 234, 253, 4, 111, 8, 6, 1, 223, 66, 4, 111, 8, 2, + 1, 223, 66, 4, 111, 8, 6, 1, 2, 208, 248, 4, 229, 15, 200, 147, 8, 2, 1, + 208, 248, 4, 229, 15, 200, 147, 8, 6, 1, 208, 112, 4, 111, 8, 2, 1, 208, + 112, 4, 111, 8, 6, 1, 193, 149, 4, 111, 8, 2, 1, 193, 149, 4, 111, 8, 2, + 1, 163, 64, 8, 2, 1, 250, 252, 8, 2, 1, 163, 250, 252, 8, 2, 1, 76, 4, + 128, 8, 2, 1, 211, 184, 74, 8, 2, 1, 247, 53, 4, 238, 142, 8, 2, 1, 238, + 96, 4, 200, 147, 8, 2, 1, 238, 96, 4, 128, 8, 2, 1, 207, 168, 71, 8, 2, + 1, 205, 240, 8, 2, 1, 205, 241, 4, 128, 8, 2, 1, 211, 184, 71, 8, 2, 1, + 207, 168, 211, 184, 71, 8, 2, 1, 207, 168, 211, 184, 234, 253, 4, 128, 8, + 2, 1, 242, 84, 207, 168, 211, 184, 71, 8, 2, 1, 236, 113, 223, 66, 4, + 111, 8, 2, 1, 232, 45, 4, 128, 8, 2, 1, 27, 232, 44, 8, 1, 2, 6, 232, 44, + 8, 2, 1, 231, 204, 8, 2, 1, 208, 32, 228, 208, 8, 2, 1, 163, 230, 124, 8, + 2, 1, 230, 125, 4, 128, 8, 2, 1, 229, 207, 4, 128, 8, 2, 1, 228, 97, 4, + 111, 8, 2, 1, 223, 111, 8, 1, 2, 6, 70, 8, 2, 1, 220, 202, 4, 85, 199, + 90, 8, 2, 1, 220, 202, 4, 248, 82, 8, 2, 1, 220, 202, 4, 207, 174, 128, + 8, 2, 1, 219, 225, 8, 2, 1, 163, 218, 236, 8, 2, 1, 163, 218, 237, 4, + 184, 220, 16, 8, 2, 1, 218, 237, 4, 128, 8, 2, 1, 215, 152, 4, 46, 128, + 8, 2, 1, 215, 152, 4, 207, 174, 128, 8, 1, 2, 6, 215, 151, 8, 2, 1, 248, + 188, 74, 8, 1, 2, 6, 212, 0, 8, 2, 1, 242, 84, 211, 216, 8, 2, 1, 210, + 77, 8, 2, 1, 163, 150, 8, 2, 1, 163, 208, 112, 4, 184, 220, 16, 8, 2, 1, + 163, 208, 112, 4, 128, 8, 2, 1, 208, 112, 4, 184, 220, 16, 8, 2, 1, 208, + 112, 4, 200, 147, 8, 2, 1, 208, 112, 4, 232, 221, 8, 2, 1, 207, 168, 208, + 112, 4, 232, 221, 8, 1, 2, 6, 150, 8, 1, 2, 6, 223, 121, 150, 8, 2, 1, + 206, 159, 4, 128, 8, 2, 1, 233, 255, 8, 2, 1, 236, 113, 223, 66, 4, 201, + 208, 26, 128, 8, 2, 1, 202, 103, 207, 168, 233, 255, 8, 2, 1, 234, 0, 4, + 238, 142, 8, 2, 1, 163, 200, 228, 8, 2, 1, 200, 229, 4, 207, 174, 128, 8, + 2, 1, 124, 161, 8, 2, 1, 197, 34, 8, 2, 1, 196, 237, 4, 128, 8, 2, 1, + 163, 196, 236, 8, 2, 1, 163, 194, 202, 8, 2, 1, 163, 193, 148, 8, 1, 2, + 6, 193, 148, 8, 2, 1, 192, 156, 4, 207, 174, 128, 8, 2, 1, 192, 156, 4, + 238, 142, 8, 2, 1, 233, 166, 8, 2, 1, 233, 167, 4, 238, 142, 8, 1, 231, + 6, 201, 238, 8, 1, 210, 85, 195, 248, 232, 95, 8, 1, 223, 121, 231, 6, + 201, 238, 8, 1, 201, 216, 247, 52, 8, 1, 248, 25, 242, 96, 8, 1, 2, 6, + 249, 226, 8, 2, 1, 242, 84, 211, 184, 71, 8, 1, 2, 6, 232, 45, 4, 128, 8, + 1, 2, 6, 230, 124, 8, 2, 1, 223, 66, 4, 238, 178, 8, 2, 1, 163, 222, 184, + 8, 1, 2, 6, 165, 8, 2, 1, 208, 248, 4, 128, 8, 1, 231, 6, 201, 239, 4, + 111, 8, 1, 207, 168, 231, 6, 201, 239, 4, 111, 8, 2, 1, 235, 19, 236, + 230, 8, 2, 1, 237, 42, 236, 230, 8, 2, 1, 235, 19, 236, 231, 4, 238, 142, + 8, 2, 1, 198, 120, 236, 230, 8, 2, 1, 200, 14, 236, 230, 8, 2, 1, 200, + 86, 236, 231, 4, 238, 142, 8, 2, 1, 233, 25, 236, 230, 8, 2, 1, 219, 38, + 236, 230, 8, 2, 1, 218, 238, 236, 230, 8, 1, 248, 25, 210, 132, 8, 1, + 248, 33, 210, 132, 8, 2, 1, 163, 230, 125, 4, 232, 221, 8, 2, 1, 163, + 230, 125, 4, 232, 222, 26, 200, 147, 73, 1, 2, 230, 124, 73, 1, 2, 230, + 125, 4, 128, 73, 1, 2, 223, 65, 73, 1, 2, 150, 73, 1, 2, 163, 150, 73, 1, + 2, 163, 208, 112, 4, 128, 73, 1, 2, 6, 223, 121, 150, 73, 1, 2, 194, 202, + 73, 1, 2, 193, 148, 73, 1, 209, 99, 73, 1, 55, 209, 99, 73, 1, 163, 242, + 38, 73, 1, 250, 147, 73, 1, 207, 168, 242, 38, 73, 1, 51, 138, 207, 81, + 73, 1, 46, 138, 207, 81, 73, 1, 231, 6, 201, 238, 73, 1, 207, 168, 231, + 6, 201, 238, 73, 1, 46, 250, 77, 73, 1, 51, 250, 77, 73, 1, 130, 250, 77, + 73, 1, 142, 250, 77, 73, 1, 242, 122, 251, 143, 246, 207, 73, 1, 84, 219, + 175, 73, 1, 217, 214, 73, 1, 251, 130, 251, 143, 73, 1, 230, 211, 251, + 143, 73, 1, 132, 84, 219, 175, 73, 1, 132, 217, 214, 73, 1, 132, 230, + 211, 251, 143, 73, 1, 132, 251, 130, 251, 143, 73, 1, 198, 182, 242, 47, + 73, 1, 138, 198, 182, 242, 47, 73, 1, 246, 136, 51, 138, 207, 81, 73, 1, + 246, 136, 46, 138, 207, 81, 73, 1, 130, 200, 159, 73, 1, 142, 200, 159, + 73, 1, 102, 57, 73, 1, 216, 113, 57, 247, 150, 78, 58, 207, 82, 58, 211, + 243, 2, 199, 90, 55, 251, 130, 251, 143, 73, 1, 207, 152, 128, 73, 1, + 238, 184, 251, 143, 73, 1, 2, 231, 204, 73, 1, 2, 165, 73, 1, 2, 206, + 158, 73, 1, 2, 193, 223, 73, 1, 2, 207, 168, 231, 6, 201, 238, 73, 1, + 233, 188, 158, 161, 73, 1, 139, 158, 161, 73, 1, 216, 162, 158, 161, 73, + 1, 132, 158, 161, 73, 1, 233, 187, 158, 161, 73, 1, 193, 11, 237, 66, + 158, 77, 73, 1, 193, 96, 237, 66, 158, 77, 73, 1, 195, 246, 73, 1, 197, + 73, 73, 1, 55, 250, 147, 73, 1, 132, 142, 250, 77, 73, 1, 132, 130, 250, + 77, 73, 1, 132, 46, 250, 77, 73, 1, 132, 51, 250, 77, 73, 1, 132, 207, + 81, 73, 1, 85, 230, 211, 251, 143, 73, 1, 85, 55, 230, 211, 251, 143, 73, + 1, 85, 55, 251, 130, 251, 143, 73, 1, 132, 199, 90, 73, 1, 208, 39, 242, + 47, 73, 1, 248, 100, 139, 199, 18, 73, 1, 234, 80, 139, 199, 18, 73, 1, + 248, 100, 132, 199, 18, 73, 1, 234, 80, 132, 199, 18, 73, 1, 204, 3, 73, + 1, 211, 184, 204, 3, 73, 1, 132, 46, 54, 38, 230, 211, 251, 143, 38, 251, + 130, 251, 143, 38, 242, 122, 251, 143, 38, 199, 90, 38, 217, 214, 38, + 211, 109, 38, 247, 150, 38, 78, 58, 38, 237, 14, 38, 229, 15, 58, 38, + 207, 82, 58, 38, 55, 251, 130, 251, 143, 38, 246, 207, 38, 84, 219, 176, + 58, 38, 55, 84, 219, 176, 58, 38, 55, 230, 211, 251, 143, 38, 246, 234, + 38, 223, 121, 247, 150, 38, 163, 242, 39, 58, 38, 242, 39, 58, 38, 207, + 168, 242, 39, 58, 38, 242, 39, 95, 207, 101, 38, 230, 211, 251, 144, 63, + 38, 251, 130, 251, 144, 63, 38, 46, 200, 160, 63, 38, 51, 200, 160, 63, + 38, 46, 250, 208, 58, 38, 228, 208, 38, 46, 138, 207, 82, 63, 38, 130, + 200, 160, 63, 38, 142, 200, 160, 63, 38, 102, 3, 63, 38, 216, 113, 3, 63, + 38, 211, 47, 229, 15, 63, 38, 207, 174, 229, 15, 63, 38, 78, 63, 38, 237, + 15, 63, 38, 207, 82, 63, 38, 242, 39, 63, 38, 246, 151, 38, 211, 243, 38, + 84, 219, 176, 63, 38, 247, 143, 63, 38, 223, 121, 55, 250, 113, 63, 38, + 246, 208, 63, 38, 242, 122, 251, 144, 63, 38, 247, 151, 63, 38, 223, 121, + 247, 151, 63, 38, 199, 91, 63, 38, 217, 215, 63, 38, 132, 219, 175, 38, + 55, 132, 219, 175, 38, 199, 91, 211, 110, 38, 203, 195, 201, 208, 211, + 110, 38, 184, 201, 208, 211, 110, 38, 203, 195, 202, 190, 211, 110, 38, + 184, 202, 190, 211, 110, 38, 51, 138, 207, 82, 63, 38, 223, 121, 247, + 143, 63, 38, 50, 63, 38, 205, 217, 63, 38, 193, 224, 58, 38, 84, 199, 90, + 38, 55, 211, 109, 38, 230, 211, 158, 77, 38, 251, 130, 158, 77, 38, 33, + 210, 126, 38, 33, 221, 78, 38, 33, 237, 8, 198, 255, 38, 33, 192, 222, + 38, 247, 143, 58, 38, 234, 30, 3, 63, 38, 55, 84, 219, 176, 63, 38, 46, + 250, 208, 63, 38, 213, 111, 199, 91, 58, 38, 229, 21, 58, 38, 251, 1, + 187, 115, 58, 38, 46, 51, 61, 63, 38, 197, 30, 61, 63, 38, 230, 217, 222, + 228, 38, 51, 250, 78, 58, 38, 46, 138, 207, 82, 58, 38, 233, 22, 38, 193, + 224, 63, 38, 46, 250, 78, 63, 38, 51, 250, 78, 63, 38, 51, 250, 78, 26, + 130, 250, 78, 63, 38, 51, 138, 207, 82, 58, 38, 78, 95, 207, 101, 38, + 250, 38, 63, 38, 55, 207, 82, 63, 38, 192, 21, 58, 38, 55, 247, 151, 63, + 38, 55, 247, 150, 38, 55, 217, 214, 38, 55, 217, 215, 63, 38, 55, 199, + 90, 38, 55, 223, 121, 247, 150, 38, 55, 94, 61, 63, 38, 8, 2, 1, 64, 38, + 8, 2, 1, 71, 38, 8, 2, 1, 70, 38, 8, 2, 1, 74, 38, 8, 2, 1, 68, 38, 8, 2, + 1, 247, 52, 38, 8, 2, 1, 238, 95, 38, 8, 2, 1, 230, 124, 38, 8, 2, 1, + 218, 236, 38, 8, 2, 1, 150, 38, 8, 2, 1, 200, 228, 38, 8, 2, 1, 196, 236, + 38, 8, 2, 1, 193, 223, 33, 6, 1, 229, 195, 33, 2, 1, 229, 195, 33, 6, 1, + 250, 112, 206, 43, 33, 2, 1, 250, 112, 206, 43, 33, 212, 234, 57, 33, + 106, 212, 234, 57, 33, 6, 1, 211, 30, 236, 238, 33, 2, 1, 211, 30, 236, + 238, 33, 192, 222, 33, 2, 207, 168, 219, 18, 203, 100, 109, 33, 2, 235, + 111, 219, 18, 203, 100, 109, 33, 2, 207, 168, 235, 111, 219, 18, 203, + 100, 109, 33, 208, 159, 77, 33, 6, 1, 192, 229, 33, 198, 255, 33, 237, 8, + 198, 255, 33, 6, 1, 250, 253, 4, 198, 255, 33, 250, 191, 200, 43, 33, 6, + 1, 234, 33, 4, 198, 255, 33, 6, 1, 233, 241, 4, 198, 255, 33, 6, 1, 223, + 112, 4, 198, 255, 33, 6, 1, 211, 215, 4, 198, 255, 33, 6, 1, 197, 35, 4, + 198, 255, 33, 6, 1, 211, 217, 4, 198, 255, 33, 2, 1, 223, 112, 4, 237, 8, + 26, 198, 255, 33, 6, 1, 250, 252, 33, 6, 1, 248, 63, 33, 6, 1, 231, 204, + 33, 6, 1, 237, 76, 33, 6, 1, 234, 32, 33, 6, 1, 192, 75, 33, 6, 1, 233, + 240, 33, 6, 1, 199, 206, 33, 6, 1, 223, 111, 33, 6, 1, 222, 106, 33, 6, + 1, 220, 90, 33, 6, 1, 215, 241, 33, 6, 1, 213, 22, 33, 6, 1, 193, 196, + 33, 6, 1, 211, 214, 33, 6, 1, 210, 51, 33, 6, 1, 207, 153, 33, 6, 1, 203, + 99, 33, 6, 1, 200, 100, 33, 6, 1, 197, 34, 33, 6, 1, 210, 77, 33, 6, 1, + 242, 215, 33, 6, 1, 209, 62, 33, 6, 1, 211, 216, 33, 6, 1, 223, 112, 4, + 237, 7, 33, 6, 1, 197, 35, 4, 237, 7, 33, 2, 1, 250, 253, 4, 198, 255, + 33, 2, 1, 234, 33, 4, 198, 255, 33, 2, 1, 233, 241, 4, 198, 255, 33, 2, + 1, 223, 112, 4, 198, 255, 33, 2, 1, 197, 35, 4, 237, 8, 26, 198, 255, 33, + 2, 1, 250, 252, 33, 2, 1, 248, 63, 33, 2, 1, 231, 204, 33, 2, 1, 237, 76, + 33, 2, 1, 234, 32, 33, 2, 1, 192, 75, 33, 2, 1, 233, 240, 33, 2, 1, 199, + 206, 33, 2, 1, 223, 111, 33, 2, 1, 222, 106, 33, 2, 1, 220, 90, 33, 2, 1, + 215, 241, 33, 2, 1, 213, 22, 33, 2, 1, 193, 196, 33, 2, 1, 211, 214, 33, + 2, 1, 210, 51, 33, 2, 1, 207, 153, 33, 2, 1, 52, 203, 99, 33, 2, 1, 203, + 99, 33, 2, 1, 200, 100, 33, 2, 1, 197, 34, 33, 2, 1, 210, 77, 33, 2, 1, + 242, 215, 33, 2, 1, 209, 62, 33, 2, 1, 211, 216, 33, 2, 1, 223, 112, 4, + 237, 7, 33, 2, 1, 197, 35, 4, 237, 7, 33, 2, 1, 211, 215, 4, 198, 255, + 33, 2, 1, 197, 35, 4, 198, 255, 33, 2, 1, 211, 217, 4, 198, 255, 33, 6, + 222, 136, 109, 33, 248, 64, 109, 33, 199, 207, 109, 33, 197, 35, 4, 229, + 15, 109, 33, 197, 35, 4, 251, 130, 26, 229, 15, 109, 33, 197, 35, 4, 237, + 15, 26, 229, 15, 109, 33, 210, 78, 109, 33, 210, 52, 109, 33, 222, 136, + 109, 33, 1, 250, 112, 221, 82, 33, 2, 1, 250, 112, 221, 82, 33, 1, 201, + 248, 33, 2, 1, 201, 248, 33, 1, 236, 238, 33, 2, 1, 236, 238, 33, 1, 221, + 82, 33, 2, 1, 221, 82, 33, 1, 206, 43, 33, 2, 1, 206, 43, 92, 6, 1, 204, + 4, 92, 2, 1, 204, 4, 92, 6, 1, 233, 32, 92, 2, 1, 233, 32, 92, 6, 1, 221, + 232, 92, 2, 1, 221, 232, 92, 6, 1, 229, 6, 92, 2, 1, 229, 6, 92, 6, 1, + 231, 199, 92, 2, 1, 231, 199, 92, 6, 1, 203, 226, 92, 2, 1, 203, 226, 92, + 6, 1, 237, 92, 92, 2, 1, 237, 92, 33, 222, 107, 109, 33, 207, 154, 109, + 33, 219, 18, 203, 100, 109, 33, 1, 192, 229, 33, 6, 199, 207, 109, 33, + 219, 18, 234, 33, 109, 33, 207, 168, 219, 18, 234, 33, 109, 33, 6, 1, + 203, 211, 33, 2, 1, 203, 211, 33, 6, 219, 18, 203, 100, 109, 33, 6, 1, + 206, 40, 33, 2, 1, 206, 40, 33, 207, 154, 4, 201, 208, 109, 33, 6, 207, + 168, 219, 18, 203, 100, 109, 33, 6, 235, 111, 219, 18, 203, 100, 109, 33, + 6, 207, 168, 235, 111, 219, 18, 203, 100, 109, 42, 6, 1, 223, 252, 4, + 230, 210, 42, 6, 1, 223, 116, 42, 6, 1, 236, 164, 42, 6, 1, 231, 15, 42, + 6, 1, 197, 89, 223, 251, 42, 6, 1, 235, 14, 42, 6, 1, 247, 62, 70, 42, 6, + 1, 193, 22, 42, 6, 1, 223, 41, 42, 6, 1, 219, 140, 42, 6, 1, 213, 249, + 42, 6, 1, 198, 106, 42, 6, 1, 221, 141, 42, 6, 1, 228, 97, 4, 230, 210, + 42, 6, 1, 203, 195, 68, 42, 6, 1, 235, 10, 42, 6, 1, 64, 42, 6, 1, 248, + 123, 42, 6, 1, 196, 123, 42, 6, 1, 231, 70, 42, 6, 1, 237, 116, 42, 6, 1, + 223, 251, 42, 6, 1, 192, 62, 42, 6, 1, 192, 85, 42, 6, 1, 70, 42, 6, 1, + 203, 195, 70, 42, 6, 1, 160, 42, 6, 1, 234, 124, 42, 6, 1, 234, 99, 42, + 6, 1, 234, 88, 42, 6, 1, 74, 42, 6, 1, 210, 181, 42, 6, 1, 234, 21, 42, + 6, 1, 234, 9, 42, 6, 1, 200, 79, 42, 6, 1, 68, 42, 6, 1, 234, 164, 42, 6, + 1, 144, 42, 6, 1, 198, 112, 42, 6, 1, 242, 245, 42, 6, 1, 204, 64, 42, 6, + 1, 204, 15, 42, 6, 1, 230, 26, 57, 42, 6, 1, 193, 47, 42, 6, 1, 202, 198, + 57, 42, 6, 1, 71, 42, 6, 1, 192, 214, 42, 6, 1, 168, 42, 2, 1, 64, 42, 2, + 1, 248, 123, 42, 2, 1, 196, 123, 42, 2, 1, 231, 70, 42, 2, 1, 237, 116, + 42, 2, 1, 223, 251, 42, 2, 1, 192, 62, 42, 2, 1, 192, 85, 42, 2, 1, 70, + 42, 2, 1, 203, 195, 70, 42, 2, 1, 160, 42, 2, 1, 234, 124, 42, 2, 1, 234, + 99, 42, 2, 1, 234, 88, 42, 2, 1, 74, 42, 2, 1, 210, 181, 42, 2, 1, 234, + 21, 42, 2, 1, 234, 9, 42, 2, 1, 200, 79, 42, 2, 1, 68, 42, 2, 1, 234, + 164, 42, 2, 1, 144, 42, 2, 1, 198, 112, 42, 2, 1, 242, 245, 42, 2, 1, + 204, 64, 42, 2, 1, 204, 15, 42, 2, 1, 230, 26, 57, 42, 2, 1, 193, 47, 42, + 2, 1, 202, 198, 57, 42, 2, 1, 71, 42, 2, 1, 192, 214, 42, 2, 1, 168, 42, + 2, 1, 223, 252, 4, 230, 210, 42, 2, 1, 223, 116, 42, 2, 1, 236, 164, 42, + 2, 1, 231, 15, 42, 2, 1, 197, 89, 223, 251, 42, 2, 1, 235, 14, 42, 2, 1, + 247, 62, 70, 42, 2, 1, 193, 22, 42, 2, 1, 223, 41, 42, 2, 1, 219, 140, + 42, 2, 1, 213, 249, 42, 2, 1, 198, 106, 42, 2, 1, 221, 141, 42, 2, 1, + 228, 97, 4, 230, 210, 42, 2, 1, 203, 195, 68, 42, 2, 1, 235, 10, 42, 6, + 1, 211, 216, 42, 2, 1, 211, 216, 42, 6, 1, 193, 84, 42, 2, 1, 193, 84, + 42, 6, 1, 223, 109, 71, 42, 2, 1, 223, 109, 71, 42, 6, 1, 219, 147, 192, + 179, 42, 2, 1, 219, 147, 192, 179, 42, 6, 1, 223, 109, 219, 147, 192, + 179, 42, 2, 1, 223, 109, 219, 147, 192, 179, 42, 6, 1, 248, 28, 192, 179, + 42, 2, 1, 248, 28, 192, 179, 42, 6, 1, 223, 109, 248, 28, 192, 179, 42, + 2, 1, 223, 109, 248, 28, 192, 179, 42, 6, 1, 221, 49, 42, 2, 1, 221, 49, + 42, 6, 1, 209, 62, 42, 2, 1, 209, 62, 42, 6, 1, 232, 216, 42, 2, 1, 232, + 216, 42, 6, 1, 223, 67, 42, 2, 1, 223, 67, 42, 6, 1, 223, 68, 4, 55, 230, + 211, 251, 143, 42, 2, 1, 223, 68, 4, 55, 230, 211, 251, 143, 42, 6, 1, + 197, 92, 42, 2, 1, 197, 92, 42, 6, 1, 207, 9, 211, 216, 42, 2, 1, 207, 9, + 211, 216, 42, 6, 1, 211, 217, 4, 199, 60, 42, 2, 1, 211, 217, 4, 199, 60, + 42, 6, 1, 211, 140, 42, 2, 1, 211, 140, 42, 6, 1, 221, 82, 42, 2, 1, 221, + 82, 42, 199, 164, 57, 38, 42, 199, 60, 38, 42, 211, 48, 38, 42, 237, 183, + 209, 200, 38, 42, 209, 56, 209, 200, 38, 42, 209, 184, 38, 42, 228, 163, + 199, 164, 57, 38, 42, 216, 124, 57, 42, 6, 1, 203, 195, 228, 97, 4, 200, + 147, 42, 2, 1, 203, 195, 228, 97, 4, 200, 147, 42, 6, 1, 204, 176, 57, + 42, 2, 1, 204, 176, 57, 42, 6, 1, 234, 22, 4, 199, 117, 42, 2, 1, 234, + 22, 4, 199, 117, 42, 6, 1, 231, 71, 4, 197, 33, 42, 2, 1, 231, 71, 4, + 197, 33, 42, 6, 1, 231, 71, 4, 111, 42, 2, 1, 231, 71, 4, 111, 42, 6, 1, + 231, 71, 4, 85, 128, 42, 2, 1, 231, 71, 4, 85, 128, 42, 6, 1, 192, 63, 4, + 237, 59, 42, 2, 1, 192, 63, 4, 237, 59, 42, 6, 1, 192, 86, 4, 237, 59, + 42, 2, 1, 192, 86, 4, 237, 59, 42, 6, 1, 222, 174, 4, 237, 59, 42, 2, 1, + 222, 174, 4, 237, 59, 42, 6, 1, 222, 174, 4, 84, 111, 42, 2, 1, 222, 174, + 4, 84, 111, 42, 6, 1, 222, 174, 4, 111, 42, 2, 1, 222, 174, 4, 111, 42, + 6, 1, 248, 176, 160, 42, 2, 1, 248, 176, 160, 42, 6, 1, 234, 89, 4, 237, + 59, 42, 2, 1, 234, 89, 4, 237, 59, 42, 6, 34, 234, 89, 231, 70, 42, 2, + 34, 234, 89, 231, 70, 42, 6, 1, 210, 182, 4, 85, 128, 42, 2, 1, 210, 182, + 4, 85, 128, 42, 6, 1, 251, 150, 144, 42, 2, 1, 251, 150, 144, 42, 6, 1, + 234, 10, 4, 237, 59, 42, 2, 1, 234, 10, 4, 237, 59, 42, 6, 1, 200, 80, 4, + 237, 59, 42, 2, 1, 200, 80, 4, 237, 59, 42, 6, 1, 201, 230, 68, 42, 2, 1, + 201, 230, 68, 42, 6, 1, 201, 230, 124, 4, 111, 42, 2, 1, 201, 230, 124, + 4, 111, 42, 6, 1, 230, 113, 4, 237, 59, 42, 2, 1, 230, 113, 4, 237, 59, + 42, 6, 34, 200, 80, 198, 112, 42, 2, 34, 200, 80, 198, 112, 42, 6, 1, + 242, 246, 4, 237, 59, 42, 2, 1, 242, 246, 4, 237, 59, 42, 6, 1, 242, 246, + 4, 84, 111, 42, 2, 1, 242, 246, 4, 84, 111, 42, 6, 1, 203, 237, 42, 2, 1, + 203, 237, 42, 6, 1, 251, 150, 242, 245, 42, 2, 1, 251, 150, 242, 245, 42, + 6, 1, 251, 150, 242, 246, 4, 237, 59, 42, 2, 1, 251, 150, 242, 246, 4, + 237, 59, 42, 1, 211, 37, 42, 6, 1, 192, 63, 4, 247, 150, 42, 2, 1, 192, + 63, 4, 247, 150, 42, 6, 1, 222, 174, 4, 128, 42, 2, 1, 222, 174, 4, 128, + 42, 6, 1, 234, 125, 4, 200, 147, 42, 2, 1, 234, 125, 4, 200, 147, 42, 6, + 1, 234, 89, 4, 128, 42, 2, 1, 234, 89, 4, 128, 42, 6, 1, 234, 89, 4, 200, + 147, 42, 2, 1, 234, 89, 4, 200, 147, 42, 6, 1, 221, 243, 242, 245, 42, 2, + 1, 221, 243, 242, 245, 42, 6, 1, 234, 100, 4, 200, 147, 42, 2, 1, 234, + 100, 4, 200, 147, 42, 2, 1, 211, 37, 42, 6, 1, 41, 4, 247, 150, 42, 2, 1, + 41, 4, 247, 150, 42, 6, 1, 41, 4, 237, 14, 42, 2, 1, 41, 4, 237, 14, 42, + 6, 34, 41, 223, 251, 42, 2, 34, 41, 223, 251, 42, 6, 1, 223, 252, 4, 247, + 150, 42, 2, 1, 223, 252, 4, 247, 150, 42, 6, 1, 205, 240, 42, 2, 1, 205, + 240, 42, 6, 1, 205, 241, 4, 237, 14, 42, 2, 1, 205, 241, 4, 237, 14, 42, + 6, 1, 192, 63, 4, 237, 14, 42, 2, 1, 192, 63, 4, 237, 14, 42, 6, 1, 192, + 86, 4, 237, 14, 42, 2, 1, 192, 86, 4, 237, 14, 42, 6, 1, 251, 150, 235, + 14, 42, 2, 1, 251, 150, 235, 14, 42, 6, 1, 228, 97, 4, 217, 214, 42, 2, + 1, 228, 97, 4, 217, 214, 42, 6, 1, 228, 97, 4, 237, 14, 42, 2, 1, 228, + 97, 4, 237, 14, 42, 6, 1, 185, 4, 237, 14, 42, 2, 1, 185, 4, 237, 14, 42, + 6, 1, 248, 188, 74, 42, 2, 1, 248, 188, 74, 42, 6, 1, 248, 188, 185, 4, + 237, 14, 42, 2, 1, 248, 188, 185, 4, 237, 14, 42, 6, 1, 234, 253, 4, 237, + 14, 42, 2, 1, 234, 253, 4, 237, 14, 42, 6, 1, 124, 4, 217, 214, 42, 2, 1, + 124, 4, 217, 214, 42, 6, 1, 124, 4, 237, 14, 42, 2, 1, 124, 4, 237, 14, + 42, 6, 1, 124, 4, 55, 251, 129, 42, 2, 1, 124, 4, 55, 251, 129, 42, 6, 1, + 242, 246, 4, 237, 14, 42, 2, 1, 242, 246, 4, 237, 14, 42, 6, 1, 231, 71, + 4, 237, 59, 42, 2, 1, 231, 71, 4, 237, 59, 42, 6, 1, 193, 48, 4, 237, 14, + 42, 2, 1, 193, 48, 4, 237, 14, 42, 6, 1, 231, 71, 4, 201, 208, 26, 128, + 42, 2, 1, 231, 71, 4, 201, 208, 26, 128, 42, 6, 1, 230, 113, 4, 128, 42, + 2, 1, 230, 113, 4, 128, 42, 6, 1, 230, 113, 4, 111, 42, 2, 1, 230, 113, + 4, 111, 42, 6, 1, 221, 92, 237, 116, 42, 2, 1, 221, 92, 237, 116, 42, 6, + 1, 221, 92, 236, 164, 42, 2, 1, 221, 92, 236, 164, 42, 6, 1, 221, 92, + 192, 12, 42, 2, 1, 221, 92, 192, 12, 42, 6, 1, 221, 92, 235, 6, 42, 2, 1, + 221, 92, 235, 6, 42, 6, 1, 221, 92, 219, 140, 42, 2, 1, 221, 92, 219, + 140, 42, 6, 1, 221, 92, 213, 249, 42, 2, 1, 221, 92, 213, 249, 42, 6, 1, + 221, 92, 203, 20, 42, 2, 1, 221, 92, 203, 20, 42, 6, 1, 221, 92, 199, 54, + 42, 2, 1, 221, 92, 199, 54, 42, 6, 1, 207, 168, 192, 85, 42, 2, 1, 207, + 168, 192, 85, 42, 6, 1, 234, 125, 4, 128, 42, 2, 1, 234, 125, 4, 128, 42, + 6, 1, 219, 222, 42, 2, 1, 219, 222, 42, 6, 1, 207, 156, 42, 2, 1, 207, + 156, 42, 6, 1, 193, 118, 42, 2, 1, 193, 118, 42, 6, 1, 208, 239, 42, 2, + 1, 208, 239, 42, 6, 1, 194, 111, 42, 2, 1, 194, 111, 42, 6, 1, 251, 22, + 160, 42, 2, 1, 251, 22, 160, 42, 6, 1, 234, 125, 4, 85, 128, 42, 2, 1, + 234, 125, 4, 85, 128, 42, 6, 1, 234, 89, 4, 85, 128, 42, 2, 1, 234, 89, + 4, 85, 128, 42, 6, 1, 210, 182, 4, 237, 59, 42, 2, 1, 210, 182, 4, 237, + 59, 42, 6, 1, 203, 238, 4, 237, 59, 42, 2, 1, 203, 238, 4, 237, 59, 42, + 6, 1, 234, 89, 4, 46, 128, 42, 2, 1, 234, 89, 4, 46, 128, 42, 6, 1, 234, + 254, 42, 2, 1, 234, 254, 42, 6, 1, 237, 165, 42, 2, 1, 237, 165, 42, 6, + 1, 234, 125, 4, 237, 59, 42, 2, 1, 234, 125, 4, 237, 59, 250, 91, 6, 1, + 249, 233, 250, 91, 6, 1, 248, 80, 250, 91, 6, 1, 231, 33, 250, 91, 6, 1, + 238, 0, 250, 91, 6, 1, 234, 177, 250, 91, 6, 1, 192, 112, 250, 91, 6, 1, + 234, 157, 250, 91, 6, 1, 233, 242, 250, 91, 6, 1, 155, 250, 91, 6, 1, + 192, 62, 250, 91, 6, 1, 223, 159, 250, 91, 6, 1, 219, 144, 250, 91, 6, 1, + 193, 201, 250, 91, 6, 1, 247, 19, 250, 91, 6, 1, 222, 30, 250, 91, 6, 1, + 229, 43, 250, 91, 6, 1, 223, 62, 250, 91, 6, 1, 231, 81, 250, 91, 6, 1, + 242, 235, 250, 91, 6, 1, 217, 5, 250, 91, 6, 1, 193, 22, 250, 91, 6, 1, + 213, 96, 250, 91, 6, 1, 204, 64, 250, 91, 6, 1, 195, 252, 250, 91, 6, 1, + 246, 117, 250, 91, 6, 1, 210, 161, 250, 91, 6, 1, 223, 23, 250, 91, 6, 1, + 167, 250, 91, 6, 1, 205, 194, 250, 91, 6, 1, 196, 44, 250, 91, 6, 1, 199, + 57, 250, 91, 6, 1, 207, 221, 250, 91, 6, 1, 242, 63, 250, 91, 6, 1, 193, + 6, 250, 91, 6, 1, 209, 238, 250, 91, 6, 1, 222, 41, 250, 91, 6, 1, 211, + 241, 250, 91, 6, 1, 233, 34, 250, 91, 73, 1, 46, 138, 207, 81, 250, 91, + 250, 147, 250, 91, 234, 92, 77, 250, 91, 233, 204, 77, 250, 91, 242, 38, + 250, 91, 208, 159, 77, 250, 91, 251, 151, 77, 250, 91, 2, 1, 163, 249, + 233, 250, 91, 2, 1, 249, 233, 250, 91, 2, 1, 248, 80, 250, 91, 2, 1, 231, + 33, 250, 91, 2, 1, 238, 0, 250, 91, 2, 1, 234, 177, 250, 91, 2, 1, 192, + 112, 250, 91, 2, 1, 234, 157, 250, 91, 2, 1, 233, 242, 250, 91, 2, 1, + 155, 250, 91, 2, 1, 192, 62, 250, 91, 2, 1, 223, 159, 250, 91, 2, 1, 219, + 144, 250, 91, 2, 1, 193, 201, 250, 91, 2, 1, 247, 19, 250, 91, 2, 1, 222, + 30, 250, 91, 2, 1, 229, 43, 250, 91, 2, 1, 223, 62, 250, 91, 2, 1, 231, + 81, 250, 91, 2, 1, 242, 235, 250, 91, 2, 1, 217, 5, 250, 91, 2, 1, 193, + 22, 250, 91, 2, 1, 213, 96, 250, 91, 2, 1, 204, 64, 250, 91, 2, 1, 195, + 252, 250, 91, 2, 1, 246, 117, 250, 91, 2, 1, 210, 161, 250, 91, 2, 1, + 223, 23, 250, 91, 2, 1, 167, 250, 91, 2, 1, 205, 194, 250, 91, 2, 1, 196, + 44, 250, 91, 2, 1, 199, 57, 250, 91, 2, 1, 207, 221, 250, 91, 2, 1, 242, + 63, 250, 91, 2, 1, 193, 6, 250, 91, 2, 1, 209, 238, 250, 91, 2, 1, 222, + 41, 250, 91, 2, 1, 211, 241, 250, 91, 2, 1, 233, 34, 250, 91, 2, 34, 234, + 178, 193, 6, 250, 91, 2, 1, 11, 4, 111, 250, 91, 232, 71, 201, 238, 250, + 91, 228, 111, 207, 100, 250, 91, 233, 238, 57, 220, 27, 250, 91, 233, + 238, 57, 250, 91, 235, 83, 57, 129, 251, 144, 233, 233, 129, 251, 144, + 205, 195, 129, 251, 144, 204, 40, 129, 251, 144, 192, 97, 208, 222, 129, + 251, 144, 192, 97, 231, 223, 129, 251, 144, 199, 72, 129, 251, 144, 207, + 165, 129, 251, 144, 192, 95, 129, 251, 144, 210, 214, 129, 251, 144, 193, + 37, 129, 251, 144, 199, 247, 129, 251, 144, 231, 132, 129, 251, 144, 231, + 133, 215, 198, 129, 251, 144, 231, 130, 129, 251, 144, 208, 223, 210, + 246, 129, 251, 144, 200, 38, 231, 151, 129, 251, 144, 210, 187, 129, 251, + 144, 250, 17, 230, 93, 129, 251, 144, 215, 208, 129, 251, 144, 217, 185, + 129, 251, 144, 216, 250, 129, 251, 144, 216, 251, 222, 42, 129, 251, 144, + 237, 192, 129, 251, 144, 208, 234, 129, 251, 144, 200, 38, 208, 217, 129, + 251, 144, 193, 50, 248, 81, 192, 236, 129, 251, 144, 211, 223, 129, 251, + 144, 223, 210, 129, 251, 144, 237, 93, 129, 251, 144, 192, 19, 129, 122, + 217, 105, 242, 130, 129, 209, 192, 203, 240, 129, 209, 192, 230, 17, 205, + 195, 129, 209, 192, 230, 17, 210, 205, 129, 209, 192, 230, 17, 208, 227, + 129, 209, 192, 229, 139, 129, 209, 192, 198, 109, 129, 209, 192, 205, + 195, 129, 209, 192, 210, 205, 129, 209, 192, 208, 227, 129, 209, 192, + 229, 27, 129, 209, 192, 229, 28, 230, 19, 39, 196, 127, 129, 209, 192, + 208, 163, 129, 209, 192, 237, 241, 211, 164, 217, 140, 129, 209, 192, + 216, 239, 129, 209, 38, 217, 137, 129, 209, 192, 208, 51, 129, 209, 38, + 210, 216, 129, 209, 192, 203, 225, 236, 114, 129, 209, 192, 203, 79, 236, + 114, 129, 209, 38, 202, 199, 210, 207, 129, 122, 113, 236, 114, 129, 122, + 106, 236, 114, 129, 209, 38, 212, 231, 230, 92, 129, 209, 192, 208, 228, + 208, 222, 129, 1, 251, 26, 129, 1, 248, 65, 129, 1, 231, 31, 129, 1, 237, + 221, 129, 1, 229, 255, 129, 1, 196, 127, 129, 1, 192, 89, 129, 1, 229, + 196, 129, 1, 200, 8, 129, 1, 192, 239, 129, 1, 52, 222, 139, 129, 1, 222, + 139, 129, 1, 220, 86, 129, 1, 52, 217, 12, 129, 1, 217, 12, 129, 1, 52, + 212, 230, 129, 1, 212, 230, 129, 1, 206, 46, 129, 1, 249, 231, 129, 1, + 52, 210, 181, 129, 1, 210, 181, 129, 1, 52, 198, 113, 129, 1, 198, 113, + 129, 1, 208, 186, 129, 1, 207, 188, 129, 1, 203, 224, 129, 1, 200, 96, + 129, 192, 240, 198, 185, 129, 34, 193, 20, 55, 196, 127, 129, 34, 193, + 20, 196, 128, 192, 239, 129, 34, 193, 20, 55, 192, 239, 129, 209, 38, + 231, 132, 129, 209, 38, 231, 130, 9, 31, 57, 9, 3, 206, 39, 9, 232, 147, + 217, 122, 9, 3, 206, 81, 9, 3, 206, 42, 9, 31, 122, 58, 250, 126, 238, + 158, 207, 22, 250, 126, 232, 112, 207, 22, 9, 208, 15, 250, 126, 210, + 134, 216, 126, 57, 250, 126, 210, 134, 200, 31, 199, 165, 57, 251, 85, + 57, 9, 242, 38, 9, 237, 179, 204, 165, 9, 209, 194, 196, 107, 57, 9, 3, + 216, 104, 9, 3, 206, 57, 251, 29, 194, 135, 9, 3, 251, 29, 250, 42, 9, 3, + 208, 49, 251, 28, 9, 3, 208, 57, 251, 6, 250, 199, 9, 3, 200, 138, 9, 2, + 139, 200, 151, 9, 2, 139, 34, 157, 4, 220, 95, 4, 193, 64, 9, 2, 139, + 192, 103, 9, 2, 233, 58, 9, 2, 237, 215, 9, 2, 222, 86, 9, 204, 180, 9, + 1, 77, 9, 198, 170, 78, 209, 38, 77, 9, 208, 159, 77, 9, 1, 222, 90, 193, + 64, 9, 1, 230, 66, 9, 1, 157, 4, 217, 210, 58, 9, 1, 157, 4, 230, 67, 58, + 9, 1, 194, 120, 4, 230, 67, 58, 9, 1, 157, 4, 230, 67, 63, 9, 1, 97, 4, + 230, 67, 58, 9, 1, 251, 26, 9, 1, 248, 96, 9, 1, 200, 50, 217, 133, 9, 1, + 200, 49, 9, 1, 199, 220, 9, 1, 223, 37, 9, 1, 230, 89, 9, 1, 221, 245, 9, + 1, 237, 227, 9, 1, 199, 232, 9, 1, 207, 221, 9, 1, 192, 103, 9, 1, 205, + 201, 9, 1, 204, 8, 9, 1, 206, 86, 9, 1, 237, 250, 9, 1, 200, 151, 9, 1, + 192, 106, 9, 1, 251, 57, 9, 1, 231, 79, 9, 1, 222, 40, 4, 103, 236, 112, + 58, 9, 1, 222, 40, 4, 112, 236, 112, 63, 9, 1, 233, 62, 97, 4, 223, 121, + 196, 236, 9, 1, 233, 62, 97, 4, 103, 236, 112, 58, 9, 1, 233, 62, 97, 4, + 112, 236, 112, 58, 9, 200, 102, 9, 1, 233, 34, 9, 1, 208, 232, 9, 1, 222, + 139, 9, 1, 220, 94, 9, 1, 217, 26, 9, 1, 213, 123, 9, 1, 229, 220, 9, 1, + 194, 119, 9, 1, 157, 217, 168, 9, 1, 193, 64, 9, 233, 56, 9, 237, 213, 9, + 222, 84, 9, 233, 58, 9, 237, 215, 9, 222, 86, 9, 204, 54, 9, 201, 131, 9, + 217, 208, 58, 9, 230, 67, 58, 9, 230, 67, 63, 9, 201, 155, 251, 26, 9, + 223, 121, 237, 215, 9, 122, 213, 124, 231, 50, 9, 191, 238, 9, 18, 3, 2, + 196, 237, 58, 9, 18, 3, 223, 121, 2, 196, 237, 58, 9, 18, 3, 78, 63, 9, + 207, 168, 237, 215, 9, 233, 59, 4, 103, 236, 111, 9, 194, 121, 230, 67, + 63, 250, 126, 17, 192, 76, 250, 126, 17, 101, 250, 126, 17, 104, 250, + 126, 17, 133, 250, 126, 17, 134, 250, 126, 17, 151, 250, 126, 17, 170, + 250, 126, 17, 179, 250, 126, 17, 174, 250, 126, 17, 182, 9, 210, 133, 57, + 9, 237, 108, 204, 165, 9, 199, 164, 204, 165, 9, 232, 214, 209, 190, 202, + 19, 9, 1, 236, 113, 248, 96, 9, 1, 236, 113, 208, 232, 9, 1, 201, 107, + 251, 26, 9, 1, 157, 194, 136, 9, 1, 157, 4, 194, 121, 230, 67, 58, 9, 1, + 157, 4, 194, 121, 230, 67, 63, 9, 1, 139, 230, 66, 9, 1, 139, 230, 67, + 251, 26, 9, 1, 139, 230, 67, 194, 119, 9, 1, 124, 4, 230, 67, 58, 9, 1, + 139, 230, 67, 193, 64, 9, 1, 198, 75, 9, 1, 198, 73, 9, 1, 248, 106, 9, + 1, 200, 50, 4, 207, 81, 9, 1, 200, 50, 4, 112, 236, 112, 95, 235, 91, 9, + 1, 210, 161, 9, 1, 200, 47, 9, 1, 248, 94, 9, 1, 176, 4, 230, 67, 58, 9, + 1, 176, 4, 103, 236, 112, 84, 58, 9, 1, 212, 187, 9, 1, 235, 23, 9, 1, + 176, 4, 112, 236, 112, 58, 9, 1, 200, 83, 9, 1, 200, 81, 9, 1, 237, 156, + 9, 1, 237, 228, 4, 207, 81, 9, 1, 237, 228, 4, 78, 63, 9, 1, 237, 228, 4, + 78, 248, 84, 26, 2, 200, 151, 9, 1, 237, 234, 9, 1, 237, 158, 9, 1, 235, + 52, 9, 1, 237, 228, 4, 112, 236, 112, 95, 235, 91, 9, 1, 237, 228, 4, + 232, 119, 236, 112, 58, 9, 1, 206, 251, 9, 1, 207, 222, 4, 2, 196, 236, + 9, 1, 207, 222, 4, 207, 81, 9, 1, 207, 222, 4, 78, 63, 9, 1, 207, 222, 4, + 2, 196, 237, 63, 9, 1, 207, 222, 4, 78, 248, 84, 26, 78, 58, 9, 1, 207, + 222, 4, 103, 236, 112, 58, 9, 1, 223, 34, 9, 1, 207, 222, 4, 232, 119, + 236, 112, 58, 9, 1, 205, 202, 4, 78, 248, 84, 26, 78, 58, 9, 1, 205, 202, + 4, 112, 236, 112, 63, 9, 1, 205, 202, 4, 112, 236, 112, 248, 84, 26, 112, + 236, 112, 58, 9, 1, 206, 87, 4, 103, 236, 112, 63, 9, 1, 206, 87, 4, 112, + 236, 112, 58, 9, 1, 200, 152, 4, 112, 236, 112, 58, 9, 1, 251, 58, 4, + 112, 236, 112, 58, 9, 1, 236, 113, 233, 34, 9, 1, 233, 35, 4, 78, 216, 2, + 63, 9, 1, 233, 35, 4, 78, 63, 9, 1, 196, 116, 9, 1, 233, 35, 4, 112, 236, + 112, 63, 9, 1, 210, 159, 9, 1, 208, 233, 4, 78, 58, 9, 1, 208, 233, 4, + 112, 236, 112, 58, 9, 1, 222, 39, 9, 1, 201, 75, 222, 139, 9, 1, 222, + 140, 4, 207, 81, 9, 1, 222, 140, 4, 78, 58, 9, 1, 214, 167, 9, 1, 222, + 140, 4, 112, 236, 112, 63, 9, 1, 231, 220, 9, 1, 231, 221, 4, 207, 81, 9, + 1, 214, 88, 9, 1, 231, 221, 4, 103, 236, 112, 63, 9, 1, 230, 173, 9, 1, + 231, 221, 4, 112, 236, 112, 58, 9, 1, 220, 95, 4, 2, 196, 236, 9, 1, 220, + 95, 4, 78, 58, 9, 1, 220, 95, 4, 112, 236, 112, 58, 9, 1, 220, 95, 4, + 112, 236, 112, 63, 9, 1, 213, 124, 4, 78, 63, 9, 1, 213, 124, 231, 50, 9, + 1, 207, 58, 9, 1, 213, 124, 4, 207, 81, 9, 1, 213, 124, 4, 112, 236, 112, + 58, 9, 1, 229, 221, 236, 142, 9, 1, 200, 84, 4, 78, 58, 9, 1, 229, 221, + 4, 97, 58, 9, 1, 229, 221, 230, 251, 9, 1, 229, 221, 230, 252, 4, 230, + 67, 58, 9, 1, 200, 50, 217, 134, 230, 251, 9, 1, 194, 120, 4, 207, 81, 9, + 1, 221, 170, 212, 0, 9, 1, 212, 0, 9, 1, 68, 9, 1, 192, 214, 9, 1, 221, + 170, 192, 214, 9, 1, 194, 120, 4, 103, 236, 112, 58, 9, 1, 196, 123, 9, + 1, 233, 62, 193, 64, 9, 1, 97, 4, 200, 147, 9, 1, 97, 4, 2, 196, 236, 9, + 1, 194, 120, 4, 78, 58, 9, 1, 71, 9, 1, 97, 4, 112, 236, 112, 63, 9, 1, + 97, 248, 186, 9, 1, 97, 248, 187, 4, 230, 67, 58, 9, 232, 71, 201, 238, + 9, 1, 251, 108, 9, 2, 139, 34, 206, 87, 4, 220, 95, 4, 157, 217, 168, 9, + 2, 139, 34, 208, 233, 4, 220, 95, 4, 157, 217, 168, 9, 2, 139, 91, 88, + 20, 9, 2, 139, 220, 95, 251, 26, 9, 2, 139, 223, 37, 9, 2, 139, 112, 236, + 111, 9, 2, 139, 205, 201, 9, 234, 80, 80, 249, 235, 9, 202, 15, 80, 206, + 210, 234, 125, 229, 134, 9, 2, 139, 207, 7, 192, 76, 9, 2, 139, 197, 37, + 207, 241, 192, 76, 9, 2, 139, 236, 113, 229, 246, 80, 221, 245, 9, 2, + 139, 91, 72, 20, 9, 2, 132, 205, 201, 9, 2, 139, 217, 209, 9, 2, 194, + 119, 9, 2, 193, 64, 9, 2, 139, 193, 64, 9, 2, 139, 213, 123, 9, 209, 232, + 80, 206, 71, 9, 234, 90, 246, 138, 132, 201, 238, 9, 234, 90, 246, 138, + 139, 201, 238, 9, 207, 7, 139, 201, 239, 4, 232, 248, 246, 137, 9, 2, + 132, 217, 26, 9, 1, 237, 228, 4, 223, 121, 196, 236, 9, 1, 207, 222, 4, + 223, 121, 196, 236, 233, 193, 250, 126, 17, 192, 76, 233, 193, 250, 126, + 17, 101, 233, 193, 250, 126, 17, 104, 233, 193, 250, 126, 17, 133, 233, + 193, 250, 126, 17, 134, 233, 193, 250, 126, 17, 151, 233, 193, 250, 126, + 17, 170, 233, 193, 250, 126, 17, 179, 233, 193, 250, 126, 17, 174, 233, + 193, 250, 126, 17, 182, 9, 1, 204, 9, 4, 78, 63, 9, 1, 237, 251, 4, 78, + 63, 9, 1, 231, 80, 4, 78, 63, 9, 3, 203, 77, 250, 229, 9, 3, 203, 77, + 209, 151, 217, 5, 9, 1, 229, 221, 4, 223, 121, 196, 236, 200, 248, 234, + 80, 80, 210, 243, 200, 248, 201, 102, 232, 71, 201, 238, 200, 248, 201, + 157, 232, 71, 201, 238, 200, 248, 201, 102, 242, 47, 200, 248, 201, 157, + 242, 47, 200, 248, 229, 5, 242, 47, 200, 248, 242, 48, 203, 16, 220, 28, + 200, 248, 242, 48, 203, 16, 207, 101, 200, 248, 201, 102, 242, 48, 203, + 16, 220, 28, 200, 248, 201, 157, 242, 48, 203, 16, 207, 101, 200, 248, + 238, 245, 200, 248, 230, 24, 212, 20, 200, 248, 230, 24, 216, 237, 200, + 248, 230, 24, 250, 39, 200, 248, 251, 151, 77, 200, 248, 1, 251, 31, 200, + 248, 1, 201, 107, 251, 31, 200, 248, 1, 248, 62, 200, 248, 1, 231, 210, + 200, 248, 1, 231, 211, 231, 187, 200, 248, 1, 237, 224, 200, 248, 1, 236, + 113, 237, 225, 207, 74, 200, 248, 1, 229, 255, 200, 248, 1, 194, 119, + 200, 248, 1, 192, 103, 200, 248, 1, 229, 194, 200, 248, 1, 200, 4, 200, + 248, 1, 200, 5, 231, 187, 200, 248, 1, 192, 197, 200, 248, 1, 192, 198, + 229, 255, 200, 248, 1, 222, 109, 200, 248, 1, 220, 93, 200, 248, 1, 216, + 122, 200, 248, 1, 212, 230, 200, 248, 1, 204, 173, 200, 248, 1, 52, 204, + 173, 200, 248, 1, 71, 200, 248, 1, 210, 181, 200, 248, 1, 207, 168, 210, + 181, 200, 248, 1, 206, 83, 200, 248, 1, 208, 226, 200, 248, 1, 207, 74, + 200, 248, 1, 203, 224, 200, 248, 1, 200, 93, 200, 248, 1, 210, 118, 248, + 47, 200, 248, 1, 210, 118, 231, 77, 200, 248, 1, 210, 118, 237, 35, 200, + 248, 209, 52, 58, 200, 248, 209, 52, 63, 200, 248, 209, 52, 235, 110, + 200, 248, 192, 1, 58, 200, 248, 192, 1, 63, 200, 248, 192, 1, 235, 110, + 200, 248, 208, 10, 58, 200, 248, 208, 10, 63, 200, 248, 235, 111, 192, 9, + 229, 4, 200, 248, 235, 111, 192, 9, 250, 200, 200, 248, 230, 4, 58, 200, + 248, 230, 4, 63, 200, 248, 230, 3, 235, 110, 200, 248, 234, 3, 58, 200, + 248, 234, 3, 63, 200, 248, 206, 174, 200, 248, 233, 28, 236, 114, 200, + 248, 208, 136, 200, 248, 206, 204, 200, 248, 103, 84, 236, 112, 58, 200, + 248, 103, 84, 236, 112, 63, 200, 248, 112, 236, 112, 58, 200, 248, 112, + 236, 112, 63, 200, 248, 212, 18, 219, 176, 58, 200, 248, 212, 18, 219, + 176, 63, 200, 248, 215, 184, 200, 248, 248, 185, 200, 248, 1, 202, 194, + 192, 69, 200, 248, 1, 202, 194, 221, 238, 200, 248, 1, 202, 194, 233, 47, + 9, 1, 248, 97, 4, 112, 236, 112, 228, 210, 63, 9, 1, 248, 97, 4, 78, 248, + 84, 26, 112, 236, 112, 58, 9, 1, 248, 97, 4, 112, 236, 112, 209, 188, + 197, 30, 63, 9, 1, 248, 97, 4, 112, 236, 112, 209, 188, 197, 30, 248, 84, + 26, 103, 236, 112, 58, 9, 1, 248, 97, 4, 103, 236, 112, 248, 84, 26, 78, + 58, 9, 1, 248, 97, 4, 223, 121, 2, 196, 237, 63, 9, 1, 248, 97, 4, 2, + 196, 236, 9, 1, 176, 4, 103, 236, 112, 58, 9, 1, 176, 4, 112, 236, 112, + 209, 188, 197, 30, 63, 9, 1, 237, 228, 4, 103, 236, 112, 196, 55, 248, + 84, 26, 2, 200, 151, 9, 1, 237, 228, 4, 223, 121, 2, 196, 237, 63, 9, 1, + 207, 222, 4, 111, 9, 1, 205, 202, 4, 232, 119, 236, 112, 58, 9, 1, 251, + 58, 4, 103, 236, 112, 58, 9, 1, 251, 58, 4, 112, 236, 112, 209, 188, 235, + 92, 58, 9, 1, 251, 58, 4, 103, 236, 112, 196, 55, 58, 9, 1, 233, 35, 4, + 103, 236, 112, 63, 9, 1, 233, 35, 4, 112, 236, 112, 209, 188, 197, 30, + 63, 9, 1, 222, 40, 4, 78, 58, 9, 1, 222, 40, 4, 112, 236, 112, 58, 9, 1, + 222, 40, 4, 112, 236, 112, 209, 188, 197, 30, 63, 9, 1, 91, 4, 78, 58, 9, + 1, 91, 4, 78, 63, 9, 1, 213, 124, 4, 103, 236, 112, 63, 9, 1, 213, 124, + 4, 2, 200, 151, 9, 1, 213, 124, 4, 2, 196, 236, 9, 1, 220, 95, 4, 161, 9, + 1, 207, 222, 4, 103, 236, 112, 196, 55, 58, 9, 1, 207, 222, 4, 230, 67, + 58, 9, 1, 205, 202, 4, 103, 236, 112, 196, 55, 58, 9, 1, 176, 4, 2, 9, 1, + 200, 152, 63, 9, 1, 176, 4, 2, 9, 1, 200, 152, 26, 103, 236, 111, 9, 1, + 205, 202, 4, 2, 9, 1, 200, 152, 26, 103, 236, 111, 9, 1, 207, 222, 4, 2, + 9, 1, 200, 152, 26, 103, 236, 111, 9, 1, 176, 4, 2, 9, 1, 200, 152, 58, + 9, 1, 157, 4, 233, 193, 250, 126, 17, 103, 58, 9, 1, 157, 4, 233, 193, + 250, 126, 17, 112, 58, 9, 1, 233, 62, 97, 4, 233, 193, 250, 126, 17, 103, + 58, 9, 1, 233, 62, 97, 4, 233, 193, 250, 126, 17, 112, 58, 9, 1, 233, 62, + 97, 4, 233, 193, 250, 126, 17, 232, 119, 63, 9, 1, 194, 120, 4, 233, 193, + 250, 126, 17, 103, 58, 9, 1, 194, 120, 4, 233, 193, 250, 126, 17, 112, + 58, 9, 1, 97, 248, 187, 4, 233, 193, 250, 126, 17, 103, 58, 9, 1, 97, + 248, 187, 4, 233, 193, 250, 126, 17, 112, 58, 9, 1, 176, 4, 233, 193, + 250, 126, 17, 232, 119, 63, 9, 1, 205, 202, 4, 233, 193, 250, 126, 17, + 232, 119, 58, 9, 1, 205, 202, 4, 223, 121, 196, 236, 9, 1, 222, 140, 4, + 103, 236, 112, 58, 199, 237, 1, 230, 99, 199, 237, 1, 204, 18, 199, 237, + 1, 213, 122, 199, 237, 1, 208, 68, 199, 237, 1, 249, 1, 199, 237, 1, 219, + 219, 199, 237, 1, 222, 154, 199, 237, 1, 251, 13, 199, 237, 1, 196, 155, + 199, 237, 1, 217, 25, 199, 237, 1, 233, 95, 199, 237, 1, 237, 38, 199, + 237, 1, 199, 239, 199, 237, 1, 220, 181, 199, 237, 1, 231, 229, 199, 237, + 1, 231, 1, 199, 237, 1, 205, 200, 199, 237, 1, 237, 177, 199, 237, 1, + 192, 92, 199, 237, 1, 200, 95, 199, 237, 1, 193, 129, 199, 237, 1, 210, + 195, 199, 237, 1, 223, 46, 199, 237, 1, 242, 248, 199, 237, 1, 198, 82, + 199, 237, 1, 229, 186, 199, 237, 1, 221, 249, 199, 237, 1, 199, 238, 199, + 237, 1, 192, 110, 199, 237, 1, 204, 7, 199, 237, 1, 206, 90, 199, 237, 1, + 237, 254, 199, 237, 1, 155, 199, 237, 1, 192, 8, 199, 237, 1, 251, 54, + 199, 237, 1, 231, 78, 199, 237, 1, 208, 236, 199, 237, 1, 194, 162, 199, + 237, 251, 153, 199, 237, 251, 254, 199, 237, 228, 52, 199, 237, 234, 170, + 199, 237, 197, 112, 199, 237, 211, 193, 199, 237, 234, 180, 199, 237, + 233, 183, 199, 237, 212, 17, 199, 237, 212, 25, 199, 237, 201, 131, 199, + 237, 1, 215, 84, 213, 206, 17, 192, 76, 213, 206, 17, 101, 213, 206, 17, + 104, 213, 206, 17, 133, 213, 206, 17, 134, 213, 206, 17, 151, 213, 206, + 17, 170, 213, 206, 17, 179, 213, 206, 17, 174, 213, 206, 17, 182, 213, + 206, 1, 64, 213, 206, 1, 234, 171, 213, 206, 1, 70, 213, 206, 1, 71, 213, + 206, 1, 68, 213, 206, 1, 211, 194, 213, 206, 1, 74, 213, 206, 1, 237, + 242, 213, 206, 1, 215, 151, 213, 206, 1, 249, 3, 213, 206, 1, 166, 213, + 206, 1, 189, 213, 206, 1, 223, 62, 213, 206, 1, 246, 117, 213, 206, 1, + 238, 0, 213, 206, 1, 167, 213, 206, 1, 207, 3, 213, 206, 1, 188, 213, + 206, 1, 231, 175, 213, 206, 1, 233, 97, 213, 206, 1, 160, 213, 206, 1, + 177, 213, 206, 1, 215, 97, 194, 25, 213, 206, 1, 172, 213, 206, 1, 212, + 201, 213, 206, 1, 181, 213, 206, 1, 144, 213, 206, 1, 194, 169, 213, 206, + 1, 168, 213, 206, 1, 212, 202, 194, 25, 213, 206, 1, 222, 225, 223, 62, + 213, 206, 1, 222, 225, 246, 117, 213, 206, 1, 222, 225, 167, 213, 206, + 38, 203, 195, 139, 199, 18, 213, 206, 38, 203, 195, 132, 199, 18, 213, + 206, 38, 203, 195, 207, 73, 199, 18, 213, 206, 38, 184, 237, 58, 199, 18, + 213, 206, 38, 184, 139, 199, 18, 213, 206, 38, 184, 132, 199, 18, 213, + 206, 38, 184, 207, 73, 199, 18, 213, 206, 38, 215, 48, 77, 213, 206, 38, + 55, 78, 58, 213, 206, 139, 158, 250, 147, 213, 206, 132, 158, 250, 147, + 213, 206, 16, 211, 195, 237, 72, 213, 206, 16, 231, 174, 213, 206, 242, + 38, 213, 206, 233, 204, 77, 213, 206, 220, 153, 213, 206, 237, 203, 213, + 206, 236, 116, 57, 213, 206, 200, 127, 57, 206, 49, 1, 251, 33, 206, 49, + 1, 248, 1, 206, 49, 1, 231, 209, 206, 49, 1, 237, 226, 206, 49, 1, 223, + 73, 206, 49, 1, 249, 1, 206, 49, 1, 192, 79, 206, 49, 1, 223, 82, 206, + 49, 1, 199, 63, 206, 49, 1, 192, 178, 206, 49, 1, 222, 155, 206, 49, 1, + 220, 177, 206, 49, 1, 216, 122, 206, 49, 1, 212, 230, 206, 49, 1, 203, + 75, 206, 49, 1, 223, 190, 206, 49, 1, 233, 11, 206, 49, 1, 198, 116, 206, + 49, 1, 208, 156, 206, 49, 1, 207, 74, 206, 49, 1, 204, 37, 206, 49, 1, + 200, 173, 206, 49, 122, 223, 190, 206, 49, 122, 223, 189, 206, 49, 122, + 212, 12, 206, 49, 122, 237, 240, 206, 49, 73, 1, 234, 37, 192, 178, 206, + 49, 122, 234, 37, 192, 178, 206, 49, 18, 3, 184, 71, 206, 49, 18, 3, 71, + 206, 49, 18, 3, 211, 108, 252, 33, 206, 49, 18, 3, 184, 252, 33, 206, 49, + 18, 3, 252, 33, 206, 49, 18, 3, 211, 108, 64, 206, 49, 18, 3, 184, 64, + 206, 49, 18, 3, 64, 206, 49, 73, 1, 203, 195, 64, 206, 49, 18, 3, 203, + 195, 64, 206, 49, 18, 3, 184, 68, 206, 49, 18, 3, 68, 206, 49, 73, 1, 70, + 206, 49, 18, 3, 184, 70, 206, 49, 18, 3, 70, 206, 49, 18, 3, 74, 206, 49, + 18, 3, 201, 131, 206, 49, 122, 214, 188, 206, 49, 209, 38, 214, 188, 206, + 49, 209, 38, 251, 82, 206, 49, 209, 38, 250, 213, 206, 49, 209, 38, 248, + 163, 206, 49, 209, 38, 250, 18, 206, 49, 209, 38, 203, 212, 206, 49, 251, + 151, 77, 206, 49, 209, 38, 217, 15, 208, 192, 206, 49, 209, 38, 192, 16, + 206, 49, 209, 38, 208, 192, 206, 49, 209, 38, 192, 109, 206, 49, 209, 38, + 198, 5, 206, 49, 209, 38, 250, 97, 206, 49, 209, 38, 202, 199, 217, 108, + 206, 49, 209, 38, 250, 194, 217, 156, 1, 230, 73, 217, 156, 1, 251, 238, + 217, 156, 1, 251, 80, 217, 156, 1, 251, 125, 217, 156, 1, 251, 72, 217, + 156, 1, 197, 1, 217, 156, 1, 249, 228, 217, 156, 1, 223, 82, 217, 156, 1, + 250, 15, 217, 156, 1, 251, 39, 217, 156, 1, 251, 44, 217, 156, 1, 251, + 35, 217, 156, 1, 250, 241, 217, 156, 1, 250, 224, 217, 156, 1, 250, 61, + 217, 156, 1, 223, 190, 217, 156, 1, 250, 163, 217, 156, 1, 250, 28, 217, + 156, 1, 250, 135, 217, 156, 1, 250, 131, 217, 156, 1, 250, 53, 217, 156, + 1, 250, 26, 217, 156, 1, 235, 36, 217, 156, 1, 222, 147, 217, 156, 1, + 251, 57, 217, 156, 251, 86, 77, 217, 156, 195, 250, 77, 217, 156, 231, + 146, 77, 217, 156, 209, 37, 200, 248, 1, 135, 214, 165, 200, 248, 1, 135, + 223, 62, 200, 248, 1, 135, 212, 201, 200, 248, 1, 135, 198, 83, 200, 248, + 1, 135, 213, 178, 200, 248, 1, 135, 213, 160, 200, 248, 1, 135, 248, 54, + 200, 248, 1, 135, 167, 200, 248, 1, 135, 219, 137, 200, 248, 1, 135, 219, + 126, 200, 248, 1, 135, 202, 92, 9, 1, 248, 97, 4, 2, 196, 237, 63, 9, 1, + 248, 97, 4, 230, 67, 58, 9, 1, 223, 38, 4, 103, 236, 112, 58, 9, 1, 200, + 152, 4, 103, 236, 112, 58, 9, 1, 233, 35, 4, 78, 248, 84, 26, 112, 236, + 112, 58, 9, 1, 208, 233, 4, 78, 63, 9, 1, 220, 95, 4, 55, 161, 9, 1, 91, + 4, 112, 236, 112, 58, 9, 1, 97, 4, 103, 236, 112, 248, 84, 26, 230, 67, + 58, 9, 1, 97, 4, 103, 236, 112, 248, 84, 26, 78, 58, 9, 1, 207, 222, 4, + 219, 69, 9, 1, 194, 120, 4, 78, 194, 40, 9, 1, 207, 36, 193, 64, 9, 1, + 132, 251, 26, 9, 1, 237, 228, 4, 112, 236, 112, 63, 9, 1, 206, 87, 4, + 112, 236, 112, 63, 9, 1, 231, 221, 4, 223, 121, 111, 9, 1, 201, 230, 194, + 119, 9, 1, 192, 104, 4, 223, 121, 196, 237, 58, 9, 1, 251, 58, 4, 112, + 236, 112, 63, 9, 1, 222, 140, 4, 78, 63, 9, 1, 248, 97, 4, 2, 91, 58, 9, + 1, 210, 162, 4, 2, 91, 58, 9, 1, 200, 50, 4, 2, 200, 50, 58, 9, 1, 207, + 222, 4, 2, 213, 124, 58, 9, 1, 97, 4, 103, 236, 112, 248, 84, 26, 2, 213, + 124, 58, 9, 1, 251, 83, 233, 34, 9, 1, 251, 83, 208, 232, 9, 1, 251, 83, + 213, 123, 9, 1, 210, 162, 4, 2, 196, 236, 9, 1, 200, 50, 4, 2, 196, 236, + 9, 1, 198, 76, 4, 2, 196, 236, 9, 1, 200, 84, 4, 2, 196, 236, 9, 1, 222, + 40, 4, 2, 196, 236, 9, 1, 231, 80, 4, 112, 236, 112, 58, 9, 1, 251, 83, + 208, 233, 4, 112, 236, 112, 58, 9, 1, 223, 38, 4, 112, 236, 112, 58, 9, + 1, 223, 38, 4, 112, 236, 112, 63, 9, 1, 220, 95, 4, 2, 9, 1, 200, 152, + 58, 9, 2, 132, 194, 119, 9, 2, 139, 194, 11, 250, 128, 9, 2, 139, 206, + 86, 9, 2, 139, 251, 57, 9, 2, 139, 208, 232, 9, 2, 139, 213, 124, 4, 222, + 86, 9, 2, 132, 213, 124, 4, 222, 86, 9, 2, 139, 194, 11, 250, 25, 9, 2, + 139, 194, 11, 250, 60, 9, 2, 139, 194, 11, 250, 223, 9, 2, 139, 194, 11, + 206, 65, 9, 2, 139, 194, 11, 208, 196, 9, 2, 139, 194, 11, 194, 142, 9, + 2, 139, 232, 147, 217, 122, 9, 2, 139, 3, 206, 81, 9, 236, 190, 234, 80, + 80, 249, 235, 9, 163, 237, 216, 63, 9, 238, 138, 233, 58, 9, 238, 138, + 237, 215, 9, 238, 138, 222, 86, 9, 238, 138, 233, 56, 9, 238, 138, 237, + 213, 9, 238, 138, 222, 84, 9, 158, 90, 78, 58, 9, 158, 103, 236, 112, 58, + 9, 158, 219, 70, 58, 9, 158, 90, 78, 63, 9, 158, 103, 236, 112, 63, 9, + 158, 219, 70, 63, 9, 211, 184, 233, 56, 9, 211, 184, 237, 213, 9, 211, + 184, 222, 84, 9, 2, 139, 194, 119, 9, 233, 59, 4, 207, 81, 9, 233, 59, 4, + 78, 58, 9, 222, 87, 4, 78, 63, 9, 46, 250, 78, 58, 9, 51, 250, 78, 58, 9, + 46, 250, 78, 63, 9, 51, 250, 78, 63, 9, 55, 51, 250, 78, 58, 9, 55, 51, + 250, 78, 95, 4, 236, 114, 9, 51, 250, 78, 95, 4, 236, 114, 9, 237, 216, + 4, 236, 114, 9, 122, 203, 109, 213, 124, 231, 50, 107, 3, 223, 121, 246, + 234, 107, 3, 246, 234, 107, 3, 250, 168, 107, 3, 196, 6, 107, 1, 203, + 195, 64, 107, 1, 64, 107, 1, 252, 33, 107, 1, 70, 107, 1, 223, 224, 107, + 1, 68, 107, 1, 196, 251, 107, 1, 118, 150, 107, 1, 118, 165, 107, 1, 246, + 237, 71, 107, 1, 203, 195, 71, 107, 1, 71, 107, 1, 251, 63, 107, 1, 246, + 237, 74, 107, 1, 203, 195, 74, 107, 1, 74, 107, 1, 250, 8, 107, 1, 160, + 107, 1, 221, 250, 107, 1, 231, 233, 107, 1, 231, 84, 107, 1, 214, 165, + 107, 1, 247, 19, 107, 1, 246, 117, 107, 1, 223, 62, 107, 1, 223, 28, 107, + 1, 212, 201, 107, 1, 198, 83, 107, 1, 198, 71, 107, 1, 237, 161, 107, 1, + 237, 145, 107, 1, 213, 178, 107, 1, 189, 107, 1, 199, 240, 107, 1, 238, + 0, 107, 1, 237, 40, 107, 1, 181, 107, 1, 213, 160, 107, 1, 166, 107, 1, + 210, 94, 107, 1, 249, 3, 107, 1, 248, 54, 107, 1, 172, 107, 1, 168, 107, + 1, 167, 107, 1, 207, 3, 107, 1, 177, 107, 1, 219, 137, 107, 1, 219, 126, + 107, 1, 196, 157, 107, 1, 204, 64, 107, 1, 202, 92, 107, 1, 188, 107, 1, + 144, 107, 18, 3, 212, 0, 107, 18, 3, 211, 192, 107, 3, 212, 241, 107, 3, + 249, 246, 107, 18, 3, 252, 33, 107, 18, 3, 70, 107, 18, 3, 223, 224, 107, + 18, 3, 68, 107, 18, 3, 196, 251, 107, 18, 3, 118, 150, 107, 18, 3, 118, + 207, 4, 107, 18, 3, 246, 237, 71, 107, 18, 3, 203, 195, 71, 107, 18, 3, + 71, 107, 18, 3, 251, 63, 107, 18, 3, 246, 237, 74, 107, 18, 3, 203, 195, + 74, 107, 18, 3, 74, 107, 18, 3, 250, 8, 107, 3, 196, 11, 107, 18, 3, 209, + 91, 71, 107, 18, 3, 249, 241, 107, 211, 219, 107, 201, 218, 3, 197, 106, + 107, 201, 218, 3, 250, 170, 107, 230, 211, 251, 143, 107, 251, 130, 251, + 143, 107, 18, 3, 246, 237, 184, 71, 107, 18, 3, 197, 104, 107, 18, 3, + 196, 250, 107, 1, 208, 239, 107, 1, 221, 230, 107, 1, 231, 59, 107, 1, + 192, 112, 107, 1, 237, 150, 107, 1, 207, 156, 107, 1, 233, 97, 107, 1, + 192, 164, 107, 1, 118, 207, 4, 107, 1, 118, 219, 138, 107, 18, 3, 118, + 165, 107, 18, 3, 118, 219, 138, 107, 237, 208, 107, 55, 237, 208, 107, + 17, 192, 76, 107, 17, 101, 107, 17, 104, 107, 17, 133, 107, 17, 134, 107, + 17, 151, 107, 17, 170, 107, 17, 179, 107, 17, 174, 107, 17, 182, 107, + 251, 151, 57, 107, 3, 139, 202, 159, 236, 114, 107, 1, 246, 237, 64, 107, + 1, 212, 0, 107, 1, 211, 192, 107, 1, 249, 241, 107, 1, 197, 104, 107, 1, + 196, 250, 107, 1, 217, 114, 237, 161, 107, 1, 192, 71, 107, 1, 87, 168, + 107, 1, 231, 120, 107, 1, 223, 6, 107, 1, 231, 6, 201, 238, 107, 1, 237, + 151, 107, 1, 248, 159, 248, 76, 250, 197, 248, 76, 3, 246, 234, 248, 76, + 3, 250, 168, 248, 76, 3, 196, 6, 248, 76, 1, 64, 248, 76, 1, 252, 33, + 248, 76, 1, 70, 248, 76, 1, 223, 224, 248, 76, 1, 68, 248, 76, 1, 196, + 251, 248, 76, 1, 118, 150, 248, 76, 1, 118, 165, 248, 76, 1, 71, 248, 76, + 1, 251, 63, 248, 76, 1, 74, 248, 76, 1, 250, 8, 248, 76, 1, 160, 248, 76, + 1, 221, 250, 248, 76, 1, 231, 233, 248, 76, 1, 231, 84, 248, 76, 1, 214, + 165, 248, 76, 1, 247, 19, 248, 76, 1, 246, 117, 248, 76, 1, 223, 62, 248, + 76, 1, 223, 28, 248, 76, 1, 212, 201, 248, 76, 1, 198, 83, 248, 76, 1, + 198, 71, 248, 76, 1, 237, 161, 248, 76, 1, 237, 145, 248, 76, 1, 213, + 178, 248, 76, 1, 189, 248, 76, 1, 199, 240, 248, 76, 1, 238, 0, 248, 76, + 1, 237, 40, 248, 76, 1, 181, 248, 76, 1, 166, 248, 76, 1, 210, 94, 248, + 76, 1, 249, 3, 248, 76, 1, 248, 54, 248, 76, 1, 172, 248, 76, 1, 168, + 248, 76, 1, 167, 248, 76, 1, 177, 248, 76, 1, 204, 64, 248, 76, 1, 202, + 92, 248, 76, 1, 188, 248, 76, 1, 144, 248, 76, 3, 212, 241, 248, 76, 3, + 249, 246, 248, 76, 18, 3, 252, 33, 248, 76, 18, 3, 70, 248, 76, 18, 3, + 223, 224, 248, 76, 18, 3, 68, 248, 76, 18, 3, 196, 251, 248, 76, 18, 3, + 118, 150, 248, 76, 18, 3, 118, 207, 4, 248, 76, 18, 3, 71, 248, 76, 18, + 3, 251, 63, 248, 76, 18, 3, 74, 248, 76, 18, 3, 250, 8, 248, 76, 3, 196, + 11, 248, 76, 1, 221, 240, 189, 248, 76, 250, 9, 220, 2, 77, 248, 76, 1, + 207, 3, 248, 76, 1, 207, 156, 248, 76, 1, 192, 164, 248, 76, 1, 118, 207, + 4, 248, 76, 1, 118, 219, 138, 248, 76, 18, 3, 118, 165, 248, 76, 18, 3, + 118, 219, 138, 248, 76, 17, 192, 76, 248, 76, 17, 101, 248, 76, 17, 104, + 248, 76, 17, 133, 248, 76, 17, 134, 248, 76, 17, 151, 248, 76, 17, 170, + 248, 76, 17, 179, 248, 76, 17, 174, 248, 76, 17, 182, 248, 76, 1, 208, + 76, 4, 85, 237, 10, 248, 76, 1, 208, 76, 4, 106, 237, 10, 248, 76, 206, + 186, 77, 248, 76, 206, 186, 57, 248, 76, 238, 137, 212, 233, 101, 248, + 76, 238, 137, 212, 233, 104, 248, 76, 238, 137, 212, 233, 133, 248, 76, + 238, 137, 212, 233, 134, 248, 76, 238, 137, 212, 233, 90, 219, 241, 199, + 230, 199, 225, 237, 70, 248, 76, 238, 137, 237, 71, 203, 35, 248, 76, + 223, 83, 248, 76, 231, 200, 77, 248, 76, 1, 196, 120, 250, 168, 248, 76, + 251, 151, 57, 248, 76, 206, 36, 77, 230, 152, 3, 251, 124, 248, 20, 230, + 152, 3, 248, 20, 230, 152, 3, 196, 6, 230, 152, 1, 64, 230, 152, 1, 252, + 33, 230, 152, 1, 70, 230, 152, 1, 223, 224, 230, 152, 1, 68, 230, 152, 1, + 196, 251, 230, 152, 1, 234, 171, 230, 152, 1, 251, 63, 230, 152, 1, 211, + 194, 230, 152, 1, 250, 8, 230, 152, 1, 160, 230, 152, 1, 221, 250, 230, + 152, 1, 231, 233, 230, 152, 1, 231, 84, 230, 152, 1, 214, 165, 230, 152, + 1, 247, 19, 230, 152, 1, 246, 117, 230, 152, 1, 223, 62, 230, 152, 1, + 223, 28, 230, 152, 1, 212, 201, 230, 152, 1, 198, 83, 230, 152, 1, 198, + 71, 230, 152, 1, 237, 161, 230, 152, 1, 237, 145, 230, 152, 1, 213, 178, + 230, 152, 1, 189, 230, 152, 1, 199, 240, 230, 152, 1, 238, 0, 230, 152, + 1, 237, 40, 230, 152, 1, 181, 230, 152, 1, 166, 230, 152, 1, 210, 94, + 230, 152, 1, 249, 3, 230, 152, 1, 248, 54, 230, 152, 1, 172, 230, 152, 1, + 168, 230, 152, 1, 167, 230, 152, 1, 177, 230, 152, 1, 219, 137, 230, 152, + 1, 196, 157, 230, 152, 1, 204, 64, 230, 152, 1, 188, 230, 152, 1, 144, + 230, 152, 3, 212, 241, 230, 152, 18, 3, 252, 33, 230, 152, 18, 3, 70, + 230, 152, 18, 3, 223, 224, 230, 152, 18, 3, 68, 230, 152, 18, 3, 196, + 251, 230, 152, 18, 3, 234, 171, 230, 152, 18, 3, 251, 63, 230, 152, 18, + 3, 211, 194, 230, 152, 18, 3, 250, 8, 230, 152, 3, 196, 11, 230, 152, 3, + 197, 108, 230, 152, 1, 221, 230, 230, 152, 1, 231, 59, 230, 152, 1, 192, + 112, 230, 152, 1, 207, 3, 230, 152, 1, 233, 97, 230, 152, 17, 192, 76, + 230, 152, 17, 101, 230, 152, 17, 104, 230, 152, 17, 133, 230, 152, 17, + 134, 230, 152, 17, 151, 230, 152, 17, 170, 230, 152, 17, 179, 230, 152, + 17, 174, 230, 152, 17, 182, 230, 152, 199, 71, 230, 152, 251, 123, 230, + 152, 223, 103, 230, 152, 197, 23, 230, 152, 234, 132, 211, 199, 230, 152, + 3, 193, 104, 230, 152, 251, 151, 57, 230, 168, 3, 246, 234, 230, 168, 3, + 250, 168, 230, 168, 3, 196, 6, 230, 168, 1, 64, 230, 168, 1, 252, 33, + 230, 168, 1, 70, 230, 168, 1, 223, 224, 230, 168, 1, 68, 230, 168, 1, + 196, 251, 230, 168, 1, 118, 150, 230, 168, 1, 118, 165, 230, 168, 18, + 246, 237, 71, 230, 168, 1, 71, 230, 168, 1, 251, 63, 230, 168, 18, 246, + 237, 74, 230, 168, 1, 74, 230, 168, 1, 250, 8, 230, 168, 1, 160, 230, + 168, 1, 221, 250, 230, 168, 1, 231, 233, 230, 168, 1, 231, 84, 230, 168, + 1, 214, 165, 230, 168, 1, 247, 19, 230, 168, 1, 246, 117, 230, 168, 1, + 223, 62, 230, 168, 1, 223, 28, 230, 168, 1, 212, 201, 230, 168, 1, 198, + 83, 230, 168, 1, 198, 71, 230, 168, 1, 237, 161, 230, 168, 1, 237, 145, + 230, 168, 1, 213, 178, 230, 168, 1, 189, 230, 168, 1, 199, 240, 230, 168, + 1, 238, 0, 230, 168, 1, 237, 40, 230, 168, 1, 181, 230, 168, 1, 166, 230, + 168, 1, 210, 94, 230, 168, 1, 249, 3, 230, 168, 1, 248, 54, 230, 168, 1, + 172, 230, 168, 1, 168, 230, 168, 1, 167, 230, 168, 1, 177, 230, 168, 1, + 219, 137, 230, 168, 1, 196, 157, 230, 168, 1, 204, 64, 230, 168, 1, 202, + 92, 230, 168, 1, 188, 230, 168, 1, 144, 230, 168, 3, 212, 241, 230, 168, + 3, 249, 246, 230, 168, 18, 3, 252, 33, 230, 168, 18, 3, 70, 230, 168, 18, + 3, 223, 224, 230, 168, 18, 3, 68, 230, 168, 18, 3, 196, 251, 230, 168, + 18, 3, 118, 150, 230, 168, 18, 3, 118, 207, 4, 230, 168, 18, 3, 246, 237, + 71, 230, 168, 18, 3, 71, 230, 168, 18, 3, 251, 63, 230, 168, 18, 3, 246, + 237, 74, 230, 168, 18, 3, 74, 230, 168, 18, 3, 250, 8, 230, 168, 3, 196, + 11, 230, 168, 211, 219, 230, 168, 1, 118, 207, 4, 230, 168, 1, 118, 219, + 138, 230, 168, 18, 3, 118, 165, 230, 168, 18, 3, 118, 219, 138, 230, 168, + 17, 192, 76, 230, 168, 17, 101, 230, 168, 17, 104, 230, 168, 17, 133, + 230, 168, 17, 134, 230, 168, 17, 151, 230, 168, 17, 170, 230, 168, 17, + 179, 230, 168, 17, 174, 230, 168, 17, 182, 230, 168, 251, 151, 57, 230, + 168, 206, 186, 57, 230, 168, 1, 192, 71, 230, 168, 3, 201, 131, 230, 168, + 3, 204, 54, 230, 168, 3, 217, 207, 230, 168, 3, 199, 159, 212, 242, 58, + 230, 168, 3, 242, 131, 212, 242, 58, 230, 168, 3, 197, 222, 212, 242, 58, + 211, 153, 3, 246, 234, 211, 153, 3, 250, 168, 211, 153, 3, 196, 6, 211, + 153, 1, 64, 211, 153, 1, 252, 33, 211, 153, 1, 70, 211, 153, 1, 223, 224, + 211, 153, 1, 68, 211, 153, 1, 196, 251, 211, 153, 1, 118, 150, 211, 153, + 1, 118, 165, 211, 153, 1, 71, 211, 153, 1, 251, 63, 211, 153, 1, 74, 211, + 153, 1, 250, 8, 211, 153, 1, 160, 211, 153, 1, 221, 250, 211, 153, 1, + 231, 233, 211, 153, 1, 231, 84, 211, 153, 1, 214, 165, 211, 153, 1, 247, + 19, 211, 153, 1, 246, 117, 211, 153, 1, 223, 62, 211, 153, 1, 223, 28, + 211, 153, 1, 212, 201, 211, 153, 1, 198, 83, 211, 153, 1, 198, 71, 211, + 153, 1, 237, 161, 211, 153, 1, 237, 145, 211, 153, 1, 213, 178, 211, 153, + 1, 189, 211, 153, 1, 199, 240, 211, 153, 1, 238, 0, 211, 153, 1, 237, 40, + 211, 153, 1, 181, 211, 153, 1, 166, 211, 153, 1, 210, 94, 211, 153, 1, + 249, 3, 211, 153, 1, 248, 54, 211, 153, 1, 172, 211, 153, 1, 168, 211, + 153, 1, 167, 211, 153, 1, 177, 211, 153, 1, 219, 137, 211, 153, 1, 196, + 157, 211, 153, 1, 204, 64, 211, 153, 1, 202, 92, 211, 153, 1, 188, 211, + 153, 1, 144, 211, 153, 3, 212, 241, 211, 153, 3, 249, 246, 211, 153, 18, + 3, 252, 33, 211, 153, 18, 3, 70, 211, 153, 18, 3, 223, 224, 211, 153, 18, + 3, 68, 211, 153, 18, 3, 196, 251, 211, 153, 18, 3, 118, 150, 211, 153, + 18, 3, 118, 207, 4, 211, 153, 18, 3, 71, 211, 153, 18, 3, 251, 63, 211, + 153, 18, 3, 74, 211, 153, 18, 3, 250, 8, 211, 153, 3, 196, 11, 211, 153, + 3, 211, 109, 211, 153, 251, 64, 220, 2, 77, 211, 153, 250, 9, 220, 2, 77, + 211, 153, 1, 207, 3, 211, 153, 1, 207, 156, 211, 153, 1, 192, 164, 211, + 153, 1, 118, 207, 4, 211, 153, 1, 118, 219, 138, 211, 153, 18, 3, 118, + 165, 211, 153, 18, 3, 118, 219, 138, 211, 153, 17, 192, 76, 211, 153, 17, + 101, 211, 153, 17, 104, 211, 153, 17, 133, 211, 153, 17, 134, 211, 153, + 17, 151, 211, 153, 17, 170, 211, 153, 17, 179, 211, 153, 17, 174, 211, + 153, 17, 182, 211, 153, 223, 83, 211, 153, 1, 194, 169, 211, 153, 232, + 109, 90, 208, 167, 211, 153, 232, 109, 90, 230, 78, 211, 153, 232, 109, + 112, 208, 165, 211, 153, 232, 109, 90, 203, 33, 211, 153, 232, 109, 90, + 234, 143, 211, 153, 232, 109, 112, 203, 30, 44, 3, 250, 168, 44, 3, 196, + 6, 44, 1, 64, 44, 1, 252, 33, 44, 1, 70, 44, 1, 223, 224, 44, 1, 68, 44, + 1, 196, 251, 44, 1, 71, 44, 1, 234, 171, 44, 1, 251, 63, 44, 1, 74, 44, + 1, 211, 194, 44, 1, 250, 8, 44, 1, 160, 44, 1, 214, 165, 44, 1, 247, 19, + 44, 1, 223, 62, 44, 1, 212, 201, 44, 1, 198, 83, 44, 1, 213, 178, 44, 1, + 189, 44, 1, 181, 44, 1, 213, 160, 44, 1, 166, 44, 1, 172, 44, 1, 168, 44, + 1, 167, 44, 1, 207, 3, 44, 1, 177, 44, 1, 219, 137, 44, 1, 219, 126, 44, + 1, 196, 157, 44, 1, 204, 64, 44, 1, 202, 92, 44, 1, 188, 44, 1, 144, 44, + 18, 3, 252, 33, 44, 18, 3, 70, 44, 18, 3, 223, 224, 44, 18, 3, 68, 44, + 18, 3, 196, 251, 44, 18, 3, 71, 44, 18, 3, 234, 171, 44, 18, 3, 251, 63, + 44, 18, 3, 74, 44, 18, 3, 211, 194, 44, 18, 3, 250, 8, 44, 3, 196, 11, + 44, 211, 219, 44, 250, 9, 220, 2, 77, 44, 17, 192, 76, 44, 17, 101, 44, + 17, 104, 44, 17, 133, 44, 17, 134, 44, 17, 151, 44, 17, 170, 44, 17, 179, + 44, 17, 174, 44, 17, 182, 44, 31, 200, 30, 44, 31, 90, 228, 162, 44, 31, + 90, 180, 44, 237, 174, 57, 44, 216, 38, 57, 44, 193, 67, 57, 44, 237, + 112, 57, 44, 238, 196, 57, 44, 250, 62, 95, 57, 44, 206, 186, 57, 44, 31, + 57, 200, 34, 3, 38, 246, 235, 58, 200, 34, 3, 246, 234, 200, 34, 3, 250, + 168, 200, 34, 3, 196, 6, 200, 34, 3, 38, 250, 169, 58, 200, 34, 1, 64, + 200, 34, 1, 252, 33, 200, 34, 1, 70, 200, 34, 1, 223, 224, 200, 34, 1, + 68, 200, 34, 1, 196, 251, 200, 34, 1, 118, 150, 200, 34, 1, 118, 165, + 200, 34, 1, 71, 200, 34, 1, 234, 171, 200, 34, 1, 251, 63, 200, 34, 1, + 74, 200, 34, 1, 211, 194, 200, 34, 1, 250, 8, 200, 34, 1, 160, 200, 34, + 1, 221, 250, 200, 34, 1, 231, 233, 200, 34, 1, 231, 84, 200, 34, 1, 214, + 165, 200, 34, 1, 247, 19, 200, 34, 1, 246, 117, 200, 34, 1, 223, 62, 200, + 34, 1, 223, 28, 200, 34, 1, 212, 201, 200, 34, 1, 198, 83, 200, 34, 1, + 198, 71, 200, 34, 1, 237, 161, 200, 34, 1, 237, 145, 200, 34, 1, 213, + 178, 200, 34, 1, 189, 200, 34, 1, 199, 240, 200, 34, 1, 238, 0, 200, 34, + 1, 237, 40, 200, 34, 1, 181, 200, 34, 1, 166, 200, 34, 1, 210, 94, 200, + 34, 1, 249, 3, 200, 34, 1, 248, 54, 200, 34, 1, 172, 200, 34, 1, 168, + 200, 34, 1, 167, 200, 34, 1, 207, 3, 200, 34, 1, 177, 200, 34, 1, 219, + 137, 200, 34, 1, 219, 126, 200, 34, 1, 196, 157, 200, 34, 1, 204, 64, + 200, 34, 1, 202, 92, 200, 34, 1, 188, 200, 34, 1, 144, 200, 34, 3, 249, + 246, 200, 34, 18, 3, 252, 33, 200, 34, 18, 3, 70, 200, 34, 18, 3, 223, + 224, 200, 34, 18, 3, 68, 200, 34, 18, 3, 196, 251, 200, 34, 18, 3, 118, + 150, 200, 34, 18, 3, 118, 207, 4, 200, 34, 18, 3, 71, 200, 34, 18, 3, + 234, 171, 200, 34, 18, 3, 251, 63, 200, 34, 18, 3, 74, 200, 34, 18, 3, + 211, 194, 200, 34, 18, 3, 250, 8, 200, 34, 3, 196, 11, 200, 34, 220, 2, + 77, 200, 34, 251, 64, 220, 2, 77, 200, 34, 1, 198, 118, 200, 34, 1, 235, + 17, 200, 34, 1, 206, 240, 200, 34, 1, 118, 207, 4, 200, 34, 1, 118, 219, + 138, 200, 34, 18, 3, 118, 165, 200, 34, 18, 3, 118, 219, 138, 200, 34, + 17, 192, 76, 200, 34, 17, 101, 200, 34, 17, 104, 200, 34, 17, 133, 200, + 34, 17, 134, 200, 34, 17, 151, 200, 34, 17, 170, 200, 34, 17, 179, 200, + 34, 17, 174, 200, 34, 17, 182, 200, 34, 3, 203, 113, 200, 34, 232, 109, + 17, 192, 77, 39, 212, 4, 209, 137, 80, 134, 200, 34, 232, 109, 17, 90, + 39, 212, 4, 209, 137, 80, 134, 200, 34, 232, 109, 17, 103, 39, 212, 4, + 209, 137, 80, 134, 200, 34, 232, 109, 17, 112, 39, 212, 4, 209, 137, 80, + 134, 200, 34, 232, 109, 17, 90, 39, 233, 217, 209, 137, 80, 134, 200, 34, + 232, 109, 17, 103, 39, 233, 217, 209, 137, 80, 134, 200, 34, 232, 109, + 17, 112, 39, 233, 217, 209, 137, 80, 134, 200, 34, 3, 197, 255, 222, 115, + 3, 202, 159, 246, 234, 222, 115, 3, 246, 234, 222, 115, 3, 250, 168, 222, + 115, 3, 196, 6, 222, 115, 3, 203, 113, 222, 115, 1, 64, 222, 115, 1, 252, + 33, 222, 115, 1, 70, 222, 115, 1, 223, 224, 222, 115, 1, 68, 222, 115, 1, + 196, 251, 222, 115, 1, 118, 150, 222, 115, 1, 118, 165, 222, 115, 1, 71, + 222, 115, 1, 234, 171, 222, 115, 1, 251, 63, 222, 115, 1, 74, 222, 115, + 1, 211, 194, 222, 115, 1, 250, 8, 222, 115, 1, 160, 222, 115, 1, 221, + 250, 222, 115, 1, 231, 233, 222, 115, 1, 231, 84, 222, 115, 1, 214, 165, + 222, 115, 1, 247, 19, 222, 115, 1, 246, 117, 222, 115, 1, 223, 62, 222, + 115, 1, 223, 28, 222, 115, 1, 212, 201, 222, 115, 1, 198, 83, 222, 115, + 1, 198, 71, 222, 115, 1, 237, 161, 222, 115, 1, 237, 145, 222, 115, 1, + 213, 178, 222, 115, 1, 189, 222, 115, 1, 199, 240, 222, 115, 1, 238, 0, + 222, 115, 1, 237, 40, 222, 115, 1, 181, 222, 115, 1, 166, 222, 115, 1, + 210, 94, 222, 115, 1, 249, 3, 222, 115, 1, 248, 54, 222, 115, 1, 172, + 222, 115, 1, 168, 222, 115, 1, 167, 222, 115, 1, 207, 3, 222, 115, 1, + 177, 222, 115, 1, 219, 137, 222, 115, 1, 196, 157, 222, 115, 1, 204, 64, + 222, 115, 1, 202, 92, 222, 115, 1, 188, 222, 115, 1, 144, 222, 115, 3, + 212, 241, 222, 115, 3, 249, 246, 222, 115, 18, 3, 252, 33, 222, 115, 18, + 3, 70, 222, 115, 18, 3, 223, 224, 222, 115, 18, 3, 68, 222, 115, 18, 3, + 196, 251, 222, 115, 18, 3, 118, 150, 222, 115, 18, 3, 118, 207, 4, 222, + 115, 18, 3, 71, 222, 115, 18, 3, 234, 171, 222, 115, 18, 3, 251, 63, 222, + 115, 18, 3, 74, 222, 115, 18, 3, 211, 194, 222, 115, 18, 3, 250, 8, 222, + 115, 3, 196, 11, 222, 115, 220, 2, 77, 222, 115, 251, 64, 220, 2, 77, + 222, 115, 1, 233, 97, 222, 115, 1, 118, 207, 4, 222, 115, 1, 118, 219, + 138, 222, 115, 18, 3, 118, 165, 222, 115, 18, 3, 118, 219, 138, 222, 115, + 17, 192, 76, 222, 115, 17, 101, 222, 115, 17, 104, 222, 115, 17, 133, + 222, 115, 17, 134, 222, 115, 17, 151, 222, 115, 17, 170, 222, 115, 17, + 179, 222, 115, 17, 174, 222, 115, 17, 182, 222, 115, 3, 223, 13, 222, + 115, 3, 197, 39, 135, 3, 38, 250, 169, 58, 135, 3, 246, 234, 135, 3, 250, + 168, 135, 3, 196, 6, 135, 1, 196, 120, 250, 168, 135, 1, 64, 135, 1, 252, + 33, 135, 1, 70, 135, 1, 223, 224, 135, 1, 68, 135, 1, 196, 251, 135, 1, + 118, 150, 135, 1, 118, 165, 135, 1, 71, 135, 1, 234, 171, 135, 1, 251, + 63, 135, 1, 74, 135, 1, 211, 194, 135, 1, 250, 8, 135, 1, 160, 135, 1, + 221, 250, 135, 1, 231, 233, 135, 1, 231, 84, 135, 1, 214, 165, 135, 1, + 247, 19, 135, 1, 246, 117, 135, 1, 223, 62, 135, 1, 223, 28, 135, 1, 212, + 201, 135, 1, 198, 83, 135, 1, 198, 71, 135, 1, 237, 161, 135, 1, 237, + 145, 135, 1, 213, 178, 135, 1, 189, 135, 1, 199, 240, 135, 1, 238, 0, + 135, 1, 237, 40, 135, 1, 181, 135, 1, 213, 160, 135, 1, 166, 135, 1, 210, + 94, 135, 1, 249, 3, 135, 1, 248, 54, 135, 1, 172, 135, 1, 168, 135, 1, + 167, 135, 1, 207, 3, 135, 1, 177, 135, 1, 219, 137, 135, 1, 219, 126, + 135, 1, 196, 157, 135, 1, 204, 64, 135, 1, 202, 92, 135, 1, 188, 135, 1, + 144, 135, 1, 198, 52, 135, 3, 84, 248, 194, 196, 11, 135, 3, 242, 124, + 196, 11, 135, 3, 249, 246, 135, 18, 3, 252, 33, 135, 18, 3, 70, 135, 18, + 3, 223, 224, 135, 18, 3, 68, 135, 18, 3, 196, 251, 135, 18, 3, 118, 150, + 135, 18, 3, 118, 207, 4, 135, 18, 3, 71, 135, 18, 3, 234, 171, 135, 18, + 3, 251, 63, 135, 18, 3, 74, 135, 18, 3, 211, 194, 135, 18, 3, 250, 8, + 135, 3, 196, 11, 135, 1, 78, 207, 195, 135, 3, 210, 246, 135, 1, 242, + 204, 218, 236, 135, 1, 242, 204, 193, 148, 135, 1, 242, 204, 219, 127, + 135, 250, 9, 220, 2, 77, 135, 232, 109, 90, 211, 207, 135, 232, 109, 90, + 232, 129, 135, 232, 109, 112, 234, 139, 135, 232, 109, 90, 197, 242, 135, + 232, 109, 90, 200, 21, 135, 232, 109, 112, 197, 241, 135, 232, 109, 90, + 233, 6, 135, 1, 250, 112, 223, 224, 135, 1, 118, 207, 4, 135, 1, 118, + 219, 138, 135, 18, 3, 118, 165, 135, 18, 3, 118, 219, 138, 135, 17, 192, + 76, 135, 17, 101, 135, 17, 104, 135, 17, 133, 135, 17, 134, 135, 17, 151, + 135, 17, 170, 135, 17, 179, 135, 17, 174, 135, 17, 182, 135, 31, 200, 30, + 135, 31, 90, 228, 162, 135, 31, 90, 180, 135, 232, 109, 90, 208, 167, + 135, 232, 109, 90, 230, 78, 135, 232, 109, 112, 208, 165, 135, 232, 109, + 90, 203, 33, 135, 232, 109, 90, 234, 143, 135, 232, 109, 112, 203, 30, + 135, 237, 179, 77, 135, 1, 242, 204, 213, 179, 135, 1, 242, 204, 215, + 151, 135, 1, 242, 204, 207, 4, 135, 1, 242, 204, 165, 135, 1, 242, 204, + 219, 138, 135, 1, 242, 204, 222, 184, 159, 3, 246, 234, 159, 3, 250, 167, + 159, 3, 196, 5, 159, 1, 249, 234, 159, 1, 251, 242, 159, 1, 251, 88, 159, + 1, 251, 103, 159, 1, 223, 72, 159, 1, 223, 223, 159, 1, 196, 242, 159, 1, + 196, 245, 159, 1, 223, 98, 159, 1, 223, 99, 159, 1, 223, 209, 159, 1, + 223, 211, 159, 1, 233, 184, 159, 1, 234, 166, 159, 1, 251, 46, 159, 1, + 211, 97, 159, 1, 211, 187, 159, 1, 249, 249, 159, 1, 250, 255, 222, 62, + 159, 1, 217, 187, 222, 62, 159, 1, 250, 255, 231, 178, 159, 1, 217, 187, + 231, 178, 159, 1, 222, 114, 215, 81, 159, 1, 206, 30, 231, 178, 159, 1, + 250, 255, 246, 184, 159, 1, 217, 187, 246, 184, 159, 1, 250, 255, 223, + 44, 159, 1, 217, 187, 223, 44, 159, 1, 200, 171, 215, 81, 159, 1, 200, + 171, 206, 29, 215, 82, 159, 1, 206, 30, 223, 44, 159, 1, 250, 255, 198, + 79, 159, 1, 217, 187, 198, 79, 159, 1, 250, 255, 237, 152, 159, 1, 217, + 187, 237, 152, 159, 1, 215, 180, 215, 34, 159, 1, 206, 30, 237, 152, 159, + 1, 250, 255, 200, 87, 159, 1, 217, 187, 200, 87, 159, 1, 250, 255, 237, + 172, 159, 1, 217, 187, 237, 172, 159, 1, 237, 204, 215, 34, 159, 1, 206, + 30, 237, 172, 159, 1, 250, 255, 210, 189, 159, 1, 217, 187, 210, 189, + 159, 1, 250, 255, 248, 161, 159, 1, 217, 187, 248, 161, 159, 1, 217, 90, + 159, 1, 250, 235, 248, 161, 159, 1, 193, 74, 159, 1, 208, 14, 159, 1, + 237, 204, 220, 51, 159, 1, 196, 125, 159, 1, 200, 171, 206, 0, 159, 1, + 215, 180, 206, 0, 159, 1, 237, 204, 206, 0, 159, 1, 230, 5, 159, 1, 215, + 180, 220, 51, 159, 1, 233, 49, 159, 3, 251, 34, 159, 18, 3, 251, 98, 159, + 18, 3, 222, 19, 251, 105, 159, 18, 3, 236, 239, 251, 105, 159, 18, 3, + 222, 19, 223, 95, 159, 18, 3, 236, 239, 223, 95, 159, 18, 3, 222, 19, + 211, 76, 159, 18, 3, 236, 239, 211, 76, 159, 18, 3, 231, 222, 159, 18, 3, + 221, 93, 159, 18, 3, 236, 239, 221, 93, 159, 18, 3, 221, 95, 237, 90, + 159, 18, 3, 221, 94, 230, 100, 251, 98, 159, 18, 3, 221, 94, 230, 100, + 236, 239, 251, 98, 159, 18, 3, 221, 94, 230, 100, 231, 177, 159, 18, 3, + 231, 177, 159, 219, 150, 17, 192, 76, 159, 219, 150, 17, 101, 159, 219, + 150, 17, 104, 159, 219, 150, 17, 133, 159, 219, 150, 17, 134, 159, 219, + 150, 17, 151, 159, 219, 150, 17, 170, 159, 219, 150, 17, 179, 159, 219, + 150, 17, 174, 159, 219, 150, 17, 182, 159, 18, 3, 236, 239, 231, 222, + 159, 18, 3, 236, 239, 231, 177, 159, 209, 38, 221, 11, 199, 235, 246, + 100, 221, 114, 222, 135, 199, 235, 246, 100, 221, 221, 221, 244, 199, + 235, 246, 100, 221, 221, 221, 212, 199, 235, 246, 100, 221, 221, 221, + 207, 199, 235, 246, 100, 221, 221, 221, 217, 199, 235, 246, 100, 221, + 221, 208, 35, 199, 235, 246, 100, 214, 91, 214, 78, 199, 235, 246, 100, + 242, 189, 246, 106, 199, 235, 246, 100, 242, 189, 242, 199, 199, 235, + 246, 100, 242, 189, 246, 105, 199, 235, 246, 100, 202, 213, 202, 212, + 199, 235, 246, 100, 242, 189, 242, 185, 199, 235, 246, 100, 193, 2, 193, + 9, 199, 235, 246, 100, 236, 147, 246, 114, 199, 235, 246, 100, 115, 210, + 204, 199, 235, 246, 100, 199, 177, 199, 229, 199, 235, 246, 100, 199, + 177, 215, 57, 199, 235, 246, 100, 199, 177, 210, 54, 199, 235, 246, 100, + 213, 143, 214, 196, 199, 235, 246, 100, 236, 147, 237, 91, 199, 235, 246, + 100, 115, 200, 117, 199, 235, 246, 100, 199, 177, 199, 142, 199, 235, + 246, 100, 199, 177, 199, 236, 199, 235, 246, 100, 199, 177, 199, 171, + 199, 235, 246, 100, 213, 143, 213, 22, 199, 235, 246, 100, 247, 221, 248, + 224, 199, 235, 246, 100, 209, 199, 209, 234, 199, 235, 246, 100, 210, 66, + 210, 56, 199, 235, 246, 100, 232, 165, 233, 97, 199, 235, 246, 100, 210, + 66, 210, 87, 199, 235, 246, 100, 232, 165, 233, 68, 199, 235, 246, 100, + 210, 66, 206, 44, 199, 235, 246, 100, 216, 92, 172, 199, 235, 246, 100, + 193, 2, 193, 105, 199, 235, 246, 100, 207, 56, 206, 211, 199, 235, 246, + 100, 206, 218, 199, 235, 246, 100, 219, 108, 219, 168, 199, 235, 246, + 100, 219, 36, 199, 235, 246, 100, 194, 37, 194, 159, 199, 235, 246, 100, + 202, 213, 206, 61, 199, 235, 246, 100, 202, 213, 206, 182, 199, 235, 246, + 100, 202, 213, 201, 175, 199, 235, 246, 100, 229, 44, 229, 142, 199, 235, + 246, 100, 219, 108, 242, 167, 199, 235, 246, 100, 185, 250, 214, 199, + 235, 246, 100, 229, 44, 213, 133, 199, 235, 246, 100, 211, 51, 199, 235, + 246, 100, 206, 24, 64, 199, 235, 246, 100, 217, 181, 230, 64, 199, 235, + 246, 100, 206, 24, 252, 33, 199, 235, 246, 100, 206, 24, 250, 241, 199, + 235, 246, 100, 206, 24, 70, 199, 235, 246, 100, 206, 24, 223, 224, 199, + 235, 246, 100, 206, 24, 197, 104, 199, 235, 246, 100, 206, 24, 197, 102, + 199, 235, 246, 100, 206, 24, 68, 199, 235, 246, 100, 206, 24, 196, 251, + 199, 235, 246, 100, 210, 68, 199, 235, 238, 137, 16, 248, 225, 199, 235, + 246, 100, 206, 24, 71, 199, 235, 246, 100, 206, 24, 251, 108, 199, 235, + 246, 100, 206, 24, 74, 199, 235, 246, 100, 206, 24, 251, 64, 217, 175, + 199, 235, 246, 100, 206, 24, 251, 64, 217, 176, 199, 235, 246, 100, 220, + 98, 199, 235, 246, 100, 217, 172, 199, 235, 246, 100, 217, 173, 199, 235, + 246, 100, 217, 181, 234, 131, 199, 235, 246, 100, 217, 181, 199, 176, + 199, 235, 246, 100, 217, 181, 198, 188, 199, 235, 246, 100, 217, 181, + 242, 250, 199, 235, 246, 100, 199, 227, 199, 235, 246, 100, 214, 24, 199, + 235, 246, 100, 193, 99, 199, 235, 246, 100, 232, 154, 199, 235, 17, 192, + 76, 199, 235, 17, 101, 199, 235, 17, 104, 199, 235, 17, 133, 199, 235, + 17, 134, 199, 235, 17, 151, 199, 235, 17, 170, 199, 235, 17, 179, 199, + 235, 17, 174, 199, 235, 17, 182, 199, 235, 246, 100, 250, 209, 199, 235, + 246, 100, 221, 218, 220, 77, 1, 221, 113, 220, 77, 1, 221, 221, 201, 120, + 220, 77, 1, 221, 221, 200, 129, 220, 77, 1, 211, 44, 231, 84, 220, 77, 1, + 214, 90, 220, 77, 1, 242, 63, 220, 77, 1, 211, 44, 246, 117, 220, 77, 1, + 202, 213, 200, 129, 220, 77, 1, 211, 44, 223, 28, 220, 77, 1, 212, 165, + 220, 77, 1, 211, 44, 212, 201, 220, 77, 1, 211, 44, 198, 83, 220, 77, 1, + 211, 44, 198, 71, 220, 77, 1, 211, 44, 237, 161, 220, 77, 1, 211, 44, + 237, 145, 220, 77, 1, 211, 44, 213, 178, 220, 77, 1, 236, 146, 220, 77, + 1, 155, 220, 77, 1, 199, 177, 201, 120, 220, 77, 1, 199, 177, 200, 129, + 220, 77, 1, 211, 44, 237, 40, 220, 77, 1, 213, 142, 220, 77, 1, 247, 220, + 220, 77, 1, 209, 198, 220, 77, 1, 210, 66, 201, 120, 220, 77, 1, 232, + 165, 200, 129, 220, 77, 1, 210, 66, 200, 129, 220, 77, 1, 232, 165, 201, + 120, 220, 77, 1, 211, 44, 248, 54, 220, 77, 1, 216, 91, 220, 77, 1, 193, + 1, 220, 77, 1, 219, 108, 219, 168, 220, 77, 1, 219, 108, 219, 67, 220, + 77, 1, 194, 36, 220, 77, 1, 206, 32, 204, 64, 220, 77, 1, 206, 32, 202, + 92, 220, 77, 1, 202, 213, 201, 120, 220, 77, 1, 229, 44, 201, 120, 220, + 77, 1, 211, 44, 219, 137, 220, 77, 1, 74, 220, 77, 1, 229, 44, 200, 129, + 220, 77, 234, 105, 220, 77, 18, 3, 64, 220, 77, 18, 3, 217, 181, 222, + 121, 220, 77, 18, 3, 252, 33, 220, 77, 18, 3, 250, 241, 220, 77, 18, 3, + 70, 220, 77, 18, 3, 223, 224, 220, 77, 18, 3, 193, 148, 220, 77, 18, 3, + 192, 165, 220, 77, 18, 3, 68, 220, 77, 18, 3, 196, 251, 220, 77, 3, 211, + 44, 196, 11, 220, 77, 18, 3, 217, 181, 221, 91, 220, 77, 204, 175, 3, + 219, 107, 220, 77, 204, 175, 3, 212, 165, 220, 77, 18, 3, 71, 220, 77, + 18, 3, 234, 150, 220, 77, 18, 3, 74, 220, 77, 18, 3, 249, 236, 220, 77, + 18, 3, 251, 63, 220, 77, 221, 114, 177, 220, 77, 158, 217, 181, 234, 131, + 220, 77, 158, 217, 181, 199, 176, 220, 77, 158, 217, 181, 199, 128, 220, + 77, 158, 217, 181, 246, 192, 220, 77, 246, 240, 77, 220, 77, 214, 33, + 220, 77, 17, 192, 76, 220, 77, 17, 101, 220, 77, 17, 104, 220, 77, 17, + 133, 220, 77, 17, 134, 220, 77, 17, 151, 220, 77, 17, 170, 220, 77, 17, + 179, 220, 77, 17, 174, 220, 77, 17, 182, 220, 77, 229, 44, 213, 142, 220, + 77, 229, 44, 216, 91, 220, 77, 1, 221, 222, 230, 254, 220, 77, 1, 221, + 222, 212, 165, 86, 5, 211, 219, 86, 122, 230, 188, 193, 14, 216, 193, + 198, 124, 64, 86, 122, 230, 188, 193, 14, 216, 193, 255, 34, 207, 60, + 248, 125, 172, 86, 122, 230, 188, 193, 14, 216, 193, 255, 34, 230, 188, + 198, 104, 172, 86, 122, 88, 193, 14, 216, 193, 217, 50, 172, 86, 122, + 242, 80, 193, 14, 216, 193, 204, 71, 172, 86, 122, 246, 212, 193, 14, + 216, 193, 210, 55, 204, 57, 172, 86, 122, 193, 14, 216, 193, 198, 104, + 204, 57, 172, 86, 122, 205, 254, 204, 56, 86, 122, 247, 127, 193, 14, + 216, 192, 86, 122, 247, 250, 203, 205, 193, 14, 216, 192, 86, 122, 223, + 126, 198, 103, 86, 122, 237, 83, 198, 104, 247, 126, 86, 122, 204, 56, + 86, 122, 212, 170, 204, 56, 86, 122, 198, 104, 204, 56, 86, 122, 212, + 170, 198, 104, 204, 56, 86, 122, 207, 84, 242, 231, 202, 109, 204, 56, + 86, 122, 207, 160, 230, 222, 204, 56, 86, 122, 246, 212, 255, 38, 206, + 223, 217, 49, 184, 246, 243, 86, 122, 230, 188, 198, 103, 86, 219, 91, 3, + 246, 115, 206, 222, 86, 219, 91, 3, 219, 220, 206, 222, 86, 250, 32, 3, + 204, 67, 231, 161, 255, 39, 206, 222, 86, 250, 32, 3, 255, 36, 166, 86, + 250, 32, 3, 205, 224, 198, 98, 86, 3, 208, 9, 236, 161, 231, 160, 86, 3, + 208, 9, 236, 161, 231, 0, 86, 3, 208, 9, 236, 161, 230, 189, 86, 3, 208, + 9, 215, 77, 231, 160, 86, 3, 208, 9, 215, 77, 231, 0, 86, 3, 208, 9, 236, + 161, 208, 9, 215, 76, 86, 17, 192, 76, 86, 17, 101, 86, 17, 104, 86, 17, + 133, 86, 17, 134, 86, 17, 151, 86, 17, 170, 86, 17, 179, 86, 17, 174, 86, + 17, 182, 86, 17, 138, 101, 86, 17, 138, 104, 86, 17, 138, 133, 86, 17, + 138, 134, 86, 17, 138, 151, 86, 17, 138, 170, 86, 17, 138, 179, 86, 17, + 138, 174, 86, 17, 138, 182, 86, 17, 138, 192, 76, 86, 122, 247, 129, 206, + 222, 86, 122, 214, 156, 247, 54, 212, 182, 192, 10, 86, 122, 246, 212, + 255, 38, 206, 223, 247, 55, 216, 138, 246, 243, 86, 122, 214, 156, 247, + 54, 204, 68, 206, 222, 86, 122, 242, 246, 216, 192, 86, 122, 198, 119, + 255, 35, 86, 122, 230, 171, 206, 223, 230, 127, 86, 122, 230, 171, 206, + 223, 230, 133, 86, 122, 250, 215, 221, 239, 230, 127, 86, 122, 250, 215, + 221, 239, 230, 133, 86, 3, 193, 91, 198, 102, 86, 3, 217, 136, 198, 102, + 86, 1, 160, 86, 1, 221, 250, 86, 1, 231, 233, 86, 1, 231, 84, 86, 1, 214, + 165, 86, 1, 247, 19, 86, 1, 246, 117, 86, 1, 223, 62, 86, 1, 212, 201, + 86, 1, 198, 83, 86, 1, 198, 71, 86, 1, 237, 161, 86, 1, 237, 145, 86, 1, + 213, 178, 86, 1, 189, 86, 1, 199, 240, 86, 1, 238, 0, 86, 1, 237, 40, 86, + 1, 181, 86, 1, 166, 86, 1, 210, 94, 86, 1, 249, 3, 86, 1, 248, 54, 86, 1, + 172, 86, 1, 198, 118, 86, 1, 198, 108, 86, 1, 235, 17, 86, 1, 235, 11, + 86, 1, 194, 169, 86, 1, 192, 71, 86, 1, 192, 112, 86, 1, 255, 41, 86, 1, + 168, 86, 1, 167, 86, 1, 177, 86, 1, 204, 64, 86, 1, 202, 92, 86, 1, 188, + 86, 1, 144, 86, 1, 64, 86, 1, 221, 47, 86, 1, 232, 210, 167, 86, 1, 221, + 139, 86, 1, 207, 3, 86, 18, 3, 252, 33, 86, 18, 3, 70, 86, 18, 3, 223, + 224, 86, 18, 3, 68, 86, 18, 3, 196, 251, 86, 18, 3, 118, 150, 86, 18, 3, + 118, 207, 4, 86, 18, 3, 118, 165, 86, 18, 3, 118, 219, 138, 86, 18, 3, + 71, 86, 18, 3, 234, 171, 86, 18, 3, 74, 86, 18, 3, 211, 194, 86, 3, 207, + 66, 201, 185, 214, 166, 207, 55, 86, 3, 207, 60, 248, 124, 86, 18, 3, + 207, 168, 70, 86, 18, 3, 207, 168, 223, 224, 86, 3, 212, 182, 192, 11, + 215, 85, 238, 0, 86, 3, 202, 227, 220, 44, 86, 122, 230, 80, 86, 122, + 211, 36, 86, 3, 220, 47, 206, 222, 86, 3, 193, 96, 206, 222, 86, 3, 220, + 48, 198, 119, 246, 243, 86, 3, 217, 52, 246, 243, 86, 3, 230, 192, 246, + 244, 207, 158, 86, 3, 230, 192, 217, 38, 207, 158, 86, 3, 223, 121, 217, + 52, 246, 243, 86, 201, 164, 3, 220, 48, 198, 119, 246, 243, 86, 201, 164, + 3, 217, 52, 246, 243, 86, 201, 164, 3, 223, 121, 217, 52, 246, 243, 86, + 201, 164, 1, 160, 86, 201, 164, 1, 221, 250, 86, 201, 164, 1, 231, 233, + 86, 201, 164, 1, 231, 84, 86, 201, 164, 1, 214, 165, 86, 201, 164, 1, + 247, 19, 86, 201, 164, 1, 246, 117, 86, 201, 164, 1, 223, 62, 86, 201, + 164, 1, 212, 201, 86, 201, 164, 1, 198, 83, 86, 201, 164, 1, 198, 71, 86, + 201, 164, 1, 237, 161, 86, 201, 164, 1, 237, 145, 86, 201, 164, 1, 213, + 178, 86, 201, 164, 1, 189, 86, 201, 164, 1, 199, 240, 86, 201, 164, 1, + 238, 0, 86, 201, 164, 1, 237, 40, 86, 201, 164, 1, 181, 86, 201, 164, 1, + 166, 86, 201, 164, 1, 210, 94, 86, 201, 164, 1, 249, 3, 86, 201, 164, 1, + 248, 54, 86, 201, 164, 1, 172, 86, 201, 164, 1, 198, 118, 86, 201, 164, + 1, 198, 108, 86, 201, 164, 1, 235, 17, 86, 201, 164, 1, 235, 11, 86, 201, + 164, 1, 194, 169, 86, 201, 164, 1, 192, 71, 86, 201, 164, 1, 192, 112, + 86, 201, 164, 1, 255, 41, 86, 201, 164, 1, 168, 86, 201, 164, 1, 167, 86, + 201, 164, 1, 177, 86, 201, 164, 1, 204, 64, 86, 201, 164, 1, 202, 92, 86, + 201, 164, 1, 188, 86, 201, 164, 1, 144, 86, 201, 164, 1, 64, 86, 201, + 164, 1, 221, 47, 86, 201, 164, 1, 232, 210, 194, 169, 86, 201, 164, 1, + 232, 210, 168, 86, 201, 164, 1, 232, 210, 167, 86, 221, 34, 206, 219, + 221, 250, 86, 221, 34, 206, 219, 221, 251, 247, 55, 216, 138, 246, 243, + 86, 246, 227, 3, 87, 248, 114, 86, 246, 227, 3, 152, 248, 114, 86, 246, + 227, 3, 246, 231, 200, 69, 86, 246, 227, 3, 205, 253, 255, 40, 86, 16, + 235, 78, 247, 124, 86, 16, 208, 8, 207, 67, 86, 16, 211, 63, 231, 159, + 86, 16, 208, 8, 207, 68, 207, 160, 230, 221, 86, 16, 210, 55, 166, 86, + 16, 213, 120, 247, 124, 86, 16, 213, 120, 247, 125, 212, 170, 255, 37, + 86, 16, 213, 120, 247, 125, 230, 190, 255, 37, 86, 16, 213, 120, 247, + 125, 247, 55, 255, 37, 86, 3, 208, 9, 215, 77, 208, 9, 236, 160, 86, 3, + 208, 9, 215, 77, 230, 189, 86, 122, 247, 128, 203, 205, 231, 47, 216, + 193, 207, 159, 86, 122, 216, 93, 193, 14, 231, 47, 216, 193, 207, 159, + 86, 122, 212, 170, 198, 103, 86, 122, 88, 247, 157, 207, 57, 193, 14, + 216, 193, 217, 50, 172, 86, 122, 242, 80, 247, 157, 207, 57, 193, 14, + 216, 193, 204, 71, 172, 207, 100, 201, 81, 57, 220, 27, 201, 81, 57, 207, + 100, 201, 81, 3, 4, 236, 111, 220, 27, 201, 81, 3, 4, 236, 111, 86, 122, + 220, 39, 217, 53, 206, 222, 86, 122, 198, 215, 217, 53, 206, 222, 79, 1, + 160, 79, 1, 221, 250, 79, 1, 231, 233, 79, 1, 231, 84, 79, 1, 214, 165, + 79, 1, 247, 19, 79, 1, 246, 117, 79, 1, 223, 62, 79, 1, 223, 28, 79, 1, + 212, 201, 79, 1, 213, 144, 79, 1, 198, 83, 79, 1, 198, 71, 79, 1, 237, + 161, 79, 1, 237, 145, 79, 1, 213, 178, 79, 1, 189, 79, 1, 199, 240, 79, + 1, 238, 0, 79, 1, 237, 40, 79, 1, 181, 79, 1, 166, 79, 1, 210, 94, 79, 1, + 249, 3, 79, 1, 248, 54, 79, 1, 172, 79, 1, 168, 79, 1, 167, 79, 1, 177, + 79, 1, 194, 169, 79, 1, 188, 79, 1, 144, 79, 1, 219, 137, 79, 1, 64, 79, + 1, 204, 38, 64, 79, 1, 70, 79, 1, 223, 224, 79, 1, 68, 79, 1, 196, 251, + 79, 1, 71, 79, 1, 216, 56, 71, 79, 1, 74, 79, 1, 250, 8, 79, 18, 3, 200, + 132, 252, 33, 79, 18, 3, 252, 33, 79, 18, 3, 70, 79, 18, 3, 223, 224, 79, + 18, 3, 68, 79, 18, 3, 196, 251, 79, 18, 3, 71, 79, 18, 3, 251, 63, 79, + 18, 3, 216, 56, 223, 224, 79, 18, 3, 216, 56, 74, 79, 18, 3, 234, 253, + 58, 79, 3, 250, 168, 79, 3, 78, 63, 79, 3, 196, 6, 79, 3, 196, 11, 79, 3, + 250, 58, 79, 116, 3, 217, 35, 168, 79, 116, 3, 217, 35, 167, 79, 116, 3, + 217, 35, 194, 169, 79, 116, 3, 217, 35, 144, 79, 1, 230, 206, 188, 79, + 17, 192, 76, 79, 17, 101, 79, 17, 104, 79, 17, 133, 79, 17, 134, 79, 17, + 151, 79, 17, 170, 79, 17, 179, 79, 17, 174, 79, 17, 182, 79, 3, 219, 147, + 205, 208, 79, 3, 205, 208, 79, 16, 219, 100, 79, 16, 242, 31, 79, 16, + 251, 84, 79, 16, 231, 139, 79, 1, 204, 64, 79, 1, 202, 92, 79, 1, 118, + 150, 79, 1, 118, 207, 4, 79, 1, 118, 165, 79, 1, 118, 219, 138, 79, 18, + 3, 118, 150, 79, 18, 3, 118, 207, 4, 79, 18, 3, 118, 165, 79, 18, 3, 118, + 219, 138, 79, 1, 216, 56, 214, 165, 79, 1, 216, 56, 223, 28, 79, 1, 216, + 56, 248, 159, 79, 1, 216, 56, 248, 154, 79, 116, 3, 216, 56, 217, 35, + 181, 79, 116, 3, 216, 56, 217, 35, 172, 79, 116, 3, 216, 56, 217, 35, + 177, 79, 1, 204, 70, 222, 96, 204, 64, 79, 18, 3, 204, 70, 222, 96, 233, + 230, 79, 158, 122, 204, 70, 222, 96, 230, 14, 79, 158, 122, 204, 70, 222, + 96, 222, 58, 210, 65, 79, 1, 194, 88, 209, 3, 222, 96, 199, 240, 79, 1, + 194, 88, 209, 3, 222, 96, 209, 9, 79, 18, 3, 194, 88, 209, 3, 222, 96, + 233, 230, 79, 18, 3, 194, 88, 209, 3, 222, 96, 197, 104, 79, 3, 194, 88, + 209, 3, 222, 96, 199, 17, 79, 3, 194, 88, 209, 3, 222, 96, 199, 16, 79, + 3, 194, 88, 209, 3, 222, 96, 199, 15, 79, 3, 194, 88, 209, 3, 222, 96, + 199, 14, 79, 3, 194, 88, 209, 3, 222, 96, 199, 13, 79, 1, 234, 184, 209, + 3, 222, 96, 213, 178, 79, 1, 234, 184, 209, 3, 222, 96, 192, 172, 79, 1, + 234, 184, 209, 3, 222, 96, 231, 49, 79, 18, 3, 231, 154, 222, 96, 70, 79, + 18, 3, 222, 63, 212, 0, 79, 18, 3, 222, 63, 68, 79, 18, 3, 222, 63, 234, + 171, 79, 1, 204, 38, 160, 79, 1, 204, 38, 221, 250, 79, 1, 204, 38, 231, + 233, 79, 1, 204, 38, 247, 19, 79, 1, 204, 38, 192, 112, 79, 1, 204, 38, + 212, 201, 79, 1, 204, 38, 238, 0, 79, 1, 204, 38, 181, 79, 1, 204, 38, + 210, 94, 79, 1, 204, 38, 233, 97, 79, 1, 204, 38, 249, 3, 79, 1, 204, 38, + 199, 240, 79, 1, 204, 38, 144, 79, 116, 3, 204, 38, 217, 35, 194, 169, + 79, 18, 3, 204, 38, 252, 33, 79, 18, 3, 204, 38, 71, 79, 18, 3, 204, 38, + 234, 253, 58, 79, 18, 3, 204, 38, 52, 193, 148, 79, 3, 204, 38, 199, 16, + 79, 3, 204, 38, 199, 15, 79, 3, 204, 38, 199, 13, 79, 3, 204, 38, 199, + 12, 79, 3, 204, 38, 238, 213, 199, 16, 79, 3, 204, 38, 238, 213, 199, 15, + 79, 3, 204, 38, 238, 213, 234, 91, 199, 18, 79, 1, 206, 197, 211, 46, + 233, 97, 79, 3, 206, 197, 211, 46, 199, 13, 79, 204, 38, 17, 192, 76, 79, + 204, 38, 17, 101, 79, 204, 38, 17, 104, 79, 204, 38, 17, 133, 79, 204, + 38, 17, 134, 79, 204, 38, 17, 151, 79, 204, 38, 17, 170, 79, 204, 38, 17, + 179, 79, 204, 38, 17, 174, 79, 204, 38, 17, 182, 79, 3, 221, 242, 199, + 17, 79, 3, 221, 242, 199, 15, 79, 18, 3, 251, 49, 64, 79, 18, 3, 251, 49, + 251, 63, 79, 16, 204, 38, 101, 79, 16, 204, 38, 233, 203, 98, 6, 1, 250, + 224, 98, 6, 1, 248, 207, 98, 6, 1, 231, 203, 98, 6, 1, 236, 123, 98, 6, + 1, 234, 88, 98, 6, 1, 196, 20, 98, 6, 1, 192, 79, 98, 6, 1, 200, 125, 98, + 6, 1, 223, 190, 98, 6, 1, 222, 121, 98, 6, 1, 220, 67, 98, 6, 1, 217, + 160, 98, 6, 1, 215, 51, 98, 6, 1, 211, 211, 98, 6, 1, 210, 247, 98, 6, 1, + 192, 67, 98, 6, 1, 208, 53, 98, 6, 1, 206, 40, 98, 6, 1, 200, 112, 98, 6, + 1, 197, 77, 98, 6, 1, 210, 86, 98, 6, 1, 221, 237, 98, 6, 1, 231, 75, 98, + 6, 1, 208, 224, 98, 6, 1, 203, 224, 98, 6, 1, 242, 201, 98, 6, 1, 246, + 243, 98, 6, 1, 223, 10, 98, 6, 1, 242, 138, 98, 6, 1, 246, 101, 98, 6, 1, + 193, 207, 98, 6, 1, 223, 25, 98, 6, 1, 230, 95, 98, 6, 1, 229, 255, 98, + 6, 1, 229, 165, 98, 6, 1, 194, 111, 98, 6, 1, 230, 28, 98, 6, 1, 229, 31, + 98, 6, 1, 193, 3, 98, 6, 1, 251, 97, 98, 1, 250, 224, 98, 1, 248, 207, + 98, 1, 231, 203, 98, 1, 236, 123, 98, 1, 234, 88, 98, 1, 196, 20, 98, 1, + 192, 79, 98, 1, 200, 125, 98, 1, 223, 190, 98, 1, 222, 121, 98, 1, 220, + 67, 98, 1, 217, 160, 98, 1, 215, 51, 98, 1, 211, 211, 98, 1, 210, 247, + 98, 1, 192, 67, 98, 1, 208, 53, 98, 1, 206, 40, 98, 1, 200, 112, 98, 1, + 197, 77, 98, 1, 210, 86, 98, 1, 221, 237, 98, 1, 231, 75, 98, 1, 208, + 224, 98, 1, 203, 224, 98, 1, 242, 201, 98, 1, 246, 243, 98, 1, 223, 10, + 98, 1, 242, 138, 98, 1, 246, 101, 98, 1, 193, 207, 98, 1, 223, 25, 98, 1, + 230, 95, 98, 1, 229, 255, 98, 1, 229, 165, 98, 1, 194, 111, 98, 1, 230, + 28, 98, 1, 229, 31, 98, 1, 233, 11, 98, 1, 193, 3, 98, 1, 234, 107, 98, + 1, 163, 231, 203, 98, 1, 251, 57, 98, 210, 244, 204, 165, 73, 1, 98, 215, + 51, 98, 1, 251, 97, 98, 1, 230, 26, 57, 98, 1, 220, 175, 57, 30, 143, + 221, 151, 30, 143, 202, 84, 30, 143, 214, 45, 30, 143, 199, 103, 30, 143, + 202, 73, 30, 143, 207, 133, 30, 143, 216, 153, 30, 143, 210, 36, 30, 143, + 202, 81, 30, 143, 203, 64, 30, 143, 202, 78, 30, 143, 223, 247, 30, 143, + 242, 144, 30, 143, 202, 88, 30, 143, 242, 211, 30, 143, 221, 225, 30, + 143, 199, 198, 30, 143, 210, 75, 30, 143, 229, 162, 30, 143, 214, 41, 30, + 143, 202, 82, 30, 143, 214, 35, 30, 143, 214, 39, 30, 143, 199, 100, 30, + 143, 207, 121, 30, 143, 202, 80, 30, 143, 207, 131, 30, 143, 222, 102, + 30, 143, 216, 146, 30, 143, 222, 105, 30, 143, 210, 31, 30, 143, 210, 29, + 30, 143, 210, 17, 30, 143, 210, 25, 30, 143, 210, 23, 30, 143, 210, 20, + 30, 143, 210, 22, 30, 143, 210, 19, 30, 143, 210, 24, 30, 143, 210, 34, + 30, 143, 210, 35, 30, 143, 210, 18, 30, 143, 210, 28, 30, 143, 222, 103, + 30, 143, 222, 101, 30, 143, 203, 57, 30, 143, 203, 55, 30, 143, 203, 47, + 30, 143, 203, 50, 30, 143, 203, 56, 30, 143, 203, 52, 30, 143, 203, 51, + 30, 143, 203, 49, 30, 143, 203, 60, 30, 143, 203, 62, 30, 143, 203, 63, + 30, 143, 203, 58, 30, 143, 203, 48, 30, 143, 203, 53, 30, 143, 203, 61, + 30, 143, 242, 192, 30, 143, 242, 190, 30, 143, 246, 130, 30, 143, 246, + 128, 30, 143, 211, 8, 30, 143, 223, 242, 30, 143, 223, 233, 30, 143, 223, + 241, 30, 143, 223, 238, 30, 143, 223, 236, 30, 143, 223, 240, 30, 143, + 202, 85, 30, 143, 223, 245, 30, 143, 223, 246, 30, 143, 223, 234, 30, + 143, 223, 239, 30, 143, 193, 46, 30, 143, 242, 143, 30, 143, 242, 193, + 30, 143, 242, 191, 30, 143, 246, 131, 30, 143, 246, 129, 30, 143, 242, + 209, 30, 143, 242, 210, 30, 143, 242, 194, 30, 143, 246, 132, 30, 143, + 210, 73, 30, 143, 222, 104, 30, 143, 202, 86, 30, 143, 193, 52, 30, 143, + 221, 142, 30, 143, 214, 37, 30, 143, 214, 43, 30, 143, 214, 42, 30, 143, + 199, 97, 30, 143, 232, 247, 30, 222, 206, 232, 247, 30, 222, 206, 64, 30, + 222, 206, 251, 108, 30, 222, 206, 168, 30, 222, 206, 193, 118, 30, 222, + 206, 234, 50, 30, 222, 206, 71, 30, 222, 206, 193, 56, 30, 222, 206, 193, + 69, 30, 222, 206, 74, 30, 222, 206, 194, 169, 30, 222, 206, 194, 160, 30, + 222, 206, 212, 0, 30, 222, 206, 193, 1, 30, 222, 206, 68, 30, 222, 206, + 194, 93, 30, 222, 206, 194, 111, 30, 222, 206, 194, 72, 30, 222, 206, + 192, 214, 30, 222, 206, 233, 230, 30, 222, 206, 193, 22, 30, 222, 206, + 70, 30, 222, 206, 255, 29, 30, 222, 206, 255, 28, 30, 222, 206, 193, 132, + 30, 222, 206, 193, 130, 30, 222, 206, 234, 48, 30, 222, 206, 234, 47, 30, + 222, 206, 234, 49, 30, 222, 206, 193, 55, 30, 222, 206, 193, 54, 30, 222, + 206, 212, 110, 30, 222, 206, 212, 111, 30, 222, 206, 212, 104, 30, 222, + 206, 212, 109, 30, 222, 206, 212, 107, 30, 222, 206, 192, 245, 30, 222, + 206, 192, 244, 30, 222, 206, 192, 243, 30, 222, 206, 192, 246, 30, 222, + 206, 192, 247, 30, 222, 206, 197, 177, 30, 222, 206, 197, 176, 30, 222, + 206, 197, 174, 30, 222, 206, 197, 170, 30, 222, 206, 197, 171, 30, 222, + 206, 192, 209, 30, 222, 206, 192, 206, 30, 222, 206, 192, 207, 30, 222, + 206, 192, 201, 30, 222, 206, 192, 202, 30, 222, 206, 192, 203, 30, 222, + 206, 192, 205, 30, 222, 206, 233, 224, 30, 222, 206, 233, 226, 30, 222, + 206, 193, 21, 30, 222, 206, 228, 92, 30, 222, 206, 228, 84, 30, 222, 206, + 228, 87, 30, 222, 206, 228, 85, 30, 222, 206, 228, 89, 30, 222, 206, 228, + 91, 30, 222, 206, 250, 123, 30, 222, 206, 250, 120, 30, 222, 206, 250, + 118, 30, 222, 206, 250, 119, 30, 222, 206, 202, 89, 30, 222, 206, 255, + 30, 30, 222, 206, 193, 131, 30, 222, 206, 193, 53, 30, 222, 206, 212, + 106, 30, 222, 206, 212, 105, 30, 123, 221, 151, 30, 123, 202, 84, 30, + 123, 221, 144, 30, 123, 214, 45, 30, 123, 214, 43, 30, 123, 214, 42, 30, + 123, 199, 103, 30, 123, 207, 133, 30, 123, 207, 128, 30, 123, 207, 125, + 30, 123, 207, 118, 30, 123, 207, 113, 30, 123, 207, 108, 30, 123, 207, + 119, 30, 123, 207, 131, 30, 123, 216, 153, 30, 123, 210, 36, 30, 123, + 210, 25, 30, 123, 203, 64, 30, 123, 202, 78, 30, 123, 223, 247, 30, 123, + 242, 144, 30, 123, 242, 211, 30, 123, 221, 225, 30, 123, 199, 198, 30, + 123, 210, 75, 30, 123, 229, 162, 30, 123, 221, 145, 30, 123, 221, 143, + 30, 123, 214, 41, 30, 123, 214, 35, 30, 123, 214, 37, 30, 123, 214, 40, + 30, 123, 214, 36, 30, 123, 199, 100, 30, 123, 199, 97, 30, 123, 207, 126, + 30, 123, 207, 121, 30, 123, 207, 107, 30, 123, 207, 106, 30, 123, 202, + 80, 30, 123, 207, 123, 30, 123, 207, 122, 30, 123, 207, 115, 30, 123, + 207, 117, 30, 123, 207, 130, 30, 123, 207, 110, 30, 123, 207, 120, 30, + 123, 207, 129, 30, 123, 207, 105, 30, 123, 216, 149, 30, 123, 216, 144, + 30, 123, 216, 146, 30, 123, 216, 143, 30, 123, 216, 141, 30, 123, 216, + 147, 30, 123, 216, 152, 30, 123, 216, 150, 30, 123, 222, 105, 30, 123, + 210, 27, 30, 123, 210, 28, 30, 123, 210, 33, 30, 123, 222, 103, 30, 123, + 203, 57, 30, 123, 203, 47, 30, 123, 203, 50, 30, 123, 203, 52, 30, 123, + 211, 8, 30, 123, 223, 242, 30, 123, 223, 235, 30, 123, 202, 85, 30, 123, + 223, 243, 30, 123, 193, 46, 30, 123, 193, 40, 30, 123, 193, 41, 30, 123, + 210, 73, 30, 123, 222, 104, 30, 123, 229, 160, 30, 123, 229, 158, 30, + 123, 229, 161, 30, 123, 229, 159, 30, 123, 193, 52, 30, 123, 221, 147, + 30, 123, 221, 146, 30, 123, 221, 150, 30, 123, 221, 148, 30, 123, 221, + 149, 30, 123, 202, 82, 36, 5, 144, 36, 5, 228, 181, 36, 5, 229, 178, 36, + 5, 230, 99, 36, 5, 229, 225, 36, 5, 229, 255, 36, 5, 229, 43, 36, 5, 229, + 34, 36, 5, 177, 36, 5, 219, 36, 36, 5, 219, 209, 36, 5, 220, 184, 36, 5, + 220, 32, 36, 5, 220, 42, 36, 5, 219, 107, 36, 5, 219, 3, 36, 5, 229, 187, + 36, 5, 229, 181, 36, 5, 229, 183, 36, 5, 229, 186, 36, 5, 229, 184, 36, + 5, 229, 185, 36, 5, 229, 182, 36, 5, 229, 180, 36, 5, 172, 36, 5, 215, + 241, 36, 5, 216, 175, 36, 5, 217, 219, 36, 5, 217, 29, 36, 5, 217, 48, + 36, 5, 216, 91, 36, 5, 215, 168, 36, 5, 200, 239, 36, 5, 200, 233, 36, 5, + 200, 235, 36, 5, 200, 238, 36, 5, 200, 236, 36, 5, 200, 237, 36, 5, 200, + 234, 36, 5, 200, 232, 36, 5, 167, 36, 5, 206, 218, 36, 5, 207, 151, 36, + 5, 208, 68, 36, 5, 207, 234, 36, 5, 208, 7, 36, 5, 207, 55, 36, 5, 206, + 176, 36, 5, 188, 36, 5, 201, 184, 36, 5, 203, 125, 36, 5, 206, 91, 36, 5, + 205, 205, 36, 5, 205, 223, 36, 5, 202, 212, 36, 5, 201, 79, 36, 5, 204, + 64, 36, 5, 203, 164, 36, 5, 203, 236, 36, 5, 204, 59, 36, 5, 204, 10, 36, + 5, 204, 12, 36, 5, 203, 211, 36, 5, 203, 143, 36, 5, 208, 239, 36, 5, + 208, 177, 36, 5, 208, 201, 36, 5, 208, 238, 36, 5, 208, 218, 36, 5, 208, + 219, 36, 5, 208, 189, 36, 5, 208, 188, 36, 5, 208, 130, 36, 5, 208, 126, + 36, 5, 208, 129, 36, 5, 208, 127, 36, 5, 208, 128, 36, 5, 208, 215, 36, + 5, 208, 207, 36, 5, 208, 210, 36, 5, 208, 214, 36, 5, 208, 211, 36, 5, + 208, 212, 36, 5, 208, 209, 36, 5, 208, 206, 36, 5, 208, 202, 36, 5, 208, + 205, 36, 5, 208, 203, 36, 5, 208, 204, 36, 5, 249, 3, 36, 5, 247, 124, + 36, 5, 248, 41, 36, 5, 249, 1, 36, 5, 248, 108, 36, 5, 248, 123, 36, 5, + 247, 220, 36, 5, 247, 69, 36, 5, 196, 157, 36, 5, 194, 223, 36, 5, 196, + 39, 36, 5, 196, 156, 36, 5, 196, 118, 36, 5, 196, 123, 36, 5, 195, 252, + 36, 5, 194, 212, 36, 5, 189, 36, 5, 198, 45, 36, 5, 199, 128, 36, 5, 200, + 174, 36, 5, 200, 56, 36, 5, 200, 79, 36, 5, 155, 36, 5, 197, 250, 36, 5, + 247, 19, 36, 5, 238, 162, 36, 5, 242, 149, 36, 5, 247, 18, 36, 5, 246, + 150, 36, 5, 246, 158, 36, 5, 242, 63, 36, 5, 238, 118, 36, 5, 193, 209, + 36, 5, 193, 177, 36, 5, 193, 196, 36, 5, 193, 208, 36, 5, 193, 202, 36, + 5, 193, 203, 36, 5, 193, 185, 36, 5, 193, 184, 36, 5, 193, 170, 36, 5, + 193, 166, 36, 5, 193, 169, 36, 5, 193, 167, 36, 5, 193, 168, 36, 5, 181, + 36, 5, 213, 22, 36, 5, 214, 60, 36, 5, 215, 84, 36, 5, 214, 203, 36, 5, + 214, 214, 36, 5, 213, 142, 36, 5, 212, 210, 36, 5, 212, 201, 36, 5, 212, + 158, 36, 5, 212, 181, 36, 5, 212, 200, 36, 5, 212, 189, 36, 5, 212, 190, + 36, 5, 212, 165, 36, 5, 212, 148, 36, 5, 231, 6, 64, 36, 5, 231, 6, 68, + 36, 5, 231, 6, 70, 36, 5, 231, 6, 252, 33, 36, 5, 231, 6, 234, 171, 36, + 5, 231, 6, 71, 36, 5, 231, 6, 74, 36, 5, 231, 6, 194, 169, 36, 5, 160, + 36, 5, 221, 33, 36, 5, 221, 204, 36, 5, 222, 159, 36, 5, 222, 48, 36, 5, + 222, 57, 36, 5, 221, 113, 36, 5, 221, 108, 36, 5, 220, 238, 36, 5, 220, + 231, 36, 5, 220, 237, 36, 5, 220, 232, 36, 5, 220, 233, 36, 5, 220, 224, + 36, 5, 220, 218, 36, 5, 220, 220, 36, 5, 220, 223, 36, 5, 220, 221, 36, + 5, 220, 222, 36, 5, 220, 219, 36, 5, 220, 217, 36, 5, 220, 213, 36, 5, + 220, 216, 36, 5, 220, 214, 36, 5, 220, 215, 36, 5, 194, 169, 36, 5, 193, + 244, 36, 5, 194, 72, 36, 5, 194, 163, 36, 5, 194, 100, 36, 5, 194, 111, + 36, 5, 194, 36, 36, 5, 194, 28, 36, 5, 210, 85, 64, 36, 5, 210, 85, 68, + 36, 5, 210, 85, 70, 36, 5, 210, 85, 252, 33, 36, 5, 210, 85, 234, 171, + 36, 5, 210, 85, 71, 36, 5, 210, 85, 74, 36, 5, 192, 112, 36, 5, 191, 252, + 36, 5, 192, 30, 36, 5, 192, 110, 36, 5, 192, 82, 36, 5, 192, 85, 36, 5, + 192, 8, 36, 5, 191, 239, 36, 5, 192, 71, 36, 5, 192, 48, 36, 5, 192, 57, + 36, 5, 192, 70, 36, 5, 192, 61, 36, 5, 192, 62, 36, 5, 192, 54, 36, 5, + 192, 39, 36, 5, 168, 36, 5, 192, 214, 36, 5, 193, 22, 36, 5, 193, 129, + 36, 5, 193, 66, 36, 5, 193, 69, 36, 5, 193, 1, 36, 5, 192, 241, 36, 5, + 238, 0, 36, 5, 235, 62, 36, 5, 237, 16, 36, 5, 237, 255, 36, 5, 237, 101, + 36, 5, 237, 116, 36, 5, 236, 146, 36, 5, 235, 28, 36, 5, 237, 161, 36, 5, + 237, 126, 36, 5, 237, 138, 36, 5, 237, 160, 36, 5, 237, 148, 36, 5, 237, + 149, 36, 5, 237, 131, 36, 5, 237, 117, 36, 5, 223, 62, 36, 5, 222, 214, + 36, 5, 223, 20, 36, 5, 223, 61, 36, 5, 223, 39, 36, 5, 223, 41, 36, 5, + 222, 233, 36, 5, 222, 192, 36, 5, 231, 233, 36, 5, 230, 186, 36, 5, 231, + 46, 36, 5, 231, 230, 36, 5, 231, 150, 36, 5, 231, 158, 36, 5, 230, 254, + 36, 5, 230, 253, 36, 5, 230, 143, 36, 5, 230, 139, 36, 5, 230, 142, 36, + 5, 230, 140, 36, 5, 230, 141, 36, 5, 231, 120, 36, 5, 231, 100, 36, 5, + 231, 110, 36, 5, 231, 119, 36, 5, 231, 114, 36, 5, 231, 115, 36, 5, 231, + 104, 36, 5, 231, 89, 36, 5, 199, 240, 36, 5, 199, 148, 36, 5, 199, 202, + 36, 5, 199, 239, 36, 5, 199, 222, 36, 5, 199, 224, 36, 5, 199, 176, 36, + 5, 199, 139, 36, 5, 246, 117, 36, 5, 242, 168, 36, 5, 242, 215, 36, 5, + 246, 116, 36, 5, 242, 241, 36, 5, 242, 245, 36, 5, 242, 188, 36, 5, 242, + 157, 36, 5, 210, 94, 36, 5, 210, 57, 36, 5, 210, 77, 36, 5, 210, 93, 36, + 5, 210, 79, 36, 5, 210, 80, 36, 5, 210, 65, 36, 5, 210, 53, 36, 5, 198, + 118, 36, 5, 198, 91, 36, 5, 198, 97, 36, 5, 198, 117, 36, 5, 198, 111, + 36, 5, 198, 112, 36, 5, 198, 95, 36, 5, 198, 89, 36, 5, 197, 191, 36, 5, + 197, 183, 36, 5, 197, 187, 36, 5, 197, 190, 36, 5, 197, 188, 36, 5, 197, + 189, 36, 5, 197, 185, 36, 5, 197, 184, 36, 5, 233, 97, 36, 5, 232, 77, + 36, 5, 233, 11, 36, 5, 233, 96, 36, 5, 233, 40, 36, 5, 233, 47, 36, 5, + 232, 164, 36, 5, 232, 55, 36, 5, 166, 36, 5, 209, 51, 36, 5, 210, 51, 36, + 5, 211, 77, 36, 5, 210, 168, 36, 5, 210, 181, 36, 5, 209, 198, 36, 5, + 209, 9, 36, 5, 206, 166, 36, 5, 215, 157, 36, 5, 232, 49, 36, 38, 231, + 146, 26, 18, 220, 2, 77, 36, 38, 18, 220, 2, 77, 36, 38, 231, 146, 77, + 36, 205, 209, 77, 36, 194, 10, 36, 232, 71, 201, 238, 36, 242, 38, 36, + 204, 180, 36, 242, 47, 36, 209, 112, 242, 47, 36, 208, 159, 77, 36, 210, + 244, 204, 165, 36, 17, 101, 36, 17, 104, 36, 17, 133, 36, 17, 134, 36, + 17, 151, 36, 17, 170, 36, 17, 179, 36, 17, 174, 36, 17, 182, 36, 31, 200, + 30, 36, 31, 197, 239, 36, 31, 199, 184, 36, 31, 232, 126, 36, 31, 233, 3, + 36, 31, 203, 25, 36, 31, 204, 140, 36, 31, 234, 137, 36, 31, 214, 11, 36, + 31, 228, 162, 36, 31, 200, 31, 180, 36, 5, 205, 214, 215, 168, 36, 5, + 215, 164, 36, 5, 215, 165, 36, 5, 215, 166, 36, 5, 205, 214, 247, 69, 36, + 5, 247, 66, 36, 5, 247, 67, 36, 5, 247, 68, 36, 5, 205, 214, 232, 55, 36, + 5, 232, 51, 36, 5, 232, 52, 36, 5, 232, 53, 36, 5, 205, 214, 209, 9, 36, + 5, 209, 5, 36, 5, 209, 6, 36, 5, 209, 7, 36, 199, 19, 122, 193, 4, 36, + 199, 19, 122, 237, 61, 36, 199, 19, 122, 207, 87, 36, 199, 19, 122, 203, + 195, 207, 87, 36, 199, 19, 122, 236, 246, 36, 199, 19, 122, 222, 29, 36, + 199, 19, 122, 242, 196, 36, 199, 19, 122, 229, 167, 36, 199, 19, 122, + 237, 60, 36, 199, 19, 122, 220, 254, 99, 1, 64, 99, 1, 71, 99, 1, 70, 99, + 1, 74, 99, 1, 68, 99, 1, 196, 236, 99, 1, 231, 233, 99, 1, 160, 99, 1, + 231, 158, 99, 1, 231, 46, 99, 1, 230, 254, 99, 1, 230, 186, 99, 1, 230, + 146, 99, 1, 144, 99, 1, 229, 255, 99, 1, 229, 178, 99, 1, 229, 43, 99, 1, + 228, 181, 99, 1, 228, 148, 99, 1, 177, 99, 1, 220, 42, 99, 1, 219, 209, + 99, 1, 219, 107, 99, 1, 219, 36, 99, 1, 219, 4, 99, 1, 172, 99, 1, 217, + 48, 99, 1, 216, 175, 99, 1, 216, 91, 99, 1, 215, 241, 99, 1, 181, 99, 1, + 229, 67, 99, 1, 215, 71, 99, 1, 214, 214, 99, 1, 214, 60, 99, 1, 213, + 142, 99, 1, 213, 22, 99, 1, 212, 212, 99, 1, 208, 176, 99, 1, 208, 162, + 99, 1, 208, 155, 99, 1, 208, 145, 99, 1, 208, 134, 99, 1, 208, 132, 99, + 1, 188, 99, 1, 206, 158, 99, 1, 205, 223, 99, 1, 203, 125, 99, 1, 202, + 212, 99, 1, 201, 184, 99, 1, 201, 84, 99, 1, 238, 0, 99, 1, 189, 99, 1, + 237, 116, 99, 1, 200, 79, 99, 1, 237, 16, 99, 1, 199, 128, 99, 1, 236, + 146, 99, 1, 235, 62, 99, 1, 235, 31, 99, 1, 236, 158, 99, 1, 199, 53, 99, + 1, 199, 52, 99, 1, 199, 41, 99, 1, 199, 40, 99, 1, 199, 39, 99, 1, 199, + 38, 99, 1, 198, 118, 99, 1, 198, 112, 99, 1, 198, 97, 99, 1, 198, 95, 99, + 1, 198, 91, 99, 1, 198, 90, 99, 1, 194, 169, 99, 1, 194, 111, 99, 1, 194, + 72, 99, 1, 194, 36, 99, 1, 193, 244, 99, 1, 193, 231, 99, 1, 168, 99, 1, + 193, 69, 99, 1, 193, 22, 99, 1, 193, 1, 99, 1, 192, 214, 99, 1, 192, 173, + 99, 1, 215, 175, 99, 2, 1, 193, 69, 99, 2, 1, 193, 22, 99, 2, 1, 193, 1, + 99, 2, 1, 192, 214, 99, 2, 1, 192, 173, 99, 2, 1, 215, 175, 21, 22, 228, + 111, 21, 22, 71, 21, 22, 251, 253, 21, 22, 70, 21, 22, 223, 224, 21, 22, + 74, 21, 22, 211, 194, 21, 22, 193, 147, 211, 194, 21, 22, 96, 234, 171, + 21, 22, 96, 70, 21, 22, 64, 21, 22, 252, 33, 21, 22, 194, 111, 21, 22, + 194, 89, 194, 111, 21, 22, 194, 72, 21, 22, 194, 89, 194, 72, 21, 22, + 194, 56, 21, 22, 194, 89, 194, 56, 21, 22, 194, 36, 21, 22, 194, 89, 194, + 36, 21, 22, 194, 17, 21, 22, 194, 89, 194, 17, 21, 22, 215, 45, 194, 17, + 21, 22, 194, 169, 21, 22, 194, 89, 194, 169, 21, 22, 194, 163, 21, 22, + 194, 89, 194, 163, 21, 22, 215, 45, 194, 163, 21, 22, 251, 63, 21, 22, + 193, 147, 194, 202, 21, 22, 231, 6, 201, 238, 21, 22, 52, 251, 129, 21, + 22, 52, 230, 210, 21, 22, 52, 247, 188, 138, 207, 81, 21, 22, 52, 198, + 249, 138, 207, 81, 21, 22, 52, 51, 138, 207, 81, 21, 22, 52, 207, 81, 21, + 22, 52, 55, 251, 129, 21, 22, 52, 55, 203, 195, 84, 201, 195, 21, 22, 52, + 85, 236, 114, 21, 22, 52, 203, 195, 229, 5, 111, 21, 22, 52, 209, 206, + 21, 22, 52, 142, 200, 159, 21, 22, 234, 88, 21, 22, 223, 190, 21, 22, + 211, 211, 21, 22, 250, 224, 21, 22, 210, 181, 21, 22, 211, 75, 21, 22, + 210, 51, 21, 22, 210, 12, 21, 22, 209, 198, 21, 22, 209, 172, 21, 22, + 193, 147, 209, 172, 21, 22, 96, 229, 225, 21, 22, 96, 229, 178, 21, 22, + 166, 21, 22, 211, 77, 21, 22, 209, 7, 21, 22, 194, 89, 209, 7, 21, 22, + 209, 5, 21, 22, 194, 89, 209, 5, 21, 22, 209, 4, 21, 22, 194, 89, 209, 4, + 21, 22, 209, 2, 21, 22, 194, 89, 209, 2, 21, 22, 209, 1, 21, 22, 194, 89, + 209, 1, 21, 22, 209, 9, 21, 22, 194, 89, 209, 9, 21, 22, 209, 8, 21, 22, + 194, 89, 209, 8, 21, 22, 193, 147, 209, 8, 21, 22, 211, 93, 21, 22, 194, + 89, 211, 93, 21, 22, 96, 230, 124, 21, 22, 200, 79, 21, 22, 200, 172, 21, + 22, 199, 128, 21, 22, 199, 105, 21, 22, 155, 21, 22, 198, 254, 21, 22, + 193, 147, 198, 254, 21, 22, 96, 237, 101, 21, 22, 96, 237, 16, 21, 22, + 189, 21, 22, 200, 174, 21, 22, 197, 248, 21, 22, 194, 89, 197, 248, 21, + 22, 197, 226, 21, 22, 194, 89, 197, 226, 21, 22, 197, 225, 21, 22, 194, + 89, 197, 225, 21, 22, 104, 21, 22, 194, 89, 104, 21, 22, 197, 216, 21, + 22, 194, 89, 197, 216, 21, 22, 197, 250, 21, 22, 194, 89, 197, 250, 21, + 22, 197, 249, 21, 22, 194, 89, 197, 249, 21, 22, 215, 45, 197, 249, 21, + 22, 200, 228, 21, 22, 198, 78, 21, 22, 198, 62, 21, 22, 198, 60, 21, 22, + 198, 83, 21, 22, 222, 57, 21, 22, 222, 153, 21, 22, 221, 204, 21, 22, + 221, 183, 21, 22, 221, 113, 21, 22, 221, 88, 21, 22, 193, 147, 221, 88, + 21, 22, 160, 21, 22, 222, 159, 21, 22, 220, 233, 21, 22, 194, 89, 220, + 233, 21, 22, 220, 231, 21, 22, 194, 89, 220, 231, 21, 22, 220, 230, 21, + 22, 194, 89, 220, 230, 21, 22, 220, 228, 21, 22, 194, 89, 220, 228, 21, + 22, 220, 227, 21, 22, 194, 89, 220, 227, 21, 22, 220, 238, 21, 22, 194, + 89, 220, 238, 21, 22, 220, 237, 21, 22, 194, 89, 220, 237, 21, 22, 215, + 45, 220, 237, 21, 22, 222, 184, 21, 22, 220, 239, 21, 22, 202, 170, 222, + 41, 21, 22, 202, 170, 221, 184, 21, 22, 202, 170, 221, 103, 21, 22, 202, + 170, 222, 137, 21, 22, 246, 158, 21, 22, 247, 17, 21, 22, 242, 149, 21, + 22, 242, 139, 21, 22, 242, 63, 21, 22, 238, 239, 21, 22, 193, 147, 238, + 239, 21, 22, 247, 19, 21, 22, 247, 18, 21, 22, 238, 116, 21, 22, 194, 89, + 238, 116, 21, 22, 238, 114, 21, 22, 194, 89, 238, 114, 21, 22, 238, 113, + 21, 22, 194, 89, 238, 113, 21, 22, 238, 112, 21, 22, 194, 89, 238, 112, + 21, 22, 238, 111, 21, 22, 194, 89, 238, 111, 21, 22, 238, 118, 21, 22, + 194, 89, 238, 118, 21, 22, 238, 117, 21, 22, 194, 89, 238, 117, 21, 22, + 215, 45, 238, 117, 21, 22, 247, 52, 21, 22, 205, 255, 199, 242, 21, 22, + 217, 48, 21, 22, 217, 218, 21, 22, 216, 175, 21, 22, 216, 137, 21, 22, + 216, 91, 21, 22, 216, 35, 21, 22, 193, 147, 216, 35, 21, 22, 172, 21, 22, + 217, 219, 21, 22, 215, 166, 21, 22, 194, 89, 215, 166, 21, 22, 215, 164, + 21, 22, 194, 89, 215, 164, 21, 22, 215, 163, 21, 22, 194, 89, 215, 163, + 21, 22, 215, 162, 21, 22, 194, 89, 215, 162, 21, 22, 215, 161, 21, 22, + 194, 89, 215, 161, 21, 22, 215, 168, 21, 22, 194, 89, 215, 168, 21, 22, + 215, 167, 21, 22, 194, 89, 215, 167, 21, 22, 215, 45, 215, 167, 21, 22, + 218, 236, 21, 22, 194, 89, 218, 236, 21, 22, 216, 179, 21, 22, 250, 24, + 218, 236, 21, 22, 205, 255, 218, 236, 21, 22, 214, 214, 21, 22, 215, 83, + 21, 22, 214, 60, 21, 22, 214, 27, 21, 22, 213, 142, 21, 22, 213, 125, 21, + 22, 193, 147, 213, 125, 21, 22, 181, 21, 22, 215, 84, 21, 22, 212, 208, + 21, 22, 194, 89, 212, 208, 21, 22, 212, 210, 21, 22, 194, 89, 212, 210, + 21, 22, 212, 209, 21, 22, 194, 89, 212, 209, 21, 22, 215, 45, 212, 209, + 21, 22, 215, 151, 21, 22, 96, 214, 167, 21, 22, 214, 66, 21, 22, 220, 42, + 21, 22, 220, 183, 21, 22, 219, 209, 21, 22, 219, 191, 21, 22, 219, 107, + 21, 22, 219, 73, 21, 22, 193, 147, 219, 73, 21, 22, 177, 21, 22, 220, + 184, 21, 22, 219, 1, 21, 22, 194, 89, 219, 1, 21, 22, 219, 0, 21, 22, + 194, 89, 219, 0, 21, 22, 218, 255, 21, 22, 194, 89, 218, 255, 21, 22, + 218, 254, 21, 22, 194, 89, 218, 254, 21, 22, 218, 253, 21, 22, 194, 89, + 218, 253, 21, 22, 219, 3, 21, 22, 194, 89, 219, 3, 21, 22, 219, 2, 21, + 22, 194, 89, 219, 2, 21, 22, 165, 21, 22, 194, 89, 165, 21, 22, 217, 35, + 165, 21, 22, 205, 223, 21, 22, 206, 89, 21, 22, 203, 125, 21, 22, 203, + 97, 21, 22, 202, 212, 21, 22, 202, 183, 21, 22, 193, 147, 202, 183, 21, + 22, 188, 21, 22, 206, 91, 21, 22, 201, 74, 21, 22, 194, 89, 201, 74, 21, + 22, 201, 68, 21, 22, 194, 89, 201, 68, 21, 22, 201, 67, 21, 22, 194, 89, + 201, 67, 21, 22, 201, 62, 21, 22, 194, 89, 201, 62, 21, 22, 201, 61, 21, + 22, 194, 89, 201, 61, 21, 22, 201, 79, 21, 22, 194, 89, 201, 79, 21, 22, + 201, 78, 21, 22, 194, 89, 201, 78, 21, 22, 215, 45, 201, 78, 21, 22, 206, + 158, 21, 22, 250, 24, 206, 158, 21, 22, 201, 80, 21, 22, 247, 245, 206, + 158, 21, 22, 216, 28, 203, 19, 21, 22, 215, 45, 203, 8, 21, 22, 215, 45, + 206, 156, 21, 22, 215, 45, 202, 108, 21, 22, 215, 45, 201, 187, 21, 22, + 215, 45, 203, 7, 21, 22, 215, 45, 205, 226, 21, 22, 204, 12, 21, 22, 203, + 236, 21, 22, 203, 231, 21, 22, 203, 211, 21, 22, 203, 203, 21, 22, 204, + 64, 21, 22, 204, 59, 21, 22, 203, 140, 21, 22, 194, 89, 203, 140, 21, 22, + 203, 139, 21, 22, 194, 89, 203, 139, 21, 22, 203, 138, 21, 22, 194, 89, + 203, 138, 21, 22, 203, 137, 21, 22, 194, 89, 203, 137, 21, 22, 203, 136, + 21, 22, 194, 89, 203, 136, 21, 22, 203, 143, 21, 22, 194, 89, 203, 143, + 21, 22, 203, 142, 21, 22, 194, 89, 203, 142, 21, 22, 204, 66, 21, 22, + 193, 69, 21, 22, 193, 127, 21, 22, 193, 22, 21, 22, 193, 12, 21, 22, 193, + 1, 21, 22, 192, 235, 21, 22, 193, 147, 192, 235, 21, 22, 168, 21, 22, + 193, 129, 21, 22, 192, 170, 21, 22, 194, 89, 192, 170, 21, 22, 192, 169, + 21, 22, 194, 89, 192, 169, 21, 22, 192, 168, 21, 22, 194, 89, 192, 168, + 21, 22, 192, 167, 21, 22, 194, 89, 192, 167, 21, 22, 192, 166, 21, 22, + 194, 89, 192, 166, 21, 22, 192, 172, 21, 22, 194, 89, 192, 172, 21, 22, + 192, 171, 21, 22, 194, 89, 192, 171, 21, 22, 215, 45, 192, 171, 21, 22, + 193, 148, 21, 22, 248, 39, 193, 148, 21, 22, 194, 89, 193, 148, 21, 22, + 205, 255, 193, 22, 21, 22, 208, 7, 21, 22, 208, 111, 208, 7, 21, 22, 194, + 89, 220, 42, 21, 22, 208, 67, 21, 22, 207, 151, 21, 22, 207, 88, 21, 22, + 207, 55, 21, 22, 207, 28, 21, 22, 194, 89, 219, 107, 21, 22, 167, 21, 22, + 208, 68, 21, 22, 194, 89, 177, 21, 22, 206, 175, 21, 22, 194, 89, 206, + 175, 21, 22, 150, 21, 22, 194, 89, 150, 21, 22, 217, 35, 150, 21, 22, + 233, 47, 21, 22, 233, 94, 21, 22, 233, 11, 21, 22, 232, 252, 21, 22, 232, + 164, 21, 22, 232, 152, 21, 22, 233, 97, 21, 22, 233, 96, 21, 22, 232, 54, + 21, 22, 194, 89, 232, 54, 21, 22, 233, 163, 21, 22, 199, 224, 21, 22, + 215, 149, 199, 224, 21, 22, 199, 202, 21, 22, 215, 149, 199, 202, 21, 22, + 199, 196, 21, 22, 215, 149, 199, 196, 21, 22, 199, 176, 21, 22, 199, 170, + 21, 22, 199, 240, 21, 22, 199, 239, 21, 22, 199, 138, 21, 22, 194, 89, + 199, 138, 21, 22, 199, 242, 21, 22, 198, 69, 21, 22, 198, 67, 21, 22, + 198, 66, 21, 22, 198, 71, 21, 22, 198, 72, 21, 22, 197, 209, 21, 22, 197, + 208, 21, 22, 197, 207, 21, 22, 197, 211, 21, 22, 212, 229, 229, 255, 21, + 22, 212, 229, 229, 178, 21, 22, 212, 229, 229, 150, 21, 22, 212, 229, + 229, 43, 21, 22, 212, 229, 229, 16, 21, 22, 212, 229, 144, 21, 22, 212, + 229, 230, 99, 21, 22, 212, 229, 230, 124, 21, 22, 212, 228, 230, 124, 21, + 22, 229, 133, 21, 22, 208, 235, 21, 22, 208, 201, 21, 22, 208, 195, 21, + 22, 208, 189, 21, 22, 208, 184, 21, 22, 208, 239, 21, 22, 208, 238, 21, + 22, 208, 247, 21, 22, 199, 49, 21, 22, 199, 47, 21, 22, 199, 46, 21, 22, + 199, 50, 21, 22, 194, 89, 208, 7, 21, 22, 194, 89, 207, 151, 21, 22, 194, + 89, 207, 55, 21, 22, 194, 89, 167, 21, 22, 214, 163, 21, 22, 214, 113, + 21, 22, 214, 109, 21, 22, 214, 90, 21, 22, 214, 85, 21, 22, 214, 165, 21, + 22, 214, 164, 21, 22, 214, 167, 21, 22, 213, 171, 21, 22, 205, 255, 204, + 12, 21, 22, 205, 255, 203, 236, 21, 22, 205, 255, 203, 211, 21, 22, 205, + 255, 204, 64, 21, 22, 194, 15, 199, 224, 21, 22, 194, 15, 199, 202, 21, + 22, 194, 15, 199, 176, 21, 22, 194, 15, 199, 240, 21, 22, 194, 15, 199, + 242, 21, 22, 219, 216, 21, 22, 219, 215, 21, 22, 219, 214, 21, 22, 219, + 213, 21, 22, 219, 222, 21, 22, 219, 221, 21, 22, 219, 223, 21, 22, 199, + 241, 199, 224, 21, 22, 199, 241, 199, 202, 21, 22, 199, 241, 199, 196, + 21, 22, 199, 241, 199, 176, 21, 22, 199, 241, 199, 170, 21, 22, 199, 241, + 199, 240, 21, 22, 199, 241, 199, 239, 21, 22, 199, 241, 199, 242, 21, 22, + 251, 47, 249, 226, 21, 22, 247, 245, 71, 21, 22, 247, 245, 70, 21, 22, + 247, 245, 74, 21, 22, 247, 245, 64, 21, 22, 247, 245, 194, 111, 21, 22, + 247, 245, 194, 72, 21, 22, 247, 245, 194, 36, 21, 22, 247, 245, 194, 169, + 21, 22, 247, 245, 214, 214, 21, 22, 247, 245, 214, 60, 21, 22, 247, 245, + 213, 142, 21, 22, 247, 245, 181, 21, 22, 247, 245, 222, 57, 21, 22, 247, + 245, 221, 204, 21, 22, 247, 245, 221, 113, 21, 22, 247, 245, 160, 21, 22, + 205, 255, 229, 255, 21, 22, 205, 255, 229, 178, 21, 22, 205, 255, 229, + 43, 21, 22, 205, 255, 144, 21, 22, 96, 231, 52, 21, 22, 96, 231, 56, 21, + 22, 96, 231, 70, 21, 22, 96, 231, 69, 21, 22, 96, 231, 58, 21, 22, 96, + 231, 84, 21, 22, 96, 206, 218, 21, 22, 96, 207, 55, 21, 22, 96, 208, 7, + 21, 22, 96, 207, 234, 21, 22, 96, 207, 151, 21, 22, 96, 167, 21, 22, 96, + 193, 244, 21, 22, 96, 194, 36, 21, 22, 96, 194, 111, 21, 22, 96, 194, + 100, 21, 22, 96, 194, 72, 21, 22, 96, 194, 169, 21, 22, 96, 228, 140, 21, + 22, 96, 228, 141, 21, 22, 96, 228, 144, 21, 22, 96, 228, 143, 21, 22, 96, + 228, 142, 21, 22, 96, 228, 147, 21, 22, 96, 199, 148, 21, 22, 96, 199, + 176, 21, 22, 96, 199, 224, 21, 22, 96, 199, 222, 21, 22, 96, 199, 202, + 21, 22, 96, 199, 240, 21, 22, 96, 198, 50, 21, 22, 96, 198, 60, 21, 22, + 96, 198, 78, 21, 22, 96, 198, 77, 21, 22, 96, 198, 62, 21, 22, 96, 198, + 83, 21, 22, 96, 209, 51, 21, 22, 96, 209, 198, 21, 22, 96, 210, 181, 21, + 22, 96, 210, 168, 21, 22, 96, 210, 51, 21, 22, 96, 166, 21, 22, 96, 211, + 93, 21, 22, 96, 230, 186, 21, 22, 96, 230, 254, 21, 22, 96, 231, 158, 21, + 22, 96, 231, 150, 21, 22, 96, 231, 46, 21, 22, 96, 231, 233, 21, 22, 96, + 221, 213, 21, 22, 96, 221, 220, 21, 22, 96, 221, 234, 21, 22, 96, 221, + 233, 21, 22, 96, 221, 227, 21, 22, 96, 221, 250, 21, 22, 96, 221, 134, + 21, 22, 96, 221, 135, 21, 22, 96, 221, 138, 21, 22, 96, 221, 137, 21, 22, + 96, 221, 136, 21, 22, 96, 221, 139, 21, 22, 96, 221, 140, 21, 22, 96, + 213, 22, 21, 22, 96, 213, 142, 21, 22, 96, 214, 214, 21, 22, 96, 214, + 203, 21, 22, 96, 214, 60, 21, 22, 96, 181, 21, 22, 96, 215, 241, 21, 22, + 96, 216, 91, 21, 22, 96, 217, 48, 21, 22, 96, 217, 29, 21, 22, 96, 216, + 175, 21, 22, 96, 172, 21, 22, 96, 192, 214, 21, 22, 96, 193, 1, 21, 22, + 96, 193, 69, 21, 22, 96, 193, 66, 21, 22, 96, 193, 22, 21, 22, 96, 168, + 21, 22, 96, 222, 214, 21, 22, 205, 255, 222, 214, 21, 22, 96, 222, 233, + 21, 22, 96, 223, 41, 21, 22, 96, 223, 39, 21, 22, 96, 223, 20, 21, 22, + 205, 255, 223, 20, 21, 22, 96, 223, 62, 21, 22, 96, 222, 247, 21, 22, 96, + 222, 251, 21, 22, 96, 223, 5, 21, 22, 96, 223, 4, 21, 22, 96, 223, 3, 21, + 22, 96, 223, 6, 21, 22, 96, 219, 36, 21, 22, 96, 219, 107, 21, 22, 96, + 220, 42, 21, 22, 96, 220, 32, 21, 22, 96, 219, 209, 21, 22, 96, 177, 21, + 22, 96, 236, 151, 21, 22, 96, 236, 152, 21, 22, 96, 236, 157, 21, 22, 96, + 236, 156, 21, 22, 96, 236, 153, 21, 22, 96, 236, 158, 21, 22, 96, 219, + 212, 21, 22, 96, 219, 214, 21, 22, 96, 219, 218, 21, 22, 96, 219, 217, + 21, 22, 96, 219, 216, 21, 22, 96, 219, 222, 21, 22, 96, 199, 44, 21, 22, + 96, 199, 46, 21, 22, 96, 199, 49, 21, 22, 96, 199, 48, 21, 22, 96, 199, + 47, 21, 22, 96, 199, 50, 21, 22, 96, 199, 39, 21, 22, 96, 199, 40, 21, + 22, 96, 199, 52, 21, 22, 96, 199, 51, 21, 22, 96, 199, 41, 21, 22, 96, + 199, 53, 21, 22, 96, 191, 252, 21, 22, 96, 192, 8, 21, 22, 96, 192, 85, + 21, 22, 96, 192, 82, 21, 22, 96, 192, 30, 21, 22, 96, 192, 112, 21, 22, + 96, 192, 155, 21, 22, 96, 88, 192, 155, 21, 22, 96, 235, 4, 21, 22, 96, + 235, 5, 21, 22, 96, 235, 14, 21, 22, 96, 235, 13, 21, 22, 96, 235, 8, 21, + 22, 96, 235, 17, 21, 22, 96, 201, 184, 21, 22, 96, 202, 212, 21, 22, 96, + 205, 223, 21, 22, 96, 205, 205, 21, 22, 96, 203, 125, 21, 22, 96, 188, + 21, 22, 96, 203, 164, 21, 22, 96, 203, 211, 21, 22, 96, 204, 12, 21, 22, + 96, 204, 10, 21, 22, 96, 203, 236, 21, 22, 96, 204, 64, 21, 22, 96, 204, + 66, 21, 22, 96, 198, 91, 21, 22, 96, 198, 95, 21, 22, 96, 198, 112, 21, + 22, 96, 198, 111, 21, 22, 96, 198, 97, 21, 22, 96, 198, 118, 21, 22, 96, + 242, 168, 21, 22, 96, 242, 188, 21, 22, 96, 242, 245, 21, 22, 96, 242, + 241, 21, 22, 96, 242, 215, 21, 22, 96, 246, 117, 21, 22, 96, 198, 53, 21, + 22, 96, 198, 54, 21, 22, 96, 198, 57, 21, 22, 96, 198, 56, 21, 22, 96, + 198, 55, 21, 22, 96, 198, 58, 21, 22, 242, 216, 57, 21, 22, 232, 71, 201, + 238, 21, 22, 208, 231, 21, 22, 214, 161, 21, 22, 213, 168, 21, 22, 213, + 167, 21, 22, 213, 166, 21, 22, 213, 165, 21, 22, 213, 170, 21, 22, 213, + 169, 21, 22, 194, 15, 199, 136, 21, 22, 194, 15, 199, 135, 21, 22, 194, + 15, 199, 134, 21, 22, 194, 15, 199, 133, 21, 22, 194, 15, 199, 132, 21, + 22, 194, 15, 199, 139, 21, 22, 194, 15, 199, 138, 21, 22, 194, 15, 52, + 199, 242, 21, 22, 247, 245, 194, 202, 211, 245, 202, 161, 77, 211, 245, + 1, 248, 90, 211, 245, 1, 219, 22, 211, 245, 1, 233, 44, 211, 245, 1, 206, + 73, 211, 245, 1, 214, 8, 211, 245, 1, 197, 116, 211, 245, 1, 237, 229, + 211, 245, 1, 199, 77, 211, 245, 1, 242, 50, 211, 245, 1, 246, 145, 211, + 245, 1, 215, 224, 211, 245, 1, 230, 233, 211, 245, 1, 214, 151, 211, 245, + 1, 201, 231, 211, 245, 1, 206, 205, 211, 245, 1, 251, 59, 211, 245, 1, + 211, 198, 211, 245, 1, 197, 27, 211, 245, 1, 234, 197, 211, 245, 1, 223, + 115, 211, 245, 1, 234, 198, 211, 245, 1, 211, 163, 211, 245, 1, 197, 93, + 211, 245, 1, 223, 230, 211, 245, 1, 234, 195, 211, 245, 1, 210, 158, 211, + 245, 233, 43, 77, 211, 245, 207, 168, 233, 43, 77, 206, 194, 1, 233, 33, + 233, 24, 233, 48, 233, 163, 206, 194, 1, 196, 236, 206, 194, 1, 197, 12, + 197, 28, 68, 206, 194, 1, 192, 217, 206, 194, 1, 193, 148, 206, 194, 1, + 194, 202, 206, 194, 1, 199, 141, 199, 140, 199, 168, 206, 194, 1, 233, + 235, 206, 194, 1, 250, 187, 64, 206, 194, 1, 211, 145, 74, 206, 194, 1, + 251, 147, 64, 206, 194, 1, 251, 92, 206, 194, 1, 219, 80, 74, 206, 194, + 1, 203, 188, 74, 206, 194, 1, 74, 206, 194, 1, 212, 0, 206, 194, 1, 211, + 211, 206, 194, 1, 208, 46, 208, 59, 207, 219, 150, 206, 194, 1, 222, 73, + 206, 194, 1, 246, 141, 206, 194, 1, 222, 74, 222, 184, 206, 194, 1, 232, + 44, 206, 194, 1, 234, 73, 206, 194, 1, 231, 153, 230, 130, 232, 44, 206, + 194, 1, 231, 193, 206, 194, 1, 193, 236, 193, 227, 194, 202, 206, 194, 1, + 230, 90, 230, 124, 206, 194, 1, 230, 94, 230, 124, 206, 194, 1, 219, 82, + 230, 124, 206, 194, 1, 203, 191, 230, 124, 206, 194, 1, 215, 40, 212, + 191, 215, 41, 215, 151, 206, 194, 1, 203, 189, 215, 151, 206, 194, 1, + 235, 108, 206, 194, 1, 223, 93, 223, 97, 223, 84, 70, 206, 194, 1, 71, + 206, 194, 1, 223, 31, 223, 65, 206, 194, 1, 231, 134, 206, 194, 1, 219, + 83, 251, 108, 206, 194, 1, 203, 193, 64, 206, 194, 1, 223, 76, 234, 46, + 206, 194, 1, 210, 113, 210, 138, 211, 93, 206, 194, 1, 251, 19, 234, 44, + 206, 194, 1, 202, 167, 206, 158, 206, 194, 1, 203, 101, 219, 79, 206, + 158, 206, 194, 1, 203, 187, 206, 158, 206, 194, 1, 247, 52, 206, 194, 1, + 192, 155, 206, 194, 1, 199, 58, 199, 70, 197, 193, 200, 228, 206, 194, 1, + 203, 186, 200, 228, 206, 194, 1, 238, 95, 206, 194, 1, 248, 68, 248, 71, + 247, 251, 249, 226, 206, 194, 1, 203, 192, 249, 226, 206, 194, 1, 235, + 107, 206, 194, 1, 211, 177, 206, 194, 1, 234, 151, 234, 158, 71, 206, + 194, 1, 217, 149, 217, 161, 218, 236, 206, 194, 1, 219, 81, 218, 236, + 206, 194, 1, 203, 190, 218, 236, 206, 194, 1, 220, 57, 220, 160, 219, 90, + 165, 206, 194, 1, 235, 109, 206, 194, 1, 223, 163, 206, 194, 1, 223, 164, + 206, 194, 1, 237, 243, 237, 249, 238, 95, 206, 194, 1, 211, 138, 233, + 234, 74, 206, 194, 1, 234, 193, 206, 194, 1, 223, 113, 206, 194, 1, 238, + 115, 206, 194, 1, 247, 2, 206, 194, 1, 246, 157, 206, 194, 1, 202, 25, + 206, 194, 1, 219, 78, 206, 194, 1, 203, 185, 206, 194, 1, 228, 48, 206, + 194, 1, 208, 247, 206, 194, 1, 193, 223, 206, 194, 203, 74, 209, 37, 206, + 194, 215, 216, 209, 37, 206, 194, 238, 184, 209, 37, 206, 194, 250, 94, + 109, 206, 194, 197, 252, 109, 206, 194, 248, 88, 109, 206, 194, 1, 222, + 184, 206, 194, 1, 204, 66, 206, 194, 1, 211, 194, 206, 194, 1, 232, 101, + 246, 196, 211, 144, 206, 194, 1, 232, 101, 246, 196, 223, 96, 206, 194, + 1, 232, 101, 246, 196, 234, 157, 206, 194, 1, 232, 101, 246, 196, 251, + 146, 206, 194, 1, 232, 101, 246, 196, 251, 92, 200, 154, 1, 64, 200, 154, + 1, 70, 200, 154, 1, 68, 200, 154, 1, 160, 200, 154, 1, 231, 233, 200, + 154, 1, 214, 165, 200, 154, 1, 189, 200, 154, 1, 238, 0, 200, 154, 1, + 181, 200, 154, 1, 166, 200, 154, 1, 249, 3, 200, 154, 1, 172, 200, 154, + 1, 168, 200, 154, 1, 177, 200, 154, 1, 194, 169, 200, 154, 1, 188, 200, + 154, 1, 144, 200, 154, 18, 3, 70, 200, 154, 18, 3, 68, 200, 154, 3, 196, + 11, 230, 32, 1, 64, 230, 32, 1, 70, 230, 32, 1, 68, 230, 32, 1, 160, 230, + 32, 1, 231, 233, 230, 32, 1, 214, 165, 230, 32, 1, 189, 230, 32, 1, 238, + 0, 230, 32, 1, 181, 230, 32, 1, 166, 230, 32, 1, 249, 3, 230, 32, 1, 172, + 230, 32, 1, 168, 230, 32, 1, 167, 230, 32, 1, 177, 230, 32, 1, 194, 169, + 230, 32, 1, 188, 230, 32, 1, 144, 230, 32, 18, 3, 70, 230, 32, 18, 3, 68, + 230, 32, 3, 211, 28, 210, 70, 203, 74, 209, 37, 210, 70, 55, 209, 37, + 247, 114, 1, 64, 247, 114, 1, 70, 247, 114, 1, 68, 247, 114, 1, 160, 247, + 114, 1, 231, 233, 247, 114, 1, 214, 165, 247, 114, 1, 189, 247, 114, 1, + 238, 0, 247, 114, 1, 181, 247, 114, 1, 166, 247, 114, 1, 249, 3, 247, + 114, 1, 172, 247, 114, 1, 168, 247, 114, 1, 167, 247, 114, 1, 177, 247, + 114, 1, 194, 169, 247, 114, 1, 188, 247, 114, 1, 144, 247, 114, 18, 3, + 70, 247, 114, 18, 3, 68, 200, 153, 1, 64, 200, 153, 1, 70, 200, 153, 1, + 68, 200, 153, 1, 160, 200, 153, 1, 231, 233, 200, 153, 1, 214, 165, 200, + 153, 1, 189, 200, 153, 1, 238, 0, 200, 153, 1, 181, 200, 153, 1, 166, + 200, 153, 1, 249, 3, 200, 153, 1, 172, 200, 153, 1, 168, 200, 153, 1, + 177, 200, 153, 1, 194, 169, 200, 153, 1, 188, 200, 153, 18, 3, 70, 200, + 153, 18, 3, 68, 93, 1, 160, 93, 1, 221, 250, 93, 1, 221, 113, 93, 1, 221, + 220, 93, 1, 214, 90, 93, 1, 247, 19, 93, 1, 246, 117, 93, 1, 242, 63, 93, + 1, 242, 188, 93, 1, 212, 165, 93, 1, 238, 0, 93, 1, 198, 71, 93, 1, 236, + 146, 93, 1, 198, 66, 93, 1, 213, 148, 93, 1, 189, 93, 1, 199, 240, 93, 1, + 155, 93, 1, 199, 176, 93, 1, 213, 142, 93, 1, 249, 3, 93, 1, 210, 94, 93, + 1, 209, 198, 93, 1, 210, 65, 93, 1, 216, 91, 93, 1, 193, 1, 93, 1, 207, + 55, 93, 1, 219, 107, 93, 1, 195, 252, 93, 1, 204, 64, 93, 1, 202, 51, 93, + 1, 188, 93, 1, 144, 93, 1, 177, 93, 1, 208, 239, 93, 223, 177, 18, 208, + 225, 93, 223, 177, 18, 208, 238, 93, 223, 177, 18, 208, 201, 93, 223, + 177, 18, 208, 195, 93, 223, 177, 18, 208, 177, 93, 223, 177, 18, 208, + 146, 93, 223, 177, 18, 208, 134, 93, 223, 177, 18, 208, 133, 93, 223, + 177, 18, 206, 167, 93, 223, 177, 18, 206, 160, 93, 223, 177, 18, 218, + 251, 93, 223, 177, 18, 218, 239, 93, 223, 177, 18, 208, 219, 93, 223, + 177, 18, 208, 231, 93, 223, 177, 18, 208, 185, 197, 206, 101, 93, 223, + 177, 18, 208, 185, 197, 206, 104, 93, 223, 177, 18, 208, 221, 93, 18, + 223, 161, 250, 135, 93, 18, 223, 161, 252, 33, 93, 18, 3, 252, 33, 93, + 18, 3, 70, 93, 18, 3, 223, 224, 93, 18, 3, 193, 148, 93, 18, 3, 192, 165, + 93, 18, 3, 68, 93, 18, 3, 196, 251, 93, 18, 3, 197, 119, 93, 18, 3, 212, + 0, 93, 18, 3, 168, 93, 18, 3, 223, 251, 93, 18, 3, 71, 93, 18, 3, 251, + 108, 93, 18, 3, 251, 63, 93, 18, 3, 211, 194, 93, 18, 3, 250, 8, 93, 3, + 214, 25, 93, 3, 208, 0, 93, 3, 192, 176, 93, 3, 215, 179, 93, 3, 198, + 173, 93, 3, 248, 196, 93, 3, 207, 44, 93, 3, 199, 28, 93, 3, 222, 128, + 93, 3, 251, 65, 93, 3, 206, 41, 206, 33, 93, 3, 196, 8, 93, 3, 242, 54, + 93, 3, 248, 166, 93, 3, 221, 241, 93, 3, 248, 191, 93, 3, 246, 246, 210, + 13, 220, 245, 93, 3, 220, 9, 198, 254, 93, 3, 248, 56, 93, 3, 210, 67, + 215, 234, 93, 3, 221, 86, 93, 238, 137, 16, 207, 135, 93, 3, 249, 245, + 93, 3, 250, 11, 93, 17, 192, 76, 93, 17, 101, 93, 17, 104, 93, 17, 133, + 93, 17, 134, 93, 17, 151, 93, 17, 170, 93, 17, 179, 93, 17, 174, 93, 17, + 182, 93, 16, 220, 9, 250, 13, 202, 186, 93, 16, 220, 9, 250, 13, 215, + 200, 93, 16, 220, 9, 250, 13, 210, 12, 93, 16, 220, 9, 250, 13, 248, 91, + 93, 16, 220, 9, 250, 13, 247, 94, 93, 16, 220, 9, 250, 13, 209, 129, 93, + 16, 220, 9, 250, 13, 209, 123, 93, 16, 220, 9, 250, 13, 209, 121, 93, 16, + 220, 9, 250, 13, 209, 127, 93, 16, 220, 9, 250, 13, 209, 125, 100, 248, + 11, 100, 234, 105, 100, 242, 38, 100, 232, 71, 201, 238, 100, 242, 47, + 100, 232, 119, 236, 111, 100, 199, 27, 202, 198, 228, 111, 100, 203, 117, + 5, 247, 184, 217, 122, 100, 217, 157, 242, 38, 100, 217, 157, 232, 71, + 201, 238, 100, 214, 6, 100, 232, 100, 65, 205, 190, 101, 100, 232, 100, + 65, 205, 190, 104, 100, 232, 100, 65, 205, 190, 133, 100, 18, 204, 165, + 100, 17, 192, 76, 100, 17, 101, 100, 17, 104, 100, 17, 133, 100, 17, 134, + 100, 17, 151, 100, 17, 170, 100, 17, 179, 100, 17, 174, 100, 17, 182, + 100, 1, 64, 100, 1, 71, 100, 1, 70, 100, 1, 74, 100, 1, 68, 100, 1, 212, + 0, 100, 1, 197, 104, 100, 1, 234, 171, 100, 1, 181, 100, 1, 250, 214, + 100, 1, 249, 3, 100, 1, 166, 100, 1, 208, 239, 100, 1, 231, 233, 100, 1, + 172, 100, 1, 177, 100, 1, 188, 100, 1, 204, 64, 100, 1, 189, 100, 1, 238, + 0, 100, 1, 246, 117, 100, 1, 223, 62, 100, 1, 168, 100, 1, 167, 100, 1, + 194, 169, 100, 1, 233, 97, 100, 1, 160, 100, 1, 221, 250, 100, 1, 198, + 118, 100, 1, 192, 112, 100, 1, 230, 99, 100, 1, 192, 0, 100, 1, 219, 222, + 100, 1, 192, 57, 100, 1, 242, 215, 100, 1, 199, 27, 184, 18, 57, 100, 1, + 199, 27, 71, 100, 1, 199, 27, 70, 100, 1, 199, 27, 74, 100, 1, 199, 27, + 68, 100, 1, 199, 27, 212, 0, 100, 1, 199, 27, 197, 104, 100, 1, 199, 27, + 250, 214, 100, 1, 199, 27, 249, 3, 100, 1, 199, 27, 166, 100, 1, 199, 27, + 208, 239, 100, 1, 199, 27, 231, 233, 100, 1, 199, 27, 172, 100, 1, 199, + 27, 189, 100, 1, 199, 27, 238, 0, 100, 1, 199, 27, 246, 117, 100, 1, 199, + 27, 223, 62, 100, 1, 199, 27, 198, 118, 100, 1, 199, 27, 168, 100, 1, + 199, 27, 194, 169, 100, 1, 199, 27, 160, 100, 1, 199, 27, 231, 230, 100, + 1, 199, 27, 230, 99, 100, 1, 199, 27, 223, 19, 100, 1, 199, 27, 214, 50, + 100, 1, 199, 27, 235, 17, 100, 1, 203, 117, 71, 100, 1, 203, 117, 70, + 100, 1, 203, 117, 223, 73, 100, 1, 203, 117, 197, 104, 100, 1, 203, 117, + 68, 100, 1, 203, 117, 250, 214, 100, 1, 203, 117, 160, 100, 1, 203, 117, + 231, 233, 100, 1, 203, 117, 144, 100, 1, 203, 117, 166, 100, 1, 203, 117, + 204, 64, 100, 1, 203, 117, 189, 100, 1, 203, 117, 238, 0, 100, 1, 203, + 117, 223, 62, 100, 1, 203, 117, 233, 97, 100, 1, 203, 117, 231, 230, 100, + 1, 203, 117, 230, 99, 100, 1, 203, 117, 198, 118, 100, 1, 203, 117, 192, + 112, 100, 1, 203, 117, 208, 68, 100, 1, 203, 117, 246, 117, 100, 1, 203, + 117, 192, 71, 100, 1, 217, 157, 70, 100, 1, 217, 157, 160, 100, 1, 217, + 157, 167, 100, 1, 217, 157, 233, 97, 100, 1, 217, 157, 192, 71, 100, 1, + 246, 118, 4, 103, 236, 111, 100, 1, 251, 18, 231, 213, 250, 169, 101, + 100, 1, 251, 18, 231, 213, 196, 7, 101, 100, 1, 251, 18, 231, 213, 237, + 217, 100, 1, 251, 18, 231, 213, 197, 114, 100, 1, 251, 18, 231, 213, 223, + 121, 197, 114, 100, 1, 251, 18, 231, 213, 248, 210, 100, 1, 251, 18, 231, + 213, 112, 248, 210, 100, 1, 251, 18, 231, 213, 64, 100, 1, 251, 18, 231, + 213, 70, 100, 1, 251, 18, 231, 213, 160, 100, 1, 251, 18, 231, 213, 214, + 165, 100, 1, 251, 18, 231, 213, 247, 19, 100, 1, 251, 18, 231, 213, 198, + 83, 100, 1, 251, 18, 231, 213, 198, 71, 100, 1, 251, 18, 231, 213, 237, + 161, 100, 1, 251, 18, 231, 213, 213, 178, 100, 1, 251, 18, 231, 213, 189, + 100, 1, 251, 18, 231, 213, 238, 0, 100, 1, 251, 18, 231, 213, 166, 100, + 1, 251, 18, 231, 213, 210, 94, 100, 1, 251, 18, 231, 213, 202, 92, 100, + 1, 251, 18, 231, 213, 192, 71, 100, 1, 251, 18, 231, 213, 192, 112, 100, + 1, 251, 18, 231, 213, 251, 72, 100, 1, 199, 27, 251, 18, 231, 213, 189, + 100, 1, 199, 27, 251, 18, 231, 213, 192, 71, 100, 1, 217, 157, 251, 18, + 231, 213, 231, 84, 100, 1, 217, 157, 251, 18, 231, 213, 214, 165, 100, 1, + 217, 157, 251, 18, 231, 213, 247, 19, 100, 1, 217, 157, 251, 18, 231, + 213, 223, 28, 100, 1, 217, 157, 251, 18, 231, 213, 198, 83, 100, 1, 217, + 157, 251, 18, 231, 213, 237, 145, 100, 1, 217, 157, 251, 18, 231, 213, + 189, 100, 1, 217, 157, 251, 18, 231, 213, 237, 40, 100, 1, 217, 157, 251, + 18, 231, 213, 202, 92, 100, 1, 217, 157, 251, 18, 231, 213, 238, 109, + 100, 1, 217, 157, 251, 18, 231, 213, 192, 71, 100, 1, 217, 157, 251, 18, + 231, 213, 192, 112, 100, 1, 251, 18, 231, 213, 138, 68, 100, 1, 251, 18, + 231, 213, 138, 168, 100, 1, 217, 157, 251, 18, 231, 213, 248, 54, 100, 1, + 251, 18, 231, 213, 237, 244, 100, 1, 217, 157, 251, 18, 231, 213, 219, + 222, 21, 22, 211, 98, 21, 22, 249, 236, 21, 22, 251, 243, 21, 22, 194, + 114, 21, 22, 209, 135, 21, 22, 210, 190, 21, 22, 209, 0, 21, 22, 200, 88, + 21, 22, 222, 64, 21, 22, 220, 235, 21, 22, 217, 92, 21, 22, 213, 93, 21, + 22, 215, 35, 21, 22, 220, 52, 21, 22, 202, 165, 21, 22, 206, 1, 21, 22, + 203, 173, 21, 22, 204, 16, 21, 22, 203, 135, 21, 22, 192, 223, 21, 22, + 193, 75, 21, 22, 208, 15, 21, 22, 212, 207, 21, 22, 211, 233, 212, 207, + 21, 22, 212, 206, 21, 22, 211, 233, 212, 206, 21, 22, 212, 205, 21, 22, + 211, 233, 212, 205, 21, 22, 212, 204, 21, 22, 211, 233, 212, 204, 21, 22, + 206, 172, 21, 22, 206, 171, 21, 22, 206, 170, 21, 22, 206, 169, 21, 22, + 206, 168, 21, 22, 206, 176, 21, 22, 211, 233, 211, 93, 21, 22, 211, 233, + 200, 228, 21, 22, 211, 233, 222, 184, 21, 22, 211, 233, 247, 52, 21, 22, + 211, 233, 218, 236, 21, 22, 211, 233, 215, 151, 21, 22, 211, 233, 206, + 158, 21, 22, 211, 233, 204, 66, 21, 22, 234, 184, 194, 202, 21, 22, 194, + 88, 194, 202, 21, 22, 52, 2, 207, 81, 21, 22, 52, 208, 39, 236, 114, 21, + 22, 208, 111, 206, 173, 21, 22, 194, 89, 219, 73, 21, 22, 194, 89, 220, + 184, 21, 22, 199, 137, 21, 22, 199, 139, 21, 22, 198, 63, 21, 22, 198, + 65, 21, 22, 198, 70, 21, 22, 199, 43, 21, 22, 199, 45, 21, 22, 205, 255, + 203, 140, 21, 22, 205, 255, 203, 203, 21, 22, 205, 255, 229, 16, 21, 22, + 96, 230, 138, 21, 22, 96, 237, 74, 231, 150, 21, 22, 96, 231, 230, 21, + 22, 96, 230, 143, 21, 22, 205, 255, 222, 194, 21, 22, 96, 222, 192, 21, + 22, 248, 112, 237, 74, 165, 21, 22, 248, 112, 237, 74, 150, 21, 22, 96, + 237, 69, 206, 158, 219, 185, 195, 229, 219, 235, 219, 185, 1, 160, 219, + 185, 1, 221, 250, 219, 185, 1, 231, 233, 219, 185, 1, 231, 84, 219, 185, + 1, 214, 165, 219, 185, 1, 247, 19, 219, 185, 1, 246, 117, 219, 185, 1, + 223, 62, 219, 185, 1, 223, 28, 219, 185, 1, 193, 97, 219, 185, 1, 189, + 219, 185, 1, 199, 240, 219, 185, 1, 238, 0, 219, 185, 1, 237, 40, 219, + 185, 1, 181, 219, 185, 1, 166, 219, 185, 1, 210, 94, 219, 185, 1, 249, 3, + 219, 185, 1, 248, 54, 219, 185, 1, 172, 219, 185, 1, 168, 219, 185, 1, + 167, 219, 185, 1, 177, 219, 185, 1, 194, 169, 219, 185, 1, 204, 64, 219, + 185, 1, 202, 92, 219, 185, 1, 188, 219, 185, 1, 144, 219, 185, 1, 230, + 134, 219, 185, 1, 198, 223, 219, 185, 18, 3, 64, 219, 185, 18, 3, 70, + 219, 185, 18, 3, 68, 219, 185, 18, 3, 234, 171, 219, 185, 18, 3, 251, 63, + 219, 185, 18, 3, 211, 194, 219, 185, 18, 3, 250, 8, 219, 185, 18, 3, 71, + 219, 185, 18, 3, 74, 219, 185, 201, 164, 1, 168, 219, 185, 201, 164, 1, + 167, 219, 185, 201, 164, 1, 194, 169, 219, 185, 2, 1, 160, 219, 185, 2, + 1, 214, 165, 219, 185, 2, 1, 250, 168, 219, 185, 2, 1, 189, 219, 185, 2, + 1, 181, 219, 185, 2, 1, 166, 219, 185, 2, 1, 172, 219, 185, 2, 1, 167, + 219, 185, 2, 1, 177, 219, 185, 3, 215, 221, 219, 185, 3, 222, 36, 219, + 185, 3, 206, 92, 219, 185, 3, 219, 73, 219, 185, 233, 204, 77, 219, 185, + 208, 159, 77, 219, 185, 17, 192, 76, 219, 185, 17, 101, 219, 185, 17, + 104, 219, 185, 17, 133, 219, 185, 17, 134, 219, 185, 17, 151, 219, 185, + 17, 170, 219, 185, 17, 179, 219, 185, 17, 174, 219, 185, 17, 182, 53, + 220, 43, 1, 160, 53, 220, 43, 1, 193, 209, 53, 220, 43, 1, 214, 165, 53, + 220, 43, 1, 198, 118, 53, 220, 43, 1, 188, 53, 220, 43, 1, 168, 53, 220, + 43, 1, 189, 53, 220, 43, 1, 199, 240, 53, 220, 43, 1, 177, 53, 220, 43, + 1, 166, 53, 220, 43, 1, 210, 94, 53, 220, 43, 1, 172, 53, 220, 43, 1, + 233, 97, 53, 220, 43, 1, 196, 157, 53, 220, 43, 1, 144, 53, 220, 43, 1, + 208, 239, 53, 220, 43, 1, 221, 250, 53, 220, 43, 1, 198, 108, 53, 220, + 43, 1, 181, 53, 220, 43, 1, 64, 53, 220, 43, 1, 70, 53, 220, 43, 1, 234, + 171, 53, 220, 43, 1, 234, 157, 53, 220, 43, 1, 68, 53, 220, 43, 1, 211, + 194, 53, 220, 43, 1, 74, 53, 220, 43, 1, 197, 104, 53, 220, 43, 1, 71, + 53, 220, 43, 1, 250, 6, 53, 220, 43, 1, 251, 63, 53, 220, 43, 1, 199, 16, + 53, 220, 43, 1, 199, 15, 53, 220, 43, 1, 199, 14, 53, 220, 43, 1, 199, + 13, 53, 220, 43, 1, 199, 12, 214, 177, 53, 219, 30, 1, 139, 208, 239, + 214, 177, 53, 219, 30, 1, 132, 208, 239, 214, 177, 53, 219, 30, 1, 139, + 160, 214, 177, 53, 219, 30, 1, 139, 193, 209, 214, 177, 53, 219, 30, 1, + 139, 214, 165, 214, 177, 53, 219, 30, 1, 132, 160, 214, 177, 53, 219, 30, + 1, 132, 193, 209, 214, 177, 53, 219, 30, 1, 132, 214, 165, 214, 177, 53, + 219, 30, 1, 139, 198, 118, 214, 177, 53, 219, 30, 1, 139, 188, 214, 177, + 53, 219, 30, 1, 139, 168, 214, 177, 53, 219, 30, 1, 132, 198, 118, 214, + 177, 53, 219, 30, 1, 132, 188, 214, 177, 53, 219, 30, 1, 132, 168, 214, + 177, 53, 219, 30, 1, 139, 189, 214, 177, 53, 219, 30, 1, 139, 199, 240, + 214, 177, 53, 219, 30, 1, 139, 181, 214, 177, 53, 219, 30, 1, 132, 189, + 214, 177, 53, 219, 30, 1, 132, 199, 240, 214, 177, 53, 219, 30, 1, 132, + 181, 214, 177, 53, 219, 30, 1, 139, 166, 214, 177, 53, 219, 30, 1, 139, + 210, 94, 214, 177, 53, 219, 30, 1, 139, 172, 214, 177, 53, 219, 30, 1, + 132, 166, 214, 177, 53, 219, 30, 1, 132, 210, 94, 214, 177, 53, 219, 30, + 1, 132, 172, 214, 177, 53, 219, 30, 1, 139, 233, 97, 214, 177, 53, 219, + 30, 1, 139, 196, 157, 214, 177, 53, 219, 30, 1, 139, 177, 214, 177, 53, + 219, 30, 1, 132, 233, 97, 214, 177, 53, 219, 30, 1, 132, 196, 157, 214, + 177, 53, 219, 30, 1, 132, 177, 214, 177, 53, 219, 30, 1, 139, 144, 214, + 177, 53, 219, 30, 1, 139, 238, 0, 214, 177, 53, 219, 30, 1, 139, 249, 3, + 214, 177, 53, 219, 30, 1, 132, 144, 214, 177, 53, 219, 30, 1, 132, 238, + 0, 214, 177, 53, 219, 30, 1, 132, 249, 3, 214, 177, 53, 219, 30, 1, 139, + 220, 240, 214, 177, 53, 219, 30, 1, 139, 193, 174, 214, 177, 53, 219, 30, + 1, 132, 220, 240, 214, 177, 53, 219, 30, 1, 132, 193, 174, 214, 177, 53, + 219, 30, 1, 139, 201, 175, 214, 177, 53, 219, 30, 1, 132, 201, 175, 214, + 177, 53, 219, 30, 18, 3, 18, 203, 183, 214, 177, 53, 219, 30, 18, 3, 252, + 33, 214, 177, 53, 219, 30, 18, 3, 223, 224, 214, 177, 53, 219, 30, 18, 3, + 68, 214, 177, 53, 219, 30, 18, 3, 196, 251, 214, 177, 53, 219, 30, 18, 3, + 71, 214, 177, 53, 219, 30, 18, 3, 251, 108, 214, 177, 53, 219, 30, 18, 3, + 74, 214, 177, 53, 219, 30, 18, 3, 212, 26, 214, 177, 53, 219, 30, 18, 3, + 197, 104, 214, 177, 53, 219, 30, 18, 3, 249, 236, 214, 177, 53, 219, 30, + 18, 3, 251, 243, 214, 177, 53, 219, 30, 18, 3, 196, 243, 214, 177, 53, + 219, 30, 18, 3, 211, 98, 214, 177, 53, 219, 30, 18, 3, 212, 23, 214, 177, + 53, 219, 30, 18, 3, 197, 99, 214, 177, 53, 219, 30, 18, 3, 223, 73, 214, + 177, 53, 219, 30, 1, 52, 196, 236, 214, 177, 53, 219, 30, 1, 52, 214, + 167, 214, 177, 53, 219, 30, 1, 52, 215, 151, 214, 177, 53, 219, 30, 1, + 52, 218, 236, 214, 177, 53, 219, 30, 1, 52, 222, 184, 214, 177, 53, 219, + 30, 1, 52, 238, 95, 214, 177, 53, 219, 30, 1, 52, 249, 226, 214, 177, 53, + 219, 30, 158, 217, 126, 214, 177, 53, 219, 30, 158, 217, 125, 214, 177, + 53, 219, 30, 17, 192, 76, 214, 177, 53, 219, 30, 17, 101, 214, 177, 53, + 219, 30, 17, 104, 214, 177, 53, 219, 30, 17, 133, 214, 177, 53, 219, 30, + 17, 134, 214, 177, 53, 219, 30, 17, 151, 214, 177, 53, 219, 30, 17, 170, + 214, 177, 53, 219, 30, 17, 179, 214, 177, 53, 219, 30, 17, 174, 214, 177, + 53, 219, 30, 17, 182, 214, 177, 53, 219, 30, 126, 17, 101, 214, 177, 53, + 219, 30, 3, 220, 166, 214, 177, 53, 219, 30, 3, 220, 165, 93, 16, 210, + 201, 93, 16, 215, 201, 221, 105, 93, 16, 210, 13, 221, 105, 93, 16, 248, + 92, 221, 105, 93, 16, 247, 95, 221, 105, 93, 16, 209, 130, 221, 105, 93, + 16, 209, 124, 221, 105, 93, 16, 209, 122, 221, 105, 93, 16, 209, 128, + 221, 105, 93, 16, 209, 126, 221, 105, 93, 16, 237, 202, 221, 105, 93, 16, + 237, 198, 221, 105, 93, 16, 237, 197, 221, 105, 93, 16, 237, 200, 221, + 105, 93, 16, 237, 199, 221, 105, 93, 16, 237, 196, 221, 105, 93, 16, 198, + 2, 93, 16, 215, 201, 207, 42, 93, 16, 210, 13, 207, 42, 93, 16, 248, 92, + 207, 42, 93, 16, 247, 95, 207, 42, 93, 16, 209, 130, 207, 42, 93, 16, + 209, 124, 207, 42, 93, 16, 209, 122, 207, 42, 93, 16, 209, 128, 207, 42, + 93, 16, 209, 126, 207, 42, 93, 16, 237, 202, 207, 42, 93, 16, 237, 198, + 207, 42, 93, 16, 237, 197, 207, 42, 93, 16, 237, 200, 207, 42, 93, 16, + 237, 199, 207, 42, 93, 16, 237, 196, 207, 42, 247, 115, 1, 160, 247, 115, + 1, 231, 233, 247, 115, 1, 214, 165, 247, 115, 1, 214, 108, 247, 115, 1, + 166, 247, 115, 1, 249, 3, 247, 115, 1, 172, 247, 115, 1, 215, 247, 247, + 115, 1, 189, 247, 115, 1, 238, 0, 247, 115, 1, 181, 247, 115, 1, 213, 88, + 247, 115, 1, 247, 19, 247, 115, 1, 223, 62, 247, 115, 1, 212, 201, 247, + 115, 1, 212, 192, 247, 115, 1, 168, 247, 115, 1, 167, 247, 115, 1, 177, + 247, 115, 1, 196, 157, 247, 115, 1, 188, 247, 115, 1, 64, 247, 115, 1, + 144, 247, 115, 18, 3, 70, 247, 115, 18, 3, 68, 247, 115, 18, 3, 71, 247, + 115, 18, 3, 74, 247, 115, 18, 3, 251, 108, 247, 115, 211, 42, 247, 115, + 234, 80, 80, 205, 208, 53, 126, 1, 139, 160, 53, 126, 1, 139, 221, 250, + 53, 126, 1, 139, 220, 224, 53, 126, 1, 132, 160, 53, 126, 1, 132, 220, + 224, 53, 126, 1, 132, 221, 250, 53, 126, 1, 214, 165, 53, 126, 1, 139, + 247, 19, 53, 126, 1, 139, 246, 117, 53, 126, 1, 132, 247, 19, 53, 126, 1, + 132, 188, 53, 126, 1, 132, 246, 117, 53, 126, 1, 212, 201, 53, 126, 1, + 208, 21, 53, 126, 1, 139, 208, 19, 53, 126, 1, 238, 0, 53, 126, 1, 132, + 208, 19, 53, 126, 1, 208, 30, 53, 126, 1, 139, 189, 53, 126, 1, 139, 199, + 240, 53, 126, 1, 132, 189, 53, 126, 1, 132, 199, 240, 53, 126, 1, 181, + 53, 126, 1, 249, 3, 53, 126, 1, 139, 166, 53, 126, 1, 139, 210, 94, 53, + 126, 1, 139, 233, 97, 53, 126, 1, 132, 166, 53, 126, 1, 132, 233, 97, 53, + 126, 1, 132, 210, 94, 53, 126, 1, 172, 53, 126, 1, 132, 168, 53, 126, 1, + 139, 168, 53, 126, 1, 167, 53, 126, 1, 206, 207, 53, 126, 1, 177, 53, + 126, 1, 219, 29, 53, 126, 1, 194, 169, 53, 126, 1, 139, 204, 64, 53, 126, + 1, 139, 202, 92, 53, 126, 1, 139, 188, 53, 126, 1, 139, 144, 53, 126, 1, + 219, 137, 53, 126, 1, 64, 53, 126, 1, 132, 144, 53, 126, 1, 70, 53, 126, + 1, 223, 224, 53, 126, 1, 68, 53, 126, 1, 196, 251, 53, 126, 1, 234, 171, + 53, 126, 1, 211, 194, 53, 126, 1, 220, 166, 53, 126, 1, 230, 206, 188, + 53, 126, 116, 3, 217, 35, 167, 53, 126, 116, 3, 217, 35, 177, 53, 126, + 116, 3, 220, 185, 200, 122, 220, 155, 53, 126, 3, 217, 181, 222, 118, + 220, 155, 53, 126, 116, 3, 52, 214, 165, 53, 126, 116, 3, 132, 166, 53, + 126, 116, 3, 139, 208, 20, 211, 164, 132, 166, 53, 126, 116, 3, 172, 53, + 126, 116, 3, 249, 3, 53, 126, 116, 3, 188, 53, 126, 3, 206, 66, 53, 126, + 18, 3, 64, 53, 126, 18, 3, 217, 181, 206, 20, 53, 126, 18, 3, 252, 33, + 53, 126, 18, 3, 200, 132, 252, 33, 53, 126, 18, 3, 70, 53, 126, 18, 3, + 223, 224, 53, 126, 18, 3, 197, 104, 53, 126, 18, 3, 196, 250, 53, 126, + 18, 3, 68, 53, 126, 18, 3, 196, 251, 53, 126, 18, 3, 74, 53, 126, 18, 3, + 212, 27, 63, 53, 126, 18, 3, 211, 98, 53, 126, 18, 3, 71, 53, 126, 18, 3, + 251, 108, 53, 126, 18, 3, 211, 194, 53, 126, 18, 3, 251, 63, 53, 126, 18, + 3, 126, 251, 63, 53, 126, 18, 3, 212, 27, 58, 53, 126, 3, 217, 181, 222, + 117, 53, 126, 3, 199, 17, 53, 126, 3, 199, 16, 53, 126, 3, 221, 209, 199, + 15, 53, 126, 3, 221, 209, 199, 14, 53, 126, 3, 221, 209, 199, 13, 53, + 126, 3, 208, 76, 230, 98, 53, 126, 3, 217, 181, 206, 50, 53, 126, 3, 221, + 208, 222, 98, 53, 126, 38, 238, 165, 236, 114, 53, 126, 229, 7, 17, 192, + 76, 53, 126, 229, 7, 17, 101, 53, 126, 229, 7, 17, 104, 53, 126, 229, 7, + 17, 133, 53, 126, 229, 7, 17, 134, 53, 126, 229, 7, 17, 151, 53, 126, + 229, 7, 17, 170, 53, 126, 229, 7, 17, 179, 53, 126, 229, 7, 17, 174, 53, + 126, 229, 7, 17, 182, 53, 126, 126, 17, 192, 76, 53, 126, 126, 17, 101, + 53, 126, 126, 17, 104, 53, 126, 126, 17, 133, 53, 126, 126, 17, 134, 53, + 126, 126, 17, 151, 53, 126, 126, 17, 170, 53, 126, 126, 17, 179, 53, 126, + 126, 17, 174, 53, 126, 126, 17, 182, 53, 126, 3, 194, 66, 53, 126, 3, + 194, 65, 53, 126, 3, 206, 5, 53, 126, 3, 222, 25, 53, 126, 3, 228, 191, + 53, 126, 3, 236, 129, 53, 126, 3, 207, 168, 207, 16, 208, 30, 53, 126, 3, + 217, 181, 193, 98, 53, 126, 3, 222, 152, 53, 126, 3, 222, 151, 53, 126, + 3, 206, 15, 53, 126, 3, 206, 14, 53, 126, 3, 230, 35, 53, 126, 3, 247, + 16, 38, 235, 101, 242, 122, 251, 143, 38, 237, 13, 38, 223, 167, 38, 235, + 92, 54, 38, 198, 170, 236, 114, 38, 193, 222, 63, 38, 194, 58, 219, 176, + 63, 38, 211, 184, 122, 63, 38, 55, 211, 184, 122, 63, 38, 152, 246, 139, + 201, 208, 63, 38, 201, 194, 246, 139, 201, 208, 63, 38, 210, 232, 58, 38, + 55, 210, 232, 58, 38, 210, 232, 63, 38, 210, 232, 211, 110, 38, 8, 2, 1, + 194, 203, 63, 38, 8, 2, 1, 163, 194, 203, 63, 148, 3, 197, 87, 207, 138, + 148, 3, 197, 87, 246, 236, 148, 3, 246, 154, 148, 3, 201, 98, 148, 3, + 248, 8, 148, 1, 251, 42, 148, 1, 251, 43, 200, 58, 148, 1, 223, 220, 148, + 1, 223, 221, 200, 58, 148, 1, 197, 90, 148, 1, 197, 91, 200, 58, 148, 1, + 208, 76, 207, 201, 148, 1, 208, 76, 207, 202, 200, 58, 148, 1, 220, 185, + 220, 3, 148, 1, 220, 185, 220, 4, 200, 58, 148, 1, 234, 129, 148, 1, 251, + 60, 148, 1, 211, 229, 148, 1, 211, 230, 200, 58, 148, 1, 160, 148, 1, + 222, 174, 217, 184, 148, 1, 231, 233, 148, 1, 231, 234, 230, 239, 148, 1, + 214, 165, 148, 1, 247, 19, 148, 1, 247, 20, 220, 171, 148, 1, 223, 62, + 148, 1, 223, 63, 223, 32, 148, 1, 212, 201, 148, 1, 200, 181, 220, 62, + 148, 1, 200, 181, 215, 196, 217, 184, 148, 1, 238, 1, 215, 196, 250, 254, + 148, 1, 238, 1, 215, 196, 217, 184, 148, 1, 215, 97, 208, 33, 148, 1, + 189, 148, 1, 200, 181, 200, 92, 148, 1, 238, 0, 148, 1, 238, 1, 217, 206, + 148, 1, 181, 148, 1, 166, 148, 1, 211, 78, 222, 110, 148, 1, 249, 3, 148, + 1, 249, 4, 222, 37, 148, 1, 172, 148, 1, 168, 148, 1, 167, 148, 1, 177, + 148, 1, 194, 169, 148, 1, 206, 101, 206, 78, 148, 1, 206, 101, 206, 27, + 148, 1, 188, 148, 1, 144, 148, 3, 207, 191, 148, 18, 3, 200, 58, 148, 18, + 3, 197, 86, 148, 18, 3, 197, 87, 206, 23, 148, 18, 3, 201, 133, 148, 18, + 3, 201, 134, 223, 212, 148, 18, 3, 208, 76, 207, 201, 148, 18, 3, 208, + 76, 207, 202, 200, 58, 148, 18, 3, 220, 185, 220, 3, 148, 18, 3, 220, + 185, 220, 4, 200, 58, 148, 18, 3, 200, 133, 148, 18, 3, 200, 134, 207, + 201, 148, 18, 3, 200, 134, 200, 58, 148, 18, 3, 200, 134, 207, 202, 200, + 58, 148, 18, 3, 210, 136, 148, 18, 3, 210, 137, 200, 58, 148, 251, 120, + 251, 119, 148, 1, 222, 140, 206, 22, 148, 1, 221, 215, 206, 22, 148, 1, + 197, 186, 206, 22, 148, 1, 234, 165, 206, 22, 148, 1, 196, 124, 206, 22, + 148, 1, 192, 102, 206, 22, 148, 1, 250, 29, 206, 22, 148, 17, 192, 76, + 148, 17, 101, 148, 17, 104, 148, 17, 133, 148, 17, 134, 148, 17, 151, + 148, 17, 170, 148, 17, 179, 148, 17, 174, 148, 17, 182, 148, 211, 5, 148, + 211, 34, 148, 194, 50, 148, 246, 209, 211, 27, 148, 246, 209, 203, 94, + 148, 246, 209, 210, 229, 148, 211, 33, 148, 35, 16, 236, 121, 148, 35, + 16, 237, 73, 148, 35, 16, 235, 45, 148, 35, 16, 237, 206, 148, 35, 16, + 237, 207, 201, 98, 148, 35, 16, 236, 214, 148, 35, 16, 237, 248, 148, 35, + 16, 237, 49, 148, 35, 16, 237, 230, 148, 35, 16, 237, 207, 231, 152, 148, + 35, 16, 38, 200, 51, 148, 35, 16, 38, 234, 77, 148, 35, 16, 38, 222, 32, + 148, 35, 16, 38, 222, 34, 148, 35, 16, 38, 223, 36, 148, 35, 16, 38, 222, + 33, 4, 223, 36, 148, 35, 16, 38, 222, 35, 4, 223, 36, 148, 35, 16, 38, + 248, 77, 148, 35, 16, 38, 230, 243, 148, 35, 16, 207, 99, 211, 184, 235, + 56, 148, 35, 16, 207, 99, 211, 184, 237, 246, 148, 35, 16, 207, 99, 242, + 84, 198, 31, 148, 35, 16, 207, 99, 242, 84, 200, 143, 148, 35, 16, 220, + 26, 211, 184, 211, 19, 148, 35, 16, 220, 26, 211, 184, 209, 35, 148, 35, + 16, 220, 26, 242, 84, 209, 228, 148, 35, 16, 220, 26, 242, 84, 209, 211, + 148, 35, 16, 220, 26, 211, 184, 209, 255, 201, 122, 3, 211, 2, 201, 122, + 3, 211, 15, 201, 122, 3, 211, 11, 201, 122, 1, 64, 201, 122, 1, 70, 201, + 122, 1, 68, 201, 122, 1, 251, 108, 201, 122, 1, 74, 201, 122, 1, 71, 201, + 122, 1, 233, 230, 201, 122, 1, 160, 201, 122, 1, 208, 239, 201, 122, 1, + 231, 233, 201, 122, 1, 214, 165, 201, 122, 1, 247, 19, 201, 122, 1, 223, + 62, 201, 122, 1, 192, 112, 201, 122, 1, 212, 201, 201, 122, 1, 189, 201, + 122, 1, 238, 0, 201, 122, 1, 181, 201, 122, 1, 166, 201, 122, 1, 233, 97, + 201, 122, 1, 196, 157, 201, 122, 1, 249, 3, 201, 122, 1, 172, 201, 122, + 1, 168, 201, 122, 1, 167, 201, 122, 1, 177, 201, 122, 1, 194, 169, 201, + 122, 1, 188, 201, 122, 1, 193, 209, 201, 122, 1, 144, 201, 122, 116, 3, + 211, 31, 201, 122, 116, 3, 211, 4, 201, 122, 116, 3, 211, 1, 201, 122, + 18, 3, 211, 18, 201, 122, 18, 3, 211, 0, 201, 122, 18, 3, 211, 24, 201, + 122, 18, 3, 211, 10, 201, 122, 18, 3, 211, 32, 201, 122, 18, 3, 211, 20, + 201, 122, 3, 211, 35, 201, 122, 3, 196, 11, 201, 122, 116, 3, 210, 217, + 172, 201, 122, 116, 3, 210, 217, 194, 169, 201, 122, 1, 221, 250, 201, + 122, 1, 201, 55, 201, 122, 17, 192, 76, 201, 122, 17, 101, 201, 122, 17, + 104, 201, 122, 17, 133, 201, 122, 17, 134, 201, 122, 17, 151, 201, 122, + 17, 170, 201, 122, 17, 179, 201, 122, 17, 174, 201, 122, 17, 182, 201, + 122, 249, 246, 201, 122, 1, 207, 171, 201, 122, 1, 219, 232, 201, 122, 1, + 248, 54, 201, 122, 1, 52, 222, 184, 201, 122, 1, 52, 218, 236, 248, 169, + 1, 64, 248, 169, 1, 203, 86, 64, 248, 169, 1, 144, 248, 169, 1, 203, 86, + 144, 248, 169, 1, 217, 155, 144, 248, 169, 1, 249, 3, 248, 169, 1, 222, + 95, 249, 3, 248, 169, 1, 166, 248, 169, 1, 203, 86, 166, 248, 169, 1, + 181, 248, 169, 1, 217, 155, 181, 248, 169, 1, 194, 169, 248, 169, 1, 203, + 86, 194, 169, 248, 169, 1, 211, 50, 194, 169, 248, 169, 1, 231, 233, 248, + 169, 1, 203, 86, 231, 233, 248, 169, 1, 223, 62, 248, 169, 1, 238, 0, + 248, 169, 1, 167, 248, 169, 1, 203, 86, 167, 248, 169, 1, 172, 248, 169, + 1, 203, 86, 172, 248, 169, 1, 202, 169, 189, 248, 169, 1, 213, 115, 189, + 248, 169, 1, 188, 248, 169, 1, 203, 86, 188, 248, 169, 1, 217, 155, 188, + 248, 169, 1, 168, 248, 169, 1, 203, 86, 168, 248, 169, 1, 214, 165, 248, + 169, 1, 177, 248, 169, 1, 203, 86, 177, 248, 169, 1, 212, 201, 248, 169, + 1, 247, 19, 248, 169, 1, 214, 255, 248, 169, 1, 217, 82, 248, 169, 1, 70, + 248, 169, 1, 68, 248, 169, 3, 199, 21, 248, 169, 18, 3, 71, 248, 169, 18, + 3, 211, 50, 71, 248, 169, 18, 3, 234, 171, 248, 169, 18, 3, 70, 248, 169, + 18, 3, 222, 95, 70, 248, 169, 18, 3, 74, 248, 169, 18, 3, 222, 95, 74, + 248, 169, 18, 3, 68, 248, 169, 18, 3, 124, 39, 203, 86, 188, 248, 169, + 116, 3, 214, 167, 248, 169, 116, 3, 230, 124, 248, 169, 211, 13, 248, + 169, 211, 9, 248, 169, 16, 248, 18, 215, 97, 216, 238, 248, 169, 16, 248, + 18, 210, 5, 248, 169, 16, 248, 18, 222, 211, 248, 169, 16, 248, 18, 211, + 13, 219, 243, 1, 160, 219, 243, 1, 221, 132, 219, 243, 1, 221, 250, 219, + 243, 1, 231, 233, 219, 243, 1, 231, 14, 219, 243, 1, 214, 165, 219, 243, + 1, 247, 19, 219, 243, 1, 246, 117, 219, 243, 1, 223, 62, 219, 243, 1, + 212, 201, 219, 243, 1, 189, 219, 243, 1, 199, 240, 219, 243, 1, 238, 0, + 219, 243, 1, 181, 219, 243, 1, 166, 219, 243, 1, 209, 234, 219, 243, 1, + 210, 94, 219, 243, 1, 233, 97, 219, 243, 1, 232, 208, 219, 243, 1, 249, + 3, 219, 243, 1, 247, 249, 219, 243, 1, 172, 219, 243, 1, 216, 98, 219, + 243, 1, 198, 118, 219, 243, 1, 198, 108, 219, 243, 1, 235, 17, 219, 243, + 1, 168, 219, 243, 1, 167, 219, 243, 1, 177, 219, 243, 1, 144, 219, 243, + 1, 229, 131, 219, 243, 1, 196, 157, 219, 243, 1, 188, 219, 243, 1, 204, + 64, 219, 243, 1, 194, 169, 219, 243, 1, 64, 219, 243, 201, 164, 1, 168, + 219, 243, 201, 164, 1, 167, 219, 243, 18, 3, 252, 33, 219, 243, 18, 3, + 70, 219, 243, 18, 3, 74, 219, 243, 18, 3, 211, 194, 219, 243, 18, 3, 68, + 219, 243, 18, 3, 196, 251, 219, 243, 18, 3, 71, 219, 243, 116, 3, 222, + 184, 219, 243, 116, 3, 218, 236, 219, 243, 116, 3, 165, 219, 243, 116, 3, + 215, 151, 219, 243, 116, 3, 211, 93, 219, 243, 116, 3, 150, 219, 243, + 116, 3, 200, 228, 219, 243, 116, 3, 212, 173, 219, 243, 116, 3, 222, 117, + 219, 243, 3, 208, 31, 219, 243, 3, 212, 241, 219, 243, 209, 38, 200, 176, + 219, 243, 209, 38, 212, 185, 199, 131, 200, 176, 219, 243, 209, 38, 246, + 126, 219, 243, 209, 38, 198, 100, 246, 126, 219, 243, 209, 38, 198, 99, + 219, 243, 17, 192, 76, 219, 243, 17, 101, 219, 243, 17, 104, 219, 243, + 17, 133, 219, 243, 17, 134, 219, 243, 17, 151, 219, 243, 17, 170, 219, + 243, 17, 179, 219, 243, 17, 174, 219, 243, 17, 182, 219, 243, 1, 198, 83, + 219, 243, 1, 198, 71, 219, 243, 1, 237, 161, 211, 227, 242, 208, 17, 192, + 76, 211, 227, 242, 208, 17, 101, 211, 227, 242, 208, 17, 104, 211, 227, + 242, 208, 17, 133, 211, 227, 242, 208, 17, 134, 211, 227, 242, 208, 17, + 151, 211, 227, 242, 208, 17, 170, 211, 227, 242, 208, 17, 179, 211, 227, + 242, 208, 17, 174, 211, 227, 242, 208, 17, 182, 211, 227, 242, 208, 1, + 177, 211, 227, 242, 208, 1, 250, 26, 211, 227, 242, 208, 1, 251, 80, 211, + 227, 242, 208, 1, 250, 214, 211, 227, 242, 208, 1, 251, 35, 211, 227, + 242, 208, 1, 220, 184, 211, 227, 242, 208, 1, 251, 251, 211, 227, 242, + 208, 1, 251, 252, 211, 227, 242, 208, 1, 251, 250, 211, 227, 242, 208, 1, + 251, 244, 211, 227, 242, 208, 1, 219, 209, 211, 227, 242, 208, 1, 223, + 96, 211, 227, 242, 208, 1, 223, 225, 211, 227, 242, 208, 1, 223, 118, + 211, 227, 242, 208, 1, 223, 105, 211, 227, 242, 208, 1, 219, 36, 211, + 227, 242, 208, 1, 197, 111, 211, 227, 242, 208, 1, 197, 109, 211, 227, + 242, 208, 1, 197, 47, 211, 227, 242, 208, 1, 196, 243, 211, 227, 242, + 208, 1, 220, 42, 211, 227, 242, 208, 1, 234, 41, 211, 227, 242, 208, 1, + 234, 174, 211, 227, 242, 208, 1, 234, 88, 211, 227, 242, 208, 1, 234, 13, + 211, 227, 242, 208, 1, 219, 107, 211, 227, 242, 208, 1, 211, 135, 211, + 227, 242, 208, 1, 212, 22, 211, 227, 242, 208, 1, 211, 120, 211, 227, + 242, 208, 1, 211, 241, 211, 227, 242, 208, 215, 242, 198, 48, 211, 227, + 242, 208, 231, 228, 198, 49, 211, 227, 242, 208, 215, 236, 198, 49, 211, + 227, 242, 208, 207, 216, 211, 227, 242, 208, 210, 92, 211, 227, 242, 208, + 251, 71, 211, 227, 242, 208, 209, 38, 215, 232, 211, 227, 242, 208, 209, + 38, 55, 215, 232, 42, 2, 1, 207, 7, 196, 123, 42, 2, 1, 219, 77, 237, + 116, 42, 2, 1, 215, 50, 74, 42, 2, 1, 194, 64, 234, 9, 42, 2, 1, 200, + 132, 200, 79, 42, 2, 1, 199, 156, 200, 79, 42, 2, 1, 200, 132, 230, 26, + 57, 42, 2, 1, 200, 132, 193, 84, 42, 2, 1, 197, 72, 197, 92, 98, 215, + 243, 6, 1, 250, 224, 98, 215, 243, 6, 1, 248, 207, 98, 215, 243, 6, 1, + 231, 203, 98, 215, 243, 6, 1, 236, 123, 98, 215, 243, 6, 1, 234, 88, 98, + 215, 243, 6, 1, 196, 20, 98, 215, 243, 6, 1, 192, 79, 98, 215, 243, 6, 1, + 200, 125, 98, 215, 243, 6, 1, 223, 190, 98, 215, 243, 6, 1, 222, 121, 98, + 215, 243, 6, 1, 220, 67, 98, 215, 243, 6, 1, 217, 160, 98, 215, 243, 6, + 1, 215, 51, 98, 215, 243, 6, 1, 211, 211, 98, 215, 243, 6, 1, 210, 247, + 98, 215, 243, 6, 1, 192, 67, 98, 215, 243, 6, 1, 208, 53, 98, 215, 243, + 6, 1, 206, 40, 98, 215, 243, 6, 1, 200, 112, 98, 215, 243, 6, 1, 197, 77, + 98, 215, 243, 6, 1, 210, 86, 98, 215, 243, 6, 1, 221, 237, 98, 215, 243, + 6, 1, 231, 75, 98, 215, 243, 6, 1, 208, 224, 98, 215, 243, 6, 1, 203, + 224, 98, 215, 243, 6, 1, 242, 201, 98, 215, 243, 6, 1, 246, 243, 98, 215, + 243, 6, 1, 223, 10, 98, 215, 243, 6, 1, 242, 138, 98, 215, 243, 6, 1, + 246, 101, 98, 215, 243, 6, 1, 193, 207, 98, 215, 243, 6, 1, 223, 25, 98, + 215, 243, 6, 1, 230, 95, 98, 215, 243, 6, 1, 229, 255, 98, 215, 243, 6, + 1, 229, 165, 98, 215, 243, 6, 1, 194, 111, 98, 215, 243, 6, 1, 230, 28, + 98, 215, 243, 6, 1, 229, 31, 98, 215, 243, 6, 1, 233, 11, 98, 215, 243, + 6, 1, 193, 3, 98, 215, 243, 6, 1, 234, 107, 98, 215, 243, 6, 1, 163, 231, + 203, 98, 215, 243, 6, 1, 251, 57, 98, 215, 243, 6, 1, 251, 97, 98, 215, + 243, 6, 1, 230, 26, 57, 98, 215, 243, 6, 1, 220, 175, 57, 201, 122, 209, + 38, 248, 18, 201, 91, 201, 122, 209, 38, 248, 18, 211, 14, 201, 122, 209, + 38, 248, 18, 209, 25, 201, 122, 209, 38, 248, 18, 247, 4, 201, 122, 209, + 38, 248, 18, 219, 233, 206, 19, 201, 122, 209, 38, 248, 18, 222, 174, + 206, 19, 201, 122, 209, 38, 248, 18, 238, 1, 206, 19, 201, 122, 209, 38, + 248, 18, 249, 4, 206, 19, 196, 120, 158, 222, 91, 196, 120, 158, 204, 29, + 196, 120, 158, 209, 109, 196, 120, 3, 214, 28, 196, 120, 3, 193, 106, + 216, 158, 201, 82, 196, 120, 158, 193, 106, 251, 76, 223, 177, 201, 82, + 196, 120, 158, 193, 106, 223, 177, 201, 82, 196, 120, 158, 193, 106, 222, + 79, 223, 177, 201, 82, 196, 120, 158, 246, 237, 63, 196, 120, 158, 193, + 106, 222, 79, 223, 177, 201, 83, 205, 242, 196, 120, 158, 55, 201, 82, + 196, 120, 158, 198, 170, 201, 82, 196, 120, 158, 222, 79, 250, 170, 196, + 120, 158, 78, 63, 196, 120, 158, 103, 236, 112, 63, 196, 120, 158, 112, + 236, 112, 63, 196, 120, 158, 207, 89, 222, 90, 223, 177, 201, 82, 196, + 120, 158, 250, 23, 223, 177, 201, 82, 196, 120, 3, 196, 7, 201, 82, 196, + 120, 3, 196, 7, 197, 106, 196, 120, 3, 207, 168, 196, 7, 197, 106, 196, + 120, 3, 196, 7, 250, 170, 196, 120, 3, 207, 168, 196, 7, 250, 170, 196, + 120, 3, 196, 7, 197, 107, 4, 200, 147, 196, 120, 3, 196, 7, 250, 171, 4, + 200, 147, 196, 120, 3, 250, 169, 250, 185, 196, 120, 3, 250, 169, 248, + 226, 196, 120, 3, 250, 169, 196, 147, 196, 120, 3, 250, 169, 196, 148, 4, + 200, 147, 196, 120, 3, 199, 64, 196, 120, 3, 229, 190, 184, 250, 168, + 196, 120, 3, 184, 250, 168, 196, 120, 3, 206, 220, 184, 250, 168, 196, + 120, 3, 250, 169, 197, 113, 215, 223, 196, 120, 3, 250, 108, 196, 120, 3, + 207, 16, 250, 108, 196, 120, 158, 246, 237, 58, 196, 120, 3, 223, 13, + 196, 120, 3, 197, 39, 196, 120, 3, 250, 21, 196, 120, 158, 207, 82, 58, + 196, 120, 158, 55, 207, 82, 58, 196, 120, 3, 55, 250, 169, 250, 185, 8, + 1, 2, 6, 64, 8, 1, 2, 6, 251, 108, 8, 2, 1, 163, 251, 108, 8, 1, 2, 6, + 248, 188, 249, 226, 8, 1, 2, 6, 247, 52, 8, 1, 2, 6, 238, 95, 8, 1, 2, 6, + 233, 235, 8, 1, 2, 6, 71, 8, 2, 1, 163, 211, 184, 71, 8, 2, 1, 163, 70, + 8, 1, 2, 6, 223, 65, 8, 1, 2, 6, 222, 184, 8, 1, 2, 6, 220, 202, 4, 111, + 8, 1, 2, 6, 218, 236, 8, 1, 2, 6, 207, 168, 215, 151, 8, 1, 2, 6, 74, 8, + 1, 2, 6, 211, 184, 74, 8, 2, 1, 203, 109, 74, 8, 2, 1, 203, 109, 211, + 184, 74, 8, 2, 1, 203, 109, 185, 4, 111, 8, 2, 1, 163, 212, 0, 8, 1, 2, + 6, 211, 130, 8, 2, 1, 198, 249, 138, 74, 8, 2, 1, 247, 188, 138, 74, 8, + 1, 2, 6, 211, 93, 8, 1, 2, 6, 207, 168, 150, 8, 1, 2, 6, 163, 150, 8, 1, + 2, 6, 200, 228, 8, 1, 2, 6, 68, 8, 2, 1, 203, 109, 68, 8, 2, 1, 203, 109, + 237, 12, 68, 8, 2, 1, 203, 109, 163, 218, 236, 8, 1, 2, 6, 196, 236, 8, + 1, 2, 6, 194, 202, 8, 1, 2, 6, 192, 155, 8, 1, 2, 6, 233, 166, 8, 1, 195, + 248, 220, 68, 202, 131, 8, 1, 251, 57, 33, 1, 2, 6, 231, 204, 33, 1, 2, + 6, 220, 90, 33, 1, 2, 6, 210, 51, 33, 1, 2, 6, 207, 153, 33, 1, 2, 6, + 209, 62, 42, 1, 2, 6, 234, 124, 73, 1, 6, 64, 73, 1, 6, 251, 108, 73, 1, + 6, 249, 226, 73, 1, 6, 248, 188, 249, 226, 73, 1, 6, 238, 95, 73, 1, 6, + 71, 73, 1, 6, 207, 168, 71, 73, 1, 6, 232, 44, 73, 1, 6, 230, 124, 73, 1, + 6, 70, 73, 1, 6, 223, 65, 73, 1, 6, 222, 184, 73, 1, 6, 165, 73, 1, 6, + 218, 236, 73, 1, 6, 215, 151, 73, 1, 6, 207, 168, 215, 151, 73, 1, 6, 74, + 73, 1, 6, 211, 130, 73, 1, 6, 211, 93, 73, 1, 6, 150, 73, 1, 6, 200, 228, + 73, 1, 6, 68, 73, 1, 6, 194, 202, 73, 1, 2, 64, 73, 1, 2, 163, 64, 73, 1, + 2, 250, 252, 73, 1, 2, 163, 251, 108, 73, 1, 2, 249, 226, 73, 1, 2, 238, + 95, 73, 1, 2, 71, 73, 1, 2, 205, 240, 73, 1, 2, 211, 184, 71, 73, 1, 2, + 163, 211, 184, 71, 73, 1, 2, 232, 44, 73, 1, 2, 163, 70, 73, 1, 2, 222, + 184, 73, 1, 2, 218, 236, 73, 1, 2, 234, 73, 73, 1, 2, 74, 73, 1, 2, 211, + 184, 74, 73, 1, 2, 198, 249, 138, 74, 73, 1, 2, 247, 188, 138, 74, 73, 1, + 2, 211, 93, 73, 1, 2, 200, 228, 73, 1, 2, 68, 73, 1, 2, 203, 109, 68, 73, + 1, 2, 163, 218, 236, 73, 1, 2, 196, 236, 73, 1, 2, 251, 57, 73, 1, 2, + 248, 63, 73, 1, 2, 33, 231, 204, 73, 1, 2, 237, 76, 73, 1, 2, 33, 210, + 77, 73, 1, 2, 242, 215, 8, 201, 155, 2, 1, 70, 8, 201, 155, 2, 1, 150, 8, + 201, 155, 2, 1, 68, 8, 201, 155, 2, 1, 196, 236, 33, 201, 155, 2, 1, 248, + 63, 33, 201, 155, 2, 1, 231, 204, 33, 201, 155, 2, 1, 207, 153, 33, 201, + 155, 2, 1, 210, 77, 33, 201, 155, 2, 1, 242, 215, 8, 2, 1, 197, 104, 8, + 2, 1, 76, 4, 85, 199, 90, 8, 2, 1, 238, 96, 4, 85, 199, 90, 8, 2, 1, 233, + 164, 4, 85, 199, 90, 8, 2, 1, 218, 237, 4, 85, 199, 90, 8, 2, 1, 215, + 152, 4, 85, 199, 90, 8, 2, 1, 211, 94, 4, 85, 199, 90, 8, 2, 1, 208, 112, + 4, 85, 199, 90, 8, 2, 1, 208, 112, 4, 232, 222, 26, 85, 199, 90, 8, 2, 1, + 206, 159, 4, 85, 199, 90, 8, 2, 1, 200, 229, 4, 85, 199, 90, 8, 2, 1, + 192, 156, 4, 85, 199, 90, 8, 2, 1, 163, 232, 44, 73, 1, 42, 234, 88, 8, + 2, 1, 223, 143, 232, 44, 8, 2, 1, 199, 243, 4, 201, 212, 8, 2, 6, 1, 228, + 97, 4, 111, 8, 2, 1, 223, 112, 4, 111, 8, 2, 1, 211, 94, 4, 111, 8, 2, 6, + 1, 124, 4, 111, 8, 2, 1, 197, 35, 4, 111, 8, 2, 1, 76, 4, 211, 49, 128, + 8, 2, 1, 238, 96, 4, 211, 49, 128, 8, 2, 1, 233, 164, 4, 211, 49, 128, 8, + 2, 1, 232, 45, 4, 211, 49, 128, 8, 2, 1, 222, 185, 4, 211, 49, 128, 8, 2, + 1, 220, 202, 4, 211, 49, 128, 8, 2, 1, 218, 237, 4, 211, 49, 128, 8, 2, + 1, 215, 152, 4, 211, 49, 128, 8, 2, 1, 211, 94, 4, 211, 49, 128, 8, 2, 1, + 208, 112, 4, 211, 49, 128, 8, 2, 1, 206, 159, 4, 211, 49, 128, 8, 2, 1, + 234, 0, 4, 211, 49, 128, 8, 2, 1, 196, 237, 4, 211, 49, 128, 8, 2, 1, + 193, 224, 4, 211, 49, 128, 8, 2, 1, 192, 156, 4, 211, 49, 128, 8, 2, 1, + 41, 4, 207, 174, 128, 8, 2, 1, 250, 253, 4, 207, 174, 128, 8, 2, 1, 238, + 96, 4, 229, 15, 26, 200, 147, 8, 2, 1, 234, 253, 4, 207, 174, 128, 8, 2, + 1, 211, 184, 234, 253, 4, 207, 174, 128, 8, 2, 1, 207, 168, 211, 184, + 234, 253, 4, 207, 174, 128, 8, 2, 1, 205, 241, 4, 207, 174, 128, 8, 2, 1, + 228, 97, 4, 207, 174, 128, 8, 2, 1, 211, 184, 185, 4, 207, 174, 128, 8, + 2, 1, 234, 0, 4, 207, 174, 128, 8, 2, 1, 124, 4, 207, 174, 128, 8, 2, 1, + 233, 167, 4, 207, 174, 128, 73, 1, 2, 163, 250, 252, 73, 1, 2, 247, 52, + 73, 1, 2, 247, 53, 4, 238, 142, 73, 1, 2, 233, 235, 73, 1, 2, 207, 168, + 211, 184, 71, 73, 1, 2, 233, 163, 73, 1, 2, 236, 113, 223, 66, 4, 111, + 73, 1, 2, 27, 232, 44, 73, 1, 2, 163, 230, 124, 73, 1, 2, 228, 97, 4, + 111, 73, 1, 2, 223, 111, 73, 1, 2, 6, 70, 73, 1, 2, 6, 228, 97, 4, 111, + 73, 1, 2, 223, 66, 4, 238, 178, 73, 1, 2, 220, 202, 4, 207, 174, 128, 73, + 1, 2, 220, 202, 4, 211, 49, 128, 73, 1, 2, 6, 165, 73, 1, 2, 218, 237, 4, + 128, 73, 1, 2, 163, 218, 237, 4, 184, 220, 16, 73, 1, 2, 215, 152, 4, 46, + 128, 73, 1, 2, 215, 152, 4, 207, 174, 128, 73, 1, 2, 6, 215, 151, 73, 1, + 2, 248, 188, 74, 73, 1, 2, 210, 77, 73, 1, 2, 206, 159, 4, 128, 73, 1, 2, + 233, 255, 73, 1, 2, 200, 229, 4, 211, 49, 128, 73, 1, 2, 124, 161, 73, 1, + 2, 197, 34, 73, 1, 2, 6, 68, 73, 1, 2, 196, 237, 4, 128, 73, 1, 2, 163, + 196, 236, 73, 1, 2, 192, 155, 73, 1, 2, 192, 156, 4, 207, 174, 128, 73, + 1, 2, 192, 156, 4, 238, 142, 73, 1, 2, 233, 166, 73, 1, 2, 199, 206, 38, + 235, 111, 230, 211, 251, 143, 38, 235, 111, 251, 130, 251, 143, 38, 202, + 225, 63, 38, 201, 89, 77, 38, 217, 213, 38, 230, 208, 38, 217, 211, 38, + 251, 127, 38, 230, 209, 38, 251, 128, 38, 8, 2, 1, 208, 112, 63, 38, 247, + 149, 38, 217, 212, 38, 55, 242, 122, 58, 38, 211, 244, 58, 38, 192, 21, + 63, 38, 223, 97, 63, 38, 197, 28, 58, 38, 197, 11, 58, 38, 8, 2, 1, 232, + 192, 211, 184, 41, 58, 38, 8, 2, 1, 251, 108, 38, 8, 2, 1, 250, 166, 38, + 8, 2, 1, 249, 247, 38, 8, 2, 1, 247, 53, 246, 151, 38, 8, 2, 1, 223, 143, + 238, 95, 38, 8, 2, 1, 233, 235, 38, 8, 2, 1, 232, 44, 38, 8, 1, 2, 6, + 232, 44, 38, 8, 2, 1, 222, 184, 38, 8, 2, 1, 165, 38, 8, 1, 2, 6, 165, + 38, 8, 1, 2, 6, 218, 236, 38, 8, 2, 1, 215, 151, 38, 8, 1, 2, 6, 215, + 151, 38, 8, 1, 2, 6, 150, 38, 8, 2, 1, 208, 112, 207, 10, 38, 8, 2, 1, + 206, 158, 38, 8, 2, 1, 184, 206, 158, 38, 8, 2, 1, 192, 155, 38, 8, 2, 1, + 250, 252, 38, 8, 2, 1, 249, 226, 38, 8, 2, 1, 248, 63, 38, 8, 2, 1, 205, + 240, 38, 8, 2, 1, 233, 163, 38, 8, 2, 1, 220, 202, 4, 55, 85, 199, 90, + 38, 8, 2, 1, 185, 4, 152, 246, 139, 111, 38, 8, 2, 1, 211, 93, 38, 8, 2, + 1, 233, 255, 38, 8, 2, 1, 124, 4, 152, 246, 139, 111, 38, 8, 2, 1, 194, + 202, 38, 8, 2, 1, 41, 4, 237, 14, 38, 8, 2, 1, 185, 4, 237, 14, 38, 8, 2, + 1, 124, 4, 237, 14, 38, 130, 200, 160, 58, 38, 222, 70, 95, 207, 101, 38, + 222, 70, 95, 220, 28, 38, 78, 95, 220, 28, 38, 194, 64, 223, 121, 247, + 143, 63, 38, 237, 85, 77, 38, 55, 223, 121, 247, 151, 63, 38, 251, 1, + 187, 115, 63, 38, 46, 250, 78, 58, 38, 51, 250, 78, 26, 142, 250, 78, 63, + 8, 6, 1, 41, 4, 207, 82, 63, 8, 2, 1, 41, 4, 207, 82, 63, 8, 6, 1, 76, 4, + 78, 58, 8, 2, 1, 76, 4, 78, 58, 8, 6, 1, 76, 4, 78, 63, 8, 2, 1, 76, 4, + 78, 63, 8, 6, 1, 76, 4, 219, 176, 63, 8, 2, 1, 76, 4, 219, 176, 63, 8, 6, + 1, 247, 53, 4, 246, 152, 26, 251, 129, 8, 2, 1, 247, 53, 4, 246, 152, 26, + 251, 129, 8, 6, 1, 238, 96, 4, 78, 58, 8, 2, 1, 238, 96, 4, 78, 58, 8, 6, + 1, 238, 96, 4, 78, 63, 8, 2, 1, 238, 96, 4, 78, 63, 8, 6, 1, 238, 96, 4, + 219, 176, 63, 8, 2, 1, 238, 96, 4, 219, 176, 63, 8, 6, 1, 238, 96, 4, + 246, 151, 8, 2, 1, 238, 96, 4, 246, 151, 8, 6, 1, 238, 96, 4, 242, 122, + 63, 8, 2, 1, 238, 96, 4, 242, 122, 63, 8, 6, 1, 234, 253, 4, 217, 215, + 26, 230, 210, 8, 2, 1, 234, 253, 4, 217, 215, 26, 230, 210, 8, 6, 1, 234, + 253, 4, 217, 215, 26, 251, 129, 8, 2, 1, 234, 253, 4, 217, 215, 26, 251, + 129, 8, 6, 1, 234, 253, 4, 242, 122, 63, 8, 2, 1, 234, 253, 4, 242, 122, + 63, 8, 6, 1, 234, 253, 4, 199, 91, 63, 8, 2, 1, 234, 253, 4, 199, 91, 63, + 8, 6, 1, 234, 253, 4, 246, 152, 26, 247, 150, 8, 2, 1, 234, 253, 4, 246, + 152, 26, 247, 150, 8, 6, 1, 233, 164, 4, 78, 58, 8, 2, 1, 233, 164, 4, + 78, 58, 8, 6, 1, 232, 45, 4, 217, 214, 8, 2, 1, 232, 45, 4, 217, 214, 8, + 6, 1, 230, 125, 4, 78, 58, 8, 2, 1, 230, 125, 4, 78, 58, 8, 6, 1, 230, + 125, 4, 78, 63, 8, 2, 1, 230, 125, 4, 78, 63, 8, 6, 1, 230, 125, 4, 237, + 14, 8, 2, 1, 230, 125, 4, 237, 14, 8, 6, 1, 230, 125, 4, 246, 151, 8, 2, + 1, 230, 125, 4, 246, 151, 8, 6, 1, 230, 125, 4, 247, 151, 63, 8, 2, 1, + 230, 125, 4, 247, 151, 63, 8, 6, 1, 228, 97, 4, 199, 91, 63, 8, 2, 1, + 228, 97, 4, 199, 91, 63, 8, 6, 1, 228, 97, 4, 237, 15, 26, 251, 129, 8, + 2, 1, 228, 97, 4, 237, 15, 26, 251, 129, 8, 6, 1, 222, 185, 4, 251, 129, + 8, 2, 1, 222, 185, 4, 251, 129, 8, 6, 1, 222, 185, 4, 78, 63, 8, 2, 1, + 222, 185, 4, 78, 63, 8, 6, 1, 222, 185, 4, 219, 176, 63, 8, 2, 1, 222, + 185, 4, 219, 176, 63, 8, 6, 1, 220, 202, 4, 78, 63, 8, 2, 1, 220, 202, 4, + 78, 63, 8, 6, 1, 220, 202, 4, 78, 248, 84, 26, 217, 214, 8, 2, 1, 220, + 202, 4, 78, 248, 84, 26, 217, 214, 8, 6, 1, 220, 202, 4, 219, 176, 63, 8, + 2, 1, 220, 202, 4, 219, 176, 63, 8, 6, 1, 220, 202, 4, 242, 122, 63, 8, + 2, 1, 220, 202, 4, 242, 122, 63, 8, 6, 1, 218, 237, 4, 251, 129, 8, 2, 1, + 218, 237, 4, 251, 129, 8, 6, 1, 218, 237, 4, 78, 58, 8, 2, 1, 218, 237, + 4, 78, 58, 8, 6, 1, 218, 237, 4, 78, 63, 8, 2, 1, 218, 237, 4, 78, 63, 8, + 6, 1, 215, 152, 4, 78, 58, 8, 2, 1, 215, 152, 4, 78, 58, 8, 6, 1, 215, + 152, 4, 78, 63, 8, 2, 1, 215, 152, 4, 78, 63, 8, 6, 1, 215, 152, 4, 219, + 176, 63, 8, 2, 1, 215, 152, 4, 219, 176, 63, 8, 6, 1, 215, 152, 4, 242, + 122, 63, 8, 2, 1, 215, 152, 4, 242, 122, 63, 8, 6, 1, 185, 4, 199, 91, + 26, 251, 129, 8, 2, 1, 185, 4, 199, 91, 26, 251, 129, 8, 6, 1, 185, 4, + 199, 91, 26, 237, 14, 8, 2, 1, 185, 4, 199, 91, 26, 237, 14, 8, 6, 1, + 185, 4, 217, 215, 26, 230, 210, 8, 2, 1, 185, 4, 217, 215, 26, 230, 210, + 8, 6, 1, 185, 4, 217, 215, 26, 251, 129, 8, 2, 1, 185, 4, 217, 215, 26, + 251, 129, 8, 6, 1, 211, 94, 4, 251, 129, 8, 2, 1, 211, 94, 4, 251, 129, + 8, 6, 1, 211, 94, 4, 78, 58, 8, 2, 1, 211, 94, 4, 78, 58, 8, 6, 1, 208, + 112, 4, 78, 58, 8, 2, 1, 208, 112, 4, 78, 58, 8, 6, 1, 208, 112, 4, 78, + 63, 8, 2, 1, 208, 112, 4, 78, 63, 8, 6, 1, 208, 112, 4, 78, 248, 84, 26, + 217, 214, 8, 2, 1, 208, 112, 4, 78, 248, 84, 26, 217, 214, 8, 6, 1, 208, + 112, 4, 219, 176, 63, 8, 2, 1, 208, 112, 4, 219, 176, 63, 8, 6, 1, 206, + 159, 4, 78, 58, 8, 2, 1, 206, 159, 4, 78, 58, 8, 6, 1, 206, 159, 4, 78, + 63, 8, 2, 1, 206, 159, 4, 78, 63, 8, 6, 1, 206, 159, 4, 251, 130, 26, 78, + 58, 8, 2, 1, 206, 159, 4, 251, 130, 26, 78, 58, 8, 6, 1, 206, 159, 4, + 246, 208, 26, 78, 58, 8, 2, 1, 206, 159, 4, 246, 208, 26, 78, 58, 8, 6, + 1, 206, 159, 4, 78, 248, 84, 26, 78, 58, 8, 2, 1, 206, 159, 4, 78, 248, + 84, 26, 78, 58, 8, 6, 1, 200, 229, 4, 78, 58, 8, 2, 1, 200, 229, 4, 78, + 58, 8, 6, 1, 200, 229, 4, 78, 63, 8, 2, 1, 200, 229, 4, 78, 63, 8, 6, 1, + 200, 229, 4, 219, 176, 63, 8, 2, 1, 200, 229, 4, 219, 176, 63, 8, 6, 1, + 200, 229, 4, 242, 122, 63, 8, 2, 1, 200, 229, 4, 242, 122, 63, 8, 6, 1, + 124, 4, 237, 15, 63, 8, 2, 1, 124, 4, 237, 15, 63, 8, 6, 1, 124, 4, 199, + 91, 63, 8, 2, 1, 124, 4, 199, 91, 63, 8, 6, 1, 124, 4, 242, 122, 63, 8, + 2, 1, 124, 4, 242, 122, 63, 8, 6, 1, 124, 4, 199, 91, 26, 251, 129, 8, 2, + 1, 124, 4, 199, 91, 26, 251, 129, 8, 6, 1, 124, 4, 217, 215, 26, 237, 14, + 8, 2, 1, 124, 4, 217, 215, 26, 237, 14, 8, 6, 1, 196, 237, 4, 199, 90, 8, + 2, 1, 196, 237, 4, 199, 90, 8, 6, 1, 196, 237, 4, 78, 63, 8, 2, 1, 196, + 237, 4, 78, 63, 8, 6, 1, 194, 203, 4, 230, 210, 8, 2, 1, 194, 203, 4, + 230, 210, 8, 6, 1, 194, 203, 4, 251, 129, 8, 2, 1, 194, 203, 4, 251, 129, + 8, 6, 1, 194, 203, 4, 237, 14, 8, 2, 1, 194, 203, 4, 237, 14, 8, 6, 1, + 194, 203, 4, 78, 58, 8, 2, 1, 194, 203, 4, 78, 58, 8, 6, 1, 194, 203, 4, + 78, 63, 8, 2, 1, 194, 203, 4, 78, 63, 8, 6, 1, 193, 224, 4, 78, 58, 8, 2, + 1, 193, 224, 4, 78, 58, 8, 6, 1, 193, 224, 4, 237, 14, 8, 2, 1, 193, 224, + 4, 237, 14, 8, 6, 1, 193, 149, 4, 78, 58, 8, 2, 1, 193, 149, 4, 78, 58, + 8, 6, 1, 192, 156, 4, 242, 121, 8, 2, 1, 192, 156, 4, 242, 121, 8, 6, 1, + 192, 156, 4, 78, 63, 8, 2, 1, 192, 156, 4, 78, 63, 8, 6, 1, 192, 156, 4, + 219, 176, 63, 8, 2, 1, 192, 156, 4, 219, 176, 63, 8, 2, 1, 230, 125, 4, + 219, 176, 63, 8, 2, 1, 200, 229, 4, 237, 14, 8, 2, 1, 194, 203, 4, 207, + 82, 58, 8, 2, 1, 193, 149, 4, 207, 82, 58, 8, 2, 1, 41, 4, 51, 138, 207, + 81, 8, 2, 1, 184, 206, 159, 4, 78, 58, 8, 2, 1, 184, 206, 159, 4, 237, + 11, 111, 8, 2, 1, 184, 206, 159, 4, 139, 111, 8, 6, 1, 204, 26, 206, 158, + 8, 2, 1, 237, 76, 8, 6, 1, 41, 4, 78, 63, 8, 2, 1, 41, 4, 78, 63, 8, 6, + 1, 41, 4, 229, 15, 58, 8, 2, 1, 41, 4, 229, 15, 58, 8, 6, 1, 41, 4, 242, + 122, 26, 251, 129, 8, 2, 1, 41, 4, 242, 122, 26, 251, 129, 8, 6, 1, 41, + 4, 242, 122, 26, 230, 210, 8, 2, 1, 41, 4, 242, 122, 26, 230, 210, 8, 6, + 1, 41, 4, 242, 122, 26, 229, 15, 58, 8, 2, 1, 41, 4, 242, 122, 26, 229, + 15, 58, 8, 6, 1, 41, 4, 242, 122, 26, 199, 90, 8, 2, 1, 41, 4, 242, 122, + 26, 199, 90, 8, 6, 1, 41, 4, 242, 122, 26, 78, 63, 8, 2, 1, 41, 4, 242, + 122, 26, 78, 63, 8, 6, 1, 41, 4, 247, 151, 26, 251, 129, 8, 2, 1, 41, 4, + 247, 151, 26, 251, 129, 8, 6, 1, 41, 4, 247, 151, 26, 230, 210, 8, 2, 1, + 41, 4, 247, 151, 26, 230, 210, 8, 6, 1, 41, 4, 247, 151, 26, 229, 15, 58, + 8, 2, 1, 41, 4, 247, 151, 26, 229, 15, 58, 8, 6, 1, 41, 4, 247, 151, 26, + 199, 90, 8, 2, 1, 41, 4, 247, 151, 26, 199, 90, 8, 6, 1, 41, 4, 247, 151, + 26, 78, 63, 8, 2, 1, 41, 4, 247, 151, 26, 78, 63, 8, 6, 1, 234, 253, 4, + 78, 63, 8, 2, 1, 234, 253, 4, 78, 63, 8, 6, 1, 234, 253, 4, 229, 15, 58, + 8, 2, 1, 234, 253, 4, 229, 15, 58, 8, 6, 1, 234, 253, 4, 199, 90, 8, 2, + 1, 234, 253, 4, 199, 90, 8, 6, 1, 234, 253, 4, 242, 122, 26, 251, 129, 8, + 2, 1, 234, 253, 4, 242, 122, 26, 251, 129, 8, 6, 1, 234, 253, 4, 242, + 122, 26, 230, 210, 8, 2, 1, 234, 253, 4, 242, 122, 26, 230, 210, 8, 6, 1, + 234, 253, 4, 242, 122, 26, 229, 15, 58, 8, 2, 1, 234, 253, 4, 242, 122, + 26, 229, 15, 58, 8, 6, 1, 234, 253, 4, 242, 122, 26, 199, 90, 8, 2, 1, + 234, 253, 4, 242, 122, 26, 199, 90, 8, 6, 1, 234, 253, 4, 242, 122, 26, + 78, 63, 8, 2, 1, 234, 253, 4, 242, 122, 26, 78, 63, 8, 6, 1, 228, 97, 4, + 229, 15, 58, 8, 2, 1, 228, 97, 4, 229, 15, 58, 8, 6, 1, 228, 97, 4, 78, + 63, 8, 2, 1, 228, 97, 4, 78, 63, 8, 6, 1, 185, 4, 78, 63, 8, 2, 1, 185, + 4, 78, 63, 8, 6, 1, 185, 4, 229, 15, 58, 8, 2, 1, 185, 4, 229, 15, 58, 8, + 6, 1, 185, 4, 242, 122, 26, 251, 129, 8, 2, 1, 185, 4, 242, 122, 26, 251, + 129, 8, 6, 1, 185, 4, 242, 122, 26, 230, 210, 8, 2, 1, 185, 4, 242, 122, + 26, 230, 210, 8, 6, 1, 185, 4, 242, 122, 26, 229, 15, 58, 8, 2, 1, 185, + 4, 242, 122, 26, 229, 15, 58, 8, 6, 1, 185, 4, 242, 122, 26, 199, 90, 8, + 2, 1, 185, 4, 242, 122, 26, 199, 90, 8, 6, 1, 185, 4, 242, 122, 26, 78, + 63, 8, 2, 1, 185, 4, 242, 122, 26, 78, 63, 8, 6, 1, 185, 4, 228, 209, 26, + 251, 129, 8, 2, 1, 185, 4, 228, 209, 26, 251, 129, 8, 6, 1, 185, 4, 228, + 209, 26, 230, 210, 8, 2, 1, 185, 4, 228, 209, 26, 230, 210, 8, 6, 1, 185, + 4, 228, 209, 26, 229, 15, 58, 8, 2, 1, 185, 4, 228, 209, 26, 229, 15, 58, + 8, 6, 1, 185, 4, 228, 209, 26, 199, 90, 8, 2, 1, 185, 4, 228, 209, 26, + 199, 90, 8, 6, 1, 185, 4, 228, 209, 26, 78, 63, 8, 2, 1, 185, 4, 228, + 209, 26, 78, 63, 8, 6, 1, 124, 4, 78, 63, 8, 2, 1, 124, 4, 78, 63, 8, 6, + 1, 124, 4, 229, 15, 58, 8, 2, 1, 124, 4, 229, 15, 58, 8, 6, 1, 124, 4, + 228, 209, 26, 251, 129, 8, 2, 1, 124, 4, 228, 209, 26, 251, 129, 8, 6, 1, + 124, 4, 228, 209, 26, 230, 210, 8, 2, 1, 124, 4, 228, 209, 26, 230, 210, + 8, 6, 1, 124, 4, 228, 209, 26, 229, 15, 58, 8, 2, 1, 124, 4, 228, 209, + 26, 229, 15, 58, 8, 6, 1, 124, 4, 228, 209, 26, 199, 90, 8, 2, 1, 124, 4, + 228, 209, 26, 199, 90, 8, 6, 1, 124, 4, 228, 209, 26, 78, 63, 8, 2, 1, + 124, 4, 228, 209, 26, 78, 63, 8, 6, 1, 193, 149, 4, 230, 210, 8, 2, 1, + 193, 149, 4, 230, 210, 8, 6, 1, 193, 149, 4, 78, 63, 8, 2, 1, 193, 149, + 4, 78, 63, 8, 6, 1, 193, 149, 4, 229, 15, 58, 8, 2, 1, 193, 149, 4, 229, + 15, 58, 8, 6, 1, 193, 149, 4, 199, 90, 8, 2, 1, 193, 149, 4, 199, 90, 8, + 6, 1, 216, 159, 219, 138, 8, 2, 1, 216, 159, 219, 138, 8, 6, 1, 216, 159, + 196, 236, 8, 2, 1, 216, 159, 196, 236, 8, 6, 1, 193, 149, 4, 219, 69, 8, + 2, 1, 193, 149, 4, 219, 69, 33, 2, 1, 250, 253, 4, 209, 55, 33, 2, 1, + 250, 253, 4, 237, 182, 33, 2, 1, 250, 253, 4, 209, 56, 26, 196, 138, 33, + 2, 1, 250, 253, 4, 237, 183, 26, 196, 138, 33, 2, 1, 250, 253, 4, 209, + 56, 26, 211, 99, 33, 2, 1, 250, 253, 4, 237, 183, 26, 211, 99, 33, 2, 1, + 250, 253, 4, 209, 56, 26, 210, 126, 33, 2, 1, 250, 253, 4, 237, 183, 26, + 210, 126, 33, 6, 1, 250, 253, 4, 209, 55, 33, 6, 1, 250, 253, 4, 237, + 182, 33, 6, 1, 250, 253, 4, 209, 56, 26, 196, 138, 33, 6, 1, 250, 253, 4, + 237, 183, 26, 196, 138, 33, 6, 1, 250, 253, 4, 209, 56, 26, 211, 99, 33, + 6, 1, 250, 253, 4, 237, 183, 26, 211, 99, 33, 6, 1, 250, 253, 4, 209, 56, + 26, 210, 126, 33, 6, 1, 250, 253, 4, 237, 183, 26, 210, 126, 33, 2, 1, + 234, 33, 4, 209, 55, 33, 2, 1, 234, 33, 4, 237, 182, 33, 2, 1, 234, 33, + 4, 209, 56, 26, 196, 138, 33, 2, 1, 234, 33, 4, 237, 183, 26, 196, 138, + 33, 2, 1, 234, 33, 4, 209, 56, 26, 211, 99, 33, 2, 1, 234, 33, 4, 237, + 183, 26, 211, 99, 33, 6, 1, 234, 33, 4, 209, 55, 33, 6, 1, 234, 33, 4, + 237, 182, 33, 6, 1, 234, 33, 4, 209, 56, 26, 196, 138, 33, 6, 1, 234, 33, + 4, 237, 183, 26, 196, 138, 33, 6, 1, 234, 33, 4, 209, 56, 26, 211, 99, + 33, 6, 1, 234, 33, 4, 237, 183, 26, 211, 99, 33, 2, 1, 233, 241, 4, 209, + 55, 33, 2, 1, 233, 241, 4, 237, 182, 33, 2, 1, 233, 241, 4, 209, 56, 26, + 196, 138, 33, 2, 1, 233, 241, 4, 237, 183, 26, 196, 138, 33, 2, 1, 233, + 241, 4, 209, 56, 26, 211, 99, 33, 2, 1, 233, 241, 4, 237, 183, 26, 211, + 99, 33, 2, 1, 233, 241, 4, 209, 56, 26, 210, 126, 33, 2, 1, 233, 241, 4, + 237, 183, 26, 210, 126, 33, 6, 1, 233, 241, 4, 209, 55, 33, 6, 1, 233, + 241, 4, 237, 182, 33, 6, 1, 233, 241, 4, 209, 56, 26, 196, 138, 33, 6, 1, + 233, 241, 4, 237, 183, 26, 196, 138, 33, 6, 1, 233, 241, 4, 209, 56, 26, + 211, 99, 33, 6, 1, 233, 241, 4, 237, 183, 26, 211, 99, 33, 6, 1, 233, + 241, 4, 209, 56, 26, 210, 126, 33, 6, 1, 233, 241, 4, 237, 183, 26, 210, + 126, 33, 2, 1, 223, 112, 4, 209, 55, 33, 2, 1, 223, 112, 4, 237, 182, 33, + 2, 1, 223, 112, 4, 209, 56, 26, 196, 138, 33, 2, 1, 223, 112, 4, 237, + 183, 26, 196, 138, 33, 2, 1, 223, 112, 4, 209, 56, 26, 211, 99, 33, 2, 1, + 223, 112, 4, 237, 183, 26, 211, 99, 33, 2, 1, 223, 112, 4, 209, 56, 26, + 210, 126, 33, 2, 1, 223, 112, 4, 237, 183, 26, 210, 126, 33, 6, 1, 223, + 112, 4, 209, 55, 33, 6, 1, 223, 112, 4, 237, 182, 33, 6, 1, 223, 112, 4, + 209, 56, 26, 196, 138, 33, 6, 1, 223, 112, 4, 237, 183, 26, 196, 138, 33, + 6, 1, 223, 112, 4, 209, 56, 26, 211, 99, 33, 6, 1, 223, 112, 4, 237, 183, + 26, 211, 99, 33, 6, 1, 223, 112, 4, 209, 56, 26, 210, 126, 33, 6, 1, 223, + 112, 4, 237, 183, 26, 210, 126, 33, 2, 1, 211, 215, 4, 209, 55, 33, 2, 1, + 211, 215, 4, 237, 182, 33, 2, 1, 211, 215, 4, 209, 56, 26, 196, 138, 33, + 2, 1, 211, 215, 4, 237, 183, 26, 196, 138, 33, 2, 1, 211, 215, 4, 209, + 56, 26, 211, 99, 33, 2, 1, 211, 215, 4, 237, 183, 26, 211, 99, 33, 6, 1, + 211, 215, 4, 209, 55, 33, 6, 1, 211, 215, 4, 237, 182, 33, 6, 1, 211, + 215, 4, 209, 56, 26, 196, 138, 33, 6, 1, 211, 215, 4, 237, 183, 26, 196, + 138, 33, 6, 1, 211, 215, 4, 209, 56, 26, 211, 99, 33, 6, 1, 211, 215, 4, + 237, 183, 26, 211, 99, 33, 2, 1, 197, 35, 4, 209, 55, 33, 2, 1, 197, 35, + 4, 237, 182, 33, 2, 1, 197, 35, 4, 209, 56, 26, 196, 138, 33, 2, 1, 197, + 35, 4, 237, 183, 26, 196, 138, 33, 2, 1, 197, 35, 4, 209, 56, 26, 211, + 99, 33, 2, 1, 197, 35, 4, 237, 183, 26, 211, 99, 33, 2, 1, 197, 35, 4, + 209, 56, 26, 210, 126, 33, 2, 1, 197, 35, 4, 237, 183, 26, 210, 126, 33, + 6, 1, 197, 35, 4, 237, 182, 33, 6, 1, 197, 35, 4, 237, 183, 26, 196, 138, + 33, 6, 1, 197, 35, 4, 237, 183, 26, 211, 99, 33, 6, 1, 197, 35, 4, 237, + 183, 26, 210, 126, 33, 2, 1, 211, 217, 4, 209, 55, 33, 2, 1, 211, 217, 4, + 237, 182, 33, 2, 1, 211, 217, 4, 209, 56, 26, 196, 138, 33, 2, 1, 211, + 217, 4, 237, 183, 26, 196, 138, 33, 2, 1, 211, 217, 4, 209, 56, 26, 211, + 99, 33, 2, 1, 211, 217, 4, 237, 183, 26, 211, 99, 33, 2, 1, 211, 217, 4, + 209, 56, 26, 210, 126, 33, 2, 1, 211, 217, 4, 237, 183, 26, 210, 126, 33, + 6, 1, 211, 217, 4, 209, 55, 33, 6, 1, 211, 217, 4, 237, 182, 33, 6, 1, + 211, 217, 4, 209, 56, 26, 196, 138, 33, 6, 1, 211, 217, 4, 237, 183, 26, + 196, 138, 33, 6, 1, 211, 217, 4, 209, 56, 26, 211, 99, 33, 6, 1, 211, + 217, 4, 237, 183, 26, 211, 99, 33, 6, 1, 211, 217, 4, 209, 56, 26, 210, + 126, 33, 6, 1, 211, 217, 4, 237, 183, 26, 210, 126, 33, 2, 1, 250, 253, + 4, 196, 138, 33, 2, 1, 250, 253, 4, 211, 99, 33, 2, 1, 234, 33, 4, 196, + 138, 33, 2, 1, 234, 33, 4, 211, 99, 33, 2, 1, 233, 241, 4, 196, 138, 33, + 2, 1, 233, 241, 4, 211, 99, 33, 2, 1, 223, 112, 4, 196, 138, 33, 2, 1, + 223, 112, 4, 211, 99, 33, 2, 1, 211, 215, 4, 196, 138, 33, 2, 1, 211, + 215, 4, 211, 99, 33, 2, 1, 197, 35, 4, 196, 138, 33, 2, 1, 197, 35, 4, + 211, 99, 33, 2, 1, 211, 217, 4, 196, 138, 33, 2, 1, 211, 217, 4, 211, 99, + 33, 2, 1, 250, 253, 4, 209, 56, 26, 192, 222, 33, 2, 1, 250, 253, 4, 237, + 183, 26, 192, 222, 33, 2, 1, 250, 253, 4, 209, 56, 26, 196, 139, 26, 192, + 222, 33, 2, 1, 250, 253, 4, 237, 183, 26, 196, 139, 26, 192, 222, 33, 2, + 1, 250, 253, 4, 209, 56, 26, 211, 100, 26, 192, 222, 33, 2, 1, 250, 253, + 4, 237, 183, 26, 211, 100, 26, 192, 222, 33, 2, 1, 250, 253, 4, 209, 56, + 26, 210, 127, 26, 192, 222, 33, 2, 1, 250, 253, 4, 237, 183, 26, 210, + 127, 26, 192, 222, 33, 6, 1, 250, 253, 4, 209, 56, 26, 209, 69, 33, 6, 1, + 250, 253, 4, 237, 183, 26, 209, 69, 33, 6, 1, 250, 253, 4, 209, 56, 26, + 196, 139, 26, 209, 69, 33, 6, 1, 250, 253, 4, 237, 183, 26, 196, 139, 26, + 209, 69, 33, 6, 1, 250, 253, 4, 209, 56, 26, 211, 100, 26, 209, 69, 33, + 6, 1, 250, 253, 4, 237, 183, 26, 211, 100, 26, 209, 69, 33, 6, 1, 250, + 253, 4, 209, 56, 26, 210, 127, 26, 209, 69, 33, 6, 1, 250, 253, 4, 237, + 183, 26, 210, 127, 26, 209, 69, 33, 2, 1, 233, 241, 4, 209, 56, 26, 192, + 222, 33, 2, 1, 233, 241, 4, 237, 183, 26, 192, 222, 33, 2, 1, 233, 241, + 4, 209, 56, 26, 196, 139, 26, 192, 222, 33, 2, 1, 233, 241, 4, 237, 183, + 26, 196, 139, 26, 192, 222, 33, 2, 1, 233, 241, 4, 209, 56, 26, 211, 100, + 26, 192, 222, 33, 2, 1, 233, 241, 4, 237, 183, 26, 211, 100, 26, 192, + 222, 33, 2, 1, 233, 241, 4, 209, 56, 26, 210, 127, 26, 192, 222, 33, 2, + 1, 233, 241, 4, 237, 183, 26, 210, 127, 26, 192, 222, 33, 6, 1, 233, 241, + 4, 209, 56, 26, 209, 69, 33, 6, 1, 233, 241, 4, 237, 183, 26, 209, 69, + 33, 6, 1, 233, 241, 4, 209, 56, 26, 196, 139, 26, 209, 69, 33, 6, 1, 233, + 241, 4, 237, 183, 26, 196, 139, 26, 209, 69, 33, 6, 1, 233, 241, 4, 209, + 56, 26, 211, 100, 26, 209, 69, 33, 6, 1, 233, 241, 4, 237, 183, 26, 211, + 100, 26, 209, 69, 33, 6, 1, 233, 241, 4, 209, 56, 26, 210, 127, 26, 209, + 69, 33, 6, 1, 233, 241, 4, 237, 183, 26, 210, 127, 26, 209, 69, 33, 2, 1, + 211, 217, 4, 209, 56, 26, 192, 222, 33, 2, 1, 211, 217, 4, 237, 183, 26, + 192, 222, 33, 2, 1, 211, 217, 4, 209, 56, 26, 196, 139, 26, 192, 222, 33, + 2, 1, 211, 217, 4, 237, 183, 26, 196, 139, 26, 192, 222, 33, 2, 1, 211, + 217, 4, 209, 56, 26, 211, 100, 26, 192, 222, 33, 2, 1, 211, 217, 4, 237, + 183, 26, 211, 100, 26, 192, 222, 33, 2, 1, 211, 217, 4, 209, 56, 26, 210, + 127, 26, 192, 222, 33, 2, 1, 211, 217, 4, 237, 183, 26, 210, 127, 26, + 192, 222, 33, 6, 1, 211, 217, 4, 209, 56, 26, 209, 69, 33, 6, 1, 211, + 217, 4, 237, 183, 26, 209, 69, 33, 6, 1, 211, 217, 4, 209, 56, 26, 196, + 139, 26, 209, 69, 33, 6, 1, 211, 217, 4, 237, 183, 26, 196, 139, 26, 209, + 69, 33, 6, 1, 211, 217, 4, 209, 56, 26, 211, 100, 26, 209, 69, 33, 6, 1, + 211, 217, 4, 237, 183, 26, 211, 100, 26, 209, 69, 33, 6, 1, 211, 217, 4, + 209, 56, 26, 210, 127, 26, 209, 69, 33, 6, 1, 211, 217, 4, 237, 183, 26, + 210, 127, 26, 209, 69, 33, 2, 1, 250, 253, 4, 195, 227, 33, 2, 1, 250, + 253, 4, 217, 214, 33, 2, 1, 250, 253, 4, 196, 139, 26, 192, 222, 33, 2, + 1, 250, 253, 4, 192, 222, 33, 2, 1, 250, 253, 4, 211, 100, 26, 192, 222, + 33, 2, 1, 250, 253, 4, 210, 126, 33, 2, 1, 250, 253, 4, 210, 127, 26, + 192, 222, 33, 6, 1, 250, 253, 4, 195, 227, 33, 6, 1, 250, 253, 4, 217, + 214, 33, 6, 1, 250, 253, 4, 196, 138, 33, 6, 1, 250, 253, 4, 211, 99, 33, + 6, 1, 250, 253, 4, 209, 69, 33, 221, 78, 33, 209, 69, 33, 209, 55, 33, + 210, 126, 33, 237, 8, 26, 210, 126, 33, 2, 1, 233, 241, 4, 196, 139, 26, + 192, 222, 33, 2, 1, 233, 241, 4, 192, 222, 33, 2, 1, 233, 241, 4, 211, + 100, 26, 192, 222, 33, 2, 1, 233, 241, 4, 210, 126, 33, 2, 1, 233, 241, + 4, 210, 127, 26, 192, 222, 33, 6, 1, 234, 33, 4, 196, 138, 33, 6, 1, 234, + 33, 4, 211, 99, 33, 6, 1, 233, 241, 4, 196, 138, 33, 6, 1, 233, 241, 4, + 211, 99, 33, 6, 1, 233, 241, 4, 209, 69, 33, 209, 56, 26, 196, 138, 33, + 209, 56, 26, 211, 99, 33, 209, 56, 26, 210, 126, 33, 2, 1, 223, 112, 4, + 195, 227, 33, 2, 1, 223, 112, 4, 217, 214, 33, 2, 1, 223, 112, 4, 237, 8, + 26, 196, 138, 33, 2, 1, 223, 112, 4, 237, 8, 26, 211, 99, 33, 2, 1, 223, + 112, 4, 210, 126, 33, 2, 1, 223, 112, 4, 237, 8, 26, 210, 126, 33, 6, 1, + 223, 112, 4, 195, 227, 33, 6, 1, 223, 112, 4, 217, 214, 33, 6, 1, 223, + 112, 4, 196, 138, 33, 6, 1, 223, 112, 4, 211, 99, 33, 237, 183, 26, 196, + 138, 33, 237, 183, 26, 211, 99, 33, 237, 183, 26, 210, 126, 33, 2, 1, + 197, 35, 4, 195, 227, 33, 2, 1, 197, 35, 4, 217, 214, 33, 2, 1, 197, 35, + 4, 237, 8, 26, 196, 138, 33, 2, 1, 197, 35, 4, 237, 8, 26, 211, 99, 33, + 2, 1, 207, 154, 4, 209, 55, 33, 2, 1, 207, 154, 4, 237, 182, 33, 2, 1, + 197, 35, 4, 210, 126, 33, 2, 1, 197, 35, 4, 237, 8, 26, 210, 126, 33, 6, + 1, 197, 35, 4, 195, 227, 33, 6, 1, 197, 35, 4, 217, 214, 33, 6, 1, 197, + 35, 4, 196, 138, 33, 6, 1, 197, 35, 4, 211, 99, 33, 6, 1, 207, 154, 4, + 237, 182, 33, 237, 8, 26, 196, 138, 33, 237, 8, 26, 211, 99, 33, 196, + 138, 33, 2, 1, 211, 217, 4, 196, 139, 26, 192, 222, 33, 2, 1, 211, 217, + 4, 192, 222, 33, 2, 1, 211, 217, 4, 211, 100, 26, 192, 222, 33, 2, 1, + 211, 217, 4, 210, 126, 33, 2, 1, 211, 217, 4, 210, 127, 26, 192, 222, 33, + 6, 1, 211, 215, 4, 196, 138, 33, 6, 1, 211, 215, 4, 211, 99, 33, 6, 1, + 211, 217, 4, 196, 138, 33, 6, 1, 211, 217, 4, 211, 99, 33, 6, 1, 211, + 217, 4, 209, 69, 33, 211, 99, 33, 237, 182, 234, 89, 208, 174, 234, 100, + 208, 174, 234, 89, 202, 160, 234, 100, 202, 160, 199, 154, 202, 160, 232, + 117, 202, 160, 203, 39, 202, 160, 233, 1, 202, 160, 209, 38, 202, 160, + 199, 195, 202, 160, 230, 87, 202, 160, 192, 77, 194, 61, 202, 160, 192, + 77, 194, 61, 213, 128, 192, 77, 194, 61, 222, 228, 220, 19, 77, 207, 92, + 77, 228, 111, 213, 129, 228, 111, 233, 1, 237, 185, 234, 89, 237, 185, + 234, 100, 237, 185, 229, 5, 161, 55, 84, 219, 175, 55, 132, 219, 175, 46, + 203, 74, 208, 142, 77, 51, 203, 74, 208, 142, 77, 203, 74, 219, 51, 208, + 142, 77, 203, 74, 229, 152, 208, 142, 77, 46, 55, 208, 142, 77, 51, 55, + 208, 142, 77, 55, 219, 51, 208, 142, 77, 55, 229, 152, 208, 142, 77, 237, + 238, 55, 237, 238, 247, 106, 198, 182, 247, 106, 90, 78, 220, 40, 103, + 78, 220, 40, 229, 5, 234, 105, 228, 109, 209, 191, 219, 176, 204, 165, + 210, 244, 204, 165, 220, 19, 234, 98, 207, 92, 234, 98, 209, 169, 236, + 204, 232, 134, 220, 19, 211, 107, 207, 92, 211, 107, 215, 50, 213, 136, + 202, 160, 210, 134, 216, 126, 57, 210, 134, 200, 31, 199, 165, 57, 209, + 99, 55, 209, 99, 198, 170, 209, 99, 207, 168, 209, 99, 207, 168, 55, 209, + 99, 207, 168, 198, 170, 209, 99, 246, 211, 203, 74, 220, 23, 250, 208, + 208, 142, 77, 203, 74, 207, 96, 250, 208, 208, 142, 77, 207, 233, 77, 55, + 233, 204, 77, 223, 130, 211, 109, 197, 64, 246, 100, 199, 113, 246, 212, + 223, 147, 209, 191, 250, 35, 228, 112, 247, 106, 232, 109, 203, 4, 46, + 50, 247, 165, 4, 208, 153, 51, 50, 247, 165, 4, 208, 153, 55, 208, 159, + 77, 208, 159, 233, 204, 77, 233, 204, 208, 159, 77, 199, 66, 3, 233, 242, + 207, 168, 210, 9, 57, 60, 114, 247, 106, 60, 94, 247, 106, 132, 250, 37, + 207, 168, 204, 180, 242, 85, 197, 41, 103, 250, 36, 251, 12, 196, 54, + 242, 36, 216, 113, 57, 201, 58, 237, 185, 223, 121, 197, 64, 232, 176, + 209, 38, 77, 112, 78, 209, 37, 208, 170, 209, 99, 232, 119, 78, 209, 37, + 232, 214, 78, 209, 37, 103, 78, 209, 37, 232, 119, 78, 77, 235, 111, 238, + 183, 198, 181, 84, 232, 119, 236, 111, 217, 31, 13, 202, 160, 194, 11, + 222, 228, 232, 69, 250, 142, 223, 119, 199, 82, 223, 119, 204, 165, 223, + 119, 209, 206, 220, 19, 223, 88, 207, 92, 223, 88, 232, 226, 201, 194, + 223, 88, 209, 169, 236, 204, 223, 88, 223, 160, 201, 4, 201, 76, 251, + 132, 201, 4, 201, 76, 223, 160, 9, 232, 136, 204, 32, 251, 132, 9, 232, + 136, 204, 32, 215, 44, 17, 204, 33, 213, 132, 17, 204, 33, 201, 107, 192, + 76, 201, 107, 8, 2, 1, 70, 201, 107, 134, 201, 107, 151, 201, 107, 170, + 201, 107, 179, 201, 107, 174, 201, 107, 182, 201, 107, 102, 57, 201, 107, + 216, 112, 201, 107, 234, 30, 57, 201, 107, 46, 210, 230, 201, 107, 51, + 210, 230, 201, 107, 8, 2, 1, 215, 151, 201, 155, 192, 76, 201, 155, 101, + 201, 155, 104, 201, 155, 133, 201, 155, 134, 201, 155, 151, 201, 155, + 170, 201, 155, 179, 201, 155, 174, 201, 155, 182, 201, 155, 102, 57, 201, + 155, 216, 112, 201, 155, 234, 30, 57, 201, 155, 46, 210, 230, 201, 155, + 51, 210, 230, 8, 201, 155, 2, 1, 64, 8, 201, 155, 2, 1, 71, 8, 201, 155, + 2, 1, 74, 8, 201, 155, 2, 1, 193, 223, 8, 201, 155, 2, 1, 205, 240, 8, + 201, 155, 2, 1, 230, 124, 8, 201, 155, 2, 1, 222, 184, 8, 201, 155, 2, 1, + 165, 8, 201, 155, 2, 1, 218, 236, 8, 201, 155, 2, 1, 215, 151, 8, 201, + 155, 2, 1, 211, 93, 8, 201, 155, 2, 1, 206, 158, 8, 201, 155, 2, 1, 200, + 228, 233, 221, 57, 242, 48, 57, 238, 167, 57, 232, 97, 232, 102, 57, 219, + 155, 57, 216, 127, 57, 215, 68, 57, 210, 111, 57, 206, 186, 57, 194, 19, + 57, 214, 177, 203, 254, 57, 236, 122, 57, 233, 222, 57, 221, 173, 57, + 198, 32, 57, 235, 89, 57, 231, 131, 210, 147, 57, 210, 108, 57, 230, 181, + 57, 249, 254, 57, 228, 187, 57, 246, 153, 57, 219, 145, 198, 229, 57, + 202, 140, 57, 200, 28, 57, 223, 175, 206, 186, 57, 198, 11, 219, 155, 57, + 213, 118, 122, 57, 217, 158, 57, 206, 209, 57, 220, 69, 57, 248, 0, 57, + 38, 46, 230, 22, 58, 38, 51, 230, 22, 58, 38, 184, 84, 219, 176, 211, + 110, 38, 203, 195, 84, 219, 176, 211, 110, 38, 250, 182, 61, 58, 38, 242, + 86, 61, 58, 38, 46, 61, 58, 38, 51, 61, 58, 38, 207, 82, 211, 110, 38, + 242, 86, 207, 82, 211, 110, 38, 250, 182, 207, 82, 211, 110, 38, 112, + 236, 112, 58, 38, 232, 119, 236, 112, 58, 38, 234, 84, 242, 130, 38, 234, + 84, 202, 106, 38, 234, 84, 237, 4, 38, 234, 84, 242, 131, 248, 247, 38, + 46, 51, 61, 58, 38, 234, 84, 205, 231, 38, 234, 84, 221, 253, 38, 234, + 84, 197, 32, 209, 188, 198, 185, 38, 207, 169, 202, 190, 211, 110, 38, + 55, 84, 201, 208, 211, 110, 38, 250, 192, 109, 38, 198, 170, 197, 66, 38, + 194, 64, 247, 143, 58, 38, 114, 61, 211, 110, 38, 184, 55, 202, 190, 211, + 110, 38, 94, 230, 22, 4, 173, 235, 91, 38, 114, 230, 22, 4, 173, 235, 91, + 38, 46, 61, 63, 38, 51, 61, 63, 38, 250, 38, 58, 251, 138, 211, 251, 251, + 121, 115, 199, 225, 201, 165, 235, 102, 6, 247, 52, 237, 95, 246, 143, + 246, 138, 219, 176, 109, 246, 213, 211, 251, 247, 11, 197, 76, 233, 223, + 239, 3, 205, 227, 237, 95, 233, 79, 27, 2, 232, 44, 27, 6, 230, 124, 247, + 246, 6, 230, 124, 235, 102, 6, 230, 124, 209, 227, 239, 3, 209, 227, 239, + 4, 136, 103, 210, 51, 27, 6, 70, 247, 246, 6, 70, 27, 6, 165, 27, 2, 165, + 220, 202, 76, 248, 194, 109, 235, 102, 6, 215, 151, 212, 232, 57, 202, + 174, 207, 245, 238, 226, 27, 6, 211, 93, 235, 102, 6, 211, 93, 235, 102, + 6, 208, 247, 27, 6, 150, 247, 246, 6, 150, 235, 102, 6, 150, 209, 107, + 200, 140, 207, 181, 204, 156, 77, 200, 42, 57, 198, 219, 122, 57, 196, + 106, 235, 102, 6, 192, 155, 211, 129, 57, 211, 240, 57, 223, 121, 211, + 240, 57, 247, 246, 6, 192, 155, 163, 33, 2, 1, 223, 111, 222, 38, 57, + 250, 202, 57, 27, 6, 249, 226, 247, 246, 6, 247, 52, 233, 247, 109, 27, + 2, 71, 27, 6, 71, 27, 6, 233, 163, 163, 6, 233, 163, 27, 6, 218, 236, 27, + 2, 74, 157, 109, 248, 66, 109, 231, 32, 109, 237, 222, 109, 223, 165, + 202, 172, 207, 16, 6, 208, 247, 233, 82, 57, 235, 102, 2, 210, 51, 235, + 102, 2, 231, 204, 235, 102, 6, 231, 204, 235, 102, 6, 210, 51, 235, 102, + 215, 150, 201, 126, 163, 49, 6, 232, 44, 163, 49, 6, 165, 207, 168, 49, + 6, 165, 163, 49, 6, 193, 148, 235, 102, 43, 6, 238, 95, 235, 102, 43, 2, + 238, 95, 235, 102, 43, 2, 71, 235, 102, 43, 2, 70, 235, 102, 43, 2, 223, + 65, 209, 73, 219, 175, 163, 250, 229, 210, 134, 57, 251, 38, 163, 2, 233, + 163, 16, 39, 206, 49, 202, 172, 194, 220, 232, 109, 90, 204, 142, 194, + 220, 232, 109, 90, 214, 9, 194, 220, 232, 109, 90, 200, 21, 194, 220, + 232, 109, 90, 199, 191, 194, 220, 232, 109, 103, 199, 188, 194, 220, 232, + 109, 90, 233, 6, 194, 220, 232, 109, 103, 233, 5, 194, 220, 232, 109, + 112, 233, 5, 194, 220, 232, 109, 232, 119, 233, 5, 194, 220, 232, 109, + 90, 203, 29, 194, 220, 232, 109, 232, 214, 203, 27, 194, 220, 232, 109, + 90, 234, 143, 194, 220, 232, 109, 112, 234, 141, 194, 220, 232, 109, 232, + 214, 234, 141, 194, 220, 232, 109, 204, 146, 234, 141, 232, 109, 212, + 233, 101, 207, 30, 212, 234, 101, 207, 30, 212, 234, 104, 207, 30, 212, + 234, 133, 207, 30, 212, 234, 134, 207, 30, 212, 234, 151, 207, 30, 212, + 234, 170, 207, 30, 212, 234, 179, 207, 30, 212, 234, 174, 207, 30, 212, + 234, 182, 207, 30, 212, 234, 200, 30, 207, 30, 212, 234, 234, 111, 207, + 30, 212, 234, 197, 244, 207, 30, 212, 234, 233, 3, 207, 30, 212, 234, 90, + 228, 162, 207, 30, 212, 234, 232, 214, 228, 162, 207, 30, 212, 234, 90, + 180, 2, 207, 30, 212, 234, 101, 2, 207, 30, 212, 234, 104, 2, 207, 30, + 212, 234, 133, 2, 207, 30, 212, 234, 134, 2, 207, 30, 212, 234, 151, 2, + 207, 30, 212, 234, 170, 2, 207, 30, 212, 234, 179, 2, 207, 30, 212, 234, + 174, 2, 207, 30, 212, 234, 182, 2, 207, 30, 212, 234, 200, 30, 2, 207, + 30, 212, 234, 234, 111, 2, 207, 30, 212, 234, 197, 244, 2, 207, 30, 212, + 234, 233, 3, 2, 207, 30, 212, 234, 90, 228, 162, 2, 207, 30, 212, 234, + 232, 214, 228, 162, 2, 207, 30, 212, 234, 90, 180, 207, 30, 212, 234, 90, + 199, 165, 247, 53, 238, 95, 207, 30, 212, 234, 232, 214, 180, 207, 30, + 212, 234, 200, 31, 180, 207, 30, 212, 234, 207, 168, 90, 228, 162, 8, 2, + 1, 207, 168, 247, 52, 207, 30, 212, 234, 203, 41, 220, 64, 20, 207, 30, + 212, 234, 233, 4, 234, 192, 20, 207, 30, 212, 234, 233, 4, 180, 207, 30, + 212, 234, 90, 228, 163, 180, 194, 220, 232, 109, 192, 77, 199, 188, 163, + 17, 104, 163, 17, 133, 114, 54, 197, 30, 54, 94, 54, 235, 92, 54, 46, 51, + 54, 130, 142, 54, 178, 194, 91, 54, 178, 234, 186, 54, 202, 171, 234, + 186, 54, 202, 171, 194, 91, 54, 114, 61, 4, 111, 94, 61, 4, 111, 114, + 194, 125, 54, 94, 194, 125, 54, 114, 103, 229, 243, 54, 197, 30, 103, + 229, 243, 54, 94, 103, 229, 243, 54, 235, 92, 103, 229, 243, 54, 114, 61, + 4, 200, 147, 94, 61, 4, 200, 147, 114, 61, 232, 89, 161, 197, 30, 61, + 232, 89, 161, 94, 61, 232, 89, 161, 235, 92, 61, 232, 89, 161, 130, 142, + 61, 4, 248, 180, 114, 61, 4, 128, 94, 61, 4, 128, 114, 61, 4, 219, 69, + 94, 61, 4, 219, 69, 46, 51, 194, 125, 54, 46, 51, 61, 4, 111, 235, 92, + 192, 21, 54, 197, 30, 61, 4, 199, 74, 220, 18, 197, 30, 61, 4, 199, 74, + 207, 90, 235, 92, 61, 4, 199, 74, 220, 18, 235, 92, 61, 4, 199, 74, 207, + 90, 94, 61, 4, 238, 224, 235, 91, 235, 92, 61, 4, 238, 224, 220, 18, 250, + 182, 198, 249, 204, 183, 54, 242, 86, 198, 249, 204, 183, 54, 178, 194, + 91, 61, 115, 184, 161, 114, 61, 115, 248, 194, 136, 94, 61, 115, 161, + 250, 182, 211, 184, 242, 131, 54, 242, 86, 211, 184, 242, 131, 54, 114, + 230, 22, 4, 173, 197, 29, 114, 230, 22, 4, 173, 235, 91, 197, 30, 230, + 22, 4, 173, 207, 90, 197, 30, 230, 22, 4, 173, 220, 18, 94, 230, 22, 4, + 173, 197, 29, 94, 230, 22, 4, 173, 235, 91, 235, 92, 230, 22, 4, 173, + 207, 90, 235, 92, 230, 22, 4, 173, 220, 18, 94, 61, 136, 114, 54, 197, + 30, 61, 114, 80, 235, 92, 54, 114, 61, 136, 94, 54, 114, 211, 53, 250, + 73, 197, 30, 211, 53, 250, 73, 94, 211, 53, 250, 73, 235, 92, 211, 53, + 250, 73, 114, 230, 22, 136, 94, 230, 21, 94, 230, 22, 136, 114, 230, 21, + 114, 55, 61, 4, 111, 46, 51, 55, 61, 4, 111, 94, 55, 61, 4, 111, 114, 55, + 54, 197, 30, 55, 54, 94, 55, 54, 235, 92, 55, 54, 46, 51, 55, 54, 130, + 142, 55, 54, 178, 194, 91, 55, 54, 178, 234, 186, 55, 54, 202, 171, 234, + 186, 55, 54, 202, 171, 194, 91, 55, 54, 114, 198, 170, 54, 94, 198, 170, + 54, 114, 202, 99, 54, 94, 202, 99, 54, 197, 30, 61, 4, 55, 111, 235, 92, + 61, 4, 55, 111, 114, 237, 184, 54, 197, 30, 237, 184, 54, 94, 237, 184, + 54, 235, 92, 237, 184, 54, 114, 61, 115, 161, 94, 61, 115, 161, 114, 62, + 54, 197, 30, 62, 54, 94, 62, 54, 235, 92, 62, 54, 197, 30, 62, 61, 232, + 89, 161, 197, 30, 62, 61, 211, 212, 210, 171, 197, 30, 62, 61, 211, 212, + 210, 172, 4, 229, 5, 161, 197, 30, 62, 61, 211, 212, 210, 172, 4, 84, + 161, 197, 30, 62, 55, 54, 197, 30, 62, 55, 61, 211, 212, 210, 171, 94, + 62, 61, 232, 89, 194, 151, 178, 194, 91, 61, 115, 238, 223, 202, 171, + 234, 186, 61, 115, 238, 223, 130, 142, 62, 54, 51, 61, 4, 2, 242, 130, + 235, 92, 61, 114, 80, 197, 30, 54, 112, 94, 250, 73, 114, 61, 4, 84, 111, + 94, 61, 4, 84, 111, 46, 51, 61, 4, 84, 111, 114, 61, 4, 55, 84, 111, 94, + 61, 4, 55, 84, 111, 46, 51, 61, 4, 55, 84, 111, 114, 211, 181, 54, 94, + 211, 181, 54, 46, 51, 211, 181, 54, 39, 251, 8, 242, 32, 210, 222, 236, + 244, 199, 215, 233, 199, 199, 215, 236, 136, 213, 111, 233, 200, 234, 90, + 204, 151, 223, 179, 215, 79, 234, 116, 211, 251, 213, 111, 250, 225, 234, + 116, 211, 251, 2, 234, 116, 211, 251, 238, 253, 250, 62, 217, 9, 236, + 136, 213, 111, 238, 255, 250, 62, 217, 9, 2, 238, 253, 250, 62, 217, 9, + 234, 80, 80, 209, 75, 215, 150, 209, 85, 215, 150, 238, 230, 215, 150, + 201, 126, 216, 113, 57, 216, 111, 57, 78, 209, 206, 236, 172, 203, 4, + 204, 152, 216, 112, 250, 38, 211, 173, 207, 82, 211, 173, 247, 107, 211, + 173, 50, 207, 22, 238, 158, 207, 22, 232, 112, 207, 22, 209, 71, 155, + 223, 167, 51, 250, 207, 250, 207, 217, 42, 250, 207, 202, 139, 250, 207, + 236, 175, 236, 136, 213, 111, 236, 179, 210, 236, 155, 213, 111, 210, + 236, 155, 219, 93, 250, 217, 219, 93, 211, 163, 223, 127, 197, 56, 223, + 141, 55, 223, 141, 198, 170, 223, 141, 238, 247, 223, 141, 201, 96, 223, + 141, 195, 239, 223, 141, 242, 86, 223, 141, 242, 86, 238, 247, 223, 141, + 250, 182, 238, 247, 223, 141, 199, 214, 248, 110, 208, 18, 209, 72, 78, + 216, 112, 233, 207, 231, 137, 209, 72, 229, 20, 199, 91, 211, 173, 207, + 168, 199, 90, 223, 121, 220, 49, 206, 158, 203, 76, 194, 124, 193, 254, + 209, 85, 213, 111, 199, 90, 216, 113, 199, 90, 250, 30, 187, 155, 213, + 111, 250, 30, 187, 155, 250, 138, 187, 155, 250, 138, 247, 77, 213, 111, + 251, 131, 187, 155, 214, 198, 250, 138, 213, 120, 251, 131, 187, 155, + 251, 1, 187, 155, 213, 111, 251, 1, 187, 155, 251, 1, 187, 211, 164, 187, + 155, 198, 170, 199, 90, 251, 9, 187, 155, 234, 23, 155, 231, 136, 234, + 23, 155, 236, 245, 248, 60, 250, 140, 199, 225, 219, 183, 231, 136, 187, + 155, 250, 138, 187, 115, 211, 164, 199, 225, 223, 206, 211, 251, 223, + 206, 80, 211, 164, 250, 138, 187, 155, 242, 48, 234, 29, 234, 30, 242, + 47, 207, 82, 223, 191, 187, 155, 207, 82, 187, 155, 238, 216, 155, 233, + 246, 234, 28, 155, 202, 20, 234, 29, 237, 77, 187, 155, 187, 115, 247, + 64, 237, 96, 217, 42, 247, 63, 208, 157, 187, 155, 213, 111, 187, 155, + 228, 41, 155, 213, 111, 228, 41, 155, 201, 215, 234, 23, 155, 219, 240, + 211, 164, 187, 155, 230, 204, 211, 164, 187, 155, 219, 240, 136, 187, + 155, 230, 204, 136, 187, 155, 219, 240, 247, 77, 213, 111, 187, 155, 230, + 204, 247, 77, 213, 111, 187, 155, 215, 231, 219, 239, 215, 231, 230, 203, + 248, 60, 213, 111, 234, 23, 155, 213, 111, 219, 239, 213, 111, 230, 203, + 214, 198, 219, 240, 213, 120, 187, 155, 214, 198, 230, 204, 213, 120, + 187, 155, 219, 240, 211, 164, 234, 23, 155, 230, 204, 211, 164, 234, 23, + 155, 214, 198, 219, 240, 213, 120, 234, 23, 155, 214, 198, 230, 204, 213, + 120, 234, 23, 155, 219, 240, 211, 164, 230, 203, 230, 204, 211, 164, 219, + 239, 214, 198, 219, 240, 213, 120, 230, 203, 214, 198, 230, 204, 213, + 120, 219, 239, 209, 115, 201, 145, 209, 116, 211, 164, 187, 155, 201, + 146, 211, 164, 187, 155, 209, 116, 211, 164, 234, 23, 155, 201, 146, 211, + 164, 234, 23, 155, 236, 136, 213, 111, 209, 118, 236, 136, 213, 111, 201, + 147, 201, 154, 211, 251, 201, 106, 211, 251, 213, 111, 41, 201, 154, 211, + 251, 213, 111, 41, 201, 106, 211, 251, 201, 154, 80, 211, 164, 187, 155, + 201, 106, 80, 211, 164, 187, 155, 214, 198, 41, 201, 154, 80, 213, 120, + 187, 155, 214, 198, 41, 201, 106, 80, 213, 120, 187, 155, 201, 154, 80, + 4, 213, 111, 187, 155, 201, 106, 80, 4, 213, 111, 187, 155, 215, 211, + 215, 212, 215, 213, 215, 212, 197, 56, 50, 223, 206, 211, 251, 50, 211, + 154, 211, 251, 50, 223, 206, 80, 211, 164, 187, 155, 50, 211, 154, 80, + 211, 164, 187, 155, 50, 246, 226, 50, 238, 148, 47, 209, 206, 47, 216, + 112, 47, 199, 82, 47, 236, 172, 203, 4, 47, 78, 211, 173, 47, 207, 82, + 211, 173, 47, 250, 38, 211, 173, 47, 234, 29, 47, 237, 185, 108, 209, + 206, 108, 216, 112, 108, 199, 82, 108, 78, 211, 173, 51, 200, 159, 46, + 200, 159, 142, 200, 159, 130, 200, 159, 250, 41, 216, 80, 198, 147, 232, + 142, 198, 170, 84, 248, 194, 51, 198, 8, 55, 84, 248, 194, 55, 51, 198, + 8, 236, 136, 213, 111, 209, 65, 213, 111, 198, 147, 236, 136, 213, 111, + 232, 143, 214, 201, 55, 84, 248, 194, 55, 51, 198, 8, 209, 116, 197, 69, + 207, 215, 201, 146, 197, 69, 207, 215, 213, 117, 201, 168, 211, 251, 238, + 253, 250, 62, 213, 117, 201, 167, 213, 117, 201, 168, 80, 211, 164, 187, + 155, 238, 253, 250, 62, 213, 117, 201, 168, 211, 164, 187, 155, 211, 154, + 211, 251, 223, 206, 211, 251, 215, 218, 229, 199, 239, 8, 217, 98, 223, + 138, 193, 181, 215, 59, 213, 119, 51, 250, 208, 4, 250, 114, 51, 198, + 185, 215, 150, 219, 93, 250, 217, 215, 150, 219, 93, 211, 163, 215, 150, + 223, 127, 215, 150, 197, 56, 237, 5, 211, 173, 78, 211, 173, 202, 20, + 211, 173, 236, 172, 199, 82, 247, 174, 46, 213, 117, 233, 81, 204, 179, + 209, 85, 51, 213, 117, 233, 81, 204, 179, 209, 85, 46, 204, 179, 209, 85, + 51, 204, 179, 209, 85, 207, 168, 199, 91, 234, 29, 238, 138, 219, 93, + 211, 163, 238, 138, 219, 93, 250, 217, 55, 201, 153, 55, 201, 105, 55, + 223, 127, 55, 197, 56, 209, 239, 187, 26, 210, 236, 155, 219, 240, 4, + 236, 114, 230, 204, 4, 236, 114, 196, 53, 215, 231, 219, 239, 196, 53, + 215, 231, 230, 203, 219, 240, 187, 115, 211, 164, 230, 203, 230, 204, + 187, 115, 211, 164, 219, 239, 187, 115, 211, 164, 219, 239, 187, 115, + 211, 164, 230, 203, 187, 115, 211, 164, 209, 115, 187, 115, 211, 164, + 201, 145, 236, 136, 213, 111, 209, 119, 211, 164, 234, 31, 236, 136, 213, + 111, 201, 148, 211, 164, 234, 31, 213, 111, 50, 223, 206, 80, 211, 164, + 187, 155, 213, 111, 50, 211, 154, 80, 211, 164, 187, 155, 50, 223, 206, + 80, 211, 164, 213, 111, 187, 155, 50, 211, 154, 80, 211, 164, 213, 111, + 187, 155, 219, 240, 247, 77, 213, 111, 234, 23, 155, 230, 204, 247, 77, + 213, 111, 234, 23, 155, 209, 116, 247, 77, 213, 111, 234, 23, 155, 201, + 146, 247, 77, 213, 111, 234, 23, 155, 213, 111, 213, 117, 201, 168, 211, + 251, 236, 136, 213, 111, 238, 255, 250, 62, 213, 117, 201, 167, 213, 111, + 213, 117, 201, 168, 80, 211, 164, 187, 155, 236, 136, 213, 111, 238, 255, + 250, 62, 213, 117, 201, 168, 211, 164, 234, 31, 84, 234, 105, 216, 158, + 229, 5, 234, 105, 130, 51, 237, 11, 234, 105, 142, 51, 237, 11, 234, 105, + 234, 116, 80, 4, 184, 229, 5, 111, 234, 116, 80, 4, 84, 248, 194, 250, + 27, 234, 80, 80, 229, 5, 111, 2, 234, 116, 80, 4, 84, 248, 194, 250, 27, + 234, 80, 80, 229, 5, 111, 234, 116, 80, 4, 78, 58, 234, 116, 80, 4, 211, + 117, 2, 234, 116, 80, 4, 211, 117, 234, 116, 80, 4, 197, 67, 234, 116, + 80, 4, 103, 229, 5, 201, 195, 238, 253, 4, 184, 229, 5, 111, 238, 253, 4, + 84, 248, 194, 250, 27, 234, 80, 80, 229, 5, 111, 2, 238, 253, 4, 84, 248, + 194, 250, 27, 234, 80, 80, 229, 5, 111, 238, 253, 4, 211, 117, 2, 238, + 253, 4, 211, 117, 192, 156, 213, 109, 248, 237, 217, 8, 237, 6, 57, 234, + 119, 54, 228, 193, 130, 250, 77, 142, 250, 77, 209, 79, 210, 114, 194, + 121, 219, 175, 46, 246, 146, 51, 246, 146, 46, 232, 182, 51, 232, 182, + 247, 188, 51, 238, 185, 247, 188, 46, 238, 185, 198, 249, 51, 238, 185, + 198, 249, 46, 238, 185, 207, 168, 213, 111, 57, 50, 219, 43, 250, 114, + 205, 198, 205, 207, 200, 42, 207, 246, 209, 160, 223, 172, 196, 26, 202, + 106, 209, 232, 80, 223, 137, 57, 163, 213, 111, 57, 194, 131, 228, 195, + 198, 249, 46, 238, 223, 198, 249, 51, 238, 223, 247, 188, 46, 238, 223, + 247, 188, 51, 238, 223, 198, 249, 138, 223, 141, 247, 188, 138, 223, 141, + 232, 84, 202, 231, 130, 250, 78, 248, 61, 103, 229, 5, 248, 182, 211, + 166, 222, 1, 234, 19, 115, 199, 225, 207, 101, 193, 224, 223, 191, 41, + 207, 243, 247, 173, 221, 255, 220, 23, 250, 208, 186, 207, 96, 250, 208, + 186, 234, 19, 115, 199, 225, 220, 28, 248, 72, 207, 81, 238, 105, 251, 9, + 250, 86, 201, 3, 198, 234, 206, 191, 236, 224, 211, 155, 239, 12, 200, + 114, 202, 245, 238, 212, 238, 211, 250, 157, 232, 67, 16, 228, 90, 250, + 157, 232, 67, 16, 202, 97, 208, 174, 250, 157, 232, 67, 16, 208, 175, + 234, 31, 250, 157, 232, 67, 16, 208, 175, 236, 179, 250, 157, 232, 67, + 16, 208, 175, 237, 4, 250, 157, 232, 67, 16, 208, 175, 222, 220, 250, + 157, 232, 67, 16, 208, 175, 242, 130, 250, 157, 232, 67, 16, 242, 131, + 201, 246, 250, 157, 232, 67, 16, 242, 131, 222, 220, 250, 157, 232, 67, + 16, 203, 5, 161, 250, 157, 232, 67, 16, 248, 248, 161, 250, 157, 232, 67, + 16, 208, 175, 203, 4, 250, 157, 232, 67, 16, 208, 175, 248, 247, 250, + 157, 232, 67, 16, 208, 175, 219, 239, 250, 157, 232, 67, 16, 208, 175, + 230, 203, 250, 157, 232, 67, 16, 114, 196, 145, 250, 157, 232, 67, 16, + 94, 196, 145, 250, 157, 232, 67, 16, 208, 175, 114, 54, 250, 157, 232, + 67, 16, 208, 175, 94, 54, 250, 157, 232, 67, 16, 242, 131, 248, 247, 250, + 157, 232, 67, 16, 142, 200, 160, 197, 67, 250, 157, 232, 67, 16, 237, 77, + 201, 246, 250, 157, 232, 67, 16, 208, 175, 142, 246, 211, 250, 157, 232, + 67, 16, 208, 175, 237, 76, 250, 157, 232, 67, 16, 142, 200, 160, 222, + 220, 250, 157, 232, 67, 16, 197, 30, 196, 145, 250, 157, 232, 67, 16, + 208, 175, 197, 30, 54, 250, 157, 232, 67, 16, 130, 200, 160, 211, 117, + 250, 157, 232, 67, 16, 237, 89, 201, 246, 250, 157, 232, 67, 16, 208, + 175, 130, 246, 211, 250, 157, 232, 67, 16, 208, 175, 237, 88, 250, 157, + 232, 67, 16, 130, 200, 160, 222, 220, 250, 157, 232, 67, 16, 235, 92, + 196, 145, 250, 157, 232, 67, 16, 208, 175, 235, 92, 54, 250, 157, 232, + 67, 16, 208, 141, 197, 67, 250, 157, 232, 67, 16, 237, 77, 197, 67, 250, + 157, 232, 67, 16, 237, 5, 197, 67, 250, 157, 232, 67, 16, 222, 221, 197, + 67, 250, 157, 232, 67, 16, 242, 131, 197, 67, 250, 157, 232, 67, 16, 130, + 203, 208, 222, 220, 250, 157, 232, 67, 16, 208, 141, 208, 174, 250, 157, + 232, 67, 16, 242, 131, 202, 19, 250, 157, 232, 67, 16, 208, 175, 242, 47, + 250, 157, 232, 67, 16, 130, 200, 160, 237, 14, 250, 157, 232, 67, 16, + 237, 89, 237, 14, 250, 157, 232, 67, 16, 202, 20, 237, 14, 250, 157, 232, + 67, 16, 222, 221, 237, 14, 250, 157, 232, 67, 16, 242, 131, 237, 14, 250, + 157, 232, 67, 16, 142, 203, 208, 201, 246, 250, 157, 232, 67, 16, 46, + 203, 208, 201, 246, 250, 157, 232, 67, 16, 199, 91, 237, 14, 250, 157, + 232, 67, 16, 230, 204, 237, 14, 250, 157, 232, 67, 16, 242, 39, 161, 250, + 157, 232, 67, 16, 237, 89, 199, 90, 250, 157, 232, 67, 16, 192, 20, 250, + 157, 232, 67, 16, 201, 247, 199, 90, 250, 157, 232, 67, 16, 204, 181, + 197, 67, 250, 157, 232, 67, 16, 208, 175, 213, 111, 234, 31, 250, 157, + 232, 67, 16, 208, 175, 208, 158, 250, 157, 232, 67, 16, 142, 246, 212, + 199, 90, 250, 157, 232, 67, 16, 130, 246, 212, 199, 90, 250, 157, 232, + 67, 16, 223, 111, 250, 157, 232, 67, 16, 207, 153, 250, 157, 232, 67, 16, + 211, 216, 250, 157, 232, 67, 16, 250, 253, 197, 67, 250, 157, 232, 67, + 16, 234, 33, 197, 67, 250, 157, 232, 67, 16, 223, 112, 197, 67, 250, 157, + 232, 67, 16, 211, 217, 197, 67, 250, 157, 232, 67, 16, 250, 252, 213, + 111, 242, 244, 77, 51, 250, 208, 4, 235, 92, 192, 21, 54, 203, 176, 211, + 184, 247, 173, 248, 87, 109, 84, 219, 176, 4, 85, 236, 114, 223, 147, + 109, 238, 248, 197, 65, 109, 236, 197, 197, 65, 109, 234, 92, 109, 239, + 27, 109, 62, 50, 4, 246, 138, 84, 219, 175, 234, 63, 109, 250, 244, 222, + 2, 109, 229, 212, 109, 47, 229, 5, 248, 194, 4, 213, 108, 47, 198, 186, + 235, 96, 247, 136, 242, 131, 4, 213, 114, 54, 197, 63, 109, 216, 40, 109, + 228, 107, 109, 211, 182, 230, 123, 109, 211, 182, 220, 200, 109, 210, + 210, 109, 210, 209, 109, 236, 206, 238, 136, 16, 232, 136, 104, 202, 195, + 109, 250, 157, 232, 67, 16, 208, 174, 237, 108, 204, 166, 222, 2, 109, + 209, 101, 211, 61, 214, 170, 211, 61, 209, 96, 205, 232, 109, 242, 102, + 205, 232, 109, 46, 210, 231, 113, 128, 46, 210, 231, 233, 191, 46, 210, + 231, 106, 128, 51, 210, 231, 113, 128, 51, 210, 231, 233, 191, 51, 210, + 231, 106, 128, 46, 50, 247, 165, 113, 238, 223, 46, 50, 247, 165, 233, + 191, 46, 50, 247, 165, 106, 238, 223, 51, 50, 247, 165, 113, 238, 223, + 51, 50, 247, 165, 233, 191, 51, 50, 247, 165, 106, 238, 223, 46, 238, + 138, 247, 165, 113, 128, 46, 238, 138, 247, 165, 85, 210, 42, 46, 238, + 138, 247, 165, 106, 128, 238, 138, 247, 165, 233, 191, 51, 238, 138, 247, + 165, 113, 128, 51, 238, 138, 247, 165, 85, 210, 42, 51, 238, 138, 247, + 165, 106, 128, 223, 142, 233, 191, 229, 5, 219, 176, 233, 191, 113, 46, + 211, 164, 106, 51, 238, 138, 247, 165, 205, 208, 113, 51, 211, 164, 106, + 46, 238, 138, 247, 165, 205, 208, 201, 127, 198, 248, 201, 127, 247, 187, + 198, 249, 50, 186, 247, 188, 50, 186, 247, 188, 50, 247, 165, 136, 198, + 249, 50, 186, 48, 16, 247, 187, 46, 84, 105, 219, 175, 51, 84, 105, 219, + 175, 229, 5, 205, 251, 219, 174, 229, 5, 205, 251, 219, 173, 229, 5, 205, + 251, 219, 172, 229, 5, 205, 251, 219, 171, 237, 68, 16, 152, 84, 26, 198, + 249, 207, 101, 237, 68, 16, 152, 84, 26, 247, 188, 207, 101, 237, 68, 16, + 152, 84, 4, 242, 130, 237, 68, 16, 152, 142, 26, 229, 5, 4, 242, 130, + 237, 68, 16, 152, 130, 26, 229, 5, 4, 242, 130, 237, 68, 16, 152, 84, 4, + 198, 185, 237, 68, 16, 152, 142, 26, 229, 5, 4, 198, 185, 237, 68, 16, + 152, 130, 26, 229, 5, 4, 198, 185, 237, 68, 16, 152, 84, 26, 194, 124, + 237, 68, 16, 152, 142, 26, 229, 5, 4, 194, 124, 237, 68, 16, 152, 130, + 26, 229, 5, 4, 194, 124, 237, 68, 16, 152, 142, 26, 229, 4, 237, 68, 16, + 152, 130, 26, 229, 4, 237, 68, 16, 152, 84, 26, 198, 249, 220, 28, 237, + 68, 16, 152, 84, 26, 247, 188, 220, 28, 50, 232, 149, 207, 173, 109, 234, + 133, 109, 84, 219, 176, 233, 191, 216, 234, 247, 150, 216, 234, 184, 136, + 203, 194, 216, 234, 203, 195, 136, 219, 84, 216, 234, 184, 136, 103, 203, + 180, 216, 234, 103, 203, 181, 136, 219, 84, 216, 234, 103, 203, 181, 222, + 229, 216, 234, 198, 166, 216, 234, 200, 0, 216, 234, 210, 142, 234, 190, + 230, 195, 232, 61, 198, 249, 210, 230, 247, 188, 210, 230, 198, 249, 238, + 138, 186, 247, 188, 238, 138, 186, 198, 249, 198, 237, 204, 2, 186, 247, + 188, 198, 237, 204, 2, 186, 62, 198, 202, 248, 72, 207, 82, 4, 242, 130, + 201, 228, 232, 193, 251, 147, 238, 135, 234, 118, 223, 127, 237, 108, + 233, 195, 109, 60, 207, 96, 55, 198, 185, 60, 220, 23, 55, 198, 185, 60, + 197, 40, 55, 198, 185, 60, 235, 95, 55, 198, 185, 60, 207, 96, 55, 198, + 186, 4, 84, 161, 60, 220, 23, 55, 198, 186, 4, 84, 161, 60, 207, 96, 198, + 186, 4, 55, 84, 161, 251, 30, 242, 87, 201, 235, 199, 83, 242, 87, 228, + 196, 4, 232, 173, 206, 38, 60, 217, 31, 220, 23, 198, 185, 60, 217, 31, + 207, 96, 198, 185, 60, 217, 31, 197, 40, 198, 185, 60, 217, 31, 235, 95, + 198, 185, 55, 84, 161, 60, 50, 39, 201, 238, 60, 242, 131, 39, 207, 247, + 209, 139, 109, 209, 139, 211, 210, 109, 209, 139, 211, 212, 109, 209, + 139, 203, 0, 109, 212, 14, 233, 182, 109, 16, 39, 212, 238, 16, 39, 202, + 15, 80, 229, 242, 16, 39, 202, 15, 80, 199, 244, 16, 39, 234, 80, 80, + 199, 244, 16, 39, 234, 80, 80, 198, 208, 16, 39, 234, 66, 16, 39, 251, + 134, 16, 39, 248, 86, 16, 39, 248, 246, 16, 39, 229, 5, 200, 161, 16, 39, + 219, 176, 233, 38, 16, 39, 84, 200, 161, 16, 39, 232, 136, 233, 38, 16, + 39, 246, 203, 207, 172, 16, 39, 203, 232, 211, 125, 16, 39, 203, 232, + 223, 190, 16, 39, 237, 180, 219, 166, 234, 1, 16, 39, 237, 47, 238, 243, + 101, 16, 39, 237, 47, 238, 243, 104, 16, 39, 237, 47, 238, 243, 133, 16, + 39, 237, 47, 238, 243, 134, 16, 39, 214, 199, 251, 134, 16, 39, 200, 254, + 223, 253, 16, 39, 234, 80, 80, 198, 209, 247, 238, 16, 39, 246, 241, 16, + 39, 234, 80, 80, 217, 30, 16, 39, 201, 151, 16, 39, 234, 1, 16, 39, 232, + 251, 204, 165, 16, 39, 230, 194, 204, 165, 16, 39, 207, 248, 204, 165, + 16, 39, 197, 55, 204, 165, 16, 39, 202, 160, 16, 39, 237, 86, 247, 242, + 109, 211, 184, 247, 173, 16, 39, 214, 173, 16, 39, 237, 87, 232, 136, + 104, 16, 39, 201, 152, 232, 136, 104, 212, 10, 128, 212, 10, 246, 112, + 212, 10, 232, 139, 212, 10, 223, 121, 232, 139, 212, 10, 248, 83, 247, + 119, 212, 10, 247, 181, 199, 113, 212, 10, 247, 161, 248, 199, 228, 40, + 212, 10, 250, 231, 80, 242, 243, 212, 10, 237, 185, 212, 10, 238, 124, + 251, 138, 212, 236, 212, 10, 55, 248, 247, 47, 17, 101, 47, 17, 104, 47, + 17, 133, 47, 17, 134, 47, 17, 151, 47, 17, 170, 47, 17, 179, 47, 17, 174, + 47, 17, 182, 47, 31, 200, 30, 47, 31, 234, 111, 47, 31, 197, 244, 47, 31, + 199, 186, 47, 31, 232, 113, 47, 31, 233, 7, 47, 31, 203, 35, 47, 31, 204, + 143, 47, 31, 234, 145, 47, 31, 214, 13, 47, 31, 197, 239, 125, 17, 101, + 125, 17, 104, 125, 17, 133, 125, 17, 134, 125, 17, 151, 125, 17, 170, + 125, 17, 179, 125, 17, 174, 125, 17, 182, 125, 31, 200, 30, 125, 31, 234, + 111, 125, 31, 197, 244, 125, 31, 199, 186, 125, 31, 232, 113, 125, 31, + 233, 7, 125, 31, 203, 35, 125, 31, 204, 143, 125, 31, 234, 145, 125, 31, + 214, 13, 125, 31, 197, 239, 17, 90, 232, 71, 201, 238, 17, 103, 232, 71, + 201, 238, 17, 112, 232, 71, 201, 238, 17, 232, 119, 232, 71, 201, 238, + 17, 232, 214, 232, 71, 201, 238, 17, 203, 41, 232, 71, 201, 238, 17, 204, + 146, 232, 71, 201, 238, 17, 234, 148, 232, 71, 201, 238, 17, 214, 16, + 232, 71, 201, 238, 31, 200, 31, 232, 71, 201, 238, 31, 234, 112, 232, 71, + 201, 238, 31, 197, 245, 232, 71, 201, 238, 31, 199, 187, 232, 71, 201, + 238, 31, 232, 114, 232, 71, 201, 238, 31, 233, 8, 232, 71, 201, 238, 31, + 203, 36, 232, 71, 201, 238, 31, 204, 144, 232, 71, 201, 238, 31, 234, + 146, 232, 71, 201, 238, 31, 214, 14, 232, 71, 201, 238, 31, 197, 240, + 232, 71, 201, 238, 125, 8, 2, 1, 64, 125, 8, 2, 1, 249, 226, 125, 8, 2, + 1, 247, 52, 125, 8, 2, 1, 238, 95, 125, 8, 2, 1, 71, 125, 8, 2, 1, 233, + 163, 125, 8, 2, 1, 232, 44, 125, 8, 2, 1, 230, 124, 125, 8, 2, 1, 70, + 125, 8, 2, 1, 223, 65, 125, 8, 2, 1, 222, 184, 125, 8, 2, 1, 165, 125, 8, + 2, 1, 218, 236, 125, 8, 2, 1, 215, 151, 125, 8, 2, 1, 74, 125, 8, 2, 1, + 211, 93, 125, 8, 2, 1, 208, 247, 125, 8, 2, 1, 150, 125, 8, 2, 1, 206, + 158, 125, 8, 2, 1, 200, 228, 125, 8, 2, 1, 68, 125, 8, 2, 1, 196, 236, + 125, 8, 2, 1, 194, 202, 125, 8, 2, 1, 193, 223, 125, 8, 2, 1, 193, 148, + 125, 8, 2, 1, 192, 155, 47, 8, 6, 1, 64, 47, 8, 6, 1, 249, 226, 47, 8, 6, + 1, 247, 52, 47, 8, 6, 1, 238, 95, 47, 8, 6, 1, 71, 47, 8, 6, 1, 233, 163, + 47, 8, 6, 1, 232, 44, 47, 8, 6, 1, 230, 124, 47, 8, 6, 1, 70, 47, 8, 6, + 1, 223, 65, 47, 8, 6, 1, 222, 184, 47, 8, 6, 1, 165, 47, 8, 6, 1, 218, + 236, 47, 8, 6, 1, 215, 151, 47, 8, 6, 1, 74, 47, 8, 6, 1, 211, 93, 47, 8, + 6, 1, 208, 247, 47, 8, 6, 1, 150, 47, 8, 6, 1, 206, 158, 47, 8, 6, 1, + 200, 228, 47, 8, 6, 1, 68, 47, 8, 6, 1, 196, 236, 47, 8, 6, 1, 194, 202, + 47, 8, 6, 1, 193, 223, 47, 8, 6, 1, 193, 148, 47, 8, 6, 1, 192, 155, 47, + 8, 2, 1, 64, 47, 8, 2, 1, 249, 226, 47, 8, 2, 1, 247, 52, 47, 8, 2, 1, + 238, 95, 47, 8, 2, 1, 71, 47, 8, 2, 1, 233, 163, 47, 8, 2, 1, 232, 44, + 47, 8, 2, 1, 230, 124, 47, 8, 2, 1, 70, 47, 8, 2, 1, 223, 65, 47, 8, 2, + 1, 222, 184, 47, 8, 2, 1, 165, 47, 8, 2, 1, 218, 236, 47, 8, 2, 1, 215, + 151, 47, 8, 2, 1, 74, 47, 8, 2, 1, 211, 93, 47, 8, 2, 1, 208, 247, 47, 8, + 2, 1, 150, 47, 8, 2, 1, 206, 158, 47, 8, 2, 1, 200, 228, 47, 8, 2, 1, 68, + 47, 8, 2, 1, 196, 236, 47, 8, 2, 1, 194, 202, 47, 8, 2, 1, 193, 223, 47, + 8, 2, 1, 193, 148, 47, 8, 2, 1, 192, 155, 47, 17, 192, 76, 214, 199, 47, + 31, 234, 111, 214, 199, 47, 31, 197, 244, 214, 199, 47, 31, 199, 186, + 214, 199, 47, 31, 232, 113, 214, 199, 47, 31, 233, 7, 214, 199, 47, 31, + 203, 35, 214, 199, 47, 31, 204, 143, 214, 199, 47, 31, 234, 145, 214, + 199, 47, 31, 214, 13, 214, 199, 47, 31, 197, 239, 55, 47, 17, 101, 55, + 47, 17, 104, 55, 47, 17, 133, 55, 47, 17, 134, 55, 47, 17, 151, 55, 47, + 17, 170, 55, 47, 17, 179, 55, 47, 17, 174, 55, 47, 17, 182, 55, 47, 31, + 200, 30, 214, 199, 47, 17, 192, 76, 105, 119, 152, 229, 4, 105, 119, 87, + 229, 4, 105, 119, 152, 196, 105, 105, 119, 87, 196, 105, 105, 119, 152, + 198, 170, 237, 186, 229, 4, 105, 119, 87, 198, 170, 237, 186, 229, 4, + 105, 119, 152, 198, 170, 237, 186, 196, 105, 105, 119, 87, 198, 170, 237, + 186, 196, 105, 105, 119, 152, 208, 170, 237, 186, 229, 4, 105, 119, 87, + 208, 170, 237, 186, 229, 4, 105, 119, 152, 208, 170, 237, 186, 196, 105, + 105, 119, 87, 208, 170, 237, 186, 196, 105, 105, 119, 152, 142, 26, 207, + 101, 105, 119, 142, 152, 26, 51, 229, 227, 105, 119, 142, 87, 26, 51, + 219, 195, 105, 119, 87, 142, 26, 207, 101, 105, 119, 152, 142, 26, 220, + 28, 105, 119, 142, 152, 26, 46, 229, 227, 105, 119, 142, 87, 26, 46, 219, + 195, 105, 119, 87, 142, 26, 220, 28, 105, 119, 152, 130, 26, 207, 101, + 105, 119, 130, 152, 26, 51, 229, 227, 105, 119, 130, 87, 26, 51, 219, + 195, 105, 119, 87, 130, 26, 207, 101, 105, 119, 152, 130, 26, 220, 28, + 105, 119, 130, 152, 26, 46, 229, 227, 105, 119, 130, 87, 26, 46, 219, + 195, 105, 119, 87, 130, 26, 220, 28, 105, 119, 152, 84, 26, 207, 101, + 105, 119, 84, 152, 26, 51, 229, 227, 105, 119, 130, 87, 26, 51, 142, 219, + 195, 105, 119, 142, 87, 26, 51, 130, 219, 195, 105, 119, 84, 87, 26, 51, + 219, 195, 105, 119, 142, 152, 26, 51, 130, 229, 227, 105, 119, 130, 152, + 26, 51, 142, 229, 227, 105, 119, 87, 84, 26, 207, 101, 105, 119, 152, 84, + 26, 220, 28, 105, 119, 84, 152, 26, 46, 229, 227, 105, 119, 130, 87, 26, + 46, 142, 219, 195, 105, 119, 142, 87, 26, 46, 130, 219, 195, 105, 119, + 84, 87, 26, 46, 219, 195, 105, 119, 142, 152, 26, 46, 130, 229, 227, 105, + 119, 130, 152, 26, 46, 142, 229, 227, 105, 119, 87, 84, 26, 220, 28, 105, + 119, 152, 142, 26, 229, 4, 105, 119, 46, 87, 26, 51, 142, 219, 195, 105, + 119, 51, 87, 26, 46, 142, 219, 195, 105, 119, 142, 152, 26, 229, 5, 229, + 227, 105, 119, 142, 87, 26, 229, 5, 219, 195, 105, 119, 51, 152, 26, 46, + 142, 229, 227, 105, 119, 46, 152, 26, 51, 142, 229, 227, 105, 119, 87, + 142, 26, 229, 4, 105, 119, 152, 130, 26, 229, 4, 105, 119, 46, 87, 26, + 51, 130, 219, 195, 105, 119, 51, 87, 26, 46, 130, 219, 195, 105, 119, + 130, 152, 26, 229, 5, 229, 227, 105, 119, 130, 87, 26, 229, 5, 219, 195, + 105, 119, 51, 152, 26, 46, 130, 229, 227, 105, 119, 46, 152, 26, 51, 130, + 229, 227, 105, 119, 87, 130, 26, 229, 4, 105, 119, 152, 84, 26, 229, 4, + 105, 119, 46, 87, 26, 51, 84, 219, 195, 105, 119, 51, 87, 26, 46, 84, + 219, 195, 105, 119, 84, 152, 26, 229, 5, 229, 227, 105, 119, 130, 87, 26, + 142, 229, 5, 219, 195, 105, 119, 142, 87, 26, 130, 229, 5, 219, 195, 105, + 119, 84, 87, 26, 229, 5, 219, 195, 105, 119, 46, 130, 87, 26, 51, 142, + 219, 195, 105, 119, 51, 130, 87, 26, 46, 142, 219, 195, 105, 119, 46, + 142, 87, 26, 51, 130, 219, 195, 105, 119, 51, 142, 87, 26, 46, 130, 219, + 195, 105, 119, 142, 152, 26, 130, 229, 5, 229, 227, 105, 119, 130, 152, + 26, 142, 229, 5, 229, 227, 105, 119, 51, 152, 26, 46, 84, 229, 227, 105, + 119, 46, 152, 26, 51, 84, 229, 227, 105, 119, 87, 84, 26, 229, 4, 105, + 119, 152, 55, 237, 186, 229, 4, 105, 119, 87, 55, 237, 186, 229, 4, 105, + 119, 152, 55, 237, 186, 196, 105, 105, 119, 87, 55, 237, 186, 196, 105, + 105, 119, 55, 229, 4, 105, 119, 55, 196, 105, 105, 119, 142, 203, 74, 26, + 51, 235, 106, 105, 119, 142, 55, 26, 51, 203, 73, 105, 119, 55, 142, 26, + 207, 101, 105, 119, 142, 203, 74, 26, 46, 235, 106, 105, 119, 142, 55, + 26, 46, 203, 73, 105, 119, 55, 142, 26, 220, 28, 105, 119, 130, 203, 74, + 26, 51, 235, 106, 105, 119, 130, 55, 26, 51, 203, 73, 105, 119, 55, 130, + 26, 207, 101, 105, 119, 130, 203, 74, 26, 46, 235, 106, 105, 119, 130, + 55, 26, 46, 203, 73, 105, 119, 55, 130, 26, 220, 28, 105, 119, 84, 203, + 74, 26, 51, 235, 106, 105, 119, 84, 55, 26, 51, 203, 73, 105, 119, 55, + 84, 26, 207, 101, 105, 119, 84, 203, 74, 26, 46, 235, 106, 105, 119, 84, + 55, 26, 46, 203, 73, 105, 119, 55, 84, 26, 220, 28, 105, 119, 142, 203, + 74, 26, 229, 5, 235, 106, 105, 119, 142, 55, 26, 229, 5, 203, 73, 105, + 119, 55, 142, 26, 229, 4, 105, 119, 130, 203, 74, 26, 229, 5, 235, 106, + 105, 119, 130, 55, 26, 229, 5, 203, 73, 105, 119, 55, 130, 26, 229, 4, + 105, 119, 84, 203, 74, 26, 229, 5, 235, 106, 105, 119, 84, 55, 26, 229, + 5, 203, 73, 105, 119, 55, 84, 26, 229, 4, 105, 119, 152, 250, 115, 142, + 26, 207, 101, 105, 119, 152, 250, 115, 142, 26, 220, 28, 105, 119, 152, + 250, 115, 130, 26, 220, 28, 105, 119, 152, 250, 115, 130, 26, 207, 101, + 105, 119, 152, 237, 11, 113, 51, 115, 106, 220, 28, 105, 119, 152, 237, + 11, 113, 46, 115, 106, 207, 101, 105, 119, 152, 237, 11, 238, 183, 105, + 119, 152, 220, 28, 105, 119, 152, 197, 41, 105, 119, 152, 207, 101, 105, + 119, 152, 235, 96, 105, 119, 87, 220, 28, 105, 119, 87, 197, 41, 105, + 119, 87, 207, 101, 105, 119, 87, 235, 96, 105, 119, 152, 46, 26, 87, 207, + 101, 105, 119, 152, 130, 26, 87, 235, 96, 105, 119, 87, 46, 26, 152, 207, + 101, 105, 119, 87, 130, 26, 152, 235, 96, 113, 138, 247, 238, 106, 90, + 234, 144, 247, 238, 106, 90, 208, 168, 247, 238, 106, 112, 234, 142, 247, + 238, 106, 138, 247, 238, 106, 232, 214, 234, 142, 247, 238, 106, 112, + 208, 166, 247, 238, 106, 204, 146, 234, 142, 247, 238, 232, 71, 247, 238, + 46, 204, 146, 234, 142, 247, 238, 46, 112, 208, 166, 247, 238, 46, 232, + 214, 234, 142, 247, 238, 46, 138, 247, 238, 46, 112, 234, 142, 247, 238, + 46, 90, 208, 168, 247, 238, 46, 90, 234, 144, 247, 238, 51, 138, 247, + 238, 152, 204, 52, 217, 31, 204, 52, 237, 191, 204, 52, 113, 90, 234, + 144, 247, 238, 51, 90, 234, 144, 247, 238, 208, 172, 106, 220, 28, 208, + 172, 106, 207, 101, 208, 172, 113, 220, 28, 208, 172, 113, 46, 26, 106, + 46, 26, 106, 207, 101, 208, 172, 113, 46, 26, 106, 207, 101, 208, 172, + 113, 46, 26, 113, 51, 26, 106, 220, 28, 208, 172, 113, 46, 26, 113, 51, + 26, 106, 207, 101, 208, 172, 113, 207, 101, 208, 172, 113, 51, 26, 106, + 220, 28, 208, 172, 113, 51, 26, 106, 46, 26, 106, 207, 101, 60, 202, 106, + 62, 202, 106, 62, 50, 4, 207, 7, 238, 222, 62, 50, 238, 254, 60, 2, 202, + 106, 50, 4, 229, 5, 232, 249, 50, 4, 84, 232, 249, 50, 4, 211, 146, 238, + 177, 232, 249, 50, 4, 113, 46, 115, 106, 51, 232, 249, 50, 4, 113, 51, + 115, 106, 46, 232, 249, 50, 4, 237, 11, 238, 177, 232, 249, 60, 2, 202, + 106, 62, 2, 202, 106, 60, 207, 242, 62, 207, 242, 60, 84, 207, 242, 62, + 84, 207, 242, 60, 210, 234, 62, 210, 234, 60, 197, 40, 198, 185, 62, 197, + 40, 198, 185, 60, 197, 40, 2, 198, 185, 62, 197, 40, 2, 198, 185, 60, + 207, 96, 198, 185, 62, 207, 96, 198, 185, 60, 207, 96, 2, 198, 185, 62, + 207, 96, 2, 198, 185, 60, 207, 96, 209, 189, 62, 207, 96, 209, 189, 60, + 235, 95, 198, 185, 62, 235, 95, 198, 185, 60, 235, 95, 2, 198, 185, 62, + 235, 95, 2, 198, 185, 60, 220, 23, 198, 185, 62, 220, 23, 198, 185, 60, + 220, 23, 2, 198, 185, 62, 220, 23, 2, 198, 185, 60, 220, 23, 209, 189, + 62, 220, 23, 209, 189, 60, 237, 4, 62, 237, 4, 62, 237, 5, 238, 254, 60, + 2, 237, 4, 232, 223, 219, 43, 62, 242, 130, 235, 111, 242, 130, 242, 131, + 4, 84, 232, 249, 247, 102, 60, 242, 130, 242, 131, 4, 46, 138, 247, 248, + 242, 131, 4, 51, 138, 247, 248, 242, 131, 4, 106, 138, 247, 248, 242, + 131, 4, 113, 138, 247, 248, 242, 131, 4, 113, 51, 208, 172, 247, 248, + 242, 131, 4, 251, 9, 247, 77, 113, 46, 208, 172, 247, 248, 46, 138, 60, + 242, 130, 51, 138, 60, 242, 130, 223, 123, 247, 106, 223, 123, 62, 242, + 130, 113, 138, 223, 123, 62, 242, 130, 106, 138, 223, 123, 62, 242, 130, + 113, 46, 208, 172, 242, 124, 250, 114, 113, 51, 208, 172, 242, 124, 250, + 114, 106, 51, 208, 172, 242, 124, 250, 114, 106, 46, 208, 172, 242, 124, + 250, 114, 113, 138, 242, 130, 106, 138, 242, 130, 60, 106, 51, 198, 185, + 60, 106, 46, 198, 185, 60, 113, 46, 198, 185, 60, 113, 51, 198, 185, 62, + 247, 106, 50, 4, 46, 138, 247, 248, 50, 4, 51, 138, 247, 248, 50, 4, 113, + 46, 237, 11, 138, 247, 248, 50, 4, 106, 51, 237, 11, 138, 247, 248, 62, + 50, 4, 84, 248, 7, 219, 175, 62, 197, 40, 198, 186, 4, 236, 114, 197, 40, + 198, 186, 4, 46, 138, 247, 248, 197, 40, 198, 186, 4, 51, 138, 247, 248, + 220, 73, 242, 130, 62, 50, 4, 113, 46, 208, 171, 62, 50, 4, 106, 46, 208, + 171, 62, 50, 4, 106, 51, 208, 171, 62, 50, 4, 113, 51, 208, 171, 62, 242, + 131, 4, 113, 46, 208, 171, 62, 242, 131, 4, 106, 46, 208, 171, 62, 242, + 131, 4, 106, 51, 208, 171, 62, 242, 131, 4, 113, 51, 208, 171, 113, 46, + 198, 185, 113, 51, 198, 185, 106, 46, 198, 185, 62, 217, 31, 202, 106, + 60, 217, 31, 202, 106, 62, 217, 31, 2, 202, 106, 60, 217, 31, 2, 202, + 106, 106, 51, 198, 185, 60, 201, 124, 4, 208, 12, 242, 75, 197, 81, 202, + 214, 242, 41, 60, 202, 19, 62, 202, 19, 219, 192, 199, 143, 201, 123, + 250, 57, 213, 134, 237, 58, 213, 134, 239, 7, 211, 169, 60, 200, 41, 62, + 200, 41, 248, 213, 247, 173, 248, 213, 105, 4, 242, 243, 248, 213, 105, + 4, 193, 223, 206, 51, 197, 82, 4, 208, 42, 235, 69, 228, 202, 248, 58, + 62, 203, 204, 210, 42, 60, 203, 204, 210, 42, 204, 39, 207, 168, 207, 16, + 232, 179, 229, 234, 247, 106, 60, 46, 209, 188, 223, 176, 60, 51, 209, + 188, 223, 176, 62, 46, 209, 188, 223, 176, 62, 130, 209, 188, 223, 176, + 62, 51, 209, 188, 223, 176, 62, 142, 209, 188, 223, 176, 203, 11, 26, + 238, 181, 246, 187, 57, 208, 54, 57, 248, 15, 57, 247, 10, 250, 196, 211, + 147, 238, 183, 242, 216, 207, 153, 238, 184, 80, 219, 64, 238, 184, 80, + 223, 30, 202, 20, 26, 238, 193, 233, 62, 109, 251, 117, 204, 42, 230, 70, + 26, 203, 116, 210, 180, 109, 193, 11, 193, 95, 198, 175, 39, 229, 229, + 198, 175, 39, 220, 102, 198, 175, 39, 232, 231, 198, 175, 39, 199, 144, + 198, 175, 39, 194, 52, 198, 175, 39, 194, 129, 198, 175, 39, 216, 9, 198, + 175, 39, 234, 189, 194, 80, 80, 237, 32, 62, 232, 83, 233, 91, 62, 202, + 230, 233, 91, 60, 202, 230, 233, 91, 62, 201, 124, 4, 208, 12, 232, 226, + 208, 168, 216, 29, 220, 66, 208, 168, 216, 29, 216, 255, 233, 30, 57, + 234, 189, 217, 166, 57, 222, 199, 206, 13, 197, 22, 214, 189, 209, 202, + 250, 100, 200, 98, 231, 145, 246, 239, 219, 246, 196, 9, 219, 206, 205, + 234, 206, 77, 246, 221, 250, 132, 209, 244, 62, 242, 225, 221, 176, 62, + 242, 225, 208, 160, 62, 242, 225, 207, 25, 62, 242, 225, 248, 5, 62, 242, + 225, 221, 122, 62, 242, 225, 210, 192, 60, 242, 225, 221, 176, 60, 242, + 225, 208, 160, 60, 242, 225, 207, 25, 60, 242, 225, 248, 5, 60, 242, 225, + 221, 122, 60, 242, 225, 210, 192, 60, 202, 158, 201, 136, 62, 229, 234, + 201, 136, 62, 237, 5, 201, 136, 60, 242, 72, 201, 136, 62, 202, 158, 201, + 136, 60, 229, 234, 201, 136, 60, 237, 5, 201, 136, 62, 242, 72, 201, 136, + 228, 202, 202, 111, 208, 168, 213, 105, 234, 144, 213, 105, 248, 119, + 234, 144, 213, 100, 248, 119, 203, 34, 213, 100, 215, 185, 232, 196, 57, + 215, 185, 215, 43, 57, 215, 185, 204, 26, 57, 194, 91, 200, 248, 238, + 183, 234, 186, 200, 248, 238, 183, 197, 51, 207, 238, 109, 207, 238, 16, + 39, 197, 205, 209, 222, 207, 238, 16, 39, 197, 203, 209, 222, 207, 238, + 16, 39, 197, 202, 209, 222, 207, 238, 16, 39, 197, 200, 209, 222, 207, + 238, 16, 39, 197, 198, 209, 222, 207, 238, 16, 39, 197, 196, 209, 222, + 207, 238, 16, 39, 197, 194, 209, 222, 207, 238, 16, 39, 231, 142, 217, + 99, 60, 197, 51, 207, 238, 109, 207, 239, 210, 252, 109, 210, 221, 210, + 252, 109, 210, 125, 210, 252, 57, 194, 78, 109, 236, 253, 233, 90, 236, + 253, 233, 89, 236, 253, 233, 88, 236, 253, 233, 87, 236, 253, 233, 86, + 236, 253, 233, 85, 62, 242, 131, 4, 78, 207, 101, 62, 242, 131, 4, 103, + 236, 111, 60, 242, 131, 4, 62, 78, 207, 101, 60, 242, 131, 4, 103, 62, + 236, 111, 216, 45, 39, 193, 95, 216, 45, 39, 193, 10, 236, 234, 39, 230, + 205, 193, 95, 236, 234, 39, 219, 238, 193, 10, 236, 234, 39, 219, 238, + 193, 95, 236, 234, 39, 230, 205, 193, 10, 62, 232, 206, 60, 232, 206, + 230, 70, 26, 210, 47, 250, 219, 238, 180, 201, 59, 202, 29, 80, 251, 91, + 205, 252, 251, 25, 232, 175, 231, 155, 202, 29, 80, 229, 201, 250, 16, + 109, 232, 191, 211, 121, 62, 202, 19, 112, 219, 170, 238, 240, 207, 101, + 112, 219, 170, 238, 240, 220, 28, 194, 140, 57, 139, 195, 240, 57, 235, + 101, 233, 30, 57, 235, 101, 217, 166, 57, 223, 133, 233, 30, 26, 217, + 166, 57, 217, 166, 26, 233, 30, 57, 217, 166, 4, 201, 208, 57, 217, 166, + 4, 201, 208, 26, 217, 166, 26, 233, 30, 57, 84, 217, 166, 4, 201, 208, + 57, 229, 5, 217, 166, 4, 201, 208, 57, 217, 31, 62, 242, 130, 217, 31, + 60, 242, 130, 217, 31, 2, 62, 242, 130, 217, 119, 109, 236, 170, 109, + 197, 48, 210, 220, 109, 242, 53, 232, 66, 197, 18, 214, 180, 246, 123, + 211, 43, 222, 205, 196, 50, 242, 195, 60, 216, 30, 219, 189, 204, 75, + 204, 177, 208, 150, 204, 154, 202, 202, 248, 217, 248, 179, 108, 222, 1, + 62, 235, 81, 217, 160, 62, 235, 81, 221, 176, 60, 235, 81, 217, 160, 60, + 235, 81, 221, 176, 202, 215, 194, 39, 202, 218, 201, 124, 248, 93, 242, + 75, 208, 41, 60, 202, 214, 199, 145, 242, 76, 26, 208, 41, 163, 62, 203, + 204, 210, 42, 163, 60, 203, 204, 210, 42, 62, 237, 5, 223, 191, 202, 106, + 238, 176, 220, 80, 236, 201, 246, 217, 211, 172, 210, 47, 246, 218, 202, + 249, 229, 211, 4, 62, 238, 183, 47, 238, 176, 220, 80, 246, 113, 213, + 143, 234, 57, 250, 249, 211, 203, 46, 194, 115, 198, 216, 60, 197, 217, + 46, 194, 115, 198, 216, 62, 197, 217, 46, 194, 115, 198, 216, 60, 46, + 220, 81, 216, 254, 62, 46, 220, 81, 216, 254, 235, 76, 202, 240, 57, 87, + 62, 235, 95, 198, 185, 46, 242, 84, 234, 57, 108, 206, 51, 233, 71, 237, + 11, 223, 191, 62, 242, 131, 223, 191, 60, 202, 106, 60, 198, 149, 207, + 179, 46, 234, 56, 207, 179, 46, 234, 55, 250, 31, 16, 39, 197, 22, 87, + 242, 131, 4, 201, 208, 26, 103, 236, 112, 58, 210, 143, 207, 98, 223, + 135, 210, 143, 220, 25, 223, 135, 210, 143, 223, 121, 210, 143, 60, 238, + 184, 211, 212, 203, 233, 203, 221, 203, 169, 242, 160, 246, 195, 229, + 138, 203, 42, 231, 156, 194, 39, 228, 175, 231, 156, 4, 230, 39, 217, + 142, 16, 39, 219, 194, 216, 9, 197, 82, 211, 212, 230, 195, 232, 120, + 232, 207, 223, 191, 229, 25, 233, 20, 206, 72, 50, 232, 119, 238, 222, + 203, 14, 228, 50, 203, 18, 210, 117, 4, 248, 217, 200, 22, 223, 50, 248, + 199, 109, 229, 239, 230, 207, 109, 232, 74, 209, 39, 238, 149, 211, 212, + 60, 202, 106, 62, 232, 207, 4, 229, 5, 85, 60, 201, 209, 60, 206, 82, + 205, 238, 113, 247, 243, 205, 238, 60, 205, 238, 106, 247, 243, 205, 238, + 62, 205, 238, 62, 87, 242, 244, 77, 200, 42, 219, 104, 57, 200, 115, 235, + 75, 251, 50, 234, 52, 208, 39, 232, 219, 208, 39, 230, 62, 196, 37, 230, + 62, 193, 247, 230, 62, 106, 51, 210, 153, 210, 153, 113, 51, 210, 153, + 62, 214, 49, 60, 214, 49, 242, 244, 77, 87, 242, 244, 77, 215, 214, 193, + 223, 87, 215, 214, 193, 223, 248, 213, 193, 223, 87, 248, 213, 193, 223, + 211, 121, 33, 238, 183, 87, 33, 238, 183, 211, 184, 246, 138, 238, 183, + 87, 211, 184, 246, 138, 238, 183, 8, 238, 183, 204, 50, 62, 8, 238, 183, + 211, 121, 8, 238, 183, 217, 163, 238, 183, 202, 20, 80, 237, 178, 232, + 119, 200, 61, 250, 37, 232, 119, 248, 214, 250, 37, 87, 232, 119, 248, + 214, 250, 37, 232, 119, 242, 70, 250, 37, 60, 232, 119, 209, 190, 202, + 19, 62, 232, 119, 209, 190, 202, 19, 202, 153, 201, 218, 211, 121, 62, + 202, 19, 47, 62, 202, 19, 211, 184, 246, 138, 60, 202, 19, 60, 246, 138, + 62, 202, 19, 211, 121, 60, 202, 19, 87, 211, 121, 60, 202, 19, 209, 254, + 202, 19, 204, 50, 62, 202, 19, 87, 250, 37, 211, 184, 246, 138, 250, 37, + 234, 148, 202, 122, 250, 37, 234, 148, 209, 190, 60, 202, 19, 234, 148, + 209, 190, 209, 254, 202, 19, 203, 41, 209, 190, 60, 202, 19, 234, 148, + 209, 190, 207, 240, 60, 202, 19, 87, 234, 148, 209, 190, 207, 240, 60, + 202, 19, 197, 245, 209, 190, 60, 202, 19, 203, 36, 209, 190, 250, 37, + 200, 61, 250, 37, 211, 184, 246, 138, 200, 61, 250, 37, 87, 200, 61, 250, + 37, 203, 41, 210, 105, 60, 26, 62, 232, 178, 60, 232, 178, 62, 232, 178, + 234, 148, 210, 105, 211, 121, 60, 232, 178, 47, 211, 184, 246, 138, 234, + 148, 209, 190, 202, 19, 87, 200, 61, 209, 254, 250, 37, 202, 216, 199, + 107, 198, 178, 202, 216, 87, 242, 221, 202, 216, 202, 155, 87, 202, 155, + 248, 214, 250, 37, 234, 148, 200, 61, 209, 74, 250, 37, 87, 234, 148, + 200, 61, 209, 74, 250, 37, 238, 184, 77, 204, 50, 62, 242, 130, 214, 199, + 108, 238, 184, 77, 106, 51, 235, 71, 62, 202, 106, 113, 51, 235, 71, 62, + 202, 106, 106, 51, 204, 50, 62, 202, 106, 113, 51, 204, 50, 62, 202, 106, + 60, 208, 159, 122, 211, 150, 62, 208, 159, 122, 211, 150, 62, 233, 204, + 122, 211, 150, 60, 237, 5, 216, 113, 62, 193, 223, 87, 233, 204, 122, + 109, 152, 84, 161, 217, 31, 84, 161, 87, 84, 161, 87, 203, 74, 163, 242, + 39, 208, 142, 122, 211, 150, 87, 203, 74, 242, 39, 208, 142, 122, 211, + 150, 87, 55, 163, 242, 39, 208, 142, 122, 211, 150, 87, 55, 242, 39, 208, + 142, 122, 211, 150, 87, 132, 203, 74, 242, 39, 208, 142, 122, 211, 150, + 87, 132, 55, 242, 39, 208, 142, 122, 211, 150, 238, 130, 202, 0, 210, + 244, 3, 211, 150, 87, 233, 204, 122, 211, 150, 87, 229, 234, 233, 204, + 122, 211, 150, 87, 60, 229, 233, 207, 16, 87, 60, 229, 234, 247, 106, + 232, 179, 229, 233, 207, 16, 232, 179, 229, 234, 247, 106, 217, 31, 46, + 210, 231, 211, 150, 217, 31, 51, 210, 231, 211, 150, 217, 31, 232, 192, + 46, 210, 231, 211, 150, 217, 31, 232, 192, 51, 210, 231, 211, 150, 217, + 31, 220, 23, 250, 208, 247, 165, 211, 150, 217, 31, 207, 96, 250, 208, + 247, 165, 211, 150, 87, 220, 23, 250, 208, 208, 142, 122, 211, 150, 87, + 207, 96, 250, 208, 208, 142, 122, 211, 150, 87, 220, 23, 250, 208, 247, + 165, 211, 150, 87, 207, 96, 250, 208, 247, 165, 211, 150, 152, 46, 198, + 237, 204, 2, 247, 165, 211, 150, 152, 51, 198, 237, 204, 2, 247, 165, + 211, 150, 217, 31, 46, 238, 138, 247, 165, 211, 150, 217, 31, 51, 238, + 138, 247, 165, 211, 150, 236, 213, 214, 199, 47, 17, 101, 236, 213, 214, + 199, 47, 17, 104, 236, 213, 214, 199, 47, 17, 133, 236, 213, 214, 199, + 47, 17, 134, 236, 213, 214, 199, 47, 17, 151, 236, 213, 214, 199, 47, 17, + 170, 236, 213, 214, 199, 47, 17, 179, 236, 213, 214, 199, 47, 17, 174, + 236, 213, 214, 199, 47, 17, 182, 236, 213, 214, 199, 47, 31, 200, 30, + 236, 213, 47, 49, 17, 101, 236, 213, 47, 49, 17, 104, 236, 213, 47, 49, + 17, 133, 236, 213, 47, 49, 17, 134, 236, 213, 47, 49, 17, 151, 236, 213, + 47, 49, 17, 170, 236, 213, 47, 49, 17, 179, 236, 213, 47, 49, 17, 174, + 236, 213, 47, 49, 17, 182, 236, 213, 47, 49, 31, 200, 30, 236, 213, 214, + 199, 47, 49, 17, 101, 236, 213, 214, 199, 47, 49, 17, 104, 236, 213, 214, + 199, 47, 49, 17, 133, 236, 213, 214, 199, 47, 49, 17, 134, 236, 213, 214, + 199, 47, 49, 17, 151, 236, 213, 214, 199, 47, 49, 17, 170, 236, 213, 214, + 199, 47, 49, 17, 179, 236, 213, 214, 199, 47, 49, 17, 174, 236, 213, 214, + 199, 47, 49, 17, 182, 236, 213, 214, 199, 47, 49, 31, 200, 30, 87, 194, + 63, 94, 54, 87, 102, 57, 87, 216, 113, 57, 87, 236, 172, 57, 87, 202, + 171, 234, 186, 54, 87, 94, 54, 87, 178, 234, 186, 54, 235, 86, 209, 192, + 94, 54, 87, 207, 8, 94, 54, 198, 184, 94, 54, 87, 198, 184, 94, 54, 237, + 184, 198, 184, 94, 54, 87, 237, 184, 198, 184, 94, 54, 60, 94, 54, 199, + 160, 198, 247, 94, 250, 77, 199, 160, 247, 186, 94, 250, 77, 60, 94, 250, + 77, 87, 60, 238, 130, 235, 92, 26, 94, 54, 87, 60, 238, 130, 197, 30, 26, + 94, 54, 202, 103, 60, 94, 54, 87, 239, 20, 60, 94, 54, 207, 95, 62, 94, + 54, 220, 22, 62, 94, 54, 248, 251, 204, 50, 62, 94, 54, 232, 86, 204, 50, + 62, 94, 54, 87, 106, 207, 94, 62, 94, 54, 87, 113, 207, 94, 62, 94, 54, + 213, 107, 106, 207, 94, 62, 94, 54, 238, 138, 219, 69, 213, 107, 113, + 207, 94, 62, 94, 54, 47, 87, 62, 94, 54, 194, 74, 94, 54, 247, 247, 202, + 171, 234, 186, 54, 247, 247, 94, 54, 247, 247, 178, 234, 186, 54, 87, + 247, 247, 202, 171, 234, 186, 54, 87, 247, 247, 94, 54, 87, 247, 247, + 178, 234, 186, 54, 200, 63, 94, 54, 87, 200, 62, 94, 54, 194, 101, 94, + 54, 87, 194, 101, 94, 54, 211, 178, 94, 54, 55, 238, 138, 219, 69, 112, + 236, 223, 250, 207, 62, 198, 186, 238, 254, 2, 62, 198, 185, 210, 120, + 211, 184, 201, 153, 211, 184, 201, 105, 46, 206, 157, 248, 237, 237, 82, + 51, 206, 157, 248, 237, 237, 82, 211, 164, 4, 78, 223, 145, 207, 169, + 202, 190, 209, 114, 201, 153, 201, 106, 209, 114, 202, 189, 84, 248, 194, + 4, 229, 5, 111, 13, 207, 73, 237, 10, 184, 236, 171, 13, 233, 71, 237, + 10, 108, 219, 93, 250, 217, 108, 219, 93, 211, 163, 62, 237, 5, 4, 246, + 136, 236, 114, 26, 4, 236, 114, 234, 116, 80, 211, 176, 197, 29, 106, 51, + 238, 224, 4, 236, 114, 113, 46, 238, 224, 4, 236, 114, 46, 211, 123, 222, + 231, 51, 211, 123, 222, 231, 232, 71, 211, 123, 222, 231, 220, 73, 130, + 200, 159, 220, 73, 142, 200, 159, 46, 26, 51, 55, 198, 8, 46, 26, 51, + 200, 159, 46, 215, 218, 184, 51, 200, 159, 184, 46, 200, 159, 130, 200, + 160, 4, 242, 131, 58, 219, 44, 236, 178, 247, 64, 229, 5, 206, 202, 62, + 239, 19, 237, 4, 62, 239, 19, 237, 5, 4, 114, 199, 117, 62, 239, 19, 237, + 5, 4, 94, 199, 117, 62, 50, 4, 114, 199, 117, 62, 50, 4, 94, 199, 117, + 13, 46, 62, 50, 186, 13, 51, 62, 50, 186, 13, 46, 250, 208, 186, 13, 51, + 250, 208, 186, 13, 46, 55, 250, 208, 186, 13, 51, 55, 250, 208, 186, 13, + 46, 62, 198, 237, 204, 2, 186, 13, 51, 62, 198, 237, 204, 2, 186, 13, 46, + 232, 192, 210, 230, 13, 51, 232, 192, 210, 230, 197, 30, 208, 170, 54, + 235, 92, 208, 170, 54, 250, 182, 231, 195, 242, 131, 54, 242, 86, 231, + 195, 242, 131, 54, 51, 61, 4, 47, 209, 206, 184, 114, 54, 184, 94, 54, + 184, 46, 51, 54, 184, 114, 55, 54, 184, 94, 55, 54, 184, 46, 51, 55, 54, + 184, 114, 61, 232, 89, 161, 184, 94, 61, 232, 89, 161, 184, 114, 55, 61, + 232, 89, 161, 184, 94, 55, 61, 232, 89, 161, 184, 94, 202, 99, 54, 66, + 67, 247, 241, 66, 67, 236, 110, 66, 67, 235, 238, 66, 67, 236, 109, 66, + 67, 235, 174, 66, 67, 236, 45, 66, 67, 235, 237, 66, 67, 236, 108, 66, + 67, 235, 142, 66, 67, 236, 13, 66, 67, 235, 205, 66, 67, 236, 76, 66, 67, + 235, 173, 66, 67, 236, 44, 66, 67, 235, 236, 66, 67, 236, 107, 66, 67, + 235, 126, 66, 67, 235, 253, 66, 67, 235, 189, 66, 67, 236, 60, 66, 67, + 235, 157, 66, 67, 236, 28, 66, 67, 235, 220, 66, 67, 236, 91, 66, 67, + 235, 141, 66, 67, 236, 12, 66, 67, 235, 204, 66, 67, 236, 75, 66, 67, + 235, 172, 66, 67, 236, 43, 66, 67, 235, 235, 66, 67, 236, 106, 66, 67, + 235, 118, 66, 67, 235, 245, 66, 67, 235, 181, 66, 67, 236, 52, 66, 67, + 235, 149, 66, 67, 236, 20, 66, 67, 235, 212, 66, 67, 236, 83, 66, 67, + 235, 133, 66, 67, 236, 4, 66, 67, 235, 196, 66, 67, 236, 67, 66, 67, 235, + 164, 66, 67, 236, 35, 66, 67, 235, 227, 66, 67, 236, 98, 66, 67, 235, + 125, 66, 67, 235, 252, 66, 67, 235, 188, 66, 67, 236, 59, 66, 67, 235, + 156, 66, 67, 236, 27, 66, 67, 235, 219, 66, 67, 236, 90, 66, 67, 235, + 140, 66, 67, 236, 11, 66, 67, 235, 203, 66, 67, 236, 74, 66, 67, 235, + 171, 66, 67, 236, 42, 66, 67, 235, 234, 66, 67, 236, 105, 66, 67, 235, + 114, 66, 67, 235, 241, 66, 67, 235, 177, 66, 67, 236, 48, 66, 67, 235, + 145, 66, 67, 236, 16, 66, 67, 235, 208, 66, 67, 236, 79, 66, 67, 235, + 129, 66, 67, 236, 0, 66, 67, 235, 192, 66, 67, 236, 63, 66, 67, 235, 160, + 66, 67, 236, 31, 66, 67, 235, 223, 66, 67, 236, 94, 66, 67, 235, 121, 66, + 67, 235, 248, 66, 67, 235, 184, 66, 67, 236, 55, 66, 67, 235, 152, 66, + 67, 236, 23, 66, 67, 235, 215, 66, 67, 236, 86, 66, 67, 235, 136, 66, 67, + 236, 7, 66, 67, 235, 199, 66, 67, 236, 70, 66, 67, 235, 167, 66, 67, 236, + 38, 66, 67, 235, 230, 66, 67, 236, 101, 66, 67, 235, 117, 66, 67, 235, + 244, 66, 67, 235, 180, 66, 67, 236, 51, 66, 67, 235, 148, 66, 67, 236, + 19, 66, 67, 235, 211, 66, 67, 236, 82, 66, 67, 235, 132, 66, 67, 236, 3, + 66, 67, 235, 195, 66, 67, 236, 66, 66, 67, 235, 163, 66, 67, 236, 34, 66, + 67, 235, 226, 66, 67, 236, 97, 66, 67, 235, 124, 66, 67, 235, 251, 66, + 67, 235, 187, 66, 67, 236, 58, 66, 67, 235, 155, 66, 67, 236, 26, 66, 67, + 235, 218, 66, 67, 236, 89, 66, 67, 235, 139, 66, 67, 236, 10, 66, 67, + 235, 202, 66, 67, 236, 73, 66, 67, 235, 170, 66, 67, 236, 41, 66, 67, + 235, 233, 66, 67, 236, 104, 66, 67, 235, 112, 66, 67, 235, 239, 66, 67, + 235, 175, 66, 67, 236, 46, 66, 67, 235, 143, 66, 67, 236, 14, 66, 67, + 235, 206, 66, 67, 236, 77, 66, 67, 235, 127, 66, 67, 235, 254, 66, 67, + 235, 190, 66, 67, 236, 61, 66, 67, 235, 158, 66, 67, 236, 29, 66, 67, + 235, 221, 66, 67, 236, 92, 66, 67, 235, 119, 66, 67, 235, 246, 66, 67, + 235, 182, 66, 67, 236, 53, 66, 67, 235, 150, 66, 67, 236, 21, 66, 67, + 235, 213, 66, 67, 236, 84, 66, 67, 235, 134, 66, 67, 236, 5, 66, 67, 235, + 197, 66, 67, 236, 68, 66, 67, 235, 165, 66, 67, 236, 36, 66, 67, 235, + 228, 66, 67, 236, 99, 66, 67, 235, 115, 66, 67, 235, 242, 66, 67, 235, + 178, 66, 67, 236, 49, 66, 67, 235, 146, 66, 67, 236, 17, 66, 67, 235, + 209, 66, 67, 236, 80, 66, 67, 235, 130, 66, 67, 236, 1, 66, 67, 235, 193, + 66, 67, 236, 64, 66, 67, 235, 161, 66, 67, 236, 32, 66, 67, 235, 224, 66, + 67, 236, 95, 66, 67, 235, 122, 66, 67, 235, 249, 66, 67, 235, 185, 66, + 67, 236, 56, 66, 67, 235, 153, 66, 67, 236, 24, 66, 67, 235, 216, 66, 67, + 236, 87, 66, 67, 235, 137, 66, 67, 236, 8, 66, 67, 235, 200, 66, 67, 236, + 71, 66, 67, 235, 168, 66, 67, 236, 39, 66, 67, 235, 231, 66, 67, 236, + 102, 66, 67, 235, 113, 66, 67, 235, 240, 66, 67, 235, 176, 66, 67, 236, + 47, 66, 67, 235, 144, 66, 67, 236, 15, 66, 67, 235, 207, 66, 67, 236, 78, + 66, 67, 235, 128, 66, 67, 235, 255, 66, 67, 235, 191, 66, 67, 236, 62, + 66, 67, 235, 159, 66, 67, 236, 30, 66, 67, 235, 222, 66, 67, 236, 93, 66, + 67, 235, 120, 66, 67, 235, 247, 66, 67, 235, 183, 66, 67, 236, 54, 66, + 67, 235, 151, 66, 67, 236, 22, 66, 67, 235, 214, 66, 67, 236, 85, 66, 67, + 235, 135, 66, 67, 236, 6, 66, 67, 235, 198, 66, 67, 236, 69, 66, 67, 235, + 166, 66, 67, 236, 37, 66, 67, 235, 229, 66, 67, 236, 100, 66, 67, 235, + 116, 66, 67, 235, 243, 66, 67, 235, 179, 66, 67, 236, 50, 66, 67, 235, + 147, 66, 67, 236, 18, 66, 67, 235, 210, 66, 67, 236, 81, 66, 67, 235, + 131, 66, 67, 236, 2, 66, 67, 235, 194, 66, 67, 236, 65, 66, 67, 235, 162, + 66, 67, 236, 33, 66, 67, 235, 225, 66, 67, 236, 96, 66, 67, 235, 123, 66, + 67, 235, 250, 66, 67, 235, 186, 66, 67, 236, 57, 66, 67, 235, 154, 66, + 67, 236, 25, 66, 67, 235, 217, 66, 67, 236, 88, 66, 67, 235, 138, 66, 67, + 236, 9, 66, 67, 235, 201, 66, 67, 236, 72, 66, 67, 235, 169, 66, 67, 236, + 40, 66, 67, 235, 232, 66, 67, 236, 103, 94, 197, 220, 61, 4, 84, 111, 94, + 197, 220, 61, 4, 55, 84, 111, 114, 55, 61, 4, 84, 111, 94, 55, 61, 4, 84, + 111, 46, 51, 55, 61, 4, 84, 111, 94, 197, 220, 61, 232, 89, 161, 114, 55, + 61, 232, 89, 161, 94, 55, 61, 232, 89, 161, 235, 92, 61, 4, 229, 5, 111, + 197, 30, 61, 4, 229, 5, 111, 197, 30, 198, 170, 54, 235, 92, 198, 170, + 54, 114, 55, 237, 186, 54, 94, 55, 237, 186, 54, 114, 198, 170, 237, 186, + 54, 94, 198, 170, 237, 186, 54, 94, 197, 220, 198, 170, 237, 186, 54, 94, + 61, 4, 235, 111, 201, 255, 197, 30, 61, 115, 161, 235, 92, 61, 115, 161, + 94, 61, 4, 200, 148, 4, 84, 111, 94, 61, 4, 200, 148, 4, 55, 84, 111, 94, + 197, 220, 61, 4, 200, 147, 94, 197, 220, 61, 4, 200, 148, 4, 84, 111, 94, + 197, 220, 61, 4, 200, 148, 4, 55, 84, 111, 114, 250, 79, 94, 250, 79, + 114, 55, 250, 79, 94, 55, 250, 79, 114, 61, 115, 60, 237, 4, 94, 61, 115, + 60, 237, 4, 114, 61, 232, 89, 248, 194, 115, 60, 237, 4, 94, 61, 232, 89, + 248, 194, 115, 60, 237, 4, 178, 194, 91, 26, 202, 171, 234, 186, 54, 178, + 234, 186, 26, 202, 171, 194, 91, 54, 178, 194, 91, 61, 4, 128, 178, 234, + 186, 61, 4, 128, 202, 171, 234, 186, 61, 4, 128, 202, 171, 194, 91, 61, + 4, 128, 178, 194, 91, 61, 26, 178, 234, 186, 54, 178, 234, 186, 61, 26, + 202, 171, 234, 186, 54, 202, 171, 234, 186, 61, 26, 202, 171, 194, 91, + 54, 202, 171, 194, 91, 61, 26, 178, 194, 91, 54, 207, 73, 237, 11, 238, + 176, 233, 71, 237, 10, 233, 71, 237, 11, 238, 176, 207, 73, 237, 10, 202, + 171, 234, 186, 61, 238, 176, 178, 234, 186, 54, 178, 234, 186, 61, 238, + 176, 202, 171, 234, 186, 54, 233, 71, 237, 11, 238, 176, 178, 234, 186, + 54, 207, 73, 237, 11, 238, 176, 202, 171, 234, 186, 54, 178, 234, 186, + 61, 238, 176, 178, 194, 91, 54, 178, 194, 91, 61, 238, 176, 178, 234, + 186, 54, 194, 125, 61, 209, 188, 236, 203, 207, 101, 61, 209, 188, 94, + 199, 216, 238, 128, 197, 29, 61, 209, 188, 94, 199, 216, 238, 128, 235, + 91, 61, 209, 188, 235, 92, 199, 216, 238, 128, 220, 18, 61, 209, 188, + 235, 92, 199, 216, 238, 128, 207, 90, 207, 93, 250, 115, 242, 86, 54, + 220, 21, 250, 115, 250, 182, 54, 198, 249, 250, 115, 250, 182, 54, 247, + 188, 250, 115, 250, 182, 54, 198, 249, 250, 115, 242, 86, 61, 4, 216, + 112, 198, 249, 250, 115, 250, 182, 61, 4, 209, 206, 106, 51, 204, 182, + 242, 86, 54, 106, 46, 204, 182, 250, 182, 54, 250, 182, 242, 84, 242, + 131, 54, 242, 86, 242, 84, 242, 131, 54, 94, 61, 95, 203, 195, 114, 54, + 114, 61, 95, 203, 195, 94, 54, 203, 195, 94, 61, 95, 114, 54, 94, 61, 4, + 102, 63, 114, 61, 4, 102, 63, 94, 61, 199, 151, 193, 223, 46, 51, 61, + 199, 151, 2, 242, 130, 197, 30, 197, 220, 61, 232, 89, 2, 242, 130, 46, + 173, 130, 51, 173, 142, 230, 21, 46, 173, 142, 51, 173, 130, 230, 21, + 130, 173, 51, 142, 173, 46, 230, 21, 130, 173, 46, 142, 173, 51, 230, 21, + 46, 173, 130, 51, 173, 130, 230, 21, 130, 173, 51, 142, 173, 51, 230, 21, + 46, 173, 142, 51, 173, 142, 230, 21, 130, 173, 46, 142, 173, 46, 230, 21, + 114, 230, 22, 4, 173, 130, 115, 161, 94, 230, 22, 4, 173, 130, 115, 161, + 197, 30, 230, 22, 4, 173, 51, 115, 161, 235, 92, 230, 22, 4, 173, 51, + 115, 161, 114, 230, 22, 4, 173, 142, 115, 161, 94, 230, 22, 4, 173, 142, + 115, 161, 197, 30, 230, 22, 4, 173, 46, 115, 161, 235, 92, 230, 22, 4, + 173, 46, 115, 161, 114, 230, 22, 4, 173, 130, 232, 89, 161, 94, 230, 22, + 4, 173, 130, 232, 89, 161, 197, 30, 230, 22, 4, 173, 51, 232, 89, 161, + 235, 92, 230, 22, 4, 173, 51, 232, 89, 161, 114, 230, 22, 4, 173, 142, + 232, 89, 161, 94, 230, 22, 4, 173, 142, 232, 89, 161, 197, 30, 230, 22, + 4, 173, 46, 232, 89, 161, 235, 92, 230, 22, 4, 173, 46, 232, 89, 161, + 114, 230, 22, 4, 173, 130, 95, 114, 230, 22, 4, 173, 235, 96, 197, 30, + 230, 22, 4, 173, 46, 248, 67, 197, 30, 230, 22, 4, 173, 207, 101, 94, + 230, 22, 4, 173, 130, 95, 94, 230, 22, 4, 173, 235, 96, 235, 92, 230, 22, + 4, 173, 46, 248, 67, 235, 92, 230, 22, 4, 173, 207, 101, 114, 230, 22, 4, + 173, 130, 95, 94, 230, 22, 4, 173, 197, 41, 114, 230, 22, 4, 173, 142, + 95, 94, 230, 22, 4, 173, 235, 96, 94, 230, 22, 4, 173, 130, 95, 114, 230, + 22, 4, 173, 197, 41, 94, 230, 22, 4, 173, 142, 95, 114, 230, 22, 4, 173, + 235, 96, 114, 230, 22, 4, 173, 130, 95, 184, 237, 185, 114, 230, 22, 4, + 173, 142, 248, 84, 184, 237, 185, 94, 230, 22, 4, 173, 130, 95, 184, 237, + 185, 94, 230, 22, 4, 173, 142, 248, 84, 184, 237, 185, 197, 30, 230, 22, + 4, 173, 46, 248, 67, 235, 92, 230, 22, 4, 173, 207, 101, 235, 92, 230, + 22, 4, 173, 46, 248, 67, 197, 30, 230, 22, 4, 173, 207, 101, 51, 55, 61, + 4, 207, 7, 229, 245, 234, 30, 3, 95, 94, 54, 199, 91, 211, 174, 95, 94, + 54, 114, 61, 95, 199, 91, 211, 173, 94, 61, 95, 199, 91, 211, 173, 94, + 61, 95, 251, 1, 187, 155, 219, 240, 95, 114, 54, 114, 61, 199, 151, 219, + 239, 230, 204, 95, 94, 54, 201, 154, 95, 94, 54, 114, 61, 199, 151, 201, + 153, 201, 106, 95, 114, 54, 46, 232, 225, 200, 147, 51, 232, 225, 200, + 147, 130, 232, 225, 200, 147, 142, 232, 225, 200, 147, 198, 170, 84, 248, + 194, 237, 82, 192, 156, 213, 109, 202, 117, 192, 156, 213, 109, 197, 206, + 242, 47, 46, 62, 238, 138, 186, 51, 62, 238, 138, 186, 46, 62, 210, 230, + 51, 62, 210, 230, 192, 156, 213, 109, 46, 223, 206, 186, 192, 156, 213, + 109, 51, 223, 206, 186, 192, 156, 213, 109, 46, 248, 19, 186, 192, 156, + 213, 109, 51, 248, 19, 186, 46, 50, 247, 165, 4, 197, 67, 51, 50, 247, + 165, 4, 197, 67, 46, 50, 247, 165, 4, 199, 118, 223, 191, 198, 249, 238, + 223, 51, 50, 247, 165, 4, 199, 118, 223, 191, 247, 188, 238, 223, 46, 50, + 247, 165, 4, 199, 118, 223, 191, 247, 188, 238, 223, 51, 50, 247, 165, 4, + 199, 118, 223, 191, 198, 249, 238, 223, 46, 250, 208, 247, 165, 4, 236, + 114, 51, 250, 208, 247, 165, 4, 236, 114, 46, 250, 115, 219, 240, 186, + 51, 250, 115, 230, 204, 186, 55, 46, 250, 115, 230, 204, 186, 55, 51, + 250, 115, 219, 240, 186, 46, 60, 198, 237, 204, 2, 186, 51, 60, 198, 237, + 204, 2, 186, 235, 111, 233, 27, 84, 192, 21, 219, 175, 217, 42, 250, 208, + 211, 176, 220, 28, 51, 250, 208, 196, 137, 4, 202, 106, 217, 42, 51, 250, + 208, 4, 236, 114, 250, 208, 4, 206, 159, 223, 145, 251, 130, 250, 207, + 202, 139, 250, 208, 211, 176, 220, 28, 202, 139, 250, 208, 211, 176, 197, + 41, 163, 250, 207, 207, 168, 250, 207, 250, 208, 4, 197, 67, 207, 168, + 250, 208, 4, 197, 67, 212, 18, 250, 208, 211, 176, 197, 41, 212, 18, 250, + 208, 211, 176, 235, 96, 217, 42, 250, 208, 4, 211, 184, 250, 93, 234, 76, + 223, 191, 61, 209, 188, 130, 26, 207, 101, 217, 42, 250, 208, 4, 211, + 184, 250, 93, 234, 76, 223, 191, 61, 209, 188, 130, 26, 220, 28, 217, 42, + 250, 208, 4, 211, 184, 250, 93, 234, 76, 223, 191, 61, 209, 188, 142, 26, + 207, 101, 217, 42, 250, 208, 4, 211, 184, 250, 93, 234, 76, 223, 191, 61, + 209, 188, 142, 26, 220, 28, 217, 42, 250, 208, 4, 211, 184, 250, 93, 234, + 76, 223, 191, 61, 209, 188, 51, 26, 197, 41, 217, 42, 250, 208, 4, 211, + 184, 250, 93, 234, 76, 223, 191, 61, 209, 188, 46, 26, 197, 41, 217, 42, + 250, 208, 4, 211, 184, 250, 93, 234, 76, 223, 191, 61, 209, 188, 51, 26, + 235, 96, 217, 42, 250, 208, 4, 211, 184, 250, 93, 234, 76, 223, 191, 61, + 209, 188, 46, 26, 235, 96, 207, 168, 234, 90, 204, 151, 234, 90, 204, + 152, 4, 211, 117, 234, 90, 204, 152, 4, 2, 242, 131, 58, 234, 90, 204, + 152, 4, 51, 61, 58, 234, 90, 204, 152, 4, 46, 61, 58, 242, 131, 4, 229, + 5, 161, 47, 84, 161, 47, 210, 235, 47, 207, 169, 202, 189, 47, 210, 120, + 242, 131, 236, 178, 247, 64, 229, 5, 248, 194, 26, 198, 249, 138, 236, + 178, 247, 64, 84, 161, 242, 131, 4, 201, 108, 193, 223, 47, 250, 180, + 236, 172, 57, 130, 61, 199, 151, 242, 130, 47, 62, 247, 106, 47, 247, + 106, 47, 219, 239, 47, 230, 203, 242, 131, 4, 2, 242, 131, 115, 199, 225, + 207, 101, 242, 131, 4, 103, 229, 5, 201, 196, 115, 199, 225, 207, 101, + 108, 207, 73, 237, 11, 203, 4, 108, 233, 71, 237, 11, 203, 4, 108, 250, + 37, 108, 2, 242, 130, 108, 202, 106, 103, 222, 230, 202, 104, 198, 186, + 4, 78, 58, 198, 186, 4, 197, 67, 206, 159, 223, 191, 198, 185, 198, 186, + 4, 204, 159, 250, 27, 247, 187, 51, 198, 186, 95, 46, 198, 185, 46, 198, + 186, 248, 67, 84, 161, 84, 248, 194, 248, 67, 51, 198, 185, 247, 175, 4, + 46, 138, 247, 248, 247, 175, 4, 51, 138, 247, 248, 60, 247, 174, 24, 4, + 46, 138, 247, 248, 24, 4, 51, 138, 247, 248, 62, 228, 195, 60, 228, 195, + 46, 194, 58, 233, 27, 51, 194, 58, 233, 27, 46, 55, 194, 58, 233, 27, 51, + 55, 194, 58, 233, 27, 223, 183, 223, 167, 199, 114, 136, 223, 167, 223, + 168, 214, 201, 4, 84, 161, 235, 105, 215, 218, 50, 4, 238, 246, 211, 122, + 223, 180, 250, 61, 203, 157, 209, 85, 234, 30, 3, 26, 203, 6, 210, 235, + 234, 30, 3, 26, 203, 6, 210, 236, 4, 199, 91, 58, 228, 41, 115, 26, 203, + 6, 210, 235, 231, 9, 202, 18, 199, 213, 235, 95, 198, 186, 4, 46, 138, + 247, 248, 235, 95, 198, 186, 4, 51, 138, 247, 248, 60, 237, 5, 4, 142, + 54, 60, 219, 43, 62, 242, 131, 4, 142, 54, 60, 242, 131, 4, 142, 54, 234, + 12, 62, 202, 106, 234, 12, 60, 202, 106, 234, 12, 62, 237, 4, 234, 12, + 60, 237, 4, 234, 12, 62, 242, 130, 234, 12, 60, 242, 130, 206, 201, 207, + 169, 202, 190, 211, 173, 202, 190, 4, 211, 117, 207, 169, 202, 190, 4, + 229, 5, 111, 248, 28, 202, 189, 248, 28, 207, 169, 202, 189, 55, 209, + 206, 198, 170, 209, 206, 220, 23, 238, 130, 250, 208, 186, 207, 96, 238, + 130, 250, 208, 186, 199, 75, 216, 110, 215, 150, 47, 78, 211, 173, 215, + 150, 47, 102, 211, 173, 215, 150, 47, 24, 211, 173, 215, 150, 197, 57, + 211, 174, 4, 236, 114, 215, 150, 197, 57, 211, 174, 4, 209, 206, 215, + 150, 50, 223, 128, 211, 173, 215, 150, 50, 197, 57, 211, 173, 103, 219, + 93, 26, 211, 173, 103, 219, 93, 211, 164, 211, 173, 215, 150, 24, 211, + 173, 216, 59, 103, 201, 129, 201, 127, 4, 223, 141, 208, 170, 223, 142, + 211, 173, 232, 234, 210, 224, 223, 141, 223, 142, 4, 55, 111, 223, 142, + 249, 244, 4, 203, 4, 242, 123, 232, 68, 250, 182, 223, 139, 219, 176, + 223, 140, 4, 207, 241, 210, 203, 250, 87, 209, 182, 219, 176, 223, 140, + 4, 204, 182, 210, 203, 250, 87, 209, 182, 219, 176, 223, 140, 213, 111, + 223, 185, 199, 225, 209, 182, 223, 142, 250, 87, 41, 209, 192, 211, 173, + 208, 164, 223, 142, 211, 173, 223, 142, 4, 114, 61, 4, 128, 223, 142, 4, + 24, 57, 223, 142, 4, 223, 127, 223, 142, 4, 197, 56, 223, 142, 4, 211, + 117, 223, 142, 4, 197, 67, 222, 231, 220, 73, 46, 198, 186, 211, 173, + 192, 156, 213, 109, 205, 246, 239, 26, 192, 156, 213, 109, 205, 246, 209, + 250, 192, 156, 213, 109, 205, 246, 209, 80, 102, 3, 4, 2, 242, 131, 58, + 102, 3, 4, 242, 122, 251, 144, 58, 102, 3, 4, 199, 91, 58, 102, 3, 4, 78, + 63, 102, 3, 4, 199, 91, 63, 102, 3, 4, 201, 155, 104, 102, 3, 4, 60, 198, + 185, 216, 113, 3, 4, 242, 39, 58, 216, 113, 3, 4, 78, 63, 216, 113, 3, 4, + 233, 71, 236, 111, 216, 113, 3, 4, 207, 73, 236, 111, 102, 3, 223, 191, + 46, 138, 242, 130, 102, 3, 223, 191, 51, 138, 242, 130, 196, 122, 211, + 164, 238, 184, 209, 85, 215, 214, 3, 4, 78, 58, 215, 214, 3, 4, 197, 67, + 204, 179, 209, 86, 4, 247, 188, 242, 83, 202, 234, 209, 85, 215, 214, 3, + 223, 191, 46, 138, 242, 130, 215, 214, 3, 223, 191, 51, 138, 242, 130, + 47, 215, 214, 3, 4, 242, 122, 251, 143, 215, 214, 3, 223, 191, 55, 242, + 130, 47, 236, 172, 57, 102, 3, 223, 191, 198, 185, 216, 113, 3, 223, 191, + 198, 185, 215, 214, 3, 223, 191, 198, 185, 223, 136, 209, 85, 207, 91, + 223, 136, 209, 85, 192, 156, 213, 109, 207, 214, 239, 26, 250, 239, 211, + 164, 238, 230, 223, 128, 4, 236, 114, 197, 57, 4, 216, 113, 57, 197, 57, + 4, 211, 117, 223, 128, 4, 211, 117, 223, 128, 4, 219, 93, 250, 217, 197, + 57, 4, 219, 93, 211, 163, 197, 57, 95, 223, 127, 223, 128, 95, 197, 56, + 197, 57, 95, 248, 194, 95, 223, 127, 223, 128, 95, 248, 194, 95, 197, 56, + 197, 57, 248, 67, 26, 222, 230, 4, 197, 56, 223, 128, 248, 67, 26, 222, + 230, 4, 223, 127, 242, 84, 197, 57, 4, 204, 158, 242, 84, 223, 128, 4, + 204, 158, 55, 50, 223, 127, 55, 50, 197, 56, 242, 84, 197, 57, 4, 204, + 159, 26, 202, 234, 209, 85, 219, 93, 26, 4, 78, 58, 219, 93, 211, 164, 4, + 78, 58, 55, 219, 93, 250, 217, 55, 219, 93, 211, 163, 103, 223, 129, 219, + 93, 250, 217, 103, 223, 129, 219, 93, 211, 163, 202, 244, 220, 73, 211, + 163, 202, 244, 220, 73, 250, 217, 219, 93, 211, 164, 211, 112, 219, 93, + 250, 217, 219, 93, 26, 4, 85, 201, 255, 219, 93, 211, 164, 4, 85, 201, + 255, 219, 93, 26, 4, 229, 5, 237, 185, 219, 93, 211, 164, 4, 229, 5, 237, + 185, 219, 93, 26, 4, 55, 211, 117, 219, 93, 26, 4, 197, 67, 219, 93, 26, + 4, 55, 197, 67, 2, 196, 119, 4, 197, 67, 219, 93, 211, 164, 4, 55, 211, + 117, 219, 93, 211, 164, 4, 55, 197, 67, 192, 156, 213, 109, 236, 124, + 250, 172, 192, 156, 213, 109, 208, 29, 250, 172, 234, 30, 3, 4, 78, 63, + 228, 41, 4, 78, 58, 198, 170, 229, 5, 248, 194, 4, 55, 84, 111, 198, 170, + 229, 5, 248, 194, 4, 198, 170, 84, 111, 199, 91, 211, 174, 4, 78, 58, + 199, 91, 211, 174, 4, 207, 73, 236, 111, 203, 84, 216, 113, 203, 83, 239, + 13, 4, 78, 58, 234, 30, 4, 250, 37, 251, 1, 187, 115, 4, 242, 122, 251, + 143, 250, 138, 187, 211, 164, 187, 155, 234, 30, 3, 95, 102, 57, 102, 3, + 95, 234, 30, 57, 234, 30, 3, 95, 199, 91, 211, 173, 55, 242, 48, 234, 31, + 103, 239, 6, 234, 30, 203, 98, 112, 239, 6, 234, 30, 203, 98, 234, 30, 3, + 4, 103, 236, 112, 95, 26, 103, 236, 112, 63, 234, 23, 4, 232, 119, 236, + 112, 58, 219, 240, 4, 242, 131, 223, 145, 230, 204, 4, 242, 131, 223, + 145, 219, 240, 4, 208, 159, 122, 58, 230, 204, 4, 208, 159, 122, 58, 219, + 240, 211, 164, 203, 6, 187, 155, 230, 204, 211, 164, 203, 6, 187, 155, + 219, 240, 211, 164, 203, 6, 187, 115, 4, 78, 223, 145, 230, 204, 211, + 164, 203, 6, 187, 115, 4, 78, 223, 145, 219, 240, 211, 164, 203, 6, 187, + 115, 4, 78, 58, 230, 204, 211, 164, 203, 6, 187, 115, 4, 78, 58, 219, + 240, 211, 164, 203, 6, 187, 115, 4, 78, 95, 207, 101, 230, 204, 211, 164, + 203, 6, 187, 115, 4, 78, 95, 220, 28, 219, 240, 211, 164, 250, 139, 230, + 204, 211, 164, 250, 139, 219, 240, 26, 203, 72, 213, 111, 187, 155, 230, + 204, 26, 203, 72, 213, 111, 187, 155, 219, 240, 26, 213, 111, 250, 139, + 230, 204, 26, 213, 111, 250, 139, 219, 240, 95, 235, 104, 187, 95, 230, + 203, 230, 204, 95, 235, 104, 187, 95, 219, 239, 219, 240, 95, 203, 84, + 211, 164, 234, 31, 230, 204, 95, 203, 84, 211, 164, 234, 31, 219, 240, + 95, 203, 84, 95, 230, 203, 230, 204, 95, 203, 84, 95, 219, 239, 219, 240, + 95, 230, 204, 95, 235, 104, 234, 31, 230, 204, 95, 219, 240, 95, 235, + 104, 234, 31, 219, 240, 95, 203, 6, 187, 95, 230, 204, 95, 203, 6, 234, + 31, 230, 204, 95, 203, 6, 187, 95, 219, 240, 95, 203, 6, 234, 31, 203, 6, + 187, 115, 211, 164, 219, 239, 203, 6, 187, 115, 211, 164, 230, 203, 203, + 6, 187, 115, 211, 164, 219, 240, 4, 78, 223, 145, 203, 6, 187, 115, 211, + 164, 230, 204, 4, 78, 223, 145, 235, 104, 187, 115, 211, 164, 219, 239, + 235, 104, 187, 115, 211, 164, 230, 203, 235, 104, 203, 6, 187, 115, 211, + 164, 219, 239, 235, 104, 203, 6, 187, 115, 211, 164, 230, 203, 203, 84, + 211, 164, 219, 239, 203, 84, 211, 164, 230, 203, 203, 84, 95, 219, 240, + 95, 234, 30, 57, 203, 84, 95, 230, 204, 95, 234, 30, 57, 55, 214, 185, + 219, 239, 55, 214, 185, 230, 203, 55, 214, 185, 219, 240, 4, 197, 67, + 230, 204, 211, 112, 219, 239, 230, 204, 248, 67, 219, 239, 219, 240, 242, + 84, 247, 64, 238, 131, 230, 204, 242, 84, 247, 64, 238, 131, 219, 240, + 242, 84, 247, 64, 238, 132, 95, 203, 6, 234, 31, 230, 204, 242, 84, 247, + 64, 238, 132, 95, 203, 6, 234, 31, 202, 235, 199, 229, 220, 71, 199, 229, + 202, 235, 199, 230, 211, 164, 187, 155, 220, 71, 199, 230, 211, 164, 187, + 155, 234, 30, 3, 4, 247, 99, 58, 209, 116, 95, 203, 72, 234, 30, 57, 201, + 146, 95, 203, 72, 234, 30, 57, 209, 116, 95, 203, 72, 213, 111, 187, 155, + 201, 146, 95, 203, 72, 213, 111, 187, 155, 209, 116, 95, 234, 30, 57, + 201, 146, 95, 234, 30, 57, 209, 116, 95, 213, 111, 187, 155, 201, 146, + 95, 213, 111, 187, 155, 209, 116, 95, 251, 1, 187, 155, 201, 146, 95, + 251, 1, 187, 155, 209, 116, 95, 213, 111, 251, 1, 187, 155, 201, 146, 95, + 213, 111, 251, 1, 187, 155, 55, 209, 115, 55, 201, 145, 201, 154, 4, 236, + 114, 201, 106, 4, 236, 114, 201, 154, 4, 102, 3, 63, 201, 106, 4, 102, 3, + 63, 201, 154, 4, 215, 214, 3, 63, 201, 106, 4, 215, 214, 3, 63, 201, 154, + 80, 211, 164, 187, 115, 4, 78, 58, 201, 106, 80, 211, 164, 187, 115, 4, + 78, 58, 201, 154, 80, 95, 234, 30, 57, 201, 106, 80, 95, 234, 30, 57, + 201, 154, 80, 95, 199, 91, 211, 173, 201, 106, 80, 95, 199, 91, 211, 173, + 201, 154, 80, 95, 251, 1, 187, 155, 201, 106, 80, 95, 251, 1, 187, 155, + 201, 154, 80, 95, 213, 111, 187, 155, 201, 106, 80, 95, 213, 111, 187, + 155, 50, 46, 211, 184, 105, 211, 173, 50, 51, 211, 184, 105, 211, 173, + 242, 84, 201, 153, 242, 84, 201, 105, 242, 84, 201, 154, 211, 164, 187, + 155, 242, 84, 201, 106, 211, 164, 187, 155, 201, 154, 95, 201, 105, 201, + 106, 95, 201, 153, 201, 154, 95, 201, 153, 201, 106, 95, 201, 105, 201, + 106, 248, 67, 201, 153, 201, 106, 248, 67, 26, 222, 230, 247, 64, 237, + 186, 4, 201, 153, 234, 116, 80, 211, 176, 235, 91, 209, 240, 4, 200, 57, + 198, 248, 198, 204, 223, 127, 232, 137, 213, 126, 203, 195, 46, 200, 159, + 203, 195, 142, 200, 159, 203, 195, 130, 200, 159, 210, 121, 4, 206, 158, + 84, 248, 194, 198, 170, 51, 198, 8, 55, 84, 248, 194, 46, 198, 8, 84, + 248, 194, 55, 46, 198, 8, 55, 84, 248, 194, 55, 46, 198, 8, 184, 237, + 186, 232, 89, 46, 217, 10, 80, 55, 196, 105, 203, 195, 142, 200, 160, 4, + 211, 117, 203, 195, 130, 200, 160, 4, 197, 67, 203, 195, 130, 200, 160, + 95, 203, 195, 142, 200, 159, 55, 142, 200, 159, 55, 130, 200, 159, 55, + 201, 208, 213, 111, 57, 207, 168, 55, 201, 208, 213, 111, 57, 236, 136, + 213, 111, 236, 180, 4, 207, 168, 214, 200, 203, 4, 84, 219, 176, 4, 242, + 131, 58, 84, 219, 176, 4, 242, 131, 63, 142, 200, 160, 4, 242, 131, 63, + 210, 236, 4, 229, 5, 111, 210, 236, 4, 199, 91, 211, 173, 198, 170, 84, + 248, 194, 248, 21, 207, 215, 198, 170, 84, 248, 194, 4, 229, 5, 111, 198, + 170, 242, 48, 211, 173, 198, 170, 214, 185, 219, 239, 198, 170, 214, 185, + 230, 203, 235, 104, 203, 6, 219, 240, 211, 164, 187, 155, 235, 104, 203, + 6, 230, 204, 211, 164, 187, 155, 198, 170, 202, 190, 248, 21, 207, 215, + 220, 73, 198, 170, 84, 248, 194, 211, 173, 55, 202, 190, 211, 173, 62, + 84, 161, 215, 150, 62, 84, 161, 178, 234, 186, 62, 54, 178, 194, 91, 62, + 54, 202, 171, 234, 186, 62, 54, 202, 171, 194, 91, 62, 54, 46, 51, 62, + 54, 114, 60, 54, 197, 30, 60, 54, 235, 92, 60, 54, 178, 234, 186, 60, 54, + 178, 194, 91, 60, 54, 202, 171, 234, 186, 60, 54, 202, 171, 194, 91, 60, + 54, 46, 51, 60, 54, 130, 142, 60, 54, 94, 61, 4, 199, 74, 235, 91, 94, + 61, 4, 199, 74, 197, 29, 114, 61, 4, 199, 74, 235, 91, 114, 61, 4, 199, + 74, 197, 29, 50, 4, 198, 249, 138, 247, 248, 50, 4, 247, 188, 138, 247, + 248, 50, 4, 113, 51, 237, 11, 138, 247, 248, 50, 4, 106, 46, 237, 11, + 138, 247, 248, 237, 5, 4, 46, 138, 247, 248, 237, 5, 4, 51, 138, 247, + 248, 237, 5, 4, 198, 249, 138, 247, 248, 237, 5, 4, 247, 188, 138, 247, + 248, 235, 111, 202, 106, 60, 220, 73, 202, 106, 62, 220, 73, 202, 106, + 60, 196, 53, 2, 202, 106, 62, 196, 53, 2, 202, 106, 60, 210, 144, 62, + 210, 144, 62, 229, 192, 60, 229, 192, 229, 5, 60, 229, 192, 60, 220, 73, + 242, 130, 60, 217, 31, 237, 4, 62, 217, 31, 237, 4, 60, 217, 31, 219, 43, + 62, 217, 31, 219, 43, 60, 2, 237, 4, 60, 2, 219, 43, 62, 2, 219, 43, 60, + 229, 5, 234, 106, 62, 229, 5, 234, 106, 60, 84, 234, 106, 62, 84, 234, + 106, 46, 61, 4, 2, 242, 130, 112, 114, 250, 73, 46, 61, 4, 47, 209, 206, + 184, 114, 202, 99, 54, 114, 197, 220, 61, 4, 84, 111, 114, 197, 220, 61, + 4, 55, 84, 111, 114, 197, 220, 61, 232, 89, 161, 114, 197, 220, 198, 170, + 237, 186, 54, 114, 61, 4, 235, 111, 201, 255, 114, 61, 4, 200, 148, 4, + 84, 111, 114, 61, 4, 200, 148, 4, 55, 84, 111, 114, 197, 220, 61, 4, 200, + 147, 114, 197, 220, 61, 4, 200, 148, 4, 84, 111, 114, 197, 220, 61, 4, + 200, 148, 4, 55, 84, 111, 114, 61, 199, 151, 193, 223, 194, 125, 61, 209, + 188, 236, 203, 220, 28, 234, 30, 3, 95, 114, 54, 207, 169, 199, 91, 211, + 174, 95, 114, 54, 114, 61, 95, 207, 169, 251, 1, 187, 155, 94, 61, 199, + 151, 230, 203, 94, 61, 199, 151, 201, 105, 114, 208, 170, 54, 94, 208, + 170, 54, 207, 169, 199, 91, 211, 174, 95, 94, 54, 94, 61, 95, 207, 169, + 251, 1, 187, 155, 199, 91, 211, 174, 95, 114, 54, 114, 61, 95, 251, 1, + 187, 155, 114, 61, 95, 207, 169, 199, 91, 211, 173, 94, 61, 95, 207, 169, + 199, 91, 211, 173, 235, 92, 198, 184, 192, 21, 54, 203, 195, 203, 6, 178, + 54, 203, 195, 248, 249, 202, 171, 54, 62, 217, 31, 202, 19, 60, 2, 202, + 19, 62, 2, 202, 19, 60, 207, 96, 210, 144, 62, 207, 96, 210, 144, 87, + 220, 73, 242, 130, 87, 211, 119, 4, 211, 119, 223, 145, 87, 242, 131, 4, + 242, 131, 223, 145, 87, 242, 130, 87, 47, 206, 51, 203, 6, 178, 61, 4, + 229, 14, 229, 245, 248, 249, 202, 171, 61, 4, 229, 14, 200, 147, 203, 6, + 178, 61, 4, 229, 5, 200, 147, 248, 249, 202, 171, 61, 4, 229, 5, 200, + 147, 248, 75, 61, 209, 188, 235, 92, 199, 216, 178, 234, 185, 203, 195, + 248, 75, 61, 209, 188, 235, 92, 199, 216, 178, 234, 185, 114, 198, 184, + 54, 197, 30, 198, 184, 54, 94, 198, 184, 54, 235, 92, 198, 184, 54, 46, + 51, 198, 184, 54, 130, 142, 198, 184, 54, 178, 194, 91, 198, 184, 54, + 178, 234, 186, 198, 184, 54, 202, 171, 234, 186, 198, 184, 54, 202, 171, + 194, 91, 198, 184, 54, 114, 198, 184, 237, 184, 54, 197, 30, 198, 184, + 237, 184, 54, 94, 198, 184, 237, 184, 54, 235, 92, 198, 184, 237, 184, + 54, 242, 86, 198, 184, 211, 184, 242, 131, 54, 250, 182, 198, 184, 211, + 184, 242, 131, 54, 114, 198, 184, 61, 115, 161, 197, 30, 198, 184, 61, + 115, 161, 94, 198, 184, 61, 115, 161, 235, 92, 198, 184, 61, 115, 161, + 178, 194, 91, 198, 184, 61, 115, 161, 178, 234, 186, 198, 184, 61, 115, + 161, 202, 171, 234, 186, 198, 184, 61, 115, 161, 202, 171, 194, 91, 198, + 184, 61, 115, 161, 114, 198, 184, 61, 4, 55, 229, 5, 111, 197, 30, 198, + 184, 61, 4, 55, 229, 5, 111, 94, 198, 184, 61, 4, 55, 229, 5, 111, 235, + 92, 198, 184, 61, 4, 55, 229, 5, 111, 229, 5, 200, 167, 222, 1, 84, 200, + 167, 222, 1, 114, 198, 184, 61, 136, 94, 198, 184, 54, 197, 30, 198, 184, + 61, 114, 80, 235, 92, 198, 184, 54, 94, 198, 184, 61, 136, 114, 198, 184, + 54, 235, 92, 198, 184, 61, 114, 80, 197, 30, 198, 184, 54, 114, 198, 184, + 211, 53, 250, 73, 197, 30, 198, 184, 211, 53, 250, 73, 94, 198, 184, 211, + 53, 250, 73, 235, 92, 198, 184, 211, 53, 250, 73, 114, 60, 47, 62, 54, + 197, 30, 60, 47, 62, 54, 94, 60, 47, 62, 54, 235, 92, 60, 47, 62, 54, + 250, 182, 198, 184, 51, 197, 172, 54, 250, 182, 198, 184, 247, 188, 197, + 172, 54, 250, 182, 198, 184, 46, 197, 172, 54, 250, 182, 198, 184, 198, + 249, 197, 172, 54, 207, 173, 220, 28, 207, 173, 207, 101, 214, 174, 220, + 28, 214, 174, 207, 101, 232, 119, 238, 224, 250, 74, 242, 126, 250, 181, + 94, 60, 54, 16, 39, 197, 206, 41, 234, 117, 199, 160, 198, 247, 114, 234, + 24, 250, 77, 199, 160, 207, 97, 197, 30, 234, 24, 250, 77, 199, 160, 198, + 247, 94, 234, 24, 250, 77, 199, 160, 220, 24, 235, 92, 234, 24, 250, 77, + 60, 114, 234, 24, 250, 77, 60, 197, 30, 234, 24, 250, 77, 60, 94, 234, + 24, 250, 77, 60, 235, 92, 234, 24, 250, 77, 235, 92, 198, 184, 61, 4, + 184, 199, 74, 220, 18, 235, 92, 198, 184, 61, 4, 184, 199, 74, 207, 90, + 197, 30, 198, 184, 61, 4, 184, 199, 74, 220, 18, 197, 30, 198, 184, 61, + 4, 184, 199, 74, 207, 90, 114, 198, 184, 61, 4, 184, 199, 74, 197, 29, + 94, 198, 184, 61, 4, 184, 199, 74, 197, 29, 114, 198, 184, 61, 4, 184, + 199, 74, 235, 91, 94, 198, 184, 61, 4, 184, 199, 74, 235, 91, 60, 238, + 130, 235, 92, 26, 114, 54, 60, 238, 130, 235, 92, 26, 94, 54, 60, 238, + 130, 197, 30, 26, 114, 54, 60, 238, 130, 197, 30, 26, 94, 54, 60, 238, + 130, 114, 26, 197, 30, 54, 60, 238, 130, 94, 26, 197, 30, 54, 60, 238, + 130, 114, 26, 235, 92, 54, 60, 238, 130, 94, 26, 235, 92, 54, 207, 142, + 61, 142, 220, 28, 207, 142, 61, 142, 207, 101, 207, 142, 61, 130, 220, + 28, 207, 142, 61, 130, 207, 101, 207, 142, 61, 46, 197, 41, 207, 142, 61, + 51, 197, 41, 207, 142, 61, 46, 235, 96, 207, 142, 61, 51, 235, 96, 197, + 30, 62, 61, 232, 89, 248, 194, 4, 229, 5, 161, 130, 250, 78, 223, 191, + 41, 207, 243, 247, 173, 211, 112, 62, 202, 104, 211, 112, 62, 26, 60, + 202, 104, 211, 112, 60, 202, 104, 248, 213, 105, 4, 152, 193, 223, 47, + 193, 223, 47, 28, 193, 223, 60, 50, 246, 135, 60, 237, 5, 246, 135, 163, + 60, 210, 144, 229, 5, 60, 212, 9, 60, 212, 9, 60, 217, 31, 197, 40, 198, + 186, 246, 135, 60, 217, 31, 235, 95, 198, 186, 246, 135, 60, 217, 31, + 220, 23, 198, 186, 246, 135, 60, 217, 31, 207, 96, 198, 186, 246, 135, + 214, 190, 232, 136, 104, 198, 249, 138, 60, 242, 130, 247, 188, 138, 60, + 242, 130, 152, 232, 119, 209, 190, 60, 238, 126, 207, 16, 152, 232, 119, + 209, 190, 60, 238, 126, 62, 232, 119, 209, 190, 238, 126, 207, 16, 62, + 232, 119, 209, 190, 238, 126, 50, 209, 160, 223, 172, 197, 71, 57, 230, + 194, 77, 209, 203, 232, 136, 104, 209, 203, 232, 136, 133, 209, 203, 232, + 136, 134, 209, 203, 232, 136, 151, 198, 206, 209, 70, 250, 33, 228, 114, + 210, 62, 214, 186, 62, 216, 30, 204, 188, 60, 237, 5, 211, 212, 238, 183, + 198, 148, 152, 216, 30, 250, 69, 238, 146, 230, 96, 192, 74, 221, 50, + 250, 151, 251, 115, 194, 221, 209, 161, 46, 138, 60, 202, 19, 51, 138, + 60, 202, 19, 202, 20, 4, 46, 138, 247, 248, 202, 20, 4, 51, 138, 247, + 248, 114, 197, 220, 61, 4, 198, 186, 250, 75, 197, 30, 197, 220, 61, 4, + 198, 186, 250, 75, 94, 197, 220, 61, 4, 198, 186, 250, 75, 235, 92, 197, + 220, 61, 4, 198, 186, 250, 75, 234, 14, 232, 136, 101, 234, 14, 232, 136, + 104, 205, 206, 206, 181, 250, 32, 16, 196, 23, 206, 181, 250, 32, 16, + 213, 97, 206, 181, 250, 32, 16, 208, 147, 206, 181, 250, 32, 16, 248, 16, + 206, 181, 250, 32, 16, 204, 171, 206, 181, 250, 32, 16, 198, 197, 234, + 30, 3, 4, 223, 168, 63, 197, 53, 109, 204, 167, 109, 235, 101, 109, 210, + 213, 109, 207, 168, 51, 250, 207, 229, 213, 210, 196, 109, 131, 6, 1, + 249, 227, 131, 6, 1, 247, 110, 131, 6, 1, 196, 121, 131, 6, 1, 231, 13, + 131, 6, 1, 236, 141, 131, 6, 1, 193, 38, 131, 6, 1, 192, 55, 131, 6, 1, + 235, 12, 131, 6, 1, 192, 81, 131, 6, 1, 223, 69, 131, 6, 1, 88, 223, 69, + 131, 6, 1, 70, 131, 6, 1, 236, 162, 131, 6, 1, 222, 127, 131, 6, 1, 219, + 139, 131, 6, 1, 215, 155, 131, 6, 1, 215, 46, 131, 6, 1, 211, 196, 131, + 6, 1, 209, 185, 131, 6, 1, 207, 72, 131, 6, 1, 202, 241, 131, 6, 1, 197, + 251, 131, 6, 1, 197, 88, 131, 6, 1, 232, 92, 131, 6, 1, 229, 198, 131, 6, + 1, 211, 131, 131, 6, 1, 210, 181, 131, 6, 1, 203, 167, 131, 6, 1, 198, + 97, 131, 6, 1, 242, 174, 131, 6, 1, 204, 64, 131, 6, 1, 193, 47, 131, 6, + 1, 193, 49, 131, 6, 1, 193, 82, 131, 6, 1, 202, 135, 144, 131, 6, 1, 192, + 214, 131, 6, 1, 2, 192, 179, 131, 6, 1, 2, 192, 180, 4, 200, 147, 131, 6, + 1, 193, 1, 131, 6, 1, 223, 110, 2, 192, 179, 131, 6, 1, 248, 28, 192, + 179, 131, 6, 1, 223, 110, 248, 28, 192, 179, 131, 6, 1, 232, 216, 131, 6, + 1, 223, 67, 131, 6, 1, 203, 166, 131, 6, 1, 198, 160, 64, 131, 6, 1, 220, + 61, 215, 155, 131, 2, 1, 249, 227, 131, 2, 1, 247, 110, 131, 2, 1, 196, + 121, 131, 2, 1, 231, 13, 131, 2, 1, 236, 141, 131, 2, 1, 193, 38, 131, 2, + 1, 192, 55, 131, 2, 1, 235, 12, 131, 2, 1, 192, 81, 131, 2, 1, 223, 69, + 131, 2, 1, 88, 223, 69, 131, 2, 1, 70, 131, 2, 1, 236, 162, 131, 2, 1, + 222, 127, 131, 2, 1, 219, 139, 131, 2, 1, 215, 155, 131, 2, 1, 215, 46, + 131, 2, 1, 211, 196, 131, 2, 1, 209, 185, 131, 2, 1, 207, 72, 131, 2, 1, + 202, 241, 131, 2, 1, 197, 251, 131, 2, 1, 197, 88, 131, 2, 1, 232, 92, + 131, 2, 1, 229, 198, 131, 2, 1, 211, 131, 131, 2, 1, 210, 181, 131, 2, 1, + 203, 167, 131, 2, 1, 198, 97, 131, 2, 1, 242, 174, 131, 2, 1, 204, 64, + 131, 2, 1, 193, 47, 131, 2, 1, 193, 49, 131, 2, 1, 193, 82, 131, 2, 1, + 202, 135, 144, 131, 2, 1, 192, 214, 131, 2, 1, 2, 192, 179, 131, 2, 1, 2, + 192, 180, 4, 200, 147, 131, 2, 1, 193, 1, 131, 2, 1, 223, 110, 2, 192, + 179, 131, 2, 1, 248, 28, 192, 179, 131, 2, 1, 223, 110, 248, 28, 192, + 179, 131, 2, 1, 232, 216, 131, 2, 1, 223, 67, 131, 2, 1, 203, 166, 131, + 2, 1, 198, 160, 64, 131, 2, 1, 220, 61, 215, 155, 8, 6, 1, 220, 202, 4, + 55, 161, 8, 2, 1, 220, 202, 4, 55, 161, 8, 6, 1, 220, 202, 4, 85, 199, + 90, 8, 6, 1, 211, 94, 4, 111, 8, 6, 1, 208, 112, 4, 200, 147, 8, 2, 1, + 41, 4, 111, 8, 2, 1, 200, 229, 4, 237, 11, 111, 8, 6, 1, 230, 125, 4, + 237, 59, 8, 2, 1, 230, 125, 4, 237, 59, 8, 6, 1, 222, 185, 4, 237, 59, 8, + 2, 1, 222, 185, 4, 237, 59, 8, 6, 1, 192, 156, 4, 237, 59, 8, 2, 1, 192, + 156, 4, 237, 59, 8, 6, 1, 250, 252, 8, 6, 1, 218, 237, 4, 128, 8, 6, 1, + 163, 64, 8, 6, 1, 163, 250, 252, 8, 2, 1, 196, 237, 4, 51, 128, 8, 6, 1, + 194, 203, 4, 128, 8, 2, 1, 194, 203, 4, 128, 8, 2, 1, 196, 237, 4, 238, + 142, 8, 6, 1, 138, 230, 124, 8, 2, 1, 138, 230, 124, 8, 2, 1, 200, 145, + 210, 77, 8, 2, 1, 234, 253, 4, 213, 108, 8, 2, 1, 163, 208, 112, 4, 200, + 147, 8, 2, 1, 185, 4, 132, 207, 82, 223, 145, 8, 1, 2, 6, 163, 71, 8, + 201, 155, 2, 1, 223, 65, 73, 1, 6, 196, 236, 8, 6, 1, 206, 159, 4, 201, + 75, 200, 147, 8, 6, 1, 192, 156, 4, 201, 75, 200, 147, 92, 6, 1, 251, 20, + 92, 2, 1, 251, 20, 92, 6, 1, 196, 36, 92, 2, 1, 196, 36, 92, 6, 1, 231, + 204, 92, 2, 1, 231, 204, 92, 6, 1, 237, 223, 92, 2, 1, 237, 223, 92, 6, + 1, 234, 149, 92, 2, 1, 234, 149, 92, 6, 1, 202, 176, 92, 2, 1, 202, 176, + 92, 6, 1, 192, 93, 92, 2, 1, 192, 93, 92, 6, 1, 230, 15, 92, 2, 1, 230, + 15, 92, 6, 1, 199, 204, 92, 2, 1, 199, 204, 92, 6, 1, 228, 55, 92, 2, 1, + 228, 55, 92, 6, 1, 222, 111, 92, 2, 1, 222, 111, 92, 6, 1, 220, 56, 92, + 2, 1, 220, 56, 92, 6, 1, 216, 175, 92, 2, 1, 216, 175, 92, 6, 1, 214, 60, + 92, 2, 1, 214, 60, 92, 6, 1, 221, 49, 92, 2, 1, 221, 49, 92, 6, 1, 74, + 92, 2, 1, 74, 92, 6, 1, 210, 51, 92, 2, 1, 210, 51, 92, 6, 1, 207, 55, + 92, 2, 1, 207, 55, 92, 6, 1, 203, 87, 92, 2, 1, 203, 87, 92, 6, 1, 200, + 100, 92, 2, 1, 200, 100, 92, 6, 1, 197, 119, 92, 2, 1, 197, 119, 92, 6, + 1, 233, 11, 92, 2, 1, 233, 11, 92, 6, 1, 221, 227, 92, 2, 1, 221, 227, + 92, 6, 1, 209, 62, 92, 2, 1, 209, 62, 92, 6, 1, 211, 188, 92, 2, 1, 211, + 188, 92, 6, 1, 237, 9, 251, 26, 92, 2, 1, 237, 9, 251, 26, 92, 6, 1, 40, + 92, 251, 57, 92, 2, 1, 40, 92, 251, 57, 92, 6, 1, 238, 165, 234, 149, 92, + 2, 1, 238, 165, 234, 149, 92, 6, 1, 237, 9, 222, 111, 92, 2, 1, 237, 9, + 222, 111, 92, 6, 1, 237, 9, 214, 60, 92, 2, 1, 237, 9, 214, 60, 92, 6, 1, + 238, 165, 214, 60, 92, 2, 1, 238, 165, 214, 60, 92, 6, 1, 40, 92, 211, + 188, 92, 2, 1, 40, 92, 211, 188, 92, 6, 1, 206, 43, 92, 2, 1, 206, 43, + 92, 6, 1, 238, 180, 204, 4, 92, 2, 1, 238, 180, 204, 4, 92, 6, 1, 40, 92, + 204, 4, 92, 2, 1, 40, 92, 204, 4, 92, 6, 1, 40, 92, 233, 255, 92, 2, 1, + 40, 92, 233, 255, 92, 6, 1, 251, 40, 221, 232, 92, 2, 1, 251, 40, 221, + 232, 92, 6, 1, 237, 9, 229, 6, 92, 2, 1, 237, 9, 229, 6, 92, 6, 1, 40, + 92, 229, 6, 92, 2, 1, 40, 92, 229, 6, 92, 6, 1, 40, 92, 144, 92, 2, 1, + 40, 92, 144, 92, 6, 1, 220, 201, 144, 92, 2, 1, 220, 201, 144, 92, 6, 1, + 40, 92, 229, 219, 92, 2, 1, 40, 92, 229, 219, 92, 6, 1, 40, 92, 230, 18, + 92, 2, 1, 40, 92, 230, 18, 92, 6, 1, 40, 92, 231, 199, 92, 2, 1, 40, 92, + 231, 199, 92, 6, 1, 40, 92, 236, 165, 92, 2, 1, 40, 92, 236, 165, 92, 6, + 1, 40, 92, 203, 226, 92, 2, 1, 40, 92, 203, 226, 92, 6, 1, 40, 212, 245, + 203, 226, 92, 2, 1, 40, 212, 245, 203, 226, 92, 6, 1, 40, 212, 245, 214, + 113, 92, 2, 1, 40, 212, 245, 214, 113, 92, 6, 1, 40, 212, 245, 212, 181, + 92, 2, 1, 40, 212, 245, 212, 181, 92, 6, 1, 40, 212, 245, 194, 126, 92, + 2, 1, 40, 212, 245, 194, 126, 92, 16, 222, 135, 92, 16, 216, 176, 207, + 55, 92, 16, 210, 52, 207, 55, 92, 16, 202, 8, 92, 16, 200, 101, 207, 55, + 92, 16, 221, 228, 207, 55, 92, 16, 203, 227, 203, 87, 92, 6, 1, 238, 165, + 204, 4, 92, 2, 1, 238, 165, 204, 4, 92, 6, 1, 238, 165, 231, 199, 92, 2, + 1, 238, 165, 231, 199, 92, 38, 214, 61, 58, 92, 38, 202, 128, 250, 45, + 92, 38, 202, 128, 219, 248, 92, 6, 1, 247, 212, 221, 232, 92, 2, 1, 247, + 212, 221, 232, 92, 40, 212, 245, 232, 71, 201, 238, 92, 40, 212, 245, + 236, 206, 208, 159, 77, 92, 40, 212, 245, 223, 170, 208, 159, 77, 92, 40, + 212, 245, 196, 107, 236, 177, 92, 232, 109, 90, 230, 78, 92, 232, 71, + 201, 238, 92, 216, 25, 236, 177, 98, 2, 1, 250, 224, 98, 2, 1, 248, 207, + 98, 2, 1, 231, 203, 98, 2, 1, 236, 123, 98, 2, 1, 234, 88, 98, 2, 1, 196, + 20, 98, 2, 1, 192, 79, 98, 2, 1, 200, 125, 98, 2, 1, 223, 190, 98, 2, 1, + 222, 121, 98, 2, 1, 220, 67, 98, 2, 1, 217, 160, 98, 2, 1, 215, 51, 98, + 2, 1, 211, 211, 98, 2, 1, 210, 247, 98, 2, 1, 192, 67, 98, 2, 1, 208, 53, + 98, 2, 1, 206, 40, 98, 2, 1, 200, 112, 98, 2, 1, 197, 77, 98, 2, 1, 210, + 86, 98, 2, 1, 221, 237, 98, 2, 1, 231, 75, 98, 2, 1, 208, 224, 98, 2, 1, + 203, 224, 98, 2, 1, 242, 201, 98, 2, 1, 246, 243, 98, 2, 1, 223, 10, 98, + 2, 1, 242, 138, 98, 2, 1, 246, 101, 98, 2, 1, 193, 207, 98, 2, 1, 223, + 25, 98, 2, 1, 230, 95, 98, 2, 1, 229, 255, 98, 2, 1, 229, 165, 98, 2, 1, + 194, 111, 98, 2, 1, 230, 28, 98, 2, 1, 229, 31, 98, 2, 1, 193, 3, 98, 2, + 1, 251, 97, 199, 110, 1, 168, 199, 110, 1, 193, 125, 199, 110, 1, 193, + 124, 199, 110, 1, 193, 114, 199, 110, 1, 193, 112, 199, 110, 1, 248, 69, + 251, 145, 193, 107, 199, 110, 1, 193, 107, 199, 110, 1, 193, 122, 199, + 110, 1, 193, 119, 199, 110, 1, 193, 121, 199, 110, 1, 193, 120, 199, 110, + 1, 193, 29, 199, 110, 1, 193, 116, 199, 110, 1, 193, 105, 199, 110, 1, + 198, 37, 193, 105, 199, 110, 1, 193, 102, 199, 110, 1, 193, 110, 199, + 110, 1, 248, 69, 251, 145, 193, 110, 199, 110, 1, 198, 37, 193, 110, 199, + 110, 1, 193, 109, 199, 110, 1, 193, 129, 199, 110, 1, 193, 103, 199, 110, + 1, 198, 37, 193, 103, 199, 110, 1, 193, 92, 199, 110, 1, 198, 37, 193, + 92, 199, 110, 1, 193, 22, 199, 110, 1, 193, 71, 199, 110, 1, 251, 70, + 193, 71, 199, 110, 1, 198, 37, 193, 71, 199, 110, 1, 193, 101, 199, 110, + 1, 193, 100, 199, 110, 1, 193, 97, 199, 110, 1, 198, 37, 193, 111, 199, + 110, 1, 198, 37, 193, 95, 199, 110, 1, 193, 93, 199, 110, 1, 192, 214, + 199, 110, 1, 193, 90, 199, 110, 1, 193, 88, 199, 110, 1, 193, 113, 199, + 110, 1, 198, 37, 193, 113, 199, 110, 1, 249, 232, 193, 113, 199, 110, 1, + 193, 87, 199, 110, 1, 193, 85, 199, 110, 1, 193, 86, 199, 110, 1, 193, + 84, 199, 110, 1, 193, 83, 199, 110, 1, 193, 123, 199, 110, 1, 193, 81, + 199, 110, 1, 193, 79, 199, 110, 1, 193, 78, 199, 110, 1, 193, 75, 199, + 110, 1, 193, 72, 199, 110, 1, 200, 91, 193, 72, 199, 110, 1, 193, 70, + 199, 110, 1, 193, 69, 199, 110, 1, 193, 1, 199, 110, 73, 1, 220, 174, 77, + 199, 110, 204, 166, 77, 199, 110, 116, 222, 228, 36, 5, 219, 106, 36, 5, + 216, 84, 36, 5, 207, 47, 36, 5, 202, 204, 36, 5, 203, 210, 36, 5, 247, + 219, 36, 5, 199, 29, 36, 5, 242, 62, 36, 5, 213, 135, 36, 5, 212, 164, + 36, 5, 231, 6, 212, 26, 36, 5, 192, 7, 36, 5, 236, 144, 36, 5, 237, 130, + 36, 5, 222, 232, 36, 5, 199, 175, 36, 5, 242, 187, 36, 5, 210, 64, 36, 5, + 209, 197, 36, 5, 231, 90, 36, 5, 231, 86, 36, 5, 231, 87, 36, 5, 231, 88, + 36, 5, 202, 92, 36, 5, 202, 46, 36, 5, 202, 59, 36, 5, 202, 91, 36, 5, + 202, 64, 36, 5, 202, 65, 36, 5, 202, 51, 36, 5, 246, 181, 36, 5, 246, + 160, 36, 5, 246, 162, 36, 5, 246, 180, 36, 5, 246, 178, 36, 5, 246, 179, + 36, 5, 246, 161, 36, 5, 191, 225, 36, 5, 191, 203, 36, 5, 191, 216, 36, + 5, 191, 224, 36, 5, 191, 219, 36, 5, 191, 220, 36, 5, 191, 208, 36, 5, + 246, 176, 36, 5, 246, 163, 36, 5, 246, 165, 36, 5, 246, 175, 36, 5, 246, + 173, 36, 5, 246, 174, 36, 5, 246, 164, 36, 5, 208, 124, 36, 5, 208, 114, + 36, 5, 208, 120, 36, 5, 208, 123, 36, 5, 208, 121, 36, 5, 208, 122, 36, + 5, 208, 119, 36, 5, 220, 212, 36, 5, 220, 204, 36, 5, 220, 207, 36, 5, + 220, 211, 36, 5, 220, 208, 36, 5, 220, 209, 36, 5, 220, 205, 36, 5, 193, + 164, 36, 5, 193, 151, 36, 5, 193, 159, 36, 5, 193, 163, 36, 5, 193, 161, + 36, 5, 193, 162, 36, 5, 193, 158, 36, 5, 230, 136, 36, 5, 230, 126, 36, + 5, 230, 129, 36, 5, 230, 135, 36, 5, 230, 131, 36, 5, 230, 132, 36, 5, + 230, 128, 38, 42, 1, 248, 123, 38, 42, 1, 196, 123, 38, 42, 1, 231, 70, + 38, 42, 1, 237, 116, 38, 42, 1, 192, 62, 38, 42, 1, 192, 85, 38, 42, 1, + 160, 38, 42, 1, 234, 124, 38, 42, 1, 234, 99, 38, 42, 1, 234, 88, 38, 42, + 1, 74, 38, 42, 1, 210, 181, 38, 42, 1, 234, 21, 38, 42, 1, 234, 9, 38, + 42, 1, 200, 79, 38, 42, 1, 144, 38, 42, 1, 198, 112, 38, 42, 1, 242, 245, + 38, 42, 1, 204, 64, 38, 42, 1, 204, 15, 38, 42, 1, 232, 216, 38, 42, 1, + 234, 5, 38, 42, 1, 64, 38, 42, 1, 223, 251, 38, 42, 1, 236, 163, 38, 42, + 1, 216, 43, 197, 92, 38, 42, 1, 193, 84, 38, 42, 1, 192, 214, 38, 42, 1, + 223, 109, 64, 38, 42, 1, 219, 147, 192, 179, 38, 42, 1, 248, 28, 192, + 179, 38, 42, 1, 223, 109, 248, 28, 192, 179, 51, 250, 208, 201, 150, 217, + 122, 51, 250, 208, 235, 111, 201, 150, 217, 122, 46, 201, 150, 186, 51, + 201, 150, 186, 46, 235, 111, 201, 150, 186, 51, 235, 111, 201, 150, 186, + 208, 39, 223, 132, 217, 122, 208, 39, 235, 111, 223, 132, 217, 122, 235, + 111, 198, 205, 217, 122, 46, 198, 205, 186, 51, 198, 205, 186, 208, 39, + 202, 106, 46, 208, 39, 211, 213, 186, 51, 208, 39, 211, 213, 186, 234, + 172, 238, 220, 210, 242, 232, 138, 210, 242, 207, 168, 232, 138, 210, + 242, 228, 108, 235, 111, 212, 21, 235, 92, 250, 218, 197, 30, 250, 218, + 235, 111, 207, 96, 250, 207, 55, 212, 18, 228, 111, 223, 121, 223, 130, + 211, 41, 247, 160, 228, 112, 4, 237, 14, 199, 91, 4, 207, 82, 58, 46, + 132, 210, 233, 186, 51, 132, 210, 233, 186, 199, 91, 4, 78, 58, 199, 91, + 4, 78, 63, 46, 84, 248, 194, 4, 208, 153, 51, 84, 248, 194, 4, 208, 153, + 198, 249, 46, 138, 186, 198, 249, 51, 138, 186, 247, 188, 46, 138, 186, + 247, 188, 51, 138, 186, 46, 203, 109, 124, 186, 51, 203, 109, 124, 186, + 46, 55, 210, 230, 51, 55, 210, 230, 103, 236, 112, 136, 90, 78, 209, 37, + 90, 78, 136, 103, 236, 112, 209, 37, 108, 232, 119, 78, 209, 37, 232, + 214, 78, 77, 207, 168, 208, 159, 77, 84, 199, 90, 207, 82, 209, 191, 194, + 11, 204, 166, 85, 236, 114, 163, 242, 38, 208, 39, 236, 114, 208, 39, + 242, 38, 163, 204, 180, 237, 239, 4, 46, 230, 180, 237, 239, 4, 51, 230, + 180, 163, 237, 238, 198, 249, 138, 205, 209, 57, 197, 221, 237, 185, 199, + 158, 237, 185, 201, 254, 232, 71, 201, 238, 84, 203, 41, 236, 111, 194, + 58, 84, 219, 175, 246, 224, 55, 228, 111, 207, 168, 242, 38, 55, 219, 48, + 208, 142, 77, 237, 186, 4, 46, 197, 33, 55, 201, 89, 77, 223, 121, 132, + 222, 69, 223, 121, 132, 222, 70, 4, 222, 70, 58, 132, 222, 69, 132, 222, + 70, 4, 236, 114, 55, 202, 31, 242, 38, 235, 111, 202, 189, 198, 170, 237, + 238, 217, 32, 242, 38, 210, 241, 77, 209, 36, 234, 113, 77, 238, 221, + 196, 107, 236, 177, 238, 184, 210, 199, 4, 51, 238, 182, 238, 184, 210, + 199, 4, 46, 238, 182, 199, 66, 3, 6, 233, 242, 12, 48, 207, 198, 12, 48, + 242, 95, 12, 48, 205, 212, 101, 12, 48, 205, 212, 104, 12, 48, 205, 212, + 133, 12, 48, 210, 116, 12, 48, 247, 173, 12, 48, 200, 164, 12, 48, 221, + 125, 101, 12, 48, 221, 125, 104, 12, 48, 236, 174, 12, 48, 205, 216, 12, + 48, 2, 101, 12, 48, 2, 104, 12, 48, 220, 89, 101, 12, 48, 220, 89, 104, + 12, 48, 220, 89, 133, 12, 48, 220, 89, 134, 12, 48, 202, 224, 12, 48, + 199, 162, 12, 48, 202, 221, 101, 12, 48, 202, 221, 104, 12, 48, 229, 234, + 101, 12, 48, 229, 234, 104, 12, 48, 230, 62, 12, 48, 208, 28, 12, 48, + 242, 184, 12, 48, 201, 123, 12, 48, 216, 29, 12, 48, 237, 113, 12, 48, + 216, 18, 12, 48, 242, 113, 12, 48, 194, 130, 101, 12, 48, 194, 130, 104, + 12, 48, 232, 231, 12, 48, 210, 194, 101, 12, 48, 210, 194, 104, 12, 48, + 203, 82, 138, 198, 196, 198, 123, 12, 48, 238, 205, 12, 48, 236, 134, 12, + 48, 223, 57, 12, 48, 247, 211, 80, 242, 78, 12, 48, 233, 181, 12, 48, + 202, 130, 101, 12, 48, 202, 130, 104, 12, 48, 248, 209, 12, 48, 203, 89, + 12, 48, 247, 49, 203, 89, 12, 48, 214, 183, 101, 12, 48, 214, 183, 104, + 12, 48, 214, 183, 133, 12, 48, 214, 183, 134, 12, 48, 216, 247, 12, 48, + 204, 6, 12, 48, 208, 34, 12, 48, 233, 211, 12, 48, 211, 225, 12, 48, 247, + 132, 101, 12, 48, 247, 132, 104, 12, 48, 217, 40, 12, 48, 216, 24, 12, + 48, 230, 214, 101, 12, 48, 230, 214, 104, 12, 48, 230, 214, 133, 12, 48, + 199, 108, 12, 48, 242, 77, 12, 48, 194, 91, 101, 12, 48, 194, 91, 104, + 12, 48, 247, 49, 205, 205, 12, 48, 203, 82, 228, 208, 12, 48, 228, 208, + 12, 48, 247, 49, 202, 143, 12, 48, 247, 49, 204, 1, 12, 48, 232, 149, 12, + 48, 247, 49, 246, 200, 12, 48, 203, 82, 194, 153, 12, 48, 194, 154, 101, + 12, 48, 194, 154, 104, 12, 48, 242, 116, 12, 48, 247, 49, 230, 245, 12, + 48, 184, 101, 12, 48, 184, 104, 12, 48, 247, 49, 219, 84, 12, 48, 247, + 49, 231, 184, 12, 48, 216, 13, 101, 12, 48, 216, 13, 104, 12, 48, 208, + 41, 12, 48, 247, 223, 12, 48, 247, 49, 200, 118, 220, 34, 12, 48, 247, + 49, 220, 37, 12, 48, 247, 49, 194, 52, 12, 48, 247, 49, 232, 168, 12, 48, + 234, 183, 101, 12, 48, 234, 183, 104, 12, 48, 234, 183, 133, 12, 48, 247, + 49, 234, 182, 12, 48, 229, 245, 12, 48, 247, 49, 228, 204, 12, 48, 247, + 207, 12, 48, 231, 54, 12, 48, 247, 49, 232, 224, 12, 48, 247, 49, 248, + 13, 12, 48, 247, 49, 206, 55, 12, 48, 203, 82, 194, 81, 12, 48, 203, 82, + 193, 61, 12, 48, 247, 49, 232, 90, 12, 48, 223, 64, 233, 216, 12, 48, + 247, 49, 233, 216, 12, 48, 223, 64, 198, 251, 12, 48, 247, 49, 198, 251, + 12, 48, 223, 64, 235, 84, 12, 48, 247, 49, 235, 84, 12, 48, 198, 6, 12, + 48, 223, 64, 198, 6, 12, 48, 247, 49, 198, 6, 81, 48, 101, 81, 48, 219, + 175, 81, 48, 236, 114, 81, 48, 203, 4, 81, 48, 205, 211, 81, 48, 128, 81, + 48, 104, 81, 48, 219, 204, 81, 48, 217, 160, 81, 48, 220, 13, 81, 48, + 234, 62, 81, 48, 174, 81, 48, 142, 247, 173, 81, 48, 238, 208, 81, 48, + 228, 49, 81, 48, 200, 164, 81, 48, 211, 184, 247, 173, 81, 48, 221, 124, + 81, 48, 209, 138, 81, 48, 194, 0, 81, 48, 202, 119, 81, 48, 51, 211, 184, + 247, 173, 81, 48, 229, 166, 234, 83, 81, 48, 200, 30, 81, 48, 236, 174, + 81, 48, 205, 216, 81, 48, 242, 95, 81, 48, 209, 88, 81, 48, 251, 79, 81, + 48, 216, 4, 81, 48, 234, 83, 81, 48, 234, 189, 81, 48, 205, 245, 81, 48, + 230, 254, 81, 48, 230, 255, 202, 238, 81, 48, 233, 215, 81, 48, 248, 27, + 81, 48, 194, 23, 81, 48, 242, 206, 81, 48, 207, 27, 81, 48, 223, 186, 81, + 48, 202, 236, 81, 48, 220, 88, 81, 48, 238, 218, 81, 48, 202, 110, 81, + 48, 216, 9, 81, 48, 207, 69, 81, 48, 194, 8, 81, 48, 211, 202, 81, 48, + 198, 14, 81, 48, 235, 64, 81, 48, 203, 195, 199, 162, 81, 48, 235, 111, + 242, 95, 81, 48, 184, 201, 214, 81, 48, 103, 230, 37, 81, 48, 203, 201, + 81, 48, 247, 180, 81, 48, 202, 220, 81, 48, 247, 139, 81, 48, 201, 253, + 81, 48, 229, 233, 81, 48, 230, 79, 81, 48, 236, 118, 81, 48, 230, 62, 81, + 48, 247, 160, 81, 48, 208, 28, 81, 48, 205, 229, 81, 48, 236, 208, 81, + 48, 249, 237, 81, 48, 202, 106, 81, 48, 213, 110, 81, 48, 201, 123, 81, + 48, 206, 1, 81, 48, 216, 29, 81, 48, 198, 195, 81, 48, 220, 170, 81, 48, + 201, 238, 81, 48, 237, 113, 81, 48, 194, 106, 81, 48, 236, 147, 213, 110, + 81, 48, 242, 34, 81, 48, 232, 64, 81, 48, 242, 107, 81, 48, 202, 3, 81, + 48, 194, 129, 81, 48, 232, 231, 81, 48, 242, 103, 81, 48, 233, 54, 81, + 48, 55, 193, 223, 81, 48, 138, 198, 196, 198, 123, 81, 48, 202, 251, 81, + 48, 233, 66, 81, 48, 238, 205, 81, 48, 236, 134, 81, 48, 209, 84, 81, 48, + 223, 57, 81, 48, 217, 14, 81, 48, 199, 89, 81, 48, 201, 70, 81, 48, 219, + 198, 81, 48, 197, 8, 81, 48, 233, 9, 81, 48, 247, 211, 80, 242, 78, 81, + 48, 203, 115, 81, 48, 235, 111, 200, 22, 81, 48, 194, 75, 81, 48, 203, + 13, 81, 48, 236, 194, 81, 48, 233, 181, 81, 48, 202, 146, 81, 48, 54, 81, + 48, 201, 240, 81, 48, 202, 129, 81, 48, 198, 222, 81, 48, 230, 223, 81, + 48, 246, 186, 81, 48, 202, 24, 81, 48, 248, 209, 81, 48, 207, 139, 81, + 48, 203, 89, 81, 48, 223, 49, 81, 48, 214, 182, 81, 48, 204, 6, 81, 48, + 233, 42, 81, 48, 211, 225, 81, 48, 250, 217, 81, 48, 209, 214, 81, 48, + 234, 193, 81, 48, 247, 131, 81, 48, 217, 40, 81, 48, 216, 114, 81, 48, + 204, 187, 81, 48, 250, 81, 81, 48, 216, 24, 81, 48, 199, 0, 81, 48, 211, + 171, 81, 48, 247, 215, 81, 48, 201, 236, 81, 48, 242, 46, 81, 48, 230, + 213, 81, 48, 199, 108, 81, 48, 223, 149, 81, 48, 247, 229, 81, 48, 194, + 154, 234, 83, 81, 48, 242, 77, 81, 48, 194, 90, 81, 48, 205, 205, 81, 48, + 228, 208, 81, 48, 202, 143, 81, 48, 196, 149, 81, 48, 248, 118, 81, 48, + 210, 14, 81, 48, 248, 239, 81, 48, 204, 1, 81, 48, 207, 236, 81, 48, 206, + 195, 81, 48, 232, 149, 81, 48, 247, 213, 81, 48, 246, 200, 81, 48, 247, + 253, 81, 48, 216, 26, 81, 48, 194, 153, 81, 48, 242, 116, 81, 48, 194, + 48, 81, 48, 236, 186, 81, 48, 196, 21, 81, 48, 230, 245, 81, 48, 219, 84, + 81, 48, 231, 184, 81, 48, 216, 12, 81, 48, 203, 3, 81, 48, 203, 195, 200, + 146, 248, 13, 81, 48, 208, 41, 81, 48, 247, 223, 81, 48, 193, 246, 81, + 48, 233, 91, 81, 48, 220, 34, 81, 48, 200, 118, 220, 34, 81, 48, 220, 30, + 81, 48, 202, 173, 81, 48, 220, 37, 81, 48, 194, 52, 81, 48, 232, 168, 81, + 48, 234, 182, 81, 48, 229, 245, 81, 48, 232, 107, 81, 48, 228, 204, 81, + 48, 247, 207, 81, 48, 200, 131, 81, 48, 230, 86, 81, 48, 233, 2, 81, 48, + 206, 88, 194, 48, 81, 48, 246, 188, 81, 48, 231, 54, 81, 48, 232, 224, + 81, 48, 248, 13, 81, 48, 206, 55, 81, 48, 237, 98, 81, 48, 194, 81, 81, + 48, 229, 209, 81, 48, 193, 61, 81, 48, 216, 125, 81, 48, 247, 248, 81, + 48, 234, 95, 81, 48, 232, 90, 81, 48, 198, 167, 81, 48, 235, 67, 81, 48, + 208, 22, 81, 48, 213, 112, 81, 48, 233, 216, 81, 48, 198, 251, 81, 48, + 235, 84, 81, 48, 198, 6, 81, 48, 232, 171, 149, 237, 57, 246, 100, 46, + 115, 207, 101, 149, 237, 57, 246, 100, 95, 115, 63, 149, 237, 57, 246, + 100, 46, 115, 85, 26, 207, 101, 149, 237, 57, 246, 100, 95, 115, 85, 26, + 63, 149, 237, 57, 246, 100, 232, 71, 201, 93, 149, 237, 57, 246, 100, + 201, 94, 232, 89, 58, 149, 237, 57, 246, 100, 201, 94, 232, 89, 63, 149, + 237, 57, 246, 100, 201, 94, 232, 89, 220, 28, 149, 237, 57, 246, 100, + 201, 94, 232, 89, 113, 220, 28, 149, 237, 57, 246, 100, 201, 94, 232, 89, + 113, 207, 101, 149, 237, 57, 246, 100, 201, 94, 232, 89, 106, 220, 28, + 149, 237, 57, 246, 100, 211, 114, 149, 202, 160, 149, 242, 38, 149, 232, + 71, 201, 238, 236, 183, 77, 223, 50, 223, 169, 202, 23, 109, 149, 223, + 80, 77, 149, 242, 80, 77, 149, 31, 192, 76, 46, 250, 208, 186, 51, 250, + 208, 186, 46, 55, 250, 208, 186, 51, 55, 250, 208, 186, 46, 238, 224, + 186, 51, 238, 224, 186, 46, 62, 238, 224, 186, 51, 62, 238, 224, 186, 46, + 60, 219, 247, 186, 51, 60, 219, 247, 186, 209, 153, 77, 231, 123, 77, 46, + 198, 237, 204, 2, 186, 51, 198, 237, 204, 2, 186, 46, 62, 219, 247, 186, + 51, 62, 219, 247, 186, 46, 62, 198, 237, 204, 2, 186, 51, 62, 198, 237, + 204, 2, 186, 46, 62, 50, 186, 51, 62, 50, 186, 194, 125, 237, 185, 207, + 168, 55, 209, 100, 208, 142, 77, 55, 209, 100, 208, 142, 77, 132, 55, + 209, 100, 208, 142, 77, 209, 153, 122, 233, 91, 230, 34, 212, 234, 101, + 230, 34, 212, 234, 104, 230, 34, 212, 234, 133, 230, 34, 212, 234, 134, + 230, 34, 212, 234, 151, 230, 34, 212, 234, 170, 230, 34, 212, 234, 179, + 230, 34, 212, 234, 174, 230, 34, 212, 234, 182, 149, 219, 228, 158, 77, + 149, 207, 73, 158, 77, 149, 237, 66, 158, 77, 149, 234, 61, 158, 77, 30, + 203, 74, 78, 158, 77, 30, 55, 78, 158, 77, 194, 121, 237, 185, 84, 222, + 120, 207, 199, 77, 84, 222, 120, 207, 199, 4, 195, 248, 202, 174, 77, 84, + 222, 120, 207, 199, 122, 113, 230, 78, 84, 222, 120, 207, 199, 4, 195, + 248, 202, 174, 122, 113, 230, 78, 84, 222, 120, 207, 199, 122, 106, 230, + 78, 47, 209, 153, 77, 149, 200, 44, 219, 176, 233, 39, 204, 166, 109, + 230, 34, 212, 234, 200, 30, 230, 34, 212, 234, 197, 239, 230, 34, 212, + 234, 199, 184, 84, 149, 223, 80, 77, 217, 102, 77, 210, 224, 250, 245, + 77, 149, 65, 223, 172, 149, 138, 232, 250, 202, 160, 229, 140, 1, 2, 64, + 229, 140, 1, 64, 229, 140, 1, 2, 70, 229, 140, 1, 70, 229, 140, 1, 2, 68, + 229, 140, 1, 68, 229, 140, 1, 2, 71, 229, 140, 1, 71, 229, 140, 1, 2, 74, + 229, 140, 1, 74, 229, 140, 1, 160, 229, 140, 1, 231, 233, 229, 140, 1, + 221, 204, 229, 140, 1, 231, 46, 229, 140, 1, 221, 33, 229, 140, 1, 230, + 186, 229, 140, 1, 222, 57, 229, 140, 1, 231, 158, 229, 140, 1, 221, 113, + 229, 140, 1, 230, 254, 229, 140, 1, 188, 229, 140, 1, 192, 112, 229, 140, + 1, 203, 125, 229, 140, 1, 192, 30, 229, 140, 1, 201, 184, 229, 140, 1, + 191, 252, 229, 140, 1, 205, 223, 229, 140, 1, 192, 85, 229, 140, 1, 202, + 212, 229, 140, 1, 192, 8, 229, 140, 1, 189, 229, 140, 1, 238, 0, 229, + 140, 1, 199, 128, 229, 140, 1, 237, 16, 229, 140, 1, 2, 198, 45, 229, + 140, 1, 198, 45, 229, 140, 1, 235, 62, 229, 140, 1, 200, 79, 229, 140, 1, + 237, 116, 229, 140, 1, 155, 229, 140, 1, 236, 146, 229, 140, 1, 181, 229, + 140, 1, 214, 60, 229, 140, 1, 213, 22, 229, 140, 1, 214, 214, 229, 140, + 1, 213, 142, 229, 140, 1, 144, 229, 140, 1, 249, 3, 229, 140, 1, 166, + 229, 140, 1, 229, 178, 229, 140, 1, 248, 41, 229, 140, 1, 210, 51, 229, + 140, 1, 228, 181, 229, 140, 1, 247, 124, 229, 140, 1, 209, 51, 229, 140, + 1, 229, 255, 229, 140, 1, 248, 123, 229, 140, 1, 210, 181, 229, 140, 1, + 229, 43, 229, 140, 1, 247, 220, 229, 140, 1, 209, 198, 229, 140, 1, 172, + 229, 140, 1, 216, 175, 229, 140, 1, 215, 241, 229, 140, 1, 217, 48, 229, + 140, 1, 216, 91, 229, 140, 1, 2, 168, 229, 140, 1, 168, 229, 140, 1, 2, + 192, 214, 229, 140, 1, 192, 214, 229, 140, 1, 2, 193, 1, 229, 140, 1, + 193, 1, 229, 140, 1, 167, 229, 140, 1, 207, 151, 229, 140, 1, 206, 218, + 229, 140, 1, 208, 7, 229, 140, 1, 207, 55, 229, 140, 1, 2, 194, 169, 229, + 140, 1, 194, 169, 229, 140, 1, 194, 72, 229, 140, 1, 194, 111, 229, 140, + 1, 194, 36, 229, 140, 1, 215, 151, 229, 140, 1, 194, 223, 229, 140, 1, 2, + 160, 229, 140, 1, 2, 222, 57, 38, 222, 82, 195, 248, 202, 174, 77, 38, + 222, 82, 204, 185, 202, 174, 77, 222, 82, 195, 248, 202, 174, 77, 222, + 82, 204, 185, 202, 174, 77, 229, 140, 223, 80, 77, 229, 140, 195, 248, + 223, 80, 77, 229, 140, 236, 231, 192, 231, 222, 82, 55, 228, 111, 75, 1, + 2, 64, 75, 1, 64, 75, 1, 2, 70, 75, 1, 70, 75, 1, 2, 68, 75, 1, 68, 75, + 1, 2, 71, 75, 1, 71, 75, 1, 2, 74, 75, 1, 74, 75, 1, 160, 75, 1, 231, + 233, 75, 1, 221, 204, 75, 1, 231, 46, 75, 1, 221, 33, 75, 1, 230, 186, + 75, 1, 222, 57, 75, 1, 231, 158, 75, 1, 221, 113, 75, 1, 230, 254, 75, 1, + 188, 75, 1, 192, 112, 75, 1, 203, 125, 75, 1, 192, 30, 75, 1, 201, 184, + 75, 1, 191, 252, 75, 1, 205, 223, 75, 1, 192, 85, 75, 1, 202, 212, 75, 1, + 192, 8, 75, 1, 189, 75, 1, 238, 0, 75, 1, 199, 128, 75, 1, 237, 16, 75, + 1, 2, 198, 45, 75, 1, 198, 45, 75, 1, 235, 62, 75, 1, 200, 79, 75, 1, + 237, 116, 75, 1, 155, 75, 1, 236, 146, 75, 1, 181, 75, 1, 214, 60, 75, 1, + 213, 22, 75, 1, 214, 214, 75, 1, 213, 142, 75, 1, 144, 75, 1, 249, 3, 75, + 1, 166, 75, 1, 229, 178, 75, 1, 248, 41, 75, 1, 210, 51, 75, 1, 228, 181, + 75, 1, 247, 124, 75, 1, 209, 51, 75, 1, 229, 255, 75, 1, 248, 123, 75, 1, + 210, 181, 75, 1, 229, 43, 75, 1, 247, 220, 75, 1, 209, 198, 75, 1, 172, + 75, 1, 216, 175, 75, 1, 215, 241, 75, 1, 217, 48, 75, 1, 216, 91, 75, 1, + 2, 168, 75, 1, 168, 75, 1, 2, 192, 214, 75, 1, 192, 214, 75, 1, 2, 193, + 1, 75, 1, 193, 1, 75, 1, 167, 75, 1, 207, 151, 75, 1, 206, 218, 75, 1, + 208, 7, 75, 1, 207, 55, 75, 1, 2, 194, 169, 75, 1, 194, 169, 75, 1, 194, + 72, 75, 1, 194, 111, 75, 1, 194, 36, 75, 1, 215, 151, 75, 1, 194, 223, + 75, 1, 2, 160, 75, 1, 2, 222, 57, 75, 1, 196, 157, 75, 1, 196, 39, 75, 1, + 196, 123, 75, 1, 195, 252, 75, 85, 236, 114, 222, 82, 209, 76, 202, 174, + 77, 75, 223, 80, 77, 75, 195, 248, 223, 80, 77, 75, 236, 231, 221, 75, + 247, 197, 1, 249, 226, 247, 197, 1, 211, 93, 247, 197, 1, 218, 236, 247, + 197, 1, 233, 163, 247, 197, 1, 238, 95, 247, 197, 1, 200, 228, 247, 197, + 1, 215, 151, 247, 197, 1, 165, 247, 197, 1, 232, 44, 247, 197, 1, 222, + 184, 247, 197, 1, 230, 124, 247, 197, 1, 223, 65, 247, 197, 1, 208, 247, + 247, 197, 1, 193, 223, 247, 197, 1, 192, 72, 247, 197, 1, 246, 119, 247, + 197, 1, 204, 66, 247, 197, 1, 150, 247, 197, 1, 192, 155, 247, 197, 1, + 247, 52, 247, 197, 1, 206, 158, 247, 197, 1, 64, 247, 197, 1, 74, 247, + 197, 1, 71, 247, 197, 1, 234, 157, 247, 197, 1, 251, 63, 247, 197, 1, + 234, 150, 247, 197, 1, 250, 8, 247, 197, 1, 211, 130, 247, 197, 1, 250, + 224, 247, 197, 1, 234, 88, 247, 197, 1, 250, 214, 247, 197, 1, 234, 73, + 247, 197, 1, 234, 21, 247, 197, 1, 70, 247, 197, 1, 68, 247, 197, 1, 223, + 78, 247, 197, 1, 196, 236, 247, 197, 1, 214, 167, 247, 197, 1, 231, 2, + 247, 197, 1, 223, 225, 247, 197, 1, 185, 4, 78, 58, 247, 197, 1, 213, + 179, 30, 1, 221, 151, 30, 1, 202, 84, 30, 1, 221, 144, 30, 1, 214, 45, + 30, 1, 214, 43, 30, 1, 214, 42, 30, 1, 199, 103, 30, 1, 202, 73, 30, 1, + 207, 133, 30, 1, 207, 128, 30, 1, 207, 125, 30, 1, 207, 118, 30, 1, 207, + 113, 30, 1, 207, 108, 30, 1, 207, 119, 30, 1, 207, 131, 30, 1, 216, 153, + 30, 1, 210, 36, 30, 1, 202, 81, 30, 1, 210, 25, 30, 1, 203, 64, 30, 1, + 202, 78, 30, 1, 223, 247, 30, 1, 242, 144, 30, 1, 202, 88, 30, 1, 242, + 211, 30, 1, 221, 225, 30, 1, 199, 198, 30, 1, 210, 75, 30, 1, 229, 162, + 30, 1, 64, 30, 1, 251, 108, 30, 1, 168, 30, 1, 193, 118, 30, 1, 234, 50, + 30, 1, 71, 30, 1, 193, 56, 30, 1, 193, 69, 30, 1, 74, 30, 1, 194, 169, + 30, 1, 194, 160, 30, 1, 212, 0, 30, 1, 193, 1, 30, 1, 68, 30, 1, 194, 93, + 30, 1, 194, 111, 30, 1, 194, 72, 30, 1, 192, 214, 30, 1, 233, 230, 30, 1, + 193, 22, 30, 1, 70, 30, 232, 247, 30, 1, 202, 82, 30, 1, 214, 35, 30, 1, + 214, 37, 30, 1, 214, 40, 30, 1, 207, 126, 30, 1, 207, 107, 30, 1, 207, + 115, 30, 1, 207, 120, 30, 1, 207, 105, 30, 1, 216, 146, 30, 1, 216, 143, + 30, 1, 216, 147, 30, 1, 222, 105, 30, 1, 210, 31, 30, 1, 210, 17, 30, 1, + 210, 23, 30, 1, 210, 20, 30, 1, 210, 34, 30, 1, 210, 18, 30, 1, 222, 103, + 30, 1, 222, 101, 30, 1, 203, 57, 30, 1, 203, 55, 30, 1, 203, 47, 30, 1, + 203, 52, 30, 1, 203, 62, 30, 1, 211, 8, 30, 1, 202, 85, 30, 1, 193, 46, + 30, 1, 193, 40, 30, 1, 193, 41, 30, 1, 222, 104, 30, 1, 202, 86, 30, 1, + 193, 52, 30, 1, 192, 245, 30, 1, 192, 244, 30, 1, 192, 247, 30, 1, 192, + 201, 30, 1, 192, 202, 30, 1, 192, 205, 30, 1, 250, 123, 30, 1, 250, 117, + 149, 250, 193, 219, 164, 77, 149, 250, 193, 207, 169, 77, 149, 250, 193, + 90, 77, 149, 250, 193, 103, 77, 149, 250, 193, 112, 77, 149, 250, 193, + 232, 119, 77, 149, 250, 193, 198, 249, 77, 149, 250, 193, 85, 77, 149, + 250, 193, 247, 188, 77, 149, 250, 193, 232, 226, 77, 149, 250, 193, 205, + 212, 77, 149, 250, 193, 199, 192, 77, 149, 250, 193, 232, 112, 77, 149, + 250, 193, 229, 230, 77, 149, 250, 193, 234, 190, 77, 149, 250, 193, 217, + 161, 77, 247, 197, 1, 247, 124, 247, 197, 1, 192, 30, 247, 197, 1, 223, + 20, 247, 197, 1, 230, 186, 247, 197, 1, 234, 171, 247, 197, 1, 234, 70, + 247, 197, 1, 211, 194, 247, 197, 1, 211, 198, 247, 197, 1, 223, 105, 247, + 197, 1, 250, 195, 247, 197, 1, 223, 156, 247, 197, 1, 197, 47, 247, 197, + 1, 223, 207, 247, 197, 1, 214, 145, 247, 197, 1, 251, 56, 247, 197, 1, + 250, 3, 247, 197, 1, 250, 241, 247, 197, 1, 211, 219, 247, 197, 1, 211, + 201, 247, 197, 1, 223, 153, 247, 197, 52, 1, 211, 93, 247, 197, 52, 1, + 200, 228, 247, 197, 52, 1, 222, 184, 247, 197, 52, 1, 230, 124, 247, 197, + 1, 231, 85, 247, 197, 1, 219, 223, 247, 197, 1, 191, 232, 247, 197, 52, + 1, 232, 44, 247, 197, 1, 230, 144, 247, 197, 1, 220, 239, 247, 197, 1, + 212, 0, 247, 197, 1, 251, 72, 12, 201, 208, 200, 228, 12, 201, 208, 194, + 84, 12, 201, 208, 193, 198, 12, 201, 208, 247, 65, 12, 201, 208, 201, 80, + 12, 201, 208, 228, 101, 12, 201, 208, 228, 105, 12, 201, 208, 228, 190, + 12, 201, 208, 228, 102, 12, 201, 208, 200, 231, 12, 201, 208, 228, 104, + 12, 201, 208, 228, 100, 12, 201, 208, 228, 188, 12, 201, 208, 228, 103, + 12, 201, 208, 228, 99, 12, 201, 208, 215, 151, 12, 201, 208, 230, 124, + 12, 201, 208, 206, 158, 12, 201, 208, 211, 93, 12, 201, 208, 202, 163, + 12, 201, 208, 238, 95, 12, 201, 208, 228, 106, 12, 201, 208, 229, 188, + 12, 201, 208, 200, 240, 12, 201, 208, 201, 57, 12, 201, 208, 202, 35, 12, + 201, 208, 204, 72, 12, 201, 208, 210, 185, 12, 201, 208, 208, 249, 12, + 201, 208, 199, 37, 12, 201, 208, 200, 230, 12, 201, 208, 201, 69, 12, + 201, 208, 228, 116, 12, 201, 208, 228, 98, 12, 201, 208, 210, 96, 12, + 201, 208, 208, 247, 75, 1, 2, 221, 33, 75, 1, 2, 203, 125, 75, 1, 2, 201, + 184, 75, 1, 2, 155, 75, 1, 2, 213, 22, 75, 1, 2, 144, 75, 1, 2, 229, 178, + 75, 1, 2, 228, 181, 75, 1, 2, 229, 255, 75, 1, 2, 229, 43, 75, 1, 2, 215, + 241, 75, 1, 2, 167, 75, 1, 2, 207, 151, 75, 1, 2, 206, 218, 75, 1, 2, + 208, 7, 75, 1, 2, 207, 55, 125, 30, 221, 151, 125, 30, 214, 45, 125, 30, + 199, 103, 125, 30, 207, 133, 125, 30, 216, 153, 125, 30, 210, 36, 125, + 30, 203, 64, 125, 30, 223, 247, 125, 30, 242, 144, 125, 30, 242, 211, + 125, 30, 221, 225, 125, 30, 199, 198, 125, 30, 210, 75, 125, 30, 229, + 162, 125, 30, 221, 152, 64, 125, 30, 214, 46, 64, 125, 30, 199, 104, 64, + 125, 30, 207, 134, 64, 125, 30, 216, 154, 64, 125, 30, 210, 37, 64, 125, + 30, 203, 65, 64, 125, 30, 223, 248, 64, 125, 30, 242, 145, 64, 125, 30, + 242, 212, 64, 125, 30, 221, 226, 64, 125, 30, 199, 199, 64, 125, 30, 210, + 76, 64, 125, 30, 229, 163, 64, 125, 30, 242, 145, 68, 125, 221, 79, 246, + 100, 211, 234, 125, 221, 79, 246, 100, 185, 228, 181, 125, 228, 39, 101, + 125, 228, 39, 104, 125, 228, 39, 133, 125, 228, 39, 134, 125, 228, 39, + 151, 125, 228, 39, 170, 125, 228, 39, 179, 125, 228, 39, 174, 125, 228, + 39, 182, 125, 228, 39, 200, 30, 125, 228, 39, 216, 29, 125, 228, 39, 232, + 231, 125, 228, 39, 194, 129, 125, 228, 39, 194, 16, 125, 228, 39, 216, + 240, 125, 228, 39, 234, 189, 125, 228, 39, 201, 123, 125, 228, 39, 201, + 241, 125, 228, 39, 230, 9, 125, 228, 39, 202, 201, 125, 228, 39, 215, 62, + 125, 228, 39, 202, 145, 125, 228, 39, 232, 242, 125, 228, 39, 239, 14, + 125, 228, 39, 220, 173, 125, 228, 39, 207, 192, 125, 228, 39, 246, 253, + 125, 228, 39, 201, 190, 125, 228, 39, 201, 103, 125, 228, 39, 234, 60, + 125, 228, 39, 207, 182, 125, 228, 39, 251, 4, 125, 228, 39, 233, 19, 125, + 228, 39, 207, 180, 125, 228, 39, 204, 187, 125, 228, 39, 208, 2, 47, 228, + 39, 208, 158, 47, 228, 39, 221, 178, 47, 228, 39, 205, 243, 47, 228, 39, + 221, 75, 47, 31, 200, 31, 211, 212, 60, 202, 106, 47, 31, 197, 240, 211, + 212, 60, 202, 106, 47, 31, 199, 185, 211, 212, 60, 202, 106, 47, 31, 232, + 127, 211, 212, 60, 202, 106, 47, 31, 233, 4, 211, 212, 60, 202, 106, 47, + 31, 203, 26, 211, 212, 60, 202, 106, 47, 31, 204, 141, 211, 212, 60, 202, + 106, 47, 31, 234, 138, 211, 212, 60, 202, 106, 210, 220, 57, 47, 31, 197, + 240, 101, 47, 31, 197, 240, 104, 47, 31, 197, 240, 133, 47, 31, 197, 240, + 134, 47, 31, 197, 240, 151, 47, 31, 197, 240, 170, 47, 31, 197, 240, 179, + 47, 31, 197, 240, 174, 47, 31, 197, 240, 182, 47, 31, 199, 184, 47, 31, + 199, 185, 101, 47, 31, 199, 185, 104, 47, 31, 199, 185, 133, 47, 31, 199, + 185, 134, 47, 31, 199, 185, 151, 47, 30, 221, 151, 47, 30, 214, 45, 47, + 30, 199, 103, 47, 30, 207, 133, 47, 30, 216, 153, 47, 30, 210, 36, 47, + 30, 203, 64, 47, 30, 223, 247, 47, 30, 242, 144, 47, 30, 242, 211, 47, + 30, 221, 225, 47, 30, 199, 198, 47, 30, 210, 75, 47, 30, 229, 162, 47, + 30, 221, 152, 64, 47, 30, 214, 46, 64, 47, 30, 199, 104, 64, 47, 30, 207, + 134, 64, 47, 30, 216, 154, 64, 47, 30, 210, 37, 64, 47, 30, 203, 65, 64, + 47, 30, 223, 248, 64, 47, 30, 242, 145, 64, 47, 30, 242, 212, 64, 47, 30, + 221, 226, 64, 47, 30, 199, 199, 64, 47, 30, 210, 76, 64, 47, 30, 229, + 163, 64, 47, 221, 79, 246, 100, 246, 107, 47, 221, 79, 246, 100, 222, + 210, 47, 30, 223, 248, 68, 221, 79, 202, 23, 109, 47, 228, 39, 101, 47, + 228, 39, 104, 47, 228, 39, 133, 47, 228, 39, 134, 47, 228, 39, 151, 47, + 228, 39, 170, 47, 228, 39, 179, 47, 228, 39, 174, 47, 228, 39, 182, 47, + 228, 39, 200, 30, 47, 228, 39, 216, 29, 47, 228, 39, 232, 231, 47, 228, + 39, 194, 129, 47, 228, 39, 194, 16, 47, 228, 39, 216, 240, 47, 228, 39, + 234, 189, 47, 228, 39, 201, 123, 47, 228, 39, 201, 241, 47, 228, 39, 230, + 9, 47, 228, 39, 202, 201, 47, 228, 39, 215, 62, 47, 228, 39, 202, 145, + 47, 228, 39, 232, 242, 47, 228, 39, 239, 14, 47, 228, 39, 220, 173, 47, + 228, 39, 205, 210, 47, 228, 39, 217, 165, 47, 228, 39, 233, 29, 47, 228, + 39, 201, 135, 47, 228, 39, 233, 208, 47, 228, 39, 209, 95, 47, 228, 39, + 250, 12, 47, 228, 39, 223, 81, 47, 228, 39, 207, 180, 47, 228, 39, 238, + 229, 47, 228, 39, 238, 217, 47, 228, 39, 229, 155, 47, 228, 39, 246, 137, + 47, 228, 39, 219, 52, 47, 228, 39, 220, 28, 47, 228, 39, 207, 101, 47, + 228, 39, 217, 33, 47, 228, 39, 207, 210, 47, 228, 39, 201, 190, 47, 228, + 39, 201, 103, 47, 228, 39, 234, 60, 47, 228, 39, 207, 182, 47, 228, 39, + 251, 4, 47, 228, 39, 214, 31, 47, 31, 199, 185, 170, 47, 31, 199, 185, + 179, 47, 31, 199, 185, 174, 47, 31, 199, 185, 182, 47, 31, 232, 126, 47, + 31, 232, 127, 101, 47, 31, 232, 127, 104, 47, 31, 232, 127, 133, 47, 31, + 232, 127, 134, 47, 31, 232, 127, 151, 47, 31, 232, 127, 170, 47, 31, 232, + 127, 179, 47, 31, 232, 127, 174, 47, 31, 232, 127, 182, 47, 31, 233, 3, + 149, 200, 44, 16, 39, 223, 52, 149, 200, 44, 16, 39, 233, 41, 149, 200, + 44, 16, 39, 217, 129, 149, 200, 44, 16, 39, 250, 137, 149, 200, 44, 16, + 39, 217, 92, 149, 200, 44, 16, 39, 222, 207, 149, 200, 44, 16, 39, 222, + 208, 149, 200, 44, 16, 39, 250, 4, 149, 200, 44, 16, 39, 204, 164, 149, + 200, 44, 16, 39, 212, 6, 149, 200, 44, 16, 39, 213, 98, 149, 200, 44, 16, + 39, 237, 110, 50, 229, 188, 50, 234, 17, 50, 233, 218, 219, 181, 219, + 208, 57, 47, 75, 64, 47, 75, 70, 47, 75, 68, 47, 75, 71, 47, 75, 74, 47, + 75, 160, 47, 75, 221, 204, 47, 75, 221, 33, 47, 75, 222, 57, 47, 75, 221, + 113, 47, 75, 188, 47, 75, 203, 125, 47, 75, 201, 184, 47, 75, 205, 223, + 47, 75, 202, 212, 47, 75, 189, 47, 75, 199, 128, 47, 75, 198, 45, 47, 75, + 200, 79, 47, 75, 155, 47, 75, 181, 47, 75, 214, 60, 47, 75, 213, 22, 47, + 75, 214, 214, 47, 75, 213, 142, 47, 75, 144, 47, 75, 229, 178, 47, 75, + 228, 181, 47, 75, 229, 255, 47, 75, 229, 43, 47, 75, 172, 47, 75, 216, + 175, 47, 75, 215, 241, 47, 75, 217, 48, 47, 75, 216, 91, 47, 75, 168, 47, + 75, 192, 214, 47, 75, 193, 1, 47, 75, 167, 47, 75, 207, 151, 47, 75, 206, + 218, 47, 75, 208, 7, 47, 75, 207, 55, 47, 75, 194, 169, 47, 75, 194, 72, + 47, 75, 194, 111, 47, 75, 194, 36, 50, 234, 20, 215, 63, 207, 218, 50, + 250, 162, 50, 250, 63, 50, 250, 189, 50, 251, 246, 50, 223, 158, 50, 223, + 125, 50, 197, 44, 50, 233, 245, 50, 234, 168, 50, 211, 197, 50, 211, 190, + 50, 222, 133, 50, 222, 97, 50, 222, 92, 50, 231, 188, 50, 231, 198, 50, + 231, 34, 50, 231, 30, 50, 220, 203, 50, 231, 21, 50, 221, 169, 50, 221, + 168, 50, 221, 167, 50, 221, 166, 50, 230, 154, 50, 230, 153, 50, 220, + 252, 50, 220, 255, 50, 222, 44, 50, 221, 77, 50, 221, 85, 50, 206, 74, + 50, 206, 31, 50, 203, 45, 50, 204, 170, 50, 204, 169, 50, 237, 252, 50, + 237, 53, 50, 236, 115, 50, 199, 20, 50, 215, 56, 50, 213, 99, 50, 230, + 83, 50, 211, 71, 50, 211, 70, 50, 249, 0, 50, 210, 48, 50, 210, 10, 50, + 210, 11, 50, 248, 9, 50, 228, 176, 50, 228, 170, 50, 247, 80, 50, 228, + 154, 50, 229, 216, 50, 210, 107, 50, 210, 149, 50, 229, 197, 50, 210, + 145, 50, 210, 163, 50, 248, 103, 50, 209, 187, 50, 247, 193, 50, 229, 19, + 50, 209, 173, 50, 229, 10, 50, 229, 12, 50, 217, 178, 50, 217, 174, 50, + 217, 183, 50, 217, 115, 50, 217, 146, 50, 216, 132, 50, 216, 107, 50, + 216, 106, 50, 217, 21, 50, 217, 18, 50, 217, 22, 50, 193, 128, 50, 193, + 126, 50, 192, 199, 50, 207, 71, 50, 207, 75, 50, 206, 185, 50, 206, 178, + 50, 207, 207, 50, 207, 204, 50, 194, 127, 149, 200, 44, 16, 39, 228, 198, + 192, 76, 149, 200, 44, 16, 39, 228, 198, 101, 149, 200, 44, 16, 39, 228, + 198, 104, 149, 200, 44, 16, 39, 228, 198, 133, 149, 200, 44, 16, 39, 228, + 198, 134, 149, 200, 44, 16, 39, 228, 198, 151, 149, 200, 44, 16, 39, 228, + 198, 170, 149, 200, 44, 16, 39, 228, 198, 179, 149, 200, 44, 16, 39, 228, + 198, 174, 149, 200, 44, 16, 39, 228, 198, 182, 149, 200, 44, 16, 39, 228, + 198, 200, 30, 149, 200, 44, 16, 39, 228, 198, 234, 111, 149, 200, 44, 16, + 39, 228, 198, 197, 244, 149, 200, 44, 16, 39, 228, 198, 199, 186, 149, + 200, 44, 16, 39, 228, 198, 232, 113, 149, 200, 44, 16, 39, 228, 198, 233, + 7, 149, 200, 44, 16, 39, 228, 198, 203, 35, 149, 200, 44, 16, 39, 228, + 198, 204, 143, 149, 200, 44, 16, 39, 228, 198, 234, 145, 149, 200, 44, + 16, 39, 228, 198, 214, 13, 149, 200, 44, 16, 39, 228, 198, 197, 239, 149, + 200, 44, 16, 39, 228, 198, 197, 232, 149, 200, 44, 16, 39, 228, 198, 197, + 227, 149, 200, 44, 16, 39, 228, 198, 197, 229, 149, 200, 44, 16, 39, 228, + 198, 197, 234, 50, 228, 189, 50, 238, 0, 50, 250, 8, 50, 161, 50, 211, + 120, 50, 210, 186, 50, 236, 149, 50, 236, 150, 202, 105, 50, 236, 150, + 238, 156, 50, 223, 78, 50, 234, 20, 215, 63, 229, 217, 50, 234, 20, 215, + 63, 200, 251, 50, 234, 20, 215, 63, 200, 144, 50, 234, 20, 215, 63, 217, + 17, 50, 238, 219, 50, 211, 78, 250, 227, 50, 181, 50, 215, 242, 64, 50, + 172, 50, 160, 50, 222, 60, 50, 217, 87, 50, 231, 176, 50, 247, 3, 50, + 222, 59, 50, 210, 97, 50, 214, 169, 50, 215, 242, 233, 163, 50, 215, 242, + 232, 44, 50, 216, 216, 50, 221, 252, 50, 228, 106, 50, 221, 206, 50, 216, + 177, 50, 231, 48, 50, 199, 130, 50, 215, 242, 165, 50, 216, 99, 50, 236, + 159, 50, 221, 133, 50, 232, 166, 50, 213, 180, 50, 215, 242, 218, 236, + 50, 216, 96, 50, 242, 64, 50, 221, 127, 50, 216, 97, 202, 105, 50, 242, + 65, 202, 105, 50, 218, 237, 202, 105, 50, 221, 128, 202, 105, 50, 216, + 97, 238, 156, 50, 242, 65, 238, 156, 50, 218, 237, 238, 156, 50, 221, + 128, 238, 156, 50, 218, 237, 136, 206, 158, 50, 218, 237, 136, 206, 159, + 202, 105, 50, 166, 50, 221, 69, 50, 215, 247, 50, 230, 228, 50, 208, 58, + 50, 208, 59, 136, 206, 158, 50, 208, 59, 136, 206, 159, 202, 105, 50, + 209, 64, 50, 213, 63, 50, 215, 242, 206, 158, 50, 215, 244, 50, 209, 11, + 50, 212, 212, 50, 215, 242, 196, 236, 50, 215, 175, 50, 220, 241, 50, + 215, 176, 217, 21, 50, 209, 10, 50, 212, 211, 50, 215, 242, 194, 202, 50, + 215, 169, 50, 220, 239, 50, 215, 170, 217, 21, 50, 222, 185, 211, 239, + 50, 218, 237, 211, 239, 50, 250, 241, 50, 247, 168, 50, 246, 182, 50, + 246, 159, 50, 247, 53, 136, 221, 252, 50, 242, 63, 50, 237, 170, 50, 230, + 137, 50, 144, 50, 228, 190, 50, 223, 190, 50, 221, 140, 50, 221, 128, + 246, 225, 50, 221, 35, 50, 219, 110, 50, 219, 109, 50, 219, 94, 50, 218, + 252, 50, 217, 88, 202, 236, 50, 216, 131, 50, 216, 57, 50, 210, 95, 50, + 209, 201, 50, 209, 133, 50, 209, 131, 50, 202, 96, 50, 201, 84, 50, 194, + 113, 50, 196, 237, 136, 218, 236, 50, 41, 136, 218, 236, 149, 200, 44, + 16, 39, 237, 174, 101, 149, 200, 44, 16, 39, 237, 174, 104, 149, 200, 44, + 16, 39, 237, 174, 133, 149, 200, 44, 16, 39, 237, 174, 134, 149, 200, 44, + 16, 39, 237, 174, 151, 149, 200, 44, 16, 39, 237, 174, 170, 149, 200, 44, + 16, 39, 237, 174, 179, 149, 200, 44, 16, 39, 237, 174, 174, 149, 200, 44, + 16, 39, 237, 174, 182, 149, 200, 44, 16, 39, 237, 174, 200, 30, 149, 200, + 44, 16, 39, 237, 174, 234, 111, 149, 200, 44, 16, 39, 237, 174, 197, 244, + 149, 200, 44, 16, 39, 237, 174, 199, 186, 149, 200, 44, 16, 39, 237, 174, + 232, 113, 149, 200, 44, 16, 39, 237, 174, 233, 7, 149, 200, 44, 16, 39, + 237, 174, 203, 35, 149, 200, 44, 16, 39, 237, 174, 204, 143, 149, 200, + 44, 16, 39, 237, 174, 234, 145, 149, 200, 44, 16, 39, 237, 174, 214, 13, + 149, 200, 44, 16, 39, 237, 174, 197, 239, 149, 200, 44, 16, 39, 237, 174, + 197, 232, 149, 200, 44, 16, 39, 237, 174, 197, 227, 149, 200, 44, 16, 39, + 237, 174, 197, 229, 149, 200, 44, 16, 39, 237, 174, 197, 234, 149, 200, + 44, 16, 39, 237, 174, 197, 235, 149, 200, 44, 16, 39, 237, 174, 197, 230, + 149, 200, 44, 16, 39, 237, 174, 197, 231, 149, 200, 44, 16, 39, 237, 174, + 197, 238, 149, 200, 44, 16, 39, 237, 174, 197, 233, 149, 200, 44, 16, 39, + 237, 174, 199, 184, 149, 200, 44, 16, 39, 237, 174, 199, 182, 50, 231, + 215, 229, 191, 39, 199, 225, 238, 197, 229, 229, 229, 191, 39, 199, 225, + 207, 250, 234, 189, 229, 191, 39, 236, 242, 250, 27, 199, 225, 248, 98, + 229, 191, 39, 192, 227, 232, 158, 229, 191, 39, 194, 155, 229, 191, 39, + 239, 17, 229, 191, 39, 199, 225, 250, 88, 229, 191, 39, 229, 26, 199, 26, + 229, 191, 39, 2, 200, 126, 229, 191, 39, 198, 198, 229, 191, 39, 210, + 179, 229, 191, 39, 202, 21, 229, 191, 39, 233, 31, 229, 191, 39, 230, + 206, 209, 156, 229, 191, 39, 216, 77, 229, 191, 39, 234, 59, 229, 191, + 39, 232, 159, 229, 191, 39, 194, 9, 211, 212, 199, 225, 237, 111, 229, + 191, 39, 250, 141, 229, 191, 39, 238, 252, 229, 191, 39, 247, 254, 199, + 150, 229, 191, 39, 230, 226, 229, 191, 39, 202, 123, 250, 161, 229, 191, + 39, 207, 172, 229, 191, 39, 223, 152, 229, 191, 39, 230, 206, 200, 126, + 229, 191, 39, 216, 5, 238, 222, 229, 191, 39, 230, 206, 209, 108, 229, + 191, 39, 199, 225, 251, 148, 194, 129, 229, 191, 39, 199, 225, 242, 92, + 232, 231, 229, 191, 39, 223, 166, 229, 191, 39, 235, 38, 229, 191, 39, + 207, 175, 229, 191, 39, 230, 206, 209, 138, 229, 191, 39, 209, 82, 229, + 191, 39, 237, 190, 80, 199, 225, 219, 195, 229, 191, 39, 199, 225, 233, + 69, 229, 191, 39, 211, 169, 229, 191, 39, 212, 13, 229, 191, 39, 237, 81, + 229, 191, 39, 237, 103, 229, 191, 39, 223, 181, 229, 191, 39, 247, 154, + 229, 191, 39, 242, 40, 115, 217, 24, 229, 191, 39, 231, 183, 199, 26, + 229, 191, 39, 209, 21, 197, 31, 229, 191, 39, 211, 168, 229, 191, 39, + 199, 225, 194, 95, 229, 191, 39, 207, 163, 229, 191, 39, 199, 225, 246, + 188, 229, 191, 39, 199, 225, 250, 84, 199, 144, 229, 191, 39, 199, 225, + 222, 45, 201, 245, 216, 9, 229, 191, 39, 237, 48, 229, 191, 39, 199, 225, + 217, 118, 217, 179, 229, 191, 39, 251, 149, 229, 191, 39, 199, 225, 194, + 146, 229, 191, 39, 199, 225, 231, 138, 194, 52, 229, 191, 39, 199, 225, + 222, 216, 220, 102, 229, 191, 39, 236, 191, 229, 191, 39, 219, 182, 229, + 191, 39, 223, 155, 198, 122, 229, 191, 39, 2, 209, 108, 229, 191, 39, + 251, 81, 242, 30, 229, 191, 39, 248, 101, 242, 30, 11, 5, 223, 82, 11, 5, + 223, 74, 11, 5, 70, 11, 5, 223, 108, 11, 5, 223, 249, 11, 5, 223, 232, + 11, 5, 223, 251, 11, 5, 223, 250, 11, 5, 250, 26, 11, 5, 249, 238, 11, 5, + 64, 11, 5, 250, 163, 11, 5, 197, 42, 11, 5, 197, 46, 11, 5, 197, 43, 11, + 5, 211, 140, 11, 5, 211, 103, 11, 5, 74, 11, 5, 211, 185, 11, 5, 233, + 209, 11, 5, 71, 11, 5, 193, 244, 11, 5, 248, 1, 11, 5, 247, 252, 11, 5, + 248, 41, 11, 5, 248, 14, 11, 5, 248, 30, 11, 5, 248, 29, 11, 5, 248, 32, + 11, 5, 248, 31, 11, 5, 248, 170, 11, 5, 248, 162, 11, 5, 249, 3, 11, 5, + 248, 195, 11, 5, 247, 92, 11, 5, 247, 96, 11, 5, 247, 93, 11, 5, 247, + 192, 11, 5, 247, 173, 11, 5, 247, 220, 11, 5, 247, 198, 11, 5, 248, 57, + 11, 5, 248, 123, 11, 5, 248, 70, 11, 5, 247, 76, 11, 5, 247, 70, 11, 5, + 247, 124, 11, 5, 247, 91, 11, 5, 247, 84, 11, 5, 247, 89, 11, 5, 247, 58, + 11, 5, 247, 56, 11, 5, 247, 63, 11, 5, 247, 61, 11, 5, 247, 59, 11, 5, + 247, 60, 11, 5, 209, 241, 11, 5, 209, 237, 11, 5, 210, 51, 11, 5, 209, + 253, 11, 5, 210, 16, 11, 5, 210, 43, 11, 5, 210, 39, 11, 5, 210, 206, 11, + 5, 210, 191, 11, 5, 166, 11, 5, 210, 253, 11, 5, 209, 31, 11, 5, 209, 33, + 11, 5, 209, 32, 11, 5, 209, 149, 11, 5, 209, 136, 11, 5, 209, 198, 11, 5, + 209, 168, 11, 5, 209, 17, 11, 5, 209, 13, 11, 5, 209, 51, 11, 5, 209, 30, + 11, 5, 209, 22, 11, 5, 209, 28, 11, 5, 208, 251, 11, 5, 208, 250, 11, 5, + 208, 255, 11, 5, 208, 254, 11, 5, 208, 252, 11, 5, 208, 253, 11, 5, 248, + 144, 11, 5, 248, 143, 11, 5, 248, 150, 11, 5, 248, 145, 11, 5, 248, 147, + 11, 5, 248, 146, 11, 5, 248, 149, 11, 5, 248, 148, 11, 5, 248, 156, 11, + 5, 248, 155, 11, 5, 248, 159, 11, 5, 248, 157, 11, 5, 248, 135, 11, 5, + 248, 137, 11, 5, 248, 136, 11, 5, 248, 140, 11, 5, 248, 139, 11, 5, 248, + 142, 11, 5, 248, 141, 11, 5, 248, 151, 11, 5, 248, 154, 11, 5, 248, 152, + 11, 5, 248, 131, 11, 5, 248, 130, 11, 5, 248, 138, 11, 5, 248, 134, 11, + 5, 248, 132, 11, 5, 248, 133, 11, 5, 248, 127, 11, 5, 248, 126, 11, 5, + 248, 129, 11, 5, 248, 128, 11, 5, 215, 22, 11, 5, 215, 21, 11, 5, 215, + 27, 11, 5, 215, 23, 11, 5, 215, 24, 11, 5, 215, 26, 11, 5, 215, 25, 11, + 5, 215, 30, 11, 5, 215, 29, 11, 5, 215, 32, 11, 5, 215, 31, 11, 5, 215, + 18, 11, 5, 215, 17, 11, 5, 215, 20, 11, 5, 215, 19, 11, 5, 215, 11, 11, + 5, 215, 10, 11, 5, 215, 15, 11, 5, 215, 14, 11, 5, 215, 12, 11, 5, 215, + 13, 11, 5, 215, 5, 11, 5, 215, 4, 11, 5, 215, 9, 11, 5, 215, 8, 11, 5, + 215, 6, 11, 5, 215, 7, 11, 5, 229, 87, 11, 5, 229, 86, 11, 5, 229, 92, + 11, 5, 229, 88, 11, 5, 229, 89, 11, 5, 229, 91, 11, 5, 229, 90, 11, 5, + 229, 95, 11, 5, 229, 94, 11, 5, 229, 97, 11, 5, 229, 96, 11, 5, 229, 78, + 11, 5, 229, 80, 11, 5, 229, 79, 11, 5, 229, 83, 11, 5, 229, 82, 11, 5, + 229, 85, 11, 5, 229, 84, 11, 5, 229, 74, 11, 5, 229, 73, 11, 5, 229, 81, + 11, 5, 229, 77, 11, 5, 229, 75, 11, 5, 229, 76, 11, 5, 229, 68, 11, 5, + 229, 72, 11, 5, 229, 71, 11, 5, 229, 69, 11, 5, 229, 70, 11, 5, 216, 102, + 11, 5, 216, 101, 11, 5, 216, 175, 11, 5, 216, 109, 11, 5, 216, 139, 11, + 5, 216, 157, 11, 5, 216, 155, 11, 5, 217, 101, 11, 5, 217, 95, 11, 5, + 172, 11, 5, 217, 141, 11, 5, 215, 203, 11, 5, 215, 202, 11, 5, 215, 206, + 11, 5, 215, 204, 11, 5, 216, 20, 11, 5, 215, 249, 11, 5, 216, 91, 11, 5, + 216, 27, 11, 5, 216, 227, 11, 5, 217, 48, 11, 5, 215, 183, 11, 5, 215, + 177, 11, 5, 215, 241, 11, 5, 215, 199, 11, 5, 215, 192, 11, 5, 215, 197, + 11, 5, 215, 154, 11, 5, 215, 153, 11, 5, 215, 159, 11, 5, 215, 156, 11, + 5, 232, 217, 11, 5, 232, 211, 11, 5, 233, 11, 11, 5, 232, 233, 11, 5, + 233, 60, 11, 5, 233, 51, 11, 5, 233, 97, 11, 5, 233, 65, 11, 5, 232, 110, + 11, 5, 232, 164, 11, 5, 232, 144, 11, 5, 232, 60, 11, 5, 232, 59, 11, 5, + 232, 77, 11, 5, 232, 65, 11, 5, 232, 63, 11, 5, 232, 64, 11, 5, 232, 47, + 11, 5, 232, 46, 11, 5, 232, 50, 11, 5, 232, 48, 11, 5, 196, 3, 11, 5, + 195, 254, 11, 5, 196, 39, 11, 5, 196, 12, 11, 5, 196, 28, 11, 5, 196, 24, + 11, 5, 196, 31, 11, 5, 196, 30, 11, 5, 196, 131, 11, 5, 196, 126, 11, 5, + 196, 157, 11, 5, 196, 144, 11, 5, 195, 232, 11, 5, 195, 228, 11, 5, 195, + 252, 11, 5, 195, 234, 11, 5, 196, 43, 11, 5, 196, 111, 11, 5, 194, 216, + 11, 5, 194, 214, 11, 5, 194, 223, 11, 5, 194, 219, 11, 5, 194, 217, 11, + 5, 194, 218, 11, 5, 194, 206, 11, 5, 194, 205, 11, 5, 194, 210, 11, 5, + 194, 209, 11, 5, 194, 207, 11, 5, 194, 208, 11, 5, 236, 184, 11, 5, 236, + 169, 11, 5, 237, 16, 11, 5, 236, 212, 11, 5, 236, 247, 11, 5, 236, 252, + 11, 5, 236, 251, 11, 5, 237, 181, 11, 5, 237, 175, 11, 5, 238, 0, 11, 5, + 237, 201, 11, 5, 235, 43, 11, 5, 235, 44, 11, 5, 236, 114, 11, 5, 235, + 90, 11, 5, 236, 146, 11, 5, 236, 117, 11, 5, 237, 46, 11, 5, 237, 116, + 11, 5, 237, 67, 11, 5, 235, 34, 11, 5, 235, 32, 11, 5, 235, 62, 11, 5, + 235, 42, 11, 5, 235, 37, 11, 5, 235, 40, 11, 5, 199, 63, 11, 5, 199, 55, + 11, 5, 199, 128, 11, 5, 199, 73, 11, 5, 199, 111, 11, 5, 199, 113, 11, 5, + 199, 112, 11, 5, 200, 105, 11, 5, 200, 90, 11, 5, 189, 11, 5, 200, 116, + 11, 5, 198, 20, 11, 5, 198, 19, 11, 5, 198, 22, 11, 5, 198, 21, 11, 5, + 198, 235, 11, 5, 198, 225, 11, 5, 155, 11, 5, 198, 248, 11, 5, 199, 246, + 11, 5, 200, 79, 11, 5, 200, 17, 11, 5, 198, 3, 11, 5, 197, 254, 11, 5, + 198, 45, 11, 5, 198, 18, 11, 5, 198, 4, 11, 5, 198, 15, 11, 5, 237, 133, + 11, 5, 237, 132, 11, 5, 237, 138, 11, 5, 237, 134, 11, 5, 237, 135, 11, + 5, 237, 137, 11, 5, 237, 136, 11, 5, 237, 154, 11, 5, 237, 153, 11, 5, + 237, 161, 11, 5, 237, 155, 11, 5, 237, 123, 11, 5, 237, 125, 11, 5, 237, + 124, 11, 5, 237, 128, 11, 5, 237, 127, 11, 5, 237, 131, 11, 5, 237, 129, + 11, 5, 237, 146, 11, 5, 237, 149, 11, 5, 237, 147, 11, 5, 237, 119, 11, + 5, 237, 118, 11, 5, 237, 126, 11, 5, 237, 122, 11, 5, 237, 120, 11, 5, + 237, 121, 11, 5, 214, 233, 11, 5, 214, 232, 11, 5, 214, 240, 11, 5, 214, + 235, 11, 5, 214, 236, 11, 5, 214, 237, 11, 5, 214, 249, 11, 5, 214, 248, + 11, 5, 214, 255, 11, 5, 214, 250, 11, 5, 214, 225, 11, 5, 214, 224, 11, + 5, 214, 231, 11, 5, 214, 226, 11, 5, 214, 241, 11, 5, 214, 247, 11, 5, + 214, 245, 11, 5, 214, 217, 11, 5, 214, 216, 11, 5, 214, 222, 11, 5, 214, + 220, 11, 5, 214, 218, 11, 5, 214, 219, 11, 5, 229, 53, 11, 5, 229, 52, + 11, 5, 229, 59, 11, 5, 229, 54, 11, 5, 229, 56, 11, 5, 229, 55, 11, 5, + 229, 58, 11, 5, 229, 57, 11, 5, 229, 65, 11, 5, 229, 63, 11, 5, 229, 67, + 11, 5, 229, 66, 11, 5, 229, 46, 11, 5, 229, 47, 11, 5, 229, 50, 11, 5, + 229, 49, 11, 5, 229, 51, 11, 5, 229, 60, 11, 5, 229, 62, 11, 5, 229, 61, + 11, 5, 229, 45, 11, 5, 214, 4, 11, 5, 214, 2, 11, 5, 214, 60, 11, 5, 214, + 7, 11, 5, 214, 34, 11, 5, 214, 48, 11, 5, 214, 47, 11, 5, 215, 37, 11, 5, + 181, 11, 5, 215, 53, 11, 5, 212, 222, 11, 5, 212, 224, 11, 5, 212, 223, + 11, 5, 213, 110, 11, 5, 213, 94, 11, 5, 213, 142, 11, 5, 213, 121, 11, 5, + 214, 171, 11, 5, 214, 214, 11, 5, 214, 191, 11, 5, 212, 217, 11, 5, 212, + 213, 11, 5, 213, 22, 11, 5, 212, 221, 11, 5, 212, 219, 11, 5, 212, 220, + 11, 5, 229, 118, 11, 5, 229, 117, 11, 5, 229, 123, 11, 5, 229, 119, 11, + 5, 229, 120, 11, 5, 229, 122, 11, 5, 229, 121, 11, 5, 229, 129, 11, 5, + 229, 127, 11, 5, 229, 131, 11, 5, 229, 130, 11, 5, 229, 110, 11, 5, 229, + 112, 11, 5, 229, 111, 11, 5, 229, 114, 11, 5, 229, 116, 11, 5, 229, 115, + 11, 5, 229, 124, 11, 5, 229, 126, 11, 5, 229, 125, 11, 5, 229, 106, 11, + 5, 229, 105, 11, 5, 229, 113, 11, 5, 229, 109, 11, 5, 229, 107, 11, 5, + 229, 108, 11, 5, 229, 100, 11, 5, 229, 99, 11, 5, 229, 104, 11, 5, 229, + 103, 11, 5, 229, 101, 11, 5, 229, 102, 11, 5, 219, 151, 11, 5, 219, 143, + 11, 5, 219, 209, 11, 5, 219, 161, 11, 5, 219, 200, 11, 5, 219, 199, 11, + 5, 219, 203, 11, 5, 219, 201, 11, 5, 220, 65, 11, 5, 220, 53, 11, 5, 177, + 11, 5, 220, 76, 11, 5, 219, 13, 11, 5, 219, 12, 11, 5, 219, 15, 11, 5, + 219, 14, 11, 5, 219, 60, 11, 5, 219, 45, 11, 5, 219, 107, 11, 5, 219, 66, + 11, 5, 219, 226, 11, 5, 220, 42, 11, 5, 219, 244, 11, 5, 219, 7, 11, 5, + 219, 5, 11, 5, 219, 36, 11, 5, 219, 11, 11, 5, 219, 9, 11, 5, 219, 10, + 11, 5, 218, 241, 11, 5, 218, 240, 11, 5, 218, 251, 11, 5, 218, 244, 11, + 5, 218, 242, 11, 5, 218, 243, 11, 5, 231, 17, 11, 5, 231, 16, 11, 5, 231, + 46, 11, 5, 231, 29, 11, 5, 231, 38, 11, 5, 231, 37, 11, 5, 231, 40, 11, + 5, 231, 39, 11, 5, 231, 185, 11, 5, 231, 180, 11, 5, 231, 233, 11, 5, + 231, 196, 11, 5, 230, 159, 11, 5, 230, 158, 11, 5, 230, 161, 11, 5, 230, + 160, 11, 5, 230, 231, 11, 5, 230, 229, 11, 5, 230, 254, 11, 5, 230, 240, + 11, 5, 231, 124, 11, 5, 231, 122, 11, 5, 231, 158, 11, 5, 231, 135, 11, + 5, 230, 148, 11, 5, 230, 147, 11, 5, 230, 186, 11, 5, 230, 157, 11, 5, + 230, 149, 11, 5, 230, 156, 11, 5, 221, 158, 11, 5, 221, 153, 11, 5, 221, + 204, 11, 5, 221, 172, 11, 5, 221, 185, 11, 5, 221, 189, 11, 5, 221, 187, + 11, 5, 222, 83, 11, 5, 222, 65, 11, 5, 160, 11, 5, 222, 112, 11, 5, 221, + 4, 11, 5, 221, 9, 11, 5, 221, 6, 11, 5, 221, 76, 11, 5, 221, 71, 11, 5, + 221, 113, 11, 5, 221, 83, 11, 5, 222, 20, 11, 5, 222, 3, 11, 5, 222, 57, + 11, 5, 222, 24, 11, 5, 220, 247, 11, 5, 220, 243, 11, 5, 221, 33, 11, 5, + 221, 3, 11, 5, 220, 251, 11, 5, 221, 0, 11, 5, 231, 106, 11, 5, 231, 105, + 11, 5, 231, 110, 11, 5, 231, 107, 11, 5, 231, 109, 11, 5, 231, 108, 11, + 5, 231, 117, 11, 5, 231, 116, 11, 5, 231, 120, 11, 5, 231, 118, 11, 5, + 231, 97, 11, 5, 231, 96, 11, 5, 231, 99, 11, 5, 231, 98, 11, 5, 231, 102, + 11, 5, 231, 101, 11, 5, 231, 104, 11, 5, 231, 103, 11, 5, 231, 112, 11, + 5, 231, 111, 11, 5, 231, 115, 11, 5, 231, 113, 11, 5, 231, 92, 11, 5, + 231, 91, 11, 5, 231, 100, 11, 5, 231, 95, 11, 5, 231, 93, 11, 5, 231, 94, + 11, 5, 216, 194, 11, 5, 216, 195, 11, 5, 216, 213, 11, 5, 216, 212, 11, + 5, 216, 215, 11, 5, 216, 214, 11, 5, 216, 185, 11, 5, 216, 187, 11, 5, + 216, 186, 11, 5, 216, 190, 11, 5, 216, 189, 11, 5, 216, 192, 11, 5, 216, + 191, 11, 5, 216, 196, 11, 5, 216, 198, 11, 5, 216, 197, 11, 5, 216, 181, + 11, 5, 216, 180, 11, 5, 216, 188, 11, 5, 216, 184, 11, 5, 216, 182, 11, + 5, 216, 183, 11, 5, 228, 126, 11, 5, 228, 125, 11, 5, 228, 132, 11, 5, + 228, 127, 11, 5, 228, 129, 11, 5, 228, 128, 11, 5, 228, 131, 11, 5, 228, + 130, 11, 5, 228, 137, 11, 5, 228, 136, 11, 5, 228, 139, 11, 5, 228, 138, + 11, 5, 228, 118, 11, 5, 228, 117, 11, 5, 228, 120, 11, 5, 228, 119, 11, + 5, 228, 122, 11, 5, 228, 121, 11, 5, 228, 124, 11, 5, 228, 123, 11, 5, + 228, 133, 11, 5, 228, 135, 11, 5, 228, 134, 11, 5, 214, 110, 11, 5, 214, + 112, 11, 5, 214, 111, 11, 5, 214, 155, 11, 5, 214, 153, 11, 5, 214, 165, + 11, 5, 214, 158, 11, 5, 214, 71, 11, 5, 214, 70, 11, 5, 214, 72, 11, 5, + 214, 82, 11, 5, 214, 79, 11, 5, 214, 90, 11, 5, 214, 84, 11, 5, 214, 146, + 11, 5, 214, 152, 11, 5, 214, 148, 11, 5, 229, 137, 11, 5, 229, 156, 11, + 5, 229, 165, 11, 5, 230, 18, 11, 5, 230, 7, 11, 5, 144, 11, 5, 230, 30, + 11, 5, 228, 156, 11, 5, 228, 155, 11, 5, 228, 158, 11, 5, 228, 157, 11, + 5, 228, 201, 11, 5, 228, 192, 11, 5, 229, 43, 11, 5, 229, 8, 11, 5, 229, + 193, 11, 5, 229, 255, 11, 5, 229, 205, 11, 5, 194, 132, 11, 5, 194, 117, + 11, 5, 194, 169, 11, 5, 194, 143, 11, 5, 193, 233, 11, 5, 193, 235, 11, + 5, 193, 234, 11, 5, 194, 1, 11, 5, 194, 36, 11, 5, 194, 12, 11, 5, 194, + 85, 11, 5, 194, 111, 11, 5, 194, 92, 11, 5, 192, 15, 11, 5, 192, 14, 11, + 5, 192, 30, 11, 5, 192, 18, 11, 5, 192, 23, 11, 5, 192, 25, 11, 5, 192, + 24, 11, 5, 192, 94, 11, 5, 192, 91, 11, 5, 192, 112, 11, 5, 192, 98, 11, + 5, 191, 245, 11, 5, 191, 247, 11, 5, 191, 246, 11, 5, 192, 3, 11, 5, 192, + 2, 11, 5, 192, 8, 11, 5, 192, 4, 11, 5, 192, 73, 11, 5, 192, 85, 11, 5, + 192, 78, 11, 5, 191, 241, 11, 5, 191, 240, 11, 5, 191, 252, 11, 5, 191, + 244, 11, 5, 191, 242, 11, 5, 191, 243, 11, 5, 191, 227, 11, 5, 191, 226, + 11, 5, 191, 232, 11, 5, 191, 230, 11, 5, 191, 228, 11, 5, 191, 229, 11, + 5, 242, 119, 11, 5, 242, 112, 11, 5, 242, 149, 11, 5, 242, 132, 11, 5, + 242, 146, 11, 5, 242, 140, 11, 5, 242, 148, 11, 5, 242, 147, 11, 5, 246, + 193, 11, 5, 246, 185, 11, 5, 247, 19, 11, 5, 246, 226, 11, 5, 238, 150, + 11, 5, 238, 152, 11, 5, 238, 151, 11, 5, 238, 215, 11, 5, 238, 203, 11, + 5, 242, 63, 11, 5, 238, 234, 11, 5, 246, 121, 11, 5, 246, 158, 11, 5, + 246, 127, 11, 5, 238, 121, 11, 5, 238, 119, 11, 5, 238, 162, 11, 5, 238, + 148, 11, 5, 238, 127, 11, 5, 238, 143, 11, 5, 238, 98, 11, 5, 238, 97, + 11, 5, 238, 110, 11, 5, 238, 104, 11, 5, 238, 99, 11, 5, 238, 101, 11, 5, + 191, 210, 11, 5, 191, 209, 11, 5, 191, 216, 11, 5, 191, 211, 11, 5, 191, + 213, 11, 5, 191, 212, 11, 5, 191, 215, 11, 5, 191, 214, 11, 5, 191, 222, + 11, 5, 191, 221, 11, 5, 191, 225, 11, 5, 191, 223, 11, 5, 191, 206, 11, + 5, 191, 208, 11, 5, 191, 207, 11, 5, 191, 217, 11, 5, 191, 220, 11, 5, + 191, 218, 11, 5, 191, 199, 11, 5, 191, 203, 11, 5, 191, 202, 11, 5, 191, + 200, 11, 5, 191, 201, 11, 5, 191, 193, 11, 5, 191, 192, 11, 5, 191, 198, + 11, 5, 191, 196, 11, 5, 191, 194, 11, 5, 191, 195, 11, 5, 212, 133, 11, + 5, 212, 132, 11, 5, 212, 138, 11, 5, 212, 134, 11, 5, 212, 135, 11, 5, + 212, 137, 11, 5, 212, 136, 11, 5, 212, 143, 11, 5, 212, 142, 11, 5, 212, + 146, 11, 5, 212, 145, 11, 5, 212, 126, 11, 5, 212, 127, 11, 5, 212, 130, + 11, 5, 212, 131, 11, 5, 212, 139, 11, 5, 212, 141, 11, 5, 212, 121, 11, + 5, 212, 129, 11, 5, 212, 125, 11, 5, 212, 122, 11, 5, 212, 123, 11, 5, + 212, 116, 11, 5, 212, 115, 11, 5, 212, 120, 11, 5, 212, 119, 11, 5, 212, + 117, 11, 5, 212, 118, 11, 5, 203, 43, 11, 5, 170, 11, 5, 203, 125, 11, 5, + 203, 46, 11, 5, 203, 105, 11, 5, 203, 108, 11, 5, 203, 106, 11, 5, 206, + 20, 11, 5, 206, 4, 11, 5, 188, 11, 5, 206, 28, 11, 5, 201, 113, 11, 5, + 201, 115, 11, 5, 201, 114, 11, 5, 202, 177, 11, 5, 202, 166, 11, 5, 202, + 212, 11, 5, 202, 181, 11, 5, 204, 137, 11, 5, 205, 223, 11, 5, 204, 168, + 11, 5, 201, 88, 11, 5, 201, 85, 11, 5, 201, 184, 11, 5, 201, 112, 11, 5, + 201, 92, 11, 5, 201, 100, 11, 5, 200, 242, 11, 5, 200, 241, 11, 5, 201, + 56, 11, 5, 200, 250, 11, 5, 200, 244, 11, 5, 200, 249, 11, 5, 202, 53, + 11, 5, 202, 52, 11, 5, 202, 59, 11, 5, 202, 54, 11, 5, 202, 56, 11, 5, + 202, 58, 11, 5, 202, 57, 11, 5, 202, 68, 11, 5, 202, 66, 11, 5, 202, 92, + 11, 5, 202, 69, 11, 5, 202, 48, 11, 5, 202, 47, 11, 5, 202, 51, 11, 5, + 202, 49, 11, 5, 202, 62, 11, 5, 202, 65, 11, 5, 202, 63, 11, 5, 202, 44, + 11, 5, 202, 42, 11, 5, 202, 46, 11, 5, 202, 45, 11, 5, 202, 37, 11, 5, + 202, 36, 11, 5, 202, 41, 11, 5, 202, 40, 11, 5, 202, 38, 11, 5, 202, 39, + 11, 5, 192, 66, 11, 5, 192, 65, 11, 5, 192, 71, 11, 5, 192, 68, 11, 5, + 192, 45, 11, 5, 192, 47, 11, 5, 192, 46, 11, 5, 192, 50, 11, 5, 192, 49, + 11, 5, 192, 54, 11, 5, 192, 51, 11, 5, 192, 59, 11, 5, 192, 58, 11, 5, + 192, 62, 11, 5, 192, 60, 11, 5, 192, 41, 11, 5, 192, 40, 11, 5, 192, 48, + 11, 5, 192, 44, 11, 5, 192, 42, 11, 5, 192, 43, 11, 5, 192, 33, 11, 5, + 192, 32, 11, 5, 192, 37, 11, 5, 192, 36, 11, 5, 192, 34, 11, 5, 192, 35, + 11, 5, 242, 251, 11, 5, 242, 247, 11, 5, 246, 117, 11, 5, 246, 103, 11, + 5, 242, 164, 11, 5, 242, 163, 11, 5, 242, 166, 11, 5, 242, 165, 11, 5, + 242, 179, 11, 5, 242, 178, 11, 5, 242, 188, 11, 5, 242, 183, 11, 5, 242, + 222, 11, 5, 242, 219, 11, 5, 242, 245, 11, 5, 242, 230, 11, 5, 242, 158, + 11, 5, 242, 168, 11, 5, 242, 162, 11, 5, 242, 159, 11, 5, 242, 161, 11, + 5, 242, 151, 11, 5, 242, 150, 11, 5, 242, 155, 11, 5, 242, 154, 11, 5, + 242, 152, 11, 5, 242, 153, 11, 5, 206, 255, 11, 5, 207, 3, 11, 5, 206, + 237, 11, 5, 206, 238, 11, 5, 206, 242, 11, 5, 206, 241, 11, 5, 206, 245, + 11, 5, 206, 243, 11, 5, 206, 249, 11, 5, 206, 248, 11, 5, 206, 254, 11, + 5, 206, 250, 11, 5, 206, 233, 11, 5, 206, 231, 11, 5, 206, 239, 11, 5, + 206, 236, 11, 5, 206, 234, 11, 5, 206, 235, 11, 5, 206, 226, 11, 5, 206, + 225, 11, 5, 206, 230, 11, 5, 206, 229, 11, 5, 206, 227, 11, 5, 206, 228, + 11, 5, 213, 86, 11, 5, 213, 85, 11, 5, 213, 88, 11, 5, 213, 87, 11, 5, + 213, 77, 11, 5, 213, 79, 11, 5, 213, 78, 11, 5, 213, 81, 11, 5, 213, 80, + 11, 5, 213, 84, 11, 5, 213, 83, 11, 5, 213, 71, 11, 5, 213, 70, 11, 5, + 213, 76, 11, 5, 213, 74, 11, 5, 213, 72, 11, 5, 213, 73, 11, 5, 213, 65, + 11, 5, 213, 64, 11, 5, 213, 69, 11, 5, 213, 68, 11, 5, 213, 66, 11, 5, + 213, 67, 11, 5, 204, 22, 11, 5, 204, 17, 11, 5, 204, 64, 11, 5, 204, 35, + 11, 5, 203, 152, 11, 5, 203, 154, 11, 5, 203, 153, 11, 5, 203, 179, 11, + 5, 203, 174, 11, 5, 203, 211, 11, 5, 203, 199, 11, 5, 203, 246, 11, 5, + 203, 239, 11, 5, 204, 12, 11, 5, 203, 255, 11, 5, 203, 148, 11, 5, 203, + 145, 11, 5, 203, 164, 11, 5, 203, 151, 11, 5, 203, 149, 11, 5, 203, 150, + 11, 5, 203, 128, 11, 5, 203, 127, 11, 5, 203, 134, 11, 5, 203, 131, 11, + 5, 203, 129, 11, 5, 203, 130, 11, 5, 208, 22, 11, 5, 208, 16, 11, 5, 167, + 11, 5, 208, 28, 11, 5, 206, 188, 11, 5, 206, 190, 11, 5, 206, 189, 11, 5, + 207, 17, 11, 5, 207, 5, 11, 5, 207, 55, 11, 5, 207, 21, 11, 5, 207, 161, + 11, 5, 208, 7, 11, 5, 207, 203, 11, 5, 206, 180, 11, 5, 206, 177, 11, 5, + 206, 218, 11, 5, 206, 187, 11, 5, 206, 183, 11, 5, 206, 184, 11, 5, 206, + 162, 11, 5, 206, 161, 11, 5, 206, 167, 11, 5, 206, 165, 11, 5, 206, 163, + 11, 5, 206, 164, 11, 5, 223, 8, 11, 5, 223, 7, 11, 5, 223, 20, 11, 5, + 223, 9, 11, 5, 223, 16, 11, 5, 223, 15, 11, 5, 223, 18, 11, 5, 223, 17, + 11, 5, 222, 202, 11, 5, 222, 201, 11, 5, 222, 204, 11, 5, 222, 203, 11, + 5, 222, 220, 11, 5, 222, 218, 11, 5, 222, 233, 11, 5, 222, 222, 11, 5, + 222, 195, 11, 5, 222, 193, 11, 5, 222, 214, 11, 5, 222, 200, 11, 5, 222, + 197, 11, 5, 222, 198, 11, 5, 222, 187, 11, 5, 222, 186, 11, 5, 222, 191, + 11, 5, 222, 190, 11, 5, 222, 188, 11, 5, 222, 189, 11, 5, 208, 193, 11, + 5, 208, 191, 11, 5, 208, 201, 11, 5, 208, 194, 11, 5, 208, 198, 11, 5, + 208, 197, 11, 5, 208, 200, 11, 5, 208, 199, 11, 5, 208, 143, 11, 5, 208, + 140, 11, 5, 208, 145, 11, 5, 208, 144, 11, 5, 208, 180, 11, 5, 208, 179, + 11, 5, 208, 189, 11, 5, 208, 183, 11, 5, 208, 135, 11, 5, 208, 131, 11, + 5, 208, 177, 11, 5, 208, 139, 11, 5, 208, 137, 11, 5, 208, 138, 11, 5, + 208, 115, 11, 5, 208, 113, 11, 5, 208, 125, 11, 5, 208, 118, 11, 5, 208, + 116, 11, 5, 208, 117, 11, 5, 222, 253, 11, 5, 222, 252, 11, 5, 223, 3, + 11, 5, 222, 254, 11, 5, 223, 0, 11, 5, 222, 255, 11, 5, 223, 2, 11, 5, + 223, 1, 11, 5, 222, 244, 11, 5, 222, 246, 11, 5, 222, 245, 11, 5, 222, + 249, 11, 5, 222, 248, 11, 5, 222, 251, 11, 5, 222, 250, 11, 5, 222, 240, + 11, 5, 222, 239, 11, 5, 222, 247, 11, 5, 222, 243, 11, 5, 222, 241, 11, + 5, 222, 242, 11, 5, 222, 236, 11, 5, 222, 235, 11, 5, 222, 238, 11, 5, + 222, 237, 11, 5, 213, 233, 11, 5, 213, 232, 11, 5, 213, 240, 11, 5, 213, + 234, 11, 5, 213, 236, 11, 5, 213, 235, 11, 5, 213, 239, 11, 5, 213, 237, + 11, 5, 213, 222, 11, 5, 213, 223, 11, 5, 213, 228, 11, 5, 213, 227, 11, + 5, 213, 231, 11, 5, 213, 229, 11, 5, 213, 217, 11, 5, 213, 226, 11, 5, + 213, 221, 11, 5, 213, 218, 11, 5, 213, 219, 11, 5, 213, 212, 11, 5, 213, + 211, 11, 5, 213, 216, 11, 5, 213, 215, 11, 5, 213, 213, 11, 5, 213, 214, + 11, 5, 212, 168, 11, 5, 212, 167, 11, 5, 212, 181, 11, 5, 212, 172, 11, + 5, 212, 177, 11, 5, 212, 176, 11, 5, 212, 179, 11, 5, 212, 178, 11, 5, + 212, 153, 11, 5, 212, 155, 11, 5, 212, 154, 11, 5, 212, 160, 11, 5, 212, + 159, 11, 5, 212, 165, 11, 5, 212, 161, 11, 5, 212, 151, 11, 5, 212, 149, + 11, 5, 212, 158, 11, 5, 212, 152, 11, 5, 193, 187, 11, 5, 193, 186, 11, + 5, 193, 196, 11, 5, 193, 189, 11, 5, 193, 191, 11, 5, 193, 190, 11, 5, + 193, 193, 11, 5, 193, 192, 11, 5, 193, 175, 11, 5, 193, 176, 11, 5, 193, + 180, 11, 5, 193, 179, 11, 5, 193, 185, 11, 5, 193, 183, 11, 5, 193, 152, + 11, 5, 193, 150, 11, 5, 193, 165, 11, 5, 193, 155, 11, 5, 193, 153, 11, + 5, 193, 154, 11, 5, 193, 7, 11, 5, 193, 5, 11, 5, 193, 22, 11, 5, 193, 8, + 11, 5, 193, 16, 11, 5, 193, 15, 11, 5, 193, 19, 11, 5, 193, 17, 11, 5, + 192, 187, 11, 5, 192, 186, 11, 5, 192, 190, 11, 5, 192, 188, 11, 5, 192, + 229, 11, 5, 192, 224, 11, 5, 193, 1, 11, 5, 192, 234, 11, 5, 192, 178, + 11, 5, 192, 174, 11, 5, 192, 214, 11, 5, 192, 185, 11, 5, 192, 181, 11, + 5, 192, 182, 11, 5, 192, 158, 11, 5, 192, 157, 11, 5, 192, 165, 11, 5, + 192, 161, 11, 5, 192, 159, 11, 5, 192, 160, 11, 48, 208, 180, 11, 48, + 219, 209, 11, 48, 221, 158, 11, 48, 212, 172, 11, 48, 238, 104, 11, 48, + 202, 59, 11, 48, 231, 103, 11, 48, 231, 135, 11, 48, 216, 175, 11, 48, + 228, 126, 11, 48, 218, 243, 11, 48, 248, 131, 11, 48, 216, 27, 11, 48, + 193, 1, 11, 48, 209, 17, 11, 48, 228, 120, 11, 48, 200, 105, 11, 48, 231, + 233, 11, 48, 191, 244, 11, 48, 238, 98, 11, 48, 237, 121, 11, 48, 247, + 89, 11, 48, 231, 99, 11, 48, 212, 161, 11, 48, 198, 45, 11, 48, 211, 185, + 11, 48, 222, 240, 11, 48, 192, 3, 11, 48, 208, 251, 11, 48, 229, 85, 11, + 48, 193, 7, 11, 48, 194, 218, 11, 48, 203, 134, 11, 48, 196, 111, 11, 48, + 192, 112, 11, 48, 222, 233, 11, 48, 212, 125, 11, 48, 222, 238, 11, 48, + 230, 231, 11, 48, 223, 2, 11, 48, 194, 36, 11, 48, 235, 62, 11, 48, 203, + 150, 11, 48, 219, 203, 11, 48, 238, 110, 11, 48, 238, 151, 11, 48, 242, + 132, 11, 48, 228, 123, 11, 48, 204, 22, 11, 48, 191, 243, 11, 48, 203, + 199, 11, 48, 242, 245, 11, 48, 191, 213, 11, 48, 215, 26, 11, 48, 222, + 57, 219, 152, 1, 249, 3, 219, 152, 1, 166, 219, 152, 1, 210, 94, 219, + 152, 1, 238, 0, 219, 152, 1, 189, 219, 152, 1, 199, 240, 219, 152, 1, + 231, 233, 219, 152, 1, 160, 219, 152, 1, 221, 250, 219, 152, 1, 223, 62, + 219, 152, 1, 247, 19, 219, 152, 1, 246, 117, 219, 152, 1, 235, 17, 219, + 152, 1, 198, 118, 219, 152, 1, 198, 108, 219, 152, 1, 172, 219, 152, 1, + 181, 219, 152, 1, 177, 219, 152, 1, 188, 219, 152, 1, 192, 71, 219, 152, + 1, 192, 112, 219, 152, 1, 214, 165, 219, 152, 1, 144, 219, 152, 1, 193, + 209, 219, 152, 1, 229, 187, 219, 152, 1, 233, 97, 219, 152, 1, 194, 169, + 219, 152, 1, 204, 64, 219, 152, 1, 168, 219, 152, 1, 231, 84, 219, 152, + 1, 64, 219, 152, 1, 251, 108, 219, 152, 1, 71, 219, 152, 1, 233, 230, + 219, 152, 1, 70, 219, 152, 1, 74, 219, 152, 1, 68, 219, 152, 1, 197, 104, + 219, 152, 1, 197, 97, 219, 152, 1, 212, 0, 219, 152, 1, 158, 215, 158, + 199, 128, 219, 152, 1, 158, 215, 97, 209, 198, 219, 152, 1, 158, 215, + 158, 238, 109, 219, 152, 1, 158, 215, 158, 247, 220, 219, 152, 1, 158, + 215, 158, 181, 219, 152, 1, 158, 215, 158, 223, 29, 219, 152, 209, 38, + 242, 38, 219, 152, 209, 38, 232, 71, 201, 238, 56, 5, 234, 171, 56, 5, + 234, 167, 56, 5, 229, 225, 56, 5, 194, 100, 56, 5, 194, 99, 56, 5, 210, + 168, 56, 5, 248, 48, 56, 5, 248, 108, 56, 5, 217, 74, 56, 5, 221, 64, 56, + 5, 216, 207, 56, 5, 231, 171, 56, 5, 233, 40, 56, 5, 196, 118, 56, 5, + 200, 56, 56, 5, 199, 222, 56, 5, 237, 30, 56, 5, 237, 27, 56, 5, 220, 32, + 56, 5, 207, 234, 56, 5, 237, 101, 56, 5, 214, 246, 56, 5, 205, 205, 56, + 5, 204, 10, 56, 5, 192, 82, 56, 5, 192, 61, 56, 5, 246, 150, 56, 5, 223, + 39, 56, 5, 213, 247, 56, 5, 193, 66, 56, 5, 222, 48, 56, 5, 214, 138, 56, + 5, 231, 150, 56, 5, 217, 29, 56, 5, 214, 203, 56, 5, 212, 189, 56, 5, 70, + 56, 5, 223, 190, 56, 5, 229, 178, 56, 5, 229, 148, 56, 5, 194, 72, 56, 5, + 194, 54, 56, 5, 210, 51, 56, 5, 248, 46, 56, 5, 248, 41, 56, 5, 217, 67, + 56, 5, 221, 61, 56, 5, 216, 204, 56, 5, 231, 167, 56, 5, 233, 11, 56, 5, + 196, 39, 56, 5, 199, 128, 56, 5, 199, 202, 56, 5, 237, 22, 56, 5, 237, + 26, 56, 5, 219, 209, 56, 5, 207, 151, 56, 5, 237, 16, 56, 5, 214, 240, + 56, 5, 203, 125, 56, 5, 203, 236, 56, 5, 192, 30, 56, 5, 192, 57, 56, 5, + 242, 149, 56, 5, 223, 20, 56, 5, 213, 240, 56, 5, 193, 22, 56, 5, 221, + 204, 56, 5, 214, 130, 56, 5, 231, 46, 56, 5, 216, 175, 56, 5, 214, 60, + 56, 5, 212, 181, 56, 5, 64, 56, 5, 250, 224, 56, 5, 214, 160, 56, 5, 144, + 56, 5, 230, 65, 56, 5, 194, 169, 56, 5, 194, 149, 56, 5, 166, 56, 5, 248, + 54, 56, 5, 249, 3, 56, 5, 217, 82, 56, 5, 221, 69, 56, 5, 221, 67, 56, 5, + 216, 211, 56, 5, 231, 175, 56, 5, 233, 97, 56, 5, 196, 157, 56, 5, 189, + 56, 5, 199, 240, 56, 5, 237, 40, 56, 5, 237, 29, 56, 5, 177, 56, 5, 167, + 56, 5, 238, 0, 56, 5, 214, 255, 56, 5, 188, 56, 5, 204, 64, 56, 5, 192, + 112, 56, 5, 192, 71, 56, 5, 247, 19, 56, 5, 223, 62, 56, 5, 214, 0, 56, + 5, 168, 56, 5, 160, 56, 5, 222, 121, 56, 5, 214, 144, 56, 5, 231, 233, + 56, 5, 172, 56, 5, 181, 56, 5, 212, 201, 56, 5, 211, 194, 56, 5, 211, + 189, 56, 5, 229, 16, 56, 5, 194, 17, 56, 5, 194, 13, 56, 5, 209, 172, 56, + 5, 248, 44, 56, 5, 247, 206, 56, 5, 217, 62, 56, 5, 221, 59, 56, 5, 216, + 200, 56, 5, 231, 163, 56, 5, 232, 152, 56, 5, 195, 236, 56, 5, 198, 254, + 56, 5, 199, 170, 56, 5, 237, 19, 56, 5, 237, 24, 56, 5, 219, 73, 56, 5, + 207, 28, 56, 5, 236, 120, 56, 5, 214, 227, 56, 5, 202, 183, 56, 5, 203, + 203, 56, 5, 192, 5, 56, 5, 192, 52, 56, 5, 238, 239, 56, 5, 222, 223, 56, + 5, 213, 230, 56, 5, 192, 235, 56, 5, 221, 88, 56, 5, 214, 128, 56, 5, + 230, 242, 56, 5, 216, 35, 56, 5, 213, 125, 56, 5, 212, 162, 56, 5, 68, + 56, 5, 197, 77, 56, 5, 228, 181, 56, 5, 228, 164, 56, 5, 193, 244, 56, 5, + 193, 237, 56, 5, 209, 51, 56, 5, 248, 43, 56, 5, 247, 124, 56, 5, 217, + 61, 56, 5, 221, 57, 56, 5, 216, 199, 56, 5, 231, 162, 56, 5, 232, 77, 56, + 5, 194, 223, 56, 5, 198, 45, 56, 5, 199, 148, 56, 5, 237, 17, 56, 5, 237, + 23, 56, 5, 219, 36, 56, 5, 206, 218, 56, 5, 235, 62, 56, 5, 214, 222, 56, + 5, 201, 184, 56, 5, 203, 164, 56, 5, 191, 252, 56, 5, 192, 48, 56, 5, + 238, 162, 56, 5, 222, 214, 56, 5, 213, 226, 56, 5, 192, 214, 56, 5, 221, + 33, 56, 5, 214, 127, 56, 5, 230, 186, 56, 5, 215, 241, 56, 5, 213, 22, + 56, 5, 212, 158, 56, 5, 74, 56, 5, 211, 211, 56, 5, 214, 86, 56, 5, 229, + 43, 56, 5, 229, 19, 56, 5, 194, 36, 56, 5, 194, 18, 56, 5, 209, 198, 56, + 5, 248, 45, 56, 5, 247, 220, 56, 5, 217, 63, 56, 5, 221, 60, 56, 5, 216, + 202, 56, 5, 231, 165, 56, 5, 231, 164, 56, 5, 232, 164, 56, 5, 195, 252, + 56, 5, 155, 56, 5, 199, 176, 56, 5, 237, 20, 56, 5, 237, 25, 56, 5, 219, + 107, 56, 5, 207, 55, 56, 5, 236, 146, 56, 5, 214, 231, 56, 5, 202, 212, + 56, 5, 203, 211, 56, 5, 192, 8, 56, 5, 192, 54, 56, 5, 242, 63, 56, 5, + 222, 233, 56, 5, 213, 231, 56, 5, 193, 1, 56, 5, 221, 113, 56, 5, 214, + 129, 56, 5, 230, 254, 56, 5, 216, 91, 56, 5, 213, 142, 56, 5, 212, 165, + 56, 5, 71, 56, 5, 234, 88, 56, 5, 214, 149, 56, 5, 229, 255, 56, 5, 229, + 208, 56, 5, 194, 111, 56, 5, 194, 94, 56, 5, 210, 181, 56, 5, 248, 49, + 56, 5, 248, 123, 56, 5, 217, 75, 56, 5, 221, 65, 56, 5, 221, 63, 56, 5, + 216, 208, 56, 5, 231, 172, 56, 5, 231, 170, 56, 5, 233, 47, 56, 5, 196, + 123, 56, 5, 200, 79, 56, 5, 199, 224, 56, 5, 237, 31, 56, 5, 237, 28, 56, + 5, 220, 42, 56, 5, 208, 7, 56, 5, 237, 116, 56, 5, 214, 247, 56, 5, 205, + 223, 56, 5, 204, 12, 56, 5, 192, 85, 56, 5, 192, 62, 56, 5, 246, 158, 56, + 5, 223, 41, 56, 5, 213, 249, 56, 5, 193, 69, 56, 5, 222, 57, 56, 5, 214, + 139, 56, 5, 214, 135, 56, 5, 231, 158, 56, 5, 231, 144, 56, 5, 217, 48, + 56, 5, 214, 214, 56, 5, 212, 190, 56, 5, 214, 167, 56, 5, 219, 250, 56, + 242, 38, 56, 232, 71, 201, 238, 56, 208, 159, 77, 56, 5, 214, 230, 233, + 97, 56, 5, 214, 230, 160, 56, 5, 214, 230, 202, 183, 56, 16, 233, 36, 56, + 16, 222, 46, 56, 16, 199, 78, 56, 16, 214, 27, 56, 16, 248, 201, 56, 16, + 233, 96, 56, 16, 200, 174, 56, 16, 237, 206, 56, 16, 236, 119, 56, 16, + 221, 10, 56, 16, 199, 2, 56, 16, 236, 145, 56, 16, 222, 224, 56, 17, 192, + 76, 56, 17, 101, 56, 17, 104, 56, 17, 133, 56, 17, 134, 56, 17, 151, 56, + 17, 170, 56, 17, 179, 56, 17, 174, 56, 17, 182, 56, 5, 214, 230, 172, 56, + 5, 214, 230, 236, 146, 42, 6, 1, 192, 80, 42, 2, 1, 192, 80, 42, 6, 1, + 235, 12, 42, 2, 1, 235, 12, 42, 6, 1, 207, 168, 235, 14, 42, 2, 1, 207, + 168, 235, 14, 42, 6, 1, 223, 111, 42, 2, 1, 223, 111, 42, 6, 1, 236, 163, + 42, 2, 1, 236, 163, 42, 6, 1, 216, 43, 197, 92, 42, 2, 1, 216, 43, 197, + 92, 42, 6, 1, 247, 138, 211, 216, 42, 2, 1, 247, 138, 211, 216, 42, 6, 1, + 214, 179, 193, 51, 42, 2, 1, 214, 179, 193, 51, 42, 6, 1, 193, 48, 4, + 248, 253, 193, 51, 42, 2, 1, 193, 48, 4, 248, 253, 193, 51, 42, 6, 1, + 223, 109, 193, 84, 42, 2, 1, 223, 109, 193, 84, 42, 6, 1, 207, 168, 192, + 214, 42, 2, 1, 207, 168, 192, 214, 42, 6, 1, 223, 109, 64, 42, 2, 1, 223, + 109, 64, 42, 6, 1, 242, 84, 219, 147, 192, 179, 42, 2, 1, 242, 84, 219, + 147, 192, 179, 42, 6, 1, 247, 240, 192, 179, 42, 2, 1, 247, 240, 192, + 179, 42, 6, 1, 223, 109, 242, 84, 219, 147, 192, 179, 42, 2, 1, 223, 109, + 242, 84, 219, 147, 192, 179, 42, 6, 1, 193, 3, 42, 2, 1, 193, 3, 42, 6, + 1, 207, 168, 198, 112, 42, 2, 1, 207, 168, 198, 112, 42, 6, 1, 202, 198, + 237, 116, 42, 2, 1, 202, 198, 237, 116, 42, 6, 1, 202, 198, 234, 124, 42, + 2, 1, 202, 198, 234, 124, 42, 6, 1, 202, 198, 234, 99, 42, 2, 1, 202, + 198, 234, 99, 42, 6, 1, 216, 47, 74, 42, 2, 1, 216, 47, 74, 42, 6, 1, + 248, 17, 74, 42, 2, 1, 248, 17, 74, 42, 6, 1, 55, 216, 47, 74, 42, 2, 1, + 55, 216, 47, 74, 42, 1, 215, 217, 74, 38, 42, 194, 204, 38, 42, 200, 31, + 216, 124, 57, 38, 42, 228, 163, 216, 124, 57, 38, 42, 199, 165, 216, 124, + 57, 203, 2, 250, 37, 38, 42, 1, 197, 89, 223, 251, 38, 42, 1, 70, 38, 42, + 1, 193, 22, 38, 42, 1, 68, 38, 42, 1, 230, 26, 57, 38, 42, 1, 193, 47, + 38, 42, 1, 202, 198, 57, 38, 42, 1, 211, 216, 38, 42, 222, 69, 38, 42, + 210, 188, 42, 222, 69, 42, 210, 188, 42, 6, 1, 235, 27, 42, 2, 1, 235, + 27, 42, 6, 1, 235, 3, 42, 2, 1, 235, 3, 42, 6, 1, 192, 38, 42, 2, 1, 192, + 38, 42, 6, 1, 246, 174, 42, 2, 1, 246, 174, 42, 6, 1, 234, 255, 42, 2, 1, + 234, 255, 42, 6, 1, 200, 80, 4, 85, 128, 42, 2, 1, 200, 80, 4, 85, 128, + 42, 6, 1, 197, 248, 42, 2, 1, 197, 248, 42, 6, 1, 198, 87, 42, 2, 1, 198, + 87, 42, 6, 1, 198, 92, 42, 2, 1, 198, 92, 42, 6, 1, 200, 85, 42, 2, 1, + 200, 85, 42, 6, 1, 228, 144, 42, 2, 1, 228, 144, 42, 6, 1, 203, 140, 42, + 2, 1, 203, 140, 42, 6, 1, 55, 74, 42, 2, 1, 55, 74, 42, 6, 1, 238, 180, + 74, 42, 2, 1, 238, 180, 74, 73, 1, 42, 230, 26, 57, 73, 1, 42, 202, 198, + 57, 38, 42, 1, 234, 164, 38, 42, 1, 223, 109, 71, 25, 1, 64, 25, 1, 160, + 25, 1, 68, 25, 1, 221, 33, 25, 1, 234, 171, 25, 1, 207, 234, 25, 1, 200, + 157, 25, 1, 74, 25, 1, 212, 181, 25, 1, 70, 25, 1, 177, 25, 1, 166, 25, + 1, 207, 88, 25, 1, 207, 136, 25, 1, 220, 31, 25, 1, 217, 28, 25, 1, 200, + 174, 25, 1, 214, 253, 25, 1, 213, 254, 25, 1, 218, 236, 25, 1, 201, 86, + 25, 1, 215, 241, 25, 1, 203, 231, 25, 1, 203, 125, 25, 1, 203, 241, 25, + 1, 204, 147, 25, 1, 220, 208, 25, 1, 222, 20, 25, 1, 212, 246, 25, 1, + 213, 22, 25, 1, 213, 225, 25, 1, 192, 232, 25, 1, 203, 164, 25, 1, 192, + 183, 25, 1, 168, 25, 1, 213, 59, 25, 1, 222, 6, 25, 1, 210, 98, 25, 1, + 213, 247, 25, 1, 213, 39, 25, 1, 209, 42, 25, 1, 193, 241, 25, 1, 210, + 168, 25, 1, 233, 40, 25, 1, 206, 218, 25, 1, 219, 36, 25, 1, 216, 175, + 25, 1, 214, 60, 25, 1, 207, 170, 25, 1, 208, 53, 25, 1, 222, 30, 25, 1, + 214, 93, 25, 1, 214, 144, 25, 1, 214, 165, 25, 1, 203, 211, 25, 1, 209, + 47, 25, 1, 232, 77, 25, 1, 232, 157, 25, 1, 194, 169, 25, 1, 181, 25, 1, + 219, 209, 25, 1, 210, 51, 25, 1, 219, 65, 25, 1, 221, 113, 25, 1, 217, + 72, 25, 1, 207, 205, 25, 1, 217, 5, 25, 1, 172, 25, 1, 199, 128, 25, 1, + 221, 204, 25, 1, 216, 91, 25, 1, 217, 80, 25, 1, 200, 8, 25, 1, 221, 69, + 25, 1, 200, 30, 25, 1, 213, 25, 25, 1, 206, 48, 25, 1, 233, 93, 25, 1, + 221, 72, 25, 1, 221, 104, 25, 38, 122, 221, 81, 25, 38, 122, 198, 30, 25, + 213, 253, 25, 232, 71, 201, 238, 25, 242, 47, 25, 242, 38, 25, 204, 180, + 25, 208, 159, 77, 73, 1, 242, 200, 158, 193, 11, 209, 255, 73, 1, 242, + 200, 158, 193, 96, 209, 255, 73, 1, 242, 200, 158, 193, 11, 204, 36, 73, + 1, 242, 200, 158, 193, 96, 204, 36, 73, 1, 242, 200, 158, 193, 11, 208, + 177, 73, 1, 242, 200, 158, 193, 96, 208, 177, 73, 1, 242, 200, 158, 193, + 11, 206, 218, 73, 1, 242, 200, 158, 193, 96, 206, 218, 73, 1, 233, 188, + 235, 111, 158, 161, 73, 1, 139, 235, 111, 158, 161, 73, 1, 216, 162, 235, + 111, 158, 161, 73, 1, 132, 235, 111, 158, 161, 73, 1, 233, 187, 235, 111, + 158, 161, 73, 1, 233, 188, 235, 111, 220, 20, 158, 161, 73, 1, 139, 235, + 111, 220, 20, 158, 161, 73, 1, 216, 162, 235, 111, 220, 20, 158, 161, 73, + 1, 132, 235, 111, 220, 20, 158, 161, 73, 1, 233, 187, 235, 111, 220, 20, + 158, 161, 73, 1, 233, 188, 220, 20, 158, 161, 73, 1, 139, 220, 20, 158, + 161, 73, 1, 216, 162, 220, 20, 158, 161, 73, 1, 132, 220, 20, 158, 161, + 73, 1, 233, 187, 220, 20, 158, 161, 73, 1, 78, 84, 161, 73, 1, 78, 203, + 4, 73, 1, 78, 229, 5, 161, 73, 1, 106, 51, 238, 224, 250, 207, 73, 1, + 208, 39, 130, 54, 73, 1, 208, 39, 142, 54, 73, 1, 208, 39, 233, 204, 77, + 73, 1, 208, 39, 223, 121, 233, 204, 77, 73, 1, 132, 223, 121, 233, 204, + 77, 73, 1, 201, 218, 26, 139, 199, 18, 73, 1, 201, 218, 26, 132, 199, 18, + 8, 6, 1, 234, 159, 251, 26, 8, 2, 1, 234, 159, 251, 26, 8, 6, 1, 234, + 159, 251, 57, 8, 2, 1, 234, 159, 251, 57, 8, 6, 1, 229, 206, 8, 2, 1, + 229, 206, 8, 6, 1, 197, 192, 8, 2, 1, 197, 192, 8, 6, 1, 198, 189, 8, 2, + 1, 198, 189, 8, 6, 1, 238, 159, 8, 2, 1, 238, 159, 8, 6, 1, 238, 160, 4, + 242, 38, 8, 2, 1, 238, 160, 4, 242, 38, 8, 1, 2, 6, 233, 163, 8, 1, 2, 6, + 206, 158, 8, 6, 1, 252, 33, 8, 2, 1, 252, 33, 8, 6, 1, 250, 166, 8, 2, 1, + 250, 166, 8, 6, 1, 250, 8, 8, 2, 1, 250, 8, 8, 6, 1, 249, 247, 8, 2, 1, + 249, 247, 8, 6, 1, 249, 248, 4, 229, 5, 161, 8, 2, 1, 249, 248, 4, 229, + 5, 161, 8, 6, 1, 249, 236, 8, 2, 1, 249, 236, 8, 6, 1, 207, 168, 247, 53, + 4, 236, 114, 8, 2, 1, 207, 168, 247, 53, 4, 236, 114, 8, 6, 1, 222, 185, + 4, 111, 8, 2, 1, 222, 185, 4, 111, 8, 6, 1, 222, 185, 4, 237, 11, 111, 8, + 2, 1, 222, 185, 4, 237, 11, 111, 8, 6, 1, 222, 185, 4, 201, 208, 26, 237, + 11, 111, 8, 2, 1, 222, 185, 4, 201, 208, 26, 237, 11, 111, 8, 6, 1, 247, + 136, 165, 8, 2, 1, 247, 136, 165, 8, 6, 1, 220, 202, 4, 139, 111, 8, 2, + 1, 220, 202, 4, 139, 111, 8, 6, 1, 185, 4, 184, 201, 208, 211, 110, 8, 2, + 1, 185, 4, 184, 201, 208, 211, 110, 8, 6, 1, 185, 4, 219, 69, 8, 2, 1, + 185, 4, 219, 69, 8, 6, 1, 211, 194, 8, 2, 1, 211, 194, 8, 6, 1, 211, 94, + 4, 201, 208, 199, 151, 237, 59, 8, 2, 1, 211, 94, 4, 201, 208, 199, 151, + 237, 59, 8, 6, 1, 211, 94, 4, 232, 177, 8, 2, 1, 211, 94, 4, 232, 177, 8, + 6, 1, 211, 94, 4, 202, 98, 200, 147, 8, 2, 1, 211, 94, 4, 202, 98, 200, + 147, 8, 6, 1, 208, 248, 4, 201, 208, 199, 151, 237, 59, 8, 2, 1, 208, + 248, 4, 201, 208, 199, 151, 237, 59, 8, 6, 1, 208, 248, 4, 237, 11, 111, + 8, 2, 1, 208, 248, 4, 237, 11, 111, 8, 6, 1, 208, 112, 207, 10, 8, 2, 1, + 208, 112, 207, 10, 8, 6, 1, 206, 199, 207, 10, 8, 2, 1, 206, 199, 207, + 10, 8, 6, 1, 196, 237, 4, 237, 11, 111, 8, 2, 1, 196, 237, 4, 237, 11, + 111, 8, 6, 1, 194, 210, 8, 2, 1, 194, 210, 8, 6, 1, 196, 4, 192, 155, 8, + 2, 1, 196, 4, 192, 155, 8, 6, 1, 199, 169, 4, 111, 8, 2, 1, 199, 169, 4, + 111, 8, 6, 1, 199, 169, 4, 201, 208, 199, 151, 237, 59, 8, 2, 1, 199, + 169, 4, 201, 208, 199, 151, 237, 59, 8, 6, 1, 196, 112, 8, 2, 1, 196, + 112, 8, 6, 1, 233, 242, 8, 2, 1, 233, 242, 8, 6, 1, 223, 96, 8, 2, 1, + 223, 96, 8, 6, 1, 239, 21, 8, 2, 1, 239, 21, 73, 1, 197, 10, 8, 2, 1, + 235, 51, 8, 2, 1, 219, 19, 8, 2, 1, 215, 210, 8, 2, 1, 212, 237, 8, 2, 1, + 206, 198, 8, 1, 2, 6, 206, 198, 8, 2, 1, 198, 27, 8, 2, 1, 197, 84, 8, 6, + 1, 223, 143, 238, 95, 8, 2, 1, 223, 143, 238, 95, 8, 6, 1, 223, 143, 233, + 163, 8, 2, 1, 223, 143, 233, 163, 8, 6, 1, 223, 143, 232, 44, 8, 6, 1, + 163, 223, 143, 232, 44, 8, 2, 1, 163, 223, 143, 232, 44, 8, 6, 1, 163, + 165, 8, 2, 1, 163, 165, 8, 6, 1, 223, 143, 150, 8, 2, 1, 223, 143, 150, + 8, 6, 1, 223, 143, 206, 158, 8, 2, 1, 223, 143, 206, 158, 8, 6, 1, 223, + 143, 200, 228, 8, 2, 1, 223, 143, 200, 228, 73, 1, 132, 242, 122, 251, + 143, 73, 1, 242, 47, 73, 1, 203, 195, 234, 30, 57, 8, 6, 1, 206, 53, 8, + 2, 1, 206, 53, 8, 6, 1, 163, 230, 124, 8, 2, 1, 220, 202, 4, 207, 174, + 229, 15, 26, 248, 82, 8, 1, 203, 67, 236, 114, 8, 6, 1, 215, 152, 4, 237, + 59, 8, 2, 1, 215, 152, 4, 237, 59, 8, 6, 1, 247, 53, 4, 161, 8, 2, 1, + 247, 53, 4, 161, 8, 2, 1, 247, 53, 4, 211, 49, 128, 8, 2, 1, 230, 125, 4, + 211, 49, 128, 8, 6, 1, 76, 4, 232, 177, 8, 2, 1, 76, 4, 232, 177, 8, 6, + 1, 233, 164, 4, 111, 8, 2, 1, 233, 164, 4, 111, 8, 6, 1, 195, 243, 251, + 108, 8, 2, 1, 195, 243, 251, 108, 8, 6, 1, 195, 243, 212, 0, 8, 2, 1, + 195, 243, 212, 0, 8, 6, 1, 195, 243, 197, 104, 8, 2, 1, 195, 243, 197, + 104, 8, 6, 1, 232, 45, 4, 212, 18, 111, 8, 2, 1, 232, 45, 4, 212, 18, + 111, 8, 6, 1, 222, 185, 4, 212, 18, 111, 8, 2, 1, 222, 185, 4, 212, 18, + 111, 8, 6, 1, 215, 152, 4, 212, 18, 111, 8, 2, 1, 215, 152, 4, 212, 18, + 111, 8, 6, 1, 208, 112, 4, 212, 18, 111, 8, 2, 1, 208, 112, 4, 212, 18, + 111, 8, 6, 1, 206, 159, 4, 212, 18, 111, 8, 2, 1, 206, 159, 4, 212, 18, + 111, 8, 6, 1, 230, 125, 4, 128, 8, 6, 1, 207, 168, 211, 184, 71, 8, 6, 1, + 27, 232, 44, 8, 6, 1, 220, 202, 4, 248, 82, 8, 6, 1, 2, 6, 70, 8, 1, 2, + 6, 208, 247, 8, 6, 1, 163, 222, 184, 8, 6, 1, 163, 200, 228, 8, 6, 1, + 223, 66, 4, 238, 178, 8, 6, 1, 242, 215, 8, 6, 1, 248, 63, 8, 2, 1, 248, + 63, 8, 6, 1, 211, 216, 8, 2, 1, 211, 216, 8, 6, 1, 124, 4, 111, 8, 2, 1, + 124, 4, 111, 8, 6, 1, 231, 6, 64, 8, 2, 1, 231, 6, 64, 8, 6, 1, 231, 6, + 70, 8, 2, 1, 231, 6, 70, 8, 6, 1, 231, 6, 68, 8, 2, 1, 231, 6, 68, 8, 6, + 1, 250, 204, 194, 202, 8, 2, 1, 250, 204, 194, 202, 8, 6, 1, 247, 53, 4, + 211, 49, 128, 8, 6, 1, 206, 159, 4, 128, 8, 6, 1, 192, 156, 4, 211, 49, + 128, 8, 6, 1, 238, 96, 4, 203, 195, 201, 208, 211, 110, 8, 2, 1, 238, 96, + 4, 203, 195, 201, 208, 211, 110, 8, 6, 1, 206, 159, 4, 203, 195, 201, + 208, 211, 110, 8, 2, 1, 206, 159, 4, 203, 195, 201, 208, 211, 110, 8, 6, + 1, 207, 168, 138, 230, 124, 8, 2, 1, 207, 168, 138, 230, 124, 8, 234, 35, + 1, 203, 109, 70, 73, 1, 6, 230, 125, 4, 111, 73, 1, 2, 34, 212, 0, 8, 1, + 2, 6, 163, 218, 236, 8, 234, 35, 1, 207, 168, 233, 163, 8, 234, 35, 1, + 207, 168, 211, 93, 8, 234, 35, 1, 223, 121, 218, 236, 8, 234, 35, 1, 228, + 97, 219, 75, 8, 234, 35, 1, 250, 112, 218, 236, 201, 53, 215, 72, 1, 64, + 201, 53, 215, 72, 1, 70, 201, 53, 215, 72, 3, 235, 29, 201, 53, 215, 72, + 1, 68, 201, 53, 215, 72, 1, 71, 201, 53, 215, 72, 1, 74, 201, 53, 215, + 72, 3, 230, 20, 201, 53, 215, 72, 1, 221, 113, 201, 53, 215, 72, 1, 221, + 220, 201, 53, 215, 72, 1, 230, 254, 201, 53, 215, 72, 1, 231, 56, 201, + 53, 215, 72, 3, 250, 168, 201, 53, 215, 72, 1, 242, 63, 201, 53, 215, 72, + 1, 242, 188, 201, 53, 215, 72, 1, 222, 233, 201, 53, 215, 72, 1, 223, 22, + 201, 53, 215, 72, 1, 198, 60, 201, 53, 215, 72, 1, 198, 66, 201, 53, 215, + 72, 1, 237, 131, 201, 53, 215, 72, 1, 237, 140, 201, 53, 215, 72, 1, 155, + 201, 53, 215, 72, 1, 199, 176, 201, 53, 215, 72, 1, 236, 146, 201, 53, + 215, 72, 1, 237, 20, 201, 53, 215, 72, 1, 213, 142, 201, 53, 215, 72, 1, + 209, 198, 201, 53, 215, 72, 1, 210, 65, 201, 53, 215, 72, 1, 247, 220, + 201, 53, 215, 72, 1, 248, 45, 201, 53, 215, 72, 1, 216, 91, 201, 53, 215, + 72, 1, 207, 55, 201, 53, 215, 72, 1, 219, 107, 201, 53, 215, 72, 1, 206, + 245, 201, 53, 215, 72, 1, 202, 212, 201, 53, 215, 72, 1, 229, 43, 201, + 53, 215, 72, 18, 3, 64, 201, 53, 215, 72, 18, 3, 70, 201, 53, 215, 72, + 18, 3, 68, 201, 53, 215, 72, 18, 3, 71, 201, 53, 215, 72, 18, 3, 211, + 194, 201, 53, 215, 72, 209, 193, 217, 126, 201, 53, 215, 72, 209, 193, + 217, 125, 201, 53, 215, 72, 209, 193, 217, 124, 201, 53, 215, 72, 209, + 193, 217, 123, 201, 53, 215, 72, 3, 250, 249, 230, 20, 178, 223, 174, + 232, 109, 90, 208, 167, 178, 223, 174, 232, 109, 90, 230, 78, 178, 223, + 174, 232, 109, 112, 208, 165, 178, 223, 174, 232, 109, 90, 203, 33, 178, + 223, 174, 232, 109, 90, 234, 143, 178, 223, 174, 232, 109, 112, 203, 30, + 178, 223, 174, 208, 168, 77, 178, 223, 174, 209, 231, 77, 178, 223, 174, + 206, 186, 77, 178, 223, 174, 208, 169, 77, 210, 90, 1, 160, 210, 90, 1, + 221, 250, 210, 90, 1, 231, 233, 210, 90, 1, 214, 165, 210, 90, 1, 247, + 19, 210, 90, 1, 246, 117, 210, 90, 1, 223, 62, 210, 90, 1, 212, 201, 210, + 90, 1, 189, 210, 90, 1, 199, 240, 210, 90, 1, 238, 0, 210, 90, 1, 181, + 210, 90, 1, 166, 210, 90, 1, 210, 94, 210, 90, 1, 249, 3, 210, 90, 1, + 172, 210, 90, 1, 198, 118, 210, 90, 1, 198, 108, 210, 90, 1, 235, 17, + 210, 90, 1, 194, 169, 210, 90, 1, 192, 71, 210, 90, 1, 192, 112, 210, 90, + 1, 2, 64, 210, 90, 1, 168, 210, 90, 1, 167, 210, 90, 1, 177, 210, 90, 1, + 204, 64, 210, 90, 1, 188, 210, 90, 1, 144, 210, 90, 1, 64, 210, 90, 1, + 70, 210, 90, 1, 68, 210, 90, 1, 71, 210, 90, 1, 74, 210, 90, 1, 208, 239, + 210, 90, 1, 193, 209, 210, 90, 1, 233, 97, 210, 90, 1, 231, 120, 210, 90, + 1, 234, 171, 210, 90, 201, 164, 1, 194, 169, 210, 90, 201, 164, 1, 168, + 210, 90, 1, 198, 83, 210, 90, 1, 198, 71, 210, 90, 1, 237, 161, 210, 90, + 1, 213, 178, 210, 90, 1, 250, 249, 168, 210, 90, 1, 195, 247, 204, 64, + 210, 90, 1, 195, 248, 144, 210, 90, 1, 250, 44, 233, 97, 210, 90, 201, + 164, 1, 167, 210, 90, 201, 110, 1, 167, 210, 90, 1, 246, 234, 210, 90, + 203, 74, 229, 246, 77, 210, 90, 55, 229, 246, 77, 210, 90, 122, 204, 56, + 210, 90, 122, 55, 204, 56, 206, 9, 3, 250, 168, 206, 9, 3, 196, 6, 206, + 9, 1, 64, 206, 9, 1, 252, 33, 206, 9, 1, 70, 206, 9, 1, 223, 224, 206, 9, + 1, 68, 206, 9, 1, 196, 251, 206, 9, 1, 118, 150, 206, 9, 1, 118, 207, 4, + 206, 9, 1, 118, 165, 206, 9, 1, 118, 219, 138, 206, 9, 1, 71, 206, 9, 1, + 234, 171, 206, 9, 1, 251, 63, 206, 9, 1, 74, 206, 9, 1, 211, 194, 206, 9, + 1, 250, 8, 206, 9, 1, 160, 206, 9, 1, 221, 250, 206, 9, 1, 231, 233, 206, + 9, 1, 231, 84, 206, 9, 1, 214, 165, 206, 9, 1, 247, 19, 206, 9, 1, 246, + 117, 206, 9, 1, 223, 62, 206, 9, 1, 223, 28, 206, 9, 1, 212, 201, 206, 9, + 1, 198, 83, 206, 9, 1, 198, 71, 206, 9, 1, 237, 161, 206, 9, 1, 237, 145, + 206, 9, 1, 213, 178, 206, 9, 1, 189, 206, 9, 1, 199, 240, 206, 9, 1, 238, + 0, 206, 9, 1, 237, 40, 206, 9, 1, 181, 206, 9, 1, 166, 206, 9, 1, 210, + 94, 206, 9, 1, 249, 3, 206, 9, 1, 248, 54, 206, 9, 1, 172, 206, 9, 1, + 168, 206, 9, 1, 167, 206, 9, 1, 177, 206, 9, 1, 196, 157, 206, 9, 1, 204, + 64, 206, 9, 1, 202, 92, 206, 9, 1, 188, 206, 9, 1, 144, 206, 9, 1, 219, + 137, 206, 9, 116, 3, 230, 97, 206, 9, 18, 3, 252, 33, 206, 9, 18, 3, 70, + 206, 9, 18, 3, 223, 224, 206, 9, 18, 3, 68, 206, 9, 18, 3, 196, 251, 206, + 9, 18, 3, 118, 150, 206, 9, 18, 3, 118, 207, 4, 206, 9, 18, 3, 118, 165, + 206, 9, 18, 3, 118, 219, 138, 206, 9, 18, 3, 71, 206, 9, 18, 3, 234, 171, + 206, 9, 18, 3, 251, 63, 206, 9, 18, 3, 74, 206, 9, 18, 3, 211, 194, 206, + 9, 18, 3, 250, 8, 206, 9, 3, 196, 11, 206, 9, 3, 246, 234, 206, 9, 237, + 208, 206, 9, 55, 237, 208, 206, 9, 17, 192, 76, 206, 9, 17, 101, 206, 9, + 17, 104, 206, 9, 17, 133, 206, 9, 17, 134, 206, 9, 17, 151, 206, 9, 17, + 170, 206, 9, 17, 179, 206, 9, 17, 174, 206, 9, 17, 182, 38, 107, 17, 192, + 76, 38, 107, 17, 101, 38, 107, 17, 104, 38, 107, 17, 133, 38, 107, 17, + 134, 38, 107, 17, 151, 38, 107, 17, 170, 38, 107, 17, 179, 38, 107, 17, + 174, 38, 107, 17, 182, 38, 107, 1, 64, 38, 107, 1, 68, 38, 107, 1, 160, + 38, 107, 1, 181, 38, 107, 1, 166, 38, 107, 1, 167, 38, 107, 1, 196, 39, + 38, 107, 3, 249, 246, 107, 3, 202, 159, 246, 234, 107, 3, 246, 235, 196, + 11, 107, 3, 55, 246, 235, 196, 11, 107, 3, 246, 235, 104, 107, 3, 246, + 235, 133, 107, 3, 246, 235, 249, 246, 107, 3, 209, 20, 107, 231, 197, + 232, 247, 107, 246, 211, 107, 229, 237, 107, 3, 203, 113, 107, 223, 54, + 211, 219, 107, 1, 249, 236, 107, 18, 3, 249, 236, 222, 63, 219, 210, 17, + 192, 76, 222, 63, 219, 210, 17, 101, 222, 63, 219, 210, 17, 104, 222, 63, + 219, 210, 17, 133, 222, 63, 219, 210, 17, 134, 222, 63, 219, 210, 17, + 151, 222, 63, 219, 210, 17, 170, 222, 63, 219, 210, 17, 179, 222, 63, + 219, 210, 17, 174, 222, 63, 219, 210, 17, 182, 222, 63, 219, 210, 1, 160, + 222, 63, 219, 210, 1, 221, 250, 222, 63, 219, 210, 1, 231, 233, 222, 63, + 219, 210, 1, 214, 165, 222, 63, 219, 210, 1, 188, 222, 63, 219, 210, 1, + 204, 64, 222, 63, 219, 210, 1, 192, 112, 222, 63, 219, 210, 1, 212, 201, + 222, 63, 219, 210, 1, 189, 222, 63, 219, 210, 1, 228, 185, 222, 63, 219, + 210, 1, 181, 222, 63, 219, 210, 1, 166, 222, 63, 219, 210, 1, 210, 94, + 222, 63, 219, 210, 1, 172, 222, 63, 219, 210, 1, 238, 0, 222, 63, 219, + 210, 1, 249, 3, 222, 63, 219, 210, 1, 167, 222, 63, 219, 210, 1, 168, + 222, 63, 219, 210, 1, 177, 222, 63, 219, 210, 1, 194, 169, 222, 63, 219, + 210, 1, 199, 240, 222, 63, 219, 210, 1, 144, 222, 63, 219, 210, 1, 196, + 157, 222, 63, 219, 210, 1, 247, 19, 222, 63, 219, 210, 1, 64, 222, 63, + 219, 210, 1, 212, 0, 222, 63, 219, 210, 1, 70, 222, 63, 219, 210, 1, 211, + 194, 222, 63, 219, 210, 18, 197, 104, 222, 63, 219, 210, 18, 71, 222, 63, + 219, 210, 18, 68, 222, 63, 219, 210, 18, 234, 171, 222, 63, 219, 210, 18, + 74, 222, 63, 219, 210, 158, 209, 215, 222, 63, 219, 210, 158, 246, 250, + 222, 63, 219, 210, 158, 246, 251, 209, 215, 222, 63, 219, 210, 3, 238, + 114, 222, 63, 219, 210, 3, 203, 133, 207, 217, 1, 160, 207, 217, 1, 231, + 233, 207, 217, 1, 214, 165, 207, 217, 1, 189, 207, 217, 1, 238, 0, 207, + 217, 1, 181, 207, 217, 1, 166, 207, 217, 1, 249, 3, 207, 217, 1, 172, + 207, 217, 1, 247, 19, 207, 217, 1, 223, 62, 207, 217, 1, 212, 201, 207, + 217, 1, 188, 207, 217, 1, 167, 207, 217, 1, 177, 207, 217, 1, 168, 207, + 217, 1, 194, 169, 207, 217, 1, 144, 207, 217, 1, 217, 82, 207, 217, 1, + 214, 144, 207, 217, 1, 214, 255, 207, 217, 1, 212, 166, 207, 217, 1, 64, + 207, 217, 18, 3, 70, 207, 217, 18, 3, 68, 207, 217, 18, 3, 71, 207, 217, + 18, 3, 251, 63, 207, 217, 18, 3, 74, 207, 217, 18, 3, 250, 8, 207, 217, + 18, 3, 233, 230, 207, 217, 18, 3, 234, 199, 207, 217, 116, 3, 214, 167, + 207, 217, 116, 3, 215, 151, 207, 217, 116, 3, 150, 207, 217, 116, 3, 230, + 124, 207, 217, 196, 11, 207, 217, 205, 209, 77, 30, 143, 199, 99, 30, + 143, 199, 98, 30, 143, 199, 96, 30, 143, 199, 101, 30, 143, 207, 128, 30, + 143, 207, 112, 30, 143, 207, 107, 30, 143, 207, 109, 30, 143, 207, 125, + 30, 143, 207, 118, 30, 143, 207, 111, 30, 143, 207, 130, 30, 143, 207, + 113, 30, 143, 207, 132, 30, 143, 207, 129, 30, 143, 216, 149, 30, 143, + 216, 140, 30, 143, 216, 143, 30, 143, 210, 21, 30, 143, 210, 32, 30, 143, + 210, 33, 30, 143, 202, 76, 30, 143, 223, 237, 30, 143, 223, 244, 30, 143, + 202, 87, 30, 143, 202, 74, 30, 143, 210, 74, 30, 143, 229, 157, 30, 143, + 202, 71, 223, 47, 3, 211, 3, 223, 47, 3, 246, 155, 223, 47, 3, 220, 50, + 223, 47, 3, 194, 57, 223, 47, 1, 64, 223, 47, 1, 228, 97, 222, 67, 223, + 47, 1, 70, 223, 47, 1, 223, 224, 223, 47, 1, 68, 223, 47, 1, 211, 78, + 246, 125, 223, 47, 1, 214, 166, 220, 7, 223, 47, 1, 214, 166, 220, 8, + 208, 23, 223, 47, 1, 71, 223, 47, 1, 251, 63, 223, 47, 1, 74, 223, 47, 1, + 160, 223, 47, 1, 222, 174, 206, 22, 223, 47, 1, 222, 174, 215, 195, 223, + 47, 1, 231, 233, 223, 47, 1, 231, 234, 215, 195, 223, 47, 1, 214, 165, + 223, 47, 1, 247, 19, 223, 47, 1, 247, 20, 215, 195, 223, 47, 1, 223, 62, + 223, 47, 1, 212, 202, 215, 195, 223, 47, 1, 223, 63, 217, 184, 223, 47, + 1, 212, 201, 223, 47, 1, 198, 83, 223, 47, 1, 198, 84, 217, 184, 223, 47, + 1, 237, 161, 223, 47, 1, 237, 162, 217, 184, 223, 47, 1, 215, 97, 215, + 195, 223, 47, 1, 189, 223, 47, 1, 200, 181, 215, 195, 223, 47, 1, 238, 0, + 223, 47, 1, 238, 1, 217, 184, 223, 47, 1, 181, 223, 47, 1, 166, 223, 47, + 1, 211, 78, 215, 195, 223, 47, 1, 249, 3, 223, 47, 1, 249, 4, 215, 195, + 223, 47, 1, 172, 223, 47, 1, 168, 223, 47, 1, 167, 223, 47, 1, 208, 76, + 251, 73, 223, 47, 1, 177, 223, 47, 1, 194, 169, 223, 47, 1, 206, 101, + 215, 195, 223, 47, 1, 206, 101, 217, 184, 223, 47, 1, 188, 223, 47, 1, + 144, 223, 47, 3, 246, 156, 200, 35, 223, 47, 18, 3, 200, 108, 223, 47, + 18, 3, 199, 23, 223, 47, 18, 3, 193, 238, 223, 47, 18, 3, 193, 239, 217, + 16, 223, 47, 18, 3, 201, 133, 223, 47, 18, 3, 201, 134, 217, 4, 223, 47, + 18, 3, 200, 133, 223, 47, 18, 3, 236, 202, 215, 194, 223, 47, 18, 3, 210, + 136, 223, 47, 116, 3, 222, 23, 223, 47, 116, 3, 210, 151, 223, 47, 116, + 3, 247, 4, 223, 47, 211, 16, 223, 47, 46, 207, 190, 223, 47, 51, 207, + 190, 223, 47, 211, 66, 250, 216, 223, 47, 211, 66, 217, 205, 223, 47, + 211, 66, 219, 23, 223, 47, 211, 66, 194, 50, 223, 47, 211, 66, 211, 17, + 223, 47, 211, 66, 219, 167, 223, 47, 211, 66, 219, 16, 223, 47, 211, 66, + 251, 119, 223, 47, 211, 66, 251, 120, 251, 119, 223, 47, 211, 66, 209, + 243, 223, 47, 163, 211, 66, 209, 243, 223, 47, 211, 12, 223, 47, 17, 192, + 76, 223, 47, 17, 101, 223, 47, 17, 104, 223, 47, 17, 133, 223, 47, 17, + 134, 223, 47, 17, 151, 223, 47, 17, 170, 223, 47, 17, 179, 223, 47, 17, + 174, 223, 47, 17, 182, 223, 47, 211, 66, 199, 65, 198, 24, 223, 47, 211, + 66, 223, 92, 79, 1, 204, 38, 231, 84, 79, 1, 204, 38, 246, 117, 79, 1, + 204, 38, 223, 28, 79, 1, 204, 38, 213, 178, 79, 1, 204, 38, 248, 54, 79, + 3, 204, 38, 206, 6, 79, 73, 1, 204, 38, 207, 235, 79, 1, 53, 220, 154, + 212, 201, 79, 1, 53, 220, 154, 233, 97, 79, 1, 53, 220, 154, 231, 233, + 79, 1, 53, 220, 154, 231, 84, 79, 1, 53, 220, 154, 223, 62, 79, 1, 53, + 220, 154, 223, 28, 79, 1, 53, 220, 154, 237, 161, 79, 1, 53, 220, 154, + 237, 145, 79, 1, 53, 220, 154, 213, 178, 79, 53, 220, 154, 17, 192, 76, + 79, 53, 220, 154, 17, 101, 79, 53, 220, 154, 17, 104, 79, 53, 220, 154, + 17, 133, 79, 53, 220, 154, 17, 134, 79, 53, 220, 154, 17, 151, 79, 53, + 220, 154, 17, 170, 79, 53, 220, 154, 17, 179, 79, 53, 220, 154, 17, 174, + 79, 53, 220, 154, 17, 182, 79, 1, 53, 220, 154, 219, 137, 79, 1, 53, 220, + 154, 238, 0, 79, 1, 53, 220, 154, 237, 40, 79, 1, 53, 220, 154, 249, 3, + 79, 1, 53, 220, 154, 248, 54, 246, 110, 1, 64, 246, 110, 1, 70, 246, 110, + 1, 68, 246, 110, 1, 71, 246, 110, 1, 251, 63, 246, 110, 1, 74, 246, 110, + 1, 160, 246, 110, 1, 221, 250, 246, 110, 1, 231, 233, 246, 110, 1, 231, + 84, 246, 110, 1, 214, 74, 246, 110, 1, 214, 165, 246, 110, 1, 246, 117, + 246, 110, 1, 242, 218, 246, 110, 1, 223, 62, 246, 110, 1, 223, 28, 246, + 110, 1, 214, 62, 246, 110, 1, 214, 65, 246, 110, 1, 214, 63, 246, 110, 1, + 189, 246, 110, 1, 199, 240, 246, 110, 1, 238, 0, 246, 110, 1, 237, 40, + 246, 110, 1, 212, 244, 246, 110, 1, 181, 246, 110, 1, 237, 161, 246, 110, + 1, 166, 246, 110, 1, 209, 134, 246, 110, 1, 210, 94, 246, 110, 1, 249, 3, + 246, 110, 1, 248, 54, 246, 110, 1, 215, 229, 246, 110, 1, 172, 246, 110, + 1, 248, 159, 246, 110, 1, 168, 246, 110, 1, 167, 246, 110, 1, 177, 246, + 110, 1, 196, 157, 246, 110, 1, 202, 92, 246, 110, 1, 188, 246, 110, 1, + 144, 246, 110, 18, 3, 252, 33, 246, 110, 18, 3, 70, 246, 110, 18, 3, 223, + 224, 246, 110, 18, 3, 234, 150, 246, 110, 18, 3, 68, 246, 110, 18, 3, + 212, 0, 246, 110, 18, 3, 74, 246, 110, 18, 3, 251, 63, 246, 110, 18, 3, + 250, 8, 246, 110, 18, 3, 197, 104, 246, 110, 116, 3, 168, 246, 110, 116, + 3, 167, 246, 110, 116, 3, 177, 246, 110, 116, 3, 194, 169, 246, 110, 1, + 52, 222, 184, 246, 110, 1, 52, 232, 44, 246, 110, 1, 52, 214, 167, 246, + 110, 116, 3, 52, 214, 167, 246, 110, 1, 52, 246, 119, 246, 110, 1, 52, + 200, 228, 246, 110, 1, 52, 215, 151, 246, 110, 1, 52, 211, 93, 246, 110, + 1, 52, 193, 148, 246, 110, 1, 52, 150, 246, 110, 1, 52, 165, 246, 110, 1, + 52, 202, 95, 246, 110, 116, 3, 52, 218, 236, 246, 110, 116, 3, 52, 230, + 124, 246, 110, 17, 192, 76, 246, 110, 17, 101, 246, 110, 17, 104, 246, + 110, 17, 133, 246, 110, 17, 134, 246, 110, 17, 151, 246, 110, 17, 170, + 246, 110, 17, 179, 246, 110, 17, 174, 246, 110, 17, 182, 246, 110, 209, + 38, 202, 132, 246, 110, 209, 38, 237, 208, 246, 110, 209, 38, 55, 237, + 208, 246, 110, 209, 38, 198, 170, 237, 208, 79, 1, 221, 242, 231, 233, + 79, 1, 221, 242, 247, 19, 79, 1, 221, 242, 246, 117, 79, 1, 221, 242, + 223, 62, 79, 1, 221, 242, 223, 28, 79, 1, 221, 242, 212, 201, 79, 1, 221, + 242, 198, 83, 79, 1, 221, 242, 198, 71, 79, 1, 221, 242, 237, 161, 79, 1, + 221, 242, 237, 145, 79, 1, 221, 242, 237, 40, 79, 1, 221, 242, 181, 79, + 1, 221, 242, 188, 79, 1, 221, 242, 144, 79, 1, 221, 242, 229, 187, 79, 1, + 221, 242, 233, 97, 79, 73, 1, 221, 242, 207, 235, 79, 1, 221, 242, 193, + 209, 79, 1, 221, 242, 192, 112, 79, 1, 221, 242, 167, 79, 219, 92, 221, + 242, 212, 23, 79, 219, 92, 221, 242, 208, 190, 79, 219, 92, 221, 242, + 229, 98, 79, 16, 251, 49, 233, 203, 79, 16, 251, 49, 101, 79, 16, 251, + 49, 104, 79, 1, 251, 49, 167, 79, 3, 210, 255, 222, 96, 199, 18, 79, 3, + 53, 220, 154, 199, 16, 79, 3, 53, 220, 154, 199, 13, 79, 1, 203, 141, + 211, 46, 246, 117, 79, 1, 203, 141, 211, 46, 204, 64, 53, 196, 29, 1, + 132, 221, 113, 53, 196, 29, 1, 139, 221, 113, 53, 196, 29, 1, 132, 221, + 220, 53, 196, 29, 1, 139, 221, 220, 53, 196, 29, 1, 132, 221, 229, 53, + 196, 29, 1, 139, 221, 229, 53, 196, 29, 1, 132, 230, 254, 53, 196, 29, 1, + 139, 230, 254, 53, 196, 29, 1, 132, 214, 90, 53, 196, 29, 1, 139, 214, + 90, 53, 196, 29, 1, 132, 242, 63, 53, 196, 29, 1, 139, 242, 63, 53, 196, + 29, 1, 132, 242, 188, 53, 196, 29, 1, 139, 242, 188, 53, 196, 29, 1, 132, + 202, 212, 53, 196, 29, 1, 139, 202, 212, 53, 196, 29, 1, 132, 212, 165, + 53, 196, 29, 1, 139, 212, 165, 53, 196, 29, 1, 132, 236, 146, 53, 196, + 29, 1, 139, 236, 146, 53, 196, 29, 1, 132, 155, 53, 196, 29, 1, 139, 155, + 53, 196, 29, 1, 132, 199, 176, 53, 196, 29, 1, 139, 199, 176, 53, 196, + 29, 1, 132, 213, 142, 53, 196, 29, 1, 139, 213, 142, 53, 196, 29, 1, 132, + 247, 220, 53, 196, 29, 1, 139, 247, 220, 53, 196, 29, 1, 132, 209, 198, + 53, 196, 29, 1, 139, 209, 198, 53, 196, 29, 1, 132, 210, 65, 53, 196, 29, + 1, 139, 210, 65, 53, 196, 29, 1, 132, 232, 164, 53, 196, 29, 1, 139, 232, + 164, 53, 196, 29, 1, 132, 216, 91, 53, 196, 29, 1, 139, 216, 91, 53, 196, + 29, 1, 132, 193, 1, 53, 196, 29, 1, 139, 193, 1, 53, 196, 29, 1, 132, + 207, 55, 53, 196, 29, 1, 139, 207, 55, 53, 196, 29, 1, 132, 219, 107, 53, + 196, 29, 1, 139, 219, 107, 53, 196, 29, 1, 132, 195, 252, 53, 196, 29, 1, + 139, 195, 252, 53, 196, 29, 1, 132, 229, 43, 53, 196, 29, 1, 139, 229, + 43, 53, 196, 29, 1, 132, 74, 53, 196, 29, 1, 139, 74, 53, 196, 29, 217, + 181, 222, 117, 53, 196, 29, 18, 252, 33, 53, 196, 29, 18, 70, 53, 196, + 29, 18, 197, 104, 53, 196, 29, 18, 68, 53, 196, 29, 18, 71, 53, 196, 29, + 18, 74, 53, 196, 29, 217, 181, 221, 223, 53, 196, 29, 18, 228, 58, 53, + 196, 29, 18, 197, 103, 53, 196, 29, 18, 197, 119, 53, 196, 29, 18, 250, + 6, 53, 196, 29, 18, 249, 236, 53, 196, 29, 18, 250, 224, 53, 196, 29, 18, + 250, 241, 53, 196, 29, 158, 217, 181, 234, 131, 53, 196, 29, 158, 217, + 181, 212, 243, 53, 196, 29, 158, 217, 181, 199, 176, 53, 196, 29, 158, + 217, 181, 202, 185, 53, 196, 29, 16, 221, 91, 53, 196, 29, 16, 212, 243, + 53, 196, 29, 16, 206, 50, 53, 196, 29, 16, 229, 44, 229, 30, 53, 196, 29, + 16, 221, 102, 221, 101, 217, 23, 217, 89, 1, 71, 217, 23, 217, 89, 1, 74, + 217, 23, 217, 89, 1, 246, 117, 217, 23, 217, 89, 1, 212, 201, 217, 23, + 217, 89, 1, 198, 83, 217, 23, 217, 89, 1, 198, 71, 217, 23, 217, 89, 1, + 237, 161, 217, 23, 217, 89, 1, 237, 145, 217, 23, 217, 89, 1, 213, 178, + 217, 23, 217, 89, 1, 204, 64, 217, 23, 217, 89, 1, 202, 92, 217, 23, 217, + 89, 18, 3, 223, 224, 217, 23, 217, 89, 18, 3, 196, 251, 217, 23, 217, 89, + 18, 3, 251, 253, 217, 23, 217, 89, 18, 3, 250, 8, 217, 23, 217, 89, 18, + 3, 251, 245, 217, 23, 217, 89, 242, 234, 217, 23, 217, 89, 251, 69, 221, + 211, 217, 23, 217, 89, 250, 197, 217, 23, 217, 89, 5, 207, 196, 77, 217, + 23, 217, 89, 194, 11, 207, 196, 77, 217, 23, 217, 89, 18, 3, 196, 6, 217, + 23, 217, 89, 196, 11, 36, 5, 198, 64, 36, 5, 198, 67, 36, 5, 198, 70, 36, + 5, 198, 68, 36, 5, 198, 69, 36, 5, 198, 66, 36, 5, 237, 139, 36, 5, 237, + 141, 36, 5, 237, 144, 36, 5, 237, 142, 36, 5, 237, 143, 36, 5, 237, 140, + 36, 5, 235, 4, 36, 5, 235, 8, 36, 5, 235, 16, 36, 5, 235, 13, 36, 5, 235, + 14, 36, 5, 235, 5, 36, 5, 246, 172, 36, 5, 246, 166, 36, 5, 246, 168, 36, + 5, 246, 171, 36, 5, 246, 169, 36, 5, 246, 170, 36, 5, 246, 167, 36, 5, + 248, 159, 36, 5, 248, 138, 36, 5, 248, 150, 36, 5, 248, 158, 36, 5, 248, + 153, 36, 5, 248, 154, 36, 5, 248, 142, 8, 2, 1, 248, 188, 250, 252, 8, 2, + 1, 41, 207, 166, 8, 2, 1, 247, 244, 71, 8, 2, 1, 248, 188, 71, 8, 2, 1, + 234, 253, 4, 232, 177, 8, 2, 1, 219, 249, 233, 163, 8, 2, 1, 27, 232, 45, + 4, 238, 178, 8, 2, 1, 220, 202, 4, 223, 121, 220, 49, 206, 158, 8, 2, 1, + 220, 202, 4, 55, 85, 199, 90, 8, 2, 1, 220, 202, 4, 85, 207, 81, 8, 2, 1, + 218, 237, 4, 238, 178, 8, 2, 1, 215, 152, 4, 238, 178, 8, 2, 1, 234, 74, + 4, 238, 178, 8, 2, 1, 247, 244, 74, 8, 2, 1, 247, 244, 185, 4, 111, 8, 2, + 1, 211, 184, 185, 4, 111, 8, 2, 1, 223, 121, 212, 0, 8, 2, 1, 163, 212, + 1, 4, 111, 8, 2, 1, 163, 212, 1, 4, 229, 5, 111, 8, 2, 1, 163, 185, 211, + 179, 8, 2, 1, 163, 185, 211, 180, 4, 111, 8, 2, 1, 201, 243, 150, 8, 1, + 2, 6, 208, 112, 4, 51, 220, 16, 8, 2, 1, 208, 112, 194, 39, 230, 40, 8, + 2, 1, 55, 150, 8, 2, 1, 208, 112, 4, 238, 178, 8, 2, 1, 55, 208, 112, 4, + 238, 178, 8, 2, 1, 27, 150, 8, 2, 1, 27, 208, 112, 4, 207, 81, 8, 2, 1, + 248, 178, 233, 255, 8, 2, 1, 124, 4, 203, 195, 51, 220, 16, 8, 2, 1, 124, + 248, 194, 4, 203, 195, 51, 220, 16, 8, 2, 1, 197, 95, 8, 2, 1, 163, 197, + 95, 8, 2, 1, 124, 4, 46, 128, 8, 2, 1, 242, 215, 8, 2, 1, 242, 216, 4, + 132, 51, 207, 81, 8, 2, 1, 242, 216, 4, 132, 46, 204, 160, 8, 2, 1, 193, + 224, 4, 132, 51, 207, 81, 8, 2, 1, 193, 224, 4, 184, 46, 220, 16, 8, 2, + 1, 193, 224, 4, 184, 46, 220, 17, 26, 132, 51, 207, 81, 8, 2, 1, 193, + 224, 4, 184, 46, 220, 17, 4, 204, 160, 8, 2, 1, 193, 149, 4, 203, 195, + 51, 220, 16, 73, 247, 151, 4, 223, 121, 247, 150, 73, 1, 2, 229, 206, 73, + 1, 2, 220, 202, 4, 223, 121, 220, 49, 206, 158, 73, 1, 2, 220, 202, 4, + 85, 199, 90, 73, 1, 2, 124, 4, 46, 128, 8, 2, 1, 206, 68, 193, 84, 8, 2, + 1, 223, 109, 71, 8, 2, 1, 211, 184, 212, 0, 8, 2, 1, 197, 46, 8, 2, 1, + 223, 121, 250, 252, 33, 1, 2, 6, 211, 216, 8, 2, 1, 235, 19, 236, 231, 4, + 207, 174, 128, 8, 2, 1, 198, 120, 236, 231, 4, 207, 174, 128, 8, 2, 1, + 163, 208, 112, 4, 85, 199, 90, 73, 1, 2, 163, 194, 202, 73, 1, 46, 200, + 159, 73, 1, 51, 200, 159, 99, 2, 1, 64, 99, 2, 1, 71, 99, 2, 1, 70, 99, + 2, 1, 74, 99, 2, 1, 68, 99, 2, 1, 196, 236, 99, 2, 1, 231, 233, 99, 2, 1, + 160, 99, 2, 1, 231, 158, 99, 2, 1, 231, 46, 99, 2, 1, 230, 254, 99, 2, 1, + 230, 186, 99, 2, 1, 230, 146, 99, 2, 1, 144, 99, 2, 1, 229, 255, 99, 2, + 1, 229, 178, 99, 2, 1, 229, 43, 99, 2, 1, 228, 181, 99, 2, 1, 228, 148, + 99, 2, 1, 177, 99, 2, 1, 220, 42, 99, 2, 1, 219, 209, 99, 2, 1, 219, 107, + 99, 2, 1, 219, 36, 99, 2, 1, 219, 4, 99, 2, 1, 172, 99, 2, 1, 217, 48, + 99, 2, 1, 216, 175, 99, 2, 1, 216, 91, 99, 2, 1, 215, 241, 99, 2, 1, 181, + 99, 2, 1, 229, 67, 99, 2, 1, 215, 71, 99, 2, 1, 214, 214, 99, 2, 1, 214, + 60, 99, 2, 1, 213, 142, 99, 2, 1, 213, 22, 99, 2, 1, 212, 212, 99, 2, 1, + 208, 176, 99, 2, 1, 208, 162, 99, 2, 1, 208, 155, 99, 2, 1, 208, 145, 99, + 2, 1, 208, 134, 99, 2, 1, 208, 132, 99, 2, 1, 188, 99, 2, 1, 206, 158, + 99, 2, 1, 205, 223, 99, 2, 1, 203, 125, 99, 2, 1, 202, 212, 99, 2, 1, + 201, 184, 99, 2, 1, 201, 84, 99, 2, 1, 238, 0, 99, 2, 1, 189, 99, 2, 1, + 237, 116, 99, 2, 1, 200, 79, 99, 2, 1, 237, 16, 99, 2, 1, 199, 128, 99, + 2, 1, 236, 146, 99, 2, 1, 235, 62, 99, 2, 1, 235, 31, 99, 2, 1, 236, 158, + 99, 2, 1, 199, 53, 99, 2, 1, 199, 52, 99, 2, 1, 199, 41, 99, 2, 1, 199, + 40, 99, 2, 1, 199, 39, 99, 2, 1, 199, 38, 99, 2, 1, 198, 118, 99, 2, 1, + 198, 112, 99, 2, 1, 198, 97, 99, 2, 1, 198, 95, 99, 2, 1, 198, 91, 99, 2, + 1, 198, 90, 99, 2, 1, 194, 169, 99, 2, 1, 194, 111, 99, 2, 1, 194, 72, + 99, 2, 1, 194, 36, 99, 2, 1, 193, 244, 99, 2, 1, 193, 231, 99, 2, 1, 168, + 217, 23, 217, 89, 1, 221, 98, 217, 23, 217, 89, 1, 206, 50, 217, 23, 217, + 89, 1, 220, 155, 217, 23, 217, 89, 1, 216, 102, 217, 23, 217, 89, 1, 166, + 217, 23, 217, 89, 1, 181, 217, 23, 217, 89, 1, 242, 207, 217, 23, 217, + 89, 1, 199, 92, 217, 23, 217, 89, 1, 221, 214, 217, 23, 217, 89, 1, 214, + 80, 217, 23, 217, 89, 1, 199, 167, 217, 23, 217, 89, 1, 194, 157, 217, + 23, 217, 89, 1, 193, 95, 217, 23, 217, 89, 1, 228, 169, 217, 23, 217, 89, + 1, 197, 77, 217, 23, 217, 89, 1, 70, 217, 23, 217, 89, 1, 210, 88, 217, + 23, 217, 89, 1, 250, 19, 217, 23, 217, 89, 1, 230, 246, 217, 23, 217, 89, + 1, 223, 26, 217, 23, 217, 89, 1, 208, 48, 217, 23, 217, 89, 1, 249, 3, + 217, 23, 217, 89, 1, 223, 10, 217, 23, 217, 89, 1, 236, 229, 217, 23, + 217, 89, 1, 231, 53, 217, 23, 217, 89, 1, 237, 18, 217, 23, 217, 89, 1, + 248, 51, 217, 23, 217, 89, 1, 221, 99, 219, 74, 217, 23, 217, 89, 1, 220, + 156, 219, 74, 217, 23, 217, 89, 1, 216, 103, 219, 74, 217, 23, 217, 89, + 1, 211, 78, 219, 74, 217, 23, 217, 89, 1, 215, 97, 219, 74, 217, 23, 217, + 89, 1, 199, 93, 219, 74, 217, 23, 217, 89, 1, 214, 81, 219, 74, 217, 23, + 217, 89, 1, 228, 97, 219, 74, 217, 23, 217, 89, 18, 3, 211, 209, 217, 23, + 217, 89, 18, 3, 223, 188, 217, 23, 217, 89, 18, 3, 250, 222, 217, 23, + 217, 89, 18, 3, 193, 58, 217, 23, 217, 89, 18, 3, 202, 175, 217, 23, 217, + 89, 18, 3, 197, 74, 217, 23, 217, 89, 18, 3, 242, 232, 217, 23, 217, 89, + 18, 3, 212, 227, 217, 23, 217, 89, 242, 233, 217, 23, 217, 89, 219, 20, + 223, 71, 217, 23, 217, 89, 250, 136, 223, 71, 217, 23, 217, 89, 17, 192, + 76, 217, 23, 217, 89, 17, 101, 217, 23, 217, 89, 17, 104, 217, 23, 217, + 89, 17, 133, 217, 23, 217, 89, 17, 134, 217, 23, 217, 89, 17, 151, 217, + 23, 217, 89, 17, 170, 217, 23, 217, 89, 17, 179, 217, 23, 217, 89, 17, + 174, 217, 23, 217, 89, 17, 182, 30, 222, 206, 212, 103, 30, 222, 206, + 212, 108, 30, 222, 206, 192, 250, 30, 222, 206, 192, 249, 30, 222, 206, + 192, 248, 30, 222, 206, 197, 169, 30, 222, 206, 197, 173, 30, 222, 206, + 192, 208, 30, 222, 206, 192, 204, 30, 222, 206, 233, 229, 30, 222, 206, + 233, 227, 30, 222, 206, 233, 228, 30, 222, 206, 233, 225, 30, 222, 206, + 228, 83, 30, 222, 206, 228, 82, 30, 222, 206, 228, 80, 30, 222, 206, 228, + 81, 30, 222, 206, 228, 86, 30, 222, 206, 228, 79, 30, 222, 206, 228, 78, + 30, 222, 206, 228, 88, 30, 222, 206, 250, 122, 30, 222, 206, 250, 121, + 30, 123, 214, 38, 30, 123, 214, 44, 30, 123, 202, 73, 30, 123, 202, 72, + 30, 123, 199, 98, 30, 123, 199, 96, 30, 123, 199, 95, 30, 123, 199, 101, + 30, 123, 199, 102, 30, 123, 199, 94, 30, 123, 207, 112, 30, 123, 207, + 127, 30, 123, 202, 79, 30, 123, 207, 124, 30, 123, 207, 114, 30, 123, + 207, 116, 30, 123, 207, 103, 30, 123, 207, 104, 30, 123, 222, 102, 30, + 123, 216, 148, 30, 123, 216, 142, 30, 123, 202, 83, 30, 123, 216, 145, + 30, 123, 216, 151, 30, 123, 210, 17, 30, 123, 210, 26, 30, 123, 210, 30, + 30, 123, 202, 81, 30, 123, 210, 20, 30, 123, 210, 34, 30, 123, 210, 35, + 30, 123, 203, 56, 30, 123, 203, 59, 30, 123, 202, 77, 30, 123, 202, 75, + 30, 123, 203, 54, 30, 123, 203, 62, 30, 123, 203, 63, 30, 123, 203, 48, + 30, 123, 203, 61, 30, 123, 211, 6, 30, 123, 211, 7, 30, 123, 193, 42, 30, + 123, 193, 45, 30, 123, 242, 142, 30, 123, 242, 141, 30, 123, 202, 88, 30, + 123, 210, 72, 30, 123, 210, 71, 12, 15, 225, 215, 12, 15, 225, 214, 12, + 15, 225, 213, 12, 15, 225, 212, 12, 15, 225, 211, 12, 15, 225, 210, 12, + 15, 225, 209, 12, 15, 225, 208, 12, 15, 225, 207, 12, 15, 225, 206, 12, + 15, 225, 205, 12, 15, 225, 204, 12, 15, 225, 203, 12, 15, 225, 202, 12, + 15, 225, 201, 12, 15, 225, 200, 12, 15, 225, 199, 12, 15, 225, 198, 12, + 15, 225, 197, 12, 15, 225, 196, 12, 15, 225, 195, 12, 15, 225, 194, 12, + 15, 225, 193, 12, 15, 225, 192, 12, 15, 225, 191, 12, 15, 225, 190, 12, + 15, 225, 189, 12, 15, 225, 188, 12, 15, 225, 187, 12, 15, 225, 186, 12, + 15, 225, 185, 12, 15, 225, 184, 12, 15, 225, 183, 12, 15, 225, 182, 12, + 15, 225, 181, 12, 15, 225, 180, 12, 15, 225, 179, 12, 15, 225, 178, 12, + 15, 225, 177, 12, 15, 225, 176, 12, 15, 225, 175, 12, 15, 225, 174, 12, + 15, 225, 173, 12, 15, 225, 172, 12, 15, 225, 171, 12, 15, 225, 170, 12, + 15, 225, 169, 12, 15, 225, 168, 12, 15, 225, 167, 12, 15, 225, 166, 12, + 15, 225, 165, 12, 15, 225, 164, 12, 15, 225, 163, 12, 15, 225, 162, 12, + 15, 225, 161, 12, 15, 225, 160, 12, 15, 225, 159, 12, 15, 225, 158, 12, + 15, 225, 157, 12, 15, 225, 156, 12, 15, 225, 155, 12, 15, 225, 154, 12, + 15, 225, 153, 12, 15, 225, 152, 12, 15, 225, 151, 12, 15, 225, 150, 12, + 15, 225, 149, 12, 15, 225, 148, 12, 15, 225, 147, 12, 15, 225, 146, 12, + 15, 225, 145, 12, 15, 225, 144, 12, 15, 225, 143, 12, 15, 225, 142, 12, + 15, 225, 141, 12, 15, 225, 140, 12, 15, 225, 139, 12, 15, 225, 138, 12, + 15, 225, 137, 12, 15, 225, 136, 12, 15, 225, 135, 12, 15, 225, 134, 12, + 15, 225, 133, 12, 15, 225, 132, 12, 15, 225, 131, 12, 15, 225, 130, 12, + 15, 225, 129, 12, 15, 225, 128, 12, 15, 225, 127, 12, 15, 225, 126, 12, + 15, 225, 125, 12, 15, 225, 124, 12, 15, 225, 123, 12, 15, 225, 122, 12, + 15, 225, 121, 12, 15, 225, 120, 12, 15, 225, 119, 12, 15, 225, 118, 12, + 15, 225, 117, 12, 15, 225, 116, 12, 15, 225, 115, 12, 15, 225, 114, 12, + 15, 225, 113, 12, 15, 225, 112, 12, 15, 225, 111, 12, 15, 225, 110, 12, + 15, 225, 109, 12, 15, 225, 108, 12, 15, 225, 107, 12, 15, 225, 106, 12, + 15, 225, 105, 12, 15, 225, 104, 12, 15, 225, 103, 12, 15, 225, 102, 12, + 15, 225, 101, 12, 15, 225, 100, 12, 15, 225, 99, 12, 15, 225, 98, 12, 15, + 225, 97, 12, 15, 225, 96, 12, 15, 225, 95, 12, 15, 225, 94, 12, 15, 225, + 93, 12, 15, 225, 92, 12, 15, 225, 91, 12, 15, 225, 90, 12, 15, 225, 89, + 12, 15, 225, 88, 12, 15, 225, 87, 12, 15, 225, 86, 12, 15, 225, 85, 12, + 15, 225, 84, 12, 15, 225, 83, 12, 15, 225, 82, 12, 15, 225, 81, 12, 15, + 225, 80, 12, 15, 225, 79, 12, 15, 225, 78, 12, 15, 225, 77, 12, 15, 225, + 76, 12, 15, 225, 75, 12, 15, 225, 74, 12, 15, 225, 73, 12, 15, 225, 72, + 12, 15, 225, 71, 12, 15, 225, 70, 12, 15, 225, 69, 12, 15, 225, 68, 12, + 15, 225, 67, 12, 15, 225, 66, 12, 15, 225, 65, 12, 15, 225, 64, 12, 15, + 225, 63, 12, 15, 225, 62, 12, 15, 225, 61, 12, 15, 225, 60, 12, 15, 225, + 59, 12, 15, 225, 58, 12, 15, 225, 57, 12, 15, 225, 56, 12, 15, 225, 55, + 12, 15, 225, 54, 12, 15, 225, 53, 12, 15, 225, 52, 12, 15, 225, 51, 12, + 15, 225, 50, 12, 15, 225, 49, 12, 15, 225, 48, 12, 15, 225, 47, 12, 15, + 225, 46, 12, 15, 225, 45, 12, 15, 225, 44, 12, 15, 225, 43, 12, 15, 225, + 42, 12, 15, 225, 41, 12, 15, 225, 40, 12, 15, 225, 39, 12, 15, 225, 38, + 12, 15, 225, 37, 12, 15, 225, 36, 12, 15, 225, 35, 12, 15, 225, 34, 12, + 15, 225, 33, 12, 15, 225, 32, 12, 15, 225, 31, 12, 15, 225, 30, 12, 15, + 225, 29, 12, 15, 225, 28, 12, 15, 225, 27, 12, 15, 225, 26, 12, 15, 225, + 25, 12, 15, 225, 24, 12, 15, 225, 23, 12, 15, 225, 22, 12, 15, 225, 21, + 12, 15, 225, 20, 12, 15, 225, 19, 12, 15, 225, 18, 12, 15, 225, 17, 12, + 15, 225, 16, 12, 15, 225, 15, 12, 15, 225, 14, 12, 15, 225, 13, 12, 15, + 225, 12, 12, 15, 225, 11, 12, 15, 225, 10, 12, 15, 225, 9, 12, 15, 225, + 8, 12, 15, 225, 7, 12, 15, 225, 6, 12, 15, 225, 5, 12, 15, 225, 4, 12, + 15, 225, 3, 12, 15, 225, 2, 12, 15, 225, 1, 12, 15, 225, 0, 12, 15, 224, + 255, 12, 15, 224, 254, 12, 15, 224, 253, 12, 15, 224, 252, 12, 15, 224, + 251, 12, 15, 224, 250, 12, 15, 224, 249, 12, 15, 224, 248, 12, 15, 224, + 247, 12, 15, 224, 246, 12, 15, 224, 245, 12, 15, 224, 244, 12, 15, 224, + 243, 12, 15, 224, 242, 12, 15, 224, 241, 12, 15, 224, 240, 12, 15, 224, + 239, 12, 15, 224, 238, 12, 15, 224, 237, 12, 15, 224, 236, 12, 15, 224, + 235, 12, 15, 224, 234, 12, 15, 224, 233, 12, 15, 224, 232, 12, 15, 224, + 231, 12, 15, 224, 230, 12, 15, 224, 229, 12, 15, 224, 228, 12, 15, 224, + 227, 12, 15, 224, 226, 12, 15, 224, 225, 12, 15, 224, 224, 12, 15, 224, + 223, 12, 15, 224, 222, 12, 15, 224, 221, 12, 15, 224, 220, 12, 15, 224, + 219, 12, 15, 224, 218, 12, 15, 224, 217, 12, 15, 224, 216, 12, 15, 224, + 215, 12, 15, 224, 214, 12, 15, 224, 213, 12, 15, 224, 212, 12, 15, 224, + 211, 12, 15, 224, 210, 12, 15, 224, 209, 12, 15, 224, 208, 12, 15, 224, + 207, 12, 15, 224, 206, 12, 15, 224, 205, 12, 15, 224, 204, 12, 15, 224, + 203, 12, 15, 224, 202, 12, 15, 224, 201, 12, 15, 224, 200, 12, 15, 224, + 199, 12, 15, 224, 198, 12, 15, 224, 197, 12, 15, 224, 196, 12, 15, 224, + 195, 12, 15, 224, 194, 12, 15, 224, 193, 12, 15, 224, 192, 12, 15, 224, + 191, 12, 15, 224, 190, 12, 15, 224, 189, 12, 15, 224, 188, 12, 15, 224, + 187, 12, 15, 224, 186, 12, 15, 224, 185, 12, 15, 224, 184, 12, 15, 224, + 183, 12, 15, 224, 182, 12, 15, 224, 181, 12, 15, 224, 180, 12, 15, 224, + 179, 12, 15, 224, 178, 12, 15, 224, 177, 12, 15, 224, 176, 12, 15, 224, + 175, 12, 15, 224, 174, 12, 15, 224, 173, 12, 15, 224, 172, 12, 15, 224, + 171, 12, 15, 224, 170, 12, 15, 224, 169, 12, 15, 224, 168, 12, 15, 224, + 167, 12, 15, 224, 166, 12, 15, 224, 165, 12, 15, 224, 164, 12, 15, 224, + 163, 12, 15, 224, 162, 12, 15, 224, 161, 12, 15, 224, 160, 12, 15, 224, + 159, 12, 15, 224, 158, 12, 15, 224, 157, 12, 15, 224, 156, 12, 15, 224, + 155, 12, 15, 224, 154, 12, 15, 224, 153, 12, 15, 224, 152, 12, 15, 224, + 151, 12, 15, 224, 150, 12, 15, 224, 149, 12, 15, 224, 148, 12, 15, 224, + 147, 12, 15, 224, 146, 12, 15, 224, 145, 12, 15, 224, 144, 12, 15, 224, + 143, 12, 15, 224, 142, 12, 15, 224, 141, 12, 15, 224, 140, 12, 15, 224, + 139, 12, 15, 224, 138, 12, 15, 224, 137, 12, 15, 224, 136, 12, 15, 224, + 135, 12, 15, 224, 134, 12, 15, 224, 133, 12, 15, 224, 132, 12, 15, 224, + 131, 12, 15, 224, 130, 12, 15, 224, 129, 12, 15, 224, 128, 12, 15, 224, + 127, 12, 15, 224, 126, 12, 15, 224, 125, 12, 15, 224, 124, 12, 15, 224, + 123, 12, 15, 224, 122, 12, 15, 224, 121, 12, 15, 224, 120, 12, 15, 224, + 119, 12, 15, 224, 118, 12, 15, 224, 117, 12, 15, 224, 116, 12, 15, 224, + 115, 12, 15, 224, 114, 12, 15, 224, 113, 12, 15, 224, 112, 12, 15, 224, + 111, 12, 15, 224, 110, 12, 15, 224, 109, 12, 15, 224, 108, 12, 15, 224, + 107, 12, 15, 224, 106, 12, 15, 224, 105, 12, 15, 224, 104, 12, 15, 224, + 103, 12, 15, 224, 102, 12, 15, 224, 101, 12, 15, 224, 100, 12, 15, 224, + 99, 12, 15, 224, 98, 12, 15, 224, 97, 12, 15, 224, 96, 12, 15, 224, 95, + 12, 15, 224, 94, 12, 15, 224, 93, 12, 15, 224, 92, 12, 15, 224, 91, 12, + 15, 224, 90, 12, 15, 224, 89, 12, 15, 224, 88, 12, 15, 224, 87, 12, 15, + 224, 86, 12, 15, 224, 85, 12, 15, 224, 84, 12, 15, 224, 83, 12, 15, 224, + 82, 12, 15, 224, 81, 12, 15, 224, 80, 12, 15, 224, 79, 12, 15, 224, 78, + 12, 15, 224, 77, 12, 15, 224, 76, 12, 15, 224, 75, 12, 15, 224, 74, 12, + 15, 224, 73, 12, 15, 224, 72, 12, 15, 224, 71, 12, 15, 224, 70, 12, 15, + 224, 69, 12, 15, 224, 68, 12, 15, 224, 67, 12, 15, 224, 66, 12, 15, 224, + 65, 12, 15, 224, 64, 12, 15, 224, 63, 12, 15, 224, 62, 12, 15, 224, 61, + 12, 15, 224, 60, 12, 15, 224, 59, 12, 15, 224, 58, 12, 15, 224, 57, 12, + 15, 224, 56, 12, 15, 224, 55, 12, 15, 224, 54, 12, 15, 224, 53, 12, 15, + 224, 52, 12, 15, 224, 51, 12, 15, 224, 50, 12, 15, 224, 49, 12, 15, 224, + 48, 12, 15, 224, 47, 12, 15, 224, 46, 12, 15, 224, 45, 12, 15, 224, 44, + 12, 15, 224, 43, 12, 15, 224, 42, 12, 15, 224, 41, 12, 15, 224, 40, 12, + 15, 224, 39, 12, 15, 224, 38, 12, 15, 224, 37, 12, 15, 224, 36, 12, 15, + 224, 35, 12, 15, 224, 34, 12, 15, 224, 33, 12, 15, 224, 32, 12, 15, 224, + 31, 12, 15, 224, 30, 12, 15, 224, 29, 12, 15, 224, 28, 12, 15, 224, 27, + 12, 15, 224, 26, 12, 15, 224, 25, 12, 15, 224, 24, 12, 15, 224, 23, 12, + 15, 224, 22, 12, 15, 224, 21, 12, 15, 224, 20, 12, 15, 224, 19, 12, 15, + 224, 18, 12, 15, 224, 17, 12, 15, 224, 16, 12, 15, 224, 15, 12, 15, 224, + 14, 12, 15, 224, 13, 12, 15, 224, 12, 12, 15, 224, 11, 12, 15, 224, 10, + 12, 15, 224, 9, 12, 15, 224, 8, 12, 15, 224, 7, 12, 15, 224, 6, 12, 15, + 224, 5, 12, 15, 224, 4, 12, 15, 224, 3, 12, 15, 224, 2, 12, 15, 224, 1, + 12, 15, 224, 0, 8, 2, 34, 233, 15, 8, 2, 34, 233, 11, 8, 2, 34, 232, 209, + 8, 2, 34, 233, 14, 8, 2, 34, 233, 13, 8, 2, 34, 184, 206, 159, 200, 228, + 8, 2, 34, 202, 35, 250, 91, 2, 34, 217, 6, 213, 96, 250, 91, 2, 34, 217, + 6, 234, 177, 250, 91, 2, 34, 217, 6, 223, 159, 250, 91, 2, 34, 196, 45, + 213, 96, 250, 91, 2, 34, 217, 6, 193, 201, 129, 1, 192, 240, 4, 229, 139, + 129, 209, 192, 222, 213, 196, 135, 129, 34, 193, 20, 192, 240, 192, 240, + 210, 205, 129, 1, 250, 244, 249, 231, 129, 1, 194, 64, 251, 26, 129, 1, + 194, 64, 237, 221, 129, 1, 194, 64, 229, 255, 129, 1, 194, 64, 222, 139, + 129, 1, 194, 64, 220, 86, 129, 1, 194, 64, 52, 217, 12, 129, 1, 194, 64, + 207, 188, 129, 1, 194, 64, 200, 96, 129, 1, 250, 244, 102, 57, 129, 1, + 203, 225, 4, 203, 225, 236, 114, 129, 1, 203, 225, 4, 203, 79, 236, 114, + 129, 1, 203, 225, 4, 237, 241, 26, 203, 225, 236, 114, 129, 1, 203, 225, + 4, 237, 241, 26, 203, 79, 236, 114, 129, 1, 157, 4, 210, 205, 129, 1, + 157, 4, 208, 227, 129, 1, 157, 4, 217, 140, 129, 1, 248, 66, 4, 237, 240, + 129, 1, 231, 32, 4, 237, 240, 129, 1, 237, 222, 4, 237, 240, 129, 1, 230, + 0, 4, 217, 140, 129, 1, 196, 128, 4, 237, 240, 129, 1, 192, 90, 4, 237, + 240, 129, 1, 200, 9, 4, 237, 240, 129, 1, 192, 240, 4, 237, 240, 129, 1, + 52, 222, 140, 4, 237, 240, 129, 1, 222, 140, 4, 237, 240, 129, 1, 220, + 87, 4, 237, 240, 129, 1, 217, 13, 4, 237, 240, 129, 1, 212, 231, 4, 237, + 240, 129, 1, 206, 47, 4, 237, 240, 129, 1, 52, 210, 182, 4, 237, 240, + 129, 1, 210, 182, 4, 237, 240, 129, 1, 198, 114, 4, 237, 240, 129, 1, + 208, 187, 4, 237, 240, 129, 1, 207, 189, 4, 237, 240, 129, 1, 203, 225, + 4, 237, 240, 129, 1, 200, 97, 4, 237, 240, 129, 1, 196, 128, 4, 229, 27, + 129, 1, 248, 66, 4, 208, 51, 129, 1, 222, 140, 4, 208, 51, 129, 1, 210, + 182, 4, 208, 51, 129, 34, 157, 220, 86, 9, 1, 157, 194, 137, 72, 20, 9, + 1, 157, 194, 137, 52, 20, 9, 1, 248, 107, 72, 20, 9, 1, 248, 107, 52, 20, + 9, 1, 248, 107, 88, 20, 9, 1, 248, 107, 217, 35, 20, 9, 1, 210, 162, 72, + 20, 9, 1, 210, 162, 52, 20, 9, 1, 210, 162, 88, 20, 9, 1, 210, 162, 217, + 35, 20, 9, 1, 248, 95, 72, 20, 9, 1, 248, 95, 52, 20, 9, 1, 248, 95, 88, + 20, 9, 1, 248, 95, 217, 35, 20, 9, 1, 198, 74, 72, 20, 9, 1, 198, 74, 52, + 20, 9, 1, 198, 74, 88, 20, 9, 1, 198, 74, 217, 35, 20, 9, 1, 200, 48, 72, + 20, 9, 1, 200, 48, 52, 20, 9, 1, 200, 48, 88, 20, 9, 1, 200, 48, 217, 35, + 20, 9, 1, 198, 76, 72, 20, 9, 1, 198, 76, 52, 20, 9, 1, 198, 76, 88, 20, + 9, 1, 198, 76, 217, 35, 20, 9, 1, 196, 117, 72, 20, 9, 1, 196, 117, 52, + 20, 9, 1, 196, 117, 88, 20, 9, 1, 196, 117, 217, 35, 20, 9, 1, 210, 160, + 72, 20, 9, 1, 210, 160, 52, 20, 9, 1, 210, 160, 88, 20, 9, 1, 210, 160, + 217, 35, 20, 9, 1, 235, 24, 72, 20, 9, 1, 235, 24, 52, 20, 9, 1, 235, 24, + 88, 20, 9, 1, 235, 24, 217, 35, 20, 9, 1, 212, 188, 72, 20, 9, 1, 212, + 188, 52, 20, 9, 1, 212, 188, 88, 20, 9, 1, 212, 188, 217, 35, 20, 9, 1, + 200, 84, 72, 20, 9, 1, 200, 84, 52, 20, 9, 1, 200, 84, 88, 20, 9, 1, 200, + 84, 217, 35, 20, 9, 1, 200, 82, 72, 20, 9, 1, 200, 82, 52, 20, 9, 1, 200, + 82, 88, 20, 9, 1, 200, 82, 217, 35, 20, 9, 1, 237, 159, 72, 20, 9, 1, + 237, 159, 52, 20, 9, 1, 237, 235, 72, 20, 9, 1, 237, 235, 52, 20, 9, 1, + 235, 53, 72, 20, 9, 1, 235, 53, 52, 20, 9, 1, 237, 157, 72, 20, 9, 1, + 237, 157, 52, 20, 9, 1, 223, 35, 72, 20, 9, 1, 223, 35, 52, 20, 9, 1, + 206, 252, 72, 20, 9, 1, 206, 252, 52, 20, 9, 1, 222, 40, 72, 20, 9, 1, + 222, 40, 52, 20, 9, 1, 222, 40, 88, 20, 9, 1, 222, 40, 217, 35, 20, 9, 1, + 231, 221, 72, 20, 9, 1, 231, 221, 52, 20, 9, 1, 231, 221, 88, 20, 9, 1, + 231, 221, 217, 35, 20, 9, 1, 230, 174, 72, 20, 9, 1, 230, 174, 52, 20, 9, + 1, 230, 174, 88, 20, 9, 1, 230, 174, 217, 35, 20, 9, 1, 214, 89, 72, 20, + 9, 1, 214, 89, 52, 20, 9, 1, 214, 89, 88, 20, 9, 1, 214, 89, 217, 35, 20, + 9, 1, 213, 124, 231, 51, 72, 20, 9, 1, 213, 124, 231, 51, 52, 20, 9, 1, + 207, 59, 72, 20, 9, 1, 207, 59, 52, 20, 9, 1, 207, 59, 88, 20, 9, 1, 207, + 59, 217, 35, 20, 9, 1, 229, 221, 4, 97, 95, 72, 20, 9, 1, 229, 221, 4, + 97, 95, 52, 20, 9, 1, 229, 221, 230, 252, 72, 20, 9, 1, 229, 221, 230, + 252, 52, 20, 9, 1, 229, 221, 230, 252, 88, 20, 9, 1, 229, 221, 230, 252, + 217, 35, 20, 9, 1, 229, 221, 236, 143, 72, 20, 9, 1, 229, 221, 236, 143, + 52, 20, 9, 1, 229, 221, 236, 143, 88, 20, 9, 1, 229, 221, 236, 143, 217, + 35, 20, 9, 1, 97, 248, 187, 72, 20, 9, 1, 97, 248, 187, 52, 20, 9, 1, 97, + 248, 187, 4, 230, 67, 95, 72, 20, 9, 1, 97, 248, 187, 4, 230, 67, 95, 52, + 20, 9, 16, 78, 58, 9, 16, 78, 63, 9, 16, 103, 236, 112, 58, 9, 16, 103, + 236, 112, 63, 9, 16, 112, 236, 112, 58, 9, 16, 112, 236, 112, 63, 9, 16, + 112, 236, 112, 209, 188, 235, 92, 58, 9, 16, 112, 236, 112, 209, 188, + 235, 92, 63, 9, 16, 232, 119, 236, 112, 58, 9, 16, 232, 119, 236, 112, + 63, 9, 16, 55, 84, 248, 194, 63, 9, 16, 103, 236, 112, 196, 55, 58, 9, + 16, 103, 236, 112, 196, 55, 63, 9, 16, 207, 81, 9, 16, 2, 200, 152, 58, + 9, 16, 2, 200, 152, 63, 9, 1, 214, 168, 72, 20, 9, 1, 214, 168, 52, 20, + 9, 1, 214, 168, 88, 20, 9, 1, 214, 168, 217, 35, 20, 9, 1, 124, 72, 20, + 9, 1, 124, 52, 20, 9, 1, 212, 1, 72, 20, 9, 1, 212, 1, 52, 20, 9, 1, 192, + 215, 72, 20, 9, 1, 192, 215, 52, 20, 9, 1, 124, 4, 230, 67, 95, 72, 20, + 9, 1, 196, 124, 72, 20, 9, 1, 196, 124, 52, 20, 9, 1, 221, 170, 212, 1, + 72, 20, 9, 1, 221, 170, 212, 1, 52, 20, 9, 1, 221, 170, 192, 215, 72, 20, + 9, 1, 221, 170, 192, 215, 52, 20, 9, 1, 234, 253, 72, 20, 9, 1, 234, 253, + 52, 20, 9, 1, 234, 253, 88, 20, 9, 1, 234, 253, 217, 35, 20, 9, 1, 197, + 94, 222, 61, 221, 170, 157, 217, 169, 88, 20, 9, 1, 197, 94, 222, 61, + 221, 170, 157, 217, 169, 217, 35, 20, 9, 34, 97, 4, 230, 67, 95, 4, 157, + 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 157, 52, 20, 9, 34, 97, 4, 230, 67, + 95, 4, 251, 109, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 251, 109, 52, 20, + 9, 34, 97, 4, 230, 67, 95, 4, 194, 120, 72, 20, 9, 34, 97, 4, 230, 67, + 95, 4, 194, 120, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, 124, 72, 20, 9, + 34, 97, 4, 230, 67, 95, 4, 124, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, + 212, 1, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 212, 1, 52, 20, 9, 34, 97, + 4, 230, 67, 95, 4, 192, 215, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 192, + 215, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, 234, 253, 72, 20, 9, 34, 97, + 4, 230, 67, 95, 4, 234, 253, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, 234, + 253, 88, 20, 9, 34, 197, 94, 221, 170, 97, 4, 230, 67, 95, 4, 157, 217, + 169, 72, 20, 9, 34, 197, 94, 221, 170, 97, 4, 230, 67, 95, 4, 157, 217, + 169, 52, 20, 9, 34, 197, 94, 221, 170, 97, 4, 230, 67, 95, 4, 157, 217, + 169, 88, 20, 9, 1, 233, 62, 97, 72, 20, 9, 1, 233, 62, 97, 52, 20, 9, 1, + 233, 62, 97, 88, 20, 9, 1, 233, 62, 97, 217, 35, 20, 9, 34, 97, 4, 230, + 67, 95, 4, 223, 38, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 176, 72, 20, 9, + 34, 97, 4, 230, 67, 95, 4, 91, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 157, + 217, 169, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 97, 72, 20, 9, 34, 248, + 97, 4, 223, 38, 72, 20, 9, 34, 248, 97, 4, 176, 72, 20, 9, 34, 248, 97, + 4, 221, 246, 72, 20, 9, 34, 248, 97, 4, 91, 72, 20, 9, 34, 248, 97, 4, + 157, 217, 169, 72, 20, 9, 34, 248, 97, 4, 97, 72, 20, 9, 34, 200, 50, 4, + 223, 38, 72, 20, 9, 34, 200, 50, 4, 176, 72, 20, 9, 34, 200, 50, 4, 221, + 246, 72, 20, 9, 34, 200, 50, 4, 91, 72, 20, 9, 34, 200, 50, 4, 157, 217, + 169, 72, 20, 9, 34, 200, 50, 4, 97, 72, 20, 9, 34, 199, 221, 4, 223, 38, + 72, 20, 9, 34, 199, 221, 4, 91, 72, 20, 9, 34, 199, 221, 4, 157, 217, + 169, 72, 20, 9, 34, 199, 221, 4, 97, 72, 20, 9, 34, 223, 38, 4, 176, 72, + 20, 9, 34, 223, 38, 4, 91, 72, 20, 9, 34, 176, 4, 223, 38, 72, 20, 9, 34, + 176, 4, 91, 72, 20, 9, 34, 221, 246, 4, 223, 38, 72, 20, 9, 34, 221, 246, + 4, 176, 72, 20, 9, 34, 221, 246, 4, 91, 72, 20, 9, 34, 205, 202, 4, 223, + 38, 72, 20, 9, 34, 205, 202, 4, 176, 72, 20, 9, 34, 205, 202, 4, 221, + 246, 72, 20, 9, 34, 205, 202, 4, 91, 72, 20, 9, 34, 206, 87, 4, 176, 72, + 20, 9, 34, 206, 87, 4, 91, 72, 20, 9, 34, 237, 251, 4, 223, 38, 72, 20, + 9, 34, 237, 251, 4, 176, 72, 20, 9, 34, 237, 251, 4, 221, 246, 72, 20, 9, + 34, 237, 251, 4, 91, 72, 20, 9, 34, 200, 152, 4, 176, 72, 20, 9, 34, 200, + 152, 4, 91, 72, 20, 9, 34, 192, 107, 4, 91, 72, 20, 9, 34, 251, 58, 4, + 223, 38, 72, 20, 9, 34, 251, 58, 4, 91, 72, 20, 9, 34, 231, 80, 4, 223, + 38, 72, 20, 9, 34, 231, 80, 4, 91, 72, 20, 9, 34, 233, 35, 4, 223, 38, + 72, 20, 9, 34, 233, 35, 4, 176, 72, 20, 9, 34, 233, 35, 4, 221, 246, 72, + 20, 9, 34, 233, 35, 4, 91, 72, 20, 9, 34, 233, 35, 4, 157, 217, 169, 72, + 20, 9, 34, 233, 35, 4, 97, 72, 20, 9, 34, 208, 233, 4, 176, 72, 20, 9, + 34, 208, 233, 4, 91, 72, 20, 9, 34, 208, 233, 4, 157, 217, 169, 72, 20, + 9, 34, 208, 233, 4, 97, 72, 20, 9, 34, 222, 140, 4, 157, 72, 20, 9, 34, + 222, 140, 4, 223, 38, 72, 20, 9, 34, 222, 140, 4, 176, 72, 20, 9, 34, + 222, 140, 4, 221, 246, 72, 20, 9, 34, 222, 140, 4, 220, 95, 72, 20, 9, + 34, 222, 140, 4, 91, 72, 20, 9, 34, 222, 140, 4, 157, 217, 169, 72, 20, + 9, 34, 222, 140, 4, 97, 72, 20, 9, 34, 220, 95, 4, 223, 38, 72, 20, 9, + 34, 220, 95, 4, 176, 72, 20, 9, 34, 220, 95, 4, 221, 246, 72, 20, 9, 34, + 220, 95, 4, 91, 72, 20, 9, 34, 220, 95, 4, 157, 217, 169, 72, 20, 9, 34, + 220, 95, 4, 97, 72, 20, 9, 34, 91, 4, 223, 38, 72, 20, 9, 34, 91, 4, 176, + 72, 20, 9, 34, 91, 4, 221, 246, 72, 20, 9, 34, 91, 4, 91, 72, 20, 9, 34, + 91, 4, 157, 217, 169, 72, 20, 9, 34, 91, 4, 97, 72, 20, 9, 34, 213, 124, + 4, 223, 38, 72, 20, 9, 34, 213, 124, 4, 176, 72, 20, 9, 34, 213, 124, 4, + 221, 246, 72, 20, 9, 34, 213, 124, 4, 91, 72, 20, 9, 34, 213, 124, 4, + 157, 217, 169, 72, 20, 9, 34, 213, 124, 4, 97, 72, 20, 9, 34, 229, 221, + 4, 223, 38, 72, 20, 9, 34, 229, 221, 4, 91, 72, 20, 9, 34, 229, 221, 4, + 157, 217, 169, 72, 20, 9, 34, 229, 221, 4, 97, 72, 20, 9, 34, 97, 4, 223, + 38, 72, 20, 9, 34, 97, 4, 176, 72, 20, 9, 34, 97, 4, 221, 246, 72, 20, 9, + 34, 97, 4, 91, 72, 20, 9, 34, 97, 4, 157, 217, 169, 72, 20, 9, 34, 97, 4, + 97, 72, 20, 9, 34, 199, 233, 4, 201, 107, 157, 72, 20, 9, 34, 207, 222, + 4, 201, 107, 157, 72, 20, 9, 34, 157, 217, 169, 4, 201, 107, 157, 72, 20, + 9, 34, 204, 55, 4, 237, 214, 72, 20, 9, 34, 204, 55, 4, 222, 85, 72, 20, + 9, 34, 204, 55, 4, 233, 59, 72, 20, 9, 34, 204, 55, 4, 237, 216, 72, 20, + 9, 34, 204, 55, 4, 222, 87, 72, 20, 9, 34, 204, 55, 4, 201, 107, 157, 72, + 20, 9, 34, 97, 4, 230, 67, 95, 4, 207, 222, 52, 20, 9, 34, 97, 4, 230, + 67, 95, 4, 192, 104, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, 91, 52, 20, 9, + 34, 97, 4, 230, 67, 95, 4, 213, 124, 52, 20, 9, 34, 97, 4, 230, 67, 95, + 4, 157, 217, 169, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, 97, 52, 20, 9, + 34, 248, 97, 4, 207, 222, 52, 20, 9, 34, 248, 97, 4, 192, 104, 52, 20, 9, + 34, 248, 97, 4, 91, 52, 20, 9, 34, 248, 97, 4, 213, 124, 52, 20, 9, 34, + 248, 97, 4, 157, 217, 169, 52, 20, 9, 34, 248, 97, 4, 97, 52, 20, 9, 34, + 200, 50, 4, 207, 222, 52, 20, 9, 34, 200, 50, 4, 192, 104, 52, 20, 9, 34, + 200, 50, 4, 91, 52, 20, 9, 34, 200, 50, 4, 213, 124, 52, 20, 9, 34, 200, + 50, 4, 157, 217, 169, 52, 20, 9, 34, 200, 50, 4, 97, 52, 20, 9, 34, 199, + 221, 4, 207, 222, 52, 20, 9, 34, 199, 221, 4, 192, 104, 52, 20, 9, 34, + 199, 221, 4, 91, 52, 20, 9, 34, 199, 221, 4, 213, 124, 52, 20, 9, 34, + 199, 221, 4, 157, 217, 169, 52, 20, 9, 34, 199, 221, 4, 97, 52, 20, 9, + 34, 233, 35, 4, 157, 217, 169, 52, 20, 9, 34, 233, 35, 4, 97, 52, 20, 9, + 34, 208, 233, 4, 157, 217, 169, 52, 20, 9, 34, 208, 233, 4, 97, 52, 20, + 9, 34, 222, 140, 4, 157, 52, 20, 9, 34, 222, 140, 4, 220, 95, 52, 20, 9, + 34, 222, 140, 4, 91, 52, 20, 9, 34, 222, 140, 4, 157, 217, 169, 52, 20, + 9, 34, 222, 140, 4, 97, 52, 20, 9, 34, 220, 95, 4, 91, 52, 20, 9, 34, + 220, 95, 4, 157, 217, 169, 52, 20, 9, 34, 220, 95, 4, 97, 52, 20, 9, 34, + 91, 4, 157, 52, 20, 9, 34, 91, 4, 91, 52, 20, 9, 34, 213, 124, 4, 207, + 222, 52, 20, 9, 34, 213, 124, 4, 192, 104, 52, 20, 9, 34, 213, 124, 4, + 91, 52, 20, 9, 34, 213, 124, 4, 213, 124, 52, 20, 9, 34, 213, 124, 4, + 157, 217, 169, 52, 20, 9, 34, 213, 124, 4, 97, 52, 20, 9, 34, 157, 217, + 169, 4, 201, 107, 157, 52, 20, 9, 34, 97, 4, 207, 222, 52, 20, 9, 34, 97, + 4, 192, 104, 52, 20, 9, 34, 97, 4, 91, 52, 20, 9, 34, 97, 4, 213, 124, + 52, 20, 9, 34, 97, 4, 157, 217, 169, 52, 20, 9, 34, 97, 4, 97, 52, 20, 9, + 34, 97, 4, 230, 67, 95, 4, 223, 38, 88, 20, 9, 34, 97, 4, 230, 67, 95, 4, + 176, 88, 20, 9, 34, 97, 4, 230, 67, 95, 4, 221, 246, 88, 20, 9, 34, 97, + 4, 230, 67, 95, 4, 91, 88, 20, 9, 34, 97, 4, 230, 67, 95, 4, 229, 221, + 88, 20, 9, 34, 248, 97, 4, 223, 38, 88, 20, 9, 34, 248, 97, 4, 176, 88, + 20, 9, 34, 248, 97, 4, 221, 246, 88, 20, 9, 34, 248, 97, 4, 91, 88, 20, + 9, 34, 248, 97, 4, 229, 221, 88, 20, 9, 34, 200, 50, 4, 223, 38, 88, 20, + 9, 34, 200, 50, 4, 176, 88, 20, 9, 34, 200, 50, 4, 221, 246, 88, 20, 9, + 34, 200, 50, 4, 91, 88, 20, 9, 34, 200, 50, 4, 229, 221, 88, 20, 9, 34, + 199, 221, 4, 91, 88, 20, 9, 34, 223, 38, 4, 176, 88, 20, 9, 34, 223, 38, + 4, 91, 88, 20, 9, 34, 176, 4, 223, 38, 88, 20, 9, 34, 176, 4, 91, 88, 20, + 9, 34, 221, 246, 4, 223, 38, 88, 20, 9, 34, 221, 246, 4, 91, 88, 20, 9, + 34, 205, 202, 4, 223, 38, 88, 20, 9, 34, 205, 202, 4, 176, 88, 20, 9, 34, + 205, 202, 4, 221, 246, 88, 20, 9, 34, 205, 202, 4, 91, 88, 20, 9, 34, + 206, 87, 4, 176, 88, 20, 9, 34, 206, 87, 4, 221, 246, 88, 20, 9, 34, 206, + 87, 4, 91, 88, 20, 9, 34, 237, 251, 4, 223, 38, 88, 20, 9, 34, 237, 251, + 4, 176, 88, 20, 9, 34, 237, 251, 4, 221, 246, 88, 20, 9, 34, 237, 251, 4, + 91, 88, 20, 9, 34, 200, 152, 4, 176, 88, 20, 9, 34, 192, 107, 4, 91, 88, + 20, 9, 34, 251, 58, 4, 223, 38, 88, 20, 9, 34, 251, 58, 4, 91, 88, 20, 9, + 34, 231, 80, 4, 223, 38, 88, 20, 9, 34, 231, 80, 4, 91, 88, 20, 9, 34, + 233, 35, 4, 223, 38, 88, 20, 9, 34, 233, 35, 4, 176, 88, 20, 9, 34, 233, + 35, 4, 221, 246, 88, 20, 9, 34, 233, 35, 4, 91, 88, 20, 9, 34, 208, 233, + 4, 176, 88, 20, 9, 34, 208, 233, 4, 91, 88, 20, 9, 34, 222, 140, 4, 223, + 38, 88, 20, 9, 34, 222, 140, 4, 176, 88, 20, 9, 34, 222, 140, 4, 221, + 246, 88, 20, 9, 34, 222, 140, 4, 220, 95, 88, 20, 9, 34, 222, 140, 4, 91, + 88, 20, 9, 34, 220, 95, 4, 223, 38, 88, 20, 9, 34, 220, 95, 4, 176, 88, + 20, 9, 34, 220, 95, 4, 221, 246, 88, 20, 9, 34, 220, 95, 4, 91, 88, 20, + 9, 34, 220, 95, 4, 229, 221, 88, 20, 9, 34, 91, 4, 223, 38, 88, 20, 9, + 34, 91, 4, 176, 88, 20, 9, 34, 91, 4, 221, 246, 88, 20, 9, 34, 91, 4, 91, + 88, 20, 9, 34, 213, 124, 4, 223, 38, 88, 20, 9, 34, 213, 124, 4, 176, 88, + 20, 9, 34, 213, 124, 4, 221, 246, 88, 20, 9, 34, 213, 124, 4, 91, 88, 20, + 9, 34, 213, 124, 4, 229, 221, 88, 20, 9, 34, 229, 221, 4, 223, 38, 88, + 20, 9, 34, 229, 221, 4, 91, 88, 20, 9, 34, 229, 221, 4, 201, 107, 157, + 88, 20, 9, 34, 97, 4, 223, 38, 88, 20, 9, 34, 97, 4, 176, 88, 20, 9, 34, + 97, 4, 221, 246, 88, 20, 9, 34, 97, 4, 91, 88, 20, 9, 34, 97, 4, 229, + 221, 88, 20, 9, 34, 97, 4, 230, 67, 95, 4, 91, 217, 35, 20, 9, 34, 97, 4, + 230, 67, 95, 4, 229, 221, 217, 35, 20, 9, 34, 248, 97, 4, 91, 217, 35, + 20, 9, 34, 248, 97, 4, 229, 221, 217, 35, 20, 9, 34, 200, 50, 4, 91, 217, + 35, 20, 9, 34, 200, 50, 4, 229, 221, 217, 35, 20, 9, 34, 199, 221, 4, 91, + 217, 35, 20, 9, 34, 199, 221, 4, 229, 221, 217, 35, 20, 9, 34, 205, 202, + 4, 91, 217, 35, 20, 9, 34, 205, 202, 4, 229, 221, 217, 35, 20, 9, 34, + 204, 9, 4, 91, 217, 35, 20, 9, 34, 204, 9, 4, 229, 221, 217, 35, 20, 9, + 34, 222, 140, 4, 220, 95, 217, 35, 20, 9, 34, 222, 140, 4, 91, 217, 35, + 20, 9, 34, 220, 95, 4, 91, 217, 35, 20, 9, 34, 213, 124, 4, 91, 217, 35, + 20, 9, 34, 213, 124, 4, 229, 221, 217, 35, 20, 9, 34, 97, 4, 91, 217, 35, + 20, 9, 34, 97, 4, 229, 221, 217, 35, 20, 9, 34, 204, 55, 4, 233, 59, 217, + 35, 20, 9, 34, 204, 55, 4, 237, 216, 217, 35, 20, 9, 34, 204, 55, 4, 222, + 87, 217, 35, 20, 9, 34, 200, 152, 4, 157, 217, 169, 72, 20, 9, 34, 200, + 152, 4, 97, 72, 20, 9, 34, 251, 58, 4, 157, 217, 169, 72, 20, 9, 34, 251, + 58, 4, 97, 72, 20, 9, 34, 231, 80, 4, 157, 217, 169, 72, 20, 9, 34, 231, + 80, 4, 97, 72, 20, 9, 34, 205, 202, 4, 157, 217, 169, 72, 20, 9, 34, 205, + 202, 4, 97, 72, 20, 9, 34, 204, 9, 4, 157, 217, 169, 72, 20, 9, 34, 204, + 9, 4, 97, 72, 20, 9, 34, 176, 4, 157, 217, 169, 72, 20, 9, 34, 176, 4, + 97, 72, 20, 9, 34, 223, 38, 4, 157, 217, 169, 72, 20, 9, 34, 223, 38, 4, + 97, 72, 20, 9, 34, 221, 246, 4, 157, 217, 169, 72, 20, 9, 34, 221, 246, + 4, 97, 72, 20, 9, 34, 206, 87, 4, 157, 217, 169, 72, 20, 9, 34, 206, 87, + 4, 97, 72, 20, 9, 34, 237, 251, 4, 157, 217, 169, 72, 20, 9, 34, 237, + 251, 4, 97, 72, 20, 9, 34, 204, 9, 4, 223, 38, 72, 20, 9, 34, 204, 9, 4, + 176, 72, 20, 9, 34, 204, 9, 4, 221, 246, 72, 20, 9, 34, 204, 9, 4, 91, + 72, 20, 9, 34, 204, 9, 4, 207, 222, 72, 20, 9, 34, 205, 202, 4, 207, 222, + 72, 20, 9, 34, 206, 87, 4, 207, 222, 72, 20, 9, 34, 237, 251, 4, 207, + 222, 72, 20, 9, 34, 200, 152, 4, 157, 217, 169, 52, 20, 9, 34, 200, 152, + 4, 97, 52, 20, 9, 34, 251, 58, 4, 157, 217, 169, 52, 20, 9, 34, 251, 58, + 4, 97, 52, 20, 9, 34, 231, 80, 4, 157, 217, 169, 52, 20, 9, 34, 231, 80, + 4, 97, 52, 20, 9, 34, 205, 202, 4, 157, 217, 169, 52, 20, 9, 34, 205, + 202, 4, 97, 52, 20, 9, 34, 204, 9, 4, 157, 217, 169, 52, 20, 9, 34, 204, + 9, 4, 97, 52, 20, 9, 34, 176, 4, 157, 217, 169, 52, 20, 9, 34, 176, 4, + 97, 52, 20, 9, 34, 223, 38, 4, 157, 217, 169, 52, 20, 9, 34, 223, 38, 4, + 97, 52, 20, 9, 34, 221, 246, 4, 157, 217, 169, 52, 20, 9, 34, 221, 246, + 4, 97, 52, 20, 9, 34, 206, 87, 4, 157, 217, 169, 52, 20, 9, 34, 206, 87, + 4, 97, 52, 20, 9, 34, 237, 251, 4, 157, 217, 169, 52, 20, 9, 34, 237, + 251, 4, 97, 52, 20, 9, 34, 204, 9, 4, 223, 38, 52, 20, 9, 34, 204, 9, 4, + 176, 52, 20, 9, 34, 204, 9, 4, 221, 246, 52, 20, 9, 34, 204, 9, 4, 91, + 52, 20, 9, 34, 204, 9, 4, 207, 222, 52, 20, 9, 34, 205, 202, 4, 207, 222, + 52, 20, 9, 34, 206, 87, 4, 207, 222, 52, 20, 9, 34, 237, 251, 4, 207, + 222, 52, 20, 9, 34, 204, 9, 4, 223, 38, 88, 20, 9, 34, 204, 9, 4, 176, + 88, 20, 9, 34, 204, 9, 4, 221, 246, 88, 20, 9, 34, 204, 9, 4, 91, 88, 20, + 9, 34, 205, 202, 4, 229, 221, 88, 20, 9, 34, 204, 9, 4, 229, 221, 88, 20, + 9, 34, 200, 152, 4, 91, 88, 20, 9, 34, 205, 202, 4, 223, 38, 217, 35, 20, + 9, 34, 205, 202, 4, 176, 217, 35, 20, 9, 34, 205, 202, 4, 221, 246, 217, + 35, 20, 9, 34, 204, 9, 4, 223, 38, 217, 35, 20, 9, 34, 204, 9, 4, 176, + 217, 35, 20, 9, 34, 204, 9, 4, 221, 246, 217, 35, 20, 9, 34, 200, 152, 4, + 91, 217, 35, 20, 9, 34, 192, 107, 4, 91, 217, 35, 20, 9, 34, 157, 4, 233, + 57, 52, 20, 9, 34, 157, 4, 233, 57, 72, 20, 211, 148, 46, 210, 230, 211, + 148, 51, 210, 230, 9, 34, 200, 50, 4, 223, 38, 4, 91, 88, 20, 9, 34, 200, + 50, 4, 176, 4, 223, 38, 52, 20, 9, 34, 200, 50, 4, 176, 4, 223, 38, 88, + 20, 9, 34, 200, 50, 4, 176, 4, 91, 88, 20, 9, 34, 200, 50, 4, 221, 246, + 4, 91, 88, 20, 9, 34, 200, 50, 4, 91, 4, 223, 38, 88, 20, 9, 34, 200, 50, + 4, 91, 4, 176, 88, 20, 9, 34, 200, 50, 4, 91, 4, 221, 246, 88, 20, 9, 34, + 223, 38, 4, 91, 4, 176, 52, 20, 9, 34, 223, 38, 4, 91, 4, 176, 88, 20, 9, + 34, 176, 4, 91, 4, 97, 52, 20, 9, 34, 176, 4, 91, 4, 157, 217, 169, 52, + 20, 9, 34, 205, 202, 4, 176, 4, 223, 38, 88, 20, 9, 34, 205, 202, 4, 223, + 38, 4, 176, 88, 20, 9, 34, 205, 202, 4, 223, 38, 4, 157, 217, 169, 52, + 20, 9, 34, 205, 202, 4, 91, 4, 176, 52, 20, 9, 34, 205, 202, 4, 91, 4, + 176, 88, 20, 9, 34, 205, 202, 4, 91, 4, 223, 38, 88, 20, 9, 34, 205, 202, + 4, 91, 4, 91, 52, 20, 9, 34, 205, 202, 4, 91, 4, 91, 88, 20, 9, 34, 206, + 87, 4, 176, 4, 176, 52, 20, 9, 34, 206, 87, 4, 176, 4, 176, 88, 20, 9, + 34, 206, 87, 4, 91, 4, 91, 52, 20, 9, 34, 204, 9, 4, 176, 4, 91, 52, 20, + 9, 34, 204, 9, 4, 176, 4, 91, 88, 20, 9, 34, 204, 9, 4, 223, 38, 4, 97, + 52, 20, 9, 34, 204, 9, 4, 91, 4, 221, 246, 52, 20, 9, 34, 204, 9, 4, 91, + 4, 221, 246, 88, 20, 9, 34, 204, 9, 4, 91, 4, 91, 52, 20, 9, 34, 204, 9, + 4, 91, 4, 91, 88, 20, 9, 34, 237, 251, 4, 176, 4, 157, 217, 169, 52, 20, + 9, 34, 237, 251, 4, 221, 246, 4, 91, 52, 20, 9, 34, 237, 251, 4, 221, + 246, 4, 91, 88, 20, 9, 34, 200, 152, 4, 91, 4, 176, 52, 20, 9, 34, 200, + 152, 4, 91, 4, 176, 88, 20, 9, 34, 200, 152, 4, 91, 4, 91, 88, 20, 9, 34, + 200, 152, 4, 91, 4, 97, 52, 20, 9, 34, 251, 58, 4, 223, 38, 4, 91, 52, + 20, 9, 34, 251, 58, 4, 91, 4, 91, 52, 20, 9, 34, 251, 58, 4, 91, 4, 91, + 88, 20, 9, 34, 251, 58, 4, 91, 4, 157, 217, 169, 52, 20, 9, 34, 231, 80, + 4, 91, 4, 91, 52, 20, 9, 34, 231, 80, 4, 91, 4, 97, 52, 20, 9, 34, 231, + 80, 4, 91, 4, 157, 217, 169, 52, 20, 9, 34, 233, 35, 4, 221, 246, 4, 91, + 52, 20, 9, 34, 233, 35, 4, 221, 246, 4, 91, 88, 20, 9, 34, 208, 233, 4, + 91, 4, 176, 52, 20, 9, 34, 208, 233, 4, 91, 4, 91, 52, 20, 9, 34, 220, + 95, 4, 176, 4, 91, 52, 20, 9, 34, 220, 95, 4, 176, 4, 97, 52, 20, 9, 34, + 220, 95, 4, 176, 4, 157, 217, 169, 52, 20, 9, 34, 220, 95, 4, 223, 38, 4, + 223, 38, 88, 20, 9, 34, 220, 95, 4, 223, 38, 4, 223, 38, 52, 20, 9, 34, + 220, 95, 4, 221, 246, 4, 91, 52, 20, 9, 34, 220, 95, 4, 221, 246, 4, 91, + 88, 20, 9, 34, 220, 95, 4, 91, 4, 176, 52, 20, 9, 34, 220, 95, 4, 91, 4, + 176, 88, 20, 9, 34, 91, 4, 176, 4, 223, 38, 88, 20, 9, 34, 91, 4, 176, 4, + 91, 88, 20, 9, 34, 91, 4, 176, 4, 97, 52, 20, 9, 34, 91, 4, 223, 38, 4, + 176, 88, 20, 9, 34, 91, 4, 223, 38, 4, 91, 88, 20, 9, 34, 91, 4, 221, + 246, 4, 223, 38, 88, 20, 9, 34, 91, 4, 221, 246, 4, 91, 88, 20, 9, 34, + 91, 4, 223, 38, 4, 221, 246, 88, 20, 9, 34, 229, 221, 4, 91, 4, 223, 38, + 88, 20, 9, 34, 229, 221, 4, 91, 4, 91, 88, 20, 9, 34, 213, 124, 4, 176, + 4, 91, 88, 20, 9, 34, 213, 124, 4, 176, 4, 157, 217, 169, 52, 20, 9, 34, + 213, 124, 4, 223, 38, 4, 91, 52, 20, 9, 34, 213, 124, 4, 223, 38, 4, 91, + 88, 20, 9, 34, 213, 124, 4, 223, 38, 4, 157, 217, 169, 52, 20, 9, 34, + 213, 124, 4, 91, 4, 97, 52, 20, 9, 34, 213, 124, 4, 91, 4, 157, 217, 169, + 52, 20, 9, 34, 97, 4, 91, 4, 91, 52, 20, 9, 34, 97, 4, 91, 4, 91, 88, 20, + 9, 34, 248, 97, 4, 221, 246, 4, 97, 52, 20, 9, 34, 200, 50, 4, 223, 38, + 4, 97, 52, 20, 9, 34, 200, 50, 4, 223, 38, 4, 157, 217, 169, 52, 20, 9, + 34, 200, 50, 4, 221, 246, 4, 97, 52, 20, 9, 34, 200, 50, 4, 221, 246, 4, + 157, 217, 169, 52, 20, 9, 34, 200, 50, 4, 91, 4, 97, 52, 20, 9, 34, 200, + 50, 4, 91, 4, 157, 217, 169, 52, 20, 9, 34, 223, 38, 4, 91, 4, 97, 52, + 20, 9, 34, 223, 38, 4, 176, 4, 157, 217, 169, 52, 20, 9, 34, 223, 38, 4, + 91, 4, 157, 217, 169, 52, 20, 9, 34, 205, 202, 4, 221, 246, 4, 157, 217, + 169, 52, 20, 9, 34, 206, 87, 4, 176, 4, 97, 52, 20, 9, 34, 204, 9, 4, + 176, 4, 97, 52, 20, 9, 34, 237, 251, 4, 176, 4, 97, 52, 20, 9, 34, 220, + 95, 4, 223, 38, 4, 97, 52, 20, 9, 34, 220, 95, 4, 91, 4, 97, 52, 20, 9, + 34, 97, 4, 176, 4, 97, 52, 20, 9, 34, 97, 4, 223, 38, 4, 97, 52, 20, 9, + 34, 97, 4, 91, 4, 97, 52, 20, 9, 34, 91, 4, 91, 4, 97, 52, 20, 9, 34, + 208, 233, 4, 91, 4, 97, 52, 20, 9, 34, 213, 124, 4, 176, 4, 97, 52, 20, + 9, 34, 208, 233, 4, 91, 4, 176, 88, 20, 9, 34, 220, 95, 4, 176, 4, 91, + 88, 20, 9, 34, 251, 58, 4, 91, 4, 97, 52, 20, 9, 34, 222, 140, 4, 91, 4, + 97, 52, 20, 9, 34, 213, 124, 4, 223, 38, 4, 176, 88, 20, 9, 34, 91, 4, + 221, 246, 4, 97, 52, 20, 9, 34, 220, 95, 4, 223, 38, 4, 91, 88, 20, 9, + 34, 222, 140, 4, 91, 4, 91, 52, 20, 9, 34, 220, 95, 4, 223, 38, 4, 91, + 52, 20, 9, 34, 213, 124, 4, 223, 38, 4, 176, 52, 20, 9, 34, 223, 38, 4, + 176, 4, 97, 52, 20, 9, 34, 176, 4, 223, 38, 4, 97, 52, 20, 9, 34, 91, 4, + 223, 38, 4, 97, 52, 20, 9, 34, 233, 35, 4, 91, 4, 97, 52, 20, 9, 34, 248, + 97, 4, 176, 4, 97, 52, 20, 9, 34, 222, 140, 4, 91, 4, 91, 88, 20, 9, 34, + 251, 58, 4, 223, 38, 4, 91, 88, 20, 9, 34, 206, 87, 4, 91, 4, 91, 88, 20, + 9, 34, 205, 202, 4, 221, 246, 4, 97, 52, 20, 9, 34, 213, 124, 4, 223, 38, + 4, 97, 52, 20, 9, 34, 206, 58, 197, 5, 250, 62, 221, 80, 201, 239, 3, 72, + 20, 9, 34, 208, 229, 197, 5, 250, 62, 221, 80, 201, 239, 3, 72, 20, 9, + 34, 251, 7, 72, 20, 9, 34, 251, 41, 72, 20, 9, 34, 216, 58, 72, 20, 9, + 34, 206, 59, 72, 20, 9, 34, 208, 24, 72, 20, 9, 34, 251, 29, 72, 20, 9, + 34, 194, 139, 72, 20, 9, 34, 206, 58, 72, 20, 9, 34, 206, 57, 251, 29, + 194, 138, 9, 34, 223, 53, 207, 143, 57, 9, 34, 248, 4, 250, 129, 250, + 130, 65, 205, 188, 65, 205, 77, 65, 205, 9, 65, 204, 254, 65, 204, 243, + 65, 204, 232, 65, 204, 221, 65, 204, 210, 65, 204, 199, 65, 205, 187, 65, + 205, 176, 65, 205, 165, 65, 205, 154, 65, 205, 143, 65, 205, 132, 65, + 205, 121, 209, 105, 232, 136, 39, 84, 242, 38, 209, 105, 232, 136, 39, + 84, 149, 242, 38, 209, 105, 232, 136, 39, 84, 149, 232, 71, 201, 238, + 209, 105, 232, 136, 39, 84, 242, 47, 209, 105, 232, 136, 39, 84, 204, + 180, 209, 105, 232, 136, 39, 84, 233, 204, 77, 209, 105, 232, 136, 39, + 84, 208, 159, 77, 209, 105, 232, 136, 39, 84, 46, 62, 219, 247, 186, 209, + 105, 232, 136, 39, 84, 51, 62, 219, 247, 247, 162, 209, 105, 232, 136, + 39, 84, 229, 5, 234, 105, 38, 34, 46, 230, 78, 38, 34, 51, 230, 78, 38, + 55, 199, 91, 46, 230, 78, 38, 55, 199, 91, 51, 230, 78, 38, 217, 215, 46, + 230, 78, 38, 217, 215, 51, 230, 78, 38, 239, 9, 217, 214, 38, 34, 46, + 138, 63, 38, 34, 51, 138, 63, 38, 199, 91, 46, 138, 63, 38, 199, 91, 51, + 138, 63, 38, 217, 215, 46, 138, 63, 38, 217, 215, 51, 138, 63, 38, 239, + 9, 217, 215, 63, 38, 42, 199, 61, 46, 230, 78, 38, 42, 199, 61, 51, 230, + 78, 209, 105, 232, 136, 39, 84, 103, 78, 220, 40, 209, 105, 232, 136, 39, + 84, 234, 100, 237, 185, 209, 105, 232, 136, 39, 84, 234, 89, 237, 185, + 209, 105, 232, 136, 39, 84, 132, 219, 175, 209, 105, 232, 136, 39, 84, + 194, 121, 132, 219, 175, 209, 105, 232, 136, 39, 84, 46, 210, 230, 209, + 105, 232, 136, 39, 84, 51, 210, 230, 209, 105, 232, 136, 39, 84, 46, 238, + 138, 186, 209, 105, 232, 136, 39, 84, 51, 238, 138, 186, 209, 105, 232, + 136, 39, 84, 46, 198, 237, 204, 2, 186, 209, 105, 232, 136, 39, 84, 51, + 198, 237, 204, 2, 186, 209, 105, 232, 136, 39, 84, 46, 60, 219, 247, 186, + 209, 105, 232, 136, 39, 84, 51, 60, 219, 247, 186, 209, 105, 232, 136, + 39, 84, 46, 55, 250, 208, 186, 209, 105, 232, 136, 39, 84, 51, 55, 250, + 208, 186, 209, 105, 232, 136, 39, 84, 46, 250, 208, 186, 209, 105, 232, + 136, 39, 84, 51, 250, 208, 186, 209, 105, 232, 136, 39, 84, 46, 238, 224, + 186, 209, 105, 232, 136, 39, 84, 51, 238, 224, 186, 209, 105, 232, 136, + 39, 84, 46, 62, 238, 224, 186, 209, 105, 232, 136, 39, 84, 51, 62, 238, + 224, 186, 204, 155, 236, 114, 62, 204, 155, 236, 114, 209, 105, 232, 136, + 39, 84, 46, 50, 186, 209, 105, 232, 136, 39, 84, 51, 50, 186, 237, 184, + 211, 109, 246, 134, 211, 109, 194, 121, 211, 109, 55, 194, 121, 211, 109, + 237, 184, 132, 219, 175, 246, 134, 132, 219, 175, 194, 121, 132, 219, + 175, 2, 242, 38, 2, 149, 242, 38, 2, 232, 71, 201, 238, 2, 204, 180, 2, + 242, 47, 2, 208, 159, 77, 2, 233, 204, 77, 2, 234, 100, 237, 185, 2, 46, + 210, 230, 2, 51, 210, 230, 2, 46, 238, 138, 186, 2, 51, 238, 138, 186, 2, + 46, 198, 237, 204, 2, 186, 2, 51, 198, 237, 204, 2, 186, 2, 31, 57, 2, + 250, 229, 2, 250, 37, 2, 102, 57, 2, 228, 110, 2, 219, 240, 57, 2, 230, + 204, 57, 2, 234, 30, 57, 2, 207, 169, 202, 189, 2, 236, 127, 57, 2, 210, + 133, 57, 2, 242, 36, 250, 26, 9, 233, 57, 72, 20, 9, 200, 103, 4, 233, + 57, 58, 9, 237, 214, 72, 20, 9, 200, 148, 232, 108, 9, 222, 85, 72, 20, + 9, 233, 59, 72, 20, 9, 233, 59, 217, 35, 20, 9, 237, 216, 72, 20, 9, 237, + 216, 217, 35, 20, 9, 222, 87, 72, 20, 9, 222, 87, 217, 35, 20, 9, 204, + 55, 72, 20, 9, 204, 55, 217, 35, 20, 9, 201, 132, 72, 20, 9, 201, 132, + 217, 35, 20, 9, 1, 230, 67, 72, 20, 9, 1, 157, 4, 217, 210, 95, 72, 20, + 9, 1, 157, 4, 217, 210, 95, 52, 20, 9, 1, 157, 4, 230, 67, 95, 72, 20, 9, + 1, 157, 4, 230, 67, 95, 52, 20, 9, 1, 194, 120, 4, 230, 67, 95, 72, 20, + 9, 1, 194, 120, 4, 230, 67, 95, 52, 20, 9, 1, 157, 4, 230, 67, 248, 84, + 72, 20, 9, 1, 157, 4, 230, 67, 248, 84, 52, 20, 9, 1, 97, 4, 230, 67, 95, + 72, 20, 9, 1, 97, 4, 230, 67, 95, 52, 20, 9, 1, 97, 4, 230, 67, 95, 88, + 20, 9, 1, 97, 4, 230, 67, 95, 217, 35, 20, 9, 1, 157, 72, 20, 9, 1, 157, + 52, 20, 9, 1, 248, 97, 72, 20, 9, 1, 248, 97, 52, 20, 9, 1, 248, 97, 88, + 20, 9, 1, 248, 97, 217, 35, 20, 9, 1, 200, 50, 217, 134, 72, 20, 9, 1, + 200, 50, 217, 134, 52, 20, 9, 1, 200, 50, 72, 20, 9, 1, 200, 50, 52, 20, + 9, 1, 200, 50, 88, 20, 9, 1, 200, 50, 217, 35, 20, 9, 1, 199, 221, 72, + 20, 9, 1, 199, 221, 52, 20, 9, 1, 199, 221, 88, 20, 9, 1, 199, 221, 217, + 35, 20, 9, 1, 223, 38, 72, 20, 9, 1, 223, 38, 52, 20, 9, 1, 223, 38, 88, + 20, 9, 1, 223, 38, 217, 35, 20, 9, 1, 176, 72, 20, 9, 1, 176, 52, 20, 9, + 1, 176, 88, 20, 9, 1, 176, 217, 35, 20, 9, 1, 221, 246, 72, 20, 9, 1, + 221, 246, 52, 20, 9, 1, 221, 246, 88, 20, 9, 1, 221, 246, 217, 35, 20, 9, + 1, 237, 228, 72, 20, 9, 1, 237, 228, 52, 20, 9, 1, 199, 233, 72, 20, 9, + 1, 199, 233, 52, 20, 9, 1, 207, 222, 72, 20, 9, 1, 207, 222, 52, 20, 9, + 1, 192, 104, 72, 20, 9, 1, 192, 104, 52, 20, 9, 1, 205, 202, 72, 20, 9, + 1, 205, 202, 52, 20, 9, 1, 205, 202, 88, 20, 9, 1, 205, 202, 217, 35, 20, + 9, 1, 204, 9, 72, 20, 9, 1, 204, 9, 52, 20, 9, 1, 204, 9, 88, 20, 9, 1, + 204, 9, 217, 35, 20, 9, 1, 206, 87, 72, 20, 9, 1, 206, 87, 52, 20, 9, 1, + 206, 87, 88, 20, 9, 1, 206, 87, 217, 35, 20, 9, 1, 237, 251, 72, 20, 9, + 1, 237, 251, 52, 20, 9, 1, 237, 251, 88, 20, 9, 1, 237, 251, 217, 35, 20, + 9, 1, 200, 152, 72, 20, 9, 1, 200, 152, 52, 20, 9, 1, 200, 152, 88, 20, + 9, 1, 200, 152, 217, 35, 20, 9, 1, 192, 107, 72, 20, 9, 1, 192, 107, 52, + 20, 9, 1, 192, 107, 88, 20, 9, 1, 192, 107, 217, 35, 20, 9, 1, 251, 58, + 72, 20, 9, 1, 251, 58, 52, 20, 9, 1, 251, 58, 88, 20, 9, 1, 251, 58, 217, + 35, 20, 9, 1, 231, 80, 72, 20, 9, 1, 231, 80, 52, 20, 9, 1, 231, 80, 88, + 20, 9, 1, 231, 80, 217, 35, 20, 9, 1, 233, 35, 72, 20, 9, 1, 233, 35, 52, + 20, 9, 1, 233, 35, 88, 20, 9, 1, 233, 35, 217, 35, 20, 9, 1, 208, 233, + 72, 20, 9, 1, 208, 233, 52, 20, 9, 1, 208, 233, 88, 20, 9, 1, 208, 233, + 217, 35, 20, 9, 1, 222, 140, 72, 20, 9, 1, 222, 140, 52, 20, 9, 1, 222, + 140, 88, 20, 9, 1, 222, 140, 217, 35, 20, 9, 1, 220, 95, 72, 20, 9, 1, + 220, 95, 52, 20, 9, 1, 220, 95, 88, 20, 9, 1, 220, 95, 217, 35, 20, 9, 1, + 91, 72, 20, 9, 1, 91, 52, 20, 9, 1, 91, 88, 20, 9, 1, 91, 217, 35, 20, 9, + 1, 213, 124, 72, 20, 9, 1, 213, 124, 52, 20, 9, 1, 213, 124, 88, 20, 9, + 1, 213, 124, 217, 35, 20, 9, 1, 229, 221, 72, 20, 9, 1, 229, 221, 52, 20, + 9, 1, 229, 221, 88, 20, 9, 1, 229, 221, 217, 35, 20, 9, 1, 194, 120, 72, + 20, 9, 1, 194, 120, 52, 20, 9, 1, 157, 217, 169, 72, 20, 9, 1, 157, 217, + 169, 52, 20, 9, 1, 97, 72, 20, 9, 1, 97, 52, 20, 9, 1, 97, 88, 20, 9, 1, + 97, 217, 35, 20, 9, 34, 220, 95, 4, 157, 4, 217, 210, 95, 72, 20, 9, 34, + 220, 95, 4, 157, 4, 217, 210, 95, 52, 20, 9, 34, 220, 95, 4, 157, 4, 230, + 67, 95, 72, 20, 9, 34, 220, 95, 4, 157, 4, 230, 67, 95, 52, 20, 9, 34, + 220, 95, 4, 157, 4, 230, 67, 248, 84, 72, 20, 9, 34, 220, 95, 4, 157, 4, + 230, 67, 248, 84, 52, 20, 9, 34, 220, 95, 4, 157, 72, 20, 9, 34, 220, 95, + 4, 157, 52, 20, 192, 77, 194, 61, 213, 136, 202, 160, 183, 233, 204, 77, + 183, 208, 142, 77, 183, 31, 57, 183, 236, 127, 57, 183, 210, 133, 57, + 183, 250, 229, 183, 250, 147, 183, 46, 210, 230, 183, 51, 210, 230, 183, + 250, 37, 183, 102, 57, 183, 242, 38, 183, 228, 110, 183, 232, 71, 201, + 238, 183, 202, 189, 183, 17, 192, 76, 183, 17, 101, 183, 17, 104, 183, + 17, 133, 183, 17, 134, 183, 17, 151, 183, 17, 170, 183, 17, 179, 183, 17, + 174, 183, 17, 182, 183, 242, 47, 183, 204, 180, 183, 219, 240, 57, 183, + 234, 30, 57, 183, 230, 204, 57, 183, 208, 159, 77, 183, 242, 36, 250, 26, + 183, 8, 6, 1, 64, 183, 8, 6, 1, 249, 226, 183, 8, 6, 1, 247, 52, 183, 8, + 6, 1, 238, 95, 183, 8, 6, 1, 71, 183, 8, 6, 1, 233, 163, 183, 8, 6, 1, + 232, 44, 183, 8, 6, 1, 230, 124, 183, 8, 6, 1, 70, 183, 8, 6, 1, 223, 65, + 183, 8, 6, 1, 222, 184, 183, 8, 6, 1, 165, 183, 8, 6, 1, 218, 236, 183, + 8, 6, 1, 215, 151, 183, 8, 6, 1, 74, 183, 8, 6, 1, 211, 93, 183, 8, 6, 1, + 208, 247, 183, 8, 6, 1, 150, 183, 8, 6, 1, 206, 158, 183, 8, 6, 1, 200, + 228, 183, 8, 6, 1, 68, 183, 8, 6, 1, 196, 236, 183, 8, 6, 1, 194, 202, + 183, 8, 6, 1, 193, 223, 183, 8, 6, 1, 193, 148, 183, 8, 6, 1, 192, 155, + 183, 46, 50, 186, 183, 207, 169, 202, 189, 183, 51, 50, 186, 183, 242, + 122, 251, 143, 183, 132, 219, 175, 183, 230, 211, 251, 143, 183, 8, 2, 1, + 64, 183, 8, 2, 1, 249, 226, 183, 8, 2, 1, 247, 52, 183, 8, 2, 1, 238, 95, + 183, 8, 2, 1, 71, 183, 8, 2, 1, 233, 163, 183, 8, 2, 1, 232, 44, 183, 8, + 2, 1, 230, 124, 183, 8, 2, 1, 70, 183, 8, 2, 1, 223, 65, 183, 8, 2, 1, + 222, 184, 183, 8, 2, 1, 165, 183, 8, 2, 1, 218, 236, 183, 8, 2, 1, 215, + 151, 183, 8, 2, 1, 74, 183, 8, 2, 1, 211, 93, 183, 8, 2, 1, 208, 247, + 183, 8, 2, 1, 150, 183, 8, 2, 1, 206, 158, 183, 8, 2, 1, 200, 228, 183, + 8, 2, 1, 68, 183, 8, 2, 1, 196, 236, 183, 8, 2, 1, 194, 202, 183, 8, 2, + 1, 193, 223, 183, 8, 2, 1, 193, 148, 183, 8, 2, 1, 192, 155, 183, 46, + 238, 138, 186, 183, 84, 219, 175, 183, 51, 238, 138, 186, 183, 199, 90, + 183, 46, 62, 210, 230, 183, 51, 62, 210, 230, 145, 149, 232, 71, 201, + 238, 145, 46, 238, 224, 186, 145, 51, 238, 224, 186, 145, 149, 242, 38, + 145, 75, 85, 236, 114, 145, 75, 1, 194, 36, 145, 75, 1, 2, 64, 145, 75, + 1, 2, 70, 145, 75, 1, 2, 68, 145, 75, 1, 2, 71, 145, 75, 1, 2, 74, 145, + 75, 1, 2, 168, 145, 75, 1, 2, 192, 214, 145, 75, 1, 2, 193, 1, 145, 75, + 1, 2, 198, 45, 145, 222, 82, 209, 76, 202, 174, 77, 145, 75, 1, 64, 145, + 75, 1, 70, 145, 75, 1, 68, 145, 75, 1, 71, 145, 75, 1, 74, 145, 75, 1, + 160, 145, 75, 1, 221, 204, 145, 75, 1, 221, 33, 145, 75, 1, 222, 57, 145, + 75, 1, 221, 113, 145, 75, 1, 188, 145, 75, 1, 203, 125, 145, 75, 1, 201, + 184, 145, 75, 1, 205, 223, 145, 75, 1, 202, 212, 145, 75, 1, 189, 145, + 75, 1, 199, 128, 145, 75, 1, 198, 45, 145, 75, 1, 200, 79, 145, 75, 1, + 155, 145, 75, 1, 181, 145, 75, 1, 214, 60, 145, 75, 1, 213, 22, 145, 75, + 1, 214, 214, 145, 75, 1, 213, 142, 145, 75, 1, 144, 145, 75, 1, 229, 178, + 145, 75, 1, 228, 181, 145, 75, 1, 229, 255, 145, 75, 1, 229, 43, 145, 75, + 1, 172, 145, 75, 1, 216, 175, 145, 75, 1, 215, 241, 145, 75, 1, 217, 48, + 145, 75, 1, 216, 91, 145, 75, 1, 168, 145, 75, 1, 192, 214, 145, 75, 1, + 193, 1, 145, 75, 1, 167, 145, 75, 1, 207, 151, 145, 75, 1, 206, 218, 145, + 75, 1, 208, 7, 145, 75, 1, 207, 55, 145, 75, 1, 194, 169, 145, 75, 1, + 215, 151, 145, 75, 195, 248, 202, 174, 77, 145, 75, 204, 185, 202, 174, + 77, 145, 30, 232, 247, 145, 30, 1, 221, 151, 145, 30, 1, 202, 84, 145, + 30, 1, 221, 144, 145, 30, 1, 214, 45, 145, 30, 1, 214, 43, 145, 30, 1, + 214, 42, 145, 30, 1, 199, 103, 145, 30, 1, 202, 73, 145, 30, 1, 207, 133, + 145, 30, 1, 207, 128, 145, 30, 1, 207, 125, 145, 30, 1, 207, 118, 145, + 30, 1, 207, 113, 145, 30, 1, 207, 108, 145, 30, 1, 207, 119, 145, 30, 1, + 207, 131, 145, 30, 1, 216, 153, 145, 30, 1, 210, 36, 145, 30, 1, 202, 81, + 145, 30, 1, 210, 25, 145, 30, 1, 203, 64, 145, 30, 1, 202, 78, 145, 30, + 1, 223, 247, 145, 30, 1, 242, 144, 145, 30, 1, 202, 88, 145, 30, 1, 242, + 211, 145, 30, 1, 221, 225, 145, 30, 1, 199, 198, 145, 30, 1, 210, 75, + 145, 30, 1, 229, 162, 145, 30, 1, 64, 145, 30, 1, 251, 108, 145, 30, 1, + 168, 145, 30, 1, 193, 118, 145, 30, 1, 234, 50, 145, 30, 1, 71, 145, 30, + 1, 193, 56, 145, 30, 1, 193, 69, 145, 30, 1, 74, 145, 30, 1, 194, 169, + 145, 30, 1, 194, 160, 145, 30, 1, 212, 0, 145, 30, 1, 193, 1, 145, 30, 1, + 68, 145, 30, 1, 194, 93, 145, 30, 1, 194, 111, 145, 30, 1, 194, 72, 145, + 30, 1, 192, 214, 145, 30, 1, 233, 230, 145, 30, 1, 193, 22, 145, 30, 1, + 70, 183, 246, 140, 57, 183, 209, 143, 57, 183, 213, 111, 57, 183, 217, + 214, 183, 247, 136, 161, 183, 193, 60, 57, 183, 194, 19, 57, 145, 232, + 131, 152, 196, 105, 145, 114, 54, 145, 197, 30, 54, 145, 94, 54, 145, + 235, 92, 54, 145, 60, 202, 106, 145, 62, 242, 130, 223, 134, 250, 193, + 250, 219, 223, 134, 250, 193, 204, 165, 223, 134, 250, 193, 200, 15, 212, + 19, 207, 193, 246, 99, 207, 193, 246, 99, 32, 76, 5, 249, 210, 64, 32, + 76, 5, 249, 179, 71, 32, 76, 5, 249, 188, 70, 32, 76, 5, 249, 156, 74, + 32, 76, 5, 249, 206, 68, 32, 76, 5, 249, 225, 238, 0, 32, 76, 5, 249, + 172, 237, 116, 32, 76, 5, 249, 212, 237, 16, 32, 76, 5, 249, 202, 236, + 146, 32, 76, 5, 249, 166, 235, 62, 32, 76, 5, 249, 160, 223, 62, 32, 76, + 5, 249, 171, 223, 41, 32, 76, 5, 249, 181, 222, 233, 32, 76, 5, 249, 152, + 222, 214, 32, 76, 5, 249, 140, 160, 32, 76, 5, 249, 173, 222, 57, 32, 76, + 5, 249, 150, 221, 204, 32, 76, 5, 249, 147, 221, 113, 32, 76, 5, 249, + 136, 221, 33, 32, 76, 5, 249, 137, 172, 32, 76, 5, 249, 203, 217, 48, 32, + 76, 5, 249, 144, 216, 175, 32, 76, 5, 249, 201, 216, 91, 32, 76, 5, 249, + 193, 215, 241, 32, 76, 5, 249, 214, 181, 32, 76, 5, 249, 192, 214, 214, + 32, 76, 5, 249, 186, 214, 60, 32, 76, 5, 249, 165, 213, 142, 32, 76, 5, + 249, 162, 213, 22, 32, 76, 5, 249, 221, 166, 32, 76, 5, 249, 145, 210, + 181, 32, 76, 5, 249, 178, 210, 51, 32, 76, 5, 249, 205, 209, 198, 32, 76, + 5, 249, 167, 209, 51, 32, 76, 5, 249, 200, 208, 239, 32, 76, 5, 249, 139, + 208, 219, 32, 76, 5, 249, 195, 208, 201, 32, 76, 5, 249, 184, 208, 189, + 32, 76, 5, 249, 157, 167, 32, 76, 5, 249, 189, 208, 7, 32, 76, 5, 249, + 164, 207, 151, 32, 76, 5, 249, 223, 207, 55, 32, 76, 5, 249, 190, 206, + 218, 32, 76, 5, 249, 185, 188, 32, 76, 5, 249, 208, 205, 223, 32, 76, 5, + 249, 176, 203, 125, 32, 76, 5, 249, 204, 202, 212, 32, 76, 5, 249, 159, + 201, 184, 32, 76, 5, 249, 158, 189, 32, 76, 5, 249, 219, 200, 79, 32, 76, + 5, 249, 180, 199, 128, 32, 76, 5, 249, 217, 155, 32, 76, 5, 249, 148, + 198, 45, 32, 76, 5, 249, 163, 194, 169, 32, 76, 5, 249, 142, 194, 111, + 32, 76, 5, 249, 177, 194, 72, 32, 76, 5, 249, 175, 194, 36, 32, 76, 5, + 249, 199, 192, 112, 32, 76, 5, 249, 143, 192, 85, 32, 76, 5, 249, 196, + 192, 8, 32, 76, 5, 249, 191, 254, 42, 32, 76, 5, 249, 174, 253, 186, 32, + 76, 5, 249, 133, 250, 8, 32, 76, 5, 249, 146, 235, 27, 32, 76, 5, 249, + 129, 235, 26, 32, 76, 5, 249, 169, 212, 210, 32, 76, 5, 249, 187, 209, + 49, 32, 76, 5, 249, 155, 209, 53, 32, 76, 5, 249, 141, 208, 70, 32, 76, + 5, 249, 183, 208, 69, 32, 76, 5, 249, 149, 207, 48, 32, 76, 5, 249, 151, + 200, 175, 32, 76, 5, 249, 131, 197, 248, 32, 76, 5, 249, 128, 104, 32, + 76, 16, 249, 198, 32, 76, 16, 249, 197, 32, 76, 16, 249, 194, 32, 76, 16, + 249, 182, 32, 76, 16, 249, 170, 32, 76, 16, 249, 168, 32, 76, 16, 249, + 161, 32, 76, 16, 249, 154, 32, 76, 16, 249, 153, 32, 76, 16, 249, 138, + 32, 76, 16, 249, 135, 32, 76, 16, 249, 134, 32, 76, 16, 249, 132, 32, 76, + 16, 249, 130, 32, 76, 153, 249, 127, 217, 160, 32, 76, 153, 249, 126, + 194, 23, 32, 76, 153, 249, 125, 237, 98, 32, 76, 153, 249, 124, 234, 27, + 32, 76, 153, 249, 123, 217, 127, 32, 76, 153, 249, 122, 202, 27, 32, 76, + 153, 249, 121, 233, 211, 32, 76, 153, 249, 120, 208, 34, 32, 76, 153, + 249, 119, 204, 11, 32, 76, 153, 249, 118, 229, 247, 32, 76, 153, 249, + 117, 202, 168, 32, 76, 153, 249, 116, 247, 218, 32, 76, 153, 249, 115, + 238, 205, 32, 76, 153, 249, 114, 247, 108, 32, 76, 153, 249, 113, 194, + 81, 32, 76, 153, 249, 112, 248, 190, 32, 76, 153, 249, 111, 211, 221, 32, + 76, 153, 249, 110, 202, 138, 32, 76, 153, 249, 109, 238, 103, 32, 76, + 216, 45, 249, 108, 222, 108, 32, 76, 216, 45, 249, 107, 222, 119, 32, 76, + 153, 249, 106, 211, 236, 32, 76, 153, 249, 105, 194, 48, 32, 76, 153, + 249, 104, 32, 76, 216, 45, 249, 103, 250, 105, 32, 76, 216, 45, 249, 102, + 216, 253, 32, 76, 153, 249, 101, 247, 135, 32, 76, 153, 249, 100, 230, + 245, 32, 76, 153, 249, 99, 32, 76, 153, 249, 98, 194, 14, 32, 76, 153, + 249, 97, 32, 76, 153, 249, 96, 32, 76, 153, 249, 95, 228, 208, 32, 76, + 153, 249, 94, 32, 76, 153, 249, 93, 32, 76, 153, 249, 92, 32, 76, 216, + 45, 249, 90, 198, 7, 32, 76, 153, 249, 89, 32, 76, 153, 249, 88, 32, 76, + 153, 249, 87, 242, 78, 32, 76, 153, 249, 86, 32, 76, 153, 249, 85, 32, + 76, 153, 249, 84, 231, 189, 32, 76, 153, 249, 83, 250, 90, 32, 76, 153, + 249, 82, 32, 76, 153, 249, 81, 32, 76, 153, 249, 80, 32, 76, 153, 249, + 79, 32, 76, 153, 249, 78, 32, 76, 153, 249, 77, 32, 76, 153, 249, 76, 32, + 76, 153, 249, 75, 32, 76, 153, 249, 74, 32, 76, 153, 249, 73, 216, 37, + 32, 76, 153, 249, 72, 32, 76, 153, 249, 71, 198, 195, 32, 76, 153, 249, + 70, 32, 76, 153, 249, 69, 32, 76, 153, 249, 68, 32, 76, 153, 249, 67, 32, + 76, 153, 249, 66, 32, 76, 153, 249, 65, 32, 76, 153, 249, 64, 32, 76, + 153, 249, 63, 32, 76, 153, 249, 62, 32, 76, 153, 249, 61, 32, 76, 153, + 249, 60, 32, 76, 153, 249, 59, 229, 210, 32, 76, 153, 249, 38, 232, 145, + 32, 76, 153, 249, 35, 248, 165, 32, 76, 153, 249, 30, 202, 146, 32, 76, + 153, 249, 29, 54, 32, 76, 153, 249, 28, 32, 76, 153, 249, 27, 201, 60, + 32, 76, 153, 249, 26, 32, 76, 153, 249, 25, 32, 76, 153, 249, 24, 194, + 76, 242, 254, 32, 76, 153, 249, 23, 242, 254, 32, 76, 153, 249, 22, 242, + 255, 232, 104, 32, 76, 153, 249, 21, 194, 79, 32, 76, 153, 249, 20, 32, + 76, 153, 249, 19, 32, 76, 216, 45, 249, 18, 236, 207, 32, 76, 153, 249, + 17, 32, 76, 153, 249, 16, 32, 76, 153, 249, 14, 32, 76, 153, 249, 13, 32, + 76, 153, 249, 12, 32, 76, 153, 249, 11, 237, 188, 32, 76, 153, 249, 10, + 32, 76, 153, 249, 9, 32, 76, 153, 249, 8, 32, 76, 153, 249, 7, 32, 76, + 153, 249, 6, 32, 76, 153, 196, 52, 249, 91, 32, 76, 153, 196, 52, 249, + 58, 32, 76, 153, 196, 52, 249, 57, 32, 76, 153, 196, 52, 249, 56, 32, 76, + 153, 196, 52, 249, 55, 32, 76, 153, 196, 52, 249, 54, 32, 76, 153, 196, + 52, 249, 53, 32, 76, 153, 196, 52, 249, 52, 32, 76, 153, 196, 52, 249, + 51, 32, 76, 153, 196, 52, 249, 50, 32, 76, 153, 196, 52, 249, 49, 32, 76, + 153, 196, 52, 249, 48, 32, 76, 153, 196, 52, 249, 47, 32, 76, 153, 196, + 52, 249, 46, 32, 76, 153, 196, 52, 249, 45, 32, 76, 153, 196, 52, 249, + 44, 32, 76, 153, 196, 52, 249, 43, 32, 76, 153, 196, 52, 249, 42, 32, 76, + 153, 196, 52, 249, 41, 32, 76, 153, 196, 52, 249, 40, 32, 76, 153, 196, + 52, 249, 39, 32, 76, 153, 196, 52, 249, 37, 32, 76, 153, 196, 52, 249, + 36, 32, 76, 153, 196, 52, 249, 34, 32, 76, 153, 196, 52, 249, 33, 32, 76, + 153, 196, 52, 249, 32, 32, 76, 153, 196, 52, 249, 31, 32, 76, 153, 196, + 52, 249, 15, 32, 76, 153, 196, 52, 249, 5, 251, 101, 194, 11, 204, 166, + 219, 175, 251, 101, 194, 11, 204, 166, 236, 114, 251, 101, 242, 244, 77, + 251, 101, 31, 101, 251, 101, 31, 104, 251, 101, 31, 133, 251, 101, 31, + 134, 251, 101, 31, 151, 251, 101, 31, 170, 251, 101, 31, 179, 251, 101, + 31, 174, 251, 101, 31, 182, 251, 101, 31, 200, 30, 251, 101, 31, 197, + 239, 251, 101, 31, 199, 184, 251, 101, 31, 232, 126, 251, 101, 31, 233, + 3, 251, 101, 31, 203, 25, 251, 101, 31, 204, 140, 251, 101, 31, 234, 137, + 251, 101, 31, 214, 11, 251, 101, 31, 90, 228, 162, 251, 101, 31, 103, + 228, 162, 251, 101, 31, 112, 228, 162, 251, 101, 31, 232, 119, 228, 162, + 251, 101, 31, 232, 214, 228, 162, 251, 101, 31, 203, 41, 228, 162, 251, + 101, 31, 204, 146, 228, 162, 251, 101, 31, 234, 148, 228, 162, 251, 101, + 31, 214, 16, 228, 162, 251, 101, 31, 90, 180, 251, 101, 31, 103, 180, + 251, 101, 31, 112, 180, 251, 101, 31, 232, 119, 180, 251, 101, 31, 232, + 214, 180, 251, 101, 31, 203, 41, 180, 251, 101, 31, 204, 146, 180, 251, + 101, 31, 234, 148, 180, 251, 101, 31, 214, 16, 180, 251, 101, 31, 200, + 31, 180, 251, 101, 31, 197, 240, 180, 251, 101, 31, 199, 185, 180, 251, + 101, 31, 232, 127, 180, 251, 101, 31, 233, 4, 180, 251, 101, 31, 203, 26, + 180, 251, 101, 31, 204, 141, 180, 251, 101, 31, 234, 138, 180, 251, 101, + 31, 214, 12, 180, 251, 101, 194, 96, 248, 181, 197, 54, 251, 101, 194, + 96, 232, 226, 201, 149, 251, 101, 194, 96, 205, 212, 201, 149, 251, 101, + 194, 96, 199, 192, 201, 149, 251, 101, 194, 96, 232, 112, 201, 149, 251, + 101, 235, 65, 217, 44, 232, 226, 201, 149, 251, 101, 219, 156, 217, 44, + 232, 226, 201, 149, 251, 101, 217, 44, 205, 212, 201, 149, 251, 101, 217, + 44, 199, 192, 201, 149, 33, 251, 133, 250, 10, 90, 208, 167, 33, 251, + 133, 250, 10, 90, 230, 78, 33, 251, 133, 250, 10, 90, 235, 88, 33, 251, + 133, 250, 10, 151, 33, 251, 133, 250, 10, 233, 3, 33, 251, 133, 250, 10, + 232, 214, 228, 162, 33, 251, 133, 250, 10, 232, 214, 180, 33, 251, 133, + 250, 10, 233, 4, 180, 33, 251, 133, 250, 10, 232, 214, 200, 135, 33, 251, + 133, 250, 10, 200, 31, 200, 135, 33, 251, 133, 250, 10, 233, 4, 200, 135, + 33, 251, 133, 250, 10, 90, 228, 163, 200, 135, 33, 251, 133, 250, 10, + 232, 214, 228, 163, 200, 135, 33, 251, 133, 250, 10, 90, 199, 165, 200, + 135, 33, 251, 133, 250, 10, 232, 214, 199, 165, 200, 135, 33, 251, 133, + 250, 10, 232, 214, 202, 11, 33, 251, 133, 250, 10, 200, 31, 202, 11, 33, + 251, 133, 250, 10, 233, 4, 202, 11, 33, 251, 133, 250, 10, 90, 228, 163, + 202, 11, 33, 251, 133, 250, 10, 232, 214, 228, 163, 202, 11, 33, 251, + 133, 250, 10, 90, 199, 165, 202, 11, 33, 251, 133, 250, 10, 200, 31, 199, + 165, 202, 11, 33, 251, 133, 250, 10, 233, 4, 199, 165, 202, 11, 33, 251, + 133, 250, 10, 200, 31, 216, 94, 33, 251, 133, 229, 204, 90, 209, 217, 33, + 251, 133, 199, 208, 101, 33, 251, 133, 229, 200, 101, 33, 251, 133, 234, + 36, 104, 33, 251, 133, 199, 208, 104, 33, 251, 133, 238, 100, 103, 235, + 87, 33, 251, 133, 234, 36, 103, 235, 87, 33, 251, 133, 198, 161, 151, 33, + 251, 133, 198, 161, 200, 30, 33, 251, 133, 198, 161, 200, 31, 250, 249, + 20, 33, 251, 133, 229, 200, 200, 30, 33, 251, 133, 216, 242, 200, 30, 33, + 251, 133, 199, 208, 200, 30, 33, 251, 133, 199, 208, 199, 184, 33, 251, + 133, 198, 161, 233, 3, 33, 251, 133, 198, 161, 233, 4, 250, 249, 20, 33, + 251, 133, 229, 200, 233, 3, 33, 251, 133, 199, 208, 233, 3, 33, 251, 133, + 199, 208, 90, 228, 162, 33, 251, 133, 199, 208, 112, 228, 162, 33, 251, + 133, 234, 36, 232, 214, 228, 162, 33, 251, 133, 198, 161, 232, 214, 228, + 162, 33, 251, 133, 199, 208, 232, 214, 228, 162, 33, 251, 133, 246, 197, + 232, 214, 228, 162, 33, 251, 133, 215, 36, 232, 214, 228, 162, 33, 251, + 133, 199, 208, 90, 180, 33, 251, 133, 199, 208, 232, 214, 180, 33, 251, + 133, 237, 79, 232, 214, 216, 94, 33, 251, 133, 201, 226, 233, 4, 216, 94, + 33, 90, 138, 57, 33, 90, 138, 3, 250, 249, 20, 33, 103, 199, 189, 57, 33, + 112, 208, 166, 57, 33, 193, 67, 57, 33, 200, 136, 57, 33, 235, 89, 57, + 33, 212, 16, 57, 33, 103, 212, 15, 57, 33, 112, 212, 15, 57, 33, 232, + 119, 212, 15, 57, 33, 232, 214, 212, 15, 57, 33, 216, 236, 57, 33, 220, + 210, 248, 181, 57, 33, 219, 149, 57, 33, 211, 127, 57, 33, 193, 200, 57, + 33, 250, 68, 57, 33, 250, 85, 57, 33, 230, 220, 57, 33, 198, 121, 248, + 181, 57, 33, 192, 77, 57, 33, 90, 208, 168, 57, 33, 203, 66, 57, 33, 223, + 171, 57, 213, 131, 57, 207, 30, 204, 136, 57, 207, 30, 197, 70, 57, 207, + 30, 204, 172, 57, 207, 30, 204, 74, 57, 207, 30, 236, 222, 204, 74, 57, + 207, 30, 203, 90, 57, 207, 30, 237, 75, 57, 207, 30, 208, 151, 57, 207, + 30, 204, 153, 57, 207, 30, 235, 41, 57, 207, 30, 250, 62, 57, 207, 30, + 246, 133, 57, 250, 55, 109, 33, 16, 200, 101, 207, 153, 210, 89, 236, + 199, 3, 210, 170, 210, 89, 236, 199, 3, 209, 209, 229, 245, 210, 89, 236, + 199, 3, 200, 104, 229, 245, 210, 89, 236, 199, 3, 246, 220, 210, 89, 236, + 199, 3, 242, 206, 210, 89, 236, 199, 3, 194, 23, 210, 89, 236, 199, 3, + 229, 210, 210, 89, 236, 199, 3, 231, 181, 210, 89, 236, 199, 3, 199, 119, + 210, 89, 236, 199, 3, 54, 210, 89, 236, 199, 3, 247, 180, 210, 89, 236, + 199, 3, 203, 233, 210, 89, 236, 199, 3, 242, 71, 210, 89, 236, 199, 3, + 217, 159, 210, 89, 236, 199, 3, 217, 97, 210, 89, 236, 199, 3, 206, 6, + 210, 89, 236, 199, 3, 219, 204, 210, 89, 236, 199, 3, 247, 201, 210, 89, + 236, 199, 3, 246, 204, 209, 225, 210, 89, 236, 199, 3, 236, 128, 210, 89, + 236, 199, 3, 242, 44, 210, 89, 236, 199, 3, 202, 247, 210, 89, 236, 199, + 3, 242, 45, 210, 89, 236, 199, 3, 248, 105, 210, 89, 236, 199, 3, 203, + 220, 210, 89, 236, 199, 3, 228, 208, 210, 89, 236, 199, 3, 229, 168, 210, + 89, 236, 199, 3, 247, 103, 220, 16, 210, 89, 236, 199, 3, 246, 193, 210, + 89, 236, 199, 3, 208, 34, 210, 89, 236, 199, 3, 234, 196, 210, 89, 236, + 199, 3, 235, 97, 210, 89, 236, 199, 3, 198, 23, 210, 89, 236, 199, 3, + 248, 108, 210, 89, 236, 199, 3, 209, 226, 198, 195, 210, 89, 236, 199, 3, + 196, 18, 210, 89, 236, 199, 3, 210, 248, 210, 89, 236, 199, 3, 207, 19, + 210, 89, 236, 199, 3, 219, 188, 210, 89, 236, 199, 3, 211, 104, 248, 252, + 210, 89, 236, 199, 3, 232, 171, 210, 89, 236, 199, 3, 230, 212, 210, 89, + 236, 199, 3, 201, 227, 210, 89, 236, 199, 3, 2, 249, 237, 210, 89, 236, + 199, 3, 194, 121, 248, 203, 210, 89, 236, 199, 3, 38, 212, 18, 111, 218, + 249, 1, 64, 218, 249, 1, 71, 218, 249, 1, 249, 226, 218, 249, 1, 248, 55, + 218, 249, 1, 232, 44, 218, 249, 1, 238, 95, 218, 249, 1, 70, 218, 249, 1, + 194, 202, 218, 249, 1, 192, 155, 218, 249, 1, 199, 242, 218, 249, 1, 223, + 65, 218, 249, 1, 222, 184, 218, 249, 1, 208, 247, 218, 249, 1, 165, 218, + 249, 1, 218, 236, 218, 249, 1, 215, 151, 218, 249, 1, 216, 96, 218, 249, + 1, 213, 179, 218, 249, 1, 68, 218, 249, 1, 211, 93, 218, 249, 1, 221, + 140, 218, 249, 1, 150, 218, 249, 1, 206, 158, 218, 249, 1, 200, 228, 218, + 249, 1, 198, 86, 218, 249, 1, 250, 224, 218, 249, 1, 234, 88, 218, 249, + 1, 230, 124, 218, 249, 1, 193, 223, 246, 210, 1, 64, 246, 210, 1, 211, + 79, 246, 210, 1, 238, 95, 246, 210, 1, 165, 246, 210, 1, 196, 249, 246, + 210, 1, 150, 246, 210, 1, 220, 46, 246, 210, 1, 254, 42, 246, 210, 1, + 208, 247, 246, 210, 1, 249, 226, 246, 210, 1, 218, 236, 246, 210, 1, 74, + 246, 210, 1, 238, 2, 246, 210, 1, 200, 228, 246, 210, 1, 204, 66, 246, + 210, 1, 204, 65, 246, 210, 1, 206, 158, 246, 210, 1, 247, 51, 246, 210, + 1, 68, 246, 210, 1, 213, 179, 246, 210, 1, 193, 223, 246, 210, 1, 215, + 151, 246, 210, 1, 198, 85, 246, 210, 1, 211, 93, 246, 210, 1, 202, 95, + 246, 210, 1, 70, 246, 210, 1, 71, 246, 210, 1, 196, 246, 246, 210, 1, + 222, 184, 246, 210, 1, 222, 175, 246, 210, 1, 215, 1, 246, 210, 1, 196, + 251, 246, 210, 1, 232, 44, 246, 210, 1, 231, 235, 246, 210, 1, 202, 35, + 246, 210, 1, 202, 34, 246, 210, 1, 214, 167, 246, 210, 1, 223, 224, 246, + 210, 1, 247, 50, 246, 210, 1, 198, 86, 246, 210, 1, 196, 248, 246, 210, + 1, 207, 4, 246, 210, 1, 217, 87, 246, 210, 1, 217, 86, 246, 210, 1, 217, + 85, 246, 210, 1, 217, 84, 246, 210, 1, 220, 45, 246, 210, 1, 234, 200, + 246, 210, 1, 196, 247, 92, 234, 39, 199, 164, 77, 92, 234, 39, 17, 101, + 92, 234, 39, 17, 104, 92, 234, 39, 17, 133, 92, 234, 39, 17, 134, 92, + 234, 39, 17, 151, 92, 234, 39, 17, 170, 92, 234, 39, 17, 179, 92, 234, + 39, 17, 174, 92, 234, 39, 17, 182, 92, 234, 39, 31, 200, 30, 92, 234, 39, + 31, 197, 239, 92, 234, 39, 31, 199, 184, 92, 234, 39, 31, 232, 126, 92, + 234, 39, 31, 233, 3, 92, 234, 39, 31, 203, 25, 92, 234, 39, 31, 204, 140, + 92, 234, 39, 31, 234, 137, 92, 234, 39, 31, 214, 11, 92, 234, 39, 31, 90, + 228, 162, 92, 234, 39, 31, 103, 228, 162, 92, 234, 39, 31, 112, 228, 162, + 92, 234, 39, 31, 232, 119, 228, 162, 92, 234, 39, 31, 232, 214, 228, 162, + 92, 234, 39, 31, 203, 41, 228, 162, 92, 234, 39, 31, 204, 146, 228, 162, + 92, 234, 39, 31, 234, 148, 228, 162, 92, 234, 39, 31, 214, 16, 228, 162, + 40, 43, 1, 64, 40, 43, 1, 248, 123, 40, 43, 1, 222, 57, 40, 43, 1, 237, + 116, 40, 43, 1, 71, 40, 43, 1, 196, 123, 40, 43, 1, 192, 85, 40, 43, 1, + 229, 255, 40, 43, 1, 199, 224, 40, 43, 1, 70, 40, 43, 1, 160, 40, 43, 1, + 234, 124, 40, 43, 1, 234, 99, 40, 43, 1, 234, 88, 40, 43, 1, 233, 255, + 40, 43, 1, 74, 40, 43, 1, 210, 181, 40, 43, 1, 204, 12, 40, 43, 1, 221, + 33, 40, 43, 1, 234, 21, 40, 43, 1, 234, 9, 40, 43, 1, 200, 79, 40, 43, 1, + 68, 40, 43, 1, 234, 127, 40, 43, 1, 210, 80, 40, 43, 1, 221, 234, 40, 43, + 1, 234, 164, 40, 43, 1, 234, 11, 40, 43, 1, 242, 245, 40, 43, 1, 223, + 224, 40, 43, 1, 196, 251, 40, 43, 1, 233, 248, 40, 43, 212, 234, 101, 40, + 43, 212, 234, 151, 40, 43, 212, 234, 200, 30, 40, 43, 212, 234, 233, 3, + 40, 43, 1, 193, 69, 40, 43, 1, 213, 115, 198, 112, 40, 43, 1, 202, 169, + 198, 112, 230, 230, 1, 251, 66, 230, 230, 1, 248, 223, 230, 230, 1, 231, + 43, 230, 230, 1, 237, 237, 230, 230, 1, 251, 61, 230, 230, 1, 208, 230, + 230, 230, 1, 223, 77, 230, 230, 1, 230, 91, 230, 230, 1, 199, 178, 230, + 230, 1, 234, 135, 230, 230, 1, 220, 248, 230, 230, 1, 220, 159, 230, 230, + 1, 217, 150, 230, 230, 1, 215, 38, 230, 230, 1, 223, 33, 230, 230, 1, + 197, 13, 230, 230, 1, 211, 52, 230, 230, 1, 214, 11, 230, 230, 1, 208, + 47, 230, 230, 1, 206, 10, 230, 230, 1, 200, 46, 230, 230, 1, 194, 46, + 230, 230, 1, 233, 77, 230, 230, 1, 223, 228, 230, 230, 1, 228, 145, 230, + 230, 1, 211, 139, 230, 230, 1, 214, 16, 228, 162, 40, 210, 124, 1, 250, + 224, 40, 210, 124, 1, 247, 89, 40, 210, 124, 1, 231, 217, 40, 210, 124, + 1, 236, 132, 40, 210, 124, 1, 71, 40, 210, 124, 1, 192, 53, 40, 210, 124, + 1, 235, 9, 40, 210, 124, 1, 192, 93, 40, 210, 124, 1, 235, 7, 40, 210, + 124, 1, 70, 40, 210, 124, 1, 221, 97, 40, 210, 124, 1, 220, 12, 40, 210, + 124, 1, 217, 3, 40, 210, 124, 1, 214, 194, 40, 210, 124, 1, 195, 235, 40, + 210, 124, 1, 210, 167, 40, 210, 124, 1, 207, 220, 40, 210, 124, 1, 203, + 97, 40, 210, 124, 1, 200, 149, 40, 210, 124, 1, 68, 40, 210, 124, 1, 242, + 226, 40, 210, 124, 1, 203, 202, 40, 210, 124, 1, 204, 14, 40, 210, 124, + 1, 192, 216, 40, 210, 124, 1, 193, 47, 40, 210, 124, 1, 74, 40, 210, 124, + 1, 211, 194, 40, 210, 124, 1, 234, 164, 40, 210, 124, 1, 144, 40, 210, + 124, 1, 198, 96, 40, 210, 124, 1, 196, 110, 40, 210, 124, 1, 193, 51, 40, + 210, 124, 1, 193, 49, 40, 210, 124, 1, 193, 84, 40, 210, 124, 1, 223, + 251, 40, 210, 124, 1, 192, 214, 40, 210, 124, 1, 168, 40, 210, 124, 1, + 228, 58, 38, 40, 210, 124, 1, 250, 224, 38, 40, 210, 124, 1, 236, 132, + 38, 40, 210, 124, 1, 192, 93, 38, 40, 210, 124, 1, 214, 194, 38, 40, 210, + 124, 1, 203, 97, 197, 98, 1, 251, 0, 197, 98, 1, 248, 63, 197, 98, 1, + 231, 205, 197, 98, 1, 221, 250, 197, 98, 1, 237, 76, 197, 98, 1, 229, 43, + 197, 98, 1, 194, 36, 197, 98, 1, 192, 75, 197, 98, 1, 228, 200, 197, 98, + 1, 200, 8, 197, 98, 1, 192, 239, 197, 98, 1, 222, 139, 197, 98, 1, 203, + 224, 197, 98, 1, 220, 90, 197, 98, 1, 217, 12, 197, 98, 1, 237, 36, 197, + 98, 1, 212, 230, 197, 98, 1, 191, 252, 197, 98, 1, 206, 45, 197, 98, 1, + 251, 57, 197, 98, 1, 209, 51, 197, 98, 1, 206, 85, 197, 98, 1, 208, 182, + 197, 98, 1, 208, 25, 197, 98, 1, 199, 228, 197, 98, 1, 231, 79, 197, 98, + 1, 155, 197, 98, 1, 70, 197, 98, 1, 68, 197, 98, 1, 202, 46, 197, 98, + 194, 11, 236, 177, 40, 210, 118, 3, 64, 40, 210, 118, 3, 70, 40, 210, + 118, 3, 68, 40, 210, 118, 3, 160, 40, 210, 118, 3, 221, 33, 40, 210, 118, + 3, 231, 233, 40, 210, 118, 3, 230, 186, 40, 210, 118, 3, 193, 209, 40, + 210, 118, 3, 247, 19, 40, 210, 118, 3, 223, 62, 40, 210, 118, 3, 223, 20, + 40, 210, 118, 3, 189, 40, 210, 118, 3, 198, 45, 40, 210, 118, 3, 238, 0, + 40, 210, 118, 3, 237, 16, 40, 210, 118, 3, 235, 62, 40, 210, 118, 3, 199, + 240, 40, 210, 118, 3, 166, 40, 210, 118, 3, 249, 3, 40, 210, 118, 3, 233, + 97, 40, 210, 118, 3, 181, 40, 210, 118, 3, 213, 22, 40, 210, 118, 3, 172, + 40, 210, 118, 3, 216, 175, 40, 210, 118, 3, 215, 241, 40, 210, 118, 3, + 168, 40, 210, 118, 3, 196, 157, 40, 210, 118, 3, 196, 39, 40, 210, 118, + 3, 167, 40, 210, 118, 3, 206, 218, 40, 210, 118, 3, 177, 40, 210, 118, 3, + 188, 40, 210, 118, 3, 192, 112, 40, 210, 118, 3, 204, 64, 40, 210, 118, + 3, 202, 92, 40, 210, 118, 3, 144, 40, 210, 118, 3, 250, 2, 40, 210, 118, + 3, 250, 1, 40, 210, 118, 3, 250, 0, 40, 210, 118, 3, 193, 178, 40, 210, + 118, 3, 237, 233, 40, 210, 118, 3, 237, 232, 40, 210, 118, 3, 248, 234, + 40, 210, 118, 3, 247, 71, 40, 210, 118, 194, 11, 236, 177, 40, 210, 118, + 31, 101, 40, 210, 118, 31, 104, 40, 210, 118, 31, 200, 30, 40, 210, 118, + 31, 197, 239, 40, 210, 118, 31, 228, 162, 237, 56, 6, 1, 184, 70, 237, + 56, 6, 1, 184, 71, 237, 56, 6, 1, 184, 64, 237, 56, 6, 1, 184, 251, 72, + 237, 56, 6, 1, 184, 74, 237, 56, 6, 1, 184, 211, 194, 237, 56, 6, 1, 203, + 195, 70, 237, 56, 6, 1, 203, 195, 71, 237, 56, 6, 1, 203, 195, 64, 237, + 56, 6, 1, 203, 195, 251, 72, 237, 56, 6, 1, 203, 195, 74, 237, 56, 6, 1, + 203, 195, 211, 194, 237, 56, 6, 1, 249, 236, 237, 56, 6, 1, 211, 106, + 237, 56, 6, 1, 193, 244, 237, 56, 6, 1, 193, 66, 237, 56, 6, 1, 230, 124, + 237, 56, 6, 1, 210, 168, 237, 56, 6, 1, 248, 108, 237, 56, 6, 1, 200, 56, + 237, 56, 6, 1, 237, 101, 237, 56, 6, 1, 242, 241, 237, 56, 6, 1, 223, 39, + 237, 56, 6, 1, 222, 64, 237, 56, 6, 1, 231, 179, 237, 56, 6, 1, 234, 164, + 237, 56, 6, 1, 196, 118, 237, 56, 6, 1, 233, 235, 237, 56, 6, 1, 199, + 222, 237, 56, 6, 1, 234, 9, 237, 56, 6, 1, 192, 82, 237, 56, 6, 1, 233, + 255, 237, 56, 6, 1, 192, 61, 237, 56, 6, 1, 234, 21, 237, 56, 6, 1, 234, + 124, 237, 56, 6, 1, 234, 99, 237, 56, 6, 1, 234, 88, 237, 56, 6, 1, 234, + 73, 237, 56, 6, 1, 211, 238, 237, 56, 6, 1, 233, 212, 237, 56, 2, 1, 184, + 70, 237, 56, 2, 1, 184, 71, 237, 56, 2, 1, 184, 64, 237, 56, 2, 1, 184, + 251, 72, 237, 56, 2, 1, 184, 74, 237, 56, 2, 1, 184, 211, 194, 237, 56, + 2, 1, 203, 195, 70, 237, 56, 2, 1, 203, 195, 71, 237, 56, 2, 1, 203, 195, + 64, 237, 56, 2, 1, 203, 195, 251, 72, 237, 56, 2, 1, 203, 195, 74, 237, + 56, 2, 1, 203, 195, 211, 194, 237, 56, 2, 1, 249, 236, 237, 56, 2, 1, + 211, 106, 237, 56, 2, 1, 193, 244, 237, 56, 2, 1, 193, 66, 237, 56, 2, 1, + 230, 124, 237, 56, 2, 1, 210, 168, 237, 56, 2, 1, 248, 108, 237, 56, 2, + 1, 200, 56, 237, 56, 2, 1, 237, 101, 237, 56, 2, 1, 242, 241, 237, 56, 2, + 1, 223, 39, 237, 56, 2, 1, 222, 64, 237, 56, 2, 1, 231, 179, 237, 56, 2, + 1, 234, 164, 237, 56, 2, 1, 196, 118, 237, 56, 2, 1, 233, 235, 237, 56, + 2, 1, 199, 222, 237, 56, 2, 1, 234, 9, 237, 56, 2, 1, 192, 82, 237, 56, + 2, 1, 233, 255, 237, 56, 2, 1, 192, 61, 237, 56, 2, 1, 234, 21, 237, 56, + 2, 1, 234, 124, 237, 56, 2, 1, 234, 99, 237, 56, 2, 1, 234, 88, 237, 56, + 2, 1, 234, 73, 237, 56, 2, 1, 211, 238, 237, 56, 2, 1, 233, 212, 204, 19, + 1, 210, 165, 204, 19, 1, 198, 235, 204, 19, 1, 221, 192, 204, 19, 1, 233, + 40, 204, 19, 1, 199, 197, 204, 19, 1, 202, 212, 204, 19, 1, 201, 97, 204, + 19, 1, 242, 160, 204, 19, 1, 193, 68, 204, 19, 1, 228, 159, 204, 19, 1, + 248, 40, 204, 19, 1, 237, 115, 204, 19, 1, 231, 219, 204, 19, 1, 195, + 230, 204, 19, 1, 199, 203, 204, 19, 1, 192, 5, 204, 19, 1, 217, 43, 204, + 19, 1, 222, 212, 204, 19, 1, 194, 27, 204, 19, 1, 230, 101, 204, 19, 1, + 219, 89, 204, 19, 1, 216, 121, 204, 19, 1, 223, 231, 204, 19, 1, 234, + 162, 204, 19, 1, 250, 53, 204, 19, 1, 251, 113, 204, 19, 1, 211, 211, + 204, 19, 1, 194, 14, 204, 19, 1, 211, 125, 204, 19, 1, 251, 72, 204, 19, + 1, 207, 46, 204, 19, 1, 212, 230, 204, 19, 1, 234, 182, 204, 19, 1, 251, + 77, 204, 19, 1, 228, 49, 204, 19, 1, 197, 41, 204, 19, 1, 212, 24, 204, + 19, 1, 211, 186, 204, 19, 1, 211, 236, 204, 19, 1, 249, 239, 204, 19, 1, + 250, 107, 204, 19, 1, 211, 163, 204, 19, 1, 251, 52, 204, 19, 1, 234, 13, + 204, 19, 1, 250, 82, 204, 19, 1, 234, 193, 204, 19, 1, 228, 57, 204, 19, + 1, 193, 30, 211, 141, 1, 251, 26, 211, 141, 1, 249, 3, 211, 141, 1, 189, + 211, 141, 1, 223, 62, 211, 141, 1, 193, 209, 211, 141, 1, 221, 250, 211, + 141, 1, 237, 100, 211, 141, 1, 167, 211, 141, 1, 188, 211, 141, 1, 203, + 230, 211, 141, 1, 237, 40, 211, 141, 1, 246, 183, 211, 141, 1, 231, 233, + 211, 141, 1, 233, 97, 211, 141, 1, 208, 237, 211, 141, 1, 222, 155, 211, + 141, 1, 220, 180, 211, 141, 1, 216, 135, 211, 141, 1, 212, 214, 211, 141, + 1, 194, 119, 211, 141, 1, 144, 211, 141, 1, 168, 211, 141, 1, 64, 211, + 141, 1, 71, 211, 141, 1, 70, 211, 141, 1, 74, 211, 141, 1, 68, 211, 141, + 1, 252, 33, 211, 141, 1, 234, 171, 211, 141, 1, 211, 194, 211, 141, 17, + 192, 76, 211, 141, 17, 101, 211, 141, 17, 104, 211, 141, 17, 133, 211, + 141, 17, 134, 211, 141, 17, 151, 211, 141, 17, 170, 211, 141, 17, 179, + 211, 141, 17, 174, 211, 141, 17, 182, 211, 143, 6, 1, 64, 211, 143, 6, 1, + 251, 63, 211, 143, 6, 1, 251, 57, 211, 143, 6, 1, 251, 72, 211, 143, 6, + 1, 247, 167, 211, 143, 6, 1, 246, 117, 211, 143, 6, 1, 234, 156, 211, + 143, 6, 1, 71, 211, 143, 6, 1, 234, 136, 211, 143, 6, 1, 144, 211, 143, + 6, 1, 228, 115, 211, 143, 6, 1, 70, 211, 143, 6, 1, 160, 211, 143, 6, 1, + 234, 155, 211, 143, 6, 1, 220, 212, 211, 143, 6, 1, 177, 211, 143, 6, 1, + 172, 211, 143, 6, 1, 181, 211, 143, 6, 1, 74, 211, 143, 6, 1, 211, 235, + 211, 143, 6, 1, 166, 211, 143, 6, 1, 234, 154, 211, 143, 6, 1, 188, 211, + 143, 6, 1, 204, 64, 211, 143, 6, 1, 189, 211, 143, 6, 1, 234, 153, 211, + 143, 6, 1, 198, 118, 211, 143, 6, 1, 234, 152, 211, 143, 6, 1, 198, 108, + 211, 143, 6, 1, 237, 40, 211, 143, 6, 1, 68, 211, 143, 6, 1, 194, 169, + 211, 143, 6, 1, 221, 250, 211, 143, 6, 1, 231, 84, 211, 143, 6, 1, 192, + 112, 211, 143, 6, 1, 192, 71, 211, 143, 2, 1, 64, 211, 143, 2, 1, 251, + 63, 211, 143, 2, 1, 251, 57, 211, 143, 2, 1, 251, 72, 211, 143, 2, 1, + 247, 167, 211, 143, 2, 1, 246, 117, 211, 143, 2, 1, 234, 156, 211, 143, + 2, 1, 71, 211, 143, 2, 1, 234, 136, 211, 143, 2, 1, 144, 211, 143, 2, 1, + 228, 115, 211, 143, 2, 1, 70, 211, 143, 2, 1, 160, 211, 143, 2, 1, 234, + 155, 211, 143, 2, 1, 220, 212, 211, 143, 2, 1, 177, 211, 143, 2, 1, 172, + 211, 143, 2, 1, 181, 211, 143, 2, 1, 74, 211, 143, 2, 1, 211, 235, 211, + 143, 2, 1, 166, 211, 143, 2, 1, 234, 154, 211, 143, 2, 1, 188, 211, 143, + 2, 1, 204, 64, 211, 143, 2, 1, 189, 211, 143, 2, 1, 234, 153, 211, 143, + 2, 1, 198, 118, 211, 143, 2, 1, 234, 152, 211, 143, 2, 1, 198, 108, 211, + 143, 2, 1, 237, 40, 211, 143, 2, 1, 68, 211, 143, 2, 1, 194, 169, 211, + 143, 2, 1, 221, 250, 211, 143, 2, 1, 231, 84, 211, 143, 2, 1, 192, 112, + 211, 143, 2, 1, 192, 71, 234, 120, 1, 64, 234, 120, 1, 248, 123, 234, + 120, 1, 246, 158, 234, 120, 1, 242, 245, 234, 120, 1, 237, 116, 234, 120, + 1, 214, 247, 234, 120, 1, 237, 31, 234, 120, 1, 234, 150, 234, 120, 1, + 71, 234, 120, 1, 233, 47, 234, 120, 1, 231, 158, 234, 120, 1, 231, 15, + 234, 120, 1, 229, 255, 234, 120, 1, 70, 234, 120, 1, 223, 41, 234, 120, + 1, 222, 57, 234, 120, 1, 220, 42, 234, 120, 1, 219, 132, 234, 120, 1, + 217, 48, 234, 120, 1, 214, 214, 234, 120, 1, 181, 234, 120, 1, 213, 249, + 234, 120, 1, 74, 234, 120, 1, 210, 181, 234, 120, 1, 208, 219, 234, 120, + 1, 208, 7, 234, 120, 1, 206, 254, 234, 120, 1, 205, 223, 234, 120, 1, + 204, 12, 234, 120, 1, 200, 79, 234, 120, 1, 199, 224, 234, 120, 1, 68, + 234, 120, 1, 196, 123, 234, 120, 1, 193, 203, 234, 120, 1, 193, 148, 234, + 120, 1, 192, 85, 234, 120, 1, 192, 62, 234, 120, 1, 231, 70, 234, 120, 1, + 231, 76, 234, 120, 1, 221, 234, 246, 190, 251, 27, 1, 250, 251, 246, 190, + 251, 27, 1, 248, 65, 246, 190, 251, 27, 1, 231, 33, 246, 190, 251, 27, 1, + 237, 181, 246, 190, 251, 27, 1, 234, 181, 246, 190, 251, 27, 1, 192, 96, + 246, 190, 251, 27, 1, 233, 172, 246, 190, 251, 27, 1, 192, 56, 246, 190, + 251, 27, 1, 200, 107, 246, 190, 251, 27, 1, 246, 117, 246, 190, 251, 27, + 1, 192, 225, 246, 190, 251, 27, 1, 192, 71, 246, 190, 251, 27, 1, 223, + 104, 246, 190, 251, 27, 1, 204, 64, 246, 190, 251, 27, 1, 220, 83, 246, + 190, 251, 27, 1, 223, 117, 246, 190, 251, 27, 1, 193, 199, 246, 190, 251, + 27, 1, 235, 25, 246, 190, 251, 27, 1, 246, 217, 246, 190, 251, 27, 1, + 223, 21, 246, 190, 251, 27, 1, 222, 99, 246, 190, 251, 27, 1, 218, 245, + 246, 190, 251, 27, 1, 229, 189, 246, 190, 251, 27, 1, 208, 220, 246, 190, + 251, 27, 1, 250, 165, 246, 190, 251, 27, 1, 242, 177, 246, 190, 251, 27, + 1, 242, 215, 246, 190, 251, 27, 1, 238, 107, 246, 190, 251, 27, 1, 217, + 138, 246, 190, 251, 27, 1, 208, 224, 246, 190, 251, 27, 1, 213, 95, 246, + 190, 251, 27, 1, 235, 2, 246, 190, 251, 27, 1, 204, 46, 246, 190, 251, + 27, 1, 223, 42, 246, 190, 251, 27, 1, 211, 211, 246, 190, 251, 27, 1, + 197, 210, 246, 190, 251, 27, 1, 233, 70, 246, 190, 251, 27, 1, 235, 15, + 246, 190, 251, 27, 1, 242, 251, 246, 190, 251, 27, 1, 210, 154, 246, 190, + 251, 27, 1, 231, 60, 246, 190, 251, 27, 1, 208, 22, 246, 190, 251, 27, 1, + 204, 73, 246, 190, 251, 27, 1, 196, 42, 246, 190, 251, 27, 1, 199, 56, + 246, 190, 251, 27, 1, 203, 173, 246, 190, 251, 27, 1, 223, 75, 246, 190, + 251, 27, 1, 238, 108, 246, 190, 251, 27, 1, 246, 183, 246, 190, 251, 27, + 1, 193, 73, 246, 190, 251, 27, 1, 209, 238, 246, 190, 251, 27, 1, 221, + 155, 246, 190, 251, 27, 242, 118, 77, 32, 41, 3, 251, 237, 32, 41, 3, + 251, 236, 32, 41, 3, 251, 235, 32, 41, 3, 251, 234, 32, 41, 3, 251, 233, + 32, 41, 3, 251, 232, 32, 41, 3, 251, 231, 32, 41, 3, 251, 230, 32, 41, 3, + 251, 229, 32, 41, 3, 251, 228, 32, 41, 3, 251, 227, 32, 41, 3, 251, 226, + 32, 41, 3, 251, 225, 32, 41, 3, 251, 224, 32, 41, 3, 251, 223, 32, 41, 3, + 251, 222, 32, 41, 3, 251, 221, 32, 41, 3, 251, 220, 32, 41, 3, 251, 219, + 32, 41, 3, 251, 218, 32, 41, 3, 251, 217, 32, 41, 3, 251, 216, 32, 41, 3, + 251, 215, 32, 41, 3, 251, 214, 32, 41, 3, 251, 213, 32, 41, 3, 251, 212, + 32, 41, 3, 251, 211, 32, 41, 3, 254, 247, 32, 41, 3, 251, 210, 32, 41, 3, + 251, 209, 32, 41, 3, 251, 208, 32, 41, 3, 251, 207, 32, 41, 3, 251, 206, + 32, 41, 3, 251, 205, 32, 41, 3, 251, 204, 32, 41, 3, 251, 203, 32, 41, 3, + 251, 202, 32, 41, 3, 251, 201, 32, 41, 3, 251, 200, 32, 41, 3, 251, 199, + 32, 41, 3, 251, 198, 32, 41, 3, 251, 197, 32, 41, 3, 251, 196, 32, 41, 3, + 251, 195, 32, 41, 3, 251, 194, 32, 41, 3, 251, 193, 32, 41, 3, 251, 192, + 32, 41, 3, 251, 191, 32, 41, 3, 251, 190, 32, 41, 3, 251, 189, 32, 41, 3, + 251, 188, 32, 41, 3, 251, 187, 32, 41, 3, 251, 186, 32, 41, 3, 251, 185, + 32, 41, 3, 251, 184, 32, 41, 3, 251, 183, 32, 41, 3, 251, 182, 32, 41, 3, + 251, 181, 32, 41, 3, 251, 180, 32, 41, 3, 251, 179, 32, 41, 3, 251, 178, + 32, 41, 3, 251, 177, 32, 41, 3, 251, 176, 32, 41, 3, 251, 175, 32, 41, 3, + 251, 174, 32, 41, 3, 251, 173, 32, 41, 3, 251, 172, 32, 41, 3, 251, 171, + 32, 41, 3, 251, 170, 32, 41, 3, 251, 169, 32, 41, 3, 251, 168, 32, 41, 3, + 254, 160, 32, 41, 3, 251, 167, 32, 41, 3, 251, 166, 32, 41, 3, 254, 125, + 32, 41, 3, 251, 165, 32, 41, 3, 251, 164, 32, 41, 3, 251, 163, 32, 41, 3, + 251, 162, 32, 41, 3, 254, 112, 32, 41, 3, 251, 161, 32, 41, 3, 251, 160, + 32, 41, 3, 251, 159, 32, 41, 3, 251, 158, 32, 41, 3, 251, 157, 32, 41, 3, + 253, 184, 32, 41, 3, 253, 183, 32, 41, 3, 253, 182, 32, 41, 3, 253, 181, + 32, 41, 3, 253, 180, 32, 41, 3, 253, 179, 32, 41, 3, 253, 178, 32, 41, 3, + 253, 177, 32, 41, 3, 253, 175, 32, 41, 3, 253, 174, 32, 41, 3, 253, 173, + 32, 41, 3, 253, 172, 32, 41, 3, 253, 171, 32, 41, 3, 253, 170, 32, 41, 3, + 253, 168, 32, 41, 3, 253, 167, 32, 41, 3, 253, 166, 32, 41, 3, 253, 165, + 32, 41, 3, 253, 164, 32, 41, 3, 253, 163, 32, 41, 3, 253, 162, 32, 41, 3, + 253, 161, 32, 41, 3, 253, 160, 32, 41, 3, 253, 159, 32, 41, 3, 253, 158, + 32, 41, 3, 253, 157, 32, 41, 3, 253, 156, 32, 41, 3, 253, 155, 32, 41, 3, + 253, 154, 32, 41, 3, 253, 153, 32, 41, 3, 253, 152, 32, 41, 3, 253, 151, + 32, 41, 3, 253, 150, 32, 41, 3, 253, 148, 32, 41, 3, 253, 147, 32, 41, 3, + 253, 146, 32, 41, 3, 253, 142, 32, 41, 3, 253, 141, 32, 41, 3, 253, 140, + 32, 41, 3, 253, 139, 32, 41, 3, 253, 135, 32, 41, 3, 253, 134, 32, 41, 3, + 253, 133, 32, 41, 3, 253, 132, 32, 41, 3, 253, 131, 32, 41, 3, 253, 130, + 32, 41, 3, 253, 129, 32, 41, 3, 253, 128, 32, 41, 3, 253, 127, 32, 41, 3, + 253, 126, 32, 41, 3, 253, 125, 32, 41, 3, 253, 124, 32, 41, 3, 253, 123, + 32, 41, 3, 253, 122, 32, 41, 3, 253, 121, 32, 41, 3, 253, 120, 32, 41, 3, + 253, 119, 32, 41, 3, 253, 118, 32, 41, 3, 253, 117, 32, 41, 3, 253, 116, + 32, 41, 3, 253, 115, 32, 41, 3, 253, 114, 32, 41, 3, 253, 113, 32, 41, 3, + 253, 111, 32, 41, 3, 253, 110, 32, 41, 3, 253, 109, 32, 41, 3, 253, 108, + 32, 41, 3, 253, 107, 32, 41, 3, 253, 105, 32, 41, 3, 253, 104, 32, 41, 3, + 253, 103, 32, 41, 3, 253, 102, 32, 41, 3, 253, 100, 32, 41, 3, 253, 99, + 32, 41, 3, 253, 98, 32, 41, 3, 253, 64, 32, 41, 3, 253, 62, 32, 41, 3, + 253, 60, 32, 41, 3, 253, 58, 32, 41, 3, 253, 56, 32, 41, 3, 253, 54, 32, + 41, 3, 253, 52, 32, 41, 3, 253, 50, 32, 41, 3, 253, 48, 32, 41, 3, 253, + 46, 32, 41, 3, 253, 44, 32, 41, 3, 253, 41, 32, 41, 3, 253, 39, 32, 41, + 3, 253, 37, 32, 41, 3, 253, 35, 32, 41, 3, 253, 33, 32, 41, 3, 253, 31, + 32, 41, 3, 253, 29, 32, 41, 3, 253, 27, 32, 41, 3, 252, 201, 32, 41, 3, + 252, 200, 32, 41, 3, 252, 199, 32, 41, 3, 252, 198, 32, 41, 3, 252, 197, + 32, 41, 3, 252, 196, 32, 41, 3, 252, 194, 32, 41, 3, 252, 193, 32, 41, 3, + 252, 192, 32, 41, 3, 252, 191, 32, 41, 3, 252, 190, 32, 41, 3, 252, 189, + 32, 41, 3, 252, 187, 32, 41, 3, 252, 186, 32, 41, 3, 252, 182, 32, 41, 3, + 252, 181, 32, 41, 3, 252, 179, 32, 41, 3, 252, 178, 32, 41, 3, 252, 177, + 32, 41, 3, 252, 176, 32, 41, 3, 252, 175, 32, 41, 3, 252, 174, 32, 41, 3, + 252, 173, 32, 41, 3, 252, 172, 32, 41, 3, 252, 171, 32, 41, 3, 252, 170, + 32, 41, 3, 252, 169, 32, 41, 3, 252, 168, 32, 41, 3, 252, 167, 32, 41, 3, + 252, 166, 32, 41, 3, 252, 165, 32, 41, 3, 252, 164, 32, 41, 3, 252, 163, + 32, 41, 3, 252, 162, 32, 41, 3, 252, 161, 32, 41, 3, 252, 160, 32, 41, 3, + 252, 159, 32, 41, 3, 252, 158, 32, 41, 3, 252, 157, 32, 41, 3, 252, 156, + 32, 41, 3, 252, 155, 32, 41, 3, 252, 154, 32, 41, 3, 252, 153, 32, 41, 3, + 252, 152, 32, 41, 3, 252, 151, 32, 41, 3, 252, 150, 32, 41, 3, 252, 149, + 32, 41, 3, 252, 148, 32, 41, 3, 252, 147, 32, 41, 3, 252, 146, 32, 41, 3, + 252, 145, 32, 41, 3, 252, 144, 32, 41, 3, 252, 143, 32, 41, 3, 252, 142, + 32, 41, 3, 252, 141, 32, 41, 3, 252, 140, 32, 41, 3, 252, 139, 32, 41, 3, + 252, 138, 32, 41, 3, 252, 137, 32, 41, 3, 252, 136, 32, 41, 3, 252, 135, + 32, 41, 3, 252, 134, 32, 41, 3, 252, 133, 32, 41, 3, 252, 132, 32, 41, 3, + 252, 131, 32, 41, 3, 252, 130, 32, 41, 3, 252, 129, 32, 41, 3, 252, 128, + 32, 41, 3, 252, 127, 32, 41, 3, 252, 126, 32, 41, 3, 252, 125, 32, 41, 3, + 252, 124, 32, 41, 3, 252, 123, 32, 41, 3, 252, 122, 32, 41, 3, 252, 121, + 32, 41, 3, 252, 120, 32, 41, 3, 252, 119, 32, 41, 3, 252, 118, 32, 41, 3, + 252, 117, 32, 41, 3, 252, 116, 32, 41, 3, 252, 115, 32, 41, 3, 252, 114, + 32, 41, 3, 252, 113, 32, 41, 3, 252, 112, 32, 41, 3, 252, 111, 32, 41, 3, + 252, 110, 32, 41, 3, 252, 109, 32, 41, 3, 252, 108, 32, 41, 3, 252, 107, + 32, 41, 3, 252, 106, 32, 41, 3, 252, 105, 32, 41, 3, 252, 104, 32, 41, 3, + 252, 103, 32, 41, 3, 252, 102, 32, 41, 3, 252, 101, 32, 41, 3, 252, 100, + 32, 41, 3, 252, 99, 32, 41, 3, 252, 98, 32, 41, 3, 252, 97, 32, 41, 3, + 252, 96, 32, 41, 3, 252, 95, 32, 41, 3, 252, 94, 32, 41, 3, 252, 93, 32, + 41, 3, 252, 92, 32, 41, 3, 252, 91, 32, 41, 3, 252, 90, 32, 41, 3, 252, + 89, 32, 41, 3, 252, 88, 32, 41, 3, 252, 87, 32, 41, 3, 252, 86, 32, 41, + 3, 252, 85, 32, 41, 3, 252, 84, 32, 41, 3, 252, 83, 32, 41, 3, 252, 82, + 32, 41, 3, 252, 81, 32, 41, 3, 252, 80, 32, 41, 3, 252, 79, 32, 41, 3, + 252, 78, 32, 41, 3, 252, 77, 32, 41, 3, 252, 76, 32, 41, 3, 252, 75, 32, + 41, 3, 252, 74, 32, 41, 3, 252, 73, 32, 41, 3, 252, 72, 32, 41, 3, 252, + 71, 32, 41, 3, 252, 70, 32, 41, 3, 252, 69, 32, 41, 3, 252, 68, 32, 41, + 3, 252, 67, 32, 41, 3, 252, 66, 32, 41, 3, 252, 65, 32, 41, 3, 252, 64, + 32, 41, 3, 252, 63, 64, 32, 41, 3, 252, 62, 249, 226, 32, 41, 3, 252, 61, + 238, 95, 32, 41, 3, 252, 60, 71, 32, 41, 3, 252, 59, 233, 163, 32, 41, 3, + 252, 58, 230, 124, 32, 41, 3, 252, 57, 223, 65, 32, 41, 3, 252, 56, 222, + 184, 32, 41, 3, 252, 55, 165, 32, 41, 3, 252, 54, 220, 189, 32, 41, 3, + 252, 53, 220, 188, 32, 41, 3, 252, 52, 220, 187, 32, 41, 3, 252, 51, 220, + 186, 32, 41, 3, 252, 50, 194, 202, 32, 41, 3, 252, 49, 193, 223, 32, 41, + 3, 252, 48, 193, 148, 32, 41, 3, 252, 47, 211, 216, 32, 41, 3, 252, 46, + 251, 152, 32, 41, 3, 252, 45, 248, 160, 32, 41, 3, 252, 44, 237, 163, 32, + 41, 3, 252, 43, 233, 171, 32, 41, 3, 252, 42, 223, 41, 32, 41, 3, 252, + 41, 32, 41, 3, 252, 40, 32, 41, 3, 252, 39, 32, 41, 3, 252, 38, 32, 41, + 3, 252, 37, 32, 41, 3, 252, 36, 32, 41, 3, 252, 35, 32, 41, 3, 252, 34, + 238, 102, 5, 64, 238, 102, 5, 71, 238, 102, 5, 70, 238, 102, 5, 74, 238, + 102, 5, 68, 238, 102, 5, 223, 62, 238, 102, 5, 222, 233, 238, 102, 5, + 160, 238, 102, 5, 222, 57, 238, 102, 5, 221, 204, 238, 102, 5, 221, 113, + 238, 102, 5, 221, 33, 238, 102, 5, 177, 238, 102, 5, 220, 42, 238, 102, + 5, 219, 209, 238, 102, 5, 219, 107, 238, 102, 5, 219, 36, 238, 102, 5, + 172, 238, 102, 5, 217, 48, 238, 102, 5, 216, 175, 238, 102, 5, 216, 91, + 238, 102, 5, 215, 241, 238, 102, 5, 181, 238, 102, 5, 214, 214, 238, 102, + 5, 214, 60, 238, 102, 5, 213, 142, 238, 102, 5, 213, 22, 238, 102, 5, + 166, 238, 102, 5, 210, 181, 238, 102, 5, 210, 51, 238, 102, 5, 209, 198, + 238, 102, 5, 209, 51, 238, 102, 5, 167, 238, 102, 5, 208, 7, 238, 102, 5, + 207, 151, 238, 102, 5, 207, 55, 238, 102, 5, 206, 218, 238, 102, 5, 188, + 238, 102, 5, 205, 223, 238, 102, 5, 203, 125, 238, 102, 5, 202, 212, 238, + 102, 5, 201, 184, 238, 102, 5, 189, 238, 102, 5, 200, 79, 238, 102, 5, + 199, 128, 238, 102, 5, 155, 238, 102, 5, 198, 45, 238, 102, 5, 194, 169, + 238, 102, 5, 194, 111, 238, 102, 5, 194, 72, 238, 102, 5, 194, 36, 238, + 102, 5, 193, 209, 238, 102, 5, 193, 203, 238, 102, 5, 192, 112, 238, 102, + 5, 192, 8, 223, 192, 250, 116, 1, 251, 24, 223, 192, 250, 116, 1, 248, + 62, 223, 192, 250, 116, 1, 231, 31, 223, 192, 250, 116, 1, 237, 220, 223, + 192, 250, 116, 1, 229, 255, 223, 192, 250, 116, 1, 194, 119, 223, 192, + 250, 116, 1, 192, 89, 223, 192, 250, 116, 1, 229, 194, 223, 192, 250, + 116, 1, 200, 4, 223, 192, 250, 116, 1, 192, 238, 223, 192, 250, 116, 1, + 222, 109, 223, 192, 250, 116, 1, 220, 85, 223, 192, 250, 116, 1, 217, 12, + 223, 192, 250, 116, 1, 212, 230, 223, 192, 250, 116, 1, 206, 46, 223, + 192, 250, 116, 1, 249, 231, 223, 192, 250, 116, 1, 210, 181, 223, 192, + 250, 116, 1, 206, 83, 223, 192, 250, 116, 1, 208, 181, 223, 192, 250, + 116, 1, 207, 188, 223, 192, 250, 116, 1, 203, 224, 223, 192, 250, 116, 1, + 200, 93, 223, 192, 250, 116, 205, 209, 57, 223, 192, 250, 116, 31, 101, + 223, 192, 250, 116, 31, 104, 223, 192, 250, 116, 31, 133, 223, 192, 250, + 116, 31, 200, 30, 223, 192, 250, 116, 31, 197, 239, 223, 192, 250, 116, + 31, 90, 228, 162, 223, 192, 250, 116, 31, 90, 180, 223, 192, 250, 116, + 31, 200, 31, 180, 211, 38, 1, 251, 24, 211, 38, 1, 248, 62, 211, 38, 1, + 231, 31, 211, 38, 1, 237, 220, 211, 38, 1, 229, 255, 211, 38, 1, 194, + 119, 211, 38, 1, 192, 89, 211, 38, 1, 229, 194, 211, 38, 1, 200, 4, 211, + 38, 1, 192, 238, 211, 38, 1, 222, 109, 211, 38, 1, 220, 85, 211, 38, 1, + 217, 12, 211, 38, 1, 52, 212, 230, 211, 38, 1, 212, 230, 211, 38, 1, 206, + 46, 211, 38, 1, 249, 231, 211, 38, 1, 210, 181, 211, 38, 1, 206, 83, 211, + 38, 1, 208, 181, 211, 38, 1, 207, 188, 211, 38, 1, 203, 224, 211, 38, 1, + 200, 93, 211, 38, 220, 23, 232, 190, 211, 38, 207, 96, 232, 190, 211, 38, + 31, 101, 211, 38, 31, 104, 211, 38, 31, 133, 211, 38, 31, 134, 211, 38, + 31, 151, 211, 38, 31, 200, 30, 211, 38, 31, 197, 239, 215, 80, 1, 52, + 251, 24, 215, 80, 1, 251, 24, 215, 80, 1, 52, 248, 62, 215, 80, 1, 248, + 62, 215, 80, 1, 231, 31, 215, 80, 1, 237, 220, 215, 80, 1, 52, 229, 255, + 215, 80, 1, 229, 255, 215, 80, 1, 194, 119, 215, 80, 1, 192, 89, 215, 80, + 1, 229, 194, 215, 80, 1, 200, 4, 215, 80, 1, 52, 192, 238, 215, 80, 1, + 192, 238, 215, 80, 1, 52, 222, 109, 215, 80, 1, 222, 109, 215, 80, 1, 52, + 220, 85, 215, 80, 1, 220, 85, 215, 80, 1, 52, 217, 12, 215, 80, 1, 217, + 12, 215, 80, 1, 52, 212, 230, 215, 80, 1, 212, 230, 215, 80, 1, 206, 46, + 215, 80, 1, 249, 231, 215, 80, 1, 210, 181, 215, 80, 1, 206, 83, 215, 80, + 1, 208, 181, 215, 80, 1, 207, 188, 215, 80, 1, 52, 203, 224, 215, 80, 1, + 203, 224, 215, 80, 1, 200, 93, 215, 80, 31, 101, 215, 80, 31, 104, 215, + 80, 31, 133, 215, 80, 31, 134, 215, 80, 238, 168, 31, 134, 215, 80, 31, + 151, 215, 80, 31, 200, 30, 215, 80, 31, 197, 239, 215, 80, 31, 90, 228, + 162, 230, 13, 1, 251, 24, 230, 13, 1, 248, 62, 230, 13, 1, 231, 31, 230, + 13, 1, 237, 219, 230, 13, 1, 229, 255, 230, 13, 1, 194, 119, 230, 13, 1, + 192, 87, 230, 13, 1, 229, 194, 230, 13, 1, 200, 4, 230, 13, 1, 192, 238, + 230, 13, 1, 222, 109, 230, 13, 1, 220, 85, 230, 13, 1, 217, 12, 230, 13, + 1, 212, 230, 230, 13, 1, 206, 46, 230, 13, 1, 249, 229, 230, 13, 1, 210, + 181, 230, 13, 1, 206, 83, 230, 13, 1, 208, 181, 230, 13, 1, 203, 224, + 230, 13, 1, 200, 93, 230, 13, 31, 101, 230, 13, 31, 151, 230, 13, 31, + 200, 30, 230, 13, 31, 197, 239, 230, 13, 31, 90, 228, 162, 210, 63, 1, + 251, 21, 210, 63, 1, 248, 65, 210, 63, 1, 231, 206, 210, 63, 1, 237, 78, + 210, 63, 1, 229, 255, 210, 63, 1, 194, 126, 210, 63, 1, 192, 105, 210, + 63, 1, 229, 196, 210, 63, 1, 200, 8, 210, 63, 1, 192, 239, 210, 63, 1, + 222, 139, 210, 63, 1, 220, 91, 210, 63, 1, 217, 12, 210, 63, 1, 212, 230, + 210, 63, 1, 204, 174, 210, 63, 1, 251, 57, 210, 63, 1, 210, 181, 210, 63, + 1, 206, 85, 210, 63, 1, 208, 186, 210, 63, 1, 207, 18, 210, 63, 1, 203, + 224, 210, 63, 1, 200, 100, 210, 63, 31, 101, 210, 63, 31, 200, 30, 210, + 63, 31, 197, 239, 210, 63, 31, 90, 228, 162, 210, 63, 31, 104, 210, 63, + 31, 133, 210, 63, 194, 11, 204, 165, 218, 248, 1, 64, 218, 248, 1, 249, + 226, 218, 248, 1, 232, 44, 218, 248, 1, 238, 95, 218, 248, 1, 71, 218, + 248, 1, 196, 236, 218, 248, 1, 70, 218, 248, 1, 193, 148, 218, 248, 1, + 222, 184, 218, 248, 1, 165, 218, 248, 1, 218, 236, 218, 248, 1, 215, 151, + 218, 248, 1, 74, 218, 248, 1, 150, 218, 248, 1, 202, 95, 218, 248, 1, + 200, 228, 218, 248, 1, 68, 218, 248, 1, 233, 163, 218, 248, 1, 208, 247, + 218, 248, 1, 206, 158, 218, 248, 1, 198, 86, 218, 248, 1, 250, 224, 218, + 248, 1, 234, 88, 218, 248, 1, 218, 251, 218, 248, 1, 213, 179, 218, 248, + 1, 247, 52, 218, 248, 198, 182, 77, 147, 229, 164, 1, 64, 147, 229, 164, + 1, 71, 147, 229, 164, 1, 70, 147, 229, 164, 1, 74, 147, 229, 164, 1, 168, + 147, 229, 164, 1, 194, 169, 147, 229, 164, 1, 249, 3, 147, 229, 164, 1, + 249, 2, 147, 229, 164, 1, 166, 147, 229, 164, 1, 172, 147, 229, 164, 1, + 181, 147, 229, 164, 1, 215, 95, 147, 229, 164, 1, 214, 214, 147, 229, + 164, 1, 214, 212, 147, 229, 164, 1, 167, 147, 229, 164, 1, 208, 74, 147, + 229, 164, 1, 177, 147, 229, 164, 1, 221, 250, 147, 229, 164, 1, 229, 187, + 147, 229, 164, 1, 188, 147, 229, 164, 1, 206, 99, 147, 229, 164, 1, 205, + 223, 147, 229, 164, 1, 160, 147, 229, 164, 1, 208, 239, 147, 229, 164, 1, + 189, 147, 229, 164, 1, 200, 179, 147, 229, 164, 1, 200, 79, 147, 229, + 164, 1, 200, 77, 147, 229, 164, 1, 155, 147, 229, 164, 1, 238, 0, 147, + 229, 164, 16, 196, 33, 147, 229, 164, 16, 196, 32, 147, 238, 133, 1, 64, + 147, 238, 133, 1, 71, 147, 238, 133, 1, 70, 147, 238, 133, 1, 74, 147, + 238, 133, 1, 168, 147, 238, 133, 1, 194, 169, 147, 238, 133, 1, 249, 3, + 147, 238, 133, 1, 166, 147, 238, 133, 1, 172, 147, 238, 133, 1, 181, 147, + 238, 133, 1, 214, 214, 147, 238, 133, 1, 167, 147, 238, 133, 1, 177, 147, + 238, 133, 1, 221, 250, 147, 238, 133, 1, 229, 187, 147, 238, 133, 1, 188, + 147, 238, 133, 1, 250, 112, 188, 147, 238, 133, 1, 205, 223, 147, 238, + 133, 1, 160, 147, 238, 133, 1, 208, 239, 147, 238, 133, 1, 189, 147, 238, + 133, 1, 200, 79, 147, 238, 133, 1, 155, 147, 238, 133, 1, 238, 0, 147, + 238, 133, 232, 109, 234, 112, 197, 246, 147, 238, 133, 232, 109, 90, 230, + 78, 147, 238, 133, 219, 92, 207, 61, 147, 238, 133, 219, 92, 223, 197, + 147, 238, 133, 31, 101, 147, 238, 133, 31, 104, 147, 238, 133, 31, 133, + 147, 238, 133, 31, 134, 147, 238, 133, 31, 151, 147, 238, 133, 31, 170, + 147, 238, 133, 31, 179, 147, 238, 133, 31, 174, 147, 238, 133, 31, 182, + 147, 238, 133, 31, 200, 30, 147, 238, 133, 31, 197, 239, 147, 238, 133, + 31, 199, 184, 147, 238, 133, 31, 232, 126, 147, 238, 133, 31, 233, 3, + 147, 238, 133, 31, 203, 25, 147, 238, 133, 31, 204, 140, 147, 238, 133, + 31, 90, 228, 162, 147, 238, 133, 31, 103, 228, 162, 147, 238, 133, 31, + 112, 228, 162, 147, 238, 133, 31, 232, 119, 228, 162, 147, 238, 133, 31, + 232, 214, 228, 162, 147, 238, 133, 31, 203, 41, 228, 162, 147, 238, 133, + 31, 204, 146, 228, 162, 147, 238, 133, 31, 234, 148, 228, 162, 147, 238, + 133, 31, 214, 16, 228, 162, 147, 238, 133, 31, 90, 180, 147, 238, 133, + 31, 103, 180, 147, 238, 133, 31, 112, 180, 147, 238, 133, 31, 232, 119, + 180, 147, 238, 133, 31, 232, 214, 180, 147, 238, 133, 31, 203, 41, 180, + 147, 238, 133, 31, 204, 146, 180, 147, 238, 133, 31, 234, 148, 180, 147, + 238, 133, 31, 214, 16, 180, 147, 238, 133, 31, 200, 31, 180, 147, 238, + 133, 31, 197, 240, 180, 147, 238, 133, 31, 199, 185, 180, 147, 238, 133, + 31, 232, 127, 180, 147, 238, 133, 31, 233, 4, 180, 147, 238, 133, 31, + 203, 26, 180, 147, 238, 133, 31, 204, 141, 180, 147, 238, 133, 31, 234, + 138, 180, 147, 238, 133, 31, 214, 12, 180, 147, 238, 133, 31, 90, 228, + 163, 180, 147, 238, 133, 31, 103, 228, 163, 180, 147, 238, 133, 31, 112, + 228, 163, 180, 147, 238, 133, 31, 232, 119, 228, 163, 180, 147, 238, 133, + 31, 232, 214, 228, 163, 180, 147, 238, 133, 31, 203, 41, 228, 163, 180, + 147, 238, 133, 31, 204, 146, 228, 163, 180, 147, 238, 133, 31, 234, 148, + 228, 163, 180, 147, 238, 133, 31, 214, 16, 228, 163, 180, 147, 238, 133, + 232, 109, 90, 197, 247, 147, 238, 133, 232, 109, 103, 197, 246, 147, 238, + 133, 232, 109, 112, 197, 246, 147, 238, 133, 232, 109, 232, 119, 197, + 246, 147, 238, 133, 232, 109, 232, 214, 197, 246, 147, 238, 133, 232, + 109, 203, 41, 197, 246, 147, 238, 133, 232, 109, 204, 146, 197, 246, 147, + 238, 133, 232, 109, 234, 148, 197, 246, 147, 238, 133, 232, 109, 214, 16, + 197, 246, 147, 238, 133, 232, 109, 200, 31, 197, 246, 221, 236, 1, 64, + 221, 236, 18, 3, 70, 221, 236, 18, 3, 68, 221, 236, 18, 3, 118, 150, 221, + 236, 18, 3, 71, 221, 236, 18, 3, 74, 221, 236, 18, 220, 2, 77, 221, 236, + 3, 55, 207, 82, 63, 221, 236, 3, 250, 168, 221, 236, 3, 196, 6, 221, 236, + 1, 160, 221, 236, 1, 221, 250, 221, 236, 1, 231, 233, 221, 236, 1, 231, + 84, 221, 236, 1, 247, 19, 221, 236, 1, 246, 117, 221, 236, 1, 223, 62, + 221, 236, 1, 212, 201, 221, 236, 1, 198, 83, 221, 236, 1, 198, 71, 221, + 236, 1, 237, 161, 221, 236, 1, 237, 145, 221, 236, 1, 213, 178, 221, 236, + 1, 189, 221, 236, 1, 199, 240, 221, 236, 1, 238, 0, 221, 236, 1, 237, 40, + 221, 236, 1, 181, 221, 236, 1, 166, 221, 236, 1, 210, 94, 221, 236, 1, + 249, 3, 221, 236, 1, 248, 54, 221, 236, 1, 172, 221, 236, 1, 168, 221, + 236, 1, 167, 221, 236, 1, 177, 221, 236, 1, 196, 157, 221, 236, 1, 204, + 64, 221, 236, 1, 202, 92, 221, 236, 1, 188, 221, 236, 1, 192, 112, 221, + 236, 1, 144, 221, 236, 1, 221, 139, 221, 236, 1, 198, 51, 221, 236, 1, + 198, 52, 221, 236, 1, 196, 40, 221, 236, 3, 248, 194, 58, 221, 236, 3, + 246, 189, 221, 236, 3, 78, 63, 221, 236, 196, 11, 221, 236, 17, 101, 221, + 236, 17, 104, 221, 236, 17, 133, 221, 236, 17, 134, 221, 236, 31, 200, + 30, 221, 236, 31, 197, 239, 221, 236, 31, 90, 228, 162, 221, 236, 31, 90, + 180, 221, 236, 232, 109, 90, 230, 78, 221, 236, 209, 38, 236, 114, 221, + 236, 209, 38, 2, 242, 130, 221, 236, 209, 38, 242, 130, 221, 236, 209, + 38, 238, 194, 161, 221, 236, 209, 38, 217, 153, 221, 236, 209, 38, 219, + 57, 221, 236, 209, 38, 237, 208, 221, 236, 209, 38, 55, 237, 208, 221, + 236, 209, 38, 219, 169, 40, 202, 171, 250, 127, 1, 229, 255, 40, 202, + 171, 250, 127, 1, 220, 85, 40, 202, 171, 250, 127, 1, 229, 194, 40, 202, + 171, 250, 127, 1, 217, 12, 40, 202, 171, 250, 127, 1, 208, 181, 40, 202, + 171, 250, 127, 1, 194, 119, 40, 202, 171, 250, 127, 1, 203, 224, 40, 202, + 171, 250, 127, 1, 207, 188, 40, 202, 171, 250, 127, 1, 248, 62, 40, 202, + 171, 250, 127, 1, 200, 93, 40, 202, 171, 250, 127, 1, 206, 20, 40, 202, + 171, 250, 127, 1, 222, 109, 40, 202, 171, 250, 127, 1, 212, 230, 40, 202, + 171, 250, 127, 1, 221, 231, 40, 202, 171, 250, 127, 1, 206, 83, 40, 202, + 171, 250, 127, 1, 206, 46, 40, 202, 171, 250, 127, 1, 233, 47, 40, 202, + 171, 250, 127, 1, 251, 26, 40, 202, 171, 250, 127, 1, 249, 229, 40, 202, + 171, 250, 127, 1, 237, 37, 40, 202, 171, 250, 127, 1, 231, 31, 40, 202, + 171, 250, 127, 1, 237, 220, 40, 202, 171, 250, 127, 1, 231, 72, 40, 202, + 171, 250, 127, 1, 200, 4, 40, 202, 171, 250, 127, 1, 192, 87, 40, 202, + 171, 250, 127, 1, 237, 34, 40, 202, 171, 250, 127, 1, 192, 238, 40, 202, + 171, 250, 127, 1, 199, 226, 40, 202, 171, 250, 127, 1, 199, 205, 40, 202, + 171, 250, 127, 31, 101, 40, 202, 171, 250, 127, 31, 233, 3, 40, 202, 171, + 250, 127, 162, 223, 172, 40, 178, 250, 127, 1, 229, 220, 40, 178, 250, + 127, 1, 220, 94, 40, 178, 250, 127, 1, 230, 89, 40, 178, 250, 127, 1, + 217, 26, 40, 178, 250, 127, 1, 208, 232, 40, 178, 250, 127, 1, 194, 119, + 40, 178, 250, 127, 1, 234, 7, 40, 178, 250, 127, 1, 207, 221, 40, 178, + 250, 127, 1, 248, 96, 40, 178, 250, 127, 1, 200, 49, 40, 178, 250, 127, + 1, 234, 8, 40, 178, 250, 127, 1, 222, 139, 40, 178, 250, 127, 1, 213, + 123, 40, 178, 250, 127, 1, 221, 245, 40, 178, 250, 127, 1, 206, 86, 40, + 178, 250, 127, 1, 234, 6, 40, 178, 250, 127, 1, 233, 34, 40, 178, 250, + 127, 1, 251, 26, 40, 178, 250, 127, 1, 251, 57, 40, 178, 250, 127, 1, + 237, 250, 40, 178, 250, 127, 1, 231, 149, 40, 178, 250, 127, 1, 237, 227, + 40, 178, 250, 127, 1, 231, 79, 40, 178, 250, 127, 1, 200, 151, 40, 178, + 250, 127, 1, 192, 103, 40, 178, 250, 127, 1, 199, 232, 40, 178, 250, 127, + 1, 193, 64, 40, 178, 250, 127, 1, 199, 220, 40, 178, 250, 127, 1, 192, + 106, 40, 178, 250, 127, 31, 101, 40, 178, 250, 127, 31, 200, 30, 40, 178, + 250, 127, 31, 197, 239, 217, 151, 1, 251, 24, 217, 151, 1, 248, 62, 217, + 151, 1, 248, 47, 217, 151, 1, 231, 31, 217, 151, 1, 231, 57, 217, 151, 1, + 237, 220, 217, 151, 1, 229, 255, 217, 151, 1, 194, 119, 217, 151, 3, 197, + 109, 217, 151, 1, 192, 89, 217, 151, 1, 192, 64, 217, 151, 1, 223, 43, + 217, 151, 1, 223, 24, 217, 151, 1, 229, 194, 217, 151, 1, 200, 4, 217, + 151, 1, 192, 238, 217, 151, 1, 222, 109, 217, 151, 1, 193, 206, 217, 151, + 1, 221, 238, 217, 151, 1, 220, 85, 217, 151, 1, 237, 33, 217, 151, 1, + 199, 231, 217, 151, 1, 217, 12, 217, 151, 1, 212, 230, 217, 151, 1, 206, + 46, 217, 151, 1, 249, 231, 217, 151, 1, 251, 241, 217, 151, 1, 210, 181, + 217, 151, 1, 233, 47, 217, 151, 1, 206, 83, 217, 151, 1, 208, 181, 217, + 151, 1, 193, 182, 217, 151, 1, 208, 208, 217, 151, 1, 207, 188, 217, 151, + 1, 203, 224, 217, 151, 1, 202, 60, 217, 151, 1, 200, 93, 217, 151, 251, + 151, 122, 58, 217, 151, 251, 151, 122, 63, 217, 151, 31, 101, 217, 151, + 31, 151, 217, 151, 31, 200, 30, 217, 151, 31, 197, 239, 217, 151, 31, 90, + 228, 162, 217, 151, 209, 38, 202, 19, 217, 151, 209, 38, 232, 190, 217, + 151, 209, 38, 55, 78, 194, 41, 236, 114, 217, 151, 209, 38, 78, 194, 41, + 236, 114, 217, 151, 209, 38, 236, 114, 217, 151, 209, 38, 103, 236, 111, + 217, 151, 209, 38, 219, 176, 232, 247, 249, 243, 1, 64, 249, 243, 1, 252, + 33, 249, 243, 1, 250, 166, 249, 243, 1, 251, 247, 249, 243, 1, 250, 224, + 249, 243, 1, 251, 249, 249, 243, 1, 251, 108, 249, 243, 1, 251, 104, 249, + 243, 1, 71, 249, 243, 1, 234, 171, 249, 243, 1, 74, 249, 243, 1, 211, + 194, 249, 243, 1, 70, 249, 243, 1, 223, 224, 249, 243, 1, 68, 249, 243, + 1, 196, 251, 249, 243, 1, 222, 57, 249, 243, 1, 193, 203, 249, 243, 1, + 193, 162, 249, 243, 1, 193, 173, 249, 243, 1, 231, 158, 249, 243, 1, 231, + 115, 249, 243, 1, 231, 70, 249, 243, 1, 246, 158, 249, 243, 1, 223, 41, + 249, 243, 1, 200, 79, 249, 243, 1, 199, 224, 249, 243, 1, 237, 116, 249, + 243, 1, 237, 31, 249, 243, 1, 198, 78, 249, 243, 1, 210, 181, 249, 243, + 1, 233, 47, 249, 243, 1, 248, 123, 249, 243, 1, 248, 49, 249, 243, 1, + 214, 152, 249, 243, 1, 214, 67, 249, 243, 1, 214, 68, 249, 243, 1, 214, + 214, 249, 243, 1, 212, 190, 249, 243, 1, 213, 173, 249, 243, 1, 217, 48, + 249, 243, 1, 229, 93, 249, 243, 1, 192, 162, 249, 243, 1, 193, 69, 249, + 243, 1, 196, 123, 249, 243, 1, 208, 7, 249, 243, 1, 220, 42, 249, 243, 1, + 205, 223, 249, 243, 1, 192, 85, 249, 243, 1, 204, 12, 249, 243, 1, 192, + 62, 249, 243, 1, 203, 132, 249, 243, 1, 202, 61, 249, 243, 1, 229, 255, + 249, 243, 251, 151, 77, 199, 76, 103, 236, 112, 136, 90, 78, 209, 37, 2, + 103, 236, 112, 136, 90, 78, 209, 37, 220, 73, 103, 236, 112, 136, 90, 78, + 209, 37, 220, 73, 90, 78, 136, 103, 236, 112, 209, 37, 220, 73, 103, 207, + 78, 136, 90, 207, 82, 209, 37, 220, 73, 90, 207, 82, 136, 103, 207, 78, + 209, 37, 223, 150, 210, 223, 1, 251, 24, 223, 150, 210, 223, 1, 248, 62, + 223, 150, 210, 223, 1, 231, 31, 223, 150, 210, 223, 1, 237, 220, 223, + 150, 210, 223, 1, 229, 255, 223, 150, 210, 223, 1, 194, 119, 223, 150, + 210, 223, 1, 192, 89, 223, 150, 210, 223, 1, 229, 194, 223, 150, 210, + 223, 1, 200, 4, 223, 150, 210, 223, 1, 192, 238, 223, 150, 210, 223, 1, + 222, 109, 223, 150, 210, 223, 1, 220, 85, 223, 150, 210, 223, 1, 217, 12, + 223, 150, 210, 223, 1, 212, 230, 223, 150, 210, 223, 1, 206, 46, 223, + 150, 210, 223, 1, 249, 231, 223, 150, 210, 223, 1, 210, 181, 223, 150, + 210, 223, 1, 206, 83, 223, 150, 210, 223, 1, 208, 181, 223, 150, 210, + 223, 1, 207, 188, 223, 150, 210, 223, 1, 203, 224, 223, 150, 210, 223, 1, + 200, 93, 223, 150, 210, 223, 31, 101, 223, 150, 210, 223, 31, 104, 223, + 150, 210, 223, 31, 133, 223, 150, 210, 223, 31, 134, 223, 150, 210, 223, + 31, 200, 30, 223, 150, 210, 223, 31, 197, 239, 223, 150, 210, 223, 31, + 90, 228, 162, 223, 150, 210, 223, 31, 90, 180, 223, 150, 211, 56, 1, 251, + 24, 223, 150, 211, 56, 1, 248, 62, 223, 150, 211, 56, 1, 231, 31, 223, + 150, 211, 56, 1, 237, 220, 223, 150, 211, 56, 1, 229, 255, 223, 150, 211, + 56, 1, 194, 118, 223, 150, 211, 56, 1, 192, 89, 223, 150, 211, 56, 1, + 229, 194, 223, 150, 211, 56, 1, 200, 4, 223, 150, 211, 56, 1, 192, 238, + 223, 150, 211, 56, 1, 222, 109, 223, 150, 211, 56, 1, 220, 85, 223, 150, + 211, 56, 1, 217, 11, 223, 150, 211, 56, 1, 212, 230, 223, 150, 211, 56, + 1, 206, 46, 223, 150, 211, 56, 1, 210, 181, 223, 150, 211, 56, 1, 206, + 83, 223, 150, 211, 56, 1, 203, 224, 223, 150, 211, 56, 1, 200, 93, 223, + 150, 211, 56, 31, 101, 223, 150, 211, 56, 31, 104, 223, 150, 211, 56, 31, + 133, 223, 150, 211, 56, 31, 134, 223, 150, 211, 56, 31, 200, 30, 223, + 150, 211, 56, 31, 197, 239, 223, 150, 211, 56, 31, 90, 228, 162, 223, + 150, 211, 56, 31, 90, 180, 209, 63, 211, 56, 1, 251, 24, 209, 63, 211, + 56, 1, 248, 62, 209, 63, 211, 56, 1, 231, 31, 209, 63, 211, 56, 1, 237, + 220, 209, 63, 211, 56, 1, 229, 255, 209, 63, 211, 56, 1, 194, 118, 209, + 63, 211, 56, 1, 192, 89, 209, 63, 211, 56, 1, 229, 194, 209, 63, 211, 56, + 1, 192, 238, 209, 63, 211, 56, 1, 222, 109, 209, 63, 211, 56, 1, 220, 85, + 209, 63, 211, 56, 1, 217, 11, 209, 63, 211, 56, 1, 212, 230, 209, 63, + 211, 56, 1, 206, 46, 209, 63, 211, 56, 1, 210, 181, 209, 63, 211, 56, 1, + 206, 83, 209, 63, 211, 56, 1, 203, 224, 209, 63, 211, 56, 1, 200, 93, + 209, 63, 211, 56, 205, 209, 77, 209, 63, 211, 56, 163, 205, 209, 77, 209, + 63, 211, 56, 232, 119, 236, 112, 4, 238, 183, 209, 63, 211, 56, 232, 119, + 236, 112, 4, 236, 114, 209, 63, 211, 56, 31, 101, 209, 63, 211, 56, 31, + 104, 209, 63, 211, 56, 31, 133, 209, 63, 211, 56, 31, 134, 209, 63, 211, + 56, 31, 200, 30, 209, 63, 211, 56, 31, 197, 239, 209, 63, 211, 56, 31, + 90, 228, 162, 40, 198, 12, 1, 211, 152, 64, 40, 198, 12, 1, 193, 57, 64, + 40, 198, 12, 1, 193, 57, 251, 108, 40, 198, 12, 1, 211, 152, 70, 40, 198, + 12, 1, 193, 57, 70, 40, 198, 12, 1, 193, 57, 71, 40, 198, 12, 1, 211, + 152, 74, 40, 198, 12, 1, 211, 152, 212, 0, 40, 198, 12, 1, 193, 57, 212, + 0, 40, 198, 12, 1, 211, 152, 251, 238, 40, 198, 12, 1, 193, 57, 251, 238, + 40, 198, 12, 1, 211, 152, 251, 107, 40, 198, 12, 1, 193, 57, 251, 107, + 40, 198, 12, 1, 211, 152, 251, 80, 40, 198, 12, 1, 193, 57, 251, 80, 40, + 198, 12, 1, 211, 152, 251, 102, 40, 198, 12, 1, 193, 57, 251, 102, 40, + 198, 12, 1, 211, 152, 251, 125, 40, 198, 12, 1, 193, 57, 251, 125, 40, + 198, 12, 1, 211, 152, 251, 106, 40, 198, 12, 1, 211, 152, 233, 170, 40, + 198, 12, 1, 193, 57, 233, 170, 40, 198, 12, 1, 211, 152, 249, 236, 40, + 198, 12, 1, 193, 57, 249, 236, 40, 198, 12, 1, 211, 152, 251, 89, 40, + 198, 12, 1, 193, 57, 251, 89, 40, 198, 12, 1, 211, 152, 251, 100, 40, + 198, 12, 1, 193, 57, 251, 100, 40, 198, 12, 1, 211, 152, 211, 254, 40, + 198, 12, 1, 193, 57, 211, 254, 40, 198, 12, 1, 211, 152, 251, 35, 40, + 198, 12, 1, 193, 57, 251, 35, 40, 198, 12, 1, 211, 152, 251, 99, 40, 198, + 12, 1, 211, 152, 234, 103, 40, 198, 12, 1, 211, 152, 234, 99, 40, 198, + 12, 1, 211, 152, 250, 224, 40, 198, 12, 1, 211, 152, 251, 97, 40, 198, + 12, 1, 193, 57, 251, 97, 40, 198, 12, 1, 211, 152, 234, 65, 40, 198, 12, + 1, 193, 57, 234, 65, 40, 198, 12, 1, 211, 152, 234, 85, 40, 198, 12, 1, + 193, 57, 234, 85, 40, 198, 12, 1, 211, 152, 234, 51, 40, 198, 12, 1, 193, + 57, 234, 51, 40, 198, 12, 1, 193, 57, 250, 214, 40, 198, 12, 1, 211, 152, + 234, 73, 40, 198, 12, 1, 193, 57, 251, 96, 40, 198, 12, 1, 211, 152, 234, + 41, 40, 198, 12, 1, 211, 152, 211, 185, 40, 198, 12, 1, 211, 152, 228, + 51, 40, 198, 12, 1, 211, 152, 234, 179, 40, 198, 12, 1, 193, 57, 234, + 179, 40, 198, 12, 1, 211, 152, 250, 135, 40, 198, 12, 1, 193, 57, 250, + 135, 40, 198, 12, 1, 211, 152, 223, 107, 40, 198, 12, 1, 193, 57, 223, + 107, 40, 198, 12, 1, 211, 152, 211, 165, 40, 198, 12, 1, 193, 57, 211, + 165, 40, 198, 12, 1, 211, 152, 250, 131, 40, 198, 12, 1, 193, 57, 250, + 131, 40, 198, 12, 1, 211, 152, 251, 95, 40, 198, 12, 1, 211, 152, 250, + 61, 40, 198, 12, 1, 211, 152, 251, 93, 40, 198, 12, 1, 211, 152, 250, 53, + 40, 198, 12, 1, 193, 57, 250, 53, 40, 198, 12, 1, 211, 152, 233, 255, 40, + 198, 12, 1, 193, 57, 233, 255, 40, 198, 12, 1, 211, 152, 250, 26, 40, + 198, 12, 1, 193, 57, 250, 26, 40, 198, 12, 1, 211, 152, 251, 90, 40, 198, + 12, 1, 193, 57, 251, 90, 40, 198, 12, 1, 211, 152, 211, 140, 40, 198, 12, + 1, 211, 152, 248, 177, 40, 169, 6, 1, 64, 40, 169, 6, 1, 252, 33, 40, + 169, 6, 1, 234, 181, 40, 169, 6, 1, 250, 236, 40, 169, 6, 1, 234, 179, + 40, 169, 6, 1, 234, 85, 40, 169, 6, 1, 234, 176, 40, 169, 6, 1, 234, 175, + 40, 169, 6, 1, 250, 217, 40, 169, 6, 1, 71, 40, 169, 6, 1, 242, 85, 71, + 40, 169, 6, 1, 234, 171, 40, 169, 6, 1, 234, 164, 40, 169, 6, 1, 234, + 163, 40, 169, 6, 1, 234, 160, 40, 169, 6, 1, 234, 157, 40, 169, 6, 1, 70, + 40, 169, 6, 1, 223, 224, 40, 169, 6, 1, 234, 134, 40, 169, 6, 1, 234, + 131, 40, 169, 6, 1, 251, 44, 40, 169, 6, 1, 197, 50, 40, 169, 6, 1, 234, + 124, 40, 169, 6, 1, 234, 102, 40, 169, 6, 1, 234, 99, 40, 169, 6, 1, 234, + 88, 40, 169, 6, 1, 234, 51, 40, 169, 6, 1, 74, 40, 169, 6, 1, 211, 194, + 40, 169, 6, 1, 214, 23, 212, 0, 40, 169, 6, 1, 206, 208, 212, 0, 40, 169, + 6, 1, 211, 255, 40, 169, 6, 1, 234, 41, 40, 169, 6, 1, 234, 93, 40, 169, + 6, 1, 234, 21, 40, 169, 6, 1, 203, 195, 234, 21, 40, 169, 6, 1, 234, 9, + 40, 169, 6, 1, 233, 244, 40, 169, 6, 1, 233, 242, 40, 169, 6, 1, 234, 65, + 40, 169, 6, 1, 233, 231, 40, 169, 6, 1, 234, 177, 40, 169, 6, 1, 68, 40, + 169, 6, 1, 196, 251, 40, 169, 6, 1, 214, 23, 197, 104, 40, 169, 6, 1, + 206, 208, 197, 104, 40, 169, 6, 1, 233, 218, 40, 169, 6, 1, 233, 170, 40, + 169, 6, 1, 233, 165, 40, 169, 6, 1, 234, 64, 57, 40, 169, 6, 1, 197, 10, + 40, 169, 2, 1, 64, 40, 169, 2, 1, 252, 33, 40, 169, 2, 1, 234, 181, 40, + 169, 2, 1, 250, 236, 40, 169, 2, 1, 234, 179, 40, 169, 2, 1, 234, 85, 40, + 169, 2, 1, 234, 176, 40, 169, 2, 1, 234, 175, 40, 169, 2, 1, 250, 217, + 40, 169, 2, 1, 71, 40, 169, 2, 1, 242, 85, 71, 40, 169, 2, 1, 234, 171, + 40, 169, 2, 1, 234, 164, 40, 169, 2, 1, 234, 163, 40, 169, 2, 1, 234, + 160, 40, 169, 2, 1, 234, 157, 40, 169, 2, 1, 70, 40, 169, 2, 1, 223, 224, + 40, 169, 2, 1, 234, 134, 40, 169, 2, 1, 234, 131, 40, 169, 2, 1, 251, 44, + 40, 169, 2, 1, 197, 50, 40, 169, 2, 1, 234, 124, 40, 169, 2, 1, 234, 102, + 40, 169, 2, 1, 234, 99, 40, 169, 2, 1, 234, 88, 40, 169, 2, 1, 234, 51, + 40, 169, 2, 1, 74, 40, 169, 2, 1, 211, 194, 40, 169, 2, 1, 214, 23, 212, + 0, 40, 169, 2, 1, 206, 208, 212, 0, 40, 169, 2, 1, 211, 255, 40, 169, 2, + 1, 234, 41, 40, 169, 2, 1, 234, 93, 40, 169, 2, 1, 234, 21, 40, 169, 2, + 1, 203, 195, 234, 21, 40, 169, 2, 1, 234, 9, 40, 169, 2, 1, 233, 244, 40, + 169, 2, 1, 233, 242, 40, 169, 2, 1, 234, 65, 40, 169, 2, 1, 233, 231, 40, + 169, 2, 1, 234, 177, 40, 169, 2, 1, 68, 40, 169, 2, 1, 196, 251, 40, 169, + 2, 1, 214, 23, 197, 104, 40, 169, 2, 1, 206, 208, 197, 104, 40, 169, 2, + 1, 233, 218, 40, 169, 2, 1, 233, 170, 40, 169, 2, 1, 233, 165, 40, 169, + 2, 1, 234, 64, 57, 40, 169, 2, 1, 197, 10, 40, 169, 31, 101, 40, 169, 31, + 151, 40, 169, 31, 200, 30, 40, 169, 31, 233, 3, 40, 169, 31, 90, 228, + 162, 40, 169, 31, 90, 180, 230, 33, 207, 36, 1, 64, 230, 33, 207, 36, 1, + 249, 3, 230, 33, 207, 36, 1, 166, 230, 33, 207, 36, 1, 189, 230, 33, 207, + 36, 1, 198, 83, 230, 33, 207, 36, 1, 223, 62, 230, 33, 207, 36, 1, 247, + 19, 230, 33, 207, 36, 1, 144, 230, 33, 207, 36, 1, 221, 250, 230, 33, + 207, 36, 1, 233, 97, 230, 33, 207, 36, 1, 238, 0, 230, 33, 207, 36, 1, + 237, 161, 230, 33, 207, 36, 1, 167, 230, 33, 207, 36, 1, 207, 3, 230, 33, + 207, 36, 1, 192, 112, 230, 33, 207, 36, 1, 188, 230, 33, 207, 36, 1, 204, + 64, 230, 33, 207, 36, 1, 160, 230, 33, 207, 36, 1, 231, 233, 230, 33, + 207, 36, 1, 177, 230, 33, 207, 36, 1, 172, 230, 33, 207, 36, 1, 181, 230, + 33, 207, 36, 1, 194, 169, 230, 33, 207, 36, 1, 221, 175, 194, 169, 230, + 33, 207, 36, 1, 168, 230, 33, 207, 36, 1, 221, 175, 168, 230, 33, 207, + 36, 1, 214, 165, 230, 33, 207, 36, 1, 212, 201, 230, 33, 207, 36, 1, 196, + 157, 230, 33, 207, 36, 18, 64, 230, 33, 207, 36, 18, 70, 230, 33, 207, + 36, 18, 68, 230, 33, 207, 36, 18, 71, 230, 33, 207, 36, 18, 74, 230, 33, + 207, 36, 122, 206, 67, 230, 33, 207, 36, 122, 215, 97, 221, 216, 230, 33, + 207, 36, 3, 230, 27, 230, 33, 207, 36, 3, 200, 150, 230, 33, 207, 36, 3, + 200, 124, 230, 33, 207, 36, 3, 200, 106, 230, 33, 207, 36, 17, 192, 76, + 230, 33, 207, 36, 17, 101, 230, 33, 207, 36, 17, 104, 230, 33, 207, 36, + 17, 133, 230, 33, 207, 36, 17, 134, 230, 33, 207, 36, 17, 151, 230, 33, + 207, 36, 17, 170, 230, 33, 207, 36, 17, 179, 230, 33, 207, 36, 17, 174, + 230, 33, 207, 36, 17, 182, 206, 196, 17, 101, 206, 196, 17, 104, 206, + 196, 17, 133, 206, 196, 17, 134, 206, 196, 17, 151, 206, 196, 17, 170, + 206, 196, 17, 179, 206, 196, 17, 174, 206, 196, 17, 182, 206, 196, 31, + 200, 30, 206, 196, 31, 197, 239, 206, 196, 31, 199, 184, 206, 196, 31, + 232, 126, 206, 196, 31, 233, 3, 206, 196, 31, 203, 25, 206, 196, 31, 204, + 140, 206, 196, 31, 234, 137, 206, 196, 31, 214, 11, 206, 196, 31, 90, + 228, 162, 206, 196, 31, 103, 228, 162, 206, 196, 31, 112, 228, 162, 206, + 196, 31, 232, 119, 228, 162, 206, 196, 31, 232, 214, 228, 162, 206, 196, + 31, 203, 41, 228, 162, 206, 196, 31, 204, 146, 228, 162, 206, 196, 31, + 234, 148, 228, 162, 206, 196, 31, 214, 16, 228, 162, 206, 196, 232, 109, + 90, 230, 78, 206, 196, 232, 109, 90, 208, 167, 206, 196, 232, 109, 90, + 199, 191, 206, 196, 232, 109, 103, 199, 188, 193, 28, 1, 234, 108, 193, + 28, 1, 248, 123, 193, 28, 1, 210, 181, 193, 28, 1, 210, 80, 193, 28, 1, + 199, 224, 193, 28, 1, 205, 223, 193, 28, 1, 242, 136, 193, 28, 1, 242, + 203, 193, 28, 1, 242, 217, 193, 28, 1, 229, 187, 193, 28, 1, 193, 209, + 193, 28, 1, 237, 227, 193, 28, 1, 192, 101, 193, 28, 1, 167, 193, 28, 1, + 207, 156, 193, 28, 1, 192, 112, 193, 28, 1, 223, 62, 193, 28, 1, 203, 78, + 193, 28, 1, 203, 224, 193, 28, 1, 206, 86, 193, 28, 1, 237, 250, 193, 28, + 1, 189, 193, 28, 1, 192, 85, 193, 28, 1, 233, 172, 193, 28, 1, 193, 197, + 193, 28, 1, 233, 97, 193, 28, 1, 196, 157, 193, 28, 1, 196, 158, 250, + 249, 20, 193, 28, 1, 208, 232, 193, 28, 1, 222, 139, 193, 28, 1, 221, + 247, 193, 28, 1, 231, 220, 193, 28, 1, 220, 94, 193, 28, 1, 216, 122, + 193, 28, 1, 212, 230, 193, 28, 1, 197, 84, 193, 28, 1, 194, 119, 193, 28, + 1, 211, 106, 193, 28, 1, 233, 212, 193, 28, 1, 230, 6, 193, 28, 1, 192, + 229, 193, 28, 1, 233, 242, 193, 28, 38, 230, 67, 77, 193, 28, 38, 217, + 210, 77, 193, 28, 228, 109, 77, 193, 28, 1, 220, 95, 4, 78, 58, 193, 28, + 1, 192, 230, 4, 242, 122, 58, 40, 202, 194, 1, 251, 24, 40, 202, 194, 1, + 52, 251, 24, 40, 202, 194, 1, 248, 62, 40, 202, 194, 1, 52, 248, 62, 40, + 202, 194, 1, 231, 31, 40, 202, 194, 1, 229, 255, 40, 202, 194, 1, 52, + 229, 255, 40, 202, 194, 1, 194, 119, 40, 202, 194, 1, 192, 89, 40, 202, + 194, 1, 229, 194, 40, 202, 194, 1, 192, 238, 40, 202, 194, 1, 222, 109, + 40, 202, 194, 1, 220, 85, 40, 202, 194, 1, 217, 12, 40, 202, 194, 1, 212, + 230, 40, 202, 194, 1, 52, 212, 230, 40, 202, 194, 1, 52, 212, 231, 4, 84, + 200, 147, 40, 202, 194, 1, 206, 46, 40, 202, 194, 1, 249, 231, 40, 202, + 194, 1, 250, 249, 249, 231, 40, 202, 194, 1, 210, 181, 40, 202, 194, 1, + 206, 83, 40, 202, 194, 1, 52, 206, 83, 40, 202, 194, 1, 52, 206, 84, 4, + 84, 200, 147, 40, 202, 194, 1, 207, 186, 40, 202, 194, 1, 203, 224, 40, + 202, 194, 1, 200, 93, 40, 202, 194, 1, 52, 200, 93, 40, 202, 194, 1, 52, + 200, 94, 4, 84, 200, 147, 40, 202, 194, 31, 101, 40, 202, 194, 31, 104, + 40, 202, 194, 31, 133, 40, 202, 194, 31, 134, 40, 202, 194, 31, 151, 40, + 202, 194, 31, 200, 30, 40, 202, 194, 31, 197, 239, 40, 202, 194, 31, 199, + 184, 40, 202, 194, 31, 90, 228, 162, 40, 202, 194, 232, 109, 90, 230, 78, + 40, 202, 194, 34, 249, 230, 202, 194, 1, 251, 24, 202, 194, 1, 248, 62, + 202, 194, 1, 231, 31, 202, 194, 1, 229, 255, 202, 194, 1, 194, 119, 202, + 194, 1, 192, 89, 202, 194, 1, 229, 194, 202, 194, 1, 192, 238, 202, 194, + 1, 222, 109, 202, 194, 1, 220, 85, 202, 194, 1, 217, 12, 202, 194, 1, + 212, 230, 202, 194, 1, 206, 46, 202, 194, 1, 249, 231, 202, 194, 1, 210, + 181, 202, 194, 1, 206, 83, 202, 194, 1, 207, 187, 202, 194, 1, 203, 224, + 202, 194, 1, 200, 93, 202, 194, 1, 233, 18, 202, 194, 1, 219, 242, 202, + 194, 223, 177, 203, 224, 202, 194, 38, 78, 63, 202, 194, 38, 103, 236, + 112, 63, 202, 194, 38, 78, 58, 202, 194, 38, 103, 236, 112, 58, 202, 194, + 38, 238, 132, 58, 202, 194, 38, 238, 132, 63, 202, 194, 38, 229, 15, 58, + 202, 194, 38, 229, 15, 63, 202, 194, 38, 184, 229, 15, 63, 202, 194, 38, + 207, 189, 63, 202, 194, 38, 201, 208, 63, 202, 194, 31, 101, 202, 194, + 31, 200, 30, 202, 194, 31, 197, 239, 202, 194, 31, 90, 228, 162, 202, + 194, 209, 38, 103, 84, 248, 182, 202, 194, 209, 38, 103, 84, 248, 183, 4, + 236, 111, 202, 194, 209, 38, 242, 131, 4, 236, 114, 202, 194, 209, 38, + 103, 242, 128, 4, 236, 111, 202, 194, 209, 38, 138, 242, 131, 4, 236, + 114, 242, 181, 1, 251, 24, 242, 181, 1, 2, 251, 24, 242, 181, 1, 248, 62, + 242, 181, 1, 231, 31, 242, 181, 1, 237, 220, 242, 181, 1, 229, 255, 242, + 181, 1, 194, 119, 242, 181, 1, 238, 141, 194, 119, 242, 181, 1, 192, 89, + 242, 181, 1, 229, 194, 242, 181, 1, 192, 238, 242, 181, 1, 222, 109, 242, + 181, 1, 220, 85, 242, 181, 1, 217, 12, 242, 181, 1, 212, 230, 242, 181, + 1, 206, 46, 242, 181, 1, 249, 231, 242, 181, 1, 210, 181, 242, 181, 1, + 207, 188, 242, 181, 1, 203, 224, 242, 181, 1, 200, 93, 242, 181, 31, 101, + 242, 181, 31, 104, 242, 181, 31, 133, 242, 181, 31, 134, 242, 181, 31, + 200, 30, 242, 181, 31, 197, 239, 242, 181, 31, 90, 228, 162, 234, 101, 1, + 251, 24, 234, 101, 1, 248, 62, 234, 101, 1, 231, 31, 234, 101, 1, 237, + 220, 234, 101, 1, 229, 255, 234, 101, 1, 194, 119, 234, 101, 1, 192, 89, + 234, 101, 1, 229, 194, 234, 101, 1, 200, 4, 234, 101, 1, 192, 238, 234, + 101, 1, 222, 109, 234, 101, 1, 220, 85, 234, 101, 1, 217, 12, 234, 101, + 1, 212, 230, 234, 101, 1, 206, 46, 234, 101, 1, 249, 231, 234, 101, 1, + 210, 181, 234, 101, 1, 206, 83, 234, 101, 1, 208, 181, 234, 101, 1, 207, + 188, 234, 101, 1, 203, 224, 234, 101, 1, 200, 93, 234, 101, 34, 192, 88, + 164, 3, 246, 234, 164, 3, 250, 168, 164, 3, 196, 6, 164, 3, 223, 13, 164, + 3, 197, 39, 164, 1, 64, 164, 1, 252, 33, 164, 1, 70, 164, 1, 223, 224, + 164, 1, 68, 164, 1, 196, 251, 164, 1, 118, 150, 164, 1, 118, 207, 4, 164, + 1, 118, 165, 164, 1, 118, 219, 138, 164, 1, 71, 164, 1, 251, 63, 164, 1, + 74, 164, 1, 250, 8, 164, 1, 160, 164, 1, 221, 250, 164, 1, 231, 233, 164, + 1, 231, 84, 164, 1, 214, 165, 164, 1, 247, 19, 164, 1, 246, 117, 164, 1, + 223, 62, 164, 1, 223, 28, 164, 1, 212, 201, 164, 1, 198, 83, 164, 1, 198, + 71, 164, 1, 237, 161, 164, 1, 237, 145, 164, 1, 213, 178, 164, 1, 189, + 164, 1, 199, 240, 164, 1, 238, 0, 164, 1, 237, 40, 164, 1, 181, 164, 1, + 166, 164, 1, 210, 94, 164, 1, 249, 3, 164, 1, 248, 54, 164, 1, 172, 164, + 1, 168, 164, 1, 167, 164, 1, 177, 164, 1, 196, 157, 164, 1, 204, 64, 164, + 1, 202, 92, 164, 1, 188, 164, 1, 144, 164, 1, 219, 137, 164, 1, 40, 44, + 219, 126, 164, 1, 40, 44, 207, 3, 164, 1, 40, 44, 213, 160, 164, 18, 3, + 252, 33, 164, 18, 3, 248, 50, 252, 33, 164, 18, 3, 70, 164, 18, 3, 223, + 224, 164, 18, 3, 68, 164, 18, 3, 196, 251, 164, 18, 3, 118, 150, 164, 18, + 3, 118, 207, 4, 164, 18, 3, 118, 165, 164, 18, 3, 118, 219, 138, 164, 18, + 3, 71, 164, 18, 3, 251, 63, 164, 18, 3, 74, 164, 18, 3, 250, 8, 164, 196, + 11, 164, 237, 208, 164, 55, 237, 208, 164, 209, 38, 236, 114, 164, 209, + 38, 55, 236, 114, 164, 209, 38, 219, 175, 164, 209, 38, 238, 194, 161, + 164, 209, 38, 219, 57, 164, 31, 101, 164, 31, 104, 164, 31, 133, 164, 31, + 134, 164, 31, 151, 164, 31, 170, 164, 31, 179, 164, 31, 174, 164, 31, + 182, 164, 31, 200, 30, 164, 31, 197, 239, 164, 31, 199, 184, 164, 31, + 232, 126, 164, 31, 233, 3, 164, 31, 203, 25, 164, 31, 204, 140, 164, 31, + 234, 137, 164, 31, 214, 11, 164, 31, 90, 228, 162, 164, 31, 90, 180, 164, + 17, 192, 76, 164, 17, 101, 164, 17, 104, 164, 17, 133, 164, 17, 134, 164, + 17, 151, 164, 17, 170, 164, 17, 179, 164, 17, 174, 164, 17, 182, 164, 31, + 222, 228, 222, 132, 3, 246, 234, 222, 132, 3, 250, 168, 222, 132, 3, 196, + 6, 222, 132, 1, 64, 222, 132, 1, 252, 33, 222, 132, 1, 70, 222, 132, 1, + 223, 224, 222, 132, 1, 68, 222, 132, 1, 196, 251, 222, 132, 1, 71, 222, + 132, 1, 251, 63, 222, 132, 1, 74, 222, 132, 1, 250, 8, 222, 132, 1, 160, + 222, 132, 1, 221, 250, 222, 132, 1, 231, 233, 222, 132, 1, 231, 84, 222, + 132, 1, 214, 165, 222, 132, 1, 247, 19, 222, 132, 1, 246, 117, 222, 132, + 1, 223, 62, 222, 132, 1, 223, 28, 222, 132, 1, 212, 201, 222, 132, 1, + 198, 83, 222, 132, 1, 198, 71, 222, 132, 1, 237, 161, 222, 132, 1, 237, + 150, 222, 132, 1, 237, 145, 222, 132, 1, 207, 156, 222, 132, 1, 213, 178, + 222, 132, 1, 189, 222, 132, 1, 199, 240, 222, 132, 1, 238, 0, 222, 132, + 1, 237, 40, 222, 132, 1, 181, 222, 132, 1, 166, 222, 132, 1, 210, 94, + 222, 132, 1, 249, 3, 222, 132, 1, 248, 54, 222, 132, 1, 172, 222, 132, 1, + 168, 222, 132, 1, 167, 222, 132, 1, 177, 222, 132, 1, 196, 157, 222, 132, + 1, 204, 64, 222, 132, 1, 202, 92, 222, 132, 1, 188, 222, 132, 1, 144, + 222, 132, 18, 3, 252, 33, 222, 132, 18, 3, 70, 222, 132, 18, 3, 223, 224, + 222, 132, 18, 3, 68, 222, 132, 18, 3, 196, 251, 222, 132, 18, 3, 71, 222, + 132, 18, 3, 251, 63, 222, 132, 18, 3, 74, 222, 132, 18, 3, 250, 8, 222, + 132, 3, 196, 11, 222, 132, 3, 212, 241, 222, 132, 251, 151, 57, 222, 132, + 234, 54, 57, 222, 132, 31, 57, 222, 132, 205, 209, 77, 222, 132, 55, 205, + 209, 77, 222, 132, 237, 208, 222, 132, 55, 237, 208, 222, 132, 31, 3, 58, + 202, 179, 202, 187, 1, 206, 76, 202, 179, 202, 187, 1, 200, 151, 202, + 179, 202, 187, 1, 248, 229, 202, 179, 202, 187, 1, 247, 8, 202, 179, 202, + 187, 1, 237, 236, 202, 179, 202, 187, 1, 231, 218, 202, 179, 202, 187, 1, + 217, 188, 202, 179, 202, 187, 1, 214, 162, 202, 179, 202, 187, 1, 220, + 158, 202, 179, 202, 187, 1, 215, 71, 202, 179, 202, 187, 1, 196, 153, + 202, 179, 202, 187, 1, 211, 57, 202, 179, 202, 187, 1, 193, 110, 202, + 179, 202, 187, 1, 208, 50, 202, 179, 202, 187, 1, 230, 89, 202, 179, 202, + 187, 1, 222, 137, 202, 179, 202, 187, 1, 223, 56, 202, 179, 202, 187, 1, + 212, 198, 202, 179, 202, 187, 1, 251, 72, 202, 179, 202, 187, 1, 234, + 169, 202, 179, 202, 187, 1, 223, 225, 202, 179, 202, 187, 1, 197, 97, + 202, 179, 202, 187, 1, 211, 241, 202, 179, 202, 187, 1, 234, 157, 202, + 179, 202, 187, 1, 217, 204, 202, 179, 202, 187, 17, 192, 76, 202, 179, + 202, 187, 17, 101, 202, 179, 202, 187, 17, 104, 202, 179, 202, 187, 17, + 133, 202, 179, 202, 187, 17, 134, 202, 179, 202, 187, 17, 151, 202, 179, + 202, 187, 17, 170, 202, 179, 202, 187, 17, 179, 202, 179, 202, 187, 17, + 174, 202, 179, 202, 187, 17, 182, 246, 111, 3, 246, 234, 246, 111, 3, + 250, 168, 246, 111, 3, 196, 6, 246, 111, 1, 252, 33, 246, 111, 1, 70, + 246, 111, 1, 68, 246, 111, 1, 71, 246, 111, 1, 222, 159, 246, 111, 1, + 221, 249, 246, 111, 1, 231, 230, 246, 111, 1, 231, 83, 246, 111, 1, 214, + 164, 246, 111, 1, 247, 18, 246, 111, 1, 246, 116, 246, 111, 1, 223, 61, + 246, 111, 1, 223, 27, 246, 111, 1, 212, 200, 246, 111, 1, 198, 82, 246, + 111, 1, 198, 70, 246, 111, 1, 237, 160, 246, 111, 1, 237, 144, 246, 111, + 1, 213, 177, 246, 111, 1, 200, 174, 246, 111, 1, 199, 239, 246, 111, 1, + 237, 255, 246, 111, 1, 237, 39, 246, 111, 1, 215, 84, 246, 111, 1, 211, + 77, 246, 111, 1, 210, 93, 246, 111, 1, 249, 1, 246, 111, 1, 248, 53, 246, + 111, 1, 217, 219, 246, 111, 1, 192, 163, 246, 111, 1, 193, 129, 246, 111, + 1, 208, 68, 246, 111, 1, 220, 184, 246, 111, 1, 194, 163, 246, 111, 1, + 206, 91, 246, 111, 1, 230, 99, 246, 111, 18, 3, 64, 246, 111, 18, 3, 70, + 246, 111, 18, 3, 223, 224, 246, 111, 18, 3, 68, 246, 111, 18, 3, 196, + 251, 246, 111, 18, 3, 71, 246, 111, 18, 3, 251, 63, 246, 111, 18, 3, 74, + 246, 111, 18, 3, 250, 8, 246, 111, 18, 3, 211, 238, 246, 111, 185, 77, + 246, 111, 250, 9, 77, 246, 111, 196, 11, 246, 111, 217, 217, 246, 111, + 17, 192, 76, 246, 111, 17, 101, 246, 111, 17, 104, 246, 111, 17, 133, + 246, 111, 17, 134, 246, 111, 17, 151, 246, 111, 17, 170, 246, 111, 17, + 179, 246, 111, 17, 174, 246, 111, 17, 182, 246, 111, 205, 209, 77, 246, + 111, 237, 208, 246, 111, 55, 237, 208, 246, 111, 208, 159, 77, 246, 111, + 1, 219, 221, 246, 111, 18, 3, 252, 33, 246, 111, 18, 3, 234, 150, 246, + 111, 1, 196, 156, 217, 186, 1, 64, 217, 186, 1, 70, 217, 186, 1, 68, 217, + 186, 1, 71, 217, 186, 1, 74, 217, 186, 1, 160, 217, 186, 1, 221, 250, + 217, 186, 1, 231, 233, 217, 186, 1, 231, 84, 217, 186, 1, 247, 19, 217, + 186, 1, 246, 117, 217, 186, 1, 223, 62, 217, 186, 1, 223, 28, 217, 186, + 1, 212, 201, 217, 186, 1, 198, 83, 217, 186, 1, 198, 71, 217, 186, 1, + 237, 161, 217, 186, 1, 237, 145, 217, 186, 1, 213, 178, 217, 186, 1, 189, + 217, 186, 1, 199, 240, 217, 186, 1, 238, 0, 217, 186, 1, 237, 40, 217, + 186, 1, 181, 217, 186, 1, 166, 217, 186, 1, 210, 94, 217, 186, 1, 249, 3, + 217, 186, 1, 248, 54, 217, 186, 1, 172, 217, 186, 1, 167, 217, 186, 1, + 177, 217, 186, 1, 196, 157, 217, 186, 1, 188, 217, 186, 1, 144, 217, 186, + 1, 207, 3, 217, 186, 3, 212, 241, 217, 186, 251, 151, 57, 217, 186, 205, + 209, 77, 217, 186, 34, 203, 172, 204, 28, 3, 246, 234, 204, 28, 3, 250, + 168, 204, 28, 3, 196, 6, 204, 28, 1, 64, 204, 28, 1, 252, 33, 204, 28, 1, + 70, 204, 28, 1, 223, 224, 204, 28, 1, 68, 204, 28, 1, 196, 251, 204, 28, + 1, 118, 150, 204, 28, 1, 118, 207, 4, 204, 28, 1, 118, 165, 204, 28, 1, + 118, 219, 138, 204, 28, 1, 71, 204, 28, 1, 251, 63, 204, 28, 1, 74, 204, + 28, 1, 250, 8, 204, 28, 1, 160, 204, 28, 1, 221, 250, 204, 28, 1, 231, + 233, 204, 28, 1, 231, 84, 204, 28, 1, 214, 165, 204, 28, 1, 247, 19, 204, + 28, 1, 246, 117, 204, 28, 1, 223, 62, 204, 28, 1, 223, 28, 204, 28, 1, + 212, 201, 204, 28, 1, 198, 83, 204, 28, 1, 198, 71, 204, 28, 1, 237, 161, + 204, 28, 1, 237, 145, 204, 28, 1, 213, 178, 204, 28, 1, 189, 204, 28, 1, + 199, 240, 204, 28, 1, 238, 0, 204, 28, 1, 237, 40, 204, 28, 1, 181, 204, + 28, 1, 166, 204, 28, 1, 210, 94, 204, 28, 1, 249, 3, 204, 28, 1, 248, 54, + 204, 28, 1, 172, 204, 28, 1, 168, 204, 28, 1, 167, 204, 28, 1, 177, 204, + 28, 1, 219, 137, 204, 28, 1, 196, 157, 204, 28, 1, 204, 64, 204, 28, 1, + 202, 92, 204, 28, 1, 188, 204, 28, 1, 144, 204, 28, 18, 3, 252, 33, 204, + 28, 18, 3, 70, 204, 28, 18, 3, 223, 224, 204, 28, 18, 3, 68, 204, 28, 18, + 3, 196, 251, 204, 28, 18, 3, 118, 150, 204, 28, 18, 3, 118, 207, 4, 204, + 28, 18, 3, 118, 165, 204, 28, 18, 3, 118, 219, 138, 204, 28, 18, 3, 71, + 204, 28, 18, 3, 251, 63, 204, 28, 18, 3, 74, 204, 28, 18, 3, 250, 8, 204, + 28, 3, 196, 11, 204, 28, 3, 249, 246, 204, 28, 3, 223, 13, 204, 28, 3, + 197, 39, 204, 28, 211, 219, 204, 28, 237, 208, 204, 28, 55, 237, 208, + 204, 28, 251, 151, 57, 204, 28, 204, 165, 204, 28, 206, 36, 77, 204, 28, + 3, 212, 241, 204, 28, 18, 73, 77, 204, 28, 233, 189, 203, 195, 18, 77, + 204, 28, 201, 87, 77, 204, 28, 18, 3, 209, 91, 71, 204, 28, 3, 223, 121, + 246, 234, 204, 28, 17, 192, 76, 204, 28, 17, 101, 204, 28, 17, 104, 204, + 28, 17, 133, 204, 28, 17, 134, 204, 28, 17, 151, 204, 28, 17, 170, 204, + 28, 17, 179, 204, 28, 17, 174, 204, 28, 17, 182, 204, 28, 234, 130, 204, + 28, 3, 203, 113, 204, 28, 229, 237, 204, 28, 238, 250, 57, 204, 28, 205, + 209, 217, 126, 204, 28, 205, 209, 217, 125, 159, 250, 112, 17, 101, 159, + 250, 112, 17, 104, 159, 250, 112, 17, 133, 159, 250, 112, 17, 134, 159, + 250, 112, 17, 151, 159, 250, 112, 17, 170, 159, 250, 112, 17, 179, 159, + 250, 112, 17, 174, 159, 250, 112, 17, 182, 159, 250, 112, 31, 200, 30, + 159, 250, 112, 31, 197, 239, 159, 250, 112, 31, 199, 184, 159, 250, 112, + 31, 232, 126, 159, 250, 112, 31, 233, 3, 159, 250, 112, 31, 203, 25, 159, + 250, 112, 31, 204, 140, 159, 250, 112, 31, 234, 137, 159, 250, 112, 31, + 214, 11, 159, 250, 112, 31, 90, 228, 162, 159, 250, 112, 31, 90, 180, + 221, 219, 1, 64, 221, 219, 1, 252, 33, 221, 219, 1, 70, 221, 219, 1, 68, + 221, 219, 1, 71, 221, 219, 1, 251, 63, 221, 219, 1, 74, 221, 219, 1, 250, + 8, 221, 219, 1, 160, 221, 219, 1, 221, 250, 221, 219, 1, 231, 233, 221, + 219, 1, 231, 120, 221, 219, 1, 231, 84, 221, 219, 1, 214, 165, 221, 219, + 1, 247, 19, 221, 219, 1, 246, 117, 221, 219, 1, 223, 62, 221, 219, 1, + 223, 6, 221, 219, 1, 212, 201, 221, 219, 1, 198, 83, 221, 219, 1, 198, + 71, 221, 219, 1, 237, 161, 221, 219, 1, 237, 145, 221, 219, 1, 213, 178, + 221, 219, 1, 189, 221, 219, 1, 199, 240, 221, 219, 1, 238, 0, 221, 219, + 1, 237, 151, 221, 219, 1, 237, 40, 221, 219, 1, 181, 221, 219, 1, 166, + 221, 219, 1, 210, 94, 221, 219, 1, 249, 3, 221, 219, 1, 248, 159, 221, + 219, 1, 248, 54, 221, 219, 1, 172, 221, 219, 1, 168, 221, 219, 1, 167, + 221, 219, 1, 177, 221, 219, 1, 196, 157, 221, 219, 1, 188, 221, 219, 1, + 144, 221, 219, 1, 219, 137, 221, 219, 18, 3, 252, 33, 221, 219, 18, 3, + 70, 221, 219, 18, 3, 223, 224, 221, 219, 18, 3, 68, 221, 219, 18, 3, 71, + 221, 219, 18, 3, 251, 63, 221, 219, 18, 3, 74, 221, 219, 18, 3, 250, 8, + 221, 219, 3, 250, 168, 221, 219, 3, 196, 11, 221, 219, 3, 212, 241, 221, + 219, 3, 204, 54, 221, 219, 237, 208, 221, 219, 55, 237, 208, 221, 219, + 194, 11, 204, 165, 221, 219, 205, 209, 77, 221, 219, 55, 205, 209, 77, + 221, 219, 251, 151, 57, 221, 219, 3, 201, 131, 215, 220, 1, 64, 215, 220, + 1, 70, 215, 220, 1, 68, 215, 220, 1, 71, 215, 220, 1, 160, 215, 220, 1, + 221, 250, 215, 220, 1, 231, 233, 215, 220, 1, 231, 84, 215, 220, 1, 247, + 19, 215, 220, 1, 246, 117, 215, 220, 1, 223, 62, 215, 220, 1, 223, 6, + 215, 220, 1, 212, 201, 215, 220, 1, 198, 83, 215, 220, 1, 198, 71, 215, + 220, 1, 237, 161, 215, 220, 1, 237, 151, 215, 220, 1, 237, 145, 215, 220, + 1, 213, 178, 215, 220, 1, 189, 215, 220, 1, 199, 240, 215, 220, 1, 238, + 0, 215, 220, 1, 237, 40, 215, 220, 1, 181, 215, 220, 1, 166, 215, 220, 1, + 210, 94, 215, 220, 1, 249, 3, 215, 220, 1, 248, 54, 215, 220, 1, 172, + 215, 220, 1, 168, 215, 220, 1, 167, 215, 220, 1, 177, 215, 220, 1, 196, + 157, 215, 220, 1, 188, 215, 220, 1, 144, 215, 220, 1, 207, 3, 215, 220, + 1, 207, 156, 215, 220, 205, 209, 77, 221, 210, 1, 64, 221, 210, 1, 252, + 33, 221, 210, 1, 70, 221, 210, 1, 223, 224, 221, 210, 1, 68, 221, 210, 1, + 196, 251, 221, 210, 1, 71, 221, 210, 1, 251, 63, 221, 210, 1, 74, 221, + 210, 1, 250, 8, 221, 210, 1, 160, 221, 210, 1, 221, 250, 221, 210, 1, + 231, 233, 221, 210, 1, 231, 120, 221, 210, 1, 231, 84, 221, 210, 1, 214, + 165, 221, 210, 1, 247, 19, 221, 210, 1, 246, 117, 221, 210, 1, 223, 62, + 221, 210, 1, 223, 6, 221, 210, 1, 223, 28, 221, 210, 1, 212, 201, 221, + 210, 1, 198, 83, 221, 210, 1, 198, 71, 221, 210, 1, 237, 161, 221, 210, + 1, 237, 151, 221, 210, 1, 207, 3, 221, 210, 1, 237, 145, 221, 210, 1, + 213, 178, 221, 210, 1, 189, 221, 210, 1, 199, 240, 221, 210, 1, 238, 0, + 221, 210, 1, 237, 40, 221, 210, 1, 181, 221, 210, 1, 166, 221, 210, 1, + 210, 94, 221, 210, 1, 249, 3, 221, 210, 1, 248, 159, 221, 210, 1, 248, + 54, 221, 210, 1, 172, 221, 210, 1, 168, 221, 210, 1, 167, 221, 210, 1, + 177, 221, 210, 1, 196, 157, 221, 210, 1, 204, 64, 221, 210, 1, 188, 221, + 210, 1, 144, 221, 210, 3, 250, 168, 221, 210, 18, 3, 252, 33, 221, 210, + 18, 3, 70, 221, 210, 18, 3, 223, 224, 221, 210, 18, 3, 68, 221, 210, 18, + 3, 196, 251, 221, 210, 18, 3, 71, 221, 210, 18, 3, 251, 63, 221, 210, 18, + 3, 74, 221, 210, 18, 3, 250, 8, 221, 210, 3, 212, 241, 221, 210, 3, 196, + 11, 221, 210, 17, 192, 76, 221, 210, 17, 101, 221, 210, 17, 104, 221, + 210, 17, 133, 221, 210, 17, 134, 221, 210, 17, 151, 221, 210, 17, 170, + 221, 210, 17, 179, 221, 210, 17, 174, 221, 210, 17, 182, 230, 219, 3, 38, + 250, 169, 58, 230, 219, 3, 246, 234, 230, 219, 3, 250, 168, 230, 219, 3, + 196, 6, 230, 219, 1, 64, 230, 219, 1, 252, 33, 230, 219, 1, 70, 230, 219, + 1, 223, 224, 230, 219, 1, 68, 230, 219, 1, 196, 251, 230, 219, 1, 118, + 150, 230, 219, 1, 118, 165, 230, 219, 1, 234, 171, 230, 219, 1, 251, 63, + 230, 219, 1, 211, 194, 230, 219, 1, 250, 8, 230, 219, 1, 160, 230, 219, + 1, 221, 250, 230, 219, 1, 231, 233, 230, 219, 1, 231, 84, 230, 219, 1, + 214, 165, 230, 219, 1, 247, 19, 230, 219, 1, 246, 117, 230, 219, 1, 223, + 62, 230, 219, 1, 223, 28, 230, 219, 1, 212, 201, 230, 219, 1, 198, 83, + 230, 219, 1, 198, 71, 230, 219, 1, 237, 161, 230, 219, 1, 237, 145, 230, + 219, 1, 213, 178, 230, 219, 1, 189, 230, 219, 1, 199, 240, 230, 219, 1, + 238, 0, 230, 219, 1, 237, 40, 230, 219, 1, 181, 230, 219, 1, 166, 230, + 219, 1, 210, 94, 230, 219, 1, 249, 3, 230, 219, 1, 248, 54, 230, 219, 1, + 172, 230, 219, 1, 168, 230, 219, 1, 167, 230, 219, 1, 177, 230, 219, 1, + 219, 137, 230, 219, 1, 196, 157, 230, 219, 1, 204, 64, 230, 219, 1, 202, + 92, 230, 219, 1, 188, 230, 219, 1, 144, 38, 248, 18, 63, 230, 219, 3, + 212, 241, 230, 219, 3, 249, 246, 230, 219, 18, 3, 252, 33, 230, 219, 18, + 3, 70, 230, 219, 18, 3, 223, 224, 230, 219, 18, 3, 68, 230, 219, 18, 3, + 196, 251, 230, 219, 18, 3, 118, 150, 230, 219, 18, 3, 118, 207, 4, 230, + 219, 18, 3, 234, 171, 230, 219, 18, 3, 251, 63, 230, 219, 18, 3, 211, + 194, 230, 219, 18, 3, 250, 8, 230, 219, 3, 196, 11, 230, 219, 211, 219, + 230, 219, 250, 9, 220, 2, 77, 230, 219, 3, 209, 204, 230, 219, 1, 196, + 120, 250, 168, 230, 219, 1, 196, 120, 55, 250, 168, 230, 219, 1, 118, + 207, 4, 230, 219, 1, 118, 219, 138, 230, 219, 18, 3, 118, 165, 230, 219, + 18, 3, 118, 219, 138, 38, 230, 219, 17, 192, 76, 38, 230, 219, 17, 101, + 38, 230, 219, 17, 104, 38, 230, 219, 17, 133, 38, 230, 219, 17, 134, 38, + 230, 219, 17, 151, 38, 230, 219, 17, 170, 38, 230, 219, 1, 64, 38, 230, + 219, 1, 160, 38, 230, 219, 1, 181, 38, 230, 219, 1, 196, 39, 38, 230, + 219, 1, 166, 214, 175, 1, 64, 214, 175, 1, 252, 33, 214, 175, 1, 70, 214, + 175, 1, 223, 224, 214, 175, 1, 68, 214, 175, 1, 196, 251, 214, 175, 1, + 118, 150, 214, 175, 1, 118, 207, 4, 214, 175, 1, 118, 165, 214, 175, 1, + 118, 219, 138, 214, 175, 1, 71, 214, 175, 1, 251, 63, 214, 175, 1, 74, + 214, 175, 1, 250, 8, 214, 175, 1, 160, 214, 175, 1, 221, 250, 214, 175, + 1, 231, 233, 214, 175, 1, 231, 84, 214, 175, 1, 214, 165, 214, 175, 1, + 214, 114, 214, 175, 1, 247, 19, 214, 175, 1, 246, 117, 214, 175, 1, 223, + 62, 214, 175, 1, 223, 28, 214, 175, 1, 212, 201, 214, 175, 1, 212, 183, + 214, 175, 1, 198, 83, 214, 175, 1, 198, 71, 214, 175, 1, 237, 161, 214, + 175, 1, 237, 145, 214, 175, 1, 213, 178, 214, 175, 1, 189, 214, 175, 1, + 199, 240, 214, 175, 1, 238, 0, 214, 175, 1, 237, 40, 214, 175, 1, 181, + 214, 175, 1, 214, 65, 214, 175, 1, 166, 214, 175, 1, 210, 94, 214, 175, + 1, 249, 3, 214, 175, 1, 248, 54, 214, 175, 1, 172, 214, 175, 1, 216, 178, + 214, 175, 1, 168, 214, 175, 1, 167, 214, 175, 1, 207, 156, 214, 175, 1, + 177, 214, 175, 1, 219, 222, 214, 175, 1, 194, 169, 214, 175, 1, 204, 64, + 214, 175, 1, 202, 92, 214, 175, 1, 188, 214, 175, 1, 144, 214, 175, 18, + 3, 252, 33, 214, 175, 18, 3, 70, 214, 175, 18, 3, 223, 224, 214, 175, 18, + 3, 68, 214, 175, 18, 3, 196, 251, 214, 175, 18, 3, 118, 150, 214, 175, + 18, 3, 118, 207, 4, 214, 175, 18, 3, 118, 165, 214, 175, 18, 3, 118, 219, + 138, 214, 175, 18, 3, 71, 214, 175, 18, 3, 251, 63, 214, 175, 18, 3, 74, + 214, 175, 18, 3, 250, 8, 214, 175, 3, 196, 11, 214, 175, 3, 246, 234, + 214, 175, 3, 250, 168, 214, 175, 3, 196, 6, 214, 175, 3, 212, 241, 214, + 175, 3, 249, 246, 214, 175, 3, 52, 250, 168, 214, 175, 211, 219, 214, + 175, 203, 112, 214, 175, 237, 208, 214, 175, 55, 237, 208, 214, 175, 242, + 38, 214, 175, 231, 197, 232, 247, 214, 175, 251, 151, 57, 214, 175, 17, + 192, 76, 214, 175, 17, 101, 214, 175, 17, 104, 214, 175, 17, 133, 214, + 175, 17, 134, 214, 175, 17, 151, 214, 175, 17, 170, 214, 175, 17, 179, + 214, 175, 17, 174, 214, 175, 17, 182, 214, 175, 55, 242, 38, 214, 175, + 209, 231, 77, 214, 175, 223, 147, 57, 214, 175, 206, 36, 77, 214, 175, 1, + 196, 120, 250, 168, 214, 175, 3, 223, 13, 214, 175, 3, 197, 39, 199, 67, + 250, 197, 199, 67, 1, 64, 199, 67, 1, 252, 33, 199, 67, 1, 70, 199, 67, + 1, 223, 224, 199, 67, 1, 68, 199, 67, 1, 196, 251, 199, 67, 1, 118, 150, + 199, 67, 1, 118, 207, 4, 199, 67, 1, 118, 165, 199, 67, 1, 118, 219, 138, + 199, 67, 1, 71, 199, 67, 1, 251, 63, 199, 67, 1, 74, 199, 67, 1, 250, 8, + 199, 67, 1, 160, 199, 67, 1, 221, 250, 199, 67, 1, 231, 233, 199, 67, 1, + 231, 84, 199, 67, 1, 214, 165, 199, 67, 1, 247, 19, 199, 67, 1, 246, 117, + 199, 67, 1, 223, 62, 199, 67, 1, 223, 28, 199, 67, 1, 212, 201, 199, 67, + 1, 198, 83, 199, 67, 1, 198, 71, 199, 67, 1, 237, 161, 199, 67, 1, 237, + 145, 199, 67, 1, 213, 178, 199, 67, 1, 189, 199, 67, 1, 199, 240, 199, + 67, 1, 238, 0, 199, 67, 1, 237, 40, 199, 67, 1, 181, 199, 67, 1, 166, + 199, 67, 1, 210, 94, 199, 67, 1, 249, 3, 199, 67, 1, 248, 54, 199, 67, 1, + 172, 199, 67, 1, 168, 199, 67, 1, 167, 199, 67, 1, 177, 199, 67, 1, 196, + 157, 199, 67, 1, 204, 64, 199, 67, 1, 202, 92, 199, 67, 1, 188, 199, 67, + 1, 144, 199, 67, 18, 3, 252, 33, 199, 67, 18, 3, 70, 199, 67, 18, 3, 223, + 224, 199, 67, 18, 3, 68, 199, 67, 18, 3, 196, 251, 199, 67, 18, 3, 118, + 150, 199, 67, 18, 3, 118, 207, 4, 199, 67, 18, 3, 118, 165, 199, 67, 18, + 3, 118, 219, 138, 199, 67, 18, 3, 71, 199, 67, 18, 3, 203, 195, 71, 199, + 67, 18, 3, 251, 63, 199, 67, 18, 3, 74, 199, 67, 18, 3, 203, 195, 74, + 199, 67, 18, 3, 250, 8, 199, 67, 3, 246, 234, 199, 67, 3, 250, 168, 199, + 67, 3, 196, 6, 199, 67, 3, 196, 11, 199, 67, 3, 212, 241, 199, 67, 3, + 249, 246, 199, 67, 230, 145, 199, 67, 251, 151, 57, 199, 67, 211, 219, + 199, 67, 17, 192, 76, 199, 67, 17, 101, 199, 67, 17, 104, 199, 67, 17, + 133, 199, 67, 17, 134, 199, 67, 17, 151, 199, 67, 17, 170, 199, 67, 17, + 179, 199, 67, 17, 174, 199, 67, 17, 182, 203, 114, 1, 64, 203, 114, 1, + 252, 33, 203, 114, 1, 70, 203, 114, 1, 223, 224, 203, 114, 1, 68, 203, + 114, 1, 196, 251, 203, 114, 1, 118, 150, 203, 114, 1, 118, 207, 4, 203, + 114, 1, 118, 165, 203, 114, 1, 118, 219, 138, 203, 114, 1, 71, 203, 114, + 1, 251, 63, 203, 114, 1, 74, 203, 114, 1, 250, 8, 203, 114, 1, 160, 203, + 114, 1, 221, 250, 203, 114, 1, 231, 233, 203, 114, 1, 231, 84, 203, 114, + 1, 214, 165, 203, 114, 1, 247, 19, 203, 114, 1, 246, 117, 203, 114, 1, + 223, 62, 203, 114, 1, 223, 28, 203, 114, 1, 212, 201, 203, 114, 1, 198, + 83, 203, 114, 1, 198, 71, 203, 114, 1, 237, 161, 203, 114, 1, 237, 145, + 203, 114, 1, 213, 178, 203, 114, 1, 189, 203, 114, 1, 199, 240, 203, 114, + 1, 238, 0, 203, 114, 1, 237, 40, 203, 114, 1, 181, 203, 114, 1, 166, 203, + 114, 1, 210, 94, 203, 114, 1, 249, 3, 203, 114, 1, 248, 54, 203, 114, 1, + 172, 203, 114, 1, 168, 203, 114, 1, 167, 203, 114, 1, 177, 203, 114, 1, + 196, 157, 203, 114, 1, 204, 64, 203, 114, 1, 202, 92, 203, 114, 1, 188, + 203, 114, 1, 144, 203, 114, 18, 3, 252, 33, 203, 114, 18, 3, 70, 203, + 114, 18, 3, 223, 224, 203, 114, 18, 3, 68, 203, 114, 18, 3, 196, 251, + 203, 114, 18, 3, 118, 150, 203, 114, 18, 3, 118, 207, 4, 203, 114, 18, 3, + 71, 203, 114, 18, 3, 251, 63, 203, 114, 18, 3, 74, 203, 114, 18, 3, 250, + 8, 203, 114, 3, 246, 234, 203, 114, 3, 250, 168, 203, 114, 3, 196, 6, + 203, 114, 3, 196, 11, 203, 114, 3, 212, 241, 203, 114, 3, 203, 113, 203, + 114, 237, 208, 203, 114, 55, 237, 208, 203, 114, 204, 166, 236, 114, 203, + 114, 204, 166, 161, 203, 114, 207, 196, 217, 126, 203, 114, 207, 196, + 217, 125, 203, 114, 207, 196, 217, 124, 203, 114, 234, 80, 80, 199, 245, + 77, 203, 114, 205, 209, 122, 4, 198, 180, 26, 197, 172, 211, 149, 203, + 114, 205, 209, 122, 4, 198, 180, 26, 235, 111, 238, 192, 203, 114, 205, + 209, 122, 4, 208, 13, 26, 235, 111, 238, 192, 203, 114, 205, 209, 122, 4, + 208, 13, 26, 235, 111, 55, 238, 192, 203, 114, 205, 209, 122, 4, 208, 13, + 26, 235, 111, 198, 170, 238, 192, 203, 114, 205, 209, 122, 55, 207, 81, + 203, 114, 205, 209, 122, 55, 207, 82, 4, 208, 12, 203, 114, 205, 209, + 122, 4, 55, 238, 192, 203, 114, 205, 209, 122, 4, 198, 170, 238, 192, + 203, 114, 205, 209, 122, 4, 208, 170, 238, 192, 203, 114, 205, 209, 122, + 4, 204, 163, 238, 192, 203, 114, 205, 209, 122, 4, 242, 128, 26, 208, 12, + 203, 114, 205, 209, 122, 4, 242, 128, 26, 103, 234, 82, 203, 114, 205, + 209, 122, 4, 242, 128, 26, 232, 119, 234, 82, 203, 114, 1, 199, 161, 250, + 249, 70, 203, 114, 1, 197, 222, 250, 249, 70, 203, 114, 1, 197, 222, 250, + 249, 223, 224, 203, 114, 1, 250, 249, 68, 203, 114, 18, 3, 250, 249, 68, + 203, 114, 18, 3, 250, 249, 196, 251, 216, 76, 1, 64, 216, 76, 1, 252, 33, + 216, 76, 1, 70, 216, 76, 1, 223, 224, 216, 76, 1, 68, 216, 76, 1, 196, + 251, 216, 76, 1, 118, 150, 216, 76, 1, 118, 207, 4, 216, 76, 1, 118, 165, + 216, 76, 1, 118, 219, 138, 216, 76, 1, 71, 216, 76, 1, 251, 63, 216, 76, + 1, 74, 216, 76, 1, 250, 8, 216, 76, 1, 160, 216, 76, 1, 221, 250, 216, + 76, 1, 231, 233, 216, 76, 1, 231, 84, 216, 76, 1, 214, 165, 216, 76, 1, + 247, 19, 216, 76, 1, 246, 117, 216, 76, 1, 223, 62, 216, 76, 1, 223, 28, + 216, 76, 1, 212, 201, 216, 76, 1, 198, 83, 216, 76, 1, 198, 71, 216, 76, + 1, 237, 161, 216, 76, 1, 237, 145, 216, 76, 1, 213, 178, 216, 76, 1, 189, + 216, 76, 1, 199, 240, 216, 76, 1, 238, 0, 216, 76, 1, 237, 40, 216, 76, + 1, 181, 216, 76, 1, 166, 216, 76, 1, 210, 94, 216, 76, 1, 249, 3, 216, + 76, 1, 248, 54, 216, 76, 1, 172, 216, 76, 1, 168, 216, 76, 1, 167, 216, + 76, 1, 177, 216, 76, 1, 196, 157, 216, 76, 1, 204, 64, 216, 76, 1, 202, + 92, 216, 76, 1, 188, 216, 76, 1, 144, 216, 76, 1, 219, 137, 216, 76, 18, + 3, 252, 33, 216, 76, 18, 3, 70, 216, 76, 18, 3, 223, 224, 216, 76, 18, 3, + 68, 216, 76, 18, 3, 196, 251, 216, 76, 18, 3, 118, 150, 216, 76, 18, 3, + 118, 207, 4, 216, 76, 18, 3, 118, 165, 216, 76, 18, 3, 118, 219, 138, + 216, 76, 18, 3, 71, 216, 76, 18, 3, 251, 63, 216, 76, 18, 3, 74, 216, 76, + 18, 3, 250, 8, 216, 76, 3, 250, 168, 216, 76, 3, 196, 6, 216, 76, 3, 196, + 11, 216, 76, 3, 250, 109, 216, 76, 237, 208, 216, 76, 55, 237, 208, 216, + 76, 251, 151, 57, 216, 76, 3, 228, 149, 216, 76, 17, 192, 76, 216, 76, + 17, 101, 216, 76, 17, 104, 216, 76, 17, 133, 216, 76, 17, 134, 216, 76, + 17, 151, 216, 76, 17, 170, 216, 76, 17, 179, 216, 76, 17, 174, 216, 76, + 17, 182, 100, 248, 12, 4, 211, 150, 100, 207, 16, 248, 11, 100, 55, 248, + 12, 4, 211, 150, 100, 198, 170, 248, 12, 4, 211, 150, 100, 248, 12, 4, + 55, 211, 150, 100, 207, 16, 248, 12, 4, 211, 150, 100, 207, 16, 248, 12, + 4, 55, 211, 150, 100, 223, 121, 248, 11, 100, 223, 121, 248, 12, 4, 55, + 211, 150, 100, 201, 63, 248, 11, 100, 201, 63, 248, 12, 4, 211, 150, 100, + 201, 63, 248, 12, 4, 55, 211, 150, 100, 163, 201, 63, 248, 12, 4, 55, + 211, 150, 200, 137, 1, 64, 200, 137, 1, 252, 33, 200, 137, 1, 70, 200, + 137, 1, 223, 224, 200, 137, 1, 68, 200, 137, 1, 196, 251, 200, 137, 1, + 71, 200, 137, 1, 251, 63, 200, 137, 1, 74, 200, 137, 1, 250, 8, 200, 137, + 1, 160, 200, 137, 1, 221, 250, 200, 137, 1, 231, 233, 200, 137, 1, 231, + 84, 200, 137, 1, 214, 165, 200, 137, 1, 247, 19, 200, 137, 1, 246, 117, + 200, 137, 1, 223, 62, 200, 137, 1, 223, 28, 200, 137, 1, 212, 201, 200, + 137, 1, 198, 83, 200, 137, 1, 198, 71, 200, 137, 1, 237, 161, 200, 137, + 1, 237, 145, 200, 137, 1, 213, 178, 200, 137, 1, 189, 200, 137, 1, 199, + 240, 200, 137, 1, 238, 0, 200, 137, 1, 237, 40, 200, 137, 1, 181, 200, + 137, 1, 166, 200, 137, 1, 210, 94, 200, 137, 1, 249, 3, 200, 137, 1, 248, + 54, 200, 137, 1, 172, 200, 137, 1, 168, 200, 137, 1, 167, 200, 137, 1, + 177, 200, 137, 1, 196, 157, 200, 137, 1, 204, 64, 200, 137, 1, 188, 200, + 137, 1, 144, 200, 137, 1, 207, 3, 200, 137, 3, 250, 168, 200, 137, 3, + 196, 6, 200, 137, 18, 3, 252, 33, 200, 137, 18, 3, 70, 200, 137, 18, 3, + 223, 224, 200, 137, 18, 3, 68, 200, 137, 18, 3, 196, 251, 200, 137, 18, + 3, 71, 200, 137, 18, 3, 251, 63, 200, 137, 18, 3, 74, 200, 137, 18, 3, + 250, 8, 200, 137, 3, 196, 11, 200, 137, 3, 212, 241, 200, 137, 1, 250, + 112, 221, 250, 200, 137, 17, 192, 76, 200, 137, 17, 101, 200, 137, 17, + 104, 200, 137, 17, 133, 200, 137, 17, 134, 200, 137, 17, 151, 200, 137, + 17, 170, 200, 137, 17, 179, 200, 137, 17, 174, 200, 137, 17, 182, 251, + 67, 1, 160, 251, 67, 1, 221, 250, 251, 67, 1, 214, 165, 251, 67, 1, 181, + 251, 67, 1, 189, 251, 67, 1, 250, 249, 189, 251, 67, 1, 166, 251, 67, 1, + 210, 94, 251, 67, 1, 249, 3, 251, 67, 1, 172, 251, 67, 1, 223, 62, 251, + 67, 1, 246, 117, 251, 67, 1, 199, 240, 251, 67, 1, 167, 251, 67, 1, 177, + 251, 67, 1, 188, 251, 67, 1, 212, 201, 251, 67, 1, 144, 251, 67, 1, 64, + 251, 67, 1, 238, 0, 251, 67, 1, 237, 40, 251, 67, 1, 231, 233, 251, 67, + 1, 250, 249, 231, 233, 251, 67, 1, 231, 84, 251, 67, 1, 248, 54, 251, 67, + 1, 223, 28, 251, 67, 1, 250, 249, 249, 3, 251, 67, 116, 3, 217, 35, 177, + 251, 67, 116, 3, 217, 35, 167, 251, 67, 116, 3, 217, 35, 219, 196, 167, + 251, 67, 18, 3, 64, 251, 67, 18, 3, 252, 33, 251, 67, 18, 3, 70, 251, 67, + 18, 3, 223, 224, 251, 67, 18, 3, 68, 251, 67, 18, 3, 196, 251, 251, 67, + 18, 3, 71, 251, 67, 18, 3, 249, 241, 251, 67, 18, 3, 74, 251, 67, 18, 3, + 251, 63, 251, 67, 18, 3, 250, 241, 251, 67, 3, 221, 181, 251, 67, 17, + 192, 76, 251, 67, 17, 101, 251, 67, 17, 104, 251, 67, 17, 133, 251, 67, + 17, 134, 251, 67, 17, 151, 251, 67, 17, 170, 251, 67, 17, 179, 251, 67, + 17, 174, 251, 67, 17, 182, 251, 67, 31, 200, 30, 251, 67, 31, 197, 239, + 251, 67, 3, 2, 205, 208, 251, 67, 3, 205, 208, 251, 67, 3, 206, 203, 251, + 67, 16, 196, 39, 236, 133, 1, 64, 236, 133, 1, 252, 33, 236, 133, 1, 70, + 236, 133, 1, 223, 224, 236, 133, 1, 68, 236, 133, 1, 196, 251, 236, 133, + 1, 71, 236, 133, 1, 251, 63, 236, 133, 1, 74, 236, 133, 1, 250, 8, 236, + 133, 1, 160, 236, 133, 1, 221, 250, 236, 133, 1, 231, 233, 236, 133, 1, + 231, 84, 236, 133, 1, 214, 165, 236, 133, 1, 247, 19, 236, 133, 1, 246, + 117, 236, 133, 1, 223, 62, 236, 133, 1, 223, 28, 236, 133, 1, 212, 201, + 236, 133, 1, 198, 83, 236, 133, 1, 198, 71, 236, 133, 1, 237, 161, 236, + 133, 1, 237, 145, 236, 133, 1, 213, 178, 236, 133, 1, 189, 236, 133, 1, + 199, 240, 236, 133, 1, 238, 0, 236, 133, 1, 237, 40, 236, 133, 1, 181, + 236, 133, 1, 166, 236, 133, 1, 210, 94, 236, 133, 1, 249, 3, 236, 133, 1, + 248, 54, 236, 133, 1, 172, 236, 133, 1, 168, 236, 133, 1, 167, 236, 133, + 1, 177, 236, 133, 1, 196, 157, 236, 133, 1, 204, 64, 236, 133, 1, 202, + 92, 236, 133, 1, 188, 236, 133, 1, 144, 236, 133, 1, 207, 3, 236, 133, + 18, 3, 252, 33, 236, 133, 18, 3, 70, 236, 133, 18, 3, 223, 224, 236, 133, + 18, 3, 68, 236, 133, 18, 3, 196, 251, 236, 133, 18, 3, 118, 150, 236, + 133, 18, 3, 118, 207, 4, 236, 133, 18, 3, 71, 236, 133, 18, 3, 251, 63, + 236, 133, 18, 3, 74, 236, 133, 18, 3, 250, 8, 236, 133, 3, 250, 168, 236, + 133, 3, 196, 6, 236, 133, 3, 196, 11, 236, 133, 3, 212, 241, 236, 133, + 251, 151, 57, 194, 141, 242, 117, 6, 1, 214, 164, 194, 141, 242, 117, 6, + 1, 64, 194, 141, 242, 117, 6, 1, 194, 72, 194, 141, 242, 117, 6, 1, 192, + 214, 194, 141, 242, 117, 6, 1, 168, 194, 141, 242, 117, 6, 1, 193, 1, + 194, 141, 242, 117, 6, 1, 223, 224, 194, 141, 242, 117, 6, 1, 196, 251, + 194, 141, 242, 117, 6, 1, 71, 194, 141, 242, 117, 6, 1, 74, 194, 141, + 242, 117, 6, 1, 250, 214, 194, 141, 242, 117, 6, 1, 231, 233, 194, 141, + 242, 117, 6, 1, 221, 113, 194, 141, 242, 117, 6, 1, 234, 51, 194, 141, + 242, 117, 6, 1, 192, 193, 194, 141, 242, 117, 6, 1, 197, 111, 194, 141, + 242, 117, 6, 1, 234, 70, 194, 141, 242, 117, 6, 1, 212, 3, 194, 141, 242, + 117, 6, 1, 198, 78, 194, 141, 242, 117, 6, 1, 212, 227, 194, 141, 242, + 117, 6, 1, 238, 0, 194, 141, 242, 117, 6, 1, 250, 26, 194, 141, 242, 117, + 6, 1, 250, 241, 194, 141, 242, 117, 6, 1, 247, 124, 194, 141, 242, 117, + 6, 1, 209, 51, 194, 141, 242, 117, 6, 1, 229, 135, 194, 141, 242, 117, 6, + 1, 229, 23, 194, 141, 242, 117, 6, 1, 228, 206, 194, 141, 242, 117, 6, 1, + 230, 28, 194, 141, 242, 117, 6, 1, 202, 43, 194, 141, 242, 117, 6, 1, + 203, 97, 194, 141, 242, 117, 6, 1, 195, 253, 194, 141, 242, 117, 2, 1, + 214, 164, 194, 141, 242, 117, 2, 1, 64, 194, 141, 242, 117, 2, 1, 194, + 72, 194, 141, 242, 117, 2, 1, 192, 214, 194, 141, 242, 117, 2, 1, 168, + 194, 141, 242, 117, 2, 1, 193, 1, 194, 141, 242, 117, 2, 1, 223, 224, + 194, 141, 242, 117, 2, 1, 196, 251, 194, 141, 242, 117, 2, 1, 71, 194, + 141, 242, 117, 2, 1, 74, 194, 141, 242, 117, 2, 1, 250, 214, 194, 141, + 242, 117, 2, 1, 231, 233, 194, 141, 242, 117, 2, 1, 221, 113, 194, 141, + 242, 117, 2, 1, 234, 51, 194, 141, 242, 117, 2, 1, 192, 193, 194, 141, + 242, 117, 2, 1, 197, 111, 194, 141, 242, 117, 2, 1, 234, 70, 194, 141, + 242, 117, 2, 1, 212, 3, 194, 141, 242, 117, 2, 1, 198, 78, 194, 141, 242, + 117, 2, 1, 212, 227, 194, 141, 242, 117, 2, 1, 238, 0, 194, 141, 242, + 117, 2, 1, 250, 26, 194, 141, 242, 117, 2, 1, 250, 241, 194, 141, 242, + 117, 2, 1, 247, 124, 194, 141, 242, 117, 2, 1, 209, 51, 194, 141, 242, + 117, 2, 1, 229, 135, 194, 141, 242, 117, 2, 1, 229, 23, 194, 141, 242, + 117, 2, 1, 228, 206, 194, 141, 242, 117, 2, 1, 230, 28, 194, 141, 242, + 117, 2, 1, 202, 43, 194, 141, 242, 117, 2, 1, 203, 97, 194, 141, 242, + 117, 2, 1, 195, 253, 194, 141, 242, 117, 17, 192, 76, 194, 141, 242, 117, + 17, 101, 194, 141, 242, 117, 17, 104, 194, 141, 242, 117, 17, 133, 194, + 141, 242, 117, 17, 134, 194, 141, 242, 117, 17, 151, 194, 141, 242, 117, + 17, 170, 194, 141, 242, 117, 17, 179, 194, 141, 242, 117, 17, 174, 194, + 141, 242, 117, 17, 182, 194, 141, 242, 117, 31, 200, 30, 194, 141, 242, + 117, 31, 197, 239, 194, 141, 242, 117, 31, 199, 184, 194, 141, 242, 117, + 31, 232, 126, 194, 141, 242, 117, 31, 233, 3, 194, 141, 242, 117, 31, + 203, 25, 194, 141, 242, 117, 31, 204, 140, 194, 141, 242, 117, 31, 234, + 137, 194, 141, 242, 117, 31, 214, 11, 194, 141, 242, 117, 211, 219, 236, + 181, 251, 37, 1, 64, 236, 181, 251, 37, 1, 252, 33, 236, 181, 251, 37, 1, + 70, 236, 181, 251, 37, 1, 223, 224, 236, 181, 251, 37, 1, 68, 236, 181, + 251, 37, 1, 196, 251, 236, 181, 251, 37, 1, 71, 236, 181, 251, 37, 1, 74, + 236, 181, 251, 37, 1, 160, 236, 181, 251, 37, 1, 221, 250, 236, 181, 251, + 37, 1, 231, 233, 236, 181, 251, 37, 1, 231, 84, 236, 181, 251, 37, 1, + 214, 165, 236, 181, 251, 37, 1, 247, 19, 236, 181, 251, 37, 1, 246, 117, + 236, 181, 251, 37, 1, 223, 62, 236, 181, 251, 37, 1, 212, 201, 236, 181, + 251, 37, 1, 198, 83, 236, 181, 251, 37, 1, 237, 161, 236, 181, 251, 37, + 1, 237, 145, 236, 181, 251, 37, 1, 213, 178, 236, 181, 251, 37, 1, 189, + 236, 181, 251, 37, 1, 199, 240, 236, 181, 251, 37, 1, 238, 0, 236, 181, + 251, 37, 1, 237, 40, 236, 181, 251, 37, 1, 181, 236, 181, 251, 37, 1, + 166, 236, 181, 251, 37, 1, 210, 94, 236, 181, 251, 37, 1, 249, 3, 236, + 181, 251, 37, 1, 248, 54, 236, 181, 251, 37, 1, 172, 236, 181, 251, 37, + 1, 168, 236, 181, 251, 37, 1, 192, 164, 236, 181, 251, 37, 1, 167, 236, + 181, 251, 37, 1, 177, 236, 181, 251, 37, 1, 196, 157, 236, 181, 251, 37, + 1, 204, 64, 236, 181, 251, 37, 1, 202, 92, 236, 181, 251, 37, 1, 188, + 236, 181, 251, 37, 1, 144, 236, 181, 251, 37, 1, 219, 137, 236, 181, 251, + 37, 1, 192, 112, 236, 181, 251, 37, 18, 3, 252, 33, 236, 181, 251, 37, + 18, 3, 70, 236, 181, 251, 37, 18, 3, 223, 224, 236, 181, 251, 37, 18, 3, + 68, 236, 181, 251, 37, 18, 3, 196, 251, 236, 181, 251, 37, 18, 3, 71, + 236, 181, 251, 37, 18, 3, 251, 63, 236, 181, 251, 37, 18, 3, 74, 236, + 181, 251, 37, 3, 250, 168, 236, 181, 251, 37, 3, 246, 234, 236, 181, 251, + 37, 3, 230, 80, 236, 181, 251, 37, 196, 11, 236, 181, 251, 37, 209, 111, + 215, 49, 57, 236, 181, 251, 37, 217, 35, 168, 236, 181, 251, 37, 88, 167, + 236, 181, 251, 37, 217, 35, 167, 236, 181, 251, 37, 3, 212, 241, 236, + 181, 251, 37, 55, 237, 208, 236, 181, 251, 37, 231, 197, 232, 247, 236, + 181, 251, 37, 234, 80, 80, 199, 245, 77, 236, 181, 251, 37, 17, 192, 76, + 236, 181, 251, 37, 17, 101, 236, 181, 251, 37, 17, 104, 236, 181, 251, + 37, 17, 133, 236, 181, 251, 37, 17, 134, 236, 181, 251, 37, 17, 151, 236, + 181, 251, 37, 17, 170, 236, 181, 251, 37, 17, 179, 236, 181, 251, 37, 17, + 174, 236, 181, 251, 37, 17, 182, 215, 58, 1, 64, 215, 58, 1, 252, 33, + 215, 58, 1, 70, 215, 58, 1, 223, 224, 215, 58, 1, 68, 215, 58, 1, 196, + 251, 215, 58, 1, 118, 150, 215, 58, 1, 118, 207, 4, 215, 58, 1, 71, 215, + 58, 1, 251, 63, 215, 58, 1, 74, 215, 58, 1, 250, 8, 215, 58, 1, 160, 215, + 58, 1, 221, 250, 215, 58, 1, 231, 233, 215, 58, 1, 231, 84, 215, 58, 1, + 214, 165, 215, 58, 1, 247, 19, 215, 58, 1, 246, 117, 215, 58, 1, 223, 62, + 215, 58, 1, 223, 28, 215, 58, 1, 212, 201, 215, 58, 1, 198, 83, 215, 58, + 1, 198, 71, 215, 58, 1, 237, 161, 215, 58, 1, 237, 145, 215, 58, 1, 213, + 178, 215, 58, 1, 189, 215, 58, 1, 199, 240, 215, 58, 1, 238, 0, 215, 58, + 1, 237, 40, 215, 58, 1, 181, 215, 58, 1, 166, 215, 58, 1, 210, 94, 215, + 58, 1, 249, 3, 215, 58, 1, 248, 54, 215, 58, 1, 172, 215, 58, 1, 168, + 215, 58, 1, 167, 215, 58, 1, 177, 215, 58, 1, 196, 157, 215, 58, 1, 204, + 64, 215, 58, 1, 202, 92, 215, 58, 1, 188, 215, 58, 1, 144, 215, 58, 1, + 219, 137, 215, 58, 1, 207, 3, 215, 58, 18, 3, 252, 33, 215, 58, 18, 3, + 70, 215, 58, 18, 3, 223, 224, 215, 58, 18, 3, 68, 215, 58, 18, 3, 196, + 251, 215, 58, 18, 3, 118, 150, 215, 58, 18, 3, 118, 207, 4, 215, 58, 18, + 3, 71, 215, 58, 18, 3, 251, 63, 215, 58, 18, 3, 74, 215, 58, 18, 3, 250, + 8, 215, 58, 3, 250, 168, 215, 58, 3, 196, 6, 215, 58, 3, 196, 11, 215, + 58, 3, 249, 246, 215, 58, 3, 203, 113, 215, 58, 229, 237, 215, 58, 18, 3, + 209, 91, 71, 192, 99, 50, 1, 64, 192, 99, 50, 18, 3, 70, 192, 99, 50, 18, + 3, 197, 104, 192, 99, 50, 18, 3, 68, 192, 99, 50, 18, 3, 71, 192, 99, 50, + 18, 3, 212, 0, 192, 99, 50, 18, 3, 74, 192, 99, 50, 18, 3, 251, 63, 192, + 99, 50, 18, 3, 250, 8, 192, 99, 50, 18, 3, 207, 168, 70, 192, 99, 50, 18, + 220, 2, 77, 192, 99, 50, 1, 160, 192, 99, 50, 1, 221, 250, 192, 99, 50, + 1, 231, 233, 192, 99, 50, 1, 231, 84, 192, 99, 50, 1, 214, 165, 192, 99, + 50, 1, 247, 19, 192, 99, 50, 1, 246, 117, 192, 99, 50, 1, 223, 62, 192, + 99, 50, 1, 212, 201, 192, 99, 50, 1, 198, 83, 192, 99, 50, 1, 198, 71, + 192, 99, 50, 1, 237, 161, 192, 99, 50, 1, 237, 145, 192, 99, 50, 1, 213, + 178, 192, 99, 50, 1, 189, 192, 99, 50, 1, 199, 240, 192, 99, 50, 1, 238, + 0, 192, 99, 50, 1, 237, 40, 192, 99, 50, 1, 181, 192, 99, 50, 1, 166, + 192, 99, 50, 1, 210, 94, 192, 99, 50, 1, 249, 3, 192, 99, 50, 1, 248, 54, + 192, 99, 50, 1, 172, 192, 99, 50, 1, 198, 118, 192, 99, 50, 1, 198, 108, + 192, 99, 50, 1, 235, 17, 192, 99, 50, 1, 235, 11, 192, 99, 50, 1, 192, + 71, 192, 99, 50, 1, 192, 112, 192, 99, 50, 1, 255, 41, 192, 99, 50, 1, + 168, 192, 99, 50, 1, 167, 192, 99, 50, 1, 177, 192, 99, 50, 1, 196, 157, + 192, 99, 50, 1, 204, 64, 192, 99, 50, 1, 202, 92, 192, 99, 50, 1, 188, + 192, 99, 50, 1, 144, 192, 99, 50, 1, 221, 47, 192, 99, 50, 52, 116, 77, + 192, 99, 50, 3, 196, 11, 192, 99, 50, 3, 246, 234, 192, 99, 50, 3, 246, + 235, 4, 211, 150, 192, 99, 50, 3, 246, 237, 4, 211, 150, 192, 99, 50, 3, + 250, 168, 192, 99, 50, 3, 196, 6, 192, 99, 50, 242, 66, 1, 167, 192, 99, + 50, 242, 67, 1, 168, 192, 99, 50, 242, 67, 1, 167, 192, 99, 50, 242, 67, + 1, 177, 192, 99, 50, 242, 67, 1, 196, 157, 192, 99, 50, 88, 229, 246, 77, + 192, 99, 50, 242, 80, 229, 246, 77, 192, 99, 50, 122, 198, 103, 192, 99, + 50, 122, 204, 56, 192, 99, 50, 122, 55, 204, 56, 192, 99, 50, 122, 184, + 198, 103, 192, 99, 50, 88, 235, 103, 229, 246, 77, 192, 99, 50, 242, 80, + 235, 103, 229, 246, 77, 192, 99, 50, 201, 163, 202, 164, 1, 64, 202, 164, + 18, 3, 70, 202, 164, 18, 3, 197, 104, 202, 164, 18, 3, 68, 202, 164, 18, + 3, 71, 202, 164, 18, 3, 74, 202, 164, 18, 3, 212, 0, 202, 164, 18, 3, + 251, 63, 202, 164, 18, 3, 250, 8, 202, 164, 18, 3, 118, 150, 202, 164, + 18, 3, 118, 165, 202, 164, 18, 220, 2, 77, 202, 164, 1, 160, 202, 164, 1, + 221, 250, 202, 164, 1, 231, 233, 202, 164, 1, 231, 84, 202, 164, 1, 214, + 165, 202, 164, 1, 247, 19, 202, 164, 1, 246, 117, 202, 164, 1, 223, 62, + 202, 164, 1, 223, 28, 202, 164, 1, 212, 201, 202, 164, 1, 198, 83, 202, + 164, 1, 198, 71, 202, 164, 1, 237, 161, 202, 164, 1, 237, 145, 202, 164, + 1, 213, 178, 202, 164, 1, 189, 202, 164, 1, 199, 240, 202, 164, 1, 238, + 0, 202, 164, 1, 237, 40, 202, 164, 1, 181, 202, 164, 1, 166, 202, 164, 1, + 210, 94, 202, 164, 1, 249, 3, 202, 164, 1, 248, 54, 202, 164, 1, 172, + 202, 164, 1, 198, 118, 202, 164, 1, 198, 108, 202, 164, 1, 235, 17, 202, + 164, 1, 192, 71, 202, 164, 1, 192, 112, 202, 164, 1, 255, 41, 202, 164, + 1, 168, 202, 164, 1, 167, 202, 164, 1, 177, 202, 164, 1, 196, 157, 202, + 164, 1, 204, 64, 202, 164, 1, 202, 92, 202, 164, 1, 188, 202, 164, 1, + 144, 202, 164, 1, 221, 47, 202, 164, 3, 223, 13, 202, 164, 3, 197, 39, + 202, 164, 242, 66, 1, 167, 202, 164, 242, 66, 1, 177, 202, 164, 242, 66, + 1, 204, 64, 202, 164, 242, 66, 1, 188, 202, 164, 52, 116, 3, 232, 44, + 202, 164, 52, 116, 3, 222, 184, 202, 164, 52, 116, 3, 214, 167, 202, 164, + 52, 116, 3, 238, 95, 202, 164, 52, 116, 3, 215, 151, 202, 164, 52, 116, + 3, 249, 226, 202, 164, 52, 116, 3, 218, 236, 202, 164, 52, 116, 3, 150, + 202, 164, 52, 116, 3, 165, 202, 164, 52, 116, 3, 204, 66, 202, 164, 52, + 116, 3, 206, 158, 202, 164, 52, 116, 3, 255, 41, 202, 164, 3, 250, 168, + 202, 164, 3, 196, 6, 202, 164, 231, 146, 77, 202, 164, 201, 163, 202, + 164, 122, 198, 103, 202, 164, 122, 204, 56, 202, 164, 122, 55, 204, 56, + 202, 164, 122, 209, 204, 202, 164, 229, 246, 122, 4, 216, 30, 26, 201, + 124, 26, 198, 170, 232, 199, 202, 164, 229, 246, 122, 4, 216, 30, 26, + 201, 124, 26, 232, 199, 202, 164, 229, 246, 122, 4, 216, 30, 26, 201, + 123, 202, 164, 200, 16, 217, 126, 202, 164, 200, 16, 217, 125, 210, 198, + 242, 135, 230, 12, 1, 166, 210, 198, 242, 135, 230, 12, 1, 160, 210, 198, + 242, 135, 230, 12, 1, 177, 210, 198, 242, 135, 230, 12, 1, 172, 210, 198, + 242, 135, 230, 12, 1, 238, 0, 210, 198, 242, 135, 230, 12, 1, 192, 112, + 210, 198, 242, 135, 230, 12, 1, 196, 157, 210, 198, 242, 135, 230, 12, 1, + 214, 165, 210, 198, 242, 135, 230, 12, 1, 144, 210, 198, 242, 135, 230, + 12, 1, 231, 233, 210, 198, 242, 135, 230, 12, 1, 221, 250, 210, 198, 242, + 135, 230, 12, 1, 188, 210, 198, 242, 135, 230, 12, 1, 249, 3, 210, 198, + 242, 135, 230, 12, 1, 247, 19, 210, 198, 242, 135, 230, 12, 1, 189, 210, + 198, 242, 135, 230, 12, 1, 199, 240, 210, 198, 242, 135, 230, 12, 1, 181, + 210, 198, 242, 135, 230, 12, 1, 210, 94, 210, 198, 242, 135, 230, 12, 1, + 167, 210, 198, 242, 135, 230, 12, 1, 233, 97, 210, 198, 242, 135, 230, + 12, 1, 246, 117, 210, 198, 242, 135, 230, 12, 1, 64, 210, 198, 242, 135, + 230, 12, 1, 71, 210, 198, 242, 135, 230, 12, 1, 70, 210, 198, 242, 135, + 230, 12, 1, 74, 210, 198, 242, 135, 230, 12, 1, 68, 210, 198, 242, 135, + 230, 12, 1, 197, 119, 210, 198, 242, 135, 230, 12, 1, 228, 58, 210, 198, + 242, 135, 230, 12, 1, 52, 211, 93, 210, 198, 242, 135, 230, 12, 1, 52, + 222, 184, 210, 198, 242, 135, 230, 12, 1, 52, 200, 228, 210, 198, 242, + 135, 230, 12, 1, 52, 218, 236, 210, 198, 242, 135, 230, 12, 1, 52, 215, + 151, 210, 198, 242, 135, 230, 12, 1, 52, 165, 210, 198, 242, 135, 230, + 12, 1, 52, 194, 202, 210, 198, 242, 135, 230, 12, 1, 52, 214, 167, 210, + 198, 242, 135, 230, 12, 1, 52, 193, 148, 210, 198, 242, 135, 230, 12, + 207, 73, 158, 219, 84, 210, 198, 242, 135, 230, 12, 207, 73, 199, 18, + 210, 198, 242, 135, 230, 12, 206, 36, 231, 6, 201, 238, 210, 198, 242, + 135, 230, 12, 207, 73, 158, 184, 232, 243, 210, 198, 242, 135, 230, 12, + 207, 73, 158, 232, 243, 210, 198, 242, 135, 230, 12, 206, 36, 231, 6, + 201, 239, 232, 243, 210, 198, 242, 135, 230, 12, 206, 36, 158, 219, 84, + 210, 198, 242, 135, 230, 12, 206, 36, 199, 18, 210, 198, 242, 135, 230, + 12, 206, 36, 158, 184, 232, 243, 210, 198, 242, 135, 230, 12, 206, 36, + 158, 232, 243, 210, 198, 242, 135, 230, 12, 216, 161, 199, 18, 210, 198, + 242, 135, 230, 12, 231, 6, 201, 239, 196, 136, 210, 198, 242, 135, 230, + 12, 216, 161, 158, 184, 232, 243, 210, 198, 242, 135, 230, 12, 216, 161, + 158, 232, 243, 210, 198, 242, 135, 230, 12, 219, 50, 158, 219, 84, 210, + 198, 242, 135, 230, 12, 219, 50, 199, 18, 210, 198, 242, 135, 230, 12, + 231, 6, 201, 238, 210, 198, 242, 135, 230, 12, 219, 50, 158, 184, 232, + 243, 210, 198, 242, 135, 230, 12, 219, 50, 158, 232, 243, 210, 198, 242, + 135, 230, 12, 231, 6, 201, 239, 232, 243, 248, 52, 1, 64, 248, 52, 1, + 252, 33, 248, 52, 1, 70, 248, 52, 1, 223, 224, 248, 52, 1, 68, 248, 52, + 1, 196, 251, 248, 52, 1, 118, 150, 248, 52, 1, 118, 207, 4, 248, 52, 1, + 118, 165, 248, 52, 1, 71, 248, 52, 1, 251, 63, 248, 52, 1, 74, 248, 52, + 1, 250, 8, 248, 52, 1, 160, 248, 52, 1, 221, 250, 248, 52, 1, 231, 233, + 248, 52, 1, 231, 84, 248, 52, 1, 214, 165, 248, 52, 1, 247, 19, 248, 52, + 1, 246, 117, 248, 52, 1, 223, 62, 248, 52, 1, 223, 28, 248, 52, 1, 212, + 201, 248, 52, 1, 198, 83, 248, 52, 1, 198, 71, 248, 52, 1, 237, 161, 248, + 52, 1, 237, 145, 248, 52, 1, 213, 178, 248, 52, 1, 189, 248, 52, 1, 199, + 240, 248, 52, 1, 238, 0, 248, 52, 1, 237, 40, 248, 52, 1, 181, 248, 52, + 1, 166, 248, 52, 1, 210, 94, 248, 52, 1, 249, 3, 248, 52, 1, 248, 54, + 248, 52, 1, 172, 248, 52, 1, 168, 248, 52, 1, 167, 248, 52, 1, 177, 248, + 52, 1, 196, 157, 248, 52, 1, 204, 64, 248, 52, 1, 202, 92, 248, 52, 1, + 188, 248, 52, 1, 144, 248, 52, 18, 3, 252, 33, 248, 52, 18, 3, 70, 248, + 52, 18, 3, 223, 224, 248, 52, 18, 3, 68, 248, 52, 18, 3, 196, 251, 248, + 52, 18, 3, 118, 150, 248, 52, 18, 3, 118, 207, 4, 248, 52, 18, 3, 118, + 165, 248, 52, 18, 3, 71, 248, 52, 18, 3, 251, 63, 248, 52, 18, 3, 74, + 248, 52, 18, 3, 250, 8, 248, 52, 3, 246, 234, 248, 52, 3, 250, 168, 248, + 52, 3, 196, 6, 248, 52, 3, 196, 11, 248, 52, 3, 249, 246, 248, 52, 237, + 208, 248, 52, 55, 237, 208, 248, 52, 194, 11, 204, 165, 248, 52, 231, + 197, 232, 246, 248, 52, 231, 197, 232, 245, 248, 52, 17, 192, 76, 248, + 52, 17, 101, 248, 52, 17, 104, 248, 52, 17, 133, 248, 52, 17, 134, 248, + 52, 17, 151, 248, 52, 17, 170, 248, 52, 17, 179, 248, 52, 17, 174, 248, + 52, 17, 182, 248, 52, 31, 101, 248, 52, 31, 104, 248, 52, 31, 133, 248, + 52, 31, 134, 248, 52, 31, 151, 248, 52, 31, 170, 248, 52, 31, 179, 248, + 52, 31, 174, 248, 52, 31, 182, 248, 52, 31, 200, 30, 248, 52, 31, 197, + 239, 248, 52, 31, 199, 184, 248, 52, 31, 232, 126, 248, 52, 31, 233, 3, + 248, 52, 31, 203, 25, 248, 52, 31, 204, 140, 248, 52, 31, 234, 137, 248, + 52, 31, 214, 11, 248, 52, 228, 161, 197, 55, 77, 217, 128, 229, 246, 77, + 217, 128, 122, 204, 56, 217, 128, 1, 160, 217, 128, 1, 221, 250, 217, + 128, 1, 231, 233, 217, 128, 1, 214, 165, 217, 128, 1, 247, 19, 217, 128, + 1, 246, 117, 217, 128, 1, 223, 62, 217, 128, 1, 212, 201, 217, 128, 1, + 189, 217, 128, 1, 199, 240, 217, 128, 1, 238, 0, 217, 128, 1, 181, 217, + 128, 1, 166, 217, 128, 1, 210, 94, 217, 128, 1, 249, 3, 217, 128, 1, 172, + 217, 128, 1, 198, 118, 217, 128, 1, 198, 108, 217, 128, 1, 235, 17, 217, + 128, 1, 194, 169, 217, 128, 1, 192, 71, 217, 128, 1, 192, 112, 217, 128, + 1, 255, 41, 217, 128, 1, 168, 217, 128, 1, 167, 217, 128, 1, 177, 217, + 128, 1, 204, 64, 217, 128, 1, 188, 217, 128, 1, 144, 217, 128, 1, 64, + 217, 128, 201, 164, 1, 160, 217, 128, 201, 164, 1, 221, 250, 217, 128, + 201, 164, 1, 231, 233, 217, 128, 201, 164, 1, 214, 165, 217, 128, 201, + 164, 1, 247, 19, 217, 128, 201, 164, 1, 246, 117, 217, 128, 201, 164, 1, + 223, 62, 217, 128, 201, 164, 1, 212, 201, 217, 128, 201, 164, 1, 189, + 217, 128, 201, 164, 1, 199, 240, 217, 128, 201, 164, 1, 238, 0, 217, 128, + 201, 164, 1, 181, 217, 128, 201, 164, 1, 166, 217, 128, 201, 164, 1, 210, + 94, 217, 128, 201, 164, 1, 249, 3, 217, 128, 201, 164, 1, 172, 217, 128, + 201, 164, 1, 198, 118, 217, 128, 201, 164, 1, 198, 108, 217, 128, 201, + 164, 1, 235, 17, 217, 128, 201, 164, 1, 194, 169, 217, 128, 201, 164, 1, + 192, 71, 217, 128, 201, 164, 1, 192, 112, 217, 128, 201, 164, 1, 168, + 217, 128, 201, 164, 1, 167, 217, 128, 201, 164, 1, 177, 217, 128, 201, + 164, 1, 204, 64, 217, 128, 201, 164, 1, 188, 217, 128, 201, 164, 1, 144, + 217, 128, 201, 164, 1, 64, 217, 128, 18, 3, 252, 33, 217, 128, 18, 3, 70, + 217, 128, 18, 3, 68, 217, 128, 18, 3, 71, 217, 128, 18, 3, 74, 217, 128, + 3, 250, 168, 217, 128, 3, 246, 234, 217, 112, 127, 1, 64, 217, 112, 127, + 1, 252, 33, 217, 112, 127, 1, 70, 217, 112, 127, 1, 223, 224, 217, 112, + 127, 1, 68, 217, 112, 127, 1, 196, 251, 217, 112, 127, 1, 71, 217, 112, + 127, 1, 251, 63, 217, 112, 127, 1, 74, 217, 112, 127, 1, 250, 8, 217, + 112, 127, 1, 160, 217, 112, 127, 1, 221, 250, 217, 112, 127, 1, 231, 233, + 217, 112, 127, 1, 231, 84, 217, 112, 127, 1, 214, 165, 217, 112, 127, 1, + 247, 19, 217, 112, 127, 1, 246, 117, 217, 112, 127, 1, 223, 62, 217, 112, + 127, 1, 223, 28, 217, 112, 127, 1, 212, 201, 217, 112, 127, 1, 198, 83, + 217, 112, 127, 1, 198, 71, 217, 112, 127, 1, 237, 161, 217, 112, 127, 1, + 237, 145, 217, 112, 127, 1, 213, 178, 217, 112, 127, 1, 189, 217, 112, + 127, 1, 199, 240, 217, 112, 127, 1, 238, 0, 217, 112, 127, 1, 237, 40, + 217, 112, 127, 1, 181, 217, 112, 127, 1, 166, 217, 112, 127, 1, 210, 94, + 217, 112, 127, 1, 249, 3, 217, 112, 127, 1, 248, 54, 217, 112, 127, 1, + 172, 217, 112, 127, 1, 168, 217, 112, 127, 1, 167, 217, 112, 127, 1, 177, + 217, 112, 127, 1, 196, 157, 217, 112, 127, 1, 204, 64, 217, 112, 127, 1, + 202, 92, 217, 112, 127, 1, 188, 217, 112, 127, 1, 144, 217, 112, 127, 1, + 219, 137, 217, 112, 127, 1, 221, 47, 217, 112, 127, 1, 222, 234, 217, + 112, 127, 1, 198, 223, 217, 112, 127, 18, 3, 252, 33, 217, 112, 127, 18, + 3, 70, 217, 112, 127, 18, 3, 223, 224, 217, 112, 127, 18, 3, 68, 217, + 112, 127, 18, 3, 196, 251, 217, 112, 127, 18, 3, 118, 150, 217, 112, 127, + 18, 3, 71, 217, 112, 127, 18, 3, 251, 63, 217, 112, 127, 18, 3, 74, 217, + 112, 127, 18, 3, 250, 8, 217, 112, 127, 3, 250, 168, 217, 112, 127, 3, + 196, 6, 217, 112, 127, 3, 212, 241, 217, 112, 127, 3, 246, 236, 217, 112, + 127, 3, 230, 80, 217, 112, 127, 196, 11, 217, 112, 127, 207, 194, 217, + 112, 127, 208, 71, 217, 112, 127, 17, 192, 76, 217, 112, 127, 17, 101, + 217, 112, 127, 17, 104, 217, 112, 127, 17, 133, 217, 112, 127, 17, 134, + 217, 112, 127, 17, 151, 217, 112, 127, 17, 170, 217, 112, 127, 17, 179, + 217, 112, 127, 17, 174, 217, 112, 127, 17, 182, 230, 164, 127, 1, 64, + 230, 164, 127, 1, 252, 33, 230, 164, 127, 1, 70, 230, 164, 127, 1, 223, + 224, 230, 164, 127, 1, 68, 230, 164, 127, 1, 196, 251, 230, 164, 127, 1, + 234, 171, 230, 164, 127, 1, 251, 63, 230, 164, 127, 1, 211, 194, 230, + 164, 127, 1, 250, 8, 230, 164, 127, 1, 168, 230, 164, 127, 1, 196, 157, + 230, 164, 127, 1, 249, 3, 230, 164, 127, 1, 248, 54, 230, 164, 127, 1, + 172, 230, 164, 127, 1, 160, 230, 164, 127, 1, 221, 250, 230, 164, 127, 1, + 189, 230, 164, 127, 1, 199, 240, 230, 164, 127, 1, 177, 230, 164, 127, 1, + 231, 233, 230, 164, 127, 1, 231, 84, 230, 164, 127, 1, 238, 0, 230, 164, + 127, 1, 237, 40, 230, 164, 127, 1, 181, 230, 164, 127, 1, 247, 19, 230, + 164, 127, 1, 246, 117, 230, 164, 127, 1, 198, 83, 230, 164, 127, 1, 198, + 71, 230, 164, 127, 1, 219, 137, 230, 164, 127, 1, 223, 62, 230, 164, 127, + 1, 223, 28, 230, 164, 127, 1, 237, 161, 230, 164, 127, 1, 237, 145, 230, + 164, 127, 1, 214, 165, 230, 164, 127, 1, 166, 230, 164, 127, 1, 210, 94, + 230, 164, 127, 1, 144, 230, 164, 127, 1, 167, 230, 164, 127, 1, 188, 230, + 164, 127, 18, 3, 252, 33, 230, 164, 127, 18, 3, 70, 230, 164, 127, 18, 3, + 223, 224, 230, 164, 127, 18, 3, 68, 230, 164, 127, 18, 3, 196, 251, 230, + 164, 127, 18, 3, 234, 171, 230, 164, 127, 18, 3, 251, 63, 230, 164, 127, + 18, 3, 211, 194, 230, 164, 127, 18, 3, 250, 8, 230, 164, 127, 3, 250, + 168, 230, 164, 127, 3, 196, 6, 230, 164, 127, 196, 11, 230, 164, 127, + 211, 219, 230, 164, 127, 17, 192, 76, 230, 164, 127, 17, 101, 230, 164, + 127, 17, 104, 230, 164, 127, 17, 133, 230, 164, 127, 17, 134, 230, 164, + 127, 17, 151, 230, 164, 127, 17, 170, 230, 164, 127, 17, 179, 230, 164, + 127, 17, 174, 230, 164, 127, 17, 182, 217, 170, 1, 160, 217, 170, 1, 231, + 233, 217, 170, 1, 214, 165, 217, 170, 1, 166, 217, 170, 1, 249, 3, 217, + 170, 1, 172, 217, 170, 1, 189, 217, 170, 1, 238, 0, 217, 170, 1, 181, + 217, 170, 1, 247, 19, 217, 170, 1, 223, 62, 217, 170, 1, 212, 201, 217, + 170, 1, 168, 217, 170, 1, 167, 217, 170, 1, 177, 217, 170, 1, 196, 157, + 217, 170, 1, 188, 217, 170, 1, 64, 217, 170, 250, 210, 217, 170, 18, 3, + 70, 217, 170, 18, 3, 68, 217, 170, 18, 3, 71, 217, 170, 18, 3, 74, 217, + 170, 210, 211, 217, 170, 234, 80, 80, 205, 208, 219, 152, 1, 193, 24, 44, + 232, 109, 90, 199, 157, 44, 232, 109, 90, 211, 207, 44, 232, 109, 90, + 234, 140, 44, 232, 109, 90, 203, 23, 44, 232, 109, 90, 232, 129, 44, 232, + 109, 90, 199, 180, 44, 232, 109, 112, 234, 139, 44, 232, 109, 112, 203, + 22, 44, 232, 109, 90, 197, 242, 44, 232, 109, 90, 203, 32, 44, 232, 109, + 90, 203, 31, 44, 232, 109, 90, 200, 21, 44, 232, 109, 90, 234, 143, 44, + 232, 109, 112, 197, 241, 44, 232, 109, 112, 203, 30, 44, 232, 109, 90, + 233, 6, 44, 232, 109, 90, 208, 167, 44, 232, 109, 90, 230, 77, 44, 232, + 109, 90, 230, 76, 44, 232, 109, 112, 208, 165, 44, 232, 109, 235, 94, + 233, 81, 221, 182, 44, 3, 214, 197, 44, 3, 246, 122, 44, 3, 251, 240, 44, + 3, 196, 239, 44, 3, 215, 178, 44, 3, 220, 253, 44, 3, 210, 202, 44, 3, + 215, 222, 44, 3, 222, 156, 44, 3, 211, 23, 44, 3, 209, 174, 44, 3, 196, + 142, 44, 3, 211, 72, 44, 3, 220, 242, 44, 3, 196, 113, 44, 194, 87, 238, + 154, 57, 44, 235, 65, 238, 154, 57, 44, 220, 82, 57, 44, 206, 56, 211, + 26, 57, 44, 198, 218, 238, 196, 57, 44, 198, 218, 31, 57, 44, 238, 136, + 57, 44, 26, 212, 4, 57, 44, 202, 141, 57, 44, 198, 234, 57, 44, 223, 191, + 209, 157, 57, 44, 202, 13, 232, 89, 57, 44, 3, 215, 182, 44, 3, 196, 150, + 44, 209, 38, 234, 80, 80, 199, 244, 10, 3, 64, 10, 3, 41, 24, 64, 10, 3, + 41, 24, 248, 241, 10, 3, 41, 24, 231, 202, 200, 19, 10, 3, 41, 24, 144, + 10, 3, 41, 24, 223, 226, 10, 3, 41, 24, 220, 162, 230, 162, 10, 3, 41, + 24, 215, 189, 10, 3, 41, 24, 206, 79, 10, 3, 254, 42, 10, 3, 251, 238, + 10, 3, 251, 239, 24, 250, 51, 10, 3, 251, 239, 24, 235, 48, 230, 162, 10, + 3, 251, 239, 24, 231, 215, 10, 3, 251, 239, 24, 231, 202, 200, 19, 10, 3, + 251, 239, 24, 144, 10, 3, 251, 239, 24, 223, 227, 230, 162, 10, 3, 251, + 239, 24, 223, 200, 10, 3, 251, 239, 24, 220, 163, 10, 3, 251, 239, 24, + 203, 252, 10, 3, 251, 239, 24, 124, 102, 124, 102, 68, 10, 3, 251, 239, + 230, 162, 10, 3, 251, 155, 10, 3, 251, 156, 24, 248, 220, 10, 3, 251, + 156, 24, 231, 202, 200, 19, 10, 3, 251, 156, 24, 217, 49, 102, 234, 88, + 10, 3, 251, 156, 24, 204, 62, 10, 3, 251, 156, 24, 200, 141, 10, 3, 251, + 125, 10, 3, 251, 44, 10, 3, 251, 45, 24, 234, 15, 10, 3, 251, 45, 24, + 203, 214, 102, 231, 18, 10, 3, 251, 35, 10, 3, 251, 36, 24, 251, 35, 10, + 3, 251, 36, 24, 236, 225, 10, 3, 251, 36, 24, 231, 18, 10, 3, 251, 36, + 24, 144, 10, 3, 251, 36, 24, 222, 144, 10, 3, 251, 36, 24, 221, 204, 10, + 3, 251, 36, 24, 204, 12, 10, 3, 251, 36, 24, 197, 3, 10, 3, 251, 32, 10, + 3, 251, 24, 10, 3, 250, 237, 10, 3, 250, 238, 24, 204, 12, 10, 3, 250, + 224, 10, 3, 250, 225, 136, 250, 224, 10, 3, 250, 225, 112, 199, 82, 10, + 3, 250, 225, 102, 215, 75, 211, 170, 250, 225, 102, 215, 74, 10, 3, 250, + 225, 102, 215, 75, 202, 105, 10, 3, 250, 188, 10, 3, 250, 158, 10, 3, + 250, 124, 10, 3, 250, 125, 24, 221, 0, 10, 3, 250, 96, 10, 3, 250, 59, + 10, 3, 250, 53, 10, 3, 250, 54, 192, 26, 200, 19, 10, 3, 250, 54, 222, + 148, 200, 19, 10, 3, 250, 54, 136, 250, 54, 198, 34, 136, 198, 34, 198, + 34, 136, 198, 34, 210, 253, 10, 3, 250, 54, 136, 250, 54, 136, 250, 53, + 10, 3, 250, 54, 136, 250, 54, 136, 250, 54, 238, 176, 250, 54, 136, 250, + 54, 136, 250, 53, 10, 3, 250, 51, 10, 3, 250, 47, 10, 3, 249, 3, 10, 3, + 248, 241, 10, 3, 248, 235, 10, 3, 248, 227, 10, 3, 248, 221, 10, 3, 248, + 222, 136, 248, 221, 10, 3, 248, 220, 10, 3, 161, 10, 3, 248, 193, 10, 3, + 248, 41, 10, 3, 248, 42, 24, 64, 10, 3, 248, 42, 24, 231, 193, 10, 3, + 248, 42, 24, 223, 227, 230, 162, 10, 3, 247, 124, 10, 3, 247, 125, 136, + 247, 125, 251, 238, 10, 3, 247, 125, 136, 247, 125, 197, 77, 10, 3, 247, + 125, 238, 176, 247, 124, 10, 3, 247, 100, 10, 3, 247, 101, 136, 247, 100, + 10, 3, 247, 89, 10, 3, 247, 88, 10, 3, 238, 0, 10, 3, 237, 246, 10, 3, + 237, 247, 221, 163, 24, 41, 102, 217, 110, 10, 3, 237, 247, 221, 163, 24, + 250, 237, 10, 3, 237, 247, 221, 163, 24, 248, 220, 10, 3, 237, 247, 221, + 163, 24, 248, 41, 10, 3, 237, 247, 221, 163, 24, 231, 233, 10, 3, 237, + 247, 221, 163, 24, 231, 234, 102, 217, 110, 10, 3, 237, 247, 221, 163, + 24, 231, 46, 10, 3, 237, 247, 221, 163, 24, 231, 27, 10, 3, 237, 247, + 221, 163, 24, 230, 175, 10, 3, 237, 247, 221, 163, 24, 144, 10, 3, 237, + 247, 221, 163, 24, 223, 105, 10, 3, 237, 247, 221, 163, 24, 223, 106, + 102, 219, 36, 10, 3, 237, 247, 221, 163, 24, 222, 129, 10, 3, 237, 247, + 221, 163, 24, 177, 10, 3, 237, 247, 221, 163, 24, 219, 36, 10, 3, 237, + 247, 221, 163, 24, 219, 37, 102, 217, 109, 10, 3, 237, 247, 221, 163, 24, + 219, 19, 10, 3, 237, 247, 221, 163, 24, 214, 214, 10, 3, 237, 247, 221, + 163, 24, 210, 254, 102, 210, 253, 10, 3, 237, 247, 221, 163, 24, 203, + 125, 10, 3, 237, 247, 221, 163, 24, 200, 141, 10, 3, 237, 247, 221, 163, + 24, 197, 121, 102, 231, 27, 10, 3, 237, 247, 221, 163, 24, 197, 3, 10, 3, + 237, 218, 10, 3, 237, 195, 10, 3, 237, 194, 10, 3, 237, 193, 10, 3, 237, + 16, 10, 3, 236, 254, 10, 3, 236, 227, 10, 3, 236, 228, 24, 204, 12, 10, + 3, 236, 225, 10, 3, 236, 215, 10, 3, 236, 216, 222, 89, 124, 230, 163, + 236, 194, 10, 3, 236, 194, 10, 3, 235, 62, 10, 3, 235, 63, 136, 235, 62, + 10, 3, 235, 63, 230, 162, 10, 3, 235, 63, 203, 249, 10, 3, 235, 60, 10, + 3, 235, 61, 24, 233, 252, 10, 3, 235, 59, 10, 3, 235, 56, 10, 3, 235, 55, + 10, 3, 235, 54, 10, 3, 235, 49, 10, 3, 235, 47, 10, 3, 235, 48, 230, 162, + 10, 3, 235, 48, 230, 163, 230, 162, 10, 3, 235, 46, 10, 3, 235, 39, 10, + 3, 71, 10, 3, 234, 253, 24, 210, 253, 10, 3, 234, 253, 136, 234, 253, + 212, 231, 136, 212, 230, 10, 3, 234, 200, 10, 3, 234, 201, 24, 41, 102, + 230, 113, 102, 238, 0, 10, 3, 234, 201, 24, 231, 193, 10, 3, 234, 201, + 24, 216, 175, 10, 3, 234, 201, 24, 206, 63, 10, 3, 234, 201, 24, 204, 12, + 10, 3, 234, 201, 24, 68, 10, 3, 234, 173, 10, 3, 234, 161, 10, 3, 234, + 124, 10, 3, 234, 88, 10, 3, 234, 89, 24, 231, 201, 10, 3, 234, 89, 24, + 231, 202, 200, 19, 10, 3, 234, 89, 24, 217, 48, 10, 3, 234, 89, 238, 176, + 234, 88, 10, 3, 234, 89, 211, 170, 234, 88, 10, 3, 234, 89, 202, 105, 10, + 3, 234, 18, 10, 3, 234, 15, 10, 3, 233, 252, 10, 3, 233, 168, 10, 3, 233, + 169, 24, 64, 10, 3, 233, 169, 24, 41, 102, 220, 96, 10, 3, 233, 169, 24, + 41, 102, 220, 97, 24, 220, 96, 10, 3, 233, 169, 24, 250, 224, 10, 3, 233, + 169, 24, 248, 241, 10, 3, 233, 169, 24, 235, 48, 230, 162, 10, 3, 233, + 169, 24, 235, 48, 230, 163, 230, 162, 10, 3, 233, 169, 24, 144, 10, 3, + 233, 169, 24, 230, 113, 230, 162, 10, 3, 233, 169, 24, 223, 227, 230, + 162, 10, 3, 233, 169, 24, 222, 88, 10, 3, 233, 169, 24, 222, 89, 202, + 105, 10, 3, 233, 169, 24, 221, 24, 10, 3, 233, 169, 24, 177, 10, 3, 233, + 169, 24, 220, 97, 24, 220, 96, 10, 3, 233, 169, 24, 219, 209, 10, 3, 233, + 169, 24, 219, 36, 10, 3, 233, 169, 24, 197, 120, 10, 3, 233, 169, 24, + 197, 109, 10, 3, 231, 233, 10, 3, 231, 234, 230, 162, 10, 3, 231, 231, + 10, 3, 231, 232, 24, 41, 102, 238, 1, 102, 144, 10, 3, 231, 232, 24, 41, + 102, 144, 10, 3, 231, 232, 24, 41, 102, 223, 226, 10, 3, 231, 232, 24, + 251, 156, 200, 20, 102, 200, 166, 10, 3, 231, 232, 24, 250, 224, 10, 3, + 231, 232, 24, 250, 53, 10, 3, 231, 232, 24, 250, 52, 102, 231, 215, 10, + 3, 231, 232, 24, 248, 241, 10, 3, 231, 232, 24, 248, 194, 102, 167, 10, + 3, 231, 232, 24, 247, 89, 10, 3, 231, 232, 24, 247, 90, 102, 167, 10, 3, + 231, 232, 24, 238, 0, 10, 3, 231, 232, 24, 237, 16, 10, 3, 231, 232, 24, + 236, 228, 24, 204, 12, 10, 3, 231, 232, 24, 235, 60, 10, 3, 231, 232, 24, + 234, 124, 10, 3, 231, 232, 24, 234, 125, 102, 177, 10, 3, 231, 232, 24, + 234, 88, 10, 3, 231, 232, 24, 234, 89, 24, 231, 202, 200, 19, 10, 3, 231, + 232, 24, 231, 202, 200, 19, 10, 3, 231, 232, 24, 231, 193, 10, 3, 231, + 232, 24, 231, 46, 10, 3, 231, 232, 24, 231, 44, 10, 3, 231, 232, 24, 231, + 45, 102, 64, 10, 3, 231, 232, 24, 231, 28, 102, 201, 184, 10, 3, 231, + 232, 24, 230, 113, 102, 219, 37, 102, 233, 252, 10, 3, 231, 232, 24, 230, + 81, 10, 3, 231, 232, 24, 230, 82, 102, 177, 10, 3, 231, 232, 24, 229, + 179, 102, 219, 209, 10, 3, 231, 232, 24, 228, 173, 10, 3, 231, 232, 24, + 223, 227, 230, 162, 10, 3, 231, 232, 24, 223, 91, 102, 228, 182, 102, + 250, 53, 10, 3, 231, 232, 24, 222, 129, 10, 3, 231, 232, 24, 222, 88, 10, + 3, 231, 232, 24, 221, 190, 10, 3, 231, 232, 24, 221, 191, 102, 220, 96, + 10, 3, 231, 232, 24, 221, 25, 102, 250, 224, 10, 3, 231, 232, 24, 177, + 10, 3, 231, 232, 24, 217, 49, 102, 234, 88, 10, 3, 231, 232, 24, 216, + 175, 10, 3, 231, 232, 24, 212, 230, 10, 3, 231, 232, 24, 212, 231, 136, + 212, 230, 10, 3, 231, 232, 24, 166, 10, 3, 231, 232, 24, 206, 63, 10, 3, + 231, 232, 24, 206, 25, 10, 3, 231, 232, 24, 204, 12, 10, 3, 231, 232, 24, + 204, 13, 102, 198, 15, 10, 3, 231, 232, 24, 203, 234, 10, 3, 231, 232, + 24, 201, 129, 10, 3, 231, 232, 24, 200, 141, 10, 3, 231, 232, 24, 68, 10, + 3, 231, 232, 24, 197, 109, 10, 3, 231, 232, 24, 197, 110, 102, 235, 62, + 10, 3, 231, 232, 136, 231, 231, 10, 3, 231, 226, 10, 3, 231, 227, 238, + 176, 231, 226, 10, 3, 231, 224, 10, 3, 231, 225, 136, 231, 225, 231, 194, + 136, 231, 193, 10, 3, 231, 215, 10, 3, 231, 216, 231, 225, 136, 231, 225, + 231, 194, 136, 231, 193, 10, 3, 231, 214, 10, 3, 231, 212, 10, 3, 231, + 203, 10, 3, 231, 201, 10, 3, 231, 202, 200, 19, 10, 3, 231, 202, 136, + 231, 201, 10, 3, 231, 202, 238, 176, 231, 201, 10, 3, 231, 193, 10, 3, + 231, 192, 10, 3, 231, 186, 10, 3, 231, 127, 10, 3, 231, 128, 24, 221, 0, + 10, 3, 231, 46, 10, 3, 231, 47, 24, 71, 10, 3, 231, 47, 24, 68, 10, 3, + 231, 47, 238, 176, 231, 46, 10, 3, 231, 44, 10, 3, 231, 45, 136, 231, 44, + 10, 3, 231, 45, 238, 176, 231, 44, 10, 3, 231, 41, 10, 3, 231, 27, 10, 3, + 231, 28, 230, 162, 10, 3, 231, 25, 10, 3, 231, 26, 24, 41, 102, 223, 226, + 10, 3, 231, 26, 24, 231, 202, 200, 19, 10, 3, 231, 26, 24, 223, 226, 10, + 3, 231, 26, 24, 219, 37, 102, 223, 226, 10, 3, 231, 26, 24, 166, 10, 3, + 231, 20, 10, 3, 231, 18, 10, 3, 231, 19, 238, 176, 231, 18, 10, 3, 231, + 19, 24, 248, 241, 10, 3, 231, 19, 24, 200, 141, 10, 3, 231, 19, 200, 19, + 10, 3, 230, 186, 10, 3, 230, 187, 238, 176, 230, 186, 10, 3, 230, 184, + 10, 3, 230, 185, 24, 222, 129, 10, 3, 230, 185, 24, 222, 130, 24, 223, + 227, 230, 162, 10, 3, 230, 185, 24, 212, 230, 10, 3, 230, 185, 24, 206, + 64, 102, 198, 33, 10, 3, 230, 185, 230, 162, 10, 3, 230, 175, 10, 3, 230, + 176, 24, 41, 102, 221, 0, 10, 3, 230, 176, 24, 221, 0, 10, 3, 230, 176, + 136, 230, 176, 219, 27, 10, 3, 230, 167, 10, 3, 230, 165, 10, 3, 230, + 166, 24, 204, 12, 10, 3, 230, 156, 10, 3, 230, 155, 10, 3, 230, 151, 10, + 3, 230, 150, 10, 3, 144, 10, 3, 230, 113, 200, 19, 10, 3, 230, 113, 230, + 162, 10, 3, 230, 81, 10, 3, 229, 178, 10, 3, 229, 179, 24, 250, 53, 10, + 3, 229, 179, 24, 250, 51, 10, 3, 229, 179, 24, 248, 241, 10, 3, 229, 179, + 24, 236, 194, 10, 3, 229, 179, 24, 231, 224, 10, 3, 229, 179, 24, 221, + 179, 10, 3, 229, 179, 24, 212, 230, 10, 3, 229, 179, 24, 204, 12, 10, 3, + 229, 179, 24, 68, 10, 3, 228, 181, 10, 3, 228, 173, 10, 3, 228, 174, 24, + 250, 224, 10, 3, 228, 174, 24, 230, 81, 10, 3, 228, 174, 24, 222, 88, 10, + 3, 228, 174, 24, 219, 153, 10, 3, 228, 174, 24, 197, 109, 10, 3, 228, + 168, 10, 3, 70, 10, 3, 228, 97, 64, 10, 3, 228, 53, 10, 3, 223, 254, 10, + 3, 223, 255, 136, 223, 255, 247, 89, 10, 3, 223, 255, 136, 223, 255, 202, + 105, 10, 3, 223, 229, 10, 3, 223, 226, 10, 3, 223, 227, 236, 254, 10, 3, + 223, 227, 207, 151, 10, 3, 223, 227, 136, 223, 227, 203, 218, 136, 203, + 218, 197, 110, 136, 197, 109, 10, 3, 223, 227, 230, 162, 10, 3, 223, 218, + 10, 3, 223, 219, 24, 231, 202, 200, 19, 10, 3, 223, 217, 10, 3, 223, 207, + 10, 3, 223, 208, 24, 200, 141, 10, 3, 223, 208, 238, 176, 223, 207, 10, + 3, 223, 208, 211, 170, 223, 207, 10, 3, 223, 208, 202, 105, 10, 3, 223, + 200, 10, 3, 223, 190, 10, 3, 223, 105, 10, 3, 223, 90, 10, 3, 160, 10, 3, + 222, 174, 24, 64, 10, 3, 222, 174, 24, 251, 125, 10, 3, 222, 174, 24, + 251, 126, 102, 221, 24, 10, 3, 222, 174, 24, 250, 51, 10, 3, 222, 174, + 24, 248, 241, 10, 3, 222, 174, 24, 248, 220, 10, 3, 222, 174, 24, 161, + 10, 3, 222, 174, 24, 248, 41, 10, 3, 222, 174, 24, 234, 15, 10, 3, 222, + 174, 24, 233, 252, 10, 3, 222, 174, 24, 231, 233, 10, 3, 222, 174, 24, + 231, 215, 10, 3, 222, 174, 24, 231, 202, 200, 19, 10, 3, 222, 174, 24, + 231, 193, 10, 3, 222, 174, 24, 231, 194, 102, 204, 63, 102, 64, 10, 3, + 222, 174, 24, 231, 46, 10, 3, 222, 174, 24, 231, 27, 10, 3, 222, 174, 24, + 231, 19, 102, 206, 25, 10, 3, 222, 174, 24, 231, 19, 238, 176, 231, 18, + 10, 3, 222, 174, 24, 230, 186, 10, 3, 222, 174, 24, 230, 155, 10, 3, 222, + 174, 24, 223, 226, 10, 3, 222, 174, 24, 223, 207, 10, 3, 222, 174, 24, + 222, 129, 10, 3, 222, 174, 24, 221, 204, 10, 3, 222, 174, 24, 221, 190, + 10, 3, 222, 174, 24, 219, 209, 10, 3, 222, 174, 24, 219, 36, 10, 3, 222, + 174, 24, 217, 48, 10, 3, 222, 174, 24, 217, 49, 102, 235, 62, 10, 3, 222, + 174, 24, 217, 49, 102, 231, 46, 10, 3, 222, 174, 24, 217, 49, 102, 200, + 79, 10, 3, 222, 174, 24, 216, 175, 10, 3, 222, 174, 24, 216, 176, 102, + 212, 225, 10, 3, 222, 174, 24, 214, 214, 10, 3, 222, 174, 24, 212, 230, + 10, 3, 222, 174, 24, 210, 51, 10, 3, 222, 174, 24, 206, 218, 10, 3, 222, + 174, 24, 188, 10, 3, 222, 174, 24, 206, 25, 10, 3, 222, 174, 24, 204, 64, + 10, 3, 222, 174, 24, 204, 12, 10, 3, 222, 174, 24, 203, 234, 10, 3, 222, + 174, 24, 203, 164, 10, 3, 222, 174, 24, 203, 104, 10, 3, 222, 174, 24, + 201, 138, 10, 3, 222, 174, 24, 200, 112, 10, 3, 222, 174, 24, 68, 10, 3, + 222, 174, 24, 197, 120, 10, 3, 222, 174, 24, 197, 109, 10, 3, 222, 174, + 24, 197, 80, 24, 166, 10, 3, 222, 174, 24, 197, 3, 10, 3, 222, 174, 24, + 192, 30, 10, 3, 222, 160, 10, 3, 222, 161, 238, 176, 222, 160, 10, 3, + 222, 149, 10, 3, 222, 146, 10, 3, 222, 144, 10, 3, 222, 143, 10, 3, 222, + 141, 10, 3, 222, 142, 136, 222, 141, 10, 3, 222, 129, 10, 3, 222, 130, + 24, 223, 227, 230, 162, 10, 3, 222, 125, 10, 3, 222, 126, 24, 248, 241, + 10, 3, 222, 126, 238, 176, 222, 125, 10, 3, 222, 123, 10, 3, 222, 122, + 10, 3, 222, 88, 10, 3, 222, 89, 220, 164, 24, 124, 136, 220, 164, 24, 68, + 10, 3, 222, 89, 136, 222, 89, 220, 164, 24, 124, 136, 220, 164, 24, 68, + 10, 3, 222, 21, 10, 3, 221, 204, 10, 3, 221, 205, 24, 248, 241, 10, 3, + 221, 205, 24, 68, 10, 3, 221, 205, 24, 197, 109, 10, 3, 221, 190, 10, 3, + 221, 179, 10, 3, 221, 165, 10, 3, 221, 164, 10, 3, 221, 162, 10, 3, 221, + 163, 136, 221, 162, 10, 3, 221, 33, 10, 3, 221, 34, 136, 229, 179, 24, + 250, 52, 221, 34, 136, 229, 179, 24, 250, 51, 10, 3, 221, 24, 10, 3, 221, + 22, 10, 3, 221, 23, 196, 137, 20, 10, 3, 221, 21, 10, 3, 221, 13, 10, 3, + 221, 14, 230, 162, 10, 3, 221, 12, 10, 3, 221, 0, 10, 3, 221, 1, 211, + 170, 221, 0, 10, 3, 220, 249, 10, 3, 220, 226, 10, 3, 177, 10, 3, 220, + 163, 10, 3, 220, 164, 24, 64, 10, 3, 220, 164, 24, 41, 102, 238, 1, 102, + 144, 10, 3, 220, 164, 24, 41, 102, 231, 193, 10, 3, 220, 164, 24, 41, + 102, 220, 96, 10, 3, 220, 164, 24, 251, 35, 10, 3, 220, 164, 24, 250, + 224, 10, 3, 220, 164, 24, 250, 54, 192, 26, 200, 19, 10, 3, 220, 164, 24, + 248, 241, 10, 3, 220, 164, 24, 248, 41, 10, 3, 220, 164, 24, 237, 195, + 10, 3, 220, 164, 24, 234, 88, 10, 3, 220, 164, 24, 231, 233, 10, 3, 220, + 164, 24, 231, 193, 10, 3, 220, 164, 24, 230, 175, 10, 3, 220, 164, 24, + 230, 176, 102, 230, 175, 10, 3, 220, 164, 24, 144, 10, 3, 220, 164, 24, + 230, 81, 10, 3, 220, 164, 24, 229, 179, 24, 212, 230, 10, 3, 220, 164, + 24, 223, 227, 230, 162, 10, 3, 220, 164, 24, 223, 207, 10, 3, 220, 164, + 24, 223, 208, 102, 144, 10, 3, 220, 164, 24, 223, 208, 102, 219, 36, 10, + 3, 220, 164, 24, 221, 204, 10, 3, 220, 164, 24, 221, 179, 10, 3, 220, + 164, 24, 221, 24, 10, 3, 220, 164, 24, 221, 13, 10, 3, 220, 164, 24, 221, + 14, 102, 229, 179, 102, 64, 10, 3, 220, 164, 24, 220, 163, 10, 3, 220, + 164, 24, 219, 153, 10, 3, 220, 164, 24, 219, 36, 10, 3, 220, 164, 24, + 219, 21, 10, 3, 220, 164, 24, 217, 48, 10, 3, 220, 164, 24, 217, 49, 102, + 234, 88, 10, 3, 220, 164, 24, 215, 189, 10, 3, 220, 164, 24, 214, 214, + 10, 3, 220, 164, 24, 204, 13, 102, 201, 129, 10, 3, 220, 164, 24, 203, + 214, 102, 231, 19, 102, 234, 15, 10, 3, 220, 164, 24, 203, 214, 102, 231, + 19, 200, 19, 10, 3, 220, 164, 24, 203, 162, 10, 3, 220, 164, 24, 203, + 163, 102, 203, 162, 10, 3, 220, 164, 24, 201, 129, 10, 3, 220, 164, 24, + 200, 155, 10, 3, 220, 164, 24, 200, 141, 10, 3, 220, 164, 24, 200, 80, + 102, 41, 102, 201, 185, 102, 181, 10, 3, 220, 164, 24, 68, 10, 3, 220, + 164, 24, 124, 102, 64, 10, 3, 220, 164, 24, 124, 102, 124, 102, 68, 10, + 3, 220, 164, 24, 197, 121, 102, 250, 53, 10, 3, 220, 164, 24, 197, 109, + 10, 3, 220, 164, 24, 197, 3, 10, 3, 220, 164, 202, 105, 10, 3, 220, 161, + 10, 3, 220, 162, 24, 204, 12, 10, 3, 220, 162, 24, 204, 13, 102, 201, + 129, 10, 3, 220, 162, 230, 162, 10, 3, 220, 162, 230, 163, 136, 220, 162, + 230, 163, 204, 12, 10, 3, 220, 157, 10, 3, 220, 96, 10, 3, 220, 97, 24, + 220, 96, 10, 3, 220, 94, 10, 3, 220, 95, 24, 221, 0, 10, 3, 220, 95, 24, + 221, 1, 102, 206, 218, 10, 3, 219, 209, 10, 3, 219, 190, 10, 3, 219, 178, + 10, 3, 219, 153, 10, 3, 219, 36, 10, 3, 219, 37, 24, 248, 241, 10, 3, + 219, 34, 10, 3, 219, 35, 24, 251, 35, 10, 3, 219, 35, 24, 248, 241, 10, + 3, 219, 35, 24, 233, 252, 10, 3, 219, 35, 24, 233, 253, 200, 19, 10, 3, + 219, 35, 24, 231, 202, 200, 19, 10, 3, 219, 35, 24, 229, 179, 24, 248, + 241, 10, 3, 219, 35, 24, 223, 207, 10, 3, 219, 35, 24, 222, 146, 10, 3, + 219, 35, 24, 222, 144, 10, 3, 219, 35, 24, 222, 145, 102, 250, 53, 10, 3, + 219, 35, 24, 221, 204, 10, 3, 219, 35, 24, 220, 185, 102, 250, 53, 10, 3, + 219, 35, 24, 220, 163, 10, 3, 219, 35, 24, 217, 49, 102, 234, 88, 10, 3, + 219, 35, 24, 214, 214, 10, 3, 219, 35, 24, 213, 22, 10, 3, 219, 35, 24, + 203, 126, 102, 250, 53, 10, 3, 219, 35, 24, 203, 96, 102, 247, 124, 10, + 3, 219, 35, 24, 198, 33, 10, 3, 219, 35, 200, 19, 10, 3, 219, 35, 238, + 176, 219, 34, 10, 3, 219, 35, 211, 170, 219, 34, 10, 3, 219, 35, 202, + 105, 10, 3, 219, 35, 203, 249, 10, 3, 219, 33, 10, 3, 219, 27, 10, 3, + 219, 28, 136, 219, 27, 10, 3, 219, 28, 211, 170, 219, 27, 10, 3, 219, 28, + 203, 249, 10, 3, 219, 24, 10, 3, 219, 21, 10, 3, 219, 19, 10, 3, 219, 20, + 136, 219, 19, 10, 3, 219, 20, 136, 219, 20, 231, 194, 136, 231, 193, 10, + 3, 172, 10, 3, 217, 228, 24, 200, 141, 10, 3, 217, 228, 230, 162, 10, 3, + 217, 220, 10, 3, 217, 188, 10, 3, 217, 135, 10, 3, 217, 110, 10, 3, 217, + 109, 10, 3, 217, 48, 10, 3, 216, 248, 10, 3, 216, 175, 10, 3, 216, 120, + 10, 3, 215, 241, 10, 3, 215, 242, 136, 215, 241, 10, 3, 215, 226, 10, 3, + 215, 227, 230, 162, 10, 3, 215, 207, 10, 3, 215, 193, 10, 3, 215, 189, + 10, 3, 215, 190, 24, 64, 10, 3, 215, 190, 24, 221, 0, 10, 3, 215, 190, + 24, 192, 112, 10, 3, 215, 190, 136, 215, 189, 10, 3, 215, 190, 136, 215, + 190, 24, 41, 102, 181, 10, 3, 215, 190, 238, 176, 215, 189, 10, 3, 215, + 187, 10, 3, 215, 188, 24, 64, 10, 3, 215, 188, 24, 41, 102, 237, 16, 10, + 3, 215, 188, 24, 237, 16, 10, 3, 215, 188, 230, 162, 10, 3, 181, 10, 3, + 215, 87, 10, 3, 215, 74, 10, 3, 215, 75, 223, 120, 10, 3, 215, 75, 24, + 203, 165, 200, 19, 10, 3, 215, 75, 211, 170, 215, 74, 10, 3, 215, 73, 10, + 3, 215, 66, 212, 216, 10, 3, 215, 65, 10, 3, 215, 64, 10, 3, 214, 214, + 10, 3, 214, 215, 24, 64, 10, 3, 214, 215, 24, 197, 109, 10, 3, 214, 215, + 203, 249, 10, 3, 214, 60, 10, 3, 214, 61, 24, 71, 10, 3, 214, 51, 10, 3, + 214, 21, 10, 3, 214, 22, 24, 231, 202, 200, 19, 10, 3, 214, 22, 24, 231, + 194, 102, 231, 202, 200, 19, 10, 3, 214, 17, 10, 3, 214, 18, 24, 250, + 224, 10, 3, 214, 18, 24, 250, 53, 10, 3, 214, 18, 24, 250, 54, 102, 250, + 53, 10, 3, 214, 18, 24, 230, 175, 10, 3, 214, 18, 24, 217, 49, 102, 231, + 202, 200, 19, 10, 3, 214, 18, 24, 214, 214, 10, 3, 214, 18, 24, 212, 230, + 10, 3, 214, 18, 24, 204, 12, 10, 3, 214, 18, 24, 204, 13, 102, 41, 250, + 224, 10, 3, 214, 18, 24, 204, 13, 102, 250, 53, 10, 3, 214, 18, 24, 204, + 13, 102, 250, 54, 102, 250, 53, 10, 3, 214, 18, 24, 197, 121, 102, 250, + 53, 10, 3, 214, 18, 24, 197, 3, 10, 3, 214, 5, 10, 3, 213, 22, 10, 3, + 212, 247, 10, 3, 212, 230, 10, 3, 212, 231, 220, 162, 24, 231, 193, 10, + 3, 212, 231, 220, 162, 24, 217, 110, 10, 3, 212, 231, 220, 162, 24, 206, + 63, 10, 3, 212, 231, 220, 162, 24, 206, 64, 136, 212, 231, 220, 162, 24, + 206, 63, 10, 3, 212, 231, 220, 162, 24, 197, 3, 10, 3, 212, 231, 200, 19, + 10, 3, 212, 231, 136, 212, 230, 10, 3, 212, 231, 238, 176, 212, 230, 10, + 3, 212, 231, 238, 176, 212, 231, 220, 162, 136, 220, 161, 10, 3, 212, + 225, 10, 3, 212, 226, 251, 156, 24, 250, 47, 10, 3, 212, 226, 251, 156, + 24, 248, 41, 10, 3, 212, 226, 251, 156, 24, 235, 56, 10, 3, 212, 226, + 251, 156, 24, 230, 175, 10, 3, 212, 226, 251, 156, 24, 223, 227, 230, + 162, 10, 3, 212, 226, 251, 156, 24, 222, 144, 10, 3, 212, 226, 251, 156, + 24, 177, 10, 3, 212, 226, 251, 156, 24, 214, 214, 10, 3, 212, 226, 251, + 156, 24, 203, 93, 10, 3, 212, 226, 251, 156, 24, 197, 120, 10, 3, 212, + 226, 221, 163, 24, 248, 41, 10, 3, 212, 226, 221, 163, 24, 248, 42, 68, + 10, 3, 166, 10, 3, 211, 67, 10, 3, 211, 25, 10, 3, 210, 253, 10, 3, 210, + 109, 10, 3, 210, 51, 10, 3, 210, 52, 24, 64, 10, 3, 210, 52, 24, 251, + 238, 10, 3, 210, 52, 24, 248, 41, 10, 3, 210, 52, 24, 247, 124, 10, 3, + 210, 52, 24, 71, 10, 3, 210, 52, 24, 70, 10, 3, 210, 52, 24, 228, 53, 10, + 3, 210, 52, 24, 68, 10, 3, 210, 52, 24, 197, 120, 10, 3, 210, 52, 238, + 176, 210, 51, 10, 3, 209, 245, 10, 3, 209, 246, 24, 222, 125, 10, 3, 209, + 246, 24, 197, 109, 10, 3, 209, 246, 24, 192, 112, 10, 3, 209, 246, 211, + 170, 209, 245, 10, 3, 167, 10, 3, 208, 66, 10, 3, 207, 151, 10, 3, 206, + 218, 10, 3, 188, 10, 3, 206, 80, 212, 216, 10, 3, 206, 79, 10, 3, 206, + 80, 24, 64, 10, 3, 206, 80, 24, 235, 62, 10, 3, 206, 80, 24, 235, 60, 10, + 3, 206, 80, 24, 144, 10, 3, 206, 80, 24, 222, 129, 10, 3, 206, 80, 24, + 221, 0, 10, 3, 206, 80, 24, 219, 19, 10, 3, 206, 80, 24, 216, 175, 10, 3, + 206, 80, 24, 212, 230, 10, 3, 206, 80, 24, 206, 63, 10, 3, 206, 80, 24, + 203, 234, 10, 3, 206, 80, 24, 200, 166, 10, 3, 206, 80, 24, 197, 120, 10, + 3, 206, 80, 24, 197, 115, 10, 3, 206, 80, 24, 197, 84, 10, 3, 206, 80, + 24, 197, 27, 10, 3, 206, 80, 24, 197, 3, 10, 3, 206, 80, 136, 206, 79, + 10, 3, 206, 80, 230, 162, 10, 3, 206, 63, 10, 3, 206, 64, 220, 164, 24, + 250, 51, 10, 3, 206, 34, 10, 3, 206, 25, 10, 3, 204, 64, 10, 3, 204, 62, + 10, 3, 204, 63, 24, 64, 10, 3, 204, 63, 24, 248, 241, 10, 3, 204, 63, 24, + 231, 18, 10, 3, 204, 63, 24, 214, 214, 10, 3, 204, 63, 24, 203, 162, 10, + 3, 204, 63, 24, 198, 15, 10, 3, 204, 63, 24, 68, 10, 3, 204, 63, 24, 124, + 102, 64, 10, 3, 204, 60, 10, 3, 204, 58, 10, 3, 204, 30, 10, 3, 204, 12, + 10, 3, 204, 13, 228, 181, 10, 3, 204, 13, 136, 204, 13, 231, 225, 136, + 231, 225, 231, 194, 136, 231, 193, 10, 3, 204, 13, 136, 204, 13, 200, + 167, 136, 200, 167, 231, 194, 136, 231, 193, 10, 3, 204, 5, 10, 3, 204, + 0, 10, 3, 203, 252, 10, 3, 203, 251, 10, 3, 203, 248, 10, 3, 203, 234, + 10, 3, 203, 235, 24, 64, 10, 3, 203, 235, 24, 223, 207, 10, 3, 203, 228, + 10, 3, 203, 229, 24, 64, 10, 3, 203, 229, 24, 248, 221, 10, 3, 203, 229, + 24, 247, 100, 10, 3, 203, 229, 24, 236, 215, 10, 3, 203, 229, 24, 231, + 193, 10, 3, 203, 229, 24, 223, 226, 10, 3, 203, 229, 24, 223, 227, 230, + 162, 10, 3, 203, 229, 24, 220, 249, 10, 3, 203, 229, 24, 219, 21, 10, 3, + 203, 229, 24, 215, 226, 10, 3, 203, 229, 24, 206, 63, 10, 3, 203, 222, + 10, 3, 203, 217, 10, 3, 203, 218, 200, 19, 10, 3, 203, 218, 136, 203, + 218, 247, 90, 136, 247, 89, 10, 3, 203, 213, 10, 3, 203, 164, 10, 3, 203, + 165, 136, 223, 121, 203, 164, 10, 3, 203, 162, 10, 3, 203, 160, 10, 3, + 203, 125, 10, 3, 203, 126, 230, 162, 10, 3, 203, 104, 10, 3, 203, 102, + 10, 3, 203, 103, 136, 203, 103, 203, 162, 10, 3, 203, 95, 10, 3, 203, 93, + 10, 3, 201, 184, 10, 3, 201, 185, 136, 201, 184, 10, 3, 201, 141, 10, 3, + 201, 140, 10, 3, 201, 138, 10, 3, 201, 129, 10, 3, 201, 128, 10, 3, 201, + 100, 10, 3, 201, 99, 10, 3, 189, 10, 3, 200, 181, 250, 37, 10, 3, 200, + 181, 24, 229, 178, 10, 3, 200, 181, 24, 216, 175, 10, 3, 200, 181, 230, + 162, 10, 3, 200, 166, 10, 3, 200, 167, 136, 200, 167, 214, 61, 136, 214, + 61, 236, 195, 136, 236, 194, 10, 3, 200, 167, 202, 105, 10, 3, 200, 155, + 10, 3, 190, 24, 248, 41, 10, 3, 190, 24, 230, 175, 10, 3, 190, 24, 204, + 12, 10, 3, 190, 24, 203, 164, 10, 3, 190, 24, 198, 33, 10, 3, 190, 24, + 197, 109, 10, 3, 200, 141, 10, 3, 200, 112, 10, 3, 200, 79, 10, 3, 200, + 80, 230, 162, 10, 3, 199, 128, 10, 3, 199, 129, 200, 19, 10, 3, 199, 92, + 10, 3, 199, 69, 10, 3, 199, 70, 24, 200, 141, 10, 3, 199, 70, 136, 199, + 69, 10, 3, 199, 70, 136, 199, 70, 231, 225, 136, 231, 225, 231, 194, 136, + 231, 193, 10, 3, 198, 45, 10, 3, 198, 33, 10, 3, 198, 31, 10, 3, 198, 27, + 10, 3, 198, 15, 10, 3, 198, 16, 136, 198, 16, 192, 113, 136, 192, 112, + 10, 3, 68, 10, 3, 124, 230, 175, 10, 3, 124, 124, 68, 10, 3, 124, 136, + 124, 211, 78, 136, 211, 78, 231, 194, 136, 231, 193, 10, 3, 124, 136, + 124, 201, 101, 136, 201, 100, 10, 3, 124, 136, 124, 124, 207, 168, 136, + 124, 207, 167, 10, 3, 197, 120, 10, 3, 197, 115, 10, 3, 197, 109, 10, 3, + 197, 110, 220, 249, 10, 3, 197, 110, 24, 248, 241, 10, 3, 197, 110, 24, + 216, 175, 10, 3, 197, 110, 24, 124, 102, 124, 102, 68, 10, 3, 197, 110, + 24, 124, 102, 124, 102, 124, 230, 162, 10, 3, 197, 110, 230, 162, 10, 3, + 197, 110, 203, 249, 10, 3, 197, 110, 203, 250, 24, 248, 241, 10, 3, 197, + 105, 10, 3, 197, 84, 10, 3, 197, 85, 24, 220, 163, 10, 3, 197, 85, 24, + 217, 49, 102, 238, 0, 10, 3, 197, 85, 24, 204, 62, 10, 3, 197, 85, 24, + 68, 10, 3, 197, 83, 10, 3, 197, 79, 10, 3, 197, 80, 24, 222, 88, 10, 3, + 197, 80, 24, 166, 10, 3, 197, 77, 10, 3, 197, 78, 230, 162, 10, 3, 197, + 27, 10, 3, 197, 28, 238, 176, 197, 27, 10, 3, 197, 28, 203, 249, 10, 3, + 197, 25, 10, 3, 197, 26, 24, 41, 102, 144, 10, 3, 197, 26, 24, 41, 102, + 181, 10, 3, 197, 26, 24, 251, 35, 10, 3, 197, 26, 24, 144, 10, 3, 197, + 26, 24, 212, 230, 10, 3, 197, 26, 24, 197, 120, 10, 3, 197, 26, 24, 197, + 121, 102, 250, 53, 10, 3, 197, 26, 24, 197, 121, 102, 248, 41, 10, 3, + 197, 24, 10, 3, 197, 21, 10, 3, 197, 20, 10, 3, 197, 16, 10, 3, 197, 17, + 24, 64, 10, 3, 197, 17, 24, 250, 47, 10, 3, 197, 17, 24, 161, 10, 3, 197, + 17, 24, 235, 49, 10, 3, 197, 17, 24, 231, 233, 10, 3, 197, 17, 24, 231, + 215, 10, 3, 197, 17, 24, 231, 202, 200, 19, 10, 3, 197, 17, 24, 231, 193, + 10, 3, 197, 17, 24, 230, 186, 10, 3, 197, 17, 24, 144, 10, 3, 197, 17, + 24, 223, 226, 10, 3, 197, 17, 24, 223, 207, 10, 3, 197, 17, 24, 223, 90, + 10, 3, 197, 17, 24, 221, 204, 10, 3, 197, 17, 24, 219, 19, 10, 3, 197, + 17, 24, 216, 120, 10, 3, 197, 17, 24, 166, 10, 3, 197, 17, 24, 204, 12, + 10, 3, 197, 17, 24, 203, 102, 10, 3, 197, 17, 24, 198, 45, 10, 3, 197, + 17, 24, 124, 102, 230, 175, 10, 3, 197, 17, 24, 197, 109, 10, 3, 197, 17, + 24, 197, 14, 10, 3, 197, 14, 10, 3, 197, 15, 24, 68, 10, 3, 197, 3, 10, + 3, 197, 4, 24, 64, 10, 3, 197, 4, 24, 221, 33, 10, 3, 197, 4, 24, 221, 0, + 10, 3, 197, 4, 24, 200, 141, 10, 3, 196, 255, 10, 3, 197, 2, 10, 3, 197, + 0, 10, 3, 196, 252, 10, 3, 196, 240, 10, 3, 196, 241, 24, 222, 88, 10, 3, + 196, 238, 10, 3, 192, 112, 10, 3, 192, 113, 200, 19, 10, 3, 192, 113, + 108, 24, 221, 0, 10, 3, 192, 108, 10, 3, 192, 100, 10, 3, 192, 84, 10, 3, + 192, 30, 10, 3, 192, 31, 136, 192, 30, 10, 3, 192, 29, 10, 3, 192, 27, + 10, 3, 192, 28, 222, 148, 200, 19, 10, 3, 192, 22, 10, 3, 192, 13, 10, 3, + 191, 252, 10, 3, 191, 250, 10, 3, 191, 251, 24, 64, 10, 3, 191, 249, 10, + 3, 191, 248, 10, 3, 222, 113, 234, 121, 10, 3, 251, 239, 24, 212, 230, + 10, 3, 251, 156, 24, 64, 10, 3, 250, 238, 24, 221, 15, 10, 3, 237, 247, + 221, 163, 24, 197, 121, 102, 217, 110, 10, 3, 237, 245, 10, 3, 236, 195, + 102, 203, 164, 10, 3, 235, 61, 24, 204, 12, 10, 3, 233, 169, 24, 230, + 175, 10, 3, 233, 169, 24, 204, 12, 10, 3, 231, 232, 24, 250, 225, 102, + 222, 130, 102, 64, 10, 3, 231, 232, 24, 250, 51, 10, 3, 231, 157, 10, 3, + 231, 35, 10, 3, 228, 153, 10, 3, 222, 174, 24, 250, 188, 10, 3, 222, 174, + 24, 250, 50, 10, 3, 222, 174, 24, 231, 18, 10, 3, 222, 174, 24, 230, 175, + 10, 3, 222, 174, 24, 229, 179, 24, 250, 51, 10, 3, 222, 174, 24, 219, 19, + 10, 3, 222, 174, 24, 166, 10, 3, 222, 174, 24, 203, 156, 10, 3, 222, 174, + 24, 198, 45, 10, 3, 222, 174, 24, 197, 25, 10, 3, 220, 164, 24, 231, 46, + 10, 3, 219, 35, 203, 250, 24, 248, 241, 10, 3, 219, 35, 24, 233, 253, + 102, 220, 96, 10, 3, 219, 35, 24, 203, 164, 10, 3, 216, 247, 10, 3, 215, + 188, 24, 192, 112, 10, 3, 215, 86, 10, 3, 214, 20, 10, 3, 214, 19, 10, 3, + 214, 18, 24, 248, 221, 10, 3, 214, 18, 24, 231, 46, 10, 3, 212, 248, 207, + 16, 214, 12, 237, 94, 10, 3, 210, 110, 250, 37, 10, 3, 209, 249, 10, 3, + 206, 80, 24, 223, 227, 230, 162, 10, 3, 199, 120, 10, 3, 197, 85, 24, + 217, 48, 10, 3, 124, 68, 10, 162, 3, 103, 250, 53, 10, 162, 3, 112, 250, + 53, 10, 162, 3, 232, 119, 250, 53, 10, 162, 3, 232, 214, 250, 53, 10, + 162, 3, 203, 41, 250, 53, 10, 162, 3, 204, 146, 250, 53, 10, 162, 3, 234, + 148, 250, 53, 10, 162, 3, 214, 16, 250, 53, 10, 162, 3, 112, 236, 194, + 10, 162, 3, 232, 119, 236, 194, 10, 162, 3, 232, 214, 236, 194, 10, 162, + 3, 203, 41, 236, 194, 10, 162, 3, 204, 146, 236, 194, 10, 162, 3, 234, + 148, 236, 194, 10, 162, 3, 214, 16, 236, 194, 10, 162, 3, 232, 119, 68, + 10, 162, 3, 232, 214, 68, 10, 162, 3, 203, 41, 68, 10, 162, 3, 204, 146, + 68, 10, 162, 3, 234, 148, 68, 10, 162, 3, 214, 16, 68, 10, 162, 3, 90, + 231, 129, 10, 162, 3, 103, 231, 129, 10, 162, 3, 112, 231, 129, 10, 162, + 3, 232, 119, 231, 129, 10, 162, 3, 232, 214, 231, 129, 10, 162, 3, 203, + 41, 231, 129, 10, 162, 3, 204, 146, 231, 129, 10, 162, 3, 234, 148, 231, + 129, 10, 162, 3, 214, 16, 231, 129, 10, 162, 3, 90, 231, 126, 10, 162, 3, + 103, 231, 126, 10, 162, 3, 112, 231, 126, 10, 162, 3, 232, 119, 231, 126, + 10, 162, 3, 232, 214, 231, 126, 10, 162, 3, 103, 204, 30, 10, 162, 3, + 112, 204, 30, 10, 162, 3, 112, 204, 31, 196, 137, 20, 10, 162, 3, 232, + 119, 204, 30, 10, 162, 3, 232, 214, 204, 30, 10, 162, 3, 203, 41, 204, + 30, 10, 162, 3, 204, 146, 204, 30, 10, 162, 3, 234, 148, 204, 30, 10, + 162, 3, 214, 16, 204, 30, 10, 162, 3, 90, 204, 23, 10, 162, 3, 103, 204, + 23, 10, 162, 3, 112, 204, 23, 10, 162, 3, 112, 204, 24, 196, 137, 20, 10, + 162, 3, 232, 119, 204, 23, 10, 162, 3, 232, 214, 204, 23, 10, 162, 3, + 204, 31, 24, 231, 216, 102, 236, 194, 10, 162, 3, 204, 31, 24, 231, 216, + 102, 216, 120, 10, 162, 3, 90, 247, 85, 10, 162, 3, 103, 247, 85, 10, + 162, 3, 112, 247, 85, 10, 162, 3, 112, 247, 86, 196, 137, 20, 10, 162, 3, + 232, 119, 247, 85, 10, 162, 3, 232, 214, 247, 85, 10, 162, 3, 112, 196, + 137, 232, 136, 233, 254, 10, 162, 3, 112, 196, 137, 232, 136, 233, 251, + 10, 162, 3, 232, 119, 196, 137, 232, 136, 219, 179, 10, 162, 3, 232, 119, + 196, 137, 232, 136, 219, 177, 10, 162, 3, 232, 119, 196, 137, 232, 136, + 219, 180, 64, 10, 162, 3, 232, 119, 196, 137, 232, 136, 219, 180, 249, + 226, 10, 162, 3, 203, 41, 196, 137, 232, 136, 250, 49, 10, 162, 3, 204, + 146, 196, 137, 232, 136, 223, 199, 10, 162, 3, 204, 146, 196, 137, 232, + 136, 223, 201, 64, 10, 162, 3, 204, 146, 196, 137, 232, 136, 223, 201, + 249, 226, 10, 162, 3, 234, 148, 196, 137, 232, 136, 196, 254, 10, 162, 3, + 234, 148, 196, 137, 232, 136, 196, 253, 10, 162, 3, 214, 16, 196, 137, + 232, 136, 223, 215, 10, 162, 3, 214, 16, 196, 137, 232, 136, 223, 214, + 10, 162, 3, 214, 16, 196, 137, 232, 136, 223, 213, 10, 162, 3, 214, 16, + 196, 137, 232, 136, 223, 216, 64, 10, 162, 3, 103, 250, 54, 200, 19, 10, + 162, 3, 112, 250, 54, 200, 19, 10, 162, 3, 232, 119, 250, 54, 200, 19, + 10, 162, 3, 232, 214, 250, 54, 200, 19, 10, 162, 3, 203, 41, 250, 54, + 200, 19, 10, 162, 3, 90, 248, 205, 10, 162, 3, 103, 248, 205, 10, 162, 3, + 112, 248, 205, 10, 162, 3, 232, 119, 248, 205, 10, 162, 3, 232, 119, 248, + 206, 196, 137, 20, 10, 162, 3, 232, 214, 248, 205, 10, 162, 3, 232, 214, + 248, 206, 196, 137, 20, 10, 162, 3, 214, 29, 10, 162, 3, 214, 30, 10, + 162, 3, 90, 233, 250, 10, 162, 3, 103, 233, 250, 10, 162, 3, 90, 199, + 192, 236, 194, 10, 162, 3, 103, 199, 189, 236, 194, 10, 162, 3, 232, 214, + 203, 28, 236, 194, 10, 162, 3, 90, 199, 192, 196, 137, 232, 136, 64, 10, + 162, 3, 103, 199, 189, 196, 137, 232, 136, 64, 10, 162, 3, 90, 234, 144, + 250, 53, 10, 162, 3, 90, 208, 168, 250, 53, 10, 162, 3, 40, 250, 40, 90, + 203, 29, 10, 162, 3, 40, 250, 40, 90, 208, 167, 10, 162, 3, 90, 208, 168, + 230, 156, 10, 162, 3, 90, 138, 230, 156, 10, 162, 3, 234, 122, 90, 199, + 191, 10, 162, 3, 234, 122, 103, 199, 188, 10, 162, 3, 234, 122, 232, 126, + 10, 162, 3, 234, 122, 233, 3, 10, 162, 3, 232, 119, 124, 196, 137, 20, + 10, 162, 3, 232, 214, 124, 196, 137, 20, 10, 162, 3, 203, 41, 124, 196, + 137, 20, 10, 162, 3, 204, 146, 124, 196, 137, 20, 10, 162, 3, 234, 148, + 124, 196, 137, 20, 10, 162, 3, 214, 16, 124, 196, 137, 20, 10, 209, 38, + 3, 40, 250, 40, 194, 11, 236, 177, 10, 209, 38, 3, 84, 242, 47, 10, 209, + 38, 3, 237, 11, 242, 47, 10, 209, 38, 3, 237, 11, 198, 181, 10, 209, 38, + 3, 237, 11, 208, 173, 10, 3, 251, 239, 24, 212, 231, 200, 19, 10, 3, 251, + 239, 24, 203, 162, 10, 3, 251, 126, 24, 233, 252, 10, 3, 248, 242, 24, + 236, 195, 200, 19, 10, 3, 248, 228, 24, 251, 155, 10, 3, 248, 228, 24, + 214, 60, 10, 3, 248, 228, 24, 192, 112, 10, 3, 247, 125, 136, 247, 125, + 24, 215, 87, 10, 3, 238, 1, 24, 200, 141, 10, 3, 237, 247, 24, 221, 0, + 10, 3, 236, 228, 24, 223, 226, 10, 3, 236, 228, 24, 124, 124, 68, 10, 3, + 236, 226, 24, 197, 109, 10, 3, 235, 57, 24, 250, 188, 10, 3, 235, 57, 24, + 250, 53, 10, 3, 235, 57, 24, 250, 54, 250, 27, 220, 28, 10, 3, 235, 57, + 24, 236, 215, 10, 3, 235, 57, 24, 235, 49, 10, 3, 235, 57, 24, 234, 15, + 10, 3, 235, 57, 24, 231, 233, 10, 3, 235, 57, 24, 231, 46, 10, 3, 235, + 57, 24, 231, 28, 230, 162, 10, 3, 235, 57, 24, 231, 18, 10, 3, 235, 57, + 24, 144, 10, 3, 235, 57, 24, 229, 178, 10, 3, 235, 57, 24, 223, 227, 230, + 162, 10, 3, 235, 57, 24, 222, 88, 10, 3, 235, 57, 24, 221, 0, 10, 3, 235, + 57, 24, 220, 249, 10, 3, 235, 57, 24, 220, 250, 102, 222, 88, 10, 3, 235, + 57, 24, 220, 151, 10, 3, 235, 57, 24, 220, 94, 10, 3, 235, 57, 24, 220, + 95, 24, 221, 0, 10, 3, 235, 57, 24, 219, 25, 102, 231, 18, 10, 3, 235, + 57, 24, 217, 110, 10, 3, 235, 57, 24, 216, 248, 10, 3, 235, 57, 24, 216, + 175, 10, 3, 235, 57, 24, 214, 60, 10, 3, 235, 57, 24, 210, 51, 10, 3, + 235, 57, 24, 204, 12, 10, 3, 235, 57, 24, 203, 126, 230, 162, 10, 3, 234, + 201, 24, 221, 0, 10, 3, 234, 201, 24, 210, 253, 10, 3, 234, 16, 193, 223, + 10, 3, 233, 253, 238, 176, 233, 252, 10, 3, 233, 169, 203, 250, 24, 250, + 53, 10, 3, 233, 169, 203, 250, 24, 229, 178, 10, 3, 233, 169, 203, 250, + 24, 223, 227, 230, 162, 10, 3, 233, 169, 203, 250, 24, 177, 10, 3, 233, + 169, 203, 250, 24, 220, 96, 10, 3, 233, 169, 203, 250, 24, 217, 48, 10, + 3, 233, 169, 203, 250, 24, 216, 248, 10, 3, 233, 169, 203, 250, 24, 201, + 184, 10, 3, 233, 169, 24, 201, 184, 10, 3, 231, 232, 24, 248, 227, 10, 3, + 231, 232, 24, 236, 228, 230, 162, 10, 3, 231, 232, 24, 235, 57, 24, 223, + 227, 230, 162, 10, 3, 231, 232, 24, 235, 57, 24, 222, 88, 10, 3, 231, + 232, 24, 234, 18, 10, 3, 231, 232, 24, 231, 233, 10, 3, 231, 232, 24, + 231, 194, 102, 237, 16, 10, 3, 231, 232, 24, 231, 194, 102, 214, 214, 10, + 3, 231, 232, 24, 230, 113, 102, 64, 10, 3, 231, 232, 24, 220, 250, 102, + 222, 88, 10, 3, 231, 232, 24, 220, 94, 10, 3, 231, 232, 24, 220, 95, 24, + 221, 0, 10, 3, 231, 232, 24, 219, 24, 10, 3, 231, 232, 24, 215, 189, 10, + 3, 231, 232, 24, 214, 214, 10, 3, 231, 232, 24, 214, 215, 102, 234, 200, + 10, 3, 231, 232, 24, 214, 215, 102, 231, 46, 10, 3, 231, 232, 24, 203, + 228, 10, 3, 231, 232, 24, 192, 13, 10, 3, 231, 227, 207, 16, 214, 12, + 237, 94, 10, 3, 231, 128, 24, 68, 10, 3, 231, 19, 24, 231, 19, 238, 176, + 231, 18, 10, 3, 230, 185, 24, 223, 227, 230, 162, 10, 3, 230, 176, 102, + 231, 19, 24, 200, 141, 10, 3, 230, 113, 200, 20, 230, 162, 10, 3, 229, + 179, 24, 250, 54, 136, 229, 179, 24, 250, 53, 10, 3, 222, 174, 24, 247, + 124, 10, 3, 222, 174, 24, 160, 10, 3, 222, 174, 24, 124, 124, 68, 10, 3, + 222, 174, 24, 197, 27, 10, 3, 220, 164, 24, 191, 253, 136, 191, 252, 10, + 3, 220, 152, 10, 3, 220, 150, 10, 3, 220, 149, 10, 3, 220, 148, 10, 3, + 220, 147, 10, 3, 220, 146, 10, 3, 220, 145, 10, 3, 220, 144, 136, 220, + 144, 230, 162, 10, 3, 220, 143, 10, 3, 220, 142, 136, 220, 141, 10, 3, + 220, 140, 10, 3, 220, 139, 10, 3, 220, 138, 10, 3, 220, 137, 10, 3, 220, + 136, 10, 3, 220, 135, 10, 3, 220, 134, 10, 3, 220, 133, 10, 3, 220, 132, + 10, 3, 220, 131, 10, 3, 220, 130, 10, 3, 220, 129, 10, 3, 220, 128, 10, + 3, 220, 127, 10, 3, 220, 126, 10, 3, 220, 125, 10, 3, 220, 124, 10, 3, + 220, 123, 10, 3, 220, 121, 10, 3, 220, 122, 24, 230, 186, 10, 3, 220, + 122, 24, 223, 226, 10, 3, 220, 122, 24, 210, 254, 102, 219, 33, 10, 3, + 220, 122, 24, 210, 254, 102, 210, 254, 102, 219, 33, 10, 3, 220, 122, 24, + 197, 121, 102, 249, 3, 10, 3, 220, 120, 10, 3, 220, 119, 10, 3, 220, 118, + 10, 3, 220, 117, 10, 3, 220, 116, 10, 3, 220, 115, 10, 3, 220, 114, 10, + 3, 220, 113, 10, 3, 220, 112, 10, 3, 220, 111, 10, 3, 220, 109, 10, 3, + 220, 110, 24, 250, 53, 10, 3, 220, 110, 24, 248, 241, 10, 3, 220, 110, + 24, 235, 48, 230, 163, 230, 162, 10, 3, 220, 110, 24, 221, 24, 10, 3, + 220, 110, 24, 177, 10, 3, 220, 110, 24, 200, 112, 10, 3, 220, 110, 24, + 200, 79, 10, 3, 220, 110, 24, 197, 120, 10, 3, 220, 110, 24, 197, 109, + 10, 3, 220, 110, 24, 197, 14, 10, 3, 220, 108, 10, 3, 220, 106, 10, 3, + 220, 107, 24, 235, 60, 10, 3, 220, 107, 24, 231, 233, 10, 3, 220, 107, + 24, 223, 226, 10, 3, 220, 107, 24, 223, 227, 230, 162, 10, 3, 220, 107, + 24, 214, 60, 10, 3, 220, 107, 24, 210, 254, 102, 210, 254, 102, 219, 33, + 10, 3, 220, 107, 24, 203, 253, 102, 221, 204, 10, 3, 220, 107, 24, 197, + 109, 10, 3, 220, 107, 24, 197, 14, 10, 3, 220, 104, 10, 3, 220, 103, 10, + 3, 219, 35, 230, 163, 24, 250, 53, 10, 3, 219, 35, 24, 236, 194, 10, 3, + 219, 35, 24, 230, 81, 10, 3, 219, 35, 24, 210, 253, 10, 3, 219, 35, 24, + 210, 254, 102, 210, 254, 102, 219, 33, 10, 3, 219, 35, 24, 200, 141, 10, + 3, 216, 176, 102, 192, 111, 10, 3, 215, 190, 136, 215, 190, 24, 231, 233, + 10, 3, 215, 190, 136, 215, 190, 24, 222, 129, 10, 3, 214, 18, 24, 236, + 228, 230, 162, 10, 3, 214, 18, 24, 231, 18, 10, 3, 214, 18, 24, 230, 167, + 10, 3, 214, 18, 24, 229, 178, 10, 3, 214, 18, 24, 222, 21, 10, 3, 214, + 18, 24, 220, 147, 10, 3, 214, 18, 24, 217, 110, 10, 3, 214, 18, 24, 210, + 254, 102, 210, 253, 10, 3, 214, 18, 24, 68, 10, 3, 214, 18, 24, 124, 102, + 68, 10, 3, 214, 18, 24, 197, 14, 10, 3, 206, 80, 230, 163, 24, 144, 10, + 3, 206, 80, 24, 234, 88, 10, 3, 206, 80, 24, 204, 13, 250, 27, 220, 28, + 10, 3, 206, 80, 24, 200, 141, 10, 3, 204, 61, 200, 19, 10, 3, 204, 13, + 136, 204, 12, 10, 3, 204, 13, 102, 228, 173, 10, 3, 204, 13, 102, 215, + 64, 10, 3, 204, 13, 102, 206, 25, 10, 3, 203, 163, 102, 235, 57, 24, 214, + 60, 10, 3, 203, 163, 102, 234, 201, 24, 250, 224, 10, 3, 203, 126, 24, + 200, 141, 10, 3, 200, 142, 102, 206, 79, 10, 3, 198, 28, 24, 231, 202, + 200, 19, 10, 3, 198, 28, 24, 112, 236, 194, 10, 3, 197, 26, 223, 120, 10, + 3, 197, 26, 24, 197, 109, 10, 3, 197, 17, 24, 237, 194, 10, 3, 197, 17, + 24, 220, 105, 10, 3, 197, 17, 24, 219, 33, 10, 3, 192, 111, 10, 3, 191, + 253, 136, 191, 253, 102, 206, 25, 10, 3, 191, 251, 24, 112, 236, 195, + 200, 19, 14, 7, 255, 26, 14, 7, 255, 25, 14, 7, 255, 24, 14, 7, 255, 23, + 14, 7, 255, 22, 14, 7, 255, 21, 14, 7, 255, 20, 14, 7, 255, 19, 14, 7, + 255, 18, 14, 7, 255, 17, 14, 7, 255, 16, 14, 7, 255, 15, 14, 7, 255, 14, + 14, 7, 255, 12, 14, 7, 255, 11, 14, 7, 255, 10, 14, 7, 255, 9, 14, 7, + 255, 8, 14, 7, 255, 7, 14, 7, 255, 6, 14, 7, 255, 5, 14, 7, 255, 4, 14, + 7, 255, 3, 14, 7, 255, 2, 14, 7, 255, 1, 14, 7, 255, 0, 14, 7, 254, 255, + 14, 7, 254, 254, 14, 7, 254, 253, 14, 7, 254, 252, 14, 7, 254, 251, 14, + 7, 254, 249, 14, 7, 254, 248, 14, 7, 254, 246, 14, 7, 254, 245, 14, 7, + 254, 244, 14, 7, 254, 243, 14, 7, 254, 242, 14, 7, 254, 241, 14, 7, 254, + 240, 14, 7, 254, 239, 14, 7, 254, 238, 14, 7, 254, 237, 14, 7, 254, 236, + 14, 7, 254, 235, 14, 7, 254, 233, 14, 7, 254, 232, 14, 7, 254, 231, 14, + 7, 254, 229, 14, 7, 254, 228, 14, 7, 254, 227, 14, 7, 254, 226, 14, 7, + 254, 225, 14, 7, 254, 224, 14, 7, 254, 223, 14, 7, 254, 222, 14, 7, 254, + 219, 14, 7, 254, 218, 14, 7, 254, 217, 14, 7, 254, 216, 14, 7, 254, 215, + 14, 7, 254, 214, 14, 7, 254, 213, 14, 7, 254, 212, 14, 7, 254, 211, 14, + 7, 254, 210, 14, 7, 254, 209, 14, 7, 254, 208, 14, 7, 254, 207, 14, 7, + 254, 206, 14, 7, 254, 205, 14, 7, 254, 204, 14, 7, 254, 203, 14, 7, 254, + 202, 14, 7, 254, 201, 14, 7, 254, 200, 14, 7, 254, 196, 14, 7, 254, 195, + 14, 7, 254, 194, 14, 7, 254, 193, 14, 7, 249, 224, 14, 7, 249, 222, 14, + 7, 249, 220, 14, 7, 249, 218, 14, 7, 249, 216, 14, 7, 249, 215, 14, 7, + 249, 213, 14, 7, 249, 211, 14, 7, 249, 209, 14, 7, 249, 207, 14, 7, 247, + 48, 14, 7, 247, 47, 14, 7, 247, 46, 14, 7, 247, 45, 14, 7, 247, 44, 14, + 7, 247, 43, 14, 7, 247, 42, 14, 7, 247, 41, 14, 7, 247, 40, 14, 7, 247, + 39, 14, 7, 247, 38, 14, 7, 247, 37, 14, 7, 247, 36, 14, 7, 247, 35, 14, + 7, 247, 34, 14, 7, 247, 33, 14, 7, 247, 32, 14, 7, 247, 31, 14, 7, 247, + 30, 14, 7, 247, 29, 14, 7, 247, 28, 14, 7, 247, 27, 14, 7, 247, 26, 14, + 7, 247, 25, 14, 7, 247, 24, 14, 7, 247, 23, 14, 7, 247, 22, 14, 7, 247, + 21, 14, 7, 238, 94, 14, 7, 238, 93, 14, 7, 238, 92, 14, 7, 238, 91, 14, + 7, 238, 90, 14, 7, 238, 89, 14, 7, 238, 88, 14, 7, 238, 87, 14, 7, 238, + 86, 14, 7, 238, 85, 14, 7, 238, 84, 14, 7, 238, 83, 14, 7, 238, 82, 14, + 7, 238, 81, 14, 7, 238, 80, 14, 7, 238, 79, 14, 7, 238, 78, 14, 7, 238, + 77, 14, 7, 238, 76, 14, 7, 238, 75, 14, 7, 238, 74, 14, 7, 238, 73, 14, + 7, 238, 72, 14, 7, 238, 71, 14, 7, 238, 70, 14, 7, 238, 69, 14, 7, 238, + 68, 14, 7, 238, 67, 14, 7, 238, 66, 14, 7, 238, 65, 14, 7, 238, 64, 14, + 7, 238, 63, 14, 7, 238, 62, 14, 7, 238, 61, 14, 7, 238, 60, 14, 7, 238, + 59, 14, 7, 238, 58, 14, 7, 238, 57, 14, 7, 238, 56, 14, 7, 238, 55, 14, + 7, 238, 54, 14, 7, 238, 53, 14, 7, 238, 52, 14, 7, 238, 51, 14, 7, 238, + 50, 14, 7, 238, 49, 14, 7, 238, 48, 14, 7, 238, 47, 14, 7, 238, 46, 14, + 7, 238, 45, 14, 7, 238, 44, 14, 7, 238, 43, 14, 7, 238, 42, 14, 7, 238, + 41, 14, 7, 238, 40, 14, 7, 238, 39, 14, 7, 238, 38, 14, 7, 238, 37, 14, + 7, 238, 36, 14, 7, 238, 35, 14, 7, 238, 34, 14, 7, 238, 33, 14, 7, 238, + 32, 14, 7, 238, 31, 14, 7, 238, 30, 14, 7, 238, 29, 14, 7, 238, 28, 14, + 7, 238, 27, 14, 7, 238, 26, 14, 7, 238, 25, 14, 7, 238, 24, 14, 7, 238, + 23, 14, 7, 238, 22, 14, 7, 238, 21, 14, 7, 238, 20, 14, 7, 238, 19, 14, + 7, 238, 18, 14, 7, 238, 17, 14, 7, 238, 16, 14, 7, 238, 15, 14, 7, 238, + 14, 14, 7, 238, 13, 14, 7, 238, 12, 14, 7, 238, 11, 14, 7, 238, 10, 14, + 7, 238, 9, 14, 7, 238, 8, 14, 7, 238, 7, 14, 7, 238, 6, 14, 7, 238, 5, + 14, 7, 238, 4, 14, 7, 238, 3, 14, 7, 234, 245, 14, 7, 234, 244, 14, 7, + 234, 243, 14, 7, 234, 242, 14, 7, 234, 241, 14, 7, 234, 240, 14, 7, 234, + 239, 14, 7, 234, 238, 14, 7, 234, 237, 14, 7, 234, 236, 14, 7, 234, 235, + 14, 7, 234, 234, 14, 7, 234, 233, 14, 7, 234, 232, 14, 7, 234, 231, 14, + 7, 234, 230, 14, 7, 234, 229, 14, 7, 234, 228, 14, 7, 234, 227, 14, 7, + 234, 226, 14, 7, 234, 225, 14, 7, 234, 224, 14, 7, 234, 223, 14, 7, 234, + 222, 14, 7, 234, 221, 14, 7, 234, 220, 14, 7, 234, 219, 14, 7, 234, 218, + 14, 7, 234, 217, 14, 7, 234, 216, 14, 7, 234, 215, 14, 7, 234, 214, 14, + 7, 234, 213, 14, 7, 234, 212, 14, 7, 234, 211, 14, 7, 234, 210, 14, 7, + 234, 209, 14, 7, 234, 208, 14, 7, 234, 207, 14, 7, 234, 206, 14, 7, 234, + 205, 14, 7, 234, 204, 14, 7, 234, 203, 14, 7, 234, 202, 14, 7, 233, 162, + 14, 7, 233, 161, 14, 7, 233, 160, 14, 7, 233, 159, 14, 7, 233, 158, 14, + 7, 233, 157, 14, 7, 233, 156, 14, 7, 233, 155, 14, 7, 233, 154, 14, 7, + 233, 153, 14, 7, 233, 152, 14, 7, 233, 151, 14, 7, 233, 150, 14, 7, 233, + 149, 14, 7, 233, 148, 14, 7, 233, 147, 14, 7, 233, 146, 14, 7, 233, 145, + 14, 7, 233, 144, 14, 7, 233, 143, 14, 7, 233, 142, 14, 7, 233, 141, 14, + 7, 233, 140, 14, 7, 233, 139, 14, 7, 233, 138, 14, 7, 233, 137, 14, 7, + 233, 136, 14, 7, 233, 135, 14, 7, 233, 134, 14, 7, 233, 133, 14, 7, 233, + 132, 14, 7, 233, 131, 14, 7, 233, 130, 14, 7, 233, 129, 14, 7, 233, 128, + 14, 7, 233, 127, 14, 7, 233, 126, 14, 7, 233, 125, 14, 7, 233, 124, 14, + 7, 233, 123, 14, 7, 233, 122, 14, 7, 233, 121, 14, 7, 233, 120, 14, 7, + 233, 119, 14, 7, 233, 118, 14, 7, 233, 117, 14, 7, 233, 116, 14, 7, 233, + 115, 14, 7, 233, 114, 14, 7, 233, 113, 14, 7, 233, 112, 14, 7, 233, 111, + 14, 7, 233, 110, 14, 7, 233, 109, 14, 7, 233, 108, 14, 7, 233, 107, 14, + 7, 233, 106, 14, 7, 233, 105, 14, 7, 233, 104, 14, 7, 233, 103, 14, 7, + 233, 102, 14, 7, 233, 101, 14, 7, 233, 100, 14, 7, 233, 99, 14, 7, 233, + 98, 14, 7, 232, 43, 14, 7, 232, 42, 14, 7, 232, 41, 14, 7, 232, 40, 14, + 7, 232, 39, 14, 7, 232, 38, 14, 7, 232, 37, 14, 7, 232, 36, 14, 7, 232, + 35, 14, 7, 232, 34, 14, 7, 232, 33, 14, 7, 232, 32, 14, 7, 232, 31, 14, + 7, 232, 30, 14, 7, 232, 29, 14, 7, 232, 28, 14, 7, 232, 27, 14, 7, 232, + 26, 14, 7, 232, 25, 14, 7, 232, 24, 14, 7, 232, 23, 14, 7, 232, 22, 14, + 7, 232, 21, 14, 7, 232, 20, 14, 7, 232, 19, 14, 7, 232, 18, 14, 7, 232, + 17, 14, 7, 232, 16, 14, 7, 232, 15, 14, 7, 232, 14, 14, 7, 232, 13, 14, + 7, 232, 12, 14, 7, 232, 11, 14, 7, 232, 10, 14, 7, 232, 9, 14, 7, 232, 8, + 14, 7, 232, 7, 14, 7, 232, 6, 14, 7, 232, 5, 14, 7, 232, 4, 14, 7, 232, + 3, 14, 7, 232, 2, 14, 7, 232, 1, 14, 7, 232, 0, 14, 7, 231, 255, 14, 7, + 231, 254, 14, 7, 231, 253, 14, 7, 231, 252, 14, 7, 231, 251, 14, 7, 231, + 250, 14, 7, 231, 249, 14, 7, 231, 248, 14, 7, 231, 247, 14, 7, 231, 246, + 14, 7, 231, 245, 14, 7, 231, 244, 14, 7, 231, 243, 14, 7, 231, 242, 14, + 7, 231, 241, 14, 7, 231, 240, 14, 7, 231, 239, 14, 7, 231, 238, 14, 7, + 231, 237, 14, 7, 231, 236, 14, 7, 230, 122, 14, 7, 230, 121, 14, 7, 230, + 120, 14, 7, 230, 119, 14, 7, 230, 118, 14, 7, 230, 117, 14, 7, 230, 116, + 14, 7, 230, 115, 14, 7, 230, 114, 14, 7, 228, 77, 14, 7, 228, 76, 14, 7, + 228, 75, 14, 7, 228, 74, 14, 7, 228, 73, 14, 7, 228, 72, 14, 7, 228, 71, + 14, 7, 228, 70, 14, 7, 228, 69, 14, 7, 228, 68, 14, 7, 228, 67, 14, 7, + 228, 66, 14, 7, 228, 65, 14, 7, 228, 64, 14, 7, 228, 63, 14, 7, 228, 62, + 14, 7, 228, 61, 14, 7, 228, 60, 14, 7, 228, 59, 14, 7, 222, 183, 14, 7, + 222, 182, 14, 7, 222, 181, 14, 7, 222, 180, 14, 7, 222, 179, 14, 7, 222, + 178, 14, 7, 222, 177, 14, 7, 222, 176, 14, 7, 220, 199, 14, 7, 220, 198, + 14, 7, 220, 197, 14, 7, 220, 196, 14, 7, 220, 195, 14, 7, 220, 194, 14, + 7, 220, 193, 14, 7, 220, 192, 14, 7, 220, 191, 14, 7, 220, 190, 14, 7, + 218, 234, 14, 7, 218, 233, 14, 7, 218, 232, 14, 7, 218, 230, 14, 7, 218, + 228, 14, 7, 218, 227, 14, 7, 218, 225, 14, 7, 218, 223, 14, 7, 218, 221, + 14, 7, 218, 219, 14, 7, 218, 217, 14, 7, 218, 215, 14, 7, 218, 213, 14, + 7, 218, 212, 14, 7, 218, 210, 14, 7, 218, 208, 14, 7, 218, 207, 14, 7, + 218, 206, 14, 7, 218, 205, 14, 7, 218, 204, 14, 7, 218, 203, 14, 7, 218, + 202, 14, 7, 218, 201, 14, 7, 218, 200, 14, 7, 218, 198, 14, 7, 218, 196, + 14, 7, 218, 194, 14, 7, 218, 193, 14, 7, 218, 191, 14, 7, 218, 190, 14, + 7, 218, 188, 14, 7, 218, 187, 14, 7, 218, 185, 14, 7, 218, 183, 14, 7, + 218, 181, 14, 7, 218, 179, 14, 7, 218, 177, 14, 7, 218, 176, 14, 7, 218, + 174, 14, 7, 218, 172, 14, 7, 218, 171, 14, 7, 218, 169, 14, 7, 218, 167, + 14, 7, 218, 165, 14, 7, 218, 163, 14, 7, 218, 162, 14, 7, 218, 160, 14, + 7, 218, 158, 14, 7, 218, 156, 14, 7, 218, 155, 14, 7, 218, 153, 14, 7, + 218, 151, 14, 7, 218, 150, 14, 7, 218, 149, 14, 7, 218, 147, 14, 7, 218, + 145, 14, 7, 218, 143, 14, 7, 218, 141, 14, 7, 218, 139, 14, 7, 218, 137, + 14, 7, 218, 135, 14, 7, 218, 134, 14, 7, 218, 132, 14, 7, 218, 130, 14, + 7, 218, 128, 14, 7, 218, 126, 14, 7, 215, 146, 14, 7, 215, 145, 14, 7, + 215, 144, 14, 7, 215, 143, 14, 7, 215, 142, 14, 7, 215, 141, 14, 7, 215, + 140, 14, 7, 215, 139, 14, 7, 215, 138, 14, 7, 215, 137, 14, 7, 215, 136, + 14, 7, 215, 135, 14, 7, 215, 134, 14, 7, 215, 133, 14, 7, 215, 132, 14, + 7, 215, 131, 14, 7, 215, 130, 14, 7, 215, 129, 14, 7, 215, 128, 14, 7, + 215, 127, 14, 7, 215, 126, 14, 7, 215, 125, 14, 7, 215, 124, 14, 7, 215, + 123, 14, 7, 215, 122, 14, 7, 215, 121, 14, 7, 215, 120, 14, 7, 215, 119, + 14, 7, 215, 118, 14, 7, 215, 117, 14, 7, 215, 116, 14, 7, 215, 115, 14, + 7, 215, 114, 14, 7, 215, 113, 14, 7, 215, 112, 14, 7, 215, 111, 14, 7, + 215, 110, 14, 7, 215, 109, 14, 7, 215, 108, 14, 7, 215, 107, 14, 7, 215, + 106, 14, 7, 215, 105, 14, 7, 215, 104, 14, 7, 215, 103, 14, 7, 215, 102, + 14, 7, 215, 101, 14, 7, 215, 100, 14, 7, 215, 99, 14, 7, 215, 98, 14, 7, + 213, 203, 14, 7, 213, 202, 14, 7, 213, 201, 14, 7, 213, 200, 14, 7, 213, + 199, 14, 7, 213, 198, 14, 7, 213, 197, 14, 7, 213, 196, 14, 7, 213, 195, + 14, 7, 213, 194, 14, 7, 213, 193, 14, 7, 213, 192, 14, 7, 213, 191, 14, + 7, 213, 190, 14, 7, 213, 189, 14, 7, 213, 188, 14, 7, 213, 187, 14, 7, + 213, 186, 14, 7, 213, 185, 14, 7, 213, 184, 14, 7, 213, 183, 14, 7, 213, + 182, 14, 7, 213, 18, 14, 7, 213, 17, 14, 7, 213, 16, 14, 7, 213, 15, 14, + 7, 213, 14, 14, 7, 213, 13, 14, 7, 213, 12, 14, 7, 213, 11, 14, 7, 213, + 10, 14, 7, 213, 9, 14, 7, 213, 8, 14, 7, 213, 7, 14, 7, 213, 6, 14, 7, + 213, 5, 14, 7, 213, 4, 14, 7, 213, 3, 14, 7, 213, 2, 14, 7, 213, 1, 14, + 7, 213, 0, 14, 7, 212, 255, 14, 7, 212, 254, 14, 7, 212, 253, 14, 7, 212, + 252, 14, 7, 212, 251, 14, 7, 212, 250, 14, 7, 212, 249, 14, 7, 212, 102, + 14, 7, 212, 101, 14, 7, 212, 100, 14, 7, 212, 99, 14, 7, 212, 98, 14, 7, + 212, 97, 14, 7, 212, 96, 14, 7, 212, 95, 14, 7, 212, 94, 14, 7, 212, 93, + 14, 7, 212, 92, 14, 7, 212, 91, 14, 7, 212, 90, 14, 7, 212, 89, 14, 7, + 212, 88, 14, 7, 212, 87, 14, 7, 212, 86, 14, 7, 212, 85, 14, 7, 212, 84, + 14, 7, 212, 83, 14, 7, 212, 82, 14, 7, 212, 81, 14, 7, 212, 80, 14, 7, + 212, 79, 14, 7, 212, 78, 14, 7, 212, 77, 14, 7, 212, 76, 14, 7, 212, 75, + 14, 7, 212, 74, 14, 7, 212, 73, 14, 7, 212, 72, 14, 7, 212, 71, 14, 7, + 212, 70, 14, 7, 212, 69, 14, 7, 212, 68, 14, 7, 212, 67, 14, 7, 212, 66, + 14, 7, 212, 65, 14, 7, 212, 64, 14, 7, 212, 63, 14, 7, 212, 62, 14, 7, + 212, 61, 14, 7, 212, 60, 14, 7, 212, 59, 14, 7, 212, 58, 14, 7, 212, 57, + 14, 7, 212, 56, 14, 7, 212, 55, 14, 7, 212, 54, 14, 7, 212, 53, 14, 7, + 212, 52, 14, 7, 212, 51, 14, 7, 212, 50, 14, 7, 212, 49, 14, 7, 212, 48, + 14, 7, 212, 47, 14, 7, 212, 46, 14, 7, 212, 45, 14, 7, 212, 44, 14, 7, + 212, 43, 14, 7, 212, 42, 14, 7, 212, 41, 14, 7, 212, 40, 14, 7, 212, 39, + 14, 7, 212, 38, 14, 7, 212, 37, 14, 7, 212, 36, 14, 7, 212, 35, 14, 7, + 212, 34, 14, 7, 212, 33, 14, 7, 212, 32, 14, 7, 212, 31, 14, 7, 212, 30, + 14, 7, 212, 29, 14, 7, 212, 28, 14, 7, 211, 92, 14, 7, 211, 91, 14, 7, + 211, 90, 14, 7, 211, 89, 14, 7, 211, 88, 14, 7, 211, 87, 14, 7, 211, 86, + 14, 7, 211, 85, 14, 7, 211, 84, 14, 7, 211, 83, 14, 7, 211, 82, 14, 7, + 211, 81, 14, 7, 211, 80, 14, 7, 208, 246, 14, 7, 208, 245, 14, 7, 208, + 244, 14, 7, 208, 243, 14, 7, 208, 242, 14, 7, 208, 241, 14, 7, 208, 240, + 14, 7, 208, 110, 14, 7, 208, 109, 14, 7, 208, 108, 14, 7, 208, 107, 14, + 7, 208, 106, 14, 7, 208, 105, 14, 7, 208, 104, 14, 7, 208, 103, 14, 7, + 208, 102, 14, 7, 208, 101, 14, 7, 208, 100, 14, 7, 208, 99, 14, 7, 208, + 98, 14, 7, 208, 97, 14, 7, 208, 96, 14, 7, 208, 95, 14, 7, 208, 94, 14, + 7, 208, 93, 14, 7, 208, 92, 14, 7, 208, 91, 14, 7, 208, 90, 14, 7, 208, + 89, 14, 7, 208, 88, 14, 7, 208, 87, 14, 7, 208, 86, 14, 7, 208, 85, 14, + 7, 208, 84, 14, 7, 208, 83, 14, 7, 208, 82, 14, 7, 208, 81, 14, 7, 208, + 80, 14, 7, 208, 79, 14, 7, 208, 78, 14, 7, 208, 77, 14, 7, 206, 155, 14, + 7, 206, 154, 14, 7, 206, 153, 14, 7, 206, 152, 14, 7, 206, 151, 14, 7, + 206, 150, 14, 7, 206, 149, 14, 7, 206, 148, 14, 7, 206, 147, 14, 7, 206, + 146, 14, 7, 206, 145, 14, 7, 206, 144, 14, 7, 206, 143, 14, 7, 206, 142, + 14, 7, 206, 141, 14, 7, 206, 140, 14, 7, 206, 139, 14, 7, 206, 138, 14, + 7, 206, 137, 14, 7, 206, 136, 14, 7, 206, 135, 14, 7, 206, 134, 14, 7, + 206, 133, 14, 7, 206, 132, 14, 7, 206, 131, 14, 7, 206, 130, 14, 7, 206, + 129, 14, 7, 206, 128, 14, 7, 206, 127, 14, 7, 206, 126, 14, 7, 206, 125, + 14, 7, 206, 124, 14, 7, 206, 123, 14, 7, 206, 122, 14, 7, 206, 121, 14, + 7, 206, 120, 14, 7, 206, 119, 14, 7, 206, 118, 14, 7, 206, 117, 14, 7, + 206, 116, 14, 7, 206, 115, 14, 7, 206, 114, 14, 7, 206, 113, 14, 7, 206, + 112, 14, 7, 206, 111, 14, 7, 206, 110, 14, 7, 206, 109, 14, 7, 206, 108, + 14, 7, 206, 107, 14, 7, 206, 106, 14, 7, 206, 105, 14, 7, 206, 104, 14, + 7, 206, 103, 14, 7, 206, 102, 14, 7, 200, 225, 14, 7, 200, 224, 14, 7, + 200, 223, 14, 7, 200, 222, 14, 7, 200, 221, 14, 7, 200, 220, 14, 7, 200, + 219, 14, 7, 200, 218, 14, 7, 200, 217, 14, 7, 200, 216, 14, 7, 200, 215, + 14, 7, 200, 214, 14, 7, 200, 213, 14, 7, 200, 212, 14, 7, 200, 211, 14, + 7, 200, 210, 14, 7, 200, 209, 14, 7, 200, 208, 14, 7, 200, 207, 14, 7, + 200, 206, 14, 7, 200, 205, 14, 7, 200, 204, 14, 7, 200, 203, 14, 7, 200, + 202, 14, 7, 200, 201, 14, 7, 200, 200, 14, 7, 200, 199, 14, 7, 200, 198, + 14, 7, 200, 197, 14, 7, 200, 196, 14, 7, 200, 195, 14, 7, 200, 194, 14, + 7, 200, 193, 14, 7, 200, 192, 14, 7, 200, 191, 14, 7, 200, 190, 14, 7, + 200, 189, 14, 7, 200, 188, 14, 7, 200, 187, 14, 7, 200, 186, 14, 7, 200, + 185, 14, 7, 200, 184, 14, 7, 200, 183, 14, 7, 200, 182, 14, 7, 197, 168, + 14, 7, 197, 167, 14, 7, 197, 166, 14, 7, 197, 165, 14, 7, 197, 164, 14, + 7, 197, 163, 14, 7, 197, 162, 14, 7, 197, 161, 14, 7, 197, 160, 14, 7, + 197, 159, 14, 7, 197, 158, 14, 7, 197, 157, 14, 7, 197, 156, 14, 7, 197, + 155, 14, 7, 197, 154, 14, 7, 197, 153, 14, 7, 197, 152, 14, 7, 197, 151, + 14, 7, 197, 150, 14, 7, 197, 149, 14, 7, 197, 148, 14, 7, 197, 147, 14, + 7, 197, 146, 14, 7, 197, 145, 14, 7, 197, 144, 14, 7, 197, 143, 14, 7, + 197, 142, 14, 7, 197, 141, 14, 7, 197, 140, 14, 7, 197, 139, 14, 7, 197, + 138, 14, 7, 197, 137, 14, 7, 197, 136, 14, 7, 197, 135, 14, 7, 197, 134, + 14, 7, 197, 133, 14, 7, 197, 132, 14, 7, 197, 131, 14, 7, 197, 130, 14, + 7, 197, 129, 14, 7, 197, 128, 14, 7, 197, 127, 14, 7, 197, 126, 14, 7, + 197, 125, 14, 7, 197, 124, 14, 7, 197, 123, 14, 7, 197, 122, 14, 7, 196, + 235, 14, 7, 196, 234, 14, 7, 196, 233, 14, 7, 196, 232, 14, 7, 196, 231, + 14, 7, 196, 230, 14, 7, 196, 229, 14, 7, 196, 228, 14, 7, 196, 227, 14, + 7, 196, 226, 14, 7, 196, 225, 14, 7, 196, 224, 14, 7, 196, 223, 14, 7, + 196, 222, 14, 7, 196, 221, 14, 7, 196, 220, 14, 7, 196, 219, 14, 7, 196, + 218, 14, 7, 196, 217, 14, 7, 196, 216, 14, 7, 196, 215, 14, 7, 196, 214, + 14, 7, 196, 213, 14, 7, 196, 212, 14, 7, 196, 211, 14, 7, 196, 210, 14, + 7, 196, 209, 14, 7, 196, 208, 14, 7, 196, 207, 14, 7, 196, 206, 14, 7, + 196, 205, 14, 7, 196, 204, 14, 7, 196, 203, 14, 7, 196, 202, 14, 7, 196, + 201, 14, 7, 196, 200, 14, 7, 196, 199, 14, 7, 196, 198, 14, 7, 196, 197, + 14, 7, 196, 196, 14, 7, 196, 195, 14, 7, 196, 194, 14, 7, 196, 193, 14, + 7, 196, 192, 14, 7, 196, 191, 14, 7, 196, 190, 14, 7, 196, 189, 14, 7, + 196, 188, 14, 7, 196, 187, 14, 7, 196, 186, 14, 7, 196, 185, 14, 7, 196, + 184, 14, 7, 196, 183, 14, 7, 196, 182, 14, 7, 196, 181, 14, 7, 196, 180, + 14, 7, 196, 179, 14, 7, 196, 178, 14, 7, 196, 177, 14, 7, 196, 176, 14, + 7, 196, 175, 14, 7, 196, 174, 14, 7, 196, 173, 14, 7, 196, 172, 14, 7, + 196, 171, 14, 7, 196, 170, 14, 7, 196, 169, 14, 7, 196, 168, 14, 7, 196, + 167, 14, 7, 196, 166, 14, 7, 196, 165, 14, 7, 196, 164, 14, 7, 196, 163, + 14, 7, 196, 162, 14, 7, 196, 161, 14, 7, 196, 160, 14, 7, 196, 159, 14, + 7, 194, 201, 14, 7, 194, 200, 14, 7, 194, 199, 14, 7, 194, 198, 14, 7, + 194, 197, 14, 7, 194, 196, 14, 7, 194, 195, 14, 7, 194, 194, 14, 7, 194, + 193, 14, 7, 194, 192, 14, 7, 194, 191, 14, 7, 194, 190, 14, 7, 194, 189, + 14, 7, 194, 188, 14, 7, 194, 187, 14, 7, 194, 186, 14, 7, 194, 185, 14, + 7, 194, 184, 14, 7, 194, 183, 14, 7, 194, 182, 14, 7, 194, 181, 14, 7, + 194, 180, 14, 7, 194, 179, 14, 7, 194, 178, 14, 7, 194, 177, 14, 7, 194, + 176, 14, 7, 194, 175, 14, 7, 194, 174, 14, 7, 194, 173, 14, 7, 194, 172, + 14, 7, 194, 171, 14, 7, 194, 170, 14, 7, 193, 221, 14, 7, 193, 220, 14, + 7, 193, 219, 14, 7, 193, 218, 14, 7, 193, 217, 14, 7, 193, 216, 14, 7, + 193, 215, 14, 7, 193, 214, 14, 7, 193, 213, 14, 7, 193, 212, 14, 7, 193, + 211, 14, 7, 193, 210, 14, 7, 193, 146, 14, 7, 193, 145, 14, 7, 193, 144, + 14, 7, 193, 143, 14, 7, 193, 142, 14, 7, 193, 141, 14, 7, 193, 140, 14, + 7, 193, 139, 14, 7, 193, 138, 14, 7, 192, 154, 14, 7, 192, 153, 14, 7, + 192, 152, 14, 7, 192, 151, 14, 7, 192, 150, 14, 7, 192, 149, 14, 7, 192, + 148, 14, 7, 192, 147, 14, 7, 192, 146, 14, 7, 192, 145, 14, 7, 192, 144, + 14, 7, 192, 143, 14, 7, 192, 142, 14, 7, 192, 141, 14, 7, 192, 140, 14, + 7, 192, 139, 14, 7, 192, 138, 14, 7, 192, 137, 14, 7, 192, 136, 14, 7, + 192, 135, 14, 7, 192, 134, 14, 7, 192, 133, 14, 7, 192, 132, 14, 7, 192, + 131, 14, 7, 192, 130, 14, 7, 192, 129, 14, 7, 192, 128, 14, 7, 192, 127, + 14, 7, 192, 126, 14, 7, 192, 125, 14, 7, 192, 124, 14, 7, 192, 123, 14, + 7, 192, 122, 14, 7, 192, 121, 14, 7, 192, 120, 14, 7, 192, 119, 14, 7, + 192, 118, 14, 7, 192, 117, 14, 7, 192, 116, 14, 7, 192, 115, 14, 7, 192, + 114, 14, 7, 252, 32, 14, 7, 252, 31, 14, 7, 252, 30, 14, 7, 252, 29, 14, + 7, 252, 28, 14, 7, 252, 27, 14, 7, 252, 26, 14, 7, 252, 25, 14, 7, 252, + 24, 14, 7, 252, 23, 14, 7, 252, 22, 14, 7, 252, 21, 14, 7, 252, 20, 14, + 7, 252, 19, 14, 7, 252, 18, 14, 7, 252, 17, 14, 7, 252, 16, 14, 7, 252, + 15, 14, 7, 252, 14, 14, 7, 252, 13, 14, 7, 252, 12, 14, 7, 252, 11, 14, + 7, 252, 10, 14, 7, 252, 9, 14, 7, 252, 8, 14, 7, 252, 7, 14, 7, 252, 6, + 14, 7, 252, 5, 14, 7, 252, 4, 14, 7, 252, 3, 14, 7, 252, 2, 14, 7, 252, + 1, 14, 7, 252, 0, 14, 7, 251, 255, 14, 7, 84, 222, 228, 14, 7, 229, 5, + 222, 228, 14, 7, 223, 148, 250, 27, 198, 249, 202, 14, 14, 7, 223, 148, + 250, 27, 247, 188, 202, 14, 14, 7, 223, 148, 250, 27, 198, 249, 234, 79, + 14, 7, 223, 148, 250, 27, 247, 188, 234, 79, 14, 7, 211, 111, 216, 160, + 14, 7, 248, 100, 205, 198, 14, 7, 234, 80, 205, 198, 29, 7, 255, 26, 29, + 7, 255, 25, 29, 7, 255, 24, 29, 7, 255, 23, 29, 7, 255, 22, 29, 7, 255, + 20, 29, 7, 255, 17, 29, 7, 255, 16, 29, 7, 255, 15, 29, 7, 255, 14, 29, + 7, 255, 13, 29, 7, 255, 12, 29, 7, 255, 11, 29, 7, 255, 10, 29, 7, 255, + 9, 29, 7, 255, 7, 29, 7, 255, 6, 29, 7, 255, 5, 29, 7, 255, 3, 29, 7, + 255, 2, 29, 7, 255, 1, 29, 7, 255, 0, 29, 7, 254, 255, 29, 7, 254, 254, + 29, 7, 254, 253, 29, 7, 254, 252, 29, 7, 254, 251, 29, 7, 254, 250, 29, + 7, 254, 249, 29, 7, 254, 248, 29, 7, 254, 246, 29, 7, 254, 245, 29, 7, + 254, 244, 29, 7, 254, 243, 29, 7, 254, 241, 29, 7, 254, 240, 29, 7, 254, + 239, 29, 7, 254, 238, 29, 7, 254, 237, 29, 7, 254, 236, 29, 7, 254, 235, + 29, 7, 254, 234, 29, 7, 254, 233, 29, 7, 254, 231, 29, 7, 254, 230, 29, + 7, 254, 229, 29, 7, 254, 227, 29, 7, 254, 225, 29, 7, 254, 224, 29, 7, + 254, 223, 29, 7, 254, 222, 29, 7, 254, 221, 29, 7, 254, 220, 29, 7, 254, + 219, 29, 7, 254, 218, 29, 7, 254, 217, 29, 7, 254, 216, 29, 7, 254, 215, + 29, 7, 254, 214, 29, 7, 254, 213, 29, 7, 254, 212, 29, 7, 254, 211, 29, + 7, 254, 210, 29, 7, 254, 209, 29, 7, 254, 208, 29, 7, 254, 207, 29, 7, + 254, 206, 29, 7, 254, 205, 29, 7, 254, 204, 29, 7, 254, 203, 29, 7, 254, + 202, 29, 7, 254, 201, 29, 7, 254, 200, 29, 7, 254, 199, 29, 7, 254, 198, + 29, 7, 254, 197, 29, 7, 254, 196, 29, 7, 254, 195, 29, 7, 254, 194, 29, + 7, 254, 193, 29, 7, 254, 192, 29, 7, 254, 191, 29, 7, 254, 190, 29, 7, + 254, 189, 29, 7, 254, 188, 29, 7, 254, 187, 29, 7, 254, 186, 29, 7, 254, + 185, 29, 7, 254, 184, 29, 7, 254, 183, 29, 7, 254, 182, 29, 7, 254, 181, + 29, 7, 254, 180, 29, 7, 254, 179, 29, 7, 254, 178, 29, 7, 254, 177, 29, + 7, 254, 176, 29, 7, 254, 175, 29, 7, 254, 174, 29, 7, 254, 173, 29, 7, + 254, 172, 29, 7, 254, 171, 29, 7, 254, 170, 29, 7, 254, 169, 29, 7, 254, + 168, 29, 7, 254, 167, 29, 7, 254, 166, 29, 7, 254, 165, 29, 7, 254, 164, + 29, 7, 254, 163, 29, 7, 254, 162, 29, 7, 254, 161, 29, 7, 254, 159, 29, + 7, 254, 158, 29, 7, 254, 157, 29, 7, 254, 156, 29, 7, 254, 155, 29, 7, + 254, 154, 29, 7, 254, 153, 29, 7, 254, 152, 29, 7, 254, 151, 29, 7, 254, + 150, 29, 7, 254, 149, 29, 7, 254, 148, 29, 7, 254, 147, 29, 7, 254, 146, + 29, 7, 254, 145, 29, 7, 254, 144, 29, 7, 254, 143, 29, 7, 254, 142, 29, + 7, 254, 141, 29, 7, 254, 140, 29, 7, 254, 139, 29, 7, 254, 138, 29, 7, + 254, 137, 29, 7, 254, 136, 29, 7, 254, 135, 29, 7, 254, 134, 29, 7, 254, + 133, 29, 7, 254, 132, 29, 7, 254, 131, 29, 7, 254, 130, 29, 7, 254, 129, + 29, 7, 254, 128, 29, 7, 254, 127, 29, 7, 254, 126, 29, 7, 254, 124, 29, + 7, 254, 123, 29, 7, 254, 122, 29, 7, 254, 121, 29, 7, 254, 120, 29, 7, + 254, 119, 29, 7, 254, 118, 29, 7, 254, 117, 29, 7, 254, 116, 29, 7, 254, + 115, 29, 7, 254, 114, 29, 7, 254, 113, 29, 7, 254, 111, 29, 7, 254, 110, + 29, 7, 254, 109, 29, 7, 254, 108, 29, 7, 254, 107, 29, 7, 254, 106, 29, + 7, 254, 105, 29, 7, 254, 104, 29, 7, 254, 103, 29, 7, 254, 102, 29, 7, + 254, 101, 29, 7, 254, 100, 29, 7, 254, 99, 29, 7, 254, 98, 29, 7, 254, + 97, 29, 7, 254, 96, 29, 7, 254, 95, 29, 7, 254, 94, 29, 7, 254, 93, 29, + 7, 254, 92, 29, 7, 254, 91, 29, 7, 254, 90, 29, 7, 254, 89, 29, 7, 254, + 88, 29, 7, 254, 87, 29, 7, 254, 86, 29, 7, 254, 85, 29, 7, 254, 84, 29, + 7, 254, 83, 29, 7, 254, 82, 29, 7, 254, 81, 29, 7, 254, 80, 29, 7, 254, + 79, 29, 7, 254, 78, 29, 7, 254, 77, 29, 7, 254, 76, 29, 7, 254, 75, 29, + 7, 254, 74, 29, 7, 254, 73, 29, 7, 254, 72, 29, 7, 254, 71, 29, 7, 254, + 70, 29, 7, 254, 69, 29, 7, 254, 68, 29, 7, 254, 67, 29, 7, 254, 66, 29, + 7, 254, 65, 29, 7, 254, 64, 29, 7, 254, 63, 29, 7, 254, 62, 29, 7, 254, + 61, 29, 7, 254, 60, 29, 7, 254, 59, 29, 7, 254, 58, 29, 7, 254, 57, 29, + 7, 254, 56, 29, 7, 254, 55, 29, 7, 254, 54, 29, 7, 254, 53, 29, 7, 254, + 52, 29, 7, 254, 51, 29, 7, 254, 50, 29, 7, 254, 49, 29, 7, 254, 48, 29, + 7, 254, 47, 29, 7, 254, 46, 29, 7, 254, 45, 29, 7, 254, 44, 29, 7, 254, + 43, 29, 7, 254, 41, 29, 7, 254, 40, 29, 7, 254, 39, 29, 7, 254, 38, 29, + 7, 254, 37, 29, 7, 254, 36, 29, 7, 254, 35, 29, 7, 254, 34, 29, 7, 254, + 33, 29, 7, 254, 32, 29, 7, 254, 31, 29, 7, 254, 30, 29, 7, 254, 29, 29, + 7, 254, 28, 29, 7, 254, 27, 29, 7, 254, 26, 29, 7, 254, 25, 29, 7, 254, + 24, 29, 7, 254, 23, 29, 7, 254, 22, 29, 7, 254, 21, 29, 7, 254, 20, 29, + 7, 254, 19, 29, 7, 254, 18, 29, 7, 254, 17, 29, 7, 254, 16, 29, 7, 254, + 15, 29, 7, 254, 14, 29, 7, 254, 13, 29, 7, 254, 12, 29, 7, 254, 11, 29, + 7, 254, 10, 29, 7, 254, 9, 29, 7, 254, 8, 29, 7, 254, 7, 29, 7, 254, 6, + 29, 7, 254, 5, 29, 7, 254, 4, 29, 7, 254, 3, 29, 7, 254, 2, 29, 7, 254, + 1, 29, 7, 254, 0, 29, 7, 253, 255, 29, 7, 253, 254, 29, 7, 253, 253, 29, + 7, 253, 252, 29, 7, 253, 251, 29, 7, 253, 250, 29, 7, 253, 249, 29, 7, + 253, 248, 29, 7, 253, 247, 29, 7, 253, 246, 29, 7, 253, 245, 29, 7, 253, + 244, 29, 7, 253, 243, 29, 7, 253, 242, 29, 7, 253, 241, 29, 7, 253, 240, + 29, 7, 253, 239, 29, 7, 253, 238, 29, 7, 253, 237, 29, 7, 253, 236, 29, + 7, 253, 235, 29, 7, 253, 234, 29, 7, 253, 233, 29, 7, 253, 232, 29, 7, + 253, 231, 29, 7, 253, 230, 29, 7, 253, 229, 29, 7, 253, 228, 29, 7, 253, + 227, 29, 7, 253, 226, 29, 7, 253, 225, 29, 7, 253, 224, 29, 7, 253, 223, + 29, 7, 253, 222, 29, 7, 253, 221, 29, 7, 253, 220, 29, 7, 253, 219, 29, + 7, 253, 218, 29, 7, 253, 217, 29, 7, 253, 216, 29, 7, 253, 215, 29, 7, + 253, 214, 29, 7, 253, 213, 29, 7, 253, 212, 29, 7, 253, 211, 29, 7, 253, + 210, 29, 7, 253, 209, 29, 7, 253, 208, 29, 7, 253, 207, 29, 7, 253, 206, + 29, 7, 253, 205, 29, 7, 253, 204, 29, 7, 253, 203, 29, 7, 253, 202, 29, + 7, 253, 201, 29, 7, 253, 200, 29, 7, 253, 199, 29, 7, 253, 198, 29, 7, + 253, 197, 29, 7, 253, 196, 29, 7, 253, 195, 29, 7, 253, 194, 29, 7, 253, + 193, 29, 7, 253, 192, 29, 7, 253, 191, 29, 7, 253, 190, 29, 7, 253, 189, + 29, 7, 253, 188, 29, 7, 253, 187, 29, 7, 253, 185, 29, 7, 253, 184, 29, + 7, 253, 183, 29, 7, 253, 182, 29, 7, 253, 181, 29, 7, 253, 180, 29, 7, + 253, 179, 29, 7, 253, 178, 29, 7, 253, 177, 29, 7, 253, 176, 29, 7, 253, + 175, 29, 7, 253, 172, 29, 7, 253, 171, 29, 7, 253, 170, 29, 7, 253, 169, + 29, 7, 253, 165, 29, 7, 253, 164, 29, 7, 253, 163, 29, 7, 253, 162, 29, + 7, 253, 161, 29, 7, 253, 160, 29, 7, 253, 159, 29, 7, 253, 158, 29, 7, + 253, 157, 29, 7, 253, 156, 29, 7, 253, 155, 29, 7, 253, 154, 29, 7, 253, + 153, 29, 7, 253, 152, 29, 7, 253, 151, 29, 7, 253, 150, 29, 7, 253, 149, + 29, 7, 253, 148, 29, 7, 253, 147, 29, 7, 253, 145, 29, 7, 253, 144, 29, + 7, 253, 143, 29, 7, 253, 142, 29, 7, 253, 141, 29, 7, 253, 140, 29, 7, + 253, 139, 29, 7, 253, 138, 29, 7, 253, 137, 29, 7, 253, 136, 29, 7, 253, + 135, 29, 7, 253, 134, 29, 7, 253, 133, 29, 7, 253, 132, 29, 7, 253, 131, + 29, 7, 253, 130, 29, 7, 253, 129, 29, 7, 253, 128, 29, 7, 253, 127, 29, + 7, 253, 126, 29, 7, 253, 125, 29, 7, 253, 124, 29, 7, 253, 123, 29, 7, + 253, 122, 29, 7, 253, 121, 29, 7, 253, 120, 29, 7, 253, 119, 29, 7, 253, + 118, 29, 7, 253, 117, 29, 7, 253, 116, 29, 7, 253, 115, 29, 7, 253, 114, + 29, 7, 253, 113, 29, 7, 253, 112, 29, 7, 253, 111, 29, 7, 253, 110, 29, + 7, 253, 109, 29, 7, 253, 108, 29, 7, 253, 107, 29, 7, 253, 106, 29, 7, + 253, 105, 29, 7, 253, 104, 29, 7, 253, 103, 29, 7, 253, 102, 29, 7, 253, + 101, 29, 7, 253, 100, 29, 7, 253, 99, 29, 7, 253, 98, 29, 7, 253, 97, 29, + 7, 253, 96, 29, 7, 253, 95, 29, 7, 253, 94, 29, 7, 253, 93, 29, 7, 253, + 92, 29, 7, 253, 91, 29, 7, 253, 90, 29, 7, 253, 89, 29, 7, 253, 88, 29, + 7, 253, 87, 29, 7, 253, 86, 29, 7, 253, 85, 29, 7, 253, 84, 208, 76, 211, + 164, 207, 151, 29, 7, 253, 83, 29, 7, 253, 82, 29, 7, 253, 81, 29, 7, + 253, 80, 29, 7, 253, 79, 29, 7, 253, 78, 29, 7, 253, 77, 29, 7, 253, 76, + 29, 7, 253, 75, 29, 7, 253, 74, 29, 7, 253, 73, 29, 7, 253, 72, 174, 29, + 7, 253, 71, 29, 7, 253, 70, 29, 7, 253, 69, 29, 7, 253, 68, 29, 7, 253, + 67, 29, 7, 253, 66, 29, 7, 253, 65, 29, 7, 253, 63, 29, 7, 253, 61, 29, + 7, 253, 59, 29, 7, 253, 57, 29, 7, 253, 55, 29, 7, 253, 53, 29, 7, 253, + 51, 29, 7, 253, 49, 29, 7, 253, 47, 29, 7, 253, 45, 248, 100, 219, 92, + 77, 29, 7, 253, 43, 234, 80, 219, 92, 77, 29, 7, 253, 42, 29, 7, 253, 40, + 29, 7, 253, 38, 29, 7, 253, 36, 29, 7, 253, 34, 29, 7, 253, 32, 29, 7, + 253, 30, 29, 7, 253, 28, 29, 7, 253, 26, 29, 7, 253, 25, 29, 7, 253, 24, + 29, 7, 253, 23, 29, 7, 253, 22, 29, 7, 253, 21, 29, 7, 253, 20, 29, 7, + 253, 19, 29, 7, 253, 18, 29, 7, 253, 17, 29, 7, 253, 16, 29, 7, 253, 15, + 29, 7, 253, 14, 29, 7, 253, 13, 29, 7, 253, 12, 29, 7, 253, 11, 29, 7, + 253, 10, 29, 7, 253, 9, 29, 7, 253, 8, 29, 7, 253, 7, 29, 7, 253, 6, 29, + 7, 253, 5, 29, 7, 253, 4, 29, 7, 253, 3, 29, 7, 253, 2, 29, 7, 253, 1, + 29, 7, 253, 0, 29, 7, 252, 255, 29, 7, 252, 254, 29, 7, 252, 253, 29, 7, + 252, 252, 29, 7, 252, 251, 29, 7, 252, 250, 29, 7, 252, 249, 29, 7, 252, + 248, 29, 7, 252, 247, 29, 7, 252, 246, 29, 7, 252, 245, 29, 7, 252, 244, + 29, 7, 252, 243, 29, 7, 252, 242, 29, 7, 252, 241, 29, 7, 252, 240, 29, + 7, 252, 239, 29, 7, 252, 238, 29, 7, 252, 237, 29, 7, 252, 236, 29, 7, + 252, 235, 29, 7, 252, 234, 29, 7, 252, 233, 29, 7, 252, 232, 29, 7, 252, + 231, 29, 7, 252, 230, 29, 7, 252, 229, 29, 7, 252, 228, 29, 7, 252, 227, + 29, 7, 252, 226, 29, 7, 252, 225, 29, 7, 252, 224, 29, 7, 252, 223, 29, + 7, 252, 222, 29, 7, 252, 221, 29, 7, 252, 220, 29, 7, 252, 219, 29, 7, + 252, 218, 29, 7, 252, 217, 29, 7, 252, 216, 29, 7, 252, 215, 29, 7, 252, + 214, 29, 7, 252, 213, 29, 7, 252, 212, 29, 7, 252, 211, 29, 7, 252, 210, + 29, 7, 252, 209, 29, 7, 252, 208, 29, 7, 252, 207, 29, 7, 252, 206, 29, + 7, 252, 205, 29, 7, 252, 204, 29, 7, 252, 203, 29, 7, 252, 202, 29, 7, + 252, 201, 29, 7, 252, 200, 29, 7, 252, 199, 29, 7, 252, 198, 29, 7, 252, + 197, 29, 7, 252, 196, 29, 7, 252, 195, 29, 7, 252, 194, 29, 7, 252, 193, + 29, 7, 252, 192, 29, 7, 252, 191, 29, 7, 252, 190, 29, 7, 252, 189, 29, + 7, 252, 188, 29, 7, 252, 187, 29, 7, 252, 186, 29, 7, 252, 185, 29, 7, + 252, 184, 29, 7, 252, 183, 29, 7, 252, 182, 29, 7, 252, 181, 29, 7, 252, + 180, 29, 7, 252, 179, 29, 7, 252, 178, 29, 7, 252, 177, 29, 7, 252, 176, + 29, 7, 252, 175, 29, 7, 252, 174, 29, 7, 252, 173, 29, 7, 252, 172, 25, + 1, 210, 84, 214, 98, 216, 217, 25, 1, 210, 84, 231, 166, 232, 156, 25, 1, + 210, 84, 209, 175, 216, 218, 209, 251, 25, 1, 210, 84, 209, 175, 216, + 218, 209, 252, 25, 1, 210, 84, 215, 85, 216, 217, 25, 1, 210, 84, 203, + 159, 25, 1, 210, 84, 199, 62, 216, 217, 25, 1, 210, 84, 212, 147, 216, + 217, 25, 1, 210, 84, 203, 223, 211, 78, 213, 240, 25, 1, 210, 84, 209, + 175, 211, 78, 213, 241, 209, 251, 25, 1, 210, 84, 209, 175, 211, 78, 213, + 241, 209, 252, 25, 1, 210, 84, 217, 199, 25, 1, 210, 84, 198, 46, 217, + 200, 25, 1, 210, 84, 214, 159, 25, 1, 210, 84, 217, 196, 25, 1, 210, 84, + 217, 147, 25, 1, 210, 84, 215, 174, 25, 1, 210, 84, 204, 148, 25, 1, 210, + 84, 213, 31, 25, 1, 210, 84, 222, 13, 25, 1, 210, 84, 213, 207, 25, 1, + 210, 84, 201, 86, 25, 1, 210, 84, 214, 97, 25, 1, 210, 84, 220, 75, 25, + 1, 210, 84, 219, 237, 220, 247, 25, 1, 210, 84, 213, 41, 216, 225, 25, 1, + 210, 84, 217, 203, 25, 1, 210, 84, 210, 215, 25, 1, 210, 84, 231, 65, 25, + 1, 210, 84, 211, 29, 25, 1, 210, 84, 216, 56, 214, 132, 25, 1, 210, 84, + 212, 128, 216, 228, 25, 1, 210, 84, 124, 192, 184, 215, 78, 25, 1, 210, + 84, 231, 66, 25, 1, 210, 84, 213, 41, 213, 42, 25, 1, 210, 84, 203, 44, + 25, 1, 210, 84, 216, 210, 25, 1, 210, 84, 216, 231, 25, 1, 210, 84, 216, + 31, 25, 1, 210, 84, 222, 138, 25, 1, 210, 84, 211, 78, 220, 29, 25, 1, + 210, 84, 215, 0, 220, 29, 25, 1, 210, 84, 210, 106, 25, 1, 210, 84, 217, + 197, 25, 1, 210, 84, 214, 26, 25, 1, 210, 84, 209, 30, 25, 1, 210, 84, + 198, 38, 25, 1, 210, 84, 219, 32, 25, 1, 210, 84, 202, 184, 25, 1, 210, + 84, 199, 249, 25, 1, 210, 84, 217, 194, 25, 1, 210, 84, 222, 20, 25, 1, + 210, 84, 214, 252, 25, 1, 210, 84, 221, 5, 25, 1, 210, 84, 216, 32, 25, + 1, 210, 84, 203, 155, 25, 1, 210, 84, 219, 85, 25, 1, 210, 84, 232, 227, + 25, 1, 210, 84, 207, 31, 25, 1, 210, 84, 221, 58, 25, 1, 210, 84, 202, + 180, 25, 1, 210, 84, 217, 142, 210, 40, 25, 1, 210, 84, 203, 216, 25, 1, + 210, 84, 213, 40, 25, 1, 210, 84, 203, 197, 213, 52, 192, 192, 25, 1, + 210, 84, 212, 169, 216, 52, 25, 1, 210, 84, 211, 73, 25, 1, 210, 84, 213, + 209, 25, 1, 210, 84, 197, 49, 25, 1, 210, 84, 214, 135, 25, 1, 210, 84, + 217, 193, 25, 1, 210, 84, 213, 252, 25, 1, 210, 84, 217, 77, 25, 1, 210, + 84, 212, 184, 25, 1, 210, 84, 199, 253, 25, 1, 210, 84, 202, 177, 25, 1, + 210, 84, 211, 74, 25, 1, 210, 84, 213, 56, 25, 1, 210, 84, 217, 201, 25, + 1, 210, 84, 212, 181, 25, 1, 210, 84, 222, 100, 25, 1, 210, 84, 213, 59, + 25, 1, 210, 84, 196, 118, 25, 1, 210, 84, 219, 36, 25, 1, 210, 84, 214, + 196, 25, 1, 210, 84, 215, 52, 25, 1, 210, 84, 217, 76, 25, 1, 210, 83, + 213, 54, 25, 1, 210, 83, 198, 46, 217, 198, 25, 1, 210, 83, 203, 107, 25, + 1, 210, 83, 204, 152, 198, 45, 25, 1, 210, 83, 219, 87, 213, 37, 25, 1, + 210, 83, 217, 83, 217, 202, 25, 1, 210, 83, 221, 188, 25, 1, 210, 83, + 193, 32, 25, 1, 210, 83, 217, 78, 25, 1, 210, 83, 222, 124, 25, 1, 210, + 83, 210, 164, 25, 1, 210, 83, 193, 115, 220, 29, 25, 1, 210, 83, 220, 95, + 213, 52, 212, 195, 25, 1, 210, 83, 213, 34, 203, 242, 25, 1, 210, 83, + 214, 223, 213, 255, 25, 1, 210, 83, 231, 63, 25, 1, 210, 83, 209, 241, + 25, 1, 210, 83, 198, 46, 213, 50, 25, 1, 210, 83, 203, 247, 213, 250, 25, + 1, 210, 83, 203, 243, 25, 1, 210, 83, 216, 218, 199, 252, 25, 1, 210, 83, + 217, 65, 217, 79, 25, 1, 210, 83, 212, 182, 213, 37, 25, 1, 210, 83, 222, + 9, 25, 1, 210, 83, 231, 64, 25, 1, 210, 83, 222, 5, 25, 1, 210, 83, 220, + 179, 25, 1, 210, 83, 210, 218, 25, 1, 210, 83, 196, 47, 25, 1, 210, 83, + 214, 99, 215, 172, 25, 1, 210, 83, 214, 134, 217, 61, 25, 1, 210, 83, + 193, 242, 25, 1, 210, 83, 206, 69, 25, 1, 210, 83, 200, 170, 25, 1, 210, + 83, 216, 230, 25, 1, 210, 83, 214, 118, 25, 1, 210, 83, 214, 119, 220, + 72, 25, 1, 210, 83, 216, 220, 25, 1, 210, 83, 201, 139, 25, 1, 210, 83, + 217, 69, 25, 1, 210, 83, 216, 36, 25, 1, 210, 83, 212, 199, 25, 1, 210, + 83, 209, 34, 25, 1, 210, 83, 216, 229, 214, 136, 25, 1, 210, 83, 233, 16, + 25, 1, 210, 83, 217, 56, 25, 1, 210, 83, 233, 40, 25, 1, 210, 83, 222, + 17, 25, 1, 210, 83, 217, 228, 213, 244, 25, 1, 210, 83, 217, 228, 213, + 220, 25, 1, 210, 83, 219, 236, 25, 1, 210, 83, 214, 142, 25, 1, 210, 83, + 213, 61, 25, 1, 210, 83, 172, 25, 1, 210, 83, 221, 171, 25, 1, 210, 83, + 214, 87, 25, 1, 210, 82, 214, 98, 217, 200, 25, 1, 210, 82, 212, 146, 25, + 1, 210, 82, 192, 192, 25, 1, 210, 82, 194, 145, 25, 1, 210, 82, 214, 135, + 25, 1, 210, 82, 214, 244, 25, 1, 210, 82, 214, 105, 25, 1, 210, 82, 231, + 73, 25, 1, 210, 82, 217, 73, 25, 1, 210, 82, 231, 173, 25, 1, 210, 82, + 212, 171, 216, 100, 216, 232, 25, 1, 210, 82, 213, 28, 217, 64, 25, 1, + 210, 82, 217, 70, 25, 1, 210, 82, 209, 247, 25, 1, 210, 82, 214, 229, 25, + 1, 210, 82, 217, 81, 247, 15, 25, 1, 210, 82, 222, 7, 25, 1, 210, 82, + 231, 74, 25, 1, 210, 82, 222, 14, 25, 1, 210, 82, 192, 215, 215, 205, 25, + 1, 210, 82, 212, 140, 25, 1, 210, 82, 217, 58, 25, 1, 210, 82, 213, 60, + 25, 1, 210, 82, 217, 64, 25, 1, 210, 82, 193, 33, 25, 1, 210, 82, 221, + 66, 25, 1, 210, 82, 222, 159, 25, 1, 210, 82, 204, 147, 25, 1, 210, 82, + 214, 238, 25, 1, 210, 82, 200, 168, 25, 1, 210, 82, 213, 224, 25, 1, 210, + 82, 199, 62, 192, 196, 25, 1, 210, 82, 201, 171, 25, 1, 210, 82, 214, + 125, 212, 195, 25, 1, 210, 82, 196, 46, 25, 1, 210, 82, 215, 55, 25, 1, + 210, 82, 217, 228, 222, 16, 25, 1, 210, 82, 213, 42, 25, 1, 210, 82, 214, + 120, 25, 1, 210, 82, 220, 76, 25, 1, 210, 82, 217, 66, 25, 1, 210, 82, + 216, 209, 25, 1, 210, 82, 213, 36, 25, 1, 210, 82, 199, 248, 25, 1, 210, + 82, 214, 122, 25, 1, 210, 82, 232, 75, 25, 1, 210, 82, 214, 243, 25, 1, + 210, 82, 213, 62, 25, 1, 210, 82, 213, 58, 25, 1, 210, 82, 247, 98, 25, + 1, 210, 82, 196, 48, 25, 1, 210, 82, 217, 71, 25, 1, 210, 82, 206, 218, + 25, 1, 210, 82, 213, 254, 25, 1, 210, 82, 220, 94, 25, 1, 210, 82, 199, + 59, 25, 1, 210, 82, 213, 44, 214, 87, 25, 1, 210, 82, 213, 246, 25, 1, + 210, 82, 222, 20, 25, 1, 210, 82, 214, 127, 25, 1, 210, 82, 217, 193, 25, + 1, 210, 82, 217, 59, 25, 1, 210, 82, 219, 36, 25, 1, 210, 82, 220, 247, + 25, 1, 210, 82, 213, 252, 25, 1, 210, 82, 214, 87, 25, 1, 210, 82, 193, + 232, 25, 1, 210, 82, 214, 123, 25, 1, 210, 82, 213, 47, 25, 1, 210, 82, + 213, 38, 25, 1, 210, 82, 221, 7, 213, 209, 25, 1, 210, 82, 213, 45, 25, + 1, 210, 82, 214, 251, 25, 1, 210, 82, 217, 228, 213, 50, 25, 1, 210, 82, + 193, 129, 25, 1, 210, 82, 214, 250, 25, 1, 210, 82, 203, 158, 25, 1, 210, + 82, 204, 150, 25, 1, 210, 82, 217, 67, 25, 1, 210, 82, 217, 200, 25, 1, + 210, 82, 217, 77, 25, 1, 210, 82, 222, 8, 25, 1, 210, 82, 217, 68, 25, 1, + 210, 82, 222, 12, 25, 1, 210, 82, 217, 81, 210, 46, 25, 1, 210, 82, 192, + 175, 25, 1, 210, 82, 213, 242, 25, 1, 210, 82, 216, 156, 25, 1, 210, 82, + 215, 235, 25, 1, 210, 82, 203, 219, 25, 1, 210, 82, 222, 31, 220, 54, 25, + 1, 210, 82, 222, 31, 233, 53, 25, 1, 210, 82, 214, 157, 25, 1, 210, 82, + 215, 52, 25, 1, 210, 82, 219, 157, 25, 1, 210, 82, 210, 6, 25, 1, 210, + 82, 210, 154, 25, 1, 210, 82, 200, 8, 25, 1, 154, 217, 57, 25, 1, 154, + 194, 143, 25, 1, 154, 213, 240, 25, 1, 154, 216, 217, 25, 1, 154, 213, + 238, 25, 1, 154, 219, 202, 25, 1, 154, 213, 243, 25, 1, 154, 213, 57, 25, + 1, 154, 214, 141, 25, 1, 154, 212, 195, 25, 1, 154, 193, 243, 25, 1, 154, + 214, 95, 25, 1, 154, 204, 10, 25, 1, 154, 214, 106, 25, 1, 154, 222, 15, + 25, 1, 154, 199, 250, 25, 1, 154, 203, 245, 25, 1, 154, 213, 251, 25, 1, + 154, 201, 139, 25, 1, 154, 222, 20, 25, 1, 154, 193, 117, 25, 1, 154, + 221, 8, 25, 1, 154, 206, 28, 25, 1, 154, 216, 222, 25, 1, 154, 214, 242, + 25, 1, 154, 217, 164, 25, 1, 154, 216, 228, 25, 1, 154, 204, 149, 25, 1, + 154, 193, 59, 25, 1, 154, 213, 245, 25, 1, 154, 222, 11, 217, 60, 25, 1, + 154, 214, 102, 25, 1, 154, 198, 45, 25, 1, 154, 231, 83, 25, 1, 154, 214, + 92, 25, 1, 154, 233, 17, 25, 1, 154, 214, 246, 25, 1, 154, 216, 201, 25, + 1, 154, 219, 230, 25, 1, 154, 214, 228, 25, 1, 154, 216, 51, 25, 1, 154, + 216, 205, 25, 1, 154, 209, 14, 25, 1, 154, 216, 203, 25, 1, 154, 216, + 219, 25, 1, 154, 219, 19, 25, 1, 154, 213, 49, 25, 1, 154, 217, 80, 25, + 1, 154, 220, 236, 25, 1, 154, 212, 184, 25, 1, 154, 199, 253, 25, 1, 154, + 202, 177, 25, 1, 154, 192, 175, 25, 1, 154, 222, 12, 25, 1, 154, 208, 52, + 25, 1, 154, 200, 55, 25, 1, 154, 214, 103, 25, 1, 154, 216, 224, 25, 1, + 154, 213, 48, 25, 1, 154, 222, 10, 25, 1, 154, 209, 253, 25, 1, 154, 210, + 99, 25, 1, 154, 212, 157, 25, 1, 154, 219, 236, 25, 1, 154, 214, 142, 25, + 1, 154, 216, 221, 25, 1, 154, 214, 115, 25, 1, 154, 192, 189, 25, 1, 154, + 210, 253, 25, 1, 154, 192, 188, 25, 1, 154, 214, 251, 25, 1, 154, 213, + 37, 25, 1, 154, 201, 173, 25, 1, 154, 221, 12, 25, 1, 154, 214, 131, 25, + 1, 154, 214, 100, 25, 1, 154, 198, 20, 25, 1, 154, 216, 232, 25, 1, 154, + 221, 2, 25, 1, 154, 213, 46, 25, 1, 154, 199, 251, 25, 1, 154, 217, 195, + 25, 1, 154, 214, 140, 25, 1, 154, 219, 229, 25, 1, 154, 214, 121, 25, 1, + 154, 213, 51, 25, 1, 154, 213, 224, 25, 1, 154, 231, 67, 25, 1, 154, 221, + 33, 25, 1, 154, 207, 206, 211, 225, 25, 1, 154, 200, 157, 25, 1, 154, + 198, 245, 25, 1, 154, 212, 181, 25, 1, 154, 207, 88, 25, 1, 154, 220, 31, + 25, 1, 154, 217, 28, 25, 1, 154, 218, 236, 25, 1, 154, 201, 86, 25, 1, + 154, 215, 241, 25, 1, 154, 203, 231, 25, 1, 154, 203, 241, 25, 1, 154, + 220, 208, 25, 1, 154, 213, 22, 25, 1, 154, 203, 164, 25, 1, 154, 213, 39, + 25, 1, 154, 210, 168, 25, 1, 154, 214, 60, 25, 1, 154, 203, 196, 25, 1, + 154, 209, 29, 25, 1, 154, 215, 172, 25, 1, 154, 219, 65, 25, 1, 154, 207, + 206, 215, 230, 25, 1, 154, 199, 128, 25, 1, 154, 213, 25, 25, 1, 154, + 217, 81, 179, 25, 1, 154, 206, 26, 25, 1, 154, 233, 96, 25, 1, 110, 214, + 250, 25, 1, 110, 198, 252, 25, 1, 110, 217, 70, 25, 1, 110, 220, 76, 25, + 1, 110, 195, 238, 25, 1, 110, 219, 71, 25, 1, 110, 211, 77, 25, 1, 110, + 202, 188, 25, 1, 110, 208, 26, 25, 1, 110, 213, 53, 25, 1, 110, 214, 221, + 25, 1, 110, 209, 47, 25, 1, 110, 200, 129, 25, 1, 110, 214, 108, 25, 1, + 110, 221, 62, 25, 1, 110, 193, 235, 25, 1, 110, 205, 205, 25, 1, 110, + 214, 132, 25, 1, 110, 211, 74, 25, 1, 110, 198, 254, 25, 1, 110, 221, 6, + 25, 1, 110, 219, 86, 25, 1, 110, 213, 56, 25, 1, 110, 214, 84, 25, 1, + 110, 217, 201, 25, 1, 110, 214, 101, 25, 1, 110, 214, 83, 25, 1, 110, + 213, 55, 25, 1, 110, 207, 85, 25, 1, 110, 213, 242, 25, 1, 110, 210, 166, + 25, 1, 110, 206, 91, 25, 1, 110, 214, 116, 25, 1, 110, 216, 211, 25, 1, + 110, 231, 61, 25, 1, 110, 214, 104, 25, 1, 110, 213, 253, 25, 1, 110, + 217, 141, 25, 1, 110, 219, 67, 25, 1, 110, 214, 137, 25, 1, 110, 214, + 234, 25, 1, 110, 200, 156, 213, 37, 25, 1, 110, 204, 151, 25, 1, 110, + 209, 40, 25, 1, 110, 214, 254, 202, 196, 25, 1, 110, 214, 124, 212, 195, + 25, 1, 110, 193, 18, 25, 1, 110, 231, 62, 25, 1, 110, 198, 39, 25, 1, + 110, 193, 36, 25, 1, 110, 209, 198, 25, 1, 110, 198, 26, 25, 1, 110, 222, + 18, 25, 1, 110, 201, 172, 25, 1, 110, 199, 252, 25, 1, 110, 196, 49, 25, + 1, 110, 194, 86, 25, 1, 110, 220, 182, 25, 1, 110, 209, 51, 25, 1, 110, + 200, 169, 25, 1, 110, 231, 82, 25, 1, 110, 214, 147, 25, 1, 110, 203, + 244, 25, 1, 110, 216, 206, 25, 1, 110, 217, 74, 25, 1, 110, 212, 144, 25, + 1, 110, 213, 205, 25, 1, 110, 231, 169, 25, 1, 110, 198, 27, 25, 1, 110, + 221, 16, 25, 1, 110, 193, 93, 25, 1, 110, 212, 182, 242, 101, 25, 1, 110, + 193, 7, 25, 1, 110, 216, 223, 25, 1, 110, 214, 239, 25, 1, 110, 210, 41, + 25, 1, 110, 192, 195, 25, 1, 110, 219, 231, 25, 1, 110, 232, 75, 25, 1, + 110, 231, 168, 25, 1, 110, 214, 94, 25, 1, 110, 222, 20, 25, 1, 110, 217, + 204, 25, 1, 110, 214, 107, 25, 1, 110, 231, 68, 25, 1, 110, 233, 97, 25, + 1, 110, 213, 26, 25, 1, 110, 210, 100, 25, 1, 110, 193, 34, 25, 1, 110, + 214, 133, 25, 1, 110, 212, 182, 248, 60, 25, 1, 110, 212, 124, 25, 1, + 110, 209, 170, 25, 1, 110, 216, 156, 25, 1, 110, 232, 73, 25, 1, 110, + 215, 78, 25, 1, 110, 215, 235, 25, 1, 110, 231, 67, 25, 1, 110, 232, 78, + 70, 25, 1, 110, 215, 173, 25, 1, 110, 209, 46, 25, 1, 110, 214, 96, 25, + 1, 110, 220, 247, 25, 1, 110, 210, 38, 25, 1, 110, 213, 40, 25, 1, 110, + 193, 35, 25, 1, 110, 214, 117, 25, 1, 110, 211, 78, 210, 139, 25, 1, 110, + 232, 78, 246, 253, 25, 1, 110, 232, 157, 25, 1, 110, 213, 247, 25, 1, + 110, 64, 25, 1, 110, 198, 245, 25, 1, 110, 74, 25, 1, 110, 70, 25, 1, + 110, 220, 74, 25, 1, 110, 211, 78, 209, 207, 25, 1, 110, 200, 174, 25, 1, + 110, 200, 113, 25, 1, 110, 214, 254, 215, 160, 228, 193, 25, 1, 110, 203, + 219, 25, 1, 110, 193, 31, 25, 1, 110, 214, 77, 25, 1, 110, 192, 200, 25, + 1, 110, 192, 233, 201, 65, 25, 1, 110, 192, 233, 238, 208, 25, 1, 110, + 192, 183, 25, 1, 110, 192, 191, 25, 1, 110, 222, 6, 25, 1, 110, 210, 98, + 25, 1, 110, 213, 248, 234, 34, 25, 1, 110, 209, 42, 25, 1, 110, 193, 241, + 25, 1, 110, 233, 40, 25, 1, 110, 196, 118, 25, 1, 110, 219, 36, 25, 1, + 110, 216, 175, 25, 1, 110, 207, 170, 25, 1, 110, 208, 53, 25, 1, 110, + 214, 76, 25, 1, 110, 214, 165, 25, 1, 110, 203, 211, 25, 1, 110, 203, + 196, 25, 1, 110, 232, 78, 207, 209, 25, 1, 110, 181, 25, 1, 110, 210, 51, + 25, 1, 110, 219, 65, 25, 1, 110, 221, 113, 25, 1, 110, 217, 5, 25, 1, + 110, 172, 25, 1, 110, 217, 138, 25, 1, 110, 199, 254, 25, 1, 110, 221, + 204, 25, 1, 110, 216, 55, 25, 1, 110, 200, 30, 25, 1, 110, 233, 64, 25, + 1, 110, 231, 55, 25, 1, 210, 81, 160, 25, 1, 210, 81, 68, 25, 1, 210, 81, + 221, 33, 25, 1, 210, 81, 234, 171, 25, 1, 210, 81, 207, 234, 25, 1, 210, + 81, 200, 157, 25, 1, 210, 81, 212, 181, 25, 1, 210, 81, 177, 25, 1, 210, + 81, 207, 88, 25, 1, 210, 81, 207, 136, 25, 1, 210, 81, 217, 28, 25, 1, + 210, 81, 200, 174, 25, 1, 210, 81, 214, 253, 25, 1, 210, 81, 213, 254, + 25, 1, 210, 81, 218, 236, 25, 1, 210, 81, 201, 86, 25, 1, 210, 81, 203, + 231, 25, 1, 210, 81, 203, 125, 25, 1, 210, 81, 204, 147, 25, 1, 210, 81, + 220, 208, 25, 1, 210, 81, 222, 20, 25, 1, 210, 81, 212, 246, 25, 1, 210, + 81, 213, 22, 25, 1, 210, 81, 213, 225, 25, 1, 210, 81, 192, 232, 25, 1, + 210, 81, 203, 164, 25, 1, 210, 81, 168, 25, 1, 210, 81, 213, 59, 25, 1, + 210, 81, 210, 98, 25, 1, 210, 81, 213, 39, 25, 1, 210, 81, 193, 241, 25, + 1, 210, 81, 210, 168, 25, 1, 210, 81, 206, 218, 25, 1, 210, 81, 214, 60, + 25, 1, 210, 81, 207, 170, 25, 1, 210, 81, 222, 30, 25, 1, 210, 81, 214, + 93, 25, 1, 210, 81, 214, 144, 25, 1, 210, 81, 203, 211, 25, 1, 210, 81, + 209, 47, 25, 1, 210, 81, 232, 157, 25, 1, 210, 81, 194, 169, 25, 1, 210, + 81, 219, 209, 25, 1, 210, 81, 219, 65, 25, 1, 210, 81, 221, 113, 25, 1, + 210, 81, 217, 72, 25, 1, 210, 81, 207, 205, 25, 1, 210, 81, 172, 25, 1, + 210, 81, 216, 91, 25, 1, 210, 81, 217, 80, 25, 1, 210, 81, 200, 8, 25, 1, + 210, 81, 221, 69, 25, 1, 210, 81, 206, 48, 25, 1, 210, 81, 194, 222, 215, + 245, 1, 189, 215, 245, 1, 214, 113, 215, 245, 1, 193, 1, 215, 245, 1, + 216, 122, 215, 245, 1, 249, 3, 215, 245, 1, 238, 0, 215, 245, 1, 64, 215, + 245, 1, 210, 77, 215, 245, 1, 221, 244, 215, 245, 1, 230, 31, 215, 245, + 1, 237, 231, 215, 245, 1, 242, 168, 215, 245, 1, 222, 50, 215, 245, 1, + 211, 226, 215, 245, 1, 217, 201, 215, 245, 1, 214, 20, 215, 245, 1, 166, + 215, 245, 1, 211, 194, 215, 245, 1, 74, 215, 245, 1, 207, 55, 215, 245, + 1, 203, 236, 215, 245, 1, 199, 223, 215, 245, 1, 234, 199, 215, 245, 1, + 194, 169, 215, 245, 1, 71, 215, 245, 1, 221, 113, 215, 245, 1, 220, 83, + 215, 245, 1, 177, 215, 245, 1, 230, 88, 215, 245, 1, 207, 151, 215, 245, + 1, 200, 45, 215, 245, 17, 192, 76, 215, 245, 17, 101, 215, 245, 17, 104, + 215, 245, 17, 133, 215, 245, 17, 134, 215, 245, 17, 151, 215, 245, 17, + 170, 215, 245, 17, 179, 215, 245, 17, 174, 215, 245, 17, 182, 215, 245, + 237, 208, 215, 245, 55, 237, 208, 248, 173, 196, 154, 1, 234, 69, 248, + 173, 196, 154, 1, 160, 248, 173, 196, 154, 1, 205, 223, 248, 173, 196, + 154, 1, 233, 97, 248, 173, 196, 154, 1, 217, 75, 248, 173, 196, 154, 1, + 193, 19, 248, 173, 196, 154, 1, 231, 218, 248, 173, 196, 154, 1, 237, 21, + 248, 173, 196, 154, 1, 221, 68, 248, 173, 196, 154, 1, 222, 233, 248, + 173, 196, 154, 1, 228, 146, 248, 173, 196, 154, 1, 194, 169, 248, 173, + 196, 154, 1, 192, 8, 248, 173, 196, 154, 1, 231, 162, 248, 173, 196, 154, + 1, 236, 146, 248, 173, 196, 154, 1, 246, 158, 248, 173, 196, 154, 1, 196, + 244, 248, 173, 196, 154, 1, 155, 248, 173, 196, 154, 1, 249, 3, 248, 173, + 196, 154, 1, 194, 223, 248, 173, 196, 154, 1, 193, 63, 248, 173, 196, + 154, 1, 166, 248, 173, 196, 154, 1, 194, 161, 248, 173, 196, 154, 1, 64, + 248, 173, 196, 154, 1, 74, 248, 173, 196, 154, 1, 211, 194, 248, 173, + 196, 154, 1, 68, 248, 173, 196, 154, 1, 234, 171, 248, 173, 196, 154, 1, + 71, 248, 173, 196, 154, 1, 70, 248, 173, 196, 154, 38, 139, 199, 18, 248, + 173, 196, 154, 38, 132, 199, 18, 248, 173, 196, 154, 38, 216, 162, 199, + 18, 248, 173, 196, 154, 38, 219, 49, 199, 18, 248, 173, 196, 154, 38, + 229, 153, 199, 18, 248, 173, 196, 154, 232, 71, 201, 238, 141, 89, 18, + 222, 47, 141, 89, 18, 222, 43, 141, 89, 18, 221, 193, 141, 89, 18, 221, + 156, 141, 89, 18, 222, 75, 141, 89, 18, 222, 72, 141, 89, 18, 221, 17, + 141, 89, 18, 220, 244, 141, 89, 18, 222, 49, 141, 89, 18, 222, 4, 141, + 89, 18, 222, 134, 141, 89, 18, 222, 131, 141, 89, 18, 221, 87, 141, 89, + 18, 221, 84, 141, 89, 18, 222, 68, 141, 89, 18, 222, 66, 141, 89, 18, + 221, 19, 141, 89, 18, 221, 18, 141, 89, 18, 221, 106, 141, 89, 18, 221, + 73, 141, 89, 18, 221, 195, 141, 89, 18, 221, 194, 141, 89, 18, 222, 149, + 141, 89, 18, 222, 71, 141, 89, 18, 220, 234, 141, 89, 18, 220, 225, 141, + 89, 18, 222, 158, 141, 89, 18, 222, 150, 141, 89, 116, 196, 129, 141, 89, + 116, 213, 29, 141, 89, 116, 220, 60, 141, 89, 116, 230, 11, 141, 89, 116, + 213, 181, 141, 89, 116, 208, 17, 141, 89, 116, 213, 208, 141, 89, 116, + 208, 213, 141, 89, 116, 193, 80, 141, 89, 116, 229, 128, 141, 89, 116, + 217, 96, 141, 89, 116, 242, 249, 141, 89, 116, 215, 2, 141, 89, 116, 229, + 64, 141, 89, 116, 209, 216, 141, 89, 116, 213, 35, 141, 89, 116, 215, 42, + 141, 89, 116, 250, 8, 141, 89, 116, 193, 205, 141, 89, 116, 246, 191, + 141, 89, 122, 242, 137, 198, 36, 141, 89, 122, 242, 137, 202, 212, 141, + 89, 122, 242, 137, 222, 22, 141, 89, 122, 242, 137, 221, 235, 141, 89, + 122, 242, 137, 201, 170, 141, 89, 122, 242, 137, 229, 22, 141, 89, 122, + 242, 137, 200, 99, 141, 89, 3, 195, 233, 199, 173, 141, 89, 3, 195, 233, + 198, 107, 246, 149, 141, 89, 3, 242, 137, 242, 238, 141, 89, 3, 195, 233, + 199, 201, 141, 89, 3, 195, 233, 233, 37, 141, 89, 3, 193, 160, 213, 23, + 141, 89, 3, 193, 160, 207, 153, 141, 89, 3, 193, 160, 198, 228, 141, 89, + 3, 193, 160, 233, 78, 141, 89, 3, 195, 233, 205, 199, 141, 89, 3, 217, + 27, 201, 174, 141, 89, 3, 195, 233, 213, 75, 141, 89, 3, 228, 54, 193, + 100, 141, 89, 3, 193, 204, 141, 89, 3, 242, 137, 198, 94, 207, 37, 141, + 89, 17, 192, 76, 141, 89, 17, 101, 141, 89, 17, 104, 141, 89, 17, 133, + 141, 89, 17, 134, 141, 89, 17, 151, 141, 89, 17, 170, 141, 89, 17, 179, + 141, 89, 17, 174, 141, 89, 17, 182, 141, 89, 31, 200, 25, 141, 89, 31, + 228, 160, 141, 89, 31, 200, 31, 199, 163, 141, 89, 31, 216, 123, 141, 89, + 31, 228, 163, 216, 123, 141, 89, 31, 200, 31, 248, 22, 141, 89, 31, 198, + 172, 141, 89, 3, 195, 233, 219, 31, 141, 89, 3, 193, 157, 141, 89, 3, + 229, 123, 141, 89, 3, 199, 190, 229, 123, 141, 89, 3, 191, 237, 199, 234, + 141, 89, 3, 229, 48, 141, 89, 3, 213, 89, 141, 89, 3, 193, 195, 141, 89, + 3, 213, 27, 141, 89, 3, 249, 247, 141, 89, 3, 197, 214, 246, 148, 141, + 89, 3, 217, 27, 198, 110, 141, 89, 3, 200, 100, 141, 89, 3, 219, 62, 141, + 89, 3, 215, 191, 141, 89, 3, 242, 137, 230, 84, 219, 8, 213, 33, 213, 32, + 141, 89, 3, 242, 137, 238, 161, 198, 101, 141, 89, 3, 242, 137, 197, 212, + 141, 89, 3, 242, 137, 197, 213, 242, 156, 141, 89, 3, 242, 137, 209, 45, + 237, 176, 141, 89, 3, 242, 137, 213, 82, 198, 236, 141, 89, 242, 108, 3, + 198, 105, 141, 89, 242, 108, 3, 193, 65, 141, 89, 242, 108, 3, 219, 154, + 141, 89, 242, 108, 3, 220, 58, 141, 89, 242, 108, 3, 193, 156, 141, 89, + 242, 108, 3, 221, 88, 141, 89, 242, 108, 3, 230, 8, 141, 89, 242, 108, 3, + 215, 233, 141, 89, 242, 108, 3, 199, 174, 141, 89, 242, 108, 3, 198, 115, + 141, 89, 242, 108, 3, 210, 91, 141, 89, 242, 108, 3, 221, 248, 141, 89, + 242, 108, 3, 230, 72, 141, 89, 242, 108, 3, 196, 151, 141, 89, 242, 108, + 3, 233, 74, 141, 89, 242, 108, 3, 193, 107, 141, 89, 242, 108, 3, 198, + 88, 141, 89, 242, 108, 3, 220, 229, 141, 89, 242, 108, 3, 194, 211, 217, + 36, 6, 1, 218, 236, 217, 36, 6, 1, 206, 158, 217, 36, 6, 1, 196, 236, + 217, 36, 6, 1, 194, 202, 217, 36, 6, 1, 250, 20, 217, 36, 6, 1, 192, 155, + 217, 36, 6, 1, 221, 70, 217, 36, 6, 1, 211, 93, 217, 36, 6, 1, 200, 228, + 217, 36, 6, 1, 232, 44, 217, 36, 6, 1, 233, 163, 217, 36, 6, 1, 70, 217, + 36, 6, 1, 222, 184, 217, 36, 6, 1, 64, 217, 36, 6, 1, 223, 65, 217, 36, + 6, 1, 71, 217, 36, 6, 1, 249, 226, 217, 36, 6, 1, 247, 52, 217, 36, 6, 1, + 68, 217, 36, 6, 1, 192, 214, 217, 36, 6, 1, 165, 217, 36, 6, 1, 208, 247, + 217, 36, 6, 1, 228, 190, 217, 36, 6, 1, 212, 203, 217, 36, 6, 1, 193, + 223, 217, 36, 6, 1, 238, 95, 217, 36, 6, 1, 212, 0, 217, 36, 6, 1, 215, + 151, 217, 36, 6, 1, 150, 217, 36, 6, 1, 74, 217, 36, 6, 1, 251, 63, 217, + 36, 6, 1, 193, 148, 217, 36, 2, 1, 218, 236, 217, 36, 2, 1, 206, 158, + 217, 36, 2, 1, 196, 236, 217, 36, 2, 1, 194, 202, 217, 36, 2, 1, 250, 20, + 217, 36, 2, 1, 192, 155, 217, 36, 2, 1, 221, 70, 217, 36, 2, 1, 211, 93, + 217, 36, 2, 1, 200, 228, 217, 36, 2, 1, 232, 44, 217, 36, 2, 1, 233, 163, + 217, 36, 2, 1, 70, 217, 36, 2, 1, 222, 184, 217, 36, 2, 1, 64, 217, 36, + 2, 1, 223, 65, 217, 36, 2, 1, 71, 217, 36, 2, 1, 249, 226, 217, 36, 2, 1, + 247, 52, 217, 36, 2, 1, 68, 217, 36, 2, 1, 192, 214, 217, 36, 2, 1, 165, + 217, 36, 2, 1, 208, 247, 217, 36, 2, 1, 228, 190, 217, 36, 2, 1, 212, + 203, 217, 36, 2, 1, 193, 223, 217, 36, 2, 1, 238, 95, 217, 36, 2, 1, 212, + 0, 217, 36, 2, 1, 215, 151, 217, 36, 2, 1, 150, 217, 36, 2, 1, 74, 217, + 36, 2, 1, 251, 63, 217, 36, 2, 1, 193, 148, 217, 36, 17, 192, 76, 217, + 36, 17, 101, 217, 36, 17, 104, 217, 36, 17, 133, 217, 36, 17, 134, 217, + 36, 17, 151, 217, 36, 17, 170, 217, 36, 17, 179, 217, 36, 17, 174, 217, + 36, 17, 182, 217, 36, 31, 200, 30, 217, 36, 31, 234, 111, 217, 36, 31, + 197, 244, 217, 36, 31, 199, 186, 217, 36, 31, 232, 113, 217, 36, 31, 233, + 7, 217, 36, 31, 203, 35, 217, 36, 31, 204, 143, 217, 36, 31, 234, 145, + 217, 36, 31, 214, 13, 217, 36, 17, 90, 250, 249, 20, 217, 36, 17, 103, + 250, 249, 20, 217, 36, 17, 112, 250, 249, 20, 217, 36, 242, 38, 217, 36, + 232, 71, 201, 238, 217, 36, 16, 251, 48, 217, 36, 233, 204, 211, 241, + 117, 1, 166, 117, 1, 249, 3, 117, 1, 11, 166, 117, 1, 209, 234, 117, 1, + 172, 117, 1, 216, 178, 117, 1, 250, 112, 172, 117, 1, 233, 97, 117, 1, + 196, 157, 117, 1, 196, 41, 117, 1, 189, 117, 1, 238, 0, 117, 1, 11, 198, + 83, 117, 1, 11, 189, 117, 1, 198, 83, 117, 1, 237, 161, 117, 1, 181, 117, + 1, 214, 65, 117, 1, 11, 213, 178, 117, 1, 250, 112, 181, 117, 1, 213, + 178, 117, 1, 213, 164, 117, 1, 177, 117, 1, 218, 250, 117, 1, 219, 222, + 117, 1, 219, 211, 117, 1, 199, 50, 117, 1, 236, 155, 117, 1, 199, 42, + 117, 1, 236, 154, 117, 1, 160, 117, 1, 231, 233, 117, 1, 11, 160, 117, 1, + 208, 239, 117, 1, 208, 216, 117, 1, 214, 165, 117, 1, 214, 114, 117, 1, + 250, 112, 214, 165, 117, 1, 144, 117, 1, 193, 209, 117, 1, 231, 84, 117, + 1, 231, 59, 117, 1, 198, 93, 117, 1, 235, 0, 117, 1, 212, 201, 117, 1, + 212, 183, 117, 1, 198, 108, 117, 1, 235, 11, 117, 1, 11, 198, 108, 117, + 1, 11, 235, 11, 117, 1, 207, 232, 198, 108, 117, 1, 204, 64, 117, 1, 202, + 92, 117, 1, 192, 71, 117, 1, 191, 254, 117, 1, 198, 118, 117, 1, 235, 17, + 117, 1, 11, 198, 118, 117, 1, 188, 117, 1, 192, 112, 117, 1, 191, 255, + 117, 1, 191, 225, 117, 1, 191, 205, 117, 1, 250, 112, 191, 225, 117, 1, + 191, 197, 117, 1, 191, 204, 117, 1, 194, 169, 117, 1, 251, 72, 117, 1, + 229, 187, 117, 1, 247, 146, 117, 1, 201, 54, 117, 1, 235, 1, 117, 1, 200, + 79, 117, 1, 198, 112, 117, 1, 206, 221, 117, 3, 116, 73, 161, 117, 1, + 215, 47, 117, 3, 250, 43, 117, 3, 207, 232, 195, 246, 117, 3, 207, 232, + 250, 43, 117, 18, 3, 64, 117, 18, 3, 252, 33, 117, 18, 3, 251, 68, 117, + 18, 3, 250, 224, 117, 18, 3, 250, 214, 117, 18, 3, 74, 117, 18, 3, 211, + 194, 117, 18, 3, 194, 36, 117, 18, 3, 194, 202, 117, 18, 3, 71, 117, 18, + 3, 234, 88, 117, 18, 3, 234, 73, 117, 18, 3, 211, 252, 117, 18, 3, 70, + 117, 18, 3, 228, 58, 117, 18, 3, 228, 57, 117, 18, 3, 228, 56, 117, 18, + 3, 223, 116, 117, 18, 3, 223, 251, 117, 18, 3, 223, 224, 117, 18, 3, 223, + 78, 117, 18, 3, 223, 164, 117, 18, 3, 68, 117, 18, 3, 197, 119, 117, 18, + 3, 197, 118, 117, 18, 3, 197, 117, 117, 18, 3, 196, 251, 117, 18, 3, 197, + 101, 117, 18, 3, 197, 61, 117, 18, 3, 193, 148, 117, 18, 3, 193, 22, 117, + 18, 3, 251, 108, 117, 18, 3, 251, 104, 117, 18, 3, 234, 13, 117, 18, 3, + 207, 7, 234, 13, 117, 18, 3, 234, 21, 117, 18, 3, 207, 7, 234, 21, 117, + 18, 3, 251, 63, 117, 18, 3, 234, 150, 117, 18, 3, 250, 8, 117, 18, 3, + 211, 130, 117, 18, 3, 215, 151, 117, 18, 3, 214, 167, 117, 18, 3, 197, + 45, 117, 18, 3, 192, 194, 117, 18, 3, 211, 246, 117, 18, 3, 211, 253, + 117, 18, 3, 194, 213, 117, 18, 3, 223, 229, 117, 18, 3, 234, 199, 117, + 18, 3, 223, 114, 117, 18, 3, 197, 95, 117, 158, 207, 101, 117, 158, 198, + 249, 207, 101, 117, 158, 58, 117, 158, 63, 117, 1, 199, 16, 117, 1, 199, + 15, 117, 1, 199, 14, 117, 1, 199, 13, 117, 1, 199, 12, 117, 1, 199, 11, + 117, 1, 199, 10, 117, 1, 207, 232, 199, 17, 117, 1, 207, 232, 199, 16, + 117, 1, 207, 232, 199, 14, 117, 1, 207, 232, 199, 13, 117, 1, 207, 232, + 199, 12, 117, 1, 207, 232, 199, 10, 19, 223, 80, 77, 45, 223, 80, 77, 40, + 242, 200, 229, 15, 77, 40, 242, 200, 223, 80, 77, 37, 2, 27, 232, 247, + 196, 27, 250, 249, 208, 1, 122, 247, 19, 196, 27, 250, 249, 208, 1, 122, + 214, 64, 19, 242, 27, 19, 242, 26, 19, 242, 25, 19, 242, 24, 19, 242, 23, + 19, 242, 22, 19, 242, 21, 19, 242, 20, 19, 242, 19, 19, 242, 18, 19, 242, + 17, 19, 242, 16, 19, 242, 15, 19, 242, 14, 19, 242, 13, 19, 242, 12, 19, + 242, 11, 19, 242, 10, 19, 242, 9, 19, 242, 8, 19, 242, 7, 19, 242, 6, 19, + 242, 5, 19, 242, 4, 19, 242, 3, 19, 242, 2, 19, 242, 1, 19, 242, 0, 19, + 241, 255, 19, 241, 254, 19, 241, 253, 19, 241, 252, 19, 241, 251, 19, + 241, 250, 19, 241, 249, 19, 241, 248, 19, 241, 247, 19, 241, 246, 19, + 241, 245, 19, 241, 244, 19, 241, 243, 19, 241, 242, 19, 241, 241, 19, + 241, 240, 19, 241, 239, 19, 241, 238, 19, 241, 237, 19, 241, 236, 19, + 241, 235, 19, 241, 234, 19, 241, 233, 19, 241, 232, 19, 241, 231, 19, + 241, 230, 19, 241, 229, 19, 241, 228, 19, 241, 227, 19, 241, 226, 19, + 241, 225, 19, 241, 224, 19, 241, 223, 19, 241, 222, 19, 241, 221, 19, + 241, 220, 19, 241, 219, 19, 241, 218, 19, 241, 217, 19, 241, 216, 19, + 241, 215, 19, 241, 214, 19, 241, 213, 19, 241, 212, 19, 241, 211, 19, + 241, 210, 19, 241, 209, 19, 241, 208, 19, 241, 207, 19, 241, 206, 19, + 241, 205, 19, 241, 204, 19, 241, 203, 19, 241, 202, 19, 241, 201, 19, + 241, 200, 19, 241, 199, 19, 241, 198, 19, 241, 197, 19, 241, 196, 19, + 241, 195, 19, 241, 194, 19, 241, 193, 19, 241, 192, 19, 241, 191, 19, + 241, 190, 19, 241, 189, 19, 241, 188, 19, 241, 187, 19, 241, 186, 19, + 241, 185, 19, 241, 184, 19, 241, 183, 19, 241, 182, 19, 241, 181, 19, + 241, 180, 19, 241, 179, 19, 241, 178, 19, 241, 177, 19, 241, 176, 19, + 241, 175, 19, 241, 174, 19, 241, 173, 19, 241, 172, 19, 241, 171, 19, + 241, 170, 19, 241, 169, 19, 241, 168, 19, 241, 167, 19, 241, 166, 19, + 241, 165, 19, 241, 164, 19, 241, 163, 19, 241, 162, 19, 241, 161, 19, + 241, 160, 19, 241, 159, 19, 241, 158, 19, 241, 157, 19, 241, 156, 19, + 241, 155, 19, 241, 154, 19, 241, 153, 19, 241, 152, 19, 241, 151, 19, + 241, 150, 19, 241, 149, 19, 241, 148, 19, 241, 147, 19, 241, 146, 19, + 241, 145, 19, 241, 144, 19, 241, 143, 19, 241, 142, 19, 241, 141, 19, + 241, 140, 19, 241, 139, 19, 241, 138, 19, 241, 137, 19, 241, 136, 19, + 241, 135, 19, 241, 134, 19, 241, 133, 19, 241, 132, 19, 241, 131, 19, + 241, 130, 19, 241, 129, 19, 241, 128, 19, 241, 127, 19, 241, 126, 19, + 241, 125, 19, 241, 124, 19, 241, 123, 19, 241, 122, 19, 241, 121, 19, + 241, 120, 19, 241, 119, 19, 241, 118, 19, 241, 117, 19, 241, 116, 19, + 241, 115, 19, 241, 114, 19, 241, 113, 19, 241, 112, 19, 241, 111, 19, + 241, 110, 19, 241, 109, 19, 241, 108, 19, 241, 107, 19, 241, 106, 19, + 241, 105, 19, 241, 104, 19, 241, 103, 19, 241, 102, 19, 241, 101, 19, + 241, 100, 19, 241, 99, 19, 241, 98, 19, 241, 97, 19, 241, 96, 19, 241, + 95, 19, 241, 94, 19, 241, 93, 19, 241, 92, 19, 241, 91, 19, 241, 90, 19, + 241, 89, 19, 241, 88, 19, 241, 87, 19, 241, 86, 19, 241, 85, 19, 241, 84, + 19, 241, 83, 19, 241, 82, 19, 241, 81, 19, 241, 80, 19, 241, 79, 19, 241, + 78, 19, 241, 77, 19, 241, 76, 19, 241, 75, 19, 241, 74, 19, 241, 73, 19, + 241, 72, 19, 241, 71, 19, 241, 70, 19, 241, 69, 19, 241, 68, 19, 241, 67, + 19, 241, 66, 19, 241, 65, 19, 241, 64, 19, 241, 63, 19, 241, 62, 19, 241, + 61, 19, 241, 60, 19, 241, 59, 19, 241, 58, 19, 241, 57, 19, 241, 56, 19, + 241, 55, 19, 241, 54, 19, 241, 53, 19, 241, 52, 19, 241, 51, 19, 241, 50, + 19, 241, 49, 19, 241, 48, 19, 241, 47, 19, 241, 46, 19, 241, 45, 19, 241, + 44, 19, 241, 43, 19, 241, 42, 19, 241, 41, 19, 241, 40, 19, 241, 39, 19, + 241, 38, 19, 241, 37, 19, 241, 36, 19, 241, 35, 19, 241, 34, 19, 241, 33, + 19, 241, 32, 19, 241, 31, 19, 241, 30, 19, 241, 29, 19, 241, 28, 19, 241, + 27, 19, 241, 26, 19, 241, 25, 19, 241, 24, 19, 241, 23, 19, 241, 22, 19, + 241, 21, 19, 241, 20, 19, 241, 19, 19, 241, 18, 19, 241, 17, 19, 241, 16, + 19, 241, 15, 19, 241, 14, 19, 241, 13, 19, 241, 12, 19, 241, 11, 19, 241, + 10, 19, 241, 9, 19, 241, 8, 19, 241, 7, 19, 241, 6, 19, 241, 5, 19, 241, + 4, 19, 241, 3, 19, 241, 2, 19, 241, 1, 19, 241, 0, 19, 240, 255, 19, 240, + 254, 19, 240, 253, 19, 240, 252, 19, 240, 251, 19, 240, 250, 19, 240, + 249, 19, 240, 248, 19, 240, 247, 19, 240, 246, 19, 240, 245, 19, 240, + 244, 19, 240, 243, 19, 240, 242, 19, 240, 241, 19, 240, 240, 19, 240, + 239, 19, 240, 238, 19, 240, 237, 19, 240, 236, 19, 240, 235, 19, 240, + 234, 19, 240, 233, 19, 240, 232, 19, 240, 231, 19, 240, 230, 19, 240, + 229, 19, 240, 228, 19, 240, 227, 19, 240, 226, 19, 240, 225, 19, 240, + 224, 19, 240, 223, 19, 240, 222, 19, 240, 221, 19, 240, 220, 19, 240, + 219, 19, 240, 218, 19, 240, 217, 19, 240, 216, 19, 240, 215, 19, 240, + 214, 19, 240, 213, 19, 240, 212, 19, 240, 211, 19, 240, 210, 19, 240, + 209, 19, 240, 208, 19, 240, 207, 19, 240, 206, 19, 240, 205, 19, 240, + 204, 19, 240, 203, 19, 240, 202, 19, 240, 201, 19, 240, 200, 19, 240, + 199, 19, 240, 198, 19, 240, 197, 19, 240, 196, 19, 240, 195, 19, 240, + 194, 19, 240, 193, 19, 240, 192, 19, 240, 191, 19, 240, 190, 19, 240, + 189, 19, 240, 188, 19, 240, 187, 19, 240, 186, 19, 240, 185, 19, 240, + 184, 19, 240, 183, 19, 240, 182, 19, 240, 181, 19, 240, 180, 19, 240, + 179, 19, 240, 178, 19, 240, 177, 19, 240, 176, 19, 240, 175, 19, 240, + 174, 19, 240, 173, 19, 240, 172, 19, 240, 171, 19, 240, 170, 19, 240, + 169, 19, 240, 168, 19, 240, 167, 19, 240, 166, 19, 240, 165, 19, 240, + 164, 19, 240, 163, 19, 240, 162, 19, 240, 161, 19, 240, 160, 19, 240, + 159, 19, 240, 158, 19, 240, 157, 19, 240, 156, 19, 240, 155, 19, 240, + 154, 19, 240, 153, 19, 240, 152, 19, 240, 151, 19, 240, 150, 19, 240, + 149, 19, 240, 148, 19, 240, 147, 19, 240, 146, 19, 240, 145, 19, 240, + 144, 19, 240, 143, 19, 240, 142, 19, 240, 141, 19, 240, 140, 19, 240, + 139, 19, 240, 138, 19, 240, 137, 19, 240, 136, 19, 240, 135, 19, 240, + 134, 19, 240, 133, 19, 240, 132, 19, 240, 131, 19, 240, 130, 19, 240, + 129, 19, 240, 128, 19, 240, 127, 19, 240, 126, 19, 240, 125, 19, 240, + 124, 19, 240, 123, 19, 240, 122, 19, 240, 121, 19, 240, 120, 19, 240, + 119, 19, 240, 118, 19, 240, 117, 19, 240, 116, 19, 240, 115, 19, 240, + 114, 19, 240, 113, 19, 240, 112, 19, 240, 111, 19, 240, 110, 19, 240, + 109, 19, 240, 108, 19, 240, 107, 19, 240, 106, 19, 240, 105, 19, 240, + 104, 19, 240, 103, 19, 240, 102, 19, 240, 101, 19, 240, 100, 19, 240, 99, + 19, 240, 98, 19, 240, 97, 19, 240, 96, 19, 240, 95, 19, 240, 94, 19, 240, + 93, 19, 240, 92, 19, 240, 91, 19, 240, 90, 19, 240, 89, 19, 240, 88, 19, + 240, 87, 19, 240, 86, 19, 240, 85, 19, 240, 84, 19, 240, 83, 19, 240, 82, + 19, 240, 81, 19, 240, 80, 19, 240, 79, 19, 240, 78, 19, 240, 77, 19, 240, + 76, 19, 240, 75, 19, 240, 74, 19, 240, 73, 19, 240, 72, 19, 240, 71, 19, + 240, 70, 19, 240, 69, 19, 240, 68, 19, 240, 67, 19, 240, 66, 19, 240, 65, + 19, 240, 64, 19, 240, 63, 19, 240, 62, 19, 240, 61, 19, 240, 60, 19, 240, + 59, 19, 240, 58, 19, 240, 57, 19, 240, 56, 19, 240, 55, 19, 240, 54, 19, + 240, 53, 19, 240, 52, 19, 240, 51, 19, 240, 50, 19, 240, 49, 19, 240, 48, + 19, 240, 47, 19, 240, 46, 19, 240, 45, 19, 240, 44, 19, 240, 43, 19, 240, + 42, 19, 240, 41, 19, 240, 40, 19, 240, 39, 19, 240, 38, 19, 240, 37, 19, + 240, 36, 19, 240, 35, 19, 240, 34, 19, 240, 33, 19, 240, 32, 19, 240, 31, + 19, 240, 30, 19, 240, 29, 19, 240, 28, 19, 240, 27, 19, 240, 26, 19, 240, + 25, 19, 240, 24, 19, 240, 23, 19, 240, 22, 19, 240, 21, 19, 240, 20, 19, + 240, 19, 19, 240, 18, 19, 240, 17, 19, 240, 16, 19, 240, 15, 19, 240, 14, + 19, 240, 13, 19, 240, 12, 19, 240, 11, 19, 240, 10, 19, 240, 9, 19, 240, + 8, 19, 240, 7, 19, 240, 6, 19, 240, 5, 19, 240, 4, 19, 240, 3, 19, 240, + 2, 19, 240, 1, 19, 240, 0, 19, 239, 255, 19, 239, 254, 19, 239, 253, 19, + 239, 252, 19, 239, 251, 19, 239, 250, 19, 239, 249, 19, 239, 248, 19, + 239, 247, 19, 239, 246, 19, 239, 245, 19, 239, 244, 19, 239, 243, 19, + 239, 242, 19, 239, 241, 19, 239, 240, 19, 239, 239, 19, 239, 238, 19, + 239, 237, 19, 239, 236, 19, 239, 235, 19, 239, 234, 19, 239, 233, 19, + 239, 232, 19, 239, 231, 19, 239, 230, 19, 239, 229, 19, 239, 228, 19, + 239, 227, 19, 239, 226, 19, 239, 225, 19, 239, 224, 19, 239, 223, 19, + 239, 222, 19, 239, 221, 19, 239, 220, 19, 239, 219, 19, 239, 218, 19, + 239, 217, 19, 239, 216, 19, 239, 215, 19, 239, 214, 19, 239, 213, 19, + 239, 212, 19, 239, 211, 19, 239, 210, 19, 239, 209, 19, 239, 208, 19, + 239, 207, 19, 239, 206, 19, 239, 205, 19, 239, 204, 19, 239, 203, 19, + 239, 202, 19, 239, 201, 19, 239, 200, 19, 239, 199, 19, 239, 198, 19, + 239, 197, 19, 239, 196, 19, 239, 195, 19, 239, 194, 19, 239, 193, 19, + 239, 192, 19, 239, 191, 19, 239, 190, 19, 239, 189, 19, 239, 188, 19, + 239, 187, 19, 239, 186, 19, 239, 185, 19, 239, 184, 19, 239, 183, 19, + 239, 182, 19, 239, 181, 19, 239, 180, 19, 239, 179, 19, 239, 178, 19, + 239, 177, 19, 239, 176, 19, 239, 175, 19, 239, 174, 19, 239, 173, 19, + 239, 172, 19, 239, 171, 19, 239, 170, 19, 239, 169, 19, 239, 168, 19, + 239, 167, 19, 239, 166, 19, 239, 165, 19, 239, 164, 19, 239, 163, 19, + 239, 162, 19, 239, 161, 19, 239, 160, 19, 239, 159, 19, 239, 158, 19, + 239, 157, 19, 239, 156, 19, 239, 155, 19, 239, 154, 19, 239, 153, 19, + 239, 152, 19, 239, 151, 19, 239, 150, 19, 239, 149, 19, 239, 148, 19, + 239, 147, 19, 239, 146, 19, 239, 145, 19, 239, 144, 19, 239, 143, 19, + 239, 142, 19, 239, 141, 19, 239, 140, 19, 239, 139, 19, 239, 138, 19, + 239, 137, 19, 239, 136, 19, 239, 135, 19, 239, 134, 19, 239, 133, 19, + 239, 132, 19, 239, 131, 19, 239, 130, 19, 239, 129, 19, 239, 128, 19, + 239, 127, 19, 239, 126, 19, 239, 125, 19, 239, 124, 19, 239, 123, 19, + 239, 122, 19, 239, 121, 19, 239, 120, 19, 239, 119, 19, 239, 118, 19, + 239, 117, 19, 239, 116, 19, 239, 115, 19, 239, 114, 19, 239, 113, 19, + 239, 112, 19, 239, 111, 19, 239, 110, 19, 239, 109, 19, 239, 108, 19, + 239, 107, 19, 239, 106, 19, 239, 105, 19, 239, 104, 19, 239, 103, 19, + 239, 102, 19, 239, 101, 19, 239, 100, 19, 239, 99, 19, 239, 98, 19, 239, + 97, 19, 239, 96, 19, 239, 95, 19, 239, 94, 19, 239, 93, 19, 239, 92, 19, + 239, 91, 19, 239, 90, 19, 239, 89, 19, 239, 88, 19, 239, 87, 19, 239, 86, + 19, 239, 85, 19, 239, 84, 19, 239, 83, 19, 239, 82, 19, 239, 81, 19, 239, + 80, 19, 239, 79, 19, 239, 78, 19, 239, 77, 19, 239, 76, 19, 239, 75, 19, + 239, 74, 19, 239, 73, 19, 239, 72, 19, 239, 71, 19, 239, 70, 19, 239, 69, + 19, 239, 68, 19, 239, 67, 19, 239, 66, 19, 239, 65, 19, 239, 64, 19, 239, + 63, 19, 239, 62, 19, 239, 61, 19, 239, 60, 19, 239, 59, 19, 239, 58, 19, + 239, 57, 19, 239, 56, 19, 239, 55, 19, 239, 54, 19, 239, 53, 19, 239, 52, + 19, 239, 51, 19, 239, 50, 19, 239, 49, 19, 239, 48, 19, 239, 47, 19, 239, + 46, 19, 239, 45, 19, 239, 44, 19, 239, 43, 19, 239, 42, 19, 239, 41, 19, + 239, 40, 19, 239, 39, 19, 239, 38, 19, 239, 37, 19, 239, 36, 19, 239, 35, + 19, 239, 34, 19, 239, 33, 19, 239, 32, 19, 239, 31, 19, 239, 30, 19, 239, + 29, 19, 239, 28, 37, 2, 27, 246, 98, 37, 2, 27, 246, 97, 37, 2, 27, 246, + 96, 37, 2, 27, 246, 95, 37, 2, 27, 246, 94, 37, 2, 27, 246, 93, 37, 2, + 27, 246, 92, 37, 2, 27, 246, 91, 37, 2, 27, 246, 90, 37, 2, 27, 246, 89, + 37, 2, 27, 246, 88, 37, 2, 27, 246, 87, 37, 2, 27, 246, 86, 37, 2, 27, + 246, 85, 37, 2, 27, 246, 84, 37, 2, 27, 246, 83, 37, 2, 27, 246, 82, 37, + 2, 27, 246, 81, 37, 2, 27, 246, 80, 37, 2, 27, 246, 79, 37, 2, 27, 246, + 78, 37, 2, 27, 246, 77, 37, 2, 27, 246, 76, 37, 2, 27, 246, 75, 37, 2, + 27, 246, 74, 37, 2, 27, 246, 73, 37, 2, 27, 246, 72, 37, 2, 27, 246, 71, + 37, 2, 27, 246, 70, 37, 2, 27, 246, 69, 37, 2, 27, 246, 68, 37, 2, 27, + 246, 67, 37, 2, 27, 246, 66, 37, 2, 27, 246, 65, 37, 2, 27, 246, 64, 37, + 2, 27, 246, 63, 37, 2, 27, 246, 62, 37, 2, 27, 246, 61, 37, 2, 27, 246, + 60, 37, 2, 27, 246, 59, 37, 2, 27, 246, 58, 37, 2, 27, 246, 57, 37, 2, + 27, 246, 56, 37, 2, 27, 246, 55, 37, 2, 27, 246, 54, 37, 2, 27, 246, 53, + 37, 2, 27, 246, 52, 37, 2, 27, 246, 51, 37, 2, 27, 246, 50, 37, 2, 27, + 246, 49, 37, 2, 27, 246, 48, 37, 2, 27, 246, 47, 37, 2, 27, 246, 46, 37, + 2, 27, 246, 45, 37, 2, 27, 246, 44, 37, 2, 27, 246, 43, 37, 2, 27, 246, + 42, 37, 2, 27, 246, 41, 37, 2, 27, 246, 40, 37, 2, 27, 246, 39, 37, 2, + 27, 246, 38, 37, 2, 27, 246, 37, 37, 2, 27, 246, 36, 37, 2, 27, 246, 35, + 37, 2, 27, 246, 34, 37, 2, 27, 246, 33, 37, 2, 27, 246, 32, 37, 2, 27, + 246, 31, 37, 2, 27, 246, 30, 37, 2, 27, 246, 29, 37, 2, 27, 246, 28, 37, + 2, 27, 246, 27, 37, 2, 27, 246, 26, 37, 2, 27, 246, 25, 37, 2, 27, 246, + 24, 37, 2, 27, 246, 23, 37, 2, 27, 246, 22, 37, 2, 27, 246, 21, 37, 2, + 27, 246, 20, 37, 2, 27, 246, 19, 37, 2, 27, 246, 18, 37, 2, 27, 246, 17, + 37, 2, 27, 246, 16, 37, 2, 27, 246, 15, 37, 2, 27, 246, 14, 37, 2, 27, + 246, 13, 37, 2, 27, 246, 12, 37, 2, 27, 246, 11, 37, 2, 27, 246, 10, 37, + 2, 27, 246, 9, 37, 2, 27, 246, 8, 37, 2, 27, 246, 7, 37, 2, 27, 246, 6, + 37, 2, 27, 246, 5, 37, 2, 27, 246, 4, 37, 2, 27, 246, 3, 37, 2, 27, 246, + 2, 37, 2, 27, 246, 1, 37, 2, 27, 246, 0, 37, 2, 27, 245, 255, 37, 2, 27, + 245, 254, 37, 2, 27, 245, 253, 37, 2, 27, 245, 252, 37, 2, 27, 245, 251, + 37, 2, 27, 245, 250, 37, 2, 27, 245, 249, 37, 2, 27, 245, 248, 37, 2, 27, + 245, 247, 37, 2, 27, 245, 246, 37, 2, 27, 245, 245, 37, 2, 27, 245, 244, + 37, 2, 27, 245, 243, 37, 2, 27, 245, 242, 37, 2, 27, 245, 241, 37, 2, 27, + 245, 240, 37, 2, 27, 245, 239, 37, 2, 27, 245, 238, 37, 2, 27, 245, 237, + 37, 2, 27, 245, 236, 37, 2, 27, 245, 235, 37, 2, 27, 245, 234, 37, 2, 27, + 245, 233, 37, 2, 27, 245, 232, 37, 2, 27, 245, 231, 37, 2, 27, 245, 230, + 37, 2, 27, 245, 229, 37, 2, 27, 245, 228, 37, 2, 27, 245, 227, 37, 2, 27, + 245, 226, 37, 2, 27, 245, 225, 37, 2, 27, 245, 224, 37, 2, 27, 245, 223, + 37, 2, 27, 245, 222, 37, 2, 27, 245, 221, 37, 2, 27, 245, 220, 37, 2, 27, + 245, 219, 37, 2, 27, 245, 218, 37, 2, 27, 245, 217, 37, 2, 27, 245, 216, + 37, 2, 27, 245, 215, 37, 2, 27, 245, 214, 37, 2, 27, 245, 213, 37, 2, 27, + 245, 212, 37, 2, 27, 245, 211, 37, 2, 27, 245, 210, 37, 2, 27, 245, 209, + 37, 2, 27, 245, 208, 37, 2, 27, 245, 207, 37, 2, 27, 245, 206, 37, 2, 27, + 245, 205, 37, 2, 27, 245, 204, 37, 2, 27, 245, 203, 37, 2, 27, 245, 202, + 37, 2, 27, 245, 201, 37, 2, 27, 245, 200, 37, 2, 27, 245, 199, 37, 2, 27, + 245, 198, 37, 2, 27, 245, 197, 37, 2, 27, 245, 196, 37, 2, 27, 245, 195, + 37, 2, 27, 245, 194, 37, 2, 27, 245, 193, 37, 2, 27, 245, 192, 37, 2, 27, + 245, 191, 37, 2, 27, 245, 190, 37, 2, 27, 245, 189, 37, 2, 27, 245, 188, + 37, 2, 27, 245, 187, 37, 2, 27, 245, 186, 37, 2, 27, 245, 185, 37, 2, 27, + 245, 184, 37, 2, 27, 245, 183, 37, 2, 27, 245, 182, 37, 2, 27, 245, 181, + 37, 2, 27, 245, 180, 37, 2, 27, 245, 179, 37, 2, 27, 245, 178, 37, 2, 27, + 245, 177, 37, 2, 27, 245, 176, 37, 2, 27, 245, 175, 37, 2, 27, 245, 174, + 37, 2, 27, 245, 173, 37, 2, 27, 245, 172, 37, 2, 27, 245, 171, 37, 2, 27, + 245, 170, 37, 2, 27, 245, 169, 37, 2, 27, 245, 168, 37, 2, 27, 245, 167, + 37, 2, 27, 245, 166, 37, 2, 27, 245, 165, 37, 2, 27, 245, 164, 37, 2, 27, + 245, 163, 37, 2, 27, 245, 162, 37, 2, 27, 245, 161, 37, 2, 27, 245, 160, + 37, 2, 27, 245, 159, 37, 2, 27, 245, 158, 37, 2, 27, 245, 157, 37, 2, 27, + 245, 156, 37, 2, 27, 245, 155, 37, 2, 27, 245, 154, 37, 2, 27, 245, 153, + 37, 2, 27, 245, 152, 37, 2, 27, 245, 151, 37, 2, 27, 245, 150, 37, 2, 27, + 245, 149, 37, 2, 27, 245, 148, 37, 2, 27, 245, 147, 37, 2, 27, 245, 146, + 37, 2, 27, 245, 145, 37, 2, 27, 245, 144, 37, 2, 27, 245, 143, 37, 2, 27, + 245, 142, 37, 2, 27, 245, 141, 37, 2, 27, 245, 140, 37, 2, 27, 245, 139, + 37, 2, 27, 245, 138, 37, 2, 27, 245, 137, 37, 2, 27, 245, 136, 37, 2, 27, + 245, 135, 37, 2, 27, 245, 134, 37, 2, 27, 245, 133, 37, 2, 27, 245, 132, + 37, 2, 27, 245, 131, 37, 2, 27, 245, 130, 37, 2, 27, 245, 129, 37, 2, 27, + 245, 128, 37, 2, 27, 245, 127, 37, 2, 27, 245, 126, 37, 2, 27, 245, 125, + 37, 2, 27, 245, 124, 37, 2, 27, 245, 123, 37, 2, 27, 245, 122, 37, 2, 27, + 245, 121, 37, 2, 27, 245, 120, 37, 2, 27, 245, 119, 37, 2, 27, 245, 118, + 37, 2, 27, 245, 117, 37, 2, 27, 245, 116, 37, 2, 27, 245, 115, 37, 2, 27, + 245, 114, 37, 2, 27, 245, 113, 37, 2, 27, 245, 112, 37, 2, 27, 245, 111, + 37, 2, 27, 245, 110, 37, 2, 27, 245, 109, 37, 2, 27, 245, 108, 37, 2, 27, + 245, 107, 37, 2, 27, 245, 106, 37, 2, 27, 245, 105, 37, 2, 27, 245, 104, + 37, 2, 27, 245, 103, 37, 2, 27, 245, 102, 37, 2, 27, 245, 101, 37, 2, 27, + 245, 100, 37, 2, 27, 245, 99, 37, 2, 27, 245, 98, 37, 2, 27, 245, 97, 37, + 2, 27, 245, 96, 37, 2, 27, 245, 95, 37, 2, 27, 245, 94, 37, 2, 27, 245, + 93, 37, 2, 27, 245, 92, 37, 2, 27, 245, 91, 37, 2, 27, 245, 90, 37, 2, + 27, 245, 89, 37, 2, 27, 245, 88, 37, 2, 27, 245, 87, 37, 2, 27, 245, 86, + 37, 2, 27, 245, 85, 37, 2, 27, 245, 84, 37, 2, 27, 245, 83, 37, 2, 27, + 245, 82, 37, 2, 27, 245, 81, 37, 2, 27, 245, 80, 37, 2, 27, 245, 79, 37, + 2, 27, 245, 78, 37, 2, 27, 245, 77, 37, 2, 27, 245, 76, 37, 2, 27, 245, + 75, 37, 2, 27, 245, 74, 37, 2, 27, 245, 73, 37, 2, 27, 245, 72, 37, 2, + 27, 245, 71, 37, 2, 27, 245, 70, 37, 2, 27, 245, 69, 37, 2, 27, 245, 68, + 37, 2, 27, 245, 67, 37, 2, 27, 245, 66, 37, 2, 27, 245, 65, 37, 2, 27, + 245, 64, 37, 2, 27, 245, 63, 37, 2, 27, 245, 62, 37, 2, 27, 245, 61, 37, + 2, 27, 245, 60, 37, 2, 27, 245, 59, 37, 2, 27, 245, 58, 37, 2, 27, 245, + 57, 37, 2, 27, 245, 56, 37, 2, 27, 245, 55, 37, 2, 27, 245, 54, 37, 2, + 27, 245, 53, 37, 2, 27, 245, 52, 37, 2, 27, 245, 51, 37, 2, 27, 245, 50, + 37, 2, 27, 245, 49, 37, 2, 27, 245, 48, 37, 2, 27, 245, 47, 37, 2, 27, + 245, 46, 37, 2, 27, 245, 45, 37, 2, 27, 245, 44, 37, 2, 27, 245, 43, 37, + 2, 27, 245, 42, 37, 2, 27, 245, 41, 37, 2, 27, 245, 40, 37, 2, 27, 245, + 39, 37, 2, 27, 245, 38, 37, 2, 27, 245, 37, 37, 2, 27, 245, 36, 37, 2, + 27, 245, 35, 37, 2, 27, 245, 34, 37, 2, 27, 245, 33, 37, 2, 27, 245, 32, + 37, 2, 27, 245, 31, 37, 2, 27, 245, 30, 37, 2, 27, 245, 29, 37, 2, 27, + 245, 28, 37, 2, 27, 245, 27, 37, 2, 27, 245, 26, 37, 2, 27, 245, 25, 37, + 2, 27, 245, 24, 37, 2, 27, 245, 23, 37, 2, 27, 245, 22, 37, 2, 27, 245, + 21, 37, 2, 27, 245, 20, 37, 2, 27, 245, 19, 37, 2, 27, 245, 18, 37, 2, + 27, 245, 17, 37, 2, 27, 245, 16, 37, 2, 27, 245, 15, 37, 2, 27, 245, 14, + 37, 2, 27, 245, 13, 37, 2, 27, 245, 12, 37, 2, 27, 245, 11, 37, 2, 27, + 245, 10, 37, 2, 27, 245, 9, 37, 2, 27, 245, 8, 37, 2, 27, 245, 7, 37, 2, + 27, 245, 6, 37, 2, 27, 245, 5, 37, 2, 27, 245, 4, 37, 2, 27, 245, 3, 37, + 2, 27, 245, 2, 37, 2, 27, 245, 1, 37, 2, 27, 245, 0, 37, 2, 27, 244, 255, + 37, 2, 27, 244, 254, 37, 2, 27, 244, 253, 37, 2, 27, 244, 252, 37, 2, 27, + 244, 251, 37, 2, 27, 244, 250, 37, 2, 27, 244, 249, 37, 2, 27, 244, 248, + 37, 2, 27, 244, 247, 37, 2, 27, 244, 246, 37, 2, 27, 244, 245, 37, 2, 27, + 244, 244, 37, 2, 27, 244, 243, 37, 2, 27, 244, 242, 37, 2, 27, 244, 241, + 37, 2, 27, 244, 240, 37, 2, 27, 244, 239, 37, 2, 27, 244, 238, 37, 2, 27, + 244, 237, 37, 2, 27, 244, 236, 37, 2, 27, 244, 235, 37, 2, 27, 244, 234, + 37, 2, 27, 244, 233, 37, 2, 27, 244, 232, 37, 2, 27, 244, 231, 37, 2, 27, + 244, 230, 37, 2, 27, 244, 229, 37, 2, 27, 244, 228, 37, 2, 27, 244, 227, + 37, 2, 27, 244, 226, 37, 2, 27, 244, 225, 37, 2, 27, 244, 224, 37, 2, 27, + 244, 223, 37, 2, 27, 244, 222, 37, 2, 27, 244, 221, 37, 2, 27, 244, 220, + 37, 2, 27, 244, 219, 37, 2, 27, 244, 218, 37, 2, 27, 244, 217, 37, 2, 27, + 244, 216, 37, 2, 27, 244, 215, 37, 2, 27, 244, 214, 37, 2, 27, 244, 213, + 37, 2, 27, 244, 212, 37, 2, 27, 244, 211, 37, 2, 27, 244, 210, 37, 2, 27, + 244, 209, 37, 2, 27, 244, 208, 37, 2, 27, 244, 207, 37, 2, 27, 244, 206, + 37, 2, 27, 244, 205, 37, 2, 27, 244, 204, 37, 2, 27, 244, 203, 37, 2, 27, + 244, 202, 37, 2, 27, 244, 201, 37, 2, 27, 244, 200, 37, 2, 27, 244, 199, + 37, 2, 27, 244, 198, 37, 2, 27, 244, 197, 37, 2, 27, 244, 196, 37, 2, 27, + 244, 195, 37, 2, 27, 244, 194, 37, 2, 27, 244, 193, 37, 2, 27, 244, 192, + 37, 2, 27, 244, 191, 37, 2, 27, 244, 190, 37, 2, 27, 244, 189, 37, 2, 27, + 244, 188, 37, 2, 27, 244, 187, 37, 2, 27, 244, 186, 37, 2, 27, 244, 185, + 37, 2, 27, 244, 184, 37, 2, 27, 244, 183, 37, 2, 27, 244, 182, 37, 2, 27, + 244, 181, 37, 2, 27, 244, 180, 37, 2, 27, 244, 179, 37, 2, 27, 244, 178, + 37, 2, 27, 244, 177, 37, 2, 27, 244, 176, 37, 2, 27, 244, 175, 37, 2, 27, + 244, 174, 37, 2, 27, 244, 173, 37, 2, 27, 244, 172, 37, 2, 27, 244, 171, + 37, 2, 27, 244, 170, 37, 2, 27, 244, 169, 37, 2, 27, 244, 168, 37, 2, 27, + 244, 167, 37, 2, 27, 244, 166, 37, 2, 27, 244, 165, 37, 2, 27, 244, 164, + 37, 2, 27, 244, 163, 37, 2, 27, 244, 162, 37, 2, 27, 244, 161, 37, 2, 27, + 244, 160, 37, 2, 27, 244, 159, 37, 2, 27, 244, 158, 37, 2, 27, 244, 157, + 37, 2, 27, 244, 156, 37, 2, 27, 244, 155, 37, 2, 27, 244, 154, 37, 2, 27, + 244, 153, 37, 2, 27, 244, 152, 37, 2, 27, 244, 151, 37, 2, 27, 244, 150, + 37, 2, 27, 244, 149, 37, 2, 27, 244, 148, 37, 2, 27, 244, 147, 37, 2, 27, + 244, 146, 37, 2, 27, 244, 145, 37, 2, 27, 244, 144, 37, 2, 27, 244, 143, + 37, 2, 27, 244, 142, 37, 2, 27, 244, 141, 75, 1, 250, 112, 71, 229, 140, + 1, 250, 112, 193, 69, 59, 1, 255, 33, 59, 1, 255, 32, 59, 1, 255, 31, 59, + 1, 255, 27, 59, 1, 228, 96, 59, 1, 228, 95, 59, 1, 228, 94, 59, 1, 228, + 93, 59, 1, 197, 182, 59, 1, 197, 181, 59, 1, 197, 180, 59, 1, 197, 179, + 59, 1, 197, 178, 59, 1, 234, 251, 59, 1, 234, 250, 59, 1, 234, 249, 59, + 1, 234, 248, 59, 1, 234, 247, 59, 1, 212, 114, 59, 1, 212, 113, 59, 1, + 212, 112, 59, 1, 222, 173, 59, 1, 222, 170, 59, 1, 222, 169, 59, 1, 222, + 168, 59, 1, 222, 167, 59, 1, 222, 166, 59, 1, 222, 165, 59, 1, 222, 164, + 59, 1, 222, 163, 59, 1, 222, 172, 59, 1, 222, 171, 59, 1, 222, 162, 59, + 1, 221, 203, 59, 1, 221, 202, 59, 1, 221, 201, 59, 1, 221, 200, 59, 1, + 221, 199, 59, 1, 221, 198, 59, 1, 221, 197, 59, 1, 221, 196, 59, 1, 221, + 32, 59, 1, 221, 31, 59, 1, 221, 30, 59, 1, 221, 29, 59, 1, 221, 28, 59, + 1, 221, 27, 59, 1, 221, 26, 59, 1, 222, 56, 59, 1, 222, 55, 59, 1, 222, + 54, 59, 1, 222, 53, 59, 1, 222, 52, 59, 1, 222, 51, 59, 1, 221, 112, 59, + 1, 221, 111, 59, 1, 221, 110, 59, 1, 221, 109, 59, 1, 206, 100, 59, 1, + 206, 99, 59, 1, 206, 98, 59, 1, 206, 97, 59, 1, 206, 96, 59, 1, 206, 95, + 59, 1, 206, 94, 59, 1, 206, 93, 59, 1, 203, 124, 59, 1, 203, 123, 59, 1, + 203, 122, 59, 1, 203, 121, 59, 1, 203, 120, 59, 1, 203, 119, 59, 1, 201, + 183, 59, 1, 201, 182, 59, 1, 201, 181, 59, 1, 201, 180, 59, 1, 201, 179, + 59, 1, 201, 178, 59, 1, 201, 177, 59, 1, 201, 176, 59, 1, 205, 222, 59, + 1, 205, 221, 59, 1, 205, 220, 59, 1, 205, 219, 59, 1, 205, 218, 59, 1, + 202, 211, 59, 1, 202, 210, 59, 1, 202, 209, 59, 1, 202, 208, 59, 1, 202, + 207, 59, 1, 202, 206, 59, 1, 202, 205, 59, 1, 200, 180, 59, 1, 200, 179, + 59, 1, 200, 178, 59, 1, 200, 177, 59, 1, 199, 127, 59, 1, 199, 126, 59, + 1, 199, 125, 59, 1, 199, 124, 59, 1, 199, 123, 59, 1, 199, 122, 59, 1, + 199, 121, 59, 1, 198, 44, 59, 1, 198, 43, 59, 1, 198, 42, 59, 1, 198, 41, + 59, 1, 198, 40, 59, 1, 200, 78, 59, 1, 200, 77, 59, 1, 200, 76, 59, 1, + 200, 75, 59, 1, 200, 74, 59, 1, 200, 73, 59, 1, 200, 72, 59, 1, 200, 71, + 59, 1, 200, 70, 59, 1, 199, 36, 59, 1, 199, 35, 59, 1, 199, 34, 59, 1, + 199, 33, 59, 1, 199, 32, 59, 1, 199, 31, 59, 1, 199, 30, 59, 1, 215, 96, + 59, 1, 215, 95, 59, 1, 215, 94, 59, 1, 215, 93, 59, 1, 215, 92, 59, 1, + 215, 91, 59, 1, 215, 90, 59, 1, 215, 89, 59, 1, 215, 88, 59, 1, 214, 59, + 59, 1, 214, 58, 59, 1, 214, 57, 59, 1, 214, 56, 59, 1, 214, 55, 59, 1, + 214, 54, 59, 1, 214, 53, 59, 1, 214, 52, 59, 1, 213, 21, 59, 1, 213, 20, + 59, 1, 213, 19, 59, 1, 214, 213, 59, 1, 214, 212, 59, 1, 214, 211, 59, 1, + 214, 210, 59, 1, 214, 209, 59, 1, 214, 208, 59, 1, 214, 207, 59, 1, 213, + 141, 59, 1, 213, 140, 59, 1, 213, 139, 59, 1, 213, 138, 59, 1, 213, 137, + 59, 1, 230, 112, 59, 1, 230, 109, 59, 1, 230, 108, 59, 1, 230, 107, 59, + 1, 230, 106, 59, 1, 230, 105, 59, 1, 230, 104, 59, 1, 230, 103, 59, 1, + 230, 102, 59, 1, 230, 111, 59, 1, 230, 110, 59, 1, 229, 177, 59, 1, 229, + 176, 59, 1, 229, 175, 59, 1, 229, 174, 59, 1, 229, 173, 59, 1, 229, 172, + 59, 1, 229, 171, 59, 1, 228, 180, 59, 1, 228, 179, 59, 1, 228, 178, 59, + 1, 229, 254, 59, 1, 229, 253, 59, 1, 229, 252, 59, 1, 229, 251, 59, 1, + 229, 250, 59, 1, 229, 249, 59, 1, 229, 248, 59, 1, 229, 42, 59, 1, 229, + 41, 59, 1, 229, 40, 59, 1, 229, 39, 59, 1, 229, 38, 59, 1, 229, 37, 59, + 1, 229, 36, 59, 1, 229, 35, 59, 1, 217, 227, 59, 1, 217, 226, 59, 1, 217, + 225, 59, 1, 217, 224, 59, 1, 217, 223, 59, 1, 217, 222, 59, 1, 217, 221, + 59, 1, 216, 174, 59, 1, 216, 173, 59, 1, 216, 172, 59, 1, 216, 171, 59, + 1, 216, 170, 59, 1, 216, 169, 59, 1, 216, 168, 59, 1, 215, 240, 59, 1, + 215, 239, 59, 1, 215, 238, 59, 1, 215, 237, 59, 1, 217, 47, 59, 1, 217, + 46, 59, 1, 217, 45, 59, 1, 216, 90, 59, 1, 216, 89, 59, 1, 216, 88, 59, + 1, 216, 87, 59, 1, 216, 86, 59, 1, 216, 85, 59, 1, 193, 137, 59, 1, 193, + 136, 59, 1, 193, 135, 59, 1, 193, 134, 59, 1, 193, 133, 59, 1, 193, 130, + 59, 1, 192, 213, 59, 1, 192, 212, 59, 1, 192, 211, 59, 1, 192, 210, 59, + 1, 193, 0, 59, 1, 192, 255, 59, 1, 192, 254, 59, 1, 192, 253, 59, 1, 192, + 252, 59, 1, 192, 251, 59, 1, 208, 75, 59, 1, 208, 74, 59, 1, 208, 73, 59, + 1, 208, 72, 59, 1, 207, 150, 59, 1, 207, 149, 59, 1, 207, 148, 59, 1, + 207, 147, 59, 1, 207, 146, 59, 1, 207, 145, 59, 1, 207, 144, 59, 1, 206, + 217, 59, 1, 206, 216, 59, 1, 206, 215, 59, 1, 206, 214, 59, 1, 206, 213, + 59, 1, 206, 212, 59, 1, 208, 6, 59, 1, 208, 5, 59, 1, 208, 4, 59, 1, 208, + 3, 59, 1, 207, 54, 59, 1, 207, 53, 59, 1, 207, 52, 59, 1, 207, 51, 59, 1, + 207, 50, 59, 1, 207, 49, 59, 1, 194, 168, 59, 1, 194, 167, 59, 1, 194, + 166, 59, 1, 194, 165, 59, 1, 194, 164, 59, 1, 194, 71, 59, 1, 194, 70, + 59, 1, 194, 69, 59, 1, 194, 68, 59, 1, 194, 67, 59, 1, 194, 110, 59, 1, + 194, 109, 59, 1, 194, 108, 59, 1, 194, 107, 59, 1, 194, 35, 59, 1, 194, + 34, 59, 1, 194, 33, 59, 1, 194, 32, 59, 1, 194, 31, 59, 1, 194, 30, 59, + 1, 194, 29, 59, 1, 215, 148, 59, 1, 215, 147, 229, 140, 1, 2, 194, 72, + 229, 140, 1, 2, 194, 111, 229, 140, 1, 2, 194, 36, 75, 1, 2, 194, 72, 75, + 1, 2, 194, 111, 75, 1, 2, 194, 36, 75, 1, 2, 215, 151, 45, 244, 140, 45, + 244, 139, 45, 244, 138, 45, 244, 137, 45, 244, 136, 45, 244, 135, 45, + 244, 134, 45, 244, 133, 45, 244, 132, 45, 244, 131, 45, 244, 130, 45, + 244, 129, 45, 244, 128, 45, 244, 127, 45, 244, 126, 45, 244, 125, 45, + 244, 124, 45, 244, 123, 45, 244, 122, 45, 244, 121, 45, 244, 120, 45, + 244, 119, 45, 244, 118, 45, 244, 117, 45, 244, 116, 45, 244, 115, 45, + 244, 114, 45, 244, 113, 45, 244, 112, 45, 244, 111, 45, 244, 110, 45, + 244, 109, 45, 244, 108, 45, 244, 107, 45, 244, 106, 45, 244, 105, 45, + 244, 104, 45, 244, 103, 45, 244, 102, 45, 244, 101, 45, 244, 100, 45, + 244, 99, 45, 244, 98, 45, 244, 97, 45, 244, 96, 45, 244, 95, 45, 244, 94, + 45, 244, 93, 45, 244, 92, 45, 244, 91, 45, 244, 90, 45, 244, 89, 45, 244, + 88, 45, 244, 87, 45, 244, 86, 45, 244, 85, 45, 244, 84, 45, 244, 83, 45, + 244, 82, 45, 244, 81, 45, 244, 80, 45, 244, 79, 45, 244, 78, 45, 244, 77, + 45, 244, 76, 45, 244, 75, 45, 244, 74, 45, 244, 73, 45, 244, 72, 45, 244, + 71, 45, 244, 70, 45, 244, 69, 45, 244, 68, 45, 244, 67, 45, 244, 66, 45, + 244, 65, 45, 244, 64, 45, 244, 63, 45, 244, 62, 45, 244, 61, 45, 244, 60, + 45, 244, 59, 45, 244, 58, 45, 244, 57, 45, 244, 56, 45, 244, 55, 45, 244, + 54, 45, 244, 53, 45, 244, 52, 45, 244, 51, 45, 244, 50, 45, 244, 49, 45, + 244, 48, 45, 244, 47, 45, 244, 46, 45, 244, 45, 45, 244, 44, 45, 244, 43, + 45, 244, 42, 45, 244, 41, 45, 244, 40, 45, 244, 39, 45, 244, 38, 45, 244, + 37, 45, 244, 36, 45, 244, 35, 45, 244, 34, 45, 244, 33, 45, 244, 32, 45, + 244, 31, 45, 244, 30, 45, 244, 29, 45, 244, 28, 45, 244, 27, 45, 244, 26, + 45, 244, 25, 45, 244, 24, 45, 244, 23, 45, 244, 22, 45, 244, 21, 45, 244, + 20, 45, 244, 19, 45, 244, 18, 45, 244, 17, 45, 244, 16, 45, 244, 15, 45, + 244, 14, 45, 244, 13, 45, 244, 12, 45, 244, 11, 45, 244, 10, 45, 244, 9, + 45, 244, 8, 45, 244, 7, 45, 244, 6, 45, 244, 5, 45, 244, 4, 45, 244, 3, + 45, 244, 2, 45, 244, 1, 45, 244, 0, 45, 243, 255, 45, 243, 254, 45, 243, + 253, 45, 243, 252, 45, 243, 251, 45, 243, 250, 45, 243, 249, 45, 243, + 248, 45, 243, 247, 45, 243, 246, 45, 243, 245, 45, 243, 244, 45, 243, + 243, 45, 243, 242, 45, 243, 241, 45, 243, 240, 45, 243, 239, 45, 243, + 238, 45, 243, 237, 45, 243, 236, 45, 243, 235, 45, 243, 234, 45, 243, + 233, 45, 243, 232, 45, 243, 231, 45, 243, 230, 45, 243, 229, 45, 243, + 228, 45, 243, 227, 45, 243, 226, 45, 243, 225, 45, 243, 224, 45, 243, + 223, 45, 243, 222, 45, 243, 221, 45, 243, 220, 45, 243, 219, 45, 243, + 218, 45, 243, 217, 45, 243, 216, 45, 243, 215, 45, 243, 214, 45, 243, + 213, 45, 243, 212, 45, 243, 211, 45, 243, 210, 45, 243, 209, 45, 243, + 208, 45, 243, 207, 45, 243, 206, 45, 243, 205, 45, 243, 204, 45, 243, + 203, 45, 243, 202, 45, 243, 201, 45, 243, 200, 45, 243, 199, 45, 243, + 198, 45, 243, 197, 45, 243, 196, 45, 243, 195, 45, 243, 194, 45, 243, + 193, 45, 243, 192, 45, 243, 191, 45, 243, 190, 45, 243, 189, 45, 243, + 188, 45, 243, 187, 45, 243, 186, 45, 243, 185, 45, 243, 184, 45, 243, + 183, 45, 243, 182, 45, 243, 181, 45, 243, 180, 45, 243, 179, 45, 243, + 178, 45, 243, 177, 45, 243, 176, 45, 243, 175, 45, 243, 174, 45, 243, + 173, 45, 243, 172, 45, 243, 171, 45, 243, 170, 45, 243, 169, 45, 243, + 168, 45, 243, 167, 45, 243, 166, 45, 243, 165, 45, 243, 164, 45, 243, + 163, 45, 243, 162, 45, 243, 161, 45, 243, 160, 45, 243, 159, 45, 243, + 158, 45, 243, 157, 45, 243, 156, 45, 243, 155, 45, 243, 154, 45, 243, + 153, 45, 243, 152, 45, 243, 151, 45, 243, 150, 45, 243, 149, 45, 243, + 148, 45, 243, 147, 45, 243, 146, 45, 243, 145, 45, 243, 144, 45, 243, + 143, 45, 243, 142, 45, 243, 141, 45, 243, 140, 45, 243, 139, 45, 243, + 138, 45, 243, 137, 45, 243, 136, 45, 243, 135, 45, 243, 134, 45, 243, + 133, 45, 243, 132, 45, 243, 131, 45, 243, 130, 45, 243, 129, 45, 243, + 128, 45, 243, 127, 45, 243, 126, 45, 243, 125, 45, 243, 124, 45, 243, + 123, 45, 243, 122, 45, 243, 121, 45, 243, 120, 45, 243, 119, 45, 243, + 118, 45, 243, 117, 45, 243, 116, 45, 243, 115, 45, 243, 114, 45, 243, + 113, 45, 243, 112, 45, 243, 111, 45, 243, 110, 45, 243, 109, 45, 243, + 108, 45, 243, 107, 45, 243, 106, 45, 243, 105, 45, 243, 104, 45, 243, + 103, 45, 243, 102, 45, 243, 101, 45, 243, 100, 45, 243, 99, 45, 243, 98, + 45, 243, 97, 45, 243, 96, 45, 243, 95, 45, 243, 94, 45, 243, 93, 45, 243, + 92, 45, 243, 91, 45, 243, 90, 45, 243, 89, 45, 243, 88, 45, 243, 87, 45, + 243, 86, 45, 243, 85, 45, 243, 84, 45, 243, 83, 45, 243, 82, 45, 243, 81, + 45, 243, 80, 45, 243, 79, 45, 243, 78, 45, 243, 77, 45, 243, 76, 45, 243, + 75, 45, 243, 74, 45, 243, 73, 45, 243, 72, 45, 243, 71, 45, 243, 70, 45, + 243, 69, 45, 243, 68, 45, 243, 67, 45, 243, 66, 45, 243, 65, 45, 243, 64, + 45, 243, 63, 45, 243, 62, 45, 243, 61, 45, 243, 60, 45, 243, 59, 45, 243, + 58, 45, 243, 57, 45, 243, 56, 45, 243, 55, 45, 243, 54, 45, 243, 53, 45, + 243, 52, 45, 243, 51, 45, 243, 50, 45, 243, 49, 45, 243, 48, 45, 243, 47, + 45, 243, 46, 45, 243, 45, 45, 243, 44, 45, 243, 43, 45, 243, 42, 45, 243, + 41, 45, 243, 40, 45, 243, 39, 45, 243, 38, 45, 243, 37, 45, 243, 36, 45, + 243, 35, 45, 243, 34, 45, 243, 33, 45, 243, 32, 45, 243, 31, 45, 243, 30, + 45, 243, 29, 45, 243, 28, 45, 243, 27, 45, 243, 26, 45, 243, 25, 45, 243, + 24, 45, 243, 23, 45, 243, 22, 45, 243, 21, 45, 243, 20, 45, 243, 19, 45, + 243, 18, 45, 243, 17, 45, 243, 16, 45, 243, 15, 45, 243, 14, 45, 243, 13, + 45, 243, 12, 45, 243, 11, 45, 243, 10, 45, 243, 9, 45, 243, 8, 45, 243, + 7, 45, 243, 6, 45, 243, 5, 45, 243, 4, 45, 243, 3, 45, 243, 2, 45, 243, + 1, 121, 1, 230, 124, 121, 1, 193, 223, 121, 1, 211, 93, 121, 1, 200, 228, + 121, 1, 233, 163, 121, 1, 222, 184, 121, 1, 165, 121, 1, 249, 226, 121, + 1, 238, 95, 121, 1, 196, 236, 121, 1, 232, 44, 121, 1, 150, 121, 1, 211, + 94, 215, 151, 121, 1, 238, 96, 206, 158, 121, 1, 233, 164, 215, 151, 121, + 1, 222, 185, 218, 236, 121, 1, 208, 112, 206, 158, 121, 1, 199, 242, 121, + 1, 202, 246, 237, 41, 121, 1, 237, 41, 121, 1, 221, 140, 121, 1, 202, + 246, 223, 65, 121, 1, 229, 132, 121, 1, 219, 223, 121, 1, 207, 157, 121, + 1, 218, 236, 121, 1, 215, 151, 121, 1, 223, 65, 121, 1, 206, 158, 121, 1, + 218, 237, 215, 151, 121, 1, 215, 152, 218, 236, 121, 1, 223, 66, 218, + 236, 121, 1, 206, 159, 223, 65, 121, 1, 218, 237, 4, 236, 114, 121, 1, + 215, 152, 4, 236, 114, 121, 1, 223, 66, 4, 236, 114, 121, 1, 223, 66, 4, + 236, 112, 223, 146, 26, 58, 121, 1, 206, 159, 4, 236, 114, 121, 1, 206, + 159, 4, 78, 63, 121, 1, 218, 237, 206, 158, 121, 1, 215, 152, 206, 158, + 121, 1, 223, 66, 206, 158, 121, 1, 206, 159, 206, 158, 121, 1, 218, 237, + 215, 152, 206, 158, 121, 1, 215, 152, 218, 237, 206, 158, 121, 1, 223, + 66, 218, 237, 206, 158, 121, 1, 206, 159, 223, 66, 206, 158, 121, 1, 223, + 66, 206, 159, 4, 236, 114, 121, 1, 223, 66, 215, 151, 121, 1, 223, 66, + 215, 152, 206, 158, 121, 1, 206, 159, 200, 228, 121, 1, 206, 159, 200, + 229, 150, 121, 1, 206, 159, 211, 93, 121, 1, 206, 159, 211, 94, 150, 121, + 1, 200, 229, 206, 158, 121, 1, 200, 229, 208, 112, 206, 158, 121, 1, 194, + 202, 121, 1, 194, 83, 121, 1, 194, 203, 150, 121, 1, 206, 159, 215, 151, + 121, 1, 206, 159, 218, 236, 121, 1, 222, 185, 208, 112, 206, 158, 121, 1, + 232, 45, 208, 112, 206, 158, 121, 1, 206, 159, 222, 184, 121, 1, 206, + 159, 222, 185, 150, 121, 1, 64, 121, 1, 202, 246, 211, 106, 121, 1, 212, + 26, 121, 1, 74, 121, 1, 250, 164, 121, 1, 70, 121, 1, 71, 121, 1, 223, + 251, 121, 1, 203, 195, 70, 121, 1, 197, 95, 121, 1, 234, 171, 121, 1, + 202, 246, 234, 157, 121, 1, 207, 29, 70, 121, 1, 202, 246, 234, 171, 121, + 1, 184, 70, 121, 1, 193, 69, 121, 1, 68, 121, 1, 233, 230, 121, 1, 193, + 171, 121, 1, 124, 215, 151, 121, 1, 184, 68, 121, 1, 207, 29, 68, 121, 1, + 197, 97, 121, 1, 202, 246, 68, 121, 1, 211, 191, 121, 1, 211, 106, 121, + 1, 211, 130, 121, 1, 194, 169, 121, 1, 194, 36, 121, 1, 194, 72, 121, 1, + 194, 98, 121, 1, 194, 2, 121, 1, 215, 49, 68, 121, 1, 215, 49, 74, 121, + 1, 215, 49, 70, 121, 1, 215, 49, 64, 121, 1, 210, 122, 250, 224, 121, 1, + 210, 122, 250, 241, 121, 1, 202, 246, 234, 88, 121, 1, 202, 246, 250, + 224, 121, 1, 202, 246, 211, 211, 121, 1, 118, 218, 236, 121, 251, 87, 46, + 229, 5, 205, 213, 121, 251, 87, 216, 162, 229, 5, 205, 213, 121, 251, 87, + 51, 229, 5, 205, 213, 121, 251, 87, 132, 84, 205, 213, 121, 251, 87, 216, + 162, 84, 205, 213, 121, 251, 87, 139, 84, 205, 213, 121, 251, 87, 250, + 14, 205, 213, 121, 251, 87, 250, 14, 220, 19, 205, 213, 121, 251, 87, + 250, 14, 200, 120, 121, 251, 87, 250, 14, 200, 147, 121, 251, 87, 250, + 14, 234, 253, 128, 121, 251, 87, 250, 14, 228, 97, 128, 121, 251, 87, + 250, 14, 200, 121, 128, 121, 251, 87, 139, 251, 129, 121, 251, 87, 139, + 199, 107, 251, 129, 121, 251, 87, 139, 230, 210, 121, 251, 87, 139, 184, + 230, 210, 121, 251, 87, 139, 236, 114, 121, 251, 87, 139, 242, 130, 121, + 251, 87, 139, 219, 175, 121, 251, 87, 139, 194, 124, 121, 251, 87, 139, + 196, 105, 121, 251, 87, 132, 251, 129, 121, 251, 87, 132, 199, 107, 251, + 129, 121, 251, 87, 132, 230, 210, 121, 251, 87, 132, 184, 230, 210, 121, + 251, 87, 132, 236, 114, 121, 251, 87, 132, 242, 130, 121, 251, 87, 132, + 219, 175, 121, 251, 87, 132, 194, 124, 121, 251, 87, 132, 196, 105, 121, + 251, 87, 132, 54, 121, 3, 185, 4, 238, 183, 121, 199, 200, 1, 205, 189, + 121, 55, 77, 121, 209, 38, 242, 198, 232, 71, 201, 238, 203, 182, 232, + 135, 1, 211, 113, 203, 182, 232, 135, 238, 249, 211, 113, 203, 182, 232, + 135, 142, 201, 253, 203, 182, 232, 135, 130, 201, 253, 69, 35, 16, 209, + 55, 69, 35, 16, 237, 187, 69, 35, 16, 210, 126, 69, 35, 16, 211, 102, + 234, 128, 69, 35, 16, 211, 102, 236, 210, 69, 35, 16, 196, 141, 234, 128, + 69, 35, 16, 196, 141, 236, 210, 69, 35, 16, 222, 78, 69, 35, 16, 200, + 245, 69, 35, 16, 210, 237, 69, 35, 16, 192, 220, 69, 35, 16, 192, 221, + 236, 210, 69, 35, 16, 221, 51, 69, 35, 16, 250, 159, 234, 128, 69, 35, + 16, 233, 198, 234, 128, 69, 35, 16, 200, 43, 69, 35, 16, 222, 26, 69, 35, + 16, 250, 148, 69, 35, 16, 250, 149, 236, 210, 69, 35, 16, 200, 252, 69, + 35, 16, 199, 179, 69, 35, 16, 211, 222, 250, 110, 69, 35, 16, 230, 237, + 250, 110, 69, 35, 16, 209, 54, 69, 35, 16, 246, 108, 69, 35, 16, 196, + 130, 69, 35, 16, 223, 87, 250, 110, 69, 35, 16, 222, 28, 250, 110, 69, + 35, 16, 222, 27, 250, 110, 69, 35, 16, 206, 3, 69, 35, 16, 210, 227, 69, + 35, 16, 202, 7, 250, 152, 69, 35, 16, 211, 101, 250, 110, 69, 35, 16, + 196, 140, 250, 110, 69, 35, 16, 250, 153, 250, 110, 69, 35, 16, 250, 146, + 69, 35, 16, 221, 130, 69, 35, 16, 207, 164, 69, 35, 16, 210, 49, 250, + 110, 69, 35, 16, 199, 80, 69, 35, 16, 250, 220, 69, 35, 16, 205, 192, 69, + 35, 16, 201, 0, 250, 110, 69, 35, 16, 201, 0, 216, 241, 202, 5, 69, 35, + 16, 211, 96, 250, 110, 69, 35, 16, 199, 218, 69, 35, 16, 220, 6, 69, 35, + 16, 235, 20, 69, 35, 16, 198, 187, 69, 35, 16, 200, 11, 69, 35, 16, 221, + 54, 69, 35, 16, 250, 159, 233, 198, 214, 192, 69, 35, 16, 232, 79, 250, + 110, 69, 35, 16, 223, 203, 69, 35, 16, 198, 156, 250, 110, 69, 35, 16, + 222, 81, 198, 155, 69, 35, 16, 210, 156, 69, 35, 16, 209, 59, 69, 35, 16, + 221, 89, 69, 35, 16, 242, 180, 250, 110, 69, 35, 16, 208, 27, 69, 35, 16, + 210, 240, 250, 110, 69, 35, 16, 210, 238, 250, 110, 69, 35, 16, 228, 47, + 69, 35, 16, 215, 60, 69, 35, 16, 210, 104, 69, 35, 16, 221, 90, 251, 3, + 69, 35, 16, 198, 156, 251, 3, 69, 35, 16, 201, 232, 69, 35, 16, 230, 196, + 69, 35, 16, 223, 87, 214, 192, 69, 35, 16, 211, 222, 214, 192, 69, 35, + 16, 211, 102, 214, 192, 69, 35, 16, 210, 103, 69, 35, 16, 221, 74, 69, + 35, 16, 210, 102, 69, 35, 16, 221, 53, 69, 35, 16, 210, 157, 214, 192, + 69, 35, 16, 222, 27, 214, 193, 250, 190, 69, 35, 16, 222, 28, 214, 193, + 250, 190, 69, 35, 16, 192, 218, 69, 35, 16, 250, 149, 214, 192, 69, 35, + 16, 250, 150, 200, 253, 214, 192, 69, 35, 16, 192, 219, 69, 35, 16, 221, + 52, 69, 35, 16, 234, 123, 69, 35, 16, 246, 109, 69, 35, 16, 216, 133, + 223, 86, 69, 35, 16, 196, 141, 214, 192, 69, 35, 16, 210, 49, 214, 192, + 69, 35, 16, 209, 60, 214, 192, 69, 35, 16, 211, 218, 69, 35, 16, 250, + 177, 69, 35, 16, 218, 247, 69, 35, 16, 210, 238, 214, 192, 69, 35, 16, + 210, 240, 214, 192, 69, 35, 16, 233, 236, 210, 239, 69, 35, 16, 220, 206, + 69, 35, 16, 250, 178, 69, 35, 16, 198, 156, 214, 192, 69, 35, 16, 234, + 126, 69, 35, 16, 201, 0, 214, 192, 69, 35, 16, 200, 246, 69, 35, 16, 242, + 180, 214, 192, 69, 35, 16, 234, 38, 69, 35, 16, 205, 193, 214, 192, 69, + 35, 16, 193, 188, 221, 130, 69, 35, 16, 198, 153, 69, 35, 16, 209, 61, + 69, 35, 16, 198, 157, 69, 35, 16, 198, 154, 69, 35, 16, 209, 58, 69, 35, + 16, 198, 152, 69, 35, 16, 209, 57, 69, 35, 16, 230, 236, 69, 35, 16, 250, + 102, 69, 35, 16, 233, 236, 250, 102, 69, 35, 16, 211, 96, 214, 192, 69, + 35, 16, 199, 217, 233, 249, 69, 35, 16, 199, 217, 233, 197, 69, 35, 16, + 199, 219, 250, 154, 69, 35, 16, 199, 211, 222, 136, 250, 145, 69, 35, 16, + 222, 80, 69, 35, 16, 234, 75, 69, 35, 16, 193, 27, 222, 77, 69, 35, 16, + 193, 27, 250, 190, 69, 35, 16, 202, 6, 69, 35, 16, 221, 131, 250, 190, + 69, 35, 16, 236, 211, 250, 110, 69, 35, 16, 221, 55, 250, 110, 69, 35, + 16, 221, 55, 251, 3, 69, 35, 16, 221, 55, 214, 192, 69, 35, 16, 250, 153, + 214, 192, 69, 35, 16, 250, 155, 69, 35, 16, 236, 210, 69, 35, 16, 198, + 168, 69, 35, 16, 200, 1, 69, 35, 16, 221, 78, 69, 35, 16, 220, 11, 234, + 68, 242, 170, 69, 35, 16, 220, 11, 235, 21, 242, 171, 69, 35, 16, 220, + 11, 198, 171, 242, 171, 69, 35, 16, 220, 11, 200, 13, 242, 171, 69, 35, + 16, 220, 11, 223, 198, 242, 170, 69, 35, 16, 230, 237, 214, 193, 250, + 190, 69, 35, 16, 230, 237, 210, 228, 250, 98, 69, 35, 16, 230, 237, 210, + 228, 237, 45, 69, 35, 16, 236, 235, 69, 35, 16, 236, 236, 210, 228, 250, + 99, 222, 77, 69, 35, 16, 236, 236, 210, 228, 250, 99, 250, 190, 69, 35, + 16, 236, 236, 210, 228, 237, 45, 69, 35, 16, 198, 176, 69, 35, 16, 250, + 103, 69, 35, 16, 223, 205, 69, 35, 16, 237, 2, 69, 35, 16, 251, 74, 209, + 181, 250, 104, 69, 35, 16, 251, 74, 250, 101, 69, 35, 16, 251, 74, 250, + 104, 69, 35, 16, 251, 74, 216, 235, 69, 35, 16, 251, 74, 216, 246, 69, + 35, 16, 251, 74, 230, 238, 69, 35, 16, 251, 74, 230, 235, 69, 35, 16, + 251, 74, 209, 181, 230, 238, 69, 35, 16, 217, 116, 209, 67, 228, 45, 69, + 35, 16, 217, 116, 251, 5, 209, 67, 228, 45, 69, 35, 16, 217, 116, 237, + 44, 228, 45, 69, 35, 16, 217, 116, 251, 5, 237, 44, 228, 45, 69, 35, 16, + 217, 116, 198, 163, 228, 45, 69, 35, 16, 217, 116, 198, 177, 69, 35, 16, + 217, 116, 200, 6, 228, 45, 69, 35, 16, 217, 116, 200, 6, 220, 15, 228, + 45, 69, 35, 16, 217, 116, 220, 15, 228, 45, 69, 35, 16, 217, 116, 209, + 229, 228, 45, 69, 35, 16, 223, 94, 200, 36, 228, 46, 69, 35, 16, 250, + 150, 200, 36, 228, 46, 69, 35, 16, 233, 67, 200, 3, 69, 35, 16, 233, 67, + 216, 46, 69, 35, 16, 233, 67, 236, 241, 69, 35, 16, 217, 116, 196, 134, + 228, 45, 69, 35, 16, 217, 116, 209, 66, 228, 45, 69, 35, 16, 217, 116, + 209, 229, 200, 6, 228, 45, 69, 35, 16, 230, 232, 215, 152, 250, 154, 69, + 35, 16, 230, 232, 215, 152, 236, 209, 69, 35, 16, 234, 86, 222, 136, 232, + 79, 195, 231, 69, 35, 16, 223, 204, 69, 35, 16, 223, 202, 69, 35, 16, + 232, 79, 250, 111, 237, 43, 228, 44, 69, 35, 16, 232, 79, 237, 0, 166, + 69, 35, 16, 232, 79, 237, 0, 215, 60, 69, 35, 16, 232, 79, 215, 54, 228, + 45, 69, 35, 16, 232, 79, 237, 0, 237, 16, 69, 35, 16, 232, 79, 203, 12, + 236, 255, 237, 16, 69, 35, 16, 232, 79, 237, 0, 222, 57, 69, 35, 16, 232, + 79, 237, 0, 192, 8, 69, 35, 16, 232, 79, 237, 0, 214, 61, 222, 77, 69, + 35, 16, 232, 79, 237, 0, 214, 61, 250, 190, 69, 35, 16, 232, 79, 217, + 167, 242, 172, 236, 241, 69, 35, 16, 232, 79, 217, 167, 242, 172, 216, + 46, 69, 35, 16, 233, 12, 203, 12, 242, 172, 196, 133, 69, 35, 16, 232, + 79, 203, 12, 242, 172, 201, 1, 69, 35, 16, 232, 79, 214, 195, 69, 35, 16, + 242, 173, 191, 231, 69, 35, 16, 242, 173, 221, 129, 69, 35, 16, 242, 173, + 202, 151, 69, 35, 16, 232, 79, 228, 97, 193, 26, 200, 7, 69, 35, 16, 232, + 79, 234, 87, 250, 179, 69, 35, 16, 193, 26, 198, 164, 69, 35, 16, 236, + 249, 198, 164, 69, 35, 16, 236, 249, 200, 7, 69, 35, 16, 236, 249, 250, + 156, 235, 21, 236, 138, 69, 35, 16, 236, 249, 216, 44, 200, 12, 236, 138, + 69, 35, 16, 236, 249, 236, 232, 233, 210, 236, 138, 69, 35, 16, 236, 249, + 198, 174, 211, 228, 236, 138, 69, 35, 16, 193, 26, 250, 156, 235, 21, + 236, 138, 69, 35, 16, 193, 26, 216, 44, 200, 12, 236, 138, 69, 35, 16, + 193, 26, 236, 232, 233, 210, 236, 138, 69, 35, 16, 193, 26, 198, 174, + 211, 228, 236, 138, 69, 35, 16, 231, 140, 236, 248, 69, 35, 16, 231, 140, + 193, 25, 69, 35, 16, 237, 1, 250, 156, 216, 134, 69, 35, 16, 237, 1, 250, + 156, 217, 20, 69, 35, 16, 237, 1, 236, 210, 69, 35, 16, 237, 1, 199, 209, + 69, 35, 16, 203, 85, 199, 209, 69, 35, 16, 203, 85, 199, 210, 236, 193, + 69, 35, 16, 203, 85, 199, 210, 198, 165, 69, 35, 16, 203, 85, 199, 210, + 199, 255, 69, 35, 16, 203, 85, 250, 70, 69, 35, 16, 203, 85, 250, 71, + 236, 193, 69, 35, 16, 203, 85, 250, 71, 198, 165, 69, 35, 16, 203, 85, + 250, 71, 199, 255, 69, 35, 16, 236, 233, 231, 121, 69, 35, 16, 236, 240, + 211, 130, 69, 35, 16, 201, 248, 69, 35, 16, 250, 95, 166, 69, 35, 16, + 250, 95, 195, 231, 69, 35, 16, 250, 95, 231, 233, 69, 35, 16, 250, 95, + 237, 16, 69, 35, 16, 250, 95, 222, 57, 69, 35, 16, 250, 95, 192, 8, 69, + 35, 16, 250, 95, 214, 60, 69, 35, 16, 222, 27, 214, 193, 216, 245, 69, + 35, 16, 222, 28, 214, 193, 216, 245, 69, 35, 16, 222, 27, 214, 193, 222, + 77, 69, 35, 16, 222, 28, 214, 193, 222, 77, 69, 35, 16, 221, 131, 222, + 77, 69, 35, 16, 230, 237, 214, 193, 222, 77, 35, 16, 203, 74, 248, 189, + 35, 16, 55, 248, 189, 35, 16, 52, 248, 189, 35, 16, 207, 169, 52, 248, + 189, 35, 16, 237, 184, 248, 189, 35, 16, 203, 195, 248, 189, 35, 16, 46, + 207, 199, 57, 35, 16, 51, 207, 199, 57, 35, 16, 207, 199, 236, 111, 35, + 16, 237, 228, 205, 196, 35, 16, 238, 1, 246, 223, 35, 16, 205, 196, 35, + 16, 242, 56, 35, 16, 207, 197, 232, 255, 35, 16, 207, 197, 232, 254, 35, + 16, 207, 197, 232, 253, 35, 16, 233, 22, 35, 16, 233, 23, 63, 35, 16, + 247, 152, 77, 35, 16, 247, 9, 35, 16, 247, 166, 35, 16, 186, 35, 16, 211, + 206, 202, 28, 35, 16, 197, 219, 202, 28, 35, 16, 199, 155, 202, 28, 35, + 16, 232, 118, 202, 28, 35, 16, 232, 213, 202, 28, 35, 16, 203, 40, 202, + 28, 35, 16, 203, 38, 232, 96, 35, 16, 232, 116, 232, 96, 35, 16, 232, 45, + 242, 99, 35, 16, 232, 45, 242, 100, 211, 134, 250, 250, 35, 16, 232, 45, + 242, 100, 211, 134, 248, 172, 35, 16, 247, 53, 242, 99, 35, 16, 233, 164, + 242, 99, 35, 16, 233, 164, 242, 100, 211, 134, 250, 250, 35, 16, 233, + 164, 242, 100, 211, 134, 248, 172, 35, 16, 235, 68, 242, 98, 35, 16, 235, + 68, 242, 97, 35, 16, 215, 216, 217, 44, 207, 180, 35, 16, 55, 204, 25, + 35, 16, 55, 232, 195, 35, 16, 232, 196, 197, 41, 35, 16, 232, 196, 235, + 96, 35, 16, 215, 43, 197, 41, 35, 16, 215, 43, 235, 96, 35, 16, 204, 26, + 197, 41, 35, 16, 204, 26, 235, 96, 35, 16, 208, 168, 158, 204, 25, 35, + 16, 208, 168, 158, 232, 195, 35, 16, 242, 35, 199, 84, 35, 16, 238, 122, + 199, 84, 35, 16, 211, 134, 250, 250, 35, 16, 211, 134, 248, 172, 35, 16, + 208, 149, 250, 250, 35, 16, 208, 149, 248, 172, 35, 16, 215, 219, 207, + 180, 35, 16, 194, 73, 207, 180, 35, 16, 138, 207, 180, 35, 16, 208, 168, + 207, 180, 35, 16, 234, 144, 207, 180, 35, 16, 203, 34, 207, 180, 35, 16, + 199, 181, 207, 180, 35, 16, 203, 24, 207, 180, 35, 16, 90, 228, 163, 197, + 237, 207, 180, 35, 16, 193, 224, 213, 101, 35, 16, 102, 213, 101, 35, 16, + 242, 131, 193, 224, 213, 101, 35, 16, 50, 213, 102, 194, 75, 35, 16, 50, + 213, 102, 247, 248, 35, 16, 198, 186, 213, 102, 130, 194, 75, 35, 16, + 198, 186, 213, 102, 130, 247, 248, 35, 16, 198, 186, 213, 102, 46, 194, + 75, 35, 16, 198, 186, 213, 102, 46, 247, 248, 35, 16, 198, 186, 213, 102, + 51, 194, 75, 35, 16, 198, 186, 213, 102, 51, 247, 248, 35, 16, 198, 186, + 213, 102, 142, 194, 75, 35, 16, 198, 186, 213, 102, 142, 247, 248, 35, + 16, 198, 186, 213, 102, 130, 51, 194, 75, 35, 16, 198, 186, 213, 102, + 130, 51, 247, 248, 35, 16, 216, 30, 213, 102, 194, 75, 35, 16, 216, 30, + 213, 102, 247, 248, 35, 16, 198, 183, 213, 102, 142, 194, 75, 35, 16, + 198, 183, 213, 102, 142, 247, 248, 35, 16, 210, 231, 213, 101, 35, 16, + 195, 245, 213, 101, 35, 16, 213, 102, 247, 248, 35, 16, 212, 239, 213, + 101, 35, 16, 242, 68, 213, 102, 194, 75, 35, 16, 242, 68, 213, 102, 247, + 248, 35, 16, 247, 150, 35, 16, 194, 73, 213, 105, 35, 16, 138, 213, 105, + 35, 16, 208, 168, 213, 105, 35, 16, 234, 144, 213, 105, 35, 16, 203, 34, + 213, 105, 35, 16, 199, 181, 213, 105, 35, 16, 203, 24, 213, 105, 35, 16, + 90, 228, 163, 197, 237, 213, 105, 35, 16, 38, 201, 255, 35, 16, 38, 202, + 113, 201, 255, 35, 16, 38, 198, 194, 35, 16, 38, 198, 193, 35, 16, 38, + 198, 192, 35, 16, 232, 238, 198, 194, 35, 16, 232, 238, 198, 193, 35, 16, + 232, 238, 198, 192, 35, 16, 38, 250, 5, 236, 114, 35, 16, 38, 232, 205, + 35, 16, 38, 232, 204, 35, 16, 38, 232, 203, 35, 16, 38, 232, 202, 35, 16, + 38, 232, 201, 35, 16, 248, 100, 248, 120, 35, 16, 234, 80, 248, 120, 35, + 16, 248, 100, 199, 113, 35, 16, 234, 80, 199, 113, 35, 16, 248, 100, 202, + 237, 35, 16, 234, 80, 202, 237, 35, 16, 248, 100, 210, 58, 35, 16, 234, + 80, 210, 58, 35, 16, 38, 251, 143, 35, 16, 38, 202, 32, 35, 16, 38, 200, + 18, 35, 16, 38, 202, 33, 35, 16, 38, 217, 131, 35, 16, 38, 217, 130, 35, + 16, 38, 251, 142, 35, 16, 38, 219, 54, 35, 16, 250, 83, 197, 41, 35, 16, + 250, 83, 235, 96, 35, 16, 38, 236, 130, 35, 16, 38, 207, 77, 35, 16, 38, + 232, 184, 35, 16, 38, 202, 233, 35, 16, 38, 248, 78, 35, 16, 38, 55, 199, + 0, 35, 16, 38, 198, 170, 199, 0, 35, 16, 207, 83, 35, 16, 201, 166, 35, + 16, 192, 155, 35, 16, 210, 50, 35, 16, 216, 226, 35, 16, 232, 130, 35, + 16, 238, 195, 35, 16, 237, 102, 35, 16, 230, 227, 213, 106, 203, 4, 35, + 16, 230, 227, 213, 106, 213, 143, 203, 4, 35, 16, 198, 224, 35, 16, 198, + 9, 35, 16, 223, 121, 198, 9, 35, 16, 198, 10, 203, 4, 35, 16, 198, 10, + 197, 41, 35, 16, 211, 151, 201, 207, 35, 16, 211, 151, 201, 204, 35, 16, + 211, 151, 201, 203, 35, 16, 211, 151, 201, 202, 35, 16, 211, 151, 201, + 201, 35, 16, 211, 151, 201, 200, 35, 16, 211, 151, 201, 199, 35, 16, 211, + 151, 201, 198, 35, 16, 211, 151, 201, 197, 35, 16, 211, 151, 201, 206, + 35, 16, 211, 151, 201, 205, 35, 16, 230, 10, 35, 16, 214, 206, 35, 16, + 234, 80, 80, 201, 244, 35, 16, 237, 95, 203, 4, 35, 16, 38, 142, 247, + 180, 35, 16, 38, 130, 247, 180, 35, 16, 38, 230, 23, 35, 16, 38, 202, + 223, 209, 235, 35, 16, 210, 173, 77, 35, 16, 210, 173, 130, 77, 35, 16, + 138, 210, 173, 77, 35, 16, 231, 8, 197, 41, 35, 16, 231, 8, 235, 96, 35, + 16, 4, 232, 237, 35, 16, 237, 211, 35, 16, 237, 212, 251, 8, 35, 16, 217, + 94, 35, 16, 219, 75, 35, 16, 247, 147, 35, 16, 204, 184, 194, 75, 35, 16, + 204, 184, 247, 248, 35, 16, 216, 116, 35, 16, 216, 117, 247, 248, 35, 16, + 204, 178, 194, 75, 35, 16, 204, 178, 247, 248, 35, 16, 232, 62, 194, 75, + 35, 16, 232, 62, 247, 248, 35, 16, 219, 76, 210, 131, 207, 180, 35, 16, + 219, 76, 223, 195, 207, 180, 35, 16, 247, 148, 207, 180, 35, 16, 204, + 184, 207, 180, 35, 16, 216, 117, 207, 180, 35, 16, 204, 178, 207, 180, + 35, 16, 200, 32, 210, 129, 238, 153, 209, 77, 210, 130, 35, 16, 200, 32, + 210, 129, 238, 153, 209, 77, 223, 194, 35, 16, 200, 32, 210, 129, 238, + 153, 209, 77, 210, 131, 236, 220, 35, 16, 200, 32, 223, 193, 238, 153, + 209, 77, 210, 130, 35, 16, 200, 32, 223, 193, 238, 153, 209, 77, 223, + 194, 35, 16, 200, 32, 223, 193, 238, 153, 209, 77, 223, 195, 236, 220, + 35, 16, 200, 32, 223, 193, 238, 153, 209, 77, 223, 195, 236, 219, 35, 16, + 200, 32, 223, 193, 238, 153, 209, 77, 223, 195, 236, 218, 35, 16, 238, + 186, 35, 16, 230, 199, 247, 53, 242, 99, 35, 16, 230, 199, 233, 164, 242, + 99, 35, 16, 50, 249, 226, 35, 16, 196, 10, 35, 16, 209, 195, 35, 16, 242, + 89, 35, 16, 205, 249, 35, 16, 242, 94, 35, 16, 198, 242, 35, 16, 209, + 163, 35, 16, 209, 164, 232, 187, 35, 16, 205, 250, 232, 187, 35, 16, 198, + 243, 207, 177, 35, 16, 210, 112, 201, 156, 35, 16, 221, 186, 247, 53, + 242, 99, 35, 16, 221, 186, 234, 80, 80, 210, 42, 35, 16, 221, 186, 52, + 213, 105, 35, 16, 221, 186, 207, 249, 77, 35, 16, 221, 186, 194, 73, 213, + 105, 35, 16, 221, 186, 138, 213, 105, 35, 16, 221, 186, 208, 168, 213, + 106, 202, 0, 235, 96, 35, 16, 221, 186, 208, 168, 213, 106, 202, 0, 197, + 41, 35, 16, 221, 186, 234, 144, 213, 106, 202, 0, 235, 96, 35, 16, 221, + 186, 234, 144, 213, 106, 202, 0, 197, 41, 35, 16, 221, 186, 232, 196, 57, + 33, 195, 251, 213, 109, 201, 52, 33, 195, 251, 213, 109, 201, 41, 33, + 195, 251, 213, 109, 201, 31, 33, 195, 251, 213, 109, 201, 24, 33, 195, + 251, 213, 109, 201, 16, 33, 195, 251, 213, 109, 201, 10, 33, 195, 251, + 213, 109, 201, 9, 33, 195, 251, 213, 109, 201, 8, 33, 195, 251, 213, 109, + 201, 7, 33, 195, 251, 213, 109, 201, 51, 33, 195, 251, 213, 109, 201, 50, + 33, 195, 251, 213, 109, 201, 49, 33, 195, 251, 213, 109, 201, 48, 33, + 195, 251, 213, 109, 201, 47, 33, 195, 251, 213, 109, 201, 46, 33, 195, + 251, 213, 109, 201, 45, 33, 195, 251, 213, 109, 201, 44, 33, 195, 251, + 213, 109, 201, 43, 33, 195, 251, 213, 109, 201, 42, 33, 195, 251, 213, + 109, 201, 40, 33, 195, 251, 213, 109, 201, 39, 33, 195, 251, 213, 109, + 201, 38, 33, 195, 251, 213, 109, 201, 37, 33, 195, 251, 213, 109, 201, + 36, 33, 195, 251, 213, 109, 201, 15, 33, 195, 251, 213, 109, 201, 14, 33, + 195, 251, 213, 109, 201, 13, 33, 195, 251, 213, 109, 201, 12, 33, 195, + 251, 213, 109, 201, 11, 33, 223, 144, 213, 109, 201, 52, 33, 223, 144, + 213, 109, 201, 41, 33, 223, 144, 213, 109, 201, 24, 33, 223, 144, 213, + 109, 201, 16, 33, 223, 144, 213, 109, 201, 9, 33, 223, 144, 213, 109, + 201, 8, 33, 223, 144, 213, 109, 201, 50, 33, 223, 144, 213, 109, 201, 49, + 33, 223, 144, 213, 109, 201, 48, 33, 223, 144, 213, 109, 201, 47, 33, + 223, 144, 213, 109, 201, 44, 33, 223, 144, 213, 109, 201, 43, 33, 223, + 144, 213, 109, 201, 42, 33, 223, 144, 213, 109, 201, 37, 33, 223, 144, + 213, 109, 201, 36, 33, 223, 144, 213, 109, 201, 35, 33, 223, 144, 213, + 109, 201, 34, 33, 223, 144, 213, 109, 201, 33, 33, 223, 144, 213, 109, + 201, 32, 33, 223, 144, 213, 109, 201, 30, 33, 223, 144, 213, 109, 201, + 29, 33, 223, 144, 213, 109, 201, 28, 33, 223, 144, 213, 109, 201, 27, 33, + 223, 144, 213, 109, 201, 26, 33, 223, 144, 213, 109, 201, 25, 33, 223, + 144, 213, 109, 201, 23, 33, 223, 144, 213, 109, 201, 22, 33, 223, 144, + 213, 109, 201, 21, 33, 223, 144, 213, 109, 201, 20, 33, 223, 144, 213, + 109, 201, 19, 33, 223, 144, 213, 109, 201, 18, 33, 223, 144, 213, 109, + 201, 17, 33, 223, 144, 213, 109, 201, 15, 33, 223, 144, 213, 109, 201, + 14, 33, 223, 144, 213, 109, 201, 13, 33, 223, 144, 213, 109, 201, 12, 33, + 223, 144, 213, 109, 201, 11, 38, 33, 35, 198, 166, 38, 33, 35, 200, 0, + 38, 33, 35, 210, 142, 33, 35, 220, 10, 217, 91, 212, 234, 192, 76, 217, + 91, 212, 234, 101, 217, 91, 212, 234, 104, 217, 91, 212, 234, 133, 217, + 91, 212, 234, 134, 217, 91, 212, 234, 151, 217, 91, 212, 234, 170, 217, + 91, 212, 234, 179, 217, 91, 212, 234, 174, 217, 91, 212, 234, 182, 217, + 91, 212, 234, 200, 30, 217, 91, 212, 234, 234, 111, 217, 91, 212, 234, + 197, 244, 217, 91, 212, 234, 199, 186, 217, 91, 212, 234, 232, 113, 217, + 91, 212, 234, 233, 7, 217, 91, 212, 234, 203, 35, 217, 91, 212, 234, 204, + 143, 217, 91, 212, 234, 234, 145, 217, 91, 212, 234, 214, 13, 216, 45, + 39, 234, 189, 236, 234, 39, 229, 228, 234, 189, 236, 234, 39, 228, 167, + 234, 189, 236, 234, 39, 234, 188, 229, 229, 236, 234, 39, 234, 188, 228, + 166, 236, 234, 39, 234, 189, 200, 2, 39, 246, 137, 200, 2, 39, 232, 71, + 242, 130, 200, 2, 39, 216, 108, 200, 2, 39, 248, 184, 200, 2, 39, 222, + 45, 202, 236, 200, 2, 39, 238, 244, 200, 2, 39, 250, 56, 200, 2, 39, 211, + 169, 200, 2, 39, 247, 158, 211, 125, 200, 2, 39, 237, 97, 211, 164, 236, + 185, 200, 2, 39, 236, 182, 200, 2, 39, 192, 226, 200, 2, 39, 223, 181, + 200, 2, 39, 210, 152, 200, 2, 39, 208, 2, 200, 2, 39, 239, 0, 200, 2, 39, + 229, 26, 248, 252, 200, 2, 39, 194, 155, 200, 2, 39, 232, 159, 200, 2, + 39, 251, 111, 200, 2, 39, 207, 212, 200, 2, 39, 207, 184, 200, 2, 39, + 234, 187, 200, 2, 39, 222, 217, 200, 2, 39, 238, 251, 200, 2, 39, 234, + 78, 200, 2, 39, 235, 33, 200, 2, 39, 246, 104, 200, 2, 39, 237, 107, 200, + 2, 39, 28, 207, 183, 200, 2, 39, 211, 68, 200, 2, 39, 220, 14, 200, 2, + 39, 242, 82, 200, 2, 39, 221, 174, 200, 2, 39, 231, 182, 200, 2, 39, 201, + 219, 200, 2, 39, 209, 26, 200, 2, 39, 232, 70, 200, 2, 39, 207, 185, 200, + 2, 39, 220, 55, 211, 164, 216, 81, 200, 2, 39, 207, 181, 200, 2, 39, 230, + 247, 115, 217, 24, 200, 2, 39, 234, 81, 200, 2, 39, 201, 233, 200, 2, 39, + 230, 202, 200, 2, 39, 234, 71, 200, 2, 39, 210, 200, 200, 2, 39, 207, 70, + 200, 2, 39, 232, 185, 200, 2, 39, 196, 132, 211, 164, 194, 133, 200, 2, + 39, 239, 5, 200, 2, 39, 217, 43, 200, 2, 39, 233, 237, 200, 2, 39, 197, + 52, 200, 2, 39, 236, 221, 200, 2, 39, 242, 84, 216, 4, 200, 2, 39, 230, + 178, 200, 2, 39, 231, 183, 223, 190, 200, 2, 39, 217, 103, 200, 2, 39, + 251, 137, 200, 2, 39, 234, 97, 200, 2, 39, 235, 100, 200, 2, 39, 194, + 131, 200, 2, 39, 203, 69, 200, 2, 39, 223, 154, 200, 2, 39, 237, 64, 200, + 2, 39, 237, 189, 200, 2, 39, 236, 217, 200, 2, 39, 233, 201, 200, 2, 39, + 204, 139, 200, 2, 39, 201, 237, 200, 2, 39, 230, 25, 200, 2, 39, 242, 30, + 200, 2, 39, 242, 79, 200, 2, 39, 233, 76, 200, 2, 39, 251, 75, 200, 2, + 39, 242, 29, 200, 2, 39, 211, 212, 199, 225, 196, 108, 200, 2, 39, 236, + 243, 200, 2, 39, 220, 172, 200, 2, 39, 232, 122, 238, 210, 207, 38, 197, + 55, 17, 101, 238, 210, 207, 38, 197, 55, 17, 104, 238, 210, 207, 38, 197, + 55, 17, 133, 238, 210, 207, 38, 197, 55, 17, 134, 238, 210, 207, 38, 197, + 55, 17, 151, 238, 210, 207, 38, 197, 55, 17, 170, 238, 210, 207, 38, 197, + 55, 17, 179, 238, 210, 207, 38, 197, 55, 17, 174, 238, 210, 207, 38, 197, + 55, 17, 182, 238, 210, 207, 38, 200, 26, 17, 101, 238, 210, 207, 38, 200, + 26, 17, 104, 238, 210, 207, 38, 200, 26, 17, 133, 238, 210, 207, 38, 200, + 26, 17, 134, 238, 210, 207, 38, 200, 26, 17, 151, 238, 210, 207, 38, 200, + 26, 17, 170, 238, 210, 207, 38, 200, 26, 17, 179, 238, 210, 207, 38, 200, + 26, 17, 174, 238, 210, 207, 38, 200, 26, 17, 182, 149, 200, 130, 122, + 101, 149, 200, 130, 122, 104, 149, 200, 130, 122, 133, 149, 200, 130, + 122, 134, 149, 200, 130, 122, 151, 200, 130, 122, 101, 200, 130, 122, + 151, 13, 28, 6, 64, 13, 28, 6, 249, 226, 13, 28, 6, 247, 52, 13, 28, 6, + 238, 95, 13, 28, 6, 71, 13, 28, 6, 233, 163, 13, 28, 6, 232, 44, 13, 28, + 6, 230, 124, 13, 28, 6, 70, 13, 28, 6, 223, 65, 13, 28, 6, 222, 184, 13, + 28, 6, 165, 13, 28, 6, 218, 236, 13, 28, 6, 215, 151, 13, 28, 6, 74, 13, + 28, 6, 211, 93, 13, 28, 6, 208, 247, 13, 28, 6, 150, 13, 28, 6, 206, 158, + 13, 28, 6, 200, 228, 13, 28, 6, 68, 13, 28, 6, 196, 236, 13, 28, 6, 194, + 202, 13, 28, 6, 193, 223, 13, 28, 6, 193, 148, 13, 28, 6, 192, 155, 13, + 28, 2, 64, 13, 28, 2, 249, 226, 13, 28, 2, 247, 52, 13, 28, 2, 238, 95, + 13, 28, 2, 71, 13, 28, 2, 233, 163, 13, 28, 2, 232, 44, 13, 28, 2, 230, + 124, 13, 28, 2, 70, 13, 28, 2, 223, 65, 13, 28, 2, 222, 184, 13, 28, 2, + 165, 13, 28, 2, 218, 236, 13, 28, 2, 215, 151, 13, 28, 2, 74, 13, 28, 2, + 211, 93, 13, 28, 2, 208, 247, 13, 28, 2, 150, 13, 28, 2, 206, 158, 13, + 28, 2, 200, 228, 13, 28, 2, 68, 13, 28, 2, 196, 236, 13, 28, 2, 194, 202, + 13, 28, 2, 193, 223, 13, 28, 2, 193, 148, 13, 28, 2, 192, 155, 13, 43, 6, + 64, 13, 43, 6, 249, 226, 13, 43, 6, 247, 52, 13, 43, 6, 238, 95, 13, 43, + 6, 71, 13, 43, 6, 233, 163, 13, 43, 6, 232, 44, 13, 43, 6, 230, 124, 13, + 43, 6, 70, 13, 43, 6, 223, 65, 13, 43, 6, 222, 184, 13, 43, 6, 165, 13, + 43, 6, 218, 236, 13, 43, 6, 215, 151, 13, 43, 6, 74, 13, 43, 6, 211, 93, + 13, 43, 6, 208, 247, 13, 43, 6, 150, 13, 43, 6, 206, 158, 13, 43, 6, 200, + 228, 13, 43, 6, 68, 13, 43, 6, 196, 236, 13, 43, 6, 194, 202, 13, 43, 6, + 193, 223, 13, 43, 6, 193, 148, 13, 43, 6, 192, 155, 13, 43, 2, 64, 13, + 43, 2, 249, 226, 13, 43, 2, 247, 52, 13, 43, 2, 238, 95, 13, 43, 2, 71, + 13, 43, 2, 233, 163, 13, 43, 2, 232, 44, 13, 43, 2, 70, 13, 43, 2, 223, + 65, 13, 43, 2, 222, 184, 13, 43, 2, 165, 13, 43, 2, 218, 236, 13, 43, 2, + 215, 151, 13, 43, 2, 74, 13, 43, 2, 211, 93, 13, 43, 2, 208, 247, 13, 43, + 2, 150, 13, 43, 2, 206, 158, 13, 43, 2, 200, 228, 13, 43, 2, 68, 13, 43, + 2, 196, 236, 13, 43, 2, 194, 202, 13, 43, 2, 193, 223, 13, 43, 2, 193, + 148, 13, 43, 2, 192, 155, 13, 28, 43, 6, 64, 13, 28, 43, 6, 249, 226, 13, + 28, 43, 6, 247, 52, 13, 28, 43, 6, 238, 95, 13, 28, 43, 6, 71, 13, 28, + 43, 6, 233, 163, 13, 28, 43, 6, 232, 44, 13, 28, 43, 6, 230, 124, 13, 28, + 43, 6, 70, 13, 28, 43, 6, 223, 65, 13, 28, 43, 6, 222, 184, 13, 28, 43, + 6, 165, 13, 28, 43, 6, 218, 236, 13, 28, 43, 6, 215, 151, 13, 28, 43, 6, + 74, 13, 28, 43, 6, 211, 93, 13, 28, 43, 6, 208, 247, 13, 28, 43, 6, 150, + 13, 28, 43, 6, 206, 158, 13, 28, 43, 6, 200, 228, 13, 28, 43, 6, 68, 13, + 28, 43, 6, 196, 236, 13, 28, 43, 6, 194, 202, 13, 28, 43, 6, 193, 223, + 13, 28, 43, 6, 193, 148, 13, 28, 43, 6, 192, 155, 13, 28, 43, 2, 64, 13, + 28, 43, 2, 249, 226, 13, 28, 43, 2, 247, 52, 13, 28, 43, 2, 238, 95, 13, + 28, 43, 2, 71, 13, 28, 43, 2, 233, 163, 13, 28, 43, 2, 232, 44, 13, 28, + 43, 2, 230, 124, 13, 28, 43, 2, 70, 13, 28, 43, 2, 223, 65, 13, 28, 43, + 2, 222, 184, 13, 28, 43, 2, 165, 13, 28, 43, 2, 218, 236, 13, 28, 43, 2, + 215, 151, 13, 28, 43, 2, 74, 13, 28, 43, 2, 211, 93, 13, 28, 43, 2, 208, + 247, 13, 28, 43, 2, 150, 13, 28, 43, 2, 206, 158, 13, 28, 43, 2, 200, + 228, 13, 28, 43, 2, 68, 13, 28, 43, 2, 196, 236, 13, 28, 43, 2, 194, 202, + 13, 28, 43, 2, 193, 223, 13, 28, 43, 2, 193, 148, 13, 28, 43, 2, 192, + 155, 13, 27, 6, 64, 13, 27, 6, 247, 52, 13, 27, 6, 238, 95, 13, 27, 6, + 232, 44, 13, 27, 6, 223, 65, 13, 27, 6, 222, 184, 13, 27, 6, 215, 151, + 13, 27, 6, 74, 13, 27, 6, 211, 93, 13, 27, 6, 208, 247, 13, 27, 6, 206, + 158, 13, 27, 6, 200, 228, 13, 27, 6, 68, 13, 27, 6, 196, 236, 13, 27, 6, + 194, 202, 13, 27, 6, 193, 223, 13, 27, 6, 193, 148, 13, 27, 6, 192, 155, + 13, 27, 2, 64, 13, 27, 2, 249, 226, 13, 27, 2, 247, 52, 13, 27, 2, 238, + 95, 13, 27, 2, 233, 163, 13, 27, 2, 230, 124, 13, 27, 2, 70, 13, 27, 2, + 223, 65, 13, 27, 2, 222, 184, 13, 27, 2, 165, 13, 27, 2, 218, 236, 13, + 27, 2, 215, 151, 13, 27, 2, 211, 93, 13, 27, 2, 208, 247, 13, 27, 2, 150, + 13, 27, 2, 206, 158, 13, 27, 2, 200, 228, 13, 27, 2, 68, 13, 27, 2, 196, + 236, 13, 27, 2, 194, 202, 13, 27, 2, 193, 223, 13, 27, 2, 193, 148, 13, + 27, 2, 192, 155, 13, 28, 27, 6, 64, 13, 28, 27, 6, 249, 226, 13, 28, 27, + 6, 247, 52, 13, 28, 27, 6, 238, 95, 13, 28, 27, 6, 71, 13, 28, 27, 6, + 233, 163, 13, 28, 27, 6, 232, 44, 13, 28, 27, 6, 230, 124, 13, 28, 27, 6, + 70, 13, 28, 27, 6, 223, 65, 13, 28, 27, 6, 222, 184, 13, 28, 27, 6, 165, + 13, 28, 27, 6, 218, 236, 13, 28, 27, 6, 215, 151, 13, 28, 27, 6, 74, 13, + 28, 27, 6, 211, 93, 13, 28, 27, 6, 208, 247, 13, 28, 27, 6, 150, 13, 28, + 27, 6, 206, 158, 13, 28, 27, 6, 200, 228, 13, 28, 27, 6, 68, 13, 28, 27, + 6, 196, 236, 13, 28, 27, 6, 194, 202, 13, 28, 27, 6, 193, 223, 13, 28, + 27, 6, 193, 148, 13, 28, 27, 6, 192, 155, 13, 28, 27, 2, 64, 13, 28, 27, + 2, 249, 226, 13, 28, 27, 2, 247, 52, 13, 28, 27, 2, 238, 95, 13, 28, 27, + 2, 71, 13, 28, 27, 2, 233, 163, 13, 28, 27, 2, 232, 44, 13, 28, 27, 2, + 230, 124, 13, 28, 27, 2, 70, 13, 28, 27, 2, 223, 65, 13, 28, 27, 2, 222, + 184, 13, 28, 27, 2, 165, 13, 28, 27, 2, 218, 236, 13, 28, 27, 2, 215, + 151, 13, 28, 27, 2, 74, 13, 28, 27, 2, 211, 93, 13, 28, 27, 2, 208, 247, + 13, 28, 27, 2, 150, 13, 28, 27, 2, 206, 158, 13, 28, 27, 2, 200, 228, 13, + 28, 27, 2, 68, 13, 28, 27, 2, 196, 236, 13, 28, 27, 2, 194, 202, 13, 28, + 27, 2, 193, 223, 13, 28, 27, 2, 193, 148, 13, 28, 27, 2, 192, 155, 13, + 232, 106, 6, 64, 13, 232, 106, 6, 249, 226, 13, 232, 106, 6, 238, 95, 13, + 232, 106, 6, 71, 13, 232, 106, 6, 233, 163, 13, 232, 106, 6, 232, 44, 13, + 232, 106, 6, 223, 65, 13, 232, 106, 6, 222, 184, 13, 232, 106, 6, 165, + 13, 232, 106, 6, 218, 236, 13, 232, 106, 6, 215, 151, 13, 232, 106, 6, + 74, 13, 232, 106, 6, 211, 93, 13, 232, 106, 6, 208, 247, 13, 232, 106, 6, + 206, 158, 13, 232, 106, 6, 200, 228, 13, 232, 106, 6, 68, 13, 232, 106, + 6, 196, 236, 13, 232, 106, 6, 194, 202, 13, 232, 106, 6, 193, 223, 13, + 232, 106, 6, 193, 148, 13, 232, 106, 2, 64, 13, 232, 106, 2, 249, 226, + 13, 232, 106, 2, 247, 52, 13, 232, 106, 2, 238, 95, 13, 232, 106, 2, 71, + 13, 232, 106, 2, 233, 163, 13, 232, 106, 2, 232, 44, 13, 232, 106, 2, + 230, 124, 13, 232, 106, 2, 70, 13, 232, 106, 2, 223, 65, 13, 232, 106, 2, + 222, 184, 13, 232, 106, 2, 165, 13, 232, 106, 2, 218, 236, 13, 232, 106, + 2, 215, 151, 13, 232, 106, 2, 74, 13, 232, 106, 2, 211, 93, 13, 232, 106, + 2, 208, 247, 13, 232, 106, 2, 150, 13, 232, 106, 2, 206, 158, 13, 232, + 106, 2, 200, 228, 13, 232, 106, 2, 68, 13, 232, 106, 2, 196, 236, 13, + 232, 106, 2, 194, 202, 13, 232, 106, 2, 193, 223, 13, 232, 106, 2, 193, + 148, 13, 232, 106, 2, 192, 155, 13, 235, 102, 6, 64, 13, 235, 102, 6, + 249, 226, 13, 235, 102, 6, 238, 95, 13, 235, 102, 6, 71, 13, 235, 102, 6, + 233, 163, 13, 235, 102, 6, 232, 44, 13, 235, 102, 6, 70, 13, 235, 102, 6, + 223, 65, 13, 235, 102, 6, 222, 184, 13, 235, 102, 6, 165, 13, 235, 102, + 6, 218, 236, 13, 235, 102, 6, 74, 13, 235, 102, 6, 206, 158, 13, 235, + 102, 6, 200, 228, 13, 235, 102, 6, 68, 13, 235, 102, 6, 196, 236, 13, + 235, 102, 6, 194, 202, 13, 235, 102, 6, 193, 223, 13, 235, 102, 6, 193, + 148, 13, 235, 102, 2, 64, 13, 235, 102, 2, 249, 226, 13, 235, 102, 2, + 247, 52, 13, 235, 102, 2, 238, 95, 13, 235, 102, 2, 71, 13, 235, 102, 2, + 233, 163, 13, 235, 102, 2, 232, 44, 13, 235, 102, 2, 230, 124, 13, 235, + 102, 2, 70, 13, 235, 102, 2, 223, 65, 13, 235, 102, 2, 222, 184, 13, 235, + 102, 2, 165, 13, 235, 102, 2, 218, 236, 13, 235, 102, 2, 215, 151, 13, + 235, 102, 2, 74, 13, 235, 102, 2, 211, 93, 13, 235, 102, 2, 208, 247, 13, + 235, 102, 2, 150, 13, 235, 102, 2, 206, 158, 13, 235, 102, 2, 200, 228, + 13, 235, 102, 2, 68, 13, 235, 102, 2, 196, 236, 13, 235, 102, 2, 194, + 202, 13, 235, 102, 2, 193, 223, 13, 235, 102, 2, 193, 148, 13, 235, 102, + 2, 192, 155, 13, 28, 232, 106, 6, 64, 13, 28, 232, 106, 6, 249, 226, 13, + 28, 232, 106, 6, 247, 52, 13, 28, 232, 106, 6, 238, 95, 13, 28, 232, 106, + 6, 71, 13, 28, 232, 106, 6, 233, 163, 13, 28, 232, 106, 6, 232, 44, 13, + 28, 232, 106, 6, 230, 124, 13, 28, 232, 106, 6, 70, 13, 28, 232, 106, 6, + 223, 65, 13, 28, 232, 106, 6, 222, 184, 13, 28, 232, 106, 6, 165, 13, 28, + 232, 106, 6, 218, 236, 13, 28, 232, 106, 6, 215, 151, 13, 28, 232, 106, + 6, 74, 13, 28, 232, 106, 6, 211, 93, 13, 28, 232, 106, 6, 208, 247, 13, + 28, 232, 106, 6, 150, 13, 28, 232, 106, 6, 206, 158, 13, 28, 232, 106, 6, + 200, 228, 13, 28, 232, 106, 6, 68, 13, 28, 232, 106, 6, 196, 236, 13, 28, + 232, 106, 6, 194, 202, 13, 28, 232, 106, 6, 193, 223, 13, 28, 232, 106, + 6, 193, 148, 13, 28, 232, 106, 6, 192, 155, 13, 28, 232, 106, 2, 64, 13, + 28, 232, 106, 2, 249, 226, 13, 28, 232, 106, 2, 247, 52, 13, 28, 232, + 106, 2, 238, 95, 13, 28, 232, 106, 2, 71, 13, 28, 232, 106, 2, 233, 163, + 13, 28, 232, 106, 2, 232, 44, 13, 28, 232, 106, 2, 230, 124, 13, 28, 232, + 106, 2, 70, 13, 28, 232, 106, 2, 223, 65, 13, 28, 232, 106, 2, 222, 184, + 13, 28, 232, 106, 2, 165, 13, 28, 232, 106, 2, 218, 236, 13, 28, 232, + 106, 2, 215, 151, 13, 28, 232, 106, 2, 74, 13, 28, 232, 106, 2, 211, 93, + 13, 28, 232, 106, 2, 208, 247, 13, 28, 232, 106, 2, 150, 13, 28, 232, + 106, 2, 206, 158, 13, 28, 232, 106, 2, 200, 228, 13, 28, 232, 106, 2, 68, + 13, 28, 232, 106, 2, 196, 236, 13, 28, 232, 106, 2, 194, 202, 13, 28, + 232, 106, 2, 193, 223, 13, 28, 232, 106, 2, 193, 148, 13, 28, 232, 106, + 2, 192, 155, 13, 49, 6, 64, 13, 49, 6, 249, 226, 13, 49, 6, 247, 52, 13, + 49, 6, 238, 95, 13, 49, 6, 71, 13, 49, 6, 233, 163, 13, 49, 6, 232, 44, + 13, 49, 6, 230, 124, 13, 49, 6, 70, 13, 49, 6, 223, 65, 13, 49, 6, 222, + 184, 13, 49, 6, 165, 13, 49, 6, 218, 236, 13, 49, 6, 215, 151, 13, 49, 6, + 74, 13, 49, 6, 211, 93, 13, 49, 6, 208, 247, 13, 49, 6, 150, 13, 49, 6, + 206, 158, 13, 49, 6, 200, 228, 13, 49, 6, 68, 13, 49, 6, 196, 236, 13, + 49, 6, 194, 202, 13, 49, 6, 193, 223, 13, 49, 6, 193, 148, 13, 49, 6, + 192, 155, 13, 49, 2, 64, 13, 49, 2, 249, 226, 13, 49, 2, 247, 52, 13, 49, + 2, 238, 95, 13, 49, 2, 71, 13, 49, 2, 233, 163, 13, 49, 2, 232, 44, 13, + 49, 2, 230, 124, 13, 49, 2, 70, 13, 49, 2, 223, 65, 13, 49, 2, 222, 184, + 13, 49, 2, 165, 13, 49, 2, 218, 236, 13, 49, 2, 215, 151, 13, 49, 2, 74, + 13, 49, 2, 211, 93, 13, 49, 2, 208, 247, 13, 49, 2, 150, 13, 49, 2, 206, + 158, 13, 49, 2, 200, 228, 13, 49, 2, 68, 13, 49, 2, 196, 236, 13, 49, 2, + 194, 202, 13, 49, 2, 193, 223, 13, 49, 2, 193, 148, 13, 49, 2, 192, 155, + 13, 49, 28, 6, 64, 13, 49, 28, 6, 249, 226, 13, 49, 28, 6, 247, 52, 13, + 49, 28, 6, 238, 95, 13, 49, 28, 6, 71, 13, 49, 28, 6, 233, 163, 13, 49, + 28, 6, 232, 44, 13, 49, 28, 6, 230, 124, 13, 49, 28, 6, 70, 13, 49, 28, + 6, 223, 65, 13, 49, 28, 6, 222, 184, 13, 49, 28, 6, 165, 13, 49, 28, 6, + 218, 236, 13, 49, 28, 6, 215, 151, 13, 49, 28, 6, 74, 13, 49, 28, 6, 211, + 93, 13, 49, 28, 6, 208, 247, 13, 49, 28, 6, 150, 13, 49, 28, 6, 206, 158, + 13, 49, 28, 6, 200, 228, 13, 49, 28, 6, 68, 13, 49, 28, 6, 196, 236, 13, + 49, 28, 6, 194, 202, 13, 49, 28, 6, 193, 223, 13, 49, 28, 6, 193, 148, + 13, 49, 28, 6, 192, 155, 13, 49, 28, 2, 64, 13, 49, 28, 2, 249, 226, 13, + 49, 28, 2, 247, 52, 13, 49, 28, 2, 238, 95, 13, 49, 28, 2, 71, 13, 49, + 28, 2, 233, 163, 13, 49, 28, 2, 232, 44, 13, 49, 28, 2, 230, 124, 13, 49, + 28, 2, 70, 13, 49, 28, 2, 223, 65, 13, 49, 28, 2, 222, 184, 13, 49, 28, + 2, 165, 13, 49, 28, 2, 218, 236, 13, 49, 28, 2, 215, 151, 13, 49, 28, 2, + 74, 13, 49, 28, 2, 211, 93, 13, 49, 28, 2, 208, 247, 13, 49, 28, 2, 150, + 13, 49, 28, 2, 206, 158, 13, 49, 28, 2, 200, 228, 13, 49, 28, 2, 68, 13, + 49, 28, 2, 196, 236, 13, 49, 28, 2, 194, 202, 13, 49, 28, 2, 193, 223, + 13, 49, 28, 2, 193, 148, 13, 49, 28, 2, 192, 155, 13, 49, 43, 6, 64, 13, + 49, 43, 6, 249, 226, 13, 49, 43, 6, 247, 52, 13, 49, 43, 6, 238, 95, 13, + 49, 43, 6, 71, 13, 49, 43, 6, 233, 163, 13, 49, 43, 6, 232, 44, 13, 49, + 43, 6, 230, 124, 13, 49, 43, 6, 70, 13, 49, 43, 6, 223, 65, 13, 49, 43, + 6, 222, 184, 13, 49, 43, 6, 165, 13, 49, 43, 6, 218, 236, 13, 49, 43, 6, + 215, 151, 13, 49, 43, 6, 74, 13, 49, 43, 6, 211, 93, 13, 49, 43, 6, 208, + 247, 13, 49, 43, 6, 150, 13, 49, 43, 6, 206, 158, 13, 49, 43, 6, 200, + 228, 13, 49, 43, 6, 68, 13, 49, 43, 6, 196, 236, 13, 49, 43, 6, 194, 202, + 13, 49, 43, 6, 193, 223, 13, 49, 43, 6, 193, 148, 13, 49, 43, 6, 192, + 155, 13, 49, 43, 2, 64, 13, 49, 43, 2, 249, 226, 13, 49, 43, 2, 247, 52, + 13, 49, 43, 2, 238, 95, 13, 49, 43, 2, 71, 13, 49, 43, 2, 233, 163, 13, + 49, 43, 2, 232, 44, 13, 49, 43, 2, 230, 124, 13, 49, 43, 2, 70, 13, 49, + 43, 2, 223, 65, 13, 49, 43, 2, 222, 184, 13, 49, 43, 2, 165, 13, 49, 43, + 2, 218, 236, 13, 49, 43, 2, 215, 151, 13, 49, 43, 2, 74, 13, 49, 43, 2, + 211, 93, 13, 49, 43, 2, 208, 247, 13, 49, 43, 2, 150, 13, 49, 43, 2, 206, + 158, 13, 49, 43, 2, 200, 228, 13, 49, 43, 2, 68, 13, 49, 43, 2, 196, 236, + 13, 49, 43, 2, 194, 202, 13, 49, 43, 2, 193, 223, 13, 49, 43, 2, 193, + 148, 13, 49, 43, 2, 192, 155, 13, 49, 28, 43, 6, 64, 13, 49, 28, 43, 6, + 249, 226, 13, 49, 28, 43, 6, 247, 52, 13, 49, 28, 43, 6, 238, 95, 13, 49, + 28, 43, 6, 71, 13, 49, 28, 43, 6, 233, 163, 13, 49, 28, 43, 6, 232, 44, + 13, 49, 28, 43, 6, 230, 124, 13, 49, 28, 43, 6, 70, 13, 49, 28, 43, 6, + 223, 65, 13, 49, 28, 43, 6, 222, 184, 13, 49, 28, 43, 6, 165, 13, 49, 28, + 43, 6, 218, 236, 13, 49, 28, 43, 6, 215, 151, 13, 49, 28, 43, 6, 74, 13, + 49, 28, 43, 6, 211, 93, 13, 49, 28, 43, 6, 208, 247, 13, 49, 28, 43, 6, + 150, 13, 49, 28, 43, 6, 206, 158, 13, 49, 28, 43, 6, 200, 228, 13, 49, + 28, 43, 6, 68, 13, 49, 28, 43, 6, 196, 236, 13, 49, 28, 43, 6, 194, 202, + 13, 49, 28, 43, 6, 193, 223, 13, 49, 28, 43, 6, 193, 148, 13, 49, 28, 43, + 6, 192, 155, 13, 49, 28, 43, 2, 64, 13, 49, 28, 43, 2, 249, 226, 13, 49, + 28, 43, 2, 247, 52, 13, 49, 28, 43, 2, 238, 95, 13, 49, 28, 43, 2, 71, + 13, 49, 28, 43, 2, 233, 163, 13, 49, 28, 43, 2, 232, 44, 13, 49, 28, 43, + 2, 230, 124, 13, 49, 28, 43, 2, 70, 13, 49, 28, 43, 2, 223, 65, 13, 49, + 28, 43, 2, 222, 184, 13, 49, 28, 43, 2, 165, 13, 49, 28, 43, 2, 218, 236, + 13, 49, 28, 43, 2, 215, 151, 13, 49, 28, 43, 2, 74, 13, 49, 28, 43, 2, + 211, 93, 13, 49, 28, 43, 2, 208, 247, 13, 49, 28, 43, 2, 150, 13, 49, 28, + 43, 2, 206, 158, 13, 49, 28, 43, 2, 200, 228, 13, 49, 28, 43, 2, 68, 13, + 49, 28, 43, 2, 196, 236, 13, 49, 28, 43, 2, 194, 202, 13, 49, 28, 43, 2, + 193, 223, 13, 49, 28, 43, 2, 193, 148, 13, 49, 28, 43, 2, 192, 155, 13, + 216, 41, 6, 64, 13, 216, 41, 6, 249, 226, 13, 216, 41, 6, 247, 52, 13, + 216, 41, 6, 238, 95, 13, 216, 41, 6, 71, 13, 216, 41, 6, 233, 163, 13, + 216, 41, 6, 232, 44, 13, 216, 41, 6, 230, 124, 13, 216, 41, 6, 70, 13, + 216, 41, 6, 223, 65, 13, 216, 41, 6, 222, 184, 13, 216, 41, 6, 165, 13, + 216, 41, 6, 218, 236, 13, 216, 41, 6, 215, 151, 13, 216, 41, 6, 74, 13, + 216, 41, 6, 211, 93, 13, 216, 41, 6, 208, 247, 13, 216, 41, 6, 150, 13, + 216, 41, 6, 206, 158, 13, 216, 41, 6, 200, 228, 13, 216, 41, 6, 68, 13, + 216, 41, 6, 196, 236, 13, 216, 41, 6, 194, 202, 13, 216, 41, 6, 193, 223, + 13, 216, 41, 6, 193, 148, 13, 216, 41, 6, 192, 155, 13, 216, 41, 2, 64, + 13, 216, 41, 2, 249, 226, 13, 216, 41, 2, 247, 52, 13, 216, 41, 2, 238, + 95, 13, 216, 41, 2, 71, 13, 216, 41, 2, 233, 163, 13, 216, 41, 2, 232, + 44, 13, 216, 41, 2, 230, 124, 13, 216, 41, 2, 70, 13, 216, 41, 2, 223, + 65, 13, 216, 41, 2, 222, 184, 13, 216, 41, 2, 165, 13, 216, 41, 2, 218, + 236, 13, 216, 41, 2, 215, 151, 13, 216, 41, 2, 74, 13, 216, 41, 2, 211, + 93, 13, 216, 41, 2, 208, 247, 13, 216, 41, 2, 150, 13, 216, 41, 2, 206, + 158, 13, 216, 41, 2, 200, 228, 13, 216, 41, 2, 68, 13, 216, 41, 2, 196, + 236, 13, 216, 41, 2, 194, 202, 13, 216, 41, 2, 193, 223, 13, 216, 41, 2, + 193, 148, 13, 216, 41, 2, 192, 155, 13, 43, 2, 236, 113, 70, 13, 43, 2, + 236, 113, 223, 65, 13, 28, 6, 250, 252, 13, 28, 6, 248, 63, 13, 28, 6, + 231, 204, 13, 28, 6, 237, 76, 13, 28, 6, 234, 32, 13, 28, 6, 192, 75, 13, + 28, 6, 233, 240, 13, 28, 6, 199, 206, 13, 28, 6, 223, 111, 13, 28, 6, + 222, 106, 13, 28, 6, 220, 90, 13, 28, 6, 215, 241, 13, 28, 6, 213, 22, + 13, 28, 6, 193, 196, 13, 28, 6, 211, 214, 13, 28, 6, 210, 51, 13, 28, 6, + 207, 153, 13, 28, 6, 199, 207, 109, 13, 28, 6, 203, 99, 13, 28, 6, 200, + 100, 13, 28, 6, 197, 34, 13, 28, 6, 210, 77, 13, 28, 6, 242, 215, 13, 28, + 6, 209, 62, 13, 28, 6, 211, 216, 13, 28, 215, 79, 13, 28, 2, 250, 252, + 13, 28, 2, 248, 63, 13, 28, 2, 231, 204, 13, 28, 2, 237, 76, 13, 28, 2, + 234, 32, 13, 28, 2, 192, 75, 13, 28, 2, 233, 240, 13, 28, 2, 199, 206, + 13, 28, 2, 223, 111, 13, 28, 2, 222, 106, 13, 28, 2, 220, 90, 13, 28, 2, + 215, 241, 13, 28, 2, 213, 22, 13, 28, 2, 193, 196, 13, 28, 2, 211, 214, + 13, 28, 2, 210, 51, 13, 28, 2, 207, 153, 13, 28, 2, 52, 203, 99, 13, 28, + 2, 203, 99, 13, 28, 2, 200, 100, 13, 28, 2, 197, 34, 13, 28, 2, 210, 77, + 13, 28, 2, 242, 215, 13, 28, 2, 209, 62, 13, 28, 2, 211, 216, 13, 28, + 210, 222, 236, 244, 13, 28, 234, 33, 109, 13, 28, 199, 207, 109, 13, 28, + 222, 107, 109, 13, 28, 210, 78, 109, 13, 28, 207, 154, 109, 13, 28, 210, + 52, 109, 13, 43, 6, 250, 252, 13, 43, 6, 248, 63, 13, 43, 6, 231, 204, + 13, 43, 6, 237, 76, 13, 43, 6, 234, 32, 13, 43, 6, 192, 75, 13, 43, 6, + 233, 240, 13, 43, 6, 199, 206, 13, 43, 6, 223, 111, 13, 43, 6, 222, 106, + 13, 43, 6, 220, 90, 13, 43, 6, 215, 241, 13, 43, 6, 213, 22, 13, 43, 6, + 193, 196, 13, 43, 6, 211, 214, 13, 43, 6, 210, 51, 13, 43, 6, 207, 153, + 13, 43, 6, 199, 207, 109, 13, 43, 6, 203, 99, 13, 43, 6, 200, 100, 13, + 43, 6, 197, 34, 13, 43, 6, 210, 77, 13, 43, 6, 242, 215, 13, 43, 6, 209, + 62, 13, 43, 6, 211, 216, 13, 43, 215, 79, 13, 43, 2, 250, 252, 13, 43, 2, + 248, 63, 13, 43, 2, 231, 204, 13, 43, 2, 237, 76, 13, 43, 2, 234, 32, 13, + 43, 2, 192, 75, 13, 43, 2, 233, 240, 13, 43, 2, 199, 206, 13, 43, 2, 223, + 111, 13, 43, 2, 222, 106, 13, 43, 2, 220, 90, 13, 43, 2, 215, 241, 13, + 43, 2, 213, 22, 13, 43, 2, 193, 196, 13, 43, 2, 211, 214, 13, 43, 2, 210, + 51, 13, 43, 2, 207, 153, 13, 43, 2, 52, 203, 99, 13, 43, 2, 203, 99, 13, + 43, 2, 200, 100, 13, 43, 2, 197, 34, 13, 43, 2, 210, 77, 13, 43, 2, 242, + 215, 13, 43, 2, 209, 62, 13, 43, 2, 211, 216, 13, 43, 210, 222, 236, 244, + 13, 43, 234, 33, 109, 13, 43, 199, 207, 109, 13, 43, 222, 107, 109, 13, + 43, 210, 78, 109, 13, 43, 207, 154, 109, 13, 43, 210, 52, 109, 13, 28, + 43, 6, 250, 252, 13, 28, 43, 6, 248, 63, 13, 28, 43, 6, 231, 204, 13, 28, + 43, 6, 237, 76, 13, 28, 43, 6, 234, 32, 13, 28, 43, 6, 192, 75, 13, 28, + 43, 6, 233, 240, 13, 28, 43, 6, 199, 206, 13, 28, 43, 6, 223, 111, 13, + 28, 43, 6, 222, 106, 13, 28, 43, 6, 220, 90, 13, 28, 43, 6, 215, 241, 13, + 28, 43, 6, 213, 22, 13, 28, 43, 6, 193, 196, 13, 28, 43, 6, 211, 214, 13, + 28, 43, 6, 210, 51, 13, 28, 43, 6, 207, 153, 13, 28, 43, 6, 199, 207, + 109, 13, 28, 43, 6, 203, 99, 13, 28, 43, 6, 200, 100, 13, 28, 43, 6, 197, + 34, 13, 28, 43, 6, 210, 77, 13, 28, 43, 6, 242, 215, 13, 28, 43, 6, 209, + 62, 13, 28, 43, 6, 211, 216, 13, 28, 43, 215, 79, 13, 28, 43, 2, 250, + 252, 13, 28, 43, 2, 248, 63, 13, 28, 43, 2, 231, 204, 13, 28, 43, 2, 237, + 76, 13, 28, 43, 2, 234, 32, 13, 28, 43, 2, 192, 75, 13, 28, 43, 2, 233, + 240, 13, 28, 43, 2, 199, 206, 13, 28, 43, 2, 223, 111, 13, 28, 43, 2, + 222, 106, 13, 28, 43, 2, 220, 90, 13, 28, 43, 2, 215, 241, 13, 28, 43, 2, + 213, 22, 13, 28, 43, 2, 193, 196, 13, 28, 43, 2, 211, 214, 13, 28, 43, 2, + 210, 51, 13, 28, 43, 2, 207, 153, 13, 28, 43, 2, 52, 203, 99, 13, 28, 43, + 2, 203, 99, 13, 28, 43, 2, 200, 100, 13, 28, 43, 2, 197, 34, 13, 28, 43, + 2, 210, 77, 13, 28, 43, 2, 242, 215, 13, 28, 43, 2, 209, 62, 13, 28, 43, + 2, 211, 216, 13, 28, 43, 210, 222, 236, 244, 13, 28, 43, 234, 33, 109, + 13, 28, 43, 199, 207, 109, 13, 28, 43, 222, 107, 109, 13, 28, 43, 210, + 78, 109, 13, 28, 43, 207, 154, 109, 13, 28, 43, 210, 52, 109, 13, 49, 28, + 6, 250, 252, 13, 49, 28, 6, 248, 63, 13, 49, 28, 6, 231, 204, 13, 49, 28, + 6, 237, 76, 13, 49, 28, 6, 234, 32, 13, 49, 28, 6, 192, 75, 13, 49, 28, + 6, 233, 240, 13, 49, 28, 6, 199, 206, 13, 49, 28, 6, 223, 111, 13, 49, + 28, 6, 222, 106, 13, 49, 28, 6, 220, 90, 13, 49, 28, 6, 215, 241, 13, 49, + 28, 6, 213, 22, 13, 49, 28, 6, 193, 196, 13, 49, 28, 6, 211, 214, 13, 49, + 28, 6, 210, 51, 13, 49, 28, 6, 207, 153, 13, 49, 28, 6, 199, 207, 109, + 13, 49, 28, 6, 203, 99, 13, 49, 28, 6, 200, 100, 13, 49, 28, 6, 197, 34, + 13, 49, 28, 6, 210, 77, 13, 49, 28, 6, 242, 215, 13, 49, 28, 6, 209, 62, + 13, 49, 28, 6, 211, 216, 13, 49, 28, 215, 79, 13, 49, 28, 2, 250, 252, + 13, 49, 28, 2, 248, 63, 13, 49, 28, 2, 231, 204, 13, 49, 28, 2, 237, 76, + 13, 49, 28, 2, 234, 32, 13, 49, 28, 2, 192, 75, 13, 49, 28, 2, 233, 240, + 13, 49, 28, 2, 199, 206, 13, 49, 28, 2, 223, 111, 13, 49, 28, 2, 222, + 106, 13, 49, 28, 2, 220, 90, 13, 49, 28, 2, 215, 241, 13, 49, 28, 2, 213, + 22, 13, 49, 28, 2, 193, 196, 13, 49, 28, 2, 211, 214, 13, 49, 28, 2, 210, + 51, 13, 49, 28, 2, 207, 153, 13, 49, 28, 2, 52, 203, 99, 13, 49, 28, 2, + 203, 99, 13, 49, 28, 2, 200, 100, 13, 49, 28, 2, 197, 34, 13, 49, 28, 2, + 210, 77, 13, 49, 28, 2, 242, 215, 13, 49, 28, 2, 209, 62, 13, 49, 28, 2, + 211, 216, 13, 49, 28, 210, 222, 236, 244, 13, 49, 28, 234, 33, 109, 13, + 49, 28, 199, 207, 109, 13, 49, 28, 222, 107, 109, 13, 49, 28, 210, 78, + 109, 13, 49, 28, 207, 154, 109, 13, 49, 28, 210, 52, 109, 13, 49, 28, 43, + 6, 250, 252, 13, 49, 28, 43, 6, 248, 63, 13, 49, 28, 43, 6, 231, 204, 13, + 49, 28, 43, 6, 237, 76, 13, 49, 28, 43, 6, 234, 32, 13, 49, 28, 43, 6, + 192, 75, 13, 49, 28, 43, 6, 233, 240, 13, 49, 28, 43, 6, 199, 206, 13, + 49, 28, 43, 6, 223, 111, 13, 49, 28, 43, 6, 222, 106, 13, 49, 28, 43, 6, + 220, 90, 13, 49, 28, 43, 6, 215, 241, 13, 49, 28, 43, 6, 213, 22, 13, 49, + 28, 43, 6, 193, 196, 13, 49, 28, 43, 6, 211, 214, 13, 49, 28, 43, 6, 210, + 51, 13, 49, 28, 43, 6, 207, 153, 13, 49, 28, 43, 6, 199, 207, 109, 13, + 49, 28, 43, 6, 203, 99, 13, 49, 28, 43, 6, 200, 100, 13, 49, 28, 43, 6, + 197, 34, 13, 49, 28, 43, 6, 210, 77, 13, 49, 28, 43, 6, 242, 215, 13, 49, + 28, 43, 6, 209, 62, 13, 49, 28, 43, 6, 211, 216, 13, 49, 28, 43, 215, 79, + 13, 49, 28, 43, 2, 250, 252, 13, 49, 28, 43, 2, 248, 63, 13, 49, 28, 43, + 2, 231, 204, 13, 49, 28, 43, 2, 237, 76, 13, 49, 28, 43, 2, 234, 32, 13, + 49, 28, 43, 2, 192, 75, 13, 49, 28, 43, 2, 233, 240, 13, 49, 28, 43, 2, + 199, 206, 13, 49, 28, 43, 2, 223, 111, 13, 49, 28, 43, 2, 222, 106, 13, + 49, 28, 43, 2, 220, 90, 13, 49, 28, 43, 2, 215, 241, 13, 49, 28, 43, 2, + 213, 22, 13, 49, 28, 43, 2, 193, 196, 13, 49, 28, 43, 2, 211, 214, 13, + 49, 28, 43, 2, 210, 51, 13, 49, 28, 43, 2, 207, 153, 13, 49, 28, 43, 2, + 52, 203, 99, 13, 49, 28, 43, 2, 203, 99, 13, 49, 28, 43, 2, 200, 100, 13, + 49, 28, 43, 2, 197, 34, 13, 49, 28, 43, 2, 210, 77, 13, 49, 28, 43, 2, + 242, 215, 13, 49, 28, 43, 2, 209, 62, 13, 49, 28, 43, 2, 211, 216, 13, + 49, 28, 43, 210, 222, 236, 244, 13, 49, 28, 43, 234, 33, 109, 13, 49, 28, + 43, 199, 207, 109, 13, 49, 28, 43, 222, 107, 109, 13, 49, 28, 43, 210, + 78, 109, 13, 49, 28, 43, 207, 154, 109, 13, 49, 28, 43, 210, 52, 109, 13, + 28, 6, 236, 238, 13, 28, 2, 236, 238, 13, 28, 17, 192, 76, 13, 28, 17, + 101, 13, 28, 17, 104, 13, 28, 17, 133, 13, 28, 17, 134, 13, 28, 17, 151, + 13, 28, 17, 170, 13, 28, 17, 179, 13, 28, 17, 174, 13, 28, 17, 182, 13, + 235, 102, 17, 192, 76, 13, 235, 102, 17, 101, 13, 235, 102, 17, 104, 13, + 235, 102, 17, 133, 13, 235, 102, 17, 134, 13, 235, 102, 17, 151, 13, 235, + 102, 17, 170, 13, 235, 102, 17, 179, 13, 235, 102, 17, 174, 13, 235, 102, + 17, 182, 13, 49, 17, 192, 76, 13, 49, 17, 101, 13, 49, 17, 104, 13, 49, + 17, 133, 13, 49, 17, 134, 13, 49, 17, 151, 13, 49, 17, 170, 13, 49, 17, + 179, 13, 49, 17, 174, 13, 49, 17, 182, 13, 49, 28, 17, 192, 76, 13, 49, + 28, 17, 101, 13, 49, 28, 17, 104, 13, 49, 28, 17, 133, 13, 49, 28, 17, + 134, 13, 49, 28, 17, 151, 13, 49, 28, 17, 170, 13, 49, 28, 17, 179, 13, + 49, 28, 17, 174, 13, 49, 28, 17, 182, 13, 216, 41, 17, 192, 76, 13, 216, + 41, 17, 101, 13, 216, 41, 17, 104, 13, 216, 41, 17, 133, 13, 216, 41, 17, + 134, 13, 216, 41, 17, 151, 13, 216, 41, 17, 170, 13, 216, 41, 17, 179, + 13, 216, 41, 17, 174, 13, 216, 41, 17, 182, 23, 146, 223, 176, 23, 230, + 59, 223, 176, 23, 230, 55, 223, 176, 23, 230, 44, 223, 176, 23, 230, 48, + 223, 176, 23, 230, 61, 223, 176, 23, 146, 140, 248, 74, 23, 230, 59, 140, + 248, 74, 23, 146, 171, 197, 69, 140, 248, 74, 23, 146, 140, 208, 39, 221, + 116, 23, 146, 140, 238, 144, 23, 146, 140, 229, 144, 23, 146, 140, 229, + 145, 219, 52, 23, 230, 59, 140, 229, 146, 23, 146, 140, 216, 160, 23, + 230, 59, 140, 216, 160, 23, 146, 140, 85, 248, 74, 23, 146, 140, 85, 208, + 39, 221, 115, 23, 146, 140, 85, 229, 144, 23, 146, 140, 130, 85, 229, + 144, 23, 146, 140, 229, 145, 85, 197, 41, 23, 146, 140, 85, 239, 10, 23, + 146, 140, 85, 239, 11, 140, 248, 74, 23, 146, 140, 85, 239, 11, 85, 248, + 74, 23, 146, 140, 85, 239, 11, 238, 144, 23, 146, 140, 85, 239, 11, 229, + 144, 23, 146, 140, 85, 238, 179, 23, 230, 59, 140, 85, 238, 179, 23, 146, + 85, 248, 75, 136, 223, 176, 23, 146, 140, 248, 75, 136, 216, 160, 23, + 146, 140, 85, 199, 147, 23, 230, 59, 140, 85, 199, 147, 23, 146, 140, 85, + 201, 230, 171, 248, 74, 23, 146, 140, 85, 248, 75, 171, 201, 229, 23, + 146, 140, 85, 171, 248, 74, 23, 146, 140, 85, 229, 145, 202, 115, 171, + 203, 110, 23, 146, 140, 130, 85, 229, 145, 171, 203, 110, 23, 146, 140, + 130, 85, 229, 145, 171, 239, 10, 23, 146, 140, 229, 145, 85, 130, 171, + 203, 110, 23, 146, 140, 85, 130, 202, 115, 171, 232, 123, 23, 146, 140, + 85, 171, 238, 144, 23, 146, 140, 85, 171, 242, 129, 23, 146, 140, 85, + 171, 229, 13, 23, 146, 140, 85, 171, 229, 144, 23, 146, 171, 248, 61, + 140, 85, 201, 229, 23, 146, 140, 85, 239, 11, 171, 203, 110, 23, 146, + 140, 85, 239, 11, 171, 203, 111, 239, 10, 23, 146, 140, 85, 239, 11, 171, + 203, 111, 248, 74, 23, 146, 85, 171, 229, 14, 140, 197, 41, 23, 146, 140, + 171, 229, 14, 85, 197, 41, 23, 146, 140, 85, 239, 11, 229, 145, 171, 203, + 110, 23, 146, 140, 85, 238, 180, 171, 203, 110, 23, 146, 140, 85, 239, + 11, 171, 232, 123, 23, 146, 140, 85, 239, 11, 238, 145, 171, 232, 123, + 23, 146, 85, 171, 238, 145, 140, 197, 41, 23, 146, 140, 171, 238, 145, + 85, 197, 41, 23, 146, 85, 171, 47, 140, 197, 41, 23, 146, 85, 171, 47, + 140, 229, 144, 23, 146, 140, 171, 250, 206, 211, 126, 85, 197, 41, 23, + 146, 140, 171, 250, 206, 223, 191, 85, 197, 41, 23, 146, 140, 171, 47, + 85, 197, 41, 23, 146, 140, 85, 171, 239, 11, 229, 144, 23, 146, 140, 85, + 171, 250, 206, 211, 125, 23, 146, 140, 85, 171, 250, 205, 23, 146, 85, + 171, 250, 206, 211, 126, 140, 197, 41, 23, 146, 85, 171, 250, 206, 211, + 126, 140, 238, 179, 23, 146, 85, 171, 250, 206, 140, 197, 41, 23, 146, + 140, 171, 229, 14, 85, 229, 144, 23, 230, 50, 232, 119, 232, 235, 23, + 230, 50, 232, 119, 232, 236, 248, 74, 23, 230, 50, 232, 119, 232, 236, + 229, 144, 23, 230, 50, 232, 119, 232, 236, 239, 10, 23, 230, 50, 232, + 119, 232, 236, 239, 11, 202, 124, 23, 230, 57, 232, 119, 232, 236, 239, + 10, 23, 146, 232, 119, 232, 236, 239, 11, 248, 74, 23, 230, 48, 232, 119, + 232, 236, 239, 10, 23, 230, 50, 232, 214, 232, 236, 202, 114, 23, 230, + 50, 229, 223, 232, 214, 232, 236, 202, 114, 23, 230, 50, 232, 214, 232, + 236, 202, 115, 232, 119, 248, 74, 23, 230, 50, 229, 223, 232, 214, 232, + 236, 202, 115, 232, 119, 248, 74, 23, 230, 50, 232, 214, 232, 236, 202, + 115, 248, 74, 23, 230, 50, 229, 223, 232, 214, 232, 236, 202, 115, 248, + 74, 23, 230, 50, 232, 214, 232, 236, 202, 115, 171, 232, 123, 23, 230, + 55, 232, 214, 232, 236, 202, 114, 23, 230, 55, 232, 214, 232, 236, 202, + 115, 211, 183, 23, 230, 48, 232, 214, 232, 236, 202, 115, 211, 183, 23, + 230, 44, 232, 214, 232, 236, 202, 114, 23, 230, 50, 232, 214, 232, 236, + 202, 115, 229, 144, 23, 230, 50, 232, 214, 232, 236, 202, 115, 229, 145, + 171, 203, 110, 23, 230, 50, 232, 214, 232, 236, 202, 115, 229, 145, 213, + 143, 199, 147, 23, 230, 49, 23, 230, 50, 248, 61, 211, 41, 233, 83, 23, + 230, 50, 229, 222, 23, 230, 50, 171, 203, 110, 23, 230, 50, 229, 223, + 171, 203, 110, 23, 230, 50, 171, 248, 74, 23, 230, 50, 171, 232, 123, 23, + 230, 50, 202, 125, 140, 171, 203, 110, 23, 230, 50, 202, 125, 246, 137, + 23, 230, 50, 202, 125, 246, 138, 171, 203, 110, 23, 230, 50, 202, 125, + 246, 138, 171, 203, 111, 248, 74, 23, 230, 50, 202, 125, 219, 146, 23, + 230, 56, 23, 230, 57, 171, 203, 110, 23, 230, 57, 213, 143, 199, 147, 23, + 230, 57, 171, 232, 123, 23, 230, 46, 238, 140, 23, 230, 45, 23, 230, 55, + 211, 183, 23, 230, 54, 23, 230, 55, 211, 184, 171, 203, 110, 23, 230, 55, + 171, 203, 110, 23, 230, 55, 211, 184, 213, 143, 199, 147, 23, 230, 55, + 213, 143, 199, 147, 23, 230, 55, 211, 184, 171, 232, 123, 23, 230, 55, + 171, 232, 123, 23, 230, 53, 211, 183, 23, 230, 52, 23, 230, 58, 23, 230, + 43, 23, 230, 44, 171, 203, 110, 23, 230, 44, 213, 143, 199, 147, 23, 230, + 44, 171, 232, 123, 23, 230, 48, 211, 183, 23, 230, 48, 211, 184, 171, + 232, 123, 23, 230, 47, 23, 230, 48, 202, 236, 23, 230, 48, 211, 184, 171, + 203, 110, 23, 230, 48, 171, 203, 110, 23, 230, 48, 211, 184, 213, 143, + 199, 147, 23, 230, 48, 213, 143, 199, 147, 23, 230, 48, 171, 203, 111, + 198, 231, 223, 176, 23, 230, 48, 171, 248, 61, 85, 207, 81, 23, 230, 60, + 23, 146, 140, 85, 207, 81, 23, 230, 59, 140, 85, 207, 81, 23, 230, 48, + 140, 85, 207, 81, 23, 230, 61, 140, 85, 207, 81, 23, 230, 48, 219, 146, + 23, 146, 140, 85, 207, 82, 248, 74, 23, 146, 140, 85, 207, 82, 239, 10, + 23, 230, 48, 140, 85, 207, 82, 239, 10, 23, 146, 219, 147, 235, 96, 23, + 146, 219, 147, 142, 207, 76, 201, 229, 23, 146, 219, 147, 142, 207, 76, + 238, 129, 23, 146, 219, 147, 142, 211, 136, 242, 129, 23, 146, 219, 147, + 197, 41, 23, 146, 171, 197, 69, 219, 147, 197, 41, 23, 230, 59, 219, 147, + 197, 41, 23, 230, 44, 219, 147, 197, 41, 23, 230, 61, 219, 147, 197, 41, + 23, 146, 219, 147, 208, 39, 221, 116, 23, 146, 219, 147, 248, 74, 23, + 146, 219, 147, 198, 232, 199, 147, 23, 146, 219, 147, 199, 147, 23, 230, + 48, 219, 147, 199, 147, 23, 146, 219, 147, 140, 199, 147, 23, 230, 48, + 219, 147, 140, 199, 147, 23, 230, 61, 219, 147, 140, 171, 140, 171, 211, + 125, 23, 230, 61, 219, 147, 140, 171, 140, 199, 147, 23, 146, 219, 147, + 223, 176, 23, 230, 59, 219, 147, 223, 176, 23, 230, 48, 219, 147, 223, + 176, 23, 230, 61, 219, 147, 223, 176, 23, 146, 140, 85, 219, 146, 23, + 230, 59, 140, 85, 219, 146, 23, 230, 48, 140, 85, 219, 146, 23, 230, 48, + 207, 81, 23, 230, 61, 140, 85, 219, 146, 23, 146, 140, 85, 238, 184, 219, + 146, 23, 230, 59, 140, 85, 238, 184, 219, 146, 23, 146, 207, 82, 235, 96, + 23, 230, 48, 207, 82, 142, 140, 171, 229, 15, 216, 160, 23, 230, 61, 207, + 82, 142, 85, 171, 140, 238, 183, 23, 146, 207, 82, 197, 41, 23, 146, 207, + 82, 208, 39, 221, 116, 23, 146, 207, 82, 219, 146, 23, 230, 59, 207, 82, + 219, 146, 23, 230, 44, 207, 82, 219, 146, 23, 230, 61, 207, 82, 219, 146, + 23, 146, 207, 82, 216, 160, 23, 146, 207, 82, 85, 239, 10, 23, 146, 207, + 82, 85, 208, 39, 221, 115, 23, 146, 207, 82, 223, 176, 23, 146, 207, 82, + 199, 147, 23, 230, 46, 207, 82, 199, 147, 23, 146, 140, 207, 82, 219, + 146, 23, 230, 59, 140, 207, 82, 219, 146, 23, 230, 53, 140, 207, 82, 219, + 147, 211, 211, 23, 230, 46, 140, 207, 82, 219, 147, 211, 125, 23, 230, + 46, 140, 207, 82, 219, 147, 223, 190, 23, 230, 46, 140, 207, 82, 219, + 147, 197, 68, 23, 230, 55, 140, 207, 82, 219, 146, 23, 230, 48, 140, 207, + 82, 219, 146, 23, 230, 61, 140, 207, 82, 219, 147, 211, 125, 23, 230, 61, + 140, 207, 82, 219, 146, 23, 146, 85, 235, 96, 23, 230, 48, 216, 160, 23, + 146, 85, 197, 41, 23, 230, 59, 85, 197, 41, 23, 146, 85, 208, 39, 221, + 116, 23, 146, 85, 130, 171, 203, 110, 23, 230, 46, 85, 199, 147, 23, 146, + 85, 171, 219, 146, 23, 146, 85, 219, 146, 23, 146, 85, 207, 82, 219, 146, + 23, 230, 59, 85, 207, 82, 219, 146, 23, 230, 53, 85, 207, 82, 219, 147, + 211, 211, 23, 230, 55, 85, 207, 82, 219, 146, 23, 230, 48, 85, 207, 82, + 219, 146, 23, 230, 61, 85, 207, 82, 219, 147, 211, 125, 23, 230, 61, 85, + 207, 82, 219, 147, 223, 190, 23, 230, 61, 85, 207, 82, 219, 146, 23, 230, + 59, 85, 207, 82, 219, 147, 248, 74, 23, 230, 57, 85, 207, 82, 219, 147, + 239, 10, 23, 230, 57, 85, 207, 82, 219, 147, 239, 11, 203, 110, 23, 230, + 46, 85, 207, 82, 219, 147, 239, 11, 211, 125, 23, 230, 46, 85, 207, 82, + 219, 147, 239, 11, 223, 190, 23, 230, 46, 85, 207, 82, 219, 147, 239, 10, + 23, 230, 48, 140, 229, 144, 23, 146, 140, 171, 203, 110, 23, 230, 48, + 140, 171, 203, 110, 23, 146, 140, 171, 203, 111, 171, 237, 10, 23, 146, + 140, 171, 203, 111, 171, 239, 10, 23, 146, 140, 171, 203, 111, 171, 248, + 74, 23, 146, 140, 171, 203, 111, 140, 248, 74, 23, 146, 140, 171, 203, + 111, 247, 191, 248, 74, 23, 146, 140, 171, 203, 111, 140, 229, 146, 23, + 146, 140, 171, 232, 124, 140, 201, 229, 23, 146, 140, 171, 232, 124, 140, + 248, 74, 23, 146, 140, 171, 128, 23, 146, 140, 171, 238, 140, 23, 146, + 140, 171, 238, 132, 171, 223, 145, 23, 230, 57, 140, 171, 238, 132, 171, + 223, 145, 23, 146, 140, 171, 238, 132, 171, 197, 68, 23, 146, 140, 171, + 242, 130, 23, 230, 55, 140, 199, 147, 23, 230, 55, 140, 171, 211, 183, + 23, 230, 48, 140, 171, 211, 183, 23, 230, 48, 140, 171, 220, 72, 23, 230, + 48, 140, 199, 147, 23, 230, 48, 140, 171, 202, 236, 23, 230, 61, 140, + 171, 211, 125, 23, 230, 61, 140, 171, 223, 190, 23, 230, 61, 140, 199, + 147, 23, 146, 199, 147, 23, 146, 171, 229, 222, 23, 146, 171, 203, 111, + 237, 10, 23, 146, 171, 203, 111, 239, 10, 23, 146, 171, 203, 111, 248, + 74, 23, 146, 171, 232, 123, 23, 146, 171, 248, 61, 140, 216, 160, 23, + 146, 171, 248, 61, 85, 207, 81, 23, 146, 171, 248, 61, 207, 82, 219, 146, + 23, 146, 171, 197, 69, 103, 232, 235, 23, 146, 171, 136, 103, 232, 235, + 23, 146, 171, 197, 69, 112, 232, 235, 23, 146, 171, 197, 69, 232, 119, + 232, 235, 23, 146, 171, 136, 232, 119, 208, 39, 221, 115, 23, 230, 51, + 23, 146, 229, 222, 23, 198, 233, 203, 73, 23, 198, 233, 215, 215, 23, + 198, 233, 248, 60, 23, 230, 215, 203, 73, 23, 230, 215, 215, 215, 23, + 230, 215, 248, 60, 23, 201, 213, 203, 73, 23, 201, 213, 215, 215, 23, + 201, 213, 248, 60, 23, 247, 132, 203, 73, 23, 247, 132, 215, 215, 23, + 247, 132, 248, 60, 23, 206, 210, 203, 73, 23, 206, 210, 215, 215, 23, + 206, 210, 248, 60, 23, 201, 96, 201, 5, 23, 201, 96, 248, 60, 23, 202, + 102, 220, 73, 203, 73, 23, 202, 102, 2, 203, 73, 23, 202, 102, 220, 73, + 215, 215, 23, 202, 102, 2, 215, 215, 23, 202, 102, 204, 161, 23, 232, + 186, 220, 73, 203, 73, 23, 232, 186, 2, 203, 73, 23, 232, 186, 220, 73, + 215, 215, 23, 232, 186, 2, 215, 215, 23, 232, 186, 204, 161, 23, 202, + 102, 232, 186, 250, 246, 23, 215, 253, 130, 142, 220, 72, 23, 215, 253, + 130, 142, 202, 236, 23, 215, 253, 130, 204, 161, 23, 215, 253, 142, 204, + 161, 23, 215, 253, 130, 142, 250, 247, 220, 72, 23, 215, 253, 130, 142, + 250, 247, 202, 236, 23, 215, 253, 203, 111, 115, 203, 111, 205, 238, 23, + 215, 252, 232, 241, 239, 0, 23, 215, 254, 232, 241, 239, 0, 23, 215, 252, + 203, 74, 201, 230, 202, 236, 23, 215, 252, 203, 74, 201, 230, 217, 30, + 23, 215, 252, 203, 74, 201, 230, 220, 72, 23, 215, 252, 203, 74, 201, + 230, 220, 70, 23, 215, 252, 203, 74, 193, 248, 232, 189, 23, 215, 252, + 55, 201, 229, 23, 215, 252, 55, 193, 248, 232, 189, 23, 215, 252, 55, + 250, 246, 23, 215, 252, 55, 250, 247, 193, 248, 232, 189, 23, 215, 252, + 238, 183, 23, 215, 252, 198, 170, 201, 230, 216, 0, 23, 215, 252, 198, + 170, 193, 248, 232, 189, 23, 215, 252, 198, 170, 250, 246, 23, 215, 252, + 198, 170, 250, 247, 193, 248, 232, 189, 23, 215, 252, 248, 79, 202, 236, + 23, 215, 252, 248, 79, 217, 30, 23, 215, 252, 248, 79, 220, 72, 23, 215, + 252, 238, 224, 202, 236, 23, 215, 252, 238, 224, 217, 30, 23, 215, 252, + 238, 224, 220, 72, 23, 215, 252, 238, 224, 207, 14, 23, 215, 252, 242, + 244, 202, 236, 23, 215, 252, 242, 244, 217, 30, 23, 215, 252, 242, 244, + 220, 72, 23, 215, 252, 105, 202, 236, 23, 215, 252, 105, 217, 30, 23, + 215, 252, 105, 220, 72, 23, 215, 252, 192, 21, 202, 236, 23, 215, 252, + 192, 21, 217, 30, 23, 215, 252, 192, 21, 220, 72, 23, 215, 252, 210, 176, + 202, 236, 23, 215, 252, 210, 176, 217, 30, 23, 215, 252, 210, 176, 220, + 72, 23, 198, 200, 207, 12, 203, 73, 23, 198, 200, 207, 12, 235, 106, 23, + 198, 200, 207, 12, 250, 246, 23, 198, 200, 207, 13, 203, 73, 23, 198, + 200, 207, 13, 235, 106, 23, 198, 200, 207, 13, 250, 246, 23, 198, 200, + 204, 43, 23, 198, 200, 250, 93, 202, 133, 203, 73, 23, 198, 200, 250, 93, + 202, 133, 235, 106, 23, 198, 200, 250, 93, 202, 133, 198, 169, 23, 215, + 255, 249, 240, 202, 236, 23, 215, 255, 249, 240, 217, 30, 23, 215, 255, + 249, 240, 220, 72, 23, 215, 255, 249, 240, 220, 70, 23, 215, 255, 198, + 227, 202, 236, 23, 215, 255, 198, 227, 217, 30, 23, 215, 255, 198, 227, + 220, 72, 23, 215, 255, 198, 227, 220, 70, 23, 215, 255, 248, 61, 249, + 240, 202, 236, 23, 215, 255, 248, 61, 249, 240, 217, 30, 23, 215, 255, + 248, 61, 249, 240, 220, 72, 23, 215, 255, 248, 61, 249, 240, 220, 70, 23, + 215, 255, 248, 61, 198, 227, 202, 236, 23, 215, 255, 248, 61, 198, 227, + 217, 30, 23, 215, 255, 248, 61, 198, 227, 220, 72, 23, 215, 255, 248, 61, + 198, 227, 220, 70, 23, 215, 254, 203, 74, 201, 230, 202, 236, 23, 215, + 254, 203, 74, 201, 230, 217, 30, 23, 215, 254, 203, 74, 201, 230, 220, + 72, 23, 215, 254, 203, 74, 201, 230, 220, 70, 23, 215, 254, 203, 74, 193, + 248, 232, 189, 23, 215, 254, 55, 201, 229, 23, 215, 254, 55, 193, 248, + 232, 189, 23, 215, 254, 55, 250, 246, 23, 215, 254, 55, 250, 247, 193, + 248, 232, 189, 23, 215, 254, 238, 183, 23, 215, 254, 198, 170, 201, 230, + 216, 0, 23, 215, 254, 198, 170, 193, 248, 232, 189, 23, 215, 254, 198, + 170, 250, 247, 216, 0, 23, 215, 254, 198, 170, 250, 247, 193, 248, 232, + 189, 23, 215, 254, 248, 78, 23, 215, 254, 238, 224, 202, 236, 23, 215, + 254, 238, 224, 217, 30, 23, 215, 254, 238, 224, 220, 72, 23, 215, 254, + 242, 243, 23, 215, 254, 105, 202, 236, 23, 215, 254, 105, 217, 30, 23, + 215, 254, 105, 220, 72, 23, 215, 254, 192, 21, 202, 236, 23, 215, 254, + 192, 21, 217, 30, 23, 215, 254, 192, 21, 220, 72, 23, 215, 254, 210, 176, + 202, 236, 23, 215, 254, 210, 176, 217, 30, 23, 215, 254, 210, 176, 220, + 72, 23, 198, 201, 207, 13, 203, 73, 23, 198, 201, 207, 13, 235, 106, 23, + 198, 201, 207, 13, 250, 246, 23, 198, 201, 207, 12, 203, 73, 23, 198, + 201, 207, 12, 235, 106, 23, 198, 201, 207, 12, 250, 246, 23, 198, 201, + 204, 43, 23, 215, 252, 238, 132, 208, 168, 202, 236, 23, 215, 252, 238, + 132, 208, 168, 217, 30, 23, 215, 252, 238, 132, 208, 168, 220, 72, 23, + 215, 252, 238, 132, 208, 168, 220, 70, 23, 215, 252, 238, 132, 230, 75, + 202, 236, 23, 215, 252, 238, 132, 230, 75, 217, 30, 23, 215, 252, 238, + 132, 230, 75, 220, 72, 23, 215, 252, 238, 132, 230, 75, 220, 70, 23, 215, + 252, 238, 132, 199, 153, 242, 131, 202, 236, 23, 215, 252, 238, 132, 199, + 153, 242, 131, 217, 30, 23, 215, 252, 228, 165, 202, 236, 23, 215, 252, + 228, 165, 217, 30, 23, 215, 252, 228, 165, 220, 72, 23, 215, 252, 219, + 70, 202, 236, 23, 215, 252, 219, 70, 217, 30, 23, 215, 252, 219, 70, 220, + 72, 23, 215, 252, 219, 70, 2, 235, 106, 23, 215, 252, 194, 125, 238, 132, + 55, 202, 236, 23, 215, 252, 194, 125, 238, 132, 55, 217, 30, 23, 215, + 252, 194, 125, 238, 132, 55, 220, 72, 23, 215, 252, 194, 125, 238, 132, + 198, 170, 202, 236, 23, 215, 252, 194, 125, 238, 132, 198, 170, 217, 30, + 23, 215, 252, 194, 125, 238, 132, 198, 170, 220, 72, 23, 215, 252, 238, + 132, 199, 216, 201, 229, 23, 215, 252, 238, 130, 238, 184, 202, 236, 23, + 215, 252, 238, 130, 238, 184, 217, 30, 23, 207, 12, 203, 73, 23, 207, 12, + 235, 106, 23, 207, 12, 250, 248, 23, 215, 252, 204, 43, 23, 215, 252, + 238, 132, 229, 136, 232, 88, 194, 151, 23, 215, 252, 228, 165, 229, 136, + 232, 88, 194, 151, 23, 215, 252, 219, 70, 229, 136, 232, 88, 194, 151, + 23, 215, 252, 194, 125, 229, 136, 232, 88, 194, 151, 23, 207, 12, 203, + 74, 229, 136, 232, 88, 194, 151, 23, 207, 12, 55, 229, 136, 232, 88, 194, + 151, 23, 207, 12, 250, 247, 229, 136, 232, 88, 194, 151, 23, 215, 252, + 238, 132, 229, 136, 242, 224, 23, 215, 252, 228, 165, 229, 136, 242, 224, + 23, 215, 252, 219, 70, 229, 136, 242, 224, 23, 215, 252, 194, 125, 229, + 136, 242, 224, 23, 207, 12, 203, 74, 229, 136, 242, 224, 23, 207, 12, 55, + 229, 136, 242, 224, 23, 207, 12, 250, 247, 229, 136, 242, 224, 23, 215, + 252, 194, 125, 237, 11, 210, 203, 202, 236, 23, 215, 252, 194, 125, 237, + 11, 210, 203, 217, 30, 23, 215, 252, 194, 125, 237, 11, 210, 203, 220, + 72, 23, 215, 254, 238, 132, 229, 136, 246, 147, 202, 236, 23, 215, 254, + 238, 132, 229, 136, 246, 147, 220, 72, 23, 215, 254, 228, 165, 229, 136, + 246, 147, 2, 235, 106, 23, 215, 254, 228, 165, 229, 136, 246, 147, 220, + 73, 235, 106, 23, 215, 254, 228, 165, 229, 136, 246, 147, 2, 198, 169, + 23, 215, 254, 228, 165, 229, 136, 246, 147, 220, 73, 198, 169, 23, 215, + 254, 219, 70, 229, 136, 246, 147, 2, 203, 73, 23, 215, 254, 219, 70, 229, + 136, 246, 147, 220, 73, 203, 73, 23, 215, 254, 219, 70, 229, 136, 246, + 147, 2, 235, 106, 23, 215, 254, 219, 70, 229, 136, 246, 147, 220, 73, + 235, 106, 23, 215, 254, 194, 125, 229, 136, 246, 147, 202, 236, 23, 215, + 254, 194, 125, 229, 136, 246, 147, 220, 72, 23, 207, 13, 203, 74, 229, + 136, 246, 146, 23, 207, 13, 55, 229, 136, 246, 146, 23, 207, 13, 250, + 247, 229, 136, 246, 146, 23, 215, 254, 238, 132, 229, 136, 232, 183, 202, + 236, 23, 215, 254, 238, 132, 229, 136, 232, 183, 220, 72, 23, 215, 254, + 228, 165, 229, 136, 232, 183, 2, 235, 106, 23, 215, 254, 228, 165, 229, + 136, 232, 183, 220, 73, 235, 106, 23, 215, 254, 228, 165, 229, 136, 232, + 183, 198, 170, 2, 198, 169, 23, 215, 254, 228, 165, 229, 136, 232, 183, + 198, 170, 220, 73, 198, 169, 23, 215, 254, 219, 70, 229, 136, 232, 183, + 2, 203, 73, 23, 215, 254, 219, 70, 229, 136, 232, 183, 220, 73, 203, 73, + 23, 215, 254, 219, 70, 229, 136, 232, 183, 2, 235, 106, 23, 215, 254, + 219, 70, 229, 136, 232, 183, 220, 73, 235, 106, 23, 215, 254, 194, 125, + 229, 136, 232, 183, 202, 236, 23, 215, 254, 194, 125, 229, 136, 232, 183, + 220, 72, 23, 207, 13, 203, 74, 229, 136, 232, 182, 23, 207, 13, 55, 229, + 136, 232, 182, 23, 207, 13, 250, 247, 229, 136, 232, 182, 23, 215, 254, + 238, 132, 202, 236, 23, 215, 254, 238, 132, 217, 30, 23, 215, 254, 238, + 132, 220, 72, 23, 215, 254, 238, 132, 220, 70, 23, 215, 254, 238, 132, + 242, 42, 23, 215, 254, 228, 165, 202, 236, 23, 215, 254, 219, 70, 202, + 236, 23, 215, 254, 194, 125, 202, 224, 23, 215, 254, 194, 125, 202, 236, + 23, 215, 254, 194, 125, 220, 72, 23, 207, 13, 203, 73, 23, 207, 13, 235, + 106, 23, 207, 13, 250, 246, 23, 215, 254, 204, 44, 210, 235, 23, 215, + 252, 250, 93, 242, 131, 2, 203, 73, 23, 215, 252, 250, 93, 242, 131, 217, + 31, 203, 73, 23, 215, 252, 250, 93, 242, 131, 2, 235, 106, 23, 215, 252, + 250, 93, 242, 131, 217, 31, 235, 106, 23, 215, 254, 250, 93, 242, 131, + 229, 136, 194, 152, 2, 203, 73, 23, 215, 254, 250, 93, 242, 131, 229, + 136, 194, 152, 217, 31, 203, 73, 23, 215, 254, 250, 93, 242, 131, 229, + 136, 194, 152, 220, 73, 203, 73, 23, 215, 254, 250, 93, 242, 131, 229, + 136, 194, 152, 2, 235, 106, 23, 215, 254, 250, 93, 242, 131, 229, 136, + 194, 152, 217, 31, 235, 106, 23, 215, 254, 250, 93, 242, 131, 229, 136, + 194, 152, 220, 73, 235, 106, 23, 215, 252, 193, 248, 242, 131, 232, 88, + 203, 73, 23, 215, 252, 193, 248, 242, 131, 232, 88, 235, 106, 23, 215, + 254, 193, 248, 242, 131, 229, 136, 194, 152, 203, 73, 23, 215, 254, 193, + 248, 242, 131, 229, 136, 194, 152, 235, 106, 23, 215, 252, 232, 241, 242, + 128, 203, 73, 23, 215, 252, 232, 241, 242, 128, 235, 106, 23, 215, 254, + 232, 241, 242, 128, 229, 136, 194, 152, 203, 73, 23, 215, 254, 232, 241, + 242, 128, 229, 136, 194, 152, 235, 106, 23, 235, 22, 250, 78, 202, 236, + 23, 235, 22, 250, 78, 220, 72, 23, 235, 22, 233, 61, 23, 235, 22, 202, + 239, 23, 235, 22, 200, 23, 23, 235, 22, 207, 213, 23, 235, 22, 203, 80, + 23, 235, 22, 203, 81, 250, 246, 23, 235, 22, 233, 213, 211, 137, 199, 84, + 23, 235, 22, 230, 225, 23, 229, 245, 23, 229, 246, 207, 86, 23, 229, 246, + 215, 252, 201, 229, 23, 229, 246, 215, 252, 199, 87, 23, 229, 246, 215, + 254, 201, 229, 23, 229, 246, 215, 252, 238, 131, 23, 229, 246, 215, 254, + 238, 131, 23, 229, 246, 216, 1, 242, 130, 23, 233, 92, 236, 205, 209, + 160, 213, 113, 232, 124, 199, 85, 23, 233, 92, 236, 205, 209, 160, 213, + 113, 130, 211, 164, 235, 96, 23, 233, 92, 236, 205, 209, 160, 213, 113, + 130, 211, 164, 142, 199, 85, 23, 233, 179, 201, 230, 197, 41, 23, 233, + 179, 201, 230, 214, 178, 23, 233, 179, 201, 230, 235, 96, 23, 235, 80, + 233, 179, 214, 179, 235, 96, 23, 235, 80, 233, 179, 142, 214, 178, 23, + 235, 80, 233, 179, 130, 214, 178, 23, 235, 80, 233, 179, 214, 179, 197, + 41, 23, 232, 141, 214, 178, 23, 232, 141, 239, 0, 23, 232, 141, 193, 251, + 23, 233, 174, 211, 183, 23, 233, 174, 202, 101, 23, 233, 174, 242, 83, + 23, 233, 182, 247, 239, 203, 73, 23, 233, 182, 247, 239, 215, 215, 23, + 233, 174, 138, 211, 183, 23, 233, 174, 194, 64, 211, 183, 23, 233, 174, + 138, 242, 83, 23, 233, 174, 194, 62, 216, 0, 23, 233, 182, 194, 45, 23, + 233, 175, 197, 41, 23, 233, 175, 235, 96, 23, 233, 175, 232, 169, 23, + 233, 177, 201, 229, 23, 233, 177, 201, 230, 235, 106, 23, 233, 177, 201, + 230, 250, 246, 23, 233, 178, 201, 229, 23, 233, 178, 201, 230, 235, 106, + 23, 233, 178, 201, 230, 250, 246, 23, 233, 177, 238, 129, 23, 233, 178, + 238, 129, 23, 233, 177, 242, 125, 23, 242, 239, 209, 41, 23, 242, 239, + 214, 178, 23, 242, 239, 201, 143, 23, 200, 24, 242, 239, 229, 155, 23, + 200, 24, 242, 239, 216, 160, 23, 200, 24, 242, 239, 219, 52, 23, 234, + 191, 23, 213, 113, 214, 178, 23, 213, 113, 239, 0, 23, 213, 113, 193, + 249, 23, 213, 113, 194, 59, 23, 251, 53, 247, 225, 211, 125, 23, 251, 53, + 201, 142, 223, 190, 23, 251, 53, 247, 227, 2, 207, 11, 23, 251, 53, 201, + 144, 2, 207, 11, 23, 247, 152, 223, 162, 23, 247, 152, 233, 202, 23, 216, + 5, 242, 84, 214, 178, 23, 216, 5, 242, 84, 232, 123, 23, 216, 5, 242, 84, + 239, 0, 23, 216, 5, 202, 231, 23, 216, 5, 202, 232, 193, 251, 23, 216, 5, + 202, 232, 211, 183, 23, 216, 5, 232, 84, 23, 216, 5, 232, 85, 193, 251, + 23, 216, 5, 232, 85, 211, 183, 23, 216, 5, 211, 184, 242, 130, 23, 216, + 5, 211, 184, 232, 123, 23, 216, 5, 211, 184, 193, 251, 23, 216, 5, 211, + 184, 211, 118, 23, 216, 5, 211, 184, 211, 119, 193, 251, 23, 216, 5, 211, + 184, 211, 119, 193, 77, 23, 216, 5, 211, 184, 207, 242, 23, 216, 5, 211, + 184, 207, 243, 193, 251, 23, 216, 5, 211, 184, 207, 243, 193, 77, 23, + 216, 5, 221, 160, 23, 216, 5, 221, 161, 232, 123, 23, 216, 5, 221, 161, + 193, 251, 23, 216, 5, 200, 23, 23, 216, 5, 200, 24, 232, 123, 23, 216, 5, + 200, 24, 201, 143, 23, 219, 160, 209, 103, 199, 26, 23, 219, 162, 106, + 136, 197, 38, 23, 219, 162, 113, 136, 219, 47, 23, 216, 5, 238, 222, 23, + 216, 5, 193, 250, 203, 73, 23, 216, 5, 193, 250, 235, 106, 23, 199, 1, + 201, 249, 211, 126, 233, 63, 23, 199, 1, 219, 205, 219, 159, 23, 199, 1, + 199, 74, 248, 61, 219, 159, 23, 199, 1, 199, 74, 198, 231, 223, 146, 216, + 4, 23, 199, 1, 223, 146, 216, 5, 207, 213, 23, 199, 1, 215, 251, 251, 78, + 242, 240, 23, 199, 1, 246, 138, 201, 249, 211, 125, 23, 199, 1, 246, 138, + 223, 146, 216, 4, 23, 200, 52, 23, 200, 53, 216, 0, 23, 200, 53, 211, + 212, 199, 0, 23, 200, 53, 211, 212, 199, 1, 216, 0, 23, 200, 53, 211, + 212, 219, 159, 23, 200, 53, 211, 212, 219, 160, 216, 0, 23, 200, 53, 247, + 255, 219, 159, 23, 215, 252, 223, 45, 23, 215, 254, 223, 45, 23, 214, + 205, 23, 230, 86, 23, 233, 205, 23, 203, 177, 229, 143, 202, 134, 23, + 203, 177, 229, 143, 209, 158, 23, 194, 150, 203, 177, 229, 143, 216, 3, + 23, 232, 181, 203, 177, 229, 143, 216, 3, 23, 203, 177, 199, 86, 232, 89, + 194, 156, 23, 198, 238, 201, 230, 201, 217, 23, 198, 238, 238, 130, 248, + 78, 23, 198, 239, 197, 223, 23, 113, 247, 214, 199, 86, 232, 89, 229, + 143, 222, 227, 23, 219, 187, 242, 43, 23, 219, 187, 220, 1, 23, 219, 187, + 220, 0, 23, 219, 187, 219, 255, 23, 219, 187, 219, 254, 23, 219, 187, + 219, 253, 23, 219, 187, 219, 252, 23, 219, 187, 219, 251, 23, 232, 240, + 23, 219, 101, 202, 160, 23, 219, 102, 202, 160, 23, 219, 104, 229, 218, + 23, 219, 104, 194, 60, 23, 219, 104, 237, 63, 23, 219, 104, 229, 246, + 214, 205, 23, 219, 104, 198, 240, 23, 219, 104, 219, 186, 236, 237, 23, + 242, 38, 23, 232, 71, 201, 238, 23, 204, 180, 23, 242, 47, 23, 210, 230, + 23, 232, 250, 216, 67, 23, 232, 250, 216, 66, 23, 232, 250, 216, 65, 23, + 232, 250, 216, 64, 23, 232, 250, 216, 63, 23, 207, 15, 216, 67, 23, 207, + 15, 216, 66, 23, 207, 15, 216, 65, 23, 207, 15, 216, 64, 23, 207, 15, + 216, 63, 23, 207, 15, 216, 62, 23, 207, 15, 216, 61, 23, 207, 15, 216, + 60, 23, 207, 15, 216, 74, 23, 207, 15, 216, 73, 23, 207, 15, 216, 72, 23, + 207, 15, 216, 71, 23, 207, 15, 216, 70, 23, 207, 15, 216, 69, 23, 207, + 15, 216, 68, 38, 131, 1, 249, 227, 38, 131, 1, 247, 110, 38, 131, 1, 196, + 121, 38, 131, 1, 231, 13, 38, 131, 1, 236, 141, 38, 131, 1, 193, 38, 38, + 131, 1, 192, 55, 38, 131, 1, 192, 81, 38, 131, 1, 223, 69, 38, 131, 1, + 88, 223, 69, 38, 131, 1, 70, 38, 131, 1, 236, 162, 38, 131, 1, 222, 127, + 38, 131, 1, 219, 139, 38, 131, 1, 215, 155, 38, 131, 1, 215, 46, 38, 131, + 1, 211, 196, 38, 131, 1, 209, 185, 38, 131, 1, 207, 72, 38, 131, 1, 202, + 241, 38, 131, 1, 197, 251, 38, 131, 1, 197, 88, 38, 131, 1, 232, 92, 38, + 131, 1, 229, 198, 38, 131, 1, 203, 167, 38, 131, 1, 198, 97, 38, 131, 1, + 242, 174, 38, 131, 1, 204, 64, 38, 131, 1, 193, 47, 38, 131, 1, 193, 49, + 38, 131, 1, 193, 82, 38, 131, 1, 192, 214, 38, 131, 1, 2, 192, 179, 38, + 131, 1, 193, 1, 38, 131, 1, 223, 110, 2, 192, 179, 38, 131, 1, 248, 28, + 192, 179, 38, 131, 1, 223, 110, 248, 28, 192, 179, 38, 131, 1, 232, 216, + 212, 180, 209, 48, 89, 1, 172, 212, 180, 209, 48, 89, 1, 198, 118, 212, + 180, 209, 48, 89, 1, 213, 43, 212, 180, 209, 48, 89, 1, 189, 212, 180, + 209, 48, 89, 1, 144, 212, 180, 209, 48, 89, 1, 181, 212, 180, 209, 48, + 89, 1, 193, 209, 212, 180, 209, 48, 89, 1, 213, 210, 212, 180, 209, 48, + 89, 1, 247, 19, 212, 180, 209, 48, 89, 1, 177, 212, 180, 209, 48, 89, 1, + 188, 212, 180, 209, 48, 89, 1, 192, 112, 212, 180, 209, 48, 89, 1, 215, + 3, 212, 180, 209, 48, 89, 1, 213, 30, 212, 180, 209, 48, 89, 1, 160, 212, + 180, 209, 48, 89, 1, 238, 0, 212, 180, 209, 48, 89, 1, 212, 201, 212, + 180, 209, 48, 89, 1, 213, 88, 212, 180, 209, 48, 89, 1, 196, 157, 212, + 180, 209, 48, 89, 1, 213, 24, 212, 180, 209, 48, 89, 1, 197, 215, 212, + 180, 209, 48, 89, 1, 233, 97, 212, 180, 209, 48, 89, 1, 167, 212, 180, + 209, 48, 89, 1, 208, 239, 212, 180, 209, 48, 89, 1, 168, 212, 180, 209, + 48, 89, 1, 213, 90, 212, 180, 209, 48, 89, 1, 166, 212, 180, 209, 48, 89, + 1, 193, 164, 212, 180, 209, 48, 89, 1, 213, 92, 212, 180, 209, 48, 89, 1, + 236, 158, 212, 180, 209, 48, 89, 1, 213, 91, 212, 180, 209, 48, 89, 1, + 230, 89, 212, 180, 209, 48, 89, 1, 216, 98, 212, 180, 209, 48, 89, 1, + 209, 234, 212, 180, 209, 48, 89, 1, 231, 233, 212, 180, 209, 48, 89, 1, + 207, 3, 212, 180, 209, 48, 89, 1, 64, 212, 180, 209, 48, 89, 1, 252, 33, + 212, 180, 209, 48, 89, 1, 70, 212, 180, 209, 48, 89, 1, 68, 212, 180, + 209, 48, 89, 1, 74, 212, 180, 209, 48, 89, 1, 211, 194, 212, 180, 209, + 48, 89, 1, 71, 212, 180, 209, 48, 89, 1, 234, 171, 212, 180, 209, 48, 89, + 1, 194, 202, 212, 180, 209, 48, 89, 199, 9, 212, 180, 209, 48, 89, 199, + 5, 212, 180, 209, 48, 89, 199, 6, 212, 180, 209, 48, 89, 199, 3, 212, + 180, 209, 48, 89, 199, 4, 212, 180, 209, 48, 89, 199, 7, 212, 180, 209, + 48, 89, 199, 8, 212, 180, 209, 48, 89, 3, 39, 210, 116, 212, 180, 209, + 48, 89, 3, 39, 199, 194, 212, 180, 209, 48, 89, 3, 39, 219, 103, 212, + 180, 209, 48, 89, 3, 39, 250, 198, 212, 180, 209, 48, 89, 3, 39, 223, + 122, 212, 180, 209, 48, 89, 3, 193, 172, 193, 171, 212, 180, 209, 48, 89, + 5, 219, 250, 212, 180, 209, 48, 89, 17, 192, 76, 212, 180, 209, 48, 89, + 17, 101, 212, 180, 209, 48, 89, 17, 104, 212, 180, 209, 48, 89, 17, 133, + 212, 180, 209, 48, 89, 17, 134, 212, 180, 209, 48, 89, 17, 151, 212, 180, + 209, 48, 89, 17, 170, 212, 180, 209, 48, 89, 17, 179, 212, 180, 209, 48, + 89, 17, 174, 212, 180, 209, 48, 89, 17, 182, 212, 180, 209, 48, 89, 219, + 92, 212, 196, 212, 180, 209, 48, 89, 47, 247, 19, 194, 148, 1, 252, 33, + 194, 148, 1, 64, 194, 148, 1, 249, 3, 194, 148, 1, 247, 19, 194, 148, 1, + 238, 0, 194, 148, 1, 231, 233, 194, 148, 1, 168, 194, 148, 1, 210, 94, + 194, 148, 1, 177, 194, 148, 1, 181, 194, 148, 1, 166, 194, 148, 1, 189, + 194, 148, 1, 199, 240, 194, 148, 1, 233, 97, 194, 148, 1, 188, 194, 148, + 1, 204, 64, 194, 148, 1, 223, 62, 194, 148, 1, 192, 112, 194, 148, 1, + 194, 169, 194, 148, 1, 196, 157, 194, 148, 1, 160, 194, 148, 1, 74, 194, + 148, 1, 250, 8, 194, 148, 1, 167, 194, 148, 1, 172, 194, 148, 1, 221, + 250, 194, 148, 1, 144, 194, 148, 1, 71, 194, 148, 1, 70, 194, 148, 1, + 214, 165, 194, 148, 1, 68, 194, 148, 1, 219, 130, 194, 148, 1, 198, 118, + 194, 148, 1, 198, 223, 194, 148, 1, 211, 201, 194, 148, 1, 251, 248, 194, + 148, 1, 250, 214, 194, 148, 1, 223, 164, 194, 148, 1, 211, 211, 194, 148, + 1, 234, 88, 194, 148, 1, 251, 249, 194, 148, 1, 212, 201, 194, 148, 1, + 197, 100, 194, 148, 1, 193, 13, 194, 148, 158, 198, 18, 194, 148, 158, + 198, 17, 194, 148, 158, 221, 101, 194, 148, 158, 221, 100, 194, 148, 17, + 192, 76, 194, 148, 17, 101, 194, 148, 17, 104, 194, 148, 17, 133, 194, + 148, 17, 134, 194, 148, 17, 151, 194, 148, 17, 170, 194, 148, 17, 179, + 194, 148, 17, 174, 194, 148, 17, 182, 194, 148, 214, 73, 57, 83, 82, 5, + 218, 235, 221, 204, 83, 82, 5, 218, 231, 160, 83, 82, 5, 218, 229, 221, + 33, 83, 82, 5, 218, 105, 222, 48, 83, 82, 5, 218, 75, 222, 57, 83, 82, 5, + 218, 94, 221, 88, 83, 82, 5, 218, 122, 221, 113, 83, 82, 5, 217, 247, + 221, 20, 83, 82, 5, 218, 226, 194, 72, 83, 82, 5, 218, 224, 194, 169, 83, + 82, 5, 218, 222, 193, 244, 83, 82, 5, 218, 44, 194, 100, 83, 82, 5, 218, + 52, 194, 111, 83, 82, 5, 218, 56, 194, 17, 83, 82, 5, 218, 125, 194, 36, + 83, 82, 5, 217, 232, 193, 240, 83, 82, 5, 218, 27, 194, 98, 83, 82, 5, + 218, 109, 193, 228, 83, 82, 5, 218, 121, 193, 230, 83, 82, 5, 218, 31, + 193, 229, 83, 82, 5, 218, 220, 216, 120, 83, 82, 5, 218, 218, 217, 160, + 83, 82, 5, 218, 216, 215, 209, 83, 82, 5, 218, 111, 217, 5, 83, 82, 5, + 218, 76, 216, 55, 83, 82, 5, 218, 16, 215, 234, 83, 82, 5, 217, 237, 215, + 228, 83, 82, 5, 218, 214, 248, 41, 83, 82, 5, 218, 211, 249, 3, 83, 82, + 5, 218, 209, 247, 124, 83, 82, 5, 218, 20, 248, 108, 83, 82, 5, 218, 73, + 248, 123, 83, 82, 5, 218, 67, 247, 206, 83, 82, 5, 218, 32, 247, 220, 83, + 82, 5, 218, 199, 70, 83, 82, 5, 218, 197, 64, 83, 82, 5, 218, 195, 68, + 83, 82, 5, 218, 7, 234, 171, 83, 82, 5, 218, 70, 71, 83, 82, 5, 218, 5, + 211, 194, 83, 82, 5, 218, 23, 74, 83, 82, 5, 218, 33, 234, 150, 83, 82, + 5, 218, 39, 223, 190, 83, 82, 5, 218, 35, 223, 190, 83, 82, 5, 217, 231, + 250, 224, 83, 82, 5, 217, 248, 234, 88, 83, 82, 5, 218, 184, 203, 125, + 83, 82, 5, 218, 182, 188, 83, 82, 5, 218, 180, 201, 184, 83, 82, 5, 218, + 8, 205, 205, 83, 82, 5, 218, 54, 205, 223, 83, 82, 5, 218, 34, 202, 183, + 83, 82, 5, 218, 91, 202, 212, 83, 82, 5, 217, 230, 203, 118, 83, 82, 5, + 218, 170, 219, 209, 83, 82, 5, 218, 168, 177, 83, 82, 5, 218, 166, 219, + 36, 83, 82, 5, 218, 86, 220, 32, 83, 82, 5, 218, 97, 220, 42, 83, 82, 5, + 218, 116, 219, 73, 83, 82, 5, 218, 17, 219, 107, 83, 82, 5, 218, 60, 184, + 220, 42, 83, 82, 5, 218, 192, 237, 16, 83, 82, 5, 218, 189, 238, 0, 83, + 82, 5, 218, 186, 235, 62, 83, 82, 5, 218, 81, 237, 101, 83, 82, 5, 217, + 246, 236, 120, 83, 82, 5, 217, 245, 236, 146, 83, 82, 5, 218, 178, 199, + 128, 83, 82, 5, 218, 175, 189, 83, 82, 5, 218, 173, 198, 45, 83, 82, 5, + 218, 79, 200, 56, 83, 82, 5, 218, 115, 200, 79, 83, 82, 5, 218, 66, 198, + 254, 83, 82, 5, 218, 101, 155, 83, 82, 5, 218, 164, 223, 20, 83, 82, 5, + 218, 161, 223, 62, 83, 82, 5, 218, 159, 222, 214, 83, 82, 5, 218, 13, + 223, 39, 83, 82, 5, 218, 57, 223, 41, 83, 82, 5, 218, 10, 222, 223, 83, + 82, 5, 218, 107, 222, 233, 83, 82, 5, 217, 251, 184, 222, 233, 83, 82, 5, + 218, 157, 193, 22, 83, 82, 5, 218, 154, 168, 83, 82, 5, 218, 152, 192, + 214, 83, 82, 5, 218, 61, 193, 66, 83, 82, 5, 218, 90, 193, 69, 83, 82, 5, + 218, 29, 192, 235, 83, 82, 5, 218, 49, 193, 1, 83, 82, 5, 218, 148, 233, + 11, 83, 82, 5, 218, 146, 233, 97, 83, 82, 5, 218, 144, 232, 77, 83, 82, + 5, 218, 92, 233, 40, 83, 82, 5, 218, 95, 233, 47, 83, 82, 5, 218, 37, + 232, 152, 83, 82, 5, 218, 82, 232, 164, 83, 82, 5, 217, 229, 232, 76, 83, + 82, 5, 218, 69, 233, 68, 83, 82, 5, 218, 142, 214, 20, 83, 82, 5, 218, + 140, 215, 61, 83, 82, 5, 218, 138, 212, 230, 83, 82, 5, 218, 53, 214, + 196, 83, 82, 5, 218, 1, 213, 130, 83, 82, 5, 217, 250, 229, 178, 83, 82, + 5, 218, 133, 144, 83, 82, 5, 217, 240, 228, 181, 83, 82, 5, 218, 136, + 229, 225, 83, 82, 5, 218, 74, 229, 255, 83, 82, 5, 218, 131, 229, 16, 83, + 82, 5, 218, 30, 229, 43, 83, 82, 5, 218, 87, 229, 224, 83, 82, 5, 218, + 42, 229, 9, 83, 82, 5, 218, 117, 229, 148, 83, 82, 5, 218, 40, 230, 65, + 83, 82, 5, 218, 83, 228, 164, 83, 82, 5, 218, 118, 229, 208, 83, 82, 5, + 217, 233, 229, 19, 83, 82, 5, 218, 124, 228, 177, 83, 82, 5, 218, 80, + 214, 130, 83, 82, 5, 218, 129, 214, 144, 83, 82, 5, 218, 88, 214, 127, + 83, 82, 5, 218, 55, 214, 138, 83, 82, 5, 218, 24, 214, 139, 83, 82, 5, + 218, 14, 214, 128, 83, 82, 5, 218, 50, 214, 129, 83, 82, 5, 218, 11, 214, + 143, 83, 82, 5, 218, 43, 214, 126, 83, 82, 5, 218, 84, 184, 214, 139, 83, + 82, 5, 218, 64, 184, 214, 128, 83, 82, 5, 217, 243, 184, 214, 129, 83, + 82, 5, 218, 15, 231, 46, 83, 82, 5, 218, 59, 231, 233, 83, 82, 5, 218, 2, + 230, 186, 83, 82, 5, 217, 236, 231, 150, 83, 82, 5, 218, 4, 230, 172, 83, + 82, 5, 218, 3, 230, 182, 83, 82, 5, 217, 242, 214, 149, 83, 82, 5, 218, + 113, 214, 86, 83, 82, 5, 217, 249, 214, 75, 83, 82, 5, 218, 102, 210, 51, + 83, 82, 5, 218, 71, 166, 83, 82, 5, 218, 120, 209, 51, 83, 82, 5, 218, + 89, 210, 168, 83, 82, 5, 218, 119, 210, 181, 83, 82, 5, 218, 68, 209, + 172, 83, 82, 5, 218, 104, 209, 198, 83, 82, 5, 218, 25, 217, 67, 83, 82, + 5, 218, 108, 217, 82, 83, 82, 5, 218, 48, 217, 61, 83, 82, 5, 218, 123, + 217, 74, 83, 82, 5, 217, 238, 217, 74, 83, 82, 5, 218, 98, 217, 75, 83, + 82, 5, 217, 254, 217, 62, 83, 82, 5, 217, 252, 217, 63, 83, 82, 5, 217, + 239, 217, 55, 83, 82, 5, 218, 9, 184, 217, 75, 83, 82, 5, 218, 65, 184, + 217, 62, 83, 82, 5, 218, 28, 184, 217, 63, 83, 82, 5, 218, 38, 221, 61, + 83, 82, 5, 218, 78, 221, 69, 83, 82, 5, 218, 96, 221, 57, 83, 82, 5, 218, + 127, 221, 64, 83, 82, 5, 218, 62, 221, 65, 83, 82, 5, 218, 58, 221, 59, + 83, 82, 5, 218, 12, 221, 60, 83, 82, 5, 218, 46, 231, 167, 83, 82, 5, + 218, 114, 231, 175, 83, 82, 5, 218, 22, 231, 162, 83, 82, 5, 218, 77, + 231, 171, 83, 82, 5, 218, 63, 231, 172, 83, 82, 5, 218, 99, 231, 163, 83, + 82, 5, 218, 100, 231, 165, 83, 82, 5, 217, 255, 167, 83, 82, 5, 218, 47, + 214, 240, 83, 82, 5, 218, 41, 214, 255, 83, 82, 5, 218, 45, 214, 222, 83, + 82, 5, 217, 235, 214, 246, 83, 82, 5, 218, 51, 214, 247, 83, 82, 5, 218, + 103, 214, 227, 83, 82, 5, 218, 106, 214, 231, 83, 82, 5, 218, 18, 214, 0, + 83, 82, 5, 217, 234, 213, 226, 83, 82, 5, 218, 21, 213, 247, 83, 82, 5, + 218, 36, 213, 230, 83, 82, 5, 217, 244, 196, 39, 83, 82, 5, 217, 241, + 196, 157, 83, 82, 5, 218, 19, 194, 223, 83, 82, 5, 217, 253, 196, 118, + 83, 82, 5, 218, 85, 196, 123, 83, 82, 5, 218, 26, 195, 236, 83, 82, 5, + 218, 93, 195, 252, 83, 82, 5, 218, 6, 212, 174, 83, 82, 5, 218, 112, 212, + 194, 83, 82, 5, 218, 0, 212, 156, 83, 82, 5, 218, 72, 212, 186, 83, 82, + 5, 218, 110, 212, 163, 83, 82, 17, 101, 83, 82, 17, 104, 83, 82, 17, 133, + 83, 82, 17, 134, 83, 82, 17, 151, 83, 82, 17, 170, 83, 82, 17, 179, 83, + 82, 17, 174, 83, 82, 17, 182, 83, 82, 38, 31, 200, 54, 83, 82, 38, 31, + 200, 25, 83, 82, 38, 31, 228, 160, 83, 82, 38, 31, 199, 163, 83, 82, 38, + 31, 200, 31, 199, 163, 83, 82, 38, 31, 228, 163, 199, 163, 83, 82, 38, + 31, 216, 123, 251, 116, 6, 1, 251, 14, 251, 116, 6, 1, 237, 253, 251, + 116, 6, 1, 220, 182, 251, 116, 6, 1, 216, 136, 251, 116, 6, 1, 249, 3, + 251, 116, 6, 1, 203, 68, 251, 116, 6, 1, 210, 181, 251, 116, 6, 1, 248, + 49, 251, 116, 6, 1, 167, 251, 116, 6, 1, 71, 251, 116, 6, 1, 233, 97, + 251, 116, 6, 1, 70, 251, 116, 6, 1, 74, 251, 116, 6, 1, 237, 40, 251, + 116, 6, 1, 193, 23, 251, 116, 6, 1, 194, 119, 251, 116, 6, 1, 212, 230, + 251, 116, 6, 1, 222, 139, 251, 116, 6, 1, 168, 251, 116, 6, 1, 68, 251, + 116, 6, 1, 223, 11, 251, 116, 6, 1, 242, 215, 251, 116, 6, 1, 144, 251, + 116, 6, 1, 208, 237, 251, 116, 6, 1, 231, 233, 251, 116, 6, 1, 212, 201, + 251, 116, 6, 1, 198, 45, 251, 116, 6, 1, 214, 65, 251, 116, 6, 1, 196, + 157, 251, 116, 6, 1, 221, 250, 251, 116, 6, 1, 231, 172, 251, 116, 6, 1, + 192, 101, 251, 116, 6, 1, 221, 60, 251, 116, 6, 1, 204, 64, 251, 116, 2, + 1, 251, 14, 251, 116, 2, 1, 237, 253, 251, 116, 2, 1, 220, 182, 251, 116, + 2, 1, 216, 136, 251, 116, 2, 1, 249, 3, 251, 116, 2, 1, 203, 68, 251, + 116, 2, 1, 210, 181, 251, 116, 2, 1, 248, 49, 251, 116, 2, 1, 167, 251, + 116, 2, 1, 71, 251, 116, 2, 1, 233, 97, 251, 116, 2, 1, 70, 251, 116, 2, + 1, 74, 251, 116, 2, 1, 237, 40, 251, 116, 2, 1, 193, 23, 251, 116, 2, 1, + 194, 119, 251, 116, 2, 1, 212, 230, 251, 116, 2, 1, 222, 139, 251, 116, + 2, 1, 168, 251, 116, 2, 1, 68, 251, 116, 2, 1, 223, 11, 251, 116, 2, 1, + 242, 215, 251, 116, 2, 1, 144, 251, 116, 2, 1, 208, 237, 251, 116, 2, 1, + 231, 233, 251, 116, 2, 1, 212, 201, 251, 116, 2, 1, 198, 45, 251, 116, 2, + 1, 214, 65, 251, 116, 2, 1, 196, 157, 251, 116, 2, 1, 221, 250, 251, 116, + 2, 1, 231, 172, 251, 116, 2, 1, 192, 101, 251, 116, 2, 1, 221, 60, 251, + 116, 2, 1, 204, 64, 251, 116, 251, 15, 219, 250, 251, 116, 18, 219, 250, + 251, 116, 231, 146, 77, 251, 116, 230, 66, 251, 116, 116, 216, 75, 251, + 116, 231, 147, 116, 216, 75, 251, 116, 212, 241, 251, 116, 215, 48, 77, + 251, 116, 17, 192, 76, 251, 116, 17, 101, 251, 116, 17, 104, 251, 116, + 17, 133, 251, 116, 17, 134, 251, 116, 17, 151, 251, 116, 17, 170, 251, + 116, 17, 179, 251, 116, 17, 174, 251, 116, 17, 182, 251, 116, 88, 233, + 204, 77, 251, 116, 88, 208, 159, 77, 223, 174, 137, 31, 101, 223, 174, + 137, 31, 104, 223, 174, 137, 31, 133, 223, 174, 137, 31, 134, 223, 174, + 137, 31, 151, 223, 174, 137, 31, 170, 223, 174, 137, 31, 179, 223, 174, + 137, 31, 174, 223, 174, 137, 31, 182, 223, 174, 137, 31, 200, 30, 223, + 174, 137, 31, 197, 239, 223, 174, 137, 31, 199, 184, 223, 174, 137, 31, + 232, 126, 223, 174, 137, 31, 233, 3, 223, 174, 137, 31, 203, 25, 223, + 174, 137, 31, 204, 140, 223, 174, 137, 31, 234, 137, 223, 174, 137, 31, + 214, 11, 223, 174, 137, 31, 90, 228, 162, 223, 174, 137, 31, 103, 228, + 162, 223, 174, 137, 31, 112, 228, 162, 223, 174, 137, 31, 232, 119, 228, + 162, 223, 174, 137, 31, 232, 214, 228, 162, 223, 174, 137, 31, 203, 41, + 228, 162, 223, 174, 137, 31, 204, 146, 228, 162, 223, 174, 137, 31, 234, + 148, 228, 162, 223, 174, 137, 31, 214, 16, 228, 162, 223, 174, 137, 31, + 90, 180, 223, 174, 137, 31, 103, 180, 223, 174, 137, 31, 112, 180, 223, + 174, 137, 31, 232, 119, 180, 223, 174, 137, 31, 232, 214, 180, 223, 174, + 137, 31, 203, 41, 180, 223, 174, 137, 31, 204, 146, 180, 223, 174, 137, + 31, 234, 148, 180, 223, 174, 137, 31, 214, 16, 180, 223, 174, 137, 31, + 200, 31, 180, 223, 174, 137, 31, 197, 240, 180, 223, 174, 137, 31, 199, + 185, 180, 223, 174, 137, 31, 232, 127, 180, 223, 174, 137, 31, 233, 4, + 180, 223, 174, 137, 31, 203, 26, 180, 223, 174, 137, 31, 204, 141, 180, + 223, 174, 137, 31, 234, 138, 180, 223, 174, 137, 31, 214, 12, 180, 223, + 174, 137, 31, 220, 100, 223, 174, 137, 31, 220, 99, 223, 174, 137, 220, + 101, 77, 223, 174, 137, 31, 222, 94, 223, 174, 137, 31, 222, 93, 223, + 174, 137, 31, 209, 111, 101, 223, 174, 137, 31, 209, 111, 104, 223, 174, + 137, 31, 209, 111, 133, 223, 174, 137, 31, 209, 111, 134, 223, 174, 137, + 31, 209, 111, 151, 223, 174, 137, 31, 209, 111, 170, 223, 174, 137, 31, + 209, 111, 179, 223, 174, 137, 31, 209, 111, 174, 223, 174, 137, 31, 209, + 111, 182, 223, 174, 137, 209, 230, 223, 174, 137, 232, 109, 90, 208, 167, + 223, 174, 137, 232, 109, 90, 230, 78, 223, 174, 137, 232, 109, 112, 208, + 165, 223, 174, 137, 206, 186, 77, 223, 174, 137, 31, 250, 249, 101, 223, + 174, 137, 31, 250, 249, 104, 223, 174, 137, 31, 250, 249, 200, 31, 180, + 223, 174, 137, 250, 249, 220, 101, 77, 211, 132, 137, 31, 101, 211, 132, + 137, 31, 104, 211, 132, 137, 31, 133, 211, 132, 137, 31, 134, 211, 132, + 137, 31, 151, 211, 132, 137, 31, 170, 211, 132, 137, 31, 179, 211, 132, + 137, 31, 174, 211, 132, 137, 31, 182, 211, 132, 137, 31, 200, 30, 211, + 132, 137, 31, 197, 239, 211, 132, 137, 31, 199, 184, 211, 132, 137, 31, + 232, 126, 211, 132, 137, 31, 233, 3, 211, 132, 137, 31, 203, 25, 211, + 132, 137, 31, 204, 140, 211, 132, 137, 31, 234, 137, 211, 132, 137, 31, + 214, 11, 211, 132, 137, 31, 90, 228, 162, 211, 132, 137, 31, 103, 228, + 162, 211, 132, 137, 31, 112, 228, 162, 211, 132, 137, 31, 232, 119, 228, + 162, 211, 132, 137, 31, 232, 214, 228, 162, 211, 132, 137, 31, 203, 41, + 228, 162, 211, 132, 137, 31, 204, 146, 228, 162, 211, 132, 137, 31, 234, + 148, 228, 162, 211, 132, 137, 31, 214, 16, 228, 162, 211, 132, 137, 31, + 90, 180, 211, 132, 137, 31, 103, 180, 211, 132, 137, 31, 112, 180, 211, + 132, 137, 31, 232, 119, 180, 211, 132, 137, 31, 232, 214, 180, 211, 132, + 137, 31, 203, 41, 180, 211, 132, 137, 31, 204, 146, 180, 211, 132, 137, + 31, 234, 148, 180, 211, 132, 137, 31, 214, 16, 180, 211, 132, 137, 31, + 200, 31, 180, 211, 132, 137, 31, 197, 240, 180, 211, 132, 137, 31, 199, + 185, 180, 211, 132, 137, 31, 232, 127, 180, 211, 132, 137, 31, 233, 4, + 180, 211, 132, 137, 31, 203, 26, 180, 211, 132, 137, 31, 204, 141, 180, + 211, 132, 137, 31, 234, 138, 180, 211, 132, 137, 31, 214, 12, 180, 211, + 132, 137, 217, 120, 211, 132, 137, 250, 249, 31, 104, 211, 132, 137, 250, + 249, 31, 133, 211, 132, 137, 250, 249, 31, 134, 211, 132, 137, 250, 249, + 31, 151, 211, 132, 137, 250, 249, 31, 170, 211, 132, 137, 250, 249, 31, + 179, 211, 132, 137, 250, 249, 31, 174, 211, 132, 137, 250, 249, 31, 182, + 211, 132, 137, 250, 249, 31, 200, 30, 211, 132, 137, 250, 249, 31, 232, + 119, 228, 162, 211, 132, 137, 250, 249, 31, 203, 41, 228, 162, 211, 132, + 137, 250, 249, 31, 103, 180, 211, 132, 137, 250, 249, 31, 200, 31, 180, + 211, 132, 137, 232, 109, 90, 230, 78, 211, 132, 137, 232, 109, 90, 203, + 29, 9, 13, 251, 26, 9, 13, 248, 96, 9, 13, 223, 37, 9, 13, 237, 227, 9, + 13, 194, 119, 9, 13, 192, 103, 9, 13, 230, 89, 9, 13, 200, 151, 9, 13, + 193, 64, 9, 13, 222, 139, 9, 13, 220, 94, 9, 13, 217, 26, 9, 13, 213, + 123, 9, 13, 205, 201, 9, 13, 251, 57, 9, 13, 233, 34, 9, 13, 206, 86, 9, + 13, 208, 232, 9, 13, 207, 221, 9, 13, 204, 8, 9, 13, 200, 49, 9, 13, 199, + 220, 9, 13, 221, 245, 9, 13, 199, 232, 9, 13, 237, 250, 9, 13, 192, 106, + 9, 13, 231, 79, 9, 13, 236, 113, 248, 96, 9, 13, 236, 113, 213, 123, 9, + 13, 236, 113, 233, 34, 9, 13, 236, 113, 208, 232, 9, 13, 88, 248, 96, 9, + 13, 88, 223, 37, 9, 13, 88, 229, 220, 9, 13, 88, 230, 89, 9, 13, 88, 193, + 64, 9, 13, 88, 222, 139, 9, 13, 88, 220, 94, 9, 13, 88, 217, 26, 9, 13, + 88, 213, 123, 9, 13, 88, 205, 201, 9, 13, 88, 251, 57, 9, 13, 88, 233, + 34, 9, 13, 88, 206, 86, 9, 13, 88, 208, 232, 9, 13, 88, 204, 8, 9, 13, + 88, 200, 49, 9, 13, 88, 199, 220, 9, 13, 88, 221, 245, 9, 13, 88, 237, + 250, 9, 13, 88, 231, 79, 9, 13, 200, 146, 223, 37, 9, 13, 200, 146, 230, + 89, 9, 13, 200, 146, 193, 64, 9, 13, 200, 146, 220, 94, 9, 13, 200, 146, + 213, 123, 9, 13, 200, 146, 205, 201, 9, 13, 200, 146, 251, 57, 9, 13, + 200, 146, 206, 86, 9, 13, 200, 146, 208, 232, 9, 13, 200, 146, 204, 8, 9, + 13, 200, 146, 221, 245, 9, 13, 200, 146, 237, 250, 9, 13, 200, 146, 231, + 79, 9, 13, 200, 146, 236, 113, 213, 123, 9, 13, 200, 146, 236, 113, 208, + 232, 9, 13, 201, 216, 248, 96, 9, 13, 201, 216, 223, 37, 9, 13, 201, 216, + 229, 220, 9, 13, 201, 216, 230, 89, 9, 13, 201, 216, 200, 151, 9, 13, + 201, 216, 193, 64, 9, 13, 201, 216, 222, 139, 9, 13, 201, 216, 217, 26, + 9, 13, 201, 216, 213, 123, 9, 13, 201, 216, 205, 201, 9, 13, 201, 216, + 251, 57, 9, 13, 201, 216, 233, 34, 9, 13, 201, 216, 206, 86, 9, 13, 201, + 216, 208, 232, 9, 13, 201, 216, 204, 8, 9, 13, 201, 216, 200, 49, 9, 13, + 201, 216, 199, 220, 9, 13, 201, 216, 221, 245, 9, 13, 201, 216, 237, 250, + 9, 13, 201, 216, 192, 106, 9, 13, 201, 216, 231, 79, 9, 13, 201, 216, + 236, 113, 248, 96, 9, 13, 201, 216, 236, 113, 233, 34, 9, 13, 219, 68, + 251, 26, 9, 13, 219, 68, 248, 96, 9, 13, 219, 68, 223, 37, 9, 13, 219, + 68, 237, 227, 9, 13, 219, 68, 229, 220, 9, 13, 219, 68, 194, 119, 9, 13, + 219, 68, 192, 103, 9, 13, 219, 68, 230, 89, 9, 13, 219, 68, 200, 151, 9, + 13, 219, 68, 193, 64, 9, 13, 219, 68, 220, 94, 9, 13, 219, 68, 217, 26, + 9, 13, 219, 68, 213, 123, 9, 13, 219, 68, 205, 201, 9, 13, 219, 68, 251, + 57, 9, 13, 219, 68, 233, 34, 9, 13, 219, 68, 206, 86, 9, 13, 219, 68, + 208, 232, 9, 13, 219, 68, 207, 221, 9, 13, 219, 68, 204, 8, 9, 13, 219, + 68, 200, 49, 9, 13, 219, 68, 199, 220, 9, 13, 219, 68, 221, 245, 9, 13, + 219, 68, 199, 232, 9, 13, 219, 68, 237, 250, 9, 13, 219, 68, 192, 106, 9, + 13, 219, 68, 231, 79, 9, 13, 235, 102, 248, 96, 9, 13, 235, 102, 223, 37, + 9, 13, 235, 102, 237, 227, 9, 13, 235, 102, 194, 119, 9, 13, 235, 102, + 192, 103, 9, 13, 235, 102, 230, 89, 9, 13, 235, 102, 200, 151, 9, 13, + 235, 102, 193, 64, 9, 13, 235, 102, 220, 94, 9, 13, 235, 102, 217, 26, 9, + 13, 235, 102, 213, 123, 9, 13, 235, 102, 205, 201, 9, 13, 235, 102, 251, + 57, 9, 13, 235, 102, 233, 34, 9, 13, 235, 102, 206, 86, 9, 13, 235, 102, + 208, 232, 9, 13, 235, 102, 207, 221, 9, 13, 235, 102, 204, 8, 9, 13, 235, + 102, 200, 49, 9, 13, 235, 102, 199, 220, 9, 13, 235, 102, 221, 245, 9, + 13, 235, 102, 199, 232, 9, 13, 235, 102, 237, 250, 9, 13, 235, 102, 192, + 106, 9, 13, 235, 102, 231, 79, 9, 13, 211, 174, 91, 4, 176, 4, 200, 102, + 9, 13, 211, 174, 176, 4, 237, 227, 217, 182, 120, 234, 186, 194, 52, 217, + 182, 120, 202, 171, 194, 52, 217, 182, 120, 194, 91, 194, 52, 217, 182, + 120, 178, 194, 52, 217, 182, 120, 207, 237, 235, 84, 217, 182, 120, 230, + 201, 235, 84, 217, 182, 120, 62, 235, 84, 217, 182, 120, 90, 80, 243, 0, + 217, 182, 120, 103, 80, 243, 0, 217, 182, 120, 112, 80, 243, 0, 217, 182, + 120, 232, 119, 80, 243, 0, 217, 182, 120, 232, 214, 80, 243, 0, 217, 182, + 120, 203, 41, 80, 243, 0, 217, 182, 120, 204, 146, 80, 243, 0, 217, 182, + 120, 234, 148, 80, 243, 0, 217, 182, 120, 214, 16, 80, 243, 0, 217, 182, + 120, 90, 80, 248, 208, 217, 182, 120, 103, 80, 248, 208, 217, 182, 120, + 112, 80, 248, 208, 217, 182, 120, 232, 119, 80, 248, 208, 217, 182, 120, + 232, 214, 80, 248, 208, 217, 182, 120, 203, 41, 80, 248, 208, 217, 182, + 120, 204, 146, 80, 248, 208, 217, 182, 120, 234, 148, 80, 248, 208, 217, + 182, 120, 214, 16, 80, 248, 208, 217, 182, 120, 90, 80, 242, 127, 217, + 182, 120, 103, 80, 242, 127, 217, 182, 120, 112, 80, 242, 127, 217, 182, + 120, 232, 119, 80, 242, 127, 217, 182, 120, 232, 214, 80, 242, 127, 217, + 182, 120, 203, 41, 80, 242, 127, 217, 182, 120, 204, 146, 80, 242, 127, + 217, 182, 120, 234, 148, 80, 242, 127, 217, 182, 120, 214, 16, 80, 242, + 127, 217, 182, 120, 209, 210, 217, 182, 120, 211, 160, 217, 182, 120, + 248, 209, 217, 182, 120, 242, 169, 217, 182, 120, 202, 112, 217, 182, + 120, 201, 125, 217, 182, 120, 249, 250, 217, 182, 120, 194, 43, 217, 182, + 120, 222, 226, 217, 182, 120, 248, 252, 191, 191, 120, 229, 5, 248, 252, + 191, 191, 120, 229, 3, 191, 191, 120, 229, 2, 191, 191, 120, 229, 1, 191, + 191, 120, 229, 0, 191, 191, 120, 228, 255, 191, 191, 120, 228, 254, 191, + 191, 120, 228, 253, 191, 191, 120, 228, 252, 191, 191, 120, 228, 251, + 191, 191, 120, 228, 250, 191, 191, 120, 228, 249, 191, 191, 120, 228, + 248, 191, 191, 120, 228, 247, 191, 191, 120, 228, 246, 191, 191, 120, + 228, 245, 191, 191, 120, 228, 244, 191, 191, 120, 228, 243, 191, 191, + 120, 228, 242, 191, 191, 120, 228, 241, 191, 191, 120, 228, 240, 191, + 191, 120, 228, 239, 191, 191, 120, 228, 238, 191, 191, 120, 228, 237, + 191, 191, 120, 228, 236, 191, 191, 120, 228, 235, 191, 191, 120, 228, + 234, 191, 191, 120, 228, 233, 191, 191, 120, 228, 232, 191, 191, 120, + 228, 231, 191, 191, 120, 228, 230, 191, 191, 120, 228, 229, 191, 191, + 120, 228, 228, 191, 191, 120, 228, 227, 191, 191, 120, 228, 226, 191, + 191, 120, 228, 225, 191, 191, 120, 228, 224, 191, 191, 120, 228, 223, + 191, 191, 120, 228, 222, 191, 191, 120, 228, 221, 191, 191, 120, 228, + 220, 191, 191, 120, 228, 219, 191, 191, 120, 228, 218, 191, 191, 120, + 228, 217, 191, 191, 120, 228, 216, 191, 191, 120, 228, 215, 191, 191, + 120, 228, 214, 191, 191, 120, 228, 213, 191, 191, 120, 228, 212, 191, + 191, 120, 228, 211, 191, 191, 120, 84, 248, 252, 191, 191, 120, 196, 104, + 191, 191, 120, 196, 103, 191, 191, 120, 196, 102, 191, 191, 120, 196, + 101, 191, 191, 120, 196, 100, 191, 191, 120, 196, 99, 191, 191, 120, 196, + 98, 191, 191, 120, 196, 97, 191, 191, 120, 196, 96, 191, 191, 120, 196, + 95, 191, 191, 120, 196, 94, 191, 191, 120, 196, 93, 191, 191, 120, 196, + 92, 191, 191, 120, 196, 91, 191, 191, 120, 196, 90, 191, 191, 120, 196, + 89, 191, 191, 120, 196, 88, 191, 191, 120, 196, 87, 191, 191, 120, 196, + 86, 191, 191, 120, 196, 85, 191, 191, 120, 196, 84, 191, 191, 120, 196, + 83, 191, 191, 120, 196, 82, 191, 191, 120, 196, 81, 191, 191, 120, 196, + 80, 191, 191, 120, 196, 79, 191, 191, 120, 196, 78, 191, 191, 120, 196, + 77, 191, 191, 120, 196, 76, 191, 191, 120, 196, 75, 191, 191, 120, 196, + 74, 191, 191, 120, 196, 73, 191, 191, 120, 196, 72, 191, 191, 120, 196, + 71, 191, 191, 120, 196, 70, 191, 191, 120, 196, 69, 191, 191, 120, 196, + 68, 191, 191, 120, 196, 67, 191, 191, 120, 196, 66, 191, 191, 120, 196, + 65, 191, 191, 120, 196, 64, 191, 191, 120, 196, 63, 191, 191, 120, 196, + 62, 191, 191, 120, 196, 61, 191, 191, 120, 196, 60, 191, 191, 120, 196, + 59, 191, 191, 120, 196, 58, 191, 191, 120, 196, 57, 191, 191, 120, 196, + 56, 209, 220, 246, 216, 248, 252, 209, 220, 246, 216, 251, 136, 80, 202, + 157, 209, 220, 246, 216, 103, 80, 202, 157, 209, 220, 246, 216, 112, 80, + 202, 157, 209, 220, 246, 216, 232, 119, 80, 202, 157, 209, 220, 246, 216, + 232, 214, 80, 202, 157, 209, 220, 246, 216, 203, 41, 80, 202, 157, 209, + 220, 246, 216, 204, 146, 80, 202, 157, 209, 220, 246, 216, 234, 148, 80, + 202, 157, 209, 220, 246, 216, 214, 16, 80, 202, 157, 209, 220, 246, 216, + 200, 31, 80, 202, 157, 209, 220, 246, 216, 223, 60, 80, 202, 157, 209, + 220, 246, 216, 221, 123, 80, 202, 157, 209, 220, 246, 216, 208, 161, 80, + 202, 157, 209, 220, 246, 216, 221, 177, 80, 202, 157, 209, 220, 246, 216, + 251, 136, 80, 229, 231, 209, 220, 246, 216, 103, 80, 229, 231, 209, 220, + 246, 216, 112, 80, 229, 231, 209, 220, 246, 216, 232, 119, 80, 229, 231, + 209, 220, 246, 216, 232, 214, 80, 229, 231, 209, 220, 246, 216, 203, 41, + 80, 229, 231, 209, 220, 246, 216, 204, 146, 80, 229, 231, 209, 220, 246, + 216, 234, 148, 80, 229, 231, 209, 220, 246, 216, 214, 16, 80, 229, 231, + 209, 220, 246, 216, 200, 31, 80, 229, 231, 209, 220, 246, 216, 223, 60, + 80, 229, 231, 209, 220, 246, 216, 221, 123, 80, 229, 231, 209, 220, 246, + 216, 208, 161, 80, 229, 231, 209, 220, 246, 216, 221, 177, 80, 229, 231, + 209, 220, 246, 216, 207, 237, 222, 226, 209, 220, 246, 216, 251, 136, 80, + 237, 3, 209, 220, 246, 216, 103, 80, 237, 3, 209, 220, 246, 216, 112, 80, + 237, 3, 209, 220, 246, 216, 232, 119, 80, 237, 3, 209, 220, 246, 216, + 232, 214, 80, 237, 3, 209, 220, 246, 216, 203, 41, 80, 237, 3, 209, 220, + 246, 216, 204, 146, 80, 237, 3, 209, 220, 246, 216, 234, 148, 80, 237, 3, + 209, 220, 246, 216, 214, 16, 80, 237, 3, 209, 220, 246, 216, 200, 31, 80, + 237, 3, 209, 220, 246, 216, 223, 60, 80, 237, 3, 209, 220, 246, 216, 221, + 123, 80, 237, 3, 209, 220, 246, 216, 208, 161, 80, 237, 3, 209, 220, 246, + 216, 221, 177, 80, 237, 3, 209, 220, 246, 216, 60, 222, 226, 209, 220, + 246, 216, 251, 136, 80, 242, 69, 209, 220, 246, 216, 103, 80, 242, 69, + 209, 220, 246, 216, 112, 80, 242, 69, 209, 220, 246, 216, 232, 119, 80, + 242, 69, 209, 220, 246, 216, 232, 214, 80, 242, 69, 209, 220, 246, 216, + 203, 41, 80, 242, 69, 209, 220, 246, 216, 204, 146, 80, 242, 69, 209, + 220, 246, 216, 234, 148, 80, 242, 69, 209, 220, 246, 216, 214, 16, 80, + 242, 69, 209, 220, 246, 216, 200, 31, 80, 242, 69, 209, 220, 246, 216, + 223, 60, 80, 242, 69, 209, 220, 246, 216, 221, 123, 80, 242, 69, 209, + 220, 246, 216, 208, 161, 80, 242, 69, 209, 220, 246, 216, 221, 177, 80, + 242, 69, 209, 220, 246, 216, 62, 222, 226, 209, 220, 246, 216, 232, 150, + 209, 220, 246, 216, 198, 146, 209, 220, 246, 216, 198, 135, 209, 220, + 246, 216, 198, 132, 209, 220, 246, 216, 198, 131, 209, 220, 246, 216, + 198, 130, 209, 220, 246, 216, 198, 129, 209, 220, 246, 216, 198, 128, + 209, 220, 246, 216, 198, 127, 209, 220, 246, 216, 198, 126, 209, 220, + 246, 216, 198, 145, 209, 220, 246, 216, 198, 144, 209, 220, 246, 216, + 198, 143, 209, 220, 246, 216, 198, 142, 209, 220, 246, 216, 198, 141, + 209, 220, 246, 216, 198, 140, 209, 220, 246, 216, 198, 139, 209, 220, + 246, 216, 198, 138, 209, 220, 246, 216, 198, 137, 209, 220, 246, 216, + 198, 136, 209, 220, 246, 216, 198, 134, 209, 220, 246, 216, 198, 133, 17, + 192, 77, 232, 71, 201, 238, 17, 192, 77, 242, 38, 17, 90, 242, 38, 17, + 103, 242, 38, 17, 112, 242, 38, 17, 232, 119, 242, 38, 17, 232, 214, 242, + 38, 17, 203, 41, 242, 38, 17, 204, 146, 242, 38, 17, 234, 148, 242, 38, + 17, 214, 16, 242, 38, 236, 213, 47, 49, 17, 192, 76, 236, 213, 214, 199, + 47, 49, 17, 192, 76, 47, 192, 77, 4, 203, 4, 47, 250, 182, 54, 47, 236, + 127, 3, 4, 211, 115, 248, 247, 125, 8, 6, 1, 64, 125, 8, 6, 1, 249, 226, + 125, 8, 6, 1, 247, 52, 125, 8, 6, 1, 238, 95, 125, 8, 6, 1, 71, 125, 8, + 6, 1, 233, 163, 125, 8, 6, 1, 232, 44, 125, 8, 6, 1, 230, 124, 125, 8, 6, + 1, 70, 125, 8, 6, 1, 223, 65, 125, 8, 6, 1, 222, 184, 125, 8, 6, 1, 165, + 125, 8, 6, 1, 218, 236, 125, 8, 6, 1, 215, 151, 125, 8, 6, 1, 74, 125, 8, + 6, 1, 211, 93, 125, 8, 6, 1, 208, 247, 125, 8, 6, 1, 150, 125, 8, 6, 1, + 206, 158, 125, 8, 6, 1, 200, 228, 125, 8, 6, 1, 68, 125, 8, 6, 1, 196, + 236, 125, 8, 6, 1, 194, 202, 125, 8, 6, 1, 193, 223, 125, 8, 6, 1, 193, + 148, 125, 8, 6, 1, 192, 155, 198, 237, 204, 2, 247, 164, 8, 6, 1, 206, + 158, 47, 43, 8, 6, 1, 247, 52, 47, 43, 8, 6, 1, 150, 47, 246, 159, 47, + 193, 225, 238, 228, 109, 108, 8, 6, 1, 64, 108, 8, 6, 1, 249, 226, 108, + 8, 6, 1, 247, 52, 108, 8, 6, 1, 238, 95, 108, 8, 6, 1, 71, 108, 8, 6, 1, + 233, 163, 108, 8, 6, 1, 232, 44, 108, 8, 6, 1, 230, 124, 108, 8, 6, 1, + 70, 108, 8, 6, 1, 223, 65, 108, 8, 6, 1, 222, 184, 108, 8, 6, 1, 165, + 108, 8, 6, 1, 218, 236, 108, 8, 6, 1, 215, 151, 108, 8, 6, 1, 74, 108, 8, + 6, 1, 211, 93, 108, 8, 6, 1, 208, 247, 108, 8, 6, 1, 150, 108, 8, 6, 1, + 206, 158, 108, 8, 6, 1, 200, 228, 108, 8, 6, 1, 68, 108, 8, 6, 1, 196, + 236, 108, 8, 6, 1, 194, 202, 108, 8, 6, 1, 193, 223, 108, 8, 6, 1, 193, + 148, 108, 8, 6, 1, 192, 155, 108, 228, 148, 108, 215, 175, 108, 205, 225, + 108, 202, 95, 108, 209, 132, 108, 194, 112, 214, 199, 47, 8, 6, 1, 64, + 214, 199, 47, 8, 6, 1, 249, 226, 214, 199, 47, 8, 6, 1, 247, 52, 214, + 199, 47, 8, 6, 1, 238, 95, 214, 199, 47, 8, 6, 1, 71, 214, 199, 47, 8, 6, + 1, 233, 163, 214, 199, 47, 8, 6, 1, 232, 44, 214, 199, 47, 8, 6, 1, 230, + 124, 214, 199, 47, 8, 6, 1, 70, 214, 199, 47, 8, 6, 1, 223, 65, 214, 199, + 47, 8, 6, 1, 222, 184, 214, 199, 47, 8, 6, 1, 165, 214, 199, 47, 8, 6, 1, + 218, 236, 214, 199, 47, 8, 6, 1, 215, 151, 214, 199, 47, 8, 6, 1, 74, + 214, 199, 47, 8, 6, 1, 211, 93, 214, 199, 47, 8, 6, 1, 208, 247, 214, + 199, 47, 8, 6, 1, 150, 214, 199, 47, 8, 6, 1, 206, 158, 214, 199, 47, 8, + 6, 1, 200, 228, 214, 199, 47, 8, 6, 1, 68, 214, 199, 47, 8, 6, 1, 196, + 236, 214, 199, 47, 8, 6, 1, 194, 202, 214, 199, 47, 8, 6, 1, 193, 223, + 214, 199, 47, 8, 6, 1, 193, 148, 214, 199, 47, 8, 6, 1, 192, 155, 208, + 39, 217, 54, 57, 208, 39, 217, 51, 57, 208, 39, 215, 246, 57, 47, 246, + 182, 47, 247, 53, 4, 211, 115, 248, 247, 47, 228, 167, 233, 0, 214, 199, + 108, 8, 6, 1, 64, 214, 199, 108, 8, 6, 1, 249, 226, 214, 199, 108, 8, 6, + 1, 247, 52, 214, 199, 108, 8, 6, 1, 238, 95, 214, 199, 108, 8, 6, 1, 71, + 214, 199, 108, 8, 6, 1, 233, 163, 214, 199, 108, 8, 6, 1, 232, 44, 214, + 199, 108, 8, 6, 1, 230, 124, 214, 199, 108, 8, 6, 1, 70, 214, 199, 108, + 8, 6, 1, 223, 65, 214, 199, 108, 8, 6, 1, 222, 184, 214, 199, 108, 8, 6, + 1, 165, 214, 199, 108, 8, 6, 1, 218, 236, 214, 199, 108, 8, 6, 1, 215, + 151, 214, 199, 108, 8, 6, 1, 74, 214, 199, 108, 8, 6, 1, 211, 93, 214, + 199, 108, 8, 6, 1, 208, 247, 214, 199, 108, 8, 6, 1, 150, 214, 199, 108, + 8, 6, 1, 206, 158, 214, 199, 108, 8, 6, 1, 200, 228, 214, 199, 108, 8, 6, + 1, 68, 214, 199, 108, 8, 6, 1, 196, 236, 214, 199, 108, 8, 6, 1, 194, + 202, 214, 199, 108, 8, 6, 1, 193, 223, 214, 199, 108, 8, 6, 1, 193, 148, + 214, 199, 108, 8, 6, 1, 192, 155, 238, 180, 214, 199, 108, 8, 6, 1, 211, + 93, 214, 199, 108, 228, 51, 214, 199, 108, 166, 214, 199, 108, 188, 214, + 199, 108, 251, 238, 214, 199, 108, 194, 112, 50, 236, 166, 108, 242, 111, + 108, 238, 235, 108, 232, 99, 108, 228, 42, 108, 214, 176, 108, 214, 167, + 108, 211, 231, 108, 202, 178, 108, 130, 4, 233, 204, 77, 108, 195, 226, + 108, 112, 238, 95, 108, 205, 212, 205, 231, 108, 103, 222, 184, 108, 232, + 119, 222, 184, 108, 234, 148, 222, 184, 108, 232, 214, 209, 192, 101, + 108, 204, 146, 209, 192, 101, 108, 197, 228, 209, 192, 104, 108, 203, 26, + 211, 93, 108, 90, 228, 163, 197, 240, 211, 93, 108, 8, 2, 1, 238, 95, + 108, 230, 2, 108, 230, 1, 108, 229, 170, 108, 219, 61, 108, 203, 144, + 108, 197, 96, 108, 195, 249, 217, 107, 194, 9, 109, 207, 229, 223, 173, + 16, 1, 64, 207, 229, 223, 173, 16, 1, 249, 226, 207, 229, 223, 173, 16, + 1, 247, 52, 207, 229, 223, 173, 16, 1, 238, 95, 207, 229, 223, 173, 16, + 1, 71, 207, 229, 223, 173, 16, 1, 233, 163, 207, 229, 223, 173, 16, 1, + 232, 44, 207, 229, 223, 173, 16, 1, 230, 124, 207, 229, 223, 173, 16, 1, + 70, 207, 229, 223, 173, 16, 1, 223, 65, 207, 229, 223, 173, 16, 1, 222, + 184, 207, 229, 223, 173, 16, 1, 165, 207, 229, 223, 173, 16, 1, 218, 236, + 207, 229, 223, 173, 16, 1, 215, 151, 207, 229, 223, 173, 16, 1, 74, 207, + 229, 223, 173, 16, 1, 211, 93, 207, 229, 223, 173, 16, 1, 208, 247, 207, + 229, 223, 173, 16, 1, 150, 207, 229, 223, 173, 16, 1, 206, 158, 207, 229, + 223, 173, 16, 1, 200, 228, 207, 229, 223, 173, 16, 1, 68, 207, 229, 223, + 173, 16, 1, 196, 236, 207, 229, 223, 173, 16, 1, 194, 202, 207, 229, 223, + 173, 16, 1, 193, 223, 207, 229, 223, 173, 16, 1, 193, 148, 207, 229, 223, + 173, 16, 1, 192, 155, 50, 229, 140, 229, 29, 108, 75, 221, 96, 108, 75, + 188, 108, 12, 197, 59, 225, 242, 108, 12, 197, 59, 225, 246, 108, 12, + 197, 59, 225, 254, 108, 75, 237, 116, 108, 12, 197, 59, 226, 5, 108, 12, + 197, 59, 225, 248, 108, 12, 197, 59, 225, 220, 108, 12, 197, 59, 225, + 247, 108, 12, 197, 59, 226, 4, 108, 12, 197, 59, 225, 234, 108, 12, 197, + 59, 225, 227, 108, 12, 197, 59, 225, 236, 108, 12, 197, 59, 226, 1, 108, + 12, 197, 59, 225, 243, 108, 12, 197, 59, 226, 3, 108, 12, 197, 59, 225, + 235, 108, 12, 197, 59, 226, 2, 108, 12, 197, 59, 225, 221, 108, 12, 197, + 59, 225, 226, 108, 12, 197, 59, 225, 219, 108, 12, 197, 59, 225, 249, + 108, 12, 197, 59, 225, 251, 108, 12, 197, 59, 225, 229, 108, 12, 197, 59, + 225, 240, 108, 12, 197, 59, 225, 238, 108, 12, 197, 59, 226, 8, 108, 12, + 197, 59, 226, 7, 108, 12, 197, 59, 225, 217, 108, 12, 197, 59, 225, 244, + 108, 12, 197, 59, 226, 6, 108, 12, 197, 59, 225, 253, 108, 12, 197, 59, + 225, 239, 108, 12, 197, 59, 225, 218, 108, 12, 197, 59, 225, 241, 108, + 12, 197, 59, 225, 223, 108, 12, 197, 59, 225, 222, 108, 12, 197, 59, 225, + 252, 108, 12, 197, 59, 225, 230, 108, 12, 197, 59, 225, 232, 108, 12, + 197, 59, 225, 233, 108, 12, 197, 59, 225, 225, 108, 12, 197, 59, 226, 0, + 108, 12, 197, 59, 225, 250, 108, 12, 197, 59, 225, 216, 198, 237, 204, 2, + 247, 164, 12, 197, 59, 225, 231, 198, 237, 204, 2, 247, 164, 12, 197, 59, + 226, 7, 198, 237, 204, 2, 247, 164, 12, 197, 59, 226, 5, 198, 237, 204, + 2, 247, 164, 12, 197, 59, 225, 245, 198, 237, 204, 2, 247, 164, 12, 197, + 59, 225, 228, 198, 237, 204, 2, 247, 164, 12, 197, 59, 225, 241, 198, + 237, 204, 2, 247, 164, 12, 197, 59, 225, 224, 198, 237, 204, 2, 247, 164, + 12, 197, 59, 225, 255, 198, 237, 204, 2, 247, 164, 12, 197, 59, 225, 237, + 47, 228, 39, 251, 110, 47, 228, 39, 251, 141, 207, 7, 16, 39, 232, 77, + 207, 7, 16, 39, 219, 36, 207, 7, 16, 39, 203, 178, 207, 7, 16, 39, 193, + 196, 207, 7, 16, 39, 203, 161, 207, 7, 16, 39, 247, 7, 238, 106, 232, + 162, 242, 84, 197, 81, 214, 32, 4, 202, 16, 201, 118, 136, 216, 8, 201, + 117, 242, 115, 250, 27, 235, 35, 201, 116, 136, 247, 111, 208, 40, 247, + 143, 250, 27, 214, 31, 194, 130, 194, 124, 195, 242, 216, 128, 194, 114, + 234, 190, 231, 7, 233, 220, 234, 190, 231, 7, 250, 232, 234, 190, 231, 7, + 250, 46, 231, 7, 4, 216, 252, 214, 177, 216, 30, 109, 194, 116, 238, 194, + 216, 30, 109, 232, 226, 208, 168, 216, 30, 109, 194, 116, 231, 42, 216, + 30, 109, 232, 71, 216, 30, 109, 194, 144, 231, 42, 216, 30, 109, 220, 66, + 208, 168, 216, 30, 109, 194, 144, 238, 194, 216, 30, 109, 238, 194, 216, + 29, 214, 177, 216, 30, 4, 233, 91, 232, 226, 208, 168, 216, 30, 4, 233, + 91, 220, 66, 208, 168, 216, 30, 4, 233, 91, 232, 71, 216, 30, 4, 233, 91, + 201, 124, 4, 233, 91, 231, 3, 202, 19, 203, 200, 202, 19, 199, 212, 60, + 235, 70, 62, 201, 123, 62, 201, 124, 4, 2, 242, 75, 62, 201, 124, 248, + 93, 242, 75, 62, 201, 124, 248, 93, 242, 76, 4, 208, 41, 242, 76, 4, 208, + 41, 242, 76, 4, 202, 218, 242, 76, 4, 219, 192, 242, 76, 4, 198, 241, + 232, 163, 194, 53, 247, 225, 233, 91, 228, 202, 236, 134, 200, 158, 247, + 87, 242, 223, 205, 203, 233, 214, 198, 195, 237, 109, 198, 195, 211, 41, + 198, 195, 247, 12, 228, 202, 210, 135, 198, 29, 242, 227, 247, 228, 207, + 20, 229, 169, 201, 121, 247, 228, 234, 194, 80, 217, 171, 234, 194, 80, + 207, 139, 229, 203, 232, 119, 220, 38, 242, 74, 217, 139, 220, 37, 233, + 72, 220, 37, 220, 38, 232, 170, 223, 191, 194, 52, 215, 186, 199, 22, + 250, 7, 230, 218, 217, 14, 194, 128, 200, 119, 220, 5, 248, 204, 210, 0, + 207, 237, 250, 144, 230, 201, 250, 144, 210, 174, 210, 178, 242, 228, + 201, 221, 230, 71, 202, 252, 80, 209, 236, 217, 41, 211, 212, 247, 207, + 209, 144, 220, 16, 207, 140, 238, 200, 207, 140, 248, 217, 238, 238, 207, + 139, 238, 134, 26, 207, 139, 202, 2, 247, 177, 202, 156, 247, 156, 232, + 97, 232, 93, 207, 45, 201, 71, 209, 147, 237, 205, 212, 2, 201, 90, 232, + 94, 203, 170, 232, 225, 247, 6, 4, 201, 63, 237, 52, 202, 198, 228, 50, + 238, 198, 204, 20, 228, 49, 228, 50, 238, 198, 235, 99, 238, 237, 242, + 186, 161, 246, 233, 219, 88, 238, 125, 229, 18, 209, 149, 203, 184, 248, + 73, 247, 173, 209, 150, 80, 232, 151, 238, 236, 232, 140, 26, 221, 124, + 200, 67, 194, 39, 230, 40, 206, 70, 247, 190, 26, 238, 148, 194, 49, 231, + 11, 242, 58, 231, 11, 198, 150, 235, 77, 248, 104, 215, 226, 242, 91, + 248, 104, 215, 225, 248, 255, 247, 189, 232, 140, 26, 221, 125, 4, 209, + 221, 247, 190, 4, 209, 165, 238, 225, 209, 167, 207, 141, 193, 255, 209, + 106, 248, 10, 247, 5, 223, 59, 242, 176, 198, 195, 233, 55, 242, 175, + 232, 228, 232, 229, 202, 154, 248, 215, 210, 219, 209, 166, 239, 18, 248, + 217, 200, 123, 198, 195, 238, 180, 232, 200, 210, 1, 237, 106, 223, 50, + 236, 126, 246, 205, 201, 220, 194, 53, 242, 202, 216, 30, 196, 25, 246, + 124, 205, 244, 206, 18, 230, 224, 246, 226, 229, 234, 4, 199, 74, 211, + 212, 199, 225, 220, 28, 247, 183, 80, 232, 174, 216, 130, 217, 37, 207, + 208, 207, 141, 35, 222, 0, 4, 223, 58, 201, 191, 216, 164, 219, 228, 202, + 250, 238, 243, 221, 118, 248, 119, 250, 57, 35, 213, 100, 248, 119, 237, + 58, 35, 213, 100, 232, 244, 232, 103, 251, 114, 199, 115, 246, 206, 228, + 204, 233, 21, 194, 79, 207, 33, 242, 61, 232, 220, 209, 183, 26, 232, + 224, 216, 164, 215, 250, 246, 247, 242, 134, 229, 241, 250, 66, 211, 45, + 198, 249, 230, 18, 242, 120, 200, 22, 199, 116, 242, 106, 247, 216, 210, + 128, 250, 64, 196, 35, 231, 207, 236, 206, 229, 137, 202, 243, 217, 216, + 248, 23, 231, 208, 236, 252, 247, 176, 232, 176, 209, 220, 246, 214, 35, + 213, 105, 215, 216, 35, 213, 100, 206, 2, 230, 169, 35, 221, 255, 198, + 125, 196, 13, 35, 205, 236, 206, 192, 203, 215, 4, 206, 21, 200, 27, 208, + 60, 26, 248, 217, 203, 15, 26, 203, 15, 247, 200, 248, 174, 26, 229, 11, + 242, 229, 232, 206, 202, 217, 206, 193, 201, 95, 202, 118, 217, 37, 198, + 151, 228, 205, 208, 61, 250, 233, 232, 148, 206, 206, 232, 148, 201, 66, + 194, 96, 219, 197, 230, 244, 208, 62, 216, 16, 208, 62, 246, 217, 238, + 191, 248, 171, 26, 248, 217, 195, 241, 233, 10, 229, 32, 201, 250, 26, + 248, 217, 228, 50, 229, 32, 201, 250, 26, 209, 43, 200, 165, 200, 27, + 211, 64, 26, 248, 217, 202, 219, 246, 222, 216, 9, 246, 245, 248, 122, 4, + 197, 81, 247, 113, 239, 1, 228, 194, 247, 111, 242, 114, 237, 62, 228, + 194, 247, 112, 242, 104, 247, 112, 237, 54, 237, 55, 223, 89, 215, 44, + 210, 226, 202, 30, 228, 194, 247, 112, 228, 194, 4, 231, 191, 211, 249, + 247, 112, 223, 50, 209, 155, 211, 248, 233, 219, 209, 155, 211, 248, 228, + 203, 248, 198, 249, 252, 200, 37, 217, 216, 228, 199, 219, 53, 228, 199, + 238, 241, 201, 234, 205, 243, 237, 65, 201, 234, 233, 80, 223, 70, 220, + 78, 223, 50, 246, 195, 233, 219, 246, 195, 62, 210, 148, 60, 210, 148, + 194, 122, 62, 232, 206, 194, 122, 60, 232, 206, 207, 19, 60, 207, 19, + 220, 176, 248, 238, 208, 60, 26, 203, 147, 247, 181, 26, 54, 250, 228, + 234, 94, 73, 232, 215, 197, 204, 234, 94, 73, 232, 215, 197, 201, 234, + 94, 73, 232, 215, 197, 199, 234, 94, 73, 232, 215, 197, 197, 234, 94, 73, + 232, 215, 197, 195, 208, 22, 216, 6, 211, 103, 194, 130, 247, 117, 238, + 205, 199, 108, 219, 245, 208, 64, 246, 193, 235, 84, 238, 189, 194, 82, + 202, 226, 202, 224, 228, 204, 208, 34, 230, 250, 204, 6, 216, 49, 207, + 23, 242, 213, 236, 134, 210, 14, 247, 218, 234, 115, 212, 5, 202, 133, + 204, 1, 247, 116, 250, 186, 229, 17, 220, 167, 248, 102, 232, 224, 198, + 150, 232, 224, 247, 226, 198, 6, 230, 16, 242, 214, 248, 255, 242, 214, + 232, 87, 248, 255, 242, 214, 248, 13, 210, 150, 221, 107, 209, 171, 235, + 74, 246, 249, 248, 243, 246, 249, 236, 125, 216, 7, 233, 91, 238, 206, + 233, 91, 199, 109, 233, 91, 208, 65, 233, 91, 246, 194, 233, 91, 235, 85, + 233, 91, 202, 116, 194, 82, 228, 205, 233, 91, 216, 50, 233, 91, 236, + 135, 233, 91, 210, 15, 233, 91, 232, 91, 233, 91, 230, 68, 233, 91, 194, + 26, 233, 91, 248, 117, 233, 91, 211, 21, 233, 91, 210, 15, 213, 112, 210, + 194, 209, 92, 242, 197, 233, 173, 233, 181, 234, 193, 213, 112, 216, 4, + 199, 0, 62, 130, 209, 188, 248, 250, 223, 176, 62, 142, 209, 188, 248, + 250, 223, 176, 62, 46, 209, 188, 248, 250, 223, 176, 62, 51, 209, 188, + 248, 250, 223, 176, 232, 218, 230, 63, 57, 194, 122, 230, 63, 57, 211, + 232, 230, 63, 57, 199, 146, 130, 57, 199, 146, 142, 57, 242, 105, 230, + 38, 57, 211, 184, 230, 38, 57, 238, 174, 194, 22, 230, 18, 233, 176, 214, + 204, 200, 226, 223, 40, 235, 79, 221, 180, 248, 26, 194, 22, 242, 77, + 209, 23, 230, 42, 209, 145, 217, 148, 203, 207, 250, 22, 203, 207, 229, + 154, 203, 207, 194, 22, 206, 37, 194, 22, 247, 199, 232, 146, 247, 79, + 223, 191, 203, 91, 247, 78, 223, 191, 203, 91, 247, 171, 231, 23, 217, + 160, 194, 23, 233, 69, 217, 161, 26, 194, 24, 229, 26, 230, 37, 103, 217, + 6, 229, 26, 230, 37, 103, 194, 21, 229, 26, 230, 37, 209, 180, 211, 247, + 194, 24, 4, 247, 97, 234, 191, 247, 144, 4, 196, 114, 210, 117, 4, 247, + 230, 230, 86, 217, 161, 4, 230, 183, 210, 52, 217, 143, 217, 161, 4, 198, + 14, 211, 224, 217, 160, 211, 224, 194, 23, 248, 254, 239, 2, 194, 7, 209, + 97, 223, 50, 211, 242, 223, 50, 230, 249, 231, 54, 248, 255, 250, 212, + 233, 186, 251, 16, 251, 17, 216, 39, 223, 196, 203, 10, 223, 165, 237, + 51, 210, 116, 230, 177, 237, 210, 219, 158, 215, 69, 209, 179, 233, 92, + 217, 104, 230, 85, 248, 192, 209, 182, 200, 247, 210, 7, 221, 161, 77, + 219, 53, 219, 235, 207, 81, 231, 148, 201, 240, 221, 160, 247, 182, 238, + 209, 4, 229, 233, 194, 103, 248, 113, 229, 233, 247, 136, 229, 233, 103, + 229, 231, 202, 152, 229, 233, 230, 193, 229, 233, 229, 234, 4, 54, 247, + 224, 229, 233, 230, 201, 229, 233, 193, 62, 229, 233, 209, 24, 229, 233, + 229, 234, 4, 207, 141, 207, 162, 229, 231, 229, 234, 237, 106, 237, 5, + 204, 34, 4, 41, 78, 223, 145, 234, 119, 152, 247, 109, 250, 211, 109, + 247, 208, 202, 255, 109, 242, 49, 109, 202, 127, 201, 73, 109, 235, 70, + 237, 186, 109, 210, 8, 80, 209, 172, 232, 188, 248, 38, 236, 167, 109, + 202, 144, 248, 215, 199, 166, 248, 215, 62, 232, 175, 228, 163, 209, 186, + 109, 216, 54, 248, 236, 238, 137, 233, 206, 87, 236, 127, 57, 238, 196, + 246, 215, 248, 197, 4, 193, 60, 57, 248, 197, 4, 236, 127, 57, 248, 197, + 4, 233, 222, 57, 248, 197, 4, 209, 143, 57, 216, 54, 4, 194, 47, 242, + 253, 4, 197, 30, 198, 191, 26, 193, 60, 57, 205, 215, 210, 115, 239, 23, + 247, 142, 216, 118, 232, 180, 236, 192, 211, 167, 236, 198, 235, 30, 232, + 251, 232, 160, 211, 184, 232, 251, 232, 160, 211, 62, 4, 238, 142, 211, + 62, 233, 84, 197, 41, 246, 255, 200, 64, 246, 255, 246, 216, 223, 176, + 242, 253, 4, 197, 30, 198, 190, 242, 253, 4, 235, 92, 198, 190, 248, 194, + 242, 252, 242, 90, 209, 19, 207, 9, 209, 19, 210, 250, 201, 230, 206, + 200, 198, 182, 206, 200, 247, 204, 200, 163, 220, 33, 213, 103, 213, 104, + 4, 237, 105, 238, 208, 242, 84, 247, 205, 211, 184, 247, 205, 230, 201, + 247, 205, 247, 224, 247, 205, 211, 162, 247, 205, 247, 202, 215, 63, 248, + 240, 205, 228, 217, 7, 200, 42, 207, 251, 211, 60, 233, 52, 217, 216, + 206, 17, 250, 183, 209, 44, 251, 122, 219, 55, 242, 237, 217, 19, 211, + 124, 198, 199, 223, 187, 198, 199, 211, 69, 234, 246, 109, 223, 184, 234, + 52, 234, 53, 4, 235, 92, 61, 58, 242, 84, 217, 177, 4, 219, 46, 232, 206, + 242, 84, 217, 177, 4, 208, 39, 232, 206, 211, 184, 217, 177, 4, 208, 39, + 232, 206, 211, 184, 217, 177, 4, 219, 46, 232, 206, 209, 152, 209, 153, + 228, 208, 214, 172, 216, 83, 210, 60, 216, 83, 210, 61, 4, 94, 61, 250, + 27, 220, 28, 196, 38, 216, 82, 216, 83, 210, 61, 211, 250, 213, 143, 216, + 83, 210, 59, 250, 184, 4, 248, 182, 246, 247, 246, 248, 4, 232, 197, 196, + 35, 246, 247, 200, 39, 208, 55, 196, 34, 232, 244, 209, 78, 209, 162, + 201, 252, 209, 120, 248, 121, 197, 224, 94, 250, 73, 242, 86, 94, 26, + 114, 211, 184, 242, 131, 250, 73, 242, 86, 94, 26, 114, 211, 184, 242, + 131, 250, 74, 4, 47, 90, 211, 110, 242, 86, 235, 92, 26, 197, 30, 211, + 184, 242, 131, 250, 73, 250, 182, 235, 92, 26, 197, 30, 211, 184, 242, + 131, 250, 73, 132, 247, 140, 109, 139, 247, 140, 109, 202, 149, 4, 246, + 240, 111, 202, 148, 202, 149, 4, 90, 202, 174, 194, 124, 202, 149, 4, + 112, 202, 174, 194, 123, 248, 164, 234, 119, 209, 212, 220, 23, 217, 189, + 231, 11, 207, 96, 217, 189, 231, 11, 219, 99, 4, 223, 157, 210, 154, 242, + 84, 219, 99, 4, 222, 1, 222, 1, 219, 98, 211, 184, 219, 98, 248, 86, 248, + 87, 4, 246, 240, 111, 247, 203, 219, 166, 109, 208, 56, 247, 72, 248, + 253, 4, 114, 61, 58, 234, 80, 4, 114, 61, 58, 211, 212, 4, 233, 204, 122, + 4, 46, 51, 61, 58, 202, 182, 4, 94, 61, 58, 198, 249, 4, 197, 30, 61, 58, + 213, 143, 90, 197, 69, 234, 146, 109, 221, 254, 200, 30, 223, 151, 16, + 39, 8, 6, 219, 234, 223, 151, 16, 39, 8, 2, 219, 234, 223, 151, 16, 39, + 212, 235, 223, 151, 16, 39, 201, 5, 223, 151, 16, 39, 8, 219, 234, 232, + 231, 234, 119, 198, 244, 193, 253, 230, 69, 212, 218, 26, 247, 210, 229, + 33, 209, 242, 216, 163, 200, 40, 238, 164, 248, 217, 203, 41, 209, 190, + 202, 20, 4, 85, 236, 114, 223, 50, 16, 39, 248, 99, 198, 180, 234, 96, + 60, 50, 247, 72, 62, 50, 247, 72, 220, 73, 207, 237, 242, 130, 220, 73, + 247, 224, 242, 130, 220, 73, 211, 162, 237, 4, 220, 73, 247, 224, 237, 4, + 2, 211, 162, 237, 4, 2, 247, 224, 237, 4, 197, 40, 207, 237, 198, 185, + 235, 95, 207, 237, 198, 185, 197, 40, 2, 207, 237, 198, 185, 235, 95, 2, + 207, 237, 198, 185, 106, 51, 204, 50, 62, 242, 130, 113, 51, 204, 50, 62, + 242, 130, 47, 238, 184, 209, 176, 238, 184, 209, 177, 4, 230, 75, 63, + 238, 184, 209, 176, 213, 107, 46, 204, 183, 4, 112, 236, 111, 213, 107, + 51, 204, 183, 4, 112, 236, 111, 16, 39, 217, 121, 246, 102, 62, 8, 238, + 183, 87, 8, 238, 183, 246, 142, 238, 183, 211, 220, 109, 235, 98, 80, + 210, 179, 222, 157, 216, 22, 200, 255, 217, 2, 4, 214, 16, 247, 159, 247, + 178, 80, 228, 113, 242, 88, 233, 92, 90, 212, 11, 242, 88, 233, 92, 103, + 212, 11, 242, 88, 233, 92, 112, 212, 11, 242, 88, 233, 92, 232, 119, 212, + 11, 242, 88, 233, 92, 232, 214, 212, 11, 242, 88, 233, 92, 203, 41, 212, + 11, 242, 88, 233, 92, 204, 146, 212, 11, 242, 88, 233, 92, 234, 148, 212, + 11, 242, 88, 233, 92, 214, 16, 212, 11, 242, 88, 233, 92, 200, 31, 212, + 11, 242, 88, 233, 92, 234, 112, 212, 11, 242, 88, 233, 92, 197, 245, 212, + 11, 242, 88, 233, 92, 211, 204, 242, 88, 233, 92, 197, 218, 242, 88, 233, + 92, 199, 152, 242, 88, 233, 92, 232, 115, 242, 88, 233, 92, 232, 212, + 242, 88, 233, 92, 203, 37, 242, 88, 233, 92, 204, 145, 242, 88, 233, 92, + 234, 147, 242, 88, 233, 92, 214, 15, 242, 88, 233, 92, 200, 29, 242, 88, + 233, 92, 234, 110, 242, 88, 233, 92, 197, 243, 51, 202, 148, 51, 202, + 149, 4, 90, 202, 174, 194, 124, 51, 202, 149, 4, 112, 202, 174, 194, 123, + 247, 104, 247, 105, 4, 202, 174, 194, 123, 207, 79, 248, 86, 247, 205, + 246, 238, 217, 145, 242, 87, 60, 203, 11, 26, 238, 181, 213, 143, 209, + 248, 229, 25, 217, 161, 223, 191, 247, 81, 201, 137, 219, 227, 202, 253, + 211, 164, 202, 107, 237, 191, 201, 119, 202, 136, 202, 137, 194, 104, + 222, 215, 217, 161, 237, 209, 46, 230, 63, 200, 42, 207, 251, 200, 42, + 207, 252, 4, 211, 61, 51, 230, 63, 200, 42, 207, 251, 62, 198, 230, 200, + 41, 60, 198, 230, 200, 41, 200, 42, 211, 212, 198, 249, 80, 216, 79, 242, + 109, 216, 83, 210, 60, 248, 253, 80, 234, 52, 202, 26, 234, 52, 234, 53, + 4, 219, 192, 232, 167, 234, 52, 210, 155, 136, 202, 26, 234, 52, 219, + 165, 210, 249, 60, 209, 19, 106, 46, 210, 153, 106, 46, 248, 211, 210, + 154, 106, 46, 232, 121, 210, 154, 106, 46, 211, 54, 106, 46, 238, 199, + 46, 193, 247, 230, 62, 163, 211, 232, 230, 63, 57, 208, 39, 230, 63, 4, + 232, 236, 202, 126, 207, 168, 208, 39, 230, 63, 4, 232, 236, 202, 126, + 207, 168, 199, 146, 130, 57, 207, 168, 199, 146, 142, 57, 207, 168, 196, + 37, 230, 62, 207, 168, 230, 63, 4, 85, 232, 241, 233, 192, 208, 39, 230, + 63, 4, 210, 224, 248, 61, 85, 26, 207, 82, 232, 235, 62, 142, 209, 188, + 46, 230, 63, 223, 176, 203, 109, 62, 46, 209, 188, 223, 176, 203, 109, + 62, 51, 209, 188, 223, 176, 203, 109, 60, 46, 209, 188, 223, 176, 203, + 109, 60, 51, 209, 188, 223, 176, 60, 46, 209, 188, 248, 250, 223, 176, + 60, 51, 209, 188, 248, 250, 223, 176, 203, 109, 62, 130, 209, 188, 223, + 176, 203, 109, 62, 142, 209, 188, 223, 176, 203, 109, 60, 130, 209, 188, + 223, 176, 203, 109, 60, 142, 209, 188, 223, 176, 60, 130, 209, 188, 248, + 250, 223, 176, 60, 142, 209, 188, 248, 250, 223, 176, 60, 229, 233, 237, + 50, 239, 23, 222, 0, 26, 216, 6, 112, 214, 181, 239, 22, 209, 93, 209, + 196, 247, 1, 60, 230, 26, 204, 2, 232, 180, 236, 192, 62, 230, 26, 204, + 2, 232, 180, 236, 192, 202, 198, 204, 2, 232, 180, 236, 192, 200, 115, + 246, 199, 194, 42, 221, 255, 90, 247, 73, 216, 6, 103, 247, 73, 216, 6, + 112, 247, 73, 216, 6, 198, 221, 40, 210, 115, 239, 23, 230, 26, 236, 192, + 205, 231, 209, 94, 228, 43, 233, 52, 228, 43, 211, 167, 236, 199, 228, + 43, 236, 140, 4, 199, 244, 236, 140, 4, 199, 245, 26, 210, 44, 236, 140, + 4, 210, 44, 232, 105, 4, 210, 44, 232, 105, 4, 199, 88, 232, 105, 4, 250, + 225, 193, 223, 60, 232, 160, 232, 160, 211, 184, 232, 160, 246, 216, 140, + 236, 176, 246, 216, 232, 251, 247, 173, 232, 251, 247, 14, 234, 90, 213, + 105, 234, 90, 213, 106, 211, 61, 234, 90, 213, 106, 211, 67, 213, 105, + 213, 106, 211, 61, 213, 106, 211, 67, 234, 90, 236, 139, 234, 90, 211, + 61, 234, 90, 211, 59, 236, 139, 211, 61, 211, 59, 194, 134, 202, 133, + 213, 106, 211, 67, 202, 133, 247, 0, 211, 67, 237, 50, 194, 51, 216, 115, + 217, 93, 211, 113, 242, 86, 51, 26, 46, 204, 183, 250, 73, 246, 240, 193, + 223, 223, 182, 232, 153, 203, 21, 109, 237, 104, 232, 153, 203, 21, 109, + 239, 24, 40, 222, 1, 207, 34, 214, 172, 211, 62, 4, 47, 199, 244, 201, + 242, 242, 252, 237, 239, 221, 124, 219, 159, 202, 147, 229, 246, 223, + 191, 203, 91, 112, 208, 13, 58, 112, 208, 13, 63, 112, 208, 13, 220, 28, + 112, 208, 13, 207, 101, 46, 202, 144, 247, 122, 51, 202, 144, 247, 122, + 103, 202, 144, 247, 121, 112, 202, 144, 247, 121, 46, 199, 166, 247, 122, + 51, 199, 166, 247, 122, 46, 250, 211, 247, 122, 51, 250, 211, 247, 122, + 216, 34, 247, 122, 219, 193, 216, 34, 247, 122, 219, 193, 216, 33, 248, + 213, 105, 4, 248, 212, 248, 213, 27, 193, 223, 248, 213, 105, 4, 27, 193, + 223, 248, 213, 28, 27, 193, 223, 248, 213, 105, 4, 28, 27, 193, 223, 152, + 242, 244, 77, 248, 213, 105, 4, 28, 242, 243, 194, 6, 217, 141, 216, 11, + 232, 72, 199, 24, 198, 226, 202, 9, 80, 219, 207, 203, 92, 80, 223, 51, + 215, 248, 230, 197, 233, 91, 230, 197, 233, 92, 4, 202, 230, 233, 173, + 233, 92, 4, 200, 60, 80, 222, 217, 202, 230, 233, 92, 4, 211, 184, 216, + 4, 202, 230, 233, 92, 4, 211, 184, 216, 5, 26, 202, 230, 233, 173, 202, + 230, 233, 92, 4, 211, 184, 216, 5, 26, 242, 51, 201, 72, 202, 230, 233, + 92, 4, 211, 184, 216, 5, 26, 199, 106, 233, 173, 202, 230, 233, 92, 4, + 230, 74, 202, 230, 233, 92, 4, 228, 207, 194, 44, 233, 91, 202, 230, 233, + 92, 4, 202, 230, 233, 173, 233, 92, 206, 7, 237, 84, 232, 151, 207, 211, + 233, 91, 202, 230, 233, 92, 4, 229, 232, 233, 173, 202, 230, 233, 92, 4, + 201, 119, 202, 229, 233, 91, 214, 179, 233, 91, 233, 194, 233, 91, 197, + 75, 233, 91, 233, 92, 4, 242, 51, 201, 72, 210, 146, 233, 91, 239, 15, + 233, 91, 239, 16, 233, 91, 221, 159, 233, 91, 233, 92, 199, 149, 41, 221, + 160, 221, 159, 233, 92, 4, 202, 230, 233, 173, 221, 159, 233, 92, 4, 242, + 84, 233, 173, 233, 92, 4, 201, 192, 199, 0, 233, 92, 4, 201, 192, 199, 1, + 26, 194, 44, 233, 181, 233, 92, 4, 201, 192, 199, 1, 26, 199, 106, 233, + 173, 236, 200, 233, 91, 194, 4, 233, 91, 250, 203, 233, 91, 209, 142, + 233, 91, 238, 166, 233, 91, 210, 119, 233, 91, 233, 92, 4, 219, 72, 80, + 198, 162, 236, 200, 247, 77, 207, 211, 233, 91, 232, 83, 233, 92, 4, 211, + 184, 216, 4, 250, 201, 233, 91, 233, 45, 233, 91, 194, 105, 233, 91, 202, + 254, 233, 91, 199, 68, 233, 91, 230, 198, 233, 91, 219, 56, 238, 166, + 233, 91, 233, 92, 4, 211, 184, 216, 4, 228, 152, 233, 91, 233, 92, 4, + 211, 184, 216, 5, 26, 242, 51, 201, 72, 233, 92, 205, 233, 223, 191, 233, + 46, 250, 34, 233, 91, 232, 172, 233, 91, 202, 255, 233, 91, 236, 167, + 233, 91, 233, 92, 194, 39, 216, 4, 233, 92, 4, 217, 34, 217, 106, 230, + 197, 246, 194, 233, 92, 4, 202, 230, 233, 173, 246, 194, 233, 92, 4, 200, + 60, 80, 222, 217, 202, 230, 246, 194, 233, 92, 4, 211, 184, 216, 4, 202, + 230, 246, 194, 233, 92, 4, 229, 232, 233, 173, 246, 194, 233, 92, 4, 193, + 245, 202, 231, 221, 159, 246, 194, 233, 92, 4, 242, 84, 233, 173, 209, + 142, 246, 194, 233, 91, 238, 166, 246, 194, 233, 91, 194, 105, 246, 194, + 233, 91, 202, 248, 232, 83, 233, 91, 202, 248, 202, 230, 233, 91, 197, + 36, 233, 91, 233, 92, 4, 207, 32, 233, 173, 233, 92, 4, 213, 143, 230, + 241, 231, 125, 233, 92, 4, 211, 232, 231, 125, 210, 117, 247, 179, 237, + 99, 205, 204, 216, 49, 229, 236, 216, 49, 202, 150, 216, 49, 230, 29, + 210, 117, 208, 37, 90, 230, 62, 210, 117, 208, 37, 247, 191, 230, 38, + 223, 191, 246, 144, 210, 117, 232, 82, 210, 117, 4, 209, 142, 233, 91, + 210, 117, 4, 232, 161, 230, 37, 178, 194, 91, 209, 188, 220, 37, 202, + 171, 194, 91, 209, 188, 220, 37, 178, 234, 186, 209, 188, 220, 37, 202, + 171, 234, 186, 209, 188, 220, 37, 163, 178, 194, 91, 209, 188, 220, 37, + 163, 202, 171, 194, 91, 209, 188, 220, 37, 163, 178, 234, 186, 209, 188, + 220, 37, 163, 202, 171, 234, 186, 209, 188, 220, 37, 178, 194, 91, 209, + 188, 196, 19, 220, 37, 202, 171, 194, 91, 209, 188, 196, 19, 220, 37, + 178, 234, 186, 209, 188, 196, 19, 220, 37, 202, 171, 234, 186, 209, 188, + 196, 19, 220, 37, 87, 178, 194, 91, 209, 188, 196, 19, 220, 37, 87, 202, + 171, 194, 91, 209, 188, 196, 19, 220, 37, 87, 178, 234, 186, 209, 188, + 196, 19, 220, 37, 87, 202, 171, 234, 186, 209, 188, 196, 19, 220, 37, + 178, 194, 91, 209, 188, 247, 118, 202, 171, 194, 91, 209, 188, 247, 118, + 178, 234, 186, 209, 188, 247, 118, 202, 171, 234, 186, 209, 188, 247, + 118, 87, 178, 194, 91, 209, 188, 247, 118, 87, 202, 171, 194, 91, 209, + 188, 247, 118, 87, 178, 234, 186, 209, 188, 247, 118, 87, 202, 171, 234, + 186, 209, 188, 247, 118, 229, 24, 208, 152, 50, 211, 150, 229, 24, 208, + 152, 50, 211, 151, 223, 191, 60, 202, 106, 202, 191, 208, 152, 50, 211, + 150, 202, 191, 208, 152, 50, 211, 151, 223, 191, 60, 202, 106, 114, 207, + 39, 197, 30, 207, 39, 94, 207, 39, 235, 92, 207, 39, 27, 34, 233, 243, + 211, 150, 87, 27, 34, 233, 243, 211, 150, 34, 211, 184, 233, 243, 211, + 150, 87, 34, 211, 184, 233, 243, 211, 150, 87, 250, 230, 211, 150, 201, + 75, 250, 230, 211, 150, 49, 87, 55, 163, 242, 39, 208, 142, 122, 211, + 150, 49, 87, 55, 242, 39, 208, 142, 122, 211, 150, 49, 87, 132, 55, 242, + 39, 208, 142, 122, 211, 150, 87, 223, 131, 211, 150, 49, 223, 131, 211, + 150, 87, 49, 223, 131, 211, 150, 196, 53, 87, 202, 189, 196, 53, 87, 207, + 169, 202, 189, 242, 242, 247, 216, 207, 169, 242, 242, 247, 216, 207, 39, + 229, 215, 202, 4, 219, 96, 208, 44, 246, 217, 229, 151, 198, 213, 229, + 151, 198, 214, 4, 247, 107, 213, 112, 198, 213, 216, 233, 152, 208, 45, + 202, 10, 198, 211, 198, 212, 246, 217, 247, 82, 211, 208, 247, 82, 198, + 158, 247, 83, 201, 238, 216, 119, 250, 234, 232, 232, 234, 72, 209, 180, + 246, 217, 211, 208, 209, 180, 246, 217, 200, 89, 211, 208, 200, 89, 249, + 251, 211, 208, 249, 251, 207, 244, 196, 115, 237, 80, 198, 149, 250, 67, + 219, 63, 198, 220, 216, 42, 216, 10, 208, 43, 201, 89, 208, 43, 216, 10, + 247, 13, 251, 94, 198, 210, 203, 220, 207, 6, 202, 142, 229, 5, 198, 217, + 219, 195, 84, 198, 217, 219, 195, 239, 2, 57, 209, 180, 246, 201, 207, + 162, 219, 195, 198, 182, 232, 207, 211, 212, 209, 154, 236, 118, 213, + 143, 234, 58, 57, 202, 228, 109, 213, 143, 202, 228, 109, 209, 18, 219, + 148, 223, 191, 223, 79, 209, 232, 109, 236, 147, 213, 111, 219, 148, 109, + 209, 148, 194, 130, 109, 213, 127, 194, 130, 109, 248, 37, 213, 143, 248, + 36, 248, 35, 216, 10, 248, 35, 210, 170, 213, 143, 210, 169, 242, 205, + 238, 175, 217, 1, 109, 194, 20, 109, 207, 178, 248, 255, 109, 199, 25, + 194, 130, 242, 81, 203, 175, 248, 167, 248, 165, 210, 208, 238, 242, 238, + 123, 248, 232, 242, 110, 46, 219, 26, 198, 186, 4, 207, 7, 238, 222, 209, + 81, 57, 47, 223, 165, 202, 172, 247, 170, 109, 231, 22, 109, 238, 214, + 26, 220, 84, 202, 255, 251, 140, 203, 198, 248, 231, 248, 85, 248, 86, + 248, 109, 209, 232, 80, 194, 3, 212, 8, 57, 203, 198, 198, 159, 201, 188, + 211, 58, 229, 147, 200, 33, 228, 151, 234, 114, 230, 70, 26, 193, 253, + 203, 233, 211, 237, 235, 67, 216, 14, 208, 44, 198, 222, 216, 17, 247, + 215, 197, 40, 216, 130, 251, 50, 197, 40, 251, 50, 197, 40, 2, 251, 50, + 2, 251, 50, 213, 116, 251, 50, 251, 51, 237, 64, 251, 51, 250, 80, 206, + 16, 211, 208, 232, 232, 234, 72, 236, 250, 219, 96, 210, 212, 203, 220, + 205, 237, 216, 17, 205, 237, 246, 228, 203, 1, 232, 167, 206, 11, 203, + 17, 249, 253, 207, 137, 210, 45, 198, 149, 207, 33, 203, 18, 156, 16, 39, + 208, 148, 156, 16, 39, 251, 52, 156, 16, 39, 232, 231, 156, 16, 39, 234, + 189, 156, 16, 39, 194, 129, 156, 16, 39, 250, 133, 156, 16, 39, 250, 134, + 207, 231, 156, 16, 39, 250, 134, 207, 230, 156, 16, 39, 250, 134, 196, 2, + 156, 16, 39, 250, 134, 196, 1, 156, 16, 39, 196, 16, 156, 16, 39, 196, + 15, 156, 16, 39, 196, 14, 156, 16, 39, 201, 130, 156, 16, 39, 210, 69, + 201, 130, 156, 16, 39, 60, 201, 130, 156, 16, 39, 217, 0, 201, 161, 156, + 16, 39, 217, 0, 201, 160, 156, 16, 39, 217, 0, 201, 159, 156, 16, 39, + 242, 133, 156, 16, 39, 206, 55, 156, 16, 39, 214, 3, 156, 16, 39, 196, 0, + 156, 16, 39, 195, 255, 156, 16, 39, 207, 41, 206, 55, 156, 16, 39, 207, + 41, 206, 54, 156, 16, 39, 230, 245, 156, 16, 39, 203, 88, 156, 16, 39, + 223, 102, 211, 157, 156, 16, 39, 223, 102, 211, 156, 156, 16, 39, 238, + 188, 80, 223, 101, 156, 16, 39, 207, 227, 80, 223, 101, 156, 16, 39, 238, + 233, 211, 157, 156, 16, 39, 223, 100, 211, 157, 156, 16, 39, 201, 162, + 80, 238, 232, 156, 16, 39, 238, 188, 80, 238, 232, 156, 16, 39, 238, 188, + 80, 238, 231, 156, 16, 39, 238, 233, 250, 176, 156, 16, 39, 206, 56, 80, + 238, 233, 250, 176, 156, 16, 39, 201, 162, 80, 206, 56, 80, 238, 232, + 156, 16, 39, 196, 109, 156, 16, 39, 199, 81, 211, 157, 156, 16, 39, 220, + 41, 211, 157, 156, 16, 39, 250, 175, 211, 157, 156, 16, 39, 201, 162, 80, + 250, 174, 156, 16, 39, 206, 56, 80, 250, 174, 156, 16, 39, 201, 162, 80, + 206, 56, 80, 250, 174, 156, 16, 39, 196, 17, 80, 250, 174, 156, 16, 39, + 207, 227, 80, 250, 174, 156, 16, 39, 207, 227, 80, 250, 173, 156, 16, 39, + 207, 226, 156, 16, 39, 207, 225, 156, 16, 39, 207, 224, 156, 16, 39, 207, + 223, 156, 16, 39, 251, 11, 156, 16, 39, 251, 10, 156, 16, 39, 217, 132, + 156, 16, 39, 206, 62, 156, 16, 39, 250, 72, 156, 16, 39, 207, 255, 156, + 16, 39, 207, 254, 156, 16, 39, 249, 255, 156, 16, 39, 248, 3, 211, 157, + 156, 16, 39, 200, 110, 156, 16, 39, 200, 109, 156, 16, 39, 208, 154, 219, + 184, 156, 16, 39, 247, 196, 156, 16, 39, 247, 195, 156, 16, 39, 247, 194, + 156, 16, 39, 250, 243, 156, 16, 39, 211, 236, 156, 16, 39, 202, 129, 156, + 16, 39, 199, 79, 156, 16, 39, 230, 165, 156, 16, 39, 194, 117, 156, 16, + 39, 209, 141, 156, 16, 39, 246, 252, 156, 16, 39, 198, 1, 156, 16, 39, + 246, 219, 216, 23, 156, 16, 39, 205, 247, 80, 222, 219, 156, 16, 39, 247, + 10, 156, 16, 39, 198, 179, 156, 16, 39, 202, 17, 198, 179, 156, 16, 39, + 219, 95, 156, 16, 39, 202, 203, 156, 16, 39, 197, 19, 156, 16, 39, 228, + 205, 235, 45, 156, 16, 39, 250, 48, 156, 16, 39, 209, 150, 250, 48, 156, + 16, 39, 247, 145, 156, 16, 39, 209, 140, 247, 145, 156, 16, 39, 250, 240, + 156, 16, 39, 201, 225, 201, 111, 201, 224, 156, 16, 39, 201, 225, 201, + 111, 201, 223, 156, 16, 39, 201, 158, 156, 16, 39, 209, 113, 156, 16, 39, + 236, 187, 156, 16, 39, 236, 189, 156, 16, 39, 236, 188, 156, 16, 39, 209, + 27, 156, 16, 39, 209, 16, 156, 16, 39, 238, 173, 156, 16, 39, 238, 172, + 156, 16, 39, 238, 171, 156, 16, 39, 238, 170, 156, 16, 39, 238, 169, 156, + 16, 39, 251, 25, 156, 16, 39, 248, 168, 80, 217, 113, 156, 16, 39, 248, + 168, 80, 196, 143, 156, 16, 39, 207, 176, 156, 16, 39, 228, 197, 156, 16, + 39, 214, 31, 156, 16, 39, 237, 173, 156, 16, 39, 216, 37, 156, 16, 39, + 138, 235, 82, 156, 16, 39, 138, 211, 128, 60, 220, 23, 223, 85, 51, 198, + 185, 60, 197, 40, 223, 85, 51, 198, 185, 60, 207, 96, 223, 85, 51, 198, + 185, 60, 235, 95, 223, 85, 51, 198, 185, 60, 202, 248, 2, 242, 130, 217, + 31, 28, 62, 242, 130, 28, 62, 242, 130, 87, 62, 242, 130, 196, 53, 87, + 62, 242, 130, 233, 185, 87, 62, 242, 130, 62, 242, 131, 238, 254, 60, 2, + 242, 130, 207, 9, 200, 111, 60, 199, 76, 202, 106, 60, 202, 248, 2, 202, + 106, 152, 62, 202, 106, 217, 31, 62, 202, 106, 28, 62, 202, 106, 87, 62, + 202, 106, 196, 53, 87, 62, 202, 106, 233, 185, 87, 62, 202, 106, 62, 50, + 238, 254, 60, 196, 53, 2, 202, 106, 62, 50, 238, 254, 60, 217, 31, 202, + 106, 50, 200, 111, 60, 199, 76, 237, 4, 60, 196, 53, 2, 237, 4, 60, 217, + 31, 2, 237, 4, 62, 237, 5, 238, 254, 60, 196, 53, 2, 237, 4, 62, 237, 5, + 238, 254, 60, 217, 31, 237, 4, 237, 5, 200, 111, 60, 199, 76, 219, 43, + 60, 196, 53, 2, 219, 43, 60, 217, 31, 2, 219, 43, 62, 219, 44, 238, 254, + 60, 2, 219, 43, 199, 195, 33, 238, 183, 152, 33, 238, 183, 217, 31, 33, + 238, 183, 28, 33, 238, 183, 196, 53, 28, 33, 238, 183, 196, 53, 87, 33, + 238, 183, 233, 185, 87, 33, 238, 183, 199, 195, 206, 51, 152, 206, 51, + 217, 31, 206, 51, 28, 206, 51, 87, 206, 51, 196, 53, 87, 206, 51, 233, + 185, 87, 206, 51, 152, 232, 214, 202, 122, 250, 37, 217, 31, 232, 214, + 202, 122, 250, 37, 28, 232, 214, 202, 122, 250, 37, 87, 232, 214, 202, + 122, 250, 37, 196, 53, 87, 232, 214, 202, 122, 250, 37, 233, 185, 87, + 232, 214, 202, 122, 250, 37, 152, 203, 41, 202, 122, 250, 37, 217, 31, + 203, 41, 202, 122, 250, 37, 28, 203, 41, 202, 122, 250, 37, 87, 203, 41, + 202, 122, 250, 37, 196, 53, 87, 203, 41, 202, 122, 250, 37, 233, 185, 87, + 203, 41, 202, 122, 250, 37, 152, 234, 148, 202, 122, 250, 37, 217, 31, + 234, 148, 202, 122, 250, 37, 28, 234, 148, 202, 122, 250, 37, 87, 234, + 148, 202, 122, 250, 37, 196, 53, 87, 234, 148, 202, 122, 250, 37, 152, + 112, 209, 190, 60, 202, 19, 217, 31, 112, 209, 190, 60, 202, 19, 112, + 209, 190, 60, 202, 19, 217, 31, 112, 209, 190, 209, 254, 202, 19, 152, + 232, 119, 209, 190, 60, 202, 19, 217, 31, 232, 119, 209, 190, 60, 202, + 19, 232, 119, 209, 190, 60, 202, 19, 217, 31, 232, 119, 209, 190, 209, + 254, 202, 19, 207, 169, 152, 232, 119, 209, 190, 209, 254, 202, 19, 152, + 232, 214, 209, 190, 60, 202, 19, 87, 232, 214, 209, 190, 60, 202, 19, + 217, 31, 203, 41, 209, 190, 60, 202, 19, 87, 203, 41, 209, 190, 60, 202, + 19, 203, 41, 209, 190, 209, 254, 202, 19, 217, 31, 234, 148, 209, 190, + 60, 202, 19, 87, 234, 148, 209, 190, 60, 202, 19, 196, 53, 87, 234, 148, + 209, 190, 60, 202, 19, 87, 234, 148, 209, 190, 209, 254, 202, 19, 152, + 197, 245, 209, 190, 60, 202, 19, 87, 197, 245, 209, 190, 60, 202, 19, 87, + 197, 245, 209, 190, 209, 254, 202, 19, 47, 198, 185, 214, 199, 47, 198, + 185, 47, 202, 106, 214, 199, 47, 202, 106, 220, 73, 211, 162, 242, 130, + 220, 73, 193, 62, 242, 130, 220, 73, 230, 201, 242, 130, 220, 73, 209, + 24, 242, 130, 220, 73, 247, 133, 242, 130, 220, 73, 207, 237, 202, 106, + 220, 73, 247, 224, 202, 106, 220, 73, 211, 162, 202, 106, 220, 73, 193, + 62, 202, 106, 220, 73, 230, 201, 202, 106, 220, 73, 209, 24, 202, 106, + 220, 73, 247, 133, 202, 106, 114, 61, 4, 2, 198, 186, 250, 77, 197, 30, + 61, 4, 2, 198, 186, 250, 77, 94, 61, 4, 2, 198, 186, 250, 77, 235, 92, + 61, 4, 2, 198, 186, 250, 77, 114, 61, 4, 217, 31, 198, 186, 250, 77, 197, + 30, 61, 4, 217, 31, 198, 186, 250, 77, 94, 61, 4, 217, 31, 198, 186, 250, + 77, 235, 92, 61, 4, 217, 31, 198, 186, 250, 77, 114, 61, 4, 220, 73, 198, + 186, 250, 77, 197, 30, 61, 4, 220, 73, 198, 186, 250, 77, 94, 61, 4, 220, + 73, 198, 186, 250, 77, 235, 92, 61, 4, 220, 73, 198, 186, 250, 77, 114, + 61, 4, 2, 234, 24, 250, 77, 197, 30, 61, 4, 2, 234, 24, 250, 77, 94, 61, + 4, 2, 234, 24, 250, 77, 235, 92, 61, 4, 2, 234, 24, 250, 77, 114, 61, 4, + 234, 24, 250, 77, 197, 30, 61, 4, 234, 24, 250, 77, 94, 61, 4, 234, 24, + 250, 77, 235, 92, 61, 4, 234, 24, 250, 77, 87, 114, 61, 4, 234, 24, 250, + 77, 87, 197, 30, 61, 4, 234, 24, 250, 77, 87, 94, 61, 4, 234, 24, 250, + 77, 87, 235, 92, 61, 4, 234, 24, 250, 77, 87, 114, 61, 4, 220, 73, 234, + 24, 250, 77, 87, 197, 30, 61, 4, 220, 73, 234, 24, 250, 77, 87, 94, 61, + 4, 220, 73, 234, 24, 250, 77, 87, 235, 92, 61, 4, 220, 73, 234, 24, 250, + 77, 114, 198, 184, 61, 4, 215, 50, 204, 48, 197, 30, 198, 184, 61, 4, + 215, 50, 204, 48, 94, 198, 184, 61, 4, 215, 50, 204, 48, 235, 92, 198, + 184, 61, 4, 215, 50, 204, 48, 114, 198, 184, 61, 4, 217, 31, 204, 48, + 197, 30, 198, 184, 61, 4, 217, 31, 204, 48, 94, 198, 184, 61, 4, 217, 31, + 204, 48, 235, 92, 198, 184, 61, 4, 217, 31, 204, 48, 114, 198, 184, 61, + 4, 28, 204, 48, 197, 30, 198, 184, 61, 4, 28, 204, 48, 94, 198, 184, 61, + 4, 28, 204, 48, 235, 92, 198, 184, 61, 4, 28, 204, 48, 114, 198, 184, 61, + 4, 87, 204, 48, 197, 30, 198, 184, 61, 4, 87, 204, 48, 94, 198, 184, 61, + 4, 87, 204, 48, 235, 92, 198, 184, 61, 4, 87, 204, 48, 114, 198, 184, 61, + 4, 196, 53, 87, 204, 48, 197, 30, 198, 184, 61, 4, 196, 53, 87, 204, 48, + 94, 198, 184, 61, 4, 196, 53, 87, 204, 48, 235, 92, 198, 184, 61, 4, 196, + 53, 87, 204, 48, 114, 232, 239, 54, 197, 30, 232, 239, 54, 94, 232, 239, + 54, 235, 92, 232, 239, 54, 114, 108, 54, 197, 30, 108, 54, 94, 108, 54, + 235, 92, 108, 54, 114, 239, 25, 54, 197, 30, 239, 25, 54, 94, 239, 25, + 54, 235, 92, 239, 25, 54, 114, 87, 239, 25, 54, 197, 30, 87, 239, 25, 54, + 94, 87, 239, 25, 54, 235, 92, 87, 239, 25, 54, 114, 87, 54, 197, 30, 87, + 54, 94, 87, 54, 235, 92, 87, 54, 114, 49, 54, 197, 30, 49, 54, 94, 49, + 54, 235, 92, 49, 54, 178, 194, 91, 49, 54, 178, 234, 186, 49, 54, 202, + 171, 234, 186, 49, 54, 202, 171, 194, 91, 49, 54, 46, 51, 49, 54, 130, + 142, 49, 54, 194, 63, 114, 152, 173, 54, 194, 63, 197, 30, 152, 173, 54, + 194, 63, 94, 152, 173, 54, 194, 63, 235, 92, 152, 173, 54, 194, 63, 178, + 194, 91, 152, 173, 54, 194, 63, 178, 234, 186, 152, 173, 54, 194, 63, + 202, 171, 234, 186, 152, 173, 54, 194, 63, 202, 171, 194, 91, 152, 173, + 54, 194, 63, 114, 173, 54, 194, 63, 197, 30, 173, 54, 194, 63, 94, 173, + 54, 194, 63, 235, 92, 173, 54, 194, 63, 178, 194, 91, 173, 54, 194, 63, + 178, 234, 186, 173, 54, 194, 63, 202, 171, 234, 186, 173, 54, 194, 63, + 202, 171, 194, 91, 173, 54, 194, 63, 114, 217, 31, 173, 54, 194, 63, 197, + 30, 217, 31, 173, 54, 194, 63, 94, 217, 31, 173, 54, 194, 63, 235, 92, + 217, 31, 173, 54, 194, 63, 178, 194, 91, 217, 31, 173, 54, 194, 63, 178, + 234, 186, 217, 31, 173, 54, 194, 63, 202, 171, 234, 186, 217, 31, 173, + 54, 194, 63, 202, 171, 194, 91, 217, 31, 173, 54, 194, 63, 114, 87, 173, + 54, 194, 63, 197, 30, 87, 173, 54, 194, 63, 94, 87, 173, 54, 194, 63, + 235, 92, 87, 173, 54, 194, 63, 178, 194, 91, 87, 173, 54, 194, 63, 178, + 234, 186, 87, 173, 54, 194, 63, 202, 171, 234, 186, 87, 173, 54, 194, 63, + 202, 171, 194, 91, 87, 173, 54, 194, 63, 114, 196, 53, 87, 173, 54, 194, + 63, 197, 30, 196, 53, 87, 173, 54, 194, 63, 94, 196, 53, 87, 173, 54, + 194, 63, 235, 92, 196, 53, 87, 173, 54, 194, 63, 178, 194, 91, 196, 53, + 87, 173, 54, 194, 63, 178, 234, 186, 196, 53, 87, 173, 54, 194, 63, 202, + 171, 234, 186, 196, 53, 87, 173, 54, 194, 63, 202, 171, 194, 91, 196, 53, + 87, 173, 54, 114, 198, 186, 250, 77, 197, 30, 198, 186, 250, 77, 94, 198, + 186, 250, 77, 235, 92, 198, 186, 250, 77, 114, 62, 61, 194, 41, 198, 186, + 250, 77, 197, 30, 62, 61, 194, 41, 198, 186, 250, 77, 94, 62, 61, 194, + 41, 198, 186, 250, 77, 235, 92, 62, 61, 194, 41, 198, 186, 250, 77, 114, + 61, 4, 213, 107, 200, 147, 197, 30, 61, 4, 213, 107, 200, 147, 94, 61, 4, + 213, 107, 200, 147, 235, 92, 61, 4, 213, 107, 200, 147, 87, 61, 204, 49, + 194, 61, 101, 87, 61, 204, 49, 194, 61, 103, 199, 188, 87, 61, 204, 49, + 194, 61, 90, 230, 78, 87, 61, 204, 49, 194, 61, 90, 199, 191, 114, 247, + 185, 62, 54, 94, 247, 188, 204, 51, 62, 54, 114, 198, 249, 204, 51, 62, + 54, 94, 198, 249, 204, 51, 62, 54, 114, 220, 22, 62, 54, 94, 207, 95, 62, + 54, 114, 207, 95, 62, 54, 94, 220, 22, 62, 54, 114, 248, 251, 204, 50, + 62, 54, 94, 248, 251, 204, 50, 62, 54, 114, 232, 86, 204, 50, 62, 54, 94, + 232, 86, 204, 50, 62, 54, 62, 61, 204, 49, 194, 61, 101, 62, 61, 204, 49, + 194, 61, 103, 199, 188, 61, 209, 188, 197, 30, 199, 216, 178, 194, 90, + 61, 209, 188, 94, 199, 216, 238, 128, 202, 171, 194, 90, 47, 238, 184, + 232, 133, 4, 232, 119, 236, 111, 47, 238, 184, 232, 133, 4, 103, 236, + 111, 47, 238, 184, 232, 132, 46, 138, 242, 131, 4, 232, 119, 236, 111, + 46, 138, 242, 131, 4, 112, 236, 111, 46, 138, 242, 131, 4, 103, 236, 111, + 46, 138, 242, 131, 4, 236, 114, 46, 138, 242, 130, 235, 93, 233, 84, 128, + 235, 93, 233, 84, 213, 107, 128, 235, 93, 233, 84, 229, 15, 4, 236, 114, + 235, 93, 233, 84, 213, 107, 229, 15, 4, 236, 114, 210, 3, 232, 235, 62, + 229, 233, 247, 133, 229, 233, 210, 2, 230, 62, 192, 17, 233, 91, 216, 53, + 233, 91, 233, 92, 4, 199, 212, 214, 187, 233, 91, 199, 193, 233, 91, 233, + 92, 4, 229, 244, 207, 43, 233, 91, 228, 172, 233, 91, 3, 80, 199, 225, + 228, 207, 246, 254, 217, 49, 230, 62, 208, 39, 248, 253, 80, 230, 62, + 220, 27, 232, 219, 207, 100, 232, 219, 230, 36, 230, 63, 4, 140, 26, 85, + 232, 236, 238, 179, 228, 97, 219, 53, 192, 228, 230, 63, 57, 233, 92, 4, + 238, 204, 230, 18, 242, 73, 233, 91, 215, 39, 233, 91, 207, 32, 211, 212, + 199, 225, 232, 183, 220, 59, 235, 73, 233, 91, 218, 246, 233, 91, 233, + 92, 211, 40, 202, 222, 233, 91, 233, 92, 4, 90, 233, 180, 208, 38, 230, + 197, 233, 92, 4, 202, 20, 233, 173, 230, 197, 233, 92, 4, 90, 220, 73, + 26, 90, 2, 233, 181, 233, 92, 4, 232, 241, 238, 207, 242, 84, 219, 159, + 204, 157, 233, 92, 4, 201, 6, 238, 207, 216, 4, 202, 230, 233, 92, 4, + 202, 230, 233, 174, 26, 230, 63, 238, 207, 216, 4, 233, 92, 4, 211, 184, + 216, 5, 195, 237, 203, 209, 233, 92, 4, 233, 196, 229, 245, 209, 110, + 194, 23, 247, 153, 211, 39, 130, 199, 26, 204, 186, 209, 98, 217, 161, + 223, 191, 197, 253, 216, 19, 242, 175, 203, 168, 210, 117, 236, 131, 246, + 198, 222, 209, 233, 26, 216, 78, 210, 141, 193, 252, 194, 130, 209, 178, + 230, 41, 236, 173, 217, 106, 194, 55, 232, 175, 235, 68, 4, 235, 66, 242, + 91, 231, 10, 198, 25, 231, 11, 202, 119, 230, 252, 214, 182, 207, 102, + 232, 226, 209, 232, 217, 37, 205, 212, 209, 232, 217, 37, 199, 192, 209, + 232, 217, 37, 247, 172, 231, 5, 217, 117, 250, 65, 197, 58, 238, 139, + 201, 240, 220, 169, 201, 250, 26, 248, 217, 202, 197, 232, 167, 236, 198, + 238, 187, 249, 242, 238, 155, 248, 244, 209, 147, 246, 202, 248, 230, + 247, 156, 230, 201, 206, 60, 204, 41, 211, 26, 80, 232, 151, 201, 189, + 232, 194, 234, 162, 231, 12, 80, 216, 129, 210, 175, 221, 154, 211, 22, + 235, 50, 232, 128, 238, 237, 200, 139, 247, 173, 242, 182, 247, 178, 4, + 202, 119, 238, 149, 4, 201, 222, 242, 57, 247, 137, 210, 43, 209, 102, + 238, 122, 80, 217, 40, 206, 35, 246, 230, 232, 151, 220, 36, 230, 200, + 217, 152, 216, 30, 247, 5, 248, 233, 202, 230, 233, 92, 4, 202, 230, 233, + 174, 26, 112, 229, 231, 193, 76, 233, 91, 202, 230, 233, 92, 4, 200, 65, + 233, 92, 4, 210, 219, 228, 209, 26, 210, 219, 230, 18, 233, 92, 4, 197, + 62, 233, 174, 26, 194, 121, 216, 4, 211, 116, 233, 91, 232, 98, 233, 91, + 214, 10, 236, 196, 233, 91, 233, 92, 4, 209, 218, 233, 173, 206, 23, 220, + 178, 242, 60, 230, 248, 229, 149, 247, 200, 232, 196, 203, 207, 238, 201, + 219, 163, 233, 91, 205, 235, 198, 13, 197, 60, 233, 91, 234, 196, 235, + 58, 248, 170, 204, 27, 211, 105, 232, 111, 233, 91, 247, 74, 237, 98, + 230, 234, 219, 142, 207, 155, 203, 170, 202, 100, 231, 24, 233, 91, 192, + 83, 233, 91, 229, 226, 206, 8, 200, 227, 238, 190, 222, 116, 219, 134, + 210, 177, 229, 141, 210, 225, 208, 63, 219, 105, 216, 21, 216, 165, 248, + 239, 201, 77, 217, 162, 236, 137, 202, 242, 211, 133, 211, 161, 203, 9, + 232, 198, 211, 95, 248, 111, 248, 2, 205, 216, 230, 170, 236, 134, 209, + 87, 246, 232, 234, 94, 242, 28, 207, 237, 230, 86, 234, 94, 242, 28, 238, + 138, 230, 86, 234, 94, 242, 28, 248, 219, 234, 94, 242, 28, 62, 230, 86, + 247, 207, 220, 16, 232, 149, 198, 251, 201, 109, 201, 104, 206, 82, 196, + 51, 234, 194, 4, 229, 235, 251, 62, 216, 15, 194, 77, 217, 144, 194, 77, + 217, 39, 250, 92, 217, 39, 220, 16, 242, 236, 194, 102, 238, 147, 206, + 56, 204, 45, 248, 59, 247, 173, 231, 190, 211, 200, 233, 73, 194, 158, + 247, 75, 217, 100, 235, 77, 228, 50, 238, 157, 247, 123, 200, 68, 202, + 22, 210, 116, 221, 126, 210, 116, 237, 114, 210, 116, 233, 92, 4, 216, + 48, 251, 112, 242, 206, 211, 224, 251, 112, 248, 115, 210, 116, 210, 117, + 4, 229, 240, 210, 117, 223, 191, 202, 1, 207, 24, 210, 117, 242, 93, 210, + 117, 223, 191, 219, 58, 209, 159, 217, 192, 233, 75, 196, 146, 216, 249, + 234, 109, 231, 141, 192, 6, 247, 163, 211, 162, 229, 233, 248, 24, 246, + 226, 205, 248, 231, 4, 242, 60, 202, 200, 207, 237, 231, 36, 234, 52, + 232, 230, 223, 14, 209, 12, 210, 42, 200, 10, 198, 35, 210, 101, 236, + 194, 236, 148, 55, 229, 214, 242, 33, 251, 154, 232, 232, 233, 190, 198, + 253, 247, 145, 217, 190, 219, 26, 219, 59, 247, 189, 202, 120, 80, 199, + 162, 248, 218, 80, 193, 89, 206, 82, 210, 6, 200, 59, 248, 116, 247, 134, + 248, 175, 207, 35, 80, 210, 251, 248, 194, 80, 202, 203, 202, 121, 207, + 253, 215, 33, 250, 226, 214, 179, 242, 225, 221, 176, 214, 179, 242, 225, + 208, 160, 214, 179, 242, 225, 207, 25, 214, 179, 242, 225, 248, 5, 214, + 179, 242, 225, 221, 122, 214, 179, 242, 225, 210, 192, 62, 242, 225, 221, + 123, 207, 16, 232, 125, 237, 94, 60, 242, 225, 221, 123, 207, 16, 232, + 125, 237, 94, 214, 179, 242, 225, 221, 123, 207, 16, 232, 125, 237, 94, + 62, 242, 225, 221, 177, 207, 16, 214, 12, 237, 94, 62, 242, 225, 208, + 161, 207, 16, 214, 12, 237, 94, 62, 242, 225, 207, 26, 207, 16, 214, 12, + 237, 94, 62, 242, 225, 248, 6, 207, 16, 214, 12, 237, 94, 62, 242, 225, + 221, 123, 207, 16, 214, 12, 237, 94, 62, 242, 225, 210, 193, 207, 16, + 214, 12, 237, 94, 60, 242, 225, 221, 177, 207, 16, 214, 12, 237, 94, 60, + 242, 225, 208, 161, 207, 16, 214, 12, 237, 94, 60, 242, 225, 207, 26, + 207, 16, 214, 12, 237, 94, 60, 242, 225, 248, 6, 207, 16, 214, 12, 237, + 94, 60, 242, 225, 221, 123, 207, 16, 214, 12, 237, 94, 60, 242, 225, 210, + 193, 207, 16, 214, 12, 237, 94, 214, 179, 242, 225, 221, 177, 207, 16, + 214, 12, 237, 94, 214, 179, 242, 225, 208, 161, 207, 16, 214, 12, 237, + 94, 214, 179, 242, 225, 207, 26, 207, 16, 214, 12, 237, 94, 214, 179, + 242, 225, 248, 6, 207, 16, 214, 12, 237, 94, 214, 179, 242, 225, 221, + 123, 207, 16, 214, 12, 237, 94, 214, 179, 242, 225, 210, 193, 207, 16, + 214, 12, 237, 94, 62, 242, 225, 221, 123, 207, 16, 90, 228, 163, 199, + 183, 237, 94, 60, 242, 225, 221, 123, 207, 16, 90, 228, 163, 199, 183, + 237, 94, 214, 179, 242, 225, 221, 123, 207, 16, 90, 228, 163, 199, 183, + 237, 94, 62, 242, 225, 163, 221, 176, 62, 242, 225, 163, 208, 160, 62, + 242, 225, 163, 207, 25, 62, 242, 225, 163, 248, 5, 62, 242, 225, 163, + 221, 122, 62, 242, 225, 163, 210, 192, 60, 242, 225, 163, 221, 176, 60, + 242, 225, 163, 208, 160, 60, 242, 225, 163, 207, 25, 60, 242, 225, 163, + 248, 5, 60, 242, 225, 163, 221, 122, 60, 242, 225, 163, 210, 192, 214, + 179, 242, 225, 163, 221, 176, 214, 179, 242, 225, 163, 208, 160, 214, + 179, 242, 225, 163, 207, 25, 214, 179, 242, 225, 163, 248, 5, 214, 179, + 242, 225, 163, 221, 122, 214, 179, 242, 225, 163, 210, 192, 62, 242, 225, + 221, 123, 207, 16, 103, 228, 163, 197, 236, 237, 94, 60, 242, 225, 221, + 123, 207, 16, 103, 228, 163, 197, 236, 237, 94, 214, 179, 242, 225, 221, + 123, 207, 16, 103, 228, 163, 197, 236, 237, 94, 62, 242, 225, 221, 177, + 207, 16, 103, 228, 163, 204, 141, 237, 94, 62, 242, 225, 208, 161, 207, + 16, 103, 228, 163, 204, 141, 237, 94, 62, 242, 225, 207, 26, 207, 16, + 103, 228, 163, 204, 141, 237, 94, 62, 242, 225, 248, 6, 207, 16, 103, + 228, 163, 204, 141, 237, 94, 62, 242, 225, 221, 123, 207, 16, 103, 228, + 163, 204, 141, 237, 94, 62, 242, 225, 210, 193, 207, 16, 103, 228, 163, + 204, 141, 237, 94, 60, 242, 225, 221, 177, 207, 16, 103, 228, 163, 204, + 141, 237, 94, 60, 242, 225, 208, 161, 207, 16, 103, 228, 163, 204, 141, + 237, 94, 60, 242, 225, 207, 26, 207, 16, 103, 228, 163, 204, 141, 237, + 94, 60, 242, 225, 248, 6, 207, 16, 103, 228, 163, 204, 141, 237, 94, 60, + 242, 225, 221, 123, 207, 16, 103, 228, 163, 204, 141, 237, 94, 60, 242, + 225, 210, 193, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 221, 177, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 208, 161, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 207, 26, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 248, 6, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 221, 123, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 210, 193, 207, 16, 103, 228, 163, 204, 141, 237, 94, 62, 242, 225, + 221, 123, 207, 16, 112, 228, 163, 233, 8, 237, 94, 60, 242, 225, 221, + 123, 207, 16, 112, 228, 163, 233, 8, 237, 94, 214, 179, 242, 225, 221, + 123, 207, 16, 112, 228, 163, 233, 8, 237, 94, 62, 242, 225, 234, 25, 60, + 242, 225, 234, 25, 214, 179, 242, 225, 234, 25, 62, 242, 225, 234, 26, + 207, 16, 214, 12, 237, 94, 60, 242, 225, 234, 26, 207, 16, 214, 12, 237, + 94, 214, 179, 242, 225, 234, 26, 207, 16, 214, 12, 237, 94, 62, 242, 225, + 221, 120, 62, 242, 225, 221, 119, 62, 242, 225, 221, 121, 60, 242, 225, + 221, 120, 60, 242, 225, 221, 119, 60, 242, 225, 221, 121, 193, 194, 207, + 237, 231, 143, 193, 194, 207, 237, 217, 154, 193, 194, 207, 237, 234, + 115, 193, 194, 207, 237, 228, 204, 193, 194, 207, 237, 242, 254, 193, + 194, 207, 237, 246, 229, 193, 194, 207, 237, 202, 192, 193, 194, 60, 231, + 143, 193, 194, 60, 217, 154, 193, 194, 60, 234, 115, 193, 194, 60, 228, + 204, 193, 194, 60, 242, 254, 193, 194, 60, 246, 229, 193, 194, 60, 202, + 192, 248, 216, 203, 206, 211, 205, 201, 64, 247, 141, 203, 180, 199, 172, + 206, 37, 235, 72, 80, 247, 229, 251, 118, 248, 202, 201, 251, 192, 242, + 221, 157, 210, 245, 247, 201, 217, 191, 194, 147, 210, 4, 214, 184, 236, + 126, 207, 80, 209, 224, 246, 112, 208, 11, 249, 237, 236, 168, 220, 84, + 248, 200, 216, 130, 229, 210, 251, 139, 184, 235, 67, 242, 52, 246, 204, + 206, 6, 205, 230, 220, 168, 128, 216, 105, 194, 51, 209, 208, 204, 138, + 214, 202, 221, 117, 247, 120, 216, 7, 198, 203, 198, 250, 229, 238, 209, + 233, 207, 40, 232, 168, 194, 5, 248, 102, 242, 59, 209, 146, 209, 223, + 194, 16, 233, 42, 250, 221, 229, 233, 219, 17, 210, 140, 228, 171, 247, + 222, 248, 87, 210, 135, 211, 221, 232, 194, 200, 128, 232, 155, 200, 66, + 175, 204, 135, 175, 204, 105, 175, 204, 134, 175, 204, 90, 175, 204, 119, + 175, 204, 104, 175, 204, 133, 175, 204, 82, 175, 204, 112, 175, 204, 96, + 175, 204, 126, 175, 204, 89, 175, 204, 118, 175, 204, 103, 175, 204, 132, + 175, 204, 78, 175, 204, 108, 175, 204, 93, 175, 204, 122, 175, 204, 85, + 175, 204, 99, 175, 204, 129, 175, 204, 81, 175, 204, 111, 175, 204, 95, + 175, 204, 125, 175, 204, 88, 175, 204, 117, 175, 204, 102, 175, 204, 131, + 175, 204, 76, 175, 204, 106, 175, 204, 91, 175, 204, 120, 175, 204, 83, + 175, 204, 113, 175, 204, 97, 175, 204, 127, 175, 204, 79, 175, 204, 109, + 175, 204, 123, 175, 204, 86, 175, 204, 115, 175, 204, 100, 175, 204, 130, + 175, 204, 77, 175, 204, 107, 175, 204, 92, 175, 204, 121, 175, 204, 84, + 175, 204, 114, 175, 204, 98, 175, 204, 128, 175, 204, 80, 175, 204, 110, + 175, 204, 94, 175, 204, 124, 175, 204, 87, 175, 204, 116, 175, 204, 101, + 106, 46, 175, 237, 11, 106, 85, 46, 115, 106, 246, 137, 106, 46, 175, + 237, 11, 106, 85, 46, 115, 106, 207, 101, 106, 46, 175, 237, 11, 113, 85, + 46, 115, 106, 246, 137, 106, 46, 175, 237, 11, 113, 85, 46, 115, 106, + 207, 101, 106, 46, 175, 237, 11, 113, 46, 115, 106, 246, 137, 106, 51, + 175, 237, 11, 113, 85, 46, 115, 113, 246, 137, 106, 51, 175, 237, 11, + 113, 85, 46, 115, 113, 207, 101, 106, 51, 175, 237, 11, 106, 85, 46, 115, + 113, 246, 137, 106, 51, 175, 237, 11, 106, 85, 46, 115, 113, 207, 101, + 106, 51, 175, 237, 11, 106, 46, 115, 113, 246, 137, 106, 51, 175, 237, + 11, 106, 85, 46, 115, 113, 85, 207, 101, 106, 51, 175, 237, 11, 106, 246, + 138, 115, 106, 85, 207, 101, 106, 51, 175, 237, 11, 106, 46, 115, 106, + 85, 207, 101, 106, 51, 175, 237, 11, 106, 246, 138, 115, 113, 85, 207, + 101, 106, 51, 175, 237, 11, 106, 46, 115, 113, 85, 207, 101, 106, 51, + 175, 237, 11, 106, 246, 138, 115, 113, 207, 101, 106, 46, 175, 237, 11, + 113, 246, 138, 115, 113, 85, 207, 101, 106, 46, 175, 237, 11, 113, 46, + 115, 113, 85, 207, 101, 106, 46, 175, 237, 11, 113, 246, 138, 115, 106, + 85, 207, 101, 106, 46, 175, 237, 11, 113, 46, 115, 106, 85, 207, 101, + 106, 46, 175, 237, 11, 113, 246, 138, 115, 106, 207, 101, 106, 46, 175, + 237, 11, 113, 85, 46, 115, 106, 85, 207, 101, 113, 51, 175, 237, 11, 106, + 85, 46, 115, 106, 246, 137, 113, 51, 175, 237, 11, 106, 85, 46, 115, 106, + 207, 101, 113, 51, 175, 237, 11, 113, 85, 46, 115, 106, 246, 137, 113, + 51, 175, 237, 11, 113, 85, 46, 115, 106, 207, 101, 113, 51, 175, 237, 11, + 113, 46, 115, 106, 246, 137, 113, 46, 175, 237, 11, 113, 85, 46, 115, + 113, 246, 137, 113, 46, 175, 237, 11, 113, 85, 46, 115, 113, 207, 101, + 113, 46, 175, 237, 11, 106, 85, 46, 115, 113, 246, 137, 113, 46, 175, + 237, 11, 106, 85, 46, 115, 113, 207, 101, 113, 46, 175, 237, 11, 106, 46, + 115, 113, 246, 137, 113, 46, 175, 237, 11, 106, 85, 46, 115, 113, 85, + 207, 101, 113, 46, 175, 237, 11, 106, 246, 138, 115, 106, 85, 207, 101, + 113, 46, 175, 237, 11, 106, 46, 115, 106, 85, 207, 101, 113, 46, 175, + 237, 11, 106, 246, 138, 115, 113, 85, 207, 101, 113, 46, 175, 237, 11, + 106, 46, 115, 113, 85, 207, 101, 113, 46, 175, 237, 11, 106, 246, 138, + 115, 113, 207, 101, 113, 51, 175, 237, 11, 113, 246, 138, 115, 113, 85, + 207, 101, 113, 51, 175, 237, 11, 113, 46, 115, 113, 85, 207, 101, 113, + 51, 175, 237, 11, 113, 246, 138, 115, 106, 85, 207, 101, 113, 51, 175, + 237, 11, 113, 46, 115, 106, 85, 207, 101, 113, 51, 175, 237, 11, 113, + 246, 138, 115, 106, 207, 101, 113, 51, 175, 237, 11, 113, 85, 46, 115, + 106, 85, 207, 101, 113, 26, 51, 26, 106, 198, 182, 112, 208, 166, 247, + 238, 46, 26, 106, 26, 51, 198, 182, 112, 208, 166, 247, 238, 113, 26, 46, + 26, 106, 198, 182, 112, 208, 166, 247, 238, 46, 26, 113, 26, 51, 198, + 182, 112, 208, 166, 247, 238, 46, 198, 182, 90, 208, 168, 247, 238, 113, + 198, 182, 90, 208, 168, 247, 238, 51, 198, 182, 90, 208, 168, 247, 238, + 106, 198, 182, 90, 208, 168, 247, 238, 84, 90, 234, 144, 247, 236, 84, + 90, 234, 144, 247, 235, 84, 90, 234, 144, 247, 234, 84, 90, 234, 144, + 247, 233, 84, 90, 234, 144, 247, 232, 84, 90, 234, 144, 247, 231, 229, 5, + 90, 234, 144, 247, 236, 229, 5, 90, 234, 144, 247, 235, 229, 5, 90, 234, + 144, 247, 234, 229, 5, 90, 234, 144, 247, 233, 229, 5, 90, 234, 144, 247, + 232, 229, 5, 90, 234, 144, 247, 231, 46, 26, 106, 90, 234, 144, 247, 238, + 46, 26, 113, 90, 234, 144, 247, 238, 51, 26, 113, 90, 234, 144, 247, 238, + 51, 26, 106, 90, 234, 144, 247, 238, 113, 26, 106, 90, 234, 144, 247, + 238, 229, 5, 90, 234, 144, 247, 237, 113, 90, 208, 168, 247, 238, 113, + 112, 234, 142, 247, 238, 113, 232, 214, 234, 142, 247, 238, 113, 112, + 208, 166, 247, 238, 113, 204, 146, 234, 142, 247, 238, 51, 90, 208, 168, + 247, 238, 51, 112, 234, 142, 247, 238, 51, 232, 214, 234, 142, 247, 238, + 51, 112, 208, 166, 247, 238, 51, 204, 146, 234, 142, 247, 238, 46, 138, + 217, 31, 204, 52, 51, 138, 217, 31, 204, 52, 113, 138, 217, 31, 204, 52, + 106, 138, 217, 31, 204, 52, 223, 123, 217, 31, 204, 52, 113, 138, 175, + 26, 106, 138, 223, 123, 217, 31, 204, 52, 113, 138, 223, 123, 217, 31, + 204, 53, 26, 106, 138, 247, 238, 46, 138, 223, 123, 217, 31, 204, 53, 26, + 51, 138, 247, 238, 242, 242, 247, 217, 232, 249, 223, 123, 242, 242, 247, + 217, 232, 249, 87, 229, 5, 232, 249, 113, 46, 115, 106, 51, 232, 249, + 113, 51, 115, 106, 46, 232, 249, 113, 26, 106, 198, 182, 138, 247, 238, + 46, 26, 51, 198, 182, 138, 247, 238, 113, 46, 198, 182, 217, 31, 204, 52, + 113, 51, 198, 182, 217, 31, 204, 52, 106, 51, 198, 182, 217, 31, 204, 52, + 106, 46, 198, 182, 217, 31, 204, 52, 105, 119, 152, 237, 11, 113, 246, + 138, 115, 85, 220, 28, 105, 119, 152, 237, 11, 113, 246, 138, 115, 85, + 207, 101, 105, 119, 152, 237, 11, 85, 46, 115, 106, 246, 137, 105, 119, + 152, 237, 11, 85, 51, 115, 106, 246, 137, 105, 119, 152, 237, 11, 113, + 246, 138, 115, 85, 46, 115, 106, 246, 137, 105, 119, 152, 237, 11, 113, + 246, 138, 115, 85, 51, 115, 106, 246, 137, 105, 119, 152, 237, 11, 85, + 46, 115, 106, 246, 138, 115, 85, 207, 101, 105, 119, 152, 237, 11, 85, + 46, 115, 113, 246, 138, 115, 85, 207, 101, 105, 119, 152, 237, 11, 113, + 246, 138, 115, 85, 46, 26, 85, 51, 115, 106, 246, 137, 105, 119, 152, + 237, 11, 113, 246, 138, 115, 85, 51, 26, 85, 46, 115, 106, 246, 137, 105, + 119, 152, 237, 11, 113, 246, 138, 115, 85, 51, 115, 106, 246, 138, 115, + 85, 220, 28, 105, 119, 152, 237, 11, 113, 246, 138, 115, 85, 46, 115, + 106, 246, 138, 115, 85, 207, 101, 105, 119, 152, 237, 11, 85, 46, 115, + 113, 246, 138, 115, 85, 51, 115, 106, 246, 137, 105, 119, 152, 237, 11, + 85, 51, 115, 113, 246, 138, 115, 85, 46, 115, 106, 246, 137, 105, 119, + 152, 237, 11, 237, 4, 105, 119, 152, 229, 5, 4, 84, 111, 250, 76, 209, + 189, 223, 123, 242, 244, 77, 46, 138, 206, 192, 217, 160, 51, 138, 206, + 192, 217, 160, 223, 123, 235, 92, 61, 4, 199, 74, 220, 18, 114, 61, 26, + 113, 26, 106, 90, 234, 144, 247, 238, 94, 61, 26, 113, 26, 106, 90, 234, + 144, 247, 238, 235, 92, 61, 26, 51, 90, 234, 144, 247, 238, 197, 30, 61, + 26, 51, 90, 234, 144, 247, 238, 46, 138, 232, 160, 51, 138, 232, 160, + 195, 244, 33, 238, 183, 51, 211, 184, 108, 236, 114, 214, 199, 237, 11, + 238, 183, 214, 199, 237, 11, 85, 51, 115, 106, 246, 137, 214, 199, 237, + 11, 237, 4, 62, 87, 206, 52, 4, 207, 7, 238, 222, 46, 199, 192, 62, 51, + 209, 188, 223, 176, 85, 199, 192, 62, 51, 209, 188, 223, 176, 51, 199, + 192, 62, 51, 209, 188, 223, 176, 214, 199, 108, 208, 159, 77, 201, 250, + 233, 0, 201, 250, 233, 1, 4, 250, 89, 208, 38, 201, 250, 233, 1, 220, 35, + 220, 28, 201, 250, 233, 1, 220, 35, 207, 101, 201, 250, 233, 1, 4, 235, + 79, 62, 197, 40, 242, 220, 205, 197, 17, 192, 76, 205, 197, 17, 101, 205, + 197, 17, 104, 205, 197, 17, 133, 205, 197, 17, 134, 205, 197, 17, 151, + 205, 197, 17, 170, 205, 197, 17, 179, 205, 197, 17, 174, 205, 197, 17, + 182, 12, 15, 228, 38, 12, 15, 228, 37, 12, 15, 228, 36, 12, 15, 228, 35, + 12, 15, 228, 34, 12, 15, 228, 33, 12, 15, 228, 32, 12, 15, 228, 31, 12, + 15, 228, 30, 12, 15, 228, 29, 12, 15, 228, 28, 12, 15, 228, 27, 12, 15, + 228, 26, 12, 15, 228, 25, 12, 15, 228, 24, 12, 15, 228, 23, 12, 15, 228, + 22, 12, 15, 228, 21, 12, 15, 228, 20, 12, 15, 228, 19, 12, 15, 228, 18, + 12, 15, 228, 17, 12, 15, 228, 16, 12, 15, 228, 15, 12, 15, 228, 14, 12, + 15, 228, 13, 12, 15, 228, 12, 12, 15, 228, 11, 12, 15, 228, 10, 12, 15, + 228, 9, 12, 15, 228, 8, 12, 15, 228, 7, 12, 15, 228, 6, 12, 15, 228, 5, + 12, 15, 228, 4, 12, 15, 228, 3, 12, 15, 228, 2, 12, 15, 228, 1, 12, 15, + 228, 0, 12, 15, 227, 255, 12, 15, 227, 254, 12, 15, 227, 253, 12, 15, + 227, 252, 12, 15, 227, 251, 12, 15, 227, 250, 12, 15, 227, 249, 12, 15, + 227, 248, 12, 15, 227, 247, 12, 15, 227, 246, 12, 15, 227, 245, 12, 15, + 227, 244, 12, 15, 227, 243, 12, 15, 227, 242, 12, 15, 227, 241, 12, 15, + 227, 240, 12, 15, 227, 239, 12, 15, 227, 238, 12, 15, 227, 237, 12, 15, + 227, 236, 12, 15, 227, 235, 12, 15, 227, 234, 12, 15, 227, 233, 12, 15, + 227, 232, 12, 15, 227, 231, 12, 15, 227, 230, 12, 15, 227, 229, 12, 15, + 227, 228, 12, 15, 227, 227, 12, 15, 227, 226, 12, 15, 227, 225, 12, 15, + 227, 224, 12, 15, 227, 223, 12, 15, 227, 222, 12, 15, 227, 221, 12, 15, + 227, 220, 12, 15, 227, 219, 12, 15, 227, 218, 12, 15, 227, 217, 12, 15, + 227, 216, 12, 15, 227, 215, 12, 15, 227, 214, 12, 15, 227, 213, 12, 15, + 227, 212, 12, 15, 227, 211, 12, 15, 227, 210, 12, 15, 227, 209, 12, 15, + 227, 208, 12, 15, 227, 207, 12, 15, 227, 206, 12, 15, 227, 205, 12, 15, + 227, 204, 12, 15, 227, 203, 12, 15, 227, 202, 12, 15, 227, 201, 12, 15, + 227, 200, 12, 15, 227, 199, 12, 15, 227, 198, 12, 15, 227, 197, 12, 15, + 227, 196, 12, 15, 227, 195, 12, 15, 227, 194, 12, 15, 227, 193, 12, 15, + 227, 192, 12, 15, 227, 191, 12, 15, 227, 190, 12, 15, 227, 189, 12, 15, + 227, 188, 12, 15, 227, 187, 12, 15, 227, 186, 12, 15, 227, 185, 12, 15, + 227, 184, 12, 15, 227, 183, 12, 15, 227, 182, 12, 15, 227, 181, 12, 15, + 227, 180, 12, 15, 227, 179, 12, 15, 227, 178, 12, 15, 227, 177, 12, 15, + 227, 176, 12, 15, 227, 175, 12, 15, 227, 174, 12, 15, 227, 173, 12, 15, + 227, 172, 12, 15, 227, 171, 12, 15, 227, 170, 12, 15, 227, 169, 12, 15, + 227, 168, 12, 15, 227, 167, 12, 15, 227, 166, 12, 15, 227, 165, 12, 15, + 227, 164, 12, 15, 227, 163, 12, 15, 227, 162, 12, 15, 227, 161, 12, 15, + 227, 160, 12, 15, 227, 159, 12, 15, 227, 158, 12, 15, 227, 157, 12, 15, + 227, 156, 12, 15, 227, 155, 12, 15, 227, 154, 12, 15, 227, 153, 12, 15, + 227, 152, 12, 15, 227, 151, 12, 15, 227, 150, 12, 15, 227, 149, 12, 15, + 227, 148, 12, 15, 227, 147, 12, 15, 227, 146, 12, 15, 227, 145, 12, 15, + 227, 144, 12, 15, 227, 143, 12, 15, 227, 142, 12, 15, 227, 141, 12, 15, + 227, 140, 12, 15, 227, 139, 12, 15, 227, 138, 12, 15, 227, 137, 12, 15, + 227, 136, 12, 15, 227, 135, 12, 15, 227, 134, 12, 15, 227, 133, 12, 15, + 227, 132, 12, 15, 227, 131, 12, 15, 227, 130, 12, 15, 227, 129, 12, 15, + 227, 128, 12, 15, 227, 127, 12, 15, 227, 126, 12, 15, 227, 125, 12, 15, + 227, 124, 12, 15, 227, 123, 12, 15, 227, 122, 12, 15, 227, 121, 12, 15, + 227, 120, 12, 15, 227, 119, 12, 15, 227, 118, 12, 15, 227, 117, 12, 15, + 227, 116, 12, 15, 227, 115, 12, 15, 227, 114, 12, 15, 227, 113, 12, 15, + 227, 112, 12, 15, 227, 111, 12, 15, 227, 110, 12, 15, 227, 109, 12, 15, + 227, 108, 12, 15, 227, 107, 12, 15, 227, 106, 12, 15, 227, 105, 12, 15, + 227, 104, 12, 15, 227, 103, 12, 15, 227, 102, 12, 15, 227, 101, 12, 15, + 227, 100, 12, 15, 227, 99, 12, 15, 227, 98, 12, 15, 227, 97, 12, 15, 227, + 96, 12, 15, 227, 95, 12, 15, 227, 94, 12, 15, 227, 93, 12, 15, 227, 92, + 12, 15, 227, 91, 12, 15, 227, 90, 12, 15, 227, 89, 12, 15, 227, 88, 12, + 15, 227, 87, 12, 15, 227, 86, 12, 15, 227, 85, 12, 15, 227, 84, 12, 15, + 227, 83, 12, 15, 227, 82, 12, 15, 227, 81, 12, 15, 227, 80, 12, 15, 227, + 79, 12, 15, 227, 78, 12, 15, 227, 77, 12, 15, 227, 76, 12, 15, 227, 75, + 12, 15, 227, 74, 12, 15, 227, 73, 12, 15, 227, 72, 12, 15, 227, 71, 12, + 15, 227, 70, 12, 15, 227, 69, 12, 15, 227, 68, 12, 15, 227, 67, 12, 15, + 227, 66, 12, 15, 227, 65, 12, 15, 227, 64, 12, 15, 227, 63, 12, 15, 227, + 62, 12, 15, 227, 61, 12, 15, 227, 60, 12, 15, 227, 59, 12, 15, 227, 58, + 12, 15, 227, 57, 12, 15, 227, 56, 12, 15, 227, 55, 12, 15, 227, 54, 12, + 15, 227, 53, 12, 15, 227, 52, 12, 15, 227, 51, 12, 15, 227, 50, 12, 15, + 227, 49, 12, 15, 227, 48, 12, 15, 227, 47, 12, 15, 227, 46, 12, 15, 227, + 45, 12, 15, 227, 44, 12, 15, 227, 43, 12, 15, 227, 42, 12, 15, 227, 41, + 12, 15, 227, 40, 12, 15, 227, 39, 12, 15, 227, 38, 12, 15, 227, 37, 12, + 15, 227, 36, 12, 15, 227, 35, 12, 15, 227, 34, 12, 15, 227, 33, 12, 15, + 227, 32, 12, 15, 227, 31, 12, 15, 227, 30, 12, 15, 227, 29, 12, 15, 227, + 28, 12, 15, 227, 27, 12, 15, 227, 26, 12, 15, 227, 25, 12, 15, 227, 24, + 12, 15, 227, 23, 12, 15, 227, 22, 12, 15, 227, 21, 12, 15, 227, 20, 12, + 15, 227, 19, 12, 15, 227, 18, 12, 15, 227, 17, 12, 15, 227, 16, 12, 15, + 227, 15, 12, 15, 227, 14, 12, 15, 227, 13, 12, 15, 227, 12, 12, 15, 227, + 11, 12, 15, 227, 10, 12, 15, 227, 9, 12, 15, 227, 8, 12, 15, 227, 7, 12, + 15, 227, 6, 12, 15, 227, 5, 12, 15, 227, 4, 12, 15, 227, 3, 12, 15, 227, + 2, 12, 15, 227, 1, 12, 15, 227, 0, 12, 15, 226, 255, 12, 15, 226, 254, + 12, 15, 226, 253, 12, 15, 226, 252, 12, 15, 226, 251, 12, 15, 226, 250, + 12, 15, 226, 249, 12, 15, 226, 248, 12, 15, 226, 247, 12, 15, 226, 246, + 12, 15, 226, 245, 12, 15, 226, 244, 12, 15, 226, 243, 12, 15, 226, 242, + 12, 15, 226, 241, 12, 15, 226, 240, 12, 15, 226, 239, 12, 15, 226, 238, + 12, 15, 226, 237, 12, 15, 226, 236, 12, 15, 226, 235, 12, 15, 226, 234, + 12, 15, 226, 233, 12, 15, 226, 232, 12, 15, 226, 231, 12, 15, 226, 230, + 12, 15, 226, 229, 12, 15, 226, 228, 12, 15, 226, 227, 12, 15, 226, 226, + 12, 15, 226, 225, 12, 15, 226, 224, 12, 15, 226, 223, 12, 15, 226, 222, + 12, 15, 226, 221, 12, 15, 226, 220, 12, 15, 226, 219, 12, 15, 226, 218, + 12, 15, 226, 217, 12, 15, 226, 216, 12, 15, 226, 215, 12, 15, 226, 214, + 12, 15, 226, 213, 12, 15, 226, 212, 12, 15, 226, 211, 12, 15, 226, 210, + 12, 15, 226, 209, 12, 15, 226, 208, 12, 15, 226, 207, 12, 15, 226, 206, + 12, 15, 226, 205, 12, 15, 226, 204, 12, 15, 226, 203, 12, 15, 226, 202, + 12, 15, 226, 201, 12, 15, 226, 200, 12, 15, 226, 199, 12, 15, 226, 198, + 12, 15, 226, 197, 12, 15, 226, 196, 12, 15, 226, 195, 12, 15, 226, 194, + 12, 15, 226, 193, 12, 15, 226, 192, 12, 15, 226, 191, 12, 15, 226, 190, + 12, 15, 226, 189, 12, 15, 226, 188, 12, 15, 226, 187, 12, 15, 226, 186, + 12, 15, 226, 185, 12, 15, 226, 184, 12, 15, 226, 183, 12, 15, 226, 182, + 12, 15, 226, 181, 12, 15, 226, 180, 12, 15, 226, 179, 12, 15, 226, 178, + 12, 15, 226, 177, 12, 15, 226, 176, 12, 15, 226, 175, 12, 15, 226, 174, + 12, 15, 226, 173, 12, 15, 226, 172, 12, 15, 226, 171, 12, 15, 226, 170, + 12, 15, 226, 169, 12, 15, 226, 168, 12, 15, 226, 167, 12, 15, 226, 166, + 12, 15, 226, 165, 12, 15, 226, 164, 12, 15, 226, 163, 12, 15, 226, 162, + 12, 15, 226, 161, 12, 15, 226, 160, 12, 15, 226, 159, 12, 15, 226, 158, + 12, 15, 226, 157, 12, 15, 226, 156, 12, 15, 226, 155, 12, 15, 226, 154, + 12, 15, 226, 153, 12, 15, 226, 152, 12, 15, 226, 151, 12, 15, 226, 150, + 12, 15, 226, 149, 12, 15, 226, 148, 12, 15, 226, 147, 12, 15, 226, 146, + 12, 15, 226, 145, 12, 15, 226, 144, 12, 15, 226, 143, 12, 15, 226, 142, + 12, 15, 226, 141, 12, 15, 226, 140, 12, 15, 226, 139, 12, 15, 226, 138, + 12, 15, 226, 137, 12, 15, 226, 136, 12, 15, 226, 135, 12, 15, 226, 134, + 12, 15, 226, 133, 12, 15, 226, 132, 12, 15, 226, 131, 12, 15, 226, 130, + 12, 15, 226, 129, 12, 15, 226, 128, 12, 15, 226, 127, 12, 15, 226, 126, + 12, 15, 226, 125, 12, 15, 226, 124, 12, 15, 226, 123, 12, 15, 226, 122, + 12, 15, 226, 121, 12, 15, 226, 120, 12, 15, 226, 119, 12, 15, 226, 118, + 12, 15, 226, 117, 12, 15, 226, 116, 12, 15, 226, 115, 12, 15, 226, 114, + 12, 15, 226, 113, 12, 15, 226, 112, 12, 15, 226, 111, 12, 15, 226, 110, + 12, 15, 226, 109, 12, 15, 226, 108, 12, 15, 226, 107, 12, 15, 226, 106, + 12, 15, 226, 105, 12, 15, 226, 104, 12, 15, 226, 103, 12, 15, 226, 102, + 12, 15, 226, 101, 12, 15, 226, 100, 12, 15, 226, 99, 12, 15, 226, 98, 12, + 15, 226, 97, 12, 15, 226, 96, 12, 15, 226, 95, 12, 15, 226, 94, 12, 15, + 226, 93, 12, 15, 226, 92, 12, 15, 226, 91, 12, 15, 226, 90, 12, 15, 226, + 89, 12, 15, 226, 88, 12, 15, 226, 87, 12, 15, 226, 86, 12, 15, 226, 85, + 12, 15, 226, 84, 12, 15, 226, 83, 12, 15, 226, 82, 12, 15, 226, 81, 12, + 15, 226, 80, 12, 15, 226, 79, 12, 15, 226, 78, 12, 15, 226, 77, 12, 15, + 226, 76, 12, 15, 226, 75, 12, 15, 226, 74, 12, 15, 226, 73, 12, 15, 226, + 72, 12, 15, 226, 71, 12, 15, 226, 70, 12, 15, 226, 69, 12, 15, 226, 68, + 12, 15, 226, 67, 12, 15, 226, 66, 12, 15, 226, 65, 12, 15, 226, 64, 12, + 15, 226, 63, 12, 15, 226, 62, 12, 15, 226, 61, 12, 15, 226, 60, 12, 15, + 226, 59, 12, 15, 226, 58, 12, 15, 226, 57, 12, 15, 226, 56, 12, 15, 226, + 55, 12, 15, 226, 54, 12, 15, 226, 53, 12, 15, 226, 52, 12, 15, 226, 51, + 12, 15, 226, 50, 12, 15, 226, 49, 12, 15, 226, 48, 12, 15, 226, 47, 12, + 15, 226, 46, 12, 15, 226, 45, 12, 15, 226, 44, 12, 15, 226, 43, 12, 15, + 226, 42, 12, 15, 226, 41, 12, 15, 226, 40, 12, 15, 226, 39, 12, 15, 226, + 38, 12, 15, 226, 37, 12, 15, 226, 36, 12, 15, 226, 35, 12, 15, 226, 34, + 12, 15, 226, 33, 12, 15, 226, 32, 12, 15, 226, 31, 12, 15, 226, 30, 12, + 15, 226, 29, 12, 15, 226, 28, 12, 15, 226, 27, 12, 15, 226, 26, 12, 15, + 226, 25, 12, 15, 226, 24, 12, 15, 226, 23, 12, 15, 226, 22, 12, 15, 226, + 21, 12, 15, 226, 20, 12, 15, 226, 19, 12, 15, 226, 18, 12, 15, 226, 17, + 12, 15, 226, 16, 12, 15, 226, 15, 12, 15, 226, 14, 12, 15, 226, 13, 12, + 15, 226, 12, 12, 15, 226, 11, 12, 15, 226, 10, 12, 15, 226, 9, 220, 79, + 200, 155, 190, 202, 160, 190, 233, 204, 77, 190, 208, 142, 77, 190, 31, + 57, 190, 236, 127, 57, 190, 210, 133, 57, 190, 250, 229, 190, 250, 147, + 190, 46, 210, 230, 190, 51, 210, 230, 190, 250, 37, 190, 102, 57, 190, + 242, 38, 190, 228, 110, 190, 232, 71, 201, 238, 190, 202, 189, 190, 17, + 192, 76, 190, 17, 101, 190, 17, 104, 190, 17, 133, 190, 17, 134, 190, 17, + 151, 190, 17, 170, 190, 17, 179, 190, 17, 174, 190, 17, 182, 190, 242, + 47, 190, 204, 180, 190, 219, 240, 57, 190, 234, 30, 57, 190, 230, 204, + 57, 190, 208, 159, 77, 190, 242, 36, 250, 26, 190, 8, 6, 1, 64, 190, 8, + 6, 1, 249, 226, 190, 8, 6, 1, 247, 52, 190, 8, 6, 1, 238, 95, 190, 8, 6, + 1, 71, 190, 8, 6, 1, 233, 163, 190, 8, 6, 1, 232, 44, 190, 8, 6, 1, 230, + 124, 190, 8, 6, 1, 70, 190, 8, 6, 1, 223, 65, 190, 8, 6, 1, 222, 184, + 190, 8, 6, 1, 165, 190, 8, 6, 1, 218, 236, 190, 8, 6, 1, 215, 151, 190, + 8, 6, 1, 74, 190, 8, 6, 1, 211, 93, 190, 8, 6, 1, 208, 247, 190, 8, 6, 1, + 150, 190, 8, 6, 1, 206, 158, 190, 8, 6, 1, 200, 228, 190, 8, 6, 1, 68, + 190, 8, 6, 1, 196, 236, 190, 8, 6, 1, 194, 202, 190, 8, 6, 1, 193, 223, + 190, 8, 6, 1, 193, 148, 190, 8, 6, 1, 192, 155, 190, 46, 50, 186, 190, + 207, 169, 202, 189, 190, 51, 50, 186, 190, 242, 122, 251, 143, 190, 132, + 219, 175, 190, 230, 211, 251, 143, 190, 8, 2, 1, 64, 190, 8, 2, 1, 249, + 226, 190, 8, 2, 1, 247, 52, 190, 8, 2, 1, 238, 95, 190, 8, 2, 1, 71, 190, + 8, 2, 1, 233, 163, 190, 8, 2, 1, 232, 44, 190, 8, 2, 1, 230, 124, 190, 8, + 2, 1, 70, 190, 8, 2, 1, 223, 65, 190, 8, 2, 1, 222, 184, 190, 8, 2, 1, + 165, 190, 8, 2, 1, 218, 236, 190, 8, 2, 1, 215, 151, 190, 8, 2, 1, 74, + 190, 8, 2, 1, 211, 93, 190, 8, 2, 1, 208, 247, 190, 8, 2, 1, 150, 190, 8, + 2, 1, 206, 158, 190, 8, 2, 1, 200, 228, 190, 8, 2, 1, 68, 190, 8, 2, 1, + 196, 236, 190, 8, 2, 1, 194, 202, 190, 8, 2, 1, 193, 223, 190, 8, 2, 1, + 193, 148, 190, 8, 2, 1, 192, 155, 190, 46, 238, 138, 186, 190, 84, 219, + 175, 190, 51, 238, 138, 186, 190, 199, 90, 246, 242, 200, 155, 65, 205, + 110, 65, 205, 99, 65, 205, 88, 65, 205, 76, 65, 205, 65, 65, 205, 54, 65, + 205, 43, 65, 205, 32, 65, 205, 21, 65, 205, 13, 65, 205, 12, 65, 205, 11, + 65, 205, 10, 65, 205, 8, 65, 205, 7, 65, 205, 6, 65, 205, 5, 65, 205, 4, + 65, 205, 3, 65, 205, 2, 65, 205, 1, 65, 205, 0, 65, 204, 255, 65, 204, + 253, 65, 204, 252, 65, 204, 251, 65, 204, 250, 65, 204, 249, 65, 204, + 248, 65, 204, 247, 65, 204, 246, 65, 204, 245, 65, 204, 244, 65, 204, + 242, 65, 204, 241, 65, 204, 240, 65, 204, 239, 65, 204, 238, 65, 204, + 237, 65, 204, 236, 65, 204, 235, 65, 204, 234, 65, 204, 233, 65, 204, + 231, 65, 204, 230, 65, 204, 229, 65, 204, 228, 65, 204, 227, 65, 204, + 226, 65, 204, 225, 65, 204, 224, 65, 204, 223, 65, 204, 222, 65, 204, + 220, 65, 204, 219, 65, 204, 218, 65, 204, 217, 65, 204, 216, 65, 204, + 215, 65, 204, 214, 65, 204, 213, 65, 204, 212, 65, 204, 211, 65, 204, + 209, 65, 204, 208, 65, 204, 207, 65, 204, 206, 65, 204, 205, 65, 204, + 204, 65, 204, 203, 65, 204, 202, 65, 204, 201, 65, 204, 200, 65, 204, + 198, 65, 204, 197, 65, 204, 196, 65, 204, 195, 65, 204, 194, 65, 204, + 193, 65, 204, 192, 65, 204, 191, 65, 204, 190, 65, 204, 189, 65, 205, + 186, 65, 205, 185, 65, 205, 184, 65, 205, 183, 65, 205, 182, 65, 205, + 181, 65, 205, 180, 65, 205, 179, 65, 205, 178, 65, 205, 177, 65, 205, + 175, 65, 205, 174, 65, 205, 173, 65, 205, 172, 65, 205, 171, 65, 205, + 170, 65, 205, 169, 65, 205, 168, 65, 205, 167, 65, 205, 166, 65, 205, + 164, 65, 205, 163, 65, 205, 162, 65, 205, 161, 65, 205, 160, 65, 205, + 159, 65, 205, 158, 65, 205, 157, 65, 205, 156, 65, 205, 155, 65, 205, + 153, 65, 205, 152, 65, 205, 151, 65, 205, 150, 65, 205, 149, 65, 205, + 148, 65, 205, 147, 65, 205, 146, 65, 205, 145, 65, 205, 144, 65, 205, + 142, 65, 205, 141, 65, 205, 140, 65, 205, 139, 65, 205, 138, 65, 205, + 137, 65, 205, 136, 65, 205, 135, 65, 205, 134, 65, 205, 133, 65, 205, + 131, 65, 205, 130, 65, 205, 129, 65, 205, 128, 65, 205, 127, 65, 205, + 126, 65, 205, 125, 65, 205, 124, 65, 205, 123, 65, 205, 122, 65, 205, + 120, 65, 205, 119, 65, 205, 118, 65, 205, 117, 65, 205, 116, 65, 205, + 115, 65, 205, 114, 65, 205, 113, 65, 205, 112, 65, 205, 111, 65, 205, + 109, 65, 205, 108, 65, 205, 107, 65, 205, 106, 65, 205, 105, 65, 205, + 104, 65, 205, 103, 65, 205, 102, 65, 205, 101, 65, 205, 100, 65, 205, 98, + 65, 205, 97, 65, 205, 96, 65, 205, 95, 65, 205, 94, 65, 205, 93, 65, 205, + 92, 65, 205, 91, 65, 205, 90, 65, 205, 89, 65, 205, 87, 65, 205, 86, 65, + 205, 85, 65, 205, 84, 65, 205, 83, 65, 205, 82, 65, 205, 81, 65, 205, 80, + 65, 205, 79, 65, 205, 78, 65, 205, 75, 65, 205, 74, 65, 205, 73, 65, 205, + 72, 65, 205, 71, 65, 205, 70, 65, 205, 69, 65, 205, 68, 65, 205, 67, 65, + 205, 66, 65, 205, 64, 65, 205, 63, 65, 205, 62, 65, 205, 61, 65, 205, 60, + 65, 205, 59, 65, 205, 58, 65, 205, 57, 65, 205, 56, 65, 205, 55, 65, 205, + 53, 65, 205, 52, 65, 205, 51, 65, 205, 50, 65, 205, 49, 65, 205, 48, 65, + 205, 47, 65, 205, 46, 65, 205, 45, 65, 205, 44, 65, 205, 42, 65, 205, 41, + 65, 205, 40, 65, 205, 39, 65, 205, 38, 65, 205, 37, 65, 205, 36, 65, 205, + 35, 65, 205, 34, 65, 205, 33, 65, 205, 31, 65, 205, 30, 65, 205, 29, 65, + 205, 28, 65, 205, 27, 65, 205, 26, 65, 205, 25, 65, 205, 24, 65, 205, 23, + 65, 205, 22, 65, 205, 20, 65, 205, 19, 65, 205, 18, 65, 205, 17, 65, 205, + 16, 65, 205, 15, 65, 205, 14, 212, 238, 212, 240, 202, 15, 80, 229, 242, + 202, 193, 202, 15, 80, 199, 244, 201, 186, 234, 80, 80, 199, 244, 233, + 232, 234, 80, 80, 198, 208, 234, 42, 234, 66, 234, 67, 251, 134, 251, + 135, 251, 23, 248, 89, 248, 246, 247, 130, 246, 100, 200, 161, 229, 5, + 200, 161, 228, 186, 200, 166, 219, 176, 233, 38, 214, 177, 219, 175, 234, + 80, 80, 219, 175, 219, 224, 213, 204, 234, 45, 219, 176, 200, 161, 84, + 200, 161, 194, 225, 232, 136, 233, 38, 233, 15, 246, 203, 207, 172, 238, + 202, 203, 232, 211, 125, 219, 97, 101, 202, 212, 203, 232, 223, 190, 219, + 97, 192, 76, 203, 125, 237, 180, 219, 166, 234, 1, 236, 157, 237, 47, + 238, 243, 101, 237, 169, 237, 47, 238, 243, 104, 237, 168, 237, 47, 238, + 243, 133, 237, 167, 237, 47, 238, 243, 134, 237, 166, 214, 199, 251, 134, + 215, 67, 200, 254, 223, 253, 201, 2, 234, 80, 80, 198, 209, 247, 238, + 233, 239, 246, 241, 246, 243, 234, 80, 80, 217, 30, 234, 43, 201, 151, + 201, 169, 234, 1, 234, 2, 223, 165, 204, 166, 134, 232, 251, 204, 165, + 232, 81, 223, 165, 204, 166, 133, 230, 194, 204, 165, 230, 191, 223, 165, + 204, 166, 104, 207, 248, 204, 165, 206, 224, 223, 165, 204, 166, 101, + 197, 55, 204, 165, 197, 10, 202, 163, 237, 86, 237, 88, 211, 65, 246, 99, + 211, 67, 139, 212, 7, 209, 104, 229, 8, 247, 155, 210, 123, 229, 202, + 247, 169, 213, 143, 247, 155, 229, 202, 215, 28, 223, 176, 223, 178, 214, + 170, 219, 175, 214, 197, 202, 15, 80, 205, 191, 250, 106, 202, 92, 234, + 80, 80, 205, 191, 250, 106, 234, 4, 246, 100, 200, 162, 204, 151, 229, 5, + 200, 162, 204, 151, 228, 183, 246, 100, 200, 162, 4, 222, 196, 229, 5, + 200, 162, 4, 222, 196, 228, 184, 219, 176, 200, 162, 204, 151, 84, 200, + 162, 204, 151, 194, 224, 210, 222, 219, 176, 232, 123, 210, 222, 219, + 176, 235, 96, 209, 219, 210, 222, 219, 176, 248, 245, 210, 222, 219, 176, + 197, 41, 209, 213, 207, 169, 219, 176, 233, 38, 207, 169, 223, 176, 207, + 151, 203, 74, 203, 232, 104, 203, 71, 202, 94, 203, 74, 203, 232, 133, + 203, 70, 202, 93, 237, 47, 238, 243, 201, 210, 237, 164, 209, 89, 197, 9, + 101, 209, 89, 197, 7, 209, 50, 209, 89, 197, 9, 104, 209, 89, 197, 6, + 209, 49, 204, 152, 198, 207, 202, 12, 201, 193, 246, 242, 246, 99, 246, + 177, 216, 244, 194, 155, 215, 169, 202, 15, 80, 230, 179, 250, 106, 202, + 15, 80, 209, 68, 250, 106, 202, 162, 234, 80, 80, 230, 179, 250, 106, + 234, 80, 80, 209, 68, 250, 106, 234, 40, 202, 15, 80, 201, 210, 202, 178, + 203, 74, 230, 216, 246, 100, 223, 124, 204, 69, 203, 74, 246, 100, 223, + 124, 205, 239, 238, 243, 204, 162, 223, 124, 238, 163, 201, 211, 200, 15, + 202, 35, 211, 175, 200, 243, 242, 37, 211, 142, 209, 90, 216, 243, 209, + 201, 250, 143, 209, 83, 242, 37, 250, 160, 215, 16, 203, 134, 8, 6, 1, + 231, 84, 8, 2, 1, 231, 84, 246, 120, 251, 2, 200, 248, 201, 157, 242, 48, + 203, 16, 220, 28, 222, 115, 1, 219, 126, 220, 77, 1, 232, 165, 232, 156, + 220, 77, 1, 232, 165, 233, 50, 220, 77, 1, 207, 55, 220, 77, 1, 219, 107, + 86, 122, 247, 250, 203, 205, 231, 47, 216, 193, 207, 159, 30, 123, 193, + 43, 30, 123, 193, 39, 30, 123, 202, 70, 30, 123, 193, 44, 232, 58, 232, + 57, 232, 56, 215, 171, 191, 233, 191, 234, 191, 236, 219, 40, 207, 63, + 219, 42, 207, 65, 210, 184, 219, 39, 207, 62, 213, 174, 216, 95, 194, 38, + 219, 41, 207, 64, 232, 80, 210, 183, 194, 97, 234, 104, 232, 68, 216, + 167, 211, 212, 197, 11, 109, 216, 167, 237, 186, 109, 114, 198, 184, 61, + 4, 55, 84, 111, 94, 198, 184, 61, 4, 55, 84, 111, 11, 5, 223, 80, 77, + 195, 225, 195, 114, 195, 46, 195, 35, 195, 24, 195, 13, 195, 2, 194, 247, + 194, 236, 195, 224, 195, 213, 195, 202, 195, 191, 195, 180, 195, 169, + 195, 158, 209, 105, 232, 136, 39, 84, 51, 62, 219, 247, 186, 247, 57, + 211, 159, 77, 247, 209, 191, 235, 10, 3, 212, 248, 200, 19, 10, 3, 212, + 248, 136, 212, 248, 247, 90, 136, 247, 89, 217, 36, 6, 1, 230, 124, 217, + 36, 6, 1, 214, 167, 217, 36, 2, 1, 230, 124, 217, 36, 2, 1, 214, 167, 59, + 1, 234, 252, 69, 35, 16, 232, 79, 203, 12, 242, 172, 196, 133, 195, 147, + 195, 136, 195, 125, 195, 113, 195, 102, 195, 91, 195, 80, 195, 69, 195, + 58, 195, 50, 195, 49, 195, 48, 195, 47, 195, 45, 195, 44, 195, 43, 195, + 42, 195, 41, 195, 40, 195, 39, 195, 38, 195, 37, 195, 36, 195, 34, 195, + 33, 195, 32, 195, 31, 195, 30, 195, 29, 195, 28, 195, 27, 195, 26, 195, + 25, 195, 23, 195, 22, 195, 21, 195, 20, 195, 19, 195, 18, 195, 17, 195, + 16, 195, 15, 195, 14, 195, 12, 195, 11, 195, 10, 195, 9, 195, 8, 195, 7, + 195, 6, 195, 5, 195, 4, 195, 3, 195, 1, 195, 0, 194, 255, 194, 254, 194, + 253, 194, 252, 194, 251, 194, 250, 194, 249, 194, 248, 194, 246, 194, + 245, 194, 244, 194, 243, 194, 242, 194, 241, 194, 240, 194, 239, 194, + 238, 194, 237, 194, 235, 194, 234, 194, 233, 194, 232, 194, 231, 194, + 230, 194, 229, 194, 228, 194, 227, 194, 226, 195, 223, 195, 222, 195, + 221, 195, 220, 195, 219, 195, 218, 195, 217, 195, 216, 195, 215, 195, + 214, 195, 212, 195, 211, 195, 210, 195, 209, 195, 208, 195, 207, 195, + 206, 195, 205, 195, 204, 195, 203, 195, 201, 195, 200, 195, 199, 195, + 198, 195, 197, 195, 196, 195, 195, 195, 194, 195, 193, 195, 192, 195, + 190, 195, 189, 195, 188, 195, 187, 195, 186, 195, 185, 195, 184, 195, + 183, 195, 182, 195, 181, 195, 179, 195, 178, 195, 177, 195, 176, 195, + 175, 195, 174, 195, 173, 195, 172, 195, 171, 195, 170, 195, 168, 195, + 167, 195, 166, 195, 165, 195, 164, 195, 163, 195, 162, 195, 161, 195, + 160, 195, 159, 195, 157, 195, 156, 195, 155, 195, 154, 195, 153, 195, + 152, 195, 151, 195, 150, 195, 149, 195, 148, 195, 146, 195, 145, 195, + 144, 195, 143, 195, 142, 195, 141, 195, 140, 195, 139, 195, 138, 195, + 137, 195, 135, 195, 134, 195, 133, 195, 132, 195, 131, 195, 130, 195, + 129, 195, 128, 195, 127, 195, 126, 195, 124, 195, 123, 195, 122, 195, + 121, 195, 120, 195, 119, 195, 118, 195, 117, 195, 116, 195, 115, 195, + 112, 195, 111, 195, 110, 195, 109, 195, 108, 195, 107, 195, 106, 195, + 105, 195, 104, 195, 103, 195, 101, 195, 100, 195, 99, 195, 98, 195, 97, + 195, 96, 195, 95, 195, 94, 195, 93, 195, 92, 195, 90, 195, 89, 195, 88, + 195, 87, 195, 86, 195, 85, 195, 84, 195, 83, 195, 82, 195, 81, 195, 79, + 195, 78, 195, 77, 195, 76, 195, 75, 195, 74, 195, 73, 195, 72, 195, 71, + 195, 70, 195, 68, 195, 67, 195, 66, 195, 65, 195, 64, 195, 63, 195, 62, + 195, 61, 195, 60, 195, 59, 195, 57, 195, 56, 195, 55, 195, 54, 195, 53, + 195, 52, 195, 51, 221, 254, 31, 57, 221, 254, 250, 37, 221, 254, 17, 192, + 76, 221, 254, 17, 101, 221, 254, 17, 104, 221, 254, 17, 133, 221, 254, + 17, 134, 221, 254, 17, 151, 221, 254, 17, 170, 221, 254, 17, 179, 221, + 254, 17, 174, 221, 254, 17, 182, 8, 6, 1, 41, 4, 217, 215, 26, 230, 210, + 8, 2, 1, 41, 4, 217, 215, 26, 230, 210, 8, 6, 1, 228, 97, 4, 217, 215, + 26, 230, 210, 8, 2, 1, 228, 97, 4, 217, 215, 26, 230, 210, 8, 6, 1, 124, + 4, 217, 215, 26, 230, 210, 8, 2, 1, 124, 4, 217, 215, 26, 230, 210, 8, 6, + 1, 234, 253, 4, 84, 219, 176, 63, 8, 2, 1, 234, 253, 4, 84, 219, 176, 63, + 8, 6, 1, 234, 253, 4, 84, 219, 176, 248, 84, 26, 230, 210, 8, 2, 1, 234, + 253, 4, 84, 219, 176, 248, 84, 26, 230, 210, 8, 6, 1, 234, 253, 4, 84, + 219, 176, 248, 84, 26, 251, 129, 8, 2, 1, 234, 253, 4, 84, 219, 176, 248, + 84, 26, 251, 129, 8, 6, 1, 185, 4, 84, 219, 176, 63, 8, 2, 1, 185, 4, 84, + 219, 176, 63, 8, 6, 1, 185, 4, 84, 219, 176, 248, 84, 26, 230, 210, 8, 2, + 1, 185, 4, 84, 219, 176, 248, 84, 26, 230, 210, 8, 6, 1, 185, 4, 84, 219, + 176, 248, 84, 26, 251, 129, 8, 2, 1, 185, 4, 84, 219, 176, 248, 84, 26, + 251, 129, 8, 6, 1, 206, 159, 4, 84, 219, 176, 63, 8, 2, 1, 206, 159, 4, + 84, 219, 176, 63, 8, 6, 1, 234, 253, 4, 242, 122, 26, 217, 214, 8, 2, 1, + 234, 253, 4, 242, 122, 26, 217, 214, 8, 6, 1, 234, 253, 4, 242, 122, 26, + 246, 207, 8, 2, 1, 234, 253, 4, 242, 122, 26, 246, 207, 8, 2, 1, 228, 97, + 4, 78, 95, 26, 251, 129, 8, 2, 1, 214, 168, 4, 199, 91, 58, 8, 6, 1, 41, + 4, 211, 244, 26, 251, 129, 8, 2, 1, 41, 4, 211, 244, 26, 251, 129, 8, 6, + 1, 41, 4, 211, 244, 26, 199, 90, 8, 2, 1, 41, 4, 211, 244, 26, 199, 90, + 8, 6, 1, 234, 253, 4, 211, 244, 26, 251, 129, 8, 2, 1, 234, 253, 4, 211, + 244, 26, 251, 129, 8, 6, 1, 234, 253, 4, 211, 244, 26, 199, 90, 8, 2, 1, + 234, 253, 4, 211, 244, 26, 199, 90, 8, 6, 1, 234, 253, 4, 78, 95, 26, + 251, 129, 8, 2, 1, 234, 253, 4, 78, 95, 26, 251, 129, 8, 6, 1, 234, 253, + 4, 78, 95, 26, 199, 90, 8, 2, 1, 234, 253, 4, 78, 95, 26, 199, 90, 8, 2, + 1, 228, 97, 4, 78, 95, 26, 230, 210, 8, 2, 1, 228, 97, 4, 78, 95, 26, + 199, 90, 8, 6, 1, 228, 97, 4, 211, 244, 26, 251, 129, 8, 2, 1, 228, 97, + 4, 211, 244, 26, 78, 95, 26, 251, 129, 8, 6, 1, 228, 97, 4, 211, 244, 26, + 199, 90, 8, 2, 1, 228, 97, 4, 211, 244, 26, 78, 95, 26, 199, 90, 8, 6, 1, + 223, 66, 4, 199, 90, 8, 2, 1, 223, 66, 4, 78, 95, 26, 199, 90, 8, 6, 1, + 220, 202, 4, 199, 90, 8, 2, 1, 220, 202, 4, 199, 90, 8, 6, 1, 218, 237, + 4, 199, 90, 8, 2, 1, 218, 237, 4, 199, 90, 8, 6, 1, 208, 112, 4, 199, 90, + 8, 2, 1, 208, 112, 4, 199, 90, 8, 6, 1, 124, 4, 211, 244, 26, 251, 129, + 8, 2, 1, 124, 4, 211, 244, 26, 251, 129, 8, 6, 1, 124, 4, 211, 244, 26, + 199, 90, 8, 2, 1, 124, 4, 211, 244, 26, 199, 90, 8, 6, 1, 124, 4, 217, + 215, 26, 251, 129, 8, 2, 1, 124, 4, 217, 215, 26, 251, 129, 8, 6, 1, 124, + 4, 217, 215, 26, 199, 90, 8, 2, 1, 124, 4, 217, 215, 26, 199, 90, 8, 2, + 1, 251, 109, 4, 230, 210, 8, 2, 1, 211, 184, 185, 4, 230, 210, 8, 2, 1, + 211, 184, 185, 4, 251, 129, 8, 2, 1, 163, 196, 237, 4, 230, 210, 8, 2, 1, + 163, 196, 237, 4, 251, 129, 8, 2, 1, 205, 241, 4, 230, 210, 8, 2, 1, 205, + 241, 4, 251, 129, 8, 2, 1, 229, 14, 205, 241, 4, 230, 210, 8, 2, 1, 229, + 14, 205, 241, 4, 251, 129, 9, 204, 162, 97, 4, 230, 67, 95, 4, 251, 26, + 9, 204, 162, 97, 4, 230, 67, 95, 4, 194, 119, 9, 204, 162, 97, 4, 230, + 67, 95, 4, 157, 217, 168, 9, 204, 162, 97, 4, 230, 67, 95, 4, 212, 0, 9, + 204, 162, 97, 4, 230, 67, 95, 4, 68, 9, 204, 162, 97, 4, 230, 67, 95, 4, + 192, 214, 9, 204, 162, 97, 4, 230, 67, 95, 4, 71, 9, 204, 162, 97, 4, + 230, 67, 95, 4, 251, 108, 9, 204, 162, 213, 124, 4, 222, 39, 248, 76, 1, + 221, 224, 44, 116, 222, 184, 44, 116, 214, 167, 44, 116, 247, 52, 44, + 116, 212, 203, 44, 116, 198, 86, 44, 116, 213, 179, 44, 116, 200, 228, + 44, 116, 215, 151, 44, 116, 211, 93, 44, 116, 218, 236, 44, 116, 193, + 148, 44, 116, 150, 44, 116, 165, 44, 116, 196, 236, 44, 116, 219, 127, + 44, 116, 219, 138, 44, 116, 207, 4, 44, 116, 213, 161, 44, 116, 223, 65, + 44, 116, 204, 66, 44, 116, 202, 95, 44, 116, 206, 158, 44, 116, 230, 124, + 44, 116, 221, 48, 44, 5, 222, 159, 44, 5, 221, 204, 44, 5, 221, 183, 44, + 5, 221, 33, 44, 5, 220, 246, 44, 5, 222, 57, 44, 5, 222, 48, 44, 5, 222, + 135, 44, 5, 221, 113, 44, 5, 221, 88, 44, 5, 222, 76, 44, 5, 214, 164, + 44, 5, 214, 113, 44, 5, 214, 109, 44, 5, 214, 78, 44, 5, 214, 69, 44, 5, + 214, 152, 44, 5, 214, 150, 44, 5, 214, 161, 44, 5, 214, 90, 44, 5, 214, + 85, 44, 5, 214, 154, 44, 5, 247, 18, 44, 5, 242, 149, 44, 5, 242, 139, + 44, 5, 238, 162, 44, 5, 238, 120, 44, 5, 246, 158, 44, 5, 246, 150, 44, + 5, 247, 7, 44, 5, 242, 63, 44, 5, 238, 239, 44, 5, 246, 191, 44, 5, 212, + 200, 44, 5, 212, 181, 44, 5, 212, 175, 44, 5, 212, 158, 44, 5, 212, 150, + 44, 5, 212, 190, 44, 5, 212, 189, 44, 5, 212, 197, 44, 5, 212, 165, 44, + 5, 212, 162, 44, 5, 212, 193, 44, 5, 198, 82, 44, 5, 198, 62, 44, 5, 198, + 61, 44, 5, 198, 50, 44, 5, 198, 47, 44, 5, 198, 78, 44, 5, 198, 77, 44, + 5, 198, 81, 44, 5, 198, 60, 44, 5, 198, 59, 44, 5, 198, 80, 44, 5, 213, + 177, 44, 5, 213, 163, 44, 5, 213, 162, 44, 5, 213, 146, 44, 5, 213, 145, + 44, 5, 213, 173, 44, 5, 213, 172, 44, 5, 213, 176, 44, 5, 213, 148, 44, + 5, 213, 147, 44, 5, 213, 175, 44, 5, 200, 174, 44, 5, 199, 128, 44, 5, + 199, 105, 44, 5, 198, 45, 44, 5, 198, 0, 44, 5, 200, 79, 44, 5, 200, 56, + 44, 5, 200, 149, 44, 5, 155, 44, 5, 198, 254, 44, 5, 200, 100, 44, 5, + 215, 84, 44, 5, 214, 60, 44, 5, 214, 27, 44, 5, 213, 22, 44, 5, 212, 215, + 44, 5, 214, 214, 44, 5, 214, 203, 44, 5, 215, 70, 44, 5, 213, 142, 44, 5, + 213, 125, 44, 5, 215, 42, 44, 5, 211, 77, 44, 5, 210, 51, 44, 5, 210, 12, + 44, 5, 209, 51, 44, 5, 209, 15, 44, 5, 210, 181, 44, 5, 210, 168, 44, 5, + 211, 55, 44, 5, 209, 198, 44, 5, 209, 172, 44, 5, 210, 197, 44, 5, 217, + 219, 44, 5, 216, 175, 44, 5, 216, 137, 44, 5, 215, 241, 44, 5, 215, 181, + 44, 5, 217, 48, 44, 5, 217, 29, 44, 5, 217, 180, 44, 5, 216, 91, 44, 5, + 216, 35, 44, 5, 217, 96, 44, 5, 193, 129, 44, 5, 193, 22, 44, 5, 193, 12, + 44, 5, 192, 214, 44, 5, 192, 177, 44, 5, 193, 69, 44, 5, 193, 66, 44, 5, + 193, 108, 44, 5, 193, 1, 44, 5, 192, 235, 44, 5, 193, 80, 44, 5, 208, 68, + 44, 5, 207, 151, 44, 5, 207, 88, 44, 5, 206, 218, 44, 5, 206, 179, 44, 5, + 208, 7, 44, 5, 207, 234, 44, 5, 208, 48, 44, 5, 207, 55, 44, 5, 207, 28, + 44, 5, 208, 17, 44, 5, 220, 184, 44, 5, 219, 209, 44, 5, 219, 191, 44, 5, + 219, 36, 44, 5, 219, 6, 44, 5, 220, 42, 44, 5, 220, 32, 44, 5, 220, 155, + 44, 5, 219, 107, 44, 5, 219, 73, 44, 5, 220, 60, 44, 5, 196, 156, 44, 5, + 196, 39, 44, 5, 196, 22, 44, 5, 194, 223, 44, 5, 194, 215, 44, 5, 196, + 123, 44, 5, 196, 118, 44, 5, 196, 152, 44, 5, 195, 252, 44, 5, 195, 236, + 44, 5, 196, 129, 44, 5, 219, 125, 44, 5, 219, 120, 44, 5, 219, 119, 44, + 5, 219, 116, 44, 5, 219, 115, 44, 5, 219, 122, 44, 5, 219, 121, 44, 5, + 219, 124, 44, 5, 219, 118, 44, 5, 219, 117, 44, 5, 219, 123, 44, 5, 219, + 136, 44, 5, 219, 129, 44, 5, 219, 128, 44, 5, 219, 112, 44, 5, 219, 111, + 44, 5, 219, 132, 44, 5, 219, 131, 44, 5, 219, 135, 44, 5, 219, 114, 44, + 5, 219, 113, 44, 5, 219, 133, 44, 5, 207, 2, 44, 5, 206, 247, 44, 5, 206, + 246, 44, 5, 206, 239, 44, 5, 206, 232, 44, 5, 206, 254, 44, 5, 206, 253, + 44, 5, 207, 1, 44, 5, 206, 245, 44, 5, 206, 244, 44, 5, 207, 0, 44, 5, + 213, 159, 44, 5, 213, 154, 44, 5, 213, 153, 44, 5, 213, 150, 44, 5, 213, + 149, 44, 5, 213, 156, 44, 5, 213, 155, 44, 5, 213, 158, 44, 5, 213, 152, + 44, 5, 213, 151, 44, 5, 213, 157, 44, 5, 223, 61, 44, 5, 223, 20, 44, 5, + 223, 12, 44, 5, 222, 214, 44, 5, 222, 194, 44, 5, 223, 41, 44, 5, 223, + 39, 44, 5, 223, 55, 44, 5, 222, 233, 44, 5, 222, 223, 44, 5, 223, 48, 44, + 5, 204, 59, 44, 5, 203, 236, 44, 5, 203, 231, 44, 5, 203, 164, 44, 5, + 203, 146, 44, 5, 204, 12, 44, 5, 204, 10, 44, 5, 204, 47, 44, 5, 203, + 211, 44, 5, 203, 203, 44, 5, 204, 21, 44, 5, 202, 91, 44, 5, 202, 59, 44, + 5, 202, 55, 44, 5, 202, 46, 44, 5, 202, 43, 44, 5, 202, 65, 44, 5, 202, + 64, 44, 5, 202, 90, 44, 5, 202, 51, 44, 5, 202, 50, 44, 5, 202, 67, 44, + 5, 206, 91, 44, 5, 203, 125, 44, 5, 203, 97, 44, 5, 201, 184, 44, 5, 201, + 86, 44, 5, 205, 223, 44, 5, 205, 205, 44, 5, 206, 75, 44, 5, 202, 212, + 44, 5, 202, 183, 44, 5, 206, 12, 44, 5, 230, 99, 44, 5, 229, 178, 44, 5, + 229, 150, 44, 5, 228, 181, 44, 5, 228, 150, 44, 5, 229, 255, 44, 5, 229, + 225, 44, 5, 230, 88, 44, 5, 229, 43, 44, 5, 229, 16, 44, 5, 230, 11, 44, + 5, 221, 47, 44, 5, 221, 46, 44, 5, 221, 41, 44, 5, 221, 40, 44, 5, 221, + 37, 44, 5, 221, 36, 44, 5, 221, 43, 44, 5, 221, 42, 44, 5, 221, 45, 44, + 5, 221, 39, 44, 5, 221, 38, 44, 5, 221, 44, 44, 5, 203, 171, 159, 116, 3, + 193, 94, 159, 116, 3, 208, 36, 159, 116, 3, 207, 200, 98, 1, 197, 175, + 93, 116, 3, 242, 55, 160, 93, 116, 3, 242, 55, 221, 250, 93, 116, 3, 242, + 55, 221, 113, 93, 116, 3, 242, 55, 221, 220, 93, 116, 3, 242, 55, 214, + 90, 93, 116, 3, 242, 55, 247, 19, 93, 116, 3, 242, 55, 246, 117, 93, 116, + 3, 242, 55, 242, 63, 93, 116, 3, 242, 55, 242, 188, 93, 116, 3, 242, 55, + 212, 165, 93, 116, 3, 242, 55, 238, 0, 93, 116, 3, 242, 55, 198, 71, 93, + 116, 3, 242, 55, 236, 146, 93, 116, 3, 242, 55, 198, 66, 93, 116, 3, 242, + 55, 181, 93, 116, 3, 242, 55, 189, 93, 116, 3, 242, 55, 199, 240, 93, + 116, 3, 242, 55, 155, 93, 116, 3, 242, 55, 199, 176, 93, 116, 3, 242, 55, + 213, 142, 93, 116, 3, 242, 55, 249, 3, 93, 116, 3, 242, 55, 210, 94, 93, + 116, 3, 242, 55, 209, 198, 93, 116, 3, 242, 55, 210, 65, 93, 116, 3, 242, + 55, 216, 91, 93, 116, 3, 242, 55, 193, 1, 93, 116, 3, 242, 55, 207, 55, + 93, 116, 3, 242, 55, 219, 107, 93, 116, 3, 242, 55, 195, 252, 93, 116, 3, + 242, 55, 204, 64, 93, 116, 3, 242, 55, 202, 92, 93, 116, 3, 242, 55, 188, + 93, 116, 3, 242, 55, 144, 93, 116, 3, 242, 55, 177, 93, 18, 3, 242, 55, + 208, 239, 93, 223, 177, 18, 3, 242, 55, 208, 177, 93, 223, 177, 18, 3, + 242, 55, 206, 167, 93, 223, 177, 18, 3, 242, 55, 206, 160, 93, 223, 177, + 18, 3, 242, 55, 208, 219, 93, 18, 3, 211, 219, 93, 18, 3, 251, 250, 229, + 140, 1, 248, 34, 214, 165, 229, 140, 1, 248, 34, 214, 113, 229, 140, 1, + 248, 34, 214, 78, 229, 140, 1, 248, 34, 214, 152, 229, 140, 1, 248, 34, + 214, 90, 75, 1, 248, 34, 214, 165, 75, 1, 248, 34, 214, 113, 75, 1, 248, + 34, 214, 78, 75, 1, 248, 34, 214, 152, 75, 1, 248, 34, 214, 90, 75, 1, + 251, 55, 246, 158, 75, 1, 251, 55, 198, 45, 75, 1, 251, 55, 155, 75, 1, + 251, 55, 211, 93, 73, 1, 233, 188, 233, 187, 238, 247, 158, 161, 73, 1, + 233, 187, 233, 188, 238, 247, 158, 161, }; -static const unsigned short phrasebook_offset1[] = { +static const unsigned char phrasebook_offset1[] = { 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, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 130, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 104, 149, 150, 151, 152, 153, 154, 104, 155, 156, 157, 104, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 104, 169, 104, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 104, 179, 180, 104, 181, 182, - 183, 184, 104, 185, 186, 104, 187, 188, 189, 104, 104, 190, 191, 192, - 193, 104, 194, 104, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 216, 217, 218, 219, 220, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 221, 222, 223, 224, 225, - 226, 227, 228, 104, 104, 104, 104, 229, 230, 231, 232, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 233, 234, 235, 236, 237, 238, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 239, - 240, 241, 242, 243, 244, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 245, 246, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 247, 248, 249, 250, 251, 252, 253, - 104, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 268, 104, 269, - 104, 104, 270, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 271, - 272, 273, 104, 104, 104, 104, 104, 274, 275, 276, 104, 277, 278, 104, - 104, 279, 280, 281, 282, 283, 104, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 300, 301, 302, - 303, 304, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 305, 104, 306, 307, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 308, 309, 310, - 311, 312, 313, 314, 315, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 66, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 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, 52, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 111, + 112, 113, 114, 115, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 116, 117, 118, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 119, 120, 121, 122, 52, 52, 123, 124, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 125, 126, 127, 128, 129, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 130, 131, 132, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 133, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 52, 52, + 52, 52, 52, 145, 146, 147, 52, 52, 52, 52, 52, 148, 149, 52, 52, 150, + 151, 152, 52, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 165, 166, 167, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 168, + 169, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 170, 171, 172, 173, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, }; static const unsigned int phrasebook_offset2[] = { @@ -19711,1221 +20273,1222 @@ static const unsigned int phrasebook_offset2[] = { 339, 344, 349, 353, 356, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 366, 371, 374, 377, 380, 383, 386, 389, 391, 394, 400, 408, 411, 415, 418, 420, - 423, 426, 429, 432, 436, 439, 442, 445, 447, 450, 456, 464, 470, 476, - 482, 487, 494, 500, 507, 514, 521, 529, 534, 542, 550, 557, 565, 573, - 581, 588, 596, 604, 609, 617, 624, 630, 637, 644, 651, 654, 660, 667, - 673, 680, 687, 694, 699, 706, 713, 719, 726, 733, 740, 748, 753, 761, - 769, 776, 784, 792, 800, 807, 815, 823, 828, 836, 843, 849, 856, 863, - 870, 873, 879, 886, 892, 899, 906, 913, 918, 926, 933, 940, 947, 954, - 961, 968, 975, 982, 990, 998, 1006, 1014, 1022, 1030, 1038, 1046, 1053, - 1060, 1068, 1076, 1084, 1092, 1100, 1108, 1116, 1124, 1132, 1140, 1148, - 1156, 1164, 1172, 1180, 1188, 1196, 1204, 1212, 1220, 1227, 1234, 1242, - 1250, 1258, 1266, 1274, 1282, 1290, 1298, 1306, 1312, 1317, 1322, 1330, - 1338, 1346, 1354, 1359, 1366, 1373, 1381, 1389, 1397, 1405, 1414, 1423, - 1430, 1437, 1444, 1451, 1459, 1467, 1475, 1483, 1494, 1499, 1504, 1511, - 1518, 1525, 1532, 1539, 1546, 1551, 1556, 1563, 1570, 1578, 1586, 1594, - 1602, 1609, 1616, 1624, 1632, 1640, 1648, 1656, 1664, 1672, 1680, 1688, - 1696, 1703, 1710, 1717, 1724, 1731, 1738, 1745, 1752, 1760, 1768, 1775, - 1782, 1789, 1796, 1804, 1812, 1820, 1828, 1836, 1843, 1850, 1858, 1866, - 1874, 1882, 1888, 1894, 1900, 1907, 1914, 1919, 1924, 1929, 1936, 1943, - 1950, 1957, 1965, 1973, 1979, 1985, 1990, 1995, 2002, 2009, 2016, 2021, - 2026, 2031, 2038, 2045, 2052, 2059, 2066, 2072, 2080, 2090, 2098, 2105, - 2112, 2117, 2122, 2129, 2136, 2140, 2145, 2150, 2155, 2163, 2172, 2179, - 2186, 2195, 2202, 2209, 2214, 2221, 2228, 2235, 2242, 2249, 2254, 2261, - 2268, 2276, 2281, 2286, 2291, 2301, 2305, 2311, 2317, 2323, 2329, 2337, - 2350, 2358, 2363, 2373, 2378, 2383, 2393, 2398, 2405, 2412, 2420, 2428, - 2435, 2442, 2449, 2456, 2466, 2476, 2485, 2494, 2504, 2514, 2524, 2534, - 2539, 2549, 2559, 2569, 2579, 2587, 2595, 2602, 2609, 2617, 2625, 2633, - 2641, 2648, 2655, 2665, 2675, 2683, 2691, 2699, 2704, 2714, 2719, 2726, - 2733, 2738, 2743, 2751, 2759, 2769, 2779, 2786, 2793, 2802, 2811, 2819, - 2827, 2836, 2845, 2854, 2863, 2873, 2883, 2892, 2901, 2911, 2921, 2929, - 2937, 2946, 2955, 2964, 2973, 2983, 2993, 3001, 3009, 3018, 3027, 3036, - 3045, 3054, 3063, 3068, 3073, 3081, 3089, 3099, 3107, 3112, 3117, 3124, - 3131, 3138, 3145, 3153, 3161, 3171, 3181, 3191, 3201, 3208, 3215, 3225, - 3235, 3243, 3251, 3259, 3267, 3275, 3282, 3289, 3296, 3302, 3309, 3316, - 3323, 3332, 3342, 3352, 3359, 3366, 3372, 3377, 3383, 3390, 3397, 3404, - 3411, 3422, 3432, 3439, 3446, 3453, 3460, 3465, 3470, 3476, 3482, 3487, - 3495, 3503, 3510, 3516, 3521, 3528, 3533, 3540, 3550, 3559, 3568, 3575, - 3581, 3587, 3592, 3599, 3605, 3612, 3619, 3626, 3631, 3636, 3645, 3653, - 3662, 3667, 3673, 3683, 3690, 3698, 3707, 3713, 3719, 3725, 3732, 3737, - 3742, 3752, 3760, 3769, 3777, 3785, 3795, 3800, 3807, 3814, 3819, 3831, - 3840, 3848, 3854, 3863, 3868, 3873, 3880, 3886, 3892, 3898, 3904, 3913, - 3921, 3926, 3934, 3940, 3948, 3956, 3962, 3968, 3974, 3981, 3989, 3995, - 4003, 4009, 4014, 4021, 4029, 4039, 4046, 4053, 4063, 4070, 4077, 4087, - 4094, 4101, 4108, 4114, 4120, 4129, 4141, 4146, 4153, 4158, 4162, 4167, - 4175, 4182, 4187, 4192, 4196, 4201, 4206, 4210, 4216, 4222, 4228, 4234, - 4242, 4247, 4252, 4257, 4262, 4268, 4270, 4275, 4279, 4285, 4291, 4297, - 4302, 4309, 4316, 4322, 4329, 4337, 4345, 4350, 4355, 4359, 4364, 4366, - 4368, 4371, 4373, 4376, 4381, 4386, 4392, 4397, 4401, 4406, 4411, 4420, - 4426, 4431, 4437, 4442, 4448, 4456, 4464, 4468, 4472, 4477, 4483, 4489, - 4495, 4501, 4506, 4513, 4521, 4529, 4534, 4540, 4547, 4554, 4561, 4568, - 4572, 4577, 4582, 4587, 4592, 4597, 4600, 4603, 4606, 4609, 4612, 4615, - 4619, 4623, 4629, 4632, 4637, 4643, 4649, 4652, 4657, 4662, 4666, 4672, - 4678, 4684, 4690, 4695, 4700, 4705, 4708, 4714, 4719, 4724, 4728, 4733, - 4739, 4745, 4748, 4752, 4756, 4760, 4763, 4766, 4771, 4775, 4782, 4786, - 4792, 4796, 4802, 4806, 4810, 4814, 4819, 4824, 4831, 4837, 4844, 4850, - 4856, 4862, 4865, 4869, 4873, 4877, 4881, 4886, 4891, 4895, 4899, 4905, - 4909, 4913, 4918, 4924, 4929, 4935, 4939, 4946, 4951, 4956, 4961, 4966, - 4972, 4975, 4979, 4984, 4989, 4998, 5004, 5009, 5013, 5018, 5022, 5027, - 5031, 5035, 5040, 5044, 5050, 5055, 5060, 5065, 5070, 5075, 5080, 5086, - 5092, 5098, 5104, 5109, 5115, 5121, 5127, 5132, 5137, 5144, 5151, 5155, - 5161, 5168, 0, 0, 5175, 5178, 5187, 5196, 5207, 5211, 0, 0, 0, 0, 5216, - 5219, 5224, 5232, 5237, 5245, 5253, 0, 5261, 0, 5269, 5277, 5285, 5296, - 5301, 5306, 5311, 5316, 5321, 5326, 5331, 5336, 5341, 5346, 5351, 5356, - 5361, 5366, 5371, 5376, 0, 5381, 5386, 5391, 5396, 5401, 5406, 5411, - 5416, 5424, 5432, 5440, 5448, 5456, 5464, 5475, 5480, 5485, 5490, 5495, - 5500, 5505, 5510, 5515, 5520, 5525, 5530, 5535, 5540, 5545, 5550, 5555, - 5560, 5566, 5571, 5576, 5581, 5586, 5591, 5596, 5601, 5609, 5617, 5625, - 5633, 5641, 5646, 5650, 5654, 5661, 5671, 5681, 5685, 5689, 5693, 5699, - 5706, 5710, 5715, 5719, 5724, 5728, 5733, 5737, 5742, 5747, 5752, 5757, - 5762, 5767, 5772, 5777, 5782, 5787, 5792, 5797, 5802, 5807, 5812, 5816, - 5820, 5826, 5830, 5835, 5841, 5849, 5854, 5859, 5866, 5871, 5876, 5883, - 5892, 5901, 5912, 5920, 5925, 5930, 5935, 5942, 5947, 5953, 5958, 5963, - 5968, 5973, 5978, 5983, 5991, 5997, 6002, 6006, 6011, 6016, 6021, 6026, - 6031, 6036, 6041, 6045, 6051, 6055, 6060, 6065, 6070, 6074, 6079, 6084, - 6089, 6094, 6098, 6103, 6107, 6112, 6117, 6122, 6127, 6133, 6138, 6144, - 6148, 6153, 6157, 6161, 6166, 6171, 6176, 6181, 6186, 6191, 6196, 6200, - 6206, 6210, 6215, 6220, 6225, 6229, 6234, 6239, 6244, 6249, 6253, 6258, - 6262, 6267, 6272, 6277, 6282, 6288, 6293, 6299, 6303, 6308, 6312, 6320, - 6325, 6330, 6335, 6342, 6347, 6353, 6358, 6363, 6368, 6373, 6378, 6383, - 6391, 6397, 6402, 6407, 6412, 6417, 6422, 6428, 6434, 6441, 6448, 6457, - 6466, 6473, 6480, 6489, 6498, 6503, 6508, 6513, 6518, 6523, 6528, 6533, - 6538, 6549, 6560, 6565, 6570, 6577, 6584, 6592, 6600, 6605, 6610, 6615, - 6620, 6624, 6628, 6632, 6638, 6644, 6648, 6655, 6660, 6670, 6680, 6686, - 6692, 6700, 6708, 6716, 6724, 6731, 6738, 6746, 6754, 6762, 6770, 6778, - 6786, 6794, 6802, 6810, 6818, 6825, 6832, 6838, 6844, 6852, 6860, 6867, - 6874, 6882, 6890, 6896, 6902, 6910, 6918, 6926, 6934, 6940, 6946, 6954, - 6962, 6970, 6978, 6985, 6992, 7000, 7008, 7016, 7024, 7029, 7034, 7041, - 7048, 7058, 7068, 7072, 7080, 7088, 7095, 7102, 7110, 7118, 7125, 7132, - 7140, 7148, 7155, 7162, 7170, 7178, 7183, 7190, 7197, 7204, 7211, 7217, - 7223, 7231, 7239, 7244, 7249, 7257, 7265, 7273, 7281, 7289, 7297, 7304, - 7311, 7319, 7327, 7335, 7343, 7350, 7357, 7363, 7369, 7378, 7387, 7395, - 7403, 7410, 7417, 7424, 7431, 7438, 7445, 7453, 7461, 7469, 7477, 7485, - 7493, 7503, 7513, 7520, 7527, 7534, 7541, 7548, 7555, 7562, 7569, 7576, - 7583, 7590, 7597, 7604, 7611, 7618, 7625, 7632, 7639, 7646, 7653, 7660, - 7667, 7674, 7681, 7686, 7691, 7696, 7701, 7706, 7711, 7716, 7721, 7726, - 7731, 7737, 7743, 7751, 7759, 7767, 7775, 7783, 7791, 7799, 7807, 7815, - 7823, 7828, 7833, 7838, 7843, 7851, 0, 7859, 7865, 7871, 7877, 7883, - 7889, 7895, 7901, 7907, 7912, 7918, 7924, 7930, 7936, 7942, 7948, 7954, - 7960, 7966, 7972, 7978, 7984, 7990, 7996, 8002, 8008, 8014, 8020, 8025, - 8031, 8037, 8043, 8049, 8055, 8061, 8067, 8073, 8079, 0, 0, 8085, 8093, - 8097, 8102, 8107, 8111, 8116, 8121, 8128, 8134, 8140, 8146, 8152, 8158, - 8164, 8170, 8176, 8181, 8187, 8193, 8199, 8205, 8211, 8217, 8223, 8229, - 8235, 8241, 8247, 8253, 8259, 8265, 8271, 8277, 8283, 8289, 8294, 8300, - 8306, 8312, 8318, 8324, 8330, 8336, 8342, 8348, 8354, 8362, 8369, 8375, - 0, 0, 8379, 8386, 8393, 0, 8398, 8403, 8408, 8413, 8420, 8427, 8432, - 8437, 8442, 8447, 8452, 8457, 8462, 8469, 8474, 8481, 8488, 8493, 8500, - 8505, 8510, 8515, 8522, 8527, 8532, 8539, 8548, 8553, 8558, 8563, 8568, - 8574, 8579, 8586, 8593, 8600, 8605, 8610, 8615, 8620, 8625, 8630, 8640, - 8645, 8654, 8659, 8664, 8669, 8674, 8681, 8688, 8695, 8701, 8707, 8714, - 0, 0, 0, 0, 0, 0, 0, 0, 8721, 8725, 8729, 8733, 8737, 8741, 8745, 8749, - 8753, 8757, 8761, 8766, 8770, 8774, 8779, 8783, 8788, 8792, 8796, 8800, - 8805, 8809, 8814, 8818, 8822, 8826, 8830, 0, 0, 0, 0, 8834, 8839, 8846, - 8854, 8861, 8866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8871, 8874, 8878, - 8883, 8887, 8891, 8895, 8901, 8907, 8910, 8917, 8926, 8929, 8932, 8937, - 8943, 8947, 8955, 8961, 8967, 8975, 8979, 8984, 8995, 9000, 9004, 9008, - 9012, 9015, 0, 9018, 9025, 9029, 9035, 9039, 9046, 9053, 9061, 9068, - 9075, 9079, 9083, 9089, 9093, 9097, 9101, 9105, 9109, 9113, 9117, 9121, - 9125, 9129, 9133, 9137, 9141, 9145, 9149, 9153, 9157, 9166, 9175, 9185, - 9195, 9205, 9208, 9212, 9216, 9220, 9224, 9228, 9232, 9236, 9240, 9245, - 9249, 9252, 9255, 9258, 9261, 9264, 9267, 9270, 9273, 9277, 9281, 9285, - 9290, 9295, 9301, 9304, 9311, 9320, 9325, 9330, 9337, 9343, 9348, 9352, - 9356, 9360, 9364, 9368, 9372, 9376, 9380, 9384, 9388, 9393, 9398, 9405, - 9411, 9417, 9423, 9428, 9437, 9446, 9451, 9458, 9465, 9472, 9479, 9483, - 9487, 9491, 9498, 9509, 9513, 9517, 9521, 9528, 9537, 9541, 9545, 9553, - 9557, 9561, 9565, 9572, 9579, 9591, 9595, 9599, 9603, 9614, 9624, 9628, - 9636, 9643, 9650, 9659, 9670, 9679, 9683, 9693, 9704, 9713, 9728, 9737, - 9746, 9755, 9764, 9770, 9779, 9786, 9790, 9799, 9803, 9810, 9819, 9823, - 9829, 9836, 9843, 9847, 9856, 9860, 9867, 9871, 9880, 9884, 9893, 9901, - 9908, 9917, 9926, 9933, 9939, 9943, 9950, 9959, 9965, 9972, 9979, 9985, - 9995, 10003, 10010, 10016, 10020, 10023, 10027, 10033, 10042, 10046, - 10052, 10058, 10065, 10072, 10075, 10083, 10088, 10097, 10102, 10106, - 10119, 10132, 10138, 10145, 10150, 10156, 10161, 10167, 10177, 10184, - 10193, 10203, 10209, 10214, 10219, 10223, 10227, 10232, 10237, 10243, - 10251, 10259, 10270, 10275, 10284, 10293, 10300, 10306, 10312, 10318, - 10324, 10330, 10336, 10342, 10348, 10354, 10361, 10368, 10375, 10381, - 10389, 10398, 10405, 10413, 10421, 10427, 10433, 10439, 10447, 10455, - 10465, 10475, 10479, 10485, 10491, 0, 10497, 10502, 10507, 10514, 10519, - 10524, 10531, 10536, 10545, 10550, 10555, 10560, 10565, 10570, 10577, - 10582, 10589, 10594, 10599, 10604, 10609, 10614, 10620, 10624, 10629, - 10636, 10641, 10646, 10651, 10656, 10661, 10668, 10675, 10682, 10687, - 10692, 10698, 10703, 10708, 10714, 10719, 10724, 10732, 10740, 10745, - 10750, 10756, 10761, 10766, 10770, 10776, 10780, 10784, 10791, 10798, - 10804, 10810, 10817, 10824, 10828, 0, 0, 10832, 10839, 10846, 10853, - 10864, 10877, 10890, 10909, 10922, 10933, 10941, 10949, 10961, 10977, - 10988, 10994, 11004, 11013, 11026, 11037, 11046, 11059, 11066, 11075, - 11088, 11094, 11100, 11109, 11117, 11125, 11131, 11142, 11150, 11161, - 11171, 11184, 11198, 11212, 11222, 11233, 11244, 11257, 11270, 11284, - 11296, 11308, 11321, 11334, 11346, 11359, 11368, 11377, 11382, 11387, - 11392, 11397, 11402, 11407, 11412, 11417, 11422, 11427, 11432, 11437, - 11442, 11447, 11452, 11457, 11462, 11467, 11472, 11477, 11482, 11487, - 11492, 11497, 11502, 11507, 11512, 11517, 11522, 11527, 11532, 11537, - 11541, 11546, 11551, 11556, 11561, 11566, 11570, 11574, 11578, 11582, - 11586, 11590, 11594, 11598, 11602, 11606, 11610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11615, 11620, 11624, 11628, 11632, 11636, 11640, 11644, - 11648, 11652, 11656, 11660, 11665, 11669, 11673, 11677, 11682, 11686, - 11691, 11696, 11701, 11705, 11709, 11714, 11719, 11724, 11728, 11733, - 11737, 11742, 11747, 11751, 11755, 11762, 11766, 11771, 11775, 11779, - 11784, 11788, 11795, 11802, 11809, 11815, 11823, 11831, 11840, 11848, - 11855, 11862, 11870, 11876, 11882, 11888, 11894, 11901, 11906, 11910, - 11915, 0, 0, 11919, 11923, 11928, 11933, 11938, 11943, 11948, 11953, - 11958, 11963, 11968, 11973, 11978, 11983, 11988, 11993, 11998, 12003, - 12008, 12013, 12018, 12023, 12028, 12033, 12038, 12043, 12048, 12053, - 12058, 12063, 12071, 12078, 12084, 12089, 12097, 12104, 12110, 12117, - 12123, 12128, 12135, 12142, 12148, 12153, 12158, 12164, 12169, 12174, - 12180, 0, 0, 12185, 12191, 12197, 12203, 12209, 12215, 12221, 12226, - 12234, 12240, 12246, 12252, 12258, 12264, 12272, 0, 12278, 12283, 12288, - 12293, 12298, 12303, 12308, 12313, 12318, 12323, 12328, 12333, 12338, - 12343, 12348, 12353, 12358, 12363, 12368, 12373, 12378, 12383, 12388, - 12393, 12398, 12403, 12408, 12413, 0, 0, 12418, 0, 12422, 12428, 12434, - 12440, 12446, 12452, 12458, 12464, 12469, 12475, 12481, 0, 0, 0, 0, 0, 0, + 423, 426, 429, 432, 436, 439, 442, 445, 447, 450, 456, 464, 471, 478, + 485, 490, 497, 504, 511, 518, 525, 533, 538, 546, 554, 562, 570, 578, + 586, 594, 602, 610, 615, 623, 630, 637, 644, 651, 658, 661, 667, 674, + 681, 688, 695, 703, 708, 715, 722, 729, 736, 743, 750, 758, 763, 771, + 779, 787, 795, 803, 811, 819, 827, 835, 840, 848, 855, 862, 869, 876, + 883, 886, 892, 899, 906, 913, 920, 928, 933, 941, 948, 955, 962, 969, + 976, 983, 991, 999, 1007, 1015, 1023, 1031, 1039, 1047, 1055, 1063, 1070, + 1077, 1085, 1093, 1101, 1109, 1117, 1125, 1133, 1141, 1149, 1157, 1165, + 1173, 1181, 1189, 1197, 1205, 1213, 1221, 1229, 1237, 1244, 1251, 1259, + 1267, 1275, 1283, 1291, 1299, 1307, 1315, 1323, 1329, 1334, 1339, 1347, + 1355, 1363, 1371, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1433, 1442, + 1449, 1456, 1464, 1472, 1480, 1488, 1496, 1504, 1515, 1520, 1525, 1532, + 1539, 1546, 1553, 1561, 1569, 1574, 1579, 1587, 1595, 1603, 1611, 1619, + 1627, 1635, 1643, 1651, 1659, 1667, 1675, 1683, 1691, 1699, 1707, 1715, + 1723, 1730, 1737, 1744, 1751, 1758, 1765, 1772, 1779, 1787, 1795, 1803, + 1811, 1818, 1825, 1833, 1841, 1849, 1857, 1865, 1873, 1881, 1889, 1897, + 1905, 1913, 1919, 1925, 1931, 1938, 1945, 1950, 1955, 1961, 1968, 1975, + 1982, 1989, 1997, 2005, 2011, 2017, 2022, 2028, 2035, 2042, 2049, 2054, + 2059, 2064, 2071, 2078, 2085, 2092, 2099, 2105, 2113, 2123, 2131, 2138, + 2145, 2150, 2155, 2162, 2169, 2173, 2178, 2183, 2188, 2196, 2205, 2212, + 2219, 2228, 2235, 2242, 2247, 2254, 2261, 2268, 2275, 2282, 2287, 2294, + 2301, 2309, 2314, 2319, 2324, 2334, 2338, 2344, 2350, 2356, 2362, 2370, + 2383, 2391, 2396, 2406, 2411, 2416, 2426, 2431, 2438, 2445, 2453, 2461, + 2468, 2475, 2482, 2489, 2499, 2509, 2519, 2529, 2539, 2549, 2559, 2569, + 2574, 2584, 2594, 2604, 2614, 2622, 2630, 2637, 2644, 2652, 2660, 2668, + 2676, 2683, 2690, 2700, 2710, 2718, 2726, 2734, 2739, 2749, 2754, 2762, + 2770, 2775, 2780, 2788, 2796, 2807, 2818, 2826, 2834, 2844, 2854, 2862, + 2870, 2879, 2888, 2897, 2906, 2916, 2926, 2935, 2944, 2954, 2964, 2972, + 2980, 2989, 2998, 3007, 3016, 3026, 3036, 3044, 3052, 3061, 3070, 3079, + 3088, 3097, 3106, 3111, 3116, 3124, 3132, 3142, 3150, 3155, 3160, 3167, + 3174, 3181, 3188, 3196, 3204, 3214, 3224, 3234, 3244, 3251, 3258, 3268, + 3278, 3286, 3294, 3302, 3310, 3318, 3325, 3332, 3339, 3345, 3352, 3359, + 3366, 3375, 3385, 3395, 3402, 3409, 3415, 3420, 3426, 3433, 3440, 3447, + 3454, 3465, 3475, 3482, 3489, 3496, 3503, 3508, 3513, 3519, 3525, 3531, + 3539, 3547, 3554, 3560, 3565, 3572, 3578, 3586, 3597, 3607, 3616, 3623, + 3629, 3635, 3640, 3647, 3653, 3660, 3667, 3674, 3679, 3684, 3693, 3701, + 3710, 3715, 3721, 3731, 3738, 3746, 3755, 3761, 3767, 3773, 3780, 3785, + 3790, 3800, 3808, 3817, 3825, 3833, 3843, 3848, 3855, 3862, 3867, 3879, + 3888, 3896, 3902, 3911, 3916, 3921, 3928, 3934, 3940, 3946, 3952, 3961, + 3969, 3974, 3982, 3988, 3996, 4004, 4010, 4016, 4022, 4030, 4038, 4044, + 4052, 4058, 4063, 4070, 4078, 4088, 4095, 4102, 4112, 4119, 4126, 4136, + 4143, 4150, 4157, 4163, 4169, 4178, 4190, 4195, 4202, 4207, 4211, 4216, + 4224, 4231, 4236, 4241, 4245, 4250, 4255, 4259, 4265, 4271, 4277, 4283, + 4291, 4296, 4301, 4306, 4311, 4317, 4319, 4324, 4328, 4334, 4340, 4346, + 4351, 4358, 4365, 4371, 4378, 4386, 4394, 4399, 4404, 4408, 4413, 4415, + 4417, 4420, 4422, 4425, 4430, 4435, 4441, 4446, 4450, 4455, 4460, 4469, + 4475, 4480, 4486, 4491, 4497, 4505, 4513, 4517, 4521, 4526, 4532, 4538, + 4544, 4550, 4555, 4562, 4570, 4578, 4583, 4589, 4596, 4603, 4610, 4617, + 4621, 4627, 4632, 4637, 4642, 4647, 4650, 4653, 4656, 4659, 4662, 4665, + 4669, 4673, 4679, 4682, 4687, 4693, 4699, 4702, 4707, 4712, 4716, 4722, + 4728, 4734, 4740, 4745, 4750, 4755, 4758, 4764, 4769, 4774, 4778, 4783, + 4789, 4795, 4798, 4802, 4806, 4810, 4813, 4816, 4821, 4825, 4832, 4836, + 4842, 4846, 4852, 4856, 4860, 4864, 4869, 4874, 4881, 4887, 4894, 4900, + 4906, 4912, 4915, 4919, 4923, 4927, 4931, 4936, 4941, 4945, 4949, 4955, + 4959, 4963, 4968, 4974, 4979, 4985, 4989, 4995, 5000, 5005, 5010, 5015, + 5021, 5024, 5028, 5033, 5038, 5047, 5053, 5058, 5062, 5067, 5071, 5076, + 5080, 5084, 5089, 5093, 5099, 5104, 5109, 5114, 5119, 5124, 5129, 5135, + 5141, 5147, 5153, 5158, 5164, 5170, 5176, 5181, 5186, 5193, 5200, 5204, + 5209, 5216, 0, 0, 5223, 5226, 5235, 5244, 5255, 5259, 0, 0, 0, 0, 5264, + 5267, 5272, 5280, 5285, 5293, 5301, 0, 5309, 0, 5317, 5325, 5333, 5344, + 5349, 5354, 5359, 5364, 5369, 5374, 5379, 5384, 5389, 5394, 5399, 5404, + 5409, 5414, 5419, 5424, 0, 5429, 5434, 5439, 5444, 5449, 5454, 5459, + 5464, 5472, 5480, 5488, 5496, 5504, 5512, 5523, 5528, 5533, 5538, 5543, + 5548, 5553, 5558, 5563, 5568, 5573, 5578, 5583, 5588, 5593, 5598, 5603, + 5608, 5614, 5619, 5624, 5629, 5634, 5639, 5644, 5649, 5657, 5665, 5673, + 5681, 5689, 5694, 5698, 5702, 5709, 5719, 5729, 5733, 5737, 5741, 5747, + 5754, 5758, 5763, 5767, 5772, 5776, 5781, 5785, 5790, 5795, 5800, 5805, + 5810, 5815, 5820, 5825, 5830, 5835, 5840, 5845, 5850, 5855, 5860, 5864, + 5868, 5874, 5878, 5883, 5889, 5897, 5902, 5907, 5914, 5919, 5924, 5931, + 5940, 5949, 5960, 5968, 5973, 5978, 5983, 5990, 5995, 6001, 6006, 6011, + 6016, 6021, 6026, 6031, 6039, 6045, 6050, 6054, 6059, 6064, 6069, 6074, + 6079, 6084, 6089, 6093, 6099, 6103, 6108, 6113, 6118, 6122, 6127, 6132, + 6137, 6142, 6146, 6151, 6155, 6160, 6165, 6170, 6175, 6181, 6186, 6192, + 6196, 6201, 6205, 6209, 6214, 6219, 6224, 6229, 6234, 6239, 6244, 6248, + 6254, 6258, 6263, 6268, 6273, 6277, 6282, 6287, 6292, 6297, 6301, 6306, + 6310, 6315, 6320, 6325, 6330, 6336, 6341, 6347, 6351, 6356, 6360, 6368, + 6373, 6378, 6383, 6390, 6395, 6401, 6406, 6411, 6416, 6421, 6426, 6431, + 6439, 6445, 6450, 6455, 6460, 6465, 6470, 6476, 6482, 6489, 6496, 6505, + 6514, 6521, 6528, 6537, 6546, 6551, 6556, 6561, 6566, 6571, 6576, 6581, + 6586, 6597, 6608, 6613, 6618, 6625, 6632, 6640, 6648, 6653, 6658, 6663, + 6668, 6672, 6676, 6680, 6686, 6692, 6696, 6703, 6708, 6718, 6728, 6734, + 6740, 6748, 6756, 6764, 6772, 6779, 6786, 6794, 6802, 6810, 6818, 6826, + 6834, 6842, 6850, 6858, 6866, 6873, 6880, 6886, 6892, 6900, 6908, 6915, + 6922, 6930, 6938, 6944, 6950, 6958, 6966, 6974, 6982, 6988, 6994, 7002, + 7010, 7018, 7026, 7033, 7040, 7048, 7056, 7064, 7072, 7077, 7082, 7089, + 7096, 7106, 7116, 7120, 7128, 7136, 7143, 7150, 7158, 7166, 7173, 7180, + 7188, 7196, 7203, 7210, 7218, 7226, 7231, 7238, 7245, 7252, 7259, 7265, + 7271, 7279, 7287, 7292, 7297, 7305, 7313, 7321, 7329, 7337, 7345, 7352, + 7359, 7367, 7375, 7383, 7391, 7398, 7405, 7411, 7417, 7426, 7435, 7443, + 7451, 7458, 7465, 7472, 7479, 7487, 7495, 7503, 7511, 7519, 7527, 7535, + 7543, 7553, 7563, 7570, 7577, 7584, 7591, 7598, 7605, 7612, 7619, 7626, + 7633, 7640, 7647, 7654, 7661, 7668, 7675, 7682, 7689, 7696, 7703, 7710, + 7717, 7724, 7731, 7736, 7741, 7746, 7751, 7756, 7761, 7766, 7771, 7776, + 7781, 7787, 7793, 7801, 7809, 7817, 7825, 7833, 7841, 7849, 7857, 7865, + 7873, 7878, 7883, 7888, 7893, 7901, 0, 7909, 7915, 7921, 7927, 7933, + 7939, 7945, 7951, 7957, 7962, 7968, 7974, 7980, 7986, 7992, 7998, 8004, + 8010, 8016, 8022, 8028, 8034, 8040, 8046, 8052, 8058, 8064, 8070, 8075, + 8081, 8087, 8093, 8099, 8105, 8111, 8117, 8123, 8129, 0, 0, 8135, 8143, + 8147, 8152, 8157, 8161, 8166, 8171, 8178, 8184, 8190, 8196, 8202, 8208, + 8214, 8220, 8226, 8231, 8237, 8243, 8249, 8255, 8261, 8267, 8273, 8279, + 8285, 8291, 8297, 8303, 8309, 8315, 8321, 8327, 8333, 8339, 8344, 8350, + 8356, 8362, 8368, 8374, 8380, 8386, 8392, 8398, 8404, 8412, 8419, 8425, + 0, 0, 8429, 8436, 8443, 0, 8448, 8453, 8458, 8463, 8470, 8477, 8482, + 8487, 8492, 8497, 8502, 8507, 8512, 8519, 8524, 8531, 8538, 8543, 8550, + 8555, 8560, 8565, 8572, 8577, 8582, 8589, 8598, 8603, 8608, 8613, 8618, + 8624, 8629, 8636, 8643, 8650, 8655, 8660, 8665, 8670, 8675, 8680, 8690, + 8695, 8704, 8709, 8714, 8719, 8724, 8731, 8738, 8745, 8750, 8755, 8762, + 0, 0, 0, 0, 0, 0, 0, 0, 8769, 8773, 8777, 8781, 8785, 8789, 8793, 8797, + 8801, 8805, 8809, 8814, 8818, 8822, 8827, 8831, 8836, 8840, 8844, 8848, + 8853, 8857, 8862, 8866, 8870, 8874, 8878, 0, 0, 0, 0, 8882, 8887, 8894, + 8902, 8909, 8914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8919, 8922, 8926, + 8931, 8935, 8939, 8943, 8949, 8955, 8958, 8965, 8974, 8977, 8980, 8985, + 8991, 8995, 9003, 9009, 9015, 9023, 9027, 9032, 9043, 9048, 9052, 9056, + 9060, 9063, 0, 9066, 9073, 9077, 9083, 9087, 9094, 9101, 9109, 9116, + 9123, 9127, 9131, 9137, 9141, 9145, 9149, 9153, 9157, 9161, 9165, 9169, + 9173, 9177, 9181, 9185, 9189, 9193, 9197, 9201, 9205, 9214, 9223, 9233, + 9243, 9253, 9256, 9260, 9264, 9268, 9272, 9276, 9280, 9284, 9288, 9293, + 9297, 9300, 9303, 9306, 9309, 9312, 9315, 9318, 9321, 9325, 9329, 9333, + 9338, 9343, 9349, 9352, 9359, 9368, 9373, 9378, 9385, 9391, 9396, 9400, + 9404, 9408, 9412, 9416, 9420, 9424, 9428, 9432, 9436, 9441, 9446, 9453, + 9459, 9465, 9471, 9476, 9485, 9494, 9499, 9506, 9513, 9520, 9527, 9531, + 9535, 9539, 9546, 9557, 9561, 9565, 9569, 9576, 9585, 9589, 9593, 9601, + 9605, 9609, 9613, 9620, 9627, 9639, 9643, 9647, 9651, 9662, 9672, 9676, + 9684, 9691, 9698, 9707, 9718, 9727, 9731, 9741, 9752, 9761, 9776, 9785, + 9794, 9803, 9812, 9818, 9827, 9834, 9838, 9847, 9851, 9858, 9867, 9871, + 9877, 9884, 9891, 9895, 9904, 9908, 9915, 9919, 9928, 9932, 9941, 9949, + 9956, 9965, 9974, 9981, 9987, 9991, 9998, 10007, 10013, 10020, 10027, + 10033, 10043, 10051, 10058, 10064, 10068, 10071, 10075, 10081, 10090, + 10094, 10100, 10106, 10113, 10120, 10123, 10131, 10136, 10145, 10150, + 10154, 10167, 10180, 10186, 10193, 10198, 10204, 10209, 10215, 10225, + 10232, 10241, 10251, 10257, 10262, 10267, 10271, 10275, 10280, 10285, + 10291, 10299, 10307, 10318, 10323, 10332, 10341, 10348, 10354, 10360, + 10366, 10372, 10378, 10384, 10390, 10396, 10402, 10409, 10416, 10423, + 10429, 10437, 10446, 10453, 10461, 10469, 10475, 10481, 10487, 10495, + 10503, 10513, 10523, 10527, 10533, 10539, 0, 10545, 10550, 10555, 10562, + 10567, 10572, 10579, 10584, 10593, 10598, 10603, 10608, 10613, 10618, + 10625, 10630, 10637, 10642, 10647, 10652, 10657, 10662, 10668, 10672, + 10677, 10684, 10689, 10694, 10699, 10704, 10709, 10716, 10723, 10730, + 10735, 10740, 10746, 10751, 10756, 10762, 10767, 10772, 10780, 10788, + 10793, 10798, 10804, 10809, 10814, 10818, 10824, 10828, 10832, 10839, + 10846, 10852, 10858, 10865, 10872, 10876, 0, 0, 10880, 10887, 10894, + 10901, 10912, 10925, 10938, 10957, 10970, 10981, 10989, 10997, 11009, + 11025, 11036, 11042, 11052, 11061, 11074, 11085, 11094, 11107, 11114, + 11123, 11136, 11142, 11148, 11157, 11165, 11173, 11179, 11190, 11198, + 11209, 11219, 11232, 11246, 11260, 11270, 11281, 11292, 11305, 11318, + 11332, 11344, 11356, 11369, 11382, 11394, 11407, 11416, 11425, 11430, + 11435, 11440, 11445, 11450, 11455, 11460, 11465, 11470, 11475, 11480, + 11485, 11490, 11495, 11500, 11505, 11510, 11515, 11520, 11525, 11530, + 11535, 11540, 11545, 11550, 11555, 11560, 11565, 11570, 11575, 11580, + 11585, 11589, 11594, 11599, 11604, 11609, 11614, 11618, 11622, 11626, + 11630, 11634, 11638, 11642, 11646, 11650, 11654, 11658, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11663, 11668, 11672, 11676, 11680, 11684, 11688, + 11692, 11696, 11700, 11704, 11708, 11713, 11717, 11721, 11725, 11730, + 11734, 11739, 11744, 11749, 11753, 11757, 11762, 11767, 11772, 11776, + 11781, 11785, 11790, 11795, 11799, 11803, 11810, 11814, 11819, 11823, + 11827, 11832, 11836, 11843, 11850, 11857, 11863, 11871, 11879, 11888, + 11896, 11903, 11910, 11918, 11924, 11930, 11936, 11942, 11949, 11954, + 11958, 11963, 0, 0, 11967, 11971, 11976, 11981, 11986, 11991, 11996, + 12001, 12006, 12011, 12016, 12021, 12026, 12031, 12036, 12041, 12046, + 12051, 12056, 12061, 12066, 12071, 12076, 12081, 12086, 12091, 12096, + 12101, 12106, 12111, 12119, 12126, 12132, 12137, 12145, 12152, 12158, + 12165, 12171, 12176, 12183, 12190, 12196, 12201, 12206, 12212, 12217, + 12222, 12228, 0, 0, 12233, 12239, 12245, 12251, 12257, 12263, 12269, + 12274, 12282, 12288, 12294, 12300, 12306, 12312, 12320, 0, 12326, 12331, + 12336, 12341, 12346, 12351, 12356, 12361, 12366, 12371, 12376, 12381, + 12386, 12391, 12396, 12401, 12406, 12411, 12416, 12421, 12426, 12431, + 12436, 12441, 12446, 12451, 12456, 12461, 0, 0, 12466, 0, 12470, 12476, + 12482, 12488, 12494, 12500, 12506, 12512, 12517, 12523, 12529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12487, 12496, 12504, 12513, 12522, 12535, 12542, 12549, 12557, 12570, - 12582, 12589, 12597, 12603, 12608, 12617, 12626, 12634, 12640, 12650, - 12659, 0, 12666, 12674, 12682, 12691, 12700, 12714, 12720, 12726, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12732, 12737, - 12744, 12749, 12754, 12759, 12767, 12775, 12782, 12789, 12796, 12803, - 12810, 12817, 12824, 12830, 12838, 12843, 12848, 12853, 12858, 12863, - 12868, 12873, 12878, 12884, 12889, 12894, 12900, 12905, 12909, 12913, - 12917, 12922, 12928, 12934, 12940, 12945, 12950, 12955, 12960, 12966, - 12975, 12983, 12989, 12997, 13003, 13007, 13011, 13015, 13020, 13023, - 13027, 13030, 13034, 13037, 13041, 13045, 13049, 13054, 13059, 13062, - 13066, 13071, 13076, 13079, 13083, 13086, 13090, 13094, 13098, 13102, - 13106, 13110, 13114, 13118, 13122, 13126, 13130, 13134, 13138, 13142, - 13145, 13149, 13153, 13157, 13160, 13164, 13167, 13171, 13175, 13179, - 13182, 13185, 13188, 13192, 13195, 13199, 13203, 13207, 13211, 13215, - 13218, 13221, 13226, 13231, 13235, 13239, 13244, 13248, 13253, 13257, - 13262, 13267, 13273, 13279, 13285, 13289, 13294, 13300, 13306, 13310, - 13315, 13319, 13325, 13330, 13333, 13339, 13345, 13350, 13355, 13362, - 13367, 13372, 13376, 13380, 13384, 13388, 13392, 13396, 13400, 13404, - 13409, 13414, 13419, 13425, 13428, 13432, 13436, 13439, 13442, 13445, - 13448, 13451, 13454, 13457, 13460, 13463, 13467, 13474, 13479, 13483, - 13487, 13491, 13495, 13499, 13505, 13509, 13513, 13517, 13521, 13527, - 13531, 13535, 13539, 13544, 13549, 0, 13554, 13558, 13563, 13567, 13572, - 13576, 13581, 13586, 0, 0, 13591, 13595, 0, 0, 13600, 13604, 13609, - 13613, 13618, 13623, 13628, 13633, 13638, 13643, 13648, 13653, 13658, - 13663, 13668, 13673, 13678, 13683, 13687, 13692, 13697, 13702, 0, 13706, - 13710, 13715, 13720, 13725, 13729, 13733, 0, 13737, 0, 0, 0, 13741, - 13746, 13751, 13755, 0, 0, 13759, 13764, 13769, 13775, 13780, 13786, - 13791, 13797, 13803, 0, 0, 13810, 13815, 0, 0, 13821, 13826, 13832, - 13837, 0, 0, 0, 0, 0, 0, 0, 0, 13843, 0, 0, 0, 0, 13850, 13855, 0, 13860, - 13865, 13871, 13877, 13883, 0, 0, 13890, 13895, 13899, 13903, 13907, - 13911, 13915, 13919, 13923, 13927, 13931, 13940, 13950, 13955, 13960, - 13967, 13974, 13981, 13988, 14003, 14011, 14015, 14020, 14027, 14032, 0, - 0, 14037, 14044, 14049, 0, 14054, 14058, 14063, 14067, 14072, 14076, 0, - 0, 0, 0, 14081, 14086, 0, 0, 14091, 14096, 14101, 14105, 14110, 14115, - 14120, 14125, 14130, 14135, 14140, 14145, 14150, 14155, 14160, 14165, - 14170, 14175, 14179, 14184, 14189, 14194, 0, 14198, 14202, 14207, 14212, - 14217, 14221, 14225, 0, 14229, 14233, 0, 14238, 14243, 0, 14248, 14252, - 0, 0, 14256, 0, 14261, 14267, 14272, 14278, 14283, 0, 0, 0, 0, 14289, - 14295, 0, 0, 14301, 14307, 14313, 0, 0, 0, 14318, 0, 0, 0, 0, 0, 0, 0, - 14323, 14328, 14333, 14338, 0, 14343, 0, 0, 0, 0, 0, 0, 0, 14348, 14353, - 14357, 14361, 14365, 14369, 14373, 14377, 14381, 14385, 14389, 14393, - 14397, 14401, 14405, 14411, 14416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14421, - 14426, 14431, 0, 14436, 14440, 14445, 14449, 14454, 14458, 14463, 14468, - 14473, 0, 14479, 14483, 14488, 0, 14494, 14498, 14503, 14507, 14512, - 14517, 14522, 14527, 14532, 14537, 14542, 14547, 14552, 14557, 14562, - 14567, 14572, 14577, 14581, 14586, 14591, 14596, 0, 14600, 14604, 14609, - 14614, 14619, 14623, 14627, 0, 14631, 14635, 0, 14640, 14645, 14650, - 14655, 14659, 0, 0, 14663, 14668, 14673, 14679, 14684, 14690, 14695, - 14701, 14707, 14714, 0, 14721, 14726, 14732, 0, 14739, 14744, 14750, 0, - 0, 14755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14759, 14765, - 14771, 14777, 0, 0, 14784, 14789, 14793, 14797, 14801, 14805, 14809, - 14813, 14817, 14821, 14825, 14830, 0, 0, 0, 0, 0, 0, 0, 14835, 14840, - 14845, 14850, 14855, 14863, 14871, 0, 14879, 14884, 14889, 0, 14894, - 14898, 14903, 14907, 14912, 14916, 14921, 14926, 0, 0, 14931, 14935, 0, - 0, 14940, 14944, 14949, 14953, 14958, 14963, 14968, 14973, 14978, 14983, - 14988, 14993, 14998, 15003, 15008, 15013, 15018, 15023, 15027, 15032, - 15037, 15042, 0, 15046, 15050, 15055, 15060, 15065, 15069, 15073, 0, - 15077, 15081, 0, 15086, 15091, 15096, 15101, 15105, 0, 0, 15109, 15114, - 15119, 15125, 15130, 15136, 15141, 15147, 15153, 0, 0, 15160, 15165, 0, - 0, 15171, 15176, 15182, 0, 0, 0, 0, 0, 0, 0, 0, 15187, 15194, 0, 0, 0, 0, - 15201, 15206, 0, 15211, 15216, 15222, 15228, 15234, 0, 0, 15241, 15246, - 15250, 15254, 15258, 15262, 15266, 15270, 15274, 15278, 15282, 15286, - 15291, 15297, 15303, 15309, 15315, 15321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15327, 15331, 0, 15335, 15338, 15342, 15345, 15349, 15352, 0, 0, 0, - 15356, 15359, 15363, 0, 15367, 15370, 15374, 15378, 0, 0, 0, 15381, - 15385, 0, 15389, 0, 15393, 15397, 0, 0, 0, 15401, 15405, 0, 0, 0, 15408, - 15411, 15415, 0, 0, 0, 15418, 15421, 15424, 15427, 15431, 15434, 15438, - 15442, 15446, 15450, 15454, 15457, 0, 0, 0, 0, 15460, 15465, 15469, - 15474, 15478, 0, 0, 0, 15483, 15487, 15492, 0, 15497, 15501, 15506, - 15511, 0, 0, 15515, 0, 0, 0, 0, 0, 0, 15518, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15524, 15528, 15531, 15534, 15537, 15540, 15543, 15546, - 15549, 15552, 15555, 15559, 15564, 15568, 15572, 15576, 15580, 15584, - 15588, 15593, 15597, 0, 0, 0, 0, 0, 15600, 15607, 15612, 15617, 15622, - 15629, 15633, 15638, 15642, 15647, 15651, 15656, 15661, 0, 15666, 15670, - 15675, 0, 15680, 15684, 15689, 15694, 15698, 15703, 15708, 15713, 15718, - 15723, 15728, 15733, 15738, 15743, 15748, 15753, 15758, 15763, 15768, - 15772, 15777, 15782, 15787, 0, 15791, 15795, 15800, 15805, 15810, 15814, - 15818, 15822, 15827, 15831, 15836, 15841, 15846, 15851, 15856, 15860, 0, - 0, 0, 15864, 15869, 15875, 15880, 15886, 15891, 15897, 15903, 0, 15910, - 15915, 15921, 0, 15927, 15932, 15938, 15944, 0, 0, 0, 0, 0, 0, 0, 15949, - 15954, 0, 15961, 15966, 15971, 0, 0, 0, 0, 0, 15976, 15982, 15988, 15994, - 0, 0, 16001, 16006, 16010, 16014, 16018, 16022, 16026, 16030, 16034, - 16038, 0, 0, 0, 0, 0, 0, 0, 16042, 16047, 16060, 16072, 16084, 16096, - 16108, 16120, 16132, 16137, 16144, 16149, 16154, 16159, 16164, 16168, - 16173, 16177, 16182, 16186, 16191, 16196, 0, 16201, 16205, 16210, 0, - 16215, 16219, 16224, 16229, 16233, 16238, 16243, 16248, 16253, 16258, - 16263, 16268, 16273, 16278, 16283, 16288, 16293, 16298, 16303, 16307, - 16312, 16317, 16322, 0, 16326, 16330, 16335, 16340, 16345, 16349, 16353, - 16357, 16362, 16366, 0, 16371, 16376, 16381, 16386, 16390, 0, 0, 16394, - 16399, 16404, 16410, 16415, 16421, 16426, 16432, 16438, 0, 16445, 16450, - 16456, 0, 16462, 16467, 16473, 16479, 0, 0, 0, 0, 0, 0, 0, 16484, 16489, - 0, 0, 0, 0, 0, 0, 0, 16496, 0, 16501, 16507, 16513, 16519, 0, 0, 16526, - 16531, 16535, 16539, 16543, 16547, 16551, 16555, 16559, 16563, 0, 16567, - 16572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16577, 16583, 16587, 16591, - 0, 16595, 16598, 16602, 16605, 16609, 16612, 16616, 16620, 0, 16624, - 16627, 16631, 0, 16635, 16638, 16642, 16646, 16649, 16653, 16657, 16661, - 16665, 16669, 16673, 16677, 16681, 16685, 16689, 16693, 16697, 16701, - 16705, 16708, 16712, 16716, 16720, 16723, 16727, 16730, 16734, 16738, - 16742, 16745, 16748, 16751, 16755, 16758, 16762, 16766, 16770, 16774, - 16778, 16781, 16784, 16788, 16795, 16801, 16805, 16810, 16814, 16819, - 16823, 16828, 16833, 0, 16839, 16843, 16848, 0, 16853, 16857, 16862, - 16867, 16871, 16876, 0, 0, 0, 0, 16880, 16886, 16892, 16898, 16904, - 16909, 16914, 16919, 16924, 16929, 16934, 16939, 16945, 16950, 16955, - 16960, 0, 0, 16966, 16970, 16973, 16976, 16979, 16982, 16985, 16988, - 16991, 16994, 16997, 17001, 17006, 17010, 17015, 17020, 17025, 17030, - 17035, 17040, 17044, 17050, 17056, 17062, 17067, 17073, 0, 0, 17079, - 17083, 0, 17087, 17091, 17095, 17099, 17103, 17107, 17111, 17115, 17119, - 17123, 17127, 17131, 17135, 17139, 17143, 17147, 17151, 17155, 0, 0, 0, - 17159, 17165, 17171, 17177, 17183, 17189, 17195, 17201, 17207, 17213, - 17219, 17225, 17233, 17239, 17245, 17251, 17257, 17263, 17269, 17275, - 17281, 17287, 17293, 17299, 0, 17305, 17311, 17317, 17323, 17329, 17335, - 17339, 17345, 17349, 0, 17353, 0, 0, 17359, 17363, 17369, 17375, 17381, - 17385, 17391, 0, 0, 0, 17395, 0, 0, 0, 0, 17399, 17404, 17411, 17418, - 17425, 17432, 0, 17439, 0, 17446, 17451, 17456, 17463, 17470, 17479, - 17490, 17499, 0, 0, 0, 0, 0, 0, 17504, 17510, 17515, 17520, 17525, 17530, - 17535, 17540, 17545, 17550, 0, 0, 17555, 17562, 17569, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17574, 17581, 17588, 17595, 17602, 17609, 17616, 17623, - 17630, 17637, 17644, 17651, 17658, 17665, 17672, 17679, 17686, 17693, - 17700, 17707, 17714, 17721, 17728, 17735, 17742, 17749, 17756, 17763, - 17770, 17777, 17784, 17791, 17798, 17804, 17811, 17818, 17823, 17830, - 17835, 17842, 17849, 17856, 17863, 17870, 17877, 17883, 17890, 17895, - 17901, 17908, 17915, 17922, 17928, 17935, 17942, 17949, 17955, 17962, 0, - 0, 0, 0, 17967, 17974, 17980, 17987, 17993, 18002, 18011, 18016, 18021, - 18026, 18033, 18040, 18047, 18054, 18059, 18064, 18069, 18074, 18079, - 18083, 18087, 18091, 18095, 18099, 18103, 18107, 18111, 18115, 18120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18125, 18130, 0, 18137, 0, 18144, - 18151, 18156, 18161, 18168, 0, 18175, 18182, 18187, 18194, 18201, 18208, - 18215, 18222, 18229, 18234, 18238, 18245, 18252, 18259, 18264, 18269, - 18274, 18281, 18288, 18295, 18302, 18309, 18314, 18319, 0, 18326, 0, - 18333, 18338, 18345, 18352, 18359, 18366, 18373, 18377, 18384, 18388, - 18393, 18401, 18407, 18413, 18418, 18424, 18430, 18436, 18441, 18447, - 18454, 18462, 18469, 0, 0, 18476, 18481, 18487, 18492, 18498, 0, 18504, - 0, 18509, 18516, 18523, 18530, 18537, 18542, 0, 0, 18546, 18551, 18555, - 18559, 18563, 18567, 18571, 18575, 18579, 18583, 0, 0, 18587, 18593, - 18599, 18606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18613, 18617, 18628, 18643, 18658, - 18668, 18679, 18692, 18703, 18709, 18717, 18727, 18733, 18741, 18745, - 18751, 18757, 18765, 18775, 18783, 18796, 18802, 18810, 18818, 18830, - 18837, 18845, 18853, 18861, 18869, 18877, 18885, 18895, 18899, 18902, - 18905, 18908, 18911, 18914, 18917, 18920, 18923, 18926, 18930, 18934, - 18938, 18942, 18946, 18950, 18954, 18958, 18962, 18967, 18973, 18983, - 18997, 19007, 19013, 19019, 19027, 19035, 19043, 19051, 19057, 19063, - 19066, 19070, 19074, 19078, 19082, 19086, 19090, 0, 19094, 19098, 19102, - 19106, 19110, 19114, 19118, 19121, 19125, 19129, 19133, 19136, 19139, - 19143, 19147, 19151, 19154, 19158, 19162, 19166, 19170, 19174, 19178, - 19182, 19186, 19189, 19192, 19195, 19199, 19203, 19206, 19209, 19212, - 19216, 19221, 19225, 0, 0, 0, 0, 19229, 19234, 19238, 19243, 19247, - 19252, 19257, 19263, 19268, 19274, 19278, 19283, 19287, 19292, 19302, - 19308, 19314, 19321, 19331, 19337, 19341, 19345, 19351, 19357, 19365, - 19371, 19379, 19387, 19395, 19405, 19413, 19423, 19428, 19434, 19440, - 19446, 19452, 19458, 19464, 0, 19470, 19476, 19482, 19488, 19494, 19500, - 19506, 19511, 19517, 19523, 19529, 19534, 19539, 19545, 19551, 19557, - 19562, 19568, 19574, 19580, 19586, 19592, 19598, 19604, 19610, 19615, - 19620, 19625, 19631, 19637, 19642, 19647, 19652, 19658, 19666, 19673, 0, - 19680, 19687, 19700, 19707, 19714, 19722, 19730, 19736, 19742, 19748, - 19758, 19763, 19769, 19779, 19789, 0, 19799, 19809, 19817, 19829, 19841, - 19847, 19861, 19876, 19881, 19886, 19894, 19902, 19910, 0, 0, 0, 0, 0, 0, + 0, 0, 12535, 12544, 12552, 12561, 12570, 12583, 12590, 12597, 12605, + 12618, 12630, 12637, 12645, 12651, 12656, 12665, 12674, 12682, 12688, + 12698, 12707, 0, 12714, 12722, 12730, 12739, 12748, 12762, 12768, 12774, + 12780, 12788, 12796, 12804, 12812, 12820, 12829, 12840, 12849, 12858, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12869, 12874, 12881, 12886, 12891, 12896, + 12904, 12912, 12919, 12926, 12933, 12940, 12947, 12954, 12961, 12967, + 12975, 12980, 12985, 12990, 12995, 13000, 13005, 13010, 13015, 13021, + 13026, 13031, 13037, 13042, 13047, 13052, 13057, 13062, 13068, 13074, + 13080, 13085, 13090, 13095, 13100, 13106, 13115, 13123, 13129, 13137, + 13143, 13147, 13151, 13155, 13160, 13163, 13167, 13170, 13174, 13177, + 13181, 13185, 13189, 13194, 13199, 13202, 13206, 13211, 13216, 13219, + 13223, 13226, 13230, 13234, 13238, 13242, 13246, 13250, 13254, 13258, + 13262, 13266, 13270, 13274, 13278, 13282, 13285, 13289, 13293, 13297, + 13300, 13304, 13307, 13311, 13315, 13319, 13322, 13325, 13328, 13332, + 13335, 13339, 13343, 13347, 13351, 13355, 13358, 13361, 13366, 13371, + 13375, 13379, 13384, 13388, 13393, 13397, 13402, 13407, 13413, 13419, + 13425, 13429, 13434, 13440, 13446, 13450, 13455, 13459, 13465, 13470, + 13473, 13479, 13485, 13490, 13495, 13502, 13507, 13512, 13516, 13520, + 13524, 13528, 13532, 13536, 13540, 13544, 13549, 13554, 13559, 13565, + 13568, 13572, 13576, 13579, 13582, 13585, 13588, 13591, 13594, 13597, + 13600, 13603, 13607, 13614, 13619, 13623, 13627, 13631, 13635, 13639, + 13645, 13649, 13653, 13657, 13661, 13667, 13671, 13675, 13679, 13684, + 13689, 0, 13694, 13698, 13703, 13707, 13712, 13716, 13721, 13726, 0, 0, + 13731, 13735, 0, 0, 13740, 13744, 13749, 13753, 13758, 13763, 13768, + 13773, 13778, 13783, 13788, 13793, 13798, 13803, 13808, 13813, 13818, + 13823, 13827, 13832, 13837, 13842, 0, 13846, 13850, 13855, 13860, 13865, + 13869, 13873, 0, 13877, 0, 0, 0, 13881, 13886, 13891, 13895, 0, 0, 13899, + 13904, 13909, 13915, 13920, 13926, 13931, 13937, 13943, 0, 0, 13950, + 13955, 0, 0, 13961, 13966, 13972, 13977, 0, 0, 0, 0, 0, 0, 0, 0, 13983, + 0, 0, 0, 0, 13990, 13995, 0, 14000, 14005, 14011, 14017, 14023, 0, 0, + 14030, 14035, 14039, 14043, 14047, 14051, 14055, 14059, 14063, 14067, + 14071, 14080, 14089, 14094, 14099, 14106, 14113, 14120, 14127, 14142, + 14150, 14154, 14159, 14166, 14171, 0, 0, 14176, 14183, 14188, 0, 14193, + 14197, 14202, 14206, 14211, 14215, 0, 0, 0, 0, 14220, 14225, 0, 0, 14230, + 14235, 14240, 14244, 14249, 14254, 14259, 14264, 14269, 14274, 14279, + 14284, 14289, 14294, 14299, 14304, 14309, 14314, 14318, 14323, 14328, + 14333, 0, 14337, 14341, 14346, 14351, 14356, 14360, 14364, 0, 14368, + 14372, 0, 14377, 14382, 0, 14387, 14391, 0, 0, 14395, 0, 14400, 14406, + 14411, 14417, 14422, 0, 0, 0, 0, 14428, 14434, 0, 0, 14440, 14446, 14452, + 0, 0, 0, 14457, 0, 0, 0, 0, 0, 0, 0, 14462, 14467, 14472, 14477, 0, + 14482, 0, 0, 0, 0, 0, 0, 0, 14487, 14492, 14496, 14500, 14504, 14508, + 14512, 14516, 14520, 14524, 14528, 14532, 14536, 14540, 14544, 14550, + 14555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14560, 14565, 14570, 0, 14575, + 14579, 14584, 14588, 14593, 14597, 14602, 14607, 14612, 0, 14618, 14622, + 14627, 0, 14633, 14637, 14642, 14646, 14651, 14656, 14661, 14666, 14671, + 14676, 14681, 14686, 14691, 14696, 14701, 14706, 14711, 14716, 14720, + 14725, 14730, 14735, 0, 14739, 14743, 14748, 14753, 14758, 14762, 14766, + 0, 14770, 14774, 0, 14779, 14784, 14789, 14794, 14798, 0, 0, 14802, + 14807, 14812, 14818, 14823, 14829, 14834, 14840, 14846, 14853, 0, 14860, + 14865, 14871, 0, 14878, 14883, 14889, 0, 0, 14894, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14898, 14904, 14910, 14916, 0, 0, 14923, 14928, + 14932, 14936, 14940, 14944, 14948, 14952, 14956, 14960, 14964, 14969, 0, + 0, 0, 0, 0, 0, 0, 14974, 14979, 14984, 14989, 14994, 15002, 15010, 0, + 15018, 15023, 15028, 0, 15033, 15037, 15042, 15046, 15051, 15055, 15060, + 15065, 0, 0, 15070, 15074, 0, 0, 15079, 15083, 15088, 15092, 15097, + 15102, 15107, 15112, 15117, 15122, 15127, 15132, 15137, 15142, 15147, + 15152, 15157, 15162, 15166, 15171, 15176, 15181, 0, 15185, 15189, 15194, + 15199, 15204, 15208, 15212, 0, 15216, 15220, 0, 15225, 15230, 15235, + 15240, 15244, 0, 0, 15248, 15253, 15258, 15264, 15269, 15275, 15280, + 15286, 15292, 0, 0, 15299, 15304, 0, 0, 15310, 15315, 15321, 0, 0, 0, 0, + 0, 0, 0, 15326, 15331, 15338, 0, 0, 0, 0, 15345, 15350, 0, 15355, 15360, + 15366, 15372, 15378, 0, 0, 15385, 15390, 15394, 15398, 15402, 15406, + 15410, 15414, 15418, 15422, 15426, 15430, 15435, 15442, 15449, 15456, + 15463, 15470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15477, 15481, 0, 15485, + 15488, 15492, 15495, 15499, 15502, 0, 0, 0, 15506, 15509, 15513, 0, + 15517, 15520, 15524, 15528, 0, 0, 0, 15531, 15535, 0, 15539, 0, 15543, + 15547, 0, 0, 0, 15551, 15555, 0, 0, 0, 15558, 15561, 15565, 0, 0, 0, + 15568, 15571, 15574, 15577, 15581, 15584, 15588, 15592, 15596, 15600, + 15604, 15607, 0, 0, 0, 0, 15610, 15615, 15619, 15624, 15628, 0, 0, 0, + 15633, 15637, 15642, 0, 15647, 15651, 15656, 15661, 0, 0, 15665, 0, 0, 0, + 0, 0, 0, 15668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15674, 15678, + 15681, 15684, 15687, 15690, 15693, 15696, 15699, 15702, 15705, 15709, + 15714, 15718, 15722, 15726, 15730, 15734, 15738, 15743, 15747, 0, 0, 0, + 0, 0, 15750, 15757, 15762, 15767, 15772, 15779, 15783, 15788, 15792, + 15797, 15801, 15806, 15811, 0, 15816, 15820, 15825, 0, 15830, 15834, + 15839, 15844, 15848, 15853, 15858, 15863, 15868, 15873, 15878, 15883, + 15888, 15893, 15898, 15903, 15908, 15913, 15918, 15922, 15927, 15932, + 15937, 0, 15941, 15945, 15950, 15955, 15960, 15964, 15968, 15972, 15977, + 15981, 15986, 15991, 15996, 16001, 16006, 16010, 0, 0, 0, 16014, 16019, + 16025, 16030, 16036, 16041, 16047, 16053, 0, 16060, 16065, 16071, 0, + 16077, 16082, 16088, 16094, 0, 0, 0, 0, 0, 0, 0, 16099, 16104, 0, 16111, + 16116, 16121, 0, 0, 0, 0, 0, 16126, 16132, 16138, 16144, 0, 0, 16151, + 16156, 16160, 16164, 16168, 16172, 16176, 16180, 16184, 16188, 0, 0, 0, + 0, 0, 0, 0, 16192, 16197, 16211, 16224, 16237, 16250, 16263, 16276, + 16289, 16294, 16301, 16306, 16311, 16316, 16321, 16325, 16330, 16334, + 16339, 16343, 16348, 16353, 0, 16358, 16362, 16367, 0, 16372, 16376, + 16381, 16386, 16390, 16395, 16400, 16405, 16410, 16415, 16420, 16425, + 16430, 16435, 16440, 16445, 16450, 16455, 16460, 16464, 16469, 16474, + 16479, 0, 16483, 16487, 16492, 16497, 16502, 16506, 16510, 16514, 16519, + 16523, 0, 16528, 16533, 16538, 16543, 16547, 0, 0, 16551, 16556, 16561, + 16567, 16572, 16578, 16583, 16589, 16595, 0, 16602, 16607, 16613, 0, + 16619, 16624, 16630, 16636, 0, 0, 0, 0, 0, 0, 0, 16641, 16646, 0, 0, 0, + 0, 0, 0, 0, 16653, 0, 16658, 16664, 16670, 16676, 0, 0, 16683, 16688, + 16692, 16696, 16700, 16704, 16708, 16712, 16716, 16720, 0, 16724, 16729, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16734, 16740, 16744, 16748, 16752, + 16758, 16761, 16765, 16768, 16772, 16775, 16779, 16783, 0, 16787, 16790, + 16794, 0, 16798, 16801, 16805, 16809, 16812, 16816, 16820, 16824, 16828, + 16832, 16836, 16840, 16844, 16848, 16852, 16856, 16860, 16864, 16868, + 16871, 16875, 16879, 16883, 16886, 16890, 16893, 16897, 16901, 16905, + 16908, 16911, 16914, 16918, 16921, 16925, 16929, 16933, 16937, 16941, + 16944, 16947, 16951, 16958, 16964, 16968, 16973, 16977, 16982, 16986, + 16991, 16996, 0, 17002, 17006, 17011, 0, 17016, 17020, 17025, 17030, + 17034, 17039, 0, 0, 0, 0, 17043, 17049, 17055, 17061, 17067, 17073, + 17079, 17085, 17091, 17097, 17103, 17109, 17115, 17120, 17125, 17130, 0, + 0, 17136, 17140, 17143, 17146, 17149, 17152, 17155, 17158, 17161, 17164, + 17167, 17171, 17176, 17180, 17186, 17192, 17198, 17204, 17210, 17216, + 17220, 17226, 17232, 17238, 17243, 17249, 0, 17255, 17259, 17263, 0, + 17267, 17271, 17275, 17279, 17283, 17287, 17291, 17295, 17299, 17303, + 17307, 17311, 17315, 17319, 17323, 17327, 17331, 17335, 0, 0, 0, 17339, + 17345, 17351, 17357, 17363, 17369, 17375, 17381, 17387, 17393, 17399, + 17405, 17413, 17419, 17425, 17431, 17437, 17443, 17449, 17455, 17461, + 17467, 17473, 17479, 0, 17485, 17491, 17497, 17503, 17509, 17515, 17519, + 17525, 17529, 0, 17533, 0, 0, 17539, 17543, 17549, 17555, 17561, 17565, + 17571, 0, 0, 0, 17575, 0, 0, 0, 0, 17579, 17584, 17591, 17598, 17605, + 17612, 0, 17619, 0, 17626, 17631, 17636, 17643, 17650, 17659, 17670, + 17679, 0, 0, 0, 0, 0, 0, 17684, 17690, 17695, 17700, 17705, 17710, 17715, + 17720, 17725, 17730, 0, 0, 17735, 17742, 17749, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17754, 17762, 17770, 17778, 17786, 17794, 17802, 17810, + 17818, 17826, 17834, 17842, 17850, 17858, 17866, 17873, 17881, 17889, + 17897, 17905, 17913, 17920, 17928, 17936, 17944, 17952, 17960, 17968, + 17976, 17984, 17992, 18000, 18008, 18015, 18023, 18031, 18037, 18045, + 18051, 18059, 18067, 18075, 18083, 18091, 18099, 18106, 18114, 18120, + 18127, 18135, 18143, 18151, 18158, 18166, 18174, 18182, 18189, 18197, 0, + 0, 0, 0, 18203, 18210, 18217, 18225, 18232, 18242, 18252, 18258, 18264, + 18270, 18278, 18286, 18294, 18302, 18308, 18314, 18320, 18326, 18331, + 18335, 18339, 18343, 18347, 18351, 18355, 18359, 18363, 18367, 18373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19918, 19921, 19925, 19929, 19933, 19937, 19941, - 19945, 19949, 19953, 19957, 19961, 19965, 19969, 19973, 19977, 19981, - 19984, 19988, 19992, 19996, 19999, 20002, 20006, 20010, 20014, 20017, - 20020, 20023, 20026, 20030, 20033, 20036, 20040, 20043, 20048, 20051, - 20055, 20058, 20062, 20065, 20070, 20073, 20077, 20084, 20089, 20093, - 20098, 20102, 20107, 20111, 20116, 20123, 20129, 20135, 20139, 20143, - 20147, 20151, 20155, 20161, 20167, 20174, 20180, 20185, 20189, 20192, - 20195, 20198, 20201, 20204, 20207, 20210, 20213, 20216, 20222, 20226, - 20230, 20234, 20238, 20242, 20246, 20250, 20254, 20259, 20263, 20268, - 20273, 20279, 20284, 20290, 20296, 20302, 20308, 20314, 20322, 20330, - 20338, 20346, 20355, 20364, 20375, 20385, 20395, 20406, 20417, 20427, - 20437, 20447, 20457, 20467, 20477, 20487, 20497, 20505, 20512, 20518, - 20525, 20530, 20536, 20542, 20548, 20554, 20560, 20566, 20571, 20577, - 20583, 20589, 20595, 20600, 20609, 20616, 20622, 20630, 20638, 20644, - 20650, 20656, 20662, 20670, 20678, 20688, 20696, 20704, 20710, 20715, - 20720, 20725, 20730, 20735, 20740, 20745, 20750, 20755, 20761, 20767, - 20773, 20780, 20785, 20791, 20796, 20801, 20806, 20811, 20816, 20821, - 20826, 20831, 20836, 20841, 20846, 20851, 20856, 20861, 20866, 20871, - 20876, 20881, 20886, 20891, 20896, 20901, 20906, 20911, 20916, 20921, - 20926, 20931, 20936, 20941, 20946, 20951, 20956, 20961, 20966, 20971, - 20976, 0, 20981, 0, 0, 0, 0, 0, 20986, 0, 0, 20991, 20995, 20999, 21003, - 21007, 21011, 21015, 21019, 21023, 21027, 21031, 21035, 21039, 21043, - 21047, 21051, 21055, 21059, 21063, 21067, 21071, 21075, 21079, 21083, - 21087, 21091, 21095, 21099, 21103, 21107, 21111, 21115, 21119, 21123, - 21127, 21131, 21135, 21139, 21143, 21147, 21151, 21155, 21160, 21164, - 21169, 21174, 21178, 21183, 21188, 21192, 21196, 21200, 21204, 21208, - 21212, 21216, 21220, 21224, 21228, 21232, 21236, 21240, 21244, 21248, - 21252, 21256, 21260, 21264, 21268, 21272, 21276, 21280, 21284, 21288, - 21292, 21296, 21300, 21304, 21308, 21312, 21316, 21320, 21324, 21328, - 21332, 21336, 21340, 21344, 21348, 21352, 21356, 21360, 21364, 21368, - 21372, 21376, 21380, 21384, 21388, 21392, 21396, 21400, 21404, 21408, - 21412, 21416, 21420, 21424, 21428, 21432, 21436, 21440, 21444, 21448, - 21452, 21456, 21460, 21464, 21468, 21472, 21476, 21480, 21484, 21488, - 21492, 21496, 21500, 21504, 21508, 21512, 21516, 21520, 21524, 21528, - 21532, 21536, 21540, 21544, 21548, 21552, 21556, 21560, 21564, 21568, - 21572, 21577, 21581, 21586, 21590, 21595, 21600, 21604, 21609, 21614, - 21618, 21623, 21628, 21633, 21638, 21642, 21647, 21652, 21657, 21662, - 21667, 21672, 21676, 21681, 21686, 21691, 21696, 21701, 21706, 21711, - 21716, 21721, 21726, 21731, 21736, 21741, 21746, 21751, 21756, 21761, - 21766, 21771, 21776, 21781, 21786, 21791, 21796, 21801, 21806, 21811, - 21816, 21821, 21826, 21831, 21836, 21841, 21846, 21851, 21856, 21861, - 21866, 21871, 21876, 21881, 21886, 21891, 21896, 21901, 21906, 21911, - 21916, 21921, 21926, 21930, 21934, 21938, 21942, 21946, 21950, 21954, - 21958, 21962, 21966, 21970, 21974, 21978, 21982, 21986, 21990, 21994, - 21998, 22002, 22006, 22010, 22014, 22018, 22022, 22026, 22030, 22034, - 22038, 22042, 22046, 22050, 22054, 22058, 22062, 22066, 22070, 22074, - 22078, 22082, 22086, 22090, 22094, 22098, 22102, 22106, 22110, 22114, - 22118, 22122, 22126, 22130, 22134, 22138, 22142, 22146, 22150, 22154, - 22158, 22162, 22166, 22170, 22174, 22178, 22182, 22186, 22190, 22194, - 22198, 22202, 22206, 22210, 22214, 22218, 22222, 22226, 22230, 22234, - 22238, 22242, 22246, 22250, 22254, 22258, 22262, 22266, 22270, 22274, - 22278, 22281, 22285, 22289, 22293, 22297, 22301, 22305, 22309, 22312, - 22316, 22320, 22324, 22328, 22332, 22336, 22340, 22344, 22348, 22352, - 22356, 22360, 22364, 22368, 22372, 22375, 22379, 22383, 22387, 22391, - 22395, 22399, 22403, 22407, 22411, 22415, 22419, 22423, 22427, 22431, - 22435, 22438, 22442, 22446, 22450, 22454, 22458, 22462, 22466, 22469, - 22473, 22477, 22481, 22485, 22489, 22493, 22497, 22501, 22505, 22509, - 22513, 22517, 22521, 22525, 22529, 22533, 22537, 22541, 22545, 22549, - 22553, 22557, 22561, 0, 22565, 22569, 22573, 22577, 0, 0, 22581, 22585, - 22589, 22593, 22597, 22601, 22605, 0, 22609, 0, 22613, 22617, 22621, - 22625, 0, 0, 22629, 22633, 22637, 22641, 22645, 22649, 22653, 22657, - 22661, 22665, 22669, 22673, 22677, 22681, 22685, 22689, 22693, 22696, - 22700, 22704, 22708, 22712, 22716, 22719, 22723, 22727, 22731, 22735, - 22739, 22743, 22747, 22751, 22755, 22759, 22763, 22767, 22771, 22775, - 22779, 22783, 22787, 0, 22791, 22795, 22799, 22803, 0, 0, 22807, 22810, - 22814, 22818, 22822, 22826, 22830, 22834, 22838, 22842, 22846, 22850, - 22854, 22858, 22862, 22866, 22870, 22875, 22880, 22885, 22891, 22897, - 22902, 22907, 22913, 22916, 22920, 22924, 22928, 22932, 22936, 22940, - 22944, 0, 22948, 22952, 22956, 22960, 0, 0, 22964, 22968, 22972, 22976, - 22980, 22984, 22988, 0, 22992, 0, 22996, 23000, 23004, 23008, 0, 0, - 23012, 23016, 23020, 23024, 23028, 23032, 23036, 23040, 23044, 23049, - 23054, 23059, 23065, 23071, 23076, 0, 23081, 23085, 23089, 23093, 23097, - 23101, 23105, 23109, 23113, 23117, 23121, 23125, 23129, 23133, 23137, - 23141, 23145, 23148, 23152, 23156, 23160, 23164, 23168, 23172, 23176, - 23180, 23184, 23188, 23192, 23196, 23200, 23204, 23208, 23212, 23216, - 23220, 23224, 23228, 23232, 23236, 23240, 23244, 23248, 23252, 23256, - 23260, 23264, 23268, 23272, 23276, 23280, 23284, 23288, 23292, 23296, - 23300, 23304, 0, 23308, 23312, 23316, 23320, 0, 0, 23324, 23328, 23332, - 23336, 23340, 23344, 23348, 23352, 23356, 23360, 23364, 23368, 23372, - 23376, 23380, 23384, 23388, 23392, 23396, 23400, 23404, 23408, 23412, - 23416, 23420, 23424, 23428, 23432, 23436, 23440, 23444, 23448, 23452, - 23456, 23460, 23464, 23468, 23472, 23476, 23480, 23484, 23488, 23492, - 23496, 23500, 23504, 23508, 23512, 23516, 23520, 23524, 23528, 23532, - 23536, 23540, 23544, 23548, 23551, 23555, 23559, 23563, 23567, 23571, - 23575, 23579, 23583, 23587, 0, 0, 23591, 23600, 23606, 23611, 23615, - 23618, 23623, 23626, 23629, 23632, 23637, 23641, 23646, 23649, 23652, - 23655, 23658, 23661, 23664, 23667, 23670, 23673, 23677, 23681, 23685, - 23689, 23693, 23697, 23701, 23705, 23709, 23713, 0, 0, 0, 23718, 23724, - 23728, 23732, 23736, 23742, 23746, 23750, 23754, 23760, 23764, 23768, - 23772, 23778, 23782, 23786, 23790, 23796, 23802, 23808, 23816, 23822, - 23828, 23834, 23840, 23846, 0, 0, 0, 0, 0, 0, 23852, 23855, 23858, 23861, - 23864, 23867, 23871, 23875, 23878, 23882, 23886, 23890, 23894, 23898, - 23901, 23905, 23909, 23913, 23917, 23921, 23924, 23928, 23932, 23936, - 23940, 23944, 23947, 23951, 23955, 23959, 23963, 23966, 23970, 23974, - 23978, 23982, 23986, 23990, 23994, 23998, 24002, 24006, 24010, 24014, - 24018, 24021, 24025, 24029, 24033, 24037, 24041, 24045, 24049, 24052, - 24056, 24060, 24064, 24068, 24072, 24076, 24080, 24084, 24088, 24092, - 24096, 24100, 24104, 24108, 24112, 24116, 24120, 24124, 24128, 24132, - 24136, 24140, 24144, 24148, 24152, 24156, 24159, 24163, 24167, 24171, - 24175, 24179, 0, 0, 24183, 24188, 24193, 24198, 24203, 24208, 0, 0, - 24213, 24217, 24220, 24224, 24227, 24231, 24234, 24238, 24244, 24249, - 24253, 24256, 24260, 24264, 24270, 24274, 24280, 24284, 24290, 24294, - 24300, 24304, 24310, 24316, 24320, 24326, 24330, 24336, 24342, 24346, - 24352, 24358, 24362, 24367, 24375, 24383, 24390, 24395, 24400, 24409, - 24415, 24423, 24428, 24434, 24438, 24442, 24446, 24450, 24454, 24458, - 24462, 24466, 24470, 24474, 24480, 24485, 24490, 24493, 24497, 24501, - 24507, 24511, 24517, 24521, 24527, 24531, 24537, 24541, 24547, 24551, - 24557, 24561, 24567, 24573, 24577, 24583, 24588, 24592, 24596, 24600, - 24604, 24607, 24611, 24617, 24622, 24627, 24630, 24634, 24638, 24644, - 24648, 24654, 24658, 24664, 24667, 24672, 24676, 24682, 24686, 24692, - 24696, 24702, 24708, 24712, 24716, 24720, 24724, 24728, 24732, 24736, - 24740, 24744, 24748, 24752, 24758, 24761, 24765, 24769, 24775, 24779, - 24785, 24789, 24795, 24799, 24805, 24809, 24815, 24819, 24825, 24829, - 24835, 24841, 24845, 24849, 24855, 24861, 24867, 24873, 24877, 24881, - 24885, 24889, 24893, 24897, 24903, 24907, 24911, 24915, 24921, 24925, - 24931, 24935, 24941, 24945, 24951, 24955, 24961, 24965, 24971, 24975, - 24981, 24987, 24991, 24997, 25001, 25005, 25009, 25013, 25017, 25021, - 25027, 25030, 25034, 25038, 25044, 25048, 25054, 25058, 25064, 25068, - 25074, 25078, 25084, 25088, 25094, 25098, 25104, 25110, 25114, 25120, - 25124, 25130, 25136, 25140, 25144, 25148, 25152, 25156, 25160, 25166, - 25169, 25173, 25177, 25183, 25187, 25193, 25197, 25203, 25209, 25213, - 25218, 25222, 25226, 25230, 25234, 25238, 25242, 25246, 25252, 25255, - 25259, 25263, 25269, 25273, 25279, 25283, 25289, 25293, 25299, 25303, - 25309, 25313, 25319, 25323, 25329, 25332, 25337, 25342, 25346, 25350, - 25354, 25358, 25362, 25366, 25372, 25375, 25379, 25383, 25389, 25393, - 25399, 25403, 25409, 25413, 25419, 25423, 25429, 25433, 25439, 25443, - 25449, 25455, 25459, 25465, 25469, 25475, 25481, 25487, 25493, 25499, - 25505, 25511, 25517, 25521, 25525, 25529, 25533, 25537, 25541, 25545, - 25549, 25555, 25559, 25565, 25569, 25575, 25579, 25585, 25589, 25595, - 25599, 25605, 25609, 25615, 25619, 25623, 25627, 25631, 25635, 25639, - 25643, 25649, 25652, 25656, 25660, 25666, 25670, 25676, 25680, 25686, - 25690, 25696, 25700, 25706, 25710, 25716, 25720, 25726, 25732, 25736, - 25742, 25748, 25754, 25758, 25764, 25770, 25774, 25778, 25782, 25786, - 25790, 25796, 25799, 25803, 25808, 25812, 25818, 25821, 25826, 25831, - 25835, 25839, 25843, 25847, 25851, 25855, 25859, 25863, 25867, 25873, - 25877, 25881, 25887, 25891, 25897, 25901, 25907, 25911, 25915, 25919, - 25923, 25927, 25933, 25937, 25941, 25945, 25949, 25953, 25957, 25961, - 25965, 25969, 25973, 25979, 25985, 25991, 25997, 26003, 26008, 26014, - 26020, 26026, 26030, 26034, 26038, 26042, 26046, 26050, 26054, 26058, - 26062, 26066, 26070, 26074, 26078, 26084, 26090, 26096, 26101, 26105, - 26109, 26113, 26117, 26121, 26125, 26129, 26133, 26137, 26143, 26149, - 26155, 26161, 26167, 26173, 26179, 26185, 26191, 26195, 26199, 26203, - 26207, 26211, 26215, 26219, 26225, 26231, 26237, 26243, 26249, 26255, - 26261, 26267, 26273, 26278, 26283, 26288, 26293, 26299, 26305, 26311, - 26317, 26323, 26329, 26335, 26340, 26346, 26352, 26358, 26363, 26369, - 26375, 26381, 26386, 26391, 26396, 26401, 26406, 26411, 26416, 26421, - 26426, 26431, 26436, 26441, 26445, 26450, 26455, 26460, 26465, 26470, - 26475, 26480, 26485, 26490, 26495, 26500, 26505, 26510, 26515, 26520, - 26525, 26530, 26535, 26540, 26545, 26550, 26555, 26560, 26565, 26570, - 26575, 26580, 26585, 26590, 26594, 26599, 26604, 26609, 26614, 26619, - 26624, 26629, 26634, 26639, 26644, 26649, 26654, 26659, 26664, 26669, - 26674, 26679, 26684, 26689, 26694, 26699, 26704, 26709, 26714, 26719, - 26723, 26728, 26733, 26738, 26743, 26748, 26752, 26757, 26762, 26767, - 26772, 26777, 26781, 26786, 26792, 26797, 26802, 26807, 26812, 26818, - 26823, 26828, 26833, 26838, 26843, 26848, 26853, 26858, 26863, 26868, - 26873, 26878, 26882, 26887, 26892, 26897, 26902, 26907, 26912, 26917, - 26922, 26927, 26932, 26937, 26942, 26947, 26952, 26957, 26962, 26967, - 26972, 26977, 26982, 26987, 26992, 26997, 27002, 27007, 27012, 27017, - 27022, 27027, 27032, 27037, 27043, 27048, 27053, 27058, 27063, 27068, - 27073, 27078, 27083, 27088, 27093, 27098, 27102, 27107, 27112, 27117, - 27122, 27127, 27132, 27137, 27142, 27147, 27152, 27157, 27162, 27167, - 27172, 27177, 27182, 27187, 27192, 27197, 27202, 27207, 27212, 27217, - 27222, 27227, 27232, 27238, 27242, 27246, 27250, 27254, 27258, 27262, - 27266, 27270, 27276, 27282, 27288, 27294, 27300, 27306, 27312, 27319, - 27325, 27330, 27335, 27340, 27345, 27350, 27355, 27360, 27365, 27370, - 27375, 27380, 27385, 27390, 27395, 27400, 27405, 27410, 27415, 27420, - 27425, 27430, 27435, 27440, 27445, 27450, 27455, 27460, 27465, 0, 0, 0, - 27472, 27483, 27488, 27496, 27501, 27506, 27511, 27520, 27525, 27531, - 27537, 27543, 27548, 27554, 27560, 27564, 27569, 27574, 27584, 27589, - 27594, 27601, 27606, 27611, 27620, 27625, 27634, 27641, 27648, 27655, - 27662, 27673, 27680, 27685, 27695, 27699, 27706, 27711, 27718, 27724, - 27731, 27740, 27747, 27754, 27763, 27770, 27775, 27780, 27791, 27798, - 27803, 27814, 27821, 27826, 27831, 27839, 27848, 27855, 27862, 27872, - 27877, 27882, 27887, 27896, 27904, 27909, 27914, 27919, 27924, 27929, - 27934, 27939, 27944, 27949, 27954, 27959, 27965, 27971, 27977, 27982, - 27987, 27992, 27997, 28002, 28007, 28016, 28025, 28034, 28043, 0, 0, 0, - 0, 0, 0, 0, 28052, 28056, 28060, 28064, 28068, 28073, 28078, 28082, - 28087, 28091, 28095, 28100, 28104, 0, 28108, 28112, 28117, 28121, 28125, - 28130, 28135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28140, 28144, 28148, - 28152, 28156, 28161, 28166, 28170, 28175, 28179, 28183, 28188, 28192, - 28196, 28200, 28204, 28209, 28213, 28217, 28222, 28227, 28232, 28238, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 28243, 28247, 28251, 28255, 28259, 28264, 28269, - 28273, 28278, 28282, 28286, 28291, 28295, 28299, 28303, 28307, 28312, - 28316, 28320, 28325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28330, 28334, - 28338, 28342, 28346, 28351, 28356, 28360, 28365, 28369, 28373, 28378, - 28382, 0, 28386, 28390, 28395, 0, 28399, 28404, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 28409, 28412, 28416, 28420, 28424, 28428, 28432, 28436, - 28440, 28444, 28448, 28452, 28456, 28460, 28464, 28468, 28471, 28475, - 28478, 28482, 28486, 28490, 28494, 28498, 28502, 28506, 28510, 28514, - 28518, 28522, 28526, 28530, 28533, 28536, 28539, 28543, 28549, 28555, - 28561, 28567, 28573, 28579, 28585, 28591, 28597, 28603, 28609, 28615, - 28621, 28627, 28636, 28645, 28651, 28657, 28663, 28668, 28672, 28677, - 28682, 28687, 28691, 28696, 28701, 28706, 28710, 28715, 28719, 28724, - 28729, 28734, 28739, 28743, 28747, 28751, 28755, 28759, 28763, 28767, - 28771, 28775, 28779, 28785, 28789, 28793, 28797, 28801, 28805, 28813, - 28819, 28823, 28829, 28833, 28839, 28843, 0, 0, 28847, 28851, 28854, - 28857, 28860, 28863, 28866, 28869, 28872, 28875, 0, 0, 0, 0, 0, 0, 28878, - 28886, 28894, 28902, 28910, 28918, 28926, 28934, 28942, 28950, 0, 0, 0, - 0, 0, 0, 28958, 28961, 28964, 28967, 28972, 28975, 28980, 28987, 28995, - 29000, 29007, 29010, 29017, 29024, 29031, 0, 29035, 29039, 29042, 29045, - 29048, 29051, 29054, 29057, 29060, 29063, 0, 0, 0, 0, 0, 0, 29066, 29069, - 29072, 29075, 29078, 29081, 29085, 29089, 29093, 29096, 29100, 29104, - 29107, 29111, 29115, 29118, 29121, 29124, 29128, 29131, 29135, 29139, - 29143, 29146, 29149, 29153, 29157, 29160, 29164, 29168, 29172, 29176, - 29180, 29184, 29188, 29192, 29199, 29204, 29209, 29214, 29219, 29225, - 29231, 29237, 29243, 29248, 29254, 29260, 29265, 29270, 29276, 29282, - 29288, 29294, 29299, 29305, 29310, 29316, 29322, 29328, 29334, 29340, - 29345, 29350, 29356, 29362, 29367, 29373, 29378, 29384, 29389, 29394, - 29400, 29405, 29411, 29417, 29423, 29429, 29435, 29441, 29447, 29453, - 29459, 29465, 29470, 29475, 29480, 29486, 29492, 0, 0, 0, 0, 0, 0, 0, - 29500, 29509, 29518, 29526, 29534, 29544, 29552, 29561, 29568, 29575, - 29582, 29590, 29598, 29606, 29614, 29622, 29630, 29637, 29645, 29652, - 29660, 29668, 29676, 29684, 29692, 29701, 29711, 29721, 29731, 29741, - 29751, 29761, 29771, 29780, 29790, 29800, 29810, 29820, 29830, 29838, - 29846, 29856, 29864, 0, 0, 0, 0, 0, 29874, 29878, 29882, 29886, 29890, - 29894, 29898, 29902, 29906, 29910, 29914, 29918, 29922, 29926, 29930, - 29934, 29938, 29942, 29946, 29950, 29954, 29958, 29962, 29966, 29972, - 29976, 29982, 29986, 29992, 29996, 30002, 30006, 30010, 30014, 30018, - 30022, 30026, 30032, 30038, 30044, 30050, 30056, 30062, 30068, 30074, - 30080, 30086, 30092, 30099, 30105, 30111, 30117, 30121, 30125, 30129, - 30133, 30137, 30141, 30145, 30151, 30157, 30163, 30168, 30175, 30180, - 30185, 30191, 30196, 30203, 30210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30217, - 30223, 30227, 30232, 30237, 30242, 30247, 30252, 30257, 30262, 30267, - 30272, 30276, 30281, 30286, 30291, 30295, 30299, 30304, 30309, 30314, - 30318, 30322, 30326, 30330, 30335, 30340, 30345, 30349, 30353, 30358, 0, - 30363, 30368, 30373, 30378, 30384, 30390, 30396, 30402, 30407, 30412, - 30418, 30424, 0, 0, 0, 0, 30431, 30436, 30442, 30448, 30453, 30458, - 30463, 30468, 30473, 30478, 30483, 30488, 0, 0, 0, 0, 30493, 0, 0, 0, - 30498, 30503, 30508, 30513, 30517, 30521, 30525, 30529, 30533, 30537, - 30541, 30545, 30549, 30554, 30560, 30566, 30572, 30577, 30582, 30587, - 30593, 30598, 30603, 30609, 30614, 30620, 30626, 30631, 30637, 30643, - 30649, 30654, 30659, 30664, 30670, 30676, 30681, 30687, 30692, 30698, - 30703, 30709, 0, 0, 30715, 30721, 30727, 30733, 30739, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 30745, 30754, 30763, 30771, 30780, 30789, 30797, 30806, - 30815, 30824, 30832, 30840, 30849, 30857, 30865, 30873, 30882, 30890, - 30898, 30907, 30915, 30923, 30932, 30940, 30948, 30957, 30965, 30974, - 30983, 30991, 31000, 31009, 31017, 31025, 31034, 31043, 31051, 31060, - 31069, 31078, 31087, 31096, 31105, 31114, 0, 0, 0, 0, 31123, 31133, - 31142, 31151, 31159, 31168, 31176, 31185, 31193, 31202, 31211, 31220, - 31229, 31238, 31247, 31256, 31265, 31274, 31283, 31292, 31301, 31310, - 31319, 31328, 31337, 31345, 0, 0, 0, 0, 0, 0, 31353, 31361, 31368, 31375, - 31382, 31389, 31396, 31403, 31410, 31417, 31424, 0, 0, 0, 31432, 31440, - 31448, 31452, 31458, 31464, 31470, 31476, 31482, 31488, 31494, 31500, - 31506, 31512, 31518, 31524, 31530, 31536, 31542, 31546, 31552, 31558, - 31564, 31570, 31576, 31582, 31588, 31594, 31600, 31606, 31612, 31618, - 31624, 31630, 31636, 31640, 31645, 31650, 31655, 31659, 31664, 31668, - 31673, 31677, 31682, 31686, 31691, 31696, 31701, 31706, 31711, 31715, - 31719, 31723, 31728, 31732, 31736, 31740, 31745, 31750, 31755, 31760, 0, - 0, 31766, 31770, 31777, 31782, 31788, 31794, 31799, 31805, 31811, 31816, - 31822, 31828, 31834, 31839, 31845, 31850, 31855, 31861, 31866, 31872, - 31877, 31882, 31888, 31893, 31899, 31903, 31908, 31913, 31919, 31925, - 31930, 31936, 31942, 31946, 31951, 31956, 31960, 31965, 31969, 31974, - 31979, 31985, 31991, 31996, 32001, 32006, 32010, 32015, 32019, 32024, - 32028, 32033, 32038, 32043, 32048, 32054, 32061, 32068, 32078, 32087, - 32094, 32100, 32111, 32116, 32122, 0, 32127, 32132, 32137, 32145, 32151, - 32159, 32164, 32170, 32176, 32182, 32187, 32193, 32198, 32205, 32211, - 32216, 32222, 32228, 32234, 32241, 32248, 32255, 32260, 32265, 32272, - 32279, 32286, 32293, 32300, 0, 0, 32307, 32314, 32321, 32327, 32333, - 32339, 32345, 32351, 32357, 32363, 32369, 0, 0, 0, 0, 0, 0, 32375, 32381, - 32386, 32391, 32396, 32401, 32406, 32411, 32416, 32421, 0, 0, 0, 0, 0, 0, - 32426, 32431, 32436, 32441, 32446, 32451, 32456, 32465, 32472, 32477, - 32482, 32487, 32492, 32497, 0, 0, 32502, 32509, 32512, 32515, 32519, - 32524, 32528, 32534, 32538, 32543, 32550, 32558, 32562, 32567, 32571, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18379, 18384, 0, 18391, 0, 18398, + 18405, 18410, 18415, 18422, 0, 18429, 18436, 18441, 18448, 18455, 18462, + 18469, 18476, 18483, 18488, 18492, 18499, 18506, 18513, 18518, 18523, + 18528, 18535, 18542, 18549, 18556, 18563, 18568, 18573, 0, 18580, 0, + 18587, 18592, 18599, 18606, 18613, 18620, 18627, 18631, 18638, 18642, + 18647, 18655, 18661, 18667, 18672, 18678, 18684, 18690, 18695, 18701, + 18708, 18716, 18723, 0, 0, 18730, 18735, 18741, 18746, 18752, 0, 18758, + 0, 18763, 18770, 18777, 18784, 18791, 18796, 0, 0, 18800, 18805, 18809, + 18813, 18817, 18821, 18825, 18829, 18833, 18837, 0, 0, 18841, 18847, + 18853, 18860, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18867, 18871, 18882, 18897, 18912, + 18922, 18933, 18946, 18957, 18963, 18971, 18981, 18987, 18995, 18999, + 19005, 19011, 19019, 19029, 19037, 19050, 19056, 19064, 19072, 19084, + 19091, 19099, 19107, 19115, 19123, 19131, 19139, 19149, 19153, 19156, + 19159, 19162, 19165, 19168, 19171, 19174, 19177, 19180, 19184, 19188, + 19192, 19196, 19200, 19204, 19208, 19212, 19216, 19221, 19227, 19237, + 19251, 19261, 19267, 19273, 19281, 19289, 19297, 19305, 19311, 19317, + 19320, 19324, 19328, 19332, 19336, 19340, 19344, 0, 19348, 19352, 19356, + 19360, 19364, 19368, 19372, 19375, 19379, 19383, 19387, 19390, 19393, + 19397, 19401, 19405, 19408, 19412, 19416, 19420, 19424, 19428, 19432, + 19436, 19440, 19443, 19446, 19449, 19453, 19457, 19460, 19463, 19466, + 19470, 19475, 19479, 0, 0, 0, 0, 19483, 19488, 19492, 19497, 19501, + 19506, 19511, 19517, 19522, 19528, 19532, 19537, 19541, 19546, 19556, + 19562, 19568, 19575, 19585, 19591, 19595, 19599, 19605, 19611, 19619, + 19625, 19633, 19641, 19649, 19659, 19667, 19677, 19682, 19688, 19694, + 19700, 19706, 19712, 19718, 0, 19724, 19730, 19736, 19742, 19748, 19754, + 19760, 19765, 19771, 19777, 19783, 19788, 19793, 19799, 19805, 19811, + 19816, 19822, 19828, 19834, 19840, 19846, 19852, 19858, 19864, 19869, + 19874, 19879, 19885, 19891, 19896, 19901, 19906, 19912, 19920, 19927, 0, + 19934, 19941, 19954, 19961, 19968, 19976, 19984, 19990, 19996, 20002, + 20012, 20017, 20023, 20033, 20043, 0, 20053, 20063, 20071, 20083, 20095, + 20101, 20115, 20130, 20135, 20140, 20148, 20156, 20164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20172, 20175, 20179, 20183, 20187, 20191, 20195, + 20199, 20203, 20207, 20211, 20215, 20219, 20223, 20227, 20231, 20235, + 20238, 20242, 20246, 20250, 20253, 20256, 20260, 20264, 20268, 20271, + 20274, 20277, 20280, 20284, 20287, 20290, 20294, 20297, 20302, 20305, + 20309, 20312, 20316, 20319, 20324, 20327, 20331, 20338, 20343, 20347, + 20352, 20356, 20361, 20365, 20370, 20377, 20383, 20389, 20393, 20397, + 20401, 20405, 20409, 20415, 20421, 20428, 20434, 20439, 20443, 20446, + 20449, 20452, 20455, 20458, 20461, 20464, 20467, 20470, 20476, 20480, + 20484, 20488, 20492, 20496, 20500, 20504, 20508, 20513, 20517, 20522, + 20527, 20533, 20538, 20544, 20550, 20556, 20562, 20568, 20576, 20584, + 20592, 20600, 20609, 20618, 20629, 20639, 20649, 20660, 20671, 20681, + 20691, 20701, 20711, 20721, 20731, 20741, 20751, 20759, 20766, 20772, + 20779, 20784, 20790, 20796, 20802, 20808, 20814, 20820, 20825, 20831, + 20837, 20843, 20849, 20854, 20863, 20870, 20876, 20884, 20892, 20898, + 20904, 20910, 20916, 20924, 20932, 20942, 20950, 20958, 20964, 20969, + 20974, 20979, 20984, 20989, 20994, 20999, 21004, 21009, 21015, 21021, + 21027, 21034, 21039, 21045, 21050, 21055, 21060, 21065, 21070, 21075, + 21080, 21085, 21090, 21095, 21100, 21105, 21110, 21115, 21120, 21125, + 21130, 21135, 21140, 21145, 21150, 21155, 21160, 21165, 21170, 21175, + 21180, 21185, 21190, 21195, 21200, 21205, 21210, 21215, 21220, 21225, + 21230, 0, 21235, 0, 0, 0, 0, 0, 21240, 0, 0, 21245, 21249, 21253, 21257, + 21261, 21265, 21269, 21273, 21277, 21281, 21285, 21289, 21293, 21297, + 21301, 21305, 21309, 21313, 21317, 21321, 21325, 21329, 21333, 21337, + 21341, 21345, 21349, 21353, 21357, 21361, 21365, 21369, 21373, 21377, + 21381, 21385, 21389, 21393, 21397, 21401, 21405, 21409, 21414, 21418, + 21423, 21428, 21432, 21437, 21442, 21446, 21450, 21454, 21458, 21462, + 21466, 21470, 21474, 21478, 21482, 21486, 21490, 21494, 21498, 21502, + 21506, 21510, 21514, 21518, 21522, 21526, 21530, 21534, 21538, 21542, + 21546, 21550, 21554, 21558, 21562, 21566, 21570, 21574, 21578, 21582, + 21586, 21590, 21594, 21598, 21602, 21606, 21610, 21614, 21618, 21622, + 21626, 21630, 21634, 21638, 21642, 21646, 21650, 21654, 21658, 21662, + 21666, 21670, 21674, 21678, 21682, 21686, 21690, 21694, 21698, 21702, + 21706, 21710, 21714, 21718, 21722, 21726, 21730, 21734, 21738, 21742, + 21746, 21750, 21754, 21758, 21762, 21766, 21770, 21774, 21778, 21782, + 21786, 21790, 21794, 21798, 21802, 21806, 21810, 21814, 21818, 21822, + 21826, 21831, 21835, 21840, 21844, 21849, 21854, 21858, 21863, 21868, + 21872, 21877, 21882, 21887, 21892, 21896, 21901, 21906, 21911, 21916, + 21921, 21926, 21930, 21935, 21940, 21945, 21950, 21955, 21960, 21965, + 21970, 21975, 21980, 21985, 21990, 21995, 22000, 22005, 22010, 22015, + 22020, 22025, 22030, 22035, 22040, 22045, 22050, 22055, 22060, 22065, + 22070, 22075, 22080, 22085, 22090, 22095, 22100, 22105, 22110, 22115, + 22120, 22125, 22130, 22135, 22140, 22145, 22150, 22155, 22160, 22165, + 22170, 22175, 22180, 22184, 22188, 22192, 22196, 22200, 22204, 22208, + 22212, 22216, 22220, 22224, 22228, 22232, 22236, 22240, 22244, 22248, + 22252, 22256, 22260, 22264, 22268, 22272, 22276, 22280, 22284, 22288, + 22292, 22296, 22300, 22304, 22308, 22312, 22316, 22320, 22324, 22328, + 22332, 22336, 22340, 22344, 22348, 22352, 22356, 22360, 22364, 22368, + 22372, 22376, 22380, 22384, 22388, 22392, 22396, 22400, 22404, 22408, + 22412, 22416, 22420, 22424, 22428, 22432, 22436, 22440, 22444, 22448, + 22452, 22456, 22460, 22464, 22468, 22472, 22476, 22480, 22484, 22488, + 22492, 22496, 22500, 22504, 22508, 22512, 22516, 22520, 22524, 22528, + 22532, 22535, 22539, 22543, 22547, 22551, 22555, 22559, 22563, 22566, + 22570, 22574, 22578, 22582, 22586, 22590, 22594, 22598, 22602, 22606, + 22610, 22614, 22618, 22622, 22626, 22629, 22633, 22637, 22641, 22645, + 22649, 22653, 22657, 22661, 22665, 22669, 22673, 22677, 22681, 22685, + 22689, 22692, 22696, 22700, 22704, 22708, 22712, 22716, 22720, 22723, + 22727, 22731, 22735, 22739, 22743, 22747, 22751, 22755, 22759, 22763, + 22767, 22771, 22775, 22779, 22783, 22787, 22791, 22795, 22799, 22803, + 22807, 22811, 22815, 0, 22819, 22823, 22827, 22831, 0, 0, 22835, 22839, + 22843, 22847, 22851, 22855, 22859, 0, 22863, 0, 22867, 22871, 22875, + 22879, 0, 0, 22883, 22887, 22891, 22895, 22899, 22903, 22907, 22911, + 22915, 22919, 22923, 22927, 22931, 22935, 22939, 22943, 22947, 22950, + 22954, 22958, 22962, 22966, 22970, 22973, 22977, 22981, 22985, 22989, + 22993, 22997, 23001, 23005, 23009, 23013, 23017, 23021, 23025, 23029, + 23033, 23037, 23041, 0, 23045, 23049, 23053, 23057, 0, 0, 23061, 23064, + 23068, 23072, 23076, 23080, 23084, 23088, 23092, 23096, 23100, 23104, + 23108, 23112, 23116, 23120, 23124, 23129, 23134, 23139, 23145, 23151, + 23156, 23161, 23167, 23170, 23174, 23178, 23182, 23186, 23190, 23194, + 23198, 0, 23202, 23206, 23210, 23214, 0, 0, 23218, 23222, 23226, 23230, + 23234, 23238, 23242, 0, 23246, 0, 23250, 23254, 23258, 23262, 0, 0, + 23266, 23270, 23274, 23278, 23282, 23286, 23290, 23294, 23298, 23303, + 23308, 23313, 23319, 23325, 23330, 0, 23335, 23339, 23343, 23347, 23351, + 23355, 23359, 23363, 23367, 23371, 23375, 23379, 23383, 23387, 23391, + 23395, 23399, 23402, 23406, 23410, 23414, 23418, 23422, 23426, 23430, + 23434, 23438, 23442, 23446, 23450, 23454, 23458, 23462, 23466, 23470, + 23474, 23478, 23482, 23486, 23490, 23494, 23498, 23502, 23506, 23510, + 23514, 23518, 23522, 23526, 23530, 23534, 23538, 23542, 23546, 23550, + 23554, 23558, 0, 23562, 23566, 23570, 23574, 0, 0, 23578, 23582, 23586, + 23590, 23594, 23598, 23602, 23606, 23610, 23614, 23618, 23622, 23626, + 23630, 23634, 23638, 23642, 23646, 23650, 23654, 23658, 23662, 23666, + 23670, 23674, 23678, 23682, 23686, 23690, 23694, 23698, 23702, 23706, + 23710, 23714, 23718, 23722, 23726, 23730, 23734, 23738, 23742, 23746, + 23750, 23754, 23758, 23762, 23766, 23770, 23774, 23778, 23782, 23786, + 23790, 23794, 23798, 23802, 23805, 23809, 23813, 23817, 23821, 23825, + 23829, 23833, 23837, 23841, 0, 0, 23845, 23854, 23860, 23865, 23869, + 23872, 23877, 23880, 23883, 23886, 23891, 23895, 23900, 23903, 23906, + 23909, 23912, 23915, 23918, 23921, 23924, 23927, 23931, 23935, 23939, + 23943, 23947, 23951, 23955, 23959, 23963, 23967, 0, 0, 0, 23972, 23978, + 23982, 23986, 23990, 23996, 24000, 24004, 24008, 24014, 24018, 24022, + 24026, 24032, 24036, 24040, 24044, 24050, 24056, 24062, 24070, 24076, + 24082, 24088, 24094, 24100, 0, 0, 0, 0, 0, 0, 24106, 24109, 24112, 24115, + 24118, 24121, 24125, 24129, 24132, 24136, 24140, 24144, 24148, 24152, + 24155, 24159, 24163, 24167, 24171, 24175, 24178, 24182, 24186, 24190, + 24194, 24198, 24201, 24205, 24209, 24213, 24217, 24220, 24224, 24228, + 24232, 24236, 24240, 24244, 24248, 24252, 24256, 24260, 24264, 24268, + 24272, 24275, 24279, 24283, 24287, 24291, 24295, 24299, 24303, 24306, + 24310, 24314, 24318, 24322, 24326, 24330, 24334, 24338, 24342, 24346, + 24350, 24354, 24358, 24362, 24366, 24370, 24374, 24378, 24382, 24386, + 24390, 24394, 24398, 24402, 24406, 24410, 24413, 24417, 24421, 24425, + 24429, 24433, 0, 0, 24437, 24442, 24447, 24452, 24457, 24462, 0, 0, + 24467, 24471, 24474, 24478, 24481, 24485, 24488, 24492, 24498, 24503, + 24507, 24510, 24514, 24518, 24524, 24528, 24534, 24538, 24544, 24548, + 24554, 24558, 24564, 24570, 24574, 24580, 24584, 24590, 24596, 24600, + 24606, 24612, 24617, 24622, 24630, 24638, 24645, 24650, 24656, 24665, + 24671, 24679, 24684, 24690, 24694, 24698, 24702, 24706, 24710, 24714, + 24718, 24722, 24726, 24730, 24736, 24741, 24746, 24749, 24753, 24757, + 24763, 24767, 24773, 24777, 24783, 24787, 24793, 24797, 24803, 24807, + 24813, 24817, 24823, 24829, 24833, 24839, 24844, 24848, 24852, 24856, + 24860, 24863, 24867, 24873, 24878, 24883, 24886, 24890, 24894, 24900, + 24904, 24910, 24914, 24920, 24923, 24928, 24932, 24938, 24942, 24948, + 24952, 24958, 24964, 24968, 24972, 24976, 24980, 24984, 24988, 24992, + 24996, 25000, 25004, 25008, 25014, 25017, 25021, 25025, 25031, 25035, + 25041, 25045, 25051, 25055, 25061, 25065, 25071, 25075, 25081, 25085, + 25091, 25097, 25101, 25105, 25111, 25117, 25123, 25129, 25133, 25137, + 25141, 25145, 25149, 25153, 25159, 25163, 25167, 25171, 25177, 25181, + 25187, 25191, 25197, 25201, 25207, 25211, 25217, 25221, 25227, 25231, + 25237, 25243, 25247, 25253, 25257, 25261, 25265, 25269, 25273, 25277, + 25283, 25286, 25290, 25294, 25300, 25304, 25310, 25314, 25320, 25324, + 25330, 25334, 25340, 25344, 25350, 25354, 25360, 25366, 25370, 25376, + 25380, 25386, 25392, 25396, 25400, 25404, 25408, 25412, 25416, 25422, + 25425, 25429, 25433, 25439, 25443, 25449, 25453, 25459, 25465, 25469, + 25474, 25478, 25482, 25486, 25490, 25494, 25498, 25502, 25508, 25511, + 25515, 25519, 25525, 25529, 25535, 25539, 25545, 25549, 25555, 25559, + 25565, 25569, 25575, 25579, 25585, 25588, 25593, 25598, 25602, 25606, + 25610, 25614, 25618, 25622, 25628, 25631, 25635, 25639, 25645, 25649, + 25655, 25659, 25665, 25669, 25675, 25679, 25685, 25689, 25695, 25699, + 25705, 25711, 25715, 25721, 25725, 25731, 25737, 25743, 25749, 25755, + 25761, 25767, 25773, 25777, 25781, 25785, 25789, 25793, 25797, 25801, + 25805, 25811, 25815, 25821, 25825, 25831, 25835, 25841, 25845, 25851, + 25855, 25861, 25865, 25871, 25875, 25879, 25883, 25887, 25891, 25895, + 25899, 25905, 25908, 25912, 25916, 25922, 25926, 25932, 25936, 25942, + 25946, 25952, 25956, 25962, 25966, 25972, 25976, 25982, 25988, 25992, + 25998, 26004, 26010, 26014, 26020, 26026, 26030, 26034, 26038, 26042, + 26046, 26052, 26055, 26059, 26064, 26068, 26074, 26077, 26082, 26087, + 26091, 26095, 26099, 26103, 26107, 26111, 26115, 26119, 26123, 26129, + 26133, 26137, 26143, 26147, 26153, 26157, 26163, 26167, 26171, 26175, + 26179, 26183, 26189, 26193, 26197, 26201, 26205, 26209, 26213, 26217, + 26221, 26225, 26229, 26235, 26241, 26247, 26253, 26259, 26264, 26270, + 26276, 26282, 26286, 26290, 26294, 26298, 26302, 26306, 26310, 26314, + 26318, 26322, 26326, 26330, 26334, 26340, 26346, 26352, 26357, 26361, + 26365, 26369, 26373, 26377, 26381, 26385, 26389, 26393, 26399, 26405, + 26411, 26417, 26423, 26429, 26435, 26441, 26447, 26451, 26455, 26459, + 26463, 26467, 26471, 26475, 26481, 26487, 26493, 26499, 26505, 26511, + 26517, 26523, 26529, 26534, 26539, 26544, 26549, 26555, 26561, 26567, + 26573, 26579, 26585, 26591, 26596, 26602, 26608, 26614, 26619, 26625, + 26631, 26637, 26642, 26647, 26652, 26657, 26662, 26667, 26672, 26677, + 26682, 26687, 26692, 26697, 26701, 26706, 26711, 26716, 26721, 26726, + 26731, 26736, 26741, 26746, 26751, 26756, 26761, 26766, 26771, 26776, + 26781, 26786, 26791, 26796, 26801, 26806, 26811, 26816, 26821, 26826, + 26831, 26836, 26841, 26846, 26850, 26855, 26860, 26865, 26870, 26875, + 26880, 26885, 26890, 26895, 26900, 26905, 26910, 26915, 26920, 26925, + 26930, 26935, 26940, 26945, 26950, 26955, 26960, 26965, 26970, 26975, + 26979, 26984, 26989, 26994, 26999, 27004, 27008, 27013, 27018, 27023, + 27028, 27033, 27037, 27042, 27048, 27053, 27058, 27063, 27068, 27074, + 27079, 27084, 27089, 27094, 27099, 27104, 27109, 27114, 27119, 27124, + 27129, 27134, 27138, 27143, 27148, 27153, 27158, 27163, 27168, 27173, + 27178, 27183, 27188, 27193, 27198, 27203, 27208, 27213, 27218, 27223, + 27228, 27233, 27238, 27243, 27248, 27253, 27258, 27263, 27268, 27273, + 27278, 27283, 27288, 27293, 27299, 27304, 27309, 27314, 27319, 27324, + 27329, 27334, 27339, 27344, 27349, 27354, 27358, 27363, 27368, 27373, + 27378, 27383, 27388, 27393, 27398, 27403, 27408, 27413, 27418, 27423, + 27428, 27433, 27438, 27443, 27448, 27453, 27458, 27463, 27468, 27473, + 27478, 27483, 27488, 27494, 27498, 27502, 27506, 27510, 27514, 27518, + 27522, 27526, 27532, 27538, 27544, 27550, 27556, 27562, 27568, 27575, + 27581, 27586, 27591, 27596, 27601, 27606, 27611, 27616, 27621, 27626, + 27631, 27636, 27641, 27646, 27651, 27656, 27661, 27666, 27671, 27676, + 27681, 27686, 27691, 27696, 27701, 27706, 27711, 27716, 27721, 0, 0, 0, + 27728, 27739, 27744, 27752, 27757, 27762, 27767, 27776, 27781, 27787, + 27793, 27799, 27804, 27810, 27816, 27820, 27825, 27830, 27840, 27845, + 27850, 27857, 27862, 27867, 27876, 27881, 27890, 27897, 27904, 27911, + 27918, 27929, 27936, 27941, 27951, 27955, 27962, 27967, 27974, 27980, + 27987, 27996, 28003, 28010, 28019, 28026, 28031, 28036, 28047, 28054, + 28059, 28070, 28077, 28082, 28087, 28095, 28104, 28111, 28118, 28128, + 28133, 28138, 28143, 28152, 28160, 28165, 28170, 28175, 28180, 28185, + 28190, 28195, 28200, 28205, 28210, 28215, 28221, 28227, 28233, 28238, + 28243, 28248, 28253, 28258, 28263, 28272, 28281, 28290, 28299, 0, 0, 0, + 0, 0, 0, 0, 28308, 28312, 28316, 28320, 28324, 28329, 28334, 28338, + 28343, 28347, 28351, 28356, 28360, 0, 28364, 28368, 28373, 28377, 28381, + 28386, 28391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28396, 28400, 28404, + 28408, 28412, 28417, 28422, 28426, 28431, 28435, 28439, 28444, 28448, + 28452, 28456, 28460, 28465, 28469, 28473, 28478, 28483, 28488, 28494, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 28499, 28503, 28507, 28511, 28515, 28520, 28525, + 28529, 28534, 28538, 28542, 28547, 28551, 28555, 28559, 28563, 28568, + 28572, 28576, 28581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28586, 28590, + 28594, 28598, 28602, 28607, 28612, 28616, 28621, 28625, 28629, 28634, + 28638, 0, 28642, 28646, 28651, 0, 28655, 28660, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28665, 28668, 28672, 28676, 28680, 28684, 28688, 28692, + 28696, 28700, 28704, 28708, 28712, 28716, 28720, 28724, 28727, 28731, + 28734, 28738, 28742, 28746, 28750, 28754, 28758, 28762, 28766, 28770, + 28774, 28778, 28782, 28786, 28789, 28792, 28795, 28799, 28805, 28811, + 28817, 28823, 28829, 28835, 28841, 28847, 28853, 28859, 28865, 28871, + 28877, 28883, 28892, 28901, 28907, 28913, 28919, 28924, 28928, 28933, + 28938, 28943, 28947, 28952, 28957, 28962, 28966, 28971, 28975, 28980, + 28985, 28990, 28995, 28999, 29003, 29007, 29011, 29015, 29019, 29023, + 29027, 29031, 29035, 29041, 29045, 29049, 29053, 29057, 29061, 29069, + 29075, 29079, 29085, 29089, 29095, 29099, 0, 0, 29103, 29107, 29110, + 29113, 29116, 29119, 29122, 29125, 29128, 29131, 0, 0, 0, 0, 0, 0, 29134, + 29142, 29150, 29158, 29166, 29174, 29182, 29190, 29198, 29206, 0, 0, 0, + 0, 0, 0, 29214, 29217, 29220, 29223, 29228, 29231, 29236, 29243, 29251, + 29256, 29263, 29266, 29273, 29280, 29287, 0, 29291, 29295, 29298, 29301, + 29304, 29307, 29310, 29313, 29316, 29319, 0, 0, 0, 0, 0, 0, 29322, 29325, + 29328, 29331, 29334, 29337, 29341, 29345, 29349, 29352, 29356, 29360, + 29363, 29367, 29371, 29374, 29377, 29380, 29384, 29387, 29391, 29395, + 29399, 29402, 29405, 29409, 29413, 29416, 29420, 29424, 29428, 29432, + 29436, 29440, 29444, 29448, 29455, 29460, 29465, 29470, 29475, 29481, + 29487, 29493, 29499, 29504, 29510, 29516, 29521, 29526, 29532, 29538, + 29544, 29550, 29555, 29561, 29566, 29572, 29578, 29584, 29590, 29596, + 29601, 29606, 29612, 29618, 29623, 29629, 29634, 29640, 29645, 29650, + 29656, 29661, 29667, 29673, 29679, 29685, 29691, 29697, 29703, 29709, + 29715, 29721, 29726, 29731, 29736, 29742, 29748, 0, 0, 0, 0, 0, 0, 0, + 29756, 29765, 29774, 29782, 29790, 29800, 29808, 29817, 29824, 29831, + 29838, 29846, 29854, 29862, 29870, 29878, 29886, 29893, 29901, 29908, + 29916, 29924, 29932, 29940, 29948, 29957, 29967, 29977, 29987, 29997, + 30007, 30017, 30027, 30036, 30046, 30056, 30066, 30076, 30086, 30094, + 30102, 30112, 30120, 0, 0, 0, 0, 0, 30130, 30134, 30138, 30142, 30146, + 30150, 30154, 30158, 30162, 30166, 30170, 30174, 30178, 30182, 30186, + 30190, 30194, 30198, 30202, 30206, 30210, 30214, 30218, 30222, 30228, + 30232, 30238, 30242, 30248, 30252, 30258, 30262, 30266, 30270, 30274, + 30278, 30282, 30288, 30294, 30300, 30306, 30312, 30318, 30324, 30330, + 30336, 30342, 30348, 30355, 30361, 30367, 30373, 30377, 30381, 30385, + 30389, 30393, 30397, 30401, 30407, 30413, 30419, 30424, 30431, 30436, + 30441, 30447, 30452, 30459, 30466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30473, + 30479, 30483, 30488, 30493, 30498, 30503, 30508, 30513, 30518, 30523, + 30528, 30532, 30537, 30542, 30547, 30551, 30555, 30560, 30565, 30570, + 30574, 30578, 30582, 30586, 30591, 30596, 30601, 30605, 30609, 30614, 0, + 30619, 30624, 30629, 30634, 30640, 30646, 30652, 30658, 30663, 30668, + 30674, 30680, 0, 0, 0, 0, 30687, 30692, 30698, 30704, 30709, 30714, + 30719, 30724, 30729, 30734, 30739, 30744, 0, 0, 0, 0, 30749, 0, 0, 0, + 30754, 30759, 30764, 30769, 30773, 30777, 30781, 30785, 30789, 30793, + 30797, 30801, 30805, 30810, 30816, 30822, 30828, 30833, 30838, 30843, + 30849, 30854, 30859, 30865, 30870, 30876, 30882, 30887, 30893, 30899, + 30905, 30910, 30915, 30920, 30926, 30932, 30937, 30943, 30948, 30954, + 30959, 30965, 0, 0, 30971, 30977, 30983, 30989, 30995, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31001, 31010, 31019, 31027, 31036, 31045, 31053, 31062, + 31071, 31080, 31088, 31096, 31105, 31113, 31121, 31129, 31138, 31146, + 31154, 31163, 31171, 31179, 31188, 31196, 31204, 31213, 31221, 31230, + 31239, 31247, 31256, 31265, 31273, 31281, 31290, 31299, 31307, 31316, + 31325, 31334, 31343, 31352, 31361, 31370, 0, 0, 0, 0, 31379, 31389, + 31398, 31407, 31415, 31424, 31432, 31441, 31449, 31458, 31467, 31476, + 31485, 31494, 31503, 31512, 31521, 31530, 31539, 31548, 31557, 31566, + 31575, 31584, 31593, 31601, 0, 0, 0, 0, 0, 0, 31609, 31617, 31624, 31631, + 31638, 31645, 31652, 31659, 31666, 31673, 31680, 0, 0, 0, 31688, 31696, + 31704, 31708, 31714, 31720, 31726, 31732, 31738, 31744, 31750, 31756, + 31762, 31768, 31774, 31780, 31786, 31792, 31798, 31802, 31808, 31814, + 31820, 31826, 31832, 31838, 31844, 31850, 31856, 31862, 31868, 31874, + 31880, 31886, 31892, 31896, 31901, 31906, 31911, 31915, 31920, 31924, + 31929, 31933, 31938, 31942, 31947, 31952, 31957, 31962, 31967, 31971, + 31975, 31979, 31984, 31988, 31992, 31996, 32001, 32006, 32011, 32016, 0, + 0, 32022, 32026, 32033, 32038, 32044, 32050, 32055, 32061, 32067, 32072, + 32078, 32084, 32090, 32095, 32101, 32106, 32111, 32117, 32122, 32128, + 32133, 32138, 32144, 32149, 32155, 32159, 32164, 32169, 32175, 32181, + 32186, 32192, 32198, 32202, 32207, 32212, 32216, 32221, 32225, 32230, + 32235, 32241, 32247, 32252, 32257, 32262, 32266, 32271, 32275, 32280, + 32284, 32289, 32294, 32299, 32304, 32310, 32317, 32324, 32334, 32343, + 32350, 32356, 32367, 32372, 32378, 0, 32383, 32388, 32393, 32401, 32407, + 32415, 32420, 32426, 32432, 32438, 32443, 32449, 32454, 32461, 32467, + 32472, 32478, 32484, 32490, 32497, 32504, 32511, 32516, 32521, 32528, + 32535, 32542, 32549, 32556, 0, 0, 32563, 32570, 32577, 32583, 32589, + 32595, 32601, 32607, 32613, 32619, 32625, 0, 0, 0, 0, 0, 0, 32631, 32637, + 32642, 32647, 32652, 32657, 32662, 32667, 32672, 32677, 0, 0, 0, 0, 0, 0, + 32682, 32687, 32692, 32697, 32702, 32707, 32712, 32721, 32728, 32733, + 32738, 32743, 32748, 32753, 0, 0, 32758, 32765, 32768, 32771, 32775, + 32780, 32784, 32790, 32795, 32801, 32808, 32816, 32820, 32825, 32829, + 32834, 32841, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32576, 32582, 32588, - 32592, 32596, 32600, 32604, 32610, 32614, 32620, 32624, 32630, 32636, - 32644, 32650, 32658, 32662, 32666, 32670, 32676, 32679, 32685, 32689, - 32695, 32699, 32703, 32709, 32713, 32719, 32723, 32729, 32737, 32745, - 32753, 32759, 32762, 32768, 32772, 32778, 32781, 32784, 32790, 32794, - 32800, 32803, 32806, 32809, 32812, 32816, 32822, 32828, 32831, 32834, - 32838, 32843, 32848, 32855, 32860, 32867, 32874, 32883, 32890, 32899, - 32904, 32911, 32918, 32927, 32932, 32939, 32944, 32950, 32956, 32962, - 32968, 32974, 32980, 0, 0, 0, 0, 32986, 32990, 32993, 32996, 32999, - 33002, 33005, 33008, 33011, 33014, 33017, 33020, 33023, 33026, 33031, - 33036, 33041, 33044, 33049, 33054, 33059, 33064, 33071, 33076, 33081, - 33086, 33091, 33098, 33104, 33110, 33116, 33122, 33128, 33137, 33146, - 33152, 33158, 33166, 33174, 33183, 33192, 33200, 33208, 33217, 33226, 0, - 0, 0, 33234, 33239, 33244, 33249, 33253, 33257, 33261, 33266, 33270, - 33274, 33279, 33283, 33288, 33293, 33298, 33303, 33308, 33313, 33318, - 33322, 33327, 33331, 33335, 33340, 33345, 33350, 33354, 33358, 33362, - 33366, 33371, 33375, 33380, 33384, 33390, 33396, 33402, 33408, 33414, - 33420, 33426, 33432, 33438, 33443, 33448, 33455, 33463, 33468, 33473, - 33478, 33482, 33486, 33490, 33494, 33498, 33502, 33506, 33510, 33514, - 33518, 33523, 33528, 33533, 33539, 33545, 33549, 33555, 33559, 33565, - 33571, 33576, 33583, 33587, 33593, 33597, 33603, 33608, 33615, 33622, - 33627, 33634, 33639, 33644, 33648, 33654, 33658, 33664, 33670, 33676, - 33680, 33686, 33692, 33696, 33702, 33707, 33711, 33717, 33722, 33727, - 33732, 33737, 33741, 33745, 33750, 33755, 33762, 33768, 33773, 33780, - 33785, 33792, 33797, 33806, 33812, 33818, 33822, 0, 0, 0, 0, 0, 0, 0, 0, - 33826, 33835, 33842, 33849, 33856, 33860, 33865, 33870, 33875, 33880, - 33885, 33890, 33895, 33900, 33905, 33909, 33914, 33919, 33923, 33927, - 33932, 33937, 33942, 33947, 33952, 33957, 33961, 33966, 33971, 33976, - 33981, 33985, 33989, 33993, 33997, 34002, 34007, 34011, 34016, 34021, - 34025, 34031, 34037, 34043, 34048, 34053, 34059, 34064, 34070, 34075, - 34081, 34087, 34092, 34098, 34104, 34109, 34115, 34121, 34127, 34132, 0, - 0, 0, 34137, 34143, 34153, 34159, 34167, 34173, 34178, 34182, 34186, - 34190, 34194, 34198, 34202, 34206, 34210, 0, 0, 0, 34214, 34219, 34224, - 34229, 34236, 34242, 34248, 34254, 34260, 34266, 34272, 34278, 34284, - 34290, 34296, 34303, 34310, 34317, 34324, 34331, 34338, 34345, 34352, - 34359, 34366, 34373, 34380, 34387, 34394, 34401, 34408, 34415, 34422, - 34429, 34436, 34443, 34450, 34457, 34464, 34471, 34478, 34485, 34492, - 34499, 34507, 34515, 34523, 34529, 34535, 34541, 34549, 34558, 34565, - 34572, 34578, 34585, 34592, 34599, 34607, 34614, 0, 0, 0, 0, 0, 0, 0, - 34621, 34628, 34635, 34642, 34649, 34656, 34663, 34670, 34677, 34684, - 34691, 34698, 34705, 34712, 34719, 34726, 34733, 34740, 34747, 34754, - 34761, 34768, 34775, 34782, 34789, 34796, 34803, 34810, 34817, 34824, - 34831, 34838, 34845, 34852, 34859, 34866, 34873, 34880, 34887, 34894, - 34901, 34908, 34916, 0, 0, 34923, 34930, 34938, 34946, 34954, 34962, - 34970, 34978, 34988, 34998, 35008, 0, 0, 0, 0, 0, 0, 0, 0, 35018, 35023, - 35028, 35033, 35038, 35047, 35058, 35067, 35078, 35084, 35097, 35103, - 35110, 35117, 35122, 35129, 35136, 35147, 35156, 35163, 35170, 35179, - 35186, 35195, 35205, 35215, 35222, 35229, 35236, 35246, 35251, 35259, - 35265, 35273, 35282, 35287, 35294, 35300, 35305, 35310, 35315, 35321, - 35328, 0, 0, 0, 0, 0, 35336, 35341, 35347, 35353, 35361, 35367, 35373, - 35379, 35384, 35390, 35395, 35401, 35407, 35415, 35421, 35429, 35434, - 35440, 35446, 35453, 35461, 35467, 35473, 35480, 35487, 35493, 35500, - 35506, 35512, 35517, 35523, 35531, 35539, 35545, 35551, 35557, 35563, - 35571, 35575, 35581, 35587, 35593, 35599, 35605, 35611, 35615, 35620, - 35625, 35632, 35637, 35641, 35647, 35652, 35657, 35661, 35666, 35671, - 35675, 35680, 35685, 35692, 35696, 35701, 35706, 35710, 35715, 35719, - 35724, 35728, 35733, 35738, 35744, 35749, 35754, 35758, 35763, 35768, - 35774, 35779, 35784, 35789, 35794, 35799, 35803, 35808, 35815, 35822, - 35827, 35832, 35836, 35842, 35848, 35853, 35858, 35863, 35869, 35874, - 35880, 35885, 35891, 35897, 35903, 35910, 35917, 35924, 35931, 35938, - 35945, 35950, 35958, 35967, 35976, 35985, 35994, 36003, 36012, 36024, - 36033, 36042, 36051, 36057, 36062, 36069, 36077, 36085, 36092, 36099, - 36106, 36113, 36121, 36130, 36139, 36148, 36157, 36166, 36175, 36184, - 36193, 36202, 36211, 36220, 36229, 36238, 36247, 36255, 36264, 36275, - 36284, 36294, 36306, 36315, 36324, 36333, 36342, 36350, 36359, 36365, - 36370, 36378, 36383, 36390, 36395, 36404, 36410, 36416, 36423, 36428, - 36433, 36441, 36449, 36458, 36467, 36472, 36479, 36489, 36497, 36506, - 36512, 36518, 36523, 36530, 36535, 36544, 36549, 36554, 36559, 36566, - 36572, 36577, 36586, 36594, 36599, 36604, 36611, 36618, 36622, 36626, - 36629, 36632, 36635, 36638, 36641, 36644, 36651, 36654, 36657, 36662, - 36666, 36670, 36674, 36678, 36682, 36691, 36697, 36703, 36709, 36717, - 36725, 36731, 36737, 36744, 36750, 36755, 36761, 36768, 36774, 36781, - 36787, 36795, 36801, 36808, 36814, 36820, 36826, 36832, 36838, 36844, - 36855, 36865, 36871, 36877, 36887, 36893, 36901, 36909, 36917, 36922, - 36928, 36934, 36939, 0, 36947, 36951, 36958, 36965, 36970, 36979, 36987, - 36995, 37002, 37009, 37016, 37023, 37031, 37039, 37049, 37059, 37067, - 37075, 37083, 37091, 37100, 37109, 37117, 37125, 37134, 37143, 37154, - 37165, 37175, 37185, 37194, 37203, 37212, 37221, 37232, 37243, 37251, - 37259, 37267, 37275, 37283, 37291, 37299, 37307, 37315, 37323, 37331, - 37339, 37348, 37357, 37366, 37375, 37385, 37395, 37402, 37409, 37417, - 37425, 37434, 37443, 37451, 37459, 37471, 37483, 37492, 37501, 37510, - 37519, 37526, 37533, 37541, 37549, 37557, 37565, 37573, 37581, 37589, - 37597, 37606, 37615, 37624, 37633, 37642, 37651, 37661, 37671, 37681, - 37691, 37700, 37709, 37716, 37723, 37731, 37739, 37747, 37755, 37763, - 37771, 37783, 37795, 37804, 37813, 37821, 37829, 37837, 37845, 37856, - 37867, 37878, 37889, 37901, 37913, 37921, 37929, 37937, 37945, 37954, - 37963, 37972, 37981, 37989, 37997, 38005, 38013, 38021, 38029, 38038, - 38047, 38057, 38067, 38075, 38083, 38091, 38099, 38107, 38115, 38122, - 38129, 38137, 38145, 38153, 38161, 38169, 38177, 38185, 38193, 38201, - 38209, 38217, 38225, 38233, 38241, 38249, 38257, 38266, 38275, 38284, - 38292, 38301, 38310, 38319, 38328, 38338, 38347, 38354, 38359, 38366, - 38373, 38381, 38389, 38398, 38407, 38417, 38427, 38438, 38449, 38459, - 38469, 38479, 38489, 38498, 38507, 38517, 38527, 38538, 38549, 38559, - 38569, 38579, 38589, 38597, 38605, 38614, 38623, 38631, 38639, 38649, - 38659, 38670, 38681, 38693, 38705, 38716, 38727, 38738, 38749, 38758, - 38767, 38775, 38783, 38790, 38797, 38805, 38813, 38822, 38831, 38841, - 38851, 38862, 38873, 38883, 38893, 38903, 38913, 38922, 38931, 38941, - 38951, 38962, 38973, 38983, 38993, 39003, 39013, 39020, 39027, 39035, - 39043, 39052, 39061, 39071, 39081, 39092, 39103, 39113, 39123, 39133, - 39143, 39151, 39159, 39167, 39175, 39184, 39193, 39201, 39209, 39216, - 39223, 39230, 39237, 39245, 39253, 39261, 39269, 39280, 39291, 39302, - 39313, 39324, 39335, 39343, 39351, 39362, 39373, 39384, 39395, 39406, - 39417, 39425, 39433, 39444, 39455, 39466, 0, 0, 39477, 39485, 39493, - 39504, 39515, 39526, 0, 0, 39537, 39545, 39553, 39564, 39575, 39586, - 39597, 39608, 39619, 39627, 39635, 39646, 39657, 39668, 39679, 39690, - 39701, 39709, 39717, 39728, 39739, 39750, 39761, 39772, 39783, 39791, - 39799, 39810, 39821, 39832, 39843, 39854, 39865, 39873, 39881, 39892, - 39903, 39914, 0, 0, 39925, 39933, 39941, 39952, 39963, 39974, 0, 0, - 39985, 39993, 40001, 40012, 40023, 40034, 40045, 40056, 0, 40067, 0, - 40075, 0, 40086, 0, 40097, 40108, 40116, 40124, 40135, 40146, 40157, - 40168, 40179, 40190, 40198, 40206, 40217, 40228, 40239, 40250, 40261, - 40272, 40280, 40288, 40296, 40304, 40312, 40320, 40328, 40336, 40344, - 40352, 40360, 40368, 40376, 0, 0, 40384, 40395, 40406, 40420, 40434, - 40448, 40462, 40476, 40490, 40501, 40512, 40526, 40540, 40554, 40568, - 40582, 40596, 40607, 40618, 40632, 40646, 40660, 40674, 40688, 40702, - 40713, 40724, 40738, 40752, 40766, 40780, 40794, 40808, 40819, 40830, - 40844, 40858, 40872, 40886, 40900, 40914, 40925, 40936, 40950, 40964, - 40978, 40992, 41006, 41020, 41028, 41036, 41047, 41055, 0, 41066, 41074, - 41085, 41093, 41101, 41109, 41117, 41125, 41128, 41131, 41134, 41137, - 41143, 41154, 41162, 0, 41173, 41181, 41192, 41200, 41208, 41216, 41224, - 41232, 41238, 41244, 41250, 41258, 41266, 41277, 0, 0, 41288, 41296, - 41307, 41315, 41323, 41331, 0, 41339, 41345, 41351, 41357, 41365, 41373, - 41384, 41395, 41403, 41411, 41419, 41430, 41438, 41446, 41454, 41462, - 41470, 41476, 41482, 0, 0, 41485, 41496, 41504, 0, 41515, 41523, 41534, - 41542, 41550, 41558, 41566, 41574, 41577, 0, 41580, 41584, 41588, 41592, - 41596, 41600, 41604, 41608, 41612, 41616, 41620, 41624, 41630, 41636, - 41642, 41645, 41648, 41650, 41654, 41658, 41662, 41666, 41669, 41673, - 41677, 41683, 41689, 41696, 41703, 41708, 41713, 41719, 41725, 41727, - 41730, 41732, 41736, 41740, 41744, 41748, 41752, 41756, 41760, 41764, - 41768, 41774, 41778, 41782, 41788, 41793, 41800, 41802, 41805, 41809, - 41813, 41818, 41824, 41826, 41835, 41844, 41847, 41851, 41853, 41855, - 41857, 41860, 41866, 41868, 41872, 41875, 41882, 41889, 41893, 41898, - 41903, 41908, 41913, 41917, 41921, 41924, 41928, 41932, 41939, 41944, - 41948, 41952, 41957, 41961, 41965, 41970, 41975, 41979, 41983, 41987, - 41989, 41994, 41999, 42003, 42007, 42011, 42015, 0, 42019, 42023, 42027, - 42033, 42039, 42045, 42051, 42058, 42065, 42070, 42075, 42079, 0, 0, - 42085, 42088, 42091, 42094, 42097, 42100, 42103, 42107, 42111, 42116, - 42121, 42126, 42133, 42137, 42140, 42143, 42146, 42149, 42152, 42155, - 42158, 42161, 42164, 42168, 42172, 42177, 42182, 0, 42187, 42193, 42199, - 42205, 42212, 42219, 42226, 42233, 42239, 42246, 42253, 42260, 42267, 0, - 0, 0, 42274, 42277, 42280, 42283, 42288, 42291, 42294, 42297, 42300, - 42303, 42306, 42311, 42314, 42317, 42320, 42323, 42326, 42331, 42334, - 42337, 42340, 42343, 42346, 42351, 42354, 42357, 42362, 42367, 42371, - 42374, 42377, 42380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 42383, 42388, 42393, 42400, 42408, 42413, 42418, 42422, 42426, 42431, - 42438, 42445, 42450, 42456, 42461, 42466, 42471, 42478, 42483, 42488, - 42493, 42502, 42509, 42516, 42520, 42525, 42531, 42536, 42543, 42551, - 42559, 42563, 42567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42571, - 42575, 42583, 42588, 42592, 42597, 42601, 42605, 42609, 42611, 42615, - 42619, 42623, 42628, 42633, 42637, 42645, 42648, 42652, 42655, 42658, - 42664, 42669, 42672, 42678, 42682, 42687, 42692, 42695, 42699, 42703, - 42707, 42709, 42712, 42715, 42719, 42721, 42726, 42729, 42732, 42737, - 42742, 42748, 42751, 42754, 42758, 42763, 42766, 42769, 42772, 42776, - 42780, 42784, 42787, 42789, 42792, 42795, 42798, 42802, 42807, 42810, - 42815, 42820, 42825, 42830, 42836, 42841, 42845, 42850, 42855, 42861, - 42867, 42872, 42877, 42883, 42887, 42890, 42893, 42895, 42899, 42905, - 42911, 42917, 42923, 42929, 42935, 42941, 42947, 42953, 42960, 42966, - 42973, 42979, 42985, 42992, 42999, 43003, 43008, 43013, 43018, 43023, - 43028, 43033, 43038, 43043, 43048, 43054, 43060, 43066, 43072, 43079, - 43087, 43093, 43099, 43105, 43111, 43117, 43123, 43129, 43135, 43141, - 43147, 43154, 43161, 43168, 43175, 43183, 43192, 43199, 43210, 43217, - 43224, 43233, 43240, 43249, 43258, 43265, 43273, 43280, 43283, 0, 0, 0, - 0, 43286, 43288, 43291, 43293, 43296, 43299, 43302, 43306, 43310, 43315, - 43320, 43324, 43328, 43332, 43336, 43341, 43347, 43352, 43358, 43363, - 43368, 43373, 43379, 43384, 43390, 43396, 43400, 43404, 43409, 43414, - 43419, 43424, 43429, 43437, 43445, 43453, 43461, 43468, 43476, 43483, - 43490, 43498, 43510, 43516, 43522, 43529, 43536, 43544, 43552, 43559, - 43566, 43574, 43582, 43587, 43595, 43600, 43605, 43611, 43616, 43622, - 43629, 43636, 43641, 43647, 43652, 43655, 43659, 43662, 43666, 43670, - 43674, 43679, 43684, 43690, 43696, 43700, 43704, 43708, 43712, 43718, - 43724, 43728, 43733, 43737, 43742, 43747, 43752, 43755, 43759, 43762, - 43766, 43773, 43781, 43793, 43804, 43809, 43818, 43825, 43833, 43842, - 43846, 43852, 43860, 43864, 43869, 43874, 43880, 43886, 43892, 43899, - 43903, 43907, 43912, 43915, 43917, 43921, 43925, 43933, 43937, 43939, - 43941, 43945, 43953, 43958, 43964, 43974, 43981, 43986, 43990, 43994, - 43998, 44001, 44004, 44007, 44011, 44015, 44019, 44023, 44027, 44030, - 44034, 44038, 44041, 44043, 44046, 44048, 44052, 44056, 44058, 44064, - 44067, 44072, 44076, 44080, 44082, 44084, 44086, 44089, 44093, 44097, - 44101, 44105, 44109, 44115, 44121, 44123, 44125, 44127, 44129, 44132, - 44134, 44138, 44140, 44144, 44148, 44154, 44158, 44162, 44166, 44170, - 44174, 44180, 44184, 44194, 44204, 44208, 44214, 44221, 44225, 44229, - 44232, 44237, 44241, 44247, 44251, 44264, 44273, 44277, 44281, 44287, - 44291, 44294, 44296, 44299, 44303, 44307, 44314, 44318, 44322, 44326, - 44329, 44334, 44339, 44345, 44351, 44356, 44361, 44369, 44377, 44381, - 44385, 44387, 44392, 44396, 44400, 44408, 44416, 44423, 44430, 44439, - 44448, 44454, 44460, 44468, 44476, 44478, 44480, 44486, 44492, 44499, - 44506, 44512, 44518, 44522, 44526, 44533, 44540, 44547, 44554, 44564, - 44574, 44582, 44590, 44592, 44596, 44600, 44605, 44610, 44618, 44626, - 44629, 44632, 44635, 44638, 44641, 44646, 44650, 44655, 44660, 44663, - 44666, 44669, 44672, 44675, 44679, 44682, 44685, 44688, 44691, 44693, - 44695, 44697, 44699, 44707, 44715, 44721, 44725, 44731, 44741, 44747, - 44753, 44759, 44767, 44776, 44788, 44792, 44796, 44798, 44804, 44806, - 44808, 44810, 44812, 44818, 44821, 44827, 44833, 44837, 44841, 44845, - 44848, 44852, 44856, 44858, 44867, 44876, 44881, 44886, 44892, 44898, - 44904, 44907, 44910, 44913, 44916, 44918, 44923, 44928, 44933, 44939, - 44945, 44954, 44963, 44970, 44977, 44984, 44991, 45001, 45011, 45021, - 45031, 45041, 45051, 45060, 45069, 45078, 45087, 45095, 45107, 45118, - 45134, 45137, 45143, 45149, 45155, 45163, 45178, 45194, 45200, 45206, - 45213, 45219, 45228, 45235, 45249, 45264, 45269, 45275, 45283, 45286, - 45289, 45291, 45294, 45297, 45299, 45301, 45305, 45308, 45311, 45314, - 45317, 45322, 45327, 45332, 45337, 45342, 45345, 45347, 45349, 45351, - 45355, 45359, 45363, 45369, 45373, 45375, 45377, 45382, 45387, 45392, - 45397, 45402, 45407, 45409, 45411, 45421, 45425, 45433, 45442, 45444, - 45449, 45454, 45462, 45466, 45468, 45472, 45474, 45478, 45482, 45486, - 45488, 45490, 45492, 45499, 45508, 45517, 45526, 45535, 45544, 45553, - 45562, 45571, 45579, 45587, 45596, 45605, 45614, 45623, 45631, 45639, - 45648, 45657, 45666, 45676, 45685, 45695, 45704, 45714, 45723, 45733, - 45743, 45752, 45762, 45771, 45781, 45790, 45800, 45809, 45818, 45827, - 45836, 45845, 45855, 45864, 45873, 45882, 45892, 45901, 45910, 45919, - 45928, 45938, 45948, 45957, 45966, 45974, 45983, 45990, 45999, 46008, - 46019, 46028, 46038, 46048, 46055, 46062, 46069, 46078, 46087, 46096, - 46105, 46112, 46117, 46126, 46131, 46134, 46141, 46144, 46149, 46154, - 46157, 46160, 46168, 46171, 46176, 46179, 46187, 46192, 46200, 46203, - 46206, 46209, 46214, 46219, 46222, 46225, 46233, 46236, 46243, 46250, - 46254, 46258, 46263, 46268, 46274, 46279, 46285, 46291, 46296, 46302, - 46310, 46316, 46324, 46332, 46338, 46346, 46354, 46362, 46370, 46376, - 46384, 46392, 46400, 46404, 46410, 46424, 46438, 46442, 46446, 46450, - 46454, 46464, 46468, 46473, 46478, 46484, 46490, 46496, 46502, 46512, - 46522, 46530, 46541, 46552, 46560, 46571, 46582, 46590, 46601, 46612, - 46620, 46628, 46638, 46648, 46651, 46654, 46657, 46662, 46666, 46672, - 46679, 46686, 46694, 46701, 46705, 46709, 46713, 46717, 46719, 46723, - 46727, 46732, 46737, 46744, 46751, 46754, 46761, 46763, 46765, 46769, - 46773, 46778, 46784, 46790, 46796, 46802, 46811, 46820, 46829, 46833, - 46835, 46839, 46846, 46853, 46860, 46867, 46874, 46877, 46882, 46888, - 46891, 46896, 46901, 46906, 46911, 46915, 46922, 46929, 46936, 46943, - 46947, 46951, 46955, 46959, 46965, 46971, 46976, 46982, 46988, 46994, - 47000, 47008, 47015, 47022, 47029, 47036, 47042, 47048, 47057, 47061, - 47068, 47072, 47076, 47082, 47088, 47094, 47100, 47104, 47108, 47111, - 47114, 47118, 47125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47132, 47135, 47139, 47143, 47149, 47155, 47161, - 47169, 47176, 47180, 47188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 47193, 47196, 47199, 47202, 47205, 47208, 47211, 47214, - 47217, 47220, 47224, 47228, 47232, 47236, 47240, 47244, 47248, 47252, - 47256, 47260, 47264, 47267, 47270, 47273, 47276, 47279, 47282, 47285, - 47288, 47291, 47295, 47299, 47303, 47307, 47311, 47315, 47319, 47323, - 47327, 47331, 47335, 47341, 47347, 47353, 47360, 47367, 47374, 47381, - 47388, 47395, 47402, 47409, 47416, 47423, 47430, 47437, 47444, 47451, - 47458, 47465, 47472, 47477, 47483, 47489, 47495, 47500, 47506, 47512, - 47518, 47523, 47529, 47535, 47540, 47546, 47552, 47557, 47563, 47569, - 47574, 47580, 47586, 47591, 47597, 47603, 47609, 47615, 47621, 47626, - 47632, 47638, 47644, 47649, 47655, 47661, 47667, 47672, 47678, 47684, - 47689, 47695, 47701, 47706, 47712, 47718, 47723, 47729, 47735, 47740, - 47746, 47752, 47758, 47764, 47770, 47775, 47781, 47787, 47793, 47798, - 47804, 47810, 47816, 47821, 47827, 47833, 47838, 47844, 47850, 47855, - 47861, 47867, 47872, 47878, 47884, 47889, 47895, 47901, 47907, 47913, - 47919, 47923, 47929, 47935, 47941, 47947, 47953, 47959, 47965, 47971, - 47977, 47983, 47987, 47991, 47995, 47999, 48003, 48007, 48011, 48015, - 48019, 48024, 48030, 48035, 48040, 48045, 48050, 48059, 48068, 48077, - 48086, 48095, 48104, 48113, 48122, 48129, 48137, 48145, 48152, 48159, - 48167, 48175, 48182, 48189, 48197, 48205, 48212, 48219, 48227, 48235, - 48242, 48249, 48257, 48266, 48275, 48283, 48292, 48301, 48308, 48315, - 48323, 48332, 48341, 48349, 48358, 48367, 48374, 48381, 48390, 48399, - 48408, 48417, 48426, 48435, 48442, 48449, 48458, 48467, 48476, 48485, - 48494, 48503, 48510, 48517, 48526, 48535, 48544, 48554, 48564, 48573, - 48583, 48593, 48603, 48613, 48623, 48633, 48642, 48651, 48658, 48666, - 48674, 48682, 48690, 48695, 48700, 48709, 48717, 48724, 48733, 48741, - 48748, 48757, 48765, 48772, 48781, 48789, 48796, 48805, 48813, 48820, - 48829, 48837, 48844, 48854, 48863, 48870, 48880, 48889, 48896, 48906, - 48915, 48922, 48931, 48940, 48949, 48958, 48972, 48986, 48993, 48998, - 49003, 49008, 49013, 49018, 49023, 49028, 49033, 49041, 49049, 49057, - 49065, 49070, 49077, 49084, 49091, 49096, 49104, 49111, 49119, 49123, - 49130, 49136, 49143, 49147, 49153, 49159, 49165, 49169, 49172, 49176, - 49180, 49187, 49193, 49199, 49205, 49211, 49225, 49235, 49249, 49263, - 49269, 49279, 49293, 49296, 49299, 49306, 49314, 49320, 49325, 49333, - 49345, 49357, 49365, 49369, 49373, 49376, 49379, 49383, 49387, 49390, - 49393, 49398, 49403, 49409, 49415, 49420, 49425, 49431, 49437, 49442, - 49447, 49452, 49457, 49463, 49469, 49474, 49479, 49485, 49491, 49496, - 49501, 49504, 49507, 49516, 49518, 49520, 49523, 49527, 49533, 49535, - 49538, 49545, 49552, 49560, 49568, 49578, 49592, 49597, 49602, 49606, - 49611, 49619, 49627, 49636, 49645, 49654, 49663, 49668, 49673, 49679, - 49685, 49691, 49697, 49700, 49706, 49712, 49722, 49732, 49740, 49748, - 49757, 49766, 49770, 49778, 49786, 49794, 49802, 49811, 49820, 49829, - 49838, 49843, 49848, 49853, 49858, 49863, 49869, 49875, 49880, 49886, - 49888, 49890, 49892, 49894, 49897, 49900, 49902, 49904, 49906, 49910, - 49914, 49916, 49918, 49921, 49924, 49928, 49934, 49940, 49942, 49949, - 49953, 49958, 49963, 49965, 49975, 49981, 49987, 49993, 49999, 50005, - 50011, 50016, 50019, 50022, 50025, 50027, 50029, 50033, 50037, 50042, - 50047, 50052, 50055, 50059, 50064, 50067, 50071, 50076, 50081, 50086, - 50091, 50096, 50101, 50106, 50111, 50116, 50121, 50126, 50131, 50137, - 50143, 50149, 50151, 50154, 50156, 50159, 50161, 50163, 50165, 50167, - 50169, 50171, 50173, 50175, 50177, 50179, 50181, 50183, 50185, 50187, - 50189, 50191, 50193, 50198, 50203, 50208, 50213, 50218, 50223, 50228, - 50233, 50238, 50243, 50248, 50253, 50258, 50263, 50268, 50273, 50278, - 50283, 50288, 50293, 50297, 50301, 50305, 50311, 50317, 50322, 50327, - 50332, 50338, 50344, 50349, 50357, 50365, 50373, 50381, 50389, 50397, - 50405, 50413, 50419, 50424, 50429, 50434, 50437, 50441, 50445, 50449, - 50453, 50457, 50461, 50468, 50475, 50483, 50491, 50496, 50501, 50508, - 50515, 50522, 50529, 50532, 50535, 50540, 50542, 50546, 50551, 50553, - 50555, 50557, 50559, 50564, 50567, 50569, 50574, 50581, 50588, 50591, - 50595, 50600, 50605, 50613, 50619, 50625, 50637, 50644, 50652, 50657, - 50662, 50668, 50671, 50674, 50679, 50681, 50685, 50687, 50689, 50691, - 50693, 50695, 50697, 50702, 50704, 50706, 50708, 50710, 50714, 50716, - 50719, 50724, 50729, 50734, 50739, 50745, 50751, 50753, 50756, 50763, - 50769, 50775, 50782, 50786, 50790, 50792, 50794, 50798, 50804, 50809, - 50811, 50815, 50824, 50832, 50840, 50846, 50852, 50857, 50863, 50868, - 50871, 50885, 50888, 50893, 50898, 50904, 50915, 50917, 50923, 50929, - 50933, 50940, 50944, 50946, 50948, 50952, 50958, 50963, 50969, 50971, - 50977, 50979, 50985, 50987, 50989, 50994, 50996, 51000, 51005, 51007, - 51012, 51017, 51021, 51028, 51038, 51043, 51049, 51052, 51058, 51061, - 51066, 51071, 51075, 51077, 51079, 51083, 51087, 51091, 51095, 51100, - 51102, 51107, 51110, 51113, 51116, 51120, 51124, 51129, 51133, 51138, - 51143, 51147, 51152, 51158, 51161, 51167, 51172, 51176, 51181, 51187, - 51193, 51200, 51206, 51213, 51220, 51222, 51229, 51233, 51239, 51245, - 51250, 51256, 51260, 51265, 51268, 51273, 51279, 51286, 51294, 51301, - 51310, 51320, 51327, 51333, 51337, 51344, 51349, 51358, 51361, 51364, - 51373, 51383, 51390, 51392, 51398, 51403, 51405, 51408, 51412, 51420, - 51429, 51432, 51437, 51443, 51451, 51459, 51467, 51475, 51481, 51487, - 51493, 51501, 51506, 51509, 51513, 51516, 51527, 51537, 51547, 51556, - 51567, 51577, 51586, 51592, 51600, 51604, 51612, 51616, 51624, 51631, - 51638, 51647, 51656, 51666, 51676, 51686, 51696, 51705, 51714, 51724, - 51734, 51743, 51752, 51759, 51766, 51773, 51780, 51787, 51794, 51801, - 51808, 51815, 51823, 51829, 51835, 51841, 51847, 51853, 51859, 51865, - 51871, 51877, 51884, 51892, 51900, 51908, 51916, 51924, 51932, 51940, - 51948, 51956, 51965, 51970, 51973, 51977, 51981, 51987, 51990, 51995, - 52001, 52006, 52010, 52015, 52021, 52028, 52031, 52038, 52045, 52049, - 52058, 52067, 52072, 52078, 52083, 52088, 52095, 52102, 52110, 52118, - 52127, 52131, 52140, 52145, 52149, 52156, 52160, 52166, 52174, 52179, - 52186, 52190, 52195, 52199, 52204, 52208, 52213, 52218, 52227, 52229, - 52232, 52235, 52242, 52249, 52255, 52263, 52269, 52276, 52281, 52284, - 52289, 52294, 52299, 52307, 52311, 52318, 52326, 52334, 52339, 52344, - 52350, 52355, 52360, 52366, 52371, 52374, 52378, 52382, 52389, 52399, - 52404, 52413, 52422, 52428, 52434, 52439, 52444, 52449, 52454, 52460, - 52466, 52474, 52482, 52488, 52494, 52499, 52504, 52511, 52518, 52524, - 52527, 52530, 52534, 52538, 52542, 52547, 52553, 52559, 52566, 52573, - 52578, 52582, 52586, 52590, 52594, 52598, 52602, 52606, 52610, 52614, - 52618, 52622, 52626, 52630, 52634, 52638, 52642, 52646, 52650, 52654, - 52658, 52662, 52666, 52670, 52674, 52678, 52682, 52686, 52690, 52694, - 52698, 52702, 52706, 52710, 52714, 52718, 52722, 52726, 52730, 52734, - 52738, 52742, 52746, 52750, 52754, 52758, 52762, 52766, 52770, 52774, - 52778, 52782, 52786, 52790, 52794, 52798, 52802, 52806, 52810, 52814, - 52818, 52822, 52826, 52830, 52834, 52838, 52842, 52846, 52850, 52854, - 52858, 52862, 52866, 52870, 52874, 52878, 52882, 52886, 52890, 52894, - 52898, 52902, 52906, 52910, 52914, 52918, 52922, 52926, 52930, 52934, - 52938, 52942, 52946, 52950, 52954, 52958, 52962, 52966, 52970, 52974, - 52978, 52982, 52986, 52990, 52994, 52998, 53002, 53006, 53010, 53014, - 53018, 53022, 53026, 53030, 53034, 53038, 53042, 53046, 53050, 53054, - 53058, 53062, 53066, 53070, 53074, 53078, 53082, 53086, 53090, 53094, - 53098, 53102, 53106, 53110, 53114, 53118, 53122, 53126, 53130, 53134, - 53138, 53142, 53146, 53150, 53154, 53158, 53162, 53166, 53170, 53174, - 53178, 53182, 53186, 53190, 53194, 53198, 53202, 53206, 53210, 53214, - 53218, 53222, 53226, 53230, 53234, 53238, 53242, 53246, 53250, 53254, - 53258, 53262, 53266, 53270, 53274, 53278, 53282, 53286, 53290, 53294, - 53298, 53302, 53306, 53310, 53314, 53318, 53322, 53326, 53330, 53334, - 53338, 53342, 53346, 53350, 53354, 53358, 53362, 53366, 53370, 53374, - 53378, 53382, 53386, 53390, 53394, 53398, 53402, 53406, 53410, 53414, - 53418, 53422, 53426, 53430, 53434, 53438, 53442, 53446, 53450, 53454, - 53458, 53462, 53466, 53470, 53474, 53478, 53482, 53486, 53490, 53494, - 53498, 53502, 53506, 53510, 53514, 53518, 53522, 53526, 53530, 53534, - 53538, 53542, 53546, 53550, 53554, 53558, 53562, 53566, 53570, 53574, - 53578, 53582, 53586, 53590, 53594, 53598, 53602, 53609, 53617, 53623, - 53629, 53636, 53643, 53649, 53655, 53662, 53669, 53674, 53679, 53684, - 53689, 53695, 53701, 53709, 53716, 53722, 53728, 53736, 53745, 53752, - 53762, 53773, 53776, 53779, 53783, 53787, 53794, 53801, 53812, 53823, - 53832, 53841, 53847, 53853, 53860, 53867, 53876, 53886, 53897, 53907, - 53917, 53927, 53938, 53949, 53959, 53970, 53980, 53990, 53999, 54009, - 54019, 54030, 54041, 54048, 54055, 54062, 54069, 54079, 54089, 54097, - 54105, 54112, 54119, 54126, 54133, 54140, 54145, 54150, 54156, 54164, - 54174, 54182, 54190, 54198, 54206, 54214, 54222, 54230, 54238, 54247, - 54256, 54266, 54276, 54285, 54294, 54304, 54314, 54323, 54332, 54342, - 54352, 54361, 54370, 54380, 54390, 54404, 54421, 54435, 54452, 54466, - 54480, 54494, 54508, 54518, 54529, 54539, 54550, 54567, 54584, 54592, - 54598, 54605, 54612, 54619, 54626, 54631, 54637, 54642, 54647, 54653, - 54658, 54663, 54668, 54673, 54678, 54685, 54691, 54699, 54704, 54709, - 54713, 54717, 54725, 54733, 54741, 54749, 54756, 54763, 54776, 54789, - 54802, 54815, 54823, 54831, 54837, 54843, 54850, 54857, 54864, 54871, - 54875, 54880, 54888, 54896, 54904, 54911, 54915, 54923, 54931, 54934, - 54938, 54943, 54950, 54958, 54966, 54985, 55004, 55023, 55042, 55061, - 55080, 55099, 55118, 55124, 55131, 55140, 55148, 55156, 55162, 55165, - 55168, 55173, 55176, 55196, 55203, 55209, 55215, 55219, 55222, 55225, - 55228, 55240, 55254, 55261, 55268, 55271, 55275, 55278, 55283, 55288, - 55293, 55299, 55308, 55315, 55322, 55330, 55337, 55344, 55347, 55353, - 55359, 55362, 55365, 55370, 55375, 55381, 55387, 55391, 55396, 55403, - 55407, 55413, 55417, 55421, 55429, 55441, 55450, 55454, 55456, 55465, - 55474, 55480, 55483, 55489, 55495, 55500, 55505, 55510, 55515, 55520, - 55525, 55527, 55533, 55538, 55546, 55550, 55556, 55559, 55563, 55570, - 55577, 55579, 55581, 55587, 55593, 55599, 55608, 55617, 55624, 55631, - 55637, 55644, 55649, 55654, 55659, 55665, 55671, 55676, 55683, 55687, - 55691, 55704, 55717, 55729, 55738, 55744, 55751, 55756, 55761, 55766, - 55771, 55776, 55778, 55785, 55793, 55801, 55809, 55816, 55824, 55830, - 55835, 55841, 55847, 55853, 55860, 55866, 55874, 55882, 55890, 55898, - 55906, 55912, 55918, 55927, 55931, 55940, 55949, 55958, 55966, 55970, - 55976, 55983, 55990, 55994, 56000, 56008, 56014, 56019, 56025, 56030, - 56035, 56042, 56049, 56054, 56059, 56067, 56075, 56085, 56095, 56102, - 56109, 56113, 56117, 56129, 56135, 56142, 56147, 56152, 56159, 56166, - 56172, 56178, 56188, 56195, 56203, 56211, 56220, 56227, 56233, 56240, - 56246, 56254, 56262, 56270, 56278, 56284, 56289, 56299, 56310, 56317, - 56326, 56332, 56337, 56342, 56352, 56359, 56365, 56371, 56379, 56384, - 56391, 56398, 56411, 56419, 56426, 56433, 56440, 56447, 56455, 56463, - 56476, 56489, 56501, 56513, 56527, 56541, 56547, 56553, 56562, 56571, - 56578, 56585, 56594, 56603, 56612, 56621, 56629, 56637, 56647, 56657, - 56671, 56685, 56694, 56703, 56716, 56729, 56738, 56747, 56758, 56769, - 56775, 56781, 56790, 56799, 56804, 56809, 56817, 56823, 56829, 56837, - 56845, 56858, 56871, 56875, 56879, 56887, 56895, 56902, 56910, 56918, - 56927, 56936, 56942, 56948, 56955, 56962, 56969, 56976, 56985, 56994, - 56997, 57000, 57005, 57010, 57016, 57022, 57029, 57036, 57047, 57058, - 57065, 57072, 57080, 57088, 57096, 57104, 57112, 57120, 57126, 57132, - 57136, 57140, 57148, 57156, 57161, 57166, 57171, 57176, 57182, 57196, - 57203, 57210, 57214, 57216, 57218, 57223, 57228, 57233, 57238, 57246, - 57253, 57260, 57268, 57280, 57288, 57296, 57307, 57311, 57315, 57321, - 57329, 57342, 57349, 57356, 57363, 57369, 57376, 57385, 57394, 57400, - 57406, 57412, 57422, 57432, 57440, 57449, 57454, 57457, 57462, 57467, - 57472, 57478, 57484, 57488, 57491, 57495, 57499, 57504, 57509, 57515, - 57521, 57525, 57529, 57536, 57543, 57550, 57557, 57564, 57571, 57581, - 57591, 57598, 57605, 57613, 57621, 57625, 57630, 57635, 57641, 57647, - 57650, 57653, 57656, 57659, 57664, 57669, 57674, 57679, 57684, 57689, - 57693, 57697, 57701, 57706, 57711, 57715, 57719, 57725, 57729, 57735, - 57740, 57747, 57755, 57762, 57770, 57777, 57785, 57794, 57801, 57811, - 57822, 57828, 57837, 57843, 57852, 57861, 57867, 57873, 57877, 57881, - 57890, 57899, 57906, 57913, 57922, 57931, 57938, 57944, 57951, 57956, - 57960, 57964, 57969, 57974, 57979, 57987, 57995, 57998, 58002, 58011, - 58021, 58030, 58040, 58052, 58066, 58070, 58075, 58079, 58084, 58089, - 58094, 58100, 58106, 58113, 58120, 58126, 58133, 58139, 58146, 58154, - 58162, 58169, 58177, 58184, 0, 0, 58192, 58201, 58210, 58220, 58230, - 58239, 58249, 58258, 58268, 58274, 58279, 58288, 58300, 58309, 58321, - 58328, 58336, 58343, 58351, 58356, 58362, 58367, 58373, 58381, 58390, - 58398, 58407, 58411, 58415, 58419, 58423, 58433, 0, 0, 58436, 58445, - 58455, 58464, 58474, 58480, 58487, 58493, 58500, 58511, 58522, 58533, - 58544, 58554, 58564, 58574, 58584, 58592, 58600, 58608, 58616, 58624, - 58632, 58640, 58648, 58654, 58660, 58666, 58672, 58678, 58684, 58690, - 58696, 58708, 58718, 58723, 58730, 58735, 58742, 58745, 58749, 58753, - 58758, 58762, 58767, 58770, 58779, 58788, 58797, 58806, 58811, 58817, - 58823, 58831, 58841, 58848, 58857, 58862, 58865, 58868, 58873, 58878, - 58883, 58888, 58890, 58892, 58894, 58896, 58898, 58900, 58905, 58912, - 58919, 58921, 58923, 58925, 58927, 58929, 58931, 58933, 58935, 58940, - 58945, 58952, 58959, 58968, 58978, 58987, 58997, 59002, 59007, 59009, - 59016, 59023, 59030, 59037, 59044, 59051, 59058, 59061, 59064, 59067, - 59070, 59075, 59080, 59085, 59090, 59095, 59100, 59105, 59110, 59115, - 59120, 59125, 59130, 59136, 59140, 59145, 59150, 59155, 59160, 59165, - 59170, 59175, 59180, 59185, 59190, 59195, 59200, 59205, 59210, 59215, - 59220, 59225, 59230, 59235, 59240, 59245, 59250, 59256, 59261, 59267, - 59276, 59281, 59289, 59296, 59305, 59310, 59315, 59320, 59326, 0, 59333, - 59338, 59343, 59348, 59353, 59358, 59363, 59368, 59373, 59378, 59383, - 59389, 59393, 59398, 59403, 59408, 59413, 59418, 59423, 59428, 59433, - 59438, 59443, 59448, 59453, 59458, 59463, 59468, 59473, 59478, 59483, - 59488, 59493, 59498, 59503, 59509, 59514, 59520, 59529, 59534, 59542, - 59549, 59558, 59563, 59568, 59573, 59579, 0, 59586, 59594, 59602, 59611, - 59618, 59626, 59632, 59641, 59649, 59657, 59665, 59673, 59681, 59689, - 59694, 59701, 59706, 59712, 59720, 59727, 59734, 59742, 59748, 59754, - 59761, 59769, 59778, 59788, 59794, 59801, 59806, 59816, 59826, 59831, - 59836, 59841, 59846, 59851, 59856, 59861, 59866, 59871, 59876, 59881, - 59886, 59891, 59896, 59901, 59906, 59911, 59916, 59921, 59926, 59931, - 59936, 59941, 59946, 59951, 59956, 59961, 59966, 59971, 59976, 59980, - 59984, 59989, 59994, 59999, 60004, 60009, 60014, 60019, 60024, 60029, - 60034, 60039, 60044, 60049, 60054, 60059, 60064, 60069, 60074, 60081, - 60088, 60095, 60102, 60109, 60116, 60123, 60130, 60137, 60144, 60151, - 60158, 60165, 60172, 60177, 60182, 60189, 60196, 60203, 60210, 60217, - 60224, 60231, 60238, 60245, 60252, 60259, 60266, 60272, 60278, 60284, - 60290, 60297, 60304, 60311, 60318, 60325, 60332, 60339, 60346, 60353, - 60360, 60368, 60376, 60384, 60392, 60400, 60408, 60416, 60424, 60428, - 60434, 60440, 60444, 60450, 60456, 60462, 60469, 60476, 60483, 60490, - 60495, 60501, 60507, 60514, 0, 0, 0, 0, 0, 60521, 60529, 60538, 60547, - 60555, 60560, 60565, 60570, 60575, 60580, 60585, 60590, 60595, 60600, - 60605, 60610, 60615, 60620, 60625, 60630, 60635, 60640, 60645, 60650, - 60655, 60660, 60665, 60670, 60675, 60680, 60685, 60690, 60695, 60700, - 60705, 60710, 60715, 60720, 60725, 60730, 60735, 60740, 60745, 60750, - 60755, 0, 60760, 0, 0, 0, 0, 0, 60765, 0, 0, 60770, 60774, 60779, 60784, - 60789, 60794, 60803, 60808, 60813, 60818, 60823, 60828, 60833, 60838, - 60843, 60850, 60855, 60860, 60869, 60876, 60881, 60886, 60891, 60898, - 60903, 60910, 60915, 60920, 60927, 60934, 60939, 60944, 60949, 60956, - 60963, 60968, 60973, 60978, 60983, 60988, 60995, 61002, 61007, 61012, - 61017, 61022, 61027, 61032, 61037, 61042, 61047, 61052, 61057, 61064, - 61069, 61074, 0, 0, 0, 0, 0, 0, 0, 61079, 61086, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 61091, 61096, 61100, 61104, 61108, 61112, 61116, 61120, - 61124, 61128, 61132, 61136, 61142, 61146, 61150, 61154, 61158, 61162, - 61166, 61170, 61174, 61178, 61182, 61186, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 61190, 61194, 61198, 61202, 61206, 61210, 61214, 0, 61218, 61222, 61226, - 61230, 61234, 61238, 61242, 0, 61246, 61250, 61254, 61258, 61262, 61266, - 61270, 0, 61274, 61278, 61282, 61286, 61290, 61294, 61298, 0, 61302, - 61306, 61310, 61314, 61318, 61322, 61326, 0, 61330, 61334, 61338, 61342, - 61346, 61350, 61354, 0, 61358, 61362, 61366, 61370, 61374, 61378, 61382, - 0, 61386, 61390, 61394, 61398, 61402, 61406, 61410, 0, 61414, 61419, - 61424, 61429, 61434, 61439, 61444, 61448, 61453, 61458, 61463, 61467, - 61472, 61477, 61482, 61487, 61491, 61496, 61501, 61506, 61511, 61516, - 61521, 61525, 61530, 61535, 61542, 61547, 61552, 61558, 61565, 61572, - 61581, 61588, 61597, 61601, 61605, 61611, 61617, 61623, 61631, 61637, - 61641, 61645, 61649, 61655, 61661, 61665, 61667, 61671, 61677, 61679, - 61683, 61687, 61691, 61697, 61702, 61706, 61710, 61715, 61721, 61726, - 61731, 61736, 61741, 61748, 61755, 61760, 61765, 61770, 61775, 61780, - 61785, 61789, 61793, 61801, 61809, 61815, 61819, 61824, 61827, 61831, - 61838, 61841, 61845, 61849, 61852, 61858, 61864, 61867, 61873, 61877, - 61881, 61887, 61892, 61897, 61899, 61902, 61906, 61912, 61918, 61922, - 61927, 61936, 61939, 61945, 61950, 61954, 61958, 61962, 61965, 61970, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32849, 32855, + 32861, 32865, 32869, 32873, 32877, 32883, 32887, 32893, 32897, 32903, + 32909, 32917, 32923, 32931, 32935, 32939, 32943, 32949, 32952, 32958, + 32962, 32968, 32972, 32976, 32982, 32986, 32992, 32996, 33002, 33010, + 33018, 33026, 33032, 33035, 33041, 33045, 33051, 33054, 33057, 33063, + 33067, 33073, 33076, 33079, 33082, 33085, 33089, 33095, 33101, 33104, + 33107, 33111, 33116, 33121, 33128, 33133, 33140, 33147, 33156, 33163, + 33172, 33177, 33184, 33191, 33200, 33205, 33212, 33217, 33223, 33229, + 33235, 33241, 33247, 33253, 0, 0, 0, 0, 33259, 33263, 33266, 33269, + 33272, 33275, 33278, 33281, 33284, 33287, 33290, 33293, 33296, 33299, + 33304, 33309, 33314, 33317, 33322, 33327, 33332, 33337, 33344, 33349, + 33354, 33359, 33364, 33371, 33377, 33383, 33389, 33395, 33401, 33410, + 33419, 33425, 33431, 33440, 33449, 33458, 33467, 33476, 33485, 33494, + 33503, 0, 0, 0, 33512, 33517, 33522, 33527, 33531, 33535, 33539, 33544, + 33548, 33552, 33557, 33561, 33566, 33571, 33576, 33581, 33586, 33591, + 33596, 33600, 33605, 33609, 33613, 33618, 33623, 33628, 33632, 33636, + 33640, 33644, 33649, 33653, 33658, 33662, 33668, 33674, 33680, 33686, + 33692, 33698, 33704, 33710, 33716, 33721, 33726, 33733, 33741, 33746, + 33751, 33756, 33760, 33764, 33768, 33772, 33776, 33780, 33784, 33788, + 33792, 33796, 33801, 33806, 33811, 33817, 33823, 33827, 33833, 33837, + 33843, 33849, 33854, 33861, 33865, 33871, 33875, 33881, 33886, 33893, + 33900, 33905, 33912, 33917, 33922, 33926, 33932, 33936, 33942, 33948, + 33954, 33958, 33964, 33970, 33974, 33980, 33985, 33989, 33995, 34000, + 34005, 34010, 34015, 34019, 34023, 34028, 34033, 34040, 34046, 34051, + 34058, 34063, 34070, 34075, 34084, 34090, 34096, 34100, 0, 0, 0, 0, 0, 0, + 0, 0, 34104, 34113, 34120, 34127, 34134, 34138, 34143, 34148, 34153, + 34158, 34163, 34168, 34173, 34178, 34183, 34187, 34192, 34197, 34201, + 34205, 34210, 34215, 34220, 34225, 34230, 34235, 34239, 34244, 34249, + 34254, 34259, 34263, 34267, 34271, 34275, 34280, 34285, 34289, 34294, + 34299, 34303, 34309, 34315, 34321, 34326, 34331, 34337, 34342, 34348, + 34353, 34359, 34365, 34370, 34376, 34382, 34387, 34393, 34399, 34405, + 34410, 0, 0, 0, 34415, 34421, 34431, 34437, 34445, 34451, 34456, 34460, + 34464, 34468, 34472, 34476, 34480, 34484, 34488, 0, 0, 0, 34492, 34497, + 34502, 34507, 34514, 34520, 34526, 34532, 34538, 34544, 34550, 34556, + 34562, 34568, 34574, 34581, 34588, 34595, 34602, 34609, 34616, 34623, + 34630, 34637, 34644, 34651, 34658, 34665, 34672, 34679, 34686, 34693, + 34700, 34707, 34714, 34721, 34728, 34735, 34742, 34749, 34756, 34763, + 34770, 34777, 34785, 34793, 34801, 34807, 34813, 34819, 34827, 34836, + 34843, 34850, 34856, 34863, 34870, 34877, 34885, 34892, 0, 0, 0, 0, 0, 0, + 0, 34899, 34906, 34913, 34920, 34927, 34934, 34941, 34948, 34955, 34962, + 34969, 34976, 34983, 34990, 34997, 35004, 35011, 35018, 35025, 35032, + 35039, 35046, 35053, 35060, 35067, 35074, 35081, 35088, 35095, 35102, + 35109, 35116, 35123, 35130, 35137, 35144, 35151, 35158, 35165, 35172, + 35179, 35186, 35194, 0, 0, 35201, 35208, 35216, 35224, 35232, 35240, + 35248, 35256, 35266, 35276, 35286, 0, 0, 0, 0, 0, 0, 0, 0, 35296, 35301, + 35306, 35311, 35316, 35325, 35336, 35345, 35356, 35362, 35375, 35381, + 35388, 35395, 35400, 35407, 35414, 35425, 35434, 35441, 35448, 35457, + 35464, 35473, 35483, 35493, 35500, 35507, 35514, 35524, 35529, 35537, + 35543, 35551, 35560, 35565, 35572, 35578, 35583, 35588, 35593, 35599, + 35606, 0, 0, 0, 0, 0, 35614, 35619, 35625, 35631, 35639, 35645, 35651, + 35657, 35662, 35669, 35674, 35680, 35686, 35694, 35700, 35708, 35713, + 35720, 35726, 35734, 35742, 35748, 35754, 35761, 35768, 35774, 35781, + 35787, 35793, 35798, 35804, 35812, 35820, 35826, 35832, 35838, 35844, + 35852, 35856, 35862, 35868, 35874, 35880, 35886, 35892, 35896, 35901, + 35906, 35913, 35918, 35922, 35928, 35933, 35938, 35942, 35947, 35952, + 35956, 35961, 35966, 35973, 35977, 35982, 35987, 35991, 35996, 36000, + 36005, 36009, 36014, 36019, 36025, 36030, 36035, 36039, 36044, 36050, + 36057, 36062, 36067, 36072, 36077, 36082, 36086, 36092, 36099, 36106, + 36111, 36116, 36120, 36126, 36132, 36137, 36142, 36147, 36153, 36158, + 36164, 36169, 36175, 36181, 36187, 36194, 36201, 36208, 36215, 36222, + 36229, 36234, 36242, 36251, 36260, 36269, 36278, 36287, 36296, 36308, + 36317, 36326, 36335, 36341, 36346, 36353, 36361, 36369, 36376, 36383, + 36390, 36397, 36405, 36414, 36423, 36432, 36441, 36450, 36459, 36468, + 36477, 36486, 36495, 36504, 36513, 36522, 36531, 36539, 36548, 36559, + 36568, 36579, 36592, 36601, 36610, 36620, 36629, 36637, 36646, 36652, + 36657, 36665, 36670, 36678, 36683, 36692, 36698, 36704, 36711, 36716, + 36721, 36729, 36737, 36746, 36755, 36760, 36767, 36777, 36785, 36794, + 36800, 36806, 36811, 36818, 36823, 36832, 36837, 36842, 36847, 36854, + 36860, 36865, 36874, 36882, 36887, 36892, 36899, 36906, 36910, 36914, + 36917, 36920, 36923, 36926, 36929, 36932, 36939, 36942, 36945, 36950, + 36954, 36958, 36962, 36966, 36970, 36980, 36986, 36992, 36998, 37006, + 37014, 37020, 37026, 37033, 37039, 37044, 37050, 37057, 37063, 37070, + 37076, 37084, 37090, 37097, 37103, 37109, 37115, 37121, 37127, 37133, + 37144, 37154, 37160, 37166, 37176, 37182, 37190, 37198, 37206, 37211, + 37217, 37223, 37228, 0, 37236, 37240, 37247, 37253, 37258, 37267, 37275, + 37283, 37290, 37297, 37304, 37311, 37319, 37327, 37338, 37349, 37357, + 37365, 37373, 37381, 37390, 37399, 37407, 37415, 37424, 37433, 37444, + 37455, 37466, 37477, 37486, 37495, 37504, 37513, 37524, 37535, 37543, + 37551, 37559, 37567, 37575, 37583, 37591, 37599, 37607, 37615, 37623, + 37631, 37640, 37649, 37658, 37667, 37678, 37689, 37697, 37705, 37713, + 37721, 37730, 37739, 37747, 37755, 37767, 37779, 37788, 37797, 37806, + 37815, 37823, 37831, 37839, 37847, 37855, 37863, 37871, 37879, 37887, + 37895, 37904, 37913, 37922, 37931, 37941, 37951, 37961, 37971, 37981, + 37991, 38001, 38011, 38019, 38027, 38035, 38043, 38051, 38059, 38067, + 38075, 38087, 38099, 38108, 38117, 38125, 38133, 38141, 38149, 38160, + 38171, 38182, 38193, 38205, 38217, 38225, 38233, 38241, 38249, 38258, + 38267, 38276, 38285, 38293, 38301, 38309, 38317, 38325, 38333, 38343, + 38353, 38363, 38373, 38381, 38389, 38397, 38405, 38413, 38421, 38429, + 38437, 38445, 38453, 38461, 38469, 38477, 38485, 38493, 38501, 38509, + 38517, 38525, 38533, 38541, 38549, 38557, 38565, 38574, 38583, 38592, + 38600, 38609, 38618, 38627, 38636, 38646, 38655, 38662, 38667, 38674, + 38681, 38689, 38697, 38707, 38717, 38727, 38737, 38748, 38759, 38769, + 38779, 38789, 38799, 38809, 38819, 38829, 38839, 38850, 38861, 38871, + 38881, 38891, 38901, 38909, 38917, 38926, 38935, 38943, 38951, 38962, + 38973, 38984, 38995, 39007, 39019, 39030, 39041, 39052, 39063, 39072, + 39081, 39089, 39097, 39104, 39111, 39119, 39127, 39137, 39147, 39157, + 39167, 39178, 39189, 39199, 39209, 39219, 39229, 39239, 39249, 39259, + 39269, 39280, 39291, 39301, 39311, 39321, 39331, 39338, 39345, 39353, + 39361, 39371, 39381, 39391, 39401, 39412, 39423, 39433, 39443, 39453, + 39463, 39471, 39479, 39487, 39495, 39504, 39513, 39521, 39529, 39536, + 39543, 39550, 39557, 39565, 39573, 39581, 39589, 39600, 39611, 39622, + 39633, 39644, 39655, 39663, 39671, 39682, 39693, 39704, 39715, 39726, + 39737, 39745, 39753, 39764, 39775, 39786, 0, 0, 39797, 39805, 39813, + 39824, 39835, 39846, 0, 0, 39857, 39865, 39873, 39884, 39895, 39906, + 39917, 39928, 39939, 39947, 39955, 39966, 39977, 39988, 39999, 40010, + 40021, 40029, 40037, 40048, 40059, 40070, 40081, 40092, 40103, 40111, + 40119, 40130, 40141, 40152, 40163, 40174, 40185, 40193, 40201, 40212, + 40223, 40234, 0, 0, 40245, 40253, 40261, 40272, 40283, 40294, 0, 0, + 40305, 40313, 40321, 40332, 40343, 40354, 40365, 40376, 0, 40387, 0, + 40395, 0, 40406, 0, 40417, 40428, 40436, 40444, 40455, 40466, 40477, + 40488, 40499, 40510, 40518, 40526, 40537, 40548, 40559, 40570, 40581, + 40592, 40600, 40608, 40616, 40624, 40632, 40640, 40648, 40656, 40664, + 40672, 40680, 40688, 40696, 0, 0, 40704, 40715, 40726, 40740, 40754, + 40768, 40782, 40796, 40810, 40821, 40832, 40846, 40860, 40874, 40888, + 40902, 40916, 40927, 40938, 40952, 40966, 40980, 40994, 41008, 41022, + 41033, 41044, 41058, 41072, 41086, 41100, 41114, 41128, 41139, 41150, + 41164, 41178, 41192, 41206, 41220, 41234, 41245, 41256, 41270, 41284, + 41298, 41312, 41326, 41340, 41348, 41356, 41367, 41375, 0, 41386, 41394, + 41405, 41413, 41421, 41429, 41437, 41445, 41448, 41451, 41454, 41457, + 41463, 41474, 41482, 0, 41493, 41501, 41512, 41520, 41528, 41536, 41544, + 41552, 41558, 41564, 41570, 41578, 41586, 41597, 0, 0, 41608, 41616, + 41627, 41635, 41643, 41651, 0, 41659, 41665, 41671, 41677, 41685, 41693, + 41704, 41715, 41723, 41731, 41739, 41750, 41758, 41766, 41774, 41782, + 41790, 41796, 41802, 0, 0, 41805, 41816, 41824, 0, 41835, 41843, 41854, + 41862, 41870, 41878, 41886, 41894, 41897, 0, 41900, 41904, 41908, 41912, + 41916, 41920, 41924, 41928, 41932, 41936, 41940, 41944, 41950, 41956, + 41962, 41965, 41968, 41970, 41974, 41978, 41982, 41986, 41989, 41993, + 41997, 42003, 42009, 42016, 42023, 42028, 42033, 42039, 42045, 42047, + 42050, 42052, 42056, 42060, 42064, 42068, 42072, 42076, 42080, 42084, + 42088, 42094, 42098, 42102, 42108, 42113, 42120, 42122, 42125, 42129, + 42133, 42138, 42144, 42146, 42155, 42164, 42167, 42171, 42173, 42175, + 42177, 42181, 42187, 42189, 42193, 42197, 42204, 42211, 42215, 42220, + 42225, 42230, 42235, 42239, 42243, 42246, 42250, 42254, 42261, 42266, + 42270, 42274, 42279, 42283, 42287, 42292, 42297, 42301, 42305, 42309, + 42311, 42316, 42321, 42325, 42329, 42333, 42337, 0, 42341, 42345, 42349, + 42355, 42361, 42367, 42373, 42380, 42387, 42392, 42397, 42401, 0, 0, + 42407, 42410, 42413, 42416, 42419, 42422, 42425, 42429, 42433, 42438, + 42443, 42448, 42455, 42459, 42462, 42465, 42468, 42471, 42474, 42477, + 42480, 42483, 42486, 42490, 42494, 42499, 42504, 0, 42509, 42515, 42521, + 42527, 42534, 42541, 42548, 42555, 42561, 42568, 42575, 42582, 42589, 0, + 0, 0, 42596, 42599, 42602, 42605, 42610, 42613, 42616, 42619, 42622, + 42625, 42628, 42633, 42636, 42639, 42642, 42645, 42648, 42653, 42656, + 42659, 42662, 42665, 42668, 42673, 42676, 42679, 42684, 42689, 42693, + 42696, 42699, 42702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 42705, 42710, 42715, 42722, 42730, 42735, 42740, 42744, 42748, 42753, + 42760, 42767, 42772, 42778, 42783, 42788, 42793, 42800, 42805, 42810, + 42815, 42824, 42831, 42838, 42842, 42847, 42853, 42858, 42865, 42873, + 42881, 42885, 42889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42893, + 42897, 42904, 42909, 42913, 42918, 42922, 42926, 42930, 42932, 42936, + 42940, 42944, 42949, 42954, 42958, 42966, 42969, 42973, 42976, 42979, + 42985, 42990, 42993, 42999, 43003, 43008, 43013, 43016, 43020, 43024, + 43028, 43030, 43033, 43036, 43040, 43042, 43047, 43050, 43053, 43058, + 43063, 43069, 43072, 43075, 43079, 43084, 43087, 43090, 43093, 43097, + 43101, 43105, 43108, 43110, 43113, 43116, 43119, 43123, 43128, 43131, + 43136, 43141, 43146, 43151, 43157, 43162, 43166, 43171, 43176, 43182, + 43188, 43193, 43198, 43204, 43208, 43211, 43214, 43216, 43220, 43226, + 43233, 43240, 43247, 43254, 43261, 43268, 43275, 43282, 43290, 43297, + 43305, 43312, 43319, 43327, 43335, 43340, 43345, 43350, 43355, 43360, + 43365, 43370, 43375, 43380, 43385, 43391, 43397, 43403, 43409, 43416, + 43424, 43430, 43436, 43442, 43448, 43454, 43460, 43466, 43472, 43478, + 43484, 43491, 43498, 43505, 43512, 43520, 43529, 43536, 43547, 43554, + 43561, 43570, 43577, 43586, 43595, 43602, 43610, 43618, 43621, 0, 0, 0, + 0, 43624, 43626, 43629, 43631, 43634, 43637, 43640, 43644, 43648, 43653, + 43658, 43662, 43666, 43670, 43674, 43679, 43685, 43690, 43696, 43701, + 43706, 43711, 43717, 43722, 43728, 43734, 43738, 43742, 43747, 43752, + 43757, 43762, 43767, 43775, 43783, 43791, 43799, 43806, 43814, 43821, + 43828, 43835, 43845, 43852, 43859, 43866, 43873, 43881, 43889, 43896, + 43903, 43911, 43919, 43924, 43932, 43937, 43942, 43948, 43953, 43959, + 43966, 43973, 43978, 43984, 43989, 43992, 43996, 43999, 44003, 44007, + 44011, 44016, 44021, 44027, 44033, 44037, 44041, 44045, 44049, 44055, + 44061, 44065, 44070, 44074, 44079, 44083, 44087, 44090, 44094, 44097, + 44101, 44108, 44116, 44128, 44139, 44144, 44153, 44160, 44167, 44175, + 44179, 44185, 44193, 44197, 44202, 44207, 44213, 44219, 44225, 44232, + 44236, 44240, 44245, 44248, 44250, 44254, 44258, 44266, 44270, 44272, + 44274, 44278, 44286, 44291, 44297, 44307, 44314, 44319, 44323, 44327, + 44331, 44334, 44337, 44340, 44344, 44348, 44352, 44356, 44360, 44363, + 44367, 44371, 44374, 44376, 44379, 44381, 44385, 44389, 44391, 44397, + 44400, 44405, 44409, 44413, 44415, 44417, 44419, 44422, 44426, 44430, + 44434, 44438, 44442, 44448, 44454, 44456, 44458, 44460, 44462, 44465, + 44467, 44471, 44473, 44477, 44481, 44487, 44491, 44495, 44499, 44503, + 44507, 44513, 44517, 44527, 44537, 44541, 44547, 44554, 44558, 44562, + 44565, 44570, 44574, 44580, 44584, 44596, 44605, 44609, 44613, 44619, + 44623, 44626, 44628, 44631, 44635, 44639, 44645, 44649, 44653, 44657, + 44660, 44665, 44670, 44676, 44682, 44687, 44692, 44700, 44708, 44712, + 44716, 44718, 44723, 44727, 44731, 44739, 44747, 44754, 44761, 44770, + 44779, 44785, 44791, 44799, 44807, 44809, 44811, 44817, 44823, 44830, + 44837, 44843, 44849, 44853, 44857, 44864, 44871, 44878, 44885, 44895, + 44905, 44913, 44921, 44923, 44927, 44931, 44936, 44941, 44949, 44957, + 44960, 44963, 44966, 44969, 44972, 44977, 44981, 44986, 44991, 44994, + 44997, 45000, 45003, 45006, 45010, 45013, 45016, 45019, 45022, 45024, + 45026, 45028, 45030, 45038, 45046, 45052, 45056, 45062, 45072, 45078, + 45084, 45090, 45098, 45107, 45119, 45123, 45127, 45129, 45135, 45137, + 45139, 45141, 45143, 45149, 45152, 45158, 45164, 45168, 45172, 45176, + 45179, 45183, 45187, 45189, 45198, 45207, 45212, 45217, 45223, 45229, + 45235, 45238, 45241, 45244, 45247, 45249, 45254, 45259, 45264, 45270, + 45276, 45284, 45292, 45298, 45304, 45310, 45316, 45326, 45336, 45346, + 45356, 45366, 45376, 45385, 45394, 45403, 45412, 45420, 45432, 45443, + 45459, 45462, 45468, 45474, 45480, 45488, 45503, 45519, 45525, 45531, + 45538, 45544, 45553, 45560, 45574, 45589, 45594, 45600, 45608, 45611, + 45614, 45616, 45619, 45622, 45624, 45626, 45630, 45633, 45636, 45639, + 45642, 45647, 45652, 45657, 45662, 45667, 45670, 45672, 45674, 45676, + 45680, 45684, 45688, 45694, 45698, 45700, 45702, 45707, 45712, 45717, + 45722, 45727, 45732, 45734, 45736, 45746, 45750, 45757, 45766, 45768, + 45773, 45778, 45785, 45789, 45791, 45795, 45797, 45801, 45805, 45809, + 45811, 45813, 45815, 45822, 45831, 45840, 45849, 45858, 45867, 45876, + 45885, 45894, 45902, 45910, 45919, 45928, 45937, 45946, 45954, 45962, + 45971, 45980, 45989, 45999, 46008, 46018, 46027, 46037, 46046, 46056, + 46066, 46075, 46085, 46094, 46104, 46113, 46123, 46132, 46141, 46150, + 46159, 46168, 46178, 46187, 46196, 46205, 46215, 46224, 46233, 46242, + 46251, 46261, 46271, 46280, 46289, 46297, 46306, 46313, 46322, 46331, + 46342, 46351, 46361, 46371, 46378, 46385, 46392, 46401, 46410, 46419, + 46428, 46435, 46440, 46449, 46455, 46458, 46465, 46468, 46473, 46478, + 46481, 46484, 46492, 46495, 46500, 46503, 46511, 46516, 46524, 46527, + 46530, 46533, 46538, 46543, 46546, 46549, 46557, 46560, 46567, 46574, + 46578, 46582, 46587, 46592, 46597, 46602, 46607, 46612, 46617, 46622, + 46629, 46635, 46642, 46649, 46655, 46662, 46669, 46677, 46684, 46690, + 46697, 46705, 46712, 46716, 46722, 46734, 46746, 46750, 46754, 46758, + 46762, 46772, 46776, 46781, 46786, 46792, 46798, 46804, 46810, 46820, + 46830, 46838, 46849, 46860, 46868, 46879, 46890, 46898, 46909, 46920, + 46928, 46936, 46946, 46956, 46959, 46962, 46965, 46970, 46974, 46980, + 46987, 46994, 47002, 47009, 47013, 47017, 47021, 47025, 47027, 47031, + 47035, 47040, 47045, 47052, 47059, 47062, 47069, 47071, 47073, 47077, + 47081, 47086, 47092, 47098, 47104, 47110, 47119, 47128, 47137, 47141, + 47143, 47147, 47154, 47161, 47168, 47175, 47182, 47185, 47190, 47196, + 47199, 47204, 47209, 47214, 47219, 47223, 47230, 47237, 47244, 47251, + 47255, 47259, 47263, 47267, 47273, 47279, 47284, 47290, 47296, 47302, + 47308, 47316, 47323, 47330, 47337, 47344, 47350, 47356, 47365, 47369, + 47376, 47380, 47384, 47390, 47396, 47402, 47408, 47412, 47416, 47419, + 47423, 47427, 47434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 47441, 47444, 47448, 47452, 47458, 47464, 47470, + 47478, 47485, 47489, 47497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 47502, 47505, 47508, 47511, 47514, 47517, 47520, 47523, + 47526, 47529, 47533, 47537, 47541, 47545, 47549, 47553, 47557, 47561, + 47565, 47569, 47573, 47576, 47579, 47582, 47585, 47588, 47591, 47594, + 47597, 47600, 47604, 47608, 47612, 47616, 47620, 47624, 47628, 47632, + 47636, 47640, 47644, 47650, 47656, 47662, 47669, 47676, 47683, 47690, + 47697, 47704, 47711, 47718, 47725, 47732, 47739, 47746, 47753, 47760, + 47767, 47774, 47781, 47786, 47792, 47798, 47804, 47809, 47815, 47821, + 47827, 47832, 47838, 47844, 47849, 47855, 47861, 47866, 47872, 47878, + 47883, 47889, 47895, 47900, 47906, 47912, 47918, 47924, 47930, 47935, + 47941, 47947, 47953, 47958, 47964, 47970, 47976, 47981, 47987, 47993, + 47998, 48004, 48010, 48015, 48021, 48027, 48032, 48038, 48044, 48049, + 48055, 48061, 48067, 48073, 48079, 48084, 48090, 48096, 48102, 48107, + 48113, 48119, 48125, 48130, 48136, 48142, 48147, 48153, 48159, 48164, + 48170, 48176, 48181, 48187, 48193, 48198, 48204, 48210, 48216, 48222, + 48228, 48232, 48238, 48244, 48250, 48256, 48262, 48268, 48274, 48280, + 48286, 48292, 48296, 48300, 48304, 48308, 48312, 48316, 48320, 48324, + 48328, 48333, 48339, 48344, 48349, 48354, 48359, 48368, 48377, 48386, + 48395, 48404, 48413, 48422, 48431, 48438, 48446, 48454, 48461, 48468, + 48476, 48484, 48491, 48498, 48506, 48514, 48521, 48528, 48536, 48544, + 48551, 48558, 48566, 48575, 48584, 48592, 48601, 48610, 48617, 48624, + 48632, 48641, 48650, 48658, 48667, 48676, 48683, 48690, 48699, 48708, + 48717, 48726, 48735, 48744, 48751, 48758, 48767, 48776, 48785, 48794, + 48803, 48812, 48819, 48826, 48835, 48844, 48853, 48863, 48873, 48882, + 48892, 48902, 48912, 48922, 48932, 48942, 48951, 48960, 48967, 48975, + 48983, 48991, 48999, 49004, 49009, 49018, 49026, 49033, 49042, 49050, + 49057, 49066, 49074, 49081, 49090, 49098, 49105, 49114, 49122, 49129, + 49138, 49146, 49153, 49163, 49172, 49179, 49189, 49198, 49205, 49215, + 49224, 49231, 49240, 49249, 49258, 49267, 49278, 49289, 49296, 49301, + 49306, 49311, 49316, 49321, 49326, 49331, 49336, 49344, 49352, 49360, + 49368, 49372, 49378, 49384, 49390, 49394, 49401, 49407, 49414, 49418, + 49425, 49431, 49438, 49442, 49448, 49454, 49460, 49464, 49467, 49471, + 49475, 49481, 49487, 49492, 49497, 49502, 49513, 49521, 49532, 49543, + 49548, 49556, 49567, 49570, 49573, 49580, 49588, 49594, 49599, 49607, + 49616, 49625, 49633, 49637, 49641, 49644, 49647, 49651, 49655, 49658, + 49661, 49666, 49671, 49677, 49683, 49688, 49693, 49699, 49705, 49710, + 49715, 49720, 49725, 49731, 49737, 49742, 49747, 49753, 49759, 49764, + 49769, 49772, 49775, 49784, 49786, 49788, 49791, 49795, 49801, 49803, + 49806, 49813, 49820, 49827, 49834, 49843, 49856, 49861, 49866, 49870, + 49875, 49882, 49889, 49897, 49905, 49913, 49921, 49925, 49929, 49934, + 49939, 49944, 49949, 49952, 49958, 49964, 49973, 49982, 49990, 49998, + 50007, 50016, 50020, 50027, 50034, 50041, 50048, 50056, 50064, 50072, + 50080, 50084, 50088, 50092, 50097, 50102, 50108, 50114, 50118, 50124, + 50126, 50128, 50130, 50132, 50135, 50138, 50140, 50142, 50144, 50148, + 50152, 50154, 50156, 50159, 50162, 50166, 50172, 50178, 50180, 50187, + 50191, 50196, 50201, 50203, 50213, 50219, 50225, 50231, 50237, 50243, + 50249, 50254, 50257, 50260, 50263, 50265, 50267, 50271, 50275, 50280, + 50285, 50290, 50293, 50297, 50302, 50305, 50309, 50314, 50319, 50324, + 50329, 50334, 50339, 50344, 50349, 50354, 50359, 50364, 50369, 50375, + 50381, 50387, 50389, 50392, 50394, 50397, 50399, 50401, 50403, 50405, + 50407, 50409, 50411, 50413, 50415, 50417, 50419, 50421, 50423, 50425, + 50427, 50429, 50431, 50436, 50441, 50446, 50451, 50456, 50461, 50466, + 50471, 50476, 50481, 50486, 50491, 50496, 50501, 50506, 50511, 50516, + 50521, 50526, 50531, 50535, 50539, 50543, 50549, 50555, 50560, 50565, + 50570, 50576, 50582, 50587, 50595, 50603, 50611, 50619, 50627, 50635, + 50643, 50651, 50657, 50662, 50667, 50672, 50675, 50679, 50683, 50687, + 50691, 50695, 50699, 50706, 50713, 50721, 50729, 50734, 50739, 50746, + 50753, 50760, 50767, 50770, 50773, 50778, 50780, 50784, 50789, 50791, + 50793, 50795, 50797, 50802, 50805, 50807, 50812, 50819, 50826, 50829, + 50833, 50838, 50843, 50851, 50857, 50863, 50875, 50882, 50890, 50895, + 50900, 50906, 50909, 50912, 50917, 50919, 50923, 50925, 50927, 50929, + 50931, 50933, 50935, 50940, 50942, 50944, 50946, 50948, 50952, 50954, + 50957, 50962, 50967, 50972, 50977, 50983, 50989, 50991, 50994, 51001, + 51007, 51013, 51020, 51024, 51028, 51030, 51032, 51036, 51042, 51047, + 51049, 51053, 51062, 51070, 51078, 51084, 51090, 51095, 51101, 51106, + 51109, 51123, 51126, 51131, 51136, 51142, 51153, 51155, 51161, 51167, + 51171, 51178, 51182, 51184, 51186, 51190, 51196, 51201, 51207, 51209, + 51215, 51217, 51223, 51225, 51227, 51232, 51234, 51238, 51243, 51245, + 51250, 51255, 51259, 51266, 51276, 51281, 51286, 51289, 51294, 51297, + 51302, 51307, 51311, 51313, 51315, 51319, 51323, 51327, 51331, 51335, + 51337, 51341, 51344, 51347, 51350, 51354, 51358, 51363, 51367, 51372, + 51377, 51381, 51387, 51394, 51397, 51403, 51408, 51412, 51417, 51423, + 51429, 51436, 51442, 51449, 51456, 51458, 51465, 51469, 51476, 51482, + 51487, 51493, 51497, 51502, 51505, 51511, 51517, 51524, 51532, 51539, + 51548, 51558, 51565, 51571, 51575, 51583, 51588, 51597, 51600, 51603, + 51612, 51623, 51630, 51632, 51638, 51643, 51645, 51648, 51652, 51660, + 51669, 51672, 51677, 51683, 51690, 51697, 51704, 51711, 51717, 51723, + 51729, 51737, 51742, 51745, 51749, 51752, 51763, 51773, 51783, 51792, + 51803, 51813, 51822, 51828, 51836, 51840, 51848, 51852, 51860, 51867, + 51874, 51883, 51892, 51902, 51912, 51922, 51932, 51941, 51950, 51960, + 51970, 51979, 51988, 51995, 52002, 52009, 52016, 52023, 52030, 52037, + 52044, 52051, 52059, 52065, 52071, 52077, 52083, 52089, 52095, 52101, + 52107, 52113, 52120, 52128, 52136, 52144, 52152, 52160, 52168, 52176, + 52184, 52192, 52201, 52206, 52209, 52213, 52217, 52223, 52226, 52231, + 52237, 52242, 52246, 52251, 52257, 52264, 52267, 52274, 52281, 52285, + 52294, 52303, 52308, 52314, 52319, 52324, 52331, 52338, 52345, 52352, + 52360, 52364, 52372, 52377, 52381, 52388, 52392, 52398, 52406, 52411, + 52418, 52422, 52427, 52431, 52436, 52440, 52445, 52450, 52459, 52461, + 52465, 52469, 52476, 52483, 52489, 52497, 52503, 52510, 52515, 52518, + 52523, 52528, 52533, 52541, 52545, 52552, 52559, 52566, 52571, 52576, + 52582, 52587, 52592, 52598, 52603, 52606, 52610, 52614, 52621, 52631, + 52636, 52645, 52654, 52660, 52666, 52671, 52676, 52681, 52686, 52692, + 52698, 52706, 52714, 52720, 52726, 52731, 52736, 52743, 52750, 52756, + 52759, 52762, 52766, 52770, 52774, 52779, 52785, 52791, 52798, 52805, + 52810, 52814, 52818, 52822, 52826, 52830, 52834, 52838, 52842, 52846, + 52850, 52854, 52858, 52862, 52866, 52870, 52874, 52878, 52882, 52886, + 52890, 52894, 52898, 52902, 52906, 52910, 52914, 52918, 52922, 52926, + 52930, 52934, 52938, 52942, 52946, 52950, 52954, 52958, 52962, 52966, + 52970, 52974, 52978, 52982, 52986, 52990, 52994, 52998, 53002, 53006, + 53010, 53014, 53018, 53022, 53026, 53030, 53034, 53038, 53042, 53046, + 53050, 53054, 53058, 53062, 53066, 53070, 53074, 53078, 53082, 53086, + 53090, 53094, 53098, 53102, 53106, 53110, 53114, 53118, 53122, 53126, + 53130, 53134, 53138, 53142, 53146, 53150, 53154, 53158, 53162, 53166, + 53170, 53174, 53178, 53182, 53186, 53190, 53194, 53198, 53202, 53206, + 53210, 53214, 53218, 53222, 53226, 53230, 53234, 53238, 53242, 53246, + 53250, 53254, 53258, 53262, 53266, 53270, 53274, 53278, 53282, 53286, + 53290, 53294, 53298, 53302, 53306, 53310, 53314, 53318, 53322, 53326, + 53330, 53334, 53338, 53342, 53346, 53350, 53354, 53358, 53362, 53366, + 53370, 53374, 53378, 53382, 53386, 53390, 53394, 53398, 53402, 53406, + 53410, 53414, 53418, 53422, 53426, 53430, 53434, 53438, 53442, 53446, + 53450, 53454, 53458, 53462, 53466, 53470, 53474, 53478, 53482, 53486, + 53490, 53494, 53498, 53502, 53506, 53510, 53514, 53518, 53522, 53526, + 53530, 53534, 53538, 53542, 53546, 53550, 53554, 53558, 53562, 53566, + 53570, 53574, 53578, 53582, 53586, 53590, 53594, 53598, 53602, 53606, + 53610, 53614, 53618, 53622, 53626, 53630, 53634, 53638, 53642, 53646, + 53650, 53654, 53658, 53662, 53666, 53670, 53674, 53678, 53682, 53686, + 53690, 53694, 53698, 53702, 53706, 53710, 53714, 53718, 53722, 53726, + 53730, 53734, 53738, 53742, 53746, 53750, 53754, 53758, 53762, 53766, + 53770, 53774, 53778, 53782, 53786, 53790, 53794, 53798, 53802, 53806, + 53810, 53814, 53818, 53822, 53826, 53830, 53834, 53841, 53849, 53855, + 53861, 53868, 53875, 53881, 53887, 53894, 53901, 53906, 53911, 53916, + 53921, 53927, 53933, 53941, 53948, 53953, 53958, 53966, 53975, 53982, + 53992, 54003, 54006, 54009, 54013, 54017, 54023, 54029, 54039, 54049, + 54058, 54067, 54073, 54079, 54086, 54093, 54102, 54112, 54123, 54133, + 54143, 54153, 54164, 54175, 54185, 54196, 54206, 54216, 54225, 54235, + 54245, 54256, 54267, 54274, 54281, 54288, 54295, 54305, 54315, 54322, + 54329, 54336, 54343, 54350, 54357, 54364, 54369, 54374, 54380, 54388, + 54398, 54406, 54414, 54422, 54430, 54438, 54446, 54454, 54462, 54470, + 54478, 54487, 54496, 54504, 54512, 54521, 54530, 54539, 54548, 54558, + 54568, 54577, 54586, 54596, 54606, 54620, 54637, 54651, 54668, 54682, + 54696, 54710, 54724, 54734, 54745, 54755, 54766, 54783, 54800, 54808, + 54814, 54821, 54828, 54835, 54842, 54847, 54853, 54858, 54863, 54869, + 54874, 54879, 54884, 54889, 54894, 54901, 54907, 54915, 54920, 54925, + 54929, 54933, 54941, 54949, 54957, 54965, 54972, 54979, 54992, 55005, + 55018, 55031, 55039, 55047, 55053, 55059, 55066, 55073, 55080, 55087, + 55091, 55096, 55104, 55112, 55120, 55127, 55131, 55139, 55147, 55150, + 55154, 55159, 55166, 55174, 55182, 55202, 55222, 55242, 55262, 55282, + 55302, 55322, 55342, 55348, 55355, 55364, 55372, 55380, 55386, 55389, + 55392, 55397, 55400, 55420, 55427, 55433, 55439, 55443, 55446, 55449, + 55452, 55463, 55476, 55483, 55490, 55493, 55497, 55500, 55505, 55510, + 55515, 55521, 55530, 55537, 55544, 55552, 55559, 55566, 55569, 55575, + 55581, 55584, 55587, 55592, 55597, 55603, 55609, 55613, 55618, 55625, + 55629, 55635, 55639, 55643, 55651, 55663, 55671, 55675, 55677, 55686, + 55695, 55701, 55704, 55710, 55716, 55721, 55726, 55731, 55736, 55741, + 55746, 55748, 55754, 55759, 55767, 55771, 55777, 55780, 55784, 55791, + 55798, 55800, 55802, 55808, 55814, 55820, 55829, 55838, 55845, 55852, + 55858, 55865, 55870, 55875, 55880, 55886, 55892, 55897, 55904, 55908, + 55912, 55925, 55938, 55950, 55959, 55965, 55972, 55977, 55982, 55987, + 55992, 55997, 55999, 56006, 56014, 56022, 56030, 56037, 56045, 56051, + 56056, 56062, 56068, 56074, 56081, 56087, 56095, 56103, 56111, 56119, + 56127, 56133, 56139, 56148, 56152, 56161, 56170, 56179, 56187, 56191, + 56197, 56204, 56211, 56215, 56221, 56229, 56235, 56240, 56246, 56251, + 56256, 56263, 56270, 56275, 56280, 56288, 56296, 56306, 56316, 56323, + 56330, 56334, 56338, 56350, 56356, 56363, 56368, 56373, 56380, 56387, + 56393, 56399, 56409, 56416, 56424, 56432, 56441, 56448, 56454, 56461, + 56467, 56475, 56483, 56491, 56499, 56505, 56510, 56520, 56531, 56538, + 56547, 56553, 56558, 56563, 56572, 56579, 56585, 56591, 56599, 56604, + 56611, 56618, 56631, 56639, 56646, 56653, 56660, 56667, 56675, 56683, + 56695, 56707, 56718, 56729, 56742, 56755, 56761, 56767, 56776, 56785, + 56792, 56799, 56808, 56817, 56826, 56835, 56843, 56851, 56861, 56871, + 56885, 56899, 56907, 56915, 56927, 56939, 56947, 56955, 56965, 56975, + 56981, 56987, 56996, 57005, 57010, 57015, 57023, 57029, 57035, 57043, + 57051, 57064, 57077, 57081, 57085, 57093, 57101, 57108, 57116, 57124, + 57133, 57142, 57148, 57154, 57161, 57168, 57175, 57182, 57191, 57200, + 57203, 57206, 57211, 57216, 57222, 57228, 57235, 57242, 57252, 57262, + 57269, 57276, 57284, 57292, 57300, 57308, 57316, 57324, 57331, 57338, + 57342, 57346, 57354, 57362, 57367, 57372, 57377, 57382, 57388, 57402, + 57409, 57416, 57420, 57422, 57424, 57429, 57434, 57439, 57444, 57452, + 57459, 57466, 57474, 57486, 57494, 57502, 57513, 57517, 57521, 57527, + 57535, 57548, 57555, 57562, 57569, 57575, 57582, 57591, 57600, 57606, + 57612, 57618, 57628, 57638, 57646, 57655, 57660, 57663, 57668, 57673, + 57678, 57684, 57690, 57694, 57697, 57701, 57705, 57710, 57715, 57721, + 57727, 57731, 57735, 57742, 57749, 57756, 57763, 57770, 57777, 57786, + 57795, 57802, 57809, 57817, 57825, 57829, 57834, 57839, 57845, 57851, + 57854, 57857, 57860, 57863, 57868, 57873, 57878, 57883, 57888, 57893, + 57897, 57901, 57905, 57910, 57915, 57919, 57923, 57929, 57933, 57939, + 57944, 57951, 57959, 57966, 57974, 57981, 57989, 57998, 58005, 58015, + 58026, 58032, 58041, 58047, 58056, 58065, 58071, 58077, 58081, 58085, + 58094, 58103, 58110, 58117, 58126, 58135, 58142, 58148, 58155, 58160, + 58164, 58168, 58173, 58178, 58183, 58191, 58199, 58202, 58206, 58215, + 58225, 58234, 58244, 58256, 58270, 58274, 58279, 58283, 58288, 58293, + 58298, 58304, 58310, 58317, 58324, 58330, 58337, 58343, 58350, 58359, + 58368, 58374, 58381, 58387, 0, 0, 58394, 58402, 58410, 58419, 58428, + 58437, 58447, 58456, 58466, 58472, 58477, 58486, 58498, 58507, 58519, + 58526, 58534, 58541, 58549, 58554, 58560, 58565, 58571, 58579, 58588, + 58596, 58605, 58609, 58613, 58617, 58621, 58631, 0, 58634, 58641, 58650, + 58660, 58669, 58679, 58685, 58692, 58698, 58705, 58716, 58727, 58738, + 58749, 58759, 58769, 58779, 58789, 58797, 58805, 58813, 58821, 58829, + 58837, 58845, 58853, 58859, 58865, 58871, 58877, 58883, 58889, 58895, + 58901, 58913, 58923, 58928, 58935, 58940, 58947, 58950, 58954, 58958, + 58963, 58967, 58972, 58975, 58984, 58993, 59002, 59011, 59016, 59022, + 59028, 59036, 59046, 59053, 59062, 59067, 59070, 59073, 59078, 59083, + 59088, 59093, 59095, 59097, 59099, 59101, 59103, 59105, 59110, 59117, + 59124, 59126, 59128, 59130, 59132, 59134, 59136, 59138, 59140, 59145, + 59150, 59157, 59164, 59173, 59183, 59192, 59202, 59207, 59212, 59214, + 59221, 59228, 59235, 59242, 59249, 59256, 59263, 59266, 59269, 59272, + 59275, 59280, 59285, 59290, 59295, 59300, 59305, 59310, 59315, 59320, + 59325, 59330, 59335, 59341, 59345, 59350, 59355, 59360, 59365, 59370, + 59375, 59380, 59385, 59390, 59395, 59400, 59405, 59410, 59415, 59420, + 59425, 59430, 59435, 59440, 59445, 59450, 59455, 59461, 59466, 59472, + 59481, 59486, 59494, 59501, 59510, 59515, 59520, 59525, 59531, 0, 59538, + 59543, 59548, 59553, 59558, 59563, 59568, 59573, 59578, 59583, 59588, + 59594, 59598, 59603, 59608, 59613, 59618, 59623, 59628, 59633, 59638, + 59643, 59648, 59653, 59658, 59663, 59668, 59673, 59678, 59683, 59688, + 59693, 59698, 59703, 59708, 59714, 59719, 59725, 59734, 59739, 59747, + 59754, 59763, 59768, 59773, 59778, 59784, 0, 59791, 59799, 59807, 59816, + 59823, 59831, 59837, 59846, 59854, 59862, 59870, 59878, 59886, 59894, + 59899, 59906, 59911, 59917, 59925, 59932, 59939, 59947, 59953, 59959, + 59966, 59974, 59983, 59993, 59999, 60006, 60011, 60021, 60031, 60036, + 60041, 60046, 60051, 60056, 60061, 60066, 60071, 60076, 60081, 60086, + 60091, 60096, 60101, 60106, 60111, 60116, 60121, 60126, 60131, 60136, + 60141, 60146, 60151, 60156, 60161, 60166, 60171, 60176, 60181, 60185, + 60189, 60194, 60199, 60204, 60209, 60214, 60219, 60224, 60229, 60234, + 60239, 60244, 60249, 60254, 60259, 60264, 60269, 60274, 60279, 60286, + 60293, 60300, 60307, 60314, 60321, 60328, 60335, 60342, 60349, 60356, + 60363, 60370, 60377, 60382, 60387, 60394, 60401, 60408, 60415, 60422, + 60429, 60436, 60443, 60450, 60457, 60464, 60471, 60477, 60483, 60489, + 60495, 60502, 60509, 60516, 60523, 60530, 60537, 60544, 60551, 60558, + 60565, 60573, 60581, 60589, 60597, 60605, 60613, 60621, 60629, 60633, + 60639, 60645, 60649, 60655, 60661, 60667, 60674, 60681, 60688, 60695, + 60700, 60706, 60712, 60719, 0, 0, 0, 0, 0, 60726, 60734, 60743, 60752, + 60760, 60766, 60771, 60776, 60781, 60786, 60791, 60796, 60801, 60806, + 60811, 60816, 60821, 60826, 60831, 60836, 60841, 60846, 60851, 60856, + 60861, 60866, 60871, 60876, 60881, 60886, 60891, 60896, 60901, 60906, + 60911, 60916, 60921, 60926, 60931, 60936, 60941, 60946, 60951, 60956, + 60961, 0, 60966, 0, 0, 0, 0, 0, 60971, 0, 0, 60976, 60980, 60985, 60990, + 60995, 61000, 61009, 61014, 61019, 61024, 61029, 61034, 61039, 61044, + 61049, 61056, 61061, 61066, 61075, 61082, 61087, 61092, 61097, 61104, + 61109, 61116, 61121, 61126, 61133, 61140, 61145, 61150, 61155, 61162, + 61169, 61174, 61179, 61184, 61189, 61194, 61201, 61208, 61213, 61218, + 61223, 61228, 61233, 61238, 61243, 61248, 61253, 61258, 61263, 61270, + 61275, 61280, 0, 0, 0, 0, 0, 0, 0, 61285, 61292, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 61297, 61302, 61306, 61310, 61314, 61318, 61322, 61326, + 61330, 61334, 61338, 61342, 61348, 61352, 61356, 61360, 61364, 61368, + 61372, 61376, 61380, 61384, 61388, 61392, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 61396, 61400, 61404, 61408, 61412, 61416, 61420, 0, 61424, 61428, 61432, + 61436, 61440, 61444, 61448, 0, 61452, 61456, 61460, 61464, 61468, 61472, + 61476, 0, 61480, 61484, 61488, 61492, 61496, 61500, 61504, 0, 61508, + 61512, 61516, 61520, 61524, 61528, 61532, 0, 61536, 61540, 61544, 61548, + 61552, 61556, 61560, 0, 61564, 61568, 61572, 61576, 61580, 61584, 61588, + 0, 61592, 61596, 61600, 61604, 61608, 61612, 61616, 0, 61620, 61625, + 61630, 61635, 61640, 61645, 61650, 61654, 61659, 61664, 61669, 61673, + 61678, 61683, 61688, 61693, 61697, 61702, 61707, 61712, 61717, 61722, + 61727, 61731, 61736, 61741, 61748, 61753, 61758, 61764, 61771, 61778, + 61787, 61794, 61803, 61807, 61811, 61817, 61823, 61829, 61837, 61843, + 61847, 61851, 61855, 61861, 61867, 61871, 61873, 61877, 61883, 61885, + 61889, 61893, 61897, 61903, 61908, 61912, 61916, 61921, 61927, 61932, + 61937, 61942, 61947, 61954, 61961, 61966, 61971, 61976, 61981, 61986, + 61991, 61995, 61999, 62007, 62015, 62021, 62025, 62030, 62033, 62037, + 62044, 62047, 62051, 62055, 62058, 62064, 62070, 62073, 62079, 62083, + 62087, 62093, 62098, 62103, 62105, 62108, 62112, 62118, 62124, 62128, + 62133, 62142, 62145, 62151, 62156, 62160, 62164, 62168, 62171, 62176, + 62182, 62190, 62198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 61976, 61980, 61984, 61989, 61994, 61999, 62003, 62007, 62011, 62016, - 62021, 62025, 62029, 62033, 62037, 62042, 62047, 62052, 62057, 62061, - 62065, 62070, 62075, 62080, 62085, 62089, 0, 62093, 62097, 62101, 62105, - 62109, 62113, 62117, 62122, 62127, 62131, 62136, 62141, 62150, 62154, - 62158, 62162, 62169, 62173, 62178, 62183, 62187, 62191, 62197, 62202, - 62207, 62212, 62217, 62221, 62225, 62229, 62233, 62237, 62242, 62247, - 62251, 62255, 62260, 62265, 62270, 62274, 62278, 62283, 62288, 62294, - 62300, 62304, 62310, 62316, 62320, 62326, 62332, 62337, 62342, 62346, - 62352, 62356, 62360, 62366, 62372, 62377, 62382, 62386, 62390, 62398, - 62404, 62410, 62416, 62421, 62426, 62431, 62437, 62441, 62447, 62451, - 62455, 62461, 62467, 62473, 62479, 62485, 62491, 62497, 62503, 62509, - 62515, 62521, 62527, 62531, 62537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 62543, 62546, 62550, 62554, 62558, 62562, 62565, 62568, 62572, 62576, - 62580, 62584, 62587, 62592, 62596, 62600, 62604, 62609, 62613, 62617, - 62621, 62625, 62631, 62637, 62641, 62645, 62649, 62653, 62657, 62661, - 62665, 62669, 62673, 62677, 62681, 62687, 62691, 62695, 62699, 62703, - 62707, 62711, 62715, 62719, 62723, 62727, 62731, 62735, 62739, 62743, - 62747, 62751, 62757, 62763, 62768, 62773, 62777, 62781, 62785, 62789, - 62793, 62797, 62801, 62805, 62809, 62813, 62817, 62821, 62825, 62829, - 62833, 62837, 62841, 62845, 62849, 62853, 62857, 62861, 62865, 62869, - 62875, 62879, 62883, 62887, 62891, 62895, 62899, 62903, 62907, 62912, - 62919, 62923, 62927, 62931, 62935, 62939, 62943, 62947, 62951, 62955, - 62959, 62963, 62967, 62974, 62978, 62984, 62988, 62992, 62996, 63000, - 63004, 63007, 63011, 63015, 63019, 63023, 63027, 63031, 63035, 63039, - 63043, 63047, 63051, 63055, 63059, 63063, 63067, 63071, 63075, 63079, - 63083, 63087, 63091, 63095, 63099, 63103, 63107, 63111, 63115, 63119, - 63123, 63127, 63131, 63135, 63141, 63145, 63149, 63153, 63157, 63161, - 63165, 63169, 63173, 63177, 63181, 63185, 63189, 63193, 63197, 63201, - 63205, 63209, 63213, 63217, 63221, 63225, 63229, 63233, 63237, 63241, - 63245, 63249, 63257, 63261, 63265, 63269, 63273, 63277, 63283, 63287, - 63291, 63295, 63299, 63303, 63307, 63311, 63315, 63319, 63323, 63327, - 63331, 63335, 63341, 63345, 63349, 63353, 63357, 63361, 63365, 63369, - 63373, 63377, 63381, 63385, 63389, 63393, 63397, 63401, 63405, 63409, - 63413, 63417, 63421, 63425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63429, 63438, 63446, 63457, 63467, - 63475, 63484, 63493, 63503, 63515, 63527, 63539, 0, 0, 0, 0, 63545, - 63548, 63551, 63556, 63559, 63566, 63570, 63574, 63578, 63582, 63586, - 63591, 63596, 63600, 63604, 63609, 63614, 63619, 63624, 63627, 63630, - 63636, 63642, 63647, 63652, 63659, 63666, 63670, 63674, 63678, 63686, - 63692, 63699, 63704, 63709, 63714, 63719, 63724, 63729, 63734, 63739, - 63744, 63749, 63754, 63759, 63764, 63769, 63775, 63780, 63784, 63790, - 63801, 63811, 63826, 63836, 63840, 63850, 63856, 63862, 63868, 63873, - 63876, 63881, 63885, 0, 63891, 63895, 63898, 63902, 63905, 63909, 63912, - 63916, 63919, 63923, 63926, 63929, 63933, 63937, 63941, 63945, 63949, - 63953, 63957, 63961, 63965, 63968, 63972, 63976, 63980, 63984, 63988, - 63992, 63996, 64000, 64004, 64007, 64011, 64015, 64019, 64024, 64028, - 64032, 64036, 64040, 64043, 64047, 64050, 64054, 64058, 64062, 64066, - 64069, 64073, 64076, 64080, 64084, 64088, 64092, 64096, 64100, 64104, - 64108, 64112, 64116, 64120, 64124, 64127, 64131, 64135, 64139, 64143, - 64147, 64150, 64155, 64159, 64164, 64168, 64171, 64175, 64179, 64183, - 64187, 64192, 64196, 64200, 64204, 64208, 64212, 64216, 64220, 0, 0, - 64225, 64233, 64241, 64248, 64255, 64259, 64265, 64270, 64275, 64279, - 64282, 64286, 64289, 64293, 64296, 64300, 64303, 64307, 64310, 64313, - 64317, 64321, 64325, 64329, 64333, 64337, 64341, 64345, 64349, 64352, - 64356, 64360, 64364, 64368, 64372, 64376, 64380, 64384, 64388, 64391, - 64395, 64399, 64403, 64408, 64412, 64416, 64420, 64424, 64427, 64431, - 64434, 64438, 64442, 64446, 64450, 64453, 64457, 64460, 64464, 64468, - 64472, 64476, 64480, 64484, 64488, 64492, 64496, 64500, 64504, 64508, - 64511, 64515, 64519, 64523, 64527, 64531, 64534, 64539, 64543, 64548, - 64552, 64555, 64559, 64563, 64567, 64571, 64576, 64580, 64584, 64588, - 64592, 64596, 64600, 64604, 64609, 64613, 64617, 64621, 64625, 64629, - 64636, 64640, 64646, 0, 0, 0, 0, 0, 64651, 64656, 64661, 64666, 64671, - 64676, 64681, 64686, 64690, 64695, 64700, 64705, 64710, 64715, 64720, - 64725, 64730, 64735, 64739, 64744, 64749, 64754, 64758, 64762, 64766, - 64771, 64776, 64781, 64786, 64791, 64796, 64801, 64806, 64811, 64816, - 64820, 64824, 64829, 64834, 64839, 64844, 64849, 64856, 0, 64861, 64865, - 64869, 64873, 64877, 64881, 64885, 64889, 64893, 64897, 64901, 64905, - 64909, 64913, 64917, 64921, 64925, 64929, 64933, 64937, 64941, 64945, - 64949, 64953, 64957, 64961, 64965, 64969, 64973, 64977, 64981, 64984, - 64988, 64991, 64995, 64999, 65002, 65006, 65010, 65013, 65017, 65021, - 65025, 65029, 65032, 65036, 65040, 65044, 65048, 65052, 65056, 65059, - 65062, 65066, 65070, 65074, 65078, 65082, 65086, 65090, 65094, 65098, - 65102, 65106, 65110, 65114, 65118, 65122, 65126, 65130, 65134, 65138, - 65142, 65146, 65150, 65154, 65158, 65162, 65166, 65170, 65174, 65178, - 65182, 65186, 65190, 65194, 65198, 65202, 65206, 65210, 65214, 65218, - 65222, 65226, 0, 65230, 65236, 65242, 65247, 65252, 65257, 65263, 65269, - 65274, 65280, 65286, 65292, 65298, 65304, 65310, 65316, 65322, 65327, - 65332, 65337, 65342, 65347, 65352, 65357, 65362, 65367, 65372, 65377, - 65382, 65387, 65392, 65397, 65402, 65407, 65412, 65417, 65422, 65428, - 65434, 65440, 65446, 65451, 65456, 0, 0, 0, 0, 0, 65461, 65466, 65471, - 65476, 65481, 65486, 65491, 65496, 65501, 65506, 65511, 65516, 65521, - 65526, 65531, 65536, 65541, 65546, 65551, 65556, 65561, 65566, 65571, - 65576, 65581, 65586, 65591, 65596, 65601, 65606, 65611, 65616, 65621, - 65626, 65631, 65636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65641, 65646, - 65651, 65656, 65660, 65665, 65669, 65674, 65679, 65684, 65689, 65694, - 65698, 65703, 65708, 65713, 65718, 65722, 65726, 65730, 65734, 65738, - 65742, 65746, 65750, 65754, 65758, 65762, 65766, 65770, 65774, 65779, - 65784, 65789, 65794, 65799, 65804, 65809, 65814, 65819, 65824, 65829, - 65834, 65839, 65844, 65849, 65855, 0, 65862, 65866, 65870, 65874, 65878, - 65882, 65886, 65890, 65894, 65898, 65903, 65908, 65913, 65918, 65923, - 65928, 65933, 65938, 65943, 65948, 65953, 65958, 65963, 65968, 65973, - 65978, 65983, 65988, 65993, 65998, 66003, 66008, 66013, 66018, 66023, - 66028, 66033, 66038, 66043, 66048, 66053, 66062, 66071, 66080, 66089, - 66098, 66107, 66116, 66125, 66128, 66133, 66138, 66143, 66148, 66153, - 66158, 66163, 66168, 66173, 66177, 66182, 66187, 66192, 66197, 66202, - 66206, 66210, 66214, 66218, 66222, 66226, 66230, 66234, 66238, 66242, - 66246, 66250, 66254, 66258, 66263, 66268, 66273, 66278, 66283, 66288, - 66293, 66298, 66303, 66308, 66313, 66318, 66323, 66328, 66334, 66340, - 66345, 66350, 66354, 66358, 66362, 66366, 66370, 66374, 66378, 66382, - 66386, 66391, 66396, 66401, 66406, 66411, 66416, 66421, 66426, 66431, - 66436, 66441, 66446, 66451, 66456, 66461, 66466, 66471, 66476, 66481, - 66486, 66491, 66496, 66501, 66506, 66511, 66516, 66521, 66526, 66531, - 66536, 66541, 66546, 66551, 66556, 66561, 66566, 66571, 66576, 66581, - 66586, 66591, 66596, 66601, 66606, 66610, 66615, 66620, 66625, 66630, - 66635, 66640, 66645, 66650, 66655, 66659, 66666, 66673, 66680, 66687, - 66694, 66701, 66708, 66715, 66722, 66729, 66736, 66743, 66746, 66749, - 66752, 66757, 66760, 66763, 66766, 66769, 66772, 66775, 66779, 66783, - 66787, 66791, 66794, 66798, 66802, 66806, 66810, 66813, 66817, 66821, - 66825, 66828, 66831, 66835, 66839, 66843, 66847, 66850, 66854, 66858, - 66862, 66866, 66869, 66873, 66877, 66881, 66885, 66888, 66892, 66896, - 66899, 66903, 66907, 66911, 66915, 66919, 66923, 66927, 66931, 66938, - 66941, 66944, 66947, 66950, 66953, 66956, 66959, 66962, 66965, 66968, - 66971, 66974, 66977, 66980, 66983, 66986, 66989, 66992, 66995, 66998, - 67001, 67004, 67007, 67010, 67013, 67016, 67019, 67022, 67025, 67028, - 67031, 67034, 67037, 67040, 67043, 67046, 67049, 67052, 67055, 67058, - 67061, 67064, 67067, 67070, 67073, 67076, 67079, 67082, 67085, 67088, - 67091, 67094, 67097, 67100, 67103, 67106, 67109, 67112, 67115, 67118, - 67121, 67124, 67127, 67130, 67133, 67136, 67139, 67142, 67145, 67148, - 67151, 67154, 67157, 67160, 67163, 67166, 67169, 67172, 67175, 67178, - 67181, 67184, 67187, 67190, 67193, 67196, 67199, 67202, 67211, 67219, - 67227, 67235, 67243, 67251, 67259, 67267, 67275, 67283, 67292, 67301, - 67310, 67319, 67328, 67337, 67346, 67355, 67364, 67373, 67382, 67391, - 67400, 67409, 67418, 67421, 67424, 67427, 67429, 67432, 67435, 67438, - 67443, 67448, 67451, 67458, 67465, 67472, 67479, 67482, 67487, 67489, - 67493, 67495, 67497, 67500, 67503, 67506, 67509, 67512, 67515, 67518, - 67523, 67528, 67531, 67534, 67537, 67540, 67543, 67546, 67549, 67553, - 67556, 67559, 67562, 67565, 67568, 67573, 67576, 67579, 67582, 67587, - 67592, 67597, 67602, 67607, 67612, 67617, 67622, 67628, 67636, 67638, - 67641, 67644, 67647, 67650, 67656, 67664, 67667, 67670, 67675, 67678, - 67681, 67684, 67689, 67692, 67695, 67700, 67703, 67706, 67711, 67714, - 67717, 67722, 67727, 67732, 67735, 67738, 67741, 67744, 67750, 67753, - 67756, 67759, 67761, 67764, 67767, 67770, 67775, 67778, 67781, 67784, - 67787, 67790, 67795, 67798, 67801, 67804, 67807, 67810, 67813, 67816, - 67819, 67822, 67828, 67833, 67841, 67849, 67857, 67865, 67873, 67881, - 67889, 67897, 67905, 67914, 67923, 67932, 67941, 67950, 67959, 67968, - 67977, 67986, 67995, 68004, 68013, 68022, 68031, 68040, 68049, 68058, - 68067, 68076, 68085, 68094, 68103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 62204, 62208, 62212, 62217, 62222, 62227, 62231, 62235, + 62239, 62244, 62249, 62253, 62257, 62261, 62265, 62270, 62275, 62280, + 62285, 62289, 62293, 62298, 62303, 62308, 62313, 62317, 0, 62321, 62325, + 62329, 62333, 62337, 62341, 62345, 62350, 62355, 62359, 62364, 62369, + 62378, 62382, 62386, 62390, 62397, 62401, 62406, 62411, 62415, 62419, + 62425, 62430, 62435, 62440, 62445, 62449, 62453, 62457, 62461, 62465, + 62470, 62475, 62479, 62483, 62488, 62493, 62498, 62502, 62506, 62511, + 62516, 62522, 62528, 62532, 62538, 62544, 62548, 62554, 62560, 62565, + 62570, 62574, 62580, 62584, 62588, 62594, 62600, 62605, 62610, 62614, + 62618, 62626, 62632, 62638, 62644, 62649, 62654, 62659, 62665, 62669, + 62675, 62679, 62683, 62689, 62695, 62701, 62707, 62713, 62719, 62725, + 62731, 62737, 62743, 62749, 62755, 62759, 62765, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 62771, 62774, 62778, 62782, 62786, 62790, 62793, 62796, + 62800, 62804, 62808, 62812, 62815, 62820, 62824, 62828, 62832, 62838, + 62842, 62846, 62850, 62854, 62861, 62867, 62871, 62875, 62879, 62883, + 62887, 62891, 62895, 62899, 62903, 62907, 62911, 62917, 62921, 62925, + 62929, 62933, 62937, 62941, 62945, 62949, 62953, 62957, 62961, 62965, + 62969, 62973, 62977, 62981, 62987, 62993, 62998, 63003, 63007, 63011, + 63015, 63019, 63023, 63027, 63031, 63035, 63039, 63043, 63047, 63051, + 63055, 63059, 63063, 63067, 63071, 63075, 63079, 63083, 63087, 63091, + 63095, 63099, 63105, 63109, 63113, 63117, 63121, 63125, 63129, 63133, + 63137, 63142, 63149, 63153, 63157, 63161, 63165, 63169, 63173, 63177, + 63181, 63185, 63189, 63193, 63197, 63204, 63208, 63214, 63218, 63222, + 63226, 63230, 63234, 63237, 63241, 63245, 63249, 63253, 63257, 63261, + 63265, 63269, 63273, 63277, 63281, 63285, 63289, 63293, 63297, 63301, + 63305, 63309, 63313, 63317, 63321, 63325, 63329, 63333, 63337, 63341, + 63345, 63349, 63353, 63357, 63361, 63365, 63371, 63375, 63379, 63383, + 63387, 63391, 63395, 63399, 63403, 63407, 63411, 63415, 63419, 63423, + 63427, 63431, 63435, 63439, 63443, 63447, 63451, 63455, 63459, 63463, + 63467, 63471, 63475, 63479, 63487, 63491, 63495, 63499, 63503, 63507, + 63513, 63517, 63521, 63525, 63529, 63533, 63537, 63541, 63545, 63549, + 63553, 63557, 63561, 63565, 63571, 63575, 63579, 63583, 63587, 63591, + 63595, 63599, 63603, 63607, 63611, 63615, 63619, 63623, 63627, 63631, + 63635, 63639, 63643, 63647, 63651, 63655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63659, 63668, 63676, + 63687, 63697, 63706, 63716, 63726, 63737, 63749, 63761, 63773, 0, 0, 0, + 0, 63780, 63783, 63786, 63791, 63794, 63801, 63805, 63809, 63813, 63817, + 63821, 63826, 63831, 63835, 63839, 63844, 63849, 63854, 63859, 63862, + 63865, 63871, 63877, 63882, 63887, 63894, 63901, 63905, 63909, 63913, + 63921, 63927, 63934, 63939, 63944, 63949, 63954, 63959, 63964, 63969, + 63974, 63979, 63984, 63989, 63994, 63999, 64004, 64010, 64015, 64019, + 64025, 64036, 64045, 64059, 64068, 64072, 64082, 64088, 64094, 64100, + 64105, 64108, 64113, 64117, 0, 64123, 64128, 64132, 64137, 64141, 64146, + 64150, 64155, 64159, 64164, 64168, 64172, 64177, 64182, 64187, 64192, + 64197, 64202, 64207, 64212, 64217, 64221, 64226, 64231, 64236, 64241, + 64246, 64251, 64256, 64261, 64266, 64270, 64275, 64280, 64285, 64291, + 64296, 64301, 64306, 64311, 64315, 64320, 64324, 64329, 64334, 64339, + 64344, 64348, 64353, 64357, 64362, 64367, 64372, 64377, 64382, 64387, + 64392, 64397, 64402, 64407, 64412, 64417, 64421, 64426, 64431, 64436, + 64441, 64446, 64450, 64456, 64461, 64467, 64472, 64476, 64481, 64486, + 64491, 64496, 64502, 64507, 64512, 64517, 64522, 64527, 64532, 64537, 0, + 0, 64543, 64551, 64559, 64566, 64573, 64578, 64585, 64591, 64596, 64600, + 64603, 64607, 64610, 64614, 64617, 64621, 64624, 64628, 64631, 64634, + 64638, 64642, 64646, 64650, 64654, 64658, 64662, 64666, 64670, 64673, + 64677, 64681, 64685, 64689, 64693, 64697, 64701, 64705, 64709, 64712, + 64716, 64720, 64724, 64729, 64733, 64737, 64741, 64745, 64748, 64752, + 64755, 64759, 64763, 64767, 64771, 64774, 64778, 64781, 64785, 64789, + 64793, 64797, 64801, 64805, 64809, 64813, 64817, 64821, 64825, 64829, + 64832, 64836, 64840, 64844, 64848, 64852, 64855, 64860, 64864, 64869, + 64873, 64876, 64880, 64884, 64888, 64892, 64897, 64901, 64905, 64909, + 64913, 64917, 64921, 64925, 64930, 64934, 64938, 64942, 64946, 64950, + 64957, 64961, 64967, 0, 0, 0, 0, 0, 64972, 64977, 64982, 64987, 64992, + 64997, 65002, 65007, 65011, 65016, 65021, 65026, 65031, 65036, 65041, + 65046, 65051, 65056, 65060, 65065, 65070, 65075, 65079, 65083, 65087, + 65092, 65097, 65102, 65107, 65112, 65117, 65122, 65127, 65132, 65137, + 65141, 65145, 65150, 65155, 65160, 65165, 65170, 65177, 0, 65182, 65186, + 65190, 65194, 65198, 65202, 65206, 65210, 65214, 65218, 65222, 65226, + 65230, 65234, 65238, 65242, 65246, 65250, 65254, 65258, 65262, 65266, + 65270, 65274, 65278, 65282, 65286, 65290, 65294, 65298, 65302, 65305, + 65309, 65312, 65316, 65320, 65323, 65327, 65331, 65334, 65338, 65342, + 65346, 65350, 65353, 65357, 65361, 65365, 65369, 65373, 65377, 65380, + 65383, 65387, 65391, 65395, 65399, 65403, 65407, 65411, 65415, 65419, + 65423, 65427, 65431, 65435, 65439, 65443, 65447, 65451, 65455, 65459, + 65463, 65467, 65471, 65475, 65479, 65483, 65487, 65491, 65495, 65499, + 65503, 65507, 65511, 65515, 65519, 65523, 65527, 65531, 65535, 65539, + 65543, 65547, 0, 65551, 65557, 65563, 65568, 65573, 65578, 65584, 65590, + 65595, 65601, 65607, 65613, 65619, 65625, 65631, 65637, 65643, 65648, + 65653, 65658, 65663, 65668, 65673, 65678, 65683, 65688, 65693, 65698, + 65703, 65708, 65713, 65718, 65723, 65728, 65733, 65738, 65743, 65749, + 65755, 65761, 65767, 65772, 65777, 65782, 65788, 65793, 65798, 65803, + 65808, 65813, 65818, 65823, 65828, 65833, 65838, 65843, 65848, 65853, + 65858, 65863, 65868, 65873, 65878, 65883, 65888, 65893, 65898, 65903, + 65908, 65913, 65918, 65923, 65928, 65933, 65938, 65943, 65948, 65953, + 65958, 65963, 65968, 65973, 65978, 65983, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65988, 65993, 65998, 66003, 66007, 66012, 66016, 66021, 66026, + 66031, 66036, 66041, 66045, 66050, 66055, 66060, 66065, 66069, 66073, + 66077, 66081, 66085, 66089, 66093, 66097, 66101, 66105, 66109, 66113, + 66117, 66121, 66126, 66131, 66136, 66141, 66146, 66151, 66156, 66161, + 66166, 66171, 66176, 66181, 66186, 66191, 66196, 66203, 0, 66211, 66215, + 66219, 66223, 66227, 66231, 66235, 66239, 66243, 66247, 66252, 66257, + 66262, 66267, 66272, 66277, 66282, 66287, 66292, 66297, 66302, 66307, + 66312, 66317, 66322, 66327, 66332, 66337, 66342, 66347, 66352, 66357, + 66362, 66367, 66372, 66377, 66382, 66387, 66392, 66397, 66402, 66411, + 66420, 66429, 66438, 66447, 66456, 66465, 66474, 66477, 66482, 66487, + 66492, 66497, 66502, 66507, 66512, 66517, 66522, 66526, 66531, 66536, + 66541, 66546, 66551, 66555, 66559, 66563, 66567, 66571, 66575, 66579, + 66583, 66587, 66591, 66595, 66599, 66603, 66607, 66612, 66617, 66622, + 66627, 66632, 66637, 66642, 66647, 66652, 66657, 66662, 66667, 66672, + 66677, 66684, 66691, 66696, 66701, 66705, 66709, 66713, 66717, 66721, + 66725, 66729, 66733, 66737, 66742, 66747, 66752, 66757, 66762, 66767, + 66772, 66777, 66782, 66787, 66792, 66797, 66802, 66807, 66812, 66817, + 66822, 66827, 66832, 66837, 66842, 66847, 66852, 66857, 66862, 66867, + 66872, 66877, 66882, 66887, 66892, 66897, 66902, 66907, 66912, 66917, + 66922, 66927, 66932, 66937, 66942, 66947, 66952, 66957, 66961, 66966, + 66971, 66976, 66981, 66986, 66991, 66996, 67001, 67006, 67010, 67017, + 67024, 67031, 67038, 67045, 67052, 67059, 67066, 67073, 67080, 67087, + 67094, 67097, 67100, 67103, 67108, 67111, 67114, 67117, 67120, 67123, + 67126, 67130, 67134, 67138, 67142, 67145, 67149, 67153, 67157, 67161, + 67164, 67168, 67172, 67176, 67179, 67182, 67186, 67190, 67194, 67198, + 67201, 67205, 67209, 67213, 67217, 67220, 67224, 67228, 67232, 67236, + 67239, 67243, 67247, 67250, 67254, 67258, 67262, 67266, 67270, 67274, + 67278, 67282, 67289, 67292, 67295, 67298, 67301, 67304, 67307, 67310, + 67313, 67316, 67319, 67322, 67325, 67328, 67331, 67334, 67337, 67340, + 67343, 67346, 67349, 67352, 67355, 67358, 67361, 67364, 67367, 67370, + 67373, 67376, 67379, 67382, 67385, 67388, 67391, 67394, 67397, 67400, + 67403, 67406, 67409, 67412, 67415, 67418, 67421, 67424, 67427, 67430, + 67433, 67436, 67439, 67442, 67445, 67448, 67451, 67454, 67457, 67460, + 67463, 67466, 67469, 67472, 67475, 67478, 67481, 67484, 67487, 67490, + 67493, 67496, 67499, 67502, 67505, 67508, 67511, 67514, 67517, 67520, + 67523, 67526, 67529, 67532, 67535, 67538, 67541, 67544, 67547, 67550, + 67553, 67562, 67570, 67578, 67586, 67594, 67602, 67610, 67618, 67626, + 67634, 67643, 67652, 67661, 67670, 67679, 67688, 67697, 67706, 67715, + 67724, 67733, 67742, 67751, 67760, 67769, 67772, 67775, 67778, 67780, + 67783, 67786, 67789, 67794, 67799, 67802, 67809, 67816, 67823, 67830, + 67833, 67838, 67840, 67844, 67846, 67848, 67851, 67854, 67857, 67860, + 67863, 67866, 67869, 67874, 67879, 67882, 67885, 67888, 67891, 67894, + 67897, 67900, 67904, 67907, 67910, 67913, 67916, 67919, 67924, 67927, + 67930, 67933, 67938, 67943, 67948, 67953, 67958, 67963, 67968, 67973, + 67979, 67987, 67989, 67992, 67995, 67998, 68001, 68007, 68015, 68018, + 68021, 68026, 68029, 68032, 68035, 68040, 68043, 68046, 68051, 68054, + 68057, 68062, 68065, 68068, 68073, 68078, 68083, 68086, 68089, 68092, + 68095, 68101, 68104, 68107, 68110, 68112, 68115, 68118, 68121, 68126, + 68129, 68132, 68135, 68138, 68141, 68146, 68149, 68152, 68155, 68158, + 68161, 68164, 68167, 68170, 68173, 68179, 68184, 68192, 68200, 68208, + 68216, 68224, 68232, 68240, 68248, 68256, 68265, 68274, 68283, 68292, + 68301, 68310, 68319, 68328, 68337, 68346, 68355, 68364, 68373, 68382, + 68391, 68400, 68409, 68418, 68427, 68436, 68445, 68454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -20933,2589 +21496,2825 @@ static const unsigned int phrasebook_offset2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68106, 68115, 68124, 68135, 68142, - 68147, 68152, 68159, 68166, 68172, 68177, 68182, 68187, 68192, 68199, - 68204, 68209, 68214, 68225, 68230, 68235, 68242, 68247, 68254, 68259, - 68264, 68271, 68278, 68285, 68294, 68303, 68308, 68313, 68318, 68325, - 68330, 68340, 68347, 68352, 68357, 68362, 68367, 68372, 68377, 68386, - 68393, 68400, 68405, 68412, 68417, 68424, 68433, 68444, 68449, 68458, - 68463, 68470, 68479, 68488, 68493, 68498, 68505, 68511, 68518, 68525, - 68529, 68533, 68536, 68540, 68544, 68548, 68552, 68556, 68560, 68564, - 68567, 68571, 68575, 68579, 68583, 68587, 68591, 68594, 68598, 68602, - 68605, 68609, 68613, 68617, 68621, 68625, 68629, 68633, 68637, 68641, - 68645, 68649, 68653, 68657, 68661, 68665, 68669, 68673, 68677, 68681, - 68685, 68689, 68693, 68697, 68701, 68705, 68709, 68713, 68717, 68721, - 68725, 68729, 68733, 68737, 68741, 68745, 68749, 68753, 68757, 68761, - 68765, 68769, 68773, 68777, 68781, 68784, 68788, 68792, 68796, 68800, - 68804, 68808, 68812, 68816, 68820, 68824, 68828, 68832, 68836, 68840, - 68844, 68848, 68852, 68856, 68860, 68864, 68868, 68872, 68876, 68880, - 68884, 68888, 68892, 68896, 68900, 68904, 68908, 68912, 68916, 68920, - 68924, 68928, 68932, 68936, 68940, 68944, 68948, 68952, 68956, 68960, - 68964, 68968, 68972, 68976, 68980, 68984, 68988, 68992, 68996, 69000, - 69004, 69008, 69012, 69016, 69020, 69024, 69028, 69032, 69036, 69040, - 69044, 69048, 69052, 69056, 69060, 69064, 69068, 69072, 69076, 69080, - 69084, 69088, 69092, 69096, 69100, 69104, 69108, 69112, 69116, 69120, - 69124, 69128, 69132, 69136, 69140, 69144, 69148, 69152, 69156, 69160, - 69164, 69168, 69172, 69176, 69180, 69184, 69188, 69192, 69196, 69200, - 69204, 69208, 69212, 69216, 69220, 69224, 69228, 69232, 69236, 69240, - 69244, 69248, 69252, 69255, 69259, 69263, 69267, 69271, 69275, 69279, - 69283, 69287, 69291, 69295, 69299, 69303, 69307, 69311, 69315, 69319, - 69323, 69327, 69331, 69335, 69339, 69343, 69347, 69351, 69355, 69359, - 69363, 69367, 69371, 69375, 69379, 69383, 69387, 69391, 69395, 69399, - 69403, 69407, 69411, 69415, 69419, 69423, 69427, 69431, 69435, 69439, - 69443, 69447, 69451, 69455, 69459, 69463, 69467, 69471, 69475, 69479, - 69483, 69487, 69491, 69495, 69499, 69503, 69507, 69511, 69515, 69519, - 69523, 69527, 69531, 69535, 69539, 69543, 69547, 69551, 69555, 69559, - 69563, 69567, 69571, 69575, 69579, 69583, 69587, 69591, 69595, 69599, - 69603, 69607, 69611, 69615, 69619, 69623, 69627, 69631, 69635, 69639, - 69643, 69647, 69651, 69655, 69659, 69663, 69667, 69671, 69675, 69679, - 69683, 69686, 69690, 69694, 69698, 69702, 69706, 69710, 69714, 69717, - 69721, 69725, 69729, 69733, 69737, 69741, 69745, 69749, 69753, 69757, - 69761, 69765, 69769, 69773, 69777, 69781, 69785, 69789, 69793, 69797, - 69801, 69805, 69809, 69813, 69817, 69821, 69825, 69829, 69833, 69837, - 69841, 69845, 69849, 69853, 69857, 69861, 69865, 69869, 69873, 69877, - 69881, 69885, 69889, 69893, 69897, 69901, 69905, 69909, 69913, 69917, - 69921, 69925, 69929, 69933, 69937, 69941, 69945, 69949, 69953, 69957, - 69961, 69965, 69969, 69973, 69977, 69981, 69985, 69989, 69993, 69997, - 70001, 70005, 70009, 70013, 70017, 70021, 70025, 70029, 70033, 70037, - 70041, 70045, 70049, 70053, 70057, 70061, 70065, 70069, 70073, 70076, - 70080, 70084, 70088, 70092, 70096, 70100, 70104, 70108, 70112, 70116, - 70120, 70124, 70128, 70132, 70136, 70140, 70144, 70148, 70152, 70156, - 70160, 70164, 70168, 70172, 70176, 70180, 70184, 70188, 70192, 70196, - 70200, 70204, 70208, 70212, 70216, 70220, 70224, 70228, 70232, 70236, - 70240, 70244, 70248, 70252, 70256, 70260, 70264, 70268, 70272, 70276, - 70280, 70284, 70288, 70292, 70296, 70300, 70304, 70308, 70312, 70315, - 70319, 70323, 70327, 70331, 70335, 70339, 70343, 70347, 70351, 70355, - 70359, 70363, 70367, 70371, 70375, 70379, 70383, 70387, 70391, 70395, - 70399, 70403, 70407, 70411, 70415, 70419, 70423, 70427, 70431, 70435, - 70439, 70443, 70447, 70451, 70455, 70459, 70463, 70467, 70471, 70475, - 70479, 70483, 70487, 70491, 70495, 70499, 70503, 70507, 70511, 70515, - 70519, 70523, 70527, 70531, 70535, 70539, 70543, 70547, 70551, 70555, - 70559, 70563, 70567, 70570, 70574, 70578, 70582, 70586, 70590, 70594, - 70598, 70602, 70606, 70610, 70614, 70618, 70622, 70626, 70630, 70634, - 70638, 70642, 70646, 70650, 70654, 70658, 70662, 70666, 70670, 70674, - 70678, 70682, 70686, 70690, 70694, 70698, 70702, 70706, 70710, 70714, - 70718, 70722, 70726, 70730, 70734, 70738, 70742, 70746, 70750, 70754, - 70758, 70762, 70766, 70770, 70774, 70778, 70782, 70786, 70790, 70794, - 70798, 70802, 70806, 70810, 70814, 70818, 70822, 70826, 70830, 70834, - 70838, 70842, 70846, 70850, 70854, 70858, 70862, 70866, 70870, 70874, - 70878, 70882, 70886, 70890, 70894, 70898, 70902, 70906, 70910, 70914, - 70918, 70922, 70926, 70930, 70934, 70938, 70942, 70946, 70950, 70954, - 70958, 70962, 70966, 70970, 70974, 70978, 70982, 70986, 70990, 70994, - 70998, 71002, 71006, 71010, 71014, 71018, 71022, 71025, 71029, 71033, - 71037, 71041, 71045, 71049, 71053, 71057, 71061, 71065, 71069, 71073, - 71077, 71081, 71085, 71089, 71093, 71097, 71101, 71105, 71109, 71113, - 71117, 71121, 71125, 71129, 71133, 71137, 71141, 71145, 71149, 71153, - 71157, 71161, 71165, 71169, 71173, 71177, 71181, 71185, 71189, 71193, - 71197, 71201, 71205, 71209, 71213, 71217, 71221, 71225, 71229, 71233, - 71237, 71241, 71245, 71249, 71253, 71257, 71261, 71265, 71269, 71273, - 71277, 71281, 71285, 71289, 71293, 71297, 71301, 71305, 71309, 71313, - 71317, 71321, 71325, 71329, 71333, 71337, 71341, 71345, 71349, 71353, - 71357, 71361, 71365, 71369, 71373, 71377, 71381, 71385, 71389, 71393, - 71397, 71401, 71405, 71409, 71413, 71417, 71421, 71425, 71429, 71433, - 71437, 71441, 71445, 71449, 71453, 71457, 71461, 71465, 71469, 71473, - 71477, 71481, 71485, 71489, 71493, 71497, 71501, 71505, 71509, 71513, - 71517, 71521, 71525, 71529, 71533, 71537, 71541, 71545, 71549, 71553, - 71557, 71561, 71565, 71569, 71573, 71577, 71581, 71585, 71589, 71593, - 71597, 71601, 71605, 71609, 71613, 71617, 71621, 71625, 71628, 71632, - 71636, 71640, 71644, 71648, 71652, 71656, 71659, 71663, 71667, 71671, - 71675, 71679, 71683, 71687, 71691, 71695, 71699, 71703, 71707, 71711, - 71715, 71719, 71723, 71727, 71731, 71735, 71739, 71743, 71747, 71751, - 71755, 71759, 71763, 71767, 71771, 71775, 71779, 71783, 71787, 71791, - 71795, 71799, 71803, 71807, 71811, 71815, 71819, 71823, 71827, 71831, - 71835, 71839, 71843, 71847, 71851, 71855, 71859, 71863, 71867, 71871, - 71875, 71879, 71883, 71887, 71891, 71895, 71899, 71903, 71907, 71911, - 71915, 71919, 71923, 71927, 71931, 71935, 71939, 71943, 71947, 71951, - 71955, 71959, 71963, 71967, 71971, 71975, 71979, 71983, 71987, 71991, - 71995, 71999, 72003, 72007, 72011, 72015, 72019, 72023, 72027, 72031, - 72035, 72039, 72043, 72047, 72051, 72055, 72059, 72063, 72067, 72071, - 72075, 72079, 72083, 72087, 72091, 72095, 72099, 72103, 72107, 72111, - 72115, 72119, 72123, 72127, 72131, 72135, 72139, 72143, 72147, 72151, - 72155, 72159, 72163, 72167, 72171, 72175, 72179, 72183, 72187, 72191, - 72195, 72199, 72203, 72207, 72211, 72215, 72219, 72223, 72227, 72231, - 72235, 72239, 72243, 72247, 72251, 72255, 72259, 72263, 72267, 72271, - 72275, 72279, 72283, 72287, 72291, 72295, 72299, 72303, 72307, 72311, - 72315, 72319, 72323, 72327, 72331, 72335, 72339, 72343, 72347, 72351, - 72355, 72359, 72363, 72367, 72371, 72375, 72379, 72383, 72386, 72390, - 72394, 72398, 72402, 72406, 72410, 72414, 72418, 72422, 72426, 72430, - 72434, 72438, 72442, 72446, 72450, 72454, 72458, 72462, 72466, 72470, - 72474, 72478, 72482, 72486, 72490, 72494, 72498, 72502, 72506, 72510, - 72514, 72518, 72522, 72526, 72530, 72534, 72538, 72542, 72546, 72550, - 72554, 72558, 72562, 72566, 72570, 72574, 72578, 72582, 72586, 72590, - 72594, 72598, 72602, 72606, 72610, 72614, 72618, 72622, 72626, 72630, - 72634, 72638, 72642, 72646, 72650, 72654, 72658, 72662, 72666, 72670, - 72674, 72678, 72682, 72686, 72690, 72694, 72698, 72702, 72706, 72710, - 72714, 72718, 72722, 72726, 72730, 72734, 72738, 72742, 72746, 72750, - 72754, 72758, 72762, 72766, 72770, 72774, 72778, 72782, 72786, 72790, - 72794, 72798, 72802, 72806, 72810, 72814, 72818, 72822, 72826, 72830, - 72834, 72838, 72842, 72846, 72850, 72854, 72858, 72862, 72866, 72870, - 72874, 72878, 72882, 72886, 72890, 72894, 72898, 72902, 72906, 72910, - 72914, 72918, 72922, 72926, 72930, 72934, 72938, 72942, 72946, 72950, - 72954, 72958, 72962, 72966, 72970, 72974, 72978, 72982, 72986, 72990, - 72994, 72998, 73002, 73006, 73010, 73014, 73018, 73022, 73026, 73030, - 73034, 73038, 73042, 73046, 73050, 73054, 73058, 73062, 73066, 73070, - 73074, 73078, 73082, 73086, 73090, 73094, 73098, 73102, 73106, 73110, - 73114, 73118, 73122, 73126, 73130, 73134, 73138, 73142, 73146, 73150, - 73154, 73158, 73162, 73166, 0, 0, 0, 73170, 73174, 73178, 73182, 73186, - 73190, 73194, 73198, 73202, 73206, 73210, 73214, 73218, 73222, 73226, - 73230, 73234, 73238, 73242, 73246, 73250, 73254, 73258, 73262, 73266, - 73270, 73274, 73278, 73282, 73286, 73290, 73294, 73298, 73302, 73306, - 73310, 73314, 73318, 73322, 73326, 73330, 73334, 73338, 73342, 73346, - 73350, 73354, 73358, 73362, 73366, 73370, 73374, 73378, 73382, 73386, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 73390, 73395, 73399, 73404, 73409, 73413, 73418, - 73423, 73427, 73432, 73437, 73442, 73447, 73452, 73457, 73462, 73466, - 73470, 73474, 73478, 73483, 73488, 73493, 73497, 73502, 73507, 73512, - 73517, 73522, 73526, 73531, 73535, 73540, 73544, 73549, 73553, 73557, - 73561, 73566, 73571, 73576, 73584, 73592, 73600, 73608, 73615, 73623, - 73629, 73637, 73641, 73645, 73649, 73653, 73657, 73661, 73665, 73669, - 73673, 73677, 73681, 73685, 73689, 73693, 73697, 73701, 73705, 73709, - 73713, 73717, 73721, 73725, 73729, 73733, 73737, 73741, 73745, 73749, - 73753, 73757, 73761, 73765, 73769, 73773, 73777, 73781, 73784, 73788, - 73792, 73796, 73800, 73804, 73808, 73812, 73816, 73820, 73824, 73828, - 73832, 73836, 73840, 73844, 73848, 73852, 73856, 73860, 73864, 73868, - 73872, 73876, 73880, 73884, 73888, 73892, 73896, 73900, 73904, 73908, - 73912, 73916, 73920, 73924, 73928, 73931, 73935, 73939, 73942, 73946, - 73950, 73954, 73957, 73961, 73965, 73969, 73973, 73977, 73981, 73985, - 73989, 73993, 73996, 74000, 74004, 74008, 74011, 74014, 74018, 74022, - 74025, 74029, 74033, 74037, 74041, 74045, 74049, 74052, 74055, 74059, - 74063, 74067, 74070, 74073, 74077, 74081, 74085, 74089, 74093, 74097, - 74101, 74105, 74109, 74113, 74117, 74121, 74125, 74129, 74133, 74137, - 74141, 74145, 74149, 74153, 74157, 74161, 74165, 74169, 74173, 74177, - 74181, 74185, 74189, 74193, 74197, 74201, 74205, 74209, 74213, 74217, - 74221, 74224, 74228, 74232, 74236, 74240, 74244, 74248, 74252, 74256, - 74260, 74264, 74268, 74272, 74276, 74280, 74284, 74288, 74292, 74296, - 74300, 74304, 74308, 74312, 74316, 74320, 74324, 74328, 74332, 74336, - 74340, 74344, 74348, 74352, 74356, 74360, 74364, 74368, 74371, 74375, - 74379, 74383, 74387, 74391, 74395, 74399, 74403, 74407, 74411, 74415, - 74419, 74423, 74427, 74431, 74435, 74438, 74442, 74446, 74450, 74454, - 74458, 74462, 74466, 74470, 74474, 74478, 74482, 74486, 74490, 74494, - 74498, 74502, 74506, 74510, 74514, 74518, 74522, 74525, 74529, 74533, - 74537, 74541, 74545, 74549, 74553, 74557, 74561, 74565, 74569, 74573, - 74577, 74581, 74585, 74589, 74593, 74597, 74601, 74605, 74609, 74613, - 74617, 74621, 74625, 74629, 74633, 74637, 74641, 74645, 74649, 74653, - 74657, 74661, 74665, 74669, 74673, 74677, 74681, 74685, 74689, 74693, - 74697, 74700, 74705, 74709, 74715, 74720, 74726, 74730, 74734, 74738, - 74742, 74746, 74750, 74754, 74758, 74762, 74766, 74770, 74774, 74778, - 74782, 74785, 74788, 74791, 74794, 74797, 74800, 74803, 74806, 74809, - 74814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74820, - 74825, 74830, 74835, 74840, 74847, 74854, 74859, 74864, 74869, 74874, - 74881, 74888, 74895, 74902, 74909, 74916, 74926, 74936, 74943, 74950, - 74957, 74964, 74970, 74976, 74985, 74994, 75001, 75008, 75019, 75030, - 75035, 75040, 75047, 75054, 75061, 75068, 75075, 75082, 75089, 75096, - 75102, 75108, 75114, 75120, 75127, 75134, 75139, 75143, 75150, 75157, - 75164, 75168, 75175, 75179, 75184, 75188, 75194, 75199, 75205, 75210, - 75214, 75218, 75221, 75224, 75229, 75234, 75239, 75244, 75249, 75254, - 75259, 75264, 75269, 75274, 75282, 75290, 75295, 75300, 75305, 75310, - 75315, 75320, 75325, 75330, 75335, 75340, 75345, 75350, 75355, 75360, - 75366, 75372, 75378, 75384, 75389, 75395, 75398, 75401, 75404, 75408, - 75412, 75416, 75420, 75423, 75427, 75430, 75433, 75436, 75440, 75444, - 75448, 75452, 75456, 75460, 75464, 75468, 75472, 75476, 75480, 75484, - 75488, 75492, 75496, 75500, 75504, 75508, 75512, 75516, 75520, 75524, - 75527, 75531, 75535, 75539, 75543, 75547, 75551, 75555, 75559, 75563, - 75567, 75571, 75575, 75579, 75583, 75587, 75591, 75595, 75599, 75603, - 75607, 75611, 75615, 75619, 75623, 75626, 75630, 75634, 75638, 75642, - 75646, 75650, 75654, 75657, 75661, 75665, 75669, 75673, 75677, 75681, - 75685, 75689, 75693, 75697, 75701, 75705, 75710, 75715, 75718, 75723, - 75726, 75729, 75732, 0, 0, 0, 0, 0, 0, 0, 0, 75736, 75745, 75754, 75763, - 75772, 75781, 75790, 75799, 75808, 75816, 75823, 75831, 75838, 75846, - 75856, 75865, 75875, 75884, 75894, 75902, 75909, 75917, 75924, 75932, - 75937, 75942, 75948, 75957, 75963, 75969, 75976, 75985, 75993, 76001, - 76009, 76016, 76023, 76030, 76037, 76042, 76047, 76052, 76057, 76062, - 76067, 76072, 76077, 76085, 76093, 76099, 76105, 76110, 76115, 76120, - 76125, 76130, 76135, 76140, 76145, 76154, 76163, 76168, 76173, 76183, - 76193, 76200, 76207, 76216, 76225, 76237, 76249, 76255, 76261, 76269, - 76277, 76287, 76297, 76304, 76311, 76316, 76321, 76333, 76345, 76353, - 76361, 76371, 76381, 76393, 76405, 76414, 76423, 76430, 76437, 76444, - 76451, 76460, 76469, 76474, 76479, 76486, 76493, 76500, 76507, 76519, - 76531, 76536, 76541, 76546, 76551, 76556, 76561, 76566, 76571, 76575, - 76580, 76585, 76590, 76595, 76600, 76606, 76611, 76616, 76623, 76630, - 76637, 76644, 76651, 76659, 76667, 76672, 76677, 76683, 76689, 76696, - 76703, 76710, 76717, 76724, 76728, 76735, 76740, 76745, 76751, 76764, - 76770, 76778, 76786, 76793, 76800, 76809, 76818, 76825, 76832, 76839, - 76846, 76853, 76860, 76867, 76874, 76881, 76888, 76897, 76906, 76915, - 76924, 76933, 76942, 76951, 76960, 76969, 76978, 76985, 76992, 76998, - 77006, 77012, 77018, 77024, 77030, 77038, 77043, 77048, 77053, 77058, - 77063, 77069, 77075, 77081, 77087, 77093, 77099, 77105, 0, 0, 77111, - 77118, 77125, 77134, 77141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 77150, 77157, 77164, 77170, 77177, 77185, - 77193, 77201, 77209, 77217, 77223, 77229, 77236, 77242, 77248, 77254, - 77261, 77268, 77275, 77282, 77289, 77296, 77303, 77310, 77317, 77324, - 77331, 77338, 77345, 77352, 77358, 77365, 77372, 77379, 77386, 77393, - 77400, 77407, 77414, 77421, 77428, 77435, 77442, 77449, 77456, 77463, - 77470, 77477, 77484, 77492, 77500, 77508, 77516, 0, 0, 0, 0, 77524, - 77531, 77538, 77545, 77552, 77559, 77566, 77572, 77578, 77584, 0, 0, 0, - 0, 0, 0, 77590, 77594, 77599, 77604, 77609, 77614, 77619, 77624, 77629, - 77633, 77638, 77643, 77647, 77651, 77656, 77661, 77665, 77670, 77675, - 77680, 77685, 77690, 77695, 77700, 77704, 77708, 77712, 77717, 77721, - 77725, 77729, 77733, 77737, 77741, 77745, 77750, 77755, 77760, 77765, - 77770, 77777, 77783, 77788, 77793, 77798, 77803, 77809, 77816, 77822, - 77829, 77835, 77841, 77846, 77853, 77859, 77864, 0, 0, 0, 0, 0, 0, 0, 0, - 77870, 77875, 77880, 77884, 77889, 77893, 77898, 77902, 77907, 77912, - 77918, 77923, 77929, 77933, 77938, 77943, 77947, 77952, 77957, 77961, - 77966, 77971, 77976, 77981, 77986, 77991, 77996, 78001, 78006, 78011, - 78016, 78021, 78026, 78031, 78035, 78040, 78045, 78050, 78054, 78058, - 78063, 78068, 78073, 78077, 78081, 78085, 78089, 78094, 78099, 78104, - 78108, 78112, 78117, 78123, 78129, 78134, 78140, 78145, 78151, 78157, - 78164, 78170, 78177, 78182, 78188, 78194, 78199, 78205, 78211, 78216, 0, - 0, 0, 0, 0, 0, 0, 0, 78221, 78225, 78230, 78235, 78239, 78243, 78247, - 78251, 78255, 78259, 78263, 78267, 0, 0, 0, 0, 0, 0, 78271, 78276, 78280, - 78284, 78288, 78292, 78296, 78300, 78304, 78308, 78312, 78316, 78320, - 78324, 78328, 78332, 78336, 78341, 78346, 78352, 78358, 78365, 78370, - 78375, 78381, 78385, 78390, 78393, 78396, 78400, 78405, 78409, 78414, - 78421, 78427, 78433, 78439, 78445, 78451, 78457, 78463, 78469, 78475, - 78481, 78488, 78495, 78502, 78508, 78515, 78522, 78529, 78535, 78542, - 78548, 78554, 78561, 78567, 78574, 78581, 78587, 78593, 78599, 78606, - 78613, 78619, 78626, 78633, 78639, 78646, 78652, 78659, 78666, 78672, - 78678, 78685, 78691, 78698, 78705, 78714, 78721, 78728, 78732, 78737, - 78742, 78746, 78751, 78755, 78759, 78764, 78768, 78773, 78778, 78783, - 78787, 78791, 78795, 78799, 78804, 78808, 78813, 78818, 78823, 78828, - 78832, 78837, 78842, 78847, 78853, 78858, 78864, 78870, 78876, 78882, - 78888, 78893, 78899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78903, 78908, - 78912, 78916, 78920, 78924, 78928, 78932, 78936, 78940, 78944, 78948, - 78952, 78956, 78960, 78964, 78968, 78972, 78976, 78980, 78984, 78988, - 78992, 78996, 79000, 79004, 79008, 79012, 79016, 79020, 0, 0, 0, 79024, - 79029, 79034, 79039, 79044, 79048, 79055, 79059, 79064, 79068, 79075, - 79082, 79091, 79095, 79100, 79104, 79108, 79115, 79122, 79127, 79134, - 79139, 79144, 79151, 79156, 79163, 79170, 79175, 79180, 79187, 79192, - 79199, 79206, 79210, 79217, 79222, 79229, 79233, 79237, 79244, 79249, - 79256, 79260, 79264, 79268, 79275, 79279, 79284, 79291, 79298, 79302, - 79306, 79313, 79319, 79325, 79331, 79339, 79345, 79353, 79359, 79367, - 79373, 79379, 79385, 79391, 79395, 79400, 79405, 79411, 79417, 79423, - 79429, 79435, 79441, 79447, 79453, 79461, 79467, 0, 79474, 79478, 79483, - 79487, 79491, 79495, 79499, 79503, 79507, 79511, 79515, 0, 0, 0, 0, - 79519, 79527, 79533, 79539, 79545, 79551, 79557, 79563, 79569, 79576, - 79583, 79590, 79597, 79604, 79611, 79618, 79625, 79632, 79639, 79646, - 79652, 79658, 79664, 79670, 79676, 79682, 79688, 79694, 79700, 79707, - 79714, 79721, 79728, 0, 79735, 79739, 79743, 79747, 79751, 79756, 79760, - 79764, 79769, 79774, 79779, 79784, 79789, 79794, 79799, 79804, 79809, - 79814, 79819, 79824, 79828, 79833, 79838, 79843, 79848, 79852, 79857, - 79861, 79866, 79871, 79876, 79881, 79886, 79890, 79895, 79899, 79903, - 79907, 79912, 79917, 79921, 79925, 79931, 79936, 79942, 79948, 79953, - 79959, 79964, 79970, 79976, 79982, 79987, 79992, 79997, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 80003, 80009, 80015, 80021, 80028, 80034, 80040, 80046, 80052, - 80058, 80063, 80068, 80074, 80081, 0, 0, 80088, 80093, 80097, 80101, - 80105, 80109, 80113, 80117, 80121, 80125, 0, 0, 80129, 80135, 80141, - 80148, 80156, 80162, 80168, 80174, 80180, 80186, 80192, 80198, 80204, - 80210, 80216, 80222, 80227, 80232, 80237, 80243, 80249, 80256, 80262, - 80268, 80273, 80280, 80287, 80294, 80300, 80305, 80310, 80315, 80323, - 80330, 80337, 80345, 80353, 80360, 80367, 80374, 80381, 80388, 80395, - 80402, 80409, 80416, 80423, 80430, 80437, 80444, 80451, 80458, 80465, - 80472, 80479, 80486, 80493, 80499, 80505, 80512, 80519, 80526, 80533, - 80540, 80547, 80554, 80561, 80568, 80575, 80582, 80589, 80596, 80603, - 80610, 80617, 80624, 80631, 80638, 80645, 80652, 80659, 80666, 80673, - 80679, 80685, 80692, 80698, 80703, 80709, 80714, 80719, 80724, 80731, - 80737, 80743, 80749, 80755, 80761, 80767, 80773, 80781, 80789, 80797, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80805, 80811, 80817, 80823, 80831, 80839, 80845, 80851, 80858, 80865, - 80872, 80879, 80886, 80893, 80900, 80907, 80914, 80922, 80930, 80938, - 80946, 80954, 80960, 80968, 80974, 80982, 80991, 80999, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 81005, 81009, 81013, 81017, 81021, 81025, 0, 0, 81029, 81033, - 81037, 81041, 81045, 81049, 0, 0, 81053, 81057, 81061, 81065, 81069, - 81073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81077, 81081, 81085, 81089, 81093, - 81097, 81101, 0, 81105, 81109, 81113, 81117, 81121, 81125, 81129, 0, - 81133, 81140, 81146, 81152, 81158, 81166, 81173, 81182, 81194, 81204, - 81213, 81221, 81229, 81237, 81243, 81251, 81258, 81265, 81273, 81283, - 81290, 81299, 81305, 81315, 81324, 81329, 81337, 81346, 81351, 81360, - 81367, 81377, 81389, 81394, 81400, 81407, 81412, 81422, 81432, 81442, - 81452, 81467, 81480, 81491, 81499, 81504, 81516, 81525, 81532, 81539, - 81545, 81551, 81556, 81563, 81569, 81580, 0, 0, 0, 0, 0, 0, 0, 0, 81591, - 81595, 81599, 81603, 81607, 81611, 81616, 81621, 81625, 81630, 81635, - 81640, 81645, 81650, 81654, 81659, 81664, 81669, 81674, 81679, 81683, - 81688, 81693, 81698, 81703, 81708, 81712, 81717, 81722, 81727, 81732, - 81736, 81741, 81746, 81751, 81756, 81761, 81766, 81771, 81776, 81781, - 81786, 81791, 81796, 81801, 81805, 81810, 81815, 81820, 81825, 81830, - 81835, 81840, 81844, 81849, 81854, 81859, 81864, 81869, 81874, 81879, - 81884, 81889, 81894, 81899, 81904, 81909, 81914, 81919, 81924, 81929, - 81934, 81939, 81944, 81949, 81954, 81959, 81964, 81969, 81974, 81978, - 81985, 81992, 81999, 82006, 82012, 82018, 82025, 82032, 82039, 82046, - 82053, 82060, 82067, 82074, 82081, 82087, 82094, 82101, 82108, 82115, - 82122, 82129, 82136, 82143, 82150, 82157, 82164, 82173, 82182, 82191, - 82200, 82209, 82218, 82227, 82236, 82244, 82252, 82260, 82268, 82276, - 82284, 82292, 82300, 82306, 82314, 0, 0, 82322, 82329, 82335, 82341, - 82347, 82353, 82359, 82365, 82371, 82377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82383, 82388, - 82393, 82398, 82403, 82408, 82413, 82418, 82423, 82428, 82433, 82438, - 82443, 82448, 82453, 82458, 82463, 82468, 82473, 82478, 82483, 82488, - 82493, 0, 0, 0, 0, 82498, 82502, 82506, 82510, 82514, 82518, 82522, - 82526, 82530, 82534, 82538, 82542, 82546, 82550, 82554, 82558, 82562, - 82566, 82570, 82574, 82578, 82582, 82586, 82590, 82594, 82598, 82602, - 82606, 82610, 82614, 82618, 82622, 82626, 82630, 82634, 82638, 82642, - 82646, 82650, 82654, 82658, 82662, 82666, 82670, 82674, 82678, 82682, - 82686, 82690, 0, 0, 0, 0, 82694, 82698, 82702, 82706, 82710, 82714, - 82718, 82722, 82726, 82730, 82734, 82738, 82742, 82746, 82750, 82754, - 82758, 82762, 82766, 82770, 82774, 82778, 82782, 82786, 82790, 82794, - 82798, 82802, 82806, 82810, 82814, 82818, 82822, 82826, 82830, 82834, - 82838, 82842, 82846, 82850, 82854, 82858, 82862, 82866, 82870, 82874, - 82878, 82882, 82886, 82890, 82894, 82898, 82902, 82906, 82910, 82914, - 82918, 82922, 82926, 82930, 82934, 82938, 82942, 82946, 82950, 82954, - 82958, 82962, 82966, 82970, 82974, 82978, 82982, 82986, 82990, 82994, - 82998, 83002, 83006, 83010, 83014, 83018, 83022, 83026, 83030, 83034, - 83038, 83042, 83046, 83050, 83054, 83058, 83062, 83066, 83070, 83074, - 83078, 83082, 83086, 83090, 83094, 83098, 83102, 83106, 83110, 83114, - 83118, 83122, 83126, 83130, 83134, 83138, 83142, 83146, 83150, 83154, - 83158, 83162, 83166, 83170, 83174, 83178, 83182, 83186, 83190, 83194, - 83198, 83202, 83206, 83210, 83214, 83218, 83222, 83226, 83230, 83234, - 83238, 83242, 83246, 83250, 83254, 83258, 83262, 83266, 83270, 83274, - 83278, 83282, 83286, 83290, 83294, 83298, 83302, 83306, 83310, 83314, - 83318, 83322, 83326, 83330, 83334, 83338, 83342, 83346, 83350, 83354, - 83358, 83362, 83366, 83370, 83374, 83378, 83382, 83386, 83390, 83394, - 83398, 83402, 83406, 83410, 83414, 83418, 83422, 83426, 83430, 83434, - 83438, 83442, 83446, 83450, 83454, 83458, 83462, 83466, 83470, 83474, - 83478, 83482, 83486, 83490, 83494, 83498, 83502, 83506, 83510, 83514, - 83518, 83522, 83526, 83530, 83534, 83538, 83542, 83546, 83550, 83554, - 83558, 83562, 83566, 83570, 83574, 83578, 83582, 83586, 83590, 83594, - 83598, 83602, 83606, 83610, 83614, 83618, 83622, 83626, 83630, 83634, - 83638, 83642, 83646, 83650, 83654, 83658, 83662, 83666, 83670, 83674, - 83678, 83682, 83686, 83690, 83694, 83698, 83702, 83706, 83710, 83714, - 83718, 83722, 83726, 83730, 83734, 83738, 83742, 83746, 83750, 83754, - 83758, 83762, 83766, 83770, 83774, 83778, 83782, 83786, 83790, 83794, - 83798, 83802, 83806, 83810, 83814, 83818, 83822, 83826, 83830, 83834, - 83838, 83842, 83846, 83850, 83854, 83858, 83862, 83866, 83870, 83874, - 83878, 83882, 83886, 83890, 83894, 83898, 83902, 83906, 83910, 83914, - 83918, 83922, 83926, 83930, 83934, 83938, 83942, 83946, 83950, 83954, - 83958, 83962, 83966, 83970, 83974, 83978, 83982, 83986, 83990, 83994, - 83998, 84002, 84006, 84010, 84014, 84018, 84022, 84026, 84030, 84034, - 84038, 84042, 84046, 84050, 84054, 84058, 84062, 84066, 84070, 84074, - 84078, 84082, 84086, 84090, 84094, 84098, 84102, 84106, 84110, 84114, - 84118, 84122, 84126, 84130, 84134, 84138, 84142, 84146, 84150, 84154, 0, - 0, 84158, 84162, 84166, 84170, 84174, 84178, 84182, 84186, 84190, 84194, - 84198, 84202, 84206, 84210, 84214, 84218, 84222, 84226, 84230, 84234, - 84238, 84242, 84246, 84250, 84254, 84258, 84262, 84266, 84270, 84274, - 84278, 84282, 84286, 84290, 84294, 84298, 84302, 84306, 84310, 84314, - 84318, 84322, 84326, 84330, 84334, 84338, 84342, 84346, 84350, 84354, - 84358, 84362, 84366, 84370, 84374, 84378, 84382, 84386, 84390, 84394, - 84398, 84402, 84406, 84410, 84414, 84418, 84422, 84426, 84430, 84434, - 84438, 84442, 84446, 84450, 84454, 84458, 84462, 84466, 84470, 84474, - 84478, 84482, 84486, 84490, 84494, 84498, 84502, 84506, 84510, 84514, - 84518, 84522, 84526, 84530, 84534, 84538, 84542, 84546, 84550, 84554, - 84558, 84562, 84566, 84570, 84574, 84578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84582, 84587, 84592, 84597, 84602, 84607, 84615, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84620, 84628, 84636, 84644, 84652, 0, 0, 0, 0, 0, - 84660, 84667, 84674, 84684, 84690, 84696, 84702, 84708, 84714, 84720, - 84727, 84733, 84739, 84745, 84754, 84763, 84775, 84787, 84793, 84799, - 84805, 84812, 84819, 84826, 84833, 84840, 0, 84847, 84854, 84861, 84869, - 84876, 0, 84883, 0, 84890, 84897, 0, 84904, 84912, 0, 84919, 84926, - 84933, 84940, 84947, 84954, 84961, 84968, 84975, 84982, 84987, 84994, - 85001, 85007, 85013, 85019, 85026, 85032, 85038, 85044, 85051, 85057, - 85063, 85069, 85076, 85082, 85088, 85094, 85101, 85107, 85113, 85119, - 85126, 85132, 85138, 85144, 85151, 85157, 85163, 85169, 85176, 85182, - 85188, 85194, 85201, 85207, 85213, 85219, 85226, 85232, 85238, 85244, - 85251, 85257, 85263, 85269, 85276, 85282, 85288, 85294, 85301, 85307, - 85313, 85319, 85325, 85331, 85337, 85343, 85349, 85355, 85361, 85367, - 85373, 85379, 85385, 85391, 85398, 85404, 85410, 85416, 85423, 85429, - 85435, 85441, 85448, 85454, 85460, 85466, 85473, 85481, 85489, 85495, - 85501, 85507, 85514, 85523, 85532, 85540, 85548, 85556, 85565, 85573, - 85581, 85589, 85598, 85605, 85612, 85623, 85634, 85638, 85642, 85648, - 85654, 85660, 85666, 85676, 85686, 85693, 85700, 85707, 85715, 85723, - 85727, 85733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85739, - 85745, 85751, 85757, 85764, 85769, 85774, 85780, 85786, 85792, 85798, - 85807, 85813, 85819, 85827, 85835, 85843, 85851, 85857, 85863, 85869, - 85876, 85889, 85903, 85914, 85925, 85937, 85949, 85961, 85973, 85984, - 85995, 86007, 86019, 86031, 86043, 86055, 86067, 86079, 86096, 86113, - 86130, 86137, 86144, 86151, 86159, 86171, 86182, 86193, 86206, 86217, - 86226, 86234, 86243, 86251, 86261, 86269, 86278, 86286, 86295, 86303, - 86313, 86321, 86330, 86338, 86348, 86356, 86364, 86372, 86380, 86387, - 86396, 86404, 86412, 86421, 86429, 86438, 86446, 86454, 86462, 86471, - 86479, 86488, 86496, 86504, 86512, 86520, 86529, 86537, 86546, 86554, - 86563, 86571, 86580, 86588, 86598, 86606, 86614, 86622, 86632, 86640, - 86648, 86657, 86665, 86674, 86683, 86691, 86701, 86709, 86718, 86726, - 86735, 86743, 86753, 86761, 86769, 86776, 86784, 86791, 86800, 86807, - 86816, 86824, 86833, 86841, 86851, 86859, 86868, 86876, 86886, 86894, - 86902, 86909, 86917, 86924, 86933, 86940, 86950, 86960, 86971, 86980, - 86989, 86998, 87007, 87016, 87026, 87038, 87050, 87061, 87073, 87086, - 87097, 87106, 87115, 87123, 87132, 87142, 87150, 87159, 87168, 87176, - 87185, 87195, 87203, 87212, 87221, 87229, 87238, 87248, 87256, 87266, - 87274, 87284, 87292, 87300, 87309, 87317, 87327, 87335, 87343, 87353, - 87361, 87368, 87375, 87384, 87393, 87401, 87410, 87420, 87428, 87439, - 87447, 87455, 87462, 87470, 87479, 87486, 87498, 87509, 87521, 87532, - 87544, 87553, 87561, 87570, 87578, 87587, 87596, 87604, 87613, 87621, - 87630, 87638, 87646, 87654, 87662, 87669, 87678, 87686, 87695, 87703, - 87712, 87720, 87728, 87737, 87745, 87754, 87762, 87771, 87779, 87787, - 87795, 87804, 87812, 87821, 87829, 87838, 87846, 87855, 87863, 87871, - 87879, 87888, 87896, 87905, 87914, 87922, 87931, 87939, 87948, 87956, - 87965, 87973, 87980, 87988, 87995, 88004, 88012, 88021, 88029, 88038, - 88047, 88055, 88065, 88073, 88080, 88088, 88095, 88103, 88115, 88128, - 88137, 88147, 88156, 88166, 88175, 88185, 88194, 88204, 88213, 88223, - 88233, 88242, 88251, 88260, 88270, 88278, 88287, 88297, 88307, 88317, - 88327, 88335, 88345, 88353, 88363, 88371, 88381, 88389, 88399, 88407, - 88416, 88423, 88433, 88441, 88451, 88459, 88469, 88477, 88487, 88495, - 88504, 88512, 88521, 88529, 88538, 88547, 88556, 88565, 88575, 88583, - 88593, 88601, 88611, 88619, 88629, 88637, 88647, 88655, 88664, 88671, - 88681, 88689, 88699, 88707, 88717, 88725, 88735, 88743, 88752, 88760, - 88769, 88777, 88786, 88795, 88804, 88813, 88822, 88830, 88839, 88847, - 88856, 88865, 88873, 88883, 88892, 88902, 88912, 88921, 88931, 88940, - 88949, 88957, 88965, 88970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 88975, 88986, 88997, 89008, 89018, 89029, 89040, 89050, 89061, 89071, - 89081, 89090, 89101, 89112, 89123, 89136, 89146, 89156, 89167, 89177, - 89187, 89197, 89207, 89217, 89227, 89237, 89248, 89259, 89270, 89280, - 89290, 89302, 89313, 89324, 89334, 89344, 89354, 89364, 89375, 89385, - 89395, 89407, 89417, 89427, 89439, 89450, 89461, 89471, 89481, 89491, - 89501, 89513, 89525, 89537, 89548, 89559, 89569, 89579, 89589, 89598, - 89607, 89617, 89627, 89638, 0, 0, 89648, 89659, 89670, 89680, 89690, - 89702, 89713, 89724, 89737, 89747, 89759, 89768, 89777, 89788, 89799, - 89812, 89823, 89836, 89846, 89858, 89868, 89880, 89892, 89905, 89915, - 89925, 89935, 89946, 89956, 89965, 89975, 89984, 89993, 90003, 90013, - 90023, 90033, 90043, 90053, 90064, 90074, 90085, 90095, 90106, 90117, - 90127, 90137, 90147, 90157, 90167, 90177, 90188, 90198, 90209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90220, 90235, 90250, 90256, 90262, - 90268, 90274, 90280, 90286, 90292, 90298, 90306, 90310, 90313, 0, 0, - 90321, 90324, 90327, 90330, 90333, 90336, 90339, 90342, 90345, 90348, - 90351, 90354, 90357, 90360, 90363, 90366, 90369, 90377, 90386, 90397, - 90405, 90413, 90422, 90431, 90442, 90454, 0, 0, 0, 0, 0, 0, 90464, 90469, - 90474, 90481, 90488, 90494, 90500, 90505, 90510, 90515, 90521, 90527, - 90533, 90539, 90545, 90552, 90559, 90569, 90579, 90589, 90598, 90609, - 90618, 90627, 90637, 90647, 90659, 90671, 90682, 90693, 90704, 90715, - 90725, 90735, 90745, 90755, 90766, 90777, 90781, 90786, 90795, 90804, - 90808, 90812, 90816, 90821, 90826, 90831, 90836, 90839, 90843, 0, 90848, - 90851, 90854, 90858, 90862, 90867, 90871, 90875, 90880, 90885, 90892, - 90899, 90902, 90905, 90908, 90911, 90914, 90918, 90922, 0, 90926, 90931, - 90935, 90939, 0, 0, 0, 0, 90944, 90949, 90956, 90961, 90966, 0, 90971, - 90976, 90982, 90987, 90993, 90998, 91004, 91009, 91015, 91020, 91026, - 91032, 91041, 91050, 91059, 91068, 91078, 91088, 91098, 91108, 91117, - 91126, 91135, 91145, 91150, 91155, 91161, 91167, 91173, 91180, 91188, - 91196, 91202, 91208, 91214, 91221, 91227, 91233, 91239, 91246, 91252, - 91258, 91264, 91271, 91276, 91281, 91286, 91292, 91298, 91304, 91310, - 91317, 91323, 91329, 91335, 91341, 91347, 91353, 91359, 91365, 91371, - 91377, 91383, 91390, 91396, 91402, 91408, 91415, 91421, 91427, 91433, - 91440, 91446, 91452, 91458, 91465, 91471, 91477, 91483, 91490, 91496, - 91502, 91508, 91515, 91521, 91527, 91533, 91540, 91546, 91552, 91558, - 91565, 91571, 91577, 91583, 91590, 91596, 91602, 91608, 91615, 91621, - 91627, 91633, 91640, 91646, 91652, 91658, 91665, 91670, 91675, 91680, - 91686, 91692, 91698, 91704, 91711, 91717, 91723, 91729, 91736, 91742, - 91748, 91755, 91762, 91767, 91772, 91777, 91783, 91795, 91807, 91819, - 91831, 91844, 91857, 91865, 0, 0, 91873, 0, 91881, 91885, 91889, 91892, - 91896, 91900, 91903, 91906, 91910, 91914, 91917, 91920, 91923, 91926, - 91931, 91934, 91938, 91941, 91944, 91947, 91950, 91953, 91956, 91959, - 91962, 91965, 91968, 91971, 91975, 91979, 91983, 91987, 91992, 91997, - 92003, 92009, 92015, 92020, 92026, 92032, 92038, 92043, 92049, 92055, - 92060, 92066, 92072, 92077, 92083, 92089, 92094, 92100, 92106, 92111, - 92117, 92123, 92129, 92135, 92141, 92145, 92150, 92154, 92159, 92163, - 92168, 92173, 92179, 92185, 92191, 92196, 92202, 92208, 92214, 92219, - 92225, 92231, 92236, 92242, 92248, 92253, 92259, 92265, 92270, 92276, - 92282, 92287, 92293, 92299, 92305, 92311, 92317, 92322, 92326, 92331, - 92334, 92339, 92344, 92350, 92355, 92360, 92364, 92369, 92374, 92379, - 92384, 92389, 92394, 92399, 92404, 92410, 92416, 92422, 92430, 92434, - 92438, 92442, 92446, 92450, 92454, 92459, 92464, 92469, 92474, 92478, - 92483, 92488, 92493, 92498, 92502, 92507, 92512, 92517, 92521, 92525, - 92530, 92535, 92540, 92545, 92549, 92554, 92559, 92564, 92569, 92573, - 92578, 92583, 92588, 92593, 92597, 92602, 92607, 92611, 92616, 92621, - 92626, 92631, 92636, 92641, 92648, 92655, 92659, 92664, 92669, 92674, - 92679, 92684, 92689, 92694, 92699, 92704, 92709, 92714, 92719, 92724, - 92729, 92734, 92739, 92744, 92749, 92754, 92759, 92764, 92769, 92774, - 92779, 92784, 92789, 92794, 92799, 92804, 0, 0, 0, 92809, 92813, 92818, - 92822, 92827, 92832, 0, 0, 92836, 92841, 92846, 92850, 92855, 92860, 0, - 0, 92865, 92870, 92874, 92879, 92884, 92889, 0, 0, 92894, 92899, 92904, - 0, 0, 0, 92908, 92912, 92916, 92920, 92923, 92927, 92931, 0, 92935, - 92941, 92944, 92948, 92951, 92955, 92959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92963, 92969, 92975, 92981, 92987, 0, 0, 92991, 92997, 93003, 93009, - 93015, 93021, 93028, 93035, 93042, 93049, 93056, 93063, 0, 93070, 93077, - 93084, 93090, 93097, 93104, 93111, 93118, 93124, 93131, 93138, 93145, - 93152, 93158, 93165, 93172, 93179, 93186, 93192, 93199, 93206, 93213, - 93220, 93227, 93234, 93241, 0, 93248, 93254, 93261, 93268, 93275, 93282, - 93288, 93295, 93302, 93309, 93316, 93322, 93329, 93336, 93342, 93349, - 93356, 93363, 93370, 0, 93377, 93384, 0, 93391, 93398, 93405, 93412, - 93419, 93426, 93433, 93440, 93447, 93454, 93461, 93468, 93475, 93482, - 93489, 0, 0, 93495, 93500, 93505, 93510, 93515, 93520, 93525, 93530, - 93535, 93540, 93545, 93550, 93555, 93560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 93565, 93572, 93579, 93586, 93593, 93600, 93607, 93614, 93621, 93628, - 93635, 93642, 93649, 93656, 93663, 93670, 93677, 93684, 93691, 93698, - 93706, 93714, 93721, 93728, 93733, 93741, 93749, 93756, 93763, 93768, - 93775, 93780, 93785, 93792, 93797, 93802, 93807, 93815, 93820, 93825, - 93832, 93837, 93842, 93849, 93856, 93861, 93866, 93871, 93876, 93881, - 93886, 93891, 93896, 93901, 93908, 93913, 93920, 93925, 93930, 93935, - 93940, 93945, 93950, 93955, 93960, 93965, 93970, 93975, 93982, 93989, - 93996, 94003, 94009, 94014, 94021, 94026, 94031, 94040, 94047, 94056, - 94063, 94068, 94073, 94081, 94086, 94091, 94096, 94101, 94106, 94113, - 94118, 94123, 94128, 94133, 94138, 94145, 94152, 94159, 94166, 94173, - 94180, 94187, 94194, 94201, 94208, 94215, 94222, 94229, 94236, 94243, - 94250, 94257, 94264, 94271, 94278, 94285, 94292, 94299, 94306, 94313, - 94320, 94327, 94334, 0, 0, 0, 0, 0, 94341, 94349, 94357, 0, 0, 0, 0, - 94362, 94366, 94370, 94374, 94378, 94382, 94386, 94390, 94394, 94398, - 94403, 94408, 94413, 94418, 94423, 94428, 94433, 94438, 94443, 94449, - 94455, 94461, 94468, 94475, 94482, 94489, 94496, 94503, 94508, 94513, - 94518, 94524, 94530, 94536, 94542, 94548, 94554, 94560, 94566, 94572, - 94578, 94584, 94590, 94596, 94602, 0, 0, 0, 94608, 94616, 94624, 94632, - 94640, 94648, 94658, 94668, 94676, 94684, 94692, 94700, 94708, 94714, - 94721, 94730, 94738, 94746, 94755, 94764, 94773, 94783, 94794, 94804, - 94815, 94824, 94833, 94842, 94852, 94863, 94873, 94884, 94895, 94904, - 94912, 94918, 94924, 94930, 94936, 94944, 94952, 94958, 94965, 94975, - 94982, 94989, 94996, 95003, 95010, 95020, 95027, 95034, 95042, 95050, - 95059, 95068, 95077, 95086, 95095, 95102, 95110, 95119, 95128, 95132, - 95139, 95144, 95149, 95153, 95157, 95161, 95165, 95170, 95175, 95181, - 95187, 95191, 95197, 95201, 95205, 95209, 95213, 95217, 95221, 95227, - 95231, 95236, 95240, 95244, 0, 95247, 95252, 95257, 95262, 95267, 95274, - 95279, 95284, 95289, 95294, 95299, 95304, 0, 0, 0, 0, 95309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95315, 95322, - 95331, 95340, 95347, 95354, 95361, 95368, 95375, 95382, 95388, 95395, - 95402, 95409, 95416, 95423, 95430, 95437, 95444, 95453, 95460, 95467, - 95474, 95481, 95488, 95495, 95502, 95509, 95518, 95525, 95532, 95539, - 95546, 95553, 95560, 95569, 95576, 95583, 95590, 95597, 95606, 95613, - 95620, 95627, 95635, 95644, 0, 0, 95653, 95657, 95661, 95666, 95671, - 95676, 95681, 95685, 95690, 95695, 95700, 95705, 95710, 95715, 95719, - 95724, 95729, 95734, 95739, 95743, 95748, 95753, 95757, 95762, 95767, - 95772, 95777, 95782, 95787, 0, 0, 0, 95792, 95796, 95801, 95806, 95810, - 95815, 95819, 95824, 95829, 95834, 95839, 95844, 95848, 95853, 95858, - 95863, 95868, 95873, 95878, 95882, 95887, 95892, 95897, 95902, 95907, - 95912, 95916, 95920, 95925, 95930, 95935, 95940, 95945, 95950, 95955, - 95960, 95965, 95970, 95975, 95980, 95985, 95990, 95995, 96000, 96005, - 96010, 96015, 96020, 96025, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 96030, 96036, 96041, 96046, 96051, 96056, 96061, 96066, 96071, 96076, - 96081, 96087, 96093, 96099, 96105, 96111, 96117, 96123, 96129, 96135, - 96142, 96149, 96156, 96164, 96172, 96180, 96188, 96196, 0, 0, 0, 0, - 96204, 96208, 96213, 96218, 96223, 96227, 96232, 96237, 96242, 96247, - 96251, 96255, 96260, 96265, 96270, 96275, 96279, 96284, 96289, 96294, - 96299, 96304, 96309, 96313, 96318, 96323, 96328, 96333, 96338, 96343, - 96348, 96353, 96358, 96363, 96368, 96374, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 96380, 96385, 96392, 96399, 96404, 96409, 96414, 96419, 96424, 96429, - 96434, 96439, 96444, 96449, 96454, 96459, 96464, 96469, 96474, 96479, - 96484, 96489, 96494, 96499, 96504, 96509, 96514, 96519, 96524, 96529, 0, - 0, 0, 0, 0, 96536, 96542, 96548, 96554, 96560, 96565, 96571, 96577, - 96583, 96589, 96594, 96600, 96606, 96612, 96618, 96624, 96630, 96636, - 96642, 96648, 96653, 96659, 96665, 96671, 96677, 96683, 96688, 96694, - 96700, 96705, 96711, 96717, 96723, 96729, 96735, 96741, 96747, 96752, - 96758, 96765, 96772, 96779, 96786, 0, 0, 0, 0, 0, 96793, 96798, 96803, - 96808, 96813, 96818, 96823, 96828, 96833, 96838, 96843, 96848, 96853, - 96858, 96863, 96868, 96873, 96878, 96883, 96888, 96893, 96898, 96903, - 96908, 96913, 96918, 96923, 96927, 96931, 96935, 0, 96940, 96946, 96951, - 96956, 96961, 96966, 96972, 96978, 96984, 96990, 96996, 97002, 97008, - 97013, 97019, 97025, 97031, 97037, 97043, 97048, 97054, 97060, 97065, - 97071, 97076, 97082, 97088, 97093, 97099, 97105, 97110, 97116, 97121, - 97126, 97132, 97138, 97144, 0, 0, 0, 0, 97149, 97155, 97161, 97167, - 97173, 97179, 97185, 97191, 97197, 97204, 97209, 97214, 97220, 97226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97232, 97238, 97244, - 97250, 97257, 97263, 97270, 97277, 97284, 97291, 97299, 97306, 97314, - 97320, 97326, 97332, 97338, 97344, 97350, 97356, 97362, 97368, 97374, - 97380, 97386, 97392, 97398, 97404, 97410, 97416, 97422, 97428, 97434, - 97440, 97446, 97452, 97458, 97464, 97470, 97476, 97482, 97488, 97494, - 97500, 97507, 97513, 97520, 97527, 97534, 97541, 97549, 97556, 97564, - 97570, 97576, 97582, 97588, 97594, 97600, 97606, 97612, 97618, 97624, - 97630, 97636, 97642, 97648, 97654, 97660, 97666, 97672, 97678, 97684, - 97690, 97696, 97702, 97708, 97714, 97720, 97726, 97732, 97737, 97742, - 97747, 97752, 97757, 97762, 97767, 97772, 97777, 97782, 97787, 97792, - 97797, 97802, 97807, 97812, 97817, 97822, 97827, 97832, 97837, 97842, - 97847, 97852, 97857, 97862, 97867, 97872, 97877, 97882, 97887, 97892, - 97897, 97902, 97907, 97912, 97917, 97922, 97927, 97932, 97937, 97942, - 97947, 97952, 97957, 97962, 97967, 97972, 97977, 97982, 97986, 97991, - 97996, 98001, 98006, 98010, 98014, 98019, 98024, 98029, 98034, 98039, - 98044, 98049, 98054, 98059, 98064, 98069, 98073, 98077, 98081, 98085, - 98089, 98093, 98097, 98102, 98107, 0, 0, 98112, 98117, 98121, 98125, - 98129, 98133, 98137, 98141, 98145, 98149, 0, 0, 0, 0, 0, 0, 98153, 98158, - 98164, 98170, 98176, 98182, 98188, 98194, 98199, 98205, 98210, 98216, - 98221, 98226, 98232, 98238, 98243, 98248, 98253, 98258, 98264, 98269, - 98275, 98280, 98286, 98291, 98297, 98303, 98309, 98315, 98321, 98326, - 98332, 98338, 98344, 98350, 0, 0, 0, 0, 98356, 98361, 98367, 98373, - 98379, 98385, 98391, 98397, 98402, 98408, 98413, 98419, 98424, 98429, - 98435, 98441, 98446, 98451, 98456, 98461, 98467, 98472, 98478, 98483, - 98489, 98494, 98500, 98506, 98512, 98518, 98524, 98529, 98535, 98541, - 98547, 98553, 0, 0, 0, 0, 98559, 98563, 98568, 98573, 98578, 98583, - 98588, 98593, 98598, 98602, 98607, 98612, 98617, 98622, 98626, 98631, - 98636, 98641, 98646, 98651, 98656, 98660, 98665, 98669, 98674, 98679, - 98684, 98689, 98694, 98699, 98704, 98709, 98713, 98718, 98723, 98728, - 98733, 98738, 98743, 98748, 0, 0, 0, 0, 0, 0, 0, 0, 98753, 98760, 98767, - 98774, 98781, 98788, 98795, 98802, 98809, 98816, 98823, 98830, 98837, - 98844, 98851, 98858, 98865, 98872, 98879, 98886, 98893, 98900, 98907, - 98914, 98921, 98928, 98935, 98942, 98949, 98956, 98963, 98970, 98977, - 98984, 98991, 98998, 99005, 99012, 99019, 99026, 99033, 99040, 99047, - 99054, 99061, 99068, 99075, 99082, 99089, 99096, 99103, 99110, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 99117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99124, 99129, 99134, 99139, 99144, 99149, 99154, 99159, 99164, - 99169, 99174, 99179, 99184, 99189, 99194, 99199, 99204, 99209, 99214, - 99219, 99224, 99229, 99234, 99239, 99244, 99249, 99254, 99259, 99264, - 99269, 99274, 99279, 99284, 99289, 99294, 99299, 99304, 99309, 99314, - 99319, 99324, 99329, 99334, 99339, 99344, 99349, 99354, 99359, 99364, - 99369, 99374, 99379, 99384, 99389, 99394, 99399, 99404, 99409, 99414, - 99419, 99424, 99429, 99434, 99439, 99444, 99449, 99454, 99459, 99464, - 99469, 99474, 99479, 99484, 99489, 99494, 99499, 99504, 99509, 99514, - 99519, 99524, 99529, 99534, 99539, 99544, 99549, 99554, 99559, 99564, - 99569, 99574, 99579, 99584, 99589, 99594, 99599, 99604, 99609, 99614, - 99619, 99624, 99629, 99634, 99639, 99644, 99649, 99654, 99659, 99664, - 99669, 99674, 99679, 99684, 99689, 99694, 99699, 99704, 99709, 99714, - 99719, 99724, 99729, 99734, 99739, 99744, 99749, 99754, 99759, 99764, - 99769, 99774, 99779, 99784, 99789, 99794, 99799, 99804, 99809, 99814, - 99819, 99824, 99829, 99834, 99839, 99844, 99849, 99854, 99859, 99864, - 99869, 99874, 99879, 99884, 99889, 99894, 99899, 99904, 99909, 99914, - 99919, 99924, 99929, 99934, 99939, 99944, 99949, 99954, 99959, 99964, - 99969, 99974, 99979, 99984, 99989, 99994, 99999, 100004, 100009, 100014, - 100019, 100024, 100029, 100034, 100039, 100044, 100049, 100054, 100059, - 100064, 100069, 100074, 100079, 100084, 100089, 100094, 100099, 100104, - 100109, 100114, 100119, 100124, 100129, 100134, 100139, 100144, 100149, - 100154, 100159, 100164, 100169, 100174, 100179, 100184, 100189, 100194, - 100199, 100204, 100209, 100214, 100219, 100224, 100229, 100234, 100239, - 100244, 100249, 100254, 100259, 100264, 100269, 100274, 100279, 100284, - 100289, 100294, 100299, 100304, 100309, 100314, 100319, 100324, 100329, - 100334, 100339, 100344, 100349, 100354, 100359, 100364, 100369, 100374, - 100379, 100384, 100389, 100394, 100399, 100404, 100409, 100414, 100419, - 100424, 100429, 100434, 100439, 100444, 100449, 100454, 100459, 100464, - 100469, 100474, 100479, 100484, 100489, 100494, 100499, 100504, 100509, - 100514, 100519, 100524, 100529, 100534, 100539, 100544, 100549, 100554, - 100559, 100564, 100569, 100574, 100579, 100584, 100589, 100594, 100599, - 100604, 100609, 100614, 100619, 100624, 100629, 100634, 100639, 100644, - 100649, 100654, 100659, 100664, 100669, 100674, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 100679, 100685, 100692, 100699, 100705, 100712, 100719, 100726, - 100733, 100739, 100746, 100753, 100760, 100767, 100774, 100781, 100788, - 100795, 100802, 100809, 100816, 100823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 100830, 100835, 100840, 100845, 100850, 100855, 100860, 100865, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100870, - 100874, 100878, 100882, 100886, 100890, 0, 0, 100895, 0, 100900, 100904, - 100909, 100914, 100919, 100924, 100928, 100933, 100938, 100943, 100948, - 100952, 100957, 100962, 100967, 100972, 100976, 100981, 100986, 100991, - 100996, 101000, 101005, 101010, 101015, 101020, 101024, 101029, 101034, - 101039, 101044, 101048, 101053, 101058, 101063, 101068, 101072, 101077, - 101082, 101086, 101091, 101096, 101101, 101106, 0, 101111, 101116, 0, 0, - 0, 101121, 0, 0, 101126, 101131, 101138, 101145, 101152, 101159, 101166, - 101173, 101180, 101187, 101194, 101201, 101208, 101215, 101222, 101229, - 101236, 101243, 101250, 101257, 101264, 101271, 101278, 0, 101285, - 101292, 101298, 101304, 101310, 101317, 101324, 101332, 101339, 101347, - 101352, 101357, 101362, 101367, 101372, 101377, 101382, 101387, 101392, - 101397, 101402, 101407, 101412, 101418, 101423, 101428, 101433, 101438, - 101443, 101448, 101453, 101458, 101463, 101469, 101475, 101479, 101483, - 101487, 101491, 101495, 101500, 101505, 101511, 101516, 101522, 101527, - 101532, 101537, 101543, 101548, 101553, 101558, 101563, 101568, 101574, - 101579, 101585, 101590, 101596, 101601, 101607, 101612, 101618, 101623, - 101628, 101633, 101638, 101643, 101648, 101653, 101659, 101664, 0, 0, 0, - 0, 0, 0, 0, 0, 101669, 101673, 101677, 101681, 101685, 101691, 101695, - 101700, 101705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 101711, 101716, 101721, 101726, 101731, 101736, 101741, - 101746, 101751, 101756, 101761, 101766, 101771, 101776, 101781, 101786, - 101791, 101796, 101801, 0, 101806, 101811, 0, 0, 0, 0, 0, 101816, 101820, - 101824, 101829, 101834, 101840, 101845, 101850, 101855, 101860, 101865, - 101870, 101875, 101880, 101885, 101890, 101895, 101900, 101905, 101910, - 101915, 101920, 101925, 101930, 101935, 101940, 101945, 101950, 101954, - 101959, 101964, 101970, 101974, 0, 0, 0, 101978, 101984, 101988, 101993, - 101998, 102003, 102007, 102012, 102016, 102021, 102026, 102030, 102035, - 102040, 102044, 102048, 102053, 102058, 102062, 102067, 102072, 102077, - 102082, 102087, 102092, 102097, 102102, 0, 0, 0, 0, 0, 102107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102112, 102117, 102122, 102127, - 102132, 102137, 102143, 102149, 102155, 102160, 102165, 102170, 102176, - 102182, 102188, 102193, 102199, 102204, 102210, 102216, 102221, 102227, - 102233, 102238, 102244, 102249, 102255, 102261, 102267, 102272, 102278, - 102284, 102290, 102295, 102300, 102305, 102310, 102315, 102321, 102327, - 102332, 102337, 102342, 102348, 102353, 102358, 102364, 102370, 102375, - 102382, 102388, 102393, 102399, 102404, 102410, 102415, 0, 0, 0, 0, - 102421, 102429, 102436, 102443, 102450, 102455, 102460, 102465, 102470, - 102475, 102480, 102485, 102490, 102495, 102501, 102507, 102513, 102519, - 102525, 102531, 0, 0, 102537, 102544, 102551, 102558, 102566, 102574, - 102582, 102590, 102598, 102606, 102612, 102618, 102624, 102631, 102638, - 102645, 102652, 102659, 102666, 102673, 102680, 102687, 102694, 102701, - 102708, 102715, 102722, 102729, 102737, 102745, 102753, 102762, 102771, - 102780, 102789, 102798, 102807, 102814, 102821, 102828, 102836, 102844, - 102852, 102860, 102868, 102876, 102884, 102888, 102893, 102898, 0, - 102904, 102909, 0, 0, 0, 0, 0, 102914, 102920, 102927, 102932, 102937, - 102941, 102946, 102951, 0, 102956, 102961, 102966, 0, 102971, 102976, - 102981, 102986, 102991, 102996, 103001, 103005, 103010, 103015, 103020, - 103024, 103028, 103033, 103038, 103043, 103047, 103051, 103055, 103059, - 103064, 103069, 103074, 103078, 103083, 103087, 103092, 103097, 103102, - 0, 0, 103107, 103113, 103118, 0, 0, 0, 0, 103123, 103127, 103131, 103135, - 103139, 103143, 103148, 103153, 103159, 103164, 0, 0, 0, 0, 0, 0, 0, - 103170, 103176, 103183, 103189, 103196, 103202, 103208, 103214, 103221, - 0, 0, 0, 0, 0, 0, 0, 103227, 103235, 103243, 103251, 103259, 103267, - 103275, 103283, 103291, 103299, 103307, 103315, 103323, 103331, 103339, - 103347, 103355, 103363, 103371, 103379, 103387, 103395, 103403, 103411, - 103419, 103427, 103435, 103443, 103451, 103459, 103466, 103474, 103482, - 103489, 103496, 103503, 103510, 103517, 103524, 103531, 103538, 103545, - 103552, 103559, 103566, 103573, 103580, 103587, 103594, 103601, 103608, - 103615, 103622, 103629, 103636, 103643, 103650, 103657, 103664, 103671, - 103678, 103685, 103691, 103698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103705, 103710, - 103715, 103720, 103725, 103730, 103735, 103740, 103745, 103750, 103755, - 103760, 103765, 103770, 103775, 103780, 103785, 103790, 103795, 103800, - 103805, 103810, 103815, 103820, 103825, 103830, 103835, 103840, 103845, - 103850, 103855, 103860, 103865, 103870, 103875, 103880, 103885, 103890, - 103896, 0, 0, 0, 0, 103902, 103906, 103910, 103915, 103920, 103926, - 103932, 103938, 103948, 103957, 103963, 103970, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 103978, 103982, 103987, 103992, 103997, 104002, 104007, 104012, - 104017, 104021, 104026, 104030, 104035, 104039, 104044, 104048, 104053, - 104058, 104063, 104068, 104073, 104078, 104083, 104088, 104093, 104098, - 104103, 104108, 104113, 104118, 104123, 104128, 104133, 104138, 104143, - 104148, 104153, 104158, 104163, 104168, 104173, 104178, 104183, 104188, - 104193, 104198, 104203, 104208, 104213, 104218, 104223, 104228, 104233, - 104238, 0, 0, 0, 104243, 104248, 104258, 104267, 104277, 104287, 104298, - 104309, 104316, 104323, 104330, 104337, 104344, 104351, 104358, 104365, - 104372, 104379, 104386, 104393, 104400, 104407, 104414, 104421, 104428, - 104435, 104442, 104449, 104456, 0, 0, 104463, 104469, 104475, 104481, - 104487, 104494, 104501, 104509, 104516, 104523, 104530, 104537, 104544, - 104551, 104558, 104565, 104572, 104579, 104586, 104593, 104600, 104607, - 104614, 104621, 104628, 104635, 104642, 0, 0, 0, 0, 0, 104649, 104655, - 104661, 104667, 104673, 104680, 104687, 104695, 104702, 104709, 104716, - 104723, 104730, 104737, 104744, 104751, 104758, 104765, 104772, 104779, - 104786, 104793, 104800, 104807, 104814, 104821, 0, 0, 0, 0, 0, 0, 0, - 104828, 104835, 104843, 104854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 104865, 104871, 104877, 104883, 104889, 104896, 104903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68457, 68466, 68475, 68486, 68493, 68498, + 68503, 68510, 68517, 68523, 68528, 68533, 68538, 68543, 68550, 68555, + 68560, 68565, 68576, 68581, 68586, 68593, 68598, 68605, 68610, 68615, + 68622, 68629, 68636, 68645, 68654, 68659, 68664, 68669, 68676, 68681, + 68691, 68698, 68703, 68708, 68713, 68718, 68723, 68728, 68736, 68743, + 68750, 68755, 68762, 68767, 68774, 68783, 68794, 68799, 68808, 68813, + 68820, 68829, 68838, 68843, 68848, 68855, 68861, 68868, 68875, 68879, + 68883, 68886, 68890, 68894, 68898, 68902, 68906, 68910, 68914, 68917, + 68921, 68925, 68929, 68933, 68937, 68941, 68944, 68948, 68952, 68955, + 68959, 68963, 68967, 68971, 68975, 68979, 68983, 68987, 68991, 68995, + 68999, 69003, 69007, 69011, 69015, 69019, 69023, 69027, 69031, 69035, + 69039, 69043, 69047, 69051, 69055, 69059, 69063, 69067, 69071, 69075, + 69079, 69083, 69087, 69091, 69095, 69099, 69103, 69107, 69111, 69115, + 69119, 69123, 69127, 69131, 69134, 69138, 69142, 69146, 69150, 69154, + 69158, 69162, 69166, 69170, 69174, 69178, 69182, 69186, 69190, 69194, + 69198, 69202, 69206, 69210, 69214, 69218, 69222, 69226, 69230, 69234, + 69238, 69242, 69246, 69250, 69254, 69258, 69262, 69266, 69270, 69274, + 69278, 69282, 69286, 69290, 69294, 69298, 69302, 69306, 69310, 69314, + 69318, 69322, 69326, 69330, 69334, 69338, 69342, 69346, 69350, 69354, + 69358, 69362, 69366, 69370, 69374, 69378, 69382, 69386, 69390, 69394, + 69398, 69402, 69406, 69410, 69414, 69418, 69422, 69426, 69430, 69434, + 69438, 69442, 69446, 69450, 69454, 69458, 69462, 69466, 69470, 69474, + 69478, 69482, 69486, 69490, 69494, 69498, 69502, 69506, 69510, 69514, + 69518, 69522, 69526, 69530, 69534, 69538, 69542, 69546, 69550, 69554, + 69558, 69562, 69566, 69570, 69574, 69578, 69582, 69586, 69590, 69594, + 69598, 69602, 69605, 69609, 69613, 69617, 69621, 69625, 69629, 69633, + 69637, 69641, 69645, 69649, 69653, 69657, 69661, 69665, 69669, 69673, + 69677, 69681, 69685, 69689, 69693, 69697, 69701, 69705, 69709, 69713, + 69717, 69721, 69725, 69729, 69733, 69737, 69741, 69745, 69749, 69753, + 69757, 69761, 69765, 69769, 69773, 69777, 69781, 69785, 69789, 69793, + 69797, 69801, 69805, 69809, 69813, 69817, 69821, 69825, 69829, 69833, + 69837, 69841, 69845, 69849, 69853, 69857, 69861, 69865, 69869, 69873, + 69877, 69881, 69885, 69889, 69893, 69897, 69901, 69905, 69909, 69913, + 69917, 69921, 69925, 69929, 69933, 69937, 69941, 69945, 69949, 69953, + 69957, 69961, 69965, 69969, 69973, 69977, 69981, 69985, 69989, 69993, + 69997, 70001, 70005, 70009, 70013, 70017, 70021, 70025, 70029, 70033, + 70036, 70040, 70044, 70048, 70052, 70056, 70060, 70064, 70067, 70071, + 70075, 70079, 70083, 70087, 70091, 70095, 70099, 70103, 70107, 70111, + 70115, 70119, 70123, 70127, 70131, 70135, 70139, 70143, 70147, 70151, + 70155, 70159, 70163, 70167, 70171, 70175, 70179, 70183, 70187, 70191, + 70195, 70199, 70203, 70207, 70211, 70215, 70219, 70223, 70227, 70231, + 70235, 70239, 70243, 70247, 70251, 70255, 70259, 70263, 70267, 70271, + 70275, 70279, 70283, 70287, 70291, 70295, 70299, 70303, 70307, 70311, + 70315, 70319, 70323, 70327, 70331, 70335, 70339, 70343, 70347, 70351, + 70355, 70359, 70363, 70367, 70371, 70375, 70379, 70383, 70387, 70391, + 70395, 70399, 70403, 70407, 70411, 70415, 70419, 70423, 70426, 70430, + 70434, 70438, 70442, 70446, 70450, 70454, 70458, 70462, 70466, 70470, + 70474, 70478, 70482, 70486, 70490, 70494, 70498, 70502, 70506, 70510, + 70514, 70518, 70522, 70526, 70530, 70534, 70538, 70542, 70546, 70550, + 70554, 70558, 70562, 70566, 70570, 70574, 70578, 70582, 70586, 70590, + 70594, 70598, 70602, 70606, 70610, 70614, 70618, 70622, 70626, 70630, + 70634, 70638, 70642, 70646, 70650, 70654, 70658, 70662, 70665, 70669, + 70673, 70677, 70681, 70685, 70689, 70693, 70697, 70701, 70705, 70709, + 70713, 70717, 70721, 70725, 70729, 70733, 70737, 70741, 70745, 70749, + 70753, 70757, 70761, 70765, 70769, 70773, 70777, 70781, 70785, 70789, + 70793, 70797, 70801, 70805, 70809, 70813, 70817, 70821, 70825, 70829, + 70833, 70837, 70841, 70845, 70849, 70853, 70857, 70861, 70865, 70869, + 70873, 70877, 70881, 70885, 70889, 70893, 70897, 70901, 70905, 70909, + 70913, 70917, 70920, 70924, 70928, 70932, 70936, 70940, 70944, 70948, + 70952, 70956, 70960, 70964, 70968, 70972, 70976, 70980, 70984, 70988, + 70992, 70996, 71000, 71004, 71008, 71012, 71016, 71020, 71024, 71028, + 71032, 71036, 71040, 71044, 71048, 71052, 71056, 71060, 71064, 71068, + 71072, 71076, 71080, 71084, 71088, 71092, 71096, 71100, 71104, 71108, + 71112, 71116, 71120, 71124, 71128, 71132, 71136, 71140, 71144, 71148, + 71152, 71156, 71160, 71164, 71168, 71172, 71176, 71180, 71184, 71188, + 71192, 71196, 71200, 71204, 71208, 71212, 71216, 71220, 71224, 71228, + 71232, 71236, 71240, 71244, 71248, 71252, 71256, 71260, 71264, 71268, + 71272, 71276, 71280, 71284, 71288, 71292, 71296, 71300, 71304, 71308, + 71312, 71316, 71320, 71324, 71328, 71332, 71336, 71340, 71344, 71348, + 71352, 71356, 71360, 71364, 71368, 71372, 71375, 71379, 71383, 71387, + 71391, 71395, 71399, 71403, 71407, 71411, 71415, 71419, 71423, 71427, + 71431, 71435, 71439, 71443, 71447, 71451, 71455, 71459, 71463, 71467, + 71471, 71475, 71479, 71483, 71487, 71491, 71495, 71499, 71503, 71507, + 71511, 71515, 71519, 71523, 71527, 71531, 71535, 71539, 71543, 71547, + 71551, 71555, 71559, 71563, 71567, 71571, 71575, 71579, 71583, 71587, + 71591, 71595, 71599, 71603, 71607, 71611, 71615, 71619, 71623, 71627, + 71631, 71635, 71639, 71643, 71647, 71651, 71655, 71659, 71663, 71667, + 71671, 71675, 71679, 71683, 71687, 71691, 71695, 71699, 71703, 71707, + 71711, 71715, 71719, 71723, 71727, 71731, 71735, 71739, 71743, 71747, + 71751, 71755, 71759, 71763, 71767, 71771, 71775, 71779, 71783, 71787, + 71791, 71795, 71799, 71803, 71807, 71811, 71815, 71819, 71823, 71827, + 71831, 71835, 71839, 71843, 71847, 71851, 71855, 71859, 71863, 71867, + 71871, 71875, 71879, 71883, 71887, 71891, 71895, 71899, 71903, 71907, + 71911, 71915, 71919, 71923, 71927, 71931, 71935, 71939, 71943, 71947, + 71951, 71955, 71959, 71963, 71967, 71971, 71975, 71978, 71982, 71986, + 71990, 71994, 71998, 72002, 72006, 72009, 72013, 72017, 72021, 72025, + 72029, 72033, 72037, 72041, 72045, 72049, 72053, 72057, 72061, 72065, + 72069, 72073, 72077, 72081, 72085, 72089, 72093, 72097, 72101, 72105, + 72109, 72113, 72117, 72121, 72125, 72129, 72133, 72137, 72141, 72145, + 72149, 72153, 72157, 72161, 72165, 72169, 72173, 72177, 72181, 72185, + 72189, 72193, 72197, 72201, 72205, 72209, 72213, 72217, 72221, 72225, + 72229, 72233, 72237, 72241, 72245, 72249, 72253, 72257, 72261, 72265, + 72269, 72273, 72277, 72281, 72285, 72289, 72293, 72297, 72301, 72305, + 72309, 72313, 72317, 72321, 72325, 72329, 72333, 72337, 72341, 72345, + 72349, 72353, 72357, 72361, 72365, 72369, 72373, 72377, 72381, 72385, + 72389, 72393, 72397, 72401, 72405, 72409, 72413, 72417, 72421, 72425, + 72429, 72433, 72437, 72441, 72445, 72449, 72453, 72457, 72461, 72465, + 72469, 72473, 72477, 72481, 72485, 72489, 72493, 72497, 72501, 72505, + 72509, 72513, 72517, 72521, 72525, 72529, 72533, 72537, 72541, 72545, + 72549, 72553, 72557, 72561, 72565, 72569, 72573, 72577, 72581, 72585, + 72589, 72593, 72597, 72601, 72605, 72609, 72613, 72617, 72621, 72625, + 72629, 72633, 72637, 72641, 72645, 72649, 72653, 72657, 72661, 72665, + 72669, 72673, 72677, 72681, 72685, 72689, 72693, 72697, 72701, 72705, + 72709, 72713, 72717, 72721, 72725, 72729, 72733, 72736, 72740, 72744, + 72748, 72752, 72756, 72760, 72764, 72768, 72772, 72776, 72780, 72784, + 72788, 72792, 72796, 72800, 72804, 72808, 72812, 72816, 72820, 72824, + 72828, 72832, 72836, 72840, 72844, 72848, 72852, 72856, 72860, 72864, + 72868, 72872, 72876, 72880, 72884, 72888, 72892, 72896, 72900, 72904, + 72908, 72912, 72916, 72920, 72924, 72928, 72932, 72936, 72940, 72944, + 72948, 72952, 72956, 72960, 72964, 72968, 72972, 72976, 72980, 72984, + 72988, 72992, 72996, 73000, 73004, 73008, 73012, 73016, 73020, 73024, + 73028, 73032, 73036, 73040, 73044, 73048, 73052, 73056, 73060, 73064, + 73068, 73072, 73076, 73080, 73084, 73088, 73092, 73096, 73100, 73104, + 73108, 73112, 73116, 73120, 73124, 73128, 73132, 73136, 73140, 73144, + 73148, 73152, 73156, 73160, 73164, 73168, 73172, 73176, 73180, 73184, + 73188, 73192, 73196, 73200, 73204, 73208, 73212, 73216, 73220, 73224, + 73228, 73232, 73236, 73240, 73244, 73248, 73252, 73256, 73260, 73264, + 73268, 73272, 73276, 73280, 73284, 73288, 73292, 73296, 73300, 73304, + 73308, 73312, 73316, 73320, 73324, 73328, 73332, 73336, 73340, 73344, + 73348, 73352, 73356, 73360, 73364, 73368, 73372, 73376, 73380, 73384, + 73388, 73392, 73396, 73400, 73404, 73408, 73412, 73416, 73420, 73424, + 73428, 73432, 73436, 73440, 73444, 73448, 73452, 73456, 73460, 73464, + 73468, 73472, 73476, 73480, 73484, 73488, 73492, 73496, 73500, 73504, + 73508, 73512, 73516, 0, 0, 0, 73520, 73524, 73528, 73532, 73536, 73540, + 73544, 73548, 73552, 73556, 73560, 73564, 73568, 73572, 73576, 73580, + 73584, 73588, 73592, 73596, 73600, 73604, 73608, 73612, 73616, 73620, + 73624, 73628, 73632, 73636, 73640, 73644, 73648, 73652, 73656, 73660, + 73664, 73668, 73672, 73676, 73680, 73684, 73688, 73692, 73696, 73700, + 73704, 73708, 73712, 73716, 73720, 73724, 73728, 73732, 73736, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 73740, 73745, 73749, 73754, 73759, 73763, 73768, 73773, + 73777, 73782, 73787, 73792, 73797, 73802, 73807, 73812, 73816, 73820, + 73824, 73828, 73833, 73838, 73843, 73847, 73852, 73857, 73862, 73867, + 73872, 73876, 73881, 73885, 73890, 73894, 73899, 73903, 73907, 73911, + 73916, 73921, 73926, 73934, 73942, 73950, 73958, 73965, 73973, 73979, + 73987, 73991, 73995, 73999, 74003, 74007, 74011, 74015, 74019, 74023, + 74027, 74031, 74035, 74039, 74043, 74047, 74051, 74055, 74059, 74063, + 74067, 74071, 74075, 74079, 74083, 74087, 74091, 74095, 74099, 74103, + 74107, 74111, 74115, 74119, 74123, 74127, 74131, 74134, 74138, 74142, + 74146, 74150, 74154, 74158, 74162, 74166, 74170, 74174, 74178, 74182, + 74186, 74190, 74194, 74198, 74202, 74206, 74210, 74214, 74218, 74222, + 74226, 74230, 74234, 74238, 74242, 74246, 74250, 74254, 74258, 74262, + 74266, 74270, 74274, 74278, 74281, 74285, 74289, 74292, 74296, 74300, + 74304, 74307, 74311, 74315, 74319, 74323, 74327, 74331, 74335, 74339, + 74343, 74346, 74350, 74354, 74358, 74361, 74364, 74368, 74372, 74375, + 74379, 74383, 74387, 74391, 74395, 74399, 74402, 74405, 74409, 74413, + 74417, 74420, 74423, 74427, 74431, 74435, 74439, 74443, 74447, 74451, + 74455, 74459, 74463, 74467, 74471, 74475, 74479, 74483, 74487, 74491, + 74495, 74499, 74503, 74507, 74511, 74515, 74519, 74523, 74527, 74531, + 74535, 74539, 74543, 74547, 74551, 74555, 74559, 74563, 74567, 74571, + 74574, 74578, 74582, 74586, 74590, 74594, 74598, 74602, 74606, 74610, + 74614, 74618, 74622, 74626, 74630, 74634, 74638, 74642, 74646, 74650, + 74654, 74658, 74662, 74666, 74670, 74674, 74678, 74682, 74686, 74690, + 74694, 74698, 74702, 74706, 74710, 74714, 74718, 74721, 74725, 74729, + 74733, 74737, 74741, 74745, 74749, 74753, 74757, 74761, 74765, 74769, + 74773, 74777, 74781, 74785, 74788, 74792, 74796, 74800, 74804, 74808, + 74812, 74816, 74820, 74824, 74828, 74832, 74836, 74840, 74844, 74848, + 74852, 74856, 74860, 74864, 74868, 74872, 74875, 74879, 74883, 74887, + 74891, 74895, 74899, 74903, 74907, 74911, 74915, 74919, 74923, 74927, + 74931, 74935, 74939, 74943, 74947, 74951, 74955, 74959, 74963, 74967, + 74971, 74975, 74979, 74983, 74987, 74991, 74995, 74999, 75003, 75007, + 75011, 75015, 75019, 75023, 75027, 75031, 75035, 75039, 75043, 75047, + 75050, 75055, 75059, 75065, 75070, 75076, 75080, 75084, 75088, 75092, + 75096, 75100, 75104, 75108, 75112, 75116, 75120, 75124, 75128, 75132, + 75135, 75138, 75141, 75144, 75147, 75150, 75153, 75156, 75159, 75164, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75170, 75175, + 75180, 75185, 75190, 75197, 75204, 75209, 75214, 75219, 75224, 75231, + 75238, 75245, 75252, 75259, 75266, 75276, 75286, 75293, 75300, 75307, + 75314, 75320, 75326, 75335, 75344, 75351, 75358, 75369, 75380, 75385, + 75390, 75397, 75404, 75411, 75418, 75425, 75432, 75439, 75446, 75452, + 75458, 75464, 75470, 75477, 75484, 75489, 75493, 75500, 75507, 75514, + 75518, 75525, 75529, 75534, 75538, 75544, 75549, 75555, 75560, 75564, + 75568, 75571, 75574, 75579, 75584, 75589, 75594, 75599, 75604, 75609, + 75614, 75619, 75624, 75632, 75640, 75645, 75650, 75655, 75660, 75665, + 75670, 75675, 75680, 75685, 75690, 75695, 75700, 75705, 75710, 75716, + 75722, 75728, 75734, 75739, 75745, 75748, 75751, 75754, 75758, 75762, + 75766, 75770, 75773, 75777, 75780, 75783, 75786, 75790, 75794, 75798, + 75802, 75806, 75810, 75814, 75818, 75822, 75826, 75830, 75834, 75838, + 75842, 75846, 75850, 75854, 75858, 75862, 75866, 75870, 75874, 75877, + 75881, 75885, 75889, 75893, 75897, 75901, 75905, 75909, 75913, 75917, + 75921, 75925, 75929, 75933, 75937, 75941, 75945, 75949, 75953, 75957, + 75961, 75965, 75969, 75973, 75976, 75980, 75984, 75988, 75992, 75996, + 76000, 76004, 76007, 76011, 76015, 76019, 76023, 76027, 76031, 76035, + 76039, 76043, 76047, 76051, 76055, 76060, 76065, 76068, 76073, 76076, + 76079, 76082, 0, 0, 0, 0, 0, 0, 0, 0, 76086, 76095, 76104, 76113, 76122, + 76131, 76140, 76149, 76158, 76166, 76173, 76181, 76188, 76196, 76206, + 76215, 76225, 76234, 76244, 76252, 76259, 76267, 76274, 76282, 76287, + 76292, 76298, 76306, 76312, 76318, 76325, 76334, 76342, 76350, 76358, + 76365, 76372, 76379, 76386, 76391, 76396, 76401, 76406, 76411, 76416, + 76421, 76426, 76434, 76442, 76448, 76454, 76459, 76464, 76469, 76474, + 76479, 76484, 76489, 76494, 76503, 76512, 76517, 76522, 76532, 76542, + 76549, 76556, 76565, 76574, 76586, 76598, 76604, 76610, 76618, 76626, + 76636, 76646, 76653, 76660, 76665, 76670, 76682, 76694, 76702, 76710, + 76720, 76730, 76742, 76754, 76763, 76772, 76779, 76786, 76793, 76800, + 76809, 76818, 76823, 76828, 76835, 76842, 76849, 76856, 76868, 76880, + 76885, 76890, 76895, 76900, 76905, 76910, 76915, 76920, 76924, 76929, + 76934, 76939, 76944, 76949, 76955, 76960, 76965, 76972, 76979, 76986, + 76993, 77000, 77008, 77016, 77021, 77026, 77032, 77038, 77045, 77052, + 77059, 77066, 77073, 77077, 77084, 77089, 77094, 77100, 77113, 77119, + 77127, 77135, 77142, 77149, 77158, 77167, 77174, 77181, 77188, 77195, + 77202, 77209, 77216, 77223, 77230, 77237, 77246, 77255, 77264, 77273, + 77282, 77291, 77300, 77309, 77318, 77327, 77334, 77342, 77348, 77356, + 77362, 77368, 77374, 77380, 77388, 77393, 77398, 77403, 77408, 77413, + 77419, 77425, 77431, 77437, 77443, 77449, 77455, 0, 0, 77461, 77468, + 77475, 77484, 77491, 77500, 77512, 77524, 77536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77548, 77556, 77564, 77571, 77578, 77584, + 77591, 77599, 77607, 77615, 77623, 77631, 77637, 77643, 77650, 77656, + 77662, 77668, 77675, 77682, 77689, 77696, 77703, 77710, 77717, 77724, + 77731, 77738, 77745, 77752, 77759, 77766, 77772, 77779, 77786, 77793, + 77800, 77807, 77814, 77821, 77828, 77835, 77842, 77849, 77856, 77863, + 77870, 77877, 77884, 77891, 77898, 77906, 77914, 77922, 77930, 77938, 0, + 0, 0, 77947, 77955, 77963, 77971, 77979, 77987, 77995, 78001, 78007, + 78013, 0, 0, 0, 0, 0, 0, 78019, 78023, 78028, 78033, 78038, 78043, 78048, + 78053, 78058, 78062, 78067, 78072, 78076, 78080, 78085, 78090, 78094, + 78099, 78104, 78109, 78114, 78119, 78124, 78129, 78133, 78137, 78141, + 78146, 78150, 78154, 78158, 78162, 78166, 78170, 78174, 78179, 78184, + 78189, 78194, 78199, 78206, 78212, 78217, 78222, 78227, 78232, 78238, + 78245, 78251, 78258, 78264, 78270, 78275, 78282, 78288, 78293, 0, 0, 0, + 0, 0, 0, 0, 0, 78299, 78304, 78309, 78313, 78318, 78322, 78327, 78331, + 78336, 78341, 78347, 78352, 78358, 78362, 78367, 78372, 78376, 78381, + 78386, 78390, 78395, 78400, 78405, 78410, 78415, 78420, 78425, 78430, + 78435, 78440, 78445, 78450, 78455, 78460, 78464, 78469, 78474, 78479, + 78483, 78487, 78492, 78497, 78502, 78506, 78510, 78514, 78518, 78523, + 78528, 78533, 78537, 78541, 78546, 78552, 78558, 78563, 78569, 78574, + 78580, 78586, 78593, 78599, 78606, 78611, 78617, 78623, 78628, 78634, + 78640, 78645, 0, 0, 0, 0, 0, 0, 0, 0, 78650, 78654, 78659, 78664, 78668, + 78672, 78676, 78680, 78684, 78688, 78692, 78696, 0, 0, 0, 0, 0, 0, 78700, + 78705, 78709, 78713, 78717, 78721, 78725, 78729, 78733, 78737, 78741, + 78745, 78749, 78753, 78757, 78761, 78765, 78770, 78775, 78781, 78787, + 78794, 78799, 78804, 78810, 78814, 78819, 78822, 78825, 78829, 78834, + 78838, 78843, 78850, 78856, 78862, 78868, 78874, 78880, 78886, 78892, + 78898, 78904, 78910, 78917, 78924, 78931, 78937, 78944, 78951, 78958, + 78964, 78971, 78977, 78983, 78990, 78996, 79003, 79010, 79016, 79022, + 79028, 79035, 79042, 79048, 79055, 79062, 79068, 79075, 79081, 79088, + 79095, 79101, 79107, 79114, 79120, 79127, 79134, 79143, 79150, 79157, + 79161, 79166, 79171, 79175, 79180, 79184, 79188, 79193, 79197, 79202, + 79207, 79212, 79216, 79220, 79224, 79228, 79233, 79237, 79242, 79247, + 79252, 79257, 79261, 79266, 79271, 79276, 79282, 79287, 79293, 79299, + 79305, 79311, 79317, 79322, 79328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 79332, 79337, 79341, 79345, 79349, 79353, 79357, 79361, 79365, 79369, + 79373, 79377, 79381, 79385, 79389, 79393, 79397, 79401, 79405, 79409, + 79413, 79417, 79421, 79425, 79429, 79433, 79437, 79441, 79445, 79449, 0, + 0, 0, 79453, 79458, 79463, 79468, 79473, 79477, 79484, 79488, 79493, + 79497, 79504, 79511, 79520, 79524, 79529, 79533, 79537, 79544, 79551, + 79556, 79563, 79568, 79573, 79580, 79585, 79592, 79599, 79604, 79609, + 79616, 79621, 79628, 79635, 79639, 79646, 79651, 79658, 79662, 79666, + 79673, 79678, 79685, 79689, 79693, 79697, 79704, 79708, 79713, 79720, + 79727, 79731, 79735, 79742, 79748, 79754, 79760, 79768, 79774, 79782, + 79788, 79796, 79802, 79808, 79814, 79820, 79824, 79829, 79834, 79840, + 79846, 79852, 79858, 79864, 79870, 79876, 79882, 79890, 79896, 0, 79903, + 79907, 79912, 79916, 79920, 79924, 79928, 79932, 79936, 79940, 79944, 0, + 0, 0, 0, 79948, 79956, 79962, 79968, 79974, 79980, 79986, 79992, 79998, + 80005, 80012, 80019, 80026, 80033, 80040, 80047, 80054, 80061, 80068, + 80075, 80081, 80087, 80093, 80099, 80105, 80111, 80117, 80123, 80129, + 80136, 80143, 80150, 80157, 0, 80164, 80168, 80172, 80176, 80180, 80185, + 80189, 80193, 80198, 80203, 80208, 80213, 80218, 80223, 80228, 80233, + 80238, 80243, 80248, 80253, 80257, 80262, 80267, 80272, 80277, 80281, + 80286, 80290, 80295, 80300, 80305, 80310, 80315, 80319, 80324, 80328, + 80332, 80336, 80341, 80346, 80350, 80354, 80360, 80365, 80371, 80377, + 80382, 80388, 80393, 80399, 80405, 80411, 80416, 80421, 80426, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 80432, 80438, 80444, 80450, 80457, 80463, 80469, 80475, + 80481, 80487, 80492, 80497, 80503, 80510, 0, 0, 80517, 80522, 80526, + 80530, 80534, 80538, 80542, 80546, 80550, 80554, 0, 0, 80558, 80564, + 80570, 80577, 80585, 80591, 80597, 80603, 80609, 80615, 80621, 80627, + 80633, 80639, 80645, 80651, 80656, 80661, 80666, 80672, 80678, 80685, + 80691, 80697, 80702, 80709, 80716, 80723, 80729, 80734, 80739, 80744, + 80752, 80759, 80766, 80774, 80782, 80789, 80796, 80803, 80810, 80817, + 80824, 80831, 80838, 80845, 80852, 80859, 80866, 80873, 80880, 80887, + 80894, 80901, 80908, 80915, 80922, 80928, 80934, 80941, 80948, 80955, + 80962, 80969, 80976, 80983, 80990, 80997, 81004, 81011, 81018, 81025, + 81032, 81039, 81046, 81053, 81060, 81067, 81074, 81081, 81088, 81095, + 81102, 81108, 81114, 81121, 81127, 81132, 81138, 81143, 81148, 81153, + 81160, 81166, 81172, 81178, 81184, 81190, 81196, 81202, 81210, 81218, + 81226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 81234, 81240, 81246, 81252, 81260, 81268, 81274, 81280, 81287, + 81294, 81301, 81308, 81315, 81322, 81329, 81336, 81343, 81351, 81359, + 81367, 81375, 81383, 81389, 81397, 81403, 81411, 81420, 81428, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 81434, 81438, 81442, 81446, 81450, 81454, 0, 0, + 81458, 81462, 81466, 81470, 81474, 81478, 0, 0, 81482, 81486, 81490, + 81494, 81498, 81502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81506, 81510, 81514, + 81518, 81522, 81526, 81530, 0, 81534, 81538, 81542, 81546, 81550, 81554, + 81558, 0, 81562, 81569, 81575, 81581, 81587, 81595, 81602, 81611, 81623, + 81633, 81642, 81650, 81658, 81666, 81672, 81680, 81688, 81695, 81703, + 81713, 81720, 81729, 81735, 81745, 81754, 81759, 81767, 81776, 81781, + 81790, 81797, 81807, 81819, 81824, 81830, 81837, 81842, 81852, 81862, + 81872, 81882, 81897, 81910, 81921, 81929, 81934, 81946, 81955, 81962, + 81969, 81975, 81982, 81987, 81994, 82000, 82011, 82022, 82032, 82038, + 82043, 0, 0, 0, 0, 82048, 82052, 82056, 82060, 82064, 82068, 82073, + 82078, 82082, 82087, 82092, 82097, 82102, 82107, 82111, 82116, 82121, + 82126, 82131, 82136, 82140, 82145, 82150, 82155, 82160, 82165, 82169, + 82174, 82179, 82184, 82189, 82193, 82198, 82203, 82208, 82213, 82218, + 82223, 82228, 82233, 82238, 82243, 82248, 82253, 82258, 82262, 82267, + 82272, 82277, 82282, 82287, 82292, 82297, 82301, 82306, 82311, 82316, + 82321, 82326, 82331, 82336, 82341, 82346, 82351, 82356, 82361, 82366, + 82371, 82376, 82381, 82386, 82391, 82396, 82401, 82406, 82411, 82416, + 82421, 82426, 82431, 82435, 82442, 82449, 82456, 82463, 82469, 82475, + 82482, 82489, 82496, 82503, 82510, 82517, 82524, 82531, 82538, 82544, + 82551, 82558, 82565, 82572, 82579, 82586, 82593, 82600, 82607, 82614, + 82621, 82630, 82639, 82648, 82657, 82666, 82675, 82684, 82693, 82701, + 82709, 82717, 82725, 82733, 82741, 82749, 82757, 82763, 82771, 0, 0, + 82779, 82786, 82792, 82798, 82804, 82810, 82816, 82822, 82828, 82834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 104911, 104918, 104925, 104933, 104940, 104947, 104954, 104961, - 104969, 104977, 104985, 104993, 105001, 105009, 105017, 105025, 105033, - 105041, 105049, 105057, 105065, 105073, 105081, 105089, 105097, 105105, - 105113, 105121, 105129, 105137, 105145, 105153, 105161, 105169, 105177, - 105185, 105193, 105201, 105209, 105217, 105225, 105233, 105241, 105249, - 105257, 105265, 105273, 105281, 105289, 105297, 105305, 105313, 105321, - 105329, 105337, 105345, 105353, 105361, 105369, 105377, 105385, 105393, - 105401, 105409, 105417, 105425, 105433, 105441, 105449, 105457, 105465, - 105473, 105481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105489, 105494, 105500, 105506, - 105512, 105518, 105524, 105530, 105536, 105542, 105547, 105554, 105560, - 105566, 105572, 105578, 105584, 105589, 105595, 105601, 105607, 105613, - 105619, 105625, 105631, 105637, 105643, 105649, 105654, 105660, 105668, - 105676, 105682, 105688, 105694, 105700, 105708, 105714, 105720, 105726, - 105732, 105738, 105744, 105749, 105755, 105763, 105771, 105777, 105783, - 105789, 105796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105802, 105807, - 105813, 105819, 105825, 105831, 105837, 105843, 105849, 105855, 105860, - 105867, 105873, 105879, 105885, 105891, 105897, 105902, 105908, 105914, - 105920, 105926, 105932, 105938, 105944, 105950, 105956, 105962, 105967, - 105973, 105981, 105989, 105995, 106001, 106007, 106013, 106021, 106027, - 106033, 106039, 106045, 106051, 106057, 106062, 106068, 106076, 106084, - 106090, 106096, 106102, 106109, 0, 0, 0, 0, 0, 0, 0, 106115, 106119, - 106123, 106128, 106133, 106139, 106144, 106150, 106157, 106163, 106169, - 106176, 106183, 106190, 106196, 106203, 106210, 106217, 106224, 106230, - 106237, 106244, 106250, 106257, 106263, 106270, 106276, 106282, 106288, - 106295, 106304, 106310, 106318, 106325, 106332, 106339, 106345, 106351, - 106357, 106363, 106369, 106376, 106385, 106392, 106399, 106406, 0, 0, 0, - 0, 0, 0, 0, 0, 106413, 106420, 106426, 106432, 106438, 106444, 106450, - 106456, 106462, 106468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82840, 82845, 82850, 82855, 82860, + 82865, 82870, 82875, 82880, 82885, 82890, 82895, 82900, 82905, 82910, + 82915, 82920, 82925, 82930, 82935, 82940, 82945, 82950, 0, 0, 0, 0, + 82955, 82959, 82963, 82967, 82971, 82975, 82979, 82983, 82987, 82991, + 82995, 82999, 83003, 83007, 83011, 83015, 83019, 83023, 83027, 83031, + 83035, 83039, 83043, 83047, 83051, 83055, 83059, 83063, 83067, 83071, + 83075, 83079, 83083, 83087, 83091, 83095, 83099, 83103, 83107, 83111, + 83115, 83119, 83123, 83127, 83131, 83135, 83139, 83143, 83147, 0, 0, 0, + 0, 83151, 83155, 83159, 83163, 83167, 83171, 83175, 83179, 83183, 83187, + 83191, 83195, 83199, 83203, 83207, 83211, 83215, 83219, 83223, 83227, + 83231, 83235, 83239, 83243, 83247, 83251, 83255, 83259, 83263, 83267, + 83271, 83275, 83279, 83283, 83287, 83291, 83295, 83299, 83303, 83307, + 83311, 83315, 83319, 83323, 83327, 83331, 83335, 83339, 83343, 83347, + 83351, 83355, 83359, 83363, 83367, 83371, 83375, 83379, 83383, 83387, + 83391, 83395, 83399, 83403, 83407, 83411, 83415, 83419, 83423, 83427, + 83431, 83435, 83439, 83443, 83447, 83451, 83455, 83459, 83463, 83467, + 83471, 83475, 83479, 83483, 83487, 83491, 83495, 83499, 83503, 83507, + 83511, 83515, 83519, 83523, 83527, 83531, 83535, 83539, 83543, 83547, + 83551, 83555, 83559, 83563, 83567, 83571, 83575, 83579, 83583, 83587, + 83591, 83595, 83599, 83603, 83607, 83611, 83615, 83619, 83623, 83627, + 83631, 83635, 83639, 83643, 83647, 83651, 83655, 83659, 83663, 83667, + 83671, 83675, 83679, 83683, 83687, 83691, 83695, 83699, 83703, 83707, + 83711, 83715, 83719, 83723, 83727, 83731, 83735, 83739, 83743, 83747, + 83751, 83755, 83759, 83763, 83767, 83771, 83775, 83779, 83783, 83787, + 83791, 83795, 83799, 83803, 83807, 83811, 83815, 83819, 83823, 83827, + 83831, 83835, 83839, 83843, 83847, 83851, 83855, 83859, 83863, 83867, + 83871, 83875, 83879, 83883, 83887, 83891, 83895, 83899, 83903, 83907, + 83911, 83915, 83919, 83923, 83927, 83931, 83935, 83939, 83943, 83947, + 83951, 83955, 83959, 83963, 83967, 83971, 83975, 83979, 83983, 83987, + 83991, 83995, 83999, 84003, 84007, 84011, 84015, 84019, 84023, 84027, + 84031, 84035, 84039, 84043, 84047, 84051, 84055, 84059, 84063, 84067, + 84071, 84075, 84079, 84083, 84087, 84091, 84095, 84099, 84103, 84107, + 84111, 84115, 84119, 84123, 84127, 84131, 84135, 84139, 84143, 84147, + 84151, 84155, 84159, 84163, 84167, 84171, 84175, 84179, 84183, 84187, + 84191, 84195, 84199, 84203, 84207, 84211, 84215, 84219, 84223, 84227, + 84231, 84235, 84239, 84243, 84247, 84251, 84255, 84259, 84263, 84267, + 84271, 84275, 84279, 84283, 84287, 84291, 84295, 84299, 84303, 84307, + 84311, 84315, 84319, 84323, 84327, 84331, 84335, 84339, 84343, 84347, + 84351, 84355, 84359, 84363, 84367, 84371, 84375, 84379, 84383, 84387, + 84391, 84395, 84399, 84403, 84407, 84411, 84415, 84419, 84423, 84427, + 84431, 84435, 84439, 84443, 84447, 84451, 84455, 84459, 84463, 84467, + 84471, 84475, 84479, 84483, 84487, 84491, 84495, 84499, 84503, 84507, + 84511, 84515, 84519, 84523, 84527, 84531, 84535, 84539, 84543, 84547, + 84551, 84555, 84559, 84563, 84567, 84571, 84575, 84579, 84583, 84587, + 84591, 84595, 84599, 84603, 84607, 84611, 0, 0, 84615, 84619, 84623, + 84627, 84631, 84635, 84639, 84643, 84647, 84651, 84655, 84659, 84663, + 84667, 84671, 84675, 84679, 84683, 84687, 84691, 84695, 84699, 84703, + 84707, 84711, 84715, 84719, 84723, 84727, 84731, 84735, 84739, 84743, + 84747, 84751, 84755, 84759, 84763, 84767, 84771, 84775, 84779, 84783, + 84787, 84791, 84795, 84799, 84803, 84807, 84811, 84815, 84819, 84823, + 84827, 84831, 84835, 84839, 84843, 84847, 84851, 84855, 84859, 84863, + 84867, 84871, 84875, 84879, 84883, 84887, 84891, 84895, 84899, 84903, + 84907, 84911, 84915, 84919, 84923, 84927, 84931, 84935, 84939, 84943, + 84947, 84951, 84955, 84959, 84963, 84967, 84971, 84975, 84979, 84983, + 84987, 84991, 84995, 84999, 85003, 85007, 85011, 85015, 85019, 85023, + 85027, 85031, 85035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85039, + 85044, 85049, 85054, 85059, 85064, 85072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 85077, 85085, 85093, 85101, 85109, 0, 0, 0, 0, 0, 85117, 85124, + 85131, 85141, 85147, 85153, 85159, 85165, 85171, 85177, 85184, 85190, + 85196, 85202, 85211, 85220, 85232, 85244, 85250, 85256, 85262, 85269, + 85276, 85283, 85290, 85297, 0, 85304, 85311, 85318, 85326, 85333, 0, + 85340, 0, 85347, 85354, 0, 85361, 85369, 0, 85376, 85383, 85390, 85397, + 85404, 85411, 85418, 85425, 85432, 85439, 85444, 85451, 85458, 85464, + 85470, 85476, 85483, 85489, 85495, 85501, 85508, 85514, 85520, 85526, + 85533, 85539, 85545, 85551, 85558, 85564, 85570, 85576, 85583, 85589, + 85595, 85601, 85608, 85614, 85620, 85626, 85633, 85639, 85645, 85651, + 85658, 85664, 85670, 85676, 85683, 85689, 85695, 85701, 85708, 85714, + 85720, 85726, 85733, 85739, 85745, 85751, 85758, 85764, 85770, 85776, + 85782, 85788, 85794, 85800, 85806, 85812, 85818, 85824, 85830, 85836, + 85842, 85848, 85855, 85861, 85867, 85873, 85880, 85886, 85892, 85898, + 85905, 85911, 85917, 85923, 85930, 85938, 85946, 85952, 85958, 85964, + 85971, 85980, 85989, 85997, 86005, 86013, 86022, 86030, 86038, 86046, + 86055, 86062, 86069, 86080, 86091, 86095, 86099, 86105, 86111, 86117, + 86123, 86133, 86143, 86150, 86157, 86164, 86172, 86180, 86184, 86190, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86196, 86202, 86208, + 86214, 86221, 86226, 86231, 86237, 86243, 86249, 86255, 86264, 86270, + 86276, 86284, 86292, 86300, 86308, 86314, 86320, 86326, 86333, 86346, + 86360, 86371, 86382, 86394, 86406, 86418, 86430, 86441, 86452, 86464, + 86476, 86488, 86500, 86512, 86524, 86536, 86553, 86570, 86587, 86594, + 86601, 86608, 86616, 86628, 86639, 86650, 86663, 86674, 86683, 86691, + 86700, 86708, 86718, 86726, 86735, 86743, 86752, 86760, 86770, 86778, + 86787, 86795, 86805, 86813, 86821, 86829, 86837, 86844, 86853, 86861, + 86869, 86878, 86886, 86895, 86903, 86911, 86919, 86928, 86936, 86945, + 86953, 86961, 86969, 86977, 86986, 86994, 87003, 87011, 87020, 87028, + 87037, 87045, 87055, 87063, 87071, 87079, 87089, 87097, 87105, 87114, + 87122, 87131, 87140, 87148, 87158, 87166, 87175, 87183, 87192, 87200, + 87210, 87218, 87226, 87233, 87241, 87248, 87257, 87264, 87273, 87281, + 87290, 87298, 87308, 87316, 87325, 87333, 87343, 87351, 87359, 87366, + 87374, 87381, 87390, 87397, 87407, 87417, 87428, 87437, 87446, 87455, + 87464, 87473, 87483, 87495, 87507, 87518, 87530, 87543, 87554, 87563, + 87572, 87580, 87589, 87599, 87607, 87616, 87625, 87633, 87642, 87652, + 87660, 87669, 87678, 87686, 87695, 87705, 87713, 87723, 87731, 87741, + 87749, 87757, 87766, 87774, 87784, 87792, 87800, 87810, 87818, 87825, + 87832, 87841, 87850, 87858, 87867, 87877, 87885, 87896, 87904, 87912, + 87919, 87927, 87936, 87943, 87955, 87966, 87978, 87989, 88001, 88010, + 88018, 88027, 88035, 88044, 88053, 88061, 88070, 88078, 88087, 88095, + 88103, 88111, 88119, 88126, 88135, 88143, 88152, 88160, 88169, 88177, + 88185, 88194, 88202, 88211, 88219, 88228, 88236, 88244, 88252, 88261, + 88269, 88278, 88286, 88295, 88303, 88312, 88320, 88328, 88336, 88345, + 88353, 88362, 88371, 88379, 88388, 88396, 88405, 88413, 88422, 88430, + 88437, 88445, 88452, 88461, 88469, 88478, 88486, 88495, 88504, 88512, + 88522, 88530, 88537, 88545, 88552, 88560, 88572, 88585, 88594, 88604, + 88613, 88623, 88632, 88642, 88651, 88661, 88670, 88680, 88690, 88699, + 88708, 88717, 88727, 88735, 88744, 88754, 88764, 88774, 88784, 88792, + 88802, 88810, 88820, 88828, 88838, 88846, 88856, 88864, 88873, 88880, + 88890, 88898, 88908, 88916, 88926, 88934, 88944, 88952, 88961, 88969, + 88978, 88986, 88995, 89004, 89013, 89022, 89032, 89040, 89050, 89058, + 89068, 89076, 89086, 89094, 89104, 89112, 89121, 89128, 89138, 89146, + 89156, 89164, 89174, 89182, 89192, 89200, 89209, 89217, 89226, 89234, + 89243, 89252, 89261, 89270, 89279, 89287, 89296, 89304, 89313, 89322, + 89330, 89340, 89349, 89359, 89369, 89378, 89388, 89397, 89406, 89414, + 89422, 89427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89432, + 89443, 89454, 89465, 89475, 89486, 89497, 89507, 89518, 89528, 89538, + 89547, 89558, 89569, 89580, 89593, 89603, 89613, 89624, 89634, 89644, + 89654, 89664, 89674, 89684, 89694, 89705, 89716, 89727, 89737, 89747, + 89759, 89770, 89781, 89791, 89801, 89811, 89821, 89832, 89842, 89852, + 89864, 89874, 89884, 89896, 89907, 89918, 89928, 89938, 89948, 89958, + 89970, 89982, 89994, 90005, 90016, 90026, 90036, 90046, 90055, 90064, + 90074, 90084, 90095, 0, 0, 90105, 90116, 90127, 90137, 90147, 90159, + 90170, 90181, 90194, 90204, 90216, 90225, 90234, 90245, 90256, 90269, + 90280, 90293, 90303, 90315, 90325, 90337, 90349, 90362, 90372, 90382, + 90392, 90403, 90413, 90422, 90432, 90441, 90450, 90460, 90470, 90480, + 90490, 90500, 90510, 90521, 90531, 90542, 90552, 90563, 90574, 90584, + 90594, 90604, 90614, 90624, 90634, 90645, 90655, 90666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 106474, 106478, 106482, 106486, 106490, 106494, 106498, - 106502, 106506, 106510, 106515, 106520, 106525, 106530, 106535, 106540, - 106545, 106550, 106555, 106561, 106567, 106573, 106580, 106587, 106594, - 106601, 106608, 106615, 106621, 106627, 106633, 0, 106639, 106645, - 106652, 106658, 106665, 106671, 106677, 106684, 106690, 106696, 106702, - 106708, 106714, 106720, 106726, 106732, 106739, 106750, 106756, 106762, - 106770, 106776, 106782, 106789, 106800, 106806, 106812, 106818, 106825, - 106836, 106841, 106846, 106851, 106856, 106861, 106867, 106873, 106879, - 106886, 106893, 0, 0, 0, 0, 0, 0, 0, 0, 106899, 106904, 106909, 106914, - 106919, 106924, 106929, 106934, 106939, 106944, 106949, 106954, 106959, - 106964, 106969, 106974, 106979, 106984, 106989, 106994, 106999, 107004, - 107010, 107015, 107022, 107027, 107034, 107040, 107046, 107052, 107058, - 107065, 107071, 107077, 107081, 107086, 107091, 107097, 107105, 107116, - 107125, 107135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90677, 90692, 90707, 90713, 90719, 90725, + 90731, 90737, 90743, 90749, 90755, 90763, 90767, 90770, 0, 0, 90778, + 90781, 90784, 90787, 90790, 90793, 90796, 90799, 90802, 90805, 90808, + 90811, 90814, 90817, 90820, 90823, 90826, 90834, 90843, 90854, 90862, + 90870, 90879, 90888, 90899, 90911, 0, 0, 0, 0, 0, 0, 90921, 90926, 90931, + 90938, 90945, 90951, 90957, 90962, 90967, 90972, 90978, 90984, 90990, + 90996, 91002, 91009, 91016, 91026, 91036, 91046, 91055, 91066, 91075, + 91084, 91094, 91104, 91116, 91128, 91139, 91150, 91161, 91172, 91182, + 91192, 91202, 91212, 91223, 91234, 91238, 91243, 91252, 91261, 91265, + 91269, 91273, 91278, 91283, 91288, 91293, 91296, 91300, 0, 91305, 91308, + 91311, 91315, 91319, 91324, 91328, 91332, 91337, 91342, 91349, 91356, + 91359, 91362, 91365, 91368, 91371, 91375, 91379, 0, 91383, 91388, 91392, + 91396, 0, 0, 0, 0, 91401, 91406, 91413, 91418, 91423, 0, 91428, 91433, + 91439, 91444, 91450, 91455, 91461, 91466, 91472, 91477, 91483, 91489, + 91498, 91507, 91516, 91525, 91535, 91545, 91555, 91565, 91574, 91583, + 91592, 91602, 91607, 91612, 91618, 91624, 91630, 91637, 91645, 91653, + 91659, 91665, 91671, 91678, 91684, 91690, 91696, 91703, 91709, 91715, + 91721, 91728, 91733, 91738, 91743, 91749, 91755, 91761, 91767, 91774, + 91780, 91786, 91792, 91798, 91804, 91810, 91816, 91822, 91828, 91834, + 91840, 91847, 91853, 91859, 91865, 91872, 91878, 91884, 91890, 91897, + 91903, 91909, 91915, 91922, 91928, 91934, 91940, 91947, 91953, 91959, + 91965, 91972, 91978, 91984, 91990, 91997, 92003, 92009, 92015, 92022, + 92028, 92034, 92040, 92047, 92053, 92059, 92065, 92072, 92078, 92084, + 92090, 92097, 92103, 92109, 92115, 92122, 92127, 92132, 92137, 92143, + 92149, 92155, 92161, 92168, 92174, 92180, 92186, 92193, 92199, 92205, + 92212, 92219, 92224, 92229, 92234, 92240, 92252, 92264, 92276, 92288, + 92301, 92314, 92322, 0, 0, 92330, 0, 92338, 92342, 92346, 92349, 92353, + 92357, 92360, 92363, 92367, 92371, 92374, 92377, 92380, 92383, 92388, + 92391, 92395, 92398, 92401, 92404, 92407, 92410, 92413, 92416, 92419, + 92422, 92425, 92428, 92432, 92436, 92440, 92444, 92449, 92454, 92460, + 92466, 92472, 92477, 92483, 92489, 92495, 92500, 92506, 92512, 92517, + 92523, 92529, 92534, 92540, 92546, 92551, 92557, 92563, 92568, 92574, + 92580, 92586, 92592, 92598, 92602, 92607, 92611, 92616, 92620, 92625, + 92630, 92636, 92642, 92648, 92653, 92659, 92665, 92671, 92676, 92682, + 92688, 92693, 92699, 92705, 92710, 92716, 92722, 92727, 92733, 92739, + 92744, 92750, 92756, 92762, 92768, 92774, 92779, 92783, 92788, 92791, + 92796, 92801, 92807, 92812, 92817, 92821, 92826, 92831, 92836, 92841, + 92846, 92851, 92856, 92861, 92867, 92873, 92879, 92887, 92891, 92895, + 92899, 92903, 92907, 92911, 92916, 92921, 92926, 92931, 92935, 92940, + 92945, 92950, 92955, 92959, 92964, 92969, 92974, 92978, 92982, 92987, + 92992, 92997, 93002, 93006, 93011, 93016, 93021, 93026, 93030, 93035, + 93040, 93045, 93050, 93054, 93059, 93064, 93068, 93073, 93078, 93083, + 93088, 93093, 93098, 93105, 93112, 93116, 93121, 93126, 93131, 93136, + 93141, 93146, 93151, 93156, 93161, 93166, 93171, 93176, 93181, 93186, + 93191, 93196, 93201, 93206, 93211, 93216, 93221, 93226, 93231, 93236, + 93241, 93246, 93251, 93256, 93261, 0, 0, 0, 93266, 93270, 93275, 93279, + 93284, 93289, 0, 0, 93293, 93298, 93303, 93307, 93312, 93317, 0, 0, + 93322, 93327, 93331, 93336, 93341, 93346, 0, 0, 93351, 93356, 93361, 0, + 0, 0, 93365, 93369, 93373, 93377, 93380, 93384, 93388, 0, 93392, 93398, + 93401, 93405, 93408, 93412, 93416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93420, + 93426, 93432, 93438, 93444, 0, 0, 93448, 93454, 93460, 93466, 93472, + 93478, 93485, 93492, 93499, 93506, 93513, 93520, 0, 93527, 93534, 93541, + 93547, 93554, 93561, 93568, 93575, 93581, 93588, 93595, 93602, 93609, + 93615, 93622, 93629, 93636, 93643, 93649, 93656, 93663, 93670, 93677, + 93684, 93691, 93698, 0, 93705, 93711, 93718, 93725, 93732, 93739, 93745, + 93752, 93759, 93766, 93773, 93779, 93786, 93793, 93799, 93806, 93813, + 93820, 93827, 0, 93834, 93841, 0, 93848, 93855, 93862, 93869, 93876, + 93883, 93890, 93897, 93904, 93911, 93918, 93925, 93932, 93939, 93946, 0, + 0, 93952, 93957, 93962, 93967, 93972, 93977, 93982, 93987, 93992, 93997, + 94002, 94007, 94012, 94017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94022, 94029, + 94036, 94043, 94050, 94057, 94064, 94071, 94078, 94085, 94092, 94099, + 94106, 94113, 94120, 94127, 94134, 94141, 94148, 94155, 94163, 94171, + 94178, 94185, 94190, 94198, 94206, 94213, 94220, 94225, 94232, 94237, + 94242, 94249, 94254, 94259, 94264, 94272, 94277, 94282, 94289, 94294, + 94299, 94306, 94313, 94318, 94323, 94328, 94333, 94338, 94343, 94348, + 94353, 94358, 94365, 94370, 94377, 94382, 94387, 94392, 94397, 94402, + 94407, 94412, 94417, 94422, 94427, 94432, 94439, 94446, 94453, 94460, + 94466, 94471, 94478, 94483, 94488, 94497, 94504, 94513, 94520, 94525, + 94530, 94538, 94543, 94548, 94553, 94558, 94563, 94570, 94575, 94580, + 94585, 94590, 94595, 94602, 94609, 94616, 94623, 94630, 94637, 94644, + 94651, 94658, 94665, 94672, 94679, 94686, 94693, 94700, 94707, 94714, + 94721, 94728, 94735, 94742, 94749, 94756, 94763, 94770, 94777, 94784, + 94791, 0, 0, 0, 0, 0, 94798, 94806, 94814, 0, 0, 0, 0, 94819, 94823, + 94827, 94831, 94835, 94839, 94843, 94847, 94851, 94855, 94860, 94865, + 94870, 94875, 94880, 94885, 94890, 94895, 94900, 94906, 94912, 94918, + 94925, 94932, 94939, 94946, 94953, 94960, 94965, 94970, 94975, 94981, + 94987, 94993, 94999, 95005, 95011, 95017, 95023, 95029, 95035, 95041, + 95047, 95053, 95059, 0, 0, 0, 95065, 95073, 95081, 95089, 95097, 95105, + 95115, 95125, 95133, 95141, 95149, 95157, 95165, 95171, 95178, 95187, + 95195, 95203, 95212, 95221, 95230, 95240, 95251, 95261, 95272, 95281, + 95290, 95299, 95309, 95320, 95330, 95341, 95352, 95361, 95369, 95375, + 95381, 95387, 95393, 95401, 95409, 95415, 95422, 95432, 95439, 95446, + 95453, 95460, 95467, 95477, 95484, 95491, 95499, 95507, 95516, 95525, + 95534, 95543, 95552, 95559, 95567, 95576, 95585, 95589, 95596, 95601, + 95606, 95610, 95614, 95618, 95622, 95627, 95632, 95638, 95644, 95648, + 95654, 95658, 95662, 95666, 95670, 95674, 95678, 95684, 95688, 95693, + 95697, 95701, 0, 95704, 95709, 95714, 95719, 95724, 95731, 95736, 95741, + 95746, 95751, 95756, 95761, 95766, 0, 0, 0, 95769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95775, 95782, 95791, + 95800, 95807, 95814, 95821, 95828, 95835, 95842, 95848, 95855, 95862, + 95869, 95876, 95883, 95890, 95897, 95904, 95913, 95920, 95927, 95934, + 95941, 95948, 95955, 95962, 95969, 95978, 95985, 95992, 95999, 96006, + 96013, 96020, 96029, 96036, 96043, 96050, 96057, 96066, 96073, 96080, + 96087, 96095, 96104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107145, 107150, - 107155, 107160, 107165, 107170, 107175, 107180, 107185, 107190, 107195, - 107200, 107205, 107210, 107215, 107220, 107225, 107230, 107235, 107240, - 107245, 107250, 107255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107260, 107264, - 107268, 107272, 107276, 107280, 107283, 107287, 107290, 107294, 107297, - 107301, 107305, 107310, 107314, 107319, 107322, 107326, 107329, 107333, - 107336, 107340, 107344, 107348, 107352, 107356, 107360, 107364, 107368, - 107372, 107376, 107380, 107384, 107388, 107392, 107395, 107399, 107403, - 107407, 107410, 107413, 107417, 107421, 107425, 107428, 107431, 107434, - 107437, 107441, 107445, 107449, 107452, 107455, 107459, 107465, 107471, - 107477, 107482, 107489, 107493, 107498, 107502, 107507, 107512, 107518, - 107523, 107529, 107533, 107538, 107542, 107547, 107550, 107553, 107557, - 107562, 107568, 107573, 107579, 0, 0, 0, 0, 107584, 107587, 107590, - 107593, 107596, 107599, 107602, 107605, 107608, 107611, 107615, 107619, - 107623, 107627, 107631, 107635, 107639, 107643, 107647, 107652, 107656, - 107660, 107663, 107666, 107669, 107672, 107675, 107678, 107681, 107684, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107687, 107691, 107696, - 107701, 107706, 107710, 107715, 107719, 107724, 107728, 107733, 107737, - 107742, 107746, 107751, 107755, 107760, 107765, 107770, 107775, 107780, - 107785, 107790, 107795, 107800, 107805, 107810, 107815, 107820, 107825, - 107830, 107835, 107839, 107844, 107849, 107854, 107858, 107862, 107867, - 107872, 107877, 107881, 107885, 107889, 107893, 107898, 107903, 107908, - 107912, 107916, 107922, 107927, 107933, 107938, 107944, 107949, 107955, - 107960, 107966, 107971, 107976, 107981, 107986, 107990, 107995, 108001, - 108005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108010, 0, 0, 108015, 108022, - 108029, 108036, 108043, 108050, 108057, 108064, 108071, 108078, 108085, - 108092, 108099, 108106, 108113, 108120, 108127, 108134, 108141, 108148, - 108155, 108162, 108169, 108176, 108183, 0, 0, 0, 0, 0, 0, 0, 108190, - 108197, 108203, 108209, 108215, 108221, 108227, 108233, 108239, 108245, - 0, 0, 0, 0, 0, 0, 108251, 108256, 108261, 108266, 108271, 108275, 108279, - 108283, 108288, 108293, 108298, 108303, 108308, 108313, 108318, 108323, - 108328, 108333, 108338, 108343, 108348, 108353, 108358, 108363, 108368, - 108373, 108378, 108383, 108388, 108393, 108398, 108403, 108408, 108413, - 108418, 108423, 108428, 108433, 108438, 108443, 108448, 108453, 108459, - 108464, 108470, 108475, 108481, 108486, 108492, 108498, 108502, 108507, - 108511, 0, 108515, 108520, 108524, 108528, 108532, 108536, 108540, - 108544, 108548, 108552, 108556, 108561, 108565, 108570, 108575, 108580, - 108586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108592, 108596, 108600, 108604, - 108608, 108612, 108616, 108621, 108626, 108631, 108636, 108641, 108646, - 108651, 108656, 108661, 108666, 108671, 108676, 108681, 108685, 108690, - 108695, 108700, 108704, 108708, 108713, 108718, 108723, 108727, 108731, - 108735, 108740, 108744, 108748, 108753, 108758, 108763, 108768, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 108773, 108778, 108783, 108788, 108792, 108797, 108801, - 108806, 108810, 108815, 108820, 108826, 108831, 108837, 108841, 108846, - 108850, 108855, 108859, 108864, 108869, 108874, 108879, 108884, 108889, - 108894, 108899, 108904, 108909, 108914, 108919, 108924, 108929, 108933, - 108938, 108943, 108948, 108952, 108956, 108961, 108966, 108971, 108975, - 108979, 108983, 108987, 108992, 108997, 109002, 109007, 109011, 109015, - 109021, 109026, 109032, 109037, 109043, 109049, 109056, 109062, 109069, - 109074, 109080, 109085, 109091, 109096, 109101, 109106, 109111, 109115, - 109119, 109124, 109129, 109133, 109138, 109143, 109148, 109156, 0, 0, - 109161, 109166, 109170, 109174, 109178, 109182, 109186, 109190, 109194, - 109198, 109202, 109206, 109211, 109215, 109220, 109226, 0, 109232, - 109237, 109242, 109247, 109252, 109257, 109262, 109267, 109272, 109277, - 109283, 109289, 109295, 109301, 109307, 109313, 109319, 109325, 109331, - 109338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109344, 109348, 109353, 109357, - 109361, 109365, 109370, 109374, 109379, 109383, 109388, 109393, 109398, - 109403, 109408, 109413, 109418, 109423, 0, 109428, 109433, 109438, - 109443, 109448, 109453, 109458, 109462, 109467, 109472, 109477, 109482, - 109486, 109490, 109495, 109500, 109505, 109510, 109514, 109518, 109522, - 109526, 109531, 109535, 109539, 109544, 109550, 109555, 109561, 109566, - 109571, 109577, 109582, 109588, 109593, 109598, 109603, 109608, 109612, - 109617, 109623, 109628, 109634, 109639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96113, 96117, 96121, + 96126, 96131, 96136, 96141, 96145, 96150, 96155, 96160, 96165, 96170, + 96175, 96179, 96184, 96189, 96194, 96199, 96203, 96208, 96213, 96217, + 96222, 96227, 96232, 96237, 96242, 96247, 0, 0, 0, 96252, 96256, 96261, + 96266, 96270, 96275, 96279, 96284, 96289, 96294, 96299, 96304, 96308, + 96313, 96318, 96323, 96328, 96333, 96338, 96342, 96347, 96352, 96357, + 96362, 96367, 96372, 96376, 96380, 96385, 96390, 96395, 96400, 96405, + 96410, 96415, 96420, 96425, 96430, 96435, 96440, 96445, 96450, 96455, + 96460, 96465, 96470, 96475, 96480, 96485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 96490, 96496, 96501, 96506, 96511, 96516, 96521, 96526, + 96531, 96536, 96541, 96547, 96553, 96559, 96565, 96571, 96577, 96583, + 96589, 96595, 96602, 96609, 96616, 96624, 96632, 96640, 96648, 96656, 0, + 0, 0, 0, 96664, 96668, 96673, 96678, 96683, 96687, 96692, 96697, 96702, + 96707, 96711, 96715, 96720, 96725, 96730, 96735, 96739, 96744, 96749, + 96754, 96759, 96764, 96769, 96773, 96778, 96783, 96788, 96793, 96798, + 96803, 96808, 96813, 96818, 96823, 96828, 96834, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96840, 96845, 96852, 96859, 96864, 96869, 96874, 96879, 96884, 96889, + 96894, 96899, 96904, 96909, 96914, 96919, 96924, 96929, 96934, 96939, + 96944, 96949, 96954, 96959, 96964, 96969, 96974, 96979, 96984, 96989, 0, + 0, 0, 0, 0, 96996, 97002, 97008, 97014, 97020, 97025, 97031, 97037, + 97043, 97049, 97054, 97060, 97066, 97072, 97078, 97084, 97090, 97096, + 97102, 97108, 97113, 97119, 97125, 97131, 97137, 97143, 97148, 97154, + 97160, 97165, 97171, 97177, 97183, 97189, 97195, 97201, 97207, 97212, + 97218, 97225, 97232, 97239, 97246, 0, 0, 0, 0, 0, 97253, 97258, 97263, + 97268, 97273, 97278, 97283, 97288, 97293, 97298, 97303, 97308, 97313, + 97318, 97323, 97328, 97333, 97338, 97343, 97348, 97353, 97358, 97363, + 97368, 97373, 97378, 97383, 97387, 97391, 97395, 0, 97400, 97406, 97411, + 97416, 97421, 97426, 97432, 97438, 97444, 97450, 97456, 97462, 97468, + 97473, 97479, 97485, 97491, 97497, 97503, 97508, 97514, 97520, 97525, + 97531, 97536, 97542, 97548, 97553, 97559, 97565, 97570, 97576, 97581, + 97586, 97592, 97598, 97604, 0, 0, 0, 0, 97609, 97615, 97621, 97627, + 97633, 97639, 97645, 97651, 97657, 97664, 97669, 97674, 97680, 97686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 109644, 109648, 109652, 109656, 109660, 109664, 109669, - 0, 109674, 0, 109679, 109684, 109689, 109694, 0, 109699, 109704, 109709, - 109714, 109719, 109724, 109729, 109734, 109738, 109743, 109748, 109753, - 109757, 109761, 109766, 0, 109771, 109776, 109780, 109784, 109788, - 109792, 109797, 109801, 109805, 109810, 109815, 0, 0, 0, 0, 0, 0, 109820, - 109824, 109829, 109833, 109838, 109842, 109847, 109851, 109856, 109860, - 109865, 109869, 109874, 109879, 109884, 109889, 109894, 109899, 109904, - 109909, 109914, 109919, 109924, 109929, 109934, 109939, 109944, 109949, - 109954, 109959, 109963, 109968, 109973, 109978, 109982, 109986, 109991, - 109996, 110001, 110006, 110010, 110014, 110018, 110022, 110027, 110032, - 110036, 110040, 110045, 110051, 110056, 110062, 110067, 110073, 110078, - 110084, 110089, 110095, 110100, 0, 0, 0, 0, 0, 110105, 110110, 110114, - 110118, 110122, 110126, 110130, 110134, 110138, 110142, 0, 0, 0, 0, 0, 0, - 110146, 110153, 110158, 110163, 0, 110168, 110172, 110177, 110181, - 110186, 110190, 110195, 110200, 0, 0, 110205, 110210, 0, 0, 110215, - 110220, 110225, 110229, 110234, 110239, 110244, 110249, 110254, 110259, - 110264, 110269, 110274, 110279, 110284, 110289, 110294, 110299, 110303, - 110308, 110313, 110318, 0, 110322, 110326, 110331, 110336, 110341, - 110345, 110349, 0, 110353, 110357, 0, 110362, 110367, 110372, 110377, - 110381, 0, 110385, 110389, 110394, 110399, 110405, 110410, 110416, - 110421, 110427, 110433, 0, 0, 110440, 110446, 0, 0, 110452, 110458, - 110464, 0, 0, 110469, 0, 0, 0, 0, 0, 0, 110473, 0, 0, 0, 0, 0, 110480, - 110485, 110492, 110500, 110506, 110512, 110518, 0, 0, 110525, 110531, - 110536, 110541, 110546, 110551, 110556, 0, 0, 0, 110561, 110566, 110571, - 110576, 110582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110587, 110591, 110596, - 110600, 110605, 110609, 110614, 110619, 110625, 110630, 110636, 110640, - 110645, 110649, 110654, 110658, 110663, 110668, 110673, 110678, 110683, - 110688, 110693, 110698, 110703, 110708, 110713, 110718, 110723, 110728, - 110733, 110738, 110742, 110747, 110752, 110757, 110761, 110766, 110770, - 110775, 110780, 110785, 110789, 110794, 110798, 110802, 110807, 110811, - 110816, 110821, 110826, 110831, 110835, 110839, 110845, 110850, 110856, - 110861, 110867, 110873, 110880, 110886, 110893, 110898, 110904, 110909, - 110915, 110920, 110925, 110930, 110935, 110940, 110945, 110951, 110955, - 110959, 110963, 110968, 110972, 110978, 110983, 110988, 110992, 110996, - 111000, 111004, 111008, 111012, 111016, 111020, 0, 111024, 0, 111029, - 111034, 111039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111046, 111050, 111054, 111059, - 111063, 111068, 111072, 111077, 111082, 111088, 111093, 111099, 111103, - 111108, 111112, 111117, 111121, 111126, 111131, 111136, 111141, 111146, - 111151, 111156, 111161, 111166, 111171, 111176, 111181, 111186, 111191, - 111195, 111200, 111205, 111210, 111214, 111218, 111223, 111228, 111233, - 111237, 111241, 111245, 111249, 111254, 111259, 111264, 111268, 111272, - 111278, 111283, 111289, 111294, 111300, 111306, 111313, 111319, 111326, - 111331, 111338, 111344, 111349, 111356, 111362, 111367, 111372, 111377, - 111382, 111387, 111392, 111396, 111401, 0, 0, 0, 0, 0, 0, 0, 0, 111405, - 111410, 111414, 111418, 111422, 111426, 111430, 111434, 111438, 111442, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97692, 97698, 97704, + 97710, 97717, 97723, 97730, 97737, 97744, 97751, 97759, 97766, 97774, + 97780, 97786, 97792, 97798, 97804, 97810, 97816, 97822, 97828, 97834, + 97840, 97846, 97852, 97858, 97864, 97870, 97876, 97882, 97888, 97894, + 97900, 97906, 97912, 97918, 97924, 97930, 97936, 97942, 97948, 97954, + 97960, 97967, 97973, 97980, 97987, 97994, 98001, 98009, 98016, 98024, + 98030, 98036, 98042, 98048, 98054, 98060, 98066, 98072, 98078, 98084, + 98090, 98096, 98102, 98108, 98114, 98120, 98126, 98132, 98138, 98144, + 98150, 98156, 98162, 98168, 98174, 98180, 98186, 98192, 98197, 98202, + 98207, 98212, 98217, 98222, 98227, 98232, 98237, 98242, 98247, 98252, + 98257, 98262, 98267, 98272, 98277, 98282, 98287, 98292, 98297, 98302, + 98307, 98312, 98317, 98322, 98327, 98332, 98337, 98342, 98347, 98352, + 98357, 98362, 98367, 98372, 98377, 98382, 98387, 98392, 98397, 98402, + 98407, 98412, 98417, 98422, 98427, 98432, 98437, 98442, 98446, 98451, + 98456, 98461, 98466, 98470, 98474, 98479, 98484, 98489, 98494, 98499, + 98504, 98509, 98514, 98519, 98524, 98529, 98533, 98537, 98541, 98545, + 98549, 98553, 98557, 98562, 98567, 0, 0, 98572, 98577, 98581, 98585, + 98589, 98593, 98597, 98601, 98605, 98609, 0, 0, 0, 0, 0, 0, 98613, 98618, + 98624, 98630, 98636, 98642, 98648, 98654, 98659, 98665, 98670, 98676, + 98681, 98686, 98692, 98698, 98703, 98708, 98713, 98718, 98724, 98729, + 98735, 98740, 98746, 98751, 98757, 98763, 98769, 98775, 98781, 98786, + 98792, 98798, 98804, 98810, 0, 0, 0, 0, 98816, 98821, 98827, 98833, + 98839, 98845, 98851, 98857, 98862, 98868, 98873, 98879, 98884, 98889, + 98895, 98901, 98906, 98911, 98916, 98921, 98927, 98932, 98938, 98943, + 98949, 98954, 98960, 98966, 98972, 98978, 98984, 98989, 98995, 99001, + 99007, 99013, 0, 0, 0, 0, 99019, 99023, 99028, 99033, 99038, 99043, + 99048, 99053, 99058, 99062, 99067, 99072, 99077, 99082, 99086, 99091, + 99096, 99101, 99106, 99111, 99116, 99120, 99125, 99129, 99134, 99139, + 99144, 99149, 99154, 99159, 99164, 99169, 99173, 99178, 99183, 99188, + 99193, 99198, 99203, 99208, 0, 0, 0, 0, 0, 0, 0, 0, 99213, 99220, 99227, + 99234, 99241, 99248, 99255, 99262, 99269, 99276, 99283, 99290, 99297, + 99304, 99311, 99318, 99325, 99332, 99339, 99346, 99353, 99360, 99367, + 99374, 99381, 99388, 99395, 99402, 99409, 99416, 99423, 99430, 99437, + 99444, 99451, 99458, 99465, 99472, 99479, 99486, 99493, 99500, 99507, + 99514, 99521, 99528, 99535, 99542, 99549, 99556, 99563, 99570, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 99577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111446, 111450, 111455, 111459, - 111464, 111468, 111473, 111478, 111484, 111489, 111495, 111499, 111504, - 111508, 111513, 111517, 111522, 111527, 111532, 111537, 111542, 111547, - 111552, 111557, 111562, 111567, 111572, 111577, 111582, 111587, 111591, - 111596, 111601, 111606, 111610, 111614, 111619, 111624, 111629, 111633, - 111637, 111641, 111645, 111650, 111655, 111660, 111664, 111668, 111674, - 111679, 111685, 111690, 111696, 111702, 0, 0, 111709, 111714, 111720, - 111725, 111731, 111736, 111741, 111746, 111751, 111756, 111761, 111765, - 111770, 111776, 111781, 111787, 111793, 111799, 111807, 111820, 111833, - 111846, 111860, 111875, 111883, 111894, 111903, 111913, 111923, 111933, - 111944, 111956, 111969, 111977, 111985, 111994, 112000, 112007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 112015, 112019, 112024, 112028, 112033, 112037, - 112042, 112047, 112053, 112058, 112064, 112068, 112073, 112077, 112082, - 112086, 112091, 112096, 112101, 112106, 112111, 112116, 112121, 112126, - 112131, 112136, 112141, 112146, 112151, 112156, 112160, 112165, 112170, - 112175, 112179, 112183, 112188, 112193, 112198, 112202, 112206, 112210, - 112214, 112219, 112224, 112229, 112233, 112237, 112242, 112248, 112253, - 112259, 112264, 112270, 112276, 112283, 112289, 112296, 112301, 112307, - 112312, 112318, 112323, 112328, 112333, 112338, 112342, 112347, 112352, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112357, 112362, 112366, 112370, 112374, - 112378, 112382, 112386, 112390, 112394, 0, 0, 0, 0, 0, 0, 112398, 112404, - 112409, 112416, 112424, 112431, 112439, 112448, 112453, 112462, 112467, - 112475, 112484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 112494, 112498, 112503, 112507, 112512, 112516, 112521, 112525, 112530, - 112534, 112539, 112543, 112548, 112553, 112558, 112563, 112568, 112573, - 112578, 112583, 112588, 112593, 112598, 112603, 112608, 112613, 112617, - 112622, 112627, 112632, 112636, 112640, 112645, 112650, 112655, 112659, - 112663, 112667, 112671, 112676, 112681, 112685, 112689, 112694, 112699, - 112704, 112710, 112715, 112721, 112726, 112732, 112737, 112743, 112748, - 112754, 112759, 112764, 0, 0, 0, 0, 0, 0, 0, 112771, 112776, 112780, - 112784, 112788, 112792, 112796, 112800, 112804, 112808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 112812, 112816, 112821, 112826, 112830, 112834, 112840, 112844, 112849, - 112854, 112858, 112863, 112868, 112873, 112877, 112881, 112885, 112890, - 112894, 112898, 112903, 112908, 112913, 112920, 112925, 112930, 112935, - 0, 0, 112942, 112949, 112956, 112965, 112970, 112976, 112981, 112987, - 112992, 112998, 113003, 113009, 113014, 113020, 113026, 0, 0, 0, 0, - 113031, 113036, 113040, 113044, 113048, 113052, 113056, 113060, 113064, - 113068, 113072, 113077, 113082, 113088, 113093, 113098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99584, 99589, 99594, 99599, 99604, 99609, + 99614, 99619, 99624, 99629, 99634, 99639, 99644, 99649, 99654, 99659, + 99664, 99669, 99674, 99679, 99684, 99689, 99694, 99699, 99704, 99709, + 99714, 99719, 99724, 99729, 99734, 99739, 99744, 99749, 99754, 99759, + 99764, 99769, 99774, 99779, 99784, 99789, 99794, 99799, 99804, 99809, + 99814, 99819, 99824, 99829, 99834, 99839, 99844, 99849, 99854, 99859, + 99864, 99869, 99874, 99879, 99884, 99889, 99894, 99899, 99904, 99909, + 99914, 99919, 99924, 99929, 99934, 99939, 99944, 99949, 99954, 99959, + 99964, 99969, 99974, 99979, 99984, 99989, 99994, 99999, 100004, 100009, + 100014, 100019, 100024, 100029, 100034, 100039, 100044, 100049, 100054, + 100059, 100064, 100069, 100074, 100079, 100084, 100089, 100094, 100099, + 100104, 100109, 100114, 100119, 100124, 100129, 100134, 100139, 100144, + 100149, 100154, 100159, 100164, 100169, 100174, 100179, 100184, 100189, + 100194, 100199, 100204, 100209, 100214, 100219, 100224, 100229, 100234, + 100239, 100244, 100249, 100254, 100259, 100264, 100269, 100274, 100279, + 100284, 100289, 100294, 100299, 100304, 100309, 100314, 100319, 100324, + 100329, 100334, 100339, 100344, 100349, 100354, 100359, 100364, 100369, + 100374, 100379, 100384, 100389, 100394, 100399, 100404, 100409, 100414, + 100419, 100424, 100429, 100434, 100439, 100444, 100449, 100454, 100459, + 100464, 100469, 100474, 100479, 100484, 100489, 100494, 100499, 100504, + 100509, 100514, 100519, 100524, 100529, 100534, 100539, 100544, 100549, + 100554, 100559, 100564, 100569, 100574, 100579, 100584, 100589, 100594, + 100599, 100604, 100609, 100614, 100619, 100624, 100629, 100634, 100639, + 100644, 100649, 100654, 100659, 100664, 100669, 100674, 100679, 100684, + 100689, 100694, 100699, 100704, 100709, 100714, 100719, 100724, 100729, + 100734, 100739, 100744, 100749, 100754, 100759, 100764, 100769, 100774, + 100779, 100784, 100789, 100794, 100799, 100804, 100809, 100814, 100819, + 100824, 100829, 100834, 100839, 100844, 100849, 100854, 100859, 100864, + 100869, 100874, 100879, 100884, 100889, 100894, 100899, 100904, 100909, + 100914, 100919, 100924, 100929, 100934, 100939, 100944, 100949, 100954, + 100959, 100964, 100969, 100974, 100979, 100984, 100989, 100994, 100999, + 101004, 101009, 101014, 101019, 101024, 101029, 101034, 101039, 101044, + 101049, 101054, 101059, 101064, 101069, 101074, 101079, 101084, 101089, + 101094, 101099, 101104, 101109, 101114, 101119, 101124, 101129, 101134, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 101139, 101145, 101152, 101159, 101165, + 101172, 101179, 101186, 101193, 101199, 101206, 101213, 101220, 101227, + 101234, 101241, 101248, 101255, 101262, 101269, 101276, 101283, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 101290, 101295, 101300, 101305, 101310, 101315, + 101320, 101325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113103, 113107, 113112, 113116, 113121, - 113125, 113130, 113134, 113139, 113143, 113148, 113152, 113157, 113162, - 113167, 113172, 113177, 113182, 113187, 113192, 113197, 113202, 113207, - 113212, 113217, 113222, 113226, 113231, 113236, 113241, 113245, 113249, - 113254, 113259, 113264, 113268, 113272, 113276, 113280, 113285, 113290, - 113295, 113299, 113303, 113308, 113314, 113319, 113325, 113330, 113336, - 113342, 113349, 113354, 113360, 113365, 113371, 113376, 113381, 113386, - 113391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 113396, 113404, 113411, 113419, 113427, 113434, 113442, - 113450, 113458, 113465, 113472, 113480, 113488, 113496, 113504, 113512, - 113520, 113528, 113536, 113544, 113552, 113560, 113568, 113576, 113584, - 113592, 113600, 113608, 113616, 113624, 113632, 113640, 113648, 113656, - 113663, 113671, 113679, 113686, 113694, 113702, 113710, 113717, 113724, - 113732, 113740, 113748, 113756, 113764, 113772, 113780, 113788, 113796, - 113804, 113812, 113820, 113828, 113836, 113844, 113852, 113860, 113868, - 113876, 113884, 113892, 113900, 113907, 113913, 113919, 113925, 113931, - 113937, 113943, 113949, 113955, 113961, 113968, 113975, 113982, 113989, - 113996, 114003, 114010, 114017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 114024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114030, 114034, 114039, 114043, 114048, - 114052, 114057, 114062, 0, 0, 114068, 114072, 114077, 114081, 114086, - 114090, 114095, 114100, 114105, 114110, 114115, 114120, 114125, 114130, - 114135, 114140, 114145, 114150, 114155, 114160, 114164, 114169, 114174, - 114179, 114183, 114187, 114192, 114197, 114202, 114206, 114210, 114214, - 114218, 114223, 114228, 114233, 114237, 114241, 114246, 114251, 114257, - 114262, 114268, 114273, 114279, 114285, 0, 0, 114292, 114297, 114303, - 114308, 114314, 114319, 114324, 114329, 114334, 114339, 114343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 114350, 114355, 114361, 114368, 114374, 114380, 114387, 114393, 114400, - 114407, 114415, 114422, 114427, 114433, 114439, 114445, 114451, 114457, - 114463, 114469, 114475, 114481, 114487, 114493, 114499, 114505, 114510, - 114516, 114522, 114528, 114533, 114538, 114544, 114550, 114556, 114561, - 114567, 114573, 114579, 114585, 114591, 114597, 114603, 114608, 114613, - 114618, 114624, 114630, 114636, 114641, 114646, 114652, 114658, 114664, - 114670, 114679, 114688, 114694, 114700, 114707, 114714, 114721, 114728, - 114736, 114743, 114751, 114757, 114763, 114770, 114777, 114786, 114796, - 0, 0, 0, 0, 0, 0, 0, 0, 114801, 114805, 114810, 114816, 114821, 114826, - 114831, 114837, 114843, 114849, 114855, 114861, 114867, 114871, 114876, - 114881, 114886, 114891, 114896, 114901, 114906, 114911, 114916, 114921, - 114926, 114931, 114936, 114941, 114945, 114950, 114955, 114960, 114964, - 114968, 114973, 114978, 114983, 114987, 114992, 114997, 115002, 115007, - 115012, 115017, 115021, 115025, 115029, 115034, 115039, 115044, 115048, - 115052, 115057, 115062, 115067, 115073, 115079, 115086, 115092, 115099, - 115106, 115113, 115120, 115127, 115134, 115141, 115147, 115153, 115160, - 115167, 115174, 115179, 115184, 115189, 115193, 115198, 115203, 115209, - 115214, 115230, 115244, 115255, 115261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115267, 115275, - 115283, 115291, 115299, 115308, 115317, 115326, 115335, 115343, 115352, - 115361, 115369, 115378, 115387, 115395, 115404, 115412, 115421, 115429, - 115438, 115447, 115455, 115463, 115471, 115479, 115487, 115496, 115505, - 115515, 115525, 115535, 115545, 115555, 115564, 115574, 115584, 115594, - 115605, 115615, 115627, 115639, 115650, 115664, 115675, 115685, 115697, - 115708, 115718, 115730, 115742, 115753, 115764, 115774, 115784, 115796, - 115807, 0, 0, 0, 0, 0, 0, 0, 115819, 115823, 115828, 115832, 115837, - 115841, 115846, 115851, 115857, 0, 115862, 115866, 115871, 115875, - 115880, 115884, 115889, 115894, 115899, 115904, 115909, 115914, 115919, - 115924, 115929, 115934, 115939, 115944, 115949, 115954, 115958, 115963, - 115968, 115973, 115977, 115981, 115986, 115991, 115996, 116000, 116004, - 116008, 116012, 116017, 116022, 116027, 116031, 116035, 116041, 116046, - 116052, 116057, 116063, 116069, 116076, 0, 116082, 116087, 116093, - 116098, 116104, 116109, 116114, 116119, 116124, 116129, 116133, 116138, - 116144, 116150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116156, 116161, 116165, - 116169, 116173, 116177, 116181, 116185, 116189, 116193, 116197, 116201, - 116205, 116209, 116213, 116217, 116221, 116225, 116229, 116233, 116238, - 116243, 116248, 116253, 116258, 116263, 116268, 116273, 116278, 0, 0, 0, - 116285, 116290, 116295, 116299, 116304, 116309, 116314, 116319, 116324, - 116329, 116334, 116338, 116343, 116348, 116352, 116356, 116361, 116366, - 116370, 116375, 116380, 116385, 116390, 116395, 116400, 116405, 116409, - 116413, 116417, 116422, 116426, 116430, 0, 0, 116434, 116440, 116447, - 116454, 116461, 116468, 116475, 116482, 116489, 116495, 116502, 116509, - 116515, 116521, 116528, 116535, 116541, 116548, 116555, 116562, 116569, - 116576, 0, 116583, 116589, 116595, 116601, 116608, 116614, 116620, - 116626, 116632, 116637, 116642, 116647, 116652, 116657, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101330, 101334, 101338, 101342, + 101346, 101350, 0, 0, 101355, 0, 101360, 101364, 101369, 101374, 101379, + 101384, 101388, 101393, 101398, 101403, 101408, 101412, 101417, 101422, + 101427, 101432, 101436, 101441, 101446, 101451, 101456, 101460, 101465, + 101470, 101475, 101480, 101484, 101489, 101494, 101499, 101504, 101508, + 101513, 101518, 101523, 101528, 101532, 101537, 101542, 101546, 101551, + 101556, 101561, 101566, 0, 101571, 101576, 0, 0, 0, 101581, 0, 0, 101586, + 101591, 101598, 101605, 101612, 101619, 101626, 101633, 101640, 101647, + 101654, 101661, 101668, 101675, 101682, 101689, 101696, 101703, 101710, + 101717, 101724, 101731, 101738, 0, 101745, 101752, 101758, 101764, + 101770, 101777, 101784, 101792, 101799, 101807, 101812, 101817, 101822, + 101827, 101832, 101837, 101842, 101847, 101852, 101857, 101862, 101867, + 101872, 101878, 101883, 101888, 101893, 101898, 101903, 101908, 101913, + 101918, 101923, 101929, 101935, 101939, 101943, 101947, 101951, 101955, + 101960, 101965, 101971, 101976, 101982, 101987, 101992, 101997, 102003, + 102008, 102013, 102018, 102023, 102028, 102034, 102039, 102045, 102050, + 102056, 102061, 102067, 102072, 102078, 102083, 102088, 102093, 102098, + 102103, 102108, 102113, 102119, 102124, 0, 0, 0, 0, 0, 0, 0, 0, 102129, + 102133, 102137, 102141, 102145, 102151, 102155, 102160, 102165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102171, + 102176, 102181, 102186, 102191, 102196, 102201, 102206, 102211, 102216, + 102221, 102226, 102231, 102236, 102241, 102246, 102251, 102256, 102261, + 0, 102266, 102271, 0, 0, 0, 0, 0, 102276, 102280, 102284, 102289, 102294, + 102300, 102305, 102310, 102315, 102320, 102325, 102330, 102335, 102340, + 102345, 102350, 102355, 102360, 102365, 102370, 102375, 102380, 102385, + 102390, 102395, 102400, 102405, 102410, 102414, 102419, 102424, 102430, + 102434, 0, 0, 0, 102438, 102444, 102448, 102453, 102458, 102463, 102467, + 102472, 102476, 102481, 102486, 102490, 102495, 102500, 102504, 102508, + 102513, 102518, 102522, 102527, 102532, 102537, 102542, 102547, 102552, + 102557, 102562, 0, 0, 0, 0, 0, 102567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116662, 116667, - 116673, 116678, 116684, 116689, 116695, 0, 116700, 116706, 0, 116711, - 116717, 116722, 116728, 116734, 116740, 116746, 116752, 116758, 116764, - 116770, 116776, 116782, 116788, 116794, 116800, 116806, 116811, 116817, - 116823, 116829, 116834, 116839, 116845, 116851, 116857, 116862, 116867, - 116872, 116877, 116883, 116889, 116895, 116900, 116905, 116911, 116917, - 116923, 116929, 116936, 116942, 116949, 116955, 116962, 0, 0, 0, 116969, - 0, 116975, 116982, 0, 116988, 116995, 117001, 117007, 117013, 117019, - 117025, 117030, 117035, 0, 0, 0, 0, 0, 0, 0, 0, 117040, 117046, 117051, - 117056, 117061, 117066, 117071, 117076, 117081, 117086, 0, 0, 0, 0, 0, 0, - 117091, 117096, 117102, 117107, 117113, 117118, 0, 117124, 117130, 0, - 117136, 117142, 117148, 117153, 117159, 117165, 117171, 117176, 117181, - 117187, 117192, 117198, 117203, 117209, 117215, 117221, 117227, 117232, - 117238, 117244, 117250, 117256, 117262, 117268, 117274, 117280, 117286, - 117292, 117297, 117303, 117308, 117313, 117318, 117325, 117331, 117338, - 117344, 0, 117351, 117358, 0, 117365, 117372, 117379, 117385, 117391, - 117396, 0, 0, 0, 0, 0, 0, 0, 117401, 117407, 117412, 117417, 117422, - 117427, 117432, 117437, 117442, 117447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 102572, 102577, 102582, 102587, 102592, 102597, 102603, + 102609, 102615, 102620, 102625, 102630, 102636, 102642, 102648, 102653, + 102659, 102664, 102670, 102676, 102681, 102687, 102693, 102698, 102704, + 102709, 102715, 102721, 102727, 102732, 102738, 102744, 102750, 102755, + 102760, 102765, 102770, 102775, 102781, 102787, 102792, 102797, 102802, + 102808, 102813, 102818, 102824, 102830, 102835, 102842, 102848, 102853, + 102859, 102864, 102870, 102875, 0, 0, 0, 0, 102881, 102890, 102898, + 102905, 102912, 102917, 102922, 102927, 102932, 102937, 102942, 102947, + 102952, 102957, 102963, 102969, 102975, 102981, 102987, 102993, 0, 0, + 102999, 103006, 103013, 103020, 103028, 103036, 103044, 103052, 103060, + 103068, 103074, 103080, 103086, 103093, 103100, 103107, 103114, 103121, + 103128, 103135, 103142, 103149, 103156, 103163, 103170, 103177, 103184, + 103191, 103199, 103207, 103215, 103224, 103233, 103242, 103251, 103260, + 103269, 103277, 103285, 103293, 103302, 103311, 103320, 103329, 103338, + 103347, 103356, 103360, 103365, 103370, 0, 103376, 103381, 0, 0, 0, 0, 0, + 103386, 103392, 103399, 103404, 103409, 103413, 103418, 103423, 0, + 103428, 103433, 103438, 0, 103443, 103448, 103453, 103458, 103463, + 103468, 103473, 103477, 103482, 103487, 103492, 103496, 103500, 103505, + 103510, 103515, 103519, 103523, 103527, 103531, 103536, 103541, 103546, + 103550, 103555, 103559, 103564, 103569, 103574, 0, 0, 103579, 103585, + 103590, 0, 0, 0, 0, 103595, 103599, 103603, 103607, 103611, 103615, + 103620, 103625, 103631, 103636, 0, 0, 0, 0, 0, 0, 0, 103643, 103649, + 103656, 103662, 103669, 103675, 103681, 103687, 103694, 0, 0, 0, 0, 0, 0, + 0, 103700, 103708, 103716, 103724, 103732, 103740, 103748, 103756, + 103764, 103772, 103780, 103788, 103796, 103804, 103812, 103820, 103828, + 103836, 103844, 103852, 103860, 103868, 103876, 103884, 103892, 103900, + 103908, 103916, 103924, 103932, 103939, 103947, 103955, 103962, 103969, + 103976, 103983, 103990, 103997, 104004, 104011, 104018, 104025, 104032, + 104039, 104046, 104053, 104060, 104067, 104074, 104081, 104088, 104095, + 104102, 104109, 104116, 104123, 104130, 104137, 104144, 104151, 104158, + 104164, 104171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104178, 104183, 104188, 104193, + 104198, 104203, 104208, 104213, 104218, 104223, 104228, 104233, 104238, + 104243, 104248, 104253, 104258, 104263, 104268, 104273, 104278, 104283, + 104288, 104293, 104298, 104303, 104308, 104313, 104318, 104323, 104328, + 104333, 104338, 104343, 104348, 104353, 104358, 104363, 104369, 0, 0, 0, + 0, 104375, 104379, 104383, 104388, 104393, 104399, 104405, 104411, + 104421, 104430, 104436, 104443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104451, + 104455, 104460, 104465, 104470, 104475, 104480, 104485, 104490, 104494, + 104499, 104503, 104508, 104512, 104517, 104521, 104526, 104531, 104536, + 104541, 104546, 104551, 104556, 104561, 104566, 104571, 104576, 104581, + 104586, 104591, 104596, 104601, 104606, 104611, 104616, 104621, 104626, + 104631, 104636, 104641, 104646, 104651, 104656, 104661, 104666, 104671, + 104676, 104681, 104686, 104691, 104696, 104701, 104706, 104711, 0, 0, 0, + 104716, 104721, 104731, 104740, 104750, 104760, 104771, 104782, 104789, + 104796, 104803, 104810, 104817, 104824, 104831, 104838, 104845, 104852, + 104859, 104866, 104873, 104880, 104887, 104894, 104901, 104908, 104915, + 104922, 104929, 0, 0, 104936, 104942, 104948, 104954, 104960, 104967, + 104974, 104982, 104989, 104996, 105003, 105010, 105017, 105024, 105031, + 105038, 105045, 105052, 105059, 105066, 105073, 105080, 105087, 105094, + 105101, 105108, 105115, 0, 0, 0, 0, 0, 105122, 105128, 105134, 105140, + 105146, 105153, 105160, 105168, 105175, 105182, 105189, 105196, 105203, + 105210, 105217, 105224, 105231, 105238, 105245, 105252, 105259, 105266, + 105273, 105280, 105287, 105294, 0, 0, 0, 0, 0, 0, 0, 105301, 105308, + 105316, 105327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105338, 105344, + 105350, 105356, 105362, 105369, 105376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105384, + 105391, 105398, 105406, 105413, 105420, 105427, 105434, 105442, 105450, + 105458, 105466, 105474, 105482, 105490, 105498, 105506, 105514, 105522, + 105530, 105538, 105546, 105554, 105562, 105570, 105578, 105586, 105594, + 105602, 105610, 105618, 105626, 105634, 105642, 105650, 105658, 105666, + 105674, 105682, 105690, 105698, 105706, 105714, 105722, 105730, 105738, + 105746, 105754, 105762, 105770, 105778, 105786, 105794, 105802, 105810, + 105818, 105826, 105834, 105842, 105850, 105858, 105866, 105874, 105882, + 105890, 105898, 105906, 105914, 105922, 105930, 105938, 105946, 105954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 105962, 105967, 105973, 105979, 105985, 105991, + 105997, 106003, 106009, 106015, 106020, 106027, 106033, 106039, 106045, + 106051, 106057, 106062, 106068, 106074, 106080, 106086, 106092, 106098, + 106104, 106110, 106116, 106122, 106127, 106133, 106141, 106149, 106155, + 106161, 106167, 106173, 106181, 106187, 106193, 106199, 106205, 106211, + 106217, 106222, 106228, 106236, 106244, 106250, 106256, 106262, 106269, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106275, 106280, 106286, 106292, + 106298, 106304, 106310, 106316, 106322, 106328, 106333, 106340, 106346, + 106352, 106358, 106364, 106370, 106375, 106381, 106387, 106393, 106399, + 106405, 106411, 106417, 106423, 106429, 106435, 106440, 106446, 106454, + 106462, 106468, 106474, 106480, 106486, 106494, 106500, 106506, 106512, + 106518, 106524, 106530, 106535, 106541, 106549, 106557, 106563, 106569, + 106575, 106582, 0, 0, 0, 0, 0, 0, 0, 106588, 106592, 106596, 106601, + 106606, 106612, 106617, 106623, 106630, 106636, 106642, 106649, 106656, + 106663, 106669, 106676, 106683, 106690, 106697, 106703, 106710, 106717, + 106723, 106730, 106736, 106743, 106749, 106755, 106761, 106768, 106777, + 106783, 106791, 106798, 106805, 106812, 106818, 106824, 106830, 106836, + 106842, 106849, 106858, 106865, 106872, 106879, 0, 0, 0, 0, 0, 0, 0, 0, + 106886, 106893, 106899, 106905, 106911, 106917, 106923, 106929, 106935, + 106941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117452, 117456, 117461, 117466, 117470, 117475, 117479, 117483, - 117488, 117492, 117497, 117502, 117507, 117511, 117515, 117519, 117524, - 117528, 117532, 117536, 117541, 117546, 117551, 117556, 117560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117567, - 117572, 117577, 117582, 117587, 117592, 117597, 117602, 117607, 117612, - 117617, 117622, 117627, 117632, 117637, 117642, 117647, 117652, 117657, - 117662, 117667, 117675, 117679, 117683, 117687, 117691, 117695, 117699, - 117703, 117707, 117711, 117715, 117719, 117723, 117727, 117731, 117735, - 117741, 117747, 117751, 117757, 117763, 117768, 117772, 117777, 117781, - 117785, 117791, 117797, 117801, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117805, 117813, 117816, 117821, 117827, 117835, 117840, 117846, 117854, - 117860, 117866, 117870, 117874, 117881, 117890, 117897, 117906, 117912, - 117921, 117928, 117935, 117942, 117952, 117958, 117962, 117969, 117978, - 117988, 117995, 118002, 118006, 118010, 118017, 118027, 118031, 118038, - 118045, 118052, 118058, 118065, 118072, 118079, 118086, 118090, 118094, - 118098, 118105, 118109, 118116, 118123, 118137, 118146, 118150, 118154, - 118158, 118165, 118169, 118173, 118177, 118185, 118193, 118212, 118222, - 118242, 118246, 118250, 118254, 118258, 118262, 118266, 118270, 118277, - 118281, 118284, 118288, 118292, 118298, 118305, 118314, 118318, 118327, - 118336, 118344, 118348, 118355, 118359, 118363, 118367, 118371, 118382, - 118391, 118400, 118409, 118418, 118430, 118439, 118448, 118457, 118465, - 118474, 118486, 118495, 118503, 118512, 118524, 118533, 118542, 118554, - 118563, 118572, 118584, 118593, 118597, 118601, 118605, 118609, 118613, - 118617, 118621, 118628, 118632, 118636, 118647, 118651, 118655, 118662, - 118668, 118674, 118678, 118685, 118689, 118693, 118697, 118701, 118705, - 118709, 118715, 118723, 118727, 118731, 118734, 118741, 118753, 118757, - 118769, 118776, 118783, 118790, 118797, 118803, 118807, 118811, 118815, - 118819, 118826, 118835, 118842, 118850, 118858, 118864, 118868, 118872, - 118876, 118880, 118886, 118895, 118907, 118914, 118921, 118930, 118941, - 118947, 118956, 118965, 118972, 118981, 118988, 118994, 119004, 119011, - 119018, 119025, 119032, 119036, 119042, 119046, 119057, 119065, 119074, - 119086, 119093, 119100, 119110, 119117, 119126, 119133, 119142, 119149, - 119156, 119166, 119173, 119180, 119189, 119196, 119208, 119217, 119224, - 119231, 119238, 119247, 119257, 119270, 119277, 119286, 119296, 119303, - 119312, 119325, 119332, 119339, 119346, 119356, 119366, 119372, 119382, - 119389, 119396, 119406, 119412, 119419, 119426, 119433, 119443, 119450, - 119457, 119464, 119470, 119477, 119487, 119494, 119498, 119506, 119510, - 119522, 119526, 119540, 119544, 119548, 119552, 119556, 119562, 119569, - 119577, 119581, 119585, 119589, 119593, 119600, 119604, 119610, 119616, - 119624, 119628, 119635, 119643, 119647, 119651, 119657, 119661, 119670, - 119679, 119686, 119696, 119702, 119706, 119710, 119718, 119725, 119732, - 119738, 119742, 119750, 119754, 119761, 119773, 119780, 119790, 119796, - 119800, 119809, 119816, 119825, 119829, 119833, 119840, 119844, 119848, - 119852, 119856, 119859, 119865, 119871, 119875, 119879, 119886, 119893, - 119900, 119907, 119914, 119921, 119928, 119935, 119941, 119945, 119949, - 119956, 119963, 119970, 119977, 119984, 119988, 119991, 119996, 120000, - 120004, 120013, 120022, 120026, 120030, 120036, 120042, 120059, 120065, - 120069, 120078, 120082, 120086, 120093, 120101, 120109, 120115, 120119, - 120123, 120127, 120131, 120134, 120140, 120147, 120157, 120164, 120171, - 120178, 120184, 120191, 120198, 120205, 120212, 120219, 120228, 120235, - 120247, 120254, 120261, 120271, 120282, 120289, 120296, 120303, 120310, - 120317, 120324, 120331, 120338, 120345, 120352, 120362, 120372, 120382, - 120389, 120399, 120406, 120413, 120420, 120427, 120433, 120440, 120447, - 120454, 120461, 120468, 120475, 120482, 120489, 120495, 120502, 120509, - 120518, 120525, 120532, 120536, 120544, 120548, 120552, 120556, 120560, - 120564, 120571, 120575, 120584, 120588, 120595, 120603, 120607, 120611, - 120615, 120628, 120644, 120648, 120652, 120659, 120665, 120672, 120676, - 120680, 120684, 120688, 120692, 120699, 120703, 120721, 120725, 120729, - 120736, 120740, 120744, 120750, 120754, 120758, 120766, 120770, 120774, - 120777, 120781, 120787, 120798, 120807, 120816, 120823, 120830, 120841, - 120848, 120855, 120862, 120869, 120876, 120883, 120890, 120900, 120906, - 120913, 120923, 120932, 120939, 120948, 120958, 120965, 120972, 120979, - 120986, 120998, 121005, 121012, 121019, 121026, 121033, 121043, 121050, - 121057, 121067, 121080, 121092, 121099, 121109, 121116, 121123, 121130, - 121144, 121150, 121158, 121168, 121178, 121185, 121192, 121198, 121202, - 121209, 121219, 121225, 121238, 121242, 121246, 121253, 121257, 121264, - 121274, 121278, 121282, 121286, 121290, 121294, 121301, 121305, 121312, - 121319, 121326, 121335, 121344, 121354, 121361, 121368, 121375, 121385, - 121392, 121402, 121409, 121419, 121426, 121433, 121443, 121453, 121460, - 121466, 121474, 121482, 121488, 121494, 121498, 121502, 121509, 121517, - 121523, 121527, 121531, 121535, 121542, 121554, 121557, 121564, 121570, - 121574, 121578, 121582, 121586, 121590, 121594, 121598, 121602, 121606, - 121610, 121617, 121621, 121627, 121631, 121635, 121639, 121645, 121652, - 121659, 121666, 121677, 121685, 121689, 121695, 121704, 121711, 121717, - 121720, 121724, 121728, 121734, 121743, 121751, 121755, 121761, 121765, - 121769, 121773, 121779, 121786, 121792, 121796, 121802, 121806, 121810, - 121819, 121831, 121835, 121842, 121849, 121859, 121866, 121878, 121885, - 121892, 121899, 121910, 121920, 121933, 121943, 121950, 121954, 121958, - 121962, 121966, 121975, 121984, 121993, 122010, 122019, 122025, 122032, - 122040, 122053, 122057, 122066, 122075, 122084, 122093, 122104, 122113, - 122121, 122130, 122139, 122148, 122157, 122167, 122170, 122174, 122178, - 122182, 122186, 122190, 122196, 122203, 122210, 122217, 122223, 122229, - 122236, 122242, 122249, 122257, 122261, 122268, 122275, 122282, 122290, - 122293, 122297, 122301, 122305, 122308, 122314, 122318, 122324, 122331, - 122338, 122344, 122351, 122358, 122365, 122372, 122379, 122386, 122393, - 122400, 122407, 122414, 122421, 122428, 122435, 122442, 122448, 122452, - 122461, 122465, 122469, 122473, 122477, 122483, 122490, 122497, 122504, - 122511, 122518, 122524, 122532, 122536, 122540, 122544, 122548, 122554, - 122571, 122588, 122592, 122596, 122600, 122604, 122608, 122612, 122618, - 122625, 122629, 122635, 122642, 122649, 122656, 122663, 122670, 122679, - 122686, 122693, 122700, 122707, 122711, 122715, 122721, 122733, 122737, - 122741, 122750, 122754, 122758, 122762, 122768, 122772, 122776, 122785, - 122789, 122793, 122797, 122804, 122808, 122812, 122816, 122820, 122824, - 122828, 122832, 122835, 122841, 122848, 122855, 122861, 122865, 122882, - 122888, 122892, 122898, 122904, 122910, 122916, 122922, 122928, 122932, - 122936, 122940, 122946, 122950, 122956, 122960, 122964, 122971, 122978, - 122995, 122999, 123003, 123007, 123011, 123015, 123027, 123030, 123035, - 123040, 123055, 123065, 123077, 123081, 123085, 123089, 123095, 123102, - 123109, 123119, 123131, 123137, 123143, 123152, 123156, 123160, 123167, - 123177, 123184, 123190, 123194, 123198, 123205, 123211, 123215, 123221, - 123225, 123233, 123239, 123243, 123251, 123259, 123266, 123272, 123279, - 123286, 123296, 123306, 123310, 123314, 123318, 123322, 123328, 123335, - 123341, 123348, 123355, 123362, 123371, 123378, 123385, 123391, 123398, - 123405, 123412, 123419, 123426, 123433, 123439, 123446, 123453, 123460, - 123469, 123476, 123483, 123487, 123493, 123497, 123503, 123510, 123517, - 123524, 123528, 123532, 123536, 123540, 123544, 123551, 123555, 123559, - 123565, 123573, 123577, 123581, 123585, 123589, 123596, 123600, 123604, - 123612, 123616, 123620, 123624, 123628, 123634, 123638, 123642, 123648, - 123655, 123661, 123668, 123680, 123684, 123691, 123698, 123705, 123712, - 123724, 123731, 123735, 123739, 123743, 123750, 123757, 123764, 123771, - 123781, 123788, 123794, 123801, 123808, 123815, 123822, 123831, 123841, - 123848, 123852, 123859, 123863, 123867, 123871, 123878, 123885, 123895, - 123901, 123905, 123914, 123918, 123925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123929, 123935, - 123941, 123948, 123955, 123962, 123969, 123976, 123983, 123989, 123996, - 124003, 124010, 124017, 124024, 124031, 124037, 124043, 124049, 124055, - 124061, 124067, 124073, 124079, 124085, 124092, 124099, 124106, 124113, - 124120, 124127, 124133, 124139, 124145, 124152, 124159, 124165, 124171, - 124180, 124187, 124194, 124201, 124208, 124215, 124222, 124228, 124234, - 124240, 124249, 124256, 124263, 124274, 124285, 124291, 124297, 124303, - 124312, 124319, 124326, 124336, 124346, 124357, 124368, 124380, 124393, - 124404, 124415, 124427, 124440, 124451, 124462, 124473, 124484, 124495, - 124507, 124515, 124523, 124532, 124541, 124550, 124556, 124562, 124568, - 124575, 124585, 124592, 124602, 124607, 124612, 124618, 124624, 124632, - 124640, 124649, 124660, 124671, 124679, 124687, 124696, 124705, 124713, - 124720, 124728, 124736, 124743, 124750, 124759, 124768, 124777, 124786, - 124795, 0, 124804, 124815, 124822, 124830, 124838, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 124846, 124855, 124862, 124869, 124878, 124885, 124892, - 124899, 124909, 124916, 124923, 124930, 124938, 124945, 124952, 124959, - 124970, 124977, 124984, 124991, 124998, 125005, 125014, 125021, 125027, - 125034, 125043, 125050, 125057, 125064, 125074, 125081, 125088, 125098, - 125108, 125115, 125122, 125129, 125136, 125143, 125150, 125159, 125166, - 125173, 125179, 125187, 125196, 125205, 125216, 125224, 125233, 125242, - 125251, 125260, 125267, 125274, 125283, 125295, 125305, 125312, 125319, - 125329, 125339, 125348, 125358, 125365, 125375, 125382, 125389, 125396, - 125406, 125416, 125423, 125430, 125440, 125446, 125457, 125466, 125476, - 125484, 125497, 125504, 125510, 125518, 125525, 125535, 125539, 125543, - 125547, 125551, 125555, 125559, 125563, 125572, 125576, 125583, 125587, - 125591, 125595, 125599, 125603, 125607, 125611, 125615, 125619, 125623, - 125627, 125631, 125635, 125639, 125643, 125647, 125651, 125655, 125659, - 125666, 125673, 125683, 125696, 125706, 125710, 125714, 125718, 125722, - 125726, 125730, 125734, 125738, 125742, 125746, 125750, 125757, 125764, - 125775, 125782, 125788, 125795, 125802, 125809, 125816, 125823, 125827, - 125831, 125838, 125845, 125852, 125861, 125868, 125881, 125891, 125898, - 125905, 125909, 125913, 125922, 125929, 125936, 125943, 125956, 125963, - 125970, 125980, 125990, 125999, 126006, 126013, 126020, 126027, 126034, - 126041, 126051, 126057, 126065, 126072, 126080, 126087, 126098, 126105, - 126111, 126118, 126125, 126132, 126139, 126149, 126159, 126166, 126173, - 126182, 126190, 126196, 126203, 126210, 126217, 126224, 126228, 126238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126248, 126252, 126256, 126260, - 126264, 126268, 126272, 126276, 126280, 126284, 126288, 126292, 126296, - 126300, 126304, 126308, 126312, 126316, 126320, 126324, 126328, 126332, - 126336, 126340, 126344, 126348, 126352, 126356, 126360, 126364, 126368, - 126372, 126376, 126380, 126384, 126388, 126392, 126396, 126400, 126404, - 126408, 126412, 126416, 126420, 126424, 126428, 126432, 126436, 126440, - 126444, 126448, 126452, 126456, 126460, 126464, 126468, 126472, 126476, - 126480, 126484, 126488, 126492, 126496, 126500, 126504, 126508, 126512, - 126516, 126520, 126524, 126528, 126532, 126536, 126540, 126544, 126548, - 126552, 126556, 126560, 126564, 126568, 126572, 126576, 126580, 126584, - 126588, 126592, 126596, 126600, 126604, 126608, 126612, 126616, 126620, - 126624, 126628, 126632, 126636, 126640, 126644, 126648, 126652, 126656, - 126660, 126664, 126668, 126672, 126676, 126680, 126684, 126688, 126692, - 126696, 126700, 126704, 126708, 126712, 126716, 126720, 126724, 126728, - 126732, 126736, 126740, 126744, 126748, 126752, 126756, 126760, 126764, - 126768, 126772, 126776, 126780, 126784, 126788, 126792, 126796, 126800, - 126804, 126808, 126812, 126816, 126820, 126824, 126828, 126832, 126836, - 126840, 126844, 126848, 126852, 126856, 126860, 126864, 126868, 126872, - 126876, 126880, 126884, 126888, 126892, 126896, 126900, 126904, 126908, - 126912, 126916, 126920, 126924, 126928, 126932, 126936, 126940, 126944, - 126948, 126952, 126956, 126960, 126964, 126968, 126972, 126976, 126980, - 126984, 126988, 126992, 126996, 127000, 127004, 127008, 127012, 127016, - 127020, 127024, 127028, 127032, 127036, 127040, 127044, 127048, 127052, - 127056, 127060, 127064, 127068, 127072, 127076, 127080, 127084, 127088, - 127092, 127096, 127100, 127104, 127108, 127112, 127116, 127120, 127124, - 127128, 127132, 127136, 127140, 127144, 127148, 127152, 127156, 127160, - 127164, 127168, 127172, 127176, 127180, 127184, 127188, 127192, 127196, - 127200, 127204, 127208, 127212, 127216, 127220, 127224, 127228, 127232, - 127236, 127240, 127244, 127248, 127252, 127256, 127260, 127264, 127268, - 127272, 127276, 127280, 127284, 127288, 127292, 127296, 127300, 127304, - 127308, 127312, 127316, 127320, 127324, 127328, 127332, 127336, 127340, - 127344, 127348, 127352, 127356, 127360, 127364, 127368, 127372, 127376, - 127380, 127384, 127388, 127392, 127396, 127400, 127404, 127408, 127412, - 127416, 127420, 127424, 127428, 127432, 127436, 127440, 127444, 127448, - 127452, 127456, 127460, 127464, 127468, 127472, 127476, 127480, 127484, - 127488, 127492, 127496, 127500, 127504, 127508, 127512, 127516, 127520, - 127524, 127528, 127532, 127536, 127540, 127544, 127548, 127552, 127556, - 127560, 127564, 127568, 127572, 127576, 127580, 127584, 127588, 127592, - 127596, 127600, 127604, 127608, 127612, 127616, 127620, 127624, 127628, - 127632, 127636, 127640, 127644, 127648, 127652, 127656, 127660, 127664, - 127668, 127672, 127676, 127680, 127684, 127688, 127692, 127696, 127700, - 127704, 127708, 127712, 127716, 127720, 127724, 127728, 127732, 127736, - 127740, 127744, 127748, 127752, 127756, 127760, 127764, 127768, 127772, - 127776, 127780, 127784, 127788, 127792, 127796, 127800, 127804, 127808, - 127812, 127816, 127820, 127824, 127828, 127832, 127836, 127840, 127844, - 127848, 127852, 127856, 127860, 127864, 127868, 127872, 127876, 127880, - 127884, 127888, 127892, 127896, 127900, 127904, 127908, 127912, 127916, - 127920, 127924, 127928, 127932, 127936, 127940, 127944, 127948, 127952, - 127956, 127960, 127964, 127968, 127972, 127976, 127980, 127984, 127988, - 127992, 127996, 128000, 128004, 128008, 128012, 128016, 128020, 128024, - 128028, 128032, 128036, 128040, 128044, 128048, 128052, 128056, 128060, - 128064, 128068, 128072, 128076, 128080, 128084, 128088, 128092, 128096, - 128100, 128104, 128108, 128112, 128116, 128120, 128124, 128128, 128132, - 128136, 128140, 128144, 128148, 128152, 128156, 128160, 128164, 128168, - 128172, 128176, 128180, 128184, 128188, 128192, 128196, 128200, 128204, - 128208, 128212, 128216, 128220, 128224, 128228, 128232, 128236, 128240, - 128244, 128248, 128252, 128256, 128260, 128264, 128268, 128272, 128276, - 128280, 128284, 128288, 128292, 128296, 128300, 128304, 128308, 128312, - 128316, 128320, 128324, 128328, 128332, 128336, 128340, 128344, 128348, - 128352, 128356, 128360, 128364, 128368, 128372, 128376, 128380, 128384, - 128388, 128392, 128396, 128400, 128404, 128408, 128412, 128416, 128420, - 128424, 128428, 128432, 128436, 128440, 128444, 128448, 128452, 128456, - 128460, 128464, 128468, 128472, 128476, 128480, 128484, 128488, 128492, - 128496, 128500, 128504, 128508, 128512, 128516, 128520, 128524, 128528, - 128532, 128536, 128540, 128544, 128548, 128552, 128556, 128560, 128564, - 128568, 128572, 128576, 128580, 128584, 128588, 128592, 128596, 128600, - 128604, 128608, 128612, 128616, 128620, 128624, 128628, 128632, 128636, - 128640, 128644, 128648, 128652, 128656, 128660, 128664, 128668, 128672, - 128676, 128680, 128684, 128688, 128692, 128696, 128700, 128704, 128708, - 128712, 128716, 128720, 128724, 128728, 128732, 128736, 128740, 128744, - 128748, 128752, 128756, 128760, 128764, 128768, 128772, 128776, 128780, - 128784, 128788, 128792, 128796, 128800, 128804, 128808, 128812, 128816, - 128820, 128824, 128828, 128832, 128836, 128840, 128844, 128848, 128852, - 128856, 128860, 128864, 128868, 128872, 128876, 128880, 128884, 128888, - 128892, 128896, 128900, 128904, 128908, 128912, 128916, 128920, 128924, - 128928, 128932, 128936, 128940, 128944, 128948, 128952, 128956, 128960, - 128964, 128968, 128972, 128976, 128980, 128984, 128988, 128992, 128996, - 129000, 129004, 129008, 129012, 129016, 129020, 129024, 129028, 129032, - 129036, 129040, 129044, 129048, 129052, 129056, 129060, 129064, 129068, - 129072, 129076, 129080, 129084, 129088, 129092, 129096, 129100, 129104, - 129108, 129112, 129116, 129120, 129124, 129128, 129132, 129136, 129140, - 129144, 129148, 129152, 129156, 129160, 129164, 129168, 129172, 129176, - 129180, 129184, 129188, 129192, 129196, 129200, 129204, 129208, 129212, - 129216, 129220, 129224, 129228, 129232, 129236, 129240, 129244, 129248, - 129252, 129256, 129260, 129264, 129268, 129272, 129276, 129280, 129284, - 129288, 129292, 129296, 129300, 129304, 129308, 129312, 129316, 129320, - 129324, 129328, 129332, 129336, 129340, 129344, 129348, 129352, 129356, - 129360, 129364, 129368, 129372, 129376, 129380, 129384, 129388, 129392, - 129396, 129400, 129404, 129408, 129412, 129416, 129420, 129424, 129428, - 129432, 129436, 129440, 129444, 129448, 129452, 129456, 129460, 129464, - 129468, 129472, 129476, 129480, 129484, 129488, 129492, 129496, 129500, - 129504, 129508, 129512, 129516, 129520, 129524, 129528, 129532, 129536, - 129540, 129544, 129548, 129552, 129556, 129560, 129564, 129568, 129572, - 129576, 129580, 129584, 129588, 129592, 129596, 129600, 129604, 129608, - 129612, 129616, 129620, 129624, 129628, 129632, 129636, 129640, 129644, - 129648, 129652, 129656, 129660, 129664, 129668, 129672, 129676, 129680, - 129684, 129688, 129692, 129696, 129700, 129704, 129708, 129712, 129716, - 129720, 129724, 129728, 129732, 129736, 129740, 129744, 129748, 129752, - 129756, 129760, 129764, 129768, 129772, 129776, 129780, 129784, 129788, - 129792, 129796, 129800, 129804, 129808, 129812, 129816, 129820, 129824, - 129828, 129832, 129836, 129840, 129844, 129848, 129852, 129856, 129860, - 129864, 129868, 129872, 129876, 129880, 129884, 129888, 129892, 129896, - 129900, 129904, 129908, 129912, 129916, 129920, 129924, 129928, 129932, - 129936, 129940, 129944, 129948, 129952, 129956, 129960, 129964, 129968, - 129972, 129976, 129980, 129984, 129988, 129992, 129996, 130000, 130004, - 130008, 130012, 130016, 130020, 130024, 130028, 130032, 130036, 130040, - 130044, 130048, 130052, 130056, 130060, 130064, 130068, 130072, 130076, - 130080, 130084, 130088, 130092, 130096, 130100, 130104, 130108, 130112, - 130116, 130120, 130124, 130128, 130132, 130136, 130140, 130144, 130148, - 130152, 130156, 130160, 130164, 130168, 130172, 130176, 130180, 130184, - 130188, 130192, 130196, 130200, 130204, 130208, 130212, 130216, 130220, - 130224, 130228, 130232, 130236, 130240, 130244, 130248, 130252, 130256, - 130260, 130264, 130268, 130272, 130276, 130280, 130284, 130288, 130292, - 130296, 130300, 130304, 130308, 130312, 130316, 130320, 130324, 130328, - 130332, 130336, 130340, 130344, 130348, 130352, 130356, 130360, 130364, - 130368, 130372, 130376, 130380, 130384, 130388, 130392, 130396, 130400, - 130404, 130408, 130412, 130416, 130420, 130424, 130428, 130432, 130436, - 130440, 130444, 130448, 130452, 130456, 130460, 130464, 130468, 130472, - 130476, 130480, 130484, 130488, 130492, 130496, 130500, 130504, 130508, - 130512, 130516, 130520, 130524, 130528, 0, 130532, 130537, 130543, - 130553, 130563, 130573, 130583, 130589, 130595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130601, 130605, 130609, - 130613, 130617, 130621, 130625, 130629, 130633, 130637, 130641, 130645, - 130649, 130653, 130657, 130661, 130665, 130669, 130673, 130677, 130681, - 130685, 130689, 130693, 130697, 130701, 130705, 130709, 130713, 130717, - 130721, 130725, 130729, 130733, 130737, 130741, 130745, 130749, 130753, - 130757, 130761, 130765, 130769, 130773, 130777, 130781, 130785, 130789, - 130793, 130797, 130801, 130805, 130809, 130813, 130817, 130821, 130825, - 130829, 130833, 130837, 130841, 130845, 130849, 130853, 130857, 130861, - 130865, 130869, 130873, 130877, 130881, 130885, 130889, 130893, 130897, - 130901, 130905, 130909, 130913, 130917, 130921, 130925, 130929, 130933, - 130937, 130941, 130945, 130949, 130953, 130957, 130961, 130965, 130969, - 130973, 130977, 130981, 130985, 130989, 130993, 130997, 131001, 131005, - 131009, 131013, 131017, 131021, 131025, 131029, 131033, 131037, 131041, - 131045, 131049, 131053, 131057, 131061, 131065, 131069, 131073, 131077, - 131081, 131085, 131089, 131093, 131097, 131101, 131105, 131109, 131113, - 131117, 131121, 131125, 131129, 131133, 131137, 131141, 131145, 131149, - 131153, 131157, 131161, 131165, 131169, 131173, 131177, 131181, 131185, - 131189, 131193, 131197, 131201, 131205, 131209, 131213, 131217, 131221, - 131225, 131229, 131233, 131237, 131241, 131245, 131249, 131253, 131257, - 131261, 131265, 131269, 131273, 131277, 131281, 131285, 131289, 131293, - 131297, 131301, 131305, 131309, 131313, 131317, 131321, 131325, 131329, - 131333, 131337, 131341, 131345, 131349, 131353, 131357, 131361, 131365, - 131369, 131373, 131377, 131381, 131385, 131389, 131393, 131397, 131401, - 131405, 131409, 131413, 131417, 131421, 131425, 131429, 131433, 131437, - 131441, 131445, 131449, 131453, 131457, 131461, 131465, 131469, 131473, - 131477, 131481, 131485, 131489, 131493, 131497, 131501, 131505, 131509, - 131513, 131517, 131521, 131525, 131529, 131533, 131537, 131541, 131545, - 131549, 131553, 131557, 131561, 131565, 131569, 131573, 131577, 131581, - 131585, 131589, 131593, 131597, 131601, 131605, 131609, 131613, 131617, - 131621, 131625, 131629, 131633, 131637, 131641, 131645, 131649, 131653, - 131657, 131661, 131665, 131669, 131673, 131677, 131681, 131685, 131689, - 131693, 131697, 131701, 131705, 131709, 131713, 131717, 131721, 131725, - 131729, 131733, 131737, 131741, 131745, 131749, 131753, 131757, 131761, - 131765, 131769, 131773, 131777, 131781, 131785, 131789, 131793, 131797, - 131801, 131805, 131809, 131813, 131817, 131821, 131825, 131829, 131833, - 131837, 131841, 131845, 131849, 131853, 131857, 131861, 131865, 131869, - 131873, 131877, 131881, 131885, 131889, 131893, 131897, 131901, 131905, - 131909, 131913, 131917, 131921, 131925, 131929, 131933, 131937, 131941, - 131945, 131949, 131953, 131957, 131961, 131965, 131969, 131973, 131977, - 131981, 131985, 131989, 131993, 131997, 132001, 132005, 132009, 132013, - 132017, 132021, 132025, 132029, 132033, 132037, 132041, 132045, 132049, - 132053, 132057, 132061, 132065, 132069, 132073, 132077, 132081, 132085, - 132089, 132093, 132097, 132101, 132105, 132109, 132113, 132117, 132121, - 132125, 132129, 132133, 132137, 132141, 132145, 132149, 132153, 132157, - 132161, 132165, 132169, 132173, 132177, 132181, 132185, 132189, 132193, - 132197, 132201, 132205, 132209, 132213, 132217, 132221, 132225, 132229, - 132233, 132237, 132241, 132245, 132249, 132253, 132257, 132261, 132265, - 132269, 132273, 132277, 132281, 132285, 132289, 132293, 132297, 132301, - 132305, 132309, 132313, 132317, 132321, 132325, 132329, 132333, 132343, - 132347, 132351, 132355, 132359, 132363, 132367, 132371, 132375, 132379, - 132383, 132387, 132392, 132396, 132400, 132404, 132408, 132412, 132416, + 0, 0, 0, 0, 0, 0, 0, 0, 106947, 106951, 106955, 106959, 106963, 106967, + 106971, 106975, 106979, 106983, 106988, 106993, 106998, 107003, 107008, + 107013, 107018, 107023, 107028, 107034, 107040, 107046, 107053, 107060, + 107067, 107074, 107081, 107088, 107095, 107102, 107109, 0, 107116, + 107121, 107126, 107131, 107136, 107141, 107146, 107151, 107156, 107161, + 107166, 107171, 107176, 107181, 107185, 107190, 107195, 107200, 107205, + 107210, 107215, 107220, 107224, 107229, 107234, 107239, 107244, 107249, + 107257, 107262, 107267, 107272, 107277, 107282, 107287, 107292, 107297, + 107302, 107307, 107312, 107317, 107322, 0, 107327, 107333, 107339, 0, 0, + 107344, 107352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107361, 107367, 107374, 107380, 107387, + 107393, 107399, 107406, 107412, 107418, 107424, 107430, 107436, 107442, + 107448, 107454, 107461, 107472, 107478, 107484, 107492, 107498, 107504, + 107511, 107522, 107528, 107534, 107540, 107547, 107558, 107563, 107568, + 107573, 107578, 107583, 107589, 107595, 107601, 107608, 107616, 0, 0, 0, + 0, 0, 0, 0, 0, 107622, 107627, 107632, 107637, 107642, 107647, 107652, + 107657, 107662, 107667, 107672, 107677, 107682, 107687, 107692, 107697, + 107702, 107707, 107712, 107717, 107722, 107727, 107733, 107738, 107745, + 107750, 107757, 107763, 107769, 107775, 107781, 107788, 107794, 107800, + 107804, 107809, 107814, 107820, 107828, 107839, 107848, 107858, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107868, 107873, 107879, 107884, 107889, + 107894, 107899, 107904, 107911, 107916, 107921, 107926, 107931, 107936, + 107941, 107946, 107951, 107956, 107961, 107966, 107971, 107976, 107980, + 107984, 107988, 107992, 107997, 108002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 108008, 108013, 108018, 108023, 108028, + 108033, 108038, 108043, 108048, 108053, 108058, 108063, 108068, 108073, + 108078, 108083, 108088, 108093, 108098, 108103, 108108, 108113, 108118, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 108123, 108127, 108131, 108135, 108139, + 108143, 108146, 108150, 108153, 108157, 108160, 108164, 108168, 108173, + 108177, 108182, 108185, 108189, 108192, 108196, 108199, 108203, 108207, + 108211, 108215, 108219, 108223, 108227, 108231, 108235, 108239, 108243, + 108247, 108251, 108255, 108258, 108262, 108266, 108270, 108273, 108276, + 108280, 108284, 108288, 108291, 108294, 108297, 108300, 108304, 108308, + 108312, 108315, 108318, 108322, 108328, 108334, 108340, 108345, 108352, + 108356, 108361, 108365, 108370, 108375, 108381, 108386, 108392, 108396, + 108401, 108405, 108410, 108413, 108416, 108420, 108425, 108431, 108436, + 108442, 0, 0, 0, 0, 108447, 108450, 108453, 108456, 108459, 108462, + 108465, 108468, 108471, 108474, 108478, 108482, 108486, 108490, 108494, + 108498, 108502, 108506, 108510, 108515, 108519, 108523, 108526, 108529, + 108532, 108535, 108538, 108541, 108544, 108547, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 108550, 108554, 108559, 108564, 108569, 108573, + 108578, 108582, 108587, 108591, 108596, 108600, 108605, 108609, 108614, + 108618, 108623, 108628, 108633, 108638, 108643, 108648, 108653, 108658, + 108663, 108668, 108673, 108678, 108683, 108688, 108693, 108698, 108702, + 108707, 108712, 108717, 108721, 108725, 108730, 108735, 108740, 108744, + 108748, 108752, 108756, 108761, 108766, 108771, 108775, 108779, 108785, + 108790, 108796, 108801, 108807, 108812, 108818, 108823, 108829, 108834, + 108839, 108844, 108849, 108853, 108858, 108864, 108868, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 108873, 0, 0, 108878, 108885, 108892, 108899, 108906, + 108913, 108920, 108927, 108934, 108941, 108948, 108955, 108962, 108969, + 108976, 108983, 108990, 108997, 109004, 109011, 109018, 109025, 109032, + 109039, 109046, 0, 0, 0, 0, 0, 0, 0, 109053, 109060, 109066, 109072, + 109078, 109084, 109090, 109096, 109102, 109108, 0, 0, 0, 0, 0, 0, 109114, + 109119, 109124, 109129, 109134, 109138, 109142, 109146, 109151, 109156, + 109161, 109166, 109171, 109176, 109181, 109186, 109191, 109196, 109201, + 109206, 109211, 109216, 109221, 109226, 109231, 109236, 109241, 109246, + 109251, 109256, 109261, 109266, 109271, 109276, 109281, 109286, 109291, + 109296, 109301, 109306, 109311, 109316, 109322, 109327, 109333, 109338, + 109344, 109349, 109355, 109361, 109365, 109370, 109374, 0, 109378, + 109383, 109387, 109391, 109395, 109399, 109403, 109407, 109411, 109415, + 109419, 109424, 109428, 109433, 109438, 109443, 109449, 109455, 0, 0, 0, + 0, 0, 0, 0, 0, 109460, 109464, 109468, 109472, 109476, 109480, 109484, + 109489, 109494, 109499, 109504, 109509, 109514, 109519, 109524, 109529, + 109534, 109539, 109544, 109549, 109553, 109558, 109563, 109568, 109572, + 109576, 109581, 109586, 109591, 109595, 109599, 109603, 109608, 109612, + 109616, 109621, 109626, 109631, 109636, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 109641, 109646, 109651, 109656, 109660, 109665, 109669, 109674, 109678, + 109683, 109688, 109694, 109699, 109705, 109709, 109714, 109718, 109723, + 109727, 109732, 109737, 109742, 109747, 109752, 109757, 109762, 109767, + 109772, 109777, 109782, 109787, 109792, 109797, 109801, 109806, 109811, + 109816, 109820, 109824, 109829, 109834, 109839, 109843, 109847, 109851, + 109855, 109860, 109865, 109870, 109875, 109879, 109883, 109889, 109894, + 109900, 109905, 109911, 109917, 109924, 109930, 109937, 109942, 109948, + 109953, 109959, 109964, 109969, 109974, 109979, 109983, 109987, 109992, + 109997, 110001, 110006, 110011, 110016, 110024, 110029, 110036, 110043, + 110048, 110052, 110056, 110060, 110064, 110068, 110072, 110076, 110080, + 110084, 110088, 110093, 110097, 110102, 110108, 0, 110114, 110119, + 110124, 110129, 110134, 110139, 110144, 110149, 110154, 110159, 110165, + 110171, 110177, 110183, 110189, 110195, 110201, 110207, 110213, 110220, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110226, 110230, 110235, 110239, 110243, + 110247, 110252, 110256, 110261, 110265, 110270, 110275, 110280, 110285, + 110290, 110295, 110300, 110305, 0, 110310, 110315, 110320, 110325, + 110330, 110335, 110340, 110344, 110349, 110354, 110359, 110364, 110368, + 110372, 110377, 110382, 110387, 110392, 110396, 110400, 110404, 110408, + 110413, 110417, 110421, 110426, 110432, 110437, 110443, 110448, 110453, + 110459, 110464, 110470, 110475, 110480, 110485, 110490, 110494, 110499, + 110505, 110510, 110516, 110521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 110526, 110530, 110534, 110538, 110542, 110546, 110551, 0, + 110556, 0, 110561, 110566, 110571, 110576, 0, 110581, 110586, 110591, + 110596, 110601, 110606, 110611, 110616, 110620, 110625, 110630, 110635, + 110639, 110643, 110648, 0, 110653, 110658, 110662, 110666, 110670, + 110674, 110679, 110683, 110687, 110692, 110697, 0, 0, 0, 0, 0, 0, 110702, + 110706, 110711, 110715, 110720, 110724, 110729, 110733, 110738, 110742, + 110747, 110751, 110756, 110761, 110766, 110771, 110776, 110781, 110786, + 110791, 110796, 110801, 110806, 110811, 110816, 110821, 110826, 110831, + 110836, 110841, 110845, 110850, 110855, 110860, 110864, 110868, 110873, + 110878, 110883, 110888, 110892, 110896, 110900, 110904, 110909, 110914, + 110918, 110922, 110927, 110933, 110938, 110944, 110949, 110955, 110960, + 110966, 110971, 110977, 110982, 0, 0, 0, 0, 0, 110987, 110992, 110996, + 111000, 111004, 111008, 111012, 111016, 111020, 111024, 0, 0, 0, 0, 0, 0, + 111028, 111035, 111040, 111045, 0, 111050, 111054, 111059, 111063, + 111068, 111072, 111077, 111082, 0, 0, 111087, 111092, 0, 0, 111097, + 111102, 111107, 111111, 111116, 111121, 111126, 111131, 111136, 111141, + 111146, 111151, 111156, 111161, 111166, 111171, 111176, 111181, 111185, + 111190, 111195, 111200, 0, 111204, 111208, 111213, 111218, 111223, + 111227, 111231, 0, 111235, 111239, 0, 111244, 111249, 111254, 111259, + 111263, 0, 111267, 111271, 111276, 111281, 111287, 111292, 111298, + 111303, 111309, 111315, 0, 0, 111322, 111328, 0, 0, 111334, 111340, + 111346, 0, 0, 111351, 0, 0, 0, 0, 0, 0, 111355, 0, 0, 0, 0, 0, 111362, + 111367, 111374, 111382, 111388, 111394, 111400, 0, 0, 111407, 111413, + 111418, 111423, 111428, 111433, 111438, 0, 0, 0, 111443, 111448, 111453, + 111458, 111464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 111469, 111473, 111478, 111482, 111487, 111491, 111496, 111501, 111507, + 111512, 111518, 111522, 111527, 111531, 111536, 111540, 111545, 111550, + 111555, 111560, 111565, 111570, 111575, 111580, 111585, 111590, 111595, + 111600, 111605, 111610, 111615, 111620, 111624, 111629, 111634, 111639, + 111643, 111648, 111652, 111657, 111662, 111667, 111671, 111676, 111680, + 111684, 111689, 111693, 111698, 111703, 111708, 111713, 111717, 111721, + 111727, 111732, 111738, 111743, 111749, 111755, 111762, 111768, 111775, + 111780, 111786, 111791, 111797, 111802, 111807, 111812, 111817, 111822, + 111827, 111833, 111837, 111841, 111845, 111850, 111854, 111860, 111865, + 111870, 111874, 111878, 111882, 111886, 111890, 111894, 111898, 111902, + 111906, 111911, 0, 111916, 111921, 111926, 111933, 111938, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 111943, 111947, 111951, 111956, 111960, 111965, 111969, 111974, + 111979, 111985, 111990, 111996, 112000, 112005, 112009, 112014, 112018, + 112023, 112028, 112033, 112038, 112043, 112048, 112053, 112058, 112063, + 112068, 112073, 112078, 112083, 112088, 112092, 112097, 112102, 112107, + 112111, 112115, 112120, 112125, 112130, 112134, 112138, 112142, 112146, + 112151, 112156, 112161, 112165, 112169, 112175, 112180, 112186, 112191, + 112197, 112203, 112210, 112216, 112223, 112228, 112235, 112241, 112246, + 112253, 112259, 112264, 112269, 112274, 112279, 112284, 112289, 112293, + 112298, 0, 0, 0, 0, 0, 0, 0, 0, 112302, 112307, 112311, 112315, 112319, + 112323, 112327, 112331, 112335, 112339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112343, 112347, 112352, 112356, 112361, + 112365, 112370, 112375, 112381, 112386, 112392, 112396, 112401, 112405, + 112410, 112414, 112419, 112424, 112429, 112434, 112439, 112444, 112449, + 112454, 112459, 112464, 112469, 112474, 112479, 112484, 112488, 112493, + 112498, 112503, 112507, 112511, 112516, 112521, 112526, 112530, 112534, + 112538, 112542, 112547, 112552, 112557, 112561, 112565, 112571, 112576, + 112582, 112587, 112593, 112599, 0, 0, 112606, 112611, 112617, 112622, + 112628, 112633, 112638, 112643, 112648, 112653, 112658, 112662, 112667, + 112673, 112678, 112684, 112690, 112696, 112704, 112717, 112730, 112743, + 112757, 112772, 112780, 112791, 112800, 112810, 112820, 112830, 112841, + 112853, 112866, 112874, 112882, 112891, 112897, 112904, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 112912, 112916, 112921, 112925, 112930, 112934, 112939, + 112944, 112950, 112955, 112961, 112965, 112970, 112974, 112979, 112983, + 112988, 112993, 112998, 113003, 113008, 113013, 113018, 113023, 113028, + 113033, 113038, 113043, 113048, 113053, 113057, 113062, 113067, 113072, + 113076, 113080, 113085, 113090, 113095, 113099, 113103, 113107, 113111, + 113116, 113121, 113126, 113130, 113134, 113139, 113145, 113150, 113156, + 113161, 113167, 113173, 113180, 113186, 113193, 113198, 113204, 113209, + 113215, 113220, 113225, 113230, 113235, 113239, 113244, 113249, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 113254, 113259, 113263, 113267, 113271, 113275, + 113279, 113283, 113287, 113291, 0, 0, 0, 0, 0, 0, 113295, 113301, 113306, + 113313, 113321, 113328, 113336, 113345, 113350, 113359, 113364, 113372, + 113381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113391, + 113395, 113400, 113404, 113409, 113413, 113418, 113422, 113427, 113431, + 113436, 113440, 113445, 113450, 113455, 113460, 113465, 113470, 113475, + 113480, 113485, 113490, 113495, 113500, 113505, 113510, 113514, 113519, + 113524, 113529, 113533, 113537, 113542, 113547, 113552, 113556, 113560, + 113564, 113568, 113573, 113578, 113582, 113586, 113591, 113596, 113601, + 113607, 113612, 113618, 113623, 113629, 113634, 113640, 113645, 113651, + 113656, 113661, 0, 0, 0, 0, 0, 0, 0, 113668, 113673, 113677, 113681, + 113685, 113689, 113693, 113697, 113701, 113705, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113709, + 113713, 113718, 113723, 113727, 113731, 113737, 113741, 113746, 113751, + 113755, 113760, 113765, 113770, 113774, 113778, 113782, 113787, 113791, + 113795, 113800, 113805, 113810, 113817, 113822, 113827, 113832, 0, 0, + 113839, 113846, 113853, 113862, 113867, 113873, 113878, 113884, 113889, + 113895, 113900, 113906, 113911, 113917, 113923, 0, 0, 0, 0, 113928, + 113933, 113937, 113941, 113945, 113949, 113953, 113957, 113961, 113965, + 113969, 113974, 113979, 113985, 113990, 113995, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114000, 114004, 114009, + 114013, 114018, 114022, 114027, 114031, 114036, 114040, 114045, 114049, + 114054, 114059, 114064, 114069, 114074, 114079, 114084, 114089, 114094, + 114099, 114104, 114109, 114114, 114119, 114123, 114128, 114133, 114138, + 114142, 114146, 114151, 114156, 114161, 114165, 114169, 114173, 114177, + 114182, 114187, 114192, 114196, 114200, 114205, 114211, 114216, 114222, + 114227, 114233, 114239, 114246, 114251, 114257, 114262, 114268, 114273, + 114278, 114283, 114288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114293, 114301, 114308, 114316, + 114324, 114331, 114339, 114347, 114355, 114362, 114369, 114377, 114385, + 114393, 114401, 114409, 114417, 114425, 114433, 114441, 114449, 114457, + 114465, 114473, 114481, 114489, 114497, 114505, 114513, 114521, 114529, + 114537, 114545, 114553, 114560, 114568, 114576, 114583, 114591, 114599, + 114607, 114614, 114621, 114629, 114637, 114645, 114653, 114661, 114669, + 114677, 114685, 114693, 114701, 114709, 114717, 114725, 114733, 114741, + 114749, 114757, 114765, 114773, 114781, 114789, 114797, 114804, 114810, + 114816, 114822, 114828, 114834, 114840, 114846, 114852, 114858, 114865, + 114872, 114879, 114886, 114893, 114900, 114907, 114914, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 114921, 114927, 114933, 114940, 114946, 114953, 114959, + 114966, 0, 0, 114972, 0, 0, 114978, 114984, 114991, 114998, 115005, + 115012, 115019, 115026, 0, 115033, 115040, 0, 115047, 115054, 115061, + 115068, 115074, 115081, 115088, 115095, 115101, 115107, 115114, 115121, + 115128, 115134, 115140, 115147, 115153, 115159, 115166, 115173, 115180, + 115186, 115192, 115199, 115206, 115214, 115221, 115229, 115236, 115244, + 0, 115251, 115259, 0, 0, 115266, 115273, 115280, 115287, 115293, 115302, + 115309, 115315, 115322, 115329, 115336, 115344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 115354, 115361, 115367, 115373, 115379, 115385, 115391, 115397, + 115403, 115409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 115415, 115419, 115424, 115428, 115433, 115437, 115442, 115447, + 0, 0, 115453, 115457, 115462, 115466, 115471, 115475, 115480, 115485, + 115490, 115495, 115500, 115505, 115510, 115515, 115520, 115525, 115530, + 115535, 115540, 115545, 115549, 115554, 115559, 115564, 115568, 115572, + 115577, 115582, 115587, 115591, 115595, 115599, 115603, 115608, 115613, + 115618, 115622, 115626, 115631, 115636, 115642, 115647, 115653, 115658, + 115664, 115670, 0, 0, 115677, 115682, 115688, 115693, 115699, 115704, + 115709, 115714, 115719, 115724, 115728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115735, 115740, 115746, + 115753, 115759, 115765, 115772, 115778, 115785, 115792, 115800, 115807, + 115812, 115818, 115824, 115830, 115836, 115842, 115848, 115854, 115860, + 115866, 115872, 115878, 115884, 115890, 115895, 115901, 115907, 115913, + 115918, 115923, 115929, 115935, 115941, 115946, 115952, 115958, 115964, + 115970, 115976, 115982, 115988, 115993, 115998, 116003, 116009, 116015, + 116021, 116026, 116031, 116037, 116043, 116049, 116055, 116064, 116073, + 116079, 116085, 116092, 116099, 116106, 116113, 116121, 116128, 116136, + 116142, 116148, 116155, 116162, 116171, 116181, 0, 0, 0, 0, 0, 0, 0, 0, + 116186, 116190, 116195, 116201, 116206, 116211, 116216, 116222, 116228, + 116234, 116240, 116246, 116252, 116256, 116261, 116266, 116271, 116276, + 116281, 116286, 116291, 116296, 116301, 116306, 116311, 116316, 116321, + 116326, 116330, 116335, 116340, 116345, 116349, 116353, 116358, 116363, + 116368, 116372, 116377, 116382, 116387, 116392, 116397, 116402, 116406, + 116410, 116414, 116419, 116424, 116429, 116433, 116437, 116442, 116447, + 116452, 116458, 116464, 116471, 116477, 116484, 116491, 116498, 116505, + 116512, 116519, 116526, 116532, 116538, 116545, 116552, 116559, 116564, + 116569, 116574, 116578, 116583, 116588, 116594, 116599, 116615, 116629, + 116640, 116646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116652, 116660, 116668, 116676, 116684, + 116693, 116702, 116711, 116720, 116728, 116737, 116746, 116754, 116763, + 116772, 116780, 116789, 116797, 116806, 116814, 116823, 116832, 116840, + 116848, 116856, 116864, 116872, 116881, 116890, 116900, 116910, 116920, + 116930, 116940, 116949, 116959, 116969, 116979, 116990, 117000, 117012, + 117024, 117035, 117049, 117060, 117070, 117082, 117093, 117103, 117115, + 117127, 117138, 117149, 117159, 117169, 117181, 117192, 0, 0, 0, 0, 0, 0, + 0, 117204, 117208, 117213, 117217, 117222, 117226, 117231, 117236, + 117242, 0, 117247, 117251, 117256, 117260, 117265, 117269, 117274, + 117279, 117284, 117289, 117294, 117299, 117304, 117309, 117314, 117319, + 117324, 117329, 117334, 117339, 117343, 117348, 117353, 117358, 117362, + 117366, 117371, 117376, 117381, 117385, 117389, 117393, 117397, 117402, + 117407, 117412, 117416, 117420, 117426, 117431, 117437, 117442, 117448, + 117454, 117461, 0, 117467, 117472, 117478, 117483, 117489, 117494, + 117499, 117504, 117509, 117514, 117518, 117523, 117529, 117535, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117541, 117546, 117550, 117554, 117558, 117562, + 117566, 117570, 117574, 117578, 117582, 117586, 117590, 117594, 117598, + 117602, 117606, 117610, 117614, 117618, 117623, 117628, 117633, 117638, + 117643, 117648, 117653, 117658, 117663, 0, 0, 0, 117670, 117675, 117680, + 117684, 117689, 117694, 117699, 117704, 117709, 117714, 117719, 117723, + 117728, 117733, 117737, 117741, 117746, 117751, 117755, 117760, 117765, + 117770, 117775, 117780, 117785, 117790, 117794, 117798, 117802, 117807, + 117811, 117815, 0, 0, 117819, 117825, 117832, 117839, 117846, 117853, + 117860, 117867, 117874, 117880, 117887, 117894, 117900, 117906, 117913, + 117920, 117926, 117933, 117940, 117947, 117954, 117961, 0, 117968, + 117974, 117980, 117986, 117993, 117999, 118005, 118011, 118017, 118022, + 118027, 118032, 118037, 118042, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118047, 118052, 118058, 118063, 118069, + 118074, 118080, 0, 118085, 118091, 0, 118096, 118102, 118107, 118113, + 118119, 118125, 118131, 118137, 118143, 118149, 118155, 118161, 118167, + 118173, 118179, 118185, 118191, 118196, 118202, 118208, 118214, 118219, + 118224, 118230, 118236, 118242, 118247, 118252, 118257, 118262, 118268, + 118274, 118280, 118285, 118290, 118296, 118302, 118308, 118314, 118321, + 118327, 118334, 118340, 118347, 0, 0, 0, 118354, 0, 118360, 118367, 0, + 118373, 118380, 118386, 118392, 118398, 118404, 118410, 118415, 118420, + 0, 0, 0, 0, 0, 0, 0, 0, 118425, 118431, 118436, 118441, 118446, 118451, + 118456, 118461, 118466, 118471, 0, 0, 0, 0, 0, 0, 118476, 118481, 118487, + 118492, 118498, 118503, 0, 118509, 118515, 0, 118521, 118527, 118533, + 118538, 118544, 118550, 118556, 118561, 118566, 118572, 118577, 118583, + 118588, 118594, 118600, 118606, 118612, 118617, 118623, 118629, 118635, + 118641, 118647, 118653, 118659, 118665, 118671, 118677, 118682, 118688, + 118693, 118698, 118703, 118710, 118716, 118723, 118729, 0, 118736, + 118743, 0, 118750, 118757, 118764, 118770, 118776, 118781, 0, 0, 0, 0, 0, + 0, 0, 118786, 118792, 118797, 118802, 118807, 118812, 118817, 118822, + 118827, 118832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 118837, 118841, 118846, 118851, 118855, 118860, 118864, 118868, + 118873, 118877, 118882, 118887, 118892, 118896, 118900, 118904, 118909, + 118913, 118917, 118921, 118926, 118931, 118936, 118941, 118945, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 118957, 118963, 118969, 118975, 118981, 118987, 118993, + 118999, 119005, 119011, 119017, 119023, 119029, 119035, 119041, 119047, + 119053, 119059, 119065, 119071, 119077, 119086, 119090, 119094, 119098, + 119102, 119106, 119110, 119114, 119118, 119122, 119126, 119130, 119134, + 119138, 119142, 119146, 119152, 119158, 119162, 119168, 119174, 119179, + 119183, 119188, 119192, 119196, 119202, 119208, 119212, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 119216, 119224, 119227, 119232, 119238, 119246, + 119251, 119257, 119265, 119271, 119277, 119281, 119285, 119292, 119301, + 119308, 119317, 119323, 119332, 119339, 119346, 119353, 119363, 119369, + 119373, 119380, 119389, 119399, 119406, 119413, 119417, 119421, 119428, + 119438, 119442, 119449, 119456, 119463, 119469, 119476, 119483, 119490, + 119497, 119501, 119505, 119509, 119516, 119520, 119527, 119534, 119548, + 119557, 119561, 119565, 119569, 119576, 119580, 119584, 119588, 119596, + 119604, 119623, 119633, 119653, 119657, 119661, 119665, 119669, 119673, + 119677, 119681, 119688, 119692, 119695, 119699, 119703, 119709, 119716, + 119725, 119729, 119738, 119747, 119755, 119759, 119766, 119770, 119774, + 119778, 119782, 119793, 119802, 119811, 119820, 119829, 119841, 119850, + 119859, 119868, 119876, 119885, 119897, 119906, 119914, 119923, 119935, + 119944, 119953, 119965, 119974, 119983, 119995, 120004, 120008, 120012, + 120016, 120020, 120024, 120028, 120032, 120039, 120043, 120047, 120058, + 120062, 120066, 120073, 120079, 120085, 120089, 120096, 120100, 120104, + 120108, 120112, 120116, 120120, 120126, 120134, 120138, 120142, 120145, + 120152, 120164, 120168, 120180, 120187, 120194, 120201, 120208, 120214, + 120218, 120222, 120226, 120230, 120237, 120246, 120253, 120261, 120269, + 120275, 120279, 120283, 120287, 120291, 120297, 120306, 120318, 120325, + 120332, 120341, 120352, 120358, 120367, 120376, 120383, 120392, 120399, + 120405, 120415, 120422, 120429, 120436, 120443, 120447, 120453, 120457, + 120468, 120476, 120485, 120497, 120504, 120511, 120521, 120528, 120537, + 120544, 120553, 120560, 120567, 120577, 120584, 120591, 120600, 120607, + 120619, 120628, 120635, 120642, 120649, 120658, 120668, 120681, 120688, + 120697, 120707, 120714, 120723, 120736, 120743, 120750, 120757, 120767, + 120777, 120783, 120793, 120800, 120807, 120817, 120823, 120830, 120837, + 120844, 120854, 120861, 120868, 120875, 120881, 120888, 120898, 120905, + 120909, 120917, 120921, 120933, 120937, 120951, 120955, 120959, 120963, + 120967, 120973, 120980, 120988, 120992, 120996, 121000, 121004, 121011, + 121015, 121021, 121027, 121035, 121039, 121046, 121054, 121058, 121062, + 121068, 121072, 121081, 121090, 121097, 121107, 121113, 121117, 121121, + 121129, 121136, 121143, 121149, 121153, 121161, 121165, 121172, 121184, + 121191, 121201, 121207, 121211, 121220, 121227, 121236, 121240, 121244, + 121251, 121255, 121259, 121263, 121267, 121270, 121276, 121282, 121286, + 121290, 121297, 121304, 121311, 121318, 121325, 121332, 121339, 121346, + 121352, 121356, 121360, 121367, 121374, 121381, 121388, 121395, 121399, + 121402, 121407, 121411, 121415, 121424, 121433, 121437, 121441, 121447, + 121453, 121470, 121476, 121480, 121489, 121493, 121497, 121504, 121512, + 121520, 121526, 121530, 121534, 121538, 121542, 121545, 121551, 121558, + 121568, 121575, 121582, 121589, 121595, 121602, 121609, 121616, 121623, + 121630, 121639, 121646, 121658, 121665, 121672, 121682, 121693, 121700, + 121707, 121714, 121721, 121728, 121735, 121742, 121749, 121756, 121763, + 121773, 121783, 121793, 121800, 121810, 121817, 121824, 121831, 121838, + 121844, 121851, 121858, 121865, 121872, 121879, 121886, 121893, 121900, + 121906, 121913, 121920, 121929, 121936, 121943, 121947, 121955, 121959, + 121963, 121967, 121971, 121975, 121982, 121986, 121995, 121999, 122006, + 122014, 122018, 122022, 122026, 122039, 122055, 122059, 122063, 122070, + 122076, 122083, 122087, 122091, 122095, 122099, 122103, 122110, 122114, + 122132, 122136, 122140, 122147, 122151, 122155, 122161, 122165, 122169, + 122177, 122181, 122185, 122188, 122192, 122198, 122209, 122218, 122227, + 122234, 122241, 122252, 122259, 122266, 122273, 122280, 122287, 122294, + 122301, 122311, 122317, 122324, 122334, 122343, 122350, 122359, 122369, + 122376, 122383, 122390, 122397, 122409, 122416, 122423, 122430, 122437, + 122444, 122454, 122461, 122468, 122478, 122491, 122503, 122510, 122520, + 122527, 122534, 122541, 122555, 122561, 122569, 122579, 122589, 122596, + 122603, 122609, 122613, 122620, 122630, 122636, 122649, 122653, 122657, + 122664, 122668, 122675, 122685, 122689, 122693, 122697, 122701, 122705, + 122712, 122716, 122723, 122730, 122737, 122746, 122755, 122765, 122772, + 122779, 122786, 122796, 122803, 122813, 122820, 122830, 122837, 122844, + 122854, 122864, 122871, 122877, 122885, 122893, 122899, 122905, 122909, + 122913, 122920, 122928, 122934, 122938, 122942, 122946, 122953, 122965, + 122968, 122975, 122981, 122985, 122989, 122993, 122997, 123001, 123005, + 123009, 123013, 123017, 123021, 123028, 123032, 123038, 123042, 123046, + 123050, 123056, 123063, 123070, 123077, 123088, 123096, 123100, 123106, + 123115, 123122, 123128, 123131, 123135, 123139, 123145, 123154, 123162, + 123166, 123172, 123176, 123180, 123184, 123190, 123197, 123203, 123207, + 123213, 123217, 123221, 123230, 123242, 123246, 123253, 123260, 123270, + 123277, 123289, 123296, 123303, 123310, 123321, 123331, 123344, 123354, + 123361, 123365, 123369, 123373, 123377, 123386, 123395, 123404, 123421, + 123430, 123436, 123443, 123451, 123464, 123468, 123477, 123486, 123495, + 123504, 123515, 123524, 123532, 123541, 123550, 123559, 123568, 123578, + 123581, 123585, 123589, 123593, 123597, 123601, 123607, 123614, 123621, + 123628, 123634, 123640, 123647, 123653, 123660, 123668, 123672, 123679, + 123686, 123693, 123701, 123704, 123708, 123712, 123716, 123719, 123725, + 123729, 123735, 123742, 123749, 123755, 123762, 123769, 123776, 123783, + 123790, 123797, 123804, 123811, 123818, 123825, 123832, 123839, 123846, + 123853, 123859, 123863, 123872, 123876, 123880, 123884, 123888, 123894, + 123901, 123908, 123915, 123922, 123929, 123935, 123943, 123947, 123951, + 123955, 123959, 123965, 123982, 123999, 124003, 124007, 124011, 124015, + 124019, 124023, 124029, 124036, 124040, 124046, 124053, 124060, 124067, + 124074, 124081, 124090, 124097, 124104, 124111, 124118, 124122, 124126, + 124132, 124144, 124148, 124152, 124161, 124165, 124169, 124173, 124179, + 124183, 124187, 124196, 124200, 124204, 124208, 124215, 124219, 124223, + 124227, 124231, 124235, 124239, 124243, 124246, 124252, 124259, 124266, + 124272, 124276, 124293, 124299, 124303, 124309, 124315, 124321, 124327, + 124333, 124339, 124343, 124347, 124351, 124357, 124361, 124367, 124371, + 124375, 124382, 124389, 124406, 124410, 124414, 124418, 124422, 124426, + 124438, 124441, 124446, 124451, 124466, 124476, 124488, 124492, 124496, + 124500, 124506, 124513, 124520, 124530, 124542, 124548, 124554, 124563, + 124567, 124571, 124578, 124588, 124595, 124601, 124605, 124609, 124616, + 124622, 124626, 124632, 124636, 124644, 124650, 124654, 124662, 124670, + 124677, 124683, 124690, 124697, 124707, 124717, 124721, 124725, 124729, + 124733, 124739, 124746, 124752, 124759, 124766, 124773, 124782, 124789, + 124796, 124802, 124809, 124816, 124823, 124830, 124837, 124844, 124850, + 124857, 124864, 124871, 124880, 124887, 124894, 124898, 124904, 124908, + 124914, 124921, 124928, 124935, 124939, 124943, 124947, 124951, 124955, + 124962, 124966, 124970, 124976, 124984, 124988, 124992, 124996, 125000, + 125007, 125011, 125015, 125023, 125027, 125031, 125035, 125039, 125045, + 125049, 125053, 125059, 125066, 125072, 125079, 125091, 125095, 125102, + 125109, 125116, 125123, 125135, 125142, 125146, 125150, 125154, 125161, + 125168, 125175, 125182, 125192, 125199, 125205, 125212, 125219, 125226, + 125233, 125242, 125252, 125259, 125263, 125270, 125274, 125278, 125282, + 125289, 125296, 125306, 125312, 125316, 125325, 125329, 125336, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 125340, 125346, 125352, 125359, 125366, 125373, 125380, 125387, + 125394, 125400, 125407, 125414, 125421, 125428, 125435, 125442, 125448, + 125454, 125460, 125466, 125472, 125478, 125484, 125490, 125496, 125503, + 125510, 125517, 125524, 125531, 125538, 125544, 125550, 125556, 125563, + 125570, 125576, 125582, 125591, 125598, 125605, 125612, 125619, 125626, + 125633, 125639, 125645, 125651, 125660, 125667, 125674, 125685, 125696, + 125702, 125708, 125714, 125723, 125730, 125737, 125747, 125757, 125768, + 125779, 125791, 125804, 125815, 125826, 125838, 125851, 125862, 125873, + 125884, 125895, 125906, 125918, 125926, 125934, 125943, 125952, 125961, + 125967, 125973, 125979, 125986, 125996, 126003, 126013, 126018, 126023, + 126029, 126035, 126043, 126051, 126060, 126071, 126082, 126090, 126098, + 126107, 126116, 126124, 126131, 126139, 126147, 126154, 126161, 126170, + 126179, 126188, 126197, 126206, 0, 126215, 126226, 126233, 126241, + 126249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126257, 126266, 126273, 126280, + 126289, 126296, 126303, 126310, 126320, 126327, 126334, 126341, 126349, + 126356, 126363, 126370, 126381, 126388, 126395, 126402, 126409, 126416, + 126425, 126432, 126438, 126445, 126454, 126461, 126468, 126475, 126485, + 126492, 126499, 126509, 126519, 126526, 126533, 126540, 126547, 126554, + 126561, 126570, 126577, 126584, 126590, 126598, 126607, 126616, 126627, + 126635, 126644, 126653, 126662, 126671, 126678, 126685, 126694, 126706, + 126716, 126723, 126730, 126740, 126750, 126759, 126769, 126776, 126786, + 126793, 126800, 126807, 126817, 126827, 126834, 126841, 126851, 126857, + 126868, 126877, 126887, 126895, 126908, 126915, 126921, 126929, 126936, + 126946, 126950, 126954, 126958, 126962, 126966, 126970, 126974, 126983, + 126987, 126994, 126998, 127002, 127006, 127010, 127014, 127018, 127022, + 127026, 127030, 127034, 127038, 127042, 127046, 127050, 127054, 127058, + 127062, 127066, 127070, 127077, 127084, 127094, 127107, 127117, 127121, + 127125, 127129, 127133, 127137, 127141, 127145, 127149, 127153, 127157, + 127161, 127168, 127175, 127186, 127193, 127199, 127206, 127213, 127220, + 127227, 127234, 127238, 127242, 127249, 127256, 127263, 127272, 127279, + 127292, 127302, 127309, 127316, 127320, 127324, 127333, 127340, 127347, + 127354, 127367, 127374, 127381, 127391, 127401, 127410, 127417, 127424, + 127431, 127438, 127445, 127452, 127462, 127468, 127476, 127483, 127491, + 127498, 127509, 127516, 127522, 127529, 127536, 127543, 127550, 127560, + 127570, 127577, 127584, 127593, 127601, 127607, 127614, 127621, 127628, + 127635, 127639, 127649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 127659, 127663, 127667, 127671, 127675, 127679, 127683, + 127687, 127691, 127695, 127699, 127703, 127707, 127711, 127715, 127719, + 127723, 127727, 127731, 127735, 127739, 127743, 127747, 127751, 127755, + 127759, 127763, 127767, 127771, 127775, 127779, 127783, 127787, 127791, + 127795, 127799, 127803, 127807, 127811, 127815, 127819, 127823, 127827, + 127831, 127835, 127839, 127843, 127847, 127851, 127855, 127859, 127863, + 127867, 127871, 127875, 127879, 127883, 127887, 127891, 127895, 127899, + 127903, 127907, 127911, 127915, 127919, 127923, 127927, 127931, 127935, + 127939, 127943, 127947, 127951, 127955, 127959, 127963, 127967, 127971, + 127975, 127979, 127983, 127987, 127991, 127995, 127999, 128003, 128007, + 128011, 128015, 128019, 128023, 128027, 128031, 128035, 128039, 128043, + 128047, 128051, 128055, 128059, 128063, 128067, 128071, 128075, 128079, + 128083, 128087, 128091, 128095, 128099, 128103, 128107, 128111, 128115, + 128119, 128123, 128127, 128131, 128135, 128139, 128143, 128147, 128151, + 128155, 128159, 128163, 128167, 128171, 128175, 128179, 128183, 128187, + 128191, 128195, 128199, 128203, 128207, 128211, 128215, 128219, 128223, + 128227, 128231, 128235, 128239, 128243, 128247, 128251, 128255, 128259, + 128263, 128267, 128271, 128275, 128279, 128283, 128287, 128291, 128295, + 128299, 128303, 128307, 128311, 128315, 128319, 128323, 128327, 128331, + 128335, 128339, 128343, 128347, 128351, 128355, 128359, 128363, 128367, + 128371, 128375, 128379, 128383, 128387, 128391, 128395, 128399, 128403, + 128407, 128411, 128415, 128419, 128423, 128427, 128431, 128435, 128439, + 128443, 128447, 128451, 128455, 128459, 128463, 128467, 128471, 128475, + 128479, 128483, 128487, 128491, 128495, 128499, 128503, 128507, 128511, + 128515, 128519, 128523, 128527, 128531, 128535, 128539, 128543, 128547, + 128551, 128555, 128559, 128563, 128567, 128571, 128575, 128579, 128583, + 128587, 128591, 128595, 128599, 128603, 128607, 128611, 128615, 128619, + 128623, 128627, 128631, 128635, 128639, 128643, 128647, 128651, 128655, + 128659, 128663, 128667, 128671, 128675, 128679, 128683, 128687, 128691, + 128695, 128699, 128703, 128707, 128711, 128715, 128719, 128723, 128727, + 128731, 128735, 128739, 128743, 128747, 128751, 128755, 128759, 128763, + 128767, 128771, 128775, 128779, 128783, 128787, 128791, 128795, 128799, + 128803, 128807, 128811, 128815, 128819, 128823, 128827, 128831, 128835, + 128839, 128843, 128847, 128851, 128855, 128859, 128863, 128867, 128871, + 128875, 128879, 128883, 128887, 128891, 128895, 128899, 128903, 128907, + 128911, 128915, 128919, 128923, 128927, 128931, 128935, 128939, 128943, + 128947, 128951, 128955, 128959, 128963, 128967, 128971, 128975, 128979, + 128983, 128987, 128991, 128995, 128999, 129003, 129007, 129011, 129015, + 129019, 129023, 129027, 129031, 129035, 129039, 129043, 129047, 129051, + 129055, 129059, 129063, 129067, 129071, 129075, 129079, 129083, 129087, + 129091, 129095, 129099, 129103, 129107, 129111, 129115, 129119, 129123, + 129127, 129131, 129135, 129139, 129143, 129147, 129151, 129155, 129159, + 129163, 129167, 129171, 129175, 129179, 129183, 129187, 129191, 129195, + 129199, 129203, 129207, 129211, 129215, 129219, 129223, 129227, 129231, + 129235, 129239, 129243, 129247, 129251, 129255, 129259, 129263, 129267, + 129271, 129275, 129279, 129283, 129287, 129291, 129295, 129299, 129303, + 129307, 129311, 129315, 129319, 129323, 129327, 129331, 129335, 129339, + 129343, 129347, 129351, 129355, 129359, 129363, 129367, 129371, 129375, + 129379, 129383, 129387, 129391, 129395, 129399, 129403, 129407, 129411, + 129415, 129419, 129423, 129427, 129431, 129435, 129439, 129443, 129447, + 129451, 129455, 129459, 129463, 129467, 129471, 129475, 129479, 129483, + 129487, 129491, 129495, 129499, 129503, 129507, 129511, 129515, 129519, + 129523, 129527, 129531, 129535, 129539, 129543, 129547, 129551, 129555, + 129559, 129563, 129567, 129571, 129575, 129579, 129583, 129587, 129591, + 129595, 129599, 129603, 129607, 129611, 129615, 129619, 129623, 129627, + 129631, 129635, 129639, 129643, 129647, 129651, 129655, 129659, 129663, + 129667, 129671, 129675, 129679, 129683, 129687, 129691, 129695, 129699, + 129703, 129707, 129711, 129715, 129719, 129723, 129727, 129731, 129735, + 129739, 129743, 129747, 129751, 129755, 129759, 129763, 129767, 129771, + 129775, 129779, 129783, 129787, 129791, 129795, 129799, 129803, 129807, + 129811, 129815, 129819, 129823, 129827, 129831, 129835, 129839, 129843, + 129847, 129851, 129855, 129859, 129863, 129867, 129871, 129875, 129879, + 129883, 129887, 129891, 129895, 129899, 129903, 129907, 129911, 129915, + 129919, 129923, 129927, 129931, 129935, 129939, 129943, 129947, 129951, + 129955, 129959, 129963, 129967, 129971, 129975, 129979, 129983, 129987, + 129991, 129995, 129999, 130003, 130007, 130011, 130015, 130019, 130023, + 130027, 130031, 130035, 130039, 130043, 130047, 130051, 130055, 130059, + 130063, 130067, 130071, 130075, 130079, 130083, 130087, 130091, 130095, + 130099, 130103, 130107, 130111, 130115, 130119, 130123, 130127, 130131, + 130135, 130139, 130143, 130147, 130151, 130155, 130159, 130163, 130167, + 130171, 130175, 130179, 130183, 130187, 130191, 130195, 130199, 130203, + 130207, 130211, 130215, 130219, 130223, 130227, 130231, 130235, 130239, + 130243, 130247, 130251, 130255, 130259, 130263, 130267, 130271, 130275, + 130279, 130283, 130287, 130291, 130295, 130299, 130303, 130307, 130311, + 130315, 130319, 130323, 130327, 130331, 130335, 130339, 130343, 130347, + 130351, 130355, 130359, 130363, 130367, 130371, 130375, 130379, 130383, + 130387, 130391, 130395, 130399, 130403, 130407, 130411, 130415, 130419, + 130423, 130427, 130431, 130435, 130439, 130443, 130447, 130451, 130455, + 130459, 130463, 130467, 130471, 130475, 130479, 130483, 130487, 130491, + 130495, 130499, 130503, 130507, 130511, 130515, 130519, 130523, 130527, + 130531, 130535, 130539, 130543, 130547, 130551, 130555, 130559, 130563, + 130567, 130571, 130575, 130579, 130583, 130587, 130591, 130595, 130599, + 130603, 130607, 130611, 130615, 130619, 130623, 130627, 130631, 130635, + 130639, 130643, 130647, 130651, 130655, 130659, 130663, 130667, 130671, + 130675, 130679, 130683, 130687, 130691, 130695, 130699, 130703, 130707, + 130711, 130715, 130719, 130723, 130727, 130731, 130735, 130739, 130743, + 130747, 130751, 130755, 130759, 130763, 130767, 130771, 130775, 130779, + 130783, 130787, 130791, 130795, 130799, 130803, 130807, 130811, 130815, + 130819, 130823, 130827, 130831, 130835, 130839, 130843, 130847, 130851, + 130855, 130859, 130863, 130867, 130871, 130875, 130879, 130883, 130887, + 130891, 130895, 130899, 130903, 130907, 130911, 130915, 130919, 130923, + 130927, 130931, 130935, 130939, 130943, 130947, 130951, 130955, 130959, + 130963, 130967, 130971, 130975, 130979, 130983, 130987, 130991, 130995, + 130999, 131003, 131007, 131011, 131015, 131019, 131023, 131027, 131031, + 131035, 131039, 131043, 131047, 131051, 131055, 131059, 131063, 131067, + 131071, 131075, 131079, 131083, 131087, 131091, 131095, 131099, 131103, + 131107, 131111, 131115, 131119, 131123, 131127, 131131, 131135, 131139, + 131143, 131147, 131151, 131155, 131159, 131163, 131167, 131171, 131175, + 131179, 131183, 131187, 131191, 131195, 131199, 131203, 131207, 131211, + 131215, 131219, 131223, 131227, 131231, 131235, 131239, 131243, 131247, + 131251, 131255, 131259, 131263, 131267, 131271, 131275, 131279, 131283, + 131287, 131291, 131295, 131299, 131303, 131307, 131311, 131315, 131319, + 131323, 131327, 131331, 131335, 131339, 131343, 131347, 131351, 131355, + 131359, 131363, 131367, 131371, 131375, 131379, 131383, 131387, 131391, + 131395, 131399, 131403, 131407, 131411, 131415, 131419, 131423, 131427, + 131431, 131435, 131439, 131443, 131447, 131451, 131455, 131459, 131463, + 131467, 131471, 131475, 131479, 131483, 131487, 131491, 131495, 131499, + 131503, 131507, 131511, 131515, 131519, 131523, 131527, 131531, 131535, + 131539, 131543, 131547, 131551, 131555, 131559, 131563, 131567, 131571, + 131575, 131579, 131583, 131587, 131591, 131595, 131599, 131603, 131607, + 131611, 131615, 131619, 131623, 131627, 131631, 131635, 131639, 131643, + 131647, 131651, 131655, 131659, 131663, 131667, 131671, 131675, 131679, + 131683, 131687, 131691, 131695, 131699, 131703, 131707, 131711, 131715, + 131719, 131723, 131727, 131731, 131735, 131739, 131743, 131747, 131751, + 131755, 131759, 131763, 131767, 131771, 131775, 131779, 131783, 131787, + 131791, 131795, 131799, 131803, 131807, 131811, 131815, 131819, 131823, + 131827, 131831, 131835, 131839, 131843, 131847, 131851, 131855, 131859, + 131863, 131867, 131871, 131875, 131879, 131883, 131887, 131891, 131895, + 131899, 131903, 131907, 131911, 131915, 131919, 131923, 131927, 131931, + 131935, 131939, 0, 131943, 131948, 131954, 131964, 131974, 131984, + 131994, 132000, 132006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132012, 132016, 132020, + 132024, 132028, 132032, 132036, 132040, 132044, 132048, 132052, 132056, + 132060, 132064, 132068, 132072, 132076, 132080, 132084, 132088, 132092, + 132096, 132100, 132104, 132108, 132112, 132116, 132120, 132124, 132128, + 132132, 132136, 132140, 132144, 132148, 132152, 132156, 132160, 132164, + 132168, 132172, 132176, 132180, 132184, 132188, 132192, 132196, 132200, + 132204, 132208, 132212, 132216, 132220, 132224, 132228, 132232, 132236, + 132240, 132244, 132248, 132252, 132256, 132260, 132264, 132268, 132272, + 132276, 132280, 132284, 132288, 132292, 132296, 132300, 132304, 132308, + 132312, 132316, 132320, 132324, 132328, 132332, 132336, 132340, 132344, + 132348, 132352, 132356, 132360, 132364, 132368, 132372, 132376, 132380, + 132384, 132388, 132392, 132396, 132400, 132404, 132408, 132412, 132416, 132420, 132424, 132428, 132432, 132436, 132440, 132444, 132448, 132452, - 132456, 132465, 132474, 132478, 132482, 132486, 132490, 132494, 132498, - 132502, 132506, 132510, 132514, 132518, 132522, 132526, 132530, 132534, - 132538, 132542, 132546, 132550, 132554, 132558, 132562, 132566, 132570, - 132574, 132578, 132582, 132586, 132590, 132594, 132598, 132602, 132606, - 132610, 132614, 132618, 132622, 132626, 132630, 132634, 132638, 132642, - 132646, 132650, 132654, 132658, 132662, 132666, 132670, 132674, 132678, - 132682, 132686, 132690, 132694, 132698, 132702, 132706, 132710, 132714, - 132718, 132722, 132726, 132730, 132734, 132738, 132742, 132746, 132750, - 132754, 132758, 132762, 132766, 132770, 132774, 132778, 132782, 132786, - 132790, 132794, 132798, 132802, 132806, 132810, 132814, 132818, 132822, - 132826, 132830, 132834, 132838, 132842, 132846, 132850, 132854, 132858, - 132862, 132866, 132870, 132874, 132878, 132882, 132886, 132890, 132894, - 132898, 132902, 132906, 132910, 132914, 132918, 132922, 132926, 132930, - 132934, 132938, 132942, 132946, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132456, 132460, 132464, 132468, 132472, 132476, 132480, 132484, 132488, + 132492, 132496, 132500, 132504, 132508, 132512, 132516, 132520, 132524, + 132528, 132532, 132536, 132540, 132544, 132548, 132552, 132556, 132560, + 132564, 132568, 132572, 132576, 132580, 132584, 132588, 132592, 132596, + 132600, 132604, 132608, 132612, 132616, 132620, 132624, 132628, 132632, + 132636, 132640, 132644, 132648, 132652, 132656, 132660, 132664, 132668, + 132672, 132676, 132680, 132684, 132688, 132692, 132696, 132700, 132704, + 132708, 132712, 132716, 132720, 132724, 132728, 132732, 132736, 132740, + 132744, 132748, 132752, 132756, 132760, 132764, 132768, 132772, 132776, + 132780, 132784, 132788, 132792, 132796, 132800, 132804, 132808, 132812, + 132816, 132820, 132824, 132828, 132832, 132836, 132840, 132844, 132848, + 132852, 132856, 132860, 132864, 132868, 132872, 132876, 132880, 132884, + 132888, 132892, 132896, 132900, 132904, 132908, 132912, 132916, 132920, + 132924, 132928, 132932, 132936, 132940, 132944, 132948, 132952, 132956, + 132960, 132964, 132968, 132972, 132976, 132980, 132984, 132988, 132992, + 132996, 133000, 133004, 133008, 133012, 133016, 133020, 133024, 133028, + 133032, 133036, 133040, 133044, 133048, 133052, 133056, 133060, 133064, + 133068, 133072, 133076, 133080, 133084, 133088, 133092, 133096, 133100, + 133104, 133108, 133112, 133116, 133120, 133124, 133128, 133132, 133136, + 133140, 133144, 133148, 133152, 133156, 133160, 133164, 133168, 133172, + 133176, 133180, 133184, 133188, 133192, 133196, 133200, 133204, 133208, + 133212, 133216, 133220, 133224, 133228, 133232, 133236, 133240, 133244, + 133248, 133252, 133256, 133260, 133264, 133268, 133272, 133276, 133280, + 133284, 133288, 133292, 133296, 133300, 133304, 133308, 133312, 133316, + 133320, 133324, 133328, 133332, 133336, 133340, 133344, 133348, 133352, + 133356, 133360, 133364, 133368, 133372, 133376, 133380, 133384, 133388, + 133392, 133396, 133400, 133404, 133408, 133412, 133416, 133420, 133424, + 133428, 133432, 133436, 133440, 133444, 133448, 133452, 133456, 133460, + 133464, 133468, 133472, 133476, 133480, 133484, 133488, 133492, 133496, + 133500, 133504, 133508, 133512, 133516, 133520, 133524, 133528, 133532, + 133536, 133540, 133544, 133548, 133552, 133556, 133560, 133564, 133568, + 133572, 133576, 133580, 133584, 133588, 133592, 133596, 133600, 133604, + 133608, 133612, 133616, 133620, 133624, 133628, 133632, 133636, 133640, + 133644, 133648, 133652, 133656, 133660, 133664, 133668, 133672, 133676, + 133680, 133684, 133688, 133692, 133696, 133700, 133704, 133708, 133712, + 133716, 133720, 133724, 133728, 133732, 133736, 133740, 133744, 133754, + 133758, 133762, 133766, 133770, 133774, 133778, 133782, 133786, 133790, + 133794, 133798, 133803, 133807, 133811, 133815, 133819, 133823, 133827, + 133831, 133835, 133839, 133843, 133847, 133851, 133855, 133859, 133863, + 133867, 133876, 133885, 133889, 133893, 133897, 133901, 133905, 133909, + 133913, 133917, 133921, 133925, 133929, 133933, 133937, 133941, 133945, + 133949, 133953, 133957, 133961, 133965, 133969, 133973, 133977, 133981, + 133985, 133989, 133993, 133997, 134001, 134005, 134009, 134013, 134017, + 134021, 134025, 134029, 134033, 134037, 134041, 134045, 134049, 134053, + 134057, 134061, 134065, 134069, 134073, 134077, 134081, 134085, 134089, + 134093, 134097, 134101, 134105, 134109, 134113, 134117, 134121, 134125, + 134129, 134133, 134137, 134141, 134145, 134149, 134153, 134157, 134161, + 134165, 134169, 134173, 134177, 134181, 134185, 134189, 134193, 134197, + 134201, 134205, 134209, 134213, 134217, 134221, 134225, 134229, 134233, + 134237, 134241, 134245, 134249, 134253, 134257, 134261, 134265, 134269, + 134273, 134277, 134281, 134285, 134289, 134293, 134297, 134301, 134305, + 134309, 134313, 134317, 134321, 134325, 134329, 134333, 134337, 134341, + 134345, 134349, 134353, 134357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 134361, 134369, 134377, 134387, 134397, 134405, 134411, 134419, + 134427, 134437, 134449, 134461, 134467, 134475, 134481, 134487, 134493, + 134499, 134505, 134511, 134517, 134523, 134529, 134535, 134541, 134549, + 134557, 134563, 134569, 134575, 134581, 134589, 134597, 134606, 134612, + 134620, 134626, 134632, 134638, 134644, 134650, 134658, 134666, 134672, + 134678, 134684, 134690, 134696, 134702, 134708, 134714, 134720, 134726, + 134732, 134738, 134744, 134750, 134756, 134762, 134768, 134774, 134780, + 134788, 134794, 134800, 134810, 134818, 134824, 134830, 134836, 134842, + 134848, 134854, 134860, 134866, 134872, 134878, 134884, 134890, 134896, + 134902, 134908, 134914, 134920, 134926, 134932, 134938, 134944, 134950, + 134958, 134964, 134972, 134980, 134988, 134994, 135000, 135006, 135012, + 135018, 135026, 135036, 135044, 135052, 135058, 135064, 135072, 135080, + 135086, 135094, 135102, 135110, 135116, 135122, 135128, 135134, 135140, + 135146, 135154, 135162, 135168, 135174, 135180, 135186, 135192, 135200, + 135206, 135212, 135218, 135224, 135230, 135236, 135244, 135250, 135256, + 135262, 135268, 135276, 135284, 135290, 135296, 135302, 135307, 135313, + 135319, 135327, 135333, 135339, 135345, 135351, 135357, 135363, 135369, + 135375, 135381, 135391, 135399, 135405, 135411, 135417, 135425, 135431, + 135437, 135443, 135451, 135457, 135463, 135469, 135475, 135481, 135487, + 135493, 135499, 135505, 135511, 135517, 135525, 135531, 135539, 135545, + 135551, 135559, 135565, 135571, 135577, 135583, 135589, 135595, 135601, + 135607, 135613, 135619, 135625, 135631, 135637, 135643, 135649, 135655, + 135661, 135667, 135673, 135681, 135687, 135693, 135699, 135705, 135711, + 135717, 135723, 135729, 135735, 135741, 135747, 135753, 135759, 135767, + 135773, 135779, 135787, 135793, 135799, 135805, 135811, 135817, 135823, + 135829, 135835, 135841, 135847, 135855, 135861, 135867, 135873, 135879, + 135885, 135893, 135901, 135907, 135913, 135919, 135925, 135931, 135937, + 135942, 135947, 135952, 135957, 135962, 135967, 135972, 135977, 135982, + 135987, 135992, 135997, 136002, 136007, 136012, 136017, 136022, 136027, + 136032, 136037, 136042, 136047, 136052, 136057, 136062, 136067, 136072, + 136077, 136082, 136087, 136094, 136099, 136104, 136109, 136114, 136119, + 136124, 136129, 136134, 136139, 136144, 136149, 136154, 136159, 136164, + 136169, 136174, 136179, 136184, 136189, 136194, 136199, 136204, 136209, + 136214, 136219, 136224, 136229, 136234, 136239, 136244, 136249, 136254, + 136259, 136264, 136269, 136274, 136279, 136284, 136289, 136294, 136299, + 136304, 136309, 136314, 136319, 136324, 136329, 136334, 136339, 136344, + 136349, 136354, 136359, 136364, 136369, 136374, 136379, 136384, 136391, + 136396, 136401, 136406, 136411, 136416, 136421, 136426, 136431, 136436, + 136441, 136446, 136451, 136456, 136461, 136466, 136471, 136476, 136481, + 136486, 136491, 136496, 136503, 136508, 136513, 136519, 136524, 136529, + 136534, 136539, 136544, 136549, 136554, 136559, 136564, 136569, 136574, + 136579, 136584, 136589, 136594, 136599, 136604, 136609, 136614, 136619, + 136624, 136629, 136634, 136639, 136644, 136649, 136654, 136659, 136664, + 136669, 136674, 136679, 136684, 136689, 136694, 136699, 136704, 136709, + 136714, 136719, 136724, 136729, 136734, 136741, 136746, 136751, 136758, + 136765, 136770, 136775, 136780, 136785, 136790, 136795, 136800, 136805, + 136810, 136815, 136820, 136825, 136830, 136835, 136840, 136845, 136850, + 136855, 136860, 136865, 136870, 136875, 136880, 136885, 136890, 136897, + 136902, 136907, 136912, 136917, 136922, 136927, 136932, 136937, 136942, + 136947, 136952, 136957, 136962, 136967, 136972, 136977, 136982, 136987, + 136994, 136999, 137004, 137009, 137014, 137019, 137024, 137029, 137035, + 137040, 137045, 137050, 137055, 137060, 137065, 137070, 137075, 137082, + 137089, 137094, 137099, 137103, 137108, 137112, 137116, 137121, 137128, + 137133, 137138, 137147, 137152, 137157, 137162, 137167, 137174, 137181, + 137186, 137191, 137196, 137201, 137208, 137213, 137218, 137223, 137228, + 137233, 137238, 137243, 137248, 137253, 137258, 137263, 137268, 137275, + 137279, 137284, 137289, 137294, 137299, 137303, 137308, 137313, 137318, + 137323, 137328, 137333, 137338, 137343, 137348, 137354, 137360, 137366, + 137372, 137378, 137383, 137389, 137395, 137401, 137407, 137413, 137419, + 137425, 137431, 137437, 137443, 137449, 137455, 137461, 137467, 137473, + 137479, 137485, 137491, 137496, 137502, 137508, 137514, 137520, 137526, + 137532, 137538, 137544, 137550, 137556, 137562, 137568, 137574, 137580, + 137586, 137592, 137598, 137604, 137610, 137616, 137621, 137627, 137633, + 137639, 137645, 137651, 0, 0, 0, 0, 0, 0, 0, 137657, 137661, 137666, + 137671, 137676, 137681, 137686, 137690, 137695, 137700, 137705, 137710, + 137715, 137720, 137725, 137730, 137735, 137739, 137744, 137748, 137753, + 137758, 137763, 137768, 137773, 137777, 137782, 137787, 137791, 137796, + 137801, 0, 137806, 137811, 137815, 137819, 137823, 137827, 137831, + 137835, 137839, 137843, 0, 0, 0, 0, 137847, 137851, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137856, 137863, + 137869, 137876, 137883, 137890, 137897, 137904, 137911, 137918, 137925, + 137932, 137939, 137946, 137953, 137960, 137967, 137974, 137980, 137987, + 137994, 138001, 138007, 138014, 138020, 138026, 138033, 138039, 138046, + 138052, 0, 0, 138058, 138066, 138074, 138083, 138092, 138101, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 138109, 138114, 138119, 138124, 138129, 138134, 138139, + 138144, 138149, 138154, 138159, 138164, 138169, 138174, 138179, 138184, + 138189, 138194, 138199, 138204, 138209, 138214, 138219, 138224, 138229, + 138234, 138239, 138244, 138249, 138254, 138259, 138264, 138269, 138274, + 138279, 138284, 138289, 138294, 138299, 138304, 138309, 138314, 138319, + 138324, 138329, 138334, 138339, 138344, 138349, 138356, 138363, 138370, + 138377, 138384, 138391, 138398, 138405, 138414, 138421, 138428, 138435, + 138442, 138449, 138456, 138463, 138470, 138477, 138484, 138491, 138496, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138505, 138510, 138514, 138518, 138522, + 138526, 138530, 138534, 138538, 138542, 0, 138546, 138551, 138556, + 138563, 138568, 138575, 138582, 0, 138587, 138594, 138599, 138604, + 138611, 138618, 138623, 138628, 138633, 138638, 138643, 138650, 138657, + 138662, 138667, 138672, 138685, 138694, 138701, 138710, 138719, 0, 0, 0, + 0, 0, 138728, 138735, 138742, 138749, 138756, 138763, 138770, 138777, + 138784, 138791, 138798, 138805, 138812, 138819, 138826, 138833, 138840, + 138847, 138854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138861, 138867, 138873, 138879, + 138885, 138891, 138897, 138903, 138909, 138915, 138921, 138927, 138932, + 138938, 138943, 138949, 138954, 138960, 138966, 138971, 138977, 138982, + 138988, 138994, 139000, 139006, 139012, 139018, 139024, 139029, 139034, + 139040, 139046, 139052, 139058, 139064, 139070, 139076, 139082, 139088, + 139094, 139100, 139106, 139112, 139117, 139123, 139128, 139134, 139139, + 139145, 139151, 139156, 139162, 139167, 139173, 139179, 139185, 139191, + 139197, 139203, 139209, 139214, 139219, 139225, 139231, 139236, 139240, + 139244, 139248, 139252, 139256, 139260, 139264, 139268, 139272, 139277, + 139282, 139287, 139292, 139297, 139302, 139307, 139312, 139317, 139322, + 139329, 139336, 139343, 139347, 139353, 139358, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139364, + 139367, 139371, 139375, 139379, 139382, 139386, 139391, 139395, 139399, + 139403, 139406, 139410, 139415, 139419, 139423, 139427, 139430, 139434, + 139439, 139444, 139448, 139452, 139455, 139459, 139463, 139467, 139471, + 139475, 139479, 139483, 139486, 139490, 139494, 139498, 139502, 139506, + 139510, 139516, 139519, 139523, 139527, 139531, 139535, 139539, 139543, + 139547, 139551, 139555, 139560, 139565, 139571, 139575, 139579, 139583, + 139587, 139591, 139595, 139600, 139603, 139607, 139611, 139615, 139619, + 139625, 139629, 139633, 139637, 139641, 139645, 139649, 139653, 139657, + 139661, 139665, 0, 0, 0, 0, 139669, 139674, 139678, 139682, 139688, + 139694, 139698, 139703, 139708, 139713, 139718, 139722, 139727, 139732, + 139737, 139741, 139746, 139751, 139756, 139760, 139765, 139770, 139775, + 139780, 139785, 139790, 139795, 139800, 139804, 139809, 139814, 139819, + 139824, 139829, 139834, 139839, 139844, 139849, 139854, 139859, 139866, + 139871, 139878, 139883, 139888, 139893, 139898, 139903, 139908, 139913, + 139918, 139923, 139928, 139933, 139938, 139943, 139948, 0, 0, 0, 0, 0, 0, + 0, 139953, 139957, 139963, 139966, 139969, 139973, 139977, 139981, + 139985, 139989, 139993, 139997, 140003, 140009, 140015, 140021, 140027, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140033, 140037, 140041, + 140047, 140053, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140058, 140067, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140076, 140079, 140082, 140085, 140088, + 140091, 140094, 140097, 140100, 140103, 140106, 140109, 140112, 140115, + 140118, 140121, 140124, 140127, 140130, 140133, 140136, 140139, 140142, + 140145, 140148, 140151, 140154, 140157, 140160, 140163, 140166, 140169, + 140172, 140175, 140178, 140181, 140184, 140187, 140190, 140193, 140196, + 140199, 140202, 140205, 140208, 140211, 140214, 140217, 140220, 140223, + 140226, 140229, 140232, 140235, 140238, 140241, 140244, 140247, 140250, + 140253, 140256, 140259, 140262, 140265, 140268, 140271, 140274, 140277, + 140280, 140283, 140286, 140289, 140292, 140295, 140298, 140301, 140304, + 140307, 140310, 140313, 140316, 140319, 140322, 140325, 140328, 140331, + 140334, 140337, 140340, 140343, 140346, 140349, 140352, 140355, 140358, + 140361, 140364, 140367, 140370, 140373, 140376, 140379, 140382, 140385, + 140388, 140391, 140394, 140397, 140400, 140403, 140406, 140409, 140412, + 140415, 140418, 140421, 140424, 140427, 140430, 140433, 140436, 140439, + 140442, 140445, 140448, 140451, 140454, 140457, 140460, 140463, 140466, + 140469, 140472, 140475, 140478, 140481, 140484, 140487, 140490, 140493, + 140496, 140499, 140502, 140505, 140508, 140511, 140514, 140517, 140520, + 140523, 140526, 140529, 140532, 140535, 140538, 140541, 140544, 140547, + 140550, 140553, 140556, 140559, 140562, 140565, 140568, 140571, 140574, + 140577, 140580, 140583, 140586, 140589, 140592, 140595, 140598, 140601, + 140604, 140607, 140610, 140613, 140616, 140619, 140622, 140625, 140628, + 140631, 140634, 140637, 140640, 140643, 140646, 140649, 140652, 140655, + 140658, 140661, 140664, 140667, 140670, 140673, 140676, 140679, 140682, + 140685, 140688, 140691, 140694, 140697, 140700, 140703, 140706, 140709, + 140712, 140715, 140718, 140721, 140724, 140727, 140730, 140733, 140736, + 140739, 140742, 140745, 140748, 140751, 140754, 140757, 140760, 140763, + 140766, 140769, 140772, 140775, 140778, 140781, 140784, 140787, 140790, + 140793, 140796, 140799, 140802, 140805, 140808, 140811, 140814, 140817, + 140820, 140823, 140826, 140829, 140832, 140835, 140838, 140841, 140844, + 140847, 140850, 140853, 140856, 140859, 140862, 140865, 140868, 140871, + 140874, 140877, 140880, 140883, 140886, 140889, 140892, 140895, 140898, + 140901, 140904, 140907, 140910, 140913, 140916, 140919, 140922, 140925, + 140928, 140931, 140934, 140937, 140940, 140943, 140946, 140949, 140952, + 140955, 140958, 140961, 140964, 140967, 140970, 140973, 140976, 140979, + 140982, 140985, 140988, 140991, 140994, 140997, 141000, 141003, 141006, + 141009, 141012, 141015, 141018, 141021, 141024, 141027, 141030, 141033, + 141036, 141039, 141042, 141045, 141048, 141051, 141054, 141057, 141060, + 141063, 141066, 141069, 141072, 141075, 141078, 141081, 141084, 141087, + 141090, 141093, 141096, 141099, 141102, 141105, 141108, 141111, 141114, + 141117, 141120, 141123, 141126, 141129, 141132, 141135, 141138, 141141, + 141144, 141147, 141150, 141153, 141156, 141159, 141162, 141165, 141168, + 141171, 141174, 141177, 141180, 141183, 141186, 141189, 141192, 141195, + 141198, 141201, 141204, 141207, 141210, 141213, 141216, 141219, 141222, + 141225, 141228, 141231, 141234, 141237, 141240, 141243, 141246, 141249, + 141252, 141255, 141258, 141261, 141264, 141267, 141270, 141273, 141276, + 141279, 141282, 141285, 141288, 141291, 141294, 141297, 141300, 141303, + 141306, 141309, 141312, 141315, 141318, 141321, 141324, 141327, 141330, + 141333, 141336, 141339, 141342, 141345, 141348, 141351, 141354, 141357, + 141360, 141363, 141366, 141369, 141372, 141375, 141378, 141381, 141384, + 141387, 141390, 141393, 141396, 141399, 141402, 141405, 141408, 141411, + 141414, 141417, 141420, 141423, 141426, 141429, 141432, 141435, 141438, + 141441, 141444, 141447, 141450, 141453, 141456, 141459, 141462, 141465, + 141468, 141471, 141474, 141477, 141480, 141483, 141486, 141489, 141492, + 141495, 141498, 141501, 141504, 141507, 141510, 141513, 141516, 141519, + 141522, 141525, 141528, 141531, 141534, 141537, 141540, 141543, 141546, + 141549, 141552, 141555, 141558, 141561, 141564, 141567, 141570, 141573, + 141576, 141579, 141582, 141585, 141588, 141591, 141594, 141597, 141600, + 141603, 141606, 141609, 141612, 141615, 141618, 141621, 141624, 141627, + 141630, 141633, 141636, 141639, 141642, 141645, 141648, 141651, 141654, + 141657, 141660, 141663, 141666, 141669, 141672, 141675, 141678, 141681, + 141684, 141687, 141690, 141693, 141696, 141699, 141702, 141705, 141708, + 141711, 141714, 141717, 141720, 141723, 141726, 141729, 141732, 141735, + 141738, 141741, 141744, 141747, 141750, 141753, 141756, 141759, 141762, + 141765, 141768, 141771, 141774, 141777, 141780, 141783, 141786, 141789, + 141792, 141795, 141798, 141801, 141804, 141807, 141810, 141813, 141816, + 141819, 141822, 141825, 141828, 141831, 141834, 141837, 141840, 141843, + 141846, 141849, 141852, 141855, 141858, 141861, 141864, 141867, 141870, + 141873, 141876, 141879, 141882, 141885, 141888, 141891, 141894, 141897, + 141900, 141903, 141906, 141909, 141912, 141915, 141918, 141921, 141924, + 141927, 141930, 141933, 141936, 141939, 141942, 141945, 141948, 141951, + 141954, 141957, 141960, 141963, 141966, 141969, 141972, 141975, 141978, + 141981, 141984, 141987, 141990, 141993, 141996, 141999, 142002, 142005, + 142008, 142011, 142014, 142017, 142020, 142023, 142026, 142029, 142032, + 142035, 142038, 142041, 142044, 142047, 142050, 142053, 142056, 142059, + 142062, 142065, 142068, 142071, 142074, 142077, 142080, 142083, 142086, + 142089, 142092, 142095, 142098, 142101, 142104, 142107, 142110, 142113, + 142116, 142119, 142122, 142125, 142128, 142131, 142134, 142137, 142140, + 142143, 142146, 142149, 142152, 142155, 142158, 142161, 142164, 142167, + 142170, 142173, 142176, 142179, 142182, 142185, 142188, 142191, 142194, + 142197, 142200, 142203, 142206, 142209, 142212, 142215, 142218, 142221, + 142224, 142227, 142230, 142233, 142236, 142239, 142242, 142245, 142248, + 142251, 142254, 142257, 142260, 142263, 142266, 142269, 142272, 142275, + 142278, 142281, 142284, 142287, 142290, 142293, 142296, 142299, 142302, + 142305, 142308, 142311, 142314, 142317, 142320, 142323, 142326, 142329, + 142332, 142335, 142338, 142341, 142344, 142347, 142350, 142353, 142356, + 142359, 142362, 142365, 142368, 142371, 142374, 142377, 142380, 142385, + 142390, 142395, 142400, 142405, 142410, 142415, 142420, 142425, 142430, + 142435, 142440, 142445, 142450, 142455, 142460, 142465, 142470, 142475, + 142480, 142485, 142490, 142495, 142500, 142505, 142510, 142515, 142520, + 142525, 142530, 142535, 142540, 142545, 142550, 142555, 142560, 142565, + 142570, 142575, 142580, 142585, 142590, 142595, 142600, 142605, 142610, + 142615, 142620, 142625, 142630, 142635, 142640, 142645, 142650, 142655, + 142660, 142665, 142670, 142675, 142680, 142685, 142690, 142695, 142700, + 142705, 142710, 142715, 142720, 142725, 142730, 142735, 142740, 142745, + 142750, 142755, 142760, 142765, 142770, 142775, 142780, 142785, 142790, + 142795, 142800, 142805, 142810, 142815, 142820, 142825, 142830, 142835, + 142840, 142845, 142850, 142855, 142860, 142865, 142870, 142875, 142880, + 142885, 142890, 142895, 142900, 142905, 142910, 142915, 142920, 142925, + 142930, 142935, 142940, 142945, 142950, 142955, 142960, 142965, 142970, + 142975, 142980, 142985, 142990, 142995, 143000, 143005, 143010, 143015, + 143020, 143025, 143030, 143035, 143040, 143045, 143050, 143055, 143060, + 143065, 143070, 143075, 143080, 143085, 143090, 143095, 143100, 143105, + 143110, 143115, 143120, 143125, 143130, 143135, 143140, 143145, 143150, + 143155, 143160, 143165, 143170, 143175, 143180, 143185, 143190, 143195, + 143200, 143205, 143210, 143215, 143220, 143225, 143230, 143235, 143240, + 143245, 143250, 143255, 143260, 143265, 143270, 143275, 143280, 143285, + 143290, 143295, 143300, 143305, 143310, 143315, 143320, 143325, 143330, + 143335, 143340, 143345, 143350, 143355, 143360, 143365, 143370, 143375, + 143380, 143385, 143390, 143395, 143400, 143405, 143410, 143415, 143420, + 143425, 143430, 143435, 143440, 143445, 143450, 143455, 143460, 143465, + 143470, 143475, 143480, 143485, 143490, 143495, 143500, 143505, 143510, + 143515, 143520, 143525, 143530, 143535, 143540, 143545, 143550, 143555, + 143560, 143565, 143570, 143575, 143580, 143585, 143590, 143595, 143600, + 143605, 143610, 143615, 143620, 143625, 143630, 143635, 143640, 143645, + 143650, 143655, 143660, 143665, 143670, 143675, 143680, 143685, 143690, + 143695, 143700, 143705, 143710, 143715, 143720, 143725, 143730, 143735, + 143740, 143745, 143750, 143755, 143760, 143765, 143770, 143775, 143780, + 143785, 143790, 143795, 143800, 143805, 143810, 143815, 143820, 143825, + 143830, 143835, 143840, 143845, 143850, 143855, 143860, 143865, 143870, + 143875, 143880, 143885, 143890, 143895, 143900, 143905, 143910, 143915, + 143920, 143925, 143930, 143935, 143940, 143945, 143950, 143955, 143960, + 143965, 143970, 143975, 143980, 143985, 143990, 143995, 144000, 144005, + 144010, 144015, 144020, 144025, 144030, 144035, 144040, 144045, 144050, + 144055, 144060, 144065, 144070, 144075, 144080, 144085, 144090, 144095, + 144100, 144105, 144110, 144115, 144120, 144125, 144130, 144135, 144140, + 144145, 144150, 144155, 144160, 144165, 144170, 144175, 144180, 144185, + 144190, 144195, 144200, 144205, 144210, 144215, 144220, 144225, 144230, + 144235, 144240, 144245, 144250, 144255, 144260, 144265, 144270, 144275, + 144280, 144285, 144290, 144295, 144300, 144305, 144310, 144315, 144320, + 144325, 144330, 144335, 144340, 144345, 144350, 144355, 144360, 144365, + 144370, 144375, 144380, 144385, 144390, 144395, 144400, 144405, 144410, + 144415, 144420, 144425, 144430, 144435, 144440, 144445, 144450, 144455, + 144460, 144465, 144470, 144475, 144480, 144485, 144490, 144495, 144500, + 144505, 144510, 144515, 144520, 144525, 144530, 144535, 144540, 144545, + 144550, 144555, 144560, 144565, 144570, 144575, 144580, 144585, 144590, + 144595, 144600, 144605, 144610, 144615, 144620, 144625, 144630, 144635, + 144640, 144645, 144650, 144655, 144660, 144665, 144670, 144675, 144680, + 144685, 144690, 144695, 144700, 144705, 144710, 144715, 144720, 144725, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144730, 144735, + 144742, 144746, 144750, 144754, 144758, 144762, 144766, 144770, 144774, + 144778, 144782, 144786, 144790, 144794, 144798, 144802, 144806, 144810, + 144814, 144818, 144822, 144826, 144830, 144834, 144838, 144842, 144846, + 144850, 144854, 144858, 144862, 144866, 144870, 144874, 144878, 144882, + 144886, 144890, 144894, 144898, 144902, 144906, 144910, 144914, 144918, + 144922, 144926, 144930, 144934, 144938, 144942, 144946, 144950, 144954, + 144958, 144962, 144966, 144970, 144974, 144978, 144982, 144986, 144990, + 144994, 144998, 145002, 145006, 145010, 145014, 145018, 145022, 145026, + 145030, 145034, 145038, 145042, 145046, 145050, 145054, 145058, 145062, + 145066, 145070, 145074, 145078, 145082, 145086, 145090, 145094, 145098, + 145102, 145106, 145110, 145114, 145118, 145122, 145126, 145130, 145134, + 145138, 145142, 145146, 145150, 145154, 145158, 145162, 145166, 145170, + 145174, 145178, 145182, 145186, 145190, 145194, 145198, 145202, 145206, + 145210, 145214, 145218, 145222, 145226, 145230, 145234, 145238, 145242, + 145246, 145250, 145254, 145258, 145262, 145266, 145270, 145274, 145278, + 145282, 145286, 145290, 145294, 145298, 145302, 145306, 145310, 145314, + 145318, 145322, 145326, 145330, 145334, 145338, 145342, 145346, 145350, + 145354, 145358, 145362, 145366, 145370, 145374, 145378, 145382, 145386, + 145390, 145394, 145398, 145402, 145406, 145410, 145414, 145418, 145422, + 145426, 145430, 145434, 145438, 145442, 145446, 145450, 145454, 145458, + 145462, 145466, 145470, 145474, 145478, 145482, 145486, 145490, 145494, + 145498, 145502, 145506, 145510, 145514, 145518, 145522, 145526, 145530, + 145534, 145538, 145542, 145546, 145550, 145554, 145558, 145562, 145566, + 145570, 145574, 145578, 145582, 145586, 145590, 145594, 145598, 145602, + 145606, 145610, 145614, 145618, 145622, 145626, 145630, 145634, 145638, + 145642, 145646, 145650, 145654, 145658, 145662, 145666, 145670, 145674, + 145678, 145682, 145686, 145690, 145694, 145698, 145702, 145706, 145710, + 145714, 145718, 145722, 145726, 145730, 145734, 145738, 145742, 145746, + 145750, 145754, 145758, 145762, 145766, 145770, 145774, 145778, 145782, + 145786, 145790, 145794, 145798, 145802, 145806, 145810, 145814, 145818, + 145822, 145826, 145830, 145834, 145838, 145842, 145846, 145850, 145854, + 145858, 145862, 145866, 145870, 145874, 145878, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145882, 145888, + 145894, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145900, + 145905, 145910, 145915, 0, 0, 0, 0, 0, 0, 0, 0, 145920, 145923, 145926, + 145929, 145932, 145935, 145938, 145941, 145944, 145947, 145950, 145953, + 145956, 145959, 145962, 145965, 145968, 145971, 145974, 145977, 145980, + 145983, 145986, 145989, 145992, 145995, 145998, 146001, 146004, 146007, + 146010, 146013, 146016, 146019, 146022, 146025, 146028, 146031, 146034, + 146037, 146040, 146043, 146046, 146049, 146052, 146055, 146058, 146061, + 146064, 146067, 146070, 146073, 146076, 146079, 146082, 146085, 146088, + 146091, 146094, 146097, 146100, 146103, 146106, 146109, 146112, 146115, + 146118, 146121, 146124, 146127, 146130, 146133, 146136, 146139, 146142, + 146145, 146148, 146151, 146154, 146157, 146160, 146163, 146166, 146169, + 146172, 146175, 146178, 146181, 146184, 146187, 146190, 146193, 146196, + 146199, 146202, 146205, 146208, 146211, 146214, 146217, 146220, 146223, + 146226, 146229, 146232, 146235, 146238, 146241, 146244, 146247, 146250, + 146253, 146256, 146259, 146262, 146265, 146268, 146271, 146274, 146277, + 146280, 146283, 146286, 146289, 146292, 146295, 146298, 146301, 146304, + 146307, 146310, 146313, 146316, 146319, 146322, 146325, 146328, 146331, + 146334, 146337, 146340, 146343, 146346, 146349, 146352, 146355, 146358, + 146361, 146364, 146367, 146370, 146373, 146376, 146379, 146382, 146385, + 146388, 146391, 146394, 146397, 146400, 146403, 146406, 146409, 146412, + 146415, 146418, 146421, 146424, 146427, 146430, 146433, 146436, 146439, + 146442, 146445, 146448, 146451, 146454, 146457, 146460, 146463, 146466, + 146469, 146472, 146475, 146478, 146481, 146484, 146487, 146490, 146493, + 146496, 146499, 146502, 146505, 146508, 146511, 146514, 146517, 146520, + 146523, 146526, 146529, 146532, 146535, 146538, 146541, 146544, 146547, + 146550, 146553, 146556, 146559, 146562, 146565, 146568, 146571, 146574, + 146577, 146580, 146583, 146586, 146589, 146592, 146595, 146598, 146601, + 146604, 146607, 146610, 146613, 146616, 146619, 146622, 146625, 146628, + 146631, 146634, 146637, 146640, 146643, 146646, 146649, 146652, 146655, + 146658, 146661, 146664, 146667, 146670, 146673, 146676, 146679, 146682, + 146685, 146688, 146691, 146694, 146697, 146700, 146703, 146706, 146709, + 146712, 146715, 146718, 146721, 146724, 146727, 146730, 146733, 146736, + 146739, 146742, 146745, 146748, 146751, 146754, 146757, 146760, 146763, + 146766, 146769, 146772, 146775, 146778, 146781, 146784, 146787, 146790, + 146793, 146796, 146799, 146802, 146805, 146808, 146811, 146814, 146817, + 146820, 146823, 146826, 146829, 146832, 146835, 146838, 146841, 146844, + 146847, 146850, 146853, 146856, 146859, 146862, 146865, 146868, 146871, + 146874, 146877, 146880, 146883, 146886, 146889, 146892, 146895, 146898, + 146901, 146904, 146907, 146910, 146913, 146916, 146919, 146922, 146925, + 146928, 146931, 146934, 146937, 146940, 146943, 146946, 146949, 146952, + 146955, 146958, 146961, 146964, 146967, 146970, 146973, 146976, 146979, + 146982, 146985, 146988, 146991, 146994, 146997, 147000, 147003, 147006, + 147009, 147012, 147015, 147018, 147021, 147024, 147027, 147030, 147033, + 147036, 147039, 147042, 147045, 147048, 147051, 147054, 147057, 147060, + 147063, 147066, 147069, 147072, 147075, 147078, 147081, 147084, 147087, + 147090, 147093, 147096, 147099, 147102, 147105, 0, 0, 0, 0, 147108, + 147112, 147116, 147120, 147124, 147128, 147132, 147135, 147139, 147143, + 147147, 147151, 147154, 147160, 147166, 147172, 147178, 147184, 147188, + 147194, 147198, 147202, 147208, 147212, 147216, 147220, 147224, 147228, + 147232, 147236, 147242, 147248, 147254, 147260, 147267, 147274, 147281, + 147292, 147299, 147306, 147312, 147318, 147324, 147330, 147338, 147346, + 147354, 147362, 147371, 147377, 147385, 147391, 147398, 147404, 147411, + 147417, 147425, 147429, 147433, 147438, 147444, 147450, 147458, 147466, + 147472, 147479, 147482, 147488, 147492, 147495, 147499, 147502, 147505, + 147509, 147514, 147518, 147522, 147528, 147533, 147539, 147543, 147547, + 147550, 147554, 147558, 147563, 147567, 147572, 147576, 147581, 147585, + 147589, 147593, 147597, 147601, 147605, 147609, 147613, 147618, 147623, + 147628, 147633, 147639, 147645, 147651, 147657, 147663, 0, 0, 0, 0, 0, + 147668, 147676, 147685, 147693, 147700, 147708, 147715, 147722, 147731, + 147738, 147745, 147753, 147761, 0, 0, 0, 147769, 147775, 147783, 147789, + 147796, 147802, 147808, 147814, 147820, 0, 0, 0, 0, 0, 0, 0, 147826, + 147832, 147840, 147846, 147853, 147859, 147865, 147871, 147877, 147883, + 0, 0, 147888, 147894, 147900, 147903, 147912, 147919, 147927, 147934, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147941, 147946, + 147951, 147956, 147963, 147970, 147977, 147984, 147989, 147994, 147999, + 148004, 148011, 148016, 148023, 148030, 148035, 148040, 148045, 148052, + 148057, 148062, 148069, 148076, 148081, 148086, 148091, 148098, 148105, + 148112, 148117, 148122, 148129, 148136, 148143, 148150, 148155, 148160, + 148165, 148172, 148177, 148182, 148187, 148194, 148203, 148210, 148215, + 148220, 148225, 148230, 148235, 148240, 148249, 148256, 148261, 148268, + 148275, 148280, 148285, 148290, 148297, 148302, 148309, 148316, 148321, + 148326, 148331, 148338, 148345, 148350, 148355, 148362, 148369, 148376, + 148381, 148386, 148391, 148396, 148403, 148412, 148421, 148426, 148433, + 148442, 148447, 148452, 148457, 148462, 148469, 148476, 148483, 148490, + 148495, 148500, 148505, 148512, 148519, 148526, 148531, 148536, 148543, + 148548, 148555, 148560, 148567, 148572, 148579, 148586, 148591, 148596, + 148601, 148606, 148611, 148616, 148621, 148626, 148631, 148638, 148645, + 148652, 148659, 148666, 148675, 148680, 148685, 148692, 148699, 148704, + 148711, 148718, 148725, 148732, 148739, 148746, 148751, 148756, 148761, + 148766, 148771, 148780, 148789, 148798, 148807, 148816, 148825, 148834, + 148843, 148848, 148859, 148870, 148879, 148884, 148889, 148894, 148899, + 148908, 148915, 148922, 148929, 148936, 148943, 148950, 148959, 148968, + 148979, 148988, 148999, 149008, 149015, 149024, 149035, 149044, 149053, + 149062, 149071, 149078, 149085, 149092, 149101, 149110, 149121, 149130, + 149139, 149150, 149155, 149160, 149171, 149179, 149188, 149197, 149206, + 149217, 149226, 149235, 149246, 149257, 149268, 149279, 149290, 149301, + 149308, 149315, 149322, 149329, 149340, 149349, 149356, 149363, 149370, + 149381, 149392, 149403, 149414, 149425, 149436, 149447, 149458, 149465, + 149472, 149481, 149490, 149497, 149504, 149511, 149520, 149529, 149538, + 149545, 149554, 149563, 149572, 149579, 149586, 149591, 149597, 149604, + 149611, 149618, 149625, 149632, 149639, 149648, 149657, 149666, 149675, + 149682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149691, 149697, 149702, 149707, + 149714, 149720, 149726, 149732, 149738, 149744, 149750, 149756, 149760, + 149764, 149770, 149776, 149782, 149786, 149791, 149796, 149800, 149804, + 149807, 149813, 149819, 149825, 149831, 149837, 149843, 149849, 149855, + 149861, 149871, 149881, 149887, 149893, 149903, 149913, 149919, 0, 0, + 149925, 149933, 149938, 149943, 149949, 149955, 149961, 149967, 149973, + 149979, 149986, 149993, 149999, 150005, 150011, 150017, 150023, 150029, + 150035, 150041, 150046, 150052, 150058, 150064, 150070, 150076, 150085, + 150091, 150096, 150104, 150111, 150118, 150127, 150136, 150145, 150154, + 150163, 150172, 150181, 150190, 150200, 150210, 150218, 150226, 150235, + 150244, 150250, 150256, 150262, 150268, 150276, 150284, 150288, 150294, + 150299, 150305, 150311, 150317, 150323, 150329, 150338, 150343, 150350, + 150355, 150360, 150365, 150371, 150377, 150383, 150390, 150395, 150400, + 150405, 150410, 150415, 150421, 150427, 150433, 150439, 150445, 150451, + 150457, 150463, 150468, 150473, 150478, 150483, 150488, 150493, 150498, + 150503, 150509, 150515, 150520, 150525, 150530, 150535, 150540, 150546, + 150553, 150557, 150561, 150565, 150569, 150573, 150577, 150581, 150585, + 150593, 150603, 150607, 150611, 150617, 150623, 150629, 150635, 150641, + 150647, 150653, 150659, 150665, 150671, 150677, 150683, 150689, 150695, + 150699, 150703, 150710, 150716, 150722, 150728, 150733, 150740, 150745, + 150751, 150757, 150763, 150769, 150774, 150778, 150784, 150788, 150792, + 150796, 150802, 150808, 150812, 150818, 150824, 150830, 150836, 150842, + 150850, 150858, 150864, 150870, 150876, 150882, 150894, 150906, 150920, + 150932, 150944, 150958, 150972, 150986, 150990, 150998, 151006, 151011, + 151015, 151019, 151023, 151027, 151031, 151035, 151039, 151045, 151051, + 151057, 151063, 151071, 151080, 151087, 151094, 151102, 151109, 151121, + 151133, 151145, 151157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 151164, 151171, 151178, 151185, 151192, 151199, + 151206, 151213, 151220, 151227, 151234, 151241, 151248, 151255, 151262, + 151269, 151276, 151283, 151290, 151297, 151304, 151311, 151318, 151325, + 151332, 151339, 151346, 151353, 151360, 151367, 151374, 151381, 151388, + 151395, 151402, 151409, 151416, 151423, 151430, 151437, 151444, 151451, + 151458, 151465, 151472, 151479, 151486, 151493, 151500, 151507, 151514, + 151521, 151528, 151535, 151542, 151549, 151556, 151563, 151570, 151577, + 151584, 151591, 151598, 151605, 151612, 151619, 151626, 151631, 151636, + 151641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151645, 151651, 151656, 151661, + 151666, 151671, 151676, 151681, 151686, 151691, 151696, 151702, 151708, + 151714, 151720, 151726, 151732, 151738, 151744, 151750, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 151756, 151761, 151768, 151775, 151782, 151789, 151794, + 151799, 151806, 151811, 151816, 151823, 151828, 151833, 151838, 151845, + 151854, 151859, 151864, 151869, 151874, 151879, 151884, 151891, 151896, + 151901, 151906, 151911, 151916, 151921, 151926, 151931, 151936, 151941, + 151946, 151951, 151957, 151962, 151967, 151972, 151977, 151982, 151987, + 151992, 151997, 152002, 152011, 152016, 152024, 152029, 152034, 152039, + 152044, 152049, 152054, 152059, 152068, 152073, 152078, 152083, 152088, + 152093, 152100, 152105, 152112, 152117, 152122, 152127, 152132, 152137, + 152142, 152147, 152152, 152157, 152162, 152167, 152172, 152177, 152182, + 152187, 152192, 152197, 152202, 152207, 152216, 152221, 152226, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 152231, 152239, 152247, 152255, 152263, 152271, 152279, + 152287, 152295, 152303, 152311, 152319, 152327, 152335, 152343, 152351, + 152359, 152367, 152375, 152380, 152385, 152390, 152395, 152400, 152404, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132950, 132958, - 132966, 132976, 132986, 132994, 133000, 133008, 133016, 133026, 133038, - 133050, 133056, 133064, 133070, 133076, 133082, 133088, 133094, 133100, - 133106, 133112, 133118, 133124, 133130, 133138, 133146, 133152, 133158, - 133164, 133170, 133178, 133186, 133195, 133201, 133209, 133215, 133221, - 133227, 133233, 133239, 133247, 133255, 133261, 133267, 133273, 133279, - 133285, 133291, 133297, 133303, 133309, 133315, 133321, 133327, 133333, - 133339, 133345, 133351, 133357, 133363, 133369, 133377, 133383, 133389, - 133399, 133407, 133413, 133419, 133425, 133431, 133437, 133443, 133449, - 133455, 133461, 133467, 133473, 133479, 133485, 133491, 133497, 133503, - 133509, 133515, 133521, 133527, 133533, 133539, 133547, 133553, 133561, - 133569, 133577, 133583, 133589, 133595, 133601, 133607, 133615, 133625, - 133633, 133641, 133647, 133653, 133661, 133669, 133675, 133683, 133691, - 133699, 133705, 133711, 133717, 133723, 133729, 133735, 133743, 133751, - 133757, 133763, 133769, 133775, 133781, 133789, 133795, 133801, 133807, - 133813, 133819, 133825, 133833, 133839, 133845, 133851, 133857, 133865, - 133873, 133879, 133885, 133891, 133896, 133902, 133908, 133915, 133920, - 133925, 133930, 133935, 133940, 133945, 133950, 133955, 133960, 133969, - 133976, 133981, 133986, 133991, 133998, 134003, 134008, 134013, 134020, - 134025, 134030, 134035, 134040, 134045, 134050, 134055, 134060, 134065, - 134070, 134075, 134082, 134087, 134094, 134099, 134104, 134111, 134116, - 134121, 134126, 134131, 134136, 134141, 134146, 134151, 134156, 134161, - 134166, 134171, 134176, 134181, 134186, 134191, 134196, 134201, 134206, - 134213, 134218, 134223, 134228, 134233, 134238, 134243, 134248, 134253, - 134258, 134263, 134268, 134273, 134278, 134285, 134290, 134295, 134302, - 134307, 134312, 134317, 134322, 134327, 134332, 134337, 134342, 134347, - 134352, 134359, 134364, 134369, 134374, 134379, 134384, 134391, 134398, - 134403, 134408, 134413, 134418, 134423, 134428, 134433, 134438, 134443, - 134448, 134453, 134458, 134463, 134468, 134473, 134478, 134483, 134488, - 134493, 134498, 134503, 134508, 134513, 134518, 134523, 134528, 134533, - 134538, 134543, 134548, 134553, 134558, 134563, 134568, 134573, 134578, - 134585, 134590, 134595, 134600, 134605, 134610, 134615, 134620, 134625, - 134630, 134635, 134640, 134645, 134650, 134655, 134660, 134665, 134670, - 134675, 134680, 134685, 134690, 134695, 134700, 134705, 134710, 134715, - 134720, 134725, 134730, 134735, 134740, 134745, 134750, 134755, 134760, - 134765, 134770, 134775, 134780, 134785, 134790, 134795, 134800, 134805, - 134810, 134815, 134820, 134825, 134830, 134835, 134840, 134845, 134850, - 134855, 134860, 134865, 134870, 134875, 134882, 134887, 134892, 134897, - 134902, 134907, 134912, 134917, 134922, 134927, 134932, 134937, 134942, - 134947, 134952, 134957, 134962, 134967, 134972, 134977, 134982, 134987, - 134994, 134999, 135004, 135010, 135015, 135020, 135025, 135030, 135035, - 135040, 135045, 135050, 135055, 135060, 135065, 135070, 135075, 135080, - 135085, 135090, 135095, 135100, 135105, 135110, 135115, 135120, 135125, - 135130, 135135, 135140, 135145, 135150, 135155, 135160, 135165, 135170, - 135175, 135180, 135185, 135190, 135195, 135200, 135205, 135210, 135215, - 135220, 135225, 135232, 135237, 135242, 135249, 135256, 135261, 135266, - 135271, 135276, 135281, 135286, 135291, 135296, 135301, 135306, 135311, - 135316, 135321, 135326, 135331, 135336, 135341, 135346, 135351, 135356, - 135361, 135366, 135371, 135376, 135381, 135388, 135393, 135398, 135403, - 135408, 135413, 135418, 135423, 135428, 135433, 135438, 135443, 135448, - 135453, 135458, 135463, 135468, 135473, 135478, 135485, 135490, 135495, - 135500, 135505, 135510, 135515, 135520, 135526, 135531, 135536, 135541, - 135546, 135551, 135556, 135561, 135566, 135573, 135580, 135585, 135590, - 135594, 135599, 135603, 135607, 135612, 135619, 135624, 135629, 135638, - 135643, 135648, 135653, 135658, 135665, 135672, 135677, 135682, 135687, - 135692, 135699, 135704, 135709, 135714, 135719, 135724, 135729, 135734, - 135739, 135744, 135749, 135754, 135759, 135766, 135770, 135775, 135780, - 135785, 135790, 135794, 135799, 135804, 135809, 135814, 135819, 135824, - 135829, 135834, 135839, 135845, 135851, 135857, 135863, 135869, 135874, - 135880, 135886, 135892, 135898, 135904, 135910, 135916, 135922, 135928, - 135934, 135940, 135946, 135952, 135958, 135964, 135970, 135976, 135982, - 135987, 135993, 135999, 136005, 136011, 136017, 136023, 136029, 136035, - 136041, 136047, 136053, 136059, 136065, 136071, 136077, 136083, 136089, - 136095, 136101, 136107, 136112, 136118, 136124, 136130, 136136, 136142, - 0, 0, 0, 0, 0, 0, 0, 136148, 136152, 136157, 136162, 136167, 136172, - 136177, 136181, 136186, 136191, 136196, 136201, 136206, 136211, 136216, - 136221, 136226, 136230, 136235, 136239, 136244, 136249, 136254, 136259, - 136264, 136268, 136273, 136278, 136282, 136287, 136292, 0, 136297, - 136302, 136306, 136310, 136314, 136318, 136322, 136326, 136330, 136334, - 0, 0, 0, 0, 136338, 136342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152408, 152412, 152417, + 152422, 152427, 152431, 152436, 152441, 152446, 152450, 152455, 152460, + 152464, 152469, 152474, 152478, 152483, 152488, 152492, 152497, 152502, + 152506, 152511, 152516, 152521, 152526, 152531, 152535, 152540, 152545, + 152550, 152554, 152559, 152564, 152569, 152573, 152578, 152583, 152587, + 152592, 152597, 152601, 152606, 152611, 152615, 152620, 152625, 152629, + 152634, 152639, 152644, 152649, 152654, 152658, 152663, 152668, 152673, + 152677, 152682, 152687, 152692, 152696, 152701, 152706, 152710, 152715, + 152720, 152724, 152729, 152734, 152738, 152743, 152748, 152752, 152757, + 152762, 152767, 152772, 152777, 152781, 152786, 152791, 152796, 152800, + 152805, 0, 152810, 152814, 152819, 152824, 152828, 152833, 152838, + 152842, 152847, 152852, 152856, 152861, 152866, 152870, 152875, 152880, + 152885, 152890, 152895, 152900, 152906, 152912, 152918, 152923, 152929, + 152935, 152941, 152946, 152952, 152958, 152963, 152969, 152975, 152980, + 152986, 152992, 152997, 153003, 153009, 153014, 153020, 153026, 153032, + 153038, 153044, 153049, 153055, 153061, 153067, 153072, 153078, 153084, + 153090, 153095, 153101, 153107, 153112, 153118, 153124, 153129, 153135, + 153141, 153146, 153152, 153158, 153163, 153169, 153175, 153181, 153187, + 153193, 0, 153197, 153202, 0, 0, 153207, 0, 0, 153212, 153217, 0, 0, + 153222, 153227, 153231, 153236, 0, 153241, 153246, 153251, 153255, + 153260, 153265, 153270, 153275, 153280, 153284, 153289, 153294, 0, + 153299, 0, 153304, 153309, 153313, 153318, 153323, 153327, 153332, 0, + 153337, 153342, 153347, 153351, 153356, 153361, 153365, 153370, 153375, + 153380, 153385, 153390, 153395, 153401, 153407, 153413, 153418, 153424, + 153430, 153436, 153441, 153447, 153453, 153458, 153464, 153470, 153475, + 153481, 153487, 153492, 153498, 153504, 153509, 153515, 153521, 153527, + 153533, 153539, 153544, 153550, 153556, 153562, 153567, 153573, 153579, + 153585, 153590, 153596, 153602, 153607, 153613, 153619, 153624, 153630, + 153636, 153641, 153647, 153653, 153658, 153664, 153670, 153676, 153682, + 153688, 153693, 0, 153699, 153705, 153710, 153716, 0, 0, 153722, 153728, + 153734, 153739, 153745, 153751, 153756, 153762, 0, 153768, 153774, + 153780, 153785, 153791, 153797, 153803, 0, 153809, 153814, 153820, + 153826, 153832, 153837, 153843, 153849, 153855, 153860, 153866, 153872, + 153877, 153883, 153889, 153894, 153900, 153906, 153911, 153917, 153923, + 153928, 153934, 153940, 153946, 153952, 153958, 153963, 0, 153969, + 153975, 153980, 153986, 0, 153992, 153997, 154003, 154009, 154014, 0, + 154020, 0, 0, 0, 154025, 154031, 154037, 154042, 154048, 154054, 154060, + 0, 154066, 154071, 154077, 154083, 154089, 154094, 154100, 154106, + 154112, 154117, 154123, 154129, 154134, 154140, 154146, 154151, 154157, + 154163, 154168, 154174, 154180, 154185, 154191, 154197, 154203, 154209, + 154215, 154221, 154228, 154235, 154242, 154248, 154255, 154262, 154269, + 154275, 154282, 154289, 154295, 154302, 154309, 154315, 154322, 154329, + 154335, 154342, 154349, 154355, 154362, 154369, 154376, 154383, 154390, + 154396, 154403, 154410, 154417, 154423, 154430, 154437, 154444, 154450, + 154457, 154464, 154470, 154477, 154484, 154490, 154497, 154504, 154510, + 154517, 154524, 154530, 154537, 154544, 154551, 154558, 154565, 154569, + 154574, 154579, 154584, 154588, 154593, 154598, 154603, 154607, 154612, + 154617, 154621, 154626, 154631, 154635, 154640, 154645, 154649, 154654, + 154659, 154663, 154668, 154673, 154678, 154683, 154688, 154692, 154697, + 154702, 154707, 154711, 154716, 154721, 154726, 154730, 154735, 154740, + 154744, 154749, 154754, 154758, 154763, 154768, 154772, 154777, 154782, + 154786, 154791, 154796, 154801, 154806, 154811, 154816, 154822, 154828, + 154834, 154839, 154845, 154851, 154857, 154862, 154868, 154874, 154879, + 154885, 154891, 154896, 154902, 154908, 154913, 154919, 154925, 154930, + 154936, 154942, 154948, 154954, 154960, 154965, 154971, 154977, 154983, + 154988, 154994, 155000, 155006, 155011, 155017, 155023, 155028, 155034, + 155040, 155045, 155051, 155057, 155062, 155068, 155074, 155079, 155085, + 155091, 155097, 155103, 155109, 155114, 155120, 155126, 155132, 155137, + 155143, 155149, 155155, 155160, 155166, 155172, 155177, 155183, 155189, + 155194, 155200, 155206, 155211, 155217, 155223, 155228, 155234, 155240, + 155246, 155252, 155258, 155263, 155269, 155275, 155281, 155286, 155292, + 155298, 155304, 155309, 155315, 155321, 155326, 155332, 155338, 155343, + 155349, 155355, 155360, 155366, 155372, 155377, 155383, 155389, 155395, + 155401, 155407, 155413, 155420, 155427, 155434, 155440, 155447, 155454, + 155461, 155467, 155474, 155481, 155487, 155494, 155501, 155507, 155514, + 155521, 155527, 155534, 155541, 155547, 155554, 155561, 155568, 155575, + 155582, 155588, 155595, 155602, 155609, 155615, 155622, 155629, 155636, + 155642, 155649, 155656, 155662, 155669, 155676, 155682, 155689, 155696, + 155702, 155709, 155716, 155722, 155729, 155736, 155743, 155750, 155757, + 155762, 155768, 155774, 155780, 155785, 155791, 155797, 155803, 155808, + 155814, 155820, 155825, 155831, 155837, 155842, 155848, 155854, 155859, + 155865, 155871, 155876, 155882, 155888, 155894, 155900, 155906, 155911, + 155917, 155923, 155929, 155934, 155940, 155946, 155952, 155957, 155963, + 155969, 155974, 155980, 155986, 155991, 155997, 156003, 156008, 156014, + 156020, 156025, 156031, 156037, 156043, 156049, 156055, 156061, 0, 0, + 156068, 156073, 156078, 156083, 156088, 156093, 156098, 156103, 156108, + 156113, 156118, 156123, 156128, 156133, 156138, 156143, 156148, 156153, + 156159, 156164, 156169, 156174, 156179, 156184, 156189, 156194, 156198, + 156203, 156208, 156213, 156218, 156223, 156228, 156233, 156238, 156243, + 156248, 156253, 156258, 156263, 156268, 156273, 156278, 156283, 156289, + 156294, 156299, 156304, 156309, 156314, 156319, 156324, 156330, 156335, + 156340, 156345, 156350, 156355, 156360, 156365, 156370, 156375, 156380, + 156385, 156390, 156395, 156400, 156405, 156410, 156415, 156420, 156425, + 156430, 156435, 156440, 156445, 156451, 156456, 156461, 156466, 156471, + 156476, 156481, 156486, 156490, 156495, 156500, 156505, 156510, 156515, + 156520, 156525, 156530, 156535, 156540, 156545, 156550, 156555, 156560, + 156565, 156570, 156575, 156581, 156586, 156591, 156596, 156601, 156606, + 156611, 156616, 156622, 156627, 156632, 156637, 156642, 156647, 156652, + 156658, 156664, 156670, 156676, 156682, 156688, 156694, 156700, 156706, + 156712, 156718, 156724, 156730, 156736, 156742, 156748, 156754, 156761, + 156767, 156773, 156779, 156785, 156791, 156797, 156803, 156808, 156814, + 156820, 156826, 156832, 156838, 156844, 156850, 156856, 156862, 156868, + 156874, 156880, 156886, 156892, 156898, 156904, 156910, 156917, 156923, + 156929, 156935, 156941, 156947, 156953, 156959, 156966, 156972, 156978, + 156984, 156990, 156996, 157002, 157008, 157014, 157020, 157026, 157032, + 157038, 157044, 157050, 157056, 157062, 157068, 157074, 157080, 157086, + 157092, 157098, 157104, 157111, 157117, 157123, 157129, 157135, 157141, + 157147, 157153, 157158, 157164, 157170, 157176, 157182, 157188, 157194, + 157200, 157206, 157212, 157218, 157224, 157230, 157236, 157242, 157248, + 157254, 157260, 157267, 157273, 157279, 157285, 157291, 157297, 157303, + 157309, 157316, 157322, 157328, 157334, 157340, 157346, 157352, 157359, + 157366, 157373, 157380, 157387, 157394, 157401, 157408, 157415, 157422, + 157429, 157436, 157443, 157450, 157457, 157464, 157471, 157479, 157486, + 157493, 157500, 157507, 157514, 157521, 157528, 157534, 157541, 157548, + 157555, 157562, 157569, 157576, 157583, 157590, 157597, 157604, 157611, + 157618, 157625, 157632, 157639, 157646, 157653, 157661, 157668, 157675, + 157682, 157689, 157696, 157703, 157710, 157718, 157725, 157732, 157739, + 157746, 157753, 157760, 157765, 0, 0, 157770, 157775, 157779, 157783, + 157787, 157791, 157795, 157799, 157803, 157807, 157811, 157817, 157822, + 157827, 157832, 157837, 157842, 157847, 157852, 157857, 157862, 157867, + 157871, 157875, 157879, 157883, 157887, 157891, 157895, 157899, 157903, + 157909, 157914, 157919, 157924, 157929, 157934, 157939, 157944, 157949, + 157954, 157960, 157965, 157970, 157975, 157980, 157985, 157990, 157995, + 158000, 158005, 158009, 158014, 158019, 158024, 158029, 158034, 158039, + 158045, 158053, 158060, 158065, 158070, 158077, 158083, 158088, 158094, + 158100, 158108, 158114, 158121, 158129, 158135, 158144, 158153, 158161, + 158169, 158175, 158182, 158190, 158198, 158204, 158211, 158220, 158229, + 158236, 158247, 158257, 158267, 158277, 158287, 158294, 158301, 158308, + 158315, 158324, 158333, 158344, 158355, 158364, 158373, 158384, 158393, + 158402, 158413, 158422, 158431, 158439, 158447, 158458, 158469, 158477, + 158486, 158495, 158502, 158513, 158524, 158533, 158542, 158549, 158558, + 158567, 158576, 158587, 158596, 158606, 158615, 158624, 158635, 158648, + 158663, 158674, 158687, 158699, 158708, 158719, 158730, 158739, 158750, + 158764, 158779, 158782, 158791, 158796, 158802, 158810, 158816, 158822, + 158831, 158838, 158848, 158860, 158867, 158870, 158876, 158883, 158889, + 158894, 158897, 158902, 158905, 158913, 158919, 158928, 158935, 158943, + 158949, 158954, 158957, 158960, 158963, 158969, 158976, 158982, 158987, + 158995, 158998, 159003, 159011, 159017, 159026, 159033, 159043, 159052, + 159055, 159061, 159068, 159075, 159082, 159087, 159095, 159103, 159112, + 159118, 159127, 159136, 159145, 159151, 159160, 159167, 159174, 159181, + 159189, 159195, 159203, 159209, 159216, 159223, 159231, 159242, 159252, + 159258, 159265, 159272, 159279, 159285, 159292, 159299, 159304, 159311, + 159319, 159328, 159334, 159346, 159357, 159363, 159371, 159377, 159384, + 159391, 159398, 159404, 159411, 159420, 159426, 159432, 159439, 159446, + 159454, 159464, 159474, 159484, 159494, 159502, 159510, 159520, 159528, + 159533, 159538, 159543, 159549, 159556, 159563, 159569, 159575, 159580, + 159587, 159595, 159605, 159613, 159621, 159631, 159641, 159649, 159659, + 159669, 159681, 159693, 159705, 159715, 159721, 159727, 159734, 159743, + 159752, 159761, 159770, 159780, 159789, 159798, 159807, 159812, 159818, + 159827, 159837, 159846, 159852, 159858, 159865, 159872, 159879, 159885, + 159892, 159899, 159906, 159912, 159916, 159921, 159928, 159935, 159942, + 159947, 159955, 159963, 159972, 159980, 159987, 159995, 160004, 160014, + 160017, 160021, 160026, 160031, 160036, 160041, 160046, 160051, 160056, + 160061, 160066, 160071, 160076, 160081, 160086, 160091, 160096, 160101, + 160106, 160113, 160119, 160126, 160132, 160137, 160144, 160150, 160157, + 160163, 160168, 160175, 160182, 160189, 160195, 160201, 160210, 160219, + 160229, 160236, 160243, 160252, 160261, 160270, 160279, 160288, 160294, + 160302, 160308, 160318, 160323, 160332, 160341, 160348, 160359, 160366, + 160373, 160380, 160387, 160394, 160401, 160408, 160415, 160422, 160429, + 160435, 160441, 160447, 160454, 160461, 160468, 160475, 160482, 160489, + 160496, 160503, 160510, 160517, 160524, 160531, 160536, 160545, 160554, + 160563, 160570, 160577, 160584, 160591, 160598, 160605, 160612, 160619, + 160628, 160637, 160646, 160655, 160664, 160673, 160682, 160691, 160700, + 160709, 160718, 160727, 160736, 160742, 160750, 160756, 160766, 160771, + 160780, 160789, 160798, 160809, 160814, 160821, 160828, 160835, 160840, + 160846, 160852, 160858, 160865, 160872, 160879, 160886, 160893, 160900, + 160907, 160914, 160921, 160928, 160935, 160942, 160947, 160956, 160965, + 160974, 160983, 160992, 161001, 161010, 161019, 161030, 161041, 161048, + 161055, 161062, 161069, 161076, 161083, 161091, 161101, 161111, 161121, + 161132, 161143, 161154, 161163, 161172, 161181, 161186, 161191, 161196, + 161201, 161212, 161223, 161234, 161245, 161256, 161266, 161277, 161286, + 161295, 161304, 161313, 161322, 161330, 161339, 161350, 161361, 161372, + 161383, 161394, 161406, 161419, 161431, 161444, 161456, 161469, 161481, + 161494, 161505, 161516, 161525, 161533, 161542, 161553, 161564, 161576, + 161589, 161603, 161618, 161630, 161643, 161655, 161668, 161679, 161690, + 161699, 161707, 161716, 161723, 161730, 161737, 161744, 161751, 161758, + 161765, 161772, 161779, 161786, 161791, 161796, 161801, 161808, 161818, + 161829, 161839, 161850, 161864, 161879, 161894, 161908, 161923, 161938, + 161949, 161960, 161973, 161986, 161995, 162004, 162017, 162030, 162037, + 162044, 162049, 162054, 162059, 162064, 162069, 162076, 162085, 162090, + 162093, 162098, 162105, 162112, 162119, 162126, 162133, 162140, 162153, + 162167, 162182, 162189, 162196, 162203, 162212, 162220, 162228, 162237, + 162242, 162247, 162252, 162257, 162262, 162267, 162274, 162281, 162287, + 162294, 162300, 162307, 162312, 162317, 162322, 162327, 162332, 162339, + 162346, 162351, 162358, 162365, 162370, 162375, 162380, 162385, 162390, + 162395, 162402, 162409, 162416, 162419, 162424, 162429, 162434, 162439, + 162446, 162453, 162461, 162469, 162474, 162479, 162486, 162493, 162500, + 162505, 162512, 162519, 162524, 162531, 162538, 162545, 162552, 162559, + 162566, 162575, 162584, 162591, 162600, 162609, 162614, 162621, 162628, + 162633, 162640, 162647, 162654, 162661, 162668, 162673, 162680, 162687, + 162696, 162703, 162712, 162723, 162732, 162741, 162750, 162759, 162762, + 162767, 162774, 162783, 162790, 162799, 162806, 162811, 162816, 162819, + 162822, 162825, 162832, 162839, 162848, 162857, 162866, 162873, 162880, + 162885, 162897, 162902, 162907, 162912, 162917, 162922, 162927, 162932, + 162937, 162940, 162945, 162950, 162955, 162960, 162965, 162972, 162977, + 162984, 162987, 162992, 162995, 162998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 163001, 163006, 163011, 163016, 163021, 0, 163026, 163031, + 163036, 163041, 163046, 163051, 163056, 163061, 163066, 163071, 163076, + 163081, 163086, 163091, 163096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 136347, 136354, 136360, 136367, 136374, - 136381, 136388, 136395, 136402, 136409, 136416, 136423, 136430, 136437, - 136444, 136451, 136458, 136465, 136471, 136478, 136485, 136492, 136498, - 136505, 136511, 136517, 136524, 136530, 136537, 136543, 0, 0, 136549, - 136557, 136565, 136574, 136583, 136592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 136600, 136605, 136610, 136615, 136620, 136625, 136630, 136635, 136640, - 136645, 136650, 136655, 136660, 136665, 136670, 136675, 136680, 136685, - 136690, 136695, 136700, 136705, 136710, 136715, 136720, 136725, 136730, - 136735, 136740, 136745, 136750, 136755, 136760, 136765, 136770, 136775, - 136780, 136785, 136790, 136795, 136800, 136805, 136810, 136815, 136820, - 136825, 136830, 136835, 136840, 136847, 136854, 136861, 136868, 136875, - 136882, 136889, 136896, 136905, 136912, 136919, 136926, 136933, 136940, - 136947, 136954, 136961, 136968, 136975, 136982, 136987, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 136996, 137001, 137005, 137009, 137013, 137017, 137021, - 137025, 137029, 137033, 0, 137037, 137042, 137047, 137054, 137059, - 137066, 137073, 0, 137078, 137085, 137090, 137095, 137102, 137109, - 137114, 137119, 137124, 137129, 137134, 137141, 137148, 137153, 137158, - 137163, 137176, 137185, 137192, 137201, 137210, 0, 0, 0, 0, 0, 137219, - 137226, 137233, 137240, 137247, 137254, 137261, 137268, 137275, 137282, - 137289, 137296, 137303, 137310, 137317, 137324, 137331, 137338, 137345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163101, 163106, + 163111, 163116, 163121, 163126, 163131, 0, 163136, 163141, 163146, + 163152, 163156, 163161, 163166, 163171, 163176, 163181, 163186, 163191, + 163196, 163201, 163206, 163211, 163216, 0, 0, 163221, 163226, 163231, + 163236, 163241, 163246, 163251, 0, 163256, 163261, 0, 163267, 163272, + 163280, 163287, 163296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 137352, 137358, 137364, 137370, 137376, 137382, - 137388, 137394, 137400, 137406, 137412, 137418, 137423, 137429, 137434, - 137440, 137445, 137451, 137457, 137462, 137468, 137473, 137479, 137485, - 137491, 137497, 137503, 137509, 137515, 137520, 137525, 137531, 137537, - 137543, 137549, 137555, 137561, 137567, 137573, 137579, 137585, 137591, - 137597, 137603, 137608, 137614, 137619, 137625, 137630, 137636, 137642, - 137647, 137653, 137658, 137664, 137670, 137676, 137682, 137688, 137694, - 137700, 137705, 137710, 137716, 137722, 137727, 137731, 137735, 137739, - 137743, 137747, 137751, 137755, 137759, 137763, 137768, 137773, 137778, - 137783, 137788, 137793, 137798, 137803, 137808, 137813, 137820, 137827, - 137834, 137838, 137844, 137849, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 163301, 163308, 163316, 163324, 163331, 163338, 163345, + 163353, 163361, 163369, 163376, 163383, 163391, 163399, 163407, 163414, + 163422, 163430, 163438, 163446, 163454, 163462, 163470, 163477, 163485, + 163492, 163500, 163507, 163515, 163523, 163531, 163539, 163547, 163555, + 163563, 163571, 163579, 163586, 163594, 163601, 163608, 163615, 163623, + 163630, 163638, 0, 0, 0, 163646, 163653, 163660, 163667, 163674, 163681, + 163688, 163695, 163704, 163713, 163722, 163731, 163740, 163750, 0, 0, + 163758, 163766, 163773, 163780, 163787, 163794, 163801, 163808, 163815, + 163822, 0, 0, 0, 0, 163829, 163838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137855, 137858, 137862, - 137866, 137870, 137873, 137877, 137882, 137886, 137890, 137894, 137897, - 137901, 137906, 137910, 137914, 137918, 137921, 137925, 137930, 137935, - 137939, 137943, 137946, 137950, 137954, 137958, 137962, 137966, 137970, - 137974, 137977, 137981, 137985, 137989, 137993, 137997, 138001, 138007, - 138010, 138014, 138018, 138022, 138026, 138030, 138034, 138038, 138042, - 138046, 138051, 138056, 138062, 138066, 138070, 138074, 138078, 138082, - 138086, 138091, 138094, 138098, 138102, 138106, 138110, 138116, 138120, - 138124, 138128, 138132, 138136, 138140, 138144, 138148, 138152, 138156, - 0, 0, 0, 0, 138160, 138165, 138169, 138173, 138179, 138185, 138189, - 138194, 138199, 138204, 138209, 138213, 138218, 138223, 138228, 138232, - 138237, 138242, 138247, 138251, 138256, 138261, 138266, 138271, 138276, - 138281, 138286, 138291, 138295, 138300, 138305, 138310, 138315, 138320, - 138325, 138330, 138335, 138340, 138345, 138350, 138357, 138362, 138369, - 138374, 138379, 138384, 138389, 138394, 138399, 138404, 138409, 138414, - 138419, 138424, 138429, 138434, 138439, 0, 0, 0, 0, 0, 0, 0, 138444, - 138448, 138454, 138457, 138460, 138464, 138468, 138472, 138476, 138480, - 138484, 138488, 138494, 138500, 138506, 138512, 138518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138524, 138528, 138532, 138538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 138544, 138547, 138550, 138553, 138556, 138559, 138562, 138565, 138568, - 138571, 138574, 138577, 138580, 138583, 138586, 138589, 138592, 138595, - 138598, 138601, 138604, 138607, 138610, 138613, 138616, 138619, 138622, - 138625, 138628, 138631, 138634, 138637, 138640, 138643, 138646, 138649, - 138652, 138655, 138658, 138661, 138664, 138667, 138670, 138673, 138676, - 138679, 138682, 138685, 138688, 138691, 138694, 138697, 138700, 138703, - 138706, 138709, 138712, 138715, 138718, 138721, 138724, 138727, 138730, - 138733, 138736, 138739, 138742, 138745, 138748, 138751, 138754, 138757, - 138760, 138763, 138766, 138769, 138772, 138775, 138778, 138781, 138784, - 138787, 138790, 138793, 138796, 138799, 138802, 138805, 138808, 138811, - 138814, 138817, 138820, 138823, 138826, 138829, 138832, 138835, 138838, - 138841, 138844, 138847, 138850, 138853, 138856, 138859, 138862, 138865, - 138868, 138871, 138874, 138877, 138880, 138883, 138886, 138889, 138892, - 138895, 138898, 138901, 138904, 138907, 138910, 138913, 138916, 138919, - 138922, 138925, 138928, 138931, 138934, 138937, 138940, 138943, 138946, - 138949, 138952, 138955, 138958, 138961, 138964, 138967, 138970, 138973, - 138976, 138979, 138982, 138985, 138988, 138991, 138994, 138997, 139000, - 139003, 139006, 139009, 139012, 139015, 139018, 139021, 139024, 139027, - 139030, 139033, 139036, 139039, 139042, 139045, 139048, 139051, 139054, - 139057, 139060, 139063, 139066, 139069, 139072, 139075, 139078, 139081, - 139084, 139087, 139090, 139093, 139096, 139099, 139102, 139105, 139108, - 139111, 139114, 139117, 139120, 139123, 139126, 139129, 139132, 139135, - 139138, 139141, 139144, 139147, 139150, 139153, 139156, 139159, 139162, - 139165, 139168, 139171, 139174, 139177, 139180, 139183, 139186, 139189, - 139192, 139195, 139198, 139201, 139204, 139207, 139210, 139213, 139216, - 139219, 139222, 139225, 139228, 139231, 139234, 139237, 139240, 139243, - 139246, 139249, 139252, 139255, 139258, 139261, 139264, 139267, 139270, - 139273, 139276, 139279, 139282, 139285, 139288, 139291, 139294, 139297, - 139300, 139303, 139306, 139309, 139312, 139315, 139318, 139321, 139324, - 139327, 139330, 139333, 139336, 139339, 139342, 139345, 139348, 139351, - 139354, 139357, 139360, 139363, 139366, 139369, 139372, 139375, 139378, - 139381, 139384, 139387, 139390, 139393, 139396, 139399, 139402, 139405, - 139408, 139411, 139414, 139417, 139420, 139423, 139426, 139429, 139432, - 139435, 139438, 139441, 139444, 139447, 139450, 139453, 139456, 139459, - 139462, 139465, 139468, 139471, 139474, 139477, 139480, 139483, 139486, - 139489, 139492, 139495, 139498, 139501, 139504, 139507, 139510, 139513, - 139516, 139519, 139522, 139525, 139528, 139531, 139534, 139537, 139540, - 139543, 139546, 139549, 139552, 139555, 139558, 139561, 139564, 139567, - 139570, 139573, 139576, 139579, 139582, 139585, 139588, 139591, 139594, - 139597, 139600, 139603, 139606, 139609, 139612, 139615, 139618, 139621, - 139624, 139627, 139630, 139633, 139636, 139639, 139642, 139645, 139648, - 139651, 139654, 139657, 139660, 139663, 139666, 139669, 139672, 139675, - 139678, 139681, 139684, 139687, 139690, 139693, 139696, 139699, 139702, - 139705, 139708, 139711, 139714, 139717, 139720, 139723, 139726, 139729, - 139732, 139735, 139738, 139741, 139744, 139747, 139750, 139753, 139756, - 139759, 139762, 139765, 139768, 139771, 139774, 139777, 139780, 139783, - 139786, 139789, 139792, 139795, 139798, 139801, 139804, 139807, 139810, - 139813, 139816, 139819, 139822, 139825, 139828, 139831, 139834, 139837, - 139840, 139843, 139846, 139849, 139852, 139855, 139858, 139861, 139864, - 139867, 139870, 139873, 139876, 139879, 139882, 139885, 139888, 139891, - 139894, 139897, 139900, 139903, 139906, 139909, 139912, 139915, 139918, - 139921, 139924, 139927, 139930, 139933, 139936, 139939, 139942, 139945, - 139948, 139951, 139954, 139957, 139960, 139963, 139966, 139969, 139972, - 139975, 139978, 139981, 139984, 139987, 139990, 139993, 139996, 139999, - 140002, 140005, 140008, 140011, 140014, 140017, 140020, 140023, 140026, - 140029, 140032, 140035, 140038, 140041, 140044, 140047, 140050, 140053, - 140056, 140059, 140062, 140065, 140068, 140071, 140074, 140077, 140080, - 140083, 140086, 140089, 140092, 140095, 140098, 140101, 140104, 140107, - 140110, 140113, 140116, 140119, 140122, 140125, 140128, 140131, 140134, - 140137, 140140, 140143, 140146, 140149, 140152, 140155, 140158, 140161, - 140164, 140167, 140170, 140173, 140176, 140179, 140182, 140185, 140188, - 140191, 140194, 140197, 140200, 140203, 140206, 140209, 140212, 140215, - 140218, 140221, 140224, 140227, 140230, 140233, 140236, 140239, 140242, - 140245, 140248, 140251, 140254, 140257, 140260, 140263, 140266, 140269, - 140272, 140275, 140278, 140281, 140284, 140287, 140290, 140293, 140296, - 140299, 140302, 140305, 140308, 140311, 140314, 140317, 140320, 140323, - 140326, 140329, 140332, 140335, 140338, 140341, 140344, 140347, 140350, - 140353, 140356, 140359, 140362, 140365, 140368, 140371, 140374, 140377, - 140380, 140383, 140386, 140389, 140392, 140395, 140398, 140401, 140404, - 140407, 140410, 140413, 140416, 140419, 140422, 140425, 140428, 140431, - 140434, 140437, 140440, 140443, 140446, 140449, 140452, 140455, 140458, - 140461, 140464, 140467, 140470, 140473, 140476, 140479, 140482, 140485, - 140488, 140491, 140494, 140497, 140500, 140503, 140506, 140509, 140512, - 140515, 140518, 140521, 140524, 140527, 140530, 140533, 140536, 140539, - 140542, 140545, 140548, 140551, 140554, 140557, 140560, 140563, 140566, - 140569, 140572, 140575, 140578, 140581, 140584, 140587, 140590, 140593, - 140596, 140599, 140602, 140605, 140608, 140611, 140614, 140617, 140620, - 140623, 140626, 140629, 140632, 140635, 140638, 140641, 140644, 140647, - 140650, 140653, 140656, 140659, 140662, 140665, 140668, 140671, 140674, - 140677, 140680, 140683, 140686, 140689, 140692, 140695, 140698, 140701, - 140704, 140707, 140710, 140713, 140716, 140719, 140722, 140725, 140728, - 140731, 140734, 140737, 140740, 140743, 140746, 140749, 140752, 140755, - 140758, 140761, 140764, 140767, 140770, 140773, 140776, 140779, 140782, - 140785, 140788, 140791, 140794, 140797, 140800, 140803, 140806, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140809, 140814, 140820, 140824, 140828, - 140832, 140836, 140840, 140844, 140848, 140852, 140856, 140860, 140864, - 140868, 140872, 140876, 140880, 140884, 140888, 140892, 140896, 140900, - 140904, 140908, 140912, 140916, 140920, 140924, 140928, 140932, 140936, - 140940, 140944, 140948, 140952, 140956, 140960, 140964, 140968, 140972, - 140976, 140980, 140984, 140988, 140992, 140996, 141000, 141004, 141008, - 141012, 141016, 141020, 141024, 141028, 141032, 141036, 141040, 141044, - 141048, 141052, 141056, 141060, 141064, 141068, 141072, 141076, 141080, - 141084, 141088, 141092, 141096, 141100, 141104, 141108, 141112, 141116, - 141120, 141124, 141128, 141132, 141136, 141140, 141144, 141148, 141152, - 141156, 141160, 141164, 141168, 141172, 141176, 141180, 141184, 141188, - 141192, 141196, 141200, 141204, 141208, 141212, 141216, 141220, 141224, - 141228, 141232, 141236, 141240, 141244, 141248, 141252, 141256, 141260, - 141264, 141268, 141272, 141276, 141280, 141284, 141288, 141292, 141296, - 141300, 141304, 141308, 141312, 141316, 141320, 141324, 141328, 141332, - 141336, 141340, 141344, 141348, 141352, 141356, 141360, 141364, 141368, - 141372, 141376, 141380, 141384, 141388, 141392, 141396, 141400, 141404, - 141408, 141412, 141416, 141420, 141424, 141428, 141432, 141436, 141440, - 141444, 141448, 141452, 141456, 141460, 141464, 141468, 141472, 141476, - 141480, 141484, 141488, 141492, 141496, 141500, 141504, 141508, 141512, - 141516, 141520, 141524, 141528, 141532, 141536, 141540, 141544, 141548, - 141552, 141556, 141560, 141564, 141568, 141572, 141576, 141580, 141584, - 141588, 141592, 141596, 141600, 141604, 141608, 141612, 141616, 141620, - 141624, 141628, 141632, 141636, 141640, 141644, 141648, 141652, 141656, - 141660, 141664, 141668, 141672, 141676, 141680, 141684, 141688, 141692, - 141696, 141700, 141704, 141708, 141712, 141716, 141720, 141724, 141728, - 141732, 141736, 141740, 141744, 141748, 141752, 141756, 141760, 141764, - 141768, 141772, 141776, 141780, 141784, 141788, 141792, 141796, 141800, - 141804, 141808, 141812, 141816, 141820, 141824, 141828, 141832, 141836, - 141840, 141844, 141848, 141852, 141856, 141860, 141864, 141868, 141872, - 141876, 141880, 141884, 141888, 141892, 141896, 141900, 141904, 141908, - 141912, 141916, 141920, 141924, 141928, 141932, 141936, 141940, 141944, - 141948, 141952, 141956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 141960, 141965, 141970, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141975, 141980, 141985, 141990, 0, 0, 0, 0, - 0, 0, 0, 0, 141995, 141998, 142001, 142004, 142007, 142010, 142013, - 142016, 142019, 142022, 142025, 142028, 142031, 142034, 142037, 142040, - 142043, 142046, 142049, 142052, 142055, 142058, 142061, 142064, 142067, - 142070, 142073, 142076, 142079, 142082, 142085, 142088, 142091, 142094, - 142097, 142100, 142103, 142106, 142109, 142112, 142115, 142118, 142121, - 142124, 142127, 142130, 142133, 142136, 142139, 142142, 142145, 142148, - 142151, 142154, 142157, 142160, 142163, 142166, 142169, 142172, 142175, - 142178, 142181, 142184, 142187, 142190, 142193, 142196, 142199, 142202, - 142205, 142208, 142211, 142214, 142217, 142220, 142223, 142226, 142229, - 142232, 142235, 142238, 142241, 142244, 142247, 142250, 142253, 142256, - 142259, 142262, 142265, 142268, 142271, 142274, 142277, 142280, 142283, - 142286, 142289, 142292, 142295, 142298, 142301, 142304, 142307, 142310, - 142313, 142316, 142319, 142322, 142325, 142328, 142331, 142334, 142337, - 142340, 142343, 142346, 142349, 142352, 142355, 142358, 142361, 142364, - 142367, 142370, 142373, 142376, 142379, 142382, 142385, 142388, 142391, - 142394, 142397, 142400, 142403, 142406, 142409, 142412, 142415, 142418, - 142421, 142424, 142427, 142430, 142433, 142436, 142439, 142442, 142445, - 142448, 142451, 142454, 142457, 142460, 142463, 142466, 142469, 142472, - 142475, 142478, 142481, 142484, 142487, 142490, 142493, 142496, 142499, - 142502, 142505, 142508, 142511, 142514, 142517, 142520, 142523, 142526, - 142529, 142532, 142535, 142538, 142541, 142544, 142547, 142550, 142553, - 142556, 142559, 142562, 142565, 142568, 142571, 142574, 142577, 142580, - 142583, 142586, 142589, 142592, 142595, 142598, 142601, 142604, 142607, - 142610, 142613, 142616, 142619, 142622, 142625, 142628, 142631, 142634, - 142637, 142640, 142643, 142646, 142649, 142652, 142655, 142658, 142661, - 142664, 142667, 142670, 142673, 142676, 142679, 142682, 142685, 142688, - 142691, 142694, 142697, 142700, 142703, 142706, 142709, 142712, 142715, - 142718, 142721, 142724, 142727, 142730, 142733, 142736, 142739, 142742, - 142745, 142748, 142751, 142754, 142757, 142760, 142763, 142766, 142769, - 142772, 142775, 142778, 142781, 142784, 142787, 142790, 142793, 142796, - 142799, 142802, 142805, 142808, 142811, 142814, 142817, 142820, 142823, - 142826, 142829, 142832, 142835, 142838, 142841, 142844, 142847, 142850, - 142853, 142856, 142859, 142862, 142865, 142868, 142871, 142874, 142877, - 142880, 142883, 142886, 142889, 142892, 142895, 142898, 142901, 142904, - 142907, 142910, 142913, 142916, 142919, 142922, 142925, 142928, 142931, - 142934, 142937, 142940, 142943, 142946, 142949, 142952, 142955, 142958, - 142961, 142964, 142967, 142970, 142973, 142976, 142979, 142982, 142985, - 142988, 142991, 142994, 142997, 143000, 143003, 143006, 143009, 143012, - 143015, 143018, 143021, 143024, 143027, 143030, 143033, 143036, 143039, - 143042, 143045, 143048, 143051, 143054, 143057, 143060, 143063, 143066, - 143069, 143072, 143075, 143078, 143081, 143084, 143087, 143090, 143093, - 143096, 143099, 143102, 143105, 143108, 143111, 143114, 143117, 143120, - 143123, 143126, 143129, 143132, 143135, 143138, 143141, 143144, 143147, - 143150, 143153, 143156, 143159, 143162, 143165, 143168, 143171, 143174, - 143177, 143180, 0, 0, 0, 0, 143183, 143187, 143191, 143195, 143199, - 143203, 143207, 143210, 143214, 143218, 143222, 143226, 143229, 143235, - 143241, 143247, 143253, 143259, 143263, 143269, 143273, 143277, 143283, - 143287, 143291, 143295, 143299, 143303, 143307, 143311, 143317, 143323, - 143329, 143335, 143342, 143349, 143356, 143367, 143374, 143381, 143387, - 143393, 143399, 143405, 143413, 143421, 143429, 143437, 143446, 143452, - 143460, 143466, 143473, 143479, 143486, 143492, 143500, 143504, 143508, - 143513, 143519, 143525, 143533, 143541, 143547, 143554, 143557, 143563, - 143567, 143570, 143574, 143577, 143580, 143584, 143589, 143593, 143597, - 143603, 143608, 143614, 143618, 143622, 143625, 143629, 143633, 143638, - 143642, 143647, 143651, 143656, 143660, 143664, 143668, 143672, 143676, - 143680, 143684, 143688, 143693, 143698, 143703, 143708, 143714, 143720, - 143726, 143732, 143738, 0, 0, 0, 0, 0, 143743, 143751, 143760, 143768, - 143775, 143783, 143790, 143797, 143806, 143813, 143820, 143828, 143836, - 0, 0, 0, 143844, 143849, 143856, 143862, 143869, 143875, 143881, 143887, - 143893, 0, 0, 0, 0, 0, 0, 0, 143899, 143904, 143911, 143917, 143924, - 143930, 143936, 143942, 143948, 143954, 0, 0, 143959, 143965, 143971, - 143974, 143983, 143990, 143998, 144005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 144012, 144017, 144022, 144027, 144034, - 144041, 144048, 144055, 144060, 144065, 144070, 144075, 144082, 144087, - 144094, 144101, 144106, 144111, 144116, 144123, 144128, 144133, 144140, - 144147, 144152, 144157, 144162, 144169, 144176, 144183, 144188, 144193, - 144200, 144207, 144214, 144221, 144226, 144231, 144236, 144243, 144248, - 144253, 144258, 144265, 144274, 144281, 144286, 144291, 144296, 144301, - 144306, 144311, 144320, 144327, 144332, 144339, 144346, 144351, 144356, - 144361, 144368, 144373, 144380, 144387, 144392, 144397, 144402, 144409, - 144416, 144421, 144426, 144433, 144440, 144447, 144452, 144457, 144462, - 144467, 144474, 144483, 144492, 144497, 144504, 144513, 144518, 144523, - 144528, 144533, 144540, 144547, 144554, 144561, 144566, 144571, 144576, - 144583, 144590, 144597, 144602, 144607, 144614, 144619, 144626, 144631, - 144638, 144643, 144650, 144657, 144662, 144667, 144672, 144677, 144682, - 144687, 144692, 144697, 144702, 144709, 144716, 144723, 144730, 144737, - 144746, 144751, 144756, 144763, 144770, 144775, 144782, 144789, 144796, - 144803, 144810, 144817, 144822, 144827, 144832, 144837, 144842, 144851, - 144860, 144869, 144878, 144887, 144896, 144905, 144914, 144919, 144930, - 144941, 144950, 144955, 144960, 144965, 144970, 144979, 144986, 144993, - 145000, 145007, 145014, 145021, 145030, 145039, 145050, 145059, 145070, - 145079, 145086, 145095, 145106, 145115, 145124, 145133, 145142, 145149, - 145156, 145163, 145172, 145181, 145192, 145201, 145210, 145221, 145226, - 145231, 145242, 145250, 145259, 145268, 145277, 145288, 145297, 145306, - 145317, 145328, 145339, 145350, 145361, 145372, 145379, 145386, 145393, - 145400, 145411, 145420, 145427, 145434, 145441, 145452, 145463, 145474, - 145485, 145496, 145507, 145518, 145529, 145536, 145543, 145552, 145561, - 145568, 145575, 145582, 145591, 145600, 145609, 145616, 145625, 145634, - 145643, 145650, 145657, 145662, 145668, 145675, 145682, 145689, 145696, - 145703, 145710, 145719, 145728, 145737, 145746, 145753, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 145762, 145768, 145773, 145778, 145785, 145791, 145797, - 145803, 145809, 145815, 145821, 145827, 145831, 145835, 145841, 145847, - 145853, 145857, 145862, 145867, 145871, 145875, 145878, 145884, 145890, - 145896, 145902, 145908, 145914, 145920, 145926, 145932, 145942, 145952, - 145958, 145964, 145974, 145984, 145990, 0, 0, 145996, 146004, 146009, - 146014, 146020, 146026, 146032, 146038, 146044, 146050, 146057, 146064, - 146070, 146076, 146082, 146088, 146094, 146100, 146106, 146112, 146117, - 146123, 146129, 146135, 146141, 146147, 146156, 146162, 146167, 146175, - 146182, 146189, 146198, 146207, 146216, 146225, 146234, 146243, 146252, - 146261, 146271, 146281, 146289, 146297, 146306, 146315, 146321, 146327, - 146333, 146339, 146347, 146355, 146359, 146365, 146370, 146376, 146382, - 146388, 146394, 146400, 146409, 146414, 146421, 146426, 146431, 146436, - 146442, 146448, 146454, 146461, 146466, 146471, 146476, 146481, 146486, - 146492, 146498, 146504, 146510, 146516, 146522, 146528, 146534, 146539, - 146544, 146549, 146554, 146559, 146564, 146569, 146574, 146580, 146586, - 146591, 146596, 146601, 146606, 146611, 146617, 146624, 146628, 146632, - 146636, 146640, 146644, 146648, 146652, 146656, 146664, 146674, 146678, - 146682, 146688, 146694, 146700, 146706, 146712, 146718, 146724, 146730, - 146736, 146742, 146748, 146754, 146760, 146766, 146770, 146774, 146781, - 146787, 146793, 146799, 146804, 146811, 146816, 146822, 146828, 146834, - 146840, 146845, 146849, 146855, 146859, 146863, 146867, 146873, 146879, - 146883, 146889, 146895, 146901, 146907, 146913, 146921, 146929, 146935, - 146941, 146947, 146953, 146965, 146977, 146991, 147003, 147015, 147029, - 147043, 147057, 147061, 147069, 147077, 147082, 147086, 147090, 147094, - 147098, 147102, 147106, 147110, 147116, 147122, 147128, 147134, 147142, - 147151, 147158, 147165, 147173, 147180, 147192, 147204, 147216, 147228, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 147235, 147242, 147249, 147256, 147263, 147270, 147277, 147284, 147291, - 147298, 147305, 147312, 147319, 147326, 147333, 147340, 147347, 147354, - 147361, 147368, 147375, 147382, 147389, 147396, 147403, 147410, 147417, - 147424, 147431, 147438, 147445, 147452, 147459, 147466, 147473, 147480, - 147487, 147494, 147501, 147508, 147515, 147522, 147529, 147536, 147543, - 147550, 147557, 147564, 147571, 147578, 147585, 147592, 147599, 147606, - 147613, 147620, 147627, 147634, 147641, 147648, 147655, 147662, 147669, - 147676, 147683, 147690, 147697, 147702, 147707, 147712, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 147716, 147722, 147727, 147732, 147737, 147742, 147747, - 147752, 147757, 147762, 147767, 147773, 147779, 147785, 147791, 147797, - 147803, 147809, 147815, 147821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 147827, 147832, 147839, 147846, 147853, 147860, 147865, 147870, 147877, - 147882, 147887, 147894, 147899, 147904, 147909, 147916, 147925, 147930, - 147935, 147940, 147945, 147950, 147955, 147962, 147967, 147972, 147977, - 147982, 147987, 147992, 147997, 148002, 148007, 148012, 148017, 148022, - 148028, 148033, 148038, 148043, 148048, 148053, 148058, 148063, 148068, - 148073, 148082, 148087, 148096, 148101, 148106, 148111, 148116, 148121, - 148126, 148131, 148140, 148145, 148150, 148155, 148160, 148165, 148172, - 148177, 148184, 148189, 148194, 148199, 148204, 148209, 148214, 148219, - 148224, 148229, 148234, 148239, 148244, 148249, 148254, 148259, 148264, - 148269, 148274, 148279, 148288, 148293, 148298, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 148303, 148311, 148319, 148327, 148335, 148343, 148351, 148359, - 148367, 148375, 148383, 148391, 148399, 148407, 148415, 148423, 148431, - 148439, 148447, 148452, 148457, 148462, 148467, 148472, 148476, 0, 0, 0, - 0, 0, 0, 0, 148480, 148484, 148489, 148494, 148499, 148503, 148508, - 148513, 148518, 148522, 148527, 148532, 148536, 148541, 148546, 148550, - 148555, 148560, 148564, 148569, 148574, 148578, 148583, 148588, 148593, - 148598, 148603, 148607, 148612, 148617, 148622, 148626, 148631, 148636, - 148641, 148645, 148650, 148655, 148659, 148664, 148669, 148673, 148678, - 148683, 148687, 148692, 148697, 148701, 148706, 148711, 148716, 148721, - 148726, 148730, 148735, 148740, 148745, 148749, 148754, 148759, 148764, - 148768, 148773, 148778, 148782, 148787, 148792, 148796, 148801, 148806, - 148810, 148815, 148820, 148824, 148829, 148834, 148839, 148844, 148849, - 148853, 148858, 148863, 148868, 148872, 148877, 0, 148882, 148886, - 148891, 148896, 148900, 148905, 148910, 148914, 148919, 148924, 148928, - 148933, 148938, 148942, 148947, 148952, 148957, 148962, 148967, 148972, - 148978, 148984, 148990, 148995, 149001, 149007, 149013, 149018, 149024, - 149030, 149035, 149041, 149047, 149052, 149058, 149064, 149069, 149075, - 149081, 149086, 149092, 149098, 149104, 149110, 149116, 149121, 149127, - 149133, 149139, 149144, 149150, 149156, 149162, 149167, 149173, 149179, - 149184, 149190, 149196, 149201, 149207, 149213, 149218, 149224, 149230, - 149235, 149241, 149247, 149253, 149259, 149265, 0, 149269, 149274, 0, 0, - 149279, 0, 0, 149284, 149289, 0, 0, 149294, 149299, 149303, 149308, 0, - 149313, 149318, 149323, 149327, 149332, 149337, 149342, 149347, 149352, - 149356, 149361, 149366, 0, 149371, 0, 149376, 149381, 149385, 149390, - 149395, 149399, 149404, 0, 149409, 149414, 149419, 149423, 149428, - 149433, 149437, 149442, 149447, 149452, 149457, 149462, 149467, 149473, - 149479, 149485, 149490, 149496, 149502, 149508, 149513, 149519, 149525, - 149530, 149536, 149542, 149547, 149553, 149559, 149564, 149570, 149576, - 149581, 149587, 149593, 149599, 149605, 149611, 149616, 149622, 149628, - 149634, 149639, 149645, 149651, 149657, 149662, 149668, 149674, 149679, - 149685, 149691, 149696, 149702, 149708, 149713, 149719, 149725, 149730, - 149736, 149742, 149748, 149754, 149760, 149764, 0, 149769, 149774, - 149778, 149783, 0, 0, 149788, 149793, 149798, 149802, 149807, 149812, - 149816, 149821, 0, 149826, 149831, 149836, 149840, 149845, 149850, - 149855, 0, 149860, 149864, 149869, 149874, 149879, 149883, 149888, - 149893, 149898, 149902, 149907, 149912, 149916, 149921, 149926, 149930, - 149935, 149940, 149944, 149949, 149954, 149958, 149963, 149968, 149973, - 149978, 149983, 149988, 0, 149994, 150000, 150005, 150011, 0, 150017, - 150022, 150028, 150034, 150039, 0, 150045, 0, 0, 0, 150050, 150056, - 150062, 150067, 150073, 150079, 150085, 0, 150091, 150096, 150102, - 150108, 150114, 150119, 150125, 150131, 150137, 150142, 150148, 150154, - 150159, 150165, 150171, 150176, 150182, 150188, 150193, 150199, 150205, - 150210, 150216, 150222, 150228, 150234, 150240, 150245, 150251, 150257, - 150263, 150268, 150274, 150280, 150286, 150291, 150297, 150303, 150308, - 150314, 150320, 150325, 150331, 150337, 150342, 150348, 150354, 150359, - 150365, 150371, 150377, 150383, 150389, 150394, 150400, 150406, 150412, - 150417, 150423, 150429, 150435, 150440, 150446, 150452, 150457, 150463, - 150469, 150474, 150480, 150486, 150491, 150497, 150503, 150508, 150514, - 150520, 150526, 150532, 150538, 150542, 150547, 150552, 150557, 150561, - 150566, 150571, 150576, 150580, 150585, 150590, 150594, 150599, 150604, - 150608, 150613, 150618, 150622, 150627, 150632, 150636, 150641, 150646, - 150651, 150656, 150661, 150665, 150670, 150675, 150680, 150684, 150689, - 150694, 150699, 150703, 150708, 150713, 150717, 150722, 150727, 150731, - 150736, 150741, 150745, 150750, 150755, 150759, 150764, 150769, 150774, - 150779, 150784, 150789, 150795, 150801, 150807, 150812, 150818, 150824, - 150830, 150835, 150841, 150847, 150852, 150858, 150864, 150869, 150875, - 150881, 150886, 150892, 150898, 150903, 150909, 150915, 150921, 150927, - 150933, 150938, 150944, 150950, 150956, 150961, 150967, 150973, 150979, - 150984, 150990, 150996, 151001, 151007, 151013, 151018, 151024, 151030, - 151035, 151041, 151047, 151052, 151058, 151064, 151070, 151076, 151082, - 151087, 151093, 151099, 151105, 151110, 151116, 151122, 151128, 151133, - 151139, 151145, 151150, 151156, 151162, 151167, 151173, 151179, 151184, - 151190, 151196, 151201, 151207, 151213, 151219, 151225, 151231, 151236, - 151242, 151248, 151254, 151259, 151265, 151271, 151277, 151282, 151288, - 151294, 151299, 151305, 151311, 151316, 151322, 151328, 151333, 151339, - 151345, 151350, 151356, 151362, 151368, 151374, 151380, 151386, 151393, - 151400, 151407, 151413, 151420, 151427, 151434, 151440, 151447, 151454, - 151460, 151467, 151474, 151480, 151487, 151494, 151500, 151507, 151514, - 151520, 151527, 151534, 151541, 151548, 151555, 151561, 151568, 151575, - 151582, 151588, 151595, 151602, 151609, 151615, 151622, 151629, 151635, - 151642, 151649, 151655, 151662, 151669, 151675, 151682, 151689, 151695, - 151702, 151709, 151716, 151723, 151730, 151735, 151741, 151747, 151753, - 151758, 151764, 151770, 151776, 151781, 151787, 151793, 151798, 151804, - 151810, 151815, 151821, 151827, 151832, 151838, 151844, 151849, 151855, - 151861, 151867, 151873, 151879, 151884, 151890, 151896, 151902, 151907, - 151913, 151919, 151925, 151930, 151936, 151942, 151947, 151953, 151959, - 151964, 151970, 151976, 151981, 151987, 151993, 151998, 152004, 152010, - 152016, 152022, 152028, 152034, 0, 0, 152041, 152046, 152051, 152056, - 152061, 152066, 152071, 152076, 152081, 152086, 152091, 152096, 152101, - 152106, 152111, 152116, 152121, 152126, 152132, 152137, 152142, 152147, - 152152, 152157, 152162, 152167, 152171, 152176, 152181, 152186, 152191, - 152196, 152201, 152206, 152211, 152216, 152221, 152226, 152231, 152236, - 152241, 152246, 152251, 152256, 152262, 152267, 152272, 152277, 152282, - 152287, 152292, 152297, 152303, 152308, 152313, 152318, 152323, 152328, - 152333, 152338, 152343, 152348, 152353, 152358, 152363, 152368, 152373, - 152378, 152383, 152388, 152393, 152398, 152403, 152408, 152413, 152418, - 152424, 152429, 152434, 152439, 152444, 152449, 152454, 152459, 152463, - 152468, 152473, 152478, 152483, 152488, 152493, 152498, 152503, 152508, - 152513, 152518, 152523, 152528, 152533, 152538, 152543, 152548, 152554, - 152559, 152564, 152569, 152574, 152579, 152584, 152589, 152595, 152600, - 152605, 152610, 152615, 152620, 152625, 152631, 152637, 152643, 152649, - 152655, 152661, 152667, 152673, 152679, 152685, 152691, 152697, 152703, - 152709, 152715, 152721, 152727, 152734, 152740, 152746, 152752, 152758, - 152764, 152770, 152776, 152781, 152787, 152793, 152799, 152805, 152811, - 152817, 152823, 152829, 152835, 152841, 152847, 152853, 152859, 152865, - 152871, 152877, 152883, 152890, 152896, 152902, 152908, 152914, 152920, - 152926, 152932, 152939, 152945, 152951, 152957, 152963, 152969, 152975, - 152981, 152987, 152993, 152999, 153005, 153011, 153017, 153023, 153029, - 153035, 153041, 153047, 153053, 153059, 153065, 153071, 153077, 153084, - 153090, 153096, 153102, 153108, 153114, 153120, 153126, 153131, 153137, - 153143, 153149, 153155, 153161, 153167, 153173, 153179, 153185, 153191, - 153197, 153203, 153209, 153215, 153221, 153227, 153233, 153240, 153246, - 153252, 153258, 153264, 153270, 153276, 153282, 153289, 153295, 153301, - 153307, 153313, 153319, 153325, 153332, 153339, 153346, 153353, 153360, - 153367, 153374, 153381, 153388, 153395, 153402, 153409, 153416, 153423, - 153430, 153437, 153444, 153452, 153459, 153466, 153473, 153480, 153487, - 153494, 153501, 153507, 153514, 153521, 153528, 153535, 153542, 153549, - 153556, 153563, 153570, 153577, 153584, 153591, 153598, 153605, 153612, - 153619, 153626, 153634, 153641, 153648, 153655, 153662, 153669, 153676, - 153683, 153691, 153698, 153705, 153712, 153719, 153726, 153733, 153738, - 0, 0, 153743, 153748, 153752, 153756, 153760, 153764, 153768, 153772, - 153776, 153780, 153784, 153790, 153795, 153800, 153805, 153810, 153815, - 153820, 153825, 153830, 153835, 153840, 153844, 153848, 153852, 153856, - 153860, 153864, 153868, 153872, 153876, 153882, 153887, 153892, 153897, - 153902, 153907, 153912, 153917, 153922, 153927, 153933, 153938, 153943, - 153948, 153953, 153958, 153963, 153968, 153973, 153978, 153982, 153987, - 153992, 153997, 154002, 154007, 154012, 154018, 154026, 154033, 154038, - 154043, 154050, 154056, 154061, 154067, 154073, 154081, 154087, 154094, - 154102, 154108, 154117, 154126, 154134, 154142, 154148, 154155, 154163, - 154171, 154177, 154184, 154193, 154202, 154209, 154220, 154230, 154240, - 154250, 154260, 154267, 154274, 154281, 154288, 154297, 154306, 154317, - 154328, 154337, 154346, 154357, 154366, 154375, 154386, 154395, 154404, - 154412, 154420, 154431, 154442, 154450, 154459, 154468, 154475, 154486, - 154497, 154506, 154515, 154522, 154531, 154540, 154549, 154560, 154569, - 154579, 154588, 154597, 154608, 154621, 154636, 154647, 154660, 154672, - 154681, 154692, 154703, 154712, 154723, 154737, 154752, 154755, 154764, - 154769, 154775, 154783, 154789, 154795, 154804, 154811, 154821, 154833, - 154840, 154843, 154849, 154856, 154862, 154867, 154870, 154875, 154878, - 154885, 154891, 154899, 154906, 154913, 154919, 154924, 154927, 154930, - 154933, 154939, 154946, 154952, 154957, 154964, 154967, 154972, 154979, - 154985, 154993, 155000, 155010, 155019, 155022, 155028, 155035, 155042, - 155049, 155054, 155062, 155070, 155079, 155085, 155094, 155103, 155112, - 155118, 155127, 155134, 155141, 155148, 155156, 155162, 155170, 155176, - 155183, 155190, 155198, 155209, 155219, 155225, 155232, 155239, 155246, - 155252, 155259, 155266, 155271, 155278, 155286, 155295, 155301, 155313, - 155324, 155330, 155338, 155344, 155351, 155358, 155365, 155371, 155378, - 155387, 155393, 155399, 155406, 155413, 155421, 155431, 155441, 155451, - 155461, 155469, 155477, 155487, 155495, 155500, 155505, 155510, 155516, - 155523, 155530, 155536, 155542, 155547, 155554, 155562, 155572, 155580, - 155588, 155598, 155608, 155616, 155626, 155636, 155648, 155660, 155672, - 155682, 155688, 155694, 155701, 155710, 155719, 155728, 155737, 155747, - 155756, 155765, 155774, 155779, 155785, 155794, 155804, 155813, 155819, - 155825, 155832, 155839, 155846, 155852, 155859, 155866, 155873, 155879, - 155883, 155888, 155895, 155902, 155909, 155914, 155922, 155930, 155939, - 155947, 155954, 155962, 155971, 155981, 155984, 155988, 155993, 155998, - 156003, 156008, 156013, 156018, 156023, 156028, 156033, 156038, 156043, - 156048, 156053, 156058, 156063, 156068, 156073, 156080, 156086, 156093, - 156099, 156104, 156111, 156117, 156124, 156130, 156135, 156142, 156149, - 156156, 156162, 156168, 156177, 156186, 156197, 156204, 156211, 156220, - 156229, 156238, 156247, 156256, 156262, 156270, 156276, 156286, 156291, - 156300, 156309, 156316, 156327, 156334, 156341, 156348, 156355, 156362, - 156369, 156376, 156383, 156390, 156397, 156403, 156409, 156415, 156422, - 156429, 156436, 156443, 156450, 156457, 156464, 156471, 156478, 156485, - 156492, 156499, 156504, 156513, 156522, 156531, 156538, 156545, 156552, - 156559, 156566, 156573, 156580, 156587, 156596, 156605, 156614, 156623, - 156632, 156641, 156650, 156659, 156668, 156677, 156686, 156695, 156704, - 156710, 156718, 156724, 156734, 156739, 156748, 156757, 156766, 156777, - 156782, 156789, 156796, 156803, 156808, 156814, 156820, 156826, 156833, - 156840, 156847, 156854, 156861, 156868, 156875, 156882, 156889, 156896, - 156903, 156910, 156915, 156924, 156933, 156942, 156951, 156960, 156969, - 156978, 156987, 156998, 157009, 157016, 157023, 157030, 157037, 157044, - 157051, 157059, 157069, 157079, 157089, 157100, 157111, 157122, 157131, - 157140, 157149, 157154, 157159, 157164, 157169, 157180, 157191, 157202, - 157213, 157224, 157234, 157245, 157254, 157263, 157272, 157281, 157290, - 157298, 157307, 157318, 157329, 157340, 157351, 157362, 157374, 157387, - 157399, 157412, 157424, 157437, 157449, 157462, 157473, 157484, 157493, - 157501, 157510, 157521, 157532, 157544, 157557, 157571, 157586, 157598, - 157611, 157623, 157636, 157647, 157658, 157667, 157675, 157684, 157691, - 157698, 157705, 157712, 157719, 157726, 157733, 157740, 157747, 157754, - 157759, 157764, 157769, 157776, 157786, 157797, 157807, 157818, 157832, - 157847, 157862, 157876, 157891, 157906, 157917, 157928, 157941, 157954, - 157963, 157972, 157985, 157998, 158005, 158012, 158017, 158022, 158027, - 158032, 158037, 158044, 158053, 158058, 158061, 158066, 158073, 158080, - 158087, 158094, 158101, 158108, 158121, 158135, 158150, 158157, 158164, - 158171, 158180, 158188, 158196, 158205, 158210, 158215, 158220, 158225, - 158230, 158235, 158242, 158249, 158255, 158262, 158268, 158275, 158280, - 158285, 158290, 158295, 158300, 158307, 158314, 158319, 158326, 158333, - 158338, 158343, 158348, 158353, 158358, 158363, 158370, 158377, 158384, - 158387, 158392, 158397, 158402, 158407, 158414, 158421, 158429, 158437, - 158442, 158447, 158454, 158461, 158468, 158473, 158480, 158487, 158492, - 158499, 158506, 158512, 158518, 158524, 158530, 158538, 158546, 158552, - 158560, 158568, 158573, 158580, 158587, 158592, 158599, 158606, 158613, - 158621, 158629, 158634, 158641, 158648, 158657, 158664, 158673, 158684, - 158693, 158702, 158711, 158720, 158723, 158728, 158735, 158744, 158751, - 158760, 158767, 158772, 158777, 158780, 158783, 158786, 158793, 158800, - 158809, 158818, 158827, 158834, 158841, 158846, 158859, 158864, 158869, - 158874, 158879, 158884, 158889, 158894, 158899, 158902, 158907, 158912, - 158917, 158922, 158927, 158934, 158939, 158946, 158949, 158954, 158957, - 158960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158963, 158968, - 158973, 158978, 158983, 0, 158988, 158993, 158998, 159003, 159008, - 159013, 159018, 159023, 159028, 159033, 159038, 159043, 159048, 159053, - 159058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163846, + 163851, 163855, 163860, 163865, 163870, 163875, 163879, 163884, 163888, + 163892, 163896, 163900, 163905, 163910, 163914, 163919, 163924, 163929, + 163934, 163939, 163943, 163947, 163952, 163956, 163960, 163965, 163969, + 163973, 163977, 163982, 163986, 163991, 163996, 164001, 164006, 164011, + 164016, 164021, 164026, 164031, 164036, 164041, 164046, 164051, 164056, + 164061, 164066, 164071, 164076, 164080, 164084, 164088, 164092, 164096, + 164100, 164104, 164108, 0, 0, 0, 0, 0, 164112, 164117, 164124, 164130, + 164137, 164144, 164151, 164158, 164165, 164172, 164179, 164186, 164193, + 164200, 164207, 164214, 164221, 164228, 164235, 164242, 164249, 164256, + 164263, 164270, 164277, 164284, 164291, 164298, 164305, 164312, 164319, + 164326, 164333, 164340, 164347, 164354, 164360, 164366, 164372, 164379, + 164385, 164392, 164398, 164405, 164412, 164419, 164426, 164433, 164440, + 164446, 164453, 164460, 164467, 164474, 164481, 164488, 164495, 164501, + 164508, 164515, 164522, 164529, 164536, 164544, 164551, 164558, 164565, + 164572, 164579, 164586, 164593, 164599, 164606, 164613, 164620, 164627, + 164633, 164640, 164647, 164654, 164661, 164668, 164675, 164682, 164690, + 164697, 164703, 164710, 164717, 164724, 164731, 164738, 164745, 164752, + 164759, 164766, 164773, 164780, 164787, 164794, 164801, 164808, 164815, + 164822, 164829, 164836, 164843, 164849, 164856, 164863, 164870, 164877, + 164884, 164891, 164898, 164905, 164912, 164919, 164926, 164933, 164940, + 164947, 164954, 164961, 164968, 164975, 164982, 164989, 164996, 165003, + 165011, 165019, 165027, 165034, 165041, 165048, 165055, 165062, 165069, + 165076, 165083, 165090, 165097, 165103, 165110, 165117, 165124, 165131, + 165138, 165145, 165152, 165159, 165166, 165173, 165180, 165187, 165194, + 165201, 165209, 165217, 165225, 165232, 165239, 165246, 165253, 165260, + 165267, 165274, 165281, 165288, 165295, 165302, 165309, 165316, 165323, + 165329, 165336, 165343, 165350, 165357, 165364, 165371, 165378, 165385, + 165392, 165399, 165406, 165413, 165420, 165427, 165434, 165441, 165448, + 165455, 165462, 165469, 165476, 165483, 0, 0, 165490, 165494, 165498, + 165502, 165506, 165510, 165514, 165518, 165522, 165526, 165532, 165538, + 165544, 165550, 165558, 165566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 165572, 165578, 165584, 165590, 165596, 165602, 165608, 165614, + 165620, 165625, 165630, 165636, 165641, 165646, 165652, 165658, 165664, + 165670, 165676, 165681, 165686, 165692, 165698, 165703, 165709, 165715, + 165721, 165727, 165733, 165739, 165745, 165751, 165757, 165763, 165769, + 165775, 165781, 165787, 165793, 165799, 165805, 165811, 165817, 165822, + 165827, 165833, 165838, 165843, 165849, 165855, 165861, 165867, 165873, + 165878, 165883, 165889, 165895, 165900, 165906, 165912, 165918, 165924, + 165930, 165936, 165942, 165948, 165954, 165960, 165966, 165972, 165977, + 165982, 165986, 165991, 165998, 166002, 0, 0, 0, 0, 166007, 166012, + 166016, 166020, 166024, 166028, 166032, 166036, 166040, 166044, 0, 0, 0, + 0, 166048, 166054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159063, 159068, 159073, 159078, 159083, - 159088, 159093, 0, 159098, 159103, 159108, 159114, 159118, 159123, - 159128, 159133, 159138, 159143, 159148, 159153, 159158, 159163, 159168, - 159173, 159178, 0, 0, 159183, 159188, 159193, 159198, 159203, 159208, - 159213, 0, 159218, 159223, 0, 159229, 159234, 159242, 159249, 159258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159263, 159270, 159278, 159286, - 159293, 159300, 159307, 159315, 159323, 159331, 159338, 159345, 159353, - 159361, 159369, 159376, 159384, 159392, 159400, 159408, 159416, 159424, - 159432, 159439, 159447, 159454, 159462, 159469, 159477, 159485, 159493, - 159501, 159509, 159517, 159525, 159533, 159541, 159548, 159556, 159563, - 159570, 159577, 159585, 159592, 159600, 0, 0, 0, 159608, 159615, 159622, - 159629, 159636, 159643, 159650, 159657, 159666, 159675, 159684, 159693, - 159702, 159712, 0, 0, 159720, 159728, 159735, 159742, 159749, 159756, - 159763, 159770, 159777, 159784, 0, 0, 0, 0, 159791, 159800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159808, 159813, 159817, 159822, - 159827, 159832, 159837, 159841, 159846, 159850, 159854, 159858, 159862, - 159867, 159872, 159876, 159881, 159886, 159891, 159896, 159901, 159905, - 159909, 159914, 159918, 159922, 159927, 159931, 159935, 159939, 159944, - 159948, 159953, 159958, 159963, 159968, 159973, 159978, 159983, 159988, - 159993, 159998, 160003, 160008, 160013, 160018, 160023, 160028, 160033, - 160038, 160042, 160046, 160050, 160054, 160058, 160062, 160066, 160070, - 0, 0, 0, 0, 0, 160074, 160079, 160086, 160092, 160099, 160106, 160113, - 160120, 160127, 160134, 160141, 160148, 160155, 160162, 160169, 160176, - 160183, 160190, 160197, 160204, 160211, 160218, 160225, 160232, 160239, - 160246, 160253, 160260, 160267, 160274, 160281, 160288, 160295, 160302, - 160309, 160316, 160322, 160328, 160334, 160341, 160347, 160354, 160360, - 160367, 160374, 160381, 160388, 160395, 160402, 160408, 160415, 160422, - 160429, 160436, 160443, 160450, 160457, 160463, 160470, 160477, 160484, - 160491, 160498, 160506, 160513, 160520, 160527, 160534, 160541, 160548, - 160555, 160561, 160568, 160575, 160582, 160589, 160595, 160602, 160609, - 160616, 160623, 160630, 160637, 160644, 160652, 160659, 160665, 160672, - 160679, 160686, 160693, 160700, 160707, 160714, 160721, 160728, 160735, - 160742, 160749, 160756, 160763, 160770, 160777, 160784, 160791, 160798, - 160805, 160811, 160818, 160825, 160832, 160839, 160846, 160853, 160860, - 160867, 160874, 160881, 160888, 160895, 160902, 160909, 160916, 160923, - 160930, 160937, 160944, 160951, 160958, 160965, 160973, 160981, 160989, - 160996, 161003, 161010, 161017, 161024, 161031, 161038, 161045, 161052, - 161059, 161065, 161072, 161079, 161086, 161093, 161100, 161107, 161114, - 161121, 161128, 161135, 161142, 161149, 161156, 161163, 161171, 161179, - 161187, 161194, 161201, 161208, 161215, 161222, 161229, 161236, 161243, - 161250, 161257, 161264, 161271, 161278, 161285, 161291, 161298, 161305, - 161312, 161319, 161326, 161333, 161340, 161347, 161354, 161361, 161368, - 161375, 161382, 161389, 161396, 161403, 161410, 161417, 161424, 161431, - 161438, 161445, 0, 0, 161452, 161456, 161460, 161464, 161468, 161472, - 161476, 161480, 161484, 161488, 161494, 161500, 161506, 161512, 161520, - 161528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161534, 161540, - 161546, 161552, 161558, 161564, 161570, 161576, 161582, 161587, 161592, - 161598, 161603, 161608, 161614, 161620, 161626, 161632, 161638, 161643, - 161648, 161654, 161660, 161665, 161671, 161677, 161683, 161689, 161695, - 161701, 161707, 161713, 161719, 161725, 161731, 161737, 161743, 161749, - 161755, 161761, 161767, 161773, 161779, 161784, 161789, 161795, 161800, - 161805, 161811, 161817, 161823, 161829, 161835, 161840, 161845, 161851, - 161857, 161862, 161868, 161874, 161880, 161886, 161892, 161898, 161904, - 161910, 161916, 161922, 161928, 161934, 161939, 161944, 161948, 161953, - 161960, 161964, 0, 0, 0, 0, 161969, 161974, 161978, 161982, 161986, - 161990, 161994, 161998, 162002, 162006, 0, 0, 0, 0, 162010, 162016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166060, 166065, 166070, + 166075, 166080, 166085, 166090, 166095, 166100, 166105, 166111, 166117, + 166123, 166129, 166135, 166141, 166147, 166153, 166159, 166166, 166173, + 166180, 166188, 166196, 166204, 166212, 166220, 166228, 166234, 166240, + 166246, 166253, 166260, 166267, 166274, 166281, 166288, 166295, 166302, + 166309, 166316, 166323, 166330, 166337, 166344, 166351, 166357, 166363, + 166369, 166375, 166381, 166388, 166395, 166402, 166409, 166416, 166423, + 166430, 166437, 166444, 166449, 166457, 166465, 166473, 166479, 166486, + 166493, 166502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 166510, 166515, 166520, 166525, 166530, + 166535, 166540, 166545, 166550, 166555, 166561, 166567, 166573, 166579, + 166585, 166591, 166597, 166603, 166609, 166616, 166623, 166630, 166638, + 166646, 166654, 166662, 166670, 166678, 166684, 166690, 166696, 166703, + 166710, 166717, 166724, 166731, 166738, 166745, 166752, 166759, 166766, + 166773, 166780, 166787, 166794, 166801, 166806, 166813, 166820, 166827, + 166834, 166841, 166848, 166855, 166862, 166870, 166880, 166890, 166898, + 166907, 166915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 162022, 162027, 162032, 162037, 162042, 162047, 162052, 162057, 162062, - 162067, 162073, 162079, 162085, 162091, 162097, 162103, 162109, 162115, - 162121, 162128, 162135, 162142, 162150, 162158, 162166, 162174, 162182, - 162190, 162196, 162202, 162208, 162215, 162222, 162229, 162236, 162243, - 162250, 162257, 162264, 162271, 162278, 162285, 162292, 162299, 162306, - 162313, 162319, 162325, 162331, 162337, 162343, 162350, 162357, 162364, - 162371, 162378, 162385, 162392, 162399, 162406, 162411, 162418, 162425, - 162432, 162438, 162445, 162452, 162461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162469, 162474, - 162479, 162484, 162489, 162494, 162499, 162504, 162509, 162514, 162520, - 162526, 162532, 162538, 162544, 162550, 162556, 162562, 162568, 162575, - 162582, 162589, 162597, 162605, 162613, 162621, 162629, 162637, 162643, - 162649, 162655, 162662, 162669, 162676, 162683, 162690, 162697, 162704, - 162711, 162718, 162725, 162732, 162739, 162746, 162753, 162760, 162765, - 162772, 162779, 162786, 162793, 162800, 162807, 162814, 162821, 162829, - 162839, 162849, 162857, 162866, 162873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 162880, 162884, 162888, 162892, 0, 162896, 162900, - 162904, 162908, 162912, 162916, 162920, 162924, 162928, 162932, 162936, - 162940, 162944, 162948, 162952, 162956, 162960, 162964, 162968, 162972, - 162976, 162980, 162984, 162988, 162994, 163000, 163006, 0, 163012, - 163017, 0, 163022, 0, 0, 163027, 0, 163032, 163037, 163042, 163047, - 163052, 163057, 163062, 163067, 163072, 163077, 0, 163082, 163087, - 163092, 163097, 0, 163102, 0, 163107, 0, 0, 0, 0, 0, 0, 163112, 0, 0, 0, - 0, 163118, 0, 163124, 0, 163130, 0, 163136, 163142, 163148, 0, 163154, - 163160, 0, 163166, 0, 0, 163172, 0, 163178, 0, 163184, 0, 163190, 0, - 163198, 0, 163206, 163212, 0, 163218, 0, 0, 163224, 163230, 163236, - 163242, 0, 163248, 163254, 163260, 163266, 163272, 163278, 163284, 0, - 163290, 163296, 163302, 163308, 0, 163314, 163320, 163326, 163332, 0, - 163340, 0, 163348, 163354, 163360, 163366, 163372, 163378, 163384, - 163390, 163396, 163402, 0, 163408, 163414, 163420, 163426, 163432, - 163438, 163444, 163450, 163456, 163462, 163468, 163474, 163480, 163486, - 163492, 163498, 163504, 0, 0, 0, 0, 0, 163510, 163516, 163522, 0, 163528, - 163534, 163540, 163546, 163552, 0, 163558, 163564, 163570, 163576, - 163582, 163588, 163594, 163600, 163606, 163612, 163618, 163624, 163630, - 163636, 163642, 163648, 163654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163660, 163670, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 163678, 163685, 163692, 163699, 163705, - 163712, 163719, 163725, 163732, 163739, 163746, 163754, 163762, 163770, - 163778, 163786, 163794, 163801, 163808, 163815, 163823, 163831, 163839, - 163847, 163855, 163863, 163870, 163877, 163884, 163892, 163900, 163908, - 163916, 163924, 163932, 163937, 163942, 163947, 163952, 163957, 163962, - 163967, 163972, 163977, 0, 0, 0, 0, 163982, 163988, 163992, 163996, - 164000, 164004, 164008, 164012, 164016, 164020, 164024, 164028, 164032, - 164036, 164040, 164044, 164048, 164052, 164056, 164060, 164064, 164068, - 164072, 164076, 164080, 164084, 164088, 164092, 164096, 164100, 164104, - 164108, 164112, 164116, 164120, 164124, 164128, 164132, 164136, 164140, - 164144, 164148, 164152, 164156, 164160, 164164, 164168, 164172, 164176, - 164180, 164184, 164189, 164193, 164197, 164201, 164205, 164209, 164213, - 164217, 164221, 164225, 164229, 164233, 164237, 164241, 164245, 164249, - 164253, 164257, 164261, 164265, 164269, 164273, 164277, 164281, 164285, - 164289, 164293, 164297, 164301, 164305, 164309, 164313, 164317, 164321, - 164325, 164329, 164333, 164337, 164341, 164345, 164349, 164353, 164357, - 164361, 164365, 164369, 164373, 164377, 164381, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 164385, 164391, 164400, 164408, 164416, 164425, 164434, - 164443, 164452, 164461, 164470, 164479, 164488, 164497, 164506, 0, 0, - 164515, 164524, 164532, 164540, 164549, 164558, 164567, 164576, 164585, - 164594, 164603, 164612, 164621, 164630, 164639, 0, 164647, 164656, - 164664, 164672, 164681, 164690, 164699, 164708, 164717, 164726, 164735, - 164744, 164753, 164762, 164771, 0, 164778, 164787, 164795, 164803, - 164812, 164821, 164830, 164839, 164848, 164857, 164866, 164875, 164884, - 164893, 164902, 164909, 164915, 164921, 164927, 164933, 164939, 164945, - 164951, 164957, 164963, 164969, 164975, 164981, 164987, 164993, 164999, - 165005, 165011, 165017, 165023, 165029, 165035, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 165041, 165048, 165053, 165057, 165061, 165065, 165070, 165075, - 165080, 165085, 165090, 165095, 165102, 0, 0, 0, 165111, 165116, 165122, - 165128, 165134, 165139, 165145, 165151, 165157, 165162, 165168, 165174, - 165179, 165185, 165191, 165196, 165202, 165208, 165213, 165219, 165225, - 165230, 165236, 165242, 165248, 165254, 165260, 165271, 165278, 165284, - 165287, 165290, 165293, 165298, 165304, 165310, 165316, 165321, 165327, - 165333, 165339, 165344, 165350, 165356, 165361, 165367, 165373, 165378, - 165384, 165390, 165395, 165401, 165407, 165412, 165418, 165424, 165430, - 165436, 165442, 165445, 165448, 165451, 165454, 165457, 165460, 165467, - 165475, 165483, 165491, 165498, 165506, 165514, 165522, 165529, 165537, - 165545, 165552, 165560, 165568, 165575, 165583, 165591, 165598, 165606, - 165614, 165621, 165629, 165637, 165645, 165653, 165661, 165666, 165671, - 0, 0, 0, 165676, 165683, 165691, 165699, 165707, 165714, 165722, 165730, - 165738, 165745, 165753, 165761, 165768, 165776, 165784, 165791, 165799, - 165807, 165814, 165822, 165830, 165837, 165845, 165853, 165861, 165869, - 165877, 165887, 165892, 165896, 165900, 165905, 165910, 165913, 165916, - 165919, 165922, 165925, 165928, 165931, 165934, 165937, 165943, 165946, - 165950, 165955, 165959, 165964, 165969, 165975, 165981, 165987, 165992, - 166000, 166006, 166009, 166012, 166015, 166018, 166021, 166024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 166923, 166927, 166931, 166935, 0, 166939, 166943, + 166947, 166951, 166955, 166959, 166963, 166967, 166971, 166975, 166979, + 166983, 166987, 166991, 166995, 166999, 167003, 167007, 167011, 167015, + 167019, 167023, 167027, 167031, 167037, 167043, 167049, 0, 167055, + 167060, 0, 167065, 0, 0, 167070, 0, 167075, 167080, 167085, 167090, + 167095, 167100, 167105, 167110, 167115, 167120, 0, 167125, 167130, + 167135, 167140, 0, 167145, 0, 167150, 0, 0, 0, 0, 0, 0, 167155, 0, 0, 0, + 0, 167161, 0, 167167, 0, 167173, 0, 167179, 167185, 167191, 0, 167197, + 167203, 0, 167209, 0, 0, 167215, 0, 167221, 0, 167227, 0, 167233, 0, + 167241, 0, 167249, 167255, 0, 167261, 0, 0, 167267, 167273, 167279, + 167285, 0, 167291, 167297, 167303, 167309, 167315, 167321, 167327, 0, + 167333, 167339, 167345, 167351, 0, 167357, 167363, 167369, 167375, 0, + 167383, 0, 167391, 167397, 167403, 167409, 167415, 167421, 167427, + 167433, 167439, 167445, 0, 167451, 167457, 167463, 167469, 167475, + 167481, 167487, 167493, 167499, 167505, 167511, 167517, 167523, 167529, + 167535, 167541, 167547, 0, 0, 0, 0, 0, 167553, 167559, 167565, 0, 167571, + 167577, 167583, 167589, 167595, 0, 167601, 167607, 167613, 167619, + 167625, 167631, 167637, 167643, 167649, 167655, 167661, 167667, 167673, + 167679, 167685, 167691, 167697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 166027, 166034, 166042, 166050, 166058, 166065, 166073, - 166081, 166089, 166096, 166104, 166112, 166119, 166127, 166135, 166142, - 166150, 166158, 166165, 166173, 166181, 166188, 166196, 166204, 166212, - 166220, 166228, 166232, 166236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 166239, 166245, 166251, 166257, 166261, 166267, 166273, 166279, 166285, - 166291, 166297, 166303, 166309, 166315, 166321, 166327, 166333, 166339, - 166345, 166351, 166357, 166363, 166369, 166375, 166381, 166387, 166393, - 166399, 166405, 166411, 166417, 166423, 166429, 166435, 166441, 166447, - 166453, 166459, 166465, 166471, 166477, 166483, 166489, 166495, 0, 0, 0, - 0, 166501, 166512, 166523, 166534, 166545, 166556, 166567, 166578, - 166589, 0, 0, 0, 0, 0, 0, 0, 166600, 166605, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 166610, 166616, 166622, 166628, 166634, 166640, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 166646, 166648, 166650, 166654, 166659, 166664, 166666, 166672, 166677, - 166679, 166685, 166689, 166691, 166695, 166701, 166707, 166713, 166718, - 166723, 166730, 166737, 166744, 166749, 166756, 166763, 166770, 166774, - 166781, 166790, 166799, 166806, 166811, 166815, 166819, 166821, 166824, - 166827, 166834, 166841, 166851, 166856, 166861, 166866, 166871, 166873, - 166879, 166883, 166885, 166887, 166889, 166891, 166895, 166899, 166903, - 166905, 166909, 166911, 166915, 166917, 166919, 166921, 166923, 166928, - 166933, 166935, 166941, 166945, 166949, 166957, 166959, 166961, 166963, - 166965, 166967, 166969, 166971, 166973, 166975, 166977, 166981, 166985, - 166987, 166989, 166991, 166993, 166995, 167000, 167006, 167010, 167014, - 167018, 167022, 167027, 167031, 167033, 167035, 167039, 167045, 167047, - 167049, 167051, 167055, 167064, 167070, 167074, 167078, 167080, 167082, - 167085, 167087, 167089, 167091, 167095, 167097, 167101, 167106, 167108, - 167113, 167119, 167126, 167130, 167134, 167138, 167142, 167148, 167152, - 167160, 167167, 167169, 167171, 167175, 167179, 167181, 167185, 167189, - 167191, 167195, 167197, 167201, 167205, 167209, 167213, 167217, 167221, - 167225, 167229, 167235, 167239, 167243, 167254, 167259, 167263, 167267, - 167273, 167277, 167281, 167285, 167292, 167299, 167303, 167307, 167311, - 167315, 167319, 167326, 167328, 167332, 167334, 167336, 167340, 167344, - 167348, 167350, 167354, 167358, 167362, 167366, 167370, 167372, 167376, - 167378, 167384, 167387, 167392, 167394, 167396, 167399, 167401, 167403, - 167406, 167413, 167420, 167427, 167432, 167436, 167438, 167440, 167442, - 167446, 167448, 167452, 167456, 167460, 167462, 167466, 167468, 167472, - 167476, 167483, 167485, 167494, 167503, 167512, 167518, 167520, 167525, - 167529, 167533, 167535, 167541, 167545, 167547, 167551, 167555, 167557, - 167561, 167566, 167570, 167576, 167582, 167584, 167586, 167592, 167594, - 167598, 167602, 167604, 167608, 167610, 167614, 167618, 167622, 167625, - 167628, 167633, 167638, 167640, 167643, 167645, 167652, 167656, 167658, - 167665, 167672, 167679, 167686, 167693, 167695, 167697, 167699, 167703, - 167705, 167707, 167709, 167711, 167713, 167715, 167717, 167719, 167721, - 167723, 167725, 167727, 167729, 167731, 167733, 167735, 167737, 167739, - 167741, 167743, 167745, 167747, 167751, 167753, 167755, 167757, 167761, - 167763, 167767, 167769, 167771, 167775, 167779, 167785, 167787, 167789, - 167791, 167793, 167797, 167801, 167803, 167807, 167811, 167815, 167819, - 167823, 167827, 167831, 167835, 167839, 167843, 167847, 167851, 167855, - 167859, 167863, 167867, 167871, 167875, 167877, 167879, 167881, 167883, - 167885, 167887, 167889, 167897, 167905, 167913, 167921, 167926, 167931, - 167936, 167940, 167944, 167949, 167953, 167955, 167959, 167961, 167963, - 167965, 167967, 167969, 167971, 167973, 167977, 167979, 167981, 167983, - 167987, 167991, 167995, 167999, 168003, 168005, 168011, 168017, 168019, - 168021, 168023, 168025, 168027, 168036, 168043, 168050, 168054, 168061, - 168066, 168073, 168082, 168087, 168091, 168095, 168097, 168101, 168103, - 168107, 168111, 168113, 168117, 168121, 168125, 168127, 168129, 168135, - 168137, 168139, 168141, 168145, 168149, 168151, 168155, 168157, 168159, - 168162, 168166, 168168, 168172, 168174, 168176, 168181, 168183, 168187, - 168191, 168194, 168198, 168202, 168206, 168210, 168214, 168218, 168222, - 168227, 168231, 168235, 168244, 168249, 168252, 168254, 168257, 168260, - 168265, 168267, 168270, 168275, 168279, 168282, 168286, 168290, 168293, - 168298, 168302, 168306, 168310, 168314, 168320, 168326, 168332, 168338, - 168343, 168354, 168356, 168360, 168362, 168364, 168368, 168372, 168374, - 168378, 168383, 168388, 168394, 168396, 168400, 168404, 168411, 168418, - 168422, 168424, 168426, 168430, 168432, 168436, 168440, 168444, 168446, - 168448, 168455, 168459, 168462, 168466, 168470, 168474, 168476, 168480, - 168482, 168484, 168488, 168490, 168494, 168498, 168504, 168508, 168512, - 168516, 168518, 168521, 168525, 168532, 168541, 168550, 168558, 168566, - 168568, 168572, 168574, 168578, 168589, 168593, 168599, 168605, 168610, - 168612, 168617, 168621, 168623, 168625, 168627, 168631, 168635, 168639, - 168644, 168654, 168669, 168681, 168693, 168697, 168701, 168707, 168709, - 168717, 168725, 168727, 168731, 168737, 168743, 168750, 168757, 168759, - 168761, 168764, 168766, 168772, 168774, 168777, 168781, 168787, 168793, - 168804, 168810, 168817, 168825, 168829, 168837, 168845, 168851, 168857, - 168864, 168866, 168870, 168872, 168874, 168879, 168881, 168883, 168885, - 168887, 168891, 168901, 168907, 168911, 168915, 168919, 168925, 168931, - 168937, 168943, 168948, 168953, 168959, 168965, 168972, 168979, 168987, - 168995, 169000, 169008, 169012, 169021, 169030, 169036, 169040, 169044, - 169048, 169051, 169056, 169058, 169060, 169062, 169069, 169074, 169081, - 169088, 169095, 169103, 169111, 169119, 169127, 169135, 169143, 169151, - 169159, 169167, 169173, 169179, 169185, 169191, 169197, 169203, 169209, - 169215, 169221, 169227, 169233, 169239, 169242, 169251, 169260, 169262, - 169269, 169273, 169275, 169277, 169281, 169287, 169291, 169293, 169303, - 169309, 169313, 169315, 169319, 169321, 169325, 169332, 169339, 169346, - 169351, 169356, 169365, 169371, 169376, 169380, 169385, 169389, 169396, - 169400, 169403, 169408, 169415, 169422, 169427, 169432, 169437, 169443, - 169452, 169463, 169469, 169475, 169481, 169491, 169506, 169515, 169523, - 169531, 169539, 169547, 169555, 169563, 169571, 169579, 169587, 169595, - 169603, 169611, 169614, 169618, 169623, 169628, 169630, 169634, 169643, - 169652, 169660, 169664, 169668, 169673, 169678, 169683, 169685, 169690, - 169694, 169696, 169700, 169704, 169710, 169715, 169723, 169728, 169733, - 169738, 169745, 169748, 169750, 169753, 169758, 169764, 169768, 169772, - 169778, 169784, 169786, 169790, 169794, 169798, 169802, 169806, 169808, - 169810, 169812, 169814, 169820, 169826, 169830, 169832, 169834, 169836, - 169845, 169849, 169856, 169863, 169865, 169868, 169872, 169878, 169882, - 169886, 169888, 169896, 169900, 169904, 169909, 169914, 169919, 169924, - 169929, 169934, 169939, 169944, 169949, 169954, 169958, 169964, 169968, - 169974, 169979, 169986, 169992, 170000, 170004, 170011, 170015, 170019, - 170023, 170028, 170033, 170035, 170039, 170048, 170056, 170064, 170077, - 170090, 170103, 170110, 170117, 170121, 170130, 170138, 170142, 170151, - 170158, 170162, 170166, 170170, 170174, 170181, 170185, 170189, 170193, - 170197, 170204, 170213, 170222, 170229, 170241, 170253, 170257, 170261, - 170265, 170269, 170273, 170277, 170285, 170293, 170301, 170305, 170309, - 170313, 170317, 170321, 170325, 170331, 170337, 170341, 170352, 170360, - 170364, 170368, 170372, 170376, 170382, 170389, 170400, 170410, 170420, - 170431, 170440, 170451, 170457, 170463, 170469, 170475, 170481, 170485, - 170492, 170501, 170508, 170514, 170518, 170522, 170526, 170535, 170547, - 170551, 170558, 170565, 170572, 170580, 170587, 170595, 170603, 170612, - 170620, 170629, 170638, 170648, 170657, 170667, 170677, 170688, 170698, - 170709, 170716, 170724, 170731, 170739, 170747, 170756, 170764, 170773, - 170780, 170792, 170799, 170811, 170814, 170818, 170821, 170825, 170831, - 170838, 170844, 170851, 170856, 170862, 170873, 170883, 170894, 170899, - 170904, 170910, 170915, 170922, 170926, 170932, 170934, 170936, 170940, - 170944, 170948, 170957, 170959, 170961, 170964, 170966, 170968, 170972, - 170974, 170978, 170980, 170984, 170986, 170988, 170992, 170996, 171002, - 171004, 171008, 171010, 171014, 171018, 171022, 171026, 171028, 171030, - 171034, 171038, 171042, 171046, 171048, 171050, 171052, 171058, 171063, - 171066, 171074, 171082, 171084, 171089, 171092, 171097, 171108, 171115, - 171120, 171125, 171127, 171131, 171133, 171137, 171139, 171143, 171147, - 171150, 171153, 171155, 171158, 171160, 171164, 171166, 171168, 171170, - 171174, 171176, 171180, 171183, 171190, 171193, 171198, 171201, 171204, - 171209, 171213, 171217, 171221, 171223, 171228, 171231, 171235, 171237, - 171239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171243, 171248, 171250, 171254, - 171256, 171260, 171264, 171270, 171274, 171279, 171282, 171286, 171290, - 0, 0, 0, 171294, 171296, 171302, 171306, 171310, 171312, 171316, 171318, - 171320, 171324, 171326, 0, 0, 0, 0, 0, 171330, 171335, 171340, 171345, - 171350, 171355, 171360, 171367, 171374, 171381, 171388, 171393, 171398, - 171403, 171408, 171415, 171421, 171428, 171435, 171442, 171447, 171452, - 171457, 171462, 171467, 171474, 171481, 171486, 171491, 171498, 171505, - 171513, 171521, 171528, 171535, 171543, 171551, 171559, 171566, 171576, - 171587, 171592, 171599, 171606, 171613, 171621, 171629, 171640, 171648, - 171656, 171664, 171669, 171674, 171679, 171684, 171689, 171694, 171699, - 171704, 171709, 171714, 171719, 171724, 171731, 171736, 171741, 171748, - 171753, 171758, 171763, 171768, 171773, 171778, 171783, 171788, 171793, - 171798, 171803, 171808, 171815, 171823, 171828, 171833, 171840, 171845, - 171850, 171855, 171862, 171867, 171874, 171879, 171886, 171891, 171900, - 171909, 171914, 171919, 171924, 171929, 171934, 171939, 171944, 171949, - 171954, 171959, 171964, 171969, 171974, 171982, 171990, 171995, 172000, - 172005, 172010, 172015, 172021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 172027, 172035, 172043, 172051, 172059, 172065, 172071, 172075, 172079, - 172085, 172091, 172100, 172104, 172109, 172115, 172119, 172124, 172128, - 172132, 172138, 172144, 172154, 172163, 172166, 172171, 172177, 172183, - 172194, 172204, 172208, 172213, 172219, 172225, 172234, 172239, 172243, - 172248, 172252, 172258, 172264, 172270, 172274, 172277, 172281, 172284, - 172287, 172292, 172297, 172304, 172312, 172319, 172326, 172335, 172344, - 172351, 172359, 172366, 172373, 172382, 172391, 172398, 172406, 172413, - 172420, 172429, 172436, 172444, 172450, 172459, 172467, 172476, 172483, - 172493, 172504, 172512, 172520, 172529, 172537, 172545, 172554, 172562, - 172572, 172581, 172589, 172597, 172606, 172609, 172614, 172617, 0, 0, 0, - 0, 0, 0, 0, 172622, 172628, 172634, 172640, 172646, 172652, 172658, - 172664, 172670, 172676, 172682, 172688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 172694, 172702, 172711, 172719, 172728, - 172737, 172747, 172756, 172766, 172775, 172785, 172794, 0, 0, 0, 0, - 172804, 172812, 172821, 172829, 172838, 172845, 172853, 172860, 172868, - 172876, 172885, 172893, 172902, 172912, 172923, 172933, 172944, 172953, - 172963, 172972, 172982, 172991, 173001, 173010, 173020, 173028, 173037, - 173045, 173054, 173062, 173071, 173079, 173088, 173098, 173109, 173119, - 173130, 173134, 173139, 173143, 173148, 173151, 173155, 173158, 173162, - 173166, 173171, 173175, 173180, 173185, 173191, 173196, 173202, 173205, - 173209, 173212, 0, 0, 0, 0, 0, 0, 0, 0, 173216, 173219, 173223, 173226, - 173230, 173235, 173240, 173246, 173252, 173256, 0, 0, 0, 0, 0, 0, 173260, - 173266, 173273, 173279, 173286, 173294, 173302, 173311, 173320, 173325, - 173331, 173336, 173342, 173349, 173356, 173364, 173372, 173379, 173387, - 173394, 173402, 173411, 173420, 173430, 173440, 173446, 173453, 173459, - 173466, 173474, 173482, 173491, 173500, 173508, 173517, 173525, 173534, - 173544, 173554, 173565, 0, 0, 0, 0, 0, 0, 0, 0, 173576, 173581, 173587, - 173592, 173598, 173607, 173617, 173626, 173636, 173643, 173651, 173658, - 173666, 173673, 173682, 173691, 173700, 173705, 173712, 173719, 173726, - 173731, 173736, 173741, 173746, 173753, 173760, 173767, 173774, 173781, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167703, 167713, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 167721, 167728, 167735, 167742, 167748, + 167755, 167762, 167768, 167775, 167782, 167789, 167797, 167805, 167813, + 167821, 167829, 167837, 167844, 167851, 167858, 167866, 167874, 167882, + 167890, 167898, 167906, 167913, 167920, 167927, 167935, 167943, 167951, + 167959, 167967, 167975, 167980, 167985, 167990, 167995, 168000, 168005, + 168010, 168015, 168020, 0, 0, 0, 0, 168025, 168032, 168037, 168042, + 168047, 168052, 168057, 168062, 168067, 168072, 168077, 168082, 168087, + 168092, 168097, 168102, 168107, 168112, 168117, 168122, 168127, 168132, + 168137, 168142, 168147, 168152, 168157, 168162, 168167, 168172, 168177, + 168182, 168187, 168192, 168197, 168202, 168207, 168212, 168217, 168222, + 168227, 168232, 168237, 168242, 168247, 168252, 168257, 168262, 168267, + 168272, 168277, 168283, 168288, 168293, 168298, 168303, 168308, 168313, + 168318, 168323, 168328, 168333, 168338, 168343, 168348, 168353, 168358, + 168363, 168368, 168373, 168378, 168383, 168388, 168393, 168398, 168403, + 168408, 168413, 168418, 168423, 168428, 168433, 168438, 168443, 168448, + 168453, 168458, 168463, 168468, 168473, 168478, 168483, 168488, 168493, + 168498, 168503, 168508, 168513, 168518, 168523, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 168528, 168534, 168543, 168551, 168559, 168568, 168577, + 168586, 168595, 168604, 168613, 168622, 168631, 168640, 168649, 0, 0, + 168658, 168667, 168675, 168683, 168692, 168701, 168710, 168719, 168728, + 168737, 168746, 168755, 168764, 168773, 168782, 0, 168790, 168799, + 168807, 168815, 168824, 168833, 168842, 168851, 168860, 168869, 168878, + 168887, 168896, 168905, 168914, 0, 168921, 168930, 168938, 168946, + 168955, 168964, 168973, 168982, 168991, 169000, 169009, 169018, 169027, + 169036, 169045, 169052, 169058, 169064, 169070, 169076, 169082, 169088, + 169094, 169100, 169106, 169112, 169118, 169124, 169130, 169136, 169142, + 169148, 169154, 169160, 169166, 169172, 169178, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 169184, 169191, 169196, 169200, 169204, 169208, 169213, 169218, + 169223, 169228, 169233, 169238, 169245, 169254, 169260, 169264, 169273, + 169278, 169284, 169290, 169296, 169301, 169307, 169313, 169319, 169324, + 169330, 169336, 169341, 169347, 169353, 169358, 169364, 169370, 169375, + 169381, 169387, 169392, 169398, 169404, 169410, 169416, 169422, 169433, + 169440, 169446, 169449, 169452, 169455, 169460, 169466, 169472, 169478, + 169483, 169489, 169495, 169501, 169506, 169512, 169518, 169523, 169529, + 169535, 169540, 169546, 169552, 169557, 169563, 169569, 169574, 169580, + 169586, 169592, 169598, 169604, 169607, 169610, 169613, 169616, 169619, + 169622, 169629, 169637, 169645, 169653, 169660, 169668, 169676, 169684, + 169691, 169699, 169707, 169714, 169722, 169730, 169737, 169745, 169753, + 169760, 169768, 169776, 169783, 169791, 169799, 169807, 169815, 169823, + 169828, 169833, 169838, 169841, 169849, 169854, 169861, 169869, 169877, + 169885, 169892, 169900, 169908, 169916, 169923, 169931, 169939, 169946, + 169954, 169962, 169969, 169977, 169985, 169992, 170000, 170008, 170015, + 170023, 170031, 170039, 170047, 170055, 170065, 170070, 170074, 170078, + 170083, 170088, 170091, 170094, 170097, 170100, 170103, 170106, 170109, + 170112, 170115, 170121, 170124, 170128, 170133, 170137, 170142, 170147, + 170153, 170159, 170165, 170170, 170178, 170184, 170187, 170190, 170193, + 170196, 170199, 170202, 170205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170210, 170217, + 170225, 170233, 170241, 170248, 170256, 170264, 170272, 170279, 170287, + 170295, 170302, 170310, 170318, 170325, 170333, 170341, 170348, 170356, + 170364, 170371, 170379, 170387, 170395, 170403, 170411, 170416, 170420, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170423, 170429, 170435, 170441, + 170445, 170451, 170457, 170463, 170469, 170475, 170481, 170487, 170493, + 170499, 170505, 170511, 170517, 170523, 170529, 170535, 170541, 170547, + 170553, 170559, 170565, 170571, 170577, 170583, 170589, 170595, 170601, + 170607, 170613, 170619, 170625, 170631, 170637, 170643, 170649, 170655, + 170661, 170667, 170673, 170679, 0, 0, 0, 0, 170685, 170696, 170707, + 170718, 170729, 170740, 170751, 170762, 170773, 0, 0, 0, 0, 0, 0, 0, + 170784, 170789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170794, 170800, + 170806, 170812, 170818, 170824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173790, 173800, 173809, 173814, 173823, - 173831, 173839, 173846, 173850, 173855, 173862, 173871, 0, 173882, - 173885, 173889, 173893, 173897, 173901, 173906, 173910, 173914, 173919, - 173923, 173927, 173933, 173939, 173946, 173950, 173954, 173956, 173966, - 173975, 173982, 173986, 173990, 174000, 174004, 174008, 174012, 174016, - 174024, 174033, 174046, 174057, 174068, 174084, 174092, 174101, 174105, - 174107, 174112, 174114, 174116, 174122, 174126, 174128, 174134, 174136, - 174138, 174142, 174144, 174148, 174150, 174154, 174158, 174163, 174167, - 174171, 174173, 174177, 174179, 174185, 174191, 174197, 174201, 174207, - 174211, 174218, 174220, 174224, 174226, 174228, 174230, 174232, 174234, - 174236, 174240, 174244, 174251, 174255, 174257, 174262, 174264, 174266, - 174268, 174270, 174274, 174278, 174280, 174285, 174290, 174292, 174294, - 174296, 174298, 174303, 174305, 174309, 174313, 174315, 174319, 174321, - 174334, 0, 174338, 174350, 174362, 174366, 0, 0, 0, 174370, 174377, - 174379, 174383, 174385, 174389, 174393, 174395, 174399, 174401, 174403, - 174407, 174409, 174411, 174413, 174415, 174417, 174421, 174423, 174425, - 174427, 174429, 174431, 174433, 174435, 174439, 174443, 174445, 174447, - 174449, 174451, 174453, 174455, 174457, 174459, 174461, 174463, 174465, - 174467, 174469, 174471, 0, 0, 174473, 174475, 174477, 174479, 174481, - 174483, 0, 0, 0, 174485, 174489, 174493, 174501, 174509, 174515, 174522, - 174524, 174526, 174528, 174530, 174532, 174534, 174538, 174545, 174549, - 174553, 174557, 174561, 174565, 174567, 174571, 174575, 174577, 174579, - 174581, 174583, 174585, 174589, 0, 0, 174593, 174597, 174601, 174605, - 174610, 174612, 174614, 174618, 174622, 174627, 174635, 174639, 174647, - 174649, 174651, 174653, 174655, 174657, 174659, 174661, 174663, 174667, - 174671, 174673, 174675, 174677, 174679, 174685, 174687, 174693, 174697, - 174701, 174706, 174708, 174710, 174714, 174716, 174718, 174720, 174722, - 174726, 174731, 174736, 174740, 174744, 174746, 174748, 174753, 174758, - 174760, 174762, 174766, 174772, 174778, 174784, 174790, 174796, 174802, - 174813, 174824, 174836, 174847, 174858, 174869, 174880, 174891, 174902, - 174913, 174924, 174935, 174946, 174957, 174968, 174980, 174992, 175004, - 175016, 175028, 175040, 175054, 175068, 175083, 175089, 175095, 175101, - 175107, 175113, 175119, 175125, 175131, 175137, 175143, 175149, 175155, - 175162, 175169, 175176, 175183, 175190, 175197, 175211, 175225, 175240, - 175254, 175268, 175282, 175296, 175310, 175324, 175338, 175352, 175366, - 175380, 175394, 175408, 175423, 175438, 175453, 175468, 175483, 175498, - 175512, 175526, 175541, 175546, 175551, 175557, 175568, 175579, 175591, - 175596, 175601, 175606, 175611, 175616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 175621, 175627, 175633, 175639, 175645, 175651, 175657, 175663, - 175668, 175673, 175678, 175683, 175688, 175693, 0, 0, 175698, 175702, - 175706, 175708, 0, 0, 0, 0, 175710, 175715, 175719, 0, 0, 0, 0, 0, - 175721, 175723, 175725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175727, - 175731, 175733, 175735, 175737, 175741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 175743, 175747, 175751, 175755, 175759, 175763, 175767, 175771, 175775, - 175779, 175783, 175787, 175791, 175795, 175799, 175803, 175807, 175811, - 175815, 175819, 175823, 175827, 175831, 175835, 175839, 175843, 175847, - 175851, 175855, 175859, 175863, 175867, 175871, 175875, 175879, 175883, - 175887, 175891, 175895, 175899, 175903, 175907, 175911, 175915, 175919, - 175923, 175927, 175931, 175935, 175939, 175943, 175947, 175951, 175955, - 175959, 175963, 175967, 175971, 175975, 175979, 175983, 175987, 175991, - 175995, 175999, 176003, 176007, 176011, 176015, 176019, 176023, 176027, - 176031, 176035, 176039, 176043, 176047, 176051, 176055, 176059, 176063, - 176067, 176071, 176075, 176079, 176083, 176087, 176091, 176095, 176099, - 176103, 176107, 176111, 176115, 176119, 176123, 176127, 176131, 176135, - 176139, 176143, 176147, 176151, 176155, 176159, 176163, 176167, 176171, - 176175, 176179, 176183, 176187, 176191, 176195, 176199, 176203, 176207, - 176211, 176215, 176219, 176223, 176227, 176231, 176235, 176239, 176243, - 176247, 176251, 176255, 176259, 176263, 176267, 176271, 176275, 176279, - 176283, 176287, 176291, 176295, 176299, 176303, 176307, 176311, 176315, - 176319, 176323, 176327, 176331, 176335, 176339, 176343, 176347, 176351, - 176355, 176359, 176363, 176367, 176371, 176375, 176379, 176383, 176387, - 176391, 176395, 176399, 176403, 176407, 176411, 176415, 176419, 176423, - 176427, 176431, 176435, 176439, 176443, 176447, 176451, 176455, 176459, - 176463, 176467, 176471, 176475, 176479, 176483, 176487, 176491, 176495, - 176499, 176503, 176507, 176511, 176515, 176519, 176523, 176527, 176531, - 176535, 176539, 176543, 176547, 176551, 176555, 176559, 176563, 176567, - 176571, 176575, 176579, 176583, 176587, 176591, 176595, 176599, 176603, - 176607, 176611, 176615, 176619, 176623, 176627, 176631, 176635, 176639, - 176643, 176647, 176651, 176655, 176659, 176663, 176667, 176671, 176675, - 176679, 176683, 176687, 176691, 176695, 176699, 176703, 176707, 176711, - 176715, 176719, 176723, 176727, 176731, 176735, 176739, 176743, 176747, - 176751, 176755, 176759, 176763, 176767, 176771, 176775, 176779, 176783, - 176787, 176791, 176795, 176799, 176803, 176807, 176811, 176815, 176819, - 176823, 176827, 176831, 176835, 176839, 176843, 176847, 176851, 176855, - 176859, 176863, 176867, 176871, 176875, 176879, 176883, 176887, 176891, - 176895, 176899, 176903, 176907, 176911, 176915, 176919, 176923, 176927, - 176931, 176935, 176939, 176943, 176947, 176951, 176955, 176959, 176963, - 176967, 176971, 176975, 176979, 176983, 176987, 176991, 176995, 176999, - 177003, 177007, 177011, 177015, 177019, 177023, 177027, 177031, 177035, - 177039, 177043, 177047, 177051, 177055, 177059, 177063, 177067, 177071, - 177075, 177079, 177083, 177087, 177091, 177095, 177099, 177103, 177107, - 177111, 177115, 177119, 177123, 177127, 177131, 177135, 177139, 177143, - 177147, 177151, 177155, 177159, 177163, 177167, 177171, 177175, 177179, - 177183, 177187, 177191, 177195, 177199, 177203, 177207, 177211, 177215, - 177219, 177223, 177227, 177231, 177235, 177239, 177243, 177247, 177251, - 177255, 177259, 177263, 177267, 177271, 177275, 177279, 177283, 177287, - 177291, 177295, 177299, 177303, 177307, 177311, 177315, 177319, 177323, - 177327, 177331, 177335, 177339, 177343, 177347, 177351, 177355, 177359, - 177363, 177367, 177371, 177375, 177379, 177383, 177387, 177391, 177395, - 177399, 177403, 177407, 177411, 177415, 177419, 177423, 177427, 177431, - 177435, 177439, 177443, 177447, 177451, 177455, 177459, 177463, 177467, - 177471, 177475, 177479, 177483, 177487, 177491, 177495, 177499, 177503, - 177507, 177511, 177515, 177519, 177523, 177527, 177531, 177535, 177539, - 177543, 177547, 177551, 177555, 177559, 177563, 177567, 177571, 177575, - 177579, 177583, 177587, 177591, 177595, 177599, 177603, 177607, 177611, - 177615, 177619, 177623, 177627, 177631, 177635, 177639, 177643, 177647, - 177651, 177655, 177659, 177663, 177667, 177671, 177675, 177679, 177683, - 177687, 177691, 177695, 177699, 177703, 177707, 177711, 177715, 177719, - 177723, 177727, 177731, 177735, 177739, 177743, 177747, 177751, 177755, - 177759, 177763, 177767, 177771, 177775, 177779, 177783, 177787, 177791, - 177795, 177799, 177803, 177807, 177811, 177815, 177819, 177823, 177827, - 177831, 177835, 177839, 177843, 177847, 177851, 177855, 177859, 177863, - 177867, 177871, 177875, 177879, 177883, 177887, 177891, 177895, 177899, - 177903, 177907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170830, + 170832, 170834, 170838, 170843, 170848, 170850, 170856, 170861, 170863, + 170869, 170873, 170875, 170879, 170885, 170891, 170897, 170902, 170907, + 170914, 170921, 170928, 170933, 170940, 170947, 170954, 170958, 170965, + 170974, 170983, 170990, 170995, 170999, 171003, 171005, 171008, 171011, + 171018, 171025, 171035, 171040, 171045, 171050, 171055, 171057, 171063, + 171067, 171069, 171071, 171073, 171075, 171079, 171083, 171087, 171089, + 171093, 171095, 171099, 171101, 171103, 171105, 171107, 171112, 171117, + 171119, 171125, 171129, 171133, 171141, 171143, 171145, 171147, 171149, + 171151, 171153, 171155, 171157, 171159, 171161, 171165, 171169, 171171, + 171173, 171175, 171177, 171179, 171184, 171190, 171194, 171198, 171202, + 171206, 171211, 171215, 171217, 171219, 171223, 171229, 171231, 171233, + 171235, 171239, 171248, 171254, 171258, 171262, 171264, 171266, 171269, + 171271, 171273, 171275, 171279, 171281, 171285, 171290, 171292, 171297, + 171303, 171310, 171314, 171318, 171322, 171326, 171332, 171336, 171344, + 171351, 171353, 171355, 171359, 171363, 171365, 171369, 171373, 171375, + 171379, 171381, 171385, 171389, 171393, 171397, 171401, 171405, 171409, + 171413, 171419, 171423, 171427, 171438, 171443, 171447, 171451, 171457, + 171461, 171465, 171469, 171476, 171483, 171487, 171491, 171495, 171499, + 171503, 171510, 171512, 171516, 171518, 171520, 171524, 171528, 171532, + 171534, 171538, 171542, 171546, 171550, 171554, 171556, 171560, 171562, + 171568, 171571, 171576, 171578, 171580, 171583, 171585, 171587, 171590, + 171597, 171604, 171611, 171616, 171620, 171622, 171624, 171626, 171630, + 171632, 171636, 171640, 171644, 171646, 171650, 171652, 171656, 171660, + 171667, 171669, 171678, 171687, 171696, 171702, 171704, 171709, 171713, + 171717, 171719, 171725, 171729, 171731, 171735, 171739, 171741, 171745, + 171750, 171754, 171760, 171766, 171768, 171770, 171776, 171778, 171782, + 171786, 171788, 171792, 171794, 171798, 171802, 171806, 171809, 171812, + 171817, 171822, 171824, 171827, 171829, 171836, 171840, 171842, 171849, + 171856, 171863, 171870, 171877, 171879, 171881, 171883, 171887, 171889, + 171891, 171893, 171895, 171897, 171899, 171901, 171903, 171905, 171907, + 171909, 171911, 171913, 171915, 171917, 171919, 171921, 171923, 171925, + 171927, 171929, 171931, 171935, 171937, 171939, 171941, 171945, 171947, + 171951, 171953, 171955, 171959, 171963, 171969, 171971, 171973, 171975, + 171977, 171981, 171985, 171987, 171991, 171995, 171999, 172003, 172007, + 172011, 172015, 172019, 172023, 172027, 172031, 172035, 172039, 172043, + 172047, 172051, 172055, 172059, 172061, 172063, 172065, 172067, 172069, + 172071, 172073, 172081, 172089, 172097, 172105, 172110, 172115, 172120, + 172124, 172128, 172133, 172138, 172140, 172144, 172146, 172148, 172150, + 172152, 172154, 172156, 172158, 172162, 172164, 172166, 172168, 172172, + 172176, 172180, 172184, 172188, 172190, 172196, 172202, 172204, 172206, + 172208, 172210, 172212, 172221, 172228, 172235, 172239, 172246, 172251, + 172258, 172267, 172272, 172276, 172280, 172282, 172286, 172288, 172292, + 172296, 172298, 172302, 172306, 172310, 172312, 172314, 172320, 172322, + 172324, 172326, 172330, 172334, 172336, 172340, 172342, 172344, 172347, + 172351, 172353, 172357, 172359, 172361, 172366, 172368, 172372, 172376, + 172379, 172383, 172387, 172391, 172395, 172399, 172403, 172407, 172412, + 172416, 172420, 172429, 172434, 172437, 172439, 172442, 172445, 172450, + 172452, 172455, 172460, 172464, 172467, 172471, 172475, 172478, 172483, + 172487, 172491, 172495, 172499, 172505, 172511, 172517, 172523, 172528, + 172539, 172541, 172545, 172547, 172549, 172553, 172557, 172559, 172563, + 172569, 172574, 172580, 172582, 172586, 172590, 172597, 172604, 172608, + 172610, 172612, 172616, 172618, 172622, 172626, 172630, 172632, 172634, + 172641, 172645, 172649, 172653, 172657, 172661, 172663, 172667, 172669, + 172671, 172675, 172677, 172681, 172685, 172691, 172695, 172699, 172703, + 172705, 172708, 172712, 172719, 172728, 172737, 172746, 172755, 172757, + 172761, 172763, 172767, 172778, 172782, 172788, 172794, 172799, 172801, + 172806, 172810, 172812, 172814, 172816, 172820, 172824, 172828, 172833, + 172844, 172860, 172873, 172886, 172890, 172894, 172900, 172902, 172910, + 172918, 172920, 172924, 172930, 172936, 172943, 172950, 172952, 172954, + 172958, 172960, 172966, 172968, 172971, 172975, 172981, 172987, 172998, + 173004, 173011, 173019, 173023, 173031, 173039, 173045, 173051, 173058, + 173060, 173064, 173066, 173068, 173073, 173075, 173077, 173079, 173081, + 173085, 173095, 173101, 173105, 173109, 173113, 173119, 173125, 173131, + 173137, 173142, 173147, 173153, 173159, 173166, 173173, 173180, 173187, + 173192, 173200, 173204, 173213, 173222, 173228, 173232, 173236, 173240, + 173243, 173248, 173250, 173252, 173254, 173261, 173266, 173273, 173280, + 173287, 173295, 173303, 173311, 173319, 173327, 173335, 173343, 173351, + 173359, 173365, 173371, 173377, 173383, 173389, 173395, 173401, 173407, + 173413, 173419, 173425, 173431, 173434, 173443, 173452, 173454, 173461, + 173465, 173467, 173469, 173473, 173479, 173483, 173485, 173495, 173501, + 173505, 173507, 173511, 173513, 173517, 173524, 173531, 173538, 173543, + 173548, 173557, 173563, 173568, 173572, 173577, 173581, 173588, 173592, + 173595, 173599, 173605, 173611, 173615, 173619, 173624, 173630, 173639, + 173650, 173656, 173662, 173668, 173678, 173693, 173702, 173710, 173718, + 173726, 173734, 173742, 173750, 173758, 173766, 173774, 173782, 173790, + 173798, 173801, 173805, 173810, 173815, 173817, 173821, 173830, 173839, + 173847, 173851, 173855, 173860, 173865, 173870, 173872, 173877, 173881, + 173883, 173887, 173891, 173897, 173902, 173910, 173915, 173920, 173925, + 173932, 173935, 173937, 173941, 173946, 173952, 173956, 173960, 173966, + 173972, 173974, 173978, 173982, 173986, 173990, 173994, 173996, 173998, + 174000, 174002, 174008, 174014, 174018, 174020, 174022, 174024, 174033, + 174037, 174044, 174051, 174053, 174056, 174060, 174066, 174070, 174074, + 174076, 174084, 174088, 174092, 174097, 174102, 174107, 174112, 174117, + 174122, 174127, 174132, 174137, 174142, 174146, 174152, 174156, 174162, + 174167, 174174, 174180, 174188, 174192, 174199, 174203, 174207, 174211, + 174216, 174221, 174223, 174227, 174236, 174244, 174253, 174267, 174281, + 174295, 174302, 174309, 174313, 174322, 174330, 174334, 174343, 174350, + 174354, 174358, 174362, 174366, 174373, 174377, 174381, 174385, 174389, + 174396, 174405, 174414, 174421, 174433, 174445, 174449, 174453, 174457, + 174461, 174465, 174469, 174477, 174485, 174494, 174498, 174502, 174506, + 174510, 174514, 174518, 174524, 174531, 174535, 174547, 174555, 174559, + 174563, 174567, 174571, 174577, 174584, 174595, 174605, 174616, 174627, + 174636, 174647, 174653, 174659, 174665, 174671, 174677, 174681, 174688, + 174697, 174704, 174710, 174714, 174718, 174722, 174731, 174743, 174747, + 174754, 174761, 174768, 174776, 174783, 174791, 174799, 174808, 174816, + 174825, 174834, 174844, 174853, 174863, 174873, 174884, 174894, 174905, + 174912, 174920, 174927, 174935, 174943, 174952, 174960, 174969, 174976, + 174988, 174995, 175007, 175010, 175014, 175017, 175021, 175027, 175034, + 175041, 175049, 175054, 175060, 175071, 175081, 175092, 175097, 175102, + 175108, 175113, 175120, 175124, 175130, 175132, 175134, 175138, 175142, + 175146, 175155, 175157, 175159, 175162, 175164, 175166, 175170, 175172, + 175176, 175178, 175182, 175184, 175186, 175190, 175194, 175200, 175202, + 175206, 175208, 175212, 175216, 175220, 175224, 175226, 175228, 175232, + 175236, 175240, 175244, 175246, 175248, 175250, 175256, 175261, 175264, + 175272, 175280, 175282, 175287, 175290, 175295, 175306, 175313, 175318, + 175323, 175325, 175329, 175331, 175335, 175337, 175341, 175345, 175348, + 175351, 175353, 175356, 175358, 175362, 175364, 175366, 175368, 175372, + 175374, 175378, 175381, 175388, 175391, 175396, 175399, 175402, 175407, + 175411, 175415, 175419, 175421, 175426, 175429, 175433, 175435, 175437, + 175441, 175443, 0, 0, 0, 0, 0, 0, 0, 0, 175445, 175450, 175452, 175456, + 175458, 175462, 175466, 175472, 175476, 175481, 175484, 175488, 175492, + 0, 0, 0, 175496, 175498, 175504, 175508, 175512, 175514, 175518, 175520, + 175522, 175526, 175528, 175532, 175536, 0, 0, 0, 175540, 175545, 175550, + 175555, 175560, 175565, 175570, 175577, 175584, 175591, 175598, 175603, + 175608, 175613, 175618, 175625, 175631, 175638, 175645, 175652, 175657, + 175662, 175667, 175672, 175677, 175684, 175691, 175696, 175701, 175708, + 175715, 175723, 175731, 175738, 175745, 175753, 175761, 175769, 175776, + 175786, 175797, 175802, 175809, 175816, 175823, 175831, 175839, 175850, + 175858, 175866, 175874, 175879, 175884, 175889, 175894, 175899, 175904, + 175909, 175914, 175919, 175924, 175929, 175934, 175941, 175946, 175951, + 175958, 175963, 175968, 175973, 175978, 175983, 175988, 175993, 175998, + 176003, 176008, 176013, 176018, 176025, 176033, 176038, 176043, 176050, + 176055, 176060, 176065, 176072, 176077, 176084, 176089, 176096, 176101, + 176110, 176119, 176124, 176129, 176134, 176139, 176144, 176149, 176154, + 176159, 176164, 176169, 176174, 176179, 176184, 176192, 176200, 176205, + 176210, 176215, 176220, 176225, 176231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176237, 176245, 176253, 176261, 176269, 176275, 176281, 176285, + 176289, 176295, 176301, 176310, 176314, 176319, 176325, 176329, 176334, + 176338, 176342, 176348, 176354, 176364, 176373, 176376, 176381, 176387, + 176393, 176404, 176414, 176418, 176423, 176429, 176435, 176444, 176449, + 176453, 176458, 176462, 176468, 176474, 176480, 176484, 176487, 176491, + 176494, 176497, 176502, 176507, 176514, 176522, 176529, 176536, 176545, + 176554, 176561, 176569, 176576, 176583, 176592, 176601, 176608, 176616, + 176623, 176630, 176639, 176646, 176654, 176660, 176669, 176677, 176686, + 176693, 176703, 176714, 176722, 176730, 176739, 176747, 176755, 176764, + 176772, 176782, 176791, 176799, 176807, 176816, 176819, 176824, 176827, + 0, 0, 0, 0, 0, 0, 0, 176832, 176838, 176844, 176850, 176856, 176862, + 176868, 176874, 176880, 176886, 176892, 176898, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176904, 176912, 176921, 176929, + 176938, 176947, 176957, 176966, 176976, 176985, 176995, 177004, 0, 0, 0, + 0, 177014, 177022, 177031, 177039, 177048, 177055, 177063, 177070, + 177078, 177086, 177095, 177103, 177112, 177122, 177133, 177143, 177154, + 177163, 177173, 177182, 177192, 177201, 177211, 177220, 177230, 177238, + 177247, 177255, 177264, 177272, 177281, 177289, 177298, 177308, 177319, + 177329, 177340, 177344, 177349, 177353, 177358, 177361, 177365, 177368, + 177372, 177376, 177381, 177385, 177390, 177395, 177401, 177406, 177412, + 177415, 177419, 177422, 0, 0, 0, 0, 0, 0, 0, 0, 177426, 177429, 177433, + 177436, 177440, 177445, 177450, 177456, 177462, 177466, 0, 0, 0, 0, 0, 0, + 177470, 177476, 177483, 177489, 177496, 177504, 177512, 177521, 177530, + 177535, 177541, 177546, 177552, 177559, 177566, 177574, 177582, 177589, + 177597, 177604, 177612, 177621, 177630, 177640, 177650, 177656, 177663, + 177669, 177676, 177684, 177692, 177701, 177710, 177718, 177727, 177735, + 177744, 177754, 177764, 177775, 0, 0, 0, 0, 0, 0, 0, 0, 177786, 177791, + 177797, 177802, 177808, 177817, 177827, 177836, 177846, 177853, 177861, + 177868, 177876, 177883, 177892, 177901, 177910, 177915, 177922, 177929, + 177936, 177941, 177946, 177951, 177956, 177963, 177970, 177977, 177984, + 177991, 0, 0, 178000, 178010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178022, 178032, 178041, + 178046, 178055, 178063, 178071, 178078, 178082, 178087, 178094, 178103, + 178114, 178118, 178121, 178125, 178129, 178133, 178137, 178142, 178146, + 178150, 178155, 178159, 178163, 178169, 178175, 178182, 178186, 178190, + 178192, 178202, 178211, 178218, 178222, 178226, 178236, 178240, 178244, + 178248, 178252, 178260, 178269, 178282, 178293, 178304, 178320, 178329, + 178338, 178342, 178344, 178349, 178351, 178353, 178359, 178363, 178365, + 178371, 178373, 178375, 178379, 178381, 178385, 178387, 178391, 178395, + 178400, 178404, 178408, 178410, 178414, 178416, 178422, 178428, 178434, + 178438, 178444, 178448, 178455, 178457, 178461, 178463, 178465, 178467, + 178469, 178471, 178473, 178477, 178481, 178488, 178492, 178494, 178499, + 178501, 178503, 178505, 178507, 178511, 178515, 178517, 178522, 178527, + 178529, 178531, 178533, 178535, 178540, 178542, 178546, 178550, 178552, + 178556, 178558, 178571, 178575, 178582, 178594, 178606, 178610, 178614, + 178616, 0, 178620, 178627, 178629, 178633, 178635, 178639, 178643, + 178645, 178649, 178651, 178653, 178657, 178659, 178661, 178663, 178665, + 178667, 178671, 178673, 178675, 178677, 178679, 178681, 178683, 178685, + 178689, 178693, 178695, 178697, 178699, 178701, 178703, 178705, 178707, + 178709, 178711, 178713, 178715, 178717, 178719, 178721, 178723, 178725, + 178727, 178729, 178731, 178733, 178735, 178737, 178739, 178741, 178743, + 178745, 178749, 178753, 178761, 178769, 178775, 178782, 178784, 178786, + 178788, 178790, 178792, 178794, 178798, 178805, 178809, 178813, 178817, + 178821, 178825, 178827, 178831, 178835, 178837, 178839, 178841, 178843, + 178845, 178849, 178853, 0, 178857, 178861, 178865, 178869, 178874, + 178876, 178878, 178882, 178886, 178891, 178899, 178903, 178911, 178913, + 178915, 178917, 178919, 178921, 178923, 178925, 178927, 178931, 178935, + 178937, 178939, 178941, 178943, 178949, 178951, 178957, 178961, 178965, + 178970, 178972, 178974, 178978, 178980, 178982, 178984, 178986, 178990, + 178995, 179000, 179004, 179008, 179010, 179012, 179017, 179022, 179024, + 179026, 179030, 179036, 179042, 179048, 179054, 179060, 179066, 179077, + 179088, 179100, 179111, 179122, 179133, 179144, 179155, 179166, 179177, + 179188, 179199, 179210, 179221, 179232, 179244, 179256, 179268, 179280, + 179292, 179304, 179318, 179332, 179347, 179353, 179359, 179365, 179371, + 179377, 179383, 179389, 179395, 179401, 179407, 179413, 179419, 179426, + 179433, 179440, 179447, 179454, 179461, 179475, 179489, 179504, 179518, + 179532, 179546, 179560, 179574, 179588, 179602, 179616, 179630, 179644, + 179658, 179672, 179687, 179702, 179717, 179732, 179747, 179762, 179776, + 179790, 179805, 179810, 179815, 179821, 179832, 179843, 179855, 179860, + 179865, 179870, 179875, 179880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 179885, 179891, 179897, 179903, 179909, 179915, 179921, 179927, 179932, + 179937, 179942, 179947, 179952, 179957, 0, 0, 179962, 179966, 179970, + 179972, 179974, 0, 0, 0, 179978, 179983, 179987, 0, 0, 0, 0, 0, 179989, + 179991, 179993, 179995, 179997, 180001, 180003, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180007, 180011, 180013, 180015, 180017, 180021, 180023, 180027, + 180029, 180032, 180034, 180038, 180040, 180042, 180043, 180045, 180047, + 180049, 180053, 180055, 180057, 180061, 180063, 180065, 180067, 0, 0, 0, + 0, 0, 0, 0, 180069, 180071, 180073, 180075, 180077, 180081, 180083, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180085, 180089, 180091, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180095, 180097, 180101, 180103, 180105, 180107, 180109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 177911, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177915, 177918, 177922, - 177926, 177929, 177933, 177937, 177940, 177943, 177947, 177951, 177954, - 177957, 177960, 177963, 177968, 177971, 177975, 177978, 177981, 177984, - 177987, 177990, 177993, 177996, 177999, 178002, 178005, 178008, 178012, - 178016, 178020, 178024, 178029, 178034, 178040, 178046, 178052, 178057, - 178063, 178069, 178075, 178080, 178086, 178092, 178097, 178103, 178109, - 178114, 178120, 178126, 178131, 178137, 178143, 178148, 178154, 178160, - 178166, 178172, 178178, 178182, 178187, 178191, 178196, 178200, 178205, - 178210, 178216, 178222, 178228, 178233, 178239, 178245, 178251, 178256, - 178262, 178268, 178273, 178279, 178285, 178290, 178296, 178302, 178307, - 178313, 178319, 178324, 178330, 178336, 178342, 178348, 178354, 178359, - 178363, 178368, 178371, 178375, 178378, 178381, 178384, 178387, 178390, - 178393, 178396, 178399, 178402, 178405, 178408, 178411, 178414, 178417, - 178420, 178423, 178426, 178429, 178432, 178435, 178438, 178441, 178444, - 178447, 178450, 178453, 178456, 178459, 178462, 178465, 178468, 178471, - 178474, 178477, 178480, 178483, 178486, 178489, 178492, 178495, 178498, - 178501, 178504, 178507, 178510, 178513, 178516, 178519, 178522, 178525, - 178528, 178531, 178534, 178537, 178540, 178543, 178546, 178549, 178552, - 178555, 178558, 178561, 178564, 178567, 178570, 178573, 178576, 178579, - 178582, 178585, 178588, 178591, 178594, 178597, 178600, 178603, 178606, - 178609, 178612, 178615, 178618, 178621, 178624, 178627, 178630, 178633, - 178636, 178639, 178642, 178645, 178648, 178651, 178654, 178657, 178660, - 178663, 178666, 178669, 178672, 178675, 178678, 178681, 178684, 178687, - 178690, 178693, 178696, 178699, 178702, 178705, 178708, 178711, 178714, - 178717, 178720, 178723, 178726, 178729, 178732, 178735, 178738, 178741, - 178744, 178747, 178750, 178753, 178756, 178759, 178762, 178765, 178768, - 178771, 178774, 178777, 178780, 178783, 178786, 178789, 178792, 178795, - 178798, 178801, 178804, 178807, 178810, 178813, 178816, 178819, 178822, - 178825, 178828, 178831, 178834, 178837, 178840, 178843, 178846, 178849, - 178852, 178855, 178858, 178861, 178864, 178867, 178870, 178873, 178876, - 178879, 178882, 178885, 178888, 178891, 178894, 178897, 178900, 178903, - 178906, 178909, 178912, 178915, 178918, 178921, 178924, 178927, 178930, - 178933, 178936, 178939, 178942, 178945, 178948, 178951, 178954, 178957, - 178960, 178963, 178966, 178969, 178972, 178975, 178978, 178981, 178984, - 178987, 178990, 178993, 178996, 178999, 179002, 179005, 179008, 179011, - 179014, 179017, 179020, 179023, 179026, 179029, 179032, 179035, 179038, - 179041, 179044, 179047, 179050, 179053, 179056, 179059, 179062, 179065, - 179068, 179071, 179074, 179077, 179080, 179083, 179086, 179089, 179092, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179095, 179097, 179099, - 179104, 179106, 179111, 179113, 179118, 179120, 179125, 179127, 179129, - 179131, 179133, 179135, 179137, 179139, 179141, 179143, 179146, 179150, - 179152, 179154, 179158, 179162, 179167, 179169, 179171, 179173, 179177, - 179180, 179182, 179186, 179188, 179192, 179194, 179198, 179201, 179203, - 179207, 179211, 179213, 179219, 179221, 179226, 179228, 179233, 179235, - 179240, 179242, 179247, 179249, 179253, 179255, 179259, 179261, 179268, - 179270, 179272, 179274, 179279, 179281, 179283, 179285, 179287, 179289, - 179294, 179298, 179300, 179305, 179309, 179311, 179316, 179320, 179322, - 179327, 179331, 179333, 179335, 179337, 179339, 179343, 179345, 179350, - 179352, 179358, 179360, 179366, 179368, 179370, 179372, 179376, 179378, - 179385, 179387, 179394, 179396, 179401, 179407, 179409, 179415, 179422, - 179424, 179430, 179435, 179437, 179443, 179449, 179451, 179457, 179463, - 179465, 179471, 179475, 179477, 179482, 179484, 179486, 179491, 179493, - 179495, 179501, 179503, 179508, 179512, 179514, 179519, 179523, 179525, - 179531, 179533, 179537, 179539, 179543, 179545, 179552, 179559, 179561, - 179568, 179575, 179577, 179582, 179584, 179591, 179593, 179598, 179600, - 179606, 179608, 179612, 179614, 179620, 179622, 179626, 179628, 179634, - 179636, 179638, 179640, 179645, 179650, 179652, 179654, 179664, 179669, - 179676, 179683, 179688, 179693, 179705, 179709, 179713, 179717, 179721, - 179723, 179725, 179727, 179729, 179731, 179733, 179735, 179737, 179739, - 179741, 179743, 179745, 179747, 179749, 179751, 179753, 179755, 179757, - 179759, 179761, 179763, 179769, 179776, 179781, 179789, 179797, 179802, - 179804, 179806, 179808, 179810, 179812, 179814, 179816, 179818, 179820, - 179822, 179824, 179826, 179828, 179830, 179832, 179834, 179845, 179850, - 179852, 179854, 179860, 179872, 179878, 179884, 179890, 179896, 179900, - 179911, 179913, 179915, 179917, 179919, 179921, 179923, 179925, 179927, - 179929, 179931, 179933, 179935, 179937, 179939, 179941, 179943, 179945, - 179947, 179949, 179951, 179953, 179955, 179957, 179959, 179961, 179963, - 179965, 179967, 179969, 179971, 179973, 179975, 179977, 179979, 179981, - 179983, 179985, 179987, 179989, 179991, 179993, 179995, 179997, 179999, - 180001, 180003, 180005, 180007, 180009, 180011, 180013, 180015, 180017, - 180019, 180021, 180023, 180025, 180027, 180029, 180031, 180033, 180035, - 180037, 180039, 180041, 180043, 180045, 180047, 180049, 180051, 180053, - 180055, 180057, 180059, 180061, 180063, 180065, 180067, 180069, 180071, - 180073, 180075, 180077, 180079, 180081, 180083, 180085, 180087, 180089, - 180091, 180093, 180095, 180097, 180099, 180101, 180103, 180105, 180107, - 180109, 180111, 180113, 180115, 180117, 180119, 180121, 180123, 180125, - 180127, 180129, 180131, 180133, 180135, 180137, 180139, 180141, 180143, - 180145, 180147, 180149, 180151, 180153, 180155, 180157, 180159, 180161, - 180163, 180165, 180167, 180169, 180171, 180173, 180175, 180177, 180179, - 180181, 180183, 180185, 180187, 180189, 180191, 180193, 180195, 180197, - 180199, 180201, 180203, 180205, 180207, 180209, 180211, 180213, 180215, - 180217, 180219, 180221, 180223, 180225, 180227, 180229, 180231, 180233, - 180235, 180237, 180239, 180241, 180243, 180245, 180247, 180249, 180251, - 180253, 180255, 180257, 180259, 180261, 180263, 180265, 180267, 180269, - 180271, 180273, 180275, 180277, 180279, 180281, 180283, 180285, 180287, - 180289, 180291, 180293, 180295, 180297, 180299, 180301, 180303, 180305, - 180307, 180309, 180311, 180313, 180315, 180317, 180319, 180321, 180323, - 180325, 180327, 180329, 180331, 180333, 180335, 180337, 180339, 180341, - 180343, 180345, 180347, 180349, 180351, 180353, 180355, 180357, 180359, - 180361, 180363, 180365, 180367, 180369, 180371, 180373, 180375, 180377, - 180379, 180381, 180383, 180385, 180387, 180389, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180111, 180114, 180117, + 180120, 180123, 180126, 180129, 180132, 180135, 180138, 180141, 180144, + 180147, 180150, 180153, 180156, 180159, 180162, 180165, 180168, 180171, + 180174, 180177, 180180, 180183, 180186, 180189, 180192, 180195, 180198, + 180201, 180204, 180207, 180210, 180213, 180216, 180219, 180222, 180225, + 180228, 180231, 180234, 180237, 180240, 180243, 180246, 180249, 180252, + 180255, 180258, 180261, 180264, 180267, 180270, 180273, 180276, 180279, + 180282, 180285, 180288, 180291, 180303, 180315, 180327, 180339, 180350, + 180362, 180374, 180386, 180398, 180409, 180422, 180435, 180447, 180460, + 180472, 180484, 180497, 180509, 180522, 180534, 180546, 180559, 180571, + 180583, 180595, 180607, 180618, 180630, 180642, 180654, 180666, 180677, + 180690, 180703, 180715, 180728, 180740, 180752, 180765, 180777, 180790, + 180802, 180814, 180827, 180839, 180851, 180863, 180875, 180883, 180891, + 180899, 180907, 180913, 180919, 180925, 180931, 180937, 180943, 180950, + 180957, 180964, 180971, 180978, 180985, 180993, 181001, 181009, 181017, + 181025, 181032, 181038, 181044, 181051, 181057, 181064, 181070, 181076, + 181083, 181089, 181096, 181102, 181108, 181114, 181120, 181126, 181138, + 0, 181151, 181164, 181170, 181178, 181183, 181190, 181197, 181205, + 181213, 181221, 181229, 181237, 181245, 181257, 181269, 181280, 181291, + 181306, 181321, 181336, 181351, 181369, 181387, 181406, 181425, 181443, + 181461, 181468, 181476, 181480, 181485, 181491, 181497, 181507, 181518, + 181529, 181539, 181549, 181553, 181557, 181562, 181568, 181574, 181584, + 181590, 181599, 181608, 181617, 181626, 181632, 181636, 181645, 181653, + 181661, 181668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181673, 181678, + 181682, 181686, 181690, 181694, 181698, 181702, 181706, 181710, 0, 0, 0, + 0, 0, 0, 181714, 181718, 181722, 181726, 181730, 181734, 181738, 181742, + 181746, 181750, 181754, 181758, 181762, 181766, 181770, 181774, 181778, + 181782, 181786, 181790, 181794, 181798, 181802, 181806, 181810, 181814, + 181818, 181822, 181826, 181830, 181834, 181838, 181842, 181846, 181850, + 181854, 181858, 181862, 181866, 181870, 181874, 181878, 181882, 181886, + 181890, 181894, 181898, 181902, 181906, 181910, 181914, 181918, 181922, + 181926, 181930, 181934, 181938, 181942, 181946, 181950, 181954, 181958, + 181962, 181966, 181970, 181974, 181978, 181982, 181986, 181990, 181994, + 181998, 182002, 182006, 182010, 182014, 182018, 182022, 182026, 182030, + 182034, 182038, 182042, 182046, 182050, 182054, 182058, 182062, 182066, + 182070, 182074, 182078, 182082, 182086, 182090, 182094, 182098, 182102, + 182106, 182110, 182114, 182118, 182122, 182126, 182130, 182134, 182138, + 182142, 182146, 182150, 182154, 182158, 182162, 182166, 182170, 182174, + 182178, 182182, 182186, 182190, 182194, 182198, 182202, 182206, 182210, + 182214, 182218, 182222, 182226, 182230, 182234, 182238, 182242, 182246, + 182250, 182254, 182258, 182262, 182266, 182270, 182274, 182278, 182282, + 182286, 182290, 182294, 182298, 182302, 182306, 182310, 182314, 182318, + 182322, 182326, 182330, 182334, 182338, 182342, 182346, 182350, 182354, + 182358, 182362, 182366, 182370, 182374, 182378, 182382, 182386, 182390, + 182394, 182398, 182402, 182406, 182410, 182414, 182418, 182422, 182426, + 182430, 182434, 182438, 182442, 182446, 182450, 182454, 182458, 182462, + 182466, 182470, 182474, 182478, 182482, 182486, 182490, 182494, 182498, + 182502, 182506, 182510, 182514, 182518, 182522, 182526, 182530, 182534, + 182538, 182542, 182546, 182550, 182554, 182558, 182562, 182566, 182570, + 182574, 182578, 182582, 182586, 182590, 182594, 182598, 182602, 182606, + 182610, 182614, 182618, 182622, 182626, 182630, 182634, 182638, 182642, + 182646, 182650, 182654, 182658, 182662, 182666, 182670, 182674, 182678, + 182682, 182686, 182690, 182694, 182698, 182702, 182706, 182710, 182714, + 182718, 182722, 182726, 182730, 182734, 182738, 182742, 182746, 182750, + 182754, 182758, 182762, 182766, 182770, 182774, 182778, 182782, 182786, + 182790, 182794, 182798, 182802, 182806, 182810, 182814, 182818, 182822, + 182826, 182830, 182834, 182838, 182842, 182846, 182850, 182854, 182858, + 182862, 182866, 182870, 182874, 182878, 182882, 182886, 182890, 182894, + 182898, 182902, 182906, 182910, 182914, 182918, 182922, 182926, 182930, + 182934, 182938, 182942, 182946, 182950, 182954, 182958, 182962, 182966, + 182970, 182974, 182978, 182982, 182986, 182990, 182994, 182998, 183002, + 183006, 183010, 183014, 183018, 183022, 183026, 183030, 183034, 183038, + 183042, 183046, 183050, 183054, 183058, 183062, 183066, 183070, 183074, + 183078, 183082, 183086, 183090, 183094, 183098, 183102, 183106, 183110, + 183114, 183118, 183122, 183126, 183130, 183134, 183138, 183142, 183146, + 183150, 183154, 183158, 183162, 183166, 183170, 183174, 183178, 183182, + 183186, 183190, 183194, 183198, 183202, 183206, 183210, 183214, 183218, + 183222, 183226, 183230, 183234, 183238, 183242, 183246, 183250, 183254, + 183258, 183262, 183266, 183270, 183274, 183278, 183282, 183286, 183290, + 183294, 183298, 183302, 183306, 183310, 183314, 183318, 183322, 183326, + 183330, 183334, 183338, 183342, 183346, 183350, 183354, 183358, 183362, + 183366, 183370, 183374, 183378, 183382, 183386, 183390, 183394, 183398, + 183402, 183406, 183410, 183414, 183418, 183422, 183426, 183430, 183434, + 183438, 183442, 183446, 183450, 183454, 183458, 183462, 183466, 183470, + 183474, 183478, 183482, 183486, 183490, 183494, 183498, 183502, 183506, + 183510, 183514, 183518, 183522, 183526, 183530, 183534, 183538, 183542, + 183546, 183550, 183554, 183558, 183562, 183566, 183570, 183574, 183578, + 183582, 183586, 183590, 183594, 183598, 183602, 183606, 183610, 183614, + 183618, 183622, 183626, 183630, 183634, 183638, 183642, 183646, 183650, + 183654, 183658, 183662, 183666, 183670, 183674, 183678, 183682, 183686, + 183690, 183694, 183698, 183702, 183706, 183710, 183714, 183718, 183722, + 183726, 183730, 183734, 183738, 183742, 183746, 183750, 183754, 183758, + 183762, 183766, 183770, 183774, 183778, 183782, 183786, 183790, 183794, + 183798, 183802, 183806, 183810, 183814, 183818, 183822, 183826, 183830, + 183834, 183838, 183842, 183846, 183850, 183854, 183858, 183862, 183866, + 183870, 183874, 183878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180391, 180395, 180399, 180404, - 180408, 180412, 180416, 180420, 180424, 180428, 180432, 180436, 180440, - 180450, 180460, 180470, 180480, 180494, 180508, 180521, 180534, 180545, - 180556, 180567, 180578, 180589, 180600, 180610, 180619, 180628, 180637, - 180650, 180663, 180675, 180687, 180697, 180707, 180717, 180727, 180736, - 180745, 180755, 180765, 180775, 180785, 180796, 180807, 180817, 180827, - 180838, 180849, 180860, 180871, 180881, 180894, 180905, 180919, 180927, - 180938, 180946, 180954, 180962, 180970, 180978, 180986, 180995, 181004, - 181014, 181024, 181033, 181042, 181052, 181062, 181070, 181078, 181085, - 181094, 181102, 181110, 181117, 181127, 181136, 181147, 181158, 181170, - 181181, 181191, 181202, 181212, 181223, 181231, 181236, 181240, 181244, - 181248, 181252, 181256, 181260, 181264, 181268, 181272, 181276, 181280, - 181283, 181286, 181290, 181294, 181298, 181302, 181306, 181310, 181314, - 181318, 181322, 181326, 181330, 181334, 181338, 181342, 181346, 181350, - 181354, 181358, 181362, 181366, 181370, 181374, 181378, 181382, 181386, - 181390, 181394, 181398, 181402, 181406, 181410, 181414, 181418, 181422, - 181426, 181430, 181434, 181438, 181442, 181446, 181450, 181454, 181458, - 181462, 181466, 181470, 181474, 181478, 181482, 181486, 181490, 181494, - 181498, 181502, 181506, 181510, 181514, 181518, 181522, 181526, 181530, - 181534, 181538, 181542, 181546, 181550, 181554, 181558, 181562, 181566, - 181570, 181574, 181578, 181582, 181586, 181590, 181594, 181598, 181602, - 181606, 181610, 181614, 181618, 181622, 181626, 181629, 181633, 181637, - 181641, 181645, 181649, 181653, 181657, 181661, 181665, 181669, 181673, - 181677, 181681, 181685, 181689, 181693, 181697, 181701, 181705, 181709, - 181713, 181717, 181721, 181725, 181729, 181733, 181737, 181741, 181745, - 181749, 181753, 181757, 181761, 181765, 181769, 181773, 181777, 181781, - 181785, 181789, 181793, 181797, 181801, 181805, 181809, 181813, 181817, - 181821, 181825, 181829, 181833, 181837, 181841, 181845, 181849, 181853, - 181857, 181861, 181865, 181869, 181873, 181877, 181881, 181885, 181889, - 181893, 181897, 181901, 181905, 181909, 181913, 181917, 181921, 181925, - 181929, 181933, 181937, 181941, 181945, 181949, 181953, 181957, 181961, - 181965, 181969, 181973, 181977, 181981, 181985, 181989, 181993, 181997, - 182001, 182005, 182009, 182013, 182017, 182021, 182025, 182029, 182033, - 182037, 182041, 182045, 182049, 182053, 182057, 182061, 182065, 182069, - 182073, 182077, 182081, 182085, 182089, 182093, 182097, 182101, 182105, - 182109, 182113, 182117, 182121, 182125, 182129, 182133, 182137, 182141, - 182145, 182149, 182153, 182157, 182161, 182165, 182169, 182173, 182177, - 182181, 182185, 182189, 182193, 182197, 182201, 182205, 182209, 182213, - 182217, 182221, 182225, 182229, 182233, 182237, 182241, 182245, 182249, - 182253, 182257, 182261, 182265, 182269, 182273, 182277, 182281, 182285, - 182289, 182293, 182297, 182301, 182305, 182309, 182313, 182317, 182321, - 182325, 182329, 182333, 182337, 182341, 182345, 182349, 182353, 182357, - 182361, 182365, 182369, 182373, 182377, 182381, 182385, 182389, 182393, - 182398, 182403, 182408, 182412, 182418, 182425, 182432, 182439, 182446, - 182453, 182460, 182467, 182474, 182481, 182488, 182495, 182502, 182509, - 182515, 182521, 182528, 182534, 182541, 182548, 182555, 182562, 182569, - 182576, 182583, 182590, 182597, 182604, 182611, 182618, 182625, 182631, - 182637, 182643, 182650, 182659, 182668, 182677, 182686, 182691, 182696, - 182702, 182708, 182714, 182720, 182726, 182732, 182738, 182744, 182750, - 182756, 182762, 182768, 182773, 182779, 182789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183882, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183886, 183889, 183893, 183897, 183900, 183904, 183908, 183911, + 183914, 183918, 183922, 183925, 183928, 183931, 183934, 183939, 183942, + 183946, 183949, 183952, 183955, 183958, 183961, 183964, 183967, 183970, + 183973, 183976, 183979, 183983, 183987, 183991, 183995, 184000, 184005, + 184011, 184017, 184023, 184028, 184034, 184040, 184046, 184051, 184057, + 184063, 184068, 184074, 184080, 184085, 184091, 184097, 184102, 184108, + 184114, 184119, 184125, 184131, 184137, 184143, 184149, 184153, 184158, + 184162, 184167, 184171, 184176, 184181, 184187, 184193, 184199, 184204, + 184210, 184216, 184222, 184227, 184233, 184239, 184244, 184250, 184256, + 184261, 184267, 184273, 184278, 184284, 184290, 184295, 184301, 184307, + 184313, 184319, 184325, 184330, 184334, 184339, 184342, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184346, 184349, 184352, 184355, 184358, 184361, 184364, 184367, + 184370, 184373, 184376, 184379, 184382, 184385, 184388, 184391, 184394, + 184397, 184400, 184403, 184406, 184409, 184412, 184415, 184418, 184421, + 184424, 184427, 184430, 184433, 184436, 184439, 184442, 184445, 184448, + 184451, 184454, 184457, 184460, 184463, 184466, 184469, 184472, 184475, + 184478, 184481, 184484, 184487, 184490, 184493, 184496, 184499, 184502, + 184505, 184508, 184511, 184514, 184517, 184520, 184523, 184526, 184529, + 184532, 184535, 184538, 184541, 184544, 184547, 184550, 184553, 184556, + 184559, 184562, 184565, 184568, 184571, 184574, 184577, 184580, 184583, + 184586, 184589, 184592, 184595, 184598, 184601, 184604, 184607, 184610, + 184613, 184616, 184619, 184622, 184625, 184628, 184631, 184634, 184637, + 184640, 184643, 184646, 184649, 184652, 184655, 184658, 184661, 184664, + 184667, 184670, 184673, 184676, 184679, 184682, 184685, 184688, 184691, + 184694, 184697, 184700, 184703, 184706, 184709, 184712, 184715, 184718, + 184721, 184724, 184727, 184730, 184733, 184736, 184739, 184742, 184745, + 184748, 184751, 184754, 184757, 184760, 184763, 184766, 184769, 184772, + 184775, 184778, 184781, 184784, 184787, 184790, 184793, 184796, 184799, + 184802, 184805, 184808, 184811, 184814, 184817, 184820, 184823, 184826, + 184829, 184832, 184835, 184838, 184841, 184844, 184847, 184850, 184853, + 184856, 184859, 184862, 184865, 184868, 184871, 184874, 184877, 184880, + 184883, 184886, 184889, 184892, 184895, 184898, 184901, 184904, 184907, + 184910, 184913, 184916, 184919, 184922, 184925, 184928, 184931, 184934, + 184937, 184940, 184943, 184946, 184949, 184952, 184955, 184958, 184961, + 184964, 184967, 184970, 184973, 184976, 184979, 184982, 184985, 184988, + 184991, 184994, 184997, 185000, 185003, 185006, 185009, 185012, 185015, + 185018, 185021, 185024, 185027, 185030, 185033, 185036, 185039, 185042, + 185045, 185048, 185051, 185054, 185057, 185060, 185063, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185066, 185068, 185070, 185075, 185077, + 185082, 185084, 185089, 185091, 185096, 185098, 185100, 185102, 185104, + 185106, 185108, 185110, 185112, 185114, 185118, 185122, 185124, 185126, + 185130, 185134, 185139, 185141, 185143, 185145, 185149, 185152, 185154, + 185158, 185160, 185164, 185166, 185170, 185173, 185175, 185179, 185183, + 185185, 185191, 185193, 185198, 185200, 185205, 185207, 185212, 185214, + 185219, 185221, 185225, 185227, 185231, 185233, 185240, 185242, 185244, + 185246, 185251, 185253, 185255, 185257, 185259, 185261, 185266, 185270, + 185272, 185277, 185281, 185283, 185288, 185292, 185294, 185299, 185303, + 185305, 185307, 185309, 185311, 185315, 185317, 185322, 185324, 185330, + 185332, 185338, 185340, 185342, 185344, 185348, 185350, 185357, 185359, + 185366, 185368, 185374, 185380, 185382, 185389, 185396, 185398, 185404, + 185409, 185411, 185417, 185423, 185425, 185431, 185437, 185439, 185445, + 185449, 185451, 185456, 185458, 185460, 185465, 185467, 185469, 185475, + 185477, 185482, 185486, 185488, 185493, 185497, 185499, 185505, 185507, + 185511, 185513, 185517, 185519, 185526, 185533, 185535, 185542, 185549, + 185551, 185556, 185558, 185566, 185568, 185574, 185576, 185582, 185584, + 185588, 185590, 185596, 185598, 185602, 185604, 185610, 185612, 185614, + 185616, 185621, 185626, 185628, 185630, 185640, 185645, 185652, 185659, + 185664, 185669, 185681, 185685, 185689, 185693, 185697, 185699, 185701, + 185703, 185705, 185707, 185709, 185711, 185713, 185715, 185717, 185719, + 185721, 185723, 185725, 185727, 185729, 185731, 185733, 185735, 185737, + 185739, 185745, 185752, 185757, 185765, 185773, 185778, 185780, 185782, + 185784, 185786, 185788, 185790, 185792, 185794, 185796, 185798, 185800, + 185802, 185804, 185806, 185808, 185810, 185821, 185826, 185828, 185830, + 185836, 185848, 185854, 185860, 185866, 185872, 185876, 185887, 185889, + 185891, 185893, 185895, 185897, 185899, 185901, 185903, 185905, 185907, + 185909, 185911, 185913, 185915, 185917, 185919, 185921, 185923, 185925, + 185927, 185929, 185931, 185933, 185935, 185937, 185939, 185941, 185943, + 185945, 185947, 185949, 185951, 185953, 185955, 185957, 185959, 185961, + 185963, 185965, 185967, 185969, 185971, 185973, 185975, 185977, 185979, + 185981, 185983, 185985, 185987, 185989, 185991, 185993, 185995, 185997, + 185999, 186001, 186003, 186005, 186007, 186009, 186011, 186013, 186015, + 186017, 186019, 186021, 186023, 186025, 186027, 186029, 186031, 186033, + 186035, 186037, 186039, 186041, 186043, 186045, 186047, 186049, 186051, + 186053, 186055, 186057, 186059, 186061, 186063, 186065, 186067, 186069, + 186071, 186073, 186075, 186077, 186079, 186081, 186083, 186085, 186087, + 186089, 186091, 186093, 186095, 186097, 186099, 186101, 186103, 186105, + 186107, 186109, 186111, 186113, 186115, 186117, 186119, 186121, 186123, + 186125, 186127, 186129, 186131, 186133, 186135, 186137, 186139, 186141, + 186143, 186145, 186147, 186149, 186151, 186153, 186155, 186157, 186159, + 186161, 186163, 186165, 186167, 186169, 186171, 186173, 186175, 186177, + 186179, 186181, 186183, 186185, 186187, 186189, 186191, 186193, 186195, + 186197, 186199, 186201, 186203, 186205, 186207, 186209, 186211, 186213, + 186215, 186217, 186219, 186221, 186223, 186225, 186227, 186229, 186231, + 186233, 186235, 186237, 186239, 186241, 186243, 186245, 186247, 186249, + 186251, 186253, 186255, 186257, 186259, 186261, 186263, 186265, 186267, + 186269, 186271, 186273, 186275, 186277, 186279, 186281, 186283, 186285, + 186287, 186289, 186291, 186293, 186295, 186297, 186299, 186301, 186303, + 186305, 186307, 186309, 186311, 186313, 186315, 186317, 186319, 186321, + 186323, 186325, 186327, 186329, 186331, 186333, 186335, 186337, 186339, + 186341, 186343, 186345, 186347, 186349, 186351, 186353, 186355, 186357, + 186359, 186361, 186363, 186365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 186367, 186371, 186375, 186380, 186384, 186388, 186392, + 186396, 186400, 186404, 186408, 186412, 186416, 186426, 186436, 186447, + 186458, 186468, 186478, 186488, 186498, 186512, 186526, 186540, 186554, + 186563, 186572, 186585, 186598, 186611, 186624, 186634, 186644, 186655, + 186666, 186677, 186688, 186699, 186708, 186718, 186728, 186738, 186748, + 186759, 186770, 186781, 186792, 186803, 186814, 186825, 186836, 186847, + 186858, 186869, 186883, 186894, 186908, 186916, 186927, 186935, 186943, + 186951, 186959, 186967, 186975, 186985, 186995, 187005, 187015, 187025, + 187035, 187045, 187055, 187063, 187072, 187081, 187090, 187099, 187107, + 187115, 187125, 187135, 187146, 187157, 187169, 187180, 187190, 187201, + 187211, 187222, 187230, 187235, 187239, 187243, 187247, 187251, 187255, + 187259, 187263, 187267, 187271, 187275, 187279, 187282, 187285, 187289, + 187293, 187297, 187301, 187305, 187309, 187313, 187317, 187321, 187325, + 187329, 187333, 187337, 187341, 187345, 187349, 187353, 187357, 187361, + 187365, 187369, 187373, 187377, 187381, 187385, 187389, 187393, 187397, + 187401, 187405, 187409, 187413, 187417, 187421, 187425, 187429, 187433, + 187437, 187441, 187445, 187449, 187453, 187457, 187461, 187465, 187469, + 187473, 187477, 187481, 187485, 187489, 187493, 187497, 187501, 187505, + 187509, 187513, 187517, 187521, 187525, 187529, 187533, 187537, 187541, + 187545, 187549, 187553, 187557, 187561, 187565, 187569, 187573, 187577, + 187581, 187585, 187589, 187593, 187597, 187601, 187605, 187609, 187613, + 187617, 187621, 187625, 187628, 187632, 187636, 187640, 187644, 187648, + 187652, 187656, 187660, 187664, 187668, 187672, 187676, 187680, 187684, + 187688, 187692, 187696, 187700, 187704, 187708, 187712, 187716, 187720, + 187724, 187728, 187732, 187736, 187740, 187744, 187748, 187752, 187756, + 187760, 187764, 187768, 187772, 187776, 187780, 187784, 187788, 187792, + 187796, 187800, 187804, 187808, 187812, 187816, 187820, 187824, 187828, + 187832, 187836, 187840, 187844, 187848, 187852, 187856, 187860, 187864, + 187868, 187872, 187876, 187880, 187884, 187888, 187892, 187896, 187900, + 187904, 187908, 187912, 187916, 187920, 187924, 187928, 187932, 187936, + 187940, 187944, 187948, 187952, 187956, 187960, 187964, 187968, 187972, + 187976, 187980, 187984, 187988, 187992, 187996, 188000, 188004, 188008, + 188012, 188016, 188020, 188024, 188028, 188032, 188036, 188040, 188044, + 188048, 188052, 188056, 188060, 188064, 188068, 188072, 188076, 188080, + 188084, 188088, 188092, 188096, 188100, 188104, 188108, 188112, 188116, + 188120, 188124, 188128, 188132, 188136, 188140, 188144, 188148, 188152, + 188156, 188160, 188164, 188168, 188172, 188176, 188180, 188184, 188188, + 188192, 188196, 188200, 188204, 188208, 188212, 188216, 188220, 188224, + 188228, 188232, 188236, 188240, 188244, 188248, 188252, 188256, 188260, + 188264, 188268, 188272, 188276, 188280, 188284, 188288, 188292, 188296, + 188300, 188304, 188308, 188312, 188316, 188320, 188324, 188328, 188332, + 188336, 188340, 188344, 188348, 188352, 188356, 188360, 188364, 188368, + 188372, 188376, 188380, 188384, 188388, 188392, 188397, 188402, 188407, + 188411, 188417, 188424, 188431, 188438, 188445, 188452, 188459, 188466, + 188473, 188480, 188487, 188494, 188501, 188508, 188514, 188520, 188527, + 188533, 188540, 188547, 188554, 188561, 188568, 188575, 188582, 188589, + 188596, 188603, 188610, 188617, 188624, 188630, 188636, 188642, 188649, + 188658, 188667, 188676, 188685, 188690, 188695, 188702, 188709, 188716, + 188723, 188730, 188736, 188742, 188748, 188754, 188760, 188766, 188772, + 188777, 188783, 188793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, }; /* name->code dictionary */ static const unsigned int code_hash[] = { 74224, 4851, 0, 0, 0, 0, 7929, 0, 0, 0, 0, 127931, 0, 42833, 983091, - 12064, 0, 129548, 194597, 69850, 65842, 0, 0, 0, 78159, 68476, 72392, - 1373, 0, 0, 5816, 0, 0, 4231, 0, 0, 4233, 4234, 4232, 68885, 70351, 0, - 7404, 72393, 0, 0, 0, 0, 0, 41601, 8874, 0, 0, 0, 0, 0, 0, 41603, 9784, - 0, 9188, 41600, 0, 0, 0, 0, 3535, 0, 0, 0, 66797, 0, 74491, 0, 3404, - 100419, 0, 72411, 1759, 100417, 0, 100418, 69972, 11240, 121038, 100416, - 127764, 0, 0, 0, 0, 0, 69970, 0, 0, 9834, 43249, 2234, 983872, 0, 0, 0, - 0, 92417, 0, 74398, 12035, 0, 983074, 43548, 0, 0, 0, 0, 0, 64318, + 12064, 110752, 129548, 194597, 69850, 65842, 0, 0, 0, 78159, 68476, + 72392, 1373, 0, 0, 5816, 0, 0, 4231, 0, 0, 4233, 4234, 4232, 68885, + 70351, 0, 7404, 72393, 0, 0, 0, 0, 0, 41601, 8874, 0, 0, 0, 0, 0, 0, + 41603, 9784, 0, 9188, 41600, 0, 0, 0, 0, 3535, 0, 0, 0, 66797, 0, 74491, + 0, 3404, 100419, 0, 72411, 1759, 100417, 0, 100418, 69972, 11240, 121038, + 100416, 127764, 0, 0, 0, 0, 0, 69970, 0, 0, 9834, 43249, 2234, 983872, 0, + 0, 0, 0, 92417, 0, 74398, 12035, 0, 983074, 43548, 0, 0, 0, 0, 0, 64318, 917549, 0, 3390, 74483, 43265, 0, 983865, 0, 0, 0, 3400, 0, 0, 11647, 0, 0, 0, 0, 2121, 128741, 4043, 8712, 0, 983795, 0, 121172, 0, 129456, 0, 0, 93042, 0, 0, 983856, 0, 0, 0, 11851, 0, 3181, 66002, 0, 69601, 0, 66021, 0, 194588, 5457, 5440, 0, 93981, 65282, 2843, 5355, 0, 129333, 69971, 5194, 11657, 128353, 0, 0, 0, 0, 0, 0, 100525, 0, 0, 74350, 0, 10682, - 110820, 10602, 800, 70044, 118883, 0, 0, 64930, 118940, 67853, 0, 0, 762, - 120485, 0, 0, 0, 10906, 1353, 6960, 0, 0, 5828, 8724, 0, 0, 0, 0, 0, + 110820, 10602, 800, 70044, 118883, 0, 0, 64930, 118940, 67853, 72001, 0, + 762, 120485, 0, 0, 0, 10906, 1353, 6960, 0, 0, 5828, 8724, 0, 0, 0, 0, 0, 7080, 0, 0, 0, 0, 72388, 0, 0, 0, 0, 68878, 0, 0, 0, 7240, 0, 556, 0, 0, 0, 0, 0, 72397, 0, 0, 0, 0, 0, 0, 0, 0, 72986, 0, 0, 43931, 0, 11093, 0, 0, 125016, 7341, 66801, 68527, 0, 1874, 0, 0, 129314, 0, 0, 0, 0, 0, 0, @@ -23526,12 +24325,12 @@ static const unsigned int code_hash[] = { 0, 92928, 0, 0, 7233, 92929, 0, 0, 6639, 0, 0, 123149, 0, 1176, 0, 0, 8276, 128667, 0, 0, 68892, 42931, 0, 0, 0, 0, 0, 0, 0, 5388, 0, 0, 0, 11310, 0, 123607, 0, 68888, 4199, 119264, 0, 119020, 0, 0, 9560, 0, 0, - 43869, 0, 0, 0, 83172, 0, 0, 0, 83173, 121256, 128875, 0, 0, 74327, 0, 0, + 43869, 0, 0, 0, 83172, 0, 0, 0, 83173, 101559, 128875, 0, 0, 74327, 0, 0, 0, 0, 0, 123623, 68886, 0, 0, 0, 8408, 64704, 0, 0, 0, 0, 0, 67999, 0, 0, 0, 0, 43049, 0, 43050, 73028, 0, 0, 0, 0, 0, 127396, 0, 69847, 9322, 0, 0, 129321, 68192, 120507, 983634, 0, 0, 0, 6199, 67249, 0, 0, 0, 0, 11329, 66285, 0, 983086, 0, 0, 0, 0, 41335, 118866, 43401, 0, 41334, 0, - 0, 0, 983479, 0, 983478, 128114, 0, 42627, 0, 32, 6187, 0, 123619, + 0, 0, 983479, 71997, 983478, 128114, 0, 42627, 0, 32, 6187, 0, 123619, 983475, 3665, 121083, 42871, 983118, 41336, 0, 0, 983471, 0, 0, 0, 4412, 0, 0, 0, 0, 119533, 0, 4181, 0, 0, 127589, 0, 0, 71453, 6181, 74755, 917895, 0, 0, 0, 0, 121107, 0, 0, 10073, 0, 100738, 127186, 0, 42844, @@ -23552,45 +24351,46 @@ static const unsigned int code_hash[] = { 0, 0, 0, 0, 983507, 41323, 0, 0, 92289, 0, 0, 0, 983503, 41321, 12907, 3048, 7752, 41320, 0, 0, 12819, 111247, 72127, 0, 0, 0, 0, 0, 72971, 0, 0, 0, 0, 78650, 78649, 0, 41326, 0, 11806, 43167, 0, 1245, 0, 66463, 0, - 0, 0, 0, 0, 194619, 0, 0, 0, 0, 0, 0, 70403, 325, 12874, 0, 74178, 0, 0, - 119110, 0, 0, 0, 0, 0, 0, 983563, 92175, 0, 0, 0, 121049, 0, 0, 0, 0, 0, - 0, 110844, 11776, 0, 19908, 0, 0, 0, 8753, 0, 0, 0, 9511, 43493, 0, - 93032, 6205, 0, 0, 0, 0, 0, 0, 0, 0, 126577, 0, 41607, 0, 0, 120617, 0, - 0, 0, 7005, 41609, 9580, 0, 401, 0, 43779, 0, 127962, 0, 65486, 0, 12857, - 0, 11983, 0, 0, 0, 121371, 0, 194971, 74258, 0, 0, 0, 0, 0, 0, 8295, - 6200, 0, 127864, 0, 0, 71435, 0, 92523, 0, 128631, 0, 0, 125197, 0, 0, 0, - 127556, 0, 0, 0, 64775, 0, 68862, 120590, 0, 0, 0, 8074, 8199, 126641, - 1907, 127269, 4432, 127271, 10808, 120668, 127272, 127259, 3888, 127261, - 72724, 127263, 127262, 127265, 123169, 121195, 127250, 66879, 127252, - 100422, 66023, 67363, 7663, 0, 0, 0, 0, 66321, 0, 12814, 127248, 127169, - 0, 0, 194603, 7641, 92694, 0, 0, 0, 0, 74320, 120818, 120268, 0, 128475, - 0, 110627, 0, 9622, 128972, 120264, 0, 0, 0, 0, 68319, 0, 0, 71484, 0, 0, - 0, 69906, 0, 0, 947, 0, 194586, 129059, 10969, 119935, 7613, 119937, - 119936, 4795, 119930, 119933, 7376, 0, 0, 0, 0, 0, 0, 0, 0, 119919, 7216, - 119921, 7217, 119915, 7218, 119917, 7219, 119927, 119926, 119929, 119928, - 7213, 119922, 7214, 7215, 128622, 0, 8880, 7685, 128849, 0, 0, 119618, 0, - 8187, 119913, 12815, 7236, 7915, 71906, 0, 121284, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10468, 0, 0, 0, 0, 0, 0, 0, 0, 917909, 0, 110633, 1616, - 3795, 67732, 11529, 0, 126225, 0, 0, 1138, 194577, 12677, 0, 0, 3239, 0, - 0, 194809, 194583, 0, 42164, 0, 11778, 0, 43259, 0, 119073, 0, 0, 0, - 67094, 129638, 0, 78421, 128123, 78418, 0, 0, 0, 0, 43959, 43960, 0, - 72257, 0, 9359, 78416, 0, 0, 0, 6662, 0, 0, 3863, 0, 41329, 55266, 0, - 127822, 41328, 75026, 194569, 129516, 0, 0, 0, 119595, 569, 0, 0, 0, - 119085, 110669, 0, 0, 11610, 11368, 0, 194570, 41331, 1006, 127747, - 120883, 1550, 8201, 0, 0, 5499, 43956, 77908, 77910, 77906, 43957, 77904, - 77905, 128410, 0, 0, 129581, 100447, 43955, 77913, 0, 0, 5511, 0, 983702, - 0, 69241, 8255, 5512, 128560, 119560, 127858, 64313, 127928, 5906, 1119, - 128180, 67088, 983362, 0, 113798, 0, 66423, 0, 0, 0, 67089, 0, 0, 0, 0, - 128177, 983709, 0, 0, 0, 5821, 6186, 0, 128034, 19961, 0, 983700, 0, - 65138, 302, 41113, 41115, 0, 6637, 5907, 128789, 0, 43642, 0, 128625, 0, - 70345, 5513, 6666, 100567, 78442, 5510, 0, 0, 0, 983706, 78437, 0, 0, 0, - 110838, 0, 0, 0, 92710, 0, 0, 0, 0, 0, 74497, 92395, 120511, 6929, 69412, - 0, 110835, 64442, 0, 0, 74496, 0, 6674, 43397, 0, 1476, 0, 0, 72276, - 3233, 0, 0, 10164, 0, 0, 3530, 67243, 0, 111219, 6656, 0, 0, 74647, 8512, - 72275, 74261, 8967, 0, 0, 0, 72277, 7986, 73782, 120556, 9006, 983562, - 72273, 0, 7853, 0, 983355, 0, 0, 0, 0, 983952, 0, 0, 0, 0, 0, 0, 0, 0, - 127971, 67983, 13296, 517, 0, 0, 0, 41528, 19923, 65454, 0, 0, 0, 10531, - 7784, 41526, 71727, 0, 8057, 1126, 73895, 0, 0, 0, 119186, 4251, 8235, + 0, 0, 0, 0, 194619, 0, 194618, 0, 0, 194620, 0, 70403, 325, 12874, 0, + 74178, 0, 0, 119110, 0, 0, 0, 0, 0, 0, 983563, 92175, 0, 0, 0, 121049, 0, + 0, 0, 0, 0, 0, 110844, 11776, 0, 19908, 0, 0, 0, 8753, 69278, 0, 0, 9511, + 43493, 0, 93032, 6205, 0, 0, 0, 0, 0, 0, 0, 0, 126577, 0, 41607, 0, 0, + 120617, 0, 0, 0, 7005, 41609, 9580, 0, 401, 0, 43779, 0, 127962, 0, + 65486, 0, 12857, 0, 11983, 0, 0, 0, 121371, 0, 194971, 74258, 0, 0, 0, 0, + 0, 0, 8295, 6200, 0, 127864, 0, 0, 71435, 0, 92523, 0, 128631, 0, 0, + 125197, 0, 0, 0, 127556, 0, 0, 0, 64775, 0, 68862, 120590, 0, 0, 129959, + 8074, 8199, 126641, 1907, 127269, 4432, 127271, 10808, 120668, 127272, + 127259, 3888, 127261, 72724, 127263, 127262, 127265, 123169, 121195, + 127250, 66879, 127252, 100422, 66023, 67363, 7663, 0, 0, 0, 0, 66321, 0, + 12814, 127248, 127169, 0, 0, 194603, 7641, 92694, 0, 0, 0, 0, 74320, + 120818, 120268, 0, 128475, 0, 110627, 0, 9622, 128972, 120264, 0, 0, 0, + 0, 68319, 0, 0, 71484, 0, 0, 0, 69906, 0, 0, 947, 0, 194586, 129059, + 10969, 119935, 7613, 119937, 119936, 4795, 119930, 119933, 7376, 0, 0, 0, + 0, 0, 0, 0, 0, 119919, 7216, 119921, 7217, 119915, 7218, 119917, 7219, + 119927, 119926, 119929, 119928, 7213, 119922, 7214, 7215, 128622, 0, + 8880, 7685, 128849, 0, 0, 119618, 119853, 8187, 119913, 12815, 7236, + 7915, 71906, 0, 121284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10468, 0, + 0, 0, 0, 0, 0, 0, 0, 917909, 0, 110633, 1616, 3795, 67732, 11529, 0, + 126225, 0, 0, 1138, 194577, 12677, 0, 0, 3239, 0, 0, 194809, 194583, 0, + 42164, 0, 11778, 0, 43259, 0, 119073, 0, 0, 0, 67094, 129638, 0, 78421, + 128123, 78418, 0, 0, 0, 0, 43959, 43960, 0, 72257, 0, 9359, 78416, 0, 0, + 0, 6662, 0, 0, 3863, 0, 41329, 55266, 0, 127822, 41328, 75026, 194569, + 129516, 0, 0, 0, 119595, 569, 0, 0, 0, 119085, 110669, 0, 0, 11610, + 11368, 0, 194570, 41331, 1006, 127747, 120883, 1550, 8201, 0, 194811, + 5499, 43956, 77908, 77910, 77906, 43957, 77904, 77905, 128410, 0, 0, + 129581, 100447, 43955, 77913, 0, 0, 5511, 0, 983702, 0, 69241, 8255, + 5512, 128560, 119560, 127858, 64313, 127928, 5906, 1119, 128180, 67088, + 983362, 0, 113798, 0, 66423, 0, 0, 0, 67089, 0, 0, 0, 0, 128177, 983709, + 0, 0, 0, 5821, 6186, 129960, 128034, 19961, 0, 983700, 0, 65138, 302, + 41113, 41115, 0, 6637, 5907, 128789, 0, 43642, 0, 128625, 0, 70345, 5513, + 6666, 100567, 78442, 5510, 0, 0, 0, 983706, 78437, 0, 0, 0, 110838, 0, 0, + 0, 92710, 0, 0, 0, 0, 0, 74497, 92395, 120511, 6929, 69412, 0, 110835, + 64442, 0, 0, 74496, 0, 6674, 43397, 0, 1476, 0, 0, 72276, 3233, 0, 0, + 10164, 0, 0, 3530, 67243, 0, 111219, 6656, 0, 0, 74647, 8512, 72275, + 74261, 8967, 0, 0, 0, 72277, 7986, 73782, 120556, 9006, 983562, 72273, 0, + 7853, 0, 983355, 0, 0, 0, 0, 983952, 0, 0, 0, 0, 0, 0, 0, 0, 127971, + 67983, 13296, 517, 0, 0, 0, 41528, 19923, 65454, 0, 0, 0, 10531, 7784, + 41526, 71727, 0, 8057, 1126, 73895, 0, 0, 130040, 119186, 4251, 8235, 43142, 0, 489, 71733, 4250, 71731, 110721, 43151, 94177, 71725, 0, 121238, 0, 0, 0, 110726, 0, 8711, 6183, 110722, 110723, 0, 0, 7623, 0, 0, 9235, 12760, 74176, 0, 0, 0, 0, 3743, 11514, 11078, 74582, 0, 0, 126597, @@ -23599,294 +24399,297 @@ static const unsigned int code_hash[] = { 0, 92541, 128017, 126087, 126590, 0, 12767, 0, 983375, 64261, 0, 127537, 70852, 70347, 0, 6673, 0, 0, 129346, 12438, 0, 0, 0, 71128, 0, 9053, 43954, 74523, 0, 0, 0, 6195, 0, 6660, 0, 917760, 917793, 0, 12629, 0, 0, - 0, 0, 0, 127940, 0, 0, 0, 65448, 0, 0, 121084, 0, 43949, 0, 78099, 0, 0, - 0, 0, 0, 5741, 1131, 0, 0, 74862, 0, 43952, 42533, 119598, 78107, 0, 0, - 43950, 121297, 118990, 7691, 43951, 578, 0, 0, 0, 42514, 74547, 74196, - 120608, 74561, 0, 983957, 0, 0, 0, 0, 0, 0, 0, 0, 7241, 0, 93846, 119167, - 0, 12811, 78082, 3946, 0, 10998, 66807, 673, 0, 0, 0, 0, 119301, 0, - 68890, 0, 0, 78085, 10267, 0, 74560, 78083, 0, 8729, 0, 0, 0, 0, 0, 0, 0, - 119296, 0, 0, 0, 120853, 983458, 731, 0, 71904, 128316, 0, 0, 0, 1175, 0, - 68167, 0, 0, 10793, 0, 67644, 7723, 983453, 0, 0, 0, 0, 5273, 0, 5269, 0, - 69607, 2404, 5267, 124967, 0, 0, 5277, 0, 0, 6189, 65469, 1314, 0, 0, - 118873, 8785, 0, 0, 127527, 68414, 43535, 9204, 0, 3879, 0, 71696, 6197, - 9497, 0, 7567, 64484, 78128, 41390, 41379, 41882, 67647, 67279, 70085, 0, - 121413, 41388, 64446, 41392, 64288, 41387, 0, 8706, 10675, 0, 700, 0, - 5775, 0, 7088, 74756, 7499, 0, 78120, 78111, 67251, 126557, 0, 0, 128945, - 10311, 78115, 6665, 11115, 0, 7618, 10821, 11455, 0, 64632, 64447, 0, 0, - 78093, 78091, 0, 0, 65033, 0, 6668, 0, 0, 0, 656, 69686, 65037, 0, 0, 0, - 0, 0, 0, 0, 73014, 0, 0, 917774, 9702, 0, 92273, 66580, 118895, 66683, - 43640, 3417, 0, 6832, 0, 917768, 0, 917767, 0, 4935, 11906, 0, 0, 67296, - 92896, 3651, 0, 67294, 70848, 0, 67292, 0, 12983, 0, 55272, 0, 0, 1439, - 0, 74897, 0, 0, 0, 78373, 0, 42087, 3063, 0, 0, 7838, 0, 129282, 0, 0, - 67968, 0, 128582, 9078, 92446, 0, 0, 0, 0, 0, 0, 119586, 0, 7750, 128422, - 68237, 6190, 0, 0, 0, 72340, 9857, 7014, 9856, 0, 92620, 120547, 0, 8481, - 0, 6202, 0, 10920, 67970, 0, 0, 983292, 0, 7843, 65818, 66824, 0, 0, 0, - 0, 0, 0, 0, 6657, 207, 0, 69728, 74819, 0, 0, 0, 0, 0, 0, 0, 0, 41368, - 43974, 488, 0, 0, 71339, 10157, 0, 43034, 11982, 0, 0, 0, 0, 0, 41372, - 6669, 8504, 72103, 0, 41367, 129328, 119272, 0, 11726, 8261, 0, 304, 0, - 0, 0, 0, 113683, 983235, 238, 74522, 0, 0, 19905, 120577, 983469, 0, - 41044, 67640, 67302, 64814, 9912, 65939, 983465, 0, 0, 0, 0, 0, 0, 309, - 6622, 0, 10858, 0, 67636, 0, 72749, 0, 0, 0, 67637, 123138, 9712, 68680, - 43970, 0, 65165, 93047, 0, 0, 0, 0, 0, 0, 6191, 12944, 0, 0, 67634, - 43763, 0, 0, 67635, 9370, 41381, 0, 0, 123148, 118817, 0, 3222, 121439, - 0, 0, 66663, 0, 0, 0, 0, 0, 65732, 121144, 0, 0, 0, 0, 67309, 72192, - 41383, 64568, 0, 0, 0, 0, 983990, 66725, 0, 0, 0, 0, 0, 67306, 3632, - 128246, 0, 8376, 3648, 0, 74844, 67639, 3636, 0, 3650, 8837, 0, 0, 0, - 43250, 41562, 0, 0, 68839, 3640, 127190, 0, 11781, 0, 0, 0, 0, 0, 0, - 126649, 0, 42080, 2529, 0, 78004, 0, 42083, 0, 0, 120531, 67619, 0, 0, - 9634, 0, 0, 0, 0, 0, 0, 0, 68841, 0, 92545, 68874, 0, 0, 0, 41987, - 119667, 67623, 983760, 0, 925, 127156, 0, 41985, 64441, 9586, 120988, - 41984, 9217, 128372, 0, 0, 9186, 67620, 4016, 983815, 0, 381, 0, 0, - 42077, 0, 128777, 67622, 42078, 0, 10810, 0, 4585, 19943, 5860, 67633, 0, - 0, 812, 0, 0, 0, 92518, 0, 0, 0, 0, 67629, 0, 10692, 0, 67630, 0, 924, 0, - 67631, 42616, 0, 0, 0, 67317, 67632, 0, 12771, 12736, 12753, 0, 983734, - 67626, 67722, 0, 0, 0, 0, 12751, 74906, 8542, 0, 0, 3626, 66706, 0, 0, - 3883, 64388, 0, 0, 0, 0, 0, 0, 126268, 67624, 0, 10932, 0, 65585, 64338, - 806, 0, 41884, 110845, 1318, 128828, 0, 0, 0, 983789, 3465, 2405, 983390, - 0, 12756, 65259, 69381, 983793, 12752, 5833, 1432, 110843, 41883, 110841, - 9799, 0, 41886, 0, 0, 2062, 0, 0, 0, 0, 129376, 0, 124969, 0, 0, 120971, - 0, 118832, 0, 0, 0, 68005, 10622, 0, 0, 0, 6566, 71195, 0, 73780, 0, - 68865, 0, 0, 0, 8284, 0, 0, 0, 0, 0, 43023, 0, 983285, 6642, 3977, 72743, - 64729, 836, 983381, 92947, 0, 0, 0, 0, 0, 0, 125239, 917923, 0, 0, 0, 0, - 0, 0, 1374, 65149, 119014, 67720, 0, 2273, 0, 0, 0, 11234, 0, 0, 9630, - 12597, 0, 0, 0, 6661, 0, 113751, 0, 125015, 0, 0, 72151, 0, 73674, 7718, - 113755, 0, 0, 0, 0, 983758, 0, 0, 0, 127841, 6365, 1887, 0, 0, 8080, - 113681, 0, 0, 0, 0, 1544, 0, 0, 64677, 0, 0, 0, 0, 119019, 0, 0, 12812, - 7342, 0, 73784, 0, 7904, 0, 0, 120910, 0, 0, 0, 0, 9724, 0, 983785, 9524, - 0, 0, 0, 0, 0, 129344, 0, 471, 0, 0, 128302, 0, 0, 0, 983750, 0, 0, 6918, - 0, 0, 5156, 0, 128683, 10232, 10615, 10213, 0, 0, 42528, 0, 0, 0, 0, - 65311, 74935, 0, 13306, 10533, 7870, 0, 7625, 0, 120544, 0, 0, 128816, - 126098, 0, 0, 0, 0, 0, 92341, 0, 12978, 128533, 0, 0, 43836, 42675, 0, - 12845, 0, 19942, 0, 0, 0, 0, 0, 120000, 120008, 120001, 0, 194894, 0, 0, - 0, 0, 7186, 73107, 0, 70093, 445, 0, 0, 0, 0, 73047, 0, 0, 128442, 0, 0, - 0, 3902, 68913, 0, 0, 0, 1560, 43958, 0, 4584, 0, 67862, 0, 10866, 92905, - 1118, 92209, 74888, 0, 1081, 7436, 11147, 7252, 0, 121188, 0, 0, 0, - 41386, 5162, 0, 1330, 0, 121270, 0, 12047, 7675, 0, 0, 1848, 74528, - 983147, 64708, 0, 0, 194880, 0, 0, 0, 983753, 12715, 128349, 0, 0, 0, - 66672, 73710, 66685, 0, 0, 92464, 0, 68884, 0, 72835, 0, 70800, 70101, - 120725, 0, 194893, 9214, 43494, 0, 0, 120841, 0, 0, 6313, 65513, 0, 0, 0, - 0, 2345, 72975, 0, 0, 0, 0, 3117, 0, 71882, 0, 73100, 0, 0, 0, 0, 78415, - 983232, 100907, 0, 13248, 0, 120241, 129416, 128415, 0, 121009, 12382, - 71120, 0, 0, 0, 0, 1471, 0, 113747, 0, 12378, 0, 69664, 0, 12374, 121357, - 0, 0, 0, 0, 0, 0, 12376, 0, 0, 0, 12380, 10557, 0, 12520, 11122, 2024, - 127180, 0, 0, 74588, 0, 0, 70120, 3853, 0, 0, 0, 983744, 0, 0, 12090, 0, - 12474, 92579, 9503, 0, 0, 983271, 68318, 0, 110834, 0, 0, 0, 12470, 0, - 74189, 2742, 12476, 66370, 10946, 0, 12472, 0, 0, 0, 0, 8213, 43824, - 7771, 6161, 983275, 68010, 0, 0, 0, 68235, 0, 0, 0, 120985, 0, 0, 0, 0, - 73791, 0, 68871, 0, 0, 0, 0, 0, 73704, 12015, 128561, 8275, 0, 43459, - 120927, 127555, 0, 0, 0, 68881, 71215, 0, 118841, 0, 12516, 4444, 0, - 119017, 120506, 10892, 118828, 0, 6473, 0, 0, 71735, 3591, 0, 0, 0, 0, - 72345, 0, 0, 0, 127547, 0, 0, 0, 0, 128253, 0, 0, 0, 0, 94060, 687, 0, 0, - 983399, 0, 0, 68671, 0, 128526, 285, 0, 0, 0, 4459, 0, 0, 74917, 0, 0, - 126255, 0, 119248, 0, 9743, 0, 0, 126535, 0, 0, 73104, 0, 69659, 0, 0, - 3081, 74577, 42921, 0, 0, 0, 0, 0, 0, 0, 9125, 119023, 0, 120820, 0, - 65221, 0, 0, 64852, 0, 0, 0, 0, 66578, 5001, 41879, 0, 0, 5003, 884, 0, - 0, 4943, 5150, 73889, 74182, 0, 41876, 0, 0, 42448, 42299, 72804, 0, 0, - 0, 0, 8491, 0, 0, 983635, 4530, 42409, 7126, 119526, 66200, 0, 0, 19929, - 0, 0, 0, 4242, 0, 0, 0, 0, 66034, 65941, 124929, 64522, 10740, 8958, - 128257, 9754, 119102, 983246, 74222, 983244, 983243, 119064, 983241, - 983240, 0, 0, 0, 74518, 66026, 4306, 41468, 68432, 0, 0, 66667, 0, 0, - 983494, 42200, 0, 0, 0, 120236, 6948, 0, 8524, 0, 0, 12385, 0, 74926, 0, - 1386, 73996, 0, 0, 0, 121184, 12392, 0, 8064, 0, 0, 78216, 119004, 2080, - 710, 128491, 12390, 1666, 42091, 0, 12383, 92968, 42092, 68418, 0, - 128106, 0, 0, 42096, 0, 3362, 12377, 127878, 0, 0, 0, 0, 1244, 4401, - 73786, 12683, 10662, 0, 8112, 0, 119021, 121017, 12379, 73108, 120534, 0, - 42208, 0, 12381, 0, 0, 0, 4327, 0, 0, 128350, 0, 78232, 0, 584, 12933, 0, - 12373, 73105, 13000, 0, 2935, 129113, 12665, 0, 43081, 73098, 120505, - 12427, 0, 983625, 78227, 0, 0, 0, 0, 0, 74551, 0, 0, 12426, 0, 0, 0, - 12428, 0, 0, 0, 0, 0, 12429, 6727, 0, 0, 0, 3387, 0, 0, 0, 0, 0, 0, - 74427, 0, 3536, 120589, 9752, 92397, 6162, 0, 0, 10113, 0, 0, 0, 12422, - 0, 439, 3072, 0, 42207, 74549, 120830, 0, 0, 0, 0, 8308, 0, 70807, 0, 0, - 0, 13218, 0, 0, 8082, 12424, 0, 6819, 3539, 93838, 0, 0, 74539, 0, 68181, - 0, 72964, 0, 72969, 12420, 11371, 0, 4600, 0, 127810, 0, 0, 0, 72962, - 128552, 6704, 4591, 72966, 0, 0, 0, 72960, 120623, 561, 12159, 78223, 0, - 78224, 0, 71068, 11932, 7172, 42687, 8368, 0, 0, 93068, 0, 0, 75010, 0, - 0, 0, 0, 42463, 0, 2924, 67183, 0, 0, 0, 128958, 0, 0, 42330, 73079, - 3969, 0, 0, 7169, 1992, 9652, 0, 0, 42086, 0, 100865, 0, 0, 0, 0, 0, 327, - 0, 0, 0, 0, 0, 12433, 0, 0, 0, 12431, 0, 12434, 983434, 0, 0, 0, 7712, + 0, 0, 0, 127940, 0, 0, 0, 65448, 0, 0, 121084, 129688, 43949, 0, 78099, + 0, 983380, 0, 0, 0, 5741, 1131, 0, 0, 74862, 0, 43952, 42533, 119598, + 78107, 0, 0, 43950, 121297, 118990, 7691, 43951, 578, 0, 0, 0, 42514, + 74547, 74196, 120608, 74561, 0, 983957, 0, 0, 0, 0, 0, 0, 0, 0, 7241, 0, + 93846, 119167, 0, 12811, 78082, 3946, 0, 10998, 66807, 673, 0, 0, 0, 0, + 119301, 0, 68890, 0, 0, 78085, 10267, 0, 74560, 78083, 0, 8729, 0, 0, 0, + 0, 0, 0, 0, 119296, 0, 0, 0, 120853, 983458, 731, 0, 71904, 128316, 0, 0, + 0, 1175, 0, 68167, 0, 0, 10793, 0, 67644, 7723, 983453, 0, 0, 0, 0, 5273, + 0, 5269, 0, 69607, 2404, 5267, 124967, 0, 0, 5277, 0, 0, 6189, 65469, + 1314, 0, 0, 118873, 8785, 0, 0, 127527, 68414, 43535, 9204, 0, 3879, 0, + 71696, 6197, 9497, 0, 7567, 64484, 78128, 41390, 41379, 41882, 67647, + 67279, 70085, 0, 121413, 41388, 64446, 41392, 64288, 41387, 0, 8706, + 10675, 0, 700, 0, 5775, 0, 7088, 74756, 7499, 0, 78120, 78111, 67251, + 126557, 0, 0, 128945, 10311, 78115, 6665, 11115, 0, 7618, 10821, 11455, + 0, 64632, 64447, 0, 0, 78093, 78091, 0, 0, 65033, 0, 6668, 0, 0, 0, 656, + 69686, 65037, 0, 0, 0, 0, 0, 0, 0, 73014, 0, 0, 917774, 9702, 0, 92273, + 66580, 118895, 66683, 43640, 3417, 0, 6832, 0, 917768, 0, 917767, 0, + 4935, 11906, 0, 0, 67296, 92896, 3651, 0, 67294, 70848, 0, 67292, 0, + 12983, 0, 55272, 0, 0, 1439, 0, 74897, 0, 0, 0, 78373, 0, 42087, 3063, 0, + 0, 7838, 0, 129282, 0, 0, 67968, 0, 128582, 9078, 92446, 0, 0, 0, 0, 0, + 0, 119586, 0, 7750, 128422, 68237, 6190, 0, 0, 0, 72340, 9857, 7014, + 9856, 0, 92620, 120547, 0, 8481, 0, 6202, 0, 10920, 67970, 0, 0, 983292, + 0, 7843, 65818, 66824, 0, 0, 0, 0, 0, 0, 0, 6657, 207, 0, 69728, 74819, + 0, 0, 0, 0, 0, 0, 0, 0, 41368, 43974, 488, 0, 0, 71339, 10157, 0, 43034, + 11982, 0, 0, 0, 0, 0, 41372, 6669, 8504, 72103, 0, 41367, 129328, 119272, + 0, 11726, 8261, 129793, 304, 129799, 129795, 129822, 129807, 113683, + 983235, 238, 74522, 0, 0, 19905, 120577, 983469, 129200, 41044, 67640, + 67302, 64814, 9912, 65939, 983465, 0, 0, 0, 0, 0, 0, 309, 6622, 0, 10858, + 0, 67636, 0, 72749, 0, 0, 0, 67637, 123138, 9712, 68680, 43970, 0, 65165, + 93047, 0, 0, 0, 0, 0, 0, 6191, 12944, 0, 0, 67634, 43763, 0, 0, 67635, + 9370, 41381, 0, 0, 123148, 118817, 0, 3222, 121439, 0, 0, 66663, 0, 0, 0, + 0, 0, 65732, 121144, 0, 0, 0, 0, 67309, 72192, 41383, 64568, 0, 0, 0, 0, + 983990, 66725, 0, 0, 0, 0, 0, 67306, 3632, 128246, 0, 8376, 3648, 0, + 74844, 67639, 3636, 0, 3650, 8837, 0, 0, 0, 43250, 41562, 0, 0, 68839, + 3640, 127190, 0, 11781, 0, 0, 0, 0, 0, 0, 126649, 0, 42080, 2529, 0, + 78004, 0, 42083, 0, 0, 120531, 67619, 0, 0, 9634, 0, 0, 0, 0, 0, 0, 0, + 68841, 0, 92545, 68874, 127399, 0, 0, 41987, 119667, 67623, 983760, 0, + 925, 127156, 0, 41985, 64441, 9586, 120988, 41984, 9217, 128372, 0, 0, + 9186, 67620, 4016, 983815, 0, 381, 983681, 0, 42077, 0, 128777, 67622, + 42078, 0, 10810, 0, 4585, 19943, 5860, 67633, 0, 0, 812, 0, 0, 0, 92518, + 0, 0, 0, 0, 67629, 0, 10692, 0, 67630, 0, 924, 0, 67631, 42616, 0, 0, 0, + 67317, 67632, 0, 12771, 12736, 12753, 0, 983734, 67626, 67722, 0, 0, 0, + 0, 12751, 74906, 8542, 0, 0, 3626, 66706, 0, 0, 3883, 64388, 0, 0, 0, 0, + 0, 0, 126268, 67624, 0, 10932, 0, 65585, 64338, 806, 0, 41884, 110845, + 1318, 128828, 0, 0, 0, 983789, 3465, 2405, 983390, 0, 12756, 65259, + 69381, 983793, 12752, 5833, 1432, 110843, 41883, 110841, 9799, 0, 41886, + 0, 0, 2062, 0, 0, 0, 0, 129376, 0, 124969, 983387, 0, 120971, 0, 118832, + 0, 983281, 0, 68005, 10622, 0, 0, 0, 6566, 71195, 0, 73780, 0, 68865, 0, + 0, 0, 8284, 0, 0, 0, 0, 0, 43023, 0, 983285, 6642, 3977, 72743, 64729, + 836, 983381, 92947, 0, 0, 0, 0, 0, 0, 125239, 917923, 0, 0, 0, 0, 0, 0, + 1374, 65149, 119014, 67720, 0, 2273, 0, 0, 0, 11234, 0, 0, 9630, 12597, + 0, 0, 0, 6661, 0, 113751, 120551, 125015, 0, 0, 72151, 0, 73674, 7718, + 113755, 0, 69570, 0, 0, 983758, 0, 0, 0, 127841, 6365, 1887, 983409, 0, + 8080, 113681, 0, 0, 0, 129855, 1544, 0, 0, 64677, 0, 0, 0, 0, 119019, 0, + 0, 12812, 7342, 0, 73784, 0, 7904, 0, 0, 120910, 0, 0, 0, 0, 9724, 0, + 983785, 9524, 0, 0, 0, 0, 0, 129344, 0, 471, 0, 0, 128302, 0, 0, 0, + 983750, 0, 0, 6918, 0, 0, 5156, 0, 128683, 10232, 10615, 10213, 0, 0, + 42528, 0, 0, 0, 0, 65311, 74935, 0, 13306, 10533, 7870, 0, 7625, 0, + 120544, 0, 0, 128816, 126098, 0, 0, 0, 0, 0, 92341, 0, 12978, 128533, 0, + 0, 43836, 42675, 0, 12845, 0, 19942, 0, 0, 0, 0, 0, 120000, 120008, + 120001, 0, 194894, 0, 0, 0, 0, 7186, 73107, 0, 70093, 445, 119028, 0, 0, + 0, 73047, 0, 0, 128442, 0, 0, 0, 3902, 68913, 129916, 0, 0, 1560, 43958, + 0, 4584, 0, 67862, 0, 10866, 92905, 1118, 92209, 74888, 0, 1081, 7436, + 11147, 7252, 0, 121188, 0, 0, 0, 41386, 5162, 129823, 1330, 0, 121270, 0, + 12047, 7675, 0, 0, 1848, 74528, 983147, 64708, 0, 0, 194880, 0, 0, 0, + 983753, 12715, 128349, 0, 0, 0, 66672, 73710, 66685, 0, 0, 92464, 0, + 68884, 0, 72835, 0, 70800, 70101, 120725, 0, 194893, 9214, 43494, 0, 0, + 120841, 0, 0, 6313, 65513, 0, 0, 0, 0, 2345, 72975, 0, 0, 129937, 0, + 3117, 0, 71882, 0, 73100, 0, 0, 0, 0, 78415, 983232, 100907, 0, 13248, 0, + 120241, 129416, 128415, 0, 94193, 12382, 71120, 0, 0, 0, 0, 1471, 0, + 113747, 0, 12378, 0, 69664, 0, 12374, 121357, 0, 0, 0, 0, 0, 0, 12376, 0, + 0, 0, 12380, 10557, 0, 12520, 11122, 2024, 127180, 0, 0, 74588, 0, 0, + 70120, 3853, 0, 0, 0, 983744, 0, 0, 12090, 0, 12474, 92579, 9503, 0, 0, + 983271, 68318, 0, 110834, 0, 0, 0, 12470, 0, 74189, 2742, 12476, 66370, + 10946, 0, 12472, 0, 0, 0, 0, 8213, 43824, 7771, 6161, 983275, 68010, 0, + 0, 0, 68235, 0, 0, 0, 120985, 0, 0, 0, 129814, 73791, 129830, 68871, 0, + 0, 0, 0, 0, 73704, 12015, 128561, 8275, 0, 43459, 120927, 127555, 0, 0, + 0, 68881, 71215, 0, 118841, 0, 12516, 4444, 0, 119017, 120506, 10892, + 118828, 0, 6473, 0, 0, 71735, 3591, 0, 0, 0, 0, 72345, 0, 0, 0, 127547, + 0, 0, 0, 0, 128253, 0, 0, 0, 0, 94060, 687, 0, 0, 983399, 0, 0, 43882, 0, + 128526, 285, 0, 0, 0, 4459, 0, 0, 74917, 0, 0, 126255, 0, 119248, 0, + 9743, 0, 0, 126535, 0, 0, 73104, 0, 69659, 0, 0, 3081, 74577, 42921, 0, + 0, 0, 0, 0, 0, 0, 9125, 119023, 0, 120820, 0, 65221, 0, 0, 64852, 0, 0, + 0, 0, 66578, 5001, 41879, 0, 0, 5003, 884, 0, 0, 4943, 5150, 73889, + 74182, 0, 41876, 0, 0, 42448, 42299, 72804, 0, 0, 0, 0, 8491, 0, 0, + 983635, 4530, 42409, 7126, 119526, 66200, 0, 0, 19929, 0, 0, 0, 4242, 0, + 0, 0, 0, 66034, 65941, 124929, 64522, 10740, 8958, 128257, 9754, 119102, + 983246, 74222, 983244, 983243, 119064, 983241, 983240, 0, 0, 0, 74518, + 66026, 4306, 41468, 68432, 0, 0, 66667, 0, 0, 983494, 42200, 0, 0, 0, + 120236, 6948, 0, 8524, 0, 0, 12385, 0, 74926, 0, 1386, 73996, 0, 0, 0, + 121184, 12392, 0, 8064, 0, 0, 78216, 119004, 2080, 710, 128491, 12390, + 1666, 42091, 0, 12383, 92968, 42092, 68418, 0, 128106, 0, 0, 42096, 0, + 3362, 12377, 127878, 0, 0, 0, 0, 1244, 4401, 73786, 12683, 10662, 0, + 8112, 129837, 119021, 121017, 12379, 73108, 120534, 0, 42208, 0, 12381, + 0, 0, 0, 4327, 0, 0, 128350, 0, 78232, 0, 584, 12933, 0, 12373, 73105, + 13000, 0, 2935, 129113, 12665, 0, 43081, 73098, 120505, 12427, 0, 983625, + 78227, 0, 0, 0, 0, 128760, 74551, 0, 0, 12426, 0, 0, 0, 12428, 0, 0, 0, + 0, 0, 12429, 6727, 0, 0, 0, 3387, 0, 0, 0, 0, 0, 0, 74427, 0, 3536, + 120589, 9752, 92397, 6162, 0, 0, 10113, 0, 0, 0, 12422, 0, 439, 3072, 0, + 42207, 74549, 120830, 0, 0, 0, 0, 8308, 0, 70807, 0, 0, 0, 13218, 0, 0, + 8082, 12424, 0, 6819, 3539, 93838, 0, 0, 74539, 0, 68181, 0, 72964, 0, + 72969, 12420, 11371, 0, 4600, 0, 127810, 0, 0, 0, 72962, 128552, 6704, + 4591, 72966, 0, 0, 0, 72960, 120623, 561, 12159, 78223, 0, 78224, 0, + 71068, 11932, 7172, 42687, 8368, 0, 0, 93068, 0, 0, 75010, 0, 0, 0, 0, + 42463, 0, 2924, 67183, 0, 129947, 0, 128958, 0, 0, 42330, 73079, 3969, 0, + 129973, 7169, 1992, 9652, 0, 0, 42086, 0, 100865, 0, 0, 0, 0, 0, 327, 0, + 0, 0, 0, 0, 12433, 0, 0, 0, 12431, 0, 12434, 983434, 0, 0, 0, 7712, 12432, 0, 69377, 129147, 100867, 0, 8212, 0, 128014, 0, 119066, 7333, 0, 0, 0, 67407, 70006, 128461, 0, 12436, 0, 43160, 0, 74896, 92757, 71360, 42350, 0, 0, 0, 100566, 0, 11348, 0, 0, 9194, 983184, 0, 55250, 0, 100569, 0, 0, 0, 0, 0, 64746, 66012, 100565, 3444, 75029, 64651, 0, 41503, 0, 0, 0, 0, 0, 0, 0, 120876, 0, 0, 129408, 65309, 12416, 0, 0, 0, - 0, 93024, 12418, 74111, 121046, 0, 0, 0, 0, 0, 4596, 66339, 12417, 66001, - 0, 126491, 12414, 8287, 0, 0, 0, 1143, 0, 0, 12415, 0, 0, 983242, 0, - 9021, 120783, 0, 11724, 0, 0, 0, 194794, 0, 0, 8027, 194796, 74257, + 0, 93024, 12418, 74111, 121046, 0, 0, 0, 119361, 0, 4596, 66339, 12417, + 66001, 0, 126491, 12414, 8287, 0, 0, 0, 1143, 0, 0, 12415, 0, 0, 983242, + 0, 9021, 120783, 0, 11724, 0, 0, 0, 194794, 0, 0, 8027, 194796, 74257, 127375, 11400, 74197, 194799, 66833, 194798, 0, 0, 983247, 0, 0, 1324, 0, 0, 0, 194878, 7715, 0, 0, 194777, 194780, 0, 0, 0, 194787, 0, 0, 0, 0, 0, 66289, 127109, 3889, 129561, 194800, 0, 0, 0, 0, 121226, 12999, 0, 120902, 0, 0, 0, 0, 0, 64802, 42210, 4597, 0, 0, 0, 12371, 67164, 0, 67163, 10805, 0, 0, 0, 0, 0, 12367, 0, 0, 92557, 12363, 0, 0, 128611, 0, - 0, 0, 8005, 12365, 0, 0, 3756, 12369, 10649, 0, 0, 0, 0, 0, 42923, 0, 0, - 0, 0, 0, 0, 66659, 0, 0, 0, 0, 5268, 4954, 0, 0, 5266, 126980, 5272, + 0, 0, 8005, 12365, 0, 0, 3756, 12369, 10649, 0, 70095, 0, 0, 0, 42923, 0, + 0, 0, 0, 0, 0, 66659, 0, 0, 0, 0, 5268, 4954, 0, 0, 5266, 126980, 5272, 92294, 0, 42230, 983961, 0, 9128, 0, 0, 0, 0, 6928, 9803, 42282, 9110, 1505, 0, 0, 5276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8722, 120805, 0, 0, 66695, 0, 0, 4383, 8900, 0, 0, 74930, 64297, 0, 0, 0, 0, 3419, 42229, 0, 0, 8911, 0, 42353, 0, 0, 0, 0, 0, 0, 0, 100629, 41576, 42215, 122888, 0, 0, 8578, 68178, 7573, 41575, 74789, 92310, 0, 73863, 0, 2670, 0, 0, 11723, - 0, 0, 0, 0, 0, 43414, 0, 0, 65675, 0, 67179, 67168, 12413, 0, 67177, 0, - 0, 0, 0, 12302, 0, 5250, 12407, 12245, 4404, 9189, 12401, 42007, 0, + 0, 0, 0, 0, 0, 43414, 0, 0, 65675, 0, 67179, 67168, 12413, 129746, 67177, + 0, 0, 0, 0, 12302, 0, 5250, 12407, 12245, 4404, 9189, 12401, 42007, 0, 42005, 65806, 43997, 122922, 42002, 12404, 0, 74928, 4940, 12410, 0, 128761, 0, 64567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11956, 0, 0, 122882, 0, - 6631, 128923, 0, 74583, 42218, 0, 0, 0, 0, 0, 0, 71058, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 43370, 0, 5016, 121052, 0, 0, 9491, 0, 0, 0, 0, 64922, 0, 0, 0, - 0, 92198, 0, 0, 0, 74619, 0, 0, 70422, 983669, 10565, 0, 12177, 0, 0, 0, - 0, 0, 12395, 127874, 12878, 92630, 12396, 0, 0, 92537, 0, 43113, 0, 0, 0, - 9781, 0, 4927, 0, 0, 0, 0, 12397, 129089, 128910, 0, 12394, 0, 0, 0, 0, - 0, 72789, 10781, 1546, 0, 5010, 0, 10507, 127891, 128291, 0, 0, 0, 0, - 7267, 0, 0, 0, 0, 2819, 0, 0, 71063, 0, 7266, 128553, 7264, 7265, 0, - 1363, 0, 119581, 65080, 0, 0, 0, 0, 43336, 0, 0, 126263, 73776, 0, 43339, - 0, 9836, 0, 0, 0, 43335, 41276, 0, 73795, 43337, 817, 11211, 9922, - 128841, 41274, 11340, 42408, 42447, 74932, 0, 0, 12386, 0, 0, 0, 12389, - 128398, 0, 41996, 41686, 0, 8269, 1147, 43849, 120896, 1987, 128540, - 43195, 42001, 41990, 41999, 12391, 0, 0, 4939, 12384, 0, 0, 43243, 0, 0, - 0, 0, 0, 0, 0, 0, 8247, 0, 0, 7545, 0, 43643, 121445, 0, 10036, 0, - 119813, 10178, 119816, 0, 119815, 11762, 119818, 0, 92282, 120597, 0, 0, - 119819, 0, 0, 7719, 0, 2486, 0, 119808, 1507, 0, 129185, 70301, 9687, - 119826, 0, 119811, 66196, 0, 5262, 0, 74642, 12681, 0, 0, 12406, 12219, - 0, 127528, 42810, 110991, 0, 983673, 128144, 121027, 126096, 120753, - 12403, 2500, 0, 0, 12409, 0, 0, 0, 74113, 2343, 12412, 19946, 74112, - 125042, 13112, 0, 120603, 67866, 110634, 0, 66369, 5861, 110632, 11999, - 12400, 0, 0, 12645, 0, 11320, 68410, 6748, 65040, 0, 64184, 12974, 66927, - 67613, 120645, 0, 0, 0, 0, 0, 1928, 0, 67649, 0, 0, 67609, 11235, 0, 0, - 67610, 8241, 0, 0, 4206, 0, 0, 0, 128298, 110980, 0, 67238, 0, 0, 0, - 1422, 8357, 0, 7187, 0, 120641, 0, 0, 0, 0, 125022, 111064, 92539, 10120, - 12405, 0, 72997, 0, 13278, 0, 6366, 0, 7945, 0, 4402, 0, 12402, 129372, - 0, 74754, 12408, 0, 44007, 0, 0, 0, 12411, 0, 120824, 128306, 121092, 0, - 1575, 0, 0, 0, 73003, 119622, 0, 0, 12399, 0, 6833, 0, 0, 0, 71878, 9692, - 0, 0, 100615, 6750, 66855, 0, 0, 0, 0, 43527, 0, 727, 0, 0, 0, 0, 6726, - 0, 0, 12370, 44023, 0, 126592, 2280, 0, 12372, 120642, 0, 0, 0, 0, 12366, - 10963, 6066, 1329, 0, 3052, 72987, 0, 66029, 0, 10803, 0, 0, 0, 92473, 0, - 0, 0, 0, 1499, 0, 0, 42740, 0, 0, 0, 0, 12056, 126484, 0, 3660, 69404, - 42192, 74253, 0, 42223, 67617, 125254, 0, 0, 0, 0, 9941, 0, 0, 1933, 0, - 0, 0, 0, 73866, 0, 0, 2487, 67614, 7361, 1804, 0, 67615, 0, 0, 12220, - 67616, 0, 0, 0, 68200, 6675, 0, 0, 67592, 126582, 0, 64771, 0, 9132, 0, - 111004, 510, 0, 0, 0, 4561, 7711, 92769, 92944, 111007, 0, 41569, 121282, - 0, 8167, 66885, 0, 0, 0, 69992, 66403, 6967, 0, 0, 0, 0, 333, 0, 0, - 10566, 66409, 0, 121373, 0, 72965, 110999, 66388, 6678, 0, 0, 12621, 0, - 128775, 10227, 4764, 0, 9981, 0, 70278, 11589, 0, 0, 42202, 12754, 0, 0, - 0, 0, 67594, 2048, 0, 4050, 67595, 0, 0, 43221, 11184, 72709, 0, 0, - 64175, 0, 72746, 0, 0, 0, 65461, 9798, 0, 71210, 0, 69841, 0, 952, - 128235, 125107, 0, 70296, 6449, 72102, 0, 0, 43098, 64171, 8142, 64160, - 0, 0, 0, 0, 0, 0, 0, 0, 67597, 6676, 3930, 42615, 73124, 69991, 67598, 0, - 0, 0, 65591, 41581, 128056, 1453, 0, 0, 0, 8500, 42222, 0, 119270, 72992, - 69996, 0, 0, 64676, 0, 0, 67606, 66385, 0, 42217, 13102, 0, 67607, 6672, - 0, 0, 0, 0, 67608, 0, 9001, 0, 11274, 67601, 0, 64210, 6664, 0, 42056, - 67602, 0, 0, 0, 0, 1469, 67603, 65381, 69921, 4988, 42372, 0, 9598, 904, - 352, 42225, 0, 8061, 10673, 0, 0, 128276, 67600, 0, 0, 127293, 8575, - 127295, 127296, 127289, 127290, 127291, 127292, 127285, 127286, 127287, - 118877, 127281, 127282, 9460, 823, 11587, 0, 0, 0, 127305, 12387, 0, 0, - 127301, 126979, 42783, 69998, 64208, 127298, 127299, 66031, 0, 11606, - 64784, 0, 69973, 0, 0, 0, 5152, 11048, 0, 120121, 67605, 0, 69604, 0, - 70276, 194847, 0, 127052, 42587, 42214, 41394, 0, 4763, 0, 118935, 0, - 5260, 0, 94038, 326, 120131, 74119, 0, 10771, 42198, 194920, 194837, - 194925, 41398, 127079, 41393, 127077, 127076, 453, 41396, 0, 13159, - 11227, 9572, 0, 0, 194576, 128835, 127081, 0, 126617, 43144, 0, 72972, - 194887, 0, 0, 0, 0, 0, 64061, 0, 0, 64056, 70310, 0, 0, 0, 194864, 0, - 111084, 64301, 72998, 10464, 0, 128393, 72847, 0, 11528, 64024, 128072, - 679, 0, 0, 5850, 758, 7536, 0, 0, 43712, 0, 64006, 983579, 64005, 70298, - 0, 126487, 0, 0, 0, 0, 0, 72999, 0, 64027, 64029, 0, 0, 64000, 0, 194874, - 0, 42201, 12421, 194876, 0, 1852, 0, 0, 73744, 0, 64041, 129127, 0, 0, 0, - 92322, 12423, 12854, 0, 3496, 0, 110966, 0, 194823, 0, 0, 6158, 8327, - 74553, 0, 12419, 0, 11570, 0, 0, 123618, 0, 7844, 983801, 194909, 0, - 1682, 93039, 194911, 42756, 6765, 128178, 0, 0, 0, 11412, 6768, 0, - 194830, 71316, 0, 0, 0, 11577, 0, 194829, 1833, 11576, 74334, 0, 0, - 42854, 69438, 0, 70307, 0, 194856, 8085, 0, 194850, 0, 72996, 128778, - 1949, 11614, 7847, 120489, 120997, 64483, 0, 0, 0, 0, 0, 0, 0, 126651, - 42864, 0, 64667, 74624, 0, 0, 43261, 11484, 127535, 67840, 0, 0, 128965, - 0, 72974, 0, 110928, 128454, 3455, 0, 0, 9879, 0, 0, 4158, 128050, 0, 0, - 110929, 0, 0, 0, 332, 118808, 0, 0, 2407, 0, 42199, 92386, 110865, 0, - 77921, 55217, 123161, 125199, 70043, 0, 0, 0, 121093, 1834, 0, 0, 71315, - 0, 65249, 0, 8662, 0, 0, 123153, 0, 11539, 10784, 0, 67674, 0, 92233, 0, - 0, 118858, 0, 0, 0, 0, 0, 0, 12499, 6280, 0, 0, 0, 0, 0, 0, 43851, 6279, - 12508, 0, 12502, 9161, 0, 1620, 0, 3601, 0, 0, 67246, 609, 11555, 0, - 12496, 0, 74181, 120492, 12505, 0, 194902, 0, 43567, 239, 0, 127085, 0, - 0, 42671, 0, 0, 83095, 43565, 127082, 983936, 12696, 127753, 0, 94062, - 12929, 0, 712, 0, 4197, 0, 42818, 0, 70306, 0, 0, 983805, 0, 43562, 0, - 129034, 68076, 0, 111074, 64628, 0, 0, 0, 0, 7494, 0, 4924, 0, 0, 0, 0, - 127088, 0, 127087, 69987, 64796, 0, 0, 12033, 0, 0, 0, 0, 0, 0, 0, 70299, - 0, 0, 68324, 72420, 0, 0, 0, 0, 70309, 127000, 0, 0, 0, 72418, 72963, 0, - 5699, 0, 983879, 9488, 74410, 119112, 70477, 11170, 0, 0, 72312, 0, 5265, - 0, 0, 0, 0, 12464, 0, 43264, 72977, 0, 43345, 0, 0, 120592, 6807, 0, - 9829, 69997, 0, 0, 43346, 11393, 795, 0, 72412, 12462, 72416, 72415, 0, - 0, 64362, 0, 0, 120811, 0, 12468, 8607, 1008, 0, 120670, 0, 0, 67855, - 125018, 127177, 6758, 0, 0, 1820, 41112, 0, 11202, 195083, 0, 13223, 0, - 64595, 0, 0, 0, 0, 12616, 0, 0, 0, 74467, 0, 0, 0, 0, 0, 0, 67233, - 119060, 0, 83448, 19920, 69897, 0, 129057, 0, 1130, 0, 0, 0, 11823, 0, 0, - 118896, 0, 0, 13280, 0, 10747, 118925, 0, 43509, 0, 0, 8959, 0, 6747, 0, - 0, 8568, 0, 120870, 0, 120803, 83060, 42670, 0, 11621, 12460, 0, 0, 0, 0, - 111190, 0, 66570, 72989, 121305, 126476, 120582, 0, 0, 0, 111191, 70308, - 11594, 0, 68333, 69427, 10491, 0, 0, 0, 0, 0, 127506, 0, 194910, 4923, - 65086, 8981, 0, 42133, 0, 72244, 0, 70294, 0, 0, 12485, 0, 8642, 0, - 42766, 0, 2210, 11109, 0, 0, 0, 0, 0, 7398, 0, 0, 0, 8041, 1461, 0, - 119133, 0, 6749, 0, 0, 0, 71705, 0, 0, 68071, 0, 67668, 0, 0, 9193, 0, 0, - 0, 0, 73810, 0, 0, 64305, 0, 0, 623, 781, 670, 10660, 5769, 613, 7543, 0, - 477, 92633, 92521, 0, 592, 0, 12459, 0, 0, 0, 12465, 119578, 654, 11345, - 653, 652, 111250, 647, 0, 633, 120744, 0, 111262, 12480, 74354, 0, 39, - 12487, 0, 0, 74803, 12482, 0, 12489, 0, 128962, 5550, 129175, 0, 0, 0, 0, - 1813, 0, 41311, 111205, 0, 11229, 0, 70496, 1675, 69840, 129435, 0, - 119078, 10070, 10595, 111207, 119077, 111206, 121162, 0, 0, 0, 11222, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 71716, 917841, 0, 0, 270, 0, 0, 0, 0, 0, - 120899, 0, 69741, 0, 0, 68251, 0, 71721, 364, 9595, 0, 0, 0, 707, 0, 0, - 9282, 0, 224, 0, 68670, 9332, 65581, 68677, 0, 68644, 0, 11764, 68634, 0, - 10732, 68640, 850, 0, 0, 71123, 0, 68619, 44008, 68627, 0, 0, 0, 0, 0, 0, - 0, 0, 12507, 0, 0, 128311, 0, 120529, 4375, 0, 0, 0, 12198, 0, 67339, 0, - 0, 72994, 74293, 128434, 0, 0, 64546, 0, 71208, 0, 0, 0, 42334, 42502, 0, - 120887, 72961, 0, 0, 5767, 0, 0, 71710, 8353, 0, 0, 0, 121233, 0, 0, 0, - 0, 119920, 0, 0, 121186, 0, 0, 0, 72719, 64604, 0, 6096, 0, 10063, 0, 0, - 119630, 3485, 12987, 0, 127522, 0, 0, 0, 0, 0, 0, 0, 0, 127173, 0, 0, - 68249, 0, 0, 118923, 0, 64574, 128794, 0, 1640, 12495, 66691, 0, 3138, - 12504, 11171, 1922, 0, 12498, 0, 0, 69939, 0, 65543, 0, 0, 0, 66643, 0, - 120734, 0, 4228, 0, 10303, 0, 0, 0, 10335, 3520, 0, 12490, 0, 0, 0, - 12493, 121452, 64636, 1002, 12491, 0, 0, 92615, 2096, 0, 0, 0, 0, 11611, - 66228, 0, 11241, 66224, 66221, 66226, 66229, 66219, 66231, 66216, 0, - 66236, 66211, 66218, 0, 66240, 78041, 66233, 66217, 0, 7909, 66234, - 11605, 0, 0, 66208, 0, 0, 128282, 73875, 0, 12898, 12494, 120939, 12492, - 0, 0, 0, 74153, 0, 127391, 127489, 4882, 13040, 0, 120762, 4885, 194732, - 0, 13042, 4880, 128834, 2429, 0, 8647, 0, 0, 0, 0, 0, 0, 68896, 0, - 119101, 66693, 0, 1870, 78040, 470, 68893, 78035, 78036, 983581, 78034, - 110607, 110608, 0, 12511, 74453, 12514, 0, 128609, 7239, 7001, 11974, - 121214, 0, 0, 7378, 12512, 11615, 13041, 0, 0, 128057, 13038, 0, 0, - 71717, 70195, 120836, 12510, 127070, 13039, 75019, 12513, 0, 12471, - 110761, 0, 121385, 70193, 0, 0, 0, 71714, 0, 12477, 0, 12473, 7666, - 67362, 237, 6281, 0, 0, 0, 0, 1312, 0, 0, 12469, 0, 0, 64335, 12475, 0, - 69382, 0, 11524, 10367, 10431, 74368, 13017, 3388, 129547, 74372, 0, 0, - 128725, 4932, 0, 0, 13015, 0, 0, 65451, 8185, 0, 0, 43024, 129362, 74375, - 10129, 0, 7948, 9236, 0, 0, 0, 92726, 43473, 6289, 10484, 0, 0, 0, 12082, - 12521, 3147, 110643, 110644, 12524, 110642, 2310, 0, 0, 0, 0, 13013, 0, - 8596, 983852, 10804, 70497, 0, 0, 13014, 12444, 0, 71697, 13016, 0, 0, 0, - 0, 12331, 0, 0, 8744, 726, 121090, 983849, 4155, 0, 0, 0, 71690, 12522, - 73128, 0, 0, 127805, 0, 110647, 0, 0, 983853, 12525, 0, 12523, 2152, - 11969, 120596, 403, 0, 11021, 0, 0, 11030, 8610, 92567, 0, 0, 63998, 0, - 0, 0, 0, 0, 0, 0, 12506, 0, 11146, 71477, 12500, 0, 12509, 0, 0, 0, 0, - 6608, 0, 0, 0, 0, 0, 77995, 0, 3608, 0, 0, 1107, 0, 129658, 0, 0, 0, 0, - 983937, 43217, 66571, 13222, 118963, 0, 126514, 10463, 11553, 0, 63995, - 9043, 128634, 71722, 0, 0, 127751, 92974, 12529, 8042, 0, 2344, 12528, 0, - 0, 0, 69719, 120956, 0, 0, 66512, 0, 12530, 0, 0, 68917, 12658, 0, 71683, - 0, 983237, 0, 127526, 469, 0, 4363, 3313, 0, 0, 2023, 0, 72251, 78225, - 65706, 10051, 78219, 78220, 0, 9920, 12215, 0, 4931, 1951, 12497, 119363, - 0, 0, 119336, 0, 0, 0, 0, 0, 1491, 128578, 129169, 0, 0, 0, 0, 78898, - 94086, 41993, 0, 67379, 0, 0, 0, 0, 9738, 41995, 1075, 0, 12535, 41992, - 0, 0, 0, 0, 128117, 0, 9940, 0, 7692, 0, 9727, 41131, 330, 8566, 0, - 41133, 41117, 128482, 12532, 78550, 78546, 43177, 0, 43235, 0, 917542, - 78229, 78231, 13031, 12910, 67710, 78555, 13028, 78553, 12537, 0, 0, - 71692, 12536, 2350, 13029, 78233, 0, 0, 13030, 0, 4527, 71250, 12538, 0, - 0, 0, 0, 0, 0, 0, 12484, 4032, 71459, 194728, 0, 64344, 0, 66700, 66000, - 8412, 0, 43466, 1296, 2325, 0, 121020, 10149, 74118, 0, 0, 12481, 121280, - 12488, 0, 0, 0, 67972, 0, 2354, 42619, 0, 73027, 6295, 901, 0, 0, 0, 0, - 0, 128653, 11927, 66584, 78559, 78560, 78557, 78558, 0, 74649, 0, 126241, - 67220, 194726, 78568, 67226, 78565, 70190, 78563, 78564, 2352, 67219, - 78569, 78570, 11289, 1407, 67973, 0, 13026, 6762, 10399, 70192, 13023, - 78578, 9777, 67208, 1871, 0, 0, 0, 13024, 983835, 0, 9325, 6818, 6283, - 11738, 0, 0, 0, 11741, 0, 0, 9216, 8263, 11279, 0, 983837, 0, 13021, - 71922, 3136, 0, 983840, 0, 13022, 129143, 9956, 0, 0, 0, 42580, 0, 0, 0, - 13020, 10024, 0, 94013, 0, 0, 0, 43001, 8029, 0, 0, 0, 3335, 0, 9209, - 13048, 73126, 0, 0, 0, 3333, 119100, 0, 0, 3342, 78582, 78583, 73056, - 78581, 4156, 0, 0, 0, 78591, 1611, 73058, 13018, 78586, 78588, 78584, - 3337, 4537, 78593, 11736, 0, 0, 0, 4214, 73790, 0, 0, 13046, 0, 425, + 6631, 128923, 0, 74583, 42218, 0, 0, 70094, 0, 0, 0, 71058, 0, 0, 0, + 127341, 0, 0, 0, 0, 0, 43370, 0, 5016, 121052, 0, 0, 9491, 0, 0, 0, 0, + 64922, 0, 0, 0, 0, 92198, 0, 0, 0, 74619, 0, 0, 70422, 983669, 10565, 0, + 12177, 0, 0, 0, 0, 0, 12395, 127874, 12878, 92630, 12396, 0, 0, 92537, 0, + 43113, 0, 0, 0, 9781, 0, 4927, 0, 0, 0, 0, 12397, 129089, 128910, 0, + 12394, 0, 0, 0, 0, 0, 72789, 10781, 1546, 0, 5010, 0, 10507, 127891, + 128291, 0, 0, 0, 0, 7267, 0, 0, 0, 0, 2819, 0, 0, 71063, 0, 7266, 128553, + 7264, 7265, 0, 1363, 0, 119581, 65080, 0, 0, 0, 0, 43336, 0, 0, 126263, + 73776, 0, 43339, 0, 9836, 0, 0, 0, 43335, 41276, 0, 73795, 43337, 817, + 11211, 2241, 128841, 41274, 11340, 42408, 42447, 74932, 0, 0, 12386, 0, + 0, 0, 12389, 128398, 0, 41996, 41686, 0, 8269, 1147, 43849, 120896, 1987, + 128540, 43195, 42001, 41990, 41999, 12391, 0, 0, 4939, 12384, 0, 0, + 43243, 0, 0, 70746, 0, 0, 0, 0, 0, 8247, 0, 0, 7545, 0, 43643, 121445, 0, + 10036, 0, 119813, 10178, 119816, 0, 119815, 11762, 119818, 0, 92282, + 120597, 0, 0, 119819, 0, 0, 7719, 0, 2486, 0, 119808, 1507, 0, 129185, + 70301, 9687, 119825, 0, 119811, 66196, 0, 5262, 0, 74642, 12681, 0, 0, + 12406, 12219, 0, 127528, 42810, 110991, 0, 983673, 128144, 121027, + 126096, 120753, 12403, 2500, 0, 0, 12409, 0, 0, 0, 74113, 2343, 12412, + 19946, 74112, 125042, 13112, 0, 120603, 67866, 110634, 0, 66369, 5861, + 110632, 11999, 12400, 0, 0, 12645, 0, 11320, 68410, 6748, 65040, 0, + 64184, 12974, 66927, 67613, 120645, 0, 0, 0, 0, 0, 1928, 0, 67649, 0, 0, + 67609, 11235, 0, 0, 67610, 8241, 0, 0, 4206, 0, 0, 0, 128298, 110980, 0, + 67238, 0, 0, 0, 1422, 8357, 0, 7187, 0, 120641, 0, 0, 0, 0, 125022, + 111064, 92539, 10120, 12405, 0, 72997, 0, 13278, 0, 6366, 0, 7945, 0, + 4402, 0, 12402, 129372, 0, 74754, 12408, 0, 44007, 0, 0, 0, 12411, 0, + 120824, 128306, 121092, 0, 1575, 0, 0, 0, 73003, 119622, 0, 0, 12399, 0, + 6833, 0, 0, 0, 71878, 9692, 0, 0, 100615, 6750, 66855, 0, 0, 0, 0, 43527, + 0, 727, 0, 0, 0, 0, 6726, 127387, 0, 12370, 44023, 0, 126592, 2280, 0, + 12372, 120642, 0, 0, 0, 0, 12366, 10963, 6066, 1329, 0, 3052, 72987, 0, + 66029, 0, 10803, 0, 0, 0, 92473, 0, 0, 0, 0, 1499, 0, 0, 42740, 0, 0, 0, + 0, 12056, 126484, 0, 3660, 69404, 42192, 74253, 0, 42223, 67617, 125254, + 0, 0, 0, 0, 9941, 0, 0, 1933, 0, 0, 0, 0, 73866, 0, 0, 2487, 67614, 7361, + 1804, 0, 67615, 0, 0, 12220, 67616, 0, 0, 0, 68200, 6675, 0, 0, 67592, + 126582, 0, 64771, 0, 9132, 0, 111004, 510, 0, 0, 0, 4561, 7711, 92769, + 92944, 111007, 0, 41569, 121282, 0, 8167, 66885, 123197, 0, 0, 69992, + 66403, 6967, 0, 0, 0, 0, 333, 0, 0, 10566, 66409, 0, 121373, 0, 72965, + 110999, 66388, 6678, 0, 0, 12621, 0, 128775, 10227, 4764, 0, 9981, 0, + 70278, 11589, 0, 0, 42202, 12754, 0, 0, 69576, 0, 67594, 2048, 0, 4050, + 67595, 0, 0, 43221, 11184, 72709, 0, 0, 64175, 0, 72746, 0, 0, 129966, + 65461, 9798, 0, 71210, 0, 69841, 0, 952, 128235, 125107, 0, 70296, 6449, + 72102, 0, 0, 43098, 64171, 8142, 64160, 0, 0, 0, 0, 0, 0, 0, 0, 67597, + 6676, 3930, 42615, 73124, 69991, 67598, 0, 0, 0, 65591, 41581, 128056, + 1453, 0, 0, 0, 8500, 42222, 0, 119270, 72992, 69996, 0, 0, 64676, 0, 0, + 67606, 66385, 0, 42217, 13102, 0, 67607, 6672, 0, 0, 0, 0, 67608, 0, + 9001, 0, 11274, 67601, 0, 64210, 6664, 0, 42056, 67602, 0, 0, 0, 0, 1469, + 67603, 65381, 69921, 4988, 42372, 0, 9598, 904, 352, 42225, 0, 8061, + 10673, 0, 0, 128276, 67600, 0, 0, 127293, 8575, 127295, 127296, 127289, + 127290, 127291, 127292, 127285, 127286, 127287, 118877, 127281, 127282, + 9460, 823, 11587, 0, 0, 0, 127305, 12387, 0, 0, 127301, 126979, 42783, + 69998, 64208, 127298, 127299, 66031, 0, 11606, 64784, 0, 69973, 0, 0, 0, + 5152, 11048, 0, 120121, 67605, 0, 69604, 0, 70276, 194847, 0, 127052, + 42587, 42214, 41394, 0, 4763, 0, 118935, 0, 5260, 0, 94038, 326, 120131, + 74119, 0, 10771, 42198, 194920, 194837, 194925, 41398, 127079, 41393, + 127077, 127076, 453, 41396, 0, 13159, 11227, 9572, 0, 0, 194576, 128835, + 127081, 0, 126617, 43144, 0, 72972, 194887, 0, 0, 0, 0, 0, 64061, 0, 0, + 64056, 70310, 0, 0, 0, 194864, 0, 111084, 64301, 72998, 10464, 0, 128393, + 72847, 0, 11528, 64024, 128072, 679, 0, 0, 5850, 758, 7536, 0, 0, 43712, + 0, 64006, 983589, 64005, 70298, 0, 126487, 0, 0, 0, 0, 0, 72999, 0, + 64027, 64029, 0, 0, 64000, 0, 194874, 0, 42201, 12421, 194875, 0, 1852, + 0, 0, 73744, 0, 64041, 129127, 0, 0, 0, 92322, 12423, 12854, 0, 3496, 0, + 110966, 0, 194823, 0, 0, 6158, 8327, 74553, 0, 12419, 0, 11570, 0, 0, + 123618, 0, 7844, 983801, 194909, 0, 1682, 93039, 194911, 42756, 6765, + 128178, 0, 0, 0, 11412, 6768, 0, 194830, 71316, 0, 0, 0, 11577, 0, + 194829, 1833, 11576, 74334, 0, 0, 42854, 69438, 0, 70307, 0, 194856, + 8085, 0, 194850, 0, 72996, 128778, 1949, 11614, 7847, 120489, 120997, + 64483, 0, 0, 0, 0, 0, 0, 0, 126651, 42864, 0, 64667, 74624, 0, 0, 43261, + 11484, 127535, 67840, 0, 0, 128965, 0, 72974, 0, 110928, 128454, 3455, 0, + 0, 9879, 0, 0, 4158, 128050, 0, 0, 110929, 0, 0, 0, 332, 118808, 0, 0, + 2407, 0, 42199, 92386, 110865, 0, 77921, 55217, 123161, 125199, 70043, 0, + 0, 0, 121093, 1834, 0, 0, 71315, 0, 65249, 0, 8662, 0, 0, 123153, 0, + 11539, 10784, 0, 67674, 0, 92233, 0, 0, 118858, 0, 0, 0, 0, 0, 0, 12499, + 6280, 0, 0, 0, 0, 0, 0, 43851, 6279, 12508, 0, 12502, 9161, 0, 1620, 0, + 3601, 0, 0, 67246, 609, 11555, 0, 12496, 0, 74181, 120492, 12505, 0, + 194902, 0, 43567, 239, 0, 127085, 0, 0, 42671, 0, 0, 83095, 43565, + 127082, 983936, 12696, 127753, 0, 94062, 12929, 0, 712, 0, 4197, 0, + 42818, 0, 70306, 0, 0, 983805, 0, 43562, 0, 129034, 68076, 0, 111074, + 64628, 0, 0, 0, 0, 7494, 0, 4924, 0, 0, 0, 0, 127088, 0, 127087, 69987, + 64796, 0, 0, 12033, 0, 0, 0, 0, 0, 0, 0, 70299, 0, 0, 68324, 72420, 0, 0, + 0, 0, 70309, 127000, 0, 0, 0, 72418, 72963, 0, 5699, 0, 983879, 9488, + 74410, 119112, 70477, 11170, 0, 0, 72312, 0, 5265, 0, 0, 0, 0, 12464, 0, + 43264, 72977, 0, 43345, 0, 0, 120592, 6807, 0, 9829, 69997, 0, 0, 43346, + 11393, 795, 0, 72412, 12462, 72416, 72415, 0, 0, 64362, 0, 0, 120811, 0, + 12468, 8607, 1008, 0, 120670, 0, 0, 67855, 125018, 127177, 6758, 0, 0, + 1820, 41112, 0, 11202, 129451, 0, 13223, 0, 64595, 0, 0, 0, 0, 12616, 0, + 0, 0, 74467, 0, 0, 0, 0, 0, 0, 67233, 119060, 0, 83448, 19920, 69897, 0, + 129057, 0, 1130, 0, 0, 0, 11823, 0, 0, 118896, 0, 0, 13280, 0, 10747, + 118925, 0, 43509, 0, 0, 8959, 0, 6747, 0, 0, 8568, 0, 120870, 0, 120803, + 83060, 42670, 0, 11621, 12460, 0, 0, 0, 0, 111190, 0, 66570, 72989, + 121305, 126476, 120582, 0, 0, 0, 111191, 70308, 11594, 0, 68333, 69427, + 10491, 0, 0, 0, 0, 0, 127506, 0, 194910, 4923, 65086, 8981, 0, 42133, 0, + 72244, 0, 70294, 0, 0, 12485, 0, 8642, 0, 42766, 0, 2210, 11109, 0, 0, 0, + 0, 0, 7398, 0, 0, 0, 8041, 1461, 0, 119133, 0, 6749, 0, 0, 0, 71705, 0, + 0, 68071, 0, 67668, 0, 0, 9193, 0, 0, 0, 0, 73810, 0, 0, 64305, 0, 0, + 623, 781, 670, 10660, 5769, 613, 7543, 0, 477, 92633, 92521, 0, 592, 0, + 12459, 0, 0, 0, 12465, 119578, 654, 11345, 653, 652, 111250, 647, 0, 633, + 120744, 0, 111262, 12480, 74354, 0, 39, 12487, 0, 0, 74803, 12482, 0, + 12489, 0, 128962, 5550, 129175, 0, 0, 0, 0, 1813, 0, 41311, 111205, 0, + 11229, 0, 70496, 1675, 69840, 129435, 0, 119078, 10070, 10595, 111207, + 119077, 111206, 121162, 0, 0, 0, 11222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 71716, 917841, 0, 0, 270, 0, 0, 0, 0, 0, 120899, 0, 69741, 0, 0, 68251, + 0, 71721, 364, 9595, 0, 0, 0, 707, 110603, 0, 9282, 0, 224, 0, 68670, + 9332, 65581, 68677, 0, 68644, 0, 11764, 68634, 0, 10732, 68640, 850, 0, + 0, 71123, 0, 68619, 44008, 68627, 0, 0, 0, 0, 0, 0, 0, 0, 12507, 0, 0, + 128311, 0, 120529, 4375, 0, 0, 0, 12198, 0, 67339, 0, 0, 72994, 74293, + 128434, 0, 0, 64546, 0, 71208, 0, 0, 0, 42334, 42502, 0, 120887, 72961, + 0, 0, 5767, 0, 0, 71710, 8353, 0, 0, 0, 121233, 0, 0, 0, 0, 119920, 0, 0, + 121186, 0, 0, 0, 72719, 64604, 0, 6096, 0, 10063, 0, 0, 119630, 3485, + 12987, 0, 127522, 0, 0, 0, 0, 0, 0, 0, 0, 127173, 0, 0, 68249, 0, 0, + 118923, 0, 64574, 128794, 0, 1640, 12495, 66691, 0, 3138, 12504, 11171, + 1922, 0, 12498, 0, 0, 69939, 0, 65543, 0, 0, 0, 66643, 0, 120734, 0, + 4228, 0, 10303, 0, 0, 0, 10335, 3520, 0, 12490, 0, 0, 0, 12493, 121452, + 64636, 1002, 12491, 0, 0, 92615, 2096, 0, 0, 0, 0, 11611, 66228, 0, + 11241, 66224, 66221, 66226, 66229, 66219, 66231, 66216, 0, 66236, 66211, + 66218, 0, 66240, 78041, 66233, 66217, 0, 7909, 66234, 11605, 0, 0, 66208, + 0, 0, 128282, 73875, 0, 12898, 12494, 120939, 12492, 0, 0, 0, 74153, 0, + 127391, 127489, 4882, 13040, 0, 120762, 4885, 194732, 0, 13042, 4880, + 128834, 2429, 0, 8647, 0, 0, 0, 0, 0, 0, 68896, 0, 119101, 66693, 0, + 1870, 78040, 470, 68893, 78035, 78036, 983577, 78034, 110607, 110608, 0, + 12511, 74453, 12514, 0, 128609, 7239, 7001, 11974, 121214, 0, 0, 7378, + 12512, 11615, 13041, 0, 0, 128057, 13038, 0, 0, 71717, 70195, 120836, + 12510, 127070, 13039, 75019, 12513, 71969, 12471, 110761, 0, 121385, + 70193, 0, 0, 0, 71714, 0, 12477, 0, 12473, 7666, 67362, 237, 6281, 0, 0, + 0, 0, 1312, 0, 0, 12469, 0, 0, 64335, 12475, 0, 69382, 0, 11524, 10367, + 10431, 74368, 13017, 3388, 129547, 69573, 0, 0, 128725, 4932, 0, 0, + 13015, 0, 0, 65451, 8185, 0, 0, 43024, 129362, 74375, 10129, 0, 7948, + 9236, 0, 0, 0, 92726, 43473, 6289, 10484, 0, 0, 0, 12082, 12521, 3147, + 110643, 110644, 12524, 110642, 2310, 0, 0, 0, 0, 13013, 0, 8596, 983852, + 10804, 70497, 0, 0, 13014, 12444, 0, 43088, 13016, 0, 0, 0, 0, 12331, 0, + 0, 8744, 726, 121090, 983849, 4155, 0, 0, 0, 71690, 12522, 73128, 0, 0, + 127805, 0, 110647, 0, 0, 983853, 12525, 0, 12523, 2152, 11969, 120596, + 403, 0, 11021, 0, 0, 11030, 8610, 92567, 0, 0, 63998, 0, 0, 0, 0, 0, 0, + 0, 12506, 0, 11146, 71477, 12500, 0, 12509, 0, 0, 0, 0, 6608, 0, 0, 0, 0, + 69288, 77995, 0, 3608, 0, 0, 1107, 0, 129658, 0, 0, 0, 0, 983937, 43217, + 66571, 13222, 118963, 0, 126514, 10463, 11553, 0, 63995, 9043, 128634, + 71722, 0, 0, 127751, 92974, 12529, 8042, 0, 2344, 12528, 0, 0, 0, 69719, + 120956, 0, 0, 66512, 0, 12530, 0, 0, 68917, 12658, 0, 71683, 0, 983237, + 0, 127526, 469, 0, 4363, 3313, 0, 0, 2023, 0, 72251, 78225, 65706, 10051, + 78219, 78220, 0, 9920, 12215, 0, 4931, 1951, 12497, 119363, 0, 0, 119336, + 0, 0, 0, 0, 0, 1491, 128578, 129169, 0, 0, 0, 0, 78898, 94086, 41993, 0, + 67379, 0, 0, 0, 0, 9738, 41995, 1075, 0, 12535, 41992, 0, 0, 0, 0, + 128117, 0, 9940, 0, 7692, 0, 9727, 41131, 330, 8566, 0, 41133, 41117, + 128482, 12532, 78550, 78546, 43177, 0, 43235, 0, 917542, 78229, 78231, + 13031, 12910, 67710, 78555, 13028, 78553, 12537, 0, 0, 71692, 12536, + 2350, 13029, 78233, 0, 0, 13030, 0, 4527, 71250, 12538, 0, 0, 0, 0, 0, 0, + 0, 12484, 4032, 71459, 194728, 0, 64344, 0, 66700, 66000, 8412, 0, 43466, + 1296, 2325, 0, 121020, 10149, 74118, 0, 0, 12481, 121280, 12488, 0, 0, 0, + 67972, 0, 2354, 42619, 0, 73027, 6295, 901, 0, 0, 0, 0, 0, 128653, 11927, + 66584, 78559, 78560, 78557, 78558, 0, 74649, 0, 126241, 67220, 194726, + 78568, 67226, 78565, 70190, 78563, 78564, 2352, 67219, 78569, 71945, + 11289, 1407, 67973, 0, 13026, 6762, 10399, 70192, 13023, 78578, 9777, + 67208, 1871, 0, 0, 0, 13024, 71936, 0, 9325, 6818, 6283, 11738, 0, 0, + 71938, 11741, 0, 0, 9216, 8263, 11279, 0, 983837, 0, 13021, 71922, 3136, + 0, 983840, 0, 13022, 129143, 9956, 0, 0, 0, 42580, 0, 0, 0, 13020, 10024, + 0, 94013, 0, 0, 0, 43001, 8029, 0, 0, 0, 3335, 127924, 9209, 13048, + 73126, 0, 0, 0, 3333, 119100, 0, 0, 3342, 78582, 78583, 73056, 78581, + 4156, 0, 0, 0, 78591, 1611, 73058, 13018, 78586, 78588, 78584, 3337, + 4537, 78593, 11736, 0, 0, 0, 4214, 73790, 0, 0, 13046, 194844, 425, 74763, 42066, 78595, 0, 2392, 13047, 0, 0, 12425, 13049, 0, 92243, 0, - 72715, 73944, 13050, 0, 0, 0, 0, 0, 0, 0, 8929, 0, 0, 0, 0, 983971, 0, - 13045, 0, 0, 7751, 0, 9726, 0, 3997, 0, 8768, 13044, 0, 0, 4024, 0, 0, + 72715, 73944, 13050, 0, 0, 0, 0, 983501, 0, 0, 8929, 0, 0, 0, 0, 983971, + 0, 13045, 0, 0, 7751, 0, 9726, 0, 3997, 0, 8768, 13044, 0, 0, 4024, 0, 0, 2419, 9757, 69736, 0, 0, 0, 129500, 0, 0, 0, 72735, 0, 0, 0, 0, 0, 11911, 124990, 0, 2346, 194691, 69931, 0, 9646, 3773, 43557, 68154, 42536, 0, 70108, 13043, 92686, 92494, 0, 208, 0, 43766, 0, 0, 0, 10699, 0, 0, 7825, @@ -23894,8 +24697,8 @@ static const unsigned int code_hash[] = { 8294, 42912, 129343, 0, 0, 4876, 111316, 0, 111326, 111282, 0, 0, 0, 73950, 13053, 9944, 0, 2811, 13051, 111313, 3143, 111246, 66374, 110759, 0, 0, 13052, 0, 0, 63972, 119071, 7025, 0, 0, 100464, 74161, 4154, 9863, - 0, 0, 0, 63970, 1564, 0, 0, 0, 0, 0, 9942, 0, 0, 111227, 0, 128471, 0, - 63957, 0, 1626, 0, 63983, 0, 111232, 0, 0, 121275, 111292, 6254, 4910, + 129686, 0, 0, 63970, 1564, 0, 0, 0, 0, 0, 9942, 0, 0, 111227, 0, 128471, + 0, 63957, 0, 1626, 0, 63983, 0, 111232, 0, 0, 121275, 111292, 6254, 4910, 69453, 0, 64753, 100458, 111303, 111298, 127404, 111297, 3229, 0, 42774, 0, 0, 111218, 111286, 2331, 0, 7085, 6137, 0, 70411, 0, 126070, 0, 128438, 0, 0, 65043, 0, 127588, 70412, 128921, 64721, 0, 0, 0, 0, 0, @@ -23905,7 +24708,7 @@ static const unsigned int code_hash[] = { 72750, 2342, 0, 0, 0, 4894, 0, 4890, 0, 0, 0, 4893, 128426, 6571, 0, 4888, 4157, 78048, 78049, 78046, 11263, 0, 78045, 64895, 121437, 0, 0, 0, 0, 0, 119041, 2332, 78063, 78060, 78061, 64932, 78059, 65125, 121098, 0, - 0, 0, 73941, 78066, 12203, 78064, 78065, 8913, 120390, 4875, 73678, + 0, 129991, 73941, 78066, 12203, 78064, 78065, 8913, 120390, 4875, 73678, 120396, 120389, 71854, 0, 120394, 120386, 120395, 13104, 78076, 78077, 120393, 78075, 0, 3134, 83096, 65696, 72432, 0, 0, 0, 8334, 0, 83207, 3449, 0, 0, 83215, 0, 0, 0, 83204, 0, 0, 0, 69707, 0, 0, 10734, 0, 83198, @@ -23928,10 +24731,10 @@ static const unsigned int code_hash[] = { 0, 0, 0, 42682, 0, 0, 0, 41227, 0, 71475, 0, 64848, 0, 78574, 0, 113792, 0, 0, 129133, 0, 66015, 74614, 959, 8885, 0, 0, 0, 9469, 9632, 128211, 74761, 64323, 100478, 0, 2266, 78575, 310, 0, 0, 68403, 100480, 72738, - 125279, 0, 0, 6497, 0, 0, 0, 19958, 0, 0, 74953, 0, 118998, 67332, 374, - 0, 41933, 120975, 0, 0, 41934, 7465, 0, 128168, 70666, 11151, 6101, 0, - 41936, 100476, 4879, 0, 65446, 0, 0, 0, 0, 5374, 0, 128059, 127390, 0, - 126618, 983571, 129146, 0, 0, 1929, 0, 12142, 0, 0, 0, 121472, 0, 12982, + 125279, 0, 0, 6497, 127320, 0, 0, 19958, 0, 0, 74953, 0, 118998, 67332, + 374, 0, 41933, 120975, 0, 0, 41934, 7465, 0, 128168, 70666, 11151, 6101, + 0, 41936, 100476, 4879, 0, 65446, 0, 0, 0, 0, 5374, 0, 128059, 127390, 0, + 126618, 983575, 129146, 0, 0, 1929, 0, 12142, 0, 0, 0, 121472, 0, 12982, 0, 5378, 0, 128679, 0, 0, 127869, 0, 0, 0, 0, 0, 78832, 74481, 0, 43262, 100511, 2421, 0, 2324, 828, 3611, 121055, 0, 64314, 0, 0, 0, 0, 0, 0, 7999, 0, 11217, 983261, 10634, 10942, 0, 2348, 0, 0, 0, 0, 119044, 9982, @@ -23942,231 +24745,233 @@ static const unsigned int code_hash[] = { 0, 8075, 55276, 123589, 8047, 0, 78827, 12634, 0, 78782, 71322, 0, 12174, 42610, 0, 0, 0, 1584, 0, 6045, 0, 0, 65218, 11559, 0, 0, 0, 124991, 0, 0, 64418, 0, 0, 0, 0, 0, 0, 67821, 0, 13092, 0, 128365, 0, 0, 0, 0, 0, - 11414, 0, 2531, 13034, 0, 0, 0, 13036, 0, 70866, 70198, 10394, 0, 13037, - 0, 0, 0, 0, 100496, 120640, 41129, 0, 42850, 13035, 0, 0, 5466, 0, 0, 0, - 0, 4535, 0, 4271, 0, 0, 6769, 0, 0, 67350, 6767, 0, 66273, 0, 6755, - 73827, 9046, 67355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83235, 2563, 13033, 247, - 83229, 0, 12338, 0, 83231, 11270, 0, 0, 0, 0, 70107, 0, 0, 0, 0, 3752, - 83243, 68895, 0, 68897, 0, 0, 0, 0, 5009, 0, 0, 0, 0, 119521, 78823, - 78824, 70353, 68399, 3877, 0, 78825, 10145, 43566, 0, 0, 10236, 0, 43782, - 0, 127329, 0, 69652, 118921, 120612, 128058, 0, 43200, 43777, 71253, 0, - 83254, 0, 71866, 43203, 0, 68894, 0, 127326, 0, 43778, 119538, 0, 0, - 43781, 11303, 65547, 0, 7031, 0, 0, 67343, 83237, 83267, 0, 67341, 0, - 8535, 0, 0, 0, 66032, 0, 0, 120786, 42233, 0, 9946, 7667, 0, 11822, 0, - 43189, 120673, 100507, 2979, 1579, 0, 0, 0, 0, 0, 12635, 0, 0, 94055, 0, - 1285, 64882, 0, 0, 83113, 12640, 83112, 7401, 0, 12625, 0, 71296, 72744, - 0, 74286, 55260, 3396, 12642, 0, 110719, 0, 12630, 0, 0, 10153, 0, 6166, - 120516, 0, 110680, 0, 0, 0, 9285, 913, 42259, 83017, 0, 2142, 0, 0, - 94012, 7878, 0, 72733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128918, 5263, 74782, 0, - 41939, 43702, 0, 917856, 0, 10139, 980, 43698, 0, 2208, 0, 43701, 0, - 125132, 0, 100528, 0, 10085, 0, 0, 119989, 100529, 0, 71699, 0, 8072, 0, - 43700, 0, 7304, 7783, 66894, 12398, 0, 0, 0, 0, 0, 0, 120565, 0, 2217, 0, - 94015, 6367, 0, 66688, 0, 0, 0, 0, 0, 92199, 7808, 1829, 0, 41937, 0, - 43272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6627, 0, 6258, 10683, 0, 0, 0, - 5649, 0, 0, 0, 1643, 127898, 0, 127846, 67244, 0, 42452, 0, 0, 0, 0, - 64291, 0, 0, 0, 6576, 74773, 0, 0, 66309, 0, 9886, 55225, 11292, 0, - 72867, 55227, 0, 12632, 0, 194817, 0, 7680, 0, 92745, 120714, 12639, - 3380, 8123, 0, 12638, 42262, 4501, 0, 0, 0, 0, 125131, 1494, 983146, 0, - 0, 0, 0, 10494, 0, 65872, 0, 0, 0, 0, 0, 0, 983575, 0, 0, 0, 0, 0, 0, 0, - 71077, 0, 127335, 121128, 0, 5570, 1881, 7210, 0, 1012, 66630, 0, 128982, - 7208, 66442, 5569, 113723, 42339, 92655, 0, 0, 0, 0, 92378, 65602, 0, - 92375, 64727, 9160, 0, 0, 0, 124928, 10503, 0, 3423, 3870, 8483, 10162, - 0, 4319, 0, 0, 0, 0, 0, 983116, 0, 0, 0, 0, 0, 0, 0, 0, 5571, 7630, 9740, - 9121, 5568, 0, 0, 42085, 0, 0, 65056, 0, 589, 0, 0, 0, 10233, 66252, - 66251, 78734, 66253, 0, 0, 42645, 0, 128424, 8583, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 12204, 92436, 0, 0, 0, 0, 0, 0, 0, 70311, 0, 0, 128012, 41063, 0, - 10664, 0, 0, 0, 4551, 129090, 74759, 0, 0, 0, 0, 72806, 0, 0, 12517, - 7806, 0, 12034, 0, 6355, 12519, 41004, 0, 0, 93849, 0, 71707, 0, 121231, - 7332, 129075, 12111, 3927, 0, 12515, 1474, 68768, 0, 6923, 0, 0, 127802, - 0, 43990, 74639, 126229, 121007, 0, 92706, 0, 0, 0, 0, 0, 9645, 0, - 121026, 5853, 0, 10363, 120729, 12956, 0, 0, 0, 0, 127888, 0, 0, 0, 0, 0, - 10514, 65517, 0, 0, 71101, 0, 0, 0, 43570, 2969, 43420, 0, 0, 0, 92366, - 70809, 0, 0, 0, 0, 0, 0, 12125, 41124, 0, 1164, 128817, 0, 120466, 0, 0, - 65014, 66009, 74451, 128760, 983128, 7469, 0, 0, 0, 69988, 120671, 83171, - 41123, 11176, 0, 0, 41126, 9991, 41128, 0, 0, 110949, 0, 0, 42877, 7994, - 0, 6104, 983612, 0, 0, 0, 0, 0, 0, 74438, 128272, 121409, 41981, 0, 0, - 42904, 0, 0, 74435, 126640, 0, 0, 0, 127968, 92442, 12703, 9661, 67360, - 67359, 7455, 70732, 11473, 119217, 128512, 0, 92323, 0, 0, 129632, 67358, - 0, 0, 0, 0, 174, 121131, 883, 4161, 128033, 42603, 0, 0, 72256, 0, 0, - 128356, 0, 0, 0, 0, 3846, 8070, 6150, 128109, 4370, 0, 0, 0, 74587, 0, 0, - 0, 0, 4986, 12189, 917553, 67648, 120499, 0, 4257, 71695, 123620, 6220, - 0, 65561, 0, 0, 0, 0, 0, 0, 0, 0, 69684, 0, 0, 128452, 120873, 0, 0, - 74922, 0, 71897, 0, 0, 67368, 67367, 8871, 67366, 0, 0, 0, 0, 0, 67361, - 0, 0, 67365, 67364, 3427, 4240, 67376, 67375, 67374, 67373, 0, 0, 0, - 67377, 0, 71689, 0, 0, 67372, 67371, 67370, 67369, 0, 0, 0, 124962, 0, 0, - 0, 0, 65898, 0, 65312, 0, 0, 0, 0, 4010, 121208, 41106, 0, 0, 0, 41105, - 0, 64803, 83456, 0, 0, 0, 0, 0, 0, 0, 11008, 0, 0, 71351, 41110, 71681, - 64892, 9113, 1954, 41108, 0, 42878, 0, 67405, 0, 0, 0, 0, 0, 119539, - 69435, 73463, 0, 4586, 129342, 0, 0, 0, 0, 0, 125233, 92307, 0, 0, 0, - 67382, 0, 9500, 0, 4957, 0, 2422, 2212, 0, 67381, 67380, 11045, 67378, 0, - 0, 3890, 12168, 121328, 0, 0, 0, 41947, 0, 120828, 74946, 917901, 0, - 1571, 66461, 41949, 42805, 8270, 943, 41946, 0, 2073, 0, 41980, 0, 0, 0, - 0, 4429, 6272, 0, 1460, 6954, 128572, 41120, 0, 65733, 0, 41119, 0, - 127006, 0, 0, 0, 129168, 12895, 0, 0, 0, 69440, 0, 1985, 6296, 0, 0, 0, - 0, 0, 41122, 0, 2457, 0, 0, 0, 0, 0, 0, 8840, 8035, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8681, 0, 121505, 128747, 0, 0, 70102, 0, 124976, 9605, 0, 13220, - 0, 67354, 11312, 0, 9246, 67349, 0, 0, 0, 0, 10012, 12123, 0, 0, 0, 0, 0, - 0, 0, 0, 67817, 0, 1272, 0, 0, 0, 983582, 0, 1467, 0, 917806, 0, 0, 0, - 70312, 0, 124955, 0, 70400, 0, 0, 72817, 0, 19935, 0, 92162, 0, 0, 0, - 128406, 5275, 0, 0, 44006, 129082, 0, 3789, 128205, 0, 0, 0, 11474, 0, 0, - 0, 129050, 0, 92194, 129503, 9537, 4496, 0, 120443, 2605, 4500, 0, 55224, - 8600, 0, 0, 41646, 11667, 0, 0, 0, 917905, 4499, 41649, 0, 0, 0, 0, 0, 0, - 0, 65804, 0, 70034, 41866, 0, 0, 0, 11174, 0, 0, 0, 9559, 128773, 41940, - 8299, 41945, 0, 41941, 5455, 7190, 0, 0, 917810, 65266, 0, 41943, 10762, - 0, 41931, 0, 0, 8106, 4128, 0, 0, 4494, 0, 0, 72405, 0, 119567, 42068, - 917808, 0, 11004, 12794, 65072, 5271, 7317, 0, 0, 0, 0, 0, 0, 92281, 0, - 0, 0, 0, 71880, 3868, 71881, 983569, 128431, 7703, 0, 64390, 0, 7406, 0, - 93850, 0, 3985, 66425, 0, 66615, 10177, 0, 41853, 71873, 12809, 0, 12193, - 0, 10879, 0, 0, 9055, 0, 3851, 8132, 0, 0, 119263, 917908, 0, 0, 0, 0, 0, - 42657, 0, 7643, 0, 0, 0, 43568, 0, 11949, 7650, 43569, 64951, 7647, 7649, - 0, 7646, 0, 0, 9651, 125005, 3891, 0, 0, 2337, 77831, 77832, 67860, - 129288, 0, 0, 43561, 67706, 119669, 0, 1860, 0, 68835, 5812, 12784, 0, 0, - 0, 0, 0, 7727, 0, 0, 69818, 66444, 128665, 42719, 0, 1569, 0, 12534, - 12124, 7690, 194871, 12533, 0, 68383, 67997, 0, 6969, 0, 0, 0, 67974, - 63895, 128650, 0, 0, 0, 42144, 0, 0, 0, 0, 92211, 119043, 0, 0, 917545, - 0, 0, 12791, 0, 0, 0, 4447, 71065, 12793, 0, 0, 43385, 0, 0, 12790, - 120256, 0, 983821, 12792, 120254, 0, 0, 12789, 128489, 12317, 74934, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 127840, 41652, 2974, 78689, 11476, 0, 0, 0, 0, - 43871, 0, 10894, 119176, 74557, 65686, 0, 0, 3724, 67335, 67334, 67333, - 67338, 67337, 0, 67336, 0, 65306, 0, 128421, 0, 8646, 129593, 77829, 0, - 0, 74852, 0, 0, 0, 0, 0, 220, 120252, 43551, 0, 10044, 0, 0, 983828, - 68659, 110825, 5707, 71362, 0, 0, 0, 0, 0, 0, 10297, 0, 41308, 67331, 0, - 0, 0, 0, 2467, 0, 6003, 0, 0, 8040, 0, 0, 4182, 0, 11135, 120501, 0, 0, - 2510, 0, 10208, 0, 78302, 70829, 0, 0, 6837, 0, 0, 67348, 0, 0, 0, 0, - 1559, 67342, 11104, 67340, 67347, 67346, 67345, 67344, 0, 0, 67357, - 67356, 0, 0, 0, 0, 67352, 67351, 5516, 2845, 7717, 8036, 65161, 67353, - 5514, 12045, 6278, 0, 5515, 0, 0, 0, 0, 0, 65194, 100387, 5517, 70116, - 92774, 0, 67884, 0, 67890, 42094, 67880, 67881, 67882, 67883, 0, 0, - 67879, 120411, 1902, 67887, 67888, 12976, 126546, 12483, 12368, 41769, - 42726, 41765, 0, 12787, 67874, 7556, 67878, 74351, 67897, 989, 42677, - 67889, 0, 6060, 0, 4326, 11000, 64601, 68478, 0, 0, 6917, 0, 120837, 0, - 0, 0, 6148, 8605, 74205, 0, 0, 0, 42715, 0, 101047, 0, 68663, 0, 41796, - 1269, 42703, 64754, 101049, 101042, 5144, 12221, 42716, 71048, 5133, - 4331, 0, 128675, 0, 5279, 121362, 71046, 0, 0, 42701, 0, 0, 0, 121470, 0, - 0, 0, 0, 0, 983608, 121259, 42666, 12207, 1067, 255, 12131, 0, 0, 0, 0, - 0, 0, 0, 70728, 43460, 0, 42723, 125216, 0, 70427, 0, 12797, 0, 0, - 983703, 0, 67977, 12799, 0, 92504, 9746, 5135, 0, 12796, 0, 0, 0, 5139, - 346, 74303, 121134, 12795, 125109, 5168, 0, 43845, 983708, 0, 8253, 8817, - 1136, 983716, 43563, 127774, 129542, 0, 0, 0, 0, 0, 0, 983619, 0, 0, - 4041, 0, 2357, 43240, 12786, 0, 0, 0, 44004, 7142, 0, 67984, 0, 0, 0, 0, - 12785, 0, 0, 7770, 10712, 64853, 42679, 118916, 42375, 0, 983123, 94074, - 12119, 0, 11059, 10791, 0, 450, 0, 0, 0, 0, 5450, 64691, 0, 0, 44009, 0, - 0, 111097, 94085, 1839, 94004, 0, 10927, 1701, 0, 129610, 41749, 41761, - 5453, 8361, 66045, 41758, 5444, 41763, 0, 0, 0, 66349, 983137, 121274, 0, - 0, 8801, 0, 4340, 0, 0, 0, 0, 70001, 41824, 0, 0, 0, 0, 42700, 0, 127980, - 0, 0, 0, 0, 0, 0, 4493, 4336, 129171, 2314, 983061, 41808, 0, 0, 0, - 64638, 0, 65937, 4489, 71331, 0, 0, 5358, 42717, 0, 71236, 0, 0, 0, - 127042, 41813, 2712, 0, 127044, 1410, 0, 0, 0, 0, 0, 0, 0, 0, 128587, 0, - 0, 0, 4892, 0, 0, 0, 0, 0, 5777, 0, 759, 0, 2079, 65248, 12788, 0, 64552, - 0, 41803, 68043, 0, 0, 0, 0, 128785, 0, 68492, 67991, 75071, 2340, 0, - 120638, 0, 983883, 0, 0, 0, 64749, 0, 2321, 3587, 0, 67236, 9953, 9952, - 0, 0, 42714, 9951, 0, 0, 127902, 74150, 0, 0, 74757, 127554, 0, 983807, - 2395, 0, 9976, 0, 125128, 0, 0, 0, 42809, 42807, 0, 66290, 70854, 4150, - 64424, 8318, 41790, 67976, 65559, 2360, 41794, 0, 0, 120987, 0, 0, 2418, - 0, 2411, 0, 41783, 0, 41786, 65108, 0, 0, 41772, 42813, 2317, 0, 118980, - 0, 0, 0, 0, 0, 0, 78682, 7753, 2351, 6655, 64489, 0, 0, 0, 4443, 41697, - 230, 65793, 0, 65943, 42803, 0, 0, 5441, 0, 0, 127053, 0, 855, 0, 6109, - 101021, 0, 119116, 69989, 0, 0, 72146, 0, 101023, 0, 72148, 0, 19915, - 41892, 0, 0, 128901, 41887, 0, 67980, 9735, 0, 0, 120591, 13082, 0, 0, 0, - 0, 0, 0, 0, 0, 289, 0, 0, 64504, 0, 126130, 120514, 0, 92962, 0, 42724, - 69977, 0, 0, 0, 0, 67994, 0, 0, 0, 3565, 0, 0, 127553, 43035, 69898, 0, - 0, 0, 0, 4891, 0, 0, 4602, 0, 121065, 0, 0, 121157, 0, 43978, 8988, 0, 0, - 0, 0, 0, 119184, 121436, 73902, 69740, 0, 0, 72976, 0, 0, 8771, 0, 0, 0, - 119209, 74974, 71737, 0, 0, 67987, 0, 0, 0, 67989, 0, 10065, 8207, 0, - 983578, 0, 0, 662, 0, 41927, 0, 0, 0, 0, 0, 0, 0, 41929, 0, 0, 0, 41926, - 69994, 0, 0, 0, 126230, 68013, 1433, 64648, 6475, 0, 120983, 0, 73876, 0, - 0, 0, 67992, 78052, 0, 3978, 0, 0, 0, 0, 120761, 12281, 0, 0, 13241, 0, - 0, 0, 0, 11765, 42577, 0, 0, 2641, 7192, 0, 0, 118809, 101015, 0, 101016, + 11414, 0, 2531, 13034, 0, 0, 0, 13036, 0, 70866, 70198, 10394, 129979, + 13037, 0, 129956, 0, 0, 100496, 120640, 41129, 0, 42850, 13035, 0, 0, + 5466, 0, 0, 0, 129439, 4535, 0, 4271, 0, 0, 6769, 0, 0, 67350, 6767, 0, + 66273, 0, 6755, 73827, 9046, 67355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83235, + 2563, 13033, 247, 83229, 0, 12338, 0, 83231, 11270, 0, 0, 0, 0, 70107, 0, + 0, 0, 0, 3752, 83243, 68895, 0, 68897, 0, 0, 0, 0, 5009, 0, 0, 0, 0, + 119521, 78823, 78824, 70353, 68399, 3877, 0, 78825, 10145, 43566, 0, 0, + 10236, 0, 43782, 0, 127329, 0, 69652, 2247, 120612, 128058, 0, 43200, + 43777, 71253, 0, 69558, 0, 71866, 43203, 0, 68894, 0, 127326, 0, 43778, + 119538, 0, 0, 43781, 11303, 65547, 0, 7031, 0, 0, 67343, 83237, 83267, 0, + 67341, 0, 8535, 0, 0, 0, 66032, 0, 0, 120786, 42233, 0, 9946, 7667, 0, + 11822, 0, 43189, 120673, 100507, 2979, 1579, 0, 0, 0, 0, 0, 12635, 0, 0, + 94055, 0, 1285, 64882, 0, 0, 83113, 12640, 83112, 7401, 0, 12625, 0, + 71296, 72744, 0, 74286, 55260, 3396, 12642, 0, 110719, 0, 12630, 0, 0, + 10153, 0, 6166, 120516, 0, 110680, 0, 0, 0, 9285, 913, 42259, 83017, 0, + 2142, 0, 0, 94012, 7878, 0, 72733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128918, + 5263, 74782, 0, 41939, 43702, 0, 917856, 0, 10139, 980, 43698, 0, 2208, + 0, 43701, 0, 125132, 0, 100528, 0, 10085, 0, 0, 119989, 100529, 0, 71699, + 0, 8072, 0, 43700, 0, 7304, 7783, 66894, 12398, 0, 0, 0, 0, 0, 0, 120565, + 0, 2217, 0, 94015, 6367, 0, 66688, 0, 0, 0, 0, 0, 92199, 7808, 1829, 0, + 41937, 0, 43272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92467, 6627, 0, 6258, + 10683, 0, 0, 0, 5649, 0, 0, 0, 1643, 127898, 0, 127846, 67244, 0, 42452, + 0, 0, 0, 0, 64291, 0, 0, 0, 6576, 74773, 0, 0, 66309, 0, 9886, 55225, + 11292, 0, 72867, 55227, 0, 12632, 0, 194817, 0, 7680, 0, 92745, 120714, + 12639, 3380, 8123, 0, 12638, 42262, 4501, 0, 0, 0, 0, 125131, 1494, + 983146, 0, 0, 0, 0, 10494, 0, 65872, 0, 0, 0, 0, 0, 0, 983587, 0, 0, 0, + 0, 0, 0, 0, 71077, 0, 127335, 121128, 0, 5570, 1881, 7210, 0, 1012, + 66630, 0, 128982, 7208, 66442, 5569, 113723, 42339, 92655, 0, 0, 0, 0, + 92378, 65602, 0, 92375, 64727, 9160, 0, 0, 0, 124928, 10503, 0, 3423, + 3870, 8483, 10162, 0, 4319, 0, 0, 0, 0, 0, 983116, 0, 69562, 0, 0, 0, 0, + 0, 0, 5571, 7630, 9740, 9121, 5568, 0, 0, 42085, 0, 0, 65056, 0, 589, 0, + 0, 0, 10233, 66252, 66251, 78734, 66253, 0, 0, 42645, 0, 128424, 8583, 0, + 0, 0, 129932, 0, 0, 0, 0, 0, 12204, 92436, 0, 0, 0, 0, 0, 0, 0, 70311, 0, + 0, 128012, 41063, 0, 10664, 0, 0, 0, 4551, 129090, 74759, 0, 0, 0, 0, + 72806, 0, 0, 12517, 7806, 0, 12034, 0, 6355, 12519, 41004, 0, 0, 93849, + 0, 71707, 0, 121231, 7332, 129075, 12111, 3927, 0, 12515, 1474, 68768, 0, + 6923, 0, 0, 127802, 0, 43990, 74639, 126229, 121007, 0, 92706, 0, 0, 0, + 0, 0, 9645, 0, 121026, 5853, 0, 10363, 120729, 12956, 0, 0, 0, 0, 127888, + 0, 0, 0, 0, 0, 10514, 65517, 0, 0, 71101, 0, 0, 0, 43570, 2969, 43420, + 129944, 0, 0, 92366, 70809, 0, 0, 0, 0, 0, 0, 12125, 41124, 0, 1164, + 128817, 0, 120466, 0, 0, 65014, 66009, 74451, 125075, 983128, 7469, 0, 0, + 0, 69988, 120671, 83171, 41123, 11176, 0, 0, 41126, 9991, 41128, 0, 0, + 110949, 0, 0, 42877, 7994, 0, 6104, 983612, 0, 129869, 0, 0, 0, 0, 74438, + 128272, 121409, 41981, 0, 69296, 42904, 0, 0, 74435, 126640, 0, 0, 0, + 127968, 92442, 12703, 9661, 67360, 67359, 7455, 70732, 11473, 119217, + 128512, 0, 92323, 0, 0, 129632, 67358, 0, 0, 0, 0, 174, 121131, 883, + 4161, 128033, 42603, 0, 0, 72256, 0, 0, 128356, 0, 0, 0, 0, 3846, 8070, + 6150, 128109, 4370, 0, 0, 0, 74587, 0, 0, 0, 0, 4986, 12189, 917553, + 67648, 120499, 0, 4257, 71695, 123620, 6220, 0, 65561, 0, 0, 0, 0, 0, 0, + 0, 0, 69684, 0, 0, 128452, 120873, 0, 0, 74922, 0, 71897, 0, 0, 67368, + 67367, 8871, 67366, 0, 0, 0, 0, 0, 67361, 0, 0, 67365, 67364, 3427, 4240, + 67376, 67375, 67374, 67373, 0, 0, 0, 67377, 0, 71689, 0, 0, 67372, 67371, + 67370, 67369, 0, 0, 0, 124962, 0, 0, 0, 0, 65898, 0, 65312, 0, 0, 0, 0, + 4010, 121208, 41106, 0, 0, 0, 41105, 0, 64803, 83456, 0, 0, 0, 0, 0, 0, + 0, 11008, 0, 0, 71351, 41110, 71681, 64892, 9113, 1954, 41108, 0, 42878, + 0, 67405, 0, 0, 0, 0, 0, 119539, 69435, 73463, 0, 4586, 129342, 0, 0, 0, + 0, 0, 125233, 92307, 0, 0, 0, 67382, 0, 9500, 0, 4957, 0, 2422, 2212, 0, + 67381, 67380, 11045, 67378, 0, 0, 3890, 12168, 121328, 0, 0, 0, 41947, 0, + 120828, 74946, 917901, 0, 1571, 66461, 41949, 42805, 8270, 943, 41946, 0, + 2073, 0, 41980, 0, 0, 0, 0, 4429, 6272, 0, 1460, 6954, 128572, 41120, 0, + 65733, 0, 41119, 0, 127006, 0, 0, 0, 129168, 12895, 0, 0, 0, 69440, 0, + 1985, 6296, 0, 0, 0, 0, 0, 41122, 0, 2457, 0, 0, 0, 0, 0, 0, 8840, 8035, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8681, 0, 121505, 128747, 0, 0, 70102, 0, + 124976, 9605, 0, 13220, 0, 67354, 11312, 0, 9246, 67349, 0, 0, 0, 0, + 10012, 12123, 0, 0, 0, 0, 0, 0, 0, 0, 67817, 0, 1272, 0, 0, 0, 983578, 0, + 1467, 0, 917806, 0, 0, 0, 70312, 0, 124955, 0, 70400, 0, 0, 72817, 0, + 19935, 0, 92162, 0, 0, 0, 128406, 5275, 0, 0, 44006, 129082, 0, 3789, + 128205, 0, 0, 0, 11474, 0, 0, 0, 129050, 0, 92194, 129503, 9537, 4496, 0, + 120443, 2605, 4500, 0, 55224, 8600, 0, 0, 41646, 11667, 69569, 0, 0, + 917905, 4499, 41649, 0, 0, 0, 69254, 0, 0, 0, 65804, 0, 70034, 41866, 0, + 0, 0, 11174, 0, 0, 0, 9559, 128773, 41940, 8299, 41945, 0, 41941, 5455, + 7190, 0, 0, 917810, 65266, 0, 41943, 10762, 0, 41931, 0, 0, 8106, 4128, + 0, 0, 4494, 0, 0, 72405, 0, 119567, 42068, 917808, 0, 11004, 12794, + 65072, 5271, 7317, 0, 0, 0, 0, 0, 0, 92281, 0, 0, 0, 0, 71880, 3868, + 71881, 983573, 128431, 7703, 0, 64390, 0, 7406, 0, 93850, 0, 3985, 66425, + 0, 66615, 10177, 0, 41853, 71873, 12809, 0, 12193, 0, 10879, 0, 0, 9055, + 0, 3851, 8132, 0, 0, 119263, 917908, 0, 0, 0, 0, 0, 42657, 0, 7643, 0, 0, + 0, 43568, 0, 11949, 7650, 43569, 64951, 7647, 7649, 0, 7646, 0, 0, 9651, + 125005, 3891, 0, 0, 2337, 77831, 77832, 67860, 129288, 0, 0, 43561, + 67706, 119669, 0, 1860, 0, 68835, 5812, 12784, 0, 0, 0, 0, 69260, 7727, + 0, 69292, 69818, 66444, 128665, 42719, 0, 1569, 0, 12534, 12124, 7690, + 194871, 12533, 0, 68383, 67997, 0, 6969, 0, 0, 0, 67974, 63895, 128650, + 0, 0, 0, 42144, 0, 0, 0, 0, 92211, 119043, 0, 0, 917545, 0, 0, 12791, 0, + 0, 0, 4447, 71065, 12793, 0, 0, 43385, 0, 0, 12790, 120256, 0, 983821, + 12792, 120254, 0, 0, 12789, 128489, 12317, 74934, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127840, 41652, 2974, 78689, 11476, 0, 0, 0, 0, 43871, 0, 10894, + 119176, 74557, 65686, 0, 0, 3724, 67335, 67334, 67333, 67338, 67337, 0, + 67336, 0, 65306, 0, 128421, 0, 8646, 129593, 77829, 0, 0, 74852, 0, 0, 0, + 0, 0, 220, 120252, 43551, 0, 10044, 0, 0, 983828, 68659, 110825, 5707, + 71362, 0, 0, 0, 0, 0, 0, 10297, 0, 41308, 67331, 0, 0, 0, 0, 2467, 0, + 6003, 0, 0, 8040, 0, 0, 4182, 0, 11135, 120501, 0, 0, 2510, 0, 10208, 0, + 78302, 70829, 0, 0, 6837, 0, 0, 67348, 0, 0, 0, 0, 1559, 67342, 11104, + 67340, 67347, 67346, 67345, 67344, 0, 0, 67357, 67356, 0, 0, 0, 0, 67352, + 67351, 5516, 2845, 7717, 8036, 65161, 67353, 5514, 12045, 6278, 0, 5515, + 0, 0, 0, 0, 0, 65194, 100387, 5517, 70116, 92774, 0, 67884, 0, 67890, + 42094, 67880, 67881, 67882, 67883, 0, 0, 67879, 120411, 1902, 67887, + 67888, 12976, 126546, 12483, 12368, 41769, 42726, 41765, 69557, 12787, + 67874, 7556, 67878, 74351, 67897, 989, 42677, 67889, 0, 6060, 0, 4326, + 11000, 64601, 68478, 0, 0, 6917, 0, 120837, 0, 0, 0, 6148, 8605, 74205, + 0, 0, 0, 42715, 0, 101047, 0, 68663, 0, 41796, 1269, 42703, 64754, + 101049, 101042, 5144, 12221, 42716, 71048, 5133, 4331, 0, 128675, 0, + 5279, 121362, 71046, 0, 0, 42701, 0, 0, 0, 121470, 0, 0, 0, 0, 0, 983608, + 121259, 42666, 12207, 1067, 255, 12131, 0, 0, 0, 0, 0, 0, 0, 70728, + 43460, 0, 42723, 125216, 0, 70427, 0, 12797, 0, 0, 983703, 0, 67977, + 12799, 0, 92504, 9746, 5135, 0, 12796, 0, 0, 0, 5139, 346, 74303, 121134, + 12795, 125109, 5168, 0, 43845, 983708, 0, 8253, 8817, 1136, 983716, + 43563, 127774, 129542, 0, 0, 0, 0, 0, 0, 983619, 0, 0, 4041, 0, 2357, + 43240, 12786, 0, 0, 0, 44004, 7142, 0, 67984, 0, 0, 0, 0, 12785, 0, 0, + 7770, 10712, 64853, 42679, 118916, 42375, 0, 983123, 94074, 12119, 0, + 11059, 10791, 0, 450, 0, 0, 0, 0, 5450, 64691, 0, 0, 44009, 0, 0, 111097, + 94085, 1839, 94004, 0, 10927, 1701, 0, 129610, 41749, 41761, 5453, 8361, + 66045, 41758, 5444, 41763, 0, 0, 0, 66349, 983137, 121274, 0, 0, 8801, 0, + 4340, 0, 0, 0, 0, 70001, 41824, 0, 0, 0, 0, 42700, 0, 127980, 0, 0, 0, 0, + 0, 0, 4493, 4336, 129171, 2314, 983061, 41808, 0, 0, 0, 64638, 0, 65937, + 4489, 71331, 0, 0, 5358, 42717, 0, 71236, 0, 0, 0, 127042, 41813, 2712, + 0, 127044, 1410, 0, 0, 0, 0, 0, 0, 0, 0, 128587, 0, 0, 0, 4892, 0, 0, 0, + 0, 0, 5777, 0, 759, 0, 2079, 65248, 12788, 0, 64552, 0, 41803, 68043, 0, + 0, 0, 0, 128785, 0, 68492, 67991, 75071, 2340, 0, 120638, 0, 983883, 0, + 0, 0, 64749, 0, 2321, 3587, 0, 67236, 9953, 9952, 0, 0, 42714, 9951, 0, + 0, 127902, 74150, 0, 0, 74757, 127554, 0, 983807, 2395, 0, 9976, 0, + 125128, 0, 0, 0, 42809, 42807, 0, 66290, 70854, 4150, 64424, 8318, 41790, + 67976, 65559, 2360, 41794, 0, 0, 120987, 0, 0, 2418, 0, 2411, 0, 41783, + 0, 41786, 65108, 0, 0, 41772, 42813, 2317, 0, 118980, 0, 0, 0, 0, 0, 0, + 78682, 7753, 2351, 6655, 64489, 0, 0, 0, 4443, 41697, 230, 65793, 0, + 65943, 42803, 0, 0, 5441, 0, 0, 127053, 0, 855, 0, 6109, 101021, 0, + 119116, 69989, 0, 0, 72146, 0, 101023, 0, 72148, 0, 19915, 41892, 0, 0, + 128901, 41887, 0, 67980, 9735, 0, 0, 120591, 13082, 101026, 0, 0, 0, 0, + 0, 0, 0, 289, 0, 0, 64504, 0, 126130, 120514, 0, 92962, 0, 42724, 69977, + 0, 0, 0, 0, 67994, 0, 0, 0, 3565, 0, 0, 127553, 43035, 69898, 0, 0, 0, 0, + 4891, 0, 0, 4602, 0, 121065, 0, 0, 121157, 0, 43978, 8988, 0, 0, 0, 0, 0, + 119184, 121436, 73902, 69740, 0, 0, 72976, 0, 0, 8771, 0, 0, 0, 119209, + 74974, 71737, 0, 0, 67987, 0, 0, 0, 67989, 0, 10065, 8207, 0, 983588, 0, + 0, 662, 0, 41927, 0, 0, 0, 0, 0, 0, 0, 41929, 0, 0, 0, 41926, 69994, 0, + 0, 0, 126230, 68013, 1433, 64648, 6475, 0, 120983, 0, 73876, 0, 0, 0, + 67992, 78052, 0, 3978, 0, 0, 0, 0, 120761, 12281, 0, 0, 13241, 0, 0, 0, + 0, 11765, 42577, 0, 0, 2641, 7192, 0, 0, 118809, 101015, 0, 101016, 128948, 101013, 6479, 64294, 121194, 0, 0, 0, 64334, 0, 0, 0, 92266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9478, 127339, 124964, 0, 202, 0, 0, 1242, 0, 121170, 0, 63940, 0, 0, 0, 63939, 11990, 92430, 67982, 0, 65440, 70068, 0, 0, 64829, 0, 0, 0, 0, 0, 2858, 0, 63989, 0, 69239, 0, 121152, 0, 77841, 0, 70078, 92574, 129519, 0, 0, 0, 128974, 0, 12922, 92498, 0, 66424, 71124, 0, 0, 0, 2856, 0, 47, 0, 126986, 65858, 0, 0, 0, 0, 0, - 8417, 65903, 0, 0, 0, 4033, 128164, 0, 0, 0, 0, 64600, 1903, 12320, 0, - 120894, 0, 0, 8915, 0, 945, 0, 0, 0, 0, 111068, 0, 74828, 0, 0, 9531, 0, - 8505, 0, 119238, 0, 0, 65538, 0, 0, 0, 0, 0, 0, 63935, 0, 0, 0, 0, 0, - 64787, 111060, 0, 0, 110828, 0, 2230, 0, 0, 71886, 9843, 0, 92419, - 111062, 129337, 92715, 0, 1320, 0, 1673, 0, 92383, 0, 9338, 128355, 0, 0, - 0, 0, 11997, 0, 0, 0, 0, 0, 0, 43308, 0, 0, 0, 0, 0, 0, 0, 63920, 0, 0, - 0, 0, 0, 0, 3514, 78723, 0, 7492, 0, 0, 0, 7514, 0, 63924, 0, 7502, 7587, - 0, 0, 0, 0, 0, 7610, 0, 0, 120759, 692, 43588, 0, 0, 75056, 9688, 0, - 9535, 0, 0, 0, 64530, 0, 125251, 194861, 0, 72209, 7453, 0, 8013, 66396, - 0, 0, 8895, 5356, 0, 5458, 0, 2866, 0, 127860, 71732, 71724, 6700, 0, - 111081, 120583, 0, 110614, 0, 9641, 63830, 65294, 0, 0, 67969, 0, 7441, - 0, 63826, 0, 0, 0, 0, 2844, 983953, 0, 63824, 12139, 67971, 0, 0, 3358, - 65295, 0, 3104, 0, 0, 0, 0, 65772, 0, 0, 0, 0, 2862, 11326, 0, 0, 94001, - 3268, 66591, 0, 6552, 42367, 7035, 120558, 0, 0, 1814, 195092, 10240, - 195093, 0, 0, 0, 0, 0, 71454, 0, 0, 2837, 4341, 0, 0, 0, 125064, 0, 0, 0, - 0, 0, 72721, 863, 129125, 0, 0, 43323, 0, 0, 0, 68054, 0, 3654, 0, 0, 0, - 0, 0, 7653, 0, 0, 66587, 0, 0, 92401, 0, 0, 12927, 0, 0, 0, 13056, 0, 0, - 3056, 0, 0, 195101, 0, 0, 74506, 73770, 0, 0, 0, 0, 0, 0, 0, 0, 983681, - 0, 5811, 0, 0, 0, 66817, 983836, 0, 0, 128636, 129311, 0, 128041, 0, - 67739, 120965, 0, 0, 0, 0, 68375, 0, 0, 70300, 0, 0, 0, 983679, 111078, - 0, 11991, 128079, 0, 92943, 1502, 74117, 127988, 0, 129478, 121253, 0, - 67661, 0, 0, 125084, 120758, 0, 74057, 68639, 0, 42898, 120742, 0, 74388, - 74838, 120822, 0, 0, 0, 0, 69452, 43214, 5893, 0, 0, 92496, 0, 0, 119907, - 119900, 0, 0, 0, 0, 41950, 0, 0, 68610, 0, 68626, 894, 0, 0, 12306, - 73846, 0, 0, 0, 8636, 0, 121028, 42503, 0, 92942, 0, 121468, 119241, 0, - 126569, 5096, 5095, 2863, 127505, 0, 10454, 42530, 5094, 0, 0, 13156, 0, - 111035, 5093, 127178, 983414, 0, 5092, 10708, 11327, 0, 5091, 0, 0, 9153, - 4104, 78599, 78601, 2929, 42712, 75067, 12272, 9832, 0, 0, 111105, 0, 0, - 0, 0, 0, 0, 13106, 0, 0, 129111, 0, 0, 0, 0, 9074, 111111, 0, 111110, 0, - 8113, 11168, 92563, 1786, 111109, 0, 111108, 0, 74423, 0, 586, 74414, - 64359, 1267, 0, 127531, 0, 65731, 0, 0, 0, 92932, 0, 0, 0, 0, 0, 0, 1228, - 0, 42846, 0, 0, 70343, 1714, 74406, 0, 0, 0, 127389, 66225, 0, 0, 42660, - 0, 0, 3804, 0, 0, 0, 0, 2826, 0, 0, 0, 128396, 0, 0, 0, 0, 0, 0, 12206, - 5839, 0, 68524, 74065, 0, 0, 0, 126240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67241, 917821, 7030, 0, 10479, 64959, 2852, 0, 121225, 0, 0, 128586, 0, - 6963, 0, 0, 0, 74786, 0, 0, 0, 0, 121281, 0, 0, 0, 0, 113815, 121360, 0, - 9994, 0, 2864, 64719, 1148, 0, 41677, 0, 0, 2765, 0, 128181, 0, 0, 0, - 92516, 74777, 0, 0, 65206, 0, 0, 0, 0, 69391, 0, 0, 983751, 0, 41839, - 129616, 983754, 0, 0, 6931, 0, 0, 7177, 125137, 0, 0, 0, 93020, 0, 10722, - 0, 0, 128186, 121050, 0, 0, 127207, 0, 750, 0, 0, 63912, 0, 0, 7032, 0, - 0, 4314, 128600, 0, 128409, 730, 0, 127866, 0, 0, 41380, 0, 0, 0, 69697, - 8240, 92939, 0, 41378, 0, 6938, 70026, 0, 0, 66246, 0, 0, 0, 0, 0, 0, - 983094, 0, 92754, 41470, 64805, 0, 0, 0, 0, 0, 0, 0, 0, 92938, 68370, 0, - 0, 73831, 0, 0, 0, 2872, 0, 0, 0, 0, 604, 41097, 0, 0, 0, 0, 0, 127488, - 0, 2836, 0, 0, 9707, 0, 43202, 0, 0, 0, 0, 0, 120916, 2832, 92702, 9670, - 12937, 0, 0, 0, 0, 2822, 0, 0, 92519, 0, 73752, 0, 0, 0, 1331, 92603, 0, - 0, 0, 129432, 5090, 5089, 0, 3200, 0, 0, 0, 5088, 0, 0, 9477, 0, 0, 5087, - 92325, 0, 96, 5086, 0, 0, 0, 5085, 64286, 0, 0, 43820, 0, 983722, 0, 0, - 119042, 0, 0, 0, 0, 0, 0, 0, 127241, 120891, 7601, 0, 591, 0, 118953, 0, - 0, 0, 0, 0, 10939, 7246, 6933, 67142, 67141, 0, 74600, 120695, 0, 67138, - 65574, 0, 78058, 67140, 73851, 74598, 67139, 128094, 0, 6372, 0, 0, 7963, - 6371, 0, 0, 125040, 0, 0, 0, 0, 0, 0, 0, 8258, 123591, 0, 0, 65148, - 118919, 42, 0, 0, 0, 0, 0, 0, 0, 0, 67135, 67134, 67133, 0, 0, 0, 0, - 67136, 67130, 74597, 11550, 0, 67132, 65868, 0, 12826, 127872, 0, 126235, - 9737, 92448, 0, 0, 0, 8878, 0, 0, 0, 0, 0, 72220, 9086, 0, 0, 0, 7437, - 7454, 0, 0, 0, 0, 9042, 0, 0, 0, 0, 3805, 0, 67128, 44001, 67126, 0, - 44022, 19949, 12200, 43522, 983045, 43525, 0, 0, 0, 64422, 67125, 67124, - 7602, 0, 0, 43521, 0, 0, 43711, 43523, 41447, 8424, 68483, 8704, 2397, 0, - 0, 0, 0, 0, 10916, 0, 129290, 93998, 0, 0, 0, 127800, 67686, 9961, - 123203, 0, 68842, 10792, 8889, 121402, 6951, 0, 68827, 917835, 74342, 0, - 0, 0, 68816, 129152, 0, 42909, 66597, 70092, 0, 0, 10481, 4559, 0, 1956, - 43138, 0, 0, 43490, 43148, 0, 0, 0, 43140, 0, 0, 0, 0, 73013, 8533, 0, 0, - 0, 0, 0, 4357, 0, 70289, 983156, 0, 42911, 0, 0, 0, 10941, 0, 6962, 0, 0, - 113808, 0, 11014, 0, 8942, 12000, 0, 0, 0, 0, 0, 0, 42650, 0, 75016, - 63975, 0, 66210, 0, 0, 129150, 0, 11193, 0, 0, 0, 0, 0, 0, 0, 43476, 0, - 11024, 74811, 72787, 10563, 92954, 0, 0, 2462, 92955, 0, 0, 66213, 6957, - 0, 120559, 0, 0, 0, 74594, 983419, 92347, 0, 110702, 110708, 110707, - 127119, 3109, 127117, 119909, 0, 121434, 0, 0, 4042, 0, 0, 0, 127123, - 127122, 127121, 0, 127999, 0, 3503, 74444, 68300, 6694, 127997, 0, 0, - 74306, 0, 983738, 7736, 0, 0, 0, 10521, 0, 42173, 9705, 0, 0, 6955, - 71467, 0, 6149, 3887, 19956, 1411, 2824, 0, 0, 0, 1403, 0, 1347, 66282, - 127996, 0, 0, 0, 0, 8640, 0, 1178, 1654, 0, 0, 129529, 43314, 0, 0, 0, 0, - 2873, 0, 0, 0, 67085, 10861, 0, 0, 70377, 0, 67082, 67081, 41391, 67084, - 0, 376, 6987, 983181, 119904, 0, 8823, 0, 12943, 65185, 100988, 42099, 0, - 0, 100990, 0, 8301, 0, 0, 1684, 0, 0, 0, 120620, 0, 0, 0, 42121, 0, - 66781, 78067, 42115, 0, 127998, 0, 67080, 1493, 42111, 67077, 4097, 0, - 983748, 0, 65808, 41642, 0, 0, 67076, 41636, 67074, 65095, 110660, 72254, - 121240, 41629, 12154, 75073, 0, 128179, 74084, 64380, 0, 0, 0, 0, 0, - 71193, 65371, 7078, 0, 0, 0, 74592, 0, 0, 43275, 0, 41434, 6062, 0, 0, - 19916, 0, 6950, 9606, 9842, 0, 65744, 0, 0, 128659, 0, 41615, 10105, 0, - 0, 41632, 7493, 0, 0, 41622, 0, 0, 0, 0, 7632, 983215, 983214, 9805, - 5990, 900, 0, 0, 0, 0, 3612, 0, 64376, 0, 5389, 129469, 0, 0, 2839, 9621, + 8417, 65903, 0, 0, 0, 4033, 128164, 0, 0, 0, 129961, 64600, 1903, 12320, + 0, 120894, 0, 0, 8915, 0, 945, 0, 0, 0, 0, 111068, 0, 74828, 0, 69560, + 9531, 0, 8505, 0, 119238, 0, 0, 65538, 0, 0, 0, 0, 0, 0, 63935, 0, 0, 0, + 0, 0, 64787, 111060, 0, 0, 110828, 0, 2230, 0, 0, 71886, 9843, 0, 92419, + 111062, 129337, 92715, 0, 1320, 0, 1673, 0, 92383, 129902, 9338, 128355, + 0, 0, 0, 0, 11997, 0, 0, 0, 0, 0, 0, 43308, 0, 0, 0, 0, 0, 0, 0, 63920, + 0, 0, 0, 0, 0, 0, 3514, 78723, 0, 7492, 0, 0, 0, 7514, 0, 63924, 0, 7502, + 7587, 0, 0, 0, 0, 43881, 7610, 0, 0, 120759, 692, 43588, 0, 0, 75056, + 9688, 0, 9535, 0, 0, 0, 64530, 0, 125251, 194861, 0, 72209, 7453, 0, + 8013, 66396, 0, 0, 8895, 5356, 0, 5458, 0, 2866, 0, 127860, 71732, 71724, + 6700, 0, 111081, 120583, 0, 110614, 0, 9641, 63830, 65294, 0, 0, 67969, + 0, 7441, 0, 63826, 0, 0, 0, 0, 2844, 983953, 0, 63824, 12139, 67971, 0, + 0, 3358, 65295, 0, 3104, 0, 0, 0, 0, 65772, 0, 0, 0, 0, 2862, 11326, 0, + 0, 94001, 3268, 66591, 0, 6552, 42367, 7035, 120558, 0, 0, 1814, 195092, + 10240, 195093, 0, 0, 0, 0, 0, 71454, 0, 0, 2837, 4341, 0, 0, 129982, + 125064, 0, 0, 0, 0, 0, 72721, 863, 129125, 0, 0, 43323, 0, 0, 0, 68054, + 0, 3654, 0, 0, 0, 0, 0, 7653, 0, 0, 66587, 0, 0, 92401, 0, 0, 12927, 0, + 0, 129697, 13056, 0, 0, 3056, 0, 0, 195101, 0, 0, 74506, 73770, 0, 0, 0, + 0, 0, 0, 0, 0, 72233, 0, 5811, 0, 0, 0, 66817, 983836, 0, 0, 128636, + 129311, 0, 128041, 0, 67739, 120965, 0, 0, 0, 0, 68375, 0, 0, 70300, 0, + 0, 0, 983679, 111078, 0, 11991, 128079, 0, 92943, 1502, 74117, 127988, 0, + 129478, 121253, 0, 67661, 0, 0, 125084, 120758, 0, 74057, 68639, 0, + 42898, 120742, 0, 74388, 74838, 120822, 0, 0, 0, 0, 69452, 43214, 5893, + 0, 0, 92496, 0, 0, 119907, 119900, 0, 0, 0, 0, 41950, 0, 0, 68610, 0, + 68626, 894, 0, 0, 12306, 73846, 0, 0, 0, 8636, 0, 121028, 42503, 0, + 92942, 0, 121468, 119241, 0, 126569, 5096, 5095, 2863, 127505, 0, 10454, + 42530, 5094, 0, 0, 13156, 0, 111035, 5093, 127178, 983414, 0, 5092, + 10708, 11327, 0, 5091, 0, 0, 9153, 4104, 78599, 78601, 2929, 42712, + 75067, 12272, 9832, 0, 0, 111105, 0, 0, 0, 0, 0, 0, 13106, 0, 0, 129111, + 0, 0, 0, 0, 9074, 111111, 0, 111110, 0, 8113, 11168, 92563, 1786, 111109, + 0, 111108, 0, 74423, 0, 586, 74414, 64359, 1267, 0, 127531, 0, 65731, 0, + 0, 0, 92932, 0, 0, 0, 0, 0, 0, 1228, 0, 42846, 0, 0, 70343, 1714, 74406, + 0, 0, 0, 127389, 66225, 0, 0, 42660, 0, 0, 3804, 0, 0, 129859, 0, 2826, + 0, 0, 0, 128396, 0, 0, 0, 0, 0, 0, 12206, 5839, 0, 68524, 74065, 0, 0, 0, + 126240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67241, 917821, 7030, 0, 10479, + 64959, 2852, 0, 121225, 0, 0, 128586, 0, 6963, 0, 0, 0, 74786, 0, 0, 0, + 0, 121281, 0, 0, 0, 0, 113815, 121360, 0, 9994, 0, 2864, 64719, 1148, 0, + 41677, 0, 0, 2765, 0, 128181, 0, 0, 0, 92516, 74777, 0, 0, 65206, 0, 0, + 0, 0, 69391, 0, 0, 983751, 0, 41839, 129616, 983754, 0, 0, 6931, 0, 0, + 7177, 125137, 0, 0, 0, 93020, 0, 10722, 0, 0, 128186, 121050, 0, 0, + 127207, 0, 750, 0, 129453, 63912, 0, 0, 7032, 0, 0, 4314, 128600, 0, + 128409, 730, 0, 127866, 0, 0, 41380, 0, 0, 0, 69697, 8240, 92939, 0, + 41378, 0, 6938, 70026, 0, 0, 66246, 0, 0, 0, 0, 0, 0, 983094, 0, 92754, + 41470, 64805, 0, 0, 0, 0, 0, 0, 0, 0, 92938, 68370, 0, 0, 73831, 0, 0, 0, + 2872, 0, 0, 0, 0, 604, 41097, 0, 0, 0, 0, 0, 127488, 0, 2836, 0, 0, 9707, + 0, 43202, 0, 0, 0, 0, 0, 120916, 2832, 92702, 9670, 12937, 0, 0, 0, 0, + 2822, 0, 0, 92519, 0, 73752, 0, 0, 0, 1331, 92603, 0, 11856, 0, 129432, + 5090, 5089, 0, 3200, 0, 0, 0, 5088, 0, 0, 9477, 0, 0, 5087, 92325, 0, 96, + 5086, 0, 0, 0, 5085, 64286, 0, 0, 43820, 0, 983722, 0, 0, 119042, 0, 0, + 0, 0, 0, 0, 0, 127241, 120891, 7601, 0, 591, 0, 118953, 0, 0, 0, 0, 0, + 10939, 7246, 6933, 67142, 67141, 0, 74600, 120695, 0, 67138, 65574, 0, + 78058, 67140, 73851, 74598, 67139, 128094, 0, 6372, 0, 0, 7963, 6371, 0, + 0, 125040, 0, 0, 0, 0, 0, 0, 0, 8258, 123591, 0, 0, 65148, 118919, 42, 0, + 0, 0, 0, 0, 0, 0, 0, 67135, 67134, 67133, 0, 0, 0, 0, 67136, 67130, + 74597, 11550, 0, 67132, 65868, 0, 12826, 127872, 0, 126235, 9737, 92448, + 0, 0, 0, 8878, 0, 0, 0, 0, 0, 72220, 9086, 0, 0, 0, 7437, 7454, 0, 0, 0, + 0, 9042, 0, 0, 0, 0, 3805, 0, 67128, 44001, 67126, 0, 44022, 19949, + 12200, 43522, 983045, 43525, 0, 0, 0, 64422, 67125, 67124, 7602, 0, 0, + 43521, 0, 0, 43711, 43523, 41447, 8424, 68483, 8704, 2397, 0, 0, 0, 0, 0, + 10916, 0, 129290, 93998, 0, 0, 0, 127800, 67686, 9961, 123203, 0, 68842, + 10792, 8889, 121402, 6951, 0, 68827, 917835, 74342, 0, 0, 0, 68816, + 129152, 0, 42909, 66597, 70092, 0, 0, 10481, 4559, 0, 1956, 43138, 0, 0, + 43490, 43148, 0, 0, 0, 43140, 0, 0, 0, 0, 69268, 8533, 0, 0, 0, 0, 0, + 4357, 0, 70289, 983156, 0, 42911, 0, 0, 0, 10941, 0, 6962, 0, 0, 113808, + 0, 11014, 0, 8942, 12000, 0, 0, 0, 0, 0, 0, 42650, 0, 75016, 63975, 0, + 66210, 0, 0, 129150, 0, 11193, 0, 0, 0, 0, 0, 0, 0, 43476, 0, 11024, + 74811, 72787, 10563, 92954, 0, 0, 2462, 92955, 0, 0, 66213, 6957, 0, + 120559, 0, 0, 0, 74594, 983419, 92347, 0, 110702, 110708, 110707, 127119, + 3109, 127117, 119909, 0, 121434, 0, 0, 4042, 0, 0, 0, 127123, 127122, + 127121, 0, 127999, 0, 3503, 74444, 68300, 6694, 127997, 0, 0, 74306, 0, + 983738, 7736, 0, 0, 0, 10521, 0, 42173, 9705, 0, 0, 6955, 71467, 0, 6149, + 3887, 19956, 1411, 2824, 0, 0, 0, 1403, 0, 1347, 66282, 127996, 0, 0, 0, + 0, 8640, 0, 1178, 1654, 0, 0, 129529, 43314, 0, 0, 0, 0, 2873, 0, 0, 0, + 67085, 10861, 0, 0, 70377, 0, 67082, 11159, 41391, 67084, 0, 376, 6987, + 983181, 119904, 0, 8823, 0, 12943, 65185, 100988, 42099, 0, 0, 100990, 0, + 8301, 0, 0, 1684, 0, 0, 0, 120620, 0, 0, 0, 42121, 0, 66781, 78067, + 42115, 0, 127998, 0, 67080, 1493, 42111, 67077, 4097, 0, 983748, 0, + 65808, 41642, 0, 0, 67076, 41636, 67074, 65095, 110660, 72254, 121240, + 41629, 12154, 75073, 0, 128179, 74084, 64380, 0, 0, 0, 0, 0, 71193, + 65371, 7078, 0, 0, 0, 74592, 0, 0, 43275, 0, 41434, 6062, 0, 0, 19916, 0, + 6950, 9606, 9842, 0, 65744, 0, 0, 128659, 0, 41615, 10105, 0, 0, 41632, + 7493, 0, 0, 41622, 0, 0, 0, 0, 7632, 983215, 983214, 9805, 5990, 900, 0, + 983386, 0, 120869, 3612, 0, 64376, 0, 5389, 129469, 0, 0, 2839, 9621, 582, 0, 0, 3749, 0, 7569, 0, 0, 129472, 6956, 4403, 0, 0, 3299, 0, 0, - 119127, 65676, 0, 74373, 0, 983492, 7598, 69819, 42469, 42242, 1918, + 119127, 65676, 0, 74372, 0, 983492, 7598, 69819, 42469, 42242, 1918, 9542, 480, 7716, 0, 0, 0, 0, 0, 69918, 0, 8328, 0, 118894, 0, 0, 0, 0, 11132, 0, 66743, 74185, 100531, 2854, 66747, 0, 65755, 0, 67120, 67119, 65835, 67117, 66736, 67123, 67122, 67121, 9881, 100481, 65757, 100538, @@ -24188,17 +24993,17 @@ static const unsigned int code_hash[] = { 41998, 0, 6946, 77920, 0, 123610, 0, 0, 0, 121442, 42690, 9880, 0, 0, 64589, 0, 0, 127880, 68035, 0, 11360, 0, 0, 72242, 0, 0, 0, 0, 0, 64941, 0, 0, 0, 0, 65671, 11244, 73706, 6959, 41994, 42907, 0, 0, 122902, 8617, - 41982, 8860, 0, 0, 0, 0, 0, 9597, 0, 43172, 0, 10117, 0, 92297, 65865, 0, - 0, 128077, 0, 126065, 0, 187, 0, 65669, 0, 4963, 0, 0, 0, 8964, 0, 7775, - 0, 41948, 0, 0, 101010, 41942, 65449, 3160, 65922, 13226, 42665, 0, - 42663, 128210, 41766, 0, 78848, 78849, 41760, 1189, 905, 110620, 42658, - 78851, 67859, 9629, 6742, 0, 43625, 12952, 7888, 0, 3980, 0, 42656, 0, - 42055, 0, 0, 0, 64540, 0, 7867, 69218, 6236, 0, 0, 10505, 0, 12851, - 118948, 0, 5474, 128843, 3103, 0, 41753, 41733, 78051, 983472, 78844, - 78845, 41739, 78843, 70744, 10931, 41756, 43347, 68098, 122909, 41746, - 119147, 92591, 41259, 917848, 69930, 2691, 121338, 11231, 41244, 0, - 69800, 66364, 41262, 0, 0, 0, 41251, 0, 0, 11805, 0, 0, 68331, 94045, 0, - 0, 0, 74633, 41266, 126642, 0, 0, 0, 65741, 41737, 2275, 2666, 121232, + 41982, 8860, 0, 0, 121256, 0, 0, 9597, 0, 43172, 0, 10117, 0, 92297, + 65865, 0, 0, 128077, 0, 126065, 0, 187, 0, 65669, 0, 4963, 0, 0, 0, 8964, + 0, 7775, 0, 41948, 0, 0, 101010, 41942, 65449, 3160, 65922, 13226, 42665, + 0, 42663, 128210, 41766, 0, 78848, 78849, 41760, 1189, 905, 110620, + 42658, 78851, 67859, 9629, 6742, 0, 43625, 12952, 7888, 0, 3980, 0, + 42656, 0, 42055, 0, 0, 0, 64540, 0, 7867, 69218, 6236, 0, 0, 10505, 0, + 12851, 118948, 0, 5474, 128843, 3103, 0, 41753, 41733, 78051, 983472, + 78844, 78845, 41739, 78843, 70744, 10931, 41756, 43347, 68098, 122909, + 41746, 119147, 92591, 41259, 917848, 69930, 2691, 121338, 11231, 41244, + 0, 69800, 66364, 41262, 0, 0, 0, 41251, 0, 0, 11805, 0, 0, 68331, 94045, + 0, 0, 0, 74633, 41266, 126642, 0, 0, 0, 65741, 41737, 2275, 2666, 121232, 41738, 4967, 419, 13126, 0, 0, 42822, 0, 6434, 74913, 0, 0, 6432, 0, 69932, 128862, 769, 41742, 69927, 74805, 6433, 0, 547, 1943, 6439, 0, 4994, 487, 0, 0, 3754, 0, 0, 0, 0, 74780, 0, 0, 1595, 92777, 74431, 0, 0, @@ -24232,199 +25037,201 @@ static const unsigned int code_hash[] = { 120401, 12853, 43269, 7263, 120244, 6536, 120238, 120239, 65516, 12321, 120391, 120388, 55287, 2237, 120246, 9588, 120248, 120382, 120383, 120380, 120381, 0, 0, 3561, 0, 0, 10613, 0, 0, 0, 0, 0, 128689, 5006, - 64328, 68219, 917894, 0, 8825, 0, 0, 0, 0, 128616, 0, 119177, 0, 0, + 64328, 68219, 917894, 0, 8825, 129880, 0, 0, 0, 128616, 0, 119177, 0, 0, 128641, 120225, 71366, 120227, 120228, 438, 4510, 41707, 8721, 120233, 120234, 120235, 12840, 120229, 10845, 120231, 8096, 0, 120935, 0, 0, 65589, 8733, 0, 0, 0, 0, 0, 0, 93984, 11262, 73747, 128522, 0, 64591, - 42405, 0, 0, 1632, 127982, 128326, 0, 0, 0, 121477, 42444, 0, 0, 215, - 41258, 128494, 64494, 1953, 10185, 0, 1256, 3910, 41260, 917903, 0, 0, - 41257, 0, 8675, 10700, 0, 0, 0, 9333, 0, 121471, 0, 0, 0, 0, 0, 499, 0, - 70729, 42915, 0, 101000, 0, 100999, 0, 0, 73111, 0, 122897, 0, 125006, 0, - 11118, 0, 128009, 0, 0, 128980, 9180, 0, 0, 0, 100986, 43438, 0, 0, 0, 0, - 0, 120669, 64782, 0, 0, 73969, 565, 42484, 118913, 201, 0, 42292, 69610, - 0, 0, 119625, 43518, 0, 0, 1022, 113788, 3880, 74247, 0, 0, 0, 0, 0, 0, - 0, 0, 72272, 100997, 0, 0, 0, 74255, 0, 0, 92598, 0, 9903, 118993, 0, - 68226, 0, 0, 0, 127788, 100955, 83280, 7892, 0, 10777, 0, 0, 65562, 0, - 101002, 0, 8039, 3363, 101009, 0, 0, 0, 12596, 70812, 0, 0, 0, 0, 0, - 92425, 74992, 64541, 0, 0, 10520, 12802, 0, 12998, 0, 83270, 42861, - 83273, 11415, 0, 7541, 125068, 65878, 822, 0, 0, 5774, 194746, 43252, 0, - 92619, 7672, 129281, 0, 0, 7463, 0, 0, 0, 0, 0, 0, 121411, 0, 0, 0, 0, 0, - 475, 0, 120586, 7329, 0, 0, 195088, 66291, 10645, 0, 6543, 0, 0, 0, - 119065, 0, 0, 0, 983233, 195095, 0, 8923, 1645, 0, 0, 0, 3196, 72404, 0, - 0, 43595, 0, 0, 0, 0, 0, 195076, 0, 0, 5258, 4328, 0, 0, 0, 405, 11454, - 0, 0, 0, 0, 75052, 41245, 0, 0, 4523, 11369, 0, 0, 0, 195079, 0, 0, - 983505, 0, 100961, 10480, 74610, 0, 0, 0, 12610, 0, 41247, 0, 7609, - 118837, 0, 0, 92253, 0, 984, 0, 92621, 0, 0, 0, 983501, 0, 0, 0, 43369, - 0, 0, 0, 983502, 6634, 0, 0, 0, 0, 74214, 0, 67709, 0, 0, 0, 71114, 9552, - 0, 0, 0, 12997, 0, 0, 0, 0, 129109, 12883, 10994, 10529, 55283, 0, 74618, - 0, 67736, 10661, 19951, 9614, 2428, 0, 121023, 0, 126224, 100966, 71127, - 0, 124996, 119162, 1952, 92181, 8455, 100958, 0, 93033, 119566, 100960, - 0, 12183, 100951, 0, 64929, 0, 0, 0, 128290, 42509, 73087, 3922, 9187, - 983626, 0, 0, 119057, 0, 3353, 9358, 0, 0, 66680, 0, 73975, 12879, 0, - 9795, 68380, 0, 0, 0, 0, 0, 41027, 0, 0, 0, 983631, 0, 70378, 0, 11751, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129356, 0, 0, 0, 0, 41029, 0, 126513, 0, 0, - 0, 11294, 0, 66665, 0, 0, 127750, 0, 0, 70105, 0, 0, 0, 67843, 0, 0, - 121167, 983876, 0, 8088, 129412, 0, 0, 0, 983973, 6926, 72423, 0, 129569, - 42369, 4350, 0, 65145, 9041, 43559, 0, 0, 0, 41263, 0, 0, 0, 65825, 9577, - 68199, 0, 0, 983121, 0, 6793, 0, 70409, 0, 0, 0, 0, 64669, 0, 0, 0, - 11200, 72725, 2995, 0, 0, 0, 7868, 72720, 983560, 11386, 1009, 70405, - 66871, 2333, 0, 0, 0, 0, 0, 70407, 128121, 0, 0, 0, 0, 0, 0, 0, 74968, 0, - 0, 110601, 0, 0, 41261, 0, 0, 0, 0, 118989, 6736, 917883, 0, 43010, - 127889, 0, 69635, 73011, 983697, 0, 0, 7293, 0, 0, 0, 0, 111332, 0, - 128245, 69928, 0, 0, 127072, 64445, 111336, 6635, 0, 0, 72707, 74936, 0, - 0, 917876, 0, 93025, 0, 0, 111329, 0, 0, 128045, 65219, 11925, 0, 92434, - 0, 0, 9845, 0, 7546, 0, 0, 11230, 4985, 13288, 672, 8098, 0, 0, 0, - 128126, 42655, 0, 0, 1577, 11772, 78327, 0, 66673, 0, 65911, 122908, 0, - 0, 129391, 92180, 0, 0, 0, 125140, 0, 0, 0, 119593, 1539, 0, 74969, - 42731, 0, 74970, 71066, 0, 3051, 0, 73783, 0, 0, 0, 0, 78777, 0, 983160, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3505, 8707, 0, 6725, 128013, 0, 92314, 0, - 66391, 5479, 0, 6686, 0, 0, 983313, 42754, 0, 0, 0, 0, 0, 0, 128523, 0, - 0, 4433, 41156, 0, 74971, 1443, 9339, 0, 0, 10926, 0, 43511, 0, 0, - 983319, 0, 126086, 72236, 10021, 0, 0, 0, 65914, 0, 66749, 0, 6721, 217, - 12466, 0, 0, 10443, 0, 68654, 0, 0, 0, 78334, 0, 41250, 0, 129532, 0, 0, - 0, 69232, 0, 41252, 66682, 0, 119637, 41249, 1366, 0, 0, 0, 0, 0, 4397, - 0, 0, 0, 9545, 121219, 0, 0, 0, 3511, 0, 92190, 0, 0, 126244, 760, 0, - 12088, 0, 0, 42256, 0, 0, 417, 0, 111347, 41565, 74965, 0, 111355, 0, 0, - 0, 2284, 0, 0, 983257, 0, 0, 0, 0, 0, 0, 42273, 0, 69430, 0, 0, 126643, - 0, 65910, 0, 10246, 0, 68224, 12169, 128858, 4552, 0, 0, 0, 1375, 66705, + 42405, 0, 0, 1632, 127982, 128326, 0, 0, 121327, 121477, 42444, 0, 0, + 215, 41258, 128494, 64494, 1953, 10185, 0, 1256, 3910, 41260, 917903, 0, + 0, 41257, 0, 8675, 10700, 0, 124951, 0, 9333, 0, 121471, 0, 0, 0, 0, 0, + 499, 0, 70729, 42915, 0, 101000, 0, 100999, 0, 0, 73111, 0, 122897, 0, + 125006, 0, 11118, 0, 128009, 0, 0, 128980, 9180, 0, 0, 0, 100986, 43438, + 0, 0, 0, 0, 0, 120669, 64782, 0, 0, 73969, 565, 42484, 118913, 201, 0, + 42292, 69610, 0, 0, 119625, 43518, 0, 0, 1022, 113788, 3880, 74247, 0, 0, + 0, 0, 0, 0, 0, 0, 72272, 100997, 0, 0, 0, 74255, 0, 0, 92598, 0, 9903, + 118993, 0, 68226, 0, 0, 0, 127788, 100955, 83280, 7892, 0, 10777, 0, 0, + 65562, 0, 101002, 0, 8039, 3363, 101009, 0, 0, 0, 12596, 70812, 0, 0, 0, + 0, 71962, 92425, 74992, 64541, 0, 0, 10520, 12802, 0, 12998, 0, 83270, + 42861, 83273, 11415, 0, 7541, 125068, 65878, 822, 0, 0, 5774, 194746, + 43252, 0, 92619, 7672, 129281, 0, 0, 7463, 0, 0, 0, 0, 0, 0, 121411, 0, + 0, 0, 0, 0, 475, 0, 120586, 7329, 0, 0, 195088, 66291, 10645, 0, 6543, 0, + 0, 0, 119065, 0, 0, 0, 983233, 195095, 0, 8923, 1645, 0, 0, 0, 3196, + 72404, 0, 0, 43595, 0, 0, 0, 0, 0, 195076, 0, 0, 5258, 4328, 0, 0, 0, + 405, 11454, 0, 0, 0, 0, 75052, 41245, 0, 195078, 4523, 11369, 0, 0, 0, + 195079, 0, 0, 983505, 0, 100961, 10480, 74610, 0, 0, 0, 12610, 0, 41247, + 0, 7609, 118837, 0, 0, 92253, 0, 984, 0, 92621, 0, 0, 129885, 73982, 0, + 0, 0, 43369, 0, 0, 0, 983502, 6634, 0, 71952, 0, 0, 74214, 0, 67709, 0, + 0, 0, 71114, 9552, 0, 0, 0, 12997, 0, 0, 0, 0, 129109, 12883, 10994, + 10529, 55283, 0, 74618, 0, 67736, 10661, 19951, 9614, 2428, 0, 121023, 0, + 126224, 100966, 71127, 0, 124996, 119162, 1952, 92181, 8455, 100958, 0, + 93033, 119566, 100960, 0, 12183, 100951, 0, 64929, 0, 0, 0, 128290, + 42509, 73087, 3922, 9187, 983626, 0, 0, 119057, 0, 3353, 9358, 0, 0, + 66680, 0, 73975, 12879, 0, 9795, 68380, 0, 0, 0, 0, 0, 41027, 0, 0, 0, + 983631, 0, 70378, 0, 11751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129356, 0, 0, + 0, 0, 41029, 0, 126513, 0, 0, 0, 11294, 0, 66665, 0, 0, 127750, 0, 0, + 70105, 0, 0, 0, 67843, 0, 0, 121167, 983876, 0, 8088, 129412, 0, 0, 0, + 983973, 6926, 72423, 0, 129569, 42369, 4350, 0, 65145, 9041, 43559, 0, 0, + 0, 41263, 0, 0, 0, 65825, 9577, 68199, 0, 0, 983121, 0, 6793, 0, 70409, + 0, 0, 0, 0, 64669, 0, 0, 0, 11200, 72725, 2995, 0, 0, 0, 7868, 72720, + 72020, 11386, 1009, 70405, 66871, 2333, 0, 0, 0, 0, 0, 70407, 128121, 0, + 0, 0, 0, 0, 0, 0, 74968, 0, 0, 110601, 0, 0, 41261, 0, 0, 0, 0, 118989, + 6736, 917883, 0, 43010, 127889, 0, 69635, 73011, 983697, 0, 0, 7293, 0, + 0, 0, 0, 111332, 0, 128245, 69928, 0, 0, 127072, 64445, 111336, 6635, 0, + 0, 72707, 74936, 0, 0, 917876, 0, 93025, 0, 0, 111329, 0, 129887, 128045, + 65219, 11925, 0, 92434, 0, 0, 9845, 101317, 7546, 0, 0, 11230, 4985, + 13288, 672, 8098, 0, 0, 0, 128126, 42655, 0, 0, 1577, 11772, 78327, 0, + 66673, 0, 65911, 122908, 0, 0, 101303, 92180, 0, 0, 120566, 125140, 0, 0, + 0, 119593, 1539, 0, 74969, 42731, 0, 74970, 71066, 0, 3051, 0, 73783, 0, + 0, 0, 0, 78777, 0, 983160, 0, 0, 101310, 0, 0, 0, 0, 0, 0, 3505, 8707, 0, + 6725, 128013, 0, 92314, 0, 66391, 5479, 0, 6686, 0, 0, 983313, 42754, 0, + 0, 0, 0, 0, 0, 128523, 0, 0, 4433, 41156, 0, 74971, 1443, 9339, 0, 0, + 10926, 0, 43511, 0, 0, 983319, 0, 126086, 72236, 10021, 0, 101329, 0, + 65914, 0, 66749, 0, 6721, 217, 12466, 0, 0, 10443, 0, 68654, 0, 0, 0, + 78334, 0, 41250, 0, 129532, 128375, 0, 0, 69232, 0, 41252, 66682, 0, + 119637, 41249, 1366, 0, 0, 101326, 0, 0, 4397, 101324, 0, 0, 9545, + 101323, 0, 0, 0, 3511, 0, 92190, 0, 0, 126244, 760, 0, 12088, 0, 0, + 42256, 0, 0, 417, 0, 111347, 41565, 74965, 0, 111355, 0, 0, 0, 2284, 0, + 0, 983257, 0, 0, 0, 0, 0, 0, 42273, 0, 69430, 121041, 0, 126643, 0, + 65910, 0, 10246, 0, 68224, 12169, 128858, 4552, 0, 0, 0, 1375, 66705, 128412, 0, 3329, 0, 42811, 74251, 74192, 120794, 7840, 0, 0, 65374, 0, 0, 71072, 0, 4396, 0, 126608, 0, 10331, 125224, 0, 11543, 0, 8944, 0, 0, 0, 0, 0, 19965, 43025, 10299, 128436, 68845, 0, 69724, 67412, 92952, 0, - 43811, 0, 128924, 0, 11062, 128748, 0, 0, 0, 78364, 0, 7865, 0, 78354, 0, - 78347, 0, 0, 0, 66363, 0, 0, 0, 74967, 7414, 0, 0, 92691, 0, 128507, 885, - 64772, 65180, 0, 71267, 852, 0, 0, 0, 78614, 121174, 129092, 67809, 9609, - 12156, 0, 0, 43586, 11035, 10411, 0, 13268, 6710, 0, 0, 0, 43853, 77949, - 4315, 0, 111104, 0, 43639, 43343, 0, 0, 0, 73074, 0, 65812, 43431, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 994, 125222, 127104, 127103, 73966, 66890, 0, - 65291, 0, 0, 0, 0, 0, 66873, 4186, 92531, 127106, 127105, 6718, 7330, - 4406, 0, 8480, 7319, 64373, 128699, 4413, 0, 0, 3198, 0, 0, 92469, - 111126, 0, 128591, 128681, 0, 0, 0, 0, 73023, 742, 0, 2893, 78738, 0, 0, - 0, 2553, 42294, 6756, 0, 73020, 8363, 0, 2993, 128381, 3916, 4301, 0, - 1141, 42407, 0, 0, 7572, 973, 0, 125077, 0, 2415, 0, 0, 9640, 42333, 0, - 0, 129546, 42486, 43381, 65390, 0, 69434, 1202, 0, 0, 0, 0, 68484, 0, 0, - 64542, 3260, 0, 65388, 43502, 69904, 0, 6738, 0, 0, 74193, 0, 0, 0, - 74641, 6312, 0, 74556, 12446, 0, 0, 128076, 8229, 1235, 0, 11472, 83064, - 0, 0, 0, 0, 0, 1740, 12872, 0, 985, 0, 0, 0, 12068, 0, 0, 0, 0, 0, 0, - 13133, 65071, 110780, 12655, 12134, 0, 92934, 0, 66915, 120349, 119572, - 0, 93030, 41572, 0, 0, 0, 41573, 0, 3931, 0, 74143, 0, 127034, 0, 0, 0, - 0, 83067, 0, 129303, 0, 0, 0, 0, 0, 0, 83068, 0, 72740, 128637, 72717, - 92935, 120291, 0, 1780, 6936, 0, 0, 819, 0, 9694, 125228, 0, 0, 0, 0, - 8343, 8342, 8345, 8344, 8346, 8338, 7523, 6922, 8348, 8347, 7525, 3346, - 8339, 125004, 72705, 69462, 268, 0, 0, 5754, 0, 0, 110684, 8336, 0, 0, 0, - 8337, 8341, 0, 11388, 7522, 0, 0, 0, 11090, 6953, 125240, 0, 74973, - 120708, 0, 0, 0, 0, 0, 110782, 0, 9038, 7887, 0, 0, 42534, 64347, 0, 0, - 67660, 120341, 0, 0, 0, 120878, 0, 0, 73999, 0, 64580, 0, 0, 64643, 0, 0, - 74975, 0, 92227, 129052, 0, 83071, 83072, 83073, 119154, 0, 119153, 0, 0, - 5349, 72440, 0, 917554, 7411, 0, 983220, 0, 0, 0, 42736, 70747, 5756, - 983225, 92946, 0, 42764, 0, 0, 119529, 5752, 120600, 0, 0, 0, 0, 0, - 78893, 0, 0, 0, 125242, 0, 0, 120331, 0, 0, 0, 72826, 0, 10080, 83056, - 12647, 0, 0, 0, 66882, 0, 0, 0, 0, 0, 128351, 72845, 0, 0, 0, 0, 0, - 74213, 0, 0, 0, 0, 0, 6302, 0, 0, 0, 0, 1417, 983222, 0, 9452, 0, 74393, - 0, 0, 110850, 0, 65391, 63789, 0, 78659, 78660, 41264, 78658, 6426, - 42398, 9179, 78654, 64906, 41255, 42036, 0, 41269, 0, 41267, 42436, - 67759, 42323, 42034, 0, 0, 42475, 42033, 0, 0, 68916, 43948, 0, 78673, - 78674, 1659, 919, 42784, 1671, 0, 6069, 9219, 0, 1661, 0, 0, 92690, - 10140, 9713, 78400, 0, 125236, 0, 2306, 0, 0, 6068, 10612, 0, 0, 121314, - 92561, 41462, 0, 0, 0, 0, 0, 0, 0, 128204, 10635, 0, 983221, 0, 0, 0, - 983231, 92251, 0, 121029, 983223, 0, 8100, 0, 78669, 78670, 13301, 78667, - 9667, 78665, 0, 0, 11003, 9904, 0, 0, 0, 0, 0, 0, 78680, 78681, 78677, - 78678, 0, 10313, 0, 0, 64320, 10265, 78686, 129404, 78684, 78685, 8945, - 78683, 70750, 41, 0, 0, 0, 0, 8655, 0, 0, 0, 0, 0, 0, 0, 2585, 0, 65254, - 3126, 0, 74136, 10957, 0, 11160, 0, 0, 0, 0, 0, 11408, 0, 7443, 0, 0, - 6997, 68004, 0, 0, 8739, 11075, 0, 65216, 0, 69795, 2593, 0, 0, 0, 0, - 125062, 0, 0, 0, 4411, 0, 72837, 0, 43442, 78799, 0, 0, 0, 66351, 0, 0, - 13061, 0, 78687, 78688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119925, 0, - 983637, 0, 0, 0, 0, 83399, 127541, 83398, 8022, 78808, 0, 73794, 0, 0, - 83414, 119918, 0, 0, 0, 0, 0, 0, 63799, 78427, 12063, 78425, 78424, 0, 0, - 0, 75025, 0, 297, 0, 0, 68326, 0, 78429, 78428, 7077, 2497, 128651, 0, - 983111, 0, 0, 0, 4292, 0, 74815, 10512, 0, 74814, 119931, 0, 72841, 2503, - 73778, 1762, 69794, 2495, 0, 71230, 94069, 77984, 0, 12654, 0, 1899, 0, - 2507, 0, 8726, 0, 65594, 0, 71272, 8892, 0, 0, 0, 0, 0, 420, 0, 0, - 125130, 10797, 74637, 0, 0, 0, 0, 63796, 0, 66581, 0, 119205, 0, 0, - 194840, 0, 120788, 0, 0, 92956, 0, 0, 0, 0, 119230, 0, 0, 83496, 7399, 0, - 66434, 42779, 0, 92220, 42197, 92543, 5380, 0, 0, 1155, 11365, 43126, 0, - 77971, 65684, 0, 5601, 0, 42765, 78258, 0, 7987, 72843, 0, 69799, 0, 0, - 78735, 119165, 0, 0, 4473, 0, 72426, 0, 65347, 65346, 65345, 0, 127384, - 0, 69802, 0, 73868, 0, 64826, 0, 0, 0, 0, 6218, 78422, 69676, 4555, 0, - 83459, 70071, 128670, 65190, 0, 0, 65244, 0, 0, 42519, 74472, 0, 0, - 83466, 0, 0, 0, 83468, 92581, 0, 0, 65370, 65369, 65368, 65367, 65366, - 65365, 41086, 65363, 65362, 65361, 65360, 43410, 11323, 65357, 65356, - 65355, 5345, 65353, 65352, 65351, 761, 65349, 19959, 69718, 0, 0, 0, 0, - 64647, 0, 0, 4699, 126077, 0, 0, 0, 0, 0, 68074, 0, 0, 0, 128347, 0, - 72829, 0, 69773, 121438, 0, 0, 0, 73980, 78255, 78254, 83453, 43157, 0, - 0, 0, 7946, 12541, 0, 74615, 69780, 0, 0, 0, 0, 9005, 1225, 0, 0, 0, 0, - 68011, 8847, 0, 0, 0, 8329, 74590, 43878, 0, 0, 0, 3127, 2595, 71040, - 69766, 129188, 0, 41089, 0, 0, 70292, 983613, 12112, 0, 74200, 0, 8764, - 0, 0, 0, 67273, 67272, 67271, 71044, 0, 0, 0, 71042, 67266, 67265, 0, - 67270, 67269, 67268, 67267, 67282, 67281, 67280, 3572, 10023, 4959, 0, 0, - 67275, 9729, 125110, 0, 67278, 67277, 0, 67276, 0, 7996, 9907, 0, 13304, - 83392, 0, 72830, 0, 11095, 11100, 0, 83358, 83387, 10142, 0, 0, 0, 0, - 68022, 0, 83363, 128292, 19955, 0, 83366, 69807, 125246, 70124, 0, 72230, - 83373, 83385, 0, 0, 0, 0, 68020, 0, 0, 261, 8406, 7791, 0, 7362, 0, - 10696, 0, 0, 9838, 118920, 0, 83477, 0, 0, 0, 6437, 68830, 83476, 0, 0, - 74177, 0, 0, 67288, 67287, 0, 67286, 0, 83470, 0, 67289, 67283, 83471, - 70002, 0, 0, 0, 67285, 11499, 67297, 7816, 67295, 55247, 68015, 10929, - 67298, 0, 68017, 9642, 10912, 0, 67293, 11387, 67291, 67290, 70792, 0, - 67715, 0, 0, 68099, 13287, 74430, 10836, 0, 75053, 69775, 0, 128746, - 7450, 0, 0, 119648, 9697, 3606, 0, 0, 0, 0, 125029, 0, 0, 121262, 0, - 128873, 1389, 128871, 0, 0, 0, 12941, 0, 83438, 121062, 0, 12301, 83440, - 0, 41102, 66604, 0, 0, 0, 0, 66600, 523, 92642, 71100, 74436, 0, 0, 0, - 8608, 83435, 72828, 128704, 0, 127402, 11307, 66707, 67301, 67300, 67299, - 0, 67304, 67303, 0, 0, 0, 0, 127212, 5908, 0, 0, 6744, 67310, 1699, - 67308, 67307, 67314, 67313, 6306, 67311, 983207, 72150, 69862, 3766, - 2389, 67305, 74569, 6611, 65700, 0, 0, 0, 42386, 0, 0, 2599, 917972, - 119131, 119049, 65717, 0, 0, 119654, 0, 0, 0, 74203, 3760, 1718, 68160, - 0, 3776, 7335, 0, 0, 67324, 69861, 0, 69792, 0, 0, 3778, 0, 9462, 7824, - 0, 78896, 3768, 68142, 765, 72822, 3764, 0, 0, 113822, 0, 12947, 0, 0, 0, - 118806, 73753, 0, 0, 0, 6829, 5225, 66901, 0, 0, 0, 0, 67319, 67318, - 3162, 67316, 67323, 67322, 67321, 67320, 0, 5353, 0, 74179, 67315, 0, - 1010, 0, 0, 67326, 67325, 127870, 6952, 67329, 67328, 67327, 2590, - 120036, 65552, 120034, 120039, 7183, 120037, 120038, 120027, 120028, - 120025, 120026, 120031, 970, 120029, 74611, 120019, 120020, 120017, - 67330, 120023, 120024, 120021, 10961, 113693, 11148, 0, 0, 0, 128448, 0, - 113703, 64378, 0, 0, 0, 68821, 119649, 11358, 71172, 69797, 0, 11065, - 126464, 0, 68864, 0, 5694, 120839, 66784, 0, 4325, 3047, 0, 43652, - 120962, 93029, 69764, 0, 0, 0, 0, 5431, 6652, 0, 67753, 71460, 0, 0, 0, - 1129, 65016, 0, 65900, 1986, 7846, 0, 8661, 75058, 0, 0, 3845, 0, 0, 0, - 74400, 1456, 7530, 121382, 0, 0, 0, 0, 120016, 0, 0, 0, 917863, 127772, - 119966, 0, 11002, 7026, 8145, 68216, 0, 12138, 71464, 0, 0, 0, 12323, 0, - 917869, 0, 0, 0, 92316, 68494, 0, 0, 129384, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 42205, 0, 236, 0, 78867, 0, 0, 113784, 0, 0, 983982, 0, 0, 0, 8097, 0, - 0, 68012, 72820, 11194, 0, 72824, 0, 127974, 0, 0, 110603, 0, 10416, - 68070, 3872, 127508, 0, 0, 0, 0, 2838, 917867, 0, 917866, 119589, 0, 0, - 0, 0, 11096, 83019, 10553, 83421, 0, 0, 0, 0, 0, 0, 73742, 6436, 10096, - 0, 0, 0, 113687, 0, 4463, 68018, 0, 78074, 0, 983591, 7184, 0, 0, 0, 0, - 0, 0, 93825, 12818, 12032, 0, 0, 0, 0, 10357, 121418, 8170, 0, 8556, 0, - 9659, 0, 0, 0, 9556, 0, 4503, 92700, 9647, 64004, 78185, 0, 0, 64002, - 78889, 0, 0, 118910, 0, 6438, 0, 9109, 78884, 0, 64599, 0, 68009, 0, 0, - 2447, 0, 0, 0, 126545, 0, 119002, 0, 0, 0, 19937, 0, 1322, 0, 119204, - 254, 0, 0, 69392, 42425, 0, 0, 65204, 42312, 0, 128519, 0, 42826, 0, - 42464, 120567, 0, 67155, 74796, 64400, 64693, 126212, 77861, 0, 0, 67154, - 0, 0, 0, 68008, 11785, 0, 119142, 41978, 0, 0, 43244, 10536, 0, 9901, - 7103, 0, 7102, 71428, 120748, 3140, 0, 0, 68007, 0, 67258, 10909, 0, - 1428, 0, 67254, 67253, 7699, 12393, 67257, 0, 67256, 67255, 0, 0, 69389, - 0, 0, 0, 0, 0, 67153, 0, 0, 127383, 69376, 64554, 0, 3878, 0, 42352, - 1752, 0, 0, 42506, 0, 10199, 0, 983463, 125231, 0, 0, 0, 720, 0, 0, 0, - 68831, 0, 1464, 128339, 0, 7974, 0, 125017, 68082, 0, 0, 0, 0, 74787, 0, - 78865, 92258, 0, 0, 78863, 0, 1302, 66288, 0, 0, 0, 67152, 0, 983611, - 983618, 0, 0, 3995, 0, 65608, 3714, 0, 0, 67262, 67261, 67260, 67259, - 43251, 67264, 67263, 0, 120557, 92346, 8672, 68006, 11964, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 92610, 0, 468, 0, 0, 0, 983470, 0, 0, 128544, 129397, - 65907, 983163, 0, 0, 0, 0, 0, 983468, 41743, 0, 0, 0, 74880, 0, 121001, - 820, 41741, 0, 120667, 0, 64684, 126992, 128604, 126082, 69934, 65177, - 6226, 353, 43645, 0, 119612, 120738, 67700, 0, 0, 0, 0, 42457, 120276, 0, - 120277, 1884, 129637, 42418, 113678, 41157, 0, 42305, 120279, 0, 0, - 41151, 0, 71430, 0, 42344, 0, 0, 0, 42497, 0, 194870, 72754, 69933, - 73703, 0, 42521, 8539, 128606, 0, 123609, 69957, 4788, 0, 68023, 0, 0, - 983053, 0, 0, 0, 0, 41590, 0, 113754, 0, 0, 118901, 68637, 41136, 64351, - 0, 128453, 41154, 113731, 127038, 4038, 41143, 68232, 64859, 0, 0, 0, - 5435, 0, 6734, 41343, 127035, 0, 0, 41359, 66761, 0, 119835, 41349, 0, 0, - 10374, 10310, 0, 0, 10254, 119836, 10278, 10262, 69858, 41363, 0, 0, 0, - 119840, 0, 41356, 10314, 10282, 0, 10378, 0, 40976, 10266, 0, 119848, - 40975, 0, 129554, 0, 40978, 0, 92945, 0, 0, 0, 119098, 119083, 0, 71437, - 119854, 69936, 0, 0, 3525, 6824, 0, 0, 119858, 128451, 0, 72239, 113738, - 0, 71424, 0, 0, 0, 0, 0, 10727, 7212, 129071, 120551, 0, 0, 0, 67156, - 808, 7207, 42387, 0, 0, 0, 0, 0, 0, 0, 0, 9225, 121149, 0, 9145, 128060, + 43811, 0, 128924, 0, 11062, 128748, 0, 0, 0, 69276, 2901, 7865, 0, 78354, + 0, 78347, 0, 126123, 0, 66363, 0, 0, 0, 74967, 7414, 0, 0, 92691, 0, + 128507, 885, 64772, 65180, 0, 71267, 852, 0, 0, 0, 78614, 121174, 129092, + 67809, 9609, 12156, 0, 0, 43586, 11035, 10411, 0, 13268, 6710, 0, 0, 0, + 43853, 77949, 4315, 0, 111104, 0, 43639, 43343, 0, 0, 0, 73074, 0, 65812, + 43431, 0, 0, 0, 0, 0, 129890, 0, 0, 0, 0, 994, 125222, 127104, 127103, + 73966, 66890, 0, 65291, 70753, 0, 0, 0, 0, 66873, 4186, 92531, 127106, + 127105, 6718, 7330, 4406, 0, 8480, 7319, 64373, 128699, 4413, 0, 0, 3198, + 0, 0, 92469, 111126, 0, 128591, 128681, 0, 0, 0, 101321, 73023, 742, 0, + 2893, 78738, 0, 0, 0, 2553, 42294, 6756, 0, 73020, 8363, 0, 2993, 128381, + 3916, 4301, 0, 1141, 42407, 0, 0, 7572, 973, 0, 125077, 0, 2415, 0, 0, + 9640, 42333, 0, 0, 129546, 42486, 43381, 65390, 0, 69434, 1202, 0, 0, 0, + 0, 68484, 0, 0, 64542, 3260, 0, 65388, 43502, 69904, 0, 6738, 0, 0, + 74193, 0, 0, 0, 74641, 6312, 0, 74556, 12446, 0, 0, 128076, 8229, 1235, + 0, 11472, 83064, 0, 0, 101366, 0, 0, 1740, 12872, 0, 985, 0, 0, 0, 12068, + 0, 0, 101363, 0, 0, 0, 13133, 65071, 110780, 12655, 12134, 0, 92934, 0, + 66915, 120349, 119572, 0, 93030, 41572, 0, 0, 0, 41573, 0, 3931, 0, + 74143, 0, 127034, 0, 0, 0, 0, 83067, 0, 129303, 0, 0, 0, 0, 0, 0, 83068, + 0, 72740, 128637, 72717, 92935, 120291, 0, 1780, 6936, 0, 0, 819, 0, + 9694, 125228, 0, 0, 0, 0, 8343, 8342, 8345, 8344, 8346, 8338, 7523, 6922, + 8348, 8347, 7525, 3346, 8339, 125004, 72705, 69462, 268, 0, 0, 5754, 0, + 0, 110684, 8336, 0, 0, 0, 8337, 8341, 0, 11388, 7522, 0, 0, 0, 11090, + 6953, 125240, 0, 74973, 120708, 0, 0, 0, 0, 0, 110782, 0, 9038, 7887, 0, + 0, 42534, 64347, 0, 0, 67660, 120341, 0, 0, 0, 120878, 0, 0, 73999, 0, + 64580, 0, 0, 64643, 0, 0, 74975, 0, 92227, 129052, 0, 83071, 83072, + 83073, 119154, 0, 119153, 0, 0, 5349, 72440, 0, 917554, 7411, 0, 983220, + 0, 0, 0, 42736, 70747, 5756, 983225, 92946, 0, 42764, 0, 0, 119529, 5752, + 120600, 0, 0, 0, 0, 0, 78893, 0, 0, 0, 125242, 0, 0, 120331, 0, 0, 0, + 72826, 0, 10080, 83056, 12647, 0, 0, 69252, 66882, 0, 0, 0, 0, 0, 72005, + 72845, 0, 0, 0, 0, 0, 74213, 0, 0, 0, 0, 0, 6302, 0, 0, 0, 0, 1417, + 983222, 0, 9452, 0, 74393, 0, 0, 110850, 0, 65391, 63789, 69251, 78659, + 78660, 41264, 78658, 6426, 42398, 9179, 78654, 64906, 41255, 42036, 0, + 41269, 0, 41267, 42436, 67759, 42323, 42034, 0, 0, 42475, 42033, 0, 0, + 68916, 43948, 0, 78673, 78674, 1659, 919, 42784, 1671, 0, 6069, 9219, 0, + 1661, 119144, 0, 92690, 10140, 9713, 78400, 0, 125236, 0, 2306, 0, 0, + 6068, 10612, 0, 0, 121314, 92561, 41462, 0, 0, 0, 0, 0, 0, 0, 128204, + 10635, 0, 983221, 0, 0, 0, 983231, 92251, 0, 121029, 983223, 0, 8100, 0, + 78669, 78670, 13301, 78667, 9667, 78665, 0, 0, 11003, 9904, 0, 0, 0, 0, + 0, 0, 78680, 78681, 78677, 78678, 0, 10313, 0, 0, 64320, 10265, 78686, + 129404, 78684, 78685, 8945, 78683, 70750, 41, 0, 0, 0, 0, 8655, 0, 0, 0, + 0, 0, 0, 0, 2585, 0, 65254, 3126, 0, 74136, 10957, 0, 11160, 0, 0, 0, 0, + 0, 11408, 0, 7443, 0, 0, 6997, 68004, 0, 0, 8739, 11075, 0, 65216, 0, + 69795, 2593, 0, 0, 0, 0, 125062, 0, 0, 0, 4411, 0, 72837, 0, 43442, + 78799, 0, 0, 0, 66351, 0, 0, 13061, 0, 78687, 78688, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 119925, 0, 983637, 0, 0, 0, 0, 83399, 127541, 83398, 8022, + 78808, 0, 73794, 0, 0, 83414, 119918, 0, 0, 0, 0, 0, 0, 63799, 78427, + 12063, 78425, 78424, 0, 0, 0, 75025, 0, 297, 0, 0, 68326, 0, 78429, + 78428, 7077, 2497, 128651, 0, 983111, 0, 0, 0, 4292, 0, 74815, 10512, 0, + 74814, 119931, 0, 72841, 2503, 65070, 1762, 69794, 2495, 0, 71230, 94069, + 77984, 0, 12654, 0, 1899, 0, 2507, 0, 8726, 0, 65594, 0, 71272, 8892, 0, + 0, 0, 0, 0, 420, 0, 0, 125130, 10797, 74637, 0, 0, 0, 0, 63796, 0, 66581, + 0, 119205, 0, 0, 194840, 0, 120788, 0, 0, 92956, 0, 0, 0, 0, 119230, 0, + 0, 83496, 7399, 0, 66434, 42779, 0, 92220, 42197, 92543, 5380, 0, 0, + 1155, 11365, 43126, 0, 77971, 65684, 0, 5601, 0, 42765, 78258, 0, 7987, + 72843, 0, 69799, 0, 0, 78735, 119165, 0, 0, 4473, 0, 72426, 0, 65347, + 65346, 65345, 0, 127384, 0, 69802, 0, 73868, 0, 64826, 0, 0, 0, 0, 6218, + 78422, 69676, 4555, 0, 83459, 70071, 128670, 65190, 0, 0, 65244, 0, 0, + 42519, 74472, 0, 0, 83466, 0, 0, 0, 83468, 92581, 0, 0, 65370, 65369, + 65368, 65367, 65366, 65365, 41086, 65363, 65362, 65361, 65360, 43410, + 11323, 65357, 65356, 65355, 5345, 65353, 65352, 65351, 761, 65349, 19959, + 69718, 0, 0, 0, 0, 64647, 0, 0, 4699, 126077, 0, 129940, 0, 0, 0, 68074, + 0, 0, 0, 128347, 0, 72829, 0, 69773, 121438, 0, 0, 0, 73980, 78255, + 78254, 83453, 43157, 0, 0, 0, 7946, 12541, 0, 74615, 69780, 0, 0, 0, 0, + 9005, 1225, 0, 0, 0, 0, 68011, 8847, 0, 0, 0, 8329, 74590, 43878, 0, 0, + 0, 3127, 2595, 71040, 69766, 129188, 0, 41089, 0, 0, 70292, 983613, + 12112, 0, 74200, 0, 8764, 0, 0, 0, 67273, 67272, 67271, 71044, 0, 0, 0, + 71042, 67266, 67265, 0, 67270, 67269, 67268, 67267, 67282, 67281, 67280, + 3572, 10023, 4959, 0, 0, 67275, 9729, 125110, 0, 67278, 67277, 0, 67276, + 0, 7996, 9907, 0, 13304, 83392, 0, 72830, 0, 11095, 11100, 0, 83358, + 83387, 10142, 0, 0, 0, 0, 68022, 0, 83363, 128292, 19955, 0, 83366, + 69807, 125246, 70124, 0, 72230, 83373, 83385, 0, 0, 0, 0, 68020, 0, 2239, + 261, 8406, 7791, 0, 7362, 0, 10696, 0, 0, 9838, 118920, 0, 83477, 0, 0, + 0, 6437, 68830, 83476, 0, 0, 74177, 0, 0, 67288, 67287, 0, 67286, 0, + 83470, 0, 67289, 67283, 83471, 70002, 0, 0, 0, 67285, 11499, 67297, 7816, + 67295, 55247, 68015, 10929, 67298, 0, 68017, 9642, 10912, 0, 67293, + 11387, 67291, 67290, 70792, 0, 67715, 0, 0, 68099, 13287, 74430, 10836, + 0, 75053, 69775, 0, 128746, 7450, 0, 0, 119648, 9697, 3606, 0, 0, 0, 0, + 125029, 0, 0, 121262, 0, 128873, 1389, 128871, 0, 0, 0, 12941, 0, 83438, + 121062, 0, 12301, 83440, 0, 41102, 66604, 72025, 0, 0, 0, 66600, 523, + 92642, 71100, 74436, 0, 0, 0, 8608, 83435, 72828, 128704, 0, 127402, + 11307, 66707, 67301, 67300, 67299, 0, 67304, 67303, 0, 0, 0, 0, 127212, + 5908, 0, 0, 6744, 67310, 1699, 67308, 67307, 67314, 67313, 6306, 67311, + 983207, 72150, 69862, 3766, 2389, 67305, 74569, 6611, 65700, 0, 0, 0, + 42386, 0, 0, 2599, 917972, 119131, 119049, 65717, 0, 0, 119654, 0, 0, 0, + 74203, 3760, 1718, 68160, 0, 3776, 7335, 0, 0, 67324, 69861, 0, 69792, 0, + 0, 3778, 0, 9462, 7824, 0, 78896, 3768, 68142, 765, 72822, 3764, 0, 0, + 113822, 129667, 12947, 0, 0, 0, 118806, 73753, 0, 0, 0, 6829, 5225, + 66901, 0, 0, 0, 0, 67319, 67318, 3162, 67316, 67323, 67322, 67321, 67320, + 0, 5353, 0, 74179, 67315, 0, 1010, 0, 0, 67326, 67325, 127870, 6952, + 67329, 67328, 67327, 2590, 120036, 65552, 120034, 120039, 7183, 120037, + 120038, 120027, 120028, 120025, 120026, 120031, 970, 120029, 74611, + 120019, 120020, 120017, 67330, 120023, 120024, 120021, 10961, 113693, + 11148, 0, 0, 0, 128448, 0, 113703, 64378, 0, 0, 0, 68821, 119649, 11358, + 71172, 69797, 0, 11065, 126464, 0, 68864, 0, 5694, 120839, 66784, 0, + 4325, 3047, 0, 43652, 120962, 93029, 69764, 0, 0, 0, 0, 5431, 6652, 0, + 67753, 71460, 0, 0, 0, 1129, 65016, 0, 65900, 1986, 7846, 0, 8661, 75058, + 0, 0, 3845, 0, 0, 0, 74400, 1456, 7530, 121382, 0, 0, 0, 0, 120016, 0, 0, + 0, 917863, 127772, 119966, 0, 11002, 7026, 8145, 68216, 0, 12138, 71464, + 0, 0, 0, 12323, 130033, 917869, 0, 0, 0, 92316, 68494, 0, 0, 129384, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42205, 0, 236, 0, 78867, 0, 0, 113784, 0, 0, + 983982, 0, 0, 917865, 8097, 0, 0, 68012, 72820, 11194, 0, 72824, 0, + 127974, 0, 0, 110602, 129948, 10416, 68070, 3872, 127508, 0, 0, 0, 0, + 2838, 917867, 0, 917866, 119589, 0, 0, 0, 0, 11096, 83019, 10553, 83421, + 0, 0, 0, 0, 0, 0, 73742, 6436, 10096, 0, 0, 0, 113687, 0, 4463, 68018, 0, + 78074, 0, 983591, 7184, 0, 0, 0, 0, 0, 0, 93825, 12818, 12032, 0, 0, 0, + 0, 10357, 121418, 8170, 0, 8556, 0, 9659, 0, 0, 0, 9556, 0, 4503, 92700, + 9647, 64004, 78185, 0, 0, 64002, 78889, 0, 0, 118910, 0, 6438, 0, 9109, + 78884, 0, 64599, 0, 68009, 0, 0, 2447, 129863, 0, 0, 126545, 0, 119002, + 0, 0, 0, 19937, 0, 1322, 0, 119204, 254, 0, 0, 69392, 42425, 0, 0, 65204, + 42312, 0, 128519, 0, 42826, 0, 42464, 120567, 0, 67155, 74796, 64400, + 64693, 126212, 77861, 0, 0, 67154, 0, 0, 0, 68008, 11785, 0, 119142, + 41978, 0, 0, 43244, 10536, 0, 9901, 7103, 0, 7102, 71428, 120748, 3140, + 0, 0, 68007, 0, 67258, 10909, 0, 1428, 0, 67254, 67253, 7699, 12393, + 67257, 0, 67256, 67255, 0, 0, 69389, 0, 0, 0, 0, 0, 67153, 0, 0, 127383, + 69376, 64554, 0, 3878, 0, 42352, 1752, 0, 0, 42506, 0, 10199, 0, 983463, + 125231, 0, 0, 0, 720, 0, 0, 0, 68831, 0, 1464, 128339, 0, 7974, 0, + 125017, 68082, 0, 0, 0, 0, 74787, 0, 78864, 92258, 0, 0, 78863, 0, 1302, + 66288, 0, 0, 0, 67152, 0, 983611, 983618, 0, 0, 3995, 0, 65608, 3714, 0, + 0, 67262, 67261, 67260, 67259, 43251, 67264, 67263, 0, 120557, 92346, + 8672, 68006, 11964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92610, 0, 468, 0, 0, + 0, 983470, 0, 0, 128544, 129397, 65907, 983163, 0, 0, 0, 0, 0, 983468, + 41743, 0, 0, 0, 74880, 0, 121001, 820, 41741, 0, 120667, 0, 64684, + 126992, 128604, 126082, 69934, 65177, 6226, 353, 43645, 0, 119612, + 120738, 67700, 0, 0, 0, 0, 42457, 120276, 0, 120277, 1884, 129637, 42418, + 113678, 41157, 0, 42305, 120279, 0, 0, 41151, 0, 71430, 0, 42344, 0, 0, + 0, 42497, 0, 194870, 72754, 69933, 73703, 0, 42521, 8539, 128606, 0, + 123609, 69957, 4788, 0, 68023, 0, 0, 983053, 0, 0, 0, 0, 41590, 0, + 113754, 0, 0, 118901, 68637, 41136, 64351, 0, 128453, 41154, 113731, + 127038, 4038, 41143, 68232, 64859, 0, 129910, 0, 5435, 129911, 6734, + 41343, 127035, 0, 0, 41359, 66761, 0, 119835, 41349, 0, 129915, 10374, + 10310, 0, 0, 10254, 119836, 10278, 10262, 69858, 41363, 0, 0, 0, 119840, + 0, 41356, 10314, 10282, 0, 10378, 0, 40976, 10266, 0, 119848, 40975, 0, + 129554, 0, 40978, 0, 92945, 0, 0, 0, 119098, 119083, 0, 71437, 119854, + 69936, 0, 0, 3525, 6824, 0, 0, 119858, 128451, 0, 72239, 113738, 0, + 71424, 0, 0, 0, 0, 0, 10727, 7212, 129071, 71957, 0, 0, 0, 67156, 808, + 7207, 42387, 0, 0, 0, 0, 0, 0, 0, 0, 9225, 121149, 0, 9145, 128060, 41018, 67841, 983158, 42300, 0, 3084, 983155, 125014, 41025, 6037, 0, 194885, 0, 10290, 0, 3083, 10322, 111017, 129030, 0, 41036, 0, 0, 43321, 65606, 0, 41032, 42388, 0, 64700, 0, 1445, 40961, 0, 0, 0, 40960, 0, @@ -24432,588 +25239,612 @@ static const unsigned int code_hash[] = { 128469, 0, 0, 0, 0, 0, 0, 42585, 65032, 10704, 65030, 4787, 0, 917556, 0, 127015, 0, 128118, 0, 0, 9525, 0, 0, 68773, 0, 0, 0, 0, 40966, 0, 0, 3998, 0, 0, 65919, 71433, 11792, 2690, 0, 42836, 127150, 41954, 194921, - 194923, 6737, 0, 64933, 0, 3487, 194873, 71427, 72758, 65426, 72756, + 194923, 6737, 0, 64933, 126260, 3487, 194873, 71427, 72758, 65426, 72756, 66757, 0, 0, 41976, 9720, 74964, 11179, 41970, 0, 12116, 65024, 0, 127912, 9048, 65028, 65027, 65026, 65025, 64757, 0, 41488, 0, 8527, 0, - 126480, 0, 41480, 41053, 3266, 0, 0, 12093, 41466, 122881, 78642, 1519, - 983906, 3638, 65887, 65429, 0, 0, 0, 0, 8633, 0, 0, 0, 125118, 0, 70375, - 0, 0, 6368, 128124, 0, 70369, 8078, 0, 0, 70373, 72876, 0, 7002, 121003, - 41430, 0, 41051, 41484, 0, 0, 41050, 8872, 0, 13099, 71445, 70371, 0, - 6435, 72154, 11362, 0, 0, 0, 0, 41420, 0, 3625, 74915, 41409, 71441, 0, - 0, 0, 9672, 0, 0, 43317, 0, 0, 0, 41424, 917598, 0, 0, 0, 0, 41417, 1261, - 0, 0, 12102, 119662, 41401, 0, 127538, 129518, 0, 124943, 72765, 3275, - 92472, 0, 0, 0, 0, 0, 0, 0, 0, 125129, 983140, 10598, 0, 128633, 6711, 0, - 2920, 0, 0, 0, 0, 19928, 0, 0, 3917, 0, 113756, 0, 0, 66588, 128078, 0, - 0, 113721, 113758, 0, 0, 0, 41184, 0, 232, 0, 0, 74170, 0, 0, 0, 0, 9094, - 0, 0, 92585, 0, 1064, 0, 0, 10115, 0, 0, 0, 7862, 0, 13224, 0, 0, 66650, - 0, 0, 72877, 1878, 0, 71434, 2911, 0, 41178, 5427, 0, 0, 0, 12617, 41174, - 0, 67148, 67147, 0, 42413, 41167, 2406, 0, 0, 0, 0, 0, 9618, 128668, 0, - 0, 0, 0, 41436, 9337, 126067, 0, 41456, 0, 119086, 11333, 0, 6703, 0, - 125071, 1613, 0, 0, 0, 983191, 0, 0, 74500, 41460, 78197, 0, 0, 194899, - 67144, 65841, 0, 121109, 74064, 111146, 111144, 120375, 0, 111122, 0, - 111121, 64687, 111120, 42592, 3871, 0, 128305, 9111, 111163, 0, 111156, - 120366, 121462, 11150, 111154, 111175, 111179, 0, 111168, 0, 120362, - 41587, 70391, 0, 74322, 0, 194908, 111166, 111133, 0, 71443, 194844, 0, - 111151, 0, 0, 7928, 111127, 111140, 41595, 0, 0, 65801, 983600, 0, 0, 0, - 73712, 0, 41598, 3993, 121269, 1545, 40971, 121286, 72874, 0, 0, 0, - 120767, 65286, 0, 0, 0, 0, 0, 0, 0, 5402, 0, 0, 74462, 73457, 0, 0, - 78194, 64326, 40969, 0, 128110, 983684, 40968, 0, 983148, 0, 0, 0, 0, - 128513, 8020, 0, 41012, 0, 0, 65805, 41006, 0, 0, 74605, 0, 118942, - 43432, 0, 0, 92900, 0, 0, 0, 120687, 0, 92958, 0, 0, 68332, 0, 40992, 0, - 0, 0, 0, 0, 42235, 0, 1741, 42370, 0, 0, 0, 11413, 126583, 0, 0, 128769, - 6470, 0, 74517, 0, 0, 120651, 40984, 0, 42742, 0, 12916, 6284, 0, 41663, - 0, 0, 68313, 72840, 70164, 41648, 0, 0, 2299, 41666, 0, 0, 2056, 41656, - 0, 0, 71917, 42219, 0, 0, 78112, 41676, 0, 0, 0, 41670, 0, 92590, 2796, - 0, 0, 9902, 0, 67988, 64785, 82995, 128822, 42631, 983040, 71890, 0, - 74164, 41238, 10049, 11405, 0, 64368, 0, 120925, 0, 397, 12299, 42139, 0, - 9590, 0, 0, 43661, 43819, 0, 6651, 3544, 0, 0, 9620, 0, 0, 0, 92229, - 1333, 7104, 0, 6425, 0, 0, 0, 0, 0, 0, 11976, 8554, 13055, 0, 110733, 0, - 110731, 41218, 0, 0, 128673, 1883, 0, 0, 70443, 41225, 70788, 42419, - 983688, 129450, 0, 127896, 0, 65809, 11837, 0, 129104, 7141, 0, 0, 0, 0, - 0, 42363, 0, 0, 0, 0, 69949, 119157, 64732, 0, 0, 126983, 0, 0, 983678, - 7140, 42051, 0, 4164, 118799, 0, 120569, 42049, 42042, 0, 0, 0, 120637, - 69938, 0, 42047, 0, 0, 8470, 11807, 128935, 0, 0, 194825, 74300, 126267, - 0, 120517, 0, 0, 0, 0, 8736, 0, 42643, 72753, 0, 0, 0, 71432, 0, 93023, - 110730, 72869, 110728, 0, 0, 0, 0, 68445, 0, 0, 2106, 0, 11273, 120986, - 43004, 0, 82988, 0, 961, 64307, 0, 0, 0, 67711, 110615, 0, 1696, 0, 9762, - 12105, 0, 110622, 110623, 3264, 110621, 110618, 43003, 110616, 110617, 0, - 120359, 0, 128660, 0, 2322, 0, 70831, 11449, 128187, 42868, 0, 0, 0, 0, - 113746, 983234, 0, 129583, 66398, 0, 0, 0, 0, 0, 111135, 119224, 0, 0, - 64421, 0, 113739, 0, 65823, 0, 11182, 0, 0, 0, 7766, 55268, 0, 4598, 0, - 65839, 0, 0, 0, 10851, 0, 6179, 92602, 6180, 129524, 11952, 0, 78648, - 78651, 78646, 78647, 78644, 78645, 3801, 78643, 6176, 120580, 0, 0, 6177, - 0, 78652, 78653, 6178, 0, 0, 0, 0, 2214, 8754, 0, 0, 2137, 0, 0, 0, 0, - 66889, 0, 0, 0, 8974, 2308, 0, 74579, 0, 2318, 122920, 0, 8198, 0, 0, 0, - 74307, 0, 119524, 0, 0, 6970, 0, 0, 0, 41159, 0, 120363, 6385, 0, 128403, - 0, 0, 126258, 0, 72785, 42053, 2075, 42057, 0, 42052, 0, 0, 67651, 0, - 9665, 0, 0, 13181, 0, 0, 69379, 0, 0, 0, 0, 73010, 0, 0, 0, 41145, 0, 0, - 0, 41148, 0, 7594, 113686, 75033, 119090, 10869, 43458, 41146, 0, 0, - 121456, 917630, 0, 0, 0, 0, 0, 65184, 11780, 0, 42796, 0, 69742, 0, - 65146, 66803, 0, 0, 0, 7358, 78241, 0, 7988, 0, 0, 3271, 0, 0, 0, 0, 0, - 0, 983103, 13070, 113736, 42044, 0, 1095, 0, 3599, 0, 0, 0, 129087, - 66390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42043, 43232, 67656, 121014, 42046, + 126480, 0, 41480, 41053, 3266, 0, 194876, 12093, 41466, 122881, 78642, + 1519, 983906, 3638, 65887, 65429, 0, 0, 0, 0, 8633, 0, 0, 0, 125118, 0, + 70375, 0, 0, 6368, 128124, 0, 70369, 8078, 0, 0, 70373, 72876, 0, 7002, + 121003, 41430, 0, 41051, 41484, 0, 0, 41050, 8872, 0, 13099, 71445, + 70371, 0, 6435, 72154, 11362, 0, 0, 0, 0, 41420, 0, 3625, 74915, 41409, + 71441, 0, 0, 0, 9672, 0, 0, 43317, 0, 0, 0, 41424, 917598, 0, 0, 0, 0, + 41417, 1261, 0, 0, 12102, 119662, 41401, 0, 127538, 129518, 0, 124943, + 72765, 3275, 92472, 0, 0, 0, 0, 0, 0, 0, 0, 125129, 983140, 10598, 0, + 128633, 6711, 0, 2920, 0, 0, 0, 0, 19928, 0, 0, 3917, 0, 113756, 0, 0, + 66588, 128078, 0, 0, 113721, 113758, 983081, 0, 0, 41184, 0, 232, 0, 0, + 74170, 0, 0, 0, 0, 9094, 0, 0, 92585, 0, 1064, 0, 0, 10115, 0, 0, 0, + 7862, 0, 13224, 0, 0, 66650, 0, 0, 72877, 1878, 0, 71434, 2911, 0, 41178, + 5427, 0, 0, 0, 12617, 41174, 0, 67148, 67147, 0, 42413, 41167, 2406, 0, + 0, 0, 0, 0, 9618, 128668, 0, 0, 0, 0, 41436, 9337, 126067, 0, 41456, 0, + 119086, 11333, 0, 6703, 0, 125071, 1613, 0, 0, 0, 983191, 0, 0, 74500, + 41460, 78197, 0, 0, 194899, 67144, 65841, 0, 121109, 74064, 111146, + 111144, 120375, 0, 111122, 0, 111121, 64687, 111120, 42592, 3871, 0, + 128305, 9111, 111163, 0, 111156, 120366, 121462, 11150, 111154, 111175, + 111179, 0, 111168, 0, 120362, 41587, 70391, 0, 74322, 0, 194908, 111166, + 111133, 0, 71443, 194842, 0, 111151, 0, 0, 7928, 111127, 111140, 41595, + 0, 0, 65801, 983600, 0, 0, 0, 73712, 0, 41598, 3993, 121269, 1545, 40971, + 121286, 72874, 0, 0, 0, 120767, 65286, 0, 0, 0, 0, 0, 0, 0, 5402, 0, 0, + 74462, 73457, 0, 0, 78194, 64326, 40969, 0, 128110, 983684, 40968, 0, + 121139, 0, 0, 0, 0, 128513, 8020, 0, 41012, 0, 0, 65805, 41006, 0, 0, + 74605, 0, 118942, 43432, 0, 0, 92900, 0, 0, 68671, 120687, 0, 92958, 0, + 0, 68332, 0, 40992, 0, 0, 0, 0, 0, 42235, 0, 1741, 42370, 0, 0, 0, 11413, + 126583, 0, 0, 128769, 6470, 0, 74517, 0, 0, 120651, 40984, 0, 42742, 0, + 12916, 6284, 0, 41663, 0, 0, 68313, 72840, 70164, 41648, 0, 0, 2299, + 41666, 0, 0, 2056, 41656, 0, 0, 71917, 42219, 0, 0, 78112, 41676, 0, 0, + 0, 41670, 0, 92590, 2796, 0, 0, 9902, 0, 67988, 64785, 82995, 128822, + 42631, 983040, 71890, 0, 74164, 41238, 10049, 11405, 0, 64368, 0, 120925, + 0, 397, 12299, 42139, 0, 9590, 0, 0, 43661, 43819, 0, 6651, 3544, 0, 0, + 9620, 0, 0, 0, 92229, 1333, 7104, 0, 6425, 0, 0, 0, 0, 0, 0, 11976, 8554, + 13055, 0, 110733, 0, 110731, 41218, 0, 0, 128673, 1883, 0, 0, 70443, + 41225, 70788, 42419, 983688, 129450, 0, 127896, 0, 65809, 11837, 0, + 129104, 7141, 0, 0, 0, 0, 0, 42363, 0, 0, 0, 0, 69949, 119157, 64732, 0, + 0, 126983, 0, 0, 983678, 7140, 42051, 0, 4164, 118799, 0, 120569, 42049, + 42042, 0, 0, 0, 120637, 69938, 0, 42047, 0, 0, 8470, 11807, 128935, 0, 0, + 194825, 74300, 126267, 0, 120517, 0, 0, 0, 0, 8736, 0, 42643, 72753, + 129925, 0, 0, 71432, 0, 93023, 110730, 72869, 110728, 0, 0, 0, 0, 68445, + 0, 0, 2106, 0, 11273, 120986, 43004, 0, 82988, 0, 961, 64307, 0, 0, 0, + 67711, 110615, 0, 1696, 0, 9762, 12105, 0, 110622, 110623, 3264, 110621, + 110618, 43003, 110616, 110617, 0, 120359, 0, 128660, 0, 2322, 0, 70831, + 11449, 128187, 42868, 0, 0, 0, 0, 113746, 983234, 0, 129583, 66398, 0, 0, + 0, 0, 0, 111135, 119224, 0, 0, 64421, 0, 113739, 0, 65823, 0, 11182, 0, + 0, 0, 7766, 55268, 0, 4598, 0, 65839, 0, 0, 0, 10851, 0, 6179, 92602, + 6180, 129524, 11952, 0, 78648, 78651, 78646, 78647, 78644, 78645, 3801, + 78643, 6176, 120580, 0, 0, 6177, 0, 78652, 78653, 6178, 0, 0, 0, 0, 2214, + 8754, 0, 0, 2137, 0, 0, 0, 0, 66889, 0, 0, 0, 8974, 2308, 0, 74579, 0, + 2318, 122920, 0, 8198, 0, 0, 0, 74307, 0, 119524, 0, 0, 6970, 0, 0, 0, + 41159, 0, 120363, 6385, 0, 128403, 0, 0, 126258, 0, 72785, 42053, 2075, + 42057, 0, 42052, 0, 0, 67651, 0, 9665, 0, 0, 13181, 0, 0, 69379, 0, 0, 0, + 0, 73010, 0, 0, 0, 41145, 0, 0, 0, 41148, 0, 7594, 113686, 75033, 119090, + 10869, 43458, 41146, 0, 0, 121456, 917630, 0, 0, 0, 0, 0, 65184, 11780, + 0, 42796, 0, 69742, 0, 65146, 66803, 0, 0, 0, 7358, 78241, 0, 7988, + 101371, 101370, 3271, 101372, 0, 69281, 0, 0, 0, 101369, 13070, 113736, + 42044, 101365, 1095, 101367, 3599, 101361, 101364, 101157, 129087, 66390, + 101360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42043, 43232, 67656, 121014, 42046, 64355, 4036, 123601, 0, 0, 983062, 0, 11954, 0, 41191, 12986, 0, 194854, - 65441, 0, 72202, 0, 129338, 0, 0, 0, 12834, 0, 0, 0, 0, 0, 0, 0, 41190, - 0, 0, 4575, 41193, 0, 429, 119174, 124931, 194859, 0, 65792, 128754, - 78509, 0, 128866, 0, 0, 0, 66786, 0, 194862, 10590, 0, 0, 0, 0, 0, 0, - 6247, 10214, 65126, 68253, 0, 0, 0, 983680, 1617, 8050, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6352, 0, 0, 0, 0, 0, 0, 0, 0, 92335, 0, 0, 42926, 0, 0, 0, - 8689, 78750, 70067, 42896, 74147, 3559, 0, 0, 74526, 65850, 12327, 72763, - 119028, 0, 0, 72761, 0, 78903, 0, 0, 0, 0, 70079, 72751, 0, 12153, 0, 0, - 120654, 0, 0, 0, 0, 0, 0, 681, 129406, 703, 983461, 3272, 0, 0, 70077, 0, - 0, 70514, 78902, 92532, 71436, 42238, 124930, 3276, 0, 0, 65928, 0, 0, - 128949, 0, 0, 0, 78813, 78814, 3262, 78811, 42711, 0, 0, 0, 0, 92746, - 9995, 1655, 70131, 78818, 78815, 12479, 0, 0, 0, 70513, 42797, 0, 0, - 128371, 43112, 0, 43488, 0, 0, 0, 42684, 0, 0, 0, 0, 0, 128308, 0, 0, 0, - 0, 0, 0, 11031, 0, 0, 0, 70386, 10348, 10412, 0, 0, 74329, 0, 0, 0, - 129026, 0, 0, 0, 8810, 0, 686, 0, 0, 0, 0, 0, 110709, 0, 0, 12040, 0, 0, + 65441, 0, 72202, 0, 129338, 0, 101353, 101352, 12834, 0, 101349, 101348, + 101351, 101350, 101345, 101344, 41190, 101346, 129693, 4575, 41193, 0, + 429, 119174, 124931, 194859, 0, 65792, 128754, 78509, 0, 128866, 0, 0, 0, + 66786, 0, 194862, 10590, 0, 0, 0, 0, 0, 0, 6247, 10214, 65126, 68253, 0, + 0, 0, 983680, 1617, 8050, 0, 0, 0, 101358, 101357, 0, 101359, 101354, 0, + 101356, 6352, 0, 0, 0, 0, 0, 0, 0, 0, 92335, 0, 0, 42926, 0, 0, 0, 8689, + 78750, 70067, 42896, 74147, 3559, 101327, 0, 74526, 65850, 12327, 72763, + 101325, 0, 0, 72761, 0, 78903, 0, 0, 0, 0, 70079, 72751, 0, 12153, + 101340, 101343, 101342, 71940, 0, 101339, 101338, 0, 0, 681, 129406, 703, + 101335, 3272, 101337, 101332, 70077, 101334, 101333, 70514, 78902, 92532, + 71436, 42238, 124930, 3276, 0, 101311, 65928, 0, 0, 101307, 101306, + 101309, 101308, 78813, 78814, 3262, 78811, 42711, 101305, 0, 0, 101302, + 92746, 9995, 1655, 70131, 78818, 78815, 12479, 0, 0, 101296, 70513, + 42797, 0, 0, 128371, 43112, 101318, 43488, 101320, 101315, 101314, 42684, + 101316, 0, 0, 101313, 101312, 128308, 0, 0, 0, 0, 0, 0, 11031, 0, 0, 0, + 70386, 10348, 10412, 0, 0, 74329, 0, 0, 0, 101285, 101284, 101287, + 101286, 8810, 101280, 686, 101282, 0, 0, 0, 0, 110709, 0, 0, 12040, 0, 0, 65118, 110704, 0, 118891, 110599, 0, 110598, 0, 120543, 983660, 0, 65455, 74413, 94097, 0, 119129, 0, 0, 0, 78776, 0, 64467, 10300, 10161, 10396, - 0, 0, 0, 0, 78773, 0, 0, 0, 1458, 0, 0, 72429, 65120, 11479, 0, 0, 6350, - 0, 0, 71473, 1061, 69787, 9115, 43111, 0, 0, 0, 0, 983960, 0, 120907, - 1045, 0, 73913, 983564, 0, 0, 0, 0, 0, 0, 8486, 0, 0, 0, 4362, 0, 0, - 93054, 1025, 0, 0, 0, 0, 0, 92328, 128206, 0, 1774, 0, 122913, 0, 0, 0, - 11207, 0, 0, 3988, 0, 0, 983048, 0, 0, 8564, 983958, 0, 0, 0, 0, 0, 0, - 66513, 6256, 0, 579, 55218, 0, 0, 0, 127337, 0, 11814, 0, 4488, 128716, - 127336, 0, 10444, 118846, 78238, 0, 0, 127331, 4487, 127849, 42832, 1032, - 0, 43450, 0, 70155, 0, 614, 0, 127325, 0, 0, 128466, 0, 127323, 0, - 127322, 0, 0, 0, 1050, 7549, 127319, 0, 9314, 0, 0, 0, 0, 0, 70434, - 127314, 12527, 66504, 0, 0, 0, 0, 64333, 127312, 128547, 92594, 0, 0, 0, - 129316, 0, 124960, 10360, 6746, 0, 0, 0, 0, 13085, 9233, 0, 0, 0, 0, 0, - 0, 92766, 0, 121114, 983925, 74212, 42819, 10910, 0, 68044, 9896, 0, 0, - 120915, 0, 0, 7970, 0, 0, 0, 0, 113699, 9849, 0, 122910, 0, 0, 10487, - 69714, 0, 10103, 0, 4769, 0, 0, 0, 2283, 0, 0, 74785, 0, 0, 0, 110595, - 110596, 0, 110594, 64565, 4773, 0, 0, 0, 4770, 0, 0, 0, 65457, 69441, 0, - 0, 127338, 983593, 4774, 0, 68497, 2259, 0, 0, 10215, 0, 0, 0, 0, 0, - 74776, 92160, 4768, 0, 0, 4099, 0, 110699, 110700, 110697, 2225, 0, 0, 0, - 0, 125217, 11255, 42814, 880, 0, 0, 0, 0, 0, 67756, 65246, 0, 0, 129463, - 7095, 0, 0, 0, 0, 0, 0, 2427, 0, 7093, 0, 11585, 0, 9962, 0, 12223, 0, - 78211, 1434, 42939, 0, 11573, 0, 0, 0, 121257, 0, 0, 0, 0, 74437, 0, - 113711, 917596, 0, 8740, 0, 3782, 64331, 0, 65167, 1014, 0, 0, 0, 10835, - 0, 0, 0, 0, 0, 0, 118824, 7302, 0, 67707, 0, 1150, 10547, 0, 0, 68427, 0, - 0, 0, 0, 118788, 0, 0, 0, 42257, 8010, 0, 0, 0, 9643, 0, 0, 12864, 0, 0, - 0, 0, 0, 0, 0, 0, 1426, 68217, 0, 68447, 0, 0, 0, 0, 73701, 0, 0, 0, - 65383, 0, 0, 0, 0, 0, 0, 43196, 43194, 92549, 10744, 0, 990, 93772, 0, 0, - 0, 0, 0, 66470, 0, 0, 0, 3945, 0, 0, 0, 0, 0, 127546, 127746, 1020, - 73763, 92257, 0, 0, 64748, 0, 0, 10205, 0, 0, 10016, 0, 74051, 0, 43242, - 125096, 2667, 0, 125037, 0, 9911, 0, 0, 10097, 0, 0, 0, 118836, 0, 0, 0, - 0, 68889, 10159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983338, 92291, 0, 127973, - 72882, 0, 1041, 127182, 6354, 0, 65364, 0, 0, 0, 72884, 0, 128477, 0, - 65906, 127819, 72883, 0, 128470, 5375, 72881, 0, 8215, 0, 10074, 0, 0, 0, - 69899, 0, 0, 121426, 41382, 0, 0, 5173, 65348, 527, 0, 0, 0, 128250, 0, - 0, 0, 0, 0, 0, 42695, 0, 42250, 0, 11187, 113695, 0, 1568, 66806, 0, 0, - 113705, 0, 0, 129487, 0, 0, 128839, 9069, 6144, 0, 0, 0, 0, 66783, 0, - 74027, 118934, 66787, 74580, 0, 110790, 6364, 0, 66794, 43508, 0, 92612, - 0, 0, 0, 0, 128405, 66449, 0, 0, 0, 0, 70714, 0, 70716, 0, 1044, 42411, - 0, 0, 0, 0, 43239, 0, 0, 0, 0, 42450, 0, 0, 68479, 119237, 0, 0, 0, 0, 0, - 69956, 11537, 0, 121206, 0, 0, 0, 0, 1057, 566, 0, 0, 10907, 42274, - 43464, 0, 0, 0, 78472, 71207, 42636, 0, 123603, 0, 0, 0, 64659, 0, - 127749, 0, 6357, 6362, 0, 0, 2216, 9090, 0, 0, 0, 0, 68227, 0, 0, 0, 0, - 1053, 12830, 0, 0, 0, 1052, 1051, 459, 1060, 0, 66479, 0, 0, 0, 128061, - 42490, 689, 6508, 4163, 42298, 8639, 983333, 4246, 0, 43514, 42362, 0, - 42337, 64596, 0, 0, 0, 0, 0, 6359, 0, 43471, 0, 0, 0, 127274, 0, 6358, - 6361, 1926, 6356, 0, 7898, 0, 10935, 0, 127972, 121285, 0, 43685, 0, 0, - 42910, 0, 8693, 0, 0, 44010, 0, 120991, 121454, 0, 0, 0, 0, 129514, 0, 0, - 0, 0, 73947, 0, 129361, 92412, 0, 66477, 0, 0, 0, 43854, 71913, 0, 0, 0, - 0, 72227, 65899, 92275, 0, 0, 0, 68887, 0, 71057, 0, 0, 0, 0, 119183, - 2923, 10853, 0, 0, 0, 0, 72864, 0, 72773, 72772, 0, 120801, 65251, 0, - 68228, 0, 128548, 0, 0, 5370, 70465, 2931, 73848, 0, 10188, 0, 118848, 0, - 983923, 0, 0, 0, 72212, 0, 10844, 121016, 128195, 92424, 0, 0, 0, 286, 0, - 1062, 0, 0, 0, 7395, 0, 1070, 128993, 0, 6095, 0, 0, 0, 127796, 126465, - 64497, 0, 0, 0, 0, 70054, 8189, 78272, 0, 0, 0, 0, 0, 113783, 42102, - 78276, 0, 0, 42101, 0, 78402, 67427, 33, 67425, 67424, 10824, 67430, - 67429, 67428, 427, 64723, 0, 0, 0, 0, 1031, 0, 0, 42104, 0, 0, 2328, 0, - 1071, 42899, 128486, 0, 7673, 0, 0, 1047, 0, 0, 42908, 0, 0, 10651, 0, 0, - 0, 72433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13216, 0, 69716, 0, 0, 0, - 0, 0, 92411, 69654, 0, 0, 0, 2761, 194834, 0, 0, 0, 0, 8643, 0, 0, 94021, - 2757, 11067, 0, 74498, 8910, 10689, 0, 0, 0, 71173, 0, 9196, 71214, 0, 0, - 0, 0, 118911, 0, 0, 0, 0, 0, 0, 0, 0, 68130, 119616, 0, 0, 42477, 0, 0, - 4495, 0, 0, 0, 0, 70080, 10992, 0, 0, 0, 0, 9318, 0, 6002, 0, 73808, 0, - 92601, 42249, 7639, 43995, 0, 0, 5454, 0, 0, 0, 0, 0, 0, 0, 121189, 0, - 119173, 0, 9704, 120686, 0, 78436, 78435, 11204, 0, 0, 1731, 0, 92937, 0, - 67990, 0, 0, 0, 126576, 127018, 0, 55265, 0, 0, 0, 0, 127257, 73826, 0, - 3840, 0, 41432, 0, 0, 68430, 0, 43253, 128284, 0, 3371, 92936, 0, 0, - 1479, 0, 0, 1109, 77997, 0, 129154, 0, 92782, 0, 0, 8868, 399, 67978, - 74842, 0, 0, 194839, 0, 551, 0, 10156, 0, 92572, 0, 2544, 65074, 0, 0, 0, - 0, 0, 0, 0, 128713, 0, 0, 74268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68045, 0, - 0, 0, 3447, 0, 0, 121414, 2549, 110818, 0, 0, 43564, 8946, 0, 74411, - 66864, 0, 70480, 7980, 0, 113698, 0, 119653, 66489, 0, 64695, 128063, 0, - 0, 0, 0, 0, 0, 43452, 0, 92993, 0, 10919, 0, 67810, 0, 0, 0, 0, 6450, - 10055, 0, 0, 0, 0, 42720, 0, 9626, 0, 128055, 74447, 0, 125127, 92573, 0, - 0, 0, 119075, 0, 0, 66486, 0, 0, 0, 0, 0, 0, 75028, 983864, 74839, 0, 0, - 0, 0, 0, 55286, 0, 1055, 917628, 0, 0, 0, 70516, 12146, 0, 73956, 66488, - 0, 0, 0, 0, 0, 0, 42518, 0, 0, 0, 7407, 74978, 0, 0, 0, 0, 0, 0, 0, - 10231, 0, 66626, 0, 0, 92951, 0, 65927, 0, 0, 69696, 0, 92389, 0, 0, 0, - 68095, 92950, 0, 10555, 0, 0, 9091, 10798, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 43222, 0, 74982, 0, 0, 120952, 0, 0, 2992, 7826, 74321, 0, 125103, 74981, - 92628, 0, 0, 128289, 128203, 4361, 129597, 1306, 78770, 1497, 983628, 0, - 0, 0, 8248, 0, 127253, 7973, 128706, 0, 0, 73122, 983930, 0, 0, 2963, - 120653, 0, 128554, 0, 0, 64258, 0, 0, 69677, 74983, 65103, 0, 0, 42625, - 0, 0, 0, 0, 64905, 0, 9512, 0, 119076, 6443, 983262, 0, 9135, 0, 0, + 0, 0, 0, 0, 78773, 101294, 101293, 0, 1458, 101290, 0, 72429, 65120, + 11479, 0, 0, 6350, 101289, 101288, 71473, 1061, 69787, 9115, 43111, 0, 0, + 0, 0, 983960, 0, 120907, 1045, 0, 73913, 983564, 0, 0, 0, 0, 0, 0, 8486, + 0, 0, 0, 4362, 0, 0, 93054, 1025, 0, 0, 0, 0, 0, 92328, 128206, 0, 1774, + 0, 122913, 0, 0, 0, 11207, 0, 0, 3988, 0, 0, 983048, 0, 0, 8564, 983958, + 0, 0, 0, 0, 0, 0, 66513, 6256, 0, 579, 55218, 0, 0, 0, 127337, 0, 11814, + 0, 4488, 128716, 127336, 0, 10444, 118846, 78238, 0, 0, 127331, 4487, + 127849, 42832, 1032, 0, 43450, 0, 70155, 0, 614, 0, 127325, 0, 0, 128466, + 0, 127323, 0, 127322, 0, 0, 0, 1050, 7549, 127319, 0, 9314, 0, 0, 0, 0, + 0, 70434, 127314, 12527, 66504, 0, 0, 0, 0, 64333, 127312, 128547, 92594, + 0, 0, 0, 129316, 0, 124960, 10360, 6746, 0, 0, 0, 0, 13085, 9233, 0, 0, + 0, 0, 0, 0, 92766, 0, 121114, 983925, 74212, 42819, 10910, 0, 68044, + 9896, 0, 0, 120915, 0, 0, 7970, 0, 0, 0, 0, 113699, 9849, 0, 122910, 0, + 0, 10487, 69714, 0, 10103, 0, 4769, 0, 129967, 0, 2283, 0, 0, 74785, 0, + 0, 0, 110595, 110596, 0, 110594, 64565, 4773, 0, 0, 0, 4770, 0, 0, 0, + 65457, 69441, 0, 0, 127338, 983593, 4774, 0, 68497, 2259, 0, 0, 10215, 0, + 0, 0, 0, 0, 74776, 92160, 4768, 0, 0, 4099, 0, 110699, 110700, 110697, + 2225, 0, 0, 0, 0, 125217, 11255, 42814, 880, 0, 0, 0, 0, 0, 67756, 65246, + 0, 0, 129463, 7095, 0, 0, 0, 0, 0, 0, 2427, 0, 7093, 0, 11585, 0, 9962, + 0, 12223, 0, 78211, 1434, 42939, 0, 11573, 0, 0, 0, 121257, 0, 0, 0, 0, + 74437, 0, 113711, 917596, 0, 8740, 0, 3782, 64331, 0, 65167, 1014, 0, 0, + 0, 10835, 129987, 0, 0, 0, 0, 0, 118824, 7302, 0, 67707, 0, 1150, 10547, + 0, 0, 68427, 0, 0, 0, 0, 118788, 0, 0, 0, 42257, 8010, 0, 0, 0, 9643, 0, + 0, 12864, 0, 0, 0, 0, 0, 0, 0, 0, 1426, 68217, 0, 68447, 129971, 0, 0, 0, + 73701, 0, 0, 0, 65383, 0, 0, 0, 0, 0, 0, 43196, 43194, 92549, 10744, 0, + 990, 93772, 0, 0, 0, 0, 0, 66470, 0, 0, 0, 3945, 0, 0, 0, 130039, 0, + 127546, 127746, 1020, 73763, 92257, 0, 0, 64748, 0, 0, 10205, 0, 0, + 10016, 0, 74051, 0, 43242, 125096, 2667, 0, 125037, 0, 9911, 0, 0, 10097, + 0, 0, 0, 118836, 0, 0, 0, 0, 68889, 10159, 113759, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 983338, 92291, 0, 127973, 72882, 0, 1041, 127182, 6354, 0, 65364, + 0, 0, 0, 72884, 0, 128477, 0, 65906, 127819, 72883, 0, 128470, 5375, + 72881, 0, 8215, 0, 10074, 0, 0, 0, 69899, 0, 0, 121426, 41382, 0, 0, + 5173, 65348, 527, 0, 0, 0, 128250, 0, 0, 0, 0, 0, 0, 42695, 0, 42250, 0, + 11187, 113695, 0, 1568, 66806, 0, 0, 113705, 0, 0, 129487, 0, 0, 128839, + 9069, 6144, 0, 0, 0, 0, 66783, 0, 74027, 118934, 66787, 74580, 0, 110790, + 6364, 0, 66794, 43508, 0, 92612, 0, 0, 0, 0, 128405, 66449, 0, 0, 0, 0, + 70714, 0, 70716, 0, 1044, 42411, 0, 0, 0, 0, 43239, 0, 0, 0, 0, 42450, 0, + 0, 68479, 119237, 0, 0, 0, 0, 0, 69956, 11537, 0, 121206, 0, 0, 0, 0, + 1057, 566, 0, 0, 10907, 42274, 43464, 0, 0, 0, 78472, 71207, 42636, 0, + 123603, 0, 0, 121171, 64659, 0, 127749, 0, 6357, 6362, 0, 0, 2216, 9090, + 0, 0, 0, 0, 68227, 0, 0, 0, 0, 1053, 12830, 0, 0, 0, 1052, 1051, 459, + 1060, 0, 66479, 0, 0, 0, 128061, 42490, 689, 6508, 4163, 42298, 8639, + 983333, 4246, 0, 43514, 42362, 0, 42337, 64596, 0, 0, 0, 0, 0, 6359, 0, + 43471, 0, 0, 0, 127274, 0, 6358, 6361, 1926, 6356, 0, 7898, 0, 10935, 0, + 127972, 121285, 0, 43685, 0, 0, 42910, 0, 8693, 0, 0, 44010, 0, 120991, + 121454, 0, 0, 0, 0, 129514, 0, 0, 0, 0, 73947, 0, 129361, 92412, 0, + 66477, 0, 0, 0, 43854, 71913, 0, 0, 0, 0, 72227, 65899, 92275, 0, 0, 0, + 68887, 0, 71057, 0, 0, 0, 0, 119183, 2923, 10853, 0, 0, 0, 0, 72864, 0, + 72773, 72772, 0, 120801, 65251, 0, 68228, 0, 128548, 0, 0, 5370, 70465, + 2931, 73848, 0, 10188, 0, 118848, 0, 983923, 0, 0, 0, 72212, 0, 10844, + 121016, 128195, 92424, 0, 0, 0, 286, 0, 1062, 0, 0, 0, 7395, 0, 1070, + 128993, 0, 6095, 0, 0, 0, 127796, 126465, 64497, 0, 0, 0, 0, 70054, 8189, + 78272, 0, 0, 0, 0, 0, 113783, 42102, 78276, 0, 0, 42101, 0, 78402, 67427, + 33, 67425, 67424, 10824, 67430, 67429, 67428, 427, 64723, 0, 0, 0, 0, + 1031, 0, 0, 42104, 0, 0, 2328, 0, 1071, 42899, 128486, 0, 7673, 0, 0, + 1047, 0, 0, 42908, 0, 0, 10651, 0, 0, 0, 72433, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13216, 0, 69716, 0, 0, 0, 0, 0, 92411, 69654, 0, 0, 129904, + 2761, 129909, 0, 0, 0, 0, 8643, 0, 0, 94021, 2757, 11067, 0, 74498, 8910, + 10689, 0, 0, 0, 71173, 0, 9196, 71214, 0, 0, 0, 0, 118911, 0, 0, 0, 0, 0, + 0, 0, 0, 68130, 119616, 0, 0, 42477, 0, 0, 4495, 0, 0, 0, 0, 70080, + 10992, 0, 0, 0, 0, 9318, 0, 6002, 0, 73808, 0, 92601, 42249, 7639, 43995, + 0, 0, 5454, 0, 0, 0, 0, 0, 0, 0, 121189, 0, 119173, 0, 9704, 120686, 0, + 78436, 78435, 11204, 0, 0, 1731, 0, 92937, 0, 67990, 0, 0, 0, 126576, + 127018, 71951, 55265, 0, 0, 0, 0, 127257, 73826, 0, 3840, 0, 41432, 0, 0, + 68430, 0, 43253, 128284, 0, 3371, 92936, 0, 0, 1479, 69282, 0, 1109, + 77997, 0, 129154, 0, 92782, 0, 0, 8868, 399, 67978, 74842, 0, 0, 194839, + 0, 551, 0, 10156, 0, 92572, 0, 2544, 65074, 0, 0, 0, 0, 0, 0, 0, 128713, + 0, 0, 74268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68045, 0, 0, 0, 3447, 0, 0, + 121414, 2549, 110818, 0, 0, 43564, 8946, 0, 74411, 66864, 0, 70480, 7980, + 0, 113698, 0, 119653, 66489, 0, 64695, 128063, 0, 0, 0, 0, 0, 0, 43452, + 0, 92993, 0, 10919, 0, 67810, 0, 0, 0, 0, 6450, 10055, 0, 0, 0, 0, 42720, + 0, 9626, 0, 128055, 74447, 0, 125127, 92573, 0, 0, 0, 119075, 0, 0, + 66486, 0, 0, 0, 0, 0, 0, 75028, 983864, 74839, 0, 0, 0, 0, 0, 55286, 0, + 1055, 917628, 0, 0, 0, 70516, 12146, 0, 73956, 66488, 0, 0, 0, 0, 0, 0, + 42518, 0, 0, 0, 7407, 74978, 0, 0, 0, 0, 0, 0, 0, 10231, 0, 66626, 0, 0, + 92951, 0, 65927, 0, 0, 69696, 0, 92389, 0, 0, 0, 68095, 92950, 0, 10555, + 0, 0, 9091, 10798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43222, 0, 74982, 0, 0, + 120952, 0, 0, 2992, 7826, 74321, 0, 125103, 74981, 92628, 0, 129903, + 128289, 128203, 4361, 129597, 1306, 78770, 1497, 983628, 0, 0, 0, 8248, + 0, 127253, 7973, 128706, 0, 0, 73122, 983930, 0, 0, 2963, 120653, 0, + 128554, 0, 0, 64258, 0, 0, 69677, 74983, 65103, 0, 125008, 42625, 0, + 72022, 0, 0, 64905, 0, 9512, 0, 119076, 6443, 983262, 0, 9135, 0, 0, 123202, 0, 0, 983863, 93788, 0, 0, 0, 93767, 64256, 0, 11669, 0, 0, 4524, 0, 129182, 128390, 0, 74266, 0, 0, 0, 70119, 78410, 69809, 121031, 55219, 69815, 93765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2986, 0, 93763, 3437, 0, - 6203, 4247, 0, 11920, 8274, 68240, 0, 1657, 0, 121276, 0, 0, 2954, 43506, - 42837, 0, 0, 71179, 0, 0, 0, 66476, 68450, 0, 0, 0, 43362, 983134, + 6203, 4247, 0, 11920, 8274, 68240, 129694, 1657, 0, 121276, 0, 0, 2954, + 43506, 42837, 0, 0, 71179, 0, 0, 0, 66476, 68450, 0, 0, 0, 43362, 983134, 129596, 11705, 0, 0, 0, 127354, 0, 11710, 0, 0, 0, 0, 74429, 0, 0, 1058, - 0, 0, 0, 0, 1144, 0, 0, 0, 0, 0, 118972, 0, 65322, 0, 6441, 0, 0, 2547, - 66484, 43634, 0, 5871, 0, 0, 0, 0, 0, 0, 71204, 0, 0, 1865, 0, 0, 69950, - 0, 0, 73713, 0, 71199, 65826, 2069, 0, 119092, 43999, 2997, 0, 126588, 0, - 65319, 0, 12316, 0, 0, 123630, 8776, 0, 0, 66294, 13130, 0, 71191, - 126625, 0, 10030, 11709, 12364, 983834, 0, 11704, 0, 0, 68672, 0, 0, 0, - 0, 11706, 9710, 0, 82985, 0, 413, 65623, 0, 0, 0, 74446, 0, 1042, 0, - 128378, 12171, 119240, 0, 0, 4984, 0, 708, 11391, 0, 0, 0, 983911, 1308, - 0, 3673, 810, 0, 120933, 0, 0, 0, 1917, 3000, 0, 0, 0, 65628, 66387, - 74470, 0, 0, 0, 10027, 0, 0, 0, 0, 128831, 983167, 2980, 755, 0, 0, - 65622, 0, 121012, 7277, 121022, 0, 0, 0, 0, 8730, 0, 0, 0, 7274, 119250, - 0, 7275, 0, 935, 0, 0, 377, 42325, 121103, 0, 0, 127075, 0, 0, 0, 74911, - 2417, 0, 0, 19912, 0, 0, 0, 0, 0, 0, 0, 7248, 0, 0, 1781, 5496, 3627, 62, - 1649, 0, 964, 0, 0, 0, 0, 92897, 0, 0, 127364, 0, 43689, 127911, 66287, - 78812, 64389, 66575, 0, 73041, 0, 0, 0, 7677, 2991, 0, 0, 0, 0, 72201, 0, + 129555, 0, 0, 0, 1144, 0, 0, 0, 0, 0, 118972, 0, 65322, 0, 6441, 0, 0, + 2547, 66484, 43634, 0, 5871, 0, 0, 0, 0, 0, 0, 71204, 0, 0, 1865, 0, 0, + 69950, 0, 93021, 73713, 0, 71199, 65826, 2069, 0, 119092, 43999, 2997, 0, + 126588, 0, 65319, 0, 12316, 0, 0, 123630, 8776, 0, 0, 66294, 13130, 0, + 71191, 126625, 0, 10030, 11709, 12364, 983834, 0, 11704, 0, 0, 68672, 0, + 0, 0, 0, 11706, 9710, 0, 82985, 0, 413, 65623, 0, 0, 0, 74446, 0, 1042, + 0, 128378, 12171, 119240, 0, 69384, 4984, 0, 708, 11391, 0, 0, 0, 983911, + 1308, 0, 3673, 810, 0, 120933, 0, 0, 0, 1917, 3000, 0, 0, 0, 65628, + 66387, 74470, 0, 0, 0, 10027, 0, 0, 0, 0, 128831, 983167, 2980, 755, 0, + 0, 65622, 0, 121012, 7277, 121022, 0, 0, 0, 0, 8730, 0, 0, 0, 7274, + 119250, 0, 7275, 0, 935, 0, 0, 377, 42325, 121103, 0, 101133, 101132, + 101135, 101134, 0, 74911, 2417, 101130, 0, 19912, 0, 0, 101128, 101127, + 0, 101129, 101124, 7248, 101126, 101125, 1781, 5496, 3627, 62, 1649, 0, + 964, 0, 0, 0, 0, 92897, 0, 0, 127364, 0, 43689, 127911, 66287, 78812, + 64389, 66575, 0, 73041, 0, 129687, 0, 7677, 2991, 0, 0, 0, 0, 72201, 0, 11341, 127049, 0, 65625, 9714, 11692, 0, 0, 120850, 6478, 10195, 43673, - 65237, 6241, 0, 0, 0, 6238, 0, 0, 0, 4409, 0, 0, 67170, 0, 0, 0, 94047, - 6237, 5461, 66851, 9176, 92882, 121341, 65231, 0, 0, 121182, 128468, 0, - 44018, 0, 64765, 0, 0, 0, 5685, 0, 2461, 0, 7091, 0, 0, 0, 68163, 0, - 73030, 0, 0, 73928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68506, 0, 0, 0, 0, 0, - 2542, 0, 0, 0, 128176, 5776, 0, 0, 0, 0, 0, 11987, 0, 0, 75036, 68744, 0, - 0, 10039, 42828, 0, 0, 0, 0, 0, 10721, 67664, 43433, 0, 0, 41875, 0, - 41870, 266, 129066, 0, 41873, 71271, 0, 0, 0, 0, 0, 0, 41871, 66186, - 3734, 7734, 43683, 8750, 110600, 66011, 92899, 0, 127937, 0, 0, 10572, 0, - 42906, 0, 64349, 7287, 0, 0, 0, 0, 11167, 69220, 0, 43429, 0, 1697, 0, 0, - 68633, 7286, 0, 128738, 10031, 78754, 0, 68645, 8620, 0, 42162, 0, 0, - 7285, 0, 119577, 0, 66842, 43677, 41583, 0, 65799, 129332, 0, 0, 0, 0, - 110806, 0, 3609, 0, 129448, 0, 125116, 126254, 128108, 73948, 0, 0, 0, 0, - 129189, 42732, 92699, 74984, 68620, 11691, 74985, 0, 0, 0, 0, 0, 6348, - 243, 74075, 0, 0, 92309, 123585, 0, 0, 10648, 8538, 43687, 0, 0, 0, - 70515, 0, 118954, 92886, 13307, 129573, 92891, 0, 120770, 983831, 0, 0, - 0, 0, 214, 0, 0, 0, 65893, 0, 120488, 128386, 0, 92893, 0, 2603, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 1016, 0, 0, 0, 3885, 92, 65456, 64608, - 0, 0, 0, 70656, 113742, 0, 0, 0, 128128, 983838, 0, 0, 6791, 983842, - 127960, 0, 0, 0, 118976, 0, 7328, 92358, 0, 7995, 8759, 43421, 0, 68029, - 0, 0, 125272, 0, 3197, 0, 0, 0, 983150, 0, 11595, 0, 0, 43435, 0, 0, 0, - 0, 0, 70660, 0, 741, 83291, 5494, 0, 70668, 1990, 11107, 4498, 0, 0, - 70658, 0, 0, 2960, 73779, 0, 8969, 0, 43424, 0, 0, 2950, 0, 0, 129035, - 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122900, 0, 0, 0, 0, 2964, 43663, 0, - 6344, 0, 0, 10144, 0, 8252, 729, 66016, 78446, 0, 0, 0, 78740, 43669, - 9032, 0, 0, 0, 0, 0, 0, 0, 0, 74612, 3761, 0, 0, 0, 0, 0, 0, 3850, 0, 0, + 65237, 6241, 0, 0, 0, 6238, 0, 129889, 0, 4409, 0, 0, 67170, 0, 0, 0, + 94047, 6237, 5461, 66851, 9176, 92882, 121341, 65231, 0, 0, 121182, + 128468, 0, 44018, 0, 64765, 0, 0, 0, 5685, 0, 2461, 0, 7091, 0, 0, 0, + 68163, 0, 73030, 0, 0, 73928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68506, 0, 0, 0, + 0, 0, 2542, 0, 0, 0, 128176, 5776, 0, 0, 0, 0, 0, 11987, 0, 0, 75036, + 68744, 0, 0, 10039, 42828, 0, 0, 0, 0, 0, 10721, 67664, 43433, 0, 0, + 41875, 0, 41870, 266, 129066, 0, 41873, 71271, 0, 0, 0, 0, 0, 0, 41871, + 66186, 3734, 7734, 43683, 8750, 110600, 66011, 92899, 0, 127937, 0, 0, + 10572, 0, 42906, 0, 64349, 7287, 0, 0, 0, 0, 11167, 69220, 0, 43429, 0, + 1697, 0, 0, 68633, 7286, 0, 128738, 10031, 78754, 0, 68645, 8620, 0, + 42162, 0, 0, 7285, 0, 119577, 0, 66842, 43677, 41583, 0, 65799, 129332, + 0, 0, 0, 0, 110806, 0, 3609, 0, 129448, 119074, 125116, 126254, 128108, + 73948, 0, 0, 0, 0, 129189, 42732, 92699, 74984, 68620, 11691, 74985, 0, + 0, 0, 0, 0, 6348, 243, 74075, 0, 0, 92309, 123585, 0, 0, 10648, 8538, + 43687, 0, 0, 0, 70515, 0, 118954, 92886, 13307, 129573, 92891, 0, 120770, + 983831, 0, 0, 0, 0, 214, 0, 0, 0, 65893, 0, 120488, 128386, 0, 92893, 0, + 2603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 1016, 0, 0, 0, 3885, 92, + 65456, 64608, 0, 0, 0, 70656, 113742, 0, 0, 0, 128128, 983838, 0, 0, + 6791, 983842, 127960, 0, 0, 0, 118976, 0, 7328, 92358, 0, 7995, 8759, + 43421, 0, 68029, 0, 0, 125272, 0, 3197, 0, 0, 0, 983150, 0, 11595, 0, 0, + 43435, 0, 0, 0, 0, 0, 70660, 0, 741, 83291, 5494, 0, 70668, 1990, 11107, + 4498, 0, 0, 70658, 0, 0, 2960, 73779, 0, 8969, 101256, 43424, 0, 101257, + 2950, 101251, 101254, 101253, 370, 0, 101250, 101249, 0, 0, 0, 0, 0, 0, + 0, 122900, 0, 0, 983251, 0, 2964, 43663, 0, 6344, 0, 0, 10144, 0, 8252, + 729, 66016, 78446, 0, 0, 0, 78740, 43669, 9032, 0, 0, 0, 0, 0, 0, 0, 0, + 74612, 3761, 101261, 101260, 101263, 101262, 0, 0, 3850, 101258, 0, 128389, 0, 0, 0, 0, 8611, 0, 0, 0, 43691, 125032, 0, 41802, 120540, 0, 0, - 0, 0, 0, 3848, 0, 113800, 127536, 0, 0, 0, 983270, 663, 0, 0, 0, 0, 0, 0, - 0, 0, 13221, 0, 0, 0, 0, 0, 121348, 0, 65579, 12980, 68046, 12143, 0, - 128067, 0, 43441, 41804, 0, 0, 0, 0, 0, 0, 66329, 0, 72324, 0, 0, 125038, - 0, 129383, 0, 0, 0, 983871, 0, 0, 0, 0, 0, 1097, 129033, 0, 0, 0, 93828, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13110, 0, 983867, 68229, 1000, 0, 0, 0, - 1209, 0, 0, 0, 1073, 6321, 77878, 0, 0, 68213, 0, 12167, 0, 0, 0, 0, - 73673, 121500, 0, 121501, 0, 6587, 0, 0, 0, 9231, 0, 2959, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 42941, 0, 0, 68434, 0, 70742, 0, 0, 12290, 0, 0, 110801, - 0, 77873, 8205, 110803, 5131, 0, 0, 0, 0, 0, 0, 1944, 78453, 0, 0, - 119990, 119991, 12701, 78492, 11308, 119995, 0, 113702, 66836, 119999, - 74263, 92382, 120002, 120003, 7075, 120005, 120006, 120007, 41817, 75063, - 42275, 120011, 120012, 120013, 120014, 42943, 6041, 0, 41899, 0, 8002, 0, - 41902, 0, 0, 64332, 0, 7813, 119117, 0, 41900, 120633, 0, 7281, 78455, - 7279, 12041, 93027, 0, 12673, 0, 129123, 9660, 0, 72984, 0, 0, 0, 0, - 92901, 2970, 0, 0, 0, 77870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3486, 0, 0, 0, 0, - 127799, 0, 0, 0, 69920, 0, 66834, 0, 983987, 0, 68312, 0, 65673, 1019, - 78495, 4148, 0, 12289, 0, 4316, 0, 13119, 983913, 0, 0, 0, 0, 0, 0, - 43434, 41865, 128218, 9163, 8659, 9072, 5867, 13302, 7622, 7120, 0, 0, 0, - 0, 7400, 5416, 0, 0, 10817, 0, 0, 0, 0, 68162, 41855, 41867, 0, 983224, - 0, 11536, 0, 0, 7115, 0, 0, 5498, 7337, 41536, 0, 0, 92587, 7221, 8997, - 0, 0, 0, 0, 0, 0, 127814, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 121292, 0, - 43454, 63903, 63902, 63901, 0, 3971, 0, 0, 2952, 0, 11038, 10901, 63900, - 63899, 63898, 5198, 667, 43273, 63887, 63886, 128458, 78521, 66830, 0, - 92714, 4159, 0, 0, 63885, 63884, 63883, 63882, 63880, 8555, 63878, 63877, - 93057, 0, 0, 63881, 10746, 0, 118983, 0, 63876, 63875, 63874, 63873, - 7432, 1913, 41913, 63852, 0, 128971, 0, 983875, 0, 446, 41911, 0, 63851, - 63850, 41910, 0, 63846, 2972, 63844, 7262, 0, 63849, 63848, 63847, 72990, - 6570, 0, 7259, 63842, 4178, 63840, 121321, 41521, 63894, 63893, 63892, 0, - 0, 1105, 4180, 0, 7418, 0, 0, 63891, 63890, 63889, 63888, 0, 0, 0, 0, + 0, 0, 0, 3848, 101230, 113800, 127536, 101227, 101226, 101229, 101228, + 663, 0, 0, 0, 0, 0, 0, 0, 0, 13221, 0, 0, 101244, 101243, 101246, 101245, + 0, 65579, 12980, 68046, 12143, 0, 128067, 0, 43441, 41804, 101241, + 101240, 101235, 101234, 101237, 101236, 66329, 0, 72324, 101232, 0, + 125038, 0, 129383, 101214, 101213, 0, 101215, 101210, 0, 101212, 101211, + 0, 1097, 129033, 0, 101209, 101208, 93828, 0, 101205, 101204, 101207, + 101206, 101201, 101200, 101203, 101202, 0, 13110, 0, 983867, 68229, 1000, + 0, 0, 101222, 1209, 101224, 101223, 92354, 1073, 6321, 77878, 0, 0, + 68213, 0, 12167, 0, 0, 0, 0, 73673, 121500, 0, 121501, 0, 6587, 0, 0, 0, + 9231, 0, 2959, 101191, 0, 101193, 101188, 101187, 101190, 101189, 101184, + 0, 101186, 42941, 0, 0, 68434, 0, 70742, 0, 0, 12290, 0, 0, 110801, 0, + 77873, 8205, 110803, 5131, 0, 0, 0, 0, 0, 0, 1944, 78453, 0, 0, 119990, + 119991, 12701, 78492, 11308, 119995, 0, 113702, 66836, 119999, 74263, + 92382, 120002, 120003, 7075, 101196, 101199, 101198, 41817, 75063, 42275, + 101194, 120012, 120013, 120014, 42943, 6041, 0, 41899, 0, 8002, 0, 41902, + 0, 0, 64332, 0, 7813, 119117, 0, 41900, 120633, 101167, 7281, 78455, + 7279, 12041, 93027, 101165, 12673, 0, 129123, 9660, 0, 72984, 101161, 0, + 0, 0, 92901, 2970, 0, 101180, 101179, 77870, 101181, 0, 0, 101178, 0, 0, + 0, 0, 0, 3486, 101174, 101177, 101176, 101171, 101170, 101173, 101172, 0, + 69920, 101169, 66834, 0, 983987, 0, 68312, 101150, 65673, 1019, 78495, + 4148, 0, 12289, 101147, 4316, 0, 13119, 983913, 101145, 101144, 0, 0, + 101141, 101140, 43434, 41865, 101137, 9163, 8659, 9072, 5867, 13302, + 7622, 7120, 0, 0, 0, 0, 7400, 5416, 101160, 101159, 10817, 101153, + 101156, 101155, 0, 68162, 41855, 41867, 0, 983224, 0, 11536, 71988, 0, + 7115, 0, 0, 5498, 7337, 41536, 0, 0, 92587, 7221, 8997, 0, 0, 0, 71949, + 0, 0, 127814, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 121292, 0, 43454, 63903, + 63902, 63901, 0, 3971, 0, 0, 2952, 0, 11038, 10901, 63900, 63899, 63898, + 5198, 667, 43273, 63887, 63886, 128458, 78521, 66830, 0, 92714, 4159, 0, + 0, 63885, 63884, 63883, 63882, 63880, 8555, 63878, 63877, 93057, 0, 0, + 63881, 10746, 0, 118983, 0, 63876, 63875, 63874, 63873, 7432, 1913, + 41913, 63852, 0, 128971, 0, 983875, 0, 446, 41911, 0, 63851, 63850, + 41910, 0, 63846, 2972, 63844, 7262, 0, 63849, 63848, 63847, 72990, 6570, + 0, 7259, 63842, 4178, 63840, 121321, 41521, 63894, 63893, 63892, 0, 0, + 1105, 4180, 0, 7418, 0, 129714, 63891, 63890, 63889, 63888, 0, 0, 0, 0, 1678, 0, 66909, 0, 0, 0, 0, 11192, 128360, 128404, 9159, 70089, 63861, 63860, 63859, 63858, 63865, 1615, 63863, 63862, 0, 0, 0, 0, 63857, 63856, 71902, 0, 1077, 0, 65099, 0, 0, 0, 0, 0, 0, 42773, 121331, 0, 0, 119220, - 120912, 129564, 0, 1112, 119122, 8686, 0, 0, 65081, 0, 0, 0, 11077, 0, - 7260, 0, 5327, 0, 63870, 63869, 3847, 63867, 0, 2903, 0, 3001, 66762, 0, - 43746, 0, 63866, 0, 0, 0, 0, 0, 127785, 68420, 2990, 0, 128254, 0, 0, 0, - 0, 1117, 118987, 12212, 129003, 129151, 63836, 63835, 63834, 0, 0, 63839, - 63838, 63837, 0, 125095, 63833, 6042, 66360, 0, 74808, 0, 63821, 63820, - 63819, 63818, 0, 0, 9047, 63822, 128328, 6091, 0, 10691, 0, 74344, 8226, - 0, 63812, 63811, 63810, 63809, 2289, 63815, 63814, 63813, 6047, 0, 0, - 780, 63808, 77925, 77922, 65147, 63931, 63930, 2076, 1093, 9882, 63934, - 2082, 63932, 75050, 63929, 63928, 63927, 77934, 9806, 65566, 77933, - 63922, 63921, 2086, 0, 63926, 2984, 5968, 63923, 0, 0, 129458, 11137, - 13169, 5290, 2089, 0, 63827, 1088, 63825, 7268, 1084, 1085, 63829, 1083, - 10131, 7283, 0, 0, 0, 1092, 0, 7273, 983272, 44016, 43627, 0, 0, 0, + 120912, 129564, 0, 1112, 119122, 8686, 120654, 0, 65081, 0, 0, 0, 11077, + 0, 7260, 0, 5327, 0, 63870, 63869, 3847, 63867, 0, 2903, 0, 3001, 66762, + 0, 43746, 0, 63866, 0, 0, 0, 0, 0, 127785, 68420, 2990, 0, 128254, 0, 0, + 0, 0, 1117, 118987, 12212, 129003, 129151, 63836, 63835, 63834, 0, 0, + 63839, 63838, 63837, 0, 125095, 63833, 6042, 66360, 0, 74808, 0, 63821, + 63820, 63819, 63818, 0, 0, 9047, 63822, 128328, 6091, 0, 10691, 0, 74344, + 8226, 0, 63812, 63811, 63810, 63809, 2289, 63815, 63814, 63813, 6047, 0, + 0, 780, 63808, 77925, 77922, 65147, 63931, 63930, 2076, 1093, 9882, + 63934, 2082, 63932, 75050, 63929, 63928, 63927, 77934, 9806, 65566, + 77933, 63922, 63921, 2086, 0, 63926, 2984, 5968, 63923, 0, 0, 129458, + 11137, 13169, 5290, 2089, 0, 63827, 1088, 63825, 7268, 1084, 1085, 63829, + 1083, 10131, 7283, 0, 0, 0, 1092, 0, 7273, 983272, 44016, 43627, 0, 0, 0, 11809, 0, 0, 0, 2965, 7258, 8808, 0, 1089, 7278, 63937, 63936, 43405, - 11106, 940, 5787, 10099, 63938, 0, 63897, 126123, 2994, 0, 0, 0, 121041, - 77939, 77940, 77937, 77938, 74343, 93043, 72704, 660, 10127, 666, 0, - 5532, 43667, 5533, 77941, 0, 0, 0, 979, 0, 0, 72706, 92652, 9108, 0, - 128374, 129403, 63951, 71685, 0, 0, 128782, 63946, 1707, 983824, 128612, - 63950, 63949, 63948, 63947, 63945, 6038, 63943, 63942, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 73884, 0, 1690, 63919, 63918, 63917, 70865, 43659, 0, 983829, - 0, 2054, 0, 78515, 63916, 9184, 63914, 69737, 63911, 63910, 63909, 63908, - 0, 0, 63913, 6044, 0, 0, 9061, 5534, 10672, 11653, 124932, 5531, 0, 0, 0, - 0, 0, 0, 11957, 0, 68668, 0, 0, 0, 10474, 43426, 0, 42354, 0, 0, 0, 0, 0, - 8413, 66841, 0, 7269, 7272, 0, 0, 0, 125008, 78460, 0, 0, 0, 0, 126639, - 0, 0, 0, 66840, 0, 0, 128441, 0, 0, 0, 92187, 7270, 0, 0, 6628, 1076, - 128700, 0, 0, 0, 0, 0, 0, 12807, 43413, 63906, 4548, 63904, 71187, 70393, - 41729, 44005, 1307, 0, 0, 0, 0, 0, 128268, 0, 8180, 0, 127778, 0, 0, - 5413, 43681, 123205, 3493, 0, 0, 0, 92544, 73937, 10517, 0, 4518, 10990, - 0, 5167, 4481, 3771, 0, 2710, 0, 66277, 0, 0, 43073, 0, 0, 0, 0, 0, 0, - 119659, 1628, 0, 0, 0, 65262, 66809, 10783, 11172, 0, 0, 70840, 113679, - 0, 119029, 0, 0, 41530, 66843, 4457, 0, 0, 0, 0, 0, 41529, 0, 0, 6031, - 65807, 70814, 0, 0, 0, 69705, 0, 0, 11926, 6033, 9656, 0, 0, 0, 68869, 0, - 128930, 0, 128100, 0, 42612, 43655, 0, 0, 0, 66468, 0, 0, 68623, 0, 0, 0, - 0, 120869, 983343, 0, 0, 1151, 0, 73709, 127544, 0, 71106, 0, 0, 0, 0, 0, - 0, 0, 11527, 118870, 0, 0, 11538, 127387, 0, 11020, 0, 66467, 0, 8087, - 71700, 0, 9894, 0, 0, 70824, 120854, 0, 78513, 8053, 0, 0, 0, 0, 120495, - 0, 0, 63845, 0, 0, 78602, 0, 13084, 70170, 8741, 0, 0, 0, 0, 64605, - 83051, 0, 473, 43415, 0, 0, 119271, 1087, 124966, 71275, 0, 0, 66439, - 43218, 0, 0, 7237, 0, 0, 0, 0, 0, 92261, 0, 121036, 4384, 74220, 983779, - 2058, 917561, 0, 0, 0, 0, 0, 3857, 0, 0, 0, 64630, 0, 0, 74168, 0, - 125088, 4421, 0, 0, 0, 66400, 0, 68431, 0, 0, 0, 83053, 0, 0, 69640, - 127861, 0, 437, 0, 0, 0, 0, 65236, 13290, 119180, 4997, 64306, 0, 0, - 4999, 0, 0, 0, 4711, 120769, 0, 2739, 0, 92915, 74834, 0, 127175, 0, 0, - 0, 0, 0, 1779, 6600, 6601, 0, 5325, 0, 128437, 13058, 0, 0, 0, 92186, 0, - 71845, 10575, 43399, 0, 0, 0, 1104, 0, 0, 10655, 0, 0, 0, 0, 1082, - 110878, 0, 67401, 0, 0, 0, 0, 6783, 0, 0, 42867, 69655, 44021, 6458, 0, - 0, 0, 0, 0, 0, 1273, 43407, 0, 0, 0, 0, 1313, 6322, 41720, 128627, 66433, - 0, 0, 0, 11216, 0, 0, 0, 43437, 93833, 0, 0, 0, 5122, 0, 72728, 129520, - 70161, 0, 0, 0, 0, 0, 8303, 0, 128926, 0, 10003, 0, 0, 0, 1686, 0, 0, - 42834, 3664, 0, 126088, 121346, 0, 0, 4324, 126, 0, 0, 0, 0, 0, 65166, 0, - 0, 0, 0, 43817, 0, 43822, 0, 0, 65600, 13002, 0, 0, 0, 1103, 0, 119575, - 0, 0, 13078, 0, 8116, 0, 2050, 0, 0, 1102, 0, 6555, 0, 0, 74003, 74794, - 0, 0, 42591, 127278, 0, 1111, 0, 75047, 4707, 0, 0, 0, 0, 43468, 4522, - 8645, 0, 74857, 0, 11352, 0, 0, 0, 2293, 0, 0, 0, 128265, 71709, 0, 0, 0, - 93827, 0, 0, 0, 128488, 0, 160, 2677, 0, 0, 120141, 0, 0, 70790, 0, - 42770, 0, 0, 0, 43821, 113769, 0, 0, 43816, 0, 0, 1079, 3867, 64817, 0, - 0, 0, 0, 64768, 0, 0, 4005, 983211, 0, 10991, 0, 92957, 917578, 917581, - 917580, 917575, 128314, 917577, 917576, 917571, 78534, 917573, 917572, 0, - 0, 128359, 73458, 0, 3339, 11448, 1106, 917591, 917590, 917593, 3340, - 917587, 917586, 917589, 917588, 917583, 10605, 1309, 74996, 120743, - 92650, 0, 0, 9485, 0, 0, 0, 0, 0, 125002, 92533, 128487, 0, 129285, 4338, - 11238, 0, 66825, 0, 0, 0, 0, 0, 0, 74128, 0, 0, 73680, 0, 129438, 9553, - 1590, 63777, 63776, 128677, 63782, 63781, 63780, 63779, 1583, 0, 0, 0, 0, - 128011, 0, 0, 41522, 0, 92168, 983784, 66759, 0, 983584, 0, 0, 0, 0, - 11394, 0, 983071, 0, 66823, 1334, 0, 4479, 0, 0, 120663, 0, 122883, - 10497, 0, 0, 983777, 66828, 0, 0, 0, 6809, 63786, 0, 0, 63791, 63790, - 1145, 63788, 119143, 63785, 63784, 63783, 10192, 65267, 0, 0, 8928, 0, 0, - 0, 0, 0, 74216, 66805, 0, 0, 63759, 63758, 3523, 1074, 0, 121340, 74077, - 0, 0, 0, 63757, 43145, 63755, 63754, 63752, 1349, 63750, 63749, 0, 0, 0, - 63753, 63802, 41084, 72784, 0, 41930, 63805, 63804, 11140, 63801, 41082, - 43843, 42787, 123197, 0, 0, 0, 63793, 63792, 0, 128241, 10201, 12238, - 63795, 42358, 92394, 43862, 0, 0, 41932, 66826, 0, 0, 0, 121136, 0, 7950, - 63772, 63771, 63770, 0, 63767, 63766, 2793, 63764, 0, 128501, 63769, - 9530, 0, 92398, 0, 128642, 63763, 63762, 4595, 63760, 792, 0, 0, 0, 8742, - 0, 0, 0, 63744, 0, 0, 120815, 63748, 63747, 63746, 63745, 5055, 0, 0, - 1090, 0, 125268, 11665, 127809, 4558, 0, 72211, 0, 0, 0, 11513, 0, 6157, - 63775, 63774, 63773, 0, 12170, 9067, 0, 0, 10872, 129643, 43891, 43893, - 43892, 0, 43933, 0, 128231, 0, 0, 0, 0, 0, 11063, 0, 43888, 0, 0, 128368, - 43889, 0, 73807, 983104, 7386, 0, 0, 70295, 0, 0, 0, 71201, 128460, 0, 0, - 0, 0, 69915, 2918, 66820, 65300, 0, 127859, 64726, 2790, 0, 3793, 42065, - 127829, 0, 129560, 0, 0, 0, 0, 0, 92712, 0, 12923, 5270, 0, 0, 0, 65813, - 0, 128499, 0, 75012, 0, 10888, 0, 93997, 0, 3330, 129417, 0, 0, 0, 0, 0, - 8220, 0, 0, 0, 0, 1627, 0, 0, 0, 5371, 118938, 0, 1826, 118794, 0, 0, - 70023, 0, 0, 0, 71108, 0, 0, 0, 0, 92207, 68125, 74898, 101069, 0, 0, - 71098, 70029, 0, 43116, 0, 70019, 64346, 0, 0, 66818, 0, 70031, 0, 12666, - 120413, 120420, 120414, 120406, 120428, 0, 120431, 0, 65509, 0, 7449, 0, - 0, 0, 7438, 0, 0, 9054, 971, 0, 0, 0, 65195, 64767, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 64303, 0, 2303, 0, 0, 0, 0, 65833, 0, 7271, 0, 0, 0, 0, 12229, 0, - 0, 43411, 73751, 0, 64813, 0, 0, 10476, 0, 0, 3932, 64958, 0, 0, 73989, - 0, 0, 0, 113816, 0, 0, 0, 0, 0, 0, 92645, 65474, 4796, 118892, 129357, - 65479, 0, 42895, 0, 65500, 0, 9899, 92608, 0, 404, 65484, 120639, 0, - 5788, 127852, 0, 65491, 1831, 66020, 0, 983993, 92588, 0, 1343, 120784, - 0, 0, 12018, 0, 0, 0, 0, 0, 4422, 4708, 3799, 119358, 119357, 0, 120510, - 0, 119361, 119360, 983095, 0, 1364, 0, 8038, 0, 0, 12868, 0, 70425, - 55223, 0, 64414, 110689, 0, 0, 0, 0, 0, 0, 118802, 0, 42855, 118856, - 42866, 0, 0, 0, 0, 66438, 0, 983977, 119356, 119355, 119354, 0, 983580, - 0, 0, 67685, 128062, 119350, 0, 64512, 10404, 10340, 119352, 1556, 5274, - 0, 0, 10017, 9733, 0, 129476, 0, 41373, 0, 0, 0, 0, 0, 349, 4863, 41371, - 0, 0, 0, 0, 72295, 4398, 8543, 65618, 128018, 0, 0, 0, 0, 12441, 0, - 119348, 119347, 4318, 10452, 0, 8032, 0, 119349, 119344, 0, 127844, - 121156, 0, 110729, 119345, 8597, 0, 110727, 9864, 0, 0, 0, 0, 0, 0, 0, - 7722, 0, 0, 0, 0, 0, 66590, 0, 0, 0, 0, 0, 0, 4965, 0, 917536, 0, 123196, - 0, 0, 0, 10436, 119342, 43147, 119340, 10356, 10420, 982, 2756, 0, - 983978, 0, 0, 11162, 119338, 0, 92914, 0, 65110, 0, 0, 983781, 78543, 0, - 118793, 0, 128112, 119179, 64476, 1694, 8216, 0, 0, 78539, 0, 65620, 0, - 78537, 0, 0, 42158, 65621, 69955, 120324, 120327, 120326, 120321, 120320, - 120323, 120322, 12314, 65616, 55221, 43825, 983553, 119337, 68060, - 119335, 0, 71874, 123628, 128537, 119332, 73089, 0, 41347, 0, 0, 8842, 0, - 0, 4379, 127393, 12692, 0, 0, 66353, 71875, 0, 0, 92907, 0, 0, 71877, - 120303, 65619, 9872, 0, 0, 1846, 120309, 120308, 119256, 71192, 120305, - 120304, 120307, 6442, 120317, 120316, 5379, 120318, 110717, 120312, - 120315, 71876, 0, 65934, 66497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6151, + 11106, 940, 5787, 10099, 63938, 101269, 63897, 101271, 2994, 101265, + 101264, 101267, 101266, 77939, 77940, 77937, 77938, 74343, 93043, 72704, + 660, 10127, 666, 0, 5532, 43667, 5533, 77941, 0, 0, 0, 979, 0, 0, 72706, + 92652, 9108, 0, 128374, 129403, 63951, 71685, 0, 0, 128782, 63946, 1707, + 983824, 128612, 63950, 63949, 63948, 63947, 63945, 6038, 63943, 63942, + 101274, 0, 101276, 101275, 0, 0, 0, 0, 0, 0, 73884, 0, 1690, 63919, + 63918, 63917, 70865, 43659, 0, 983829, 0, 2054, 0, 78515, 63916, 9184, + 63914, 69737, 63911, 63910, 63909, 63908, 0, 0, 63913, 6044, 0, 0, 9061, + 5534, 10672, 11653, 124932, 5531, 101501, 101500, 101503, 101502, 0, 0, + 11957, 101498, 68668, 0, 0, 0, 10474, 43426, 0, 42354, 101492, 101491, + 101494, 101493, 101488, 8413, 66841, 101489, 7269, 7272, 0, 0, 101471, + 101470, 78460, 0, 101467, 101466, 101469, 101468, 0, 0, 0, 66840, 0, + 101465, 128441, 0, 101462, 101461, 92187, 7270, 101458, 101457, 6628, + 1076, 128700, 0, 101456, 0, 0, 0, 0, 12807, 43413, 63906, 4548, 63904, + 71187, 70393, 41729, 44005, 1307, 0, 101473, 101472, 0, 0, 128268, 0, + 8180, 0, 127778, 0, 0, 5413, 43681, 123205, 3493, 0, 0, 0, 92544, 73937, + 10517, 0, 4518, 10990, 101447, 5167, 4481, 3771, 101443, 2710, 0, 66277, + 0, 0, 43073, 0, 0, 0, 0, 0, 0, 119659, 1628, 0, 0, 0, 65262, 66809, + 10783, 11172, 0, 0, 70840, 113679, 0, 119029, 0, 0, 41530, 66843, 4457, + 0, 0, 0, 0, 0, 41529, 0, 0, 6031, 65807, 70814, 0, 101455, 71984, 69705, + 101452, 101451, 11926, 6033, 9656, 0, 0, 0, 68869, 0, 128930, 0, 128100, + 0, 42612, 43655, 0, 0, 0, 66468, 0, 0, 68623, 101423, 0, 0, 101420, + 101419, 101422, 101421, 0, 1151, 101418, 73709, 127544, 0, 71106, 0, 0, + 0, 0, 0, 101437, 101436, 11527, 101438, 0, 0, 11538, 101434, 0, 11020, 0, + 66467, 101432, 8087, 71700, 101433, 9894, 101427, 101430, 70824, 101424, + 0, 78513, 8053, 0, 0, 0, 0, 101407, 101406, 0, 63845, 101403, 101402, + 78602, 101404, 13084, 70170, 8741, 0, 0, 101401, 0, 64605, 83051, 101397, + 473, 43415, 101394, 101393, 101396, 1087, 124966, 71275, 101392, 0, + 66439, 43218, 0, 0, 7237, 101414, 101417, 101416, 71996, 101410, 92261, + 101412, 121036, 4384, 74220, 101408, 2058, 917561, 0, 129462, 0, 0, 0, + 3857, 0, 0, 0, 64630, 0, 0, 74168, 0, 125088, 4421, 0, 0, 101381, 66400, + 101383, 68431, 101377, 101376, 101379, 83053, 0, 0, 69640, 127861, 0, + 437, 0, 0, 0, 0, 65236, 13290, 119180, 4997, 64306, 0, 0, 4999, 0, 0, 0, + 4711, 120769, 0, 2739, 0, 92915, 74834, 0, 127175, 0, 0, 0, 0, 0, 1779, + 6600, 6601, 0, 5325, 101390, 101389, 13058, 101391, 101386, 0, 92186, + 101387, 71845, 10575, 43399, 0, 101385, 101384, 1104, 0, 0, 10655, 0, 0, + 0, 0, 1082, 110878, 0, 67401, 0, 0, 0, 0, 6783, 0, 0, 42867, 69655, + 44021, 6458, 0, 0, 0, 0, 0, 0, 1273, 43407, 0, 0, 0, 0, 1313, 6322, + 41720, 128627, 66433, 0, 0, 0, 11216, 0, 0, 0, 43437, 93833, 0, 0, 0, + 5122, 0, 72728, 129520, 70161, 0, 0, 0, 0, 0, 8303, 0, 128926, 0, 10003, + 0, 0, 0, 1686, 0, 0, 42834, 3664, 0, 126088, 121346, 0, 0, 4324, 126, 0, + 0, 0, 0, 0, 65166, 0, 0, 0, 0, 43817, 0, 43822, 0, 0, 65600, 13002, 0, 0, + 0, 1103, 0, 119575, 129452, 0, 13078, 0, 8116, 0, 2050, 0, 0, 1102, 0, + 6555, 0, 0, 74003, 74794, 0, 0, 42591, 127278, 0, 1111, 0, 75047, 4707, + 0, 0, 0, 0, 43468, 4522, 8645, 0, 74857, 0, 11352, 0, 0, 0, 2293, 0, 0, + 0, 128265, 71709, 0, 0, 0, 93827, 0, 0, 0, 128488, 0, 160, 2677, 0, 0, + 120141, 0, 0, 70790, 0, 42770, 0, 71986, 0, 43821, 113769, 0, 0, 43816, + 0, 0, 1079, 3867, 64817, 0, 0, 0, 0, 64768, 0, 0, 4005, 983211, 0, 10991, + 0, 92957, 917578, 917581, 917580, 917575, 128314, 917577, 917576, 917571, + 78534, 917573, 917572, 0, 0, 128359, 73458, 0, 3339, 11448, 1106, 917591, + 917590, 917593, 3340, 917587, 917586, 917589, 917588, 917583, 10605, + 1309, 74996, 120743, 92650, 0, 0, 9485, 0, 0, 0, 0, 0, 125002, 92533, + 128487, 0, 129285, 4338, 11238, 0, 66825, 0, 0, 0, 0, 0, 0, 74128, 0, 0, + 73680, 0, 129438, 9553, 1590, 63777, 63776, 128677, 63782, 63781, 63780, + 63779, 1583, 101525, 101528, 101527, 101522, 101521, 101524, 101523, + 41522, 0, 92168, 983784, 66759, 0, 983580, 0, 0, 0, 0, 11394, 0, 983071, + 0, 66823, 1334, 0, 4479, 0, 0, 120663, 0, 122883, 10497, 0, 0, 983777, + 66828, 0, 0, 0, 6809, 63786, 0, 0, 63791, 63790, 1145, 63788, 101535, + 63785, 63784, 63783, 10192, 65267, 101533, 101532, 8928, 0, 0, 0, 0, 0, + 74216, 66805, 0, 0, 63759, 63758, 3523, 1074, 0, 121340, 74077, 0, 0, 0, + 63757, 43145, 63755, 63754, 63752, 1349, 63750, 63749, 0, 0, 0, 63753, + 63802, 41084, 72784, 0, 41930, 63805, 63804, 11140, 63801, 41082, 43843, + 42787, 101514, 0, 101516, 101515, 63793, 63792, 0, 128241, 10201, 12238, + 63795, 42358, 92394, 43862, 101511, 101510, 41932, 66826, 101507, 101506, + 0, 121136, 0, 7950, 63772, 63771, 63770, 0, 63767, 63766, 2793, 63764, 0, + 128501, 63769, 9530, 0, 92398, 0, 128642, 63763, 63762, 4595, 63760, 792, + 0, 0, 0, 8742, 0, 0, 0, 63744, 0, 0, 120815, 63748, 63747, 63746, 63745, + 5055, 0, 0, 1090, 0, 125268, 11665, 127809, 4558, 0, 72211, 0, 0, 0, + 11513, 0, 6157, 63775, 63774, 63773, 0, 12170, 9067, 0, 0, 10872, 129643, + 43891, 43893, 43892, 129747, 43933, 0, 128231, 0, 0, 0, 0, 0, 11063, 0, + 43888, 0, 0, 128368, 43889, 0, 73807, 983104, 7386, 0, 0, 70295, 0, 0, 0, + 71201, 128460, 0, 0, 0, 0, 69915, 2918, 66820, 65300, 0, 127859, 64726, + 2790, 0, 3793, 42065, 127829, 0, 129560, 0, 0, 0, 0, 0, 92712, 0, 12923, + 5270, 0, 0, 0, 65813, 0, 128499, 0, 75012, 0, 10888, 0, 93997, 94180, + 3330, 129417, 0, 0, 0, 0, 0, 8220, 0, 0, 101581, 101580, 1627, 101582, 0, + 0, 5371, 101578, 0, 1826, 118794, 0, 0, 70023, 0, 0, 0, 71108, 0, 0, 0, + 0, 92207, 68125, 74898, 101069, 0, 72006, 71098, 70029, 0, 43116, 101589, + 70019, 64346, 0, 101585, 66818, 101587, 70031, 0, 12666, 120413, 120420, + 120414, 101567, 120428, 0, 101564, 101563, 65509, 101565, 7449, 0, + 101562, 0, 7438, 0, 0, 9054, 971, 101558, 101561, 101560, 65195, 64767, + 101557, 101556, 0, 0, 101553, 101552, 0, 0, 0, 64303, 101576, 2303, 0, + 101577, 101572, 101571, 65833, 101573, 7271, 0, 101570, 101569, 0, 12229, + 0, 0, 43411, 73751, 0, 64813, 0, 0, 10476, 0, 0, 3932, 64958, 0, 0, + 73989, 0, 0, 101542, 101541, 101544, 101543, 101538, 101537, 101540, + 101539, 92645, 65474, 4796, 118892, 129357, 65479, 0, 42895, 11858, + 65500, 0, 9899, 92608, 0, 404, 65484, 120639, 0, 5788, 127852, 0, 65491, + 1831, 66020, 0, 983993, 92588, 0, 1343, 120784, 0, 0, 12018, 0, 0, 0, 0, + 0, 4422, 4708, 3799, 101550, 119357, 0, 101547, 101546, 101549, 101548, + 983095, 0, 1364, 0, 8038, 101545, 0, 12868, 0, 70425, 55223, 0, 64414, + 110689, 0, 0, 0, 0, 0, 0, 118802, 0, 42855, 118856, 42866, 0, 0, 0, 0, + 66438, 0, 983977, 119356, 119355, 119354, 0, 983576, 0, 73013, 67685, + 128062, 119350, 0, 64512, 10404, 10340, 119352, 1556, 5274, 0, 127821, + 10017, 9733, 0, 129476, 0, 41373, 0, 0, 0, 0, 0, 349, 4863, 41371, 0, 0, + 0, 0, 72295, 4398, 8543, 65618, 128018, 0, 0, 0, 0, 12441, 0, 119348, + 119347, 4318, 10452, 0, 8032, 0, 119349, 119344, 0, 127844, 121156, 0, + 110729, 119345, 8597, 0, 110727, 9864, 0, 0, 0, 0, 0, 0, 0, 7722, 0, 0, + 0, 0, 0, 66590, 0, 0, 129850, 0, 0, 0, 4965, 0, 917536, 0, 123196, 0, 0, + 0, 10436, 119342, 43147, 119340, 10356, 10420, 982, 2756, 0, 983978, 0, + 0, 11162, 119338, 0, 92914, 0, 65110, 0, 0, 983781, 78543, 0, 118793, 0, + 128112, 119179, 64476, 1694, 8216, 0, 0, 78539, 0, 65620, 0, 78537, 0, 0, + 42158, 65621, 69955, 120324, 120327, 120326, 120321, 120320, 120323, + 120322, 12314, 65616, 55221, 43825, 983553, 119337, 68060, 119335, 0, + 71874, 123628, 128537, 119332, 73089, 0, 41347, 0, 0, 8842, 0, 0, 4379, + 127393, 12692, 0, 0, 66353, 71875, 0, 0, 92907, 0, 0, 71877, 120303, + 65619, 9872, 0, 0, 1846, 120309, 120308, 119256, 71192, 120305, 120304, + 120307, 6442, 120317, 120316, 5379, 120318, 110717, 120312, 120315, + 71876, 0, 65934, 66497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72002, 0, 6151, 12110, 0, 0, 0, 0, 0, 0, 0, 0, 68335, 0, 0, 0, 0, 0, 0, 66041, 9676, 10202, 0, 0, 0, 64575, 126637, 11965, 0, 124936, 0, 0, 0, 0, 0, 9698, 66293, 0, 119651, 0, 0, 41921, 0, 0, 0, 119258, 0, 0, 0, 0, 0, 8012, 12355, 12353, 0, 0, 74107, 0, 0, 41925, 0, 41920, 65444, 0, 0, 41923, 12694, 0, 10112, 1294, 0, 120091, 0, 120092, 0, 0, 128474, 121400, 0, 0, 0, 8718, 0, 10284, 10268, 10380, 10316, 92593, 0, 71850, 0, 0, 92889, 0, - 0, 0, 0, 9342, 12829, 0, 0, 0, 127978, 0, 0, 69428, 0, 73767, 72347, 0, - 7956, 598, 0, 72329, 93837, 0, 0, 128860, 0, 120041, 0, 0, 0, 0, 0, 847, - 0, 9529, 0, 0, 0, 0, 120035, 0, 0, 0, 67411, 0, 0, 0, 120040, 0, 128580, - 0, 9624, 0, 0, 0, 65463, 1554, 0, 0, 0, 0, 71879, 0, 0, 0, 121161, 19963, - 123625, 0, 72326, 92933, 71887, 10324, 10292, 65546, 0, 68141, 8372, 0, - 0, 83018, 120022, 10175, 10388, 42799, 0, 983180, 10568, 0, 127400, 0, 0, - 0, 983743, 0, 4366, 0, 983786, 0, 0, 42608, 0, 9884, 0, 0, 0, 0, 129180, - 0, 0, 0, 0, 1609, 0, 92773, 73448, 0, 11661, 0, 5818, 0, 0, 0, 9540, 0, - 2554, 5158, 0, 2213, 0, 0, 78522, 43079, 0, 0, 8264, 11175, 64553, - 120863, 42155, 0, 0, 0, 0, 0, 0, 8676, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, - 123167, 43609, 0, 0, 1440, 0, 0, 0, 127061, 11005, 0, 66656, 127063, 0, - 0, 0, 127065, 43393, 0, 120643, 0, 0, 0, 0, 120798, 0, 0, 0, 0, 0, 0, - 70435, 64356, 0, 0, 0, 383, 7154, 127815, 43495, 128809, 121448, 0, 0, 0, - 11286, 0, 0, 0, 0, 0, 0, 0, 42644, 0, 0, 0, 8292, 0, 4980, 113726, 92674, - 70130, 0, 0, 0, 0, 74912, 0, 10631, 83330, 100488, 68042, 0, 0, 7900, 0, - 0, 78779, 4198, 128555, 0, 0, 0, 123159, 0, 0, 12931, 0, 0, 0, 2088, 0, - 72164, 129284, 0, 0, 124951, 0, 0, 0, 69694, 0, 0, 8593, 0, 0, 0, 0, 0, + 0, 0, 0, 9342, 12829, 0, 0, 101239, 127978, 0, 0, 69428, 0, 73767, 72347, + 0, 7956, 598, 0, 72329, 93837, 0, 0, 128860, 0, 120041, 0, 0, 101242, 0, + 0, 847, 0, 9529, 0, 0, 0, 101247, 120035, 0, 0, 0, 67411, 0, 0, 0, + 120040, 0, 128580, 0, 9624, 0, 0, 0, 65463, 1554, 0, 0, 0, 0, 71879, 0, + 0, 0, 121161, 19963, 123625, 0, 72326, 92933, 71887, 10324, 10292, 65546, + 0, 68141, 8372, 0, 0, 83018, 120022, 10175, 10388, 42799, 0, 983180, + 10568, 0, 127400, 0, 0, 0, 983743, 0, 4366, 0, 983786, 0, 0, 42608, 0, + 9884, 0, 0, 0, 0, 129180, 0, 0, 0, 0, 1609, 0, 92773, 73448, 0, 11661, 0, + 5818, 0, 0, 0, 9540, 0, 2554, 5158, 0, 2213, 0, 0, 78522, 43079, 0, 0, + 8264, 11175, 64553, 120863, 42155, 0, 0, 0, 0, 0, 69552, 8676, 0, 129927, + 0, 451, 0, 0, 0, 0, 0, 0, 123167, 43609, 0, 0, 1440, 0, 0, 0, 127061, + 11005, 0, 66656, 127063, 0, 129936, 0, 127065, 43393, 0, 120643, 0, 0, 0, + 0, 120798, 0, 0, 0, 0, 0, 0, 70435, 64356, 0, 0, 0, 383, 7154, 127815, + 43495, 128809, 121448, 0, 0, 0, 11286, 0, 0, 0, 0, 0, 0, 0, 42644, + 129824, 129797, 129801, 8292, 0, 4980, 113726, 92674, 70130, 0, 0, 0, 0, + 74912, 0, 10631, 83330, 100488, 68042, 0, 0, 7900, 101252, 0, 78779, + 4198, 128555, 0, 0, 0, 123159, 0, 0, 12931, 0, 0, 0, 2088, 0, 72164, + 129284, 0, 0, 69265, 0, 0, 0, 69694, 129808, 129794, 8593, 0, 0, 0, 0, 0, 0, 11798, 0, 100483, 0, 0, 0, 64211, 128865, 120494, 0, 0, 0, 121228, 68901, 128788, 0, 0, 65162, 0, 0, 0, 0, 0, 128130, 0, 92264, 127153, 0, - 128818, 0, 0, 61, 0, 0, 92182, 119554, 0, 0, 12089, 0, 65834, 83281, + 128818, 0, 0, 61, 0, 74373, 92182, 119554, 0, 0, 12089, 0, 65834, 83281, 119671, 128701, 0, 0, 42566, 42743, 0, 69824, 0, 92653, 0, 0, 42621, 0, 0, 0, 0, 0, 43266, 0, 0, 0, 74843, 0, 0, 119103, 64417, 0, 0, 64737, 0, 0, 8930, 0, 0, 66900, 10056, 1800, 0, 0, 0, 0, 121175, 7743, 0, 0, 119528, 92640, 92453, 9034, 6039, 129139, 10075, 0, 0, 0, 10748, 0, 0, 0, 0, 0, 92984, 0, 0, 128183, 129421, 0, 43064, 127558, 0, 7539, 0, 0, 0, 0, - 0, 0, 0, 92898, 42567, 0, 0, 73886, 0, 0, 12326, 0, 0, 0, 0, 11355, 0, 0, - 0, 0, 69437, 0, 0, 0, 119537, 72327, 43005, 65342, 118902, 0, 0, 8644, 0, - 0, 11186, 74296, 41909, 0, 128682, 2791, 0, 1891, 0, 0, 41907, 66647, 0, - 0, 41906, 0, 0, 10773, 70206, 0, 0, 0, 6412, 2061, 8520, 13146, 0, 0, - 83275, 65902, 2882, 0, 126232, 65852, 0, 983306, 0, 123627, 0, 0, 0, 0, - 0, 128098, 0, 0, 0, 70871, 0, 0, 0, 120087, 0, 0, 0, 93971, 0, 3844, - 6842, 0, 0, 6612, 0, 0, 0, 0, 0, 783, 0, 0, 0, 983064, 68032, 119225, 0, - 0, 68378, 4556, 67839, 68480, 78663, 120069, 120074, 67657, 10510, 4382, - 74218, 42194, 0, 0, 9177, 8902, 93958, 9839, 0, 120700, 0, 0, 63999, - 41904, 41917, 9788, 120973, 0, 1862, 0, 0, 0, 41915, 0, 41919, 63994, - 41914, 7981, 0, 0, 0, 0, 0, 0, 0, 120834, 0, 0, 0, 6784, 78788, 0, 0, 0, - 0, 127534, 127484, 127476, 0, 0, 983941, 64289, 65289, 0, 129539, 129575, - 64509, 0, 0, 126505, 11051, 0, 66635, 55259, 65885, 0, 128310, 0, 0, 0, - 0, 7500, 4506, 0, 0, 0, 0, 0, 126609, 4040, 128680, 6167, 0, 0, 0, 0, 0, - 0, 7830, 43036, 0, 0, 63990, 19947, 63988, 63987, 0, 63993, 10440, 9611, - 0, 71883, 0, 65260, 63986, 11446, 63984, 92641, 3435, 119652, 0, 119108, - 0, 128632, 0, 0, 12748, 0, 0, 92705, 0, 78790, 0, 0, 63956, 42458, 63954, - 63953, 63960, 63959, 63958, 11596, 0, 11469, 70025, 42306, 2723, 0, 0, - 70027, 0, 0, 0, 128093, 2880, 0, 0, 0, 0, 128506, 3498, 4378, 0, 0, 0, - 65551, 118928, 0, 43387, 0, 64415, 128898, 0, 0, 0, 0, 8161, 393, 12013, - 0, 92216, 126479, 63965, 63964, 63963, 42345, 0, 0, 63967, 42498, 0, - 2927, 0, 63961, 0, 0, 983927, 0, 69699, 0, 42340, 0, 0, 0, 10730, 0, - 69688, 0, 64187, 0, 0, 12437, 9813, 0, 42453, 1604, 9565, 0, 69701, - 69235, 42414, 110724, 129196, 0, 42301, 11372, 0, 917973, 0, 0, 63980, - 63979, 63978, 0, 128207, 12017, 63982, 63981, 73687, 0, 63977, 63976, - 72794, 0, 0, 0, 63971, 4347, 4416, 63968, 11009, 63974, 63973, 402, - 69390, 13147, 0, 0, 64646, 13228, 0, 0, 3515, 74252, 65261, 0, 0, 6259, - 0, 0, 0, 0, 0, 0, 74813, 74425, 0, 126998, 126114, 0, 0, 0, 0, 983698, 0, - 0, 74301, 0, 0, 0, 0, 74060, 0, 0, 66235, 5145, 0, 0, 128394, 0, 73120, - 0, 7402, 0, 0, 0, 7952, 7832, 43382, 66616, 0, 983931, 120852, 0, 127875, - 64866, 0, 0, 0, 78784, 74248, 0, 0, 983196, 0, 0, 0, 78656, 42390, 0, 0, - 983921, 0, 0, 0, 0, 9508, 0, 9544, 11520, 0, 0, 3377, 0, 129562, 0, 0, 0, - 0, 0, 66280, 0, 127198, 0, 0, 0, 1955, 119565, 0, 0, 3076, 0, 42168, - 73049, 66304, 0, 0, 8917, 42403, 301, 0, 0, 0, 0, 0, 0, 0, 0, 67819, - 92987, 0, 0, 0, 983204, 0, 69403, 3182, 0, 0, 0, 0, 0, 42169, 123162, - 74244, 0, 42329, 0, 66326, 6841, 0, 128913, 0, 1219, 3934, 71276, 11483, - 74510, 0, 0, 42442, 65470, 0, 0, 64622, 7759, 42482, 485, 0, 0, 42290, 0, - 0, 42280, 0, 0, 11655, 64379, 127913, 42431, 10126, 42318, 0, 119631, - 74397, 42470, 0, 68315, 0, 110829, 74041, 0, 0, 0, 5411, 0, 0, 0, 64205, - 0, 64206, 42393, 64478, 1310, 125007, 0, 12052, 10643, 55271, 72727, 0, - 121045, 0, 0, 118852, 0, 0, 0, 0, 113826, 0, 0, 64385, 0, 0, 0, 0, 0, 0, - 93848, 92560, 2713, 0, 9650, 0, 0, 120602, 1406, 0, 78174, 92659, 0, - 68223, 0, 0, 0, 0, 43475, 0, 65287, 1508, 127938, 8779, 10569, 75034, 0, - 0, 0, 0, 0, 0, 0, 70786, 0, 0, 128344, 9185, 0, 42932, 43403, 0, 0, 0, 0, - 0, 0, 0, 0, 12955, 0, 2888, 0, 0, 0, 0, 0, 0, 0, 2878, 0, 0, 0, 0, 0, 0, - 129028, 13203, 0, 10429, 10365, 0, 0, 127165, 7503, 0, 113676, 68381, - 119658, 0, 8986, 0, 10632, 11934, 11452, 1332, 0, 0, 0, 0, 73741, 1791, - 8850, 9288, 0, 2892, 0, 43394, 555, 0, 0, 0, 0, 64172, 118899, 0, 0, 0, - 0, 8854, 0, 5858, 73101, 10582, 0, 0, 1361, 0, 0, 7905, 0, 65256, 0, - 41210, 0, 0, 71884, 0, 0, 0, 6828, 0, 92302, 0, 1342, 68440, 0, 64161, - 10903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64381, 0, 0, 0, 42245, 126467, - 41972, 0, 0, 0, 9127, 0, 66619, 126489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11620, - 0, 1149, 68316, 0, 0, 0, 0, 0, 92492, 0, 118784, 0, 0, 0, 12838, 0, - 118819, 0, 0, 0, 0, 41087, 0, 0, 0, 0, 12036, 0, 0, 0, 0, 0, 64428, - 12227, 0, 0, 0, 0, 125248, 120964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1743, - 0, 0, 0, 65186, 0, 0, 0, 0, 0, 64439, 0, 68062, 0, 111259, 111258, 43866, - 0, 111263, 3395, 9362, 111260, 0, 111257, 111256, 111255, 0, 0, 41091, - 3426, 1344, 111249, 111248, 126215, 4735, 11111, 6119, 111251, 42699, 0, - 0, 74818, 1423, 0, 0, 0, 0, 12039, 10559, 0, 0, 0, 9472, 67734, 11929, 0, - 0, 0, 0, 128826, 0, 11579, 0, 0, 128364, 0, 92185, 0, 0, 1004, 92584, 0, - 0, 0, 0, 0, 2556, 0, 0, 72790, 0, 0, 9686, 0, 0, 0, 70109, 111102, 0, - 10718, 13154, 111100, 9139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41708, 12860, - 41703, 0, 42090, 5403, 10352, 73917, 129144, 111096, 0, 5140, 3753, - 118785, 41704, 0, 43078, 127789, 111092, 129360, 0, 983205, 92362, 0, 0, - 2410, 92525, 0, 0, 0, 0, 0, 0, 0, 0, 119253, 0, 126601, 0, 2066, 74199, - 0, 43463, 10659, 119623, 68863, 0, 1336, 0, 0, 69463, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 983946, 128133, 0, 0, 124940, 0, 1190, - 42146, 1335, 42177, 43867, 0, 0, 10448, 0, 125041, 0, 0, 2099, 5120, - 2409, 7799, 0, 74424, 0, 126581, 4731, 0, 111199, 111198, 111197, 111196, - 11689, 0, 74977, 9913, 129430, 0, 0, 0, 111195, 111194, 11694, 0, 11690, - 111189, 111188, 111187, 11693, 111193, 111192, 43097, 11688, 0, 78797, - 194, 111186, 111185, 111184, 0, 0, 0, 11226, 4519, 70337, 10898, 43072, - 70205, 0, 0, 0, 73094, 10695, 0, 7540, 0, 110984, 41859, 6067, 0, 0, 0, - 110981, 13311, 0, 41857, 0, 8359, 121224, 12689, 0, 983131, 64577, - 111204, 111203, 68183, 111209, 111208, 6064, 110988, 0, 110979, 74142, 0, - 111201, 111200, 6051, 123613, 0, 0, 983369, 0, 0, 0, 0, 0, 110864, 10537, - 110862, 1276, 0, 6549, 6052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1960, 0, 71232, - 66297, 0, 129313, 0, 0, 1345, 111213, 111212, 111211, 8956, 43083, 0, - 111215, 64682, 0, 6430, 0, 111210, 119814, 0, 0, 0, 119817, 0, 492, - 43087, 0, 0, 0, 0, 0, 2582, 0, 0, 7444, 72863, 0, 2297, 111243, 73837, 0, - 0, 65096, 197, 74183, 0, 71125, 111241, 111240, 0, 66515, 43550, 119829, - 111229, 111228, 93764, 111226, 0, 0, 111231, 111230, 71686, 1799, 0, - 42148, 74336, 0, 0, 65340, 111220, 110974, 2262, 111217, 111224, 74931, - 111222, 10896, 0, 0, 0, 0, 6338, 111003, 110997, 110994, 111006, 111002, - 111005, 0, 111279, 111278, 111277, 72133, 0, 111273, 111272, 110961, - 3171, 6623, 4961, 0, 886, 55216, 8654, 0, 111270, 74390, 64603, 111267, - 129283, 68122, 0, 43084, 0, 0, 0, 0, 69693, 8994, 10944, 65938, 111239, - 111238, 111237, 111236, 66279, 92890, 42510, 0, 0, 6804, 0, 1947, 0, 0, - 0, 42759, 0, 1705, 983345, 0, 0, 0, 0, 72722, 74036, 0, 0, 66720, 111281, - 111280, 0, 4909, 111285, 111284, 111283, 4904, 0, 43503, 1365, 9253, - 42757, 0, 7462, 0, 0, 0, 0, 119587, 0, 917579, 92526, 0, 125035, 0, - 111311, 111310, 0, 0, 0, 0, 93977, 0, 0, 0, 0, 3629, 0, 13005, 0, 3628, - 0, 111295, 0, 0, 0, 0, 111290, 64809, 2928, 4905, 111083, 851, 55233, - 111291, 111059, 43086, 9114, 43870, 42583, 9315, 4822, 4906, 121097, - 2847, 111028, 10330, 0, 1251, 7777, 41852, 125059, 111327, 111032, - 111325, 12646, 0, 10259, 0, 65821, 75046, 6018, 0, 111324, 111323, - 111322, 68372, 111319, 111318, 71893, 2558, 0, 64584, 111321, 111320, 0, - 0, 0, 0, 111309, 111308, 111307, 111306, 73987, 74599, 71895, 93012, 0, - 128715, 0, 12867, 111296, 0, 0, 11044, 111300, 111299, 8904, 11824, - 65857, 0, 128674, 129027, 4387, 0, 0, 0, 0, 0, 0, 0, 11842, 0, 0, 0, - 5136, 1968, 983041, 126627, 1337, 0, 0, 0, 0, 66506, 0, 0, 0, 0, 42314, - 121384, 0, 0, 6120, 0, 65670, 68128, 0, 43082, 6016, 0, 42284, 71894, - 4276, 111314, 3619, 41638, 69691, 0, 42322, 8853, 111043, 0, 490, 0, - 13231, 68384, 72310, 65350, 0, 0, 0, 68245, 42435, 6154, 0, 65354, 0, 0, - 42397, 334, 72732, 42416, 65359, 65273, 74634, 128227, 4442, 10364, 0, - 778, 41626, 42455, 7989, 0, 3227, 69907, 111053, 0, 2915, 11502, 983212, - 41702, 10309, 0, 0, 0, 0, 0, 0, 0, 127268, 127258, 127267, 65215, 64410, - 127260, 71175, 0, 0, 0, 0, 0, 0, 41700, 110651, 0, 126488, 0, 0, 42495, - 0, 0, 0, 10460, 43364, 0, 1356, 3728, 42713, 0, 0, 42342, 10914, 0, - 42489, 64310, 66896, 41861, 42297, 0, 0, 41860, 64862, 0, 0, 5289, 42336, - 128658, 0, 92529, 42410, 0, 120624, 0, 2649, 74493, 0, 126635, 0, 3382, - 42449, 9081, 1658, 11936, 93019, 113814, 11269, 0, 0, 43100, 69888, - 65508, 0, 0, 121451, 0, 0, 0, 0, 0, 4732, 128283, 0, 0, 0, 121113, 2236, - 126551, 0, 6048, 0, 0, 73965, 0, 0, 0, 0, 10151, 9681, 4475, 0, 64735, - 2100, 0, 0, 6035, 0, 123599, 10296, 0, 0, 0, 0, 0, 0, 0, 983307, 68488, - 10392, 10328, 0, 43462, 0, 0, 0, 8979, 0, 0, 983304, 0, 0, 0, 10977, 0, - 10344, 0, 65299, 10408, 0, 0, 121187, 66505, 0, 0, 0, 0, 0, 0, 43074, - 73799, 0, 0, 0, 0, 3446, 0, 0, 128692, 0, 0, 119582, 4474, 0, 43093, - 6282, 0, 0, 127372, 0, 0, 0, 0, 0, 0, 0, 0, 66910, 67811, 92277, 0, - 64948, 0, 74347, 0, 0, 0, 983962, 8194, 0, 121165, 11010, 0, 8893, 0, - 983969, 0, 0, 0, 983317, 7925, 0, 0, 113825, 0, 1352, 11069, 7707, 0, - 126486, 0, 0, 0, 0, 65605, 6040, 0, 10071, 0, 128156, 43750, 0, 8899, - 69873, 0, 0, 983311, 128208, 7820, 69615, 0, 0, 7746, 1492, 0, 0, 0, - 66866, 0, 11788, 65913, 0, 0, 43095, 0, 0, 92265, 2999, 0, 120720, 0, - 371, 0, 6023, 0, 0, 11708, 0, 0, 6323, 0, 0, 0, 8938, 6043, 65866, 0, 0, - 0, 72419, 0, 129480, 2589, 74332, 1689, 7802, 0, 0, 0, 0, 66704, 0, 0, 0, - 0, 128127, 6049, 0, 4027, 0, 0, 111334, 111333, 1503, 111331, 0, 111337, - 11951, 111335, 2387, 0, 0, 8289, 111330, 7326, 66514, 65514, 0, 64865, 0, - 9668, 0, 0, 0, 0, 93060, 6036, 92768, 4026, 74089, 127091, 0, 0, 75044, - 110821, 0, 110819, 0, 0, 0, 0, 6021, 0, 128288, 0, 43155, 0, 110822, 0, - 111343, 42691, 111341, 111340, 0, 166, 0, 0, 0, 10623, 408, 0, 111339, - 13298, 0, 7426, 43694, 0, 0, 8811, 0, 0, 0, 0, 0, 74134, 983054, 0, - 127811, 0, 0, 0, 6645, 646, 128813, 0, 42129, 0, 120880, 0, 8697, 0, - 120936, 0, 0, 0, 0, 5809, 1950, 0, 92432, 68339, 0, 42136, 0, 0, 0, 0, 0, - 0, 111354, 983965, 0, 0, 111349, 111348, 43330, 111346, 111353, 111352, - 41567, 111350, 0, 0, 0, 0, 111345, 111344, 8285, 0, 4509, 0, 128361, 0, - 0, 0, 0, 0, 41727, 0, 0, 0, 0, 0, 0, 0, 74512, 7027, 3886, 0, 74023, + 0, 0, 0, 92898, 42567, 0, 0, 73886, 0, 129988, 12326, 0, 0, 0, 0, 11355, + 0, 0, 0, 0, 69437, 0, 129803, 129811, 119537, 72327, 43005, 65342, + 118902, 0, 0, 8644, 0, 0, 11186, 74296, 41909, 0, 128682, 2791, 0, 1891, + 0, 0, 41907, 66647, 0, 0, 41906, 0, 0, 10773, 70206, 0, 0, 0, 6412, 2061, + 8520, 13146, 0, 0, 83275, 65902, 2882, 0, 126232, 65852, 0, 983306, 0, + 123627, 0, 0, 0, 0, 0, 128098, 0, 0, 0, 70871, 0, 0, 0, 120087, 0, 0, 0, + 93971, 0, 3844, 6842, 0, 0, 6612, 0, 0, 0, 0, 0, 783, 0, 0, 0, 983064, + 68032, 119225, 0, 0, 68378, 4556, 67839, 68480, 78663, 120069, 120074, + 67657, 10510, 4382, 74218, 42194, 0, 0, 9177, 8902, 93958, 9839, 0, + 120700, 0, 0, 63999, 41904, 41917, 9788, 120973, 0, 1862, 0, 0, 0, 41915, + 0, 41919, 63994, 41914, 7981, 0, 0, 0, 0, 0, 0, 0, 120834, 0, 0, 0, 6784, + 78788, 0, 0, 0, 0, 127534, 127484, 127476, 0, 0, 983941, 64289, 65289, 0, + 129539, 129575, 64509, 0, 0, 126505, 11051, 0, 66635, 55259, 65885, 0, + 128310, 0, 0, 0, 0, 7500, 4506, 0, 0, 0, 0, 0, 126609, 4040, 128680, + 6167, 0, 0, 0, 0, 0, 0, 7830, 43036, 0, 0, 63990, 19947, 63988, 63987, 0, + 63993, 10440, 9611, 2244, 71883, 0, 65260, 63986, 11446, 63984, 92641, + 3435, 119652, 0, 119108, 0, 128632, 0, 0, 12748, 0, 0, 92705, 0, 78790, + 0, 0, 63956, 42458, 63954, 63953, 63960, 63959, 63958, 11596, 0, 11469, + 69267, 42306, 2723, 0, 0, 70027, 0, 0, 0, 128093, 2880, 0, 0, 0, 0, + 128506, 3498, 4378, 0, 129825, 0, 65551, 118928, 0, 43387, 0, 64415, + 128898, 0, 0, 0, 0, 8161, 393, 12013, 0, 92216, 126479, 63965, 63964, + 63963, 42345, 0, 0, 63967, 42498, 0, 2927, 0, 63961, 0, 0, 983927, 0, + 69699, 0, 42340, 0, 0, 0, 10730, 0, 69688, 0, 64187, 0, 0, 12437, 9813, + 0, 42453, 1604, 9565, 0, 69701, 69235, 42414, 110724, 129196, 0, 42301, + 11372, 0, 917973, 0, 0, 63980, 63979, 63978, 0, 128207, 12017, 63982, + 63981, 73687, 0, 63977, 63976, 72794, 0, 0, 0, 63971, 4347, 4416, 63968, + 11009, 63974, 63973, 402, 69390, 13147, 0, 0, 64646, 13228, 0, 0, 3515, + 74252, 65261, 0, 0, 6259, 0, 0, 0, 0, 0, 0, 74813, 74425, 0, 126998, + 126114, 0, 0, 0, 129933, 983698, 0, 0, 74301, 0, 0, 0, 0, 74060, 0, 0, + 66235, 5145, 0, 0, 128394, 0, 73120, 0, 7402, 0, 0, 0, 7952, 7832, 43382, + 66616, 0, 983931, 120852, 0, 127875, 64866, 0, 0, 0, 78784, 74248, 0, 0, + 983196, 0, 0, 0, 78656, 42390, 0, 0, 983921, 0, 0, 0, 0, 9508, 0, 9544, + 11520, 0, 0, 3377, 0, 129562, 0, 0, 0, 0, 0, 66280, 0, 127198, 0, 0, 0, + 1955, 119565, 0, 0, 3076, 0, 42168, 73049, 66304, 0, 0, 8917, 42403, 301, + 0, 0, 0, 0, 0, 0, 0, 0, 67819, 92987, 0, 0, 0, 983204, 0, 69403, 3182, 0, + 0, 0, 0, 0, 42169, 123162, 74244, 0, 42329, 0, 66326, 6841, 0, 128913, 0, + 1219, 3934, 71276, 11483, 74510, 101122, 0, 42442, 65470, 69565, 0, + 64622, 7759, 42482, 485, 0, 0, 42290, 0, 0, 42280, 0, 0, 11655, 64379, + 127913, 42431, 10126, 42318, 0, 119631, 74397, 42470, 0, 68315, 0, + 110829, 74041, 0, 0, 0, 5411, 0, 0, 0, 64205, 0, 64206, 42393, 64478, + 1310, 125007, 0, 12052, 10643, 55271, 72727, 0, 121045, 0, 0, 118852, 0, + 0, 0, 0, 113826, 0, 0, 64385, 0, 0, 0, 0, 0, 0, 93848, 92560, 2713, 0, + 9650, 0, 0, 120602, 1406, 0, 78174, 92659, 0, 68223, 0, 0, 0, 0, 43475, + 0, 65287, 1508, 127938, 8779, 10569, 75034, 0, 0, 0, 0, 0, 0, 0, 70786, + 0, 0, 128344, 9185, 0, 42932, 43403, 0, 0, 0, 0, 0, 0, 0, 0, 12955, 0, + 2888, 0, 0, 0, 0, 0, 0, 0, 2878, 0, 0, 0, 0, 0, 0, 129028, 13203, 0, + 10429, 10365, 0, 0, 127165, 7503, 0, 113676, 68381, 119658, 0, 8986, 0, + 10632, 11934, 11452, 1332, 0, 0, 0, 0, 73741, 1791, 8850, 9288, 0, 2892, + 0, 43394, 555, 0, 0, 0, 0, 64172, 118899, 0, 0, 0, 0, 8854, 0, 5858, + 73101, 10582, 0, 0, 1361, 0, 0, 7905, 0, 65256, 0, 41210, 0, 0, 71884, 0, + 0, 0, 6828, 0, 92302, 0, 1342, 68440, 0, 64161, 10903, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 64381, 0, 0, 0, 42245, 126467, 41972, 0, 0, 0, 9127, 0, + 66619, 126489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11620, 0, 1149, 68316, 0, 0, 0, + 0, 0, 92492, 0, 118784, 0, 0, 0, 12838, 0, 118819, 0, 0, 0, 0, 41087, 0, + 0, 0, 0, 12036, 0, 0, 0, 0, 0, 64428, 12227, 0, 0, 0, 0, 125248, 120964, + 0, 0, 0, 0, 0, 69566, 0, 0, 0, 0, 0, 1743, 0, 0, 0, 65186, 0, 0, 0, 0, 0, + 64439, 0, 68062, 0, 111259, 111258, 43866, 0, 111263, 3395, 9362, 111260, + 0, 111257, 111256, 111255, 0, 0, 41091, 3426, 1344, 111249, 111248, + 126215, 4735, 11111, 6119, 111251, 42699, 0, 0, 74818, 1423, 0, 0, 0, 0, + 12039, 10559, 0, 0, 0, 9472, 67734, 11929, 0, 0, 0, 0, 128826, 0, 11579, + 0, 0, 128364, 0, 92185, 0, 0, 1004, 92584, 0, 0, 0, 0, 0, 2556, 0, 0, + 72790, 0, 0, 9686, 0, 0, 0, 70109, 111102, 0, 10718, 13154, 111100, 9139, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 130035, 41708, 12860, 41703, 0, 42090, 5403, + 10352, 73917, 129144, 111096, 0, 5140, 3753, 118785, 41704, 0, 43078, + 127789, 111092, 129360, 0, 983205, 92362, 0, 0, 2410, 92525, 0, 0, 0, 0, + 0, 0, 0, 0, 119253, 0, 126601, 0, 2066, 74199, 0, 43463, 10659, 119623, + 68863, 0, 1336, 0, 0, 69463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126639, 0, 272, + 0, 0, 0, 0, 983946, 128133, 0, 0, 124940, 0, 1190, 42146, 1335, 42177, + 43867, 0, 0, 10448, 0, 125041, 0, 0, 2099, 5120, 2409, 7799, 0, 74424, 0, + 126581, 4731, 0, 111199, 111198, 111197, 111196, 11689, 0, 74977, 9913, + 129430, 0, 0, 0, 111195, 111194, 11694, 0, 11690, 111189, 111188, 111187, + 11693, 111193, 111192, 43097, 11688, 0, 78797, 194, 111186, 111185, + 111184, 0, 0, 0, 11226, 4519, 70337, 10898, 43072, 70205, 0, 0, 0, 73094, + 10695, 0, 7540, 0, 110984, 41859, 6067, 0, 110982, 0, 110981, 13311, 0, + 41857, 0, 8359, 121224, 12689, 0, 983131, 64577, 111204, 111203, 68183, + 111209, 111208, 6064, 110988, 0, 110979, 74142, 0, 111201, 111200, 6051, + 123613, 0, 0, 983369, 0, 0, 0, 0, 0, 110864, 10537, 110862, 1276, 0, + 6549, 6052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1960, 0, 71232, 66297, 0, 129313, + 0, 0, 1345, 111213, 111212, 111211, 8956, 43083, 0, 111215, 64682, 0, + 6430, 69563, 111210, 119814, 0, 0, 0, 119817, 0, 492, 43087, 0, 0, 0, 0, + 0, 2582, 0, 0, 7444, 72863, 0, 2297, 111243, 73837, 0, 0, 65096, 197, + 74183, 0, 69571, 111241, 111240, 0, 66515, 43550, 119829, 111229, 111228, + 93764, 111226, 0, 0, 111231, 111230, 71686, 1799, 0, 42148, 74336, 0, 0, + 65340, 111220, 110974, 2262, 111217, 111224, 74931, 111222, 10896, 0, 0, + 0, 0, 6338, 111003, 110997, 110994, 111006, 111002, 111005, 0, 111279, + 111278, 111277, 72133, 0, 111273, 111272, 110961, 3171, 6623, 4961, 0, + 886, 55216, 8654, 110965, 111270, 74390, 64603, 111267, 129283, 68122, 0, + 43084, 0, 0, 0, 0, 69693, 8994, 10944, 65938, 111239, 111238, 111237, + 111236, 66279, 92890, 42510, 0, 0, 6804, 0, 1947, 0, 0, 0, 42759, 0, + 1705, 983345, 0, 0, 0, 0, 72722, 74036, 0, 0, 66720, 111281, 111280, 0, + 4909, 111285, 111284, 111283, 4904, 0, 43503, 1365, 9253, 42757, 0, 7462, + 0, 0, 0, 0, 119587, 0, 917579, 92526, 0, 125035, 0, 111311, 111310, 0, 0, + 0, 0, 93977, 0, 0, 0, 0, 3629, 0, 13005, 0, 3628, 0, 111295, 0, 0, 0, 0, + 111290, 64809, 2928, 4905, 111083, 851, 55233, 111291, 111059, 43086, + 9114, 43870, 42583, 9315, 4822, 4906, 121097, 2847, 111028, 10330, 0, + 1251, 7777, 41852, 125059, 111327, 111032, 111325, 12646, 0, 10259, 0, + 65821, 75046, 6018, 0, 111324, 111323, 111322, 68372, 111319, 111318, + 71893, 2558, 0, 64584, 111321, 111320, 0, 0, 0, 0, 111309, 111308, + 111307, 111306, 73987, 74599, 71895, 93012, 0, 128715, 0, 12867, 111296, + 0, 0, 11044, 111300, 111299, 8904, 11824, 65857, 0, 128674, 129027, 4387, + 0, 0, 0, 0, 0, 0, 0, 11842, 0, 0, 0, 5136, 1968, 983041, 126627, 1337, 0, + 0, 0, 0, 66506, 0, 0, 0, 0, 42314, 121384, 0, 0, 6120, 0, 65670, 68128, + 0, 43082, 6016, 0, 42284, 71894, 4276, 111314, 3619, 41638, 69691, 0, + 42322, 8853, 111043, 0, 490, 0, 13231, 68384, 72310, 65350, 0, 0, 0, + 68245, 42435, 6154, 0, 65354, 0, 0, 42397, 334, 72732, 42416, 65359, + 65273, 74634, 128227, 4442, 10364, 0, 778, 41626, 42455, 7989, 0, 3227, + 69907, 111053, 0, 2915, 11502, 983212, 41702, 10309, 0, 0, 0, 0, 0, 0, 0, + 127268, 127258, 127267, 65215, 64410, 127260, 71175, 0, 0, 0, 0, 0, 0, + 41700, 110651, 69266, 126488, 0, 0, 42495, 0, 0, 0, 10460, 43364, 0, + 1356, 3728, 42713, 0, 0, 42342, 10914, 0, 42489, 64310, 66896, 41861, + 42297, 0, 0, 41860, 64862, 0, 0, 5289, 42336, 128658, 0, 92529, 42410, + 71129, 120624, 0, 2649, 74493, 0, 126635, 0, 3382, 42449, 9081, 1658, + 11936, 93019, 113814, 11269, 0, 0, 43100, 69888, 65508, 0, 0, 121451, 0, + 0, 0, 0, 69272, 4732, 128283, 0, 0, 0, 121113, 2236, 126551, 0, 6048, 0, + 0, 73965, 0, 0, 0, 0, 10151, 9681, 4475, 0, 64735, 2100, 0, 0, 6035, 0, + 123599, 10296, 0, 0, 0, 0, 0, 0, 0, 983307, 68488, 10392, 10328, 0, + 43462, 0, 0, 0, 8979, 0, 0, 983304, 0, 0, 0, 10977, 0, 10344, 0, 65299, + 10408, 0, 0, 121187, 66505, 0, 0, 0, 0, 0, 0, 43074, 73799, 0, 0, 0, 0, + 3446, 0, 129891, 128692, 0, 0, 119582, 4474, 0, 43093, 6282, 0, 0, + 127372, 0, 0, 0, 129881, 0, 0, 0, 0, 66910, 67811, 92277, 0, 64948, 0, + 74347, 0, 0, 0, 983962, 8194, 0, 121165, 11010, 0, 8893, 0, 983969, 0, 0, + 0, 983317, 7925, 0, 0, 113825, 0, 1352, 11069, 7707, 0, 126486, 0, 0, 0, + 0, 65605, 6040, 0, 10071, 0, 128156, 43750, 0, 8899, 69873, 0, 0, 983311, + 128208, 7820, 69615, 0, 0, 7746, 1492, 0, 0, 0, 66866, 0, 11788, 65913, + 0, 0, 43095, 0, 0, 92265, 2999, 0, 120720, 0, 371, 0, 6023, 0, 0, 11708, + 0, 0, 6323, 0, 0, 0, 8938, 6043, 65866, 0, 0, 0, 72419, 0, 129480, 2589, + 74332, 1689, 7802, 0, 0, 0, 0, 66704, 0, 129992, 0, 0, 128127, 6049, 0, + 4027, 0, 0, 111334, 111333, 1503, 111331, 0, 111337, 11951, 111335, 2387, + 0, 0, 8289, 111330, 7326, 66514, 65514, 0, 64865, 0, 9668, 0, 0, 0, 0, + 93060, 6036, 92768, 4026, 74089, 127091, 0, 0, 75044, 110821, 0, 110819, + 0, 0, 0, 0, 6021, 0, 128288, 0, 43155, 0, 110822, 0, 111343, 42691, + 111341, 111340, 2246, 166, 0, 0, 0, 10623, 408, 0, 111339, 13298, 0, + 7426, 43694, 0, 0, 8811, 0, 0, 0, 0, 0, 74134, 983054, 0, 127811, 0, 0, + 0, 6645, 646, 128813, 0, 42129, 0, 120880, 0, 8697, 0, 120936, 0, 0, 0, + 0, 5809, 1950, 0, 92432, 68339, 0, 42136, 0, 0, 0, 0, 0, 0, 111354, + 983965, 0, 0, 111349, 111348, 43330, 111346, 111353, 111352, 41567, + 111350, 0, 0, 0, 0, 111345, 111344, 8285, 0, 4509, 0, 128361, 0, 0, + 129851, 0, 0, 41727, 0, 0, 0, 0, 0, 0, 0, 74512, 7027, 3886, 0, 74023, 92888, 0, 0, 126092, 94058, 119855, 0, 121455, 11707, 119852, 0, 7939, 10342, 92460, 72747, 121408, 917569, 0, 71198, 94077, 119847, 0, 0, 7201, 0, 0, 120866, 983968, 1540, 0, 0, 0, 0, 0, 41718, 71177, 0, 0, 128001, 0, 0, 119040, 0, 9619, 120840, 0, 0, 0, 0, 3560, 0, 6070, 129000, 0, 2922, 6082, 70147, 65009, 983954, 0, 0, 0, 0, 0, 0, 3607, 65863, 0, 92487, - 42153, 121042, 0, 983843, 2032, 0, 0, 0, 0, 0, 0, 43085, 6057, 0, 0, 0, - 0, 0, 0, 0, 0, 638, 6083, 126976, 0, 0, 2305, 0, 0, 0, 6056, 10878, 0, 0, - 6085, 0, 0, 3915, 0, 0, 0, 0, 0, 0, 4028, 1787, 0, 43096, 0, 0, 1768, 0, - 0, 0, 128125, 0, 0, 583, 129137, 0, 0, 66004, 0, 0, 0, 0, 0, 55267, + 42153, 121042, 0, 983843, 2032, 0, 0, 0, 0, 129985, 0, 43085, 6057, 0, 0, + 0, 0, 0, 0, 0, 0, 638, 6083, 126976, 0, 0, 2305, 0, 0, 0, 6056, 10878, 0, + 0, 6085, 0, 0, 3915, 0, 0, 0, 0, 0, 0, 4028, 1787, 0, 43096, 0, 0, 1768, + 0, 0, 0, 128125, 0, 0, 583, 129137, 0, 0, 66004, 0, 0, 0, 0, 0, 55267, 120810, 128995, 43075, 65049, 0, 74531, 0, 93009, 70694, 0, 0, 129375, 9869, 128815, 1771, 0, 0, 0, 0, 0, 0, 119115, 113708, 0, 0, 74101, 0, 0, - 0, 0, 0, 0, 0, 0, 12539, 123631, 0, 0, 0, 73862, 69842, 9897, 0, 100561, - 0, 0, 0, 0, 0, 8931, 0, 1415, 8866, 74552, 0, 128312, 0, 983576, 43106, - 0, 71089, 1580, 92278, 68424, 0, 0, 7658, 3440, 78215, 1562, 0, 0, - 129031, 0, 0, 0, 0, 0, 0, 6028, 68900, 42892, 0, 111016, 0, 0, 0, 0, 0, - 128269, 0, 66776, 42946, 127276, 129124, 0, 0, 0, 11599, 0, 11602, 11591, - 11574, 11581, 11597, 11598, 6253, 11571, 11584, 70273, 11569, 0, 8906, 0, - 5755, 2636, 0, 10815, 11619, 129094, 0, 7815, 11616, 11617, 70064, 11618, - 11604, 7869, 11612, 0, 42152, 0, 0, 0, 92586, 126247, 0, 92173, 0, 0, - 6616, 0, 0, 120875, 391, 0, 0, 0, 42296, 11588, 0, 0, 0, 68397, 0, 0, - 42335, 983188, 0, 0, 7538, 94040, 0, 42491, 0, 0, 128088, 4576, 0, 0, - 43809, 4277, 0, 3563, 0, 42338, 368, 0, 0, 42412, 0, 78209, 0, 0, 43814, - 983616, 1849, 0, 9921, 42451, 4253, 0, 0, 0, 42404, 64657, 73919, 3618, - 78338, 0, 0, 0, 0, 0, 929, 6827, 42035, 0, 0, 0, 67847, 0, 0, 0, 0, 0, 0, - 0, 0, 4578, 64513, 0, 0, 0, 71049, 68090, 0, 43305, 0, 73462, 0, 0, - 42048, 10166, 0, 127095, 113810, 983127, 0, 983972, 0, 0, 42483, 0, 0, 0, - 42291, 0, 71047, 0, 6641, 525, 66404, 0, 8763, 125091, 0, 0, 0, 0, 0, - 42504, 42581, 74280, 6915, 42310, 0, 8559, 0, 983975, 125100, 0, 0, - 11666, 8679, 0, 1576, 42423, 0, 0, 73840, 983092, 11374, 0, 10889, - 129076, 0, 42462, 0, 77982, 0, 2718, 42424, 0, 0, 127166, 0, 1179, 0, 0, - 0, 363, 11015, 72229, 0, 43857, 0, 66692, 0, 0, 0, 11041, 0, 0, 0, 0, 0, - 125184, 0, 92520, 0, 9492, 66709, 9212, 12833, 0, 0, 1297, 0, 0, 0, 0, 0, - 0, 12924, 0, 0, 10090, 125249, 0, 42505, 0, 42507, 0, 42311, 92940, - 120919, 68401, 10759, 0, 0, 120924, 42351, 42919, 9398, 66292, 0, 9422, - 0, 0, 0, 0, 0, 129440, 92575, 1603, 0, 0, 0, 0, 0, 69703, 11250, 0, 0, - 10546, 0, 0, 11600, 0, 2797, 73821, 42427, 306, 714, 3058, 120154, 0, 0, - 0, 42395, 0, 11607, 0, 11198, 127512, 0, 72232, 129067, 0, 42433, 0, - 7603, 74063, 0, 42141, 0, 0, 0, 129085, 8244, 362, 125069, 0, 8037, 0, 0, - 0, 0, 41606, 66696, 77912, 0, 2093, 0, 0, 0, 41604, 0, 0, 0, 0, 10523, - 1446, 42320, 0, 0, 64773, 42472, 0, 0, 1722, 5581, 0, 64496, 0, 0, 64914, - 0, 42620, 128603, 124988, 0, 0, 10549, 0, 71190, 0, 0, 0, 0, 0, 71712, 0, - 0, 0, 0, 0, 0, 0, 7684, 66338, 0, 1174, 0, 0, 983621, 0, 0, 0, 42277, 0, - 42456, 65667, 0, 0, 0, 0, 42417, 0, 0, 120812, 42304, 0, 0, 0, 74443, - 127894, 0, 8313, 0, 0, 1316, 66690, 0, 0, 0, 0, 0, 0, 66844, 983696, 0, - 0, 0, 65200, 3383, 0, 0, 70063, 0, 0, 0, 42420, 119185, 0, 0, 983898, 0, - 121079, 0, 0, 42343, 124980, 42706, 1751, 42496, 65742, 13166, 0, 0, 0, - 0, 0, 42683, 12697, 0, 0, 0, 125047, 0, 42346, 0, 0, 3757, 0, 0, 121075, - 65869, 0, 9247, 74976, 3193, 0, 0, 42459, 7596, 7921, 0, 74095, 0, 42499, - 11590, 66006, 0, 42307, 0, 43953, 0, 0, 1023, 474, 0, 0, 0, 0, 42487, 0, - 0, 0, 42295, 0, 121474, 72237, 0, 9835, 0, 127782, 0, 12275, 0, 0, 8595, - 0, 0, 0, 0, 0, 10118, 0, 129156, 0, 0, 0, 0, 0, 0, 699, 0, 120923, 11601, - 0, 92941, 0, 7581, 0, 92530, 0, 0, 0, 7765, 65583, 0, 0, 64597, 43444, 0, - 92197, 0, 64279, 7036, 5823, 1937, 0, 917854, 65415, 13308, 65417, 0, - 65217, 0, 0, 11017, 0, 0, 7294, 0, 0, 0, 0, 42466, 65416, 68858, 0, - 71350, 65413, 92381, 126498, 12964, 42240, 1941, 0, 0, 1713, 0, 0, 0, - 11407, 42441, 128262, 6297, 0, 0, 0, 42481, 0, 0, 7179, 42289, 0, 120921, - 969, 0, 0, 0, 6165, 0, 0, 0, 0, 42402, 0, 0, 0, 129511, 0, 72234, 0, 0, - 64876, 92635, 6046, 0, 6208, 128870, 129309, 73749, 0, 0, 42422, 0, 0, - 128155, 73775, 338, 0, 121369, 0, 42328, 10767, 0, 8115, 0, 0, 0, 0, - 92687, 0, 0, 0, 0, 73029, 0, 0, 0, 71687, 4486, 128082, 0, 0, 10925, 0, - 0, 0, 0, 42309, 10257, 0, 10273, 7668, 10305, 42461, 74882, 42349, 8832, - 0, 0, 10644, 0, 129531, 42278, 0, 0, 69874, 0, 0, 42429, 0, 42316, 11223, - 0, 0, 42468, 0, 0, 0, 65402, 0, 0, 72235, 0, 0, 41963, 120990, 0, 0, - 125013, 6823, 42391, 1588, 65400, 0, 0, 0, 65398, 787, 0, 0, 0, 0, 2078, - 127239, 65399, 0, 0, 0, 65401, 0, 121196, 0, 0, 644, 0, 71335, 0, 3659, - 0, 0, 0, 13107, 92669, 0, 10502, 74457, 0, 11221, 41554, 0, 0, 0, 41557, + 0, 0, 0, 0, 0, 0, 12539, 123631, 0, 0, 129846, 73862, 69842, 9897, 0, + 100561, 0, 0, 0, 0, 0, 8931, 0, 1415, 8866, 74552, 0, 128312, 0, 983566, + 43106, 127275, 71089, 1580, 92278, 68424, 0, 0, 7658, 3440, 78215, 1562, + 0, 0, 129031, 0, 0, 0, 0, 0, 0, 6028, 68900, 42892, 0, 111016, 0, 0, 0, + 0, 0, 128269, 0, 66776, 42946, 127276, 129124, 0, 0, 120510, 11599, 0, + 11602, 11591, 11574, 11581, 11597, 11598, 6253, 11571, 11584, 70273, + 11569, 0, 8906, 0, 5755, 2636, 0, 10815, 11619, 129094, 0, 7815, 11616, + 11617, 70064, 11618, 11604, 7869, 11612, 0, 42152, 0, 0, 0, 92586, + 126247, 0, 92173, 0, 0, 6616, 0, 0, 120875, 391, 0, 0, 0, 42296, 11588, + 0, 0, 0, 68397, 0, 0, 42335, 983188, 0, 0, 7538, 94040, 0, 42491, 0, 0, + 128088, 4576, 0, 0, 43809, 4277, 0, 3563, 0, 42338, 368, 0, 0, 42412, 0, + 78209, 0, 0, 43814, 983616, 1849, 0, 9921, 42451, 4253, 0, 0, 0, 42404, + 64657, 73919, 3618, 78338, 0, 0, 0, 0, 0, 929, 6827, 42035, 0, 0, 0, + 67847, 0, 0, 0, 0, 0, 0, 0, 0, 4578, 64513, 0, 0, 0, 71049, 68090, + 127086, 43305, 0, 73462, 0, 0, 42048, 10166, 0, 127095, 113810, 983127, + 0, 983972, 0, 0, 42483, 0, 0, 0, 42291, 0, 71047, 0, 6641, 525, 66404, 0, + 8763, 125091, 0, 0, 0, 0, 0, 42504, 42581, 74280, 6915, 42310, 0, 8559, + 0, 983975, 125100, 0, 0, 11666, 8679, 0, 1576, 42423, 0, 0, 73840, + 983092, 11374, 0, 10889, 129076, 0, 42462, 0, 77982, 0, 2718, 42424, 0, + 0, 127166, 0, 1179, 0, 0, 0, 363, 11015, 72229, 0, 43857, 0, 66692, 0, 0, + 0, 11041, 72018, 0, 0, 0, 0, 125184, 0, 92520, 0, 9492, 66709, 9212, + 12833, 0, 0, 1297, 0, 0, 0, 0, 0, 0, 12924, 0, 0, 10090, 125249, 0, + 42505, 0, 42507, 0, 42311, 92940, 120919, 68401, 10759, 0, 0, 120924, + 42351, 42919, 9398, 66292, 0, 9422, 0, 0, 0, 0, 0, 129440, 92575, 1603, + 0, 0, 0, 0, 0, 69703, 11250, 0, 0, 10546, 0, 0, 11600, 0, 2797, 73821, + 42427, 306, 714, 3058, 120154, 0, 0, 0, 42395, 0, 11607, 0, 11198, + 127512, 0, 72232, 129067, 0, 42433, 0, 7603, 74063, 0, 42141, 0, 0, 0, + 129085, 8244, 362, 125069, 0, 8037, 0, 0, 0, 0, 41606, 66696, 77912, 0, + 2093, 0, 120676, 0, 41604, 0, 0, 0, 0, 10523, 1446, 42320, 0, 0, 64773, + 42472, 0, 0, 1722, 5581, 0, 64496, 0, 0, 64914, 0, 42620, 128603, 124988, + 0, 0, 10549, 0, 71190, 0, 0, 0, 0, 0, 71712, 0, 0, 0, 0, 0, 0, 0, 7684, + 66338, 0, 1174, 0, 0, 983621, 0, 0, 0, 42277, 0, 42456, 65667, 0, 0, 0, + 0, 42417, 0, 0, 120812, 42304, 0, 0, 0, 74443, 127894, 0, 8313, 0, 0, + 1316, 66690, 0, 0, 0, 0, 0, 0, 66844, 983696, 0, 0, 0, 65200, 3383, 0, 0, + 70063, 0, 0, 0, 42420, 119185, 0, 0, 983898, 0, 121079, 0, 0, 42343, + 124980, 42706, 1751, 42496, 65742, 13166, 0, 0, 0, 0, 0, 42683, 12697, 0, + 0, 0, 125047, 0, 42346, 0, 0, 3757, 0, 0, 121075, 65869, 0, 9247, 74976, + 3193, 0, 0, 42459, 7596, 7921, 0, 74095, 0, 42499, 11590, 66006, 0, + 42307, 0, 43953, 0, 0, 1023, 474, 0, 0, 0, 0, 42487, 0, 0, 0, 42295, 0, + 121474, 72237, 0, 9835, 0, 127782, 0, 12275, 0, 0, 8595, 0, 0, 0, 0, 0, + 10118, 0, 129156, 0, 0, 0, 0, 0, 0, 699, 0, 120923, 11601, 0, 92941, 0, + 7581, 0, 92530, 0, 0, 0, 7765, 65583, 0, 0, 64597, 43444, 0, 92197, 0, + 64279, 7036, 5823, 1937, 0, 917854, 65415, 13308, 65417, 0, 65217, 0, 0, + 11017, 0, 0, 7294, 0, 0, 0, 0, 42466, 65416, 68858, 0, 71350, 65413, + 92381, 126498, 12964, 42240, 1941, 0, 0, 1713, 0, 0, 0, 11407, 42441, + 128262, 6297, 0, 0, 0, 42481, 0, 0, 7179, 42289, 0, 120921, 969, 0, 0, 0, + 6165, 0, 0, 0, 0, 42402, 0, 0, 0, 129511, 0, 72234, 0, 0, 64876, 92635, + 6046, 0, 6208, 128870, 129309, 73749, 0, 0, 42422, 0, 0, 128155, 73775, + 338, 0, 121369, 0, 42328, 10767, 0, 8115, 0, 0, 0, 0, 92687, 0, 0, 0, 0, + 73029, 0, 0, 0, 71687, 4486, 128082, 0, 0, 10925, 0, 0, 0, 0, 42309, + 10257, 0, 10273, 7668, 10305, 42461, 74882, 42349, 8832, 0, 0, 10644, 0, + 129531, 42278, 0, 0, 69874, 0, 129949, 42429, 0, 42316, 11223, 0, 0, + 42468, 0, 0, 0, 65402, 0, 0, 72235, 0, 0, 41963, 120990, 0, 0, 125013, + 6823, 42391, 1588, 65400, 0, 0, 0, 65398, 787, 0, 0, 0, 0, 2078, 127239, + 65399, 0, 0, 0, 65401, 0, 121196, 0, 113816, 644, 0, 71335, 0, 3659, 0, + 0, 0, 13107, 92669, 0, 10502, 74457, 0, 11221, 41554, 0, 0, 0, 41557, 11209, 0, 11070, 119221, 0, 0, 73858, 41555, 9514, 0, 66771, 64641, 92447, 0, 7520, 73888, 77955, 0, 0, 0, 0, 0, 64527, 0, 0, 12723, 0, 68776, 0, 0, 0, 78835, 4055, 78826, 77960, 65212, 0, 127353, 12319, 0, 0, @@ -25024,53 +25855,54 @@ static const unsigned int code_hash[] = { 3588, 0, 12825, 0, 0, 128569, 0, 0, 0, 0, 0, 0, 0, 0, 128449, 64499, 65245, 127367, 1171, 127368, 69717, 127365, 1805, 8772, 0, 127363, 9930, 65247, 0, 0, 2338, 127362, 92695, 0, 0, 0, 69219, 0, 120104, 0, 120103, - 72221, 120106, 0, 118814, 8734, 4212, 0, 0, 66701, 0, 65862, 0, 120095, - 42903, 0, 0, 0, 126117, 426, 0, 120098, 8251, 0, 65436, 0, 2120, 43302, - 1224, 0, 65576, 0, 66876, 1764, 6074, 0, 12858, 0, 0, 65439, 6378, 74566, - 0, 41960, 0, 41644, 0, 2129, 0, 9222, 0, 0, 4259, 9092, 0, 41961, 0, 0, - 66357, 42331, 64935, 0, 0, 1293, 0, 2132, 0, 983589, 0, 2454, 0, 3613, - 128837, 71117, 0, 0, 69681, 10978, 10840, 0, 10668, 0, 127197, 9118, - 120164, 0, 0, 0, 1157, 64903, 8638, 0, 0, 0, 0, 0, 0, 0, 128981, 10086, - 0, 11128, 0, 0, 65430, 74013, 6079, 0, 10764, 127910, 64435, 128051, - 1339, 0, 65428, 1317, 8822, 0, 0, 0, 127143, 0, 0, 0, 43110, 0, 10428, 0, - 0, 0, 5742, 43076, 4692, 0, 0, 4007, 5004, 128781, 0, 751, 6595, 6596, 0, - 66373, 0, 0, 64908, 0, 6593, 72349, 12004, 119192, 74097, 43108, 0, 0, - 119333, 92188, 6598, 0, 6599, 0, 93031, 74194, 0, 121483, 66674, 6597, 0, - 73921, 0, 64745, 2281, 0, 0, 128996, 43790, 0, 2430, 41678, 0, 0, 43785, - 113716, 0, 121263, 0, 0, 1921, 0, 19927, 70390, 65406, 0, 43786, 4284, - 128346, 72210, 43789, 12841, 9229, 0, 42285, 0, 0, 0, 0, 3521, 0, 120888, - 8325, 0, 65403, 0, 1854, 0, 0, 0, 0, 0, 0, 0, 0, 4344, 0, 65433, 6076, 0, - 0, 74764, 12074, 0, 0, 0, 0, 12934, 119555, 65432, 128877, 0, 6071, - 65434, 0, 65435, 4053, 128623, 0, 0, 0, 0, 69823, 127463, 0, 121403, - 127473, 8421, 127472, 0, 43705, 502, 0, 65431, 0, 0, 0, 1303, 316, 7364, - 0, 2136, 0, 120796, 64365, 43480, 92639, 4860, 0, 127877, 0, 0, 9583, 0, - 5546, 0, 0, 0, 0, 0, 5544, 127475, 0, 70352, 5543, 128917, 72821, 12137, - 5548, 0, 0, 10007, 0, 127523, 6077, 0, 65452, 0, 119341, 11214, 65952, 0, - 72226, 0, 0, 1319, 74210, 65410, 67399, 92606, 0, 0, 119343, 0, 66716, - 83513, 4691, 128619, 9345, 621, 0, 0, 122889, 65411, 0, 74575, 121246, - 65408, 73899, 0, 9474, 2812, 119118, 65412, 3786, 65409, 8894, 83246, - 119611, 7923, 3716, 0, 0, 0, 0, 7012, 0, 128439, 9566, 0, 94176, 0, - 65012, 126242, 545, 9575, 0, 10050, 12718, 0, 8859, 6820, 0, 983979, - 120740, 0, 0, 9119, 2787, 0, 983981, 8507, 2012, 7985, 0, 0, 0, 0, - 194634, 0, 410, 0, 0, 120789, 120609, 0, 120378, 120379, 0, 0, 120374, - 72742, 120376, 120377, 120370, 120371, 120372, 120373, 3860, 120367, - 72205, 74031, 111131, 73685, 11748, 120365, 7941, 111134, 8749, 111132, - 12698, 111129, 361, 110793, 845, 0, 0, 0, 4562, 72241, 2926, 0, 4569, 0, - 110797, 43487, 0, 0, 0, 74287, 122885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6291, - 0, 0, 0, 9734, 0, 0, 0, 0, 127754, 7359, 83523, 43863, 0, 111150, 8769, - 111148, 111147, 111145, 4859, 111143, 111142, 0, 0, 0, 0, 12172, 111136, - 0, 127899, 111141, 64764, 4210, 111138, 0, 804, 0, 83520, 0, 70344, 0, 0, - 67202, 10091, 67200, 119257, 67206, 67205, 67204, 67203, 72302, 0, 0, 0, - 128959, 0, 1425, 92259, 119229, 11049, 0, 71480, 42649, 8482, 0, 0, - 66715, 67209, 11940, 67207, 664, 0, 0, 0, 70200, 127525, 0, 70194, 93061, - 111155, 68474, 111153, 6032, 67218, 67217, 7430, 194670, 70191, 0, 0, 0, - 0, 0, 41161, 0, 9765, 10993, 41162, 0, 70189, 1169, 111181, 0, 1905, - 6034, 41164, 64744, 43236, 0, 128800, 73110, 0, 0, 788, 0, 0, 111167, - 111128, 1663, 128976, 42901, 127237, 67211, 67210, 0, 0, 67215, 67214, - 67213, 67212, 111160, 111159, 111158, 111157, 0, 0, 0, 111161, 43612, 0, - 0, 0, 10855, 67223, 9355, 67221, 65198, 120355, 0, 221, 0, 0, 0, 121141, - 7191, 118930, 72208, 125212, 0, 0, 0, 0, 67228, 67227, 43333, 67225, 0, - 0, 0, 67229, 0, 7245, 0, 74405, 69922, 72219, 111178, 3873, 8367, 111174, + 72221, 120106, 129924, 118814, 8734, 4212, 0, 0, 66701, 0, 65862, 0, + 120095, 42903, 0, 0, 0, 126117, 426, 0, 120098, 8251, 0, 65436, 0, 2120, + 43302, 1224, 0, 65576, 0, 66876, 1764, 6074, 0, 12858, 0, 0, 65439, 6378, + 74566, 0, 41960, 0, 41644, 0, 2129, 0, 9222, 0, 0, 4259, 9092, 0, 41961, + 0, 0, 66357, 42331, 64935, 0, 0, 1293, 0, 2132, 0, 983569, 0, 2454, 0, + 3613, 128837, 71117, 0, 0, 69681, 10978, 10840, 0, 10668, 0, 127197, + 9118, 120164, 0, 0, 0, 1157, 64903, 8638, 0, 101295, 0, 0, 0, 0, 0, + 128981, 10086, 0, 11128, 0, 0, 65430, 74013, 6079, 0, 10764, 127910, + 64435, 128051, 1339, 0, 65428, 1317, 8822, 0, 0, 0, 127143, 0, 0, 0, + 43110, 0, 10428, 129848, 0, 0, 5742, 43076, 4692, 0, 0, 4007, 5004, + 128781, 0, 751, 6595, 6596, 0, 66373, 0, 0, 64908, 0, 6593, 72349, 12004, + 119192, 74097, 43108, 0, 0, 119333, 92188, 6598, 0, 6599, 0, 93031, + 74194, 0, 121483, 66674, 6597, 0, 73921, 0, 64745, 2281, 0, 0, 128996, + 43790, 0, 2430, 41678, 0, 0, 43785, 113716, 0, 121263, 0, 0, 1921, 0, + 19927, 70390, 65406, 0, 43786, 4284, 128346, 72210, 43789, 12841, 9229, + 0, 42285, 0, 0, 0, 0, 3521, 0, 120888, 8325, 0, 65403, 0, 1854, 0, 0, 0, + 0, 0, 0, 0, 0, 4344, 0, 65433, 6076, 0, 0, 74764, 12074, 0, 0, 0, 0, + 12934, 119555, 65432, 128877, 0, 6071, 65434, 0, 65435, 4053, 128623, 0, + 0, 0, 917934, 69823, 127463, 0, 121403, 127473, 8421, 127472, 0, 43705, + 502, 0, 65431, 0, 0, 0, 1303, 316, 7364, 0, 2136, 0, 120796, 64365, + 43480, 92639, 4860, 0, 127877, 0, 129728, 9583, 0, 5546, 0, 0, 0, 0, 0, + 5544, 127475, 0, 70352, 5543, 128917, 72821, 12137, 5548, 0, 0, 10007, 0, + 127523, 6077, 0, 65452, 0, 119341, 11214, 65952, 0, 72226, 0, 0, 1319, + 74210, 65410, 67399, 92606, 0, 0, 119343, 0, 66716, 83513, 4691, 128619, + 9345, 621, 0, 0, 122889, 65411, 0, 74575, 121246, 65408, 73899, 0, 9474, + 2812, 119118, 65412, 3786, 65409, 8894, 83246, 119611, 7923, 3716, 0, 0, + 0, 0, 7012, 0, 128439, 9566, 0, 94176, 0, 65012, 126242, 545, 9575, 0, + 10050, 12718, 0, 8859, 6820, 0, 129941, 120740, 0, 0, 9119, 2787, 0, + 983981, 8507, 2012, 7985, 0, 0, 0, 0, 194634, 0, 410, 0, 0, 120789, + 120609, 0, 120378, 120379, 0, 0, 120374, 72742, 120376, 120377, 120370, + 120371, 120372, 120373, 3860, 120367, 72205, 74031, 111131, 73685, 11748, + 120365, 7941, 111134, 8749, 111132, 12698, 111129, 361, 110793, 845, 0, + 0, 0, 4562, 72241, 2926, 0, 4569, 0, 110797, 43487, 0, 0, 0, 74287, + 122885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6291, 0, 0, 0, 9734, 0, 0, 0, 0, + 127754, 7359, 83523, 43863, 0, 111150, 8769, 111148, 111147, 111145, + 4859, 111143, 111142, 0, 0, 0, 0, 12172, 111136, 0, 127899, 111141, + 64764, 4210, 111138, 0, 804, 0, 83520, 0, 70344, 0, 0, 67202, 10091, + 67200, 119257, 67206, 67205, 67204, 67203, 72302, 0, 0, 0, 128959, 0, + 1425, 92259, 119229, 11049, 0, 71480, 42649, 8482, 0, 0, 66715, 67209, + 11940, 67207, 664, 0, 0, 0, 70200, 127525, 0, 70194, 93061, 111155, + 68474, 111153, 6032, 67218, 67217, 7430, 194670, 70191, 0, 0, 0, 0, 0, + 41161, 0, 9765, 10993, 41162, 0, 70189, 1169, 111181, 0, 1905, 6034, + 41164, 64744, 43236, 0, 128800, 73110, 0, 0, 788, 0, 0, 111167, 111128, + 1663, 128976, 42901, 127237, 67211, 67210, 0, 0, 67215, 67214, 67213, + 67212, 111160, 111159, 111158, 111157, 0, 0, 0, 111161, 43612, 0, 0, 0, + 10855, 67223, 9355, 67221, 65198, 120355, 0, 221, 0, 0, 0, 121141, 7191, + 118930, 72208, 125212, 0, 0, 0, 0, 67228, 67227, 43333, 67225, 0, 0, 0, + 67229, 0, 7245, 0, 74405, 69922, 72219, 111178, 3873, 8367, 111174, 111173, 111172, 43649, 0, 111177, 111176, 0, 11164, 0, 74403, 111171, 111170, 111169, 7682, 74404, 1462, 10235, 0, 0, 0, 0, 0, 111130, 0, 0, 74402, 0, 92299, 0, 0, 74052, 0, 126127, 120549, 0, 64295, 0, 0, 0, 0, 0, @@ -25079,185 +25911,188 @@ static const unsigned int code_hash[] = { 0, 8728, 0, 10904, 73446, 19936, 7833, 0, 0, 0, 0, 92546, 0, 0, 0, 8537, 0, 0, 0, 121244, 0, 0, 0, 128193, 0, 0, 0, 0, 3062, 0, 0, 0, 0, 0, 41160, 41147, 41158, 0, 120777, 0, 41155, 111116, 111115, 111114, 0, 121332, - 111119, 111118, 111117, 0, 0, 129091, 0, 0, 0, 64594, 2456, 66867, 0, 0, - 0, 0, 3721, 0, 0, 1230, 2678, 0, 3597, 917795, 0, 0, 92215, 0, 67737, - 8352, 0, 0, 0, 64515, 121378, 0, 129128, 67846, 0, 0, 92466, 0, 0, 71338, - 0, 8660, 0, 0, 0, 0, 0, 4483, 0, 0, 0, 6080, 0, 0, 1746, 1315, 0, 70201, - 0, 13140, 74508, 0, 0, 4480, 0, 111113, 111112, 0, 67979, 0, 6360, 10897, - 111106, 605, 68302, 110737, 69875, 110735, 110736, 66681, 0, 0, 0, 0, 0, - 0, 0, 10877, 118868, 64885, 0, 0, 0, 0, 0, 0, 345, 0, 0, 64606, 9917, 0, - 0, 92196, 0, 1776, 8422, 43992, 0, 0, 0, 126543, 43328, 0, 0, 1295, 0, - 42869, 0, 0, 0, 0, 128772, 65123, 125210, 11293, 11288, 0, 0, 65666, 0, - 92369, 65420, 0, 0, 4252, 0, 0, 0, 706, 72800, 0, 0, 0, 65419, 92177, 0, - 8419, 65421, 0, 66702, 0, 12670, 0, 0, 0, 0, 72825, 65422, 83008, 0, 0, - 0, 0, 0, 0, 9736, 4184, 65418, 0, 0, 74035, 0, 0, 0, 0, 0, 0, 129447, 0, - 7962, 12211, 9837, 83505, 0, 0, 5719, 0, 0, 119068, 73777, 1857, 0, 9927, - 0, 983940, 0, 10037, 0, 73695, 78322, 78319, 7818, 0, 0, 127769, 0, 0, 0, - 65077, 0, 78325, 78326, 78323, 43327, 43989, 0, 65828, 0, 0, 83499, 0, - 68390, 0, 110687, 78336, 78339, 9543, 78335, 78332, 78333, 0, 127964, 0, - 129552, 983895, 0, 69448, 0, 71429, 0, 0, 0, 11914, 69431, 0, 0, 0, 9949, - 0, 0, 119215, 0, 12073, 0, 0, 0, 0, 0, 2260, 0, 0, 0, 0, 0, 0, 1939, 0, - 0, 0, 69903, 0, 0, 0, 0, 6643, 92477, 0, 0, 78330, 78331, 78328, 78329, - 0, 92551, 0, 0, 0, 0, 0, 72417, 0, 0, 0, 0, 78341, 78342, 120944, 78340, - 129513, 127529, 92350, 3784, 78350, 0, 78348, 78349, 78345, 43324, 78343, - 78344, 2231, 0, 0, 0, 42467, 0, 0, 42894, 78363, 13281, 78360, 78361, - 78356, 78358, 78353, 64899, 0, 41149, 0, 43162, 68096, 41150, 0, 10571, - 67162, 67161, 67160, 67159, 6947, 41152, 887, 9249, 6565, 64806, 74366, - 0, 67158, 67157, 0, 10831, 67175, 67174, 120232, 65827, 43325, 67178, - 10168, 67176, 0, 0, 9190, 128497, 9666, 41997, 0, 0, 0, 0, 0, 0, 129411, - 0, 78508, 0, 78351, 78352, 0, 0, 72839, 983730, 0, 126604, 0, 0, 0, - 983417, 0, 2270, 0, 0, 0, 78365, 0, 67189, 72818, 0, 0, 0, 0, 0, 0, 0, - 72833, 0, 78366, 78367, 0, 0, 0, 0, 10137, 6121, 10995, 0, 71050, 8119, - 0, 71052, 0, 0, 0, 0, 0, 0, 0, 1394, 0, 0, 128960, 0, 67184, 2998, 67182, - 67181, 67188, 67187, 67186, 67185, 0, 0, 0, 0, 67180, 42003, 0, 0, 67193, - 67192, 67191, 67190, 67197, 67196, 67195, 67194, 0, 72770, 43315, 71051, - 0, 1593, 0, 125120, 619, 4635, 0, 72875, 0, 128859, 0, 0, 0, 0, 67199, - 67198, 0, 42790, 42006, 0, 0, 0, 128998, 10757, 9347, 127767, 0, 0, - 74227, 78904, 0, 74116, 128423, 121073, 120860, 0, 92427, 0, 0, 0, 0, - 64590, 0, 4371, 0, 0, 92478, 0, 0, 73977, 0, 0, 127847, 0, 120862, 0, - 64550, 73745, 70451, 0, 121013, 0, 0, 0, 129286, 0, 0, 0, 0, 9131, 0, - 125214, 0, 0, 0, 64260, 0, 12606, 0, 0, 0, 0, 562, 0, 0, 129648, 66455, - 127533, 3219, 0, 0, 0, 1037, 0, 64491, 0, 983676, 78572, 78580, 4568, - 549, 0, 0, 0, 0, 0, 128095, 70851, 0, 0, 0, 0, 0, 0, 0, 10825, 8079, - 118962, 0, 0, 0, 128855, 0, 13071, 0, 0, 41049, 42840, 43614, 129341, - 74881, 74596, 127191, 5212, 0, 66402, 119191, 0, 9747, 0, 0, 0, 983989, - 41047, 1668, 0, 0, 0, 1187, 0, 74416, 0, 0, 0, 0, 3240, 128518, 9213, 0, - 0, 0, 127174, 69822, 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 11272, 0, 73914, - 65048, 1909, 42172, 0, 0, 10736, 11580, 72228, 7615, 0, 0, 4237, 66576, - 0, 65815, 68083, 0, 0, 0, 3489, 0, 0, 0, 0, 0, 0, 127146, 3796, 6800, 0, - 65582, 0, 129521, 0, 0, 68036, 0, 0, 64857, 121213, 126493, 0, 66308, 0, - 0, 64634, 127817, 0, 0, 0, 0, 3246, 0, 43972, 128643, 0, 0, 0, 0, 120751, - 0, 0, 0, 0, 1496, 42827, 0, 942, 2378, 119213, 0, 0, 0, 0, 9510, 1232, - 8139, 0, 0, 0, 11409, 0, 6382, 0, 66319, 121237, 0, 0, 0, 127887, 2374, - 0, 8475, 120844, 66313, 0, 0, 64879, 119298, 0, 0, 70869, 0, 0, 129025, - 0, 7705, 11942, 0, 0, 3309, 0, 0, 0, 83345, 983847, 0, 0, 1280, 6998, - 128104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74239, 983073, 0, 0, 0, 6078, - 121354, 0, 1475, 0, 9938, 6084, 0, 983976, 0, 0, 0, 3256, 0, 43973, 0, 0, - 0, 8727, 0, 0, 0, 110831, 110832, 10562, 110830, 0, 0, 0, 3248, 0, 0, - 9015, 0, 0, 3635, 64337, 0, 0, 43852, 7195, 0, 2007, 64431, 0, 0, 0, 0, - 0, 0, 0, 65613, 77909, 0, 0, 0, 0, 119218, 7984, 11670, 74434, 127770, - 4176, 0, 2034, 69442, 11154, 65891, 0, 0, 318, 2038, 0, 0, 0, 3649, - 13149, 42145, 42798, 3634, 0, 0, 128483, 0, 0, 0, 11402, 120954, 94032, - 74238, 0, 43313, 0, 0, 7938, 0, 1761, 0, 65379, 68386, 128185, 1159, - 71183, 0, 0, 0, 66687, 120851, 0, 41680, 0, 0, 0, 1514, 11668, 67891, - 9313, 0, 128490, 67877, 0, 41681, 0, 0, 12848, 69982, 67873, 0, 74278, 0, - 0, 12649, 0, 0, 1194, 3242, 9761, 9555, 8598, 0, 120524, 0, 1551, 65447, + 111119, 111118, 111117, 129878, 0, 129091, 0, 0, 0, 64594, 2456, 66867, + 0, 0, 0, 0, 3721, 0, 0, 1230, 2678, 0, 3597, 917795, 0, 0, 92215, 0, + 67737, 8352, 0, 0, 0, 64515, 121378, 0, 129128, 67846, 0, 0, 92466, 0, 0, + 71338, 0, 8660, 0, 0, 0, 0, 0, 4483, 0, 0, 0, 6080, 0, 0, 1746, 1315, 0, + 70201, 0, 13140, 74508, 0, 0, 4480, 0, 111113, 111112, 0, 67979, 0, 6360, + 10897, 111106, 605, 68302, 110737, 69875, 110735, 110736, 66681, 0, 0, 0, + 0, 0, 0, 0, 10877, 118868, 64885, 0, 0, 0, 0, 0, 0, 345, 0, 0, 64606, + 9917, 0, 0, 92196, 0, 1776, 8422, 43992, 0, 0, 0, 126543, 43328, 0, 0, + 1295, 0, 42869, 0, 0, 0, 0, 128772, 65123, 125210, 11293, 11288, 0, 0, + 65666, 0, 92369, 65420, 0, 0, 4252, 0, 0, 0, 706, 72800, 0, 0, 129931, + 65419, 92177, 0, 8419, 65421, 0, 66702, 0, 12670, 0, 0, 0, 0, 72825, + 65422, 83008, 0, 0, 0, 0, 0, 0, 9736, 4184, 65418, 0, 0, 74035, 0, + 129955, 0, 0, 0, 0, 129447, 0, 7962, 12211, 9837, 83505, 0, 0, 5719, 0, + 0, 119068, 73777, 1857, 0, 9927, 0, 983940, 0, 10037, 0, 73695, 78322, + 78319, 7818, 0, 0, 127769, 0, 0, 0, 65077, 0, 78325, 78326, 78323, 43327, + 43989, 0, 65828, 0, 0, 83499, 0, 68390, 0, 110687, 78336, 78339, 9543, + 78335, 78332, 78333, 0, 127964, 0, 129552, 983895, 0, 69448, 0, 71429, 0, + 0, 0, 11914, 69431, 0, 0, 0, 9949, 0, 0, 119215, 0, 12073, 0, 0, 0, 0, + 101218, 2260, 0, 0, 0, 0, 0, 0, 1939, 0, 0, 0, 69903, 0, 0, 0, 0, 6643, + 92477, 0, 0, 78330, 78331, 78328, 78329, 0, 92551, 0, 0, 0, 0, 0, 72417, + 0, 0, 0, 0, 78341, 78342, 120944, 78340, 129513, 127529, 92350, 3784, + 78350, 0, 78348, 78349, 78345, 43324, 78343, 78344, 2231, 0, 0, 0, 42467, + 0, 0, 42894, 78363, 13281, 78360, 78361, 78356, 78358, 78353, 64899, 0, + 41149, 0, 43162, 68096, 41150, 0, 10571, 67162, 67161, 67160, 67159, + 6947, 41152, 887, 9249, 6565, 64806, 74366, 0, 67158, 67157, 0, 10831, + 67175, 67174, 120232, 65827, 43325, 67178, 10168, 67176, 0, 0, 9190, + 128497, 9666, 41997, 0, 0, 0, 0, 0, 0, 129411, 0, 78508, 0, 78351, 78352, + 0, 0, 72839, 983730, 0, 126604, 0, 0, 0, 983417, 0, 2270, 0, 129957, 0, + 78365, 0, 67189, 72818, 0, 0, 0, 0, 0, 0, 0, 72833, 101119, 78366, 78367, + 0, 0, 0, 0, 10137, 6121, 10995, 0, 71050, 8119, 0, 71052, 0, 0, 0, 0, 0, + 0, 0, 1394, 0, 0, 128960, 0, 67184, 2998, 67182, 67181, 67188, 67187, + 67186, 67185, 0, 101185, 0, 0, 67180, 42003, 0, 0, 67193, 67192, 67191, + 67190, 67197, 67196, 67195, 67194, 0, 72770, 43315, 71051, 0, 1593, 0, + 125120, 619, 4635, 0, 72875, 0, 128859, 0, 0, 0, 0, 67199, 67198, 0, + 42790, 42006, 0, 0, 0, 128998, 10757, 9347, 127767, 0, 0, 74227, 78904, + 0, 74116, 128423, 121073, 120860, 0, 92427, 0, 0, 0, 0, 64590, 0, 4371, + 0, 0, 92478, 0, 0, 73977, 0, 0, 127847, 0, 120862, 0, 64550, 73745, + 70451, 0, 121013, 0, 0, 0, 129286, 0, 0, 0, 0, 9131, 0, 125214, 0, 0, 0, + 64260, 0, 12606, 0, 0, 0, 0, 562, 0, 0, 129648, 66455, 127533, 3219, 0, + 0, 0, 1037, 0, 64491, 0, 983676, 78572, 78580, 4568, 549, 0, 0, 0, 0, 0, + 128095, 70851, 0, 0, 0, 0, 0, 129716, 0, 10825, 8079, 118962, 0, 0, 0, + 128855, 0, 13071, 0, 0, 41049, 42840, 43614, 129341, 74881, 74596, + 127191, 5212, 0, 66402, 119191, 0, 9747, 0, 0, 0, 983989, 41047, 1668, 0, + 0, 0, 1187, 0, 74416, 0, 0, 0, 0, 3240, 128518, 9213, 0, 0, 0, 127174, + 69822, 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 11272, 0, 73914, 65048, 1909, + 42172, 0, 0, 10736, 11580, 72228, 7615, 0, 0, 4237, 66576, 0, 65815, + 68083, 0, 0, 0, 3489, 0, 0, 0, 0, 0, 0, 127146, 3796, 6800, 0, 65582, 0, + 129521, 0, 0, 68036, 0, 0, 64857, 121213, 126493, 0, 66308, 0, 0, 64634, + 127817, 0, 0, 0, 0, 3246, 0, 43972, 128643, 0, 0, 0, 0, 120751, 0, 0, 0, + 0, 1496, 42827, 0, 942, 2378, 119213, 0, 0, 0, 0, 9510, 1232, 8139, 0, 0, + 0, 11409, 0, 6382, 0, 66319, 121237, 0, 0, 0, 127887, 2374, 0, 8475, + 120844, 66313, 0, 0, 64879, 119298, 0, 0, 70869, 0, 0, 129025, 0, 7705, + 11942, 0, 0, 3309, 0, 0, 0, 83345, 983847, 0, 0, 1280, 6998, 128104, 0, + 0, 0, 129945, 0, 0, 0, 0, 0, 0, 0, 74239, 983073, 0, 0, 0, 6078, 121354, + 0, 1475, 0, 9938, 6084, 0, 983976, 0, 0, 0, 3256, 0, 43973, 0, 0, 0, + 8727, 0, 0, 0, 110831, 110832, 10562, 110830, 0, 0, 0, 3248, 0, 0, 9015, + 0, 0, 3635, 64337, 0, 0, 43852, 7195, 0, 2007, 64431, 0, 0, 0, 0, 0, 0, + 0, 65613, 77909, 0, 0, 0, 0, 119218, 7984, 11670, 74434, 127770, 4176, + 69248, 2034, 69442, 11154, 65891, 0, 0, 318, 2038, 0, 0, 0, 3649, 13149, + 42145, 42798, 3634, 0, 0, 128483, 0, 0, 0, 11402, 120954, 94032, 74238, + 0, 43313, 0, 0, 7938, 0, 1761, 0, 65379, 68386, 128185, 1159, 71183, 0, + 0, 0, 66687, 120851, 0, 41680, 0, 0, 0, 1514, 11668, 67891, 9313, 0, + 128490, 67877, 0, 41681, 0, 0, 12848, 69982, 67873, 0, 74278, 0, 0, + 12649, 0, 0, 1194, 3242, 9761, 9555, 8598, 0, 120524, 0, 1551, 65447, 129414, 126211, 0, 0, 0, 67875, 0, 3495, 66648, 125079, 0, 73024, 983228, 0, 0, 10641, 0, 0, 0, 77845, 0, 0, 0, 0, 0, 11131, 0, 0, 0, 0, 0, 42685, - 92354, 193, 0, 0, 0, 42667, 0, 0, 92318, 119661, 0, 1362, 9558, 0, 0, 0, + 72017, 193, 0, 0, 0, 42667, 0, 0, 92318, 71958, 0, 1362, 9558, 0, 0, 0, 7351, 73789, 0, 0, 4426, 0, 0, 0, 0, 7276, 42163, 5220, 0, 0, 67822, 0, - 0, 0, 0, 41692, 0, 72283, 0, 0, 3223, 65492, 0, 0, 4549, 983687, 0, 0, 0, - 10807, 0, 0, 0, 42182, 8688, 12866, 0, 3294, 0, 0, 128101, 0, 64514, 0, - 43329, 0, 0, 0, 0, 119061, 0, 43422, 0, 0, 128618, 0, 42729, 0, 3215, - 120982, 68880, 917564, 0, 0, 0, 65682, 0, 0, 65924, 0, 983804, 0, 1501, - 0, 118807, 0, 0, 9607, 0, 65794, 72243, 983046, 10989, 0, 74399, 0, 0, - 7152, 0, 0, 129530, 7483, 125083, 0, 8104, 70128, 7474, 0, 72233, 0, 0, - 0, 8141, 0, 42537, 69612, 0, 0, 0, 0, 0, 127307, 42934, 0, 0, 0, 0, 0, 0, - 64517, 0, 0, 1650, 0, 0, 128502, 7901, 3238, 0, 65556, 0, 0, 65158, - 43416, 74959, 0, 7527, 0, 43319, 0, 0, 45, 0, 0, 0, 0, 0, 7347, 0, 0, 0, - 13129, 0, 9084, 0, 8737, 0, 0, 0, 66808, 9639, 7912, 2620, 0, 3564, 0, 0, - 0, 0, 75049, 0, 2853, 0, 0, 0, 0, 0, 2850, 8084, 0, 0, 71446, 92284, - 43122, 0, 0, 0, 0, 72214, 0, 74767, 0, 7331, 110646, 0, 8245, 0, 3158, - 92396, 3983, 0, 923, 0, 69397, 292, 0, 126548, 0, 3221, 1763, 0, 0, 0, 0, - 7253, 0, 68391, 75002, 0, 3637, 12996, 0, 70461, 0, 0, 3228, 0, 0, 0, 0, - 0, 0, 120833, 118939, 0, 7696, 0, 0, 0, 0, 43316, 4177, 0, 9089, 0, - 128805, 72116, 64500, 68133, 0, 0, 1856, 100572, 0, 6379, 0, 0, 0, 3208, - 0, 0, 0, 0, 0, 0, 129402, 0, 0, 0, 2033, 0, 0, 0, 55254, 7740, 0, 0, 0, - 128197, 0, 93988, 0, 67612, 0, 0, 41689, 129380, 0, 0, 6646, 0, 0, 0, - 983945, 0, 0, 4573, 0, 0, 0, 0, 0, 92961, 0, 128222, 41688, 0, 0, 0, + 0, 0, 0, 41692, 0, 72283, 0, 0, 3223, 65492, 0, 0, 4549, 983687, 0, 0, + 101162, 10807, 0, 0, 0, 42182, 8688, 12866, 0, 3294, 0, 0, 128101, 0, + 64514, 0, 43329, 129989, 0, 0, 0, 119061, 0, 43422, 0, 0, 128618, 0, + 42729, 0, 3215, 120982, 68880, 917564, 0, 0, 0, 65682, 0, 0, 65924, 0, + 983804, 0, 1501, 0, 118807, 0, 0, 9607, 0, 65794, 72243, 983046, 10989, + 0, 74399, 0, 0, 7152, 0, 0, 129530, 7483, 125083, 0, 8104, 70128, 7474, + 0, 5189, 0, 0, 0, 8141, 0, 42537, 69612, 0, 0, 0, 0, 0, 127307, 42934, 0, + 0, 0, 0, 0, 0, 64517, 0, 0, 1650, 0, 0, 128502, 7901, 3238, 0, 65556, 0, + 0, 65158, 43416, 74959, 0, 7527, 0, 43319, 0, 0, 45, 0, 0, 0, 0, 0, 7347, + 0, 0, 0, 13129, 0, 9084, 0, 8737, 0, 0, 0, 66808, 9639, 7912, 2620, 0, + 3564, 0, 0, 0, 0, 75049, 0, 2853, 0, 0, 0, 0, 0, 2850, 8084, 0, 0, 71446, + 92284, 43122, 0, 0, 0, 0, 72214, 0, 74767, 0, 7331, 110646, 0, 8245, 0, + 3158, 92396, 3983, 0, 923, 0, 69397, 292, 0, 126548, 0, 3221, 1763, 0, 0, + 0, 0, 7253, 0, 68391, 75002, 0, 3637, 12996, 0, 70461, 0, 0, 3228, 0, 0, + 0, 0, 0, 0, 120833, 118939, 0, 7696, 0, 0, 0, 0, 43316, 4177, 0, 9089, 0, + 128805, 72116, 64500, 68133, 0, 0, 1856, 100572, 0, 6379, 0, 118999, 0, + 3208, 0, 0, 0, 0, 0, 0, 129402, 0, 0, 0, 2033, 0, 0, 0, 55254, 7740, 0, + 0, 0, 128197, 0, 93988, 0, 67612, 0, 0, 41689, 129380, 0, 0, 6646, 0, 0, + 0, 983945, 0, 0, 4573, 0, 0, 0, 0, 0, 92961, 0, 128222, 41688, 0, 0, 0, 8314, 0, 0, 0, 0, 0, 66721, 0, 0, 121033, 0, 128226, 0, 0, 0, 13164, 0, 66237, 983963, 0, 0, 0, 3257, 0, 0, 1845, 0, 0, 0, 0, 128783, 0, 0, 0, 0, 3499, 8609, 0, 7145, 0, 0, 0, 0, 74829, 983988, 983291, 0, 0, 0, 7591, 0, - 0, 0, 983251, 70132, 128167, 0, 0, 0, 0, 119261, 0, 0, 0, 13083, 0, 0, 0, + 0, 0, 73778, 70132, 128167, 0, 0, 0, 0, 119261, 0, 0, 0, 13083, 0, 0, 0, 0, 66177, 983269, 5429, 0, 0, 68168, 66181, 0, 0, 983253, 0, 0, 5433, 67659, 0, 42776, 1547, 66176, 92428, 0, 5425, 4977, 9999, 0, 5423, 64560, 125094, 0, 0, 0, 74122, 0, 0, 0, 128003, 4418, 66199, 0, 92300, 0, 0, 0, 92224, 124995, 0, 11908, 0, 9360, 125101, 983202, 0, 66187, 12837, 983288, 0, 11112, 0, 92321, 43318, 0, 0, 0, 0, 126518, 120604, 0, 983286, - 0, 983281, 0, 983782, 0, 9958, 0, 125108, 0, 0, 0, 2433, 128602, 0, 3352, + 0, 129595, 0, 983782, 0, 9958, 0, 125108, 0, 0, 0, 2433, 128602, 0, 3352, 0, 0, 0, 0, 0, 0, 305, 567, 67662, 0, 69979, 65242, 0, 41695, 0, 0, 0, 7837, 917625, 129002, 5337, 917622, 7325, 43312, 917619, 68742, 917617, 74086, 68777, 917614, 917613, 10973, 917611, 1372, 128768, 917608, 917607, 1254, 917605, 917604, 93967, 917602, 65228, 113753, 0, 67723, 8068, 0, 0, 983951, 0, 3245, 64393, 119069, 0, 0, 0, 0, 0, 0, 0, 983279, - 0, 119563, 0, 0, 0, 126638, 0, 0, 43322, 0, 0, 0, 0, 92698, 3226, 67695, - 0, 0, 983939, 10200, 0, 128779, 127821, 0, 65610, 0, 0, 0, 3585, 250, - 129598, 43320, 0, 0, 0, 0, 1152, 0, 1688, 0, 0, 0, 0, 0, 121040, 128340, - 0, 0, 0, 2107, 0, 129048, 0, 0, 0, 43868, 0, 0, 0, 128239, 0, 0, 127777, - 0, 6927, 42267, 42261, 11464, 3365, 0, 0, 0, 0, 0, 41869, 0, 0, 0, 43326, - 0, 11519, 0, 5530, 5210, 0, 983970, 0, 5208, 0, 128842, 0, 2424, 7976, 0, - 0, 3244, 5529, 0, 73894, 128852, 5432, 0, 5527, 0, 78484, 0, 5528, 0, 0, - 120281, 0, 0, 43545, 120282, 0, 0, 73686, 42565, 0, 0, 3206, 120278, 0, - 0, 0, 0, 0, 211, 3216, 83407, 0, 120998, 3220, 68750, 0, 0, 8951, 5214, - 0, 8118, 0, 10768, 8735, 0, 5852, 124952, 0, 0, 0, 0, 0, 2623, 0, 0, 0, - 127388, 4698, 66509, 0, 0, 4701, 0, 120289, 74225, 120284, 8267, 0, 1421, - 66426, 0, 0, 2625, 92724, 0, 74309, 0, 0, 0, 7850, 120296, 69639, 127032, - 0, 0, 43384, 12660, 110663, 0, 0, 110706, 110661, 0, 92380, 0, 0, 69649, - 0, 713, 41073, 0, 3990, 0, 0, 0, 5017, 128313, 120352, 0, 0, 1030, 0, - 983120, 9513, 0, 0, 0, 4668, 0, 120350, 0, 6339, 0, 0, 0, 64650, 0, 0, - 74766, 983850, 8908, 0, 0, 0, 0, 10752, 13003, 68769, 0, 41307, 8732, - 120336, 0, 41310, 0, 4696, 0, 983934, 0, 120334, 3641, 5419, 0, 0, 0, 0, - 120344, 128129, 0, 7320, 65230, 11808, 0, 93970, 936, 13289, 0, 69892, - 65774, 0, 65243, 0, 19953, 0, 126469, 121375, 127256, 12913, 70722, - 68759, 0, 0, 70203, 0, 4113, 0, 2372, 1819, 0, 128053, 12152, 0, 682, - 7655, 120330, 0, 0, 10593, 1703, 0, 0, 8033, 69953, 0, 9810, 0, 0, - 127949, 0, 119159, 10109, 0, 73898, 0, 71730, 126704, 0, 0, 917620, 1965, - 917621, 0, 0, 73887, 0, 0, 0, 6314, 0, 8501, 0, 0, 0, 41317, 0, 5417, - 983586, 0, 0, 9353, 68148, 41315, 0, 11161, 0, 41314, 194892, 0, 126562, - 119236, 634, 0, 0, 0, 69779, 4355, 12016, 0, 9654, 12856, 6924, 7660, 0, - 0, 0, 0, 0, 42692, 0, 74604, 0, 0, 0, 680, 6274, 0, 1181, 0, 3174, 67248, - 0, 0, 0, 0, 113776, 10650, 917603, 92295, 70672, 118965, 0, 64644, - 126981, 0, 0, 0, 0, 983942, 0, 65302, 40989, 68239, 68230, 68234, 0, 0, - 124989, 0, 40987, 4667, 0, 983944, 8828, 0, 0, 0, 4746, 0, 0, 2269, 4749, - 0, 100598, 65192, 4744, 7345, 0, 242, 100595, 0, 8217, 0, 68919, 0, 0, 0, - 0, 66790, 10850, 0, 0, 0, 0, 0, 0, 64680, 0, 0, 120562, 0, 127324, 0, + 0, 119563, 129935, 78865, 0, 126638, 0, 0, 43322, 0, 0, 0, 0, 92698, + 3226, 67695, 0, 0, 983939, 10200, 0, 128779, 101143, 0, 65610, 0, 0, 0, + 3585, 250, 101142, 43320, 0, 0, 0, 0, 1152, 129849, 1688, 0, 0, 0, 0, 0, + 121040, 128340, 0, 0, 0, 2107, 0, 129048, 0, 0, 0, 43868, 129832, 129817, + 0, 128239, 0, 0, 127777, 0, 6927, 42267, 42261, 11464, 3365, 0, 0, 0, 0, + 0, 41869, 0, 0, 0, 43326, 0, 11519, 0, 5530, 5210, 0, 983970, 0, 5208, 0, + 128842, 0, 2424, 7976, 0, 0, 3244, 5529, 0, 73894, 128852, 5432, 0, 5527, + 0, 78484, 0, 5528, 0, 0, 120281, 0, 0, 43545, 120282, 0, 0, 73686, 42565, + 0, 0, 3206, 120278, 0, 0, 101149, 0, 0, 211, 3216, 83407, 0, 120998, + 3220, 68750, 0, 0, 8951, 5214, 0, 8118, 0, 10768, 8735, 0, 5852, 124952, + 0, 0, 121110, 0, 0, 2623, 0, 0, 0, 127388, 4698, 66509, 0, 0, 4701, 0, + 120289, 74225, 120284, 8267, 0, 1421, 66426, 0, 0, 2625, 92724, 0, 74309, + 0, 0, 0, 7850, 120296, 69639, 127032, 0, 0, 43384, 12660, 110663, 0, 0, + 110706, 110661, 0, 92380, 0, 0, 69649, 0, 713, 41073, 0, 3990, 0, 0, 0, + 5017, 128313, 120352, 0, 0, 1030, 0, 983120, 9513, 0, 0, 0, 4668, 0, + 120350, 0, 6339, 0, 0, 0, 64650, 0, 0, 74766, 983850, 8908, 0, 0, 0, 0, + 10752, 13003, 68769, 0, 41307, 8732, 120336, 0, 41310, 0, 4696, 0, + 983934, 0, 120334, 3641, 5419, 0, 0, 0, 0, 120344, 128129, 0, 7320, + 65230, 11808, 0, 93970, 936, 13289, 0, 69892, 65774, 0, 65243, 0, 19953, + 0, 126469, 121375, 127256, 12913, 70722, 68759, 0, 0, 70203, 0, 4113, 0, + 2372, 1819, 0, 128053, 12152, 0, 682, 7655, 120330, 129921, 0, 10593, + 1703, 0, 0, 8033, 69953, 0, 9810, 0, 0, 127949, 0, 119159, 10109, 0, + 73898, 0, 71730, 126704, 0, 0, 917620, 1965, 917621, 0, 0, 73887, 0, 0, + 0, 6314, 0, 8501, 0, 0, 0, 41317, 0, 5417, 983582, 0, 0, 9353, 68148, + 41315, 0, 11161, 0, 41314, 194892, 0, 126562, 119236, 634, 0, 0, 0, + 69779, 4355, 12016, 0, 9654, 12856, 6924, 7660, 0, 0, 0, 0, 0, 42692, 0, + 74604, 0, 0, 0, 680, 6274, 0, 1181, 0, 3174, 67248, 0, 0, 0, 0, 113776, + 10650, 917603, 92295, 70672, 118965, 0, 64644, 126981, 0, 0, 0, 0, + 983942, 0, 65302, 40989, 68239, 68230, 68234, 0, 0, 124989, 0, 40987, + 4667, 0, 983944, 8828, 0, 0, 0, 4746, 0, 129840, 2269, 4749, 0, 100598, + 65192, 4744, 7345, 0, 242, 100595, 0, 8217, 0, 68919, 0, 2245, 0, 0, + 66790, 10850, 0, 0, 0, 0, 0, 129853, 64680, 0, 0, 120562, 0, 127324, 0, 100551, 128721, 0, 7316, 0, 983610, 100552, 74157, 1646, 0, 0, 73995, 120857, 129047, 0, 7350, 0, 0, 0, 9099, 4107, 3441, 0, 2975, 194701, 0, 983947, 55220, 10084, 73943, 120845, 0, 0, 0, 3399, 0, 0, 11909, 0, 0, 7687, 0, 6789, 0, 0, 72739, 71367, 0, 0, 92589, 9151, 1137, 0, 749, 129320, 125076, 5385, 0, 69387, 0, 0, 41298, 0, 69461, 0, 0, 0, 0, 0, 0, 128455, 0, 519, 0, 64547, 5766, 0, 0, 0, 8848, 0, 41297, 0, 0, 0, 41300, - 74468, 65160, 0, 0, 127511, 0, 0, 6558, 0, 0, 128686, 92775, 0, 71450, - 41302, 127927, 0, 0, 128646, 68762, 11729, 8719, 9060, 0, 128796, 0, 0, - 0, 129682, 0, 11734, 93011, 11730, 73450, 9593, 5757, 2403, 0, 55275, 0, - 11728, 65894, 0, 0, 0, 68741, 0, 0, 0, 43489, 4282, 983845, 0, 83497, - 70328, 128103, 70324, 0, 0, 127509, 0, 8456, 0, 0, 0, 0, 78250, 0, 70320, - 120722, 9792, 0, 70326, 0, 0, 83500, 70322, 10019, 71701, 123617, 6568, - 4365, 0, 0, 3647, 0, 41134, 128341, 0, 125043, 41135, 0, 0, 0, 0, 0, - 123616, 0, 41137, 41139, 0, 6545, 0, 125139, 7597, 10528, 75054, 0, 3732, - 73910, 0, 0, 0, 7312, 983639, 9062, 93840, 11853, 0, 0, 128324, 41538, 0, - 0, 0, 0, 194706, 41531, 1263, 3720, 0, 68028, 0, 41524, 64692, 119635, 0, - 41534, 0, 92193, 0, 41168, 0, 67398, 127347, 3524, 0, 8831, 127349, - 127357, 0, 127360, 127352, 0, 0, 0, 0, 0, 0, 5845, 0, 0, 0, 71909, 8200, - 0, 68460, 0, 43283, 5551, 0, 0, 0, 6340, 983552, 100602, 0, 0, 0, 0, 0, - 5422, 0, 0, 0, 2471, 0, 0, 2749, 0, 73774, 10913, 72122, 0, 8666, 675, - 74093, 0, 194986, 0, 0, 0, 0, 0, 10928, 0, 41153, 0, 0, 0, 3738, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42347, 12092, 9615, 7234, 74047, 0, 0, 0, - 123639, 0, 0, 2934, 0, 0, 0, 0, 74507, 0, 74461, 0, 0, 74290, 0, 64562, - 0, 64473, 0, 0, 73728, 0, 11212, 0, 12128, 6534, 0, 0, 1901, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 69940, 65459, 68293, 92290, 128808, 3770, 0, 0, 0, - 64579, 128511, 0, 0, 983332, 983340, 0, 0, 0, 5941, 0, 0, 65079, 0, 0, 0, - 73961, 983334, 0, 0, 0, 0, 0, 0, 10638, 0, 0, 0, 71486, 0, 0, 983349, 0, - 43840, 129495, 0, 5233, 983346, 64792, 71233, 0, 983324, 0, 0, 9847, 0, - 1685, 595, 0, 73971, 1292, 8940, 0, 11088, 0, 10004, 0, 0, 6541, 0, 0, 0, - 5603, 9014, 5606, 0, 538, 128705, 5602, 8467, 74391, 6547, 0, 0, 0, 0, - 8458, 129534, 8495, 0, 0, 917552, 10981, 78314, 0, 2465, 0, 0, 0, 9730, - 9280, 0, 0, 74155, 72766, 113690, 0, 504, 0, 120715, 0, 983606, 0, 0, 0, - 123141, 125024, 0, 0, 732, 3737, 0, 1548, 0, 0, 1832, 5604, 0, 41141, 0, - 5607, 72854, 41142, 3745, 0, 0, 128137, 0, 0, 3869, 11937, 5725, 0, - 66566, 7416, 5728, 0, 0, 0, 11918, 66567, 5724, 118829, 5727, 0, 0, 0, - 5723, 0, 128116, 0, 0, 0, 0, 42532, 0, 12303, 0, 11423, 0, 983115, 68303, - 74074, 0, 128267, 6559, 64557, 71348, 0, 66763, 43019, 0, 10238, 0, 0, - 43377, 0, 71346, 124937, 9783, 42704, 0, 71719, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 41144, 129465, 0, 0, 0, 72793, 92176, 0, 70682, 0, 8820, 0, 0, - 0, 11515, 526, 0, 0, 0, 0, 0, 0, 8635, 0, 0, 8288, 11815, 0, 0, 0, 1543, - 3713, 0, 0, 0, 68041, 127816, 0, 0, 64357, 0, 42082, 0, 0, 8987, 42081, - 0, 0, 0, 0, 0, 0, 6553, 0, 0, 11253, 0, 0, 5475, 0, 0, 0, 119334, 12990, - 1160, 42084, 0, 123152, 0, 0, 360, 0, 0, 128274, 5863, 3137, 0, 983315, - 0, 0, 10959, 3146, 0, 127374, 0, 68341, 13076, 3135, 983298, 0, 0, 3142, - 0, 94068, 10819, 128479, 0, 74635, 12877, 119867, 73967, 0, 70808, 0, 0, - 0, 0, 6163, 0, 113728, 0, 0, 0, 8603, 0, 0, 3306, 0, 43392, 0, 0, 5751, - 0, 0, 0, 0, 0, 7403, 0, 118933, 0, 0, 64783, 92658, 0, 0, 129592, 0, 0, + 74468, 65160, 0, 129839, 127511, 0, 0, 6558, 0, 0, 128686, 92775, 0, + 71450, 41302, 127927, 0, 0, 128646, 68762, 11729, 8719, 9060, 0, 128796, + 0, 0, 0, 129682, 0, 11734, 93011, 11730, 73450, 9593, 5757, 2403, 0, + 55275, 0, 11728, 65894, 0, 0, 0, 68741, 0, 0, 0, 43489, 4282, 983845, 0, + 83497, 70328, 128103, 70324, 0, 0, 127509, 0, 8456, 0, 0, 74783, 0, + 78250, 0, 70320, 120722, 9792, 0, 70326, 0, 0, 83500, 70322, 10019, + 71701, 123617, 6568, 4365, 0, 0, 3647, 0, 41134, 128341, 0, 125043, + 41135, 0, 0, 0, 129938, 0, 123616, 0, 41137, 41139, 0, 6545, 0, 125139, + 7597, 10528, 75054, 0, 3732, 73910, 0, 0, 0, 7312, 983639, 9062, 93840, + 11853, 0, 0, 128324, 41538, 0, 0, 0, 0, 194706, 41531, 1263, 3720, 0, + 68028, 0, 41524, 64692, 119635, 0, 41534, 0, 92193, 0, 41168, 0, 67398, + 127347, 3524, 0, 8831, 127349, 127357, 0, 127360, 127352, 129816, 0, 0, + 0, 0, 0, 5845, 0, 0, 0, 71909, 8200, 0, 68460, 0, 43283, 5551, 0, 0, 0, + 6340, 983552, 100602, 0, 0, 0, 0, 0, 5422, 0, 0, 0, 2471, 0, 0, 2749, 0, + 73774, 10913, 72122, 0, 8666, 675, 74093, 0, 194986, 0, 69262, 0, 0, 0, + 10928, 0, 41153, 0, 0, 0, 3738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 42347, 12092, 9615, 7234, 74047, 0, 0, 0, 123639, 0, 0, 2934, 0, 0, 0, 0, + 74507, 0, 74461, 0, 0, 74290, 0, 64562, 129975, 64473, 0, 0, 73728, 0, + 11212, 0, 12128, 6534, 0, 0, 1901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69940, + 65459, 68293, 92290, 128808, 3770, 0, 0, 0, 64579, 128511, 0, 0, 983332, + 983340, 0, 0, 0, 5941, 0, 0, 65079, 0, 0, 0, 73961, 983334, 0, 0, 0, 0, + 0, 0, 10638, 0, 0, 0, 71486, 0, 0, 983349, 0, 43840, 129495, 0, 5233, + 983346, 64792, 71233, 0, 983324, 0, 0, 9847, 0, 1685, 595, 0, 73971, + 1292, 8940, 0, 11088, 0, 10004, 0, 0, 6541, 0, 0, 0, 5603, 9014, 5606, 0, + 538, 128705, 5602, 8467, 74391, 6547, 0, 0, 0, 0, 8458, 129534, 8495, 0, + 0, 917552, 10981, 78314, 0, 2465, 0, 0, 0, 9730, 9280, 0, 0, 74155, + 72766, 113690, 0, 504, 0, 120715, 0, 983606, 0, 0, 0, 123141, 125024, 0, + 0, 732, 3737, 0, 1548, 0, 0, 1832, 5604, 0, 41141, 0, 5607, 72854, 41142, + 3745, 0, 0, 128137, 0, 0, 3869, 11937, 5725, 0, 66566, 7416, 5728, 0, 0, + 0, 11918, 66567, 5724, 118829, 5727, 0, 0, 0, 5723, 0, 128116, 71999, 0, + 0, 0, 42532, 0, 12303, 0, 11423, 0, 983115, 68303, 74074, 0, 128267, + 6559, 64557, 71348, 0, 66763, 43019, 0, 10238, 0, 0, 43377, 0, 71346, + 124937, 9783, 42704, 0, 71719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41144, + 129465, 0, 0, 0, 72793, 92176, 0, 70682, 0, 8820, 0, 0, 0, 11515, 526, 0, + 0, 0, 0, 0, 0, 8635, 0, 0, 8288, 11815, 0, 0, 0, 1543, 3713, 0, 0, 0, + 68041, 127816, 0, 0, 64357, 0, 42082, 0, 0, 8987, 42081, 0, 0, 0, 0, 0, + 0, 6553, 0, 0, 11253, 0, 0, 5475, 0, 0, 0, 119334, 12990, 1160, 42084, 0, + 123152, 0, 0, 360, 0, 0, 128274, 5863, 3137, 0, 983315, 0, 0, 10959, + 3146, 0, 127374, 0, 68341, 13076, 3135, 983298, 0, 0, 3142, 0, 94068, + 10819, 128479, 0, 74635, 12877, 119867, 73967, 0, 70808, 0, 0, 0, 0, + 6163, 129745, 113728, 0, 0, 0, 8603, 0, 0, 3306, 0, 43392, 0, 0, 5751, 0, + 0, 0, 0, 0, 7403, 0, 118933, 0, 0, 64783, 92658, 0, 0, 129592, 0, 0, 65569, 7021, 0, 0, 0, 0, 0, 6540, 6974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43585, 0, 6551, 983974, 0, 0, 0, 0, 0, 72216, 8977, 602, 120814, 0, 0, 0, 72119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983624, 74812, 0, 0, 0, 9475, 0, 65105, 0, @@ -25286,34 +26121,35 @@ static const unsigned int code_hash[] = { 41360, 0, 0, 4743, 0, 0, 0, 0, 68398, 110781, 5890, 110779, 111103, 3739, 8695, 92514, 0, 3964, 8984, 111095, 68288, 0, 0, 70000, 111090, 111089, 111088, 3956, 82952, 111093, 6563, 111091, 41305, 0, 0, 12067, 41312, 0, - 0, 0, 0, 0, 8175, 0, 3600, 0, 934, 0, 0, 173, 0, 0, 110784, 110785, 1750, - 110783, 41358, 68368, 1807, 0, 92298, 0, 5889, 0, 0, 0, 67127, 0, 0, - 121395, 6982, 1721, 0, 7891, 0, 42160, 67129, 4512, 983771, 69460, 0, 0, - 0, 0, 0, 120716, 0, 0, 0, 0, 0, 119140, 3975, 72253, 74087, 0, 12672, 0, - 0, 0, 0, 0, 0, 121100, 0, 0, 41095, 3962, 68242, 2932, 41101, 3954, 6457, - 4513, 0, 0, 0, 0, 1468, 0, 0, 55237, 128230, 0, 127244, 55238, 41080, 0, - 0, 4320, 74104, 0, 0, 0, 0, 77918, 0, 128384, 8256, 0, 72413, 0, 8879, 0, - 0, 8770, 0, 0, 92214, 0, 0, 128786, 4283, 0, 0, 68361, 0, 74826, 0, 0, 0, - 0, 127954, 65106, 42761, 121516, 4581, 8411, 0, 0, 72259, 0, 93037, 0, 0, - 0, 92452, 4392, 0, 10786, 69661, 0, 8184, 0, 0, 7396, 0, 0, 69788, 0, - 43512, 7965, 111039, 111038, 111037, 111036, 41350, 0, 0, 0, 2294, 64501, - 68034, 0, 68405, 111034, 0, 0, 111030, 111029, 71105, 111027, 0, 111033, - 92200, 111031, 0, 6764, 0, 0, 111026, 111025, 111024, 65203, 128010, 0, - 0, 0, 3210, 0, 0, 0, 0, 82958, 127970, 82957, 0, 68875, 10043, 82963, - 1186, 41571, 0, 5209, 9464, 82960, 66657, 5207, 65062, 5213, 0, 0, 41348, - 41568, 128803, 3253, 111045, 111044, 74067, 111042, 111049, 5596, 111047, - 111046, 0, 64887, 0, 5217, 111041, 72252, 0, 0, 0, 0, 2635, 92760, 0, 0, - 0, 92742, 0, 113672, 0, 0, 0, 64558, 0, 0, 67083, 0, 0, 0, 5784, 0, 0, 0, - 0, 4011, 0, 0, 0, 0, 4254, 0, 111054, 5600, 111052, 111051, 10447, 5598, - 1207, 111055, 0, 3501, 42582, 0, 111050, 0, 1124, 5597, 983496, 983497, - 9321, 129464, 75040, 983493, 0, 1719, 68356, 68354, 9671, 1125, 2721, 0, - 983498, 983499, 7631, 5488, 111082, 0, 0, 5491, 111086, 8937, 0, 3236, - 74187, 5490, 0, 5489, 8522, 68358, 111069, 6300, 111067, 111066, 0, 0, - 111071, 111070, 0, 9875, 7593, 111065, 0, 0, 43182, 0, 68379, 3311, - 111058, 111057, 3746, 11016, 65752, 111061, 0, 43423, 68775, 0, 111056, - 72225, 0, 0, 127120, 0, 2232, 0, 0, 0, 0, 0, 126555, 0, 0, 8656, 0, - 128358, 0, 0, 983485, 983486, 917563, 983484, 983481, 983482, 0, 0, 0, 0, - 0, 111183, 128043, 983490, 1036, 983488, 111075, 1723, 111073, 111072, + 0, 0, 0, 0, 8175, 0, 3600, 0, 934, 0, 0, 173, 129844, 0, 110784, 110785, + 1750, 110783, 41358, 68368, 1807, 0, 92298, 0, 5889, 0, 0, 0, 67127, 0, + 0, 121395, 6982, 1721, 0, 7891, 0, 42160, 67129, 4512, 983771, 69460, 0, + 0, 0, 0, 0, 120716, 0, 0, 0, 0, 0, 119140, 3975, 72253, 74087, 0, 12672, + 0, 129821, 0, 0, 129836, 0, 121100, 0, 0, 41095, 3962, 68242, 2932, + 41101, 3954, 6457, 4513, 0, 0, 0, 0, 1468, 0, 0, 55237, 128230, 0, + 127244, 55238, 41080, 0, 0, 4320, 74104, 0, 0, 0, 0, 77918, 0, 128384, + 8256, 0, 72413, 0, 8879, 0, 0, 8770, 0, 0, 92214, 0, 0, 128786, 4283, + 129689, 0, 68361, 0, 74826, 0, 0, 0, 0, 127954, 65106, 42761, 121516, + 4581, 8411, 0, 0, 72259, 0, 93037, 0, 0, 0, 92452, 4392, 0, 10786, 69661, + 0, 8184, 0, 0, 7396, 0, 0, 69788, 0, 43512, 7965, 111039, 111038, 111037, + 111036, 41350, 0, 0, 0, 2294, 64501, 68034, 0, 68405, 111034, 0, 0, + 111030, 111029, 71105, 111027, 0, 111033, 92200, 111031, 0, 6764, 0, 0, + 111026, 111025, 111024, 65203, 128010, 0, 0, 0, 3210, 0, 129978, 0, 0, + 82958, 127970, 82957, 0, 68875, 10043, 71979, 1186, 41571, 0, 5209, 9464, + 82960, 66657, 5207, 65062, 5213, 0, 0, 41348, 41568, 128803, 3253, + 111045, 111044, 74067, 111042, 111049, 5596, 111047, 111046, 0, 64887, 0, + 5217, 111041, 72252, 0, 0, 0, 0, 2635, 92760, 0, 0, 0, 92742, 0, 113672, + 0, 0, 0, 64558, 67081, 0, 67083, 0, 0, 0, 5784, 0, 0, 0, 0, 4011, 0, 0, + 0, 0, 4254, 0, 111054, 5600, 111052, 111051, 10447, 5598, 1207, 111055, + 0, 3501, 42582, 0, 111050, 0, 1124, 5597, 983496, 983497, 9321, 129464, + 75040, 983493, 0, 1719, 68356, 68354, 9671, 1125, 2721, 0, 983498, + 983499, 7631, 5488, 111082, 0, 0, 5491, 111086, 8937, 0, 3236, 74187, + 5490, 0, 5489, 8522, 68358, 111069, 6300, 111067, 111066, 0, 0, 111071, + 111070, 0, 9875, 7593, 111065, 0, 0, 43182, 0, 68379, 3311, 111058, + 111057, 3746, 11016, 65752, 111061, 0, 43423, 68775, 0, 111056, 72225, 0, + 0, 127120, 0, 2232, 0, 0, 0, 0, 0, 126555, 0, 0, 8656, 0, 128358, 0, 0, + 983485, 983486, 917563, 983484, 983481, 983482, 0, 0, 0, 129669, 0, + 111183, 128043, 983490, 1036, 983488, 111075, 1723, 111073, 111072, 111079, 41579, 111077, 111076, 10705, 0, 983480, 74486, 71693, 740, 983476, 983477, 129645, 0, 0, 74846, 92255, 0, 0, 0, 0, 0, 10438, 74487, 73798, 13285, 0, 0, 0, 5690, 0, 93992, 0, 0, 13095, 0, 127857, 121419, @@ -25325,427 +26161,434 @@ static const unsigned int code_hash[] = { 983459, 983456, 983457, 983454, 983455, 42492, 43402, 125208, 3302, 0, 72842, 68809, 0, 0, 120885, 121300, 0, 7856, 8690, 0, 73076, 0, 0, 0, 73091, 0, 69925, 120635, 65153, 0, 0, 0, 0, 0, 0, 4540, 0, 0, 0, 0, - 11844, 121209, 8863, 0, 75061, 0, 6389, 0, 42371, 83205, 8790, 120911, 0, - 111125, 71168, 8869, 0, 0, 42060, 0, 9648, 111123, 71170, 10270, 10286, - 10318, 10382, 43529, 0, 0, 0, 0, 0, 70110, 43835, 119520, 70111, 127086, - 118815, 127084, 127083, 8767, 0, 0, 41281, 0, 5201, 0, 6215, 67072, 6214, - 13101, 0, 0, 65268, 67073, 0, 0, 127976, 72995, 127073, 10511, 42075, 0, - 127071, 129509, 0, 67115, 127069, 111293, 127068, 0, 127067, 0, 74845, 0, - 42071, 43156, 0, 0, 0, 0, 7954, 0, 0, 0, 8485, 4671, 0, 0, 4740, 0, 0, - 42618, 78294, 3064, 6212, 0, 0, 0, 9554, 0, 83044, 0, 126598, 0, 78291, - 0, 6213, 12885, 0, 129086, 64720, 0, 983907, 0, 0, 0, 11430, 0, 7518, - 9317, 0, 3729, 10406, 0, 119259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73825, 0, 0, - 129599, 8786, 10390, 0, 0, 917601, 93034, 0, 7924, 0, 43307, 0, 0, 0, 0, - 0, 0, 118843, 9623, 435, 0, 0, 12893, 8093, 9079, 0, 0, 0, 0, 0, 64430, - 0, 10294, 10326, 0, 0, 0, 0, 0, 0, 3623, 125188, 83378, 0, 43197, 0, 0, - 0, 78296, 0, 0, 0, 7914, 0, 92170, 0, 2624, 0, 0, 0, 120859, 67110, - 11058, 0, 67107, 0, 0, 0, 0, 120793, 0, 0, 6717, 10619, 0, 0, 0, 11832, - 128664, 0, 0, 0, 70202, 0, 0, 0, 3232, 73824, 74581, 0, 0, 0, 41889, 0, - 0, 1161, 41895, 74103, 9701, 0, 0, 129385, 73819, 120588, 5012, 0, 41362, - 0, 68507, 0, 0, 0, 0, 0, 41364, 0, 0, 41352, 41361, 0, 41366, 0, 70129, - 129065, 917, 0, 119934, 119923, 92421, 119912, 0, 119924, 119916, 0, - 71482, 0, 0, 0, 0, 128583, 0, 7022, 0, 4739, 0, 5802, 9816, 8615, 0, 0, - 491, 65837, 0, 0, 128644, 0, 8426, 11092, 9891, 0, 0, 0, 41881, 118823, - 3736, 7394, 42648, 0, 68448, 9095, 7741, 12684, 41885, 0, 0, 0, 0, 5815, - 0, 0, 0, 127392, 0, 0, 41878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120804, 0, 0, - 2267, 0, 78289, 78359, 78288, 0, 0, 78318, 65920, 0, 0, 7057, 9408, 9409, - 9410, 9411, 9412, 9413, 9414, 9415, 9416, 9417, 9418, 9419, 9420, 9421, - 5897, 9423, 917933, 127107, 0, 127108, 917937, 127963, 8955, 9399, 9400, - 9401, 9402, 9403, 9404, 9405, 9406, 9407, 0, 128626, 42669, 73832, 78261, - 67683, 2631, 0, 78259, 0, 78260, 3996, 0, 119307, 0, 0, 0, 0, 0, 0, - 64825, 917916, 917913, 917914, 917919, 5899, 917917, 917918, 12085, 0, - 574, 917922, 77825, 73828, 9473, 77824, 118918, 73900, 41735, 42211, 0, - 4190, 77834, 77835, 77830, 77833, 3616, 77828, 77837, 77838, 7708, 77836, - 2228, 113765, 0, 0, 4191, 0, 77844, 73800, 77842, 77843, 77839, 77840, 0, - 78311, 83375, 0, 0, 10415, 74102, 0, 5896, 0, 10351, 67151, 0, 73829, 0, - 127159, 0, 73998, 41355, 42883, 70736, 71212, 8021, 0, 119150, 983713, - 41357, 8011, 42885, 42887, 41354, 0, 0, 10026, 5472, 120554, 1191, - 121110, 5470, 128784, 5476, 0, 0, 0, 0, 42874, 78281, 42876, 6304, 78283, - 0, 2675, 120690, 0, 0, 128954, 0, 0, 5478, 5904, 0, 0, 0, 7291, 77848, - 43761, 13067, 0, 0, 126249, 120360, 69731, 77856, 77857, 77854, 77855, - 77852, 77853, 77850, 10750, 43714, 77858, 0, 0, 0, 12887, 120364, 127745, - 77866, 77867, 77864, 77865, 9929, 5199, 77859, 1120, 0, 0, 0, 9486, 7554, - 0, 77868, 72832, 0, 0, 5894, 70069, 0, 0, 92511, 70358, 1323, 13162, - 120937, 0, 0, 0, 77881, 66022, 0, 72857, 0, 0, 0, 0, 0, 1142, 0, 8271, 0, - 0, 126645, 12903, 43622, 4002, 0, 10442, 10676, 120368, 0, 120369, 0, 0, - 0, 0, 66642, 1277, 0, 7871, 0, 0, 78853, 0, 119015, 0, 0, 11784, 0, - 78012, 4700, 0, 78858, 0, 78855, 0, 0, 92400, 77879, 19932, 77876, 77877, - 74804, 77874, 77869, 77871, 0, 71487, 43118, 0, 0, 6774, 6773, 0, 194684, - 10346, 10410, 78860, 118974, 0, 110613, 6108, 0, 110612, 0, 0, 0, 121309, - 74166, 124973, 0, 0, 0, 69407, 0, 70357, 0, 0, 74217, 0, 64698, 4192, - 9289, 0, 0, 128847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11603, 0, 0, 0, 82976, 0, - 0, 67812, 0, 0, 0, 42572, 0, 128300, 119146, 1963, 11622, 0, 43237, - 82981, 7550, 67100, 5903, 82984, 78009, 0, 9662, 0, 128391, 0, 0, 0, 0, - 11013, 0, 0, 0, 128433, 67090, 0, 0, 0, 0, 0, 11568, 983685, 43367, 0, 0, - 7852, 0, 0, 0, 0, 0, 194676, 0, 194675, 0, 0, 416, 0, 0, 73834, 0, 68921, - 10984, 0, 0, 0, 0, 0, 0, 127013, 92423, 0, 983256, 121199, 0, 0, 12540, - 0, 0, 0, 0, 11445, 0, 2112, 0, 0, 0, 1021, 0, 9507, 10210, 78005, 8023, - 93963, 78006, 78001, 43181, 78003, 9532, 119094, 0, 0, 0, 0, 0, 1885, - 43268, 0, 0, 120542, 121153, 392, 7894, 4391, 0, 8221, 119597, 77999, - 77998, 0, 0, 0, 92967, 0, 3558, 0, 3913, 70429, 121376, 0, 0, 1265, 0, - 6309, 0, 12969, 0, 0, 0, 0, 0, 0, 0, 41864, 0, 0, 74294, 0, 167, 0, - 917584, 0, 93983, 72354, 68477, 0, 0, 917594, 0, 2493, 0, 0, 0, 0, - 917570, 0, 0, 0, 406, 917592, 0, 0, 0, 0, 0, 0, 0, 127161, 0, 128597, 0, - 0, 0, 3421, 10561, 0, 8365, 0, 0, 127569, 120787, 128669, 0, 0, 0, 0, - 7834, 0, 0, 917574, 10298, 6624, 4908, 0, 1639, 120842, 0, 0, 6327, 6724, - 0, 0, 0, 69910, 4817, 0, 0, 0, 68059, 0, 11022, 0, 0, 0, 118888, 0, 0, - 7548, 64794, 0, 12291, 983165, 0, 0, 0, 0, 0, 0, 1134, 1838, 0, 2057, 0, - 0, 0, 0, 0, 0, 5206, 0, 0, 42523, 0, 0, 0, 0, 65550, 8570, 4816, 0, - 127926, 0, 4821, 0, 0, 0, 4818, 125257, 119974, 119977, 0, 0, 119970, - 119973, 0, 119983, 119982, 119985, 119984, 119979, 119978, 0, 119980, - 119670, 129297, 0, 11284, 119987, 70097, 65155, 119988, 0, 9363, 0, 0, 0, - 5900, 93990, 7889, 2722, 128770, 0, 0, 0, 0, 2282, 0, 0, 0, 68093, 0, 0, - 0, 0, 0, 70150, 0, 0, 0, 0, 129651, 70146, 983079, 119967, 71330, 70148, - 0, 0, 94006, 70144, 119964, 110677, 110678, 110675, 110676, 0, 110674, - 4226, 0, 123165, 5732, 71327, 0, 0, 65119, 0, 0, 92971, 64770, 0, 0, - 6093, 0, 0, 1395, 0, 0, 0, 121179, 786, 0, 43174, 64340, 0, 125269, 0, - 983643, 125138, 10132, 0, 0, 0, 0, 0, 93956, 0, 68444, 0, 92437, 123143, - 0, 0, 92656, 0, 0, 0, 1399, 121463, 0, 121465, 121464, 120808, 241, - 121469, 4907, 0, 0, 0, 0, 0, 0, 0, 0, 127904, 0, 0, 42780, 0, 0, 0, 4217, - 0, 0, 0, 0, 72158, 0, 0, 43099, 3965, 0, 0, 0, 13300, 0, 0, 43057, 0, 0, - 0, 0, 0, 65372, 0, 6410, 126073, 125252, 70468, 0, 0, 0, 119558, 0, 0, 0, - 0, 0, 0, 43188, 2626, 7762, 0, 0, 0, 127183, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 67726, 0, 126993, 1542, 0, 0, 92550, 0, 0, 74311, 0, 0, 10181, 2150, - 0, 0, 0, 0, 0, 68053, 6029, 72852, 0, 0, 0, 0, 8993, 0, 0, 0, 93968, 606, - 0, 0, 0, 0, 4311, 0, 6027, 126615, 4322, 0, 65207, 0, 0, 983901, 0, 0, - 2735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70806, 0, 0, 0, 92783, 0, 0, - 65817, 55288, 127934, 66564, 8530, 0, 7709, 0, 121202, 66560, 128528, - 917595, 12876, 66561, 0, 121430, 983938, 7789, 5855, 809, 0, 0, 72853, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64386, 0, 74909, 0, 120607, 66416, 83360, - 6532, 0, 0, 0, 0, 128224, 0, 0, 0, 0, 43091, 92287, 0, 0, 129312, 0, 0, - 0, 11361, 0, 0, 8153, 128105, 0, 10741, 0, 0, 0, 0, 0, 64706, 0, 0, 0, - 78870, 9466, 78866, 9824, 0, 0, 0, 120977, 915, 0, 0, 43865, 0, 0, 0, - 67131, 70096, 67137, 0, 129614, 78864, 6730, 78862, 68161, 0, 78861, - 126542, 0, 0, 94010, 983683, 0, 0, 66043, 0, 0, 43107, 0, 0, 92343, 0, - 73879, 0, 0, 0, 6103, 0, 0, 92470, 0, 12889, 0, 127137, 0, 0, 0, 0, 0, 0, - 119262, 83028, 0, 0, 0, 0, 0, 0, 0, 13118, 7700, 917537, 9690, 0, 0, - 68080, 512, 0, 72792, 0, 0, 77892, 632, 77890, 77891, 42529, 0, 0, 0, 0, - 0, 0, 0, 128273, 0, 0, 7379, 64581, 5386, 0, 0, 10633, 72316, 64488, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 124956, 71307, 0, 0, 0, 0, 0, 92370, 0, 0, 0, 0, - 0, 71314, 1801, 0, 0, 120867, 0, 0, 77888, 2085, 702, 77887, 77884, - 77885, 13074, 77883, 66299, 0, 0, 12106, 0, 0, 1755, 0, 77897, 77898, - 1163, 3102, 77893, 77894, 0, 0, 0, 0, 69227, 0, 77901, 77902, 77899, - 77900, 65171, 0, 0, 0, 70157, 0, 0, 0, 0, 2908, 0, 11177, 64902, 64950, - 0, 128740, 66906, 124959, 70499, 0, 0, 0, 64352, 0, 125031, 1007, 0, - 9199, 0, 127371, 118992, 41890, 0, 2730, 119072, 0, 5428, 0, 73771, 0, 0, - 0, 0, 71458, 0, 0, 0, 68089, 0, 44012, 0, 71456, 0, 9158, 66878, 69905, - 92440, 0, 0, 0, 484, 0, 0, 0, 194742, 0, 0, 0, 0, 572, 7041, 2736, 0, 0, - 93962, 0, 68628, 0, 0, 5438, 5222, 5381, 43114, 0, 5193, 5125, 5456, - 5509, 0, 120664, 113700, 0, 0, 0, 3430, 0, 42905, 0, 74929, 6050, 0, 0, - 129197, 0, 0, 10908, 0, 0, 0, 64617, 0, 0, 3957, 0, 0, 0, 674, 0, 0, - 2946, 5354, 5251, 5328, 5307, 3759, 72318, 8364, 5123, 0, 5281, 5469, - 5121, 0, 0, 0, 5130, 0, 129608, 0, 0, 0, 1221, 2733, 0, 0, 0, 72321, 0, - 0, 0, 0, 0, 0, 5939, 0, 0, 0, 71867, 68400, 128216, 10321, 10289, 0, - 10385, 123164, 0, 0, 0, 0, 118943, 0, 11411, 0, 5938, 0, 120865, 0, 0, - 10401, 10337, 0, 0, 0, 0, 0, 0, 0, 78277, 0, 0, 12165, 0, 0, 9885, 0, - 8077, 0, 127908, 0, 0, 0, 0, 129138, 4220, 10725, 10433, 0, 68395, 4987, - 64519, 0, 0, 0, 123626, 120356, 0, 11733, 0, 120792, 0, 127233, 0, 0, 0, - 92345, 68254, 983642, 77991, 0, 2724, 0, 0, 12313, 110619, 515, 119947, - 119944, 119945, 119942, 119943, 119940, 119941, 119938, 8606, 4046, 4589, - 4521, 0, 9141, 0, 0, 2741, 0, 0, 1370, 0, 0, 0, 0, 0, 0, 66880, 0, 66003, - 0, 68630, 0, 0, 69458, 0, 11593, 68669, 68666, 68660, 0, 0, 2744, 72285, - 68638, 0, 814, 0, 119962, 119963, 119960, 119961, 101106, 43029, 119956, - 11623, 119954, 11955, 119952, 119953, 41986, 119951, 0, 120497, 4847, - 110975, 0, 0, 0, 0, 1581, 64920, 93830, 12954, 963, 110973, 110972, - 110971, 110969, 5278, 110967, 68621, 92222, 983449, 68625, 983447, 68617, - 110960, 0, 0, 110965, 110964, 110963, 110962, 0, 0, 983439, 983440, - 983437, 983438, 983435, 92648, 127379, 0, 65137, 6483, 65392, 0, 4213, - 129649, 41303, 0, 0, 0, 41306, 983217, 2698, 0, 0, 0, 68396, 0, 41304, - 824, 0, 78011, 72315, 78894, 110982, 78892, 64804, 9820, 119820, 110985, - 110976, 0, 6739, 0, 5481, 3490, 110978, 110977, 71706, 69947, 67702, - 9124, 12688, 119833, 0, 0, 119822, 119821, 119824, 68367, 42575, 119825, - 119828, 119827, 119948, 0, 71087, 68658, 119946, 8025, 0, 127024, 68675, - 92445, 71097, 69613, 0, 0, 0, 0, 983430, 2745, 11797, 110990, 983426, - 9202, 983424, 983425, 0, 0, 0, 10525, 5436, 74584, 110987, 110986, - 121506, 43080, 121508, 121507, 983415, 6246, 119958, 10921, 9723, 6777, - 6776, 6775, 0, 0, 70287, 92384, 0, 8669, 0, 0, 65093, 0, 78881, 2716, 0, - 0, 11252, 0, 68369, 0, 11060, 12985, 2711, 78872, 78027, 78026, 7992, 0, - 0, 42938, 78033, 78032, 78877, 70724, 78029, 78028, 78031, 78030, 64535, - 110998, 10130, 110996, 0, 0, 111001, 111000, 127914, 983412, 78014, 5713, - 110995, 7570, 110993, 110992, 0, 11190, 0, 9026, 0, 74864, 7547, 78891, - 0, 10008, 10222, 0, 129543, 9744, 0, 127193, 983408, 119656, 983406, - 94070, 983404, 983405, 983402, 9045, 78888, 4225, 78886, 78887, 68757, - 78885, 78882, 78883, 983397, 983398, 8405, 983396, 10423, 10359, 983391, - 983392, 0, 129149, 4215, 9789, 0, 4321, 12309, 983400, 41313, 0, 5368, - 66886, 0, 0, 5366, 0, 5372, 0, 0, 0, 7720, 7390, 2696, 0, 0, 8268, 0, - 1790, 0, 0, 118977, 0, 0, 0, 5376, 1835, 72313, 78704, 128089, 0, 0, - 68655, 1180, 0, 0, 0, 0, 0, 0, 0, 9122, 0, 11928, 0, 65283, 0, 0, 5971, - 121171, 43500, 1268, 65097, 983218, 0, 0, 0, 1427, 128440, 0, 5970, 3431, - 72299, 983386, 983387, 983384, 983385, 983382, 2738, 125066, 10455, 0, - 74026, 0, 4222, 6240, 0, 119013, 983389, 68377, 6248, 983373, 67815, - 983371, 917907, 92582, 0, 128698, 125215, 0, 2728, 65549, 64563, 983377, - 983378, 0, 128145, 0, 10713, 7166, 119559, 2622, 0, 0, 0, 0, 8954, 0, - 94008, 2632, 42617, 10108, 1011, 42852, 12080, 2709, 0, 5716, 0, 0, 0, 0, - 127100, 69378, 0, 9515, 127098, 66465, 6451, 0, 127097, 8918, 983556, 0, - 0, 19950, 0, 0, 0, 44003, 0, 0, 0, 0, 0, 0, 983495, 74022, 0, 128795, - 68643, 67410, 0, 5721, 0, 0, 0, 121074, 11267, 983364, 66464, 5720, - 983363, 0, 4219, 5718, 8696, 5717, 0, 983370, 983878, 983368, 541, - 983366, 983367, 128237, 119089, 68389, 983352, 119949, 56, 4216, 10577, - 0, 0, 77849, 69620, 983357, 983358, 66899, 983356, 0, 0, 67628, 0, 0, - 7086, 0, 67998, 67621, 0, 2734, 69616, 0, 67627, 118937, 0, 67625, 0, 0, - 0, 42593, 0, 128217, 0, 0, 119939, 0, 68180, 0, 0, 71104, 7442, 43665, - 359, 41253, 68392, 6239, 120599, 41256, 0, 67740, 111023, 111022, 111021, - 9346, 69660, 41254, 0, 43291, 78002, 0, 0, 124993, 93841, 0, 0, 0, 4368, - 983500, 0, 68137, 0, 0, 41024, 0, 0, 121359, 121420, 0, 0, 0, 4223, 0, - 8574, 83502, 0, 0, 0, 0, 0, 92718, 983636, 70432, 128323, 68382, 0, 0, 0, - 0, 0, 4144, 0, 83193, 6245, 0, 2732, 92644, 0, 0, 0, 83501, 0, 0, 0, - 128005, 0, 0, 0, 0, 3097, 0, 0, 77996, 0, 0, 10863, 111020, 111019, - 111018, 0, 111015, 111014, 111013, 111012, 118964, 0, 10216, 64293, 0, 0, - 69393, 128331, 12325, 111010, 8717, 111008, 0, 0, 0, 0, 8700, 0, 0, - 68363, 10426, 0, 71091, 10362, 0, 1715, 0, 0, 64918, 0, 43278, 42635, 0, - 0, 65275, 0, 0, 0, 0, 0, 1607, 466, 118949, 0, 0, 127918, 6243, 983882, - 1350, 74195, 64420, 1993, 5362, 10666, 2708, 92471, 0, 13143, 234, 3199, - 0, 41268, 6334, 6250, 0, 0, 73750, 0, 73762, 10458, 0, 8576, 127136, 0, - 2704, 64953, 0, 68211, 8322, 0, 5753, 0, 2694, 0, 0, 2439, 65104, 69804, - 0, 303, 74625, 92622, 0, 2437, 0, 9817, 4844, 0, 0, 0, 0, 0, 121120, - 43292, 0, 2441, 0, 0, 0, 0, 0, 2451, 2714, 0, 0, 43379, 127984, 74541, - 753, 5849, 0, 43089, 0, 0, 119534, 0, 0, 0, 0, 2726, 3107, 0, 0, 64937, - 0, 78841, 1408, 0, 4607, 0, 181, 0, 67728, 9539, 0, 0, 65201, 121121, - 92973, 64185, 4142, 64183, 0, 0, 0, 9706, 64178, 64177, 64176, 0, 64182, - 64181, 64180, 64179, 11401, 125124, 0, 1822, 0, 128581, 68055, 3865, - 122918, 0, 10500, 129602, 119024, 0, 110732, 9830, 0, 0, 0, 65131, 0, 0, - 0, 0, 74608, 9567, 0, 9599, 8748, 0, 0, 9557, 0, 0, 0, 11494, 0, 0, - 10865, 0, 43279, 64186, 68521, 0, 64191, 64190, 8898, 64188, 129153, - 41030, 78836, 0, 0, 78820, 126100, 0, 78805, 78806, 78801, 78802, 6745, - 78800, 0, 0, 0, 110866, 0, 0, 73679, 67838, 41039, 78809, 0, 0, 0, 0, - 110869, 127045, 110867, 110868, 127039, 4400, 0, 64207, 10275, 8925, - 10371, 10307, 64202, 4248, 0, 72802, 4541, 6299, 64204, 64203, 64201, - 64200, 64199, 64198, 126471, 0, 0, 0, 64193, 64192, 0, 9943, 64197, - 64196, 64195, 64194, 13282, 42652, 64174, 64173, 83495, 846, 72337, 9965, - 74495, 72330, 83493, 83494, 2543, 12163, 64170, 83490, 64167, 64166, - 64165, 64164, 72333, 0, 64169, 64168, 64949, 0, 10251, 10247, 64163, - 64162, 2295, 43299, 43301, 129363, 0, 70791, 0, 0, 550, 9910, 0, 0, - 66579, 0, 0, 0, 9504, 0, 0, 10373, 0, 0, 10261, 10253, 7821, 10277, 0, - 74823, 1552, 0, 0, 129420, 0, 121435, 19910, 0, 0, 118849, 121150, 0, - 43985, 68051, 0, 69890, 121329, 78355, 983757, 0, 66405, 2431, 3744, - 66852, 1809, 0, 0, 0, 73759, 1264, 0, 78676, 11697, 121278, 9785, 64716, - 0, 0, 0, 0, 121307, 0, 0, 42609, 128388, 0, 66912, 127016, 0, 983885, - 74229, 0, 6487, 93798, 70743, 0, 0, 0, 83484, 83485, 83486, 83487, 83480, - 8355, 7854, 83483, 954, 64927, 0, 41045, 0, 41438, 0, 0, 10711, 0, 0, 0, - 0, 64774, 13309, 10947, 66727, 0, 0, 0, 66795, 0, 0, 0, 0, 0, 0, 0, - 120634, 69228, 0, 0, 0, 0, 0, 0, 3060, 83478, 9986, 0, 83473, 83474, - 11698, 77880, 83469, 9916, 11701, 83472, 42586, 0, 8320, 0, 119095, 0, 0, - 1477, 43289, 0, 74358, 10884, 69446, 9908, 0, 0, 0, 3414, 74304, 0, 0, 0, - 0, 2110, 0, 68306, 0, 74532, 0, 0, 0, 0, 7164, 0, 0, 0, 11950, 5392, - 42248, 65129, 68656, 5397, 129579, 0, 68136, 0, 0, 5395, 72870, 5393, - 354, 68615, 0, 0, 0, 0, 0, 126236, 0, 0, 626, 0, 5895, 0, 0, 5780, 0, - 66407, 10220, 0, 71121, 43297, 0, 0, 11468, 64436, 0, 0, 0, 73818, 3918, - 0, 3797, 72786, 0, 0, 4140, 0, 71254, 0, 9030, 813, 0, 68131, 4146, - 119957, 5360, 0, 129498, 0, 0, 6249, 0, 0, 0, 0, 0, 73092, 0, 4911, 988, - 0, 73125, 0, 42948, 0, 0, 0, 0, 74972, 0, 0, 0, 9825, 0, 0, 12803, - 126977, 11032, 67654, 6244, 0, 0, 68662, 0, 129351, 0, 72131, 4169, 0, 0, - 0, 0, 121410, 120657, 0, 0, 68657, 128943, 78496, 0, 0, 5898, 74540, 0, - 41856, 93056, 917865, 125000, 127373, 83424, 83425, 83426, 73736, 83420, - 68870, 6448, 6835, 0, 4831, 83418, 83419, 67731, 0, 0, 0, 0, 0, 0, 0, - 78499, 0, 0, 0, 43288, 0, 0, 0, 0, 0, 43418, 0, 0, 0, 7876, 68132, - 917872, 0, 917870, 43378, 0, 0, 120890, 5892, 43605, 0, 0, 0, 129058, 0, - 0, 6251, 83409, 83410, 83411, 83412, 126512, 0, 71092, 83408, 10114, 0, - 0, 5387, 0, 0, 0, 0, 65553, 78346, 1747, 917849, 65109, 69240, 917852, - 126509, 0, 0, 0, 0, 125065, 0, 9850, 0, 367, 1472, 917859, 6687, 0, 0, - 5905, 12339, 8919, 73953, 65680, 0, 0, 78664, 0, 9134, 0, 78666, 43011, - 0, 126626, 0, 0, 0, 43013, 10614, 0, 0, 83413, 66646, 83415, 83416, 0, - 73881, 43012, 121127, 83293, 54, 43009, 73885, 0, 6211, 0, 0, 83295, - 68119, 43008, 10758, 0, 0, 0, 0, 0, 70018, 0, 0, 0, 0, 12765, 0, 0, 0, 0, - 126580, 0, 0, 43657, 0, 0, 0, 983718, 0, 83405, 917843, 0, 0, 83401, - 83402, 83403, 83404, 83397, 11363, 12057, 83400, 1567, 0, 0, 83396, 0, - 8957, 4139, 0, 0, 129336, 0, 0, 12740, 0, 92195, 12761, 127793, 12759, 0, - 72304, 67169, 83467, 44002, 0, 83462, 83463, 83464, 12755, 12762, 41022, - 67690, 64217, 476, 0, 983715, 0, 64212, 41020, 1382, 64209, 64216, 64215, - 64214, 64213, 0, 0, 0, 67584, 8720, 3908, 0, 0, 0, 0, 129434, 129576, 0, - 0, 3849, 92324, 94026, 9778, 917906, 5891, 917912, 55, 917910, 917911, 0, - 0, 7935, 67586, 0, 1114, 92599, 67585, 78675, 0, 83447, 83449, 0, 0, 0, - 64717, 0, 0, 0, 66884, 6292, 65303, 0, 6452, 917886, 917887, 66249, - 917885, 917890, 917891, 917888, 719, 0, 0, 917892, 0, 0, 0, 94083, 10868, - 121333, 2349, 5902, 917896, 6335, 917902, 917899, 917900, 0, 64369, 0, 0, - 0, 69245, 0, 126564, 0, 0, 128565, 0, 0, 0, 0, 0, 6454, 1229, 83457, - 83458, 83450, 83451, 83452, 65100, 120508, 8224, 917873, 917874, 917879, - 917880, 917877, 917878, 128929, 0, 917881, 917882, 5365, 67836, 8901, 0, - 0, 0, 0, 0, 5925, 83436, 64330, 128400, 83431, 83432, 83433, 83434, + 11844, 121209, 8863, 0, 75061, 71978, 6389, 0, 42371, 83205, 8790, + 120911, 0, 111125, 71168, 8869, 0, 0, 42060, 0, 9648, 111123, 71170, + 10270, 10286, 10318, 10382, 43529, 0, 0, 0, 0, 0, 70110, 43835, 119520, + 70111, 119360, 118815, 127084, 127083, 8767, 0, 128437, 41281, 0, 5201, + 0, 6215, 67072, 6214, 13101, 0, 0, 65268, 67073, 0, 0, 127976, 72995, + 127073, 10511, 42075, 0, 127071, 129509, 0, 67115, 127069, 111293, + 127068, 0, 127067, 0, 74845, 0, 42071, 43156, 0, 0, 0, 0, 7954, 0, 0, 0, + 8485, 4671, 0, 917574, 4740, 0, 0, 42618, 78294, 3064, 6212, 0, 0, 0, + 9554, 0, 83044, 0, 126598, 0, 78291, 0, 6213, 12885, 0, 129086, 64720, 0, + 983907, 0, 0, 0, 11430, 0, 7518, 9317, 0, 3729, 10406, 0, 119259, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 73825, 0, 0, 129599, 8786, 10390, 0, 0, 917601, + 93034, 0, 7924, 0, 43307, 0, 0, 0, 0, 0, 0, 118843, 9623, 435, 0, 0, + 12893, 8093, 9079, 0, 0, 0, 0, 0, 64430, 0, 10294, 10326, 0, 0, 0, 0, 0, + 0, 3623, 125188, 83378, 0, 43197, 0, 0, 0, 78296, 0, 0, 0, 7914, 0, + 92170, 0, 2624, 0, 0, 0, 120859, 67110, 11058, 0, 67107, 0, 0, 0, 0, + 120793, 0, 0, 6717, 10619, 0, 0, 0, 11832, 128664, 0, 0, 0, 70202, 0, 0, + 0, 3232, 73824, 74581, 0, 0, 0, 41889, 0, 0, 1161, 41895, 74103, 9701, 0, + 0, 129385, 73819, 120588, 5012, 0, 41362, 0, 68507, 0, 0, 0, 0, 0, 41364, + 0, 0, 41352, 41361, 0, 41366, 0, 70129, 129065, 917, 0, 119934, 119923, + 92421, 119912, 0, 119924, 119916, 0, 71482, 0, 0, 0, 125136, 128583, 0, + 7022, 0, 4739, 0, 5802, 9816, 8615, 0, 0, 491, 65837, 0, 0, 128644, 0, + 8426, 11092, 9891, 0, 0, 0, 41881, 118823, 3736, 7394, 42648, 0, 68448, + 9095, 7741, 12684, 41885, 0, 0, 0, 0, 5815, 0, 0, 0, 127392, 0, 0, 41878, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120804, 0, 0, 2267, 0, 78289, 78359, 78288, + 0, 0, 78318, 65920, 0, 0, 7057, 9408, 9409, 9410, 9411, 9412, 9413, 9414, + 9415, 9416, 9417, 9418, 9419, 9420, 9421, 5897, 9423, 917933, 127107, 0, + 127108, 917937, 127963, 8955, 9399, 9400, 9401, 9402, 9403, 9404, 9405, + 9406, 9407, 0, 128626, 42669, 73832, 78261, 67683, 2631, 119308, 78259, + 0, 78260, 3996, 0, 119307, 0, 0, 0, 0, 0, 0, 64825, 917916, 917913, + 917914, 917919, 5899, 917917, 129990, 12085, 0, 574, 917922, 77825, + 73828, 9473, 77824, 118918, 73900, 41735, 42211, 0, 4190, 77834, 77835, + 77830, 77833, 3616, 77828, 77837, 77838, 7708, 77836, 2228, 113765, 0, 0, + 4191, 0, 77844, 73800, 77842, 77843, 77839, 77840, 0, 78311, 83375, 0, 0, + 10415, 74102, 0, 5896, 0, 10351, 67151, 0, 73829, 0, 127159, 0, 73998, + 41355, 42883, 70736, 71212, 8021, 0, 119150, 983713, 41357, 8011, 42885, + 42887, 41354, 0, 0, 10026, 5472, 120554, 1191, 101217, 5470, 128784, + 5476, 101216, 0, 0, 0, 42874, 78281, 42876, 6304, 78283, 0, 2675, 120690, + 0, 0, 128954, 0, 0, 5478, 5904, 0, 0, 0, 7291, 77848, 43761, 13067, 0, 0, + 119271, 120360, 69731, 77856, 77857, 77854, 77855, 77852, 77853, 77850, + 10750, 43714, 77858, 0, 0, 0, 12887, 120364, 127745, 77866, 77867, 77864, + 77865, 9929, 5199, 77859, 1120, 0, 0, 0, 9486, 7554, 0, 77868, 72832, 0, + 0, 5894, 70069, 0, 0, 92511, 70358, 1323, 13162, 120937, 0, 0, 0, 77881, + 66022, 0, 72857, 0, 0, 0, 0, 0, 1142, 0, 8271, 0, 0, 126645, 12903, + 43622, 4002, 0, 10442, 10676, 120368, 0, 120369, 0, 0, 0, 0, 66642, 1277, + 0, 7871, 0, 0, 78853, 0, 119015, 0, 0, 11784, 0, 78012, 4700, 0, 78858, + 0, 78855, 0, 0, 92400, 77879, 19932, 77876, 77877, 74804, 77874, 77869, + 77871, 0, 71487, 43118, 0, 0, 6774, 6773, 0, 194684, 10346, 10410, 78860, + 118974, 0, 101197, 6108, 0, 110612, 0, 0, 0, 121309, 74166, 124973, 0, 0, + 0, 69407, 0, 70357, 0, 0, 74217, 0, 64698, 4192, 9289, 0, 0, 128847, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11603, 0, 0, 101166, 82976, 0, 0, 67812, 0, + 101163, 0, 42572, 0, 128300, 119146, 1963, 11622, 0, 43237, 82981, 7550, + 67100, 5903, 82984, 78009, 129750, 9662, 0, 128391, 0, 0, 0, 0, 11013, 0, + 0, 0, 128433, 67090, 0, 0, 0, 0, 0, 11568, 983685, 43367, 0, 0, 7852, 0, + 0, 0, 0, 0, 194676, 0, 194675, 0, 0, 416, 129668, 0, 73834, 0, 68921, + 10984, 0, 0, 101175, 129838, 101182, 0, 127013, 92423, 0, 983256, 121199, + 0, 0, 12540, 0, 0, 0, 0, 11445, 101168, 2112, 0, 0, 0, 1021, 0, 9507, + 10210, 78005, 8023, 93963, 78006, 78001, 43181, 78003, 9532, 119094, 0, + 0, 0, 0, 0, 1885, 43268, 129802, 129798, 120542, 121153, 392, 7894, 4391, + 129810, 8221, 119597, 77999, 77998, 0, 0, 0, 92967, 0, 3558, 0, 3913, + 70429, 121376, 0, 0, 1265, 0, 6309, 0, 12969, 0, 101151, 0, 101146, 0, + 101139, 0, 41864, 0, 0, 74294, 0, 167, 0, 917584, 0, 93983, 72354, 68477, + 0, 0, 917594, 0, 2493, 129827, 0, 129804, 0, 917570, 0, 0, 0, 406, + 917592, 0, 0, 0, 0, 0, 0, 0, 127161, 0, 128597, 0, 0, 0, 3421, 10561, 0, + 8365, 0, 0, 127569, 120787, 128669, 0, 0, 0, 0, 7834, 0, 0, 101154, + 10298, 6624, 4908, 0, 1639, 120842, 0, 0, 6327, 6724, 0, 0, 0, 69910, + 4817, 0, 0, 0, 68059, 0, 11022, 0, 0, 0, 118888, 0, 0, 7548, 64794, 0, + 12291, 983165, 0, 0, 0, 0, 0, 0, 1134, 1838, 0, 2057, 0, 0, 0, 0, 0, 0, + 5206, 0, 0, 42523, 0, 0, 0, 0, 65550, 8570, 4816, 0, 127926, 0, 4821, 0, + 0, 0, 4818, 125257, 119974, 119977, 0, 0, 119970, 119973, 0, 119983, + 119982, 119985, 119984, 119979, 119978, 0, 119980, 119670, 129297, 0, + 11284, 119987, 70097, 65155, 119988, 0, 9363, 0, 0, 0, 5900, 93990, 7889, + 2722, 128770, 0, 0, 0, 0, 2282, 0, 0, 0, 68093, 0, 0, 0, 0, 0, 70150, 0, + 0, 0, 0, 129651, 70146, 983079, 119967, 71330, 70148, 0, 0, 94006, 70144, + 119964, 110677, 110678, 110675, 110676, 0, 110674, 4226, 0, 123165, 5732, + 71327, 0, 0, 65119, 0, 0, 92971, 64770, 0, 0, 6093, 0, 0, 1395, 0, 0, 0, + 121179, 786, 0, 43174, 64340, 0, 125269, 0, 983643, 125138, 10132, 0, 0, + 0, 0, 0, 93956, 0, 68444, 0, 92437, 123143, 0, 0, 92656, 0, 0, 0, 1399, + 121463, 0, 121465, 121464, 120808, 241, 121469, 4907, 0, 0, 0, 0, 0, 0, + 0, 0, 127904, 0, 0, 42780, 0, 0, 0, 4217, 0, 0, 0, 0, 72158, 0, 0, 43099, + 3965, 0, 0, 0, 13300, 0, 0, 43057, 0, 0, 0, 0, 0, 65372, 0, 6410, 126073, + 125252, 70468, 0, 0, 0, 119558, 0, 0, 0, 0, 0, 0, 43188, 2626, 7762, 0, + 0, 0, 127183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67726, 0, 126993, 1542, 0, 0, + 92550, 0, 0, 74311, 0, 0, 10181, 2150, 0, 0, 0, 0, 0, 68053, 6029, 72852, + 0, 0, 0, 0, 8993, 0, 0, 0, 93968, 606, 0, 0, 0, 0, 4311, 0, 6027, 126615, + 4322, 0, 65207, 0, 0, 983901, 0, 0, 2735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 70806, 0, 0, 0, 92783, 0, 0, 65817, 55288, 127934, 66564, 8530, 0, + 7709, 0, 121202, 66560, 128528, 917595, 12876, 66561, 0, 121430, 983938, + 7789, 5855, 809, 0, 0, 72853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64386, 0, + 74909, 0, 120607, 66416, 83360, 6532, 0, 0, 0, 0, 128224, 0, 0, 0, 0, + 43091, 92287, 0, 0, 129312, 0, 0, 0, 11361, 0, 0, 8153, 128105, 0, 10741, + 0, 0, 0, 0, 0, 64706, 0, 0, 0, 78870, 9466, 78866, 9824, 0, 0, 0, 120977, + 915, 0, 0, 43865, 0, 0, 0, 67131, 70096, 67137, 0, 129614, 73648, 6730, + 78862, 68161, 0, 78861, 126542, 0, 0, 94010, 983683, 0, 0, 66043, 0, 0, + 43107, 0, 0, 92343, 0, 73879, 0, 0, 0, 6103, 0, 0, 92470, 0, 12889, 0, + 127137, 0, 0, 0, 0, 0, 0, 119262, 83028, 0, 0, 0, 69279, 0, 0, 0, 13118, + 7700, 917537, 9690, 0, 0, 68080, 512, 0, 72792, 0, 0, 77892, 632, 77890, + 77891, 42529, 0, 0, 0, 0, 0, 0, 0, 128273, 0, 0, 7379, 64581, 5386, 0, 0, + 10633, 72316, 64488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124956, 71307, 0, 0, 0, + 0, 0, 92370, 0, 0, 0, 0, 0, 71314, 1801, 0, 0, 120867, 0, 0, 77888, 2085, + 702, 77887, 77884, 77885, 13074, 77883, 66299, 0, 0, 12106, 0, 0, 1755, + 0, 77897, 77898, 1163, 3102, 77893, 77894, 0, 0, 0, 0, 69227, 0, 77901, + 77902, 77899, 77900, 65171, 0, 0, 0, 70157, 0, 0, 0, 0, 2908, 0, 11177, + 64902, 64950, 0, 128740, 66906, 124959, 70499, 0, 0, 0, 64352, 0, 125031, + 1007, 0, 9199, 0, 127371, 118992, 41890, 0, 2730, 119072, 0, 5428, 0, + 73771, 129993, 0, 0, 0, 71458, 0, 0, 0, 68089, 0, 44012, 0, 71456, 0, + 9158, 66878, 69905, 92440, 0, 101272, 0, 484, 0, 0, 0, 194742, 0, 0, 0, + 0, 572, 7041, 2736, 0, 0, 93962, 0, 68628, 0, 128727, 5438, 5222, 5381, + 43114, 0, 5193, 5125, 5456, 5509, 0, 120664, 113700, 0, 0, 0, 3430, 0, + 42905, 0, 74929, 6050, 0, 0, 129197, 0, 0, 10908, 0, 0, 0, 64617, 0, 0, + 3957, 0, 0, 0, 674, 0, 0, 2946, 5354, 5251, 5328, 5307, 3759, 72318, + 8364, 5123, 0, 5281, 5469, 5121, 0, 0, 0, 5130, 0, 129608, 0, 0, 0, 1221, + 2733, 0, 0, 0, 72321, 127245, 0, 0, 0, 101277, 0, 5939, 0, 0, 0, 71867, + 68400, 128216, 10321, 10289, 0, 10385, 123164, 0, 0, 0, 0, 118943, 0, + 11411, 0, 5938, 0, 120865, 0, 0, 10401, 10337, 0, 0, 0, 0, 0, 0, 0, + 71942, 0, 0, 12165, 0, 0, 9885, 0, 8077, 0, 127908, 0, 0, 0, 0, 129138, + 4220, 10725, 10433, 0, 68395, 4987, 64519, 0, 0, 0, 123626, 120356, 0, + 11733, 0, 120792, 0, 127233, 0, 0, 0, 92345, 68254, 983642, 77991, 0, + 2724, 0, 0, 12313, 110619, 515, 119947, 119944, 119945, 119942, 119943, + 119940, 119941, 119938, 8606, 4046, 4589, 4521, 0, 9141, 0, 0, 2741, 0, + 0, 1370, 0, 0, 0, 0, 0, 0, 66880, 0, 66003, 0, 64440, 0, 0, 69458, 0, + 11593, 68669, 68666, 68660, 0, 0, 2744, 72285, 68638, 0, 814, 0, 119962, + 119963, 119960, 119961, 101106, 43029, 119956, 11623, 119954, 11955, + 119952, 119953, 41986, 119951, 0, 120497, 4847, 110975, 0, 0, 0, 0, 1581, + 64920, 93830, 12954, 963, 110973, 110972, 110971, 110969, 5278, 110967, + 68621, 92222, 983449, 68625, 983447, 68617, 110960, 0, 101459, 101487, + 110964, 110963, 110962, 0, 0, 101464, 101483, 101463, 983438, 983435, + 92648, 127379, 0, 65137, 6483, 65392, 0, 4213, 129649, 41303, 0, 0, 0, + 41306, 983217, 2698, 0, 0, 0, 68396, 0, 41304, 824, 0, 78011, 72315, + 78894, 74827, 78892, 64804, 9820, 119820, 110985, 110976, 0, 6739, 0, + 5481, 3490, 110978, 110977, 71706, 69947, 67702, 9124, 12688, 119833, + 101496, 0, 101495, 119821, 119824, 68367, 42575, 101474, 101478, 119827, + 101481, 101476, 71087, 68658, 119946, 8025, 68630, 101490, 68675, 92445, + 71097, 69613, 0, 0, 0, 0, 983430, 2745, 11797, 110990, 983426, 9202, + 983424, 983425, 0, 0, 0, 10525, 5436, 74584, 110987, 110986, 121506, + 43080, 121508, 121507, 983415, 6246, 119958, 10921, 9723, 6777, 6776, + 6775, 0, 0, 70287, 92384, 0, 8669, 0, 0, 65093, 0, 78881, 2716, 0, 0, + 11252, 101475, 68369, 0, 11060, 12985, 2711, 78872, 78027, 78026, 7992, + 0, 0, 42938, 78033, 78032, 78877, 70724, 78029, 78028, 78031, 78030, + 64535, 110998, 10130, 110996, 0, 0, 111001, 111000, 127914, 983412, + 78014, 5713, 110995, 7570, 110993, 110992, 0, 11190, 129700, 9026, 0, + 74864, 7547, 78891, 0, 10008, 10222, 0, 129543, 9744, 0, 127193, 983408, + 119656, 983406, 94070, 983404, 983405, 983402, 9045, 78888, 4225, 78886, + 78887, 68757, 78885, 78882, 78883, 983397, 983398, 8405, 983396, 10423, + 10359, 983391, 983392, 0, 129149, 4215, 9789, 0, 4321, 12309, 983400, + 41313, 0, 5368, 66886, 0, 0, 5366, 0, 5372, 101482, 0, 0, 7720, 7390, + 2696, 0, 0, 8268, 0, 1790, 0, 0, 118977, 0, 0, 0, 5376, 1835, 72313, + 78704, 128089, 0, 0, 68655, 1180, 0, 0, 0, 0, 0, 0, 0, 9122, 0, 11928, 0, + 65283, 0, 101449, 5971, 101448, 43500, 1268, 65097, 983218, 0, 101445, 0, + 1427, 128440, 0, 5970, 3431, 72299, 101439, 101435, 983384, 983385, + 983382, 2738, 125066, 10455, 0, 74026, 0, 4222, 6240, 0, 119013, 983389, + 68377, 6248, 983373, 67815, 983371, 917907, 92582, 0, 101453, 125215, 0, + 2728, 65549, 64563, 101428, 101425, 101429, 128145, 0, 10713, 7166, + 119559, 2622, 101450, 0, 0, 0, 8954, 0, 94008, 2632, 42617, 10108, 1011, + 42852, 12080, 2709, 0, 5716, 0, 0, 0, 0, 127100, 69378, 0, 9515, 127098, + 66465, 6451, 0, 127097, 8918, 983556, 0, 0, 19950, 0, 0, 0, 44003, 0, 0, + 0, 0, 0, 0, 983495, 74022, 0, 128795, 68643, 67410, 0, 5721, 0, 0, 0, + 121074, 11267, 983364, 66464, 5720, 983363, 0, 4219, 5718, 8696, 5717, 0, + 983370, 983878, 983368, 541, 983366, 983367, 119948, 119089, 68389, + 983352, 119949, 56, 4216, 10577, 0, 0, 77849, 69620, 983357, 983358, + 66899, 983356, 0, 0, 67628, 0, 0, 7086, 0, 67998, 67621, 0, 2734, 69616, + 0, 67627, 118937, 0, 67625, 0, 0, 0, 42593, 0, 128217, 0, 0, 119939, 0, + 68180, 0, 0, 71104, 7442, 43665, 359, 41253, 68392, 6239, 120599, 41256, + 0, 67740, 111023, 111022, 111021, 9346, 69660, 41254, 0, 43291, 78002, 0, + 127024, 124993, 93841, 0, 0, 0, 4368, 983500, 0, 68137, 0, 0, 41024, 0, + 0, 121359, 121420, 0, 0, 0, 4223, 0, 8574, 83502, 0, 0, 0, 0, 0, 92718, + 983636, 70432, 128323, 68382, 0, 0, 0, 0, 0, 4144, 0, 83193, 6245, 0, + 2732, 92644, 0, 0, 0, 83501, 0, 0, 0, 128005, 0, 0, 129652, 983148, 3097, + 0, 0, 77996, 0, 0, 10863, 111020, 111019, 111018, 0, 111015, 111014, + 111013, 111012, 118964, 0, 10216, 64293, 0, 0, 69393, 128331, 12325, + 111010, 8717, 111008, 101413, 0, 101380, 0, 8700, 0, 101382, 68363, + 10426, 0, 71091, 10362, 0, 1715, 101378, 0, 64918, 101409, 43278, 42635, + 0, 0, 65275, 0, 0, 101319, 0, 0, 1607, 466, 118949, 0, 0, 127918, 6243, + 983882, 1350, 74195, 64420, 1993, 5362, 10666, 2708, 92471, 0, 13143, + 234, 3199, 0, 41268, 6334, 6250, 0, 0, 73750, 0, 73762, 10458, 0, 8576, + 127136, 0, 2704, 64953, 0, 68211, 8322, 0, 5753, 0, 2694, 0, 0, 2439, + 65104, 69804, 0, 303, 74625, 92622, 0, 2437, 0, 9817, 4844, 0, 0, 0, 0, + 0, 121120, 43292, 0, 2441, 0, 0, 0, 0, 0, 2451, 2714, 0, 0, 43379, + 127984, 74541, 753, 5849, 0, 43089, 0, 0, 119534, 0, 0, 0, 0, 2726, 3107, + 0, 0, 64937, 0, 78841, 1408, 0, 4607, 101299, 181, 0, 67728, 9539, 0, 0, + 65201, 121121, 92973, 64185, 4142, 64183, 0, 0, 0, 9706, 64178, 64177, + 64176, 0, 64182, 64181, 64180, 64179, 11401, 125124, 0, 1822, 0, 128581, + 68055, 3865, 122918, 0, 10500, 129602, 119024, 0, 110732, 9830, 0, 0, 0, + 65131, 0, 0, 0, 0, 74608, 9567, 0, 9599, 8748, 0, 0, 9557, 0, 0, 0, + 11494, 0, 0, 10865, 0, 43279, 64186, 68521, 0, 64191, 64190, 8898, 64188, + 129153, 41030, 78836, 0, 0, 78820, 126100, 0, 78805, 78806, 78801, 78802, + 6745, 78800, 0, 0, 0, 110866, 0, 0, 73679, 67838, 41039, 78809, 0, 0, + 129893, 0, 110869, 127045, 110867, 110868, 127039, 4400, 0, 64207, 10275, + 8925, 10371, 10307, 64202, 4248, 0, 72802, 4541, 6299, 64204, 64203, + 64201, 64200, 64199, 64198, 126471, 0, 0, 0, 64193, 64192, 0, 9943, + 64197, 64196, 64195, 64194, 13282, 42652, 64174, 64173, 83495, 846, + 72337, 9965, 74495, 72330, 83493, 83494, 2543, 12163, 64170, 83490, + 64167, 64166, 64165, 64164, 72333, 0, 64169, 64168, 64949, 0, 10251, + 10247, 64163, 64162, 2295, 43299, 43301, 129363, 0, 70791, 0, 0, 550, + 9910, 0, 0, 66579, 0, 0, 0, 9504, 0, 0, 10373, 0, 0, 10261, 10253, 7821, + 10277, 0, 74823, 1552, 0, 0, 129389, 0, 121435, 19910, 0, 0, 118849, + 121150, 0, 43985, 68051, 0, 69890, 121329, 78355, 983757, 0, 66405, 2431, + 3744, 66852, 1809, 0, 0, 0, 73759, 1264, 0, 78676, 11697, 121278, 9785, + 64716, 0, 0, 0, 0, 121307, 0, 0, 42609, 128388, 0, 66912, 127016, 0, + 983885, 74229, 0, 6487, 93798, 70743, 0, 0, 0, 83484, 83485, 83486, + 83487, 83480, 8355, 7854, 83483, 954, 64927, 0, 41045, 0, 41438, 0, 0, + 10711, 0, 0, 0, 0, 64774, 13309, 10947, 66727, 101426, 0, 0, 66795, 0, 0, + 0, 0, 0, 0, 0, 120634, 69228, 0, 0, 0, 0, 0, 0, 3060, 83478, 9986, 0, + 83473, 83474, 11698, 77880, 83469, 9916, 11701, 83472, 42586, 0, 8320, 0, + 119095, 0, 0, 1477, 43289, 0, 74358, 10884, 69446, 9908, 0, 0, 0, 3414, + 74304, 0, 0, 0, 0, 2110, 0, 68306, 0, 74532, 0, 129865, 0, 0, 7164, 0, 0, + 0, 11950, 5392, 42248, 65129, 68656, 5397, 129579, 0, 68136, 0, 0, 5395, + 72870, 5393, 354, 68615, 0, 0, 0, 0, 0, 126236, 0, 0, 626, 0, 5895, 0, 0, + 5780, 0, 66407, 10220, 0, 71121, 43297, 0, 0, 11468, 64436, 0, 0, 0, + 73818, 3918, 0, 3797, 72786, 0, 0, 4140, 0, 71254, 0, 9030, 813, 0, + 68131, 4146, 119957, 5360, 0, 129498, 0, 0, 6249, 0, 0, 0, 0, 0, 73092, + 0, 4911, 988, 0, 73125, 0, 42948, 0, 0, 0, 0, 74972, 0, 0, 0, 9825, 0, 0, + 12803, 126977, 11032, 67654, 6244, 0, 0, 68662, 0, 129351, 0, 72131, + 4169, 0, 0, 0, 129986, 121410, 120657, 0, 0, 68657, 128943, 78496, 0, 0, + 5898, 74540, 0, 41856, 93056, 194926, 125000, 127373, 83424, 83425, + 83426, 73736, 83420, 68870, 6448, 6835, 0, 4831, 83418, 83419, 67731, 0, + 0, 0, 0, 0, 0, 0, 78499, 0, 0, 0, 43288, 0, 0, 0, 0, 0, 43418, 0, 0, 0, + 7876, 68132, 917872, 0, 917870, 43378, 0, 0, 120890, 5892, 43605, 0, 0, + 0, 129058, 0, 0, 6251, 83409, 83410, 83411, 83412, 126512, 0, 71092, + 83408, 10114, 0, 0, 5387, 0, 0, 0, 0, 65553, 78346, 1747, 917849, 65109, + 69240, 917852, 126509, 0, 0, 0, 0, 125065, 0, 9850, 0, 367, 1472, 917859, + 6687, 0, 0, 5905, 12339, 8919, 73953, 65680, 0, 0, 78664, 0, 9134, 0, + 78666, 43011, 0, 126626, 0, 0, 0, 43013, 10614, 0, 0, 83413, 66646, + 83415, 83416, 0, 73881, 43012, 121127, 83293, 54, 43009, 73885, 0, 6211, + 0, 0, 83295, 68119, 43008, 10758, 0, 0, 0, 0, 0, 70018, 0, 0, 0, 0, + 12765, 0, 0, 0, 0, 126580, 0, 0, 43657, 0, 0, 0, 983718, 0, 83405, + 917843, 0, 0, 83401, 83402, 83403, 83404, 83397, 11363, 12057, 83400, + 1567, 0, 0, 83396, 0, 8957, 4139, 0, 0, 129336, 0, 0, 12740, 0, 92195, + 12761, 127793, 12759, 0, 72304, 67169, 83467, 44002, 0, 83462, 83463, + 83464, 12755, 12762, 41022, 67690, 64217, 476, 0, 983715, 0, 64212, + 41020, 1382, 64209, 64216, 64215, 64214, 64213, 0, 0, 0, 67584, 8720, + 3908, 0, 0, 0, 0, 101529, 129576, 0, 0, 3849, 92324, 94026, 9778, 917906, + 5891, 917912, 55, 917910, 917911, 0, 0, 7935, 67586, 0, 1114, 92599, + 67585, 78675, 0, 83447, 83449, 0, 0, 0, 64717, 0, 0, 0, 66884, 6292, + 65303, 0, 6452, 917886, 917887, 66249, 917885, 917890, 917891, 917888, + 719, 101446, 0, 917892, 0, 0, 0, 94083, 10868, 121333, 2349, 5902, + 917896, 6335, 917902, 917899, 917900, 0, 64369, 0, 0, 0, 69245, 0, + 126564, 0, 0, 128565, 0, 0, 0, 0, 0, 6454, 1229, 83457, 83458, 83450, + 83451, 83452, 65100, 120508, 8224, 917873, 917874, 917879, 917880, + 917877, 917878, 128929, 0, 917881, 917882, 5365, 67836, 8901, 0, 0, + 129951, 0, 69257, 5925, 83436, 64330, 128400, 83431, 83432, 83433, 83434, 83427, 83428, 83429, 83430, 64928, 10543, 0, 0, 83446, 414, 0, 0, 83442, 6456, 83444, 83445, 11905, 83439, 66284, 83441, 0, 68337, 0, 83437, 43832, 983139, 9751, 0, 128085, 11770, 0, 0, 69600, 65061, 0, 0, 0, 0, 0, - 0, 121087, 0, 0, 69924, 0, 0, 0, 69913, 0, 121387, 0, 0, 0, 42038, 387, - 0, 12737, 0, 0, 43368, 0, 0, 0, 0, 0, 129449, 121295, 0, 69400, 127309, - 0, 375, 0, 0, 0, 983886, 0, 0, 119202, 119203, 0, 43120, 0, 0, 119196, - 119197, 0, 4529, 119200, 119201, 119198, 119199, 0, 0, 69698, 13150, - 64492, 0, 0, 0, 0, 0, 42891, 66327, 74298, 0, 0, 0, 2587, 42193, 0, 6455, - 0, 4241, 0, 0, 0, 0, 0, 0, 0, 118821, 0, 0, 0, 125030, 0, 128684, 129390, - 0, 5373, 0, 0, 119232, 10015, 0, 0, 0, 68642, 0, 120855, 42040, 128827, - 5779, 0, 42037, 83282, 0, 0, 93040, 83283, 0, 0, 127320, 6983, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 119588, 0, 92495, 74558, 0, 68138, 70163, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11144, 0, 2551, 0, 6453, 0, 6235, 0, 0, 129081, 72886, - 44020, 11826, 0, 7780, 5369, 118958, 0, 0, 5367, 66870, 0, 0, 5377, 0, - 68143, 128624, 78245, 5218, 0, 127333, 0, 0, 0, 0, 0, 1300, 0, 127334, - 64505, 0, 0, 119624, 1465, 0, 0, 0, 0, 0, 0, 0, 113694, 10729, 0, 0, - 8839, 119243, 0, 7785, 126530, 0, 0, 0, 0, 126603, 0, 0, 0, 3897, 0, - 92331, 74417, 113704, 0, 68127, 71425, 70688, 0, 0, 0, 0, 0, 3542, 0, - 120685, 7951, 68152, 118857, 0, 92972, 0, 0, 127311, 73683, 0, 65150, - 68031, 0, 0, 0, 0, 9985, 0, 127328, 0, 0, 0, 0, 10830, 0, 615, 64490, - 7574, 0, 0, 0, 12909, 73698, 64559, 127332, 73951, 0, 67996, 2020, 0, 0, - 0, 120701, 0, 983640, 0, 0, 0, 92991, 0, 0, 9070, 0, 68411, 11281, 42829, - 0, 1033, 0, 0, 0, 0, 0, 65226, 0, 0, 0, 0, 0, 3450, 0, 7397, 0, 0, 42778, - 10000, 41088, 449, 0, 0, 68458, 113725, 0, 0, 10738, 69634, 0, 0, 41085, - 0, 0, 0, 12764, 0, 93058, 3596, 7322, 0, 0, 0, 0, 0, 0, 0, 0, 2092, 0, 0, - 0, 121350, 10820, 0, 0, 126567, 1853, 0, 0, 93014, 0, 12770, 0, 0, - 124997, 0, 0, 0, 0, 0, 129053, 4828, 1258, 0, 2006, 0, 0, 74285, 127987, - 0, 120683, 122880, 983881, 983884, 8846, 128255, 0, 128091, 2650, 9182, - 1961, 121399, 11525, 0, 1959, 0, 55228, 11774, 41016, 0, 0, 128054, - 41017, 13109, 0, 10519, 66331, 3454, 19930, 0, 41019, 92894, 0, 0, 78362, - 41021, 0, 0, 0, 0, 0, 65531, 0, 0, 0, 0, 0, 0, 8865, 6402, 113827, 77923, - 0, 127924, 0, 7733, 0, 4998, 68493, 0, 0, 0, 4268, 0, 0, 0, 0, 128718, - 10881, 0, 0, 0, 0, 2014, 0, 71901, 0, 0, 195057, 0, 0, 78357, 65281, 0, - 0, 0, 0, 0, 2015, 0, 0, 71840, 66318, 74824, 0, 0, 0, 0, 0, 70061, 8094, - 10135, 0, 0, 794, 0, 0, 66335, 0, 121303, 4343, 0, 4833, 0, 0, 0, 0, 189, - 12611, 0, 72215, 0, 4838, 126214, 4834, 65078, 0, 126104, 4837, 118853, - 0, 121230, 4832, 128271, 0, 0, 127838, 0, 0, 0, 0, 0, 0, 0, 3976, 118995, - 128937, 0, 0, 0, 0, 0, 119010, 0, 121015, 0, 0, 0, 0, 2871, 0, 0, 999, 0, - 68177, 0, 0, 2017, 0, 67824, 0, 0, 0, 0, 0, 0, 4775, 12555, 12571, 12550, - 12583, 12560, 2019, 12556, 12584, 12586, 0, 12562, 12561, 12566, 12569, - 12554, 0, 83344, 0, 68882, 0, 12567, 1402, 0, 0, 83348, 125072, 83347, 0, - 83346, 0, 0, 0, 0, 64391, 0, 83341, 69602, 0, 1999, 0, 128141, 0, 0, 0, - 0, 0, 0, 0, 68873, 0, 0, 66913, 2377, 0, 0, 12572, 11318, 12557, 12559, - 9192, 12549, 12568, 2373, 9446, 9447, 9448, 9449, 0, 9480, 481, 0, 9438, - 9439, 9440, 9441, 9442, 9443, 9444, 9445, 9430, 9431, 9432, 9433, 9434, - 9435, 9436, 9437, 983097, 0, 9424, 9425, 9426, 9427, 9428, 7481, 0, 2362, - 9655, 0, 2004, 0, 9782, 0, 0, 0, 0, 0, 0, 0, 1108, 0, 92461, 0, 0, 0, - 64781, 0, 0, 0, 121126, 0, 1392, 0, 0, 917557, 0, 8065, 70710, 128739, 0, - 0, 0, 121068, 92418, 0, 0, 0, 43280, 0, 70718, 1812, 0, 73046, 0, 0, 0, - 0, 0, 6054, 10697, 3169, 0, 0, 70720, 11487, 70712, 0, 0, 0, 194716, 0, - 0, 41863, 0, 0, 2304, 0, 92326, 0, 118792, 0, 0, 64760, 11766, 0, 0, 0, - 0, 69236, 0, 0, 8773, 10733, 36, 0, 0, 0, 0, 0, 11074, 0, 64910, 983130, - 2009, 0, 0, 128036, 68114, 128906, 0, 0, 0, 0, 12852, 3031, 0, 0, 129088, - 0, 66414, 0, 0, 119950, 42613, 65933, 366, 0, 9892, 0, 11754, 0, 83329, - 65301, 44013, 83058, 67245, 10102, 0, 7739, 41026, 0, 0, 0, 0, 0, 0, 0, - 0, 78386, 129475, 71868, 113811, 13081, 10923, 129330, 0, 68145, 0, 0, - 74083, 0, 0, 128392, 83063, 83065, 0, 70706, 0, 0, 0, 70168, 66586, 4183, - 64967, 66250, 0, 92547, 0, 0, 113685, 0, 3792, 2011, 0, 0, 126503, 83332, - 0, 120595, 0, 68489, 41023, 0, 0, 11659, 7922, 12614, 2005, 8523, 0, 0, - 7513, 1863, 129436, 83337, 128969, 0, 120274, 120033, 0, 8144, 0, 73031, - 120269, 127524, 120270, 42241, 8783, 83326, 0, 0, 120735, 983959, 0, - 129367, 0, 10680, 0, 43293, 68771, 0, 119164, 83320, 92467, 10187, 0, 0, - 0, 83315, 0, 0, 0, 10968, 43296, 0, 0, 0, 0, 0, 1005, 43826, 120030, 0, - 2870, 0, 113759, 0, 0, 0, 0, 235, 1384, 0, 74887, 70494, 120409, 0, 9796, - 69895, 983812, 0, 0, 13186, 120407, 0, 0, 0, 0, 42527, 12911, 43427, - 1383, 0, 0, 0, 0, 6156, 68117, 0, 7993, 4288, 0, 0, 13238, 13244, 0, 0, - 120426, 13234, 120427, 0, 118904, 0, 11364, 0, 1380, 65617, 120253, - 120261, 13196, 13197, 120311, 120419, 9495, 0, 0, 120418, 0, 73976, - 128160, 0, 6941, 0, 13205, 13211, 5801, 0, 74271, 120319, 0, 120302, - 7670, 0, 68075, 983587, 0, 19957, 72314, 2021, 93811, 43877, 0, 0, 0, 0, - 3875, 0, 64341, 0, 9814, 43457, 13066, 3314, 7787, 0, 0, 0, 0, 0, 0, - 64531, 0, 0, 0, 0, 0, 0, 127138, 0, 0, 9742, 0, 0, 10800, 0, 8404, 0, - 92592, 0, 7089, 0, 78545, 0, 0, 0, 0, 0, 4772, 5771, 0, 0, 9841, 8843, 0, - 0, 0, 0, 120816, 0, 123137, 0, 0, 0, 0, 0, 0, 8849, 0, 0, 65112, 1796, 0, - 0, 69665, 8164, 41301, 3502, 0, 122884, 128387, 0, 983816, 5825, 0, 0, 0, - 0, 121322, 10983, 10354, 10418, 0, 2022, 0, 1409, 100789, 0, 0, 0, 0, - 1390, 0, 0, 10471, 65904, 5846, 126472, 0, 0, 0, 0, 0, 0, 66035, 0, 0, 0, - 0, 128190, 0, 3168, 67733, 0, 0, 2370, 0, 126243, 0, 195049, 0, 0, 1836, - 0, 121207, 119137, 118959, 125232, 0, 0, 0, 2390, 3944, 0, 0, 0, 0, - 69908, 125011, 0, 0, 123200, 0, 0, 8975, 64739, 0, 0, 0, 0, 64409, 0, 0, - 0, 0, 128564, 0, 0, 0, 0, 6204, 0, 0, 0, 10911, 64954, 119003, 74809, - 118903, 4267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92887, 0, 0, 0, 0, 121125, 0, + 0, 121087, 0, 0, 69924, 0, 0, 0, 69913, 0, 121387, 101513, 101504, + 101512, 42038, 387, 0, 12737, 0, 0, 43368, 0, 0, 0, 0, 129713, 129449, + 121295, 0, 69400, 127309, 0, 375, 0, 0, 0, 983886, 0, 0, 119202, 119203, + 0, 43120, 0, 0, 119196, 119197, 0, 4529, 119200, 119201, 119198, 119199, + 0, 0, 69698, 13150, 64492, 0, 0, 0, 0, 0, 42891, 66327, 74298, 0, 0, 0, + 2587, 42193, 0, 6455, 0, 4241, 0, 0, 0, 0, 0, 0, 0, 118821, 0, 0, 0, + 125030, 0, 128684, 129390, 0, 5373, 0, 0, 119232, 10015, 0, 0, 0, 68642, + 0, 120855, 42040, 128827, 5779, 129841, 42037, 83282, 0, 0, 93040, 83283, + 101116, 0, 101117, 6983, 0, 0, 101115, 0, 0, 0, 0, 101111, 0, 119588, 0, + 92495, 74558, 0, 68138, 70163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11144, 0, + 2551, 0, 6453, 0, 6235, 0, 0, 129081, 72886, 44020, 11826, 0, 7780, 5369, + 118958, 0, 0, 5367, 66870, 0, 0, 5377, 0, 68143, 128624, 78245, 5218, 0, + 127333, 0, 0, 129717, 0, 0, 1300, 0, 127334, 64505, 0, 0, 119624, 1465, + 0, 0, 0, 0, 0, 101109, 0, 113694, 10729, 0, 0, 8839, 119243, 0, 7785, + 126530, 0, 0, 0, 0, 126603, 0, 0, 0, 3897, 0, 92331, 74417, 113704, 0, + 68127, 71425, 70688, 0, 0, 0, 0, 69287, 3542, 0, 120685, 7951, 68152, + 118857, 0, 92972, 0, 0, 127311, 73683, 0, 65150, 68031, 0, 0, 0, 0, 9985, + 0, 127328, 0, 0, 0, 0, 10830, 0, 615, 64490, 7574, 0, 0, 0, 12909, 73698, + 64559, 127332, 73951, 0, 67996, 2020, 0, 0, 0, 120701, 0, 983640, 0, 0, + 0, 92991, 0, 0, 9070, 0, 68411, 11281, 42829, 0, 1033, 0, 0, 0, 0, 0, + 65226, 0, 0, 0, 0, 0, 3450, 0, 7397, 0, 0, 42778, 10000, 41088, 449, 0, + 0, 68458, 113725, 0, 0, 10738, 69634, 0, 0, 41085, 0, 0, 0, 12764, 0, + 93058, 3596, 7322, 0, 0, 0, 0, 0, 0, 0, 0, 2092, 0, 0, 0, 121350, 10820, + 0, 0, 126567, 1853, 0, 0, 93014, 0, 12770, 0, 0, 124997, 0, 0, 0, 0, 0, + 129053, 4828, 1258, 0, 2006, 0, 0, 74285, 127987, 0, 120683, 122880, + 983881, 983884, 8846, 128255, 0, 128091, 2650, 9182, 1961, 121399, 11525, + 0, 1959, 0, 55228, 11774, 41016, 0, 0, 128054, 41017, 13109, 0, 10519, + 66331, 3454, 19930, 0, 41019, 92894, 0, 0, 78362, 41021, 101566, 0, 0, 0, + 0, 65531, 0, 0, 0, 0, 0, 0, 8865, 6402, 113827, 77923, 0, 101536, 0, + 7733, 0, 4998, 68493, 0, 0, 0, 4268, 101368, 0, 0, 101555, 101579, 10881, + 0, 0, 0, 0, 2014, 0, 71901, 0, 0, 195057, 0, 0, 78357, 65281, 0, 0, 0, 0, + 0, 2015, 0, 0, 71840, 66318, 74824, 101575, 0, 101574, 0, 0, 70061, 8094, + 10135, 101551, 0, 794, 0, 0, 66335, 0, 121303, 4343, 0, 4833, 0, 0, 0, 0, + 189, 12611, 0, 72215, 0, 4838, 126214, 4834, 65078, 0, 126104, 4837, + 118853, 0, 121230, 4832, 128271, 0, 101584, 127838, 0, 0, 0, 0, 0, 0, 0, + 3976, 118995, 128937, 0, 0, 0, 0, 0, 119010, 0, 121015, 0, 0, 0, 0, 2871, + 0, 0, 999, 0, 68177, 0, 0, 2017, 0, 67824, 0, 0, 0, 0, 0, 0, 4775, 12555, + 12571, 12550, 12583, 12560, 2019, 12556, 12584, 12586, 0, 12562, 12561, + 12566, 12569, 12554, 0, 83344, 0, 68882, 0, 12567, 1402, 0, 0, 83348, + 125072, 83347, 0, 83346, 0, 0, 0, 0, 64391, 0, 83341, 69602, 0, 1999, 0, + 128141, 0, 0, 0, 0, 0, 0, 0, 68873, 0, 0, 66913, 2377, 0, 0, 12572, + 11318, 12557, 12559, 9192, 12549, 12568, 2373, 9446, 9447, 9448, 9449, 0, + 9480, 481, 0, 9438, 9439, 9440, 9441, 9442, 9443, 9444, 9445, 9430, 9431, + 9432, 9433, 9434, 9435, 9436, 9437, 983097, 0, 9424, 9425, 9426, 9427, + 9428, 7481, 0, 2362, 9655, 0, 2004, 0, 9782, 0, 0, 0, 0, 0, 0, 0, 1108, + 0, 92461, 0, 128764, 0, 64781, 0, 0, 0, 121126, 0, 1392, 0, 0, 917557, 0, + 8065, 70710, 128739, 0, 0, 0, 121068, 92418, 0, 0, 0, 43280, 0, 70718, + 1812, 0, 73046, 0, 0, 0, 0, 0, 6054, 10697, 3169, 0, 0, 70720, 11487, + 70712, 0, 0, 0, 194716, 0, 0, 41863, 0, 0, 2304, 0, 92326, 0, 42951, 0, + 0, 64760, 11766, 0, 0, 0, 0, 69236, 0, 0, 8773, 10733, 36, 0, 0, 0, 0, 0, + 11074, 0, 64910, 983130, 2009, 0, 0, 128036, 68114, 128906, 0, 0, 0, + 983979, 12852, 3031, 0, 0, 129088, 0, 66414, 0, 0, 119950, 42613, 65933, + 366, 0, 9892, 0, 11754, 101107, 83329, 65301, 44013, 83058, 67245, 10102, + 0, 7739, 41026, 0, 0, 0, 0, 0, 0, 0, 0, 78386, 129475, 71868, 113811, + 13081, 10923, 129330, 0, 68145, 0, 0, 74083, 0, 0, 128392, 83063, 83065, + 0, 70706, 0, 0, 0, 70168, 66586, 4183, 64967, 66250, 0, 92547, 0, 0, + 113685, 0, 3792, 2011, 0, 0, 126503, 83332, 0, 120595, 0, 68489, 41023, + 0, 0, 11659, 7922, 12614, 2005, 8523, 0, 0, 7513, 1863, 129436, 83337, + 128969, 0, 120274, 120033, 0, 8144, 0, 73031, 120269, 127524, 120270, + 42241, 8783, 83326, 0, 0, 120735, 983959, 0, 129367, 0, 10680, 0, 43293, + 68771, 0, 119164, 83320, 72003, 10187, 0, 0, 0, 83315, 0, 0, 0, 10968, + 43296, 0, 0, 0, 101400, 0, 1005, 43826, 120030, 0, 2870, 0, 101399, 0, 0, + 983779, 0, 235, 1384, 0, 74887, 70494, 120409, 0, 9796, 69895, 983812, 0, + 120406, 13186, 120407, 0, 0, 0, 0, 42527, 12911, 43427, 1383, 0, 0, 0, 0, + 6156, 68117, 0, 7993, 4288, 0, 0, 13238, 13244, 0, 0, 120426, 13234, + 120427, 0, 118904, 0, 11364, 0, 1380, 65617, 120253, 120261, 13196, + 13197, 120311, 120419, 9495, 0, 0, 120418, 0, 73976, 128160, 0, 6941, 0, + 13205, 13211, 5801, 0, 74271, 120319, 0, 120302, 7670, 0, 68075, 983583, + 0, 19957, 72314, 2021, 93811, 43877, 0, 0, 0, 0, 3875, 120431, 64341, 0, + 9814, 43457, 13066, 3314, 7787, 0, 0, 0, 0, 0, 0, 64531, 129860, 0, 0, 0, + 0, 0, 127138, 0, 0, 9742, 0, 0, 10800, 0, 8404, 0, 92592, 0, 7089, 0, + 78545, 0, 0, 0, 0, 0, 4772, 5771, 101405, 0, 9841, 8843, 0, 0, 0, 129862, + 120816, 0, 123137, 0, 0, 0, 0, 0, 0, 8849, 0, 0, 65112, 1796, 0, 0, + 69665, 8164, 41301, 3502, 0, 122884, 128387, 0, 983816, 5825, 0, 0, 0, 0, + 121322, 10983, 10354, 10418, 0, 2022, 0, 1409, 100789, 0, 0, 0, 0, 1390, + 0, 0, 10471, 65904, 5846, 126472, 0, 0, 0, 0, 0, 0, 66035, 0, 0, 0, 0, + 128190, 0, 3168, 67733, 0, 0, 2370, 0, 126243, 0, 195049, 0, 0, 1836, 0, + 121207, 119137, 118959, 125232, 0, 0, 0, 2390, 3944, 0, 0, 0, 0, 69908, + 125011, 0, 0, 123200, 0, 0, 8975, 64739, 0, 0, 0, 0, 64409, 0, 0, 0, 0, + 128564, 0, 0, 0, 0, 6204, 0, 0, 0, 10911, 64954, 119003, 74809, 118903, + 4267, 0, 0, 0, 0, 0, 0, 72023, 0, 0, 0, 92887, 0, 0, 0, 0, 121125, 0, 128337, 5842, 0, 41439, 0, 0, 0, 9328, 0, 120980, 120917, 0, 0, 2285, 0, 0, 0, 0, 0, 64555, 0, 0, 72162, 9541, 0, 0, 0, 41441, 0, 0, 0, 41040, 2459, 0, 0, 41041, 0, 0, 0, 0, 0, 10450, 0, 41043, 0, 0, 43125, 0, 0, 0, 0, 0, 121008, 68436, 128040, 0, 120649, 0, 0, 4312, 43927, 0, 0, 11923, - 42227, 0, 5763, 0, 4827, 74559, 42228, 64406, 0, 0, 0, 433, 119620, 0, - 2499, 67167, 67166, 0, 11973, 0, 4293, 42271, 42224, 0, 0, 66322, 42226, - 0, 0, 0, 74180, 0, 55277, 0, 0, 0, 983265, 0, 74632, 0, 0, 71103, 0, 0, - 0, 585, 2383, 0, 43263, 0, 4290, 0, 0, 68920, 0, 8511, 0, 0, 0, 119048, - 2380, 126119, 0, 71704, 2376, 0, 0, 0, 5197, 127046, 127047, 127048, - 2366, 127050, 127051, 73442, 0, 0, 0, 93835, 0, 93818, 0, 0, 74188, - 113813, 0, 0, 0, 983819, 0, 0, 0, 0, 1847, 0, 72771, 0, 42384, 0, 4227, - 74158, 0, 92501, 0, 0, 42365, 0, 128902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128563, 0, 983504, 127560, 2754, 0, 0, 128900, 0, 127867, 119638, 0, - 1711, 12984, 92365, 0, 6255, 0, 0, 0, 0, 0, 42063, 74184, 0, 0, 0, 0, 0, - 0, 0, 41035, 43274, 0, 11256, 119088, 0, 520, 0, 41037, 128162, 0, 0, + 42227, 0, 5763, 0, 4827, 74559, 42228, 64406, 0, 0, 129703, 433, 119620, + 0, 2499, 67167, 67166, 0, 11973, 0, 4293, 42271, 42224, 0, 0, 66322, + 42226, 0, 0, 0, 74180, 0, 55277, 0, 0, 0, 983265, 0, 74632, 0, 0, 71103, + 0, 0, 0, 585, 2383, 0, 43263, 0, 4290, 0, 0, 68920, 0, 8511, 0, 0, 0, + 119048, 2380, 126119, 0, 71704, 2376, 0, 0, 0, 5197, 127046, 127047, + 127048, 2366, 127050, 127051, 73442, 0, 0, 0, 93835, 0, 93818, 0, 0, + 74188, 113813, 0, 0, 0, 983819, 0, 0, 0, 0, 1847, 0, 72771, 0, 42384, 0, + 4227, 74158, 0, 92501, 0, 0, 42365, 0, 128902, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 128563, 0, 983504, 127560, 2754, 0, 0, 128900, 0, 127867, 119638, + 0, 1711, 12984, 92365, 0, 6255, 0, 0, 0, 0, 0, 42063, 74184, 0, 0, 0, 0, + 0, 0, 0, 41035, 43274, 0, 11256, 119088, 0, 520, 0, 41037, 128162, 0, 0, 41034, 0, 983810, 64815, 0, 0, 321, 41028, 0, 0, 0, 0, 0, 0, 0, 74191, 0, - 0, 72767, 1861, 0, 129666, 0, 0, 100770, 0, 0, 128530, 3859, 0, 41660, 0, - 70793, 0, 983737, 75014, 0, 127514, 41658, 0, 0, 0, 0, 0, 4414, 120766, - 0, 42632, 0, 0, 0, 0, 0, 1405, 0, 43220, 43341, 0, 0, 0, 0, 0, 983714, - 11199, 0, 3513, 0, 70341, 43342, 0, 65529, 0, 0, 0, 6485, 1397, 0, 0, - 92678, 0, 0, 0, 82961, 0, 82962, 0, 74270, 43287, 983712, 0, 0, 983719, - 0, 71914, 4317, 10490, 0, 0, 194867, 74463, 128952, 464, 41624, 0, 0, 0, - 1346, 128240, 917631, 64724, 128566, 423, 0, 0, 113748, 0, 128161, 0, 0, - 120563, 64960, 0, 0, 0, 0, 9584, 129106, 0, 125026, 0, 9718, 0, 42642, - 92977, 64750, 0, 0, 0, 0, 128333, 0, 3204, 64666, 0, 43530, 2752, 0, 0, - 119594, 0, 0, 0, 0, 92371, 0, 41983, 0, 7010, 0, 0, 41495, 92379, 5877, - 42252, 93070, 8009, 3305, 0, 0, 0, 0, 92293, 0, 0, 0, 100836, 0, 65915, - 1400, 75018, 10685, 75017, 2103, 0, 0, 43276, 0, 11169, 0, 6481, 0, 0, 0, - 100837, 72249, 100838, 74198, 0, 9116, 0, 0, 0, 0, 0, 0, 8129, 92994, 0, - 124992, 0, 11658, 0, 0, 3452, 41031, 0, 1385, 0, 0, 0, 43340, 11123, - 41033, 6493, 12758, 0, 0, 11426, 0, 1681, 100755, 1204, 11960, 69902, 0, - 69457, 0, 119322, 0, 7415, 43338, 0, 0, 67717, 64915, 0, 100759, 100850, - 41497, 65044, 0, 19960, 65358, 983601, 0, 0, 0, 73670, 0, 1789, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 64728, 0, 0, 0, 6506, 64312, 0, 2368, 0, 0, 0, 0, - 3439, 1825, 1192, 0, 73739, 10639, 0, 7790, 5430, 0, 0, 2848, 92981, 0, - 0, 7607, 0, 0, 0, 120658, 0, 0, 8883, 0, 728, 0, 0, 0, 0, 92931, 0, - 121372, 128348, 0, 68078, 8091, 11447, 0, 0, 126261, 0, 0, 70003, 0, 0, - 74419, 12335, 0, 0, 3443, 0, 0, 0, 127145, 0, 0, 0, 0, 11843, 0, 9205, - 8624, 128543, 92930, 43295, 0, 65445, 0, 6277, 41672, 0, 10010, 70186, - 983052, 0, 835, 71340, 0, 0, 0, 0, 0, 5426, 4258, 0, 64891, 5424, 0, - 8283, 0, 5434, 0, 0, 0, 0, 0, 11947, 0, 1404, 0, 11432, 0, 3464, 6486, - 4819, 0, 0, 570, 8095, 0, 0, 1498, 0, 0, 0, 431, 67820, 0, 0, 128096, 0, - 0, 13096, 0, 0, 43408, 0, 128538, 8835, 77875, 0, 0, 0, 0, 0, 0, 0, 0, - 3477, 227, 10488, 0, 382, 11418, 0, 5878, 0, 0, 0, 0, 6484, 92355, 66039, - 0, 0, 0, 78717, 0, 92662, 119665, 0, 0, 43290, 0, 0, 0, 0, 8782, 0, 0, - 4323, 128649, 0, 120903, 12094, 0, 0, 0, 0, 92953, 3856, 120970, 0, 5872, - 6495, 72306, 0, 0, 0, 67173, 67172, 67171, 3953, 0, 0, 93063, 11994, - 4339, 0, 92654, 0, 0, 0, 0, 128804, 0, 5228, 0, 9766, 0, 92741, 0, 0, 0, - 0, 68860, 0, 1162, 0, 2671, 0, 0, 92632, 92631, 72117, 0, 73811, 0, - 194895, 0, 68085, 0, 74331, 11424, 0, 10466, 121239, 0, 194890, 0, 4820, - 0, 0, 0, 194891, 0, 119212, 4896, 0, 4897, 42821, 64611, 0, 4438, 0, 0, - 1753, 11331, 6147, 0, 43282, 8833, 0, 0, 6504, 0, 0, 0, 0, 0, 1413, 0, 0, - 64353, 12141, 121138, 0, 0, 43163, 0, 72880, 64789, 127094, 838, 127092, - 120697, 127090, 5014, 0, 256, 0, 0, 42443, 42739, 0, 7542, 0, 70389, 0, - 6489, 10048, 74326, 0, 66573, 0, 125271, 78712, 11761, 126078, 129603, - 41094, 0, 0, 0, 0, 92689, 8453, 0, 0, 120942, 128184, 0, 11816, 0, 0, - 2930, 93845, 0, 41098, 92771, 41093, 0, 0, 6498, 41096, 0, 0, 1238, 200, - 0, 1660, 74476, 0, 0, 74362, 0, 0, 72301, 9224, 0, 0, 0, 0, 0, 0, 0, 0, - 72729, 43284, 0, 72110, 120561, 13183, 0, 0, 0, 1669, 10776, 0, 0, 0, 0, - 0, 1732, 4030, 0, 3963, 0, 0, 0, 6491, 0, 0, 914, 121394, 0, 0, 0, 78713, - 0, 92441, 74367, 0, 0, 0, 0, 0, 0, 0, 0, 65537, 0, 0, 43430, 5301, 0, - 92618, 0, 43285, 0, 0, 125186, 0, 0, 5876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11114, 74536, 0, 0, 0, 0, 983129, 0, 0, 0, 0, 10915, 983069, 12007, 0, - 0, 0, 0, 67655, 92604, 0, 8629, 0, 43168, 41872, 0, 0, 0, 42488, 0, 0, 0, - 0, 0, 64730, 70041, 0, 122895, 0, 0, 0, 92306, 11416, 4280, 128516, 8765, - 73451, 0, 1393, 0, 11157, 74386, 0, 0, 0, 0, 6683, 0, 93832, 12144, 0, - 74513, 13019, 74994, 0, 0, 0, 983267, 0, 6488, 357, 0, 41100, 0, 41104, - 0, 41099, 0, 71320, 0, 0, 0, 4434, 0, 0, 0, 74231, 83107, 0, 194914, 0, - 0, 72286, 68305, 0, 41759, 12757, 0, 0, 72769, 9790, 8995, 0, 121095, - 68209, 0, 41764, 0, 0, 72322, 2268, 0, 0, 0, 12743, 0, 6480, 0, 41779, 0, - 66601, 0, 74490, 10986, 66602, 0, 64807, 0, 0, 41767, 119629, 0, 0, 0, - 3955, 64571, 194918, 127089, 0, 70187, 69975, 9770, 12305, 12230, 0, - 78579, 0, 0, 74752, 0, 0, 123168, 128263, 74449, 0, 0, 69611, 0, 0, - 71131, 129505, 78573, 0, 0, 11116, 0, 5747, 0, 110667, 9802, 41092, - 120731, 0, 0, 0, 0, 0, 120733, 41090, 0, 0, 0, 11271, 57, 0, 0, 0, 0, - 71268, 121290, 43137, 0, 0, 0, 126221, 0, 0, 0, 0, 0, 277, 74385, 0, 0, - 0, 72155, 0, 13025, 8757, 0, 0, 1574, 0, 126124, 100800, 0, 5749, 0, 0, - 42824, 0, 1039, 9801, 0, 5745, 0, 41858, 0, 0, 120655, 0, 41862, 0, 0, 0, - 436, 4771, 194636, 42501, 0, 10573, 0, 0, 0, 917986, 9644, 0, 0, 0, 0, - 69837, 0, 0, 0, 0, 67409, 0, 0, 0, 125204, 11939, 0, 0, 0, 0, 0, 0, 0, - 3504, 0, 0, 0, 126209, 0, 10226, 65558, 0, 3594, 0, 0, 40, 0, 0, 0, 0, 0, - 74312, 72138, 74337, 0, 983667, 0, 0, 0, 70476, 0, 121143, 72317, 0, 0, - 4304, 0, 0, 78707, 0, 0, 0, 78597, 1348, 78596, 0, 0, 0, 70406, 92392, 0, - 7599, 0, 0, 13269, 0, 0, 0, 100804, 0, 74494, 6097, 7568, 43980, 4982, - 78592, 0, 0, 0, 0, 13270, 0, 0, 13138, 0, 9484, 0, 0, 71364, 0, 0, 0, - 9487, 0, 92913, 0, 71911, 78668, 73963, 6193, 0, 0, 0, 194848, 7228, - 10011, 194849, 194852, 194851, 11654, 194853, 126218, 194855, 0, 194857, - 3604, 0, 0, 0, 0, 0, 94110, 43740, 94109, 194860, 194863, 66750, 121021, - 0, 94111, 6995, 74173, 5437, 74174, 0, 8702, 7339, 194842, 0, 199, - 194843, 194846, 194845, 0, 126069, 0, 67818, 0, 7560, 0, 0, 0, 0, 6472, - 65814, 0, 128983, 70845, 0, 0, 9191, 0, 0, 0, 0, 0, 10196, 0, 0, 6585, 0, - 120750, 0, 0, 71872, 129129, 0, 0, 78590, 72308, 11382, 129499, 0, - 983651, 0, 194833, 194832, 194835, 129540, 94020, 194836, 42727, 194838, - 128252, 78585, 43874, 119610, 0, 0, 43248, 0, 194816, 0, 194818, 128845, - 194820, 194819, 5297, 194821, 13284, 6112, 93964, 93010, 73927, 42947, 0, - 65746, 0, 0, 194827, 194826, 4342, 42839, 194831, 1677, 0, 72135, 0, 0, - 0, 11011, 66399, 0, 0, 0, 10160, 0, 0, 0, 0, 2052, 4308, 92174, 43000, 0, + 0, 72767, 1861, 118938, 129666, 0, 0, 100770, 0, 0, 128530, 3859, 0, + 41660, 0, 70793, 0, 983737, 75014, 0, 127514, 41658, 0, 0, 0, 0, 0, 4414, + 120766, 0, 42632, 0, 0, 0, 0, 0, 1405, 0, 43220, 43341, 0, 0, 0, 0, 0, + 983714, 11199, 0, 3513, 0, 70341, 43342, 0, 65529, 0, 0, 0, 6485, 1397, + 0, 0, 92678, 0, 0, 0, 82961, 0, 82962, 0, 74270, 43287, 983712, 0, 0, + 983719, 0, 71914, 4317, 10490, 0, 0, 194867, 74463, 128952, 464, 41624, + 0, 0, 0, 1346, 128240, 69271, 64724, 128566, 423, 0, 0, 113748, 0, + 128161, 0, 0, 120563, 64960, 0, 0, 0, 0, 9584, 129106, 0, 125026, 0, + 9718, 0, 42642, 92977, 64750, 0, 0, 0, 0, 128333, 0, 3204, 64666, 0, + 43530, 2752, 0, 0, 119594, 0, 0, 0, 0, 92371, 0, 41983, 0, 7010, 0, 0, + 41495, 92379, 5877, 42252, 93070, 8009, 3305, 0, 0, 0, 0, 92293, 0, 0, 0, + 100836, 0, 65915, 1400, 75018, 10685, 75017, 2103, 0, 0, 43276, 0, 11169, + 0, 6481, 0, 0, 0, 100837, 72249, 100838, 74198, 0, 9116, 0, 0, 0, 0, 0, + 0, 8129, 92994, 0, 124992, 0, 11658, 0, 0, 3452, 41031, 0, 1385, 0, 0, 0, + 43340, 11123, 41033, 6493, 12758, 0, 0, 11426, 0, 1681, 100755, 1204, + 11960, 69902, 0, 69457, 0, 119322, 129483, 7415, 43338, 0, 0, 67717, + 64915, 0, 100759, 72021, 41497, 65044, 0, 19960, 65358, 983601, 0, 0, 0, + 73670, 0, 1789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64728, 0, 0, 0, 6506, + 64312, 0, 2368, 0, 0, 0, 0, 3439, 1825, 1192, 0, 73739, 10639, 0, 7790, + 5430, 0, 0, 2848, 92981, 0, 0, 7607, 0, 0, 0, 120658, 0, 0, 8883, 0, 728, + 0, 0, 0, 0, 92931, 0, 121372, 128348, 0, 68078, 8091, 11447, 0, 0, + 126261, 983710, 0, 70003, 0, 0, 74419, 12335, 0, 0, 3443, 0, 0, 0, + 127145, 0, 0, 0, 0, 11843, 0, 9205, 8624, 128543, 92930, 43295, 0, 65445, + 0, 6277, 41672, 0, 10010, 70186, 983052, 0, 835, 71340, 0, 0, 0, 0, 0, + 5426, 4258, 0, 64891, 5424, 0, 8283, 0, 5434, 0, 0, 0, 0, 0, 11947, 0, + 1404, 0, 11432, 0, 3464, 6486, 4819, 0, 0, 570, 8095, 0, 0, 1498, 0, 0, + 0, 431, 67820, 0, 0, 128096, 0, 0, 13096, 0, 0, 43408, 0, 128538, 8835, + 77875, 0, 0, 0, 0, 0, 0, 0, 0, 3477, 227, 10488, 0, 382, 11418, 0, 5878, + 0, 0, 0, 0, 6484, 92355, 66039, 0, 0, 0, 78717, 0, 92662, 119665, 0, 0, + 43290, 0, 0, 0, 0, 8782, 0, 0, 4323, 128649, 0, 120903, 12094, 0, 0, 0, + 0, 92953, 3856, 120970, 0, 5872, 6495, 72306, 0, 0, 0, 67173, 67172, + 67171, 3953, 0, 0, 93063, 11994, 4339, 0, 92654, 0, 0, 0, 0, 128804, 0, + 5228, 0, 9766, 0, 92741, 0, 0, 0, 0, 68860, 0, 1162, 0, 2671, 0, 0, + 92632, 92631, 72117, 0, 73811, 0, 194895, 0, 68085, 0, 74331, 11424, 0, + 10466, 121239, 0, 194890, 0, 4820, 0, 0, 0, 194891, 0, 119212, 4896, 0, + 4897, 42821, 64611, 0, 4438, 0, 0, 1753, 11331, 6147, 0, 43282, 8833, 0, + 0, 6504, 0, 0, 0, 0, 0, 1413, 0, 0, 64353, 12141, 121138, 0, 0, 43163, 0, + 72880, 64789, 127094, 838, 127092, 120697, 127090, 5014, 0, 256, 0, 0, + 42443, 42739, 0, 7542, 0, 70389, 0, 6489, 10048, 74326, 0, 66573, 0, + 125271, 78712, 11761, 126078, 129603, 41094, 0, 0, 0, 0, 92689, 8453, 0, + 0, 120942, 128184, 0, 11816, 0, 0, 2930, 93845, 0, 41098, 92771, 41093, + 0, 0, 6498, 41096, 0, 0, 1238, 200, 0, 1660, 74476, 0, 0, 74362, 0, 0, + 72301, 9224, 0, 0, 0, 0, 0, 0, 0, 0, 72729, 43284, 0, 72110, 120561, + 13183, 0, 0, 0, 1669, 10776, 0, 0, 0, 0, 0, 1732, 4030, 0, 3963, 0, 0, 0, + 6491, 0, 0, 914, 121394, 0, 0, 0, 78713, 0, 92441, 74367, 0, 0, 0, 0, 0, + 0, 0, 0, 65537, 0, 0, 43430, 5301, 0, 92618, 0, 43285, 0, 0, 125186, 0, + 0, 5876, 0, 69555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11114, 74536, 0, 0, 0, 0, + 983129, 0, 0, 0, 0, 10915, 983069, 12007, 0, 0, 0, 0, 67655, 92604, 0, + 8629, 0, 43168, 41872, 0, 0, 0, 42488, 0, 0, 0, 0, 0, 64730, 70041, 0, + 122895, 0, 0, 0, 92306, 11416, 4280, 128516, 8765, 73451, 0, 1393, 0, + 11157, 74386, 0, 0, 0, 0, 6683, 0, 93832, 12144, 0, 74513, 13019, 74994, + 0, 0, 0, 983267, 0, 6488, 357, 0, 41100, 0, 41104, 0, 41099, 0, 71320, 0, + 0, 0, 4434, 0, 0, 0, 74231, 83107, 0, 194914, 0, 0, 72286, 68305, 0, + 41759, 12757, 0, 0, 72769, 9790, 8995, 0, 121095, 68209, 0, 41764, 0, 0, + 72322, 2268, 0, 129845, 0, 12743, 0, 6480, 0, 41779, 0, 66601, 0, 74490, + 10986, 66602, 0, 64807, 0, 0, 41767, 119629, 0, 0, 0, 3955, 64571, + 194918, 127089, 0, 70187, 69975, 9770, 12305, 12230, 0, 78579, 0, 0, + 74752, 0, 0, 123168, 128263, 74449, 0, 65948, 69611, 0, 0, 71131, 129505, + 78573, 0, 0, 11116, 0, 5747, 0, 110667, 9802, 41092, 120731, 0, 0, 0, 0, + 0, 120733, 41090, 0, 0, 0, 11271, 57, 0, 0, 0, 0, 71268, 121290, 43137, + 0, 0, 0, 126221, 0, 0, 0, 0, 0, 277, 74385, 0, 0, 0, 72155, 0, 13025, + 8757, 0, 0, 1574, 0, 126124, 100800, 0, 5749, 129923, 0, 42824, 0, 1039, + 9801, 0, 5745, 0, 41858, 0, 0, 120655, 0, 41862, 0, 0, 0, 436, 4771, + 194636, 42501, 0, 10573, 0, 0, 0, 917986, 9644, 0, 0, 0, 0, 69837, 0, 0, + 0, 0, 67409, 0, 0, 0, 125204, 11939, 0, 0, 0, 0, 0, 0, 0, 3504, 0, 0, 0, + 126209, 0, 10226, 65558, 0, 3594, 0, 0, 40, 0, 0, 0, 0, 0, 74312, 72138, + 74337, 0, 69577, 0, 0, 0, 70476, 0, 121143, 72317, 0, 0, 4304, 0, 0, + 78707, 0, 0, 0, 78597, 1348, 78596, 0, 0, 0, 70406, 92392, 0, 7599, 0, 0, + 13269, 0, 129729, 0, 100804, 0, 74494, 6097, 7568, 43980, 4982, 78592, 0, + 0, 0, 0, 13270, 0, 0, 13138, 0, 9484, 0, 0, 71364, 0, 0, 0, 9487, 0, + 92913, 0, 71911, 78668, 73963, 6193, 0, 0, 0, 194848, 7228, 10011, + 194849, 194852, 194851, 11654, 194853, 126218, 194855, 0, 194857, 3604, + 0, 0, 0, 0, 0, 94110, 43740, 94109, 194860, 194863, 66750, 121021, 0, + 94111, 6995, 74173, 5437, 74174, 0, 8702, 7339, 129981, 0, 199, 194843, + 194846, 194845, 0, 126069, 0, 67818, 0, 7560, 0, 0, 0, 0, 6472, 65814, 0, + 128983, 70845, 0, 0, 9191, 0, 0, 0, 0, 0, 10196, 0, 0, 6585, 0, 120750, + 0, 0, 71872, 129129, 0, 0, 78590, 72308, 11382, 129499, 0, 983651, 0, + 194833, 194832, 194835, 129540, 94020, 194836, 42727, 194838, 128252, + 78585, 43874, 119610, 0, 0, 43248, 0, 194816, 0, 194818, 128845, 194820, + 194819, 5297, 194821, 13284, 6112, 93964, 93010, 73927, 42947, 0, 65746, + 0, 0, 194827, 194826, 4342, 42839, 194831, 1677, 0, 72135, 0, 0, 0, + 11011, 66399, 0, 0, 0, 10160, 0, 0, 0, 0, 2052, 4308, 92174, 43000, 0, 543, 64916, 0, 0, 0, 119170, 0, 118922, 2064, 0, 43158, 0, 0, 69984, 0, 0, 129187, 0, 0, 0, 0, 41631, 92728, 0, 0, 6228, 0, 0, 0, 0, 0, 0, 506, 0, 0, 65735, 2055, 43255, 121407, 0, 0, 0, 0, 0, 0, 194666, 2063, 0, 0, 0, 0, 72136, 0, 74333, 194912, 11827, 74308, 194913, 194916, 194915, 64564, 194917, 67986, 194919, 0, 11037, 0, 121102, 0, 0, 10560, 0, - 120756, 194922, 113737, 194924, 194927, 194926, 1931, 0, 0, 0, 128228, 0, + 120756, 194922, 113737, 194924, 194927, 120495, 1931, 0, 0, 0, 128228, 0, 12643, 8751, 123629, 0, 12294, 0, 78834, 9138, 78831, 78833, 12631, 78829, 11080, 78821, 0, 0, 1239, 0, 121067, 0, 12636, 0, 0, 0, 0, 0, 0, 8998, 0, 0, 9152, 0, 0, 0, 67589, 0, 64290, 0, 92393, 12615, 0, 129141, @@ -25754,9 +26597,9 @@ static const unsigned int code_hash[] = { 0, 0, 0, 67604, 70705, 0, 194882, 194881, 194884, 194883, 194886, 128914, 194888, 67599, 0, 194889, 0, 0, 0, 0, 3357, 0, 78852, 4207, 1288, 78842, 78839, 78840, 78837, 78838, 66354, 194872, 0, 128432, 0, 67618, 92664, 0, - 42788, 0, 64612, 194875, 10774, 194877, 0, 194879, 0, 0, 0, 997, 194901, + 42788, 0, 64612, 129897, 10774, 194877, 0, 194879, 0, 0, 0, 997, 194901, 0, 92577, 0, 11440, 11379, 42000, 13139, 0, 0, 74030, 72293, 73796, 0, 0, - 0, 0, 2818, 0, 0, 73793, 0, 4172, 93028, 126523, 124981, 0, 0, 0, 0, + 0, 0, 2818, 0, 0, 73793, 0, 4172, 93028, 126523, 124981, 0, 129896, 0, 0, 129522, 69706, 0, 6834, 0, 0, 194865, 126982, 121211, 194866, 194869, 194868, 766, 1257, 0, 0, 0, 3265, 66617, 3274, 0, 0, 94042, 0, 8373, 41989, 0, 73460, 3418, 3263, 0, 0, 0, 3270, 64539, 11489, 0, 118945, @@ -25775,29 +26618,29 @@ static const unsigned int code_hash[] = { 64010, 64008, 64007, 2003, 7706, 0, 0, 119050, 64009, 204, 0, 0, 4430, 8239, 64003, 10626, 64001, 64057, 13079, 64055, 64054, 0, 0, 43246, 9343, 64049, 64048, 0, 1133, 64053, 64052, 64051, 64050, 0, 0, 0, 66415, 12329, - 0, 0, 0, 1942, 0, 0, 0, 128249, 0, 68291, 10760, 64023, 64022, 64021, - 64020, 43670, 77924, 64025, 41412, 78243, 78244, 0, 0, 64019, 64018, - 64017, 64016, 0, 0, 78251, 78252, 78248, 78249, 77914, 78247, 0, 917560, - 77919, 6788, 13094, 0, 7532, 41414, 0, 3179, 70745, 64769, 0, 0, 0, 0, - 10751, 0, 0, 0, 0, 0, 0, 0, 2008, 64031, 64030, 294, 41874, 83383, 83384, - 65929, 83376, 129063, 83379, 83380, 64028, 11396, 64026, 83374, 0, 0, - 118795, 71739, 43247, 0, 70153, 0, 0, 0, 0, 0, 0, 0, 0, 7801, 83359, - 83361, 128931, 0, 3297, 83356, 83357, 1135, 83350, 83351, 73696, 1995, - 7927, 71738, 110742, 2552, 83372, 60, 0, 8649, 83368, 83369, 83370, - 83371, 10541, 83365, 78679, 43833, 0, 0, 2013, 83362, 0, 110636, 0, 0, - 12832, 110638, 8081, 8362, 120188, 0, 9137, 0, 0, 0, 0, 3466, 0, 0, 1996, - 0, 3453, 3412, 0, 2002, 2000, 120176, 0, 0, 0, 0, 1998, 0, 1842, 0, 0, - 9628, 68446, 0, 9826, 64502, 1767, 3413, 0, 0, 0, 0, 0, 0, 13108, 44024, - 120204, 0, 92693, 0, 0, 0, 70291, 12650, 983208, 0, 68061, 0, 3592, 0, 0, - 0, 0, 983956, 0, 66417, 128792, 10742, 0, 0, 1994, 9281, 3296, 64475, - 1997, 1895, 128936, 72387, 0, 0, 123184, 72391, 0, 8999, 0, 983633, 0, - 66480, 0, 0, 0, 983083, 0, 596, 0, 0, 120216, 8651, 120217, 0, 0, 12995, - 0, 0, 70740, 0, 42930, 119955, 64810, 917834, 6825, 0, 917839, 120208, - 64275, 120889, 128069, 120210, 6384, 917840, 126477, 0, 67698, 0, 0, 0, - 120496, 0, 43412, 0, 0, 0, 0, 0, 120172, 0, 120763, 0, 0, 0, 128343, - 1457, 0, 0, 6381, 2815, 0, 65240, 129664, 0, 0, 119522, 70487, 0, 0, 0, - 0, 0, 120572, 0, 0, 0, 0, 0, 125253, 0, 0, 0, 120574, 0, 0, 0, 3055, - 9852, 0, 65288, 0, 11398, 0, 0, 93016, 0, 0, 603, 128557, 0, 0, 0, + 0, 0, 129698, 1942, 0, 0, 0, 128249, 0, 68291, 10760, 64023, 64022, + 64021, 64020, 43670, 77924, 64025, 41412, 78243, 78244, 0, 0, 64019, + 64018, 64017, 64016, 0, 0, 78251, 78252, 78248, 78249, 77914, 78247, 0, + 917560, 77919, 6788, 13094, 0, 7532, 41414, 0, 3179, 70745, 64769, 0, 0, + 71967, 0, 10751, 0, 0, 0, 0, 0, 0, 0, 2008, 64031, 64030, 294, 41874, + 83383, 83384, 65929, 83376, 129063, 83379, 83380, 64028, 11396, 64026, + 83374, 0, 0, 118795, 71739, 43247, 0, 70153, 0, 0, 0, 0, 0, 0, 0, 0, + 7801, 83359, 83361, 128931, 0, 3297, 83356, 83357, 1135, 83350, 83351, + 73696, 1995, 7927, 71738, 110742, 2552, 83372, 60, 0, 8649, 83368, 83369, + 83370, 83371, 10541, 83365, 78679, 43833, 0, 0, 2013, 83362, 0, 110636, + 0, 0, 12832, 110638, 8081, 8362, 120188, 0, 9137, 0, 0, 0, 0, 3466, 0, 0, + 1996, 0, 3453, 3412, 0, 2002, 2000, 120176, 0, 0, 0, 0, 1998, 0, 1842, 0, + 0, 9628, 68446, 0, 9826, 64502, 1767, 3413, 0, 0, 0, 0, 0, 0, 13108, + 44024, 120204, 0, 92693, 0, 0, 0, 70291, 12650, 983208, 0, 68061, 0, + 3592, 0, 0, 0, 0, 983956, 0, 66417, 128792, 10742, 0, 0, 1994, 9281, + 3296, 64475, 1997, 1895, 128936, 72387, 0, 0, 123184, 72391, 0, 8999, 0, + 983633, 0, 66480, 0, 0, 0, 983083, 0, 596, 0, 0, 120216, 8651, 120217, 0, + 0, 12995, 0, 0, 70740, 0, 42930, 119955, 64810, 917834, 6825, 0, 917839, + 120208, 64275, 120889, 128069, 120210, 6384, 917840, 126477, 0, 67698, 0, + 0, 0, 120496, 0, 43412, 0, 0, 0, 0, 0, 120172, 0, 120763, 0, 0, 0, + 128343, 1457, 0, 0, 6381, 2815, 0, 65240, 129664, 0, 0, 119522, 70487, 0, + 0, 0, 0, 0, 120572, 0, 0, 0, 0, 0, 125253, 0, 0, 0, 120574, 0, 0, 0, + 3055, 9852, 0, 65288, 0, 11398, 0, 0, 93016, 0, 0, 603, 128557, 0, 0, 0, 129366, 3350, 0, 0, 917828, 917827, 68428, 917825, 73045, 917831, 917830, 917829, 0, 1919, 0, 110767, 83296, 83297, 83298, 66446, 64141, 8562, 64139, 64138, 64136, 64135, 64134, 64133, 11297, 0, 0, 11966, 64128, @@ -25815,180 +26658,183 @@ static const unsigned int code_hash[] = { 64118, 110659, 127842, 1177, 65601, 12322, 64106, 92169, 110654, 64102, 64101, 64100, 64099, 0, 10453, 64104, 64103, 7997, 0, 92534, 0, 8705, 64097, 64096, 9571, 0, 110652, 127398, 12132, 0, 0, 0, 110624, 73841, - 83339, 83340, 9056, 0, 0, 0, 6155, 64068, 64067, 64066, 64065, 64072, - 64071, 63, 64069, 127382, 0, 93822, 7257, 64064, 0, 0, 0, 0, 0, 0, 78748, - 0, 0, 0, 120519, 0, 66242, 66232, 4333, 9855, 64112, 0, 0, 0, 0, 0, 0, 0, - 66222, 0, 0, 0, 0, 69816, 0, 118796, 0, 8708, 0, 64077, 64076, 8996, - 4992, 4471, 83343, 64079, 64078, 92179, 0, 0, 129120, 64615, 0, 0, 12075, - 42041, 0, 0, 0, 0, 127557, 3123, 0, 983735, 0, 0, 0, 83328, 0, 9223, 0, - 83321, 83322, 73797, 83327, 1116, 0, 83319, 7136, 0, 0, 0, 0, 75031, 0, - 0, 0, 64092, 43675, 10104, 83338, 83331, 64095, 64094, 8111, 66247, 0, - 64089, 64088, 0, 70106, 42236, 11434, 64083, 64082, 43216, 7737, 64087, - 64086, 64085, 64084, 0, 0, 0, 4118, 1797, 83312, 0, 0, 46, 83308, 83309, - 298, 83303, 72402, 83305, 83306, 0, 0, 0, 128905, 11495, 0, 0, 0, 127377, - 194828, 127370, 0, 0, 0, 66239, 74945, 64403, 0, 0, 83314, 0, 0, 65758, - 43536, 0, 8544, 0, 0, 0, 0, 194824, 0, 0, 0, 0, 0, 3639, 11242, 194822, - 0, 0, 0, 0, 0, 0, 68409, 0, 0, 0, 0, 0, 0, 0, 128654, 8789, 126248, 0, 0, - 0, 0, 0, 0, 0, 65058, 0, 78234, 68064, 0, 66227, 71694, 5573, 118936, 0, - 44, 0, 66244, 118907, 0, 66238, 12844, 0, 1622, 129190, 1900, 0, 11458, - 0, 0, 6581, 5576, 128303, 0, 126122, 0, 113680, 8947, 0, 113812, 0, 0, 0, - 7908, 0, 0, 6579, 0, 0, 0, 0, 2138, 6583, 7761, 0, 0, 0, 66802, 5058, 0, - 0, 0, 5057, 125256, 0, 74538, 5054, 0, 0, 0, 0, 0, 0, 658, 3497, 128509, - 0, 5061, 5060, 4235, 0, 0, 0, 127757, 4236, 4727, 0, 0, 0, 128791, 0, - 7488, 128693, 7476, 0, 125259, 120646, 0, 0, 0, 66209, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9341, 119596, 0, 0, 0, 64668, 0, 8125, - 0, 6743, 119175, 0, 129441, 83406, 0, 127966, 119235, 74092, 0, 0, 43660, - 0, 0, 127901, 0, 0, 0, 264, 0, 74954, 0, 0, 0, 0, 0, 6019, 0, 0, 129121, - 0, 0, 0, 8800, 0, 66376, 0, 120948, 0, 100744, 0, 0, 92333, 725, 68014, - 0, 0, 72099, 0, 0, 0, 0, 74899, 0, 0, 0, 110804, 0, 72142, 5074, 5073, 0, - 0, 0, 0, 70723, 5072, 128576, 13098, 72403, 0, 11040, 0, 0, 0, 4929, 0, - 0, 0, 0, 0, 0, 0, 0, 67754, 4934, 0, 0, 9758, 0, 0, 70181, 42584, 0, - 4329, 0, 4979, 8663, 74521, 0, 983042, 74418, 0, 0, 5071, 0, 3642, 0, - 5070, 10042, 0, 3987, 5068, 120211, 8909, 0, 0, 69917, 0, 73981, 983141, - 70749, 4531, 120212, 9105, 0, 4921, 121059, 4926, 65544, 113786, 69621, - 0, 0, 0, 83269, 0, 120790, 4922, 0, 992, 119568, 4925, 0, 0, 9526, 4920, - 128617, 948, 0, 0, 4930, 0, 0, 0, 4933, 0, 0, 0, 4928, 0, 0, 0, 0, - 128379, 722, 0, 127483, 127482, 127485, 82997, 127487, 1509, 0, 5468, - 66214, 127474, 127477, 1672, 127479, 10864, 127481, 72132, 127467, 72159, - 127469, 127468, 127471, 127470, 68336, 82999, 120115, 1679, 120116, 0, - 120113, 127462, 127465, 127464, 127110, 120119, 120112, 0, 120109, 6968, - 5761, 342, 8553, 0, 8143, 127115, 127114, 127113, 624, 127111, 4057, 0, - 5078, 0, 0, 0, 5076, 0, 0, 0, 120097, 685, 9025, 1524, 8003, 0, 5539, - 113727, 113795, 120102, 7138, 120552, 0, 0, 0, 113724, 0, 8058, 9732, 0, - 5080, 0, 5036, 5035, 0, 42604, 72118, 0, 0, 275, 13291, 69995, 0, 0, - 983908, 5033, 0, 0, 4836, 70184, 73792, 0, 0, 0, 120681, 43704, 0, 2274, - 119000, 124983, 0, 8858, 6409, 0, 119585, 0, 0, 0, 0, 0, 68442, 0, 3432, - 10218, 0, 6094, 11232, 0, 0, 0, 0, 1676, 129157, 0, 0, 5030, 0, 118810, - 0, 73869, 0, 0, 69944, 6787, 0, 0, 0, 983595, 10544, 12919, 69425, 92218, - 0, 0, 0, 129172, 0, 67703, 0, 0, 0, 0, 0, 72290, 0, 0, 0, 0, 7018, 66241, - 0, 0, 0, 0, 0, 74056, 0, 11833, 0, 67975, 65232, 40964, 251, 12686, 7895, - 4395, 43538, 0, 0, 0, 78042, 0, 0, 40967, 5879, 0, 0, 0, 0, 0, 65540, - 128590, 625, 0, 120194, 1113, 0, 13103, 3630, 67224, 8179, 74264, 67886, - 9316, 10980, 2489, 120958, 8150, 1359, 121353, 70464, 127330, 127327, - 5042, 5041, 42769, 12084, 11196, 127321, 92279, 72398, 120535, 127317, - 127318, 127315, 12283, 127313, 11453, 0, 8795, 66245, 0, 0, 0, 5037, - 118864, 0, 0, 67724, 0, 66893, 74006, 0, 8431, 0, 0, 0, 0, 12620, 6826, - 73773, 70169, 5040, 0, 0, 0, 0, 0, 5039, 0, 0, 0, 5038, 0, 0, 0, 0, 0, - 65908, 0, 0, 0, 0, 0, 65157, 0, 0, 70182, 0, 73909, 4835, 0, 0, 0, 4309, - 7127, 0, 0, 0, 1301, 0, 0, 12222, 0, 73813, 711, 92439, 7133, 0, 0, 0, 0, - 0, 0, 0, 7661, 72263, 129541, 0, 0, 70453, 7627, 0, 5031, 92340, 42738, - 65784, 0, 65782, 3758, 0, 65781, 67865, 0, 2440, 65780, 70795, 8449, - 121393, 121479, 0, 2118, 0, 12121, 0, 0, 129510, 2128, 2130, 2131, 2126, - 2133, 0, 121250, 2114, 2116, 2455, 0, 2122, 2123, 2124, 2125, 983787, - 8714, 0, 2113, 0, 2115, 0, 127907, 43713, 5052, 66220, 66653, 65777, - 65778, 65775, 5051, 65773, 1429, 42647, 5050, 65769, 388, 70685, 735, 0, - 0, 128035, 0, 12726, 0, 0, 0, 0, 0, 5109, 5053, 0, 0, 0, 0, 0, 2470, 0, - 0, 1925, 71251, 0, 10971, 113770, 5048, 5047, 0, 0, 194946, 92313, 0, 0, - 0, 8089, 0, 639, 0, 68179, 0, 70180, 0, 4599, 0, 0, 0, 0, 983798, 648, - 194948, 65819, 0, 0, 0, 0, 94017, 0, 11777, 9750, 983122, 0, 0, 92367, - 70175, 5046, 66255, 0, 0, 65253, 0, 5045, 0, 1916, 74069, 5044, 92348, 0, - 0, 5043, 0, 0, 0, 74004, 9669, 12341, 0, 8402, 0, 0, 70174, 0, 3586, - 64508, 92456, 0, 0, 119606, 0, 42628, 10069, 0, 0, 0, 0, 123, 120703, 0, - 121326, 0, 10719, 129409, 120444, 10829, 120593, 0, 12130, 0, 0, 0, 0, - 3925, 0, 0, 75065, 71112, 92372, 71110, 71111, 0, 120441, 120452, 983178, - 0, 0, 0, 0, 0, 0, 0, 0, 69879, 8509, 120449, 0, 0, 0, 120448, 0, 118889, - 194858, 0, 0, 0, 66445, 0, 71109, 0, 0, 72425, 0, 12136, 0, 0, 0, 0, 0, - 0, 19922, 41768, 74002, 0, 0, 0, 0, 2458, 0, 0, 0, 41074, 4266, 0, 0, - 41077, 0, 9050, 0, 0, 73693, 0, 0, 41075, 2476, 0, 0, 0, 69761, 0, 0, - 74202, 78745, 0, 121324, 70152, 66033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83106, - 0, 0, 0, 43693, 78753, 0, 12194, 66215, 0, 121273, 67216, 121499, 0, - 121118, 0, 78756, 0, 0, 55256, 0, 0, 0, 0, 43876, 0, 0, 0, 12948, 195003, - 195002, 195005, 195004, 195007, 195006, 0, 128320, 4287, 70183, 4902, - 74020, 0, 0, 0, 1816, 0, 0, 168, 0, 4898, 64298, 0, 78450, 4901, 1821, 0, - 43294, 3653, 0, 791, 9162, 6977, 121183, 0, 70160, 0, 73731, 8354, 0, 0, - 0, 7557, 0, 0, 8234, 194992, 78456, 194994, 194993, 194996, 194995, - 65925, 194997, 195000, 194999, 0, 195001, 0, 64397, 0, 0, 0, 71310, - 194977, 194976, 2448, 194978, 194981, 194980, 2452, 194982, 194985, - 194984, 78694, 72292, 7845, 0, 78692, 4408, 4122, 6772, 194988, 8723, - 72147, 194989, 119302, 67403, 119304, 119303, 2438, 119297, 119300, - 119299, 41953, 0, 42135, 373, 119172, 2119, 11457, 129618, 41955, 0, 0, - 0, 41952, 0, 0, 2127, 0, 128496, 5202, 0, 78765, 42823, 11291, 0, 0, - 12963, 0, 0, 4125, 41958, 12133, 0, 125099, 1271, 129427, 0, 66024, 0, - 3864, 127825, 0, 0, 0, 0, 4166, 0, 0, 0, 7459, 0, 119914, 5384, 0, 0, - 70154, 5759, 0, 0, 0, 0, 66744, 0, 120571, 0, 75066, 5552, 0, 0, 127192, - 5553, 0, 0, 0, 12906, 0, 0, 110787, 110792, 110788, 5554, 0, 12344, - 110786, 0, 0, 0, 0, 0, 8517, 0, 0, 0, 66017, 5555, 92317, 0, 983653, 0, - 0, 0, 9143, 0, 195067, 67995, 195069, 127162, 195071, 195070, 4577, - 64624, 0, 0, 125105, 983661, 4269, 983655, 983652, 983650, 0, 950, 0, - 983654, 983664, 983649, 0, 983656, 0, 119121, 0, 5098, 0, 0, 119099, - 5097, 0, 9848, 0, 10293, 983645, 72798, 0, 0, 70303, 983665, 5102, 5101, - 128370, 0, 8138, 4517, 1932, 5100, 195060, 195059, 1247, 10034, 195064, - 5099, 0, 1441, 0, 4724, 650, 0, 73954, 983266, 129348, 195040, 195043, - 9031, 195045, 195044, 195047, 8545, 66356, 195048, 0, 9154, 127243, 0, 0, - 2676, 2277, 0, 73812, 195051, 8599, 195053, 0, 195055, 65462, 0, 92524, - 195033, 71903, 0, 0, 41199, 0, 11399, 195035, 195034, 195037, 195036, - 195039, 195038, 5108, 5107, 0, 66019, 0, 0, 5541, 0, 0, 12613, 5284, 0, - 0, 128806, 4275, 74865, 854, 68147, 74381, 120918, 0, 5103, 124986, - 64348, 0, 0, 5221, 69811, 0, 0, 121163, 0, 0, 11438, 0, 0, 70158, 0, 0, - 5106, 195024, 110749, 65154, 69813, 195028, 5105, 195030, 69720, 195032, - 5104, 983761, 0, 3176, 0, 70149, 932, 0, 6567, 195009, 195008, 195011, - 195010, 70145, 43850, 195015, 195014, 195017, 195016, 0, 0, 0, 0, 10670, - 0, 13273, 0, 195020, 121370, 8803, 195021, 72431, 8151, 67145, 72436, 0, - 12553, 0, 0, 0, 0, 13065, 12570, 0, 0, 0, 983198, 124985, 0, 0, 66466, 0, - 0, 194595, 0, 194596, 11351, 43256, 0, 0, 0, 0, 41754, 0, 0, 2720, - 194975, 68462, 8232, 120760, 0, 0, 0, 0, 0, 0, 0, 93067, 10834, 0, 0, - 119266, 0, 0, 125025, 67679, 0, 75064, 7781, 0, 0, 126076, 0, 12077, 0, - 64586, 127164, 42396, 0, 3475, 0, 2479, 0, 0, 0, 120728, 0, 42434, - 194960, 194963, 194962, 110611, 67894, 42473, 194966, 110609, 1843, - 42283, 0, 0, 0, 0, 0, 194970, 0, 42321, 7284, 194974, 194973, 194950, - 194949, 194952, 194951, 0, 194953, 123614, 128645, 0, 0, 0, 0, 74952, - 194954, 194957, 194956, 66367, 194958, 41069, 67689, 9988, 0, 41068, 0, - 4295, 0, 0, 41951, 67835, 0, 785, 8236, 128647, 9027, 0, 194943, 0, 0, 0, - 0, 0, 0, 41071, 41059, 0, 92458, 129442, 0, 0, 0, 123612, 2067, 4310, 0, - 123611, 5180, 123605, 0, 73872, 0, 69880, 5184, 42385, 194947, 983755, - 128531, 0, 0, 119149, 0, 121334, 0, 983762, 0, 0, 5178, 194929, 120548, - 194931, 5188, 194933, 194932, 72245, 194934, 1166, 64429, 42639, 0, 0, 0, - 0, 128071, 2442, 10703, 194940, 194939, 194635, 42439, 0, 0, 0, 73933, - 983238, 42401, 0, 0, 0, 42288, 0, 0, 0, 13145, 0, 2468, 0, 42327, 0, 0, - 0, 42479, 0, 0, 0, 92580, 0, 74939, 120678, 0, 73733, 0, 0, 2715, 0, - 71257, 0, 74114, 0, 0, 0, 0, 0, 66325, 69603, 0, 9240, 0, 0, 129142, 0, - 0, 0, 9815, 0, 11246, 0, 73912, 42733, 0, 0, 2480, 0, 0, 0, 6494, 5537, - 0, 0, 0, 0, 1211, 0, 121379, 0, 0, 12318, 0, 113796, 0, 0, 0, 0, 0, - 64642, 0, 0, 0, 0, 64864, 0, 0, 0, 121212, 0, 0, 3589, 92719, 4035, 6492, - 92236, 4265, 6843, 0, 74186, 41778, 113764, 119216, 2488, 0, 4582, 0, - 71426, 41777, 12926, 72708, 7528, 10550, 113761, 0, 0, 11439, 0, 0, - 64878, 0, 0, 0, 0, 2286, 0, 0, 126646, 127909, 0, 400, 126500, 0, 0, 0, - 0, 0, 64827, 0, 74948, 390, 0, 71301, 0, 3473, 0, 0, 66742, 0, 55285, 0, - 0, 0, 92206, 0, 0, 8004, 0, 6763, 0, 0, 7006, 0, 0, 6757, 73707, 126648, - 0, 6766, 0, 0, 0, 6146, 0, 771, 0, 0, 41318, 0, 42272, 0, 0, 0, 0, 953, - 12917, 72287, 12300, 0, 11491, 68612, 0, 0, 71321, 7490, 11389, 7489, - 3379, 0, 7487, 72716, 7486, 7484, 7482, 6753, 7480, 7479, 7478, 7477, - 6501, 7475, 0, 7473, 7472, 2474, 7470, 7468, 124977, 0, 0, 0, 0, 71871, - 11834, 128376, 0, 6017, 0, 0, 0, 0, 0, 119365, 73949, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2472, 69945, 120699, 121133, 2139, 4256, 120776, 74380, 0, - 73847, 73844, 0, 0, 0, 0, 0, 0, 0, 0, 7083, 0, 8066, 7678, 0, 121124, 0, - 0, 0, 0, 0, 0, 0, 0, 120566, 0, 0, 0, 8330, 0, 0, 0, 0, 0, 0, 19934, 0, - 1770, 67091, 0, 128671, 129617, 110605, 110606, 73843, 110604, 0, 110602, - 67092, 0, 71334, 0, 0, 0, 0, 0, 8162, 0, 5996, 129644, 4903, 0, 0, 43063, - 0, 5172, 0, 7139, 0, 127385, 0, 0, 0, 0, 4334, 6324, 41975, 12186, 10674, - 12308, 0, 0, 0, 72807, 41977, 68002, 0, 126630, 2018, 121388, 41979, - 68003, 0, 68000, 0, 0, 126984, 68001, 9334, 0, 71440, 0, 7975, 0, 0, 0, - 66621, 4884, 70367, 983740, 0, 121010, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, + 83339, 83340, 9056, 0, 129970, 0, 6155, 64068, 64067, 64066, 64065, + 64072, 64071, 63, 64069, 127382, 0, 93822, 7257, 64064, 0, 0, 0, 0, 0, 0, + 78748, 0, 0, 0, 120519, 0, 66242, 66232, 4333, 9855, 64112, 0, 0, 0, 0, + 0, 0, 0, 66222, 0, 0, 0, 0, 69816, 0, 118796, 0, 8708, 0, 64077, 64076, + 8996, 4992, 4471, 83343, 64079, 64078, 92179, 0, 0, 129120, 64615, 0, 0, + 12075, 42041, 0, 0, 0, 0, 127557, 3123, 0, 983735, 0, 0, 0, 83328, 0, + 9223, 0, 83321, 83322, 73797, 83327, 1116, 0, 83319, 7136, 0, 0, 0, 0, + 75031, 0, 0, 0, 64092, 43675, 10104, 83338, 83331, 64095, 64094, 8111, + 66247, 0, 64089, 64088, 0, 70106, 42236, 11434, 64083, 64082, 43216, + 7737, 64087, 64086, 64085, 64084, 0, 0, 0, 4118, 1797, 83312, 0, 0, 46, + 83308, 83309, 298, 83303, 72402, 83305, 83306, 0, 0, 0, 128905, 11495, 0, + 0, 0, 127377, 194828, 127370, 0, 0, 0, 66239, 74945, 64403, 0, 0, 83314, + 0, 0, 65758, 43536, 0, 8544, 0, 0, 0, 0, 194824, 0, 0, 0, 0, 0, 3639, + 11242, 194822, 0, 0, 0, 0, 0, 0, 68409, 0, 0, 0, 101121, 0, 0, 0, 128654, + 8789, 126248, 0, 0, 0, 0, 0, 0, 0, 65058, 0, 78234, 68064, 0, 66227, + 71694, 5573, 118936, 0, 44, 0, 66244, 118907, 0, 66238, 12844, 0, 1622, + 129190, 1900, 0, 11458, 0, 0, 6581, 5576, 128303, 0, 126122, 0, 113680, + 8947, 0, 113812, 0, 0, 0, 7908, 0, 0, 6579, 0, 0, 0, 0, 2138, 6583, 7761, + 0, 0, 0, 66802, 5058, 0, 0, 0, 5057, 125256, 0, 74538, 5054, 0, 0, 0, 0, + 0, 0, 658, 3497, 128509, 0, 5061, 5060, 4235, 0, 0, 0, 127757, 4236, + 4727, 0, 0, 0, 128791, 0, 7488, 128693, 7476, 0, 125259, 120646, 0, 0, 0, + 66209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9341, 119596, + 0, 0, 0, 64668, 0, 8125, 0, 6743, 119175, 0, 129441, 83406, 0, 127966, + 119235, 74092, 0, 0, 43660, 71125, 0, 127901, 0, 0, 0, 264, 0, 74954, 0, + 0, 0, 0, 0, 6019, 0, 0, 129121, 0, 0, 0, 8800, 0, 66376, 0, 120948, 0, + 100744, 0, 0, 92333, 725, 68014, 0, 0, 72099, 0, 0, 0, 0, 74899, 0, 0, 0, + 110804, 0, 72142, 5074, 5073, 0, 0, 128726, 0, 70723, 5072, 128576, + 13098, 72403, 0, 11040, 0, 0, 0, 4929, 0, 0, 0, 0, 0, 0, 0, 0, 67754, + 4934, 0, 0, 9758, 0, 0, 70181, 42584, 0, 4329, 0, 4979, 8663, 74521, 0, + 983042, 74418, 0, 0, 5071, 0, 3642, 0, 5070, 10042, 0, 3987, 5068, + 120209, 8909, 0, 0, 69917, 0, 73981, 983141, 70749, 4531, 120212, 9105, + 0, 4921, 121059, 4926, 65544, 113786, 69621, 0, 0, 0, 83269, 0, 120790, + 4922, 0, 992, 119568, 4925, 0, 0, 9526, 4920, 128617, 948, 0, 0, 4930, 0, + 0, 0, 4933, 0, 0, 0, 4928, 0, 0, 0, 0, 128379, 722, 0, 127483, 127482, + 127485, 82997, 127487, 1509, 0, 5468, 66214, 127474, 127477, 1672, + 127479, 10864, 127481, 72132, 127467, 72159, 127469, 127468, 127471, + 127470, 68336, 82999, 120115, 1679, 120116, 0, 120113, 127462, 127465, + 127464, 127110, 120119, 120112, 0, 120109, 6968, 5761, 342, 8553, 0, + 8143, 127115, 127114, 127113, 624, 127111, 4057, 0, 5078, 0, 0, 0, 5076, + 0, 0, 0, 120097, 685, 9025, 1524, 8003, 0, 5539, 113727, 113795, 120102, + 7138, 120552, 0, 0, 0, 113724, 0, 8058, 9732, 0, 5080, 0, 5036, 5035, 0, + 42604, 72118, 0, 0, 275, 13291, 69995, 0, 0, 983908, 5033, 0, 0, 4836, + 70184, 73792, 0, 0, 0, 120681, 43704, 0, 2274, 119000, 124983, 0, 8858, + 6409, 0, 119585, 0, 0, 0, 0, 0, 68442, 0, 3432, 10218, 0, 6094, 11232, 0, + 0, 0, 0, 1676, 129157, 0, 0, 5030, 0, 118810, 0, 73869, 0, 0, 69944, + 6787, 0, 0, 0, 983595, 10544, 12919, 69425, 92218, 0, 0, 0, 129172, 0, + 67703, 0, 0, 0, 0, 0, 72290, 0, 0, 0, 0, 7018, 66241, 0, 0, 0, 0, 0, + 74056, 0, 11833, 0, 67975, 65232, 40964, 251, 12686, 7895, 4395, 43538, + 0, 0, 0, 78042, 0, 0, 40967, 5879, 0, 0, 0, 0, 0, 65540, 128590, 625, 0, + 120194, 1113, 0, 13103, 3630, 67224, 8179, 74264, 67886, 9316, 10980, + 2489, 120958, 8150, 1359, 121353, 70464, 127330, 127327, 5042, 5041, + 42769, 12084, 11196, 127321, 92279, 72398, 120535, 127317, 127318, + 127315, 12283, 127313, 11453, 0, 8795, 66245, 0, 0, 0, 5037, 118864, 0, + 0, 67724, 0, 66893, 74006, 0, 8431, 0, 0, 0, 0, 12620, 6826, 73773, + 70169, 5040, 0, 0, 0, 0, 0, 5039, 0, 0, 0, 5038, 0, 0, 0, 0, 0, 65908, 0, + 0, 0, 0, 0, 65157, 0, 0, 70182, 0, 73909, 4835, 0, 0, 0, 4309, 7127, 0, + 0, 0, 1301, 0, 0, 12222, 0, 73813, 711, 92439, 7133, 0, 0, 0, 0, 0, 0, 0, + 7661, 72263, 129541, 0, 0, 70453, 7627, 0, 5031, 92340, 42738, 65784, 0, + 65782, 3758, 0, 65781, 67865, 0, 2440, 65780, 70795, 8449, 121393, + 121479, 0, 2118, 0, 12121, 0, 0, 129510, 2128, 2130, 2131, 2126, 2133, 0, + 121250, 2114, 2116, 2455, 0, 2122, 2123, 2124, 2125, 983787, 8714, 0, + 2113, 0, 2115, 0, 127907, 43713, 5052, 66220, 66653, 65777, 65778, 65775, + 5051, 65773, 1429, 42647, 5050, 65769, 388, 70685, 735, 0, 129899, + 128035, 0, 12726, 0, 0, 0, 0, 0, 5109, 5053, 0, 120854, 0, 0, 0, 2470, 0, + 0, 1925, 71251, 0, 10971, 113770, 5048, 5047, 0, 0, 194946, 92313, + 129972, 0, 0, 8089, 0, 639, 0, 68179, 0, 70180, 0, 4599, 0, 0, 0, 0, + 983798, 648, 194948, 65819, 0, 0, 0, 129968, 94017, 0, 11777, 9750, + 983122, 0, 0, 92367, 70175, 5046, 66255, 0, 0, 65253, 0, 5045, 0, 1916, + 74069, 5044, 92348, 0, 0, 5043, 0, 0, 0, 74004, 9669, 12341, 0, 8402, 0, + 0, 70174, 0, 3586, 64508, 92456, 0, 0, 119606, 0, 42628, 10069, 0, 0, 0, + 0, 123, 120703, 0, 121326, 0, 10719, 129409, 120444, 10829, 120593, 0, + 12130, 0, 0, 0, 0, 3925, 0, 0, 75065, 71112, 92372, 71110, 71111, 0, + 120441, 120452, 983178, 0, 0, 0, 0, 0, 0, 0, 0, 69879, 8509, 120449, 0, + 0, 0, 120448, 0, 118889, 194858, 0, 0, 0, 66445, 0, 71109, 0, 0, 72425, + 0, 12136, 0, 983629, 0, 0, 0, 0, 19922, 41768, 74002, 0, 0, 0, 0, 2458, + 0, 0, 0, 41074, 4266, 0, 0, 41077, 0, 9050, 0, 0, 73693, 0, 0, 41075, + 2476, 0, 0, 0, 69761, 0, 0, 74202, 78745, 0, 121324, 70152, 66033, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 83106, 0, 0, 0, 43693, 78753, 0, 12194, 66215, + 71987, 121273, 67216, 121499, 0, 121118, 0, 78756, 0, 0, 55256, 0, 0, 0, + 0, 43876, 0, 0, 0, 12948, 195003, 195002, 195005, 195004, 195007, 195006, + 0, 128320, 4287, 70183, 4902, 74020, 0, 0, 0, 1816, 0, 0, 168, 0, 4898, + 64298, 0, 78450, 4901, 1821, 0, 43294, 3653, 0, 791, 9162, 6977, 121183, + 0, 70160, 0, 73731, 8354, 0, 0, 0, 7557, 0, 0, 8234, 194992, 78456, + 194994, 194993, 194996, 101519, 65925, 194997, 195000, 194999, 0, 195001, + 0, 64397, 0, 0, 0, 71310, 194977, 194976, 2448, 194978, 194981, 194980, + 2452, 194982, 194985, 194984, 78694, 72292, 7845, 0, 78692, 4408, 4122, + 6772, 194988, 8723, 72147, 194989, 119302, 11857, 119304, 119303, 2438, + 119297, 119300, 119299, 41953, 0, 42135, 373, 119172, 2119, 11457, + 129618, 41955, 0, 0, 0, 41952, 0, 0, 2127, 0, 128496, 5202, 0, 78765, + 42823, 11291, 0, 0, 12963, 0, 0, 4125, 41958, 12133, 0, 125099, 1271, + 129427, 0, 66024, 0, 3864, 127825, 0, 0, 0, 0, 4166, 0, 0, 129917, 7459, + 0, 119914, 5384, 0, 0, 70154, 5759, 0, 0, 0, 0, 66744, 0, 120571, 0, + 75066, 5552, 0, 0, 127192, 5553, 0, 0, 0, 12906, 0, 0, 110787, 110792, + 110788, 5554, 0, 12344, 110786, 101508, 0, 0, 0, 0, 8517, 101509, 0, 0, + 66017, 5555, 92317, 0, 983653, 0, 0, 0, 9143, 0, 195067, 67995, 195069, + 127162, 195071, 195070, 4577, 64624, 0, 0, 125105, 983661, 4269, 983655, + 983652, 983650, 0, 950, 0, 983654, 983664, 983649, 0, 983656, 0, 119121, + 0, 5098, 0, 0, 119099, 5097, 0, 9848, 0, 10293, 983645, 72798, 0, 0, + 70303, 983665, 5102, 5101, 128370, 0, 8138, 4517, 1932, 5100, 195060, + 195059, 1247, 10034, 195064, 5099, 0, 1441, 0, 4724, 650, 0, 73954, + 983266, 129348, 195040, 195043, 9031, 195045, 195044, 195047, 8545, + 66356, 195048, 0, 9154, 127243, 0, 0, 2676, 2277, 0, 73812, 195051, 8599, + 195053, 917918, 195055, 65462, 0, 92524, 195033, 71903, 0, 0, 41199, 0, + 11399, 195035, 195034, 195037, 195036, 195039, 195038, 5108, 5107, 0, + 66019, 0, 0, 5541, 0, 0, 12613, 5284, 0, 0, 128806, 4275, 74865, 854, + 68147, 74381, 120918, 0, 5103, 124986, 64348, 0, 0, 5221, 69811, 0, 0, + 121163, 0, 0, 11438, 0, 0, 70158, 0, 0, 5106, 195024, 110749, 65154, + 69813, 195028, 5105, 195030, 69720, 195032, 5104, 983761, 0, 3176, + 127342, 70149, 932, 0, 6567, 195009, 195008, 195011, 195010, 70145, + 43850, 195015, 195014, 195017, 195016, 0, 0, 0, 0, 10670, 0, 13273, 0, + 195020, 121370, 8803, 195021, 72431, 8151, 67145, 72436, 0, 12553, 0, 0, + 0, 0, 13065, 12570, 0, 0, 0, 983198, 124985, 0, 0, 66466, 0, 0, 194595, + 0, 194596, 11351, 43256, 0, 0, 0, 0, 41754, 0, 0, 2720, 194975, 68462, + 8232, 120760, 0, 0, 0, 0, 0, 0, 0, 93067, 10834, 0, 0, 119266, 0, 0, + 125025, 67679, 0, 75064, 7781, 0, 0, 126076, 0, 12077, 0, 64586, 127164, + 42396, 0, 3475, 0, 2479, 0, 0, 0, 120728, 0, 42434, 194960, 194963, + 194962, 110611, 67894, 42473, 194966, 110609, 1843, 42283, 0, 0, 0, 0, 0, + 194970, 0, 42321, 7284, 194974, 194973, 194950, 194949, 194952, 194951, + 0, 194953, 123614, 128645, 0, 0, 0, 0, 74952, 194954, 194957, 194956, + 66367, 194958, 41069, 67689, 9988, 0, 41068, 0, 4295, 0, 0, 41951, 67835, + 0, 785, 8236, 128647, 9027, 0, 194943, 0, 0, 0, 0, 0, 0, 41071, 41059, 0, + 92458, 129442, 0, 0, 0, 123612, 2067, 4310, 0, 123611, 5180, 123605, 0, + 73872, 0, 69880, 5184, 42385, 194947, 983755, 128531, 0, 0, 119149, 0, + 121334, 0, 983762, 0, 0, 5178, 194929, 120548, 194931, 5188, 194933, + 194932, 72245, 194934, 1166, 64429, 42639, 0, 0, 0, 0, 128071, 2442, + 10703, 194940, 194939, 194635, 42439, 0, 0, 0, 73933, 983238, 42401, 0, + 0, 0, 42288, 0, 0, 0, 13145, 0, 2468, 0, 42327, 0, 0, 0, 42479, 128698, + 0, 0, 92580, 0, 74939, 120678, 0, 73733, 0, 0, 2715, 0, 71257, 0, 74114, + 0, 0, 0, 0, 0, 66325, 69603, 0, 9240, 0, 0, 129142, 0, 0, 0, 9815, 0, + 11246, 0, 73912, 42733, 0, 0, 2480, 0, 0, 0, 6494, 5537, 0, 0, 0, 0, + 1211, 0, 121379, 0, 0, 12318, 0, 113796, 0, 0, 0, 0, 0, 64642, 0, 0, 0, + 0, 64864, 0, 0, 0, 121212, 0, 0, 3589, 92719, 4035, 6492, 92236, 4265, + 6843, 0, 74186, 41778, 113764, 119216, 2488, 0, 4582, 0, 71426, 41777, + 12926, 72708, 7528, 10550, 113761, 0, 0, 11439, 0, 0, 64878, 0, 0, 0, 0, + 2286, 0, 0, 126646, 127909, 0, 400, 126500, 0, 0, 0, 0, 0, 64827, 0, + 74948, 390, 0, 71301, 0, 3473, 0, 0, 66742, 0, 55285, 0, 0, 0, 92206, 0, + 0, 8004, 0, 6763, 0, 0, 7006, 0, 0, 6757, 73707, 126648, 0, 6766, 0, 0, + 0, 6146, 0, 771, 0, 0, 41318, 0, 42272, 0, 120211, 69559, 0, 953, 12917, + 72287, 12300, 0, 11491, 68612, 0, 0, 71321, 7490, 11389, 7489, 3379, 0, + 7487, 72716, 7486, 7484, 7482, 6753, 7480, 7479, 7478, 7477, 6501, 7475, + 0, 7473, 7472, 2474, 7470, 7468, 124977, 0, 0, 0, 0, 71871, 11834, + 128376, 0, 6017, 0, 128763, 0, 0, 0, 119365, 73949, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2472, 69945, 120699, 121133, 2139, 4256, 120776, 74380, 0, + 73847, 73844, 0, 0, 101375, 0, 101374, 0, 0, 101347, 7083, 0, 8066, 7678, + 0, 121124, 101341, 101373, 101336, 0, 101331, 0, 101304, 0, 101301, 0, 0, + 0, 8330, 0, 101298, 101322, 101297, 0, 0, 19934, 0, 1770, 67091, 0, + 128671, 129617, 110605, 101355, 73843, 110604, 0, 101362, 67092, 0, + 71334, 0, 0, 0, 0, 0, 8162, 0, 5996, 129644, 4903, 0, 0, 43063, 0, 5172, + 0, 7139, 0, 127385, 0, 0, 0, 0, 4334, 6324, 41975, 12186, 10674, 12308, + 0, 0, 0, 72807, 41977, 68002, 0, 126630, 2018, 121388, 41979, 68003, 0, + 68000, 0, 0, 126984, 68001, 9334, 0, 71440, 0, 7975, 0, 0, 0, 66621, + 4884, 70367, 983740, 0, 121010, 0, 0, 0, 0, 127799, 0, 0, 0, 463, 0, 0, 69617, 6509, 5460, 0, 0, 0, 0, 42279, 0, 0, 0, 0, 0, 0, 0, 125027, 0, 121119, 0, 0, 0, 5663, 0, 0, 0, 0, 2482, 66202, 0, 0, 42247, 65174, 73925, 0, 100940, 0, 0, 126573, 0, 0, 2460, 0, 11944, 0, 0, 64679, 120835, 127310, 0, 0, 0, 5870, 0, 0, 0, 100931, 539, 100933, 100932, 100935, 9064, 100937, 100936, 100939, 100938, 0, 0, 0, 0, 0, 0, 41295, - 100941, 2478, 100943, 4162, 100945, 4260, 12953, 100950, 100949, 0, 0, 0, - 0, 0, 0, 0, 0, 5000, 0, 0, 0, 69672, 71439, 0, 74017, 0, 0, 6709, 0, 0, - 983720, 0, 0, 100922, 100921, 10301, 10333, 10397, 100925, 100928, + 100941, 2478, 100943, 4162, 100945, 4260, 12953, 100950, 100949, 129800, + 0, 0, 0, 0, 0, 0, 0, 5000, 0, 0, 0, 69672, 71439, 0, 74017, 0, 0, 6709, + 0, 0, 983720, 0, 0, 100922, 100921, 10301, 10333, 10397, 100925, 100928, 100927, 0, 0, 0, 127830, 0, 4014, 12842, 0, 67413, 0, 0, 3893, 0, 0, 12210, 0, 42147, 0, 983622, 74465, 0, 0, 0, 0, 0, 0, 0, 0, 110805, 8231, 0, 69946, 41968, 100929, 41973, 12935, 41969, 0, 2453, 0, 0, 78807, 122893, 0, 10349, 10413, 0, 41962, 3202, 119097, 0, 8316, 129174, 0, 7314, 0, 0, 0, 0, 1840, 0, 0, 0, 4883, 100908, 4723, 70099, 100909, 0, 0, 0, 0, 11089, 240, 19906, 0, 0, 0, 43600, 121004, 13134, 93065, 0, 65931, - 110649, 110650, 42634, 110648, 0, 121005, 11463, 0, 0, 0, 10445, 0, - 92969, 0, 2614, 0, 0, 1729, 0, 0, 100911, 0, 43334, 100912, 100915, + 110649, 110650, 42634, 110648, 0, 121005, 11463, 0, 0, 129861, 10445, 0, + 92969, 0, 2614, 0, 129954, 1729, 0, 0, 100911, 0, 43334, 100912, 100915, 100914, 66201, 100916, 69662, 100896, 100899, 100898, 4121, 100900, 70272, 82954, 63879, 0, 70872, 0, 0, 4039, 643, 7726, 120082, 0, 120068, 58, 0, 0, 0, 63872, 0, 0, 100891, 0, 10625, 100892, 100895, 100894, 1416, 120073, 917761, 67393, 0, 0, 0, 6996, 4264, 0, 100902, 66179, 66768, 100903, 13114, 72311, 0, 3094, 0, 0, 127074, 4437, 0, 0, 0, 55280, 42174, - 0, 42430, 0, 72246, 42355, 0, 0, 0, 0, 121251, 127401, 0, 0, 0, 0, 0, 0, - 100882, 100881, 74037, 100883, 0, 127099, 0, 0, 0, 0, 0, 69646, 65035, - 65034, 11480, 6116, 65039, 65038, 41180, 65036, 194565, 0, 12101, 5822, - 0, 0, 0, 0, 11663, 127873, 63854, 119657, 63853, 0, 0, 65810, 4289, + 0, 42430, 129796, 72246, 42355, 0, 0, 0, 0, 121251, 127401, 0, 0, 0, 0, + 0, 0, 100882, 100881, 74037, 100883, 0, 127099, 0, 0, 0, 0, 0, 69646, + 65035, 65034, 11480, 6116, 65039, 65038, 41180, 65036, 194565, 0, 12101, + 5822, 0, 0, 0, 0, 11663, 127873, 63854, 119657, 63853, 0, 0, 65810, 4289, 100885, 63896, 100887, 100890, 43621, 0, 0, 0, 129613, 194560, 7461, 73901, 0, 331, 0, 0, 0, 128029, 0, 0, 0, 74629, 0, 0, 0, 41964, 0, 63843, 2084, 41965, 0, 100864, 100863, 100866, 63841, 78549, 41220, 13032, @@ -26004,177 +26850,180 @@ static const unsigned int code_hash[] = { 0, 78504, 78830, 0, 0, 43873, 0, 0, 0, 0, 11988, 78510, 195, 68321, 41501, 0, 42031, 0, 13135, 0, 0, 0, 41499, 0, 0, 9680, 41498, 917794, 42025, 78567, 78556, 0, 0, 0, 0, 0, 0, 101074, 120502, 92597, 0, 0, - 917784, 7864, 129001, 0, 917788, 121106, 917786, 917785, 917792, 67816, - 917790, 2219, 0, 0, 0, 0, 0, 0, 121277, 0, 917777, 917776, 917775, 69644, - 917781, 917780, 917779, 917778, 8668, 0, 121383, 917782, 5999, 0, 0, - 129195, 128243, 43653, 1726, 1015, 0, 0, 0, 0, 64919, 0, 0, 0, 128478, 0, - 69791, 927, 0, 0, 42010, 0, 42021, 0, 0, 1299, 12240, 64537, 0, 0, 0, 0, - 0, 0, 69454, 0, 0, 0, 122903, 19914, 12179, 0, 2296, 0, 0, 63832, 917773, - 0, 63816, 2594, 63823, 63817, 11178, 0, 0, 0, 11265, 68295, 0, 0, 0, - 10554, 3972, 0, 121198, 0, 917766, 10816, 917764, 119608, 74374, 917769, - 11210, 93069, 8586, 3882, 8532, 120183, 1573, 128648, 0, 69916, 0, - 101051, 67719, 0, 0, 0, 0, 0, 0, 0, 128821, 119169, 0, 0, 6626, 42763, 0, - 118884, 128613, 0, 83128, 0, 0, 0, 0, 0, 983561, 0, 0, 0, 9171, 0, 0, - 71305, 983900, 121146, 0, 0, 128881, 119604, 126596, 0, 0, 0, 128214, - 42368, 0, 983105, 2271, 41487, 12118, 74124, 68651, 110836, 110833, 3009, - 41476, 41489, 69825, 3007, 1448, 3018, 0, 41491, 8521, 5083, 5082, 0, 0, - 8519, 0, 3014, 5081, 73926, 0, 128549, 0, 69951, 5079, 0, 2557, 128086, - 65532, 11828, 0, 71297, 11105, 0, 0, 0, 8518, 10779, 0, 71303, 0, 0, - 42170, 110769, 0, 629, 1924, 0, 12037, 0, 5987, 8462, 127744, 0, 63933, - 69735, 110770, 128295, 63941, 67981, 5077, 0, 10880, 64849, 5075, 0, - 128152, 65075, 0, 11007, 983717, 0, 0, 0, 66684, 72331, 3434, 72338, - 1904, 0, 0, 72730, 0, 10499, 4507, 9578, 63925, 0, 7979, 0, 9831, 66689, - 0, 461, 0, 0, 4504, 0, 0, 6325, 0, 43021, 0, 0, 55236, 0, 0, 5177, 41324, - 12055, 63831, 0, 41327, 12591, 0, 4114, 409, 0, 0, 8948, 41325, 0, 721, - 10182, 0, 71311, 0, 0, 94052, 74963, 83503, 5998, 0, 0, 74825, 0, 12587, - 0, 78571, 74889, 71328, 128955, 0, 74121, 0, 78822, 0, 0, 5995, 0, 42568, - 0, 0, 63944, 73860, 0, 0, 4167, 0, 43175, 0, 74120, 0, 65076, 938, 73857, - 73854, 11737, 9721, 0, 0, 0, 11742, 0, 0, 11493, 12334, 128762, 0, 66623, - 0, 9173, 0, 11978, 0, 73982, 113750, 113741, 0, 6759, 0, 0, 0, 126222, 0, - 70388, 129093, 13027, 42777, 7683, 1167, 0, 4983, 0, 861, 0, 0, 68297, 0, - 43757, 92978, 129298, 0, 0, 0, 0, 70815, 9616, 0, 0, 12816, 43759, 0, - 12710, 68674, 12721, 4101, 66185, 0, 5992, 7616, 0, 0, 12577, 0, 0, 853, - 42693, 0, 121088, 0, 0, 917915, 0, 42835, 0, 0, 0, 0, 0, 12712, 7105, - 127807, 65060, 66875, 9900, 0, 0, 0, 121482, 119265, 0, 64778, 12585, 0, - 0, 0, 0, 0, 0, 77826, 0, 4900, 125245, 0, 0, 0, 4119, 74768, 8971, 0, 0, - 0, 78594, 41132, 9245, 73060, 0, 4138, 194841, 0, 0, 0, 77827, 0, 13054, - 0, 0, 128416, 110760, 0, 0, 3948, 128878, 0, 0, 0, 1680, 0, 78589, 0, 0, - 120032, 0, 0, 0, 0, 74833, 74190, 5993, 42709, 0, 12706, 77846, 1893, 0, - 63915, 0, 0, 110744, 0, 0, 63997, 120018, 63996, 3077, 0, 0, 1512, 0, - 12589, 41479, 0, 0, 0, 0, 11831, 120727, 0, 41481, 0, 118912, 0, 3090, 0, - 3086, 1664, 1850, 0, 3079, 0, 0, 94080, 127140, 0, 0, 74401, 0, 917555, - 0, 0, 0, 0, 0, 11526, 63985, 5864, 0, 63992, 0, 63991, 0, 5480, 7858, 0, - 4116, 78149, 0, 0, 0, 63907, 0, 0, 126131, 63905, 119601, 0, 983190, 0, - 119666, 0, 0, 7534, 507, 91, 2042, 120775, 0, 0, 66028, 118811, 41844, - 70680, 774, 0, 0, 0, 5994, 0, 0, 0, 0, 0, 72297, 0, 0, 0, 0, 6026, 0, 0, - 0, 162, 0, 125247, 78151, 78152, 983590, 92709, 0, 68304, 0, 0, 0, 66658, - 0, 0, 0, 0, 121511, 2226, 121512, 129349, 10492, 0, 121510, 0, 43119, 0, - 0, 0, 66192, 0, 0, 4899, 12729, 0, 0, 0, 0, 4103, 0, 0, 77851, 69429, + 917784, 7864, 129001, 129704, 917788, 121106, 917786, 917785, 917792, + 67816, 129876, 2219, 0, 0, 0, 0, 0, 0, 121277, 0, 917777, 917776, 917775, + 69644, 917781, 917780, 917779, 917778, 8668, 0, 121383, 917782, 5999, 0, + 0, 129195, 128243, 43653, 1726, 1015, 0, 127247, 0, 0, 64919, 0, 0, 0, + 128478, 0, 69791, 927, 0, 0, 42010, 0, 42021, 0, 0, 1299, 12240, 64537, + 0, 0, 0, 0, 0, 0, 69454, 0, 0, 0, 122903, 19914, 12179, 0, 2296, 0, 0, + 63832, 917773, 0, 63816, 2594, 63823, 63817, 11178, 0, 0, 0, 11265, + 68295, 0, 0, 0, 10554, 3972, 0, 121198, 0, 917766, 10816, 917764, 119608, + 74374, 917769, 11210, 93069, 8586, 3882, 8532, 120183, 1573, 128648, 0, + 69916, 0, 101051, 67719, 0, 0, 0, 0, 0, 0, 0, 128821, 119169, 0, 0, 6626, + 42763, 130034, 118884, 128613, 0, 83128, 0, 0, 0, 0, 0, 983561, 0, 0, 0, + 9171, 0, 0, 71305, 983900, 121146, 0, 101095, 128881, 119604, 126596, 0, + 0, 0, 128214, 42368, 0, 983105, 2271, 41487, 12118, 74124, 68651, 110836, + 110833, 3009, 41476, 41489, 69825, 3007, 1448, 3018, 0, 41491, 8521, + 5083, 5082, 0, 0, 8519, 0, 3014, 5081, 73926, 0, 128549, 0, 69951, 5079, + 129963, 2557, 128086, 65532, 11828, 0, 71297, 11105, 0, 0, 0, 8518, + 10779, 0, 71303, 0, 0, 42170, 110769, 0, 629, 1924, 0, 12037, 0, 5987, + 8462, 127744, 0, 63933, 69735, 110770, 128295, 63941, 67981, 5077, 0, + 10880, 64849, 5075, 0, 128152, 65075, 0, 11007, 983717, 0, 0, 0, 66684, + 72331, 3434, 72338, 1904, 0, 0, 72730, 0, 10499, 4507, 9578, 63925, 0, + 7979, 0, 9831, 66689, 0, 461, 194834, 0, 4504, 0, 0, 6325, 0, 43021, 0, + 0, 55236, 0, 0, 5177, 41324, 12055, 63831, 0, 41327, 12591, 0, 4114, 409, + 0, 0, 8948, 41325, 0, 721, 10182, 0, 71311, 0, 0, 94052, 74963, 83503, + 5998, 0, 0, 74825, 0, 12587, 0, 78571, 74889, 71328, 128955, 0, 74121, + 78570, 78822, 0, 0, 5995, 0, 42568, 0, 0, 63944, 73860, 0, 0, 4167, 0, + 43175, 0, 74120, 0, 65076, 938, 73857, 73854, 11737, 9721, 0, 0, 0, + 11742, 0, 0, 11493, 12334, 128762, 0, 66623, 0, 9173, 0, 11978, 0, 12734, + 113750, 113741, 0, 6759, 0, 0, 0, 126222, 0, 70388, 129093, 13027, 42777, + 7683, 1167, 0, 4983, 0, 861, 0, 0, 68297, 0, 43757, 92978, 129298, 0, 0, + 0, 0, 70815, 9616, 0, 0, 12816, 43759, 0, 12710, 68674, 12721, 4101, + 66185, 0, 5992, 7616, 0, 0, 12577, 0, 0, 853, 42693, 0, 121088, 0, 0, + 917915, 0, 42835, 0, 0, 0, 0, 0, 12712, 7105, 127807, 65060, 66875, 9900, + 0, 0, 0, 121482, 119265, 0, 64778, 12585, 0, 0, 0, 0, 0, 0, 77826, 0, + 4900, 125245, 0, 0, 0, 4119, 74768, 8971, 0, 0, 0, 78594, 41132, 9245, + 73060, 0, 4138, 194841, 0, 0, 0, 77827, 0, 13054, 0, 0, 128416, 110760, + 0, 0, 3948, 128878, 0, 0, 0, 1680, 0, 78589, 0, 0, 120032, 0, 0, 0, 0, + 74833, 74190, 5993, 42709, 0, 12706, 77846, 1893, 0, 63915, 0, 0, 110744, + 129826, 0, 63997, 120018, 63996, 3077, 0, 0, 1512, 0, 12589, 41479, 0, 0, + 0, 0, 11831, 120727, 0, 41481, 0, 118912, 0, 3090, 0, 3086, 1664, 1850, + 0, 3079, 0, 0, 94080, 127140, 0, 0, 74401, 0, 917555, 0, 0, 0, 0, 0, + 11526, 63985, 5864, 0, 63992, 0, 63991, 0, 5480, 7858, 0, 4116, 78149, 0, + 0, 0, 63907, 0, 0, 126131, 63905, 119601, 0, 983190, 0, 119666, 0, 0, + 7534, 507, 91, 2042, 120775, 0, 0, 66028, 118811, 41844, 70680, 774, 0, + 0, 0, 5994, 0, 12733, 0, 0, 0, 72297, 0, 0, 0, 0, 6026, 0, 0, 0, 162, 0, + 125247, 78151, 78152, 983590, 92709, 0, 68304, 0, 0, 0, 66658, 0, 0, 0, + 0, 121511, 2226, 121512, 129349, 10492, 0, 121510, 0, 43119, 0, 0, 0, + 66192, 0, 0, 4899, 12729, 0, 0, 0, 0, 4103, 0, 129842, 77851, 69429, 129046, 0, 12859, 70087, 0, 0, 0, 0, 0, 0, 0, 0, 65264, 5146, 0, 194694, - 71684, 0, 0, 0, 983844, 0, 71688, 194693, 5147, 125019, 0, 74524, 71682, - 128435, 0, 194692, 5991, 3445, 0, 4976, 66193, 0, 0, 0, 0, 128309, 0, 0, - 0, 0, 63855, 0, 10138, 0, 0, 8897, 0, 75027, 0, 120931, 77862, 65836, 0, - 0, 77860, 0, 0, 1123, 4124, 41553, 77903, 0, 71680, 121386, 398, 0, 0, - 41551, 0, 0, 0, 41550, 9970, 0, 93062, 42392, 1305, 78901, 0, 0, 0, 7346, - 41464, 0, 0, 0, 41465, 983577, 8528, 9149, 0, 63955, 165, 3024, 11852, - 119163, 0, 9093, 0, 9147, 0, 0, 110989, 9148, 0, 4096, 53, 8296, 0, - 71352, 0, 9594, 0, 0, 63952, 0, 10997, 0, 0, 5805, 0, 0, 0, 42176, 71455, - 74601, 129604, 10591, 0, 0, 0, 0, 0, 0, 0, 0, 92475, 0, 0, 42379, 0, 0, - 9220, 0, 121425, 0, 0, 4132, 0, 0, 11239, 0, 0, 74837, 0, 66408, 0, 8055, - 0, 0, 0, 63962, 74042, 8924, 43123, 5988, 0, 63969, 0, 42718, 8788, 1357, - 77872, 65743, 0, 8774, 0, 0, 0, 0, 92748, 120598, 128234, 9564, 0, 0, - 119124, 0, 121241, 110983, 92975, 3121, 0, 0, 0, 70081, 0, 0, 0, 0, 0, - 64851, 0, 0, 73085, 119532, 0, 0, 0, 0, 1198, 0, 66708, 64619, 0, 64663, - 93991, 0, 0, 2101, 1398, 0, 92554, 0, 0, 92684, 11406, 0, 12127, 0, 840, - 0, 0, 7101, 120938, 0, 0, 12880, 0, 43104, 0, 0, 0, 2117, 0, 0, 0, 0, 0, - 0, 0, 7769, 0, 92413, 0, 0, 0, 0, 40986, 83117, 0, 0, 4127, 0, 0, 0, 0, - 0, 0, 70738, 0, 129466, 0, 0, 0, 0, 119081, 0, 10581, 0, 4533, 0, 128941, - 6490, 0, 12038, 0, 0, 68225, 0, 0, 69704, 0, 1948, 119007, 129607, - 128594, 0, 0, 0, 120802, 0, 9494, 0, 0, 0, 4843, 0, 74772, 4098, 0, 0, 0, - 3436, 0, 127279, 12817, 0, 126607, 0, 0, 0, 0, 74433, 0, 0, 0, 0, 121296, - 65916, 0, 0, 121458, 0, 129107, 93815, 0, 73743, 0, 0, 983132, 67676, 0, - 0, 74627, 128928, 0, 127892, 0, 71326, 67222, 0, 75013, 92435, 0, 128500, - 0, 0, 9613, 43425, 4526, 121415, 0, 64520, 71336, 0, 0, 55278, 10228, - 64957, 0, 0, 3807, 2081, 66640, 0, 0, 0, 0, 119269, 0, 128688, 0, 128142, - 1451, 0, 0, 4134, 0, 74847, 0, 74793, 0, 0, 74295, 9960, 1201, 0, 12846, - 121271, 0, 11919, 64962, 0, 43739, 0, 66358, 0, 0, 0, 43679, 72284, - 72289, 0, 129523, 1253, 983851, 65766, 500, 65764, 65765, 65762, 65763, - 65760, 65761, 70334, 983848, 9821, 11702, 110630, 110631, 110628, 110629, - 128481, 0, 7533, 66717, 92500, 92305, 0, 0, 0, 127758, 71332, 0, 0, 0, 0, - 11188, 0, 4112, 0, 0, 12890, 0, 0, 9915, 0, 68423, 0, 0, 2876, 0, 0, 0, - 0, 7382, 92415, 0, 128132, 0, 0, 0, 0, 0, 127915, 0, 7003, 0, 0, 7704, 0, - 0, 0, 4123, 0, 0, 9977, 0, 0, 65759, 0, 0, 128266, 9808, 0, 92611, 4126, - 0, 9521, 9589, 64755, 0, 0, 0, 69948, 0, 92368, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 93814, 0, 0, 92234, 0, 10693, 0, 0, 65897, 4058, 0, 0, 64660, 0, 0, 0, - 983711, 1139, 43298, 0, 71333, 8970, 0, 9934, 0, 11023, 128020, 42522, 0, - 0, 0, 78899, 3057, 128113, 7349, 121327, 128722, 68065, 110813, 0, - 128090, 67201, 0, 0, 0, 9528, 0, 0, 0, 9102, 627, 0, 6273, 129496, 0, 0, - 983210, 92966, 43300, 0, 983721, 11696, 0, 1018, 65554, 0, 74338, 0, - 7645, 0, 128321, 0, 0, 0, 0, 73814, 11544, 12563, 10728, 0, 0, 127340, - 43311, 64966, 0, 0, 0, 118946, 0, 0, 74779, 0, 185, 65085, 74533, 0, 0, - 7535, 0, 42525, 0, 9749, 41701, 6131, 0, 4117, 129062, 126988, 0, 92429, - 65693, 0, 73445, 0, 69695, 0, 0, 0, 0, 0, 0, 0, 1184, 0, 815, 0, 0, 0, 0, - 0, 71325, 0, 0, 64683, 983797, 0, 127959, 0, 0, 0, 0, 0, 0, 0, 68166, 0, - 0, 0, 0, 66799, 0, 128912, 0, 5142, 0, 69643, 0, 0, 83367, 93975, 0, 0, - 0, 123209, 0, 0, 0, 74855, 121330, 0, 0, 0, 0, 10940, 66030, 0, 70385, 0, - 0, 2652, 120527, 0, 0, 0, 126508, 0, 0, 0, 0, 0, 0, 1828, 0, 128357, 0, - 8531, 0, 74799, 12324, 72434, 65238, 68374, 0, 65573, 0, 68308, 68679, - 12904, 43445, 0, 0, 0, 11247, 0, 0, 41426, 0, 0, 0, 0, 0, 67250, 69451, - 83354, 71337, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 121178, 0, 0, 74474, 71306, - 0, 7298, 128256, 0, 0, 0, 0, 8210, 0, 0, 0, 2046, 0, 0, 0, 70333, 0, - 1506, 69926, 0, 83353, 0, 12651, 0, 0, 0, 12058, 120626, 72111, 7803, 0, - 0, 65592, 118844, 0, 0, 355, 9719, 0, 118961, 0, 121077, 0, 0, 42178, 0, - 69760, 42571, 0, 0, 0, 0, 0, 0, 127176, 3178, 0, 0, 92704, 83381, 9080, - 120943, 67697, 0, 121342, 0, 0, 71485, 0, 917837, 0, 0, 78157, 0, 0, 0, - 0, 0, 71313, 0, 0, 128212, 0, 72238, 67858, 0, 0, 0, 0, 0, 0, 0, 10770, - 118994, 0, 465, 0, 0, 74348, 0, 0, 0, 0, 0, 0, 0, 10930, 0, 0, 0, 119091, - 69388, 983614, 0, 0, 0, 0, 0, 0, 10092, 0, 0, 0, 0, 0, 1766, 11282, - 11996, 66644, 4547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120906, 4345, 0, 0, - 128947, 0, 0, 0, 0, 0, 5382, 0, 0, 0, 0, 0, 5406, 43127, 121139, 0, 3590, - 0, 0, 0, 0, 42016, 0, 0, 121002, 0, 7742, 0, 66562, 71323, 0, 0, 5310, 0, - 128173, 0, 43594, 0, 128260, 66723, 0, 73816, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1326, 128723, 0, 0, 74519, 0, 0, 0, 0, 71308, 0, 5410, 5783, 0, 8403, - 5400, 120526, 0, 128863, 0, 0, 0, 64412, 0, 0, 5587, 42865, 71858, 0, 0, - 0, 0, 113785, 0, 120755, 0, 69738, 0, 74867, 10461, 12103, 0, 0, 70701, - 0, 0, 0, 0, 0, 94009, 0, 0, 0, 8816, 41515, 0, 11802, 0, 7585, 910, 0, 0, - 0, 3658, 83386, 120525, 0, 7617, 0, 12888, 0, 0, 64631, 0, 41514, 11097, - 5703, 0, 41517, 41504, 41519, 0, 70104, 0, 65864, 0, 120533, 0, 121037, - 0, 0, 43553, 120774, 0, 0, 0, 0, 0, 1578, 0, 43449, 0, 0, 8225, 121191, - 94024, 72799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110655, 0, 110656, 121247, - 72213, 0, 110658, 0, 74997, 0, 3195, 10999, 983566, 7897, 0, 1203, 74396, - 0, 64544, 0, 0, 0, 2877, 0, 0, 0, 121112, 0, 0, 128977, 119607, 0, 0, 0, - 0, 983623, 0, 0, 0, 0, 0, 0, 0, 0, 983078, 0, 0, 0, 9939, 0, 0, 0, 0, 0, - 0, 0, 10714, 0, 0, 0, 0, 0, 67738, 0, 74038, 0, 42897, 0, 0, 0, 0, 0, 0, - 7730, 0, 0, 0, 11163, 0, 0, 0, 113701, 4966, 128802, 70674, 129468, - 123207, 3841, 0, 0, 983227, 77886, 0, 4972, 0, 64699, 0, 0, 0, 0, 0, - 12705, 10203, 9608, 0, 0, 11962, 121397, 0, 1196, 67684, 0, 777, 0, 0, - 65271, 0, 0, 0, 0, 64824, 983194, 0, 9454, 63778, 8658, 0, 0, 2705, 0, - 64894, 0, 0, 11986, 92636, 0, 8280, 0, 2701, 0, 0, 0, 0, 0, 9809, 0, 0, - 0, 0, 0, 63761, 1748, 0, 65719, 121078, 0, 0, 0, 55244, 3061, 0, 63765, - 63787, 0, 41520, 0, 7694, 0, 8896, 63768, 55282, 0, 127781, 0, 0, 63807, - 1591, 0, 6386, 119144, 0, 0, 0, 983199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68289, - 0, 0, 7624, 0, 10996, 92247, 10609, 0, 127181, 10987, 0, 70370, 3894, 0, - 0, 0, 0, 493, 0, 0, 1717, 12228, 479, 917941, 129347, 129473, 917935, - 917939, 917924, 917932, 92303, 64315, 0, 0, 83522, 6233, 42681, 83525, - 83518, 83519, 64911, 83521, 0, 0, 83516, 83517, 983081, 8378, 11632, 0, - 0, 7323, 0, 120771, 0, 0, 0, 0, 120904, 83526, 0, 128710, 92672, 0, 0, 0, - 0, 0, 0, 0, 63806, 63800, 0, 0, 0, 63798, 63803, 244, 11542, 0, 0, 73761, - 0, 12669, 120310, 0, 0, 0, 0, 120680, 71908, 0, 0, 8612, 0, 0, 0, 0, 0, - 64662, 125056, 1360, 248, 0, 63797, 0, 63794, 0, 7292, 983666, 63756, - 42786, 74957, 0, 12663, 0, 0, 0, 0, 0, 0, 0, 4579, 0, 0, 0, 0, 0, 0, - 71130, 65545, 9602, 8623, 0, 128052, 0, 0, 0, 0, 0, 0, 0, 659, 6098, 0, - 12234, 83511, 83512, 8311, 83514, 7669, 83508, 83509, 83510, 0, 0, 0, 0, - 983932, 0, 0, 2323, 0, 2319, 77917, 120900, 77916, 2311, 83077, 4415, - 1586, 68050, 0, 128724, 83020, 2309, 83022, 8173, 83013, 83014, 83015, - 83016, 0, 83010, 83011, 83012, 9397, 0, 9395, 9396, 9393, 9394, 9391, - 9392, 9389, 6209, 9387, 9388, 9385, 9386, 9383, 9384, 0, 0, 0, 0, 0, - 11259, 0, 0, 0, 2313, 0, 0, 0, 0, 0, 0, 10570, 65776, 110968, 0, 83006, - 83007, 11998, 83009, 83002, 83003, 83004, 66406, 0, 128780, 83000, 11818, - 9381, 9382, 9379, 9380, 9377, 9378, 9375, 9376, 1683, 9374, 0, 9372, 0, - 0, 0, 0, 127801, 0, 42029, 11079, 0, 43451, 42032, 0, 0, 0, 0, 5005, 0, - 0, 42030, 5007, 78828, 126210, 0, 4951, 110776, 0, 110775, 0, 43309, - 121222, 92172, 0, 92334, 0, 9548, 0, 119138, 71896, 0, 0, 0, 0, 0, 0, - 65691, 65580, 64361, 10496, 0, 0, 0, 917975, 0, 0, 41046, 0, 0, 0, 13177, - 0, 64703, 0, 43499, 3389, 10589, 0, 11208, 120719, 78395, 73964, 78393, - 78392, 78391, 11314, 8281, 113732, 113667, 113745, 9076, 8862, 69743, - 41052, 78397, 64766, 69821, 0, 0, 0, 82992, 82994, 10671, 82998, 82987, - 82989, 82990, 6303, 113664, 498, 64471, 82986, 0, 0, 9349, 0, 0, 0, 8031, - 2414, 0, 128999, 3231, 0, 6422, 0, 0, 119339, 2537, 78405, 41429, 78403, - 78401, 78399, 0, 0, 41433, 4719, 41431, 0, 78411, 5211, 41428, 78407, - 82983, 1772, 0, 0, 82979, 66850, 64812, 82982, 82975, 68767, 82977, - 82978, 0, 0, 0, 0, 41064, 70368, 9663, 66838, 129381, 12304, 125113, 0, - 41062, 66847, 0, 0, 41061, 70454, 0, 127187, 83049, 83050, 41509, 83054, - 83045, 83046, 83047, 83048, 0, 43184, 41507, 1958, 0, 66816, 41506, 0, 0, - 0, 120717, 0, 0, 0, 74349, 72113, 8008, 0, 0, 0, 65083, 6839, 0, 126517, - 73803, 127055, 127056, 3508, 127058, 127059, 78038, 0, 120932, 0, 6411, - 128115, 0, 0, 128832, 100930, 0, 0, 0, 0, 0, 0, 128546, 0, 0, 120914, 0, - 0, 0, 0, 917822, 128810, 983657, 65599, 0, 9966, 12607, 4948, 128070, 0, - 128149, 0, 0, 6207, 0, 6117, 73916, 0, 0, 0, 0, 68244, 41511, 0, 129489, - 127304, 0, 121289, 0, 0, 83031, 83032, 0, 41556, 0, 0, 0, 128571, 73766, - 0, 0, 0, 41510, 7953, 0, 0, 41513, 0, 0, 0, 83038, 83039, 83040, 83041, - 83034, 83035, 848, 9868, 983149, 6424, 0, 83033, 0, 0, 0, 0, 0, 0, 893, - 64576, 13299, 0, 0, 0, 71447, 0, 0, 0, 0, 8903, 0, 0, 0, 8099, 0, 0, 0, - 0, 0, 0, 0, 0, 113713, 0, 0, 0, 0, 0, 83027, 41483, 83029, 83030, 83023, + 71684, 0, 0, 0, 983844, 0, 71688, 78463, 5147, 125019, 0, 74524, 71682, + 128435, 0, 194692, 5991, 3445, 0, 4976, 66193, 0, 0, 0, 0, 128309, + 128594, 129819, 69579, 0, 63855, 0, 10138, 0, 0, 8897, 0, 75027, 0, + 120931, 77862, 65836, 0, 0, 77860, 0, 0, 1123, 4124, 41553, 77903, 0, + 71680, 121386, 398, 0, 129035, 41551, 0, 0, 0, 41550, 9970, 0, 93062, + 42392, 1305, 78901, 0, 129292, 0, 7346, 41464, 0, 0, 0, 41465, 983567, + 8528, 9149, 0, 63955, 165, 3024, 11852, 119163, 0, 9093, 0, 9147, 0, 0, + 110989, 9148, 0, 4096, 53, 8296, 0, 71352, 0, 9594, 0, 0, 63952, 0, + 10997, 0, 0, 5805, 0, 0, 0, 42176, 71455, 74601, 129604, 10591, 0, 0, 0, + 0, 0, 0, 0, 0, 92475, 0, 0, 42379, 0, 0, 9220, 0, 121425, 0, 0, 4132, 0, + 0, 11239, 0, 0, 74837, 0, 66408, 0, 8055, 0, 0, 0, 63962, 74042, 8924, + 43123, 5988, 0, 63969, 0, 42718, 8788, 1357, 77872, 65743, 0, 8774, 0, 0, + 0, 0, 92748, 120598, 128234, 9564, 0, 0, 119124, 0, 121241, 110983, + 92975, 3121, 0, 0, 0, 70081, 0, 0, 0, 0, 0, 64851, 0, 0, 73085, 119532, + 0, 0, 0, 0, 1198, 69293, 66708, 64619, 0, 64663, 93991, 0, 0, 2101, 1398, + 0, 92554, 0, 0, 92684, 11406, 101588, 12127, 0, 840, 0, 0, 7101, 120938, + 0, 0, 12880, 0, 43104, 0, 0, 0, 2117, 0, 0, 0, 0, 0, 0, 0, 7769, 129867, + 92413, 0, 0, 0, 0, 40986, 83117, 0, 0, 4127, 0, 0, 0, 0, 0, 0, 70738, 0, + 129466, 0, 0, 0, 0, 119081, 0, 10581, 0, 4533, 0, 128941, 6490, 0, 12038, + 0, 0, 68225, 0, 0, 69704, 0, 1948, 119007, 129607, 101586, 0, 0, 0, + 120802, 0, 9494, 0, 0, 0, 4843, 0, 74772, 4098, 0, 0, 0, 3436, 0, 127279, + 12817, 0, 126607, 0, 0, 0, 0, 74433, 0, 0, 0, 0, 121296, 65916, 0, 0, + 121458, 0, 129107, 93815, 0, 73743, 0, 0, 983132, 67676, 0, 0, 74627, + 128928, 0, 127892, 0, 71326, 67222, 0, 75013, 92435, 0, 128500, 0, 0, + 9613, 43425, 4526, 121415, 0, 64520, 71336, 0, 0, 55278, 10228, 64957, 0, + 0, 3807, 2081, 66640, 0, 0, 0, 0, 119269, 0, 128688, 0, 128142, 1451, 0, + 0, 4134, 0, 74847, 0, 74793, 0, 0, 74295, 9960, 1201, 0, 12846, 121271, + 0, 11919, 64962, 0, 43739, 0, 66358, 0, 0, 0, 43679, 72284, 72289, 0, + 129523, 1253, 983851, 65766, 500, 65764, 65765, 65762, 65763, 65760, + 65761, 70334, 983848, 9821, 11702, 110630, 110631, 110628, 110629, + 128481, 0, 7533, 66717, 92500, 92305, 0, 0, 69277, 127758, 71332, 0, 0, + 0, 0, 11188, 0, 4112, 0, 0, 12890, 0, 0, 9915, 0, 68423, 0, 0, 2876, 0, + 0, 0, 0, 7382, 92415, 0, 128132, 0, 0, 0, 0, 69561, 127915, 0, 7003, 0, + 0, 7704, 0, 0, 0, 4123, 0, 0, 9977, 0, 0, 65759, 0, 0, 128266, 9808, 0, + 92611, 4126, 0, 9521, 9589, 64755, 0, 0, 0, 69948, 0, 92368, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 93814, 0, 0, 92234, 0, 10693, 0, 0, 65897, 4058, 0, 0, + 64660, 0, 0, 0, 983711, 1139, 43298, 0, 71333, 8970, 0, 9934, 0, 11023, + 128020, 42522, 0, 0, 0, 78899, 3057, 128113, 7349, 69959, 128722, 68065, + 110813, 0, 128090, 67201, 0, 0, 0, 9528, 0, 0, 0, 9102, 627, 0, 6273, + 129496, 0, 0, 983210, 92966, 43300, 0, 983721, 11696, 127343, 1018, + 65554, 0, 74338, 0, 7645, 0, 128321, 0, 0, 0, 0, 73814, 11544, 12563, + 10728, 0, 0, 127340, 43311, 64966, 0, 0, 0, 118946, 0, 0, 74779, 0, 185, + 65085, 74533, 0, 0, 7535, 0, 42525, 0, 9749, 41701, 6131, 0, 4117, + 129062, 126988, 0, 92429, 65693, 0, 73445, 0, 69695, 0, 0, 0, 0, 0, 0, 0, + 1184, 0, 815, 0, 0, 0, 0, 0, 71325, 0, 0, 64683, 983797, 0, 127959, 0, 0, + 0, 0, 0, 0, 0, 68166, 0, 0, 0, 0, 66799, 0, 128912, 0, 5142, 0, 69643, 0, + 0, 83367, 93975, 0, 0, 0, 123209, 0, 0, 0, 74855, 121330, 0, 0, 0, 0, + 10940, 66030, 0, 70385, 0, 0, 2652, 120527, 0, 129946, 0, 126508, 0, 0, + 0, 0, 0, 0, 1828, 0, 128357, 0, 8531, 0, 74799, 12324, 72434, 65238, + 68374, 0, 65573, 0, 68308, 68679, 12904, 43445, 0, 0, 0, 11247, 0, 0, + 41426, 0, 0, 0, 0, 0, 67250, 69451, 83354, 71337, 0, 0, 0, 0, 0, 0, 637, + 0, 0, 0, 121178, 0, 0, 74474, 71306, 0, 7298, 128256, 0, 0, 0, 0, 8210, + 0, 0, 0, 2046, 0, 0, 0, 70333, 0, 1506, 69926, 0, 83353, 0, 12651, 0, 0, + 0, 12058, 120626, 72111, 7803, 0, 0, 65592, 118844, 0, 0, 355, 9719, 0, + 118961, 0, 121077, 127246, 0, 42178, 0, 69760, 42571, 0, 0, 0, 0, 0, 0, + 127176, 3178, 0, 0, 92704, 83381, 9080, 120943, 67697, 0, 121342, 129875, + 0, 71485, 0, 917837, 0, 0, 78157, 0, 0, 0, 0, 0, 71313, 0, 0, 128212, 0, + 72238, 67858, 0, 0, 0, 0, 0, 0, 0, 10770, 118994, 0, 465, 0, 0, 74348, 0, + 0, 0, 0, 0, 0, 0, 10930, 0, 0, 0, 119091, 69388, 983614, 129918, 0, 0, 0, + 0, 0, 10092, 0, 0, 0, 0, 0, 1766, 11282, 11996, 66644, 4547, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 120906, 4345, 0, 0, 128947, 0, 0, 0, 0, 0, 5382, 0, 0, 0, + 0, 0, 5406, 43127, 120007, 0, 3590, 129874, 0, 0, 0, 42016, 0, 0, 121002, + 0, 7742, 0, 66562, 71323, 0, 0, 5310, 0, 128173, 0, 43594, 0, 128260, + 66723, 0, 73816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1326, 128723, 0, 0, 74519, 0, + 0, 0, 0, 71308, 0, 5410, 5783, 0, 8403, 5400, 120526, 0, 128863, 0, 0, 0, + 64412, 0, 0, 5587, 42865, 71858, 0, 0, 129854, 0, 113785, 0, 120755, 0, + 69738, 0, 74867, 10461, 12103, 0, 0, 70701, 0, 0, 0, 0, 0, 94009, 0, 0, + 0, 8816, 41515, 0, 11802, 0, 7585, 910, 0, 0, 0, 3658, 83386, 120525, 0, + 7617, 0, 12888, 0, 0, 64631, 0, 41514, 11097, 5703, 0, 41517, 41504, + 41519, 0, 70104, 0, 65864, 0, 120533, 0, 121037, 0, 0, 43553, 120774, 0, + 0, 0, 0, 0, 1578, 0, 43449, 0, 0, 8225, 121191, 94024, 72799, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 110655, 0, 110656, 121247, 72213, 0, 110658, 0, + 74997, 0, 3195, 10999, 983570, 7897, 0, 1203, 74396, 0, 64544, 0, 0, 0, + 2877, 0, 0, 0, 121112, 0, 0, 128977, 119607, 0, 0, 0, 0, 983623, 0, 0, 0, + 0, 0, 0, 0, 0, 983078, 0, 0, 0, 9939, 0, 0, 0, 0, 0, 0, 0, 10714, 0, 0, + 0, 0, 0, 67738, 0, 74038, 0, 42897, 0, 0, 0, 0, 0, 0, 7730, 0, 0, 0, + 11163, 0, 0, 0, 113701, 4966, 128802, 70674, 129468, 123207, 3841, 0, 0, + 983227, 77886, 0, 4972, 0, 64699, 0, 0, 0, 0, 0, 12705, 10203, 9608, 0, + 0, 11962, 121397, 0, 1196, 67684, 0, 777, 0, 0, 65271, 0, 0, 0, 0, 64824, + 983194, 0, 9454, 63778, 8658, 0, 0, 2705, 0, 64894, 0, 0, 11986, 92636, + 0, 8280, 0, 2701, 0, 0, 0, 0, 0, 9809, 0, 0, 0, 0, 0, 63761, 1748, 0, + 65719, 121078, 0, 0, 0, 55244, 3061, 0, 63765, 63787, 0, 41520, 0, 7694, + 0, 8896, 63768, 55282, 0, 127781, 0, 0, 63807, 1591, 0, 6386, 119143, 0, + 0, 0, 983199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68289, 0, 0, 7624, 0, 10996, + 92247, 10609, 0, 127181, 10987, 0, 70370, 3894, 0, 0, 0, 0, 493, 0, 0, + 1717, 12228, 479, 917941, 129347, 129473, 917935, 917939, 917924, 917932, + 92303, 64315, 0, 0, 83522, 6233, 42681, 83525, 83518, 83519, 64911, + 83521, 0, 0, 83516, 83517, 129843, 8378, 11632, 0, 0, 7323, 0, 120771, 0, + 0, 0, 0, 120904, 83526, 0, 128710, 92672, 0, 0, 0, 0, 0, 0, 0, 63806, + 63800, 0, 0, 0, 63798, 63803, 244, 11542, 0, 0, 73761, 0, 12669, 120310, + 0, 0, 0, 0, 120680, 71908, 0, 0, 8612, 0, 0, 0, 0, 0, 64662, 125056, + 1360, 248, 0, 63797, 0, 63794, 0, 7292, 983666, 63756, 42786, 74957, 0, + 12663, 0, 0, 0, 0, 0, 0, 0, 4579, 0, 0, 0, 0, 0, 0, 71130, 65545, 9602, + 8623, 0, 128052, 0, 0, 0, 0, 0, 0, 0, 659, 6098, 0, 12234, 83511, 83512, + 8311, 83514, 7669, 83508, 83509, 83510, 0, 0, 0, 0, 983932, 0, 0, 2323, + 0, 2319, 77917, 120900, 77916, 2311, 83077, 4415, 1586, 68050, 0, 128724, + 83020, 2309, 83022, 8173, 83013, 83014, 83015, 83016, 0, 83010, 69275, + 83012, 9397, 0, 9395, 9396, 9393, 9394, 9391, 9392, 9389, 6209, 9387, + 9388, 9385, 9386, 9383, 9384, 0, 0, 0, 0, 0, 11259, 0, 0, 0, 2313, 0, + 119661, 0, 0, 0, 0, 10570, 65776, 110968, 0, 83006, 83007, 11998, 83009, + 83002, 83003, 83004, 66406, 0, 128780, 83000, 11818, 9381, 9382, 9379, + 9380, 9377, 9378, 9375, 9376, 1683, 9374, 0, 9372, 0, 0, 0, 0, 127801, 0, + 42029, 11079, 0, 43451, 42032, 0, 0, 0, 0, 5005, 0, 0, 42030, 5007, + 78828, 126210, 0, 4951, 110776, 0, 110775, 0, 43309, 121222, 92172, 0, + 92334, 0, 9548, 0, 119138, 71896, 0, 0, 0, 0, 0, 0, 65691, 65580, 64361, + 10496, 0, 0, 0, 917975, 0, 0, 41046, 0, 0, 0, 13177, 0, 64703, 0, 43499, + 3389, 10589, 0, 11208, 120719, 78395, 73964, 78393, 78392, 78391, 11314, + 8281, 113732, 113667, 113745, 9076, 8862, 69743, 41052, 78397, 64766, + 69821, 0, 0, 0, 82992, 82994, 10671, 82998, 82987, 82989, 82990, 6303, + 113664, 498, 64471, 82986, 129901, 0, 9349, 0, 0, 0, 8031, 2414, 0, + 128999, 3231, 0, 6422, 0, 0, 119339, 2537, 78405, 41429, 78403, 78401, + 78399, 0, 0, 41433, 4719, 41431, 0, 78411, 5211, 41428, 78407, 82983, + 1772, 0, 0, 82979, 66850, 64812, 82982, 82975, 68767, 82977, 82978, 0, 0, + 0, 0, 41064, 70368, 9663, 66838, 129381, 12304, 125113, 0, 41062, 66847, + 0, 0, 41061, 70454, 0, 127187, 83049, 83050, 41509, 83054, 83045, 83046, + 83047, 83048, 0, 43184, 41507, 1958, 0, 66816, 41506, 0, 0, 0, 120717, 0, + 0, 0, 74349, 72113, 8008, 0, 0, 0, 65083, 6839, 0, 126517, 73803, 127055, + 127056, 3508, 127058, 127059, 78038, 0, 120932, 0, 6411, 128115, 0, 0, + 128832, 100930, 0, 0, 0, 0, 0, 0, 128546, 0, 0, 120914, 0, 0, 0, 0, + 917822, 128810, 983657, 65599, 0, 9966, 12607, 4948, 128070, 0, 128149, + 0, 0, 6207, 0, 6117, 73916, 0, 0, 0, 0, 68244, 41511, 0, 129489, 127304, + 0, 121289, 0, 0, 83031, 83032, 0, 41556, 0, 0, 0, 128571, 73766, 0, 0, 0, + 41510, 7953, 0, 0, 41513, 0, 0, 0, 83038, 83039, 83040, 83041, 83034, + 83035, 848, 9868, 983149, 6424, 0, 83033, 0, 0, 0, 0, 0, 0, 893, 64576, + 13299, 0, 0, 71998, 71447, 0, 0, 0, 0, 8903, 0, 0, 0, 8099, 0, 0, 0, 0, + 0, 0, 0, 0, 113713, 0, 0, 0, 0, 0, 83027, 41483, 83029, 83030, 83023, 83024, 69436, 83026, 194756, 41485, 194758, 194757, 194760, 41482, 42737, 64588, 0, 127787, 0, 10014, 0, 0, 194763, 194762, 68785, 194764, 194767, 194766, 0, 0, 0, 11377, 0, 0, 983792, 0, 0, 0, 9776, 0, 93824, 5215, @@ -26182,14 +27031,14 @@ static const unsigned int code_hash[] = { 129526, 6421, 0, 0, 121304, 0, 0, 0, 0, 92625, 119070, 67895, 983943, 0, 68608, 6482, 0, 0, 11945, 0, 0, 8838, 0, 4025, 10709, 0, 2108, 0, 73929, 0, 0, 10617, 194737, 128031, 194739, 194738, 68614, 194740, 68611, 9924, - 194745, 194744, 0, 0, 0, 3277, 0, 4947, 41055, 0, 194722, 194721, 194724, + 129952, 194744, 0, 0, 0, 3277, 0, 4947, 41055, 0, 194722, 129930, 194724, 194723, 64626, 194725, 42266, 194727, 8371, 194729, 127028, 12806, 41492, 0, 0, 73930, 194731, 194730, 41054, 1078, 194735, 194734, 41057, 0, 0, 0, - 0, 0, 92210, 73009, 0, 41496, 0, 9165, 1572, 0, 917934, 0, 128635, 9215, - 9330, 0, 10032, 41745, 43183, 6401, 5831, 0, 0, 0, 8056, 0, 65681, 92377, - 0, 0, 0, 121048, 0, 118887, 6408, 0, 0, 5661, 82972, 82973, 3603, 0, - 82967, 3548, 82969, 82970, 0, 82964, 82965, 9918, 118787, 11321, 0, 0, 0, - 128992, 0, 0, 0, 0, 0, 0, 41558, 41471, 0, 8158, 41561, 41472, 0, 0, + 0, 0, 92210, 73009, 0, 41496, 0, 9165, 1572, 0, 129712, 0, 128635, 9215, + 9330, 129809, 10032, 41745, 43183, 6401, 5831, 0, 0, 0, 8056, 0, 65681, + 92377, 0, 0, 0, 121048, 0, 118887, 6408, 0, 0, 5661, 82972, 82973, 3603, + 0, 82967, 3548, 82969, 82970, 0, 82964, 82965, 9918, 118787, 11321, 0, 0, + 0, 128992, 0, 0, 0, 0, 0, 0, 41558, 41471, 0, 8158, 41561, 41472, 0, 0, 194672, 43762, 77927, 6701, 41559, 1896, 66256, 66248, 194680, 5665, 0, 194681, 0, 0, 0, 74352, 0, 5664, 127895, 194682, 12310, 5662, 194687, 194686, 73924, 1121, 82953, 82955, 0, 74378, 0, 0, 74966, 0, 71892, 0, @@ -26197,7 +27046,7 @@ static const unsigned int code_hash[] = { 2795, 73923, 0, 69231, 0, 6275, 93957, 917927, 124972, 194655, 127786, 6423, 0, 0, 0, 68526, 12823, 0, 0, 42026, 42017, 0, 7524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12691, 68072, 42722, 69877, 82956, 78655, 78661, 82959, - 78662, 41265, 41065, 1795, 0, 118791, 10587, 0, 983114, 0, 194640, 0, + 78662, 41265, 41065, 1795, 0, 118791, 10587, 0, 917807, 0, 194640, 0, 12946, 194641, 71921, 194643, 9169, 70372, 194648, 194647, 68202, 194649, 73990, 65111, 0, 748, 41067, 6234, 194651, 9990, 72795, 194652, 194629, 194628, 194631, 194630, 67896, 194632, 0, 3593, 82948, 82949, 82950, @@ -26212,148 +27061,150 @@ static const unsigned int code_hash[] = { 74317, 0, 8319, 194714, 194717, 10960, 72196, 8305, 12573, 983620, 72193, 0, 13202, 0, 12582, 0, 72198, 69856, 0, 0, 78598, 0, 72195, 0, 65802, 74822, 7698, 12708, 74045, 0, 0, 70460, 4913, 127990, 0, 0, 0, 0, 12728, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 12588, 8821, 6153, 194705, 78900, 194707, - 194710, 194709, 194712, 194711, 118854, 194713, 651, 0, 0, 0, 0, 0, - 78468, 78469, 69433, 78467, 69614, 74905, 194695, 78461, 194697, 194696, - 0, 4716, 43277, 0, 78474, 78475, 128592, 120928, 194700, 55264, 194702, - 120676, 0, 12707, 0, 0, 0, 0, 121417, 8479, 4151, 0, 0, 0, 0, 0, 0, 0, 0, - 113799, 0, 74050, 0, 0, 0, 0, 0, 129467, 12278, 0, 129507, 0, 2700, - 12576, 7842, 0, 0, 0, 2699, 0, 0, 2985, 0, 126475, 0, 0, 119314, 0, - 119312, 9827, 119310, 119311, 119308, 119309, 119306, 11481, 0, 119305, - 0, 35, 78481, 78482, 66694, 78480, 78477, 78478, 0, 0, 64257, 0, 0, 0, - 78485, 78486, 78483, 4272, 0, 0, 40965, 0, 12704, 78487, 983588, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5244, 4189, 94108, 0, 127948, 4188, 1879, 0, 0, 0, - 43743, 0, 8873, 2279, 0, 0, 0, 12574, 0, 92749, 92753, 983902, 0, 0, - 75001, 0, 0, 0, 12578, 12720, 128628, 101088, 0, 12346, 128596, 101089, - 0, 0, 7251, 0, 0, 118850, 73025, 0, 0, 0, 0, 0, 12564, 66457, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 41564, 10976, 0, 121223, 0, 0, 10054, 9197, - 120618, 0, 9012, 65737, 74420, 0, 13215, 12730, 0, 0, 0, 0, 816, 0, - 129462, 0, 83191, 0, 0, 92752, 0, 4715, 94107, 94106, 71075, 0, 0, 0, - 67729, 0, 307, 0, 9585, 0, 0, 0, 0, 0, 125267, 0, 70727, 65567, 120498, - 75006, 120984, 983890, 0, 12236, 41419, 194618, 194621, 194620, 75003, - 194622, 73675, 120957, 41421, 75005, 4462, 0, 126599, 983892, 821, 0, - 2498, 5800, 100834, 100833, 1760, 94019, 4469, 64377, 100840, 100839, 0, - 757, 1185, 0, 100841, 0, 10628, 100842, 68849, 100844, 43971, 100846, - 100849, 64763, 0, 7713, 0, 0, 0, 4380, 194608, 128073, 194610, 194609, - 194612, 862, 65626, 194613, 65627, 65629, 5137, 194617, 0, 0, 0, 65069, - 7566, 64688, 67143, 194592, 100823, 100822, 100825, 4748, 92228, 100826, - 100829, 42260, 129494, 64107, 0, 0, 0, 0, 128189, 0, 194604, 13137, 8775, - 127945, 123633, 194607, 0, 8410, 4454, 194585, 0, 92542, 4449, 92330, - 127064, 75022, 92761, 70664, 194589, 339, 194591, 194590, 0, 70662, 0, - 100830, 41543, 0, 0, 0, 41542, 127066, 8916, 6705, 0, 129296, 0, 0, 0, 0, - 0, 41548, 6729, 119329, 0, 7348, 0, 0, 7537, 0, 11819, 0, 0, 123624, - 71269, 0, 7344, 100808, 129595, 9780, 0, 11117, 74993, 0, 194578, 10483, - 194580, 194579, 194582, 194581, 68781, 125114, 100820, 100819, 0, 4211, - 1259, 7517, 0, 0, 194561, 70827, 194563, 194562, 641, 5219, 94034, - 194566, 11064, 194568, 0, 0, 0, 0, 0, 0, 100812, 100811, 100814, 100813, - 100816, 100815, 100818, 100817, 100798, 100797, 41410, 100799, 64262, 0, - 41407, 75000, 0, 0, 93812, 0, 0, 72803, 74999, 78897, 0, 0, 67675, 0, 0, - 0, 0, 43647, 0, 0, 100792, 100791, 100794, 100793, 100796, 100795, 0, - 74630, 11933, 0, 0, 41903, 67892, 11001, 100801, 42255, 100803, 100802, - 100805, 41905, 100807, 100806, 10775, 9793, 0, 0, 74452, 0, 983063, - 42535, 0, 64529, 41408, 42853, 0, 0, 42674, 118915, 0, 0, 983788, 0, - 70838, 0, 0, 0, 64506, 0, 66738, 4747, 100783, 69844, 100785, 5832, 0, 0, - 5141, 42600, 0, 0, 0, 0, 0, 0, 93790, 0, 7657, 0, 71132, 74137, 0, - 128362, 73682, 73681, 859, 0, 0, 0, 6059, 126985, 55235, 0, 0, 0, 0, 0, - 100787, 11488, 72838, 100788, 0, 100790, 10558, 0, 0, 0, 126090, 71069, - 0, 0, 1788, 0, 0, 0, 0, 119571, 917961, 9028, 0, 69234, 73665, 0, 9905, - 128485, 41242, 70086, 0, 74109, 100765, 100764, 100767, 100766, 70830, - 83184, 70082, 3940, 0, 43754, 0, 128188, 8665, 0, 0, 0, 1653, 100775, - 42406, 100777, 100780, 70825, 120523, 0, 8815, 0, 65046, 0, 42445, 0, - 11180, 119318, 119315, 68454, 42485, 0, 0, 8211, 42293, 983602, 0, 0, 0, - 0, 65385, 100771, 42332, 100773, 78431, 78432, 78423, 78430, 78420, - 10022, 65387, 78419, 65384, 0, 0, 0, 65386, 0, 11248, 0, 43198, 64751, 0, - 0, 0, 0, 0, 0, 101102, 7363, 0, 0, 119323, 119324, 100752, 100751, 0, - 119320, 0, 983632, 0, 8237, 0, 0, 0, 0, 0, 0, 9914, 0, 100763, 100762, - 120009, 6351, 119993, 92740, 68766, 0, 120010, 41243, 0, 74108, 11467, - 120165, 119998, 4358, 0, 6353, 0, 0, 0, 93045, 1710, 0, 0, 92237, 0, 49, - 73871, 0, 78671, 0, 78672, 9741, 78443, 78444, 78441, 43443, 78439, - 78440, 69244, 78438, 3470, 0, 0, 0, 0, 0, 78445, 0, 1072, 78457, 78452, - 78454, 74230, 78451, 78447, 78449, 1080, 0, 74100, 0, 1101, 68404, 78458, - 78459, 71082, 0, 1086, 1869, 0, 0, 0, 65458, 0, 0, 41988, 0, 1091, 0, - 7977, 0, 67395, 0, 0, 0, 92758, 0, 0, 0, 0, 0, 71255, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 64582, 0, 0, 70794, 0, 120989, 128495, 74106, 0, 66883, 0, 0, 0, - 0, 0, 0, 0, 92553, 43752, 110592, 0, 0, 120886, 0, 0, 0, 0, 6063, 100857, - 0, 917995, 6053, 74096, 0, 0, 74169, 13100, 0, 917999, 0, 917998, 0, - 70387, 6055, 7800, 4279, 8490, 120114, 120111, 64786, 8602, 120110, - 83389, 92204, 0, 0, 74961, 0, 120117, 120118, 120099, 120100, 65087, - 64402, 3674, 120096, 0, 120094, 120107, 120108, 120105, 10107, 42159, - 42870, 120101, 69632, 0, 0, 43281, 127078, 0, 74098, 0, 0, 126497, 74099, - 129056, 0, 0, 0, 121123, 5847, 125258, 0, 0, 0, 0, 0, 66592, 64469, - 71698, 19966, 0, 42561, 0, 129170, 66854, 8120, 75042, 0, 0, 0, 0, 0, 0, - 126068, 8369, 0, 0, 122912, 3369, 0, 121094, 0, 0, 69238, 10495, 121365, - 0, 557, 9457, 0, 0, 121054, 73880, 127220, 0, 74937, 74094, 0, 0, 0, - 92171, 127219, 128175, 127939, 120424, 0, 127214, 2109, 67893, 127211, - 69656, 127217, 10604, 127215, 0, 0, 0, 0, 126561, 0, 0, 0, 0, 1618, 0, 0, - 83175, 10430, 0, 0, 13063, 917585, 0, 92982, 113666, 0, 78390, 83489, - 12060, 0, 113669, 0, 6329, 0, 0, 0, 74395, 2707, 8309, 0, 127054, 78398, - 0, 2697, 0, 78396, 127057, 2695, 0, 0, 68334, 0, 0, 0, 72325, 2693, - 74091, 0, 0, 2703, 113729, 70283, 41918, 983168, 127542, 8687, 127543, - 12178, 43361, 92540, 64075, 110705, 5248, 110703, 120538, 6427, 0, 0, 0, - 0, 110710, 0, 74990, 74989, 70703, 127031, 0, 9873, 0, 0, 0, 64762, 2053, - 0, 6591, 9340, 0, 1589, 0, 296, 67712, 128315, 12766, 118931, 74370, - 120417, 8922, 128068, 43829, 111202, 74836, 0, 12579, 0, 12575, 6416, - 5656, 0, 13262, 65590, 5299, 0, 0, 5449, 1252, 0, 78404, 0, 74369, 65373, - 5295, 0, 121066, 1223, 1642, 78408, 0, 12158, 5303, 0, 120546, 41413, - 3212, 127025, 3211, 74810, 41425, 127029, 0, 74450, 9728, 0, 10924, - 74778, 6636, 0, 0, 0, 0, 0, 9519, 0, 0, 983928, 129439, 68780, 0, 0, 0, - 126260, 0, 12104, 77942, 77951, 9004, 0, 74249, 10230, 0, 0, 0, 77947, 0, - 69679, 121475, 9890, 125049, 12971, 0, 92556, 0, 67903, 70051, 983905, 0, - 0, 9635, 12600, 0, 0, 0, 0, 6469, 0, 0, 65304, 4679, 0, 64300, 64867, - 6531, 0, 101099, 101098, 0, 101100, 42916, 0, 0, 0, 0, 0, 0, 4445, 72296, - 0, 11533, 0, 3416, 129148, 0, 0, 0, 78566, 0, 0, 101091, 0, 101093, 5447, - 72140, 101094, 101097, 101096, 0, 0, 0, 64448, 0, 43920, 70677, 0, 6232, - 101101, 101104, 101103, 43608, 101105, 0, 6538, 4335, 0, 3941, 74986, - 11061, 0, 74988, 74987, 0, 12155, 128278, 0, 0, 0, 0, 74578, 0, 65832, 0, + 129980, 0, 0, 101281, 0, 130038, 0, 101283, 0, 12588, 8821, 6153, 194705, + 78900, 194707, 194710, 194709, 194712, 194711, 118854, 194713, 651, 0, 0, + 0, 0, 0, 78468, 78469, 69433, 78467, 69614, 74905, 194695, 78461, 194697, + 194696, 0, 4716, 43277, 0, 78474, 78475, 128592, 120928, 194700, 55264, + 194702, 12732, 0, 12707, 0, 0, 0, 0, 121417, 8479, 4151, 0, 0, 0, 0, 0, + 0, 0, 0, 113799, 0, 74050, 0, 0, 0, 0, 0, 129467, 12278, 0, 129507, 0, + 2700, 12576, 7842, 0, 0, 0, 2699, 0, 0, 2985, 0, 126475, 0, 129873, + 119314, 0, 119312, 9827, 101292, 119311, 101291, 119309, 119306, 11481, + 0, 119305, 0, 35, 78481, 78482, 66694, 78480, 78477, 78478, 0, 0, 64257, + 0, 0, 0, 78485, 78486, 78483, 4272, 0, 0, 40965, 0, 12704, 78487, 983568, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5244, 4189, 94108, 0, 127948, 4188, 1879, 0, + 0, 0, 43743, 71974, 8873, 2279, 0, 0, 0, 12574, 12735, 92749, 92753, + 983902, 0, 0, 75001, 0, 0, 0, 12578, 12720, 128628, 101088, 0, 12346, + 128596, 101089, 0, 0, 7251, 0, 0, 118850, 73025, 0, 0, 0, 0, 0, 12564, + 66457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101131, 0, 41564, 10976, 0, 121223, + 0, 0, 10054, 9197, 120618, 0, 9012, 65737, 74420, 0, 13215, 12730, 0, 0, + 0, 0, 816, 0, 101123, 0, 83191, 0, 0, 92752, 101120, 4715, 94107, 94106, + 71075, 0, 0, 0, 67729, 0, 307, 0, 9585, 0, 0, 0, 101255, 0, 125267, 0, + 70727, 65567, 101238, 75006, 101231, 983890, 0, 12236, 41419, 101259, + 194621, 101248, 75003, 194622, 73675, 120957, 41421, 75005, 4462, 0, + 126599, 983892, 821, 0, 2498, 5800, 100834, 100833, 1760, 94019, 4469, + 64377, 100840, 100839, 0, 757, 1185, 0, 100841, 0, 10628, 100842, 68849, + 100844, 43971, 100846, 100849, 64763, 0, 7713, 0, 0, 0, 4380, 194608, + 128073, 194610, 194609, 194612, 862, 65626, 194613, 65627, 65629, 5137, + 194617, 0, 0, 0, 65069, 7566, 64688, 67143, 194592, 100823, 100822, + 100825, 4748, 92228, 100826, 100829, 42260, 129494, 64107, 0, 0, 0, 0, + 128189, 0, 194604, 13137, 8775, 127945, 123633, 194607, 0, 8410, 4454, + 194585, 0, 92542, 4449, 92330, 127064, 75022, 92761, 70664, 194589, 339, + 194591, 194590, 0, 70662, 0, 100830, 41543, 0, 0, 0, 41542, 127066, 8916, + 6705, 0, 129296, 0, 0, 0, 0, 0, 41548, 6729, 119329, 0, 7348, 0, 0, 7537, + 0, 11819, 0, 0, 123624, 71269, 0, 7344, 100808, 129073, 9780, 0, 11117, + 74993, 0, 194578, 10483, 194580, 194579, 194582, 194581, 68781, 125114, + 100820, 100819, 0, 4211, 1259, 7517, 0, 0, 194561, 70827, 194563, 194562, + 641, 5219, 94034, 194566, 11064, 194568, 0, 129820, 0, 0, 0, 0, 100812, + 100811, 100814, 100813, 100816, 100815, 100818, 100817, 100798, 100797, + 41410, 100799, 64262, 0, 41407, 75000, 0, 0, 93812, 0, 0, 72803, 74999, + 78897, 0, 0, 67675, 0, 0, 0, 0, 43647, 0, 0, 100792, 100791, 100794, + 100793, 100796, 100795, 0, 74630, 11933, 0, 0, 41903, 67892, 11001, + 100801, 42255, 100803, 100802, 100805, 41905, 100807, 100806, 10775, + 9793, 0, 0, 74452, 0, 983063, 42535, 0, 64529, 41408, 42853, 0, 0, 42674, + 118915, 0, 0, 983788, 0, 70838, 0, 0, 0, 64506, 0, 66738, 4747, 100783, + 69844, 100785, 5832, 0, 0, 5141, 42600, 0, 0, 0, 0, 0, 0, 93790, 0, 7657, + 0, 71132, 74137, 0, 128362, 73682, 73681, 859, 0, 0, 0, 6059, 126985, + 55235, 0, 0, 0, 0, 0, 100787, 11488, 72838, 100788, 0, 100790, 10558, 0, + 0, 0, 126090, 71069, 0, 0, 1788, 0, 0, 0, 0, 119571, 917961, 9028, 0, + 69234, 73665, 0, 9905, 128485, 41242, 70086, 0, 74109, 100765, 100764, + 100767, 100766, 70830, 83184, 70082, 3940, 0, 43754, 0, 128188, 8665, 0, + 0, 0, 1653, 100775, 42406, 100777, 100780, 70825, 120523, 0, 8815, 0, + 65046, 0, 42445, 0, 11180, 119318, 119315, 68454, 42485, 0, 0, 8211, + 42293, 983602, 0, 0, 0, 0, 65385, 100771, 42332, 100773, 78431, 78432, + 78423, 78430, 78420, 10022, 65387, 78419, 65384, 0, 0, 0, 65386, 0, + 11248, 0, 43198, 64751, 0, 0, 0, 0, 0, 0, 101102, 7363, 0, 0, 119323, + 119324, 100752, 100751, 0, 119320, 0, 983632, 0, 8237, 0, 0, 0, 0, 0, 0, + 9914, 0, 100763, 100762, 120009, 6351, 119993, 92740, 68766, 0, 120010, + 41243, 0, 74108, 11467, 120165, 119998, 4358, 0, 6353, 0, 0, 0, 93045, + 1710, 0, 0, 92237, 0, 49, 73871, 120005, 78671, 0, 78672, 9741, 78443, + 78444, 78441, 43443, 78439, 78440, 69244, 78438, 3470, 0, 0, 0, 0, 0, + 78445, 0, 1072, 78457, 78452, 78454, 74230, 78451, 78447, 78449, 1080, 0, + 74100, 0, 1101, 68404, 78458, 78459, 71082, 0, 1086, 1869, 0, 0, 0, + 65458, 0, 0, 41988, 0, 1091, 0, 7977, 0, 67395, 0, 0, 0, 92758, 0, 0, 0, + 0, 0, 71255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64582, 0, 0, 70794, 0, 120989, + 128495, 74106, 0, 66883, 0, 0, 0, 0, 0, 0, 0, 92553, 43752, 110592, 0, 0, + 120886, 0, 0, 0, 0, 6063, 100857, 101221, 917995, 6053, 74096, 0, 0, + 74169, 13100, 0, 917999, 0, 917998, 0, 70387, 6055, 7800, 4279, 8490, + 120114, 120111, 64786, 8602, 120110, 83389, 92204, 0, 0, 74961, 0, + 120117, 120118, 120099, 120100, 65087, 64402, 3674, 120096, 0, 120094, + 120107, 120108, 120105, 10107, 42159, 42870, 120101, 69632, 0, 0, 43281, + 127078, 0, 74098, 0, 0, 126497, 74099, 129056, 0, 0, 0, 121123, 5847, + 125258, 0, 0, 0, 0, 0, 66592, 64469, 71698, 19966, 0, 42561, 0, 129170, + 66854, 8120, 75042, 0, 0, 0, 0, 0, 0, 126068, 8369, 0, 0, 122912, 3369, + 0, 121094, 0, 0, 69238, 10495, 121365, 0, 557, 9457, 0, 0, 121054, 73880, + 127220, 0, 74937, 74094, 0, 0, 0, 92171, 127219, 128175, 127939, 120424, + 0, 127214, 2109, 67893, 127211, 69656, 127217, 10604, 127215, 0, 0, 0, 0, + 126561, 0, 0, 0, 0, 1618, 0, 0, 83175, 10430, 0, 0, 13063, 917585, 0, + 92982, 113666, 0, 78390, 83489, 12060, 0, 113669, 0, 6329, 0, 0, 0, + 74395, 2707, 8309, 0, 127054, 78398, 0, 2697, 0, 78396, 127057, 2695, 0, + 0, 68334, 0, 0, 0, 72325, 2693, 74091, 0, 0, 2703, 113729, 70283, 41918, + 983168, 127542, 8687, 127543, 12178, 43361, 92540, 64075, 110705, 5248, + 110703, 120538, 6427, 0, 0, 0, 0, 110710, 0, 74990, 74989, 70703, 127031, + 0, 9873, 0, 0, 0, 64762, 2053, 0, 6591, 9340, 0, 1589, 0, 296, 67712, + 128315, 12766, 118931, 74370, 120417, 8922, 128068, 43829, 111202, 74836, + 0, 12579, 0, 12575, 6416, 5656, 0, 13262, 65590, 5299, 0, 0, 5449, 1252, + 0, 78404, 0, 74369, 65373, 5295, 0, 121066, 1223, 1642, 78408, 0, 12158, + 5303, 0, 120546, 41413, 3212, 127025, 3211, 74810, 41425, 127029, 0, + 74450, 9728, 0, 10924, 74778, 6636, 0, 129884, 0, 0, 129882, 9519, 0, 0, + 983928, 101110, 68780, 0, 0, 0, 119182, 0, 12104, 77942, 77951, 9004, 0, + 74249, 10230, 0, 0, 0, 77947, 0, 69679, 121475, 9890, 125049, 12971, 0, + 92556, 0, 67903, 70051, 983905, 0, 0, 9635, 12600, 0, 0, 0, 118900, 6469, + 0, 101113, 65304, 4679, 101114, 64300, 64867, 6531, 101118, 101099, + 101098, 0, 101100, 42916, 0, 0, 0, 0, 0, 0, 4445, 72296, 0, 11533, 0, + 3416, 129148, 0, 0, 0, 78566, 0, 0, 101091, 0, 101093, 5447, 72140, + 70752, 101097, 101096, 0, 0, 0, 64448, 0, 43920, 70677, 0, 6232, 101101, + 101104, 101103, 43608, 101105, 101108, 6538, 4335, 0, 3941, 74986, 11061, + 0, 74988, 74987, 0, 12155, 128278, 0, 0, 0, 0, 74578, 0, 65832, 0, 129459, 70789, 0, 125050, 0, 0, 350, 10951, 101081, 509, 101083, 101086, 101085, 0, 0, 0, 917540, 0, 100905, 110970, 12162, 64741, 0, 9354, 0, 70802, 100901, 2496, 11516, 944, 128238, 0, 0, 1438, 0, 0, 120185, 70785, 1220, 917952, 93844, 0, 0, 5008, 42630, 70787, 101087, 101090, 68206, 564, 0, 312, 0, 0, 0, 70797, 8877, 269, 0, 128065, 9617, 0, 0, 100910, 0, - 0, 10862, 0, 0, 41416, 0, 4173, 0, 0, 0, 1906, 0, 41418, 74073, 101068, - 101067, 41415, 69622, 9582, 0, 64287, 0, 0, 11428, 1730, 0, 0, 19918, - 10469, 101076, 101079, 68088, 0, 101080, 72342, 0, 0, 0, 6129, 0, 0, 0, - 0, 7874, 0, 0, 11206, 13136, 0, 129305, 0, 64374, 74925, 0, 73892, 0, - 101073, 101072, 101075, 74960, 9228, 101054, 101057, 101056, 5240, 9811, - 0, 101060, 0, 0, 0, 74079, 65873, 0, 0, 0, 9501, 0, 68081, 72808, 65465, - 64654, 7467, 0, 0, 83460, 10040, 0, 3096, 0, 101053, 101052, 68820, - 83461, 0, 0, 0, 0, 0, 0, 0, 0, 68801, 0, 101062, 101061, 101064, 101063, - 0, 8637, 70741, 0, 77983, 77969, 11471, 43554, 0, 77968, 0, 0, 0, 2426, - 12042, 0, 0, 0, 3961, 12115, 129633, 0, 77972, 64561, 0, 4981, 74644, - 129558, 0, 0, 42686, 77976, 128776, 64686, 0, 77958, 7589, 0, 0, 3237, 0, - 68215, 0, 8541, 127157, 71067, 0, 0, 0, 0, 0, 0, 43555, 0, 0, 10060, - 111261, 100917, 0, 0, 0, 64877, 0, 0, 8614, 65220, 41493, 0, 0, 0, 43780, - 0, 0, 70689, 0, 0, 0, 0, 0, 0, 4012, 10395, 0, 0, 111253, 126511, 111254, - 125051, 695, 739, 696, 7611, 0, 42755, 68421, 9227, 7506, 7510, 69937, - 691, 738, 7511, 7512, 7515, 7501, 688, 41847, 690, 2548, 737, 974, 43386, - 0, 0, 0, 0, 0, 0, 65860, 0, 7051, 69777, 4682, 0, 983096, 6406, 4685, 0, - 0, 10347, 4680, 6341, 0, 0, 92607, 74325, 0, 0, 0, 0, 0, 0, 0, 0, 43505, - 92468, 11718, 42373, 11714, 0, 0, 129567, 11717, 0, 10594, 0, 11712, 0, - 0, 10967, 0, 0, 0, 66632, 0, 0, 0, 0, 1735, 0, 11134, 2363, 983135, 0, 0, - 70695, 128032, 0, 7491, 7495, 7580, 7496, 7497, 7584, 121478, 127853, 0, - 0, 128375, 0, 8498, 0, 8949, 3065, 0, 0, 0, 0, 0, 0, 11713, 0, 64939, 0, - 6418, 4543, 0, 0, 0, 74800, 0, 0, 0, 0, 0, 0, 0, 12282, 0, 0, 0, 64556, - 0, 9238, 0, 68063, 0, 0, 0, 65438, 0, 128525, 0, 119268, 0, 0, 12900, 0, - 10950, 0, 0, 0, 41400, 126636, 119664, 0, 42232, 0, 1744, 0, 41402, 0, 0, - 0, 41399, 0, 125028, 0, 0, 12690, 0, 0, 43672, 0, 0, 0, 100870, 11315, 0, - 278, 121204, 41405, 129345, 0, 10077, 129650, 70667, 0, 0, 0, 68210, 0, - 0, 11189, 70657, 0, 0, 0, 7934, 0, 93829, 120940, 0, 0, 0, 0, 0, 0, 6413, - 6550, 0, 1940, 2809, 43637, 70045, 0, 0, 10678, 0, 0, 0, 0, 78804, 6403, - 6556, 78803, 0, 0, 0, 0, 0, 0, 0, 0, 3742, 74408, 3959, 0, 0, 917969, 0, - 0, 128024, 0, 0, 127956, 0, 0, 0, 0, 4676, 983049, 9210, 0, 78143, - 983903, 0, 78168, 983100, 11540, 43546, 6692, 0, 0, 0, 0, 9083, 0, 0, - 78144, 128515, 0, 9677, 0, 70867, 74175, 0, 74070, 0, 0, 365, 0, 43027, - 0, 0, 128236, 0, 119574, 70284, 13151, 0, 0, 127935, 127950, 544, 13249, + 0, 10862, 0, 0, 41416, 0, 4173, 0, 0, 0, 1906, 983835, 41418, 74073, + 101068, 101067, 41415, 69622, 9582, 0, 64287, 0, 0, 11428, 1730, 0, 0, + 19918, 10469, 101076, 101079, 68088, 0, 101080, 72342, 0, 129692, 0, + 6129, 0, 0, 0, 0, 7874, 0, 0, 11206, 13136, 0, 129305, 0, 64374, 74925, + 0, 73892, 0, 101073, 101072, 101075, 74960, 9228, 101054, 101057, 101056, + 5240, 9811, 0, 101060, 129718, 0, 0, 74079, 65873, 0, 0, 0, 9501, 0, + 68081, 72808, 65465, 64654, 7467, 0, 0, 83460, 10040, 0, 3096, 0, 101053, + 101052, 68820, 83461, 0, 0, 0, 0, 0, 0, 83377, 0, 68801, 0, 101062, + 101061, 101064, 101063, 0, 8637, 70741, 0, 77983, 77969, 11471, 43554, 0, + 77968, 0, 0, 0, 2426, 12042, 0, 0, 0, 3961, 12115, 129633, 0, 77972, + 64561, 0, 4981, 74644, 129558, 0, 0, 42686, 77976, 128776, 64686, 0, + 77958, 7589, 0, 0, 3237, 0, 68215, 0, 8541, 127157, 71067, 120174, 0, 0, + 0, 0, 0, 43555, 0, 0, 10060, 111261, 100917, 0, 0, 0, 64877, 0, 0, 8614, + 65220, 41493, 0, 0, 0, 43780, 0, 0, 70689, 0, 0, 0, 0, 0, 0, 4012, 10395, + 0, 0, 111253, 126511, 111254, 125051, 695, 739, 696, 7611, 0, 42755, + 68421, 9227, 7506, 7510, 69937, 691, 738, 7511, 7512, 7515, 7501, 688, + 41847, 690, 2548, 737, 974, 43386, 0, 0, 0, 0, 0, 0, 65860, 0, 7051, + 69777, 4682, 0, 983096, 6406, 4685, 0, 0, 10347, 4680, 6341, 0, 0, 92607, + 74325, 0, 0, 0, 0, 0, 0, 0, 0, 43505, 92468, 11718, 42373, 11714, 0, 0, + 129567, 11717, 0, 10594, 0, 11712, 0, 0, 10967, 0, 0, 0, 66632, 0, 0, 0, + 0, 1735, 0, 11134, 2363, 983135, 0, 0, 70695, 128032, 0, 7491, 7495, + 7580, 7496, 7497, 7584, 121478, 127853, 0, 0, 70025, 0, 8498, 0, 8949, + 3065, 0, 0, 0, 0, 0, 0, 11713, 0, 64939, 0, 6418, 4543, 0, 0, 0, 74800, + 0, 0, 0, 0, 0, 0, 0, 12282, 0, 0, 0, 64556, 0, 9238, 0, 68063, 0, 0, 0, + 65438, 0, 128525, 0, 119268, 0, 0, 12900, 0, 10950, 0, 0, 0, 41400, + 126636, 119664, 0, 42232, 0, 1744, 0, 41402, 0, 0, 0, 41399, 0, 125028, + 0, 0, 12690, 0, 0, 43672, 0, 0, 0, 100870, 11315, 0, 278, 121204, 41405, + 129345, 0, 10077, 129650, 70667, 0, 0, 0, 68210, 0, 0, 11189, 70657, 0, + 0, 0, 7934, 0, 93829, 120940, 0, 0, 0, 0, 0, 0, 6413, 6550, 0, 1940, + 2809, 43637, 70045, 0, 0, 10678, 0, 0, 0, 129701, 78804, 6403, 6556, + 78803, 0, 0, 0, 0, 0, 0, 0, 0, 3742, 74408, 3959, 0, 0, 917969, 0, 0, + 128024, 0, 0, 127956, 0, 0, 0, 0, 4676, 983049, 9210, 0, 78143, 983903, + 0, 78168, 983100, 11540, 43546, 6692, 0, 0, 0, 0, 9083, 0, 0, 78144, + 128515, 0, 9677, 0, 70867, 74175, 0, 74070, 0, 0, 365, 0, 43027, 0, 0, + 128236, 0, 119574, 70284, 13151, 0, 0, 127935, 127950, 544, 13249, 119018, 0, 120846, 0, 0, 73671, 65339, 73000, 2211, 0, 0, 0, 0, 0, 0, 0, 0, 128037, 0, 0, 0, 0, 0, 0, 0, 127188, 0, 69708, 9638, 0, 100878, 0, 0, 0, 74545, 128820, 128819, 75062, 128963, 0, 0, 0, 11264, 43994, 0, 0, 0, 1311, 0, 0, 0, 0, 13068, 0, 0, 78164, 78155, 0, 949, 0, 0, 0, 78176, - 69709, 78177, 63828, 0, 0, 0, 70282, 0, 0, 0, 64822, 0, 6530, 0, 0, + 69709, 78177, 63828, 0, 0, 0, 70282, 0, 0, 0, 64822, 0, 6530, 983270, 0, 70493, 0, 129325, 0, 0, 4431, 118839, 127490, 983741, 73667, 127986, 0, 10336, 10400, 0, 0, 92959, 0, 0, 0, 42270, 128880, 6428, 0, 0, 0, 0, 43455, 0, 43526, 100888, 12835, 129501, 9493, 0, 0, 11793, 0, 127897, 74394, 0, 10653, 0, 0, 0, 0, 6560, 7016, 74274, 983627, 43556, 3929, - 123615, 6614, 2768, 0, 65609, 0, 11811, 0, 0, 0, 127513, 0, 6554, 0, + 123615, 6614, 2768, 0, 65609, 0, 11811, 129696, 0, 0, 127513, 0, 6554, 0, 6305, 66283, 4675, 118826, 78552, 0, 0, 74361, 0, 0, 68108, 0, 0, 92232, 0, 93022, 7392, 8230, 9365, 983723, 0, 0, 0, 0, 42925, 0, 0, 0, 0, 229, 43834, 119884, 0, 43552, 119881, 119880, 119883, 119882, 119877, 119876, @@ -26361,123 +27212,123 @@ static const unsigned int code_hash[] = { 0, 0, 128663, 0, 12239, 0, 0, 10432, 12097, 0, 194815, 1233, 0, 0, 127200, 0, 66395, 0, 0, 129504, 0, 0, 0, 0, 2388, 92555, 119868, 119871, 119870, 119865, 895, 92668, 119866, 64889, 7143, 119863, 119862, 0, 0, - 69983, 0, 74376, 3053, 0, 0, 2047, 0, 0, 0, 121279, 67985, 194801, 92600, - 194803, 194802, 194805, 194804, 194807, 194806, 129134, 194808, 0, 0, 0, - 10473, 129331, 0, 194810, 0, 194812, 194811, 194814, 194813, 123195, - 43528, 69673, 194791, 0, 194793, 1912, 120779, 10306, 10370, 0, 0, 8867, - 10250, 10258, 10274, 1635, 120152, 0, 0, 0, 129379, 0, 0, 9919, 120148, - 559, 128157, 41825, 127975, 92989, 0, 74016, 194781, 6542, 41957, 7318, - 0, 0, 41956, 65749, 65750, 65751, 121323, 64487, 0, 0, 10223, 42062, - 100640, 0, 125044, 3668, 65754, 43560, 12226, 0, 93973, 194784, 41959, - 194786, 194785, 194788, 43618, 65747, 10937, 2962, 0, 2953, 10062, 65745, - 71457, 8921, 66013, 129370, 0, 194769, 194768, 43409, 194770, 2949, - 194772, 194775, 194774, 2958, 194776, 74868, 2300, 2951, 120061, 0, - 120043, 194778, 0, 120051, 194779, 120056, 120065, 70798, 120048, 0, - 120062, 120055, 78178, 100668, 0, 0, 92269, 0, 0, 70796, 127818, 0, 0, - 64890, 0, 43630, 11336, 799, 0, 10276, 10308, 10372, 917541, 0, 0, 10252, - 10260, 68220, 55284, 0, 0, 10384, 0, 0, 0, 64523, 0, 0, 65736, 0, 0, 0, - 0, 0, 0, 0, 0, 43549, 65738, 42150, 65739, 0, 78195, 10288, 10320, 0, - 10596, 0, 67673, 65045, 121283, 78198, 2049, 10098, 0, 122904, 127943, - 10264, 10280, 10312, 10376, 7013, 0, 0, 0, 0, 66375, 0, 4862, 0, 6537, 0, - 128335, 3914, 92178, 93976, 9065, 64816, 0, 72218, 73026, 0, 0, 72139, - 4694, 11420, 4690, 0, 0, 983209, 4693, 0, 0, 0, 4688, 0, 0, 0, 0, 8238, - 3110, 0, 983920, 0, 6528, 0, 0, 0, 218, 0, 1520, 129577, 70039, 0, - 983594, 0, 0, 78167, 10088, 6548, 100786, 0, 0, 0, 8888, 0, 124954, 0, 0, - 126593, 68876, 0, 0, 0, 0, 0, 0, 0, 4689, 43541, 77954, 120157, 0, - 120156, 78810, 120163, 0, 0, 0, 0, 78121, 0, 0, 11450, 0, 71900, 92613, - 0, 121317, 74622, 128720, 9244, 0, 0, 127763, 0, 0, 0, 0, 0, 0, 71084, 0, - 0, 0, 0, 10513, 0, 0, 0, 52, 119178, 0, 0, 93961, 0, 0, 4812, 0, 0, 0, 0, - 0, 0, 128425, 0, 120453, 0, 77959, 10170, 120450, 6544, 0, 0, 69782, - 121517, 0, 0, 65258, 10369, 0, 1585, 74014, 10249, 422, 1500, 2036, 986, - 0, 64394, 0, 5599, 917981, 2494, 0, 0, 74021, 983877, 78203, 127808, 0, - 72871, 65102, 8961, 74305, 10243, 10245, 128170, 0, 0, 0, 0, 0, 2508, - 129591, 120440, 0, 120439, 0, 0, 0, 0, 0, 0, 64533, 983186, 0, 0, 74008, - 0, 0, 43375, 0, 2504, 0, 121313, 0, 983922, 6943, 0, 5859, 100677, 0, 0, - 72873, 983926, 0, 0, 983904, 92390, 2753, 1936, 2153, 67701, 2751, 12662, - 2763, 8953, 0, 10731, 0, 7052, 0, 0, 0, 0, 119899, 0, 66675, 0, 119897, - 0, 71053, 0, 119903, 0, 67829, 7899, 119901, 71119, 43798, 7072, 119902, - 122898, 11260, 0, 71059, 0, 0, 212, 0, 12350, 0, 0, 0, 0, 0, 128402, - 2759, 0, 0, 93064, 0, 0, 0, 1291, 0, 0, 121318, 119911, 0, 119910, 0, - 12062, 0, 121216, 0, 0, 121044, 120611, 8246, 0, 0, 0, 0, 0, 0, 73962, 0, - 0, 43524, 0, 64426, 0, 0, 0, 0, 65664, 6693, 0, 0, 8674, 0, 128812, 0, - 11846, 70690, 121461, 69395, 4811, 0, 5986, 0, 3046, 74480, 5985, 0, 0, - 0, 0, 12187, 83148, 71041, 5984, 0, 93817, 4393, 126264, 120206, 917599, - 0, 0, 0, 93806, 93805, 0, 3491, 0, 67146, 0, 93819, 0, 72428, 0, 0, 0, - 124968, 41284, 126228, 0, 0, 41287, 0, 100689, 0, 0, 92189, 0, 0, 219, - 120874, 0, 0, 0, 68485, 119672, 43241, 0, 7147, 0, 0, 0, 0, 0, 0, 64610, - 11804, 0, 7149, 64808, 0, 0, 0, 92301, 73690, 0, 5253, 0, 0, 0, 0, - 129045, 983596, 11098, 68433, 0, 120484, 111009, 0, 0, 0, 0, 0, 70801, - 100779, 0, 128198, 9604, 0, 0, 0, 0, 118941, 64392, 0, 0, 0, 0, 41974, - 126262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983239, 5308, 0, 290, 0, 125278, - 128382, 2792, 0, 0, 120521, 0, 126237, 0, 126099, 0, 0, 0, 0, 128503, 0, - 0, 72816, 0, 0, 0, 92671, 0, 0, 42646, 7606, 2591, 73896, 0, 43513, - 64482, 0, 0, 65270, 0, 0, 983682, 9112, 0, 113763, 9490, 0, 0, 0, 0, 0, - 9071, 0, 0, 0, 0, 74607, 0, 2535, 65504, 43602, 0, 0, 71256, 0, 0, - 123147, 11845, 11006, 92315, 7807, 8073, 0, 10629, 0, 74088, 0, 10823, 0, - 113762, 8762, 0, 69689, 0, 43969, 65047, 10737, 3463, 72858, 129585, - 66645, 0, 4815, 0, 0, 12345, 983742, 0, 5195, 0, 0, 66639, 0, 0, 127316, - 0, 92759, 92385, 1262, 0, 6561, 19939, 0, 0, 100772, 123160, 0, 0, - 100774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5702, 3655, 0, 8430, 0, - 68807, 0, 0, 121137, 0, 0, 5254, 0, 0, 0, 0, 119107, 5129, 0, 70816, 0, - 92280, 5614, 0, 0, 11720, 0, 11721, 70804, 4798, 0, 120541, 66038, 4793, - 67851, 7352, 0, 0, 0, 0, 917600, 0, 300, 0, 0, 128575, 92660, 0, 0, 2562, - 70156, 120856, 0, 0, 92738, 0, 0, 127820, 71093, 0, 127969, 128221, 0, - 3424, 93843, 0, 0, 7074, 70873, 917926, 0, 0, 10832, 0, 0, 69852, 72430, - 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 1215, 0, 5744, 0, 66440, 0, 0, 0, - 42881, 0, 8980, 118988, 67861, 8844, 7433, 0, 0, 4278, 0, 0, 0, 70821, - 9312, 4348, 0, 128401, 65946, 0, 7087, 5255, 0, 661, 0, 0, 0, 0, 0, 0, 0, - 129073, 73694, 0, 123154, 0, 73688, 0, 127179, 3621, 83325, 66666, 72968, - 0, 6562, 12928, 0, 73991, 0, 0, 11383, 0, 0, 65588, 120739, 0, 0, 0, 0, - 0, 0, 0, 0, 11436, 2070, 64, 110824, 0, 10291, 10323, 10387, 0, 0, 0, - 42008, 9708, 42710, 0, 42011, 0, 92164, 0, 0, 1702, 1240, 128383, 6286, - 9689, 111080, 0, 0, 0, 1765, 0, 0, 92373, 0, 0, 0, 8401, 72991, 42014, 0, - 67237, 0, 0, 0, 0, 0, 0, 0, 70819, 0, 0, 0, 0, 12667, 0, 0, 10147, 0, - 127568, 126483, 72812, 0, 0, 0, 0, 123139, 128968, 0, 64947, 0, 0, 0, 0, - 10435, 11462, 0, 7084, 0, 0, 0, 0, 0, 126084, 0, 66662, 0, 0, 0, 0, - 125134, 0, 0, 77990, 263, 983728, 41288, 0, 0, 78387, 74340, 70313, - 129140, 0, 0, 0, 42022, 71265, 0, 0, 0, 0, 0, 0, 42020, 123146, 0, 6992, - 42019, 0, 41290, 0, 12295, 126233, 71304, 0, 0, 71300, 120631, 5954, - 64931, 69385, 100699, 198, 68453, 78129, 0, 121351, 0, 70818, 13165, - 7107, 0, 42804, 678, 72850, 118960, 0, 72985, 42806, 42808, 0, 0, 2097, - 0, 120560, 70823, 0, 0, 3892, 68632, 0, 6712, 917959, 0, 0, 0, 0, 123158, - 69954, 0, 497, 12100, 5953, 92667, 7796, 0, 43254, 0, 0, 11072, 5952, - 1281, 43747, 0, 69380, 10677, 0, 0, 0, 1859, 0, 72856, 3425, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 65199, 1738, 0, 122911, 0, 0, 0, 11101, 0, 0, 0, 0, - 127002, 69651, 4436, 194683, 73984, 0, 70305, 64872, 128296, 0, 0, 0, - 121377, 0, 0, 0, 43686, 983108, 0, 119109, 0, 70826, 319, 0, 43479, - 73001, 0, 0, 12849, 0, 7640, 71083, 9673, 0, 0, 0, 92670, 0, 92665, - 113717, 41422, 0, 100708, 74941, 3772, 0, 120660, 5011, 0, 0, 126587, - 111315, 0, 0, 6677, 111312, 0, 41427, 64419, 129445, 92262, 0, 70799, 0, - 0, 0, 6106, 0, 41271, 6760, 983739, 4534, 41270, 128876, 0, 0, 119561, 0, - 0, 3671, 8976, 123177, 0, 41275, 0, 128084, 55261, 0, 42013, 0, 568, 0, - 41273, 0, 0, 6728, 0, 9715, 0, 0, 121058, 74820, 0, 92268, 0, 194564, - 11191, 43688, 128023, 0, 0, 0, 126266, 0, 0, 0, 11958, 11165, 0, 125087, - 0, 0, 66336, 127944, 0, 0, 0, 0, 42858, 11789, 72878, 5557, 0, 69444, - 7300, 0, 9467, 5558, 64486, 43844, 0, 0, 6706, 10146, 0, 127185, 64566, - 0, 0, 0, 0, 0, 0, 0, 4546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64528, 123136, - 6307, 128966, 0, 7544, 0, 43469, 111317, 0, 10152, 0, 65091, 0, 0, 0, 0, - 66652, 0, 0, 0, 0, 64823, 5559, 0, 70711, 6702, 5556, 0, 0, 0, 0, 0, - 11166, 0, 0, 5506, 0, 1911, 73021, 0, 12598, 8845, 66698, 0, 73012, - 123145, 0, 2098, 0, 0, 0, 66622, 194678, 0, 0, 0, 9898, 0, 0, 7552, 0, 0, - 0, 7223, 65723, 0, 0, 0, 7024, 65728, 127155, 1210, 0, 65175, 10184, - 65726, 43654, 0, 0, 0, 38, 65729, 66669, 0, 0, 0, 0, 0, 0, 0, 0, 74233, - 73018, 119843, 42860, 111301, 92576, 65721, 65722, 0, 0, 0, 0, 68843, 0, - 68850, 0, 92388, 92267, 128536, 65577, 92213, 0, 127518, 11650, 5013, - 92663, 68810, 92568, 118914, 6613, 74371, 0, 0, 0, 0, 64714, 71479, 0, - 983778, 12120, 0, 0, 43124, 0, 0, 78037, 0, 0, 126219, 0, 0, 1837, + 69983, 0, 74376, 3053, 129829, 0, 2047, 0, 0, 0, 121279, 67985, 194801, + 92600, 194803, 194802, 194805, 194804, 194807, 194806, 129134, 194808, 0, + 0, 0, 10473, 129331, 0, 194810, 129806, 194812, 129813, 194814, 194813, + 123195, 43528, 69673, 194791, 0, 194793, 1912, 120779, 10306, 10370, 0, + 0, 8867, 10250, 10258, 10274, 1635, 120152, 0, 0, 0, 129379, 0, 0, 9919, + 120148, 559, 128157, 41825, 127975, 92989, 0, 74016, 194781, 6542, 41957, + 7318, 0, 0, 41956, 65749, 65750, 65751, 121323, 64487, 0, 0, 10223, + 42062, 100640, 101195, 125044, 3668, 65754, 43560, 12226, 0, 93973, + 194784, 41959, 194786, 194785, 194788, 43618, 65747, 10937, 2962, 0, + 2953, 10062, 65745, 71457, 8921, 66013, 129370, 0, 194769, 194768, 43409, + 194770, 2949, 194772, 194775, 194774, 2958, 194776, 74868, 2300, 2951, + 120061, 0, 120043, 194778, 0, 120051, 194779, 120056, 120065, 70798, + 120048, 0, 120062, 120055, 71989, 100668, 0, 0, 71985, 0, 71992, 70796, + 127818, 0, 0, 64890, 0, 43630, 11336, 799, 0, 10276, 10308, 10372, + 917541, 0, 0, 10252, 10260, 68220, 55284, 0, 0, 10384, 0, 0, 0, 64523, + 129744, 0, 65736, 0, 0, 0, 0, 0, 0, 0, 0, 43549, 65738, 42150, 65739, 0, + 78195, 10288, 10320, 0, 10596, 0, 67673, 65045, 121283, 78198, 2049, + 10098, 0, 122904, 127943, 10264, 10280, 10312, 10376, 7013, 0, 0, 0, 0, + 66375, 0, 4862, 0, 6537, 0, 128335, 3914, 92178, 93976, 9065, 64816, 0, + 72218, 73026, 0, 0, 72139, 4694, 11420, 4690, 0, 0, 983209, 4693, 0, 0, + 0, 4688, 0, 0, 0, 0, 8238, 3110, 0, 983920, 0, 6528, 0, 0, 0, 218, 0, + 1520, 129577, 70039, 0, 983594, 0, 0, 78167, 10088, 6548, 100786, 0, 0, + 0, 8888, 0, 124954, 0, 0, 126593, 68876, 0, 0, 0, 0, 0, 0, 0, 4689, + 43541, 77954, 120157, 0, 120156, 78810, 120163, 0, 0, 0, 0, 78121, 0, 0, + 11450, 0, 71900, 92613, 0, 121317, 74622, 128720, 9244, 0, 0, 127763, 0, + 0, 0, 0, 0, 0, 71084, 0, 0, 0, 0, 10513, 0, 0, 0, 52, 119178, 0, 0, + 93961, 0, 0, 4812, 0, 0, 0, 0, 0, 0, 128425, 0, 120453, 0, 77959, 10170, + 120450, 6544, 0, 0, 69782, 121517, 0, 0, 65258, 10369, 0, 1585, 74014, + 10249, 422, 1500, 2036, 986, 0, 64394, 0, 5599, 917981, 2494, 0, 0, + 74021, 983877, 78203, 127808, 0, 72871, 65102, 8961, 74305, 10243, 10245, + 128170, 0, 0, 0, 0, 0, 2508, 129591, 120440, 0, 120439, 0, 0, 0, 0, 0, 0, + 64533, 983186, 0, 0, 74008, 0, 0, 43375, 0, 2504, 0, 121313, 0, 983922, + 6943, 0, 5859, 100677, 0, 0, 72873, 983926, 0, 0, 983904, 92390, 2753, + 1936, 2153, 67701, 2751, 12662, 2763, 8953, 0, 10731, 0, 7052, 0, 0, 0, + 0, 119899, 0, 66675, 0, 119897, 0, 71053, 0, 119903, 0, 67829, 7899, + 119901, 71119, 43798, 7072, 119902, 122898, 11260, 0, 71059, 0, 0, 212, + 0, 12350, 0, 0, 0, 0, 0, 128402, 2759, 0, 0, 93064, 0, 0, 0, 1291, 0, 0, + 121318, 119911, 0, 119910, 0, 12062, 0, 121216, 0, 0, 121044, 120611, + 8246, 128874, 0, 0, 0, 0, 0, 73962, 0, 0, 43524, 0, 64426, 0, 0, 0, 0, + 65664, 6693, 0, 0, 8674, 0, 128812, 0, 11846, 70690, 121461, 69395, 4811, + 0, 5986, 0, 3046, 74480, 5985, 0, 0, 0, 0, 12187, 83148, 71041, 5984, 0, + 93817, 4393, 126264, 120206, 917599, 0, 0, 0, 93806, 93805, 0, 3491, 0, + 67146, 0, 93819, 0, 72428, 0, 0, 0, 124968, 41284, 126228, 0, 0, 41287, + 0, 100689, 0, 0, 92189, 0, 0, 219, 120874, 0, 0, 0, 68485, 119672, 43241, + 0, 7147, 0, 0, 0, 0, 0, 0, 64610, 11804, 0, 7149, 64808, 0, 0, 0, 92301, + 73690, 0, 5253, 0, 0, 0, 0, 129045, 983596, 11098, 68433, 0, 120484, + 111009, 0, 0, 0, 0, 0, 70801, 100779, 0, 128198, 9604, 0, 130036, 0, 0, + 118941, 64392, 0, 0, 0, 0, 41974, 126262, 0, 0, 0, 129818, 0, 129833, 0, + 0, 0, 0, 0, 983239, 5308, 0, 290, 0, 125278, 128382, 2792, 0, 0, 120521, + 0, 126237, 0, 126099, 0, 0, 0, 0, 128503, 0, 0, 72816, 0, 0, 0, 92671, 0, + 0, 42646, 7606, 2591, 73896, 0, 43513, 64482, 0, 0, 65270, 0, 0, 983682, + 9112, 0, 113763, 9490, 0, 0, 0, 0, 0, 9071, 0, 0, 0, 0, 74607, 0, 2535, + 65504, 43602, 0, 0, 71256, 0, 0, 123147, 11845, 11006, 92315, 7807, 8073, + 0, 10629, 0, 74088, 0, 10823, 0, 113762, 8762, 0, 69689, 0, 43969, 65047, + 10737, 3463, 72858, 129585, 66645, 0, 4815, 0, 0, 12345, 983742, 0, 5195, + 0, 0, 66639, 0, 0, 127316, 0, 92759, 92385, 1262, 0, 6561, 19939, 0, 0, + 100772, 123160, 69269, 0, 100774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5702, 3655, 0, 8430, 0, 68807, 0, 0, 121137, 0, 0, 5254, 0, 0, 0, 0, + 119107, 5129, 0, 70816, 0, 92280, 5614, 0, 0, 11720, 0, 11721, 70804, + 4798, 0, 120541, 66038, 4793, 67851, 7352, 0, 0, 0, 0, 917600, 0, 300, 0, + 0, 128575, 92660, 0, 0, 2562, 70156, 120856, 0, 0, 92738, 0, 0, 127820, + 71093, 0, 127969, 128221, 0, 3424, 93843, 0, 0, 7074, 70873, 917926, 0, + 0, 10832, 0, 0, 69852, 72430, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 1215, 0, + 5744, 0, 66440, 0, 0, 0, 42881, 0, 8980, 118988, 67861, 8844, 7433, 0, 0, + 4278, 0, 0, 0, 70821, 9312, 4348, 0, 128401, 65946, 0, 7087, 5255, 0, + 661, 0, 0, 0, 0, 0, 0, 0, 121009, 73694, 0, 123154, 0, 73688, 0, 127179, + 3621, 83325, 66666, 72968, 0, 6562, 12928, 0, 73991, 0, 0, 11383, 0, 0, + 65588, 120739, 0, 0, 0, 0, 0, 0, 0, 0, 11436, 2070, 64, 110824, 0, 10291, + 10323, 10387, 0, 0, 0, 42008, 9708, 42710, 0, 42011, 0, 92164, 0, 0, + 1702, 1240, 128383, 6286, 9689, 111080, 0, 0, 0, 1765, 0, 0, 92373, 0, 0, + 0, 8401, 72991, 42014, 0, 67237, 0, 0, 0, 0, 0, 0, 0, 70819, 0, 0, 0, 0, + 12667, 0, 0, 10147, 0, 127568, 126483, 72812, 0, 0, 0, 0, 123139, 128968, + 0, 64947, 0, 0, 0, 0, 10435, 11462, 0, 7084, 0, 0, 0, 0, 0, 126084, 0, + 66662, 0, 0, 0, 0, 125134, 0, 0, 77990, 263, 983728, 41288, 127953, 0, + 78387, 74340, 70313, 129140, 0, 0, 0, 42022, 71265, 0, 0, 0, 0, 0, 0, + 42020, 123146, 0, 6992, 42019, 0, 41290, 0, 12295, 126233, 71304, 0, + 120984, 71300, 120631, 5954, 64931, 69385, 100699, 198, 68453, 78129, 0, + 121351, 0, 70818, 13165, 7107, 0, 42804, 678, 72850, 118960, 0, 72985, + 42806, 42808, 0, 0, 2097, 0, 120560, 70823, 0, 0, 3892, 68632, 0, 6712, + 917959, 0, 0, 0, 0, 123158, 69954, 0, 497, 12100, 5953, 92667, 7796, 0, + 43254, 0, 0, 11072, 5952, 1281, 43747, 0, 69380, 10677, 0, 0, 0, 1859, 0, + 72856, 3425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65199, 1738, 0, 122911, 0, 0, + 0, 11101, 0, 0, 0, 0, 127002, 69651, 4436, 194683, 73984, 0, 70305, + 64872, 128296, 0, 0, 0, 121377, 0, 0, 0, 43686, 983108, 0, 119109, 0, + 70826, 319, 0, 43479, 73001, 0, 0, 12849, 0, 7640, 71083, 9673, 0, 0, 0, + 92670, 0, 92665, 113717, 41422, 0, 100708, 74941, 3772, 0, 120660, 5011, + 0, 0, 126587, 111315, 0, 0, 6677, 111312, 0, 41427, 64419, 129445, 92262, + 0, 70799, 0, 0, 0, 6106, 0, 41271, 6760, 983739, 4534, 41270, 128876, 0, + 0, 119561, 0, 0, 3671, 8976, 123177, 0, 41275, 0, 128084, 55261, 0, + 42013, 0, 568, 0, 41273, 0, 0, 6728, 0, 9715, 0, 0, 121058, 74820, 0, + 92268, 0, 194564, 11191, 43688, 128023, 0, 0, 0, 126266, 0, 0, 0, 11958, + 11165, 0, 125087, 0, 0, 66336, 127944, 0, 0, 0, 0, 42858, 11789, 72878, + 5557, 0, 69444, 7300, 0, 9467, 5558, 64486, 43844, 0, 0, 6706, 10146, 0, + 127185, 64566, 0, 0, 0, 0, 0, 0, 0, 4546, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 64528, 123136, 6307, 128966, 0, 7544, 0, 43469, 111317, 0, 10152, 0, + 65091, 0, 0, 0, 0, 66652, 0, 0, 0, 0, 64823, 5559, 0, 70711, 6702, 5556, + 0, 0, 0, 0, 0, 11166, 0, 0, 5506, 0, 1911, 73021, 0, 12598, 8845, 66698, + 0, 73012, 123145, 0, 2098, 0, 0, 0, 66622, 194678, 0, 0, 0, 9898, 0, 0, + 7552, 0, 0, 0, 7223, 65723, 0, 0, 0, 7024, 65728, 127155, 1210, 0, 65175, + 10184, 65726, 43654, 0, 0, 0, 38, 65729, 66669, 0, 0, 0, 0, 0, 0, 0, 0, + 74233, 73018, 119843, 42860, 111301, 92576, 65721, 65722, 0, 0, 0, 0, + 68843, 0, 68850, 0, 92388, 92267, 128536, 65577, 92213, 0, 127518, 11650, + 5013, 92663, 68810, 92568, 118914, 6613, 74371, 0, 0, 0, 0, 64714, 71479, + 0, 983778, 12120, 0, 0, 43124, 0, 0, 78037, 69263, 0, 126219, 0, 0, 1837, 125086, 0, 0, 0, 127210, 4952, 65718, 64405, 5504, 65720, 65714, 65715, - 65716, 10403, 127005, 0, 41449, 0, 74028, 127213, 0, 119234, 1127, 455, - 0, 0, 72860, 3483, 0, 1989, 0, 69678, 9104, 0, 65375, 0, 0, 0, 1864, 0, + 65716, 10403, 127005, 0, 41449, 0, 74028, 72019, 0, 119234, 1127, 455, 0, + 0, 72860, 3483, 0, 1989, 0, 69678, 9104, 0, 65375, 0, 0, 0, 1864, 0, 72810, 8107, 2540, 0, 0, 11257, 128807, 119576, 0, 120999, 0, 0, 8604, 0, - 0, 0, 0, 128270, 0, 0, 3115, 0, 10106, 127862, 118842, 0, 0, 9631, 0, 0, - 0, 0, 0, 0, 0, 258, 129079, 0, 0, 0, 92292, 0, 70699, 0, 11478, 0, + 0, 0, 0, 128270, 0, 0, 3115, 0, 10106, 127862, 118842, 101136, 0, 9631, + 0, 0, 0, 0, 0, 0, 0, 258, 129079, 0, 0, 0, 92292, 0, 70699, 0, 11478, 0, 129640, 11522, 0, 8549, 0, 128430, 0, 0, 0, 0, 0, 0, 123140, 0, 0, 0, 9221, 12590, 73048, 0, 0, 0, 67741, 111294, 12619, 0, 10154, 111266, 74439, 2039, 0, 7446, 0, 111276, 10974, 458, 72831, 0, 0, 0, 11916, 0, 0, 69671, 0, 121057, 12288, 0, 111288, 0, 111289, 983176, 0, 128199, 13080, 0, 67828, 6610, 6030, 8059, 7508, 123170, 0, 0, 0, 0, 41278, 129393, 0, - 128192, 41277, 64658, 983983, 0, 6625, 983159, 19904, 0, 0, 0, 0, 0, 0, - 833, 0, 6369, 0, 0, 42664, 0, 0, 0, 0, 0, 0, 6913, 933, 1341, 68828, + 128192, 41277, 64658, 983983, 101278, 6625, 983159, 19904, 0, 0, 0, 0, 0, + 0, 833, 0, 6369, 0, 0, 42664, 0, 0, 0, 0, 0, 0, 6913, 933, 1341, 68828, 6720, 0, 0, 983604, 0, 0, 7405, 128025, 0, 0, 0, 0, 0, 0, 0, 70704, 0, 0, 0, 0, 9716, 0, 0, 0, 70719, 0, 0, 0, 0, 72862, 70687, 0, 93987, 0, 0, 0, 70721, 9573, 0, 0, 111245, 83225, 83226, 6949, 126482, 74061, 83222, @@ -26491,58 +27342,58 @@ static const unsigned int code_hash[] = { 0, 0, 120809, 10599, 66892, 0, 0, 0, 0, 0, 0, 11437, 0, 0, 0, 0, 0, 0, 12624, 0, 41185, 72865, 69439, 8159, 0, 11686, 71478, 65224, 0, 4655, 0, 0, 92183, 0, 10343, 10407, 0, 0, 0, 111221, 0, 0, 0, 94057, 68201, - 129574, 0, 983568, 72156, 42792, 5743, 10424, 0, 0, 0, 0, 0, 8875, - 111225, 0, 917991, 13117, 12847, 4651, 118917, 0, 962, 0, 0, 64705, - 42564, 0, 1582, 0, 5508, 0, 0, 0, 10801, 123602, 118798, 73705, 0, 66911, - 10439, 66891, 0, 0, 7860, 0, 906, 917985, 0, 6405, 64722, 0, 83266, - 64694, 83268, 917990, 1153, 83263, 64788, 83265, 0, 12626, 83260, 83261, - 9964, 0, 0, 4642, 66574, 127886, 0, 0, 0, 0, 0, 9008, 100847, 0, 0, 0, - 83248, 917976, 917993, 123173, 42842, 83244, 83245, 83247, 83239, 83240, - 83241, 83242, 0, 11335, 92661, 83238, 3920, 0, 0, 0, 83255, 83256, 41967, - 83258, 83251, 83252, 83253, 8920, 0, 0, 83249, 83250, 0, 0, 43919, 0, 0, - 0, 0, 128021, 0, 68113, 65196, 0, 0, 128472, 0, 10111, 64875, 0, 83491, - 43998, 83232, 83233, 83234, 70691, 83228, 42149, 83230, 68508, 0, 0, 0, - 0, 0, 0, 0, 4110, 66005, 74034, 0, 0, 0, 66703, 0, 0, 983157, 6025, - 69242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70733, 0, 983043, 0, 0, 0, 68817, 0, 0, - 0, 0, 0, 0, 43286, 0, 68765, 0, 0, 0, 0, 983133, 65144, 0, 0, 83236, - 65840, 0, 0, 10081, 0, 0, 983893, 0, 0, 0, 127394, 65882, 0, 128758, 0, - 0, 3605, 10985, 0, 0, 128872, 93972, 1745, 0, 73835, 0, 0, 0, 0, 0, 0, - 8806, 7023, 0, 0, 0, 70702, 70304, 0, 0, 0, 0, 0, 0, 0, 0, 348, 10089, 0, - 9017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42515, 0, 0, 0, 0, 5391, 983236, 0, 0, - 0, 5561, 0, 9429, 0, 67150, 7933, 5562, 0, 0, 0, 0, 78039, 0, 0, 0, 0, - 3979, 71248, 0, 0, 0, 68847, 0, 0, 118847, 65847, 68836, 68838, 0, 10585, - 0, 92676, 7334, 0, 0, 0, 831, 0, 0, 10716, 0, 121325, 0, 12218, 0, 6939, - 70697, 65042, 0, 0, 916, 0, 0, 11968, 0, 0, 5563, 0, 0, 128830, 5560, - 41212, 41774, 0, 4497, 0, 0, 0, 9039, 70678, 41776, 0, 8716, 3567, - 119252, 0, 0, 74260, 0, 93954, 0, 0, 100827, 0, 128879, 70072, 68355, - 68357, 0, 0, 8634, 0, 0, 4209, 120702, 68832, 65879, 68825, 68819, 68822, - 0, 5679, 68813, 68815, 68811, 68812, 64697, 5678, 11821, 68802, 93969, 0, - 0, 0, 0, 70114, 0, 0, 0, 0, 0, 0, 0, 0, 7782, 0, 0, 0, 0, 0, 65711, - 65712, 1216, 0, 69409, 5792, 0, 0, 0, 0, 0, 12244, 0, 5683, 0, 120895, - 121336, 43448, 70670, 0, 0, 5682, 10242, 75043, 74520, 5680, 917568, - 10001, 0, 0, 1449, 10241, 0, 70708, 0, 0, 83180, 83182, 83183, 8584, - 83176, 5567, 83178, 83179, 0, 5564, 42886, 42884, 42882, 5565, 119022, - 120881, 0, 65708, 65709, 5566, 0, 65704, 65705, 11904, 42875, 0, 42873, - 5942, 0, 0, 10361, 10425, 65697, 65698, 65699, 0, 66598, 0, 64664, 10647, - 78702, 78703, 78690, 78700, 0, 65701, 1934, 0, 0, 0, 78710, 0, 78706, - 78709, 6087, 78705, 78716, 78719, 78711, 8043, 8950, 65694, 64485, 0, - 10457, 0, 78724, 78725, 78722, 72332, 78720, 78721, 0, 65515, 0, 10035, - 13069, 0, 0, 127773, 0, 0, 0, 125207, 0, 0, 1667, 0, 0, 42428, 110950, 0, - 0, 41750, 0, 0, 93999, 0, 8101, 3610, 113670, 41748, 110948, 0, 78394, - 119208, 0, 0, 113691, 64549, 68359, 0, 0, 65692, 92701, 0, 0, 12896, - 10456, 68298, 0, 0, 0, 0, 917962, 0, 0, 113665, 70502, 0, 65687, 0, 0, - 74009, 0, 113673, 8536, 70671, 0, 78726, 0, 724, 0, 113675, 78749, 9975, - 78746, 78747, 78744, 4175, 78741, 78743, 78751, 939, 0, 128799, 983119, - 0, 0, 0, 78763, 78764, 78760, 78761, 78758, 78759, 78755, 8425, 0, 0, 0, - 8188, 0, 0, 0, 0, 0, 6370, 0, 7827, 68441, 75008, 0, 917943, 0, 118863, - 0, 0, 0, 0, 121243, 73988, 0, 113668, 0, 11012, 0, 43764, 178, 12972, - 74620, 113671, 0, 113735, 0, 66764, 0, 0, 65690, 72339, 0, 0, 917950, - 9252, 0, 4652, 74259, 0, 917947, 0, 0, 0, 10806, 0, 0, 70016, 0, 6723, 0, - 0, 6993, 0, 0, 12855, 0, 0, 11390, 0, 0, 0, 92503, 0, 0, 983161, 125270, - 92627, 8278, 0, 4034, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12750, 9350, 66037, 0, - 0, 73700, 12747, 0, 0, 128064, 43153, 74640, 0, 0, 43150, 0, 983090, - 983088, 66779, 66777, 10813, 2592, 43139, 0, 0, 0, 0, 0, 71891, 0, 0, 0, - 0, 0, 0, 0, 0, 128825, 1596, 0, 0, 0, 0, 6838, 66572, 0, 126574, 120627, + 129574, 0, 983572, 72156, 42792, 5743, 10424, 0, 0, 0, 0, 0, 8875, + 111225, 0, 917991, 13117, 12847, 4651, 118917, 0, 962, 0, 0, 2242, 42564, + 0, 1582, 0, 5508, 0, 0, 0, 10801, 123602, 118798, 73705, 0, 66911, 10439, + 66891, 0, 0, 7860, 0, 906, 917985, 0, 6405, 64722, 0, 83266, 64694, + 83268, 917990, 1153, 83263, 64788, 83265, 0, 12626, 83260, 83261, 9964, + 0, 0, 4642, 66574, 127886, 0, 0, 0, 0, 0, 9008, 100847, 0, 0, 0, 83248, + 917976, 917993, 123173, 42842, 83244, 83245, 83247, 83239, 83240, 83241, + 83242, 0, 11335, 92661, 83238, 3920, 0, 0, 0, 83255, 83256, 41967, 83258, + 83251, 83252, 83253, 8920, 0, 0, 83249, 83250, 0, 0, 43919, 0, 0, 0, 0, + 128021, 0, 68113, 65196, 0, 0, 128472, 0, 10111, 64875, 0, 83491, 43998, + 83232, 83233, 83234, 70691, 83228, 42149, 83230, 68508, 0, 0, 0, 0, 0, 0, + 0, 4110, 66005, 74034, 0, 0, 0, 66703, 0, 0, 983157, 6025, 69242, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 70733, 0, 983043, 0, 0, 0, 68817, 0, 0, 0, 0, 0, 0, + 43286, 0, 68765, 0, 0, 0, 0, 129871, 65144, 0, 0, 83236, 65840, 0, 0, + 10081, 0, 0, 983893, 0, 0, 0, 127394, 65882, 0, 128758, 0, 0, 3605, + 10985, 0, 0, 128872, 93972, 1745, 0, 73835, 0, 0, 0, 0, 0, 0, 8806, 7023, + 0, 0, 0, 70702, 70304, 0, 0, 0, 0, 0, 0, 0, 0, 348, 10089, 0, 9017, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 42515, 0, 0, 0, 0, 5391, 983236, 0, 0, 0, 5561, 0, + 9429, 0, 67150, 7933, 5562, 0, 0, 0, 0, 78039, 0, 0, 0, 0, 3979, 71248, + 0, 0, 0, 68847, 0, 0, 118847, 65847, 68836, 68838, 0, 10585, 0, 92676, + 7334, 0, 0, 0, 831, 0, 0, 10716, 0, 121325, 0, 12218, 0, 6939, 70697, + 65042, 0, 0, 916, 0, 0, 11968, 0, 0, 5563, 0, 0, 128830, 5560, 41212, + 41774, 0, 4497, 0, 0, 0, 9039, 70678, 41776, 0, 8716, 3567, 119252, 0, 0, + 74260, 0, 93954, 0, 0, 100827, 0, 128879, 70072, 68355, 68357, 0, 0, + 8634, 0, 0, 4209, 120702, 68832, 65879, 68825, 68819, 68822, 0, 5679, + 68813, 68815, 68811, 68812, 64697, 5678, 11821, 68802, 93969, 0, 0, 0, 0, + 70114, 0, 0, 0, 0, 0, 0, 0, 0, 7782, 0, 0, 0, 0, 129977, 65711, 65712, + 1216, 0, 69409, 5792, 0, 0, 0, 0, 0, 12244, 0, 5683, 0, 120895, 121336, + 43448, 70670, 0, 0, 5682, 10242, 75043, 74520, 5680, 917568, 10001, 0, 0, + 1449, 10241, 0, 70708, 0, 0, 83180, 83182, 83183, 8584, 83176, 5567, + 83178, 83179, 0, 5564, 42886, 42884, 42882, 5565, 119022, 120881, 0, + 65708, 65709, 5566, 0, 65704, 65705, 11904, 42875, 0, 42873, 5942, 0, 0, + 10361, 10425, 65697, 65698, 65699, 0, 66598, 0, 64664, 10647, 78702, + 78703, 78690, 78700, 0, 65701, 1934, 0, 0, 0, 78710, 0, 78706, 78709, + 6087, 78705, 78716, 78719, 78711, 8043, 8950, 65694, 64485, 0, 10457, 0, + 78724, 78725, 78722, 72332, 78720, 78721, 0, 65515, 0, 10035, 13069, 0, + 0, 127773, 0, 0, 0, 125207, 0, 0, 1667, 0, 0, 42428, 110950, 0, 0, 41750, + 0, 0, 93999, 0, 8101, 3610, 113670, 41748, 110948, 0, 78394, 119208, 0, + 0, 113691, 64549, 68359, 0, 0, 65692, 92701, 0, 0, 12896, 10456, 68298, + 0, 0, 0, 0, 917962, 0, 0, 113665, 70502, 0, 65687, 0, 0, 74009, 0, + 113673, 8536, 70671, 0, 78726, 0, 724, 0, 113675, 78749, 9975, 78746, + 78747, 78744, 4175, 78741, 78743, 78751, 939, 0, 128799, 983119, 0, 0, 0, + 78763, 78764, 78760, 78761, 78758, 78759, 78755, 8425, 0, 0, 0, 8188, 0, + 0, 0, 0, 0, 6370, 0, 7827, 68441, 75008, 0, 917943, 0, 118863, 0, 0, 0, + 0, 121243, 73988, 0, 113668, 0, 11012, 0, 43764, 178, 12972, 74620, + 113671, 0, 113735, 0, 66764, 0, 0, 65690, 72339, 0, 0, 917950, 9252, 0, + 4652, 74259, 0, 917947, 0, 0, 0, 10806, 0, 0, 70016, 0, 6723, 0, 0, 6993, + 0, 0, 12855, 0, 0, 11390, 0, 0, 0, 92503, 0, 0, 983161, 125270, 92627, + 8278, 0, 4034, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12750, 9350, 66037, 0, 0, + 73700, 12747, 0, 0, 128064, 43153, 74640, 0, 0, 43150, 0, 983090, 983088, + 66779, 66777, 10813, 2592, 43139, 0, 0, 118870, 0, 0, 71891, 0, 0, 0, 0, + 0, 0, 71697, 0, 128825, 1596, 0, 0, 0, 0, 6838, 66572, 0, 126574, 120627, 8092, 12805, 41928, 0, 78406, 78409, 0, 0, 0, 9931, 0, 0, 0, 0, 0, 983759, 6107, 0, 0, 0, 0, 128745, 0, 335, 127003, 64689, 0, 0, 5765, 0, 0, 119227, 6092, 118851, 0, 8876, 83465, 74947, 83455, 129186, 83454, @@ -26550,22 +27401,22 @@ static const unsigned int code_hash[] = { 0, 0, 0, 0, 0, 843, 0, 71099, 0, 0, 41935, 0, 0, 0, 0, 1371, 0, 43818, 43159, 8069, 9579, 41938, 41608, 0, 92444, 6242, 0, 0, 128595, 128244, 0, 92499, 8805, 1742, 113722, 0, 8202, 72399, 0, 983197, 0, 0, 73882, - 100809, 0, 43467, 123636, 55290, 0, 1712, 5932, 0, 41762, 129389, 0, + 100809, 0, 43467, 123636, 55290, 0, 1712, 5932, 0, 41762, 71982, 0, 11967, 1775, 0, 75009, 0, 120398, 120387, 9458, 0, 126614, 0, 0, 43176, 101032, 101031, 42782, 101033, 101036, 101035, 101038, 101037, 101040, 101039, 0, 0, 0, 0, 101041, 5794, 92274, 2662, 101045, 101044, 8254, 101046, 10975, 101048, 120625, 101050, 917977, 4108, 8478, 917982, 194790, 0, 92263, 917980, 7507, 0, 43149, 0, 65031, 7961, 1636, 0, 65029, 0, 129665, 70188, 9674, 0, 99, 98, 97, 101022, 92203, 4049, 101027, - 101026, 7090, 101028, 0, 101030, 66589, 0, 65310, 66593, 66599, 0, 0, 0, - 7447, 66594, 0, 0, 0, 73920, 66595, 66596, 42570, 5593, 0, 0, 0, 0, 6061, - 64854, 119, 118, 117, 116, 0, 122, 121, 120, 111, 110, 109, 108, 115, - 114, 113, 112, 103, 102, 101, 100, 107, 106, 105, 104, 128504, 73974, - 534, 0, 67713, 1536, 73973, 73970, 0, 0, 0, 6020, 12716, 0, 12744, 65143, - 0, 13266, 127813, 0, 0, 0, 127116, 0, 1212, 65560, 0, 8134, 42935, 12129, - 73870, 0, 1866, 0, 0, 0, 0, 65073, 12059, 66585, 121391, 0, 0, 0, 5935, - 1250, 0, 8174, 9787, 6733, 9859, 9858, 9861, 9860, 101012, 1882, 1892, - 6731, 10882, 10795, 101018, 73911, 101020, 101019, 41169, 8939, 0, + 43880, 7090, 101028, 0, 101030, 66589, 0, 65310, 66593, 66599, 129805, 0, + 0, 7447, 66594, 0, 0, 0, 73920, 66595, 66596, 42570, 5593, 0, 0, 0, 0, + 6061, 64854, 119, 118, 117, 116, 0, 122, 121, 120, 111, 110, 109, 108, + 115, 114, 113, 112, 103, 102, 101, 100, 107, 106, 105, 104, 128504, + 73974, 534, 0, 67713, 1536, 73973, 73970, 0, 0, 0, 6020, 12716, 0, 12744, + 65143, 0, 13266, 127813, 0, 0, 0, 127116, 0, 1212, 65560, 0, 8134, 42935, + 12129, 73870, 0, 1866, 0, 0, 0, 0, 65073, 12059, 66585, 121391, 0, 0, 0, + 5935, 1250, 0, 8174, 9787, 6733, 9859, 9858, 9861, 9860, 101012, 1882, + 1892, 6731, 10882, 10795, 101018, 73911, 101020, 101019, 41169, 8939, 0, 120713, 41170, 1454, 0, 65130, 69732, 0, 0, 129611, 41172, 7855, 0, 71472, 0, 0, 0, 71691, 65901, 0, 0, 645, 100992, 100991, 100994, 100993, 100996, 100995, 100998, 65587, 0, 10688, 0, 0, 7729, 0, 101001, 120518, @@ -26604,22 +27455,22 @@ static const unsigned int code_hash[] = { 41296, 11747, 41291, 0, 0, 0, 41294, 41282, 5923, 120610, 0, 0, 0, 0, 66800, 5786, 68252, 42539, 119869, 119860, 0, 41474, 0, 0, 0, 5934, 74572, 66583, 119231, 0, 94072, 64481, 0, 0, 0, 0, 67240, 0, 0, 123201, - 0, 5819, 0, 0, 0, 0, 0, 129387, 0, 0, 0, 67993, 1237, 0, 0, 0, 983557, 0, - 0, 0, 0, 0, 0, 0, 69789, 11266, 69845, 0, 10506, 194747, 0, 0, 0, 0, - 43185, 0, 100533, 100532, 100535, 10769, 100537, 100536, 100539, 9753, - 121035, 100540, 0, 0, 121433, 0, 100542, 6072, 100544, 100543, 100546, - 100545, 100548, 100547, 100550, 100549, 0, 113744, 0, 0, 7222, 10283, - 10315, 10379, 4996, 0, 129294, 66517, 0, 10087, 127833, 74938, 0, 0, - 83492, 7565, 42890, 0, 77931, 43180, 77928, 74891, 77929, 43982, 100526, - 622, 77926, 100527, 100530, 1602, 0, 0, 0, 129559, 12160, 0, 10212, - 77936, 194605, 12071, 43143, 77935, 917983, 917984, 917989, 77932, - 917987, 917988, 10255, 10263, 10279, 4194, 10375, 93035, 0, 0, 12644, - 127516, 917994, 75007, 110791, 67408, 110789, 11501, 41177, 0, 0, 71912, - 0, 0, 8715, 0, 41179, 0, 0, 0, 41176, 0, 41181, 0, 8452, 121006, 13161, - 0, 70503, 5921, 0, 2597, 0, 5922, 72128, 0, 74242, 0, 0, 0, 0, 0, 0, 0, - 0, 127906, 0, 64944, 0, 0, 0, 0, 5924, 5920, 129508, 6921, 78081, 74007, - 78078, 8418, 11681, 43169, 10176, 0, 0, 0, 78087, 10772, 65276, 5937, - 1914, 78084, 11682, 0, 0, 0, 11685, 0, 100513, 7772, 11680, 100514, + 0, 5819, 0, 0, 0, 0, 0, 129387, 0, 0, 0, 67993, 1237, 194749, 0, 0, + 983557, 0, 0, 0, 0, 0, 0, 0, 69789, 11266, 69845, 0, 10506, 194747, 0, 0, + 0, 0, 43185, 194748, 100533, 100532, 100535, 10769, 100537, 100536, + 100539, 9753, 121035, 100540, 0, 0, 121433, 0, 100542, 6072, 100544, + 100543, 100546, 100545, 100548, 100547, 100550, 100549, 0, 113744, 0, 0, + 7222, 10283, 10315, 10379, 4996, 0, 129294, 66517, 0, 10087, 127833, + 74938, 0, 0, 83492, 7565, 42890, 0, 77931, 43180, 77928, 74891, 77929, + 43982, 100526, 622, 77926, 100527, 100530, 1602, 0, 0, 0, 129559, 12160, + 0, 10212, 77936, 194605, 12071, 43143, 77935, 917983, 917984, 917989, + 77932, 917987, 917988, 10255, 10263, 10279, 4194, 10375, 93035, 0, 0, + 12644, 127516, 917994, 75007, 110791, 67408, 110789, 11501, 41177, 0, 0, + 71912, 0, 0, 8715, 0, 41179, 0, 0, 0, 41176, 0, 41181, 0, 8452, 121006, + 13161, 0, 70503, 5921, 0, 2597, 0, 5922, 72128, 0, 74242, 0, 0, 0, 0, 0, + 0, 0, 0, 127906, 0, 64944, 0, 0, 0, 0, 5924, 5920, 129508, 6921, 78081, + 74007, 78078, 8418, 11681, 43169, 10176, 0, 0, 0, 78087, 10772, 65276, + 5937, 1914, 78084, 11682, 0, 0, 0, 11685, 0, 100513, 7772, 11680, 100514, 100517, 100516, 100519, 7417, 718, 100520, 70083, 100500, 120718, 3235, 0, 43164, 0, 8018, 0, 0, 128708, 6937, 67672, 128508, 0, 10067, 120849, 0, 0, 0, 0, 0, 100491, 0, 100493, 100492, 13116, 100494, 100497, 9945, @@ -26629,56 +27480,57 @@ static const unsigned int code_hash[] = { 78102, 71226, 10141, 0, 78280, 65298, 4476, 78109, 94005, 71216, 8907, 78105, 78106, 78103, 78104, 120898, 0, 10665, 64616, 128944, 0, 127545, 69605, 83159, 83160, 4554, 0, 83155, 83156, 83157, 83158, 0, 125123, 0, - 72258, 0, 0, 0, 0, 43179, 0, 0, 0, 717, 10754, 83168, 83169, 83162, - 83163, 83164, 83165, 78282, 0, 0, 83161, 68848, 10611, 72859, 126978, - 71474, 129426, 127871, 0, 0, 0, 12820, 0, 0, 7009, 70103, 0, 0, 67848, - 41173, 4574, 0, 0, 128338, 575, 78110, 43456, 8563, 100469, 0, 0, 65565, - 0, 5936, 7290, 78117, 78118, 74919, 308, 78113, 78114, 83151, 78123, - 83153, 83154, 0, 0, 0, 0, 78132, 5926, 68250, 78130, 78126, 78127, 78124, - 78125, 42513, 0, 0, 0, 11651, 13093, 78135, 0, 100471, 0, 100473, 100472, - 100475, 74048, 100477, 74783, 100457, 100456, 43703, 13097, 0, 100460, - 13283, 0, 0, 125073, 3488, 5933, 10033, 0, 0, 65570, 0, 12297, 0, 0, 0, - 128517, 42538, 0, 129293, 0, 100451, 0, 100453, 100452, 100455, 100454, - 121221, 0, 0, 7638, 0, 129193, 0, 43109, 7637, 0, 11213, 100461, 83355, - 100463, 100466, 100465, 0, 0, 7636, 0, 0, 0, 128848, 983087, 291, 0, 0, - 2027, 78141, 78142, 78136, 78137, 83481, 4640, 64713, 10224, 120429, - 11183, 83482, 120430, 0, 0, 0, 127148, 83479, 0, 0, 83488, 0, 0, 0, 0, - 68837, 5778, 0, 0, 0, 12680, 119130, 0, 67242, 93041, 0, 0, 0, 11552, 0, - 127855, 0, 70091, 0, 10172, 65453, 120408, 66014, 120410, 0, 4641, 11556, - 64819, 78269, 120416, 72341, 41469, 41467, 120412, 120415, 4646, 120425, - 865, 78275, 78274, 78273, 4645, 78271, 78270, 0, 983172, 7338, 0, 68840, - 0, 12565, 0, 0, 0, 195089, 119655, 195091, 195090, 2913, 13120, 128956, - 195094, 195097, 195096, 128019, 0, 71462, 0, 7916, 10485, 195098, 0, - 195100, 195099, 0, 67705, 195078, 195077, 195080, 129636, 129549, 195081, - 0, 0, 0, 10229, 10687, 826, 128081, 195082, 195085, 195084, 195087, - 195086, 0, 1808, 7848, 0, 0, 0, 0, 0, 0, 128897, 0, 42942, 67704, 0, 0, - 0, 0, 42940, 0, 9144, 0, 0, 92992, 9840, 0, 0, 0, 0, 0, 0, 74448, 83475, - 0, 10962, 66904, 113718, 983187, 0, 0, 74537, 195072, 1792, 195074, - 195073, 78266, 195075, 0, 0, 12066, 0, 385, 4152, 0, 0, 0, 67397, 0, 0, - 0, 0, 43258, 0, 0, 13157, 0, 0, 3570, 0, 0, 0, 67252, 0, 71218, 126631, - 7879, 68247, 128579, 0, 0, 70196, 0, 0, 8463, 7810, 917862, 7839, 983859, - 127768, 917860, 9691, 0, 129323, 0, 120385, 0, 917844, 0, 10066, 0, 0, 0, - 0, 0, 8016, 0, 983072, 64831, 0, 126103, 0, 119171, 1634, 68115, 0, - 11056, 0, 0, 0, 41165, 11328, 12450, 0, 41166, 0, 12456, 0, 171, 0, - 12452, 917544, 12458, 12531, 0, 917853, 0, 74162, 0, 0, 9969, 0, 12454, - 74160, 42132, 110755, 78878, 110753, 3230, 73711, 0, 0, 8932, 4399, 5810, - 64534, 8415, 0, 110756, 110757, 74159, 0, 0, 960, 74156, 6981, 92374, - 12938, 9201, 0, 983658, 74904, 0, 72866, 92270, 0, 0, 0, 0, 5851, 73833, - 5824, 0, 5844, 110848, 110849, 110846, 110847, 4663, 0, 0, 0, 0, 0, - 74085, 0, 0, 0, 0, 0, 92339, 0, 0, 5782, 0, 0, 0, 43796, 129639, 0, 0, - 125223, 128004, 0, 43861, 0, 0, 0, 92976, 0, 0, 0, 4659, 0, 0, 0, 0, - 129386, 0, 11129, 0, 329, 0, 92707, 121416, 0, 0, 0, 69943, 67692, 42167, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69618, 43671, 0, 64701, 0, 0, 0, 93055, - 1172, 125089, 6786, 43601, 0, 74126, 0, 0, 0, 0, 0, 0, 0, 0, 118804, 0, - 66741, 5347, 0, 983644, 0, 0, 10588, 0, 0, 0, 0, 5343, 0, 0, 0, 5341, 0, - 0, 74916, 5351, 0, 0, 917884, 0, 92692, 0, 121148, 128916, 0, 0, 66785, - 126256, 6638, 0, 0, 271, 0, 917904, 0, 0, 12653, 67588, 0, 0, 0, 0, - 128838, 11912, 128301, 983646, 0, 11800, 0, 0, 11103, 0, 7340, 0, 110695, - 0, 0, 0, 0, 2423, 0, 0, 0, 128136, 42705, 0, 0, 0, 11854, 0, 0, 0, 0, - 4916, 0, 380, 10958, 66563, 127790, 78284, 67587, 0, 12918, 0, 917897, 0, - 917898, 917893, 10684, 0, 125063, 92906, 0, 0, 8182, 0, 0, 0, 0, 0, 0, - 92904, 0, 6630, 100405, 0, 123191, 0, 0, 0, 65876, 5535, 0, 0, 0, 92609, - 0, 0, 6477, 43795, 92217, 129571, 72163, 0, 43848, 0, 0, 74256, 2665, + 72258, 129831, 0, 129815, 0, 43179, 0, 0, 0, 717, 10754, 83168, 83169, + 83162, 83163, 83164, 83165, 78282, 0, 0, 83161, 68848, 10611, 72859, + 126978, 71474, 129426, 127871, 0, 0, 0, 12820, 0, 0, 7009, 70103, 0, 0, + 67848, 41173, 4574, 0, 0, 128338, 575, 78110, 43456, 8563, 100469, 0, 0, + 65565, 0, 5936, 7290, 78117, 78118, 74919, 308, 78113, 78114, 83151, + 78123, 83153, 83154, 0, 0, 0, 0, 78132, 5926, 68250, 78130, 78126, 78127, + 78124, 78125, 42513, 0, 129026, 0, 11651, 13093, 78135, 0, 100471, 0, + 100473, 100472, 100475, 74048, 100477, 71995, 100457, 100456, 43703, + 13097, 0, 100460, 13283, 0, 0, 125073, 3488, 5933, 10033, 0, 0, 65570, 0, + 12297, 0, 0, 0, 128517, 42538, 0, 129293, 0, 100451, 0, 100453, 100452, + 100455, 100454, 121221, 0, 0, 7638, 0, 129193, 0, 43109, 7637, 0, 11213, + 100461, 83355, 100463, 100466, 100465, 0, 0, 7636, 0, 0, 0, 128848, + 983087, 291, 0, 0, 2027, 78141, 78142, 78136, 78137, 83481, 4640, 64713, + 10224, 120429, 11183, 83482, 120430, 0, 0, 0, 127148, 83479, 0, 0, 83488, + 0, 0, 0, 0, 68837, 5778, 0, 0, 0, 12680, 119130, 0, 67242, 93041, 0, 0, + 0, 11552, 0, 127855, 0, 70091, 0, 10172, 65453, 120408, 66014, 120410, 0, + 4641, 11556, 64819, 78269, 120416, 72341, 41469, 41467, 120412, 120415, + 4646, 120425, 865, 78275, 78274, 78273, 4645, 78271, 78270, 0, 983172, + 7338, 0, 68840, 0, 12565, 0, 0, 0, 195089, 119655, 195091, 195090, 2913, + 13120, 128956, 195094, 195097, 195096, 128019, 0, 71462, 0, 7916, 10485, + 195098, 0, 195100, 195099, 0, 67705, 128351, 195077, 195080, 129636, + 129549, 195081, 0, 0, 0, 10229, 10687, 826, 128081, 195082, 195085, + 195084, 195087, 195086, 0, 1808, 7848, 0, 0, 0, 0, 0, 0, 128897, 69255, + 42942, 67704, 0, 0, 0, 0, 42940, 0, 9144, 0, 0, 92992, 9840, 0, 0, 0, 0, + 0, 0, 74448, 83475, 0, 10962, 66904, 113718, 983187, 0, 0, 74537, 195072, + 1792, 195074, 195073, 78266, 195075, 0, 0, 12066, 0, 385, 4152, 0, 0, 0, + 67397, 0, 0, 0, 0, 43258, 0, 0, 13157, 0, 0, 3570, 0, 0, 0, 67252, 0, + 71218, 126631, 7879, 68247, 128579, 0, 0, 70196, 0, 0, 8463, 7810, + 917862, 7839, 983859, 127768, 917860, 9691, 0, 129323, 0, 120385, 0, + 917844, 0, 10066, 0, 983855, 0, 0, 0, 8016, 0, 983072, 64831, 0, 126103, + 0, 119171, 1634, 68115, 94192, 11056, 0, 0, 0, 41165, 11328, 12450, 0, + 41166, 0, 12456, 0, 171, 0, 12452, 917544, 12458, 12531, 0, 917853, 0, + 74162, 0, 0, 9969, 0, 12454, 74160, 42132, 110755, 78878, 110753, 3230, + 73711, 0, 0, 8932, 4399, 5810, 64534, 8415, 0, 110756, 110757, 74159, 0, + 0, 960, 74156, 6981, 92374, 12938, 9201, 0, 983658, 74904, 0, 72866, + 92270, 0, 0, 0, 129792, 5851, 73833, 5824, 0, 5844, 110848, 110849, + 110846, 110847, 4663, 0, 0, 0, 0, 0, 74085, 0, 0, 0, 0, 0, 92339, 0, 0, + 5782, 0, 0, 0, 43796, 129639, 0, 195083, 125223, 128004, 0, 43861, 0, 0, + 0, 92976, 0, 0, 0, 4659, 0, 0, 0, 0, 129386, 0, 11129, 2238, 329, 0, + 92707, 121416, 0, 0, 0, 69943, 67692, 42167, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 69618, 43671, 0, 64701, 0, 0, 0, 93055, 1172, 125089, 6786, 43601, + 0, 74126, 0, 0, 0, 0, 0, 0, 0, 0, 118804, 0, 66741, 5347, 0, 983644, 0, + 0, 10588, 0, 0, 0, 0, 5343, 0, 0, 0, 5341, 0, 0, 74916, 5351, 0, 0, + 917884, 0, 92692, 0, 121148, 128916, 0, 0, 66785, 126256, 6638, 0, 0, + 271, 0, 917904, 0, 0, 12653, 67588, 0, 0, 0, 0, 128838, 11912, 128301, + 983646, 0, 11800, 0, 0, 11103, 0, 7340, 0, 110695, 0, 0, 0, 0, 2423, 0, + 0, 0, 128136, 42705, 0, 0, 0, 11854, 0, 0, 0, 0, 4916, 0, 380, 10958, + 66563, 127790, 78284, 67587, 0, 12918, 0, 917897, 0, 917898, 917893, + 10684, 0, 125063, 92906, 0, 0, 8182, 0, 0, 129434, 0, 0, 0, 92904, 0, + 6630, 100405, 0, 123191, 0, 0, 0, 65876, 5535, 129892, 0, 0, 92609, 0, + 983343, 6477, 43795, 92217, 129571, 72163, 0, 43848, 0, 0, 74256, 2665, 11304, 43751, 0, 4970, 74353, 0, 8934, 0, 93996, 4492, 92908, 65011, 0, 0, 92909, 1188, 7254, 1100, 0, 0, 0, 2912, 11749, 92643, 0, 0, 65057, 0, 12343, 0, 78879, 0, 78880, 0, 0, 0, 70355, 0, 0, 11803, 0, 0, 41450, 0, @@ -26700,7 +27552,7 @@ static const unsigned int code_hash[] = { 0, 5622, 120436, 8477, 8474, 120433, 120432, 0, 0, 0, 41435, 4352, 0, 2435, 0, 5621, 0, 4201, 8450, 4203, 4202, 4205, 4204, 120447, 120446, 120445, 66792, 41440, 120442, 8473, 6373, 8469, 120438, 0, 4564, 125206, - 0, 0, 0, 8374, 73669, 0, 0, 66796, 0, 0, 0, 0, 0, 92885, 0, 5626, 43507, + 0, 0, 0, 8374, 73669, 0, 0, 66796, 0, 0, 0, 0, 0, 69297, 0, 5626, 43507, 11771, 0, 0, 0, 42614, 0, 5625, 0, 0, 0, 5623, 0, 0, 42623, 64277, 69942, 0, 0, 120752, 0, 5817, 5629, 0, 7551, 10325, 5632, 69674, 0, 0, 124946, 125194, 5628, 0, 5631, 0, 0, 2400, 5627, 0, 0, 118786, 74792, 0, 0, 0, @@ -26712,9 +27564,9 @@ static const unsigned int code_hash[] = { 69432, 0, 9568, 71318, 456, 0, 10437, 1168, 9251, 9082, 0, 0, 42781, 3866, 0, 41512, 0, 0, 68121, 41494, 0, 4660, 0, 10405, 0, 0, 0, 0, 0, 73918, 119627, 110686, 41454, 12605, 0, 126611, 41455, 917996, 983605, 0, - 8214, 0, 100413, 0, 41457, 0, 0, 1969, 127771, 0, 0, 7413, 0, 69426, - 10341, 43864, 78079, 5854, 0, 0, 0, 0, 72819, 0, 0, 0, 0, 0, 8429, 0, - 72328, 0, 6429, 0, 0, 0, 0, 110688, 83417, 0, 917864, 120813, 83423, + 8214, 0, 100413, 0, 41457, 0, 0, 1969, 127771, 0, 69554, 7413, 0, 69426, + 10341, 43864, 78079, 5854, 0, 0, 0, 129684, 72819, 0, 0, 0, 0, 0, 8429, + 0, 72328, 0, 6429, 0, 0, 0, 0, 110688, 83417, 0, 917864, 120813, 83423, 1662, 129588, 0, 0, 917871, 917868, 0, 0, 66, 65, 68, 67, 70, 69, 72, 71, 74, 73, 76, 75, 78, 77, 80, 79, 82, 81, 84, 83, 86, 85, 88, 87, 90, 89, 0, 0, 7385, 70508, 1704, 12993, 0, 0, 0, 0, 0, 0, 0, 0, 11353, 72207, 0, @@ -26730,192 +27582,194 @@ static const unsigned int code_hash[] = { 0, 0, 0, 72307, 43474, 0, 121190, 0, 0, 3420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110871, 9574, 120684, 110870, 0, 5204, 74774, 0, 11835, 0, 0, 983185, 0, 0, 0, 0, 0, 0, 11750, 68898, 127004, 0, 0, 0, 0, 8130, 0, 0, 0, 121268, - 0, 0, 0, 68455, 42863, 73839, 0, 0, 0, 0, 0, 0, 0, 612, 110875, 110876, - 72231, 10538, 0, 1674, 0, 0, 0, 12280, 0, 540, 74550, 0, 66422, 8432, 0, - 11073, 0, 64316, 0, 0, 7388, 0, 0, 0, 0, 126107, 0, 3359, 0, 0, 67284, 0, - 0, 65482, 129589, 0, 64742, 129304, 0, 0, 74273, 0, 19941, 0, 0, 0, 0, - 9481, 65555, 0, 66628, 129126, 1195, 64898, 0, 0, 0, 2010, 0, 0, 0, 0, 0, - 0, 4360, 127009, 9739, 0, 72885, 0, 0, 0, 126265, 72200, 0, 0, 0, 72199, - 0, 0, 65734, 0, 0, 0, 13075, 0, 94063, 0, 43532, 10837, 2492, 74516, - 983075, 120882, 0, 0, 11813, 9649, 0, 119617, 5128, 7377, 0, 65604, 0, 0, - 6771, 1648, 7819, 0, 0, 0, 125192, 128131, 12709, 6986, 0, 0, 0, 0, 0, - 12581, 0, 5175, 0, 73806, 0, 128420, 0, 0, 77950, 0, 0, 607, 0, 0, - 128846, 119605, 0, 129528, 65477, 0, 121130, 0, 8265, 0, 0, 0, 5840, - 42838, 0, 0, 68366, 0, 119255, 0, 0, 0, 127929, 0, 2550, 121011, 6779, - 70059, 0, 0, 0, 0, 0, 0, 5619, 65822, 0, 0, 0, 129392, 5616, 11486, 0, 0, - 0, 0, 5615, 0, 121319, 42380, 127958, 0, 66451, 74407, 0, 11347, 0, 1026, - 5620, 0, 0, 11350, 5617, 0, 0, 64639, 0, 0, 0, 1338, 0, 0, 0, 4603, 0, - 70715, 92484, 0, 9002, 0, 3974, 78213, 0, 0, 0, 0, 0, 0, 75038, 66040, - 70455, 0, 0, 0, 72982, 0, 0, 0, 0, 0, 0, 0, 0, 119105, 0, 0, 0, 0, 0, - 128883, 0, 66897, 0, 0, 0, 42594, 0, 0, 0, 0, 6714, 10083, 0, 121019, 0, - 69976, 0, 0, 9073, 0, 64302, 0, 128286, 9725, 0, 0, 121288, 73769, - 121306, 0, 9570, 0, 11500, 2689, 917626, 0, 983794, 66740, 0, 0, 0, - 917623, 13286, 5500, 42598, 42596, 503, 0, 0, 917618, 0, 0, 0, 0, 917615, - 1652, 772, 6688, 8310, 0, 0, 72124, 0, 10194, 43542, 0, 125054, 0, 6468, - 68110, 0, 917606, 11767, 0, 0, 5836, 12358, 0, 0, 65624, 12180, 0, - 127994, 0, 43699, 0, 0, 72114, 43706, 0, 12362, 12435, 12360, 0, 9020, 0, - 12356, 8616, 0, 42924, 2227, 0, 0, 7315, 12354, 83097, 83098, 83099, - 2358, 83092, 83093, 83094, 0, 0, 83089, 83090, 0, 11759, 71723, 0, 72834, - 83109, 41423, 0, 83103, 83104, 83105, 42237, 110653, 70717, 72260, 83102, - 0, 67856, 0, 128534, 110657, 129354, 129194, 0, 64395, 0, 73008, 120897, - 74816, 0, 0, 0, 83088, 0, 0, 94064, 83083, 83085, 83086, 83087, 83079, - 83080, 2041, 9178, 0, 64870, 0, 83076, 74924, 0, 0, 0, 0, 0, 78739, 0, 0, - 0, 0, 0, 0, 3726, 0, 0, 0, 0, 0, 121432, 129457, 0, 0, 0, 0, 0, 74901, 0, - 0, 0, 0, 0, 124944, 113781, 0, 7410, 2669, 903, 0, 0, 0, 127232, 74603, - 0, 128264, 0, 128411, 0, 0, 11732, 0, 72797, 41448, 41461, 124934, 0, - 917558, 0, 8819, 0, 0, 74606, 0, 121412, 74835, 0, 9168, 65786, 0, 73691, - 0, 67665, 0, 11758, 68425, 0, 0, 0, 128044, 0, 19924, 67312, 0, 128755, - 64551, 0, 8516, 0, 0, 7561, 983980, 74018, 0, 0, 0, 0, 83074, 83075, 0, - 11233, 83062, 83066, 3787, 83070, 83055, 41458, 83059, 41463, 65308, - 41459, 8683, 775, 0, 65584, 69923, 0, 110798, 110799, 110796, 43440, 0, - 0, 0, 3656, 0, 0, 0, 67694, 1599, 83138, 83139, 8514, 8513, 83036, 83135, - 83136, 110794, 110795, 83131, 83132, 0, 0, 0, 11684, 10542, 9937, 83150, - 0, 75037, 83145, 65730, 83147, 0, 8427, 83142, 55246, 0, 0, 11497, 0, 0, - 0, 119222, 0, 983598, 0, 10621, 0, 0, 129295, 119111, 120745, 0, 0, 0, - 11648, 83126, 83127, 42118, 83129, 83122, 65512, 83124, 83125, 0, 0, 0, - 83121, 74530, 128456, 0, 0, 0, 65724, 0, 0, 0, 65727, 0, 0, 64963, 73830, - 66042, 0, 0, 7875, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, 0, 65173, 129122, 0, - 70331, 0, 0, 0, 0, 129419, 0, 0, 0, 1687, 0, 0, 0, 0, 0, 0, 10526, 0, - 8323, 0, 83301, 11731, 0, 0, 65460, 12242, 0, 0, 10843, 11554, 0, 0, - 8266, 0, 121101, 0, 0, 0, 0, 67667, 0, 119155, 0, 0, 119636, 67857, 0, 0, - 0, 11755, 66305, 0, 0, 10917, 93979, 113688, 0, 2040, 92596, 0, 0, 0, 0, - 1227, 83119, 83120, 0, 0, 83115, 83116, 11149, 4978, 83111, 1984, 11830, - 83114, 128934, 74548, 0, 9373, 0, 0, 0, 0, 0, 0, 0, 0, 9237, 9390, 0, 0, - 0, 0, 0, 1830, 0, 0, 0, 0, 0, 128577, 983820, 68086, 0, 0, 0, 983059, 0, - 983144, 0, 0, 0, 72197, 55291, 11683, 0, 0, 0, 11451, 0, 72714, 3731, - 2359, 0, 67844, 0, 121503, 548, 121502, 983245, 121405, 983248, 0, 66272, - 0, 64678, 0, 9547, 0, 0, 1614, 0, 0, 66307, 128092, 1358, 120871, 428, 0, - 1466, 0, 10982, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, 5804, 73464, 0, 0, 0, - 70167, 9057, 42446, 0, 125097, 0, 0, 8250, 10952, 8048, 0, 129155, 0, - 118955, 0, 0, 126586, 4407, 74648, 0, 0, 0, 8448, 92491, 0, 0, 12675, - 12659, 0, 0, 983280, 68077, 55273, 10766, 12012, 2386, 0, 9170, 0, 9123, - 128194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8709, 0, 983585, 0, 0, 0, 0, 0, - 0, 0, 128342, 0, 577, 128610, 0, 0, 124999, 68087, 74840, 126474, 127036, - 0, 0, 0, 1414, 124963, 9683, 43486, 92231, 0, 2536, 0, 66330, 0, 0, 0, 0, - 0, 0, 0, 66317, 0, 66315, 66316, 0, 0, 0, 0, 0, 0, 0, 0, 66323, 66324, 0, - 0, 3106, 65917, 0, 0, 0, 891, 0, 0, 42624, 0, 0, 8824, 65089, 0, 10936, - 0, 0, 0, 0, 92688, 0, 0, 0, 0, 12745, 0, 0, 41285, 3547, 0, 0, 0, 0, 0, - 6089, 0, 68490, 120578, 4170, 1029, 127761, 0, 0, 42374, 0, 744, 917624, - 0, 0, 0, 93046, 0, 3551, 0, 0, 4623, 0, 0, 12340, 0, 65136, 0, 0, 0, 0, - 0, 0, 0, 72291, 0, 0, 120778, 0, 11972, 0, 78757, 0, 122886, 177, 122894, - 0, 0, 0, 0, 55243, 0, 0, 0, 70172, 120249, 120242, 128027, 120243, 0, 0, - 0, 120237, 120245, 94079, 0, 0, 9136, 120240, 120614, 41280, 0, 0, 0, 0, - 74149, 128327, 0, 0, 66361, 12601, 72194, 64360, 65163, 0, 0, 0, 0, 0, 0, - 5404, 43332, 3667, 7936, 12925, 0, 0, 0, 0, 0, 10874, 65505, 0, 0, 0, 0, - 128920, 983662, 0, 0, 0, 0, 0, 0, 0, 0, 66677, 0, 0, 0, 70088, 74148, 0, - 0, 72868, 120230, 120224, 74172, 0, 0, 94096, 0, 128414, 120636, 0, - 127519, 917609, 917616, 0, 128652, 0, 0, 11441, 0, 3512, 0, 0, 43597, 0, - 0, 72734, 68153, 41563, 0, 0, 129352, 41544, 0, 0, 0, 0, 129177, 0, 0, 0, - 118908, 0, 78108, 67396, 73804, 64711, 0, 0, 917610, 0, 0, 0, 11557, - 127776, 0, 12079, 0, 0, 0, 0, 128861, 0, 0, 0, 0, 0, 983200, 8103, 72303, - 128174, 92486, 110698, 0, 64587, 0, 0, 124961, 0, 0, 0, 126481, 0, 0, 0, - 0, 0, 70348, 1450, 0, 1340, 0, 0, 128970, 0, 0, 125117, 0, 0, 0, 0, 6539, - 92948, 0, 128213, 125060, 0, 0, 0, 3973, 0, 70504, 121193, 7982, 0, 0, - 127194, 0, 0, 0, 128408, 118968, 6417, 120619, 0, 0, 0, 0, 129455, 4919, - 65121, 110872, 7755, 0, 0, 64548, 0, 1621, 0, 0, 0, 0, 0, 12188, 0, 0, 0, - 0, 5015, 0, 0, 42590, 70354, 1756, 0, 0, 0, 120694, 0, 0, 7555, 73874, - 5408, 2817, 1214, 69919, 0, 983125, 0, 0, 125055, 127195, 7957, 0, 0, - 1056, 74944, 0, 0, 0, 0, 7073, 74979, 0, 70853, 0, 110874, 0, 0, 2341, - 126644, 8484, 0, 0, 68322, 0, 8461, 67721, 42269, 0, 0, 43709, 43708, - 9451, 7571, 13073, 43847, 126647, 0, 983258, 0, 0, 0, 8781, 12894, 78134, - 0, 92288, 0, 0, 78184, 0, 11338, 120768, 0, 0, 0, 0, 0, 121367, 65021, - 64795, 74574, 0, 10047, 0, 0, 0, 0, 0, 0, 119181, 163, 576, 9895, 0, 0, - 74591, 0, 0, 66888, 0, 0, 0, 0, 0, 0, 7017, 128111, 0, 0, 0, 0, 41591, + 0, 129443, 0, 68455, 42863, 73839, 0, 0, 0, 0, 0, 0, 0, 612, 110875, + 110876, 72231, 10538, 0, 1674, 0, 0, 0, 12280, 0, 540, 74550, 0, 66422, + 8432, 0, 11073, 0, 64316, 129894, 0, 7388, 0, 0, 0, 0, 126107, 0, 3359, + 0, 0, 67284, 0, 0, 65482, 129589, 0, 64742, 129304, 0, 0, 74273, 0, + 19941, 0, 0, 0, 0, 9481, 65555, 0, 66628, 129126, 1195, 64898, 0, 0, 0, + 2010, 0, 0, 0, 0, 0, 0, 4360, 127009, 9739, 0, 72885, 0, 0, 0, 126265, + 72200, 0, 0, 0, 72199, 0, 0, 65734, 0, 0, 129690, 13075, 0, 94063, 0, + 43532, 10837, 2492, 74516, 983075, 120882, 0, 0, 11813, 9649, 0, 119617, + 5128, 7377, 0, 65604, 0, 0, 6771, 1648, 7819, 0, 0, 0, 125192, 128131, + 12709, 6986, 0, 0, 0, 0, 0, 12581, 0, 5175, 0, 73806, 0, 128420, 0, 0, + 77950, 0, 0, 607, 0, 0, 128846, 119605, 0, 129528, 65477, 0, 121130, 0, + 8265, 0, 0, 0, 5840, 42838, 0, 0, 68366, 0, 119255, 0, 0, 0, 127929, 0, + 2550, 121011, 6779, 70059, 0, 0, 0, 0, 0, 0, 5619, 65822, 0, 0, 0, + 129392, 5616, 11486, 0, 0, 0, 0, 5615, 0, 121319, 42380, 127958, 0, + 66451, 74407, 0, 11347, 0, 1026, 5620, 0, 0, 11350, 5617, 0, 0, 64639, 0, + 0, 0, 1338, 0, 0, 0, 4603, 0, 70715, 92484, 0, 9002, 0, 3974, 78213, 0, + 0, 0, 0, 0, 0, 75038, 66040, 70455, 0, 0, 0, 72982, 0, 0, 0, 0, 0, 0, 0, + 0, 119105, 0, 0, 0, 0, 0, 128883, 0, 66897, 0, 0, 0, 42594, 0, 0, 0, 0, + 6714, 10083, 0, 121019, 0, 69976, 0, 0, 9073, 0, 64302, 0, 128286, 9725, + 0, 0, 121288, 73769, 121306, 0, 9570, 0, 11500, 2689, 917626, 0, 983794, + 66740, 0, 0, 0, 917623, 13286, 5500, 42598, 42596, 503, 0, 0, 917618, 0, + 0, 0, 0, 917615, 1652, 772, 6688, 8310, 0, 0, 72124, 0, 10194, 43542, 0, + 125054, 0, 6468, 68110, 0, 917606, 11767, 0, 0, 5836, 12358, 0, 0, 65624, + 12180, 0, 127994, 0, 43699, 0, 0, 72114, 43706, 0, 12362, 12435, 12360, + 0, 9020, 0, 12356, 8616, 0, 42924, 2227, 0, 0, 7315, 12354, 83097, 83098, + 83099, 2358, 83092, 83093, 83094, 0, 0, 83089, 83090, 0, 11759, 71723, 0, + 72834, 83109, 41423, 0, 83103, 83104, 83105, 42237, 110653, 70717, 72260, + 83102, 0, 67856, 0, 128534, 110657, 129354, 129194, 0, 64395, 0, 73008, + 120897, 74816, 0, 0, 0, 83088, 0, 0, 94064, 83083, 83085, 83086, 83087, + 83079, 83080, 2041, 9178, 0, 64870, 0, 83076, 74924, 0, 0, 0, 0, 0, + 78739, 0, 0, 0, 0, 0, 0, 3726, 0, 0, 0, 0, 0, 121432, 129457, 0, 0, 0, 0, + 0, 74901, 0, 0, 0, 0, 0, 124944, 113781, 0, 7410, 2669, 903, 0, 0, 0, + 127232, 74603, 0, 128264, 0, 128411, 0, 0, 11732, 0, 72797, 41448, 41461, + 124934, 0, 917558, 0, 8819, 0, 0, 74606, 0, 121412, 74835, 0, 9168, + 65786, 0, 73691, 0, 67665, 0, 11758, 68425, 0, 0, 0, 128044, 0, 19924, + 67312, 0, 128755, 64551, 0, 8516, 0, 0, 7561, 983980, 74018, 0, 0, 0, 0, + 83074, 83075, 0, 11233, 83062, 83066, 3787, 83070, 83055, 41458, 83059, + 41463, 65308, 41459, 8683, 775, 0, 65584, 69923, 0, 110798, 110799, + 110796, 43440, 0, 0, 0, 3656, 0, 0, 0, 67694, 1599, 83138, 83139, 8514, + 8513, 83036, 83135, 83136, 110794, 110795, 83131, 83132, 0, 0, 0, 11684, + 10542, 9937, 83150, 0, 75037, 83145, 65730, 83147, 0, 8427, 83142, 55246, + 0, 0, 11497, 0, 0, 0, 119222, 0, 983598, 0, 10621, 0, 0, 129295, 119111, + 120745, 0, 0, 0, 11648, 83126, 83127, 42118, 83129, 83122, 65512, 83124, + 83125, 0, 0, 0, 83121, 74530, 128456, 0, 0, 0, 65724, 0, 0, 0, 65727, 0, + 0, 64963, 73830, 66042, 0, 0, 7875, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, 0, + 65173, 129122, 0, 70331, 0, 0, 0, 0, 129419, 0, 0, 0, 1687, 0, 0, 0, 0, + 0, 0, 10526, 0, 8323, 0, 83301, 11731, 0, 0, 65460, 12242, 0, 0, 10843, + 11554, 0, 0, 8266, 0, 121101, 0, 0, 0, 0, 67667, 0, 119155, 0, 0, 119636, + 67857, 0, 0, 0, 11755, 66305, 0, 0, 10917, 93979, 113688, 0, 2040, 92596, + 0, 0, 0, 0, 1227, 83119, 83120, 0, 0, 83115, 83116, 11149, 4978, 83111, + 1984, 11830, 83114, 128934, 74548, 0, 9373, 0, 0, 0, 0, 0, 0, 0, 0, 9237, + 9390, 0, 0, 0, 0, 0, 1830, 0, 0, 0, 0, 0, 128577, 983820, 68086, 0, 0, 0, + 983059, 0, 983144, 0, 0, 0, 72197, 55291, 11683, 0, 0, 0, 11451, 0, + 72714, 3731, 2359, 0, 67844, 0, 121503, 548, 121502, 983245, 121405, + 983248, 0, 66272, 0, 64678, 0, 9547, 0, 0, 1614, 0, 0, 66307, 128092, + 1358, 120871, 428, 0, 1466, 0, 10982, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, + 5804, 73464, 0, 0, 0, 70167, 9057, 42446, 0, 125097, 0, 0, 8250, 10952, + 8048, 0, 129155, 0, 118955, 0, 0, 126586, 4407, 74648, 0, 0, 0, 8448, + 92491, 0, 0, 12675, 12659, 0, 0, 983280, 68077, 55273, 10766, 12012, + 2386, 0, 9170, 0, 9123, 128194, 0, 0, 0, 0, 129942, 0, 0, 0, 0, 0, 0, + 8709, 0, 983581, 0, 0, 0, 0, 0, 0, 0, 128342, 0, 577, 128610, 0, 0, + 124999, 68087, 74840, 126474, 127036, 0, 0, 0, 1414, 124963, 9683, 43486, + 92231, 0, 2536, 0, 66330, 0, 0, 0, 0, 0, 0, 0, 66317, 0, 66315, 66316, 0, + 0, 0, 0, 0, 0, 0, 0, 66323, 66324, 0, 0, 3106, 65917, 0, 0, 0, 891, 0, 0, + 42624, 0, 0, 8824, 65089, 0, 10936, 0, 0, 0, 0, 92688, 0, 0, 0, 0, 12745, + 0, 0, 41285, 3547, 0, 0, 129877, 0, 0, 6089, 0, 68490, 120578, 4170, + 1029, 127761, 0, 0, 42374, 0, 744, 917624, 0, 0, 0, 93046, 0, 3551, 0, 0, + 4623, 0, 0, 12340, 0, 65136, 0, 0, 0, 0, 0, 0, 0, 72291, 0, 0, 120778, 0, + 11972, 0, 78757, 0, 122886, 177, 122894, 0, 0, 0, 0, 55243, 0, 0, 0, + 70172, 120249, 120242, 128027, 120243, 0, 0, 0, 120237, 120245, 94079, 0, + 0, 9136, 120240, 120614, 41280, 0, 0, 0, 0, 74149, 128327, 0, 0, 66361, + 12601, 72194, 64360, 65163, 0, 0, 0, 0, 0, 0, 5404, 43332, 3667, 7936, + 12925, 0, 0, 0, 0, 0, 10874, 65505, 0, 0, 0, 0, 128920, 983662, 0, 0, 0, + 0, 0, 0, 0, 0, 66677, 0, 0, 0, 70088, 74148, 0, 0, 72868, 120230, 120224, + 74172, 0, 0, 94096, 0, 128414, 120636, 0, 127519, 917609, 917616, 0, + 128652, 0, 0, 11441, 0, 3512, 0, 0, 43597, 0, 0, 72734, 68153, 41563, 0, + 0, 129352, 41544, 0, 0, 0, 0, 129177, 0, 0, 0, 118908, 0, 78108, 67396, + 73804, 64711, 0, 0, 917610, 0, 0, 0, 11557, 127776, 0, 12079, 0, 0, 0, 0, + 128861, 0, 0, 0, 0, 0, 983200, 8103, 72303, 128174, 92486, 110698, 0, + 64587, 0, 0, 124961, 0, 0, 0, 126481, 0, 0, 0, 0, 0, 70348, 1450, 0, + 1340, 0, 0, 128970, 0, 0, 125117, 0, 0, 0, 0, 6539, 92948, 0, 128213, + 125060, 0, 0, 0, 3973, 0, 70504, 121193, 7982, 0, 0, 127194, 0, 0, 0, + 128408, 118968, 6417, 120619, 129748, 0, 0, 0, 129455, 4919, 65121, + 110872, 7755, 0, 0, 64548, 0, 1621, 0, 0, 0, 0, 0, 12188, 0, 0, 0, 0, + 5015, 0, 0, 42590, 70354, 1756, 0, 0, 0, 120694, 0, 0, 7555, 73874, 5408, + 2817, 1214, 69919, 0, 983125, 0, 0, 125055, 127195, 7957, 0, 0, 1056, + 74944, 0, 0, 0, 0, 7073, 74979, 0, 70853, 0, 110874, 0, 0, 2341, 126644, + 8484, 0, 0, 68322, 0, 8461, 67721, 42269, 0, 0, 43709, 43708, 9451, 7571, + 13073, 43847, 126647, 0, 983258, 0, 0, 0, 8781, 12894, 78134, 0, 92288, + 0, 0, 78184, 0, 11338, 120768, 0, 0, 0, 0, 0, 121367, 65021, 64795, + 74574, 0, 10047, 0, 0, 0, 0, 0, 0, 119181, 163, 576, 9895, 0, 0, 74591, + 0, 0, 66888, 0, 0, 0, 0, 0, 0, 7017, 128111, 0, 0, 129922, 0, 41591, 11036, 65252, 120795, 129488, 0, 0, 0, 0, 0, 0, 8887, 0, 7295, 71203, 0, - 127221, 0, 0, 0, 0, 8755, 0, 0, 8147, 73127, 0, 0, 0, 0, 129377, 0, + 127221, 0, 0, 0, 0, 8755, 0, 0, 8147, 73127, 0, 0, 121348, 0, 129377, 0, 74499, 0, 0, 0, 4619, 0, 6654, 123192, 0, 0, 0, 65689, 10128, 0, 129612, 0, 0, 92651, 0, 2401, 0, 8792, 0, 0, 74980, 0, 92246, 0, 0, 0, 12886, 0, 66624, 0, 0, 74133, 65170, 0, 74135, 0, 0, 9984, 73867, 3010, 0, 70349, 10698, 41475, 0, 119151, 0, 119152, 0, 0, 9100, 0, 0, 0, 78116, 64780, 2001, 0, 55230, 0, 4052, 0, 7626, 78080, 0, 0, 0, 41477, 0, 0, 0, 43707, - 74127, 0, 0, 0, 78086, 73758, 2335, 10663, 0, 0, 0, 119602, 0, 0, 70325, - 0, 41443, 0, 0, 0, 9711, 1523, 0, 0, 41445, 0, 0, 8567, 41442, 12821, 0, - 0, 118978, 0, 65274, 0, 94082, 0, 127515, 0, 0, 43446, 0, 0, 0, 0, - 127985, 0, 10206, 127167, 6375, 2673, 0, 0, 0, 43219, 129355, 0, 0, 0, 0, - 0, 11799, 0, 68466, 0, 0, 0, 0, 0, 120736, 0, 7203, 0, 0, 70361, 129077, - 120615, 127216, 0, 0, 0, 0, 43121, 0, 128366, 72161, 0, 0, 0, 121260, - 73781, 70365, 0, 68039, 70446, 10057, 0, 0, 0, 127399, 120963, 0, 2307, - 0, 0, 0, 0, 73873, 0, 94035, 0, 0, 0, 0, 0, 7327, 0, 0, 440, 0, 0, 68613, - 75059, 0, 0, 9957, 0, 0, 8046, 0, 119158, 0, 0, 68609, 0, 129405, 1521, - 129460, 92256, 65344, 0, 11850, 68737, 0, 0, 68914, 7303, 65770, 5243, 0, - 5239, 65771, 121429, 0, 5237, 0, 68756, 0, 5247, 0, 0, 0, 12873, 5764, 0, - 0, 3008, 118981, 128102, 0, 0, 55231, 41103, 0, 92756, 0, 0, 92717, - 70074, 7872, 74886, 917567, 8731, 65378, 0, 0, 11316, 128163, 126600, - 70360, 3019, 9997, 0, 0, 9456, 129545, 0, 0, 129555, 0, 0, 92682, 4281, - 0, 0, 0, 118982, 0, 69993, 78096, 0, 78095, 0, 78098, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2134, 0, 10116, 9877, 70679, 0, 0, 92723, 8379, 0, 6778, 0, 0, - 8243, 0, 0, 0, 0, 128008, 0, 0, 0, 983630, 119668, 0, 92722, 983098, - 5637, 125115, 0, 0, 120479, 0, 113730, 0, 0, 194990, 64432, 0, 70363, - 121368, 1156, 68052, 0, 0, 120482, 0, 68030, 0, 0, 0, 7634, 0, 0, 65536, - 0, 0, 0, 7702, 0, 78890, 0, 65779, 65783, 195066, 120961, 5700, 0, 0, - 92161, 2339, 92476, 5697, 0, 0, 0, 74923, 0, 5696, 92677, 0, 3862, 0, 0, - 0, 983055, 0, 0, 0, 0, 5701, 9722, 41490, 41370, 5698, 0, 0, 0, 42204, - 55270, 8571, 0, 0, 43859, 0, 78731, 0, 12184, 0, 0, 0, 0, 0, 5650, 0, - 64712, 120474, 0, 120458, 5647, 120473, 7387, 0, 92675, 11477, 5646, 0, - 11018, 0, 0, 0, 0, 0, 0, 0, 128459, 126128, 5651, 0, 0, 0, 5648, 0, - 120920, 0, 127517, 3545, 0, 6984, 0, 0, 0, 69414, 126613, 0, 10123, 0, 0, - 0, 0, 65020, 74885, 119166, 0, 0, 0, 0, 0, 1140, 78426, 0, 0, 0, 0, 8128, - 9889, 0, 0, 1815, 0, 890, 0, 3267, 0, 0, 0, 0, 4410, 125081, 10576, 8102, - 0, 580, 74232, 0, 0, 0, 0, 0, 19938, 0, 0, 0, 0, 3298, 6546, 0, 0, 0, 0, - 6134, 41246, 0, 0, 0, 917770, 0, 6264, 0, 0, 0, 0, 0, 0, 69445, 0, 0, 0, - 92697, 11915, 10377, 0, 10072, 0, 0, 2329, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 125136, 0, 11201, 92708, 74769, 0, 13263, 0, 0, 92404, 126066, 73822, 0, - 0, 64917, 0, 0, 494, 128026, 0, 65098, 0, 956, 125265, 129556, 0, 73740, - 0, 0, 0, 74281, 128638, 0, 0, 69217, 120930, 0, 0, 0, 0, 0, 43088, 0, - 126269, 100948, 0, 65229, 0, 0, 0, 0, 0, 0, 3907, 118833, 64526, 11829, - 68197, 0, 0, 11475, 70329, 3020, 42264, 0, 0, 0, 7098, 0, 0, 127967, 957, - 42696, 0, 3016, 0, 0, 0, 0, 0, 121248, 92510, 3006, 4620, 0, 0, 0, 0, - 129369, 129425, 0, 0, 0, 126246, 8626, 0, 128824, 0, 65377, 0, 983102, - 42920, 1698, 0, 64477, 0, 0, 43813, 100432, 100431, 100434, 100433, - 100436, 70321, 100438, 100437, 100440, 100439, 0, 121024, 0, 70327, - 100441, 55252, 100443, 100442, 100445, 100444, 66641, 100446, 100449, - 100448, 0, 100450, 113820, 74866, 64375, 0, 127850, 129477, 0, 0, 0, 0, - 983780, 0, 0, 120827, 0, 0, 123637, 0, 0, 0, 0, 8110, 100421, 0, 100423, - 5830, 100425, 100424, 100427, 100426, 100429, 100428, 42389, 78611, - 121398, 0, 0, 0, 0, 0, 0, 0, 83342, 983935, 0, 127147, 119187, 2135, - 11836, 0, 0, 78869, 42313, 5579, 0, 70384, 983082, 94002, 0, 5578, 11840, - 73006, 42023, 69849, 5669, 92559, 0, 0, 68833, 917845, 128275, 5583, 0, - 0, 42426, 5580, 42276, 0, 892, 2220, 42465, 74313, 73440, 5795, 194991, - 68774, 65702, 68770, 0, 65695, 0, 65710, 128399, 0, 0, 68783, 0, 0, 0, - 1638, 10966, 0, 917547, 0, 0, 0, 0, 0, 8172, 0, 0, 0, 0, 0, 0, 6374, 0, - 0, 120972, 0, 0, 0, 0, 0, 0, 0, 72204, 64900, 7153, 65785, 68826, 0, - 3015, 68743, 68740, 68738, 68805, 6400, 68749, 68748, 68760, 68758, - 11276, 68754, 100420, 372, 128829, 68761, 118874, 0, 41585, 128202, 0, - 74228, 276, 0, 74234, 0, 74226, 0, 9007, 0, 41588, 125001, 119189, 10763, - 0, 0, 0, 126097, 68525, 6257, 73112, 100393, 100396, 100395, 100398, - 92409, 100400, 100399, 0, 74848, 0, 983592, 100401, 66498, 100403, - 100402, 64790, 73454, 100407, 100406, 70356, 100408, 0, 100410, 66829, - 70817, 5711, 41633, 12098, 65571, 9166, 0, 5710, 0, 6790, 65213, 0, 0, 0, - 69726, 0, 73817, 0, 0, 5715, 0, 70408, 0, 5712, 100382, 41620, 100384, - 3074, 5722, 100389, 100388, 73768, 0, 118906, 0, 0, 0, 66419, 119992, 0, - 0, 0, 0, 128903, 78607, 0, 129074, 0, 0, 0, 0, 0, 0, 113682, 0, 11261, 0, - 0, 0, 8701, 0, 11236, 0, 129490, 100390, 0, 0, 0, 78293, 0, 0, 0, 64946, - 0, 0, 0, 70336, 0, 0, 93986, 68814, 42902, 0, 0, 0, 0, 92344, 0, 67845, - 42641, 71444, 0, 0, 70366, 0, 100369, 100368, 5084, 100370, 0, 118861, 0, - 733, 74646, 0, 0, 0, 125085, 0, 9218, 0, 100380, 100379, 71070, 0, 0, 0, - 0, 70323, 0, 0, 5155, 0, 0, 983756, 0, 0, 72351, 0, 0, 0, 122891, 0, 0, - 0, 100372, 100371, 100374, 100373, 100376, 100375, 100378, 100377, 4974, - 100357, 100360, 100359, 0, 0, 0, 12205, 0, 0, 64507, 0, 0, 0, 0, 0, 0, - 12149, 13088, 78290, 0, 12241, 0, 0, 0, 6932, 100352, 73676, 100354, + 74127, 0, 0, 0, 78086, 73758, 2335, 10663, 0, 0, 129872, 119602, 0, 0, + 70325, 0, 41443, 0, 0, 0, 9711, 1523, 0, 0, 41445, 0, 0, 8567, 41442, + 12821, 0, 0, 118978, 0, 65274, 0, 94082, 0, 127515, 0, 0, 43446, 0, 0, 0, + 0, 127985, 0, 10206, 127167, 6375, 2673, 0, 0, 0, 43219, 129355, 0, 0, 0, + 0, 129400, 11799, 101225, 68466, 0, 0, 0, 0, 0, 120736, 0, 7203, 0, 0, + 70361, 127213, 120615, 127216, 0, 0, 0, 0, 43121, 0, 128366, 72161, 0, + 129868, 0, 121260, 73781, 70365, 0, 68039, 70446, 10057, 0, 0, 0, 101219, + 120963, 101220, 2307, 0, 0, 0, 0, 73873, 0, 94035, 0, 0, 0, 0, 129983, + 7327, 0, 0, 440, 0, 0, 68613, 75059, 0, 0, 9957, 0, 0, 8046, 0, 119158, + 0, 0, 68609, 0, 129405, 1521, 129460, 92256, 65344, 0, 11850, 68737, 0, + 0, 68914, 7303, 65770, 5243, 0, 5239, 65771, 121429, 0, 5237, 0, 68756, + 0, 5247, 0, 0, 0, 12873, 5764, 0, 0, 3008, 118981, 128102, 0, 0, 55231, + 41103, 0, 92756, 0, 0, 92717, 70074, 7872, 74886, 917567, 8731, 65378, 0, + 0, 11316, 128163, 126600, 70360, 3019, 9997, 0, 0, 9456, 129545, 0, 0, + 101192, 0, 0, 92682, 4281, 0, 0, 0, 118982, 0, 69993, 78096, 0, 78095, 0, + 78098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2134, 0, 10116, 9877, 70679, 0, 0, + 92723, 8379, 0, 6778, 0, 0, 8243, 0, 0, 0, 0, 128008, 0, 0, 0, 983630, + 119668, 129962, 92722, 983098, 5637, 125115, 0, 0, 120479, 0, 113730, 0, + 0, 194990, 64432, 0, 70363, 121368, 1156, 68052, 0, 0, 120482, 0, 68030, + 0, 0, 0, 7634, 0, 0, 65536, 0, 0, 0, 7702, 0, 78890, 0, 65779, 65783, + 195066, 120961, 5700, 0, 0, 92161, 2339, 92476, 5697, 0, 0, 0, 74923, 0, + 5696, 92677, 0, 3862, 0, 0, 0, 983055, 0, 0, 0, 0, 5701, 9722, 41490, + 41370, 5698, 0, 0, 0, 42204, 55270, 8571, 0, 0, 43859, 0, 78731, 0, + 12184, 0, 0, 0, 0, 0, 5650, 0, 64712, 120474, 0, 120458, 5647, 120473, + 7387, 0, 92675, 11477, 5646, 0, 11018, 0, 0, 0, 0, 0, 0, 69280, 128459, + 126128, 5651, 0, 0, 0, 5648, 0, 120920, 0, 127517, 3545, 0, 6984, 0, 0, + 0, 69414, 126613, 0, 10123, 0, 69274, 0, 0, 65020, 74885, 119166, 0, 0, + 0, 0, 0, 1140, 78426, 0, 0, 0, 0, 8128, 9889, 0, 0, 1815, 0, 890, 0, + 3267, 0, 0, 0, 983667, 4410, 125081, 10576, 8102, 0, 580, 74232, 0, 0, 0, + 0, 0, 19938, 0, 0, 0, 0, 3298, 6546, 0, 0, 0, 0, 6134, 41246, 0, 0, 0, + 917770, 0, 6264, 0, 0, 0, 0, 0, 0, 69445, 0, 0, 0, 92697, 11915, 10377, + 0, 10072, 0, 0, 2329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101164, 0, 11201, 92708, + 74769, 0, 13263, 0, 0, 92404, 126066, 73822, 0, 0, 64917, 0, 0, 494, + 128026, 0, 65098, 0, 956, 125265, 129556, 0, 73740, 0, 0, 0, 74281, + 128638, 0, 0, 69217, 120930, 0, 0, 0, 0, 0, 9922, 0, 126269, 100948, 0, + 65229, 0, 0, 0, 0, 0, 0, 3907, 118833, 64526, 11829, 68197, 0, 0, 11475, + 70329, 3020, 42264, 0, 0, 0, 7098, 0, 0, 127967, 957, 42696, 0, 3016, 0, + 0, 0, 0, 0, 121248, 92510, 3006, 4620, 0, 0, 0, 0, 129369, 129425, 0, 0, + 0, 126246, 8626, 0, 128824, 0, 65377, 0, 983102, 42920, 1698, 0, 64477, + 0, 0, 43813, 100432, 100431, 100434, 100433, 100436, 70321, 100438, + 100437, 100440, 100439, 0, 121024, 0, 70327, 100441, 55252, 100443, + 100442, 100445, 100444, 66641, 100446, 100449, 100448, 0, 100450, 113820, + 74866, 64375, 0, 127850, 129477, 0, 0, 0, 0, 983780, 0, 0, 120827, 0, 0, + 123637, 0, 0, 0, 101183, 8110, 100421, 0, 100423, 5830, 100425, 100424, + 100427, 100426, 100429, 100428, 42389, 78611, 121398, 0, 0, 0, 0, 0, 0, + 0, 83342, 983935, 0, 127147, 119187, 2135, 11836, 0, 0, 78869, 42313, + 5579, 0, 70384, 983082, 94002, 0, 5578, 11840, 73006, 42023, 69849, 5669, + 92559, 0, 0, 68833, 917845, 128275, 5583, 0, 0, 42426, 5580, 42276, 0, + 892, 2220, 42465, 74313, 73440, 5795, 194991, 68774, 65702, 68770, 0, + 65695, 0, 65710, 128399, 0, 0, 68783, 0, 0, 0, 1638, 10966, 0, 917547, 0, + 118921, 0, 0, 0, 8172, 0, 0, 0, 0, 0, 0, 6374, 0, 0, 120972, 0, 0, 0, 0, + 0, 0, 0, 72204, 64900, 7153, 65785, 68826, 0, 3015, 68743, 68740, 68738, + 68805, 6400, 68749, 68748, 68760, 68758, 11276, 68754, 100420, 372, + 101138, 68761, 118874, 0, 41585, 128202, 0, 74228, 276, 129895, 74234, 0, + 74226, 0, 9007, 0, 41588, 125001, 119189, 10763, 0, 0, 983560, 126097, + 68525, 6257, 73112, 100393, 100396, 100395, 100398, 92409, 100400, + 100399, 101148, 74848, 120006, 983592, 100401, 66498, 100403, 100402, + 64790, 73454, 100407, 100406, 70356, 100408, 0, 100410, 66829, 70817, + 5711, 41633, 12098, 65571, 9166, 0, 5710, 0, 6790, 65213, 0, 0, 0, 69726, + 0, 73817, 0, 0, 5715, 0, 70408, 0, 5712, 100382, 41620, 100384, 3074, + 5722, 100389, 100388, 73768, 0, 118906, 0, 0, 0, 66419, 71972, 0, 0, 0, + 0, 128903, 78607, 0, 129074, 0, 0, 0, 0, 0, 0, 113682, 0, 11261, 0, 0, 0, + 8701, 0, 11236, 0, 129490, 100390, 0, 0, 0, 78293, 0, 0, 0, 64946, 0, 0, + 0, 70336, 0, 0, 93986, 68814, 42902, 0, 0, 0, 0, 92344, 0, 67845, 42641, + 71444, 0, 0, 70366, 101152, 100369, 100368, 5084, 100370, 101158, 118861, + 0, 733, 74646, 0, 0, 0, 125085, 0, 9218, 0, 100380, 100379, 71070, 0, 0, + 0, 0, 70323, 0, 0, 5155, 0, 0, 983756, 0, 0, 72351, 0, 0, 0, 122891, 0, + 0, 0, 100372, 100371, 100374, 100373, 100376, 100375, 100378, 100377, + 4974, 100357, 100360, 100359, 0, 0, 0, 12205, 0, 0, 64507, 0, 0, 0, 0, 0, + 0, 12149, 13088, 78290, 0, 12241, 0, 0, 0, 6932, 100352, 73676, 100354, 100353, 100356, 351, 68764, 0, 0, 0, 0, 73443, 0, 0, 100361, 42377, - 100363, 100362, 100365, 100364, 100367, 9013, 4054, 0, 0, 113740, 0, + 100363, 100362, 100365, 100364, 100367, 9013, 4054, 0, 0, 71939, 0, 120782, 5585, 65881, 0, 0, 0, 0, 5584, 8358, 128975, 121177, 0, 0, 0, 41616, 0, 983796, 2218, 0, 5589, 0, 2664, 41613, 5586, 118890, 0, 11356, - 0, 0, 0, 78609, 0, 0, 0, 0, 0, 0, 0, 0, 8135, 129685, 0, 983791, 0, 0, 0, - 5657, 0, 12915, 121453, 0, 10179, 5654, 12939, 0, 120799, 0, 0, 5652, - 10945, 0, 0, 0, 113710, 0, 73449, 68069, 0, 70332, 0, 5659, 0, 0, 66729, - 5655, 0, 0, 0, 68806, 0, 128225, 66310, 73444, 0, 0, 70362, 0, 11609, 0, - 126990, 92949, 10272, 10304, 10368, 74511, 594, 10244, 10248, 10256, - 983899, 0, 0, 3467, 41010, 0, 3331, 946, 0, 1495, 13184, 74330, 128242, - 9562, 0, 123175, 0, 70036, 0, 0, 0, 123176, 0, 0, 0, 5666, 65227, 123174, - 68419, 0, 11796, 123178, 0, 0, 10186, 123172, 7732, 983736, 0, 0, 0, - 5668, 83334, 0, 74645, 5670, 0, 0, 12741, 126619, 123638, 5667, 19952, + 0, 0, 0, 78609, 0, 0, 0, 0, 0, 129870, 0, 0, 8135, 129685, 0, 983791, 0, + 0, 0, 5657, 0, 12915, 121453, 0, 10179, 5654, 12939, 0, 120799, 0, 0, + 5652, 10945, 0, 0, 0, 113710, 0, 73449, 68069, 0, 70332, 0, 5659, 0, 0, + 66729, 5655, 0, 0, 0, 68806, 0, 128225, 66310, 73444, 0, 0, 70362, 0, + 11609, 0, 126990, 92949, 10272, 10304, 10368, 74511, 594, 10244, 10248, + 10256, 983899, 0, 0, 3467, 41010, 0, 3331, 946, 0, 1495, 13184, 74330, + 128242, 9562, 0, 123175, 0, 70036, 0, 0, 0, 123176, 0, 0, 0, 5666, 65227, + 123174, 68419, 0, 11796, 123178, 0, 0, 10186, 123172, 7732, 983736, 0, 0, + 0, 5668, 83334, 0, 74645, 5670, 0, 0, 12741, 126619, 123638, 5667, 19952, 120807, 113766, 12749, 0, 67757, 2263, 0, 0, 119260, 129131, 9286, 83335, 128457, 83336, 70359, 0, 3571, 13247, 5874, 78279, 73447, 68435, 78278, 78267, 78268, 0, 78265, 553, 113768, 0, 93053, 5829, 0, 4587, 78285, - 78299, 0, 12746, 0, 70338, 0, 5633, 0, 94101, 94102, 94099, 94100, 94105, - 74856, 94103, 12742, 0, 983818, 0, 0, 0, 70330, 0, 983811, 0, 0, 0, - 12148, 0, 0, 0, 0, 0, 64938, 67234, 5634, 0, 0, 2146, 0, 118880, 2425, + 78299, 129699, 12746, 0, 70338, 0, 5633, 0, 94101, 94102, 94099, 94100, + 94105, 74856, 94103, 12742, 0, 983818, 0, 0, 0, 70330, 0, 983811, 0, 0, + 0, 12148, 0, 0, 0, 0, 0, 64938, 67234, 5634, 0, 0, 2146, 0, 118880, 2425, 65182, 983813, 43636, 0, 0, 328, 0, 68736, 0, 5636, 123163, 5329, 0, 5638, 0, 7940, 0, 43223, 43760, 5635, 3373, 72424, 78292, 74223, 73441, 68763, 78287, 9833, 0, 74208, 41635, 0, 0, 43040, 78297, 68778, 78295, @@ -26942,45 +27796,46 @@ static const unsigned int code_hash[] = { 124939, 0, 0, 42494, 3073, 0, 0, 42302, 0, 126553, 70810, 0, 72401, 0, 0, 0, 129319, 4877, 100681, 100684, 100683, 10548, 100685, 100688, 100687, 100690, 64798, 70805, 5346, 0, 126570, 0, 4874, 0, 0, 0, 0, 0, 65884, 0, - 0, 0, 11378, 0, 42785, 0, 3251, 11203, 0, 0, 0, 0, 11052, 0, 5342, 8317, - 0, 0, 5340, 0, 0, 128599, 0, 129538, 0, 128395, 0, 128510, 0, 0, 9142, 0, - 0, 0, 10938, 0, 0, 1182, 127381, 4829, 0, 0, 72438, 529, 0, 0, 0, 10586, - 10790, 10839, 121427, 41593, 100669, 0, 0, 41594, 225, 66418, 0, 0, - 983950, 11376, 0, 41596, 0, 0, 0, 0, 11084, 3194, 0, 78306, 78305, 0, 0, - 0, 11324, 0, 0, 8420, 127756, 128844, 0, 41338, 129683, 11485, 0, 41322, - 66605, 100671, 0, 100673, 100672, 100675, 5161, 41330, 100676, 100679, - 100678, 100659, 100658, 0, 100660, 0, 100485, 12361, 0, 12359, 983559, - 41369, 66412, 12191, 0, 0, 0, 0, 78221, 41376, 0, 9870, 0, 41385, 65824, - 100651, 11938, 100653, 100652, 100655, 100654, 42678, 100656, 0, 64649, - 0, 0, 0, 0, 0, 983948, 100662, 100661, 100664, 66334, 100666, 70280, 832, - 100667, 0, 78473, 66007, 78471, 65703, 0, 0, 0, 12357, 0, 41395, 0, 0, 0, - 0, 0, 0, 0, 0, 41114, 65466, 0, 983825, 6024, 0, 9979, 0, 0, 0, 0, 0, 0, - 0, 4285, 0, 0, 4230, 0, 7367, 0, 92353, 7563, 42376, 0, 128532, 0, 0, 0, - 0, 0, 0, 78466, 0, 12208, 128138, 0, 66311, 71309, 0, 41130, 78286, 0, 0, - 70047, 0, 6022, 0, 0, 0, 0, 0, 41125, 0, 66453, 0, 41107, 0, 41121, 5300, - 0, 0, 0, 0, 74801, 70855, 2074, 73456, 0, 0, 12453, 0, 0, 0, 0, 68159, - 12457, 0, 0, 66278, 0, 0, 0, 0, 0, 66637, 12455, 0, 128473, 0, 12449, 0, - 71224, 0, 0, 66908, 0, 10165, 0, 0, 113715, 0, 128223, 0, 0, 0, 0, 4993, - 0, 6168, 74033, 4995, 0, 69459, 120522, 4639, 0, 72223, 0, 0, 0, 0, 0, 0, - 69734, 0, 0, 0, 0, 0, 0, 83310, 0, 0, 0, 0, 0, 0, 0, 0, 129594, 4953, 0, - 0, 0, 0, 83311, 0, 73453, 65688, 0, 10125, 3517, 0, 0, 0, 65094, 74791, - 78262, 10627, 66333, 78256, 78257, 83304, 78253, 0, 71317, 64923, 0, - 65208, 10608, 78263, 78264, 0, 0, 0, 65883, 0, 0, 74914, 0, 0, 0, 0, 0, - 12912, 119012, 0, 128191, 0, 0, 129586, 0, 1290, 0, 0, 0, 0, 113719, - 71442, 0, 0, 8978, 0, 119135, 120979, 10527, 71079, 0, 0, 0, 0, 0, 0, - 5336, 0, 0, 6934, 0, 10780, 0, 0, 78767, 0, 0, 0, 347, 0, 0, 78775, - 64675, 41582, 78774, 78771, 68094, 74903, 78769, 69221, 69657, 0, 0, - 11153, 120981, 78526, 0, 0, 0, 0, 41584, 0, 69464, 0, 0, 0, 0, 43510, - 66661, 0, 66306, 78791, 66384, 0, 6609, 0, 0, 11319, 0, 128964, 0, 41730, - 0, 0, 127920, 0, 65172, 41728, 41721, 0, 0, 0, 41203, 0, 0, 41726, 0, 0, - 5758, 0, 0, 41140, 2028, 78092, 0, 0, 0, 92739, 983195, 41138, 0, 0, 0, - 125082, 1115, 127060, 9794, 127062, 67671, 92238, 12237, 78787, 66314, - 78785, 9290, 73668, 78783, 78780, 78781, 127144, 7926, 0, 0, 0, 64398, - 100924, 71274, 12311, 0, 78796, 78798, 78794, 78795, 78792, 78793, 0, 0, - 0, 73455, 0, 0, 0, 42142, 9968, 11583, 0, 7092, 0, 9627, 78536, 73677, - 78535, 0, 0, 1248, 10148, 127755, 0, 0, 0, 0, 66447, 0, 0, 0, 0, 65305, - 0, 4031, 42794, 119986, 0, 8154, 0, 0, 128028, 126259, 0, 125220, 73452, - 0, 0, 0, 6696, 0, 119599, 0, 0, 0, 4364, 0, 0, 0, 120976, 0, 120922, 0, + 0, 0, 11378, 0, 42785, 0, 3251, 11203, 0, 0, 0, 69568, 11052, 0, 5342, + 8317, 0, 0, 5340, 0, 0, 128599, 0, 129538, 0, 128395, 0, 128510, 0, 0, + 9142, 0, 0, 0, 10938, 0, 0, 1182, 127381, 4829, 0, 0, 72438, 529, 0, 0, + 0, 10586, 10790, 10839, 121427, 41593, 100669, 0, 0, 41594, 225, 66418, + 0, 0, 983950, 11376, 0, 41596, 0, 0, 0, 0, 11084, 3194, 0, 78306, 78305, + 0, 0, 0, 11324, 0, 0, 8420, 127756, 128844, 0, 41338, 129683, 11485, 0, + 41322, 66605, 100671, 0, 100673, 100672, 100675, 5161, 41330, 100676, + 100679, 100678, 100659, 100658, 0, 100660, 0, 100485, 12361, 0, 12359, + 983559, 41369, 66412, 12191, 0, 0, 0, 0, 78221, 41376, 0, 9870, 0, 41385, + 65824, 100651, 11938, 100653, 100652, 100655, 100654, 42678, 100656, 0, + 64649, 0, 0, 0, 0, 0, 983948, 100662, 100661, 100664, 66334, 100666, + 70280, 832, 100667, 2240, 78473, 66007, 78471, 65703, 0, 0, 0, 12357, 0, + 41395, 0, 0, 0, 0, 0, 0, 983461, 0, 41114, 65466, 0, 983825, 6024, 0, + 9979, 0, 0, 0, 0, 0, 0, 0, 4285, 0, 0, 4230, 0, 7367, 0, 92353, 7563, + 42376, 0, 128532, 0, 0, 0, 0, 0, 0, 78466, 0, 12208, 128138, 0, 66311, + 71309, 0, 41130, 78286, 0, 0, 70047, 0, 6022, 0, 0, 0, 0, 0, 41125, 0, + 66453, 0, 41107, 0, 41121, 5300, 0, 0, 0, 0, 74801, 70855, 2074, 73456, + 0, 0, 12453, 0, 0, 0, 0, 68159, 12457, 0, 0, 66278, 0, 0, 0, 0, 0, 66637, + 12455, 0, 128473, 0, 12449, 0, 71224, 0, 0, 66908, 0, 10165, 0, 0, + 113715, 0, 128223, 0, 0, 0, 0, 4993, 0, 6168, 74033, 4995, 0, 69459, + 120522, 4639, 0, 72223, 0, 0, 0, 0, 0, 0, 69734, 0, 0, 0, 0, 0, 0, 83310, + 0, 0, 0, 0, 0, 0, 0, 0, 129594, 4953, 0, 0, 0, 0, 83311, 0, 73453, 65688, + 0, 10125, 3517, 0, 0, 0, 65094, 74791, 78262, 10627, 66333, 78256, 78257, + 83304, 78253, 0, 71317, 64923, 0, 65208, 10608, 78263, 78264, 0, 0, 0, + 65883, 0, 0, 74914, 0, 0, 0, 0, 0, 12912, 119012, 0, 128191, 0, 0, + 129586, 0, 1290, 0, 0, 0, 0, 113719, 71442, 0, 0, 8978, 0, 119135, + 120979, 10527, 71079, 0, 0, 0, 0, 0, 0, 5336, 0, 0, 6934, 0, 10780, 0, 0, + 78767, 0, 0, 0, 347, 0, 0, 78775, 64675, 41582, 78774, 78771, 68094, + 74903, 78769, 69221, 69657, 0, 0, 11153, 120981, 78526, 0, 0, 0, 0, + 41584, 0, 69464, 0, 0, 0, 0, 43510, 66661, 0, 66306, 78791, 66384, 0, + 6609, 0, 0, 11319, 0, 128964, 0, 41730, 0, 0, 127920, 0, 65172, 41728, + 41721, 0, 0, 0, 41203, 0, 0, 41726, 0, 0, 5758, 0, 0, 41140, 2028, 78092, + 0, 0, 0, 92739, 983195, 41138, 0, 0, 0, 125082, 1115, 127060, 9794, + 127062, 67671, 92238, 12237, 78787, 66314, 78785, 9290, 73668, 78783, + 78780, 78781, 127144, 7926, 0, 0, 0, 64398, 100924, 71274, 12311, 101268, + 78796, 78798, 78794, 78795, 78792, 78793, 0, 101270, 0, 73455, 0, 0, 0, + 42142, 9968, 11583, 0, 7092, 129835, 9627, 78536, 73677, 78535, 0, 0, + 1248, 10148, 127755, 0, 0, 101273, 0, 66447, 0, 0, 0, 0, 65305, 0, 4031, + 42794, 119986, 0, 8154, 0, 0, 128028, 126259, 129926, 125220, 73452, 0, + 0, 0, 6696, 0, 119599, 0, 0, 0, 4364, 0, 0, 0, 120976, 0, 120922, 0, 10124, 7526, 8601, 0, 68246, 0, 129318, 1418, 10885, 0, 0, 0, 0, 0, 0, 4571, 0, 0, 0, 12078, 41597, 0, 10933, 0, 72129, 0, 0, 0, 41599, 0, 0, 0, 12950, 119190, 10498, 0, 66782, 4239, 0, 0, 66511, 68066, 2637, 110685, @@ -26989,419 +27844,425 @@ static const unsigned int code_hash[] = { 120730, 0, 0, 41732, 0, 41736, 983201, 41731, 0, 0, 70842, 0, 0, 0, 0, 129329, 0, 66853, 0, 0, 78742, 72755, 11277, 65892, 0, 10620, 92272, 0, 0, 0, 0, 73942, 0, 100479, 0, 119093, 3459, 0, 129398, 0, 0, 72130, - 92512, 0, 66377, 69781, 0, 0, 111304, 3161, 69981, 0, 0, 0, 0, 0, 9016, - 78153, 0, 0, 43641, 0, 121018, 0, 0, 0, 0, 0, 0, 0, 68342, 120950, 94043, - 0, 12332, 121310, 6086, 41722, 0, 120709, 0, 0, 111305, 0, 0, 128307, - 74288, 0, 74546, 0, 129178, 0, 0, 42460, 0, 0, 0, 0, 120941, 42421, 0, - 41723, 0, 64358, 11460, 983506, 0, 64718, 120838, 66869, 0, 42348, 0, - 6752, 452, 42500, 0, 128258, 0, 42308, 0, 0, 0, 12932, 0, 69968, 42950, - 66827, 917582, 0, 0, 8302, 0, 0, 0, 0, 7250, 13214, 10041, 8105, 65568, - 127780, 69969, 127759, 0, 0, 121467, 0, 121466, 73666, 0, 69878, 0, 5538, - 9987, 0, 118932, 129307, 0, 552, 0, 7357, 10785, 0, 0, 4557, 0, 0, 10171, - 68320, 0, 5540, 0, 0, 281, 0, 0, 42622, 0, 5536, 0, 0, 1388, 0, 0, 10504, - 0, 0, 11531, 74324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3663, 0, 121081, 70335, - 74859, 0, 5334, 0, 110738, 72319, 0, 11305, 0, 68456, 0, 66611, 0, 19907, - 64363, 3478, 7583, 7679, 74154, 0, 0, 1158, 0, 0, 73748, 0, 0, 1915, - 4846, 0, 120132, 118984, 120134, 120129, 120128, 805, 120130, 64438, - 120124, 8760, 120126, 72137, 120120, 120123, 94003, 0, 0, 0, 0, 0, 12225, - 0, 0, 0, 70173, 75045, 0, 129515, 8083, 0, 0, 0, 111094, 92626, 0, 0, 0, - 0, 0, 0, 110837, 0, 67699, 560, 5643, 0, 0, 0, 0, 0, 0, 0, 120144, 0, - 120661, 78304, 1597, 120143, 120142, 206, 70126, 120139, 120138, 8168, 0, - 73086, 0, 0, 0, 983827, 125036, 0, 0, 3546, 42573, 66811, 0, 0, 128397, - 8400, 0, 0, 0, 0, 0, 7903, 9287, 72791, 0, 0, 0, 0, 72134, 66603, 1695, - 917861, 0, 0, 111101, 0, 0, 0, 0, 0, 0, 0, 111099, 0, 111098, 4754, 0, - 69222, 128229, 0, 0, 7354, 7408, 0, 0, 121181, 0, 0, 0, 12739, 0, 1278, - 4187, 0, 42119, 42120, 0, 121158, 0, 12467, 0, 68902, 0, 12463, 0, 0, - 118827, 0, 9664, 70834, 74475, 0, 0, 0, 0, 0, 3661, 0, 0, 9022, 127955, - 0, 0, 126257, 0, 6118, 222, 126250, 3884, 0, 74151, 0, 6502, 0, 11085, - 121261, 0, 0, 0, 0, 0, 0, 0, 0, 12461, 0, 0, 0, 94059, 11254, 10860, - 64880, 0, 64685, 0, 0, 94087, 7776, 11219, 0, 0, 121339, 69730, 801, - 43165, 0, 78212, 0, 0, 13277, 0, 12951, 0, 9906, 5486, 2334, 128672, - 67680, 5483, 73732, 120884, 119128, 5484, 0, 127876, 2539, 0, 78507, - 5485, 195065, 42697, 0, 0, 113689, 4502, 68057, 253, 73672, 0, 0, 9203, - 0, 0, 0, 0, 0, 121242, 11127, 0, 0, 0, 13257, 0, 0, 0, 69645, 0, 0, 0, - 70431, 0, 5693, 64470, 0, 66610, 67678, 0, 983659, 0, 0, 0, 0, 0, 0, 0, - 94078, 0, 0, 66608, 3111, 0, 8804, 66607, 0, 0, 0, 66606, 0, 0, 0, 1436, - 0, 55226, 0, 111287, 7393, 41592, 0, 0, 1598, 78101, 0, 0, 65193, 4423, - 0, 113692, 10515, 41589, 0, 0, 0, 0, 1430, 0, 0, 120606, 0, 66223, 7619, - 3255, 128280, 74032, 11549, 10735, 93038, 100741, 6801, 100743, 100746, - 2148, 100748, 100747, 100750, 100749, 0, 121229, 0, 69243, 41724, 67716, - 69669, 41690, 111269, 983647, 8380, 100355, 983830, 0, 0, 0, 0, 0, 0, - 6333, 111264, 42315, 0, 129502, 111265, 0, 0, 5339, 74323, 0, 13004, 0, - 0, 0, 0, 0, 0, 5684, 0, 0, 0, 5689, 0, 0, 68464, 12633, 12870, 0, 65183, - 5688, 0, 0, 6310, 5686, 0, 0, 0, 120647, 70046, 50, 94095, 9871, 0, 0, - 121446, 0, 0, 0, 66905, 0, 4448, 0, 121406, 113734, 72125, 1321, 0, - 10640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12501, 0, 0, 0, 0, 8812, 0, - 69986, 8673, 0, 129024, 0, 0, 2105, 72101, 72712, 0, 0, 0, 0, 0, 4636, - 55262, 0, 4515, 2382, 0, 0, 7313, 0, 0, 0, 194626, 0, 0, 0, 0, 0, 0, 0, - 10197, 194719, 0, 0, 0, 194718, 0, 0, 0, 64189, 0, 1873, 0, 0, 0, 0, 0, - 983663, 0, 0, 0, 72282, 126991, 71113, 0, 0, 129340, 9489, 0, 70843, 0, - 0, 0, 0, 128030, 13295, 43191, 0, 0, 1154, 0, 1205, 0, 0, 0, 12958, 0, 0, - 0, 70846, 0, 10592, 0, 495, 0, 41712, 7983, 0, 0, 0, 6347, 69465, 7654, + 92512, 0, 66377, 69781, 128718, 0, 111304, 3161, 69981, 0, 0, 0, 0, 0, + 9016, 78153, 0, 0, 43641, 0, 121018, 0, 101279, 0, 0, 0, 0, 0, 68342, + 120950, 94043, 0, 12332, 121310, 6086, 41722, 0, 120709, 0, 0, 111305, 0, + 0, 128307, 74288, 0, 74546, 0, 129178, 129399, 0, 42460, 0, 0, 0, 0, + 120941, 42421, 0, 41723, 110606, 64358, 11460, 983506, 0, 64718, 120838, + 66869, 0, 42348, 0, 6752, 452, 42500, 0, 128258, 0, 42308, 0, 0, 0, + 12932, 0, 69968, 42950, 66827, 917582, 0, 0, 8302, 0, 0, 0, 0, 7250, + 13214, 10041, 8105, 65568, 127780, 69969, 127759, 0, 0, 121467, 0, + 121466, 73666, 0, 69878, 0, 5538, 9987, 0, 118932, 129307, 0, 552, 0, + 7357, 10785, 0, 0, 4557, 0, 0, 10171, 68320, 0, 5540, 0, 0, 281, 0, 0, + 42622, 0, 5536, 0, 0, 1388, 0, 0, 10504, 0, 0, 11531, 74324, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3663, 0, 121081, 70335, 74859, 0, 5334, 0, 110738, + 72319, 0, 11305, 0, 68456, 0, 66611, 0, 19907, 64363, 3478, 7583, 7679, + 74154, 0, 0, 1158, 0, 983871, 73748, 0, 0, 1915, 4846, 0, 120132, 118984, + 120134, 120129, 120128, 805, 120130, 64438, 120124, 8760, 120126, 72137, + 120120, 120123, 94003, 0, 0, 0, 0, 0, 12225, 0, 0, 0, 70173, 75045, 0, + 129515, 8083, 0, 0, 0, 111094, 92626, 0, 0, 0, 0, 0, 0, 110837, 0, 67699, + 560, 5643, 0, 0, 0, 0, 0, 0, 0, 120144, 0, 120661, 78304, 1597, 120143, + 120142, 206, 70126, 120139, 120138, 8168, 0, 73086, 0, 0, 0, 983827, + 125036, 0, 0, 3546, 42573, 66811, 0, 0, 128397, 8400, 0, 0, 0, 0, 0, + 7903, 9287, 72791, 0, 0, 0, 0, 72134, 66603, 1695, 917861, 0, 0, 111101, + 0, 0, 0, 0, 0, 0, 0, 111099, 0, 111098, 4754, 0, 69222, 128229, 0, 0, + 7354, 7408, 0, 0, 121181, 0, 0, 0, 12739, 0, 1278, 4187, 0, 42119, 42120, + 0, 121158, 0, 12467, 0, 68902, 0, 12463, 0, 0, 118827, 0, 9664, 70834, + 74475, 0, 0, 0, 0, 0, 3661, 0, 0, 9022, 127955, 0, 101460, 126257, 0, + 6118, 222, 126250, 3884, 0, 74151, 0, 6502, 0, 11085, 121261, 0, 0, 0, 0, + 0, 0, 0, 0, 12461, 0, 0, 0, 94059, 11254, 10860, 64880, 0, 64685, 0, 0, + 94087, 7776, 11219, 0, 0, 121339, 69730, 801, 43165, 0, 78212, 0, 0, + 13277, 0, 12951, 0, 9906, 5486, 2334, 128672, 67680, 5483, 73732, 120884, + 119128, 5484, 0, 127876, 2539, 0, 78507, 5485, 195065, 42697, 0, 0, + 113689, 4502, 68057, 253, 73672, 0, 0, 9203, 0, 0, 0, 0, 0, 121242, + 11127, 0, 0, 0, 13257, 0, 0, 0, 69645, 0, 0, 0, 70431, 0, 5693, 64470, 0, + 66610, 67678, 0, 983659, 0, 0, 0, 0, 0, 0, 0, 94078, 0, 0, 66608, 3111, + 0, 8804, 66607, 0, 0, 0, 66606, 0, 0, 0, 1436, 0, 55226, 0, 111287, 7393, + 41592, 0, 0, 1598, 78101, 0, 0, 65193, 4423, 0, 113692, 10515, 41589, 0, + 0, 0, 101485, 1430, 101486, 0, 120606, 0, 66223, 7619, 3255, 128280, + 74032, 11549, 10735, 93038, 100741, 6801, 100743, 100746, 2148, 100748, + 100747, 100750, 100749, 0, 121229, 101479, 69243, 41724, 67716, 69669, + 41690, 111269, 983647, 8380, 100355, 983830, 0, 101480, 0, 0, 0, 0, 6333, + 111264, 42315, 0, 129502, 111265, 0, 0, 5339, 74323, 0, 13004, 0, 0, 0, + 0, 0, 0, 5684, 0, 0, 0, 5689, 0, 0, 68464, 12633, 12870, 0, 65183, 5688, + 0, 0, 6310, 5686, 0, 0, 0, 120647, 70046, 50, 94095, 9871, 0, 0, 121446, + 0, 0, 0, 66905, 0, 4448, 0, 121406, 113734, 72125, 1321, 0, 10640, 0, 0, + 101497, 0, 0, 0, 0, 0, 0, 0, 0, 12501, 0, 0, 0, 0, 8812, 0, 69986, 8673, + 0, 129024, 0, 0, 2105, 72101, 72712, 0, 129929, 0, 0, 0, 4636, 55262, 0, + 4515, 2382, 0, 0, 7313, 101477, 0, 0, 194626, 0, 0, 0, 0, 0, 0, 0, 10197, + 194719, 0, 0, 0, 194718, 0, 0, 0, 64189, 0, 1873, 0, 0, 0, 0, 0, 983663, + 0, 0, 101499, 72282, 126991, 71113, 0, 0, 129340, 9489, 0, 70843, 0, 0, + 0, 0, 128030, 13295, 43191, 0, 0, 1154, 0, 1205, 0, 0, 0, 12958, 0, 0, 0, + 70846, 0, 10592, 0, 495, 0, 41712, 7983, 0, 0, 0, 6347, 69465, 7654, 41710, 4196, 0, 0, 41709, 73772, 70832, 0, 9465, 983764, 0, 0, 917612, 0, - 0, 41714, 0, 0, 0, 6343, 0, 0, 43996, 0, 8044, 0, 0, 41789, 0, 10809, 0, - 0, 0, 0, 8146, 11025, 0, 120513, 642, 0, 0, 0, 12875, 0, 0, 13229, 0, - 41788, 0, 0, 0, 41791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8428, 6569, 0, 0, 0, - 0, 10167, 0, 68248, 8049, 0, 0, 0, 0, 128882, 4761, 0, 4766, 64623, 0, - 121180, 194653, 118876, 0, 6912, 9232, 7033, 0, 0, 41545, 0, 0, 72160, - 72107, 0, 0, 0, 3484, 0, 0, 0, 8503, 41539, 41527, 0, 0, 983823, 0, 0, 0, - 41537, 0, 41541, 8282, 11817, 0, 128219, 0, 0, 126132, 0, 0, 70115, - 66609, 111235, 65921, 0, 0, 194664, 0, 129326, 77970, 42246, 75030, - 120605, 0, 65926, 7744, 68859, 94056, 74277, 126108, 0, 6966, 194633, - 8136, 0, 0, 0, 0, 0, 4762, 0, 0, 0, 4765, 69443, 983573, 0, 4760, 0, 0, - 10871, 43199, 0, 0, 93955, 0, 0, 11546, 0, 337, 0, 0, 0, 12279, 7768, 0, - 128352, 0, 69812, 10143, 7883, 121444, 7880, 64618, 13012, 5704, 13010, - 0, 0, 119531, 0, 0, 0, 0, 66654, 0, 0, 0, 13008, 0, 4385, 0, 13011, 0, - 92569, 119161, 13009, 74771, 70159, 0, 0, 41793, 0, 74221, 120996, 41792, - 111242, 94054, 126094, 0, 111244, 5709, 120689, 71076, 0, 0, 0, 0, 0, - 5708, 0, 0, 0, 5706, 66362, 5705, 8791, 41797, 0, 10237, 66436, 0, 0, 0, - 0, 128083, 13170, 0, 0, 0, 0, 41377, 0, 0, 10058, 125225, 0, 0, 0, 0, 0, - 0, 0, 129641, 119525, 0, 0, 72350, 0, 983572, 2144, 0, 120765, 0, 0, - 1754, 92226, 13246, 864, 0, 118926, 8972, 0, 7849, 0, 0, 13240, 0, 5192, - 0, 0, 10948, 0, 13199, 0, 1236, 13208, 13261, 13189, 13188, 93993, 0, - 7440, 0, 0, 0, 1844, 125229, 0, 13178, 0, 0, 0, 125230, 0, 0, 13260, - 4550, 121249, 125227, 0, 71071, 0, 0, 68523, 0, 0, 11354, 94071, 0, - 42795, 129317, 0, 0, 0, 125237, 0, 13194, 13274, 0, 0, 129533, 65586, - 68311, 0, 119193, 4601, 194661, 0, 194658, 0, 194659, 0, 121422, 128790, - 194657, 41717, 67402, 0, 121129, 41716, 127376, 7910, 0, 0, 754, 41944, - 0, 8183, 120741, 2037, 0, 0, 0, 125, 0, 0, 0, 983124, 127922, 41719, 0, - 7990, 12637, 13258, 9536, 71056, 0, 4427, 0, 71200, 0, 12217, 0, 41532, - 129315, 0, 0, 0, 0, 111063, 83349, 0, 0, 120622, 0, 0, 0, 0, 43632, 0, 0, - 8140, 0, 6260, 0, 0, 66765, 129657, 0, 3898, 0, 0, 13200, 0, 0, 66582, 0, - 0, 0, 0, 1068, 71178, 13259, 12945, 0, 42203, 0, 3124, 69411, 0, 4386, - 12224, 6973, 129563, 0, 0, 119535, 0, 121312, 0, 12232, 0, 0, 5681, - 64578, 75023, 0, 13209, 0, 0, 0, 0, 0, 11053, 0, 74902, 128107, 128942, - 7588, 0, 1693, 74942, 43204, 65831, 0, 0, 0, 68803, 111216, 111223, 0, 0, - 65685, 9523, 65070, 0, 0, 0, 0, 0, 0, 0, 0, 13191, 0, 3500, 3139, 100643, - 3170, 100645, 100644, 100647, 100646, 13006, 64433, 0, 100650, 941, 0, 0, - 120967, 3727, 0, 0, 0, 0, 0, 0, 0, 94039, 129299, 92455, 0, 0, 64444, 0, - 0, 43603, 94075, 65397, 288, 0, 0, 0, 10025, 73692, 0, 0, 68182, 0, 0, 0, - 92438, 65395, 0, 0, 0, 65393, 83078, 121111, 0, 0, 0, 0, 0, 65394, 11548, - 72305, 0, 65396, 0, 0, 13256, 1282, 0, 0, 0, 111085, 0, 0, 0, 111087, - 72115, 0, 0, 0, 0, 0, 3304, 0, 0, 0, 126595, 72437, 68353, 0, 0, 42113, - 0, 0, 0, 0, 0, 43094, 0, 0, 94037, 68317, 9035, 0, 0, 0, 0, 0, 70822, - 128467, 164, 68309, 94067, 94000, 100631, 100634, 100633, 100636, 100635, - 100638, 100637, 68808, 100639, 110665, 73893, 11099, 110664, 13175, - 13207, 0, 127552, 0, 74643, 5929, 0, 0, 129192, 0, 11306, 0, 119059, - 3180, 125102, 0, 0, 0, 13062, 0, 129551, 128707, 0, 0, 74428, 0, 128000, - 0, 11251, 70204, 0, 10045, 0, 13275, 0, 11057, 0, 13276, 125133, 41525, - 983084, 128015, 11444, 0, 129158, 0, 0, 41523, 127765, 0, 0, 0, 0, 0, 0, - 0, 3858, 0, 119573, 0, 0, 0, 0, 0, 0, 101014, 369, 74908, 41784, 0, - 120994, 0, 71180, 0, 0, 13210, 41782, 0, 0, 0, 41781, 10486, 74058, - 43002, 0, 0, 0, 0, 0, 3741, 0, 0, 0, 0, 41222, 0, 128317, 3982, 0, 4388, - 126105, 746, 0, 0, 0, 13131, 0, 0, 0, 0, 0, 10434, 8794, 0, 0, 0, 0, 0, - 0, 11700, 4374, 0, 0, 0, 0, 0, 0, 917597, 0, 69814, 0, 6735, 73979, - 13174, 73968, 13225, 0, 69808, 0, 0, 2365, 7841, 71476, 0, 120934, 66510, - 128099, 0, 0, 0, 41785, 41171, 0, 13173, 4372, 0, 0, 0, 0, 128939, 0, 0, - 12965, 384, 0, 0, 12685, 41473, 0, 13242, 13236, 0, 0, 0, 41787, 0, - 70684, 0, 68486, 13272, 0, 13232, 13233, 65838, 0, 0, 11656, 0, 126110, - 119885, 12861, 0, 13271, 0, 92737, 1096, 0, 0, 0, 0, 0, 0, 0, 5203, 0, - 92902, 0, 13243, 13237, 12719, 0, 0, 0, 64884, 78043, 0, 0, 0, 0, 12014, - 0, 120785, 0, 0, 13195, 41452, 64961, 41535, 0, 10459, 0, 124949, 0, 0, - 0, 41533, 66337, 0, 92184, 0, 126091, 0, 0, 73849, 0, 43638, 0, 0, 6261, - 0, 129568, 0, 1957, 0, 0, 0, 13292, 13206, 0, 0, 2925, 73809, 42576, - 127559, 13212, 43238, 0, 13190, 13187, 0, 13198, 0, 0, 5242, 0, 0, - 128146, 0, 0, 6770, 43331, 127539, 0, 0, 71074, 126466, 0, 41444, 0, 0, - 64799, 5246, 119106, 13185, 9709, 0, 0, 92751, 0, 5238, 0, 71085, 0, - 5236, 40979, 0, 74201, 8286, 0, 3936, 0, 11699, 0, 127249, 13235, 0, - 41248, 127264, 13245, 13239, 0, 7969, 127266, 74832, 127251, 0, 120509, - 0, 983874, 734, 127270, 0, 127254, 70297, 127273, 64921, 120969, 66631, - 41771, 120490, 0, 983171, 41770, 1670, 42560, 0, 121349, 129634, 0, - 41163, 0, 11136, 0, 11506, 0, 42841, 13267, 126109, 0, 41775, 0, 7130, - 41773, 0, 0, 0, 0, 0, 0, 0, 42673, 65572, 0, 65250, 13265, 13264, 64518, - 66798, 6100, 0, 0, 6740, 71080, 67814, 12967, 70028, 68101, 4583, 0, 0, - 68097, 0, 0, 0, 0, 119211, 0, 0, 42653, 83181, 68102, 0, 7814, 71045, 0, - 73702, 0, 0, 0, 9756, 6985, 0, 0, 74219, 0, 0, 129069, 124987, 5674, 0, - 66421, 0, 5677, 5588, 0, 0, 0, 0, 5673, 0, 5676, 0, 94048, 0, 5672, 6476, - 0, 0, 110951, 42511, 1727, 0, 0, 0, 0, 0, 0, 0, 3550, 736, 0, 4505, 5873, - 74090, 5826, 55232, 5813, 0, 120712, 5841, 5837, 55234, 0, 3105, 64370, - 5838, 5796, 0, 119592, 5793, 0, 5866, 5797, 41011, 5865, 0, 0, 71899, 0, - 71235, 5806, 0, 0, 9037, 5671, 0, 0, 0, 0, 71266, 126616, 7296, 0, 0, 0, - 0, 6980, 0, 72108, 0, 0, 0, 0, 0, 64613, 983891, 0, 0, 0, 0, 7114, 0, - 72100, 43190, 93842, 128666, 72096, 42611, 42563, 0, 125080, 0, 6792, - 43201, 72098, 0, 128719, 0, 72106, 0, 0, 5644, 0, 66627, 69727, 0, 0, 0, - 65116, 0, 0, 0, 0, 66410, 94104, 41013, 0, 0, 0, 2869, 0, 41015, 0, 2785, - 120616, 0, 73907, 194689, 0, 0, 0, 194688, 4759, 0, 0, 43192, 0, 1170, - 43365, 69810, 73908, 0, 902, 0, 0, 0, 0, 8122, 66420, 129642, 0, 3861, 0, - 11028, 0, 73820, 5714, 0, 0, 0, 807, 127001, 0, 0, 976, 113782, 0, 0, 0, - 0, 0, 128657, 118801, 71043, 0, 127017, 0, 0, 5582, 0, 0, 5798, 0, 0, 0, - 128521, 0, 0, 68058, 120553, 983183, 0, 0, 74933, 74283, 0, 0, 194698, - 66044, 0, 0, 0, 0, 0, 10094, 0, 0, 10857, 69225, 0, 0, 93, 0, 10954, 0, - 0, 0, 8171, 0, 0, 82996, 0, 0, 0, 119001, 92634, 0, 0, 5187, 120711, - 71086, 0, 0, 0, 0, 5232, 0, 41009, 0, 41005, 0, 43205, 0, 0, 0, 194708, - 0, 71054, 10028, 66478, 7076, 13182, 100385, 0, 0, 0, 0, 7972, 78786, 0, - 0, 0, 78789, 11309, 3806, 73985, 0, 0, 0, 78819, 0, 125218, 0, 127532, 0, - 0, 0, 78817, 0, 64366, 65156, 8814, 0, 0, 0, 0, 12836, 42725, 120079, 0, - 0, 0, 0, 0, 13255, 0, 0, 7464, 0, 93831, 0, 0, 0, 0, 13213, 0, 0, 64516, - 0, 0, 0, 41007, 983910, 0, 40995, 12209, 983914, 119136, 123635, 0, 0, 0, - 0, 0, 69384, 43558, 5522, 0, 71061, 0, 74105, 3633, 983912, 119364, - 41234, 41231, 0, 9771, 983917, 13251, 0, 0, 6262, 2784, 0, 71078, 8126, - 66483, 0, 0, 441, 0, 0, 0, 41002, 40999, 0, 0, 7108, 0, 10890, 0, 74445, - 8324, 0, 0, 74817, 2813, 119056, 74853, 983671, 0, 0, 0, 1193, 10462, - 65197, 13253, 13252, 7829, 120992, 0, 0, 0, 0, 77911, 0, 77907, 0, 10386, - 0, 41042, 0, 65944, 65683, 10338, 66469, 0, 0, 0, 0, 0, 41966, 0, 0, 0, - 68915, 0, 0, 911, 983870, 128932, 40963, 0, 65159, 0, 0, 0, 5520, 0, 0, - 0, 0, 0, 0, 0, 71081, 0, 0, 0, 0, 0, 983873, 0, 0, 66839, 0, 0, 0, 68647, - 0, 5857, 68135, 92727, 119120, 983675, 13171, 0, 0, 0, 120338, 0, 0, 0, - 13250, 69663, 0, 92201, 66397, 0, 0, 0, 8761, 12942, 5748, 92713, 92414, - 0, 83174, 8796, 0, 0, 0, 43633, 0, 72805, 71073, 0, 0, 0, 0, 0, 12843, - 4520, 0, 0, 73004, 983672, 0, 0, 194935, 110754, 64345, 0, 0, 110752, 0, - 0, 0, 110750, 110758, 110751, 0, 0, 10427, 0, 73859, 0, 9755, 1110, - 65239, 0, 0, 0, 0, 0, 0, 0, 194936, 0, 983802, 0, 70437, 3620, 0, 0, - 72855, 0, 0, 0, 74250, 0, 0, 11980, 0, 66482, 67823, 0, 128345, 110768, - 0, 0, 0, 0, 12891, 983767, 983648, 0, 2016, 0, 65668, 92311, 67696, - 10366, 70117, 9155, 120652, 9786, 65082, 0, 8579, 0, 0, 0, 0, 4508, - 64883, 0, 92522, 0, 0, 64592, 74276, 67688, 0, 0, 0, 69456, 0, 113821, 0, - 12147, 9024, 66378, 66472, 0, 0, 0, 0, 0, 71935, 0, 0, 113697, 0, 0, 0, - 0, 74275, 0, 122896, 127941, 41214, 0, 0, 0, 0, 0, 7773, 0, 0, 9963, - 68649, 0, 73734, 0, 0, 0, 0, 6594, 983752, 0, 0, 3624, 70342, 0, 64655, - 121481, 0, 0, 0, 0, 0, 65932, 0, 983790, 6803, 120968, 7738, 0, 0, - 120628, 0, 66614, 122921, 0, 43810, 7029, 0, 41292, 118898, 0, 43115, - 9517, 11518, 0, 0, 0, 0, 64423, 0, 0, 0, 12503, 9591, 4516, 0, 118845, 0, - 0, 129479, 43650, 983192, 0, 0, 0, 68079, 0, 11397, 2884, 0, 0, 12678, 0, - 0, 41014, 73730, 917539, 4270, 92254, 127836, 68205, 6633, 118947, 0, - 5230, 101055, 0, 0, 983230, 121392, 0, 92985, 0, 0, 0, 0, 415, 0, 0, 0, - 0, 5183, 1877, 0, 0, 0, 0, 0, 4472, 0, 0, 0, 128285, 110682, 78230, 4756, - 0, 7081, 0, 0, 0, 78606, 0, 42922, 42103, 8628, 74861, 0, 0, 0, 43059, - 10539, 0, 0, 0, 0, 0, 0, 0, 0, 64873, 11992, 0, 0, 0, 11801, 3622, 0, 0, - 983213, 0, 0, 11521, 0, 1966, 43628, 111048, 0, 0, 0, 0, 0, 0, 42098, - 66671, 10694, 128520, 0, 0, 0, 0, 42100, 0, 111040, 0, 42097, 0, 0, 0, 0, - 11302, 120893, 129145, 43395, 83259, 0, 0, 92351, 0, 0, 11299, 1561, 0, - 92359, 92725, 93021, 0, 194733, 0, 0, 0, 127893, 11280, 0, 0, 983783, 0, - 0, 72760, 0, 12486, 65018, 66516, 5409, 0, 0, 194720, 5399, 9685, 0, - 983694, 5401, 0, 0, 66832, 0, 0, 5405, 0, 0, 0, 0, 0, 2235, 0, 11330, - 983692, 64690, 3254, 0, 0, 0, 0, 43678, 0, 0, 983145, 0, 6388, 3355, 0, - 9867, 0, 55258, 5611, 0, 128527, 0, 0, 129181, 0, 78228, 0, 0, 119119, 0, - 0, 194959, 0, 0, 1379, 246, 0, 0, 64736, 0, 0, 0, 121227, 0, 0, 0, 0, 0, - 0, 11855, 0, 0, 0, 0, 10656, 0, 65214, 119242, 0, 0, 13163, 0, 120831, 0, - 0, 0, 0, 0, 0, 0, 0, 4755, 0, 127879, 11443, 0, 0, 0, 608, 600, 0, 8580, - 128712, 0, 43635, 0, 0, 74485, 43808, 0, 0, 0, 13160, 0, 129418, 42268, - 128006, 70505, 9828, 0, 0, 0, 0, 9351, 7778, 0, 0, 0, 6916, 1208, 0, 0, - 194754, 0, 0, 0, 0, 0, 83318, 83317, 0, 43539, 0, 0, 0, 0, 0, 9150, - 66831, 0, 128322, 0, 66848, 0, 0, 12166, 128492, 194685, 0, 2546, 0, 213, - 0, 65611, 83316, 0, 0, 74310, 70836, 0, 65285, 5452, 0, 0, 92772, 0, 0, - 0, 0, 65518, 129029, 12609, 194679, 125255, 123193, 0, 0, 0, 74638, - 194677, 125190, 4143, 110854, 110855, 65748, 4141, 9682, 110851, 118790, - 194674, 0, 0, 8725, 0, 66638, 0, 42263, 4145, 6380, 0, 66613, 0, 119207, - 0, 0, 9550, 100621, 0, 100623, 100622, 78050, 100624, 65753, 100626, - 65756, 72731, 0, 100630, 0, 0, 0, 0, 9657, 9019, 121154, 0, 0, 5390, 0, - 0, 194965, 72144, 194964, 0, 6328, 0, 0, 0, 0, 0, 983047, 0, 5235, 803, - 0, 0, 0, 127979, 43838, 0, 119562, 43544, 0, 0, 0, 0, 0, 70426, 9107, - 5191, 119113, 0, 0, 0, 121099, 0, 0, 0, 0, 0, 128150, 983067, 0, 7289, - 74055, 0, 0, 0, 0, 0, 0, 0, 1784, 124947, 0, 0, 0, 0, 64868, 0, 13158, 0, - 7211, 0, 9371, 129378, 0, 0, 1625, 7664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4482, 118886, 0, 0, 0, 0, 0, 0, 0, 100612, 66849, 100614, 100613, 100616, - 444, 100618, 100617, 100620, 100619, 0, 0, 0, 11349, 40991, 0, 0, 129324, - 0, 0, 1197, 0, 40993, 0, 0, 0, 40990, 43765, 0, 3492, 0, 127942, 0, 0, - 100592, 100591, 100594, 19948, 100596, 3099, 92239, 100597, 100600, - 100599, 0, 129042, 0, 0, 100601, 194969, 100603, 8152, 100605, 100604, - 100607, 100606, 100609, 12828, 0, 75015, 0, 0, 0, 0, 0, 75068, 127507, 0, - 92680, 0, 0, 0, 0, 0, 0, 0, 118820, 0, 0, 0, 0, 0, 100581, 0, 100583, - 100582, 100585, 100584, 100587, 100586, 100589, 7576, 11995, 100590, - 43260, 0, 0, 64830, 0, 125046, 0, 0, 43979, 8870, 0, 0, 42357, 0, 0, - 12822, 0, 0, 0, 118944, 0, 0, 42637, 0, 0, 70725, 0, 194748, 0, 71344, 0, - 0, 0, 194749, 7170, 9596, 8277, 194743, 43629, 110610, 0, 0, 983567, - 128691, 0, 66699, 64440, 0, 0, 0, 43234, 66008, 12627, 0, 0, 0, 43619, - 43303, 11300, 0, 0, 8745, 0, 7558, 71342, 100570, 0, 0, 127881, 3461, - 121258, 129471, 0, 0, 0, 0, 73877, 74335, 124982, 0, 0, 0, 64620, 74762, - 12069, 10838, 92548, 43616, 0, 10061, 0, 125057, 10508, 209, 0, 43193, - 120581, 0, 0, 128049, 0, 10899, 69855, 100571, 100574, 100573, 100576, - 993, 100578, 100577, 100580, 100579, 100560, 100559, 7232, 0, 0, 0, 0, 0, - 0, 10489, 42166, 0, 128588, 0, 0, 4224, 7671, 41518, 121311, 0, 0, 0, 0, - 64820, 92538, 12966, 100554, 100553, 100556, 100555, 100558, 100557, - 4263, 8793, 0, 0, 41502, 0, 983, 0, 100563, 100562, 13086, 4109, 4274, - 841, 5888, 100568, 68522, 0, 43481, 0, 120926, 0, 7209, 0, 41505, 0, - 78698, 127012, 0, 2147, 0, 0, 66629, 0, 0, 1255, 4149, 0, 0, 66633, 0, 0, - 92352, 0, 65101, 0, 0, 0, 0, 5835, 128797, 66625, 10842, 0, 42123, 0, 0, - 66634, 1094, 66636, 0, 0, 0, 0, 0, 9972, 73865, 129289, 6114, 0, 0, 0, 0, - 93960, 0, 0, 0, 0, 12070, 0, 881, 7857, 0, 65164, 0, 0, 0, 0, 0, 64404, - 64321, 0, 125187, 0, 0, 11245, 129395, 0, 71859, 0, 0, 0, 1287, 121509, - 0, 0, 0, 125264, 74152, 120504, 64545, 0, 69668, 8985, 0, 0, 0, 0, 0, 0, - 3652, 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, 1489, 125189, 0, 0, 3899, 0, 42124, - 43828, 42122, 0, 0, 0, 11985, 73755, 78600, 0, 0, 10988, 0, 0, 42138, - 78610, 0, 65768, 78608, 78604, 78605, 6285, 78603, 78612, 78613, 74339, - 65767, 8685, 0, 0, 0, 78622, 78623, 68475, 11470, 64538, 78618, 78615, - 78616, 0, 0, 0, 0, 2527, 0, 128209, 2799, 0, 0, 0, 9933, 0, 0, 767, 5524, - 7028, 0, 0, 0, 0, 0, 78633, 0, 0, 94011, 0, 6971, 0, 70731, 0, 0, 118979, - 126075, 2434, 94018, 0, 120579, 0, 4631, 0, 0, 6407, 0, 19931, 0, 0, 0, - 0, 3192, 0, 8414, 0, 0, 0, 0, 0, 9164, 66612, 93959, 8228, 0, 0, 0, 0, - 78624, 0, 0, 9993, 0, 0, 129350, 78631, 78632, 78629, 78630, 78627, + 0, 41714, 0, 0, 0, 6343, 0, 0, 43996, 0, 8044, 0, 0, 41789, 0, 10809, + 71953, 0, 0, 0, 8146, 11025, 0, 120513, 642, 0, 0, 0, 12875, 0, 0, 13229, + 71950, 41788, 0, 0, 0, 41791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8428, 6569, + 0, 0, 0, 0, 10167, 0, 68248, 8049, 0, 0, 0, 0, 128882, 4761, 0, 4766, + 64623, 0, 121180, 194653, 118876, 0, 6912, 9232, 7033, 0, 0, 41545, 0, + 71970, 72160, 72107, 0, 0, 0, 3484, 0, 0, 0, 8503, 41539, 41527, 0, 0, + 983823, 0, 0, 0, 41537, 0, 41541, 8282, 11817, 129965, 128219, 0, 0, + 126132, 0, 0, 70115, 66609, 111235, 65921, 0, 0, 194664, 0, 129326, + 77970, 42246, 75030, 120605, 0, 65926, 7744, 68859, 94056, 74277, 126108, + 0, 6966, 194633, 8136, 0, 0, 0, 0, 0, 4762, 0, 0, 0, 4765, 69443, 983585, + 0, 4760, 0, 0, 10871, 43199, 194645, 0, 93955, 0, 0, 11546, 0, 337, 0, 0, + 0, 12279, 7768, 0, 128352, 0, 69812, 10143, 7883, 121444, 7880, 64618, + 13012, 5704, 13010, 0, 0, 119531, 0, 0, 0, 0, 66654, 0, 0, 0, 13008, 0, + 4385, 0, 13011, 0, 92569, 119161, 13009, 74771, 70159, 0, 0, 41793, 0, + 74221, 120996, 41792, 111242, 94054, 126094, 0, 111244, 5709, 120689, + 71076, 0, 0, 0, 0, 0, 5708, 0, 0, 0, 5706, 66362, 5705, 8791, 41797, 0, + 10237, 66436, 0, 0, 0, 0, 128083, 13170, 0, 127075, 0, 0, 41377, 0, 0, + 10058, 125225, 101431, 0, 0, 0, 0, 0, 0, 129641, 119525, 0, 0, 72350, 0, + 983584, 2144, 0, 120765, 0, 0, 1754, 92226, 13246, 864, 0, 118926, 8972, + 0, 7849, 0, 0, 13240, 0, 5192, 0, 0, 10948, 0, 13199, 0, 1236, 13208, + 13261, 13189, 13188, 93993, 0, 7440, 0, 0, 0, 1844, 125229, 0, 13178, 0, + 0, 0, 125230, 0, 0, 13260, 4550, 121249, 125227, 0, 71071, 0, 0, 68523, + 0, 0, 11354, 94071, 0, 42795, 129317, 0, 0, 0, 125237, 0, 13194, 13274, + 0, 0, 129533, 65586, 68311, 0, 119193, 4601, 194661, 101454, 194658, 0, + 194659, 0, 121422, 128790, 194657, 41717, 67402, 101444, 121129, 41716, + 127376, 7910, 0, 0, 754, 41944, 0, 8183, 120741, 2037, 101440, 0, 101441, + 125, 0, 0, 0, 983124, 101442, 41719, 0, 7990, 12637, 13258, 9536, 71056, + 0, 4427, 0, 71200, 0, 12217, 0, 41532, 129315, 0, 0, 0, 0, 111063, 83349, + 0, 0, 120622, 0, 0, 0, 0, 43632, 0, 0, 8140, 0, 6260, 0, 0, 66765, + 129657, 0, 3898, 0, 0, 13200, 0, 0, 66582, 0, 0, 0, 0, 1068, 71178, + 13259, 12945, 0, 42203, 0, 3124, 69411, 0, 4386, 12224, 6973, 129563, 0, + 0, 119535, 0, 121312, 0, 12232, 0, 0, 5681, 64578, 75023, 72016, 13209, + 0, 0, 0, 0, 0, 11053, 0, 74902, 128107, 128942, 7588, 0, 1693, 74942, + 43204, 65831, 0, 0, 0, 68803, 111216, 111223, 0, 0, 65685, 9523, 2243, 0, + 0, 0, 0, 0, 0, 0, 0, 13191, 0, 3500, 3139, 100643, 3170, 100645, 100644, + 100647, 100646, 13006, 64433, 0, 100650, 941, 0, 0, 120967, 3727, 0, 0, + 0, 0, 0, 0, 0, 94039, 129299, 92455, 0, 0, 64444, 0, 0, 43603, 94075, + 65397, 288, 0, 0, 0, 10025, 73692, 0, 0, 68182, 0, 0, 0, 92438, 65395, 0, + 0, 0, 65393, 83078, 121111, 0, 0, 0, 0, 0, 65394, 11548, 72305, 0, 65396, + 0, 0, 13256, 1282, 0, 0, 0, 111085, 0, 0, 0, 111087, 72115, 0, 0, 0, 0, + 0, 3304, 0, 0, 0, 126595, 72437, 68353, 0, 0, 42113, 0, 0, 0, 0, 0, + 43094, 0, 0, 94037, 68317, 9035, 0, 0, 0, 0, 0, 70822, 128467, 164, + 68309, 94067, 94000, 100631, 100634, 100633, 100636, 100635, 100638, + 100637, 68808, 100639, 110665, 73893, 11099, 110664, 13175, 13207, 0, + 127552, 0, 74643, 5929, 0, 0, 129192, 0, 11306, 0, 119059, 3180, 125102, + 0, 0, 0, 13062, 0, 129551, 128707, 0, 0, 74428, 0, 128000, 0, 11251, + 70204, 0, 10045, 0, 13275, 0, 11057, 0, 13276, 125133, 41525, 983084, + 128015, 11444, 0, 129158, 0, 0, 41523, 127765, 0, 0, 0, 0, 0, 0, 0, 3858, + 0, 119573, 0, 0, 0, 0, 0, 0, 101014, 369, 74908, 41784, 0, 120994, 0, + 71180, 0, 0, 13210, 41782, 0, 0, 101388, 41781, 10486, 74058, 43002, 0, + 0, 0, 0, 0, 3741, 0, 0, 0, 0, 41222, 0, 128317, 3982, 0, 4388, 126105, + 746, 0, 0, 0, 13131, 0, 0, 0, 0, 0, 10434, 8794, 0, 0, 0, 0, 0, 0, 11700, + 4374, 0, 0, 0, 0, 0, 0, 917597, 0, 69814, 0, 6735, 73979, 13174, 73968, + 13225, 0, 69808, 0, 0, 2365, 7841, 71476, 0, 120934, 66510, 128099, 0, 0, + 0, 41785, 41171, 0, 13173, 4372, 0, 0, 0, 0, 128939, 0, 0, 12965, 384, 0, + 0, 12685, 41473, 0, 13242, 13236, 0, 0, 0, 41787, 0, 70684, 0, 68486, + 13272, 0, 13232, 13233, 65838, 0, 0, 11656, 0, 126110, 119885, 12861, 0, + 13271, 0, 92737, 1096, 0, 0, 0, 0, 0, 0, 0, 5203, 0, 92902, 0, 13243, + 13237, 12719, 0, 0, 0, 64884, 78043, 43052, 0, 0, 0, 12014, 0, 101415, 0, + 0, 13195, 41452, 64961, 41535, 0, 10459, 0, 124949, 0, 0, 0, 41533, + 66337, 0, 92184, 0, 126091, 0, 0, 73849, 0, 43638, 0, 101398, 6261, 0, + 129568, 0, 1957, 0, 0, 0, 13292, 13206, 0, 0, 2925, 73809, 42576, 101395, + 13212, 43238, 0, 13190, 13187, 0, 13198, 0, 0, 5242, 0, 0, 128146, 0, 0, + 6770, 43331, 127539, 0, 0, 71074, 126466, 0, 41444, 0, 0, 64799, 5246, + 119106, 13185, 9709, 0, 0, 92751, 0, 5238, 0, 71085, 0, 5236, 40979, 0, + 74201, 8286, 0, 3936, 0, 11699, 0, 127249, 13235, 69578, 41248, 127264, + 13245, 13239, 0, 7969, 127266, 74832, 127251, 0, 120509, 0, 983874, 734, + 127270, 0, 127254, 70297, 127273, 64921, 120969, 66631, 41771, 120490, 0, + 983171, 41770, 1670, 42560, 0, 121349, 129634, 0, 41163, 0, 11136, 0, + 11506, 0, 42841, 13267, 126109, 0, 41775, 0, 7130, 41773, 0, 0, 0, 0, 0, + 0, 0, 42673, 65572, 0, 65250, 13265, 13264, 64518, 66798, 6100, 0, 0, + 6740, 71080, 67814, 12967, 70028, 68101, 4583, 0, 0, 68097, 0, 0, 0, 0, + 119211, 0, 0, 42653, 83181, 68102, 0, 7814, 71045, 0, 73702, 0, 0, 0, + 9756, 6985, 0, 0, 74219, 0, 0, 129069, 124987, 5674, 0, 66421, 0, 5677, + 5588, 0, 0, 0, 0, 5673, 0, 5676, 0, 94048, 0, 5672, 6476, 0, 0, 110951, + 42511, 1727, 0, 0, 0, 0, 0, 0, 0, 3550, 736, 0, 4505, 5873, 74090, 5826, + 55232, 5813, 0, 120712, 5841, 5837, 55234, 0, 3105, 64370, 5838, 5796, 0, + 119592, 5793, 0, 5866, 5797, 41011, 5865, 0, 0, 71899, 0, 71235, 5806, 0, + 0, 9037, 5671, 0, 0, 0, 0, 71266, 126616, 7296, 0, 0, 0, 0, 6980, 0, + 72108, 0, 0, 0, 0, 0, 64613, 983891, 0, 129969, 0, 78277, 7114, 0, 72100, + 43190, 93842, 128666, 72096, 42611, 42563, 0, 125080, 0, 6792, 43201, + 72098, 0, 128719, 0, 72106, 0, 0, 5644, 0, 66627, 69727, 0, 0, 0, 65116, + 0, 0, 0, 0, 66410, 94104, 41013, 0, 0, 0, 2869, 0, 41015, 0, 2785, + 120616, 0, 73907, 194689, 0, 0, 0, 194688, 4759, 0, 0, 43192, 129913, + 1170, 43365, 69810, 73908, 0, 902, 0, 0, 0, 0, 8122, 66420, 129642, 0, + 3861, 0, 11028, 0, 73820, 5714, 0, 0, 0, 807, 127001, 0, 0, 976, 113782, + 0, 0, 0, 0, 0, 128657, 118801, 71043, 0, 127017, 0, 0, 5582, 0, 0, 5798, + 0, 0, 0, 128521, 0, 0, 68058, 120553, 983183, 0, 0, 74933, 74283, 0, 0, + 194698, 66044, 0, 0, 0, 0, 0, 10094, 0, 0, 10857, 69225, 0, 0, 93, 0, + 10954, 0, 0, 0, 8171, 0, 0, 82996, 0, 0, 0, 119001, 92634, 0, 0, 5187, + 120711, 71086, 0, 0, 0, 0, 5232, 0, 41009, 0, 41005, 0, 43205, 0, 0, 0, + 194708, 0, 71054, 10028, 66478, 7076, 13182, 100385, 0, 0, 0, 0, 7972, + 78786, 0, 0, 0, 78789, 11309, 3806, 73985, 0, 0, 0, 78819, 0, 125218, 0, + 127532, 0, 0, 0, 78817, 0, 64366, 65156, 8814, 0, 0, 0, 0, 12836, 42725, + 120079, 0, 0, 0, 0, 69258, 13255, 0, 0, 7464, 0, 93831, 0, 0, 0, 0, + 13213, 0, 0, 64516, 0, 0, 0, 41007, 983910, 0, 40995, 12209, 983914, + 119136, 123635, 0, 0, 0, 0, 0, 69283, 43558, 5522, 0, 71061, 0, 74105, + 3633, 983912, 119364, 41234, 41231, 0, 9771, 983917, 13251, 0, 0, 6262, + 2784, 0, 71078, 8126, 66483, 0, 0, 441, 0, 0, 0, 41002, 40999, 0, 129394, + 7108, 0, 10890, 0, 74445, 8324, 0, 0, 74817, 2813, 119056, 74853, 983671, + 0, 0, 0, 1193, 10462, 65197, 13253, 13252, 7829, 120992, 130032, 0, 0, 0, + 77911, 0, 77907, 0, 10386, 0, 41042, 0, 65944, 65683, 10338, 66469, 0, 0, + 0, 0, 0, 41966, 0, 0, 0, 68915, 0, 0, 911, 983870, 128932, 40963, 0, + 65159, 0, 0, 0, 5520, 0, 0, 0, 0, 0, 0, 0, 71081, 0, 0, 0, 0, 0, 983873, + 0, 0, 66839, 0, 0, 0, 68647, 0, 5857, 68135, 92727, 119120, 983675, + 13171, 0, 0, 0, 120338, 0, 0, 0, 13250, 69663, 0, 92201, 66397, 0, 0, 0, + 8761, 12942, 5748, 92713, 92414, 0, 83174, 8796, 0, 0, 0, 43633, 0, + 72805, 71073, 0, 0, 0, 0, 0, 12843, 4520, 0, 0, 73004, 983672, 0, 0, + 194935, 110754, 64345, 0, 0, 3457, 0, 0, 0, 110750, 110758, 110751, 0, 0, + 10427, 0, 73859, 0, 9755, 1110, 65239, 0, 0, 0, 0, 0, 0, 0, 194936, 0, + 983802, 0, 70437, 3620, 0, 0, 72855, 0, 0, 0, 74250, 0, 0, 11980, 0, + 66482, 67823, 0, 128345, 110768, 0, 0, 0, 0, 12891, 983767, 983648, 0, + 2016, 0, 65668, 92311, 67696, 10366, 70117, 9155, 120652, 9786, 65082, 0, + 8579, 0, 0, 0, 0, 4508, 64883, 0, 92522, 129847, 0, 64592, 74276, 67688, + 0, 69270, 0, 69456, 0, 113821, 0, 12147, 9024, 66378, 66472, 0, 0, 0, 0, + 0, 71935, 0, 0, 113697, 0, 0, 69285, 0, 74275, 0, 122896, 127941, 41214, + 0, 0, 0, 0, 0, 7773, 0, 0, 9963, 68649, 0, 73734, 0, 0, 0, 0, 6594, + 983752, 0, 0, 3624, 70342, 0, 64655, 121481, 0, 0, 0, 0, 0, 65932, 0, + 983790, 6803, 120968, 7738, 0, 0, 120628, 0, 66614, 122921, 0, 43810, + 7029, 0, 41292, 118898, 0, 43115, 9517, 11518, 0, 0, 0, 0, 64423, 0, 0, + 0, 12503, 9591, 4516, 0, 118845, 0, 0, 129479, 43650, 983192, 69250, 0, + 0, 68079, 0, 11397, 2884, 0, 0, 12678, 0, 0, 41014, 73730, 917539, 4270, + 92254, 127836, 68205, 6633, 118947, 0, 5230, 101055, 0, 0, 983230, + 121392, 0, 92985, 0, 0, 0, 0, 415, 0, 0, 0, 0, 5183, 1877, 0, 0, 0, 0, 0, + 4472, 0, 0, 0, 128285, 110682, 78230, 4756, 0, 7081, 0, 0, 0, 78606, 0, + 42922, 42103, 8628, 74861, 0, 0, 0, 43059, 10539, 0, 0, 0, 0, 0, 0, 0, 0, + 64873, 11992, 129444, 0, 0, 11801, 3622, 0, 0, 983213, 0, 0, 11521, 0, + 1966, 43628, 111048, 0, 0, 0, 0, 0, 0, 42098, 66671, 10694, 128520, 0, 0, + 0, 0, 42100, 0, 111040, 0, 42097, 0, 0, 0, 0, 11302, 120893, 129145, + 43395, 83259, 0, 0, 92351, 0, 0, 11299, 1561, 0, 92359, 92725, 69253, 0, + 194733, 0, 0, 0, 127893, 11280, 0, 0, 983783, 0, 0, 72760, 0, 12486, + 65018, 66516, 5409, 0, 0, 194720, 5399, 9685, 0, 983694, 5401, 0, 0, + 66832, 0, 0, 5405, 0, 0, 0, 0, 0, 2235, 0, 11330, 983692, 64690, 3254, 0, + 129974, 0, 0, 43678, 0, 0, 983145, 0, 6388, 3355, 0, 9867, 0, 55258, + 5611, 0, 128527, 0, 0, 129181, 0, 78228, 0, 0, 119119, 0, 0, 194959, 0, + 0, 1379, 246, 0, 0, 64736, 0, 0, 0, 121227, 0, 0, 0, 0, 0, 0, 11855, 0, + 0, 0, 71961, 10656, 0, 65214, 119242, 0, 0, 13163, 0, 120831, 0, 0, + 101484, 0, 0, 0, 0, 0, 4755, 0, 127879, 11443, 0, 0, 0, 608, 600, 0, + 8580, 128712, 0, 43635, 0, 129695, 74485, 43808, 0, 0, 0, 13160, 0, + 129418, 42268, 128006, 70505, 9828, 0, 69261, 0, 0, 9351, 7778, 0, 0, 0, + 6916, 1208, 0, 0, 194754, 0, 0, 0, 0, 0, 83318, 83317, 0, 43539, 0, + 72024, 0, 0, 0, 9150, 66831, 0, 128322, 0, 66848, 0, 0, 12166, 128492, + 194685, 0, 2546, 0, 213, 0, 65611, 83316, 0, 0, 74310, 70836, 0, 65285, + 5452, 0, 0, 92772, 0, 0, 0, 0, 65518, 129029, 12609, 194679, 125255, + 123193, 0, 0, 0, 74638, 194677, 125190, 4143, 110854, 110855, 65748, + 4141, 9682, 110851, 118790, 194674, 0, 0, 8725, 0, 66638, 0, 42263, 4145, + 6380, 0, 66613, 0, 119207, 0, 0, 9550, 100621, 0, 100623, 100622, 78050, + 100624, 65753, 100626, 65756, 72731, 0, 100630, 0, 0, 0, 0, 9657, 9019, + 121154, 0, 0, 5390, 0, 0, 194965, 72144, 194964, 69286, 6328, 0, 0, 0, 0, + 0, 983047, 0, 5235, 803, 69289, 0, 0, 127979, 43838, 0, 119562, 43544, 0, + 0, 0, 0, 0, 70426, 9107, 5191, 119113, 0, 0, 0, 121099, 0, 0, 0, 0, 0, + 128150, 983067, 0, 7289, 74055, 0, 0, 0, 0, 0, 0, 0, 1784, 124947, 0, 0, + 0, 0, 64868, 0, 13158, 0, 7211, 0, 9371, 129378, 0, 0, 1625, 7664, 0, 0, + 0, 0, 0, 0, 69273, 0, 0, 0, 0, 4482, 118886, 0, 0, 0, 0, 0, 0, 0, 100612, + 66849, 100614, 100613, 100616, 444, 100618, 100617, 100620, 100619, 0, 0, + 0, 11349, 40991, 0, 0, 129324, 0, 0, 1197, 0, 40993, 0, 0, 0, 40990, + 43765, 0, 3492, 0, 127942, 0, 0, 100592, 100591, 100594, 19948, 100596, + 3099, 92239, 100597, 100600, 100599, 0, 129042, 0, 0, 100601, 194969, + 100603, 8152, 100605, 100604, 100607, 100606, 100609, 12828, 0, 75015, 0, + 0, 129950, 0, 0, 75068, 127507, 0, 92680, 0, 0, 129928, 129920, 0, + 130037, 0, 118820, 0, 0, 0, 0, 0, 100581, 0, 100583, 100582, 100585, + 100584, 100587, 100586, 100589, 7576, 11995, 100590, 43260, 0, 0, 64830, + 0, 125046, 101526, 0, 43979, 8870, 0, 0, 42357, 0, 0, 12822, 0, 0, 0, + 118944, 0, 0, 42637, 0, 0, 70725, 0, 129934, 0, 71344, 0, 0, 0, 194745, + 7170, 9596, 8277, 194743, 43629, 110610, 0, 0, 983571, 128691, 0, 66699, + 42952, 0, 0, 0, 43234, 66008, 12627, 0, 0, 0, 43619, 43303, 11300, 0, 0, + 8745, 0, 7558, 71342, 100570, 0, 0, 127881, 3461, 121258, 129471, 69264, + 0, 0, 0, 73877, 74335, 124982, 0, 0, 0, 64620, 74762, 12069, 10838, + 92548, 43616, 0, 10061, 0, 125057, 10508, 209, 0, 43193, 120581, 0, 0, + 128049, 0, 10899, 69855, 100571, 100574, 100573, 100576, 993, 100578, + 100577, 100580, 100579, 100560, 100559, 7232, 0, 0, 0, 0, 0, 0, 10489, + 42166, 0, 128588, 0, 0, 4224, 7671, 41518, 121311, 0, 0, 0, 0, 64820, + 92538, 12966, 100554, 100553, 100556, 100555, 100558, 100557, 4263, 8793, + 0, 0, 41502, 0, 983, 0, 100563, 100562, 13086, 4109, 4274, 841, 5888, + 100568, 68522, 0, 43481, 0, 120926, 0, 7209, 0, 41505, 0, 78698, 127012, + 0, 2147, 0, 0, 66629, 0, 0, 1255, 4149, 0, 0, 66633, 0, 129391, 92352, 0, + 65101, 0, 0, 0, 0, 5835, 128797, 66625, 10842, 0, 42123, 0, 0, 66634, + 1094, 66636, 0, 0, 0, 0, 0, 9972, 73865, 129289, 6114, 0, 0, 0, 0, 93960, + 0, 0, 0, 0, 12070, 0, 881, 7857, 0, 65164, 0, 0, 0, 0, 0, 64404, 64321, + 0, 125187, 0, 0, 11245, 129395, 0, 71859, 0, 0, 0, 1287, 121509, 0, 0, 0, + 125264, 74152, 120504, 64545, 0, 69668, 8985, 0, 0, 0, 0, 0, 0, 3652, 0, + 0, 0, 0, 0, 279, 0, 0, 0, 0, 1489, 125189, 0, 0, 3899, 0, 42124, 43828, + 42122, 0, 0, 0, 11985, 73755, 78600, 0, 0, 10988, 0, 0, 42138, 78610, 0, + 65768, 78608, 78604, 78605, 6285, 78603, 78612, 78613, 74339, 65767, + 8685, 0, 0, 0, 78622, 78623, 68475, 11470, 64538, 78618, 78615, 78616, 0, + 0, 0, 101534, 2527, 0, 128209, 2799, 0, 0, 0, 9933, 0, 0, 767, 5524, + 7028, 0, 101520, 0, 0, 0, 78633, 0, 0, 94011, 0, 6971, 0, 70731, 0, 0, + 118979, 126075, 2434, 94018, 0, 120579, 0, 4631, 0, 0, 6407, 0, 19931, 0, + 0, 0, 0, 3192, 0, 8414, 0, 0, 0, 0, 0, 9164, 66612, 93959, 8228, 0, 0, 0, + 0, 78624, 0, 0, 9993, 0, 0, 129350, 78631, 78632, 78629, 78630, 78627, 78628, 78625, 2399, 0, 92399, 71202, 41208, 0, 0, 8178, 2149, 3367, 0, 78640, 78641, 78636, 78638, 78634, 6337, 0, 92342, 0, 0, 11068, 0, 9331, 0, 74798, 9181, 0, 0, 8017, 0, 0, 0, 0, 0, 0, 0, 12126, 129184, 129306, - 0, 0, 69650, 0, 0, 0, 43436, 983725, 0, 0, 0, 0, 66845, 0, 0, 0, 5398, 0, - 127386, 93953, 0, 0, 0, 0, 0, 9476, 68899, 0, 12763, 0, 74788, 0, 42114, - 11181, 92502, 0, 0, 0, 3469, 42107, 42116, 0, 0, 0, 0, 9853, 69648, 9040, - 0, 64665, 119557, 0, 0, 0, 69638, 12602, 983068, 3852, 0, 67872, 12231, - 11317, 0, 119812, 0, 11410, 10964, 12274, 122890, 100524, 0, 119810, - 9865, 195019, 0, 0, 0, 0, 12276, 0, 0, 0, 0, 119613, 0, 111214, 10467, 0, - 2443, 10918, 0, 0, 1001, 9241, 1927, 0, 0, 0, 127885, 195022, 0, 113752, - 119830, 65678, 0, 0, 8260, 0, 7519, 11505, 119182, 0, 518, 0, 119832, 0, - 13204, 0, 857, 121252, 0, 0, 92336, 83177, 0, 0, 0, 0, 0, 0, 92762, 0, 0, - 120613, 67247, 1629, 0, 796, 0, 0, 74123, 72334, 127587, 72336, 43388, 0, - 43944, 72335, 478, 65151, 0, 128147, 0, 0, 0, 0, 0, 42933, 1206, 71209, - 43837, 0, 3843, 12011, 0, 3361, 0, 8121, 10715, 7578, 0, 0, 0, 10530, - 12348, 8653, 0, 0, 0, 9551, 0, 0, 784, 0, 0, 0, 0, 0, 0, 43937, 0, 0, - 43938, 43935, 73765, 66230, 0, 0, 0, 43936, 0, 43932, 11102, 0, 0, 42753, - 67165, 0, 78324, 0, 0, 6975, 917928, 5415, 12176, 0, 0, 3462, 43940, - 42629, 78691, 128016, 43942, 0, 9759, 0, 0, 78320, 8114, 78321, 78697, - 78696, 78695, 8710, 0, 118956, 0, 4051, 92657, 0, 71206, 0, 0, 0, 128857, - 0, 1619, 9703, 77986, 0, 42112, 0, 1875, 0, 42109, 0, 0, 71189, 121160, - 64907, 5396, 13144, 0, 0, 5575, 9675, 0, 5940, 226, 0, 6336, 0, 0, 0, - 5116, 64521, 0, 0, 0, 121390, 125048, 74138, 0, 74139, 128447, 92249, 0, - 0, 0, 0, 8935, 0, 0, 0, 0, 616, 78131, 65178, 4684, 78701, 983880, 74631, - 0, 0, 0, 74460, 42110, 0, 10870, 8557, 11054, 68664, 0, 0, 0, 0, 0, 0, 0, - 0, 65597, 0, 7651, 6846, 0, 0, 68868, 0, 0, 118966, 129302, 40997, - 127218, 0, 0, 40998, 0, 74488, 71182, 9800, 0, 0, 0, 41000, 0, 5114, - 55263, 3386, 70730, 42574, 0, 5115, 5394, 0, 128756, 5113, 0, 64855, 0, - 4425, 0, 0, 0, 43967, 0, 0, 0, 5112, 12173, 127037, 0, 0, 74998, 0, 0, 0, - 0, 0, 64874, 43964, 1587, 0, 0, 0, 0, 1369, 917931, 9959, 0, 43963, 4560, - 0, 0, 0, 0, 0, 0, 43961, 42601, 4514, 72149, 0, 0, 0, 65041, 10965, - 120905, 0, 0, 12542, 0, 65341, 0, 65829, 0, 0, 10475, 0, 0, 0, 0, 11795, - 0, 0, 0, 127102, 127101, 74956, 7099, 11275, 67681, 127096, 0, 9336, 0, - 42626, 43966, 7798, 64474, 64259, 0, 5730, 119809, 43018, 0, 93796, 0, 0, - 0, 69401, 0, 0, 5127, 11285, 0, 5495, 4273, 0, 74765, 10849, 6346, 5493, - 6342, 68636, 74319, 5492, 0, 0, 169, 5497, 125053, 0, 0, 68198, 0, 0, - 128417, 0, 0, 12738, 0, 983076, 5321, 0, 0, 0, 5323, 120732, 9773, - 125209, 4683, 74318, 0, 68823, 0, 0, 0, 0, 129553, 0, 0, 0, 0, 834, 0, - 1803, 0, 5733, 0, 0, 71312, 5731, 1381, 2891, 0, 0, 0, 64525, 0, 2881, - 92996, 93847, 9601, 2879, 0, 0, 73129, 5729, 0, 0, 0, 64881, 127905, - 9361, 0, 2887, 0, 3526, 6298, 0, 0, 0, 0, 0, 8572, 127863, 77896, 0, - 71174, 0, 0, 71197, 0, 12096, 0, 0, 0, 110745, 71176, 110746, 65279, 0, - 121236, 5734, 0, 0, 0, 0, 0, 41641, 12717, 0, 12552, 983615, 66713, 0, 0, - 41643, 110747, 0, 8713, 41640, 78657, 41645, 66712, 125196, 0, 66726, - 66711, 0, 93994, 0, 3472, 64863, 0, 121424, 0, 0, 0, 125203, 67837, 0, 0, - 0, 0, 0, 0, 121440, 0, 0, 129461, 119008, 92402, 65017, 0, 0, 66668, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121043, 66471, 12216, 0, - 40988, 0, 0, 0, 0, 0, 2396, 129078, 0, 0, 0, 64940, 0, 8321, 119823, - 128165, 100409, 83299, 996, 0, 0, 4249, 0, 83294, 92535, 8222, 0, 118875, - 71213, 0, 0, 0, 0, 8534, 72844, 40983, 0, 125195, 0, 12551, 73960, - 125193, 74469, 12558, 121039, 0, 10052, 40982, 129371, 0, 0, 0, 127403, - 0, 917559, 0, 0, 1563, 0, 0, 19911, 0, 0, 0, 71363, 0, 7797, 78708, - 10006, 0, 3308, 119134, 74940, 0, 0, 78488, 0, 0, 0, 0, 0, 128462, 9200, - 10046, 9612, 0, 8218, 66496, 0, 43742, 78489, 0, 0, 0, 0, 67826, 0, - 70056, 508, 128585, 0, 126539, 0, 0, 0, 0, 0, 0, 0, 124950, 0, 0, 0, 0, - 0, 0, 6659, 0, 0, 0, 0, 0, 0, 41634, 0, 41639, 71169, 11941, 0, 0, 0, - 42180, 68505, 43753, 3249, 41637, 93982, 12328, 501, 93985, 10601, 0, - 6503, 0, 92192, 0, 71181, 0, 6505, 74010, 0, 13064, 126112, 121105, 6500, - 5526, 0, 0, 0, 0, 92376, 0, 9678, 120832, 0, 41706, 0, 0, 0, 8936, 92964, - 119123, 4208, 0, 0, 0, 67742, 0, 74379, 128605, 0, 0, 92422, 983109, 0, - 66475, 0, 5027, 0, 0, 0, 5069, 0, 5028, 0, 0, 0, 5026, 0, 0, 6331, 0, 0, - 0, 0, 41076, 0, 74790, 0, 0, 0, 0, 5029, 0, 5317, 3598, 0, 41070, 92166, - 11185, 6663, 0, 6507, 0, 126079, 0, 1716, 983691, 0, 917824, 620, 41001, - 0, 917823, 43758, 0, 71116, 5024, 0, 41003, 0, 5025, 7297, 0, 75039, 0, - 119328, 65557, 0, 0, 983599, 0, 0, 0, 0, 43947, 43946, 0, 0, 128363, - 6105, 0, 119325, 983226, 0, 68203, 43945, 66491, 43939, 0, 68144, 78718, - 2301, 0, 0, 66490, 6979, 0, 7721, 0, 0, 1592, 0, 0, 121096, 41048, - 129358, 829, 0, 92406, 0, 120247, 0, 41056, 0, 0, 10953, 41066, 0, - 917813, 482, 0, 0, 0, 43606, 71185, 0, 0, 0, 72262, 110863, 72421, 12050, - 0, 5315, 917817, 0, 0, 42061, 917816, 0, 0, 68417, 917815, 0, 0, 42059, - 0, 0, 120723, 42058, 3960, 11043, 11337, 121358, 0, 0, 3958, 0, 0, - 917818, 0, 917819, 0, 0, 42064, 11959, 983695, 0, 0, 0, 0, 128498, 64336, - 10478, 92629, 70350, 120704, 0, 0, 42437, 1555, 0, 8691, 129656, 2215, - 41662, 119046, 0, 0, 0, 93952, 0, 66481, 41664, 0, 42578, 0, 41661, - 78715, 78714, 9356, 0, 129544, 0, 1286, 110701, 0, 0, 983206, 128925, - 42476, 0, 11156, 0, 0, 0, 0, 72123, 0, 10020, 43359, 72827, 0, 120946, - 41627, 0, 11979, 0, 41628, 533, 11931, 65225, 0, 125122, 0, 0, 68118, 0, - 4377, 0, 0, 8587, 72097, 13193, 64350, 68233, 0, 41924, 0, 7735, 0, - 127585, 120843, 0, 65820, 0, 0, 43461, 7757, 0, 0, 43787, 66493, 77943, - 4168, 43904, 73952, 0, 0, 121072, 4440, 43902, 77948, 66837, 77946, - 43903, 77944, 77945, 0, 120909, 120826, 120226, 66492, 43901, 64625, 0, - 0, 0, 0, 10013, 64434, 0, 983112, 0, 11782, 64382, 0, 0, 0, 0, 41630, - 630, 120960, 0, 0, 70165, 1043, 93017, 0, 0, 0, 124945, 313, 129590, 0, - 0, 65593, 7445, 43906, 5750, 42258, 0, 55222, 68222, 11268, 11225, 0, - 8526, 0, 0, 43894, 66495, 69990, 0, 92990, 0, 10707, 7863, 0, 0, 70692, - 631, 77952, 77953, 66443, 71171, 83313, 0, 0, 0, 13305, 77961, 43925, - 43924, 77956, 77957, 66903, 66328, 42381, 77962, 0, 0, 0, 0, 0, 0, 43899, - 66821, 77967, 9157, 77965, 77966, 77963, 77964, 0, 0, 180, 73904, 0, 0, - 66494, 12674, 43896, 0, 0, 43890, 43897, 0, 11535, 0, 66769, 5185, 7165, - 5521, 10334, 5519, 71329, 10302, 12351, 83333, 1027, 5181, 0, 5117, 0, - 5179, 73955, 6845, 991, 5189, 43676, 41647, 0, 73883, 92571, 77979, 3405, - 0, 0, 5523, 43915, 66487, 92459, 74943, 9549, 0, 125093, 43923, 0, 43682, - 74884, 120537, 0, 43921, 0, 71184, 0, 43922, 128709, 0, 10414, 9846, 0, - 10350, 0, 43918, 77981, 75075, 77978, 77980, 66485, 77977, 77973, 77974, - 78057, 43909, 73983, 12330, 0, 0, 0, 43910, 0, 3407, 6293, 0, 68149, - 43908, 129060, 0, 10209, 0, 4195, 0, 9010, 983686, 75072, 6332, 0, 0, - 65871, 0, 1736, 0, 3901, 0, 0, 65890, 128801, 10446, 0, 693, 9130, 314, - 78119, 64149, 0, 0, 0, 11026, 0, 5332, 6940, 0, 0, 127007, 119831, 0, - 273, 8165, 0, 83307, 0, 0, 12824, 43911, 4528, 5320, 6301, 43662, 6133, - 0, 9463, 73738, 127141, 10922, 121069, 0, 0, 0, 0, 0, 2569, 0, 2326, 0, - 2565, 0, 66401, 0, 0, 0, 0, 41848, 2567, 78620, 121145, 4044, 92646, 0, - 12233, 0, 9509, 0, 0, 127158, 7336, 0, 0, 0, 0, 0, 67235, 0, 0, 0, 0, - 2222, 66499, 0, 127170, 0, 10895, 0, 274, 983763, 1858, 0, 67849, 55251, - 0, 3133, 0, 71857, 0, 9610, 0, 8197, 0, 0, 0, 41665, 5868, 0, 0, 72120, - 0, 19940, 43668, 41667, 0, 0, 1923, 0, 0, 0, 0, 0, 0, 0, 0, 6464, 92750, - 2996, 125221, 0, 68481, 41835, 4047, 41842, 0, 0, 129601, 0, 0, 0, 0, - 293, 0, 0, 64791, 41827, 0, 0, 10579, 8560, 0, 0, 118835, 4803, 73805, - 1739, 0, 3900, 128967, 73737, 0, 0, 73957, 0, 66474, 41971, 0, 0, 0, 0, - 0, 11716, 66473, 0, 121071, 0, 128080, 0, 0, 0, 0, 0, 0, 0, 6632, 73861, - 0, 74770, 0, 0, 8914, 0, 0, 3183, 1435, 0, 0, 0, 0, 0, 0, 5746, 67392, 0, - 0, 0, 83506, 0, 7082, 71481, 12618, 5059, 983597, 83524, 43604, 0, 0, 0, - 0, 0, 0, 8227, 0, 1218, 0, 64416, 65848, 92884, 0, 0, 0, 126987, 0, 0, 0, - 0, 0, 0, 83515, 83507, 0, 0, 42672, 71194, 43224, 0, 0, 0, 0, 0, 0, 0, - 65905, 0, 42662, 0, 121159, 0, 129536, 0, 7794, 0, 0, 6377, 0, 126080, - 3669, 3968, 0, 71319, 69658, 129550, 0, 66296, 0, 0, 0, 0, 124998, 6699, + 0, 0, 69650, 0, 0, 0, 43436, 983725, 0, 0, 0, 0, 66845, 69249, 0, 0, + 5398, 0, 127386, 93953, 0, 0, 0, 0, 0, 9476, 68899, 0, 12763, 0, 74788, + 0, 42114, 11181, 92502, 0, 0, 0, 3469, 42107, 42116, 0, 0, 0, 0, 9853, + 69648, 9040, 101518, 64665, 119557, 0, 0, 0, 69638, 12602, 983068, 3852, + 0, 67872, 12231, 11317, 0, 119812, 0, 11410, 10964, 12274, 122890, + 100524, 0, 119810, 9865, 195019, 0, 0, 0, 0, 12276, 0, 0, 0, 0, 119613, + 0, 111214, 10467, 0, 2443, 10918, 0, 0, 1001, 9241, 1927, 0, 0, 0, + 127885, 195022, 0, 113752, 119830, 65678, 0, 0, 8260, 0, 7519, 11505, + 101505, 0, 518, 0, 119832, 0, 13204, 0, 857, 121252, 0, 0, 92336, 83177, + 0, 0, 0, 0, 0, 0, 92762, 0, 0, 120613, 67247, 1629, 0, 796, 0, 0, 74123, + 72334, 127587, 72336, 43388, 0, 43944, 72335, 478, 65151, 0, 128147, 0, + 0, 0, 0, 0, 42933, 1206, 71209, 43837, 0, 3843, 12011, 0, 3361, 0, 8121, + 10715, 7578, 0, 0, 0, 10530, 12348, 8653, 0, 0, 0, 9551, 0, 0, 784, 0, 0, + 0, 0, 0, 0, 43937, 0, 0, 43938, 43935, 73765, 66230, 0, 0, 0, 43936, 0, + 43932, 11102, 0, 0, 42753, 67165, 0, 78324, 0, 0, 6975, 917928, 5415, + 12176, 0, 0, 3462, 43940, 42629, 78691, 128016, 43942, 0, 9759, 0, 0, + 78320, 8114, 78321, 78697, 78696, 78695, 8710, 0, 118956, 0, 4051, 92657, + 0, 71206, 0, 0, 0, 128857, 0, 1619, 9703, 77986, 0, 42112, 0, 1875, 0, + 42109, 0, 0, 71189, 121160, 64907, 5396, 13144, 0, 0, 5575, 9675, 0, + 5940, 226, 0, 6336, 0, 0, 0, 5116, 64521, 0, 0, 0, 121390, 125048, 74138, + 0, 74139, 128447, 92249, 0, 0, 0, 0, 8935, 0, 0, 0, 0, 616, 78131, 65178, + 4684, 78701, 983880, 74631, 0, 0, 0, 74460, 42110, 0, 10870, 8557, 11054, + 68664, 0, 0, 0, 0, 0, 0, 0, 0, 65597, 0, 7651, 6846, 0, 0, 68868, 0, 0, + 118966, 129302, 40997, 127218, 0, 0, 40998, 0, 74488, 71182, 9800, 0, 0, + 0, 41000, 0, 5114, 55263, 3386, 70730, 42574, 0, 5115, 5394, 0, 128756, + 5113, 0, 64855, 0, 4425, 0, 0, 0, 43967, 0, 0, 0, 5112, 12173, 127037, 0, + 0, 74998, 0, 0, 0, 0, 0, 64874, 43964, 1587, 0, 0, 0, 0, 1369, 917931, + 9959, 0, 43963, 4560, 0, 0, 0, 0, 0, 0, 43961, 42601, 4514, 72149, 0, 0, + 0, 65041, 10965, 120905, 0, 0, 12542, 0, 65341, 0, 65829, 0, 0, 10475, 0, + 0, 0, 0, 11795, 0, 0, 0, 127102, 127101, 74956, 7099, 11275, 67681, + 127096, 0, 9336, 0, 42626, 43966, 7798, 64474, 64259, 0, 5730, 119809, + 43018, 983174, 93796, 0, 0, 0, 69401, 0, 0, 5127, 11285, 0, 5495, 4273, + 0, 74765, 10849, 6346, 5493, 6342, 68636, 74319, 5492, 0, 0, 169, 5497, + 125053, 0, 0, 68198, 0, 0, 128417, 0, 0, 12738, 0, 983076, 5321, 0, 0, 0, + 5323, 120732, 9773, 125209, 4683, 74318, 0, 68823, 0, 0, 0, 0, 129553, 0, + 0, 0, 0, 834, 0, 1803, 0, 5733, 0, 0, 71312, 5731, 1381, 2891, 0, 0, 0, + 64525, 0, 2881, 92996, 93847, 9601, 2879, 0, 0, 73129, 5729, 0, 0, 0, + 64881, 127905, 9361, 0, 2887, 0, 3526, 6298, 0, 121219, 0, 0, 0, 8572, + 127863, 77896, 0, 71174, 0, 0, 71197, 0, 12096, 0, 0, 0, 110745, 71176, + 110746, 65279, 0, 121236, 5734, 0, 0, 0, 0, 0, 41641, 12717, 0, 12552, + 983615, 66713, 0, 0, 41643, 110747, 0, 8713, 41640, 78657, 41645, 66712, + 125196, 0, 66726, 66711, 0, 93994, 0, 3472, 64863, 0, 121424, 0, 0, 0, + 125203, 67837, 0, 0, 0, 0, 0, 0, 121440, 0, 0, 129461, 119008, 92402, + 65017, 0, 0, 66668, 0, 0, 0, 0, 0, 119822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 121043, 66471, 12216, 0, 40988, 0, 0, 0, 0, 0, 2396, 129078, 0, 0, 0, + 64940, 0, 8321, 119823, 128165, 100409, 83299, 996, 0, 0, 4249, 0, 83294, + 92535, 8222, 0, 118875, 71213, 0, 0, 0, 0, 8534, 72844, 40983, 0, 125195, + 0, 12551, 73960, 125193, 74469, 12558, 121039, 0, 10052, 40982, 129371, + 0, 0, 0, 127403, 0, 917559, 0, 78364, 1563, 0, 0, 19911, 0, 0, 0, 71363, + 0, 7797, 78708, 10006, 0, 3308, 119134, 74940, 0, 0, 78488, 0, 0, 0, 0, + 0, 128462, 9200, 10046, 9612, 0, 8218, 66496, 0, 43742, 78489, 0, 0, 0, + 0, 67826, 0, 70056, 508, 128585, 0, 126539, 0, 0, 0, 0, 0, 0, 0, 124950, + 0, 194601, 0, 0, 0, 0, 6659, 0, 0, 0, 0, 0, 0, 41634, 0, 41639, 71169, + 11941, 0, 0, 0, 42180, 68505, 43753, 3249, 41637, 93982, 12328, 501, + 93985, 10601, 0, 6503, 0, 92192, 0, 71181, 0, 6505, 74010, 0, 13064, + 126112, 121105, 6500, 5526, 0, 128949, 0, 0, 92376, 0, 9678, 120832, 0, + 41706, 0, 0, 0, 8936, 92964, 119123, 4208, 0, 0, 0, 67742, 0, 74379, + 128605, 0, 0, 92422, 983109, 0, 66475, 0, 5027, 0, 0, 0, 5069, 0, 5028, + 0, 0, 0, 5026, 0, 0, 6331, 0, 0, 0, 0, 41076, 0, 74790, 0, 0, 0, 0, 5029, + 0, 5317, 3598, 0, 41070, 92166, 11185, 6663, 0, 6507, 0, 126079, 0, 1716, + 983691, 0, 917824, 620, 41001, 0, 917823, 43758, 0, 71116, 5024, 0, + 41003, 0, 5025, 7297, 0, 75039, 0, 119328, 65557, 0, 0, 983599, 0, 0, 0, + 0, 43947, 43946, 0, 0, 128363, 6105, 0, 119325, 983226, 0, 68203, 43945, + 66491, 43939, 0, 68144, 78718, 2301, 0, 0, 66490, 6979, 0, 7721, 0, 0, + 1592, 0, 0, 121096, 41048, 129358, 829, 0, 92406, 0, 120247, 0, 41056, 0, + 0, 10953, 41066, 0, 917813, 482, 101554, 0, 0, 43606, 71185, 0, 0, 0, + 72262, 110863, 72421, 12050, 0, 5315, 917817, 0, 0, 42061, 917816, 0, 0, + 68417, 917815, 0, 0, 42059, 0, 0, 120723, 42058, 3960, 11043, 11337, + 121358, 0, 0, 3958, 101568, 0, 917818, 0, 917819, 0, 0, 42064, 11959, + 983695, 0, 0, 0, 0, 128498, 64336, 10478, 92629, 70350, 120704, 0, 0, + 42437, 1555, 0, 8691, 129656, 2215, 41662, 119046, 0, 0, 0, 93952, 0, + 66481, 41664, 0, 42578, 0, 41661, 78715, 78714, 9356, 0, 129544, 0, 1286, + 110701, 0, 0, 983206, 128925, 42476, 0, 11156, 0, 0, 0, 101583, 72123, 0, + 10020, 43359, 72827, 0, 120946, 41627, 0, 11979, 0, 41628, 533, 11931, + 65225, 0, 125122, 129994, 0, 68118, 0, 4377, 0, 0, 8587, 72097, 13193, + 64350, 68233, 0, 41924, 0, 7735, 0, 127585, 120843, 0, 65820, 0, 0, + 43461, 7757, 0, 0, 43787, 66493, 77943, 4168, 43904, 73952, 0, 0, 121072, + 4440, 43902, 77948, 66837, 77946, 43903, 77944, 77945, 0, 120909, 120826, + 120226, 66492, 43901, 64625, 0, 0, 0, 0, 10013, 64434, 0, 983112, 0, + 11782, 64382, 0, 0, 0, 0, 41630, 630, 120960, 0, 0, 70165, 1043, 93017, + 0, 0, 0, 124945, 313, 129590, 0, 0, 65593, 7445, 43906, 5750, 42258, 0, + 55222, 68222, 11268, 11225, 0, 8526, 0, 0, 43894, 66495, 69990, 0, 92990, + 0, 10707, 7863, 0, 0, 70692, 631, 77952, 77953, 66443, 71171, 83313, 0, + 0, 0, 13305, 77961, 43925, 43924, 77956, 77957, 66903, 66328, 42381, + 77962, 0, 0, 0, 0, 0, 0, 43899, 66821, 77967, 9157, 77965, 77966, 77963, + 77964, 0, 0, 180, 73904, 0, 0, 66494, 12674, 43896, 0, 0, 43890, 43897, + 0, 11535, 0, 66769, 5185, 7165, 5521, 10334, 5519, 71329, 10302, 12351, + 83333, 1027, 5181, 0, 5117, 0, 5179, 73955, 6845, 991, 3332, 43676, + 41647, 0, 73883, 92571, 77979, 3405, 69572, 0, 5523, 43915, 66487, 92459, + 74943, 9549, 0, 125093, 43923, 0, 43682, 74884, 120537, 0, 43921, 0, + 71184, 0, 43922, 128709, 0, 10414, 9846, 0, 10350, 0, 43918, 77981, + 75075, 77978, 77980, 66485, 77977, 77973, 77974, 78057, 43909, 73983, + 12330, 0, 0, 0, 43910, 69291, 3407, 6293, 0, 68149, 43908, 129060, 0, + 10209, 0, 4195, 0, 9010, 983686, 75072, 6332, 0, 0, 65871, 0, 1736, 0, + 3901, 0, 0, 65890, 128801, 10446, 0, 693, 9130, 314, 78119, 64149, 0, 0, + 0, 11026, 0, 5332, 6940, 0, 0, 127007, 119831, 0, 273, 8165, 0, 83307, 0, + 0, 12824, 43911, 4528, 5320, 6301, 43662, 6133, 0, 9463, 73738, 127141, + 10922, 121069, 0, 0, 0, 0, 0, 2569, 0, 2326, 0, 2565, 0, 66401, 0, 0, 0, + 0, 41848, 2567, 78620, 121145, 4044, 92646, 0, 12233, 0, 9509, 0, 0, + 127158, 7336, 0, 0, 0, 129598, 0, 67235, 0, 0, 0, 0, 2222, 66499, 0, + 127170, 0, 10895, 0, 274, 983763, 1858, 0, 67849, 55251, 0, 3133, 0, + 71857, 0, 9610, 0, 8197, 0, 0, 0, 41665, 5868, 0, 0, 72120, 0, 19940, + 43668, 41667, 0, 0, 1923, 0, 0, 0, 0, 0, 0, 0, 0, 6464, 92750, 2996, + 125221, 0, 68481, 41835, 4047, 41842, 0, 0, 129601, 0, 0, 0, 0, 293, 0, + 0, 64791, 41827, 0, 0, 10579, 8560, 0, 0, 118835, 4803, 73805, 1739, 0, + 3900, 128967, 73737, 0, 0, 73957, 0, 66474, 41971, 0, 0, 0, 0, 0, 11716, + 66473, 0, 121071, 0, 128080, 0, 0, 0, 0, 0, 0, 0, 6632, 73861, 0, 74770, + 0, 0, 8914, 0, 0, 3183, 1435, 0, 0, 0, 0, 0, 0, 5746, 67392, 0, 0, 0, + 83506, 0, 7082, 71481, 12618, 5059, 983597, 83524, 43604, 0, 0, 0, 0, 0, + 0, 8227, 0, 1218, 0, 64416, 65848, 92884, 0, 0, 0, 126987, 0, 0, 0, 0, 0, + 0, 83515, 83507, 0, 0, 42672, 71194, 43224, 0, 0, 0, 0, 0, 0, 0, 65905, + 0, 42662, 0, 121159, 0, 129536, 0, 7794, 0, 42953, 6377, 0, 126080, 3669, + 3968, 0, 71319, 69658, 129550, 0, 66296, 0, 0, 0, 0, 124998, 6699, 126120, 0, 0, 66678, 0, 0, 0, 8409, 119527, 19967, 0, 0, 9502, 0, 0, 6115, 0, 41654, 0, 0, 0, 41655, 113779, 43975, 72427, 0, 0, 0, 0, 41657, - 10778, 0, 9533, 184, 1553, 128868, 0, 0, 0, 0, 0, 0, 0, 0, 73697, 0, - 92480, 0, 128938, 74292, 0, 5157, 4020, 0, 128154, 43788, 64818, 0, 0, 0, - 92979, 0, 0, 74377, 11029, 66651, 0, 0, 125202, 0, 0, 7877, 121070, 0, 0, - 127953, 2810, 9955, 0, 0, 42817, 0, 65122, 11715, 0, 0, 0, 71270, 0, 0, - 0, 0, 0, 70199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78222, 127981, 0, 0, 0, 0, - 0, 11290, 0, 0, 0, 0, 8315, 0, 0, 0, 74595, 0, 0, 0, 42531, 0, 0, 0, - 74589, 43993, 0, 0, 0, 0, 43690, 0, 119139, 42730, 0, 0, 0, 64926, 0, 0, - 43830, 65257, 0, 42728, 0, 128697, 123150, 0, 43540, 0, 0, 12725, 72993, - 78635, 127826, 223, 0, 69675, 0, 0, 0, 0, 0, 0, 42605, 0, 0, 0, 0, 0, 0, - 0, 0, 78621, 0, 78619, 119062, 0, 0, 0, 42676, 129353, 64800, 78617, - 83504, 68126, 1213, 0, 0, 797, 0, 0, 83021, 83005, 64387, 4115, 0, 0, 0, - 0, 10679, 83001, 121091, 0, 64276, 83498, 13168, 983710, 0, 10136, 0, 0, - 65088, 0, 4262, 0, 0, 0, 10701, 0, 3101, 0, 123204, 0, 0, 11373, 0, 0, 0, - 9117, 0, 0, 4539, 0, 0, 12727, 0, 0, 0, 43684, 74567, 68877, 983707, - 12724, 73940, 0, 0, 0, 0, 0, 7947, 12003, 0, 74593, 121140, 69653, 74807, - 42018, 0, 0, 0, 65888, 0, 0, 69683, 0, 120306, 0, 0, 12595, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 69848, 68307, 0, 4405, 0, 128336, 129032, 69216, 0, - 0, 0, 0, 6817, 67400, 120314, 0, 0, 998, 0, 13105, 120313, 64327, 1558, - 0, 1991, 7882, 0, 0, 0, 530, 0, 0, 0, 12002, 0, 68422, 0, 10979, 0, - 41823, 70696, 0, 0, 7896, 0, 66676, 0, 120325, 0, 0, 129407, 94033, 0, - 6311, 110725, 41698, 0, 12049, 78133, 0, 125020, 41705, 0, 0, 121298, 0, - 66822, 0, 65389, 0, 66027, 0, 0, 41699, 8340, 0, 69776, 0, 128639, 0, - 1988, 5407, 69978, 0, 65912, 93059, 0, 2336, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 126238, 0, 19913, 0, 113733, 0, 0, 74279, 0, 10956, 0, 41674, 19964, - 41679, 65084, 41675, 195031, 0, 0, 0, 0, 983089, 0, 10794, 128961, 13217, - 0, 0, 0, 5280, 0, 0, 12905, 41610, 11532, 0, 0, 768, 120545, 442, 0, 0, - 0, 64081, 41682, 0, 41693, 0, 77993, 77994, 0, 4804, 6994, 0, 0, 0, - 41696, 467, 983915, 0, 0, 0, 0, 8678, 0, 69682, 64801, 0, 0, 0, 0, 64093, - 12043, 0, 69666, 0, 2029, 65191, 119246, 42847, 0, 0, 0, 0, 0, 0, 0, - 70339, 126116, 0, 0, 8019, 73856, 0, 0, 0, 0, 2355, 12150, 65725, 77988, - 77989, 68033, 77987, 0, 77985, 0, 0, 68388, 0, 74171, 0, 0, 0, 11301, - 78013, 78008, 78010, 9874, 78007, 983326, 71064, 3050, 0, 0, 0, 78016, - 78017, 71852, 78015, 0, 0, 0, 92242, 0, 69642, 0, 0, 0, 0, 0, 0, 78025, - 0, 78023, 78024, 11847, 10545, 0, 10887, 0, 123179, 0, 0, 0, 83352, - 64942, 92363, 9996, 8508, 0, 0, 8195, 0, 42171, 0, 3722, 0, 63751, 0, 0, - 92637, 69670, 0, 41552, 69854, 0, 78639, 0, 0, 129374, 128978, 0, 0, 0, - 7920, 70285, 4021, 0, 0, 0, 119663, 0, 0, 78021, 78022, 78019, 78020, - 1802, 78018, 0, 74895, 41659, 41671, 1827, 0, 64396, 41668, 128524, - 41673, 0, 11422, 71846, 0, 11370, 0, 68412, 41345, 0, 0, 0, 0, 0, 0, - 65114, 0, 2104, 64858, 0, 0, 7553, 0, 41560, 11970, 0, 917920, 0, 68495, - 74131, 74130, 0, 0, 0, 611, 74129, 64871, 0, 0, 0, 0, 74854, 0, 70466, 0, - 0, 0, 121147, 0, 68487, 41669, 7094, 917921, 0, 123144, 74054, 0, 0, 0, - 839, 0, 7695, 0, 0, 0, 92202, 0, 121053, 123157, 67885, 0, 7206, 0, 6647, - 43986, 0, 0, 0, 0, 0, 0, 127936, 43748, 66746, 0, 12298, 110802, 983992, - 110800, 64924, 0, 73931, 9468, 74245, 0, 0, 74246, 0, 0, 118830, 0, - 71851, 1279, 0, 6224, 0, 92405, 128601, 0, 128997, 0, 0, 0, 5032, 0, 0, - 0, 0, 0, 5034, 0, 0, 72846, 42702, 0, 0, 13294, 0, 64869, 0, 67808, 9129, - 123632, 0, 0, 120819, 68387, 120168, 120169, 120170, 120171, 5518, 4174, - 120166, 120167, 120160, 120161, 120162, 434, 41437, 66212, 120158, - 120159, 0, 0, 118867, 0, 524, 0, 74029, 0, 126559, 0, 0, 0, 10355, 10419, - 74025, 77847, 0, 69725, 0, 120656, 0, 67876, 0, 0, 0, 74145, 74039, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5445, 0, 93779, 71855, 7391, 8989, 0, 74068, 0, - 0, 0, 0, 4962, 0, 8855, 0, 70820, 0, 0, 0, 0, 71847, 0, 0, 0, 10451, 0, + 10778, 0, 9533, 184, 1553, 128868, 69574, 0, 0, 0, 129420, 0, 0, 0, + 73697, 0, 92480, 0, 128938, 74292, 0, 5157, 4020, 0, 128154, 43788, + 64818, 0, 0, 0, 92979, 0, 0, 74377, 11029, 66651, 0, 0, 125202, 0, 0, + 7877, 121070, 101411, 0, 119828, 2810, 9955, 0, 0, 42817, 0, 65122, + 11715, 0, 0, 0, 71270, 0, 0, 0, 0, 0, 70199, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 78222, 127981, 0, 0, 0, 0, 0, 11290, 0, 0, 0, 0, 8315, 0, 0, 0, 74595, + 0, 0, 0, 42531, 0, 0, 0, 74589, 43993, 0, 0, 0, 0, 43690, 0, 119139, + 42730, 0, 0, 0, 64926, 0, 0, 43830, 65257, 0, 42728, 0, 128697, 123150, + 0, 43540, 0, 0, 12725, 72993, 78635, 127826, 223, 0, 69675, 0, 0, 0, 0, + 0, 0, 42605, 0, 0, 0, 0, 0, 0, 0, 0, 78621, 0, 78619, 119062, 0, 0, 0, + 42676, 129353, 64800, 78617, 83504, 68126, 1213, 0, 0, 797, 0, 0, 83021, + 83005, 64387, 4115, 0, 0, 0, 129857, 10679, 83001, 121091, 0, 64276, + 83498, 13168, 83011, 0, 10136, 0, 0, 65088, 0, 4262, 129866, 0, 0, 10701, + 0, 3101, 0, 123204, 0, 0, 11373, 0, 0, 12731, 9117, 0, 0, 4539, 0, 0, + 12727, 0, 0, 0, 43684, 74567, 68877, 983707, 12724, 73940, 0, 0, 0, 0, 0, + 7947, 12003, 0, 74593, 121140, 69653, 74807, 42018, 0, 0, 0, 65888, 0, 0, + 69683, 0, 120306, 0, 0, 12595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69848, + 68307, 0, 4405, 0, 128336, 129032, 69216, 0, 128011, 0, 0, 6817, 67400, + 120314, 0, 0, 998, 0, 13105, 120313, 64327, 1558, 0, 1991, 7882, 0, 0, 0, + 530, 0, 0, 0, 12002, 0, 68422, 0, 10979, 0, 41823, 70696, 0, 0, 7896, 0, + 66676, 0, 120325, 0, 0, 129407, 94033, 0, 6311, 110725, 41698, 0, 12049, + 78133, 0, 125020, 41705, 0, 0, 121298, 0, 66822, 0, 65389, 0, 66027, 0, + 0, 41699, 8340, 0, 69776, 0, 128639, 0, 1988, 5407, 69978, 0, 65912, + 93059, 0, 2336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126238, 0, 19913, 0, 113733, + 0, 0, 74279, 0, 10956, 0, 41674, 19964, 41679, 65084, 41675, 195031, 0, + 0, 0, 0, 983089, 0, 10794, 128961, 13217, 0, 0, 0, 5280, 0, 0, 12905, + 41610, 11532, 0, 0, 768, 120545, 442, 0, 0, 0, 64081, 41682, 0, 41693, 0, + 77993, 77994, 0, 4804, 6994, 983114, 0, 0, 41696, 467, 983915, 0, 0, 0, + 0, 8678, 0, 69682, 64801, 0, 0, 0, 0, 64093, 12043, 0, 69666, 0, 2029, + 65191, 119246, 42847, 0, 0, 0, 0, 0, 0, 0, 70339, 126116, 0, 0, 8019, + 73856, 0, 0, 0, 0, 2355, 12150, 65725, 77988, 77989, 68033, 77987, 0, + 77985, 0, 0, 68388, 0, 74171, 0, 0, 0, 11301, 78013, 78008, 78010, 9874, + 78007, 983326, 71064, 3050, 0, 0, 0, 78016, 78017, 71852, 78015, 0, 0, 0, + 92242, 0, 69642, 0, 0, 43883, 0, 0, 0, 78025, 0, 78023, 78024, 11847, + 10545, 0, 10887, 0, 123179, 0, 0, 0, 83352, 64942, 92363, 9996, 8508, 0, + 0, 8195, 0, 42171, 0, 3722, 0, 63751, 0, 0, 92637, 69670, 0, 41552, + 69854, 0, 78639, 0, 0, 129374, 128978, 0, 0, 0, 7920, 70285, 4021, 0, 0, + 0, 119663, 0, 0, 78021, 78022, 78019, 78020, 1802, 78018, 0, 74895, + 41659, 41671, 1827, 0, 64396, 41668, 128524, 41673, 0, 11422, 71846, 0, + 11370, 0, 68412, 41345, 0, 0, 0, 0, 0, 0, 65114, 0, 2104, 64858, 0, 0, + 7553, 0, 41560, 11970, 0, 917920, 0, 68495, 74131, 74130, 0, 0, 0, 611, + 74129, 64871, 129958, 0, 0, 0, 74854, 0, 70466, 0, 0, 0, 121147, 0, + 68487, 41669, 7094, 917921, 0, 123144, 74054, 0, 0, 0, 839, 0, 7695, 0, + 0, 0, 92202, 0, 121053, 123157, 67885, 0, 7206, 0, 6647, 43986, 0, 0, 0, + 0, 0, 0, 127936, 43748, 66746, 0, 12298, 110802, 983992, 110800, 64924, + 0, 73931, 9468, 74245, 0, 0, 74246, 0, 0, 118830, 0, 71851, 1279, 0, + 6224, 0, 92405, 128601, 129886, 128997, 0, 0, 0, 5032, 0, 0, 0, 0, 0, + 5034, 0, 0, 72846, 42702, 0, 0, 13294, 0, 64869, 0, 67808, 9129, 123632, + 0, 0, 120819, 68387, 120168, 120169, 120170, 120171, 5518, 4174, 120166, + 120167, 120160, 120161, 120162, 434, 41437, 66212, 120158, 120159, 0, 0, + 118867, 0, 524, 0, 74029, 0, 126559, 0, 0, 0, 10355, 10419, 74025, 77847, + 0, 69725, 0, 120656, 0, 67876, 0, 0, 0, 74145, 74039, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5445, 0, 93779, 71855, 7391, 8989, 0, 74068, 0, 0, 0, 0, + 4962, 983133, 8855, 0, 70820, 0, 0, 0, 0, 71847, 0, 0, 0, 10451, 0, 67653, 120153, 12443, 120155, 9947, 120149, 120150, 120151, 13128, 0, - 120146, 120147, 0, 0, 0, 0, 0, 0, 74059, 74062, 6217, 74053, 43846, 0, - 74049, 0, 0, 0, 0, 0, 0, 0, 0, 42595, 0, 68112, 118860, 0, 0, 92497, - 74949, 128953, 126245, 0, 0, 0, 129684, 0, 119251, 0, 0, 0, 0, 0, 6216, - 0, 0, 9455, 127027, 8124, 128851, 0, 6944, 0, 0, 0, 2828, 128550, 531, - 42638, 0, 0, 0, 43428, 0, 3614, 2827, 9696, 0, 0, 0, 4354, 0, 78562, + 120146, 120147, 0, 0, 0, 0, 0, 129715, 74059, 74062, 6217, 74053, 43846, + 0, 74049, 0, 0, 0, 0, 0, 0, 0, 0, 42595, 0, 68112, 118860, 0, 0, 92497, + 74949, 128953, 126245, 0, 0, 0, 42997, 0, 119251, 0, 0, 0, 0, 0, 6216, 0, + 0, 9455, 127027, 8124, 128851, 0, 6944, 0, 0, 0, 2828, 128550, 531, + 42638, 0, 0, 129888, 43428, 0, 3614, 2827, 9696, 0, 0, 0, 4354, 0, 78562, 78561, 0, 120691, 0, 42599, 42597, 0, 68829, 125012, 0, 127277, 0, 120421, 0, 983164, 0, 0, 10121, 120422, 74950, 123142, 69715, 0, 0, 120423, 120630, 12608, 125244, 0, 74144, 9700, 12580, 0, 128911, 0, @@ -27414,246 +28275,248 @@ static const unsigned int code_hash[] = { 0, 67682, 0, 120528, 122901, 74272, 0, 0, 0, 0, 69667, 0, 124933, 74456, 74302, 42589, 0, 0, 0, 0, 0, 0, 0, 0, 41508, 0, 323, 125211, 0, 42698, 8131, 0, 4625, 0, 4630, 0, 0, 0, 74316, 78417, 2668, 92483, 0, 42640, 0, - 2519, 0, 92474, 92479, 0, 983085, 5049, 42659, 119011, 0, 7754, 10854, - 8738, 74623, 0, 0, 0, 649, 0, 0, 0, 0, 0, 1013, 70707, 68212, 705, 0, 0, - 127803, 1183, 126519, 9320, 0, 0, 8157, 0, 0, 0, 0, 0, 0, 0, 11913, 0, - 42848, 0, 64925, 0, 0, 70693, 0, 0, 2051, 0, 0, 0, 0, 0, 0, 0, 8466, 0, - 4626, 8464, 8472, 68844, 4629, 8499, 0, 0, 4624, 194623, 0, 94025, 0, + 2519, 0, 92474, 92479, 0, 983085, 5049, 42659, 119011, 64705, 7754, + 10854, 8738, 74623, 0, 0, 0, 649, 0, 0, 0, 0, 0, 1013, 70707, 68212, 705, + 0, 0, 127803, 1183, 126519, 9320, 0, 0, 8157, 0, 0, 0, 0, 0, 0, 0, 11913, + 0, 42848, 0, 64925, 0, 0, 70693, 0, 0, 2051, 0, 0, 0, 0, 0, 0, 0, 8466, + 0, 4626, 8464, 8472, 68844, 4629, 8499, 0, 0, 4624, 194623, 0, 94025, 0, 7805, 0, 94007, 6935, 0, 0, 0, 0, 0, 0, 0, 8492, 0, 8459, 0, 8497, 8496, - 0, 0, 0, 0, 0, 0, 0, 0, 65849, 0, 0, 0, 12451, 3328, 8684, 0, 6102, 0, - 5298, 0, 5294, 0, 129615, 0, 0, 0, 0, 43617, 0, 0, 0, 0, 0, 77863, - 128695, 0, 0, 0, 0, 0, 5292, 0, 0, 42688, 5302, 3970, 0, 0, 1793, 0, 0, - 0, 0, 0, 65263, 0, 0, 0, 0, 0, 0, 13219, 9569, 0, 74383, 0, 0, 72157, 0, - 42949, 0, 0, 0, 5322, 0, 0, 43631, 5324, 0, 128694, 41614, 65269, 6230, - 0, 0, 0, 3360, 0, 11523, 72726, 92488, 9926, 7197, 0, 68429, 126575, - 41821, 1249, 0, 127951, 0, 123641, 0, 0, 0, 74459, 41807, 0, 41815, 0, 0, - 0, 0, 0, 128248, 0, 66835, 0, 0, 72145, 41800, 0, 0, 0, 41811, 74466, - 93966, 6670, 77882, 0, 0, 43092, 0, 0, 0, 0, 0, 128655, 0, 0, 0, 0, - 74501, 74005, 0, 74387, 69860, 315, 12813, 128556, 72409, 0, 72408, 0, 0, - 73061, 0, 0, 1378, 0, 0, 0, 72407, 3066, 0, 0, 72406, 0, 0, 0, 8787, - 194615, 0, 41618, 0, 0, 0, 194614, 64652, 194611, 42088, 125226, 0, 0, 0, - 0, 7176, 43756, 0, 0, 74492, 0, 74534, 0, 0, 0, 127199, 0, 128630, 74525, - 0, 194594, 12930, 7168, 74514, 0, 74515, 0, 128919, 43962, 9527, 120659, - 70123, 12977, 69723, 0, 93783, 194598, 41236, 92235, 65168, 118838, - 41237, 5848, 0, 194600, 3670, 194601, 0, 0, 0, 7890, 0, 11298, 0, 0, - 6229, 0, 0, 0, 194593, 128907, 0, 0, 0, 4120, 65337, 65336, 0, 0, 0, 0, - 9366, 0, 0, 0, 65327, 65326, 65325, 65324, 65323, 42216, 65321, 65320, - 65335, 65334, 65333, 65332, 65331, 65330, 65329, 42689, 0, 43943, 118885, - 42073, 6785, 68491, 0, 42076, 7196, 65318, 2035, 65316, 4106, 65314, - 65313, 42074, 0, 41228, 0, 0, 41241, 93786, 41239, 43533, 0, 7189, - 194602, 0, 43941, 0, 42802, 0, 8487, 0, 0, 4615, 12695, 0, 0, 12175, - 100414, 0, 0, 7809, 0, 0, 0, 0, 6590, 69762, 0, 64738, 0, 0, 0, 0, 0, 0, - 2025, 0, 0, 0, 10637, 71860, 0, 1570, 43839, 2835, 83052, 10624, 43623, - 194587, 0, 78433, 0, 42812, 0, 2825, 0, 128287, 0, 2821, 0, 92327, 7365, - 83043, 0, 68296, 0, 2823, 0, 0, 0, 2831, 0, 0, 11465, 0, 0, 0, 0, 0, - 7181, 0, 41332, 0, 12333, 0, 0, 0, 0, 0, 9883, 127294, 73906, 70751, 0, - 71863, 0, 0, 0, 0, 0, 0, 43741, 0, 8166, 70739, 0, 0, 74535, 0, 65297, - 68294, 571, 0, 8752, 0, 5288, 118822, 1541, 0, 127284, 8864, 0, 0, 0, 0, - 0, 113778, 12151, 0, 66874, 0, 1035, 0, 0, 7881, 701, 65936, 128493, 0, - 70462, 0, 11403, 0, 0, 82991, 0, 983142, 70472, 3994, 11421, 121217, - 127297, 127242, 127300, 70659, 127303, 0, 125205, 2855, 127828, 0, 41621, - 68214, 0, 0, 10654, 82945, 119226, 12164, 41623, 7906, 0, 74297, 7182, 0, - 83069, 0, 0, 0, 0, 121115, 0, 0, 747, 0, 92463, 12019, 43136, 0, 110861, - 0, 0, 8001, 0, 0, 69394, 0, 0, 0, 68373, 0, 0, 0, 128279, 0, 71915, 0, 0, - 7282, 94066, 0, 0, 0, 0, 0, 5286, 83061, 0, 3718, 0, 83057, 0, 194584, - 71905, 0, 128480, 0, 0, 0, 0, 9206, 82980, 113824, 6802, 0, 41653, 0, - 1241, 0, 0, 0, 0, 68124, 41651, 42937, 0, 83042, 41650, 0, 83037, 0, - 12914, 2814, 0, 119552, 0, 0, 0, 118900, 0, 0, 0, 917546, 71862, 0, 0, 0, - 3494, 10189, 69784, 0, 0, 71861, 0, 0, 65875, 0, 0, 127762, 0, 74215, - 43065, 0, 0, 7200, 0, 3261, 0, 0, 0, 65889, 71888, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 129424, 0, 635, 0, 0, 74753, 0, 92420, 73997, 0, 0, 43905, 0, - 118834, 126125, 0, 6667, 0, 983263, 0, 0, 125200, 0, 0, 0, 0, 83137, 0, - 0, 0, 0, 0, 121104, 127856, 125112, 71885, 0, 120125, 7866, 194573, - 92770, 194574, 0, 120140, 126074, 2849, 0, 0, 42157, 12960, 0, 11812, 0, - 74509, 0, 69881, 0, 0, 0, 123156, 7178, 0, 0, 0, 0, 129041, 11534, 1967, - 0, 0, 71361, 7015, 120298, 72757, 0, 12989, 0, 9368, 983638, 1624, 43270, - 0, 0, 10818, 0, 83091, 0, 120908, 0, 0, 0, 0, 0, 0, 6169, 12871, 0, 2798, - 65176, 4958, 42752, 119025, 0, 0, 0, 70346, 66448, 0, 113780, 68364, 0, - 0, 0, 68360, 0, 73746, 120945, 68352, 0, 73787, 83110, 2154, 7199, 64955, - 0, 0, 0, 0, 0, 66507, 0, 69853, 0, 0, 0, 0, 0, 0, 0, 92517, 118882, - 120301, 13297, 0, 129446, 0, 0, 0, 0, 6658, 8045, 0, 0, 983854, 92319, - 83101, 0, 72126, 0, 0, 0, 2416, 3310, 0, 0, 379, 0, 43755, 0, 0, 0, - 68362, 1284, 0, 73756, 0, 0, 83141, 70784, 0, 0, 0, 0, 8515, 83144, - 83143, 0, 0, 0, 8529, 93782, 0, 7564, 0, 0, 0, 0, 73757, 73760, 42359, 0, - 2031, 0, 7202, 0, 12676, 0, 0, 128418, 0, 7710, 1610, 73801, 0, 0, 0, - 983607, 43917, 0, 9974, 228, 0, 10398, 0, 0, 0, 92241, 70062, 118927, - 42999, 1725, 65533, 8196, 9352, 0, 0, 66868, 0, 8502, 5762, 0, 0, 43898, - 0, 0, 0, 0, 43914, 0, 126507, 64598, 13001, 9326, 83082, 43916, 1557, 0, - 983860, 6330, 6805, 8631, 2545, 70052, 0, 0, 0, 0, 70410, 0, 42762, 0, - 42914, 126516, 262, 1637, 0, 83025, 129491, 0, 128757, 0, 0, 0, 128922, - 0, 43658, 0, 0, 129183, 6419, 0, 0, 0, 0, 93989, 0, 0, 7194, 5291, 0, - 43666, 0, 0, 0, 0, 128293, 0, 12881, 123596, 0, 73842, 0, 9011, 0, 0, 0, - 70436, 179, 43644, 0, 0, 64747, 0, 118813, 0, 0, 121389, 0, 126629, 0, - 73850, 2801, 119837, 42069, 119839, 119838, 119841, 42072, 92736, 119842, - 0, 0, 0, 8377, 0, 42070, 119313, 119834, 119853, 4389, 43656, 1633, - 119857, 119856, 119859, 11119, 119845, 119844, 9967, 119846, 119849, - 4612, 119851, 119850, 42913, 70456, 0, 0, 10782, 66898, 0, 119141, 0, 0, - 0, 11541, 69636, 0, 0, 119614, 2731, 0, 0, 0, 4102, 0, 73878, 0, 0, 0, 0, - 0, 11283, 0, 0, 0, 0, 0, 43674, 0, 0, 126705, 0, 0, 0, 0, 11142, 128304, - 0, 12975, 0, 123208, 0, 0, 74072, 0, 55269, 0, 0, 0, 78577, 78576, 0, 0, - 82966, 82974, 70448, 0, 0, 82968, 0, 0, 0, 0, 0, 113809, 0, 69399, 64909, - 0, 11790, 74019, 0, 128066, 0, 8561, 94076, 129481, 125045, 0, 65674, - 7230, 0, 0, 8778, 0, 0, 67725, 2071, 0, 6459, 68325, 7628, 65092, 73903, - 0, 11342, 129388, 0, 0, 93965, 94081, 0, 11810, 70057, 10723, 967, 0, - 121116, 73905, 0, 6387, 0, 12307, 43913, 121089, 0, 127584, 0, 1886, 0, - 43895, 870, 7648, 0, 7662, 7652, 876, 871, 877, 7665, 878, 42015, 879, - 43692, 4563, 0, 0, 0, 73072, 867, 9520, 872, 7656, 868, 873, 7642, 7659, - 869, 874, 7644, 0, 875, 790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68452, 0, - 0, 42067, 0, 0, 0, 12292, 0, 0, 0, 42012, 0, 0, 83388, 0, 0, 8494, 4611, - 0, 72344, 0, 9679, 0, 0, 0, 0, 93015, 0, 74364, 4628, 4245, 0, 0, 0, - 1851, 0, 127189, 0, 0, 0, 118897, 0, 64674, 124971, 983868, 8829, 983674, - 128864, 0, 0, 0, 0, 8809, 983677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7427, 0, - 4588, 43680, 72300, 74484, 0, 0, 0, 0, 113787, 74363, 129043, 0, 793, 0, - 11197, 0, 0, 0, 842, 0, 8208, 70833, 0, 1647, 0, 70841, 0, 0, 818, 0, 0, - 0, 0, 0, 0, 120594, 0, 0, 70179, 0, 13167, 66359, 0, 127172, 0, 4969, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2840, 0, 0, 0, 66887, 65877, 9068, 0, 68194, 0, - 0, 12991, 0, 2651, 68016, 983896, 0, 983259, 70835, 0, 70844, 43648, 0, - 0, 0, 0, 0, 0, 64372, 121064, 7458, 655, 752, 7457, 7456, 7452, 3285, - 74894, 11152, 73099, 0, 2391, 93766, 92271, 671, 7435, 7434, 618, 668, - 610, 42800, 7431, 7451, 42801, 640, 42927, 7448, 7439, 628, 3905, 100742, - 0, 0, 0, 67850, 0, 0, 0, 4605, 0, 100745, 43372, 65945, 72710, 0, 119590, - 0, 0, 70495, 987, 71229, 11572, 0, 0, 10002, 9971, 70673, 0, 0, 0, 0, 0, - 0, 11334, 0, 129493, 42364, 11503, 0, 0, 0, 4627, 70090, 127784, 0, 0, - 74046, 68872, 92562, 0, 0, 0, 0, 0, 0, 0, 42569, 64965, 0, 0, 10516, 0, - 12190, 0, 42140, 0, 0, 0, 0, 9887, 0, 4000, 7429, 7428, 665, 7424, 0, 0, - 7884, 0, 0, 0, 0, 0, 2509, 0, 120573, 0, 0, 92449, 0, 10690, 0, 119114, - 126226, 0, 0, 73080, 4590, 0, 74440, 0, 0, 0, 1708, 0, 0, 983609, 0, 0, - 69226, 69974, 8813, 0, 1066, 0, 0, 0, 127921, 70447, 0, 0, 0, 72343, 0, - 7516, 0, 0, 0, 8034, 0, 0, 3631, 110696, 0, 0, 8416, 110694, 0, 0, 0, - 110692, 74621, 0, 70185, 0, 74850, 0, 0, 12099, 70475, 0, 6252, 0, 0, 0, - 0, 0, 0, 66368, 0, 64956, 7071, 129070, 70457, 128159, 118800, 0, 0, 0, - 9357, 0, 1773, 0, 125092, 0, 68451, 7745, 9844, 0, 0, 94, 1880, 120929, - 0, 0, 0, 0, 0, 0, 0, 0, 11237, 0, 129173, 0, 0, 0, 1757, 6964, 42480, - 72823, 0, 120806, 0, 0, 7731, 0, 0, 127883, 0, 110810, 43988, 70423, - 74758, 0, 7592, 856, 74299, 0, 0, 0, 78138, 1459, 0, 0, 0, 0, 0, 1504, 0, - 0, 0, 0, 7529, 0, 0, 0, 0, 12594, 0, 0, 336, 0, 7509, 0, 0, 0, 0, 127882, - 0, 0, 0, 65859, 0, 983967, 43062, 124948, 0, 0, 0, 0, 12970, 0, 0, 0, 0, - 0, 0, 0, 119247, 0, 65068, 74291, 0, 7069, 0, 0, 0, 11130, 2087, 0, 0, 0, - 0, 0, 0, 92747, 0, 92614, 2091, 0, 2090, 0, 0, 7117, 2077, 72281, 0, - 77889, 2083, 0, 71196, 0, 0, 92649, 0, 0, 0, 0, 4165, 8746, 0, 0, 0, 0, - 129572, 7066, 0, 70415, 128135, 0, 0, 7786, 127766, 2233, 0, 124965, - 121122, 2302, 0, 0, 7056, 0, 0, 0, 0, 0, 0, 126506, 6920, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 983099, 70438, 2613, 0, 0, 110734, 0, 74571, 42760, 0, 0, - 0, 0, 0, 0, 71843, 0, 0, 70506, 1246, 74243, 0, 0, 41008, 0, 0, 0, 921, - 70048, 0, 12702, 0, 0, 1566, 8407, 0, 64653, 0, 74617, 0, 0, 72711, 5313, - 951, 0, 0, 0, 0, 0, 4009, 70277, 71844, 0, 83123, 0, 72250, 0, 119898, - 113760, 0, 0, 0, 0, 70024, 0, 0, 119892, 0, 0, 0, 119890, 2579, 119906, - 3177, 11357, 69224, 0, 0, 83130, 64734, 0, 9822, 110670, 70471, 110668, - 0, 110666, 0, 0, 0, 0, 9851, 983729, 110673, 9059, 110671, 110672, 0, - 41687, 129054, 0, 71842, 70178, 0, 0, 1777, 0, 10158, 69767, 0, 42366, - 70444, 0, 0, 0, 70127, 83377, 5989, 110716, 74636, 126999, 0, 41685, 0, - 0, 9769, 41684, 0, 6225, 111328, 11740, 0, 118840, 0, 2600, 0, 70416, 0, - 0, 3666, 70420, 0, 0, 0, 0, 74542, 69771, 0, 0, 0, 0, 0, 69765, 0, 252, - 0, 69769, 0, 194616, 0, 69763, 0, 0, 0, 0, 0, 0, 0, 120947, 0, 129410, 0, - 0, 0, 68323, 125219, 0, 119188, 0, 0, 121335, 0, 0, 0, 0, 0, 7764, - 983726, 11094, 120825, 0, 0, 92505, 8298, 0, 0, 0, 0, 0, 64449, 0, - 126650, 0, 0, 0, 70442, 0, 0, 0, 0, 7774, 10607, 0, 0, 0, 0, 0, 120764, - 0, 0, 0, 0, 3458, 0, 70053, 0, 120995, 0, 2602, 0, 0, 0, 74907, 0, 0, 0, - 0, 172, 0, 4971, 70419, 1889, 7238, 0, 0, 0, 8257, 0, 0, 0, 129570, 0, - 111342, 983855, 0, 43366, 43363, 9807, 0, 0, 0, 72247, 64479, 0, 0, 0, - 113707, 0, 10900, 121355, 0, 0, 12048, 0, 64292, 0, 0, 0, 6099, 94084, - 129486, 0, 0, 299, 0, 8525, 92356, 0, 0, 111338, 0, 92564, 3075, 0, - 94053, 0, 94050, 0, 0, 70440, 0, 123590, 0, 0, 0, 2581, 11395, 0, 0, 0, - 0, 128584, 0, 0, 129423, 0, 118855, 0, 0, 0, 7204, 70065, 2588, 2914, - 7011, 55281, 0, 7466, 0, 2883, 42253, 83118, 0, 0, 0, 123598, 0, 41230, - 68299, 0, 43571, 0, 6219, 0, 9980, 41232, 92245, 0, 66036, 41229, 118967, - 0, 120666, 94016, 0, 12711, 0, 0, 74289, 68472, 42857, 0, 0, 0, 0, - 127306, 119006, 0, 11380, 72348, 0, 0, 0, 0, 0, 0, 0, 983583, 12722, 0, - 922, 0, 0, 983126, 74958, 3218, 120471, 120470, 120469, 120476, 120475, - 8569, 11404, 70450, 120463, 3214, 120461, 120468, 74910, 3207, 120465, - 78729, 78728, 78727, 0, 120460, 7425, 3205, 0, 78737, 78736, 71729, - 43383, 78733, 78732, 2606, 78730, 73897, 0, 11496, 1173, 0, 0, 129135, 0, - 0, 0, 120737, 120953, 120872, 120629, 378, 2610, 0, 0, 0, 0, 0, 37, 7068, - 0, 120480, 70421, 3209, 120477, 0, 120483, 9768, 120481, 0, 0, 0, 0, 0, - 0, 65510, 0, 100625, 0, 0, 0, 100627, 0, 126633, 0, 7060, 100628, 0, - 127752, 0, 0, 70428, 71463, 0, 7380, 0, 0, 100593, 126997, 0, 128737, 0, - 71465, 121030, 3243, 0, 0, 0, 7050, 0, 70050, 0, 0, 0, 71466, 8203, - 71102, 68241, 0, 65211, 194599, 0, 0, 0, 779, 125061, 64367, 100906, - 69901, 8193, 55279, 0, 0, 0, 7065, 0, 4346, 0, 0, 908, 0, 0, 8982, 0, 0, - 0, 782, 0, 10883, 0, 0, 129396, 65542, 121302, 0, 68650, 100575, 92244, - 0, 0, 111351, 0, 4376, 0, 11787, 12961, 0, 0, 42888, 0, 100610, 6231, 0, - 65713, 100608, 1783, 0, 68238, 0, 0, 0, 194945, 0, 0, 0, 68653, 0, - 983051, 0, 764, 0, 0, 43531, 0, 9033, 0, 0, 6223, 11042, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 120648, 0, 0, 0, 0, 0, 0, 0, 0, 1478, 0, 11825, - 2607, 0, 0, 0, 74543, 0, 0, 100588, 6132, 0, 0, 0, 70058, 0, 0, 0, 43537, - 6761, 10093, 4369, 0, 0, 73735, 100564, 3947, 110778, 0, 0, 0, 0, 100942, - 0, 0, 0, 0, 0, 0, 7686, 0, 0, 0, 100934, 0, 100944, 66577, 41221, 0, - 42281, 0, 74024, 12293, 0, 94014, 11794, 0, 0, 1737, 0, 0, 0, 7205, 0, - 9335, 12850, 0, 2272, 7055, 0, 0, 0, 67751, 0, 0, 6780, 65067, 0, 1327, - 68393, 983570, 0, 41217, 0, 10018, 0, 0, 0, 100611, 68176, 41219, 0, - 4147, 983170, 41216, 983693, 2616, 70197, 68461, 65234, 0, 0, 0, 0, - 119660, 0, 0, 0, 0, 127930, 119580, 70675, 64943, 2608, 1470, 0, 0, 6227, - 0, 0, 74775, 0, 0, 72320, 101024, 0, 129535, 0, 0, 0, 0, 0, 10876, 92482, - 0, 0, 5834, 0, 6222, 0, 0, 12086, 0, 1600, 64309, 0, 0, 68883, 127957, - 93836, 0, 8882, 0, 129415, 2570, 0, 0, 194606, 0, 0, 1234, 0, 13115, - 110743, 110740, 100923, 5002, 110739, 41286, 100926, 127019, 0, 0, 0, 0, - 0, 0, 0, 41289, 0, 0, 75051, 41272, 0, 0, 0, 0, 0, 0, 0, 41279, 0, 0, 0, - 11081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9637, 7112, 77975, 128984, 0, 10886, 0, - 8548, 983841, 0, 0, 0, 8076, 43048, 8290, 8291, 43051, 92570, 0, 2596, 0, - 0, 41293, 0, 0, 2393, 7058, 66432, 0, 68673, 0, 0, 0, 0, 0, 128558, 0, 0, - 0, 0, 0, 64696, 0, 0, 121086, 74165, 0, 0, 0, 0, 0, 0, 7063, 983182, - 64893, 73096, 0, 68038, 113757, 709, 0, 0, 1876, 0, 0, 120868, 8137, - 110662, 67752, 70850, 100832, 245, 100831, 11456, 41233, 7070, 0, 94046, - 6136, 100835, 0, 100781, 41235, 0, 0, 100782, 100642, 432, 0, 100784, - 65437, 0, 0, 128909, 0, 100641, 100649, 0, 100648, 0, 43215, 0, 0, 0, 0, - 9052, 0, 0, 110826, 110827, 74784, 10580, 0, 100845, 0, 64640, 983175, - 74455, 0, 0, 70035, 0, 12652, 12199, 127030, 0, 2566, 11971, 0, 0, 1065, - 0, 0, 0, 2576, 0, 66819, 0, 983986, 0, 0, 0, 983050, 983826, 0, 2921, - 119104, 0, 5772, 12968, 70055, 0, 0, 0, 2580, 983822, 0, 0, 70032, 0, 0, - 0, 128148, 0, 0, 121308, 11346, 0, 12054, 100824, 92426, 0, 0, 13091, 0, - 0, 100821, 100828, 0, 127026, 128334, 74821, 0, 66295, 68037, 68047, - 127865, 13090, 0, 0, 0, 118985, 0, 0, 0, 0, 0, 127824, 0, 0, 100776, - 119319, 42356, 42432, 100778, 119317, 0, 0, 0, 78752, 70030, 66914, 0, 0, - 7061, 0, 3854, 0, 70020, 68413, 0, 42319, 0, 0, 7067, 0, 0, 0, 0, 0, 0, - 127797, 9029, 43543, 0, 2353, 119316, 0, 100769, 0, 100768, 983177, 0, 0, - 43664, 0, 0, 0, 12277, 0, 78122, 11066, 65233, 0, 41224, 0, 0, 3747, - 10522, 0, 129582, 1691, 41226, 0, 917565, 0, 41223, 121135, 121299, 697, - 0, 121051, 4244, 0, 0, 0, 13121, 128573, 0, 0, 0, 0, 0, 0, 0, 0, 65816, - 68111, 0, 127933, 0, 0, 0, 0, 0, 0, 66895, 74602, 0, 7123, 70038, 5785, - 9198, 0, 100810, 0, 7383, 64656, 0, 0, 0, 0, 0, 0, 0, 0, 13122, 0, 191, - 70060, 8585, 126610, 64411, 0, 0, 64850, 41072, 118996, 0, 0, 0, 0, - 100754, 127010, 100753, 0, 100756, 683, 396, 0, 100758, 0, 100757, 43058, - 100760, 343, 7129, 42680, 0, 0, 0, 0, 0, 100761, 0, 74040, 0, 1724, 0, - 119321, 0, 0, 6263, 0, 0, 0, 6592, 0, 983044, 0, 0, 0, 0, 3730, 1778, 0, - 0, 128854, 121254, 0, 9018, 0, 0, 0, 0, 92763, 5547, 0, 0, 128950, 0, 0, - 284, 8108, 0, 0, 74001, 0, 66460, 7174, 92703, 126072, 0, 0, 4394, - 127480, 0, 0, 0, 101082, 66459, 0, 7180, 101084, 0, 101092, 68800, 42471, - 0, 0, 67232, 64304, 42243, 101095, 2583, 0, 127804, 0, 0, 0, 71702, 3855, - 0, 0, 0, 0, 0, 0, 0, 92416, 7132, 0, 92743, 0, 64756, 3798, 6578, 0, 0, - 92481, 9774, 1275, 0, 0, 983056, 0, 120515, 7873, 0, 0, 0, 0, 0, 0, - 73994, 73992, 0, 0, 0, 41851, 0, 41846, 126485, 92337, 7633, 41849, - 68385, 70726, 3224, 0, 69806, 0, 0, 0, 1510, 68129, 0, 0, 0, 0, 12109, 0, - 0, 0, 0, 0, 78377, 1910, 8671, 78374, 127118, 70290, 0, 0, 0, 2654, 7893, - 0, 0, 0, 72394, 0, 67394, 0, 118970, 70066, 78372, 78371, 78370, 78369, - 78368, 0, 0, 0, 1733, 0, 2568, 0, 0, 0, 0, 41486, 0, 127839, 7116, 0, 0, - 0, 7185, 0, 0, 0, 0, 0, 120575, 120829, 0, 0, 0, 0, 92489, 0, 0, 0, - 70022, 7171, 0, 340, 0, 0, 72980, 0, 128535, 0, 124979, 94073, 0, 0, 0, - 11392, 92509, 0, 0, 0, 0, 0, 0, 0, 100632, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11948, 0, 6999, 617, 983806, 0, 3675, 10600, 0, 0, 74616, 2617, 0, 0, 0, - 128446, 0, 0, 8630, 194771, 7288, 983809, 5545, 983799, 2586, 0, 0, - 73123, 983832, 0, 0, 0, 70847, 0, 0, 0, 0, 11195, 71708, 0, 7835, 70040, - 0, 0, 92285, 0, 0, 72973, 0, 0, 100852, 71118, 10029, 983166, 0, 0, - 70033, 124978, 0, 0, 194782, 0, 0, 118975, 0, 0, 3903, 100893, 983839, 0, - 120555, 0, 93036, 110645, 0, 983565, 0, 0, 194773, 0, 0, 0, 127238, - 983803, 100919, 0, 100918, 64752, 0, 983138, 100920, 0, 43045, 100904, 0, - 0, 0, 66394, 7128, 0, 0, 0, 0, 0, 43044, 2604, 0, 100851, 43046, 121421, - 69985, 11768, 43043, 10470, 0, 7122, 194789, 4390, 454, 41397, 194792, 0, - 78762, 0, 0, 120576, 64572, 0, 68091, 2394, 2575, 113749, 0, 0, 74802, - 100913, 129280, 0, 0, 11989, 0, 0, 128856, 0, 0, 8249, 128172, 0, 0, - 6640, 74806, 2598, 513, 0, 6586, 127521, 129301, 120710, 65008, 0, 0, - 92515, 0, 194795, 66755, 0, 126585, 0, 43152, 78637, 0, 194797, 0, 69893, - 6582, 0, 0, 12839, 0, 0, 0, 0, 2444, 128759, 66620, 0, 0, 0, 0, 69894, 0, - 0, 0, 0, 4238, 11071, 9459, 68437, 78140, 78139, 0, 10079, 0, 0, 0, 0, 0, - 11907, 43928, 0, 0, 0, 0, 92490, 43929, 0, 43926, 64498, 0, 9506, 6978, - 126234, 0, 0, 0, 0, 43934, 0, 1122, 65564, 0, 71055, 0, 0, 1920, 0, - 43930, 827, 0, 0, 0, 0, 6577, 1304, 64733, 0, 10606, 0, 0, 0, 9329, - 92997, 9239, 74422, 0, 129373, 1222, 11076, 0, 69229, 43615, 8262, 72280, - 64627, 19909, 983554, 72279, 0, 287, 0, 233, 0, 0, 42816, 0, 0, 65140, - 128158, 8830, 0, 0, 10524, 41175, 125033, 72294, 0, 5296, 0, 0, 0, 0, 0, + 0, 129864, 0, 0, 129834, 69553, 0, 0, 65849, 0, 0, 0, 12451, 3328, 8684, + 0, 6102, 0, 5298, 0, 5294, 0, 129615, 0, 0, 0, 0, 43617, 0, 0, 0, 0, 0, + 77863, 128695, 0, 0, 0, 0, 0, 5292, 0, 0, 42688, 5302, 3970, 0, 0, 1793, + 0, 0, 0, 0, 0, 65263, 0, 0, 0, 0, 0, 0, 13219, 9569, 69567, 74383, 0, 0, + 72157, 0, 42949, 0, 0, 0, 5322, 0, 0, 43631, 5324, 0, 128694, 41614, + 65269, 6230, 0, 0, 0, 3360, 0, 11523, 72726, 92488, 9926, 7197, 0, 68429, + 126575, 41821, 1249, 0, 127951, 0, 123641, 0, 0, 0, 74459, 41807, 0, + 41815, 0, 0, 0, 0, 0, 128248, 0, 66835, 0, 0, 72145, 41800, 0, 0, 0, + 41811, 74466, 93966, 6670, 77882, 0, 0, 43092, 0, 0, 0, 0, 0, 128655, 0, + 0, 0, 0, 74501, 74005, 0, 74387, 69860, 315, 12813, 128556, 72409, 0, + 72408, 0, 0, 73061, 0, 0, 1378, 0, 0, 0, 72407, 3066, 0, 0, 72406, 0, 0, + 0, 8787, 194615, 0, 41618, 0, 0, 0, 194614, 64652, 194611, 42088, 125226, + 0, 0, 0, 0, 7176, 43756, 0, 0, 74492, 0, 74534, 0, 0, 0, 127199, 0, + 128630, 74525, 0, 194594, 12930, 7168, 74514, 0, 74515, 0, 128919, 43962, + 9527, 120659, 70123, 12977, 69723, 0, 93783, 194598, 41236, 92235, 65168, + 118838, 41237, 5848, 0, 194600, 3670, 129905, 129906, 129907, 129908, + 7890, 0, 11298, 0, 0, 6229, 0, 0, 0, 194593, 128907, 0, 0, 0, 4120, + 65337, 65336, 0, 0, 0, 0, 9366, 0, 0, 0, 65327, 65326, 65325, 65324, + 65323, 42216, 65321, 65320, 65335, 65334, 65333, 65332, 65331, 65330, + 65329, 42689, 0, 43943, 118885, 42073, 6785, 68491, 0, 42076, 7196, + 65318, 2035, 65316, 4106, 65314, 65313, 42074, 0, 41228, 0, 0, 41241, + 93786, 41239, 43533, 0, 7189, 194602, 0, 43941, 0, 42802, 0, 8487, 0, 0, + 4615, 12695, 0, 0, 12175, 100414, 0, 0, 7809, 0, 0, 0, 0, 6590, 69762, 0, + 64738, 0, 0, 0, 0, 0, 0, 2025, 0, 0, 0, 10637, 71860, 0, 1570, 43839, + 2835, 83052, 10624, 43623, 194587, 0, 78433, 0, 42812, 0, 2825, 0, + 128287, 0, 2821, 0, 92327, 7365, 83043, 0, 68296, 0, 2823, 0, 0, 0, 2831, + 0, 0, 11465, 0, 0, 0, 0, 0, 7181, 0, 41332, 0, 12333, 0, 0, 0, 0, 0, + 9883, 127294, 73906, 70751, 0, 71863, 0, 0, 0, 0, 0, 0, 43741, 0, 8166, + 70739, 0, 0, 74535, 0, 65297, 68294, 571, 0, 8752, 0, 5288, 118822, 1541, + 0, 127284, 8864, 0, 0, 0, 0, 0, 113778, 12151, 0, 66874, 0, 1035, 0, 0, + 7881, 701, 65936, 128493, 0, 70462, 0, 11403, 0, 0, 82991, 0, 983142, + 70472, 3994, 11421, 121217, 127297, 127242, 127300, 70659, 127303, 0, + 125205, 2855, 127828, 0, 41621, 68214, 0, 0, 10654, 82945, 119226, 12164, + 41623, 7906, 0, 74297, 7182, 0, 83069, 0, 0, 0, 0, 121115, 0, 0, 747, 0, + 92463, 12019, 43136, 0, 110861, 0, 0, 8001, 0, 0, 69394, 0, 0, 0, 68373, + 0, 0, 0, 128279, 0, 71915, 0, 0, 7282, 94066, 0, 0, 0, 0, 0, 5286, 83061, + 0, 3718, 0, 83057, 0, 194584, 71905, 0, 128480, 0, 0, 0, 0, 9206, 82980, + 113824, 6802, 0, 41653, 0, 1241, 0, 0, 0, 0, 68124, 41651, 42937, 0, + 83042, 41650, 0, 83037, 0, 12914, 2814, 0, 119552, 0, 0, 0, 71968, 0, 0, + 0, 917546, 71862, 0, 0, 0, 3494, 10189, 69784, 0, 0, 71861, 0, 0, 65875, + 0, 0, 127762, 0, 74215, 43065, 0, 0, 7200, 0, 3261, 0, 0, 0, 65889, + 71888, 71975, 0, 0, 0, 0, 0, 0, 0, 0, 129424, 0, 635, 0, 0, 74753, 0, + 92420, 73997, 0, 0, 43905, 0, 118834, 126125, 0, 6667, 0, 983263, 0, 0, + 125200, 0, 0, 0, 0, 83137, 0, 0, 0, 0, 0, 121104, 127856, 125112, 71885, + 0, 120125, 7866, 194573, 92770, 194574, 0, 120140, 126074, 2849, 0, 0, + 42157, 12960, 0, 11812, 0, 74509, 0, 69881, 0, 0, 0, 123156, 7178, 0, 0, + 0, 0, 129041, 11534, 1967, 0, 0, 71361, 7015, 120298, 72757, 0, 12989, 0, + 9368, 983638, 1624, 43270, 0, 0, 10818, 0, 83091, 0, 120908, 0, 0, 0, 0, + 0, 0, 6169, 12871, 0, 2798, 65176, 4958, 42752, 119025, 0, 0, 0, 70346, + 66448, 0, 113780, 68364, 0, 0, 0, 68360, 0, 73746, 120945, 68352, 0, + 73787, 83110, 2154, 7199, 64955, 0, 0, 0, 0, 71980, 66507, 0, 69853, 0, + 0, 0, 0, 0, 0, 0, 92517, 118882, 120301, 13297, 0, 129446, 71963, 0, 0, + 0, 6658, 8045, 0, 0, 983854, 92319, 83101, 0, 72126, 0, 0, 0, 2416, 3310, + 0, 0, 379, 0, 43755, 0, 0, 0, 68362, 1284, 0, 73756, 0, 0, 83141, 70784, + 71977, 0, 0, 0, 8515, 83144, 83143, 0, 0, 0, 8529, 93782, 0, 7564, 0, 0, + 0, 0, 73757, 73760, 42359, 0, 2031, 0, 7202, 129984, 12676, 0, 0, 128418, + 0, 7710, 1610, 73801, 0, 0, 0, 983607, 43917, 0, 9974, 228, 0, 10398, 0, + 0, 0, 92241, 70062, 118927, 42999, 1725, 65533, 8196, 9352, 0, 0, 66868, + 0, 8502, 5762, 0, 0, 43898, 0, 0, 0, 0, 43914, 0, 126507, 64598, 13001, + 9326, 83082, 43916, 1557, 0, 983860, 6330, 6805, 8631, 2545, 70052, 0, 0, + 0, 42998, 70410, 0, 42762, 71941, 42914, 126516, 262, 1637, 0, 83025, + 129491, 0, 128757, 0, 0, 0, 128922, 0, 43658, 0, 0, 129183, 6419, 0, 0, + 0, 0, 93989, 0, 0, 7194, 5291, 129702, 43666, 0, 0, 0, 0, 128293, 0, + 12881, 123596, 0, 73842, 0, 9011, 0, 0, 0, 70436, 179, 43644, 0, 0, + 64747, 0, 118813, 0, 0, 121389, 92649, 126629, 0, 73850, 2801, 119837, + 42069, 119839, 119838, 119841, 42072, 92736, 119842, 0, 0, 0, 8377, 0, + 42070, 119313, 119834, 119310, 4389, 43656, 1633, 119857, 119856, 119859, + 11119, 119845, 119844, 9967, 119846, 119849, 4612, 119851, 119850, 42913, + 70456, 0, 71983, 10782, 66898, 0, 119141, 0, 0, 0, 11541, 69636, 0, 0, + 119614, 2731, 0, 0, 0, 4102, 0, 73878, 0, 0, 0, 0, 0, 11283, 0, 0, 0, 0, + 0, 43674, 0, 0, 126705, 0, 0, 0, 0, 11142, 128304, 0, 12975, 0, 123208, + 0, 0, 74072, 0, 55269, 0, 0, 0, 78577, 78576, 0, 0, 82966, 82974, 70448, + 0, 0, 82968, 0, 0, 0, 0, 0, 113809, 0, 69399, 64909, 0, 11790, 74019, 0, + 128066, 0, 8561, 94076, 129481, 125045, 69259, 65674, 7230, 0, 0, 8778, + 0, 0, 67725, 2071, 0, 6459, 68325, 7628, 65092, 73903, 0, 11342, 129388, + 0, 0, 93965, 94081, 0, 11810, 70057, 10723, 967, 0, 71973, 73905, 0, + 6387, 0, 12307, 43913, 121089, 0, 127584, 0, 1886, 0, 43895, 870, 7648, + 0, 7662, 7652, 876, 871, 877, 7665, 878, 42015, 879, 43692, 4563, 0, 0, + 0, 73072, 867, 9520, 872, 7656, 868, 873, 7642, 7659, 869, 874, 7644, 0, + 875, 790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68452, 0, 0, 42067, 0, 0, 0, + 12292, 0, 0, 0, 42012, 0, 0, 83388, 0, 0, 8494, 4611, 0, 72344, 0, 9679, + 0, 0, 0, 0, 93015, 0, 74364, 4628, 4245, 0, 0, 0, 1851, 0, 127189, 0, 0, + 0, 118897, 0, 64674, 124971, 983868, 8829, 983674, 128864, 0, 0, 0, 0, + 8809, 983677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7427, 0, 4588, 43680, 72300, + 74484, 0, 0, 0, 0, 113787, 74363, 129043, 0, 793, 0, 11197, 0, 0, 0, 842, + 0, 8208, 70833, 0, 1647, 0, 70841, 0, 0, 818, 0, 0, 0, 0, 0, 0, 120594, + 0, 0, 70179, 0, 13167, 66359, 0, 127172, 0, 4969, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2840, 0, 0, 0, 66887, 65877, 9068, 0, 68194, 0, 0, 12991, 0, 2651, + 68016, 983896, 0, 983259, 70835, 0, 70844, 43648, 0, 0, 0, 0, 0, 0, + 64372, 121064, 7458, 655, 752, 7457, 7456, 7452, 3285, 74894, 11152, + 73099, 0, 2391, 93766, 92271, 671, 7435, 7434, 618, 668, 610, 42800, + 7431, 7451, 42801, 640, 42927, 7448, 7439, 628, 3905, 100742, 0, 0, 0, + 67850, 0, 0, 0, 4605, 0, 100745, 43372, 65945, 72710, 0, 119590, 0, 0, + 70495, 987, 71229, 11572, 0, 0, 10002, 9971, 70673, 0, 0, 0, 0, 0, 0, + 11334, 0, 129493, 42364, 11503, 0, 0, 0, 4627, 70090, 127784, 0, 0, + 74046, 68872, 92562, 0, 0, 129900, 0, 129812, 0, 0, 42569, 64965, 0, 0, + 10516, 129828, 12190, 0, 42140, 0, 0, 0, 0, 9887, 0, 4000, 7429, 7428, + 665, 7424, 0, 0, 7884, 0, 0, 0, 0, 0, 2509, 0, 120573, 0, 0, 92449, 0, + 10690, 0, 119114, 126226, 0, 0, 73080, 4590, 0, 74440, 0, 0, 0, 1708, 0, + 0, 983609, 0, 0, 69226, 69974, 8813, 0, 1066, 0, 0, 71965, 127921, 70447, + 0, 0, 0, 72343, 0, 7516, 0, 0, 0, 8034, 0, 0, 3631, 110696, 0, 0, 8416, + 110694, 71937, 0, 0, 110692, 74621, 0, 70185, 0, 74850, 0, 0, 12099, + 70475, 0, 6252, 0, 0, 0, 0, 0, 0, 66368, 0, 64956, 7071, 129070, 70457, + 128159, 118800, 0, 0, 0, 9357, 0, 1773, 0, 125092, 0, 68451, 7745, 9844, + 0, 0, 94, 1880, 120929, 0, 0, 0, 0, 0, 0, 0, 0, 11237, 0, 129173, 0, 0, + 0, 1757, 6964, 42480, 72823, 0, 120806, 0, 0, 7731, 0, 0, 127883, 0, + 110810, 43988, 70423, 74758, 0, 7592, 856, 74299, 0, 0, 0, 78138, 1459, + 0, 0, 0, 0, 0, 1504, 0, 0, 0, 0, 7529, 0, 0, 0, 0, 12594, 0, 0, 336, 0, + 7509, 0, 0, 0, 0, 127882, 0, 0, 0, 65859, 0, 983967, 43062, 124948, 0, 0, + 0, 0, 12970, 0, 0, 0, 0, 0, 0, 0, 119247, 0, 65068, 74291, 129943, 7069, + 0, 0, 0, 11130, 2087, 0, 0, 0, 0, 126249, 0, 92747, 0, 92614, 2091, 0, + 2090, 0, 0, 7117, 2077, 72281, 0, 77889, 2083, 0, 71196, 0, 0, 71981, 0, + 0, 0, 0, 4165, 8746, 0, 0, 0, 0, 129572, 7066, 0, 70415, 128135, 0, 0, + 7786, 127766, 2233, 0, 124965, 121122, 2302, 0, 0, 7056, 0, 0, 0, 0, 0, + 0, 126506, 6920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983099, 70438, 2613, 0, 0, + 110734, 0, 74571, 42760, 0, 0, 0, 0, 0, 0, 71843, 0, 0, 70506, 1246, + 74243, 0, 0, 41008, 0, 0, 0, 921, 70048, 0, 12702, 0, 0, 1566, 8407, 0, + 64653, 0, 74617, 0, 0, 72711, 5313, 951, 0, 0, 0, 0, 0, 4009, 70277, + 71844, 0, 83123, 0, 72250, 0, 119898, 113760, 0, 0, 0, 0, 70024, 0, 0, + 119892, 0, 0, 0, 119890, 2579, 119906, 3177, 11357, 69224, 0, 0, 83130, + 64734, 0, 9822, 110670, 70471, 110668, 0, 110666, 0, 0, 0, 0, 9851, + 983729, 110673, 9059, 110671, 110672, 0, 41687, 129054, 0, 71842, 70178, + 0, 0, 1777, 0, 10158, 69767, 0, 42366, 70444, 0, 0, 0, 70127, 71955, + 5989, 110716, 74636, 126999, 0, 41685, 0, 0, 9769, 41684, 0, 6225, + 111328, 11740, 0, 118840, 0, 2600, 0, 70416, 0, 0, 3666, 70420, 0, 71976, + 0, 0, 74542, 69771, 0, 0, 0, 0, 0, 69765, 0, 252, 0, 69769, 0, 194616, 0, + 69763, 0, 0, 0, 0, 0, 0, 0, 120947, 0, 129410, 0, 0, 0, 68323, 125219, 0, + 119188, 0, 0, 121335, 0, 0, 0, 0, 0, 7764, 983726, 11094, 120825, 0, 0, + 92505, 8298, 0, 0, 0, 0, 0, 64449, 0, 126650, 0, 0, 0, 70442, 0, 0, 0, 0, + 7774, 10607, 0, 0, 0, 0, 0, 120764, 0, 0, 0, 0, 3458, 0, 70053, 0, + 120995, 0, 2602, 0, 0, 0, 74907, 0, 0, 0, 0, 172, 0, 4971, 70419, 1889, + 7238, 0, 0, 0, 8257, 0, 0, 0, 129570, 0, 111342, 71948, 0, 43366, 43363, + 9807, 0, 0, 0, 72247, 64479, 0, 0, 0, 113707, 0, 10900, 121355, 0, 0, + 12048, 0, 64292, 0, 0, 0, 6099, 94084, 129486, 0, 0, 299, 0, 8525, 92356, + 0, 0, 111338, 0, 92564, 3075, 0, 94053, 0, 94050, 0, 0, 70440, 0, 123590, + 0, 0, 0, 2581, 11395, 0, 0, 0, 0, 128584, 0, 0, 129423, 0, 118855, 0, 0, + 0, 7204, 70065, 2588, 2914, 7011, 55281, 0, 7466, 0, 2883, 42253, 83118, + 0, 0, 0, 123598, 0, 41230, 68299, 0, 43571, 0, 6219, 0, 9980, 41232, + 92245, 0, 66036, 41229, 118967, 0, 120666, 94016, 0, 12711, 0, 0, 74289, + 68472, 42857, 0, 0, 0, 0, 127306, 119006, 0, 11380, 72348, 0, 0, 0, 0, 0, + 0, 0, 983579, 12722, 0, 922, 0, 0, 983126, 74958, 3218, 120471, 120470, + 120469, 120476, 120475, 8569, 11404, 70450, 120463, 3214, 120461, 120468, + 74910, 3207, 120465, 78729, 78728, 78727, 0, 120460, 7425, 3205, 0, + 78737, 78736, 71729, 43383, 78733, 78732, 2606, 78730, 73897, 0, 11496, + 1173, 0, 0, 129135, 0, 0, 0, 120737, 120953, 120872, 120629, 378, 2610, + 0, 0, 0, 0, 0, 37, 7068, 0, 120480, 70421, 3209, 120477, 0, 120483, 9768, + 120481, 0, 0, 0, 0, 0, 0, 65510, 0, 100625, 0, 0, 0, 100627, 0, 126633, + 0, 7060, 100628, 0, 127752, 0, 69284, 70428, 71463, 0, 7380, 0, 0, + 100593, 126997, 0, 128737, 0, 71465, 121030, 3243, 0, 0, 0, 7050, 0, + 70050, 0, 0, 0, 71466, 8203, 71102, 68241, 0, 65211, 194599, 0, 0, 0, + 779, 125061, 64367, 100906, 69901, 8193, 55279, 0, 0, 0, 7065, 0, 4346, + 0, 0, 908, 0, 0, 8982, 0, 0, 0, 782, 0, 10883, 0, 0, 129396, 65542, + 121302, 0, 68650, 100575, 92244, 0, 0, 111351, 0, 4376, 0, 11787, 12961, + 0, 0, 42888, 0, 100610, 6231, 0, 65713, 100608, 1783, 0, 68238, 0, 0, 0, + 194945, 0, 0, 0, 68653, 0, 983051, 0, 764, 0, 0, 43531, 0, 9033, 0, 0, + 6223, 11042, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120648, 0, 0, 0, 0, 0, + 0, 71971, 0, 1478, 0, 11825, 2607, 0, 0, 0, 74543, 0, 0, 100588, 6132, 0, + 0, 0, 70058, 0, 0, 0, 43537, 6761, 10093, 4369, 0, 0, 73735, 100564, + 3947, 110778, 0, 0, 0, 0, 100942, 0, 0, 0, 0, 0, 0, 7686, 0, 0, 0, + 100934, 0, 100944, 66577, 41221, 0, 42281, 0, 74024, 12293, 0, 94014, + 11794, 0, 0, 1737, 0, 0, 0, 7205, 0, 9335, 12850, 0, 2272, 7055, 0, 0, 0, + 67751, 0, 0, 6780, 65067, 0, 1327, 68393, 983574, 0, 41217, 0, 10018, 0, + 0, 0, 100611, 68176, 41219, 0, 4147, 983170, 41216, 983693, 2616, 70197, + 68461, 65234, 0, 0, 0, 0, 119660, 0, 0, 0, 0, 127930, 119580, 70675, + 64943, 2608, 1470, 0, 0, 6227, 0, 0, 74775, 0, 0, 72320, 101024, 0, + 129535, 0, 0, 0, 0, 0, 10876, 92482, 0, 0, 5834, 0, 6222, 0, 0, 12086, 0, + 1600, 64309, 0, 0, 68883, 127957, 93836, 0, 8882, 0, 129415, 2570, 0, 0, + 194606, 0, 0, 1234, 0, 13115, 110743, 110740, 100923, 5002, 110739, + 41286, 100926, 127019, 0, 0, 0, 0, 0, 0, 0, 41289, 0, 0, 75051, 41272, 0, + 0, 0, 0, 0, 0, 0, 41279, 0, 0, 0, 11081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9637, + 7112, 77975, 128984, 0, 10886, 0, 8548, 983841, 0, 0, 0, 8076, 43048, + 8290, 8291, 43051, 92570, 0, 2596, 0, 0, 41293, 0, 0, 2393, 7058, 66432, + 0, 68673, 0, 0, 0, 0, 0, 128558, 0, 0, 0, 0, 0, 64696, 0, 0, 121086, + 74165, 0, 0, 0, 0, 0, 0, 7063, 983182, 64893, 73096, 0, 68038, 113757, + 709, 0, 0, 1876, 0, 0, 120868, 8137, 110662, 67752, 70850, 100832, 245, + 100831, 11456, 41233, 7070, 0, 94046, 6136, 100835, 0, 100781, 41235, 0, + 0, 100782, 100642, 432, 0, 100784, 65437, 0, 0, 128909, 0, 100641, + 100649, 0, 100648, 0, 43215, 0, 0, 0, 0, 9052, 0, 0, 110826, 110827, + 74784, 10580, 0, 100845, 0, 64640, 983175, 74455, 0, 129670, 70035, 0, + 12652, 12199, 127030, 0, 2566, 11971, 0, 0, 1065, 0, 0, 0, 2576, 0, + 66819, 0, 983986, 129852, 0, 0, 983050, 983826, 0, 2921, 119104, 0, 5772, + 12968, 70055, 0, 0, 0, 2580, 983822, 0, 0, 70032, 0, 0, 0, 128148, 0, 0, + 121308, 11346, 0, 12054, 100824, 92426, 101112, 0, 13091, 0, 0, 100821, + 100828, 0, 127026, 128334, 74821, 0, 66295, 68037, 68047, 127865, 13090, + 0, 0, 0, 118985, 0, 0, 0, 0, 0, 127824, 0, 0, 100776, 119319, 42356, + 42432, 100778, 119317, 0, 0, 0, 78752, 70030, 66914, 0, 0, 7061, 0, 3854, + 0, 70020, 68413, 0, 42319, 0, 0, 7067, 0, 0, 0, 0, 0, 0, 127797, 9029, + 43543, 0, 2353, 119316, 0, 100769, 0, 100768, 983177, 0, 0, 43664, 0, 0, + 0, 12277, 0, 78122, 11066, 65233, 0, 41224, 0, 0, 3747, 10522, 0, 129582, + 1691, 41226, 0, 917565, 0, 41223, 121135, 121299, 697, 0, 121051, 4244, + 0, 0, 0, 13121, 128573, 0, 0, 0, 0, 0, 0, 129879, 0, 65816, 68111, 0, + 127933, 0, 0, 0, 0, 0, 0, 66895, 74602, 0, 7123, 70038, 5785, 9198, 0, + 100810, 0, 7383, 64656, 0, 0, 0, 0, 0, 0, 0, 0, 13122, 0, 191, 70060, + 8585, 126610, 64411, 0, 0, 64850, 41072, 118996, 0, 0, 0, 0, 100754, + 127010, 100753, 0, 100756, 683, 396, 0, 100758, 0, 100757, 43058, 100760, + 343, 7129, 42680, 0, 0, 0, 0, 0, 100761, 0, 74040, 0, 1724, 0, 119321, 0, + 0, 6263, 0, 0, 0, 6592, 0, 983044, 0, 0, 0, 0, 3730, 1778, 0, 0, 128854, + 121254, 0, 9018, 0, 0, 0, 0, 92763, 5547, 0, 0, 128950, 0, 0, 284, 8108, + 0, 0, 74001, 0, 66460, 7174, 92703, 126072, 0, 0, 4394, 127480, 0, 0, 0, + 101082, 66459, 0, 7180, 101084, 0, 101092, 68800, 42471, 0, 0, 67232, + 64304, 42243, 101094, 2583, 0, 127804, 0, 0, 0, 71702, 3855, 0, 0, 0, 0, + 0, 0, 0, 92416, 7132, 0, 92743, 0, 64756, 3798, 6578, 0, 0, 92481, 9774, + 1275, 0, 0, 983056, 0, 120515, 7873, 0, 0, 0, 0, 0, 0, 73994, 73992, 0, + 0, 0, 41851, 0, 41846, 126485, 92337, 7633, 41849, 68385, 70726, 3224, 0, + 69806, 0, 0, 0, 1510, 68129, 0, 0, 0, 0, 12109, 0, 0, 0, 0, 0, 78377, + 1910, 8671, 78374, 127118, 70290, 0, 0, 0, 2654, 7893, 0, 0, 0, 72394, 0, + 67394, 0, 118970, 70066, 78372, 78371, 78370, 78369, 78368, 0, 0, 0, + 1733, 0, 2568, 0, 0, 0, 0, 41486, 0, 127839, 7116, 0, 0, 0, 7185, 0, 0, + 0, 0, 0, 120575, 120829, 0, 0, 0, 0, 92489, 0, 0, 0, 70022, 7171, 0, 340, + 0, 0, 72980, 0, 128535, 0, 124979, 94073, 0, 0, 0, 11392, 92509, 0, 0, 0, + 0, 0, 0, 0, 100632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11948, 0, 6999, 617, + 983806, 0, 3675, 10600, 0, 0, 74616, 2617, 0, 0, 0, 128446, 0, 0, 8630, + 194771, 7288, 983809, 5545, 983799, 2586, 0, 0, 73123, 983832, 0, 0, 0, + 70847, 0, 0, 0, 0, 11195, 71708, 0, 7835, 70040, 0, 0, 92285, 0, 0, + 72973, 0, 0, 100852, 71118, 10029, 983166, 0, 0, 70033, 124978, 0, 0, + 194782, 0, 0, 118975, 0, 0, 3903, 100893, 983839, 0, 120555, 0, 93036, + 110645, 0, 983565, 0, 0, 194773, 0, 0, 0, 127238, 983803, 100919, 0, + 100918, 64752, 0, 983138, 100920, 0, 43045, 100904, 0, 0, 0, 66394, 7128, + 0, 0, 0, 0, 0, 43044, 2604, 0, 100851, 43046, 121421, 69985, 11768, + 43043, 10470, 0, 7122, 194789, 4390, 454, 41397, 194792, 0, 78762, 0, 0, + 120576, 64572, 0, 68091, 2394, 2575, 113749, 0, 0, 74802, 100913, 129280, + 0, 0, 11989, 0, 0, 128856, 0, 0, 8249, 128172, 0, 0, 6640, 74806, 2598, + 513, 0, 6586, 127521, 129301, 120710, 65008, 0, 0, 92515, 0, 194795, + 66755, 0, 126585, 0, 43152, 78637, 0, 194797, 0, 69893, 6582, 0, 0, + 12839, 0, 0, 0, 0, 2444, 128759, 66620, 0, 0, 0, 0, 69894, 0, 0, 0, 0, + 4238, 11071, 9459, 68437, 78140, 78139, 0, 10079, 0, 0, 0, 0, 0, 11907, + 43928, 0, 0, 0, 0, 92490, 43929, 0, 43926, 64498, 0, 9506, 6978, 126234, + 0, 0, 0, 0, 43934, 0, 1122, 65564, 0, 71055, 0, 0, 1920, 0, 43930, 827, + 0, 0, 0, 0, 6577, 1304, 64733, 0, 10606, 0, 0, 0, 9329, 92997, 9239, + 74422, 0, 129373, 1222, 11076, 0, 69229, 43615, 8262, 72280, 64627, + 19909, 983554, 72279, 0, 287, 0, 233, 0, 0, 42816, 0, 0, 65140, 128158, + 8830, 0, 0, 10524, 41175, 125033, 72294, 0, 5296, 0, 127559, 0, 0, 0, 127154, 74858, 6516, 6515, 6514, 6513, 6512, 0, 70870, 0, 0, 0, 12122, 92462, 100868, 43976, 1785, 92507, 0, 0, 917771, 5138, 0, 0, 0, 100884, 0, 0, 0, 0, 0, 5134, 69980, 322, 4643, 5132, 0, 194942, 0, 5143, 0, - 72309, 119628, 0, 0, 72112, 0, 0, 0, 0, 0, 0, 0, 0, 73097, 0, 0, 0, + 72309, 119628, 0, 0, 72112, 0, 129964, 0, 0, 0, 0, 0, 0, 73097, 0, 0, 0, 127923, 0, 0, 0, 0, 0, 3234, 0, 100886, 0, 100889, 118924, 0, 0, 100875, 68231, 74489, 100872, 120746, 0, 100876, 0, 12714, 0, 64585, 93775, 0, 0, 0, 129428, 0, 11027, 0, 10059, 0, 64524, 9767, 789, 1749, 0, 66766, @@ -27663,14 +28526,14 @@ static const unsigned int code_hash[] = { 0, 6653, 0, 0, 64510, 0, 41868, 0, 128823, 0, 0, 11613, 70737, 12603, 7131, 11108, 4566, 0, 0, 0, 0, 0, 124938, 127369, 0, 0, 5200, 0, 0, 0, 9183, 127361, 74458, 73075, 395, 5482, 1376, 4349, 0, 0, 5196, 0, 6113, - 42009, 5205, 0, 120530, 0, 118973, 70467, 0, 0, 0, 0, 9126, 70498, 0, 0, - 0, 0, 0, 3203, 192, 0, 3385, 125075, 128620, 5383, 0, 0, 0, 5738, 69449, - 3336, 0, 5361, 9633, 0, 0, 0, 0, 8581, 0, 1260, 3149, 5359, 12962, 74955, - 10441, 5357, 0, 0, 0, 5364, 0, 11431, 0, 9101, 0, 0, 0, 0, 78378, 121155, - 42917, 0, 129179, 0, 0, 0, 43360, 78385, 78384, 78383, 78382, 78381, - 78380, 78379, 9319, 7097, 0, 127748, 0, 0, 0, 120632, 0, 71205, 0, 0, 0, - 1720, 0, 0, 0, 8622, 0, 70430, 68772, 0, 0, 0, 73084, 0, 0, 11921, 0, - 11769, 68782, 0, 0, 0, 0, 194571, 41586, 0, 0, 0, 3356, 194572, 64709, + 42009, 5205, 0, 120530, 0, 118973, 70467, 0, 0, 129691, 0, 9126, 70498, + 0, 0, 0, 0, 0, 3203, 192, 0, 3385, 120785, 128620, 5383, 0, 0, 0, 5738, + 69449, 3336, 0, 5361, 9633, 0, 0, 0, 0, 8581, 0, 1260, 3149, 5359, 12962, + 74955, 10441, 5357, 0, 0, 0, 5364, 0, 11431, 0, 9101, 0, 0, 0, 0, 78378, + 121155, 42917, 0, 129179, 0, 0, 0, 43360, 78385, 78384, 78383, 78382, + 78381, 78380, 78379, 9319, 7097, 0, 127748, 0, 0, 0, 120632, 0, 71205, 0, + 0, 0, 1720, 0, 0, 0, 8622, 0, 70430, 68772, 0, 0, 0, 73084, 0, 0, 11921, + 0, 11769, 68782, 0, 0, 0, 0, 194571, 41586, 0, 0, 0, 3356, 194572, 64709, 194575, 0, 7134, 0, 78389, 0, 677, 0, 0, 0, 129474, 68747, 0, 68751, 3349, 74125, 0, 8927, 0, 0, 0, 0, 0, 0, 0, 6806, 0, 10190, 68755, 0, 0, 0, 0, 0, 0, 0, 7113, 7586, 0, 10852, 0, 0, 4606, 0, 0, 70084, 0, 0, 1046, @@ -27678,272 +28541,275 @@ static const unsigned int code_hash[] = { 5169, 11935, 0, 0, 3175, 0, 1537, 0, 5176, 8905, 4136, 4871, 78388, 0, 0, 0, 0, 1128, 0, 0, 0, 74066, 0, 73069, 0, 0, 3662, 113767, 3378, 0, 71298, 0, 127995, 6320, 71302, 983162, 10163, 0, 5165, 5126, 0, 66902, 41389, 0, - 71368, 3374, 0, 0, 7119, 0, 0, 3507, 0, 7629, 983629, 19925, 0, 68463, + 71368, 3374, 113740, 0, 7119, 0, 0, 3507, 0, 7629, 6848, 19925, 0, 68463, 183, 127208, 127209, 70811, 10636, 0, 128465, 0, 0, 78772, 0, 0, 0, 78768, 6580, 4332, 123584, 0, 10726, 66686, 127203, 127204, 127205, 127206, 0, 70813, 127201, 127202, 0, 0, 5448, 41058, 5446, 0, 0, 71369, 5442, 7135, 0, 0, 5451, 0, 78470, 0, 0, 0, 0, 11243, 10859, 65867, 10345, - 10409, 123606, 0, 0, 0, 42181, 0, 0, 2060, 0, 7111, 0, 0, 0, 0, 72741, 0, - 205, 0, 72346, 93771, 0, 9862, 6588, 43257, 0, 0, 0, 5505, 93789, 5503, - 65376, 0, 7125, 9819, 0, 0, 0, 5507, 12044, 194567, 0, 0, 0, 7109, 0, 0, - 7911, 10329, 10393, 8991, 125104, 69778, 11133, 129619, 8550, 0, 5592, - 2919, 0, 0, 5595, 0, 0, 4367, 0, 0, 5591, 41060, 5594, 0, 0, 13142, 5590, - 0, 72274, 118909, 75069, 123586, 9731, 71225, 64633, 0, 0, 71217, 121361, - 71227, 0, 0, 0, 0, 7137, 0, 0, 0, 10551, 10710, 0, 0, 0, 120570, 0, - 92364, 9936, 3348, 0, 0, 1444, 119058, 0, 74206, 983106, 0, 1442, 129080, - 0, 120959, 0, 0, 0, 0, 0, 0, 0, 3334, 73068, 118803, 0, 0, 71219, 69770, - 1651, 0, 8861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43626, 0, 0, 3344, 0, 0, - 12920, 0, 0, 0, 71853, 3438, 128711, 0, 0, 0, 0, 129068, 0, 0, 65117, 0, - 0, 0, 0, 66366, 128915, 0, 69772, 0, 0, 0, 0, 4973, 8784, 0, 0, 0, 0, 0, - 0, 0, 125198, 983283, 0, 0, 66413, 0, 0, 0, 0, 0, 9243, 2464, 0, 0, 3372, - 0, 0, 0, 70364, 7121, 0, 0, 0, 92163, 0, 0, 0, 0, 0, 0, 0, 3354, 0, 0, 0, - 118999, 0, 3876, 0, 127983, 0, 43696, 43380, 0, 74240, 0, 0, 0, 983966, - 75074, 6589, 0, 0, 120993, 0, 0, 69609, 0, 121210, 0, 10630, 74827, 0, - 121293, 0, 0, 121287, 917942, 121337, 121215, 0, 0, 0, 0, 0, 917940, - 3366, 0, 917938, 0, 0, 0, 71062, 0, 121197, 0, 6925, 71856, 0, 917929, - 66780, 66274, 0, 72768, 0, 917930, 129482, 11138, 0, 6754, 7118, 0, - 64672, 65296, 0, 118957, 0, 0, 12296, 68457, 121320, 0, 5282, 0, 72278, - 0, 0, 0, 0, 0, 0, 66355, 0, 0, 68073, 64343, 0, 92744, 195058, 195029, 0, - 0, 195056, 195027, 0, 0, 128814, 195025, 6584, 195026, 10657, 0, 74544, - 0, 1200, 12243, 0, 195062, 0, 129300, 11545, 0, 120493, 3343, 4424, - 11047, 0, 69863, 3896, 0, 0, 2947, 0, 0, 42221, 0, 68139, 13059, 7942, 0, - 3381, 0, 0, 0, 0, 0, 0, 78235, 0, 0, 0, 7044, 65800, 78236, 0, 7045, - 7175, 7047, 127884, 11791, 0, 0, 3881, 0, 0, 127395, 0, 0, 67075, 7106, - 0, 0, 0, 74211, 41897, 92513, 0, 73040, 66745, 0, 0, 0, 0, 121245, 0, - 64354, 73083, 8777, 0, 129108, 8884, 2385, 73067, 92450, 0, 0, 0, 42027, - 12114, 0, 0, 64936, 0, 0, 0, 0, 0, 126605, 0, 0, 0, 0, 73064, 0, 0, 0, 0, - 0, 0, 0, 73057, 0, 123587, 0, 0, 0, 0, 0, 70803, 0, 0, 124953, 0, 0, 0, - 7048, 11087, 123600, 92536, 7043, 9600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42050, - 0, 55289, 0, 0, 657, 0, 195054, 4461, 92903, 0, 0, 126490, 0, 4468, 0, 0, - 0, 4456, 73070, 10720, 123588, 0, 127520, 0, 0, 0, 195046, 260, 7714, - 74163, 2045, 0, 65064, 4466, 0, 0, 128087, 0, 41403, 0, 0, 0, 41406, - 120692, 0, 0, 73939, 0, 0, 0, 41404, 1165, 0, 4451, 13087, 0, 11258, 0, - 73855, 0, 43014, 5439, 12061, 74586, 3375, 128869, 0, 0, 0, 0, 0, 0, 0, - 113823, 67078, 0, 67079, 0, 0, 0, 0, 68459, 0, 0, 0, 0, 0, 0, 7280, 0, 0, - 0, 4868, 8297, 0, 0, 42791, 0, 66737, 66739, 0, 0, 5182, 0, 0, 72764, 0, - 4465, 0, 12135, 0, 4464, 0, 0, 977, 4458, 43827, 0, 0, 0, 0, 344, 0, 0, - 0, 0, 0, 92240, 0, 64443, 126995, 73078, 129525, 0, 0, 0, 43026, 7612, - 119591, 64413, 0, 0, 0, 0, 0, 0, 0, 0, 123622, 0, 119160, 10204, 127947, - 73063, 0, 0, 127236, 0, 68746, 0, 8852, 0, 0, 0, 0, 128427, 123597, 7932, - 0, 128463, 0, 0, 0, 0, 0, 0, 0, 74893, 0, 0, 73095, 0, 8650, 0, 0, 0, - 69900, 118872, 0, 70868, 0, 6719, 0, 0, 0, 72836, 0, 0, 118991, 0, - 123594, 73815, 4420, 0, 10583, 7760, 0, 0, 128752, 71711, 0, 128407, 0, - 0, 0, 9066, 0, 74795, 0, 0, 0, 0, 0, 0, 0, 42825, 41854, 5304, 0, 124942, - 6919, 8619, 0, 10038, 66454, 9592, 129049, 0, 0, 110771, 110777, 110772, - 0, 0, 0, 0, 0, 78498, 110773, 43624, 0, 7779, 0, 0, 9479, 78493, 0, 0, - 2224, 0, 0, 0, 0, 0, 42378, 3368, 0, 66804, 7697, 69237, 0, 2030, 0, - 68236, 8370, 0, 127961, 0, 0, 983350, 127903, 983348, 983347, 5174, - 42831, 983344, 70439, 983342, 8881, 119047, 0, 70433, 0, 0, 0, 0, 0, 0, - 9576, 0, 3347, 4160, 5154, 0, 3794, 0, 0, 0, 0, 0, 127916, 73073, 8381, - 4572, 71129, 126101, 0, 0, 0, 0, 0, 0, 0, 92283, 0, 0, 5799, 983339, - 70100, 983337, 983336, 983335, 43031, 64425, 65128, 983331, 0, 73059, 0, - 68616, 0, 0, 0, 0, 0, 0, 0, 123604, 0, 0, 283, 68665, 0, 532, 0, 0, - 983808, 0, 0, 3370, 73077, 119132, 5443, 71431, 0, 0, 0, 0, 0, 2298, 0, - 0, 0, 983330, 983329, 983328, 983327, 7144, 983325, 119600, 983323, - 983322, 983321, 0, 78816, 128833, 0, 0, 0, 0, 0, 0, 0, 0, 73088, 0, - 123592, 983933, 0, 0, 0, 0, 5186, 7360, 127837, 0, 12108, 0, 65124, 0, 0, - 0, 6326, 43344, 0, 0, 42562, 0, 0, 0, 983320, 65495, 983318, 101066, - 983316, 101065, 983314, 65490, 983312, 125034, 0, 101070, 0, 55245, - 128927, 1630, 128232, 65483, 0, 0, 0, 65476, 0, 0, 119214, 9283, 10183, - 0, 0, 65499, 0, 64593, 66758, 3376, 0, 0, 0, 101077, 43872, 12940, 0, 0, - 78587, 101078, 5957, 0, 8926, 983310, 983309, 983308, 10745, 10174, - 983305, 113793, 983303, 983302, 983301, 0, 123593, 5056, 0, 0, 0, 120773, - 0, 9812, 0, 4460, 127792, 73066, 0, 128038, 0, 123608, 0, 64278, 0, 0, 0, - 66760, 0, 0, 70122, 0, 0, 917627, 0, 73823, 101071, 0, 2276, 0, 42579, 0, - 983300, 983299, 127831, 983297, 983296, 983295, 983294, 983293, 74207, - 121255, 10482, 12863, 73002, 2412, 0, 9522, 0, 983887, 120674, 101059, - 3384, 101058, 10702, 830, 0, 128166, 0, 8451, 0, 0, 121380, 69739, - 128957, 0, 0, 0, 0, 0, 0, 0, 4243, 92454, 73093, 0, 0, 4441, 0, 983290, - 983289, 66618, 983287, 125141, 411, 983284, 68068, 983282, 4056, 983894, - 0, 92666, 0, 983897, 983949, 0, 0, 3364, 42265, 64437, 0, 118816, 0, - 9684, 216, 0, 1401, 0, 0, 0, 0, 0, 0, 0, 11126, 5768, 3191, 0, 0, 0, 0, - 0, 0, 65895, 0, 0, 3338, 73935, 983278, 983277, 983276, 129605, 983274, - 983273, 2794, 8807, 0, 0, 110720, 0, 8312, 0, 110718, 11953, 11662, 0, 0, - 0, 0, 9534, 66767, 129040, 0, 11113, 0, 0, 73082, 0, 981, 0, 4330, - 119244, 120536, 1824, 0, 0, 7034, 41683, 123166, 0, 73754, 0, 0, 74478, - 128259, 983268, 983255, 983254, 43831, 983252, 66752, 983250, 983249, 0, - 70288, 65343, 0, 0, 43225, 0, 0, 0, 0, 126129, 0, 128608, 0, 0, 0, - 120726, 0, 983833, 11746, 0, 5216, 0, 0, 0, 0, 3468, 127149, 9230, 65942, - 0, 0, 5803, 120677, 0, 0, 13124, 0, 0, 0, 42843, 0, 0, 0, 66753, 11739, - 128318, 0, 128444, 0, 0, 0, 12448, 0, 121441, 13057, 73852, 124994, 0, 0, - 0, 0, 0, 0, 126612, 0, 68903, 0, 129470, 0, 917992, 0, 0, 0, 0, 0, 0, 0, - 92457, 0, 0, 0, 0, 0, 0, 0, 0, 125078, 0, 0, 0, 10970, 92208, 0, 0, 0, - 19944, 0, 9009, 8551, 0, 0, 0, 7575, 0, 0, 128899, 0, 129609, 78847, 0, - 78846, 0, 0, 0, 0, 0, 0, 0, 9775, 100682, 129191, 119052, 68629, 194703, - 0, 0, 78850, 92880, 0, 0, 0, 0, 0, 0, 0, 71273, 6184, 41540, 3303, 66182, + 10409, 123606, 0, 0, 129077, 42181, 0, 0, 2060, 0, 7111, 0, 0, 0, 0, + 72741, 0, 205, 0, 72346, 93771, 0, 9862, 6588, 43257, 0, 0, 0, 5505, + 93789, 5503, 65376, 0, 7125, 9819, 0, 0, 0, 5507, 12044, 194567, 0, 0, 0, + 7109, 0, 0, 7911, 10329, 10393, 8991, 125104, 69778, 11133, 129619, 8550, + 0, 5592, 2919, 0, 0, 5595, 0, 0, 4367, 0, 0, 5591, 41060, 5594, 0, 0, + 13142, 5590, 0, 72274, 118909, 75069, 123586, 9731, 71225, 64633, 0, 0, + 71217, 121361, 71227, 0, 0, 0, 0, 7137, 0, 0, 0, 10551, 10710, 0, 0, 0, + 120570, 0, 92364, 9936, 3348, 0, 0, 1444, 119058, 0, 74206, 983106, 0, + 1442, 129080, 0, 120959, 0, 0, 0, 0, 0, 0, 0, 3334, 73068, 118803, 0, 0, + 71219, 69770, 1651, 0, 8861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43626, 0, + 0, 3344, 0, 0, 12920, 0, 0, 0, 71853, 3438, 128711, 0, 0, 0, 0, 129068, + 0, 0, 65117, 0, 0, 0, 0, 66366, 128915, 0, 69772, 0, 0, 0, 0, 4973, 8784, + 0, 0, 0, 0, 0, 0, 0, 125198, 983283, 0, 0, 66413, 0, 0, 0, 0, 0, 9243, + 2464, 0, 0, 3372, 0, 0, 0, 70364, 7121, 0, 0, 0, 92163, 0, 0, 0, 0, 0, 0, + 0, 3354, 0, 0, 983103, 101233, 0, 3876, 0, 127983, 0, 43696, 43380, 0, + 74240, 0, 0, 0, 983966, 75074, 6589, 0, 0, 120993, 0, 0, 69609, 0, + 121210, 0, 10630, 71960, 0, 121293, 0, 0, 121287, 917942, 121337, 121215, + 0, 0, 0, 0, 0, 917940, 3366, 0, 917938, 0, 0, 0, 71062, 0, 121197, 0, + 6925, 71856, 0, 917929, 66780, 66274, 0, 72768, 0, 917930, 129482, 11138, + 0, 6754, 7118, 0, 64672, 65296, 0, 118957, 0, 0, 12296, 68457, 121320, 0, + 5282, 0, 72278, 0, 0, 0, 0, 0, 0, 66355, 0, 0, 68073, 64343, 0, 92744, + 195058, 195029, 0, 0, 195056, 195027, 0, 0, 128814, 195025, 6584, 195026, + 10657, 0, 74544, 0, 1200, 12243, 92269, 195062, 0, 129300, 11545, 0, + 120493, 3343, 4424, 11047, 0, 69863, 3896, 0, 0, 2947, 0, 0, 42221, 0, + 68139, 13059, 7942, 0, 3381, 0, 0, 0, 0, 0, 0, 78235, 0, 0, 0, 7044, + 65800, 78236, 0, 7045, 7175, 7047, 127884, 11791, 0, 0, 3881, 0, 0, + 127395, 0, 0, 67075, 7106, 72000, 0, 0, 74211, 41897, 92513, 0, 73040, + 66745, 0, 0, 0, 0, 121245, 0, 64354, 73083, 8777, 0, 129108, 8884, 2385, + 73067, 92450, 0, 0, 0, 42027, 12114, 0, 0, 64936, 0, 0, 0, 0, 0, 126605, + 0, 0, 0, 0, 73064, 0, 0, 0, 0, 0, 0, 0, 73057, 0, 123587, 0, 0, 0, 0, 0, + 70803, 0, 0, 124953, 0, 0, 0, 7048, 11087, 123600, 92536, 7043, 9600, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42050, 0, 55289, 0, 0, 657, 0, 195054, 4461, + 92903, 0, 0, 126490, 0, 4468, 0, 0, 0, 4456, 73070, 10720, 123588, 0, + 127520, 0, 0, 0, 195046, 260, 7714, 74163, 2045, 0, 65064, 4466, 0, 0, + 128087, 0, 41403, 0, 0, 0, 41406, 120692, 0, 0, 73939, 0, 0, 0, 41404, + 1165, 0, 4451, 13087, 0, 11258, 0, 73855, 0, 43014, 5439, 12061, 74586, + 3375, 128869, 0, 0, 0, 0, 0, 0, 0, 113823, 67078, 0, 67079, 0, 0, 0, 0, + 68459, 0, 0, 0, 0, 0, 0, 7280, 0, 0, 0, 4868, 8297, 0, 0, 42791, 0, + 66737, 66739, 0, 0, 5182, 0, 0, 72764, 0, 4465, 0, 12135, 0, 4464, 0, 0, + 977, 4458, 43827, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 92240, 0, 64443, + 126995, 73078, 129525, 0, 0, 0, 43026, 7612, 119591, 64413, 0, 0, 0, 0, + 0, 0, 0, 0, 123622, 0, 119160, 10204, 127947, 73063, 0, 0, 127236, 0, + 68746, 0, 8852, 0, 0, 0, 0, 128427, 123597, 7932, 0, 128463, 0, 0, 0, 0, + 0, 0, 0, 74893, 0, 0, 73095, 0, 8650, 0, 0, 0, 69900, 118872, 0, 70868, + 0, 6719, 0, 0, 0, 72836, 0, 0, 118991, 0, 123594, 73815, 4420, 0, 10583, + 7760, 0, 0, 128752, 71711, 0, 128407, 0, 0, 0, 9066, 0, 74795, 0, 0, 0, + 0, 0, 0, 0, 42825, 41854, 5304, 0, 124942, 6919, 8619, 0, 10038, 66454, + 9592, 129049, 0, 0, 110771, 110777, 110772, 0, 0, 0, 0, 0, 78498, 110773, + 43624, 0, 7779, 0, 0, 9479, 78493, 0, 0, 2224, 0, 0, 0, 0, 0, 42378, + 3368, 0, 66804, 7697, 69237, 0, 2030, 0, 68236, 8370, 0, 127961, 0, 0, + 983350, 127903, 983348, 983347, 5174, 42831, 983344, 70439, 983342, 8881, + 119047, 0, 70433, 0, 0, 0, 0, 0, 0, 9576, 0, 3347, 4160, 5154, 0, 3794, + 0, 0, 0, 0, 0, 127916, 73073, 8381, 4572, 69564, 126101, 0, 0, 0, 0, 0, + 0, 0, 92283, 0, 0, 5799, 983339, 70100, 983337, 983336, 983335, 43031, + 64425, 65128, 983331, 0, 73059, 0, 68616, 0, 0, 0, 0, 119826, 0, 0, + 123604, 0, 0, 283, 68665, 0, 532, 0, 0, 983808, 0, 0, 3370, 73077, + 119132, 5443, 71431, 0, 0, 0, 0, 0, 2298, 0, 0, 0, 983330, 983329, + 983328, 983327, 7144, 983325, 119600, 983323, 983322, 983321, 0, 78816, + 128833, 0, 0, 0, 0, 0, 0, 0, 0, 73088, 0, 123592, 983933, 0, 0, 0, 0, + 5186, 7360, 127837, 0, 12108, 0, 65124, 0, 0, 0, 6326, 43344, 0, 0, + 42562, 0, 0, 0, 983320, 65495, 983318, 101066, 983316, 101065, 983314, + 65490, 983312, 125034, 0, 101070, 0, 55245, 128927, 1630, 128232, 65483, + 0, 0, 0, 65476, 0, 0, 119214, 9283, 10183, 0, 0, 65499, 0, 64593, 66758, + 3376, 0, 0, 0, 101077, 43872, 12940, 0, 0, 78587, 101078, 5957, 0, 8926, + 983310, 983309, 983308, 10745, 10174, 983305, 113793, 983303, 983302, + 983301, 0, 123593, 5056, 0, 0, 0, 120773, 0, 9812, 0, 4460, 127792, + 73066, 0, 128038, 0, 123608, 0, 64278, 0, 0, 0, 66760, 0, 0, 70122, 0, 0, + 917627, 0, 73823, 101071, 127922, 2276, 0, 42579, 0, 983300, 983299, + 127831, 983297, 983296, 983295, 983294, 983293, 74207, 121255, 10482, + 12863, 73002, 2412, 0, 9522, 0, 983887, 120674, 101059, 3384, 101058, + 10702, 830, 0, 128166, 0, 8451, 0, 0, 121380, 69739, 128957, 0, 0, 0, 0, + 0, 0, 0, 4243, 92454, 73093, 0, 0, 4441, 0, 983290, 983289, 66618, + 983287, 125141, 411, 983284, 68068, 983282, 4056, 983894, 0, 92666, 0, + 983897, 983949, 0, 0, 3364, 42265, 64437, 0, 118816, 0, 9684, 216, 0, + 1401, 0, 0, 0, 0, 0, 0, 0, 11126, 5768, 3191, 0, 0, 0, 0, 0, 0, 65895, 0, + 0, 3338, 73935, 983278, 983277, 983276, 129605, 983274, 983273, 2794, + 8807, 0, 0, 110720, 0, 8312, 0, 110718, 11953, 11662, 0, 0, 0, 0, 9534, + 66767, 129040, 0, 11113, 0, 0, 73082, 0, 981, 0, 4330, 119244, 120536, + 1824, 0, 0, 7034, 41683, 123166, 0, 73754, 0, 0, 74478, 128259, 983268, + 983255, 983254, 43831, 983252, 66752, 983250, 983249, 0, 70288, 65343, 0, + 0, 43225, 0, 0, 0, 0, 126129, 0, 128608, 0, 0, 0, 120726, 0, 983833, + 11746, 0, 5216, 0, 0, 0, 0, 3468, 127149, 9230, 65942, 0, 0, 5803, + 120677, 0, 0, 13124, 0, 0, 0, 42843, 0, 0, 0, 66753, 11739, 128318, 0, + 128444, 0, 0, 0, 12448, 0, 121441, 13057, 73852, 124994, 0, 0, 0, 0, 0, + 0, 126612, 0, 68903, 0, 129470, 0, 917992, 0, 0, 0, 0, 0, 0, 0, 92457, 0, + 0, 0, 0, 0, 0, 0, 0, 125078, 0, 0, 0, 10970, 92208, 0, 0, 0, 19944, 0, + 9009, 8551, 0, 0, 0, 7575, 0, 0, 128899, 0, 129609, 78847, 0, 78846, 0, + 0, 69256, 0, 0, 0, 0, 9775, 100682, 129191, 119052, 68629, 194703, 0, 0, + 78850, 92880, 0, 0, 0, 0, 0, 0, 0, 71273, 6184, 41540, 3303, 66182, 11786, 66180, 66203, 3422, 0, 68290, 43007, 4478, 66178, 0, 0, 126216, 0, 4477, 0, 69608, 66184, 66183, 66204, 66194, 0, 66198, 41880, 66188, 66197, 78148, 66195, 66190, 66191, 41111, 66189, 73788, 7788, 0, 0, 0, 0, 0, 2221, 78163, 6535, 78161, 78162, 430, 78160, 78156, 78158, 0, 0, 4945, 0, 4950, 0, 78165, 0, 67118, 0, 5964, 12908, 0, 0, 0, 74477, 83390, 0, 4949, 0, 443, 0, 4944, 5467, 119603, 983260, 0, 9364, 0, 119148, 4946, 0, - 3788, 126106, 983699, 0, 120847, 0, 74441, 0, 0, 12072, 92248, 0, 983689, - 0, 128676, 12091, 0, 0, 0, 4673, 0, 4678, 0, 0, 65059, 43860, 0, 0, 0, - 128151, 1199, 0, 8356, 0, 0, 4677, 0, 0, 0, 4672, 78173, 78175, 78171, - 78172, 72255, 78170, 78166, 4674, 128450, 194944, 0, 124970, 0, 119579, - 0, 0, 1855, 0, 0, 127806, 0, 0, 68912, 72323, 0, 12988, 121000, 0, 0, 0, - 4654, 6840, 983427, 0, 73993, 0, 4649, 65209, 983889, 93839, 4648, 0, - 121169, 983431, 126231, 983422, 66846, 7828, 4650, 983421, 72879, 0, - 4653, 7822, 0, 0, 43187, 0, 983574, 6821, 0, 0, 0, 0, 0, 0, 66756, - 983428, 0, 0, 0, 8547, 0, 42165, 0, 119228, 6836, 0, 0, 4662, 0, 0, 0, - 9146, 599, 4657, 0, 120754, 0, 4656, 0, 0, 7811, 40994, 0, 6414, 5967, - 4658, 3725, 0, 5814, 4661, 127760, 194961, 0, 0, 64904, 0, 10833, 0, 0, - 4867, 128717, 0, 11459, 3054, 0, 40996, 0, 7605, 4622, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19926, 0, 0, 65307, 4617, 0, 0, 0, 4616, 10518, 0, 127160, 0, - 5958, 0, 983444, 4618, 0, 0, 120675, 4621, 0, 0, 522, 125213, 11139, - 65803, 194972, 0, 12201, 6135, 121060, 983420, 0, 983093, 0, 983418, - 983411, 983432, 4638, 983416, 0, 78242, 5965, 78240, 66569, 68646, 0, - 983450, 74392, 5335, 0, 0, 4633, 0, 119045, 983446, 4632, 0, 5542, 5333, - 0, 983423, 68648, 5331, 4634, 0, 0, 5338, 4637, 0, 0, 43477, 0, 42493, 0, - 42361, 0, 0, 73853, 0, 0, 0, 74204, 11343, 0, 10358, 10422, 4758, 0, - 1608, 5252, 0, 0, 4753, 78239, 11344, 78237, 0, 5231, 74384, 0, 0, 0, 0, - 0, 0, 0, 0, 5229, 4757, 0, 0, 5227, 4752, 0, 65235, 5234, 73044, 0, 0, 0, - 0, 0, 0, 7460, 0, 917936, 0, 0, 74760, 65189, 0, 92230, 0, 0, 5574, 0, 0, - 65139, 5577, 0, 0, 118871, 68641, 8965, 7635, 0, 5316, 70021, 5314, - 74555, 5572, 0, 5312, 0, 5525, 5330, 5319, 68292, 0, 65066, 0, 0, 983491, - 0, 0, 127851, 0, 74851, 0, 0, 64609, 0, 0, 128593, 0, 129339, 0, 8632, 0, - 0, 0, 195012, 5735, 195013, 1692, 0, 4610, 0, 4305, 0, 4609, 43478, 4614, - 0, 0, 5287, 5309, 5285, 0, 5961, 4647, 5283, 10743, 0, 71889, 601, 4613, - 0, 0, 9208, 4608, 74044, 71107, 5190, 0, 0, 92410, 43965, 2265, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 5960, 0, 8992, 65293, 0, 1782, 0, 0, 0, 0, 0, 5501, - 0, 42508, 69759, 120749, 0, 0, 195023, 983919, 43900, 128325, 0, 68134, - 111180, 74209, 0, 64740, 0, 0, 0, 983916, 3767, 5737, 0, 4865, 0, 5740, - 0, 5736, 7724, 0, 7193, 0, 0, 5739, 0, 4866, 0, 0, 0, 4869, 67093, 0, 0, - 128514, 6650, 983483, 0, 983474, 78376, 4870, 0, 68661, 6716, 983473, - 68667, 69786, 68676, 0, 10122, 4864, 66568, 0, 0, 0, 9603, 68652, 126213, - 42734, 745, 0, 0, 0, 4777, 0, 917925, 68631, 42775, 68196, 0, 0, 0, 0, - 5966, 0, 4778, 127890, 0, 0, 4781, 127196, 64407, 0, 74132, 8577, 71221, - 0, 71223, 0, 4782, 0, 0, 120757, 68618, 43472, 43056, 68622, 0, 92986, - 4776, 0, 11492, 0, 0, 13176, 0, 0, 0, 0, 0, 0, 0, 4849, 8242, 9561, - 73922, 0, 0, 0, 0, 5963, 0, 125201, 0, 4850, 72121, 0, 590, 4853, 0, - 4854, 0, 5164, 0, 1605, 5124, 0, 111165, 0, 8471, 0, 111164, 12445, 3785, - 0, 111162, 0, 0, 4848, 2530, 0, 2068, 1964, 0, 0, 10796, 0, 0, 0, 0, 0, - 4794, 0, 0, 0, 4797, 68040, 111152, 43465, 4792, 0, 0, 0, 0, 0, 110842, - 983101, 92963, 0, 0, 0, 4221, 92360, 118869, 0, 0, 0, 70042, 0, 0, 0, 0, - 10739, 65090, 0, 119327, 126541, 0, 0, 119326, 0, 0, 4937, 43376, 0, 0, - 10597, 0, 11722, 9248, 129566, 42879, 11725, 0, 0, 7579, 11141, 73958, - 4941, 0, 917538, 9140, 4936, 5261, 0, 0, 72298, 0, 4942, 0, 4938, 0, 0, - 5259, 9369, 983429, 111182, 5257, 0, 6844, 4964, 5264, 0, 0, 0, 41411, 0, + 3788, 126106, 983699, 0, 120847, 129858, 74441, 0, 0, 12072, 92248, 0, + 983689, 0, 128676, 12091, 0, 0, 0, 4673, 0, 4678, 0, 0, 65059, 43860, 0, + 0, 0, 128151, 1199, 0, 8356, 0, 0, 4677, 0, 0, 0, 4672, 78173, 78175, + 78171, 78172, 72255, 78170, 78166, 4674, 128450, 194944, 0, 124970, 0, + 119579, 0, 129919, 1855, 0, 0, 127806, 0, 0, 68912, 72323, 0, 12988, + 121000, 0, 0, 0, 4654, 6840, 983427, 0, 73993, 0, 4649, 65209, 983889, + 93839, 4648, 0, 121169, 983431, 126231, 983422, 66846, 7828, 4650, + 983421, 72879, 0, 4653, 7822, 0, 0, 43187, 0, 983586, 6821, 0, 0, 0, 0, + 0, 0, 66756, 983428, 0, 0, 0, 8547, 0, 42165, 0, 119228, 6836, 0, 0, + 4662, 0, 0, 0, 9146, 599, 4657, 0, 120754, 0, 4656, 0, 0, 7811, 40994, 0, + 6414, 5967, 4658, 3725, 0, 5814, 4661, 127760, 194961, 0, 0, 64904, 0, + 10833, 0, 0, 4867, 128717, 0, 11459, 3054, 0, 40996, 0, 7605, 4622, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19926, 0, 0, 65307, 4617, 0, 0, 0, 4616, 10518, 0, + 127160, 0, 5958, 0, 983444, 4618, 0, 983437, 120675, 4621, 0, 983439, + 522, 125213, 11139, 65803, 194972, 0, 12201, 6135, 121060, 983420, 0, + 983093, 0, 983418, 983411, 983432, 4638, 983416, 0, 78242, 5965, 78240, + 66569, 68646, 0, 983450, 74392, 5335, 0, 0, 4633, 0, 119045, 983446, + 4632, 0, 5542, 5333, 0, 983423, 68648, 5331, 4634, 0, 0, 5338, 4637, 0, + 0, 43477, 0, 42493, 0, 42361, 0, 0, 73853, 0, 0, 0, 74204, 11343, 0, + 10358, 10422, 4758, 0, 1608, 5252, 0, 0, 4753, 78239, 11344, 78237, 0, + 5231, 74384, 0, 0, 0, 0, 0, 0, 0, 71991, 5229, 4757, 0, 0, 5227, 4752, 0, + 65235, 5234, 73044, 0, 0, 0, 0, 0, 0, 7460, 0, 917936, 0, 0, 74760, + 65189, 0, 92230, 0, 0, 5574, 0, 0, 65139, 5577, 0, 0, 118871, 68641, + 8965, 7635, 0, 5316, 70021, 5314, 74555, 5572, 0, 5312, 0, 5525, 5330, + 5319, 68292, 0, 65066, 0, 0, 983491, 0, 0, 127851, 0, 74851, 0, 0, 64609, + 0, 0, 128593, 0, 129339, 0, 8632, 0, 0, 0, 195012, 5735, 195013, 1692, + 118792, 4610, 0, 4305, 0, 4609, 43478, 4614, 0, 0, 5287, 5309, 5285, 0, + 5961, 4647, 5283, 10743, 0, 71889, 601, 4613, 0, 0, 9208, 4608, 74044, + 71107, 5190, 0, 0, 92410, 43965, 2265, 0, 0, 0, 0, 0, 0, 0, 129953, 0, 0, + 5960, 0, 8992, 65293, 0, 1782, 0, 0, 0, 0, 0, 5501, 0, 42508, 69759, + 120749, 0, 0, 195023, 983919, 43900, 128325, 0, 68134, 111180, 74209, 0, + 64740, 0, 0, 0, 983916, 3767, 5737, 0, 4865, 0, 5740, 0, 5736, 7724, 0, + 7193, 0, 0, 5739, 0, 4866, 0, 0, 0, 4869, 67093, 0, 0, 128514, 6650, + 983483, 0, 983474, 78376, 4870, 0, 68661, 6716, 983473, 68667, 69786, + 68676, 0, 10122, 4864, 66568, 0, 0, 0, 9603, 68652, 126213, 42734, 745, + 0, 0, 0, 4777, 0, 917925, 68631, 42775, 68196, 0, 0, 0, 0, 5966, 0, 4778, + 127890, 0, 0, 4781, 127196, 64407, 0, 74132, 8577, 71221, 0, 71223, 0, + 4782, 0, 0, 120757, 68618, 43472, 43056, 68622, 0, 92986, 4776, 0, 11492, + 0, 0, 13176, 0, 0, 0, 0, 0, 0, 0, 4849, 8242, 9561, 73922, 0, 0, 0, 0, + 5963, 0, 125201, 0, 4850, 72121, 0, 590, 4853, 0, 4854, 0, 5164, 0, 1605, + 5124, 0, 111165, 0, 8471, 0, 111164, 12445, 3785, 0, 111162, 0, 0, 4848, + 2530, 0, 2068, 1964, 0, 0, 10796, 0, 0, 0, 0, 0, 4794, 0, 0, 0, 4797, + 68040, 111152, 43465, 4792, 0, 0, 0, 0, 0, 110842, 983101, 92963, 0, 0, + 0, 4221, 92360, 118869, 0, 0, 0, 70042, 0, 0, 0, 0, 10739, 65090, 0, + 119327, 126541, 0, 0, 119326, 0, 0, 4937, 43376, 0, 0, 10597, 983440, + 11722, 9248, 129566, 42879, 11725, 0, 0, 7579, 11141, 73958, 4941, 0, + 917538, 9140, 4936, 5261, 0, 0, 72298, 0, 4942, 0, 4938, 0, 0, 5259, + 9369, 983429, 111182, 5257, 0, 6844, 4964, 5264, 0, 0, 0, 41411, 0, 121473, 73684, 128233, 9482, 4873, 41991, 64707, 42526, 127989, 64480, 64725, 983442, 0, 0, 0, 0, 0, 0, 73043, 0, 389, 10893, 7521, 0, 4872, 5463, 0, 3125, 111124, 0, 4878, 5459, 4604, 0, 0, 5465, 0, 0, 0, 0, 9563, - 0, 0, 128419, 125273, 0, 0, 0, 0, 67735, 0, 0, 0, 0, 0, 78179, 0, 917838, - 0, 917833, 0, 917836, 0, 0, 3082, 0, 0, 0, 0, 0, 7079, 5856, 917842, - 5163, 0, 0, 1817, 66724, 0, 0, 10564, 7763, 13077, 0, 0, 68140, 111137, - 0, 0, 0, 111139, 0, 111149, 121457, 0, 0, 0, 983189, 73081, 0, 0, 983117, - 983077, 0, 42156, 0, 0, 0, 983080, 0, 0, 0, 119254, 120693, 0, 69386, 0, - 118881, 0, 78189, 0, 78186, 78188, 0, 0, 0, 0, 110877, 0, 3108, 9745, 0, - 0, 0, 118825, 0, 0, 0, 0, 0, 10972, 0, 0, 42768, 715, 983113, 121117, - 9453, 5348, 10943, 0, 983169, 0, 0, 0, 983153, 0, 0, 11551, 128464, 0, 0, - 9051, 0, 71728, 0, 120791, 119523, 0, 6404, 66458, 68376, 11984, 9156, - 65222, 74454, 78180, 0, 3128, 4789, 5067, 5066, 0, 4784, 0, 8827, 1146, - 5065, 78196, 78192, 78193, 78190, 78191, 5064, 5326, 0, 9450, 5063, - 120361, 78200, 78201, 5062, 69733, 74146, 0, 0, 0, 0, 77992, 0, 3933, 0, - 0, 12337, 0, 125023, 0, 0, 0, 194759, 0, 0, 82993, 42130, 0, 5151, - 917832, 120357, 0, 93980, 0, 7620, 3800, 0, 0, 0, 127952, 0, 0, 4786, - 127991, 4185, 0, 128742, 0, 983193, 73978, 0, 4593, 0, 120584, 0, 0, - 110715, 10532, 110713, 110714, 110711, 110712, 64759, 1325, 5166, 9888, - 0, 5148, 0, 0, 78205, 78206, 64140, 78204, 64131, 3119, 917814, 0, + 0, 0, 128419, 125273, 82963, 0, 0, 0, 67735, 0, 0, 0, 0, 0, 78179, 0, + 917838, 0, 917833, 0, 917836, 0, 0, 3082, 0, 0, 0, 0, 0, 7079, 5856, + 917842, 5163, 0, 0, 1817, 66724, 0, 0, 10564, 7763, 13077, 0, 0, 68140, + 111137, 0, 0, 0, 111139, 0, 111149, 121457, 0, 0, 0, 983189, 73081, 0, 0, + 983117, 983077, 0, 42156, 0, 0, 0, 983080, 0, 0, 0, 119254, 120693, 0, + 69386, 0, 118881, 0, 78189, 0, 78186, 78188, 0, 0, 0, 0, 110877, 0, 3108, + 9745, 0, 0, 0, 118825, 0, 0, 0, 0, 0, 10972, 0, 0, 42768, 715, 983113, + 121117, 9453, 5348, 10943, 0, 983169, 0, 0, 0, 983153, 0, 0, 11551, + 128464, 0, 0, 9051, 0, 71728, 0, 120791, 119523, 0, 6404, 66458, 68376, + 11984, 9156, 65222, 74454, 78180, 0, 3128, 4789, 5067, 5066, 0, 4784, 0, + 8827, 1146, 5065, 78196, 78192, 78193, 78190, 78191, 5064, 5326, 0, 9450, + 5063, 120361, 78200, 78201, 5062, 69733, 74146, 0, 0, 0, 0, 77992, 0, + 3933, 0, 0, 12337, 0, 125023, 0, 0, 0, 194759, 0, 0, 82993, 42130, 0, + 5151, 917832, 120357, 0, 93980, 0, 7620, 3800, 0, 0, 0, 127952, 0, 0, + 4786, 127991, 4185, 0, 128742, 0, 983193, 73978, 0, 4593, 0, 120584, 0, + 0, 110715, 10532, 110713, 110714, 110711, 110712, 64759, 1325, 5166, + 9888, 0, 5148, 0, 0, 78205, 78206, 64140, 78204, 64131, 3119, 917814, 0, 983433, 917820, 12095, 0, 0, 636, 128002, 0, 983464, 0, 78531, 7836, 42741, 64137, 0, 118969, 0, 92431, 0, 0, 0, 0, 0, 8618, 0, 41384, 0, 0, - 0, 3937, 12312, 128261, 0, 0, 0, 912, 6349, 4536, 0, 0, 126594, 0, 0, 0, - 3935, 120665, 0, 0, 0, 0, 118859, 0, 0, 0, 0, 12046, 12599, 0, 0, 0, 0, - 7227, 0, 0, 0, 983066, 0, 0, 0, 113817, 0, 78246, 0, 0, 0, 0, 0, 0, 0, 0, - 128874, 43907, 0, 0, 0, 0, 4644, 8818, 0, 0, 0, 0, 93066, 66452, 126081, - 1644, 101043, 9658, 43744, 11385, 65947, 983173, 43983, 0, 0, 0, 8962, 0, - 0, 2466, 42039, 67669, 0, 0, 42117, 100698, 0, 0, 0, 0, 43745, 5318, 0, - 917807, 0, 0, 0, 7054, 64147, 0, 917804, 68195, 6698, 0, 0, 0, 70849, - 11981, 12202, 0, 121364, 0, 7059, 11608, 975, 0, 65843, 170, 0, 67239, - 42708, 0, 0, 6058, 0, 0, 0, 70507, 0, 0, 9818, 0, 0, 42106, 0, 983065, - 4738, 42105, 7062, 0, 4737, 11779, 4742, 120564, 92391, 0, 41374, 41375, - 983376, 6715, 12700, 7049, 983374, 0, 0, 0, 4741, 42108, 983365, 64159, - 4736, 64148, 0, 849, 0, 128247, 983361, 0, 120913, 917997, 0, 983379, - 9496, 66371, 983403, 0, 11322, 0, 93008, 3928, 983152, 0, 10706, 7198, 0, - 4842, 12053, 0, 0, 4841, 0, 4171, 12008, 68416, 3923, 1490, 0, 0, 983393, - 40972, 5245, 72288, 983395, 126578, 0, 4845, 8332, 40974, 0, 4840, 9077, - 0, 2408, 72851, 4825, 0, 0, 0, 0, 126251, 0, 0, 983353, 0, 983354, 0, - 4826, 42440, 0, 0, 1274, 0, 74315, 0, 120384, 0, 121200, 0, 0, 0, 4830, - 983388, 129044, 0, 0, 119082, 0, 64105, 0, 0, 4824, 120397, 0, 0, 1888, - 64127, 7861, 125111, 78524, 41836, 0, 10873, 72439, 0, 64098, 12214, 0, - 41834, 0, 358, 128120, 41833, 11442, 0, 0, 0, 0, 64115, 0, 0, 0, 120721, - 119053, 0, 119055, 119054, 0, 0, 0, 0, 4017, 12827, 5241, 0, 73042, - 41118, 3924, 0, 11366, 0, 0, 0, 0, 41116, 69455, 0, 0, 0, 0, 11917, 0, - 74000, 4721, 129635, 983918, 0, 0, 0, 0, 0, 0, 122907, 0, 128702, 4722, - 6816, 124974, 0, 4725, 67099, 4726, 0, 0, 123171, 0, 123194, 0, 0, 0, - 4015, 0, 8052, 78766, 0, 0, 128294, 0, 0, 4720, 73090, 125003, 0, 0, - 1656, 41831, 0, 0, 41843, 0, 0, 1452, 13111, 0, 0, 0, 8552, 64113, 41845, - 64073, 120354, 0, 0, 120066, 120067, 7064, 64070, 9948, 0, 0, 0, 0, 2420, - 0, 0, 0, 0, 120052, 120053, 120050, 74920, 3938, 120057, 120054, 119249, - 120060, 71920, 120058, 120059, 120064, 72203, 7955, 64074, 4713, 128196, - 983107, 0, 0, 0, 65152, 10198, 120044, 120045, 120042, 6713, 4532, - 120049, 120046, 120047, 4717, 7046, 0, 66450, 4712, 75055, 0, 121085, 0, - 8155, 4718, 3942, 4714, 9625, 0, 6383, 0, 12006, 0, 0, 0, 0, 0, 65414, 0, - 0, 129061, 66437, 66025, 74115, 0, 0, 11228, 4809, 0, 92221, 72352, 0, 0, - 0, 65405, 0, 0, 0, 73934, 4545, 0, 917566, 0, 4813, 78699, 0, 0, 4808, 0, - 0, 65475, 0, 0, 4814, 72240, 4810, 0, 0, 68784, 10761, 71249, 3522, 0, - 78693, 65404, 0, 0, 0, 0, 0, 6691, 70125, 0, 126223, 0, 0, 0, 43858, 0, - 0, 12992, 65407, 0, 0, 3919, 0, 0, 0, 0, 0, 0, 12235, 110748, 0, 0, - 64091, 68739, 64080, 0, 64090, 0, 0, 0, 0, 0, 8454, 0, 0, 983858, 0, 0, - 0, 4780, 0, 0, 92764, 64621, 6732, 0, 0, 0, 0, 121363, 0, 0, 120817, - 6976, 0, 119005, 0, 93809, 0, 0, 0, 12526, 120399, 2315, 0, 1938, 0, 0, - 0, 0, 0, 0, 0, 120358, 93794, 0, 0, 0, 93810, 0, 2291, 0, 0, 0, 0, - 129429, 0, 10799, 0, 0, 66372, 0, 4193, 0, 0, 983057, 7998, 0, 0, 0, 0, - 2316, 0, 0, 0, 0, 125241, 0, 0, 74140, 0, 0, 0, 0, 3762, 93813, 120672, - 93820, 0, 0, 0, 70098, 3780, 12808, 8163, 983154, 0, 0, 3906, 12349, 0, - 8326, 0, 65498, 3763, 0, 5618, 0, 3779, 0, 43613, 0, 128007, 0, 0, 0, 0, - 280, 0, 126252, 983448, 13072, 1894, 0, 0, 65478, 43310, 7231, 0, 11773, - 0, 0, 0, 0, 0, 0, 7559, 11652, 10009, 110765, 110766, 110763, 110764, - 4470, 110762, 0, 0, 983441, 0, 5249, 0, 0, 8756, 0, 0, 41694, 120585, - 92349, 0, 0, 0, 69685, 983768, 983445, 113794, 0, 6808, 41319, 13125, - 66332, 127977, 0, 2290, 0, 983413, 0, 0, 3943, 0, 41205, 0, 0, 0, 0, - 5352, 0, 0, 41207, 0, 7384, 69647, 41204, 0, 41209, 69637, 0, 43607, 0, - 0, 5420, 0, 10134, 0, 0, 4018, 7150, 0, 0, 0, 0, 0, 129606, 2561, 0, 0, - 7148, 12076, 0, 0, 0, 0, 6276, 1706, 0, 0, 7146, 0, 128277, 41819, 74991, - 0, 10847, 41822, 72248, 860, 0, 0, 0, 69641, 10753, 41820, 126118, 0, - 71898, 0, 92617, 128567, 0, 0, 43016, 0, 0, 92225, 0, 0, 0, 0, 4022, 0, - 0, 110807, 0, 41691, 0, 75060, 0, 0, 65292, 0, 110812, 0, 3911, 110811, - 110808, 110809, 0, 125191, 7000, 3904, 118997, 72261, 0, 0, 0, 13123, - 10846, 0, 0, 0, 0, 0, 74082, 0, 0, 0, 0, 3777, 128329, 0, 9636, 71726, 0, - 0, 9367, 593, 0, 3999, 0, 41713, 0, 0, 67677, 0, 0, 0, 9763, 120280, - 120283, 12347, 124, 12981, 41127, 92527, 0, 0, 0, 0, 0, 43987, 0, 0, - 1769, 41715, 2463, 2151, 0, 0, 71222, 1538, 93044, 0, 0, 0, 7795, 120300, - 0, 92493, 10955, 0, 0, 0, 78208, 9498, 78207, 127033, 78210, 120288, - 3939, 120290, 120285, 8943, 120287, 120286, 120297, 4491, 120299, 42602, - 120293, 120292, 120295, 120294, 0, 0, 0, 0, 0, 0, 1511, 9324, 0, 0, 0, 0, - 0, 64536, 0, 0, 0, 124935, 6822, 12862, 0, 0, 42143, 41828, 0, 917629, - 70864, 118879, 0, 0, 0, 41826, 128413, 0, 0, 13279, 7917, 0, 0, 0, 0, 0, - 0, 92332, 0, 0, 43515, 0, 0, 0, 4013, 0, 0, 0, 72224, 125266, 0, 68243, - 2432, 0, 0, 0, 0, 0, 69952, 0, 0, 0, 10949, 0, 0, 0, 0, 0, 0, 0, 128574, - 43233, 0, 42517, 0, 0, 0, 0, 0, 64468, 119359, 6474, 127275, 43497, - 12656, 128122, 119353, 0, 1665, 0, 0, 0, 119351, 0, 0, 5256, 0, 0, 0, - 2859, 0, 0, 0, 0, 0, 0, 128220, 0, 770, 0, 811, 0, 0, 917551, 42244, - 64427, 0, 72222, 0, 3895, 0, 74341, 12087, 0, 42859, 10193, 3116, 7747, - 0, 0, 43496, 0, 0, 0, 0, 41877, 0, 65382, 64614, 0, 64296, 0, 6345, 0, - 2663, 0, 121234, 0, 0, 10150, 0, 64308, 1522, 597, 0, 0, 41201, 64731, 0, - 0, 41198, 0, 71483, 3092, 0, 0, 4783, 71448, 0, 0, 0, 10812, 0, 0, 0, - 3078, 0, 0, 0, 0, 0, 71703, 394, 3088, 0, 0, 0, 3991, 0, 129072, 0, 424, - 67652, 74927, 0, 0, 0, 0, 0, 0, 42231, 2209, 128215, 72983, 0, 41840, - 129136, 5344, 1298, 0, 13155, 0, 128973, 41838, 0, 8488, 1003, 41837, 0, - 0, 0, 48, 0, 0, 8493, 0, 0, 0, 65487, 0, 8465, 10332, 13172, 0, 0, 10449, - 126989, 127014, 69606, 69447, 3984, 129159, 0, 0, 0, 0, 0, 0, 0, 0, - 64758, 0, 100947, 0, 0, 9096, 0, 0, 9172, 128545, 0, 0, 5955, 67666, 0, - 0, 0, 0, 0, 74426, 3926, 71734, 0, 8798, 100946, 92165, 0, 0, 120696, 0, - 0, 0, 118805, 10353, 10417, 0, 0, 0, 128629, 4019, 0, 0, 0, 8219, 68402, - 0, 0, 121301, 0, 0, 0, 0, 0, 0, 0, 0, 110625, 42474, 10642, 3909, 9950, - 0, 128139, 69619, 68678, 92917, 0, 1049, 43517, 65707, 11943, 41806, 0, - 68635, 3921, 0, 11775, 121352, 69820, 1038, 42303, 9823, 0, 2145, 4008, - 68624, 0, 121025, 0, 0, 5153, 41805, 0, 0, 763, 9211, 0, 0, 0, 0, 0, - 127142, 0, 0, 65179, 0, 8621, 0, 118878, 0, 0, 0, 0, 182, 0, 0, 0, 0, - 72978, 9058, 8489, 0, 71188, 5969, 65909, 10848, 4570, 0, 128614, 4255, - 0, 0, 41189, 4003, 69785, 68109, 13293, 41192, 0, 0, 42251, 0, 0, 126085, - 11287, 6128, 121315, 11034, 0, 68207, 0, 65506, 42382, 0, 0, 66872, 9932, - 43516, 0, 125098, 0, 41814, 0, 71234, 0, 12117, 127040, 127041, 10540, - 127043, 9063, 78000, 0, 0, 0, 12897, 0, 0, 0, 6065, 0, 0, 0, 8692, 41186, - 41816, 0, 41818, 41187, 0, 42196, 0, 110690, 110691, 126115, 0, 0, - 125235, 4710, 0, 5956, 7621, 110641, 92624, 4705, 716, 74918, 110693, - 4704, 0, 0, 127112, 161, 0, 0, 0, 4706, 0, 0, 0, 4709, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1700, 119223, 0, 0, 128119, 4004, 0, 73071, 69383, 69914, 8506, - 0, 0, 126996, 2538, 937, 0, 4734, 0, 0, 0, 0, 0, 4729, 0, 0, 0, 4728, 0, + 0, 3937, 12312, 128261, 0, 0, 0, 912, 6349, 4536, 71964, 0, 126594, 0, 0, + 0, 3935, 120665, 0, 0, 0, 0, 118859, 0, 121116, 0, 0, 12046, 12599, 0, 0, + 0, 0, 7227, 0, 0, 0, 983066, 0, 0, 0, 113817, 0, 78246, 0, 0, 0, 0, 0, + 127405, 101531, 0, 101530, 43907, 0, 0, 0, 0, 4644, 8818, 0, 0, 0, 0, + 93066, 66452, 126081, 1644, 101043, 9658, 43744, 11385, 65947, 983173, + 43983, 0, 0, 0, 8962, 0, 0, 2466, 42039, 67669, 0, 0, 42117, 100698, 0, + 0, 0, 0, 43745, 5318, 0, 120498, 0, 0, 0, 7054, 64147, 0, 917804, 68195, + 6698, 0, 0, 0, 70849, 11981, 12202, 0, 121364, 0, 7059, 11608, 975, 0, + 65843, 170, 0, 67239, 42708, 0, 0, 6058, 0, 0, 0, 70507, 0, 0, 9818, 0, + 0, 42106, 0, 983065, 4738, 42105, 7062, 0, 4737, 11779, 4742, 120564, + 92391, 0, 41374, 41375, 983376, 6715, 12700, 7049, 983374, 0, 0, 0, 4741, + 42108, 983365, 64159, 4736, 64148, 0, 849, 0, 128247, 983361, 0, 120913, + 917997, 0, 983379, 9496, 66371, 983403, 983377, 11322, 0, 93008, 3928, + 983152, 0, 10706, 7198, 0, 4842, 12053, 0, 0, 4841, 0, 4171, 12008, + 68416, 3923, 1490, 0, 0, 983393, 40972, 5245, 72288, 983395, 126578, 0, + 4845, 8332, 40974, 0, 4840, 9077, 0, 2408, 72851, 4825, 0, 0, 0, 0, + 126251, 0, 0, 983353, 0, 983354, 0, 4826, 42440, 0, 0, 1274, 0, 74315, 0, + 120384, 0, 121200, 0, 0, 0, 4830, 983388, 129044, 0, 0, 119082, 0, 64105, + 0, 0, 4824, 120397, 0, 0, 1888, 64127, 7861, 125111, 78524, 41836, + 110613, 10873, 72439, 0, 64098, 12214, 0, 41834, 0, 358, 128120, 41833, + 11442, 0, 0, 0, 0, 64115, 0, 0, 0, 120721, 119053, 0, 119055, 119054, 0, + 0, 0, 0, 4017, 12827, 5241, 0, 73042, 41118, 3924, 0, 11366, 0, 0, 0, 0, + 41116, 69455, 0, 0, 0, 0, 11917, 0, 74000, 4721, 129635, 983918, 0, 0, 0, + 0, 0, 0, 122907, 0, 128702, 4722, 6816, 124974, 0, 4725, 67099, 4726, 0, + 129856, 123171, 0, 123194, 0, 0, 0, 4015, 0, 8052, 78766, 0, 0, 128294, + 0, 0, 4720, 73090, 125003, 0, 0, 1656, 41831, 0, 0, 41843, 0, 0, 1452, + 13111, 0, 0, 0, 8552, 64113, 41845, 64073, 120354, 0, 0, 120066, 120067, + 7064, 64070, 9948, 0, 0, 0, 0, 2420, 0, 0, 0, 0, 120052, 120053, 120050, + 74920, 3938, 120057, 120054, 119249, 120060, 71920, 120058, 120059, + 120064, 72203, 7955, 64074, 4713, 128196, 983107, 0, 0, 0, 65152, 10198, + 120044, 120045, 120042, 6713, 4532, 120049, 120046, 120047, 4717, 7046, + 0, 66450, 4712, 75055, 0, 121085, 0, 8155, 4718, 3942, 4714, 9625, 0, + 6383, 0, 12006, 0, 0, 0, 0, 0, 65414, 0, 0, 129061, 66437, 66025, 74115, + 0, 0, 11228, 4809, 0, 92221, 72352, 0, 0, 0, 65405, 129912, 0, 0, 73934, + 4545, 0, 917566, 0, 4813, 78699, 0, 0, 4808, 0, 0, 65475, 0, 0, 4814, + 72240, 4810, 0, 0, 68784, 10761, 71249, 3522, 0, 78693, 65404, 0, 0, 0, + 0, 0, 6691, 70125, 0, 126223, 0, 0, 0, 43858, 129914, 0, 12992, 65407, 0, + 0, 3919, 0, 0, 0, 0, 0, 0, 12235, 110748, 0, 0, 64091, 68739, 64080, 0, + 64090, 0, 0, 0, 0, 0, 8454, 0, 0, 983858, 0, 0, 0, 4780, 0, 0, 92764, + 64621, 6732, 0, 0, 0, 0, 121363, 0, 0, 120817, 6976, 0, 119005, 0, 93809, + 0, 93808, 0, 12526, 120399, 2315, 0, 1938, 0, 0, 0, 0, 0, 0, 0, 120358, + 93794, 0, 0, 0, 93810, 0, 2291, 0, 0, 0, 0, 129429, 0, 10799, 0, 0, + 66372, 0, 4193, 0, 0, 983057, 7998, 0, 0, 0, 0, 2316, 0, 0, 0, 0, 125241, + 0, 0, 74140, 0, 0, 0, 0, 3762, 93813, 120672, 93820, 0, 0, 0, 70098, + 3780, 12808, 8163, 983154, 0, 0, 3906, 12349, 0, 8326, 0, 65498, 3763, 0, + 5618, 0, 3779, 0, 43613, 0, 128007, 0, 0, 0, 0, 280, 0, 126252, 983448, + 13072, 1894, 0, 0, 65478, 43310, 7231, 0, 11773, 0, 0, 0, 101517, 0, 0, + 7559, 11652, 10009, 110765, 110766, 110763, 110764, 4470, 110762, 0, 0, + 983441, 0, 5249, 0, 0, 8756, 0, 0, 41694, 120585, 92349, 0, 0, 0, 69685, + 983768, 983445, 113794, 0, 6808, 41319, 13125, 66332, 127977, 0, 2290, 0, + 983413, 0, 0, 3943, 0, 41205, 0, 0, 0, 0, 5352, 0, 0, 41207, 0, 7384, + 69647, 41204, 0, 41209, 69637, 0, 43607, 0, 0, 5420, 0, 10134, 0, 0, + 4018, 7150, 0, 0, 0, 0, 0, 129606, 2561, 0, 0, 7148, 12076, 0, 0, 129201, + 0, 6276, 1706, 0, 0, 7146, 0, 128277, 41819, 74991, 0, 10847, 41822, + 72248, 860, 0, 0, 0, 69641, 10753, 41820, 126118, 0, 71898, 0, 92617, + 128567, 0, 0, 43016, 0, 0, 92225, 0, 0, 0, 0, 4022, 0, 0, 110807, 0, + 41691, 0, 75060, 0, 0, 65292, 0, 110812, 0, 3911, 110811, 110808, 110809, + 0, 125191, 7000, 3904, 118997, 72261, 0, 0, 0, 13123, 10846, 0, 0, 0, 0, + 0, 74082, 0, 0, 0, 0, 3777, 128329, 0, 9636, 71726, 0, 0, 9367, 593, 0, + 3999, 0, 41713, 0, 0, 67677, 0, 0, 0, 9763, 120280, 120283, 12347, 124, + 12981, 41127, 92527, 0, 0, 0, 0, 0, 43987, 0, 0, 1769, 41715, 2463, 2151, + 0, 0, 71222, 1538, 93044, 0, 0, 0, 7795, 120300, 0, 92493, 10955, 0, 0, + 0, 78208, 9498, 78207, 127033, 78210, 120288, 3939, 120290, 120285, 8943, + 120287, 120286, 120297, 4491, 120299, 42602, 120293, 120292, 120295, + 120294, 0, 0, 0, 0, 0, 0, 1511, 9324, 0, 0, 0, 0, 0, 64536, 0, 0, 0, + 124935, 6822, 12862, 0, 0, 42143, 41828, 0, 917629, 70864, 118879, 0, 0, + 0, 41826, 128413, 0, 0, 13279, 7917, 0, 0, 0, 0, 0, 0, 92332, 0, 0, + 43515, 0, 0, 0, 4013, 0, 0, 0, 72224, 125266, 0, 68243, 2432, 0, 0, 0, 0, + 0, 69952, 0, 0, 0, 10949, 0, 0, 0, 0, 0, 0, 0, 128574, 43233, 0, 42517, + 0, 0, 0, 0, 0, 64468, 119359, 6474, 119358, 43497, 12656, 128122, 119353, + 0, 1665, 0, 0, 0, 119351, 0, 0, 5256, 0, 0, 0, 2859, 0, 0, 0, 0, 0, 0, + 128220, 0, 770, 0, 811, 0, 0, 917551, 42244, 64427, 0, 72222, 0, 3895, 0, + 74341, 12087, 0, 42859, 10193, 3116, 7747, 0, 0, 43496, 0, 0, 0, 0, + 41877, 0, 65382, 64614, 0, 64296, 0, 6345, 0, 2663, 0, 121234, 0, 0, + 10150, 0, 64308, 1522, 597, 0, 0, 41201, 64731, 0, 0, 41198, 0, 71483, + 3092, 0, 0, 4783, 71448, 0, 0, 0, 10812, 0, 0, 0, 3078, 0, 0, 0, 0, 0, + 71703, 394, 3088, 0, 0, 0, 3991, 0, 129072, 0, 424, 67652, 74927, 0, 0, + 0, 0, 0, 0, 42231, 2209, 128215, 72983, 0, 41840, 129136, 5344, 1298, 0, + 13155, 0, 128973, 41838, 0, 8488, 1003, 41837, 0, 0, 0, 48, 0, 0, 8493, + 0, 0, 0, 65487, 0, 8465, 10332, 13172, 0, 0, 10449, 126989, 127014, + 69606, 69447, 3984, 129159, 0, 0, 0, 0, 0, 0, 0, 0, 64758, 0, 100947, 0, + 0, 9096, 0, 0, 9172, 128545, 0, 0, 5955, 67666, 0, 0, 0, 0, 0, 74426, + 3926, 71734, 0, 8798, 100946, 92165, 0, 0, 120696, 0, 0, 0, 118805, + 10353, 10417, 0, 0, 0, 128629, 4019, 0, 0, 0, 8219, 68402, 0, 0, 121301, + 128218, 0, 0, 0, 0, 0, 0, 0, 110625, 42474, 10642, 3909, 9950, 0, 128139, + 69619, 68678, 92917, 0, 1049, 43517, 65707, 11943, 41806, 0, 68635, 3921, + 0, 11775, 121352, 69820, 1038, 42303, 9823, 0, 2145, 4008, 68624, 0, + 121025, 0, 0, 5153, 41805, 0, 0, 763, 9211, 0, 0, 0, 0, 0, 127142, 0, 0, + 65179, 0, 8621, 0, 118878, 0, 0, 0, 0, 182, 0, 0, 0, 0, 72978, 9058, + 8489, 0, 71188, 5969, 65909, 10848, 4570, 0, 128614, 4255, 0, 0, 41189, + 4003, 69785, 68109, 13293, 41192, 0, 0, 42251, 0, 0, 126085, 11287, 6128, + 121315, 11034, 0, 68207, 0, 65506, 42382, 0, 0, 66872, 9932, 43516, 0, + 125098, 0, 41814, 0, 71234, 0, 12117, 127040, 127041, 10540, 127043, + 9063, 78000, 0, 0, 0, 12897, 0, 0, 0, 6065, 0, 0, 0, 8692, 41186, 41816, + 0, 41818, 41187, 0, 42196, 0, 110690, 110691, 126115, 0, 0, 125235, 4710, + 0, 5956, 7621, 110641, 92624, 4705, 716, 74918, 110693, 4704, 0, 0, + 127112, 161, 0, 0, 0, 4706, 0, 0, 0, 4709, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1700, 119223, 0, 0, 128119, 4004, 0, 73071, 69383, 69914, 8506, 128237, + 0, 126996, 2538, 937, 0, 4734, 0, 0, 0, 0, 0, 4729, 0, 0, 0, 4728, 0, 72809, 120644, 0, 8109, 43105, 11249, 4730, 447, 0, 1513, 4733, 0, 0, 0, 0, 0, 0, 0, 8565, 2469, 0, 6690, 0, 0, 43439, 78218, 43103, 78217, 2674, 0, 11922, 0, 0, 3510, 0, 129368, 0, 5605, 42095, 126572, 0, 9098, 120512, @@ -27963,7 +28829,7 @@ static const unsigned int code_hash[] = { 93799, 10618, 2584, 93793, 0, 0, 9998, 0, 0, 0, 66350, 0, 0, 0, 121374, 8279, 128169, 0, 4975, 70075, 0, 0, 1631, 0, 0, 0, 6290, 128994, 66386, 0, 64645, 0, 0, 0, 0, 0, 9242, 93807, 93802, 93801, 983264, 93803, 3122, - 93804, 7793, 0, 0, 0, 0, 12604, 93808, 6615, 67650, 0, 3986, 44025, 0, + 93804, 7793, 0, 0, 0, 0, 12604, 92885, 6615, 67650, 0, 3986, 44025, 0, 8912, 0, 7409, 0, 0, 0, 0, 0, 0, 8540, 11498, 0, 0, 0, 0, 0, 13060, 120682, 0, 0, 0, 0, 0, 121345, 0, 0, 7020, 120353, 3765, 92881, 0, 1606, 120348, 120351, 3093, 110593, 0, 0, 0, 0, 0, 0, 92892, 120337, 69402, @@ -27975,145 +28841,147 @@ static const unsigned int code_hash[] = { 0, 0, 0, 0, 0, 10381, 70839, 0, 0, 0, 0, 125121, 70837, 125070, 129431, 983372, 983360, 0, 983359, 0, 120063, 0, 0, 0, 75048, 0, 74900, 0, 0, 120978, 12161, 983351, 0, 10339, 0, 0, 0, 0, 0, 0, 0, 43032, 125010, 0, - 983380, 12671, 11384, 0, 0, 120901, 64797, 0, 5820, 0, 0, 0, 0, 0, + 983378, 12671, 11384, 0, 0, 120901, 64797, 0, 5820, 0, 0, 0, 0, 0, 120650, 42137, 9893, 8851, 12664, 0, 0, 13192, 0, 41799, 65530, 0, 0, - 43039, 3114, 0, 0, 0, 0, 0, 926, 0, 0, 0, 0, 0, 0, 0, 43037, 41798, 0, 0, - 123214, 41801, 0, 0, 0, 4200, 12699, 8331, 70118, 3091, 92980, 66298, - 70293, 8360, 0, 78044, 0, 4229, 64543, 126227, 65563, 0, 129310, 2861, - 43793, 10095, 121428, 9195, 121381, 121132, 0, 129578, 0, 0, 43041, 0, - 43794, 0, 83167, 0, 43797, 8209, 0, 129132, 12973, 0, 0, 0, 0, 0, 121235, - 5760, 0, 743, 0, 0, 0, 0, 0, 0, 83170, 128589, 129537, 0, 119063, 0, 0, - 0, 19919, 0, 64532, 0, 43710, 0, 0, 9483, 71115, 0, 43697, 0, 0, 83211, - 0, 0, 0, 7247, 0, 0, 0, 0, 0, 113674, 0, 7471, 120823, 128743, 12682, 0, - 0, 65679, 983143, 0, 0, 83201, 1099, 74241, 0, 10501, 0, 0, 113743, 0, - 64743, 128476, 67663, 0, 0, 92219, 0, 83197, 64897, 9973, 1818, 0, 0, - 8272, 127812, 0, 4218, 3087, 0, 127234, 0, 0, 65181, 9954, 10465, 0, 0, - 0, 9106, 0, 67406, 0, 0, 0, 0, 43038, 0, 0, 265, 0, 0, 0, 0, 0, 0, 69405, - 0, 59, 0, 0, 0, 0, 126239, 41810, 0, 126492, 0, 41809, 41888, 0, 41795, - 0, 42213, 0, 0, 43033, 511, 129413, 0, 13127, 0, 0, 0, 0, 111107, 0, - 4467, 41812, 41215, 0, 41211, 917783, 4453, 983409, 0, 983174, 0, 983407, - 41213, 118812, 0, 0, 0, 0, 41841, 6617, 0, 0, 92995, 462, 0, 10493, 0, - 55248, 0, 0, 74471, 6644, 0, 0, 0, 983383, 100484, 9581, 67104, 3098, 0, - 0, 983410, 125250, 0, 120621, 0, 0, 0, 129584, 101011, 0, 118789, 74473, - 3755, 64661, 7748, 7235, 3966, 0, 0, 127510, 0, 0, 0, 5726, 66456, 42175, - 100486, 0, 42212, 92681, 121443, 2851, 43017, 0, 121056, 4373, 0, 0, - 9587, 0, 6671, 128840, 3100, 0, 0, 0, 0, 0, 917789, 73836, 8190, 12083, - 917791, 0, 6689, 64629, 0, 0, 0, 4419, 917787, 101017, 0, 69851, 0, 0, - 8891, 3080, 0, 2347, 0, 0, 8990, 0, 121201, 0, 92528, 249, 0, 0, 69424, - 0, 0, 0, 55253, 0, 0, 11173, 995, 0, 121047, 119861, 0, 73708, 0, 0, - 19945, 0, 558, 983394, 12273, 0, 983862, 0, 69912, 120861, 129492, 67274, - 94178, 0, 68019, 43030, 3129, 0, 2102, 0, 0, 121450, 0, 7725, 0, 11120, - 0, 126111, 69246, 0, 0, 0, 41894, 0, 41898, 0, 41893, 74921, 128678, - 3540, 11848, 0, 73005, 120848, 0, 0, 126113, 73959, 0, 0, 0, 120858, 0, - 0, 9699, 128656, 41896, 0, 83196, 69230, 74951, 0, 72736, 0, 0, 3095, - 983670, 11946, 983866, 0, 0, 0, 0, 0, 113677, 3672, 119864, 0, 0, 0, - 128539, 8890, 93826, 0, 128182, 0, 0, 0, 126568, 0, 0, 983617, 9516, - 983436, 0, 0, 42220, 0, 4450, 0, 11547, 43417, 128542, 356, 0, 0, 0, 0, - 64901, 0, 0, 0, 0, 0, 0, 111302, 65940, 2541, 71231, 0, 123215, 126470, - 3549, 0, 0, 0, 2743, 0, 0, 0, 9097, 128896, 43015, 0, 0, 776, 2524, 0, - 8573, 100665, 126494, 0, 0, 42694, 71122, 8952, 10814, 118818, 0, 43646, - 128598, 0, 0, 0, 128380, 100663, 0, 65853, 42707, 1897, 93071, 0, 0, - 71907, 69410, 0, 125106, 0, 0, 0, 68473, 66778, 43573, 92638, 0, 0, 0, - 120955, 73986, 0, 0, 43022, 0, 74841, 0, 67714, 0, 0, 0, 0, 0, 4553, 0, - 0, 0, 0, 0, 19921, 0, 0, 983668, 4567, 41891, 0, 983800, 55249, 194663, - 0, 194662, 0, 194665, 43042, 121291, 1377, 12869, 0, 0, 9250, 0, 0, 0, 0, - 125039, 194642, 0, 74995, 0, 194644, 0, 0, 0, 194668, 121166, 0, 70275, - 1898, 0, 0, 0, 802, 0, 0, 0, 6648, 0, 2528, 0, 0, 194646, 194625, 194645, - 68804, 844, 0, 68824, 0, 68818, 194650, 0, 0, 0, 983724, 65464, 0, 0, 0, - 0, 83221, 0, 0, 100680, 0, 0, 64371, 70665, 0, 194654, 0, 0, 0, 0, 0, - 6196, 6945, 0, 0, 0, 120491, 0, 68846, 6210, 0, 70274, 0, 0, 0, 68067, - 68834, 194715, 588, 9760, 129112, 0, 983704, 128798, 0, 127992, 0, 0, - 118905, 0, 0, 92485, 110839, 69396, 0, 3394, 70734, 194639, 0, 0, 0, 0, - 0, 0, 194656, 7817, 1841, 11055, 0, 194979, 194983, 127011, 119074, - 194987, 7701, 194998, 0, 0, 1946, 121404, 0, 0, 0, 0, 0, 10934, 0, 70376, - 0, 0, 8071, 3538, 0, 2287, 65328, 0, 0, 7614, 0, 0, 0, 12009, 43968, 0, - 67852, 0, 0, 10841, 123640, 0, 0, 0, 0, 8960, 0, 0, 65317, 0, 0, 0, - 70374, 0, 0, 0, 65315, 0, 0, 0, 0, 0, 119621, 0, 11849, 12447, 0, 0, - 110741, 0, 0, 0, 0, 42767, 0, 0, 0, 43695, 120520, 11975, 194941, 983443, - 0, 2555, 0, 128640, 70070, 42936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66714, - 0, 0, 70076, 65596, 121034, 66710, 67658, 0, 126994, 65338, 7792, 0, 0, - 67871, 119027, 0, 8233, 43572, 0, 0, 0, 3442, 0, 2841, 12543, 0, 1473, - 42820, 64329, 127832, 917772, 126126, 7937, 0, 1048, 0, 0, 983924, 0, - 3406, 1054, 100701, 1040, 65450, 0, 92329, 1069, 917763, 128367, 128940, - 0, 917765, 0, 983705, 9693, 110873, 0, 0, 0, 983929, 4353, 0, 1059, - 127530, 0, 0, 0, 127093, 118862, 120500, 10646, 0, 100710, 917762, 70424, - 74830, 0, 0, 983701, 10221, 100706, 68255, 0, 0, 74346, 119619, 100707, - 64945, 12921, 0, 0, 0, 0, 0, 983776, 43020, 0, 0, 74254, 0, 983766, 0, 0, - 983773, 0, 0, 0, 0, 0, 0, 0, 0, 120503, 70663, 0, 2755, 0, 0, 0, 4857, 0, - 4428, 0, 0, 983772, 0, 0, 0, 43842, 0, 122899, 0, 7978, 0, 70392, 127080, - 11924, 43812, 0, 65015, 0, 563, 68340, 0, 12798, 0, 100727, 0, 0, 0, - 74110, 0, 94051, 0, 694, 0, 9876, 0, 119168, 0, 0, 0, 92361, 0, 0, 7229, - 0, 0, 0, 0, 64811, 0, 119087, 126478, 0, 7381, 0, 2525, 4852, 11586, - 68465, 41605, 126089, 0, 11582, 7151, 10155, 92578, 188, 0, 11592, 0, - 74015, 0, 0, 4858, 0, 0, 0, 4861, 0, 2786, 121431, 4856, 8051, 0, 119609, - 0, 113797, 71133, 0, 78448, 0, 0, 67842, 68084, 0, 0, 0, 0, 0, 10234, - 5843, 0, 71865, 66728, 0, 3157, 0, 0, 75035, 72788, 983731, 0, 10822, - 5149, 129517, 0, 65142, 129454, 4565, 0, 0, 0, 12657, 0, 0, 386, 0, 8834, - 120974, 0, 43574, 0, 0, 0, 70113, 7220, 11839, 124984, 74883, 194752, 0, - 65241, 74503, 8160, 0, 194753, 0, 0, 0, 0, 0, 121265, 0, 13303, 0, 0, - 194755, 0, 118865, 0, 194761, 0, 0, 74505, 0, 0, 0, 100518, 0, 8780, - 100512, 0, 68745, 110626, 66697, 0, 2672, 3735, 983641, 0, 68752, 11205, - 10724, 41202, 0, 100714, 0, 0, 0, 0, 194765, 3842, 0, 78183, 12442, - 78182, 9791, 78181, 0, 42516, 67730, 64821, 195061, 78463, 0, 78464, - 119219, 78465, 127466, 194690, 195063, 0, 0, 0, 0, 78540, 78541, 78538, - 1962, 78490, 78476, 65930, 11660, 0, 2072, 0, 0, 78544, 194704, 78542, - 10669, 110859, 110860, 110857, 110858, 0, 110856, 4105, 0, 194699, 0, 0, - 0, 13148, 195068, 78479, 9226, 0, 0, 10765, 127486, 71919, 121218, - 195050, 0, 195041, 0, 0, 0, 0, 0, 0, 92312, 7886, 0, 6682, 0, 6680, - 195042, 126473, 195052, 6679, 74412, 0, 72206, 74421, 66281, 0, 0, - 127478, 0, 0, 0, 6681, 0, 12693, 0, 0, 0, 0, 0, 65442, 129055, 0, 9989, - 74415, 194673, 0, 0, 983769, 0, 0, 0, 0, 7042, 127240, 119026, 7968, 0, - 983749, 194741, 194736, 983774, 0, 69889, 74389, 128696, 0, 0, 128979, - 5781, 0, 78199, 0, 0, 11091, 0, 2719, 0, 0, 0, 64495, 0, 0, 0, 65169, - 42845, 0, 128551, 983747, 7505, 72435, 0, 0, 0, 917855, 66670, 0, 983690, - 0, 0, 0, 7902, 0, 65265, 0, 0, 0, 0, 0, 0, 0, 12994, 0, 10828, 983955, 0, - 4307, 3482, 0, 0, 72389, 0, 64299, 74573, 41194, 7343, 0, 0, 41195, 0, - 8169, 0, 8841, 66770, 516, 72981, 41197, 119051, 34, 128850, 120186, - 11504, 1612, 120187, 120182, 120181, 120184, 12001, 120178, 120177, - 120180, 120179, 120174, 120173, 7749, 120175, 0, 1758, 0, 10667, 0, - 120197, 0, 1935, 11517, 120193, 120196, 120195, 120190, 120189, 120192, - 120191, 1217, 64702, 128075, 825, 0, 0, 0, 0, 66748, 0, 11050, 0, 123187, - 0, 0, 74554, 0, 0, 8677, 123188, 11313, 123185, 3403, 0, 123186, 64364, - 92683, 0, 0, 0, 0, 123189, 0, 0, 983861, 0, 69408, 41850, 0, 3433, - 127965, 0, 1594, 65607, 0, 66392, 0, 129291, 74565, 41353, 125119, 0, 0, - 0, 0, 918, 127280, 41351, 0, 0, 12140, 0, 12668, 72395, 0, 128753, 0, - 127302, 0, 127288, 129497, 127235, 573, 0, 0, 11417, 0, 127283, 0, 0, 0, - 72410, 0, 11482, 0, 3981, 74345, 0, 0, 0, 0, 0, 0, 125238, 0, 0, 42195, - 0, 123190, 0, 64602, 0, 0, 121366, 0, 121061, 128690, 0, 8423, 0, 448, - 66907, 9717, 0, 0, 0, 0, 0, 0, 0, 71910, 0, 0, 0, 120679, 65013, 78169, - 0, 72390, 0, 0, 127917, 0, 74892, 0, 0, 127798, 0, 0, 71252, 0, 0, 0, - 12197, 125074, 0, 121447, 0, 0, 0, 0, 0, 0, 0, 74563, 64828, 11419, 0, - 8592, 0, 0, 0, 11381, 0, 0, 74529, 0, 0, 0, 0, 72796, 0, 83257, 0, 0, 0, - 129437, 65672, 0, 0, 0, 0, 0, 0, 0, 0, 9505, 0, 0, 756, 0, 125243, - 100358, 110852, 7261, 0, 0, 0, 0, 0, 64401, 65830, 41365, 0, 0, 0, - 127834, 0, 0, 0, 0, 0, 74626, 123155, 11578, 0, 0, 0, 0, 0, 0, 74568, 0, - 113684, 1794, 68310, 120218, 120219, 120220, 120221, 120222, 120223, - 3617, 120209, 64886, 94061, 78202, 120213, 120214, 10225, 983060, 0, - 65223, 983058, 0, 0, 4452, 127779, 0, 0, 0, 0, 0, 0, 11425, 0, 0, 1231, - 0, 0, 0, 0, 8192, 0, 0, 0, 10616, 8694, 0, 68867, 128332, 123595, 120200, - 120201, 120202, 120203, 9878, 120205, 119626, 120207, 0, 8799, 42131, 0, - 127163, 0, 120198, 120199, 837, 120015, 72384, 0, 983817, 0, 11427, 0, - 78154, 0, 70171, 0, 78150, 42606, 0, 119615, 78147, 64637, 78146, 43060, - 78145, 125009, 3392, 0, 194783, 119067, 119650, 65468, 43498, 126083, 0, - 0, 0, 194928, 194937, 194938, 64681, 194930, 83264, 92451, 0, 194955, - 83262, 983732, 8973, 0, 194967, 70177, 194968, 0, 4800, 195018, 0, 0, - 11820, 70151, 0, 0, 4802, 4111, 111268, 0, 4805, 127308, 68193, 7885, - 121220, 0, 0, 0, 4767, 0, 0, 0, 0, 0, 125234, 100366, 43453, 0, 41340, 0, - 0, 10005, 65856, 41333, 0, 9518, 0, 0, 0, 42520, 0, 0, 0, 917562, 100506, - 0, 0, 0, 0, 0, 0, 9167, 42151, 124958, 0, 2026, 100848, 0, 0, 100534, - 12768, 0, 7582, 0, 0, 0, 0, 129557, 0, 120539, 68879, 0, 43547, 0, 8546, - 126071, 78520, 7604, 78518, 78519, 78514, 78517, 78511, 78512, 73802, - 128140, 0, 6708, 10535, 0, 68218, 55274, 68221, 92296, 0, 0, 0, 0, 0, - 72385, 0, 0, 0, 73727, 0, 120706, 74442, 0, 0, 0, 4351, 0, 119887, - 119888, 0, 119886, 119891, 68866, 119889, 11433, 119895, 119896, 0, - 119894, 65578, 0, 0, 0, 983070, 10681, 0, 0, 0, 0, 983110, 0, 6722, - 129364, 0, 119997, 41546, 64860, 68394, 0, 41549, 0, 72386, 0, 0, 0, 0, - 64710, 41547, 0, 0, 0, 78530, 78532, 78528, 78529, 71343, 78527, 78523, - 78525, 3537, 119908, 119905, 7155, 2264, 0, 78533, 67755, 0, 0, 0, 0, 0, - 0, 0, 64715, 0, 0, 537, 0, 4179, 0, 0, 0, 0, 0, 0, 0, 0, 12081, 0, 0, - 4048, 7053, 0, 0, 70459, 0, 124975, 0, 3059, 0, 0, 43491, 983814, 0, 0, - 127993, 4100, 920, 1811, 1355, 0, 0, 64383, 10078, 69398, 0, 0, 0, 65870, - 0, 129565, 0, 72400, 42918, 0, 66789, 0, 12865, 0, 73938, + 43039, 3114, 0, 0, 0, 0, 0, 926, 0, 72004, 0, 0, 0, 0, 0, 43037, 41798, + 0, 0, 123214, 41801, 0, 0, 0, 4200, 12699, 8331, 70118, 3091, 92980, + 66298, 70293, 8360, 0, 78044, 0, 4229, 64543, 126227, 65563, 0, 129310, + 2861, 43793, 10095, 121428, 9195, 121381, 121132, 0, 129578, 0, 0, 43041, + 0, 43794, 0, 83167, 0, 43797, 8209, 0, 129132, 12973, 0, 0, 0, 0, 0, + 121235, 5760, 0, 743, 0, 0, 0, 0, 0, 0, 83170, 128589, 129537, 0, 119063, + 0, 0, 0, 19919, 0, 64532, 0, 43710, 0, 0, 9483, 71115, 0, 43697, 0, 0, + 83211, 0, 0, 0, 7247, 0, 0, 0, 0, 0, 113674, 0, 7471, 120823, 128743, + 12682, 0, 0, 65679, 983143, 0, 0, 83201, 1099, 74241, 0, 10501, 0, 0, + 113743, 0, 64743, 128476, 67663, 0, 0, 92219, 0, 83197, 64897, 9973, + 1818, 0, 0, 8272, 127812, 0, 4218, 3087, 0, 127234, 0, 101300, 65181, + 9954, 10465, 0, 0, 0, 9106, 0, 67406, 0, 0, 0, 0, 43038, 0, 0, 265, 0, 0, + 0, 0, 0, 0, 69405, 0, 59, 0, 0, 0, 0, 126239, 41810, 0, 126492, 0, 41809, + 41888, 0, 41795, 0, 42213, 0, 0, 43033, 511, 129413, 0, 13127, 0, 0, 0, + 0, 111107, 0, 4467, 41812, 41215, 0, 41211, 917783, 4453, 69575, 0, + 129883, 0, 983407, 41213, 118812, 0, 0, 0, 129730, 41841, 6617, 130041, + 0, 92995, 462, 0, 10493, 0, 55248, 0, 0, 74471, 6644, 0, 0, 0, 983383, + 100484, 9581, 67104, 3098, 0, 0, 983410, 125250, 0, 120621, 0, 0, 0, + 129584, 101011, 0, 118789, 74473, 3755, 64661, 7748, 7235, 3966, 0, 0, + 127510, 0, 0, 0, 5726, 66456, 42175, 100486, 0, 42212, 92681, 121443, + 2851, 43017, 0, 121056, 4373, 0, 0, 9587, 0, 6671, 128840, 3100, 0, + 917790, 0, 0, 0, 917789, 73836, 8190, 12083, 917791, 0, 6689, 64629, 0, + 0, 0, 4419, 917787, 101017, 0, 69851, 0, 0, 8891, 3080, 0, 2347, 0, 0, + 8990, 0, 121201, 0, 92528, 249, 0, 0, 69424, 0, 0, 0, 55253, 0, 0, 11173, + 995, 0, 121047, 119861, 0, 73708, 0, 0, 19945, 0, 558, 983394, 12273, 0, + 983862, 0, 69912, 120861, 129492, 67274, 94178, 0, 68019, 43030, 3129, 0, + 2102, 0, 0, 121450, 0, 7725, 0, 11120, 0, 126111, 69246, 0, 0, 0, 41894, + 0, 41898, 0, 41893, 74921, 128678, 3540, 11848, 0, 73005, 120848, 0, 0, + 126113, 73959, 0, 0, 0, 120858, 0, 0, 9699, 128656, 41896, 0, 83196, + 69230, 74951, 0, 72736, 0, 0, 3095, 983670, 11946, 983866, 0, 0, 0, 0, 0, + 113677, 3672, 119864, 0, 0, 0, 128539, 8890, 93826, 0, 128182, 0, 0, 0, + 126568, 0, 0, 983617, 9516, 983436, 0, 0, 42220, 0, 4450, 0, 11547, + 43417, 128542, 356, 0, 0, 0, 0, 64901, 0, 0, 0, 0, 0, 0, 111302, 65940, + 2541, 71231, 0, 123215, 126470, 3549, 0, 0, 0, 2743, 0, 0, 0, 9097, + 128896, 43015, 0, 0, 776, 2524, 0, 8573, 100665, 126494, 0, 0, 42694, + 71122, 8952, 10814, 118818, 0, 43646, 128598, 0, 0, 0, 128380, 100663, 0, + 65853, 42707, 1897, 93071, 0, 0, 71907, 69410, 0, 125106, 0, 0, 0, 68473, + 66778, 43573, 92638, 0, 0, 0, 120955, 73986, 0, 0, 43022, 0, 74841, 0, + 67714, 0, 0, 0, 0, 0, 4553, 0, 0, 0, 0, 0, 19921, 0, 0, 983668, 4567, + 41891, 0, 983800, 55249, 194663, 0, 194662, 0, 194665, 43042, 121291, + 1377, 12869, 0, 0, 9250, 0, 0, 0, 0, 125039, 194642, 0, 74995, 0, 194644, + 0, 0, 101328, 194668, 121166, 0, 70275, 1898, 69556, 0, 0, 802, 0, 0, 0, + 6648, 0, 2528, 0, 0, 194646, 194625, 101330, 68804, 844, 0, 68824, 0, + 68818, 194650, 0, 0, 0, 983724, 65464, 0, 0, 0, 0, 83221, 0, 0, 100680, + 42954, 0, 64371, 70665, 0, 194654, 0, 0, 0, 0, 0, 6196, 6945, 0, 0, 0, + 120491, 0, 68846, 6210, 0, 70274, 0, 0, 0, 68067, 68834, 194715, 588, + 9760, 129112, 0, 983704, 128798, 0, 127992, 0, 0, 118905, 0, 0, 92485, + 110839, 69396, 0, 3394, 70734, 194639, 0, 0, 0, 0, 0, 0, 194656, 7817, + 1841, 11055, 0, 194979, 194983, 127011, 67403, 194987, 7701, 194998, 0, + 194995, 1946, 121404, 0, 0, 917631, 0, 0, 10934, 0, 70376, 0, 0, 8071, + 3538, 0, 2287, 65328, 0, 0, 7614, 0, 0, 0, 12009, 43968, 0, 67852, 0, 0, + 10841, 123640, 0, 0, 0, 0, 8960, 0, 0, 65317, 128829, 0, 0, 70374, 0, 0, + 0, 65315, 0, 0, 0, 0, 0, 119621, 0, 11849, 12447, 0, 0, 110741, 0, 0, 0, + 129976, 42767, 0, 0, 0, 43695, 120520, 11975, 194941, 983443, 0, 2555, 0, + 128640, 70070, 42936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66714, 0, 0, + 70076, 65596, 121034, 66710, 67658, 0, 126994, 65338, 7792, 0, 0, 67871, + 119027, 0, 8233, 43572, 0, 0, 0, 3442, 0, 2841, 12543, 0, 1473, 42820, + 64329, 127832, 917772, 126126, 7937, 0, 1048, 0, 0, 983924, 0, 3406, + 1054, 100701, 1040, 65450, 0, 92329, 1069, 917763, 128367, 128940, 0, + 917765, 0, 983705, 9693, 110873, 0, 0, 0, 983929, 4353, 0, 1059, 127530, + 0, 0, 0, 127093, 118862, 120500, 10646, 0, 100710, 917762, 70424, 74830, + 0, 0, 983701, 10221, 100706, 68255, 0, 0, 74346, 119619, 100707, 64945, + 12921, 0, 0, 0, 0, 0, 983776, 43020, 0, 0, 74254, 0, 983766, 0, 0, + 983773, 0, 71954, 0, 0, 0, 0, 0, 0, 120503, 70663, 0, 2755, 0, 0, 0, + 4857, 0, 4428, 0, 0, 983772, 0, 0, 0, 43842, 0, 122899, 0, 7978, 0, + 70392, 127080, 11924, 43812, 0, 65015, 0, 563, 68340, 0, 12798, 0, + 100727, 0, 0, 0, 74110, 0, 94051, 0, 694, 0, 9876, 0, 119168, 0, 0, 0, + 92361, 0, 0, 7229, 0, 0, 0, 0, 64811, 0, 119087, 126478, 0, 7381, 0, + 2525, 4852, 11586, 68465, 41605, 126089, 0, 11582, 7151, 10155, 92578, + 188, 0, 11592, 0, 74015, 0, 0, 4858, 0, 0, 0, 4861, 0, 2786, 121431, + 4856, 8051, 0, 119609, 0, 113797, 71133, 0, 78448, 0, 0, 67842, 68084, 0, + 0, 0, 0, 0, 10234, 5843, 0, 71865, 66728, 0, 3157, 0, 0, 75035, 72788, + 983731, 0, 10822, 5149, 129517, 0, 65142, 129454, 4565, 0, 0, 0, 12657, + 0, 0, 386, 0, 8834, 120974, 0, 43574, 0, 0, 0, 70113, 7220, 11839, + 124984, 74883, 194752, 0, 65241, 74503, 8160, 0, 194753, 0, 0, 0, 0, 0, + 121265, 6847, 13303, 0, 0, 194755, 0, 118865, 0, 194761, 0, 0, 74505, 0, + 0, 0, 100518, 194721, 8780, 100512, 0, 68745, 110626, 66697, 0, 2672, + 3735, 983641, 0, 68752, 11205, 10724, 41202, 0, 100714, 0, 0, 0, 0, + 194765, 3842, 0, 78183, 12442, 78182, 9791, 78181, 0, 42516, 67730, + 64821, 195061, 78178, 0, 78464, 119219, 78465, 127466, 194690, 195063, 0, + 0, 0, 0, 78540, 78541, 78538, 1962, 78490, 78476, 65930, 11660, 0, 2072, + 0, 0, 78544, 194704, 78542, 10669, 110859, 110860, 110857, 110858, + 129749, 110856, 4105, 0, 194699, 0, 0, 0, 13148, 195068, 78479, 9226, 0, + 0, 10765, 127486, 71919, 121218, 195050, 0, 195041, 0, 0, 0, 0, 0, 0, + 92312, 7886, 0, 6682, 0, 6680, 195042, 126473, 195052, 6679, 74412, 0, + 72206, 74421, 66281, 0, 0, 127478, 0, 0, 0, 6681, 0, 12693, 0, 0, 0, 0, + 0, 65442, 129055, 0, 9989, 74415, 194673, 0, 0, 983769, 0, 0, 0, 0, 7042, + 127240, 119026, 7968, 0, 983749, 194741, 194736, 983774, 0, 69889, 74389, + 128696, 0, 0, 128979, 5781, 0, 78199, 0, 0, 11091, 0, 2719, 0, 0, 0, + 64495, 0, 0, 0, 65169, 42845, 0, 128551, 983747, 7505, 72435, 0, 0, 0, + 917855, 66670, 0, 983690, 0, 0, 0, 7902, 0, 65265, 0, 0, 0, 0, 0, 0, 0, + 12994, 0, 10828, 983955, 0, 4307, 3482, 0, 0, 72389, 0, 64299, 74573, + 41194, 7343, 0, 0, 41195, 0, 8169, 0, 8841, 66770, 516, 72981, 41197, + 119051, 34, 128850, 120186, 11504, 1612, 120187, 120182, 120181, 120184, + 12001, 120178, 120177, 120180, 120179, 71966, 120173, 7749, 120175, 0, + 1758, 0, 10667, 0, 120197, 0, 1935, 11517, 120193, 120196, 120195, + 120190, 120189, 120192, 120191, 1217, 64702, 128075, 825, 0, 0, 0, 0, + 66748, 0, 11050, 0, 123187, 0, 0, 74554, 0, 0, 8677, 123188, 11313, + 123185, 3403, 0, 123186, 64364, 92683, 0, 0, 0, 0, 123189, 0, 0, 983861, + 0, 69408, 41850, 0, 3433, 127965, 0, 1594, 65607, 0, 66392, 0, 129291, + 74565, 41353, 125119, 0, 0, 0, 0, 918, 127280, 41351, 0, 0, 12140, 0, + 12668, 72395, 0, 128753, 0, 127302, 0, 127288, 129497, 127235, 573, 0, 0, + 11417, 0, 127283, 0, 0, 0, 72410, 0, 11482, 0, 3981, 74345, 0, 0, 0, 0, + 0, 0, 125238, 0, 0, 42195, 0, 123190, 0, 64602, 0, 0, 121366, 0, 121061, + 128690, 0, 8423, 0, 448, 66907, 9717, 0, 0, 0, 0, 0, 0, 0, 71910, 129898, + 0, 0, 120679, 65013, 78169, 0, 72390, 0, 0, 127917, 0, 74892, 0, 0, + 127798, 0, 0, 71252, 0, 0, 0, 12197, 125074, 0, 121447, 0, 0, 0, 0, 0, 0, + 0, 74563, 64828, 11419, 0, 8592, 0, 0, 0, 11381, 0, 0, 74529, 0, 0, + 83254, 0, 72796, 0, 83257, 0, 0, 0, 129437, 65672, 0, 0, 0, 0, 0, 0, 0, + 0, 9505, 0, 0, 756, 0, 125243, 100358, 110852, 7261, 0, 0, 0, 0, 0, + 64401, 65830, 41365, 0, 0, 0, 127834, 0, 0, 0, 0, 0, 74626, 123155, + 11578, 0, 0, 0, 0, 0, 0, 74568, 0, 113684, 1794, 68310, 120218, 120219, + 120220, 120221, 120222, 120223, 3617, 120011, 64886, 94061, 78202, + 120213, 120214, 10225, 983060, 0, 65223, 983058, 0, 0, 4452, 127779, 0, + 0, 0, 0, 0, 0, 11425, 0, 0, 1231, 0, 0, 0, 0, 8192, 0, 0, 0, 10616, 8694, + 0, 68867, 128332, 123595, 120200, 120201, 120202, 120203, 9878, 120205, + 119626, 120207, 0, 8799, 42131, 0, 127163, 0, 120198, 120199, 837, + 120015, 72384, 0, 983817, 0, 11427, 0, 78154, 0, 70171, 0, 78150, 42606, + 0, 119615, 78147, 64637, 78146, 43060, 78145, 125009, 3392, 0, 194783, + 119067, 119650, 65468, 43498, 126083, 0, 0, 0, 194928, 194937, 194938, + 64681, 194930, 83264, 92451, 0, 194955, 83262, 983732, 8973, 0, 194967, + 70177, 194968, 0, 4800, 195018, 0, 0, 11820, 70151, 0, 0, 4802, 4111, + 111268, 0, 4805, 127308, 68193, 7885, 121220, 0, 0, 0, 4767, 0, 0, 0, 0, + 0, 125234, 100366, 43453, 0, 41340, 0, 0, 10005, 65856, 41333, 0, 9518, + 0, 0, 0, 42520, 100850, 0, 0, 917562, 100506, 0, 0, 0, 0, 0, 0, 9167, + 42151, 124958, 0, 2026, 100848, 0, 0, 100534, 12768, 0, 7582, 0, 0, 0, 0, + 129557, 0, 120539, 68879, 0, 43547, 119992, 8546, 126071, 78520, 7604, + 78518, 78519, 78514, 78517, 78511, 78512, 73802, 128140, 0, 6708, 10535, + 0, 68218, 55274, 68221, 92296, 0, 0, 0, 0, 0, 72385, 0, 0, 0, 73727, 0, + 120706, 74442, 0, 0, 0, 4351, 0, 119887, 119888, 0, 119886, 119891, + 68866, 119889, 11433, 119895, 119896, 0, 119894, 65578, 194693, 0, 0, + 983070, 10681, 0, 0, 0, 0, 983110, 0, 6722, 129364, 0, 119997, 41546, + 64860, 68394, 0, 41549, 0, 72386, 0, 0, 0, 0, 64710, 41547, 0, 0, 0, + 78530, 78532, 78528, 78529, 71343, 78527, 78523, 78525, 3537, 119908, + 119905, 7155, 2264, 0, 78533, 67755, 0, 0, 0, 0, 0, 0, 0, 64715, 0, 0, + 537, 0, 4179, 0, 0, 0, 0, 0, 0, 0, 0, 12081, 0, 0, 4048, 7053, 0, 0, + 70459, 0, 124975, 0, 3059, 0, 0, 43491, 983814, 0, 0, 127993, 4100, 920, + 1811, 1355, 0, 0, 64383, 10078, 69398, 0, 0, 0, 65870, 0, 129565, 0, + 72400, 42918, 0, 66789, 0, 12865, 0, 73938, }; #define code_magic 47 @@ -28615,20 +29483,16 @@ static const named_sequence named_sequences[] = { {3, {0x0039, 0xFE0F, 0x20E3}}, {2, {0x0100, 0x0300}}, {2, {0x0101, 0x0300}}, + {2, {0x012A, 0x0300}}, + {2, {0x012B, 0x0300}}, + {2, {0x016A, 0x0300}}, + {2, {0x016B, 0x0300}}, {2, {0x0045, 0x0329}}, {2, {0x0065, 0x0329}}, {2, {0x00C8, 0x0329}}, {2, {0x00E8, 0x0329}}, {2, {0x00C9, 0x0329}}, {2, {0x00E9, 0x0329}}, - {2, {0x00CA, 0x0304}}, - {2, {0x00EA, 0x0304}}, - {2, {0x00CA, 0x030C}}, - {2, {0x00EA, 0x030C}}, - {2, {0x012A, 0x0300}}, - {2, {0x012B, 0x0300}}, - {3, {0x0069, 0x0307, 0x0301}}, - {3, {0x006E, 0x0360, 0x0067}}, {2, {0x004F, 0x0329}}, {2, {0x006F, 0x0329}}, {2, {0x00D2, 0x0329}}, @@ -28637,8 +29501,12 @@ static const named_sequence named_sequences[] = { {2, {0x00F3, 0x0329}}, {2, {0x0053, 0x0329}}, {2, {0x0073, 0x0329}}, - {2, {0x016A, 0x0300}}, - {2, {0x016B, 0x0300}}, + {2, {0x00CA, 0x0304}}, + {2, {0x00EA, 0x0304}}, + {2, {0x00CA, 0x030C}}, + {2, {0x00EA, 0x030C}}, + {3, {0x0069, 0x0307, 0x0301}}, + {3, {0x006E, 0x0360, 0x0067}}, {2, {0x0104, 0x0301}}, {2, {0x0105, 0x0301}}, {2, {0x0104, 0x0303}}, diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c index ffc04e03..5b05a945 100644 --- a/Modules/xxlimited.c +++ b/Modules/xxlimited.c @@ -25,7 +25,7 @@ typedef struct { static PyObject *Xxo_Type; -#define XxoObject_Check(v) (Py_TYPE(v) == Xxo_Type) +#define XxoObject_Check(v) Py_IS_TYPE(v, Xxo_Type) static XxoObject * newXxoObject(PyObject *arg) @@ -43,6 +43,7 @@ newXxoObject(PyObject *arg) static int Xxo_traverse(XxoObject *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(self->x_attr); return 0; } diff --git a/Modules/xxmodule.c b/Modules/xxmodule.c index 0250031d..17b049c4 100644 --- a/Modules/xxmodule.c +++ b/Modules/xxmodule.c @@ -25,7 +25,7 @@ typedef struct { static PyTypeObject Xxo_Type; -#define XxoObject_Check(v) (Py_TYPE(v) == &Xxo_Type) +#define XxoObject_Check(v) Py_IS_TYPE(v, &Xxo_Type) static XxoObject * newXxoObject(PyObject *arg) diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c index 031005d3..72003377 100644 --- a/Modules/xxsubtype.c +++ b/Modules/xxsubtype.c @@ -1,5 +1,5 @@ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef PyDoc_STRVAR(xxsubtype__doc__, "xxsubtype is an example module showing how to subtype builtin types from C.\n" diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index a3d9ed66..fe27909a 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -6,11 +6,10 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "zlib.h" -#include "pythread.h" #define ENTER_ZLIB(obj) \ Py_BEGIN_ALLOW_THREADS; \ PyThread_acquire_lock((obj)->lock, 1); \ @@ -32,10 +31,23 @@ /* Initial buffer size. */ #define DEF_BUF_SIZE (16*1024) -static PyTypeObject Comptype; -static PyTypeObject Decomptype; +static PyModuleDef zlibmodule; -static PyObject *ZlibError; +typedef struct { + PyTypeObject *Comptype; + PyTypeObject *Decomptype; + PyObject *ZlibError; +} _zlibstate; + +static inline _zlibstate* +get_zlib_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_zlibstate *)state; +} + +#define _zlibstate_global ((_zlibstate *)PyModule_GetState(PyState_FindModule(&zlibmodule))) typedef struct { @@ -73,9 +85,9 @@ zlib_error(z_stream zst, int err, const char *msg) } } if (zmsg == Z_NULL) - PyErr_Format(ZlibError, "Error %d %s", err, msg); + PyErr_Format(_zlibstate_global->ZlibError, "Error %d %s", err, msg); else - PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zmsg); + PyErr_Format(_zlibstate_global->ZlibError, "Error %d %s: %.200s", err, msg, zmsg); } /*[clinic input] @@ -226,7 +238,7 @@ zlib_compress_impl(PyObject *module, Py_buffer *data, int level) "Out of memory while compressing data"); goto error; case Z_STREAM_ERROR: - PyErr_SetString(ZlibError, "Bad compression level"); + PyErr_SetString(_zlibstate_global->ZlibError, "Bad compression level"); goto error; default: deflateEnd(&zst); @@ -462,7 +474,7 @@ zlib_compressobj_impl(PyObject *module, int level, int method, int wbits, goto error; } - self = newcompobject(&Comptype); + self = newcompobject(_zlibstate_global->Comptype); if (self == NULL) goto error; self->zst.opaque = NULL; @@ -558,7 +570,7 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict) return NULL; } - self = newcompobject(&Decomptype); + self = newcompobject(_zlibstate_global->Decomptype); if (self == NULL) return NULL; self->zst.opaque = NULL; @@ -581,7 +593,7 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict) return NULL; } #else - PyErr_Format(ZlibError, + PyErr_Format(_zlibstate_global->ZlibError, "zlib version %s does not allow raw inflate with dictionary", ZLIB_VERSION); Py_DECREF(self); @@ -608,11 +620,13 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict) static void Dealloc(compobject *self) { + PyObject *type = (PyObject *)Py_TYPE(self); PyThread_free_lock(self->lock); Py_XDECREF(self->unused_data); Py_XDECREF(self->unconsumed_tail); Py_XDECREF(self->zdict); PyObject_Del(self); + Py_DECREF(type); } static void @@ -944,7 +958,7 @@ zlib_Compress_copy_impl(compobject *self) compobject *retval = NULL; int err; - retval = newcompobject(&Comptype); + retval = newcompobject(_zlibstate_global->Comptype); if (!retval) return NULL; /* Copy the zstream state @@ -1025,7 +1039,7 @@ zlib_Decompress_copy_impl(compobject *self) compobject *retval = NULL; int err; - retval = newcompobject(&Decomptype); + retval = newcompobject(_zlibstate_global->Decomptype); if (!retval) return NULL; /* Copy the zstream state @@ -1309,67 +1323,33 @@ static PyMethodDef zlib_methods[] = {NULL, NULL} }; -static PyTypeObject Comptype = { - PyVarObject_HEAD_INIT(0, 0) +static PyType_Slot Comptype_slots[] = { + {Py_tp_dealloc, Comp_dealloc}, + {Py_tp_methods, comp_methods}, + {0, 0}, +}; + +static PyType_Spec Comptype_spec = { "zlib.Compress", sizeof(compobject), 0, - (destructor)Comp_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - comp_methods, /*tp_methods*/ + Py_TPFLAGS_DEFAULT, + Comptype_slots +}; + +static PyType_Slot Decomptype_slots[] = { + {Py_tp_dealloc, Decomp_dealloc}, + {Py_tp_methods, Decomp_methods}, + {Py_tp_members, Decomp_members}, + {0, 0}, }; -static PyTypeObject Decomptype = { - PyVarObject_HEAD_INIT(0, 0) +static PyType_Spec Decomptype_spec = { "zlib.Decompress", sizeof(compobject), 0, - (destructor)Decomp_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - Decomp_methods, /*tp_methods*/ - Decomp_members, /*tp_members*/ + Py_TPFLAGS_DEFAULT, + Decomptype_slots }; PyDoc_STRVAR(zlib_module_documentation, @@ -1387,34 +1367,72 @@ PyDoc_STRVAR(zlib_module_documentation, "Compressor objects support compress() and flush() methods; decompressor\n" "objects support decompress() and flush()."); +static int +zlib_clear(PyObject *m) +{ + _zlibstate *state = get_zlib_state(m); + Py_CLEAR(state->Comptype); + Py_CLEAR(state->Decomptype); + Py_CLEAR(state->ZlibError); + return 0; +} + +static int +zlib_traverse(PyObject *m, visitproc visit, void *arg) +{ + _zlibstate *state = get_zlib_state(m); + Py_VISIT(state->Comptype); + Py_VISIT(state->Decomptype); + Py_VISIT(state->ZlibError); + return 0; +} + +static void +zlib_free(void *m) +{ + zlib_clear((PyObject *)m); +} + static struct PyModuleDef zlibmodule = { PyModuleDef_HEAD_INIT, "zlib", zlib_module_documentation, - -1, + sizeof(_zlibstate), zlib_methods, NULL, - NULL, - NULL, - NULL + zlib_traverse, + zlib_clear, + zlib_free, }; PyMODINIT_FUNC PyInit_zlib(void) { PyObject *m, *ver; - if (PyType_Ready(&Comptype) < 0) - return NULL; - if (PyType_Ready(&Decomptype) < 0) - return NULL; + m = PyState_FindModule(&zlibmodule); + if (m != NULL) { + Py_INCREF(m); + return m; + } m = PyModule_Create(&zlibmodule); if (m == NULL) return NULL; - ZlibError = PyErr_NewException("zlib.error", NULL, NULL); + PyTypeObject *Comptype = (PyTypeObject *)PyType_FromSpec(&Comptype_spec); + if (Comptype == NULL) + return NULL; + get_zlib_state(m)->Comptype = Comptype; + + PyTypeObject *Decomptype = (PyTypeObject *)PyType_FromSpec(&Decomptype_spec); + if (Decomptype == NULL) + return NULL; + get_zlib_state(m)->Decomptype = Decomptype; + + PyObject *ZlibError = PyErr_NewException("zlib.error", NULL, NULL); if (ZlibError != NULL) { Py_INCREF(ZlibError); PyModule_AddObject(m, "error", ZlibError); + get_zlib_state(m)->ZlibError = ZlibError; } PyModule_AddIntMacro(m, MAX_WBITS); PyModule_AddIntMacro(m, DEFLATED); @@ -1457,5 +1475,6 @@ PyInit_zlib(void) PyModule_AddStringConstant(m, "__version__", "1.0"); + PyState_AddModule(m, &zlibmodule); return m; } diff --git a/Objects/abstract.c b/Objects/abstract.c index 12237d57..1d671c9e 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -1,9 +1,12 @@ /* Abstract Object Interface (many thanks to Jim Fulton) */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include -#include "structmember.h" /* we need the offsetof() macro from there */ +#include // offsetof() #include "longintrepr.h" @@ -13,7 +16,7 @@ static PyObject * type_error(const char *msg, PyObject *obj) { - PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, msg, Py_TYPE(obj)->tp_name); return NULL; } @@ -37,7 +40,7 @@ PyObject_Type(PyObject *o) return null_error(); } - v = (PyObject *)o->ob_type; + v = (PyObject *)Py_TYPE(o); Py_INCREF(v); return v; } @@ -52,7 +55,7 @@ PyObject_Size(PyObject *o) return -1; } - m = o->ob_type->tp_as_sequence; + m = Py_TYPE(o)->tp_as_sequence; if (m && m->sq_length) { Py_ssize_t len = m->sq_length(o); assert(len >= 0 || PyErr_Occurred()); @@ -149,16 +152,16 @@ PyObject_GetItem(PyObject *o, PyObject *key) return null_error(); } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_subscript) { PyObject *item = m->mp_subscript(o, key); assert((item != NULL) ^ (PyErr_Occurred() != NULL)); return item; } - ms = o->ob_type->tp_as_sequence; + ms = Py_TYPE(o)->tp_as_sequence; if (ms && ms->sq_item) { - if (PyIndex_Check(key)) { + if (_PyIndex_Check(key)) { Py_ssize_t key_value; key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); if (key_value == -1 && PyErr_Occurred()) @@ -172,13 +175,19 @@ PyObject_GetItem(PyObject *o, PyObject *key) } if (PyType_Check(o)) { - PyObject *meth, *result, *stack[1] = {key}; + PyObject *meth, *result; _Py_IDENTIFIER(__class_getitem__); + + // Special case type[int], but disallow other types so str[int] fails + if ((PyTypeObject*)o == &PyType_Type) { + return Py_GenericAlias(o, key); + } + if (_PyObject_LookupAttrId(o, &PyId___class_getitem__, &meth) < 0) { return NULL; } if (meth) { - result = _PyObject_FastCall(meth, stack, 1); + result = PyObject_CallOneArg(meth, key); Py_DECREF(meth); return result; } @@ -196,19 +205,19 @@ PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value) null_error(); return -1; } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_ass_subscript) return m->mp_ass_subscript(o, key, value); - if (o->ob_type->tp_as_sequence) { - if (PyIndex_Check(key)) { + if (Py_TYPE(o)->tp_as_sequence) { + if (_PyIndex_Check(key)) { Py_ssize_t key_value; key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); if (key_value == -1 && PyErr_Occurred()) return -1; return PySequence_SetItem(o, key_value, value); } - else if (o->ob_type->tp_as_sequence->sq_ass_item) { + else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) { type_error("sequence index must be " "integer, not '%.200s'", key); return -1; @@ -228,19 +237,19 @@ PyObject_DelItem(PyObject *o, PyObject *key) null_error(); return -1; } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_ass_subscript) return m->mp_ass_subscript(o, key, (PyObject*)NULL); - if (o->ob_type->tp_as_sequence) { - if (PyIndex_Check(key)) { + if (Py_TYPE(o)->tp_as_sequence) { + if (_PyIndex_Check(key)) { Py_ssize_t key_value; key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); if (key_value == -1 && PyErr_Occurred()) return -1; return PySequence_DelItem(o, key_value); } - else if (o->ob_type->tp_as_sequence->sq_ass_item) { + else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) { type_error("sequence index must be " "integer, not '%.200s'", key); return -1; @@ -269,13 +278,23 @@ PyObject_DelItemString(PyObject *o, const char *key) return ret; } + +/* Return 1 if the getbuffer function is available, otherwise return 0. */ +int +PyObject_CheckBuffer(PyObject *obj) +{ + PyBufferProcs *tp_as_buffer = Py_TYPE(obj)->tp_as_buffer; + return (tp_as_buffer != NULL && tp_as_buffer->bf_getbuffer != NULL); +} + + /* We release the buffer right after use of this function which could cause issues later on. Don't use these functions in new code. */ int PyObject_CheckReadBuffer(PyObject *obj) { - PyBufferProcs *pb = obj->ob_type->tp_as_buffer; + PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer; Py_buffer view; if (pb == NULL || @@ -333,7 +352,7 @@ int PyObject_AsWriteBuffer(PyObject *obj, null_error(); return -1; } - pb = obj->ob_type->tp_as_buffer; + pb = Py_TYPE(obj)->tp_as_buffer; if (pb == NULL || pb->bf_getbuffer == NULL || ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) { @@ -353,7 +372,7 @@ int PyObject_AsWriteBuffer(PyObject *obj, int PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { - PyBufferProcs *pb = obj->ob_type->tp_as_buffer; + PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer; if (pb == NULL || pb->bf_getbuffer == NULL) { PyErr_Format(PyExc_TypeError, @@ -495,6 +514,48 @@ _Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape) } } +Py_ssize_t +PyBuffer_SizeFromFormat(const char *format) +{ + PyObject *structmodule = NULL; + PyObject *calcsize = NULL; + PyObject *res = NULL; + PyObject *fmt = NULL; + Py_ssize_t itemsize = -1; + + structmodule = PyImport_ImportModule("struct"); + if (structmodule == NULL) { + return itemsize; + } + + calcsize = PyObject_GetAttrString(structmodule, "calcsize"); + if (calcsize == NULL) { + goto done; + } + + fmt = PyUnicode_FromString(format); + if (fmt == NULL) { + goto done; + } + + res = PyObject_CallFunctionObjArgs(calcsize, fmt, NULL); + if (res == NULL) { + goto done; + } + + itemsize = PyLong_AsSsize_t(res); + if (itemsize < 0) { + goto done; + } + +done: + Py_DECREF(structmodule); + Py_XDECREF(calcsize); + Py_XDECREF(fmt); + Py_XDECREF(res); + return itemsize; +} + int PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort) { @@ -737,7 +798,7 @@ PyObject_Format(PyObject *obj, PyObject *format_spec) } /* And call it. */ - result = PyObject_CallFunctionObjArgs(meth, format_spec, NULL); + result = PyObject_CallOneArg(meth, format_spec); Py_DECREF(meth); if (result && !PyUnicode_Check(result)) { @@ -758,10 +819,10 @@ done: int PyNumber_Check(PyObject *o) { - return o && o->ob_type->tp_as_number && - (o->ob_type->tp_as_number->nb_index || - o->ob_type->tp_as_number->nb_int || - o->ob_type->tp_as_number->nb_float); + return o && Py_TYPE(o)->tp_as_number && + (Py_TYPE(o)->tp_as_number->nb_index || + Py_TYPE(o)->tp_as_number->nb_int || + Py_TYPE(o)->tp_as_number->nb_float); } /* Binary operators */ @@ -778,8 +839,8 @@ PyNumber_Check(PyObject *o) Order operations are tried until either a valid result or error: w.op(v,w)[*], v.op(v,w), w.op(v,w) - [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of - v->ob_type + [*] only when Py_TYPE(v) != Py_TYPE(w) && Py_TYPE(w) is a subclass of + Py_TYPE(v) */ static PyObject * @@ -789,16 +850,16 @@ binary_op1(PyObject *v, PyObject *w, const int op_slot) binaryfunc slotv = NULL; binaryfunc slotw = NULL; - if (v->ob_type->tp_as_number != NULL) - slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot); - if (w->ob_type != v->ob_type && - w->ob_type->tp_as_number != NULL) { - slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot); + if (Py_TYPE(v)->tp_as_number != NULL) + slotv = NB_BINOP(Py_TYPE(v)->tp_as_number, op_slot); + if (!Py_IS_TYPE(w, Py_TYPE(v)) && + Py_TYPE(w)->tp_as_number != NULL) { + slotw = NB_BINOP(Py_TYPE(w)->tp_as_number, op_slot); if (slotw == slotv) slotw = NULL; } if (slotv) { - if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) { + if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) { x = slotw(v, w); if (x != Py_NotImplemented) return x; @@ -826,8 +887,8 @@ binop_type_error(PyObject *v, PyObject *w, const char *op_name) "unsupported operand type(s) for %.100s: " "'%.100s' and '%.100s'", op_name, - v->ob_type->tp_name, - w->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); return NULL; } @@ -839,7 +900,7 @@ binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name) Py_DECREF(result); if (op_slot == NB_SLOT(nb_rshift) && - PyCFunction_Check(v) && + PyCFunction_CheckExact(v) && strcmp(((PyCFunctionObject *)v)->m_ml->ml_name, "print") == 0) { PyErr_Format(PyExc_TypeError, @@ -847,8 +908,8 @@ binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name) "'%.100s' and '%.100s'. Did you mean \"print(, " "file=)\"?", op_name, - v->ob_type->tp_name, - w->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); return NULL; } @@ -878,18 +939,17 @@ ternary_op(PyObject *v, ternaryfunc slotw = NULL; ternaryfunc slotz = NULL; - mv = v->ob_type->tp_as_number; - mw = w->ob_type->tp_as_number; + mv = Py_TYPE(v)->tp_as_number; + mw = Py_TYPE(w)->tp_as_number; if (mv != NULL) slotv = NB_TERNOP(mv, op_slot); - if (w->ob_type != v->ob_type && - mw != NULL) { + if (!Py_IS_TYPE(w, Py_TYPE(v)) && mw != NULL) { slotw = NB_TERNOP(mw, op_slot); if (slotw == slotv) slotw = NULL; } if (slotv) { - if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) { + if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) { x = slotw(v, w, z); if (x != Py_NotImplemented) return x; @@ -907,7 +967,7 @@ ternary_op(PyObject *v, return x; Py_DECREF(x); /* can't do it */ } - mz = z->ob_type->tp_as_number; + mz = Py_TYPE(z)->tp_as_number; if (mz != NULL) { slotz = NB_TERNOP(mz, op_slot); if (slotz == slotv || slotz == slotw) @@ -925,16 +985,16 @@ ternary_op(PyObject *v, PyExc_TypeError, "unsupported operand type(s) for ** or pow(): " "'%.100s' and '%.100s'", - v->ob_type->tp_name, - w->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); else PyErr_Format( PyExc_TypeError, "unsupported operand type(s) for pow(): " "'%.100s', '%.100s', '%.100s'", - v->ob_type->tp_name, - w->ob_type->tp_name, - z->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name, + Py_TYPE(z)->tp_name); return NULL; } @@ -957,7 +1017,7 @@ PyNumber_Add(PyObject *v, PyObject *w) { PyObject *result = binary_op1(v, w, NB_SLOT(nb_add)); if (result == Py_NotImplemented) { - PySequenceMethods *m = v->ob_type->tp_as_sequence; + PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence; Py_DECREF(result); if (m && m->sq_concat) { return (*m->sq_concat)(v, w); @@ -971,7 +1031,7 @@ static PyObject * sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n) { Py_ssize_t count; - if (PyIndex_Check(n)) { + if (_PyIndex_Check(n)) { count = PyNumber_AsSsize_t(n, PyExc_OverflowError); if (count == -1 && PyErr_Occurred()) return NULL; @@ -988,8 +1048,8 @@ PyNumber_Multiply(PyObject *v, PyObject *w) { PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply)); if (result == Py_NotImplemented) { - PySequenceMethods *mv = v->ob_type->tp_as_sequence; - PySequenceMethods *mw = w->ob_type->tp_as_sequence; + PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence; + PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence; Py_DECREF(result); if (mv && mv->sq_repeat) { return sequence_repeat(mv->sq_repeat, v, w); @@ -1051,7 +1111,7 @@ PyNumber_Power(PyObject *v, PyObject *w, PyObject *z) static PyObject * binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot) { - PyNumberMethods *mv = v->ob_type->tp_as_number; + PyNumberMethods *mv = Py_TYPE(v)->tp_as_number; if (mv != NULL) { binaryfunc slot = NB_BINOP(mv, iop_slot); if (slot) { @@ -1111,7 +1171,7 @@ PyNumber_InPlaceAdd(PyObject *v, PyObject *w) PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add)); if (result == Py_NotImplemented) { - PySequenceMethods *m = v->ob_type->tp_as_sequence; + PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence; Py_DECREF(result); if (m != NULL) { binaryfunc f = NULL; @@ -1133,8 +1193,8 @@ PyNumber_InPlaceMultiply(PyObject *v, PyObject *w) NB_SLOT(nb_multiply)); if (result == Py_NotImplemented) { ssizeargfunc f = NULL; - PySequenceMethods *mv = v->ob_type->tp_as_sequence; - PySequenceMethods *mw = w->ob_type->tp_as_sequence; + PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence; + PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence; Py_DECREF(result); if (mv != NULL) { f = mv->sq_inplace_repeat; @@ -1172,8 +1232,8 @@ PyNumber_InPlaceRemainder(PyObject *v, PyObject *w) PyObject * PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z) { - if (v->ob_type->tp_as_number && - v->ob_type->tp_as_number->nb_inplace_power != NULL) { + if (Py_TYPE(v)->tp_as_number && + Py_TYPE(v)->tp_as_number->nb_inplace_power != NULL) { return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**="); } else { @@ -1193,7 +1253,7 @@ PyNumber_Negative(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_negative) return (*m->nb_negative)(o); @@ -1209,7 +1269,7 @@ PyNumber_Positive(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_positive) return (*m->nb_positive)(o); @@ -1225,7 +1285,7 @@ PyNumber_Invert(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_invert) return (*m->nb_invert)(o); @@ -1241,22 +1301,21 @@ PyNumber_Absolute(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_absolute) return m->nb_absolute(o); return type_error("bad operand type for abs(): '%.200s'", o); } -#undef PyIndex_Check int PyIndex_Check(PyObject *obj) { - return obj->ob_type->tp_as_number != NULL && - obj->ob_type->tp_as_number->nb_index != NULL; + return _PyIndex_Check(obj); } + /* Return a Python int from the object item. Raise TypeError if the result is not an int or if the object cannot be interpreted as an index. @@ -1273,19 +1332,19 @@ PyNumber_Index(PyObject *item) Py_INCREF(item); return item; } - if (!PyIndex_Check(item)) { + if (!_PyIndex_Check(item)) { PyErr_Format(PyExc_TypeError, "'%.200s' object cannot be interpreted " - "as an integer", item->ob_type->tp_name); + "as an integer", Py_TYPE(item)->tp_name); return NULL; } - result = item->ob_type->tp_as_number->nb_index(item); + result = Py_TYPE(item)->tp_as_number->nb_index(item); if (!result || PyLong_CheckExact(result)) return result; if (!PyLong_Check(result)) { PyErr_Format(PyExc_TypeError, "__index__ returned non-int (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -1294,7 +1353,7 @@ PyNumber_Index(PyObject *item) "__index__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", - result->ob_type->tp_name)) { + Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } @@ -1339,7 +1398,7 @@ PyNumber_AsSsize_t(PyObject *item, PyObject *err) /* Otherwise replace the error with caller's error object. */ PyErr_Format(err, "cannot fit '%.200s' into an index-sized integer", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); } finish: @@ -1365,7 +1424,7 @@ PyNumber_Long(PyObject *o) Py_INCREF(o); return o; } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_int) { /* This should include subclasses of int */ result = _PyLong_FromNbInt(o); if (result != NULL && !PyLong_CheckExact(result)) { @@ -1393,12 +1452,12 @@ PyNumber_Long(PyObject *o) } /* __trunc__ is specified to return an Integral type, but int() needs to return an int. */ - m = result->ob_type->tp_as_number; + m = Py_TYPE(result)->tp_as_number; if (m == NULL || (m->nb_index == NULL && m->nb_int == NULL)) { PyErr_Format( PyExc_TypeError, "__trunc__ returned non-Integral (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -1460,7 +1519,7 @@ PyNumber_Float(PyObject *o) Py_INCREF(o); return o; } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_float) { /* This should include subclasses of float */ PyObject *res = m->nb_float(o); double val; @@ -1470,7 +1529,7 @@ PyNumber_Float(PyObject *o) if (!PyFloat_Check(res)) { PyErr_Format(PyExc_TypeError, "%.50s.__float__ returned non-float (type %.50s)", - o->ob_type->tp_name, res->ob_type->tp_name); + Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } @@ -1479,7 +1538,7 @@ PyNumber_Float(PyObject *o) "%.50s.__float__ returned non-float (type %.50s). " "The ability to return an instance of a strict subclass of float " "is deprecated, and may be removed in a future version of Python.", - o->ob_type->tp_name, res->ob_type->tp_name)) { + Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name)) { Py_DECREF(res); return NULL; } @@ -1530,8 +1589,8 @@ PySequence_Check(PyObject *s) { if (PyDict_Check(s)) return 0; - return s->ob_type->tp_as_sequence && - s->ob_type->tp_as_sequence->sq_item != NULL; + return Py_TYPE(s)->tp_as_sequence && + Py_TYPE(s)->tp_as_sequence->sq_item != NULL; } Py_ssize_t @@ -1544,14 +1603,14 @@ PySequence_Size(PyObject *s) return -1; } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_length) { Py_ssize_t len = m->sq_length(s); assert(len >= 0 || PyErr_Occurred()); return len; } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_length) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_length) { type_error("%.200s is not a sequence", s); return -1; } @@ -1576,7 +1635,7 @@ PySequence_Concat(PyObject *s, PyObject *o) return null_error(); } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_concat) return m->sq_concat(s, o); @@ -1601,7 +1660,7 @@ PySequence_Repeat(PyObject *o, Py_ssize_t count) return null_error(); } - m = o->ob_type->tp_as_sequence; + m = Py_TYPE(o)->tp_as_sequence; if (m && m->sq_repeat) return m->sq_repeat(o, count); @@ -1631,7 +1690,7 @@ PySequence_InPlaceConcat(PyObject *s, PyObject *o) return null_error(); } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_inplace_concat) return m->sq_inplace_concat(s, o); if (m && m->sq_concat) @@ -1656,7 +1715,7 @@ PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count) return null_error(); } - m = o->ob_type->tp_as_sequence; + m = Py_TYPE(o)->tp_as_sequence; if (m && m->sq_inplace_repeat) return m->sq_inplace_repeat(o, count); if (m && m->sq_repeat) @@ -1686,7 +1745,7 @@ PySequence_GetItem(PyObject *s, Py_ssize_t i) return null_error(); } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_item) { if (i < 0) { if (m->sq_length) { @@ -1701,7 +1760,7 @@ PySequence_GetItem(PyObject *s, Py_ssize_t i) return m->sq_item(s, i); } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_subscript) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_subscript) { return type_error("%.200s is not a sequence", s); } return type_error("'%.200s' object does not support indexing", s); @@ -1716,7 +1775,7 @@ PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) return null_error(); } - mp = s->ob_type->tp_as_mapping; + mp = Py_TYPE(s)->tp_as_mapping; if (mp && mp->mp_subscript) { PyObject *res; PyObject *slice = _PySlice_FromIndices(i1, i2); @@ -1740,7 +1799,7 @@ PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o) return -1; } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_ass_item) { if (i < 0) { if (m->sq_length) { @@ -1755,7 +1814,7 @@ PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o) return m->sq_ass_item(s, i, o); } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_ass_subscript) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) { type_error("%.200s is not a sequence", s); return -1; } @@ -1773,7 +1832,7 @@ PySequence_DelItem(PyObject *s, Py_ssize_t i) return -1; } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_ass_item) { if (i < 0) { if (m->sq_length) { @@ -1788,7 +1847,7 @@ PySequence_DelItem(PyObject *s, Py_ssize_t i) return m->sq_ass_item(s, i, (PyObject *)NULL); } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_ass_subscript) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) { type_error("%.200s is not a sequence", s); return -1; } @@ -1806,7 +1865,7 @@ PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o) return -1; } - mp = s->ob_type->tp_as_mapping; + mp = Py_TYPE(s)->tp_as_mapping; if (mp && mp->mp_ass_subscript) { int res; PyObject *slice = _PySlice_FromIndices(i1, i2); @@ -1831,7 +1890,7 @@ PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) return -1; } - mp = s->ob_type->tp_as_mapping; + mp = Py_TYPE(s)->tp_as_mapping; if (mp && mp->mp_ass_subscript) { int res; PyObject *slice = _PySlice_FromIndices(i1, i2); @@ -2015,7 +2074,7 @@ _PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation) break; } - cmp = PyObject_RichCompareBool(obj, item, Py_EQ); + cmp = PyObject_RichCompareBool(item, obj, Py_EQ); Py_DECREF(item); if (cmp < 0) goto Fail; @@ -2083,7 +2142,7 @@ int PySequence_Contains(PyObject *seq, PyObject *ob) { Py_ssize_t result; - PySequenceMethods *sqm = seq->ob_type->tp_as_sequence; + PySequenceMethods *sqm = Py_TYPE(seq)->tp_as_sequence; if (sqm != NULL && sqm->sq_contains != NULL) return (*sqm->sq_contains)(seq, ob); result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS); @@ -2109,8 +2168,8 @@ PySequence_Index(PyObject *s, PyObject *o) int PyMapping_Check(PyObject *o) { - return o && o->ob_type->tp_as_mapping && - o->ob_type->tp_as_mapping->mp_subscript; + return o && Py_TYPE(o)->tp_as_mapping && + Py_TYPE(o)->tp_as_mapping->mp_subscript; } Py_ssize_t @@ -2123,14 +2182,14 @@ PyMapping_Size(PyObject *o) return -1; } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_length) { Py_ssize_t len = m->mp_length(o); assert(len >= 0 || PyErr_Occurred()); return len; } - if (o->ob_type->tp_as_sequence && o->ob_type->tp_as_sequence->sq_length) { + if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) { type_error("%.200s is not a mapping", o); return -1; } @@ -2220,7 +2279,7 @@ method_output_as_list(PyObject *o, _Py_Identifier *meth_id) PyObject *it, *result, *meth_output; assert(o != NULL); - meth_output = _PyObject_CallMethodId(o, meth_id, NULL); + meth_output = _PyObject_CallMethodIdNoArgs(o, meth_id); if (meth_output == NULL || PyList_CheckExact(meth_output)) { return meth_output; } @@ -2230,7 +2289,7 @@ method_output_as_list(PyObject *o, _Py_Identifier *meth_id) PyErr_Format(PyExc_TypeError, "%.200s.%U() returned a non-iterable (type %.200s)", Py_TYPE(o)->tp_name, - meth_id->object, + _PyUnicode_FromId(meth_id), Py_TYPE(meth_output)->tp_name); } Py_DECREF(meth_output); @@ -2385,7 +2444,7 @@ check_class(PyObject *cls, const char *error) } static int -recursive_isinstance(PyObject *inst, PyObject *cls) +object_isinstance(PyObject *inst, PyObject *cls) { PyObject *icls; int retval; @@ -2396,7 +2455,7 @@ recursive_isinstance(PyObject *inst, PyObject *cls) if (retval == 0) { retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls); if (icls != NULL) { - if (icls != (PyObject *)(inst->ob_type) && PyType_Check(icls)) { + if (icls != (PyObject *)(Py_TYPE(inst)) && PyType_Check(icls)) { retval = PyType_IsSubtype( (PyTypeObject *)icls, (PyTypeObject *)cls); @@ -2422,63 +2481,77 @@ recursive_isinstance(PyObject *inst, PyObject *cls) return retval; } -int -PyObject_IsInstance(PyObject *inst, PyObject *cls) +static int +object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls) { _Py_IDENTIFIER(__instancecheck__); - PyObject *checker; /* Quick test for an exact match */ - if (Py_TYPE(inst) == (PyTypeObject *)cls) + if (Py_IS_TYPE(inst, (PyTypeObject *)cls)) { return 1; + } /* We know what type's __instancecheck__ does. */ if (PyType_CheckExact(cls)) { - return recursive_isinstance(inst, cls); + return object_isinstance(inst, cls); } if (PyTuple_Check(cls)) { - Py_ssize_t i; - Py_ssize_t n; - int r = 0; - - if (Py_EnterRecursiveCall(" in __instancecheck__")) + /* Not a general sequence -- that opens up the road to + recursion and stack overflow. */ + if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) { return -1; - n = PyTuple_GET_SIZE(cls); - for (i = 0; i < n; ++i) { + } + Py_ssize_t n = PyTuple_GET_SIZE(cls); + int r = 0; + for (Py_ssize_t i = 0; i < n; ++i) { PyObject *item = PyTuple_GET_ITEM(cls, i); - r = PyObject_IsInstance(inst, item); - if (r != 0) + r = object_recursive_isinstance(tstate, inst, item); + if (r != 0) { /* either found it, or got an error */ break; + } } - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return r; } - checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__); + PyObject *checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__); if (checker != NULL) { - PyObject *res; - int ok = -1; - if (Py_EnterRecursiveCall(" in __instancecheck__")) { + if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) { Py_DECREF(checker); - return ok; + return -1; } - res = PyObject_CallFunctionObjArgs(checker, inst, NULL); - Py_LeaveRecursiveCall(); + + PyObject *res = PyObject_CallOneArg(checker, inst); + _Py_LeaveRecursiveCall(tstate); Py_DECREF(checker); - if (res != NULL) { - ok = PyObject_IsTrue(res); - Py_DECREF(res); + + if (res == NULL) { + return -1; } + int ok = PyObject_IsTrue(res); + Py_DECREF(res); + return ok; } - else if (PyErr_Occurred()) + else if (_PyErr_Occurred(tstate)) { return -1; - /* Probably never reached anymore. */ - return recursive_isinstance(inst, cls); + } + + /* cls has no __instancecheck__() method */ + return object_isinstance(inst, cls); +} + + +int +PyObject_IsInstance(PyObject *inst, PyObject *cls) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return object_recursive_isinstance(tstate, inst, cls); } + static int recursive_issubclass(PyObject *derived, PyObject *cls) { @@ -2497,8 +2570,8 @@ recursive_issubclass(PyObject *derived, PyObject *cls) return abstract_issubclass(derived, cls); } -int -PyObject_IsSubclass(PyObject *derived, PyObject *cls) +static int +object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls) { _Py_IDENTIFIER(__subclasscheck__); PyObject *checker; @@ -2512,34 +2585,32 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls) } if (PyTuple_Check(cls)) { - Py_ssize_t i; - Py_ssize_t n; - int r = 0; - if (Py_EnterRecursiveCall(" in __subclasscheck__")) + if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) { return -1; - n = PyTuple_GET_SIZE(cls); - for (i = 0; i < n; ++i) { + } + Py_ssize_t n = PyTuple_GET_SIZE(cls); + int r = 0; + for (Py_ssize_t i = 0; i < n; ++i) { PyObject *item = PyTuple_GET_ITEM(cls, i); - r = PyObject_IsSubclass(derived, item); + r = object_issubclass(tstate, derived, item); if (r != 0) /* either found it, or got an error */ break; } - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return r; } checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__); if (checker != NULL) { - PyObject *res; int ok = -1; - if (Py_EnterRecursiveCall(" in __subclasscheck__")) { + if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) { Py_DECREF(checker); return ok; } - res = PyObject_CallFunctionObjArgs(checker, derived, NULL); - Py_LeaveRecursiveCall(); + PyObject *res = PyObject_CallOneArg(checker, derived); + _Py_LeaveRecursiveCall(tstate); Py_DECREF(checker); if (res != NULL) { ok = PyObject_IsTrue(res); @@ -2547,16 +2618,27 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls) } return ok; } - else if (PyErr_Occurred()) + else if (_PyErr_Occurred(tstate)) { return -1; + } + /* Probably never reached anymore. */ return recursive_issubclass(derived, cls); } + +int +PyObject_IsSubclass(PyObject *derived, PyObject *cls) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return object_issubclass(tstate, derived, cls); +} + + int _PyObject_RealIsInstance(PyObject *inst, PyObject *cls) { - return recursive_isinstance(inst, cls); + return object_isinstance(inst, cls); } int @@ -2569,7 +2651,7 @@ _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls) PyObject * PyObject_GetIter(PyObject *o) { - PyTypeObject *t = o->ob_type; + PyTypeObject *t = Py_TYPE(o); getiterfunc f; f = t->tp_iter; @@ -2584,7 +2666,7 @@ PyObject_GetIter(PyObject *o) PyErr_Format(PyExc_TypeError, "iter() returned non-iterator " "of type '%.100s'", - res->ob_type->tp_name); + Py_TYPE(res)->tp_name); Py_DECREF(res); res = NULL; } @@ -2596,8 +2678,8 @@ PyObject_GetIter(PyObject *o) int PyIter_Check(PyObject *obj) { - return obj->ob_type->tp_iternext != NULL && - obj->ob_type->tp_iternext != &_PyObject_NextNotImplemented; + return Py_TYPE(obj)->tp_iternext != NULL && + Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented; } /* Return next item. @@ -2611,7 +2693,7 @@ PyObject * PyIter_Next(PyObject *iter) { PyObject *result; - result = (*iter->ob_type->tp_iternext)(iter); + result = (*Py_TYPE(iter)->tp_iternext)(iter); if (result == NULL && PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index d4d02336..97d77967 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2,11 +2,9 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_bytes_methods.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "structmember.h" -#include "bytes_methods.h" #include "bytesobject.h" #include "pystrhex.h" @@ -89,8 +87,7 @@ _canresize(PyByteArrayObject *self) PyObject * PyByteArray_FromObject(PyObject *input) { - return PyObject_CallFunctionObjArgs((PyObject *)&PyByteArray_Type, - input, NULL); + return PyObject_CallOneArg((PyObject *)&PyByteArray_Type, input); } static PyObject * @@ -149,7 +146,7 @@ PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size) memcpy(new->ob_bytes, bytes, size); new->ob_bytes[size] = '\0'; /* Trailing null byte */ } - Py_SIZE(new) = size; + Py_SET_SIZE(new, size); new->ob_alloc = alloc; new->ob_start = new->ob_bytes; new->ob_exports = 0; @@ -207,7 +204,7 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size) } else { /* Minor downsize; quick exit */ - Py_SIZE(self) = size; + Py_SET_SIZE(self, size); PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */ return 0; } @@ -247,7 +244,7 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size) } obj->ob_bytes = obj->ob_start = sval; - Py_SIZE(self) = size; + Py_SET_SIZE(self, size); obj->ob_alloc = alloc; obj->ob_bytes[size] = '\0'; /* Trailing null byte */ @@ -384,8 +381,6 @@ bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count) static PyObject * bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i) { - if (i < 0) - i += Py_SIZE(self); if (i < 0 || i >= Py_SIZE(self)) { PyErr_SetString(PyExc_IndexError, "bytearray index out of range"); return NULL; @@ -396,7 +391,7 @@ bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i) static PyObject * bytearray_subscript(PyByteArrayObject *self, PyObject *index) { - if (PyIndex_Check(index)) { + if (_PyIndex_Check(index)) { Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) @@ -503,7 +498,7 @@ bytearray_setslice_linear(PyByteArrayObject *self, } /* memmove() removed bytes, the bytearray object cannot be restored in its previous state. */ - Py_SIZE(self) += growth; + Py_SET_SIZE(self, Py_SIZE(self) + growth); res = -1; } buf = PyByteArray_AS_STRING(self); @@ -615,7 +610,7 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu char *buf, *bytes; buf = PyByteArray_AS_STRING(self); - if (PyIndex_Check(index)) { + if (_PyIndex_Check(index)) { Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) @@ -814,7 +809,7 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds) } /* Is it an int? */ - if (PyIndex_Check(arg)) { + if (_PyIndex_Check(arg)) { count = PyNumber_AsSsize_t(arg, PyExc_OverflowError); if (count == -1 && PyErr_Occurred()) { if (!PyErr_ExceptionMatches(PyExc_TypeError)) @@ -861,7 +856,7 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds) if (PyErr_ExceptionMatches(PyExc_TypeError)) { PyErr_Format(PyExc_TypeError, "cannot convert '%.200s' object to bytearray", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); } return -1; } @@ -891,7 +886,7 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds) /* Append the byte */ if (Py_SIZE(self) + 1 < self->ob_alloc) { - Py_SIZE(self)++; + Py_SET_SIZE(self, Py_SIZE(self) + 1); PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0'; } else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0) @@ -1001,8 +996,7 @@ bytearray_repr(PyByteArrayObject *self) static PyObject * bytearray_str(PyObject *op) { - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; - if (config->bytes_warning) { + if (_Py_GetConfig()->bytes_warning) { if (PyErr_WarnEx(PyExc_BytesWarning, "str() on a bytearray instance", 1)) { return NULL; @@ -1027,8 +1021,7 @@ bytearray_richcompare(PyObject *self, PyObject *other, int op) if (rc < 0) return NULL; if (rc) { - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; - if (config->bytes_warning && (op == Py_EQ || op == Py_NE)) { + if (_Py_GetConfig()->bytes_warning && (op == Py_EQ || op == Py_NE)) { if (PyErr_WarnEx(PyExc_BytesWarning, "Comparison between bytearray and string", 1)) return NULL; @@ -1190,6 +1183,71 @@ bytearray_endswith(PyByteArrayObject *self, PyObject *args) return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); } +/*[clinic input] +bytearray.removeprefix as bytearray_removeprefix + + prefix: Py_buffer + / + +Return a bytearray with the given prefix string removed if present. + +If the bytearray starts with the prefix string, return +bytearray[len(prefix):]. Otherwise, return a copy of the original +bytearray. +[clinic start generated code]*/ + +static PyObject * +bytearray_removeprefix_impl(PyByteArrayObject *self, Py_buffer *prefix) +/*[clinic end generated code: output=6cabc585e7f502e0 input=968aada38aedd262]*/ +{ + const char *self_start = PyByteArray_AS_STRING(self); + Py_ssize_t self_len = PyByteArray_GET_SIZE(self); + const char *prefix_start = prefix->buf; + Py_ssize_t prefix_len = prefix->len; + + if (self_len >= prefix_len + && memcmp(self_start, prefix_start, prefix_len) == 0) + { + return PyByteArray_FromStringAndSize(self_start + prefix_len, + self_len - prefix_len); + } + + return PyByteArray_FromStringAndSize(self_start, self_len); +} + +/*[clinic input] +bytearray.removesuffix as bytearray_removesuffix + + suffix: Py_buffer + / + +Return a bytearray with the given suffix string removed if present. + +If the bytearray ends with the suffix string and that suffix is not +empty, return bytearray[:-len(suffix)]. Otherwise, return a copy of +the original bytearray. +[clinic start generated code]*/ + +static PyObject * +bytearray_removesuffix_impl(PyByteArrayObject *self, Py_buffer *suffix) +/*[clinic end generated code: output=2bc8cfb79de793d3 input=c1827e810b2f6b99]*/ +{ + const char *self_start = PyByteArray_AS_STRING(self); + Py_ssize_t self_len = PyByteArray_GET_SIZE(self); + const char *suffix_start = suffix->buf; + Py_ssize_t suffix_len = suffix->len; + + if (self_len >= suffix_len + && memcmp(self_start + self_len - suffix_len, + suffix_start, suffix_len) == 0) + { + return PyByteArray_FromStringAndSize(self_start, + self_len - suffix_len); + } + + return PyByteArray_FromStringAndSize(self_start, self_len); +} + /*[clinic input] bytearray.translate @@ -1635,7 +1693,7 @@ bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints) if (PyErr_ExceptionMatches(PyExc_TypeError)) { PyErr_Format(PyExc_TypeError, "can't extend bytearray with %.100s", - iterable_of_ints->ob_type->tp_name); + Py_TYPE(iterable_of_ints)->tp_name); } return NULL; } @@ -2020,8 +2078,7 @@ bytearray_fromhex_impl(PyTypeObject *type, PyObject *string) { PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type); if (type != &PyByteArray_Type && result != NULL) { - Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type, - result, NULL)); + Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result)); } return result; } @@ -2213,6 +2270,8 @@ bytearray_methods[] = { BYTEARRAY_POP_METHODDEF BYTEARRAY_REMOVE_METHODDEF BYTEARRAY_REPLACE_METHODDEF + BYTEARRAY_REMOVEPREFIX_METHODDEF + BYTEARRAY_REMOVESUFFIX_METHODDEF BYTEARRAY_REVERSE_METHODDEF {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__}, {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__}, diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c index db030be4..72daa1fd 100644 --- a/Objects/bytes_methods.c +++ b/Objects/bytes_methods.c @@ -1,6 +1,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "bytes_methods.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_bytes_methods.h" PyDoc_STRVAR_shared(_Py_isspace__doc__, "B.isspace() -> bool\n\ @@ -466,7 +467,7 @@ parse_args_finds_byte(const char *function_name, PyObject *args, return 1; } - if (!PyIndex_Check(tmp_subobj)) { + if (!_PyIndex_Check(tmp_subobj)) { PyErr_Format(PyExc_TypeError, "argument should be integer or bytes-like object, " "not '%.200s'", diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index feeabcb8..25d9814d 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -3,11 +3,11 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_bytes_methods.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" +#include "pycore_pymem.h" // PYMEM_CLEANBYTE -#include "bytes_methods.h" #include "pystrhex.h" #include @@ -18,13 +18,11 @@ class bytes "PyBytesObject *" "&PyBytes_Type" #include "clinic/bytesobject.c.h" -#ifdef COUNT_ALLOCS -Py_ssize_t _Py_null_strings, _Py_one_strings; -#endif - static PyBytesObject *characters[UCHAR_MAX + 1]; static PyBytesObject *nullstring; +_Py_IDENTIFIER(__bytes__); + /* PyBytesObject_SIZE gives the basic size of a string; any memory allocation for a string of length n should request PyBytesObject_SIZE + n bytes. @@ -66,9 +64,6 @@ _PyBytes_FromSize(Py_ssize_t size, int use_calloc) assert(size >= 0); if (size == 0 && (op = nullstring) != NULL) { -#ifdef COUNT_ALLOCS - _Py_null_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } @@ -110,9 +105,6 @@ PyBytes_FromStringAndSize(const char *str, Py_ssize_t size) if (size == 1 && str != NULL && (op = characters[*str & UCHAR_MAX]) != NULL) { -#ifdef COUNT_ALLOCS - _Py_one_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } @@ -146,16 +138,10 @@ PyBytes_FromString(const char *str) return NULL; } if (size == 0 && (op = nullstring) != NULL) { -#ifdef COUNT_ALLOCS - _Py_null_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) { -#ifdef COUNT_ALLOCS - _Py_one_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } @@ -543,7 +529,6 @@ static PyObject * format_obj(PyObject *v, const char **pbuf, Py_ssize_t *plen) { PyObject *func, *result; - _Py_IDENTIFIER(__bytes__); /* is it a bytes object? */ if (PyBytes_Check(v)) { *pbuf = PyBytes_AS_STRING(v); @@ -1074,52 +1059,10 @@ _PyBytes_FormatEx(const char *format, Py_ssize_t format_len, return NULL; } -/* Unescape a backslash-escaped string. If unicode is non-zero, - the string is a u-literal. If recode_encoding is non-zero, - the string is UTF-8 encoded and should be re-encoded in the - specified encoding. */ - -static char * -_PyBytes_DecodeEscapeRecode(const char **s, const char *end, - const char *errors, const char *recode_encoding, - _PyBytesWriter *writer, char *p) -{ - PyObject *u, *w; - const char* t; - - t = *s; - /* Decode non-ASCII bytes as UTF-8. */ - while (t < end && (*t & 0x80)) - t++; - u = PyUnicode_DecodeUTF8(*s, t - *s, errors); - if (u == NULL) - return NULL; - - /* Recode them in target encoding. */ - w = PyUnicode_AsEncodedString(u, recode_encoding, errors); - Py_DECREF(u); - if (w == NULL) - return NULL; - assert(PyBytes_Check(w)); - - /* Append bytes to output buffer. */ - writer->min_size--; /* subtract 1 preallocated byte */ - p = _PyBytesWriter_WriteBytes(writer, p, - PyBytes_AS_STRING(w), - PyBytes_GET_SIZE(w)); - Py_DECREF(w); - if (p == NULL) - return NULL; - - *s = t; - return p; -} - +/* Unescape a backslash-escaped string. */ PyObject *_PyBytes_DecodeEscape(const char *s, Py_ssize_t len, const char *errors, - Py_ssize_t unicode, - const char *recode_encoding, const char **first_invalid_escape) { int c; @@ -1139,18 +1082,7 @@ PyObject *_PyBytes_DecodeEscape(const char *s, end = s + len; while (s < end) { if (*s != '\\') { - non_esc: - if (!(recode_encoding && (*s & 0x80))) { - *p++ = *s++; - } - else { - /* non-ASCII character and need to recode */ - p = _PyBytes_DecodeEscapeRecode(&s, end, - errors, recode_encoding, - &writer, p); - if (p == NULL) - goto failed; - } + *p++ = *s++; continue; } @@ -1226,8 +1158,6 @@ PyObject *_PyBytes_DecodeEscape(const char *s, } *p++ = '\\'; s--; - goto non_esc; /* an arbitrary number of unescaped - UTF-8 bytes may follow. */ } } @@ -1241,12 +1171,11 @@ PyObject *_PyBytes_DecodeEscape(const char *s, PyObject *PyBytes_DecodeEscape(const char *s, Py_ssize_t len, const char *errors, - Py_ssize_t unicode, - const char *recode_encoding) + Py_ssize_t Py_UNUSED(unicode), + const char *Py_UNUSED(recode_encoding)) { const char* first_invalid_escape; - PyObject *result = _PyBytes_DecodeEscape(s, len, errors, unicode, - recode_encoding, + PyObject *result = _PyBytes_DecodeEscape(s, len, errors, &first_invalid_escape); if (result == NULL) return NULL; @@ -1335,12 +1264,14 @@ PyBytes_Repr(PyObject *obj, int smartquotes) Py_ssize_t i, length = Py_SIZE(op); Py_ssize_t newsize, squotes, dquotes; PyObject *v; - unsigned char quote, *s, *p; + unsigned char quote; + const unsigned char *s; + Py_UCS1 *p; /* Compute size of output string */ squotes = dquotes = 0; newsize = 3; /* b'' */ - s = (unsigned char*)op->ob_sval; + s = (const unsigned char*)op->ob_sval; for (i = 0; i < length; i++) { Py_ssize_t incr = 1; switch(s[i]) { @@ -1410,8 +1341,7 @@ bytes_repr(PyObject *op) static PyObject * bytes_str(PyObject *op) { - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; - if (config->bytes_warning) { + if (_Py_GetConfig()->bytes_warning) { if (PyErr_WarnEx(PyExc_BytesWarning, "str() on a bytes instance", 1)) { return NULL; @@ -1568,8 +1498,7 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op) /* Make sure both arguments are strings. */ if (!(PyBytes_Check(a) && PyBytes_Check(b))) { - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; - if (config->bytes_warning && (op == Py_EQ || op == Py_NE)) { + if (_Py_GetConfig()->bytes_warning && (op == Py_EQ || op == Py_NE)) { rc = PyObject_IsInstance((PyObject*)a, (PyObject*)&PyUnicode_Type); if (!rc) @@ -1650,7 +1579,7 @@ bytes_hash(PyBytesObject *a) static PyObject* bytes_subscript(PyBytesObject* self, PyObject* item) { - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; @@ -1666,7 +1595,7 @@ bytes_subscript(PyBytesObject* self, PyObject* item) else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength, i; size_t cur; - char* source_buf; + const char* source_buf; char* result_buf; PyObject* result; @@ -1931,7 +1860,7 @@ Py_LOCAL_INLINE(PyObject *) do_xstrip(PyBytesObject *self, int striptype, PyObject *sepobj) { Py_buffer vsep; - char *s = PyBytes_AS_STRING(self); + const char *s = PyBytes_AS_STRING(self); Py_ssize_t len = PyBytes_GET_SIZE(self); char *sep; Py_ssize_t seplen; @@ -1971,7 +1900,7 @@ do_xstrip(PyBytesObject *self, int striptype, PyObject *sepobj) Py_LOCAL_INLINE(PyObject *) do_strip(PyBytesObject *self, int striptype) { - char *s = PyBytes_AS_STRING(self); + const char *s = PyBytes_AS_STRING(self); Py_ssize_t len = PyBytes_GET_SIZE(self), i, j; i = 0; @@ -2088,7 +2017,8 @@ bytes_translate_impl(PyBytesObject *self, PyObject *table, PyObject *deletechars) /*[clinic end generated code: output=43be3437f1956211 input=0ecdf159f654233c]*/ { - char *input, *output; + const char *input; + char *output; Py_buffer table_view = {NULL, NULL}; Py_buffer del_table_view = {NULL, NULL}; const char *table_chars; @@ -2252,6 +2182,81 @@ bytes_replace_impl(PyBytesObject *self, Py_buffer *old, Py_buffer *new, /** End DALKE **/ +/*[clinic input] +bytes.removeprefix as bytes_removeprefix + + prefix: Py_buffer + / + +Return a bytes object with the given prefix string removed if present. + +If the bytes starts with the prefix string, return bytes[len(prefix):]. +Otherwise, return a copy of the original bytes. +[clinic start generated code]*/ + +static PyObject * +bytes_removeprefix_impl(PyBytesObject *self, Py_buffer *prefix) +/*[clinic end generated code: output=f006865331a06ab6 input=0c93bac817a8502c]*/ +{ + const char *self_start = PyBytes_AS_STRING(self); + Py_ssize_t self_len = PyBytes_GET_SIZE(self); + const char *prefix_start = prefix->buf; + Py_ssize_t prefix_len = prefix->len; + + if (self_len >= prefix_len + && prefix_len > 0 + && memcmp(self_start, prefix_start, prefix_len) == 0) + { + return PyBytes_FromStringAndSize(self_start + prefix_len, + self_len - prefix_len); + } + + if (PyBytes_CheckExact(self)) { + Py_INCREF(self); + return (PyObject *)self; + } + + return PyBytes_FromStringAndSize(self_start, self_len); +} + +/*[clinic input] +bytes.removesuffix as bytes_removesuffix + + suffix: Py_buffer + / + +Return a bytes object with the given suffix string removed if present. + +If the bytes ends with the suffix string and that suffix is not empty, +return bytes[:-len(prefix)]. Otherwise, return a copy of the original +bytes. +[clinic start generated code]*/ + +static PyObject * +bytes_removesuffix_impl(PyBytesObject *self, Py_buffer *suffix) +/*[clinic end generated code: output=d887d308e3242eeb input=9f4e1da8c637bbf1]*/ +{ + const char *self_start = PyBytes_AS_STRING(self); + Py_ssize_t self_len = PyBytes_GET_SIZE(self); + const char *suffix_start = suffix->buf; + Py_ssize_t suffix_len = suffix->len; + + if (self_len >= suffix_len + && suffix_len > 0 + && memcmp(self_start + self_len - suffix_len, + suffix_start, suffix_len) == 0) + { + return PyBytes_FromStringAndSize(self_start, + self_len - suffix_len); + } + + if (PyBytes_CheckExact(self)) { + Py_INCREF(self); + return (PyObject *)self; + } + + return PyBytes_FromStringAndSize(self_start, self_len); +} static PyObject * bytes_startswith(PyBytesObject *self, PyObject *args) @@ -2330,8 +2335,7 @@ bytes_fromhex_impl(PyTypeObject *type, PyObject *string) { PyObject *result = _PyBytes_FromHex(string, 0); if (type != &PyBytes_Type && result != NULL) { - Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type, - result, NULL)); + Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result)); } return result; } @@ -2342,7 +2346,7 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray) char *buf; Py_ssize_t hexlen, invalid_char; unsigned int top, bot; - Py_UCS1 *str, *end; + const Py_UCS1 *str, *end; _PyBytesWriter writer; _PyBytesWriter_Init(&writer); @@ -2354,7 +2358,7 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray) hexlen = PyUnicode_GET_LENGTH(string); if (!PyUnicode_IS_ASCII(string)) { - void *data = PyUnicode_DATA(string); + const void *data = PyUnicode_DATA(string); unsigned int kind = PyUnicode_KIND(string); Py_ssize_t i; @@ -2440,7 +2444,7 @@ static PyObject * bytes_hex_impl(PyBytesObject *self, PyObject *sep, int bytes_per_sep) /*[clinic end generated code: output=1f134da504064139 input=f1238d3455990218]*/ { - char* argbuf = PyBytes_AS_STRING(self); + const char *argbuf = PyBytes_AS_STRING(self); Py_ssize_t arglen = PyBytes_GET_SIZE(self); return _Py_strhex_with_sep(argbuf, arglen, sep, bytes_per_sep); } @@ -2492,6 +2496,8 @@ bytes_methods[] = { BYTES_MAKETRANS_METHODDEF BYTES_PARTITION_METHODDEF BYTES_REPLACE_METHODDEF + BYTES_REMOVEPREFIX_METHODDEF + BYTES_REMOVESUFFIX_METHODDEF {"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, _Py_rfind__doc__}, {"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, _Py_rindex__doc__}, STRINGLIB_RJUST_METHODDEF @@ -2542,7 +2548,6 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *func; Py_ssize_t size; static char *kwlist[] = {"source", "encoding", "errors", 0}; - _Py_IDENTIFIER(__bytes__); if (type != &PyBytes_Type) return bytes_subtype_new(type, args, kwds); @@ -2609,7 +2614,7 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } /* Is it an integer? */ - if (PyIndex_Check(x)) { + if (_PyIndex_Check(x)) { size = PyNumber_AsSsize_t(x, PyExc_OverflowError); if (size == -1 && PyErr_Occurred()) { if (!PyErr_ExceptionMatches(PyExc_TypeError)) @@ -2835,7 +2840,7 @@ PyBytes_FromObject(PyObject *x) PyErr_Format(PyExc_TypeError, "cannot convert '%.200s' object to bytes", - x->ob_type->tp_name); + Py_TYPE(x)->tp_name); return NULL; } @@ -3021,8 +3026,12 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) return (*pv == NULL) ? -1 : 0; } /* XXX UNREF/NEWREF interface should be more symmetrical */ - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif +#ifdef Py_TRACE_REFS _Py_ForgetReference(v); +#endif *pv = (PyObject *) PyObject_REALLOC(v, PyBytesObject_SIZE + newsize); if (*pv == NULL) { @@ -3032,7 +3041,7 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) } _Py_NewReference(*pv); sv = (PyBytesObject *) *pv; - Py_SIZE(sv) = newsize; + Py_SET_SIZE(sv, newsize); sv->ob_sval[newsize] = '\0'; sv->ob_shash = -1; /* invalidate cached hash value */ return 0; @@ -3044,7 +3053,7 @@ error: } void -PyBytes_Fini(void) +_PyBytes_Fini(void) { int i; for (i = 0; i < UCHAR_MAX + 1; i++) @@ -3254,7 +3263,7 @@ _PyBytesWriter_AsString(_PyBytesWriter *writer) Py_LOCAL_INLINE(Py_ssize_t) _PyBytesWriter_GetSize(_PyBytesWriter *writer, char *str) { - char *start = _PyBytesWriter_AsString(writer); + const char *start = _PyBytesWriter_AsString(writer); assert(str != NULL); assert(str >= start); assert(str - start <= writer->allocated); @@ -3265,7 +3274,7 @@ _PyBytesWriter_GetSize(_PyBytesWriter *writer, char *str) Py_LOCAL_INLINE(int) _PyBytesWriter_CheckConsistency(_PyBytesWriter *writer, char *str) { - char *start, *end; + const char *start, *end; if (writer->use_small_buffer) { assert(writer->buffer == NULL); diff --git a/Objects/call.c b/Objects/call.c index c6638985..61426c7e 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -1,64 +1,75 @@ #include "Python.h" +#include "pycore_call.h" +#include "pycore_ceval.h" // _PyEval_EvalFrame() #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tupleobject.h" #include "frameobject.h" -static PyObject * -cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs); +static PyObject *const * +_PyStack_UnpackDict(PyThreadState *tstate, + PyObject *const *args, Py_ssize_t nargs, + PyObject *kwargs, PyObject **p_kwnames); + +static void +_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs, + PyObject *kwnames); static PyObject * -null_error(void) +null_error(PyThreadState *tstate) { - if (!PyErr_Occurred()) - PyErr_SetString(PyExc_SystemError, - "null argument to internal routine"); + if (!_PyErr_Occurred(tstate)) { + _PyErr_SetString(tstate, PyExc_SystemError, + "null argument to internal routine"); + } return NULL; } PyObject* -_Py_CheckFunctionResult(PyObject *callable, PyObject *result, const char *where) +_Py_CheckFunctionResult(PyThreadState *tstate, PyObject *callable, + PyObject *result, const char *where) { - int err_occurred = (PyErr_Occurred() != NULL); - assert((callable != NULL) ^ (where != NULL)); if (result == NULL) { - if (!err_occurred) { + if (!_PyErr_Occurred(tstate)) { if (callable) - PyErr_Format(PyExc_SystemError, - "%R returned NULL without setting an error", - callable); + _PyErr_Format(tstate, PyExc_SystemError, + "%R returned NULL without setting an error", + callable); else - PyErr_Format(PyExc_SystemError, - "%s returned NULL without setting an error", - where); + _PyErr_Format(tstate, PyExc_SystemError, + "%s returned NULL without setting an error", + where); #ifdef Py_DEBUG - /* Ensure that the bug is caught in debug mode */ + /* Ensure that the bug is caught in debug mode. + Py_FatalError() logs the SystemError exception raised above. */ Py_FatalError("a function returned NULL without setting an error"); #endif return NULL; } } else { - if (err_occurred) { + if (_PyErr_Occurred(tstate)) { Py_DECREF(result); if (callable) { - _PyErr_FormatFromCause(PyExc_SystemError, - "%R returned a result with an error set", - callable); + _PyErr_FormatFromCauseTstate( + tstate, PyExc_SystemError, + "%R returned a result with an error set", callable); } else { - _PyErr_FormatFromCause(PyExc_SystemError, - "%s returned a result with an error set", - where); + _PyErr_FormatFromCauseTstate( + tstate, PyExc_SystemError, + "%s returned a result with an error set", where); } #ifdef Py_DEBUG - /* Ensure that the bug is caught in debug mode */ + /* Ensure that the bug is caught in debug mode. + Py_FatalError() logs the SystemError exception raised above. */ Py_FatalError("a function returned a result with an error set"); #endif return NULL; @@ -70,66 +81,87 @@ _Py_CheckFunctionResult(PyObject *callable, PyObject *result, const char *where) /* --- Core PyObject call functions ------------------------------- */ +/* Call a callable Python object without any arguments */ PyObject * -_PyObject_FastCallDict(PyObject *callable, PyObject *const *args, - size_t nargsf, PyObject *kwargs) +PyObject_CallNoArgs(PyObject *func) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyObject_CallNoArgTstate(tstate, func); +} + + +PyObject * +_PyObject_FastCallDictTstate(PyThreadState *tstate, PyObject *callable, + PyObject *const *args, size_t nargsf, + PyObject *kwargs) { - /* _PyObject_FastCallDict() must not be called with an exception set, + assert(callable != NULL); + + /* PyObject_VectorcallDict() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ - assert(!PyErr_Occurred()); - assert(callable != NULL); + assert(!_PyErr_Occurred(tstate)); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); assert(nargs >= 0); assert(nargs == 0 || args != NULL); assert(kwargs == NULL || PyDict_Check(kwargs)); - vectorcallfunc func = _PyVectorcall_Function(callable); + vectorcallfunc func = PyVectorcall_Function(callable); if (func == NULL) { /* Use tp_call instead */ - return _PyObject_MakeTpCall(callable, args, nargs, kwargs); + return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwargs); } PyObject *res; - if (kwargs == NULL) { + if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) { res = func(callable, args, nargsf, NULL); } else { PyObject *kwnames; PyObject *const *newargs; - if (_PyStack_UnpackDict(args, nargs, kwargs, &newargs, &kwnames) < 0) { + newargs = _PyStack_UnpackDict(tstate, + args, nargs, + kwargs, &kwnames); + if (newargs == NULL) { return NULL; } - res = func(callable, newargs, nargs, kwnames); - if (kwnames != NULL) { - Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs; - for (i = 0; i < n; i++) { - Py_DECREF(newargs[i]); - } - PyMem_Free((PyObject **)newargs); - Py_DECREF(kwnames); - } + res = func(callable, newargs, + nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); + _PyStack_UnpackDict_Free(newargs, nargs, kwnames); } - return _Py_CheckFunctionResult(callable, res, NULL); + return _Py_CheckFunctionResult(tstate, callable, res, NULL); +} + + +PyObject * +PyObject_VectorcallDict(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwargs) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyObject_FastCallDictTstate(tstate, callable, args, nargsf, kwargs); } PyObject * -_PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords) +_PyObject_MakeTpCall(PyThreadState *tstate, PyObject *callable, + PyObject *const *args, Py_ssize_t nargs, + PyObject *keywords) { + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords)); + /* Slow path: build a temporary tuple for positional arguments and a * temporary dictionary for keyword arguments (if any) */ ternaryfunc call = Py_TYPE(callable)->tp_call; if (call == NULL) { - PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable", - Py_TYPE(callable)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object is not callable", + Py_TYPE(callable)->tp_name); return NULL; } - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords)); PyObject *argstuple = _PyTuple_FromArray(args, nargs); if (argstuple == NULL) { return NULL; @@ -154,10 +186,10 @@ _PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs } PyObject *result = NULL; - if (Py_EnterRecursiveCall(" while calling a Python object") == 0) + if (_Py_EnterRecursiveCall(tstate, " while calling a Python object") == 0) { result = call(callable, argstuple, kwdict); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); } Py_DECREF(argstuple); @@ -165,53 +197,59 @@ _PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs Py_DECREF(kwdict); } - result = _Py_CheckFunctionResult(callable, result, NULL); - return result; + return _Py_CheckFunctionResult(tstate, callable, result, NULL); } PyObject * PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs) { - /* get vectorcallfunc as in _PyVectorcall_Function, but without - * the _Py_TPFLAGS_HAVE_VECTORCALL check */ + PyThreadState *tstate = _PyThreadState_GET(); + + /* get vectorcallfunc as in PyVectorcall_Function, but without + * the Py_TPFLAGS_HAVE_VECTORCALL check */ Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset; if (offset <= 0) { - PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall", - Py_TYPE(callable)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object does not support vectorcall", + Py_TYPE(callable)->tp_name); return NULL; } vectorcallfunc func = *(vectorcallfunc *)(((char *)callable) + offset); if (func == NULL) { - PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall", - Py_TYPE(callable)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object does not support vectorcall", + Py_TYPE(callable)->tp_name); return NULL; } + Py_ssize_t nargs = PyTuple_GET_SIZE(tuple); + + /* Fast path for no keywords */ + if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) { + return func(callable, _PyTuple_ITEMS(tuple), nargs, NULL); + } + /* Convert arguments & call */ PyObject *const *args; - Py_ssize_t nargs = PyTuple_GET_SIZE(tuple); PyObject *kwnames; - if (_PyStack_UnpackDict(_PyTuple_ITEMS(tuple), nargs, - kwargs, &args, &kwnames) < 0) { + args = _PyStack_UnpackDict(tstate, + _PyTuple_ITEMS(tuple), nargs, + kwargs, &kwnames); + if (args == NULL) { return NULL; } - PyObject *result = func(callable, args, nargs, kwnames); - if (kwnames != NULL) { - Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs; - for (i = 0; i < n; i++) { - Py_DECREF(args[i]); - } - PyMem_Free((PyObject **)args); - Py_DECREF(kwnames); - } + PyObject *result = func(callable, args, + nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); + _PyStack_UnpackDict_Free(args, nargs, kwnames); - return _Py_CheckFunctionResult(callable, result, NULL); + return _Py_CheckFunctionResult(tstate, callable, result, NULL); } PyObject * -PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) +_PyObject_Call(PyThreadState *tstate, PyObject *callable, + PyObject *args, PyObject *kwargs) { ternaryfunc call; PyObject *result; @@ -219,68 +257,76 @@ PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) /* PyObject_Call() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); assert(PyTuple_Check(args)); assert(kwargs == NULL || PyDict_Check(kwargs)); - if (_PyVectorcall_Function(callable) != NULL) { + if (PyVectorcall_Function(callable) != NULL) { return PyVectorcall_Call(callable, args, kwargs); } - else if (PyCFunction_Check(callable)) { - /* This must be a METH_VARARGS function, otherwise we would be - * in the previous case */ - return cfunction_call_varargs(callable, args, kwargs); - } else { - call = callable->ob_type->tp_call; + call = Py_TYPE(callable)->tp_call; if (call == NULL) { - PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable", - callable->ob_type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object is not callable", + Py_TYPE(callable)->tp_name); return NULL; } - if (Py_EnterRecursiveCall(" while calling a Python object")) + if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { return NULL; + } result = (*call)(callable, args, kwargs); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); - return _Py_CheckFunctionResult(callable, result, NULL); + return _Py_CheckFunctionResult(tstate, callable, result, NULL); } } +PyObject * +PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyObject_Call(tstate, callable, args, kwargs); +} + + +PyObject * +PyCFunction_Call(PyObject *callable, PyObject *args, PyObject *kwargs) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyObject_Call(tstate, callable, args, kwargs); +} + /* --- PyFunction call functions ---------------------------------- */ static PyObject* _Py_HOT_FUNCTION -function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs, +function_code_fastcall(PyThreadState *tstate, PyCodeObject *co, + PyObject *const *args, Py_ssize_t nargs, PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = _PyThreadState_GET(); - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - + assert(tstate != NULL); assert(globals != NULL); + /* XXX Perhaps we should create a specialized _PyFrame_New_NoTrack() that doesn't take locals, but does take builtins without sanity checking them. */ - assert(tstate != NULL); - f = _PyFrame_New_NoTrack(tstate, co, globals, NULL); + PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, globals, NULL); if (f == NULL) { return NULL; } - fastlocals = f->f_localsplus; + PyObject **fastlocals = f->f_localsplus; - for (i = 0; i < nargs; i++) { + for (Py_ssize_t i = 0; i < nargs; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } - result = PyEval_EvalFrameEx(f,0); + PyObject *result = _PyEval_EvalFrame(tstate, f, 0); if (Py_REFCNT(f) > 1) { Py_DECREF(f); @@ -295,483 +341,65 @@ function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs } -PyObject * -_PyFunction_FastCallDict(PyObject *func, PyObject *const *args, Py_ssize_t nargs, - PyObject *kwargs) -{ - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *kwdefs, *closure, *name, *qualname; - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd, nk; - PyObject *result; - - assert(func != NULL); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - assert(kwargs == NULL || PyDict_Check(kwargs)); - - if (co->co_kwonlyargcount == 0 && - (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) && - (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) - { - /* Fast paths */ - if (argdefs == NULL && co->co_argcount == nargs) { - return function_code_fastcall(co, args, nargs, globals); - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == PyTuple_GET_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = _PyTuple_ITEMS(argdefs); - return function_code_fastcall(co, args, PyTuple_GET_SIZE(argdefs), - globals); - } - } - - nk = (kwargs != NULL) ? PyDict_GET_SIZE(kwargs) : 0; - if (nk != 0) { - Py_ssize_t pos, i; - - /* bpo-29318, bpo-27840: Caller and callee functions must not share - the dictionary: kwargs must be copied. */ - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - return NULL; - } - - k = _PyTuple_ITEMS(kwtuple); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - /* We must hold strong references because keyword arguments can be - indirectly modified while the function is called: - see issue #2016 and test_extcall */ - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - assert(i / 2 == nk); - } - else { - kwtuple = NULL; - k = NULL; - } - - kwdefs = PyFunction_GET_KW_DEFAULTS(func); - closure = PyFunction_GET_CLOSURE(func); - name = ((PyFunctionObject *)func) -> func_name; - qualname = ((PyFunctionObject *)func) -> func_qualname; - - if (argdefs != NULL) { - d = _PyTuple_ITEMS(argdefs); - nd = PyTuple_GET_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } - - result = _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL, - args, nargs, - k, k != NULL ? k + 1 : NULL, nk, 2, - d, nd, kwdefs, - closure, name, qualname); - Py_XDECREF(kwtuple); - return result; -} - - PyObject * _PyFunction_Vectorcall(PyObject *func, PyObject* const* stack, size_t nargsf, PyObject *kwnames) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *kwdefs, *closure, *name, *qualname; - PyObject **d; - Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); - Py_ssize_t nd; - assert(PyFunction_Check(func)); + assert(kwnames == NULL || PyTuple_CheckExact(kwnames)); + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); assert(nargs >= 0); - assert(kwnames == NULL || PyTuple_CheckExact(kwnames)); + Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); assert((nargs == 0 && nkwargs == 0) || stack != NULL); - /* kwnames must only contains str strings, no subclass, and all keys must - be unique */ + /* kwnames must only contain strings and all keys must be unique */ + + PyThreadState *tstate = _PyThreadState_GET(); + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); if (co->co_kwonlyargcount == 0 && nkwargs == 0 && (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { - return function_code_fastcall(co, stack, nargs, globals); + return function_code_fastcall(tstate, co, stack, nargs, globals); } else if (nargs == 0 && argdefs != NULL && co->co_argcount == PyTuple_GET_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ stack = _PyTuple_ITEMS(argdefs); - return function_code_fastcall(co, stack, PyTuple_GET_SIZE(argdefs), + return function_code_fastcall(tstate, co, + stack, PyTuple_GET_SIZE(argdefs), globals); } } - kwdefs = PyFunction_GET_KW_DEFAULTS(func); - closure = PyFunction_GET_CLOSURE(func); - name = ((PyFunctionObject *)func) -> func_name; - qualname = ((PyFunctionObject *)func) -> func_qualname; + PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func); + PyObject *closure = PyFunction_GET_CLOSURE(func); + PyObject *name = ((PyFunctionObject *)func) -> func_name; + PyObject *qualname = ((PyFunctionObject *)func) -> func_qualname; + PyObject **d; + Py_ssize_t nd; if (argdefs != NULL) { d = _PyTuple_ITEMS(argdefs); nd = PyTuple_GET_SIZE(argdefs); + assert(nd <= INT_MAX); } else { d = NULL; nd = 0; } - return _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL, - stack, nargs, - nkwargs ? _PyTuple_ITEMS(kwnames) : NULL, - stack + nargs, - nkwargs, 1, - d, (int)nd, kwdefs, - closure, name, qualname); -} - - -/* --- PyCFunction call functions --------------------------------- */ - -PyObject * -_PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self, - PyObject *const *args, Py_ssize_t nargs, - PyObject *kwargs) -{ - /* _PyMethodDef_RawFastCallDict() must not be called with an exception set, - because it can clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - - assert(method != NULL); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - assert(kwargs == NULL || PyDict_Check(kwargs)); - - PyCFunction meth = method->ml_meth; - int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST); - PyObject *result = NULL; - - if (Py_EnterRecursiveCall(" while calling a Python object")) { - return NULL; - } - - switch (flags) - { - case METH_NOARGS: - if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { - goto no_keyword_error; - } - - if (nargs != 0) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%zd given)", - method->ml_name, nargs); - goto exit; - } - - result = (*meth) (self, NULL); - break; - - case METH_O: - if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { - goto no_keyword_error; - } - - if (nargs != 1) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%zd given)", - method->ml_name, nargs); - goto exit; - } - - result = (*meth) (self, args[0]); - break; - - case METH_VARARGS: - if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { - goto no_keyword_error; - } - /* fall through */ - - case METH_VARARGS | METH_KEYWORDS: - { - /* Slow-path: create a temporary tuple for positional arguments */ - PyObject *argstuple = _PyTuple_FromArray(args, nargs); - if (argstuple == NULL) { - goto exit; - } - - if (flags & METH_KEYWORDS) { - result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argstuple, kwargs); - } - else { - result = (*meth) (self, argstuple); - } - Py_DECREF(argstuple); - break; - } - - case METH_FASTCALL: - { - if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { - goto no_keyword_error; - } - - result = (*(_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs); - break; - } - - case METH_FASTCALL | METH_KEYWORDS: - { - PyObject *const *stack; - PyObject *kwnames; - _PyCFunctionFastWithKeywords fastmeth = (_PyCFunctionFastWithKeywords)(void(*)(void))meth; - - if (_PyStack_UnpackDict(args, nargs, kwargs, &stack, &kwnames) < 0) { - goto exit; - } - - result = (*fastmeth) (self, stack, nargs, kwnames); - if (kwnames != NULL) { - Py_ssize_t i, n = nargs + PyTuple_GET_SIZE(kwnames); - for (i = 0; i < n; i++) { - Py_DECREF(stack[i]); - } - PyMem_Free((PyObject **)stack); - Py_DECREF(kwnames); - } - break; - } - - default: - PyErr_SetString(PyExc_SystemError, - "Bad call flags in _PyMethodDef_RawFastCallDict. " - "METH_OLDARGS is no longer supported!"); - goto exit; - } - - goto exit; - -no_keyword_error: - PyErr_Format(PyExc_TypeError, - "%.200s() takes no keyword arguments", - method->ml_name); - -exit: - Py_LeaveRecursiveCall(); - return result; -} - - -PyObject * -_PyCFunction_FastCallDict(PyObject *func, - PyObject *const *args, Py_ssize_t nargs, - PyObject *kwargs) -{ - PyObject *result; - - assert(func != NULL); - assert(PyCFunction_Check(func)); - - result = _PyMethodDef_RawFastCallDict(((PyCFunctionObject*)func)->m_ml, - PyCFunction_GET_SELF(func), - args, nargs, kwargs); - result = _Py_CheckFunctionResult(func, result, NULL); - return result; -} - - -PyObject * -_PyMethodDef_RawFastCallKeywords(PyMethodDef *method, PyObject *self, - PyObject *const *args, Py_ssize_t nargs, - PyObject *kwnames) -{ - /* _PyMethodDef_RawFastCallKeywords() must not be called with an exception set, - because it can clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - - assert(method != NULL); - assert(nargs >= 0); - assert(kwnames == NULL || PyTuple_CheckExact(kwnames)); - /* kwnames must only contains str strings, no subclass, and all keys must - be unique */ - - PyCFunction meth = method->ml_meth; - int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST); - Py_ssize_t nkwargs = kwnames == NULL ? 0 : PyTuple_GET_SIZE(kwnames); - PyObject *result = NULL; - - if (Py_EnterRecursiveCall(" while calling a Python object")) { - return NULL; - } - - switch (flags) - { - case METH_NOARGS: - if (nkwargs) { - goto no_keyword_error; - } - - if (nargs != 0) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%zd given)", - method->ml_name, nargs); - goto exit; - } - - result = (*meth) (self, NULL); - break; - - case METH_O: - if (nkwargs) { - goto no_keyword_error; - } - - if (nargs != 1) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%zd given)", - method->ml_name, nargs); - goto exit; - } - - result = (*meth) (self, args[0]); - break; - - case METH_FASTCALL: - if (nkwargs) { - goto no_keyword_error; - } - result = ((_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs); - break; - - case METH_FASTCALL | METH_KEYWORDS: - /* Fast-path: avoid temporary dict to pass keyword arguments */ - result = ((_PyCFunctionFastWithKeywords)(void(*)(void))meth) (self, args, nargs, kwnames); - break; - - case METH_VARARGS: - if (nkwargs) { - goto no_keyword_error; - } - /* fall through */ - - case METH_VARARGS | METH_KEYWORDS: - { - /* Slow-path: create a temporary tuple for positional arguments - and a temporary dict for keyword arguments */ - PyObject *argtuple; - - argtuple = _PyTuple_FromArray(args, nargs); - if (argtuple == NULL) { - goto exit; - } - - if (flags & METH_KEYWORDS) { - PyObject *kwdict; - - if (nkwargs > 0) { - kwdict = _PyStack_AsDict(args + nargs, kwnames); - if (kwdict == NULL) { - Py_DECREF(argtuple); - goto exit; - } - } - else { - kwdict = NULL; - } - - result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argtuple, kwdict); - Py_XDECREF(kwdict); - } - else { - result = (*meth) (self, argtuple); - } - Py_DECREF(argtuple); - break; - } - - default: - PyErr_SetString(PyExc_SystemError, - "Bad call flags in _PyMethodDef_RawFastCallKeywords. " - "METH_OLDARGS is no longer supported!"); - goto exit; - } - - goto exit; - -no_keyword_error: - PyErr_Format(PyExc_TypeError, - "%.200s() takes no keyword arguments", - method->ml_name); - -exit: - Py_LeaveRecursiveCall(); - return result; -} - - -static PyObject * -cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs) -{ - assert(!PyErr_Occurred()); - assert(kwargs == NULL || PyDict_Check(kwargs)); - - PyCFunction meth = PyCFunction_GET_FUNCTION(func); - PyObject *self = PyCFunction_GET_SELF(func); - PyObject *result; - - assert(PyCFunction_GET_FLAGS(func) & METH_VARARGS); - if (PyCFunction_GET_FLAGS(func) & METH_KEYWORDS) { - if (Py_EnterRecursiveCall(" while calling a Python object")) { - return NULL; - } - - result = (*(PyCFunctionWithKeywords)(void(*)(void))meth)(self, args, kwargs); - - Py_LeaveRecursiveCall(); - } - else { - if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { - PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", - ((PyCFunctionObject*)func)->m_ml->ml_name); - return NULL; - } - - if (Py_EnterRecursiveCall(" while calling a Python object")) { - return NULL; - } - - result = (*meth)(self, args); - - Py_LeaveRecursiveCall(); - } - - return _Py_CheckFunctionResult(func, result, NULL); -} - - -PyObject * -PyCFunction_Call(PyObject *func, PyObject *args, PyObject *kwargs) -{ - /* For METH_VARARGS, we cannot use vectorcall as the vectorcall pointer - * is NULL. This is intentional, since vectorcall would be slower. */ - if (PyCFunction_GET_FLAGS(func) & METH_VARARGS) { - return cfunction_call_varargs(func, args, kwargs); - } - return PyVectorcall_Call(func, args, kwargs); + return _PyEval_EvalCode(tstate, + (PyObject*)co, globals, (PyObject *)NULL, + stack, nargs, + nkwargs ? _PyTuple_ITEMS(kwnames) : NULL, + stack + nargs, + nkwargs, 1, + d, (int)nd, kwdefs, + closure, name, qualname); } @@ -783,30 +411,31 @@ PyObject * PyEval_CallObjectWithKeywords(PyObject *callable, PyObject *args, PyObject *kwargs) { + PyThreadState *tstate = _PyThreadState_GET(); #ifdef Py_DEBUG /* PyEval_CallObjectWithKeywords() must not be called with an exception set. It raises a new exception if parameters are invalid or if PyTuple_New() fails, and so the original exception is lost. */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); #endif if (args != NULL && !PyTuple_Check(args)) { - PyErr_SetString(PyExc_TypeError, - "argument list must be a tuple"); + _PyErr_SetString(tstate, PyExc_TypeError, + "argument list must be a tuple"); return NULL; } if (kwargs != NULL && !PyDict_Check(kwargs)) { - PyErr_SetString(PyExc_TypeError, - "keyword list must be a dictionary"); + _PyErr_SetString(tstate, PyExc_TypeError, + "keyword list must be a dictionary"); return NULL; } if (args == NULL) { - return _PyObject_FastCallDict(callable, NULL, 0, kwargs); + return _PyObject_FastCallDictTstate(tstate, callable, NULL, 0, kwargs); } else { - return PyObject_Call(callable, args, kwargs); + return _PyObject_Call(tstate, callable, args, kwargs); } } @@ -814,59 +443,31 @@ PyEval_CallObjectWithKeywords(PyObject *callable, PyObject * PyObject_CallObject(PyObject *callable, PyObject *args) { - return PyEval_CallObjectWithKeywords(callable, args, NULL); -} - - -/* Positional arguments are obj followed by args: - call callable(obj, *args, **kwargs) */ -PyObject * -_PyObject_FastCall_Prepend(PyObject *callable, PyObject *obj, - PyObject *const *args, Py_ssize_t nargs) -{ - PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; - PyObject **args2; - PyObject *result; - - nargs++; - if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { - args2 = small_stack; - } - else { - args2 = PyMem_Malloc(nargs * sizeof(PyObject *)); - if (args2 == NULL) { - PyErr_NoMemory(); - return NULL; - } - } - - /* use borrowed references */ - args2[0] = obj; - if (nargs > 1) { - memcpy(&args2[1], args, (nargs - 1) * sizeof(PyObject *)); + PyThreadState *tstate = _PyThreadState_GET(); + assert(!_PyErr_Occurred(tstate)); + if (args == NULL) { + return _PyObject_CallNoArgTstate(tstate, callable); } - - result = _PyObject_FastCall(callable, args2, nargs); - if (args2 != small_stack) { - PyMem_Free(args2); + if (!PyTuple_Check(args)) { + _PyErr_SetString(tstate, PyExc_TypeError, + "argument list must be a tuple"); + return NULL; } - return result; + return _PyObject_Call(tstate, callable, args, NULL); } /* Call callable(obj, *args, **kwargs). */ PyObject * -_PyObject_Call_Prepend(PyObject *callable, +_PyObject_Call_Prepend(PyThreadState *tstate, PyObject *callable, PyObject *obj, PyObject *args, PyObject *kwargs) { + assert(PyTuple_Check(args)); + PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; PyObject **stack; - Py_ssize_t argcount; - PyObject *result; - assert(PyTuple_Check(args)); - - argcount = PyTuple_GET_SIZE(args); + Py_ssize_t argcount = PyTuple_GET_SIZE(args); if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { stack = small_stack; } @@ -884,9 +485,9 @@ _PyObject_Call_Prepend(PyObject *callable, _PyTuple_ITEMS(args), argcount * sizeof(PyObject *)); - result = _PyObject_FastCallDict(callable, - stack, argcount + 1, - kwargs); + PyObject *result = _PyObject_FastCallDictTstate(tstate, callable, + stack, argcount + 1, + kwargs); if (stack != small_stack) { PyMem_Free(stack); } @@ -897,8 +498,8 @@ _PyObject_Call_Prepend(PyObject *callable, /* --- Call with a format string ---------------------------------- */ static PyObject * -_PyObject_CallFunctionVa(PyObject *callable, const char *format, - va_list va, int is_size_t) +_PyObject_CallFunctionVa(PyThreadState *tstate, PyObject *callable, + const char *format, va_list va, int is_size_t) { PyObject* small_stack[_PY_FASTCALL_SMALL_STACK]; const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack); @@ -907,11 +508,11 @@ _PyObject_CallFunctionVa(PyObject *callable, const char *format, PyObject *result; if (callable == NULL) { - return null_error(); + return null_error(tstate); } if (!format || !*format) { - return _PyObject_CallNoArg(callable); + return _PyObject_CallNoArgTstate(tstate, callable); } if (is_size_t) { @@ -932,12 +533,14 @@ _PyObject_CallFunctionVa(PyObject *callable, const char *format, - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */ PyObject *args = stack[0]; - result = _PyObject_FastCall(callable, - _PyTuple_ITEMS(args), - PyTuple_GET_SIZE(args)); + result = _PyObject_VectorcallTstate(tstate, callable, + _PyTuple_ITEMS(args), + PyTuple_GET_SIZE(args), + NULL); } else { - result = _PyObject_FastCall(callable, stack, nargs); + result = _PyObject_VectorcallTstate(tstate, callable, + stack, nargs, NULL); } for (i = 0; i < nargs; ++i) { @@ -955,9 +558,10 @@ PyObject_CallFunction(PyObject *callable, const char *format, ...) { va_list va; PyObject *result; + PyThreadState *tstate = _PyThreadState_GET(); va_start(va, format); - result = _PyObject_CallFunctionVa(callable, format, va, 0); + result = _PyObject_CallFunctionVa(tstate, callable, format, va, 0); va_end(va); return result; @@ -972,9 +576,10 @@ PyEval_CallFunction(PyObject *callable, const char *format, ...) { va_list va; PyObject *result; + PyThreadState *tstate = _PyThreadState_GET(); va_start(va, format); - result = _PyObject_CallFunctionVa(callable, format, va, 0); + result = _PyObject_CallFunctionVa(tstate, callable, format, va, 0); va_end(va); return result; @@ -984,11 +589,11 @@ PyEval_CallFunction(PyObject *callable, const char *format, ...) PyObject * _PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...) { - va_list va; - PyObject *result; + PyThreadState *tstate = _PyThreadState_GET(); + va_list va; va_start(va, format); - result = _PyObject_CallFunctionVa(callable, format, va, 1); + PyObject *result = _PyObject_CallFunctionVa(tstate, callable, format, va, 1); va_end(va); return result; @@ -996,37 +601,37 @@ _PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...) static PyObject* -callmethod(PyObject* callable, const char *format, va_list va, int is_size_t) +callmethod(PyThreadState *tstate, PyObject* callable, const char *format, va_list va, int is_size_t) { assert(callable != NULL); - if (!PyCallable_Check(callable)) { - PyErr_Format(PyExc_TypeError, - "attribute of type '%.200s' is not callable", - Py_TYPE(callable)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "attribute of type '%.200s' is not callable", + Py_TYPE(callable)->tp_name); return NULL; } - return _PyObject_CallFunctionVa(callable, format, va, is_size_t); + return _PyObject_CallFunctionVa(tstate, callable, format, va, is_size_t); } PyObject * PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...) { - va_list va; - PyObject *callable, *retval; + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } - callable = PyObject_GetAttrString(obj, name); - if (callable == NULL) + PyObject *callable = PyObject_GetAttrString(obj, name); + if (callable == NULL) { return NULL; + } + va_list va; va_start(va, format); - retval = callmethod(callable, format, va, 0); + PyObject *retval = callmethod(tstate, callable, format, va, 0); va_end(va); Py_DECREF(callable); @@ -1040,19 +645,19 @@ PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...) PyObject * PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...) { - va_list va; - PyObject *callable, *retval; - + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } - callable = PyObject_GetAttrString(obj, name); - if (callable == NULL) + PyObject *callable = PyObject_GetAttrString(obj, name); + if (callable == NULL) { return NULL; + } + va_list va; va_start(va, format); - retval = callmethod(callable, format, va, 0); + PyObject *retval = callmethod(tstate, callable, format, va, 0); va_end(va); Py_DECREF(callable); @@ -1064,19 +669,19 @@ PyObject * _PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name, const char *format, ...) { - va_list va; - PyObject *callable, *retval; - + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } - callable = _PyObject_GetAttrId(obj, name); - if (callable == NULL) + PyObject *callable = _PyObject_GetAttrId(obj, name); + if (callable == NULL) { return NULL; + } + va_list va; va_start(va, format); - retval = callmethod(callable, format, va, 0); + PyObject *retval = callmethod(tstate, callable, format, va, 0); va_end(va); Py_DECREF(callable); @@ -1088,19 +693,19 @@ PyObject * _PyObject_CallMethod_SizeT(PyObject *obj, const char *name, const char *format, ...) { - va_list va; - PyObject *callable, *retval; - + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } - callable = PyObject_GetAttrString(obj, name); - if (callable == NULL) + PyObject *callable = PyObject_GetAttrString(obj, name); + if (callable == NULL) { return NULL; + } + va_list va; va_start(va, format); - retval = callmethod(callable, format, va, 1); + PyObject *retval = callmethod(tstate, callable, format, va, 1); va_end(va); Py_DECREF(callable); @@ -1112,20 +717,19 @@ PyObject * _PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name, const char *format, ...) { - va_list va; - PyObject *callable, *retval; - + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } - callable = _PyObject_GetAttrId(obj, name); + PyObject *callable = _PyObject_GetAttrId(obj, name); if (callable == NULL) { return NULL; } + va_list va; va_start(va, format); - retval = callmethod(callable, format, va, 1); + PyObject *retval = callmethod(tstate, callable, format, va, 1); va_end(va); Py_DECREF(callable); @@ -1136,7 +740,8 @@ _PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name, /* --- Call with "..." arguments ---------------------------------- */ static PyObject * -object_vacall(PyObject *base, PyObject *callable, va_list vargs) +object_vacall(PyThreadState *tstate, PyObject *base, + PyObject *callable, va_list vargs) { PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; PyObject **stack; @@ -1146,7 +751,7 @@ object_vacall(PyObject *base, PyObject *callable, va_list vargs) va_list countva; if (callable == NULL) { - return null_error(); + return null_error(tstate); } /* Count the number of arguments */ @@ -1183,7 +788,7 @@ object_vacall(PyObject *base, PyObject *callable, va_list vargs) } /* Call the function */ - result = _PyObject_FastCall(callable, stack, nargs); + result = _PyObject_VectorcallTstate(tstate, callable, stack, nargs, NULL); if (stack != small_stack) { PyMem_Free(stack); @@ -1192,14 +797,46 @@ object_vacall(PyObject *base, PyObject *callable, va_list vargs) } -/* Private API for the LOAD_METHOD opcode. */ -extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **); +PyObject * +PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + assert(name != NULL); + assert(args != NULL); + assert(PyVectorcall_NARGS(nargsf) >= 1); + + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *callable = NULL; + /* Use args[0] as "self" argument */ + int unbound = _PyObject_GetMethod(args[0], name, &callable); + if (callable == NULL) { + return NULL; + } + + if (unbound) { + /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since + * that would be interpreted as allowing to change args[-1] */ + nargsf &= ~PY_VECTORCALL_ARGUMENTS_OFFSET; + } + else { + /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since + * args[-1] in the onward call is args[0] here. */ + args++; + nargsf--; + } + PyObject *result = _PyObject_VectorcallTstate(tstate, callable, + args, nargsf, kwnames); + Py_DECREF(callable); + return result; +} + PyObject * PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...) { + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } PyObject *callable = NULL; @@ -1211,7 +848,7 @@ PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...) va_list vargs; va_start(vargs, name); - PyObject *result = object_vacall(obj, callable, vargs); + PyObject *result = object_vacall(tstate, obj, callable, vargs); va_end(vargs); Py_DECREF(callable); @@ -1223,8 +860,9 @@ PyObject * _PyObject_CallMethodIdObjArgs(PyObject *obj, struct _Py_Identifier *name, ...) { + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ @@ -1241,7 +879,7 @@ _PyObject_CallMethodIdObjArgs(PyObject *obj, va_list vargs; va_start(vargs, name); - PyObject *result = object_vacall(obj, callable, vargs); + PyObject *result = object_vacall(tstate, obj, callable, vargs); va_end(vargs); Py_DECREF(callable); @@ -1252,11 +890,12 @@ _PyObject_CallMethodIdObjArgs(PyObject *obj, PyObject * PyObject_CallFunctionObjArgs(PyObject *callable, ...) { + PyThreadState *tstate = _PyThreadState_GET(); va_list vargs; PyObject *result; va_start(vargs, callable); - result = object_vacall(NULL, callable, vargs); + result = object_vacall(tstate, NULL, callable, vargs); va_end(vargs); return result; @@ -1292,54 +931,67 @@ _PyStack_AsDict(PyObject *const *values, PyObject *kwnames) } -int -_PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs, - PyObject *const **p_stack, PyObject **p_kwnames) -{ - PyObject **stack, **kwstack; - Py_ssize_t nkwargs; - Py_ssize_t pos, i; - PyObject *key, *value; - PyObject *kwnames; +/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple). - assert(nargs >= 0); - assert(kwargs == NULL || PyDict_CheckExact(kwargs)); + Allocate a new argument vector and keyword names tuple. Return the argument + vector; return NULL with exception set on error. Return the keyword names + tuple in *p_kwnames. - if (kwargs == NULL || (nkwargs = PyDict_GET_SIZE(kwargs)) == 0) { - *p_stack = args; - *p_kwnames = NULL; - return 0; - } + This also checks that all keyword names are strings. If not, a TypeError is + raised. + + The newly allocated argument vector supports PY_VECTORCALL_ARGUMENTS_OFFSET. - if ((size_t)nargs > PY_SSIZE_T_MAX / sizeof(stack[0]) - (size_t)nkwargs) { - PyErr_NoMemory(); - return -1; + When done, you must call _PyStack_UnpackDict_Free(stack, nargs, kwnames) */ +static PyObject *const * +_PyStack_UnpackDict(PyThreadState *tstate, + PyObject *const *args, Py_ssize_t nargs, + PyObject *kwargs, PyObject **p_kwnames) +{ + assert(nargs >= 0); + assert(kwargs != NULL); + assert(PyDict_Check(kwargs)); + + Py_ssize_t nkwargs = PyDict_GET_SIZE(kwargs); + /* Check for overflow in the PyMem_Malloc() call below. The subtraction + * in this check cannot overflow: both maxnargs and nkwargs are + * non-negative signed integers, so their difference fits in the type. */ + Py_ssize_t maxnargs = PY_SSIZE_T_MAX / sizeof(args[0]) - 1; + if (nargs > maxnargs - nkwargs) { + _PyErr_NoMemory(tstate); + return NULL; } - stack = PyMem_Malloc((nargs + nkwargs) * sizeof(stack[0])); + /* Add 1 to support PY_VECTORCALL_ARGUMENTS_OFFSET */ + PyObject **stack = PyMem_Malloc((1 + nargs + nkwargs) * sizeof(args[0])); if (stack == NULL) { - PyErr_NoMemory(); - return -1; + _PyErr_NoMemory(tstate); + return NULL; } - kwnames = PyTuple_New(nkwargs); + PyObject *kwnames = PyTuple_New(nkwargs); if (kwnames == NULL) { PyMem_Free(stack); - return -1; + return NULL; } + stack++; /* For PY_VECTORCALL_ARGUMENTS_OFFSET */ + /* Copy positional arguments */ - for (i = 0; i < nargs; i++) { + for (Py_ssize_t i = 0; i < nargs; i++) { Py_INCREF(args[i]); stack[i] = args[i]; } - kwstack = stack + nargs; - pos = i = 0; + PyObject **kwstack = stack + nargs; /* This loop doesn't support lookup function mutating the dictionary to change its size. It's a deliberate choice for speed, this function is called in the performance critical hot code. */ + Py_ssize_t pos = 0, i = 0; + PyObject *key, *value; + unsigned long keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; while (PyDict_Next(kwargs, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; Py_INCREF(key); Py_INCREF(value); PyTuple_SET_ITEM(kwnames, i, key); @@ -1347,7 +999,30 @@ _PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs, i++; } - *p_stack = stack; + /* keys_are_strings has the value Py_TPFLAGS_UNICODE_SUBCLASS if that + * flag is set for all keys. Otherwise, keys_are_strings equals 0. + * We do this check once at the end instead of inside the loop above + * because it simplifies the deallocation in the failing case. + * It happens to also make the loop above slightly more efficient. */ + if (!keys_are_strings) { + _PyErr_SetString(tstate, PyExc_TypeError, + "keywords must be strings"); + _PyStack_UnpackDict_Free(stack, nargs, kwnames); + return NULL; + } + *p_kwnames = kwnames; - return 0; + return stack; +} + +static void +_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs, + PyObject *kwnames) +{ + Py_ssize_t n = PyTuple_GET_SIZE(kwnames) + nargs; + for (Py_ssize_t i = 0; i < n; i++) { + Py_DECREF(stack[i]); + } + PyMem_Free((PyObject **)stack - 1); + Py_DECREF(kwnames); } diff --git a/Objects/capsule.c b/Objects/capsule.c index 599893a3..ed24cc1d 100644 --- a/Objects/capsule.c +++ b/Objects/capsule.c @@ -50,7 +50,7 @@ PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor) return NULL; } - capsule = PyObject_NEW(PyCapsule, &PyCapsule_Type); + capsule = PyObject_New(PyCapsule, &PyCapsule_Type); if (capsule == NULL) { return NULL; } diff --git a/Objects/cellobject.c b/Objects/cellobject.c index 911cf527..86a89f02 100644 --- a/Objects/cellobject.c +++ b/Objects/cellobject.c @@ -2,8 +2,6 @@ #include "Python.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" PyObject * PyCell_New(PyObject *obj) @@ -112,7 +110,7 @@ cell_repr(PyCellObject *op) return PyUnicode_FromFormat("", op); return PyUnicode_FromFormat("", - op, op->ob_ref->ob_type->tp_name, + op, Py_TYPE(op->ob_ref)->tp_name, op->ob_ref); } diff --git a/Objects/classobject.c b/Objects/classobject.c index 12bb836c..fd9f8757 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -2,21 +2,12 @@ #include "Python.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "structmember.h" // PyMemberDef #define TP_DESCR_GET(t) ((t)->tp_descr_get) -/* Free list for method objects to safe malloc/free overhead - * The im_self element is used to chain the elements. - */ -static PyMethodObject *free_list; -static int numfree = 0; -#ifndef PyMethod_MAXFREELIST -#define PyMethod_MAXFREELIST 256 -#endif - _Py_IDENTIFIER(__name__); _Py_IDENTIFIER(__qualname__); @@ -45,26 +36,29 @@ static PyObject * method_vectorcall(PyObject *method, PyObject *const *args, size_t nargsf, PyObject *kwnames) { - assert(Py_TYPE(method) == &PyMethod_Type); - PyObject *self, *func, *result; - self = PyMethod_GET_SELF(method); - func = PyMethod_GET_FUNCTION(method); + assert(Py_IS_TYPE(method, &PyMethod_Type)); + + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *self = PyMethod_GET_SELF(method); + PyObject *func = PyMethod_GET_FUNCTION(method); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + PyObject *result; if (nargsf & PY_VECTORCALL_ARGUMENTS_OFFSET) { /* PY_VECTORCALL_ARGUMENTS_OFFSET is set, so we are allowed to mutate the vector */ PyObject **newargs = (PyObject**)args - 1; nargs += 1; PyObject *tmp = newargs[0]; newargs[0] = self; - result = _PyObject_Vectorcall(func, newargs, nargs, kwnames); + result = _PyObject_VectorcallTstate(tstate, func, newargs, + nargs, kwnames); newargs[0] = tmp; } else { Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); Py_ssize_t totalargs = nargs + nkwargs; if (totalargs == 0) { - return _PyObject_Vectorcall(func, &self, 1, NULL); + return _PyObject_VectorcallTstate(tstate, func, &self, 1, NULL); } PyObject *newargs_stack[_PY_FASTCALL_SMALL_STACK]; @@ -75,7 +69,7 @@ method_vectorcall(PyObject *method, PyObject *const *args, else { newargs = PyMem_Malloc((totalargs+1) * sizeof(PyObject *)); if (newargs == NULL) { - PyErr_NoMemory(); + _PyErr_NoMemory(tstate); return NULL; } } @@ -86,7 +80,8 @@ method_vectorcall(PyObject *method, PyObject *const *args, * undefined behaviour. */ assert(args != NULL); memcpy(newargs + 1, args, totalargs * sizeof(PyObject *)); - result = _PyObject_Vectorcall(func, newargs, nargs+1, kwnames); + result = _PyObject_VectorcallTstate(tstate, func, + newargs, nargs+1, kwnames); if (newargs != newargs_stack) { PyMem_Free(newargs); } @@ -103,26 +98,18 @@ method_vectorcall(PyObject *method, PyObject *const *args, PyObject * PyMethod_New(PyObject *func, PyObject *self) { - PyMethodObject *im; if (self == NULL) { PyErr_BadInternalCall(); return NULL; } - im = free_list; - if (im != NULL) { - free_list = (PyMethodObject *)(im->im_self); - (void)PyObject_INIT(im, &PyMethod_Type); - numfree--; - } - else { - im = PyObject_GC_New(PyMethodObject, &PyMethod_Type); - if (im == NULL) - return NULL; + PyMethodObject *im = PyObject_GC_New(PyMethodObject, &PyMethod_Type); + if (im == NULL) { + return NULL; } im->im_weakreflist = NULL; Py_INCREF(func); im->im_func = func; - Py_XINCREF(self); + Py_INCREF(self); im->im_self = self; im->vectorcall = method_vectorcall; _PyObject_GC_TRACK(im); @@ -157,9 +144,9 @@ static PyMethodDef method_methods[] = { #define MO_OFF(x) offsetof(PyMethodObject, x) static PyMemberDef method_memberlist[] = { - {"__func__", T_OBJECT, MO_OFF(im_func), READONLY|RESTRICTED, + {"__func__", T_OBJECT, MO_OFF(im_func), READONLY, "the function (or other callable) implementing a method"}, - {"__self__", T_OBJECT, MO_OFF(im_self), READONLY|RESTRICTED, + {"__self__", T_OBJECT, MO_OFF(im_self), READONLY, "the instance to which a method is bound"}, {NULL} /* Sentinel */ }; @@ -190,7 +177,7 @@ static PyObject * method_getattro(PyObject *obj, PyObject *name) { PyMethodObject *im = (PyMethodObject *)obj; - PyTypeObject *tp = obj->ob_type; + PyTypeObject *tp = Py_TYPE(obj); PyObject *descr = NULL; { @@ -202,9 +189,9 @@ method_getattro(PyObject *obj, PyObject *name) } if (descr != NULL) { - descrgetfunc f = TP_DESCR_GET(descr->ob_type); + descrgetfunc f = TP_DESCR_GET(Py_TYPE(descr)); if (f != NULL) - return f(descr, obj, (PyObject *)obj->ob_type); + return f(descr, obj, (PyObject *)Py_TYPE(obj)); else { Py_INCREF(descr); return descr; @@ -252,14 +239,7 @@ method_dealloc(PyMethodObject *im) PyObject_ClearWeakRefs((PyObject *)im); Py_DECREF(im->im_func); Py_XDECREF(im->im_self); - if (numfree < PyMethod_MAXFREELIST) { - im->im_self = (PyObject *)free_list; - free_list = im; - numfree++; - } - else { - PyObject_GC_Del(im); - } + PyObject_GC_Del(im); } static PyObject * @@ -341,17 +321,6 @@ method_traverse(PyMethodObject *im, visitproc visit, void *arg) return 0; } -static PyObject * -method_call(PyObject *method, PyObject *args, PyObject *kwargs) -{ - PyObject *self, *func; - - self = PyMethod_GET_SELF(method); - func = PyMethod_GET_FUNCTION(method); - - return _PyObject_Call_Prepend(func, self, args, kwargs); -} - static PyObject * method_descr_get(PyObject *meth, PyObject *obj, PyObject *cls) { @@ -374,13 +343,13 @@ PyTypeObject PyMethod_Type = { 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)method_hash, /* tp_hash */ - method_call, /* tp_call */ + PyVectorcall_Call, /* tp_call */ 0, /* tp_str */ method_getattro, /* tp_getattro */ PyObject_GenericSetAttr, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ method_doc, /* tp_doc */ (traverseproc)method_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -401,38 +370,6 @@ PyTypeObject PyMethod_Type = { method_new, /* tp_new */ }; -/* Clear out the free list */ - -int -PyMethod_ClearFreeList(void) -{ - int freelist_size = numfree; - - while (free_list) { - PyMethodObject *im = free_list; - free_list = (PyMethodObject *)(im->im_self); - PyObject_GC_Del(im); - numfree--; - } - assert(numfree == 0); - return freelist_size; -} - -void -PyMethod_Fini(void) -{ - (void)PyMethod_ClearFreeList(); -} - -/* Print summary info about the state of the optimized allocator */ -void -_PyMethod_DebugMallocStats(FILE *out) -{ - _PyDebugAllocatorStats(out, - "free PyMethodObject", - numfree, sizeof(PyMethodObject)); -} - /* ------------------------------------------------------------------------ * instance method */ @@ -462,7 +399,7 @@ PyInstanceMethod_Function(PyObject *im) #define IMO_OFF(x) offsetof(PyInstanceMethodObject, x) static PyMemberDef instancemethod_memberlist[] = { - {"__func__", T_OBJECT, IMO_OFF(func), READONLY|RESTRICTED, + {"__func__", T_OBJECT, IMO_OFF(func), READONLY, "the function (or other callable) implementing a method"}, {NULL} /* Sentinel */ }; @@ -487,7 +424,7 @@ static PyGetSetDef instancemethod_getset[] = { static PyObject * instancemethod_getattro(PyObject *self, PyObject *name) { - PyTypeObject *tp = self->ob_type; + PyTypeObject *tp = Py_TYPE(self); PyObject *descr = NULL; if (tp->tp_dict == NULL) { @@ -497,9 +434,9 @@ instancemethod_getattro(PyObject *self, PyObject *name) descr = _PyType_Lookup(tp, name); if (descr != NULL) { - descrgetfunc f = TP_DESCR_GET(descr->ob_type); + descrgetfunc f = TP_DESCR_GET(Py_TYPE(descr)); if (f != NULL) - return f(descr, self, (PyObject *)self->ob_type); + return f(descr, self, (PyObject *)Py_TYPE(self)); else { Py_INCREF(descr); return descr; diff --git a/Objects/clinic/bytearrayobject.c.h b/Objects/clinic/bytearrayobject.c.h index 05577077..35ba1ff3 100644 --- a/Objects/clinic/bytearrayobject.c.h +++ b/Objects/clinic/bytearrayobject.c.h @@ -38,6 +38,86 @@ bytearray_copy(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) return bytearray_copy_impl(self); } +PyDoc_STRVAR(bytearray_removeprefix__doc__, +"removeprefix($self, prefix, /)\n" +"--\n" +"\n" +"Return a bytearray with the given prefix string removed if present.\n" +"\n" +"If the bytearray starts with the prefix string, return\n" +"bytearray[len(prefix):]. Otherwise, return a copy of the original\n" +"bytearray."); + +#define BYTEARRAY_REMOVEPREFIX_METHODDEF \ + {"removeprefix", (PyCFunction)bytearray_removeprefix, METH_O, bytearray_removeprefix__doc__}, + +static PyObject * +bytearray_removeprefix_impl(PyByteArrayObject *self, Py_buffer *prefix); + +static PyObject * +bytearray_removeprefix(PyByteArrayObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + Py_buffer prefix = {NULL, NULL}; + + if (PyObject_GetBuffer(arg, &prefix, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&prefix, 'C')) { + _PyArg_BadArgument("removeprefix", "argument", "contiguous buffer", arg); + goto exit; + } + return_value = bytearray_removeprefix_impl(self, &prefix); + +exit: + /* Cleanup for prefix */ + if (prefix.obj) { + PyBuffer_Release(&prefix); + } + + return return_value; +} + +PyDoc_STRVAR(bytearray_removesuffix__doc__, +"removesuffix($self, suffix, /)\n" +"--\n" +"\n" +"Return a bytearray with the given suffix string removed if present.\n" +"\n" +"If the bytearray ends with the suffix string and that suffix is not\n" +"empty, return bytearray[:-len(suffix)]. Otherwise, return a copy of\n" +"the original bytearray."); + +#define BYTEARRAY_REMOVESUFFIX_METHODDEF \ + {"removesuffix", (PyCFunction)bytearray_removesuffix, METH_O, bytearray_removesuffix__doc__}, + +static PyObject * +bytearray_removesuffix_impl(PyByteArrayObject *self, Py_buffer *suffix); + +static PyObject * +bytearray_removesuffix(PyByteArrayObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + Py_buffer suffix = {NULL, NULL}; + + if (PyObject_GetBuffer(arg, &suffix, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&suffix, 'C')) { + _PyArg_BadArgument("removesuffix", "argument", "contiguous buffer", arg); + goto exit; + } + return_value = bytearray_removesuffix_impl(self, &suffix); + +exit: + /* Cleanup for suffix */ + if (suffix.obj) { + PyBuffer_Release(&suffix); + } + + return return_value; +} + PyDoc_STRVAR(bytearray_translate__doc__, "translate($self, table, /, delete=b\'\')\n" "--\n" @@ -1011,4 +1091,4 @@ bytearray_sizeof(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) { return bytearray_sizeof_impl(self); } -/*[clinic end generated code: output=508dce79cf2dffcc input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b2919f76709e48dc input=a9049054013a1b77]*/ diff --git a/Objects/clinic/bytesobject.c.h b/Objects/clinic/bytesobject.c.h index 22024ab1..063a3777 100644 --- a/Objects/clinic/bytesobject.c.h +++ b/Objects/clinic/bytesobject.c.h @@ -526,6 +526,85 @@ exit: return return_value; } +PyDoc_STRVAR(bytes_removeprefix__doc__, +"removeprefix($self, prefix, /)\n" +"--\n" +"\n" +"Return a bytes object with the given prefix string removed if present.\n" +"\n" +"If the bytes starts with the prefix string, return bytes[len(prefix):].\n" +"Otherwise, return a copy of the original bytes."); + +#define BYTES_REMOVEPREFIX_METHODDEF \ + {"removeprefix", (PyCFunction)bytes_removeprefix, METH_O, bytes_removeprefix__doc__}, + +static PyObject * +bytes_removeprefix_impl(PyBytesObject *self, Py_buffer *prefix); + +static PyObject * +bytes_removeprefix(PyBytesObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + Py_buffer prefix = {NULL, NULL}; + + if (PyObject_GetBuffer(arg, &prefix, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&prefix, 'C')) { + _PyArg_BadArgument("removeprefix", "argument", "contiguous buffer", arg); + goto exit; + } + return_value = bytes_removeprefix_impl(self, &prefix); + +exit: + /* Cleanup for prefix */ + if (prefix.obj) { + PyBuffer_Release(&prefix); + } + + return return_value; +} + +PyDoc_STRVAR(bytes_removesuffix__doc__, +"removesuffix($self, suffix, /)\n" +"--\n" +"\n" +"Return a bytes object with the given suffix string removed if present.\n" +"\n" +"If the bytes ends with the suffix string and that suffix is not empty,\n" +"return bytes[:-len(prefix)]. Otherwise, return a copy of the original\n" +"bytes."); + +#define BYTES_REMOVESUFFIX_METHODDEF \ + {"removesuffix", (PyCFunction)bytes_removesuffix, METH_O, bytes_removesuffix__doc__}, + +static PyObject * +bytes_removesuffix_impl(PyBytesObject *self, Py_buffer *suffix); + +static PyObject * +bytes_removesuffix(PyBytesObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + Py_buffer suffix = {NULL, NULL}; + + if (PyObject_GetBuffer(arg, &suffix, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&suffix, 'C')) { + _PyArg_BadArgument("removesuffix", "argument", "contiguous buffer", arg); + goto exit; + } + return_value = bytes_removesuffix_impl(self, &suffix); + +exit: + /* Cleanup for suffix */ + if (suffix.obj) { + PyBuffer_Release(&suffix); + } + + return return_value; +} + PyDoc_STRVAR(bytes_decode__doc__, "decode($self, /, encoding=\'utf-8\', errors=\'strict\')\n" "--\n" @@ -755,4 +834,4 @@ skip_optional_pos: exit: return return_value; } -/*[clinic end generated code: output=ca60dfccf8d51e88 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=220388917d7bf751 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/dictobject.c.h b/Objects/clinic/dictobject.c.h index 8d549333..7395e3bc 100644 --- a/Objects/clinic/dictobject.c.h +++ b/Objects/clinic/dictobject.c.h @@ -116,6 +116,42 @@ exit: return return_value; } +PyDoc_STRVAR(dict_pop__doc__, +"pop($self, key, default=, /)\n" +"--\n" +"\n" +"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n" +"\n" +"If key is not found, default is returned if given, otherwise KeyError is raised"); + +#define DICT_POP_METHODDEF \ + {"pop", (PyCFunction)(void(*)(void))dict_pop, METH_FASTCALL, dict_pop__doc__}, + +static PyObject * +dict_pop_impl(PyDictObject *self, PyObject *key, PyObject *default_value); + +static PyObject * +dict_pop(PyDictObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *key; + PyObject *default_value = NULL; + + if (!_PyArg_CheckPositional("pop", nargs, 1, 2)) { + goto exit; + } + key = args[0]; + if (nargs < 2) { + goto skip_optional; + } + default_value = args[1]; +skip_optional: + return_value = dict_pop_impl(self, key, default_value); + +exit: + return return_value; +} + PyDoc_STRVAR(dict_popitem__doc__, "popitem($self, /)\n" "--\n" @@ -154,4 +190,4 @@ dict___reversed__(PyDictObject *self, PyObject *Py_UNUSED(ignored)) { return dict___reversed___impl(self); } -/*[clinic end generated code: output=676532dcc941d399 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=4d98145508da8fa3 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/floatobject.c.h b/Objects/clinic/floatobject.c.h index b684ba0e..b7554832 100644 --- a/Objects/clinic/floatobject.c.h +++ b/Objects/clinic/floatobject.c.h @@ -38,6 +38,42 @@ float___trunc__(PyObject *self, PyObject *Py_UNUSED(ignored)) return float___trunc___impl(self); } +PyDoc_STRVAR(float___floor____doc__, +"__floor__($self, /)\n" +"--\n" +"\n" +"Return the floor as an Integral."); + +#define FLOAT___FLOOR___METHODDEF \ + {"__floor__", (PyCFunction)float___floor__, METH_NOARGS, float___floor____doc__}, + +static PyObject * +float___floor___impl(PyObject *self); + +static PyObject * +float___floor__(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + return float___floor___impl(self); +} + +PyDoc_STRVAR(float___ceil____doc__, +"__ceil__($self, /)\n" +"--\n" +"\n" +"Return the ceiling as an Integral."); + +#define FLOAT___CEIL___METHODDEF \ + {"__ceil__", (PyCFunction)float___ceil__, METH_NOARGS, float___ceil____doc__}, + +static PyObject * +float___ceil___impl(PyObject *self); + +static PyObject * +float___ceil__(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + return float___ceil___impl(self); +} + PyDoc_STRVAR(float___round____doc__, "__round__($self, ndigits=None, /)\n" "--\n" @@ -351,4 +387,4 @@ float___format__(PyObject *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=1676433b9f04fbc9 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=25fbbe253f44e2df input=a9049054013a1b77]*/ diff --git a/Objects/clinic/listobject.c.h b/Objects/clinic/listobject.c.h index 57f0a48e..ed137c95 100644 --- a/Objects/clinic/listobject.c.h +++ b/Objects/clinic/listobject.c.h @@ -314,7 +314,7 @@ list___init__(PyObject *self, PyObject *args, PyObject *kwargs) int return_value = -1; PyObject *iterable = NULL; - if ((Py_TYPE(self) == &PyList_Type) && + if (Py_IS_TYPE(self, &PyList_Type) && !_PyArg_NoKeywords("list", kwargs)) { goto exit; } @@ -367,4 +367,4 @@ list___reversed__(PyListObject *self, PyObject *Py_UNUSED(ignored)) { return list___reversed___impl(self); } -/*[clinic end generated code: output=73718c0c33798c62 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1ff61490c091d165 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/unicodeobject.c.h b/Objects/clinic/unicodeobject.c.h index 0d134064..cf81df4a 100644 --- a/Objects/clinic/unicodeobject.c.h +++ b/Objects/clinic/unicodeobject.c.h @@ -754,6 +754,77 @@ exit: return return_value; } +PyDoc_STRVAR(unicode_removeprefix__doc__, +"removeprefix($self, prefix, /)\n" +"--\n" +"\n" +"Return a str with the given prefix string removed if present.\n" +"\n" +"If the string starts with the prefix string, return string[len(prefix):].\n" +"Otherwise, return a copy of the original string."); + +#define UNICODE_REMOVEPREFIX_METHODDEF \ + {"removeprefix", (PyCFunction)unicode_removeprefix, METH_O, unicode_removeprefix__doc__}, + +static PyObject * +unicode_removeprefix_impl(PyObject *self, PyObject *prefix); + +static PyObject * +unicode_removeprefix(PyObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + PyObject *prefix; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("removeprefix", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { + goto exit; + } + prefix = arg; + return_value = unicode_removeprefix_impl(self, prefix); + +exit: + return return_value; +} + +PyDoc_STRVAR(unicode_removesuffix__doc__, +"removesuffix($self, suffix, /)\n" +"--\n" +"\n" +"Return a str with the given suffix string removed if present.\n" +"\n" +"If the string ends with the suffix string and that suffix is not empty,\n" +"return string[:-len(suffix)]. Otherwise, return a copy of the original\n" +"string."); + +#define UNICODE_REMOVESUFFIX_METHODDEF \ + {"removesuffix", (PyCFunction)unicode_removesuffix, METH_O, unicode_removesuffix__doc__}, + +static PyObject * +unicode_removesuffix_impl(PyObject *self, PyObject *suffix); + +static PyObject * +unicode_removesuffix(PyObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + PyObject *suffix; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("removesuffix", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { + goto exit; + } + suffix = arg; + return_value = unicode_removesuffix_impl(self, suffix); + +exit: + return return_value; +} + PyDoc_STRVAR(unicode_rjust__doc__, "rjust($self, width, fillchar=\' \', /)\n" "--\n" @@ -1232,4 +1303,4 @@ unicode_sizeof(PyObject *self, PyObject *Py_UNUSED(ignored)) { return unicode_sizeof_impl(self); } -/*[clinic end generated code: output=e4ed33400979c7e8 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b91233f3722643be input=a9049054013a1b77]*/ diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 522e1a9f..73763594 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -3,9 +3,10 @@ #include "Python.h" #include "code.h" #include "opcode.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "pycore_code.h" -#include "pycore_pystate.h" +#include "pycore_interp.h" // PyInterpreterState.co_extra_freefuncs +#include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_tupleobject.h" #include "clinic/codeobject.c.h" @@ -38,7 +39,7 @@ all_name_chars(PyObject *o) return 1; } -static void +static int intern_strings(PyObject *tuple) { Py_ssize_t i; @@ -46,60 +47,70 @@ intern_strings(PyObject *tuple) for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { PyObject *v = PyTuple_GET_ITEM(tuple, i); if (v == NULL || !PyUnicode_CheckExact(v)) { - Py_FatalError("non-string found in code slot"); + PyErr_SetString(PyExc_SystemError, + "non-string found in code slot"); + return -1; } PyUnicode_InternInPlace(&_PyTuple_ITEMS(tuple)[i]); } + return 0; } /* Intern selected string constants */ static int -intern_string_constants(PyObject *tuple) +intern_string_constants(PyObject *tuple, int *modified) { - int modified = 0; - Py_ssize_t i; - - for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { + for (Py_ssize_t i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { PyObject *v = PyTuple_GET_ITEM(tuple, i); if (PyUnicode_CheckExact(v)) { if (PyUnicode_READY(v) == -1) { - PyErr_Clear(); - continue; + return -1; } + if (all_name_chars(v)) { PyObject *w = v; PyUnicode_InternInPlace(&v); if (w != v) { PyTuple_SET_ITEM(tuple, i, v); - modified = 1; + if (modified) { + *modified = 1; + } } } } else if (PyTuple_CheckExact(v)) { - intern_string_constants(v); + if (intern_string_constants(v, NULL) < 0) { + return -1; + } } else if (PyFrozenSet_CheckExact(v)) { PyObject *w = v; PyObject *tmp = PySequence_Tuple(v); if (tmp == NULL) { - PyErr_Clear(); - continue; + return -1; } - if (intern_string_constants(tmp)) { + int tmp_modified = 0; + if (intern_string_constants(tmp, &tmp_modified) < 0) { + Py_DECREF(tmp); + return -1; + } + if (tmp_modified) { v = PyFrozenSet_New(tmp); if (v == NULL) { - PyErr_Clear(); + Py_DECREF(tmp); + return -1; } - else { - PyTuple_SET_ITEM(tuple, i, v); - Py_DECREF(w); - modified = 1; + + PyTuple_SET_ITEM(tuple, i, v); + Py_DECREF(w); + if (modified) { + *modified = 1; } } Py_DECREF(tmp); } } - return modified; + return 0; } PyCodeObject * @@ -139,11 +150,21 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, return NULL; } - intern_strings(names); - intern_strings(varnames); - intern_strings(freevars); - intern_strings(cellvars); - intern_string_constants(consts); + if (intern_strings(names) < 0) { + return NULL; + } + if (intern_strings(varnames) < 0) { + return NULL; + } + if (intern_strings(freevars) < 0) { + return NULL; + } + if (intern_strings(cellvars) < 0) { + return NULL; + } + if (intern_string_constants(consts, NULL) < 0) { + return NULL; + } /* Check for any inner or outer closure references */ n_cellvars = PyTuple_GET_SIZE(cellvars); @@ -199,7 +220,7 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, cell2arg = NULL; } } - co = PyObject_NEW(PyCodeObject, &PyCode_Type); + co = PyObject_New(PyCodeObject, &PyCode_Type); if (co == NULL) { if (cell2arg) PyMem_FREE(cell2arg); @@ -396,7 +417,7 @@ validate_and_copy_tuple(PyObject *tup) PyExc_TypeError, "name tuples must contain only " "strings, not '%.500s'", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); Py_DECREF(newtuple); return NULL; } @@ -513,7 +534,7 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kw) ourvarnames, ourfreevars, ourcellvars, filename, name, firstlineno, lnotab); - cleanup: + cleanup: Py_XDECREF(ournames); Py_XDECREF(ourvarnames); Py_XDECREF(ourfreevars); @@ -534,7 +555,7 @@ code_dealloc(PyCodeObject *co) co->co_opcache_size = 0; if (co->co_extra != NULL) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); _PyCodeObjectExtra *co_extra = co->co_extra; for (Py_ssize_t i = 0; i < co_extra->ce_size; i++) { @@ -1053,7 +1074,7 @@ _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra) int _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (!PyCode_Check(code) || index < 0 || index >= interp->co_extra_user_count) { diff --git a/Objects/complexobject.c b/Objects/complexobject.c index e01409b9..a4903778 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -6,7 +6,7 @@ /* Submitted by Jim Hugunin */ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef /*[clinic input] class complex "PyComplexObject *" "&PyComplex_Type" @@ -296,7 +296,7 @@ try_complex_special_method(PyObject *op) if (!PyComplex_Check(res)) { PyErr_Format(PyExc_TypeError, "__complex__ returned non-complex (type %.200s)", - res->ob_type->tp_name); + Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } @@ -305,7 +305,7 @@ try_complex_special_method(PyObject *op) "__complex__ returned non-complex (type %.200s). " "The ability to return an instance of a strict subclass of complex " "is deprecated, and may be removed in a future version of Python.", - res->ob_type->tp_name)) { + Py_TYPE(res)->tp_name)) { Py_DECREF(res); return NULL; } @@ -466,9 +466,7 @@ complex_add(PyObject *v, PyObject *w) Py_complex a, b; TO_COMPLEX(v, a); TO_COMPLEX(w, b); - PyFPE_START_PROTECT("complex_add", return 0) result = _Py_c_sum(a, b); - PyFPE_END_PROTECT(result) return PyComplex_FromCComplex(result); } @@ -479,9 +477,7 @@ complex_sub(PyObject *v, PyObject *w) Py_complex a, b; TO_COMPLEX(v, a); TO_COMPLEX(w, b); - PyFPE_START_PROTECT("complex_sub", return 0) result = _Py_c_diff(a, b); - PyFPE_END_PROTECT(result) return PyComplex_FromCComplex(result); } @@ -492,9 +488,7 @@ complex_mul(PyObject *v, PyObject *w) Py_complex a, b; TO_COMPLEX(v, a); TO_COMPLEX(w, b); - PyFPE_START_PROTECT("complex_mul", return 0) result = _Py_c_prod(a, b); - PyFPE_END_PROTECT(result) return PyComplex_FromCComplex(result); } @@ -505,10 +499,8 @@ complex_div(PyObject *v, PyObject *w) Py_complex a, b; TO_COMPLEX(v, a); TO_COMPLEX(w, b); - PyFPE_START_PROTECT("complex_div", return 0) errno = 0; quot = _Py_c_quot(a, b); - PyFPE_END_PROTECT(quot) if (errno == EDOM) { PyErr_SetString(PyExc_ZeroDivisionError, "complex division by zero"); return NULL; @@ -547,7 +539,6 @@ complex_pow(PyObject *v, PyObject *w, PyObject *z) PyErr_SetString(PyExc_ValueError, "complex modulo"); return NULL; } - PyFPE_START_PROTECT("complex_pow", return 0) errno = 0; exponent = b; int_exponent = (long)exponent.real; @@ -556,7 +547,6 @@ complex_pow(PyObject *v, PyObject *w, PyObject *z) else p = _Py_c_pow(a, exponent); - PyFPE_END_PROTECT(p) Py_ADJUST_ERANGE2(p.real, p.imag); if (errno == EDOM) { PyErr_SetString(PyExc_ZeroDivisionError, @@ -604,9 +594,7 @@ complex_abs(PyComplexObject *v) { double result; - PyFPE_START_PROTECT("complex_abs", return 0) result = _Py_c_abs(v->cval); - PyFPE_END_PROTECT(result) if (errno == ERANGE) { PyErr_SetString(PyExc_OverflowError, @@ -970,7 +958,7 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) return NULL; } - nbr = r->ob_type->tp_as_number; + nbr = Py_TYPE(r)->tp_as_number; if (nbr == NULL || (nbr->nb_float == NULL && nbr->nb_index == NULL)) { PyErr_Format(PyExc_TypeError, "complex() first argument must be a string or a number, " @@ -982,7 +970,7 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) return NULL; } if (i != NULL) { - nbi = i->ob_type->tp_as_number; + nbi = Py_TYPE(i)->tp_as_number; if (nbi == NULL || (nbi->nb_float == NULL && nbi->nb_index == NULL)) { PyErr_Format(PyExc_TypeError, "complex() second argument must be a number, " diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 729f42c5..fce9cdd3 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1,10 +1,13 @@ /* Descriptors -- a new, flexible way to describe attributes */ #include "Python.h" +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tupleobject.h" -#include "structmember.h" /* Why is this not included in Python.h? */ +#include "structmember.h" // PyMemberDef + +_Py_IDENTIFIER(getattr); /*[clinic input] class mappingproxy "mappingproxyobject *" "&PyDictProxy_Type" @@ -82,7 +85,7 @@ descr_check(PyDescrObject *descr, PyObject *obj, PyObject **pres) "doesn't apply to a '%.100s' object", descr_name((PyDescrObject *)descr), "?", descr->d_type->tp_name, - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); *pres = NULL; return 1; } @@ -95,7 +98,7 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) /* Ensure a valid type. Class methods ignore obj. */ if (type == NULL) { if (obj != NULL) - type = (PyObject *)obj->ob_type; + type = (PyObject *)Py_TYPE(obj); else { /* Wot - no type?! */ PyErr_Format(PyExc_TypeError, @@ -112,7 +115,7 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) "needs a type, not a '%.100s' as arg 2", descr_name((PyDescrObject *)descr), "?", PyDescr_TYPE(descr)->tp_name, - type->ob_type->tp_name); + Py_TYPE(type)->tp_name); return NULL; } if (!PyType_IsSubtype((PyTypeObject *)type, PyDescr_TYPE(descr))) { @@ -124,7 +127,11 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) ((PyTypeObject *)type)->tp_name); return NULL; } - return PyCFunction_NewEx(descr->d_method, type, NULL); + PyTypeObject *cls = NULL; + if (descr->d_method->ml_flags & METH_METHOD) { + cls = descr->d_common.d_type; + } + return PyCMethod_New(descr->d_method, type, NULL, cls); } static PyObject * @@ -134,7 +141,19 @@ method_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) if (descr_check((PyDescrObject *)descr, obj, &res)) return res; - return PyCFunction_NewEx(descr->d_method, obj, NULL); + if (descr->d_method->ml_flags & METH_METHOD) { + if (PyType_Check(type)) { + return PyCMethod_New(descr->d_method, obj, NULL, descr->d_common.d_type); + } else { + PyErr_Format(PyExc_TypeError, + "descriptor '%V' needs a type, not '%s', as arg 2", + descr_name((PyDescrObject *)descr), + Py_TYPE(type)->tp_name); + return NULL; + } + } else { + return PyCFunction_NewEx(descr->d_method, obj, NULL); + } } static PyObject * @@ -192,7 +211,7 @@ descr_setcheck(PyDescrObject *descr, PyObject *obj, PyObject *value, "doesn't apply to a '%.100s' object", descr_name(descr), "?", descr->d_type->tp_name, - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); *pres = -1; return 1; } @@ -231,49 +250,42 @@ getset_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value) * * First, common helpers */ -static const char * -get_name(PyObject *func) { - assert(PyObject_TypeCheck(func, &PyMethodDescr_Type)); - return ((PyMethodDescrObject *)func)->d_method->ml_name; -} - -typedef void (*funcptr)(void); - static inline int method_check_args(PyObject *func, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { assert(!PyErr_Occurred()); - assert(PyObject_TypeCheck(func, &PyMethodDescr_Type)); if (nargs < 1) { - PyErr_Format(PyExc_TypeError, - "descriptor '%.200s' of '%.100s' " - "object needs an argument", - get_name(func), PyDescr_TYPE(func)->tp_name); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + PyErr_Format(PyExc_TypeError, + "unbound method %U needs an argument", funcstr); + Py_DECREF(funcstr); + } return -1; } PyObject *self = args[0]; - if (!_PyObject_RealIsSubclass((PyObject *)Py_TYPE(self), - (PyObject *)PyDescr_TYPE(func))) - { - PyErr_Format(PyExc_TypeError, - "descriptor '%.200s' for '%.100s' objects " - "doesn't apply to a '%.100s' object", - get_name(func), PyDescr_TYPE(func)->tp_name, - Py_TYPE(self)->tp_name); + PyObject *dummy; + if (descr_check((PyDescrObject *)func, self, &dummy)) { return -1; } if (kwnames && PyTuple_GET_SIZE(kwnames)) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no keyword arguments", get_name(func)); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + PyErr_Format(PyExc_TypeError, + "%U takes no keyword arguments", funcstr); + Py_DECREF(funcstr); + } return -1; } return 0; } +typedef void (*funcptr)(void); + static inline funcptr -method_enter_call(PyObject *func) +method_enter_call(PyThreadState *tstate, PyObject *func) { - if (Py_EnterRecursiveCall(" while calling a Python object")) { + if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { return NULL; } return (funcptr)((PyMethodDescrObject *)func)->d_method->ml_meth; @@ -284,6 +296,7 @@ static PyObject * method_vectorcall_VARARGS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, kwnames)) { return NULL; @@ -292,14 +305,14 @@ method_vectorcall_VARARGS( if (argstuple == NULL) { return NULL; } - PyCFunction meth = (PyCFunction)method_enter_call(func); + PyCFunction meth = (PyCFunction)method_enter_call(tstate, func); if (meth == NULL) { Py_DECREF(argstuple); return NULL; } PyObject *result = meth(args[0], argstuple); Py_DECREF(argstuple); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -307,6 +320,7 @@ static PyObject * method_vectorcall_VARARGS_KEYWORDS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, NULL)) { return NULL; @@ -325,33 +339,54 @@ method_vectorcall_VARARGS_KEYWORDS( } } PyCFunctionWithKeywords meth = (PyCFunctionWithKeywords) - method_enter_call(func); + method_enter_call(tstate, func); if (meth == NULL) { goto exit; } result = meth(args[0], argstuple, kwdict); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); exit: Py_DECREF(argstuple); Py_XDECREF(kwdict); return result; } +static PyObject * +method_vectorcall_FASTCALL_KEYWORDS_METHOD( + PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + PyThreadState *tstate = _PyThreadState_GET(); + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (method_check_args(func, args, nargs, NULL)) { + return NULL; + } + PyCMethod meth = (PyCMethod) method_enter_call(tstate, func); + if (meth == NULL) { + return NULL; + } + PyObject *result = meth(args[0], + ((PyMethodDescrObject *)func)->d_common.d_type, + args+1, nargs-1, kwnames); + Py_LeaveRecursiveCall(); + return result; +} + static PyObject * method_vectorcall_FASTCALL( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, kwnames)) { return NULL; } _PyCFunctionFast meth = (_PyCFunctionFast) - method_enter_call(func); + method_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(args[0], args+1, nargs-1); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -359,17 +394,18 @@ static PyObject * method_vectorcall_FASTCALL_KEYWORDS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, NULL)) { return NULL; } _PyCFunctionFastWithKeywords meth = (_PyCFunctionFastWithKeywords) - method_enter_call(func); + method_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(args[0], args+1, nargs-1, kwnames); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -377,21 +413,26 @@ static PyObject * method_vectorcall_NOARGS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, kwnames)) { return NULL; } if (nargs != 1) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%zd given)", get_name(func), nargs-1); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + PyErr_Format(PyExc_TypeError, + "%U takes no arguments (%zd given)", funcstr, nargs-1); + Py_DECREF(funcstr); + } return NULL; } - PyCFunction meth = (PyCFunction)method_enter_call(func); + PyCFunction meth = (PyCFunction)method_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(args[0], NULL); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -399,36 +440,44 @@ static PyObject * method_vectorcall_O( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, kwnames)) { return NULL; } if (nargs != 2) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%zd given)", - get_name(func), nargs-1); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + PyErr_Format(PyExc_TypeError, + "%U takes exactly one argument (%zd given)", + funcstr, nargs-1); + Py_DECREF(funcstr); + } return NULL; } - PyCFunction meth = (PyCFunction)method_enter_call(func); + PyCFunction meth = (PyCFunction)method_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(args[0], args[1]); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } +/* Instances of classmethod_descriptor are unlikely to be called directly. + For one, the analogous class "classmethod" (for Python classes) is not + callable. Second, users are not likely to access a classmethod_descriptor + directly, since it means pulling it from the class __dict__. + + This is just an excuse to say that this doesn't need to be optimized: + we implement this simply by calling __get__ and then calling the result. +*/ static PyObject * classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwds) { - Py_ssize_t argc; - PyObject *self, *result; - - /* Make sure that the first argument is acceptable as 'self' */ - assert(PyTuple_Check(args)); - argc = PyTuple_GET_SIZE(args); + Py_ssize_t argc = PyTuple_GET_SIZE(args); if (argc < 1) { PyErr_Format(PyExc_TypeError, "descriptor '%V' of '%.100s' " @@ -437,30 +486,15 @@ classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyDescr_TYPE(descr)->tp_name); return NULL; } - self = PyTuple_GET_ITEM(args, 0); - if (!PyType_Check(self)) { - PyErr_Format(PyExc_TypeError, - "descriptor '%V' requires a type " - "but received a '%.100s' instance", - descr_name((PyDescrObject *)descr), "?", - self->ob_type->tp_name); - return NULL; - } - if (!PyType_IsSubtype((PyTypeObject *)self, PyDescr_TYPE(descr))) { - PyErr_Format(PyExc_TypeError, - "descriptor '%V' requires a subtype of '%.100s' " - "but received '%.100s'", - descr_name((PyDescrObject *)descr), "?", - PyDescr_TYPE(descr)->tp_name, - ((PyTypeObject*)self)->tp_name); + PyObject *self = PyTuple_GET_ITEM(args, 0); + PyObject *bound = classmethod_get(descr, NULL, self); + if (bound == NULL) { return NULL; } - - result = _PyMethodDef_RawFastCallDict(descr->d_method, self, - &_PyTuple_ITEMS(args)[1], argc - 1, - kwds); - result = _Py_CheckFunctionResult((PyObject *)descr, result, NULL); - return result; + PyObject *res = PyObject_VectorcallDict(bound, _PyTuple_ITEMS(args)+1, + argc-1, kwds); + Py_DECREF(bound); + return res; } Py_LOCAL_INLINE(PyObject *) @@ -509,7 +543,7 @@ wrapperdescr_call(PyWrapperDescrObject *descr, PyObject *args, PyObject *kwds) "but received a '%.100s'", descr_name((PyDescrObject *)descr), "?", PyDescr_TYPE(descr)->tp_name, - self->ob_type->tp_name); + Py_TYPE(self)->tp_name); return NULL; } @@ -576,7 +610,6 @@ descr_get_qualname(PyDescrObject *descr, void *Py_UNUSED(ignored)) static PyObject * descr_reduce(PyDescrObject *descr, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(getattr); return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr), PyDescr_TYPE(descr), PyDescr_NAME(descr)); } @@ -677,7 +710,7 @@ PyTypeObject PyMethodDescr_Type = { 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL | + Py_TPFLAGS_HAVE_VECTORCALL | Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ 0, /* tp_doc */ descr_traverse, /* tp_traverse */ @@ -871,7 +904,8 @@ PyDescr_NewMethod(PyTypeObject *type, PyMethodDef *method) { /* Figure out correct vectorcall function to use */ vectorcallfunc vectorcall; - switch (method->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS)) + switch (method->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | + METH_O | METH_KEYWORDS | METH_METHOD)) { case METH_VARARGS: vectorcall = method_vectorcall_VARARGS; @@ -891,6 +925,9 @@ PyDescr_NewMethod(PyTypeObject *type, PyMethodDef *method) case METH_O: vectorcall = method_vectorcall_O; break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + vectorcall = method_vectorcall_FASTCALL_KEYWORDS_METHOD; + break; default: PyErr_Format(PyExc_SystemError, "%s() method: bad call flags", method->ml_name); @@ -987,6 +1024,30 @@ static PyMappingMethods mappingproxy_as_mapping = { 0, /* mp_ass_subscript */ }; +static PyObject * +mappingproxy_or(PyObject *left, PyObject *right) +{ + if (PyObject_TypeCheck(left, &PyDictProxy_Type)) { + left = ((mappingproxyobject*)left)->mapping; + } + if (PyObject_TypeCheck(right, &PyDictProxy_Type)) { + right = ((mappingproxyobject*)right)->mapping; + } + return PyNumber_Or(left, right); +} + +static PyObject * +mappingproxy_ior(PyObject *self, PyObject *Py_UNUSED(other)) +{ + return PyErr_Format(PyExc_TypeError, + "'|=' is not supported by %s; use '|' instead", Py_TYPE(self)->tp_name); +} + +static PyNumberMethods mappingproxy_as_number = { + .nb_or = mappingproxy_or, + .nb_inplace_or = mappingproxy_ior, +}; + static int mappingproxy_contains(mappingproxyobject *pp, PyObject *key) { @@ -1010,50 +1071,64 @@ static PySequenceMethods mappingproxy_as_sequence = { }; static PyObject * -mappingproxy_get(mappingproxyobject *pp, PyObject *args) +mappingproxy_get(mappingproxyobject *pp, PyObject *const *args, Py_ssize_t nargs) { - PyObject *key, *def = Py_None; - _Py_IDENTIFIER(get); + /* newargs: mapping, key, default=None */ + PyObject *newargs[3]; + newargs[0] = pp->mapping; + newargs[2] = Py_None; - if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &def)) + if (!_PyArg_UnpackStack(args, nargs, "get", 1, 2, + &newargs[1], &newargs[2])) + { return NULL; - return _PyObject_CallMethodIdObjArgs(pp->mapping, &PyId_get, - key, def, NULL); + } + _Py_IDENTIFIER(get); + return _PyObject_VectorcallMethodId(&PyId_get, newargs, + 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, + NULL); } static PyObject * mappingproxy_keys(mappingproxyobject *pp, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(keys); - return _PyObject_CallMethodId(pp->mapping, &PyId_keys, NULL); + return _PyObject_CallMethodIdNoArgs(pp->mapping, &PyId_keys); } static PyObject * mappingproxy_values(mappingproxyobject *pp, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(values); - return _PyObject_CallMethodId(pp->mapping, &PyId_values, NULL); + return _PyObject_CallMethodIdNoArgs(pp->mapping, &PyId_values); } static PyObject * mappingproxy_items(mappingproxyobject *pp, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(items); - return _PyObject_CallMethodId(pp->mapping, &PyId_items, NULL); + return _PyObject_CallMethodIdNoArgs(pp->mapping, &PyId_items); } static PyObject * mappingproxy_copy(mappingproxyobject *pp, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(copy); - return _PyObject_CallMethodId(pp->mapping, &PyId_copy, NULL); + return _PyObject_CallMethodIdNoArgs(pp->mapping, &PyId_copy); +} + +static PyObject * +mappingproxy_reversed(mappingproxyobject *pp, PyObject *Py_UNUSED(ignored)) +{ + _Py_IDENTIFIER(__reversed__); + return _PyObject_CallMethodIdNoArgs(pp->mapping, &PyId___reversed__); } /* WARNING: mappingproxy methods must not give access to the underlying mapping */ static PyMethodDef mappingproxy_methods[] = { - {"get", (PyCFunction)mappingproxy_get, METH_VARARGS, + {"get", (PyCFunction)(void(*)(void))mappingproxy_get, METH_FASTCALL, PyDoc_STR("D.get(k[,d]) -> D[k] if k in D, else d." " d defaults to None.")}, {"keys", (PyCFunction)mappingproxy_keys, METH_NOARGS, @@ -1064,6 +1139,10 @@ static PyMethodDef mappingproxy_methods[] = { PyDoc_STR("D.items() -> list of D's (key, value) pairs, as 2-tuples")}, {"copy", (PyCFunction)mappingproxy_copy, METH_NOARGS, PyDoc_STR("D.copy() -> a shallow copy of D")}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, + PyDoc_STR("See PEP 585")}, + {"__reversed__", (PyCFunction)mappingproxy_reversed, METH_NOARGS, + PyDoc_STR("D.__reversed__() -> reverse iterator")}, {0} }; @@ -1176,7 +1255,7 @@ typedef struct { PyObject *self; } wrapperobject; -#define Wrapper_Check(v) (Py_TYPE(v) == &_PyMethodWrapper_Type) +#define Wrapper_Check(v) Py_IS_TYPE(v, &_PyMethodWrapper_Type) static void wrapper_dealloc(wrapperobject *wp) @@ -1232,14 +1311,13 @@ wrapper_repr(wrapperobject *wp) { return PyUnicode_FromFormat("", wp->descr->d_base->name, - wp->self->ob_type->tp_name, + Py_TYPE(wp->self)->tp_name, wp->self); } static PyObject * wrapper_reduce(wrapperobject *wp, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(getattr); return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr), wp->self, PyDescr_NAME(wp->descr)); } @@ -1475,7 +1553,7 @@ property_dealloc(PyObject *self) Py_XDECREF(gs->prop_set); Py_XDECREF(gs->prop_del); Py_XDECREF(gs->prop_doc); - self->ob_type->tp_free(self); + Py_TYPE(self)->tp_free(self); } static PyObject * @@ -1492,8 +1570,7 @@ property_descr_get(PyObject *self, PyObject *obj, PyObject *type) return NULL; } - PyObject *args[1] = {obj}; - return _PyObject_FastCall(gs->prop_get, args, 1); + return PyObject_CallOneArg(gs->prop_get, obj); } static int @@ -1514,7 +1591,7 @@ property_descr_set(PyObject *self, PyObject *obj, PyObject *value) return -1; } if (value == NULL) - res = PyObject_CallFunctionObjArgs(func, obj, NULL); + res = PyObject_CallOneArg(func, obj); else res = PyObject_CallFunctionObjArgs(func, obj, value, NULL); if (res == NULL) @@ -1628,7 +1705,7 @@ property_init_impl(propertyobject *self, PyObject *fget, PyObject *fset, if (rc <= 0) { return rc; } - if (Py_TYPE(self) == &PyProperty_Type) { + if (Py_IS_TYPE(self, &PyProperty_Type)) { Py_XSETREF(self->prop_doc, get_doc); } else { @@ -1717,7 +1794,7 @@ PyTypeObject PyDictProxy_Type = { 0, /* tp_setattr */ 0, /* tp_as_async */ (reprfunc)mappingproxy_repr, /* tp_repr */ - 0, /* tp_as_number */ + &mappingproxy_as_number, /* tp_as_number */ &mappingproxy_as_sequence, /* tp_as_sequence */ &mappingproxy_as_mapping, /* tp_as_mapping */ 0, /* tp_hash */ diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 3c56f4a5..faee6bc9 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -111,10 +111,11 @@ converting the dict to the combined table. #define PyDict_MINSIZE 8 #include "Python.h" +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "dict-common.h" -#include "stringlib/eq.h" /* to get unicode_eq() */ +#include "stringlib/eq.h" // unicode_eq() /*[clinic input] class dict "PyDictObject *" "&PyDict_Type" @@ -249,42 +250,46 @@ static uint64_t pydict_global_version = 0; #ifndef PyDict_MAXFREELIST #define PyDict_MAXFREELIST 80 #endif + +#if PyDict_MAXFREELIST > 0 static PyDictObject *free_list[PyDict_MAXFREELIST]; static int numfree = 0; static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST]; static int numfreekeys = 0; +#endif #include "clinic/dictobject.c.h" -int -PyDict_ClearFreeList(void) +void +_PyDict_ClearFreeList(void) { - PyDictObject *op; - int ret = numfree + numfreekeys; +#if PyDict_MAXFREELIST > 0 while (numfree) { - op = free_list[--numfree]; + PyDictObject *op = free_list[--numfree]; assert(PyDict_CheckExact(op)); PyObject_GC_Del(op); } while (numfreekeys) { PyObject_FREE(keys_free_list[--numfreekeys]); } - return ret; +#endif } /* Print summary info about the state of the optimized allocator */ void _PyDict_DebugMallocStats(FILE *out) { +#if PyDict_MAXFREELIST > 0 _PyDebugAllocatorStats(out, "free PyDictObject", numfree, sizeof(PyDictObject)); +#endif } void -PyDict_Fini(void) +_PyDict_Fini(void) { - PyDict_ClearFreeList(); + _PyDict_ClearFreeList(); } #define DK_SIZE(dk) ((dk)->dk_size) @@ -311,7 +316,9 @@ static void free_keys_object(PyDictKeysObject *keys); static inline void dictkeys_incref(PyDictKeysObject *dk) { - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif dk->dk_refcnt++; } @@ -319,7 +326,9 @@ static inline void dictkeys_decref(PyDictKeysObject *dk) { assert(dk->dk_refcnt > 0); - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif if (--dk->dk_refcnt == 0) { free_keys_object(dk); } @@ -327,27 +336,27 @@ dictkeys_decref(PyDictKeysObject *dk) /* lookup indices. returns DKIX_EMPTY, DKIX_DUMMY, or ix >=0 */ static inline Py_ssize_t -dictkeys_get_index(PyDictKeysObject *keys, Py_ssize_t i) +dictkeys_get_index(const PyDictKeysObject *keys, Py_ssize_t i) { Py_ssize_t s = DK_SIZE(keys); Py_ssize_t ix; if (s <= 0xff) { - int8_t *indices = (int8_t*)(keys->dk_indices); + const int8_t *indices = (const int8_t*)(keys->dk_indices); ix = indices[i]; } else if (s <= 0xffff) { - int16_t *indices = (int16_t*)(keys->dk_indices); + const int16_t *indices = (const int16_t*)(keys->dk_indices); ix = indices[i]; } #if SIZEOF_VOID_P > 4 else if (s > 0xffffffff) { - int64_t *indices = (int64_t*)(keys->dk_indices); + const int64_t *indices = (const int64_t*)(keys->dk_indices); ix = indices[i]; } #endif else { - int32_t *indices = (int32_t*)(keys->dk_indices); + const int32_t *indices = (const int32_t*)(keys->dk_indices); ix = indices[i]; } assert(ix >= DKIX_DUMMY); @@ -551,10 +560,13 @@ static PyDictKeysObject *new_keys_object(Py_ssize_t size) es = sizeof(Py_ssize_t); } +#if PyDict_MAXFREELIST > 0 if (size == PyDict_MINSIZE && numfreekeys > 0) { dk = keys_free_list[--numfreekeys]; } - else { + else +#endif + { dk = PyObject_MALLOC(sizeof(PyDictKeysObject) + es * size + sizeof(PyDictKeyEntry) * usable); @@ -563,7 +575,9 @@ static PyDictKeysObject *new_keys_object(Py_ssize_t size) return NULL; } } - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif dk->dk_refcnt = 1; dk->dk_size = size; dk->dk_usable = usable; @@ -583,10 +597,12 @@ free_keys_object(PyDictKeysObject *keys) Py_XDECREF(entries[i].me_key); Py_XDECREF(entries[i].me_value); } +#if PyDict_MAXFREELIST > 0 if (keys->dk_size == PyDict_MINSIZE && numfreekeys < PyDict_MAXFREELIST) { keys_free_list[numfreekeys++] = keys; return; } +#endif PyObject_FREE(keys); } @@ -599,13 +615,16 @@ new_dict(PyDictKeysObject *keys, PyObject **values) { PyDictObject *mp; assert(keys != NULL); +#if PyDict_MAXFREELIST > 0 if (numfree) { mp = free_list[--numfree]; assert (mp != NULL); - assert (Py_TYPE(mp) == &PyDict_Type); + assert (Py_IS_TYPE(mp, &PyDict_Type)); _Py_NewReference((PyObject *)mp); } - else { + else +#endif + { mp = PyObject_GC_New(PyDictObject, &PyDict_Type); if (mp == NULL) { dictkeys_decref(keys); @@ -687,10 +706,12 @@ clone_combined_dict(PyDictObject *orig) } /* Since we copied the keys table we now have an extra reference - in the system. Manually call _Py_INC_REFTOTAL to signal that + in the system. Manually call increment _Py_RefTotal to signal that we have it now; calling dictkeys_incref would be an error as keys->dk_refcnt is already set to 1 (after memcpy). */ - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif return (PyObject *)new; } @@ -1249,13 +1270,18 @@ dictresize(PyDictObject *mp, Py_ssize_t minsize) assert(oldkeys->dk_lookup != lookdict_split); assert(oldkeys->dk_refcnt == 1); +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif +#if PyDict_MAXFREELIST > 0 if (oldkeys->dk_size == PyDict_MINSIZE && - numfreekeys < PyDict_MAXFREELIST) { - _Py_DEC_REFTOTAL; + numfreekeys < PyDict_MAXFREELIST) + { keys_free_list[numfreekeys++] = oldkeys; } - else { - _Py_DEC_REFTOTAL; + else +#endif + { PyObject_FREE(oldkeys); } } @@ -1460,7 +1486,9 @@ _PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key) kv = _PyUnicode_FromId(key); /* borrowed */ if (kv == NULL) return NULL; - return PyDict_GetItemWithError(dp, kv); + Py_hash_t hash = ((PyASCIIObject *) kv)->hash; + assert (hash != -1); /* interned strings have their hash value initialised */ + return _PyDict_GetItem_KnownHash(dp, kv, hash); } PyObject * @@ -1997,10 +2025,15 @@ dict_dealloc(PyDictObject *mp) assert(keys->dk_refcnt == 1); dictkeys_decref(keys); } - if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type) +#if PyDict_MAXFREELIST > 0 + if (numfree < PyDict_MAXFREELIST && Py_IS_TYPE(mp, &PyDict_Type)) { free_list[numfree++] = mp; + } else +#endif + { Py_TYPE(mp)->tp_free((PyObject *)mp); + } Py_TRASHCAN_END } @@ -2117,8 +2150,7 @@ dict_subscript(PyDictObject *mp, PyObject *key) _Py_IDENTIFIER(__missing__); missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__); if (missing != NULL) { - res = PyObject_CallFunctionObjArgs(missing, - key, NULL); + res = PyObject_CallOneArg(missing, key); Py_DECREF(missing); return res; } @@ -2311,6 +2343,25 @@ dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value) return _PyDict_FromKeys((PyObject *)type, iterable, value); } +/* Single-arg dict update; used by dict_update_common and operators. */ +static int +dict_update_arg(PyObject *self, PyObject *arg) +{ + if (PyDict_CheckExact(arg)) { + return PyDict_Merge(self, arg, 1); + } + _Py_IDENTIFIER(keys); + PyObject *func; + if (_PyObject_LookupAttrId(arg, &PyId_keys, &func) < 0) { + return -1; + } + if (func != NULL) { + Py_DECREF(func); + return PyDict_Merge(self, arg, 1); + } + return PyDict_MergeFromSeq2(self, arg, 1); +} + static int dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, const char *methname) @@ -2322,18 +2373,7 @@ dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, result = -1; } else if (arg != NULL) { - _Py_IDENTIFIER(keys); - PyObject *func; - if (_PyObject_LookupAttrId(arg, &PyId_keys, &func) < 0) { - result = -1; - } - else if (func != NULL) { - Py_DECREF(func); - result = PyDict_Merge(self, arg, 1); - } - else { - result = PyDict_MergeFromSeq2(self, arg, 1); - } + result = dict_update_arg(self, arg); } if (result == 0 && kwds != NULL) { @@ -2993,37 +3033,23 @@ dict_clear(PyDictObject *mp, PyObject *Py_UNUSED(ignored)) Py_RETURN_NONE; } -/* -We don't use Argument Clinic for dict.pop because it doesn't support -custom signature for now. -*/ -PyDoc_STRVAR(dict_pop__doc__, -"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\ -If key is not found, d is returned if given, otherwise KeyError is raised"); +/*[clinic input] +dict.pop + + key: object + default: object = NULL + / + +D.pop(k[,d]) -> v, remove specified key and return the corresponding value. -#define DICT_POP_METHODDEF \ - {"pop", (PyCFunction)(void(*)(void))dict_pop, METH_FASTCALL, dict_pop__doc__}, +If key is not found, default is returned if given, otherwise KeyError is raised +[clinic start generated code]*/ static PyObject * -dict_pop(PyDictObject *self, PyObject *const *args, Py_ssize_t nargs) +dict_pop_impl(PyDictObject *self, PyObject *key, PyObject *default_value) +/*[clinic end generated code: output=3abb47b89f24c21c input=eeebec7812190348]*/ { - PyObject *return_value = NULL; - PyObject *key; - PyObject *default_value = NULL; - - if (!_PyArg_CheckPositional("pop", nargs, 1, 2)) { - goto exit; - } - key = args[0]; - if (nargs < 2) { - goto skip_optional; - } - default_value = args[1]; -skip_optional: - return_value = _PyDict_Pop((PyObject*)self, key, default_value); - -exit: - return return_value; + return _PyDict_Pop((PyObject*)self, key, default_value); } /*[clinic input] @@ -3169,6 +3195,33 @@ dict_sizeof(PyDictObject *mp, PyObject *Py_UNUSED(ignored)) return PyLong_FromSsize_t(_PyDict_SizeOf(mp)); } +static PyObject * +dict_or(PyObject *self, PyObject *other) +{ + if (!PyDict_Check(self) || !PyDict_Check(other)) { + Py_RETURN_NOTIMPLEMENTED; + } + PyObject *new = PyDict_Copy(self); + if (new == NULL) { + return NULL; + } + if (dict_update_arg(new, other)) { + Py_DECREF(new); + return NULL; + } + return new; +} + +static PyObject * +dict_ior(PyObject *self, PyObject *other) +{ + if (dict_update_arg(self, other)) { + return NULL; + } + Py_INCREF(self); + return self; +} + PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]"); PyDoc_STRVAR(sizeof__doc__, @@ -3222,6 +3275,7 @@ static PyMethodDef mapp_methods[] = { {"copy", (PyCFunction)dict_copy, METH_NOARGS, copy__doc__}, DICT___REVERSED___METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -3274,6 +3328,11 @@ static PySequenceMethods dict_as_sequence = { 0, /* sq_inplace_repeat */ }; +static PyNumberMethods dict_as_number = { + .nb_or = dict_or, + .nb_inplace_or = dict_ior, +}; + static PyObject * dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { @@ -3307,6 +3366,38 @@ dict_init(PyObject *self, PyObject *args, PyObject *kwds) return dict_update_common(self, args, kwds, "dict"); } +static PyObject * +dict_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + assert(PyType_Check(type)); + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("dict", nargs, 0, 1)) { + return NULL; + } + + PyObject *self = dict_new((PyTypeObject *)type, NULL, NULL); + if (self == NULL) { + return NULL; + } + if (nargs == 1) { + if (dict_update_arg(self, args[0]) < 0) { + Py_DECREF(self); + return NULL; + } + args++; + } + if (kwnames != NULL) { + for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(kwnames); i++) { + if (PyDict_SetItem(self, PyTuple_GET_ITEM(kwnames, i), args[i]) < 0) { + Py_DECREF(self); + return NULL; + } + } + } + return self; +} + static PyObject * dict_iter(PyDictObject *dict) { @@ -3335,7 +3426,7 @@ PyTypeObject PyDict_Type = { 0, /* tp_setattr */ 0, /* tp_as_async */ (reprfunc)dict_repr, /* tp_repr */ - 0, /* tp_as_number */ + &dict_as_number, /* tp_as_number */ &dict_as_sequence, /* tp_as_sequence */ &dict_as_mapping, /* tp_as_mapping */ PyObject_HashNotImplemented, /* tp_hash */ @@ -3365,6 +3456,7 @@ PyTypeObject PyDict_Type = { PyType_GenericAlloc, /* tp_alloc */ dict_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ + .tp_vectorcall = dict_vectorcall, }; PyObject * @@ -3864,15 +3956,15 @@ dictreviter_iternext(dictiterobject *di) di->di_pos = i-1; di->len--; - if (Py_TYPE(di) == &PyDictRevIterKey_Type) { + if (Py_IS_TYPE(di, &PyDictRevIterKey_Type)) { Py_INCREF(key); return key; } - else if (Py_TYPE(di) == &PyDictRevIterValue_Type) { + else if (Py_IS_TYPE(di, &PyDictRevIterValue_Type)) { Py_INCREF(value); return value; } - else if (Py_TYPE(di) == &PyDictRevIterItem_Type) { + else if (Py_IS_TYPE(di, &PyDictRevIterItem_Type)) { Py_INCREF(key); Py_INCREF(value); result = di->di_result; @@ -4015,7 +4107,7 @@ _PyDictView_New(PyObject *dict, PyTypeObject *type) /* XXX Get rid of this restriction later */ PyErr_Format(PyExc_TypeError, "%s() requires a dict argument, not '%s'", - type->tp_name, dict->ob_type->tp_name); + type->tp_name, Py_TYPE(dict)->tp_name); return NULL; } dv = PyObject_GC_New(_PyDictViewObject, type); @@ -4174,17 +4266,34 @@ static PySequenceMethods dictkeys_as_sequence = { (objobjproc)dictkeys_contains, /* sq_contains */ }; +// Create an set object from dictviews object. +// Returns a new reference. +// This utility function is used by set operations. static PyObject* -dictviews_sub(PyObject* self, PyObject *other) -{ - PyObject *result = PySet_New(self); - PyObject *tmp; - _Py_IDENTIFIER(difference_update); +dictviews_to_set(PyObject *self) +{ + PyObject *left = self; + if (PyDictKeys_Check(self)) { + // PySet_New() has fast path for the dict object. + PyObject *dict = (PyObject *)((_PyDictViewObject *)self)->dv_dict; + if (PyDict_CheckExact(dict)) { + left = dict; + } + } + return PySet_New(left); +} - if (result == NULL) +static PyObject* +dictviews_sub(PyObject *self, PyObject *other) +{ + PyObject *result = dictviews_to_set(self); + if (result == NULL) { return NULL; + } - tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL); + _Py_IDENTIFIER(difference_update); + PyObject *tmp = _PyObject_CallMethodIdOneArg( + result, &PyId_difference_update, other); if (tmp == NULL) { Py_DECREF(result); return NULL; @@ -4194,57 +4303,120 @@ dictviews_sub(PyObject* self, PyObject *other) return result; } -PyObject* +static int +dictitems_contains(_PyDictViewObject *dv, PyObject *obj); + +PyObject * _PyDictView_Intersect(PyObject* self, PyObject *other) { - PyObject *result = PySet_New(self); - PyObject *tmp; - _Py_IDENTIFIER(intersection_update); + PyObject *result; + PyObject *it; + PyObject *key; + Py_ssize_t len_self; + int rv; + int (*dict_contains)(_PyDictViewObject *, PyObject *); + + /* Python interpreter swaps parameters when dict view + is on right side of & */ + if (!PyDictViewSet_Check(self)) { + PyObject *tmp = other; + other = self; + self = tmp; + } + + len_self = dictview_len((_PyDictViewObject *)self); + + /* if other is a set and self is smaller than other, + reuse set intersection logic */ + if (Py_IS_TYPE(other, &PySet_Type) && len_self <= PyObject_Size(other)) { + _Py_IDENTIFIER(intersection); + return _PyObject_CallMethodIdObjArgs(other, &PyId_intersection, self, NULL); + } + + /* if other is another dict view, and it is bigger than self, + swap them */ + if (PyDictViewSet_Check(other)) { + Py_ssize_t len_other = dictview_len((_PyDictViewObject *)other); + if (len_other > len_self) { + PyObject *tmp = other; + other = self; + self = tmp; + } + } + /* at this point, two things should be true + 1. self is a dictview + 2. if other is a dictview then it is smaller than self */ + result = PySet_New(NULL); if (result == NULL) return NULL; - tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL); - if (tmp == NULL) { + it = PyObject_GetIter(other); + if (it == NULL) { Py_DECREF(result); return NULL; } - Py_DECREF(tmp); + if (PyDictKeys_Check(self)) { + dict_contains = dictkeys_contains; + } + /* else PyDictItems_Check(self) */ + else { + dict_contains = dictitems_contains; + } + + while ((key = PyIter_Next(it)) != NULL) { + rv = dict_contains((_PyDictViewObject *)self, key); + if (rv < 0) { + goto error; + } + if (rv) { + if (PySet_Add(result, key)) { + goto error; + } + } + Py_DECREF(key); + } + Py_DECREF(it); + if (PyErr_Occurred()) { + Py_DECREF(result); + return NULL; + } return result; + +error: + Py_DECREF(it); + Py_DECREF(result); + Py_DECREF(key); + return NULL; } static PyObject* dictviews_or(PyObject* self, PyObject *other) { - PyObject *result = PySet_New(self); - PyObject *tmp; - _Py_IDENTIFIER(update); - - if (result == NULL) + PyObject *result = dictviews_to_set(self); + if (result == NULL) { return NULL; + } - tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL); - if (tmp == NULL) { + if (_PySet_Update(result, other) < 0) { Py_DECREF(result); return NULL; } - - Py_DECREF(tmp); return result; } static PyObject* dictviews_xor(PyObject* self, PyObject *other) { - PyObject *result = PySet_New(self); - PyObject *tmp; - _Py_IDENTIFIER(symmetric_difference_update); - - if (result == NULL) + PyObject *result = dictviews_to_set(self); + if (result == NULL) { return NULL; + } - tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL); + _Py_IDENTIFIER(symmetric_difference_update); + PyObject *tmp = _PyObject_CallMethodIdOneArg( + result, &PyId_symmetric_difference_update, other); if (tmp == NULL) { Py_DECREF(result); return NULL; @@ -4417,7 +4589,7 @@ dictitems_contains(_PyDictViewObject *dv, PyObject *obj) return 0; } Py_INCREF(found); - result = PyObject_RichCompareBool(value, found, Py_EQ); + result = PyObject_RichCompareBool(found, value, Py_EQ); Py_DECREF(found); return result; } diff --git a/Objects/enumobject.c b/Objects/enumobject.c index 4786297c..4a83bb45 100644 --- a/Objects/enumobject.c +++ b/Objects/enumobject.c @@ -122,7 +122,7 @@ enum_next_long(enumobject *en, PyObject* next_item) } en->en_longindex = stepped_up; - if (result->ob_refcnt == 1) { + if (Py_REFCNT(result) == 1) { Py_INCREF(result); old_index = PyTuple_GET_ITEM(result, 0); old_item = PyTuple_GET_ITEM(result, 1); @@ -167,7 +167,7 @@ enum_next(enumobject *en) } en->en_index++; - if (result->ob_refcnt == 1) { + if (Py_REFCNT(result) == 1) { Py_INCREF(result); old_index = PyTuple_GET_ITEM(result, 0); old_item = PyTuple_GET_ITEM(result, 1); @@ -201,6 +201,8 @@ PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); static PyMethodDef enum_methods[] = { {"__reduce__", (PyCFunction)enum_reduce, METH_NOARGS, reduce_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 8bcf76ff..e44ce727 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -8,10 +8,8 @@ #include #include "pycore_initconfig.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "structmember.h" -#include "osdefs.h" +#include "structmember.h" // PyMemberDef +#include "osdefs.h" // SEP /* Compatibility aliases */ @@ -306,22 +304,33 @@ static PyGetSetDef BaseException_getset[] = { }; +static inline PyBaseExceptionObject* +_PyBaseExceptionObject_cast(PyObject *exc) +{ + assert(PyExceptionInstance_Check(exc)); + return (PyBaseExceptionObject *)exc; +} + + PyObject * -PyException_GetTraceback(PyObject *self) { - PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self; +PyException_GetTraceback(PyObject *self) +{ + PyBaseExceptionObject *base_self = _PyBaseExceptionObject_cast(self); Py_XINCREF(base_self->traceback); return base_self->traceback; } int -PyException_SetTraceback(PyObject *self, PyObject *tb) { - return BaseException_set_tb((PyBaseExceptionObject *)self, tb, NULL); +PyException_SetTraceback(PyObject *self, PyObject *tb) +{ + return BaseException_set_tb(_PyBaseExceptionObject_cast(self), tb, NULL); } PyObject * -PyException_GetCause(PyObject *self) { - PyObject *cause = ((PyBaseExceptionObject *)self)->cause; +PyException_GetCause(PyObject *self) +{ + PyObject *cause = _PyBaseExceptionObject_cast(self)->cause; Py_XINCREF(cause); return cause; } @@ -330,13 +339,15 @@ PyException_GetCause(PyObject *self) { void PyException_SetCause(PyObject *self, PyObject *cause) { - ((PyBaseExceptionObject *)self)->suppress_context = 1; - Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause); + PyBaseExceptionObject *base_self = _PyBaseExceptionObject_cast(self); + base_self->suppress_context = 1; + Py_XSETREF(base_self->cause, cause); } PyObject * -PyException_GetContext(PyObject *self) { - PyObject *context = ((PyBaseExceptionObject *)self)->context; +PyException_GetContext(PyObject *self) +{ + PyObject *context = _PyBaseExceptionObject_cast(self)->context; Py_XINCREF(context); return context; } @@ -345,7 +356,7 @@ PyException_GetContext(PyObject *self) { void PyException_SetContext(PyObject *self, PyObject *context) { - Py_XSETREF(((PyBaseExceptionObject *)self)->context, context); + Py_XSETREF(_PyBaseExceptionObject_cast(self)->context, context); } #undef PyExceptionClass_Name @@ -353,6 +364,7 @@ PyException_SetContext(PyObject *self, PyObject *context) const char * PyExceptionClass_Name(PyObject *ob) { + assert(PyExceptionClass_Check(ob)); return ((PyTypeObject*)ob)->tp_name; } @@ -405,7 +417,7 @@ static PyTypeObject _PyExc_BaseException = { BaseException_new, /* tp_new */ }; /* the CPython API expects exceptions to be (PyObject *) - both a hold-over -from the previous implmentation and also allowing Python objects to be used +from the previous implementation and also allowing Python objects to be used in the API */ PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException; @@ -875,7 +887,7 @@ oserror_init(PyOSErrorObject *self, PyObject **p_args, /* self->filename will remain Py_None otherwise */ if (filename && filename != Py_None) { - if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError && + if (Py_IS_TYPE(self, (PyTypeObject *) PyExc_BlockingIOError) && PyNumber_Check(filename)) { /* BlockingIOError's 3rd argument can be the number of * characters written. @@ -1379,7 +1391,7 @@ SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds) * Only applies to SyntaxError instances, not to subclasses such * as TabError or IndentationError (see issue #31161) */ - if ((PyObject*)Py_TYPE(self) == PyExc_SyntaxError && + if (Py_IS_TYPE(self, (PyTypeObject *)PyExc_SyntaxError) && self->text && PyUnicode_Check(self->text) && _report_missing_parentheses(self) < 0) { return -1; @@ -1428,7 +1440,7 @@ my_basename(PyObject *name) { Py_ssize_t i, size, offset; int kind; - void *data; + const void *data; if (PyUnicode_READY(name)) return NULL; @@ -1437,11 +1449,13 @@ my_basename(PyObject *name) size = PyUnicode_GET_LENGTH(name); offset = 0; for(i=0; i < size; i++) { - if (PyUnicode_READ(kind, data, i) == SEP) + if (PyUnicode_READ(kind, data, i) == SEP) { offset = i + 1; + } } - if (offset != 0) + if (offset != 0) { return PyUnicode_Substring(name, offset, size); + } else { Py_INCREF(name); return name; @@ -2295,9 +2309,8 @@ MemoryError_dealloc(PyBaseExceptionObject *self) { BaseException_clear(self); - if (Py_TYPE(self) != (PyTypeObject *)PyExc_MemoryError) { - Py_TYPE(self)->tp_free((PyObject *)self); - return; + if (!Py_IS_TYPE(self, (PyTypeObject *) PyExc_MemoryError)) { + return Py_TYPE(self)->tp_free((PyObject *)self); } _PyObject_GC_UNTRACK(self); @@ -2964,7 +2977,7 @@ _check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start) static PyObject *exec_prefix = NULL; Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text), match; int kind = PyUnicode_KIND(self->text); - void *data = PyUnicode_DATA(self->text); + const void *data = PyUnicode_DATA(self->text); /* Ignore leading whitespace */ while (start < text_len) { diff --git a/Objects/fileobject.c b/Objects/fileobject.c index dd42d516..1c6ecaf8 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -2,7 +2,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_runtime.h" // _PyRuntime #if defined(HAVE_GETC_UNLOCKED) && !defined(_Py_MEMORY_SANITIZER) /* clang MemorySanitizer doesn't yet understand getc_unlocked. */ @@ -25,6 +25,8 @@ extern "C" { #endif +_Py_IDENTIFIER(open); + /* External C interface */ PyObject * @@ -32,15 +34,14 @@ PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const c const char *errors, const char *newline, int closefd) { PyObject *io, *stream; - _Py_IDENTIFIER(open); /* 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, + stream = _PyObject_CallMethodId(io, &PyId_open, "isisssO", fd, mode, buffering, encoding, errors, - newline, closefd); + newline, closefd ? Py_True : Py_False); Py_DECREF(io); if (stream == NULL) return NULL; @@ -61,7 +62,7 @@ PyFile_GetLine(PyObject *f, int n) } if (n <= 0) { - result = _PyObject_CallMethodIdObjArgs(f, &PyId_readline, NULL); + result = _PyObject_CallMethodIdNoArgs(f, &PyId_readline); } else { result = _PyObject_CallMethodId(f, &PyId_readline, "i", n); @@ -75,7 +76,7 @@ PyFile_GetLine(PyObject *f, int n) } if (n < 0 && result != NULL && PyBytes_Check(result)) { - char *s = PyBytes_AS_STRING(result); + const char *s = PyBytes_AS_STRING(result); Py_ssize_t len = PyBytes_GET_SIZE(result); if (len == 0) { Py_DECREF(result); @@ -84,7 +85,7 @@ PyFile_GetLine(PyObject *f, int n) "EOF when reading a line"); } else if (s[len-1] == '\n') { - if (result->ob_refcnt == 1) + if (Py_REFCNT(result) == 1) _PyBytes_Resize(&result, len-1); else { PyObject *v; @@ -136,7 +137,7 @@ PyFile_WriteObject(PyObject *v, PyObject *f, int flags) Py_DECREF(writer); return -1; } - result = PyObject_CallFunctionObjArgs(writer, value, NULL); + result = PyObject_CallOneArg(writer, value); Py_DECREF(value); Py_DECREF(writer); if (result == NULL) @@ -547,7 +548,6 @@ 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'", diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 609f66f8..9f501409 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -4,6 +4,7 @@ for any kind of float exception without losing portability. */ #include "Python.h" +#include "pycore_dtoa.h" #include #include @@ -221,7 +222,7 @@ float_dealloc(PyFloatObject *op) return; } numfree++; - Py_TYPE(op) = (struct _typeobject *)free_list; + Py_SET_TYPE(op, (PyTypeObject *)free_list); free_list = op; } else @@ -256,7 +257,7 @@ PyFloat_AsDouble(PyObject *op) return val; } PyErr_Format(PyExc_TypeError, "must be real number, not %.50s", - op->ob_type->tp_name); + Py_TYPE(op)->tp_name); return -1; } @@ -268,7 +269,7 @@ PyFloat_AsDouble(PyObject *op) if (!PyFloat_Check(res)) { PyErr_Format(PyExc_TypeError, "%.50s.__float__ returned non-float (type %.50s)", - op->ob_type->tp_name, res->ob_type->tp_name); + Py_TYPE(op)->tp_name, Py_TYPE(res)->tp_name); Py_DECREF(res); return -1; } @@ -276,7 +277,7 @@ PyFloat_AsDouble(PyObject *op) "%.50s.__float__ returned non-float (type %.50s). " "The ability to return an instance of a strict subclass of float " "is deprecated, and may be removed in a future version of Python.", - op->ob_type->tp_name, res->ob_type->tp_name)) { + Py_TYPE(op)->tp_name, Py_TYPE(res)->tp_name)) { Py_DECREF(res); return -1; } @@ -506,7 +507,6 @@ float_richcompare(PyObject *v, PyObject *w, int op) goto Unimplemented; Compare: - PyFPE_START_PROTECT("richcompare", return NULL) switch (op) { case Py_EQ: r = i == j; @@ -527,7 +527,6 @@ float_richcompare(PyObject *v, PyObject *w, int op) r = i > j; break; } - PyFPE_END_PROTECT(r) return PyBool_FromLong(r); Unimplemented: @@ -546,9 +545,7 @@ float_add(PyObject *v, PyObject *w) double a,b; CONVERT_TO_DOUBLE(v, a); CONVERT_TO_DOUBLE(w, b); - PyFPE_START_PROTECT("add", return 0) a = a + b; - PyFPE_END_PROTECT(a) return PyFloat_FromDouble(a); } @@ -558,9 +555,7 @@ float_sub(PyObject *v, PyObject *w) double a,b; CONVERT_TO_DOUBLE(v, a); CONVERT_TO_DOUBLE(w, b); - PyFPE_START_PROTECT("subtract", return 0) a = a - b; - PyFPE_END_PROTECT(a) return PyFloat_FromDouble(a); } @@ -570,9 +565,7 @@ float_mul(PyObject *v, PyObject *w) double a,b; CONVERT_TO_DOUBLE(v, a); CONVERT_TO_DOUBLE(w, b); - PyFPE_START_PROTECT("multiply", return 0) a = a * b; - PyFPE_END_PROTECT(a) return PyFloat_FromDouble(a); } @@ -587,9 +580,7 @@ float_div(PyObject *v, PyObject *w) "float division by zero"); return NULL; } - PyFPE_START_PROTECT("divide", return 0) a = a / b; - PyFPE_END_PROTECT(a) return PyFloat_FromDouble(a); } @@ -605,7 +596,6 @@ float_rem(PyObject *v, PyObject *w) "float modulo"); return NULL; } - PyFPE_START_PROTECT("modulo", return 0) mod = fmod(vx, wx); if (mod) { /* ensure the remainder has the same sign as the denominator */ @@ -619,34 +609,25 @@ float_rem(PyObject *v, PyObject *w) it has the same sign as the denominator. */ mod = copysign(0.0, wx); } - PyFPE_END_PROTECT(mod) return PyFloat_FromDouble(mod); } -static PyObject * -float_divmod(PyObject *v, PyObject *w) +static void +_float_div_mod(double vx, double wx, double *floordiv, double *mod) { - double vx, wx; - double div, mod, floordiv; - CONVERT_TO_DOUBLE(v, vx); - CONVERT_TO_DOUBLE(w, wx); - if (wx == 0.0) { - PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); - return NULL; - } - PyFPE_START_PROTECT("divmod", return 0) - mod = fmod(vx, wx); + double div; + *mod = fmod(vx, wx); /* fmod is typically exact, so vx-mod is *mathematically* an exact multiple of wx. But this is fp arithmetic, and fp vx - mod is an approximation; the result is that div may not be an exact integral value after the division, although it will always be very close to one. */ - div = (vx - mod) / wx; - if (mod) { + div = (vx - *mod) / wx; + if (*mod) { /* ensure the remainder has the same sign as the denominator */ - if ((wx < 0) != (mod < 0)) { - mod += wx; + if ((wx < 0) != (*mod < 0)) { + *mod += wx; div -= 1.0; } } @@ -654,35 +635,49 @@ float_divmod(PyObject *v, PyObject *w) /* the remainder is zero, and in the presence of signed zeroes fmod returns different results across platforms; ensure it has the same sign as the denominator. */ - mod = copysign(0.0, wx); + *mod = copysign(0.0, wx); } /* snap quotient to nearest integral value */ if (div) { - floordiv = floor(div); - if (div - floordiv > 0.5) - floordiv += 1.0; + *floordiv = floor(div); + if (div - *floordiv > 0.5) { + *floordiv += 1.0; + } } else { /* div is zero - get the same sign as the true quotient */ - floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */ + *floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */ + } +} + +static PyObject * +float_divmod(PyObject *v, PyObject *w) +{ + double vx, wx; + double mod, floordiv; + CONVERT_TO_DOUBLE(v, vx); + CONVERT_TO_DOUBLE(w, wx); + if (wx == 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); + return NULL; } - PyFPE_END_PROTECT(floordiv) + _float_div_mod(vx, wx, &floordiv, &mod); return Py_BuildValue("(dd)", floordiv, mod); } static PyObject * float_floor_div(PyObject *v, PyObject *w) { - PyObject *t, *r; - - t = float_divmod(v, w); - if (t == NULL || t == Py_NotImplemented) - return t; - assert(PyTuple_CheckExact(t)); - r = PyTuple_GET_ITEM(t, 0); - Py_INCREF(r); - Py_DECREF(t); - return r; + double vx, wx; + double mod, floordiv; + CONVERT_TO_DOUBLE(v, vx); + CONVERT_TO_DOUBLE(w, wx); + if (wx == 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, "float floor division by zero"); + return NULL; + } + _float_div_mod(vx, wx, &floordiv, &mod); + return PyFloat_FromDouble(floordiv); } /* determine whether x is an odd integer or not; assumes that @@ -793,9 +788,7 @@ float_pow(PyObject *v, PyObject *w, PyObject *z) * the platform pow to step in and do the rest. */ errno = 0; - PyFPE_START_PROTECT("pow", return NULL) ix = pow(iv, iw); - PyFPE_END_PROTECT(ix) Py_ADJUST_ERANGE1(ix); if (negate_result) ix = -ix; @@ -849,9 +842,7 @@ float_is_integer_impl(PyObject *self) if (!Py_IS_FINITE(x)) Py_RETURN_FALSE; errno = 0; - PyFPE_START_PROTECT("is_integer", return NULL) o = (floor(x) == x) ? Py_True : Py_False; - PyFPE_END_PROTECT(x) if (errno != 0) { PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError : PyExc_ValueError); @@ -871,27 +862,35 @@ static PyObject * float___trunc___impl(PyObject *self) /*[clinic end generated code: output=dd3e289dd4c6b538 input=591b9ba0d650fdff]*/ { - double x = PyFloat_AsDouble(self); - double wholepart; /* integral portion of x, rounded toward 0 */ - - (void)modf(x, &wholepart); - /* Try to get out cheap if this fits in a Python int. The attempt - * to cast to long must be protected, as C doesn't define what - * happens if the double is too big to fit in a long. Some rare - * systems raise an exception then (RISCOS was mentioned as one, - * and someone using a non-default option on Sun also bumped into - * that). Note that checking for >= and <= LONG_{MIN,MAX} would - * still be vulnerable: if a long has more bits of precision than - * a double, casting MIN/MAX to double may yield an approximation, - * and if that's rounded up, then, e.g., wholepart=LONG_MAX+1 would - * yield true from the C expression wholepart<=LONG_MAX, despite - * that wholepart is actually greater than LONG_MAX. - */ - if (LONG_MIN < wholepart && wholepart < LONG_MAX) { - const long aslong = (long)wholepart; - return PyLong_FromLong(aslong); - } - return PyLong_FromDouble(wholepart); + return PyLong_FromDouble(PyFloat_AS_DOUBLE(self)); +} + +/*[clinic input] +float.__floor__ + +Return the floor as an Integral. +[clinic start generated code]*/ + +static PyObject * +float___floor___impl(PyObject *self) +/*[clinic end generated code: output=e0551dbaea8c01d1 input=77bb13eb12e268df]*/ +{ + double x = PyFloat_AS_DOUBLE(self); + return PyLong_FromDouble(floor(x)); +} + +/*[clinic input] +float.__ceil__ + +Return the ceiling as an Integral. +[clinic start generated code]*/ + +static PyObject * +float___ceil___impl(PyObject *self) +/*[clinic end generated code: output=a2fd8858f73736f9 input=79e41ae94aa0a516]*/ +{ + double x = PyFloat_AS_DOUBLE(self); + return PyLong_FromDouble(ceil(x)); } /* double_round: rounds a finite double to the closest multiple of @@ -1472,7 +1471,7 @@ float_fromhex(PyTypeObject *type, PyObject *string) goto parse_error; result = PyFloat_FromDouble(negate ? -x : x); if (type != &PyFloat_Type && result != NULL) { - Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type, result, NULL)); + Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result)); } return result; @@ -1538,9 +1537,7 @@ float_as_integer_ratio_impl(PyObject *self) return NULL; } - PyFPE_START_PROTECT("as_integer_ratio", goto error); float_part = frexp(self_double, &exponent); /* self_double == float_part * 2**exponent exactly */ - PyFPE_END_PROTECT(float_part); for (i=0; i<300 && float_part != floor(float_part) ; i++) { float_part *= 2.0; @@ -1697,7 +1694,8 @@ float___getformat___impl(PyTypeObject *type, const char *typestr) case ieee_big_endian_format: return PyUnicode_FromString("IEEE, big-endian"); default: - Py_FatalError("insane float_format or double_format"); + PyErr_SetString(PyExc_RuntimeError, + "insane float_format or double_format"); return NULL; } } @@ -1818,6 +1816,8 @@ float___format___impl(PyObject *self, PyObject *format_spec) static PyMethodDef float_methods[] = { FLOAT_CONJUGATE_METHODDEF FLOAT___TRUNC___METHODDEF + FLOAT___FLOOR___METHODDEF + FLOAT___CEIL___METHODDEF FLOAT___ROUND___METHODDEF FLOAT_AS_INTEGER_RATIO_METHODDEF FLOAT_FROMHEX_METHODDEF @@ -1978,25 +1978,22 @@ _PyFloat_Init(void) return 1; } -int -PyFloat_ClearFreeList(void) +void +_PyFloat_ClearFreeList(void) { PyFloatObject *f = free_list, *next; - int i = numfree; - while (f) { + for (; f; f = next) { next = (PyFloatObject*) Py_TYPE(f); PyObject_FREE(f); - f = next; } free_list = NULL; numfree = 0; - return i; } void -PyFloat_Fini(void) +_PyFloat_Fini(void) { - (void)PyFloat_ClearFreeList(); + _PyFloat_ClearFreeList(); } /* Print summary info about the state of the optimized allocator */ diff --git a/Objects/frameobject.c b/Objects/frameobject.c index a796a59e..a2fc0a42 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -2,12 +2,12 @@ #include "Python.h" #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() #include "code.h" #include "frameobject.h" #include "opcode.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #define OFF(x) offsetof(PyFrameObject, x) @@ -34,10 +34,13 @@ frame_getlocals(PyFrameObject *f, void *closure) int PyFrame_GetLineNumber(PyFrameObject *f) { - if (f->f_trace) + assert(f != NULL); + if (f->f_trace) { return f->f_lineno; - else + } + else { return PyCode_Addr2Line(f->f_code, f->f_lasti); + } } static PyObject * @@ -66,6 +69,245 @@ get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i) return oparg; } +typedef enum kind { + With = 1, + Loop = 2, + Try = 3, + Except = 4, +} Kind; + +#define BITS_PER_BLOCK 3 + +static inline int64_t +push_block(int64_t stack, Kind kind) +{ + assert(stack < ((int64_t)1)<<(BITS_PER_BLOCK*CO_MAXBLOCKS)); + return (stack << BITS_PER_BLOCK) | kind; +} + +static inline int64_t +pop_block(int64_t stack) +{ + assert(stack > 0); + return stack >> BITS_PER_BLOCK; +} + +static inline Kind +top_block(int64_t stack) +{ + return stack & ((1<co_code); + int64_t *blocks = PyMem_New(int64_t, len+1); + int i, j, opcode; + + if (blocks == NULL) { + PyErr_NoMemory(); + return NULL; + } + memset(blocks, -1, (len+1)*sizeof(int64_t)); + blocks[0] = 0; + int todo = 1; + while (todo) { + todo = 0; + for (i = 0; i < len; i++) { + int64_t block_stack = blocks[i]; + int64_t except_stack; + if (block_stack == -1) { + continue; + } + opcode = _Py_OPCODE(code[i]); + switch (opcode) { + case JUMP_IF_FALSE_OR_POP: + case JUMP_IF_TRUE_OR_POP: + case POP_JUMP_IF_FALSE: + case POP_JUMP_IF_TRUE: + case JUMP_IF_NOT_EXC_MATCH: + j = get_arg(code, i) / sizeof(_Py_CODEUNIT); + assert(j < len); + if (blocks[j] == -1 && j < i) { + todo = 1; + } + assert(blocks[j] == -1 || blocks[j] == block_stack); + blocks[j] = block_stack; + blocks[i+1] = block_stack; + break; + case JUMP_ABSOLUTE: + j = get_arg(code, i) / sizeof(_Py_CODEUNIT); + assert(j < len); + if (blocks[j] == -1 && j < i) { + todo = 1; + } + assert(blocks[j] == -1 || blocks[j] == block_stack); + blocks[j] = block_stack; + break; + case SETUP_FINALLY: + j = get_arg(code, i) / sizeof(_Py_CODEUNIT) + i + 1; + assert(j < len); + except_stack = push_block(block_stack, Except); + assert(blocks[j] == -1 || blocks[j] == except_stack); + blocks[j] = except_stack; + block_stack = push_block(block_stack, Try); + blocks[i+1] = block_stack; + break; + case SETUP_WITH: + case SETUP_ASYNC_WITH: + j = get_arg(code, i) / sizeof(_Py_CODEUNIT) + i + 1; + assert(j < len); + except_stack = push_block(block_stack, Except); + assert(blocks[j] == -1 || blocks[j] == except_stack); + blocks[j] = except_stack; + block_stack = push_block(block_stack, With); + blocks[i+1] = block_stack; + break; + case JUMP_FORWARD: + j = get_arg(code, i) / sizeof(_Py_CODEUNIT) + i + 1; + assert(j < len); + assert(blocks[j] == -1 || blocks[j] == block_stack); + blocks[j] = block_stack; + break; + case GET_ITER: + case GET_AITER: + block_stack = push_block(block_stack, Loop); + blocks[i+1] = block_stack; + break; + case FOR_ITER: + blocks[i+1] = block_stack; + block_stack = pop_block(block_stack); + j = get_arg(code, i) / sizeof(_Py_CODEUNIT) + i + 1; + assert(j < len); + assert(blocks[j] == -1 || blocks[j] == block_stack); + blocks[j] = block_stack; + break; + case POP_BLOCK: + case POP_EXCEPT: + block_stack = pop_block(block_stack); + blocks[i+1] = block_stack; + break; + case END_ASYNC_FOR: + block_stack = pop_block(pop_block(block_stack)); + blocks[i+1] = block_stack; + break; + case RETURN_VALUE: + case RAISE_VARARGS: + case RERAISE: + /* End of block */ + break; + default: + blocks[i+1] = block_stack; + + } + } + } + return blocks; +} + +static int +compatible_block_stack(int64_t from_stack, int64_t to_stack) +{ + if (to_stack < 0) { + return 0; + } + while(from_stack > to_stack) { + from_stack = pop_block(from_stack); + } + return from_stack == to_stack; +} + +static const char * +explain_incompatible_block_stack(int64_t to_stack) +{ + Kind target_kind = top_block(to_stack); + switch(target_kind) { + case Except: + return "can't jump into an 'except' block as there's no exception"; + case Try: + return "can't jump into the body of a try statement"; + case With: + return "can't jump into the body of a with statement"; + case Loop: + return "can't jump into the body of a for loop"; + default: + Py_UNREACHABLE(); + } +} + +static int * +marklines(PyCodeObject *code, int len) +{ + int *linestarts = PyMem_New(int, len); + if (linestarts == NULL) { + return NULL; + } + Py_ssize_t size = PyBytes_GET_SIZE(code->co_lnotab) / 2; + unsigned char *p = (unsigned char*)PyBytes_AS_STRING(code->co_lnotab); + int line = code->co_firstlineno; + int addr = 0; + int index = 0; + while (--size >= 0) { + addr += *p++; + if (index*2 < addr) { + linestarts[index++] = line; + } + while (index*2 < addr) { + linestarts[index++] = -1; + if (index >= len) { + break; + } + } + line += (signed char)*p; + p++; + } + if (index < len) { + linestarts[index++] = line; + } + while (index < len) { + linestarts[index++] = -1; + } + assert(index == len); + return linestarts; +} + +static int +first_line_not_before(int *lines, int len, int line) +{ + int result = INT_MAX; + for (int i = 0; i < len; i++) { + if (lines[i] < result && lines[i] >= line) { + result = lines[i]; + } + } + if (result == INT_MAX) { + return -1; + } + return result; +} + +static void +frame_stack_pop(PyFrameObject *f) +{ + PyObject *v = (*--f->f_stacktop); + Py_DECREF(v); +} + +static void +frame_block_unwind(PyFrameObject *f) +{ + assert(f->f_iblock > 0); + f->f_iblock--; + PyTryBlock *b = &f->f_blockstack[f->f_iblock]; + intptr_t delta = (f->f_stacktop - f->f_valuestack) - b->b_level; + while (delta > 0) { + frame_stack_pop(f); + delta--; + } +} + /* Setter for f_lineno - you can set f_lineno from within a trace function in * order to jump to a given line of code, subject to some restrictions. Most @@ -77,7 +319,8 @@ get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i) * o Lines with an 'except' statement on them can't be jumped to, because * they expect an exception to be on the top of the stack. * o Lines that live in a 'finally' block can't be jumped from or to, since - * the END_FINALLY expects to clean up the stack after the 'try' block. + * we cannot be sure which state the interpreter was in or would be in + * during execution of the finally block. * o 'try', 'with' and 'async with' blocks can't be jumped into because * the blockstack needs to be set up before their code runs. * o 'for' and 'async for' loops can't be jumped into because the @@ -89,22 +332,6 @@ get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i) static int frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignored)) { - int new_lineno = 0; /* The new value of f_lineno */ - long l_new_lineno; - int overflow; - int new_lasti = 0; /* The new value of f_lasti */ - unsigned char *code = NULL; /* The bytecode for the frame... */ - Py_ssize_t code_len = 0; /* ...and its length */ - unsigned char *lnotab = NULL; /* Iterating over co_lnotab */ - Py_ssize_t lnotab_len = 0; /* (ditto) */ - int offset = 0; /* (ditto) */ - int line = 0; /* (ditto) */ - int addr = 0; /* (ditto) */ - int delta_iblock = 0; /* Scanning the SETUPs and POPs */ - int delta = 0; - int blockstack[CO_MAXBLOCKS]; /* Walking the 'finally' blocks */ - int blockstack_top = 0; /* (ditto) */ - if (p_new_lineno == NULL) { PyErr_SetString(PyExc_AttributeError, "cannot delete attribute"); return -1; @@ -145,14 +372,18 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore return -1; } - /* Fail if the line comes before the start of the code block. */ - l_new_lineno = PyLong_AsLongAndOverflow(p_new_lineno, &overflow); + int new_lineno; + + /* Fail if the line falls outside the code block and + select first line with actual code. */ + int overflow; + long l_new_lineno = PyLong_AsLongAndOverflow(p_new_lineno, &overflow); if (overflow #if SIZEOF_LONG > SIZEOF_INT || l_new_lineno > INT_MAX || l_new_lineno < INT_MIN #endif - ) { + ) { PyErr_SetString(PyExc_ValueError, "lineno out of range"); return -1; @@ -161,173 +392,90 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore if (new_lineno < f->f_code->co_firstlineno) { PyErr_Format(PyExc_ValueError, - "line %d comes before the current code block", - new_lineno); + "line %d comes before the current code block", + new_lineno); return -1; } - else if (new_lineno == f->f_code->co_firstlineno) { - new_lasti = 0; - new_lineno = f->f_code->co_firstlineno; - } - else { - /* Find the bytecode offset for the start of the given - * line, or the first code-owning line after it. */ - char *tmp; - PyBytes_AsStringAndSize(f->f_code->co_lnotab, - &tmp, &lnotab_len); - lnotab = (unsigned char *) tmp; - addr = 0; - line = f->f_code->co_firstlineno; - new_lasti = -1; - for (offset = 0; offset < lnotab_len; offset += 2) { - addr += lnotab[offset]; - line += (signed char)lnotab[offset+1]; - if (line >= new_lineno) { - new_lasti = addr; - new_lineno = line; - break; - } - } - } - /* If we didn't reach the requested line, return an error. */ - if (new_lasti == -1) { - PyErr_Format(PyExc_ValueError, - "line %d comes after the current code block", - new_lineno); + int len = PyBytes_GET_SIZE(f->f_code->co_code)/sizeof(_Py_CODEUNIT); + int *lines = marklines(f->f_code, len); + if (lines == NULL) { return -1; } - /* We're now ready to look at the bytecode. */ - PyBytes_AsStringAndSize(f->f_code->co_code, (char **)&code, &code_len); - - /* The trace function is called with a 'return' trace event after the - * execution of a yield statement. */ - assert(f->f_lasti != -1); - if (code[f->f_lasti] == YIELD_VALUE || code[f->f_lasti] == YIELD_FROM) { - PyErr_SetString(PyExc_ValueError, - "can't jump from a yield statement"); + new_lineno = first_line_not_before(lines, len, new_lineno); + if (new_lineno < 0) { + PyErr_Format(PyExc_ValueError, + "line %d comes after the current code block", + (int)l_new_lineno); + PyMem_Free(lines); return -1; } - /* You can't jump onto a line with an 'except' statement on it - - * they expect to have an exception on the top of the stack, which - * won't be true if you jump to them. They always start with code - * that either pops the exception using POP_TOP (plain 'except:' - * lines do this) or duplicates the exception on the stack using - * DUP_TOP (if there's an exception type specified). See compile.c, - * 'com_try_except' for the full details. There aren't any other - * cases (AFAIK) where a line's code can start with DUP_TOP or - * POP_TOP, but if any ever appear, they'll be subject to the same - * restriction (but with a different error message). */ - if (code[new_lasti] == DUP_TOP || code[new_lasti] == POP_TOP) { - PyErr_SetString(PyExc_ValueError, - "can't jump to 'except' line as there's no exception"); + int64_t *blocks = markblocks(f->f_code, len); + if (blocks == NULL) { + PyMem_Free(lines); return -1; } - /* You can't jump into or out of a 'finally' block because the 'try' - * block leaves something on the stack for the END_FINALLY to clean up. - * So we walk the bytecode, maintaining a simulated blockstack. - * 'blockstack' is a stack of the bytecode addresses of the starts of - * the 'finally' blocks. */ - memset(blockstack, '\0', sizeof(blockstack)); - blockstack_top = 0; - unsigned char prevop = NOP; - for (addr = 0; addr < code_len; addr += sizeof(_Py_CODEUNIT)) { - unsigned char op = code[addr]; - switch (op) { - case SETUP_FINALLY: - case SETUP_WITH: - case SETUP_ASYNC_WITH: - case FOR_ITER: { - unsigned int oparg = get_arg((const _Py_CODEUNIT *)code, - addr / sizeof(_Py_CODEUNIT)); - int target_addr = addr + oparg + sizeof(_Py_CODEUNIT); - assert(target_addr < code_len); - /* Police block-jumping (you can't jump into the middle of a block) - * and ensure that the blockstack finishes up in a sensible state (by - * popping any blocks we're jumping out of). We look at all the - * blockstack operations between the current position and the new - * one, and keep track of how many blocks we drop out of on the way. - * By also keeping track of the lowest blockstack position we see, we - * can tell whether the jump goes into any blocks without coming out - * again - in that case we raise an exception below. */ - int first_in = addr < f->f_lasti && f->f_lasti < target_addr; - int second_in = addr < new_lasti && new_lasti < target_addr; - if (!first_in && second_in) { - PyErr_SetString(PyExc_ValueError, - "can't jump into the middle of a block"); - return -1; + int64_t target_block_stack = -1; + int64_t best_block_stack = -1; + int best_addr = -1; + int64_t start_block_stack = blocks[f->f_lasti/sizeof(_Py_CODEUNIT)]; + const char *msg = "cannot find bytecode for specified line"; + for (int i = 0; i < len; i++) { + if (lines[i] == new_lineno) { + target_block_stack = blocks[i]; + if (compatible_block_stack(start_block_stack, target_block_stack)) { + msg = NULL; + if (target_block_stack > best_block_stack) { + best_block_stack = target_block_stack; + best_addr = i*sizeof(_Py_CODEUNIT); + } } - int in_for_loop = op == FOR_ITER || code[target_addr] == END_ASYNC_FOR; - if (first_in && !second_in) { - if (!delta_iblock) { - if (in_for_loop) { - /* Pop the iterators of any 'for' and 'async for' loop - * we're jumping out of. */ - delta++; - } - else if (prevop == LOAD_CONST) { - /* Pops None pushed before SETUP_FINALLY. */ - delta++; - } + else if (msg) { + if (target_block_stack >= 0) { + msg = explain_incompatible_block_stack(target_block_stack); } - if (!in_for_loop) { - delta_iblock++; + else { + msg = "code may be unreachable."; } } - if (!in_for_loop) { - blockstack[blockstack_top++] = target_addr; - } - break; } + } + PyMem_Free(blocks); + PyMem_Free(lines); + if (msg != NULL) { + PyErr_SetString(PyExc_ValueError, msg); + return -1; + } - case END_FINALLY: { - assert(blockstack_top > 0); - int target_addr = blockstack[--blockstack_top]; - assert(target_addr <= addr); - int first_in = target_addr <= f->f_lasti && f->f_lasti <= addr; - int second_in = target_addr <= new_lasti && new_lasti <= addr; - if (first_in != second_in) { - op = code[target_addr]; - PyErr_Format(PyExc_ValueError, - "can't jump %s %s block", - second_in ? "into" : "out of", - (op == DUP_TOP || op == POP_TOP) ? - "an 'except'" : "a 'finally'"); - return -1; - } + /* Unwind block stack. */ + while (start_block_stack > best_block_stack) { + Kind kind = top_block(start_block_stack); + switch(kind) { + case Loop: + frame_stack_pop(f); break; + case Try: + frame_block_unwind(f); + break; + case With: + frame_block_unwind(f); + // Pop the exit function + frame_stack_pop(f); + break; + case Except: + PyErr_SetString(PyExc_ValueError, + "can't jump out of an 'except' block"); + return -1; } - } - prevop = op; - } - - /* Verify that the blockstack tracking code didn't get lost. */ - assert(blockstack_top == 0); - - /* Pop any blocks that we're jumping out of. */ - if (delta_iblock > 0) { - f->f_iblock -= delta_iblock; - PyTryBlock *b = &f->f_blockstack[f->f_iblock]; - delta += (int)(f->f_stacktop - f->f_valuestack) - b->b_level; - if (b->b_type == SETUP_FINALLY && - code[b->b_handler] == WITH_CLEANUP_START) - { - /* Pop the exit function. */ - delta++; - } - } - while (delta > 0) { - PyObject *v = (*--f->f_stacktop); - Py_DECREF(v); - delta--; + start_block_stack = pop_block(start_block_stack); } /* Finally set the new f_lineno and f_lasti and return OK. */ f->f_lineno = new_lineno; - f->f_lasti = new_lasti; + f->f_lasti = best_addr; return 0; } @@ -408,11 +556,13 @@ static PyGetSetDef frame_getsetlist[] = { free_list. Else programs creating lots of cyclic trash involving frames could provoke free_list into growing without bound. */ +/* max value for numfree */ +#define PyFrame_MAXFREELIST 200 +#if PyFrame_MAXFREELIST > 0 static PyFrameObject *free_list = NULL; static int numfree = 0; /* number of frames currently in free_list */ -/* max value for numfree */ -#define PyFrame_MAXFREELIST 200 +#endif static void _Py_HOT_FUNCTION frame_dealloc(PyFrameObject *f) @@ -442,26 +592,36 @@ frame_dealloc(PyFrameObject *f) Py_CLEAR(f->f_trace); co = f->f_code; - if (co->co_zombieframe == NULL) + if (co->co_zombieframe == NULL) { co->co_zombieframe = f; + } +#if PyFrame_MAXFREELIST > 0 else if (numfree < PyFrame_MAXFREELIST) { ++numfree; f->f_back = free_list; free_list = f; } - else +#endif + else { PyObject_GC_Del(f); + } Py_DECREF(co); Py_TRASHCAN_SAFE_END(f) } +static inline Py_ssize_t +frame_nslots(PyFrameObject *frame) +{ + PyCodeObject *code = frame->f_code; + return (code->co_nlocals + + PyTuple_GET_SIZE(code->co_cellvars) + + PyTuple_GET_SIZE(code->co_freevars)); +} + static int frame_traverse(PyFrameObject *f, visitproc visit, void *arg) { - PyObject **fastlocals, **p; - Py_ssize_t i, slots; - Py_VISIT(f->f_back); Py_VISIT(f->f_code); Py_VISIT(f->f_builtins); @@ -470,15 +630,16 @@ frame_traverse(PyFrameObject *f, visitproc visit, void *arg) Py_VISIT(f->f_trace); /* locals */ - slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars); - fastlocals = f->f_localsplus; - for (i = slots; --i >= 0; ++fastlocals) + PyObject **fastlocals = f->f_localsplus; + for (Py_ssize_t i = frame_nslots(f); --i >= 0; ++fastlocals) { Py_VISIT(*fastlocals); + } /* stack */ if (f->f_stacktop != NULL) { - for (p = f->f_valuestack; p < f->f_stacktop; p++) + for (PyObject **p = f->f_valuestack; p < f->f_stacktop; p++) { Py_VISIT(*p); + } } return 0; } @@ -486,30 +647,28 @@ frame_traverse(PyFrameObject *f, visitproc visit, void *arg) static int frame_tp_clear(PyFrameObject *f) { - PyObject **fastlocals, **p, **oldtop; - Py_ssize_t i, slots; - /* Before anything else, make sure that this frame is clearly marked * as being defunct! Else, e.g., a generator reachable from this * frame may also point to this frame, believe itself to still be * active, and try cleaning up this frame again. */ - oldtop = f->f_stacktop; + PyObject **oldtop = f->f_stacktop; f->f_stacktop = NULL; f->f_executing = 0; Py_CLEAR(f->f_trace); /* locals */ - slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars); - fastlocals = f->f_localsplus; - for (i = slots; --i >= 0; ++fastlocals) + PyObject **fastlocals = f->f_localsplus; + for (Py_ssize_t i = frame_nslots(f); --i >= 0; ++fastlocals) { Py_CLEAR(*fastlocals); + } /* stack */ if (oldtop != NULL) { - for (p = f->f_valuestack; p < oldtop; p++) + for (PyObject **p = f->f_valuestack; p < oldtop; p++) { Py_CLEAR(*p); + } } return 0; } @@ -538,10 +697,10 @@ frame_sizeof(PyFrameObject *f, PyObject *Py_UNUSED(ignored)) { Py_ssize_t res, extras, ncells, nfrees; - ncells = PyTuple_GET_SIZE(f->f_code->co_cellvars); - nfrees = PyTuple_GET_SIZE(f->f_code->co_freevars); - extras = f->f_code->co_stacksize + f->f_code->co_nlocals + - ncells + nfrees; + PyCodeObject *code = f->f_code; + ncells = PyTuple_GET_SIZE(code->co_cellvars); + nfrees = PyTuple_GET_SIZE(code->co_freevars); + extras = code->co_stacksize + code->co_nlocals + ncells + nfrees; /* subtract one as it is already included in PyFrameObject */ res = sizeof(PyFrameObject) + (extras-1) * sizeof(PyObject *); @@ -555,9 +714,10 @@ static PyObject * frame_repr(PyFrameObject *f) { int lineno = PyFrame_GetLineNumber(f); + PyCodeObject *code = f->f_code; return PyUnicode_FromFormat( "", - f, f->f_code->co_filename, lineno, f->f_code->co_name); + f, code->co_filename, lineno, code->co_name); } static PyMethodDef frame_methods[] = { @@ -605,98 +765,127 @@ PyTypeObject PyFrame_Type = { _Py_IDENTIFIER(__builtins__); -PyFrameObject* _Py_HOT_FUNCTION -_PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, - PyObject *globals, PyObject *locals) +static inline PyFrameObject* +frame_alloc(PyCodeObject *code) { - PyFrameObject *back = tstate->frame; PyFrameObject *f; - PyObject *builtins; - Py_ssize_t i; -#ifdef Py_DEBUG - if (code == NULL || globals == NULL || !PyDict_Check(globals) || - (locals != NULL && !PyMapping_Check(locals))) { - PyErr_BadInternalCall(); - return NULL; + f = code->co_zombieframe; + if (f != NULL) { + code->co_zombieframe = NULL; + _Py_NewReference((PyObject *)f); + assert(f->f_code == code); + return f; } + + Py_ssize_t ncells = PyTuple_GET_SIZE(code->co_cellvars); + Py_ssize_t nfrees = PyTuple_GET_SIZE(code->co_freevars); + Py_ssize_t extras = code->co_stacksize + code->co_nlocals + ncells + nfrees; +#if PyFrame_MAXFREELIST > 0 + if (free_list == NULL) #endif - if (back == NULL || back->f_globals != globals) { - builtins = _PyDict_GetItemIdWithError(globals, &PyId___builtins__); - if (builtins) { - if (PyModule_Check(builtins)) { - builtins = PyModule_GetDict(builtins); - assert(builtins != NULL); - } + { + f = PyObject_GC_NewVar(PyFrameObject, &PyFrame_Type, extras); + if (f == NULL) { + return NULL; } - if (builtins == NULL) { - if (PyErr_Occurred()) { + } +#if PyFrame_MAXFREELIST > 0 + else { + assert(numfree > 0); + --numfree; + f = free_list; + free_list = free_list->f_back; + if (Py_SIZE(f) < extras) { + PyFrameObject *new_f = PyObject_GC_Resize(PyFrameObject, f, extras); + if (new_f == NULL) { + PyObject_GC_Del(f); return NULL; } - /* No builtins! Make up a minimal one - Give them 'None', at least. */ - builtins = PyDict_New(); - if (builtins == NULL || - PyDict_SetItemString( - builtins, "None", Py_None) < 0) - return NULL; + f = new_f; } - else - Py_INCREF(builtins); + _Py_NewReference((PyObject *)f); + } +#endif + f->f_code = code; + extras = code->co_nlocals + ncells + nfrees; + f->f_valuestack = f->f_localsplus + extras; + for (Py_ssize_t i=0; if_localsplus[i] = NULL; } - else { + f->f_locals = NULL; + f->f_trace = NULL; + return f; +} + + +static inline PyObject * +frame_get_builtins(PyFrameObject *back, PyObject *globals) +{ + PyObject *builtins; + + if (back != NULL && back->f_globals == globals) { /* If we share the globals, we share the builtins. Save a lookup and a call. */ builtins = back->f_builtins; assert(builtins != NULL); Py_INCREF(builtins); + return builtins; } - if (code->co_zombieframe != NULL) { - f = code->co_zombieframe; - code->co_zombieframe = NULL; - _Py_NewReference((PyObject *)f); - assert(f->f_code == code); + + builtins = _PyDict_GetItemIdWithError(globals, &PyId___builtins__); + if (builtins != NULL && PyModule_Check(builtins)) { + builtins = PyModule_GetDict(builtins); + assert(builtins != NULL); + } + if (builtins != NULL) { + Py_INCREF(builtins); + return builtins; + } + + if (PyErr_Occurred()) { + return NULL; } - else { - Py_ssize_t extras, ncells, nfrees; - ncells = PyTuple_GET_SIZE(code->co_cellvars); - nfrees = PyTuple_GET_SIZE(code->co_freevars); - extras = code->co_stacksize + code->co_nlocals + ncells + - nfrees; - if (free_list == NULL) { - f = PyObject_GC_NewVar(PyFrameObject, &PyFrame_Type, - extras); - if (f == NULL) { - Py_DECREF(builtins); - return NULL; - } - } - else { - assert(numfree > 0); - --numfree; - f = free_list; - free_list = free_list->f_back; - if (Py_SIZE(f) < extras) { - PyFrameObject *new_f = PyObject_GC_Resize(PyFrameObject, f, extras); - if (new_f == NULL) { - PyObject_GC_Del(f); - Py_DECREF(builtins); - return NULL; - } - f = new_f; - } - _Py_NewReference((PyObject *)f); - } - f->f_code = code; - extras = code->co_nlocals + ncells + nfrees; - f->f_valuestack = f->f_localsplus + extras; - for (i=0; if_localsplus[i] = NULL; - f->f_locals = NULL; - f->f_trace = NULL; + /* No builtins! Make up a minimal one. + Give them 'None', at least. */ + builtins = PyDict_New(); + if (builtins == NULL) { + return NULL; } + if (PyDict_SetItemString(builtins, "None", Py_None) < 0) { + Py_DECREF(builtins); + return NULL; + } + return builtins; +} + + +PyFrameObject* _Py_HOT_FUNCTION +_PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, + PyObject *globals, PyObject *locals) +{ +#ifdef Py_DEBUG + if (code == NULL || globals == NULL || !PyDict_Check(globals) || + (locals != NULL && !PyMapping_Check(locals))) { + PyErr_BadInternalCall(); + return NULL; + } +#endif + + PyFrameObject *back = tstate->frame; + PyObject *builtins = frame_get_builtins(back, globals); + if (builtins == NULL) { + return NULL; + } + + PyFrameObject *f = frame_alloc(code); + if (f == NULL) { + Py_DECREF(builtins); + return NULL; + } + f->f_stacktop = f->f_valuestack; f->f_builtins = builtins; Py_XINCREF(back); @@ -731,6 +920,8 @@ _PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, f->f_trace_opcodes = 0; f->f_trace_lines = 1; + assert(f->f_code != NULL); + return f; } @@ -751,8 +942,9 @@ void PyFrame_BlockSetup(PyFrameObject *f, int type, int handler, int level) { PyTryBlock *b; - if (f->f_iblock >= CO_MAXBLOCKS) - Py_FatalError("XXX block stack overflow"); + if (f->f_iblock >= CO_MAXBLOCKS) { + Py_FatalError("block stack overflow"); + } b = &f->f_blockstack[f->f_iblock++]; b->b_type = type; b->b_level = level; @@ -763,8 +955,9 @@ PyTryBlock * PyFrame_BlockPop(PyFrameObject *f) { PyTryBlock *b; - if (f->f_iblock <= 0) - Py_FatalError("XXX block stack underflow"); + if (f->f_iblock <= 0) { + Py_FatalError("block stack underflow"); + } b = &f->f_blockstack[--f->f_iblock]; return b; } @@ -981,11 +1174,10 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear) } /* Clear out the free list */ -int -PyFrame_ClearFreeList(void) +void +_PyFrame_ClearFreeList(void) { - int freelist_size = numfree; - +#if PyFrame_MAXFREELIST > 0 while (free_list != NULL) { PyFrameObject *f = free_list; free_list = free_list->f_back; @@ -993,21 +1185,43 @@ PyFrame_ClearFreeList(void) --numfree; } assert(numfree == 0); - return freelist_size; +#endif } void -PyFrame_Fini(void) +_PyFrame_Fini(void) { - (void)PyFrame_ClearFreeList(); + _PyFrame_ClearFreeList(); } /* Print summary info about the state of the optimized allocator */ void _PyFrame_DebugMallocStats(FILE *out) { +#if PyFrame_MAXFREELIST > 0 _PyDebugAllocatorStats(out, "free PyFrameObject", numfree, sizeof(PyFrameObject)); +#endif } + +PyCodeObject * +PyFrame_GetCode(PyFrameObject *frame) +{ + assert(frame != NULL); + PyCodeObject *code = frame->f_code; + assert(code != NULL); + Py_INCREF(code); + return code; +} + + +PyFrameObject* +PyFrame_GetBack(PyFrameObject *frame) +{ + assert(frame != NULL); + PyFrameObject *back = frame->f_back; + Py_XINCREF(back); + return back; +} diff --git a/Objects/funcobject.c b/Objects/funcobject.c index df5cc2d3..bd24f67b 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -3,11 +3,9 @@ #include "Python.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" #include "pycore_tupleobject.h" #include "code.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef PyObject * PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname) @@ -196,7 +194,7 @@ PyFunction_SetClosure(PyObject *op, PyObject *closure) else { PyErr_Format(PyExc_SystemError, "expected tuple for closure, got '%.100s'", - closure->ob_type->tp_name); + Py_TYPE(closure)->tp_name); return -1; } Py_XSETREF(((PyFunctionObject *)op)->func_closure, closure); @@ -239,12 +237,10 @@ PyFunction_SetAnnotations(PyObject *op, PyObject *annotations) #define OFF(x) offsetof(PyFunctionObject, x) static PyMemberDef func_memberlist[] = { - {"__closure__", T_OBJECT, OFF(func_closure), - RESTRICTED|READONLY}, - {"__doc__", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED}, - {"__globals__", T_OBJECT, OFF(func_globals), - RESTRICTED|READONLY}, - {"__module__", T_OBJECT, OFF(func_module), PY_WRITE_RESTRICTED}, + {"__closure__", T_OBJECT, OFF(func_closure), READONLY}, + {"__doc__", T_OBJECT, OFF(func_doc), 0}, + {"__globals__", T_OBJECT, OFF(func_globals), READONLY}, + {"__module__", T_OBJECT, OFF(func_module), 0}, {NULL} /* Sentinel */ }; @@ -541,7 +537,7 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals, if (!PyCell_Check(o)) { return PyErr_Format(PyExc_TypeError, "arg 5 (closure) expected cell, found %s", - o->ob_type->tp_name); + Py_TYPE(o)->tp_name); } } } @@ -622,17 +618,6 @@ func_traverse(PyFunctionObject *f, visitproc visit, void *arg) return 0; } -static PyObject * -function_call(PyObject *func, PyObject *args, PyObject *kwargs) -{ - PyObject **stack; - Py_ssize_t nargs; - - stack = _PyTuple_ITEMS(args); - nargs = PyTuple_GET_SIZE(args); - return _PyFunction_FastCallDict(func, stack, nargs, kwargs); -} - /* Bind a function to an object */ static PyObject * func_descr_get(PyObject *func, PyObject *obj, PyObject *type) @@ -659,13 +644,13 @@ PyTypeObject PyFunction_Type = { 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ - function_call, /* tp_call */ + PyVectorcall_Call, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL | + Py_TPFLAGS_HAVE_VECTORCALL | Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ func_new__doc__, /* tp_doc */ (traverseproc)func_traverse, /* tp_traverse */ @@ -752,6 +737,10 @@ cm_descr_get(PyObject *self, PyObject *obj, PyObject *type) } if (type == NULL) type = (PyObject *)(Py_TYPE(obj)); + if (Py_TYPE(cm->cm_callable)->tp_descr_get != NULL) { + return Py_TYPE(cm->cm_callable)->tp_descr_get(cm->cm_callable, type, + NULL); + } return PyMethod_New(cm->cm_callable, type); } diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c new file mode 100644 index 00000000..4f952162 --- /dev/null +++ b/Objects/genericaliasobject.c @@ -0,0 +1,629 @@ +// types.GenericAlias -- used to represent e.g. list[int]. + +#include "Python.h" +#include "pycore_object.h" +#include "structmember.h" // PyMemberDef + +typedef struct { + PyObject_HEAD + PyObject *origin; + PyObject *args; + PyObject *parameters; +} gaobject; + +static void +ga_dealloc(PyObject *self) +{ + gaobject *alias = (gaobject *)self; + + _PyObject_GC_UNTRACK(self); + Py_XDECREF(alias->origin); + Py_XDECREF(alias->args); + Py_XDECREF(alias->parameters); + self->ob_type->tp_free(self); +} + +static int +ga_traverse(PyObject *self, visitproc visit, void *arg) +{ + gaobject *alias = (gaobject *)self; + Py_VISIT(alias->origin); + Py_VISIT(alias->args); + Py_VISIT(alias->parameters); + return 0; +} + +static int +ga_repr_item(_PyUnicodeWriter *writer, PyObject *p) +{ + _Py_IDENTIFIER(__module__); + _Py_IDENTIFIER(__qualname__); + _Py_IDENTIFIER(__origin__); + _Py_IDENTIFIER(__args__); + PyObject *qualname = NULL; + PyObject *module = NULL; + PyObject *r = NULL; + PyObject *tmp; + int err; + + if (p == Py_Ellipsis) { + // The Ellipsis object + r = PyUnicode_FromString("..."); + goto done; + } + + if (_PyObject_LookupAttrId(p, &PyId___origin__, &tmp) < 0) { + goto done; + } + if (tmp != NULL) { + Py_DECREF(tmp); + if (_PyObject_LookupAttrId(p, &PyId___args__, &tmp) < 0) { + goto done; + } + if (tmp != NULL) { + Py_DECREF(tmp); + // It looks like a GenericAlias + goto use_repr; + } + } + + if (_PyObject_LookupAttrId(p, &PyId___qualname__, &qualname) < 0) { + goto done; + } + if (qualname == NULL) { + goto use_repr; + } + if (_PyObject_LookupAttrId(p, &PyId___module__, &module) < 0) { + goto done; + } + if (module == NULL || module == Py_None) { + goto use_repr; + } + + // Looks like a class + if (PyUnicode_Check(module) && + _PyUnicode_EqualToASCIIString(module, "builtins")) + { + // builtins don't need a module name + r = PyObject_Str(qualname); + goto done; + } + else { + r = PyUnicode_FromFormat("%S.%S", module, qualname); + goto done; + } + +use_repr: + r = PyObject_Repr(p); + +done: + Py_XDECREF(qualname); + Py_XDECREF(module); + if (r == NULL) { + // error if any of the above PyObject_Repr/PyUnicode_From* fail + err = -1; + } + else { + err = _PyUnicodeWriter_WriteStr(writer, r); + Py_DECREF(r); + } + return err; +} + +static PyObject * +ga_repr(PyObject *self) +{ + gaobject *alias = (gaobject *)self; + Py_ssize_t len = PyTuple_GET_SIZE(alias->args); + + _PyUnicodeWriter writer; + _PyUnicodeWriter_Init(&writer); + + if (ga_repr_item(&writer, alias->origin) < 0) { + goto error; + } + if (_PyUnicodeWriter_WriteASCIIString(&writer, "[", 1) < 0) { + goto error; + } + for (Py_ssize_t i = 0; i < len; i++) { + if (i > 0) { + if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) { + goto error; + } + } + PyObject *p = PyTuple_GET_ITEM(alias->args, i); + if (ga_repr_item(&writer, p) < 0) { + goto error; + } + } + if (len == 0) { + // for something like tuple[()] we should print a "()" + if (_PyUnicodeWriter_WriteASCIIString(&writer, "()", 2) < 0) { + goto error; + } + } + if (_PyUnicodeWriter_WriteASCIIString(&writer, "]", 1) < 0) { + goto error; + } + return _PyUnicodeWriter_Finish(&writer); +error: + _PyUnicodeWriter_Dealloc(&writer); + return NULL; +} + +// isinstance(obj, TypeVar) without importing typing.py. +// Returns -1 for errors. +static int +is_typevar(PyObject *obj) +{ + PyTypeObject *type = Py_TYPE(obj); + if (strcmp(type->tp_name, "TypeVar") != 0) { + return 0; + } + PyObject *module = PyObject_GetAttrString((PyObject *)type, "__module__"); + if (module == NULL) { + return -1; + } + int res = PyUnicode_Check(module) + && _PyUnicode_EqualToASCIIString(module, "typing"); + Py_DECREF(module); + return res; +} + +// Index of item in self[:len], or -1 if not found (self is a tuple) +static Py_ssize_t +tuple_index(PyObject *self, Py_ssize_t len, PyObject *item) +{ + for (Py_ssize_t i = 0; i < len; i++) { + if (PyTuple_GET_ITEM(self, i) == item) { + return i; + } + } + return -1; +} + +static int +tuple_add(PyObject *self, Py_ssize_t len, PyObject *item) +{ + if (tuple_index(self, len, item) < 0) { + Py_INCREF(item); + PyTuple_SET_ITEM(self, len, item); + return 1; + } + return 0; +} + +static PyObject * +make_parameters(PyObject *args) +{ + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t len = nargs; + PyObject *parameters = PyTuple_New(len); + if (parameters == NULL) + return NULL; + Py_ssize_t iparam = 0; + for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { + PyObject *t = PyTuple_GET_ITEM(args, iarg); + int typevar = is_typevar(t); + if (typevar < 0) { + Py_DECREF(parameters); + return NULL; + } + if (typevar) { + iparam += tuple_add(parameters, iparam, t); + } + else { + _Py_IDENTIFIER(__parameters__); + PyObject *subparams; + if (_PyObject_LookupAttrId(t, &PyId___parameters__, &subparams) < 0) { + Py_DECREF(parameters); + return NULL; + } + if (subparams && PyTuple_Check(subparams)) { + Py_ssize_t len2 = PyTuple_GET_SIZE(subparams); + Py_ssize_t needed = len2 - 1 - (iarg - iparam); + if (needed > 0) { + len += needed; + if (_PyTuple_Resize(¶meters, len) < 0) { + Py_DECREF(subparams); + Py_DECREF(parameters); + return NULL; + } + } + for (Py_ssize_t j = 0; j < len2; j++) { + PyObject *t2 = PyTuple_GET_ITEM(subparams, j); + iparam += tuple_add(parameters, iparam, t2); + } + } + Py_XDECREF(subparams); + } + } + if (iparam < len) { + if (_PyTuple_Resize(¶meters, iparam) < 0) { + Py_XDECREF(parameters); + return NULL; + } + } + return parameters; +} + +/* If obj is a generic alias, substitute type variables params + with substitutions argitems. For example, if obj is list[T], + params is (T, S), and argitems is (str, int), return list[str]. + If obj doesn't have a __parameters__ attribute or that's not + a non-empty tuple, return a new reference to obj. */ +static PyObject * +subs_tvars(PyObject *obj, PyObject *params, PyObject **argitems) +{ + _Py_IDENTIFIER(__parameters__); + PyObject *subparams; + if (_PyObject_LookupAttrId(obj, &PyId___parameters__, &subparams) < 0) { + return NULL; + } + if (subparams && PyTuple_Check(subparams) && PyTuple_GET_SIZE(subparams)) { + Py_ssize_t nparams = PyTuple_GET_SIZE(params); + Py_ssize_t nsubargs = PyTuple_GET_SIZE(subparams); + PyObject *subargs = PyTuple_New(nsubargs); + if (subargs == NULL) { + Py_DECREF(subparams); + return NULL; + } + for (Py_ssize_t i = 0; i < nsubargs; ++i) { + PyObject *arg = PyTuple_GET_ITEM(subparams, i); + Py_ssize_t iparam = tuple_index(params, nparams, arg); + if (iparam >= 0) { + arg = argitems[iparam]; + } + Py_INCREF(arg); + PyTuple_SET_ITEM(subargs, i, arg); + } + + obj = PyObject_GetItem(obj, subargs); + + Py_DECREF(subargs); + } + else { + Py_INCREF(obj); + } + Py_XDECREF(subparams); + return obj; +} + +static PyObject * +ga_getitem(PyObject *self, PyObject *item) +{ + gaobject *alias = (gaobject *)self; + // do a lookup for __parameters__ so it gets populated (if not already) + if (alias->parameters == NULL) { + alias->parameters = make_parameters(alias->args); + if (alias->parameters == NULL) { + return NULL; + } + } + Py_ssize_t nparams = PyTuple_GET_SIZE(alias->parameters); + if (nparams == 0) { + return PyErr_Format(PyExc_TypeError, + "There are no type variables left in %R", + self); + } + int is_tuple = PyTuple_Check(item); + Py_ssize_t nitems = is_tuple ? PyTuple_GET_SIZE(item) : 1; + PyObject **argitems = is_tuple ? &PyTuple_GET_ITEM(item, 0) : &item; + if (nitems != nparams) { + return PyErr_Format(PyExc_TypeError, + "Too %s arguments for %R", + nitems > nparams ? "many" : "few", + self); + } + /* Replace all type variables (specified by alias->parameters) + with corresponding values specified by argitems. + t = list[T]; t[int] -> newargs = [int] + t = dict[str, T]; t[int] -> newargs = [str, int] + t = dict[T, list[S]]; t[str, int] -> newargs = [str, list[int]] + */ + Py_ssize_t nargs = PyTuple_GET_SIZE(alias->args); + PyObject *newargs = PyTuple_New(nargs); + if (newargs == NULL) { + return NULL; + } + for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { + PyObject *arg = PyTuple_GET_ITEM(alias->args, iarg); + int typevar = is_typevar(arg); + if (typevar < 0) { + Py_DECREF(newargs); + return NULL; + } + if (typevar) { + Py_ssize_t iparam = tuple_index(alias->parameters, nparams, arg); + assert(iparam >= 0); + arg = argitems[iparam]; + Py_INCREF(arg); + } + else { + arg = subs_tvars(arg, alias->parameters, argitems); + if (arg == NULL) { + Py_DECREF(newargs); + return NULL; + } + } + PyTuple_SET_ITEM(newargs, iarg, arg); + } + + PyObject *res = Py_GenericAlias(alias->origin, newargs); + + Py_DECREF(newargs); + return res; +} + +static PyMappingMethods ga_as_mapping = { + .mp_subscript = ga_getitem, +}; + +static Py_hash_t +ga_hash(PyObject *self) +{ + gaobject *alias = (gaobject *)self; + // TODO: Hash in the hash for the origin + Py_hash_t h0 = PyObject_Hash(alias->origin); + if (h0 == -1) { + return -1; + } + Py_hash_t h1 = PyObject_Hash(alias->args); + if (h1 == -1) { + return -1; + } + return h0 ^ h1; +} + +static PyObject * +ga_call(PyObject *self, PyObject *args, PyObject *kwds) +{ + gaobject *alias = (gaobject *)self; + PyObject *obj = PyObject_Call(alias->origin, args, kwds); + if (obj != NULL) { + if (PyObject_SetAttrString(obj, "__orig_class__", self) < 0) { + if (!PyErr_ExceptionMatches(PyExc_AttributeError) && + !PyErr_ExceptionMatches(PyExc_TypeError)) + { + Py_DECREF(obj); + return NULL; + } + PyErr_Clear(); + } + } + return obj; +} + +static const char* const attr_exceptions[] = { + "__origin__", + "__args__", + "__parameters__", + "__mro_entries__", + "__reduce_ex__", // needed so we don't look up object.__reduce_ex__ + "__reduce__", + NULL, +}; + +static PyObject * +ga_getattro(PyObject *self, PyObject *name) +{ + gaobject *alias = (gaobject *)self; + if (PyUnicode_Check(name)) { + for (const char * const *p = attr_exceptions; ; p++) { + if (*p == NULL) { + return PyObject_GetAttr(alias->origin, name); + } + if (_PyUnicode_EqualToASCIIString(name, *p)) { + break; + } + } + } + return PyObject_GenericGetAttr(self, name); +} + +static PyObject * +ga_richcompare(PyObject *a, PyObject *b, int op) +{ + if (!Py_IS_TYPE(a, &Py_GenericAliasType) || + !Py_IS_TYPE(b, &Py_GenericAliasType) || + (op != Py_EQ && op != Py_NE)) + { + Py_RETURN_NOTIMPLEMENTED; + } + + if (op == Py_NE) { + PyObject *eq = ga_richcompare(a, b, Py_EQ); + if (eq == NULL) + return NULL; + Py_DECREF(eq); + if (eq == Py_True) { + Py_RETURN_FALSE; + } + else { + Py_RETURN_TRUE; + } + } + + gaobject *aa = (gaobject *)a; + gaobject *bb = (gaobject *)b; + int eq = PyObject_RichCompareBool(aa->origin, bb->origin, Py_EQ); + if (eq < 0) { + return NULL; + } + if (!eq) { + Py_RETURN_FALSE; + } + return PyObject_RichCompare(aa->args, bb->args, Py_EQ); +} + +static PyObject * +ga_mro_entries(PyObject *self, PyObject *args) +{ + gaobject *alias = (gaobject *)self; + return PyTuple_Pack(1, alias->origin); +} + +static PyObject * +ga_instancecheck(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyErr_SetString(PyExc_TypeError, + "isinstance() argument 2 cannot be a parameterized generic"); + return NULL; +} + +static PyObject * +ga_subclasscheck(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyErr_SetString(PyExc_TypeError, + "issubclass() argument 2 cannot be a parameterized generic"); + return NULL; +} + +static PyObject * +ga_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + gaobject *alias = (gaobject *)self; + return Py_BuildValue("O(OO)", Py_TYPE(alias), + alias->origin, alias->args); +} + +static PyObject * +ga_dir(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + gaobject *alias = (gaobject *)self; + PyObject *dir = PyObject_Dir(alias->origin); + if (dir == NULL) { + return NULL; + } + + PyObject *dir_entry = NULL; + for (const char * const *p = attr_exceptions; ; p++) { + if (*p == NULL) { + break; + } + else { + dir_entry = PyUnicode_FromString(*p); + if (dir_entry == NULL) { + goto error; + } + int contains = PySequence_Contains(dir, dir_entry); + if (contains < 0) { + goto error; + } + if (contains == 0 && PyList_Append(dir, dir_entry) < 0) { + goto error; + } + + Py_CLEAR(dir_entry); + } + } + return dir; + +error: + Py_DECREF(dir); + Py_XDECREF(dir_entry); + return NULL; +} + +static PyMethodDef ga_methods[] = { + {"__mro_entries__", ga_mro_entries, METH_O}, + {"__instancecheck__", ga_instancecheck, METH_O}, + {"__subclasscheck__", ga_subclasscheck, METH_O}, + {"__reduce__", ga_reduce, METH_NOARGS}, + {"__dir__", ga_dir, METH_NOARGS}, + {0} +}; + +static PyMemberDef ga_members[] = { + {"__origin__", T_OBJECT, offsetof(gaobject, origin), READONLY}, + {"__args__", T_OBJECT, offsetof(gaobject, args), READONLY}, + {0} +}; + +static PyObject * +ga_parameters(PyObject *self, void *unused) +{ + gaobject *alias = (gaobject *)self; + if (alias->parameters == NULL) { + alias->parameters = make_parameters(alias->args); + if (alias->parameters == NULL) { + return NULL; + } + } + Py_INCREF(alias->parameters); + return alias->parameters; +} + +static PyGetSetDef ga_properties[] = { + {"__parameters__", ga_parameters, (setter)NULL, "Type variables in the GenericAlias.", NULL}, + {0} +}; + +static PyObject * +ga_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + if (!_PyArg_NoKwnames("GenericAlias", kwds)) { + return NULL; + } + if (!_PyArg_CheckPositional("GenericAlias", PyTuple_GET_SIZE(args), 2, 2)) { + return NULL; + } + PyObject *origin = PyTuple_GET_ITEM(args, 0); + PyObject *arguments = PyTuple_GET_ITEM(args, 1); + return Py_GenericAlias(origin, arguments); +} + +// TODO: +// - argument clinic? +// - __doc__? +// - cache? +PyTypeObject Py_GenericAliasType = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + .tp_name = "types.GenericAlias", + .tp_doc = "Represent a PEP 585 generic type\n" + "\n" + "E.g. for t = list[int], t.origin is list and t.args is (int,).", + .tp_basicsize = sizeof(gaobject), + .tp_dealloc = ga_dealloc, + .tp_repr = ga_repr, + .tp_as_mapping = &ga_as_mapping, + .tp_hash = ga_hash, + .tp_call = ga_call, + .tp_getattro = ga_getattro, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .tp_traverse = ga_traverse, + .tp_richcompare = ga_richcompare, + .tp_methods = ga_methods, + .tp_members = ga_members, + .tp_alloc = PyType_GenericAlloc, + .tp_new = ga_new, + .tp_free = PyObject_GC_Del, + .tp_getset = ga_properties, +}; + +PyObject * +Py_GenericAlias(PyObject *origin, PyObject *args) +{ + if (!PyTuple_Check(args)) { + args = PyTuple_Pack(1, args); + if (args == NULL) { + return NULL; + } + } + else { + Py_INCREF(args); + } + + gaobject *alias = PyObject_GC_New(gaobject, &Py_GenericAliasType); + if (alias == NULL) { + Py_DECREF(args); + return NULL; + } + + Py_INCREF(origin); + alias->origin = origin; + alias->args = args; + alias->parameters = NULL; + _PyObject_GC_TRACK(alias); + return (PyObject *)alias; +} diff --git a/Objects/genobject.c b/Objects/genobject.c index ce7dd48a..72c93f61 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1,10 +1,12 @@ /* Generator object implementation */ #include "Python.h" +#include "pycore_ceval.h" // _PyEval_EvalFrame() #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" // _PyErr_ClearExcState() +#include "pycore_pystate.h" // _PyThreadState_GET() #include "frameobject.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "opcode.h" static PyObject *gen_close(PyGenObject *, PyObject *); @@ -57,7 +59,7 @@ _PyGen_Finalize(PyObject *self) /* Save the current exception, if any. */ PyErr_Fetch(&error_type, &error_value, &error_traceback); - res = PyObject_CallFunctionObjArgs(finalizer, self, NULL); + res = PyObject_CallOneArg(finalizer, self); if (res == NULL) { PyErr_WriteUnraisable(self); @@ -98,21 +100,6 @@ _PyGen_Finalize(PyObject *self) PyErr_Restore(error_type, error_value, error_traceback); } -static inline void -exc_state_clear(_PyErr_StackItem *exc_state) -{ - PyObject *t, *v, *tb; - t = exc_state->exc_type; - v = exc_state->exc_value; - tb = exc_state->exc_traceback; - exc_state->exc_type = NULL; - exc_state->exc_value = NULL; - exc_state->exc_traceback = NULL; - Py_XDECREF(t); - Py_XDECREF(v); - Py_XDECREF(tb); -} - static void gen_dealloc(PyGenObject *gen) { @@ -145,7 +132,7 @@ gen_dealloc(PyGenObject *gen) Py_CLEAR(gen->gi_code); Py_CLEAR(gen->gi_name); Py_CLEAR(gen->gi_qualname); - exc_state_clear(&gen->gi_exc_state); + _PyErr_ClearExcState(&gen->gi_exc_state); PyObject_GC_Del(gen); } @@ -219,7 +206,13 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) gen->gi_running = 1; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; - result = PyEval_EvalFrameEx(f, exc); + + if (exc) { + assert(_PyErr_Occurred(tstate)); + _PyErr_ChainStackItem(NULL); + } + + result = _PyEval_EvalFrame(tstate, f, exc); tstate->exc_info = gen->gi_exc_state.previous_item; gen->gi_exc_state.previous_item = NULL; gen->gi_running = 0; @@ -254,7 +247,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) if (PyCoro_CheckExact(gen)) { msg = "coroutine raised StopIteration"; } - else if PyAsyncGen_CheckExact(gen) { + else if (PyAsyncGen_CheckExact(gen)) { msg = "async generator raised StopIteration"; } _PyErr_FormatFromCause(PyExc_RuntimeError, "%s", msg); @@ -273,7 +266,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) if (!result || f->f_stacktop == NULL) { /* generator can't be rerun, so release the frame */ /* first clean reference cycle through stored exception traceback */ - exc_state_clear(&gen->gi_exc_state); + _PyErr_ClearExcState(&gen->gi_exc_state); gen->gi_frame->f_gen = NULL; gen->gi_frame = NULL; Py_DECREF(f); @@ -421,11 +414,21 @@ _gen_throw(PyGenObject *gen, int close_on_genexit, } if (PyGen_CheckExact(yf) || PyCoro_CheckExact(yf)) { /* `yf` is a generator or a coroutine. */ + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *f = tstate->frame; + gen->gi_running = 1; + /* Since we are fast-tracking things by skipping the eval loop, + we need to update the current frame so the stack trace + will be reported correctly to the user. */ + /* XXX We should probably be updating the current frame + somewhere in ceval.c. */ + tstate->frame = gen->gi_frame; /* Close the generator that we are currently iterating with 'yield from' or awaiting on with 'await'. */ ret = _gen_throw((PyGenObject *)yf, close_on_genexit, typ, val, tb); + tstate->frame = f; gen->gi_running = 0; } else { /* `yf` is an iterator or a coroutine-like object. */ @@ -562,7 +565,7 @@ _PyGen_SetStopIterationValue(PyObject *value) return 0; } /* Construct an exception instance manually with - * PyObject_CallFunctionObjArgs and pass it to PyErr_SetObject. + * PyObject_CallOneArg and pass it to PyErr_SetObject. * * We do this to handle a situation when "value" is a tuple, in which * case PyErr_SetObject would set the value of StopIteration to @@ -570,7 +573,7 @@ _PyGen_SetStopIterationValue(PyObject *value) * * (See PyErr_SetObject/_PyErr_CreateException code for details.) */ - e = PyObject_CallFunctionObjArgs(PyExc_StopIteration, value, NULL); + e = PyObject_CallOneArg(PyExc_StopIteration, value); if (e == NULL) { return -1; } @@ -819,22 +822,6 @@ PyGen_New(PyFrameObject *f) return gen_new_with_qualname(&PyGen_Type, f, NULL, NULL); } -int -PyGen_NeedsFinalizing(PyGenObject *gen) -{ - PyFrameObject *f = gen->gi_frame; - - if (f == NULL || f->f_stacktop == NULL) - return 0; /* no frame or empty blockstack == no finalization */ - - /* Any (exception-handling) block type requires cleanup. */ - if (f->f_iblock > 0) - return 1; - - /* No blocks, it's safe to skip finalization. */ - return 0; -} - /* Coroutine Object */ typedef struct { @@ -1132,11 +1119,11 @@ compute_cr_origin(int origin_depth) } frame = PyEval_GetFrame(); for (int i = 0; i < frame_count; ++i) { - PyObject *frameinfo = Py_BuildValue( - "OiO", - frame->f_code->co_filename, - PyFrame_GetLineNumber(frame), - frame->f_code->co_name); + PyCodeObject *code = frame->f_code; + PyObject *frameinfo = Py_BuildValue("OiO", + code->co_filename, + PyFrame_GetLineNumber(frame), + code->co_name); if (!frameinfo) { Py_DECREF(cr_origin); return NULL; @@ -1231,10 +1218,10 @@ static PyAsyncGenASend *ag_asend_freelist[_PyAsyncGen_MAXFREELIST]; static int ag_asend_freelist_free = 0; #define _PyAsyncGenWrappedValue_CheckExact(o) \ - (Py_TYPE(o) == &_PyAsyncGenWrappedValue_Type) + Py_IS_TYPE(o, &_PyAsyncGenWrappedValue_Type) #define PyAsyncGenASend_CheckExact(o) \ - (Py_TYPE(o) == &_PyAsyncGenASend_Type) + Py_IS_TYPE(o, &_PyAsyncGenASend_Type) static int @@ -1279,7 +1266,7 @@ async_gen_init_hooks(PyAsyncGenObject *o) PyObject *res; Py_INCREF(firstiter); - res = PyObject_CallFunctionObjArgs(firstiter, o, NULL); + res = PyObject_CallOneArg(firstiter, (PyObject *)o); Py_DECREF(firstiter); if (res == NULL) { return 1; @@ -1361,6 +1348,8 @@ static PyMethodDef async_gen_methods[] = { {"asend", (PyCFunction)async_gen_asend, METH_O, async_asend_doc}, {"athrow",(PyCFunction)async_gen_athrow, METH_VARARGS, async_athrow_doc}, {"aclose", (PyCFunction)async_gen_aclose, METH_NOARGS, async_aclose_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* Sentinel */ }; @@ -1442,11 +1431,9 @@ PyAsyncGen_New(PyFrameObject *f, PyObject *name, PyObject *qualname) } -int -PyAsyncGen_ClearFreeLists(void) +void +_PyAsyncGen_ClearFreeLists(void) { - int ret = ag_value_freelist_free + ag_asend_freelist_free; - while (ag_value_freelist_free) { _PyAsyncGenWrappedValue *o; o = ag_value_freelist[--ag_value_freelist_free]; @@ -1457,17 +1444,15 @@ PyAsyncGen_ClearFreeLists(void) while (ag_asend_freelist_free) { PyAsyncGenASend *o; o = ag_asend_freelist[--ag_asend_freelist_free]; - assert(Py_TYPE(o) == &_PyAsyncGenASend_Type); + assert(Py_IS_TYPE(o, &_PyAsyncGenASend_Type)); PyObject_GC_Del(o); } - - return ret; } void -PyAsyncGen_Fini(void) +_PyAsyncGen_Fini(void) { - PyAsyncGen_ClearFreeLists(); + _PyAsyncGen_ClearFreeLists(); } diff --git a/Objects/interpreteridobject.c b/Objects/interpreteridobject.c index 94f5dd70..39bde972 100644 --- a/Objects/interpreteridobject.c +++ b/Objects/interpreteridobject.c @@ -1,7 +1,8 @@ /* InterpreterID object */ #include "Python.h" -#include "internal/pycore_pystate.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_interp.h" // _PyInterpreterState_LookUpID() #include "interpreteridobject.h" @@ -42,7 +43,7 @@ interp_id_converter(PyObject *arg, void *ptr) if (PyObject_TypeCheck(arg, &_PyInterpreterID_Type)) { id = ((interpid *)arg)->id; } - else if (PyIndex_Check(arg)) { + else if (_PyIndex_Check(arg)) { id = PyLong_AsLongLong(arg); if (id == -1 && PyErr_Occurred()) { return 0; @@ -56,7 +57,7 @@ interp_id_converter(PyObject *arg, void *ptr) else { PyErr_Format(PyExc_TypeError, "interpreter ID must be an int, got %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return 0; } *(int64_t *)ptr = id; @@ -269,7 +270,7 @@ _PyInterpreterState_GetIDObject(PyInterpreterState *interp) if (_PyInterpreterState_IDInitref(interp) != 0) { return NULL; }; - PY_INT64_T id = PyInterpreterState_GetID(interp); + int64_t id = PyInterpreterState_GetID(interp); if (id < 0) { return NULL; } diff --git a/Objects/iterobject.c b/Objects/iterobject.c index da89298e..6cac41ad 100644 --- a/Objects/iterobject.c +++ b/Objects/iterobject.c @@ -2,8 +2,6 @@ #include "Python.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" typedef struct { PyObject_HEAD @@ -11,6 +9,8 @@ typedef struct { PyObject *it_seq; /* Set to NULL when iterator is exhausted */ } seqiterobject; +_Py_IDENTIFIER(iter); + PyObject * PySeqIter_New(PyObject *seq) { @@ -104,7 +104,6 @@ PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list( static PyObject * iter_reduce(seqiterobject *it, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); if (it->it_seq != NULL) return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_iter), it->it_seq, it->it_index); @@ -244,7 +243,6 @@ calliter_iternext(calliterobject *it) static PyObject * calliter_reduce(calliterobject *it, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); if (it->it_callable != NULL && it->it_sentinel != NULL) return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_iter), it->it_callable, it->it_sentinel); diff --git a/Objects/listobject.c b/Objects/listobject.c index 30444089..f9eb3706 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -1,8 +1,8 @@ /* List object implementation */ #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_object.h" -#include "pycore_pystate.h" #include "pycore_tupleobject.h" #include "pycore_accu.h" @@ -45,7 +45,7 @@ list_resize(PyListObject *self, Py_ssize_t newsize) */ if (allocated >= newsize && newsize >= (allocated >> 1)) { assert(self->ob_item != NULL || newsize == 0); - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); return 0; } @@ -54,15 +54,17 @@ list_resize(PyListObject *self, Py_ssize_t newsize) * enough to give linear-time amortized behavior over a long * sequence of appends() in the presence of a poorly-performing * system realloc(). - * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... + * Add padding to make the allocated size multiple of 4. + * The growth pattern is: 0, 4, 8, 16, 24, 32, 40, 52, 64, 76, ... * Note: new_allocated won't overflow because the largest possible value * is PY_SSIZE_T_MAX * (9 / 8) + 6 which always fits in a size_t. */ - new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6); - if (new_allocated > (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) { - PyErr_NoMemory(); - return -1; - } + new_allocated = ((size_t)newsize + (newsize >> 3) + 6) & ~(size_t)3; + /* Do not overallocate if the new size is closer to overalocated size + * than to the old size. + */ + if (newsize - Py_SIZE(self) > (Py_ssize_t)(new_allocated - newsize)) + new_allocated = ((size_t)newsize + 3) & ~(size_t)3; if (newsize == 0) new_allocated = 0; @@ -73,7 +75,7 @@ list_resize(PyListObject *self, Py_ssize_t newsize) return -1; } self->ob_item = items; - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); self->allocated = new_allocated; return 0; } @@ -94,53 +96,28 @@ list_preallocate_exact(PyListObject *self, Py_ssize_t size) return 0; } -/* Debug statistic to compare allocations with reuse through the free list */ -#undef SHOW_ALLOC_COUNT -#ifdef SHOW_ALLOC_COUNT -static size_t count_alloc = 0; -static size_t count_reuse = 0; - -static void -show_alloc(void) -{ - PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->config.show_alloc_count) { - return; - } - - fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n", - count_alloc); - fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T - "d\n", count_reuse); - fprintf(stderr, "%.2f%% reuse rate\n\n", - (100.0*count_reuse/(count_alloc+count_reuse))); -} -#endif - /* Empty list reuse scheme to save calls to malloc and free */ #ifndef PyList_MAXFREELIST -#define PyList_MAXFREELIST 80 +# define PyList_MAXFREELIST 80 #endif + static PyListObject *free_list[PyList_MAXFREELIST]; static int numfree = 0; -int -PyList_ClearFreeList(void) +void +_PyList_ClearFreeList(void) { - PyListObject *op; - int ret = numfree; while (numfree) { - op = free_list[--numfree]; + PyListObject *op = free_list[--numfree]; assert(PyList_CheckExact(op)); PyObject_GC_Del(op); } - return ret; } void -PyList_Fini(void) +_PyList_Fini(void) { - PyList_ClearFreeList(); + _PyList_ClearFreeList(); } /* Print summary info about the state of the optimized allocator */ @@ -156,13 +133,6 @@ PyObject * PyList_New(Py_ssize_t size) { PyListObject *op; -#ifdef SHOW_ALLOC_COUNT - static int initialized = 0; - if (!initialized) { - Py_AtExit(show_alloc); - initialized = 1; - } -#endif if (size < 0) { PyErr_BadInternalCall(); @@ -172,16 +142,10 @@ PyList_New(Py_ssize_t size) numfree--; op = free_list[numfree]; _Py_NewReference((PyObject *)op); -#ifdef SHOW_ALLOC_COUNT - count_reuse++; -#endif } else { op = PyObject_GC_New(PyListObject, &PyList_Type); if (op == NULL) return NULL; -#ifdef SHOW_ALLOC_COUNT - count_alloc++; -#endif } if (size <= 0) op->ob_item = NULL; @@ -192,7 +156,7 @@ PyList_New(Py_ssize_t size) return PyErr_NoMemory(); } } - Py_SIZE(op) = size; + Py_SET_SIZE(op, size); op->allocated = size; _PyObject_GC_TRACK(op); return (PyObject *) op; @@ -452,7 +416,7 @@ list_contains(PyListObject *a, PyObject *el) for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) { item = PyList_GET_ITEM(a, i); Py_INCREF(item); - cmp = PyObject_RichCompareBool(el, item, Py_EQ); + cmp = PyObject_RichCompareBool(item, el, Py_EQ); Py_DECREF(item); } return cmp; @@ -493,7 +457,7 @@ list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh) Py_INCREF(v); dest[i] = v; } - Py_SIZE(np) = len; + Py_SET_SIZE(np, len); return (PyObject *)np; } @@ -529,7 +493,7 @@ list_concat(PyListObject *a, PyObject *bb) if (!PyList_Check(bb)) { PyErr_Format(PyExc_TypeError, "can only concatenate list (not \"%.200s\") to list", - bb->ob_type->tp_name); + Py_TYPE(bb)->tp_name); return NULL; } #define b ((PyListObject *)bb) @@ -554,7 +518,7 @@ list_concat(PyListObject *a, PyObject *bb) Py_INCREF(v); dest[i] = v; } - Py_SIZE(np) = size; + Py_SET_SIZE(np, size); return (PyObject *)np; #undef b } @@ -597,7 +561,7 @@ list_repeat(PyListObject *a, Py_ssize_t n) } } } - Py_SIZE(np) = size; + Py_SET_SIZE(np, size); return (PyObject *) np; } @@ -610,7 +574,7 @@ _list_clear(PyListObject *a) /* Because XDECREF can recursively invoke operations on this list, we make it empty first. */ i = Py_SIZE(a); - Py_SIZE(a) = 0; + Py_SET_SIZE(a, 0); a->ob_item = NULL; a->allocated = 0; while (--i >= 0) { @@ -928,7 +892,7 @@ list_extend(PyListObject *self, PyObject *iterable) it = PyObject_GetIter(iterable); if (it == NULL) return NULL; - iternext = *it->ob_type->tp_iternext; + iternext = *Py_TYPE(it)->tp_iternext; /* Guess a result list size. */ n = PyObject_LengthHint(iterable, 8); @@ -949,7 +913,7 @@ list_extend(PyListObject *self, PyObject *iterable) if (list_resize(self, mn) < 0) goto error; /* Make the list sane again. */ - Py_SIZE(self) = m; + Py_SET_SIZE(self, m); } /* Run iterator to exhaustion. */ @@ -967,7 +931,7 @@ list_extend(PyListObject *self, PyObject *iterable) if (Py_SIZE(self) < self->allocated) { /* steals ref */ PyList_SET_ITEM(self, Py_SIZE(self), item); - ++Py_SIZE(self); + Py_SET_SIZE(self, Py_SIZE(self) + 1); } else { int status = app1(self, item); @@ -1215,7 +1179,7 @@ struct s_MergeState { /* This function is used by unsafe_object_compare to optimize comparisons * when we know our list is type-homogeneous but we can't assume anything else. - * In the pre-sort check it is set equal to key->ob_type->tp_richcompare */ + * In the pre-sort check it is set equal to Py_TYPE(key)->tp_richcompare */ PyObject *(*key_richcompare)(PyObject *, PyObject *, int); /* This function is used by unsafe_tuple_compare to compare the first elements @@ -2051,7 +2015,7 @@ unsafe_object_compare(PyObject *v, PyObject *w, MergeState *ms) PyObject *res_obj; int res; /* No assumptions, because we check first: */ - if (v->ob_type->tp_richcompare != ms->key_richcompare) + if (Py_TYPE(v)->tp_richcompare != ms->key_richcompare) return PyObject_RichCompareBool(v, w, Py_LT); assert(ms->key_richcompare != NULL); @@ -2088,8 +2052,8 @@ unsafe_latin_compare(PyObject *v, PyObject *w, MergeState *ms) int res; /* Modified from Objects/unicodeobject.c:unicode_compare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyUnicode_Type); + assert(Py_IS_TYPE(v, &PyUnicode_Type)); + assert(Py_IS_TYPE(w, &PyUnicode_Type)); assert(PyUnicode_KIND(v) == PyUnicode_KIND(w)); assert(PyUnicode_KIND(v) == PyUnicode_1BYTE_KIND); @@ -2111,8 +2075,8 @@ unsafe_long_compare(PyObject *v, PyObject *w, MergeState *ms) PyLongObject *vl, *wl; sdigit v0, w0; int res; /* Modified from Objects/longobject.c:long_compare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyLong_Type); + assert(Py_IS_TYPE(v, &PyLong_Type)); + assert(Py_IS_TYPE(w, &PyLong_Type)); assert(Py_ABS(Py_SIZE(v)) <= 1); assert(Py_ABS(Py_SIZE(w)) <= 1); @@ -2139,8 +2103,8 @@ unsafe_float_compare(PyObject *v, PyObject *w, MergeState *ms) int res; /* Modified from Objects/floatobject.c:float_richcompare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyFloat_Type); + assert(Py_IS_TYPE(v, &PyFloat_Type)); + assert(Py_IS_TYPE(w, &PyFloat_Type)); res = PyFloat_AS_DOUBLE(v) < PyFloat_AS_DOUBLE(w); assert(res == PyObject_RichCompareBool(v, w, Py_LT)); @@ -2161,8 +2125,8 @@ unsafe_tuple_compare(PyObject *v, PyObject *w, MergeState *ms) int k; /* Modified from Objects/tupleobject.c:tuplerichcompare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyTuple_Type); + assert(Py_IS_TYPE(v, &PyTuple_Type)); + assert(Py_IS_TYPE(w, &PyTuple_Type)); assert(Py_SIZE(v) > 0); assert(Py_SIZE(w) > 0); @@ -2240,7 +2204,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) saved_ob_size = Py_SIZE(self); saved_ob_item = self->ob_item; saved_allocated = self->allocated; - Py_SIZE(self) = 0; + Py_SET_SIZE(self, 0); self->ob_item = NULL; self->allocated = -1; /* any operation will reset it to >= 0 */ @@ -2262,8 +2226,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) } for (i = 0; i < saved_ob_size ; i++) { - keys[i] = PyObject_CallFunctionObjArgs(keyfunc, saved_ob_item[i], - NULL); + keys[i] = PyObject_CallOneArg(keyfunc, saved_ob_item[i]); if (keys[i] == NULL) { for (i=i-1 ; i>=0 ; i--) Py_DECREF(keys[i]); @@ -2284,12 +2247,12 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) * set ms appropriately. */ if (saved_ob_size > 1) { /* Assume the first element is representative of the whole list. */ - int keys_are_in_tuples = (lo.keys[0]->ob_type == &PyTuple_Type && + int keys_are_in_tuples = (Py_IS_TYPE(lo.keys[0], &PyTuple_Type) && Py_SIZE(lo.keys[0]) > 0); PyTypeObject* key_type = (keys_are_in_tuples ? - PyTuple_GET_ITEM(lo.keys[0], 0)->ob_type : - lo.keys[0]->ob_type); + Py_TYPE(PyTuple_GET_ITEM(lo.keys[0], 0)) : + Py_TYPE(lo.keys[0])); int keys_are_all_same_type = 1; int strings_are_latin = 1; @@ -2299,7 +2262,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) for (i=0; i < saved_ob_size; i++) { if (keys_are_in_tuples && - !(lo.keys[i]->ob_type == &PyTuple_Type && Py_SIZE(lo.keys[i]) != 0)) { + !(Py_IS_TYPE(lo.keys[i], &PyTuple_Type) && Py_SIZE(lo.keys[i]) != 0)) { keys_are_in_tuples = 0; keys_are_all_same_type = 0; break; @@ -2312,7 +2275,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) PyTuple_GET_ITEM(lo.keys[i], 0) : lo.keys[i]); - if (key->ob_type != key_type) { + if (!Py_IS_TYPE(key, key_type)) { keys_are_all_same_type = 0; /* If keys are in tuple we must loop over the whole list to make sure all items are tuples */ @@ -2458,7 +2421,7 @@ fail: keyfunc_fail: final_ob_item = self->ob_item; i = Py_SIZE(self); - Py_SIZE(self) = saved_ob_size; + Py_SET_SIZE(self, saved_ob_size); self->ob_item = saved_ob_item; self->allocated = saved_allocated; if (final_ob_item != NULL) { @@ -2680,8 +2643,7 @@ list_richcompare(PyObject *v, PyObject *w, int op) Py_INCREF(vitem); Py_INCREF(witem); - int k = PyObject_RichCompareBool(vl->ob_item[i], - wl->ob_item[i], Py_EQ); + int k = PyObject_RichCompareBool(vitem, witem, Py_EQ); Py_DECREF(vitem); Py_DECREF(witem); if (k < 0) @@ -2755,6 +2717,33 @@ list___init___impl(PyListObject *self, PyObject *iterable) return 0; } +static PyObject * +list_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + if (!_PyArg_NoKwnames("list", kwnames)) { + return NULL; + } + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("list", nargs, 0, 1)) { + return NULL; + } + + assert(PyType_Check(type)); + PyObject *list = PyType_GenericAlloc((PyTypeObject *)type, 0); + if (list == NULL) { + return NULL; + } + if (nargs) { + if (list___init___impl((PyListObject *)list, args[0])) { + Py_DECREF(list); + return NULL; + } + } + return list; +} + + /*[clinic input] list.__sizeof__ @@ -2789,6 +2778,7 @@ static PyMethodDef list_methods[] = { LIST_COUNT_METHODDEF LIST_REVERSE_METHODDEF LIST_SORT_METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -2808,7 +2798,7 @@ static PySequenceMethods list_as_sequence = { static PyObject * list_subscript(PyListObject* self, PyObject* item) { - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { Py_ssize_t i; i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) @@ -2818,7 +2808,8 @@ list_subscript(PyListObject* self, PyObject* item) return list_item(self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; PyObject* result; PyObject* it; PyObject **src, **dest; @@ -2847,14 +2838,14 @@ list_subscript(PyListObject* self, PyObject* item) Py_INCREF(it); dest[i] = it; } - Py_SIZE(result) = slicelength; + Py_SET_SIZE(result, slicelength); return result; } } else { PyErr_Format(PyExc_TypeError, "list indices must be integers or slices, not %.200s", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); return NULL; } } @@ -2862,7 +2853,7 @@ list_subscript(PyListObject* self, PyObject* item) static int list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) { - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return -1; @@ -2940,7 +2931,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) sizeof(PyObject *)); } - Py_SIZE(self) -= slicelength; + Py_SET_SIZE(self, Py_SIZE(self) - slicelength); res = list_resize(self, Py_SIZE(self)); for (i = 0; i < slicelength; i++) { @@ -2954,7 +2945,8 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) /* assign slice */ PyObject *ins, *seq; PyObject **garbage, **seqitems, **selfitems; - Py_ssize_t cur, i; + Py_ssize_t i; + size_t cur; /* protect against a[::-1] = a */ if (self == (PyListObject*)value) { @@ -3016,7 +3008,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) else { PyErr_Format(PyExc_TypeError, "list indices must be integers or slices, not %.200s", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); return -1; } } @@ -3068,6 +3060,7 @@ PyTypeObject PyList_Type = { PyType_GenericAlloc, /* tp_alloc */ PyType_GenericNew, /* tp_new */ PyObject_GC_Del, /* tp_free */ + .tp_vectorcall = list_vectorcall, }; /*********************** List Iterator **************************/ diff --git a/Objects/longobject.c b/Objects/longobject.c index 67dce974..0ff0e80c 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -3,6 +3,8 @@ /* XXX The functional organization of this file is terrible */ #include "Python.h" +#include "pycore_interp.h" // _PY_NSMALLPOSINTS +#include "pycore_pystate.h" // _Py_IsMainInterpreter() #include "longintrepr.h" #include @@ -15,12 +17,8 @@ class int "PyObject *" "&PyLong_Type" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=ec0275e3422a36e3]*/ -#ifndef NSMALLPOSINTS -#define NSMALLPOSINTS 257 -#endif -#ifndef NSMALLNEGINTS -#define NSMALLNEGINTS 5 -#endif +#define NSMALLPOSINTS _PY_NSMALLPOSINTS +#define NSMALLNEGINTS _PY_NSMALLNEGINTS _Py_IDENTIFIER(little); _Py_IDENTIFIER(big); @@ -35,42 +33,25 @@ PyObject *_PyLong_Zero = NULL; PyObject *_PyLong_One = NULL; #if NSMALLNEGINTS + NSMALLPOSINTS > 0 -/* Small integers are preallocated in this array so that they - can be shared. - The integers that are preallocated are those in the range - -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive). -*/ -static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS]; -#ifdef COUNT_ALLOCS -Py_ssize_t _Py_quick_int_allocs, _Py_quick_neg_int_allocs; -#endif +#define IS_SMALL_INT(ival) (-NSMALLNEGINTS <= (ival) && (ival) < NSMALLPOSINTS) +#define IS_SMALL_UINT(ival) ((ival) < NSMALLPOSINTS) static PyObject * get_small_int(sdigit ival) { - PyObject *v; - assert(-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS); - v = (PyObject *)&small_ints[ival + NSMALLNEGINTS]; + assert(IS_SMALL_INT(ival)); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *v = (PyObject*)tstate->interp->small_ints[ival + NSMALLNEGINTS]; Py_INCREF(v); -#ifdef COUNT_ALLOCS - if (ival >= 0) - _Py_quick_int_allocs++; - else - _Py_quick_neg_int_allocs++; -#endif return v; } -#define CHECK_SMALL_INT(ival) \ - do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \ - return get_small_int((sdigit)ival); \ - } while(0) static PyLongObject * maybe_small_long(PyLongObject *v) { if (v && Py_ABS(Py_SIZE(v)) <= 1) { sdigit ival = MEDIUM_VALUE(v); - if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { + if (IS_SMALL_INT(ival)) { Py_DECREF(v); return (PyLongObject *)get_small_int(ival); } @@ -78,7 +59,9 @@ maybe_small_long(PyLongObject *v) return v; } #else -#define CHECK_SMALL_INT(ival) +#define IS_SMALL_INT(ival) 0 +#define IS_SMALL_UINT(ival) 0 +#define get_small_int(ival) (Py_UNREACHABLE(), NULL) #define maybe_small_long(val) (val) #endif @@ -91,7 +74,7 @@ _PyLong_Negate(PyLongObject **x_p) x = (PyLongObject *)*x_p; if (Py_REFCNT(x) == 1) { - Py_SIZE(x) = -Py_SIZE(x); + Py_SET_SIZE(x, -Py_SIZE(x)); return; } @@ -130,8 +113,9 @@ long_normalize(PyLongObject *v) while (i > 0 && v->ob_digit[i-1] == 0) --i; - if (i != j) - Py_SIZE(v) = (Py_SIZE(v) < 0) ? -(i) : i; + if (i != j) { + Py_SET_SIZE(v, (Py_SIZE(v) < 0) ? -(i) : i); + } return v; } @@ -168,7 +152,7 @@ _PyLong_FromNbInt(PyObject *integral) if (!PyLong_Check(result)) { PyErr_Format(PyExc_TypeError, "__int__ returned non-int (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -177,7 +161,7 @@ _PyLong_FromNbInt(PyObject *integral) "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", - result->ob_type->tp_name)) { + Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } @@ -221,7 +205,7 @@ _PyLong_FromNbIndexOrNbInt(PyObject *integral) if (!PyLong_Check(result)) { PyErr_Format(PyExc_TypeError, "__index__ returned non-int (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -230,7 +214,7 @@ _PyLong_FromNbIndexOrNbInt(PyObject *integral) "__index__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", - result->ob_type->tp_name)) + Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; @@ -293,13 +277,16 @@ _PyLong_Copy(PyLongObject *src) i = -(i); if (i < 2) { sdigit ival = MEDIUM_VALUE(src); - CHECK_SMALL_INT(ival); + if (IS_SMALL_INT(ival)) { + return get_small_int(ival); + } } result = _PyLong_New(i); if (result != NULL) { - Py_SIZE(result) = Py_SIZE(src); - while (--i >= 0) + Py_SET_SIZE(result, Py_SIZE(src)); + while (--i >= 0) { result->ob_digit[i] = src->ob_digit[i]; + } } return (PyObject *)result; } @@ -315,7 +302,9 @@ PyLong_FromLong(long ival) int ndigits = 0; int sign; - CHECK_SMALL_INT(ival); + if (IS_SMALL_INT(ival)) { + return get_small_int((sdigit)ival); + } if (ival < 0) { /* negate: can't write this as abs_ival = -ival since that @@ -332,7 +321,7 @@ PyLong_FromLong(long ival) if (!(abs_ival >> PyLong_SHIFT)) { v = _PyLong_New(1); if (v) { - Py_SIZE(v) = sign; + Py_SET_SIZE(v, sign); v->ob_digit[0] = Py_SAFE_DOWNCAST( abs_ival, unsigned long, digit); } @@ -344,7 +333,7 @@ PyLong_FromLong(long ival) if (!(abs_ival >> 2*PyLong_SHIFT)) { v = _PyLong_New(2); if (v) { - Py_SIZE(v) = 2*sign; + Py_SET_SIZE(v, 2 * sign); v->ob_digit[0] = Py_SAFE_DOWNCAST( abs_ival & PyLong_MASK, unsigned long, digit); v->ob_digit[1] = Py_SAFE_DOWNCAST( @@ -363,7 +352,7 @@ PyLong_FromLong(long ival) v = _PyLong_New(ndigits); if (v != NULL) { digit *p = v->ob_digit; - Py_SIZE(v) = ndigits*sign; + Py_SET_SIZE(v, ndigits * sign); t = abs_ival; while (t) { *p++ = Py_SAFE_DOWNCAST( @@ -374,32 +363,52 @@ PyLong_FromLong(long ival) return (PyObject *)v; } +#define PYLONG_FROM_UINT(INT_TYPE, ival) \ + do { \ + if (IS_SMALL_UINT(ival)) { \ + return get_small_int((sdigit)(ival)); \ + } \ + /* Count the number of Python digits. */ \ + Py_ssize_t ndigits = 0; \ + INT_TYPE t = (ival); \ + while (t) { \ + ++ndigits; \ + t >>= PyLong_SHIFT; \ + } \ + PyLongObject *v = _PyLong_New(ndigits); \ + if (v == NULL) { \ + return NULL; \ + } \ + digit *p = v->ob_digit; \ + while ((ival)) { \ + *p++ = (digit)((ival) & PyLong_MASK); \ + (ival) >>= PyLong_SHIFT; \ + } \ + return (PyObject *)v; \ + } while(0) + /* Create a new int object from a C unsigned long int */ PyObject * PyLong_FromUnsignedLong(unsigned long ival) { - PyLongObject *v; - unsigned long t; - int ndigits = 0; + PYLONG_FROM_UINT(unsigned long, ival); +} - if (ival < PyLong_BASE) - return PyLong_FromLong(ival); - /* Count the number of Python digits. */ - t = ival; - while (t) { - ++ndigits; - t >>= PyLong_SHIFT; - } - v = _PyLong_New(ndigits); - if (v != NULL) { - digit *p = v->ob_digit; - while (ival) { - *p++ = (digit)(ival & PyLong_MASK); - ival >>= PyLong_SHIFT; - } - } - return (PyObject *)v; +/* Create a new int object from a C unsigned long long int. */ + +PyObject * +PyLong_FromUnsignedLongLong(unsigned long long ival) +{ + PYLONG_FROM_UINT(unsigned long long, ival); +} + +/* Create a new int object from a C size_t. */ + +PyObject * +PyLong_FromSize_t(size_t ival) +{ + PYLONG_FROM_UINT(size_t, ival); } /* Create a new int object from a C double */ @@ -407,6 +416,21 @@ PyLong_FromUnsignedLong(unsigned long ival) PyObject * PyLong_FromDouble(double dval) { + /* Try to get out cheap if this fits in a long. When a finite value of real + * floating type is converted to an integer type, the value is truncated + * toward zero. If the value of the integral part cannot be represented by + * the integer type, the behavior is undefined. Thus, we must check that + * value is in range (LONG_MIN - 1, LONG_MAX + 1). If a long has more bits + * of precision than a double, casting LONG_MIN - 1 to double may yield an + * approximation, but LONG_MAX + 1 is a power of two and can be represented + * as double exactly (assuming FLT_RADIX is 2 or 16), so for simplicity + * check against [-(LONG_MAX + 1), LONG_MAX + 1). + */ + const double int_max = (unsigned long)LONG_MAX + 1; + if (-int_max < dval && dval < int_max) { + return PyLong_FromLong((long)dval); + } + PyLongObject *v; double frac; int i, ndig, expo, neg; @@ -426,8 +450,7 @@ PyLong_FromDouble(double dval) dval = -dval; } frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */ - if (expo <= 0) - return PyLong_FromLong(0L); + assert(expo > 0); ndig = (expo-1) / PyLong_SHIFT + 1; /* Number of 'digits' in result */ v = _PyLong_New(ndig); if (v == NULL) @@ -439,8 +462,9 @@ PyLong_FromDouble(double dval) frac = frac - (double)bits; frac = ldexp(frac, PyLong_SHIFT); } - if (neg) - Py_SIZE(v) = -(Py_SIZE(v)); + if (neg) { + Py_SET_SIZE(v, -(Py_SIZE(v))); + } return (PyObject *)v; } @@ -787,26 +811,6 @@ _PyLong_Sign(PyObject *vv) return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1); } -/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d < - 2**k if d is nonzero, else 0. */ - -static const unsigned char BitLengthTable[32] = { - 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 -}; - -static int -bits_in_digit(digit d) -{ - int d_bits = 0; - while (d >= 32) { - d_bits += 6; - d >>= 6; - } - d_bits += (int)BitLengthTable[d]; - return d_bits; -} - size_t _PyLong_NumBits(PyObject *vv) { @@ -824,7 +828,7 @@ _PyLong_NumBits(PyObject *vv) if ((size_t)(ndigits - 1) > SIZE_MAX / (size_t)PyLong_SHIFT) goto Overflow; result = (size_t)(ndigits - 1) * (size_t)PyLong_SHIFT; - msd_bits = bits_in_digit(msd); + msd_bits = _Py_bit_length(msd); if (SIZE_MAX - msd_bits < result) goto Overflow; result += msd_bits; @@ -944,7 +948,7 @@ _PyLong_FromByteArray(const unsigned char* bytes, size_t n, } } - Py_SIZE(v) = is_signed ? -idigit : idigit; + Py_SET_SIZE(v, is_signed ? -idigit : idigit); return (PyObject *)long_normalize(v); } @@ -1133,7 +1137,7 @@ PyLong_AsVoidPtr(PyObject *vv) * rewritten to use the newer PyLong_{As,From}ByteArray API. */ -#define PY_ABS_LLONG_MIN (0-(unsigned long long)PY_LLONG_MIN) +#define PY_ABS_LLONG_MIN (0-(unsigned long long)LLONG_MIN) /* Create a new int object from a C long long int. */ @@ -1146,7 +1150,10 @@ PyLong_FromLongLong(long long ival) int ndigits = 0; int negative = 0; - CHECK_SMALL_INT(ival); + if (IS_SMALL_INT(ival)) { + return get_small_int((sdigit)ival); + } + if (ival < 0) { /* avoid signed overflow on negation; see comments in PyLong_FromLong above. */ @@ -1169,7 +1176,7 @@ PyLong_FromLongLong(long long ival) v = _PyLong_New(ndigits); if (v != NULL) { digit *p = v->ob_digit; - Py_SIZE(v) = negative ? -ndigits : ndigits; + Py_SET_SIZE(v, negative ? -ndigits : ndigits); t = abs_ival; while (t) { *p++ = (digit)(t & PyLong_MASK); @@ -1179,34 +1186,6 @@ PyLong_FromLongLong(long long ival) return (PyObject *)v; } -/* Create a new int object from a C unsigned long long int. */ - -PyObject * -PyLong_FromUnsignedLongLong(unsigned long long ival) -{ - PyLongObject *v; - unsigned long long t; - int ndigits = 0; - - if (ival < PyLong_BASE) - return PyLong_FromLong((long)ival); - /* Count the number of Python digits. */ - t = ival; - while (t) { - ++ndigits; - t >>= PyLong_SHIFT; - } - v = _PyLong_New(ndigits); - if (v != NULL) { - digit *p = v->ob_digit; - while (ival) { - *p++ = (digit)(ival & PyLong_MASK); - ival >>= PyLong_SHIFT; - } - } - return (PyObject *)v; -} - /* Create a new int object from a C Py_ssize_t. */ PyObject * @@ -1218,7 +1197,10 @@ PyLong_FromSsize_t(Py_ssize_t ival) int ndigits = 0; int negative = 0; - CHECK_SMALL_INT(ival); + if (IS_SMALL_INT(ival)) { + return get_small_int((sdigit)ival); + } + if (ival < 0) { /* avoid signed overflow when ival = SIZE_T_MIN */ abs_ival = (size_t)(-1-ival)+1; @@ -1237,7 +1219,7 @@ PyLong_FromSsize_t(Py_ssize_t ival) v = _PyLong_New(ndigits); if (v != NULL) { digit *p = v->ob_digit; - Py_SIZE(v) = negative ? -ndigits : ndigits; + Py_SET_SIZE(v, negative ? -ndigits : ndigits); t = abs_ival; while (t) { *p++ = (digit)(t & PyLong_MASK); @@ -1247,35 +1229,6 @@ PyLong_FromSsize_t(Py_ssize_t ival) return (PyObject *)v; } -/* Create a new int object from a C size_t. */ - -PyObject * -PyLong_FromSize_t(size_t ival) -{ - PyLongObject *v; - size_t t; - int ndigits = 0; - - if (ival < PyLong_BASE) - return PyLong_FromLong((long)ival); - /* Count the number of Python digits. */ - t = ival; - while (t) { - ++ndigits; - t >>= PyLong_SHIFT; - } - v = _PyLong_New(ndigits); - if (v != NULL) { - digit *p = v->ob_digit; - Py_SIZE(v) = ndigits; - while (ival) { - *p++ = (digit)(ival & PyLong_MASK); - ival >>= PyLong_SHIFT; - } - } - return (PyObject *)v; -} - /* Get a C long long int from an int object or any object that has an __int__ method. Return -1 and set an error if overflow occurs. */ @@ -1488,11 +1441,11 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow) /* Haven't lost any bits, but casting to long requires extra * care (see comment above). */ - if (x <= (unsigned long long)PY_LLONG_MAX) { + if (x <= (unsigned long long)LLONG_MAX) { res = (long long)x * sign; } else if (sign < 0 && x == PY_ABS_LLONG_MIN) { - res = PY_LLONG_MIN; + res = LLONG_MIN; } else { *overflow = sign; @@ -1985,7 +1938,7 @@ long_format_binary(PyObject *aa, int base, int alternate, return -1; } size_a_in_bits = (size_a - 1) * PyLong_SHIFT + - bits_in_digit(a->ob_digit[size_a - 1]); + _Py_bit_length(a->ob_digit[size_a - 1]); /* Allow 1 character for a '-' sign. */ sz = negative + (size_a_in_bits + (bits - 1)) / bits; } @@ -2290,7 +2243,7 @@ PyLong_FromString(const char *str, char **pend, int base) "int() arg 2 must be >= 2 and <= 36"); return NULL; } - while (*str != '\0' && Py_ISSPACE(Py_CHARMASK(*str))) { + while (*str != '\0' && Py_ISSPACE(*str)) { str++; } if (*str == '+') { @@ -2508,7 +2461,7 @@ digit beyond the first. if (z == NULL) { return NULL; } - Py_SIZE(z) = 0; + Py_SET_SIZE(z, 0); /* `convwidth` consecutive input digits are treated as a single * digit in base `convmultmax`. @@ -2558,7 +2511,7 @@ digit beyond the first. assert(c < PyLong_BASE); if (Py_SIZE(z) < size_z) { *pz = (digit)c; - ++Py_SIZE(z); + Py_SET_SIZE(z, Py_SIZE(z) + 1); } else { PyLongObject *tmp; @@ -2597,9 +2550,9 @@ digit beyond the first. goto onError; } if (sign < 0) { - Py_SIZE(z) = -(Py_SIZE(z)); + Py_SET_SIZE(z, -(Py_SIZE(z))); } - while (*str && Py_ISSPACE(Py_CHARMASK(*str))) { + while (*str && Py_ISSPACE(*str)) { str++; } if (*str != '\0') { @@ -2805,7 +2758,7 @@ x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem) /* normalize: shift w1 left so that its top digit is >= PyLong_BASE/2. shift v1 left by the same amount. Results go into w and v. */ - d = PyLong_SHIFT - bits_in_digit(w1->ob_digit[size_w-1]); + d = PyLong_SHIFT - _Py_bit_length(w1->ob_digit[size_w-1]); carry = v_lshift(w->ob_digit, w1->ob_digit, size_w, d); assert(carry == 0); carry = v_lshift(v->ob_digit, v1->ob_digit, size_v, d); @@ -2913,7 +2866,8 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e) { Py_ssize_t a_size, a_bits, shift_digits, shift_bits, x_size; /* See below for why x_digits is always large enough. */ - digit rem, x_digits[2 + (DBL_MANT_DIG + 1) / PyLong_SHIFT]; + digit rem; + digit x_digits[2 + (DBL_MANT_DIG + 1) / PyLong_SHIFT] = {0,}; double dx; /* Correction term for round-half-to-even rounding. For a digit x, "x + half_even_correction[x & 7]" gives x rounded to the nearest @@ -2926,7 +2880,7 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e) *e = 0; return 0.0; } - a_bits = bits_in_digit(a->ob_digit[a_size-1]); + a_bits = _Py_bit_length(a->ob_digit[a_size-1]); /* The following is an overflow-free version of the check "if ((a_size - 1) * PyLong_SHIFT + a_bits > PY_SSIZE_T_MAX) ..." */ if (a_size >= (PY_SSIZE_T_MAX - 1) / PyLong_SHIFT + 1 && @@ -2963,9 +2917,7 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e) if (a_bits <= DBL_MANT_DIG + 2) { shift_digits = (DBL_MANT_DIG + 2 - a_bits) / PyLong_SHIFT; shift_bits = (DBL_MANT_DIG + 2 - a_bits) % PyLong_SHIFT; - x_size = 0; - while (x_size < shift_digits) - x_digits[x_size++] = 0; + x_size = shift_digits; rem = v_lshift(x_digits + x_size, a->ob_digit, a_size, (int)shift_bits); x_size += a_size; @@ -3053,33 +3005,32 @@ PyLong_AsDouble(PyObject *v) /* Methods */ -static int +/* if a < b, return a negative number + if a == b, return 0 + if a > b, return a positive number */ + +static Py_ssize_t long_compare(PyLongObject *a, PyLongObject *b) { - Py_ssize_t sign; - - if (Py_SIZE(a) != Py_SIZE(b)) { - sign = Py_SIZE(a) - Py_SIZE(b); - } - else { + Py_ssize_t sign = Py_SIZE(a) - Py_SIZE(b); + if (sign == 0) { Py_ssize_t i = Py_ABS(Py_SIZE(a)); - while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i]) - ; - if (i < 0) - sign = 0; - else { - sign = (sdigit)a->ob_digit[i] - (sdigit)b->ob_digit[i]; - if (Py_SIZE(a) < 0) - sign = -sign; + sdigit diff = 0; + while (--i >= 0) { + diff = (sdigit) a->ob_digit[i] - (sdigit) b->ob_digit[i]; + if (diff) { + break; + } } + sign = Py_SIZE(a) < 0 ? -diff : diff; } - return sign < 0 ? -1 : sign > 0 ? 1 : 0; + return sign; } static PyObject * long_richcompare(PyObject *self, PyObject *other, int op) { - int result; + Py_ssize_t result; CHECK_BINOP(self, other); if (self == other) result = 0; @@ -3231,9 +3182,9 @@ x_sub(PyLongObject *a, PyLongObject *b) } assert(borrow == 0); if (sign < 0) { - Py_SIZE(z) = -Py_SIZE(z); + Py_SET_SIZE(z, -Py_SIZE(z)); } - return long_normalize(z); + return maybe_small_long(long_normalize(z)); } static PyObject * @@ -3255,7 +3206,7 @@ long_add(PyLongObject *a, PyLongObject *b) That also means z is not an element of small_ints, so negating it in-place is safe. */ assert(Py_REFCNT(z) == 1); - Py_SIZE(z) = -(Py_SIZE(z)); + Py_SET_SIZE(z, -(Py_SIZE(z))); } } else @@ -3281,13 +3232,15 @@ long_sub(PyLongObject *a, PyLongObject *b) return PyLong_FromLong(MEDIUM_VALUE(a) - MEDIUM_VALUE(b)); } if (Py_SIZE(a) < 0) { - if (Py_SIZE(b) < 0) - z = x_sub(a, b); - else + if (Py_SIZE(b) < 0) { + z = x_sub(b, a); + } + else { z = x_add(a, b); - if (z != NULL) { - assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1); - Py_SIZE(z) = -(Py_SIZE(z)); + if (z != NULL) { + assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1); + Py_SET_SIZE(z, -(Py_SIZE(z))); + } } } else { @@ -3679,7 +3632,7 @@ k_lopsided_mul(PyLongObject *a, PyLongObject *b) /* Multiply the next slice of b by a. */ memcpy(bslice->ob_digit, b->ob_digit + nbdone, nbtouse * sizeof(digit)); - Py_SIZE(bslice) = nbtouse; + Py_SET_SIZE(bslice, nbtouse); product = k_mul(a, bslice); if (product == NULL) goto fail; @@ -4020,8 +3973,8 @@ long_true_divide(PyObject *v, PyObject *w) /* Extreme underflow */ goto underflow_or_zero; /* Next line is now safe from overflowing a Py_ssize_t */ - diff = diff * PyLong_SHIFT + bits_in_digit(a->ob_digit[a_size - 1]) - - bits_in_digit(b->ob_digit[b_size - 1]); + diff = diff * PyLong_SHIFT + _Py_bit_length(a->ob_digit[a_size - 1]) - + _Py_bit_length(b->ob_digit[b_size - 1]); /* Now diff = a_bits - b_bits. */ if (diff > DBL_MAX_EXP) goto overflow; @@ -4097,7 +4050,7 @@ long_true_divide(PyObject *v, PyObject *w) } x_size = Py_ABS(Py_SIZE(x)); assert(x_size > 0); /* result of division is never zero */ - x_bits = (x_size-1)*PyLong_SHIFT+bits_in_digit(x->ob_digit[x_size-1]); + x_bits = (x_size-1)*PyLong_SHIFT+_Py_bit_length(x->ob_digit[x_size-1]); /* The number of extra bits that have to be rounded away. */ extra_bits = Py_MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG; @@ -4495,7 +4448,7 @@ long_neg(PyLongObject *v) return PyLong_FromLong(-MEDIUM_VALUE(v)); z = (PyLongObject *)_PyLong_Copy(v); if (z != NULL) - Py_SIZE(z) = -(Py_SIZE(v)); + Py_SET_SIZE(z, -(Py_SIZE(v))); return (PyObject *)z; } @@ -4640,7 +4593,7 @@ long_lshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift) return NULL; if (Py_SIZE(a) < 0) { assert(Py_REFCNT(z) == 1); - Py_SIZE(z) = -Py_SIZE(z); + Py_SET_SIZE(z, -Py_SIZE(z)); } for (i = 0; i < wordshift; i++) z->ob_digit[i] = 0; @@ -4824,7 +4777,7 @@ long_bitwise(PyLongObject *a, /* Complement result if negative. */ if (negz) { - Py_SIZE(z) = -(Py_SIZE(z)); + Py_SET_SIZE(z, -(Py_SIZE(z))); z->ob_digit[size_z] = PyLong_MASK; v_complement(z->ob_digit, z->ob_digit, size_z+1); } @@ -4911,7 +4864,7 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) alloc_b = Py_SIZE(b); /* reduce until a fits into 2 digits */ while ((size_a = Py_SIZE(a)) > 2) { - nbits = bits_in_digit(a->ob_digit[size_a-1]); + nbits = _Py_bit_length(a->ob_digit[size_a-1]); /* extract top 2*PyLong_SHIFT bits of a into x, along with corresponding bits of b into y */ size_b = Py_SIZE(b); @@ -4971,8 +4924,9 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) T = -A; A = -B; B = T; T = -C; C = -D; D = T; } - if (c != NULL) - Py_SIZE(c) = size_a; + if (c != NULL) { + Py_SET_SIZE(c, size_a); + } else if (Py_REFCNT(a) == 1) { Py_INCREF(a); c = a; @@ -4984,12 +4938,13 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) goto error; } - if (d != NULL) - Py_SIZE(d) = size_a; + if (d != NULL) { + Py_SET_SIZE(d, size_a); + } else if (Py_REFCNT(b) == 1 && size_a <= alloc_b) { Py_INCREF(b); d = b; - Py_SIZE(d) = size_a; + Py_SET_SIZE(d, size_a); } else { alloc_b = size_a; @@ -5045,7 +5000,7 @@ simple: /* a fits into a long, so b must too */ x = PyLong_AsLong((PyObject *)a); y = PyLong_AsLong((PyObject *)b); -#elif PY_LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT +#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT x = PyLong_AsLongLong((PyObject *)a); y = PyLong_AsLongLong((PyObject *)b); #else @@ -5064,7 +5019,7 @@ simple: } #if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT return PyLong_FromLong(x); -#elif PY_LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT +#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT return PyLong_FromLongLong(x); #else # error "_PyLong_GCD" @@ -5130,7 +5085,7 @@ long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase) if (PyUnicode_Check(x)) return PyLong_FromUnicodeObject(x, (int)base); else if (PyByteArray_Check(x) || PyBytes_Check(x)) { - char *string; + const char *string; if (PyByteArray_Check(x)) string = PyByteArray_AS_STRING(x); else @@ -5169,9 +5124,10 @@ long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase) return NULL; } assert(PyLong_Check(newobj)); - Py_SIZE(newobj) = Py_SIZE(tmp); - for (i = 0; i < n; i++) + Py_SET_SIZE(newobj, Py_SIZE(tmp)); + for (i = 0; i < n; i++) { newobj->ob_digit[i] = tmp->ob_digit[i]; + } Py_DECREF(tmp); return (PyObject *)newobj; } @@ -5235,7 +5191,8 @@ _PyLong_DivmodNear(PyObject *a, PyObject *b) { PyLongObject *quo = NULL, *rem = NULL; PyObject *twice_rem, *result, *temp; - int cmp, quo_is_odd, quo_is_neg; + int quo_is_odd, quo_is_neg; + Py_ssize_t cmp; /* Equivalent Python code: @@ -5428,7 +5385,7 @@ int_bit_length_impl(PyObject *self) return PyLong_FromLong(0); msd = ((PyLongObject *)self)->ob_digit[ndigits-1]; - msd_bits = bits_in_digit(msd); + msd_bits = _Py_bit_length(msd); if (ndigits <= PY_SSIZE_T_MAX/PyLong_SHIFT) return PyLong_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits); @@ -5604,8 +5561,7 @@ int_from_bytes_impl(PyTypeObject *type, PyObject *bytes_obj, Py_DECREF(bytes); if (long_obj != NULL && type != &PyLong_Type) { - Py_SETREF(long_obj, PyObject_CallFunctionObjArgs((PyObject *)type, - long_obj, NULL)); + Py_SETREF(long_obj, PyObject_CallOneArg((PyObject *)type, long_obj)); } return long_obj; @@ -5796,68 +5752,58 @@ PyLong_GetInfo(void) } int -_PyLong_Init(void) +_PyLong_Init(PyThreadState *tstate) { #if NSMALLNEGINTS + NSMALLPOSINTS > 0 - int ival, size; - PyLongObject *v = small_ints; - - for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++, v++) { - size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1); - if (Py_TYPE(v) == &PyLong_Type) { - /* The element is already initialized, most likely - * the Python interpreter was initialized before. - */ - Py_ssize_t refcnt; - PyObject* op = (PyObject*)v; - - refcnt = Py_REFCNT(op) < 0 ? 0 : Py_REFCNT(op); - _Py_NewReference(op); - /* _Py_NewReference sets the ref count to 1 but - * the ref count might be larger. Set the refcnt - * to the original refcnt + 1 */ - Py_REFCNT(op) = refcnt + 1; - assert(Py_SIZE(op) == size); - assert(v->ob_digit[0] == (digit)abs(ival)); - } - else { - (void)PyObject_INIT(v, &PyLong_Type); + for (Py_ssize_t i=0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { + sdigit ival = (sdigit)i - NSMALLNEGINTS; + int size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1); + + PyLongObject *v = _PyLong_New(1); + if (!v) { + return -1; } - Py_SIZE(v) = size; + + Py_SET_SIZE(v, size); v->ob_digit[0] = (digit)abs(ival); + + tstate->interp->small_ints[i] = v; } #endif - _PyLong_Zero = PyLong_FromLong(0); - if (_PyLong_Zero == NULL) - return 0; - _PyLong_One = PyLong_FromLong(1); - if (_PyLong_One == NULL) - return 0; - /* initialize int_info */ - if (Int_InfoType.tp_name == NULL) { - if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) { + if (_Py_IsMainInterpreter(tstate)) { + _PyLong_Zero = PyLong_FromLong(0); + if (_PyLong_Zero == NULL) { return 0; } + + _PyLong_One = PyLong_FromLong(1); + if (_PyLong_One == NULL) { + return 0; + } + + /* initialize int_info */ + if (Int_InfoType.tp_name == NULL) { + if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) { + return 0; + } + } } return 1; } void -PyLong_Fini(void) +_PyLong_Fini(PyThreadState *tstate) { - /* Integers are currently statically allocated. Py_DECREF is not - needed, but Python must forget about the reference or multiple - reinitializations will fail. */ - Py_CLEAR(_PyLong_One); - Py_CLEAR(_PyLong_Zero); + if (_Py_IsMainInterpreter(tstate)) { + Py_CLEAR(_PyLong_One); + Py_CLEAR(_PyLong_Zero); + } + #if NSMALLNEGINTS + NSMALLPOSINTS > 0 - int i; - PyLongObject *v = small_ints; - for (i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++, v++) { - _Py_DEC_REFTOTAL; - _Py_ForgetReference((PyObject*)v); + for (Py_ssize_t i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { + Py_CLEAR(tstate->interp->small_ints[i]); } #endif } diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 0bbcbb2e..682bbe8a 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -11,9 +11,8 @@ */ #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" #include "pystrhex.h" #include @@ -1058,7 +1057,8 @@ _memory_release(PyMemoryViewObject *self) return -1; } - Py_FatalError("_memory_release(): negative export count"); + PyErr_SetString(PyExc_SystemError, + "_memory_release(): negative export count"); return -1; } @@ -1972,7 +1972,7 @@ struct_get_unpacker(const char *fmt, Py_ssize_t itemsize) if (format == NULL) goto error; - structobj = PyObject_CallFunctionObjArgs(Struct, format, NULL); + structobj = PyObject_CallOneArg(Struct, format); if (structobj == NULL) goto error; @@ -2011,7 +2011,7 @@ struct_unpack_single(const char *ptr, struct unpacker *x) PyObject *v; memcpy(x->item, ptr, x->itemsize); - v = PyObject_CallFunctionObjArgs(x->unpack_from, x->mview, NULL); + v = PyObject_CallOneArg(x->unpack_from, x->mview); if (v == NULL) return NULL; @@ -2420,8 +2420,9 @@ is_multiindex(PyObject *key) size = PyTuple_GET_SIZE(key); for (i = 0; i < size; i++) { PyObject *x = PyTuple_GET_ITEM(key, i); - if (!PyIndex_Check(x)) + if (!_PyIndex_Check(x)) { return 0; + } } return 1; } @@ -2458,7 +2459,7 @@ memory_subscript(PyMemoryViewObject *self, PyObject *key) } } - if (PyIndex_Check(key)) { + if (_PyIndex_Check(key)) { Py_ssize_t index; index = PyNumber_AsSsize_t(key, PyExc_IndexError); if (index == -1 && PyErr_Occurred()) @@ -2529,7 +2530,7 @@ memory_ass_sub(PyMemoryViewObject *self, PyObject *key, PyObject *value) } } - if (PyIndex_Check(key)) { + if (_PyIndex_Check(key)) { Py_ssize_t index; if (1 < view->ndim) { PyErr_SetString(PyExc_NotImplementedError, diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 3604a55e..5659f214 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -2,32 +2,30 @@ /* Method object implementation */ #include "Python.h" +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "structmember.h" - -/* Free list for method objects to safe malloc/free overhead - * The m_self element is used to chain the objects. - */ -static PyCFunctionObject *free_list = NULL; -static int numfree = 0; -#ifndef PyCFunction_MAXFREELIST -#define PyCFunction_MAXFREELIST 256 -#endif +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "structmember.h" // PyMemberDef /* undefine macro trampoline to PyCFunction_NewEx */ #undef PyCFunction_New +/* undefine macro trampoline to PyCMethod_New */ +#undef PyCFunction_NewEx /* Forward declarations */ static PyObject * cfunction_vectorcall_FASTCALL( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * cfunction_vectorcall_FASTCALL_KEYWORDS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * cfunction_vectorcall_FASTCALL_KEYWORDS_METHOD( + PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * cfunction_vectorcall_NOARGS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * cfunction_vectorcall_O( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * cfunction_call( + PyObject *func, PyObject *args, PyObject *kwargs); PyObject * @@ -38,10 +36,17 @@ PyCFunction_New(PyMethodDef *ml, PyObject *self) PyObject * PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) +{ + return PyCMethod_New(ml, self, module, NULL); +} + +PyObject * +PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls) { /* Figure out correct vectorcall function to use */ vectorcallfunc vectorcall; - switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS)) + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | + METH_O | METH_KEYWORDS | METH_METHOD)) { case METH_VARARGS: case METH_VARARGS | METH_KEYWORDS: @@ -61,24 +66,44 @@ PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) case METH_O: vectorcall = cfunction_vectorcall_O; break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + vectorcall = cfunction_vectorcall_FASTCALL_KEYWORDS_METHOD; + break; default: PyErr_Format(PyExc_SystemError, "%s() method: bad call flags", ml->ml_name); return NULL; } - PyCFunctionObject *op; - op = free_list; - if (op != NULL) { - free_list = (PyCFunctionObject *)(op->m_self); - (void)PyObject_INIT(op, &PyCFunction_Type); - numfree--; - } - else { + PyCFunctionObject *op = NULL; + + if (ml->ml_flags & METH_METHOD) { + if (!cls) { + PyErr_SetString(PyExc_SystemError, + "attempting to create PyCMethod with a METH_METHOD " + "flag but no class"); + return NULL; + } + PyCMethodObject *om = PyObject_GC_New(PyCMethodObject, &PyCMethod_Type); + if (om == NULL) { + return NULL; + } + Py_INCREF(cls); + om->mm_class = cls; + op = (PyCFunctionObject *)om; + } else { + if (cls) { + PyErr_SetString(PyExc_SystemError, + "attempting to create PyCFunction with class " + "but no METH_METHOD flag"); + return NULL; + } op = PyObject_GC_New(PyCFunctionObject, &PyCFunction_Type); - if (op == NULL) + if (op == NULL) { return NULL; + } } + op->m_weakreflist = NULL; op->m_ml = ml; Py_XINCREF(self); @@ -120,6 +145,16 @@ PyCFunction_GetFlags(PyObject *op) return PyCFunction_GET_FLAGS(op); } +PyTypeObject * +PyCMethod_GetClass(PyObject *op) +{ + if (!PyCFunction_Check(op)) { + PyErr_BadInternalCall(); + return NULL; + } + return PyCFunction_GET_CLASS(op); +} + /* Methods (the standard built-in methods, that is) */ static void @@ -131,14 +166,8 @@ meth_dealloc(PyCFunctionObject *m) } Py_XDECREF(m->m_self); Py_XDECREF(m->m_module); - if (numfree < PyCFunction_MAXFREELIST) { - m->m_self = (PyObject *)free_list; - free_list = m; - numfree++; - } - else { - PyObject_GC_Del(m); - } + Py_XDECREF(PyCFunction_GET_CLASS(m)); + PyObject_GC_Del(m); } static PyObject * @@ -216,6 +245,7 @@ meth_traverse(PyCFunctionObject *m, visitproc visit, void *arg) { Py_VISIT(m->m_self); Py_VISIT(m->m_module); + Py_VISIT(PyCFunction_GET_CLASS(m)); return 0; } @@ -243,7 +273,7 @@ static PyGetSetDef meth_getsets [] = { #define OFF(x) offsetof(PyCFunctionObject, x) static PyMemberDef meth_members[] = { - {"__module__", T_OBJECT, OFF(m_module), PY_WRITE_RESTRICTED}, + {"__module__", T_OBJECT, OFF(m_module), 0}, {NULL} }; @@ -255,7 +285,7 @@ meth_repr(PyCFunctionObject *m) m->m_ml->ml_name); return PyUnicode_FromFormat("", m->m_ml->ml_name, - m->m_self->ob_type->tp_name, + Py_TYPE(m->m_self)->tp_name, m->m_self); } @@ -313,13 +343,13 @@ PyTypeObject PyCFunction_Type = { 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)meth_hash, /* tp_hash */ - PyCFunction_Call, /* tp_call */ + cfunction_call, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ 0, /* tp_doc */ (traverseproc)meth_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -334,38 +364,12 @@ PyTypeObject PyCFunction_Type = { 0, /* tp_dict */ }; -/* Clear out the free list */ - -int -PyCFunction_ClearFreeList(void) -{ - int freelist_size = numfree; - - while (free_list) { - PyCFunctionObject *v = free_list; - free_list = (PyCFunctionObject *)(v->m_self); - PyObject_GC_Del(v); - numfree--; - } - assert(numfree == 0); - return freelist_size; -} - -void -PyCFunction_Fini(void) -{ - (void)PyCFunction_ClearFreeList(); -} - -/* Print summary info about the state of the optimized allocator */ -void -_PyCFunction_DebugMallocStats(FILE *out) -{ - _PyDebugAllocatorStats(out, - "free PyCFunctionObject", - numfree, sizeof(PyCFunctionObject)); -} - +PyTypeObject PyCMethod_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + .tp_name = "builtin_method", + .tp_basicsize = sizeof(PyCMethodObject), + .tp_base = &PyCFunction_Type, +}; /* Vectorcall functions for each of the PyCFunction calling conventions, * except for METH_VARARGS (possibly combined with METH_KEYWORDS) which @@ -373,33 +377,30 @@ _PyCFunction_DebugMallocStats(FILE *out) * * First, common helpers */ -static const char * -get_name(PyObject *func) -{ - assert(PyCFunction_Check(func)); - PyMethodDef *method = ((PyCFunctionObject *)func)->m_ml; - return method->ml_name; -} - -typedef void (*funcptr)(void); static inline int -cfunction_check_kwargs(PyObject *func, PyObject *kwnames) +cfunction_check_kwargs(PyThreadState *tstate, PyObject *func, PyObject *kwnames) { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); assert(PyCFunction_Check(func)); if (kwnames && PyTuple_GET_SIZE(kwnames)) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no keyword arguments", get_name(func)); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U takes no keyword arguments", funcstr); + Py_DECREF(funcstr); + } return -1; } return 0; } +typedef void (*funcptr)(void); + static inline funcptr -cfunction_enter_call(PyObject *func) +cfunction_enter_call(PyThreadState *tstate, PyObject *func) { - if (Py_EnterRecursiveCall(" while calling a Python object")) { + if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { return NULL; } return (funcptr)PyCFunction_GET_FUNCTION(func); @@ -410,17 +411,18 @@ static PyObject * cfunction_vectorcall_FASTCALL( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { - if (cfunction_check_kwargs(func, kwnames)) { + PyThreadState *tstate = _PyThreadState_GET(); + if (cfunction_check_kwargs(tstate, func, kwnames)) { return NULL; } Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); _PyCFunctionFast meth = (_PyCFunctionFast) - cfunction_enter_call(func); + cfunction_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(PyCFunction_GET_SELF(func), args, nargs); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -428,14 +430,31 @@ static PyObject * cfunction_vectorcall_FASTCALL_KEYWORDS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); _PyCFunctionFastWithKeywords meth = (_PyCFunctionFastWithKeywords) - cfunction_enter_call(func); + cfunction_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(PyCFunction_GET_SELF(func), args, nargs, kwnames); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); + return result; +} + +static PyObject * +cfunction_vectorcall_FASTCALL_KEYWORDS_METHOD( + PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + PyThreadState *tstate = _PyThreadState_GET(); + PyTypeObject *cls = PyCFunction_GET_CLASS(func); + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + PyCMethod meth = (PyCMethod)cfunction_enter_call(tstate, func); + if (meth == NULL) { + return NULL; + } + PyObject *result = meth(PyCFunction_GET_SELF(func), cls, args, nargs, kwnames); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -443,21 +462,26 @@ static PyObject * cfunction_vectorcall_NOARGS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { - if (cfunction_check_kwargs(func, kwnames)) { + PyThreadState *tstate = _PyThreadState_GET(); + if (cfunction_check_kwargs(tstate, func, kwnames)) { return NULL; } Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (nargs != 0) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%zd given)", get_name(func), nargs); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U takes no arguments (%zd given)", funcstr, nargs); + Py_DECREF(funcstr); + } return NULL; } - PyCFunction meth = (PyCFunction)cfunction_enter_call(func); + PyCFunction meth = (PyCFunction)cfunction_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(PyCFunction_GET_SELF(func), NULL); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -465,21 +489,61 @@ static PyObject * cfunction_vectorcall_O( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { - if (cfunction_check_kwargs(func, kwnames)) { + PyThreadState *tstate = _PyThreadState_GET(); + if (cfunction_check_kwargs(tstate, func, kwnames)) { return NULL; } Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (nargs != 1) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%zd given)", - get_name(func), nargs); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U takes exactly one argument (%zd given)", funcstr, nargs); + Py_DECREF(funcstr); + } return NULL; } - PyCFunction meth = (PyCFunction)cfunction_enter_call(func); + PyCFunction meth = (PyCFunction)cfunction_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(PyCFunction_GET_SELF(func), args[0]); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } + + +static PyObject * +cfunction_call(PyObject *func, PyObject *args, PyObject *kwargs) +{ + assert(kwargs == NULL || PyDict_Check(kwargs)); + + PyThreadState *tstate = _PyThreadState_GET(); + assert(!_PyErr_Occurred(tstate)); + + int flags = PyCFunction_GET_FLAGS(func); + if (!(flags & METH_VARARGS)) { + /* If this is not a METH_VARARGS function, delegate to vectorcall */ + return PyVectorcall_Call(func, args, kwargs); + } + + /* For METH_VARARGS, we cannot use vectorcall as the vectorcall pointer + * is NULL. This is intentional, since vectorcall would be slower. */ + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + + PyObject *result; + if (flags & METH_KEYWORDS) { + result = (*(PyCFunctionWithKeywords)(void(*)(void))meth)(self, args, kwargs); + } + else { + if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { + _PyErr_Format(tstate, PyExc_TypeError, + "%.200s() takes no keyword arguments", + ((PyCFunctionObject*)func)->m_ml->ml_name); + return NULL; + } + result = meth(self, args); + } + return _Py_CheckFunctionResult(tstate, func, result, NULL); +} diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 85134c7a..ee4ed975 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -2,11 +2,16 @@ /* Module object implementation */ #include "Python.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "pycore_interp.h" // PyInterpreterState.importlib +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "structmember.h" // PyMemberDef static Py_ssize_t max_module_number; +_Py_IDENTIFIER(__doc__); +_Py_IDENTIFIER(__name__); +_Py_IDENTIFIER(__spec__); + typedef struct { PyObject_HEAD PyObject *md_dict; @@ -22,16 +27,6 @@ static PyMemberDef module_members[] = { }; -/* Helper for sanity check for traverse not handling m_state == NULL - * Issue #32374 */ -#ifdef Py_DEBUG -static int -bad_traverse_test(PyObject *self, void *arg) { - assert(self != NULL); - return 0; -} -#endif - PyTypeObject PyModuleDef_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "moduledef", /* tp_name */ @@ -47,8 +42,8 @@ PyModuleDef_Init(struct PyModuleDef* def) return NULL; if (def->m_base.m_index == 0) { max_module_number++; - Py_REFCNT(def) = 1; - Py_TYPE(def) = &PyModuleDef_Type; + Py_SET_REFCNT(def, 1); + Py_SET_TYPE(def, &PyModuleDef_Type); def->m_base.m_index = max_module_number; } return (PyObject*)def; @@ -58,11 +53,8 @@ static int module_init_dict(PyModuleObject *mod, PyObject *md_dict, PyObject *name, PyObject *doc) { - _Py_IDENTIFIER(__name__); - _Py_IDENTIFIER(__doc__); _Py_IDENTIFIER(__package__); _Py_IDENTIFIER(__loader__); - _Py_IDENTIFIER(__spec__); if (md_dict == NULL) return -1; @@ -173,8 +165,11 @@ _add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions) PyObject * PyModule_Create2(struct PyModuleDef* module, int module_api_version) { - if (!_PyImport_IsInitialized(_PyInterpreterState_Get())) - Py_FatalError("Python import machinery not initialized"); + if (!_PyImport_IsInitialized(_PyInterpreterState_GET())) { + PyErr_SetString(PyExc_SystemError, + "Python import machinery not initialized"); + return NULL; + } return _PyModule_CreateInitialized(module, module_api_version); } @@ -356,16 +351,6 @@ PyModule_FromDefAndSpec2(struct PyModuleDef* def, PyObject *spec, int module_api } } - /* Sanity check for traverse not handling m_state == NULL - * This doesn't catch all possible cases, but in many cases it should - * make many cases of invalid code crash or raise Valgrind issues - * sooner than they would otherwise. - * Issue #32374 */ -#ifdef Py_DEBUG - if (def->m_traverse != NULL) { - def->m_traverse(m, bad_traverse_test, NULL); - } -#endif Py_DECREF(nameobj); return m; @@ -458,7 +443,6 @@ int PyModule_SetDocString(PyObject *m, const char *doc) { PyObject *v; - _Py_IDENTIFIER(__doc__); v = PyUnicode_FromString(doc); if (v == NULL || _PyObject_SetAttrId(m, &PyId___doc__, v) != 0) { @@ -485,7 +469,6 @@ PyModule_GetDict(PyObject *m) PyObject* PyModule_GetNameObject(PyObject *m) { - _Py_IDENTIFIER(__name__); PyObject *d; PyObject *name; if (!PyModule_Check(m)) { @@ -590,7 +573,7 @@ _PyModule_ClearDict(PyObject *d) Py_ssize_t pos; PyObject *key, *value; - int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose; + int verbose = _Py_GetConfig()->verbose; /* First, clear only names starting with a single underscore */ pos = 0; @@ -677,16 +660,20 @@ module___init___impl(PyModuleObject *self, PyObject *name, PyObject *doc) static void module_dealloc(PyModuleObject *m) { - int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose; + int verbose = _Py_GetConfig()->verbose; PyObject_GC_UnTrack(m); if (verbose && m->md_name) { - PySys_FormatStderr("# destroy %S\n", m->md_name); + PySys_FormatStderr("# destroy %U\n", m->md_name); } if (m->md_weaklist != NULL) PyObject_ClearWeakRefs((PyObject *) m); - if (m->md_def && m->md_def->m_free) + /* bpo-39824: Don't call m_free() if m_size > 0 and md_state=NULL */ + if (m->md_def && m->md_def->m_free + && (m->md_def->m_size <= 0 || m->md_state != NULL)) + { m->md_def->m_free(m); + } Py_XDECREF(m->md_dict); Py_XDECREF(m->md_name); if (m->md_state != NULL) @@ -697,7 +684,7 @@ module_dealloc(PyModuleObject *m) static PyObject * module_repr(PyModuleObject *m) { - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m); } @@ -736,13 +723,10 @@ module_getattro(PyModuleObject *m, PyObject *name) _Py_IDENTIFIER(__getattr__); getattr = _PyDict_GetItemId(m->md_dict, &PyId___getattr__); if (getattr) { - PyObject* stack[1] = {name}; - return _PyObject_FastCall(getattr, stack, 1); + return PyObject_CallOneArg(getattr, name); } - _Py_IDENTIFIER(__name__); mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__); if (mod_name && PyUnicode_Check(mod_name)) { - _Py_IDENTIFIER(__spec__); Py_INCREF(mod_name); PyObject *spec = _PyDict_GetItemId(m->md_dict, &PyId___spec__); Py_XINCREF(spec); @@ -771,7 +755,10 @@ module_getattro(PyModuleObject *m, PyObject *name) static int module_traverse(PyModuleObject *m, visitproc visit, void *arg) { - if (m->md_def && m->md_def->m_traverse) { + /* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */ + if (m->md_def && m->md_def->m_traverse + && (m->md_def->m_size <= 0 || m->md_state != NULL)) + { int res = m->md_def->m_traverse((PyObject*)m, visit, arg); if (res) return res; @@ -783,8 +770,17 @@ module_traverse(PyModuleObject *m, visitproc visit, void *arg) static int module_clear(PyModuleObject *m) { - if (m->md_def && m->md_def->m_clear) { + /* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */ + if (m->md_def && m->md_def->m_clear + && (m->md_def->m_size <= 0 || m->md_state != NULL)) + { int res = m->md_def->m_clear((PyObject*)m); + if (PyErr_Occurred()) { + PySys_FormatStderr("Exception ignored in m_clear of module%s%V\n", + m->md_name ? " " : "", + m->md_name, ""); + PyErr_WriteUnraisable(NULL); + } if (res) return res; } diff --git a/Objects/namespaceobject.c b/Objects/namespaceobject.c index ddad39a9..fa37ed25 100644 --- a/Objects/namespaceobject.c +++ b/Objects/namespaceobject.c @@ -1,7 +1,7 @@ // namespace object implementation #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef typedef struct { @@ -72,8 +72,8 @@ namespace_repr(PyObject *ns) PyObject *separator, *pairsrepr, *repr = NULL; const char * name; - name = (Py_TYPE(ns) == &_PyNamespace_Type) ? "namespace" - : ns->ob_type->tp_name; + name = Py_IS_TYPE(ns, &_PyNamespace_Type) ? "namespace" + : Py_TYPE(ns)->tp_name; i = Py_ReprEnter(ns); if (i != 0) { @@ -91,8 +91,6 @@ namespace_repr(PyObject *ns) keys = PyDict_Keys(d); if (keys == NULL) goto error; - if (PyList_Sort(keys) != 0) - goto error; keys_iter = PyObject_GetIter(keys); if (keys_iter == NULL) diff --git a/Objects/object.c b/Objects/object.c index 74b1b15d..623ee52e 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2,10 +2,14 @@ /* Generic object operations; and implementation of None */ #include "Python.h" +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() +#include "pycore_context.h" #include "pycore_initconfig.h" #include "pycore_object.h" -#include "pycore_pystate.h" -#include "pycore_context.h" +#include "pycore_pyerrors.h" +#include "pycore_pylifecycle.h" +#include "pycore_pymem.h" // _PyMem_IsPtrFreed() +#include "pycore_pystate.h" // _PyThreadState_GET() #include "frameobject.h" #include "interpreteridobject.h" @@ -31,8 +35,7 @@ _PyObject_CheckConsistency(PyObject *op, int check_content) CHECK(!_PyObject_IsFreed(op)); CHECK(Py_REFCNT(op) >= 1); - CHECK(op->ob_type != NULL); - _PyType_CheckConsistency(op->ob_type); + _PyType_CheckConsistency(Py_TYPE(op)); if (PyUnicode_Check(op)) { _PyUnicode_CheckConsistency(op, check_content); @@ -56,7 +59,7 @@ _Py_GetRefTotal(void) Py_ssize_t total = _Py_RefTotal; o = _PySet_Dummy; if (o != NULL) - total -= o->ob_refcnt; + total -= Py_REFCNT(o); return total; } @@ -111,122 +114,6 @@ _Py_AddToAllObjects(PyObject *op, int force) } #endif /* Py_TRACE_REFS */ -#ifdef COUNT_ALLOCS -static PyTypeObject *type_list; -/* All types are added to type_list, at least when - they get one object created. That makes them - immortal, which unfortunately contributes to - garbage itself. If unlist_types_without_objects - is set, they will be removed from the type_list - once the last object is deallocated. */ -static int unlist_types_without_objects; -extern Py_ssize_t _Py_tuple_zero_allocs, _Py_fast_tuple_allocs; -extern Py_ssize_t _Py_quick_int_allocs, _Py_quick_neg_int_allocs; -extern Py_ssize_t _Py_null_strings, _Py_one_strings; -void -_Py_dump_counts(FILE* f) -{ - PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->config.show_alloc_count) { - return; - } - - PyTypeObject *tp; - for (tp = type_list; tp; tp = tp->tp_next) - fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, " - "freed: %" PY_FORMAT_SIZE_T "d, " - "max in use: %" PY_FORMAT_SIZE_T "d\n", - tp->tp_name, tp->tp_allocs, tp->tp_frees, - tp->tp_maxalloc); - fprintf(f, "fast tuple allocs: %" PY_FORMAT_SIZE_T "d, " - "empty: %" PY_FORMAT_SIZE_T "d\n", - _Py_fast_tuple_allocs, _Py_tuple_zero_allocs); - fprintf(f, "fast int allocs: pos: %" PY_FORMAT_SIZE_T "d, " - "neg: %" PY_FORMAT_SIZE_T "d\n", - _Py_quick_int_allocs, _Py_quick_neg_int_allocs); - fprintf(f, "null strings: %" PY_FORMAT_SIZE_T "d, " - "1-strings: %" PY_FORMAT_SIZE_T "d\n", - _Py_null_strings, _Py_one_strings); -} - -PyObject * -_Py_get_counts(void) -{ - PyTypeObject *tp; - PyObject *result; - PyObject *v; - - result = PyList_New(0); - if (result == NULL) - return NULL; - for (tp = type_list; tp; tp = tp->tp_next) { - v = Py_BuildValue("(snnn)", tp->tp_name, tp->tp_allocs, - tp->tp_frees, tp->tp_maxalloc); - if (v == NULL) { - Py_DECREF(result); - return NULL; - } - if (PyList_Append(result, v) < 0) { - Py_DECREF(v); - Py_DECREF(result); - return NULL; - } - Py_DECREF(v); - } - return result; -} - -void -_Py_inc_count(PyTypeObject *tp) -{ - if (tp->tp_next == NULL && tp->tp_prev == NULL) { - /* first time; insert in linked list */ - if (tp->tp_next != NULL) /* sanity check */ - Py_FatalError("XXX _Py_inc_count sanity check"); - if (type_list) - type_list->tp_prev = tp; - tp->tp_next = type_list; - /* Note that as of Python 2.2, heap-allocated type objects - * can go away, but this code requires that they stay alive - * until program exit. That's why we're careful with - * refcounts here. type_list gets a new reference to tp, - * while ownership of the reference type_list used to hold - * (if any) was transferred to tp->tp_next in the line above. - * tp is thus effectively immortal after this. - */ - Py_INCREF(tp); - type_list = tp; -#ifdef Py_TRACE_REFS - /* Also insert in the doubly-linked list of all objects, - * if not already there. - */ - _Py_AddToAllObjects((PyObject *)tp, 0); -#endif - } - tp->tp_allocs++; - if (tp->tp_allocs - tp->tp_frees > tp->tp_maxalloc) - tp->tp_maxalloc = tp->tp_allocs - tp->tp_frees; -} - -void _Py_dec_count(PyTypeObject *tp) -{ - tp->tp_frees++; - if (unlist_types_without_objects && - tp->tp_allocs == tp->tp_frees) { - /* unlink the type from type_list */ - if (tp->tp_prev) - tp->tp_prev->tp_next = tp->tp_next; - else - type_list = tp->tp_next; - if (tp->tp_next) - tp->tp_next->tp_prev = tp->tp_prev; - tp->tp_next = tp->tp_prev = NULL; - Py_DECREF(tp); - } -} - -#endif - #ifdef Py_REF_DEBUG /* Log a fatal error; doesn't return. */ void @@ -253,36 +140,34 @@ Py_DecRef(PyObject *o) PyObject * PyObject_Init(PyObject *op, PyTypeObject *tp) { - if (op == NULL) + /* Any changes should be reflected in PyObject_INIT() macro */ + if (op == NULL) { return PyErr_NoMemory(); - /* Any changes should be reflected in PyObject_INIT (objimpl.h) */ - Py_TYPE(op) = tp; - if (PyType_GetFlags(tp) & Py_TPFLAGS_HEAPTYPE) { - Py_INCREF(tp); } - _Py_NewReference(op); - return op; + + return PyObject_INIT(op, tp); } PyVarObject * PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size) { - if (op == NULL) + /* Any changes should be reflected in PyObject_INIT_VAR() macro */ + if (op == NULL) { return (PyVarObject *) PyErr_NoMemory(); - /* Any changes should be reflected in PyObject_INIT_VAR */ - Py_SIZE(op) = size; - PyObject_Init((PyObject *)op, tp); - return op; + } + + return PyObject_INIT_VAR(op, tp, size); } PyObject * _PyObject_New(PyTypeObject *tp) { - PyObject *op; - op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp)); - if (op == NULL) + PyObject *op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp)); + if (op == NULL) { return PyErr_NoMemory(); - return PyObject_INIT(op, tp); + } + PyObject_INIT(op, tp); + return op; } PyVarObject * @@ -304,11 +189,11 @@ PyObject_CallFinalizer(PyObject *self) if (tp->tp_finalize == NULL) return; /* tp_finalize should only be called once. */ - if (PyType_IS_GC(tp) && _PyGC_FINALIZED(self)) + if (_PyType_IS_GC(tp) && _PyGC_FINALIZED(self)) return; tp->tp_finalize(self); - if (PyType_IS_GC(tp)) { + if (_PyType_IS_GC(tp)) { _PyGC_SET_FINALIZED(self); } } @@ -316,48 +201,41 @@ PyObject_CallFinalizer(PyObject *self) int PyObject_CallFinalizerFromDealloc(PyObject *self) { - Py_ssize_t refcnt; + if (Py_REFCNT(self) != 0) { + _PyObject_ASSERT_FAILED_MSG(self, + "PyObject_CallFinalizerFromDealloc called " + "on object with a non-zero refcount"); + } /* Temporarily resurrect the object. */ - if (self->ob_refcnt != 0) { - Py_FatalError("PyObject_CallFinalizerFromDealloc called on " - "object with a non-zero refcount"); - } - self->ob_refcnt = 1; + Py_SET_REFCNT(self, 1); PyObject_CallFinalizer(self); - /* Undo the temporary resurrection; can't use DECREF here, it would - * cause a recursive call. - */ _PyObject_ASSERT_WITH_MSG(self, - self->ob_refcnt > 0, + Py_REFCNT(self) > 0, "refcount is too small"); - if (--self->ob_refcnt == 0) + + /* Undo the temporary resurrection; can't use DECREF here, it would + * cause a recursive call. */ + Py_SET_REFCNT(self, Py_REFCNT(self) - 1); + if (Py_REFCNT(self) == 0) { return 0; /* this is the normal path out */ + } /* tp_finalize resurrected it! Make it look like the original Py_DECREF - * never happened. - */ - refcnt = self->ob_refcnt; + * never happened. */ + Py_ssize_t refcnt = Py_REFCNT(self); _Py_NewReference(self); - self->ob_refcnt = refcnt; + Py_SET_REFCNT(self, refcnt); _PyObject_ASSERT(self, - (!PyType_IS_GC(Py_TYPE(self)) + (!_PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self))); - /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so - * we need to undo that. */ - _Py_DEC_REFTOTAL; - /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object - * chain, so no more to do there. - * If COUNT_ALLOCS, the original decref bumped tp_frees, and - * _Py_NewReference bumped tp_allocs: both of those need to be - * undone. - */ -#ifdef COUNT_ALLOCS - --Py_TYPE(self)->tp_frees; - --Py_TYPE(self)->tp_allocs; + /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased + _Py_RefTotal, so we need to undo that. */ +#ifdef Py_REF_DEBUG + _Py_RefTotal--; #endif return -1; } @@ -381,12 +259,12 @@ PyObject_Print(PyObject *op, FILE *fp, int flags) Py_END_ALLOW_THREADS } else { - if (op->ob_refcnt <= 0) { + if (Py_REFCNT(op) <= 0) { /* XXX(twouters) cast refcount to long until %zd is universally available */ Py_BEGIN_ALLOW_THREADS fprintf(fp, "", - (long)op->ob_refcnt, (void *)op); + (long)Py_REFCNT(op), (void *)op); Py_END_ALLOW_THREADS } else { @@ -416,7 +294,7 @@ PyObject_Print(PyObject *op, FILE *fp, int flags) else { PyErr_Format(PyExc_TypeError, "str() or repr() returned '%.100s'", - s->ob_type->tp_name); + Py_TYPE(s)->tp_name); ret = -1; } Py_XDECREF(s); @@ -448,7 +326,7 @@ _Py_BreakPoint(void) int _PyObject_IsFreed(PyObject *op) { - if (_PyMem_IsPtrFreed(op) || _PyMem_IsPtrFreed(op->ob_type)) { + if (_PyMem_IsPtrFreed(op) || _PyMem_IsPtrFreed(Py_TYPE(op))) { return 1; } /* ignore op->ob_ref: its value can have be modified @@ -481,7 +359,7 @@ _PyObject_Dump(PyObject* op) fprintf(stderr, "object address : %p\n", (void *)op); /* XXX(twouters) cast refcount to long until %zd is universally available */ - fprintf(stderr, "object refcount : %ld\n", (long)op->ob_refcnt); + fprintf(stderr, "object refcount : %ld\n", (long)Py_REFCNT(op)); fflush(stderr); PyTypeObject *type = Py_TYPE(op); @@ -523,33 +401,39 @@ PyObject_Repr(PyObject *v) return PyUnicode_FromString(""); if (Py_TYPE(v)->tp_repr == NULL) return PyUnicode_FromFormat("<%s object at %p>", - v->ob_type->tp_name, v); + Py_TYPE(v)->tp_name, v); + PyThreadState *tstate = _PyThreadState_GET(); #ifdef Py_DEBUG /* PyObject_Repr() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); #endif /* It is possible for a type to have a tp_repr representation that loops infinitely. */ - if (Py_EnterRecursiveCall(" while getting the repr of an object")) + if (_Py_EnterRecursiveCall(tstate, + " while getting the repr of an object")) { return NULL; - res = (*v->ob_type->tp_repr)(v); - Py_LeaveRecursiveCall(); - if (res == NULL) + } + res = (*Py_TYPE(v)->tp_repr)(v); + _Py_LeaveRecursiveCall(tstate); + + if (res == NULL) { return NULL; + } if (!PyUnicode_Check(res)) { - PyErr_Format(PyExc_TypeError, - "__repr__ returned non-string (type %.200s)", - res->ob_type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "__repr__ returned non-string (type %.200s)", + Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } #ifndef Py_DEBUG - if (PyUnicode_READY(res) < 0) + if (PyUnicode_READY(res) < 0) { return NULL; + } #endif return res; } @@ -579,31 +463,36 @@ PyObject_Str(PyObject *v) if (Py_TYPE(v)->tp_str == NULL) return PyObject_Repr(v); + PyThreadState *tstate = _PyThreadState_GET(); #ifdef Py_DEBUG /* PyObject_Str() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); #endif /* It is possible for a type to have a tp_str representation that loops infinitely. */ - if (Py_EnterRecursiveCall(" while getting the str of an object")) + if (_Py_EnterRecursiveCall(tstate, " while getting the str of an object")) { return NULL; + } res = (*Py_TYPE(v)->tp_str)(v); - Py_LeaveRecursiveCall(); - if (res == NULL) + _Py_LeaveRecursiveCall(tstate); + + if (res == NULL) { return NULL; + } if (!PyUnicode_Check(res)) { - PyErr_Format(PyExc_TypeError, - "__str__ returned non-string (type %.200s)", - Py_TYPE(res)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "__str__ returned non-string (type %.200s)", + Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } #ifndef Py_DEBUG - if (PyUnicode_READY(res) < 0) + if (PyUnicode_READY(res) < 0) { return NULL; + } #endif assert(_PyUnicode_CheckConsistency(res, 1)); return res; @@ -669,6 +558,64 @@ PyObject_Bytes(PyObject *v) return PyBytes_FromObject(v); } + +/* +def _PyObject_FunctionStr(x): + try: + qualname = x.__qualname__ + except AttributeError: + return str(x) + try: + mod = x.__module__ + if mod is not None and mod != 'builtins': + return f"{x.__module__}.{qualname}()" + except AttributeError: + pass + return qualname +*/ +PyObject * +_PyObject_FunctionStr(PyObject *x) +{ + _Py_IDENTIFIER(__module__); + _Py_IDENTIFIER(__qualname__); + _Py_IDENTIFIER(builtins); + assert(!PyErr_Occurred()); + PyObject *qualname; + int ret = _PyObject_LookupAttrId(x, &PyId___qualname__, &qualname); + if (qualname == NULL) { + if (ret < 0) { + return NULL; + } + return PyObject_Str(x); + } + PyObject *module; + PyObject *result = NULL; + ret = _PyObject_LookupAttrId(x, &PyId___module__, &module); + if (module != NULL && module != Py_None) { + PyObject *builtinsname = _PyUnicode_FromId(&PyId_builtins); + if (builtinsname == NULL) { + goto done; + } + ret = PyObject_RichCompareBool(module, builtinsname, Py_NE); + if (ret < 0) { + // error + goto done; + } + if (ret > 0) { + result = PyUnicode_FromFormat("%S.%S()", module, qualname); + goto done; + } + } + else if (ret < 0) { + goto done; + } + result = PyUnicode_FromFormat("%S()", qualname); +done: + Py_DECREF(qualname); + Py_XDECREF(module); + return result; +} + /* For Python 3.0.1 and later, the old three-way comparison has been completely removed in favour of rich comparisons. PyObject_Compare() and PyObject_Cmp() are gone, and the builtin cmp function no longer exists. @@ -707,28 +654,28 @@ static const char * const opstrings[] = {"<", "<=", "==", "!=", ">", ">="}; /* Perform a rich comparison, raising TypeError when the requested comparison operator is not supported. */ static PyObject * -do_richcompare(PyObject *v, PyObject *w, int op) +do_richcompare(PyThreadState *tstate, PyObject *v, PyObject *w, int op) { richcmpfunc f; PyObject *res; int checked_reverse_op = 0; - if (v->ob_type != w->ob_type && - PyType_IsSubtype(w->ob_type, v->ob_type) && - (f = w->ob_type->tp_richcompare) != NULL) { + if (!Py_IS_TYPE(v, Py_TYPE(w)) && + PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v)) && + (f = Py_TYPE(w)->tp_richcompare) != NULL) { checked_reverse_op = 1; res = (*f)(w, v, _Py_SwappedOp[op]); if (res != Py_NotImplemented) return res; Py_DECREF(res); } - if ((f = v->ob_type->tp_richcompare) != NULL) { + if ((f = Py_TYPE(v)->tp_richcompare) != NULL) { res = (*f)(v, w, op); if (res != Py_NotImplemented) return res; Py_DECREF(res); } - if (!checked_reverse_op && (f = w->ob_type->tp_richcompare) != NULL) { + if (!checked_reverse_op && (f = Py_TYPE(w)->tp_richcompare) != NULL) { res = (*f)(w, v, _Py_SwappedOp[op]); if (res != Py_NotImplemented) return res; @@ -744,11 +691,11 @@ do_richcompare(PyObject *v, PyObject *w, int op) res = (v != w) ? Py_True : Py_False; break; default: - PyErr_Format(PyExc_TypeError, - "'%s' not supported between instances of '%.100s' and '%.100s'", - opstrings[op], - v->ob_type->tp_name, - w->ob_type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'%s' not supported between instances of '%.100s' and '%.100s'", + opstrings[op], + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); return NULL; } Py_INCREF(res); @@ -761,18 +708,20 @@ do_richcompare(PyObject *v, PyObject *w, int op) PyObject * PyObject_RichCompare(PyObject *v, PyObject *w, int op) { - PyObject *res; + PyThreadState *tstate = _PyThreadState_GET(); assert(Py_LT <= op && op <= Py_GE); if (v == NULL || w == NULL) { - if (!PyErr_Occurred()) + if (!_PyErr_Occurred(tstate)) { PyErr_BadInternalCall(); + } return NULL; } - if (Py_EnterRecursiveCall(" in comparison")) + if (_Py_EnterRecursiveCall(tstate, " in comparison")) { return NULL; - res = do_richcompare(v, w, op); - Py_LeaveRecursiveCall(); + } + PyObject *res = do_richcompare(tstate, v, w, op); + _Py_LeaveRecursiveCall(tstate); return res; } @@ -934,7 +883,7 @@ PyObject_GetAttr(PyObject *v, PyObject *name) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return NULL; } if (tp->tp_getattro != NULL) @@ -959,7 +908,7 @@ _PyObject_LookupAttr(PyObject *v, PyObject *name, PyObject **result) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); *result = NULL; return -1; } @@ -1035,7 +984,7 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return -1; } Py_INCREF(name); @@ -1057,7 +1006,7 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value) return err; } Py_DECREF(name); - _PyObject_ASSERT(name, name->ob_refcnt >= 1); + _PyObject_ASSERT(name, Py_REFCNT(name) >= 1); if (tp->tp_getattr == NULL && tp->tp_getattro == NULL) PyErr_Format(PyExc_TypeError, "'%.100s' object has no attributes " @@ -1087,13 +1036,11 @@ _PyObject_GetDictPtr(PyObject *obj) if (dictoffset == 0) return NULL; if (dictoffset < 0) { - Py_ssize_t tsize; - size_t size; - - tsize = ((PyVarObject *)obj)->ob_size; - if (tsize < 0) + Py_ssize_t tsize = Py_SIZE(obj); + if (tsize < 0) { tsize = -tsize; - size = _PyObject_VAR_SIZE(tp, tsize); + } + size_t size = _PyObject_VAR_SIZE(tp, tsize); dictoffset += (long)size; _PyObject_ASSERT(obj, dictoffset > 0); @@ -1158,12 +1105,12 @@ _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) descr = _PyType_Lookup(tp, name); if (descr != NULL) { Py_INCREF(descr); - if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) { + if (_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) { meth_found = 1; } else { - f = descr->ob_type->tp_descr_get; + f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { - *method = f(descr, obj, (PyObject *)obj->ob_type); + *method = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); return 0; } @@ -1234,7 +1181,7 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, if (!PyUnicode_Check(name)){ PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return NULL; } Py_INCREF(name); @@ -1249,9 +1196,9 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, f = NULL; if (descr != NULL) { Py_INCREF(descr); - f = descr->ob_type->tp_descr_get; + f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { - res = f(descr, obj, (PyObject *)obj->ob_type); + res = f(descr, obj, (PyObject *)Py_TYPE(obj)); if (res == NULL && suppress && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); @@ -1265,13 +1212,11 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, dictoffset = tp->tp_dictoffset; if (dictoffset != 0) { if (dictoffset < 0) { - Py_ssize_t tsize; - size_t size; - - tsize = ((PyVarObject *)obj)->ob_size; - if (tsize < 0) + Py_ssize_t tsize = Py_SIZE(obj); + if (tsize < 0) { tsize = -tsize; - size = _PyObject_VAR_SIZE(tp, tsize); + } + size_t size = _PyObject_VAR_SIZE(tp, tsize); _PyObject_ASSERT(obj, size <= PY_SSIZE_T_MAX); dictoffset += (Py_ssize_t)size; @@ -1348,7 +1293,7 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name, if (!PyUnicode_Check(name)){ PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return -1; } @@ -1361,7 +1306,7 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name, if (descr != NULL) { Py_INCREF(descr); - f = descr->ob_type->tp_descr_set; + f = Py_TYPE(descr)->tp_descr_set; if (f != NULL) { res = f(descr, obj, value); goto done; @@ -1454,15 +1399,15 @@ PyObject_IsTrue(PyObject *v) return 0; if (v == Py_None) return 0; - else if (v->ob_type->tp_as_number != NULL && - v->ob_type->tp_as_number->nb_bool != NULL) - res = (*v->ob_type->tp_as_number->nb_bool)(v); - else if (v->ob_type->tp_as_mapping != NULL && - v->ob_type->tp_as_mapping->mp_length != NULL) - res = (*v->ob_type->tp_as_mapping->mp_length)(v); - else if (v->ob_type->tp_as_sequence != NULL && - v->ob_type->tp_as_sequence->sq_length != NULL) - res = (*v->ob_type->tp_as_sequence->sq_length)(v); + else if (Py_TYPE(v)->tp_as_number != NULL && + Py_TYPE(v)->tp_as_number->nb_bool != NULL) + res = (*Py_TYPE(v)->tp_as_number->nb_bool)(v); + else if (Py_TYPE(v)->tp_as_mapping != NULL && + Py_TYPE(v)->tp_as_mapping->mp_length != NULL) + res = (*Py_TYPE(v)->tp_as_mapping->mp_length)(v); + else if (Py_TYPE(v)->tp_as_sequence != NULL && + Py_TYPE(v)->tp_as_sequence->sq_length != NULL) + res = (*Py_TYPE(v)->tp_as_sequence->sq_length)(v); else return 1; /* if it is negative, it should be either -1 or -2 */ @@ -1489,7 +1434,7 @@ PyCallable_Check(PyObject *x) { if (x == NULL) return 0; - return x->ob_type->tp_call != NULL; + return Py_TYPE(x)->tp_call != NULL; } @@ -1576,7 +1521,7 @@ none_repr(PyObject *op) } /* ARGUSED */ -static void +static void _Py_NO_RETURN none_dealloc(PyObject* ignore) { /* This should never get called, but we also don't want to SEGV if @@ -1714,7 +1659,7 @@ notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) Py_RETURN_NOTIMPLEMENTED; } -static void +static void _Py_NO_RETURN notimplemented_dealloc(PyObject* ignore) { /* This should never get called, but we also don't want to SEGV if @@ -1723,6 +1668,22 @@ notimplemented_dealloc(PyObject* ignore) Py_FatalError("deallocating NotImplemented"); } +static int +notimplemented_bool(PyObject *v) +{ + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "NotImplemented should not be used in a boolean context", + 1) < 0) + { + return -1; + } + return 1; +} + +static PyNumberMethods notimplemented_as_number = { + .nb_bool = notimplemented_bool, +}; + PyTypeObject _PyNotImplemented_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "NotImplementedType", @@ -1733,8 +1694,8 @@ PyTypeObject _PyNotImplemented_Type = { 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_as_async*/ - NotImplemented_repr, /*tp_repr*/ - 0, /*tp_as_number*/ + NotImplemented_repr, /*tp_repr*/ + ¬implemented_as_number, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ @@ -1772,6 +1733,11 @@ PyObject _Py_NotImplementedStruct = { PyStatus _PyTypes_Init(void) { + PyStatus status = _PyTypes_InitSlotDefs(); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + #define INIT_TYPE(TYPE, NAME) \ do { \ if (PyType_Ready(TYPE) < 0) { \ @@ -1823,6 +1789,7 @@ _PyTypes_Init(void) INIT_TYPE(&PyCode_Type, "code"); INIT_TYPE(&PyFrame_Type, "frame"); INIT_TYPE(&PyCFunction_Type, "builtin function"); + INIT_TYPE(&PyCMethod_Type, "builtin method"); INIT_TYPE(&PyMethod_Type, "method"); INIT_TYPE(&PyFunction_Type, "function"); INIT_TYPE(&PyDictProxy_Type, "dict proxy"); @@ -1851,50 +1818,53 @@ _PyTypes_Init(void) } -#ifdef Py_TRACE_REFS - void _Py_NewReference(PyObject *op) { if (_Py_tracemalloc_config.tracing) { _PyTraceMalloc_NewReference(op); } - _Py_INC_REFTOTAL; - op->ob_refcnt = 1; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif + Py_SET_REFCNT(op, 1); +#ifdef Py_TRACE_REFS _Py_AddToAllObjects(op, 1); - _Py_INC_TPALLOCS(op); +#endif } + +#ifdef Py_TRACE_REFS void _Py_ForgetReference(PyObject *op) { -#ifdef SLOW_UNREF_CHECK - PyObject *p; -#endif - if (op->ob_refcnt < 0) - Py_FatalError("UNREF negative refcnt"); + if (Py_REFCNT(op) < 0) { + _PyObject_ASSERT_FAILED_MSG(op, "negative refcnt"); + } + if (op == &refchain || - op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) { - fprintf(stderr, "* ob\n"); - _PyObject_Dump(op); - fprintf(stderr, "* op->_ob_prev->_ob_next\n"); - _PyObject_Dump(op->_ob_prev->_ob_next); - fprintf(stderr, "* op->_ob_next->_ob_prev\n"); - _PyObject_Dump(op->_ob_next->_ob_prev); - Py_FatalError("UNREF invalid object"); + op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) + { + _PyObject_ASSERT_FAILED_MSG(op, "invalid object chain"); } + #ifdef SLOW_UNREF_CHECK + PyObject *p; for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) { - if (p == op) + if (p == op) { break; + } + } + if (p == &refchain) { + /* Not found */ + _PyObject_ASSERT_FAILED_MSG(op, + "object not found in the objects list"); } - if (p == &refchain) /* Not found */ - Py_FatalError("UNREF unknown object"); #endif + op->_ob_next->_ob_prev = op->_ob_prev; op->_ob_prev->_ob_next = op->_ob_next; op->_ob_next = op->_ob_prev = NULL; - _Py_INC_TPFREES(op); } /* Print all live objects. Because PyObject_Print is called, the @@ -1906,7 +1876,7 @@ _Py_PrintReferences(FILE *fp) PyObject *op; fprintf(fp, "Remaining objects:\n"); for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) { - fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", (void *)op, op->ob_refcnt); + fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", (void *)op, Py_REFCNT(op)); if (PyObject_Print(op, fp, 0) != 0) PyErr_Clear(); putc('\n', fp); @@ -1923,7 +1893,7 @@ _Py_PrintReferenceAddresses(FILE *fp) fprintf(fp, "Remaining object addresses:\n"); for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] %s\n", (void *)op, - op->ob_refcnt, Py_TYPE(op)->tp_name); + Py_REFCNT(op), Py_TYPE(op)->tp_name); } PyObject * @@ -1941,7 +1911,7 @@ _Py_GetObjects(PyObject *self, PyObject *args) return NULL; for (i = 0; (n == 0 || i < n) && op != &refchain; i++) { while (op == self || op == args || op == res || op == t || - (t != NULL && Py_TYPE(op) != (PyTypeObject *) t)) { + (t != NULL && !Py_IS_TYPE(op, (PyTypeObject *) t))) { op = op->_ob_next; if (op == &refchain) return res; @@ -1965,12 +1935,10 @@ Py_ssize_t (*_Py_abstract_hack)(PyObject *) = PyObject_Size; void _PyObject_DebugTypeStats(FILE *out) { - _PyCFunction_DebugMallocStats(out); _PyDict_DebugMallocStats(out); _PyFloat_DebugMallocStats(out); _PyFrame_DebugMallocStats(out); _PyList_DebugMallocStats(out); - _PyMethod_DebugMallocStats(out); _PyTuple_DebugMallocStats(out); } @@ -2061,11 +2029,14 @@ finally: void _PyTrash_deposit_object(PyObject *op) { - _PyObject_ASSERT(op, PyObject_IS_GC(op)); + PyThreadState *tstate = _PyThreadState_GET(); + struct _gc_runtime_state *gcstate = &tstate->interp->gc; + + _PyObject_ASSERT(op, _PyObject_IS_GC(op)); _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op)); - _PyObject_ASSERT(op, op->ob_refcnt == 0); - _PyGCHead_SET_PREV(_Py_AS_GC(op), _PyRuntime.gc.trash_delete_later); - _PyRuntime.gc.trash_delete_later = op; + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); + _PyGCHead_SET_PREV(_Py_AS_GC(op), gcstate->trash_delete_later); + gcstate->trash_delete_later = op; } /* The equivalent API, using per-thread state recursion info */ @@ -2073,24 +2044,27 @@ void _PyTrash_thread_deposit_object(PyObject *op) { PyThreadState *tstate = _PyThreadState_GET(); - _PyObject_ASSERT(op, PyObject_IS_GC(op)); + _PyObject_ASSERT(op, _PyObject_IS_GC(op)); _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op)); - _PyObject_ASSERT(op, op->ob_refcnt == 0); + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); _PyGCHead_SET_PREV(_Py_AS_GC(op), tstate->trash_delete_later); tstate->trash_delete_later = op; } -/* Dealloccate all the objects in the _PyTrash_delete_later list. Called when +/* Deallocate all the objects in the _PyTrash_delete_later list. Called when * the call-stack unwinds again. */ void _PyTrash_destroy_chain(void) { - while (_PyRuntime.gc.trash_delete_later) { - PyObject *op = _PyRuntime.gc.trash_delete_later; + PyThreadState *tstate = _PyThreadState_GET(); + struct _gc_runtime_state *gcstate = &tstate->interp->gc; + + while (gcstate->trash_delete_later) { + PyObject *op = gcstate->trash_delete_later; destructor dealloc = Py_TYPE(op)->tp_dealloc; - _PyRuntime.gc.trash_delete_later = + gcstate->trash_delete_later = (PyObject*) _PyGCHead_PREV(_Py_AS_GC(op)); /* Call the deallocator directly. This used to try to @@ -2099,10 +2073,10 @@ _PyTrash_destroy_chain(void) * assorted non-release builds calling Py_DECREF again ends * up distorting allocation statistics. */ - _PyObject_ASSERT(op, op->ob_refcnt == 0); - ++_PyRuntime.gc.trash_delete_nesting; + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); + ++gcstate->trash_delete_nesting; (*dealloc)(op); - --_PyRuntime.gc.trash_delete_nesting; + --gcstate->trash_delete_nesting; } } @@ -2137,7 +2111,7 @@ _PyTrash_thread_destroy_chain(void) * assorted non-release builds calling Py_DECREF again ends * up distorting allocation statistics. */ - _PyObject_ASSERT(op, op->ob_refcnt == 0); + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); (*dealloc)(op); assert(tstate->trash_delete_nesting == 1); } @@ -2145,7 +2119,31 @@ _PyTrash_thread_destroy_chain(void) } +int +_PyTrash_begin(PyThreadState *tstate, PyObject *op) +{ + if (tstate->trash_delete_nesting >= PyTrash_UNWIND_LEVEL) { + /* Store the object (to be deallocated later) and jump past + * Py_TRASHCAN_END, skipping the body of the deallocator */ + _PyTrash_thread_deposit_object(op); + return 1; + } + ++tstate->trash_delete_nesting; + return 0; +} + + void +_PyTrash_end(PyThreadState *tstate) +{ + --tstate->trash_delete_nesting; + if (tstate->trash_delete_later && tstate->trash_delete_nesting <= 0) { + _PyTrash_thread_destroy_chain(); + } +} + + +void _Py_NO_RETURN _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, const char *file, int line, const char *function) { @@ -2181,7 +2179,7 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, to crash than dumping the traceback. */ void *ptr; PyTypeObject *type = Py_TYPE(obj); - if (PyType_IS_GC(type)) { + if (_PyType_IS_GC(type)) { ptr = (void *)((char *)obj - sizeof(PyGC_Head)); } else { @@ -2201,20 +2199,24 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, } -#undef _Py_Dealloc - void _Py_Dealloc(PyObject *op) { destructor dealloc = Py_TYPE(op)->tp_dealloc; #ifdef Py_TRACE_REFS _Py_ForgetReference(op); -#else - _Py_INC_TPFREES(op); #endif (*dealloc)(op); } + +PyObject ** +PyObject_GET_WEAKREFS_LISTPTR(PyObject *op) +{ + return _PyObject_GET_WEAKREFS_LISTPTR(op); +} + + #ifdef __cplusplus } #endif diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index c483ff3e..eb34f10b 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -1,5 +1,5 @@ #include "Python.h" -#include "pycore_pymem.h" +#include "pycore_pymem.h" // _PyTraceMalloc_Config #include @@ -25,7 +25,7 @@ static void* _PyMem_DebugRealloc(void *ctx, void *ptr, size_t size); static void _PyMem_DebugFree(void *ctx, void *p); static void _PyObject_DebugDumpAddress(const void *p); -static void _PyMem_DebugCheckAddress(char api_id, const void *p); +static void _PyMem_DebugCheckAddress(const char *func, char api_id, const void *p); static void _PyMem_SetupDebugHooksDomain(PyMemAllocatorDomain domain); @@ -710,19 +710,21 @@ PyObject_Free(void *ptr) } -#ifdef WITH_PYMALLOC - -#ifdef WITH_VALGRIND -#include - /* If we're using GCC, use __builtin_expect() to reduce overhead of the valgrind checks */ #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) # define UNLIKELY(value) __builtin_expect((value), 0) +# define LIKELY(value) __builtin_expect((value), 1) #else # define UNLIKELY(value) (value) +# define LIKELY(value) (value) #endif +#ifdef WITH_PYMALLOC + +#ifdef WITH_VALGRIND +#include + /* -1 indicates that we haven't checked that we're running on valgrind yet. */ static int running_on_valgrind = -1; #endif @@ -1206,12 +1208,29 @@ static size_t ntimes_arena_allocated = 0; /* High water mark (max value ever seen) for narenas_currently_allocated. */ static size_t narenas_highwater = 0; -static Py_ssize_t _Py_AllocatedBlocks = 0; +static Py_ssize_t raw_allocated_blocks; Py_ssize_t _Py_GetAllocatedBlocks(void) { - return _Py_AllocatedBlocks; + Py_ssize_t n = raw_allocated_blocks; + /* add up allocated blocks for used pools */ + for (uint i = 0; i < maxarenas; ++i) { + /* Skip arenas which are not allocated. */ + if (arenas[i].address == 0) { + continue; + } + + uintptr_t base = (uintptr_t)_Py_ALIGN_UP(arenas[i].address, POOL_SIZE); + + /* visit every pool in the arena */ + assert(base <= (uintptr_t) arenas[i].pool_address); + for (; base < (uintptr_t) arenas[i].pool_address; base += POOL_SIZE) { + poolp p = (poolp)base; + n += p->ref.count; + } + } + return n; } @@ -1407,96 +1426,48 @@ address_in_range(void *p, poolp pool) /*==========================================================================*/ -/* pymalloc allocator - - The basic blocks are ordered by decreasing execution frequency, - which minimizes the number of jumps in the most common cases, - improves branching prediction and instruction scheduling (small - block allocations typically result in a couple of instructions). - Unless the optimizer reorders everything, being too smart... - - Return a pointer to newly allocated memory if pymalloc allocated memory. - - Return NULL if pymalloc failed to allocate the memory block: on bigger - requests, on error in the code below (as a last chance to serve the request) - or when the max memory limit has been reached. */ -static void* -pymalloc_alloc(void *ctx, size_t nbytes) +// Called when freelist is exhausted. Extend the freelist if there is +// space for a block. Otherwise, remove this pool from usedpools. +static void +pymalloc_pool_extend(poolp pool, uint size) { - block *bp; - poolp pool; - poolp next; - uint size; - -#ifdef WITH_VALGRIND - if (UNLIKELY(running_on_valgrind == -1)) { - running_on_valgrind = RUNNING_ON_VALGRIND; - } - if (UNLIKELY(running_on_valgrind)) { - return NULL; - } -#endif - - if (nbytes == 0) { - return NULL; - } - if (nbytes > SMALL_REQUEST_THRESHOLD) { - return NULL; + if (UNLIKELY(pool->nextoffset <= pool->maxnextoffset)) { + /* There is room for another block. */ + pool->freeblock = (block*)pool + pool->nextoffset; + pool->nextoffset += INDEX2SIZE(size); + *(block **)(pool->freeblock) = NULL; + return; } - /* - * Most frequent paths first - */ - size = (uint)(nbytes - 1) >> ALIGNMENT_SHIFT; - pool = usedpools[size + size]; - if (pool != pool->nextpool) { - /* - * There is a used pool for this size class. - * Pick up the head block of its free list. - */ - ++pool->ref.count; - bp = pool->freeblock; - assert(bp != NULL); - if ((pool->freeblock = *(block **)bp) != NULL) { - goto success; - } - - /* - * Reached the end of the free list, try to extend it. - */ - if (pool->nextoffset <= pool->maxnextoffset) { - /* There is room for another block. */ - pool->freeblock = (block*)pool + - pool->nextoffset; - pool->nextoffset += INDEX2SIZE(size); - *(block **)(pool->freeblock) = NULL; - goto success; - } - - /* Pool is full, unlink from used pools. */ - next = pool->nextpool; - pool = pool->prevpool; - next->prevpool = pool; - pool->nextpool = next; - goto success; - } + /* Pool is full, unlink from used pools. */ + poolp next; + next = pool->nextpool; + pool = pool->prevpool; + next->prevpool = pool; + pool->nextpool = next; +} +/* called when pymalloc_alloc can not allocate a block from usedpool. + * This function takes new pool and allocate a block from it. + */ +static void* +allocate_from_new_pool(uint size) +{ /* There isn't a pool of the right size class immediately * available: use a free pool. */ - if (usable_arenas == NULL) { + if (UNLIKELY(usable_arenas == NULL)) { /* No arena has a free pool: allocate a new arena. */ #ifdef WITH_MEMORY_LIMITS if (narenas_currently_allocated >= MAX_ARENAS) { - goto failed; + return NULL; } #endif usable_arenas = new_arena(); if (usable_arenas == NULL) { - goto failed; + return NULL; } - usable_arenas->nextarena = - usable_arenas->prevarena = NULL; + usable_arenas->nextarena = usable_arenas->prevarena = NULL; assert(nfp2lasta[usable_arenas->nfreepools] == NULL); nfp2lasta[usable_arenas->nfreepools] = usable_arenas; } @@ -1519,12 +1490,12 @@ pymalloc_alloc(void *ctx, size_t nbytes) } /* Try to get a cached free pool. */ - pool = usable_arenas->freepools; - if (pool != NULL) { + poolp pool = usable_arenas->freepools; + if (LIKELY(pool != NULL)) { /* Unlink from cached pools. */ usable_arenas->freepools = pool->nextpool; - --usable_arenas->nfreepools; - if (usable_arenas->nfreepools == 0) { + usable_arenas->nfreepools--; + if (UNLIKELY(usable_arenas->nfreepools == 0)) { /* Wholly allocated: remove. */ assert(usable_arenas->freepools == NULL); assert(usable_arenas->nextarena == NULL || @@ -1547,72 +1518,119 @@ pymalloc_alloc(void *ctx, size_t nbytes) (block*)usable_arenas->address + ARENA_SIZE - POOL_SIZE); } + } + else { + /* Carve off a new pool. */ + assert(usable_arenas->nfreepools > 0); + assert(usable_arenas->freepools == NULL); + pool = (poolp)usable_arenas->pool_address; + assert((block*)pool <= (block*)usable_arenas->address + + ARENA_SIZE - POOL_SIZE); + pool->arenaindex = (uint)(usable_arenas - arenas); + assert(&arenas[pool->arenaindex] == usable_arenas); + pool->szidx = DUMMY_SIZE_IDX; + usable_arenas->pool_address += POOL_SIZE; + --usable_arenas->nfreepools; - init_pool: - /* Frontlink to used pools. */ - next = usedpools[size + size]; /* == prev */ - pool->nextpool = next; - pool->prevpool = next; - next->nextpool = pool; - next->prevpool = pool; - pool->ref.count = 1; - if (pool->szidx == size) { - /* Luckily, this pool last contained blocks - * of the same size class, so its header - * and free list are already initialized. - */ - bp = pool->freeblock; - assert(bp != NULL); - pool->freeblock = *(block **)bp; - goto success; + if (usable_arenas->nfreepools == 0) { + assert(usable_arenas->nextarena == NULL || + usable_arenas->nextarena->prevarena == + usable_arenas); + /* Unlink the arena: it is completely allocated. */ + usable_arenas = usable_arenas->nextarena; + if (usable_arenas != NULL) { + usable_arenas->prevarena = NULL; + assert(usable_arenas->address != 0); + } } - /* - * Initialize the pool header, set up the free list to - * contain just the second block, and return the first - * block. + } + + /* Frontlink to used pools. */ + block *bp; + poolp next = usedpools[size + size]; /* == prev */ + pool->nextpool = next; + pool->prevpool = next; + next->nextpool = pool; + next->prevpool = pool; + pool->ref.count = 1; + if (pool->szidx == size) { + /* Luckily, this pool last contained blocks + * of the same size class, so its header + * and free list are already initialized. */ - pool->szidx = size; - size = INDEX2SIZE(size); - bp = (block *)pool + POOL_OVERHEAD; - pool->nextoffset = POOL_OVERHEAD + (size << 1); - pool->maxnextoffset = POOL_SIZE - size; - pool->freeblock = bp + size; - *(block **)(pool->freeblock) = NULL; - goto success; + bp = pool->freeblock; + assert(bp != NULL); + pool->freeblock = *(block **)bp; + return bp; } + /* + * Initialize the pool header, set up the free list to + * contain just the second block, and return the first + * block. + */ + pool->szidx = size; + size = INDEX2SIZE(size); + bp = (block *)pool + POOL_OVERHEAD; + pool->nextoffset = POOL_OVERHEAD + (size << 1); + pool->maxnextoffset = POOL_SIZE - size; + pool->freeblock = bp + size; + *(block **)(pool->freeblock) = NULL; + return bp; +} - /* Carve off a new pool. */ - assert(usable_arenas->nfreepools > 0); - assert(usable_arenas->freepools == NULL); - pool = (poolp)usable_arenas->pool_address; - assert((block*)pool <= (block*)usable_arenas->address + - ARENA_SIZE - POOL_SIZE); - pool->arenaindex = (uint)(usable_arenas - arenas); - assert(&arenas[pool->arenaindex] == usable_arenas); - pool->szidx = DUMMY_SIZE_IDX; - usable_arenas->pool_address += POOL_SIZE; - --usable_arenas->nfreepools; - - if (usable_arenas->nfreepools == 0) { - assert(usable_arenas->nextarena == NULL || - usable_arenas->nextarena->prevarena == - usable_arenas); - /* Unlink the arena: it is completely allocated. */ - usable_arenas = usable_arenas->nextarena; - if (usable_arenas != NULL) { - usable_arenas->prevarena = NULL; - assert(usable_arenas->address != 0); - } +/* pymalloc allocator + + Return a pointer to newly allocated memory if pymalloc allocated memory. + + Return NULL if pymalloc failed to allocate the memory block: on bigger + requests, on error in the code below (as a last chance to serve the request) + or when the max memory limit has been reached. +*/ +static inline void* +pymalloc_alloc(void *ctx, size_t nbytes) +{ +#ifdef WITH_VALGRIND + if (UNLIKELY(running_on_valgrind == -1)) { + running_on_valgrind = RUNNING_ON_VALGRIND; + } + if (UNLIKELY(running_on_valgrind)) { + return NULL; } +#endif - goto init_pool; + if (UNLIKELY(nbytes == 0)) { + return NULL; + } + if (UNLIKELY(nbytes > SMALL_REQUEST_THRESHOLD)) { + return NULL; + } -success: - assert(bp != NULL); - return (void *)bp; + uint size = (uint)(nbytes - 1) >> ALIGNMENT_SHIFT; + poolp pool = usedpools[size + size]; + block *bp; -failed: - return NULL; + if (LIKELY(pool != pool->nextpool)) { + /* + * There is a used pool for this size class. + * Pick up the head block of its free list. + */ + ++pool->ref.count; + bp = pool->freeblock; + assert(bp != NULL); + + if (UNLIKELY((pool->freeblock = *(block **)bp) == NULL)) { + // Reached the end of the free list, try to extend it. + pymalloc_pool_extend(pool, size); + } + } + else { + /* There isn't a pool of the right size class immediately + * available: use a free pool. + */ + bp = allocate_from_new_pool(size); + } + + return (void *)bp; } @@ -1620,14 +1638,13 @@ static void * _PyObject_Malloc(void *ctx, size_t nbytes) { void* ptr = pymalloc_alloc(ctx, nbytes); - if (ptr != NULL) { - _Py_AllocatedBlocks++; + if (LIKELY(ptr != NULL)) { return ptr; } ptr = PyMem_RawMalloc(nbytes); if (ptr != NULL) { - _Py_AllocatedBlocks++; + raw_allocated_blocks++; } return ptr; } @@ -1639,103 +1656,51 @@ _PyObject_Calloc(void *ctx, size_t nelem, size_t elsize) assert(elsize == 0 || nelem <= (size_t)PY_SSIZE_T_MAX / elsize); size_t nbytes = nelem * elsize; - void *ptr = pymalloc_alloc(ctx, nbytes); - if (ptr != NULL) { + void* ptr = pymalloc_alloc(ctx, nbytes); + if (LIKELY(ptr != NULL)) { memset(ptr, 0, nbytes); - _Py_AllocatedBlocks++; return ptr; } ptr = PyMem_RawCalloc(nelem, elsize); if (ptr != NULL) { - _Py_AllocatedBlocks++; + raw_allocated_blocks++; } return ptr; } -/* Free a memory block allocated by pymalloc_alloc(). - Return 1 if it was freed. - Return 0 if the block was not allocated by pymalloc_alloc(). */ -static int -pymalloc_free(void *ctx, void *p) +static void +insert_to_usedpool(poolp pool) { - poolp pool; - block *lastfree; - poolp next, prev; - uint size; - - assert(p != NULL); - -#ifdef WITH_VALGRIND - if (UNLIKELY(running_on_valgrind > 0)) { - return 0; - } -#endif + assert(pool->ref.count > 0); /* else the pool is empty */ - pool = POOL_ADDR(p); - if (!address_in_range(p, pool)) { - return 0; - } - /* We allocated this address. */ + uint size = pool->szidx; + poolp next = usedpools[size + size]; + poolp prev = next->prevpool; - /* Link p to the start of the pool's freeblock list. Since - * the pool had at least the p block outstanding, the pool - * wasn't empty (so it's already in a usedpools[] list, or - * was full and is in no list -- it's not in the freeblocks - * list in any case). - */ - assert(pool->ref.count > 0); /* else it was empty */ - *(block **)p = lastfree = pool->freeblock; - pool->freeblock = (block *)p; - if (!lastfree) { - /* Pool was full, so doesn't currently live in any list: - * link it to the front of the appropriate usedpools[] list. - * This mimics LRU pool usage for new allocations and - * targets optimal filling when several pools contain - * blocks of the same size class. - */ - --pool->ref.count; - assert(pool->ref.count > 0); /* else the pool is empty */ - size = pool->szidx; - next = usedpools[size + size]; - prev = next->prevpool; - - /* insert pool before next: prev <-> pool <-> next */ - pool->nextpool = next; - pool->prevpool = prev; - next->prevpool = pool; - prev->nextpool = pool; - goto success; - } - - struct arena_object* ao; - uint nf; /* ao->nfreepools */ + /* insert pool before next: prev <-> pool <-> next */ + pool->nextpool = next; + pool->prevpool = prev; + next->prevpool = pool; + prev->nextpool = pool; +} - /* freeblock wasn't NULL, so the pool wasn't full, - * and the pool is in a usedpools[] list. - */ - if (--pool->ref.count != 0) { - /* pool isn't empty: leave it in usedpools */ - goto success; - } - /* Pool is now empty: unlink from usedpools, and - * link to the front of freepools. This ensures that - * previously freed pools will be allocated later - * (being not referenced, they are perhaps paged out). - */ - next = pool->nextpool; - prev = pool->prevpool; +static void +insert_to_freepool(poolp pool) +{ + poolp next = pool->nextpool; + poolp prev = pool->prevpool; next->prevpool = prev; prev->nextpool = next; /* Link the pool to freepools. This is a singly-linked * list, and pool->prevpool isn't used there. */ - ao = &arenas[pool->arenaindex]; + struct arena_object *ao = &arenas[pool->arenaindex]; pool->nextpool = ao->freepools; ao->freepools = pool; - nf = ao->nfreepools; + uint nf = ao->nfreepools; /* If this is the rightmost arena with this number of free pools, * nfp2lasta[nf] needs to change. Caution: if nf is 0, there * are no arenas in usable_arenas with that value. @@ -1756,7 +1721,12 @@ pymalloc_free(void *ctx, void *p) /* All the rest is arena management. We just freed * a pool, and there are 4 cases for arena mgmt: * 1. If all the pools are free, return the arena to - * the system free(). + * the system free(). Except if this is the last + * arena in the list, keep it to avoid thrashing: + * keeping one wholly free arena in the list avoids + * pathological cases where a simple loop would + * otherwise provoke needing to allocate and free an + * arena on every iteration. See bpo-37257. * 2. If this is the only free pool in the arena, * add the arena back to the `usable_arenas` list. * 3. If the "next" arena has a smaller count of free @@ -1765,7 +1735,7 @@ pymalloc_free(void *ctx, void *p) * nfreepools. * 4. Else there's nothing more to do. */ - if (nf == ao->ntotalpools) { + if (nf == ao->ntotalpools && ao->nextarena != NULL) { /* Case 1. First unlink ao from usable_arenas. */ assert(ao->prevarena == NULL || @@ -1804,7 +1774,7 @@ pymalloc_free(void *ctx, void *p) ao->address = 0; /* mark unassociated */ --narenas_currently_allocated; - goto success; + return; } if (nf == 1) { @@ -1823,7 +1793,7 @@ pymalloc_free(void *ctx, void *p) nfp2lasta[1] = ao; } - goto success; + return; } /* If this arena is now out of order, we need to keep @@ -1840,7 +1810,7 @@ pymalloc_free(void *ctx, void *p) /* If this was the rightmost of the old size, it remains in place. */ if (ao == lastnf) { /* Case 4. Nothing to do. */ - goto success; + return; } /* If ao were the only arena in the list, the last block would have * gotten us out. @@ -1876,10 +1846,65 @@ pymalloc_free(void *ctx, void *p) assert(ao->nextarena == NULL || ao->nextarena->prevarena == ao); assert((usable_arenas == ao && ao->prevarena == NULL) || ao->prevarena->nextarena == ao); +} + +/* Free a memory block allocated by pymalloc_alloc(). + Return 1 if it was freed. + Return 0 if the block was not allocated by pymalloc_alloc(). */ +static inline int +pymalloc_free(void *ctx, void *p) +{ + assert(p != NULL); + +#ifdef WITH_VALGRIND + if (UNLIKELY(running_on_valgrind > 0)) { + return 0; + } +#endif + + poolp pool = POOL_ADDR(p); + if (UNLIKELY(!address_in_range(p, pool))) { + return 0; + } + /* We allocated this address. */ + + /* Link p to the start of the pool's freeblock list. Since + * the pool had at least the p block outstanding, the pool + * wasn't empty (so it's already in a usedpools[] list, or + * was full and is in no list -- it's not in the freeblocks + * list in any case). + */ + assert(pool->ref.count > 0); /* else it was empty */ + block *lastfree = pool->freeblock; + *(block **)p = lastfree; + pool->freeblock = (block *)p; + pool->ref.count--; - goto success; + if (UNLIKELY(lastfree == NULL)) { + /* Pool was full, so doesn't currently live in any list: + * link it to the front of the appropriate usedpools[] list. + * This mimics LRU pool usage for new allocations and + * targets optimal filling when several pools contain + * blocks of the same size class. + */ + insert_to_usedpool(pool); + return 1; + } -success: + /* freeblock wasn't NULL, so the pool wasn't full, + * and the pool is in a usedpools[] list. + */ + if (LIKELY(pool->ref.count != 0)) { + /* pool isn't empty: leave it in usedpools */ + return 1; + } + + /* Pool is now empty: unlink from usedpools, and + * link to the front of freepools. This ensures that + * previously freed pools will be allocated later + * (being not referenced, they are perhaps paged out). + */ + insert_to_freepool(pool); return 1; } @@ -1892,10 +1917,10 @@ _PyObject_Free(void *ctx, void *p) return; } - _Py_AllocatedBlocks--; - if (!pymalloc_free(ctx, p)) { + if (UNLIKELY(!pymalloc_free(ctx, p))) { /* pymalloc didn't allocate this address */ PyMem_RawFree(p); + raw_allocated_blocks--; } } @@ -2180,7 +2205,7 @@ _PyMem_DebugRawFree(void *ctx, void *p) uint8_t *q = (uint8_t *)p - 2*SST; /* address returned from malloc */ size_t nbytes; - _PyMem_DebugCheckAddress(api->api_id, p); + _PyMem_DebugCheckAddress(__func__, api->api_id, p); nbytes = read_size_t(q); nbytes += PYMEM_DEBUG_EXTRA_BYTES; memset(q, PYMEM_DEADBYTE, nbytes); @@ -2205,7 +2230,7 @@ _PyMem_DebugRawRealloc(void *ctx, void *p, size_t nbytes) #define ERASED_SIZE 64 uint8_t save[2*ERASED_SIZE]; /* A copy of erased bytes. */ - _PyMem_DebugCheckAddress(api->api_id, p); + _PyMem_DebugCheckAddress(__func__, api->api_id, p); data = (uint8_t *)p; head = data - 2*SST; @@ -2288,25 +2313,27 @@ _PyMem_DebugRawRealloc(void *ctx, void *p, size_t nbytes) return data; } -static void -_PyMem_DebugCheckGIL(void) +static inline void +_PyMem_DebugCheckGIL(const char *func) { - if (!PyGILState_Check()) - Py_FatalError("Python memory allocator called " - "without holding the GIL"); + if (!PyGILState_Check()) { + _Py_FatalErrorFunc(func, + "Python memory allocator called " + "without holding the GIL"); + } } static void * _PyMem_DebugMalloc(void *ctx, size_t nbytes) { - _PyMem_DebugCheckGIL(); + _PyMem_DebugCheckGIL(__func__); return _PyMem_DebugRawMalloc(ctx, nbytes); } static void * _PyMem_DebugCalloc(void *ctx, size_t nelem, size_t elsize) { - _PyMem_DebugCheckGIL(); + _PyMem_DebugCheckGIL(__func__); return _PyMem_DebugRawCalloc(ctx, nelem, elsize); } @@ -2314,7 +2341,7 @@ _PyMem_DebugCalloc(void *ctx, size_t nelem, size_t elsize) static void _PyMem_DebugFree(void *ctx, void *ptr) { - _PyMem_DebugCheckGIL(); + _PyMem_DebugCheckGIL(__func__); _PyMem_DebugRawFree(ctx, ptr); } @@ -2322,7 +2349,7 @@ _PyMem_DebugFree(void *ctx, void *ptr) static void * _PyMem_DebugRealloc(void *ctx, void *ptr, size_t nbytes) { - _PyMem_DebugCheckGIL(); + _PyMem_DebugCheckGIL(__func__); return _PyMem_DebugRawRealloc(ctx, ptr, nbytes); } @@ -2332,28 +2359,24 @@ _PyMem_DebugRealloc(void *ctx, void *ptr, size_t nbytes) * The API id, is also checked. */ static void -_PyMem_DebugCheckAddress(char api, const void *p) +_PyMem_DebugCheckAddress(const char *func, char api, const void *p) { + assert(p != NULL); + const uint8_t *q = (const uint8_t *)p; - char msgbuf[64]; - const char *msg; size_t nbytes; const uint8_t *tail; int i; char id; - if (p == NULL) { - msg = "didn't expect a NULL pointer"; - goto error; - } - /* Check the API id */ id = (char)q[-SST]; if (id != api) { - msg = msgbuf; - snprintf(msgbuf, sizeof(msgbuf), "bad ID: Allocated using API '%c', verified using API '%c'", id, api); - msgbuf[sizeof(msgbuf)-1] = 0; - goto error; + _PyObject_DebugDumpAddress(p); + _Py_FatalErrorFormat(func, + "bad ID: Allocated using API '%c', " + "verified using API '%c'", + id, api); } /* Check the stuff at the start of p first: if there's underwrite @@ -2362,8 +2385,8 @@ _PyMem_DebugCheckAddress(char api, const void *p) */ for (i = SST-1; i >= 1; --i) { if (*(q-i) != PYMEM_FORBIDDENBYTE) { - msg = "bad leading pad byte"; - goto error; + _PyObject_DebugDumpAddress(p); + _Py_FatalErrorFunc(func, "bad leading pad byte"); } } @@ -2371,16 +2394,10 @@ _PyMem_DebugCheckAddress(char api, const void *p) tail = q + nbytes; for (i = 0; i < SST; ++i) { if (tail[i] != PYMEM_FORBIDDENBYTE) { - msg = "bad trailing pad byte"; - goto error; + _PyObject_DebugDumpAddress(p); + _Py_FatalErrorFunc(func, "bad trailing pad byte"); } } - - return; - -error: - _PyObject_DebugDumpAddress(p); - Py_FatalError(msg); } /* Display info to stderr about the memory block at p. */ diff --git a/Objects/odictobject.c b/Objects/odictobject.c index ac0da9bd..d5bf4995 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -466,8 +466,7 @@ later: #include "Python.h" #include "pycore_object.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include // offsetof() #include "dict-common.h" #include @@ -526,6 +525,8 @@ struct _odictnode { #define _odict_FOREACH(od, node) \ for (node = _odict_FIRST(od); node != NULL; node = _odictnode_NEXT(node)) +_Py_IDENTIFIER(items); + /* Return the index into the hash table, regardless of a valid node. */ static Py_ssize_t _odict_get_index_raw(PyODictObject *od, PyObject *key, Py_hash_t hash) @@ -849,6 +850,57 @@ static PyMappingMethods odict_as_mapping = { }; +/* ---------------------------------------------- + * OrderedDict number methods + */ + +static int mutablemapping_update_arg(PyObject*, PyObject*); + +static PyObject * +odict_or(PyObject *left, PyObject *right) +{ + PyTypeObject *type; + PyObject *other; + if (PyODict_Check(left)) { + type = Py_TYPE(left); + other = right; + } + else { + type = Py_TYPE(right); + other = left; + } + if (!PyDict_Check(other)) { + Py_RETURN_NOTIMPLEMENTED; + } + PyObject *new = PyObject_CallOneArg((PyObject*)type, left); + if (!new) { + return NULL; + } + if (mutablemapping_update_arg(new, right) < 0) { + Py_DECREF(new); + return NULL; + } + return new; +} + +static PyObject * +odict_inplace_or(PyObject *self, PyObject *other) +{ + if (mutablemapping_update_arg(self, other) < 0) { + return NULL; + } + Py_INCREF(self); + return self; +} + +/* tp_as_number */ + +static PyNumberMethods odict_as_number = { + .nb_or = odict_or, + .nb_inplace_or = odict_inplace_or, +}; + + /* ---------------------------------------------- * OrderedDict methods */ @@ -896,7 +948,6 @@ static PyObject * odict_reduce(register PyODictObject *od, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(__dict__); - _Py_IDENTIFIER(items); PyObject *dict = NULL, *result = NULL; PyObject *items_iter, *items, *args = NULL; @@ -920,7 +971,7 @@ odict_reduce(register PyODictObject *od, PyObject *Py_UNUSED(ignored)) if (args == NULL) goto Done; - items = _PyObject_CallMethodIdObjArgs((PyObject *)od, &PyId_items, NULL); + items = _PyObject_CallMethodIdNoArgs((PyObject *)od, &PyId_items); if (items == NULL) goto Done; @@ -1375,7 +1426,6 @@ static PyObject * odict_repr(PyODictObject *self) { int i; - _Py_IDENTIFIER(items); PyObject *pieces = NULL, *result = NULL; if (PyODict_SIZE(self) == 0) @@ -1417,12 +1467,13 @@ odict_repr(PyODictObject *self) } count++; } - if (count < PyList_GET_SIZE(pieces)) - Py_SIZE(pieces) = count; + if (count < PyList_GET_SIZE(pieces)) { + Py_SET_SIZE(pieces, count); + } } else { - PyObject *items = _PyObject_CallMethodIdObjArgs((PyObject *)self, - &PyId_items, NULL); + PyObject *items = _PyObject_CallMethodIdNoArgs((PyObject *)self, + &PyId_items); if (items == NULL) goto Done; pieces = PySequence_List(items); @@ -1554,7 +1605,7 @@ PyTypeObject PyODict_Type = { 0, /* tp_setattr */ 0, /* tp_as_async */ (reprfunc)odict_repr, /* tp_repr */ - 0, /* tp_as_number */ + &odict_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ &odict_as_mapping, /* tp_as_mapping */ 0, /* tp_hash */ @@ -2188,17 +2239,77 @@ Done: return 0; } -static PyObject * -mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) +static int +mutablemapping_update_arg(PyObject *self, PyObject *arg) { int res = 0; - Py_ssize_t len; - _Py_IDENTIFIER(items); + if (PyDict_CheckExact(arg)) { + PyObject *items = PyDict_Items(arg); + if (items == NULL) { + return -1; + } + res = mutablemapping_add_pairs(self, items); + Py_DECREF(items); + return res; + } _Py_IDENTIFIER(keys); + PyObject *func; + if (_PyObject_LookupAttrId(arg, &PyId_keys, &func) < 0) { + return -1; + } + if (func != NULL) { + PyObject *keys = _PyObject_CallNoArg(func); + Py_DECREF(func); + if (keys == NULL) { + return -1; + } + PyObject *iterator = PyObject_GetIter(keys); + Py_DECREF(keys); + if (iterator == NULL) { + return -1; + } + PyObject *key; + while (res == 0 && (key = PyIter_Next(iterator))) { + PyObject *value = PyObject_GetItem(arg, key); + if (value != NULL) { + res = PyObject_SetItem(self, key, value); + Py_DECREF(value); + } + else { + res = -1; + } + Py_DECREF(key); + } + Py_DECREF(iterator); + if (res != 0 || PyErr_Occurred()) { + return -1; + } + return 0; + } + if (_PyObject_LookupAttrId(arg, &PyId_items, &func) < 0) { + return -1; + } + if (func != NULL) { + PyObject *items = _PyObject_CallNoArg(func); + Py_DECREF(func); + if (items == NULL) { + return -1; + } + res = mutablemapping_add_pairs(self, items); + Py_DECREF(items); + return res; + } + res = mutablemapping_add_pairs(self, arg); + return res; +} +static PyObject * +mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) +{ + int res; /* first handle args, if any */ assert(args == NULL || PyTuple_Check(args)); - len = (args != NULL) ? PyTuple_GET_SIZE(args) : 0; + Py_ssize_t len = (args != NULL) ? PyTuple_GET_SIZE(args) : 0; if (len > 1) { const char *msg = "update() takes at most 1 positional argument (%zd given)"; PyErr_Format(PyExc_TypeError, msg, len); @@ -2206,83 +2317,16 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) } if (len) { - PyObject *func; PyObject *other = PyTuple_GET_ITEM(args, 0); /* borrowed reference */ assert(other != NULL); Py_INCREF(other); - if (PyDict_CheckExact(other)) { - PyObject *items = PyDict_Items(other); - Py_DECREF(other); - if (items == NULL) - return NULL; - res = mutablemapping_add_pairs(self, items); - Py_DECREF(items); - if (res == -1) - return NULL; - goto handle_kwargs; - } - - if (_PyObject_LookupAttrId(other, &PyId_keys, &func) < 0) { - Py_DECREF(other); - return NULL; - } - if (func != NULL) { - PyObject *keys, *iterator, *key; - keys = _PyObject_CallNoArg(func); - Py_DECREF(func); - if (keys == NULL) { - Py_DECREF(other); - return NULL; - } - iterator = PyObject_GetIter(keys); - Py_DECREF(keys); - if (iterator == NULL) { - Py_DECREF(other); - return NULL; - } - while (res == 0 && (key = PyIter_Next(iterator))) { - PyObject *value = PyObject_GetItem(other, key); - if (value != NULL) { - res = PyObject_SetItem(self, key, value); - Py_DECREF(value); - } - else { - res = -1; - } - Py_DECREF(key); - } - Py_DECREF(other); - Py_DECREF(iterator); - if (res != 0 || PyErr_Occurred()) - return NULL; - goto handle_kwargs; - } - - if (_PyObject_LookupAttrId(other, &PyId_items, &func) < 0) { - Py_DECREF(other); - return NULL; - } - if (func != NULL) { - PyObject *items; - Py_DECREF(other); - items = _PyObject_CallNoArg(func); - Py_DECREF(func); - if (items == NULL) - return NULL; - res = mutablemapping_add_pairs(self, items); - Py_DECREF(items); - if (res == -1) - return NULL; - goto handle_kwargs; - } - - res = mutablemapping_add_pairs(self, other); + res = mutablemapping_update_arg(self, other); Py_DECREF(other); - if (res != 0) + if (res < 0) { return NULL; + } } - handle_kwargs: /* now handle kwargs */ assert(kwargs == NULL || PyDict_Check(kwargs)); if (kwargs != NULL && PyDict_GET_SIZE(kwargs)) { diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 239ace6f..751dbb98 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -1,7 +1,9 @@ /* Range object implementation */ #include "Python.h" -#include "structmember.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_tupleobject.h" +#include "structmember.h" // PyMemberDef /* Support objects whose length is > PY_SSIZE_T_MAX. @@ -18,6 +20,8 @@ typedef struct { PyObject *length; } rangeobject; +_Py_IDENTIFIER(iter); + /* Helper function for validating step. Always returns a new reference or NULL on error. */ @@ -69,50 +73,57 @@ make_range_object(PyTypeObject *type, PyObject *start, range(0, 5, -1) */ static PyObject * -range_new(PyTypeObject *type, PyObject *args, PyObject *kw) +range_from_array(PyTypeObject *type, PyObject *const *args, Py_ssize_t num_args) { rangeobject *obj; PyObject *start = NULL, *stop = NULL, *step = NULL; - if (!_PyArg_NoKeywords("range", kw)) - return NULL; - - if (PyTuple_Size(args) <= 1) { - if (!PyArg_UnpackTuple(args, "range", 1, 1, &stop)) - return NULL; - stop = PyNumber_Index(stop); - if (!stop) - return NULL; - Py_INCREF(_PyLong_Zero); - start = _PyLong_Zero; - Py_INCREF(_PyLong_One); - step = _PyLong_One; - } - else { - if (!PyArg_UnpackTuple(args, "range", 2, 3, - &start, &stop, &step)) - return NULL; - - /* Convert borrowed refs to owned refs */ - start = PyNumber_Index(start); - if (!start) - return NULL; - stop = PyNumber_Index(stop); - if (!stop) { - Py_DECREF(start); + switch (num_args) { + case 3: + step = args[2]; + /* fallthrough */ + case 2: + /* Convert borrowed refs to owned refs */ + start = PyNumber_Index(args[0]); + if (!start) { + return NULL; + } + stop = PyNumber_Index(args[1]); + if (!stop) { + Py_DECREF(start); + return NULL; + } + step = validate_step(step); /* Caution, this can clear exceptions */ + if (!step) { + Py_DECREF(start); + Py_DECREF(stop); + return NULL; + } + break; + case 1: + stop = PyNumber_Index(args[0]); + if (!stop) { + return NULL; + } + Py_INCREF(_PyLong_Zero); + start = _PyLong_Zero; + Py_INCREF(_PyLong_One); + step = _PyLong_One; + break; + case 0: + PyErr_SetString(PyExc_TypeError, + "range expected at least 1 argument, got 0"); return NULL; - } - step = validate_step(step); /* Caution, this can clear exceptions */ - if (!step) { - Py_DECREF(start); - Py_DECREF(stop); + default: + PyErr_Format(PyExc_TypeError, + "range expected at most 3 arguments, got %zd", + num_args); return NULL; - } } - obj = make_range_object(type, start, stop, step); - if (obj != NULL) + if (obj != NULL) { return (PyObject *) obj; + } /* Failed to create object, release attributes */ Py_DECREF(start); @@ -121,6 +132,27 @@ range_new(PyTypeObject *type, PyObject *args, PyObject *kw) return NULL; } +static PyObject * +range_new(PyTypeObject *type, PyObject *args, PyObject *kw) +{ + if (!_PyArg_NoKeywords("range", kw)) + return NULL; + + return range_from_array(type, _PyTuple_ITEMS(args), PyTuple_GET_SIZE(args)); +} + + +static PyObject * +range_vectorcall(PyTypeObject *type, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_NoKwnames("range", kwnames)) { + return NULL; + } + return range_from_array(type, args, nargs); +} + PyDoc_STRVAR(range_doc, "range(stop) -> range object\n\ range(start, stop[, step]) -> range object\n\ @@ -600,7 +632,7 @@ range_reduce(rangeobject *r, PyObject *args) static PyObject * range_subscript(rangeobject* self, PyObject* item) { - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { PyObject *i, *result; i = PyNumber_Index(item); if (!i) @@ -614,7 +646,7 @@ range_subscript(rangeobject* self, PyObject* item) } PyErr_Format(PyExc_TypeError, "range indices must be integers or slices, not %.200s", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); return NULL; } @@ -702,6 +734,7 @@ PyTypeObject PyRange_Type = { 0, /* tp_init */ 0, /* tp_alloc */ range_new, /* tp_new */ + .tp_vectorcall = (vectorcallfunc)range_vectorcall }; /*********************** range Iterator **************************/ @@ -742,7 +775,6 @@ PyDoc_STRVAR(length_hint_doc, static PyObject * rangeiter_reduce(rangeiterobject *r, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); PyObject *start=NULL, *stop=NULL, *step=NULL; PyObject *range; @@ -900,7 +932,6 @@ longrangeiter_len(longrangeiterobject *r, PyObject *no_args) static PyObject * longrangeiter_reduce(longrangeiterobject *r, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); PyObject *product, *stop=NULL; PyObject *range; diff --git a/Objects/setobject.c b/Objects/setobject.c index f8ae0c05..76b1944d 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -32,9 +32,8 @@ */ #include "Python.h" -#include "pycore_object.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "pycore_object.h" // _PyObject_GC_UNTRACK() +#include // offsetof() /* Object used as dummy key to fill deleted entries */ static PyObject _dummy_struct; @@ -58,77 +57,43 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash) { setentry *table; setentry *entry; - size_t perturb; + size_t perturb = hash; size_t mask = so->mask; size_t i = (size_t)hash & mask; /* Unsigned for defined overflow behavior */ - size_t j; + int probes; int cmp; - entry = &so->table[i]; - if (entry->key == NULL) - return entry; - - perturb = hash; - while (1) { - if (entry->hash == hash) { - PyObject *startkey = entry->key; - /* startkey cannot be a dummy because the dummy hash field is -1 */ - assert(startkey != dummy); - if (startkey == key) - return entry; - if (PyUnicode_CheckExact(startkey) - && PyUnicode_CheckExact(key) - && _PyUnicode_EQ(startkey, key)) - return entry; - table = so->table; - Py_INCREF(startkey); - cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp < 0) /* unlikely */ - return NULL; - if (table != so->table || entry->key != startkey) /* unlikely */ - return set_lookkey(so, key, hash); - if (cmp > 0) /* likely */ + entry = &so->table[i]; + probes = (i + LINEAR_PROBES <= mask) ? LINEAR_PROBES: 0; + do { + if (entry->hash == 0 && entry->key == NULL) return entry; - mask = so->mask; /* help avoid a register spill */ - } - - if (i + LINEAR_PROBES <= mask) { - for (j = 0 ; j < LINEAR_PROBES ; j++) { - entry++; - if (entry->hash == 0 && entry->key == NULL) + if (entry->hash == hash) { + PyObject *startkey = entry->key; + assert(startkey != dummy); + if (startkey == key) return entry; - if (entry->hash == hash) { - PyObject *startkey = entry->key; - assert(startkey != dummy); - if (startkey == key) - return entry; - if (PyUnicode_CheckExact(startkey) - && PyUnicode_CheckExact(key) - && _PyUnicode_EQ(startkey, key)) - return entry; - table = so->table; - Py_INCREF(startkey); - cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp < 0) - return NULL; - if (table != so->table || entry->key != startkey) - return set_lookkey(so, key, hash); - if (cmp > 0) - return entry; - mask = so->mask; - } + if (PyUnicode_CheckExact(startkey) + && PyUnicode_CheckExact(key) + && _PyUnicode_EQ(startkey, key)) + return entry; + table = so->table; + Py_INCREF(startkey); + cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); + Py_DECREF(startkey); + if (cmp < 0) + return NULL; + if (table != so->table || entry->key != startkey) + return set_lookkey(so, key, hash); + if (cmp > 0) + return entry; + mask = so->mask; } - } - + entry++; + } while (probes--); perturb >>= PERTURB_SHIFT; i = (i * 5 + 1 + perturb) & mask; - - entry = &so->table[i]; - if (entry->key == NULL) - return entry; } } @@ -138,12 +103,11 @@ static int set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) { setentry *table; - setentry *freeslot; setentry *entry; size_t perturb; size_t mask; size_t i; /* Unsigned for defined overflow behavior */ - size_t j; + int probes; int cmp; /* Pre-increment is necessary to prevent arbitrary code in the rich @@ -154,90 +118,41 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) mask = so->mask; i = (size_t)hash & mask; - - entry = &so->table[i]; - if (entry->key == NULL) - goto found_unused; - - freeslot = NULL; perturb = hash; while (1) { - if (entry->hash == hash) { - PyObject *startkey = entry->key; - /* startkey cannot be a dummy because the dummy hash field is -1 */ - assert(startkey != dummy); - if (startkey == key) - goto found_active; - if (PyUnicode_CheckExact(startkey) - && PyUnicode_CheckExact(key) - && _PyUnicode_EQ(startkey, key)) - goto found_active; - table = so->table; - Py_INCREF(startkey); - cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp > 0) /* likely */ - goto found_active; - if (cmp < 0) - goto comparison_error; - /* Continuing the search from the current entry only makes - sense if the table and entry are unchanged; otherwise, - we have to restart from the beginning */ - if (table != so->table || entry->key != startkey) - goto restart; - mask = so->mask; /* help avoid a register spill */ - } - else if (entry->hash == -1) - freeslot = entry; - - if (i + LINEAR_PROBES <= mask) { - for (j = 0 ; j < LINEAR_PROBES ; j++) { - entry++; - if (entry->hash == 0 && entry->key == NULL) - goto found_unused_or_dummy; - if (entry->hash == hash) { - PyObject *startkey = entry->key; - assert(startkey != dummy); - if (startkey == key) - goto found_active; - if (PyUnicode_CheckExact(startkey) - && PyUnicode_CheckExact(key) - && _PyUnicode_EQ(startkey, key)) - goto found_active; - table = so->table; - Py_INCREF(startkey); - cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp > 0) - goto found_active; - if (cmp < 0) - goto comparison_error; - if (table != so->table || entry->key != startkey) - goto restart; - mask = so->mask; - } - else if (entry->hash == -1) - freeslot = entry; + entry = &so->table[i]; + probes = (i + LINEAR_PROBES <= mask) ? LINEAR_PROBES: 0; + do { + if (entry->hash == 0 && entry->key == NULL) + goto found_unused; + if (entry->hash == hash) { + PyObject *startkey = entry->key; + assert(startkey != dummy); + if (startkey == key) + goto found_active; + if (PyUnicode_CheckExact(startkey) + && PyUnicode_CheckExact(key) + && _PyUnicode_EQ(startkey, key)) + goto found_active; + table = so->table; + Py_INCREF(startkey); + cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); + Py_DECREF(startkey); + if (cmp > 0) + goto found_active; + if (cmp < 0) + goto comparison_error; + if (table != so->table || entry->key != startkey) + goto restart; + mask = so->mask; } - } - + entry++; + } while (probes--); perturb >>= PERTURB_SHIFT; i = (i * 5 + 1 + perturb) & mask; - - entry = &so->table[i]; - if (entry->key == NULL) - goto found_unused_or_dummy; } - found_unused_or_dummy: - if (freeslot == NULL) - goto found_unused; - so->used++; - freeslot->key = key; - freeslot->hash = hash; - return 0; - found_unused: so->fill++; so->used++; @@ -258,8 +173,7 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) /* Internal routine used by set_table_resize() to insert an item which is -known to be absent from the set. This routine also assumes that -the set contains no deleted entries. Besides the performance benefit, +known to be absent from the set. Besides the performance benefit, there is also safety benefit since using set_add_entry() risks making a callback in the middle of a set_table_resize(), see issue 1456209. The caller is responsible for updating the key's reference count and @@ -608,7 +522,7 @@ set_repr(PySetObject *so) goto done; listrepr = tmp; - if (Py_TYPE(so) != &PySet_Type) + if (!Py_IS_TYPE(so, &PySet_Type)) result = PyUnicode_FromFormat("%s({%U})", Py_TYPE(so)->tp_name, listrepr); @@ -1024,6 +938,7 @@ PyDoc_STRVAR(update_doc, static PyObject * make_new_set(PyTypeObject *type, PyObject *iterable) { + assert(PyType_Check(type)); PySetObject *so; so = (PySetObject *)type->tp_alloc(type, 0); @@ -1064,37 +979,67 @@ make_new_set_basetype(PyTypeObject *type, PyObject *iterable) static PyObject *emptyfrozenset = NULL; static PyObject * -frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +make_new_frozenset(PyTypeObject *type, PyObject *iterable) { - PyObject *iterable = NULL, *result; - - if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset", kwds)) - return NULL; - - if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable)) - return NULL; - - if (type != &PyFrozenSet_Type) + if (type != &PyFrozenSet_Type) { return make_new_set(type, iterable); + } if (iterable != NULL) { - /* frozenset(f) is idempotent */ if (PyFrozenSet_CheckExact(iterable)) { + /* frozenset(f) is idempotent */ Py_INCREF(iterable); return iterable; } - result = make_new_set(type, iterable); - if (result == NULL || PySet_GET_SIZE(result)) - return result; - Py_DECREF(result); + PyObject *res = make_new_set((PyTypeObject *)type, iterable); + if (res == NULL || PySet_GET_SIZE(res) != 0) { + return res; + } + /* If the created frozenset is empty, return the empty frozenset singleton instead */ + Py_DECREF(res); + } + + // The empty frozenset is a singleton + if (emptyfrozenset == NULL) { + emptyfrozenset = make_new_set((PyTypeObject *)type, NULL); } - /* The empty frozenset is a singleton */ - if (emptyfrozenset == NULL) - emptyfrozenset = make_new_set(type, NULL); Py_XINCREF(emptyfrozenset); return emptyfrozenset; } +static PyObject * +frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + PyObject *iterable = NULL; + + if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset", kwds)) { + return NULL; + } + + if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable)) { + return NULL; + } + + return make_new_frozenset(type, iterable); +} + +static PyObject * +frozenset_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + if (!_PyArg_NoKwnames("frozenset", kwnames)) { + return NULL; + } + + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("frozenset", nargs, 0, 1)) { + return NULL; + } + + PyObject *iterable = (nargs ? args[0] : NULL); + return make_new_frozenset((PyTypeObject *)type, iterable); +} + static PyObject * set_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { @@ -1463,9 +1408,25 @@ set_difference_update_internal(PySetObject *so, PyObject *other) setentry *entry; Py_ssize_t pos = 0; + /* Optimization: When the other set is more than 8 times + larger than the base set, replace the other set with + interesection of the two sets. + */ + if ((PySet_GET_SIZE(other) >> 3) > PySet_GET_SIZE(so)) { + other = set_intersection(so, other); + if (other == NULL) + return -1; + } else { + Py_INCREF(other); + } + while (set_next((PySetObject *)other, &pos, &entry)) - if (set_discard_entry(so, entry->key, entry->hash) < 0) + if (set_discard_entry(so, entry->key, entry->hash) < 0) { + Py_DECREF(other); return -1; + } + + Py_DECREF(other); } else { PyObject *key, *it; it = PyObject_GetIter(other); @@ -1998,6 +1959,28 @@ set_init(PySetObject *self, PyObject *args, PyObject *kwds) return set_update_internal(self, iterable); } +static PyObject* +set_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + assert(PyType_Check(type)); + + if (!_PyArg_NoKwnames("set", kwnames)) { + return NULL; + } + + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("set", nargs, 0, 1)) { + return NULL; + } + + if (nargs) { + return make_new_set((PyTypeObject *)type, args[0]); + } + + return make_new_set((PyTypeObject *)type, NULL); +} + static PySequenceMethods set_as_sequence = { set_len, /* sq_length */ 0, /* sq_concat */ @@ -2063,6 +2046,7 @@ static PyMethodDef set_methods[] = { union_doc}, {"update", (PyCFunction)set_update, METH_VARARGS, update_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -2146,6 +2130,7 @@ PyTypeObject PySet_Type = { PyType_GenericAlloc, /* tp_alloc */ set_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ + .tp_vectorcall = set_vectorcall, }; /* frozenset object ********************************************************/ @@ -2174,6 +2159,7 @@ static PyMethodDef frozenset_methods[] = { symmetric_difference_doc}, {"union", (PyCFunction)set_union, METH_VARARGS, union_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -2244,6 +2230,7 @@ PyTypeObject PyFrozenSet_Type = { PyType_GenericAlloc, /* tp_alloc */ frozenset_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ + .tp_vectorcall = frozenset_vectorcall, }; @@ -2312,14 +2299,8 @@ PySet_Add(PyObject *anyset, PyObject *key) return set_add_key((PySetObject *)anyset, key); } -int -PySet_ClearFreeList(void) -{ - return 0; -} - void -PySet_Fini(void) +_PySet_Fini(void) { Py_CLEAR(emptyfrozenset); } @@ -2513,7 +2494,7 @@ dummy_repr(PyObject *op) return PyUnicode_FromString(""); } -static void +static void _Py_NO_RETURN dummy_dealloc(PyObject* ignore) { Py_FatalError("deallocating "); diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 7c10eb6f..391711f7 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -14,10 +14,9 @@ this type and there is exactly one in existence. */ #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef static PyObject * ellipsis_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) @@ -100,7 +99,8 @@ PyObject _Py_EllipsisObject = { * created and then deleted again */ static PySliceObject *slice_cache = NULL; -void PySlice_Fini(void) + +void _PySlice_Fini(void) { PySliceObject *obj = slice_cache; if (obj != NULL) { @@ -353,7 +353,7 @@ static PyMemberDef slice_members[] = { static PyObject* evaluate_slice_index(PyObject *v) { - if (PyIndex_Check(v)) { + if (_PyIndex_Check(v)) { return PyNumber_Index(v); } else { diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h index 8f836144..e69a2c07 100644 --- a/Objects/stringlib/asciilib.h +++ b/Objects/stringlib/asciilib.h @@ -24,6 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ascii_InsertThousandsGrouping - diff --git a/Objects/stringlib/codecs.h b/Objects/stringlib/codecs.h index 269a5581..9b2a29ba 100644 --- a/Objects/stringlib/codecs.h +++ b/Objects/stringlib/codecs.h @@ -4,6 +4,8 @@ # error "codecs.h is specific to Unicode" #endif +#include "pycore_byteswap.h" // _Py_bswap32() + /* Mask to quickly check whether a C 'long' contains a non-ASCII, UTF8-encoded char. */ #if (SIZEOF_LONG == 8) @@ -153,7 +155,7 @@ STRINGLIB(utf8_decode)(const char **inptr, const char *end, /* Decoding UTF-8 sequences in range \xED\xA0\x80-\xED\xBF\xBF will result in surrogates in range D800-DFFF. Surrogates are not valid UTF-8 so they are rejected. - See http://www.unicode.org/versions/Unicode5.2.0/ch03.pdf + See https://www.unicode.org/versions/Unicode5.2.0/ch03.pdf (table 3-7) and http://www.rfc-editor.org/rfc/rfc3629.txt */ goto InvalidContinuation1; } @@ -256,9 +258,10 @@ InvalidContinuation3: /* UTF-8 encoder specialized for a Unicode kind to avoid the slow PyUnicode_READ() macro. Delete some parts of the code depending on the kind: UCS-1 strings don't need to handle surrogates for example. */ -Py_LOCAL_INLINE(PyObject *) -STRINGLIB(utf8_encoder)(PyObject *unicode, - STRINGLIB_CHAR *data, +Py_LOCAL_INLINE(char *) +STRINGLIB(utf8_encoder)(_PyBytesWriter *writer, + PyObject *unicode, + const STRINGLIB_CHAR *data, Py_ssize_t size, _Py_error_handler error_handler, const char *errors) @@ -277,17 +280,16 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, #else /* STRINGLIB_SIZEOF_CHAR == 4 */ const Py_ssize_t max_char_size = 4; #endif - _PyBytesWriter writer; assert(size >= 0); - _PyBytesWriter_Init(&writer); - if (size > PY_SSIZE_T_MAX / max_char_size) { /* integer overflow */ - return PyErr_NoMemory(); + PyErr_NoMemory(); + return NULL; } - p = _PyBytesWriter_Alloc(&writer, size * max_char_size); + _PyBytesWriter_Init(writer); + p = _PyBytesWriter_Alloc(writer, size * max_char_size); if (p == NULL) return NULL; @@ -323,7 +325,7 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, endpos++; /* Only overallocate the buffer if it's not the last write */ - writer.overallocate = (endpos < size); + writer->overallocate = (endpos < size); switch (error_handler) { @@ -347,8 +349,8 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, case _Py_ERROR_BACKSLASHREPLACE: /* subtract preallocated bytes */ - writer.min_size -= max_char_size * (endpos - startpos); - p = backslashreplace(&writer, p, + writer->min_size -= max_char_size * (endpos - startpos); + p = backslashreplace(writer, p, unicode, startpos, endpos); if (p == NULL) goto error; @@ -357,8 +359,8 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, case _Py_ERROR_XMLCHARREFREPLACE: /* subtract preallocated bytes */ - writer.min_size -= max_char_size * (endpos - startpos); - p = xmlcharrefreplace(&writer, p, + writer->min_size -= max_char_size * (endpos - startpos); + p = xmlcharrefreplace(writer, p, unicode, startpos, endpos); if (p == NULL) goto error; @@ -387,10 +389,10 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, goto error; /* subtract preallocated bytes */ - writer.min_size -= max_char_size * (newpos - startpos); + writer->min_size -= max_char_size * (newpos - startpos); if (PyBytes_Check(rep)) { - p = _PyBytesWriter_WriteBytes(&writer, p, + p = _PyBytesWriter_WriteBytes(writer, p, PyBytes_AS_STRING(rep), PyBytes_GET_SIZE(rep)); } @@ -406,7 +408,7 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, goto error; } - p = _PyBytesWriter_WriteBytes(&writer, p, + p = _PyBytesWriter_WriteBytes(writer, p, PyUnicode_DATA(rep), PyUnicode_GET_LENGTH(rep)); } @@ -420,7 +422,7 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, /* If overallocation was disabled, ensure that it was the last write. Otherwise, we missed an optimization */ - assert(writer.overallocate || i == size); + assert(writer->overallocate || i == size); } else #if STRINGLIB_SIZEOF_CHAR > 2 @@ -449,14 +451,13 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, Py_XDECREF(error_handler_obj); Py_XDECREF(exc); #endif - return _PyBytesWriter_Finish(&writer, p); + return p; #if STRINGLIB_SIZEOF_CHAR > 1 error: Py_XDECREF(rep); Py_XDECREF(error_handler_obj); Py_XDECREF(exc); - _PyBytesWriter_Dealloc(&writer); return NULL; #endif } @@ -733,24 +734,28 @@ STRINGLIB(utf16_encode)(const STRINGLIB_CHAR *in, #endif } +static inline uint32_t +STRINGLIB(SWAB4)(STRINGLIB_CHAR ch) +{ + uint32_t word = ch; #if STRINGLIB_SIZEOF_CHAR == 1 -# define SWAB4(CH, tmp) ((CH) << 24) /* high bytes are zero */ + /* high bytes are zero */ + return (word << 24); #elif STRINGLIB_SIZEOF_CHAR == 2 -# define SWAB4(CH, tmp) (tmp = (CH), \ - ((tmp & 0x00FFu) << 24) + ((tmp & 0xFF00u) << 8)) - /* high bytes are zero */ + /* high bytes are zero */ + return ((word & 0x00FFu) << 24) | ((word & 0xFF00u) << 8); #else -# define SWAB4(CH, tmp) (tmp = (CH), \ - tmp = ((tmp & 0x00FF00FFu) << 8) + ((tmp >> 8) & 0x00FF00FFu), \ - ((tmp & 0x0000FFFFu) << 16) + ((tmp >> 16) & 0x0000FFFFu)) + return _Py_bswap32(word); #endif +} + Py_LOCAL_INLINE(Py_ssize_t) STRINGLIB(utf32_encode)(const STRINGLIB_CHAR *in, Py_ssize_t len, - PY_UINT32_T **outptr, + uint32_t **outptr, int native_ordering) { - PY_UINT32_T *out = *outptr; + uint32_t *out = *outptr; const STRINGLIB_CHAR *end = in + len; if (native_ordering) { const STRINGLIB_CHAR *unrolled_end = in + _Py_SIZE_ROUND_DOWN(len, 4); @@ -784,7 +789,6 @@ STRINGLIB(utf32_encode)(const STRINGLIB_CHAR *in, const STRINGLIB_CHAR *unrolled_end = in + _Py_SIZE_ROUND_DOWN(len, 4); while (in < unrolled_end) { #if STRINGLIB_SIZEOF_CHAR > 1 - Py_UCS4 ch1, ch2, ch3, ch4; /* check if any character is a surrogate character */ if (((in[0] ^ 0xd800) & (in[1] ^ 0xd800) & @@ -792,10 +796,10 @@ STRINGLIB(utf32_encode)(const STRINGLIB_CHAR *in, (in[3] ^ 0xd800) & 0xf800) == 0) break; #endif - out[0] = SWAB4(in[0], ch1); - out[1] = SWAB4(in[1], ch2); - out[2] = SWAB4(in[2], ch3); - out[3] = SWAB4(in[3], ch4); + out[0] = STRINGLIB(SWAB4)(in[0]); + out[1] = STRINGLIB(SWAB4)(in[1]); + out[2] = STRINGLIB(SWAB4)(in[2]); + out[3] = STRINGLIB(SWAB4)(in[3]); in += 4; out += 4; } while (in < end) { @@ -806,7 +810,7 @@ STRINGLIB(utf32_encode)(const STRINGLIB_CHAR *in, goto fail; } #endif - *out++ = SWAB4(ch, ch); + *out++ = STRINGLIB(SWAB4)(ch); } } *outptr = out; @@ -817,6 +821,5 @@ STRINGLIB(utf32_encode)(const STRINGLIB_CHAR *in, return len - (end - in + 1); #endif } -#undef SWAB4 #endif diff --git a/Objects/stringlib/ctype.h b/Objects/stringlib/ctype.h index 843cfa22..9b319b07 100644 --- a/Objects/stringlib/ctype.h +++ b/Objects/stringlib/ctype.h @@ -2,7 +2,7 @@ # error "ctype.h only compatible with byte-wise strings" #endif -#include "bytes_methods.h" +#include "pycore_bytes_methods.h" static PyObject* stringlib_isspace(PyObject *self, PyObject *Py_UNUSED(ignored)) diff --git a/Objects/stringlib/eq.h b/Objects/stringlib/eq.h index ff22f913..9c1058b8 100644 --- a/Objects/stringlib/eq.h +++ b/Objects/stringlib/eq.h @@ -6,13 +6,14 @@ Py_LOCAL_INLINE(int) unicode_eq(PyObject *aa, PyObject *bb) { + assert(PyUnicode_Check(aa)); + assert(PyUnicode_Check(bb)); + assert(PyUnicode_IS_READY(aa)); + assert(PyUnicode_IS_READY(bb)); + PyUnicodeObject *a = (PyUnicodeObject *)aa; PyUnicodeObject *b = (PyUnicodeObject *)bb; - if (PyUnicode_READY(a) == -1 || PyUnicode_READY(b) == -1) { - Py_UNREACHABLE(); - } - if (PyUnicode_GET_LENGTH(a) != PyUnicode_GET_LENGTH(b)) return 0; if (PyUnicode_GET_LENGTH(a) == 0) diff --git a/Objects/stringlib/join.h b/Objects/stringlib/join.h index 6f314e15..53bcbdea 100644 --- a/Objects/stringlib/join.h +++ b/Objects/stringlib/join.h @@ -7,8 +7,8 @@ Py_LOCAL_INLINE(PyObject *) STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) { - char *sepstr = STRINGLIB_STR(sep); - const Py_ssize_t seplen = STRINGLIB_LEN(sep); + const char *sepstr = STRINGLIB_STR(sep); + Py_ssize_t seplen = STRINGLIB_LEN(sep); PyObject *res = NULL; char *p; Py_ssize_t seqlen = 0; @@ -18,6 +18,9 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) Py_buffer *buffers = NULL; #define NB_STATIC_BUFFERS 10 Py_buffer static_buffers[NB_STATIC_BUFFERS]; +#define GIL_THRESHOLD 1048576 + int drop_gil = 1; + PyThreadState *save = NULL; seq = PySequence_Fast(iterable, "can only join an iterable"); if (seq == NULL) { @@ -65,12 +68,21 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) buffers[i].buf = PyBytes_AS_STRING(item); buffers[i].len = PyBytes_GET_SIZE(item); } - else if (PyObject_GetBuffer(item, &buffers[i], PyBUF_SIMPLE) != 0) { - PyErr_Format(PyExc_TypeError, - "sequence item %zd: expected a bytes-like object, " - "%.80s found", - i, Py_TYPE(item)->tp_name); - goto error; + else { + if (PyObject_GetBuffer(item, &buffers[i], PyBUF_SIMPLE) != 0) { + PyErr_Format(PyExc_TypeError, + "sequence item %zd: expected a bytes-like object, " + "%.80s found", + i, Py_TYPE(item)->tp_name); + goto error; + } + /* If the backing objects are mutable, then dropping the GIL + * opens up race conditions where another thread tries to modify + * the object which we hold a buffer on it. Such code has data + * races anyway, but this is a conservative approach that avoids + * changing the behaviour of that data race. + */ + drop_gil = 0; } nbufs = i + 1; /* for error cleanup */ itemlen = buffers[i].len; @@ -102,6 +114,12 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) /* Catenate everything. */ p = STRINGLIB_STR(res); + if (sz < GIL_THRESHOLD) { + drop_gil = 0; /* Benefits are likely outweighed by the overheads */ + } + if (drop_gil) { + save = PyEval_SaveThread(); + } if (!seplen) { /* fast path */ for (i = 0; i < nbufs; i++) { @@ -110,19 +128,23 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) memcpy(p, q, n); p += n; } - goto done; } - for (i = 0; i < nbufs; i++) { - Py_ssize_t n; - char *q; - if (i) { - memcpy(p, sepstr, seplen); - p += seplen; + else { + for (i = 0; i < nbufs; i++) { + Py_ssize_t n; + char *q; + if (i) { + memcpy(p, sepstr, seplen); + p += seplen; + } + n = buffers[i].len; + q = buffers[i].buf; + memcpy(p, q, n); + p += n; } - n = buffers[i].len; - q = buffers[i].buf; - memcpy(p, q, n); - p += n; + } + if (drop_gil) { + PyEval_RestoreThread(save); } goto done; @@ -138,3 +160,4 @@ done: } #undef NB_STATIC_BUFFERS +#undef GIL_THRESHOLD diff --git a/Objects/stringlib/split.h b/Objects/stringlib/split.h index 31f77a77..068047f9 100644 --- a/Objects/stringlib/split.h +++ b/Objects/stringlib/split.h @@ -48,7 +48,7 @@ /* Always force the list to the expected size. */ -#define FIX_PREALLOC_SIZE(list) Py_SIZE(list) = count +#define FIX_PREALLOC_SIZE(list) Py_SET_SIZE(list, count) Py_LOCAL_INLINE(PyObject *) STRINGLIB(split_whitespace)(PyObject* str_obj, diff --git a/Objects/stringlib/transmogrify.h b/Objects/stringlib/transmogrify.h index 9506019d..e1165ea3 100644 --- a/Objects/stringlib/transmogrify.h +++ b/Objects/stringlib/transmogrify.h @@ -680,9 +680,13 @@ stringlib_replace(PyObject *self, const char *to_s, Py_ssize_t to_len, Py_ssize_t maxcount) { + if (STRINGLIB_LEN(self) < from_len) { + /* nothing to do; return the original bytes */ + return return_self(self); + } if (maxcount < 0) { maxcount = PY_SSIZE_T_MAX; - } else if (maxcount == 0 || STRINGLIB_LEN(self) == 0) { + } else if (maxcount == 0) { /* nothing to do; return the original bytes */ return return_self(self); } @@ -699,13 +703,6 @@ stringlib_replace(PyObject *self, return stringlib_replace_interleave(self, to_s, to_len, maxcount); } - /* Except for b"".replace(b"", b"A") == b"A" there is no way beyond this */ - /* point for an empty self bytes to generate a non-empty bytes */ - /* Special case so the remaining code always gets a non-empty bytes */ - if (STRINGLIB_LEN(self) == 0) { - return return_self(self); - } - if (to_len == 0) { /* delete all occurrences of 'from' bytes */ if (from_len == 1) { diff --git a/Objects/stringlib/ucs1lib.h b/Objects/stringlib/ucs1lib.h index ce1eb57f..bc4b104f 100644 --- a/Objects/stringlib/ucs1lib.h +++ b/Objects/stringlib/ucs1lib.h @@ -24,7 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ucs1_InsertThousandsGrouping - - diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h index f900cb65..86a1dff1 100644 --- a/Objects/stringlib/ucs2lib.h +++ b/Objects/stringlib/ucs2lib.h @@ -24,6 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ucs2_InsertThousandsGrouping - diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h index 86a480f1..3c32a93c 100644 --- a/Objects/stringlib/ucs4lib.h +++ b/Objects/stringlib/ucs4lib.h @@ -25,5 +25,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII -#define _Py_InsertThousandsGrouping _PyUnicode_ucs4_InsertThousandsGrouping - diff --git a/Objects/stringlib/undef.h b/Objects/stringlib/undef.h index f9d3f1d3..c41e254f 100644 --- a/Objects/stringlib/undef.h +++ b/Objects/stringlib/undef.h @@ -6,6 +6,5 @@ #undef STRINGLIB_STR #undef STRINGLIB_LEN #undef STRINGLIB_NEW -#undef _Py_InsertThousandsGrouping #undef STRINGLIB_IS_UNICODE diff --git a/Objects/stringlib/unicode_format.h b/Objects/stringlib/unicode_format.h index ddf1e264..b526ad21 100644 --- a/Objects/stringlib/unicode_format.h +++ b/Objects/stringlib/unicode_format.h @@ -828,7 +828,7 @@ output_markup(SubString *field_name, SubString *format_spec, tmp = NULL; } - /* if needed, recurively compute the format_spec */ + /* if needed, recursively compute the format_spec */ if (format_spec_needs_expanding) { tmp = build_string(format_spec, args, kwargs, recursion_depth-1, auto_number); diff --git a/Objects/structseq.c b/Objects/structseq.c index c158afcc..b17b1f99 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -10,7 +10,7 @@ #include "Python.h" #include "pycore_tupleobject.h" #include "pycore_object.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef static const char visible_length_key[] = "n_sequence_fields"; static const char real_length_key[] = "n_fields"; @@ -18,7 +18,7 @@ static const char unnamed_fields_key[] = "n_unnamed_fields"; /* Fields with this name have only a field index, not a field name. They are only allowed for indices < n_visible_fields. */ -char *PyStructSequence_UnnamedField = "unnamed field"; +const char * const PyStructSequence_UnnamedField = "unnamed field"; _Py_IDENTIFIER(n_sequence_fields); _Py_IDENTIFIER(n_fields); _Py_IDENTIFIER(n_unnamed_fields); @@ -47,7 +47,7 @@ PyStructSequence_New(PyTypeObject *type) return NULL; /* Hack the size of the variable object, so invisible fields don't appear to Python code. */ - Py_SIZE(obj) = VISIBLE_SIZE_TP(type); + Py_SET_SIZE(obj, VISIBLE_SIZE_TP(type)); for (i = 0; i < size; i++) obj->ob_item[i] = NULL; @@ -70,6 +70,9 @@ PyStructSequence_GetItem(PyObject* op, Py_ssize_t i) static int structseq_traverse(PyStructSequence *obj, visitproc visit, void *arg) { + if (Py_TYPE(obj)->tp_flags & Py_TPFLAGS_HEAPTYPE) { + Py_VISIT(Py_TYPE(obj)); + } Py_ssize_t i, size; size = REAL_SIZE(obj); for (i = 0; i < size; ++i) { diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index bd580946..9092c9f8 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -2,9 +2,10 @@ /* Tuple object implementation */ #include "Python.h" -#include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_accu.h" +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_object.h" /*[clinic input] class tuple "PyTupleObject *" "&PyTuple_Type" @@ -28,36 +29,12 @@ class tuple "PyTupleObject *" "&PyTuple_Type" static PyTupleObject *free_list[PyTuple_MAXSAVESIZE]; static int numfree[PyTuple_MAXSAVESIZE]; #endif -#ifdef COUNT_ALLOCS -Py_ssize_t _Py_fast_tuple_allocs; -Py_ssize_t _Py_tuple_zero_allocs; -#endif - -/* Debug statistic to count GC tracking of tuples. - Please note that tuples are only untracked when considered by the GC, and - many of them will be dead before. Therefore, a tracking rate close to 100% - does not necessarily prove that the heuristic is inefficient. -*/ -#ifdef SHOW_TRACK_COUNT -static Py_ssize_t count_untracked = 0; -static Py_ssize_t count_tracked = 0; -static void -show_track(void) +static inline void +tuple_gc_track(PyTupleObject *op) { - PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->config.show_alloc_count) { - return; - } - - fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n", - count_tracked + count_untracked); - fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T - "d\n", count_tracked); - fprintf(stderr, "%.2f%% tuple tracking rate\n\n", - (100.0*count_tracked/(count_untracked+count_tracked))); + _PyObject_GC_TRACK(op); } -#endif /* Print summary info about the state of the optimized allocator */ void @@ -76,30 +53,27 @@ _PyTuple_DebugMallocStats(FILE *out) #endif } -PyObject * -PyTuple_New(Py_ssize_t size) +/* Allocate an uninitialized tuple object. Before making it public following + steps must be done: + - initialize its items + - call tuple_gc_track() on it + Because the empty tuple is always reused and it's already tracked by GC, + this function must not be called with size == 0 (unless from PyTuple_New() + which wraps this function). +*/ +static PyTupleObject * +tuple_alloc(Py_ssize_t size) { PyTupleObject *op; - Py_ssize_t i; if (size < 0) { PyErr_BadInternalCall(); return NULL; } #if PyTuple_MAXSAVESIZE > 0 - if (size == 0 && free_list[0]) { - op = free_list[0]; - Py_INCREF(op); -#ifdef COUNT_ALLOCS - _Py_tuple_zero_allocs++; -#endif - return (PyObject *) op; - } if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) { + assert(size != 0); free_list[size] = (PyTupleObject *) op->ob_item[0]; numfree[size]--; -#ifdef COUNT_ALLOCS - _Py_fast_tuple_allocs++; -#endif /* Inline PyObject_InitVar */ #ifdef Py_TRACE_REFS Py_SIZE(op) = size; @@ -111,16 +85,35 @@ PyTuple_New(Py_ssize_t size) #endif { /* Check for overflow */ - if ((size_t)size > ((size_t)PY_SSIZE_T_MAX - sizeof(PyTupleObject) - - sizeof(PyObject *)) / sizeof(PyObject *)) { - return PyErr_NoMemory(); + if ((size_t)size > ((size_t)PY_SSIZE_T_MAX - (sizeof(PyTupleObject) - + sizeof(PyObject *))) / sizeof(PyObject *)) { + return (PyTupleObject *)PyErr_NoMemory(); } op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size); if (op == NULL) return NULL; } - for (i=0; i < size; i++) + return op; +} + +PyObject * +PyTuple_New(Py_ssize_t size) +{ + PyTupleObject *op; +#if PyTuple_MAXSAVESIZE > 0 + if (size == 0 && free_list[0]) { + op = free_list[0]; + Py_INCREF(op); + return (PyObject *) op; + } +#endif + op = tuple_alloc(size); + if (op == NULL) { + return NULL; + } + for (Py_ssize_t i = 0; i < size; i++) { op->ob_item[i] = NULL; + } #if PyTuple_MAXSAVESIZE > 0 if (size == 0) { free_list[0] = op; @@ -128,10 +121,7 @@ PyTuple_New(Py_ssize_t size) Py_INCREF(op); /* extra INCREF so that this is never freed */ } #endif -#ifdef SHOW_TRACK_COUNT - count_tracked++; -#endif - _PyObject_GC_TRACK(op); + tuple_gc_track(op); return (PyObject *) op; } @@ -164,7 +154,7 @@ int PyTuple_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem) { PyObject **p; - if (!PyTuple_Check(op) || op->ob_refcnt != 1) { + if (!PyTuple_Check(op) || Py_REFCNT(op) != 1) { Py_XDECREF(newitem); PyErr_BadInternalCall(); return -1; @@ -199,10 +189,6 @@ _PyTuple_MaybeUntrack(PyObject *op) _PyObject_GC_MAY_BE_TRACKED(elt)) return; } -#ifdef SHOW_TRACK_COUNT - count_tracked--; - count_untracked++; -#endif _PyObject_GC_UNTRACK(op); } @@ -211,24 +197,28 @@ PyTuple_Pack(Py_ssize_t n, ...) { Py_ssize_t i; PyObject *o; - PyObject *result; PyObject **items; va_list vargs; + if (n == 0) { + return PyTuple_New(0); + } + va_start(vargs, n); - result = PyTuple_New(n); + PyTupleObject *result = tuple_alloc(n); if (result == NULL) { va_end(vargs); return NULL; } - items = ((PyTupleObject *)result)->ob_item; + items = result->ob_item; for (i = 0; i < n; i++) { o = va_arg(vargs, PyObject *); Py_INCREF(o); items[i] = o; } va_end(vargs); - return result; + tuple_gc_track(result); + return (PyObject *)result; } @@ -248,7 +238,7 @@ tupledealloc(PyTupleObject *op) #if PyTuple_MAXSAVESIZE > 0 if (len < PyTuple_MAXSAVESIZE && numfree[len] < PyTuple_MAXFREELIST && - Py_TYPE(op) == &PyTuple_Type) + Py_IS_TYPE(op, &PyTuple_Type)) { op->ob_item[0] = (PyObject *) free_list[len]; numfree[len]++; @@ -258,7 +248,9 @@ tupledealloc(PyTupleObject *op) #endif } Py_TYPE(op)->tp_free((PyObject *)op); +#if PyTuple_MAXSAVESIZE > 0 done: +#endif Py_TRASHCAN_END } @@ -403,8 +395,7 @@ tuplecontains(PyTupleObject *a, PyObject *el) int cmp; for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) - cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i), - Py_EQ); + cmp = PyObject_RichCompareBool(PyTuple_GET_ITEM(a, i), el, Py_EQ); return cmp; } @@ -422,7 +413,11 @@ tupleitem(PyTupleObject *a, Py_ssize_t i) PyObject * _PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) { - PyTupleObject *tuple = (PyTupleObject *)PyTuple_New(n); + if (n == 0) { + return PyTuple_New(0); + } + + PyTupleObject *tuple = tuple_alloc(n); if (tuple == NULL) { return NULL; } @@ -432,6 +427,7 @@ _PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) Py_INCREF(item); dst[i] = item; } + tuple_gc_track(tuple); return (PyObject *)tuple; } @@ -487,7 +483,11 @@ tupleconcat(PyTupleObject *a, PyObject *bb) if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) return PyErr_NoMemory(); size = Py_SIZE(a) + Py_SIZE(b); - np = (PyTupleObject *) PyTuple_New(size); + if (size == 0) { + return PyTuple_New(0); + } + + np = tuple_alloc(size); if (np == NULL) { return NULL; } @@ -505,6 +505,7 @@ tupleconcat(PyTupleObject *a, PyObject *bb) Py_INCREF(v); dest[i] = v; } + tuple_gc_track(np); return (PyObject *)np; #undef b } @@ -516,8 +517,6 @@ tuplerepeat(PyTupleObject *a, Py_ssize_t n) Py_ssize_t size; PyTupleObject *np; PyObject **p, **items; - if (n < 0) - n = 0; if (Py_SIZE(a) == 0 || n == 1) { if (PyTuple_CheckExact(a)) { /* Since tuples are immutable, we can return a shared @@ -525,13 +524,14 @@ tuplerepeat(PyTupleObject *a, Py_ssize_t n) Py_INCREF(a); return (PyObject *)a; } - if (Py_SIZE(a) == 0) - return PyTuple_New(0); + } + if (Py_SIZE(a) == 0 || n <= 0) { + return PyTuple_New(0); } if (n > PY_SSIZE_T_MAX / Py_SIZE(a)) return PyErr_NoMemory(); size = Py_SIZE(a) * n; - np = (PyTupleObject *) PyTuple_New(size); + np = tuple_alloc(size); if (np == NULL) return NULL; p = np->ob_item; @@ -543,6 +543,7 @@ tuplerepeat(PyTupleObject *a, Py_ssize_t n) p++; } } + tuple_gc_track(np); return (PyObject *) np; } @@ -707,6 +708,25 @@ tuple_new_impl(PyTypeObject *type, PyObject *iterable) return PySequence_Tuple(iterable); } +static PyObject * +tuple_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + if (!_PyArg_NoKwnames("tuple", kwnames)) { + return NULL; + } + + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("tuple", nargs, 0, 1)) { + return NULL; + } + + if (nargs) { + return tuple_new_impl((PyTypeObject *)type, args[0]); + } + return PyTuple_New(0); +} + static PyObject * tuple_subtype_new(PyTypeObject *type, PyObject *iterable) { @@ -746,7 +766,7 @@ static PySequenceMethods tuple_as_sequence = { static PyObject* tuplesubscript(PyTupleObject* self, PyObject* item) { - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; @@ -757,7 +777,6 @@ tuplesubscript(PyTupleObject* self, PyObject* item) else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength, i; size_t cur; - PyObject* result; PyObject* it; PyObject **src, **dest; @@ -777,11 +796,11 @@ tuplesubscript(PyTupleObject* self, PyObject* item) return (PyObject *)self; } else { - result = PyTuple_New(slicelength); + PyTupleObject* result = tuple_alloc(slicelength); if (!result) return NULL; src = self->ob_item; - dest = ((PyTupleObject *)result)->ob_item; + dest = result->ob_item; for (cur = start, i = 0; i < slicelength; cur += step, i++) { it = src[cur]; @@ -789,7 +808,8 @@ tuplesubscript(PyTupleObject* self, PyObject* item) dest[i] = it; } - return result; + tuple_gc_track(result); + return (PyObject *)result; } } else { @@ -815,6 +835,7 @@ static PyMethodDef tuple_methods[] = { TUPLE___GETNEWARGS___METHODDEF TUPLE_INDEX_METHODDEF TUPLE_COUNT_METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -867,6 +888,7 @@ PyTypeObject PyTuple_Type = { 0, /* tp_alloc */ tuple_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ + .tp_vectorcall = tuple_vectorcall, }; /* The following function breaks the notion that tuples are immutable: @@ -885,7 +907,7 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) Py_ssize_t oldsize; v = (PyTupleObject *) *pv; - if (v == NULL || Py_TYPE(v) != &PyTuple_Type || + if (v == NULL || !Py_IS_TYPE(v, &PyTuple_Type) || (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) { *pv = 0; Py_XDECREF(v); @@ -906,10 +928,15 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) } /* XXX UNREF/NEWREF interface should be more symmetrical */ - _Py_DEC_REFTOTAL; - if (_PyObject_GC_IS_TRACKED(v)) +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif + if (_PyObject_GC_IS_TRACKED(v)) { _PyObject_GC_UNTRACK(v); + } +#ifdef Py_TRACE_REFS _Py_ForgetReference((PyObject *) v); +#endif /* DECREF items deleted by shrinkage */ for (i = newsize; i < oldsize; i++) { Py_CLEAR(v->ob_item[i]); @@ -930,40 +957,33 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) return 0; } -int -PyTuple_ClearFreeList(void) +void +_PyTuple_ClearFreeList(void) { - int freelist_size = 0; #if PyTuple_MAXSAVESIZE > 0 - int i; - for (i = 1; i < PyTuple_MAXSAVESIZE; i++) { - PyTupleObject *p, *q; - p = free_list[i]; - freelist_size += numfree[i]; + for (Py_ssize_t i = 1; i < PyTuple_MAXSAVESIZE; i++) { + PyTupleObject *p = free_list[i]; free_list[i] = NULL; numfree[i] = 0; while (p) { - q = p; + PyTupleObject *q = p; p = (PyTupleObject *)(p->ob_item[0]); PyObject_GC_Del(q); } } + // the empty tuple singleton is only cleared by _PyTuple_Fini() #endif - return freelist_size; } void -PyTuple_Fini(void) +_PyTuple_Fini(void) { #if PyTuple_MAXSAVESIZE > 0 /* empty tuples are used all over the place and applications may * rely on the fact that an empty tuple is a singleton. */ Py_CLEAR(free_list[0]); - (void)PyTuple_ClearFreeList(); -#endif -#ifdef SHOW_TRACK_COUNT - show_track(); + _PyTuple_ClearFreeList(); #endif } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 0acde714..f65434fd 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1,10 +1,13 @@ /* Type object implementation */ #include "Python.h" +#include "pycore_call.h" +#include "pycore_initconfig.h" #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "frameobject.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include @@ -16,6 +19,9 @@ class object "PyObject *" "&PyBaseObject_Type" #include "clinic/typeobject.c.h" +#define MCACHE + +#ifdef MCACHE /* Support type attribute cache */ /* The cache can keep references to the names alive for longer than @@ -44,6 +50,7 @@ struct method_cache_entry { static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP]; static unsigned int next_version_tag = 0; +#endif #define MCACHE_STATS 0 @@ -53,6 +60,8 @@ static size_t method_cache_misses = 0; static size_t method_cache_collisions = 0; #endif +#define INTERN_NAME_STRINGS + /* alphabetical order */ _Py_IDENTIFIER(__abstractmethods__); _Py_IDENTIFIER(__class__); @@ -71,6 +80,7 @@ _Py_IDENTIFIER(__new__); _Py_IDENTIFIER(__set_name__); _Py_IDENTIFIER(__setitem__); _Py_IDENTIFIER(builtins); +_Py_IDENTIFIER(mro); static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); @@ -210,6 +220,7 @@ _PyType_GetTextSignatureFromInternalDoc(const char *name, const char *internal_d unsigned int PyType_ClearCache(void) { +#ifdef MCACHE Py_ssize_t i; unsigned int cur_version_tag = next_version_tag - 1; @@ -234,6 +245,9 @@ PyType_ClearCache(void) /* mark all version tags as invalid */ PyType_Modified(&PyBaseObject_Type); return cur_version_tag; +#else + return 0; +#endif } void @@ -268,7 +282,7 @@ PyType_Modified(PyTypeObject *type) PyObject *raw, *ref; Py_ssize_t i; - if (!PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) + if (!_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) return; raw = type->tp_subclasses; @@ -301,16 +315,15 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { each subclass when their mro is recursively updated. */ Py_ssize_t i, n; - int custom = (Py_TYPE(type) != &PyType_Type); + int custom = !Py_IS_TYPE(type, &PyType_Type); int unbound; PyObject *mro_meth = NULL; PyObject *type_mro_meth = NULL; - if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) + if (!_PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) return; if (custom) { - _Py_IDENTIFIER(mro); mro_meth = lookup_maybe_method( (PyObject *)type, &PyId_mro, &unbound); if (mro_meth == NULL) @@ -332,7 +345,7 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { assert(PyType_Check(b)); cls = (PyTypeObject *)b; - if (!PyType_HasFeature(cls, Py_TPFLAGS_HAVE_VERSION_TAG) || + if (!_PyType_HasFeature(cls, Py_TPFLAGS_HAVE_VERSION_TAG) || !PyType_IsSubtype(type, cls)) { goto clear; } @@ -345,6 +358,7 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { Py_TPFLAGS_VALID_VERSION_TAG); } +#ifdef MCACHE static int assign_version_tag(PyTypeObject *type) { @@ -356,11 +370,11 @@ assign_version_tag(PyTypeObject *type) Py_ssize_t i, n; PyObject *bases; - if (PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) + if (_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) return 1; - if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) + if (!_PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) return 0; - if (!PyType_HasFeature(type, Py_TPFLAGS_READY)) + if (!_PyType_HasFeature(type, Py_TPFLAGS_READY)) return 0; type->tp_version_tag = next_version_tag++; @@ -391,6 +405,7 @@ assign_version_tag(PyTypeObject *type) type->tp_flags |= Py_TPFLAGS_VALID_VERSION_TAG; return 1; } +#endif static PyMemberDef type_members[] = { @@ -431,6 +446,7 @@ check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *nam const char * _PyType_Name(PyTypeObject *type) { + assert(type->tp_name != NULL); const char *s = strrchr(type->tp_name, '.'); if (s == NULL) { s = type->tp_name; @@ -956,34 +972,50 @@ static PyObject * type_call(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *obj; - - if (type->tp_new == NULL) { - PyErr_Format(PyExc_TypeError, - "cannot create '%.100s' instances", - type->tp_name); - return NULL; - } + PyThreadState *tstate = _PyThreadState_GET(); #ifdef Py_DEBUG /* type_call() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); #endif + /* Special case: type(x) should return Py_TYPE(x) */ + /* We only want type itself to accept the one-argument form (#27157) */ + if (type == &PyType_Type) { + assert(args != NULL && PyTuple_Check(args)); + assert(kwds == NULL || PyDict_Check(kwds)); + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + + if (nargs == 1 && (kwds == NULL || !PyDict_GET_SIZE(kwds))) { + obj = (PyObject *) Py_TYPE(PyTuple_GET_ITEM(args, 0)); + Py_INCREF(obj); + return obj; + } + + /* SF bug 475327 -- if that didn't trigger, we need 3 + arguments. But PyArg_ParseTuple in type_new may give + a msg saying type() needs exactly 3. */ + if (nargs != 3) { + PyErr_SetString(PyExc_TypeError, + "type() takes 1 or 3 arguments"); + return NULL; + } + } + + if (type->tp_new == NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "cannot create '%.100s' instances", + type->tp_name); + return NULL; + } + obj = type->tp_new(type, args, kwds); - obj = _Py_CheckFunctionResult((PyObject*)type, obj, NULL); + obj = _Py_CheckFunctionResult(tstate, (PyObject*)type, obj, NULL); if (obj == NULL) return NULL; - /* Ugly exception: when the call was type(something), - don't call tp_init on the result. */ - if (type == &PyType_Type && - PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 && - (kwds == NULL || - (PyDict_Check(kwds) && PyDict_GET_SIZE(kwds) == 0))) - return obj; - /* If the returned object is not an instance of type, it won't be initialized. */ if (!PyType_IsSubtype(Py_TYPE(obj), type)) @@ -993,12 +1025,12 @@ type_call(PyTypeObject *type, PyObject *args, PyObject *kwds) if (type->tp_init != NULL) { int res = type->tp_init(obj, args, kwds); if (res < 0) { - assert(PyErr_Occurred()); + assert(_PyErr_Occurred(tstate)); Py_DECREF(obj); obj = NULL; } else { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); } } return obj; @@ -1011,23 +1043,29 @@ PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems) const size_t size = _PyObject_VAR_SIZE(type, nitems+1); /* note that we need to add one, for the sentinel */ - if (PyType_IS_GC(type)) + if (_PyType_IS_GC(type)) { obj = _PyObject_GC_Malloc(size); - else + } + else { obj = (PyObject *)PyObject_MALLOC(size); + } - if (obj == NULL) + if (obj == NULL) { return PyErr_NoMemory(); + } memset(obj, '\0', size); - if (type->tp_itemsize == 0) + if (type->tp_itemsize == 0) { (void)PyObject_INIT(obj, type); - else + } + else { (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems); + } - if (PyType_IS_GC(type)) + if (_PyType_IS_GC(type)) { _PyObject_GC_TRACK(obj); + } return obj; } @@ -1087,11 +1125,16 @@ subtype_traverse(PyObject *self, visitproc visit, void *arg) Py_VISIT(*dictptr); } - if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) + if (type->tp_flags & Py_TPFLAGS_HEAPTYPE + && (!basetraverse || !(base->tp_flags & Py_TPFLAGS_HEAPTYPE))) { /* For a heaptype, the instances count as references to the type. Traverse the type so the collector - can find cycles involving this link. */ + can find cycles involving this link. + Skip this visit if basetraverse belongs to a heap type: in that + case, basetraverse will visit the type when we call it later. + */ Py_VISIT(type); + } if (basetraverse) return basetraverse(self, visit, arg); @@ -1161,7 +1204,7 @@ subtype_dealloc(PyObject *self) /* Test whether the type has GC exactly once */ - if (!PyType_IS_GC(type)) { + if (!_PyType_IS_GC(type)) { /* A non GC dynamic type allows certain simplifications: there's no need to call clear_slots(), or DECREF the dict, or clear weakrefs. */ @@ -1173,8 +1216,9 @@ subtype_dealloc(PyObject *self) } if (type->tp_del) { type->tp_del(self); - if (self->ob_refcnt > 0) + if (Py_REFCNT(self) > 0) { return; + } } /* Find the nearest base with a different tp_dealloc */ @@ -1239,7 +1283,7 @@ subtype_dealloc(PyObject *self) if (type->tp_del) { _PyObject_GC_TRACK(self); type->tp_del(self); - if (self->ob_refcnt > 0) { + if (Py_REFCNT(self) > 0) { /* Resurrected */ goto endlabel; } @@ -1253,7 +1297,7 @@ subtype_dealloc(PyObject *self) if (type->tp_weaklistoffset && !base->tp_weaklistoffset) { /* Modeled after GET_WEAKREFS_LISTPTR() */ PyWeakReference **list = (PyWeakReference **) \ - PyObject_GET_WEAKREFS_LISTPTR(self); + _PyObject_GET_WEAKREFS_LISTPTR(self); while (*list) _PyWeakref_ClearRef(*list); } @@ -1286,8 +1330,9 @@ subtype_dealloc(PyObject *self) /* Call the base tp_dealloc(); first retrack self if * basedealloc knows about gc. */ - if (PyType_IS_GC(base)) + if (_PyType_IS_GC(base)) { _PyObject_GC_TRACK(self); + } assert(basedealloc); basedealloc(self); @@ -1374,7 +1419,7 @@ PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b) return 0; } else - /* a is not completely initilized yet; follow tp_base */ + /* a is not completely initialized yet; follow tp_base */ return type_is_subtype_base_chain(a, b); } @@ -1417,7 +1462,7 @@ lookup_maybe_method(PyObject *self, _Py_Identifier *attrid, int *unbound) return NULL; } - if (PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)) { + if (_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)) { /* Avoid temporary PyMethodObject */ *unbound = 1; Py_INCREF(res); @@ -1440,70 +1485,77 @@ lookup_method(PyObject *self, _Py_Identifier *attrid, int *unbound) { PyObject *res = lookup_maybe_method(self, attrid, unbound); if (res == NULL && !PyErr_Occurred()) { - PyErr_SetObject(PyExc_AttributeError, attrid->object); + PyErr_SetObject(PyExc_AttributeError, _PyUnicode_FromId(attrid)); } return res; } -static PyObject* -call_unbound(int unbound, PyObject *func, PyObject *self, - PyObject **args, Py_ssize_t nargs) + +static inline PyObject* +vectorcall_unbound(PyThreadState *tstate, int unbound, PyObject *func, + PyObject *const *args, Py_ssize_t nargs) { - if (unbound) { - return _PyObject_FastCall_Prepend(func, self, args, nargs); - } - else { - return _PyObject_FastCall(func, args, nargs); + size_t nargsf = nargs; + if (!unbound) { + /* Skip self argument, freeing up args[0] to use for + * PY_VECTORCALL_ARGUMENTS_OFFSET */ + args++; + nargsf = nargsf - 1 + PY_VECTORCALL_ARGUMENTS_OFFSET; } + return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL); } static PyObject* call_unbound_noarg(int unbound, PyObject *func, PyObject *self) { if (unbound) { - PyObject *args[1] = {self}; - return _PyObject_FastCall(func, args, 1); + return PyObject_CallOneArg(func, self); } else { return _PyObject_CallNoArg(func); } } -/* A variation of PyObject_CallMethod* that uses lookup_maybe_method() - instead of PyObject_GetAttrString(). */ +/* A variation of PyObject_CallMethod* that uses lookup_method() + instead of PyObject_GetAttrString(). + + args is an argument vector of length nargs. The first element in this + vector is the special object "self" which is used for the method lookup */ static PyObject * -call_method(PyObject *obj, _Py_Identifier *name, - PyObject **args, Py_ssize_t nargs) +vectorcall_method(_Py_Identifier *name, + PyObject *const *args, Py_ssize_t nargs) { - int unbound; - PyObject *func, *retval; + assert(nargs >= 1); - func = lookup_method(obj, name, &unbound); + PyThreadState *tstate = _PyThreadState_GET(); + int unbound; + PyObject *self = args[0]; + PyObject *func = lookup_method(self, name, &unbound); if (func == NULL) { return NULL; } - retval = call_unbound(unbound, func, obj, args, nargs); + PyObject *retval = vectorcall_unbound(tstate, unbound, func, args, nargs); Py_DECREF(func); return retval; } -/* Clone of call_method() that returns NotImplemented when the lookup fails. */ - +/* Clone of vectorcall_method() that returns NotImplemented + * when the lookup fails. */ static PyObject * -call_maybe(PyObject *obj, _Py_Identifier *name, - PyObject **args, Py_ssize_t nargs) +vectorcall_maybe(PyThreadState *tstate, _Py_Identifier *name, + PyObject *const *args, Py_ssize_t nargs) { - int unbound; - PyObject *func, *retval; + assert(nargs >= 1); - func = lookup_maybe_method(obj, name, &unbound); + int unbound; + PyObject *self = args[0]; + PyObject *func = lookup_maybe_method(self, name, &unbound); if (func == NULL) { if (!PyErr_Occurred()) Py_RETURN_NOTIMPLEMENTED; return NULL; } - - retval = call_unbound(unbound, func, obj, args, nargs); + PyObject *retval = vectorcall_unbound(tstate, unbound, func, args, nargs); Py_DECREF(func); return retval; } @@ -1881,10 +1933,9 @@ mro_invoke(PyTypeObject *type) { PyObject *mro_result; PyObject *new_mro; - int custom = (Py_TYPE(type) != &PyType_Type); + const int custom = !Py_IS_TYPE(type, &PyType_Type); if (custom) { - _Py_IDENTIFIER(mro); int unbound; PyObject *mro_meth = lookup_method((PyObject *)type, &PyId_mro, &unbound); @@ -2002,7 +2053,7 @@ best_base(PyObject *bases) if (PyType_Ready(base_i) < 0) return NULL; } - if (!PyType_HasFeature(base_i, Py_TPFLAGS_BASETYPE)) { + if (!_PyType_HasFeature(base_i, Py_TPFLAGS_BASETYPE)) { PyErr_Format(PyExc_TypeError, "type '%.100s' is not an acceptable base type", base_i->tp_name); @@ -2338,29 +2389,6 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) assert(args != NULL && PyTuple_Check(args)); assert(kwds == NULL || PyDict_Check(kwds)); - /* Special case: type(x) should return x->ob_type */ - /* We only want type itself to accept the one-argument form (#27157) - Note: We don't call PyType_CheckExact as that also allows subclasses */ - if (metatype == &PyType_Type) { - const Py_ssize_t nargs = PyTuple_GET_SIZE(args); - const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_GET_SIZE(kwds); - - if (nargs == 1 && nkwds == 0) { - PyObject *x = PyTuple_GET_ITEM(args, 0); - Py_INCREF(Py_TYPE(x)); - return (PyObject *) Py_TYPE(x); - } - - /* SF bug 475327 -- if that didn't trigger, we need 3 - arguments. but PyArg_ParseTuple below may give - a msg saying type() needs exactly 3. */ - if (nargs != 3) { - PyErr_SetString(PyExc_TypeError, - "type() takes 1 or 3 arguments"); - return NULL; - } - } - /* Check arguments: (name, bases, dict) */ if (!PyArg_ParseTuple(args, "UO!O!:type.__new__", &name, &PyTuple_Type, &bases, &PyDict_Type, &orig_dict)) @@ -2646,6 +2674,9 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) if (qualname != NULL && _PyDict_DelItemId(dict, &PyId___qualname__) < 0) goto error; + /* Set ht_module */ + et->ht_module = NULL; + /* Set tp_doc to a copy of dict['__doc__'], if the latter is there and is a string. The __doc__ accessor will first look for tp_doc; if that fails, it will still look into __dict__. @@ -2847,22 +2878,45 @@ static const short slotoffsets[] = { PyObject * PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) +{ + return PyType_FromModuleAndSpec(NULL, spec, bases); +} + +PyObject * +PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { PyHeapTypeObject *res; - PyMemberDef *memb; PyObject *modname; PyTypeObject *type, *base; - PyType_Slot *slot; - Py_ssize_t nmembers; - char *s, *res_start; + const PyType_Slot *slot; + Py_ssize_t nmembers, weaklistoffset, dictoffset, vectorcalloffset; + char *res_start; - nmembers = 0; + nmembers = weaklistoffset = dictoffset = vectorcalloffset = 0; for (slot = spec->slots; slot->slot; slot++) { if (slot->slot == Py_tp_members) { nmembers = 0; - for (memb = slot->pfunc; memb->name != NULL; memb++) { + for (const PyMemberDef *memb = slot->pfunc; memb->name != NULL; memb++) { nmembers++; + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + // The PyMemberDef must be a Py_ssize_t and readonly + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + weaklistoffset = memb->offset; + } + if (strcmp(memb->name, "__dictoffset__") == 0) { + // The PyMemberDef must be a Py_ssize_t and readonly + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + dictoffset = memb->offset; + } + if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + // The PyMemberDef must be a Py_ssize_t and readonly + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + vectorcalloffset = memb->offset; + } } } } @@ -2879,9 +2933,9 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) } /* Set the type name and qualname */ - s = strrchr(spec->name, '.'); + const char *s = strrchr(spec->name, '.'); if (s == NULL) - s = (char*)spec->name; + s = spec->name; else s++; @@ -2895,6 +2949,9 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) Py_INCREF(res->ht_qualname); type->tp_name = spec->name; + Py_XINCREF(module); + res->ht_module = module; + /* Adjust for empty tuple bases */ if (!bases) { base = &PyBaseObject_Type; @@ -2920,7 +2977,7 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) if (base == NULL) { goto fail; } - if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) { + if (!_PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) { PyErr_Format(PyExc_TypeError, "type '%.100s' is not an acceptable base type", base->tp_name); @@ -2984,6 +3041,10 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) type->tp_dealloc = subtype_dealloc; } + if (vectorcalloffset) { + type->tp_vectorcall_offset = vectorcalloffset; + } + if (PyType_Ready(type) < 0) goto fail; @@ -2991,24 +3052,40 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) res->ht_cached_keys = _PyDict_NewKeysForClass(); } - /* Set type.__module__ */ - s = strrchr(spec->name, '.'); - if (s != NULL) { - int err; - modname = PyUnicode_FromStringAndSize( - spec->name, (Py_ssize_t)(s - spec->name)); - if (modname == NULL) { + if (weaklistoffset) { + type->tp_weaklistoffset = weaklistoffset; + if (PyDict_DelItemString((PyObject *)type->tp_dict, "__weaklistoffset__") < 0) goto fail; - } - err = _PyDict_SetItemId(type->tp_dict, &PyId___module__, modname); - Py_DECREF(modname); - if (err != 0) + } + if (dictoffset) { + type->tp_dictoffset = dictoffset; + if (PyDict_DelItemString((PyObject *)type->tp_dict, "__dictoffset__") < 0) goto fail; - } else { - if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "builtin type %.200s has no __module__ attribute", - spec->name)) + } + + /* Set type.__module__ */ + if (_PyDict_GetItemIdWithError(type->tp_dict, &PyId___module__) == NULL) { + if (PyErr_Occurred()) { goto fail; + } + s = strrchr(spec->name, '.'); + if (s != NULL) { + int err; + modname = PyUnicode_FromStringAndSize( + spec->name, (Py_ssize_t)(s - spec->name)); + if (modname == NULL) { + goto fail; + } + err = _PyDict_SetItemId(type->tp_dict, &PyId___module__, modname); + Py_DECREF(modname); + if (err != 0) + goto fail; + } else { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "builtin type %.200s has no __module__ attribute", + spec->name)) + goto fail; + } } return (PyObject*)res; @@ -3027,7 +3104,7 @@ PyType_FromSpec(PyType_Spec *spec) void * PyType_GetSlot(PyTypeObject *type, int slot) { - if (!PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE) || slot < 0) { + if (!_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE) || slot < 0) { PyErr_BadInternalCall(); return NULL; } @@ -3038,6 +3115,40 @@ PyType_GetSlot(PyTypeObject *type, int slot) return *(void**)(((char*)type) + slotoffsets[slot]); } +PyObject * +PyType_GetModule(PyTypeObject *type) +{ + assert(PyType_Check(type)); + if (!_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) { + PyErr_Format( + PyExc_TypeError, + "PyType_GetModule: Type '%s' is not a heap type", + type->tp_name); + return NULL; + } + + PyHeapTypeObject* et = (PyHeapTypeObject*)type; + if (!et->ht_module) { + PyErr_Format( + PyExc_TypeError, + "PyType_GetModule: Type '%s' has no associated module", + type->tp_name); + return NULL; + } + return et->ht_module; + +} + +void * +PyType_GetModuleState(PyTypeObject *type) +{ + PyObject *m = PyType_GetModule(type); + if (m == NULL) { + return NULL; + } + return PyModule_GetState(m); +} + /* Internal API to look for a name through the MRO, bypassing the method cache. This returns a borrowed reference, and might set an exception. 'error' is set to: -1: error with exception; 1: error without exception; 0: ok */ @@ -3107,12 +3218,12 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) { PyObject *res; int error; - unsigned int h; +#ifdef MCACHE if (MCACHE_CACHEABLE_NAME(name) && - PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) { + _PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) { /* fast path */ - h = MCACHE_HASH_METHOD(type, name); + unsigned int h = MCACHE_HASH_METHOD(type, name); if (method_cache[h].version == type->tp_version_tag && method_cache[h].name == name) { #if MCACHE_STATS @@ -3121,6 +3232,7 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) return method_cache[h].value; } } +#endif /* We may end up clearing live exceptions below, so make sure it's ours. */ assert(!PyErr_Occurred()); @@ -3142,8 +3254,9 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) return NULL; } +#ifdef MCACHE if (MCACHE_CACHEABLE_NAME(name) && assign_version_tag(type)) { - h = MCACHE_HASH_METHOD(type, name); + unsigned int h = MCACHE_HASH_METHOD(type, name); method_cache[h].version = type->tp_version_tag; method_cache[h].value = res; /* borrowed */ Py_INCREF(name); @@ -3156,6 +3269,7 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) #endif Py_SETREF(method_cache[h].name, name); } +#endif return res; } @@ -3178,7 +3292,7 @@ is_dunder_name(PyObject *name) int kind = PyUnicode_KIND(name); /* Special names contain at least "__x__" and are always ASCII. */ if (length > 4 && kind == PyUnicode_1BYTE_KIND) { - Py_UCS1 *characters = PyUnicode_1BYTE_DATA(name); + const Py_UCS1 *characters = PyUnicode_1BYTE_DATA(name); return ( ((characters[length-2] == '_') && (characters[length-1] == '_')) && ((characters[0] == '_') && (characters[1] == '_')) @@ -3200,7 +3314,7 @@ type_getattro(PyTypeObject *type, PyObject *name) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return NULL; } @@ -3298,6 +3412,7 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) if (name == NULL) return -1; } +#ifdef INTERN_NAME_STRINGS if (!PyUnicode_CHECK_INTERNED(name)) { PyUnicode_InternInPlace(&name); if (!PyUnicode_CHECK_INTERNED(name)) { @@ -3307,6 +3422,7 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) return -1; } } +#endif } else { /* Will fail in _PyObject_GenericSetAttrWithDict. */ @@ -3360,8 +3476,10 @@ type_dealloc(PyTypeObject *type) Py_XDECREF(et->ht_name); Py_XDECREF(et->ht_qualname); Py_XDECREF(et->ht_slots); - if (et->ht_cached_keys) + if (et->ht_cached_keys) { _PyDictKeys_DecRef(et->ht_cached_keys); + } + Py_XDECREF(et->ht_module); Py_TYPE(type)->tp_free((PyObject *)type); } @@ -3541,9 +3659,9 @@ type_traverse(PyTypeObject *type, visitproc visit, void *arg) for heaptypes. */ if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { char msg[200]; - sprintf(msg, "type_traverse() called for non-heap type '%.100s'", + sprintf(msg, "type_traverse() called on non-heap type '%.100s'", type->tp_name); - Py_FatalError(msg); + _PyObject_ASSERT_FAILED_MSG((PyObject *)type, msg); } Py_VISIT(type->tp_dict); @@ -3551,6 +3669,7 @@ type_traverse(PyTypeObject *type, visitproc visit, void *arg) Py_VISIT(type->tp_mro); Py_VISIT(type->tp_bases); Py_VISIT(type->tp_base); + Py_VISIT(((PyHeapTypeObject *)type)->ht_module); /* There's no need to visit type->tp_subclasses or ((PyHeapTypeObject *)type)->ht_slots, because they can't be involved @@ -3572,10 +3691,13 @@ type_clear(PyTypeObject *type) the dict, so that other objects caught in a reference cycle don't start calling destroyed methods. - Otherwise, the only field we need to clear is tp_mro, which is + Otherwise, the we need to clear tp_mro, which is part of a hard cycle (its first element is the class itself) that won't be broken otherwise (it's a tuple and tuples don't have a - tp_clear handler). None of the other fields need to be + tp_clear handler). + We also need to clear ht_module, if present: the module usually holds a + reference to its class. None of the other fields need to be + cleared, and here's why: tp_cache: @@ -3600,8 +3722,11 @@ type_clear(PyTypeObject *type) ((PyHeapTypeObject *)type)->ht_cached_keys = NULL; _PyDictKeys_DecRef(cached_keys); } - if (type->tp_dict) + if (type->tp_dict) { PyDict_Clear(type->tp_dict); + } + Py_CLEAR(((PyHeapTypeObject *)type)->ht_module); + Py_CLEAR(type->tp_mro); return 0; @@ -3619,7 +3744,7 @@ PyTypeObject PyType_Type = { sizeof(PyHeapTypeObject), /* tp_basicsize */ sizeof(PyMemberDef), /* tp_itemsize */ (destructor)type_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ + offsetof(PyTypeObject, tp_vectorcall), /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ @@ -3634,7 +3759,8 @@ PyTypeObject PyType_Type = { (setattrofunc)type_setattro, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS, /* tp_flags */ + Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS | + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ type_doc, /* tp_doc */ (traverseproc)type_traverse, /* tp_traverse */ (inquiry)type_clear, /* tp_clear */ @@ -3753,6 +3879,7 @@ object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *joined; PyObject *comma; _Py_static_string(comma_id, ", "); + Py_ssize_t method_count; /* Compute ", ".join(sorted(type.__abstractmethods__)) into joined. */ @@ -3773,14 +3900,18 @@ object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } joined = PyUnicode_Join(comma, sorted_methods); + method_count = PyObject_Length(sorted_methods); Py_DECREF(sorted_methods); if (joined == NULL) return NULL; + if (method_count == -1) + return NULL; PyErr_Format(PyExc_TypeError, "Can't instantiate abstract class %s " - "with abstract methods %U", + "with abstract method%s %U", type->tp_name, + method_count > 1 ? "s" : "", joined); Py_DECREF(joined); return NULL; @@ -3852,12 +3983,12 @@ object_richcompare(PyObject *self, PyObject *other, int op) case Py_NE: /* By default, __ne__() delegates to __eq__() and inverts the result, unless the latter returns NotImplemented. */ - if (self->ob_type->tp_richcompare == NULL) { + if (Py_TYPE(self)->tp_richcompare == NULL) { res = Py_NotImplemented; Py_INCREF(res); break; } - res = (*self->ob_type->tp_richcompare)(self, other, Py_EQ); + res = (*Py_TYPE(self)->tp_richcompare)(self, other, Py_EQ); if (res != NULL && res != Py_NotImplemented) { int ok = PyObject_IsTrue(res); Py_DECREF(res); @@ -4061,9 +4192,10 @@ object_set_class(PyObject *self, PyObject *value, void *closure) } if (compatible_for_assignment(oldto, newto, "__class__")) { - if (newto->tp_flags & Py_TPFLAGS_HEAPTYPE) + if (newto->tp_flags & Py_TPFLAGS_HEAPTYPE) { Py_INCREF(newto); - Py_TYPE(self) = newto; + } + Py_SET_TYPE(self, newto); if (oldto->tp_flags & Py_TPFLAGS_HEAPTYPE) Py_DECREF(oldto); return 0; @@ -4150,8 +4282,8 @@ _PyType_GetSlotNames(PyTypeObject *cls) /* Use _slotnames function from the copyreg module to find the slots by this class and its bases. This function will cache the result in __slotnames__. */ - slotnames = _PyObject_CallMethodIdObjArgs(copyreg, &PyId__slotnames, - cls, NULL); + slotnames = _PyObject_CallMethodIdOneArg(copyreg, &PyId__slotnames, + (PyObject *)cls); Py_DECREF(copyreg); if (slotnames == NULL) return NULL; @@ -4179,7 +4311,7 @@ _PyObject_GetState(PyObject *obj, int required) if (getstate == NULL) { PyObject *slotnames; - if (required && obj->ob_type->tp_itemsize) { + if (required && Py_TYPE(obj)->tp_itemsize) { PyErr_Format(PyExc_TypeError, "cannot pickle '%.200s' object", Py_TYPE(obj)->tp_name); @@ -4212,13 +4344,13 @@ _PyObject_GetState(PyObject *obj, int required) assert(slotnames == Py_None || PyList_Check(slotnames)); if (required) { Py_ssize_t basicsize = PyBaseObject_Type.tp_basicsize; - if (obj->ob_type->tp_dictoffset) + if (Py_TYPE(obj)->tp_dictoffset) basicsize += sizeof(PyObject *); - if (obj->ob_type->tp_weaklistoffset) + if (Py_TYPE(obj)->tp_weaklistoffset) basicsize += sizeof(PyObject *); if (slotnames != Py_None) basicsize += sizeof(PyObject *) * PyList_GET_SIZE(slotnames); - if (obj->ob_type->tp_basicsize > basicsize) { + if (Py_TYPE(obj)->tp_basicsize > basicsize) { Py_DECREF(slotnames); Py_DECREF(state); PyErr_Format(PyExc_TypeError, @@ -4430,7 +4562,7 @@ _PyObject_GetItemsIter(PyObject *obj, PyObject **listitems, PyObject *items; _Py_IDENTIFIER(items); - items = _PyObject_CallMethodIdObjArgs(obj, &PyId_items, NULL); + items = _PyObject_CallMethodIdNoArgs(obj, &PyId_items); if (items == NULL) { Py_CLEAR(*listitems); return -1; @@ -4689,7 +4821,7 @@ object___format___impl(PyObject *self, PyObject *format_spec) if (PyUnicode_GET_LENGTH(format_spec) > 0) { PyErr_Format(PyExc_TypeError, "unsupported format string passed to %.200s.__format__", - self->ob_type->tp_name); + Py_TYPE(self)->tp_name); return NULL; } return PyObject_Str(self); @@ -4708,10 +4840,10 @@ object___sizeof___impl(PyObject *self) Py_ssize_t res, isize; res = 0; - isize = self->ob_type->tp_itemsize; + isize = Py_TYPE(self)->tp_itemsize; if (isize > 0) res = Py_SIZE(self) * isize; - res += self->ob_type->tp_basicsize; + res += Py_TYPE(self)->tp_basicsize; return PyLong_FromSsize_t(res); } @@ -4758,7 +4890,7 @@ object___dir___impl(PyObject *self) if (_PyObject_LookupAttrId(self, &PyId___class__, &itsclass) < 0) { goto error; } - /* XXX(tomer): Perhaps fall back to obj->ob_type if no + /* XXX(tomer): Perhaps fall back to Py_TYPE(obj) if no __class__ exists? */ if (itsclass != NULL && merge_class_dict(dict, itsclass) < 0) goto error; @@ -5159,17 +5291,17 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base) /* tp_hash see tp_richcompare */ { /* Always inherit tp_vectorcall_offset to support PyVectorcall_Call(). - * If _Py_TPFLAGS_HAVE_VECTORCALL is not inherited, then vectorcall + * If Py_TPFLAGS_HAVE_VECTORCALL is not inherited, then vectorcall * won't be used automatically. */ COPYSLOT(tp_vectorcall_offset); - /* Inherit _Py_TPFLAGS_HAVE_VECTORCALL for non-heap types + /* Inherit Py_TPFLAGS_HAVE_VECTORCALL for non-heap types * if tp_call is not overridden */ if (!type->tp_call && - (base->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) && + (base->tp_flags & Py_TPFLAGS_HAVE_VECTORCALL) && !(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { - type->tp_flags |= _Py_TPFLAGS_HAVE_VECTORCALL; + type->tp_flags |= Py_TPFLAGS_HAVE_VECTORCALL; } COPYSLOT(tp_call); } @@ -5245,14 +5377,14 @@ PyType_Ready(PyTypeObject *type) /* Consistency checks for PEP 590: * - Py_TPFLAGS_METHOD_DESCRIPTOR requires tp_descr_get - * - _Py_TPFLAGS_HAVE_VECTORCALL requires tp_call and + * - Py_TPFLAGS_HAVE_VECTORCALL requires tp_call and * tp_vectorcall_offset > 0 * To avoid mistakes, we require this before inheriting. */ if (type->tp_flags & Py_TPFLAGS_METHOD_DESCRIPTOR) { _PyObject_ASSERT((PyObject *)type, type->tp_descr_get != NULL); } - if (type->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) { + if (type->tp_flags & Py_TPFLAGS_HAVE_VECTORCALL) { _PyObject_ASSERT((PyObject *)type, type->tp_vectorcall_offset > 0); _PyObject_ASSERT((PyObject *)type, type->tp_call != NULL); } @@ -5298,8 +5430,9 @@ PyType_Ready(PyTypeObject *type) NULL when type is &PyBaseObject_Type, and we know its ob_type is not NULL (it's initialized to &PyType_Type). But coverity doesn't know that. */ - if (Py_TYPE(type) == NULL && base != NULL) - Py_TYPE(type) = Py_TYPE(base); + if (Py_IS_TYPE(type, NULL) && base != NULL) { + Py_SET_TYPE(type, Py_TYPE(base)); + } /* Initialize tp_bases */ bases = type->tp_bases; @@ -5372,7 +5505,7 @@ PyType_Ready(PyTypeObject *type) } /* Sanity check for tp_free. */ - if (PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) && + if (_PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) && (type->tp_free == NULL || type->tp_free == PyObject_Del)) { /* This base class needs to call tp_free, but doesn't have * one, or its tp_free is for non-gc'ed objects. @@ -6035,8 +6168,12 @@ tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds) PyTypeObject *type, *subtype, *staticbase; PyObject *arg0, *res; - if (self == NULL || !PyType_Check(self)) - Py_FatalError("__new__() called with non-type 'self'"); + if (self == NULL || !PyType_Check(self)) { + PyErr_Format(PyExc_SystemError, + "__new__() called with non-type 'self'"); + return NULL; + } + type = (PyTypeObject *)self; if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) { PyErr_Format(PyExc_TypeError, @@ -6123,17 +6260,18 @@ add_tp_new_wrapper(PyTypeObject *type) static PyObject * \ FUNCNAME(PyObject *self) \ { \ + PyObject* stack[1] = {self}; \ _Py_static_string(id, OPSTR); \ - return call_method(self, &id, NULL, 0); \ + return vectorcall_method(&id, stack, 1); \ } #define SLOT1(FUNCNAME, OPSTR, ARG1TYPE) \ static PyObject * \ FUNCNAME(PyObject *self, ARG1TYPE arg1) \ { \ - PyObject* stack[1] = {arg1}; \ + PyObject* stack[2] = {self, arg1}; \ _Py_static_string(id, OPSTR); \ - return call_method(self, &id, stack, 1); \ + return vectorcall_method(&id, stack, 2); \ } /* Boolean helper for SLOT1BINFULL(). @@ -6173,10 +6311,11 @@ method_is_overloaded(PyObject *left, PyObject *right, struct _Py_Identifier *nam static PyObject * \ FUNCNAME(PyObject *self, PyObject *other) \ { \ - PyObject* stack[1]; \ + PyObject* stack[2]; \ + PyThreadState *tstate = _PyThreadState_GET(); \ _Py_static_string(op_id, OPSTR); \ _Py_static_string(rop_id, ROPSTR); \ - int do_other = Py_TYPE(self) != Py_TYPE(other) && \ + int do_other = !Py_IS_TYPE(self, Py_TYPE(other)) && \ Py_TYPE(other)->tp_as_number != NULL && \ Py_TYPE(other)->tp_as_number->SLOTNAME == TESTFUNC; \ if (Py_TYPE(self)->tp_as_number != NULL && \ @@ -6188,24 +6327,27 @@ FUNCNAME(PyObject *self, PyObject *other) \ return NULL; \ } \ if (ok) { \ - stack[0] = self; \ - r = call_maybe(other, &rop_id, stack, 1); \ + stack[0] = other; \ + stack[1] = self; \ + r = vectorcall_maybe(tstate, &rop_id, stack, 2); \ if (r != Py_NotImplemented) \ return r; \ Py_DECREF(r); \ do_other = 0; \ } \ } \ - stack[0] = other; \ - r = call_maybe(self, &op_id, stack, 1); \ + stack[0] = self; \ + stack[1] = other; \ + r = vectorcall_maybe(tstate, &op_id, stack, 2); \ if (r != Py_NotImplemented || \ - Py_TYPE(other) == Py_TYPE(self)) \ + Py_IS_TYPE(other, Py_TYPE(self))) \ return r; \ Py_DECREF(r); \ } \ if (do_other) { \ - stack[0] = self; \ - return call_maybe(other, &rop_id, stack, 1); \ + stack[0] = other; \ + stack[1] = self; \ + return vectorcall_maybe(tstate, &rop_id, stack, 2); \ } \ Py_RETURN_NOTIMPLEMENTED; \ } @@ -6216,7 +6358,8 @@ FUNCNAME(PyObject *self, PyObject *other) \ static Py_ssize_t slot_sq_length(PyObject *self) { - PyObject *res = call_method(self, &PyId___len__, NULL, 0); + PyObject* stack[1] = {self}; + PyObject *res = vectorcall_method(&PyId___len__, stack, 1); Py_ssize_t len; if (res == NULL) @@ -6243,14 +6386,12 @@ slot_sq_length(PyObject *self) static PyObject * slot_sq_item(PyObject *self, Py_ssize_t i) { - PyObject *retval; - PyObject *args[1]; PyObject *ival = PyLong_FromSsize_t(i); if (ival == NULL) { return NULL; } - args[0] = ival; - retval = call_method(self, &PyId___getitem__, args, 1); + PyObject *stack[2] = {self, ival}; + PyObject *retval = vectorcall_method(&PyId___getitem__, stack, 2); Py_DECREF(ival); return retval; } @@ -6258,7 +6399,7 @@ slot_sq_item(PyObject *self, Py_ssize_t i) static int slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value) { - PyObject *stack[2]; + PyObject *stack[3]; PyObject *res; PyObject *index_obj; @@ -6267,13 +6408,14 @@ slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value) return -1; } - stack[0] = index_obj; + stack[0] = self; + stack[1] = index_obj; if (value == NULL) { - res = call_method(self, &PyId___delitem__, stack, 1); + res = vectorcall_method(&PyId___delitem__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___setitem__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___setitem__, stack, 3); } Py_DECREF(index_obj); @@ -6287,6 +6429,7 @@ slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value) static int slot_sq_contains(PyObject *self, PyObject *value) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject *func, *res; int result = -1, unbound; _Py_IDENTIFIER(__contains__); @@ -6300,8 +6443,8 @@ slot_sq_contains(PyObject *self, PyObject *value) return -1; } if (func != NULL) { - PyObject *args[1] = {value}; - res = call_unbound(unbound, func, self, args, 1); + PyObject *args[2] = {self, value}; + res = vectorcall_unbound(tstate, unbound, func, args, 2); Py_DECREF(func); if (res != NULL) { result = PyObject_IsTrue(res); @@ -6323,16 +6466,17 @@ SLOT1(slot_mp_subscript, "__getitem__", PyObject *) static int slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value) { - PyObject *stack[2]; + PyObject *stack[3]; PyObject *res; - stack[0] = key; + stack[0] = self; + stack[1] = key; if (value == NULL) { - res = call_method(self, &PyId___delitem__, stack, 1); + res = vectorcall_method(&PyId___delitem__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___setitem__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___setitem__, stack, 3); } if (res == NULL) @@ -6365,8 +6509,8 @@ slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus) slot_nb_power, so check before calling self.__pow__. */ if (Py_TYPE(self)->tp_as_number != NULL && Py_TYPE(self)->tp_as_number->nb_power == slot_nb_power) { - PyObject* stack[2] = {other, modulus}; - return call_method(self, &PyId___pow__, stack, 2); + PyObject* stack[3] = {self, other, modulus}; + return vectorcall_method(&PyId___pow__, stack, 3); } Py_RETURN_NOTIMPLEMENTED; } @@ -6433,7 +6577,8 @@ static PyObject * slot_nb_index(PyObject *self) { _Py_IDENTIFIER(__index__); - return call_method(self, &PyId___index__, NULL, 0); + PyObject *stack[1] = {self}; + return vectorcall_method(&PyId___index__, stack, 1); } @@ -6455,9 +6600,9 @@ SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *) static PyObject * slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2) { - PyObject *stack[1] = {arg1}; + PyObject *stack[2] = {self, arg1}; _Py_IDENTIFIER(__ipow__); - return call_method(self, &PyId___ipow__, stack, 1); + return vectorcall_method(&PyId___ipow__, stack, 2); } SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *) SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *) @@ -6541,19 +6686,21 @@ slot_tp_hash(PyObject *self) static PyObject * slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds) { + PyThreadState *tstate = _PyThreadState_GET(); _Py_IDENTIFIER(__call__); int unbound; - PyObject *meth = lookup_method(self, &PyId___call__, &unbound); - PyObject *res; - if (meth == NULL) + PyObject *meth = lookup_method(self, &PyId___call__, &unbound); + if (meth == NULL) { return NULL; + } + PyObject *res; if (unbound) { - res = _PyObject_Call_Prepend(meth, self, args, kwds); + res = _PyObject_Call_Prepend(tstate, meth, self, args, kwds); } else { - res = PyObject_Call(meth, args, kwds); + res = _PyObject_Call(tstate, meth, args, kwds); } Py_DECREF(meth); @@ -6574,8 +6721,8 @@ slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds) static PyObject * slot_tp_getattro(PyObject *self, PyObject *name) { - PyObject *stack[1] = {name}; - return call_method(self, &PyId___getattribute__, stack, 1); + PyObject *stack[2] = {self, name}; + return vectorcall_method(&PyId___getattribute__, stack, 2); } static PyObject * @@ -6591,7 +6738,7 @@ call_attribute(PyObject *self, PyObject *attr, PyObject *name) else attr = descr; } - res = PyObject_CallFunctionObjArgs(attr, name, NULL); + res = PyObject_CallOneArg(attr, name); Py_XDECREF(descr); return res; } @@ -6622,7 +6769,7 @@ slot_tp_getattr_hook(PyObject *self, PyObject *name) needed, with call_attribute. */ getattribute = _PyType_LookupId(tp, &PyId___getattribute__); if (getattribute == NULL || - (Py_TYPE(getattribute) == &PyWrapperDescr_Type && + (Py_IS_TYPE(getattribute, &PyWrapperDescr_Type) && ((PyWrapperDescrObject *)getattribute)->d_wrapped == (void *)PyObject_GenericGetAttr)) res = PyObject_GenericGetAttr(self, name); @@ -6642,18 +6789,19 @@ slot_tp_getattr_hook(PyObject *self, PyObject *name) static int slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value) { - PyObject *stack[2]; + PyObject *stack[3]; PyObject *res; _Py_IDENTIFIER(__delattr__); _Py_IDENTIFIER(__setattr__); - stack[0] = name; + stack[0] = self; + stack[1] = name; if (value == NULL) { - res = call_method(self, &PyId___delattr__, stack, 1); + res = vectorcall_method(&PyId___delattr__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___setattr__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___setattr__, stack, 3); } if (res == NULL) return -1; @@ -6662,28 +6810,28 @@ slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value) } static _Py_Identifier name_op[] = { - {0, "__lt__", 0}, - {0, "__le__", 0}, - {0, "__eq__", 0}, - {0, "__ne__", 0}, - {0, "__gt__", 0}, - {0, "__ge__", 0} + _Py_static_string_init("__lt__"), + _Py_static_string_init("__le__"), + _Py_static_string_init("__eq__"), + _Py_static_string_init("__ne__"), + _Py_static_string_init("__gt__"), + _Py_static_string_init("__ge__"), }; static PyObject * slot_tp_richcompare(PyObject *self, PyObject *other, int op) { - int unbound; - PyObject *func, *res; + PyThreadState *tstate = _PyThreadState_GET(); - func = lookup_maybe_method(self, &name_op[op], &unbound); + int unbound; + PyObject *func = lookup_maybe_method(self, &name_op[op], &unbound); if (func == NULL) { PyErr_Clear(); Py_RETURN_NOTIMPLEMENTED; } - PyObject *args[1] = {other}; - res = call_unbound(unbound, func, self, args, 1); + PyObject *stack[2] = {self, other}; + PyObject *res = vectorcall_unbound(tstate, unbound, func, stack, 2); Py_DECREF(func); return res; } @@ -6726,7 +6874,8 @@ static PyObject * slot_tp_iternext(PyObject *self) { _Py_IDENTIFIER(__next__); - return call_method(self, &PyId___next__, NULL, 0); + PyObject *stack[1] = {self}; + return vectorcall_method(&PyId___next__, stack, 1); } static PyObject * @@ -6754,18 +6903,19 @@ slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type) static int slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value) { - PyObject* stack[2]; + PyObject* stack[3]; PyObject *res; _Py_IDENTIFIER(__delete__); _Py_IDENTIFIER(__set__); - stack[0] = target; + stack[0] = self; + stack[1] = target; if (value == NULL) { - res = call_method(self, &PyId___delete__, stack, 1); + res = vectorcall_method(&PyId___delete__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___set__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___set__, stack, 3); } if (res == NULL) return -1; @@ -6776,18 +6926,21 @@ slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value) static int slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds) { + PyThreadState *tstate = _PyThreadState_GET(); + _Py_IDENTIFIER(__init__); int unbound; PyObject *meth = lookup_method(self, &PyId___init__, &unbound); - PyObject *res; - - if (meth == NULL) + if (meth == NULL) { return -1; + } + + PyObject *res; if (unbound) { - res = _PyObject_Call_Prepend(meth, self, args, kwds); + res = _PyObject_Call_Prepend(tstate, meth, self, args, kwds); } else { - res = PyObject_Call(meth, args, kwds); + res = _PyObject_Call(tstate, meth, args, kwds); } Py_DECREF(meth); if (res == NULL) @@ -6806,6 +6959,7 @@ slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds) static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject *func, *result; func = _PyObject_GetAttrId((PyObject *)type, &PyId___new__); @@ -6813,7 +6967,7 @@ slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } - result = _PyObject_Call_Prepend(func, (PyObject *)type, args, kwds); + result = _PyObject_Call_Prepend(tstate, func, (PyObject *)type, args, kwds); Py_DECREF(func); return result; } @@ -6909,7 +7063,8 @@ which incorporates the additional structures used for numbers, sequences and mappings. Note that multiple names may map to the same slot (e.g. __eq__, __ne__ etc. all map to tp_richcompare) and one name may map to multiple slots (e.g. __str__ affects tp_str as well as tp_repr). The table is terminated with -an all-zero entry. (This table is further initialized in init_slotdefs().) +an all-zero entry. (This table is further initialized in +_PyTypes_InitSlotDefs().) */ typedef struct wrapperbase slotdef; @@ -7217,8 +7372,9 @@ resolve_slotdups(PyTypeObject *type, PyObject *name) *pp = NULL; } - /* Look in all matching slots of the type; if exactly one of these has - a filled-in slot, return its value. Otherwise return NULL. */ + /* Look in all slots of the type matching the name. If exactly one of these + has a filled-in slot, return a pointer to that slot. + Otherwise, return NULL. */ res = NULL; for (pp = ptrs; *pp; pp++) { ptr = slotptr(type, (*pp)->offset); @@ -7231,12 +7387,61 @@ resolve_slotdups(PyTypeObject *type, PyObject *name) return res; } -/* Common code for update_slots_callback() and fixup_slot_dispatchers(). This - does some incredibly complex thinking and then sticks something into the - slot. (It sees if the adjacent slotdefs for the same slot have conflicting - interests, and then stores a generic wrapper or a specific function into - the slot.) Return a pointer to the next slotdef with a different offset, - because that's convenient for fixup_slot_dispatchers(). */ + +/* Common code for update_slots_callback() and fixup_slot_dispatchers(). + * + * This is meant to set a "slot" like type->tp_repr or + * type->tp_as_sequence->sq_concat by looking up special methods like + * __repr__ or __add__. The opposite (adding special methods from slots) is + * done by add_operators(), called from PyType_Ready(). Since update_one_slot() + * calls PyType_Ready() if needed, the special methods are already in place. + * + * The special methods corresponding to each slot are defined in the "slotdef" + * array. Note that one slot may correspond to multiple special methods and vice + * versa. For example, tp_richcompare uses 6 methods __lt__, ..., __ge__ and + * tp_as_number->nb_add uses __add__ and __radd__. In the other direction, + * __add__ is used by the number and sequence protocols and __getitem__ by the + * sequence and mapping protocols. This causes a lot of complications. + * + * In detail, update_one_slot() does the following: + * + * First of all, if the slot in question does not exist, return immediately. + * This can happen for example if it's tp_as_number->nb_add but tp_as_number + * is NULL. + * + * For the given slot, we loop over all the special methods with a name + * corresponding to that slot (for example, for tp_descr_set, this would be + * __set__ and __delete__) and we look up these names in the MRO of the type. + * If we don't find any special method, the slot is set to NULL (regardless of + * what was in the slot before). + * + * Suppose that we find exactly one special method. If it's a wrapper_descriptor + * (i.e. a special method calling a slot, for example str.__repr__ which calls + * the tp_repr for the 'str' class) with the correct name ("__repr__" for + * tp_repr), for the right class, calling the right wrapper C function (like + * wrap_unaryfunc for tp_repr), then the slot is set to the slot that the + * wrapper_descriptor originally wrapped. For example, a class inheriting + * from 'str' and not redefining __repr__ will have tp_repr set to the tp_repr + * of 'str'. + * In all other cases where the special method exists, the slot is set to a + * wrapper calling the special method. There is one exception: if the special + * method is a wrapper_descriptor with the correct name but the type has + * precisely one slot set for that name and that slot is not the one that we + * are updating, then NULL is put in the slot (this exception is the only place + * in update_one_slot() where the *existing* slots matter). + * + * When there are multiple special methods for the same slot, the above is + * applied for each special method. As long as the results agree, the common + * resulting slot is applied. If the results disagree, then a wrapper for + * the special methods is installed. This is always safe, but less efficient + * because it uses method lookup instead of direct C calls. + * + * There are some further special cases for specific slots, like supporting + * __hash__ = None for tp_hash and special code for tp_new. + * + * When done, return a pointer to the next slotdef with a different offset, + * because that's convenient for fixup_slot_dispatchers(). This function never + * sets an exception: if an internal error happens (unlikely), it's ignored. */ static slotdef * update_one_slot(PyTypeObject *type, slotdef *p) { @@ -7261,7 +7466,7 @@ update_one_slot(PyTypeObject *type, slotdef *p) descr = find_name_in_mro(type, p->name_strobj, &error); if (descr == NULL) { if (error == -1) { - /* It is unlikely by not impossible that there has been an exception + /* It is unlikely but not impossible that there has been an exception during lookup. Since this function originally expected no errors, we ignore them here in order to keep up the interface. */ PyErr_Clear(); @@ -7271,7 +7476,7 @@ update_one_slot(PyTypeObject *type, slotdef *p) } continue; } - if (Py_TYPE(descr) == &PyWrapperDescr_Type && + if (Py_IS_TYPE(descr, &PyWrapperDescr_Type) && ((PyWrapperDescrObject *)descr)->d_base->name_strobj == p->name_strobj) { void **tptr = resolve_slotdups(type, p->name_strobj); if (tptr == NULL || tptr == ptr) @@ -7294,7 +7499,7 @@ update_one_slot(PyTypeObject *type, slotdef *p) use_generic = 1; } } - else if (Py_TYPE(descr) == &PyCFunction_Type && + else if (Py_IS_TYPE(descr, &PyCFunction_Type) && PyCFunction_GET_FUNCTION(descr) == (PyCFunction)(void(*)(void))tp_new_wrapper && ptr == (void**)&type->tp_new) @@ -7350,28 +7555,36 @@ update_slots_callback(PyTypeObject *type, void *data) static int slotdefs_initialized = 0; /* Initialize the slotdefs table by adding interned string objects for the names. */ -static void -init_slotdefs(void) +PyStatus +_PyTypes_InitSlotDefs(void) { - slotdef *p; + if (slotdefs_initialized) { + return _PyStatus_OK(); + } - if (slotdefs_initialized) - return; - for (p = slotdefs; p->name; p++) { + for (slotdef *p = slotdefs; p->name; p++) { /* Slots must be ordered by their offset in the PyHeapTypeObject. */ assert(!p[1].name || p->offset <= p[1].offset); +#ifdef INTERN_NAME_STRINGS p->name_strobj = PyUnicode_InternFromString(p->name); - if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) - Py_FatalError("Out of memory interning slotdef names"); + if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) { + return _PyStatus_NO_MEMORY(); + } +#else + p->name_strobj = PyUnicode_FromString(p->name); + if (!p->name_strobj) { + return _PyStatus_NO_MEMORY(); + } +#endif } slotdefs_initialized = 1; + return _PyStatus_OK(); } -/* Undo init_slotdefs, releasing the interned strings. */ +/* Undo _PyTypes_InitSlotDefs(), releasing the interned strings. */ static void clear_slotdefs(void) { - slotdef *p; - for (p = slotdefs; p->name; p++) { + for (slotdef *p = slotdefs; p->name; p++) { Py_CLEAR(p->name_strobj); } slotdefs_initialized = 0; @@ -7387,9 +7600,11 @@ update_slot(PyTypeObject *type, PyObject *name) int offset; assert(PyUnicode_CheckExact(name)); +#ifdef INTERN_NAME_STRINGS assert(PyUnicode_CHECK_INTERNED(name)); +#endif - init_slotdefs(); + assert(slotdefs_initialized); pp = ptrs; for (p = slotdefs; p->name; p++) { if (p->name_strobj == name) @@ -7417,7 +7632,7 @@ fixup_slot_dispatchers(PyTypeObject *type) { slotdef *p; - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; ) p = update_one_slot(type, p); } @@ -7430,7 +7645,7 @@ update_all_slots(PyTypeObject* type) /* Clear the VALID_VERSION flag of 'type' and all its subclasses. */ PyType_Modified(type); - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; p++) { /* update_slot returns int but can't actually fail */ update_slot(type, p->name_strobj); @@ -7457,7 +7672,7 @@ set_names(PyTypeObject *type) _PyErr_FormatFromCause(PyExc_RuntimeError, "Error calling __set_name__ on '%.100s' instance %R " "in '%.100s'", - value->ob_type->tp_name, key, type->tp_name); + Py_TYPE(value)->tp_name, key, type->tp_name); Py_DECREF(names_to_set); return -1; } @@ -7493,7 +7708,7 @@ init_subclass(PyTypeObject *type, PyObject *kwds) } - result = _PyObject_FastCallDict(func, NULL, 0, kwds); + result = PyObject_VectorcallDict(func, NULL, 0, kwds); Py_DECREF(func); if (result == NULL) { return -1; @@ -7590,7 +7805,7 @@ add_operators(PyTypeObject *type) PyObject *descr; void **ptr; - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; p++) { if (p->wrapper == NULL) continue; @@ -7819,7 +8034,7 @@ super_descr_get(PyObject *self, PyObject *obj, PyObject *type) Py_INCREF(self); return self; } - if (Py_TYPE(su) != &PySuper_Type) + if (!Py_IS_TYPE(su, &PySuper_Type)) /* If su is an instance of a (strict) subclass of super, call its type */ return PyObject_CallFunctionObjArgs((PyObject *)Py_TYPE(su), @@ -7842,6 +8057,83 @@ super_descr_get(PyObject *self, PyObject *obj, PyObject *type) } } +static int +super_init_without_args(PyFrameObject *f, PyCodeObject *co, + PyTypeObject **type_p, PyObject **obj_p) +{ + if (co->co_argcount == 0) { + PyErr_SetString(PyExc_RuntimeError, + "super(): no arguments"); + return -1; + } + + PyObject *obj = f->f_localsplus[0]; + Py_ssize_t i, n; + if (obj == NULL && co->co_cell2arg) { + /* The first argument might be a cell. */ + n = PyTuple_GET_SIZE(co->co_cellvars); + for (i = 0; i < n; i++) { + if (co->co_cell2arg[i] == 0) { + PyObject *cell = f->f_localsplus[co->co_nlocals + i]; + assert(PyCell_Check(cell)); + obj = PyCell_GET(cell); + break; + } + } + } + if (obj == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "super(): arg[0] deleted"); + return -1; + } + + if (co->co_freevars == NULL) { + n = 0; + } + else { + assert(PyTuple_Check(co->co_freevars)); + n = PyTuple_GET_SIZE(co->co_freevars); + } + + PyTypeObject *type = NULL; + for (i = 0; i < n; i++) { + PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i); + assert(PyUnicode_Check(name)); + if (_PyUnicode_EqualToASCIIId(name, &PyId___class__)) { + Py_ssize_t index = co->co_nlocals + + PyTuple_GET_SIZE(co->co_cellvars) + i; + PyObject *cell = f->f_localsplus[index]; + if (cell == NULL || !PyCell_Check(cell)) { + PyErr_SetString(PyExc_RuntimeError, + "super(): bad __class__ cell"); + return -1; + } + type = (PyTypeObject *) PyCell_GET(cell); + if (type == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "super(): empty __class__ cell"); + return -1; + } + if (!PyType_Check(type)) { + PyErr_Format(PyExc_RuntimeError, + "super(): __class__ is not a type (%s)", + Py_TYPE(type)->tp_name); + return -1; + } + break; + } + } + if (type == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "super(): __class__ cell not found"); + return -1; + } + + *type_p = type; + *obj_p = obj; + return 0; +} + static int super_init(PyObject *self, PyObject *args, PyObject *kwds) { @@ -7858,80 +8150,20 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds) if (type == NULL) { /* Call super(), without args -- fill in from __class__ and first local variable on the stack. */ - PyFrameObject *f; - PyCodeObject *co; - Py_ssize_t i, n; - f = _PyThreadState_GET()->frame; - if (f == NULL) { + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *frame = PyThreadState_GetFrame(tstate); + if (frame == NULL) { PyErr_SetString(PyExc_RuntimeError, "super(): no current frame"); return -1; } - co = f->f_code; - if (co == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "super(): no code object"); - return -1; - } - if (co->co_argcount == 0) { - PyErr_SetString(PyExc_RuntimeError, - "super(): no arguments"); - return -1; - } - obj = f->f_localsplus[0]; - if (obj == NULL && co->co_cell2arg) { - /* The first argument might be a cell. */ - n = PyTuple_GET_SIZE(co->co_cellvars); - for (i = 0; i < n; i++) { - if (co->co_cell2arg[i] == 0) { - PyObject *cell = f->f_localsplus[co->co_nlocals + i]; - assert(PyCell_Check(cell)); - obj = PyCell_GET(cell); - break; - } - } - } - if (obj == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "super(): arg[0] deleted"); - return -1; - } - if (co->co_freevars == NULL) - n = 0; - else { - assert(PyTuple_Check(co->co_freevars)); - n = PyTuple_GET_SIZE(co->co_freevars); - } - for (i = 0; i < n; i++) { - PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i); - assert(PyUnicode_Check(name)); - if (_PyUnicode_EqualToASCIIId(name, &PyId___class__)) { - Py_ssize_t index = co->co_nlocals + - PyTuple_GET_SIZE(co->co_cellvars) + i; - PyObject *cell = f->f_localsplus[index]; - if (cell == NULL || !PyCell_Check(cell)) { - PyErr_SetString(PyExc_RuntimeError, - "super(): bad __class__ cell"); - return -1; - } - type = (PyTypeObject *) PyCell_GET(cell); - if (type == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "super(): empty __class__ cell"); - return -1; - } - if (!PyType_Check(type)) { - PyErr_Format(PyExc_RuntimeError, - "super(): __class__ is not a type (%s)", - Py_TYPE(type)->tp_name); - return -1; - } - break; - } - } - if (type == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "super(): __class__ cell not found"); + + PyCodeObject *code = PyFrame_GetCode(frame); + int res = super_init_without_args(frame, code, &type, &obj); + Py_DECREF(frame); + Py_DECREF(code); + + if (res < 0) { return -1; } } diff --git a/Objects/typeslots.inc b/Objects/typeslots.inc index dc750cc0..ffc9bb2e 100644 --- a/Objects/typeslots.inc +++ b/Objects/typeslots.inc @@ -1,6 +1,6 @@ /* Generated by typeslots.py */ -0, -0, +offsetof(PyHeapTypeObject, as_buffer.bf_getbuffer), +offsetof(PyHeapTypeObject, as_buffer.bf_releasebuffer), offsetof(PyHeapTypeObject, as_mapping.mp_ass_subscript), offsetof(PyHeapTypeObject, as_mapping.mp_length), offsetof(PyHeapTypeObject, as_mapping.mp_subscript), diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 4c2b42f9..4c8c8806 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -40,13 +40,16 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_initconfig.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_bytes_methods.h" #include "pycore_fileutils.h" +#include "pycore_initconfig.h" +#include "pycore_interp.h" // PyInterpreterState.fs_codec #include "pycore_object.h" +#include "pycore_pathconfig.h" #include "pycore_pylifecycle.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyInterpreterState_GET() #include "ucnhash.h" -#include "bytes_methods.h" #include "stringlib/eq.h" #ifdef MS_WINDOWS @@ -117,6 +120,13 @@ extern "C" { _PyUnicode_UTF8_LENGTH(op)) #define _PyUnicode_WSTR(op) \ (((PyASCIIObject*)(op))->wstr) + +/* Don't use deprecated macro of unicodeobject.h */ +#undef PyUnicode_WSTR_LENGTH +#define PyUnicode_WSTR_LENGTH(op) \ + (PyUnicode_IS_COMPACT_ASCII(op) ? \ + ((PyASCIIObject*)op)->length : \ + ((PyCompactUnicodeObject*)op)->wstr_length) #define _PyUnicode_WSTR_LENGTH(op) \ (((PyCompactUnicodeObject*)(op))->wstr_length) #define _PyUnicode_LENGTH(op) \ @@ -195,6 +205,8 @@ extern "C" { # define OVERALLOCATE_FACTOR 4 #endif +#define INTERNED_STRINGS + /* This dictionary holds all interned unicode strings. Note that references to strings in this dictionary are *not* counted in the string's ob_refcnt. When the interned string reaches a refcnt of 0 the string deallocation @@ -203,7 +215,9 @@ extern "C" { Another way to look at this is that to say that the actual reference count of a string is: s->ob_refcnt + (s->state ? 2 : 0) */ +#ifdef INTERNED_STRINGS static PyObject *interned = NULL; +#endif /* The empty Unicode object is shared to improve performance. */ static PyObject *unicode_empty = NULL; @@ -265,6 +279,8 @@ unicode_fill(enum PyUnicode_Kind kind, void *data, Py_UCS4 value, /* Forward declaration */ static inline int _PyUnicodeWriter_WriteCharInline(_PyUnicodeWriter *writer, Py_UCS4 ch); +static inline void +_PyUnicodeWriter_InitWithBuffer(_PyUnicodeWriter *writer, PyObject *buffer); static PyObject * unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, const char *errors); @@ -276,9 +292,13 @@ unicode_decode_utf8(const char *s, Py_ssize_t size, /* List of static strings. */ static _Py_Identifier *static_strings = NULL; +#define LATIN1_SINGLETONS + +#ifdef LATIN1_SINGLETONS /* Single character Unicode strings in the Latin-1 range are being shared as well. */ static PyObject *unicode_latin1[256] = {NULL}; +#endif /* Fast detection of the most frequent whitespace characters */ const unsigned char _Py_ascii_whitespace[] = { @@ -425,6 +445,54 @@ get_error_handler_wide(const wchar_t *errors) } +static inline int +unicode_check_encoding_errors(const char *encoding, const char *errors) +{ + if (encoding == NULL && errors == NULL) { + return 0; + } + + PyInterpreterState *interp = _PyInterpreterState_GET(); +#ifndef Py_DEBUG + /* In release mode, only check in development mode (-X dev) */ + if (!_PyInterpreterState_GetConfig(interp)->dev_mode) { + return 0; + } +#else + /* Always check in debug mode */ +#endif + + /* Avoid calling _PyCodec_Lookup() and PyCodec_LookupError() before the + codec registry is ready: before_PyUnicode_InitEncodings() is called. */ + if (!interp->unicode.fs_codec.encoding) { + return 0; + } + + /* Disable checks during Python finalization. For example, it allows to + call _PyObject_Dump() during finalization for debugging purpose. */ + if (interp->finalizing) { + return 0; + } + + if (encoding != NULL) { + PyObject *handler = _PyCodec_Lookup(encoding); + if (handler == NULL) { + return -1; + } + Py_DECREF(handler); + } + + if (errors != NULL) { + PyObject *handler = PyCodec_LookupError(errors); + if (handler == NULL) { + return -1; + } + Py_DECREF(handler); + } + return 0; +} + + /* The max unicode value is always 0x10FFFF while using the PEP-393 API. This function is kept for backward compatibility with the old API. */ Py_UNICODE @@ -526,7 +594,7 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content) if (check_content && kind != PyUnicode_WCHAR_KIND) { Py_ssize_t i; Py_UCS4 maxchar = 0; - void *data; + const void *data; Py_UCS4 ch; data = PyUnicode_DATA(ascii); @@ -609,8 +677,9 @@ unicode_result_ready(PyObject *unicode) return unicode_empty; } +#ifdef LATIN1_SINGLETONS if (length == 1) { - void *data = PyUnicode_DATA(unicode); + const void *data = PyUnicode_DATA(unicode); int kind = PyUnicode_KIND(unicode); Py_UCS4 ch = PyUnicode_READ(kind, data, 0); if (ch < 256) { @@ -630,6 +699,7 @@ unicode_result_ready(PyObject *unicode) } } } +#endif assert(_PyUnicode_CheckConsistency(unicode, 1)); return unicode; @@ -668,7 +738,7 @@ backslashreplace(_PyBytesWriter *writer, char *str, Py_ssize_t size, i; Py_UCS4 ch; enum PyUnicode_Kind kind; - void *data; + const void *data; assert(PyUnicode_IS_READY(unicode)); kind = PyUnicode_KIND(unicode); @@ -735,7 +805,7 @@ xmlcharrefreplace(_PyBytesWriter *writer, char *str, Py_ssize_t size, i; Py_UCS4 ch; enum PyUnicode_Kind kind; - void *data; + const void *data; assert(PyUnicode_IS_READY(unicode)); kind = PyUnicode_KIND(unicode); @@ -811,7 +881,7 @@ static BLOOM_MASK bloom_linebreak = ~(BLOOM_MASK)0; (BLOOM(bloom_linebreak, (ch)) && Py_UNICODE_ISLINEBREAK(ch))) static inline BLOOM_MASK -make_bloom_mask(int kind, void* ptr, Py_ssize_t len) +make_bloom_mask(int kind, const void* ptr, Py_ssize_t len) { #define BLOOM_UPDATE(TYPE, MASK, PTR, LEN) \ do { \ @@ -901,11 +971,14 @@ ensure_unicode(PyObject *obj) #include "stringlib/find_max_char.h" #include "stringlib/undef.h" +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS #include "stringlib/unicodedefs.h" #include "stringlib/fastsearch.h" #include "stringlib/count.h" #include "stringlib/find.h" #include "stringlib/undef.h" +_Py_COMP_DIAG_POP /* --- Unicode Object ----------------------------------------------------- */ @@ -992,8 +1065,12 @@ resize_compact(PyObject *unicode, Py_ssize_t length) _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; } - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif +#ifdef Py_TRACE_REFS _Py_ForgetReference(unicode); +#endif new_unicode = (PyObject *)PyObject_REALLOC(unicode, new_size); if (new_unicode == NULL) { @@ -1246,16 +1323,16 @@ unicode_kind_name(PyObject *unicode) #ifdef Py_DEBUG /* Functions wrapping macros for use in debugger */ -char *_PyUnicode_utf8(void *unicode_raw){ +const char *_PyUnicode_utf8(void *unicode_raw){ PyObject *unicode = _PyObject_CAST(unicode_raw); return PyUnicode_UTF8(unicode); } -void *_PyUnicode_compact_data(void *unicode_raw) { +const void *_PyUnicode_compact_data(void *unicode_raw) { PyObject *unicode = _PyObject_CAST(unicode_raw); return _PyUnicode_COMPACT_DATA(unicode); } -void *_PyUnicode_data(void *unicode_raw) { +const void *_PyUnicode_data(void *unicode_raw) { PyObject *unicode = _PyObject_CAST(unicode_raw); printf("obj %p\n", (void*)unicode); printf("compact %d\n", PyUnicode_IS_COMPACT(unicode)); @@ -1272,7 +1349,7 @@ _PyUnicode_Dump(PyObject *op) PyASCIIObject *ascii = (PyASCIIObject *)op; PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; PyUnicodeObject *unicode = (PyUnicodeObject *)op; - void *data; + const void *data; if (ascii->state.compact) { @@ -1472,7 +1549,8 @@ _copy_characters(PyObject *to, Py_ssize_t to_start, Py_ssize_t how_many, int check_maxchar) { unsigned int from_kind, to_kind; - void *from_data, *to_data; + const void *from_data; + void *to_data; assert(0 <= how_many); assert(0 <= from_start); @@ -1497,7 +1575,7 @@ _copy_characters(PyObject *to, Py_ssize_t to_start, if (!check_maxchar && PyUnicode_MAX_CHAR_VALUE(from) > PyUnicode_MAX_CHAR_VALUE(to)) { - const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); + Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); Py_UCS4 ch; Py_ssize_t i; for (i=0; i < how_many; i++) { @@ -1515,12 +1593,12 @@ _copy_characters(PyObject *to, Py_ssize_t to_start, check that all written characters are pure ASCII */ Py_UCS4 max_char; max_char = ucs1lib_find_max_char(from_data, - (Py_UCS1*)from_data + how_many); + (const Py_UCS1*)from_data + how_many); if (max_char >= 128) return -1; } memcpy((char*)to_data + to_kind * to_start, - (char*)from_data + from_kind * from_start, + (const char*)from_data + from_kind * from_start, to_kind * how_many); } else if (from_kind == PyUnicode_1BYTE_KIND @@ -1854,26 +1932,32 @@ unicode_dealloc(PyObject *unicode) case SSTATE_INTERNED_MORTAL: /* revive dead object temporarily for DelItem */ - Py_REFCNT(unicode) = 3; - if (PyDict_DelItem(interned, unicode) != 0) - Py_FatalError( - "deletion of interned string failed"); + Py_SET_REFCNT(unicode, 3); +#ifdef INTERNED_STRINGS + if (PyDict_DelItem(interned, unicode) != 0) { + _PyErr_WriteUnraisableMsg("deletion of interned string failed", + NULL); + } +#endif break; case SSTATE_INTERNED_IMMORTAL: - Py_FatalError("Immortal interned string died."); - /* fall through */ + _PyObject_ASSERT_FAILED_MSG(unicode, "Immortal interned string died"); + break; default: - Py_FatalError("Inconsistent interned string state."); + Py_UNREACHABLE(); } - if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) + if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) { PyObject_DEL(_PyUnicode_WSTR(unicode)); - if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) + } + if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { PyObject_DEL(_PyUnicode_UTF8(unicode)); - if (!PyUnicode_IS_COMPACT(unicode) && _PyUnicode_DATA_ANY(unicode)) + } + if (!PyUnicode_IS_COMPACT(unicode) && _PyUnicode_DATA_ANY(unicode)) { PyObject_DEL(_PyUnicode_DATA_ANY(unicode)); + } Py_TYPE(unicode)->tp_free(unicode); } @@ -1882,15 +1966,18 @@ unicode_dealloc(PyObject *unicode) static int unicode_is_singleton(PyObject *unicode) { - PyASCIIObject *ascii = (PyASCIIObject *)unicode; - if (unicode == unicode_empty) + if (unicode == unicode_empty) { return 1; + } +#ifdef LATIN1_SINGLETONS + PyASCIIObject *ascii = (PyASCIIObject *)unicode; if (ascii->state.kind != PyUnicode_WCHAR_KIND && ascii->length == 1) { Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, 0); if (ch < 256 && unicode_latin1[ch] == unicode) return 1; } +#endif return 0; } #endif @@ -1987,12 +2074,12 @@ unicode_write_cstr(PyObject *unicode, Py_ssize_t index, const char *str, Py_ssize_t len) { enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); - void *data = PyUnicode_DATA(unicode); + const void *data = PyUnicode_DATA(unicode); const char *end = str + len; + assert(index + len <= PyUnicode_GET_LENGTH(unicode)); switch (kind) { case PyUnicode_1BYTE_KIND: { - assert(index + len <= PyUnicode_GET_LENGTH(unicode)); #ifdef Py_DEBUG if (PyUnicode_IS_ASCII(unicode)) { Py_UCS4 maxchar = ucs1lib_find_max_char( @@ -2007,7 +2094,6 @@ unicode_write_cstr(PyObject *unicode, Py_ssize_t index, case PyUnicode_2BYTE_KIND: { Py_UCS2 *start = (Py_UCS2 *)data + index; Py_UCS2 *ucs2 = start; - assert(index <= PyUnicode_GET_LENGTH(unicode)); for (; str < end; ++ucs2, ++str) *ucs2 = (Py_UCS2)*str; @@ -2015,33 +2101,46 @@ unicode_write_cstr(PyObject *unicode, Py_ssize_t index, assert((ucs2 - start) <= PyUnicode_GET_LENGTH(unicode)); break; } - default: { + case PyUnicode_4BYTE_KIND: { Py_UCS4 *start = (Py_UCS4 *)data + index; Py_UCS4 *ucs4 = start; - assert(kind == PyUnicode_4BYTE_KIND); - assert(index <= PyUnicode_GET_LENGTH(unicode)); for (; str < end; ++ucs4, ++str) *ucs4 = (Py_UCS4)*str; assert((ucs4 - start) <= PyUnicode_GET_LENGTH(unicode)); + break; } + default: + Py_UNREACHABLE(); } } static PyObject* get_latin1_char(unsigned char ch) { - PyObject *unicode = unicode_latin1[ch]; + PyObject *unicode; + +#ifdef LATIN1_SINGLETONS + unicode = unicode_latin1[ch]; + if (unicode) { + Py_INCREF(unicode); + return unicode; + } +#endif + + unicode = PyUnicode_New(1, ch); if (!unicode) { - unicode = PyUnicode_New(1, ch); - if (!unicode) - return NULL; - PyUnicode_1BYTE_DATA(unicode)[0] = ch; - assert(_PyUnicode_CheckConsistency(unicode, 1)); - unicode_latin1[ch] = unicode; + return NULL; } + + PyUnicode_1BYTE_DATA(unicode)[0] = ch; + assert(_PyUnicode_CheckConsistency(unicode, 1)); + +#ifdef LATIN1_SINGLETONS Py_INCREF(unicode); + unicode_latin1[ch] = unicode; +#endif return unicode; } @@ -2194,8 +2293,8 @@ _PyUnicode_FromId(_Py_Identifier *id) return id->object; } -void -_PyUnicode_ClearStaticStrings() +static void +unicode_clear_static_strings(void) { _Py_Identifier *tmp, *s = static_strings; while (s) { @@ -2342,7 +2441,7 @@ Py_UCS4 _PyUnicode_FindMaxChar(PyObject *unicode, Py_ssize_t start, Py_ssize_t end) { enum PyUnicode_Kind kind; - void *startptr, *endptr; + const void *startptr, *endptr; assert(PyUnicode_IS_READY(unicode)); assert(0 <= start); @@ -2405,13 +2504,15 @@ unicode_adjust_maxchar(PyObject **p_unicode) if (max_char >= 256) return; } - else { + else if (kind == PyUnicode_4BYTE_KIND) { const Py_UCS4 *u = PyUnicode_4BYTE_DATA(unicode); - assert(kind == PyUnicode_4BYTE_KIND); max_char = ucs4lib_find_max_char(u, u + len); if (max_char >= 0x10000) return; } + else + Py_UNREACHABLE(); + copy = PyUnicode_New(len, max_char); if (copy != NULL) _PyUnicode_FastCopyCharacters(copy, 0, unicode, 0, len); @@ -2448,22 +2549,12 @@ _PyUnicode_Copy(PyObject *unicode) /* Widen Unicode objects to larger buffers. Don't write terminating null character. Return NULL on error. */ -void* -_PyUnicode_AsKind(PyObject *s, unsigned int kind) +static void* +unicode_askind(unsigned int skind, void const *data, Py_ssize_t len, unsigned int kind) { - Py_ssize_t len; void *result; - unsigned int skind; - if (PyUnicode_READY(s) == -1) - return NULL; - - len = PyUnicode_GET_LENGTH(s); - skind = PyUnicode_KIND(s); - if (skind >= kind) { - PyErr_SetString(PyExc_SystemError, "invalid widening attempt"); - return NULL; - } + assert(skind < kind); switch (kind) { case PyUnicode_2BYTE_KIND: result = PyMem_New(Py_UCS2, len); @@ -2472,8 +2563,8 @@ _PyUnicode_AsKind(PyObject *s, unsigned int kind) assert(skind == PyUnicode_1BYTE_KIND); _PyUnicode_CONVERT_BYTES( Py_UCS1, Py_UCS2, - PyUnicode_1BYTE_DATA(s), - PyUnicode_1BYTE_DATA(s) + len, + (const Py_UCS1 *)data, + ((const Py_UCS1 *)data) + len, result); return result; case PyUnicode_4BYTE_KIND: @@ -2483,24 +2574,23 @@ _PyUnicode_AsKind(PyObject *s, unsigned int kind) if (skind == PyUnicode_2BYTE_KIND) { _PyUnicode_CONVERT_BYTES( Py_UCS2, Py_UCS4, - PyUnicode_2BYTE_DATA(s), - PyUnicode_2BYTE_DATA(s) + len, + (const Py_UCS2 *)data, + ((const Py_UCS2 *)data) + len, result); } else { assert(skind == PyUnicode_1BYTE_KIND); _PyUnicode_CONVERT_BYTES( Py_UCS1, Py_UCS4, - PyUnicode_1BYTE_DATA(s), - PyUnicode_1BYTE_DATA(s) + len, + (const Py_UCS1 *)data, + ((const Py_UCS1 *)data) + len, result); } return result; default: - break; + Py_UNREACHABLE(); + return NULL; } - PyErr_SetString(PyExc_SystemError, "invalid kind"); - return NULL; } static Py_UCS4* @@ -2508,7 +2598,7 @@ as_ucs4(PyObject *string, Py_UCS4 *target, Py_ssize_t targetsize, int copy_null) { int kind; - void *data; + const void *data; Py_ssize_t len, targetlen; if (PyUnicode_READY(string) == -1) return NULL; @@ -2535,17 +2625,19 @@ as_ucs4(PyObject *string, Py_UCS4 *target, Py_ssize_t targetsize, } } if (kind == PyUnicode_1BYTE_KIND) { - Py_UCS1 *start = (Py_UCS1 *) data; + const Py_UCS1 *start = (const Py_UCS1 *) data; _PyUnicode_CONVERT_BYTES(Py_UCS1, Py_UCS4, start, start + len, target); } else if (kind == PyUnicode_2BYTE_KIND) { - Py_UCS2 *start = (Py_UCS2 *) data; + const Py_UCS2 *start = (const Py_UCS2 *) data; _PyUnicode_CONVERT_BYTES(Py_UCS2, Py_UCS4, start, start + len, target); } - else { - assert(kind == PyUnicode_4BYTE_KIND); + else if (kind == PyUnicode_4BYTE_KIND) { memcpy(target, data, len * sizeof(Py_UCS4)); } + else { + Py_UNREACHABLE(); + } if (copy_null) target[len] = 0; return target; @@ -3215,12 +3307,15 @@ PyUnicode_FromEncodedObject(PyObject *obj, /* Decoding bytes objects is the most common case and should be fast */ if (PyBytes_Check(obj)) { - if (PyBytes_GET_SIZE(obj) == 0) + if (PyBytes_GET_SIZE(obj) == 0) { + if (unicode_check_encoding_errors(encoding, errors) < 0) { + return NULL; + } _Py_RETURN_UNICODE_EMPTY(); - v = PyUnicode_Decode( + } + return PyUnicode_Decode( PyBytes_AS_STRING(obj), PyBytes_GET_SIZE(obj), encoding, errors); - return v; } if (PyUnicode_Check(obj)) { @@ -3239,6 +3334,9 @@ PyUnicode_FromEncodedObject(PyObject *obj, if (buffer.len == 0) { PyBuffer_Release(&buffer); + if (unicode_check_encoding_errors(encoding, errors) < 0) { + return NULL; + } _Py_RETURN_UNICODE_EMPTY(); } @@ -3306,6 +3404,14 @@ PyUnicode_Decode(const char *s, Py_buffer info; char buflower[11]; /* strlen("iso-8859-1\0") == 11, longest shortcut */ + if (unicode_check_encoding_errors(encoding, errors) < 0) { + return NULL; + } + + if (size == 0) { + _Py_RETURN_UNICODE_EMPTY(); + } + if (encoding == NULL) { return PyUnicode_DecodeUTF8Stateful(s, size, errors, NULL); } @@ -3547,39 +3653,35 @@ PyUnicode_EncodeLocale(PyObject *unicode, const char *errors) PyObject * PyUnicode_EncodeFSDefault(PyObject *unicode) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); -#ifdef _Py_FORCE_UTF8_FS_ENCODING - if (interp->fs_codec.encoding) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + struct _Py_unicode_fs_codec *fs_codec = &interp->unicode.fs_codec; + if (fs_codec->utf8) { return unicode_encode_utf8(unicode, - interp->fs_codec.error_handler, - interp->fs_codec.errors); + fs_codec->error_handler, + fs_codec->errors); } - else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); - assert(errors != _Py_ERROR_UNKNOWN); - return unicode_encode_utf8(unicode, errors, NULL); - } -#else - /* Bootstrap check: if the filesystem codec is implemented in Python, we - cannot use it to encode and decode filenames before it is loaded. Load - the Python codec requires to encode at least its own filename. Use the C - implementation of the locale codec until the codec registry is - initialized and the Python codec is loaded. See initfsencoding(). */ - if (interp->fs_codec.encoding) { +#ifndef _Py_FORCE_UTF8_FS_ENCODING + else if (fs_codec->encoding) { return PyUnicode_AsEncodedString(unicode, - interp->fs_codec.encoding, - interp->fs_codec.errors); + fs_codec->encoding, + fs_codec->errors); } +#endif else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); + /* Before _PyUnicode_InitEncodings() is called, the Python codec + machinery is not ready and so cannot be used: + use wcstombs() in this case. */ + const PyConfig *config = _PyInterpreterState_GetConfig(interp); + const wchar_t *filesystem_errors = config->filesystem_errors; + assert(filesystem_errors != NULL); + _Py_error_handler errors = get_error_handler_wide(filesystem_errors); assert(errors != _Py_ERROR_UNKNOWN); +#ifdef _Py_FORCE_UTF8_FS_ENCODING + return unicode_encode_utf8(unicode, errors, NULL); +#else return unicode_encode_locale(unicode, errors, 0); - } #endif + } } PyObject * @@ -3595,6 +3697,10 @@ PyUnicode_AsEncodedString(PyObject *unicode, return NULL; } + if (unicode_check_encoding_errors(encoding, errors) < 0) { + return NULL; + } + if (encoding == NULL) { return _PyUnicode_AsUTF8String(unicode, errors); } @@ -3784,39 +3890,36 @@ PyUnicode_DecodeFSDefault(const char *s) { PyObject* PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); -#ifdef _Py_FORCE_UTF8_FS_ENCODING - if (interp->fs_codec.encoding) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + struct _Py_unicode_fs_codec *fs_codec = &interp->unicode.fs_codec; + if (fs_codec->utf8) { return unicode_decode_utf8(s, size, - interp->fs_codec.error_handler, - interp->fs_codec.errors, + fs_codec->error_handler, + fs_codec->errors, NULL); } +#ifndef _Py_FORCE_UTF8_FS_ENCODING + else if (fs_codec->encoding) { + return PyUnicode_Decode(s, size, + fs_codec->encoding, + fs_codec->errors); + } +#endif else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); + /* Before _PyUnicode_InitEncodings() is called, the Python codec + machinery is not ready and so cannot be used: + use mbstowcs() in this case. */ + const PyConfig *config = _PyInterpreterState_GetConfig(interp); + const wchar_t *filesystem_errors = config->filesystem_errors; + assert(filesystem_errors != NULL); + _Py_error_handler errors = get_error_handler_wide(filesystem_errors); assert(errors != _Py_ERROR_UNKNOWN); +#ifdef _Py_FORCE_UTF8_FS_ENCODING return unicode_decode_utf8(s, size, errors, NULL, NULL); - } #else - /* Bootstrap check: if the filesystem codec is implemented in Python, we - cannot use it to encode and decode filenames before it is loaded. Load - the Python codec requires to encode at least its own filename. Use the C - implementation of the locale codec until the codec registry is - initialized and the Python codec is loaded. See initfsencoding(). */ - if (interp->fs_codec.encoding) { - return PyUnicode_Decode(s, size, - interp->fs_codec.encoding, - interp->fs_codec.errors); - } - else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); return unicode_decode_locale(s, size, errors, 0); - } #endif + } } @@ -3826,7 +3929,7 @@ PyUnicode_FSConverter(PyObject* arg, void* addr) PyObject *path = NULL; PyObject *output = NULL; Py_ssize_t size; - void *data; + const char *data; if (arg == NULL) { Py_DECREF(*(PyObject**)addr); *(PyObject**)addr = NULL; @@ -3931,11 +4034,11 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr) } +static int unicode_fill_utf8(PyObject *unicode); + const char * PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *psize) { - PyObject *bytes; - if (!PyUnicode_Check(unicode)) { PyErr_BadArgument(); return NULL; @@ -3944,21 +4047,9 @@ PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *psize) return NULL; if (PyUnicode_UTF8(unicode) == NULL) { - assert(!PyUnicode_IS_COMPACT_ASCII(unicode)); - bytes = _PyUnicode_AsUTF8String(unicode, NULL); - if (bytes == NULL) - return NULL; - _PyUnicode_UTF8(unicode) = PyObject_MALLOC(PyBytes_GET_SIZE(bytes) + 1); - if (_PyUnicode_UTF8(unicode) == NULL) { - PyErr_NoMemory(); - Py_DECREF(bytes); + if (unicode_fill_utf8(unicode) == -1) { return NULL; } - _PyUnicode_UTF8_LENGTH(unicode) = PyBytes_GET_SIZE(bytes); - memcpy(_PyUnicode_UTF8(unicode), - PyBytes_AS_STRING(bytes), - _PyUnicode_UTF8_LENGTH(unicode) + 1); - Py_DECREF(bytes); } if (psize) @@ -4006,6 +4097,11 @@ PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size) return w; } +/* Deprecated APIs */ + +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + Py_UNICODE * PyUnicode_AsUnicode(PyObject *unicode) { @@ -4044,6 +4140,8 @@ PyUnicode_GetSize(PyObject *unicode) return -1; } +_Py_COMP_DIAG_POP + Py_ssize_t PyUnicode_GetLength(PyObject *unicode) { @@ -4059,7 +4157,7 @@ PyUnicode_GetLength(PyObject *unicode) Py_UCS4 PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index) { - void *data; + const void *data; int kind; if (!PyUnicode_Check(unicode)) { @@ -4190,7 +4288,7 @@ unicode_decode_call_errorhandler_wchar( if (*exceptionObject == NULL) goto onError; - restuple = PyObject_CallFunctionObjArgs(*errorHandler, *exceptionObject, NULL); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) goto onError; if (!PyTuple_Check(restuple)) { @@ -4294,7 +4392,7 @@ unicode_decode_call_errorhandler_writer( if (*exceptionObject == NULL) goto onError; - restuple = PyObject_CallFunctionObjArgs(*errorHandler, *exceptionObject, NULL); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) goto onError; if (!PyTuple_Check(restuple)) { @@ -4661,7 +4759,7 @@ _PyUnicode_EncodeUTF7(PyObject *str, const char *errors) { int kind; - void *data; + const void *data; Py_ssize_t len; PyObject *v; int inShift = 0; @@ -4669,7 +4767,7 @@ _PyUnicode_EncodeUTF7(PyObject *str, unsigned int base64bits = 0; unsigned long base64buffer = 0; char * out; - char * start; + const char * start; if (PyUnicode_READY(str) == -1) return NULL; @@ -4883,16 +4981,6 @@ unicode_decode_utf8(const char *s, Py_ssize_t size, _Py_error_handler error_handler, const char *errors, Py_ssize_t *consumed) { - _PyUnicodeWriter writer; - const char *starts = s; - const char *end = s + size; - - Py_ssize_t startinpos; - Py_ssize_t endinpos; - const char *errmsg = ""; - PyObject *error_handler_obj = NULL; - PyObject *exc = NULL; - if (size == 0) { if (consumed) *consumed = 0; @@ -4906,13 +4994,29 @@ unicode_decode_utf8(const char *s, Py_ssize_t size, return get_latin1_char((unsigned char)s[0]); } - _PyUnicodeWriter_Init(&writer); - writer.min_length = size; - if (_PyUnicodeWriter_Prepare(&writer, writer.min_length, 127) == -1) - goto onError; + const char *starts = s; + const char *end = s + size; + + // fast path: try ASCII string. + PyObject *u = PyUnicode_New(size, 127); + if (u == NULL) { + return NULL; + } + s += ascii_decode(s, end, PyUnicode_1BYTE_DATA(u)); + if (s == end) { + return u; + } + + // Use _PyUnicodeWriter after fast path is failed. + _PyUnicodeWriter writer; + _PyUnicodeWriter_InitWithBuffer(&writer, u); + writer.pos = s - starts; + + Py_ssize_t startinpos, endinpos; + const char *errmsg = ""; + PyObject *error_handler_obj = NULL; + PyObject *exc = NULL; - writer.pos = ascii_decode(s, end, writer.data); - s += writer.pos; while (s < end) { Py_UCS4 ch; int kind = writer.kind; @@ -5315,10 +5419,6 @@ static PyObject * unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, const char *errors) { - enum PyUnicode_Kind kind; - void *data; - Py_ssize_t size; - if (!PyUnicode_Check(unicode)) { PyErr_BadArgument(); return NULL; @@ -5331,9 +5431,12 @@ unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, return PyBytes_FromStringAndSize(PyUnicode_UTF8(unicode), PyUnicode_UTF8_LENGTH(unicode)); - kind = PyUnicode_KIND(unicode); - data = PyUnicode_DATA(unicode); - size = PyUnicode_GET_LENGTH(unicode); + enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); + const void *data = PyUnicode_DATA(unicode); + Py_ssize_t size = PyUnicode_GET_LENGTH(unicode); + + _PyBytesWriter writer; + char *end; switch (kind) { default: @@ -5341,12 +5444,73 @@ unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, case PyUnicode_1BYTE_KIND: /* the string cannot be ASCII, or PyUnicode_UTF8() would be set */ assert(!PyUnicode_IS_ASCII(unicode)); - return ucs1lib_utf8_encoder(unicode, data, size, error_handler, errors); + end = ucs1lib_utf8_encoder(&writer, unicode, data, size, error_handler, errors); + break; case PyUnicode_2BYTE_KIND: - return ucs2lib_utf8_encoder(unicode, data, size, error_handler, errors); + end = ucs2lib_utf8_encoder(&writer, unicode, data, size, error_handler, errors); + break; case PyUnicode_4BYTE_KIND: - return ucs4lib_utf8_encoder(unicode, data, size, error_handler, errors); + end = ucs4lib_utf8_encoder(&writer, unicode, data, size, error_handler, errors); + break; + } + + if (end == NULL) { + _PyBytesWriter_Dealloc(&writer); + return NULL; } + return _PyBytesWriter_Finish(&writer, end); +} + +static int +unicode_fill_utf8(PyObject *unicode) +{ + /* the string cannot be ASCII, or PyUnicode_UTF8() would be set */ + assert(!PyUnicode_IS_ASCII(unicode)); + + enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); + const void *data = PyUnicode_DATA(unicode); + Py_ssize_t size = PyUnicode_GET_LENGTH(unicode); + + _PyBytesWriter writer; + char *end; + + switch (kind) { + default: + Py_UNREACHABLE(); + case PyUnicode_1BYTE_KIND: + end = ucs1lib_utf8_encoder(&writer, unicode, data, size, + _Py_ERROR_STRICT, NULL); + break; + case PyUnicode_2BYTE_KIND: + end = ucs2lib_utf8_encoder(&writer, unicode, data, size, + _Py_ERROR_STRICT, NULL); + break; + case PyUnicode_4BYTE_KIND: + end = ucs4lib_utf8_encoder(&writer, unicode, data, size, + _Py_ERROR_STRICT, NULL); + break; + } + if (end == NULL) { + _PyBytesWriter_Dealloc(&writer); + return -1; + } + + const char *start = writer.use_small_buffer ? writer.small_buffer : + PyBytes_AS_STRING(writer.buffer); + Py_ssize_t len = end - start; + + char *cache = PyObject_MALLOC(len + 1); + if (cache == NULL) { + _PyBytesWriter_Dealloc(&writer); + PyErr_NoMemory(); + return -1; + } + _PyUnicode_UTF8(unicode) = cache; + _PyUnicode_UTF8_LENGTH(unicode) = len; + memcpy(cache, start, len); + cache[len] = '\0'; + _PyBytesWriter_Dealloc(&writer); + return 0; } PyObject * @@ -6313,7 +6477,7 @@ PyUnicode_AsUnicodeEscapeString(PyObject *unicode) PyObject *repr; char *p; enum PyUnicode_Kind kind; - void *data; + const void *data; Py_ssize_t expandsize; /* Initial allocation is based on the longest-possible character @@ -6461,7 +6625,7 @@ PyUnicode_DecodeRawUnicodeEscape(const char *s, length after conversion to the true value. (But decoding error handler might have to resize the string) */ _PyUnicodeWriter_Init(&writer); - writer.min_length = size; + writer.min_length = size; if (_PyUnicodeWriter_Prepare(&writer, size, 127) < 0) { goto onError; } @@ -6567,7 +6731,7 @@ PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode) char *p; Py_ssize_t expandsize, pos; int kind; - void *data; + const void *data; Py_ssize_t len; if (!PyUnicode_Check(unicode)) { @@ -6735,8 +6899,7 @@ unicode_encode_call_errorhandler(const char *errors, if (*exceptionObject == NULL) return NULL; - restuple = PyObject_CallFunctionObjArgs( - *errorHandler, *exceptionObject, NULL); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) return NULL; if (!PyTuple_Check(restuple)) { @@ -6774,7 +6937,7 @@ unicode_encode_ucs1(PyObject *unicode, /* input state */ Py_ssize_t pos=0, size; int kind; - void *data; + const void *data; /* pointer into the output */ char *str; const char *encoding = (limit == 256) ? "latin-1" : "ascii"; @@ -6985,13 +7148,7 @@ PyUnicode_DecodeASCII(const char *s, const char *errors) { const char *starts = s; - _PyUnicodeWriter writer; - int kind; - void *data; - Py_ssize_t startinpos; - Py_ssize_t endinpos; - Py_ssize_t outpos; - const char *e; + const char *e = s + size; PyObject *error_handler_obj = NULL; PyObject *exc = NULL; _Py_error_handler error_handler = _Py_ERROR_UNKNOWN; @@ -7003,20 +7160,25 @@ PyUnicode_DecodeASCII(const char *s, if (size == 1 && (unsigned char)s[0] < 128) return get_latin1_char((unsigned char)s[0]); - _PyUnicodeWriter_Init(&writer); - writer.min_length = size; - if (_PyUnicodeWriter_Prepare(&writer, writer.min_length, 127) < 0) + // Shortcut for simple case + PyObject *u = PyUnicode_New(size, 127); + if (u == NULL) { return NULL; + } + Py_ssize_t outpos = ascii_decode(s, e, PyUnicode_1BYTE_DATA(u)); + if (outpos == size) { + return u; + } - e = s + size; - data = writer.data; - outpos = ascii_decode(s, e, (Py_UCS1 *)data); + _PyUnicodeWriter writer; + _PyUnicodeWriter_InitWithBuffer(&writer, u); writer.pos = outpos; - if (writer.pos == size) - return _PyUnicodeWriter_Finish(&writer); - s += writer.pos; - kind = writer.kind; + s += outpos; + int kind = writer.kind; + void *data = writer.data; + Py_ssize_t startinpos, endinpos; + while (s < e) { unsigned char c = (unsigned char)*s; if (c < 128) { @@ -7690,7 +7852,7 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, else { Py_ssize_t i; enum PyUnicode_Kind kind; - void *data; + const void *data; if (PyUnicode_READY(rep) == -1) { Py_DECREF(rep); @@ -7848,7 +8010,7 @@ charmap_decode_string(const char *s, PyObject *errorHandler = NULL, *exc = NULL; Py_ssize_t maplen; enum PyUnicode_Kind mapkind; - void *mapdata; + const void *mapdata; Py_UCS4 x; unsigned char ch; @@ -7865,7 +8027,7 @@ charmap_decode_string(const char *s, /* fast-path for cp037, cp500 and iso8859_1 encodings. iso8859_1 * is disabled in encoding aliases, latin1 is preferred because * its implementation is faster. */ - Py_UCS1 *mapdata_ucs1 = (Py_UCS1 *)mapdata; + const Py_UCS1 *mapdata_ucs1 = (const Py_UCS1 *)mapdata; Py_UCS1 *outdata = (Py_UCS1 *)writer->data; Py_UCS4 maxchar = writer->maxchar; @@ -7889,7 +8051,7 @@ charmap_decode_string(const char *s, while (s < e) { if (mapkind == PyUnicode_2BYTE_KIND && maplen >= 256) { enum PyUnicode_Kind outkind = writer->kind; - Py_UCS2 *mapdata_ucs2 = (Py_UCS2 *)mapdata; + const Py_UCS2 *mapdata_ucs2 = (const Py_UCS2 *)mapdata; if (outkind == PyUnicode_1BYTE_KIND) { Py_UCS1 *outdata = (Py_UCS1 *)writer->data; Py_UCS4 maxchar = writer->maxchar; @@ -8169,7 +8331,7 @@ PyUnicode_BuildEncodingMap(PyObject* string) unsigned char *mlevel1, *mlevel2, *mlevel3; int count2 = 0, count3 = 0; int kind; - void *data; + const void *data; Py_ssize_t length; Py_UCS4 ch; @@ -8337,7 +8499,7 @@ charmapencode_lookup(Py_UCS4 c, PyObject *mapping) /* wrong return value */ PyErr_Format(PyExc_TypeError, "character mapping must return integer, bytes or None, not %.400s", - x->ob_type->tp_name); + Py_TYPE(x)->tp_name); Py_DECREF(x); return NULL; } @@ -8372,7 +8534,7 @@ charmapencode_output(Py_UCS4 c, PyObject *mapping, char *outstart; Py_ssize_t outsize = PyBytes_GET_SIZE(*outobj); - if (Py_TYPE(mapping) == &EncodingMapType) { + if (Py_IS_TYPE(mapping, &EncodingMapType)) { int res = encoding_map_lookup(c, mapping); Py_ssize_t requiredsize = *outpos+1; if (res == -1) @@ -8433,7 +8595,7 @@ charmap_encoding_error( Py_ssize_t size, repsize; Py_ssize_t newpos; enum PyUnicode_Kind kind; - void *data; + const void *data; Py_ssize_t index; /* startpos for collecting unencodable chars */ Py_ssize_t collstartpos = *inpos; @@ -8451,7 +8613,7 @@ charmap_encoding_error( /* find all unencodable characters */ while (collendpos < size) { PyObject *rep; - if (Py_TYPE(mapping) == &EncodingMapType) { + if (Py_IS_TYPE(mapping, &EncodingMapType)) { ch = PyUnicode_READ_CHAR(unicode, collendpos); val = encoding_map_lookup(ch, mapping); if (val != -1) @@ -8583,7 +8745,7 @@ _PyUnicode_EncodeCharmap(PyObject *unicode, PyObject *error_handler_obj = NULL; PyObject *exc = NULL; _Py_error_handler error_handler = _Py_ERROR_UNKNOWN; - void *data; + const void *data; int kind; if (PyUnicode_READY(unicode) == -1) @@ -8719,8 +8881,7 @@ unicode_translate_call_errorhandler(const char *errors, if (*exceptionObject == NULL) return NULL; - restuple = PyObject_CallFunctionObjArgs( - *errorHandler, *exceptionObject, NULL); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) return NULL; if (!PyTuple_Check(restuple)) { @@ -8916,7 +9077,8 @@ unicode_fast_translate(PyObject *input, PyObject *mapping, { Py_UCS1 ascii_table[128], ch, ch2; Py_ssize_t len; - Py_UCS1 *in, *end, *out; + const Py_UCS1 *in, *end; + Py_UCS1 *out; int res = 0; len = PyUnicode_GET_LENGTH(input); @@ -8965,7 +9127,7 @@ _PyUnicode_TranslateCharmap(PyObject *input, const char *errors) { /* input object */ - char *data; + const void *data; Py_ssize_t size, i; int kind; /* output buffer */ @@ -8984,7 +9146,7 @@ _PyUnicode_TranslateCharmap(PyObject *input, if (PyUnicode_READY(input) == -1) return NULL; - data = (char*)PyUnicode_DATA(input); + data = PyUnicode_DATA(input); kind = PyUnicode_KIND(input); size = PyUnicode_GET_LENGTH(input); @@ -9162,7 +9324,7 @@ PyUnicode_TransformDecimalToASCII(Py_UNICODE *s, Py_ssize_t i; Py_UCS4 maxchar; enum PyUnicode_Kind kind; - void *data; + const void *data; maxchar = 127; for (i = 0; i < length; i++) { @@ -9204,7 +9366,7 @@ PyUnicode_EncodeDecimal(Py_UNICODE *s, PyObject *unicode; Py_ssize_t i; enum PyUnicode_Kind kind; - void *data; + const void *data; if (output == NULL) { PyErr_BadArgument(); @@ -9282,7 +9444,7 @@ any_find_slice(PyObject* s1, PyObject* s2, int direction) { int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2, result; kind1 = PyUnicode_KIND(s1); @@ -9309,7 +9471,7 @@ any_find_slice(PyObject* s1, PyObject* s2, } if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(s2, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return -2; } @@ -9351,8 +9513,9 @@ any_find_slice(PyObject* s1, PyObject* s2, } } + assert((kind2 != kind1) == (buf2 != PyUnicode_DATA(s2))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return result; } @@ -9511,7 +9674,7 @@ PyUnicode_Count(PyObject *str, { Py_ssize_t result; int kind1, kind2; - void *buf1 = NULL, *buf2 = NULL; + const void *buf1 = NULL, *buf2 = NULL; Py_ssize_t len1, len2; if (ensure_unicode(str) < 0 || ensure_unicode(substr) < 0) @@ -9531,7 +9694,7 @@ PyUnicode_Count(PyObject *str, buf1 = PyUnicode_DATA(str); buf2 = PyUnicode_DATA(substr); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(substr, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) goto onError; } @@ -9540,24 +9703,24 @@ PyUnicode_Count(PyObject *str, case PyUnicode_1BYTE_KIND: if (PyUnicode_IS_ASCII(str) && PyUnicode_IS_ASCII(substr)) result = asciilib_count( - ((Py_UCS1*)buf1) + start, end - start, + ((const Py_UCS1*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); else result = ucs1lib_count( - ((Py_UCS1*)buf1) + start, end - start, + ((const Py_UCS1*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; case PyUnicode_2BYTE_KIND: result = ucs2lib_count( - ((Py_UCS2*)buf1) + start, end - start, + ((const Py_UCS2*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; case PyUnicode_4BYTE_KIND: result = ucs4lib_count( - ((Py_UCS4*)buf1) + start, end - start, + ((const Py_UCS4*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; @@ -9565,13 +9728,15 @@ PyUnicode_Count(PyObject *str, Py_UNREACHABLE(); } + assert((kind2 != kind1) == (buf2 != PyUnicode_DATA(substr))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return result; onError: - if (kind2 != kind1 && buf2) - PyMem_Free(buf2); + assert((kind2 != kind1) == (buf2 != PyUnicode_DATA(substr))); + if (kind2 != kind1) + PyMem_Free((void *)buf2); return -1; } @@ -9619,8 +9784,8 @@ tailmatch(PyObject *self, { int kind_self; int kind_sub; - void *data_self; - void *data_sub; + const void *data_self; + const void *data_sub; Py_ssize_t offset; Py_ssize_t i; Py_ssize_t end_sub; @@ -9694,7 +9859,8 @@ static PyObject * ascii_upper_or_lower(PyObject *self, int lower) { Py_ssize_t len = PyUnicode_GET_LENGTH(self); - char *resdata, *data = PyUnicode_DATA(self); + const char *data = PyUnicode_DATA(self); + char *resdata; PyObject *res; res = PyUnicode_New(len, 127); @@ -9709,7 +9875,7 @@ ascii_upper_or_lower(PyObject *self, int lower) } static Py_UCS4 -handle_capital_sigma(int kind, void *data, Py_ssize_t length, Py_ssize_t i) +handle_capital_sigma(int kind, const void *data, Py_ssize_t length, Py_ssize_t i) { Py_ssize_t j; int final_sigma; @@ -9738,7 +9904,7 @@ handle_capital_sigma(int kind, void *data, Py_ssize_t length, Py_ssize_t i) } static int -lower_ucs4(int kind, void *data, Py_ssize_t length, Py_ssize_t i, +lower_ucs4(int kind, const void *data, Py_ssize_t length, Py_ssize_t i, Py_UCS4 c, Py_UCS4 *mapped) { /* Obscure special case. */ @@ -9750,7 +9916,7 @@ lower_ucs4(int kind, void *data, Py_ssize_t length, Py_ssize_t i, } static Py_ssize_t -do_capitalize(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) +do_capitalize(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { Py_ssize_t i, k = 0; int n_res, j; @@ -9774,7 +9940,7 @@ do_capitalize(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *ma } static Py_ssize_t -do_swapcase(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { +do_swapcase(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { Py_ssize_t i, k = 0; for (i = 0; i < length; i++) { @@ -9799,7 +9965,7 @@ do_swapcase(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxc } static Py_ssize_t -do_upper_or_lower(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, +do_upper_or_lower(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar, int lower) { Py_ssize_t i, k = 0; @@ -9820,19 +9986,19 @@ do_upper_or_lower(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, } static Py_ssize_t -do_upper(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) +do_upper(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { return do_upper_or_lower(kind, data, length, res, maxchar, 0); } static Py_ssize_t -do_lower(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) +do_lower(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { return do_upper_or_lower(kind, data, length, res, maxchar, 1); } static Py_ssize_t -do_casefold(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) +do_casefold(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { Py_ssize_t i, k = 0; @@ -9849,7 +10015,7 @@ do_casefold(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxc } static Py_ssize_t -do_title(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) +do_title(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { Py_ssize_t i, k = 0; int previous_is_cased; @@ -9877,12 +10043,13 @@ do_title(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar static PyObject * case_operation(PyObject *self, - Py_ssize_t (*perform)(int, void *, Py_ssize_t, Py_UCS4 *, Py_UCS4 *)) + Py_ssize_t (*perform)(int, const void *, Py_ssize_t, Py_UCS4 *, Py_UCS4 *)) { PyObject *res = NULL; Py_ssize_t length, newlength = 0; int kind, outkind; - void *data, *outdata; + const void *data; + void *outdata; Py_UCS4 maxchar = 0, *tmp, *tmpend; assert(PyUnicode_IS_READY(self)); @@ -10249,7 +10416,7 @@ split(PyObject *self, Py_ssize_t maxcount) { int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2; PyObject* out; @@ -10304,7 +10471,7 @@ split(PyObject *self, buf1 = PyUnicode_DATA(self); buf2 = PyUnicode_DATA(substring); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(substring, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return NULL; } @@ -10329,8 +10496,9 @@ split(PyObject *self, default: out = NULL; } + assert((kind2 != kind1) == (buf2 != PyUnicode_DATA(substring))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return out; } @@ -10340,7 +10508,7 @@ rsplit(PyObject *self, Py_ssize_t maxcount) { int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2; PyObject* out; @@ -10395,7 +10563,7 @@ rsplit(PyObject *self, buf1 = PyUnicode_DATA(self); buf2 = PyUnicode_DATA(substring); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(substring, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return NULL; } @@ -10420,14 +10588,15 @@ rsplit(PyObject *self, default: out = NULL; } + assert((kind2 != kind1) == (buf2 != PyUnicode_DATA(substring))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return out; } static Py_ssize_t -anylib_find(int kind, PyObject *str1, void *buf1, Py_ssize_t len1, - PyObject *str2, void *buf2, Py_ssize_t len2, Py_ssize_t offset) +anylib_find(int kind, PyObject *str1, const void *buf1, Py_ssize_t len1, + PyObject *str2, const void *buf2, Py_ssize_t len2, Py_ssize_t offset) { switch (kind) { case PyUnicode_1BYTE_KIND: @@ -10444,8 +10613,8 @@ anylib_find(int kind, PyObject *str1, void *buf1, Py_ssize_t len1, } static Py_ssize_t -anylib_count(int kind, PyObject *sstr, void* sbuf, Py_ssize_t slen, - PyObject *str1, void *buf1, Py_ssize_t len1, Py_ssize_t maxcount) +anylib_count(int kind, PyObject *sstr, const void* sbuf, Py_ssize_t slen, + PyObject *str1, const void *buf1, Py_ssize_t len1, Py_ssize_t maxcount) { switch (kind) { case PyUnicode_1BYTE_KIND: @@ -10491,9 +10660,9 @@ replace(PyObject *self, PyObject *str1, PyObject *str2, Py_ssize_t maxcount) { PyObject *u; - char *sbuf = PyUnicode_DATA(self); - char *buf1 = PyUnicode_DATA(str1); - char *buf2 = PyUnicode_DATA(str2); + const char *sbuf = PyUnicode_DATA(self); + const void *buf1 = PyUnicode_DATA(str1); + const void *buf2 = PyUnicode_DATA(str2); int srelease = 0, release1 = 0, release2 = 0; int skind = PyUnicode_KIND(self); int kind1 = PyUnicode_KIND(str1); @@ -10504,9 +10673,12 @@ replace(PyObject *self, PyObject *str1, int mayshrink; Py_UCS4 maxchar, maxchar_str1, maxchar_str2; + if (slen < len1) + goto nothing; + if (maxcount < 0) maxcount = PY_SSIZE_T_MAX; - else if (maxcount == 0 || slen == 0) + else if (maxcount == 0) goto nothing; if (str1 == str2) @@ -10551,7 +10723,7 @@ replace(PyObject *self, PyObject *str1, if (kind1 < rkind) { /* widen substring */ - buf1 = _PyUnicode_AsKind(str1, rkind); + buf1 = unicode_askind(kind1, buf1, len1, rkind); if (!buf1) goto error; release1 = 1; } @@ -10560,19 +10732,23 @@ replace(PyObject *self, PyObject *str1, goto nothing; if (rkind > kind2) { /* widen replacement */ - buf2 = _PyUnicode_AsKind(str2, rkind); + buf2 = unicode_askind(kind2, buf2, len2, rkind); if (!buf2) goto error; release2 = 1; } else if (rkind < kind2) { /* widen self and buf1 */ rkind = kind2; - if (release1) PyMem_Free(buf1); - release1 = 0; - sbuf = _PyUnicode_AsKind(self, rkind); + if (release1) { + assert(buf1 != PyUnicode_DATA(str1)); + PyMem_Free((void *)buf1); + buf1 = PyUnicode_DATA(str1); + release1 = 0; + } + sbuf = unicode_askind(skind, sbuf, slen, rkind); if (!sbuf) goto error; srelease = 1; - buf1 = _PyUnicode_AsKind(str1, rkind); + buf1 = unicode_askind(kind1, buf1, len1, rkind); if (!buf1) goto error; release1 = 1; } @@ -10610,7 +10786,7 @@ replace(PyObject *self, PyObject *str1, if (kind1 < rkind) { /* widen substring */ - buf1 = _PyUnicode_AsKind(str1, rkind); + buf1 = unicode_askind(kind1, buf1, len1, rkind); if (!buf1) goto error; release1 = 1; } @@ -10619,19 +10795,23 @@ replace(PyObject *self, PyObject *str1, goto nothing; if (kind2 < rkind) { /* widen replacement */ - buf2 = _PyUnicode_AsKind(str2, rkind); + buf2 = unicode_askind(kind2, buf2, len2, rkind); if (!buf2) goto error; release2 = 1; } else if (kind2 > rkind) { /* widen self and buf1 */ rkind = kind2; - sbuf = _PyUnicode_AsKind(self, rkind); + sbuf = unicode_askind(skind, sbuf, slen, rkind); if (!sbuf) goto error; srelease = 1; - if (release1) PyMem_Free(buf1); - release1 = 0; - buf1 = _PyUnicode_AsKind(str1, rkind); + if (release1) { + assert(buf1 != PyUnicode_DATA(str1)); + PyMem_Free((void *)buf1); + buf1 = PyUnicode_DATA(str1); + release1 = 0; + } + buf1 = unicode_askind(kind1, buf1, len1, rkind); if (!buf1) goto error; release1 = 1; } @@ -10719,32 +10899,41 @@ replace(PyObject *self, PyObject *str1, } done: + assert(srelease == (sbuf != PyUnicode_DATA(self))); + assert(release1 == (buf1 != PyUnicode_DATA(str1))); + assert(release2 == (buf2 != PyUnicode_DATA(str2))); if (srelease) - PyMem_FREE(sbuf); + PyMem_FREE((void *)sbuf); if (release1) - PyMem_FREE(buf1); + PyMem_FREE((void *)buf1); if (release2) - PyMem_FREE(buf2); + PyMem_FREE((void *)buf2); assert(_PyUnicode_CheckConsistency(u, 1)); return u; nothing: /* nothing to replace; return original string (when possible) */ + assert(srelease == (sbuf != PyUnicode_DATA(self))); + assert(release1 == (buf1 != PyUnicode_DATA(str1))); + assert(release2 == (buf2 != PyUnicode_DATA(str2))); if (srelease) - PyMem_FREE(sbuf); + PyMem_FREE((void *)sbuf); if (release1) - PyMem_FREE(buf1); + PyMem_FREE((void *)buf1); if (release2) - PyMem_FREE(buf2); + PyMem_FREE((void *)buf2); return unicode_result_unchanged(self); error: - if (srelease && sbuf) - PyMem_FREE(sbuf); - if (release1 && buf1) - PyMem_FREE(buf1); - if (release2 && buf2) - PyMem_FREE(buf2); + assert(srelease == (sbuf != PyUnicode_DATA(self))); + assert(release1 == (buf1 != PyUnicode_DATA(str1))); + assert(release2 == (buf2 != PyUnicode_DATA(str2))); + if (srelease) + PyMem_FREE((void *)sbuf); + if (release1) + PyMem_FREE((void *)buf1); + if (release2) + PyMem_FREE((void *)buf2); return NULL; } @@ -10881,7 +11070,7 @@ unicode_compare(PyObject *str1, PyObject *str2) while (0) int kind1, kind2; - void *data1, *data2; + const void *data1, *data2; Py_ssize_t len1, len2, len; kind1 = PyUnicode_KIND(str1); @@ -10982,7 +11171,7 @@ static int unicode_compare_eq(PyObject *str1, PyObject *str2) { int kind; - void *data1, *data2; + const void *data1, *data2; Py_ssize_t len; int cmp; @@ -11016,8 +11205,8 @@ PyUnicode_Compare(PyObject *left, PyObject *right) } PyErr_Format(PyExc_TypeError, "Can't compare %.100s and %.100s", - left->ob_type->tp_name, - right->ob_type->tp_name); + Py_TYPE(left)->tp_name, + Py_TYPE(right)->tp_name); return -1; } @@ -11067,7 +11256,7 @@ PyUnicode_CompareWithASCIIString(PyObject* uni, const char* str) return 0; } else { - void *data = PyUnicode_DATA(uni); + const void *data = PyUnicode_DATA(uni); /* Compare Unicode string and source character set string */ for (i = 0; (chr = PyUnicode_READ(kind, data, i)) && str[i]; i++) if (chr != (unsigned char)str[i]) @@ -11127,7 +11316,6 @@ int _PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right) { PyObject *right_uni; - Py_hash_t hash; assert(_PyUnicode_CHECK(left)); assert(right->string); @@ -11159,10 +11347,12 @@ _PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right) if (PyUnicode_CHECK_INTERNED(left)) return 0; +#ifdef INTERNED_STRINGS assert(_PyUnicode_HASH(right_uni) != -1); - hash = _PyUnicode_HASH(left); + Py_hash_t hash = _PyUnicode_HASH(left); if (hash != -1 && hash != _PyUnicode_HASH(right_uni)) return 0; +#endif return unicode_compare_eq(left, right_uni); } @@ -11216,7 +11406,7 @@ int PyUnicode_Contains(PyObject *str, PyObject *substr) { int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2; int result; @@ -11247,7 +11437,7 @@ PyUnicode_Contains(PyObject *str, PyObject *substr) return result; } if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(substr, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return -1; } @@ -11266,8 +11456,9 @@ PyUnicode_Contains(PyObject *str, PyObject *substr) Py_UNREACHABLE(); } + assert((kind2 == kind1) == (buf2 == PyUnicode_DATA(substr))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return result; } @@ -11287,7 +11478,7 @@ PyUnicode_Concat(PyObject *left, PyObject *right) if (!PyUnicode_Check(right)) { PyErr_Format(PyExc_TypeError, "can only concatenate str (not \"%.200s\") to str", - right->ob_type->tp_name); + Py_TYPE(right)->tp_name); return NULL; } if (PyUnicode_READY(right) < 0) @@ -11444,7 +11635,7 @@ unicode_count(PyObject *self, PyObject *args) Py_ssize_t end = PY_SSIZE_T_MAX; PyObject *result; int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2, iresult; if (!parse_args_finds_unicode("count", args, &substring, &start, &end)) @@ -11464,26 +11655,26 @@ unicode_count(PyObject *self, PyObject *args) buf1 = PyUnicode_DATA(self); buf2 = PyUnicode_DATA(substring); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(substring, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return NULL; } switch (kind1) { case PyUnicode_1BYTE_KIND: iresult = ucs1lib_count( - ((Py_UCS1*)buf1) + start, end - start, + ((const Py_UCS1*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; case PyUnicode_2BYTE_KIND: iresult = ucs2lib_count( - ((Py_UCS2*)buf1) + start, end - start, + ((const Py_UCS2*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; case PyUnicode_4BYTE_KIND: iresult = ucs4lib_count( - ((Py_UCS4*)buf1) + start, end - start, + ((const Py_UCS4*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; @@ -11493,8 +11684,9 @@ unicode_count(PyObject *self, PyObject *args) result = PyLong_FromSsize_t(iresult); + assert((kind2 == kind1) == (buf2 == PyUnicode_DATA(substring))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return result; } @@ -11538,7 +11730,8 @@ unicode_expandtabs_impl(PyObject *self, int tabsize) Py_ssize_t i, j, line_pos, src_len, incr; Py_UCS4 ch; PyObject *u; - void *src_data, *dest_data; + const void *src_data; + void *dest_data; int kind; int found; @@ -11644,7 +11837,7 @@ unicode_find(PyObject *self, PyObject *args) static PyObject * unicode_getitem(PyObject *self, Py_ssize_t index) { - void *data; + const void *data; enum PyUnicode_Kind kind; Py_UCS4 ch; @@ -11757,7 +11950,7 @@ unicode_islower_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; int cased; if (PyUnicode_READY(self) == -1) @@ -11802,7 +11995,7 @@ unicode_isupper_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; int cased; if (PyUnicode_READY(self) == -1) @@ -11847,7 +12040,7 @@ unicode_istitle_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; int cased, previous_is_cased; if (PyUnicode_READY(self) == -1) @@ -11905,7 +12098,7 @@ unicode_isspace_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -11945,7 +12138,7 @@ unicode_isalpha_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -11983,7 +12176,7 @@ unicode_isalnum_impl(PyObject *self) /*[clinic end generated code: output=a5a23490ffc3660c input=5c6579bf2e04758c]*/ { int kind; - void *data; + const void *data; Py_ssize_t len, i; if (PyUnicode_READY(self) == -1) @@ -12026,7 +12219,7 @@ unicode_isdecimal_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -12065,7 +12258,7 @@ unicode_isdigit_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -12105,7 +12298,7 @@ unicode_isnumeric_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -12129,25 +12322,22 @@ unicode_isnumeric_impl(PyObject *self) Py_RETURN_TRUE; } -int -PyUnicode_IsIdentifier(PyObject *self) +Py_ssize_t +_PyUnicode_ScanIdentifier(PyObject *self) { - int kind; - void *data; Py_ssize_t i; - Py_UCS4 first; + if (PyUnicode_READY(self) == -1) + return -1; - if (PyUnicode_READY(self) == -1) { - Py_FatalError("identifier not ready"); + Py_ssize_t len = PyUnicode_GET_LENGTH(self); + if (len == 0) { + /* an empty string is not a valid identifier */ return 0; } - /* Special case for empty strings */ - if (PyUnicode_GET_LENGTH(self) == 0) - return 0; - kind = PyUnicode_KIND(self); - data = PyUnicode_DATA(self); - + int kind = PyUnicode_KIND(self); + const void *data = PyUnicode_DATA(self); + Py_UCS4 ch = PyUnicode_READ(kind, data, 0); /* PEP 3131 says that the first character must be in XID_Start and subsequent characters in XID_Continue, and for the ASCII range, the 2.x rules apply (i.e @@ -12156,14 +12346,70 @@ PyUnicode_IsIdentifier(PyObject *self) definition of XID_Start and XID_Continue, it is sufficient to check just for these, except that _ must be allowed as starting an identifier. */ - first = PyUnicode_READ(kind, data, 0); - if (!_PyUnicode_IsXidStart(first) && first != 0x5F /* LOW LINE */) + if (!_PyUnicode_IsXidStart(ch) && ch != 0x5F /* LOW LINE */) { return 0; + } - for (i = 1; i < PyUnicode_GET_LENGTH(self); i++) - if (!_PyUnicode_IsXidContinue(PyUnicode_READ(kind, data, i))) + for (i = 1; i < len; i++) { + ch = PyUnicode_READ(kind, data, i); + if (!_PyUnicode_IsXidContinue(ch)) { + return i; + } + } + return i; +} + +int +PyUnicode_IsIdentifier(PyObject *self) +{ + if (PyUnicode_IS_READY(self)) { + Py_ssize_t i = _PyUnicode_ScanIdentifier(self); + Py_ssize_t len = PyUnicode_GET_LENGTH(self); + /* an empty string is not a valid identifier */ + return len && i == len; + } + else { +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + Py_ssize_t i = 0, len = PyUnicode_GET_SIZE(self); + if (len == 0) { + /* an empty string is not a valid identifier */ return 0; - return 1; + } + + const wchar_t *wstr = _PyUnicode_WSTR(self); + Py_UCS4 ch = wstr[i++]; +#if SIZEOF_WCHAR_T == 2 + if (Py_UNICODE_IS_HIGH_SURROGATE(ch) + && i < len + && Py_UNICODE_IS_LOW_SURROGATE(wstr[i])) + { + ch = Py_UNICODE_JOIN_SURROGATES(ch, wstr[i]); + i++; + } +#endif + if (!_PyUnicode_IsXidStart(ch) && ch != 0x5F /* LOW LINE */) { + return 0; + } + + while (i < len) { + ch = wstr[i++]; +#if SIZEOF_WCHAR_T == 2 + if (Py_UNICODE_IS_HIGH_SURROGATE(ch) + && i < len + && Py_UNICODE_IS_LOW_SURROGATE(wstr[i])) + { + ch = Py_UNICODE_JOIN_SURROGATES(ch, wstr[i]); + i++; + } +#endif + if (!_PyUnicode_IsXidContinue(ch)) { + return 0; + } + } + return 1; +_Py_COMP_DIAG_POP + } } /*[clinic input] @@ -12197,7 +12443,7 @@ unicode_isprintable_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -12302,7 +12548,7 @@ static const char *stripfuncnames[] = {"lstrip", "rstrip", "strip"}; PyObject * _PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj) { - void *data; + const void *data; int kind; Py_ssize_t i, j, len; BLOOM_MASK sepmask; @@ -12352,7 +12598,7 @@ _PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj) PyObject* PyUnicode_Substring(PyObject *self, Py_ssize_t start, Py_ssize_t end) { - unsigned char *data; + const unsigned char *data; int kind; Py_ssize_t length; @@ -12375,7 +12621,7 @@ PyUnicode_Substring(PyObject *self, Py_ssize_t start, Py_ssize_t end) length = end - start; if (PyUnicode_IS_ASCII(self)) { data = PyUnicode_1BYTE_DATA(self); - return _PyUnicode_FromASCII((char*)(data + start), length); + return _PyUnicode_FromASCII((const char*)(data + start), length); } else { kind = PyUnicode_KIND(self); @@ -12397,7 +12643,7 @@ do_strip(PyObject *self, int striptype) len = PyUnicode_GET_LENGTH(self); if (PyUnicode_IS_ASCII(self)) { - Py_UCS1 *data = PyUnicode_1BYTE_DATA(self); + const Py_UCS1 *data = PyUnicode_1BYTE_DATA(self); i = 0; if (striptype != RIGHTSTRIP) { @@ -12423,7 +12669,7 @@ do_strip(PyObject *self, int striptype) } else { int kind = PyUnicode_KIND(self); - void *data = PyUnicode_DATA(self); + const void *data = PyUnicode_DATA(self); i = 0; if (striptype != RIGHTSTRIP) { @@ -12556,8 +12802,8 @@ unicode_repeat(PyObject *str, Py_ssize_t len) assert(PyUnicode_KIND(u) == PyUnicode_KIND(str)); if (PyUnicode_GET_LENGTH(str) == 1) { - const int kind = PyUnicode_KIND(str); - const Py_UCS4 fill_char = PyUnicode_READ(kind, PyUnicode_DATA(str), 0); + int kind = PyUnicode_KIND(str); + Py_UCS4 fill_char = PyUnicode_READ(kind, PyUnicode_DATA(str), 0); if (kind == PyUnicode_1BYTE_KIND) { void *to = PyUnicode_DATA(u); memset(to, (unsigned char)fill_char, len); @@ -12576,7 +12822,7 @@ unicode_repeat(PyObject *str, Py_ssize_t len) else { /* number of characters copied this far */ Py_ssize_t done = PyUnicode_GET_LENGTH(str); - const Py_ssize_t char_size = PyUnicode_KIND(str); + Py_ssize_t char_size = PyUnicode_KIND(str); char *to = (char *) PyUnicode_DATA(u); memcpy(to, PyUnicode_DATA(str), PyUnicode_GET_LENGTH(str) * char_size); @@ -12629,6 +12875,61 @@ unicode_replace_impl(PyObject *self, PyObject *old, PyObject *new, return replace(self, old, new, count); } +/*[clinic input] +str.removeprefix as unicode_removeprefix + + prefix: unicode + / + +Return a str with the given prefix string removed if present. + +If the string starts with the prefix string, return string[len(prefix):]. +Otherwise, return a copy of the original string. +[clinic start generated code]*/ + +static PyObject * +unicode_removeprefix_impl(PyObject *self, PyObject *prefix) +/*[clinic end generated code: output=f1e5945e9763bcb9 input=27ec40b99a37eb88]*/ +{ + int match = tailmatch(self, prefix, 0, PY_SSIZE_T_MAX, -1); + if (match == -1) { + return NULL; + } + if (match) { + return PyUnicode_Substring(self, PyUnicode_GET_LENGTH(prefix), + PyUnicode_GET_LENGTH(self)); + } + return unicode_result_unchanged(self); +} + +/*[clinic input] +str.removesuffix as unicode_removesuffix + + suffix: unicode + / + +Return a str with the given suffix string removed if present. + +If the string ends with the suffix string and that suffix is not empty, +return string[:-len(suffix)]. Otherwise, return a copy of the original +string. +[clinic start generated code]*/ + +static PyObject * +unicode_removesuffix_impl(PyObject *self, PyObject *suffix) +/*[clinic end generated code: output=d36629e227636822 input=12cc32561e769be4]*/ +{ + int match = tailmatch(self, suffix, 0, PY_SSIZE_T_MAX, +1); + if (match == -1) { + return NULL; + } + if (match) { + return PyUnicode_Substring(self, 0, PyUnicode_GET_LENGTH(self) + - PyUnicode_GET_LENGTH(suffix)); + } + return unicode_result_unchanged(self); +} + static PyObject * unicode_repr(PyObject *unicode) { @@ -12637,7 +12938,8 @@ unicode_repr(PyObject *unicode) Py_ssize_t osize, squote, dquote, i, o; Py_UCS4 max, quote; int ikind, okind, unchanged; - void *idata, *odata; + const void *idata; + void *odata; if (PyUnicode_READY(unicode) == -1) return NULL; @@ -12930,7 +13232,7 @@ PyUnicode_Partition(PyObject *str_obj, PyObject *sep_obj) { PyObject* out; int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2; if (ensure_unicode(str_obj) < 0 || ensure_unicode(sep_obj) < 0) @@ -12953,7 +13255,7 @@ PyUnicode_Partition(PyObject *str_obj, PyObject *sep_obj) buf1 = PyUnicode_DATA(str_obj); buf2 = PyUnicode_DATA(sep_obj); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(sep_obj, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return NULL; } @@ -12975,8 +13277,9 @@ PyUnicode_Partition(PyObject *str_obj, PyObject *sep_obj) Py_UNREACHABLE(); } + assert((kind2 == kind1) == (buf2 == PyUnicode_DATA(sep_obj))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return out; } @@ -12987,7 +13290,7 @@ PyUnicode_RPartition(PyObject *str_obj, PyObject *sep_obj) { PyObject* out; int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2; if (ensure_unicode(str_obj) < 0 || ensure_unicode(sep_obj) < 0) @@ -13010,7 +13313,7 @@ PyUnicode_RPartition(PyObject *str_obj, PyObject *sep_obj) buf1 = PyUnicode_DATA(str_obj); buf2 = PyUnicode_DATA(sep_obj); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(sep_obj, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return NULL; } @@ -13032,8 +13335,9 @@ PyUnicode_RPartition(PyObject *str_obj, PyObject *sep_obj) Py_UNREACHABLE(); } + assert((kind2 == kind1) == (buf2 == PyUnicode_DATA(sep_obj))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return out; } @@ -13189,7 +13493,7 @@ unicode_maketrans_impl(PyObject *x, PyObject *y, PyObject *z) return NULL; if (y != NULL) { int x_kind, y_kind, z_kind; - void *x_data, *y_data, *z_data; + const void *x_data, *y_data, *z_data; /* x must be a string too, of equal length */ if (!PyUnicode_Check(x)) { @@ -13238,7 +13542,7 @@ unicode_maketrans_impl(PyObject *x, PyObject *y, PyObject *z) } } else { int kind; - void *data; + const void *data; /* x must be a dict */ if (!PyDict_CheckExact(x)) { @@ -13339,7 +13643,7 @@ unicode_zfill_impl(PyObject *self, Py_ssize_t width) Py_ssize_t fill; PyObject *u; int kind; - void *data; + const void *data; Py_UCS4 chr; if (PyUnicode_READY(self) == -1) @@ -13520,6 +13824,16 @@ _PyUnicodeWriter_Init(_PyUnicodeWriter *writer) assert(writer->kind <= PyUnicode_1BYTE_KIND); } +// Initialize _PyUnicodeWriter with initial buffer +static inline void +_PyUnicodeWriter_InitWithBuffer(_PyUnicodeWriter *writer, PyObject *buffer) +{ + memset(writer, 0, sizeof(*writer)); + writer->buffer = buffer; + _PyUnicodeWriter_Update(writer); + writer->min_length = writer->size; +} + int _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, Py_ssize_t length, Py_UCS4 maxchar) @@ -13932,6 +14246,8 @@ static PyMethodDef unicode_methods[] = { UNICODE_UPPER_METHODDEF {"startswith", (PyCFunction) unicode_startswith, METH_VARARGS, startswith__doc__}, {"endswith", (PyCFunction) unicode_endswith, METH_VARARGS, endswith__doc__}, + UNICODE_REMOVEPREFIX_METHODDEF + UNICODE_REMOVESUFFIX_METHODDEF UNICODE_ISASCII_METHODDEF UNICODE_ISLOWER_METHODDEF UNICODE_ISUPPER_METHODDEF @@ -13991,7 +14307,7 @@ unicode_subscript(PyObject* self, PyObject* item) if (PyUnicode_READY(self) == -1) return NULL; - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; @@ -14002,7 +14318,8 @@ unicode_subscript(PyObject* self, PyObject* item) Py_ssize_t start, stop, step, slicelength, i; size_t cur; PyObject *result; - void *src_data, *dest_data; + const void *src_data; + void *dest_data; int src_kind, dest_kind; Py_UCS4 ch, max_char, kind_limit; @@ -14073,7 +14390,7 @@ struct unicode_formatter_t { enum PyUnicode_Kind fmtkind; Py_ssize_t fmtcnt, fmtpos; - void *fmtdata; + const void *fmtdata; PyObject *fmtstr; _PyUnicodeWriter writer; @@ -14747,7 +15064,7 @@ unicode_format_arg_output(struct unicode_formatter_t *ctx, { Py_ssize_t len; enum PyUnicode_Kind kind; - void *pbuf; + const void *pbuf; Py_ssize_t pindex; Py_UCS4 signchar; Py_ssize_t buflen; @@ -15251,33 +15568,31 @@ _PyUnicode_Init(void) return _PyStatus_OK(); } -/* Finalize the Unicode implementation */ - -int -PyUnicode_ClearFreeList(void) -{ - return 0; -} - void PyUnicode_InternInPlace(PyObject **p) { PyObject *s = *p; - PyObject *t; #ifdef Py_DEBUG assert(s != NULL); assert(_PyUnicode_CHECK(s)); #else - if (s == NULL || !PyUnicode_Check(s)) + if (s == NULL || !PyUnicode_Check(s)) { return; + } #endif + /* If it's a subclass, we don't really know what putting it in the interned dict might do. */ - if (!PyUnicode_CheckExact(s)) + if (!PyUnicode_CheckExact(s)) { return; - if (PyUnicode_CHECK_INTERNED(s)) + } + + if (PyUnicode_CHECK_INTERNED(s)) { return; + } + +#ifdef INTERNED_STRINGS if (interned == NULL) { interned = PyDict_New(); if (interned == NULL) { @@ -15285,22 +15600,28 @@ PyUnicode_InternInPlace(PyObject **p) return; } } + + PyObject *t; Py_ALLOW_RECURSION t = PyDict_SetDefault(interned, s, s); Py_END_ALLOW_RECURSION + if (t == NULL) { PyErr_Clear(); return; } + if (t != s) { Py_INCREF(t); Py_SETREF(*p, t); return; } + /* The two references in interned are not counted by refcnt. The deallocator will take care of this */ - Py_REFCNT(s) -= 2; + Py_SET_REFCNT(s, Py_REFCNT(s) - 2); _PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL; +#endif } void @@ -15328,14 +15649,10 @@ PyUnicode_InternFromString(const char *cp) static void unicode_release_interned(void) { - PyObject *keys; - PyObject *s; - Py_ssize_t i, n; - Py_ssize_t immortal_size = 0, mortal_size = 0; - - if (interned == NULL || !PyDict_Check(interned)) + if (interned == NULL || !PyDict_Check(interned)) { return; - keys = PyDict_Keys(interned); + } + PyObject *keys = PyDict_Keys(interned); if (keys == NULL || !PyList_Check(keys)) { PyErr_Clear(); return; @@ -15346,30 +15663,35 @@ unicode_release_interned(void) rather, we give them their stolen references back, and then clear and DECREF the interned dict. */ - n = PyList_GET_SIZE(keys); + Py_ssize_t n = PyList_GET_SIZE(keys); #ifdef INTERNED_STATS fprintf(stderr, "releasing %" PY_FORMAT_SIZE_T "d interned strings\n", n); + + Py_ssize_t immortal_size = 0, mortal_size = 0; #endif - for (i = 0; i < n; i++) { - s = PyList_GET_ITEM(keys, i); + for (Py_ssize_t i = 0; i < n; i++) { + PyObject *s = PyList_GET_ITEM(keys, i); if (PyUnicode_READY(s) == -1) { Py_UNREACHABLE(); } switch (PyUnicode_CHECK_INTERNED(s)) { - case SSTATE_NOT_INTERNED: - /* XXX Shouldn't happen */ - break; case SSTATE_INTERNED_IMMORTAL: Py_REFCNT(s) += 1; +#ifdef INTERNED_STATS immortal_size += PyUnicode_GET_LENGTH(s); +#endif break; case SSTATE_INTERNED_MORTAL: Py_REFCNT(s) += 2; +#ifdef INTERNED_STATS mortal_size += PyUnicode_GET_LENGTH(s); +#endif break; + case SSTATE_NOT_INTERNED: + /* fall through */ default: - Py_FatalError("Inconsistent interned string state."); + Py_UNREACHABLE(); } _PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED; } @@ -15421,7 +15743,7 @@ unicodeiter_next(unicodeiterobject *it) if (it->it_index < PyUnicode_GET_LENGTH(seq)) { int kind = PyUnicode_KIND(seq); - void *data = PyUnicode_DATA(seq); + const void *data = PyUnicode_DATA(seq); Py_UCS4 chr = PyUnicode_READ(kind, data, it->it_index); item = PyUnicode_FromOrdinal(chr); if (item != NULL) @@ -15642,7 +15964,10 @@ PyUnicode_AsUnicodeCopy(PyObject *unicode) PyErr_BadArgument(); return NULL; } +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS u = PyUnicode_AsUnicodeAndSize(unicode, &len); +_Py_COMP_DIAG_POP if (u == NULL) return NULL; /* Ensure we won't overflow the size. */ @@ -15730,7 +16055,7 @@ static PyStatus init_stdio_encoding(PyThreadState *tstate) { /* Update the stdio encoding to the normalized Python codec name. */ - PyConfig *config = &tstate->interp->config; + PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(tstate->interp); if (config_get_codec_name(&config->stdio_encoding) < 0) { return _PyStatus_ERR("failed to get the Python codec name " "of the stdio encoding"); @@ -15742,7 +16067,7 @@ init_stdio_encoding(PyThreadState *tstate) static int init_fs_codec(PyInterpreterState *interp) { - PyConfig *config = &interp->config; + const PyConfig *config = _PyInterpreterState_GetConfig(interp); _Py_error_handler error_handler; error_handler = get_error_handler_wide(config->filesystem_errors); @@ -15765,11 +16090,18 @@ init_fs_codec(PyInterpreterState *interp) return -1; } - PyMem_RawFree(interp->fs_codec.encoding); - interp->fs_codec.encoding = encoding; - PyMem_RawFree(interp->fs_codec.errors); - interp->fs_codec.errors = errors; - interp->fs_codec.error_handler = error_handler; + struct _Py_unicode_fs_codec *fs_codec = &interp->unicode.fs_codec; + PyMem_RawFree(fs_codec->encoding); + fs_codec->encoding = encoding; + /* encoding has been normalized by init_fs_encoding() */ + fs_codec->utf8 = (strcmp(encoding, "utf-8") == 0); + PyMem_RawFree(fs_codec->errors); + fs_codec->errors = errors; + fs_codec->error_handler = error_handler; + +#ifdef _Py_FORCE_UTF8_FS_ENCODING + assert(fs_codec->utf8 == 1); +#endif /* At this point, PyUnicode_EncodeFSDefault() and PyUnicode_DecodeFSDefault() can now use the Python codec rather than @@ -15777,8 +16109,8 @@ init_fs_codec(PyInterpreterState *interp) /* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors global configuration variables. */ - if (_Py_SetFileSystemEncoding(interp->fs_codec.encoding, - interp->fs_codec.errors) < 0) { + if (_Py_SetFileSystemEncoding(fs_codec->encoding, + fs_codec->errors) < 0) { PyErr_NoMemory(); return -1; } @@ -15794,7 +16126,7 @@ init_fs_encoding(PyThreadState *tstate) /* Update the filesystem encoding to the normalized Python codec name. For example, replace "ANSI_X3.4-1968" (locale encoding) with "ascii" (Python codec name). */ - PyConfig *config = &interp->config; + PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(interp); if (config_get_codec_name(&config->filesystem_encoding) < 0) { _Py_DumpPathConfig(tstate); return _PyStatus_ERR("failed to get the Python codec " @@ -15820,12 +16152,24 @@ _PyUnicode_InitEncodings(PyThreadState *tstate) } +static void +_PyUnicode_FiniEncodings(struct _Py_unicode_fs_codec *fs_codec) +{ + PyMem_RawFree(fs_codec->encoding); + fs_codec->encoding = NULL; + fs_codec->utf8 = 0; + PyMem_RawFree(fs_codec->errors); + fs_codec->errors = NULL; + fs_codec->error_handler = _Py_ERROR_UNKNOWN; +} + + #ifdef MS_WINDOWS int _PyUnicode_EnableLegacyWindowsFSEncoding(void) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - PyConfig *config = &interp->config; + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyConfig *config = (PyConfig *)_PyInterpreterState_GetConfig(interp); /* Set the filesystem encoding to mbcs/replace (PEP 529) */ wchar_t *encoding = _PyMem_RawWcsdup(L"mbcs"); @@ -15848,34 +16192,33 @@ _PyUnicode_EnableLegacyWindowsFSEncoding(void) void -_PyUnicode_Fini(void) +_PyUnicode_Fini(PyThreadState *tstate) { + if (_Py_IsMainInterpreter(tstate)) { #if defined(WITH_VALGRIND) || defined(__INSURE__) - /* Insure++ is a memory analysis tool that aids in discovering - * memory leaks and other memory problems. On Python exit, the - * interned string dictionaries are flagged as being in use at exit - * (which it is). Under normal circumstances, this is fine because - * the memory will be automatically reclaimed by the system. Under - * memory debugging, it's a huge source of useless noise, so we - * trade off slower shutdown for less distraction in the memory - * reports. -baw - */ - unicode_release_interned(); + /* Insure++ is a memory analysis tool that aids in discovering + * memory leaks and other memory problems. On Python exit, the + * interned string dictionaries are flagged as being in use at exit + * (which it is). Under normal circumstances, this is fine because + * the memory will be automatically reclaimed by the system. Under + * memory debugging, it's a huge source of useless noise, so we + * trade off slower shutdown for less distraction in the memory + * reports. -baw + */ + unicode_release_interned(); #endif /* __INSURE__ */ - Py_CLEAR(unicode_empty); + Py_CLEAR(unicode_empty); - for (Py_ssize_t i = 0; i < 256; i++) { - Py_CLEAR(unicode_latin1[i]); +#ifdef LATIN1_SINGLETONS + for (Py_ssize_t i = 0; i < 256; i++) { + Py_CLEAR(unicode_latin1[i]); + } +#endif + unicode_clear_static_strings(); } - _PyUnicode_ClearStaticStrings(); - (void)PyUnicode_ClearFreeList(); - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - PyMem_RawFree(interp->fs_codec.encoding); - interp->fs_codec.encoding = NULL; - PyMem_RawFree(interp->fs_codec.errors); - interp->fs_codec.errors = NULL; + _PyUnicode_FiniEncodings(&tstate->interp->unicode.fs_codec); } diff --git a/Objects/unicodetype_db.h b/Objects/unicodetype_db.h index 693e0b3e..f668ed7a 100644 --- a/Objects/unicodetype_db.h +++ b/Objects/unicodetype_db.h @@ -1782,71 +1782,71 @@ static const unsigned short index1[] = { 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 128, 129, 130, 131, 132, 133, 34, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 144, 34, 34, 151, 144, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 144, 163, 144, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 144, 173, 174, 144, 175, 176, 177, 178, - 144, 179, 180, 144, 181, 182, 183, 144, 144, 184, 185, 186, 187, 144, - 188, 144, 189, 34, 34, 34, 34, 34, 34, 34, 190, 191, 34, 192, 144, 144, + 155, 156, 157, 158, 159, 160, 161, 162, 144, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 144, 174, 175, 144, 176, 177, 178, 179, + 144, 180, 181, 182, 183, 184, 185, 144, 144, 186, 187, 188, 189, 144, + 190, 144, 191, 34, 34, 34, 34, 34, 34, 34, 192, 193, 34, 194, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 34, 34, 34, 34, 34, 34, 34, 34, 193, 144, 144, + 144, 144, 144, 144, 144, 34, 34, 34, 34, 34, 34, 34, 34, 195, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 34, 34, 34, 34, 194, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 34, 34, 34, 34, 196, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 34, 34, 34, 34, 195, 196, 197, 198, 144, 144, 144, 144, 199, - 200, 201, 202, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 144, 144, 34, 34, 34, 34, 197, 198, 199, 200, 144, 144, 144, 144, 201, + 202, 203, 204, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 203, 34, 34, - 34, 34, 34, 204, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 205, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 206, 207, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 34, 34, 205, 34, 34, 206, 144, 144, + 144, 144, 144, 144, 144, 144, 34, 34, 208, 34, 34, 209, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 207, 208, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 210, 211, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 64, - 209, 210, 211, 212, 213, 214, 144, 215, 216, 217, 218, 219, 220, 221, - 222, 64, 64, 64, 64, 223, 224, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 225, 144, 226, 144, 144, 227, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 34, 228, 229, 144, 144, 144, 144, 144, 230, 231, 232, - 144, 233, 234, 144, 144, 235, 236, 237, 238, 239, 144, 64, 240, 64, 64, - 64, 64, 64, 241, 242, 243, 244, 245, 246, 247, 248, 249, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 250, 251, 252, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 86, 253, 34, 254, 255, 34, 34, 34, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 64, 212, + 213, 214, 215, 216, 217, 144, 218, 219, 220, 221, 222, 223, 224, 225, 64, + 64, 64, 64, 226, 227, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 228, 144, 229, 144, 144, 230, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 34, 231, 232, 144, 144, 144, 144, 144, 233, 234, 235, 144, 236, + 237, 144, 144, 238, 239, 240, 241, 242, 144, 64, 243, 64, 64, 64, 64, 64, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 64, 253, 144, 144, 144, 144, + 144, 144, 144, 144, 254, 255, 256, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 86, 257, 34, 258, 259, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 256, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 257, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 260, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 261, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 262, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 258, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 259, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 263, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 264, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 260, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 261, 34, - 262, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 265, 34, 266, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 263, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 267, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 264, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 34, 256, 34, 34, 265, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 268, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 34, 260, 34, 34, 269, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 270, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, @@ -2246,8 +2246,7 @@ static const unsigned short index1[] = { 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 266, 144, - 267, 268, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 271, 144, 272, 273, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, @@ -2283,7 +2282,7 @@ static const unsigned short index1[] = { 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 126, 126, 126, 126, 126, 126, 126, 126, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, @@ -2319,8 +2318,8 @@ static const unsigned short index1[] = { 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 269, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 274, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, @@ -2356,7 +2355,7 @@ static const unsigned short index1[] = { 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 269, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 274, }; static const unsigned short index2[] = { @@ -2435,7 +2434,7 @@ static const unsigned short index2[] = { 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 0, 0, 103, 5, 5, 5, 5, 5, 5, 20, 137, 137, 137, 137, + 136, 136, 136, 136, 0, 0, 103, 5, 5, 5, 5, 5, 6, 20, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 138, 20, 5, 5, 0, 0, 5, 5, 5, 0, 25, 25, @@ -2481,69 +2480,69 @@ static const unsigned short index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 25, 18, 25, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, - 18, 18, 18, 25, 18, 18, 55, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 25, 25, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 5, 103, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 0, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 0, 0, 55, 55, 55, - 55, 0, 0, 25, 55, 18, 18, 18, 25, 25, 25, 25, 0, 0, 18, 18, 0, 0, 18, 18, - 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 55, 55, 0, 55, 55, 55, - 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 5, 5, 27, 27, - 27, 27, 27, 27, 5, 5, 55, 5, 25, 0, 0, 25, 25, 18, 0, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, - 55, 0, 55, 55, 0, 55, 55, 0, 55, 55, 0, 0, 25, 0, 18, 18, 18, 25, 25, 0, - 0, 0, 0, 25, 25, 0, 0, 25, 25, 25, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 55, - 55, 55, 55, 0, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 25, 25, 55, 55, 55, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 18, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, - 25, 55, 18, 18, 18, 25, 25, 25, 25, 25, 0, 25, 25, 18, 0, 18, 18, 25, 0, - 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 25, 25, 0, 0, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 0, 0, 0, 0, 0, 0, 0, 55, 25, - 25, 25, 25, 25, 25, 0, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, - 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, - 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, 18, 25, 25, 25, 25, 0, 0, - 18, 18, 0, 0, 18, 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, 25, 18, 0, 0, 0, 0, 55, - 55, 0, 55, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, - 55, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 55, 0, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, 0, 55, - 55, 0, 55, 0, 55, 55, 0, 0, 0, 55, 55, 0, 0, 0, 55, 55, 55, 0, 0, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 18, 18, 25, 18, - 18, 0, 0, 0, 18, 18, 18, 0, 18, 18, 18, 25, 0, 0, 55, 0, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 25, 18, - 18, 18, 25, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 55, 25, 25, 25, 18, 18, 18, 18, 0, 25, 25, 25, 0, 25, 25, - 25, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 0, 55, 55, 55, 0, 0, 0, 0, 0, 55, - 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, - 0, 5, 27, 27, 27, 27, 27, 27, 27, 5, 55, 25, 18, 18, 5, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 25, 25, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 25, 18, 25, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, + 25, 25, 18, 18, 18, 18, 25, 18, 18, 55, 25, 25, 25, 25, 25, 25, 25, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 5, 5, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 5, 103, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 0, 0, 55, + 55, 55, 55, 0, 0, 25, 55, 18, 18, 18, 25, 25, 25, 25, 0, 0, 18, 18, 0, 0, + 18, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 55, 55, 0, 55, + 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 5, 5, + 27, 27, 27, 27, 27, 27, 5, 5, 55, 5, 25, 0, 0, 25, 25, 18, 0, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, 18, - 18, 18, 18, 18, 0, 25, 18, 18, 0, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0, - 18, 18, 0, 0, 0, 0, 0, 0, 0, 55, 0, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, + 55, 55, 55, 0, 55, 55, 0, 55, 55, 0, 55, 55, 0, 0, 25, 0, 18, 18, 18, 25, + 25, 0, 0, 0, 0, 25, 25, 0, 0, 25, 25, 25, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 0, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 25, 25, 55, 55, 55, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + 25, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, + 0, 0, 25, 55, 18, 18, 18, 25, 25, 25, 25, 25, 0, 25, 25, 18, 0, 18, 18, + 25, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 25, + 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 55, 25, 25, 25, 25, 25, 25, 0, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, + 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, 18, 25, 25, 25, 25, + 0, 0, 18, 18, 0, 0, 18, 18, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 18, 0, 0, 0, + 0, 55, 55, 0, 55, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 5, 55, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 55, + 0, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, + 0, 55, 55, 0, 55, 0, 55, 55, 0, 0, 0, 55, 55, 0, 0, 0, 55, 55, 55, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 18, 18, + 25, 18, 18, 0, 0, 0, 18, 18, 18, 0, 18, 18, 18, 25, 0, 0, 55, 0, 0, 0, 0, + 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 25, + 18, 18, 18, 25, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 55, 25, 25, 25, 18, 18, 18, 18, 0, 25, 25, 25, 0, 25, + 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 0, 55, 55, 55, 0, 0, 0, 0, 0, + 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, + 0, 0, 5, 27, 27, 27, 27, 27, 27, 27, 5, 55, 25, 18, 18, 5, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, + 18, 18, 18, 18, 18, 0, 25, 18, 18, 0, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 55, 0, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, + 25, 25, 18, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 55, 18, 18, 18, 25, 25, 25, 25, 0, 18, 18, 18, 0, 18, 18, 18, 25, 55, 5, 0, 0, 0, 0, 55, 55, 55, 18, 27, 27, 27, 27, 27, 27, 27, 55, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 55, 55, 55, 55, 55, 55, 0, 0, 18, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 55, 55, 55, 55, 55, 55, 0, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, @@ -2698,53 +2697,53 @@ static const unsigned short index2[] = { 0, 0, 25, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 103, 5, 5, 5, 5, 5, 5, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 25, 6, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, - 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 25, 25, - 25, 25, 18, 25, 18, 18, 18, 18, 18, 25, 18, 18, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, + 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 18, 25, 25, 25, 25, 18, 18, 25, 25, 18, 25, 25, 25, 55, - 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 25, + 25, 25, 25, 18, 25, 18, 18, 18, 18, 18, 25, 18, 18, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 18, 25, 25, 25, 25, 18, 18, 25, 25, 18, 25, 25, + 25, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 18, 25, 25, 18, 18, 18, 25, 18, 25, 25, 25, 18, 18, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 18, 18, 18, 18, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, - 25, 25, 18, 18, 25, 25, 0, 0, 0, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 0, 0, 0, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, + 55, 55, 25, 18, 25, 25, 18, 18, 18, 25, 18, 25, 25, 25, 18, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 103, 103, 103, 103, 103, - 5, 5, 245, 246, 247, 248, 249, 250, 251, 252, 253, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, 18, 18, 18, 18, 25, 25, 25, + 25, 25, 25, 25, 25, 18, 18, 25, 25, 0, 0, 0, 5, 5, 5, 5, 5, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 0, 0, 0, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 103, 103, + 103, 103, 103, 5, 5, 245, 246, 247, 248, 249, 250, 251, 252, 253, 0, 0, + 0, 0, 0, 0, 0, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 0, 0, 254, 254, 254, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 25, 25, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, - 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 25, 55, 55, 55, 55, 55, 55, - 25, 55, 55, 18, 25, 25, 55, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, + 254, 254, 254, 254, 0, 0, 254, 254, 254, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 25, 25, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 18, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 25, 55, 55, 55, + 55, 55, 55, 25, 55, 55, 18, 25, 25, 55, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 20, 20, 20, 20, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 102, 255, 20, 20, 20, 256, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 257, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 102, 255, 20, 20, 20, 256, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 257, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 25, 25, 25, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 0, 25, 25, 25, 25, 25, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 25, 25, 25, 0, 25, 25, 25, 25, 25, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, @@ -2752,51 +2751,52 @@ static const unsigned short index2[] = { 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 258, 259, 260, 261, - 262, 263, 20, 20, 264, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 258, 259, + 260, 261, 262, 263, 20, 20, 264, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 265, 265, 265, 265, - 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, 265, 265, - 265, 265, 265, 265, 0, 0, 266, 266, 266, 266, 266, 266, 0, 0, 265, 265, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, + 265, 265, 265, 265, 265, 265, 0, 0, 266, 266, 266, 266, 266, 266, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, - 266, 266, 265, 265, 265, 265, 265, 265, 0, 0, 266, 266, 266, 266, 266, - 266, 0, 0, 267, 265, 268, 265, 269, 265, 270, 265, 0, 266, 0, 266, 0, - 266, 0, 266, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, - 266, 266, 266, 266, 271, 271, 272, 272, 272, 272, 273, 273, 274, 274, - 275, 275, 276, 276, 0, 0, 277, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 265, 265, 325, - 326, 327, 0, 328, 329, 266, 266, 330, 330, 331, 6, 332, 6, 6, 6, 333, - 334, 335, 0, 336, 337, 338, 338, 338, 338, 339, 6, 6, 6, 265, 265, 340, - 341, 0, 0, 342, 343, 266, 266, 344, 344, 0, 6, 6, 6, 265, 265, 345, 346, - 347, 127, 348, 349, 266, 266, 350, 350, 131, 6, 6, 6, 0, 0, 351, 352, - 353, 0, 354, 355, 356, 356, 357, 357, 358, 6, 6, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 21, 21, 21, 21, 21, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 3, 3, 21, 21, 21, 21, 21, 2, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 21, 21, 21, 21, - 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 359, 102, 0, 0, 360, 361, - 362, 363, 364, 365, 5, 5, 5, 5, 5, 102, 359, 26, 22, 23, 360, 361, 362, - 363, 364, 365, 5, 5, 5, 5, 5, 0, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 6, 6, 6, 6, 25, 6, 6, 6, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 121, 5, 5, - 5, 5, 121, 5, 5, 20, 121, 121, 121, 20, 20, 121, 121, 121, 20, 5, 121, 5, - 5, 366, 121, 121, 121, 121, 121, 5, 5, 5, 5, 5, 5, 121, 5, 367, 5, 121, - 5, 368, 369, 121, 121, 366, 20, 121, 121, 370, 121, 20, 55, 55, 55, 55, - 20, 5, 5, 20, 20, 121, 121, 5, 5, 5, 5, 5, 121, 20, 20, 20, 20, 5, 5, 5, - 5, 371, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, - 372, 372, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, - 373, 373, 373, 373, 243, 243, 243, 30, 31, 243, 243, 243, 243, 27, 5, 5, - 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 266, 266, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, + 266, 266, 266, 266, 265, 265, 265, 265, 265, 265, 0, 0, 266, 266, 266, + 266, 266, 266, 0, 0, 267, 265, 268, 265, 269, 265, 270, 265, 0, 266, 0, + 266, 0, 266, 0, 266, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, + 266, 266, 266, 266, 266, 266, 271, 271, 272, 272, 272, 272, 273, 273, + 274, 274, 275, 275, 276, 276, 0, 0, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 265, + 265, 325, 326, 327, 0, 328, 329, 266, 266, 330, 330, 331, 6, 332, 6, 6, + 6, 333, 334, 335, 0, 336, 337, 338, 338, 338, 338, 339, 6, 6, 6, 265, + 265, 340, 341, 0, 0, 342, 343, 266, 266, 344, 344, 0, 6, 6, 6, 265, 265, + 345, 346, 347, 127, 348, 349, 266, 266, 350, 350, 131, 6, 6, 6, 0, 0, + 351, 352, 353, 0, 354, 355, 356, 356, 357, 357, 358, 6, 6, 0, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, 21, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 3, 3, 21, 21, 21, 21, 21, 2, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 21, + 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 359, 102, 0, + 0, 360, 361, 362, 363, 364, 365, 5, 5, 5, 5, 5, 102, 359, 26, 22, 23, + 360, 361, 362, 363, 364, 365, 5, 5, 5, 5, 5, 0, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 6, 6, 6, 6, 25, 6, 6, 6, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 121, 5, 5, 5, 5, 121, 5, 5, 20, 121, 121, 121, 20, 20, 121, 121, + 121, 20, 5, 121, 5, 5, 366, 121, 121, 121, 121, 121, 5, 5, 5, 5, 5, 5, + 121, 5, 367, 5, 121, 5, 368, 369, 121, 121, 366, 20, 121, 121, 370, 121, + 20, 55, 55, 55, 55, 20, 5, 5, 20, 20, 121, 121, 5, 5, 5, 5, 5, 121, 20, + 20, 20, 20, 5, 5, 5, 5, 371, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, + 372, 372, 372, 372, 372, 372, 373, 373, 373, 373, 373, 373, 373, 373, + 373, 373, 373, 373, 373, 373, 373, 373, 243, 243, 243, 30, 31, 243, 243, + 243, 243, 27, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -2807,26 +2807,26 @@ static const unsigned short index2[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 360, 361, 362, 363, 364, - 365, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 374, 374, 374, 374, - 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, - 374, 374, 374, 374, 374, 374, 374, 374, 375, 375, 375, 375, 375, 375, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 22, 23, 360, 361, 362, 363, 364, 365, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 360, 361, 362, + 363, 364, 365, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, + 360, 361, 362, 363, 364, 365, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, + 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, - 375, 375, 375, 375, 375, 375, 359, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 359, 5, 5, 5, 5, 5, 5, + 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 359, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, + 359, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, + 22, 23, 360, 361, 362, 363, 364, 365, 27, 26, 22, 23, 360, 361, 362, 363, + 364, 365, 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, 22, 23, 360, 361, - 362, 363, 364, 365, 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 26, - 22, 23, 360, 361, 362, 363, 364, 365, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -2835,105 +2835,104 @@ static const unsigned short index2[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 136, 136, 136, 136, 136, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 0, 30, 31, 376, 377, 378, 379, 380, 30, 31, - 30, 31, 30, 31, 381, 382, 383, 384, 20, 30, 31, 20, 30, 31, 20, 20, 20, - 20, 20, 102, 102, 385, 385, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 30, 31, 376, 377, + 378, 379, 380, 30, 31, 30, 31, 30, 31, 381, 382, 383, 384, 20, 30, 31, + 20, 30, 31, 20, 20, 20, 20, 20, 102, 102, 385, 385, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 20, - 5, 5, 5, 5, 5, 5, 30, 31, 30, 31, 25, 25, 25, 30, 31, 0, 0, 0, 0, 0, 5, - 5, 5, 5, 27, 5, 5, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 20, 5, 5, 5, 5, 5, 5, 30, 31, 30, 31, 25, 25, 25, 30, + 31, 0, 0, 0, 0, 0, 5, 5, 5, 5, 27, 5, 5, 386, 386, 386, 386, 386, 386, + 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, - 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 0, 386, - 0, 0, 0, 0, 0, 386, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 386, 386, 386, 386, 0, 386, 0, 0, 0, 0, 0, 386, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 103, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 103, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, - 0, 55, 55, 55, 55, 55, 55, 55, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 387, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 387, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 0, 0, 0, 0, 2, 5, 5, 5, 5, 103, 55, 243, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 25, 25, 25, 25, 18, 18, 5, 103, 103, 103, 103, 103, - 5, 5, 243, 243, 243, 103, 55, 5, 5, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 2, 5, 5, 5, 5, 103, 55, + 243, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 243, 243, 243, 243, 243, 243, 243, 243, 243, 25, 25, 25, 25, 18, + 18, 5, 103, 103, 103, 103, 103, 5, 5, 243, 243, 243, 103, 55, 5, 5, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 6, 6, 103, 103, 55, 5, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 6, + 6, 103, 103, 55, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 103, 103, - 103, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 5, 103, 103, 103, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 0, 5, 5, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 5, 5, 27, 27, 27, 27, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 5, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, - 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 27, 27, 27, 27, 27, 27, 27, 27, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -2942,7 +2941,7 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -2951,55 +2950,56 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 388, 55, 55, 388, 55, 55, 55, 388, 55, 388, 55, 55, 55, + 388, 55, 55, 388, 55, 55, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 388, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 388, 55, 55, 55, 55, 55, 55, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, - 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 388, 55, 388, 388, 388, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 388, 388, 388, 55, 55, 55, 55, - 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 388, 388, 388, 55, 55, + 55, 55, 55, 55, 55, 55, 388, 388, 388, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3007,8 +3007,8 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3016,24 +3016,23 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, - 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 388, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 388, 388, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 388, 388, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3045,121 +3044,122 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 388, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, + 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 388, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 103, 103, 103, 103, 103, - 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 5, 5, 5, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 55, 25, 6, 6, 6, - 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 103, 30, 31, 30, 31, 30, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 103, 103, 103, 103, 103, 5, 5, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 5, 5, 5, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 102, 102, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 55, 25, 6, 6, 6, 5, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 103, 30, 31, 30, 31, 30, 31, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 30, 31, 30, 31, 102, 102, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 25, 25, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 6, 6, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 20, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 55, 55, 55, 55, 55, 55, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 25, 25, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 6, 6, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 30, 31, 20, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 102, 20, 20, 20, - 20, 20, 20, 20, 20, 30, 31, 30, 31, 389, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 103, 6, 6, 30, 31, 390, 20, 55, 30, 31, 30, 31, 391, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 392, 393, 394, 395, 392, 20, 396, 397, 398, 399, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 0, 0, 30, 31, 400, 401, 402, 0, 0, 0, 0, 0, 0, 0, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 102, 20, 20, 20, 20, 20, + 20, 20, 20, 30, 31, 30, 31, 389, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 103, 6, 6, 30, 31, 390, 20, 55, 30, 31, 30, 31, 391, 20, 30, 31, 30, 31, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 392, 393, + 394, 395, 392, 20, 396, 397, 398, 399, 30, 31, 30, 31, 30, 31, 30, 31, + 30, 31, 30, 31, 0, 0, 30, 31, 400, 401, 402, 30, 31, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 102, 102, 20, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 55, 102, 102, 20, 55, 55, 55, 55, 55, 55, 55, 25, 55, 55, 55, 25, 55, 55, 55, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 18, 18, 25, 25, 18, 5, 5, 5, 5, 0, 0, 0, 0, 27, 27, 27, 27, + 55, 55, 55, 18, 18, 25, 25, 18, 5, 5, 5, 5, 25, 0, 0, 0, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3203,7 +3203,7 @@ static const unsigned short index2[] = { 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 403, 20, 20, 20, 20, 20, 20, 20, 6, 102, 102, 102, 102, 20, 20, 20, 20, - 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 404, 405, 406, 407, 408, 409, + 20, 20, 20, 20, 20, 103, 6, 6, 0, 0, 0, 0, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, @@ -3335,7 +3335,7 @@ static const unsigned short index2[] = { 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -3473,175 +3473,188 @@ static const unsigned short index2[] = { 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 27, 27, 27, 27, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 25, 25, 5, 0, 0, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 27, 27, 27, 27, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 25, - 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 0, 0, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 18, 55, 55, 55, + 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 18, 18, 25, 25, 5, 5, - 21, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 26, 22, 23, 360, 361, 362, + 363, 364, 365, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 0, 0, 0, 0, 0, 0, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, + 25, 18, 18, 25, 25, 5, 5, 21, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 21, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, - 25, 25, 25, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 55, 18, - 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, + 18, 25, 25, 25, 25, 25, 25, 25, 25, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 5, 5, 5, 5, 55, 18, 18, 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 25, 5, 5, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, - 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 5, 5, 55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 55, 55, 55, 55, 5, 5, 5, 5, 25, - 25, 25, 25, 5, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 5, 55, 5, - 5, 5, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 18, 18, 18, 25, 25, 25, 18, 18, 25, 18, 25, 25, 5, 5, 5, 5, 5, 5, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 55, 55, + 55, 55, 5, 5, 5, 5, 25, 25, 25, 25, 5, 18, 25, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 55, 5, 55, 5, 5, 5, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 18, 18, 25, + 18, 25, 25, 5, 5, 5, 5, 5, 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, - 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 0, - 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 5, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 18, - 18, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 18, 18, 0, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, - 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 0, 25, 25, 55, 18, 18, 25, 18, - 18, 18, 18, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, 55, 0, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 18, 18, 0, 0, 25, 25, 25, 25, 25, - 25, 25, 0, 0, 0, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 25, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, + 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, + 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, - 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 25, 25, 25, 18, 25, 55, 55, - 55, 55, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 5, 0, 5, - 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, + 0, 25, 25, 55, 18, 18, 25, 18, 18, 18, 18, 0, 0, 18, 18, 0, 0, 18, 18, + 18, 0, 0, 55, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 18, 18, 0, 0, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 18, 25, 18, 18, 18, 18, 25, 25, - 18, 25, 25, 55, 55, 5, 55, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, + 18, 25, 25, 25, 18, 25, 55, 55, 55, 55, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 5, 5, 0, 5, 25, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 0, 0, 18, 18, 18, - 18, 25, 25, 18, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, + 25, 18, 25, 18, 18, 18, 18, 25, 25, 18, 25, 25, 55, 55, 5, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, - 25, 25, 25, 25, 25, 25, 18, 18, 25, 18, 25, 25, 5, 5, 5, 55, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, - 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, + 18, 25, 25, 25, 25, 0, 0, 18, 18, 18, 18, 25, 25, 18, 25, 25, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, + 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 18, - 18, 25, 25, 25, 25, 25, 25, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 25, 25, 25, 18, 18, 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, 0, - 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 25, 18, + 25, 25, 5, 5, 5, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, 5, 0, 0, 0, + 55, 55, 55, 55, 25, 18, 25, 18, 18, 25, 25, 25, 25, 25, 25, 18, 25, 55, + 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 18, 18, 25, 25, + 25, 25, 18, 25, 25, 25, 25, 25, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 27, 27, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 18, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19, 19, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, + 19, 19, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 18, 18, 18, 18, 18, 18, 0, 18, 18, 0, 0, 25, 25, 18, 25, + 55, 18, 55, 18, 25, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 0, 0, 25, 25, 18, 18, 18, 18, 25, - 55, 5, 55, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, + 25, 25, 25, 25, 0, 0, 25, 25, 18, 18, 18, 18, 25, 55, 5, 55, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, + 25, 25, 25, 18, 55, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 25, 25, 25, 25, 25, 25, 18, 18, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 25, 25, 25, 25, 25, 25, 18, 55, 25, 25, 25, 25, 5, 5, 5, 5, - 5, 5, 5, 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 55, 25, 25, 25, 25, 25, 25, 18, - 18, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, 5, 5, 5, 55, 5, 5, 5, 5, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 18, 25, 25, 5, 5, 5, 55, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 18, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, - 25, 25, 18, 25, 55, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 5, 5, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 18, 25, 25, 25, 25, 25, - 25, 25, 18, 25, 25, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, + 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 18, 25, 55, 5, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 0, 0, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 0, 18, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, 18, + 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 0, 25, 25, 0, 25, 25, - 25, 25, 25, 25, 25, 55, 25, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, + 25, 25, 25, 0, 0, 0, 25, 0, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 55, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, + 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, - 18, 0, 25, 25, 0, 18, 18, 25, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, 18, 0, 25, 25, 0, 18, 18, + 25, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 25, 18, 18, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 18, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 243, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, @@ -3649,95 +3662,100 @@ static const unsigned short index2[] = { 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 0, 5, 5, 5, 5, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 243, 243, 243, 243, 243, 243, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, + 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, + 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 25, - 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 25, 25, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 103, - 103, 103, 103, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 0, 27, 27, 27, 27, 27, 27, 27, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, + 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 103, 103, 103, 103, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 27, + 27, 27, 27, 27, 27, 27, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 25, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 25, 55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, + 0, 0, 0, 0, 25, 25, 25, 25, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 103, 103, 5, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, + 103, 5, 103, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3745,63 +3763,63 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 5, - 25, 25, 5, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, + 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 5, 25, + 25, 5, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 25, 25, 25, - 5, 5, 5, 18, 18, 18, 18, 18, 18, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, - 25, 25, 25, 25, 25, 25, 5, 5, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 25, 25, 25, 5, 5, + 5, 18, 18, 18, 18, 18, 18, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, + 25, 25, 25, 25, 25, 5, 5, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 0, 0, 0, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 0, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, + 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, + 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 121, 0, 121, 121, 0, 0, 121, 0, 0, 121, 121, 0, 0, 121, 121, 121, + 20, 121, 0, 121, 121, 0, 0, 121, 0, 0, 121, 121, 0, 0, 121, 121, 121, 121, 0, 121, 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 0, 20, 0, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, @@ -3940,16 +3958,16 @@ static const unsigned short index2[] = { 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 359, 26, 22, 23, 360, 361, 362, 363, 364, - 365, 27, 27, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 365, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 5, 5, 5, 5, 5, 5, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, - 502, 502, 502, 502, 502, 502, 502, 502, 5, 5, 5, 0, 0, 0, 502, 502, 502, + 502, 502, 502, 502, 502, 502, 502, 502, 5, 5, 5, 5, 5, 5, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3966,9 +3984,9 @@ static const unsigned short index2[] = { 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -3986,55 +4004,60 @@ static const unsigned short index2[] = { 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, - 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -4045,31 +4068,32 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, + 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -4080,33 +4104,31 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -4115,20 +4137,28 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, @@ -4142,13 +4172,13 @@ static const unsigned short index2[] = { 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, }; /* Returns the numeric value as double for Unicode characters @@ -4221,6 +4251,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C0: case 0x11730: case 0x118E0: + case 0x11950: case 0x11C50: case 0x11D50: case 0x11DA0: @@ -4240,6 +4271,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1F101: case 0x1F10B: case 0x1F10C: + case 0x1FBF0: return (double) 0.0; case 0x0031: case 0x00B9: @@ -4332,6 +4364,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10E60: case 0x10F1D: case 0x10F51: + case 0x10FC5: case 0x11052: case 0x11067: case 0x110F1: @@ -4345,6 +4378,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C1: case 0x11731: case 0x118E1: + case 0x11951: case 0x11C51: case 0x11C5A: case 0x11D51: @@ -4377,6 +4411,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ECB1: case 0x1ED01: case 0x1F102: + case 0x1FBF1: case 0x2092A: return (double) 1.0; case 0x0D5C: @@ -4518,6 +4553,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10E69: case 0x10F22: case 0x10F52: + case 0x10FC9: case 0x1105B: case 0x111EA: case 0x1173A: @@ -4561,6 +4597,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10E72: case 0x10F25: case 0x10F54: + case 0x10FCB: case 0x11064: case 0x111F3: case 0x11C6C: @@ -4791,6 +4828,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10D32: case 0x10E61: case 0x10F1E: + case 0x10FC6: case 0x11053: case 0x11068: case 0x110F2: @@ -4804,6 +4842,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C2: case 0x11732: case 0x118E2: + case 0x11952: case 0x11C52: case 0x11C5B: case 0x11D52: @@ -4840,6 +4879,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED02: case 0x1ED2F: case 0x1F103: + case 0x1FBF2: case 0x22390: return (double) 2.0; case 0x109F7: @@ -4880,6 +4920,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10E6A: case 0x10F23: case 0x10F53: + case 0x10FCA: case 0x1105C: case 0x111EB: case 0x1173B: @@ -5012,6 +5053,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10D33: case 0x10E62: case 0x10F1F: + case 0x10FC7: case 0x11054: case 0x11069: case 0x110F3: @@ -5025,6 +5067,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C3: case 0x11733: case 0x118E3: + case 0x11953: case 0x11C53: case 0x11C5C: case 0x11D53: @@ -5065,6 +5108,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED03: case 0x1ED30: case 0x1F104: + case 0x1FBF3: case 0x20AFD: case 0x20B19: case 0x22998: @@ -5231,6 +5275,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10D34: case 0x10E63: case 0x10F20: + case 0x10FC8: case 0x11055: case 0x1106A: case 0x110F4: @@ -5244,6 +5289,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C4: case 0x11734: case 0x118E4: + case 0x11954: case 0x11C54: case 0x11C5D: case 0x11D54: @@ -5284,6 +5330,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED04: case 0x1ED31: case 0x1F105: + case 0x1FBF4: case 0x20064: case 0x200E2: case 0x2626D: @@ -5440,6 +5487,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C5: case 0x11735: case 0x118E5: + case 0x11955: case 0x11C55: case 0x11C5E: case 0x11D55: @@ -5477,6 +5525,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED05: case 0x1ED32: case 0x1F106: + case 0x1FBF5: case 0x20121: return (double) 5.0; case 0x109FA: @@ -5633,6 +5682,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C6: case 0x11736: case 0x118E6: + case 0x11956: case 0x11C56: case 0x11C5F: case 0x11D56: @@ -5664,6 +5714,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED06: case 0x1ED33: case 0x1F107: + case 0x1FBF6: case 0x20AEA: return (double) 6.0; case 0x109FB: @@ -5779,6 +5830,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C7: case 0x11737: case 0x118E7: + case 0x11957: case 0x11C57: case 0x11C60: case 0x11D57: @@ -5811,6 +5863,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED07: case 0x1ED34: case 0x1F108: + case 0x1FBF7: case 0x20001: return (double) 7.0; case 0x109FC: @@ -5927,6 +5980,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C8: case 0x11738: case 0x118E8: + case 0x11958: case 0x11C58: case 0x11C61: case 0x11D58: @@ -5958,6 +6012,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED08: case 0x1ED35: case 0x1F109: + case 0x1FBF8: return (double) 8.0; case 0x109FD: return (double) 8.0/12.0; @@ -6069,6 +6124,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C9: case 0x11739: case 0x118E9: + case 0x11959: case 0x11C59: case 0x11C62: case 0x11D59: @@ -6102,6 +6158,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED09: case 0x1ED36: case 0x1F10A: + case 0x1FBF9: case 0x2F890: return (double) 9.0; case 0x109FE: diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index 58fe09fa..313e8aba 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -1,9 +1,10 @@ #include "Python.h" -#include "structmember.h" +#include "pycore_object.h" // _PyObject_GET_WEAKREFS_LISTPTR() +#include "structmember.h" // PyMemberDef #define GET_WEAKREFS_LISTPTR(o) \ - ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o)) + ((PyWeakReference **) _PyObject_GET_WEAKREFS_LISTPTR(o)) Py_ssize_t @@ -361,6 +362,12 @@ static PyMemberDef weakref_members[] = { {NULL} /* Sentinel */ }; +static PyMethodDef weakref_methods[] = { + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, + {NULL} /* Sentinel */ +}; + PyTypeObject _PyWeakref_RefType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) @@ -391,7 +398,7 @@ _PyWeakref_RefType = { 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ - 0, /*tp_methods*/ + weakref_methods, /*tp_methods*/ weakref_members, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ @@ -478,7 +485,7 @@ proxy_checkref(PyWeakReference *proxy) _Py_IDENTIFIER(special); \ UNWRAP(proxy); \ Py_INCREF(proxy); \ - PyObject* res = _PyObject_CallMethodId(proxy, &PyId_##special, NULL); \ + PyObject* res = _PyObject_CallMethodIdNoArgs(proxy, &PyId_##special); \ Py_DECREF(proxy); \ return res; \ } @@ -658,10 +665,12 @@ proxy_iternext(PyWeakReference *proxy) WRAP_METHOD(proxy_bytes, __bytes__) +WRAP_METHOD(proxy_reversed, __reversed__) static PyMethodDef proxy_methods[] = { {"__bytes__", proxy_bytes, METH_NOARGS}, + {"__reversed__", proxy_reversed, METH_NOARGS}, {NULL, NULL} }; @@ -723,6 +732,21 @@ static PyMappingMethods proxy_as_mapping = { }; +static Py_hash_t +proxy_hash(PyObject *self) +{ + PyWeakReference *proxy = (PyWeakReference *)self; + if (!proxy_checkref(proxy)) { + return -1; + } + PyObject *obj = PyWeakref_GET_OBJECT(proxy); + Py_INCREF(obj); + Py_hash_t res = PyObject_Hash(obj); + Py_DECREF(obj); + return res; +} + + PyTypeObject _PyWeakref_ProxyType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) @@ -739,7 +763,7 @@ _PyWeakref_ProxyType = { &proxy_as_number, /* tp_as_number */ &proxy_as_sequence, /* tp_as_sequence */ &proxy_as_mapping, /* tp_as_mapping */ - 0, /* tp_hash */ + proxy_hash, /* tp_hash */ 0, /* tp_call */ proxy_str, /* tp_str */ proxy_getattr, /* tp_getattro */ @@ -882,10 +906,12 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback) if (result != NULL) { PyWeakReference *prev; - if (PyCallable_Check(ob)) - Py_TYPE(result) = &_PyWeakref_CallableProxyType; - else - Py_TYPE(result) = &_PyWeakref_ProxyType; + if (PyCallable_Check(ob)) { + Py_SET_TYPE(result, &_PyWeakref_CallableProxyType); + } + else { + Py_SET_TYPE(result, &_PyWeakref_ProxyType); + } get_basic_refs(*list, &ref, &proxy); if (callback == NULL) { if (proxy != NULL) { @@ -931,7 +957,7 @@ PyWeakref_GetObject(PyObject *ref) static void handle_callback(PyWeakReference *ref, PyObject *callback) { - PyObject *cbresult = PyObject_CallFunctionObjArgs(callback, ref, NULL); + PyObject *cbresult = PyObject_CallOneArg(callback, (PyObject *)ref); if (cbresult == NULL) PyErr_WriteUnraisable(callback); @@ -952,7 +978,8 @@ PyObject_ClearWeakRefs(PyObject *object) if (object == NULL || !PyType_SUPPORTS_WEAKREFS(Py_TYPE(object)) - || object->ob_refcnt != 0) { + || Py_REFCNT(object) != 0) + { PyErr_BadInternalCall(); return; } @@ -975,8 +1002,9 @@ PyObject_ClearWeakRefs(PyObject *object) current->wr_callback = NULL; clear_weakref(current); if (callback != NULL) { - if (((PyObject *)current)->ob_refcnt > 0) + if (Py_REFCNT((PyObject *)current) > 0) { handle_callback(current, callback); + } Py_DECREF(callback); } } @@ -993,8 +1021,7 @@ PyObject_ClearWeakRefs(PyObject *object) for (i = 0; i < count; ++i) { PyWeakReference *next = current->wr_next; - if (((PyObject *)current)->ob_refcnt > 0) - { + if (Py_REFCNT((PyObject *)current) > 0) { Py_INCREF(current); PyTuple_SET_ITEM(tuple, i * 2, (PyObject *) current); PyTuple_SET_ITEM(tuple, i * 2 + 1, current->wr_callback); diff --git a/PC/_msi.c b/PC/_msi.c index 5079a524..58c1cfd9 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -531,7 +531,7 @@ static PyTypeObject record_Type = { static PyObject* record_new(MSIHANDLE h) { - msiobj *result = PyObject_NEW(struct msiobj, &record_Type); + msiobj *result = PyObject_New(struct msiobj, &record_Type); if (!result) { MsiCloseHandle(h); @@ -882,7 +882,7 @@ msidb_openview(msiobj *msidb, PyObject *args) if ((status = MsiDatabaseOpenViewW(msidb->h, sql, &hView)) != ERROR_SUCCESS) return msierror(status); - result = PyObject_NEW(struct msiobj, &msiview_Type); + result = PyObject_New(struct msiobj, &msiview_Type); if (!result) { MsiCloseHandle(hView); return NULL; @@ -918,7 +918,7 @@ msidb_getsummaryinformation(msiobj *db, PyObject *args) if (status != ERROR_SUCCESS) return msierror(status); - oresult = PyObject_NEW(struct msiobj, &summary_Type); + oresult = PyObject_New(struct msiobj, &summary_Type); if (!oresult) { MsiCloseHandle(result); return NULL; @@ -1013,7 +1013,7 @@ static PyObject* msiopendb(PyObject *obj, PyObject *args) if (status != ERROR_SUCCESS) return msierror(status); - result = PyObject_NEW(struct msiobj, &msidb_Type); + result = PyObject_New(struct msiobj, &msidb_Type); if (!result) { MsiCloseHandle(h); return NULL; diff --git a/PC/_testconsole.c b/PC/_testconsole.c index 1823ff2c..b62f21c3 100644 --- a/PC/_testconsole.c +++ b/PC/_testconsole.c @@ -55,10 +55,9 @@ _testconsole_write_input_impl(PyObject *module, PyObject *file, const wchar_t *p = (const wchar_t *)PyBytes_AS_STRING(s); DWORD size = (DWORD)PyBytes_GET_SIZE(s) / sizeof(wchar_t); - rec = (INPUT_RECORD*)PyMem_Malloc(sizeof(INPUT_RECORD) * size); + rec = (INPUT_RECORD*)PyMem_Calloc(size, sizeof(INPUT_RECORD)); if (!rec) goto error; - memset(rec, 0, sizeof(INPUT_RECORD) * size); INPUT_RECORD *prec = rec; for (DWORD i = 0; i < size; ++i, ++p, ++prec) { diff --git a/PC/bdist_wininst/bdist_wininst.vcxproj b/PC/bdist_wininst/bdist_wininst.vcxproj index ababce83..287ec54e 100644 --- a/PC/bdist_wininst/bdist_wininst.vcxproj +++ b/PC/bdist_wininst/bdist_wininst.vcxproj @@ -87,7 +87,7 @@ MinSpace - $(PySourcePath)Modules\zlib;%(AdditionalIncludeDirectories) + $(zlibDir);%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) MultiThreadedDebug MultiThreaded @@ -102,15 +102,16 @@ - - - - - - + + + + + + + diff --git a/PC/bdist_wininst/bdist_wininst.vcxproj.filters b/PC/bdist_wininst/bdist_wininst.vcxproj.filters index a47ac864..579a089a 100644 --- a/PC/bdist_wininst/bdist_wininst.vcxproj.filters +++ b/PC/bdist_wininst/bdist_wininst.vcxproj.filters @@ -16,45 +16,51 @@ {0c77c1cf-3f87-4f87-bd86-b425211c2181} ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + {d10220c7-69e3-47c5-8d82-c8e0d4d2ac88} + - + Source Files - + Source Files - + Source Files\zlib - + Source Files\zlib - + Source Files\zlib - + Source Files\zlib - + Source Files\zlib - + Source Files\zlib - - Header Files - - - - + Resource Files - + + Header Files + + + Header Files\zlib + + + + Resource Files diff --git a/PC/bdist_wininst/install.c b/PC/bdist_wininst/install.c index 72d9837f..5d775425 100644 --- a/PC/bdist_wininst/install.c +++ b/PC/bdist_wininst/install.c @@ -2541,7 +2541,7 @@ int DoUninstall(int argc, char **argv) if (!lines) return SystemError(0, "Out of memory"); - /* Read the whole logfile, realloacting the buffer */ + /* Read the whole logfile, reallocating the buffer */ while (fgets(buffer, sizeof(buffer), logfile)) { int len = strlen(buffer); /* remove trailing white space */ diff --git a/PC/config.c b/PC/config.c index 8eaeb31c..32af2a81 100644 --- a/PC/config.c +++ b/PC/config.c @@ -75,6 +75,8 @@ extern PyObject* PyInit__opcode(void); extern PyObject* PyInit__contextvars(void); +extern PyObject* PyInit__peg_parser(void); + /* tools/freeze/makeconfig.py marker for additional "extern" */ /* -- ADDMODULE MARKER 1 -- */ @@ -169,6 +171,7 @@ struct _inittab _PyImport_Inittab[] = { {"_opcode", PyInit__opcode}, {"_contextvars", PyInit__contextvars}, + {"_peg_parser", PyInit__peg_parser}, /* Sentinel */ {0, 0} diff --git a/PC/dl_nt.c b/PC/dl_nt.c index c87c51eb..7f17ee16 100644 --- a/PC/dl_nt.c +++ b/PC/dl_nt.c @@ -12,78 +12,10 @@ forgotten) from the programmer. #include "windows.h" #ifdef Py_ENABLE_SHARED -#ifdef MS_DLL_ID -// The string is available at build, so fill the buffer immediately -char dllVersionBuffer[16] = MS_DLL_ID; -#else -char dllVersionBuffer[16] = ""; // a private buffer -#endif // Python Globals HMODULE PyWin_DLLhModule = NULL; -const char *PyWin_DLLVersionString = dllVersionBuffer; - -#if HAVE_SXS -// Windows "Activation Context" work. -// Our .pyd extension modules are generally built without a manifest (ie, -// those included with Python and those built with a default distutils. -// This requires we perform some "activation context" magic when loading our -// extensions. In summary: -// * As our DLL loads we save the context being used. -// * Before loading our extensions we re-activate our saved context. -// * After extension load is complete we restore the old context. -// As an added complication, this magic only works on XP or later - we simply -// use the existence (or not) of the relevant function pointers from kernel32. -// See bug 4566 (http://python.org/sf/4566) for more details. -// In Visual Studio 2010, side by side assemblies are no longer used by -// default. - -typedef BOOL (WINAPI * PFN_GETCURRENTACTCTX)(HANDLE *); -typedef BOOL (WINAPI * PFN_ACTIVATEACTCTX)(HANDLE, ULONG_PTR *); -typedef BOOL (WINAPI * PFN_DEACTIVATEACTCTX)(DWORD, ULONG_PTR); -typedef BOOL (WINAPI * PFN_ADDREFACTCTX)(HANDLE); -typedef BOOL (WINAPI * PFN_RELEASEACTCTX)(HANDLE); - -// locals and function pointers for this activation context magic. -static HANDLE PyWin_DLLhActivationContext = NULL; // one day it might be public -static PFN_GETCURRENTACTCTX pfnGetCurrentActCtx = NULL; -static PFN_ACTIVATEACTCTX pfnActivateActCtx = NULL; -static PFN_DEACTIVATEACTCTX pfnDeactivateActCtx = NULL; -static PFN_ADDREFACTCTX pfnAddRefActCtx = NULL; -static PFN_RELEASEACTCTX pfnReleaseActCtx = NULL; - -void _LoadActCtxPointers() -{ - HINSTANCE hKernel32 = GetModuleHandleW(L"kernel32.dll"); - if (hKernel32) - pfnGetCurrentActCtx = (PFN_GETCURRENTACTCTX) GetProcAddress(hKernel32, "GetCurrentActCtx"); - // If we can't load GetCurrentActCtx (ie, pre XP) , don't bother with the rest. - if (pfnGetCurrentActCtx) { - pfnActivateActCtx = (PFN_ACTIVATEACTCTX) GetProcAddress(hKernel32, "ActivateActCtx"); - pfnDeactivateActCtx = (PFN_DEACTIVATEACTCTX) GetProcAddress(hKernel32, "DeactivateActCtx"); - pfnAddRefActCtx = (PFN_ADDREFACTCTX) GetProcAddress(hKernel32, "AddRefActCtx"); - pfnReleaseActCtx = (PFN_RELEASEACTCTX) GetProcAddress(hKernel32, "ReleaseActCtx"); - } -} - -ULONG_PTR _Py_ActivateActCtx() -{ - ULONG_PTR ret = 0; - if (PyWin_DLLhActivationContext && pfnActivateActCtx) - if (!(*pfnActivateActCtx)(PyWin_DLLhActivationContext, &ret)) { - OutputDebugString("Python failed to activate the activation context before loading a DLL\n"); - ret = 0; // no promise the failing function didn't change it! - } - return ret; -} - -void _Py_DeactivateActCtx(ULONG_PTR cookie) -{ - if (cookie && pfnDeactivateActCtx) - if (!(*pfnDeactivateActCtx)(0, cookie)) - OutputDebugString("Python failed to de-activate the activation context\n"); -} -#endif /* HAVE_SXS */ +const char *PyWin_DLLVersionString = MS_DLL_ID; BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call, @@ -93,27 +25,9 @@ BOOL WINAPI DllMain (HANDLE hInst, { case DLL_PROCESS_ATTACH: PyWin_DLLhModule = hInst; -#ifndef MS_DLL_ID - // If we have MS_DLL_ID, we don't need to load the string. - // 1000 is a magic number I picked out of the air. Could do with a #define, I spose... - LoadString(hInst, 1000, dllVersionBuffer, sizeof(dllVersionBuffer)); -#endif - -#if HAVE_SXS - // and capture our activation context for use when loading extensions. - _LoadActCtxPointers(); - if (pfnGetCurrentActCtx && pfnAddRefActCtx) - if ((*pfnGetCurrentActCtx)(&PyWin_DLLhActivationContext)) - if (!(*pfnAddRefActCtx)(PyWin_DLLhActivationContext)) - OutputDebugString("Python failed to load the default activation context\n"); -#endif break; case DLL_PROCESS_DETACH: -#if HAVE_SXS - if (pfnReleaseActCtx) - (*pfnReleaseActCtx)(PyWin_DLLhActivationContext); -#endif break; } return TRUE; diff --git a/PC/getpathp.c b/PC/getpathp.c index 8969fb55..53da3a6d 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -80,9 +80,9 @@ #include "Python.h" -#include "pycore_initconfig.h" -#include "pycore_pystate.h" -#include "osdefs.h" +#include "pycore_initconfig.h" // PyStatus +#include "pycore_pathconfig.h" // _PyPathConfig +#include "osdefs.h" // SEP, ALTSEP #include #ifndef MS_WINDOWS @@ -90,6 +90,7 @@ #endif #include +#include #include #ifdef HAVE_SYS_TYPES_H @@ -249,43 +250,14 @@ ismodule(wchar_t *filename, int update_filename) stuff as fits will be appended. */ -static int _PathCchCombineEx_Initialized = 0; -typedef HRESULT(__stdcall *PPathCchCombineEx) (PWSTR pszPathOut, size_t cchPathOut, - PCWSTR pszPathIn, PCWSTR pszMore, - unsigned long dwFlags); -static PPathCchCombineEx _PathCchCombineEx; - static void join(wchar_t *buffer, const wchar_t *stuff) { - if (_PathCchCombineEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, - LOAD_LIBRARY_SEARCH_SYSTEM32); - if (pathapi) { - _PathCchCombineEx = (PPathCchCombineEx)GetProcAddress(pathapi, "PathCchCombineEx"); - } - else { - _PathCchCombineEx = NULL; - } - _PathCchCombineEx_Initialized = 1; - } - - if (_PathCchCombineEx) { - if (FAILED(_PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) { - Py_FatalError("buffer overflow in getpathp.c's join()"); - } - } else { - if (!PathCombineW(buffer, buffer, stuff)) { - Py_FatalError("buffer overflow in getpathp.c's join()"); - } + if (FAILED(PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) { + Py_FatalError("buffer overflow in getpathp.c's join()"); } } -static int _PathCchCanonicalizeEx_Initialized = 0; -typedef HRESULT(__stdcall *PPathCchCanonicalizeEx) (PWSTR pszPathOut, size_t cchPathOut, - PCWSTR pszPathIn, unsigned long dwFlags); -static PPathCchCanonicalizeEx _PathCchCanonicalizeEx; - /* Call PathCchCanonicalizeEx(path): remove navigation elements such as "." and ".." to produce a direct, well-formed path. */ static PyStatus @@ -295,27 +267,8 @@ canonicalize(wchar_t *buffer, const wchar_t *path) return _PyStatus_NO_MEMORY(); } - if (_PathCchCanonicalizeEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, - LOAD_LIBRARY_SEARCH_SYSTEM32); - if (pathapi) { - _PathCchCanonicalizeEx = (PPathCchCanonicalizeEx)GetProcAddress(pathapi, "PathCchCanonicalizeEx"); - } - else { - _PathCchCanonicalizeEx = NULL; - } - _PathCchCanonicalizeEx_Initialized = 1; - } - - if (_PathCchCanonicalizeEx) { - if (FAILED(_PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { - return INIT_ERR_BUFFER_OVERFLOW(); - } - } - else { - if (!PathCanonicalizeW(buffer, path)) { - return INIT_ERR_BUFFER_OVERFLOW(); - } + if (FAILED(PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { + return INIT_ERR_BUFFER_OVERFLOW(); } return _PyStatus_OK(); } @@ -437,11 +390,10 @@ getpythonregpath(HKEY keyBase, int skipcore) /* Allocate a temp array of char buffers, so we only need to loop reading the registry once */ - ppPaths = PyMem_RawMalloc( sizeof(WCHAR *) * numKeys ); + ppPaths = PyMem_RawCalloc(numKeys, sizeof(WCHAR *)); if (ppPaths==NULL) { goto done; } - memset(ppPaths, 0, sizeof(WCHAR *) * numKeys); /* Loop over all subkeys, allocating a temp sub-buffer. */ for(index=0;indexhome==NULL ? 0 : 1; #ifdef Py_ENABLE_SHARED - calculate->machine_path = getpythonregpath(HKEY_LOCAL_MACHINE, skiphome); - calculate->user_path = getpythonregpath(HKEY_CURRENT_USER, skiphome); + if (!Py_IgnoreEnvironmentFlag) { + calculate->machine_path = getpythonregpath(HKEY_LOCAL_MACHINE, + skiphome); + calculate->user_path = getpythonregpath(HKEY_CURRENT_USER, skiphome); + } #endif /* We only use the default relative PYTHONPATH if we haven't anything better to use! */ @@ -1021,7 +982,11 @@ calculate_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) goto done; } - calculate_pyvenv_file(calculate, argv0_path, Py_ARRAY_LENGTH(argv0_path)); + status = calculate_pyvenv_file(calculate, + argv0_path, Py_ARRAY_LENGTH(argv0_path)); + if (_PyStatus_EXCEPTION(status)) { + return status; + } /* Calculate zip archive path from DLL or exe path */ wchar_t zip_path[MAXPATHLEN+1]; diff --git a/PC/launcher.c b/PC/launcher.c index 2749a4e7..106fc660 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -1247,6 +1247,7 @@ static PYC_MAGIC magic_values[] = { { 3360, 3379, L"3.6" }, { 3390, 3399, L"3.7" }, { 3400, 3419, L"3.8" }, + { 3420, 3429, L"3.9" }, { 0 } }; @@ -1519,7 +1520,7 @@ show_help_text(wchar_t ** argv) Python Launcher for Windows Version %ls\n\n", version_text); fwprintf(stdout, L"\ usage:\n\ -%ls [launcher-args] [python-args] script [script-args]\n\n", argv[0]); +%ls [launcher-args] [python-args] [script [script-args]]\n\n", argv[0]); fputws(L"\ Launcher arguments:\n\n\ -2 : Launch the latest Python 2.x version\n\ @@ -1535,6 +1536,15 @@ Launcher arguments:\n\n\ } fputws(L"\n-0 --list : List the available pythons", stdout); fputws(L"\n-0p --list-paths : List with paths", stdout); + fputws(L"\n\n If no script is specified the specified interpreter is opened.", stdout); + fputws(L"\nIf an exact version is not given, using the latest version can be overridden by", stdout); + fputws(L"\nany of the following, (in priority order):", stdout); + fputws(L"\n An active virtual environment", stdout); + fputws(L"\n A shebang line in the script (if present)", stdout); + fputws(L"\n With -2 or -3 flag a matching PY_PYTHON2 or PY_PYTHON3 Enviroment variable", stdout); + fputws(L"\n A PY_PYTHON Enviroment variable", stdout); + fputws(L"\n From [defaults] in py.ini in your %LOCALAPPDATA%\\py.ini", stdout); + fputws(L"\n From [defaults] in py.ini beside py.exe (use `where py` to locate)", stdout); fputws(L"\n\nThe following help text is from Python:\n\n", stdout); fflush(stdout); } @@ -1830,7 +1840,7 @@ process(int argc, wchar_t ** argv) #if !defined(VENV_REDIRECT) /* bpo-35811: The __PYVENV_LAUNCHER__ variable is used to - * override sys.executable and locate the original prefix path. + * override sys.executable and locate the original prefix path. * However, if it is silently inherited by a non-venv Python * process, that process will believe it is running in the venv * still. This is the only place where *we* can clear it (that is, diff --git a/PC/pyconfig.h b/PC/pyconfig.h index b6b8d445..02216b50 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -135,9 +135,9 @@ WIN32 is still required for the locale module. #endif /* MS_WIN64 */ /* set the version macros for the windows headers */ -/* Python 3.5+ requires Windows Vista or greater */ -#define Py_WINVER 0x0600 /* _WIN32_WINNT_VISTA */ -#define Py_NTDDI NTDDI_VISTA +/* Python 3.9+ requires Windows 8 or greater */ +#define Py_WINVER 0x0602 /* _WIN32_WINNT_WIN8 */ +#define Py_NTDDI NTDDI_WIN8 /* We only set these values when building Python - we don't want to force these values on extensions, as that will affect the prototypes and @@ -195,11 +195,6 @@ typedef int pid_t; #define Py_IS_FINITE(X) _finite(X) #define copysign _copysign -/* Side by Side assemblies supported in VS 2005 and VS 2008 but not 2010*/ -#if _MSC_VER >= 1400 && _MSC_VER < 1600 -#define HAVE_SXS 1 -#endif - /* define some ANSI types that are not defined in earlier Win headers */ #if _MSC_VER >= 1200 /* This file only exists in VC 6.0 or higher */ @@ -274,11 +269,11 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ file in their Makefile (other compilers are generally taken care of by distutils.) */ # if defined(_DEBUG) -# pragma comment(lib,"python38_d.lib") +# pragma comment(lib,"python39_d.lib") # elif defined(Py_LIMITED_API) # pragma comment(lib,"python3.lib") # else -# pragma comment(lib,"python38.lib") +# pragma comment(lib,"python39.lib") # endif /* _DEBUG */ # endif /* _MSC_VER */ # endif /* Py_BUILD_CORE */ @@ -296,7 +291,7 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ # define SIZEOF_HKEY 8 # define SIZEOF_SIZE_T 8 /* configure.ac defines HAVE_LARGEFILE_SUPPORT iff - sizeof(off_t) > sizeof(long), and sizeof(PY_LONG_LONG) >= sizeof(off_t). + sizeof(off_t) > sizeof(long), and sizeof(long long) >= sizeof(off_t). On Win64 the second condition is not true, but if fpos_t replaces off_t then this is true. The uses of HAVE_LARGEFILE_SUPPORT imply that Win64 should define this. */ @@ -688,4 +683,6 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ /* Define if libssl has X509_VERIFY_PARAM_set1_host and related function */ #define HAVE_X509_VERIFY_PARAM_SET1_HOST 1 +#define PLATLIBDIR "lib" + #endif /* !Py_CONFIG_H */ diff --git a/PC/python3.def b/PC/python3.def index 5d93c18a..66d1595c 100644 --- a/PC/python3.def +++ b/PC/python3.def @@ -2,801 +2,803 @@ ; It is used when building python3dll.vcxproj LIBRARY "python3" EXPORTS - PyArg_Parse=python38.PyArg_Parse - PyArg_ParseTuple=python38.PyArg_ParseTuple - PyArg_ParseTupleAndKeywords=python38.PyArg_ParseTupleAndKeywords - PyArg_UnpackTuple=python38.PyArg_UnpackTuple - PyArg_VaParse=python38.PyArg_VaParse - PyArg_VaParseTupleAndKeywords=python38.PyArg_VaParseTupleAndKeywords - PyArg_ValidateKeywordArguments=python38.PyArg_ValidateKeywordArguments - PyBaseObject_Type=python38.PyBaseObject_Type DATA - PyBool_FromLong=python38.PyBool_FromLong - PyBool_Type=python38.PyBool_Type DATA - PyByteArrayIter_Type=python38.PyByteArrayIter_Type DATA - PyByteArray_AsString=python38.PyByteArray_AsString - PyByteArray_Concat=python38.PyByteArray_Concat - PyByteArray_FromObject=python38.PyByteArray_FromObject - PyByteArray_FromStringAndSize=python38.PyByteArray_FromStringAndSize - PyByteArray_Resize=python38.PyByteArray_Resize - PyByteArray_Size=python38.PyByteArray_Size - PyByteArray_Type=python38.PyByteArray_Type DATA - PyBytesIter_Type=python38.PyBytesIter_Type DATA - PyBytes_AsString=python38.PyBytes_AsString - PyBytes_AsStringAndSize=python38.PyBytes_AsStringAndSize - PyBytes_Concat=python38.PyBytes_Concat - PyBytes_ConcatAndDel=python38.PyBytes_ConcatAndDel - PyBytes_DecodeEscape=python38.PyBytes_DecodeEscape - PyBytes_FromFormat=python38.PyBytes_FromFormat - PyBytes_FromFormatV=python38.PyBytes_FromFormatV - PyBytes_FromObject=python38.PyBytes_FromObject - PyBytes_FromString=python38.PyBytes_FromString - PyBytes_FromStringAndSize=python38.PyBytes_FromStringAndSize - PyBytes_Repr=python38.PyBytes_Repr - PyBytes_Size=python38.PyBytes_Size - PyBytes_Type=python38.PyBytes_Type DATA - PyCFunction_Call=python38.PyCFunction_Call - PyCFunction_ClearFreeList=python38.PyCFunction_ClearFreeList - PyCFunction_GetFlags=python38.PyCFunction_GetFlags - PyCFunction_GetFunction=python38.PyCFunction_GetFunction - PyCFunction_GetSelf=python38.PyCFunction_GetSelf - PyCFunction_New=python38.PyCFunction_New - PyCFunction_NewEx=python38.PyCFunction_NewEx - PyCFunction_Type=python38.PyCFunction_Type DATA - PyCallIter_New=python38.PyCallIter_New - PyCallIter_Type=python38.PyCallIter_Type DATA - PyCallable_Check=python38.PyCallable_Check - PyCapsule_GetContext=python38.PyCapsule_GetContext - PyCapsule_GetDestructor=python38.PyCapsule_GetDestructor - PyCapsule_GetName=python38.PyCapsule_GetName - PyCapsule_GetPointer=python38.PyCapsule_GetPointer - PyCapsule_Import=python38.PyCapsule_Import - PyCapsule_IsValid=python38.PyCapsule_IsValid - PyCapsule_New=python38.PyCapsule_New - PyCapsule_SetContext=python38.PyCapsule_SetContext - PyCapsule_SetDestructor=python38.PyCapsule_SetDestructor - PyCapsule_SetName=python38.PyCapsule_SetName - PyCapsule_SetPointer=python38.PyCapsule_SetPointer - PyCapsule_Type=python38.PyCapsule_Type DATA - PyClassMethodDescr_Type=python38.PyClassMethodDescr_Type DATA - PyCodec_BackslashReplaceErrors=python38.PyCodec_BackslashReplaceErrors - PyCodec_Decode=python38.PyCodec_Decode - PyCodec_Decoder=python38.PyCodec_Decoder - PyCodec_Encode=python38.PyCodec_Encode - PyCodec_Encoder=python38.PyCodec_Encoder - PyCodec_IgnoreErrors=python38.PyCodec_IgnoreErrors - PyCodec_IncrementalDecoder=python38.PyCodec_IncrementalDecoder - PyCodec_IncrementalEncoder=python38.PyCodec_IncrementalEncoder - PyCodec_KnownEncoding=python38.PyCodec_KnownEncoding - PyCodec_LookupError=python38.PyCodec_LookupError - PyCodec_NameReplaceErrors=python38.PyCodec_NameReplaceErrors - PyCodec_Register=python38.PyCodec_Register - PyCodec_RegisterError=python38.PyCodec_RegisterError - PyCodec_ReplaceErrors=python38.PyCodec_ReplaceErrors - PyCodec_StreamReader=python38.PyCodec_StreamReader - PyCodec_StreamWriter=python38.PyCodec_StreamWriter - PyCodec_StrictErrors=python38.PyCodec_StrictErrors - PyCodec_XMLCharRefReplaceErrors=python38.PyCodec_XMLCharRefReplaceErrors - PyComplex_FromDoubles=python38.PyComplex_FromDoubles - PyComplex_ImagAsDouble=python38.PyComplex_ImagAsDouble - PyComplex_RealAsDouble=python38.PyComplex_RealAsDouble - PyComplex_Type=python38.PyComplex_Type DATA - PyDescr_NewClassMethod=python38.PyDescr_NewClassMethod - PyDescr_NewGetSet=python38.PyDescr_NewGetSet - PyDescr_NewMember=python38.PyDescr_NewMember - PyDescr_NewMethod=python38.PyDescr_NewMethod - PyDictItems_Type=python38.PyDictItems_Type DATA - PyDictIterItem_Type=python38.PyDictIterItem_Type DATA - PyDictIterKey_Type=python38.PyDictIterKey_Type DATA - PyDictIterValue_Type=python38.PyDictIterValue_Type DATA - PyDictKeys_Type=python38.PyDictKeys_Type DATA - PyDictProxy_New=python38.PyDictProxy_New - PyDictProxy_Type=python38.PyDictProxy_Type DATA - PyDictValues_Type=python38.PyDictValues_Type DATA - PyDict_Clear=python38.PyDict_Clear - PyDict_Contains=python38.PyDict_Contains - PyDict_Copy=python38.PyDict_Copy - PyDict_DelItem=python38.PyDict_DelItem - PyDict_DelItemString=python38.PyDict_DelItemString - PyDict_GetItem=python38.PyDict_GetItem - PyDict_GetItemString=python38.PyDict_GetItemString - PyDict_GetItemWithError=python38.PyDict_GetItemWithError - PyDict_Items=python38.PyDict_Items - PyDict_Keys=python38.PyDict_Keys - PyDict_Merge=python38.PyDict_Merge - PyDict_MergeFromSeq2=python38.PyDict_MergeFromSeq2 - PyDict_New=python38.PyDict_New - PyDict_Next=python38.PyDict_Next - PyDict_SetItem=python38.PyDict_SetItem - PyDict_SetItemString=python38.PyDict_SetItemString - PyDict_Size=python38.PyDict_Size - PyDict_Type=python38.PyDict_Type DATA - PyDict_Update=python38.PyDict_Update - PyDict_Values=python38.PyDict_Values - PyEllipsis_Type=python38.PyEllipsis_Type DATA - PyEnum_Type=python38.PyEnum_Type DATA - PyErr_BadArgument=python38.PyErr_BadArgument - PyErr_BadInternalCall=python38.PyErr_BadInternalCall - PyErr_CheckSignals=python38.PyErr_CheckSignals - PyErr_Clear=python38.PyErr_Clear - PyErr_Display=python38.PyErr_Display - PyErr_ExceptionMatches=python38.PyErr_ExceptionMatches - PyErr_Fetch=python38.PyErr_Fetch - PyErr_Format=python38.PyErr_Format - PyErr_FormatV=python38.PyErr_FormatV - PyErr_GetExcInfo=python38.PyErr_GetExcInfo - PyErr_GivenExceptionMatches=python38.PyErr_GivenExceptionMatches - PyErr_NewException=python38.PyErr_NewException - PyErr_NewExceptionWithDoc=python38.PyErr_NewExceptionWithDoc - PyErr_NoMemory=python38.PyErr_NoMemory - PyErr_NormalizeException=python38.PyErr_NormalizeException - PyErr_Occurred=python38.PyErr_Occurred - PyErr_Print=python38.PyErr_Print - PyErr_PrintEx=python38.PyErr_PrintEx - PyErr_ProgramText=python38.PyErr_ProgramText - PyErr_ResourceWarning=python38.PyErr_ResourceWarning - PyErr_Restore=python38.PyErr_Restore - PyErr_SetExcFromWindowsErr=python38.PyErr_SetExcFromWindowsErr - PyErr_SetExcFromWindowsErrWithFilename=python38.PyErr_SetExcFromWindowsErrWithFilename - PyErr_SetExcFromWindowsErrWithFilenameObject=python38.PyErr_SetExcFromWindowsErrWithFilenameObject - PyErr_SetExcFromWindowsErrWithFilenameObjects=python38.PyErr_SetExcFromWindowsErrWithFilenameObjects - PyErr_SetExcInfo=python38.PyErr_SetExcInfo - PyErr_SetFromErrno=python38.PyErr_SetFromErrno - PyErr_SetFromErrnoWithFilename=python38.PyErr_SetFromErrnoWithFilename - PyErr_SetFromErrnoWithFilenameObject=python38.PyErr_SetFromErrnoWithFilenameObject - PyErr_SetFromErrnoWithFilenameObjects=python38.PyErr_SetFromErrnoWithFilenameObjects - PyErr_SetFromWindowsErr=python38.PyErr_SetFromWindowsErr - PyErr_SetFromWindowsErrWithFilename=python38.PyErr_SetFromWindowsErrWithFilename - PyErr_SetImportError=python38.PyErr_SetImportError - PyErr_SetImportErrorSubclass=python38.PyErr_SetImportErrorSubclass - PyErr_SetInterrupt=python38.PyErr_SetInterrupt - PyErr_SetNone=python38.PyErr_SetNone - PyErr_SetObject=python38.PyErr_SetObject - PyErr_SetString=python38.PyErr_SetString - PyErr_SyntaxLocation=python38.PyErr_SyntaxLocation - PyErr_SyntaxLocationEx=python38.PyErr_SyntaxLocationEx - PyErr_WarnEx=python38.PyErr_WarnEx - PyErr_WarnExplicit=python38.PyErr_WarnExplicit - PyErr_WarnFormat=python38.PyErr_WarnFormat - PyErr_WriteUnraisable=python38.PyErr_WriteUnraisable - PyEval_AcquireLock=python38.PyEval_AcquireLock - PyEval_AcquireThread=python38.PyEval_AcquireThread - PyEval_CallFunction=python38.PyEval_CallFunction - PyEval_CallMethod=python38.PyEval_CallMethod - PyEval_CallObjectWithKeywords=python38.PyEval_CallObjectWithKeywords - PyEval_EvalCode=python38.PyEval_EvalCode - PyEval_EvalCodeEx=python38.PyEval_EvalCodeEx - PyEval_EvalFrame=python38.PyEval_EvalFrame - PyEval_EvalFrameEx=python38.PyEval_EvalFrameEx - PyEval_GetBuiltins=python38.PyEval_GetBuiltins - PyEval_GetCallStats=python38.PyEval_GetCallStats - PyEval_GetFrame=python38.PyEval_GetFrame - PyEval_GetFuncDesc=python38.PyEval_GetFuncDesc - PyEval_GetFuncName=python38.PyEval_GetFuncName - PyEval_GetGlobals=python38.PyEval_GetGlobals - PyEval_GetLocals=python38.PyEval_GetLocals - PyEval_InitThreads=python38.PyEval_InitThreads - PyEval_ReInitThreads=python38.PyEval_ReInitThreads - PyEval_ReleaseLock=python38.PyEval_ReleaseLock - PyEval_ReleaseThread=python38.PyEval_ReleaseThread - PyEval_RestoreThread=python38.PyEval_RestoreThread - PyEval_SaveThread=python38.PyEval_SaveThread - PyEval_ThreadsInitialized=python38.PyEval_ThreadsInitialized - PyExc_ArithmeticError=python38.PyExc_ArithmeticError DATA - PyExc_AssertionError=python38.PyExc_AssertionError DATA - PyExc_AttributeError=python38.PyExc_AttributeError DATA - PyExc_BaseException=python38.PyExc_BaseException DATA - PyExc_BlockingIOError=python38.PyExc_BlockingIOError DATA - PyExc_BrokenPipeError=python38.PyExc_BrokenPipeError DATA - PyExc_BufferError=python38.PyExc_BufferError DATA - PyExc_BytesWarning=python38.PyExc_BytesWarning DATA - PyExc_ChildProcessError=python38.PyExc_ChildProcessError DATA - PyExc_ConnectionAbortedError=python38.PyExc_ConnectionAbortedError DATA - PyExc_ConnectionError=python38.PyExc_ConnectionError DATA - PyExc_ConnectionRefusedError=python38.PyExc_ConnectionRefusedError DATA - PyExc_ConnectionResetError=python38.PyExc_ConnectionResetError DATA - PyExc_DeprecationWarning=python38.PyExc_DeprecationWarning DATA - PyExc_EOFError=python38.PyExc_EOFError DATA - PyExc_EnvironmentError=python38.PyExc_EnvironmentError DATA - PyExc_Exception=python38.PyExc_Exception DATA - PyExc_FileExistsError=python38.PyExc_FileExistsError DATA - PyExc_FileNotFoundError=python38.PyExc_FileNotFoundError DATA - PyExc_FloatingPointError=python38.PyExc_FloatingPointError DATA - PyExc_FutureWarning=python38.PyExc_FutureWarning DATA - PyExc_GeneratorExit=python38.PyExc_GeneratorExit DATA - PyExc_IOError=python38.PyExc_IOError DATA - PyExc_ImportError=python38.PyExc_ImportError DATA - PyExc_ImportWarning=python38.PyExc_ImportWarning DATA - PyExc_IndentationError=python38.PyExc_IndentationError DATA - PyExc_IndexError=python38.PyExc_IndexError DATA - PyExc_InterruptedError=python38.PyExc_InterruptedError DATA - PyExc_IsADirectoryError=python38.PyExc_IsADirectoryError DATA - PyExc_KeyError=python38.PyExc_KeyError DATA - PyExc_KeyboardInterrupt=python38.PyExc_KeyboardInterrupt DATA - PyExc_LookupError=python38.PyExc_LookupError DATA - PyExc_MemoryError=python38.PyExc_MemoryError DATA - PyExc_ModuleNotFoundError=python38.PyExc_ModuleNotFoundError DATA - PyExc_NameError=python38.PyExc_NameError DATA - PyExc_NotADirectoryError=python38.PyExc_NotADirectoryError DATA - PyExc_NotImplementedError=python38.PyExc_NotImplementedError DATA - PyExc_OSError=python38.PyExc_OSError DATA - PyExc_OverflowError=python38.PyExc_OverflowError DATA - PyExc_PendingDeprecationWarning=python38.PyExc_PendingDeprecationWarning DATA - PyExc_PermissionError=python38.PyExc_PermissionError DATA - PyExc_ProcessLookupError=python38.PyExc_ProcessLookupError DATA - PyExc_RecursionError=python38.PyExc_RecursionError DATA - PyExc_ReferenceError=python38.PyExc_ReferenceError DATA - PyExc_ResourceWarning=python38.PyExc_ResourceWarning DATA - PyExc_RuntimeError=python38.PyExc_RuntimeError DATA - PyExc_RuntimeWarning=python38.PyExc_RuntimeWarning DATA - PyExc_StopAsyncIteration=python38.PyExc_StopAsyncIteration DATA - PyExc_StopIteration=python38.PyExc_StopIteration DATA - PyExc_SyntaxError=python38.PyExc_SyntaxError DATA - PyExc_SyntaxWarning=python38.PyExc_SyntaxWarning DATA - PyExc_SystemError=python38.PyExc_SystemError DATA - PyExc_SystemExit=python38.PyExc_SystemExit DATA - PyExc_TabError=python38.PyExc_TabError DATA - PyExc_TimeoutError=python38.PyExc_TimeoutError DATA - PyExc_TypeError=python38.PyExc_TypeError DATA - PyExc_UnboundLocalError=python38.PyExc_UnboundLocalError DATA - PyExc_UnicodeDecodeError=python38.PyExc_UnicodeDecodeError DATA - PyExc_UnicodeEncodeError=python38.PyExc_UnicodeEncodeError DATA - PyExc_UnicodeError=python38.PyExc_UnicodeError DATA - PyExc_UnicodeTranslateError=python38.PyExc_UnicodeTranslateError DATA - PyExc_UnicodeWarning=python38.PyExc_UnicodeWarning DATA - PyExc_UserWarning=python38.PyExc_UserWarning DATA - PyExc_ValueError=python38.PyExc_ValueError DATA - PyExc_Warning=python38.PyExc_Warning DATA - PyExc_WindowsError=python38.PyExc_WindowsError DATA - PyExc_ZeroDivisionError=python38.PyExc_ZeroDivisionError DATA - PyExceptionClass_Name=python38.PyExceptionClass_Name - PyException_GetCause=python38.PyException_GetCause - PyException_GetContext=python38.PyException_GetContext - PyException_GetTraceback=python38.PyException_GetTraceback - PyException_SetCause=python38.PyException_SetCause - PyException_SetContext=python38.PyException_SetContext - PyException_SetTraceback=python38.PyException_SetTraceback - PyFile_FromFd=python38.PyFile_FromFd - PyFile_GetLine=python38.PyFile_GetLine - PyFile_WriteObject=python38.PyFile_WriteObject - PyFile_WriteString=python38.PyFile_WriteString - PyFilter_Type=python38.PyFilter_Type DATA - PyFloat_AsDouble=python38.PyFloat_AsDouble - PyFloat_FromDouble=python38.PyFloat_FromDouble - PyFloat_FromString=python38.PyFloat_FromString - PyFloat_GetInfo=python38.PyFloat_GetInfo - PyFloat_GetMax=python38.PyFloat_GetMax - PyFloat_GetMin=python38.PyFloat_GetMin - PyFloat_Type=python38.PyFloat_Type DATA - PyFrozenSet_New=python38.PyFrozenSet_New - PyFrozenSet_Type=python38.PyFrozenSet_Type DATA - PyGC_Collect=python38.PyGC_Collect - PyGILState_Ensure=python38.PyGILState_Ensure - PyGILState_GetThisThreadState=python38.PyGILState_GetThisThreadState - PyGILState_Release=python38.PyGILState_Release - PyGetSetDescr_Type=python38.PyGetSetDescr_Type DATA - PyImport_AddModule=python38.PyImport_AddModule - PyImport_AddModuleObject=python38.PyImport_AddModuleObject - PyImport_AppendInittab=python38.PyImport_AppendInittab - PyImport_Cleanup=python38.PyImport_Cleanup - PyImport_ExecCodeModule=python38.PyImport_ExecCodeModule - PyImport_ExecCodeModuleEx=python38.PyImport_ExecCodeModuleEx - PyImport_ExecCodeModuleObject=python38.PyImport_ExecCodeModuleObject - PyImport_ExecCodeModuleWithPathnames=python38.PyImport_ExecCodeModuleWithPathnames - PyImport_GetImporter=python38.PyImport_GetImporter - PyImport_GetMagicNumber=python38.PyImport_GetMagicNumber - PyImport_GetMagicTag=python38.PyImport_GetMagicTag - PyImport_GetModule=python38.PyImport_GetModule - PyImport_GetModuleDict=python38.PyImport_GetModuleDict - PyImport_Import=python38.PyImport_Import - PyImport_ImportFrozenModule=python38.PyImport_ImportFrozenModule - PyImport_ImportFrozenModuleObject=python38.PyImport_ImportFrozenModuleObject - PyImport_ImportModule=python38.PyImport_ImportModule - PyImport_ImportModuleLevel=python38.PyImport_ImportModuleLevel - PyImport_ImportModuleLevelObject=python38.PyImport_ImportModuleLevelObject - PyImport_ImportModuleNoBlock=python38.PyImport_ImportModuleNoBlock - PyImport_ReloadModule=python38.PyImport_ReloadModule - PyIndex_Check=python38.PyIndex_Check - PyInterpreterState_Clear=python38.PyInterpreterState_Clear - PyInterpreterState_Delete=python38.PyInterpreterState_Delete - PyInterpreterState_New=python38.PyInterpreterState_New - PyIter_Check=python38.PyIter_Check - PyIter_Next=python38.PyIter_Next - PyListIter_Type=python38.PyListIter_Type DATA - PyListRevIter_Type=python38.PyListRevIter_Type DATA - PyList_Append=python38.PyList_Append - PyList_AsTuple=python38.PyList_AsTuple - PyList_GetItem=python38.PyList_GetItem - PyList_GetSlice=python38.PyList_GetSlice - PyList_Insert=python38.PyList_Insert - PyList_New=python38.PyList_New - PyList_Reverse=python38.PyList_Reverse - PyList_SetItem=python38.PyList_SetItem - PyList_SetSlice=python38.PyList_SetSlice - PyList_Size=python38.PyList_Size - PyList_Sort=python38.PyList_Sort - PyList_Type=python38.PyList_Type DATA - PyLongRangeIter_Type=python38.PyLongRangeIter_Type DATA - PyLong_AsDouble=python38.PyLong_AsDouble - PyLong_AsLong=python38.PyLong_AsLong - PyLong_AsLongAndOverflow=python38.PyLong_AsLongAndOverflow - PyLong_AsLongLong=python38.PyLong_AsLongLong - PyLong_AsLongLongAndOverflow=python38.PyLong_AsLongLongAndOverflow - PyLong_AsSize_t=python38.PyLong_AsSize_t - PyLong_AsSsize_t=python38.PyLong_AsSsize_t - PyLong_AsUnsignedLong=python38.PyLong_AsUnsignedLong - PyLong_AsUnsignedLongLong=python38.PyLong_AsUnsignedLongLong - PyLong_AsUnsignedLongLongMask=python38.PyLong_AsUnsignedLongLongMask - PyLong_AsUnsignedLongMask=python38.PyLong_AsUnsignedLongMask - PyLong_AsVoidPtr=python38.PyLong_AsVoidPtr - PyLong_FromDouble=python38.PyLong_FromDouble - PyLong_FromLong=python38.PyLong_FromLong - PyLong_FromLongLong=python38.PyLong_FromLongLong - PyLong_FromSize_t=python38.PyLong_FromSize_t - PyLong_FromSsize_t=python38.PyLong_FromSsize_t - PyLong_FromString=python38.PyLong_FromString - PyLong_FromUnsignedLong=python38.PyLong_FromUnsignedLong - PyLong_FromUnsignedLongLong=python38.PyLong_FromUnsignedLongLong - PyLong_FromVoidPtr=python38.PyLong_FromVoidPtr - PyLong_GetInfo=python38.PyLong_GetInfo - PyLong_Type=python38.PyLong_Type DATA - PyMap_Type=python38.PyMap_Type DATA - PyMapping_Check=python38.PyMapping_Check - PyMapping_GetItemString=python38.PyMapping_GetItemString - PyMapping_HasKey=python38.PyMapping_HasKey - PyMapping_HasKeyString=python38.PyMapping_HasKeyString - PyMapping_Items=python38.PyMapping_Items - PyMapping_Keys=python38.PyMapping_Keys - PyMapping_Length=python38.PyMapping_Length - PyMapping_SetItemString=python38.PyMapping_SetItemString - PyMapping_Size=python38.PyMapping_Size - PyMapping_Values=python38.PyMapping_Values - PyMem_Calloc=python38.PyMem_Calloc - PyMem_Free=python38.PyMem_Free - PyMem_Malloc=python38.PyMem_Malloc - PyMem_Realloc=python38.PyMem_Realloc - PyMemberDescr_Type=python38.PyMemberDescr_Type DATA - PyMemoryView_FromMemory=python38.PyMemoryView_FromMemory - PyMemoryView_FromObject=python38.PyMemoryView_FromObject - PyMemoryView_GetContiguous=python38.PyMemoryView_GetContiguous - PyMemoryView_Type=python38.PyMemoryView_Type DATA - PyMethodDescr_Type=python38.PyMethodDescr_Type DATA - PyModuleDef_Init=python38.PyModuleDef_Init - PyModuleDef_Type=python38.PyModuleDef_Type DATA - PyModule_AddFunctions=python38.PyModule_AddFunctions - PyModule_AddIntConstant=python38.PyModule_AddIntConstant - PyModule_AddObject=python38.PyModule_AddObject - PyModule_AddStringConstant=python38.PyModule_AddStringConstant - PyModule_Create2=python38.PyModule_Create2 - PyModule_ExecDef=python38.PyModule_ExecDef - PyModule_FromDefAndSpec2=python38.PyModule_FromDefAndSpec2 - PyModule_GetDef=python38.PyModule_GetDef - PyModule_GetDict=python38.PyModule_GetDict - PyModule_GetFilename=python38.PyModule_GetFilename - PyModule_GetFilenameObject=python38.PyModule_GetFilenameObject - PyModule_GetName=python38.PyModule_GetName - PyModule_GetNameObject=python38.PyModule_GetNameObject - PyModule_GetState=python38.PyModule_GetState - PyModule_New=python38.PyModule_New - PyModule_NewObject=python38.PyModule_NewObject - PyModule_SetDocString=python38.PyModule_SetDocString - PyModule_Type=python38.PyModule_Type DATA - PyNullImporter_Type=python38.PyNullImporter_Type DATA - PyNumber_Absolute=python38.PyNumber_Absolute - PyNumber_Add=python38.PyNumber_Add - PyNumber_And=python38.PyNumber_And - PyNumber_AsSsize_t=python38.PyNumber_AsSsize_t - PyNumber_Check=python38.PyNumber_Check - PyNumber_Divmod=python38.PyNumber_Divmod - PyNumber_Float=python38.PyNumber_Float - PyNumber_FloorDivide=python38.PyNumber_FloorDivide - PyNumber_InPlaceAdd=python38.PyNumber_InPlaceAdd - PyNumber_InPlaceAnd=python38.PyNumber_InPlaceAnd - PyNumber_InPlaceFloorDivide=python38.PyNumber_InPlaceFloorDivide - PyNumber_InPlaceLshift=python38.PyNumber_InPlaceLshift - PyNumber_InPlaceMatrixMultiply=python38.PyNumber_InPlaceMatrixMultiply - PyNumber_InPlaceMultiply=python38.PyNumber_InPlaceMultiply - PyNumber_InPlaceOr=python38.PyNumber_InPlaceOr - PyNumber_InPlacePower=python38.PyNumber_InPlacePower - PyNumber_InPlaceRemainder=python38.PyNumber_InPlaceRemainder - PyNumber_InPlaceRshift=python38.PyNumber_InPlaceRshift - PyNumber_InPlaceSubtract=python38.PyNumber_InPlaceSubtract - PyNumber_InPlaceTrueDivide=python38.PyNumber_InPlaceTrueDivide - PyNumber_InPlaceXor=python38.PyNumber_InPlaceXor - PyNumber_Index=python38.PyNumber_Index - PyNumber_Invert=python38.PyNumber_Invert - PyNumber_Long=python38.PyNumber_Long - PyNumber_Lshift=python38.PyNumber_Lshift - PyNumber_MatrixMultiply=python38.PyNumber_MatrixMultiply - PyNumber_Multiply=python38.PyNumber_Multiply - PyNumber_Negative=python38.PyNumber_Negative - PyNumber_Or=python38.PyNumber_Or - PyNumber_Positive=python38.PyNumber_Positive - PyNumber_Power=python38.PyNumber_Power - PyNumber_Remainder=python38.PyNumber_Remainder - PyNumber_Rshift=python38.PyNumber_Rshift - PyNumber_Subtract=python38.PyNumber_Subtract - PyNumber_ToBase=python38.PyNumber_ToBase - PyNumber_TrueDivide=python38.PyNumber_TrueDivide - PyNumber_Xor=python38.PyNumber_Xor - PyODictItems_Type=python38.PyODictItems_Type DATA - PyODictIter_Type=python38.PyODictIter_Type DATA - PyODictKeys_Type=python38.PyODictKeys_Type DATA - PyODictValues_Type=python38.PyODictValues_Type DATA - PyODict_DelItem=python38.PyODict_DelItem - PyODict_New=python38.PyODict_New - PyODict_SetItem=python38.PyODict_SetItem - PyODict_Type=python38.PyODict_Type DATA - PyOS_AfterFork=python38.PyOS_AfterFork - PyOS_CheckStack=python38.PyOS_CheckStack - PyOS_FSPath=python38.PyOS_FSPath - PyOS_InitInterrupts=python38.PyOS_InitInterrupts - PyOS_InputHook=python38.PyOS_InputHook DATA - PyOS_InterruptOccurred=python38.PyOS_InterruptOccurred - PyOS_ReadlineFunctionPointer=python38.PyOS_ReadlineFunctionPointer DATA - PyOS_double_to_string=python38.PyOS_double_to_string - PyOS_getsig=python38.PyOS_getsig - PyOS_mystricmp=python38.PyOS_mystricmp - PyOS_mystrnicmp=python38.PyOS_mystrnicmp - PyOS_setsig=python38.PyOS_setsig - PyOS_snprintf=python38.PyOS_snprintf - PyOS_string_to_double=python38.PyOS_string_to_double - PyOS_strtol=python38.PyOS_strtol - PyOS_strtoul=python38.PyOS_strtoul - PyOS_vsnprintf=python38.PyOS_vsnprintf - PyObject_ASCII=python38.PyObject_ASCII - PyObject_AsCharBuffer=python38.PyObject_AsCharBuffer - PyObject_AsFileDescriptor=python38.PyObject_AsFileDescriptor - PyObject_AsReadBuffer=python38.PyObject_AsReadBuffer - PyObject_AsWriteBuffer=python38.PyObject_AsWriteBuffer - PyObject_Bytes=python38.PyObject_Bytes - PyObject_Call=python38.PyObject_Call - PyObject_CallFunction=python38.PyObject_CallFunction - PyObject_CallFunctionObjArgs=python38.PyObject_CallFunctionObjArgs - PyObject_CallMethod=python38.PyObject_CallMethod - PyObject_CallMethodObjArgs=python38.PyObject_CallMethodObjArgs - PyObject_CallObject=python38.PyObject_CallObject - PyObject_Calloc=python38.PyObject_Calloc - PyObject_CheckReadBuffer=python38.PyObject_CheckReadBuffer - PyObject_ClearWeakRefs=python38.PyObject_ClearWeakRefs - PyObject_DelItem=python38.PyObject_DelItem - PyObject_DelItemString=python38.PyObject_DelItemString - PyObject_Dir=python38.PyObject_Dir - PyObject_Format=python38.PyObject_Format - PyObject_Free=python38.PyObject_Free - PyObject_GC_Del=python38.PyObject_GC_Del - PyObject_GC_Track=python38.PyObject_GC_Track - PyObject_GC_UnTrack=python38.PyObject_GC_UnTrack - PyObject_GenericGetAttr=python38.PyObject_GenericGetAttr - PyObject_GenericSetAttr=python38.PyObject_GenericSetAttr - PyObject_GenericSetDict=python38.PyObject_GenericSetDict - PyObject_GetAttr=python38.PyObject_GetAttr - PyObject_GetAttrString=python38.PyObject_GetAttrString - PyObject_GetItem=python38.PyObject_GetItem - PyObject_GetIter=python38.PyObject_GetIter - PyObject_HasAttr=python38.PyObject_HasAttr - PyObject_HasAttrString=python38.PyObject_HasAttrString - PyObject_Hash=python38.PyObject_Hash - PyObject_HashNotImplemented=python38.PyObject_HashNotImplemented - PyObject_Init=python38.PyObject_Init - PyObject_InitVar=python38.PyObject_InitVar - PyObject_IsInstance=python38.PyObject_IsInstance - PyObject_IsSubclass=python38.PyObject_IsSubclass - PyObject_IsTrue=python38.PyObject_IsTrue - PyObject_Length=python38.PyObject_Length - PyObject_Malloc=python38.PyObject_Malloc - PyObject_Not=python38.PyObject_Not - PyObject_Realloc=python38.PyObject_Realloc - PyObject_Repr=python38.PyObject_Repr - PyObject_RichCompare=python38.PyObject_RichCompare - PyObject_RichCompareBool=python38.PyObject_RichCompareBool - PyObject_SelfIter=python38.PyObject_SelfIter - PyObject_SetAttr=python38.PyObject_SetAttr - PyObject_SetAttrString=python38.PyObject_SetAttrString - PyObject_SetItem=python38.PyObject_SetItem - PyObject_Size=python38.PyObject_Size - PyObject_Str=python38.PyObject_Str - PyObject_Type=python38.PyObject_Type - PyParser_SimpleParseFileFlags=python38.PyParser_SimpleParseFileFlags - PyParser_SimpleParseStringFlags=python38.PyParser_SimpleParseStringFlags - PyParser_SimpleParseStringFlagsFilename=python38.PyParser_SimpleParseStringFlagsFilename - PyProperty_Type=python38.PyProperty_Type DATA - PyRangeIter_Type=python38.PyRangeIter_Type DATA - PyRange_Type=python38.PyRange_Type DATA - PyReversed_Type=python38.PyReversed_Type DATA - PySeqIter_New=python38.PySeqIter_New - PySeqIter_Type=python38.PySeqIter_Type DATA - PySequence_Check=python38.PySequence_Check - PySequence_Concat=python38.PySequence_Concat - PySequence_Contains=python38.PySequence_Contains - PySequence_Count=python38.PySequence_Count - PySequence_DelItem=python38.PySequence_DelItem - PySequence_DelSlice=python38.PySequence_DelSlice - PySequence_Fast=python38.PySequence_Fast - PySequence_GetItem=python38.PySequence_GetItem - PySequence_GetSlice=python38.PySequence_GetSlice - PySequence_In=python38.PySequence_In - PySequence_InPlaceConcat=python38.PySequence_InPlaceConcat - PySequence_InPlaceRepeat=python38.PySequence_InPlaceRepeat - PySequence_Index=python38.PySequence_Index - PySequence_Length=python38.PySequence_Length - PySequence_List=python38.PySequence_List - PySequence_Repeat=python38.PySequence_Repeat - PySequence_SetItem=python38.PySequence_SetItem - PySequence_SetSlice=python38.PySequence_SetSlice - PySequence_Size=python38.PySequence_Size - PySequence_Tuple=python38.PySequence_Tuple - PySetIter_Type=python38.PySetIter_Type DATA - PySet_Add=python38.PySet_Add - PySet_Clear=python38.PySet_Clear - PySet_Contains=python38.PySet_Contains - PySet_Discard=python38.PySet_Discard - PySet_New=python38.PySet_New - PySet_Pop=python38.PySet_Pop - PySet_Size=python38.PySet_Size - PySet_Type=python38.PySet_Type DATA - PySlice_AdjustIndices=python38.PySlice_AdjustIndices - PySlice_GetIndices=python38.PySlice_GetIndices - PySlice_GetIndicesEx=python38.PySlice_GetIndicesEx - PySlice_New=python38.PySlice_New - PySlice_Type=python38.PySlice_Type DATA - PySlice_Unpack=python38.PySlice_Unpack - PySortWrapper_Type=python38.PySortWrapper_Type DATA - PyInterpreterState_GetID=python38.PyInterpreterState_GetID - PyState_AddModule=python38.PyState_AddModule - PyState_FindModule=python38.PyState_FindModule - PyState_RemoveModule=python38.PyState_RemoveModule - PyStructSequence_GetItem=python38.PyStructSequence_GetItem - PyStructSequence_New=python38.PyStructSequence_New - PyStructSequence_NewType=python38.PyStructSequence_NewType - PyStructSequence_SetItem=python38.PyStructSequence_SetItem - PySuper_Type=python38.PySuper_Type DATA - PySys_AddWarnOption=python38.PySys_AddWarnOption - PySys_AddWarnOptionUnicode=python38.PySys_AddWarnOptionUnicode - PySys_AddXOption=python38.PySys_AddXOption - PySys_FormatStderr=python38.PySys_FormatStderr - PySys_FormatStdout=python38.PySys_FormatStdout - PySys_GetObject=python38.PySys_GetObject - PySys_GetXOptions=python38.PySys_GetXOptions - PySys_HasWarnOptions=python38.PySys_HasWarnOptions - PySys_ResetWarnOptions=python38.PySys_ResetWarnOptions - PySys_SetArgv=python38.PySys_SetArgv - PySys_SetArgvEx=python38.PySys_SetArgvEx - PySys_SetObject=python38.PySys_SetObject - PySys_SetPath=python38.PySys_SetPath - PySys_WriteStderr=python38.PySys_WriteStderr - PySys_WriteStdout=python38.PySys_WriteStdout - PyThreadState_Clear=python38.PyThreadState_Clear - PyThreadState_Delete=python38.PyThreadState_Delete - PyThreadState_DeleteCurrent=python38.PyThreadState_DeleteCurrent - PyThreadState_Get=python38.PyThreadState_Get - PyThreadState_GetDict=python38.PyThreadState_GetDict - PyThreadState_New=python38.PyThreadState_New - PyThreadState_SetAsyncExc=python38.PyThreadState_SetAsyncExc - PyThreadState_Swap=python38.PyThreadState_Swap - PyThread_tss_alloc=python38.PyThread_tss_alloc - PyThread_tss_create=python38.PyThread_tss_create - PyThread_tss_delete=python38.PyThread_tss_delete - PyThread_tss_free=python38.PyThread_tss_free - PyThread_tss_get=python38.PyThread_tss_get - PyThread_tss_is_created=python38.PyThread_tss_is_created - PyThread_tss_set=python38.PyThread_tss_set - PyTraceBack_Here=python38.PyTraceBack_Here - PyTraceBack_Print=python38.PyTraceBack_Print - PyTraceBack_Type=python38.PyTraceBack_Type DATA - PyTupleIter_Type=python38.PyTupleIter_Type DATA - PyTuple_ClearFreeList=python38.PyTuple_ClearFreeList - PyTuple_GetItem=python38.PyTuple_GetItem - PyTuple_GetSlice=python38.PyTuple_GetSlice - PyTuple_New=python38.PyTuple_New - PyTuple_Pack=python38.PyTuple_Pack - PyTuple_SetItem=python38.PyTuple_SetItem - PyTuple_Size=python38.PyTuple_Size - PyTuple_Type=python38.PyTuple_Type DATA - PyType_ClearCache=python38.PyType_ClearCache - PyType_FromSpec=python38.PyType_FromSpec - PyType_FromSpecWithBases=python38.PyType_FromSpecWithBases - PyType_GenericAlloc=python38.PyType_GenericAlloc - PyType_GenericNew=python38.PyType_GenericNew - PyType_GetFlags=python38.PyType_GetFlags - PyType_GetSlot=python38.PyType_GetSlot - PyType_IsSubtype=python38.PyType_IsSubtype - PyType_Modified=python38.PyType_Modified - PyType_Ready=python38.PyType_Ready - PyType_Type=python38.PyType_Type DATA - PyUnicodeDecodeError_Create=python38.PyUnicodeDecodeError_Create - PyUnicodeDecodeError_GetEncoding=python38.PyUnicodeDecodeError_GetEncoding - PyUnicodeDecodeError_GetEnd=python38.PyUnicodeDecodeError_GetEnd - PyUnicodeDecodeError_GetObject=python38.PyUnicodeDecodeError_GetObject - PyUnicodeDecodeError_GetReason=python38.PyUnicodeDecodeError_GetReason - PyUnicodeDecodeError_GetStart=python38.PyUnicodeDecodeError_GetStart - PyUnicodeDecodeError_SetEnd=python38.PyUnicodeDecodeError_SetEnd - PyUnicodeDecodeError_SetReason=python38.PyUnicodeDecodeError_SetReason - PyUnicodeDecodeError_SetStart=python38.PyUnicodeDecodeError_SetStart - PyUnicodeEncodeError_GetEncoding=python38.PyUnicodeEncodeError_GetEncoding - PyUnicodeEncodeError_GetEnd=python38.PyUnicodeEncodeError_GetEnd - PyUnicodeEncodeError_GetObject=python38.PyUnicodeEncodeError_GetObject - PyUnicodeEncodeError_GetReason=python38.PyUnicodeEncodeError_GetReason - PyUnicodeEncodeError_GetStart=python38.PyUnicodeEncodeError_GetStart - PyUnicodeEncodeError_SetEnd=python38.PyUnicodeEncodeError_SetEnd - PyUnicodeEncodeError_SetReason=python38.PyUnicodeEncodeError_SetReason - PyUnicodeEncodeError_SetStart=python38.PyUnicodeEncodeError_SetStart - PyUnicodeIter_Type=python38.PyUnicodeIter_Type DATA - PyUnicodeTranslateError_GetEnd=python38.PyUnicodeTranslateError_GetEnd - PyUnicodeTranslateError_GetObject=python38.PyUnicodeTranslateError_GetObject - PyUnicodeTranslateError_GetReason=python38.PyUnicodeTranslateError_GetReason - PyUnicodeTranslateError_GetStart=python38.PyUnicodeTranslateError_GetStart - PyUnicodeTranslateError_SetEnd=python38.PyUnicodeTranslateError_SetEnd - PyUnicodeTranslateError_SetReason=python38.PyUnicodeTranslateError_SetReason - PyUnicodeTranslateError_SetStart=python38.PyUnicodeTranslateError_SetStart - PyUnicode_Append=python38.PyUnicode_Append - PyUnicode_AppendAndDel=python38.PyUnicode_AppendAndDel - PyUnicode_AsASCIIString=python38.PyUnicode_AsASCIIString - PyUnicode_AsCharmapString=python38.PyUnicode_AsCharmapString - PyUnicode_AsDecodedObject=python38.PyUnicode_AsDecodedObject - PyUnicode_AsDecodedUnicode=python38.PyUnicode_AsDecodedUnicode - PyUnicode_AsEncodedObject=python38.PyUnicode_AsEncodedObject - PyUnicode_AsEncodedString=python38.PyUnicode_AsEncodedString - PyUnicode_AsEncodedUnicode=python38.PyUnicode_AsEncodedUnicode - PyUnicode_AsLatin1String=python38.PyUnicode_AsLatin1String - PyUnicode_AsMBCSString=python38.PyUnicode_AsMBCSString - PyUnicode_AsRawUnicodeEscapeString=python38.PyUnicode_AsRawUnicodeEscapeString - PyUnicode_AsUCS4=python38.PyUnicode_AsUCS4 - PyUnicode_AsUCS4Copy=python38.PyUnicode_AsUCS4Copy - PyUnicode_AsUTF16String=python38.PyUnicode_AsUTF16String - PyUnicode_AsUTF32String=python38.PyUnicode_AsUTF32String - PyUnicode_AsUTF8String=python38.PyUnicode_AsUTF8String - PyUnicode_AsUnicodeEscapeString=python38.PyUnicode_AsUnicodeEscapeString - PyUnicode_AsWideChar=python38.PyUnicode_AsWideChar - PyUnicode_AsWideCharString=python38.PyUnicode_AsWideCharString - PyUnicode_BuildEncodingMap=python38.PyUnicode_BuildEncodingMap - PyUnicode_ClearFreeList=python38.PyUnicode_ClearFreeList - PyUnicode_Compare=python38.PyUnicode_Compare - PyUnicode_CompareWithASCIIString=python38.PyUnicode_CompareWithASCIIString - PyUnicode_Concat=python38.PyUnicode_Concat - PyUnicode_Contains=python38.PyUnicode_Contains - PyUnicode_Count=python38.PyUnicode_Count - PyUnicode_Decode=python38.PyUnicode_Decode - PyUnicode_DecodeASCII=python38.PyUnicode_DecodeASCII - PyUnicode_DecodeCharmap=python38.PyUnicode_DecodeCharmap - PyUnicode_DecodeCodePageStateful=python38.PyUnicode_DecodeCodePageStateful - PyUnicode_DecodeFSDefault=python38.PyUnicode_DecodeFSDefault - PyUnicode_DecodeFSDefaultAndSize=python38.PyUnicode_DecodeFSDefaultAndSize - PyUnicode_DecodeLatin1=python38.PyUnicode_DecodeLatin1 - PyUnicode_DecodeLocale=python38.PyUnicode_DecodeLocale - PyUnicode_DecodeLocaleAndSize=python38.PyUnicode_DecodeLocaleAndSize - PyUnicode_DecodeMBCS=python38.PyUnicode_DecodeMBCS - PyUnicode_DecodeMBCSStateful=python38.PyUnicode_DecodeMBCSStateful - PyUnicode_DecodeRawUnicodeEscape=python38.PyUnicode_DecodeRawUnicodeEscape - PyUnicode_DecodeUTF16=python38.PyUnicode_DecodeUTF16 - PyUnicode_DecodeUTF16Stateful=python38.PyUnicode_DecodeUTF16Stateful - PyUnicode_DecodeUTF32=python38.PyUnicode_DecodeUTF32 - PyUnicode_DecodeUTF32Stateful=python38.PyUnicode_DecodeUTF32Stateful - PyUnicode_DecodeUTF7=python38.PyUnicode_DecodeUTF7 - PyUnicode_DecodeUTF7Stateful=python38.PyUnicode_DecodeUTF7Stateful - PyUnicode_DecodeUTF8=python38.PyUnicode_DecodeUTF8 - PyUnicode_DecodeUTF8Stateful=python38.PyUnicode_DecodeUTF8Stateful - PyUnicode_DecodeUnicodeEscape=python38.PyUnicode_DecodeUnicodeEscape - PyUnicode_EncodeCodePage=python38.PyUnicode_EncodeCodePage - PyUnicode_EncodeFSDefault=python38.PyUnicode_EncodeFSDefault - PyUnicode_EncodeLocale=python38.PyUnicode_EncodeLocale - PyUnicode_FSConverter=python38.PyUnicode_FSConverter - PyUnicode_FSDecoder=python38.PyUnicode_FSDecoder - PyUnicode_Find=python38.PyUnicode_Find - PyUnicode_FindChar=python38.PyUnicode_FindChar - PyUnicode_Format=python38.PyUnicode_Format - PyUnicode_FromEncodedObject=python38.PyUnicode_FromEncodedObject - PyUnicode_FromFormat=python38.PyUnicode_FromFormat - PyUnicode_FromFormatV=python38.PyUnicode_FromFormatV - PyUnicode_FromObject=python38.PyUnicode_FromObject - PyUnicode_FromOrdinal=python38.PyUnicode_FromOrdinal - PyUnicode_FromString=python38.PyUnicode_FromString - PyUnicode_FromStringAndSize=python38.PyUnicode_FromStringAndSize - PyUnicode_FromWideChar=python38.PyUnicode_FromWideChar - PyUnicode_GetDefaultEncoding=python38.PyUnicode_GetDefaultEncoding - PyUnicode_GetLength=python38.PyUnicode_GetLength - PyUnicode_GetSize=python38.PyUnicode_GetSize - PyUnicode_InternFromString=python38.PyUnicode_InternFromString - PyUnicode_InternImmortal=python38.PyUnicode_InternImmortal - PyUnicode_InternInPlace=python38.PyUnicode_InternInPlace - PyUnicode_IsIdentifier=python38.PyUnicode_IsIdentifier - PyUnicode_Join=python38.PyUnicode_Join - PyUnicode_Partition=python38.PyUnicode_Partition - PyUnicode_RPartition=python38.PyUnicode_RPartition - PyUnicode_RSplit=python38.PyUnicode_RSplit - PyUnicode_ReadChar=python38.PyUnicode_ReadChar - PyUnicode_Replace=python38.PyUnicode_Replace - PyUnicode_Resize=python38.PyUnicode_Resize - PyUnicode_RichCompare=python38.PyUnicode_RichCompare - PyUnicode_Split=python38.PyUnicode_Split - PyUnicode_Splitlines=python38.PyUnicode_Splitlines - PyUnicode_Substring=python38.PyUnicode_Substring - PyUnicode_Tailmatch=python38.PyUnicode_Tailmatch - PyUnicode_Translate=python38.PyUnicode_Translate - PyUnicode_Type=python38.PyUnicode_Type DATA - PyUnicode_WriteChar=python38.PyUnicode_WriteChar - PyWeakref_GetObject=python38.PyWeakref_GetObject - PyWeakref_NewProxy=python38.PyWeakref_NewProxy - PyWeakref_NewRef=python38.PyWeakref_NewRef - PyWrapperDescr_Type=python38.PyWrapperDescr_Type DATA - PyWrapper_New=python38.PyWrapper_New - PyZip_Type=python38.PyZip_Type DATA - Py_AddPendingCall=python38.Py_AddPendingCall - Py_AtExit=python38.Py_AtExit - Py_BuildValue=python38.Py_BuildValue - Py_CompileString=python38.Py_CompileString - Py_DecRef=python38.Py_DecRef - Py_DecodeLocale=python38.Py_DecodeLocale - Py_EncodeLocale=python38.Py_EncodeLocale - Py_EndInterpreter=python38.Py_EndInterpreter - Py_Exit=python38.Py_Exit - Py_FatalError=python38.Py_FatalError - Py_FileSystemDefaultEncodeErrors=python38.Py_FileSystemDefaultEncodeErrors DATA - Py_FileSystemDefaultEncoding=python38.Py_FileSystemDefaultEncoding DATA - Py_Finalize=python38.Py_Finalize - Py_FinalizeEx=python38.Py_FinalizeEx - Py_GetBuildInfo=python38.Py_GetBuildInfo - Py_GetCompiler=python38.Py_GetCompiler - Py_GetCopyright=python38.Py_GetCopyright - Py_GetExecPrefix=python38.Py_GetExecPrefix - Py_GetPath=python38.Py_GetPath - Py_GetPlatform=python38.Py_GetPlatform - Py_GetPrefix=python38.Py_GetPrefix - Py_GetProgramFullPath=python38.Py_GetProgramFullPath - Py_GetProgramName=python38.Py_GetProgramName - Py_GetPythonHome=python38.Py_GetPythonHome - Py_GetRecursionLimit=python38.Py_GetRecursionLimit - Py_GetVersion=python38.Py_GetVersion - Py_HasFileSystemDefaultEncoding=python38.Py_HasFileSystemDefaultEncoding DATA - Py_IncRef=python38.Py_IncRef - Py_Initialize=python38.Py_Initialize - Py_InitializeEx=python38.Py_InitializeEx - Py_IsInitialized=python38.Py_IsInitialized - Py_Main=python38.Py_Main - Py_MakePendingCalls=python38.Py_MakePendingCalls - Py_NewInterpreter=python38.Py_NewInterpreter - Py_ReprEnter=python38.Py_ReprEnter - Py_ReprLeave=python38.Py_ReprLeave - Py_SetPath=python38.Py_SetPath - Py_SetProgramName=python38.Py_SetProgramName - Py_SetPythonHome=python38.Py_SetPythonHome - Py_SetRecursionLimit=python38.Py_SetRecursionLimit - Py_SymtableString=python38.Py_SymtableString - Py_UTF8Mode=python38.Py_UTF8Mode DATA - Py_VaBuildValue=python38.Py_VaBuildValue - _PyArg_ParseTupleAndKeywords_SizeT=python38._PyArg_ParseTupleAndKeywords_SizeT - _PyArg_ParseTuple_SizeT=python38._PyArg_ParseTuple_SizeT - _PyArg_Parse_SizeT=python38._PyArg_Parse_SizeT - _PyArg_VaParseTupleAndKeywords_SizeT=python38._PyArg_VaParseTupleAndKeywords_SizeT - _PyArg_VaParse_SizeT=python38._PyArg_VaParse_SizeT - _PyErr_BadInternalCall=python38._PyErr_BadInternalCall - _PyObject_CallFunction_SizeT=python38._PyObject_CallFunction_SizeT - _PyObject_CallMethod_SizeT=python38._PyObject_CallMethod_SizeT - _PyObject_GC_Malloc=python38._PyObject_GC_Malloc - _PyObject_GC_New=python38._PyObject_GC_New - _PyObject_GC_NewVar=python38._PyObject_GC_NewVar - _PyObject_GC_Resize=python38._PyObject_GC_Resize - _PyObject_New=python38._PyObject_New - _PyObject_NewVar=python38._PyObject_NewVar - _PyState_AddModule=python38._PyState_AddModule - _PyThreadState_Init=python38._PyThreadState_Init - _PyThreadState_Prealloc=python38._PyThreadState_Prealloc - _PyTrash_delete_later=python38._PyTrash_delete_later DATA - _PyTrash_delete_nesting=python38._PyTrash_delete_nesting DATA - _PyTrash_deposit_object=python38._PyTrash_deposit_object - _PyTrash_destroy_chain=python38._PyTrash_destroy_chain - _PyTrash_thread_deposit_object=python38._PyTrash_thread_deposit_object - _PyTrash_thread_destroy_chain=python38._PyTrash_thread_destroy_chain - _PyWeakref_CallableProxyType=python38._PyWeakref_CallableProxyType DATA - _PyWeakref_ProxyType=python38._PyWeakref_ProxyType DATA - _PyWeakref_RefType=python38._PyWeakref_RefType DATA - _Py_BuildValue_SizeT=python38._Py_BuildValue_SizeT - _Py_CheckRecursionLimit=python38._Py_CheckRecursionLimit DATA - _Py_CheckRecursiveCall=python38._Py_CheckRecursiveCall - _Py_Dealloc=python38._Py_Dealloc - _Py_EllipsisObject=python38._Py_EllipsisObject DATA - _Py_FalseStruct=python38._Py_FalseStruct DATA - _Py_NoneStruct=python38._Py_NoneStruct DATA - _Py_NotImplementedStruct=python38._Py_NotImplementedStruct DATA - _Py_SwappedOp=python38._Py_SwappedOp DATA - _Py_TrueStruct=python38._Py_TrueStruct DATA - _Py_VaBuildValue_SizeT=python38._Py_VaBuildValue_SizeT + PyArg_Parse=python39.PyArg_Parse + PyArg_ParseTuple=python39.PyArg_ParseTuple + PyArg_ParseTupleAndKeywords=python39.PyArg_ParseTupleAndKeywords + PyArg_UnpackTuple=python39.PyArg_UnpackTuple + PyArg_VaParse=python39.PyArg_VaParse + PyArg_VaParseTupleAndKeywords=python39.PyArg_VaParseTupleAndKeywords + PyArg_ValidateKeywordArguments=python39.PyArg_ValidateKeywordArguments + PyBaseObject_Type=python39.PyBaseObject_Type DATA + PyBool_FromLong=python39.PyBool_FromLong + PyBool_Type=python39.PyBool_Type DATA + PyByteArrayIter_Type=python39.PyByteArrayIter_Type DATA + PyByteArray_AsString=python39.PyByteArray_AsString + PyByteArray_Concat=python39.PyByteArray_Concat + PyByteArray_FromObject=python39.PyByteArray_FromObject + PyByteArray_FromStringAndSize=python39.PyByteArray_FromStringAndSize + PyByteArray_Resize=python39.PyByteArray_Resize + PyByteArray_Size=python39.PyByteArray_Size + PyByteArray_Type=python39.PyByteArray_Type DATA + PyBytesIter_Type=python39.PyBytesIter_Type DATA + PyBytes_AsString=python39.PyBytes_AsString + PyBytes_AsStringAndSize=python39.PyBytes_AsStringAndSize + PyBytes_Concat=python39.PyBytes_Concat + PyBytes_ConcatAndDel=python39.PyBytes_ConcatAndDel + PyBytes_DecodeEscape=python39.PyBytes_DecodeEscape + PyBytes_FromFormat=python39.PyBytes_FromFormat + PyBytes_FromFormatV=python39.PyBytes_FromFormatV + PyBytes_FromObject=python39.PyBytes_FromObject + PyBytes_FromString=python39.PyBytes_FromString + PyBytes_FromStringAndSize=python39.PyBytes_FromStringAndSize + PyBytes_Repr=python39.PyBytes_Repr + PyBytes_Size=python39.PyBytes_Size + PyBytes_Type=python39.PyBytes_Type DATA + PyCFunction_Call=python39.PyCFunction_Call + PyCFunction_GetFlags=python39.PyCFunction_GetFlags + PyCFunction_GetFunction=python39.PyCFunction_GetFunction + PyCFunction_GetSelf=python39.PyCFunction_GetSelf + PyCFunction_New=python39.PyCFunction_New + PyCFunction_NewEx=python39.PyCFunction_NewEx + PyCFunction_Type=python39.PyCFunction_Type DATA + PyCallIter_New=python39.PyCallIter_New + PyCallIter_Type=python39.PyCallIter_Type DATA + PyCallable_Check=python39.PyCallable_Check + PyCapsule_GetContext=python39.PyCapsule_GetContext + PyCapsule_GetDestructor=python39.PyCapsule_GetDestructor + PyCapsule_GetName=python39.PyCapsule_GetName + PyCapsule_GetPointer=python39.PyCapsule_GetPointer + PyCapsule_Import=python39.PyCapsule_Import + PyCapsule_IsValid=python39.PyCapsule_IsValid + PyCapsule_New=python39.PyCapsule_New + PyCapsule_SetContext=python39.PyCapsule_SetContext + PyCapsule_SetDestructor=python39.PyCapsule_SetDestructor + PyCapsule_SetName=python39.PyCapsule_SetName + PyCapsule_SetPointer=python39.PyCapsule_SetPointer + PyCapsule_Type=python39.PyCapsule_Type DATA + PyClassMethodDescr_Type=python39.PyClassMethodDescr_Type DATA + PyCodec_BackslashReplaceErrors=python39.PyCodec_BackslashReplaceErrors + PyCodec_Decode=python39.PyCodec_Decode + PyCodec_Decoder=python39.PyCodec_Decoder + PyCodec_Encode=python39.PyCodec_Encode + PyCodec_Encoder=python39.PyCodec_Encoder + PyCodec_IgnoreErrors=python39.PyCodec_IgnoreErrors + PyCodec_IncrementalDecoder=python39.PyCodec_IncrementalDecoder + PyCodec_IncrementalEncoder=python39.PyCodec_IncrementalEncoder + PyCodec_KnownEncoding=python39.PyCodec_KnownEncoding + PyCodec_LookupError=python39.PyCodec_LookupError + PyCodec_NameReplaceErrors=python39.PyCodec_NameReplaceErrors + PyCodec_Register=python39.PyCodec_Register + PyCodec_RegisterError=python39.PyCodec_RegisterError + PyCodec_ReplaceErrors=python39.PyCodec_ReplaceErrors + PyCodec_StreamReader=python39.PyCodec_StreamReader + PyCodec_StreamWriter=python39.PyCodec_StreamWriter + PyCodec_StrictErrors=python39.PyCodec_StrictErrors + PyCodec_XMLCharRefReplaceErrors=python39.PyCodec_XMLCharRefReplaceErrors + PyComplex_FromDoubles=python39.PyComplex_FromDoubles + PyComplex_ImagAsDouble=python39.PyComplex_ImagAsDouble + PyComplex_RealAsDouble=python39.PyComplex_RealAsDouble + PyComplex_Type=python39.PyComplex_Type DATA + PyDescr_NewClassMethod=python39.PyDescr_NewClassMethod + PyDescr_NewGetSet=python39.PyDescr_NewGetSet + PyDescr_NewMember=python39.PyDescr_NewMember + PyDescr_NewMethod=python39.PyDescr_NewMethod + PyDictItems_Type=python39.PyDictItems_Type DATA + PyDictIterItem_Type=python39.PyDictIterItem_Type DATA + PyDictIterKey_Type=python39.PyDictIterKey_Type DATA + PyDictIterValue_Type=python39.PyDictIterValue_Type DATA + PyDictKeys_Type=python39.PyDictKeys_Type DATA + PyDictProxy_New=python39.PyDictProxy_New + PyDictProxy_Type=python39.PyDictProxy_Type DATA + PyDictValues_Type=python39.PyDictValues_Type DATA + PyDict_Clear=python39.PyDict_Clear + PyDict_Contains=python39.PyDict_Contains + PyDict_Copy=python39.PyDict_Copy + PyDict_DelItem=python39.PyDict_DelItem + PyDict_DelItemString=python39.PyDict_DelItemString + PyDict_GetItem=python39.PyDict_GetItem + PyDict_GetItemString=python39.PyDict_GetItemString + PyDict_GetItemWithError=python39.PyDict_GetItemWithError + PyDict_Items=python39.PyDict_Items + PyDict_Keys=python39.PyDict_Keys + PyDict_Merge=python39.PyDict_Merge + PyDict_MergeFromSeq2=python39.PyDict_MergeFromSeq2 + PyDict_New=python39.PyDict_New + PyDict_Next=python39.PyDict_Next + PyDict_SetItem=python39.PyDict_SetItem + PyDict_SetItemString=python39.PyDict_SetItemString + PyDict_Size=python39.PyDict_Size + PyDict_Type=python39.PyDict_Type DATA + PyDict_Update=python39.PyDict_Update + PyDict_Values=python39.PyDict_Values + PyEllipsis_Type=python39.PyEllipsis_Type DATA + PyEnum_Type=python39.PyEnum_Type DATA + PyErr_BadArgument=python39.PyErr_BadArgument + PyErr_BadInternalCall=python39.PyErr_BadInternalCall + PyErr_CheckSignals=python39.PyErr_CheckSignals + PyErr_Clear=python39.PyErr_Clear + PyErr_Display=python39.PyErr_Display + PyErr_ExceptionMatches=python39.PyErr_ExceptionMatches + PyErr_Fetch=python39.PyErr_Fetch + PyErr_Format=python39.PyErr_Format + PyErr_FormatV=python39.PyErr_FormatV + PyErr_GetExcInfo=python39.PyErr_GetExcInfo + PyErr_GivenExceptionMatches=python39.PyErr_GivenExceptionMatches + PyErr_NewException=python39.PyErr_NewException + PyErr_NewExceptionWithDoc=python39.PyErr_NewExceptionWithDoc + PyErr_NoMemory=python39.PyErr_NoMemory + PyErr_NormalizeException=python39.PyErr_NormalizeException + PyErr_Occurred=python39.PyErr_Occurred + PyErr_Print=python39.PyErr_Print + PyErr_PrintEx=python39.PyErr_PrintEx + PyErr_ProgramText=python39.PyErr_ProgramText + PyErr_ResourceWarning=python39.PyErr_ResourceWarning + PyErr_Restore=python39.PyErr_Restore + PyErr_SetExcFromWindowsErr=python39.PyErr_SetExcFromWindowsErr + PyErr_SetExcFromWindowsErrWithFilename=python39.PyErr_SetExcFromWindowsErrWithFilename + PyErr_SetExcFromWindowsErrWithFilenameObject=python39.PyErr_SetExcFromWindowsErrWithFilenameObject + PyErr_SetExcFromWindowsErrWithFilenameObjects=python39.PyErr_SetExcFromWindowsErrWithFilenameObjects + PyErr_SetExcInfo=python39.PyErr_SetExcInfo + PyErr_SetFromErrno=python39.PyErr_SetFromErrno + PyErr_SetFromErrnoWithFilename=python39.PyErr_SetFromErrnoWithFilename + PyErr_SetFromErrnoWithFilenameObject=python39.PyErr_SetFromErrnoWithFilenameObject + PyErr_SetFromErrnoWithFilenameObjects=python39.PyErr_SetFromErrnoWithFilenameObjects + PyErr_SetFromWindowsErr=python39.PyErr_SetFromWindowsErr + PyErr_SetFromWindowsErrWithFilename=python39.PyErr_SetFromWindowsErrWithFilename + PyErr_SetImportError=python39.PyErr_SetImportError + PyErr_SetImportErrorSubclass=python39.PyErr_SetImportErrorSubclass + PyErr_SetInterrupt=python39.PyErr_SetInterrupt + PyErr_SetNone=python39.PyErr_SetNone + PyErr_SetObject=python39.PyErr_SetObject + PyErr_SetString=python39.PyErr_SetString + PyErr_SyntaxLocation=python39.PyErr_SyntaxLocation + PyErr_SyntaxLocationEx=python39.PyErr_SyntaxLocationEx + PyErr_WarnEx=python39.PyErr_WarnEx + PyErr_WarnExplicit=python39.PyErr_WarnExplicit + PyErr_WarnFormat=python39.PyErr_WarnFormat + PyErr_WriteUnraisable=python39.PyErr_WriteUnraisable + PyEval_AcquireLock=python39.PyEval_AcquireLock + PyEval_AcquireThread=python39.PyEval_AcquireThread + PyEval_CallFunction=python39.PyEval_CallFunction + PyEval_CallMethod=python39.PyEval_CallMethod + PyEval_CallObjectWithKeywords=python39.PyEval_CallObjectWithKeywords + PyEval_EvalCode=python39.PyEval_EvalCode + PyEval_EvalCodeEx=python39.PyEval_EvalCodeEx + PyEval_EvalFrame=python39.PyEval_EvalFrame + PyEval_EvalFrameEx=python39.PyEval_EvalFrameEx + PyEval_GetBuiltins=python39.PyEval_GetBuiltins + PyEval_GetCallStats=python39.PyEval_GetCallStats + PyEval_GetFrame=python39.PyEval_GetFrame + PyEval_GetFuncDesc=python39.PyEval_GetFuncDesc + PyEval_GetFuncName=python39.PyEval_GetFuncName + PyEval_GetGlobals=python39.PyEval_GetGlobals + PyEval_GetLocals=python39.PyEval_GetLocals + PyEval_InitThreads=python39.PyEval_InitThreads + PyEval_ReInitThreads=python39.PyEval_ReInitThreads + PyEval_ReleaseLock=python39.PyEval_ReleaseLock + PyEval_ReleaseThread=python39.PyEval_ReleaseThread + PyEval_RestoreThread=python39.PyEval_RestoreThread + PyEval_SaveThread=python39.PyEval_SaveThread + PyEval_ThreadsInitialized=python39.PyEval_ThreadsInitialized + PyExc_ArithmeticError=python39.PyExc_ArithmeticError DATA + PyExc_AssertionError=python39.PyExc_AssertionError DATA + PyExc_AttributeError=python39.PyExc_AttributeError DATA + PyExc_BaseException=python39.PyExc_BaseException DATA + PyExc_BlockingIOError=python39.PyExc_BlockingIOError DATA + PyExc_BrokenPipeError=python39.PyExc_BrokenPipeError DATA + PyExc_BufferError=python39.PyExc_BufferError DATA + PyExc_BytesWarning=python39.PyExc_BytesWarning DATA + PyExc_ChildProcessError=python39.PyExc_ChildProcessError DATA + PyExc_ConnectionAbortedError=python39.PyExc_ConnectionAbortedError DATA + PyExc_ConnectionError=python39.PyExc_ConnectionError DATA + PyExc_ConnectionRefusedError=python39.PyExc_ConnectionRefusedError DATA + PyExc_ConnectionResetError=python39.PyExc_ConnectionResetError DATA + PyExc_DeprecationWarning=python39.PyExc_DeprecationWarning DATA + PyExc_EOFError=python39.PyExc_EOFError DATA + PyExc_EnvironmentError=python39.PyExc_EnvironmentError DATA + PyExc_Exception=python39.PyExc_Exception DATA + PyExc_FileExistsError=python39.PyExc_FileExistsError DATA + PyExc_FileNotFoundError=python39.PyExc_FileNotFoundError DATA + PyExc_FloatingPointError=python39.PyExc_FloatingPointError DATA + PyExc_FutureWarning=python39.PyExc_FutureWarning DATA + PyExc_GeneratorExit=python39.PyExc_GeneratorExit DATA + PyExc_IOError=python39.PyExc_IOError DATA + PyExc_ImportError=python39.PyExc_ImportError DATA + PyExc_ImportWarning=python39.PyExc_ImportWarning DATA + PyExc_IndentationError=python39.PyExc_IndentationError DATA + PyExc_IndexError=python39.PyExc_IndexError DATA + PyExc_InterruptedError=python39.PyExc_InterruptedError DATA + PyExc_IsADirectoryError=python39.PyExc_IsADirectoryError DATA + PyExc_KeyError=python39.PyExc_KeyError DATA + PyExc_KeyboardInterrupt=python39.PyExc_KeyboardInterrupt DATA + PyExc_LookupError=python39.PyExc_LookupError DATA + PyExc_MemoryError=python39.PyExc_MemoryError DATA + PyExc_ModuleNotFoundError=python39.PyExc_ModuleNotFoundError DATA + PyExc_NameError=python39.PyExc_NameError DATA + PyExc_NotADirectoryError=python39.PyExc_NotADirectoryError DATA + PyExc_NotImplementedError=python39.PyExc_NotImplementedError DATA + PyExc_OSError=python39.PyExc_OSError DATA + PyExc_OverflowError=python39.PyExc_OverflowError DATA + PyExc_PendingDeprecationWarning=python39.PyExc_PendingDeprecationWarning DATA + PyExc_PermissionError=python39.PyExc_PermissionError DATA + PyExc_ProcessLookupError=python39.PyExc_ProcessLookupError DATA + PyExc_RecursionError=python39.PyExc_RecursionError DATA + PyExc_ReferenceError=python39.PyExc_ReferenceError DATA + PyExc_ResourceWarning=python39.PyExc_ResourceWarning DATA + PyExc_RuntimeError=python39.PyExc_RuntimeError DATA + PyExc_RuntimeWarning=python39.PyExc_RuntimeWarning DATA + PyExc_StopAsyncIteration=python39.PyExc_StopAsyncIteration DATA + PyExc_StopIteration=python39.PyExc_StopIteration DATA + PyExc_SyntaxError=python39.PyExc_SyntaxError DATA + PyExc_SyntaxWarning=python39.PyExc_SyntaxWarning DATA + PyExc_SystemError=python39.PyExc_SystemError DATA + PyExc_SystemExit=python39.PyExc_SystemExit DATA + PyExc_TabError=python39.PyExc_TabError DATA + PyExc_TimeoutError=python39.PyExc_TimeoutError DATA + PyExc_TypeError=python39.PyExc_TypeError DATA + PyExc_UnboundLocalError=python39.PyExc_UnboundLocalError DATA + PyExc_UnicodeDecodeError=python39.PyExc_UnicodeDecodeError DATA + PyExc_UnicodeEncodeError=python39.PyExc_UnicodeEncodeError DATA + PyExc_UnicodeError=python39.PyExc_UnicodeError DATA + PyExc_UnicodeTranslateError=python39.PyExc_UnicodeTranslateError DATA + PyExc_UnicodeWarning=python39.PyExc_UnicodeWarning DATA + PyExc_UserWarning=python39.PyExc_UserWarning DATA + PyExc_ValueError=python39.PyExc_ValueError DATA + PyExc_Warning=python39.PyExc_Warning DATA + PyExc_WindowsError=python39.PyExc_WindowsError DATA + PyExc_ZeroDivisionError=python39.PyExc_ZeroDivisionError DATA + PyExceptionClass_Name=python39.PyExceptionClass_Name + PyException_GetCause=python39.PyException_GetCause + PyException_GetContext=python39.PyException_GetContext + PyException_GetTraceback=python39.PyException_GetTraceback + PyException_SetCause=python39.PyException_SetCause + PyException_SetContext=python39.PyException_SetContext + PyException_SetTraceback=python39.PyException_SetTraceback + PyFile_FromFd=python39.PyFile_FromFd + PyFile_GetLine=python39.PyFile_GetLine + PyFile_WriteObject=python39.PyFile_WriteObject + PyFile_WriteString=python39.PyFile_WriteString + PyFilter_Type=python39.PyFilter_Type DATA + PyFloat_AsDouble=python39.PyFloat_AsDouble + PyFloat_FromDouble=python39.PyFloat_FromDouble + PyFloat_FromString=python39.PyFloat_FromString + PyFloat_GetInfo=python39.PyFloat_GetInfo + PyFloat_GetMax=python39.PyFloat_GetMax + PyFloat_GetMin=python39.PyFloat_GetMin + PyFloat_Type=python39.PyFloat_Type DATA + PyFrozenSet_New=python39.PyFrozenSet_New + PyFrozenSet_Type=python39.PyFrozenSet_Type DATA + PyGC_Collect=python39.PyGC_Collect + PyGILState_Ensure=python39.PyGILState_Ensure + PyGILState_GetThisThreadState=python39.PyGILState_GetThisThreadState + PyGILState_Release=python39.PyGILState_Release + PyGetSetDescr_Type=python39.PyGetSetDescr_Type DATA + PyImport_AddModule=python39.PyImport_AddModule + PyImport_AddModuleObject=python39.PyImport_AddModuleObject + PyImport_AppendInittab=python39.PyImport_AppendInittab + PyImport_Cleanup=python39.PyImport_Cleanup + PyImport_ExecCodeModule=python39.PyImport_ExecCodeModule + PyImport_ExecCodeModuleEx=python39.PyImport_ExecCodeModuleEx + PyImport_ExecCodeModuleObject=python39.PyImport_ExecCodeModuleObject + PyImport_ExecCodeModuleWithPathnames=python39.PyImport_ExecCodeModuleWithPathnames + PyImport_GetImporter=python39.PyImport_GetImporter + PyImport_GetMagicNumber=python39.PyImport_GetMagicNumber + PyImport_GetMagicTag=python39.PyImport_GetMagicTag + PyImport_GetModule=python39.PyImport_GetModule + PyImport_GetModuleDict=python39.PyImport_GetModuleDict + PyImport_Import=python39.PyImport_Import + PyImport_ImportFrozenModule=python39.PyImport_ImportFrozenModule + PyImport_ImportFrozenModuleObject=python39.PyImport_ImportFrozenModuleObject + PyImport_ImportModule=python39.PyImport_ImportModule + PyImport_ImportModuleLevel=python39.PyImport_ImportModuleLevel + PyImport_ImportModuleLevelObject=python39.PyImport_ImportModuleLevelObject + PyImport_ImportModuleNoBlock=python39.PyImport_ImportModuleNoBlock + PyImport_ReloadModule=python39.PyImport_ReloadModule + PyIndex_Check=python39.PyIndex_Check + PyInterpreterState_Clear=python39.PyInterpreterState_Clear + PyInterpreterState_Delete=python39.PyInterpreterState_Delete + PyInterpreterState_New=python39.PyInterpreterState_New + PyIter_Check=python39.PyIter_Check + PyIter_Next=python39.PyIter_Next + PyListIter_Type=python39.PyListIter_Type DATA + PyListRevIter_Type=python39.PyListRevIter_Type DATA + PyList_Append=python39.PyList_Append + PyList_AsTuple=python39.PyList_AsTuple + PyList_GetItem=python39.PyList_GetItem + PyList_GetSlice=python39.PyList_GetSlice + PyList_Insert=python39.PyList_Insert + PyList_New=python39.PyList_New + PyList_Reverse=python39.PyList_Reverse + PyList_SetItem=python39.PyList_SetItem + PyList_SetSlice=python39.PyList_SetSlice + PyList_Size=python39.PyList_Size + PyList_Sort=python39.PyList_Sort + PyList_Type=python39.PyList_Type DATA + PyLongRangeIter_Type=python39.PyLongRangeIter_Type DATA + PyLong_AsDouble=python39.PyLong_AsDouble + PyLong_AsLong=python39.PyLong_AsLong + PyLong_AsLongAndOverflow=python39.PyLong_AsLongAndOverflow + PyLong_AsLongLong=python39.PyLong_AsLongLong + PyLong_AsLongLongAndOverflow=python39.PyLong_AsLongLongAndOverflow + PyLong_AsSize_t=python39.PyLong_AsSize_t + PyLong_AsSsize_t=python39.PyLong_AsSsize_t + PyLong_AsUnsignedLong=python39.PyLong_AsUnsignedLong + PyLong_AsUnsignedLongLong=python39.PyLong_AsUnsignedLongLong + PyLong_AsUnsignedLongLongMask=python39.PyLong_AsUnsignedLongLongMask + PyLong_AsUnsignedLongMask=python39.PyLong_AsUnsignedLongMask + PyLong_AsVoidPtr=python39.PyLong_AsVoidPtr + PyLong_FromDouble=python39.PyLong_FromDouble + PyLong_FromLong=python39.PyLong_FromLong + PyLong_FromLongLong=python39.PyLong_FromLongLong + PyLong_FromSize_t=python39.PyLong_FromSize_t + PyLong_FromSsize_t=python39.PyLong_FromSsize_t + PyLong_FromString=python39.PyLong_FromString + PyLong_FromUnsignedLong=python39.PyLong_FromUnsignedLong + PyLong_FromUnsignedLongLong=python39.PyLong_FromUnsignedLongLong + PyLong_FromVoidPtr=python39.PyLong_FromVoidPtr + PyLong_GetInfo=python39.PyLong_GetInfo + PyLong_Type=python39.PyLong_Type DATA + PyMap_Type=python39.PyMap_Type DATA + PyMapping_Check=python39.PyMapping_Check + PyMapping_GetItemString=python39.PyMapping_GetItemString + PyMapping_HasKey=python39.PyMapping_HasKey + PyMapping_HasKeyString=python39.PyMapping_HasKeyString + PyMapping_Items=python39.PyMapping_Items + PyMapping_Keys=python39.PyMapping_Keys + PyMapping_Length=python39.PyMapping_Length + PyMapping_SetItemString=python39.PyMapping_SetItemString + PyMapping_Size=python39.PyMapping_Size + PyMapping_Values=python39.PyMapping_Values + PyMem_Calloc=python39.PyMem_Calloc + PyMem_Free=python39.PyMem_Free + PyMem_Malloc=python39.PyMem_Malloc + PyMem_Realloc=python39.PyMem_Realloc + PyMemberDescr_Type=python39.PyMemberDescr_Type DATA + PyMemoryView_FromMemory=python39.PyMemoryView_FromMemory + PyMemoryView_FromObject=python39.PyMemoryView_FromObject + PyMemoryView_GetContiguous=python39.PyMemoryView_GetContiguous + PyMemoryView_Type=python39.PyMemoryView_Type DATA + PyMethodDescr_Type=python39.PyMethodDescr_Type DATA + PyModuleDef_Init=python39.PyModuleDef_Init + PyModuleDef_Type=python39.PyModuleDef_Type DATA + PyModule_AddFunctions=python39.PyModule_AddFunctions + PyModule_AddIntConstant=python39.PyModule_AddIntConstant + PyModule_AddObject=python39.PyModule_AddObject + PyModule_AddStringConstant=python39.PyModule_AddStringConstant + PyModule_Create2=python39.PyModule_Create2 + PyModule_ExecDef=python39.PyModule_ExecDef + PyModule_FromDefAndSpec2=python39.PyModule_FromDefAndSpec2 + PyModule_GetDef=python39.PyModule_GetDef + PyModule_GetDict=python39.PyModule_GetDict + PyModule_GetFilename=python39.PyModule_GetFilename + PyModule_GetFilenameObject=python39.PyModule_GetFilenameObject + PyModule_GetName=python39.PyModule_GetName + PyModule_GetNameObject=python39.PyModule_GetNameObject + PyModule_GetState=python39.PyModule_GetState + PyModule_New=python39.PyModule_New + PyModule_NewObject=python39.PyModule_NewObject + PyModule_SetDocString=python39.PyModule_SetDocString + PyModule_Type=python39.PyModule_Type DATA + PyNullImporter_Type=python39.PyNullImporter_Type DATA + PyNumber_Absolute=python39.PyNumber_Absolute + PyNumber_Add=python39.PyNumber_Add + PyNumber_And=python39.PyNumber_And + PyNumber_AsSsize_t=python39.PyNumber_AsSsize_t + PyNumber_Check=python39.PyNumber_Check + PyNumber_Divmod=python39.PyNumber_Divmod + PyNumber_Float=python39.PyNumber_Float + PyNumber_FloorDivide=python39.PyNumber_FloorDivide + PyNumber_InPlaceAdd=python39.PyNumber_InPlaceAdd + PyNumber_InPlaceAnd=python39.PyNumber_InPlaceAnd + PyNumber_InPlaceFloorDivide=python39.PyNumber_InPlaceFloorDivide + PyNumber_InPlaceLshift=python39.PyNumber_InPlaceLshift + PyNumber_InPlaceMatrixMultiply=python39.PyNumber_InPlaceMatrixMultiply + PyNumber_InPlaceMultiply=python39.PyNumber_InPlaceMultiply + PyNumber_InPlaceOr=python39.PyNumber_InPlaceOr + PyNumber_InPlacePower=python39.PyNumber_InPlacePower + PyNumber_InPlaceRemainder=python39.PyNumber_InPlaceRemainder + PyNumber_InPlaceRshift=python39.PyNumber_InPlaceRshift + PyNumber_InPlaceSubtract=python39.PyNumber_InPlaceSubtract + PyNumber_InPlaceTrueDivide=python39.PyNumber_InPlaceTrueDivide + PyNumber_InPlaceXor=python39.PyNumber_InPlaceXor + PyNumber_Index=python39.PyNumber_Index + PyNumber_Invert=python39.PyNumber_Invert + PyNumber_Long=python39.PyNumber_Long + PyNumber_Lshift=python39.PyNumber_Lshift + PyNumber_MatrixMultiply=python39.PyNumber_MatrixMultiply + PyNumber_Multiply=python39.PyNumber_Multiply + PyNumber_Negative=python39.PyNumber_Negative + PyNumber_Or=python39.PyNumber_Or + PyNumber_Positive=python39.PyNumber_Positive + PyNumber_Power=python39.PyNumber_Power + PyNumber_Remainder=python39.PyNumber_Remainder + PyNumber_Rshift=python39.PyNumber_Rshift + PyNumber_Subtract=python39.PyNumber_Subtract + PyNumber_ToBase=python39.PyNumber_ToBase + PyNumber_TrueDivide=python39.PyNumber_TrueDivide + PyNumber_Xor=python39.PyNumber_Xor + PyODictItems_Type=python39.PyODictItems_Type DATA + PyODictIter_Type=python39.PyODictIter_Type DATA + PyODictKeys_Type=python39.PyODictKeys_Type DATA + PyODictValues_Type=python39.PyODictValues_Type DATA + PyODict_DelItem=python39.PyODict_DelItem + PyODict_New=python39.PyODict_New + PyODict_SetItem=python39.PyODict_SetItem + PyODict_Type=python39.PyODict_Type DATA + PyOS_AfterFork=python39.PyOS_AfterFork + PyOS_CheckStack=python39.PyOS_CheckStack + PyOS_FSPath=python39.PyOS_FSPath + PyOS_InitInterrupts=python39.PyOS_InitInterrupts + PyOS_InputHook=python39.PyOS_InputHook DATA + PyOS_InterruptOccurred=python39.PyOS_InterruptOccurred + PyOS_ReadlineFunctionPointer=python39.PyOS_ReadlineFunctionPointer DATA + PyOS_double_to_string=python39.PyOS_double_to_string + PyOS_getsig=python39.PyOS_getsig + PyOS_mystricmp=python39.PyOS_mystricmp + PyOS_mystrnicmp=python39.PyOS_mystrnicmp + PyOS_setsig=python39.PyOS_setsig + PyOS_snprintf=python39.PyOS_snprintf + PyOS_string_to_double=python39.PyOS_string_to_double + PyOS_strtol=python39.PyOS_strtol + PyOS_strtoul=python39.PyOS_strtoul + PyOS_vsnprintf=python39.PyOS_vsnprintf + PyObject_ASCII=python39.PyObject_ASCII + PyObject_AsCharBuffer=python39.PyObject_AsCharBuffer + PyObject_AsFileDescriptor=python39.PyObject_AsFileDescriptor + PyObject_AsReadBuffer=python39.PyObject_AsReadBuffer + PyObject_AsWriteBuffer=python39.PyObject_AsWriteBuffer + PyObject_Bytes=python39.PyObject_Bytes + PyObject_Call=python39.PyObject_Call + PyObject_CallFunction=python39.PyObject_CallFunction + PyObject_CallFunctionObjArgs=python39.PyObject_CallFunctionObjArgs + PyObject_CallMethod=python39.PyObject_CallMethod + PyObject_CallMethodObjArgs=python39.PyObject_CallMethodObjArgs + PyObject_CallObject=python39.PyObject_CallObject + PyObject_Calloc=python39.PyObject_Calloc + PyObject_CheckReadBuffer=python39.PyObject_CheckReadBuffer + PyObject_ClearWeakRefs=python39.PyObject_ClearWeakRefs + PyObject_DelItem=python39.PyObject_DelItem + PyObject_DelItemString=python39.PyObject_DelItemString + PyObject_Dir=python39.PyObject_Dir + PyObject_Format=python39.PyObject_Format + PyObject_Free=python39.PyObject_Free + PyObject_GC_Del=python39.PyObject_GC_Del + PyObject_GC_Track=python39.PyObject_GC_Track + PyObject_GC_UnTrack=python39.PyObject_GC_UnTrack + PyObject_GenericGetAttr=python39.PyObject_GenericGetAttr + PyObject_GenericSetAttr=python39.PyObject_GenericSetAttr + PyObject_GenericSetDict=python39.PyObject_GenericSetDict + PyObject_GetAttr=python39.PyObject_GetAttr + PyObject_GetAttrString=python39.PyObject_GetAttrString + PyObject_GetItem=python39.PyObject_GetItem + PyObject_GetIter=python39.PyObject_GetIter + PyObject_HasAttr=python39.PyObject_HasAttr + PyObject_HasAttrString=python39.PyObject_HasAttrString + PyObject_Hash=python39.PyObject_Hash + PyObject_HashNotImplemented=python39.PyObject_HashNotImplemented + PyObject_Init=python39.PyObject_Init + PyObject_InitVar=python39.PyObject_InitVar + PyObject_IsInstance=python39.PyObject_IsInstance + PyObject_IsSubclass=python39.PyObject_IsSubclass + PyObject_IsTrue=python39.PyObject_IsTrue + PyObject_Length=python39.PyObject_Length + PyObject_Malloc=python39.PyObject_Malloc + PyObject_Not=python39.PyObject_Not + PyObject_Realloc=python39.PyObject_Realloc + PyObject_Repr=python39.PyObject_Repr + PyObject_RichCompare=python39.PyObject_RichCompare + PyObject_RichCompareBool=python39.PyObject_RichCompareBool + PyObject_SelfIter=python39.PyObject_SelfIter + PyObject_SetAttr=python39.PyObject_SetAttr + PyObject_SetAttrString=python39.PyObject_SetAttrString + PyObject_SetItem=python39.PyObject_SetItem + PyObject_Size=python39.PyObject_Size + PyObject_Str=python39.PyObject_Str + PyObject_Type=python39.PyObject_Type + PyParser_SimpleParseFileFlags=python39.PyParser_SimpleParseFileFlags + PyParser_SimpleParseStringFlags=python39.PyParser_SimpleParseStringFlags + PyParser_SimpleParseStringFlagsFilename=python39.PyParser_SimpleParseStringFlagsFilename + PyProperty_Type=python39.PyProperty_Type DATA + PyRangeIter_Type=python39.PyRangeIter_Type DATA + PyRange_Type=python39.PyRange_Type DATA + PyReversed_Type=python39.PyReversed_Type DATA + PySeqIter_New=python39.PySeqIter_New + PySeqIter_Type=python39.PySeqIter_Type DATA + PySequence_Check=python39.PySequence_Check + PySequence_Concat=python39.PySequence_Concat + PySequence_Contains=python39.PySequence_Contains + PySequence_Count=python39.PySequence_Count + PySequence_DelItem=python39.PySequence_DelItem + PySequence_DelSlice=python39.PySequence_DelSlice + PySequence_Fast=python39.PySequence_Fast + PySequence_GetItem=python39.PySequence_GetItem + PySequence_GetSlice=python39.PySequence_GetSlice + PySequence_In=python39.PySequence_In + PySequence_InPlaceConcat=python39.PySequence_InPlaceConcat + PySequence_InPlaceRepeat=python39.PySequence_InPlaceRepeat + PySequence_Index=python39.PySequence_Index + PySequence_Length=python39.PySequence_Length + PySequence_List=python39.PySequence_List + PySequence_Repeat=python39.PySequence_Repeat + PySequence_SetItem=python39.PySequence_SetItem + PySequence_SetSlice=python39.PySequence_SetSlice + PySequence_Size=python39.PySequence_Size + PySequence_Tuple=python39.PySequence_Tuple + PySetIter_Type=python39.PySetIter_Type DATA + PySet_Add=python39.PySet_Add + PySet_Clear=python39.PySet_Clear + PySet_Contains=python39.PySet_Contains + PySet_Discard=python39.PySet_Discard + PySet_New=python39.PySet_New + PySet_Pop=python39.PySet_Pop + PySet_Size=python39.PySet_Size + PySet_Type=python39.PySet_Type DATA + PySlice_AdjustIndices=python39.PySlice_AdjustIndices + PySlice_GetIndices=python39.PySlice_GetIndices + PySlice_GetIndicesEx=python39.PySlice_GetIndicesEx + PySlice_New=python39.PySlice_New + PySlice_Type=python39.PySlice_Type DATA + PySlice_Unpack=python39.PySlice_Unpack + PySortWrapper_Type=python39.PySortWrapper_Type DATA + PyInterpreterState_GetID=python39.PyInterpreterState_GetID + PyState_AddModule=python39.PyState_AddModule + PyState_FindModule=python39.PyState_FindModule + PyState_RemoveModule=python39.PyState_RemoveModule + PyStructSequence_GetItem=python39.PyStructSequence_GetItem + PyStructSequence_New=python39.PyStructSequence_New + PyStructSequence_NewType=python39.PyStructSequence_NewType + PyStructSequence_SetItem=python39.PyStructSequence_SetItem + PySuper_Type=python39.PySuper_Type DATA + PySys_AddWarnOption=python39.PySys_AddWarnOption + PySys_AddWarnOptionUnicode=python39.PySys_AddWarnOptionUnicode + PySys_AddXOption=python39.PySys_AddXOption + PySys_FormatStderr=python39.PySys_FormatStderr + PySys_FormatStdout=python39.PySys_FormatStdout + PySys_GetObject=python39.PySys_GetObject + PySys_GetXOptions=python39.PySys_GetXOptions + PySys_HasWarnOptions=python39.PySys_HasWarnOptions + PySys_ResetWarnOptions=python39.PySys_ResetWarnOptions + PySys_SetArgv=python39.PySys_SetArgv + PySys_SetArgvEx=python39.PySys_SetArgvEx + PySys_SetObject=python39.PySys_SetObject + PySys_SetPath=python39.PySys_SetPath + PySys_WriteStderr=python39.PySys_WriteStderr + PySys_WriteStdout=python39.PySys_WriteStdout + PyThreadState_Clear=python39.PyThreadState_Clear + PyThreadState_Delete=python39.PyThreadState_Delete + PyThreadState_DeleteCurrent=python39.PyThreadState_DeleteCurrent + PyThreadState_Get=python39.PyThreadState_Get + PyThreadState_GetDict=python39.PyThreadState_GetDict + PyThreadState_New=python39.PyThreadState_New + PyThreadState_SetAsyncExc=python39.PyThreadState_SetAsyncExc + PyThreadState_Swap=python39.PyThreadState_Swap + PyThread_tss_alloc=python39.PyThread_tss_alloc + PyThread_tss_create=python39.PyThread_tss_create + PyThread_tss_delete=python39.PyThread_tss_delete + PyThread_tss_free=python39.PyThread_tss_free + PyThread_tss_get=python39.PyThread_tss_get + PyThread_tss_is_created=python39.PyThread_tss_is_created + PyThread_tss_set=python39.PyThread_tss_set + PyTraceBack_Here=python39.PyTraceBack_Here + PyTraceBack_Print=python39.PyTraceBack_Print + PyTraceBack_Type=python39.PyTraceBack_Type DATA + PyTupleIter_Type=python39.PyTupleIter_Type DATA + PyTuple_GetItem=python39.PyTuple_GetItem + PyTuple_GetSlice=python39.PyTuple_GetSlice + PyTuple_New=python39.PyTuple_New + PyTuple_Pack=python39.PyTuple_Pack + PyTuple_SetItem=python39.PyTuple_SetItem + PyTuple_Size=python39.PyTuple_Size + PyTuple_Type=python39.PyTuple_Type DATA + PyType_ClearCache=python39.PyType_ClearCache + PyType_FromSpec=python39.PyType_FromSpec + PyType_FromSpecWithBases=python39.PyType_FromSpecWithBases + PyType_GenericAlloc=python39.PyType_GenericAlloc + PyType_GenericNew=python39.PyType_GenericNew + PyType_GetFlags=python39.PyType_GetFlags + PyType_GetSlot=python39.PyType_GetSlot + PyType_IsSubtype=python39.PyType_IsSubtype + PyType_Modified=python39.PyType_Modified + PyType_Ready=python39.PyType_Ready + PyType_Type=python39.PyType_Type DATA + PyUnicodeDecodeError_Create=python39.PyUnicodeDecodeError_Create + PyUnicodeDecodeError_GetEncoding=python39.PyUnicodeDecodeError_GetEncoding + PyUnicodeDecodeError_GetEnd=python39.PyUnicodeDecodeError_GetEnd + PyUnicodeDecodeError_GetObject=python39.PyUnicodeDecodeError_GetObject + PyUnicodeDecodeError_GetReason=python39.PyUnicodeDecodeError_GetReason + PyUnicodeDecodeError_GetStart=python39.PyUnicodeDecodeError_GetStart + PyUnicodeDecodeError_SetEnd=python39.PyUnicodeDecodeError_SetEnd + PyUnicodeDecodeError_SetReason=python39.PyUnicodeDecodeError_SetReason + PyUnicodeDecodeError_SetStart=python39.PyUnicodeDecodeError_SetStart + PyUnicodeEncodeError_GetEncoding=python39.PyUnicodeEncodeError_GetEncoding + PyUnicodeEncodeError_GetEnd=python39.PyUnicodeEncodeError_GetEnd + PyUnicodeEncodeError_GetObject=python39.PyUnicodeEncodeError_GetObject + PyUnicodeEncodeError_GetReason=python39.PyUnicodeEncodeError_GetReason + PyUnicodeEncodeError_GetStart=python39.PyUnicodeEncodeError_GetStart + PyUnicodeEncodeError_SetEnd=python39.PyUnicodeEncodeError_SetEnd + PyUnicodeEncodeError_SetReason=python39.PyUnicodeEncodeError_SetReason + PyUnicodeEncodeError_SetStart=python39.PyUnicodeEncodeError_SetStart + PyUnicodeIter_Type=python39.PyUnicodeIter_Type DATA + PyUnicodeTranslateError_GetEnd=python39.PyUnicodeTranslateError_GetEnd + PyUnicodeTranslateError_GetObject=python39.PyUnicodeTranslateError_GetObject + PyUnicodeTranslateError_GetReason=python39.PyUnicodeTranslateError_GetReason + PyUnicodeTranslateError_GetStart=python39.PyUnicodeTranslateError_GetStart + PyUnicodeTranslateError_SetEnd=python39.PyUnicodeTranslateError_SetEnd + PyUnicodeTranslateError_SetReason=python39.PyUnicodeTranslateError_SetReason + PyUnicodeTranslateError_SetStart=python39.PyUnicodeTranslateError_SetStart + PyUnicode_Append=python39.PyUnicode_Append + PyUnicode_AppendAndDel=python39.PyUnicode_AppendAndDel + PyUnicode_AsASCIIString=python39.PyUnicode_AsASCIIString + PyUnicode_AsCharmapString=python39.PyUnicode_AsCharmapString + PyUnicode_AsDecodedObject=python39.PyUnicode_AsDecodedObject + PyUnicode_AsDecodedUnicode=python39.PyUnicode_AsDecodedUnicode + PyUnicode_AsEncodedObject=python39.PyUnicode_AsEncodedObject + PyUnicode_AsEncodedString=python39.PyUnicode_AsEncodedString + PyUnicode_AsEncodedUnicode=python39.PyUnicode_AsEncodedUnicode + PyUnicode_AsLatin1String=python39.PyUnicode_AsLatin1String + PyUnicode_AsMBCSString=python39.PyUnicode_AsMBCSString + PyUnicode_AsRawUnicodeEscapeString=python39.PyUnicode_AsRawUnicodeEscapeString + PyUnicode_AsUCS4=python39.PyUnicode_AsUCS4 + PyUnicode_AsUCS4Copy=python39.PyUnicode_AsUCS4Copy + PyUnicode_AsUTF16String=python39.PyUnicode_AsUTF16String + PyUnicode_AsUTF32String=python39.PyUnicode_AsUTF32String + PyUnicode_AsUTF8String=python39.PyUnicode_AsUTF8String + PyUnicode_AsUnicodeEscapeString=python39.PyUnicode_AsUnicodeEscapeString + PyUnicode_AsWideChar=python39.PyUnicode_AsWideChar + PyUnicode_AsWideCharString=python39.PyUnicode_AsWideCharString + PyUnicode_BuildEncodingMap=python39.PyUnicode_BuildEncodingMap + PyUnicode_Compare=python39.PyUnicode_Compare + PyUnicode_CompareWithASCIIString=python39.PyUnicode_CompareWithASCIIString + PyUnicode_Concat=python39.PyUnicode_Concat + PyUnicode_Contains=python39.PyUnicode_Contains + PyUnicode_Count=python39.PyUnicode_Count + PyUnicode_Decode=python39.PyUnicode_Decode + PyUnicode_DecodeASCII=python39.PyUnicode_DecodeASCII + PyUnicode_DecodeCharmap=python39.PyUnicode_DecodeCharmap + PyUnicode_DecodeCodePageStateful=python39.PyUnicode_DecodeCodePageStateful + PyUnicode_DecodeFSDefault=python39.PyUnicode_DecodeFSDefault + PyUnicode_DecodeFSDefaultAndSize=python39.PyUnicode_DecodeFSDefaultAndSize + PyUnicode_DecodeLatin1=python39.PyUnicode_DecodeLatin1 + PyUnicode_DecodeLocale=python39.PyUnicode_DecodeLocale + PyUnicode_DecodeLocaleAndSize=python39.PyUnicode_DecodeLocaleAndSize + PyUnicode_DecodeMBCS=python39.PyUnicode_DecodeMBCS + PyUnicode_DecodeMBCSStateful=python39.PyUnicode_DecodeMBCSStateful + PyUnicode_DecodeRawUnicodeEscape=python39.PyUnicode_DecodeRawUnicodeEscape + PyUnicode_DecodeUTF16=python39.PyUnicode_DecodeUTF16 + PyUnicode_DecodeUTF16Stateful=python39.PyUnicode_DecodeUTF16Stateful + PyUnicode_DecodeUTF32=python39.PyUnicode_DecodeUTF32 + PyUnicode_DecodeUTF32Stateful=python39.PyUnicode_DecodeUTF32Stateful + PyUnicode_DecodeUTF7=python39.PyUnicode_DecodeUTF7 + PyUnicode_DecodeUTF7Stateful=python39.PyUnicode_DecodeUTF7Stateful + PyUnicode_DecodeUTF8=python39.PyUnicode_DecodeUTF8 + PyUnicode_DecodeUTF8Stateful=python39.PyUnicode_DecodeUTF8Stateful + PyUnicode_DecodeUnicodeEscape=python39.PyUnicode_DecodeUnicodeEscape + PyUnicode_EncodeCodePage=python39.PyUnicode_EncodeCodePage + PyUnicode_EncodeFSDefault=python39.PyUnicode_EncodeFSDefault + PyUnicode_EncodeLocale=python39.PyUnicode_EncodeLocale + PyUnicode_FSConverter=python39.PyUnicode_FSConverter + PyUnicode_FSDecoder=python39.PyUnicode_FSDecoder + PyUnicode_Find=python39.PyUnicode_Find + PyUnicode_FindChar=python39.PyUnicode_FindChar + PyUnicode_Format=python39.PyUnicode_Format + PyUnicode_FromEncodedObject=python39.PyUnicode_FromEncodedObject + PyUnicode_FromFormat=python39.PyUnicode_FromFormat + PyUnicode_FromFormatV=python39.PyUnicode_FromFormatV + PyUnicode_FromObject=python39.PyUnicode_FromObject + PyUnicode_FromOrdinal=python39.PyUnicode_FromOrdinal + PyUnicode_FromString=python39.PyUnicode_FromString + PyUnicode_FromStringAndSize=python39.PyUnicode_FromStringAndSize + PyUnicode_FromWideChar=python39.PyUnicode_FromWideChar + PyUnicode_GetDefaultEncoding=python39.PyUnicode_GetDefaultEncoding + PyUnicode_GetLength=python39.PyUnicode_GetLength + PyUnicode_GetSize=python39.PyUnicode_GetSize + PyUnicode_InternFromString=python39.PyUnicode_InternFromString + PyUnicode_InternImmortal=python39.PyUnicode_InternImmortal + PyUnicode_InternInPlace=python39.PyUnicode_InternInPlace + PyUnicode_IsIdentifier=python39.PyUnicode_IsIdentifier + PyUnicode_Join=python39.PyUnicode_Join + PyUnicode_Partition=python39.PyUnicode_Partition + PyUnicode_RPartition=python39.PyUnicode_RPartition + PyUnicode_RSplit=python39.PyUnicode_RSplit + PyUnicode_ReadChar=python39.PyUnicode_ReadChar + PyUnicode_Replace=python39.PyUnicode_Replace + PyUnicode_Resize=python39.PyUnicode_Resize + PyUnicode_RichCompare=python39.PyUnicode_RichCompare + PyUnicode_Split=python39.PyUnicode_Split + PyUnicode_Splitlines=python39.PyUnicode_Splitlines + PyUnicode_Substring=python39.PyUnicode_Substring + PyUnicode_Tailmatch=python39.PyUnicode_Tailmatch + PyUnicode_Translate=python39.PyUnicode_Translate + PyUnicode_Type=python39.PyUnicode_Type DATA + PyUnicode_WriteChar=python39.PyUnicode_WriteChar + PyWeakref_GetObject=python39.PyWeakref_GetObject + PyWeakref_NewProxy=python39.PyWeakref_NewProxy + PyWeakref_NewRef=python39.PyWeakref_NewRef + PyWrapperDescr_Type=python39.PyWrapperDescr_Type DATA + PyWrapper_New=python39.PyWrapper_New + PyZip_Type=python39.PyZip_Type DATA + Py_AddPendingCall=python39.Py_AddPendingCall + Py_AtExit=python39.Py_AtExit + Py_BuildValue=python39.Py_BuildValue + Py_CompileString=python39.Py_CompileString + Py_DecRef=python39.Py_DecRef + Py_DecodeLocale=python39.Py_DecodeLocale + Py_EncodeLocale=python39.Py_EncodeLocale + Py_EndInterpreter=python39.Py_EndInterpreter + Py_EnterRecursiveCall=python39.Py_EnterRecursiveCall + Py_Exit=python39.Py_Exit + Py_FatalError=python39.Py_FatalError + Py_FileSystemDefaultEncodeErrors=python39.Py_FileSystemDefaultEncodeErrors DATA + Py_FileSystemDefaultEncoding=python39.Py_FileSystemDefaultEncoding DATA + Py_Finalize=python39.Py_Finalize + Py_FinalizeEx=python39.Py_FinalizeEx + Py_GenericAlias=python39.Py_GenericAlias + Py_GenericAliasType=python39.Py_GenericAliasType + Py_GetArgcArgv=python39.Py_GetArgcArgv + Py_GetBuildInfo=python39.Py_GetBuildInfo + Py_GetCompiler=python39.Py_GetCompiler + Py_GetCopyright=python39.Py_GetCopyright + Py_GetExecPrefix=python39.Py_GetExecPrefix + Py_GetPath=python39.Py_GetPath + Py_GetPlatform=python39.Py_GetPlatform + Py_GetPrefix=python39.Py_GetPrefix + Py_GetProgramFullPath=python39.Py_GetProgramFullPath + Py_GetProgramName=python39.Py_GetProgramName + Py_GetPythonHome=python39.Py_GetPythonHome + Py_GetRecursionLimit=python39.Py_GetRecursionLimit + Py_GetVersion=python39.Py_GetVersion + Py_HasFileSystemDefaultEncoding=python39.Py_HasFileSystemDefaultEncoding DATA + Py_IncRef=python39.Py_IncRef + Py_Initialize=python39.Py_Initialize + Py_InitializeEx=python39.Py_InitializeEx + Py_IsInitialized=python39.Py_IsInitialized + Py_LeaveRecursiveCall=python39.Py_LeaveRecursiveCall + Py_Main=python39.Py_Main + Py_MakePendingCalls=python39.Py_MakePendingCalls + Py_NewInterpreter=python39.Py_NewInterpreter + Py_ReprEnter=python39.Py_ReprEnter + Py_ReprLeave=python39.Py_ReprLeave + Py_SetPath=python39.Py_SetPath + Py_SetProgramName=python39.Py_SetProgramName + Py_SetPythonHome=python39.Py_SetPythonHome + Py_SetRecursionLimit=python39.Py_SetRecursionLimit + Py_SymtableString=python39.Py_SymtableString + Py_UTF8Mode=python39.Py_UTF8Mode DATA + Py_VaBuildValue=python39.Py_VaBuildValue + _PyArg_ParseTupleAndKeywords_SizeT=python39._PyArg_ParseTupleAndKeywords_SizeT + _PyArg_ParseTuple_SizeT=python39._PyArg_ParseTuple_SizeT + _PyArg_Parse_SizeT=python39._PyArg_Parse_SizeT + _PyArg_VaParseTupleAndKeywords_SizeT=python39._PyArg_VaParseTupleAndKeywords_SizeT + _PyArg_VaParse_SizeT=python39._PyArg_VaParse_SizeT + _PyErr_BadInternalCall=python39._PyErr_BadInternalCall + _PyObject_CallFunction_SizeT=python39._PyObject_CallFunction_SizeT + _PyObject_CallMethod_SizeT=python39._PyObject_CallMethod_SizeT + _PyObject_GC_Malloc=python39._PyObject_GC_Malloc + _PyObject_GC_New=python39._PyObject_GC_New + _PyObject_GC_NewVar=python39._PyObject_GC_NewVar + _PyObject_GC_Resize=python39._PyObject_GC_Resize + _PyObject_New=python39._PyObject_New + _PyObject_NewVar=python39._PyObject_NewVar + _PyState_AddModule=python39._PyState_AddModule + _PyThreadState_Init=python39._PyThreadState_Init + _PyThreadState_Prealloc=python39._PyThreadState_Prealloc + _PyTrash_delete_later=python39._PyTrash_delete_later DATA + _PyTrash_delete_nesting=python39._PyTrash_delete_nesting DATA + _PyTrash_deposit_object=python39._PyTrash_deposit_object + _PyTrash_destroy_chain=python39._PyTrash_destroy_chain + _PyTrash_thread_deposit_object=python39._PyTrash_thread_deposit_object + _PyTrash_thread_destroy_chain=python39._PyTrash_thread_destroy_chain + _PyWeakref_CallableProxyType=python39._PyWeakref_CallableProxyType DATA + _PyWeakref_ProxyType=python39._PyWeakref_ProxyType DATA + _PyWeakref_RefType=python39._PyWeakref_RefType DATA + _Py_BuildValue_SizeT=python39._Py_BuildValue_SizeT + _Py_CheckRecursionLimit=python39._Py_CheckRecursionLimit DATA + _Py_CheckRecursiveCall=python39._Py_CheckRecursiveCall + _Py_Dealloc=python39._Py_Dealloc + _Py_EllipsisObject=python39._Py_EllipsisObject DATA + _Py_FalseStruct=python39._Py_FalseStruct DATA + _Py_NoneStruct=python39._Py_NoneStruct DATA + _Py_NotImplementedStruct=python39._Py_NotImplementedStruct DATA + _Py_SwappedOp=python39._Py_SwappedOp DATA + _Py_TrueStruct=python39._Py_TrueStruct DATA + _Py_VaBuildValue_SizeT=python39._Py_VaBuildValue_SizeT diff --git a/PC/python_nt.rc b/PC/python_nt.rc index fac6105d..b5fb58f2 100644 --- a/PC/python_nt.rc +++ b/PC/python_nt.rc @@ -7,12 +7,6 @@ #include 2 RT_MANIFEST "python.manifest" -// String Tables -STRINGTABLE DISCARDABLE -BEGIN - 1000, MS_DLL_ID -END - ///////////////////////////////////////////////////////////////////////////// // // Version @@ -40,7 +34,7 @@ BEGIN VALUE "FileVersion", PYTHON_VERSION VALUE "InternalName", "Python DLL\0" VALUE "LegalCopyright", PYTHON_COPYRIGHT "\0" - VALUE "OriginalFilename", PYTHON_DLL_NAME "\0" + VALUE "OriginalFilename", ORIGINAL_FILENAME "\0" VALUE "ProductName", "Python\0" VALUE "ProductVersion", PYTHON_VERSION END diff --git a/PC/python_ver_rc.h b/PC/python_ver_rc.h index d725a9ba..060aecdc 100644 --- a/PC/python_ver_rc.h +++ b/PC/python_ver_rc.h @@ -10,7 +10,6 @@ #define MS_WINDOWS #include "modsupport.h" #include "patchlevel.h" -#include #ifdef _DEBUG # define PYTHON_DEBUG_EXT "_d" #else diff --git a/PC/store_info.txt b/PC/store_info.txt index 89f36998..8c20412a 100644 --- a/PC/store_info.txt +++ b/PC/store_info.txt @@ -60,9 +60,19 @@ https://partner.microsoft.com/dashboard. We keep it here for convenience and to allow it to be updated via pull requests. +When submitting a new app, the HeadlessAppBypass waiver will be needed. +To request this, send an email to PartnerOps@microsoft.com with the app +ID (12 character token available from the dashboard). The waiver needs +to be applied *before* uploading the package (as of November 2019). + +Ensure that the new app is named "Python.3.X", where X is the minor +version of the release. If the name provided initially does not match +the name used when building the package, the upload will fail. The +display name shown to users can be set later. + ## Title -Python 3.8 +Python 3.9 ## Short Title @@ -78,7 +88,7 @@ The Python interpreter is easily extended with new functions and data types impl ## ShortDescription -The Python 3.8 interpreter and runtime. +The Python 3.9 interpreter and runtime. ## Copyright Trademark Information @@ -86,38 +96,38 @@ The Python 3.8 interpreter and runtime. ## Additional License Terms -Visit https://docs.python.org/3.8/license.html for latest license terms. +Visit https://docs.python.org/3.9/license.html for latest license terms. -PSF LICENSE AGREEMENT FOR PYTHON 3.8 +PSF LICENSE AGREEMENT FOR PYTHON 3.9 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using Python - 3.8 software in source or binary form and its associated documentation. + 3.9 software in source or binary form and its associated documentation. 2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, - distribute, and otherwise use Python 3.8 alone or in any derivative + distribute, and otherwise use Python 3.9 alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright © 2001-2018 Python Software Foundation; All Rights - Reserved" are retained in Python 3.8 alone or in any derivative version + Reserved" are retained in Python 3.9 alone or in any derivative version prepared by Licensee. 3. In the event Licensee prepares a derivative work that is based on or - incorporates Python 3.8 or any part thereof, and wants to make the + incorporates Python 3.9 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python - 3.8. + 3.9. -4. PSF is making Python 3.8 available to Licensee on an "AS IS" basis. +4. PSF is making Python 3.9 available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE - USE OF PYTHON 3.8 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + USE OF PYTHON 3.9 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 3.8 +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 3.9 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF - MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 3.8, OR ANY DERIVATIVE + MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 3.9, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 6. This License Agreement will automatically terminate upon a material breach of @@ -129,7 +139,7 @@ PSF LICENSE AGREEMENT FOR PYTHON 3.8 trademark sense to endorse or promote products or services of Licensee, or any third party. -8. By copying, installing or otherwise using Python 3.8, Licensee agrees +8. By copying, installing or otherwise using Python 3.9, Licensee agrees to be bound by the terms and conditions of this License Agreement. ## Features diff --git a/PC/winreg.c b/PC/winreg.c index caad18e0..1305b703 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -14,8 +14,8 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" -#include "windows.h" +#include "structmember.h" // PyMemberDef +#include static BOOL PyHKEY_AsHKEY(PyObject *ob, HKEY *pRes, BOOL bNoneOK); static BOOL clinic_HKEY_converter(PyObject *ob, void *p); @@ -390,7 +390,7 @@ PyTypeObject PyHKEY_Type = PyObject * PyHKEY_New(HKEY hInit) { - PyHKEYObject *key = PyObject_NEW(PyHKEYObject, &PyHKEY_Type); + PyHKEYObject *key = PyObject_New(PyHKEYObject, &PyHKEY_Type); if (key) key->hkey = hInit; return (PyObject *)key; diff --git a/PCbuild/_asyncio.vcxproj.filters b/PCbuild/_asyncio.vcxproj.filters index 4c4a22b3..8f4160ca 100644 --- a/PCbuild/_asyncio.vcxproj.filters +++ b/PCbuild/_asyncio.vcxproj.filters @@ -1,16 +1,21 @@  - - - {2422278e-eeeb-4241-8182-433e2bc5a7fc} + + {41f1cd52-b682-46aa-a7fd-7bdf81a18010} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_bz2.vcxproj.filters b/PCbuild/_bz2.vcxproj.filters index 382f6b6b..ce2e24e3 100644 --- a/PCbuild/_bz2.vcxproj.filters +++ b/PCbuild/_bz2.vcxproj.filters @@ -4,10 +4,16 @@ {f53a859d-dad2-4d5b-ae41-f28d8b571f5a} - + + {b90c3cee-7700-4e87-bf85-0801866e8d0d} + + {7e0bed05-ae33-43b7-8797-656455bbb7f3} - + + {b53f67d8-fdf0-4e10-a987-e44475ff434a} + + {ed574b89-6983-4cdf-9f98-fe7048d9e89c} @@ -16,33 +22,38 @@ Source Files - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - - bzip2 1.0.6 Header Files - - bzip2 1.0.6 Header Files + Header Files\bzip2 + + Header Files\bzip2 + + + + + Resource Files + - + \ No newline at end of file diff --git a/PCbuild/_ctypes.vcxproj.filters b/PCbuild/_ctypes.vcxproj.filters index 53171314..1155ef5d 100644 --- a/PCbuild/_ctypes.vcxproj.filters +++ b/PCbuild/_ctypes.vcxproj.filters @@ -7,6 +7,9 @@ {dbdea1f2-ad8b-44ca-b782-fcf65d91559b} + + {31a37bb4-c384-41ff-9ec1-8ad98d482e22} + @@ -37,6 +40,8 @@ - + + Resource Files + \ No newline at end of file diff --git a/PCbuild/_ctypes_test.vcxproj.filters b/PCbuild/_ctypes_test.vcxproj.filters index 1a5a82ba..5e395fe0 100644 --- a/PCbuild/_ctypes_test.vcxproj.filters +++ b/PCbuild/_ctypes_test.vcxproj.filters @@ -7,6 +7,9 @@ {38abc486-e143-49dc-8cf0-8aefab0e0d3d} + + {5030ff8f-daf5-4bc8-b1dd-e8b59d34c511} + @@ -18,4 +21,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_decimal.vcxproj b/PCbuild/_decimal.vcxproj index 0c6702d6..ae052194 100644 --- a/PCbuild/_decimal.vcxproj +++ b/PCbuild/_decimal.vcxproj @@ -118,7 +118,6 @@ - @@ -131,7 +130,7 @@ - + diff --git a/PCbuild/_decimal.vcxproj.filters b/PCbuild/_decimal.vcxproj.filters index 6f1d520a..eba4ec95 100644 --- a/PCbuild/_decimal.vcxproj.filters +++ b/PCbuild/_decimal.vcxproj.filters @@ -7,58 +7,64 @@ {138089f8-faba-494f-b6ed-051f31fbaf2d} + + {632b24a3-0844-4e57-ad34-b0e4cef886dd} + + + {322d127c-1105-4a31-aed2-e29cdececc77} + + + {780c3b7a-7817-4e89-a2f2-fc522f2c5966} + - + Header Files + + Header Files\libmpdec + - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files - - - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files - - - Header Files + Header Files\libmpdec @@ -66,51 +72,56 @@ Source Files - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - - Source Files + + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec + + + Resource Files + + - Source Files + Source Files\libmpdec \ No newline at end of file diff --git a/PCbuild/_elementtree.vcxproj.filters b/PCbuild/_elementtree.vcxproj.filters index 48cb2492..8da2e80f 100644 --- a/PCbuild/_elementtree.vcxproj.filters +++ b/PCbuild/_elementtree.vcxproj.filters @@ -7,52 +7,61 @@ {7b5335ad-059f-486f-85e4-f4757e26a9bf} + + {37d3ef0a-1ea6-492d-bba7-b83865198caa} + + + {6099ed72-6668-4779-adb2-a2362e5da3b9} + + + {f99990ba-cd06-40cc-8f28-d2d424ec13be} + - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat @@ -60,13 +69,18 @@ Source Files - Source Files + Source Files\expat - Source Files + Source Files\expat - Source Files + Source Files\expat - + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/_freeze_importlib.vcxproj.filters b/PCbuild/_freeze_importlib.vcxproj.filters index 80b7fa97..40efcd89 100644 --- a/PCbuild/_freeze_importlib.vcxproj.filters +++ b/PCbuild/_freeze_importlib.vcxproj.filters @@ -5,13 +5,8 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + {eb238244-ace1-48fc-97a4-16ff886f8642} @@ -23,5 +18,11 @@ Source Files + + Python Files + + + Python Files + - + \ No newline at end of file diff --git a/PCbuild/_hashlib.vcxproj.filters b/PCbuild/_hashlib.vcxproj.filters index 0f263706..c88430fe 100644 --- a/PCbuild/_hashlib.vcxproj.filters +++ b/PCbuild/_hashlib.vcxproj.filters @@ -4,10 +4,18 @@ {cc45963d-bd25-4eb8-bdba-a5507090bca4} + + {67630fa4-76e4-4035-bced-043a6df1e2e0} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_lzma.vcxproj.filters b/PCbuild/_lzma.vcxproj.filters index bb0ae1f2..b29e8708 100644 --- a/PCbuild/_lzma.vcxproj.filters +++ b/PCbuild/_lzma.vcxproj.filters @@ -4,10 +4,18 @@ {53e68eda-39fc-4336-a658-dc5f5d598760} + + {9e5ecf81-2940-4dd5-af98-58e98810d030} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_msi.vcxproj.filters b/PCbuild/_msi.vcxproj.filters index a40f405c..1e36e257 100644 --- a/PCbuild/_msi.vcxproj.filters +++ b/PCbuild/_msi.vcxproj.filters @@ -4,10 +4,18 @@ {bdef7710-e433-4ac0-84e0-14f34454bd3e} + + {8513f324-7c13-4657-b463-5d686a8a5371} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_multiprocessing.vcxproj.filters b/PCbuild/_multiprocessing.vcxproj.filters index 0b5291de..26903429 100644 --- a/PCbuild/_multiprocessing.vcxproj.filters +++ b/PCbuild/_multiprocessing.vcxproj.filters @@ -7,6 +7,9 @@ {34615a62-f999-4659-83f5-19d17a644530} + + {1dcf6347-2248-42e1-ab3c-1b19f4f6f647} + @@ -21,4 +24,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_overlapped.vcxproj.filters b/PCbuild/_overlapped.vcxproj.filters index 5ed9a09b..b39385d6 100644 --- a/PCbuild/_overlapped.vcxproj.filters +++ b/PCbuild/_overlapped.vcxproj.filters @@ -4,10 +4,18 @@ {6f67c8db-7de7-4714-a967-2b0d4bc71f2e} + + {83fe502d-eca2-4505-b626-eddec9b6ea9f} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_queue.vcxproj.filters b/PCbuild/_queue.vcxproj.filters index aae75095..4ce767c8 100644 --- a/PCbuild/_queue.vcxproj.filters +++ b/PCbuild/_queue.vcxproj.filters @@ -1,16 +1,21 @@  - - - {c56a5dd3-7838-48e9-a781-855d8be7370f} + + {bc5dc97e-11b8-435a-82e7-2ef3c9b44f5e} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_socket.vcxproj.filters b/PCbuild/_socket.vcxproj.filters index 8fe3e6bd..94e094ec 100644 --- a/PCbuild/_socket.vcxproj.filters +++ b/PCbuild/_socket.vcxproj.filters @@ -7,6 +7,9 @@ {1edfe0d0-7b9d-4dc8-a335-b21fef7cc77a} + + {f8efff18-28ed-4c6b-8e8d-fa816d9a81a8} + @@ -18,4 +21,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_sqlite3.vcxproj.filters b/PCbuild/_sqlite3.vcxproj.filters index 269a798c..63f7a7f2 100644 --- a/PCbuild/_sqlite3.vcxproj.filters +++ b/PCbuild/_sqlite3.vcxproj.filters @@ -7,6 +7,9 @@ {814b187d-44ad-4f2b-baa7-18ca8a8a6a77} + + {225f58de-2bad-4e4d-bc0b-fe74ed6bf5f1} + @@ -66,4 +69,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_ssl.vcxproj.filters b/PCbuild/_ssl.vcxproj.filters index dfb8b6a2..7179034d 100644 --- a/PCbuild/_ssl.vcxproj.filters +++ b/PCbuild/_ssl.vcxproj.filters @@ -4,6 +4,9 @@ {695348f7-e9f6-4fe1-bc03-5f08ffc8095b} + + {1b18a2e6-040d-46c7-a9ac-ac2ec64fb5d6} + @@ -14,6 +17,8 @@ - + + Resource Files + \ No newline at end of file diff --git a/PCbuild/_testbuffer.vcxproj.filters b/PCbuild/_testbuffer.vcxproj.filters index e3ff428e..ab95c64e 100644 --- a/PCbuild/_testbuffer.vcxproj.filters +++ b/PCbuild/_testbuffer.vcxproj.filters @@ -4,10 +4,18 @@ {8d232240-921a-4bc2-87c3-93ffd3462f0a} + + {1e73201a-cca4-4b45-9484-262709cafee7} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_testcapi.vcxproj.filters b/PCbuild/_testcapi.vcxproj.filters index 04735f7b..c6b87109 100644 --- a/PCbuild/_testcapi.vcxproj.filters +++ b/PCbuild/_testcapi.vcxproj.filters @@ -4,10 +4,18 @@ {a76a90d8-8e8b-4c36-8f58-8bd46abe9f5e} + + {071b2ff4-e5a1-4e79-b0c5-cf46b0094a80} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_testconsole.vcxproj.filters b/PCbuild/_testconsole.vcxproj.filters index f78f3ce4..7a2b7e5f 100644 --- a/PCbuild/_testconsole.vcxproj.filters +++ b/PCbuild/_testconsole.vcxproj.filters @@ -5,18 +5,19 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_testembed.vcxproj.filters b/PCbuild/_testembed.vcxproj.filters index 5a1b9f46..c8ac25b7 100644 --- a/PCbuild/_testembed.vcxproj.filters +++ b/PCbuild/_testembed.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms @@ -19,4 +15,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_testimportmultiple.vcxproj.filters b/PCbuild/_testimportmultiple.vcxproj.filters index 42fa8cf3..96acc2b2 100644 --- a/PCbuild/_testimportmultiple.vcxproj.filters +++ b/PCbuild/_testimportmultiple.vcxproj.filters @@ -4,10 +4,18 @@ {1ec38ad9-1abf-4b80-8628-ac43ccba324b} + + {0ff128a6-7814-4f8e-826e-860a858104ee} + Source Files - + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/_testinternalcapi.vcxproj.filters b/PCbuild/_testinternalcapi.vcxproj.filters index d40388a6..7db27fe7 100644 --- a/PCbuild/_testinternalcapi.vcxproj.filters +++ b/PCbuild/_testinternalcapi.vcxproj.filters @@ -4,10 +4,18 @@ {136fc5eb-7fe4-4486-8c6d-b49f37a00199} + + {acecc890-f8dd-4942-b6d2-1fd8f73a5d6c} + Source Files - + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/_testmultiphase.vcxproj.filters b/PCbuild/_testmultiphase.vcxproj.filters index f78f3ce4..a0f9ee9d 100644 --- a/PCbuild/_testmultiphase.vcxproj.filters +++ b/PCbuild/_testmultiphase.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms @@ -19,4 +15,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_tkinter.vcxproj.filters b/PCbuild/_tkinter.vcxproj.filters index c63b5fe8..cf624fcf 100644 --- a/PCbuild/_tkinter.vcxproj.filters +++ b/PCbuild/_tkinter.vcxproj.filters @@ -4,6 +4,9 @@ {b9ce64dd-cb95-472d-bbe8-5583b2cd375b} + + {2bd3a90c-5b2e-45fb-9b2a-fbf1a4faf5f9} + @@ -13,4 +16,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_uuid.vcxproj b/PCbuild/_uuid.vcxproj new file mode 100644 index 00000000..accfffa1 --- /dev/null +++ b/PCbuild/_uuid.vcxproj @@ -0,0 +1,115 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + PGInstrument + ARM + + + PGInstrument + ARM64 + + + PGInstrument + Win32 + + + PGInstrument + x64 + + + PGUpdate + ARM + + + PGUpdate + ARM64 + + + PGUpdate + Win32 + + + PGUpdate + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {CB435430-EBB1-478B-8F4E-C256F6838F55} + _uuid + Win32Proj + false + + + + + DynamicLibrary + NotSet + + + + .pyd + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + + + + rpcrt4.lib;%(AdditionalDependencies) + + + + + + + + + + + {cf7ac3d1-e2df-41d2-bea6-1e2556cdea26} + false + + + + + + \ No newline at end of file diff --git a/PCbuild/_uuid.vcxproj.filters b/PCbuild/_uuid.vcxproj.filters new file mode 100644 index 00000000..f0351414 --- /dev/null +++ b/PCbuild/_uuid.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4fa4dbfa-e069-4ab4-86a6-ad389b2ec407} + + + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/_zoneinfo.vcxproj b/PCbuild/_zoneinfo.vcxproj new file mode 100644 index 00000000..7f3a56bd --- /dev/null +++ b/PCbuild/_zoneinfo.vcxproj @@ -0,0 +1,109 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + PGInstrument + ARM + + + PGInstrument + ARM64 + + + PGInstrument + Win32 + + + PGInstrument + x64 + + + PGUpdate + ARM + + + PGUpdate + ARM64 + + + PGUpdate + Win32 + + + PGUpdate + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742} + _zoneinfo + Win32Proj + + + + + DynamicLibrary + NotSet + + + + .pyd + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + + + + + + + + + + {cf7ac3d1-e2df-41d2-bea6-1e2556cdea26} + false + + + + + + diff --git a/PCbuild/_zoneinfo.vcxproj.filters b/PCbuild/_zoneinfo.vcxproj.filters new file mode 100644 index 00000000..e67fb5a3 --- /dev/null +++ b/PCbuild/_zoneinfo.vcxproj.filters @@ -0,0 +1,21 @@ + + + + + {2422278e-eeeb-4241-8182-433e2bc5a7fc} + + + {0616fb85-7891-4790-83c2-005f906cf555} + + + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/build.bat b/PCbuild/build.bat index e2f8f873..0edb0672 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -34,6 +34,7 @@ echo. automatically by the pythoncore project) echo. --pgo Build with Profile-Guided Optimization. This flag echo. overrides -c and -d echo. --test-marker Enable the test marker within the build. +echo. --regen Regenerate all opcodes, grammar and tokens echo. echo.Available flags to avoid building certain modules. echo.These flags have no effect if '-e' is not given: @@ -80,7 +81,8 @@ if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts -if "%~1"=="-V" shift & goto :Version +if "%~1"=="-V" shift & goto Version +if "%~1"=="--regen" (set Regen=true) & shift & goto CheckOpts rem These use the actual property names used by MSBuild. We could just let rem them in through the environment, but we specify them on the command line rem anyway for visibility so set defaults after this @@ -158,6 +160,14 @@ echo on /p:UseTestMarker=%UseTestMarker% %GITProperty%^ %1 %2 %3 %4 %5 %6 %7 %8 %9 +@if not ERRORLEVEL 1 @if "%Regen%"=="true" ( + %MSBUILD% "%dir%regen.vcxproj" /t:%target% %parallel% %verbose%^ + /p:IncludeExternals=%IncludeExternals%^ + /p:Configuration=%conf% /p:Platform=%platf%^ + /p:UseTestMarker=%UseTestMarker% %GITProperty%^ + %1 %2 %3 %4 %5 %6 %7 %8 %9 +) + @echo off exit /b %ERRORLEVEL% diff --git a/PCbuild/find_python.bat b/PCbuild/find_python.bat index 8b421a3b..6ddfe9f8 100644 --- a/PCbuild/find_python.bat +++ b/PCbuild/find_python.bat @@ -37,7 +37,7 @@ @if NOT "%HOST_PYTHON%"=="" @%HOST_PYTHON% -Ec "import sys; assert sys.version_info[:2] >= (3, 6)" >nul 2>nul && (set PYTHON="%HOST_PYTHON%") && (set _Py_Python_Source=found as HOST_PYTHON) && goto :found @rem If py.exe finds a recent enough version, use that one -@for %%p in (3.7 3.6) do @py -%%p -EV >nul 2>&1 && (set PYTHON=py -%%p) && (set _Py_Python_Source=found %%p with py.exe) && goto :found +@for %%p in (3.8 3.7 3.6) do @py -%%p -EV >nul 2>&1 && (set PYTHON=py -%%p) && (set _Py_Python_Source=found %%p with py.exe) && goto :found @if NOT exist "%_Py_EXTERNALS_DIR%" mkdir "%_Py_EXTERNALS_DIR%" @set _Py_NUGET=%NUGET% diff --git a/PCbuild/fix_encoding.py b/PCbuild/fix_encoding.py old mode 100644 new mode 100755 diff --git a/PCbuild/get_external.py b/PCbuild/get_external.py old mode 100644 new mode 100755 diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index bf7b0c37..d0e42557 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -52,7 +52,7 @@ echo.Fetching external libraries... set libraries= set libraries=%libraries% bzip2-1.0.6 -if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.3.0-rc0-r1 +if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1g set libraries=%libraries% sqlite-3.32.3.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.9.0 diff --git a/PCbuild/lib.pyproj b/PCbuild/lib.pyproj index 6e9d5451..f0c51edb 100644 --- a/PCbuild/lib.pyproj +++ b/PCbuild/lib.pyproj @@ -250,7 +250,6 @@ - @@ -420,6 +419,7 @@ + @@ -831,7 +831,6 @@ - @@ -976,8 +975,6 @@ - - @@ -1129,6 +1126,8 @@ + + @@ -1195,7 +1194,6 @@ - @@ -1210,6 +1208,12 @@ + + + + + + @@ -1393,6 +1397,10 @@ + + + + @@ -1560,11 +1568,14 @@ + + + + - @@ -1791,6 +1802,7 @@ + diff --git a/PCbuild/liblzma.vcxproj.filters b/PCbuild/liblzma.vcxproj.filters new file mode 100644 index 00000000..adb2ba8b --- /dev/null +++ b/PCbuild/liblzma.vcxproj.filters @@ -0,0 +1,435 @@ + + + + + {cb1870af-3c7e-48ba-bd7f-3e87468f8ed7} + + + {58761ffe-2af0-42a8-9f93-4e57e1954c36} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/PCbuild/pcbuild.proj b/PCbuild/pcbuild.proj index a8725f50..df4ee575 100644 --- a/PCbuild/pcbuild.proj +++ b/PCbuild/pcbuild.proj @@ -51,7 +51,7 @@ - + diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln index 477a1070..9d114511 100644 --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2024 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30028.174 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{553EC33E-9816-4996-A660-5D6186A0B0B3}" ProjectSection(SolutionItems) = preProject @@ -91,6 +91,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testconsole", "_testconsol EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_asyncio", "_asyncio.vcxproj", "{384C224A-7474-476E-A01B-750EA7DE918C}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_zoneinfo", "_zoneinfo.vcxproj", "{FCBE1EF2-E0F0-40B1-88B5-00A35D378742}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_queue", "_queue.vcxproj", "{78D80A15-BD8C-44E2-B49E-1F05B0A0A687}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblzma", "liblzma.vcxproj", "{12728250-16EC-4DC6-94D7-E21DD88947F8}" @@ -103,6 +105,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "venvwlauncher", "venvwlaunc EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythonw_uwp", "pythonw_uwp.vcxproj", "{AB603547-1E2A-45B3-9E09-B04596006393}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_uuid", "_uuid.vcxproj", "{CB435430-EBB1-478B-8F4E-C256F6838F55}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM = Debug|ARM @@ -1263,6 +1267,38 @@ Global {384C224A-7474-476E-A01B-750EA7DE918C}.Release|Win32.Build.0 = Release|Win32 {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.ActiveCfg = Release|x64 {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.Build.0 = Release|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|ARM.ActiveCfg = Debug|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|ARM.Build.0 = Debug|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|ARM64.Build.0 = Debug|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|Win32.ActiveCfg = Debug|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|Win32.Build.0 = Debug|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|x64.ActiveCfg = Debug|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|x64.Build.0 = Debug|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|ARM.ActiveCfg = Release|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|ARM.Build.0 = Release|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|ARM64.ActiveCfg = Release|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|ARM64.Build.0 = Release|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|Win32.ActiveCfg = Release|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|Win32.Build.0 = Release|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|x64.ActiveCfg = Release|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|x64.Build.0 = Release|x64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|ARM.ActiveCfg = Debug|ARM {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|ARM.Build.0 = Debug|ARM {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -1440,6 +1476,38 @@ Global {AB603547-1E2A-45B3-9E09-B04596006393}.Release|Win32.Build.0 = Release|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.Release|x64.ActiveCfg = Release|x64 {AB603547-1E2A-45B3-9E09-B04596006393}.Release|x64.Build.0 = Release|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|ARM.ActiveCfg = Debug|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|ARM.Build.0 = Debug|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|ARM64.Build.0 = Debug|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|Win32.ActiveCfg = Debug|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|Win32.Build.0 = Debug|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|x64.ActiveCfg = Debug|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|x64.Build.0 = Debug|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|ARM.ActiveCfg = Release|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|ARM.Build.0 = Release|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|ARM64.ActiveCfg = Release|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|ARM64.Build.0 = Release|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|Win32.ActiveCfg = Release|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|Win32.Build.0 = Release|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|x64.ActiveCfg = Release|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PCbuild/prepare_ssl.py b/PCbuild/prepare_ssl.py old mode 100644 new mode 100755 diff --git a/PCbuild/pyexpat.vcxproj.filters b/PCbuild/pyexpat.vcxproj.filters index d48df6ec..d61c037e 100644 --- a/PCbuild/pyexpat.vcxproj.filters +++ b/PCbuild/pyexpat.vcxproj.filters @@ -7,6 +7,9 @@ {5af9d40c-fc46-4640-ad84-3d1dd34a71d7} + + {f1dbbdb5-41e5-4a88-bf8e-13da010c0ce4} + @@ -30,4 +33,9 @@ Source Files - + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/pylauncher.vcxproj.filters b/PCbuild/pylauncher.vcxproj.filters index 05a93d03..39a8f2fd 100644 --- a/PCbuild/pylauncher.vcxproj.filters +++ b/PCbuild/pylauncher.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index f531b0e9..91884140 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -44,7 +44,6 @@ Default true true - NoExtensions OnlyExplicitInline OnlyExplicitInline @@ -82,7 +81,7 @@ $(PySourcePath)PC;$(PySourcePath)Include;$(IntDir);%(AdditionalIncludeDirectories) - $(_DebugPreprocessorDefinition)%(PreprocessorDefinitions) + ORIGINAL_FILENAME=\"$(TargetName)$(TargetExt)\";FIELD3=$(Field3Value);$(_DebugPreprocessorDefinition)%(PreprocessorDefinitions) 0x0409 @@ -97,21 +96,6 @@ - - - - - - - diff --git a/PCbuild/pyshellext.vcxproj.filters b/PCbuild/pyshellext.vcxproj.filters index d07e2493..5eaac970 100644 --- a/PCbuild/pyshellext.vcxproj.filters +++ b/PCbuild/pyshellext.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms diff --git a/PCbuild/python3dll.vcxproj.filters b/PCbuild/python3dll.vcxproj.filters index ff48bea2..fc2f0304 100644 --- a/PCbuild/python3dll.vcxproj.filters +++ b/PCbuild/python3dll.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav diff --git a/PCbuild/python_uwp.vcxproj.filters b/PCbuild/python_uwp.vcxproj.filters new file mode 100644 index 00000000..84e31f98 --- /dev/null +++ b/PCbuild/python_uwp.vcxproj.filters @@ -0,0 +1,26 @@ + + + + + {fd8bf000-0bbe-4fd4-ac49-29036e5a5c5a} + + + {a0d4ce0b-a7b5-4a77-b6c2-d2ddb9bd49b8} + + + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + \ No newline at end of file diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 178d9b9f..c942e9e0 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -106,16 +106,17 @@ _Py_HAVE_ZLIB;%(PreprocessorDefinitions) - version.lib;shlwapi.lib;ws2_32.lib;%(AdditionalDependencies) + version.lib;shlwapi.lib;ws2_32.lib;pathcch.lib;%(AdditionalDependencies) + + - @@ -127,9 +128,19 @@ + + + + + + + + + + @@ -156,17 +167,27 @@ + + - + + + + + + + + + @@ -174,6 +195,8 @@ + + @@ -199,7 +222,6 @@ - @@ -208,21 +230,20 @@ + + - - + - - - - + + @@ -263,6 +284,8 @@ + + @@ -316,7 +339,6 @@ - @@ -325,6 +347,7 @@ + @@ -374,6 +397,7 @@ + @@ -405,6 +429,10 @@ + + + + @@ -437,6 +465,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index bc5a9b34..a8129088 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -31,6 +31,15 @@ {c3e03a5c-56c7-45fd-8543-e5d2326b907d} + + {86ffb5eb-c423-43aa-b736-a8850d3277df} + + + {875bf4f2-ac42-46bd-b703-8371a824ec32} + + + {33dbdbe0-42c4-4478-bed2-a12cb1e68773} + @@ -48,9 +57,6 @@ Include - - Include - Include @@ -81,48 +87,6 @@ Include - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - Include @@ -171,12 +135,24 @@ Include + + Include + Include Include + + Include + + + Include + + + Include + Include @@ -189,6 +165,9 @@ Include + + Include + Include @@ -201,9 +180,18 @@ Include + + Include + + + Include + Include + + Include + Include @@ -225,6 +213,12 @@ Include + + Include + + + Include + Include @@ -345,9 +339,6 @@ Include - - Include - Include @@ -513,38 +504,179 @@ Include - - Modules\zlib + + Include + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Parser\pegen + + + Parser\pegen + + + Include\internal @@ -593,9 +725,6 @@ Modules - - Modules - Modules @@ -659,9 +788,6 @@ Modules - - Modules - Modules @@ -692,9 +818,6 @@ Modules - - Modules - Modules\_io @@ -926,9 +1049,6 @@ Python - - Python - Python @@ -971,8 +1091,8 @@ Python - - Python + + Modules Python @@ -1082,53 +1202,47 @@ Modules - - Modules - PC Objects - - PC - Modules - - Modules\zlib + + Python - - Modules\zlib + + Parser - - Modules\zlib + + Modules - - Modules\zlib + + Python - - Modules\zlib + + Objects - - Modules\zlib + + Parser\pegen - - Modules\zlib + + Parser\pegen - - Modules\zlib + + Parser\pegen - - Modules\zlib + + Parser\pegen - - Modules\zlib + + Modules - - Modules\zlib + + Modules @@ -1136,4 +1250,4 @@ Resource Files - + \ No newline at end of file diff --git a/PCbuild/pythonw.vcxproj.filters b/PCbuild/pythonw.vcxproj.filters index 60321172..b7408da3 100644 --- a/PCbuild/pythonw.vcxproj.filters +++ b/PCbuild/pythonw.vcxproj.filters @@ -8,14 +8,14 @@ {e1d8ea6b-c65d-42f4-9eed-6010846ed378} - - - Resource Files - - Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/pythonw_uwp.vcxproj.filters b/PCbuild/pythonw_uwp.vcxproj.filters new file mode 100644 index 00000000..04710527 --- /dev/null +++ b/PCbuild/pythonw_uwp.vcxproj.filters @@ -0,0 +1,26 @@ + + + + + {de05f656-4dcb-4fe7-9946-5c325ea2d842} + + + {4102e199-3e5c-42d0-b37b-d42394b20d9e} + + + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + \ No newline at end of file diff --git a/PCbuild/pywlauncher.vcxproj.filters b/PCbuild/pywlauncher.vcxproj.filters index 05a93d03..39a8f2fd 100644 --- a/PCbuild/pywlauncher.vcxproj.filters +++ b/PCbuild/pywlauncher.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index c5a06707..92b8c8c9 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -38,7 +38,7 @@ Debug Used to build Python with extra debugging capabilities, equivalent to using ./configure --with-pydebug on UNIX. All binaries built using this configuration have "_d" added to their name: - python38_d.dll, python_d.exe, parser_d.pyd, and so on. Both the + python39_d.dll, python_d.exe, parser_d.pyd, and so on. Both the build and rt (run test) batch files in this directory accept a -d option for debug builds. If you are building Python to help with development of CPython, you will most likely use this configuration. @@ -132,6 +132,7 @@ library which are implemented in C; each one builds a DLL (renamed to _asyncio _ctypes _ctypes_test +_zoneinfo _decimal _elementtree _hashlib @@ -285,4 +286,4 @@ The pyproject property file defines all of the build settings for each project, with some projects overriding certain specific values. The GUI doesn't always reflect the correct settings and may confuse the user with false information, especially for settings that automatically adapt -for diffirent configurations. +for different configurations. diff --git a/PCbuild/regen.vcxproj b/PCbuild/regen.vcxproj new file mode 100644 index 00000000..f2571a0c --- /dev/null +++ b/PCbuild/regen.vcxproj @@ -0,0 +1,230 @@ + + + + + Debug + ARM + + + Debug + Win32 + + + Debug + x64 + + + PGInstrument + ARM + + + PGInstrument + Win32 + + + PGInstrument + x64 + + + PGUpdate + ARM + + + PGUpdate + Win32 + + + PGUpdate + x64 + + + Release + ARM + + + Release + Win32 + + + Release + x64 + + + + {21CF2108-2CC9-4005-A6ED-B7965ADE3854} + Win32Proj + regen + false + 10.0 + + + + + Utility + Unicode + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + + + + + + + + + + _CONSOLE;%(PreprocessorDefinitions) + + + Console + + + + + + + + {cf7ac3d1-e2df-41d2-bea6-1e2556cdea26} + true + true + false + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PCbuild/select.vcxproj.filters b/PCbuild/select.vcxproj.filters index 9a994e65..ae7799a0 100644 --- a/PCbuild/select.vcxproj.filters +++ b/PCbuild/select.vcxproj.filters @@ -4,10 +4,18 @@ {98346077-900c-4c7a-852f-a23470e37b40} + + {b47a8e6c-47c0-4490-aa91-1a3624a0905c} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/sqlite3.vcxproj b/PCbuild/sqlite3.vcxproj index 1a82a654..d792c542 100644 --- a/PCbuild/sqlite3.vcxproj +++ b/PCbuild/sqlite3.vcxproj @@ -98,7 +98,7 @@ $(sqlite3Dir);%(AdditionalIncludeDirectories) - SQLITE_ENABLE_FTS4;SQLITE_ENABLE_FTS5;SQLITE_API=__declspec(dllexport);%(PreprocessorDefinitions) + SQLITE_ENABLE_JSON1;SQLITE_ENABLE_FTS4;SQLITE_ENABLE_FTS5;SQLITE_API=__declspec(dllexport);%(PreprocessorDefinitions) Level1 diff --git a/PCbuild/sqlite3.vcxproj.filters b/PCbuild/sqlite3.vcxproj.filters index 8d790044..5c1ea71f 100644 --- a/PCbuild/sqlite3.vcxproj.filters +++ b/PCbuild/sqlite3.vcxproj.filters @@ -7,6 +7,9 @@ {0e842fe2-176b-4e83-9d1f-0ad13a859efd} + + {0248795a-00c9-4090-ad61-55ae23438598} + @@ -21,4 +24,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/unicodedata.vcxproj.filters b/PCbuild/unicodedata.vcxproj.filters index 74f35f62..8498c03d 100644 --- a/PCbuild/unicodedata.vcxproj.filters +++ b/PCbuild/unicodedata.vcxproj.filters @@ -7,6 +7,9 @@ {e2c055bb-ec62-4bbc-aa1c-d88da4d4ad1c} + + {d04f3447-67b0-42aa-b84f-9fc0029d5af7} + @@ -21,4 +24,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/venvlauncher.vcxproj.filters b/PCbuild/venvlauncher.vcxproj.filters new file mode 100644 index 00000000..b61b81e2 --- /dev/null +++ b/PCbuild/venvlauncher.vcxproj.filters @@ -0,0 +1,26 @@ + + + + + {8f3ab79e-3cba-4e6d-82b2-559ce946de58} + + + {4a2423af-e5d1-4c88-b308-d71b768977df} + + + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + \ No newline at end of file diff --git a/PCbuild/venvwlauncher.vcxproj.filters b/PCbuild/venvwlauncher.vcxproj.filters new file mode 100644 index 00000000..94e96dac --- /dev/null +++ b/PCbuild/venvwlauncher.vcxproj.filters @@ -0,0 +1,26 @@ + + + + + {7683f248-9c32-4e72-a329-5bd84993f63a} + + + {61b34b26-ce53-405d-a743-b370ff505887} + + + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/winsound.vcxproj.filters b/PCbuild/winsound.vcxproj.filters index d91fdbfc..d8c845dd 100644 --- a/PCbuild/winsound.vcxproj.filters +++ b/PCbuild/winsound.vcxproj.filters @@ -5,10 +5,18 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + {6be42502-398f-4bec-8677-8809a2da0eef} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/Parser/Python.asdl b/Parser/Python.asdl index 126d4789..889712b4 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -1,16 +1,13 @@ --- ASDL's 5 builtin types are: --- identifier, int, string, object, constant +-- ASDL's 4 builtin types are: +-- identifier, int, string, constant module Python { - mod = Module(stmt* body, type_ignore *type_ignores) + mod = Module(stmt* body, type_ignore* type_ignores) | Interactive(stmt* body) | Expression(expr body) | FunctionType(expr* argtypes, expr returns) - -- not really an actual node but useful in Jython's typesystem. - | Suite(stmt* body) - stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment) @@ -51,7 +48,6 @@ module Python | Expr(expr value) | Pass | Break | Continue - -- XXX Jython will be different -- col_offset is the byte offset in the utf8 string the parser uses attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset) @@ -82,20 +78,19 @@ module Python -- the following expression can appear in assignment context | Attribute(expr value, identifier attr, expr_context ctx) - | Subscript(expr value, slice slice, expr_context ctx) + | Subscript(expr value, expr slice, expr_context ctx) | Starred(expr value, expr_context ctx) | Name(identifier id, expr_context ctx) | List(expr* elts, expr_context ctx) | Tuple(expr* elts, expr_context ctx) + -- can appear only in Subscript + | Slice(expr? lower, expr? upper, expr? step) + -- col_offset is the byte offset in the utf8 string the parser uses attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset) - expr_context = Load | Store | Del | AugLoad | AugStore | Param - - slice = Slice(expr? lower, expr? upper, expr? step) - | ExtSlice(slice* dims) - | Index(expr value) + expr_context = Load | Store | Del boolop = And | Or @@ -119,6 +114,7 @@ module Python -- keyword arguments supplied to call (NULL identifier for **kwargs) keyword = (identifier? arg, expr value) + attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset) -- import name with optional 'as' alias. alias = (identifier name, identifier? asname) diff --git a/Parser/asdl.py b/Parser/asdl.py index 62f5c19c..7f509488 100644 --- a/Parser/asdl.py +++ b/Parser/asdl.py @@ -33,8 +33,7 @@ __all__ = [ # See the EBNF at the top of the file to understand the logical connection # between the various node types. -builtin_types = {'identifier', 'string', 'bytes', 'int', 'object', 'singleton', - 'constant'} +builtin_types = {'identifier', 'string', 'int', 'constant'} class AST: def __repr__(self): @@ -72,6 +71,16 @@ class Field(AST): self.seq = seq self.opt = opt + def __str__(self): + if self.seq: + extra = "*" + elif self.opt: + extra = "?" + else: + extra = "" + + return "{}{} {}".format(self.type, extra, self.name) + def __repr__(self): if self.seq: extra = ", seq=True" diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py old mode 100644 new mode 100755 index a708b66d..6f3154ae --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1,12 +1,17 @@ #! /usr/bin/env python """Generate C code from an ASDL description.""" -import os, sys +import os +import sys + +from argparse import ArgumentParser +from pathlib import Path import asdl TABSIZE = 4 MAX_COL = 80 +AUTOGEN_MESSAGE = "/* File automatically generated by {}. */\n\n" def get_c_type(name): """Return a string for the C name of the type. @@ -60,6 +65,9 @@ def reflow_lines(s, depth): lines.append(padding + cur) return lines +def reflow_c_string(s, depth): + return '"%s"' % s.replace('\n', '\\n"\n%s"' % (' ' * depth * TABSIZE)) + def is_simple(sum): """Return True if a sum is a simple. @@ -71,6 +79,21 @@ def is_simple(sum): return False return True +def asdl_of(name, obj): + if isinstance(obj, asdl.Product) or isinstance(obj, asdl.Constructor): + fields = ", ".join(map(str, obj.fields)) + if fields: + fields = "({})".format(fields) + return "{}{}".format(name, fields) + else: + if is_simple(obj): + types = " | ".join(type.name for type in obj.types) + else: + sep = "\n{}| ".format(" " * (len(name) + 1)) + types = sep.join( + asdl_of(type.name, type) for type in obj.types + ) + return "{} = {}".format(name, types) class EmitVisitor(asdl.VisitorBase): """Visit that emits lines""" @@ -78,14 +101,18 @@ class EmitVisitor(asdl.VisitorBase): def __init__(self, file): self.file = file self.identifiers = set() + self.singletons = set() + self.types = set() super(EmitVisitor, self).__init__() def emit_identifier(self, name): - name = str(name) - if name in self.identifiers: - return - self.emit("_Py_IDENTIFIER(%s);" % name, 0) - self.identifiers.add(name) + self.identifiers.add(str(name)) + + def emit_singleton(self, name): + self.singletons.add(str(name)) + + def emit_type(self, name): + self.types.add(str(name)) def emit(self, s, depth, reflow=True): # XXX reflow long lines? @@ -301,7 +328,7 @@ class FunctionVisitor(PrototypeVisitor): if not opt and argtype != "int": emit("if (!%s) {" % argname, 1) emit("PyErr_SetString(PyExc_ValueError,", 2) - msg = "field %s is required for %s" % (argname, name) + msg = "field '%s' is required for %s" % (argname, name) emit(' "%s");' % msg, 2, reflow=False) emit('return NULL;', 2) @@ -360,7 +387,7 @@ class PickleVisitor(EmitVisitor): class Obj2ModPrototypeVisitor(PickleVisitor): def visitProduct(self, prod, name): - code = "static int obj2ast_%s(PyObject* obj, %s* out, PyArena* arena);" + code = "static int obj2ast_%s(astmodulestate *state, PyObject* obj, %s* out, PyArena* arena);" self.emit(code % (name, get_c_type(name)), 0) visitSum = visitProduct @@ -370,7 +397,7 @@ class Obj2ModVisitor(PickleVisitor): def funcHeader(self, name): ctype = get_c_type(name) self.emit("int", 0) - self.emit("obj2ast_%s(PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) + self.emit("obj2ast_%s(astmodulestate *state, PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) self.emit("{", 0) self.emit("int isinstance;", 1) self.emit("", 0) @@ -392,7 +419,7 @@ class Obj2ModVisitor(PickleVisitor): self.funcHeader(name) for t in sum.types: line = ("isinstance = PyObject_IsInstance(obj, " - "(PyObject *)%s_type);") + "state->%s_type);") self.emit(line % (t.name,), 1) self.emit("if (isinstance == -1) {", 1) self.emit("return 1;", 2) @@ -409,6 +436,7 @@ class Obj2ModVisitor(PickleVisitor): def complexSum(self, sum, name): self.funcHeader(name) self.emit("PyObject *tmp = NULL;", 1) + self.emit("PyObject *tp;", 1) for a in sum.attributes: self.visitAttributeDeclaration(a, name, sum=sum) self.emit("", 0) @@ -420,8 +448,8 @@ class Obj2ModVisitor(PickleVisitor): for a in sum.attributes: self.visitField(a, name, sum=sum, depth=1) for t in sum.types: - line = "isinstance = PyObject_IsInstance(obj, (PyObject*)%s_type);" - self.emit(line % (t.name,), 1) + self.emit("tp = state->%s_type;" % (t.name,), 1) + self.emit("isinstance = PyObject_IsInstance(obj, tp);", 1) self.emit("if (isinstance == -1) {", 1) self.emit("return 1;", 2) self.emit("}", 1) @@ -451,7 +479,7 @@ class Obj2ModVisitor(PickleVisitor): def visitProduct(self, prod, name): ctype = get_c_type(name) self.emit("int", 0) - self.emit("obj2ast_%s(PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) + self.emit("obj2ast_%s(astmodulestate *state, PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) self.emit("{", 0) self.emit("PyObject* tmp = NULL;", 1) for f in prod.fields: @@ -497,7 +525,8 @@ class Obj2ModVisitor(PickleVisitor): def visitField(self, field, name, sum=None, prod=None, depth=0): ctype = get_c_type(field.type) - self.emit("if (_PyObject_LookupAttrId(obj, &PyId_%s, &tmp) < 0) {" % field.name, depth) + line = "if (_PyObject_LookupAttr(obj, state->%s, &tmp) < 0) {" + self.emit(line % field.name, depth) self.emit("return 1;", depth+1) self.emit("}", depth) if not field.opt: @@ -524,7 +553,7 @@ class Obj2ModVisitor(PickleVisitor): self.emit("Py_ssize_t i;", depth+1) self.emit("if (!PyList_Check(tmp)) {", depth+1) self.emit("PyErr_Format(PyExc_TypeError, \"%s field \\\"%s\\\" must " - "be a list, not a %%.200s\", tmp->ob_type->tp_name);" % + "be a list, not a %%.200s\", _PyType_Name(Py_TYPE(tmp)));" % (name, field.name), depth+2, reflow=False) self.emit("goto failed;", depth+2) @@ -537,8 +566,11 @@ class Obj2ModVisitor(PickleVisitor): self.emit("if (%s == NULL) goto failed;" % field.name, depth+1) self.emit("for (i = 0; i < len; i++) {", depth+1) self.emit("%s val;" % ctype, depth+2) - self.emit("res = obj2ast_%s(PyList_GET_ITEM(tmp, i), &val, arena);" % + self.emit("PyObject *tmp2 = PyList_GET_ITEM(tmp, i);", depth+2) + self.emit("Py_INCREF(tmp2);", depth+2) + self.emit("res = obj2ast_%s(state, tmp2, &val, arena);" % field.type, depth+2, reflow=False) + self.emit("Py_DECREF(tmp2);", depth+2) self.emit("if (res != 0) goto failed;", depth+2) self.emit("if (len != PyList_GET_SIZE(tmp)) {", depth+2) self.emit("PyErr_SetString(PyExc_RuntimeError, \"%s field \\\"%s\\\" " @@ -550,7 +582,7 @@ class Obj2ModVisitor(PickleVisitor): self.emit("asdl_seq_SET(%s, i, val);" % field.name, depth+2) self.emit("}", depth+1) else: - self.emit("res = obj2ast_%s(tmp, &%s, arena);" % + self.emit("res = obj2ast_%s(state, tmp, &%s, arena);" % (field.type, field.name), depth+1) self.emit("if (res != 0) goto failed;", depth+1) @@ -571,50 +603,46 @@ class MarshalPrototypeVisitor(PickleVisitor): class PyTypesDeclareVisitor(PickleVisitor): def visitProduct(self, prod, name): - self.emit("static PyTypeObject *%s_type;" % name, 0) - self.emit("static PyObject* ast2obj_%s(void*);" % name, 0) + self.emit_type("%s_type" % name) + self.emit("static PyObject* ast2obj_%s(astmodulestate *state, void*);" % name, 0) if prod.attributes: for a in prod.attributes: self.emit_identifier(a.name) - self.emit("static char *%s_attributes[] = {" % name, 0) + self.emit("static const char * const %s_attributes[] = {" % name, 0) for a in prod.attributes: self.emit('"%s",' % a.name, 1) self.emit("};", 0) if prod.fields: for f in prod.fields: self.emit_identifier(f.name) - self.emit("static char *%s_fields[]={" % name,0) + self.emit("static const char * const %s_fields[]={" % name,0) for f in prod.fields: self.emit('"%s",' % f.name, 1) self.emit("};", 0) def visitSum(self, sum, name): - self.emit("static PyTypeObject *%s_type;" % name, 0) + self.emit_type("%s_type" % name) if sum.attributes: for a in sum.attributes: self.emit_identifier(a.name) - self.emit("static char *%s_attributes[] = {" % name, 0) + self.emit("static const char * const %s_attributes[] = {" % name, 0) for a in sum.attributes: self.emit('"%s",' % a.name, 1) self.emit("};", 0) ptype = "void*" if is_simple(sum): ptype = get_c_type(name) - tnames = [] for t in sum.types: - tnames.append(str(t.name)+"_singleton") - tnames = ", *".join(tnames) - self.emit("static PyObject *%s;" % tnames, 0) - self.emit("static PyObject* ast2obj_%s(%s);" % (name, ptype), 0) + self.emit_singleton("%s_singleton" % t.name) + self.emit("static PyObject* ast2obj_%s(astmodulestate *state, %s);" % (name, ptype), 0) for t in sum.types: self.visitConstructor(t, name) def visitConstructor(self, cons, name): - self.emit("static PyTypeObject *%s_type;" % cons.name, 0) if cons.fields: for t in cons.fields: self.emit_identifier(t.name) - self.emit("static char *%s_fields[]={" % cons.name, 0) + self.emit("static const char * const %s_fields[]={" % cons.name, 0) for t in cons.fields: self.emit('"%s",' % t.name, 1) self.emit("};",0) @@ -623,8 +651,6 @@ class PyTypesVisitor(PickleVisitor): def visitModule(self, mod): self.emit(""" -_Py_IDENTIFIER(_fields); -_Py_IDENTIFIER(_attributes); typedef struct { PyObject_HEAD @@ -635,14 +661,19 @@ static void ast_dealloc(AST_object *self) { /* bpo-31095: UnTrack is needed before calling any callbacks */ + PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_CLEAR(self->dict); - Py_TYPE(self)->tp_free(self); + freefunc free_func = PyType_GetSlot(tp, Py_tp_free); + assert(free_func != NULL); + free_func(self); + Py_DECREF(tp); } static int ast_traverse(AST_object *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(self->dict); return 0; } @@ -657,10 +688,15 @@ ast_clear(AST_object *self) static int ast_type_init(PyObject *self, PyObject *args, PyObject *kw) { + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { + return -1; + } + Py_ssize_t i, numfields = 0; int res = -1; PyObject *key, *value, *fields; - if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) { + if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) { goto cleanup; } if (fields) { @@ -674,7 +710,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) if (numfields < PyTuple_GET_SIZE(args)) { PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most " "%zd positional argument%s", - Py_TYPE(self)->tp_name, + _PyType_Name(Py_TYPE(self)), numfields, numfields == 1 ? "" : "s"); res = -1; goto cleanup; @@ -728,9 +764,13 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) static PyObject * ast_type_reduce(PyObject *self, PyObject *unused) { - _Py_IDENTIFIER(__dict__); + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { + return NULL; + } + PyObject *dict; - if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) { + if (_PyObject_LookupAttr(self, state->__dict__, &dict) < 0) { return NULL; } if (dict) { @@ -739,6 +779,11 @@ ast_type_reduce(PyObject *self, PyObject *unused) return Py_BuildValue("O()", Py_TYPE(self)); } +static PyMemberDef ast_type_members[] = { + {"__dictoffset__", T_PYSSIZET, offsetof(AST_object, dict), READONLY}, + {NULL} /* Sentinel */ +}; + static PyMethodDef ast_type_methods[] = { {"__reduce__", ast_type_reduce, METH_NOARGS, NULL}, {NULL} @@ -749,96 +794,79 @@ static PyGetSetDef ast_type_getsets[] = { {NULL} }; -static PyTypeObject AST_type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "_ast.AST", +static PyType_Slot AST_type_slots[] = { + {Py_tp_dealloc, ast_dealloc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_setattro, PyObject_GenericSetAttr}, + {Py_tp_traverse, ast_traverse}, + {Py_tp_clear, ast_clear}, + {Py_tp_members, ast_type_members}, + {Py_tp_methods, ast_type_methods}, + {Py_tp_getset, ast_type_getsets}, + {Py_tp_init, ast_type_init}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_free, PyObject_GC_Del}, + {0, 0}, +}; + +static PyType_Spec AST_type_spec = { + "ast.AST", sizeof(AST_object), 0, - (destructor)ast_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - 0, /* tp_doc */ - (traverseproc)ast_traverse, /* tp_traverse */ - (inquiry)ast_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - ast_type_methods, /* tp_methods */ - 0, /* tp_members */ - ast_type_getsets, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - offsetof(AST_object, dict),/* tp_dictoffset */ - (initproc)ast_type_init, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ - PyObject_GC_Del, /* tp_free */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + AST_type_slots }; - -static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields) +static PyObject * +make_type(astmodulestate *state, const char *type, PyObject* base, + const char* const* fields, int num_fields, const char *doc) { - _Py_IDENTIFIER(__module__); - _Py_IDENTIFIER(_ast); PyObject *fnames, *result; int i; fnames = PyTuple_New(num_fields); if (!fnames) return NULL; for (i = 0; i < num_fields; i++) { - PyObject *field = PyUnicode_FromString(fields[i]); + PyObject *field = PyUnicode_InternFromString(fields[i]); if (!field) { Py_DECREF(fnames); return NULL; } PyTuple_SET_ITEM(fnames, i, field); } - result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}", + result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOOOs}", type, base, - _PyUnicode_FromId(&PyId__fields), fnames, - _PyUnicode_FromId(&PyId___module__), - _PyUnicode_FromId(&PyId__ast)); + state->_fields, fnames, + state->__module__, + state->ast, + state->__doc__, doc); Py_DECREF(fnames); - return (PyTypeObject*)result; + return result; } -static int add_attributes(PyTypeObject* type, char**attrs, int num_fields) +static int +add_attributes(astmodulestate *state, PyObject *type, const char * const *attrs, int num_fields) { int i, result; PyObject *s, *l = PyTuple_New(num_fields); if (!l) return 0; for (i = 0; i < num_fields; i++) { - s = PyUnicode_FromString(attrs[i]); + s = PyUnicode_InternFromString(attrs[i]); if (!s) { Py_DECREF(l); return 0; } PyTuple_SET_ITEM(l, i, s); } - result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0; + result = PyObject_SetAttr(type, state->_attributes, l) >= 0; Py_DECREF(l); return result; } /* Conversion AST -> Python */ -static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*)) +static PyObject* ast2obj_list(astmodulestate *state, asdl_seq *seq, PyObject* (*func)(astmodulestate *state, void*)) { Py_ssize_t i, n = asdl_seq_LEN(seq); PyObject *result = PyList_New(n); @@ -846,7 +874,7 @@ static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*)) if (!result) return NULL; for (i = 0; i < n; i++) { - value = func(asdl_seq_GET(seq, i)); + value = func(state, asdl_seq_GET(seq, i)); if (!value) { Py_DECREF(result); return NULL; @@ -856,27 +884,25 @@ static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*)) return result; } -static PyObject* ast2obj_object(void *o) +static PyObject* ast2obj_object(astmodulestate *Py_UNUSED(state), void *o) { if (!o) o = Py_None; Py_INCREF((PyObject*)o); return (PyObject*)o; } -#define ast2obj_singleton ast2obj_object #define ast2obj_constant ast2obj_object #define ast2obj_identifier ast2obj_object #define ast2obj_string ast2obj_object -#define ast2obj_bytes ast2obj_object -static PyObject* ast2obj_int(long b) +static PyObject* ast2obj_int(astmodulestate *Py_UNUSED(state), long b) { return PyLong_FromLong(b); } /* Conversion Python -> AST */ -static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_object(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (obj == Py_None) obj = NULL; @@ -891,7 +917,7 @@ static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena) return 0; } -static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_constant(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (PyArena_AddPyObject(arena, obj) < 0) { *out = NULL; @@ -902,25 +928,25 @@ static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena) return 0; } -static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_identifier(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && obj != Py_None) { PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str"); return 1; } - return obj2ast_object(obj, out, arena); + return obj2ast_object(state, obj, out, arena); } -static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_string(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) { PyErr_SetString(PyExc_TypeError, "AST string must be of type str"); return 1; } - return obj2ast_object(obj, out, arena); + return obj2ast_object(state, obj, out, arena); } -static int obj2ast_int(PyObject* obj, int* out, PyArena* arena) +static int obj2ast_int(astmodulestate* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena) { int i; if (!PyLong_Check(obj)) { @@ -935,16 +961,13 @@ static int obj2ast_int(PyObject* obj, int* out, PyArena* arena) return 0; } -static int add_ast_fields(void) +static int add_ast_fields(astmodulestate *state) { - PyObject *empty_tuple, *d; - if (PyType_Ready(&AST_type) < 0) - return -1; - d = AST_type.tp_dict; + PyObject *empty_tuple; empty_tuple = PyTuple_New(0); if (!empty_tuple || - _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 || - _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) { + PyObject_SetAttrString(state->AST_type, "_fields", empty_tuple) < 0 || + PyObject_SetAttrString(state->AST_type, "_attributes", empty_tuple) < 0) { Py_XDECREF(empty_tuple); return -1; } @@ -954,14 +977,16 @@ static int add_ast_fields(void) """, 0, reflow=False) - self.emit("static int init_types(void)",0) + self.emit("static int init_types(astmodulestate *state)",0) self.emit("{", 0) - self.emit("static int initialized;", 1) - self.emit("if (initialized) return 1;", 1) - self.emit("if (add_ast_fields() < 0) return 0;", 1) + self.emit("if (state->initialized) return 1;", 1) + self.emit("if (init_identifiers(state) < 0) return 0;", 1) + self.emit("state->AST_type = PyType_FromSpec(&AST_type_spec);", 1) + self.emit("if (!state->AST_type) return 0;", 1) + self.emit("if (add_ast_fields(state) < 0) return 0;", 1) for dfn in mod.dfns: self.visit(dfn) - self.emit("initialized = 1;", 1) + self.emit("state->initialized = 1;", 1) self.emit("return 1;", 1); self.emit("}", 0) @@ -970,24 +995,32 @@ static int add_ast_fields(void) fields = name+"_fields" else: fields = "NULL" - self.emit('%s_type = make_type("%s", &AST_type, %s, %d);' % + self.emit('state->%s_type = make_type(state, "%s", state->AST_type, %s, %d,' % (name, name, fields, len(prod.fields)), 1) - self.emit("if (!%s_type) return 0;" % name, 1) + self.emit('%s);' % reflow_c_string(asdl_of(name, prod), 2), 2, reflow=False) + self.emit("if (!state->%s_type) return 0;" % name, 1) + self.emit_type("AST_type") + self.emit_type("%s_type" % name) if prod.attributes: - self.emit("if (!add_attributes(%s_type, %s_attributes, %d)) return 0;" % + self.emit("if (!add_attributes(state, state->%s_type, %s_attributes, %d)) return 0;" % (name, name, len(prod.attributes)), 1) else: - self.emit("if (!add_attributes(%s_type, NULL, 0)) return 0;" % name, 1) + self.emit("if (!add_attributes(state, state->%s_type, NULL, 0)) return 0;" % name, 1) + self.emit_defaults(name, prod.fields, 1) + self.emit_defaults(name, prod.attributes, 1) def visitSum(self, sum, name): - self.emit('%s_type = make_type("%s", &AST_type, NULL, 0);' % + self.emit('state->%s_type = make_type(state, "%s", state->AST_type, NULL, 0,' % (name, name), 1) - self.emit("if (!%s_type) return 0;" % name, 1) + self.emit('%s);' % reflow_c_string(asdl_of(name, sum), 2), 2, reflow=False) + self.emit_type("%s_type" % name) + self.emit("if (!state->%s_type) return 0;" % name, 1) if sum.attributes: - self.emit("if (!add_attributes(%s_type, %s_attributes, %d)) return 0;" % + self.emit("if (!add_attributes(state, state->%s_type, %s_attributes, %d)) return 0;" % (name, name, len(sum.attributes)), 1) else: - self.emit("if (!add_attributes(%s_type, NULL, 0)) return 0;" % name, 1) + self.emit("if (!add_attributes(state, state->%s_type, NULL, 0)) return 0;" % name, 1) + self.emit_defaults(name, sum.attributes, 1) simple = is_simple(sum) for t in sum.types: self.visitConstructor(t, name, simple) @@ -997,40 +1030,76 @@ static int add_ast_fields(void) fields = cons.name+"_fields" else: fields = "NULL" - self.emit('%s_type = make_type("%s", %s_type, %s, %d);' % + self.emit('state->%s_type = make_type(state, "%s", state->%s_type, %s, %d,' % (cons.name, cons.name, name, fields, len(cons.fields)), 1) - self.emit("if (!%s_type) return 0;" % cons.name, 1) + self.emit('%s);' % reflow_c_string(asdl_of(cons.name, cons), 2), 2, reflow=False) + self.emit("if (!state->%s_type) return 0;" % cons.name, 1) + self.emit_type("%s_type" % cons.name) + self.emit_defaults(cons.name, cons.fields, 1) if simple: - self.emit("%s_singleton = PyType_GenericNew(%s_type, NULL, NULL);" % + self.emit("state->%s_singleton = PyType_GenericNew((PyTypeObject *)" + "state->%s_type, NULL, NULL);" % (cons.name, cons.name), 1) - self.emit("if (!%s_singleton) return 0;" % cons.name, 1) + self.emit("if (!state->%s_singleton) return 0;" % cons.name, 1) + + def emit_defaults(self, name, fields, depth): + for field in fields: + if field.opt: + self.emit('if (PyObject_SetAttr(state->%s_type, state->%s, Py_None) == -1)' % + (name, field.name), depth) + self.emit("return 0;", depth+1) class ASTModuleVisitor(PickleVisitor): def visitModule(self, mod): - self.emit("static struct PyModuleDef _astmodule = {", 0) - self.emit(' PyModuleDef_HEAD_INIT, "_ast"', 0) - self.emit("};", 0) - self.emit("PyMODINIT_FUNC", 0) - self.emit("PyInit__ast(void)", 0) + self.emit("static int", 0) + self.emit("astmodule_exec(PyObject *m)", 0) self.emit("{", 0) - self.emit("PyObject *m, *d;", 1) - self.emit("if (!init_types()) return NULL;", 1) - self.emit('m = PyModule_Create(&_astmodule);', 1) - self.emit("if (!m) return NULL;", 1) - self.emit("d = PyModule_GetDict(m);", 1) - self.emit('if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;', 1) - self.emit('if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0)', 1) - self.emit("return NULL;", 2) - self.emit('if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)', 1) - self.emit("return NULL;", 2) - self.emit('if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0)', 1) - self.emit("return NULL;", 2) + self.emit('astmodulestate *state = get_ast_state(m);', 1) + self.emit("", 0) + + self.emit("if (!init_types(state)) {", 1) + self.emit("return -1;", 2) + self.emit("}", 1) + self.emit('if (PyModule_AddObject(m, "AST", state->AST_type) < 0) {', 1) + self.emit('return -1;', 2) + self.emit('}', 1) + self.emit('Py_INCREF(state->AST_type);', 1) + self.emit('if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) {', 1) + self.emit("return -1;", 2) + self.emit('}', 1) + self.emit('if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) {', 1) + self.emit("return -1;", 2) + self.emit('}', 1) + self.emit('if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) {', 1) + self.emit("return -1;", 2) + self.emit('}', 1) for dfn in mod.dfns: self.visit(dfn) - self.emit("return m;", 1) + self.emit("return 0;", 1) self.emit("}", 0) + self.emit("", 0) + self.emit(""" +static PyModuleDef_Slot astmodule_slots[] = { + {Py_mod_exec, astmodule_exec}, + {0, NULL} +}; + +static struct PyModuleDef _astmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_ast", + // The _ast module uses a global state (global_ast_state). + .m_size = 0, + .m_slots = astmodule_slots, +}; + +PyMODINIT_FUNC +PyInit__ast(void) +{ + return PyModuleDef_Init(&_astmodule); +} +""".strip(), 0, reflow=False) def visitProduct(self, prod, name): self.addObj(name) @@ -1044,7 +1113,11 @@ class ASTModuleVisitor(PickleVisitor): self.addObj(cons.name) def addObj(self, name): - self.emit('if (PyDict_SetItemString(d, "%s", (PyObject*)%s_type) < 0) return NULL;' % (name, name), 1) + self.emit("if (PyModule_AddObject(m, \"%s\", " + "state->%s_type) < 0) {" % (name, name), 1) + self.emit("return -1;", 2) + self.emit('}', 1) + self.emit("Py_INCREF(state->%s_type);" % name, 1) _SPECIALIZED_SEQUENCES = ('stmt', 'expr') @@ -1078,14 +1151,14 @@ class ObjVisitor(PickleVisitor): def func_begin(self, name): ctype = get_c_type(name) self.emit("PyObject*", 0) - self.emit("ast2obj_%s(void* _o)" % (name), 0) + self.emit("ast2obj_%s(astmodulestate *state, void* _o)" % (name), 0) self.emit("{", 0) self.emit("%s o = (%s)_o;" % (ctype, ctype), 1) self.emit("PyObject *result = NULL, *value = NULL;", 1) + self.emit("PyTypeObject *tp;", 1) self.emit('if (!o) {', 1) self.emit("Py_RETURN_NONE;", 2) self.emit("}", 1) - self.emit('', 0) def func_end(self): self.emit("return result;", 1) @@ -1107,46 +1180,44 @@ class ObjVisitor(PickleVisitor): self.visitConstructor(t, i + 1, name) self.emit("}", 1) for a in sum.attributes: - self.emit("value = ast2obj_%s(o->%s);" % (a.type, a.name), 1) + self.emit("value = ast2obj_%s(state, o->%s);" % (a.type, a.name), 1) self.emit("if (!value) goto failed;", 1) - self.emit('if (_PyObject_SetAttrId(result, &PyId_%s, value) < 0)' % a.name, 1) + self.emit('if (PyObject_SetAttr(result, state->%s, value) < 0)' % a.name, 1) self.emit('goto failed;', 2) self.emit('Py_DECREF(value);', 1) self.func_end() def simpleSum(self, sum, name): - self.emit("PyObject* ast2obj_%s(%s_ty o)" % (name, name), 0) + self.emit("PyObject* ast2obj_%s(astmodulestate *state, %s_ty o)" % (name, name), 0) self.emit("{", 0) self.emit("switch(o) {", 1) for t in sum.types: self.emit("case %s:" % t.name, 2) - self.emit("Py_INCREF(%s_singleton);" % t.name, 3) - self.emit("return %s_singleton;" % t.name, 3) - self.emit("default:", 2) - self.emit('/* should never happen, but just in case ... */', 3) - code = "PyErr_Format(PyExc_SystemError, \"unknown %s found\");" % name - self.emit(code, 3, reflow=False) - self.emit("return NULL;", 3) + self.emit("Py_INCREF(state->%s_singleton);" % t.name, 3) + self.emit("return state->%s_singleton;" % t.name, 3) self.emit("}", 1) + self.emit("Py_UNREACHABLE();", 1); self.emit("}", 0) def visitProduct(self, prod, name): self.func_begin(name) - self.emit("result = PyType_GenericNew(%s_type, NULL, NULL);" % name, 1); + self.emit("tp = (PyTypeObject *)state->%s_type;" % name, 1) + self.emit("result = PyType_GenericNew(tp, NULL, NULL);", 1); self.emit("if (!result) return NULL;", 1) for field in prod.fields: self.visitField(field, name, 1, True) for a in prod.attributes: - self.emit("value = ast2obj_%s(o->%s);" % (a.type, a.name), 1) + self.emit("value = ast2obj_%s(state, o->%s);" % (a.type, a.name), 1) self.emit("if (!value) goto failed;", 1) - self.emit('if (_PyObject_SetAttrId(result, &PyId_%s, value) < 0)' % a.name, 1) + self.emit("if (PyObject_SetAttr(result, state->%s, value) < 0)" % a.name, 1) self.emit('goto failed;', 2) self.emit('Py_DECREF(value);', 1) self.func_end() def visitConstructor(self, cons, enum, name): self.emit("case %s_kind:" % cons.name, 1) - self.emit("result = PyType_GenericNew(%s_type, NULL, NULL);" % cons.name, 2); + self.emit("tp = (PyTypeObject *)state->%s_type;" % cons.name, 2) + self.emit("result = PyType_GenericNew(tp, NULL, NULL);", 2); self.emit("if (!result) goto failed;", 2) for f in cons.fields: self.visitField(f, cons.name, 2, False) @@ -1161,7 +1232,7 @@ class ObjVisitor(PickleVisitor): value = "o->v.%s.%s" % (name, field.name) self.set(field, value, depth) emit("if (!value) goto failed;", 0) - emit('if (_PyObject_SetAttrId(result, &PyId_%s, value) == -1)' % field.name, 0) + emit("if (PyObject_SetAttr(result, state->%s, value) == -1)" % field.name, 0) emit("goto failed;", 1) emit("Py_DECREF(value);", 0) @@ -1189,14 +1260,14 @@ class ObjVisitor(PickleVisitor): self.emit("if (!value) goto failed;", depth+1) self.emit("for(i = 0; i < n; i++)", depth+1) # This cannot fail, so no need for error handling - self.emit("PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(%s, i)));" % value, + self.emit("PyList_SET_ITEM(value, i, ast2obj_cmpop(state, (cmpop_ty)asdl_seq_GET(%s, i)));" % value, depth+2, reflow=False) self.emit("}", depth) else: - self.emit("value = ast2obj_list(%s, ast2obj_%s);" % (value, field.type), depth) + self.emit("value = ast2obj_list(state, %s, ast2obj_%s);" % (value, field.type), depth) else: ctype = get_c_type(field.type) - self.emit("value = ast2obj_%s(%s);" % (field.type, value), depth, reflow=False) + self.emit("value = ast2obj_%s(state, %s);" % (field.type, value), depth, reflow=False) class PartingShots(StaticVisitor): @@ -1204,42 +1275,42 @@ class PartingShots(StaticVisitor): CODE = """ PyObject* PyAST_mod2obj(mod_ty t) { - if (!init_types()) + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { return NULL; - return ast2obj_mod(t); + } + return ast2obj_mod(state, t); } /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) { - PyObject *req_type[3]; - char *req_name[] = {"Module", "Expression", "Interactive"}; + const char * const 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; + astmodulestate *state = get_global_ast_state(); + PyObject *req_type[3]; + req_type[0] = state->Module_type; + req_type[1] = state->Expression_type; + req_type[2] = state->Interactive_type; assert(0 <= mode && mode <= 2); - if (!init_types()) - return NULL; - isinstance = PyObject_IsInstance(ast, req_type[mode]); if (isinstance == -1) return NULL; if (!isinstance) { PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s", - req_name[mode], Py_TYPE(ast)->tp_name); + req_name[mode], _PyType_Name(Py_TYPE(ast))); return NULL; } mod_ty res = NULL; - if (obj2ast_mod(ast, &res, arena) != 0) + if (obj2ast_mod(state, ast, &res, arena) != 0) return NULL; else return res; @@ -1247,9 +1318,11 @@ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) int PyAST_Check(PyObject* obj) { - if (!init_types()) + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { return -1; - return PyObject_IsInstance(obj, (PyObject*)&AST_type); + } + return PyObject_IsInstance(obj, state->AST_type); } """ @@ -1262,87 +1335,160 @@ class ChainOfVisitors: v.visit(object) v.emit("", 0) -common_msg = "/* File automatically generated by %s. */\n\n" -def main(srcfile, dump_module=False): - argv0 = sys.argv[0] - components = argv0.split(os.sep) - argv0 = os.sep.join(components[-2:]) - auto_gen_msg = common_msg % argv0 - mod = asdl.parse(srcfile) +def generate_module_def(f, mod): + # Gather all the data needed for ModuleSpec + visitor_list = set() + with open(os.devnull, "w") as devnull: + visitor = PyTypesDeclareVisitor(devnull) + visitor.visit(mod) + visitor_list.add(visitor) + visitor = PyTypesVisitor(devnull) + visitor.visit(mod) + visitor_list.add(visitor) + + state_strings = { + "ast", + "_fields", + "__doc__", + "__dict__", + "__module__", + "_attributes", + } + module_state = state_strings.copy() + for visitor in visitor_list: + for identifier in visitor.identifiers: + module_state.add(identifier) + state_strings.add(identifier) + for singleton in visitor.singletons: + module_state.add(singleton) + for tp in visitor.types: + module_state.add(tp) + state_strings = sorted(state_strings) + module_state = sorted(module_state) + f.write('typedef struct {\n') + f.write(' int initialized;\n') + for s in module_state: + f.write(' PyObject *' + s + ';\n') + f.write('} astmodulestate;\n\n') + f.write(""" +// Forward declaration +static int init_types(astmodulestate *state); + +// bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. +static astmodulestate global_ast_state = {0}; + +static astmodulestate* +get_global_ast_state(void) +{ + astmodulestate* state = &global_ast_state; + if (!init_types(state)) { + return NULL; + } + return state; +} + +static astmodulestate* +get_ast_state(PyObject* Py_UNUSED(module)) +{ + astmodulestate* state = get_global_ast_state(); + // get_ast_state() must only be called after _ast module is imported, + // and astmodule_exec() calls init_types() + assert(state != NULL); + return state; +} + +void _PyAST_Fini() +{ + astmodulestate* state = &global_ast_state; +""") + for s in module_state: + f.write(" Py_CLEAR(state->" + s + ');\n') + f.write(""" + state->initialized = 0; +} + +""") + f.write('static int init_identifiers(astmodulestate *state)\n') + f.write('{\n') + for identifier in state_strings: + f.write(' if ((state->' + identifier) + f.write(' = PyUnicode_InternFromString("') + f.write(identifier + '")) == NULL) return 0;\n') + f.write(' return 1;\n') + f.write('};\n\n') + +def write_header(f, mod): + f.write('#ifndef Py_PYTHON_AST_H\n') + f.write('#define Py_PYTHON_AST_H\n') + f.write('#ifdef __cplusplus\n') + f.write('extern "C" {\n') + f.write('#endif\n') + f.write('\n') + f.write('#ifndef Py_LIMITED_API\n') + f.write('#include "asdl.h"\n') + f.write('\n') + f.write('#undef Yield /* undefine macro conflicting with */\n') + f.write('\n') + c = ChainOfVisitors(TypeDefVisitor(f), + StructVisitor(f)) + c.visit(mod) + f.write("// Note: these macros affect function definitions, not only call sites.\n") + PrototypeVisitor(f).visit(mod) + f.write("\n") + f.write("PyObject* PyAST_mod2obj(mod_ty t);\n") + f.write("mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);\n") + f.write("int PyAST_Check(PyObject* obj);\n") + f.write("#endif /* !Py_LIMITED_API */\n") + f.write('\n') + f.write('#ifdef __cplusplus\n') + f.write('}\n') + f.write('#endif\n') + f.write('#endif /* !Py_PYTHON_AST_H */\n') + +def write_source(f, mod): + f.write('#include \n') + f.write('\n') + f.write('#include "Python.h"\n') + f.write('#include "%s-ast.h"\n' % mod.name) + f.write('#include "structmember.h" // PyMemberDef\n') + f.write('\n') + + generate_module_def(f, mod) + + v = ChainOfVisitors( + PyTypesDeclareVisitor(f), + PyTypesVisitor(f), + Obj2ModPrototypeVisitor(f), + FunctionVisitor(f), + ObjVisitor(f), + Obj2ModVisitor(f), + ASTModuleVisitor(f), + PartingShots(f), + ) + v.visit(mod) + +def main(input_file, c_file, h_file, dump_module=False): + auto_gen_msg = AUTOGEN_MESSAGE.format("/".join(Path(__file__).parts[-2:])) + mod = asdl.parse(input_file) if dump_module: print('Parsed Module:') print(mod) if not asdl.check(mod): sys.exit(1) - if H_FILE: - with open(H_FILE, "w") as f: - f.write(auto_gen_msg) - f.write('#ifndef Py_PYTHON_AST_H\n') - f.write('#define Py_PYTHON_AST_H\n') - f.write('#ifdef __cplusplus\n') - f.write('extern "C" {\n') - f.write('#endif\n') - f.write('\n') - f.write('#include "asdl.h"\n') - f.write('\n') - f.write('#undef Yield /* undefine macro conflicting with */\n') - f.write('\n') - c = ChainOfVisitors(TypeDefVisitor(f), - StructVisitor(f)) - - c.visit(mod) - f.write("// Note: these macros affect function definitions, not only call sites.\n") - PrototypeVisitor(f).visit(mod) - f.write("\n") - f.write("PyObject* PyAST_mod2obj(mod_ty t);\n") - f.write("mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);\n") - f.write("int PyAST_Check(PyObject* obj);\n") - f.write('\n') - f.write('#ifdef __cplusplus\n') - f.write('}\n') - f.write('#endif\n') - f.write('#endif /* !Py_PYTHON_AST_H */\n') - - if C_FILE: - with open(C_FILE, "w") as f: - f.write(auto_gen_msg) - f.write('#include \n') - f.write('\n') - f.write('#include "Python.h"\n') - f.write('#include "%s-ast.h"\n' % mod.name) - f.write('\n') - f.write("static PyTypeObject AST_type;\n") - v = ChainOfVisitors( - PyTypesDeclareVisitor(f), - PyTypesVisitor(f), - Obj2ModPrototypeVisitor(f), - FunctionVisitor(f), - ObjVisitor(f), - Obj2ModVisitor(f), - ASTModuleVisitor(f), - PartingShots(f), - ) - v.visit(mod) + for file, writer in (c_file, write_source), (h_file, write_header): + if file is not None: + with file.open("w") as f: + f.write(auto_gen_msg) + writer(f, mod) + print(file, "regenerated.") if __name__ == "__main__": - import getopt - - H_FILE = '' - C_FILE = '' - dump_module = False - opts, args = getopt.getopt(sys.argv[1:], "dh:c:") - for o, v in opts: - if o == '-h': - H_FILE = v - elif o == '-c': - C_FILE = v - elif o == '-d': - dump_module = True - if H_FILE and C_FILE: - print('Must specify exactly one output file') - sys.exit(1) - elif len(args) != 1: - print('Must specify single input file') - sys.exit(1) - main(args[0], dump_module) + parser = ArgumentParser() + parser.add_argument("input_file", type=Path) + parser.add_argument("-C", "--c-file", type=Path, default=None) + parser.add_argument("-H", "--h-file", type=Path, default=None) + parser.add_argument("-d", "--dump-module", action="store_true") + + options = parser.parse_args() + main(**vars(options)) diff --git a/Parser/grammar1.c b/Parser/grammar1.c index e0b8fbb8..c702040e 100644 --- a/Parser/grammar1.c +++ b/Parser/grammar1.c @@ -41,7 +41,7 @@ PyGrammar_LabelRepr(label *lb) } } else { - Py_FatalError("invalid label"); + Py_FatalError("invalid grammar label"); return NULL; } } diff --git a/Parser/listnode.c b/Parser/listnode.c index 8f1a1163..c806b98e 100644 --- a/Parser/listnode.c +++ b/Parser/listnode.c @@ -2,6 +2,8 @@ /* List a node on a file */ #include "Python.h" +#include "pycore_interp.h" // PyInterpreterState.parser +#include "pycore_pystate.h" // _PyInterpreterState_GET() #include "token.h" #include "node.h" @@ -15,19 +17,21 @@ PyNode_ListTree(node *n) listnode(stdout, n); } -static int level, atbol; - static void listnode(FILE *fp, node *n) { - level = 0; - atbol = 1; + PyInterpreterState *interp = _PyInterpreterState_GET(); + + interp->parser.listnode.level = 0; + interp->parser.listnode.atbol = 1; list1node(fp, n); } static void list1node(FILE *fp, node *n) { + PyInterpreterState *interp; + if (n == NULL) return; if (ISNONTERMINAL(TYPE(n))) { @@ -36,25 +40,26 @@ list1node(FILE *fp, node *n) list1node(fp, CHILD(n, i)); } else if (ISTERMINAL(TYPE(n))) { + interp = _PyInterpreterState_GET(); switch (TYPE(n)) { case INDENT: - ++level; + interp->parser.listnode.level++; break; case DEDENT: - --level; + interp->parser.listnode.level--; break; default: - if (atbol) { + if (interp->parser.listnode.atbol) { int i; - for (i = 0; i < level; ++i) + for (i = 0; i < interp->parser.listnode.level; ++i) fprintf(fp, "\t"); - atbol = 0; + interp->parser.listnode.atbol = 0; } if (TYPE(n) == NEWLINE) { if (STR(n) != NULL) fprintf(fp, "%s", STR(n)); fprintf(fp, "\n"); - atbol = 1; + interp->parser.listnode.atbol = 1; } else fprintf(fp, "%s ", STR(n)); diff --git a/Parser/myreadline.c b/Parser/myreadline.c index e8e57738..143b41f1 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -10,16 +10,15 @@ */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #ifdef MS_WINDOWS -#define WIN32_LEAN_AND_MEAN -#include "windows.h" +# define WIN32_LEAN_AND_MEAN +# include "windows.h" #endif /* MS_WINDOWS */ PyThreadState* _PyOS_ReadlineTState = NULL; -#include "pythread.h" static PyThread_type_lock _PyOS_ReadlineLock = NULL; int (*PyOS_InputHook)(void) = NULL; diff --git a/Parser/node.c b/Parser/node.c index f1b70e0f..8789e01e 100644 --- a/Parser/node.c +++ b/Parser/node.c @@ -14,6 +14,7 @@ PyNode_New(int type) n->n_str = NULL; n->n_lineno = 0; n->n_end_lineno = 0; + n->n_col_offset = 0; n->n_end_col_offset = -1; n->n_nchildren = 0; n->n_child = NULL; diff --git a/Parser/parser.c b/Parser/parser.c index 227b9184..a61b2f5e 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -54,8 +54,9 @@ s_push(stack *s, const dfa *d, node *parent) static void s_pop(stack *s) { - if (s_empty(s)) - Py_FatalError("s_pop: parser stack underflow -- FATAL"); + if (s_empty(s)) { + Py_FatalError("parser stack underflow"); + } s->s_top++; } diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 2bb733d0..1ecb2c4a 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -37,11 +37,13 @@ growable_comment_array_init(growable_comment_array *arr, size_t initial_size) { static int growable_comment_array_add(growable_comment_array *arr, int lineno, char *comment) { if (arr->num_items >= arr->size) { - arr->size *= 2; - arr->items = realloc(arr->items, arr->size * sizeof(*arr->items)); - if (!arr->items) { + size_t new_size = arr->size * 2; + void *new_items_array = realloc(arr->items, new_size * sizeof(*arr->items)); + if (!new_items_array) { return 0; } + arr->items = new_items_array; + arr->size = new_size; } arr->items[arr->num_items].lineno = lineno; @@ -207,24 +209,6 @@ PyParser_ParseFileFlagsEx(FILE *fp, const char *filename, return n; } -#ifdef PY_PARSER_REQUIRES_FUTURE_KEYWORD -#if 0 -static const char with_msg[] = -"%s:%d: Warning: 'with' will become a reserved keyword in Python 2.6\n"; - -static const char as_msg[] = -"%s:%d: Warning: 'as' will become a reserved keyword in Python 2.6\n"; - -static void -warn(const char *msg, const char *filename, int lineno) -{ - if (filename == NULL) - filename = ""; - PySys_WriteStderr(msg, filename, lineno); -} -#endif -#endif - /* Parse input coming from the given tokenizer structure. Return error code. */ @@ -258,7 +242,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, #endif for (;;) { - char *a, *b; + const char *a, *b; int type; size_t len; char *str; @@ -267,25 +251,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, const char *line_start; type = PyTokenizer_Get(tok, &a, &b); - if (type == ERRORTOKEN) { - err_ret->error = tok->done; - break; - } - if (type == ENDMARKER && started) { - type = NEWLINE; /* Add an extra newline */ - started = 0; - /* Add the right number of dedent tokens, - except if a certain flag is given -- - codeop.py uses this. */ - if (tok->indent && - !(*flags & PyPARSE_DONT_IMPLY_DEDENT)) - { - tok->pendin = -tok->indent; - tok->indent = 0; - } - } - else - started = 1; + len = (a != NULL && b != NULL) ? b - a : 0; str = (char *) PyObject_MALLOC(len + 1); if (str == NULL) { @@ -344,10 +310,34 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, continue; } + if (type == ERRORTOKEN) { + err_ret->error = tok->done; + break; + } + if (type == ENDMARKER && started) { + type = NEWLINE; /* Add an extra newline */ + started = 0; + /* Add the right number of dedent tokens, + except if a certain flag is given -- + codeop.py uses this. */ + if (tok->indent && + !(*flags & PyPARSE_DONT_IMPLY_DEDENT)) + { + tok->pendin = -tok->indent; + tok->indent = 0; + } + } + else { + started = 1; + } + if ((err_ret->error = PyParser_AddToken(ps, (int)type, str, lineno, col_offset, tok->lineno, end_col_offset, &(err_ret->expected))) != E_OK) { + if (tok->done == E_EOF && !ISWHITESPACE(type)) { + tok->done = E_SYNTAX; + } if (err_ret->error != E_DONE) { PyObject_FREE(str); err_ret->token = type; @@ -389,7 +379,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, buffer after parsing. Trailing whitespace and comments are OK. */ if (err_ret->error == E_DONE && start == single_input) { - char *cur = tok->cur; + const char *cur = tok->cur; char c = *tok->cur; for (;;) { diff --git a/Parser/pegen/parse.c b/Parser/pegen/parse.c new file mode 100644 index 00000000..f74b6f29 --- /dev/null +++ b/Parser/pegen/parse.c @@ -0,0 +1,24851 @@ +// @generated by pegen.py from ./Grammar/python.gram +#include "pegen.h" + +#if defined(Py_DEBUG) && defined(Py_BUILD_CORE) +extern int Py_DebugFlag; +#define D(x) if (Py_DebugFlag) x; +#else +#define D(x) +#endif +static const int n_keyword_lists = 15; +static KeywordToken *reserved_keywords[] = { + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) { + {"if", 510}, + {"in", 518}, + {"as", 520}, + {"is", 527}, + {"or", 532}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"del", 503}, + {"try", 511}, + {"for", 517}, + {"def", 523}, + {"not", 526}, + {"and", 533}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"pass", 502}, + {"from", 514}, + {"elif", 515}, + {"else", 516}, + {"with", 519}, + {"True", 528}, + {"None", 530}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"raise", 501}, + {"yield", 504}, + {"break", 506}, + {"while", 512}, + {"class", 524}, + {"False", 529}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"return", 500}, + {"assert", 505}, + {"global", 508}, + {"import", 513}, + {"except", 521}, + {"lambda", 525}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"finally", 522}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"continue", 507}, + {"nonlocal", 509}, + {NULL, -1}, + }, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) { + {"__peg_parser__", 531}, + {NULL, -1}, + }, +}; +#define file_type 1000 +#define interactive_type 1001 +#define eval_type 1002 +#define func_type_type 1003 +#define fstring_type 1004 +#define type_expressions_type 1005 +#define statements_type 1006 +#define statement_type 1007 +#define statement_newline_type 1008 +#define simple_stmt_type 1009 +#define small_stmt_type 1010 +#define compound_stmt_type 1011 +#define assignment_type 1012 +#define augassign_type 1013 +#define global_stmt_type 1014 +#define nonlocal_stmt_type 1015 +#define yield_stmt_type 1016 +#define assert_stmt_type 1017 +#define del_stmt_type 1018 +#define import_stmt_type 1019 +#define import_name_type 1020 +#define import_from_type 1021 +#define import_from_targets_type 1022 +#define import_from_as_names_type 1023 +#define import_from_as_name_type 1024 +#define dotted_as_names_type 1025 +#define dotted_as_name_type 1026 +#define dotted_name_type 1027 // Left-recursive +#define if_stmt_type 1028 +#define elif_stmt_type 1029 +#define else_block_type 1030 +#define while_stmt_type 1031 +#define for_stmt_type 1032 +#define with_stmt_type 1033 +#define with_item_type 1034 +#define try_stmt_type 1035 +#define except_block_type 1036 +#define finally_block_type 1037 +#define return_stmt_type 1038 +#define raise_stmt_type 1039 +#define function_def_type 1040 +#define function_def_raw_type 1041 +#define func_type_comment_type 1042 +#define params_type 1043 +#define parameters_type 1044 +#define slash_no_default_type 1045 +#define slash_with_default_type 1046 +#define star_etc_type 1047 +#define kwds_type 1048 +#define param_no_default_type 1049 +#define param_with_default_type 1050 +#define param_maybe_default_type 1051 +#define param_type 1052 +#define annotation_type 1053 +#define default_type 1054 +#define decorators_type 1055 +#define class_def_type 1056 +#define class_def_raw_type 1057 +#define block_type 1058 +#define expressions_list_type 1059 +#define star_expressions_type 1060 +#define star_expression_type 1061 +#define star_named_expressions_type 1062 +#define star_named_expression_type 1063 +#define named_expression_type 1064 +#define annotated_rhs_type 1065 +#define expressions_type 1066 +#define expression_type 1067 +#define lambdef_type 1068 +#define lambda_params_type 1069 +#define lambda_parameters_type 1070 +#define lambda_slash_no_default_type 1071 +#define lambda_slash_with_default_type 1072 +#define lambda_star_etc_type 1073 +#define lambda_kwds_type 1074 +#define lambda_param_no_default_type 1075 +#define lambda_param_with_default_type 1076 +#define lambda_param_maybe_default_type 1077 +#define lambda_param_type 1078 +#define disjunction_type 1079 +#define conjunction_type 1080 +#define inversion_type 1081 +#define comparison_type 1082 +#define compare_op_bitwise_or_pair_type 1083 +#define eq_bitwise_or_type 1084 +#define noteq_bitwise_or_type 1085 +#define lte_bitwise_or_type 1086 +#define lt_bitwise_or_type 1087 +#define gte_bitwise_or_type 1088 +#define gt_bitwise_or_type 1089 +#define notin_bitwise_or_type 1090 +#define in_bitwise_or_type 1091 +#define isnot_bitwise_or_type 1092 +#define is_bitwise_or_type 1093 +#define bitwise_or_type 1094 // Left-recursive +#define bitwise_xor_type 1095 // Left-recursive +#define bitwise_and_type 1096 // Left-recursive +#define shift_expr_type 1097 // Left-recursive +#define sum_type 1098 // Left-recursive +#define term_type 1099 // Left-recursive +#define factor_type 1100 +#define power_type 1101 +#define await_primary_type 1102 +#define primary_type 1103 // Left-recursive +#define slices_type 1104 +#define slice_type 1105 +#define atom_type 1106 +#define strings_type 1107 +#define list_type 1108 +#define listcomp_type 1109 +#define tuple_type 1110 +#define group_type 1111 +#define genexp_type 1112 +#define set_type 1113 +#define setcomp_type 1114 +#define dict_type 1115 +#define dictcomp_type 1116 +#define double_starred_kvpairs_type 1117 +#define double_starred_kvpair_type 1118 +#define kvpair_type 1119 +#define for_if_clauses_type 1120 +#define for_if_clause_type 1121 +#define yield_expr_type 1122 +#define arguments_type 1123 +#define args_type 1124 +#define kwargs_type 1125 +#define starred_expression_type 1126 +#define kwarg_or_starred_type 1127 +#define kwarg_or_double_starred_type 1128 +#define star_targets_type 1129 +#define star_targets_seq_type 1130 +#define star_target_type 1131 +#define star_atom_type 1132 +#define single_target_type 1133 +#define single_subscript_attribute_target_type 1134 +#define del_targets_type 1135 +#define del_target_type 1136 +#define del_t_atom_type 1137 +#define targets_type 1138 +#define target_type 1139 +#define t_primary_type 1140 // Left-recursive +#define t_lookahead_type 1141 +#define t_atom_type 1142 +#define incorrect_arguments_type 1143 +#define invalid_kwarg_type 1144 +#define invalid_named_expression_type 1145 +#define invalid_assignment_type 1146 +#define invalid_ann_assign_target_type 1147 +#define invalid_del_stmt_type 1148 +#define invalid_block_type 1149 +#define invalid_comprehension_type 1150 +#define invalid_dict_comprehension_type 1151 +#define invalid_parameters_type 1152 +#define invalid_lambda_parameters_type 1153 +#define invalid_star_etc_type 1154 +#define invalid_lambda_star_etc_type 1155 +#define invalid_double_type_comments_type 1156 +#define invalid_with_item_type 1157 +#define invalid_for_target_type 1158 +#define invalid_group_type 1159 +#define invalid_import_from_targets_type 1160 +#define _loop0_1_type 1161 +#define _loop0_2_type 1162 +#define _loop0_4_type 1163 +#define _gather_3_type 1164 +#define _loop0_6_type 1165 +#define _gather_5_type 1166 +#define _loop0_8_type 1167 +#define _gather_7_type 1168 +#define _loop0_10_type 1169 +#define _gather_9_type 1170 +#define _loop1_11_type 1171 +#define _loop0_13_type 1172 +#define _gather_12_type 1173 +#define _tmp_14_type 1174 +#define _tmp_15_type 1175 +#define _tmp_16_type 1176 +#define _tmp_17_type 1177 +#define _tmp_18_type 1178 +#define _tmp_19_type 1179 +#define _tmp_20_type 1180 +#define _tmp_21_type 1181 +#define _loop1_22_type 1182 +#define _tmp_23_type 1183 +#define _tmp_24_type 1184 +#define _loop0_26_type 1185 +#define _gather_25_type 1186 +#define _loop0_28_type 1187 +#define _gather_27_type 1188 +#define _tmp_29_type 1189 +#define _tmp_30_type 1190 +#define _loop0_31_type 1191 +#define _loop1_32_type 1192 +#define _loop0_34_type 1193 +#define _gather_33_type 1194 +#define _tmp_35_type 1195 +#define _loop0_37_type 1196 +#define _gather_36_type 1197 +#define _tmp_38_type 1198 +#define _loop0_40_type 1199 +#define _gather_39_type 1200 +#define _loop0_42_type 1201 +#define _gather_41_type 1202 +#define _loop0_44_type 1203 +#define _gather_43_type 1204 +#define _loop0_46_type 1205 +#define _gather_45_type 1206 +#define _tmp_47_type 1207 +#define _loop1_48_type 1208 +#define _tmp_49_type 1209 +#define _tmp_50_type 1210 +#define _tmp_51_type 1211 +#define _tmp_52_type 1212 +#define _tmp_53_type 1213 +#define _loop0_54_type 1214 +#define _loop0_55_type 1215 +#define _loop0_56_type 1216 +#define _loop1_57_type 1217 +#define _loop0_58_type 1218 +#define _loop1_59_type 1219 +#define _loop1_60_type 1220 +#define _loop1_61_type 1221 +#define _loop0_62_type 1222 +#define _loop1_63_type 1223 +#define _loop0_64_type 1224 +#define _loop1_65_type 1225 +#define _loop0_66_type 1226 +#define _loop1_67_type 1227 +#define _loop1_68_type 1228 +#define _tmp_69_type 1229 +#define _loop0_71_type 1230 +#define _gather_70_type 1231 +#define _loop1_72_type 1232 +#define _loop0_74_type 1233 +#define _gather_73_type 1234 +#define _loop1_75_type 1235 +#define _loop0_76_type 1236 +#define _loop0_77_type 1237 +#define _loop0_78_type 1238 +#define _loop1_79_type 1239 +#define _loop0_80_type 1240 +#define _loop1_81_type 1241 +#define _loop1_82_type 1242 +#define _loop1_83_type 1243 +#define _loop0_84_type 1244 +#define _loop1_85_type 1245 +#define _loop0_86_type 1246 +#define _loop1_87_type 1247 +#define _loop0_88_type 1248 +#define _loop1_89_type 1249 +#define _loop1_90_type 1250 +#define _loop1_91_type 1251 +#define _loop1_92_type 1252 +#define _tmp_93_type 1253 +#define _loop0_95_type 1254 +#define _gather_94_type 1255 +#define _tmp_96_type 1256 +#define _tmp_97_type 1257 +#define _tmp_98_type 1258 +#define _tmp_99_type 1259 +#define _loop1_100_type 1260 +#define _tmp_101_type 1261 +#define _tmp_102_type 1262 +#define _loop0_104_type 1263 +#define _gather_103_type 1264 +#define _loop1_105_type 1265 +#define _loop0_106_type 1266 +#define _loop0_107_type 1267 +#define _loop0_109_type 1268 +#define _gather_108_type 1269 +#define _tmp_110_type 1270 +#define _loop0_112_type 1271 +#define _gather_111_type 1272 +#define _loop0_114_type 1273 +#define _gather_113_type 1274 +#define _loop0_116_type 1275 +#define _gather_115_type 1276 +#define _loop0_118_type 1277 +#define _gather_117_type 1278 +#define _loop0_119_type 1279 +#define _loop0_121_type 1280 +#define _gather_120_type 1281 +#define _tmp_122_type 1282 +#define _loop0_124_type 1283 +#define _gather_123_type 1284 +#define _loop0_126_type 1285 +#define _gather_125_type 1286 +#define _tmp_127_type 1287 +#define _loop0_128_type 1288 +#define _loop0_129_type 1289 +#define _loop0_130_type 1290 +#define _tmp_131_type 1291 +#define _tmp_132_type 1292 +#define _loop0_133_type 1293 +#define _tmp_134_type 1294 +#define _loop0_135_type 1295 +#define _tmp_136_type 1296 +#define _tmp_137_type 1297 +#define _tmp_138_type 1298 +#define _tmp_139_type 1299 +#define _tmp_140_type 1300 +#define _tmp_141_type 1301 +#define _tmp_142_type 1302 +#define _tmp_143_type 1303 +#define _tmp_144_type 1304 +#define _tmp_145_type 1305 +#define _tmp_146_type 1306 +#define _tmp_147_type 1307 +#define _tmp_148_type 1308 +#define _tmp_149_type 1309 +#define _tmp_150_type 1310 +#define _tmp_151_type 1311 +#define _tmp_152_type 1312 +#define _loop1_153_type 1313 +#define _loop1_154_type 1314 +#define _tmp_155_type 1315 +#define _tmp_156_type 1316 + +static mod_ty file_rule(Parser *p); +static mod_ty interactive_rule(Parser *p); +static mod_ty eval_rule(Parser *p); +static mod_ty func_type_rule(Parser *p); +static expr_ty fstring_rule(Parser *p); +static asdl_seq* type_expressions_rule(Parser *p); +static asdl_seq* statements_rule(Parser *p); +static asdl_seq* statement_rule(Parser *p); +static asdl_seq* statement_newline_rule(Parser *p); +static asdl_seq* simple_stmt_rule(Parser *p); +static stmt_ty small_stmt_rule(Parser *p); +static stmt_ty compound_stmt_rule(Parser *p); +static stmt_ty assignment_rule(Parser *p); +static AugOperator* augassign_rule(Parser *p); +static stmt_ty global_stmt_rule(Parser *p); +static stmt_ty nonlocal_stmt_rule(Parser *p); +static stmt_ty yield_stmt_rule(Parser *p); +static stmt_ty assert_stmt_rule(Parser *p); +static stmt_ty del_stmt_rule(Parser *p); +static stmt_ty import_stmt_rule(Parser *p); +static stmt_ty import_name_rule(Parser *p); +static stmt_ty import_from_rule(Parser *p); +static asdl_seq* import_from_targets_rule(Parser *p); +static asdl_seq* import_from_as_names_rule(Parser *p); +static alias_ty import_from_as_name_rule(Parser *p); +static asdl_seq* dotted_as_names_rule(Parser *p); +static alias_ty dotted_as_name_rule(Parser *p); +static expr_ty dotted_name_rule(Parser *p); +static stmt_ty if_stmt_rule(Parser *p); +static stmt_ty elif_stmt_rule(Parser *p); +static asdl_seq* else_block_rule(Parser *p); +static stmt_ty while_stmt_rule(Parser *p); +static stmt_ty for_stmt_rule(Parser *p); +static stmt_ty with_stmt_rule(Parser *p); +static withitem_ty with_item_rule(Parser *p); +static stmt_ty try_stmt_rule(Parser *p); +static excepthandler_ty except_block_rule(Parser *p); +static asdl_seq* finally_block_rule(Parser *p); +static stmt_ty return_stmt_rule(Parser *p); +static stmt_ty raise_stmt_rule(Parser *p); +static stmt_ty function_def_rule(Parser *p); +static stmt_ty function_def_raw_rule(Parser *p); +static Token* func_type_comment_rule(Parser *p); +static arguments_ty params_rule(Parser *p); +static arguments_ty parameters_rule(Parser *p); +static asdl_seq* slash_no_default_rule(Parser *p); +static SlashWithDefault* slash_with_default_rule(Parser *p); +static StarEtc* star_etc_rule(Parser *p); +static arg_ty kwds_rule(Parser *p); +static arg_ty param_no_default_rule(Parser *p); +static NameDefaultPair* param_with_default_rule(Parser *p); +static NameDefaultPair* param_maybe_default_rule(Parser *p); +static arg_ty param_rule(Parser *p); +static expr_ty annotation_rule(Parser *p); +static expr_ty default_rule(Parser *p); +static asdl_seq* decorators_rule(Parser *p); +static stmt_ty class_def_rule(Parser *p); +static stmt_ty class_def_raw_rule(Parser *p); +static asdl_seq* block_rule(Parser *p); +static asdl_seq* expressions_list_rule(Parser *p); +static expr_ty star_expressions_rule(Parser *p); +static expr_ty star_expression_rule(Parser *p); +static asdl_seq* star_named_expressions_rule(Parser *p); +static expr_ty star_named_expression_rule(Parser *p); +static expr_ty named_expression_rule(Parser *p); +static expr_ty annotated_rhs_rule(Parser *p); +static expr_ty expressions_rule(Parser *p); +static expr_ty expression_rule(Parser *p); +static expr_ty lambdef_rule(Parser *p); +static arguments_ty lambda_params_rule(Parser *p); +static arguments_ty lambda_parameters_rule(Parser *p); +static asdl_seq* lambda_slash_no_default_rule(Parser *p); +static SlashWithDefault* lambda_slash_with_default_rule(Parser *p); +static StarEtc* lambda_star_etc_rule(Parser *p); +static arg_ty lambda_kwds_rule(Parser *p); +static arg_ty lambda_param_no_default_rule(Parser *p); +static NameDefaultPair* lambda_param_with_default_rule(Parser *p); +static NameDefaultPair* lambda_param_maybe_default_rule(Parser *p); +static arg_ty lambda_param_rule(Parser *p); +static expr_ty disjunction_rule(Parser *p); +static expr_ty conjunction_rule(Parser *p); +static expr_ty inversion_rule(Parser *p); +static expr_ty comparison_rule(Parser *p); +static CmpopExprPair* compare_op_bitwise_or_pair_rule(Parser *p); +static CmpopExprPair* eq_bitwise_or_rule(Parser *p); +static CmpopExprPair* noteq_bitwise_or_rule(Parser *p); +static CmpopExprPair* lte_bitwise_or_rule(Parser *p); +static CmpopExprPair* lt_bitwise_or_rule(Parser *p); +static CmpopExprPair* gte_bitwise_or_rule(Parser *p); +static CmpopExprPair* gt_bitwise_or_rule(Parser *p); +static CmpopExprPair* notin_bitwise_or_rule(Parser *p); +static CmpopExprPair* in_bitwise_or_rule(Parser *p); +static CmpopExprPair* isnot_bitwise_or_rule(Parser *p); +static CmpopExprPair* is_bitwise_or_rule(Parser *p); +static expr_ty bitwise_or_rule(Parser *p); +static expr_ty bitwise_xor_rule(Parser *p); +static expr_ty bitwise_and_rule(Parser *p); +static expr_ty shift_expr_rule(Parser *p); +static expr_ty sum_rule(Parser *p); +static expr_ty term_rule(Parser *p); +static expr_ty factor_rule(Parser *p); +static expr_ty power_rule(Parser *p); +static expr_ty await_primary_rule(Parser *p); +static expr_ty primary_rule(Parser *p); +static expr_ty slices_rule(Parser *p); +static expr_ty slice_rule(Parser *p); +static expr_ty atom_rule(Parser *p); +static expr_ty strings_rule(Parser *p); +static expr_ty list_rule(Parser *p); +static expr_ty listcomp_rule(Parser *p); +static expr_ty tuple_rule(Parser *p); +static expr_ty group_rule(Parser *p); +static expr_ty genexp_rule(Parser *p); +static expr_ty set_rule(Parser *p); +static expr_ty setcomp_rule(Parser *p); +static expr_ty dict_rule(Parser *p); +static expr_ty dictcomp_rule(Parser *p); +static asdl_seq* double_starred_kvpairs_rule(Parser *p); +static KeyValuePair* double_starred_kvpair_rule(Parser *p); +static KeyValuePair* kvpair_rule(Parser *p); +static asdl_seq* for_if_clauses_rule(Parser *p); +static comprehension_ty for_if_clause_rule(Parser *p); +static expr_ty yield_expr_rule(Parser *p); +static expr_ty arguments_rule(Parser *p); +static expr_ty args_rule(Parser *p); +static asdl_seq* kwargs_rule(Parser *p); +static expr_ty starred_expression_rule(Parser *p); +static KeywordOrStarred* kwarg_or_starred_rule(Parser *p); +static KeywordOrStarred* kwarg_or_double_starred_rule(Parser *p); +static expr_ty star_targets_rule(Parser *p); +static asdl_seq* star_targets_seq_rule(Parser *p); +static expr_ty star_target_rule(Parser *p); +static expr_ty star_atom_rule(Parser *p); +static expr_ty single_target_rule(Parser *p); +static expr_ty single_subscript_attribute_target_rule(Parser *p); +static asdl_seq* del_targets_rule(Parser *p); +static expr_ty del_target_rule(Parser *p); +static expr_ty del_t_atom_rule(Parser *p); +static asdl_seq* targets_rule(Parser *p); +static expr_ty target_rule(Parser *p); +static expr_ty t_primary_rule(Parser *p); +static void *t_lookahead_rule(Parser *p); +static expr_ty t_atom_rule(Parser *p); +static void *incorrect_arguments_rule(Parser *p); +static void *invalid_kwarg_rule(Parser *p); +static void *invalid_named_expression_rule(Parser *p); +static void *invalid_assignment_rule(Parser *p); +static expr_ty invalid_ann_assign_target_rule(Parser *p); +static void *invalid_del_stmt_rule(Parser *p); +static void *invalid_block_rule(Parser *p); +static void *invalid_comprehension_rule(Parser *p); +static void *invalid_dict_comprehension_rule(Parser *p); +static void *invalid_parameters_rule(Parser *p); +static void *invalid_lambda_parameters_rule(Parser *p); +static void *invalid_star_etc_rule(Parser *p); +static void *invalid_lambda_star_etc_rule(Parser *p); +static void *invalid_double_type_comments_rule(Parser *p); +static void *invalid_with_item_rule(Parser *p); +static void *invalid_for_target_rule(Parser *p); +static void *invalid_group_rule(Parser *p); +static void *invalid_import_from_targets_rule(Parser *p); +static asdl_seq *_loop0_1_rule(Parser *p); +static asdl_seq *_loop0_2_rule(Parser *p); +static asdl_seq *_loop0_4_rule(Parser *p); +static asdl_seq *_gather_3_rule(Parser *p); +static asdl_seq *_loop0_6_rule(Parser *p); +static asdl_seq *_gather_5_rule(Parser *p); +static asdl_seq *_loop0_8_rule(Parser *p); +static asdl_seq *_gather_7_rule(Parser *p); +static asdl_seq *_loop0_10_rule(Parser *p); +static asdl_seq *_gather_9_rule(Parser *p); +static asdl_seq *_loop1_11_rule(Parser *p); +static asdl_seq *_loop0_13_rule(Parser *p); +static asdl_seq *_gather_12_rule(Parser *p); +static void *_tmp_14_rule(Parser *p); +static void *_tmp_15_rule(Parser *p); +static void *_tmp_16_rule(Parser *p); +static void *_tmp_17_rule(Parser *p); +static void *_tmp_18_rule(Parser *p); +static void *_tmp_19_rule(Parser *p); +static void *_tmp_20_rule(Parser *p); +static void *_tmp_21_rule(Parser *p); +static asdl_seq *_loop1_22_rule(Parser *p); +static void *_tmp_23_rule(Parser *p); +static void *_tmp_24_rule(Parser *p); +static asdl_seq *_loop0_26_rule(Parser *p); +static asdl_seq *_gather_25_rule(Parser *p); +static asdl_seq *_loop0_28_rule(Parser *p); +static asdl_seq *_gather_27_rule(Parser *p); +static void *_tmp_29_rule(Parser *p); +static void *_tmp_30_rule(Parser *p); +static asdl_seq *_loop0_31_rule(Parser *p); +static asdl_seq *_loop1_32_rule(Parser *p); +static asdl_seq *_loop0_34_rule(Parser *p); +static asdl_seq *_gather_33_rule(Parser *p); +static void *_tmp_35_rule(Parser *p); +static asdl_seq *_loop0_37_rule(Parser *p); +static asdl_seq *_gather_36_rule(Parser *p); +static void *_tmp_38_rule(Parser *p); +static asdl_seq *_loop0_40_rule(Parser *p); +static asdl_seq *_gather_39_rule(Parser *p); +static asdl_seq *_loop0_42_rule(Parser *p); +static asdl_seq *_gather_41_rule(Parser *p); +static asdl_seq *_loop0_44_rule(Parser *p); +static asdl_seq *_gather_43_rule(Parser *p); +static asdl_seq *_loop0_46_rule(Parser *p); +static asdl_seq *_gather_45_rule(Parser *p); +static void *_tmp_47_rule(Parser *p); +static asdl_seq *_loop1_48_rule(Parser *p); +static void *_tmp_49_rule(Parser *p); +static void *_tmp_50_rule(Parser *p); +static void *_tmp_51_rule(Parser *p); +static void *_tmp_52_rule(Parser *p); +static void *_tmp_53_rule(Parser *p); +static asdl_seq *_loop0_54_rule(Parser *p); +static asdl_seq *_loop0_55_rule(Parser *p); +static asdl_seq *_loop0_56_rule(Parser *p); +static asdl_seq *_loop1_57_rule(Parser *p); +static asdl_seq *_loop0_58_rule(Parser *p); +static asdl_seq *_loop1_59_rule(Parser *p); +static asdl_seq *_loop1_60_rule(Parser *p); +static asdl_seq *_loop1_61_rule(Parser *p); +static asdl_seq *_loop0_62_rule(Parser *p); +static asdl_seq *_loop1_63_rule(Parser *p); +static asdl_seq *_loop0_64_rule(Parser *p); +static asdl_seq *_loop1_65_rule(Parser *p); +static asdl_seq *_loop0_66_rule(Parser *p); +static asdl_seq *_loop1_67_rule(Parser *p); +static asdl_seq *_loop1_68_rule(Parser *p); +static void *_tmp_69_rule(Parser *p); +static asdl_seq *_loop0_71_rule(Parser *p); +static asdl_seq *_gather_70_rule(Parser *p); +static asdl_seq *_loop1_72_rule(Parser *p); +static asdl_seq *_loop0_74_rule(Parser *p); +static asdl_seq *_gather_73_rule(Parser *p); +static asdl_seq *_loop1_75_rule(Parser *p); +static asdl_seq *_loop0_76_rule(Parser *p); +static asdl_seq *_loop0_77_rule(Parser *p); +static asdl_seq *_loop0_78_rule(Parser *p); +static asdl_seq *_loop1_79_rule(Parser *p); +static asdl_seq *_loop0_80_rule(Parser *p); +static asdl_seq *_loop1_81_rule(Parser *p); +static asdl_seq *_loop1_82_rule(Parser *p); +static asdl_seq *_loop1_83_rule(Parser *p); +static asdl_seq *_loop0_84_rule(Parser *p); +static asdl_seq *_loop1_85_rule(Parser *p); +static asdl_seq *_loop0_86_rule(Parser *p); +static asdl_seq *_loop1_87_rule(Parser *p); +static asdl_seq *_loop0_88_rule(Parser *p); +static asdl_seq *_loop1_89_rule(Parser *p); +static asdl_seq *_loop1_90_rule(Parser *p); +static asdl_seq *_loop1_91_rule(Parser *p); +static asdl_seq *_loop1_92_rule(Parser *p); +static void *_tmp_93_rule(Parser *p); +static asdl_seq *_loop0_95_rule(Parser *p); +static asdl_seq *_gather_94_rule(Parser *p); +static void *_tmp_96_rule(Parser *p); +static void *_tmp_97_rule(Parser *p); +static void *_tmp_98_rule(Parser *p); +static void *_tmp_99_rule(Parser *p); +static asdl_seq *_loop1_100_rule(Parser *p); +static void *_tmp_101_rule(Parser *p); +static void *_tmp_102_rule(Parser *p); +static asdl_seq *_loop0_104_rule(Parser *p); +static asdl_seq *_gather_103_rule(Parser *p); +static asdl_seq *_loop1_105_rule(Parser *p); +static asdl_seq *_loop0_106_rule(Parser *p); +static asdl_seq *_loop0_107_rule(Parser *p); +static asdl_seq *_loop0_109_rule(Parser *p); +static asdl_seq *_gather_108_rule(Parser *p); +static void *_tmp_110_rule(Parser *p); +static asdl_seq *_loop0_112_rule(Parser *p); +static asdl_seq *_gather_111_rule(Parser *p); +static asdl_seq *_loop0_114_rule(Parser *p); +static asdl_seq *_gather_113_rule(Parser *p); +static asdl_seq *_loop0_116_rule(Parser *p); +static asdl_seq *_gather_115_rule(Parser *p); +static asdl_seq *_loop0_118_rule(Parser *p); +static asdl_seq *_gather_117_rule(Parser *p); +static asdl_seq *_loop0_119_rule(Parser *p); +static asdl_seq *_loop0_121_rule(Parser *p); +static asdl_seq *_gather_120_rule(Parser *p); +static void *_tmp_122_rule(Parser *p); +static asdl_seq *_loop0_124_rule(Parser *p); +static asdl_seq *_gather_123_rule(Parser *p); +static asdl_seq *_loop0_126_rule(Parser *p); +static asdl_seq *_gather_125_rule(Parser *p); +static void *_tmp_127_rule(Parser *p); +static asdl_seq *_loop0_128_rule(Parser *p); +static asdl_seq *_loop0_129_rule(Parser *p); +static asdl_seq *_loop0_130_rule(Parser *p); +static void *_tmp_131_rule(Parser *p); +static void *_tmp_132_rule(Parser *p); +static asdl_seq *_loop0_133_rule(Parser *p); +static void *_tmp_134_rule(Parser *p); +static asdl_seq *_loop0_135_rule(Parser *p); +static void *_tmp_136_rule(Parser *p); +static void *_tmp_137_rule(Parser *p); +static void *_tmp_138_rule(Parser *p); +static void *_tmp_139_rule(Parser *p); +static void *_tmp_140_rule(Parser *p); +static void *_tmp_141_rule(Parser *p); +static void *_tmp_142_rule(Parser *p); +static void *_tmp_143_rule(Parser *p); +static void *_tmp_144_rule(Parser *p); +static void *_tmp_145_rule(Parser *p); +static void *_tmp_146_rule(Parser *p); +static void *_tmp_147_rule(Parser *p); +static void *_tmp_148_rule(Parser *p); +static void *_tmp_149_rule(Parser *p); +static void *_tmp_150_rule(Parser *p); +static void *_tmp_151_rule(Parser *p); +static void *_tmp_152_rule(Parser *p); +static asdl_seq *_loop1_153_rule(Parser *p); +static asdl_seq *_loop1_154_rule(Parser *p); +static void *_tmp_155_rule(Parser *p); +static void *_tmp_156_rule(Parser *p); + + +// file: statements? $ +static mod_ty +file_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + mod_ty _res = NULL; + int _mark = p->mark; + { // statements? $ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> file[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statements? $")); + void *a; + Token * endmarker_var; + if ( + (a = statements_rule(p), 1) // statements? + && + (endmarker_var = _PyPegen_expect_token(p, ENDMARKER)) // token='ENDMARKER' + ) + { + D(fprintf(stderr, "%*c+ file[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "statements? $")); + _res = _PyPegen_make_module ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s file[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statements? $")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// interactive: statement_newline +static mod_ty +interactive_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + mod_ty _res = NULL; + int _mark = p->mark; + { // statement_newline + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> interactive[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement_newline")); + asdl_seq* a; + if ( + (a = statement_newline_rule(p)) // statement_newline + ) + { + D(fprintf(stderr, "%*c+ interactive[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "statement_newline")); + _res = Interactive ( a , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s interactive[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statement_newline")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// eval: expressions NEWLINE* $ +static mod_ty +eval_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + mod_ty _res = NULL; + int _mark = p->mark; + { // expressions NEWLINE* $ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> eval[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions NEWLINE* $")); + asdl_seq * _loop0_1_var; + expr_ty a; + Token * endmarker_var; + if ( + (a = expressions_rule(p)) // expressions + && + (_loop0_1_var = _loop0_1_rule(p)) // NEWLINE* + && + (endmarker_var = _PyPegen_expect_token(p, ENDMARKER)) // token='ENDMARKER' + ) + { + D(fprintf(stderr, "%*c+ eval[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions NEWLINE* $")); + _res = Expression ( a , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s eval[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions NEWLINE* $")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// func_type: '(' type_expressions? ')' '->' expression NEWLINE* $ +static mod_ty +func_type_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + mod_ty _res = NULL; + int _mark = p->mark; + { // '(' type_expressions? ')' '->' expression NEWLINE* $ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> func_type[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' type_expressions? ')' '->' expression NEWLINE* $")); + Token * _literal; + Token * _literal_1; + Token * _literal_2; + asdl_seq * _loop0_2_var; + void *a; + expr_ty b; + Token * endmarker_var; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = type_expressions_rule(p), 1) // type_expressions? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (_literal_2 = _PyPegen_expect_token(p, 51)) // token='->' + && + (b = expression_rule(p)) // expression + && + (_loop0_2_var = _loop0_2_rule(p)) // NEWLINE* + && + (endmarker_var = _PyPegen_expect_token(p, ENDMARKER)) // token='ENDMARKER' + ) + { + D(fprintf(stderr, "%*c+ func_type[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' type_expressions? ')' '->' expression NEWLINE* $")); + _res = FunctionType ( a , b , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s func_type[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' type_expressions? ')' '->' expression NEWLINE* $")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// fstring: star_expressions +static expr_ty +fstring_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> fstring[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ fstring[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// type_expressions: +// | ','.expression+ ',' '*' expression ',' '**' expression +// | ','.expression+ ',' '*' expression +// | ','.expression+ ',' '**' expression +// | '*' expression ',' '**' expression +// | '*' expression +// | '**' expression +// | ','.expression+ +static asdl_seq* +type_expressions_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.expression+ ',' '*' expression ',' '**' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '*' expression ',' '**' expression")); + Token * _literal; + Token * _literal_1; + Token * _literal_2; + Token * _literal_3; + asdl_seq * a; + expr_ty b; + expr_ty c; + if ( + (a = _gather_3_rule(p)) // ','.expression+ + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_1 = _PyPegen_expect_token(p, 16)) // token='*' + && + (b = expression_rule(p)) // expression + && + (_literal_2 = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_3 = _PyPegen_expect_token(p, 35)) // token='**' + && + (c = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '*' expression ',' '**' expression")); + _res = _PyPegen_seq_append_to_end ( p , CHECK ( _PyPegen_seq_append_to_end ( p , a , b ) ) , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.expression+ ',' '*' expression ',' '**' expression")); + } + { // ','.expression+ ',' '*' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '*' expression")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + expr_ty b; + if ( + (a = _gather_5_rule(p)) // ','.expression+ + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_1 = _PyPegen_expect_token(p, 16)) // token='*' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '*' expression")); + _res = _PyPegen_seq_append_to_end ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.expression+ ',' '*' expression")); + } + { // ','.expression+ ',' '**' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '**' expression")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + expr_ty b; + if ( + (a = _gather_7_rule(p)) // ','.expression+ + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_1 = _PyPegen_expect_token(p, 35)) // token='**' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '**' expression")); + _res = _PyPegen_seq_append_to_end ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.expression+ ',' '**' expression")); + } + { // '*' expression ',' '**' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' expression ',' '**' expression")); + Token * _literal; + Token * _literal_1; + Token * _literal_2; + expr_ty a; + expr_ty b; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = expression_rule(p)) // expression + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_2 = _PyPegen_expect_token(p, 35)) // token='**' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' expression ',' '**' expression")); + _res = _PyPegen_seq_append_to_end ( p , CHECK ( _PyPegen_singleton_seq ( p , a ) ) , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' expression ',' '**' expression")); + } + { // '*' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' expression")); + _res = _PyPegen_singleton_seq ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' expression")); + } + { // '**' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' expression")); + _res = _PyPegen_singleton_seq ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' expression")); + } + { // ','.expression+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+")); + asdl_seq * _gather_9_var; + if ( + (_gather_9_var = _gather_9_rule(p)) // ','.expression+ + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+")); + _res = _gather_9_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.expression+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// statements: statement+ +static asdl_seq* +statements_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // statement+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statements[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement+")); + asdl_seq * a; + if ( + (a = _loop1_11_rule(p)) // statement+ + ) + { + D(fprintf(stderr, "%*c+ statements[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "statement+")); + _res = _PyPegen_seq_flatten ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statements[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statement+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// statement: compound_stmt | simple_stmt +static asdl_seq* +statement_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // compound_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compound_stmt")); + stmt_ty a; + if ( + (a = compound_stmt_rule(p)) // compound_stmt + ) + { + D(fprintf(stderr, "%*c+ statement[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "compound_stmt")); + _res = _PyPegen_singleton_seq ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compound_stmt")); + } + { // simple_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + asdl_seq* simple_stmt_var; + if ( + (simple_stmt_var = simple_stmt_rule(p)) // simple_stmt + ) + { + D(fprintf(stderr, "%*c+ statement[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + _res = simple_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// statement_newline: compound_stmt NEWLINE | simple_stmt | NEWLINE | $ +static asdl_seq* +statement_newline_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // compound_stmt NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement_newline[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compound_stmt NEWLINE")); + stmt_ty a; + Token * newline_var; + if ( + (a = compound_stmt_rule(p)) // compound_stmt + && + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ statement_newline[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "compound_stmt NEWLINE")); + _res = _PyPegen_singleton_seq ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement_newline[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compound_stmt NEWLINE")); + } + { // simple_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement_newline[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + asdl_seq* simple_stmt_var; + if ( + (simple_stmt_var = simple_stmt_rule(p)) // simple_stmt + ) + { + D(fprintf(stderr, "%*c+ statement_newline[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + _res = simple_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement_newline[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt")); + } + { // NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement_newline[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + Token * newline_var; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ statement_newline[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_singleton_seq ( p , CHECK ( _Py_Pass ( EXTRA ) ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement_newline[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); + } + { // $ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement_newline[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "$")); + Token * endmarker_var; + if ( + (endmarker_var = _PyPegen_expect_token(p, ENDMARKER)) // token='ENDMARKER' + ) + { + D(fprintf(stderr, "%*c+ statement_newline[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "$")); + _res = _PyPegen_interactive_exit ( p ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement_newline[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "$")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// simple_stmt: small_stmt !';' NEWLINE | ';'.small_stmt+ ';'? NEWLINE +static asdl_seq* +simple_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // small_stmt !';' NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "small_stmt !';' NEWLINE")); + stmt_ty a; + Token * newline_var; + if ( + (a = small_stmt_rule(p)) // small_stmt + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 13) // token=';' + && + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "small_stmt !';' NEWLINE")); + _res = _PyPegen_singleton_seq ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "small_stmt !';' NEWLINE")); + } + { // ';'.small_stmt+ ';'? NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'.small_stmt+ ';'? NEWLINE")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + Token * newline_var; + if ( + (a = _gather_12_rule(p)) // ';'.small_stmt+ + && + (_opt_var = _PyPegen_expect_token(p, 13), 1) // ';'? + && + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'.small_stmt+ ';'? NEWLINE")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';'.small_stmt+ ';'? NEWLINE")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// small_stmt: +// | assignment +// | star_expressions +// | &'return' return_stmt +// | &('import' | 'from') import_stmt +// | &'raise' raise_stmt +// | 'pass' +// | &'del' del_stmt +// | &'yield' yield_stmt +// | &'assert' assert_stmt +// | 'break' +// | 'continue' +// | &'global' global_stmt +// | &'nonlocal' nonlocal_stmt +static stmt_ty +small_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + if (_PyPegen_is_memoized(p, small_stmt_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // assignment + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment")); + stmt_ty assignment_var; + if ( + (assignment_var = assignment_rule(p)) // assignment + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment")); + _res = assignment_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment")); + } + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty e; + if ( + (e = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Expr ( e , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + { // &'return' return_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'return' return_stmt")); + stmt_ty return_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 500) // token='return' + && + (return_stmt_var = return_stmt_rule(p)) // return_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'return' return_stmt")); + _res = return_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'return' return_stmt")); + } + { // &('import' | 'from') import_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('import' | 'from') import_stmt")); + stmt_ty import_stmt_var; + if ( + _PyPegen_lookahead(1, _tmp_14_rule, p) + && + (import_stmt_var = import_stmt_rule(p)) // import_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('import' | 'from') import_stmt")); + _res = import_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&('import' | 'from') import_stmt")); + } + { // &'raise' raise_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'raise' raise_stmt")); + stmt_ty raise_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 501) // token='raise' + && + (raise_stmt_var = raise_stmt_rule(p)) // raise_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'raise' raise_stmt")); + _res = raise_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'raise' raise_stmt")); + } + { // 'pass' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'pass'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 502)) // token='pass' + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'pass'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Pass ( EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'pass'")); + } + { // &'del' del_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'del' del_stmt")); + stmt_ty del_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 503) // token='del' + && + (del_stmt_var = del_stmt_rule(p)) // del_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'del' del_stmt")); + _res = del_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'del' del_stmt")); + } + { // &'yield' yield_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'yield' yield_stmt")); + stmt_ty yield_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 504) // token='yield' + && + (yield_stmt_var = yield_stmt_rule(p)) // yield_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'yield' yield_stmt")); + _res = yield_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'yield' yield_stmt")); + } + { // &'assert' assert_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'assert' assert_stmt")); + stmt_ty assert_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 505) // token='assert' + && + (assert_stmt_var = assert_stmt_rule(p)) // assert_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'assert' assert_stmt")); + _res = assert_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'assert' assert_stmt")); + } + { // 'break' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'break'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 506)) // token='break' + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'break'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Break ( EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'break'")); + } + { // 'continue' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'continue'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 507)) // token='continue' + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'continue'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Continue ( EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'continue'")); + } + { // &'global' global_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'global' global_stmt")); + stmt_ty global_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 508) // token='global' + && + (global_stmt_var = global_stmt_rule(p)) // global_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'global' global_stmt")); + _res = global_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'global' global_stmt")); + } + { // &'nonlocal' nonlocal_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'nonlocal' nonlocal_stmt")); + stmt_ty nonlocal_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 509) // token='nonlocal' + && + (nonlocal_stmt_var = nonlocal_stmt_rule(p)) // nonlocal_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'nonlocal' nonlocal_stmt")); + _res = nonlocal_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'nonlocal' nonlocal_stmt")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, small_stmt_type, _res); + D(p->level--); + return _res; +} + +// compound_stmt: +// | &('def' | '@' | ASYNC) function_def +// | &'if' if_stmt +// | &('class' | '@') class_def +// | &('with' | ASYNC) with_stmt +// | &('for' | ASYNC) for_stmt +// | &'try' try_stmt +// | &'while' while_stmt +static stmt_ty +compound_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + { // &('def' | '@' | ASYNC) function_def + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('def' | '@' | ASYNC) function_def")); + stmt_ty function_def_var; + if ( + _PyPegen_lookahead(1, _tmp_15_rule, p) + && + (function_def_var = function_def_rule(p)) // function_def + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('def' | '@' | ASYNC) function_def")); + _res = function_def_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&('def' | '@' | ASYNC) function_def")); + } + { // &'if' if_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'if' if_stmt")); + stmt_ty if_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 510) // token='if' + && + (if_stmt_var = if_stmt_rule(p)) // if_stmt + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'if' if_stmt")); + _res = if_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'if' if_stmt")); + } + { // &('class' | '@') class_def + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('class' | '@') class_def")); + stmt_ty class_def_var; + if ( + _PyPegen_lookahead(1, _tmp_16_rule, p) + && + (class_def_var = class_def_rule(p)) // class_def + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('class' | '@') class_def")); + _res = class_def_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&('class' | '@') class_def")); + } + { // &('with' | ASYNC) with_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('with' | ASYNC) with_stmt")); + stmt_ty with_stmt_var; + if ( + _PyPegen_lookahead(1, _tmp_17_rule, p) + && + (with_stmt_var = with_stmt_rule(p)) // with_stmt + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('with' | ASYNC) with_stmt")); + _res = with_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&('with' | ASYNC) with_stmt")); + } + { // &('for' | ASYNC) for_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('for' | ASYNC) for_stmt")); + stmt_ty for_stmt_var; + if ( + _PyPegen_lookahead(1, _tmp_18_rule, p) + && + (for_stmt_var = for_stmt_rule(p)) // for_stmt + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('for' | ASYNC) for_stmt")); + _res = for_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&('for' | ASYNC) for_stmt")); + } + { // &'try' try_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'try' try_stmt")); + stmt_ty try_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 511) // token='try' + && + (try_stmt_var = try_stmt_rule(p)) // try_stmt + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'try' try_stmt")); + _res = try_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'try' try_stmt")); + } + { // &'while' while_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'while' while_stmt")); + stmt_ty while_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 512) // token='while' + && + (while_stmt_var = while_stmt_rule(p)) // while_stmt + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'while' while_stmt")); + _res = while_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'while' while_stmt")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// assignment: +// | NAME ':' expression ['=' annotated_rhs] +// | ('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs] +// | ((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT? +// | single_target augassign ~ (yield_expr | star_expressions) +// | invalid_assignment +static stmt_ty +assignment_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME ':' expression ['=' annotated_rhs] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME ':' expression ['=' annotated_rhs]")); + Token * _literal; + expr_ty a; + expr_ty b; + void *c; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = expression_rule(p)) // expression + && + (c = _tmp_19_rule(p), 1) // ['=' annotated_rhs] + ) + { + D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ':' expression ['=' annotated_rhs]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 6 , "Variable annotation syntax is" , _Py_AnnAssign ( CHECK ( _PyPegen_set_expr_context ( p , a , Store ) ) , b , c , 1 , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME ':' expression ['=' annotated_rhs]")); + } + { // ('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]")); + Token * _literal; + void *a; + expr_ty b; + void *c; + if ( + (a = _tmp_20_rule(p)) // '(' single_target ')' | single_subscript_attribute_target + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = expression_rule(p)) // expression + && + (c = _tmp_21_rule(p), 1) // ['=' annotated_rhs] + ) + { + D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 6 , "Variable annotations syntax is" , _Py_AnnAssign ( a , b , c , 0 , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]")); + } + { // ((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT?")); + asdl_seq * a; + void *b; + void *tc; + if ( + (a = _loop1_22_rule(p)) // ((star_targets '='))+ + && + (b = _tmp_23_rule(p)) // yield_expr | star_expressions + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + ) + { + D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Assign ( a , b , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT?")); + } + { // single_target augassign ~ (yield_expr | star_expressions) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_target augassign ~ (yield_expr | star_expressions)")); + int _cut_var = 0; + expr_ty a; + AugOperator* b; + void *c; + if ( + (a = single_target_rule(p)) // single_target + && + (b = augassign_rule(p)) // augassign + && + (_cut_var = 1) + && + (c = _tmp_24_rule(p)) // yield_expr | star_expressions + ) + { + D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_target augassign ~ (yield_expr | star_expressions)")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_AugAssign ( a , b -> kind , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "single_target augassign ~ (yield_expr | star_expressions)")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // invalid_assignment + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_assignment")); + void *invalid_assignment_var; + if ( + (invalid_assignment_var = invalid_assignment_rule(p)) // invalid_assignment + ) + { + D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_assignment")); + _res = invalid_assignment_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_assignment")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// augassign: +// | '+=' +// | '-=' +// | '*=' +// | '@=' +// | '/=' +// | '%=' +// | '&=' +// | '|=' +// | '^=' +// | '<<=' +// | '>>=' +// | '**=' +// | '//=' +static AugOperator* +augassign_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + AugOperator* _res = NULL; + int _mark = p->mark; + { // '+=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 36)) // token='+=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+='")); + _res = _PyPegen_augoperator ( p , Add ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+='")); + } + { // '-=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 37)) // token='-=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-='")); + _res = _PyPegen_augoperator ( p , Sub ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-='")); + } + { // '*=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 38)) // token='*=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*='")); + _res = _PyPegen_augoperator ( p , Mult ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*='")); + } + { // '@=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 50)) // token='@=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@='")); + _res = CHECK_VERSION ( 5 , "The '@' operator is" , _PyPegen_augoperator ( p , MatMult ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@='")); + } + { // '/=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 39)) // token='/=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/='")); + _res = _PyPegen_augoperator ( p , Div ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/='")); + } + { // '%=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'%='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 40)) // token='%=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'%='")); + _res = _PyPegen_augoperator ( p , Mod ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'%='")); + } + { // '&=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'&='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 41)) // token='&=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'&='")); + _res = _PyPegen_augoperator ( p , BitAnd ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'&='")); + } + { // '|=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 42)) // token='|=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'|='")); + _res = _PyPegen_augoperator ( p , BitOr ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'|='")); + } + { // '^=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'^='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 43)) // token='^=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'^='")); + _res = _PyPegen_augoperator ( p , BitXor ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'^='")); + } + { // '<<=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'<<='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 44)) // token='<<=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'<<='")); + _res = _PyPegen_augoperator ( p , LShift ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'<<='")); + } + { // '>>=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'>>='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 45)) // token='>>=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'>>='")); + _res = _PyPegen_augoperator ( p , RShift ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'>>='")); + } + { // '**=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 46)) // token='**=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**='")); + _res = _PyPegen_augoperator ( p , Pow ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**='")); + } + { // '//=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'//='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 48)) // token='//=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'//='")); + _res = _PyPegen_augoperator ( p , FloorDiv ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'//='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// global_stmt: 'global' ','.NAME+ +static stmt_ty +global_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'global' ','.NAME+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> global_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'global' ','.NAME+")); + Token * _keyword; + asdl_seq * a; + if ( + (_keyword = _PyPegen_expect_token(p, 508)) // token='global' + && + (a = _gather_25_rule(p)) // ','.NAME+ + ) + { + D(fprintf(stderr, "%*c+ global_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'global' ','.NAME+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Global ( CHECK ( _PyPegen_map_names_to_ids ( p , a ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s global_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'global' ','.NAME+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// nonlocal_stmt: 'nonlocal' ','.NAME+ +static stmt_ty +nonlocal_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'nonlocal' ','.NAME+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> nonlocal_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'nonlocal' ','.NAME+")); + Token * _keyword; + asdl_seq * a; + if ( + (_keyword = _PyPegen_expect_token(p, 509)) // token='nonlocal' + && + (a = _gather_27_rule(p)) // ','.NAME+ + ) + { + D(fprintf(stderr, "%*c+ nonlocal_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'nonlocal' ','.NAME+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Nonlocal ( CHECK ( _PyPegen_map_names_to_ids ( p , a ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s nonlocal_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'nonlocal' ','.NAME+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// yield_stmt: yield_expr +static stmt_ty +yield_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> yield_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty y; + if ( + (y = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ yield_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Expr ( y , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s yield_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// assert_stmt: 'assert' expression [',' expression] +static stmt_ty +assert_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'assert' expression [',' expression] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assert_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'assert' expression [',' expression]")); + Token * _keyword; + expr_ty a; + void *b; + if ( + (_keyword = _PyPegen_expect_token(p, 505)) // token='assert' + && + (a = expression_rule(p)) // expression + && + (b = _tmp_29_rule(p), 1) // [',' expression] + ) + { + D(fprintf(stderr, "%*c+ assert_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'assert' expression [',' expression]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Assert ( a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assert_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'assert' expression [',' expression]")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// del_stmt: 'del' del_targets &(';' | NEWLINE) | invalid_del_stmt +static stmt_ty +del_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'del' del_targets &(';' | NEWLINE) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'del' del_targets &(';' | NEWLINE)")); + Token * _keyword; + asdl_seq* a; + if ( + (_keyword = _PyPegen_expect_token(p, 503)) // token='del' + && + (a = del_targets_rule(p)) // del_targets + && + _PyPegen_lookahead(1, _tmp_30_rule, p) + ) + { + D(fprintf(stderr, "%*c+ del_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'del' del_targets &(';' | NEWLINE)")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Delete ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'del' del_targets &(';' | NEWLINE)")); + } + { // invalid_del_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_del_stmt")); + void *invalid_del_stmt_var; + if ( + (invalid_del_stmt_var = invalid_del_stmt_rule(p)) // invalid_del_stmt + ) + { + D(fprintf(stderr, "%*c+ del_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_del_stmt")); + _res = invalid_del_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_del_stmt")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_stmt: import_name | import_from +static stmt_ty +import_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + { // import_name + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_name")); + stmt_ty import_name_var; + if ( + (import_name_var = import_name_rule(p)) // import_name + ) + { + D(fprintf(stderr, "%*c+ import_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_name")); + _res = import_name_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_name")); + } + { // import_from + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from")); + stmt_ty import_from_var; + if ( + (import_from_var = import_from_rule(p)) // import_from + ) + { + D(fprintf(stderr, "%*c+ import_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from")); + _res = import_from_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_name: 'import' dotted_as_names +static stmt_ty +import_name_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'import' dotted_as_names + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import' dotted_as_names")); + Token * _keyword; + asdl_seq* a; + if ( + (_keyword = _PyPegen_expect_token(p, 513)) // token='import' + && + (a = dotted_as_names_rule(p)) // dotted_as_names + ) + { + D(fprintf(stderr, "%*c+ import_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import' dotted_as_names")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Import ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_name[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'import' dotted_as_names")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_from: +// | 'from' (('.' | '...'))* dotted_name 'import' import_from_targets +// | 'from' (('.' | '...'))+ 'import' import_from_targets +static stmt_ty +import_from_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'from' (('.' | '...'))* dotted_name 'import' import_from_targets + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' (('.' | '...'))* dotted_name 'import' import_from_targets")); + Token * _keyword; + Token * _keyword_1; + asdl_seq * a; + expr_ty b; + asdl_seq* c; + if ( + (_keyword = _PyPegen_expect_token(p, 514)) // token='from' + && + (a = _loop0_31_rule(p)) // (('.' | '...'))* + && + (b = dotted_name_rule(p)) // dotted_name + && + (_keyword_1 = _PyPegen_expect_token(p, 513)) // token='import' + && + (c = import_from_targets_rule(p)) // import_from_targets + ) + { + D(fprintf(stderr, "%*c+ import_from[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' (('.' | '...'))* dotted_name 'import' import_from_targets")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ImportFrom ( b -> v . Name . id , c , _PyPegen_seq_count_dots ( a ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from' (('.' | '...'))* dotted_name 'import' import_from_targets")); + } + { // 'from' (('.' | '...'))+ 'import' import_from_targets + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' (('.' | '...'))+ 'import' import_from_targets")); + Token * _keyword; + Token * _keyword_1; + asdl_seq * a; + asdl_seq* b; + if ( + (_keyword = _PyPegen_expect_token(p, 514)) // token='from' + && + (a = _loop1_32_rule(p)) // (('.' | '...'))+ + && + (_keyword_1 = _PyPegen_expect_token(p, 513)) // token='import' + && + (b = import_from_targets_rule(p)) // import_from_targets + ) + { + D(fprintf(stderr, "%*c+ import_from[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' (('.' | '...'))+ 'import' import_from_targets")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ImportFrom ( NULL , b , _PyPegen_seq_count_dots ( a ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from' (('.' | '...'))+ 'import' import_from_targets")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_from_targets: +// | '(' import_from_as_names ','? ')' +// | import_from_as_names !',' +// | '*' +// | invalid_import_from_targets +static asdl_seq* +import_from_targets_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // '(' import_from_as_names ','? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' import_from_as_names ','? ')'")); + Token * _literal; + Token * _literal_1; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq* a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = import_from_as_names_rule(p)) // import_from_as_names + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' import_from_as_names ','? ')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' import_from_as_names ','? ')'")); + } + { // import_from_as_names !',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_names !','")); + asdl_seq* import_from_as_names_var; + if ( + (import_from_as_names_var = import_from_as_names_rule(p)) // import_from_as_names + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 12) // token=',' + ) + { + D(fprintf(stderr, "%*c+ import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_names !','")); + _res = import_from_as_names_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_names !','")); + } + { // '*' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + ) + { + D(fprintf(stderr, "%*c+ import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); + _res = _PyPegen_singleton_seq ( p , CHECK ( _PyPegen_alias_for_star ( p ) ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'")); + } + { // invalid_import_from_targets + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_import_from_targets")); + void *invalid_import_from_targets_var; + if ( + (invalid_import_from_targets_var = invalid_import_from_targets_rule(p)) // invalid_import_from_targets + ) + { + D(fprintf(stderr, "%*c+ import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_import_from_targets")); + _res = invalid_import_from_targets_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_import_from_targets")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_from_as_names: ','.import_from_as_name+ +static asdl_seq* +import_from_as_names_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.import_from_as_name+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); + asdl_seq * a; + if ( + (a = _gather_33_rule(p)) // ','.import_from_as_name+ + ) + { + D(fprintf(stderr, "%*c+ import_from_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_as_names[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.import_from_as_name+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_from_as_name: NAME ['as' NAME] +static alias_ty +import_from_as_name_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + alias_ty _res = NULL; + int _mark = p->mark; + { // NAME ['as' NAME] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME ['as' NAME]")); + expr_ty a; + void *b; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (b = _tmp_35_rule(p), 1) // ['as' NAME] + ) + { + D(fprintf(stderr, "%*c+ import_from_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ['as' NAME]")); + _res = _Py_alias ( a -> v . Name . id , ( b ) ? ( ( expr_ty ) b ) -> v . Name . id : NULL , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_as_name[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME ['as' NAME]")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// dotted_as_names: ','.dotted_as_name+ +static asdl_seq* +dotted_as_names_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.dotted_as_name+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dotted_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); + asdl_seq * a; + if ( + (a = _gather_36_rule(p)) // ','.dotted_as_name+ + ) + { + D(fprintf(stderr, "%*c+ dotted_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dotted_as_names[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.dotted_as_name+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// dotted_as_name: dotted_name ['as' NAME] +static alias_ty +dotted_as_name_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + alias_ty _res = NULL; + int _mark = p->mark; + { // dotted_name ['as' NAME] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dotted_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name ['as' NAME]")); + expr_ty a; + void *b; + if ( + (a = dotted_name_rule(p)) // dotted_name + && + (b = _tmp_38_rule(p), 1) // ['as' NAME] + ) + { + D(fprintf(stderr, "%*c+ dotted_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name ['as' NAME]")); + _res = _Py_alias ( a -> v . Name . id , ( b ) ? ( ( expr_ty ) b ) -> v . Name . id : NULL , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dotted_as_name[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name ['as' NAME]")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// dotted_name: dotted_name '.' NAME | NAME +static expr_ty dotted_name_raw(Parser *); +static expr_ty +dotted_name_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, dotted_name_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_0 = _PyPegen_update_memo(p, _mark, dotted_name_type, _res); + if (tmpvar_0) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = dotted_name_raw(p); + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +dotted_name_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // dotted_name '.' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dotted_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name '.' NAME")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = dotted_name_rule(p)) // dotted_name + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ dotted_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name '.' NAME")); + _res = _PyPegen_join_names_with_dot ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dotted_name[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name '.' NAME")); + } + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dotted_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty name_var; + if ( + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ dotted_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = name_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dotted_name[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// if_stmt: +// | 'if' named_expression ':' block elif_stmt +// | 'if' named_expression ':' block else_block? +static stmt_ty +if_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'if' named_expression ':' block elif_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> if_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block elif_stmt")); + Token * _keyword; + Token * _literal; + expr_ty a; + asdl_seq* b; + stmt_ty c; + if ( + (_keyword = _PyPegen_expect_token(p, 510)) // token='if' + && + (a = named_expression_rule(p)) // named_expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (c = elif_stmt_rule(p)) // elif_stmt + ) + { + D(fprintf(stderr, "%*c+ if_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block elif_stmt")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_If ( a , b , CHECK ( _PyPegen_singleton_seq ( p , c ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s if_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' named_expression ':' block elif_stmt")); + } + { // 'if' named_expression ':' block else_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> if_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block else_block?")); + Token * _keyword; + Token * _literal; + expr_ty a; + asdl_seq* b; + void *c; + if ( + (_keyword = _PyPegen_expect_token(p, 510)) // token='if' + && + (a = named_expression_rule(p)) // named_expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (c = else_block_rule(p), 1) // else_block? + ) + { + D(fprintf(stderr, "%*c+ if_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block else_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_If ( a , b , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s if_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' named_expression ':' block else_block?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// elif_stmt: +// | 'elif' named_expression ':' block elif_stmt +// | 'elif' named_expression ':' block else_block? +static stmt_ty +elif_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'elif' named_expression ':' block elif_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> elif_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block elif_stmt")); + Token * _keyword; + Token * _literal; + expr_ty a; + asdl_seq* b; + stmt_ty c; + if ( + (_keyword = _PyPegen_expect_token(p, 515)) // token='elif' + && + (a = named_expression_rule(p)) // named_expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (c = elif_stmt_rule(p)) // elif_stmt + ) + { + D(fprintf(stderr, "%*c+ elif_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block elif_stmt")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_If ( a , b , CHECK ( _PyPegen_singleton_seq ( p , c ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s elif_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'elif' named_expression ':' block elif_stmt")); + } + { // 'elif' named_expression ':' block else_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> elif_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block else_block?")); + Token * _keyword; + Token * _literal; + expr_ty a; + asdl_seq* b; + void *c; + if ( + (_keyword = _PyPegen_expect_token(p, 515)) // token='elif' + && + (a = named_expression_rule(p)) // named_expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (c = else_block_rule(p), 1) // else_block? + ) + { + D(fprintf(stderr, "%*c+ elif_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block else_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_If ( a , b , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s elif_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'elif' named_expression ':' block else_block?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// else_block: 'else' ':' block +static asdl_seq* +else_block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // 'else' ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> else_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else' ':' block")); + Token * _keyword; + Token * _literal; + asdl_seq* b; + if ( + (_keyword = _PyPegen_expect_token(p, 516)) // token='else' + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ else_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else' ':' block")); + _res = b; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s else_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'else' ':' block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// while_stmt: 'while' named_expression ':' block else_block? +static stmt_ty +while_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'while' named_expression ':' block else_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> while_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'while' named_expression ':' block else_block?")); + Token * _keyword; + Token * _literal; + expr_ty a; + asdl_seq* b; + void *c; + if ( + (_keyword = _PyPegen_expect_token(p, 512)) // token='while' + && + (a = named_expression_rule(p)) // named_expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (c = else_block_rule(p), 1) // else_block? + ) + { + D(fprintf(stderr, "%*c+ while_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'while' named_expression ':' block else_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_While ( a , b , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s while_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'while' named_expression ':' block else_block?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// for_stmt: +// | 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? +// | ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? +// | invalid_for_target +static stmt_ty +for_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + int _cut_var = 0; + Token * _keyword; + Token * _keyword_1; + Token * _literal; + asdl_seq* b; + void *el; + expr_ty ex; + expr_ty t; + void *tc; + if ( + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + && + (t = star_targets_rule(p)) // star_targets + && + (_keyword_1 = _PyPegen_expect_token(p, 518)) // token='in' + && + (_cut_var = 1) + && + (ex = star_expressions_rule(p)) // star_expressions + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + (b = block_rule(p)) // block + && + (el = else_block_rule(p), 1) // else_block? + ) + { + D(fprintf(stderr, "%*c+ for_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_For ( t , ex , b , el , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + int _cut_var = 0; + Token * _keyword; + Token * _keyword_1; + Token * _literal; + Token * async_var; + asdl_seq* b; + void *el; + expr_ty ex; + expr_ty t; + void *tc; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + && + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + && + (t = star_targets_rule(p)) // star_targets + && + (_keyword_1 = _PyPegen_expect_token(p, 518)) // token='in' + && + (_cut_var = 1) + && + (ex = star_expressions_rule(p)) // star_expressions + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + (b = block_rule(p)) // block + && + (el = else_block_rule(p), 1) // else_block? + ) + { + D(fprintf(stderr, "%*c+ for_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "Async for loops are" , _Py_AsyncFor ( t , ex , b , el , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // invalid_for_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_for_target")); + void *invalid_for_target_var; + if ( + (invalid_for_target_var = invalid_for_target_rule(p)) // invalid_for_target + ) + { + D(fprintf(stderr, "%*c+ for_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_for_target")); + _res = invalid_for_target_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_for_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// with_stmt: +// | 'with' '(' ','.with_item+ ','? ')' ':' block +// | 'with' ','.with_item+ ':' TYPE_COMMENT? block +// | ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block +// | ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block +static stmt_ty +with_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'with' '(' ','.with_item+ ','? ')' ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' block")); + Token * _keyword; + Token * _literal; + Token * _literal_1; + Token * _literal_2; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + asdl_seq* b; + if ( + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = _gather_39_rule(p)) // ','.with_item+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_With ( a , b , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' block")); + } + { // 'with' ','.with_item+ ':' TYPE_COMMENT? block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with' ','.with_item+ ':' TYPE_COMMENT? block")); + Token * _keyword; + Token * _literal; + asdl_seq * a; + asdl_seq* b; + void *tc; + if ( + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (a = _gather_41_rule(p)) // ','.with_item+ + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with' ','.with_item+ ':' TYPE_COMMENT? block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_With ( a , b , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'with' ','.with_item+ ':' TYPE_COMMENT? block")); + } + { // ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block")); + Token * _keyword; + Token * _literal; + Token * _literal_1; + Token * _literal_2; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + Token * async_var; + asdl_seq* b; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + && + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = _gather_43_rule(p)) // ','.with_item+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "Async with statements are" , _Py_AsyncWith ( a , b , NULL , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block")); + } + { // ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block")); + Token * _keyword; + Token * _literal; + asdl_seq * a; + Token * async_var; + asdl_seq* b; + void *tc; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + && + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (a = _gather_45_rule(p)) // ','.with_item+ + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "Async with statements are" , _Py_AsyncWith ( a , b , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// with_item: expression 'as' target &(',' | ')' | ':') | invalid_with_item | expression +static withitem_ty +with_item_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + withitem_ty _res = NULL; + int _mark = p->mark; + { // expression 'as' target &(',' | ')' | ':') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression 'as' target &(',' | ')' | ':')")); + Token * _keyword; + expr_ty e; + expr_ty t; + if ( + (e = expression_rule(p)) // expression + && + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (t = target_rule(p)) // target + && + _PyPegen_lookahead(1, _tmp_47_rule, p) + ) + { + D(fprintf(stderr, "%*c+ with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' target &(',' | ')' | ':')")); + _res = _Py_withitem ( e , t , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_item[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression 'as' target &(',' | ')' | ':')")); + } + { // invalid_with_item + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_with_item")); + void *invalid_with_item_var; + if ( + (invalid_with_item_var = invalid_with_item_rule(p)) // invalid_with_item + ) + { + D(fprintf(stderr, "%*c+ with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_with_item")); + _res = invalid_with_item_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_item[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_with_item")); + } + { // expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression")); + expr_ty e; + if ( + (e = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression")); + _res = _Py_withitem ( e , NULL , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_item[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// try_stmt: +// | 'try' ':' block finally_block +// | 'try' ':' block except_block+ else_block? finally_block? +static stmt_ty +try_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'try' ':' block finally_block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' ':' block finally_block")); + Token * _keyword; + Token * _literal; + asdl_seq* b; + asdl_seq* f; + if ( + (_keyword = _PyPegen_expect_token(p, 511)) // token='try' + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (f = finally_block_rule(p)) // finally_block + ) + { + D(fprintf(stderr, "%*c+ try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block finally_block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Try ( b , NULL , NULL , f , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s try_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'try' ':' block finally_block")); + } + { // 'try' ':' block except_block+ else_block? finally_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' ':' block except_block+ else_block? finally_block?")); + Token * _keyword; + Token * _literal; + asdl_seq* b; + void *el; + asdl_seq * ex; + void *f; + if ( + (_keyword = _PyPegen_expect_token(p, 511)) // token='try' + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (ex = _loop1_48_rule(p)) // except_block+ + && + (el = else_block_rule(p), 1) // else_block? + && + (f = finally_block_rule(p), 1) // finally_block? + ) + { + D(fprintf(stderr, "%*c+ try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block except_block+ else_block? finally_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Try ( b , ex , el , f , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s try_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'try' ':' block except_block+ else_block? finally_block?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// except_block: 'except' expression ['as' NAME] ':' block | 'except' ':' block +static excepthandler_ty +except_block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + excepthandler_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'except' expression ['as' NAME] ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] ':' block")); + Token * _keyword; + Token * _literal; + asdl_seq* b; + expr_ty e; + void *t; + if ( + (_keyword = _PyPegen_expect_token(p, 521)) // token='except' + && + (e = expression_rule(p)) // expression + && + (t = _tmp_49_rule(p), 1) // ['as' NAME] + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] ':' block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ExceptHandler ( e , ( t ) ? ( ( expr_ty ) t ) -> v . Name . id : NULL , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s except_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ['as' NAME] ':' block")); + } + { // 'except' ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' ':' block")); + Token * _keyword; + Token * _literal; + asdl_seq* b; + if ( + (_keyword = _PyPegen_expect_token(p, 521)) // token='except' + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' ':' block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ExceptHandler ( NULL , NULL , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s except_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' ':' block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// finally_block: 'finally' ':' block +static asdl_seq* +finally_block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // 'finally' ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> finally_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally' ':' block")); + Token * _keyword; + Token * _literal; + asdl_seq* a; + if ( + (_keyword = _PyPegen_expect_token(p, 522)) // token='finally' + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (a = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ finally_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally' ':' block")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s finally_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'finally' ':' block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// return_stmt: 'return' star_expressions? +static stmt_ty +return_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'return' star_expressions? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> return_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'return' star_expressions?")); + Token * _keyword; + void *a; + if ( + (_keyword = _PyPegen_expect_token(p, 500)) // token='return' + && + (a = star_expressions_rule(p), 1) // star_expressions? + ) + { + D(fprintf(stderr, "%*c+ return_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'return' star_expressions?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Return ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s return_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'return' star_expressions?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// raise_stmt: 'raise' expression ['from' expression] | 'raise' +static stmt_ty +raise_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'raise' expression ['from' expression] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> raise_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'raise' expression ['from' expression]")); + Token * _keyword; + expr_ty a; + void *b; + if ( + (_keyword = _PyPegen_expect_token(p, 501)) // token='raise' + && + (a = expression_rule(p)) // expression + && + (b = _tmp_50_rule(p), 1) // ['from' expression] + ) + { + D(fprintf(stderr, "%*c+ raise_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'raise' expression ['from' expression]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Raise ( a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s raise_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'raise' expression ['from' expression]")); + } + { // 'raise' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> raise_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'raise'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 501)) // token='raise' + ) + { + D(fprintf(stderr, "%*c+ raise_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'raise'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Raise ( NULL , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s raise_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'raise'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// function_def: decorators function_def_raw | function_def_raw +static stmt_ty +function_def_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + { // decorators function_def_raw + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> function_def[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "decorators function_def_raw")); + asdl_seq* d; + stmt_ty f; + if ( + (d = decorators_rule(p)) // decorators + && + (f = function_def_raw_rule(p)) // function_def_raw + ) + { + D(fprintf(stderr, "%*c+ function_def[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "decorators function_def_raw")); + _res = _PyPegen_function_def_decorators ( p , d , f ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s function_def[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "decorators function_def_raw")); + } + { // function_def_raw + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> function_def[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "function_def_raw")); + stmt_ty function_def_raw_var; + if ( + (function_def_raw_var = function_def_raw_rule(p)) // function_def_raw + ) + { + D(fprintf(stderr, "%*c+ function_def[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "function_def_raw")); + _res = function_def_raw_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s function_def[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "function_def_raw")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// function_def_raw: +// | 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block +// | ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block +static stmt_ty +function_def_raw_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> function_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + Token * _keyword; + Token * _literal; + Token * _literal_1; + Token * _literal_2; + void *a; + asdl_seq* b; + expr_ty n; + void *params; + void *tc; + if ( + (_keyword = _PyPegen_expect_token(p, 523)) // token='def' + && + (n = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (params = params_rule(p), 1) // params? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (a = _tmp_51_rule(p), 1) // ['->' expression] + && + (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = func_type_comment_rule(p), 1) // func_type_comment? + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ function_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_FunctionDef ( n -> v . Name . id , ( params ) ? params : CHECK ( _PyPegen_empty_arguments ( p ) ) , b , NULL , a , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s function_def_raw[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + } + { // ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> function_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + Token * _keyword; + Token * _literal; + Token * _literal_1; + Token * _literal_2; + void *a; + Token * async_var; + asdl_seq* b; + expr_ty n; + void *params; + void *tc; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + && + (_keyword = _PyPegen_expect_token(p, 523)) // token='def' + && + (n = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (params = params_rule(p), 1) // params? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (a = _tmp_52_rule(p), 1) // ['->' expression] + && + (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = func_type_comment_rule(p), 1) // func_type_comment? + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ function_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "Async functions are" , _Py_AsyncFunctionDef ( n -> v . Name . id , ( params ) ? params : CHECK ( _PyPegen_empty_arguments ( p ) ) , b , NULL , a , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s function_def_raw[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// func_type_comment: +// | NEWLINE TYPE_COMMENT &(NEWLINE INDENT) +// | invalid_double_type_comments +// | TYPE_COMMENT +static Token* +func_type_comment_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + Token* _res = NULL; + int _mark = p->mark; + { // NEWLINE TYPE_COMMENT &(NEWLINE INDENT) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> func_type_comment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE TYPE_COMMENT &(NEWLINE INDENT)")); + Token * newline_var; + Token * t; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + (t = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' + && + _PyPegen_lookahead(1, _tmp_53_rule, p) + ) + { + D(fprintf(stderr, "%*c+ func_type_comment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE TYPE_COMMENT &(NEWLINE INDENT)")); + _res = t; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s func_type_comment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE TYPE_COMMENT &(NEWLINE INDENT)")); + } + { // invalid_double_type_comments + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> func_type_comment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_double_type_comments")); + void *invalid_double_type_comments_var; + if ( + (invalid_double_type_comments_var = invalid_double_type_comments_rule(p)) // invalid_double_type_comments + ) + { + D(fprintf(stderr, "%*c+ func_type_comment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_double_type_comments")); + _res = invalid_double_type_comments_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s func_type_comment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_double_type_comments")); + } + { // TYPE_COMMENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> func_type_comment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "TYPE_COMMENT")); + Token * type_comment_var; + if ( + (type_comment_var = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' + ) + { + D(fprintf(stderr, "%*c+ func_type_comment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "TYPE_COMMENT")); + _res = type_comment_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s func_type_comment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "TYPE_COMMENT")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// params: invalid_parameters | parameters +static arguments_ty +params_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arguments_ty _res = NULL; + int _mark = p->mark; + { // invalid_parameters + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> params[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_parameters")); + void *invalid_parameters_var; + if ( + (invalid_parameters_var = invalid_parameters_rule(p)) // invalid_parameters + ) + { + D(fprintf(stderr, "%*c+ params[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_parameters")); + _res = invalid_parameters_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s params[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_parameters")); + } + { // parameters + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> params[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "parameters")); + arguments_ty parameters_var; + if ( + (parameters_var = parameters_rule(p)) // parameters + ) + { + D(fprintf(stderr, "%*c+ params[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "parameters")); + _res = parameters_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s params[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "parameters")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// parameters: +// | slash_no_default param_no_default* param_with_default* star_etc? +// | slash_with_default param_with_default* star_etc? +// | param_no_default+ param_with_default* star_etc? +// | param_with_default+ star_etc? +// | star_etc +static arguments_ty +parameters_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arguments_ty _res = NULL; + int _mark = p->mark; + { // slash_no_default param_no_default* param_with_default* star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default param_no_default* param_with_default* star_etc?")); + asdl_seq* a; + asdl_seq * b; + asdl_seq * c; + void *d; + if ( + (a = slash_no_default_rule(p)) // slash_no_default + && + (b = _loop0_54_rule(p)) // param_no_default* + && + (c = _loop0_55_rule(p)) // param_with_default* + && + (d = star_etc_rule(p), 1) // star_etc? + ) + { + D(fprintf(stderr, "%*c+ parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default param_no_default* param_with_default* star_etc?")); + _res = _PyPegen_make_arguments ( p , a , NULL , b , c , d ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_no_default param_no_default* param_with_default* star_etc?")); + } + { // slash_with_default param_with_default* star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default param_with_default* star_etc?")); + SlashWithDefault* a; + asdl_seq * b; + void *c; + if ( + (a = slash_with_default_rule(p)) // slash_with_default + && + (b = _loop0_56_rule(p)) // param_with_default* + && + (c = star_etc_rule(p), 1) // star_etc? + ) + { + D(fprintf(stderr, "%*c+ parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default param_with_default* star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , a , NULL , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default param_with_default* star_etc?")); + } + { // param_no_default+ param_with_default* star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default+ param_with_default* star_etc?")); + asdl_seq * a; + asdl_seq * b; + void *c; + if ( + (a = _loop1_57_rule(p)) // param_no_default+ + && + (b = _loop0_58_rule(p)) // param_with_default* + && + (c = star_etc_rule(p), 1) // star_etc? + ) + { + D(fprintf(stderr, "%*c+ parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default+ param_with_default* star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , a , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default+ param_with_default* star_etc?")); + } + { // param_with_default+ star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+ star_etc?")); + asdl_seq * a; + void *b; + if ( + (a = _loop1_59_rule(p)) // param_with_default+ + && + (b = star_etc_rule(p), 1) // star_etc? + ) + { + D(fprintf(stderr, "%*c+ parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+ star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , NULL , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default+ star_etc?")); + } + { // star_etc + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_etc")); + StarEtc* a; + if ( + (a = star_etc_rule(p)) // star_etc + ) + { + D(fprintf(stderr, "%*c+ parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_etc")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , NULL , NULL , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_etc")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// slash_no_default: param_no_default+ '/' ',' | param_no_default+ '/' &')' +static asdl_seq* +slash_no_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // param_no_default+ '/' ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default+ '/' ','")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + if ( + (a = _loop1_60_rule(p)) // param_no_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ slash_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default+ '/' ','")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slash_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default+ '/' ','")); + } + { // param_no_default+ '/' &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default+ '/' &')'")); + Token * _literal; + asdl_seq * a; + if ( + (a = _loop1_61_rule(p)) // param_no_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ slash_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default+ '/' &')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slash_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default+ '/' &')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// slash_with_default: +// | param_no_default* param_with_default+ '/' ',' +// | param_no_default* param_with_default+ '/' &')' +static SlashWithDefault* +slash_with_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + SlashWithDefault* _res = NULL; + int _mark = p->mark; + { // param_no_default* param_with_default+ '/' ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slash_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* param_with_default+ '/' ','")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + asdl_seq * b; + if ( + (a = _loop0_62_rule(p)) // param_no_default* + && + (b = _loop1_63_rule(p)) // param_with_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default* param_with_default+ '/' ','")); + _res = _PyPegen_slash_with_default ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slash_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default* param_with_default+ '/' ','")); + } + { // param_no_default* param_with_default+ '/' &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slash_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* param_with_default+ '/' &')'")); + Token * _literal; + asdl_seq * a; + asdl_seq * b; + if ( + (a = _loop0_64_rule(p)) // param_no_default* + && + (b = _loop1_65_rule(p)) // param_with_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default* param_with_default+ '/' &')'")); + _res = _PyPegen_slash_with_default ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slash_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default* param_with_default+ '/' &')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_etc: +// | '*' param_no_default param_maybe_default* kwds? +// | '*' ',' param_maybe_default+ kwds? +// | kwds +// | invalid_star_etc +static StarEtc* +star_etc_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + StarEtc* _res = NULL; + int _mark = p->mark; + { // '*' param_no_default param_maybe_default* kwds? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' param_no_default param_maybe_default* kwds?")); + Token * _literal; + arg_ty a; + asdl_seq * b; + void *c; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = param_no_default_rule(p)) // param_no_default + && + (b = _loop0_66_rule(p)) // param_maybe_default* + && + (c = kwds_rule(p), 1) // kwds? + ) + { + D(fprintf(stderr, "%*c+ star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' param_no_default param_maybe_default* kwds?")); + _res = _PyPegen_star_etc ( p , a , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' param_no_default param_maybe_default* kwds?")); + } + { // '*' ',' param_maybe_default+ kwds? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' ',' param_maybe_default+ kwds?")); + Token * _literal; + Token * _literal_1; + asdl_seq * b; + void *c; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + && + (b = _loop1_67_rule(p)) // param_maybe_default+ + && + (c = kwds_rule(p), 1) // kwds? + ) + { + D(fprintf(stderr, "%*c+ star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' ',' param_maybe_default+ kwds?")); + _res = _PyPegen_star_etc ( p , NULL , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' ',' param_maybe_default+ kwds?")); + } + { // kwds + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwds")); + arg_ty a; + if ( + (a = kwds_rule(p)) // kwds + ) + { + D(fprintf(stderr, "%*c+ star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwds")); + _res = _PyPegen_star_etc ( p , NULL , NULL , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwds")); + } + { // invalid_star_etc + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_star_etc")); + void *invalid_star_etc_var; + if ( + (invalid_star_etc_var = invalid_star_etc_rule(p)) // invalid_star_etc + ) + { + D(fprintf(stderr, "%*c+ star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_star_etc")); + _res = invalid_star_etc_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_star_etc")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// kwds: '**' param_no_default +static arg_ty +kwds_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + { // '**' param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwds[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' param_no_default")); + Token * _literal; + arg_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (a = param_no_default_rule(p)) // param_no_default + ) + { + D(fprintf(stderr, "%*c+ kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' param_no_default")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwds[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' param_no_default")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// param_no_default: param ',' TYPE_COMMENT? | param TYPE_COMMENT? &')' +static arg_ty +param_no_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + { // param ',' TYPE_COMMENT? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param ',' TYPE_COMMENT?")); + Token * _literal; + arg_ty a; + void *tc; + if ( + (a = param_rule(p)) // param + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + ) + { + D(fprintf(stderr, "%*c+ param_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param ',' TYPE_COMMENT?")); + _res = _PyPegen_add_type_comment_to_arg ( p , a , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param ',' TYPE_COMMENT?")); + } + { // param TYPE_COMMENT? &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param TYPE_COMMENT? &')'")); + arg_ty a; + void *tc; + if ( + (a = param_rule(p)) // param + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ param_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param TYPE_COMMENT? &')'")); + _res = _PyPegen_add_type_comment_to_arg ( p , a , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param TYPE_COMMENT? &')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// param_with_default: param default ',' TYPE_COMMENT? | param default TYPE_COMMENT? &')' +static NameDefaultPair* +param_with_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + NameDefaultPair* _res = NULL; + int _mark = p->mark; + { // param default ',' TYPE_COMMENT? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param default ',' TYPE_COMMENT?")); + Token * _literal; + arg_ty a; + expr_ty c; + void *tc; + if ( + (a = param_rule(p)) // param + && + (c = default_rule(p)) // default + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + ) + { + D(fprintf(stderr, "%*c+ param_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param default ',' TYPE_COMMENT?")); + _res = _PyPegen_name_default_pair ( p , a , c , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param default ',' TYPE_COMMENT?")); + } + { // param default TYPE_COMMENT? &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param default TYPE_COMMENT? &')'")); + arg_ty a; + expr_ty c; + void *tc; + if ( + (a = param_rule(p)) // param + && + (c = default_rule(p)) // default + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ param_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param default TYPE_COMMENT? &')'")); + _res = _PyPegen_name_default_pair ( p , a , c , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param default TYPE_COMMENT? &')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// param_maybe_default: +// | param default? ',' TYPE_COMMENT? +// | param default? TYPE_COMMENT? &')' +static NameDefaultPair* +param_maybe_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + NameDefaultPair* _res = NULL; + int _mark = p->mark; + { // param default? ',' TYPE_COMMENT? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_maybe_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param default? ',' TYPE_COMMENT?")); + Token * _literal; + arg_ty a; + void *c; + void *tc; + if ( + (a = param_rule(p)) // param + && + (c = default_rule(p), 1) // default? + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + ) + { + D(fprintf(stderr, "%*c+ param_maybe_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param default? ',' TYPE_COMMENT?")); + _res = _PyPegen_name_default_pair ( p , a , c , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_maybe_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param default? ',' TYPE_COMMENT?")); + } + { // param default? TYPE_COMMENT? &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_maybe_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param default? TYPE_COMMENT? &')'")); + arg_ty a; + void *c; + void *tc; + if ( + (a = param_rule(p)) // param + && + (c = default_rule(p), 1) // default? + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ param_maybe_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param default? TYPE_COMMENT? &')'")); + _res = _PyPegen_name_default_pair ( p , a , c , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_maybe_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param default? TYPE_COMMENT? &')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// param: NAME annotation? +static arg_ty +param_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME annotation? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME annotation?")); + expr_ty a; + void *b; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (b = annotation_rule(p), 1) // annotation? + ) + { + D(fprintf(stderr, "%*c+ param[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME annotation?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_arg ( a -> v . Name . id , b , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME annotation?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// annotation: ':' expression +static expr_ty +annotation_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> annotation[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ annotation[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s annotation[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// default: '=' expression +static expr_ty +default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // '=' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' expression")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// decorators: (('@' named_expression NEWLINE))+ +static asdl_seq* +decorators_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // (('@' named_expression NEWLINE))+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> decorators[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); + asdl_seq * a; + if ( + (a = _loop1_68_rule(p)) // (('@' named_expression NEWLINE))+ + ) + { + D(fprintf(stderr, "%*c+ decorators[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s decorators[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(('@' named_expression NEWLINE))+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// class_def: decorators class_def_raw | class_def_raw +static stmt_ty +class_def_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + { // decorators class_def_raw + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> class_def[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "decorators class_def_raw")); + asdl_seq* a; + stmt_ty b; + if ( + (a = decorators_rule(p)) // decorators + && + (b = class_def_raw_rule(p)) // class_def_raw + ) + { + D(fprintf(stderr, "%*c+ class_def[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "decorators class_def_raw")); + _res = _PyPegen_class_def_decorators ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s class_def[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "decorators class_def_raw")); + } + { // class_def_raw + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> class_def[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "class_def_raw")); + stmt_ty class_def_raw_var; + if ( + (class_def_raw_var = class_def_raw_rule(p)) // class_def_raw + ) + { + D(fprintf(stderr, "%*c+ class_def[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "class_def_raw")); + _res = class_def_raw_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s class_def[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "class_def_raw")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// class_def_raw: 'class' NAME ['(' arguments? ')'] ':' block +static stmt_ty +class_def_raw_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'class' NAME ['(' arguments? ')'] ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> class_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class' NAME ['(' arguments? ')'] ':' block")); + Token * _keyword; + Token * _literal; + expr_ty a; + void *b; + asdl_seq* c; + if ( + (_keyword = _PyPegen_expect_token(p, 524)) // token='class' + && + (a = _PyPegen_name_token(p)) // NAME + && + (b = _tmp_69_rule(p), 1) // ['(' arguments? ')'] + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (c = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ class_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class' NAME ['(' arguments? ')'] ':' block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ClassDef ( a -> v . Name . id , ( b ) ? ( ( expr_ty ) b ) -> v . Call . args : NULL , ( b ) ? ( ( expr_ty ) b ) -> v . Call . keywords : NULL , c , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s class_def_raw[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'class' NAME ['(' arguments? ')'] ':' block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// block: NEWLINE INDENT statements DEDENT | simple_stmt | invalid_block +static asdl_seq* +block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + if (_PyPegen_is_memoized(p, block_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + { // NEWLINE INDENT statements DEDENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT statements DEDENT")); + asdl_seq* a; + Token * dedent_var; + Token * indent_var; + Token * newline_var; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' + && + (a = statements_rule(p)) // statements + && + (dedent_var = _PyPegen_expect_token(p, DEDENT)) // token='DEDENT' + ) + { + D(fprintf(stderr, "%*c+ block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT statements DEDENT")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE INDENT statements DEDENT")); + } + { // simple_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + asdl_seq* simple_stmt_var; + if ( + (simple_stmt_var = simple_stmt_rule(p)) // simple_stmt + ) + { + D(fprintf(stderr, "%*c+ block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + _res = simple_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt")); + } + { // invalid_block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_block")); + void *invalid_block_var; + if ( + (invalid_block_var = invalid_block_rule(p)) // invalid_block + ) + { + D(fprintf(stderr, "%*c+ block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_block")); + _res = invalid_block_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_block")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, block_type, _res); + D(p->level--); + return _res; +} + +// expressions_list: ','.star_expression+ ','? +static asdl_seq* +expressions_list_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.star_expression+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expressions_list[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.star_expression+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_70_rule(p)) // ','.star_expression+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ expressions_list[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.star_expression+ ','?")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expressions_list[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.star_expression+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_expressions: +// | star_expression ((',' star_expression))+ ','? +// | star_expression ',' +// | star_expression +static expr_ty +star_expressions_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // star_expression ((',' star_expression))+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expression ((',' star_expression))+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + asdl_seq * b; + if ( + (a = star_expression_rule(p)) // star_expression + && + (b = _loop1_72_rule(p)) // ((',' star_expression))+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ star_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expression ((',' star_expression))+ ','?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expression ((',' star_expression))+ ','?")); + } + { // star_expression ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expression ','")); + Token * _literal; + expr_ty a; + if ( + (a = star_expression_rule(p)) // star_expression + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ star_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expression ','")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( CHECK ( _PyPegen_singleton_seq ( p , a ) ) , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expression ','")); + } + { // star_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expression")); + expr_ty star_expression_var; + if ( + (star_expression_var = star_expression_rule(p)) // star_expression + ) + { + D(fprintf(stderr, "%*c+ star_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expression")); + _res = star_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_expression: '*' bitwise_or | expression +static expr_ty +star_expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, star_expression_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '*' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ star_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' bitwise_or")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Starred ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' bitwise_or")); + } + { // expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression")); + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ star_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression")); + _res = expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, star_expression_type, _res); + D(p->level--); + return _res; +} + +// star_named_expressions: ','.star_named_expression+ ','? +static asdl_seq* +star_named_expressions_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.star_named_expression+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_named_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.star_named_expression+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_73_rule(p)) // ','.star_named_expression+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ star_named_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.star_named_expression+ ','?")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_named_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.star_named_expression+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_named_expression: '*' bitwise_or | named_expression +static expr_ty +star_named_expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '*' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ star_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' bitwise_or")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Starred ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' bitwise_or")); + } + { // named_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); + expr_ty named_expression_var; + if ( + (named_expression_var = named_expression_rule(p)) // named_expression + ) + { + D(fprintf(stderr, "%*c+ star_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); + _res = named_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// named_expression: NAME ':=' ~ expression | expression !':=' | invalid_named_expression +static expr_ty +named_expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME ':=' ~ expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME ':=' ~ expression")); + int _cut_var = 0; + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 53)) // token=':=' + && + (_cut_var = 1) + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ':=' ~ expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_NamedExpr ( CHECK ( _PyPegen_set_expr_context ( p , a , Store ) ) , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME ':=' ~ expression")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // expression !':=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':=' + ) + { + D(fprintf(stderr, "%*c+ named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); + _res = expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); + } + { // invalid_named_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_named_expression")); + void *invalid_named_expression_var; + if ( + (invalid_named_expression_var = invalid_named_expression_rule(p)) // invalid_named_expression + ) + { + D(fprintf(stderr, "%*c+ named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_named_expression")); + _res = invalid_named_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_named_expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// annotated_rhs: yield_expr | star_expressions +static expr_ty +annotated_rhs_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> annotated_rhs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ annotated_rhs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s annotated_rhs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> annotated_rhs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ annotated_rhs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s annotated_rhs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// expressions: expression ((',' expression))+ ','? | expression ',' | expression +static expr_ty +expressions_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // expression ((',' expression))+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ((',' expression))+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + asdl_seq * b; + if ( + (a = expression_rule(p)) // expression + && + (b = _loop1_75_rule(p)) // ((',' expression))+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ((',' expression))+ ','?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ((',' expression))+ ','?")); + } + { // expression ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ','")); + Token * _literal; + expr_ty a; + if ( + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ','")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( CHECK ( _PyPegen_singleton_seq ( p , a ) ) , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ','")); + } + { // expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression")); + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression")); + _res = expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// expression: disjunction 'if' disjunction 'else' expression | disjunction | lambdef +static expr_ty +expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, expression_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // disjunction 'if' disjunction 'else' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "disjunction 'if' disjunction 'else' expression")); + Token * _keyword; + Token * _keyword_1; + expr_ty a; + expr_ty b; + expr_ty c; + if ( + (a = disjunction_rule(p)) // disjunction + && + (_keyword = _PyPegen_expect_token(p, 510)) // token='if' + && + (b = disjunction_rule(p)) // disjunction + && + (_keyword_1 = _PyPegen_expect_token(p, 516)) // token='else' + && + (c = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "disjunction 'if' disjunction 'else' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_IfExp ( b , a , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "disjunction 'if' disjunction 'else' expression")); + } + { // disjunction + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "disjunction")); + expr_ty disjunction_var; + if ( + (disjunction_var = disjunction_rule(p)) // disjunction + ) + { + D(fprintf(stderr, "%*c+ expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "disjunction")); + _res = disjunction_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "disjunction")); + } + { // lambdef + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambdef")); + expr_ty lambdef_var; + if ( + (lambdef_var = lambdef_rule(p)) // lambdef + ) + { + D(fprintf(stderr, "%*c+ expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambdef")); + _res = lambdef_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambdef")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, expression_type, _res); + D(p->level--); + return _res; +} + +// lambdef: 'lambda' lambda_params? ':' expression +static expr_ty +lambdef_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'lambda' lambda_params? ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambdef[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' expression")); + Token * _keyword; + Token * _literal; + void *a; + expr_ty b; + if ( + (_keyword = _PyPegen_expect_token(p, 525)) // token='lambda' + && + (a = lambda_params_rule(p), 1) // lambda_params? + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ lambdef[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Lambda ( ( a ) ? a : CHECK ( _PyPegen_empty_arguments ( p ) ) , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambdef[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'lambda' lambda_params? ':' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_params: invalid_lambda_parameters | lambda_parameters +static arguments_ty +lambda_params_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arguments_ty _res = NULL; + int _mark = p->mark; + { // invalid_lambda_parameters + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_params[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_lambda_parameters")); + void *invalid_lambda_parameters_var; + if ( + (invalid_lambda_parameters_var = invalid_lambda_parameters_rule(p)) // invalid_lambda_parameters + ) + { + D(fprintf(stderr, "%*c+ lambda_params[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_lambda_parameters")); + _res = invalid_lambda_parameters_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_params[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_lambda_parameters")); + } + { // lambda_parameters + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_params[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_parameters")); + arguments_ty lambda_parameters_var; + if ( + (lambda_parameters_var = lambda_parameters_rule(p)) // lambda_parameters + ) + { + D(fprintf(stderr, "%*c+ lambda_params[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_parameters")); + _res = lambda_parameters_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_params[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_parameters")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_parameters: +// | lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* lambda_star_etc? +// | lambda_slash_with_default lambda_param_with_default* lambda_star_etc? +// | lambda_param_no_default+ lambda_param_with_default* lambda_star_etc? +// | lambda_param_with_default+ lambda_star_etc? +// | lambda_star_etc +static arguments_ty +lambda_parameters_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arguments_ty _res = NULL; + int _mark = p->mark; + { // lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* lambda_star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* lambda_star_etc?")); + asdl_seq* a; + asdl_seq * b; + asdl_seq * c; + void *d; + if ( + (a = lambda_slash_no_default_rule(p)) // lambda_slash_no_default + && + (b = _loop0_76_rule(p)) // lambda_param_no_default* + && + (c = _loop0_77_rule(p)) // lambda_param_with_default* + && + (d = lambda_star_etc_rule(p), 1) // lambda_star_etc? + ) + { + D(fprintf(stderr, "%*c+ lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* lambda_star_etc?")); + _res = _PyPegen_make_arguments ( p , a , NULL , b , c , d ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* lambda_star_etc?")); + } + { // lambda_slash_with_default lambda_param_with_default* lambda_star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default lambda_param_with_default* lambda_star_etc?")); + SlashWithDefault* a; + asdl_seq * b; + void *c; + if ( + (a = lambda_slash_with_default_rule(p)) // lambda_slash_with_default + && + (b = _loop0_78_rule(p)) // lambda_param_with_default* + && + (c = lambda_star_etc_rule(p), 1) // lambda_star_etc? + ) + { + D(fprintf(stderr, "%*c+ lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default lambda_param_with_default* lambda_star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , a , NULL , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default lambda_param_with_default* lambda_star_etc?")); + } + { // lambda_param_no_default+ lambda_param_with_default* lambda_star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ lambda_param_with_default* lambda_star_etc?")); + asdl_seq * a; + asdl_seq * b; + void *c; + if ( + (a = _loop1_79_rule(p)) // lambda_param_no_default+ + && + (b = _loop0_80_rule(p)) // lambda_param_with_default* + && + (c = lambda_star_etc_rule(p), 1) // lambda_star_etc? + ) + { + D(fprintf(stderr, "%*c+ lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ lambda_param_with_default* lambda_star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , a , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default+ lambda_param_with_default* lambda_star_etc?")); + } + { // lambda_param_with_default+ lambda_star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+ lambda_star_etc?")); + asdl_seq * a; + void *b; + if ( + (a = _loop1_81_rule(p)) // lambda_param_with_default+ + && + (b = lambda_star_etc_rule(p), 1) // lambda_star_etc? + ) + { + D(fprintf(stderr, "%*c+ lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+ lambda_star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , NULL , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default+ lambda_star_etc?")); + } + { // lambda_star_etc + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_star_etc")); + StarEtc* a; + if ( + (a = lambda_star_etc_rule(p)) // lambda_star_etc + ) + { + D(fprintf(stderr, "%*c+ lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_star_etc")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , NULL , NULL , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_star_etc")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_slash_no_default: +// | lambda_param_no_default+ '/' ',' +// | lambda_param_no_default+ '/' &':' +static asdl_seq* +lambda_slash_no_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // lambda_param_no_default+ '/' ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ '/' ','")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + if ( + (a = _loop1_82_rule(p)) // lambda_param_no_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ lambda_slash_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ '/' ','")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_slash_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default+ '/' ','")); + } + { // lambda_param_no_default+ '/' &':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ '/' &':'")); + Token * _literal; + asdl_seq * a; + if ( + (a = _loop1_83_rule(p)) // lambda_param_no_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 11) // token=':' + ) + { + D(fprintf(stderr, "%*c+ lambda_slash_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ '/' &':'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_slash_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default+ '/' &':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_slash_with_default: +// | lambda_param_no_default* lambda_param_with_default+ '/' ',' +// | lambda_param_no_default* lambda_param_with_default+ '/' &':' +static SlashWithDefault* +lambda_slash_with_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + SlashWithDefault* _res = NULL; + int _mark = p->mark; + { // lambda_param_no_default* lambda_param_with_default+ '/' ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_slash_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' ','")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + asdl_seq * b; + if ( + (a = _loop0_84_rule(p)) // lambda_param_no_default* + && + (b = _loop1_85_rule(p)) // lambda_param_with_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ lambda_slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' ','")); + _res = _PyPegen_slash_with_default ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_slash_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' ','")); + } + { // lambda_param_no_default* lambda_param_with_default+ '/' &':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_slash_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' &':'")); + Token * _literal; + asdl_seq * a; + asdl_seq * b; + if ( + (a = _loop0_86_rule(p)) // lambda_param_no_default* + && + (b = _loop1_87_rule(p)) // lambda_param_with_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 11) // token=':' + ) + { + D(fprintf(stderr, "%*c+ lambda_slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' &':'")); + _res = _PyPegen_slash_with_default ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_slash_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' &':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_star_etc: +// | '*' lambda_param_no_default lambda_param_maybe_default* lambda_kwds? +// | '*' ',' lambda_param_maybe_default+ lambda_kwds? +// | lambda_kwds +// | invalid_lambda_star_etc +static StarEtc* +lambda_star_etc_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + StarEtc* _res = NULL; + int _mark = p->mark; + { // '*' lambda_param_no_default lambda_param_maybe_default* lambda_kwds? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' lambda_param_no_default lambda_param_maybe_default* lambda_kwds?")); + Token * _literal; + arg_ty a; + asdl_seq * b; + void *c; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = lambda_param_no_default_rule(p)) // lambda_param_no_default + && + (b = _loop0_88_rule(p)) // lambda_param_maybe_default* + && + (c = lambda_kwds_rule(p), 1) // lambda_kwds? + ) + { + D(fprintf(stderr, "%*c+ lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' lambda_param_no_default lambda_param_maybe_default* lambda_kwds?")); + _res = _PyPegen_star_etc ( p , a , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' lambda_param_no_default lambda_param_maybe_default* lambda_kwds?")); + } + { // '*' ',' lambda_param_maybe_default+ lambda_kwds? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' ',' lambda_param_maybe_default+ lambda_kwds?")); + Token * _literal; + Token * _literal_1; + asdl_seq * b; + void *c; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + && + (b = _loop1_89_rule(p)) // lambda_param_maybe_default+ + && + (c = lambda_kwds_rule(p), 1) // lambda_kwds? + ) + { + D(fprintf(stderr, "%*c+ lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' ',' lambda_param_maybe_default+ lambda_kwds?")); + _res = _PyPegen_star_etc ( p , NULL , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' ',' lambda_param_maybe_default+ lambda_kwds?")); + } + { // lambda_kwds + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_kwds")); + arg_ty a; + if ( + (a = lambda_kwds_rule(p)) // lambda_kwds + ) + { + D(fprintf(stderr, "%*c+ lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_kwds")); + _res = _PyPegen_star_etc ( p , NULL , NULL , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_kwds")); + } + { // invalid_lambda_star_etc + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_lambda_star_etc")); + void *invalid_lambda_star_etc_var; + if ( + (invalid_lambda_star_etc_var = invalid_lambda_star_etc_rule(p)) // invalid_lambda_star_etc + ) + { + D(fprintf(stderr, "%*c+ lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_lambda_star_etc")); + _res = invalid_lambda_star_etc_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_lambda_star_etc")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_kwds: '**' lambda_param_no_default +static arg_ty +lambda_kwds_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + { // '**' lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_kwds[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' lambda_param_no_default")); + Token * _literal; + arg_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (a = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + D(fprintf(stderr, "%*c+ lambda_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' lambda_param_no_default")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_kwds[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' lambda_param_no_default")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_param_no_default: lambda_param ',' | lambda_param &':' +static arg_ty +lambda_param_no_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + { // lambda_param ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param ','")); + Token * _literal; + arg_ty a; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param ','")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param ','")); + } + { // lambda_param &':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param &':'")); + arg_ty a; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 11) // token=':' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param &':'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param &':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_param_with_default: lambda_param default ',' | lambda_param default &':' +static NameDefaultPair* +lambda_param_with_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + NameDefaultPair* _res = NULL; + int _mark = p->mark; + { // lambda_param default ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param default ','")); + Token * _literal; + arg_ty a; + expr_ty c; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + (c = default_rule(p)) // default + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param default ','")); + _res = _PyPegen_name_default_pair ( p , a , c , NULL ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param default ','")); + } + { // lambda_param default &':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param default &':'")); + arg_ty a; + expr_ty c; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + (c = default_rule(p)) // default + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 11) // token=':' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param default &':'")); + _res = _PyPegen_name_default_pair ( p , a , c , NULL ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param default &':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_param_maybe_default: lambda_param default? ',' | lambda_param default? &':' +static NameDefaultPair* +lambda_param_maybe_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + NameDefaultPair* _res = NULL; + int _mark = p->mark; + { // lambda_param default? ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_maybe_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param default? ','")); + Token * _literal; + arg_ty a; + void *c; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + (c = default_rule(p), 1) // default? + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_maybe_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param default? ','")); + _res = _PyPegen_name_default_pair ( p , a , c , NULL ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_maybe_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param default? ','")); + } + { // lambda_param default? &':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_maybe_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param default? &':'")); + arg_ty a; + void *c; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + (c = default_rule(p), 1) // default? + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 11) // token=':' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_maybe_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param default? &':'")); + _res = _PyPegen_name_default_pair ( p , a , c , NULL ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_maybe_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param default? &':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_param: NAME +static arg_ty +lambda_param_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty a; + if ( + (a = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ lambda_param[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_arg ( a -> v . Name . id , NULL , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// disjunction: conjunction (('or' conjunction))+ | conjunction +static expr_ty +disjunction_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, disjunction_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // conjunction (('or' conjunction))+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> disjunction[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "conjunction (('or' conjunction))+")); + expr_ty a; + asdl_seq * b; + if ( + (a = conjunction_rule(p)) // conjunction + && + (b = _loop1_90_rule(p)) // (('or' conjunction))+ + ) + { + D(fprintf(stderr, "%*c+ disjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "conjunction (('or' conjunction))+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BoolOp ( Or , CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s disjunction[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "conjunction (('or' conjunction))+")); + } + { // conjunction + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> disjunction[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "conjunction")); + expr_ty conjunction_var; + if ( + (conjunction_var = conjunction_rule(p)) // conjunction + ) + { + D(fprintf(stderr, "%*c+ disjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "conjunction")); + _res = conjunction_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s disjunction[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "conjunction")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, disjunction_type, _res); + D(p->level--); + return _res; +} + +// conjunction: inversion (('and' inversion))+ | inversion +static expr_ty +conjunction_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, conjunction_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // inversion (('and' inversion))+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> conjunction[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "inversion (('and' inversion))+")); + expr_ty a; + asdl_seq * b; + if ( + (a = inversion_rule(p)) // inversion + && + (b = _loop1_91_rule(p)) // (('and' inversion))+ + ) + { + D(fprintf(stderr, "%*c+ conjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "inversion (('and' inversion))+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BoolOp ( And , CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s conjunction[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "inversion (('and' inversion))+")); + } + { // inversion + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> conjunction[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "inversion")); + expr_ty inversion_var; + if ( + (inversion_var = inversion_rule(p)) // inversion + ) + { + D(fprintf(stderr, "%*c+ conjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "inversion")); + _res = inversion_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s conjunction[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "inversion")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, conjunction_type, _res); + D(p->level--); + return _res; +} + +// inversion: 'not' inversion | comparison +static expr_ty +inversion_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, inversion_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'not' inversion + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> inversion[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'not' inversion")); + Token * _keyword; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 526)) // token='not' + && + (a = inversion_rule(p)) // inversion + ) + { + D(fprintf(stderr, "%*c+ inversion[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'not' inversion")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_UnaryOp ( Not , a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s inversion[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'not' inversion")); + } + { // comparison + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> inversion[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "comparison")); + expr_ty comparison_var; + if ( + (comparison_var = comparison_rule(p)) // comparison + ) + { + D(fprintf(stderr, "%*c+ inversion[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "comparison")); + _res = comparison_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s inversion[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "comparison")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, inversion_type, _res); + D(p->level--); + return _res; +} + +// comparison: bitwise_or compare_op_bitwise_or_pair+ | bitwise_or +static expr_ty +comparison_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // bitwise_or compare_op_bitwise_or_pair+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> comparison[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_or compare_op_bitwise_or_pair+")); + expr_ty a; + asdl_seq * b; + if ( + (a = bitwise_or_rule(p)) // bitwise_or + && + (b = _loop1_92_rule(p)) // compare_op_bitwise_or_pair+ + ) + { + D(fprintf(stderr, "%*c+ comparison[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or compare_op_bitwise_or_pair+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Compare ( a , CHECK ( _PyPegen_get_cmpops ( p , b ) ) , CHECK ( _PyPegen_get_exprs ( p , b ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s comparison[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_or compare_op_bitwise_or_pair+")); + } + { // bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> comparison[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_or")); + expr_ty bitwise_or_var; + if ( + (bitwise_or_var = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ comparison[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or")); + _res = bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s comparison[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// compare_op_bitwise_or_pair: +// | eq_bitwise_or +// | noteq_bitwise_or +// | lte_bitwise_or +// | lt_bitwise_or +// | gte_bitwise_or +// | gt_bitwise_or +// | notin_bitwise_or +// | in_bitwise_or +// | isnot_bitwise_or +// | is_bitwise_or +static CmpopExprPair* +compare_op_bitwise_or_pair_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // eq_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "eq_bitwise_or")); + CmpopExprPair* eq_bitwise_or_var; + if ( + (eq_bitwise_or_var = eq_bitwise_or_rule(p)) // eq_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "eq_bitwise_or")); + _res = eq_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "eq_bitwise_or")); + } + { // noteq_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "noteq_bitwise_or")); + CmpopExprPair* noteq_bitwise_or_var; + if ( + (noteq_bitwise_or_var = noteq_bitwise_or_rule(p)) // noteq_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "noteq_bitwise_or")); + _res = noteq_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "noteq_bitwise_or")); + } + { // lte_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lte_bitwise_or")); + CmpopExprPair* lte_bitwise_or_var; + if ( + (lte_bitwise_or_var = lte_bitwise_or_rule(p)) // lte_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lte_bitwise_or")); + _res = lte_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lte_bitwise_or")); + } + { // lt_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lt_bitwise_or")); + CmpopExprPair* lt_bitwise_or_var; + if ( + (lt_bitwise_or_var = lt_bitwise_or_rule(p)) // lt_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lt_bitwise_or")); + _res = lt_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lt_bitwise_or")); + } + { // gte_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "gte_bitwise_or")); + CmpopExprPair* gte_bitwise_or_var; + if ( + (gte_bitwise_or_var = gte_bitwise_or_rule(p)) // gte_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "gte_bitwise_or")); + _res = gte_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "gte_bitwise_or")); + } + { // gt_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "gt_bitwise_or")); + CmpopExprPair* gt_bitwise_or_var; + if ( + (gt_bitwise_or_var = gt_bitwise_or_rule(p)) // gt_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "gt_bitwise_or")); + _res = gt_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "gt_bitwise_or")); + } + { // notin_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "notin_bitwise_or")); + CmpopExprPair* notin_bitwise_or_var; + if ( + (notin_bitwise_or_var = notin_bitwise_or_rule(p)) // notin_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "notin_bitwise_or")); + _res = notin_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "notin_bitwise_or")); + } + { // in_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "in_bitwise_or")); + CmpopExprPair* in_bitwise_or_var; + if ( + (in_bitwise_or_var = in_bitwise_or_rule(p)) // in_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "in_bitwise_or")); + _res = in_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "in_bitwise_or")); + } + { // isnot_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "isnot_bitwise_or")); + CmpopExprPair* isnot_bitwise_or_var; + if ( + (isnot_bitwise_or_var = isnot_bitwise_or_rule(p)) // isnot_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "isnot_bitwise_or")); + _res = isnot_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "isnot_bitwise_or")); + } + { // is_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "is_bitwise_or")); + CmpopExprPair* is_bitwise_or_var; + if ( + (is_bitwise_or_var = is_bitwise_or_rule(p)) // is_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "is_bitwise_or")); + _res = is_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "is_bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// eq_bitwise_or: '==' bitwise_or +static CmpopExprPair* +eq_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // '==' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> eq_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'==' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 27)) // token='==' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ eq_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'==' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , Eq , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s eq_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'==' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// noteq_bitwise_or: ('!=') bitwise_or +static CmpopExprPair* +noteq_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // ('!=') bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> noteq_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('!=') bitwise_or")); + void *_tmp_93_var; + expr_ty a; + if ( + (_tmp_93_var = _tmp_93_rule(p)) // '!=' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ noteq_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('!=') bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , NotEq , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s noteq_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('!=') bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lte_bitwise_or: '<=' bitwise_or +static CmpopExprPair* +lte_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // '<=' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lte_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'<=' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 29)) // token='<=' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ lte_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'<=' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , LtE , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lte_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'<=' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lt_bitwise_or: '<' bitwise_or +static CmpopExprPair* +lt_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // '<' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lt_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'<' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 20)) // token='<' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ lt_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'<' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , Lt , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lt_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'<' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// gte_bitwise_or: '>=' bitwise_or +static CmpopExprPair* +gte_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // '>=' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> gte_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'>=' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 30)) // token='>=' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ gte_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'>=' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , GtE , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s gte_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'>=' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// gt_bitwise_or: '>' bitwise_or +static CmpopExprPair* +gt_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // '>' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> gt_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'>' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 21)) // token='>' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ gt_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'>' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , Gt , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s gt_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'>' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// notin_bitwise_or: 'not' 'in' bitwise_or +static CmpopExprPair* +notin_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // 'not' 'in' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> notin_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'not' 'in' bitwise_or")); + Token * _keyword; + Token * _keyword_1; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 526)) // token='not' + && + (_keyword_1 = _PyPegen_expect_token(p, 518)) // token='in' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ notin_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'not' 'in' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , NotIn , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s notin_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'not' 'in' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// in_bitwise_or: 'in' bitwise_or +static CmpopExprPair* +in_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // 'in' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> in_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'in' bitwise_or")); + Token * _keyword; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 518)) // token='in' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ in_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'in' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , In , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s in_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'in' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// isnot_bitwise_or: 'is' 'not' bitwise_or +static CmpopExprPair* +isnot_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // 'is' 'not' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> isnot_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'is' 'not' bitwise_or")); + Token * _keyword; + Token * _keyword_1; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 527)) // token='is' + && + (_keyword_1 = _PyPegen_expect_token(p, 526)) // token='not' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ isnot_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'is' 'not' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , IsNot , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s isnot_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'is' 'not' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// is_bitwise_or: 'is' bitwise_or +static CmpopExprPair* +is_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // 'is' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> is_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'is' bitwise_or")); + Token * _keyword; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 527)) // token='is' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ is_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'is' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , Is , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s is_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'is' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// bitwise_or: bitwise_or '|' bitwise_xor | bitwise_xor +static expr_ty bitwise_or_raw(Parser *); +static expr_ty +bitwise_or_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, bitwise_or_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_1 = _PyPegen_update_memo(p, _mark, bitwise_or_type, _res); + if (tmpvar_1) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = bitwise_or_raw(p); + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +bitwise_or_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // bitwise_or '|' bitwise_xor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_or '|' bitwise_xor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = bitwise_or_rule(p)) // bitwise_or + && + (_literal = _PyPegen_expect_token(p, 18)) // token='|' + && + (b = bitwise_xor_rule(p)) // bitwise_xor + ) + { + D(fprintf(stderr, "%*c+ bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or '|' bitwise_xor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , BitOr , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_or '|' bitwise_xor")); + } + { // bitwise_xor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_xor")); + expr_ty bitwise_xor_var; + if ( + (bitwise_xor_var = bitwise_xor_rule(p)) // bitwise_xor + ) + { + D(fprintf(stderr, "%*c+ bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_xor")); + _res = bitwise_xor_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_xor")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// bitwise_xor: bitwise_xor '^' bitwise_and | bitwise_and +static expr_ty bitwise_xor_raw(Parser *); +static expr_ty +bitwise_xor_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, bitwise_xor_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_2 = _PyPegen_update_memo(p, _mark, bitwise_xor_type, _res); + if (tmpvar_2) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = bitwise_xor_raw(p); + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +bitwise_xor_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // bitwise_xor '^' bitwise_and + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_xor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_xor '^' bitwise_and")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = bitwise_xor_rule(p)) // bitwise_xor + && + (_literal = _PyPegen_expect_token(p, 32)) // token='^' + && + (b = bitwise_and_rule(p)) // bitwise_and + ) + { + D(fprintf(stderr, "%*c+ bitwise_xor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_xor '^' bitwise_and")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , BitXor , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_xor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_xor '^' bitwise_and")); + } + { // bitwise_and + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_xor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_and")); + expr_ty bitwise_and_var; + if ( + (bitwise_and_var = bitwise_and_rule(p)) // bitwise_and + ) + { + D(fprintf(stderr, "%*c+ bitwise_xor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_and")); + _res = bitwise_and_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_xor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_and")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// bitwise_and: bitwise_and '&' shift_expr | shift_expr +static expr_ty bitwise_and_raw(Parser *); +static expr_ty +bitwise_and_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, bitwise_and_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_3 = _PyPegen_update_memo(p, _mark, bitwise_and_type, _res); + if (tmpvar_3) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = bitwise_and_raw(p); + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +bitwise_and_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // bitwise_and '&' shift_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_and[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_and '&' shift_expr")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = bitwise_and_rule(p)) // bitwise_and + && + (_literal = _PyPegen_expect_token(p, 19)) // token='&' + && + (b = shift_expr_rule(p)) // shift_expr + ) + { + D(fprintf(stderr, "%*c+ bitwise_and[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_and '&' shift_expr")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , BitAnd , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_and[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_and '&' shift_expr")); + } + { // shift_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_and[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "shift_expr")); + expr_ty shift_expr_var; + if ( + (shift_expr_var = shift_expr_rule(p)) // shift_expr + ) + { + D(fprintf(stderr, "%*c+ bitwise_and[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "shift_expr")); + _res = shift_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_and[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "shift_expr")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// shift_expr: shift_expr '<<' sum | shift_expr '>>' sum | sum +static expr_ty shift_expr_raw(Parser *); +static expr_ty +shift_expr_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, shift_expr_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_4 = _PyPegen_update_memo(p, _mark, shift_expr_type, _res); + if (tmpvar_4) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = shift_expr_raw(p); + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +shift_expr_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // shift_expr '<<' sum + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> shift_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "shift_expr '<<' sum")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = shift_expr_rule(p)) // shift_expr + && + (_literal = _PyPegen_expect_token(p, 33)) // token='<<' + && + (b = sum_rule(p)) // sum + ) + { + D(fprintf(stderr, "%*c+ shift_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "shift_expr '<<' sum")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , LShift , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s shift_expr[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "shift_expr '<<' sum")); + } + { // shift_expr '>>' sum + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> shift_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "shift_expr '>>' sum")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = shift_expr_rule(p)) // shift_expr + && + (_literal = _PyPegen_expect_token(p, 34)) // token='>>' + && + (b = sum_rule(p)) // sum + ) + { + D(fprintf(stderr, "%*c+ shift_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "shift_expr '>>' sum")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , RShift , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s shift_expr[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "shift_expr '>>' sum")); + } + { // sum + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> shift_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "sum")); + expr_ty sum_var; + if ( + (sum_var = sum_rule(p)) // sum + ) + { + D(fprintf(stderr, "%*c+ shift_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "sum")); + _res = sum_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s shift_expr[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "sum")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// sum: sum '+' term | sum '-' term | term +static expr_ty sum_raw(Parser *); +static expr_ty +sum_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, sum_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_5 = _PyPegen_update_memo(p, _mark, sum_type, _res); + if (tmpvar_5) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = sum_raw(p); + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +sum_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // sum '+' term + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> sum[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "sum '+' term")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = sum_rule(p)) // sum + && + (_literal = _PyPegen_expect_token(p, 14)) // token='+' + && + (b = term_rule(p)) // term + ) + { + D(fprintf(stderr, "%*c+ sum[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "sum '+' term")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Add , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s sum[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "sum '+' term")); + } + { // sum '-' term + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> sum[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "sum '-' term")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = sum_rule(p)) // sum + && + (_literal = _PyPegen_expect_token(p, 15)) // token='-' + && + (b = term_rule(p)) // term + ) + { + D(fprintf(stderr, "%*c+ sum[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "sum '-' term")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Sub , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s sum[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "sum '-' term")); + } + { // term + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> sum[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term")); + expr_ty term_var; + if ( + (term_var = term_rule(p)) // term + ) + { + D(fprintf(stderr, "%*c+ sum[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term")); + _res = term_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s sum[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// term: +// | term '*' factor +// | term '/' factor +// | term '//' factor +// | term '%' factor +// | term '@' factor +// | factor +static expr_ty term_raw(Parser *); +static expr_ty +term_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, term_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_6 = _PyPegen_update_memo(p, _mark, term_type, _res); + if (tmpvar_6) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = term_raw(p); + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +term_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // term '*' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term '*' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = term_rule(p)) // term + && + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term '*' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Mult , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term '*' factor")); + } + { // term '/' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term '/' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = term_rule(p)) // term + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term '/' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Div , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term '/' factor")); + } + { // term '//' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term '//' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = term_rule(p)) // term + && + (_literal = _PyPegen_expect_token(p, 47)) // token='//' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term '//' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , FloorDiv , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term '//' factor")); + } + { // term '%' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term '%' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = term_rule(p)) // term + && + (_literal = _PyPegen_expect_token(p, 24)) // token='%' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term '%' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Mod , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term '%' factor")); + } + { // term '@' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term '@' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = term_rule(p)) // term + && + (_literal = _PyPegen_expect_token(p, 49)) // token='@' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term '@' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "The '@' operator is" , _Py_BinOp ( a , MatMult , b , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term '@' factor")); + } + { // factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "factor")); + expr_ty factor_var; + if ( + (factor_var = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "factor")); + _res = factor_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "factor")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// factor: '+' factor | '-' factor | '~' factor | power +static expr_ty +factor_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, factor_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '+' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> factor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+' factor")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 14)) // token='+' + && + (a = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ factor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_UnaryOp ( UAdd , a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s factor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+' factor")); + } + { // '-' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> factor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-' factor")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 15)) // token='-' + && + (a = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ factor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_UnaryOp ( USub , a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s factor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-' factor")); + } + { // '~' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> factor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'~' factor")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 31)) // token='~' + && + (a = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ factor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'~' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_UnaryOp ( Invert , a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s factor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'~' factor")); + } + { // power + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> factor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "power")); + expr_ty power_var; + if ( + (power_var = power_rule(p)) // power + ) + { + D(fprintf(stderr, "%*c+ factor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "power")); + _res = power_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s factor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "power")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, factor_type, _res); + D(p->level--); + return _res; +} + +// power: await_primary '**' factor | await_primary +static expr_ty +power_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // await_primary '**' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> power[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "await_primary '**' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = await_primary_rule(p)) // await_primary + && + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ power[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "await_primary '**' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Pow , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s power[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "await_primary '**' factor")); + } + { // await_primary + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> power[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "await_primary")); + expr_ty await_primary_var; + if ( + (await_primary_var = await_primary_rule(p)) // await_primary + ) + { + D(fprintf(stderr, "%*c+ power[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "await_primary")); + _res = await_primary_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s power[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "await_primary")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// await_primary: AWAIT primary | primary +static expr_ty +await_primary_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, await_primary_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // AWAIT primary + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> await_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "AWAIT primary")); + expr_ty a; + Token * await_var; + if ( + (await_var = _PyPegen_expect_token(p, AWAIT)) // token='AWAIT' + && + (a = primary_rule(p)) // primary + ) + { + D(fprintf(stderr, "%*c+ await_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "AWAIT primary")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "Await expressions are" , _Py_Await ( a , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s await_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "AWAIT primary")); + } + { // primary + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> await_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary")); + expr_ty primary_var; + if ( + (primary_var = primary_rule(p)) // primary + ) + { + D(fprintf(stderr, "%*c+ await_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary")); + _res = primary_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s await_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, await_primary_type, _res); + D(p->level--); + return _res; +} + +// Left-recursive +// primary: +// | primary '.' NAME +// | primary genexp +// | primary '(' arguments? ')' +// | primary '[' slices ']' +// | atom +static expr_ty primary_raw(Parser *); +static expr_ty +primary_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, primary_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_7 = _PyPegen_update_memo(p, _mark, primary_type, _res); + if (tmpvar_7) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = primary_raw(p); + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +primary_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // primary '.' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary '.' NAME")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = primary_rule(p)) // primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary '.' NAME")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary '.' NAME")); + } + { // primary genexp + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary genexp")); + expr_ty a; + expr_ty b; + if ( + (a = primary_rule(p)) // primary + && + (b = genexp_rule(p)) // genexp + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary genexp")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Call ( a , CHECK ( _PyPegen_singleton_seq ( p , b ) ) , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary genexp")); + } + { // primary '(' arguments? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary '(' arguments? ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + void *b; + if ( + (a = primary_rule(p)) // primary + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (b = arguments_rule(p), 1) // arguments? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary '(' arguments? ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Call ( a , ( b ) ? ( ( expr_ty ) b ) -> v . Call . args : NULL , ( b ) ? ( ( expr_ty ) b ) -> v . Call . keywords : NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary '(' arguments? ')'")); + } + { // primary '[' slices ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary '[' slices ']'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = primary_rule(p)) // primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary '[' slices ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary '[' slices ']'")); + } + { // atom + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "atom")); + expr_ty atom_var; + if ( + (atom_var = atom_rule(p)) // atom + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "atom")); + _res = atom_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "atom")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// slices: slice !',' | ','.slice+ ','? +static expr_ty +slices_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // slice !',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slices[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice !','")); + expr_ty a; + if ( + (a = slice_rule(p)) // slice + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 12) // token=',' + ) + { + D(fprintf(stderr, "%*c+ slices[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice !','")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slices[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slice !','")); + } + { // ','.slice+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slices[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.slice+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_94_rule(p)) // ','.slice+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ slices[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.slice+ ','?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slices[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.slice+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// slice: expression? ':' expression? [':' expression?] | expression +static expr_ty +slice_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // expression? ':' expression? [':' expression?] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slice[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression? ':' expression? [':' expression?]")); + Token * _literal; + void *a; + void *b; + void *c; + if ( + (a = expression_rule(p), 1) // expression? + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = expression_rule(p), 1) // expression? + && + (c = _tmp_96_rule(p), 1) // [':' expression?] + ) + { + D(fprintf(stderr, "%*c+ slice[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression? ':' expression? [':' expression?]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Slice ( a , b , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slice[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression? ':' expression? [':' expression?]")); + } + { // expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slice[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression")); + expr_ty a; + if ( + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ slice[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slice[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// atom: +// | NAME +// | 'True' +// | 'False' +// | 'None' +// | '__peg_parser__' +// | &STRING strings +// | NUMBER +// | &'(' (tuple | group | genexp) +// | &'[' (list | listcomp) +// | &'{' (dict | set | dictcomp | setcomp) +// | '...' +static expr_ty +atom_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty name_var; + if ( + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = name_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + { // 'True' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 528)) // token='True' + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Constant ( Py_True , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'True'")); + } + { // 'False' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 529)) // token='False' + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Constant ( Py_False , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'False'")); + } + { // 'None' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 530)) // token='None' + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Constant ( Py_None , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'")); + } + { // '__peg_parser__' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'__peg_parser__'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 531)) // token='__peg_parser__' + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'__peg_parser__'")); + _res = RAISE_SYNTAX_ERROR ( "You found it!" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'__peg_parser__'")); + } + { // &STRING strings + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&STRING strings")); + expr_ty strings_var; + if ( + _PyPegen_lookahead(1, _PyPegen_string_token, p) + && + (strings_var = strings_rule(p)) // strings + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&STRING strings")); + _res = strings_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&STRING strings")); + } + { // NUMBER + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NUMBER")); + expr_ty number_var; + if ( + (number_var = _PyPegen_number_token(p)) // NUMBER + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NUMBER")); + _res = number_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NUMBER")); + } + { // &'(' (tuple | group | genexp) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); + void *_tmp_97_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 7) // token='(' + && + (_tmp_97_var = _tmp_97_rule(p)) // tuple | group | genexp + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); + _res = _tmp_97_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'(' (tuple | group | genexp)")); + } + { // &'[' (list | listcomp) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); + void *_tmp_98_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 9) // token='[' + && + (_tmp_98_var = _tmp_98_rule(p)) // list | listcomp + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); + _res = _tmp_98_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'[' (list | listcomp)")); + } + { // &'{' (dict | set | dictcomp | setcomp) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); + void *_tmp_99_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 25) // token='{' + && + (_tmp_99_var = _tmp_99_rule(p)) // dict | set | dictcomp | setcomp + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); + _res = _tmp_99_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); + } + { // '...' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 52)) // token='...' + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Constant ( Py_Ellipsis , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// strings: STRING+ +static expr_ty +strings_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, strings_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + { // STRING+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING+")); + asdl_seq * a; + if ( + (a = _loop1_100_rule(p)) // STRING+ + ) + { + D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "STRING+")); + _res = _PyPegen_concatenate_strings ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s strings[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING+")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, strings_type, _res); + D(p->level--); + return _res; +} + +// list: '[' star_named_expressions? ']' +static expr_ty +list_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '[' star_named_expressions? ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> list[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' star_named_expressions? ']'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (a = star_named_expressions_rule(p), 1) // star_named_expressions? + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ list[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' star_named_expressions? ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_List ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s list[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' star_named_expressions? ']'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// listcomp: '[' named_expression ~ for_if_clauses ']' | invalid_comprehension +static expr_ty +listcomp_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '[' named_expression ~ for_if_clauses ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> listcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' named_expression ~ for_if_clauses ']'")); + int _cut_var = 0; + Token * _literal; + Token * _literal_1; + expr_ty a; + asdl_seq* b; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (a = named_expression_rule(p)) // named_expression + && + (_cut_var = 1) + && + (b = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ listcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' named_expression ~ for_if_clauses ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ListComp ( a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s listcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' named_expression ~ for_if_clauses ']'")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // invalid_comprehension + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> listcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + void *invalid_comprehension_var; + if ( + (invalid_comprehension_var = invalid_comprehension_rule(p)) // invalid_comprehension + ) + { + D(fprintf(stderr, "%*c+ listcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + _res = invalid_comprehension_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s listcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_comprehension")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// tuple: '(' [star_named_expression ',' star_named_expressions?] ')' +static expr_ty +tuple_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '(' [star_named_expression ',' star_named_expressions?] ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> tuple[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' [star_named_expression ',' star_named_expressions?] ')'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = _tmp_101_rule(p), 1) // [star_named_expression ',' star_named_expressions?] + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ tuple[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' [star_named_expression ',' star_named_expressions?] ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s tuple[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' [star_named_expression ',' star_named_expressions?] ')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// group: '(' (yield_expr | named_expression) ')' | invalid_group +static expr_ty +group_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // '(' (yield_expr | named_expression) ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> group[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' (yield_expr | named_expression) ')'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = _tmp_102_rule(p)) // yield_expr | named_expression + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ group[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' (yield_expr | named_expression) ')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s group[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' (yield_expr | named_expression) ')'")); + } + { // invalid_group + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> group[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_group")); + void *invalid_group_var; + if ( + (invalid_group_var = invalid_group_rule(p)) // invalid_group + ) + { + D(fprintf(stderr, "%*c+ group[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_group")); + _res = invalid_group_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s group[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_group")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// genexp: '(' expression ~ for_if_clauses ')' | invalid_comprehension +static expr_ty +genexp_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '(' expression ~ for_if_clauses ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> genexp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' expression ~ for_if_clauses ')'")); + int _cut_var = 0; + Token * _literal; + Token * _literal_1; + expr_ty a; + asdl_seq* b; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = expression_rule(p)) // expression + && + (_cut_var = 1) + && + (b = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ genexp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' expression ~ for_if_clauses ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_GeneratorExp ( a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s genexp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' expression ~ for_if_clauses ')'")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // invalid_comprehension + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> genexp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + void *invalid_comprehension_var; + if ( + (invalid_comprehension_var = invalid_comprehension_rule(p)) // invalid_comprehension + ) + { + D(fprintf(stderr, "%*c+ genexp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + _res = invalid_comprehension_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s genexp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_comprehension")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// set: '{' expressions_list '}' +static expr_ty +set_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '{' expressions_list '}' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> set[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' expressions_list '}'")); + Token * _literal; + Token * _literal_1; + asdl_seq* a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = expressions_list_rule(p)) // expressions_list + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ set[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' expressions_list '}'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Set ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s set[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' expressions_list '}'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// setcomp: '{' expression ~ for_if_clauses '}' | invalid_comprehension +static expr_ty +setcomp_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '{' expression ~ for_if_clauses '}' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> setcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' expression ~ for_if_clauses '}'")); + int _cut_var = 0; + Token * _literal; + Token * _literal_1; + expr_ty a; + asdl_seq* b; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = expression_rule(p)) // expression + && + (_cut_var = 1) + && + (b = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ setcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' expression ~ for_if_clauses '}'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_SetComp ( a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s setcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' expression ~ for_if_clauses '}'")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // invalid_comprehension + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> setcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + void *invalid_comprehension_var; + if ( + (invalid_comprehension_var = invalid_comprehension_rule(p)) // invalid_comprehension + ) + { + D(fprintf(stderr, "%*c+ setcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + _res = invalid_comprehension_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s setcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_comprehension")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// dict: '{' double_starred_kvpairs? '}' +static expr_ty +dict_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '{' double_starred_kvpairs? '}' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dict[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' double_starred_kvpairs? '}'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = double_starred_kvpairs_rule(p), 1) // double_starred_kvpairs? + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ dict[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' double_starred_kvpairs? '}'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Dict ( CHECK ( _PyPegen_get_keys ( p , a ) ) , CHECK ( _PyPegen_get_values ( p , a ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dict[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' double_starred_kvpairs? '}'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// dictcomp: '{' kvpair for_if_clauses '}' | invalid_dict_comprehension +static expr_ty +dictcomp_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '{' kvpair for_if_clauses '}' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dictcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' kvpair for_if_clauses '}'")); + Token * _literal; + Token * _literal_1; + KeyValuePair* a; + asdl_seq* b; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = kvpair_rule(p)) // kvpair + && + (b = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ dictcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' kvpair for_if_clauses '}'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_DictComp ( a -> key , a -> value , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dictcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' kvpair for_if_clauses '}'")); + } + { // invalid_dict_comprehension + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dictcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_dict_comprehension")); + void *invalid_dict_comprehension_var; + if ( + (invalid_dict_comprehension_var = invalid_dict_comprehension_rule(p)) // invalid_dict_comprehension + ) + { + D(fprintf(stderr, "%*c+ dictcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_dict_comprehension")); + _res = invalid_dict_comprehension_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dictcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_dict_comprehension")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// double_starred_kvpairs: ','.double_starred_kvpair+ ','? +static asdl_seq* +double_starred_kvpairs_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.double_starred_kvpair+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> double_starred_kvpairs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_103_rule(p)) // ','.double_starred_kvpair+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ double_starred_kvpairs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ','?")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s double_starred_kvpairs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.double_starred_kvpair+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// double_starred_kvpair: '**' bitwise_or | kvpair +static KeyValuePair* +double_starred_kvpair_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + KeyValuePair* _res = NULL; + int _mark = p->mark; + { // '**' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> double_starred_kvpair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ double_starred_kvpair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' bitwise_or")); + _res = _PyPegen_key_value_pair ( p , NULL , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s double_starred_kvpair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' bitwise_or")); + } + { // kvpair + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> double_starred_kvpair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kvpair")); + KeyValuePair* kvpair_var; + if ( + (kvpair_var = kvpair_rule(p)) // kvpair + ) + { + D(fprintf(stderr, "%*c+ double_starred_kvpair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kvpair")); + _res = kvpair_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s double_starred_kvpair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kvpair")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// kvpair: expression ':' expression +static KeyValuePair* +kvpair_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + KeyValuePair* _res = NULL; + int _mark = p->mark; + { // expression ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kvpair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ':' expression")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ kvpair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' expression")); + _res = _PyPegen_key_value_pair ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kvpair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ':' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// for_if_clauses: for_if_clause+ +static asdl_seq* +for_if_clauses_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // for_if_clause+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_if_clauses[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); + asdl_seq * _loop1_105_var; + if ( + (_loop1_105_var = _loop1_105_rule(p)) // for_if_clause+ + ) + { + D(fprintf(stderr, "%*c+ for_if_clauses[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); + _res = _loop1_105_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_if_clauses[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// for_if_clause: +// | ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))* +// | 'for' star_targets 'in' ~ disjunction (('if' disjunction))* +// | invalid_for_target +static comprehension_ty +for_if_clause_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + comprehension_ty _res = NULL; + int _mark = p->mark; + { // ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))* + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_if_clause[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + int _cut_var = 0; + Token * _keyword; + Token * _keyword_1; + expr_ty a; + Token * async_var; + expr_ty b; + asdl_seq * c; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + && + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + && + (a = star_targets_rule(p)) // star_targets + && + (_keyword_1 = _PyPegen_expect_token(p, 518)) // token='in' + && + (_cut_var = 1) + && + (b = disjunction_rule(p)) // disjunction + && + (c = _loop0_106_rule(p)) // (('if' disjunction))* + ) + { + D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + _res = CHECK_VERSION ( 6 , "Async comprehensions are" , _Py_comprehension ( a , b , c , 1 , p -> arena ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_if_clause[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // 'for' star_targets 'in' ~ disjunction (('if' disjunction))* + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_if_clause[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + int _cut_var = 0; + Token * _keyword; + Token * _keyword_1; + expr_ty a; + expr_ty b; + asdl_seq * c; + if ( + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + && + (a = star_targets_rule(p)) // star_targets + && + (_keyword_1 = _PyPegen_expect_token(p, 518)) // token='in' + && + (_cut_var = 1) + && + (b = disjunction_rule(p)) // disjunction + && + (c = _loop0_107_rule(p)) // (('if' disjunction))* + ) + { + D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + _res = _Py_comprehension ( a , b , c , 0 , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_if_clause[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // invalid_for_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_if_clause[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_for_target")); + void *invalid_for_target_var; + if ( + (invalid_for_target_var = invalid_for_target_rule(p)) // invalid_for_target + ) + { + D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_for_target")); + _res = invalid_for_target_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_if_clause[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_for_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// yield_expr: 'yield' 'from' expression | 'yield' star_expressions? +static expr_ty +yield_expr_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'yield' 'from' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> yield_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'yield' 'from' expression")); + Token * _keyword; + Token * _keyword_1; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 504)) // token='yield' + && + (_keyword_1 = _PyPegen_expect_token(p, 514)) // token='from' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ yield_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'yield' 'from' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_YieldFrom ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s yield_expr[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'yield' 'from' expression")); + } + { // 'yield' star_expressions? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> yield_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'yield' star_expressions?")); + Token * _keyword; + void *a; + if ( + (_keyword = _PyPegen_expect_token(p, 504)) // token='yield' + && + (a = star_expressions_rule(p), 1) // star_expressions? + ) + { + D(fprintf(stderr, "%*c+ yield_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'yield' star_expressions?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Yield ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s yield_expr[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'yield' star_expressions?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// arguments: args ','? &')' | incorrect_arguments +static expr_ty +arguments_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, arguments_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + { // args ','? &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ','? &')'")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + if ( + (a = args_rule(p)) // args + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ','? &')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ','? &')'")); + } + { // incorrect_arguments + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "incorrect_arguments")); + void *incorrect_arguments_var; + if ( + (incorrect_arguments_var = incorrect_arguments_rule(p)) // incorrect_arguments + ) + { + D(fprintf(stderr, "%*c+ arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "incorrect_arguments")); + _res = incorrect_arguments_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "incorrect_arguments")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, arguments_type, _res); + D(p->level--); + return _res; +} + +// args: ','.(starred_expression | named_expression !'=')+ [',' kwargs] | kwargs +static expr_ty +args_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // ','.(starred_expression | named_expression !'=')+ [',' kwargs] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> args[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); + asdl_seq * a; + void *b; + if ( + (a = _gather_108_rule(p)) // ','.(starred_expression | named_expression !'=')+ + && + (b = _tmp_110_rule(p), 1) // [',' kwargs] + ) + { + D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_collect_call_seqs ( p , a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s args[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); + } + { // kwargs + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> args[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwargs")); + asdl_seq* a; + if ( + (a = kwargs_rule(p)) // kwargs + ) + { + D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwargs")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Call ( _PyPegen_dummy_name ( p ) , CHECK_NULL_ALLOWED ( _PyPegen_seq_extract_starred_exprs ( p , a ) ) , CHECK_NULL_ALLOWED ( _PyPegen_seq_delete_starred_exprs ( p , a ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s args[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwargs")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// kwargs: +// | ','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+ +// | ','.kwarg_or_starred+ +// | ','.kwarg_or_double_starred+ +static asdl_seq* +kwargs_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+")); + Token * _literal; + asdl_seq * a; + asdl_seq * b; + if ( + (a = _gather_111_rule(p)) // ','.kwarg_or_starred+ + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (b = _gather_113_rule(p)) // ','.kwarg_or_double_starred+ + ) + { + D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+")); + _res = _PyPegen_join_sequences ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwargs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+")); + } + { // ','.kwarg_or_starred+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); + asdl_seq * _gather_115_var; + if ( + (_gather_115_var = _gather_115_rule(p)) // ','.kwarg_or_starred+ + ) + { + D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); + _res = _gather_115_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwargs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.kwarg_or_starred+")); + } + { // ','.kwarg_or_double_starred+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); + asdl_seq * _gather_117_var; + if ( + (_gather_117_var = _gather_117_rule(p)) // ','.kwarg_or_double_starred+ + ) + { + D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); + _res = _gather_117_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwargs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.kwarg_or_double_starred+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// starred_expression: '*' expression +static expr_ty +starred_expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '*' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> starred_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ starred_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Starred ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s starred_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// kwarg_or_starred: NAME '=' expression | starred_expression | invalid_kwarg +static KeywordOrStarred* +kwarg_or_starred_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + KeywordOrStarred* _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME '=' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '=' expression")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '=' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_keyword_or_starred ( p , CHECK ( _Py_keyword ( a -> v . Name . id , b , EXTRA ) ) , 1 ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME '=' expression")); + } + { // starred_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + expr_ty a; + if ( + (a = starred_expression_rule(p)) // starred_expression + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + _res = _PyPegen_keyword_or_starred ( p , a , 0 ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); + } + { // invalid_kwarg + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_kwarg")); + void *invalid_kwarg_var; + if ( + (invalid_kwarg_var = invalid_kwarg_rule(p)) // invalid_kwarg + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_kwarg")); + _res = invalid_kwarg_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_kwarg")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// kwarg_or_double_starred: NAME '=' expression | '**' expression | invalid_kwarg +static KeywordOrStarred* +kwarg_or_double_starred_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + KeywordOrStarred* _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME '=' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_double_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '=' expression")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_double_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '=' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_keyword_or_starred ( p , CHECK ( _Py_keyword ( a -> v . Name . id , b , EXTRA ) ) , 1 ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_double_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME '=' expression")); + } + { // '**' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_double_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_double_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_keyword_or_starred ( p , CHECK ( _Py_keyword ( NULL , a , EXTRA ) ) , 1 ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_double_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' expression")); + } + { // invalid_kwarg + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_double_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_kwarg")); + void *invalid_kwarg_var; + if ( + (invalid_kwarg_var = invalid_kwarg_rule(p)) // invalid_kwarg + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_double_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_kwarg")); + _res = invalid_kwarg_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_double_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_kwarg")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_targets: star_target !',' | star_target ((',' star_target))* ','? +static expr_ty +star_targets_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // star_target !',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target !','")); + expr_ty a; + if ( + (a = star_target_rule(p)) // star_target + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 12) // token=',' + ) + { + D(fprintf(stderr, "%*c+ star_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target !','")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target !','")); + } + { // star_target ((',' star_target))* ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target ((',' star_target))* ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + asdl_seq * b; + if ( + (a = star_target_rule(p)) // star_target + && + (b = _loop0_119_rule(p)) // ((',' star_target))* + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ star_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target ((',' star_target))* ','?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target ((',' star_target))* ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_targets_seq: ','.star_target+ ','? +static asdl_seq* +star_targets_seq_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.star_target+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_targets_seq[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.star_target+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_120_rule(p)) // ','.star_target+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ star_targets_seq[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.star_target+ ','?")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_targets_seq[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.star_target+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_target: +// | '*' (!'*' star_target) +// | t_primary '.' NAME !t_lookahead +// | t_primary '[' slices ']' !t_lookahead +// | star_atom +static expr_ty +star_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, star_target_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '*' (!'*' star_target) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (!'*' star_target)")); + Token * _literal; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = _tmp_122_rule(p)) // !'*' star_target + ) + { + D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (!'*' star_target)")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Starred ( CHECK ( _PyPegen_set_expr_context ( p , a , Store ) ) , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' (!'*' star_target)")); + } + { // t_primary '.' NAME !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + } + { // t_primary '[' slices ']' !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + } + { // star_atom + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_atom")); + expr_ty star_atom_var; + if ( + (star_atom_var = star_atom_rule(p)) // star_atom + ) + { + D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_atom")); + _res = star_atom_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_atom")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, star_target_type, _res); + D(p->level--); + return _res; +} + +// star_atom: +// | NAME +// | '(' star_target ')' +// | '(' star_targets_seq? ')' +// | '[' star_targets_seq? ']' +static expr_ty +star_atom_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty a; + if ( + (a = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ star_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = _PyPegen_set_expr_context ( p , a , Store ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + { // '(' star_target ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' star_target ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = star_target_rule(p)) // star_target + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ star_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' star_target ')'")); + _res = _PyPegen_set_expr_context ( p , a , Store ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' star_target ')'")); + } + { // '(' star_targets_seq? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' star_targets_seq? ')'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = star_targets_seq_rule(p), 1) // star_targets_seq? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ star_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' star_targets_seq? ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( a , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' star_targets_seq? ')'")); + } + { // '[' star_targets_seq? ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' star_targets_seq? ']'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (a = star_targets_seq_rule(p), 1) // star_targets_seq? + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ star_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' star_targets_seq? ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_List ( a , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' star_targets_seq? ']'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// single_target: single_subscript_attribute_target | NAME | '(' single_target ')' +static expr_ty +single_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // single_subscript_attribute_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> single_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + expr_ty single_subscript_attribute_target_var; + if ( + (single_subscript_attribute_target_var = single_subscript_attribute_target_rule(p)) // single_subscript_attribute_target + ) + { + D(fprintf(stderr, "%*c+ single_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + _res = single_subscript_attribute_target_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s single_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "single_subscript_attribute_target")); + } + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> single_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty a; + if ( + (a = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ single_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = _PyPegen_set_expr_context ( p , a , Store ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s single_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + { // '(' single_target ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> single_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = single_target_rule(p)) // single_target + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ single_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s single_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' single_target ')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// single_subscript_attribute_target: +// | t_primary '.' NAME !t_lookahead +// | t_primary '[' slices ']' !t_lookahead +static expr_ty +single_subscript_attribute_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // t_primary '.' NAME !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> single_subscript_attribute_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ single_subscript_attribute_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s single_subscript_attribute_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + } + { // t_primary '[' slices ']' !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> single_subscript_attribute_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ single_subscript_attribute_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s single_subscript_attribute_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// del_targets: ','.del_target+ ','? +static asdl_seq* +del_targets_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.del_target+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.del_target+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_123_rule(p)) // ','.del_target+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ del_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.del_target+ ','?")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.del_target+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// del_target: +// | t_primary '.' NAME !t_lookahead +// | t_primary '[' slices ']' !t_lookahead +// | del_t_atom +static expr_ty +del_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, del_target_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // t_primary '.' NAME !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ del_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Del , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + } + { // t_primary '[' slices ']' !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ del_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Del , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + } + { // del_t_atom + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_t_atom")); + expr_ty del_t_atom_var; + if ( + (del_t_atom_var = del_t_atom_rule(p)) // del_t_atom + ) + { + D(fprintf(stderr, "%*c+ del_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_t_atom")); + _res = del_t_atom_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_t_atom")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, del_target_type, _res); + D(p->level--); + return _res; +} + +// del_t_atom: NAME | '(' del_target ')' | '(' del_targets? ')' | '[' del_targets? ']' +static expr_ty +del_t_atom_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty a; + if ( + (a = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ del_t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = _PyPegen_set_expr_context ( p , a , Del ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + { // '(' del_target ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' del_target ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = del_target_rule(p)) // del_target + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ del_t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' del_target ')'")); + _res = _PyPegen_set_expr_context ( p , a , Del ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' del_target ')'")); + } + { // '(' del_targets? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' del_targets? ')'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = del_targets_rule(p), 1) // del_targets? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ del_t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' del_targets? ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( a , Del , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' del_targets? ')'")); + } + { // '[' del_targets? ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' del_targets? ']'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (a = del_targets_rule(p), 1) // del_targets? + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ del_t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' del_targets? ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_List ( a , Del , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' del_targets? ']'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// targets: ','.target+ ','? +static asdl_seq* +targets_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.target+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.target+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_125_rule(p)) // ','.target+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.target+ ','?")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.target+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// target: +// | t_primary '.' NAME !t_lookahead +// | t_primary '[' slices ']' !t_lookahead +// | t_atom +static expr_ty +target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, target_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // t_primary '.' NAME !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + } + { // t_primary '[' slices ']' !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + } + { // t_atom + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_atom")); + expr_ty t_atom_var; + if ( + (t_atom_var = t_atom_rule(p)) // t_atom + ) + { + D(fprintf(stderr, "%*c+ target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_atom")); + _res = t_atom_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_atom")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, target_type, _res); + D(p->level--); + return _res; +} + +// Left-recursive +// t_primary: +// | t_primary '.' NAME &t_lookahead +// | t_primary '[' slices ']' &t_lookahead +// | t_primary genexp &t_lookahead +// | t_primary '(' arguments? ')' &t_lookahead +// | atom &t_lookahead +static expr_ty t_primary_raw(Parser *); +static expr_ty +t_primary_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, t_primary_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_8 = _PyPegen_update_memo(p, _mark, t_primary_type, _res); + if (tmpvar_8) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = t_primary_raw(p); + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +t_primary_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // t_primary '.' NAME &t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME &t_lookahead")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + && + _PyPegen_lookahead(1, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ t_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME &t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '.' NAME &t_lookahead")); + } + { // t_primary '[' slices ']' &t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' &t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + && + _PyPegen_lookahead(1, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ t_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' &t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '[' slices ']' &t_lookahead")); + } + { // t_primary genexp &t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary genexp &t_lookahead")); + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (b = genexp_rule(p)) // genexp + && + _PyPegen_lookahead(1, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ t_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary genexp &t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Call ( a , CHECK ( _PyPegen_singleton_seq ( p , b ) ) , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary genexp &t_lookahead")); + } + { // t_primary '(' arguments? ')' &t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '(' arguments? ')' &t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + void *b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (b = arguments_rule(p), 1) // arguments? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + _PyPegen_lookahead(1, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ t_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '(' arguments? ')' &t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Call ( a , ( b ) ? ( ( expr_ty ) b ) -> v . Call . args : NULL , ( b ) ? ( ( expr_ty ) b ) -> v . Call . keywords : NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '(' arguments? ')' &t_lookahead")); + } + { // atom &t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "atom &t_lookahead")); + expr_ty a; + if ( + (a = atom_rule(p)) // atom + && + _PyPegen_lookahead(1, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ t_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "atom &t_lookahead")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "atom &t_lookahead")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// t_lookahead: '(' | '[' | '.' +static void * +t_lookahead_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '(' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_lookahead[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + ) + { + D(fprintf(stderr, "%*c+ t_lookahead[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_lookahead[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); + } + { // '[' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_lookahead[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + ) + { + D(fprintf(stderr, "%*c+ t_lookahead[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_lookahead[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); + } + { // '.' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_lookahead[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ t_lookahead[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_lookahead[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// t_atom: NAME | '(' target ')' | '(' targets? ')' | '[' targets? ']' +static expr_ty +t_atom_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty a; + if ( + (a = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = _PyPegen_set_expr_context ( p , a , Store ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + { // '(' target ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' target ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = target_rule(p)) // target + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' target ')'")); + _res = _PyPegen_set_expr_context ( p , a , Store ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' target ')'")); + } + { // '(' targets? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' targets? ')'")); + Token * _literal; + Token * _literal_1; + void *b; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (b = targets_rule(p), 1) // targets? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' targets? ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( b , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' targets? ')'")); + } + { // '[' targets? ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' targets? ']'")); + Token * _literal; + Token * _literal_1; + void *b; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = targets_rule(p), 1) // targets? + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' targets? ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_List ( b , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' targets? ']'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// incorrect_arguments: +// | args ',' '*' +// | expression for_if_clauses ',' [args | expression for_if_clauses] +// | args for_if_clauses +// | args ',' expression for_if_clauses +// | args ',' args +static void * +incorrect_arguments_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // args ',' '*' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> incorrect_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' '*'")); + Token * _literal; + Token * _literal_1; + expr_ty args_var; + if ( + (args_var = args_rule(p)) // args + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_1 = _PyPegen_expect_token(p, 16)) // token='*' + ) + { + D(fprintf(stderr, "%*c+ incorrect_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' '*'")); + _res = RAISE_SYNTAX_ERROR ( "iterable argument unpacking follows keyword argument unpacking" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s incorrect_arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ',' '*'")); + } + { // expression for_if_clauses ',' [args | expression for_if_clauses] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> incorrect_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + asdl_seq* for_if_clauses_var; + if ( + (a = expression_rule(p)) // expression + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_opt_var = _tmp_127_rule(p), 1) // [args | expression for_if_clauses] + ) + { + D(fprintf(stderr, "%*c+ incorrect_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "Generator expression must be parenthesized" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s incorrect_arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); + } + { // args for_if_clauses + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> incorrect_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args for_if_clauses")); + expr_ty a; + asdl_seq* for_if_clauses_var; + if ( + (a = args_rule(p)) // args + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + ) + { + D(fprintf(stderr, "%*c+ incorrect_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args for_if_clauses")); + _res = _PyPegen_nonparen_genexp_in_call ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s incorrect_arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args for_if_clauses")); + } + { // args ',' expression for_if_clauses + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> incorrect_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' expression for_if_clauses")); + Token * _literal; + expr_ty a; + expr_ty args_var; + asdl_seq* for_if_clauses_var; + if ( + (args_var = args_rule(p)) // args + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (a = expression_rule(p)) // expression + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + ) + { + D(fprintf(stderr, "%*c+ incorrect_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' expression for_if_clauses")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "Generator expression must be parenthesized" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s incorrect_arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ',' expression for_if_clauses")); + } + { // args ',' args + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> incorrect_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' args")); + Token * _literal; + expr_ty a; + expr_ty args_var; + if ( + (a = args_rule(p)) // args + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (args_var = args_rule(p)) // args + ) + { + D(fprintf(stderr, "%*c+ incorrect_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' args")); + _res = _PyPegen_arguments_parsing_error ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s incorrect_arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ',' args")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_kwarg: expression '=' +static void * +invalid_kwarg_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // expression '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_kwarg[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression '='")); + Token * _literal; + expr_ty a; + if ( + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ invalid_kwarg[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression '='")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "expression cannot contain assignment, perhaps you meant \"==\"?" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_kwarg[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression '='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_named_expression: expression ':=' expression +static void * +invalid_named_expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // expression ':=' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ':=' expression")); + Token * _literal; + expr_ty a; + expr_ty expression_var; + if ( + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 53)) // token=':=' + && + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ invalid_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':=' expression")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "cannot use assignment expressions with %s" , _PyPegen_get_expr_name ( a ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ':=' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_assignment: +// | invalid_ann_assign_target ':' expression +// | star_named_expression ',' star_named_expressions* ':' expression +// | expression ':' expression +// | ((star_targets '='))* star_expressions '=' +// | ((star_targets '='))* yield_expr '=' +// | star_expressions augassign (yield_expr | star_expressions) +static void * +invalid_assignment_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // invalid_ann_assign_target ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_ann_assign_target ':' expression")); + Token * _literal; + expr_ty a; + expr_ty expression_var; + if ( + (a = invalid_ann_assign_target_rule(p)) // invalid_ann_assign_target + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_ann_assign_target ':' expression")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "only single target (not %s) can be annotated" , _PyPegen_get_expr_name ( a ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_ann_assign_target ':' expression")); + } + { // star_named_expression ',' star_named_expressions* ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); + Token * _literal; + Token * _literal_1; + asdl_seq * _loop0_128_var; + expr_ty a; + expr_ty expression_var; + if ( + (a = star_named_expression_rule(p)) // star_named_expression + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_loop0_128_var = _loop0_128_rule(p)) // star_named_expressions* + && + (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' + && + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "only single target (not tuple) can be annotated" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); + } + { // expression ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ':' expression")); + Token * _literal; + expr_ty a; + expr_ty expression_var; + if ( + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' expression")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "illegal target for annotation" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ':' expression")); + } + { // ((star_targets '='))* star_expressions '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* star_expressions '='")); + Token * _literal; + asdl_seq * _loop0_129_var; + expr_ty a; + if ( + (_loop0_129_var = _loop0_129_rule(p)) // ((star_targets '='))* + && + (a = star_expressions_rule(p)) // star_expressions + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* star_expressions '='")); + _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( STAR_TARGETS , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((star_targets '='))* star_expressions '='")); + } + { // ((star_targets '='))* yield_expr '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* yield_expr '='")); + Token * _literal; + asdl_seq * _loop0_130_var; + expr_ty a; + if ( + (_loop0_130_var = _loop0_130_rule(p)) // ((star_targets '='))* + && + (a = yield_expr_rule(p)) // yield_expr + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* yield_expr '='")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "assignment to yield expression not possible" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((star_targets '='))* yield_expr '='")); + } + { // star_expressions augassign (yield_expr | star_expressions) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); + void *_tmp_131_var; + expr_ty a; + AugOperator* augassign_var; + if ( + (a = star_expressions_rule(p)) // star_expressions + && + (augassign_var = augassign_rule(p)) // augassign + && + (_tmp_131_var = _tmp_131_rule(p)) // yield_expr | star_expressions + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "'%s' is an illegal expression for augmented assignment" , _PyPegen_get_expr_name ( a ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_ann_assign_target: list | tuple | '(' invalid_ann_assign_target ')' +static expr_ty +invalid_ann_assign_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // list + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_ann_assign_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + expr_ty list_var; + if ( + (list_var = list_rule(p)) // list + ) + { + D(fprintf(stderr, "%*c+ invalid_ann_assign_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + _res = list_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_ann_assign_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); + } + { // tuple + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_ann_assign_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + expr_ty tuple_var; + if ( + (tuple_var = tuple_rule(p)) // tuple + ) + { + D(fprintf(stderr, "%*c+ invalid_ann_assign_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + _res = tuple_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_ann_assign_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); + } + { // '(' invalid_ann_assign_target ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_ann_assign_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' invalid_ann_assign_target ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = invalid_ann_assign_target_rule(p)) // invalid_ann_assign_target + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ invalid_ann_assign_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' invalid_ann_assign_target ')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_ann_assign_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' invalid_ann_assign_target ')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_del_stmt: 'del' star_expressions +static void * +invalid_del_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'del' star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_del_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'del' star_expressions")); + Token * _keyword; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 503)) // token='del' + && + (a = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ invalid_del_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'del' star_expressions")); + _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( DEL_TARGETS , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_del_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'del' star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_block: NEWLINE !INDENT +static void * +invalid_block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // NEWLINE !INDENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE !INDENT")); + Token * newline_var; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, INDENT) // token=INDENT + ) + { + D(fprintf(stderr, "%*c+ invalid_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE !INDENT")); + _res = RAISE_INDENTATION_ERROR ( "expected an indented block" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE !INDENT")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_comprehension: ('[' | '(' | '{') starred_expression for_if_clauses +static void * +invalid_comprehension_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ('[' | '(' | '{') starred_expression for_if_clauses + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); + void *_tmp_132_var; + expr_ty a; + asdl_seq* for_if_clauses_var; + if ( + (_tmp_132_var = _tmp_132_rule(p)) // '[' | '(' | '{' + && + (a = starred_expression_rule(p)) // starred_expression + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + ) + { + D(fprintf(stderr, "%*c+ invalid_comprehension[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "iterable unpacking cannot be used in comprehension" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_comprehension[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_dict_comprehension: '{' '**' bitwise_or for_if_clauses '}' +static void * +invalid_dict_comprehension_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '{' '**' bitwise_or for_if_clauses '}' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_dict_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' '**' bitwise_or for_if_clauses '}'")); + Token * _literal; + Token * _literal_1; + Token * a; + expr_ty bitwise_or_var; + asdl_seq* for_if_clauses_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _PyPegen_expect_token(p, 35)) // token='**' + && + (bitwise_or_var = bitwise_or_rule(p)) // bitwise_or + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ invalid_dict_comprehension[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' '**' bitwise_or for_if_clauses '}'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "dict unpacking cannot be used in dict comprehension" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_dict_comprehension[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' '**' bitwise_or for_if_clauses '}'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_parameters: +// | param_no_default* (slash_with_default | param_with_default+) param_no_default +static void * +invalid_parameters_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // param_no_default* (slash_with_default | param_with_default+) param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* (slash_with_default | param_with_default+) param_no_default")); + asdl_seq * _loop0_133_var; + void *_tmp_134_var; + arg_ty param_no_default_var; + if ( + (_loop0_133_var = _loop0_133_rule(p)) // param_no_default* + && + (_tmp_134_var = _tmp_134_rule(p)) // slash_with_default | param_with_default+ + && + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + D(fprintf(stderr, "%*c+ invalid_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default* (slash_with_default | param_with_default+) param_no_default")); + _res = RAISE_SYNTAX_ERROR ( "non-default argument follows default argument" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default* (slash_with_default | param_with_default+) param_no_default")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_lambda_parameters: +// | lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default +static void * +invalid_lambda_parameters_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default")); + asdl_seq * _loop0_135_var; + void *_tmp_136_var; + arg_ty lambda_param_no_default_var; + if ( + (_loop0_135_var = _loop0_135_rule(p)) // lambda_param_no_default* + && + (_tmp_136_var = _tmp_136_rule(p)) // lambda_slash_with_default | lambda_param_with_default+ + && + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + D(fprintf(stderr, "%*c+ invalid_lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default")); + _res = RAISE_SYNTAX_ERROR ( "non-default argument follows default argument" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_star_etc: '*' (')' | ',' (')' | '**')) | '*' ',' TYPE_COMMENT +static void * +invalid_star_etc_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '*' (')' | ',' (')' | '**')) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); + Token * _literal; + void *_tmp_137_var; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (_tmp_137_var = _tmp_137_rule(p)) // ')' | ',' (')' | '**') + ) + { + D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); + _res = RAISE_SYNTAX_ERROR ( "named arguments must follow bare *" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); + } + { // '*' ',' TYPE_COMMENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' ',' TYPE_COMMENT")); + Token * _literal; + Token * _literal_1; + Token * type_comment_var; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + && + (type_comment_var = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' + ) + { + D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' ',' TYPE_COMMENT")); + _res = RAISE_SYNTAX_ERROR ( "bare * has associated type comment" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' ',' TYPE_COMMENT")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_lambda_star_etc: '*' (':' | ',' (':' | '**')) +static void * +invalid_lambda_star_etc_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '*' (':' | ',' (':' | '**')) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); + Token * _literal; + void *_tmp_138_var; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (_tmp_138_var = _tmp_138_rule(p)) // ':' | ',' (':' | '**') + ) + { + D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); + _res = RAISE_SYNTAX_ERROR ( "named arguments must follow bare *" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_lambda_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_double_type_comments: TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT +static void * +invalid_double_type_comments_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_double_type_comments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT")); + Token * indent_var; + Token * newline_var; + Token * newline_var_1; + Token * type_comment_var; + Token * type_comment_var_1; + if ( + (type_comment_var = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' + && + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + (type_comment_var_1 = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' + && + (newline_var_1 = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' + ) + { + D(fprintf(stderr, "%*c+ invalid_double_type_comments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT")); + _res = RAISE_SYNTAX_ERROR ( "Cannot have two type comments on def" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_double_type_comments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_with_item: expression 'as' expression +static void * +invalid_with_item_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // expression 'as' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression 'as' expression")); + Token * _keyword; + expr_ty a; + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression + && + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ invalid_with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' expression")); + _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( STAR_TARGETS , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_with_item[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression 'as' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_for_target: ASYNC? 'for' star_expressions +static void * +invalid_for_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ASYNC? 'for' star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_for_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'for' star_expressions")); + Token * _keyword; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + if ( + (_opt_var = _PyPegen_expect_token(p, ASYNC), 1) // ASYNC? + && + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + && + (a = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ invalid_for_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC? 'for' star_expressions")); + _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( FOR_TARGETS , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_for_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC? 'for' star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_group: '(' starred_expression ')' +static void * +invalid_group_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '(' starred_expression ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_group[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' starred_expression ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = starred_expression_rule(p)) // starred_expression + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ invalid_group[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' starred_expression ')'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "can't use starred expression here" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_group[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' starred_expression ')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_import_from_targets: import_from_as_names ',' +static void * +invalid_import_from_targets_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // import_from_as_names ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_names ','")); + Token * _literal; + asdl_seq* import_from_as_names_var; + if ( + (import_from_as_names_var = import_from_as_names_rule(p)) // import_from_as_names + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ invalid_import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_names ','")); + _res = RAISE_SYNTAX_ERROR ( "trailing comma not allowed without surrounding parentheses" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_import_from_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_names ','")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_1: NEWLINE +static asdl_seq * +_loop0_1_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_1[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + Token * newline_var; + while ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + _res = newline_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_1[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_1_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_2: NEWLINE +static asdl_seq * +_loop0_2_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_2[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + Token * newline_var; + while ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + _res = newline_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_2[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_2_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_4: ',' expression +static asdl_seq * +_loop0_4_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_4[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = expression_rule(p)) // expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_4[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_4_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_3: expression _loop0_4 +static asdl_seq * +_gather_3_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // expression _loop0_4 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_3[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_4")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = expression_rule(p)) // expression + && + (seq = _loop0_4_rule(p)) // _loop0_4 + ) + { + D(fprintf(stderr, "%*c+ _gather_3[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_4")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_3[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_4")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_6: ',' expression +static asdl_seq * +_loop0_6_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = expression_rule(p)) // expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_6[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_6_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_5: expression _loop0_6 +static asdl_seq * +_gather_5_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // expression _loop0_6 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_5[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_6")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = expression_rule(p)) // expression + && + (seq = _loop0_6_rule(p)) // _loop0_6 + ) + { + D(fprintf(stderr, "%*c+ _gather_5[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_6")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_5[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_6")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_8: ',' expression +static asdl_seq * +_loop0_8_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = expression_rule(p)) // expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_8[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_8_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_7: expression _loop0_8 +static asdl_seq * +_gather_7_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // expression _loop0_8 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_8")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = expression_rule(p)) // expression + && + (seq = _loop0_8_rule(p)) // _loop0_8 + ) + { + D(fprintf(stderr, "%*c+ _gather_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_8")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_7[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_8")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_10: ',' expression +static asdl_seq * +_loop0_10_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = expression_rule(p)) // expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_10[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_10_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_9: expression _loop0_10 +static asdl_seq * +_gather_9_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // expression _loop0_10 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_10")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = expression_rule(p)) // expression + && + (seq = _loop0_10_rule(p)) // _loop0_10 + ) + { + D(fprintf(stderr, "%*c+ _gather_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_10")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_9[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_10")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_11: statement +static asdl_seq * +_loop1_11_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // statement + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement")); + asdl_seq* statement_var; + while ( + (statement_var = statement_rule(p)) // statement + ) + { + _res = statement_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_11[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statement")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_11_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_13: ';' small_stmt +static asdl_seq * +_loop0_13_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ';' small_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';' small_stmt")); + Token * _literal; + stmt_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 13)) // token=';' + && + (elem = small_stmt_rule(p)) // small_stmt + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_13[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';' small_stmt")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_13_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_12: small_stmt _loop0_13 +static asdl_seq * +_gather_12_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // small_stmt _loop0_13 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "small_stmt _loop0_13")); + stmt_ty elem; + asdl_seq * seq; + if ( + (elem = small_stmt_rule(p)) // small_stmt + && + (seq = _loop0_13_rule(p)) // _loop0_13 + ) + { + D(fprintf(stderr, "%*c+ _gather_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "small_stmt _loop0_13")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_12[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "small_stmt _loop0_13")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_14: 'import' | 'from' +static void * +_tmp_14_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'import' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_14[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 513)) // token='import' + ) + { + D(fprintf(stderr, "%*c+ _tmp_14[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_14[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'import'")); + } + { // 'from' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_14[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 514)) // token='from' + ) + { + D(fprintf(stderr, "%*c+ _tmp_14[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_14[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_15: 'def' | '@' | ASYNC +static void * +_tmp_15_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'def' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 523)) // token='def' + ) + { + D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'def'")); + } + { // '@' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 49)) // token='@' + ) + { + D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'")); + } + { // ASYNC + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + Token * async_var; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + ) + { + D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + _res = async_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_16: 'class' | '@' +static void * +_tmp_16_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'class' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 524)) // token='class' + ) + { + D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'class'")); + } + { // '@' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 49)) // token='@' + ) + { + D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_17: 'with' | ASYNC +static void * +_tmp_17_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'with' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + ) + { + D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'with'")); + } + { // ASYNC + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + Token * async_var; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + ) + { + D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + _res = async_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_18: 'for' | ASYNC +static void * +_tmp_18_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'for' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + ) + { + D(fprintf(stderr, "%*c+ _tmp_18[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_18[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'for'")); + } + { // ASYNC + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + Token * async_var; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + ) + { + D(fprintf(stderr, "%*c+ _tmp_18[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + _res = async_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_18[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_19: '=' annotated_rhs +static void * +_tmp_19_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '=' annotated_rhs + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_19[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + Token * _literal; + expr_ty d; + if ( + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + && + (d = annotated_rhs_rule(p)) // annotated_rhs + ) + { + D(fprintf(stderr, "%*c+ _tmp_19[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + _res = d; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_19[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' annotated_rhs")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_20: '(' single_target ')' | single_subscript_attribute_target +static void * +_tmp_20_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '(' single_target ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_20[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + Token * _literal; + Token * _literal_1; + expr_ty b; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (b = single_target_rule(p)) // single_target + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ _tmp_20[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + _res = b; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_20[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' single_target ')'")); + } + { // single_subscript_attribute_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_20[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + expr_ty single_subscript_attribute_target_var; + if ( + (single_subscript_attribute_target_var = single_subscript_attribute_target_rule(p)) // single_subscript_attribute_target + ) + { + D(fprintf(stderr, "%*c+ _tmp_20[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + _res = single_subscript_attribute_target_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_20[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "single_subscript_attribute_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_21: '=' annotated_rhs +static void * +_tmp_21_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '=' annotated_rhs + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_21[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + Token * _literal; + expr_ty d; + if ( + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + && + (d = annotated_rhs_rule(p)) // annotated_rhs + ) + { + D(fprintf(stderr, "%*c+ _tmp_21[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + _res = d; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_21[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' annotated_rhs")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_22: (star_targets '=') +static asdl_seq * +_loop1_22_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (star_targets '=') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_139_var; + while ( + (_tmp_139_var = _tmp_139_rule(p)) // star_targets '=' + ) + { + _res = _tmp_139_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_22[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_22_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_23: yield_expr | star_expressions +static void * +_tmp_23_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_24: yield_expr | star_expressions +static void * +_tmp_24_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_24[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_24[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_24[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_24[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_24[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_24[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_26: ',' NAME +static asdl_seq * +_loop0_26_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_26[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = _PyPegen_name_token(p)) // NAME + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_26[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_26_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_25: NAME _loop0_26 +static asdl_seq * +_gather_25_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // NAME _loop0_26 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_25[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_26")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = _PyPegen_name_token(p)) // NAME + && + (seq = _loop0_26_rule(p)) // _loop0_26 + ) + { + D(fprintf(stderr, "%*c+ _gather_25[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_26")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_25[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_26")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_28: ',' NAME +static asdl_seq * +_loop0_28_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_28[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = _PyPegen_name_token(p)) // NAME + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_28[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_28_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_27: NAME _loop0_28 +static asdl_seq * +_gather_27_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // NAME _loop0_28 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_27[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_28")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = _PyPegen_name_token(p)) // NAME + && + (seq = _loop0_28_rule(p)) // _loop0_28 + ) + { + D(fprintf(stderr, "%*c+ _gather_27[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_28")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_27[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_28")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_29: ',' expression +static void * +_tmp_29_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_29[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty z; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (z = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_29[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_29[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_30: ';' | NEWLINE +static void * +_tmp_30_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ';' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_30[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 13)) // token=';' + ) + { + D(fprintf(stderr, "%*c+ _tmp_30[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_30[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';'")); + } + { // NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_30[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + Token * newline_var; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ _tmp_30[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + _res = newline_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_30[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_31: ('.' | '...') +static asdl_seq * +_loop0_31_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('.' | '...') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); + void *_tmp_140_var; + while ( + (_tmp_140_var = _tmp_140_rule(p)) // '.' | '...' + ) + { + _res = _tmp_140_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_31[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_31_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_32: ('.' | '...') +static asdl_seq * +_loop1_32_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('.' | '...') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); + void *_tmp_141_var; + while ( + (_tmp_141_var = _tmp_141_rule(p)) // '.' | '...' + ) + { + _res = _tmp_141_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_32[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_32_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_34: ',' import_from_as_name +static asdl_seq * +_loop0_34_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' import_from_as_name + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_34[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' import_from_as_name")); + Token * _literal; + alias_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = import_from_as_name_rule(p)) // import_from_as_name + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_34[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' import_from_as_name")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_34_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_33: import_from_as_name _loop0_34 +static asdl_seq * +_gather_33_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // import_from_as_name _loop0_34 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_33[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_34")); + alias_ty elem; + asdl_seq * seq; + if ( + (elem = import_from_as_name_rule(p)) // import_from_as_name + && + (seq = _loop0_34_rule(p)) // _loop0_34 + ) + { + D(fprintf(stderr, "%*c+ _gather_33[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_34")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_33[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_name _loop0_34")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_35: 'as' NAME +static void * +_tmp_35_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_35[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (z = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_35[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_35[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_37: ',' dotted_as_name +static asdl_seq * +_loop0_37_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' dotted_as_name + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_37[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_as_name")); + Token * _literal; + alias_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = dotted_as_name_rule(p)) // dotted_as_name + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_37[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_as_name")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_37_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_36: dotted_as_name _loop0_37 +static asdl_seq * +_gather_36_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // dotted_as_name _loop0_37 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_36[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_37")); + alias_ty elem; + asdl_seq * seq; + if ( + (elem = dotted_as_name_rule(p)) // dotted_as_name + && + (seq = _loop0_37_rule(p)) // _loop0_37 + ) + { + D(fprintf(stderr, "%*c+ _gather_36[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_37")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_36[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_as_name _loop0_37")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_38: 'as' NAME +static void * +_tmp_38_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_38[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (z = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_38[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_38[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_40: ',' with_item +static asdl_seq * +_loop0_40_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' with_item + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_40[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + Token * _literal; + withitem_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = with_item_rule(p)) // with_item + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_40[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_40_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_39: with_item _loop0_40 +static asdl_seq * +_gather_39_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // with_item _loop0_40 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_39[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_40")); + withitem_ty elem; + asdl_seq * seq; + if ( + (elem = with_item_rule(p)) // with_item + && + (seq = _loop0_40_rule(p)) // _loop0_40 + ) + { + D(fprintf(stderr, "%*c+ _gather_39[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_40")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_39[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_40")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_42: ',' with_item +static asdl_seq * +_loop0_42_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' with_item + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_42[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + Token * _literal; + withitem_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = with_item_rule(p)) // with_item + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_42[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_42_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_41: with_item _loop0_42 +static asdl_seq * +_gather_41_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // with_item _loop0_42 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_41[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_42")); + withitem_ty elem; + asdl_seq * seq; + if ( + (elem = with_item_rule(p)) // with_item + && + (seq = _loop0_42_rule(p)) // _loop0_42 + ) + { + D(fprintf(stderr, "%*c+ _gather_41[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_42")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_41[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_42")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_44: ',' with_item +static asdl_seq * +_loop0_44_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' with_item + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_44[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + Token * _literal; + withitem_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = with_item_rule(p)) // with_item + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_44[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_44_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_43: with_item _loop0_44 +static asdl_seq * +_gather_43_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // with_item _loop0_44 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_44")); + withitem_ty elem; + asdl_seq * seq; + if ( + (elem = with_item_rule(p)) // with_item + && + (seq = _loop0_44_rule(p)) // _loop0_44 + ) + { + D(fprintf(stderr, "%*c+ _gather_43[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_44")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_43[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_44")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_46: ',' with_item +static asdl_seq * +_loop0_46_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' with_item + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_46[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + Token * _literal; + withitem_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = with_item_rule(p)) // with_item + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_46[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_46_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_45: with_item _loop0_46 +static asdl_seq * +_gather_45_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // with_item _loop0_46 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_45[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_46")); + withitem_ty elem; + asdl_seq * seq; + if ( + (elem = with_item_rule(p)) // with_item + && + (seq = _loop0_46_rule(p)) // _loop0_46 + ) + { + D(fprintf(stderr, "%*c+ _gather_45[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_46")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_45[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_46")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_47: ',' | ')' | ':' +static void * +_tmp_47_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ _tmp_47[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_47[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); + } + { // ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ _tmp_47[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_47[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); + } + { // ':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_47[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_47[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_48: except_block +static asdl_seq * +_loop1_48_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // except_block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_48[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); + excepthandler_ty except_block_var; + while ( + (except_block_var = except_block_rule(p)) // except_block + ) + { + _res = except_block_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_48[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_48_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_49: 'as' NAME +static void * +_tmp_49_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_49[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (z = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_49[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_49[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_50: 'from' expression +static void * +_tmp_50_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'from' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_50[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' expression")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 514)) // token='from' + && + (z = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_50[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' expression")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_50[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_51: '->' expression +static void * +_tmp_51_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '->' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_51[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + Token * _literal; + expr_ty z; + if ( + (_literal = _PyPegen_expect_token(p, 51)) // token='->' + && + (z = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_51[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_51[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_52: '->' expression +static void * +_tmp_52_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '->' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_52[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + Token * _literal; + expr_ty z; + if ( + (_literal = _PyPegen_expect_token(p, 51)) // token='->' + && + (z = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_52[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_52[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_53: NEWLINE INDENT +static void * +_tmp_53_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // NEWLINE INDENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_53[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); + Token * indent_var; + Token * newline_var; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' + ) + { + D(fprintf(stderr, "%*c+ _tmp_53[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); + _res = _PyPegen_dummy_name(p, newline_var, indent_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_53[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE INDENT")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_54: param_no_default +static asdl_seq * +_loop0_54_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_54[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_54[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_54_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_55: param_with_default +static asdl_seq * +_loop0_55_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_55[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_55[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_55_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_56: param_with_default +static asdl_seq * +_loop0_56_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_56[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_56[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_56_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_57: param_no_default +static asdl_seq * +_loop1_57_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_57[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_57[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_57_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_58: param_with_default +static asdl_seq * +_loop0_58_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_58[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_58[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_58_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_59: param_with_default +static asdl_seq * +_loop1_59_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_59[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_59_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_60: param_no_default +static asdl_seq * +_loop1_60_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_60[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_60_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_61: param_no_default +static asdl_seq * +_loop1_61_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_61[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_61[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_61_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_62: param_no_default +static asdl_seq * +_loop0_62_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_62[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_62[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_62_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_63: param_with_default +static asdl_seq * +_loop1_63_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_63[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_63[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_63_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_64: param_no_default +static asdl_seq * +_loop0_64_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_64[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_64[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_64_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_65: param_with_default +static asdl_seq * +_loop1_65_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_65[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_65[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_65_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_66: param_maybe_default +static asdl_seq * +_loop0_66_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_maybe_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_66[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + NameDefaultPair* param_maybe_default_var; + while ( + (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default + ) + { + _res = param_maybe_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_66[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_66_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_67: param_maybe_default +static asdl_seq * +_loop1_67_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_maybe_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_67[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + NameDefaultPair* param_maybe_default_var; + while ( + (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default + ) + { + _res = param_maybe_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_67[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_67_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_68: ('@' named_expression NEWLINE) +static asdl_seq * +_loop1_68_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('@' named_expression NEWLINE) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); + void *_tmp_142_var; + while ( + (_tmp_142_var = _tmp_142_rule(p)) // '@' named_expression NEWLINE + ) + { + _res = _tmp_142_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_68[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('@' named_expression NEWLINE)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_68_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_69: '(' arguments? ')' +static void * +_tmp_69_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '(' arguments? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + Token * _literal; + Token * _literal_1; + void *z; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (z = arguments_rule(p), 1) // arguments? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' arguments? ')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_71: ',' star_expression +static asdl_seq * +_loop0_71_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' star_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = star_expression_rule(p)) // star_expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_71[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_71_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_70: star_expression _loop0_71 +static asdl_seq * +_gather_70_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // star_expression _loop0_71 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expression _loop0_71")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = star_expression_rule(p)) // star_expression + && + (seq = _loop0_71_rule(p)) // _loop0_71 + ) + { + D(fprintf(stderr, "%*c+ _gather_70[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expression _loop0_71")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_70[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expression _loop0_71")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_72: (',' star_expression) +static asdl_seq * +_loop1_72_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (',' star_expression) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); + void *_tmp_143_var; + while ( + (_tmp_143_var = _tmp_143_rule(p)) // ',' star_expression + ) + { + _res = _tmp_143_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_72[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_expression)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_72_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_74: ',' star_named_expression +static asdl_seq * +_loop0_74_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' star_named_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_74[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = star_named_expression_rule(p)) // star_named_expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_74[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_74_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_73: star_named_expression _loop0_74 +static asdl_seq * +_gather_73_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // star_named_expression _loop0_74 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_74")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = star_named_expression_rule(p)) // star_named_expression + && + (seq = _loop0_74_rule(p)) // _loop0_74 + ) + { + D(fprintf(stderr, "%*c+ _gather_73[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_74")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_73[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_74")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_75: (',' expression) +static asdl_seq * +_loop1_75_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (',' expression) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); + void *_tmp_144_var; + while ( + (_tmp_144_var = _tmp_144_rule(p)) // ',' expression + ) + { + _res = _tmp_144_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_75[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' expression)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_75_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_76: lambda_param_no_default +static asdl_seq * +_loop0_76_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_76[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_76_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_77: lambda_param_with_default +static asdl_seq * +_loop0_77_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_77[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_77_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_78: lambda_param_with_default +static asdl_seq * +_loop0_78_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_78[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_78_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_79: lambda_param_no_default +static asdl_seq * +_loop1_79_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_79[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_79_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_80: lambda_param_with_default +static asdl_seq * +_loop0_80_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_80[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_80_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_81: lambda_param_with_default +static asdl_seq * +_loop1_81_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_81[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_81_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_82: lambda_param_no_default +static asdl_seq * +_loop1_82_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_82[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_82_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_83: lambda_param_no_default +static asdl_seq * +_loop1_83_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_83[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_83_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_84: lambda_param_no_default +static asdl_seq * +_loop0_84_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_84[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_84_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_85: lambda_param_with_default +static asdl_seq * +_loop1_85_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_85[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_85_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_86: lambda_param_no_default +static asdl_seq * +_loop0_86_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_86[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_86_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_87: lambda_param_with_default +static asdl_seq * +_loop1_87_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_87[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_87_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_88: lambda_param_maybe_default +static asdl_seq * +_loop0_88_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_maybe_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + NameDefaultPair* lambda_param_maybe_default_var; + while ( + (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default + ) + { + _res = lambda_param_maybe_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_88[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_88_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_89: lambda_param_maybe_default +static asdl_seq * +_loop1_89_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_maybe_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + NameDefaultPair* lambda_param_maybe_default_var; + while ( + (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default + ) + { + _res = lambda_param_maybe_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_89[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_89_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_90: ('or' conjunction) +static asdl_seq * +_loop1_90_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('or' conjunction) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); + void *_tmp_145_var; + while ( + (_tmp_145_var = _tmp_145_rule(p)) // 'or' conjunction + ) + { + _res = _tmp_145_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_90[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('or' conjunction)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_90_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_91: ('and' inversion) +static asdl_seq * +_loop1_91_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('and' inversion) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); + void *_tmp_146_var; + while ( + (_tmp_146_var = _tmp_146_rule(p)) // 'and' inversion + ) + { + _res = _tmp_146_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_91[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('and' inversion)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_91_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_92: compare_op_bitwise_or_pair +static asdl_seq * +_loop1_92_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // compare_op_bitwise_or_pair + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compare_op_bitwise_or_pair")); + CmpopExprPair* compare_op_bitwise_or_pair_var; + while ( + (compare_op_bitwise_or_pair_var = compare_op_bitwise_or_pair_rule(p)) // compare_op_bitwise_or_pair + ) + { + _res = compare_op_bitwise_or_pair_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_92[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compare_op_bitwise_or_pair")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_92_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_93: '!=' +static void * +_tmp_93_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='")); + Token * tok; + if ( + (tok = _PyPegen_expect_token(p, 28)) // token='!=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='")); + _res = _PyPegen_check_barry_as_flufl ( p ) ? NULL : tok; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_95: ',' slice +static asdl_seq * +_loop0_95_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' slice + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' slice")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = slice_rule(p)) // slice + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_95[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' slice")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_95_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_94: slice _loop0_95 +static asdl_seq * +_gather_94_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // slice _loop0_95 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice _loop0_95")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = slice_rule(p)) // slice + && + (seq = _loop0_95_rule(p)) // _loop0_95 + ) + { + D(fprintf(stderr, "%*c+ _gather_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice _loop0_95")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_94[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slice _loop0_95")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_96: ':' expression? +static void * +_tmp_96_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ':' expression? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?")); + Token * _literal; + void *d; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (d = expression_rule(p), 1) // expression? + ) + { + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?")); + _res = d; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' expression?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_97: tuple | group | genexp +static void * +_tmp_97_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // tuple + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + expr_ty tuple_var; + if ( + (tuple_var = tuple_rule(p)) // tuple + ) + { + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + _res = tuple_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); + } + { // group + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "group")); + expr_ty group_var; + if ( + (group_var = group_rule(p)) // group + ) + { + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "group")); + _res = group_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "group")); + } + { // genexp + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); + expr_ty genexp_var; + if ( + (genexp_var = genexp_rule(p)) // genexp + ) + { + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); + _res = genexp_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "genexp")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_98: list | listcomp +static void * +_tmp_98_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // list + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + expr_ty list_var; + if ( + (list_var = list_rule(p)) // list + ) + { + D(fprintf(stderr, "%*c+ _tmp_98[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + _res = list_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_98[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); + } + { // listcomp + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "listcomp")); + expr_ty listcomp_var; + if ( + (listcomp_var = listcomp_rule(p)) // listcomp + ) + { + D(fprintf(stderr, "%*c+ _tmp_98[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "listcomp")); + _res = listcomp_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_98[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "listcomp")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_99: dict | set | dictcomp | setcomp +static void * +_tmp_99_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // dict + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dict")); + expr_ty dict_var; + if ( + (dict_var = dict_rule(p)) // dict + ) + { + D(fprintf(stderr, "%*c+ _tmp_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dict")); + _res = dict_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_99[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dict")); + } + { // set + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "set")); + expr_ty set_var; + if ( + (set_var = set_rule(p)) // set + ) + { + D(fprintf(stderr, "%*c+ _tmp_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "set")); + _res = set_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_99[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "set")); + } + { // dictcomp + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dictcomp")); + expr_ty dictcomp_var; + if ( + (dictcomp_var = dictcomp_rule(p)) // dictcomp + ) + { + D(fprintf(stderr, "%*c+ _tmp_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dictcomp")); + _res = dictcomp_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_99[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dictcomp")); + } + { // setcomp + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "setcomp")); + expr_ty setcomp_var; + if ( + (setcomp_var = setcomp_rule(p)) // setcomp + ) + { + D(fprintf(stderr, "%*c+ _tmp_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "setcomp")); + _res = setcomp_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_99[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "setcomp")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_100: STRING +static asdl_seq * +_loop1_100_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // STRING + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); + expr_ty string_var; + while ( + (string_var = _PyPegen_string_token(p)) // STRING + ) + { + _res = string_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_100[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_100_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_101: star_named_expression ',' star_named_expressions? +static void * +_tmp_101_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // star_named_expression ',' star_named_expressions? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + Token * _literal; + expr_ty y; + void *z; + if ( + (y = star_named_expression_rule(p)) // star_named_expression + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (z = star_named_expressions_rule(p), 1) // star_named_expressions? + ) + { + D(fprintf(stderr, "%*c+ _tmp_101[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + _res = _PyPegen_seq_insert_in_front ( p , y , z ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_101[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_102: yield_expr | named_expression +static void * +_tmp_102_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_102[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_102[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // named_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); + expr_ty named_expression_var; + if ( + (named_expression_var = named_expression_rule(p)) // named_expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_102[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); + _res = named_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_102[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_104: ',' double_starred_kvpair +static asdl_seq * +_loop0_104_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' double_starred_kvpair + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); + Token * _literal; + KeyValuePair* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_104[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_104_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_103: double_starred_kvpair _loop0_104 +static asdl_seq * +_gather_103_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // double_starred_kvpair _loop0_104 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_104")); + KeyValuePair* elem; + asdl_seq * seq; + if ( + (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair + && + (seq = _loop0_104_rule(p)) // _loop0_104 + ) + { + D(fprintf(stderr, "%*c+ _gather_103[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_104")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_103[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_104")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_105: for_if_clause +static asdl_seq * +_loop1_105_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // for_if_clause + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause")); + comprehension_ty for_if_clause_var; + while ( + (for_if_clause_var = for_if_clause_rule(p)) // for_if_clause + ) + { + _res = for_if_clause_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_105[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_105_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_106: ('if' disjunction) +static asdl_seq * +_loop0_106_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('if' disjunction) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); + void *_tmp_147_var; + while ( + (_tmp_147_var = _tmp_147_rule(p)) // 'if' disjunction + ) + { + _res = _tmp_147_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_106[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_106_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_107: ('if' disjunction) +static asdl_seq * +_loop0_107_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('if' disjunction) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); + void *_tmp_148_var; + while ( + (_tmp_148_var = _tmp_148_rule(p)) // 'if' disjunction + ) + { + _res = _tmp_148_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_107[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_107_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_109: ',' (starred_expression | named_expression !'=') +static asdl_seq * +_loop0_109_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' (starred_expression | named_expression !'=') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | named_expression !'=')")); + Token * _literal; + void *elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_109[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | named_expression !'=')")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_109_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_108: (starred_expression | named_expression !'=') _loop0_109 +static asdl_seq * +_gather_108_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // (starred_expression | named_expression !'=') _loop0_109 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_109")); + void *elem; + asdl_seq * seq; + if ( + (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' + && + (seq = _loop0_109_rule(p)) // _loop0_109 + ) + { + D(fprintf(stderr, "%*c+ _gather_108[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_109")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_108[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_109")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_110: ',' kwargs +static void * +_tmp_110_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' kwargs + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + Token * _literal; + asdl_seq* k; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (k = kwargs_rule(p)) // kwargs + ) + { + D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + _res = k; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_110[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwargs")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_112: ',' kwarg_or_starred +static asdl_seq * +_loop0_112_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' kwarg_or_starred + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_112[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_112_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_111: kwarg_or_starred _loop0_112 +static asdl_seq * +_gather_111_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_starred _loop0_112 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_112")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + && + (seq = _loop0_112_rule(p)) // _loop0_112 + ) + { + D(fprintf(stderr, "%*c+ _gather_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_112")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_111[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_112")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_114: ',' kwarg_or_double_starred +static asdl_seq * +_loop0_114_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' kwarg_or_double_starred + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_114[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_114_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_113: kwarg_or_double_starred _loop0_114 +static asdl_seq * +_gather_113_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_double_starred _loop0_114 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_114")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + && + (seq = _loop0_114_rule(p)) // _loop0_114 + ) + { + D(fprintf(stderr, "%*c+ _gather_113[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_114")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_113[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_114")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_116: ',' kwarg_or_starred +static asdl_seq * +_loop0_116_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' kwarg_or_starred + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_116[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_116_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_115: kwarg_or_starred _loop0_116 +static asdl_seq * +_gather_115_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_starred _loop0_116 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_116")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + && + (seq = _loop0_116_rule(p)) // _loop0_116 + ) + { + D(fprintf(stderr, "%*c+ _gather_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_116")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_115[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_116")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_118: ',' kwarg_or_double_starred +static asdl_seq * +_loop0_118_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' kwarg_or_double_starred + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_118[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_118_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_117: kwarg_or_double_starred _loop0_118 +static asdl_seq * +_gather_117_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_double_starred _loop0_118 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_118")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + && + (seq = _loop0_118_rule(p)) // _loop0_118 + ) + { + D(fprintf(stderr, "%*c+ _gather_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_118")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_117[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_118")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_119: (',' star_target) +static asdl_seq * +_loop0_119_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (',' star_target) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); + void *_tmp_150_var; + while ( + (_tmp_150_var = _tmp_150_rule(p)) // ',' star_target + ) + { + _res = _tmp_150_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_119[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_119_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_121: ',' star_target +static asdl_seq * +_loop0_121_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' star_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = star_target_rule(p)) // star_target + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_121[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_121_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_120: star_target _loop0_121 +static asdl_seq * +_gather_120_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // star_target _loop0_121 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_121")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = star_target_rule(p)) // star_target + && + (seq = _loop0_121_rule(p)) // _loop0_121 + ) + { + D(fprintf(stderr, "%*c+ _gather_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_121")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_120[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_121")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_122: !'*' star_target +static void * +_tmp_122_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // !'*' star_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + expr_ty star_target_var; + if ( + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 16) // token='*' + && + (star_target_var = star_target_rule(p)) // star_target + ) + { + D(fprintf(stderr, "%*c+ _tmp_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + _res = star_target_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_122[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "!'*' star_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_124: ',' del_target +static asdl_seq * +_loop0_124_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' del_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = del_target_rule(p)) // del_target + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_124[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' del_target")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_124_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_123: del_target _loop0_124 +static asdl_seq * +_gather_123_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // del_target _loop0_124 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_124")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = del_target_rule(p)) // del_target + && + (seq = _loop0_124_rule(p)) // _loop0_124 + ) + { + D(fprintf(stderr, "%*c+ _gather_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_124")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_123[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_124")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_126: ',' target +static asdl_seq * +_loop0_126_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' target")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = target_rule(p)) // target + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_126[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' target")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_126_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_125: target _loop0_126 +static asdl_seq * +_gather_125_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // target _loop0_126 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "target _loop0_126")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = target_rule(p)) // target + && + (seq = _loop0_126_rule(p)) // _loop0_126 + ) + { + D(fprintf(stderr, "%*c+ _gather_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "target _loop0_126")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_125[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "target _loop0_126")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_127: args | expression for_if_clauses +static void * +_tmp_127_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // args + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); + expr_ty args_var; + if ( + (args_var = args_rule(p)) // args + ) + { + D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); + _res = args_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args")); + } + { // expression for_if_clauses + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + expr_ty expression_var; + asdl_seq* for_if_clauses_var; + if ( + (expression_var = expression_rule(p)) // expression + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + ) + { + D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + _res = _PyPegen_dummy_name(p, expression_var, for_if_clauses_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression for_if_clauses")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_128: star_named_expressions +static asdl_seq * +_loop0_128_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // star_named_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); + asdl_seq* star_named_expressions_var; + while ( + (star_named_expressions_var = star_named_expressions_rule(p)) // star_named_expressions + ) + { + _res = star_named_expressions_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_128[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_128_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_129: (star_targets '=') +static asdl_seq * +_loop0_129_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (star_targets '=') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_151_var; + while ( + (_tmp_151_var = _tmp_151_rule(p)) // star_targets '=' + ) + { + _res = _tmp_151_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_129[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_129_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_130: (star_targets '=') +static asdl_seq * +_loop0_130_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (star_targets '=') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_152_var; + while ( + (_tmp_152_var = _tmp_152_rule(p)) // star_targets '=' + ) + { + _res = _tmp_152_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_130[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_130_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_131: yield_expr | star_expressions +static void * +_tmp_131_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_132: '[' | '(' | '{' +static void * +_tmp_132_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '[' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + ) + { + D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); + } + { // '(' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + ) + { + D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); + } + { // '{' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + ) + { + D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_133: param_no_default +static asdl_seq * +_loop0_133_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_133[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_133_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_134: slash_with_default | param_with_default+ +static void * +_tmp_134_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // slash_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + SlashWithDefault* slash_with_default_var; + if ( + (slash_with_default_var = slash_with_default_rule(p)) // slash_with_default + ) + { + D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + _res = slash_with_default_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default")); + } + { // param_with_default+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+")); + asdl_seq * _loop1_153_var; + if ( + (_loop1_153_var = _loop1_153_rule(p)) // param_with_default+ + ) + { + D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+")); + _res = _loop1_153_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_135: lambda_param_no_default +static asdl_seq * +_loop0_135_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_135[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_135_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_136: lambda_slash_with_default | lambda_param_with_default+ +static void * +_tmp_136_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // lambda_slash_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + SlashWithDefault* lambda_slash_with_default_var; + if ( + (lambda_slash_with_default_var = lambda_slash_with_default_rule(p)) // lambda_slash_with_default + ) + { + D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + _res = lambda_slash_with_default_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default")); + } + { // lambda_param_with_default+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); + asdl_seq * _loop1_154_var; + if ( + (_loop1_154_var = _loop1_154_rule(p)) // lambda_param_with_default+ + ) + { + D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); + _res = _loop1_154_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_137: ')' | ',' (')' | '**') +static void * +_tmp_137_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); + } + { // ',' (')' | '**') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + Token * _literal; + void *_tmp_155_var; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_tmp_155_var = _tmp_155_rule(p)) // ')' | '**' + ) + { + D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_155_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (')' | '**')")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_138: ':' | ',' (':' | '**') +static void * +_tmp_138_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // ',' (':' | '**') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + Token * _literal; + void *_tmp_156_var; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_tmp_156_var = _tmp_156_rule(p)) // ':' | '**' + ) + { + D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_156_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (':' | '**')")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_139: star_targets '=' +static void * +_tmp_139_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // star_targets '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + Token * _literal; + expr_ty z; + if ( + (z = star_targets_rule(p)) // star_targets + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_140: '.' | '...' +static void * +_tmp_140_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '.' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + } + { // '...' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 52)) // token='...' + ) + { + D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_141: '.' | '...' +static void * +_tmp_141_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '.' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + } + { // '...' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 52)) // token='...' + ) + { + D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_142: '@' named_expression NEWLINE +static void * +_tmp_142_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '@' named_expression NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + Token * _literal; + expr_ty f; + Token * newline_var; + if ( + (_literal = _PyPegen_expect_token(p, 49)) // token='@' + && + (f = named_expression_rule(p)) // named_expression + && + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ _tmp_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + _res = f; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_142[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_143: ',' star_expression +static void * +_tmp_143_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' star_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + Token * _literal; + expr_ty c; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (c = star_expression_rule(p)) // star_expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + _res = c; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_144: ',' expression +static void * +_tmp_144_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty c; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (c = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + _res = c; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_145: 'or' conjunction +static void * +_tmp_145_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'or' conjunction + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + Token * _keyword; + expr_ty c; + if ( + (_keyword = _PyPegen_expect_token(p, 532)) // token='or' + && + (c = conjunction_rule(p)) // conjunction + ) + { + D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + _res = c; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_146: 'and' inversion +static void * +_tmp_146_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'and' inversion + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + Token * _keyword; + expr_ty c; + if ( + (_keyword = _PyPegen_expect_token(p, 533)) // token='and' + && + (c = inversion_rule(p)) // inversion + ) + { + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + _res = c; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_147: 'if' disjunction +static void * +_tmp_147_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'if' disjunction + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 510)) // token='if' + && + (z = disjunction_rule(p)) // disjunction + ) + { + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_148: 'if' disjunction +static void * +_tmp_148_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'if' disjunction + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 510)) // token='if' + && + (z = disjunction_rule(p)) // disjunction + ) + { + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_149: starred_expression | named_expression !'=' +static void * +_tmp_149_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // starred_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + expr_ty starred_expression_var; + if ( + (starred_expression_var = starred_expression_rule(p)) // starred_expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + _res = starred_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); + } + { // named_expression !'=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + expr_ty named_expression_var; + if ( + (named_expression_var = named_expression_rule(p)) // named_expression + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + _res = named_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression !'='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_150: ',' star_target +static void * +_tmp_150_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' star_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + Token * _literal; + expr_ty c; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (c = star_target_rule(p)) // star_target + ) + { + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + _res = c; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_151: star_targets '=' +static void * +_tmp_151_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // star_targets '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + Token * _literal; + expr_ty star_targets_var; + if ( + (star_targets_var = star_targets_rule(p)) // star_targets + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + _res = _PyPegen_dummy_name(p, star_targets_var, _literal); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_152: star_targets '=' +static void * +_tmp_152_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // star_targets '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + Token * _literal; + expr_ty star_targets_var; + if ( + (star_targets_var = star_targets_rule(p)) // star_targets + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + _res = _PyPegen_dummy_name(p, star_targets_var, _literal); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_153: param_with_default +static asdl_seq * +_loop1_153_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_153[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_153_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_154: lambda_param_with_default +static asdl_seq * +_loop1_154_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_154[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_154_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_155: ')' | '**' +static void * +_tmp_155_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); + } + { // '**' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + ) + { + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_156: ':' | '**' +static void * +_tmp_156_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // '**' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + ) + { + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +void * +_PyPegen_parse(Parser *p) +{ + // Initialize keywords + p->keywords = reserved_keywords; + p->n_keyword_lists = n_keyword_lists; + + // Run parser + void *result = NULL; + if (p->start_rule == Py_file_input) { + result = file_rule(p); + } else if (p->start_rule == Py_single_input) { + result = interactive_rule(p); + } else if (p->start_rule == Py_eval_input) { + result = eval_rule(p); + } else if (p->start_rule == Py_func_type_input) { + result = func_type_rule(p); + } else if (p->start_rule == Py_fstring_input) { + result = fstring_rule(p); + } + + return result; +} + +// The end diff --git a/Parser/pegen/parse_string.c b/Parser/pegen/parse_string.c new file mode 100644 index 00000000..7b02bdde --- /dev/null +++ b/Parser/pegen/parse_string.c @@ -0,0 +1,1234 @@ +#include + +#include + +#include "../tokenizer.h" +#include "pegen.h" +#include "parse_string.h" + +//// STRING HANDLING FUNCTIONS //// + +// These functions are ported directly from Python/ast.c with some modifications +// to account for the use of "Parser *p", the fact that don't have parser nodes +// to pass around and the usage of some specialized APIs present only in this +// file (like "_PyPegen_raise_syntax_error"). + +static int +warn_invalid_escape_sequence(Parser *p, unsigned char first_invalid_escape_char, Token *t) +{ + PyObject *msg = + PyUnicode_FromFormat("invalid escape sequence \\%c", first_invalid_escape_char); + if (msg == NULL) { + return -1; + } + if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg, p->tok->filename, + t->lineno, NULL, NULL) < 0) { + if (PyErr_ExceptionMatches(PyExc_DeprecationWarning)) { + /* Replace the DeprecationWarning exception with a SyntaxError + to get a more accurate error report */ + PyErr_Clear(); + + /* This is needed, in order for the SyntaxError to point to the token t, + since _PyPegen_raise_error uses p->tokens[p->fill - 1] for the + error location, if p->known_err_token is not set. */ + p->known_err_token = t; + RAISE_SYNTAX_ERROR("invalid escape sequence \\%c", first_invalid_escape_char); + } + Py_DECREF(msg); + return -1; + } + Py_DECREF(msg); + return 0; +} + +static PyObject * +decode_utf8(const char **sPtr, const char *end) +{ + const char *s; + const char *t; + t = s = *sPtr; + while (s < end && (*s & 0x80)) { + s++; + } + *sPtr = s; + return PyUnicode_DecodeUTF8(t, s - t, NULL); +} + +static PyObject * +decode_unicode_with_escapes(Parser *parser, const char *s, size_t len, Token *t) +{ + PyObject *v; + PyObject *u; + char *buf; + char *p; + const char *end; + + /* check for integer overflow */ + if (len > SIZE_MAX / 6) { + return NULL; + } + /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5 + "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */ + u = PyBytes_FromStringAndSize((char *)NULL, len * 6); + if (u == NULL) { + return NULL; + } + p = buf = PyBytes_AsString(u); + end = s + len; + while (s < end) { + if (*s == '\\') { + *p++ = *s++; + if (s >= end || *s & 0x80) { + strcpy(p, "u005c"); + p += 5; + if (s >= end) { + break; + } + } + } + if (*s & 0x80) { + PyObject *w; + int kind; + void *data; + Py_ssize_t w_len; + Py_ssize_t i; + w = decode_utf8(&s, end); + if (w == NULL) { + Py_DECREF(u); + return NULL; + } + kind = PyUnicode_KIND(w); + data = PyUnicode_DATA(w); + w_len = PyUnicode_GET_LENGTH(w); + for (i = 0; i < w_len; i++) { + Py_UCS4 chr = PyUnicode_READ(kind, data, i); + sprintf(p, "\\U%08x", chr); + p += 10; + } + /* Should be impossible to overflow */ + assert(p - buf <= PyBytes_GET_SIZE(u)); + Py_DECREF(w); + } + else { + *p++ = *s++; + } + } + len = p - buf; + s = buf; + + const char *first_invalid_escape; + v = _PyUnicode_DecodeUnicodeEscape(s, len, NULL, &first_invalid_escape); + + if (v != NULL && first_invalid_escape != NULL) { + if (warn_invalid_escape_sequence(parser, *first_invalid_escape, t) < 0) { + /* We have not decref u before because first_invalid_escape points + inside u. */ + Py_XDECREF(u); + Py_DECREF(v); + return NULL; + } + } + Py_XDECREF(u); + return v; +} + +static PyObject * +decode_bytes_with_escapes(Parser *p, const char *s, Py_ssize_t len, Token *t) +{ + const char *first_invalid_escape; + PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, &first_invalid_escape); + if (result == NULL) { + return NULL; + } + + if (first_invalid_escape != NULL) { + if (warn_invalid_escape_sequence(p, *first_invalid_escape, t) < 0) { + Py_DECREF(result); + return NULL; + } + } + return result; +} + +/* s must include the bracketing quote characters, and r, b, u, + &/or f prefixes (if any), and embedded escape sequences (if any). + _PyPegen_parsestr parses it, and sets *result to decoded Python string object. + If the string is an f-string, set *fstr and *fstrlen to the unparsed + string object. Return 0 if no errors occurred. */ +int +_PyPegen_parsestr(Parser *p, int *bytesmode, int *rawmode, PyObject **result, + const char **fstr, Py_ssize_t *fstrlen, Token *t) +{ + const char *s = PyBytes_AsString(t->bytes); + if (s == NULL) { + return -1; + } + + size_t len; + int quote = Py_CHARMASK(*s); + int fmode = 0; + *bytesmode = 0; + *rawmode = 0; + *result = NULL; + *fstr = NULL; + if (Py_ISALPHA(quote)) { + while (!*bytesmode || !*rawmode) { + if (quote == 'b' || quote == 'B') { + quote =(unsigned char)*++s; + *bytesmode = 1; + } + else if (quote == 'u' || quote == 'U') { + quote = (unsigned char)*++s; + } + else if (quote == 'r' || quote == 'R') { + quote = (unsigned char)*++s; + *rawmode = 1; + } + else if (quote == 'f' || quote == 'F') { + quote = (unsigned char)*++s; + fmode = 1; + } + else { + break; + } + } + } + + /* fstrings are only allowed in Python 3.6 and greater */ + if (fmode && p->feature_version < 6) { + p->error_indicator = 1; + RAISE_SYNTAX_ERROR("Format strings are only supported in Python 3.6 and greater"); + return -1; + } + + if (fmode && *bytesmode) { + PyErr_BadInternalCall(); + return -1; + } + if (quote != '\'' && quote != '\"') { + PyErr_BadInternalCall(); + return -1; + } + /* Skip the leading quote char. */ + s++; + len = strlen(s); + if (len > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, "string to parse is too long"); + return -1; + } + if (s[--len] != quote) { + /* Last quote char must match the first. */ + PyErr_BadInternalCall(); + return -1; + } + if (len >= 4 && s[0] == quote && s[1] == quote) { + /* A triple quoted string. We've already skipped one quote at + the start and one at the end of the string. Now skip the + two at the start. */ + s += 2; + len -= 2; + /* And check that the last two match. */ + if (s[--len] != quote || s[--len] != quote) { + PyErr_BadInternalCall(); + return -1; + } + } + + if (fmode) { + /* Just return the bytes. The caller will parse the resulting + string. */ + *fstr = s; + *fstrlen = len; + return 0; + } + + /* Not an f-string. */ + /* Avoid invoking escape decoding routines if possible. */ + *rawmode = *rawmode || strchr(s, '\\') == NULL; + if (*bytesmode) { + /* Disallow non-ASCII characters. */ + const char *ch; + for (ch = s; *ch; ch++) { + if (Py_CHARMASK(*ch) >= 0x80) { + RAISE_SYNTAX_ERROR( + "bytes can only contain ASCII " + "literal characters."); + return -1; + } + } + if (*rawmode) { + *result = PyBytes_FromStringAndSize(s, len); + } + else { + *result = decode_bytes_with_escapes(p, s, len, t); + } + } + else { + if (*rawmode) { + *result = PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL); + } + else { + *result = decode_unicode_with_escapes(p, s, len, t); + } + } + return *result == NULL ? -1 : 0; +} + + + +// FSTRING STUFF + +/* Fix locations for the given node and its children. + + `parent` is the enclosing node. + `n` is the node which locations are going to be fixed relative to parent. + `expr_str` is the child node's string representation, including braces. +*/ +static bool +fstring_find_expr_location(Token *parent, char *expr_str, int *p_lines, int *p_cols) +{ + *p_lines = 0; + *p_cols = 0; + if (parent && parent->bytes) { + char *parent_str = PyBytes_AsString(parent->bytes); + if (!parent_str) { + return false; + } + char *substr = strstr(parent_str, expr_str); + if (substr) { + // The following is needed, in order to correctly shift the column + // offset, in the case that (disregarding any whitespace) a newline + // immediately follows the opening curly brace of the fstring expression. + bool newline_after_brace = 1; + char *start = substr + 1; + while (start && *start != '}' && *start != '\n') { + if (*start != ' ' && *start != '\t' && *start != '\f') { + newline_after_brace = 0; + break; + } + start++; + } + + // Account for the characters from the last newline character to our + // left until the beginning of substr. + if (!newline_after_brace) { + start = substr; + while (start > parent_str && *start != '\n') { + start--; + } + *p_cols += (int)(substr - start); + } + /* adjust the start based on the number of newlines encountered + before the f-string expression */ + for (char* p = parent_str; p < substr; p++) { + if (*p == '\n') { + (*p_lines)++; + } + } + } + } + return true; +} + + +/* Compile this expression in to an expr_ty. Add parens around the + expression, in order to allow leading spaces in the expression. */ +static expr_ty +fstring_compile_expr(Parser *p, const char *expr_start, const char *expr_end, + Token *t) +{ + expr_ty expr = NULL; + char *str; + Py_ssize_t len; + const char *s; + expr_ty result = NULL; + + assert(expr_end >= expr_start); + assert(*(expr_start-1) == '{'); + assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':' || + *expr_end == '='); + + /* If the substring is all whitespace, it's an error. We need to catch this + here, and not when we call PyParser_SimpleParseStringFlagsFilename, + because turning the expression '' in to '()' would go from being invalid + to valid. */ + for (s = expr_start; s != expr_end; s++) { + char c = *s; + /* The Python parser ignores only the following whitespace + characters (\r already is converted to \n). */ + if (!(c == ' ' || c == '\t' || c == '\n' || c == '\f')) { + break; + } + } + if (s == expr_end) { + RAISE_SYNTAX_ERROR("f-string: empty expression not allowed"); + return NULL; + } + + len = expr_end - expr_start; + /* Allocate 3 extra bytes: open paren, close paren, null byte. */ + str = PyMem_Malloc(len + 3); + if (str == NULL) { + PyErr_NoMemory(); + return NULL; + } + + // The call to fstring_find_expr_location is responsible for finding the column offset + // the generated AST nodes need to be shifted to the right, which is equal to the number + // of the f-string characters before the expression starts. In order to correctly compute + // this offset, strstr gets called in fstring_find_expr_location which only succeeds + // if curly braces appear before and after the f-string expression (exactly like they do + // in the f-string itself), hence the following lines. + str[0] = '{'; + memcpy(str+1, expr_start, len); + str[len+1] = '}'; + str[len+2] = 0; + + int lines, cols; + if (!fstring_find_expr_location(t, str, &lines, &cols)) { + PyMem_FREE(str); + return NULL; + } + + // The parentheses are needed in order to allow for leading whitespace within + // the f-string expression. This consequently gets parsed as a group (see the + // group rule in python.gram). + str[0] = '('; + str[len+1] = ')'; + + struct tok_state* tok = PyTokenizer_FromString(str, 1); + if (tok == NULL) { + PyMem_Free(str); + return NULL; + } + Py_INCREF(p->tok->filename); + tok->filename = p->tok->filename; + + Parser *p2 = _PyPegen_Parser_New(tok, Py_fstring_input, p->flags, p->feature_version, + NULL, p->arena); + p2->starting_lineno = t->lineno + lines - 1; + p2->starting_col_offset = p->tok->first_lineno == p->tok->lineno ? t->col_offset + cols : cols; + + expr = _PyPegen_run_parser(p2); + + if (expr == NULL) { + goto exit; + } + result = expr; + +exit: + PyMem_Free(str); + _PyPegen_Parser_Free(p2); + PyTokenizer_Free(tok); + return result; +} + +/* Return -1 on error. + + Return 0 if we reached the end of the literal. + + Return 1 if we haven't reached the end of the literal, but we want + the caller to process the literal up to this point. Used for + doubled braces. +*/ +static int +fstring_find_literal(Parser *p, const char **str, const char *end, int raw, + PyObject **literal, int recurse_lvl, Token *t) +{ + /* Get any literal string. It ends when we hit an un-doubled left + brace (which isn't part of a unicode name escape such as + "\N{EULER CONSTANT}"), or the end of the string. */ + + const char *s = *str; + const char *literal_start = s; + int result = 0; + + assert(*literal == NULL); + while (s < end) { + char ch = *s++; + if (!raw && ch == '\\' && s < end) { + ch = *s++; + if (ch == 'N') { + if (s < end && *s++ == '{') { + while (s < end && *s++ != '}') { + } + continue; + } + break; + } + if (ch == '{' && warn_invalid_escape_sequence(p, ch, t) < 0) { + return -1; + } + } + if (ch == '{' || ch == '}') { + /* Check for doubled braces, but only at the top level. If + we checked at every level, then f'{0:{3}}' would fail + with the two closing braces. */ + if (recurse_lvl == 0) { + if (s < end && *s == ch) { + /* We're going to tell the caller that the literal ends + here, but that they should continue scanning. But also + skip over the second brace when we resume scanning. */ + *str = s + 1; + result = 1; + goto done; + } + + /* Where a single '{' is the start of a new expression, a + single '}' is not allowed. */ + if (ch == '}') { + *str = s - 1; + RAISE_SYNTAX_ERROR("f-string: single '}' is not allowed"); + return -1; + } + } + /* We're either at a '{', which means we're starting another + expression; or a '}', which means we're at the end of this + f-string (for a nested format_spec). */ + s--; + break; + } + } + *str = s; + assert(s <= end); + assert(s == end || *s == '{' || *s == '}'); +done: + if (literal_start != s) { + if (raw) { + *literal = PyUnicode_DecodeUTF8Stateful(literal_start, + s - literal_start, + NULL, NULL); + } else { + *literal = decode_unicode_with_escapes(p, literal_start, + s - literal_start, t); + } + if (!*literal) { + return -1; + } + } + return result; +} + +/* Forward declaration because parsing is recursive. */ +static expr_ty +fstring_parse(Parser *p, const char **str, const char *end, int raw, int recurse_lvl, + Token *first_token, Token* t, Token *last_token); + +/* Parse the f-string at *str, ending at end. We know *str starts an + expression (so it must be a '{'). Returns the FormattedValue node, which + includes the expression, conversion character, format_spec expression, and + optionally the text of the expression (if = is used). + + Note that I don't do a perfect job here: I don't make sure that a + closing brace doesn't match an opening paren, for example. It + doesn't need to error on all invalid expressions, just correctly + find the end of all valid ones. Any errors inside the expression + will be caught when we parse it later. + + *expression is set to the expression. For an '=' "debug" expression, + *expr_text is set to the debug text (the original text of the expression, + including the '=' and any whitespace around it, as a string object). If + not a debug expression, *expr_text set to NULL. */ +static int +fstring_find_expr(Parser *p, const char **str, const char *end, int raw, int recurse_lvl, + PyObject **expr_text, expr_ty *expression, Token *first_token, + Token *t, Token *last_token) +{ + /* Return -1 on error, else 0. */ + + const char *expr_start; + const char *expr_end; + expr_ty simple_expression; + expr_ty format_spec = NULL; /* Optional format specifier. */ + int conversion = -1; /* The conversion char. Use default if not + specified, or !r if using = and no format + spec. */ + + /* 0 if we're not in a string, else the quote char we're trying to + match (single or double quote). */ + char quote_char = 0; + + /* If we're inside a string, 1=normal, 3=triple-quoted. */ + int string_type = 0; + + /* Keep track of nesting level for braces/parens/brackets in + expressions. */ + Py_ssize_t nested_depth = 0; + char parenstack[MAXLEVEL]; + + *expr_text = NULL; + + /* Can only nest one level deep. */ + if (recurse_lvl >= 2) { + RAISE_SYNTAX_ERROR("f-string: expressions nested too deeply"); + goto error; + } + + /* The first char must be a left brace, or we wouldn't have gotten + here. Skip over it. */ + assert(**str == '{'); + *str += 1; + + expr_start = *str; + for (; *str < end; (*str)++) { + char ch; + + /* Loop invariants. */ + assert(nested_depth >= 0); + assert(*str >= expr_start && *str < end); + if (quote_char) { + assert(string_type == 1 || string_type == 3); + } else { + assert(string_type == 0); + } + + ch = **str; + /* Nowhere inside an expression is a backslash allowed. */ + if (ch == '\\') { + /* Error: can't include a backslash character, inside + parens or strings or not. */ + RAISE_SYNTAX_ERROR( + "f-string expression part " + "cannot include a backslash"); + goto error; + } + if (quote_char) { + /* We're inside a string. See if we're at the end. */ + /* This code needs to implement the same non-error logic + as tok_get from tokenizer.c, at the letter_quote + label. To actually share that code would be a + nightmare. But, it's unlikely to change and is small, + so duplicate it here. Note we don't need to catch all + of the errors, since they'll be caught when parsing the + expression. We just need to match the non-error + cases. Thus we can ignore \n in single-quoted strings, + for example. Or non-terminated strings. */ + if (ch == quote_char) { + /* Does this match the string_type (single or triple + quoted)? */ + if (string_type == 3) { + if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) { + /* We're at the end of a triple quoted string. */ + *str += 2; + string_type = 0; + quote_char = 0; + continue; + } + } else { + /* We're at the end of a normal string. */ + quote_char = 0; + string_type = 0; + continue; + } + } + } else if (ch == '\'' || ch == '"') { + /* Is this a triple quoted string? */ + if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) { + string_type = 3; + *str += 2; + } else { + /* Start of a normal string. */ + string_type = 1; + } + /* Start looking for the end of the string. */ + quote_char = ch; + } else if (ch == '[' || ch == '{' || ch == '(') { + if (nested_depth >= MAXLEVEL) { + RAISE_SYNTAX_ERROR("f-string: too many nested parenthesis"); + goto error; + } + parenstack[nested_depth] = ch; + nested_depth++; + } else if (ch == '#') { + /* Error: can't include a comment character, inside parens + or not. */ + RAISE_SYNTAX_ERROR("f-string expression part cannot include '#'"); + goto error; + } else if (nested_depth == 0 && + (ch == '!' || ch == ':' || ch == '}' || + ch == '=' || ch == '>' || ch == '<')) { + /* See if there's a next character. */ + if (*str+1 < end) { + char next = *(*str+1); + + /* For "!=". since '=' is not an allowed conversion character, + nothing is lost in this test. */ + if ((ch == '!' && next == '=') || /* != */ + (ch == '=' && next == '=') || /* == */ + (ch == '<' && next == '=') || /* <= */ + (ch == '>' && next == '=') /* >= */ + ) { + *str += 1; + continue; + } + /* Don't get out of the loop for these, if they're single + chars (not part of 2-char tokens). If by themselves, they + don't end an expression (unlike say '!'). */ + if (ch == '>' || ch == '<') { + continue; + } + } + + /* Normal way out of this loop. */ + break; + } else if (ch == ']' || ch == '}' || ch == ')') { + if (!nested_depth) { + RAISE_SYNTAX_ERROR("f-string: unmatched '%c'", ch); + goto error; + } + nested_depth--; + int opening = (unsigned char)parenstack[nested_depth]; + if (!((opening == '(' && ch == ')') || + (opening == '[' && ch == ']') || + (opening == '{' && ch == '}'))) + { + RAISE_SYNTAX_ERROR( + "f-string: closing parenthesis '%c' " + "does not match opening parenthesis '%c'", + ch, opening); + goto error; + } + } else { + /* Just consume this char and loop around. */ + } + } + expr_end = *str; + /* If we leave this loop in a string or with mismatched parens, we + don't care. We'll get a syntax error when compiling the + expression. But, we can produce a better error message, so + let's just do that.*/ + if (quote_char) { + RAISE_SYNTAX_ERROR("f-string: unterminated string"); + goto error; + } + if (nested_depth) { + int opening = (unsigned char)parenstack[nested_depth - 1]; + RAISE_SYNTAX_ERROR("f-string: unmatched '%c'", opening); + goto error; + } + + if (*str >= end) { + goto unexpected_end_of_string; + } + + /* Compile the expression as soon as possible, so we show errors + related to the expression before errors related to the + conversion or format_spec. */ + simple_expression = fstring_compile_expr(p, expr_start, expr_end, t); + if (!simple_expression) { + goto error; + } + + /* Check for =, which puts the text value of the expression in + expr_text. */ + if (**str == '=') { + if (p->feature_version < 8) { + RAISE_SYNTAX_ERROR("f-string: self documenting expressions are " + "only supported in Python 3.8 and greater"); + goto error; + } + *str += 1; + + /* Skip over ASCII whitespace. No need to test for end of string + here, since we know there's at least a trailing quote somewhere + ahead. */ + while (Py_ISSPACE(**str)) { + *str += 1; + } + + /* Set *expr_text to the text of the expression. */ + *expr_text = PyUnicode_FromStringAndSize(expr_start, *str-expr_start); + if (!*expr_text) { + goto error; + } + } + + /* Check for a conversion char, if present. */ + if (**str == '!') { + *str += 1; + if (*str >= end) { + goto unexpected_end_of_string; + } + + conversion = (unsigned char)**str; + *str += 1; + + /* Validate the conversion. */ + if (!(conversion == 's' || conversion == 'r' || conversion == 'a')) { + RAISE_SYNTAX_ERROR( + "f-string: invalid conversion character: " + "expected 's', 'r', or 'a'"); + goto error; + } + + } + + /* Check for the format spec, if present. */ + if (*str >= end) { + goto unexpected_end_of_string; + } + if (**str == ':') { + *str += 1; + if (*str >= end) { + goto unexpected_end_of_string; + } + + /* Parse the format spec. */ + format_spec = fstring_parse(p, str, end, raw, recurse_lvl+1, + first_token, t, last_token); + if (!format_spec) { + goto error; + } + } + + if (*str >= end || **str != '}') { + goto unexpected_end_of_string; + } + + /* We're at a right brace. Consume it. */ + assert(*str < end); + assert(**str == '}'); + *str += 1; + + /* If we're in = mode (detected by non-NULL expr_text), and have no format + spec and no explicit conversion, set the conversion to 'r'. */ + if (*expr_text && format_spec == NULL && conversion == -1) { + conversion = 'r'; + } + + /* And now create the FormattedValue node that represents this + entire expression with the conversion and format spec. */ + //TODO: Fix this + *expression = FormattedValue(simple_expression, conversion, + format_spec, first_token->lineno, + first_token->col_offset, last_token->end_lineno, + last_token->end_col_offset, p->arena); + if (!*expression) { + goto error; + } + + return 0; + +unexpected_end_of_string: + RAISE_SYNTAX_ERROR("f-string: expecting '}'"); + /* Falls through to error. */ + +error: + Py_XDECREF(*expr_text); + return -1; + +} + +/* Return -1 on error. + + Return 0 if we have a literal (possible zero length) and an + expression (zero length if at the end of the string. + + Return 1 if we have a literal, but no expression, and we want the + caller to call us again. This is used to deal with doubled + braces. + + When called multiple times on the string 'a{{b{0}c', this function + will return: + + 1. the literal 'a{' with no expression, and a return value + of 1. Despite the fact that there's no expression, the return + value of 1 means we're not finished yet. + + 2. the literal 'b' and the expression '0', with a return value of + 0. The fact that there's an expression means we're not finished. + + 3. literal 'c' with no expression and a return value of 0. The + combination of the return value of 0 with no expression means + we're finished. +*/ +static int +fstring_find_literal_and_expr(Parser *p, const char **str, const char *end, int raw, + int recurse_lvl, PyObject **literal, + PyObject **expr_text, expr_ty *expression, + Token *first_token, Token *t, Token *last_token) +{ + int result; + + assert(*literal == NULL && *expression == NULL); + + /* Get any literal string. */ + result = fstring_find_literal(p, str, end, raw, literal, recurse_lvl, t); + if (result < 0) { + goto error; + } + + assert(result == 0 || result == 1); + + if (result == 1) { + /* We have a literal, but don't look at the expression. */ + return 1; + } + + if (*str >= end || **str == '}') { + /* We're at the end of the string or the end of a nested + f-string: no expression. The top-level error case where we + expect to be at the end of the string but we're at a '}' is + handled later. */ + return 0; + } + + /* We must now be the start of an expression, on a '{'. */ + assert(**str == '{'); + + if (fstring_find_expr(p, str, end, raw, recurse_lvl, expr_text, + expression, first_token, t, last_token) < 0) { + goto error; + } + + return 0; + +error: + Py_CLEAR(*literal); + return -1; +} + +#ifdef NDEBUG +#define ExprList_check_invariants(l) +#else +static void +ExprList_check_invariants(ExprList *l) +{ + /* Check our invariants. Make sure this object is "live", and + hasn't been deallocated. */ + assert(l->size >= 0); + assert(l->p != NULL); + if (l->size <= EXPRLIST_N_CACHED) { + assert(l->data == l->p); + } +} +#endif + +static void +ExprList_Init(ExprList *l) +{ + l->allocated = EXPRLIST_N_CACHED; + l->size = 0; + + /* Until we start allocating dynamically, p points to data. */ + l->p = l->data; + + ExprList_check_invariants(l); +} + +static int +ExprList_Append(ExprList *l, expr_ty exp) +{ + ExprList_check_invariants(l); + if (l->size >= l->allocated) { + /* We need to alloc (or realloc) the memory. */ + Py_ssize_t new_size = l->allocated * 2; + + /* See if we've ever allocated anything dynamically. */ + if (l->p == l->data) { + Py_ssize_t i; + /* We're still using the cached data. Switch to + alloc-ing. */ + l->p = PyMem_Malloc(sizeof(expr_ty) * new_size); + if (!l->p) { + return -1; + } + /* Copy the cached data into the new buffer. */ + for (i = 0; i < l->size; i++) { + l->p[i] = l->data[i]; + } + } else { + /* Just realloc. */ + expr_ty *tmp = PyMem_Realloc(l->p, sizeof(expr_ty) * new_size); + if (!tmp) { + PyMem_Free(l->p); + l->p = NULL; + return -1; + } + l->p = tmp; + } + + l->allocated = new_size; + assert(l->allocated == 2 * l->size); + } + + l->p[l->size++] = exp; + + ExprList_check_invariants(l); + return 0; +} + +static void +ExprList_Dealloc(ExprList *l) +{ + ExprList_check_invariants(l); + + /* If there's been an error, or we've never dynamically allocated, + do nothing. */ + if (!l->p || l->p == l->data) { + /* Do nothing. */ + } else { + /* We have dynamically allocated. Free the memory. */ + PyMem_Free(l->p); + } + l->p = NULL; + l->size = -1; +} + +static asdl_seq * +ExprList_Finish(ExprList *l, PyArena *arena) +{ + asdl_seq *seq; + + ExprList_check_invariants(l); + + /* Allocate the asdl_seq and copy the expressions in to it. */ + seq = _Py_asdl_seq_new(l->size, arena); + if (seq) { + Py_ssize_t i; + for (i = 0; i < l->size; i++) { + asdl_seq_SET(seq, i, l->p[i]); + } + } + ExprList_Dealloc(l); + return seq; +} + +#ifdef NDEBUG +#define FstringParser_check_invariants(state) +#else +static void +FstringParser_check_invariants(FstringParser *state) +{ + if (state->last_str) { + assert(PyUnicode_CheckExact(state->last_str)); + } + ExprList_check_invariants(&state->expr_list); +} +#endif + +void +_PyPegen_FstringParser_Init(FstringParser *state) +{ + state->last_str = NULL; + state->fmode = 0; + ExprList_Init(&state->expr_list); + FstringParser_check_invariants(state); +} + +void +_PyPegen_FstringParser_Dealloc(FstringParser *state) +{ + FstringParser_check_invariants(state); + + Py_XDECREF(state->last_str); + ExprList_Dealloc(&state->expr_list); +} + +/* Make a Constant node, but decref the PyUnicode object being added. */ +static expr_ty +make_str_node_and_del(Parser *p, PyObject **str, Token* first_token, Token *last_token) +{ + PyObject *s = *str; + PyObject *kind = NULL; + *str = NULL; + assert(PyUnicode_CheckExact(s)); + if (PyArena_AddPyObject(p->arena, s) < 0) { + Py_DECREF(s); + return NULL; + } + const char* the_str = PyBytes_AsString(first_token->bytes); + if (the_str && the_str[0] == 'u') { + kind = _PyPegen_new_identifier(p, "u"); + } + + if (kind == NULL && PyErr_Occurred()) { + return NULL; + } + + return Constant(s, kind, first_token->lineno, first_token->col_offset, + last_token->end_lineno, last_token->end_col_offset, p->arena); + +} + + +/* Add a non-f-string (that is, a regular literal string). str is + decref'd. */ +int +_PyPegen_FstringParser_ConcatAndDel(FstringParser *state, PyObject *str) +{ + FstringParser_check_invariants(state); + + assert(PyUnicode_CheckExact(str)); + + if (PyUnicode_GET_LENGTH(str) == 0) { + Py_DECREF(str); + return 0; + } + + if (!state->last_str) { + /* We didn't have a string before, so just remember this one. */ + state->last_str = str; + } else { + /* Concatenate this with the previous string. */ + PyUnicode_AppendAndDel(&state->last_str, str); + if (!state->last_str) { + return -1; + } + } + FstringParser_check_invariants(state); + return 0; +} + +/* Parse an f-string. The f-string is in *str to end, with no + 'f' or quotes. */ +int +_PyPegen_FstringParser_ConcatFstring(Parser *p, FstringParser *state, const char **str, + const char *end, int raw, int recurse_lvl, + Token *first_token, Token* t, Token *last_token) +{ + FstringParser_check_invariants(state); + state->fmode = 1; + + /* Parse the f-string. */ + while (1) { + PyObject *literal = NULL; + PyObject *expr_text = NULL; + expr_ty expression = NULL; + + /* If there's a zero length literal in front of the + expression, literal will be NULL. If we're at the end of + the f-string, expression will be NULL (unless result == 1, + see below). */ + int result = fstring_find_literal_and_expr(p, str, end, raw, recurse_lvl, + &literal, &expr_text, + &expression, first_token, t, last_token); + if (result < 0) { + return -1; + } + + /* Add the literal, if any. */ + if (literal && _PyPegen_FstringParser_ConcatAndDel(state, literal) < 0) { + Py_XDECREF(expr_text); + return -1; + } + /* Add the expr_text, if any. */ + if (expr_text && _PyPegen_FstringParser_ConcatAndDel(state, expr_text) < 0) { + return -1; + } + + /* We've dealt with the literal and expr_text, their ownership has + been transferred to the state object. Don't look at them again. */ + + /* See if we should just loop around to get the next literal + and expression, while ignoring the expression this + time. This is used for un-doubling braces, as an + optimization. */ + if (result == 1) { + continue; + } + + if (!expression) { + /* We're done with this f-string. */ + break; + } + + /* We know we have an expression. Convert any existing string + to a Constant node. */ + if (!state->last_str) { + /* Do nothing. No previous literal. */ + } else { + /* Convert the existing last_str literal to a Constant node. */ + expr_ty last_str = make_str_node_and_del(p, &state->last_str, first_token, last_token); + if (!last_str || ExprList_Append(&state->expr_list, last_str) < 0) { + return -1; + } + } + + if (ExprList_Append(&state->expr_list, expression) < 0) { + return -1; + } + } + + /* If recurse_lvl is zero, then we must be at the end of the + string. Otherwise, we must be at a right brace. */ + + if (recurse_lvl == 0 && *str < end-1) { + RAISE_SYNTAX_ERROR("f-string: unexpected end of string"); + return -1; + } + if (recurse_lvl != 0 && **str != '}') { + RAISE_SYNTAX_ERROR("f-string: expecting '}'"); + return -1; + } + + FstringParser_check_invariants(state); + return 0; +} + +/* Convert the partial state reflected in last_str and expr_list to an + expr_ty. The expr_ty can be a Constant, or a JoinedStr. */ +expr_ty +_PyPegen_FstringParser_Finish(Parser *p, FstringParser *state, Token* first_token, + Token *last_token) +{ + asdl_seq *seq; + + FstringParser_check_invariants(state); + + /* If we're just a constant string with no expressions, return + that. */ + if (!state->fmode) { + assert(!state->expr_list.size); + if (!state->last_str) { + /* Create a zero length string. */ + state->last_str = PyUnicode_FromStringAndSize(NULL, 0); + if (!state->last_str) { + goto error; + } + } + return make_str_node_and_del(p, &state->last_str, first_token, last_token); + } + + /* Create a Constant node out of last_str, if needed. It will be the + last node in our expression list. */ + if (state->last_str) { + expr_ty str = make_str_node_and_del(p, &state->last_str, first_token, last_token); + if (!str || ExprList_Append(&state->expr_list, str) < 0) { + goto error; + } + } + /* This has already been freed. */ + assert(state->last_str == NULL); + + seq = ExprList_Finish(&state->expr_list, p->arena); + if (!seq) { + goto error; + } + + return _Py_JoinedStr(seq, first_token->lineno, first_token->col_offset, + last_token->end_lineno, last_token->end_col_offset, p->arena); + +error: + _PyPegen_FstringParser_Dealloc(state); + return NULL; +} + +/* Given an f-string (with no 'f' or quotes) that's in *str and ends + at end, parse it into an expr_ty. Return NULL on error. Adjust + str to point past the parsed portion. */ +static expr_ty +fstring_parse(Parser *p, const char **str, const char *end, int raw, + int recurse_lvl, Token *first_token, Token* t, Token *last_token) +{ + FstringParser state; + + _PyPegen_FstringParser_Init(&state); + if (_PyPegen_FstringParser_ConcatFstring(p, &state, str, end, raw, recurse_lvl, + first_token, t, last_token) < 0) { + _PyPegen_FstringParser_Dealloc(&state); + return NULL; + } + + return _PyPegen_FstringParser_Finish(p, &state, t, t); +} diff --git a/Parser/pegen/parse_string.h b/Parser/pegen/parse_string.h new file mode 100644 index 00000000..cd85bd57 --- /dev/null +++ b/Parser/pegen/parse_string.h @@ -0,0 +1,46 @@ +#ifndef STRINGS_H +#define STRINGS_H + +#include +#include +#include "pegen.h" + +#define EXPRLIST_N_CACHED 64 + +typedef struct { + /* Incrementally build an array of expr_ty, so be used in an + asdl_seq. Cache some small but reasonably sized number of + expr_ty's, and then after that start dynamically allocating, + doubling the number allocated each time. Note that the f-string + f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one + Constant for the literal 'a'. So you add expr_ty's about twice as + fast as you add expressions in an f-string. */ + + Py_ssize_t allocated; /* Number we've allocated. */ + Py_ssize_t size; /* Number we've used. */ + expr_ty *p; /* Pointer to the memory we're actually + using. Will point to 'data' until we + start dynamically allocating. */ + expr_ty data[EXPRLIST_N_CACHED]; +} ExprList; + +/* The FstringParser is designed to add a mix of strings and + f-strings, and concat them together as needed. Ultimately, it + generates an expr_ty. */ +typedef struct { + PyObject *last_str; + ExprList expr_list; + int fmode; +} FstringParser; + +void _PyPegen_FstringParser_Init(FstringParser *); +int _PyPegen_parsestr(Parser *, int *, int *, PyObject **, + const char **, Py_ssize_t *, Token *); +int _PyPegen_FstringParser_ConcatFstring(Parser *, FstringParser *, const char **, + const char *, int, int, Token *, Token *, + Token *); +int _PyPegen_FstringParser_ConcatAndDel(FstringParser *, PyObject *); +expr_ty _PyPegen_FstringParser_Finish(Parser *, FstringParser *, Token *, Token *); +void _PyPegen_FstringParser_Dealloc(FstringParser *); + +#endif diff --git a/Parser/pegen/peg_api.c b/Parser/pegen/peg_api.c new file mode 100644 index 00000000..5e71ecdb --- /dev/null +++ b/Parser/pegen/peg_api.c @@ -0,0 +1,54 @@ +#include "pegen_interface.h" + +#include "../tokenizer.h" +#include "pegen.h" + +mod_ty +PyPegen_ASTFromString(const char *str, const char *filename, int mode, + PyCompilerFlags *flags, PyArena *arena) +{ + PyObject *filename_ob = PyUnicode_FromString(filename); + if (filename_ob == NULL) { + return NULL; + } + mod_ty result = PyPegen_ASTFromStringObject(str, filename_ob, mode, flags, arena); + Py_XDECREF(filename_ob); + return result; +} + +mod_ty +PyPegen_ASTFromStringObject(const char *str, PyObject* filename, int mode, + PyCompilerFlags *flags, PyArena *arena) +{ + if (PySys_Audit("compile", "yO", str, filename) < 0) { + return NULL; + } + + mod_ty result = _PyPegen_run_parser_from_string(str, mode, filename, flags, arena); + return result; +} + +mod_ty +PyPegen_ASTFromFilename(const char *filename, int mode, PyCompilerFlags *flags, PyArena *arena) +{ + PyObject *filename_ob = PyUnicode_FromString(filename); + if (filename_ob == NULL) { + return NULL; + } + + mod_ty result = _PyPegen_run_parser_from_file(filename, mode, filename_ob, flags, arena); + Py_XDECREF(filename_ob); + return result; +} + +mod_ty +PyPegen_ASTFromFileObject(FILE *fp, PyObject *filename_ob, int mode, + const char *enc, const char *ps1, const char* ps2, + PyCompilerFlags *flags, int *errcode, PyArena *arena) +{ + if (PySys_Audit("compile", "OO", Py_None, filename_ob) < 0) { + return NULL; + } + return _PyPegen_run_parser_from_file_pointer(fp, mode, filename_ob, enc, ps1, ps2, + flags, errcode, arena); +} diff --git a/Parser/pegen/pegen.c b/Parser/pegen/pegen.c new file mode 100644 index 00000000..2c435fb3 --- /dev/null +++ b/Parser/pegen/pegen.c @@ -0,0 +1,2254 @@ +#include +#include +#include "../tokenizer.h" + +#include "pegen.h" +#include "parse_string.h" +#include "ast.h" + +PyObject * +_PyPegen_new_type_comment(Parser *p, char *s) +{ + PyObject *res = PyUnicode_DecodeUTF8(s, strlen(s), NULL); + if (res == NULL) { + return NULL; + } + if (PyArena_AddPyObject(p->arena, res) < 0) { + Py_DECREF(res); + return NULL; + } + return res; +} + +arg_ty +_PyPegen_add_type_comment_to_arg(Parser *p, arg_ty a, Token *tc) +{ + if (tc == NULL) { + return a; + } + char *bytes = PyBytes_AsString(tc->bytes); + if (bytes == NULL) { + return NULL; + } + PyObject *tco = _PyPegen_new_type_comment(p, bytes); + if (tco == NULL) { + return NULL; + } + return arg(a->arg, a->annotation, tco, + a->lineno, a->col_offset, a->end_lineno, a->end_col_offset, + p->arena); +} + +static int +init_normalization(Parser *p) +{ + if (p->normalize) { + return 1; + } + PyObject *m = PyImport_ImportModuleNoBlock("unicodedata"); + if (!m) + { + return 0; + } + p->normalize = PyObject_GetAttrString(m, "normalize"); + Py_DECREF(m); + if (!p->normalize) + { + return 0; + } + return 1; +} + +/* Checks if the NOTEQUAL token is valid given the current parser flags +0 indicates success and nonzero indicates failure (an exception may be set) */ +int +_PyPegen_check_barry_as_flufl(Parser *p) { + Token *t = p->tokens[p->fill - 1]; + assert(t->bytes != NULL); + assert(t->type == NOTEQUAL); + + char* tok_str = PyBytes_AS_STRING(t->bytes); + if (p->flags & PyPARSE_BARRY_AS_BDFL && strcmp(tok_str, "<>") != 0) { + RAISE_SYNTAX_ERROR("with Barry as BDFL, use '<>' instead of '!='"); + return -1; + } + if (!(p->flags & PyPARSE_BARRY_AS_BDFL)) { + return strcmp(tok_str, "!="); + } + return 0; +} + +PyObject * +_PyPegen_new_identifier(Parser *p, char *n) +{ + PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL); + if (!id) { + goto error; + } + /* PyUnicode_DecodeUTF8 should always return a ready string. */ + assert(PyUnicode_IS_READY(id)); + /* Check whether there are non-ASCII characters in the + identifier; if so, normalize to NFKC. */ + if (!PyUnicode_IS_ASCII(id)) + { + PyObject *id2; + if (!init_normalization(p)) + { + Py_DECREF(id); + goto error; + } + PyObject *form = PyUnicode_InternFromString("NFKC"); + if (form == NULL) + { + Py_DECREF(id); + goto error; + } + PyObject *args[2] = {form, id}; + id2 = _PyObject_FastCall(p->normalize, args, 2); + Py_DECREF(id); + Py_DECREF(form); + if (!id2) { + goto error; + } + if (!PyUnicode_Check(id2)) + { + PyErr_Format(PyExc_TypeError, + "unicodedata.normalize() must return a string, not " + "%.200s", + _PyType_Name(Py_TYPE(id2))); + Py_DECREF(id2); + goto error; + } + id = id2; + } + PyUnicode_InternInPlace(&id); + if (PyArena_AddPyObject(p->arena, id) < 0) + { + Py_DECREF(id); + goto error; + } + return id; + +error: + p->error_indicator = 1; + return NULL; +} + +static PyObject * +_create_dummy_identifier(Parser *p) +{ + return _PyPegen_new_identifier(p, ""); +} + +static inline Py_ssize_t +byte_offset_to_character_offset(PyObject *line, Py_ssize_t col_offset) +{ + const char *str = PyUnicode_AsUTF8(line); + if (!str) { + return 0; + } + assert(col_offset >= 0 && (unsigned long)col_offset <= strlen(str)); + PyObject *text = PyUnicode_DecodeUTF8(str, col_offset, "replace"); + if (!text) { + return 0; + } + Py_ssize_t size = PyUnicode_GET_LENGTH(text); + Py_DECREF(text); + return size; +} + +const char * +_PyPegen_get_expr_name(expr_ty e) +{ + assert(e != NULL); + switch (e->kind) { + case Attribute_kind: + return "attribute"; + case Subscript_kind: + return "subscript"; + case Starred_kind: + return "starred"; + case Name_kind: + return "name"; + case List_kind: + return "list"; + case Tuple_kind: + return "tuple"; + case Lambda_kind: + return "lambda"; + case Call_kind: + return "function call"; + case BoolOp_kind: + case BinOp_kind: + case UnaryOp_kind: + return "operator"; + case GeneratorExp_kind: + return "generator expression"; + case Yield_kind: + case YieldFrom_kind: + return "yield expression"; + case Await_kind: + return "await expression"; + case ListComp_kind: + return "list comprehension"; + case SetComp_kind: + return "set comprehension"; + case DictComp_kind: + return "dict comprehension"; + case Dict_kind: + return "dict display"; + case Set_kind: + return "set display"; + case JoinedStr_kind: + case FormattedValue_kind: + return "f-string expression"; + case Constant_kind: { + PyObject *value = e->v.Constant.value; + if (value == Py_None) { + return "None"; + } + if (value == Py_False) { + return "False"; + } + if (value == Py_True) { + return "True"; + } + if (value == Py_Ellipsis) { + return "Ellipsis"; + } + return "literal"; + } + case Compare_kind: + return "comparison"; + case IfExp_kind: + return "conditional expression"; + case NamedExpr_kind: + return "named expression"; + default: + PyErr_Format(PyExc_SystemError, + "unexpected expression in assignment %d (line %d)", + e->kind, e->lineno); + return NULL; + } +} + +static int +raise_decode_error(Parser *p) +{ + assert(PyErr_Occurred()); + const char *errtype = NULL; + if (PyErr_ExceptionMatches(PyExc_UnicodeError)) { + errtype = "unicode error"; + } + else if (PyErr_ExceptionMatches(PyExc_ValueError)) { + errtype = "value error"; + } + if (errtype) { + PyObject *type; + PyObject *value; + PyObject *tback; + PyObject *errstr; + PyErr_Fetch(&type, &value, &tback); + errstr = PyObject_Str(value); + if (errstr) { + RAISE_SYNTAX_ERROR("(%s) %U", errtype, errstr); + Py_DECREF(errstr); + } + else { + PyErr_Clear(); + RAISE_SYNTAX_ERROR("(%s) unknown error", errtype); + } + Py_XDECREF(type); + Py_XDECREF(value); + Py_XDECREF(tback); + } + + return -1; +} + +static void +raise_tokenizer_init_error(PyObject *filename) +{ + if (!(PyErr_ExceptionMatches(PyExc_LookupError) + || PyErr_ExceptionMatches(PyExc_ValueError) + || PyErr_ExceptionMatches(PyExc_UnicodeDecodeError))) { + return; + } + PyObject *errstr = NULL; + PyObject *tuple = NULL; + PyObject *type; + PyObject *value; + PyObject *tback; + PyErr_Fetch(&type, &value, &tback); + errstr = PyObject_Str(value); + if (!errstr) { + goto error; + } + + PyObject *tmp = Py_BuildValue("(OiiO)", filename, 0, -1, Py_None); + if (!tmp) { + goto error; + } + + tuple = PyTuple_Pack(2, errstr, tmp); + Py_DECREF(tmp); + if (!value) { + goto error; + } + PyErr_SetObject(PyExc_SyntaxError, tuple); + +error: + Py_XDECREF(type); + Py_XDECREF(value); + Py_XDECREF(tback); + Py_XDECREF(errstr); + Py_XDECREF(tuple); +} + +static int +tokenizer_error(Parser *p) +{ + if (PyErr_Occurred()) { + return -1; + } + + const char *msg = NULL; + PyObject* errtype = PyExc_SyntaxError; + switch (p->tok->done) { + case E_TOKEN: + msg = "invalid token"; + break; + case E_EOFS: + RAISE_SYNTAX_ERROR("EOF while scanning triple-quoted string literal"); + return -1; + case E_EOLS: + RAISE_SYNTAX_ERROR("EOL while scanning string literal"); + return -1; + case E_EOF: + RAISE_SYNTAX_ERROR("unexpected EOF while parsing"); + return -1; + case E_DEDENT: + RAISE_INDENTATION_ERROR("unindent does not match any outer indentation level"); + return -1; + case E_INTR: + if (!PyErr_Occurred()) { + PyErr_SetNone(PyExc_KeyboardInterrupt); + } + return -1; + case E_NOMEM: + PyErr_NoMemory(); + return -1; + case E_TABSPACE: + errtype = PyExc_TabError; + msg = "inconsistent use of tabs and spaces in indentation"; + break; + case E_TOODEEP: + errtype = PyExc_IndentationError; + msg = "too many levels of indentation"; + break; + case E_LINECONT: + msg = "unexpected character after line continuation character"; + break; + default: + msg = "unknown parsing error"; + } + + PyErr_Format(errtype, msg); + // There is no reliable column information for this error + PyErr_SyntaxLocationObject(p->tok->filename, p->tok->lineno, 0); + + return -1; +} + +void * +_PyPegen_raise_error(Parser *p, PyObject *errtype, const char *errmsg, ...) +{ + Token *t = p->known_err_token != NULL ? p->known_err_token : p->tokens[p->fill - 1]; + Py_ssize_t col_offset; + if (t->col_offset == -1) { + col_offset = Py_SAFE_DOWNCAST(p->tok->cur - p->tok->buf, + intptr_t, int); + } else { + col_offset = t->col_offset + 1; + } + + va_list va; + va_start(va, errmsg); + _PyPegen_raise_error_known_location(p, errtype, t->lineno, + col_offset, errmsg, va); + va_end(va); + + return NULL; +} + +void * +_PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, + Py_ssize_t lineno, Py_ssize_t col_offset, + const char *errmsg, va_list va) +{ + PyObject *value = NULL; + PyObject *errstr = NULL; + PyObject *error_line = NULL; + PyObject *tmp = NULL; + p->error_indicator = 1; + + if (p->start_rule == Py_fstring_input) { + const char *fstring_msg = "f-string: "; + Py_ssize_t len = strlen(fstring_msg) + strlen(errmsg); + + char *new_errmsg = PyMem_RawMalloc(len + 1); // Lengths of both strings plus NULL character + if (!new_errmsg) { + return (void *) PyErr_NoMemory(); + } + + // Copy both strings into new buffer + memcpy(new_errmsg, fstring_msg, strlen(fstring_msg)); + memcpy(new_errmsg + strlen(fstring_msg), errmsg, strlen(errmsg)); + new_errmsg[len] = 0; + errmsg = new_errmsg; + } + errstr = PyUnicode_FromFormatV(errmsg, va); + if (!errstr) { + goto error; + } + + if (p->start_rule == Py_file_input) { + error_line = PyErr_ProgramTextObject(p->tok->filename, (int) lineno); + } + + if (!error_line) { + Py_ssize_t size = p->tok->inp - p->tok->buf; + error_line = PyUnicode_DecodeUTF8(p->tok->buf, size, "replace"); + if (!error_line) { + goto error; + } + } + + if (p->start_rule == Py_fstring_input) { + col_offset -= p->starting_col_offset; + } + Py_ssize_t col_number = col_offset; + + if (p->tok->encoding != NULL) { + col_number = byte_offset_to_character_offset(error_line, col_offset); + } + + tmp = Py_BuildValue("(OiiN)", p->tok->filename, lineno, col_number, error_line); + if (!tmp) { + goto error; + } + value = PyTuple_Pack(2, errstr, tmp); + Py_DECREF(tmp); + if (!value) { + goto error; + } + PyErr_SetObject(errtype, value); + + Py_DECREF(errstr); + Py_DECREF(value); + if (p->start_rule == Py_fstring_input) { + PyMem_RawFree((void *)errmsg); + } + return NULL; + +error: + Py_XDECREF(errstr); + Py_XDECREF(error_line); + if (p->start_rule == Py_fstring_input) { + PyMem_RawFree((void *)errmsg); + } + return NULL; +} + +#if 0 +static const char * +token_name(int type) +{ + if (0 <= type && type <= N_TOKENS) { + return _PyParser_TokenNames[type]; + } + return ""; +} +#endif + +// Here, mark is the start of the node, while p->mark is the end. +// If node==NULL, they should be the same. +int +_PyPegen_insert_memo(Parser *p, int mark, int type, void *node) +{ + // Insert in front + Memo *m = PyArena_Malloc(p->arena, sizeof(Memo)); + if (m == NULL) { + return -1; + } + m->type = type; + m->node = node; + m->mark = p->mark; + m->next = p->tokens[mark]->memo; + p->tokens[mark]->memo = m; + return 0; +} + +// Like _PyPegen_insert_memo(), but updates an existing node if found. +int +_PyPegen_update_memo(Parser *p, int mark, int type, void *node) +{ + for (Memo *m = p->tokens[mark]->memo; m != NULL; m = m->next) { + if (m->type == type) { + // Update existing node. + m->node = node; + m->mark = p->mark; + return 0; + } + } + // Insert new node. + return _PyPegen_insert_memo(p, mark, type, node); +} + +// Return dummy NAME. +void * +_PyPegen_dummy_name(Parser *p, ...) +{ + static void *cache = NULL; + + if (cache != NULL) { + return cache; + } + + PyObject *id = _create_dummy_identifier(p); + if (!id) { + return NULL; + } + cache = Name(id, Load, 1, 0, 1, 0, p->arena); + return cache; +} + +static int +_get_keyword_or_name_type(Parser *p, const char *name, int name_len) +{ + assert(name_len > 0); + if (name_len >= p->n_keyword_lists || + p->keywords[name_len] == NULL || + p->keywords[name_len]->type == -1) { + return NAME; + } + for (KeywordToken *k = p->keywords[name_len]; k != NULL && k->type != -1; k++) { + if (strncmp(k->str, name, name_len) == 0) { + return k->type; + } + } + return NAME; +} + +static int +growable_comment_array_init(growable_comment_array *arr, size_t initial_size) { + assert(initial_size > 0); + arr->items = PyMem_Malloc(initial_size * sizeof(*arr->items)); + arr->size = initial_size; + arr->num_items = 0; + + return arr->items != NULL; +} + +static int +growable_comment_array_add(growable_comment_array *arr, int lineno, char *comment) { + if (arr->num_items >= arr->size) { + size_t new_size = arr->size * 2; + void *new_items_array = PyMem_Realloc(arr->items, new_size * sizeof(*arr->items)); + if (!new_items_array) { + return 0; + } + arr->items = new_items_array; + arr->size = new_size; + } + + arr->items[arr->num_items].lineno = lineno; + arr->items[arr->num_items].comment = comment; // Take ownership + arr->num_items++; + return 1; +} + +static void +growable_comment_array_deallocate(growable_comment_array *arr) { + for (unsigned i = 0; i < arr->num_items; i++) { + PyMem_Free(arr->items[i].comment); + } + PyMem_Free(arr->items); +} + +int +_PyPegen_fill_token(Parser *p) +{ + const char *start; + const char *end; + int type = PyTokenizer_Get(p->tok, &start, &end); + + // Record and skip '# type: ignore' comments + while (type == TYPE_IGNORE) { + Py_ssize_t len = end - start; + char *tag = PyMem_Malloc(len + 1); + if (tag == NULL) { + PyErr_NoMemory(); + return -1; + } + strncpy(tag, start, len); + tag[len] = '\0'; + // Ownership of tag passes to the growable array + if (!growable_comment_array_add(&p->type_ignore_comments, p->tok->lineno, tag)) { + PyErr_NoMemory(); + return -1; + } + type = PyTokenizer_Get(p->tok, &start, &end); + } + + if (type == ENDMARKER && p->start_rule == Py_single_input && p->parsing_started) { + type = NEWLINE; /* Add an extra newline */ + p->parsing_started = 0; + + if (p->tok->indent && !(p->flags & PyPARSE_DONT_IMPLY_DEDENT)) { + p->tok->pendin = -p->tok->indent; + p->tok->indent = 0; + } + } + else { + p->parsing_started = 1; + } + + if (p->fill == p->size) { + int newsize = p->size * 2; + Token **new_tokens = PyMem_Realloc(p->tokens, newsize * sizeof(Token *)); + if (new_tokens == NULL) { + PyErr_NoMemory(); + return -1; + } + p->tokens = new_tokens; + + for (int i = p->size; i < newsize; i++) { + p->tokens[i] = PyMem_Malloc(sizeof(Token)); + if (p->tokens[i] == NULL) { + p->size = i; // Needed, in order to cleanup correctly after parser fails + PyErr_NoMemory(); + return -1; + } + memset(p->tokens[i], '\0', sizeof(Token)); + } + p->size = newsize; + } + + Token *t = p->tokens[p->fill]; + t->type = (type == NAME) ? _get_keyword_or_name_type(p, start, (int)(end - start)) : type; + t->bytes = PyBytes_FromStringAndSize(start, end - start); + if (t->bytes == NULL) { + return -1; + } + PyArena_AddPyObject(p->arena, t->bytes); + + int lineno = type == STRING ? p->tok->first_lineno : p->tok->lineno; + const char *line_start = type == STRING ? p->tok->multi_line_start : p->tok->line_start; + int end_lineno = p->tok->lineno; + int col_offset = -1; + int end_col_offset = -1; + if (start != NULL && start >= line_start) { + col_offset = (int)(start - line_start); + } + if (end != NULL && end >= p->tok->line_start) { + end_col_offset = (int)(end - p->tok->line_start); + } + + t->lineno = p->starting_lineno + lineno; + t->col_offset = p->tok->lineno == 1 ? p->starting_col_offset + col_offset : col_offset; + t->end_lineno = p->starting_lineno + end_lineno; + t->end_col_offset = p->tok->lineno == 1 ? p->starting_col_offset + end_col_offset : end_col_offset; + + p->fill += 1; + + if (type == ERRORTOKEN) { + if (p->tok->done == E_DECODE) { + return raise_decode_error(p); + } + return tokenizer_error(p); + + } + + return 0; +} + +// Instrumentation to count the effectiveness of memoization. +// The array counts the number of tokens skipped by memoization, +// indexed by type. + +#define NSTATISTICS 2000 +static long memo_statistics[NSTATISTICS]; + +void +_PyPegen_clear_memo_statistics() +{ + for (int i = 0; i < NSTATISTICS; i++) { + memo_statistics[i] = 0; + } +} + +PyObject * +_PyPegen_get_memo_statistics() +{ + PyObject *ret = PyList_New(NSTATISTICS); + if (ret == NULL) { + return NULL; + } + for (int i = 0; i < NSTATISTICS; i++) { + PyObject *value = PyLong_FromLong(memo_statistics[i]); + if (value == NULL) { + Py_DECREF(ret); + return NULL; + } + // PyList_SetItem borrows a reference to value. + if (PyList_SetItem(ret, i, value) < 0) { + Py_DECREF(ret); + return NULL; + } + } + return ret; +} + +int // bool +_PyPegen_is_memoized(Parser *p, int type, void *pres) +{ + if (p->mark == p->fill) { + if (_PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + return -1; + } + } + + Token *t = p->tokens[p->mark]; + + for (Memo *m = t->memo; m != NULL; m = m->next) { + if (m->type == type) { + if (0 <= type && type < NSTATISTICS) { + long count = m->mark - p->mark; + // A memoized negative result counts for one. + if (count <= 0) { + count = 1; + } + memo_statistics[type] += count; + } + p->mark = m->mark; + *(void **)(pres) = m->node; + return 1; + } + } + return 0; +} + +int +_PyPegen_lookahead_with_name(int positive, expr_ty (func)(Parser *), Parser *p) +{ + int mark = p->mark; + void *res = func(p); + p->mark = mark; + return (res != NULL) == positive; +} + +int +_PyPegen_lookahead_with_string(int positive, expr_ty (func)(Parser *, const char*), Parser *p, const char* arg) +{ + int mark = p->mark; + void *res = func(p, arg); + p->mark = mark; + return (res != NULL) == positive; +} + +int +_PyPegen_lookahead_with_int(int positive, Token *(func)(Parser *, int), Parser *p, int arg) +{ + int mark = p->mark; + void *res = func(p, arg); + p->mark = mark; + return (res != NULL) == positive; +} + +int +_PyPegen_lookahead(int positive, void *(func)(Parser *), Parser *p) +{ + int mark = p->mark; + void *res = (void*)func(p); + p->mark = mark; + return (res != NULL) == positive; +} + +Token * +_PyPegen_expect_token(Parser *p, int type) +{ + if (p->mark == p->fill) { + if (_PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + return NULL; + } + } + Token *t = p->tokens[p->mark]; + if (t->type != type) { + return NULL; + } + p->mark += 1; + return t; +} + +expr_ty +_PyPegen_expect_soft_keyword(Parser *p, const char *keyword) +{ + if (p->mark == p->fill) { + if (_PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + return NULL; + } + } + Token *t = p->tokens[p->mark]; + if (t->type != NAME) { + return NULL; + } + char* s = PyBytes_AsString(t->bytes); + if (!s) { + p->error_indicator = 1; + return NULL; + } + if (strcmp(s, keyword) != 0) { + return NULL; + } + return _PyPegen_name_token(p); +} + +Token * +_PyPegen_get_last_nonnwhitespace_token(Parser *p) +{ + assert(p->mark >= 0); + Token *token = NULL; + for (int m = p->mark - 1; m >= 0; m--) { + token = p->tokens[m]; + if (token->type != ENDMARKER && (token->type < NEWLINE || token->type > DEDENT)) { + break; + } + } + return token; +} + +expr_ty +_PyPegen_name_token(Parser *p) +{ + Token *t = _PyPegen_expect_token(p, NAME); + if (t == NULL) { + return NULL; + } + char* s = PyBytes_AsString(t->bytes); + if (!s) { + p->error_indicator = 1; + return NULL; + } + PyObject *id = _PyPegen_new_identifier(p, s); + if (id == NULL) { + p->error_indicator = 1; + return NULL; + } + return Name(id, Load, t->lineno, t->col_offset, t->end_lineno, t->end_col_offset, + p->arena); +} + +void * +_PyPegen_string_token(Parser *p) +{ + return _PyPegen_expect_token(p, STRING); +} + +static PyObject * +parsenumber_raw(const char *s) +{ + const char *end; + long x; + double dx; + Py_complex compl; + int imflag; + + assert(s != NULL); + errno = 0; + end = s + strlen(s) - 1; + imflag = *end == 'j' || *end == 'J'; + if (s[0] == '0') { + x = (long)PyOS_strtoul(s, (char **)&end, 0); + if (x < 0 && errno == 0) { + return PyLong_FromString(s, (char **)0, 0); + } + } + else { + x = PyOS_strtol(s, (char **)&end, 0); + } + if (*end == '\0') { + if (errno != 0) { + return PyLong_FromString(s, (char **)0, 0); + } + return PyLong_FromLong(x); + } + /* XXX Huge floats may silently fail */ + if (imflag) { + compl.real = 0.; + compl.imag = PyOS_string_to_double(s, (char **)&end, NULL); + if (compl.imag == -1.0 && PyErr_Occurred()) { + return NULL; + } + return PyComplex_FromCComplex(compl); + } + dx = PyOS_string_to_double(s, NULL, NULL); + if (dx == -1.0 && PyErr_Occurred()) { + return NULL; + } + return PyFloat_FromDouble(dx); +} + +static PyObject * +parsenumber(const char *s) +{ + char *dup; + char *end; + PyObject *res = NULL; + + assert(s != NULL); + + if (strchr(s, '_') == NULL) { + return parsenumber_raw(s); + } + /* Create a duplicate without underscores. */ + dup = PyMem_Malloc(strlen(s) + 1); + if (dup == NULL) { + return PyErr_NoMemory(); + } + end = dup; + for (; *s; s++) { + if (*s != '_') { + *end++ = *s; + } + } + *end = '\0'; + res = parsenumber_raw(dup); + PyMem_Free(dup); + return res; +} + +expr_ty +_PyPegen_number_token(Parser *p) +{ + Token *t = _PyPegen_expect_token(p, NUMBER); + if (t == NULL) { + return NULL; + } + + char *num_raw = PyBytes_AsString(t->bytes); + if (num_raw == NULL) { + p->error_indicator = 1; + return NULL; + } + + if (p->feature_version < 6 && strchr(num_raw, '_') != NULL) { + p->error_indicator = 1; + return RAISE_SYNTAX_ERROR("Underscores in numeric literals are only supported " + "in Python 3.6 and greater"); + } + + PyObject *c = parsenumber(num_raw); + + if (c == NULL) { + p->error_indicator = 1; + return NULL; + } + + if (PyArena_AddPyObject(p->arena, c) < 0) { + Py_DECREF(c); + p->error_indicator = 1; + return NULL; + } + + return Constant(c, NULL, t->lineno, t->col_offset, t->end_lineno, t->end_col_offset, + p->arena); +} + +static int // bool +newline_in_string(Parser *p, const char *cur) +{ + for (const char *c = cur; c >= p->tok->buf; c--) { + if (*c == '\'' || *c == '"') { + return 1; + } + } + return 0; +} + +/* Check that the source for a single input statement really is a single + statement by looking at what is left in the buffer after parsing. + Trailing whitespace and comments are OK. */ +static int // bool +bad_single_statement(Parser *p) +{ + const char *cur = strchr(p->tok->buf, '\n'); + + /* Newlines are allowed if preceded by a line continuation character + or if they appear inside a string. */ + if (!cur || *(cur - 1) == '\\' || newline_in_string(p, cur)) { + return 0; + } + char c = *cur; + + for (;;) { + while (c == ' ' || c == '\t' || c == '\n' || c == '\014') { + c = *++cur; + } + + if (!c) { + return 0; + } + + if (c != '#') { + return 1; + } + + /* Suck up comment. */ + while (c && c != '\n') { + c = *++cur; + } + } +} + +void +_PyPegen_Parser_Free(Parser *p) +{ + Py_XDECREF(p->normalize); + for (int i = 0; i < p->size; i++) { + PyMem_Free(p->tokens[i]); + } + PyMem_Free(p->tokens); + growable_comment_array_deallocate(&p->type_ignore_comments); + PyMem_Free(p); +} + +static int +compute_parser_flags(PyCompilerFlags *flags) +{ + int parser_flags = 0; + if (!flags) { + return 0; + } + if (flags->cf_flags & PyCF_DONT_IMPLY_DEDENT) { + parser_flags |= PyPARSE_DONT_IMPLY_DEDENT; + } + if (flags->cf_flags & PyCF_IGNORE_COOKIE) { + parser_flags |= PyPARSE_IGNORE_COOKIE; + } + if (flags->cf_flags & CO_FUTURE_BARRY_AS_BDFL) { + parser_flags |= PyPARSE_BARRY_AS_BDFL; + } + if (flags->cf_flags & PyCF_TYPE_COMMENTS) { + parser_flags |= PyPARSE_TYPE_COMMENTS; + } + if ((flags->cf_flags & PyCF_ONLY_AST) && flags->cf_feature_version < 7) { + parser_flags |= PyPARSE_ASYNC_HACKS; + } + return parser_flags; +} + +Parser * +_PyPegen_Parser_New(struct tok_state *tok, int start_rule, int flags, + int feature_version, int *errcode, PyArena *arena) +{ + Parser *p = PyMem_Malloc(sizeof(Parser)); + if (p == NULL) { + return (Parser *) PyErr_NoMemory(); + } + assert(tok != NULL); + tok->type_comments = (flags & PyPARSE_TYPE_COMMENTS) > 0; + tok->async_hacks = (flags & PyPARSE_ASYNC_HACKS) > 0; + p->tok = tok; + p->keywords = NULL; + p->n_keyword_lists = -1; + p->tokens = PyMem_Malloc(sizeof(Token *)); + if (!p->tokens) { + PyMem_Free(p); + return (Parser *) PyErr_NoMemory(); + } + p->tokens[0] = PyMem_Calloc(1, sizeof(Token)); + if (!p->tokens) { + PyMem_Free(p->tokens); + PyMem_Free(p); + return (Parser *) PyErr_NoMemory(); + } + if (!growable_comment_array_init(&p->type_ignore_comments, 10)) { + PyMem_Free(p->tokens[0]); + PyMem_Free(p->tokens); + PyMem_Free(p); + return (Parser *) PyErr_NoMemory(); + } + + p->mark = 0; + p->fill = 0; + p->size = 1; + + p->errcode = errcode; + p->arena = arena; + p->start_rule = start_rule; + p->parsing_started = 0; + p->normalize = NULL; + p->error_indicator = 0; + + p->starting_lineno = 0; + p->starting_col_offset = 0; + p->flags = flags; + p->feature_version = feature_version; + p->known_err_token = NULL; + p->level = 0; + + return p; +} + +void * +_PyPegen_run_parser(Parser *p) +{ + void *res = _PyPegen_parse(p); + if (res == NULL) { + if (PyErr_Occurred()) { + return NULL; + } + if (p->fill == 0) { + RAISE_SYNTAX_ERROR("error at start before reading any input"); + } + else if (p->tok->done == E_EOF) { + RAISE_SYNTAX_ERROR("unexpected EOF while parsing"); + } + else { + if (p->tokens[p->fill-1]->type == INDENT) { + RAISE_INDENTATION_ERROR("unexpected indent"); + } + else if (p->tokens[p->fill-1]->type == DEDENT) { + RAISE_INDENTATION_ERROR("unexpected unindent"); + } + else { + RAISE_SYNTAX_ERROR("invalid syntax"); + } + } + return NULL; + } + + if (p->start_rule == Py_single_input && bad_single_statement(p)) { + p->tok->done = E_BADSINGLE; // This is not necessary for now, but might be in the future + return RAISE_SYNTAX_ERROR("multiple statements found while compiling a single statement"); + } + +#if defined(Py_DEBUG) && defined(Py_BUILD_CORE) + if (p->start_rule == Py_single_input || + p->start_rule == Py_file_input || + p->start_rule == Py_eval_input) + { + assert(PyAST_Validate(res)); + } +#endif + return res; +} + +mod_ty +_PyPegen_run_parser_from_file_pointer(FILE *fp, int start_rule, PyObject *filename_ob, + const char *enc, const char *ps1, const char *ps2, + PyCompilerFlags *flags, int *errcode, PyArena *arena) +{ + struct tok_state *tok = PyTokenizer_FromFile(fp, enc, ps1, ps2); + if (tok == NULL) { + if (PyErr_Occurred()) { + raise_tokenizer_init_error(filename_ob); + return NULL; + } + return NULL; + } + // This transfers the ownership to the tokenizer + tok->filename = filename_ob; + Py_INCREF(filename_ob); + + // From here on we need to clean up even if there's an error + mod_ty result = NULL; + + int parser_flags = compute_parser_flags(flags); + Parser *p = _PyPegen_Parser_New(tok, start_rule, parser_flags, PY_MINOR_VERSION, + errcode, arena); + if (p == NULL) { + goto error; + } + + result = _PyPegen_run_parser(p); + _PyPegen_Parser_Free(p); + +error: + PyTokenizer_Free(tok); + return result; +} + +mod_ty +_PyPegen_run_parser_from_file(const char *filename, int start_rule, + PyObject *filename_ob, PyCompilerFlags *flags, PyArena *arena) +{ + FILE *fp = fopen(filename, "rb"); + if (fp == NULL) { + PyErr_SetFromErrnoWithFilename(PyExc_OSError, filename); + return NULL; + } + + mod_ty result = _PyPegen_run_parser_from_file_pointer(fp, start_rule, filename_ob, + NULL, NULL, NULL, flags, NULL, arena); + + fclose(fp); + return result; +} + +mod_ty +_PyPegen_run_parser_from_string(const char *str, int start_rule, PyObject *filename_ob, + PyCompilerFlags *flags, PyArena *arena) +{ + int exec_input = start_rule == Py_file_input; + + struct tok_state *tok; + if (flags == NULL || flags->cf_flags & PyCF_IGNORE_COOKIE) { + tok = PyTokenizer_FromUTF8(str, exec_input); + } else { + tok = PyTokenizer_FromString(str, exec_input); + } + if (tok == NULL) { + if (PyErr_Occurred()) { + raise_tokenizer_init_error(filename_ob); + } + return NULL; + } + // This transfers the ownership to the tokenizer + tok->filename = filename_ob; + Py_INCREF(filename_ob); + + // We need to clear up from here on + mod_ty result = NULL; + + int parser_flags = compute_parser_flags(flags); + int feature_version = flags && (flags->cf_flags & PyCF_ONLY_AST) ? + flags->cf_feature_version : PY_MINOR_VERSION; + Parser *p = _PyPegen_Parser_New(tok, start_rule, parser_flags, feature_version, + NULL, arena); + if (p == NULL) { + goto error; + } + + result = _PyPegen_run_parser(p); + _PyPegen_Parser_Free(p); + +error: + PyTokenizer_Free(tok); + return result; +} + +void * +_PyPegen_interactive_exit(Parser *p) +{ + if (p->errcode) { + *(p->errcode) = E_EOF; + } + return NULL; +} + +/* Creates a single-element asdl_seq* that contains a */ +asdl_seq * +_PyPegen_singleton_seq(Parser *p, void *a) +{ + assert(a != NULL); + asdl_seq *seq = _Py_asdl_seq_new(1, p->arena); + if (!seq) { + return NULL; + } + asdl_seq_SET(seq, 0, a); + return seq; +} + +/* Creates a copy of seq and prepends a to it */ +asdl_seq * +_PyPegen_seq_insert_in_front(Parser *p, void *a, asdl_seq *seq) +{ + assert(a != NULL); + if (!seq) { + return _PyPegen_singleton_seq(p, a); + } + + asdl_seq *new_seq = _Py_asdl_seq_new(asdl_seq_LEN(seq) + 1, p->arena); + if (!new_seq) { + return NULL; + } + + asdl_seq_SET(new_seq, 0, a); + for (Py_ssize_t i = 1, l = asdl_seq_LEN(new_seq); i < l; i++) { + asdl_seq_SET(new_seq, i, asdl_seq_GET(seq, i - 1)); + } + return new_seq; +} + +/* Creates a copy of seq and appends a to it */ +asdl_seq * +_PyPegen_seq_append_to_end(Parser *p, asdl_seq *seq, void *a) +{ + assert(a != NULL); + if (!seq) { + return _PyPegen_singleton_seq(p, a); + } + + asdl_seq *new_seq = _Py_asdl_seq_new(asdl_seq_LEN(seq) + 1, p->arena); + if (!new_seq) { + return NULL; + } + + for (Py_ssize_t i = 0, l = asdl_seq_LEN(new_seq); i + 1 < l; i++) { + asdl_seq_SET(new_seq, i, asdl_seq_GET(seq, i)); + } + asdl_seq_SET(new_seq, asdl_seq_LEN(new_seq) - 1, a); + return new_seq; +} + +static Py_ssize_t +_get_flattened_seq_size(asdl_seq *seqs) +{ + Py_ssize_t size = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) { + asdl_seq *inner_seq = asdl_seq_GET(seqs, i); + size += asdl_seq_LEN(inner_seq); + } + return size; +} + +/* Flattens an asdl_seq* of asdl_seq*s */ +asdl_seq * +_PyPegen_seq_flatten(Parser *p, asdl_seq *seqs) +{ + Py_ssize_t flattened_seq_size = _get_flattened_seq_size(seqs); + assert(flattened_seq_size > 0); + + asdl_seq *flattened_seq = _Py_asdl_seq_new(flattened_seq_size, p->arena); + if (!flattened_seq) { + return NULL; + } + + int flattened_seq_idx = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) { + asdl_seq *inner_seq = asdl_seq_GET(seqs, i); + for (Py_ssize_t j = 0, li = asdl_seq_LEN(inner_seq); j < li; j++) { + asdl_seq_SET(flattened_seq, flattened_seq_idx++, asdl_seq_GET(inner_seq, j)); + } + } + assert(flattened_seq_idx == flattened_seq_size); + + return flattened_seq; +} + +/* Creates a new name of the form . */ +expr_ty +_PyPegen_join_names_with_dot(Parser *p, expr_ty first_name, expr_ty second_name) +{ + assert(first_name != NULL && second_name != NULL); + PyObject *first_identifier = first_name->v.Name.id; + PyObject *second_identifier = second_name->v.Name.id; + + if (PyUnicode_READY(first_identifier) == -1) { + return NULL; + } + if (PyUnicode_READY(second_identifier) == -1) { + return NULL; + } + const char *first_str = PyUnicode_AsUTF8(first_identifier); + if (!first_str) { + return NULL; + } + const char *second_str = PyUnicode_AsUTF8(second_identifier); + if (!second_str) { + return NULL; + } + Py_ssize_t len = strlen(first_str) + strlen(second_str) + 1; // +1 for the dot + + PyObject *str = PyBytes_FromStringAndSize(NULL, len); + if (!str) { + return NULL; + } + + char *s = PyBytes_AS_STRING(str); + if (!s) { + return NULL; + } + + strcpy(s, first_str); + s += strlen(first_str); + *s++ = '.'; + strcpy(s, second_str); + s += strlen(second_str); + *s = '\0'; + + PyObject *uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str), PyBytes_GET_SIZE(str), NULL); + Py_DECREF(str); + if (!uni) { + return NULL; + } + PyUnicode_InternInPlace(&uni); + if (PyArena_AddPyObject(p->arena, uni) < 0) { + Py_DECREF(uni); + return NULL; + } + + return _Py_Name(uni, Load, EXTRA_EXPR(first_name, second_name)); +} + +/* Counts the total number of dots in seq's tokens */ +int +_PyPegen_seq_count_dots(asdl_seq *seq) +{ + int number_of_dots = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) { + Token *current_expr = asdl_seq_GET(seq, i); + switch (current_expr->type) { + case ELLIPSIS: + number_of_dots += 3; + break; + case DOT: + number_of_dots += 1; + break; + default: + Py_UNREACHABLE(); + } + } + + return number_of_dots; +} + +/* Creates an alias with '*' as the identifier name */ +alias_ty +_PyPegen_alias_for_star(Parser *p) +{ + PyObject *str = PyUnicode_InternFromString("*"); + if (!str) { + return NULL; + } + if (PyArena_AddPyObject(p->arena, str) < 0) { + Py_DECREF(str); + return NULL; + } + return alias(str, NULL, p->arena); +} + +/* Creates a new asdl_seq* with the identifiers of all the names in seq */ +asdl_seq * +_PyPegen_map_names_to_ids(Parser *p, asdl_seq *seq) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + assert(len > 0); + + asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + expr_ty e = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, e->v.Name.id); + } + return new_seq; +} + +/* Constructs a CmpopExprPair */ +CmpopExprPair * +_PyPegen_cmpop_expr_pair(Parser *p, cmpop_ty cmpop, expr_ty expr) +{ + assert(expr != NULL); + CmpopExprPair *a = PyArena_Malloc(p->arena, sizeof(CmpopExprPair)); + if (!a) { + return NULL; + } + a->cmpop = cmpop; + a->expr = expr; + return a; +} + +asdl_int_seq * +_PyPegen_get_cmpops(Parser *p, asdl_seq *seq) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + assert(len > 0); + + asdl_int_seq *new_seq = _Py_asdl_int_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + CmpopExprPair *pair = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, pair->cmpop); + } + return new_seq; +} + +asdl_seq * +_PyPegen_get_exprs(Parser *p, asdl_seq *seq) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + assert(len > 0); + + asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + CmpopExprPair *pair = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, pair->expr); + } + return new_seq; +} + +/* Creates an asdl_seq* where all the elements have been changed to have ctx as context */ +static asdl_seq * +_set_seq_context(Parser *p, asdl_seq *seq, expr_context_ty ctx) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + if (len == 0) { + return NULL; + } + + asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + expr_ty e = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, _PyPegen_set_expr_context(p, e, ctx)); + } + return new_seq; +} + +static expr_ty +_set_name_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_Name(e->v.Name.id, ctx, EXTRA_EXPR(e, e)); +} + +static expr_ty +_set_tuple_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_Tuple(_set_seq_context(p, e->v.Tuple.elts, ctx), ctx, EXTRA_EXPR(e, e)); +} + +static expr_ty +_set_list_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_List(_set_seq_context(p, e->v.List.elts, ctx), ctx, EXTRA_EXPR(e, e)); +} + +static expr_ty +_set_subscript_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_Subscript(e->v.Subscript.value, e->v.Subscript.slice, ctx, EXTRA_EXPR(e, e)); +} + +static expr_ty +_set_attribute_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_Attribute(e->v.Attribute.value, e->v.Attribute.attr, ctx, EXTRA_EXPR(e, e)); +} + +static expr_ty +_set_starred_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_Starred(_PyPegen_set_expr_context(p, e->v.Starred.value, ctx), ctx, EXTRA_EXPR(e, e)); +} + +/* Creates an `expr_ty` equivalent to `expr` but with `ctx` as context */ +expr_ty +_PyPegen_set_expr_context(Parser *p, expr_ty expr, expr_context_ty ctx) +{ + assert(expr != NULL); + + expr_ty new = NULL; + switch (expr->kind) { + case Name_kind: + new = _set_name_context(p, expr, ctx); + break; + case Tuple_kind: + new = _set_tuple_context(p, expr, ctx); + break; + case List_kind: + new = _set_list_context(p, expr, ctx); + break; + case Subscript_kind: + new = _set_subscript_context(p, expr, ctx); + break; + case Attribute_kind: + new = _set_attribute_context(p, expr, ctx); + break; + case Starred_kind: + new = _set_starred_context(p, expr, ctx); + break; + default: + new = expr; + } + return new; +} + +/* Constructs a KeyValuePair that is used when parsing a dict's key value pairs */ +KeyValuePair * +_PyPegen_key_value_pair(Parser *p, expr_ty key, expr_ty value) +{ + KeyValuePair *a = PyArena_Malloc(p->arena, sizeof(KeyValuePair)); + if (!a) { + return NULL; + } + a->key = key; + a->value = value; + return a; +} + +/* Extracts all keys from an asdl_seq* of KeyValuePair*'s */ +asdl_seq * +_PyPegen_get_keys(Parser *p, asdl_seq *seq) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + KeyValuePair *pair = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, pair->key); + } + return new_seq; +} + +/* Extracts all values from an asdl_seq* of KeyValuePair*'s */ +asdl_seq * +_PyPegen_get_values(Parser *p, asdl_seq *seq) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + KeyValuePair *pair = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, pair->value); + } + return new_seq; +} + +/* Constructs a NameDefaultPair */ +NameDefaultPair * +_PyPegen_name_default_pair(Parser *p, arg_ty arg, expr_ty value, Token *tc) +{ + NameDefaultPair *a = PyArena_Malloc(p->arena, sizeof(NameDefaultPair)); + if (!a) { + return NULL; + } + a->arg = _PyPegen_add_type_comment_to_arg(p, arg, tc); + a->value = value; + return a; +} + +/* Constructs a SlashWithDefault */ +SlashWithDefault * +_PyPegen_slash_with_default(Parser *p, asdl_seq *plain_names, asdl_seq *names_with_defaults) +{ + SlashWithDefault *a = PyArena_Malloc(p->arena, sizeof(SlashWithDefault)); + if (!a) { + return NULL; + } + a->plain_names = plain_names; + a->names_with_defaults = names_with_defaults; + return a; +} + +/* Constructs a StarEtc */ +StarEtc * +_PyPegen_star_etc(Parser *p, arg_ty vararg, asdl_seq *kwonlyargs, arg_ty kwarg) +{ + StarEtc *a = PyArena_Malloc(p->arena, sizeof(StarEtc)); + if (!a) { + return NULL; + } + a->vararg = vararg; + a->kwonlyargs = kwonlyargs; + a->kwarg = kwarg; + return a; +} + +asdl_seq * +_PyPegen_join_sequences(Parser *p, asdl_seq *a, asdl_seq *b) +{ + Py_ssize_t first_len = asdl_seq_LEN(a); + Py_ssize_t second_len = asdl_seq_LEN(b); + asdl_seq *new_seq = _Py_asdl_seq_new(first_len + second_len, p->arena); + if (!new_seq) { + return NULL; + } + + int k = 0; + for (Py_ssize_t i = 0; i < first_len; i++) { + asdl_seq_SET(new_seq, k++, asdl_seq_GET(a, i)); + } + for (Py_ssize_t i = 0; i < second_len; i++) { + asdl_seq_SET(new_seq, k++, asdl_seq_GET(b, i)); + } + + return new_seq; +} + +static asdl_seq * +_get_names(Parser *p, asdl_seq *names_with_defaults) +{ + Py_ssize_t len = asdl_seq_LEN(names_with_defaults); + asdl_seq *seq = _Py_asdl_seq_new(len, p->arena); + if (!seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + NameDefaultPair *pair = asdl_seq_GET(names_with_defaults, i); + asdl_seq_SET(seq, i, pair->arg); + } + return seq; +} + +static asdl_seq * +_get_defaults(Parser *p, asdl_seq *names_with_defaults) +{ + Py_ssize_t len = asdl_seq_LEN(names_with_defaults); + asdl_seq *seq = _Py_asdl_seq_new(len, p->arena); + if (!seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + NameDefaultPair *pair = asdl_seq_GET(names_with_defaults, i); + asdl_seq_SET(seq, i, pair->value); + } + return seq; +} + +/* Constructs an arguments_ty object out of all the parsed constructs in the parameters rule */ +arguments_ty +_PyPegen_make_arguments(Parser *p, asdl_seq *slash_without_default, + SlashWithDefault *slash_with_default, asdl_seq *plain_names, + asdl_seq *names_with_default, StarEtc *star_etc) +{ + asdl_seq *posonlyargs; + if (slash_without_default != NULL) { + posonlyargs = slash_without_default; + } + else if (slash_with_default != NULL) { + asdl_seq *slash_with_default_names = + _get_names(p, slash_with_default->names_with_defaults); + if (!slash_with_default_names) { + return NULL; + } + posonlyargs = _PyPegen_join_sequences(p, slash_with_default->plain_names, slash_with_default_names); + if (!posonlyargs) { + return NULL; + } + } + else { + posonlyargs = _Py_asdl_seq_new(0, p->arena); + if (!posonlyargs) { + return NULL; + } + } + + asdl_seq *posargs; + if (plain_names != NULL && names_with_default != NULL) { + asdl_seq *names_with_default_names = _get_names(p, names_with_default); + if (!names_with_default_names) { + return NULL; + } + posargs = _PyPegen_join_sequences(p, plain_names, names_with_default_names); + if (!posargs) { + return NULL; + } + } + else if (plain_names == NULL && names_with_default != NULL) { + posargs = _get_names(p, names_with_default); + if (!posargs) { + return NULL; + } + } + else if (plain_names != NULL && names_with_default == NULL) { + posargs = plain_names; + } + else { + posargs = _Py_asdl_seq_new(0, p->arena); + if (!posargs) { + return NULL; + } + } + + asdl_seq *posdefaults; + if (slash_with_default != NULL && names_with_default != NULL) { + asdl_seq *slash_with_default_values = + _get_defaults(p, slash_with_default->names_with_defaults); + if (!slash_with_default_values) { + return NULL; + } + asdl_seq *names_with_default_values = _get_defaults(p, names_with_default); + if (!names_with_default_values) { + return NULL; + } + posdefaults = _PyPegen_join_sequences(p, slash_with_default_values, names_with_default_values); + if (!posdefaults) { + return NULL; + } + } + else if (slash_with_default == NULL && names_with_default != NULL) { + posdefaults = _get_defaults(p, names_with_default); + if (!posdefaults) { + return NULL; + } + } + else if (slash_with_default != NULL && names_with_default == NULL) { + posdefaults = _get_defaults(p, slash_with_default->names_with_defaults); + if (!posdefaults) { + return NULL; + } + } + else { + posdefaults = _Py_asdl_seq_new(0, p->arena); + if (!posdefaults) { + return NULL; + } + } + + arg_ty vararg = NULL; + if (star_etc != NULL && star_etc->vararg != NULL) { + vararg = star_etc->vararg; + } + + asdl_seq *kwonlyargs; + if (star_etc != NULL && star_etc->kwonlyargs != NULL) { + kwonlyargs = _get_names(p, star_etc->kwonlyargs); + if (!kwonlyargs) { + return NULL; + } + } + else { + kwonlyargs = _Py_asdl_seq_new(0, p->arena); + if (!kwonlyargs) { + return NULL; + } + } + + asdl_seq *kwdefaults; + if (star_etc != NULL && star_etc->kwonlyargs != NULL) { + kwdefaults = _get_defaults(p, star_etc->kwonlyargs); + if (!kwdefaults) { + return NULL; + } + } + else { + kwdefaults = _Py_asdl_seq_new(0, p->arena); + if (!kwdefaults) { + return NULL; + } + } + + arg_ty kwarg = NULL; + if (star_etc != NULL && star_etc->kwarg != NULL) { + kwarg = star_etc->kwarg; + } + + return _Py_arguments(posonlyargs, posargs, vararg, kwonlyargs, kwdefaults, kwarg, + posdefaults, p->arena); +} + +/* Constructs an empty arguments_ty object, that gets used when a function accepts no + * arguments. */ +arguments_ty +_PyPegen_empty_arguments(Parser *p) +{ + asdl_seq *posonlyargs = _Py_asdl_seq_new(0, p->arena); + if (!posonlyargs) { + return NULL; + } + asdl_seq *posargs = _Py_asdl_seq_new(0, p->arena); + if (!posargs) { + return NULL; + } + asdl_seq *posdefaults = _Py_asdl_seq_new(0, p->arena); + if (!posdefaults) { + return NULL; + } + asdl_seq *kwonlyargs = _Py_asdl_seq_new(0, p->arena); + if (!kwonlyargs) { + return NULL; + } + asdl_seq *kwdefaults = _Py_asdl_seq_new(0, p->arena); + if (!kwdefaults) { + return NULL; + } + + return _Py_arguments(posonlyargs, posargs, NULL, kwonlyargs, kwdefaults, NULL, kwdefaults, + p->arena); +} + +/* Encapsulates the value of an operator_ty into an AugOperator struct */ +AugOperator * +_PyPegen_augoperator(Parser *p, operator_ty kind) +{ + AugOperator *a = PyArena_Malloc(p->arena, sizeof(AugOperator)); + if (!a) { + return NULL; + } + a->kind = kind; + return a; +} + +/* Construct a FunctionDef equivalent to function_def, but with decorators */ +stmt_ty +_PyPegen_function_def_decorators(Parser *p, asdl_seq *decorators, stmt_ty function_def) +{ + assert(function_def != NULL); + if (function_def->kind == AsyncFunctionDef_kind) { + return _Py_AsyncFunctionDef( + function_def->v.FunctionDef.name, function_def->v.FunctionDef.args, + function_def->v.FunctionDef.body, decorators, function_def->v.FunctionDef.returns, + function_def->v.FunctionDef.type_comment, function_def->lineno, + function_def->col_offset, function_def->end_lineno, function_def->end_col_offset, + p->arena); + } + + return _Py_FunctionDef(function_def->v.FunctionDef.name, function_def->v.FunctionDef.args, + function_def->v.FunctionDef.body, decorators, + function_def->v.FunctionDef.returns, + function_def->v.FunctionDef.type_comment, function_def->lineno, + function_def->col_offset, function_def->end_lineno, + function_def->end_col_offset, p->arena); +} + +/* Construct a ClassDef equivalent to class_def, but with decorators */ +stmt_ty +_PyPegen_class_def_decorators(Parser *p, asdl_seq *decorators, stmt_ty class_def) +{ + assert(class_def != NULL); + return _Py_ClassDef(class_def->v.ClassDef.name, class_def->v.ClassDef.bases, + class_def->v.ClassDef.keywords, class_def->v.ClassDef.body, decorators, + class_def->lineno, class_def->col_offset, class_def->end_lineno, + class_def->end_col_offset, p->arena); +} + +/* Construct a KeywordOrStarred */ +KeywordOrStarred * +_PyPegen_keyword_or_starred(Parser *p, void *element, int is_keyword) +{ + KeywordOrStarred *a = PyArena_Malloc(p->arena, sizeof(KeywordOrStarred)); + if (!a) { + return NULL; + } + a->element = element; + a->is_keyword = is_keyword; + return a; +} + +/* Get the number of starred expressions in an asdl_seq* of KeywordOrStarred*s */ +static int +_seq_number_of_starred_exprs(asdl_seq *seq) +{ + int n = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) { + KeywordOrStarred *k = asdl_seq_GET(seq, i); + if (!k->is_keyword) { + n++; + } + } + return n; +} + +/* Extract the starred expressions of an asdl_seq* of KeywordOrStarred*s */ +asdl_seq * +_PyPegen_seq_extract_starred_exprs(Parser *p, asdl_seq *kwargs) +{ + int new_len = _seq_number_of_starred_exprs(kwargs); + if (new_len == 0) { + return NULL; + } + asdl_seq *new_seq = _Py_asdl_seq_new(new_len, p->arena); + if (!new_seq) { + return NULL; + } + + int idx = 0; + for (Py_ssize_t i = 0, len = asdl_seq_LEN(kwargs); i < len; i++) { + KeywordOrStarred *k = asdl_seq_GET(kwargs, i); + if (!k->is_keyword) { + asdl_seq_SET(new_seq, idx++, k->element); + } + } + return new_seq; +} + +/* Return a new asdl_seq* with only the keywords in kwargs */ +asdl_seq * +_PyPegen_seq_delete_starred_exprs(Parser *p, asdl_seq *kwargs) +{ + Py_ssize_t len = asdl_seq_LEN(kwargs); + Py_ssize_t new_len = len - _seq_number_of_starred_exprs(kwargs); + if (new_len == 0) { + return NULL; + } + asdl_seq *new_seq = _Py_asdl_seq_new(new_len, p->arena); + if (!new_seq) { + return NULL; + } + + int idx = 0; + for (Py_ssize_t i = 0; i < len; i++) { + KeywordOrStarred *k = asdl_seq_GET(kwargs, i); + if (k->is_keyword) { + asdl_seq_SET(new_seq, idx++, k->element); + } + } + return new_seq; +} + +expr_ty +_PyPegen_concatenate_strings(Parser *p, asdl_seq *strings) +{ + Py_ssize_t len = asdl_seq_LEN(strings); + assert(len > 0); + + Token *first = asdl_seq_GET(strings, 0); + Token *last = asdl_seq_GET(strings, len - 1); + + int bytesmode = 0; + PyObject *bytes_str = NULL; + + FstringParser state; + _PyPegen_FstringParser_Init(&state); + + for (Py_ssize_t i = 0; i < len; i++) { + Token *t = asdl_seq_GET(strings, i); + + int this_bytesmode; + int this_rawmode; + PyObject *s; + const char *fstr; + Py_ssize_t fstrlen = -1; + + if (_PyPegen_parsestr(p, &this_bytesmode, &this_rawmode, &s, &fstr, &fstrlen, t) != 0) { + goto error; + } + + /* Check that we are not mixing bytes with unicode. */ + if (i != 0 && bytesmode != this_bytesmode) { + RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals"); + Py_XDECREF(s); + goto error; + } + bytesmode = this_bytesmode; + + if (fstr != NULL) { + assert(s == NULL && !bytesmode); + + int result = _PyPegen_FstringParser_ConcatFstring(p, &state, &fstr, fstr + fstrlen, + this_rawmode, 0, first, t, last); + if (result < 0) { + goto error; + } + } + else { + /* String or byte string. */ + assert(s != NULL && fstr == NULL); + assert(bytesmode ? PyBytes_CheckExact(s) : PyUnicode_CheckExact(s)); + + if (bytesmode) { + if (i == 0) { + bytes_str = s; + } + else { + PyBytes_ConcatAndDel(&bytes_str, s); + if (!bytes_str) { + goto error; + } + } + } + else { + /* This is a regular string. Concatenate it. */ + if (_PyPegen_FstringParser_ConcatAndDel(&state, s) < 0) { + goto error; + } + } + } + } + + if (bytesmode) { + if (PyArena_AddPyObject(p->arena, bytes_str) < 0) { + goto error; + } + return Constant(bytes_str, NULL, first->lineno, first->col_offset, last->end_lineno, + last->end_col_offset, p->arena); + } + + return _PyPegen_FstringParser_Finish(p, &state, first, last); + +error: + Py_XDECREF(bytes_str); + _PyPegen_FstringParser_Dealloc(&state); + if (PyErr_Occurred()) { + raise_decode_error(p); + } + return NULL; +} + +mod_ty +_PyPegen_make_module(Parser *p, asdl_seq *a) { + asdl_seq *type_ignores = NULL; + Py_ssize_t num = p->type_ignore_comments.num_items; + if (num > 0) { + // Turn the raw (comment, lineno) pairs into TypeIgnore objects in the arena + type_ignores = _Py_asdl_seq_new(num, p->arena); + if (type_ignores == NULL) { + return NULL; + } + for (int i = 0; i < num; i++) { + PyObject *tag = _PyPegen_new_type_comment(p, p->type_ignore_comments.items[i].comment); + if (tag == NULL) { + return NULL; + } + type_ignore_ty ti = TypeIgnore(p->type_ignore_comments.items[i].lineno, tag, p->arena); + if (ti == NULL) { + return NULL; + } + asdl_seq_SET(type_ignores, i, ti); + } + } + return Module(a, type_ignores, p->arena); +} + +// Error reporting helpers + +expr_ty +_PyPegen_get_invalid_target(expr_ty e, TARGETS_TYPE targets_type) +{ + if (e == NULL) { + return NULL; + } + +#define VISIT_CONTAINER(CONTAINER, TYPE) do { \ + Py_ssize_t len = asdl_seq_LEN(CONTAINER->v.TYPE.elts);\ + for (Py_ssize_t i = 0; i < len; i++) {\ + expr_ty other = asdl_seq_GET(CONTAINER->v.TYPE.elts, i);\ + expr_ty child = _PyPegen_get_invalid_target(other, targets_type);\ + if (child != NULL) {\ + return child;\ + }\ + }\ + } while (0) + + // We only need to visit List and Tuple nodes recursively as those + // are the only ones that can contain valid names in targets when + // they are parsed as expressions. Any other kind of expression + // that is a container (like Sets or Dicts) is directly invalid and + // we don't need to visit it recursively. + + switch (e->kind) { + case List_kind: + VISIT_CONTAINER(e, List); + return NULL; + case Tuple_kind: + VISIT_CONTAINER(e, Tuple); + return NULL; + case Starred_kind: + if (targets_type == DEL_TARGETS) { + return e; + } + return _PyPegen_get_invalid_target(e->v.Starred.value, targets_type); + case Compare_kind: + // This is needed, because the `a in b` in `for a in b` gets parsed + // as a comparison, and so we need to search the left side of the comparison + // for invalid targets. + if (targets_type == FOR_TARGETS) { + cmpop_ty cmpop = (cmpop_ty) asdl_seq_GET(e->v.Compare.ops, 0); + if (cmpop == In) { + return _PyPegen_get_invalid_target(e->v.Compare.left, targets_type); + } + return NULL; + } + return e; + case Name_kind: + case Subscript_kind: + case Attribute_kind: + return NULL; + default: + return e; + } +} + +void *_PyPegen_arguments_parsing_error(Parser *p, expr_ty e) { + int kwarg_unpacking = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(e->v.Call.keywords); i < l; i++) { + keyword_ty keyword = asdl_seq_GET(e->v.Call.keywords, i); + if (!keyword->arg) { + kwarg_unpacking = 1; + } + } + + const char *msg = NULL; + if (kwarg_unpacking) { + msg = "positional argument follows keyword argument unpacking"; + } else { + msg = "positional argument follows keyword argument"; + } + + return RAISE_SYNTAX_ERROR(msg); +} + +void * +_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args) +{ + /* The rule that calls this function is 'args for_if_clauses'. + For the input f(L, x for x in y), L and x are in args and + the for is parsed as a for_if_clause. We have to check if + len <= 1, so that input like dict((a, b) for a, b in x) + gets successfully parsed and then we pass the last + argument (x in the above example) as the location of the + error */ + Py_ssize_t len = asdl_seq_LEN(args->v.Call.args); + if (len <= 1) { + return NULL; + } + + return RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + (expr_ty) asdl_seq_GET(args->v.Call.args, len - 1), + "Generator expression must be parenthesized" + ); +} + + +expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_seq *a, asdl_seq *b, + int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena) { + Py_ssize_t args_len = asdl_seq_LEN(a); + Py_ssize_t total_len = args_len; + + if (b == NULL) { + return _Py_Call(_PyPegen_dummy_name(p), a, NULL, lineno, col_offset, + end_lineno, end_col_offset, arena); + + } + + asdl_seq *starreds = _PyPegen_seq_extract_starred_exprs(p, b); + asdl_seq *keywords = _PyPegen_seq_delete_starred_exprs(p, b); + + if (starreds) { + total_len += asdl_seq_LEN(starreds); + } + + asdl_seq *args = _Py_asdl_seq_new(total_len, arena); + + Py_ssize_t i = 0; + for (i = 0; i < args_len; i++) { + asdl_seq_SET(args, i, asdl_seq_GET(a, i)); + } + for (; i < total_len; i++) { + asdl_seq_SET(args, i, asdl_seq_GET(starreds, i - args_len)); + } + + return _Py_Call(_PyPegen_dummy_name(p), args, keywords, lineno, + col_offset, end_lineno, end_col_offset, arena); + + +} diff --git a/Parser/pegen/pegen.h b/Parser/pegen/pegen.h new file mode 100644 index 00000000..bd35d4ff --- /dev/null +++ b/Parser/pegen/pegen.h @@ -0,0 +1,305 @@ +#ifndef PEGEN_H +#define PEGEN_H + +#define PY_SSIZE_T_CLEAN +#include +#include +#include +#include + +#if 0 +#define PyPARSE_YIELD_IS_KEYWORD 0x0001 +#endif + +#define PyPARSE_DONT_IMPLY_DEDENT 0x0002 + +#if 0 +#define PyPARSE_WITH_IS_KEYWORD 0x0003 +#define PyPARSE_PRINT_IS_FUNCTION 0x0004 +#define PyPARSE_UNICODE_LITERALS 0x0008 +#endif + +#define PyPARSE_IGNORE_COOKIE 0x0010 +#define PyPARSE_BARRY_AS_BDFL 0x0020 +#define PyPARSE_TYPE_COMMENTS 0x0040 +#define PyPARSE_ASYNC_HACKS 0x0080 + +typedef struct _memo { + int type; + void *node; + int mark; + struct _memo *next; +} Memo; + +typedef struct { + int type; + PyObject *bytes; + int lineno, col_offset, end_lineno, end_col_offset; + Memo *memo; +} Token; + +typedef struct { + char *str; + int type; +} KeywordToken; + + +typedef struct { + struct { + int lineno; + char *comment; // The " " in "# type: ignore " + } *items; + size_t size; + size_t num_items; +} growable_comment_array; + +typedef struct { + struct tok_state *tok; + Token **tokens; + int mark; + int fill, size; + PyArena *arena; + KeywordToken **keywords; + int n_keyword_lists; + int start_rule; + int *errcode; + int parsing_started; + PyObject* normalize; + int starting_lineno; + int starting_col_offset; + int error_indicator; + int flags; + int feature_version; + growable_comment_array type_ignore_comments; + Token *known_err_token; + int level; +} Parser; + +typedef struct { + cmpop_ty cmpop; + expr_ty expr; +} CmpopExprPair; + +typedef struct { + expr_ty key; + expr_ty value; +} KeyValuePair; + +typedef struct { + arg_ty arg; + expr_ty value; +} NameDefaultPair; + +typedef struct { + asdl_seq *plain_names; + asdl_seq *names_with_defaults; // asdl_seq* of NameDefaultsPair's +} SlashWithDefault; + +typedef struct { + arg_ty vararg; + asdl_seq *kwonlyargs; // asdl_seq* of NameDefaultsPair's + arg_ty kwarg; +} StarEtc; + +typedef struct { + operator_ty kind; +} AugOperator; + +typedef struct { + void *element; + int is_keyword; +} KeywordOrStarred; + +void _PyPegen_clear_memo_statistics(void); +PyObject *_PyPegen_get_memo_statistics(void); + +int _PyPegen_insert_memo(Parser *p, int mark, int type, void *node); +int _PyPegen_update_memo(Parser *p, int mark, int type, void *node); +int _PyPegen_is_memoized(Parser *p, int type, void *pres); + +int _PyPegen_lookahead_with_name(int, expr_ty (func)(Parser *), Parser *); +int _PyPegen_lookahead_with_string(int , expr_ty (func)(Parser *, const char*), Parser *, const char*); +int _PyPegen_lookahead_with_int(int, Token *(func)(Parser *, int), Parser *, int); +int _PyPegen_lookahead(int, void *(func)(Parser *), Parser *); + +Token *_PyPegen_expect_token(Parser *p, int type); +expr_ty _PyPegen_expect_soft_keyword(Parser *p, const char *keyword); +Token *_PyPegen_get_last_nonnwhitespace_token(Parser *); +int _PyPegen_fill_token(Parser *p); +expr_ty _PyPegen_name_token(Parser *p); +expr_ty _PyPegen_number_token(Parser *p); +void *_PyPegen_string_token(Parser *p); +const char *_PyPegen_get_expr_name(expr_ty); +void *_PyPegen_raise_error(Parser *p, PyObject *errtype, const char *errmsg, ...); +void *_PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, + Py_ssize_t lineno, Py_ssize_t col_offset, + const char *errmsg, va_list va); +void *_PyPegen_dummy_name(Parser *p, ...); + +Py_LOCAL_INLINE(void *) +RAISE_ERROR_KNOWN_LOCATION(Parser *p, PyObject *errtype, int lineno, + int col_offset, const char *errmsg, ...) +{ + va_list va; + va_start(va, errmsg); + _PyPegen_raise_error_known_location(p, errtype, lineno, col_offset + 1, + errmsg, va); + va_end(va); + return NULL; +} + + +#define UNUSED(expr) do { (void)(expr); } while (0) +#define EXTRA_EXPR(head, tail) head->lineno, head->col_offset, tail->end_lineno, tail->end_col_offset, p->arena +#define EXTRA _start_lineno, _start_col_offset, _end_lineno, _end_col_offset, p->arena +#define RAISE_SYNTAX_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_SyntaxError, msg, ##__VA_ARGS__) +#define RAISE_INDENTATION_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_IndentationError, msg, ##__VA_ARGS__) +#define RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, msg, ...) \ + RAISE_ERROR_KNOWN_LOCATION(p, PyExc_SyntaxError, (a)->lineno, (a)->col_offset, msg, ##__VA_ARGS__) + +Py_LOCAL_INLINE(void *) +CHECK_CALL(Parser *p, void *result) +{ + if (result == NULL) { + assert(PyErr_Occurred()); + p->error_indicator = 1; + } + return result; +} + +/* This is needed for helper functions that are allowed to + return NULL without an error. Example: _PyPegen_seq_extract_starred_exprs */ +Py_LOCAL_INLINE(void *) +CHECK_CALL_NULL_ALLOWED(Parser *p, void *result) +{ + if (result == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + } + return result; +} + +#define CHECK(result) CHECK_CALL(p, result) +#define CHECK_NULL_ALLOWED(result) CHECK_CALL_NULL_ALLOWED(p, result) + +PyObject *_PyPegen_new_type_comment(Parser *, char *); + +Py_LOCAL_INLINE(PyObject *) +NEW_TYPE_COMMENT(Parser *p, Token *tc) +{ + if (tc == NULL) { + return NULL; + } + char *bytes = PyBytes_AsString(tc->bytes); + if (bytes == NULL) { + goto error; + } + PyObject *tco = _PyPegen_new_type_comment(p, bytes); + if (tco == NULL) { + goto error; + } + return tco; + error: + p->error_indicator = 1; // Inline CHECK_CALL + return NULL; +} + +Py_LOCAL_INLINE(void *) +INVALID_VERSION_CHECK(Parser *p, int version, char *msg, void *node) +{ + if (node == NULL) { + p->error_indicator = 1; // Inline CHECK_CALL + return NULL; + } + if (p->feature_version < version) { + p->error_indicator = 1; + return RAISE_SYNTAX_ERROR("%s only supported in Python 3.%i and greater", + msg, version); + } + return node; +} + +#define CHECK_VERSION(version, msg, node) INVALID_VERSION_CHECK(p, version, msg, node) + +arg_ty _PyPegen_add_type_comment_to_arg(Parser *, arg_ty, Token *); +PyObject *_PyPegen_new_identifier(Parser *, char *); +Parser *_PyPegen_Parser_New(struct tok_state *, int, int, int, int *, PyArena *); +void _PyPegen_Parser_Free(Parser *); +mod_ty _PyPegen_run_parser_from_file_pointer(FILE *, int, PyObject *, const char *, + const char *, const char *, PyCompilerFlags *, int *, PyArena *); +void *_PyPegen_run_parser(Parser *); +mod_ty _PyPegen_run_parser_from_file(const char *, int, PyObject *, PyCompilerFlags *, PyArena *); +mod_ty _PyPegen_run_parser_from_string(const char *, int, PyObject *, PyCompilerFlags *, PyArena *); +void *_PyPegen_interactive_exit(Parser *); +asdl_seq *_PyPegen_singleton_seq(Parser *, void *); +asdl_seq *_PyPegen_seq_insert_in_front(Parser *, void *, asdl_seq *); +asdl_seq *_PyPegen_seq_append_to_end(Parser *, asdl_seq *, void *); +asdl_seq *_PyPegen_seq_flatten(Parser *, asdl_seq *); +expr_ty _PyPegen_join_names_with_dot(Parser *, expr_ty, expr_ty); +int _PyPegen_seq_count_dots(asdl_seq *); +alias_ty _PyPegen_alias_for_star(Parser *); +asdl_seq *_PyPegen_map_names_to_ids(Parser *, asdl_seq *); +CmpopExprPair *_PyPegen_cmpop_expr_pair(Parser *, cmpop_ty, expr_ty); +asdl_int_seq *_PyPegen_get_cmpops(Parser *p, asdl_seq *); +asdl_seq *_PyPegen_get_exprs(Parser *, asdl_seq *); +expr_ty _PyPegen_set_expr_context(Parser *, expr_ty, expr_context_ty); +KeyValuePair *_PyPegen_key_value_pair(Parser *, expr_ty, expr_ty); +asdl_seq *_PyPegen_get_keys(Parser *, asdl_seq *); +asdl_seq *_PyPegen_get_values(Parser *, asdl_seq *); +NameDefaultPair *_PyPegen_name_default_pair(Parser *, arg_ty, expr_ty, Token *); +SlashWithDefault *_PyPegen_slash_with_default(Parser *, asdl_seq *, asdl_seq *); +StarEtc *_PyPegen_star_etc(Parser *, arg_ty, asdl_seq *, arg_ty); +arguments_ty _PyPegen_make_arguments(Parser *, asdl_seq *, SlashWithDefault *, + asdl_seq *, asdl_seq *, StarEtc *); +arguments_ty _PyPegen_empty_arguments(Parser *); +AugOperator *_PyPegen_augoperator(Parser*, operator_ty type); +stmt_ty _PyPegen_function_def_decorators(Parser *, asdl_seq *, stmt_ty); +stmt_ty _PyPegen_class_def_decorators(Parser *, asdl_seq *, stmt_ty); +KeywordOrStarred *_PyPegen_keyword_or_starred(Parser *, void *, int); +asdl_seq *_PyPegen_seq_extract_starred_exprs(Parser *, asdl_seq *); +asdl_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *); +expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_seq *, asdl_seq *, + int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); +expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_seq *); +asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *); +int _PyPegen_check_barry_as_flufl(Parser *); +mod_ty _PyPegen_make_module(Parser *, asdl_seq *); + +// Error reporting helpers +typedef enum { + STAR_TARGETS, + DEL_TARGETS, + FOR_TARGETS +} TARGETS_TYPE; +expr_ty _PyPegen_get_invalid_target(expr_ty e, TARGETS_TYPE targets_type); +#define RAISE_SYNTAX_ERROR_INVALID_TARGET(type, e) _RAISE_SYNTAX_ERROR_INVALID_TARGET(p, type, e) + +Py_LOCAL_INLINE(void *) +_RAISE_SYNTAX_ERROR_INVALID_TARGET(Parser *p, TARGETS_TYPE type, void *e) +{ + expr_ty invalid_target = CHECK_NULL_ALLOWED(_PyPegen_get_invalid_target(e, type)); + if (invalid_target != NULL) { + const char *msg; + if (type == STAR_TARGETS || type == FOR_TARGETS) { + msg = "cannot assign to %s"; + } + else { + msg = "cannot delete %s"; + } + return RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + invalid_target, + msg, + _PyPegen_get_expr_name(invalid_target) + ); + } + return RAISE_SYNTAX_ERROR("invalid syntax"); +} + +void *_PyPegen_arguments_parsing_error(Parser *, expr_ty); +void *_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args); + + +// Generated function in parse.c - function definition in python.gram +void *_PyPegen_parse(Parser *); + +#endif diff --git a/Parser/pgen/__main__.py b/Parser/pgen/__main__.py index eea52618..d3780a7b 100644 --- a/Parser/pgen/__main__.py +++ b/Parser/pgen/__main__.py @@ -8,24 +8,32 @@ def main(): parser.add_argument( "grammar", type=str, help="The file with the grammar definition in EBNF format" ) - parser.add_argument( - "tokens", type=str, help="The file with the token definitions" - ) + parser.add_argument("tokens", type=str, help="The file with the token definitions") parser.add_argument( "graminit_h", - type=argparse.FileType('w'), + type=argparse.FileType("w"), help="The path to write the grammar's non-terminals as #defines", ) parser.add_argument( "graminit_c", - type=argparse.FileType('w'), + type=argparse.FileType("w"), help="The path to write the grammar as initialized data", ) parser.add_argument("--verbose", "-v", action="count") + parser.add_argument( + "--graph", + type=argparse.FileType("w"), + action="store", + metavar="GRAPH_OUTPUT_FILE", + help="Dumps a DOT representation of the generated automata in a file", + ) + args = parser.parse_args() - p = ParserGenerator(args.grammar, args.tokens, verbose=args.verbose) + p = ParserGenerator( + args.grammar, args.tokens, verbose=args.verbose, graph_file=args.graph + ) grammar = p.make_grammar() grammar.produce_graminit_h(args.graminit_h.write) grammar.produce_graminit_c(args.graminit_c.write) diff --git a/Parser/pgen/automata.py b/Parser/pgen/automata.py new file mode 100644 index 00000000..f2ed221e --- /dev/null +++ b/Parser/pgen/automata.py @@ -0,0 +1,400 @@ +"""Classes representing state-machine concepts""" + +class NFA: + """A non deterministic finite automata + + A non deterministic automata is a form of a finite state + machine. An NFA's rules are less restrictive than a DFA. + The NFA rules are: + + * A transition can be non-deterministic and can result in + nothing, one, or two or more states. + + * An epsilon transition consuming empty input is valid. + Transitions consuming labeled symbols are also permitted. + + This class assumes that there is only one starting state and one + accepting (ending) state. + + Attributes: + name (str): The name of the rule the NFA is representing. + start (NFAState): The starting state. + end (NFAState): The ending state + """ + + def __init__(self, start, end): + self.name = start.rule_name + self.start = start + self.end = end + + def __repr__(self): + return "NFA(start={}, end={})".format(self.start, self.end) + + def dump(self, writer=print): + """Dump a graphical representation of the NFA""" + todo = [self.start] + for i, state in enumerate(todo): + writer(" State", i, state is self.end and "(final)" or "") + for arc in state.arcs: + label = arc.label + next = arc.target + if next in todo: + j = todo.index(next) + else: + j = len(todo) + todo.append(next) + if label is None: + writer(" -> %d" % j) + else: + writer(" %s -> %d" % (label, j)) + + def dump_graph(self, writer): + """Dump a DOT representation of the NFA""" + writer('digraph %s_nfa {\n' % self.name) + todo = [self.start] + for i, state in enumerate(todo): + writer(' %d [label="State %d %s"];\n' % (i, i, state is self.end and "(final)" or "")) + for arc in state.arcs: + label = arc.label + next = arc.target + if next in todo: + j = todo.index(next) + else: + j = len(todo) + todo.append(next) + if label is None: + writer(" %d -> %d [style=dotted label=ε];\n" % (i, j)) + else: + writer(" %d -> %d [label=%s];\n" % (i, j, label.replace("'", '"'))) + writer('}\n') + + +class NFAArc: + """An arc representing a transition between two NFA states. + + NFA states can be connected via two ways: + + * A label transition: An input equal to the label must + be consumed to perform the transition. + * An epsilon transition: The transition can be taken without + consuming any input symbol. + + Attributes: + target (NFAState): The ending state of the transition arc. + label (Optional[str]): The label that must be consumed to make + the transition. An epsilon transition is represented + using `None`. + """ + + def __init__(self, target, label): + self.target = target + self.label = label + + def __repr__(self): + return "<%s: %s>" % (self.__class__.__name__, self.label) + + +class NFAState: + """A state of a NFA, non deterministic finite automata. + + Attributes: + target (rule_name): The name of the rule used to represent the NFA's + ending state after a transition. + arcs (Dict[Optional[str], NFAState]): A mapping representing transitions + between the current NFA state and another NFA state via following + a label. + """ + + def __init__(self, rule_name): + self.rule_name = rule_name + self.arcs = [] + + def add_arc(self, target, label=None): + """Add a new arc to connect the state to a target state within the NFA + + The method adds a new arc to the list of arcs available as transitions + from the present state. An optional label indicates a named transition + that consumes an input while the absence of a label represents an epsilon + transition. + + Attributes: + target (NFAState): The end of the transition that the arc represents. + label (Optional[str]): The label that must be consumed for making + the transition. If the label is not provided the transition is assumed + to be an epsilon-transition. + """ + assert label is None or isinstance(label, str) + assert isinstance(target, NFAState) + self.arcs.append(NFAArc(target, label)) + + def __repr__(self): + return "<%s: from %s>" % (self.__class__.__name__, self.rule_name) + + +class DFA: + """A deterministic finite automata + + A deterministic finite automata is a form of a finite state machine + that obeys the following rules: + + * Each of the transitions is uniquely determined by + the source state and input symbol + * Reading an input symbol is required for each state + transition (no epsilon transitions). + + The finite-state machine will accept or reject a string of symbols + and only produces a unique computation of the automaton for each input + string. The DFA must have a unique starting state (represented as the first + element in the list of states) but can have multiple final states. + + Attributes: + name (str): The name of the rule the DFA is representing. + states (List[DFAState]): A collection of DFA states. + """ + + def __init__(self, name, states): + self.name = name + self.states = states + + @classmethod + def from_nfa(cls, nfa): + """Constructs a DFA from a NFA using the Rabin–Scott construction algorithm. + + To simulate the operation of a DFA on a given input string, it's + necessary to keep track of a single state at any time, or more precisely, + the state that the automaton will reach after seeing a prefix of the + input. In contrast, to simulate an NFA, it's necessary to keep track of + a set of states: all of the states that the automaton could reach after + seeing the same prefix of the input, according to the nondeterministic + choices made by the automaton. There are two possible sources of + non-determinism: + + 1) Multiple (one or more) transitions with the same label + + 'A' +-------+ + +----------->+ State +----------->+ + | | 2 | + +-------+ +-------+ + | State | + | 1 | +-------+ + +-------+ | State | + +----------->+ 3 +----------->+ + 'A' +-------+ + + 2) Epsilon transitions (transitions that can be taken without consuming any input) + + +-------+ +-------+ + | State | ε | State | + | 1 +----------->+ 2 +----------->+ + +-------+ +-------+ + + Looking at the first case above, we can't determine which transition should be + followed when given an input A. We could choose whether or not to follow the + transition while in the second case the problem is that we can choose both to + follow the transition or not doing it. To solve this problem we can imagine that + we follow all possibilities at the same time and we construct new states from the + set of all possible reachable states. For every case in the previous example: + + + 1) For multiple transitions with the same label we colapse all of the + final states under the same one + + +-------+ +-------+ + | State | 'A' | State | + | 1 +----------->+ 2-3 +----------->+ + +-------+ +-------+ + + 2) For epsilon transitions we collapse all epsilon-reachable states + into the same one + + +-------+ + | State | + | 1-2 +-----------> + +-------+ + + Because the DFA states consist of sets of NFA states, an n-state NFA + may be converted to a DFA with at most 2**n states. Notice that the + constructed DFA is not minimal and can be simplified or reduced + afterwards. + + Parameters: + name (NFA): The NFA to transform to DFA. + """ + assert isinstance(nfa, NFA) + + def add_closure(nfa_state, base_nfa_set): + """Calculate the epsilon-closure of a given state + + Add to the *base_nfa_set* all the states that are + reachable from *nfa_state* via epsilon-transitions. + """ + assert isinstance(nfa_state, NFAState) + if nfa_state in base_nfa_set: + return + base_nfa_set.add(nfa_state) + for nfa_arc in nfa_state.arcs: + if nfa_arc.label is None: + add_closure(nfa_arc.target, base_nfa_set) + + # Calculate the epsilon-closure of the starting state + base_nfa_set = set() + add_closure(nfa.start, base_nfa_set) + + # Start by visiting the NFA starting state (there is only one). + states = [DFAState(nfa.name, base_nfa_set, nfa.end)] + + for state in states: # NB states grow while we're iterating + + # Find transitions from the current state to other reachable states + # and store them in mapping that correlates the label to all the + # possible reachable states that can be obtained by consuming a + # token equal to the label. Each set of all the states that can + # be reached after following a label will be the a DFA state. + arcs = {} + for nfa_state in state.nfa_set: + for nfa_arc in nfa_state.arcs: + if nfa_arc.label is not None: + nfa_set = arcs.setdefault(nfa_arc.label, set()) + # All states that can be reached by epsilon-transitions + # are also included in the set of reachable states. + add_closure(nfa_arc.target, nfa_set) + + # Now create new DFAs by visiting all posible transitions between + # the current DFA state and the new power-set states (each nfa_set) + # via the different labels. As the nodes are appended to *states* this + # is performing a breadth-first search traversal over the power-set of + # the states of the original NFA. + for label, nfa_set in sorted(arcs.items()): + for exisisting_state in states: + if exisisting_state.nfa_set == nfa_set: + # The DFA state already exists for this rule. + next_state = exisisting_state + break + else: + next_state = DFAState(nfa.name, nfa_set, nfa.end) + states.append(next_state) + + # Add a transition between the current DFA state and the new + # DFA state (the power-set state) via the current label. + state.add_arc(next_state, label) + + return cls(nfa.name, states) + + def __iter__(self): + return iter(self.states) + + def simplify(self): + """Attempt to reduce the number of states of the DFA + + Transform the DFA into an equivalent DFA that has fewer states. Two + classes of states can be removed or merged from the original DFA without + affecting the language it accepts to minimize it: + + * Unreachable states can not be reached from the initial + state of the DFA, for any input string. + * Nondistinguishable states are those that cannot be distinguished + from one another for any input string. + + This algorithm does not achieve the optimal fully-reduced solution, but it + works well enough for the particularities of the Python grammar. The + algorithm repeatedly looks for two states that have the same set of + arcs (same labels pointing to the same nodes) and unifies them, until + things stop changing. + """ + changes = True + while changes: + changes = False + for i, state_i in enumerate(self.states): + for j in range(i + 1, len(self.states)): + state_j = self.states[j] + if state_i == state_j: + del self.states[j] + for state in self.states: + state.unifystate(state_j, state_i) + changes = True + break + + def dump(self, writer=print): + """Dump a graphical representation of the DFA""" + for i, state in enumerate(self.states): + writer(" State", i, state.is_final and "(final)" or "") + for label, next in sorted(state.arcs.items()): + writer(" %s -> %d" % (label, self.states.index(next))) + + def dump_graph(self, writer): + """Dump a DOT representation of the DFA""" + writer('digraph %s_dfa {\n' % self.name) + for i, state in enumerate(self.states): + writer(' %d [label="State %d %s"];\n' % (i, i, state.is_final and "(final)" or "")) + for label, next in sorted(state.arcs.items()): + writer(" %d -> %d [label=%s];\n" % (i, self.states.index(next), label.replace("'", '"'))) + writer('}\n') + + +class DFAState(object): + """A state of a DFA + + Attributes: + rule_name (rule_name): The name of the DFA rule containing the represented state. + nfa_set (Set[NFAState]): The set of NFA states used to create this state. + final (bool): True if the state represents an accepting state of the DFA + containing this state. + arcs (Dict[label, DFAState]): A mapping representing transitions between + the current DFA state and another DFA state via following a label. + """ + + def __init__(self, rule_name, nfa_set, final): + assert isinstance(nfa_set, set) + assert isinstance(next(iter(nfa_set)), NFAState) + assert isinstance(final, NFAState) + self.rule_name = rule_name + self.nfa_set = nfa_set + self.arcs = {} # map from terminals/nonterminals to DFAState + self.is_final = final in nfa_set + + def add_arc(self, target, label): + """Add a new arc to the current state. + + Parameters: + target (DFAState): The DFA state at the end of the arc. + label (str): The label respresenting the token that must be consumed + to perform this transition. + """ + assert isinstance(label, str) + assert label not in self.arcs + assert isinstance(target, DFAState) + self.arcs[label] = target + + def unifystate(self, old, new): + """Replace all arcs from the current node to *old* with *new*. + + Parameters: + old (DFAState): The DFA state to remove from all existing arcs. + new (DFAState): The DFA state to replace in all existing arcs. + """ + for label, next_ in self.arcs.items(): + if next_ is old: + self.arcs[label] = new + + def __eq__(self, other): + # The nfa_set does not matter for equality + assert isinstance(other, DFAState) + if self.is_final != other.is_final: + return False + # We cannot just return self.arcs == other.arcs because that + # would invoke this method recursively if there are any cycles. + if len(self.arcs) != len(other.arcs): + return False + for label, next_ in self.arcs.items(): + if next_ is not other.arcs.get(label): + return False + return True + + __hash__ = None # For Py3 compatibility. + + def __repr__(self): + return "<%s: %s is_final=%s>" % ( + self.__class__.__name__, + self.rule_name, + self.is_final, + ) diff --git a/Parser/pgen/grammar.py b/Parser/pgen/grammar.py index 5cd65242..ce40e160 100644 --- a/Parser/pgen/grammar.py +++ b/Parser/pgen/grammar.py @@ -61,13 +61,14 @@ class Grammar: def produce_graminit_c(self, writer): writer("/* Generated by Parser/pgen */\n\n") + writer('#include "exports.h"\n') writer('#include "grammar.h"\n') - writer("grammar _PyParser_Grammar;\n") + writer("Py_EXPORTED_SYMBOL grammar _PyParser_Grammar;\n") self.print_dfas(writer) self.print_labels(writer) - writer("grammar _PyParser_Grammar = {\n") + writer("Py_EXPORTED_SYMBOL grammar _PyParser_Grammar = {\n") writer(" {n_dfas},\n".format(n_dfas=len(self.dfas))) writer(" dfas,\n") writer(" {{{n_labels}, labels}},\n".format(n_labels=len(self.labels))) @@ -76,12 +77,14 @@ class Grammar: def print_labels(self, writer): writer( - "static const label labels[{n_labels}] = {{\n".format(n_labels=len(self.labels)) + "static const label labels[{n_labels}] = {{\n".format( + n_labels=len(self.labels) + ) ) for label, name in self.labels: label_name = '"{}"'.format(name) if name is not None else 0 writer( - ' {{{label}, {label_name}}},\n'.format( + " {{{label}, {label_name}}},\n".format( label=label, label_name=label_name ) ) diff --git a/Parser/pgen/keywordgen.py b/Parser/pgen/keywordgen.py index eeb3ef73..f0234a81 100644 --- a/Parser/pgen/keywordgen.py +++ b/Parser/pgen/keywordgen.py @@ -32,17 +32,16 @@ EXTRA_KEYWORDS = ["async", "await"] def main(): - parser = argparse.ArgumentParser(description="Generate the Lib/keywords.py " - "file from the grammar.") - parser.add_argument( - "grammar", type=str, help="The file with the grammar definition in EBNF format" + parser = argparse.ArgumentParser( + description="Generate the Lib/keywords.py " "file from the grammar." ) parser.add_argument( - "tokens", type=str, help="The file with the token definitions" + "grammar", type=str, help="The file with the grammar definition in EBNF format" ) + parser.add_argument("tokens", type=str, help="The file with the token definitions") parser.add_argument( "keyword_file", - type=argparse.FileType('w'), + type=argparse.FileType("w"), help="The path to write the keyword definitions", ) args = parser.parse_args() diff --git a/Parser/pgen/metaparser.py b/Parser/pgen/metaparser.py new file mode 100644 index 00000000..074a083f --- /dev/null +++ b/Parser/pgen/metaparser.py @@ -0,0 +1,152 @@ +"""Parser for the Python metagrammar""" + +import io +import tokenize # from stdlib + +from .automata import NFA, NFAState + + +class GrammarParser: + """Parser for Python grammar files.""" + + _translation_table = { + tokenize.NAME: "NAME", + tokenize.STRING: "STRING", + tokenize.NEWLINE: "NEWLINE", + tokenize.NL: "NL", + tokenize.OP: "OP", + tokenize.ENDMARKER: "ENDMARKER", + tokenize.COMMENT: "COMMENT", + } + + def __init__(self, grammar): + self.grammar = grammar + grammar_adaptor = io.StringIO(grammar) + self.generator = tokenize.generate_tokens(grammar_adaptor.readline) + self._gettoken() # Initialize lookahead + self._current_rule_name = None + + def parse(self): + """Turn the grammar into a collection of NFAs""" + # grammar: (NEWLINE | rule)* ENDMARKER + while self.type != tokenize.ENDMARKER: + while self.type == tokenize.NEWLINE: + self._gettoken() + # rule: NAME ':' rhs NEWLINE + self._current_rule_name = self._expect(tokenize.NAME) + self._expect(tokenize.OP, ":") + a, z = self._parse_rhs() + self._expect(tokenize.NEWLINE) + + yield NFA(a, z) + + def _parse_rhs(self): + # rhs: items ('|' items)* + a, z = self._parse_items() + if self.value != "|": + return a, z + else: + aa = NFAState(self._current_rule_name) + zz = NFAState(self._current_rule_name) + while True: + # Allow to transit directly to the previous state and connect the end of the + # previous state to the end of the current one, effectively allowing to skip + # the current state. + aa.add_arc(a) + z.add_arc(zz) + if self.value != "|": + break + + self._gettoken() + a, z = self._parse_items() + return aa, zz + + def _parse_items(self): + # items: item+ + a, b = self._parse_item() + while self.type in (tokenize.NAME, tokenize.STRING) or self.value in ("(", "["): + c, d = self._parse_item() + # Allow a transition between the end of the previous state + # and the beginning of the new one, connecting all the items + # together. In this way we can only reach the end if we visit + # all the items. + b.add_arc(c) + b = d + return a, b + + def _parse_item(self): + # item: '[' rhs ']' | atom ['+' | '*'] + if self.value == "[": + self._gettoken() + a, z = self._parse_rhs() + self._expect(tokenize.OP, "]") + # Make a transition from the beginning to the end so it is possible to + # advance for free to the next state of this item # without consuming + # anything from the rhs. + a.add_arc(z) + return a, z + else: + a, z = self._parse_atom() + value = self.value + if value not in ("+", "*"): + return a, z + self._gettoken() + z.add_arc(a) + if value == "+": + # Create a cycle to the beginning so we go back to the old state in this + # item and repeat. + return a, z + else: + # The end state is the same as the beginning, so we can cycle arbitrarily + # and end in the beginning if necessary. + return a, a + + def _parse_atom(self): + # atom: '(' rhs ')' | NAME | STRING + if self.value == "(": + self._gettoken() + a, z = self._parse_rhs() + self._expect(tokenize.OP, ")") + return a, z + elif self.type in (tokenize.NAME, tokenize.STRING): + a = NFAState(self._current_rule_name) + z = NFAState(self._current_rule_name) + # We can transit to the next state only if we consume the value. + a.add_arc(z, self.value) + self._gettoken() + return a, z + else: + self._raise_error( + "expected (...) or NAME or STRING, got {} ({})", + self._translation_table.get(self.type, self.type), + self.value, + ) + + def _expect(self, type_, value=None): + if self.type != type_: + self._raise_error( + "expected {}, got {} ({})", + self._translation_table.get(type_, type_), + self._translation_table.get(self.type, self.type), + self.value, + ) + if value is not None and self.value != value: + self._raise_error("expected {}, got {}", value, self.value) + value = self.value + self._gettoken() + return value + + def _gettoken(self): + tup = next(self.generator) + while tup[0] in (tokenize.COMMENT, tokenize.NL): + tup = next(self.generator) + self.type, self.value, self.begin, self.end, self.line = tup + + def _raise_error(self, msg, *args): + if args: + try: + msg = msg.format(*args) + except Exception: + msg = " ".join([msg] + list(map(str, args))) + line = self.grammar.splitlines()[self.begin[0] - 1] + raise SyntaxError(msg, ("", self.begin[0], self.begin[1], line)) diff --git a/Parser/pgen/pgen.py b/Parser/pgen/pgen.py index d52d58f6..03032d4e 100644 --- a/Parser/pgen/pgen.py +++ b/Parser/pgen/pgen.py @@ -1,42 +1,185 @@ +"""Python parser generator + + +This parser generator transforms a Python grammar file into parsing tables +that can be consumed by Python's LL(1) parser written in C. + +Concepts +-------- + +* An LL(1) parser (Left-to-right, Leftmost derivation, 1 token-lookahead) is a + top-down parser for a subset of context-free languages. It parses the input + from Left to right, performing Leftmost derivation of the sentence, and can + only use 1 token of lookahead when parsing a sentence. + +* A parsing table is a collection of data that a generic implementation of the + LL(1) parser consumes to know how to parse a given context-free grammar. In + this case the collection of data involves Deterministic Finite Automatons, + calculated first sets, keywords and transition labels. + +* A grammar is defined by production rules (or just 'productions') that specify + which symbols may replace which other symbols; these rules may be used to + generate strings, or to parse them. Each such rule has a head, or left-hand + side, which consists of the string that may be replaced, and a body, or + right-hand side, which consists of a string that may replace it. In the + Python grammar, rules are written in the form + + rule_name: rule_description; + + meaning the rule 'a: b' specifies that a can be replaced by b. A context-free + grammar is a grammar in which the left-hand side of each production rule + consists of only a single nonterminal symbol. Context-free grammars can + always be recognized by a Non-Deterministic Automatons. + +* Terminal symbols are literal symbols which may appear in the outputs of the + production rules of the grammar and which cannot be changed using the rules + of the grammar. Applying the rules recursively to a source string of symbols + will usually terminate in a final output string consisting only of terminal + symbols. + +* Nonterminal symbols are those symbols which can be replaced. The grammar + includes a start symbol a designated member of the set of nonterminals from + which all the strings in the language may be derived by successive + applications of the production rules. + +* The language defined by the grammar is defined as the set of terminal strings + that can be derived using the production rules. + +* The first sets of a rule (FIRST(rule)) are defined to be the set of terminals + that can appear in the first position of any string derived from the rule. + This is useful for LL(1) parsers as the parser is only allowed to look at the + next token in the input to know which rule needs to parse. For example, given + this grammar: + + start: '(' A | B ')' + A: 'a' '<' + B: 'b' '<' + + and the input '(b<)' the parser can only look at 'b' to know if it needs + to parse A o B. Because FIRST(A) = {'a'} and FIRST(B) = {'b'} it knows + that needs to continue parsing rule B because only that rule can start + with 'b'. + +Description +----------- + +The input for the parser generator is a grammar in extended BNF form (using * +for repetition, + for at-least-once repetition, [] for optional parts, | for +alternatives and () for grouping). + +Each rule in the grammar file is considered as a regular expression in its +own right. It is turned into a Non-deterministic Finite Automaton (NFA), +which is then turned into a Deterministic Finite Automaton (DFA), which is +then optimized to reduce the number of states. See [Aho&Ullman 77] chapter 3, +or similar compiler books (this technique is more often used for lexical +analyzers). + +The DFA's are used by the parser as parsing tables in a special way that's +probably unique. Before they are usable, the FIRST sets of all non-terminals +are computed so the LL(1) parser consuming the parsing tables can distinguish +between different transitions. +Reference +--------- + +[Aho&Ullman 77] + Aho&Ullman, Principles of Compiler Design, Addison-Wesley 1977 + (first edition) +""" + +from ast import literal_eval import collections -import tokenize # from stdlib from . import grammar, token +from .automata import DFA +from .metaparser import GrammarParser +import enum -class ParserGenerator(object): - def __init__(self, grammar_file, token_file, stream=None, verbose=False): - close_stream = None - if stream is None: - stream = open(grammar_file) - close_stream = stream.close +class LabelType(enum.Enum): + NONTERMINAL = 0 + NAMED_TOKEN = 1 + KEYWORD = 2 + OPERATOR = 3 + NONE = 4 + + +class Label(str): + def __init__(self, value): + self.type = self._get_type() + + def _get_type(self): + if self[0].isalpha(): + if self.upper() == self: + # NAMED tokens (ASYNC, NAME...) are all uppercase by convention + return LabelType.NAMED_TOKEN + else: + # If is not uppercase it must be a non terminal. + return LabelType.NONTERMINAL + else: + # Keywords and operators are wrapped in quotes + assert self[0] == self[-1] in ('"', "'"), self + value = literal_eval(self) + if value[0].isalpha(): + return LabelType.KEYWORD + else: + return LabelType.OPERATOR + + def __repr__(self): + return "{}({})".format(self.type, super().__repr__()) + + +class ParserGenerator(object): + def __init__(self, grammar_file, token_file, verbose=False, graph_file=None): + with open(grammar_file) as f: + self.grammar = f.read() with open(token_file) as tok_file: token_lines = tok_file.readlines() self.tokens = dict(token.generate_tokens(token_lines)) self.opmap = dict(token.generate_opmap(token_lines)) # Manually add <> so it does not collide with != - self.opmap['<>'] = "NOTEQUAL" + self.opmap["<>"] = "NOTEQUAL" self.verbose = verbose self.filename = grammar_file - self.stream = stream - self.generator = tokenize.generate_tokens(stream.readline) - self.gettoken() # Initialize lookahead - self.dfas, self.startsymbol = self.parse() - if close_stream is not None: - close_stream() - self.first = {} # map from symbol name to set of tokens - self.addfirstsets() + self.graph_file = graph_file + self.dfas, self.startsymbol = self.create_dfas() + self.first = {} # map from symbol name to set of tokens + self.calculate_first_sets() + + def create_dfas(self): + rule_to_dfas = collections.OrderedDict() + start_nonterminal = None + for nfa in GrammarParser(self.grammar).parse(): + if self.verbose: + print("Dump of NFA for", nfa.name) + nfa.dump() + if self.graph_file is not None: + nfa.dump_graph(self.graph_file.write) + dfa = DFA.from_nfa(nfa) + if self.verbose: + print("Dump of DFA for", dfa.name) + dfa.dump() + dfa.simplify() + if self.graph_file is not None: + dfa.dump_graph(self.graph_file.write) + rule_to_dfas[dfa.name] = dfa + + if start_nonterminal is None: + start_nonterminal = dfa.name + + return rule_to_dfas, start_nonterminal def make_grammar(self): c = grammar.Grammar() + c.all_labels = set() names = list(self.dfas.keys()) names.remove(self.startsymbol) names.insert(0, self.startsymbol) for name in names: i = 256 + len(c.symbol2number) - c.symbol2number[name] = i - c.number2symbol[i] = name + c.symbol2number[Label(name)] = i + c.number2symbol[i] = Label(name) + c.all_labels.add(name) for name in names: self.make_label(c, name) dfa = self.dfas[name] @@ -44,12 +187,13 @@ class ParserGenerator(object): for state in dfa: arcs = [] for label, next in sorted(state.arcs.items()): - arcs.append((self.make_label(c, label), dfa.index(next))) - if state.isfinal: - arcs.append((0, dfa.index(state))) + c.all_labels.add(label) + arcs.append((self.make_label(c, label), dfa.states.index(next))) + if state.is_final: + arcs.append((0, dfa.states.index(state))) states.append(arcs) c.states.append(states) - c.dfas[c.symbol2number[name]] = (states, self.make_first(c, name)) + c.dfas[c.symbol2number[name]] = (states, self.make_first_sets(c, name)) c.start = c.symbol2number[self.startsymbol] if self.verbose: @@ -68,7 +212,7 @@ class ParserGenerator(object): ) return c - def make_first(self, c, name): + def make_first_sets(self, c, name): rawfirst = self.first[name] first = set() for label in sorted(rawfirst): @@ -78,67 +222,65 @@ class ParserGenerator(object): return first def make_label(self, c, label): - # XXX Maybe this should be a method on a subclass of converter? + label = Label(label) ilabel = len(c.labels) - if label[0].isalpha(): - # Either a symbol name or a named token - if label in c.symbol2number: - # A symbol name (a non-terminal) - if label in c.symbol2label: - return c.symbol2label[label] - else: - c.labels.append((c.symbol2number[label], None)) - c.symbol2label[label] = ilabel - return ilabel + + if label.type == LabelType.NONTERMINAL: + if label in c.symbol2label: + return c.symbol2label[label] else: - # A named token (NAME, NUMBER, STRING) - itoken = self.tokens.get(label, None) - assert isinstance(itoken, int), label - assert itoken in self.tokens.values(), label - if itoken in c.tokens: - return c.tokens[itoken] - else: - c.labels.append((itoken, None)) - c.tokens[itoken] = ilabel - return ilabel - else: - # Either a keyword or an operator - assert label[0] in ('"', "'"), label - value = eval(label) - if value[0].isalpha(): - # A keyword - if value in c.keywords: - return c.keywords[value] - else: - c.labels.append((self.tokens["NAME"], value)) - c.keywords[value] = ilabel - return ilabel + c.labels.append((c.symbol2number[label], None)) + c.symbol2label[label] = ilabel + return ilabel + elif label.type == LabelType.NAMED_TOKEN: + # A named token (NAME, NUMBER, STRING) + itoken = self.tokens.get(label, None) + assert isinstance(itoken, int), label + assert itoken in self.tokens.values(), label + if itoken in c.tokens: + return c.tokens[itoken] else: - # An operator (any non-numeric token) - tok_name = self.opmap[value] # Fails if unknown token - itoken = self.tokens[tok_name] - if itoken in c.tokens: - return c.tokens[itoken] - else: - c.labels.append((itoken, None)) - c.tokens[itoken] = ilabel - return ilabel + c.labels.append((itoken, None)) + c.tokens[itoken] = ilabel + return ilabel + elif label.type == LabelType.KEYWORD: + # A keyword + value = literal_eval(label) + if value in c.keywords: + return c.keywords[value] + else: + c.labels.append((self.tokens["NAME"], value)) + c.keywords[value] = ilabel + return ilabel + elif label.type == LabelType.OPERATOR: + # An operator (any non-numeric token) + value = literal_eval(label) + tok_name = self.opmap[value] # Fails if unknown token + itoken = self.tokens[tok_name] + if itoken in c.tokens: + return c.tokens[itoken] + else: + c.labels.append((itoken, None)) + c.tokens[itoken] = ilabel + return ilabel + else: + raise ValueError("Cannot categorize label {}".format(label)) - def addfirstsets(self): + def calculate_first_sets(self): names = list(self.dfas.keys()) for name in names: if name not in self.first: - self.calcfirst(name) + self.calculate_first_sets_for_rule(name) if self.verbose: print("First set for {dfa_name}".format(dfa_name=name)) for item in self.first[name]: print(" - {terminal}".format(terminal=item)) - def calcfirst(self, name): + def calculate_first_sets_for_rule(self, name): dfa = self.dfas[name] - self.first[name] = None # dummy to detect left recursion - state = dfa[0] + self.first[name] = None # dummy to detect left recursion + state = dfa.states[0] totalset = set() overlapcheck = {} for label, next in state.arcs.items(): @@ -148,7 +290,7 @@ class ParserGenerator(object): if fset is None: raise ValueError("recursion for rule %r" % name) else: - self.calcfirst(label) + self.calculate_first_sets_for_rule(label) fset = self.first[label] totalset.update(fset) overlapcheck[label] = fset @@ -159,248 +301,10 @@ class ParserGenerator(object): for label, itsfirst in overlapcheck.items(): for symbol in itsfirst: if symbol in inverse: - raise ValueError("rule %s is ambiguous; %s is in the" - " first sets of %s as well as %s" % - (name, symbol, label, inverse[symbol])) + raise ValueError( + "rule %s is ambiguous; %s is in the" + " first sets of %s as well as %s" + % (name, symbol, label, inverse[symbol]) + ) inverse[symbol] = label self.first[name] = totalset - - def parse(self): - dfas = collections.OrderedDict() - startsymbol = None - # MSTART: (NEWLINE | RULE)* ENDMARKER - while self.type != tokenize.ENDMARKER: - while self.type == tokenize.NEWLINE: - self.gettoken() - # RULE: NAME ':' RHS NEWLINE - name = self.expect(tokenize.NAME) - if self.verbose: - print("Processing rule {dfa_name}".format(dfa_name=name)) - self.expect(tokenize.OP, ":") - a, z = self.parse_rhs() - self.expect(tokenize.NEWLINE) - if self.verbose: - self.dump_nfa(name, a, z) - dfa = self.make_dfa(a, z) - if self.verbose: - self.dump_dfa(name, dfa) - self.simplify_dfa(dfa) - dfas[name] = dfa - if startsymbol is None: - startsymbol = name - return dfas, startsymbol - - def make_dfa(self, start, finish): - # To turn an NFA into a DFA, we define the states of the DFA - # to correspond to *sets* of states of the NFA. Then do some - # state reduction. Let's represent sets as dicts with 1 for - # values. - assert isinstance(start, NFAState) - assert isinstance(finish, NFAState) - def closure(state): - base = set() - addclosure(state, base) - return base - def addclosure(state, base): - assert isinstance(state, NFAState) - if state in base: - return - base.add(state) - for label, next in state.arcs: - if label is None: - addclosure(next, base) - states = [DFAState(closure(start), finish)] - for state in states: # NB states grows while we're iterating - arcs = {} - for nfastate in state.nfaset: - for label, next in nfastate.arcs: - if label is not None: - addclosure(next, arcs.setdefault(label, set())) - for label, nfaset in sorted(arcs.items()): - for st in states: - if st.nfaset == nfaset: - break - else: - st = DFAState(nfaset, finish) - states.append(st) - state.addarc(st, label) - return states # List of DFAState instances; first one is start - - def dump_nfa(self, name, start, finish): - print("Dump of NFA for", name) - todo = [start] - for i, state in enumerate(todo): - print(" State", i, state is finish and "(final)" or "") - for label, next in state.arcs: - if next in todo: - j = todo.index(next) - else: - j = len(todo) - todo.append(next) - if label is None: - print(" -> %d" % j) - else: - print(" %s -> %d" % (label, j)) - - def dump_dfa(self, name, dfa): - print("Dump of DFA for", name) - for i, state in enumerate(dfa): - print(" State", i, state.isfinal and "(final)" or "") - for label, next in sorted(state.arcs.items()): - print(" %s -> %d" % (label, dfa.index(next))) - - def simplify_dfa(self, dfa): - # This is not theoretically optimal, but works well enough. - # Algorithm: repeatedly look for two states that have the same - # set of arcs (same labels pointing to the same nodes) and - # unify them, until things stop changing. - - # dfa is a list of DFAState instances - changes = True - while changes: - changes = False - for i, state_i in enumerate(dfa): - for j in range(i+1, len(dfa)): - state_j = dfa[j] - if state_i == state_j: - #print " unify", i, j - del dfa[j] - for state in dfa: - state.unifystate(state_j, state_i) - changes = True - break - - def parse_rhs(self): - # RHS: ALT ('|' ALT)* - a, z = self.parse_alt() - if self.value != "|": - return a, z - else: - aa = NFAState() - zz = NFAState() - aa.addarc(a) - z.addarc(zz) - while self.value == "|": - self.gettoken() - a, z = self.parse_alt() - aa.addarc(a) - z.addarc(zz) - return aa, zz - - def parse_alt(self): - # ALT: ITEM+ - a, b = self.parse_item() - while (self.value in ("(", "[") or - self.type in (tokenize.NAME, tokenize.STRING)): - c, d = self.parse_item() - b.addarc(c) - b = d - return a, b - - def parse_item(self): - # ITEM: '[' RHS ']' | ATOM ['+' | '*'] - if self.value == "[": - self.gettoken() - a, z = self.parse_rhs() - self.expect(tokenize.OP, "]") - a.addarc(z) - return a, z - else: - a, z = self.parse_atom() - value = self.value - if value not in ("+", "*"): - return a, z - self.gettoken() - z.addarc(a) - if value == "+": - return a, z - else: - return a, a - - def parse_atom(self): - # ATOM: '(' RHS ')' | NAME | STRING - if self.value == "(": - self.gettoken() - a, z = self.parse_rhs() - self.expect(tokenize.OP, ")") - return a, z - elif self.type in (tokenize.NAME, tokenize.STRING): - a = NFAState() - z = NFAState() - a.addarc(z, self.value) - self.gettoken() - return a, z - else: - self.raise_error("expected (...) or NAME or STRING, got %s/%s", - self.type, self.value) - - def expect(self, type, value=None): - if self.type != type or (value is not None and self.value != value): - self.raise_error("expected %s/%s, got %s/%s", - type, value, self.type, self.value) - value = self.value - self.gettoken() - return value - - def gettoken(self): - tup = next(self.generator) - while tup[0] in (tokenize.COMMENT, tokenize.NL): - tup = next(self.generator) - self.type, self.value, self.begin, self.end, self.line = tup - # print(getattr(tokenize, 'tok_name')[self.type], repr(self.value)) - - def raise_error(self, msg, *args): - if args: - try: - msg = msg % args - except Exception: - msg = " ".join([msg] + list(map(str, args))) - raise SyntaxError(msg, (self.filename, self.end[0], - self.end[1], self.line)) - -class NFAState(object): - - def __init__(self): - self.arcs = [] # list of (label, NFAState) pairs - - def addarc(self, next, label=None): - assert label is None or isinstance(label, str) - assert isinstance(next, NFAState) - self.arcs.append((label, next)) - -class DFAState(object): - - def __init__(self, nfaset, final): - assert isinstance(nfaset, set) - assert isinstance(next(iter(nfaset)), NFAState) - assert isinstance(final, NFAState) - self.nfaset = nfaset - self.isfinal = final in nfaset - self.arcs = {} # map from label to DFAState - - def addarc(self, next, label): - assert isinstance(label, str) - assert label not in self.arcs - assert isinstance(next, DFAState) - self.arcs[label] = next - - def unifystate(self, old, new): - for label, next in self.arcs.items(): - if next is old: - self.arcs[label] = new - - def __eq__(self, other): - # Equality test -- ignore the nfaset instance variable - assert isinstance(other, DFAState) - if self.isfinal != other.isfinal: - return False - # Can't just return self.arcs == other.arcs, because that - # would invoke this method recursively, with cycles... - if len(self.arcs) != len(other.arcs): - return False - for label, next in self.arcs.items(): - if next is not other.arcs.get(label): - return False - return True - - __hash__ = None # For Py3 compatibility. diff --git a/Parser/pgen/token.py b/Parser/pgen/token.py index 008e241e..2cff62ce 100644 --- a/Parser/pgen/token.py +++ b/Parser/pgen/token.py @@ -6,25 +6,21 @@ def generate_tokens(tokens): for line in tokens: line = line.strip() - if not line: - continue - if line.strip().startswith('#'): + if not line or line.startswith("#"): continue name = line.split()[0] yield (name, next(numbers)) - yield ('N_TOKENS', next(numbers)) - yield ('NT_OFFSET', 256) + yield ("N_TOKENS", next(numbers)) + yield ("NT_OFFSET", 256) def generate_opmap(tokens): for line in tokens: line = line.strip() - if not line: - continue - if line.strip().startswith('#'): + if not line or line.startswith("#"): continue pieces = line.split() @@ -39,4 +35,4 @@ def generate_opmap(tokens): # with the token generation in "generate_tokens" because if this # symbol is included in Grammar/Tokens, it will collide with != # as it has the same name (NOTEQUAL). - yield ('<>', 'NOTEQUAL') + yield ("<>", "NOTEQUAL") diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index aecbcebb..f3c1d9b2 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -32,10 +32,6 @@ || c == '_'\ || (c >= 128)) -extern char *PyOS_Readline(FILE *, FILE *, const char *); -/* Return malloc'ed string including trailing \n; - empty malloc'ed string for EOF; - NULL if interrupted */ /* Don't ever change this -- it would break the portability of Python code */ #define TABSIZE 8 @@ -59,7 +55,9 @@ tok_new(void) sizeof(struct tok_state)); if (tok == NULL) return NULL; - tok->buf = tok->cur = tok->end = tok->inp = tok->start = NULL; + tok->buf = tok->cur = tok->inp = NULL; + tok->start = NULL; + tok->end = NULL; tok->done = E_OK; tok->fp = NULL; tok->input = NULL; @@ -111,7 +109,9 @@ error_ret(struct tok_state *tok) /* XXX */ tok->decoding_erred = 1; if (tok->fp != NULL && tok->buf != NULL) /* see PyTokenizer_Free */ PyMem_FREE(tok->buf); - tok->buf = tok->cur = tok->end = tok->inp = tok->start = NULL; + tok->buf = tok->cur = tok->inp = NULL; + tok->start = NULL; + tok->end = NULL; tok->done = E_DECODE; return NULL; /* as if it were EOF */ } @@ -664,11 +664,11 @@ translate_newlines(const char *s, int exec_input, struct tok_state *tok) { Look for encoding declarations inside STR, and record them inside TOK. */ -static const char * +static char * decode_str(const char *input, int single, struct tok_state *tok) { PyObject* utf8 = NULL; - const char *str; + char *str; const char *s; const char *newl[2] = {NULL, NULL}; int lineno = 0; @@ -726,16 +726,18 @@ struct tok_state * PyTokenizer_FromString(const char *str, int exec_input) { struct tok_state *tok = tok_new(); + char *decoded; + if (tok == NULL) return NULL; - str = decode_str(str, exec_input, tok); - if (str == NULL) { + decoded = decode_str(str, exec_input, tok); + if (decoded == NULL) { PyTokenizer_Free(tok); return NULL; } - /* XXX: constify members. */ - tok->buf = tok->cur = tok->end = tok->inp = (char*)str; + tok->buf = tok->cur = tok->inp = decoded; + tok->end = decoded; return tok; } @@ -743,17 +745,18 @@ struct tok_state * PyTokenizer_FromUTF8(const char *str, int exec_input) { struct tok_state *tok = tok_new(); + char *translated; if (tok == NULL) return NULL; - tok->input = str = translate_newlines(str, exec_input, tok); - if (str == NULL) { + tok->input = translated = translate_newlines(str, exec_input, tok); + if (translated == NULL) { PyTokenizer_Free(tok); return NULL; } tok->decoding_state = STATE_RAW; tok->read_coding_spec = 1; tok->enc = NULL; - tok->str = str; + tok->str = translated; tok->encoding = (char *)PyMem_MALLOC(6); if (!tok->encoding) { PyTokenizer_Free(tok); @@ -761,8 +764,8 @@ PyTokenizer_FromUTF8(const char *str, int exec_input) } strcpy(tok->encoding, "utf-8"); - /* XXX: constify members. */ - tok->buf = tok->cur = tok->end = tok->inp = (char*)str; + tok->buf = tok->cur = tok->inp = translated; + tok->end = translated; return tok; } @@ -812,7 +815,7 @@ PyTokenizer_Free(struct tok_state *tok) if (tok->fp != NULL && tok->buf != NULL) PyMem_FREE(tok->buf); if (tok->input) - PyMem_FREE((char *)tok->input); + PyMem_FREE(tok->input); PyMem_FREE(tok); } @@ -1024,10 +1027,12 @@ static void tok_backup(struct tok_state *tok, int c) { if (c != EOF) { - if (--tok->cur < tok->buf) - Py_FatalError("tok_backup: beginning of buffer"); - if (*tok->cur != c) + if (--tok->cur < tok->buf) { + Py_FatalError("tokenizer beginning of buffer"); + } + if (*tok->cur != c) { *tok->cur = c; + } } } @@ -1092,24 +1097,53 @@ static int verify_identifier(struct tok_state *tok) { PyObject *s; - int result; if (tok->decoding_erred) return 0; s = PyUnicode_DecodeUTF8(tok->start, tok->cur - tok->start, NULL); if (s == NULL) { if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { - PyErr_Clear(); - tok->done = E_IDENTIFIER; - } else { + tok->done = E_DECODE; + } + else { tok->done = E_ERROR; } return 0; } - result = PyUnicode_IsIdentifier(s); + Py_ssize_t invalid = _PyUnicode_ScanIdentifier(s); + if (invalid < 0) { + Py_DECREF(s); + tok->done = E_ERROR; + return 0; + } + assert(PyUnicode_GET_LENGTH(s) > 0); + if (invalid < PyUnicode_GET_LENGTH(s)) { + Py_UCS4 ch = PyUnicode_READ_CHAR(s, invalid); + if (invalid + 1 < PyUnicode_GET_LENGTH(s)) { + /* Determine the offset in UTF-8 encoded input */ + Py_SETREF(s, PyUnicode_Substring(s, 0, invalid + 1)); + if (s != NULL) { + Py_SETREF(s, PyUnicode_AsUTF8String(s)); + } + if (s == NULL) { + tok->done = E_ERROR; + return 0; + } + tok->cur = (char *)tok->start + PyBytes_GET_SIZE(s); + } + Py_DECREF(s); + // PyUnicode_FromFormatV() does not support %X + char hex[9]; + (void)PyOS_snprintf(hex, sizeof(hex), "%04X", ch); + if (Py_UNICODE_ISPRINTABLE(ch)) { + syntaxerror(tok, "invalid character '%c' (U+%s)", ch, hex); + } + else { + syntaxerror(tok, "invalid non-printable character U+%s", hex); + } + return 0; + } Py_DECREF(s); - if (result == 0) - tok->done = E_IDENTIFIER; - return result; + return 1; } static int @@ -1137,7 +1171,7 @@ tok_decimal_tail(struct tok_state *tok) /* Get next token, after space stripping etc. */ static int -tok_get(struct tok_state *tok, char **p_start, char **p_end) +tok_get(struct tok_state *tok, const char **p_start, const char **p_end) { int c; int blankline, nonascii; @@ -1169,8 +1203,9 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) } } tok_backup(tok, c); - if (c == '#' || c == '\n') { + if (c == '#' || c == '\n' || c == '\\') { /* Lines with only whitespace and/or comments + and/or a line continuation character shouldn't affect the indentation and are not passed to the parser as NEWLINE tokens, except *totally* empty lines in interactive @@ -1320,7 +1355,7 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) && ((unsigned char)ignore_end[0] >= 128 || Py_ISALNUM(ignore_end[0])))); if (is_type_ignore) { - *p_start = (char *) ignore_end; + *p_start = ignore_end; *p_end = tok->cur; /* If this type ignore is the only thing on the line, consume the newline also. */ @@ -1330,7 +1365,7 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) } return TYPE_IGNORE; } else { - *p_start = (char *) type_start; /* after type_comment_prefix */ + *p_start = type_start; /* after type_comment_prefix */ *p_end = tok->cur; return TYPE_COMMENT; } @@ -1382,6 +1417,7 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) if (nonascii && !verify_identifier(tok)) { return ERRORTOKEN; } + *p_start = tok->start; *p_end = tok->cur; @@ -1409,7 +1445,8 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) Look ahead one token to see if that is 'def'. */ struct tok_state ahead_tok; - char *ahead_tok_start = NULL, *ahead_tok_end = NULL; + const char *ahead_tok_start = NULL; + const char *ahead_tok_end = NULL; int ahead_tok_kind; memcpy(&ahead_tok, tok, sizeof(ahead_tok)); @@ -1797,7 +1834,7 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) } int -PyTokenizer_Get(struct tok_state *tok, char **p_start, char **p_end) +PyTokenizer_Get(struct tok_state *tok, const char **p_start, const char **p_end) { int result = tok_get(tok, p_start, p_end); if (tok->decoding_erred) { @@ -1822,7 +1859,9 @@ PyTokenizer_FindEncodingFilename(int fd, PyObject *filename) { struct tok_state *tok; FILE *fp; - char *p_start =NULL , *p_end =NULL , *encoding = NULL; + const char *p_start = NULL; + const char *p_end = NULL; + char *encoding = NULL; fd = _Py_dup(fd); if (fd < 0) { diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index 92669bfd..5660ea38 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -26,8 +26,8 @@ struct tok_state { char *buf; /* Input buffer, or NULL; malloc'ed if fp != NULL */ char *cur; /* Next character in buffer */ char *inp; /* End of data in buffer */ - char *end; /* End of input buffer if buf != NULL */ - char *start; /* Start of current token if not NULL */ + const char *end; /* End of input buffer if buf != NULL */ + const char *start; /* Start of current token if not NULL */ int done; /* E_OK normally, E_EOF at EOF, otherwise error code */ /* NB If done != E_OK, cur must be == inp!!! */ FILE *fp; /* Rest of input; NULL if tokenizing a string */ @@ -60,8 +60,8 @@ struct tok_state { PyObject *decoding_readline; /* open(...).readline */ PyObject *decoding_buffer; const char* enc; /* Encoding for the current str. */ - const char* str; - const char* input; /* Tokenizer's newline translated copy of the string. */ + char* str; + char* input; /* Tokenizer's newline translated copy of the string. */ int type_comments; /* Whether to look for type comments */ @@ -78,7 +78,7 @@ extern struct tok_state *PyTokenizer_FromUTF8(const char *, int); extern struct tok_state *PyTokenizer_FromFile(FILE *, const char*, const char *, const char *); extern void PyTokenizer_Free(struct tok_state *); -extern int PyTokenizer_Get(struct tok_state *, char **, char **); +extern int PyTokenizer_Get(struct tok_state *, const char **, const char **); #define tok_dump _Py_tok_dump diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 460d70cc..3bf0c37a 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -6,10 +6,9 @@ #undef NDEBUG #include -#include "pycore_initconfig.h" /* _PyConfig_InitCompatConfig() */ -#include "pycore_pystate.h" /* _PyRuntime */ +#include "pycore_initconfig.h" // _PyConfig_InitCompatConfig() +#include "pycore_runtime.h" // _PyRuntime #include -#include "pythread.h" #include #include #include @@ -62,7 +61,6 @@ static int test_repeated_init_and_subinterpreters(void) _testembed_Py_Initialize(); mainstate = PyThreadState_Get(); - PyEval_InitThreads(); PyEval_ReleaseThread(mainstate); gilstate = PyGILState_Ensure(); @@ -252,9 +250,8 @@ static int test_bpo20891(void) /* the test doesn't support custom memory allocators */ putenv("PYTHONMALLOC="); - /* bpo-20891: Calling PyGILState_Ensure in a non-Python thread before - calling PyEval_InitThreads() must not crash. PyGILState_Ensure() must - call PyEval_InitThreads() for us in this case. */ + /* bpo-20891: Calling PyGILState_Ensure in a non-Python thread must not + crash. */ PyThread_type_lock lock = PyThread_allocate_lock(); if (!lock) { fprintf(stderr, "PyThread_allocate_lock failed!"); @@ -488,6 +485,9 @@ static int test_init_from_config(void) config.install_signal_handlers = 0; + putenv("PYTHONOLDPARSER=1"); + config._use_peg_parser = 0; + /* FIXME: test use_environment */ putenv("PYTHONHASHSEED=42"); @@ -506,7 +506,6 @@ static int test_init_from_config(void) config.import_time = 1; config.show_ref_count = 1; - config.show_alloc_count = 1; /* FIXME: test dump_refs: bpo-34223 */ putenv("PYTHONMALLOCSTATS=0"); @@ -549,6 +548,13 @@ static int test_init_from_config(void) /* FIXME: test home */ /* FIXME: test path config: module_search_path .. dll_path */ + putenv("PYTHONPLATLIBDIR=env_platlibdir"); + status = PyConfig_SetBytesString(&config, &config.platlibdir, "my_platlibdir"); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + Py_ExitStatusException(status); + } + putenv("PYTHONVERBOSE=0"); Py_VerboseFlag = 0; config.verbose = 1; @@ -604,6 +610,8 @@ static int test_init_from_config(void) Py_FrozenFlag = 0; config.pathconfig_warnings = 0; + config._isolated_interpreter = 1; + init_from_config_clear(&config); dump_config(); @@ -666,6 +674,8 @@ static void set_most_env_vars(void) putenv("PYTHONNOUSERSITE=1"); putenv("PYTHONFAULTHANDLER=1"); putenv("PYTHONIOENCODING=iso8859-1:replace"); + putenv("PYTHONOLDPARSER=1"); + putenv("PYTHONPLATLIBDIR=env_platlibdir"); } @@ -1332,6 +1342,7 @@ static int test_init_read_set(void) return 0; fail: + PyConfig_Clear(&config); Py_ExitStatusException(status); } @@ -1590,6 +1601,46 @@ static int test_run_main(void) } +static int test_get_argc_argv(void) +{ + PyConfig config; + PyConfig_InitPythonConfig(&config); + + wchar_t *argv[] = {L"python3", L"-c", + (L"import sys; " + L"print(f'Py_RunMain(): sys.argv={sys.argv}')"), + L"arg2"}; + config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); + config_set_string(&config, &config.program_name, L"./python3"); + + // Calling PyConfig_Read() twice must not change Py_GetArgcArgv() result. + // The second call is done by Py_InitializeFromConfig(). + PyStatus status = PyConfig_Read(&config); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + Py_ExitStatusException(status); + } + + init_from_config_clear(&config); + + int get_argc; + wchar_t **get_argv; + Py_GetArgcArgv(&get_argc, &get_argv); + printf("argc: %i\n", get_argc); + assert(get_argc == Py_ARRAY_LENGTH(argv)); + for (int i=0; i < get_argc; i++) { + printf("argv[%i]: %ls\n", i, get_argv[i]); + assert(wcscmp(get_argv[i], argv[i]) == 0); + } + + Py_Finalize(); + + printf("\n"); + printf("test ok\n"); + return 0; +} + + /* ********************************************************* * List of test cases and the function that implements it. * @@ -1647,6 +1698,7 @@ static struct TestCase TestCases[] = { {"test_init_setpythonhome", test_init_setpythonhome}, {"test_init_warnoptions", test_init_warnoptions}, {"test_run_main", test_run_main}, + {"test_get_argc_argv", test_get_argc_argv}, {"test_open_code_hook", test_open_code_hook}, {"test_audit", test_audit}, diff --git a/Programs/python.c b/Programs/python.c index 1cc3c42c..84148f77 100644 --- a/Programs/python.c +++ b/Programs/python.c @@ -1,7 +1,6 @@ /* Minimal main program -- everything is loaded from the library */ #include "Python.h" -#include "pycore_pylifecycle.h" #ifdef MS_WINDOWS int diff --git a/Python/Python-ast.c b/Python/Python-ast.c index bcf94569..9e86f431 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -4,54 +4,574 @@ #include "Python.h" #include "Python-ast.h" +#include "structmember.h" // PyMemberDef -static PyTypeObject AST_type; -static PyTypeObject *mod_type; -static PyObject* ast2obj_mod(void*); -static PyTypeObject *Module_type; -_Py_IDENTIFIER(body); -_Py_IDENTIFIER(type_ignores); -static char *Module_fields[]={ +typedef struct { + int initialized; + PyObject *AST_type; + PyObject *Add_singleton; + PyObject *Add_type; + PyObject *And_singleton; + PyObject *And_type; + PyObject *AnnAssign_type; + PyObject *Assert_type; + PyObject *Assign_type; + PyObject *AsyncFor_type; + PyObject *AsyncFunctionDef_type; + PyObject *AsyncWith_type; + PyObject *Attribute_type; + PyObject *AugAssign_type; + PyObject *Await_type; + PyObject *BinOp_type; + PyObject *BitAnd_singleton; + PyObject *BitAnd_type; + PyObject *BitOr_singleton; + PyObject *BitOr_type; + PyObject *BitXor_singleton; + PyObject *BitXor_type; + PyObject *BoolOp_type; + PyObject *Break_type; + PyObject *Call_type; + PyObject *ClassDef_type; + PyObject *Compare_type; + PyObject *Constant_type; + PyObject *Continue_type; + PyObject *Del_singleton; + PyObject *Del_type; + PyObject *Delete_type; + PyObject *DictComp_type; + PyObject *Dict_type; + PyObject *Div_singleton; + PyObject *Div_type; + PyObject *Eq_singleton; + PyObject *Eq_type; + PyObject *ExceptHandler_type; + PyObject *Expr_type; + PyObject *Expression_type; + PyObject *FloorDiv_singleton; + PyObject *FloorDiv_type; + PyObject *For_type; + PyObject *FormattedValue_type; + PyObject *FunctionDef_type; + PyObject *FunctionType_type; + PyObject *GeneratorExp_type; + PyObject *Global_type; + PyObject *GtE_singleton; + PyObject *GtE_type; + PyObject *Gt_singleton; + PyObject *Gt_type; + PyObject *IfExp_type; + PyObject *If_type; + PyObject *ImportFrom_type; + PyObject *Import_type; + PyObject *In_singleton; + PyObject *In_type; + PyObject *Interactive_type; + PyObject *Invert_singleton; + PyObject *Invert_type; + PyObject *IsNot_singleton; + PyObject *IsNot_type; + PyObject *Is_singleton; + PyObject *Is_type; + PyObject *JoinedStr_type; + PyObject *LShift_singleton; + PyObject *LShift_type; + PyObject *Lambda_type; + PyObject *ListComp_type; + PyObject *List_type; + PyObject *Load_singleton; + PyObject *Load_type; + PyObject *LtE_singleton; + PyObject *LtE_type; + PyObject *Lt_singleton; + PyObject *Lt_type; + PyObject *MatMult_singleton; + PyObject *MatMult_type; + PyObject *Mod_singleton; + PyObject *Mod_type; + PyObject *Module_type; + PyObject *Mult_singleton; + PyObject *Mult_type; + PyObject *Name_type; + PyObject *NamedExpr_type; + PyObject *Nonlocal_type; + PyObject *NotEq_singleton; + PyObject *NotEq_type; + PyObject *NotIn_singleton; + PyObject *NotIn_type; + PyObject *Not_singleton; + PyObject *Not_type; + PyObject *Or_singleton; + PyObject *Or_type; + PyObject *Pass_type; + PyObject *Pow_singleton; + PyObject *Pow_type; + PyObject *RShift_singleton; + PyObject *RShift_type; + PyObject *Raise_type; + PyObject *Return_type; + PyObject *SetComp_type; + PyObject *Set_type; + PyObject *Slice_type; + PyObject *Starred_type; + PyObject *Store_singleton; + PyObject *Store_type; + PyObject *Sub_singleton; + PyObject *Sub_type; + PyObject *Subscript_type; + PyObject *Try_type; + PyObject *Tuple_type; + PyObject *TypeIgnore_type; + PyObject *UAdd_singleton; + PyObject *UAdd_type; + PyObject *USub_singleton; + PyObject *USub_type; + PyObject *UnaryOp_type; + PyObject *While_type; + PyObject *With_type; + PyObject *YieldFrom_type; + PyObject *Yield_type; + PyObject *__dict__; + PyObject *__doc__; + PyObject *__module__; + PyObject *_attributes; + PyObject *_fields; + PyObject *alias_type; + PyObject *annotation; + PyObject *arg; + PyObject *arg_type; + PyObject *args; + PyObject *argtypes; + PyObject *arguments_type; + PyObject *asname; + PyObject *ast; + PyObject *attr; + PyObject *bases; + PyObject *body; + PyObject *boolop_type; + PyObject *cause; + PyObject *cmpop_type; + PyObject *col_offset; + PyObject *comparators; + PyObject *comprehension_type; + PyObject *context_expr; + PyObject *conversion; + PyObject *ctx; + PyObject *decorator_list; + PyObject *defaults; + PyObject *elt; + PyObject *elts; + PyObject *end_col_offset; + PyObject *end_lineno; + PyObject *exc; + PyObject *excepthandler_type; + PyObject *expr_context_type; + PyObject *expr_type; + PyObject *finalbody; + PyObject *format_spec; + PyObject *func; + PyObject *generators; + PyObject *handlers; + PyObject *id; + PyObject *ifs; + PyObject *is_async; + PyObject *items; + PyObject *iter; + PyObject *key; + PyObject *keys; + PyObject *keyword_type; + PyObject *keywords; + PyObject *kind; + PyObject *kw_defaults; + PyObject *kwarg; + PyObject *kwonlyargs; + PyObject *left; + PyObject *level; + PyObject *lineno; + PyObject *lower; + PyObject *mod_type; + PyObject *module; + PyObject *msg; + PyObject *name; + PyObject *names; + PyObject *op; + PyObject *operand; + PyObject *operator_type; + PyObject *ops; + PyObject *optional_vars; + PyObject *orelse; + PyObject *posonlyargs; + PyObject *returns; + PyObject *right; + PyObject *simple; + PyObject *slice; + PyObject *step; + PyObject *stmt_type; + PyObject *tag; + PyObject *target; + PyObject *targets; + PyObject *test; + PyObject *type; + PyObject *type_comment; + PyObject *type_ignore_type; + PyObject *type_ignores; + PyObject *unaryop_type; + PyObject *upper; + PyObject *value; + PyObject *values; + PyObject *vararg; + PyObject *withitem_type; +} astmodulestate; + + +// Forward declaration +static int init_types(astmodulestate *state); + +// bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. +static astmodulestate global_ast_state = {0}; + +static astmodulestate* +get_global_ast_state(void) +{ + astmodulestate* state = &global_ast_state; + if (!init_types(state)) { + return NULL; + } + return state; +} + +static astmodulestate* +get_ast_state(PyObject* Py_UNUSED(module)) +{ + astmodulestate* state = get_global_ast_state(); + // get_ast_state() must only be called after _ast module is imported, + // and astmodule_exec() calls init_types() + assert(state != NULL); + return state; +} + +void _PyAST_Fini() +{ + astmodulestate* state = &global_ast_state; + Py_CLEAR(state->AST_type); + Py_CLEAR(state->Add_singleton); + Py_CLEAR(state->Add_type); + Py_CLEAR(state->And_singleton); + Py_CLEAR(state->And_type); + Py_CLEAR(state->AnnAssign_type); + Py_CLEAR(state->Assert_type); + Py_CLEAR(state->Assign_type); + Py_CLEAR(state->AsyncFor_type); + Py_CLEAR(state->AsyncFunctionDef_type); + Py_CLEAR(state->AsyncWith_type); + Py_CLEAR(state->Attribute_type); + Py_CLEAR(state->AugAssign_type); + Py_CLEAR(state->Await_type); + Py_CLEAR(state->BinOp_type); + Py_CLEAR(state->BitAnd_singleton); + Py_CLEAR(state->BitAnd_type); + Py_CLEAR(state->BitOr_singleton); + Py_CLEAR(state->BitOr_type); + Py_CLEAR(state->BitXor_singleton); + Py_CLEAR(state->BitXor_type); + Py_CLEAR(state->BoolOp_type); + Py_CLEAR(state->Break_type); + Py_CLEAR(state->Call_type); + Py_CLEAR(state->ClassDef_type); + Py_CLEAR(state->Compare_type); + Py_CLEAR(state->Constant_type); + Py_CLEAR(state->Continue_type); + Py_CLEAR(state->Del_singleton); + Py_CLEAR(state->Del_type); + Py_CLEAR(state->Delete_type); + Py_CLEAR(state->DictComp_type); + Py_CLEAR(state->Dict_type); + Py_CLEAR(state->Div_singleton); + Py_CLEAR(state->Div_type); + Py_CLEAR(state->Eq_singleton); + Py_CLEAR(state->Eq_type); + Py_CLEAR(state->ExceptHandler_type); + Py_CLEAR(state->Expr_type); + Py_CLEAR(state->Expression_type); + Py_CLEAR(state->FloorDiv_singleton); + Py_CLEAR(state->FloorDiv_type); + Py_CLEAR(state->For_type); + Py_CLEAR(state->FormattedValue_type); + Py_CLEAR(state->FunctionDef_type); + Py_CLEAR(state->FunctionType_type); + Py_CLEAR(state->GeneratorExp_type); + Py_CLEAR(state->Global_type); + Py_CLEAR(state->GtE_singleton); + Py_CLEAR(state->GtE_type); + Py_CLEAR(state->Gt_singleton); + Py_CLEAR(state->Gt_type); + Py_CLEAR(state->IfExp_type); + Py_CLEAR(state->If_type); + Py_CLEAR(state->ImportFrom_type); + Py_CLEAR(state->Import_type); + Py_CLEAR(state->In_singleton); + Py_CLEAR(state->In_type); + Py_CLEAR(state->Interactive_type); + Py_CLEAR(state->Invert_singleton); + Py_CLEAR(state->Invert_type); + Py_CLEAR(state->IsNot_singleton); + Py_CLEAR(state->IsNot_type); + Py_CLEAR(state->Is_singleton); + Py_CLEAR(state->Is_type); + Py_CLEAR(state->JoinedStr_type); + Py_CLEAR(state->LShift_singleton); + Py_CLEAR(state->LShift_type); + Py_CLEAR(state->Lambda_type); + Py_CLEAR(state->ListComp_type); + Py_CLEAR(state->List_type); + Py_CLEAR(state->Load_singleton); + Py_CLEAR(state->Load_type); + Py_CLEAR(state->LtE_singleton); + Py_CLEAR(state->LtE_type); + Py_CLEAR(state->Lt_singleton); + Py_CLEAR(state->Lt_type); + Py_CLEAR(state->MatMult_singleton); + Py_CLEAR(state->MatMult_type); + Py_CLEAR(state->Mod_singleton); + Py_CLEAR(state->Mod_type); + Py_CLEAR(state->Module_type); + Py_CLEAR(state->Mult_singleton); + Py_CLEAR(state->Mult_type); + Py_CLEAR(state->Name_type); + Py_CLEAR(state->NamedExpr_type); + Py_CLEAR(state->Nonlocal_type); + Py_CLEAR(state->NotEq_singleton); + Py_CLEAR(state->NotEq_type); + Py_CLEAR(state->NotIn_singleton); + Py_CLEAR(state->NotIn_type); + Py_CLEAR(state->Not_singleton); + Py_CLEAR(state->Not_type); + Py_CLEAR(state->Or_singleton); + Py_CLEAR(state->Or_type); + Py_CLEAR(state->Pass_type); + Py_CLEAR(state->Pow_singleton); + Py_CLEAR(state->Pow_type); + Py_CLEAR(state->RShift_singleton); + Py_CLEAR(state->RShift_type); + Py_CLEAR(state->Raise_type); + Py_CLEAR(state->Return_type); + Py_CLEAR(state->SetComp_type); + Py_CLEAR(state->Set_type); + Py_CLEAR(state->Slice_type); + Py_CLEAR(state->Starred_type); + Py_CLEAR(state->Store_singleton); + Py_CLEAR(state->Store_type); + Py_CLEAR(state->Sub_singleton); + Py_CLEAR(state->Sub_type); + Py_CLEAR(state->Subscript_type); + Py_CLEAR(state->Try_type); + Py_CLEAR(state->Tuple_type); + Py_CLEAR(state->TypeIgnore_type); + Py_CLEAR(state->UAdd_singleton); + Py_CLEAR(state->UAdd_type); + Py_CLEAR(state->USub_singleton); + Py_CLEAR(state->USub_type); + Py_CLEAR(state->UnaryOp_type); + Py_CLEAR(state->While_type); + Py_CLEAR(state->With_type); + Py_CLEAR(state->YieldFrom_type); + Py_CLEAR(state->Yield_type); + Py_CLEAR(state->__dict__); + Py_CLEAR(state->__doc__); + Py_CLEAR(state->__module__); + Py_CLEAR(state->_attributes); + Py_CLEAR(state->_fields); + Py_CLEAR(state->alias_type); + Py_CLEAR(state->annotation); + Py_CLEAR(state->arg); + Py_CLEAR(state->arg_type); + Py_CLEAR(state->args); + Py_CLEAR(state->argtypes); + Py_CLEAR(state->arguments_type); + Py_CLEAR(state->asname); + Py_CLEAR(state->ast); + Py_CLEAR(state->attr); + Py_CLEAR(state->bases); + Py_CLEAR(state->body); + Py_CLEAR(state->boolop_type); + Py_CLEAR(state->cause); + Py_CLEAR(state->cmpop_type); + Py_CLEAR(state->col_offset); + Py_CLEAR(state->comparators); + Py_CLEAR(state->comprehension_type); + Py_CLEAR(state->context_expr); + Py_CLEAR(state->conversion); + Py_CLEAR(state->ctx); + Py_CLEAR(state->decorator_list); + Py_CLEAR(state->defaults); + Py_CLEAR(state->elt); + Py_CLEAR(state->elts); + Py_CLEAR(state->end_col_offset); + Py_CLEAR(state->end_lineno); + Py_CLEAR(state->exc); + Py_CLEAR(state->excepthandler_type); + Py_CLEAR(state->expr_context_type); + Py_CLEAR(state->expr_type); + Py_CLEAR(state->finalbody); + Py_CLEAR(state->format_spec); + Py_CLEAR(state->func); + Py_CLEAR(state->generators); + Py_CLEAR(state->handlers); + Py_CLEAR(state->id); + Py_CLEAR(state->ifs); + Py_CLEAR(state->is_async); + Py_CLEAR(state->items); + Py_CLEAR(state->iter); + Py_CLEAR(state->key); + Py_CLEAR(state->keys); + Py_CLEAR(state->keyword_type); + Py_CLEAR(state->keywords); + Py_CLEAR(state->kind); + Py_CLEAR(state->kw_defaults); + Py_CLEAR(state->kwarg); + Py_CLEAR(state->kwonlyargs); + Py_CLEAR(state->left); + Py_CLEAR(state->level); + Py_CLEAR(state->lineno); + Py_CLEAR(state->lower); + Py_CLEAR(state->mod_type); + Py_CLEAR(state->module); + Py_CLEAR(state->msg); + Py_CLEAR(state->name); + Py_CLEAR(state->names); + Py_CLEAR(state->op); + Py_CLEAR(state->operand); + Py_CLEAR(state->operator_type); + Py_CLEAR(state->ops); + Py_CLEAR(state->optional_vars); + Py_CLEAR(state->orelse); + Py_CLEAR(state->posonlyargs); + Py_CLEAR(state->returns); + Py_CLEAR(state->right); + Py_CLEAR(state->simple); + Py_CLEAR(state->slice); + Py_CLEAR(state->step); + Py_CLEAR(state->stmt_type); + Py_CLEAR(state->tag); + Py_CLEAR(state->target); + Py_CLEAR(state->targets); + Py_CLEAR(state->test); + Py_CLEAR(state->type); + Py_CLEAR(state->type_comment); + Py_CLEAR(state->type_ignore_type); + Py_CLEAR(state->type_ignores); + Py_CLEAR(state->unaryop_type); + Py_CLEAR(state->upper); + Py_CLEAR(state->value); + Py_CLEAR(state->values); + Py_CLEAR(state->vararg); + Py_CLEAR(state->withitem_type); + + state->initialized = 0; +} + +static int init_identifiers(astmodulestate *state) +{ + if ((state->__dict__ = PyUnicode_InternFromString("__dict__")) == NULL) return 0; + if ((state->__doc__ = PyUnicode_InternFromString("__doc__")) == NULL) return 0; + if ((state->__module__ = PyUnicode_InternFromString("__module__")) == NULL) return 0; + if ((state->_attributes = PyUnicode_InternFromString("_attributes")) == NULL) return 0; + if ((state->_fields = PyUnicode_InternFromString("_fields")) == NULL) return 0; + if ((state->annotation = PyUnicode_InternFromString("annotation")) == NULL) return 0; + if ((state->arg = PyUnicode_InternFromString("arg")) == NULL) return 0; + if ((state->args = PyUnicode_InternFromString("args")) == NULL) return 0; + if ((state->argtypes = PyUnicode_InternFromString("argtypes")) == NULL) return 0; + if ((state->asname = PyUnicode_InternFromString("asname")) == NULL) return 0; + if ((state->ast = PyUnicode_InternFromString("ast")) == NULL) return 0; + if ((state->attr = PyUnicode_InternFromString("attr")) == NULL) return 0; + if ((state->bases = PyUnicode_InternFromString("bases")) == NULL) return 0; + if ((state->body = PyUnicode_InternFromString("body")) == NULL) return 0; + if ((state->cause = PyUnicode_InternFromString("cause")) == NULL) return 0; + if ((state->col_offset = PyUnicode_InternFromString("col_offset")) == NULL) return 0; + if ((state->comparators = PyUnicode_InternFromString("comparators")) == NULL) return 0; + if ((state->context_expr = PyUnicode_InternFromString("context_expr")) == NULL) return 0; + if ((state->conversion = PyUnicode_InternFromString("conversion")) == NULL) return 0; + if ((state->ctx = PyUnicode_InternFromString("ctx")) == NULL) return 0; + if ((state->decorator_list = PyUnicode_InternFromString("decorator_list")) == NULL) return 0; + if ((state->defaults = PyUnicode_InternFromString("defaults")) == NULL) return 0; + if ((state->elt = PyUnicode_InternFromString("elt")) == NULL) return 0; + if ((state->elts = PyUnicode_InternFromString("elts")) == NULL) return 0; + if ((state->end_col_offset = PyUnicode_InternFromString("end_col_offset")) == NULL) return 0; + if ((state->end_lineno = PyUnicode_InternFromString("end_lineno")) == NULL) return 0; + if ((state->exc = PyUnicode_InternFromString("exc")) == NULL) return 0; + if ((state->finalbody = PyUnicode_InternFromString("finalbody")) == NULL) return 0; + if ((state->format_spec = PyUnicode_InternFromString("format_spec")) == NULL) return 0; + if ((state->func = PyUnicode_InternFromString("func")) == NULL) return 0; + if ((state->generators = PyUnicode_InternFromString("generators")) == NULL) return 0; + if ((state->handlers = PyUnicode_InternFromString("handlers")) == NULL) return 0; + if ((state->id = PyUnicode_InternFromString("id")) == NULL) return 0; + if ((state->ifs = PyUnicode_InternFromString("ifs")) == NULL) return 0; + if ((state->is_async = PyUnicode_InternFromString("is_async")) == NULL) return 0; + if ((state->items = PyUnicode_InternFromString("items")) == NULL) return 0; + if ((state->iter = PyUnicode_InternFromString("iter")) == NULL) return 0; + if ((state->key = PyUnicode_InternFromString("key")) == NULL) return 0; + if ((state->keys = PyUnicode_InternFromString("keys")) == NULL) return 0; + if ((state->keywords = PyUnicode_InternFromString("keywords")) == NULL) return 0; + if ((state->kind = PyUnicode_InternFromString("kind")) == NULL) return 0; + if ((state->kw_defaults = PyUnicode_InternFromString("kw_defaults")) == NULL) return 0; + if ((state->kwarg = PyUnicode_InternFromString("kwarg")) == NULL) return 0; + if ((state->kwonlyargs = PyUnicode_InternFromString("kwonlyargs")) == NULL) return 0; + if ((state->left = PyUnicode_InternFromString("left")) == NULL) return 0; + if ((state->level = PyUnicode_InternFromString("level")) == NULL) return 0; + if ((state->lineno = PyUnicode_InternFromString("lineno")) == NULL) return 0; + if ((state->lower = PyUnicode_InternFromString("lower")) == NULL) return 0; + if ((state->module = PyUnicode_InternFromString("module")) == NULL) return 0; + if ((state->msg = PyUnicode_InternFromString("msg")) == NULL) return 0; + if ((state->name = PyUnicode_InternFromString("name")) == NULL) return 0; + if ((state->names = PyUnicode_InternFromString("names")) == NULL) return 0; + if ((state->op = PyUnicode_InternFromString("op")) == NULL) return 0; + if ((state->operand = PyUnicode_InternFromString("operand")) == NULL) return 0; + if ((state->ops = PyUnicode_InternFromString("ops")) == NULL) return 0; + if ((state->optional_vars = PyUnicode_InternFromString("optional_vars")) == NULL) return 0; + if ((state->orelse = PyUnicode_InternFromString("orelse")) == NULL) return 0; + if ((state->posonlyargs = PyUnicode_InternFromString("posonlyargs")) == NULL) return 0; + if ((state->returns = PyUnicode_InternFromString("returns")) == NULL) return 0; + if ((state->right = PyUnicode_InternFromString("right")) == NULL) return 0; + if ((state->simple = PyUnicode_InternFromString("simple")) == NULL) return 0; + if ((state->slice = PyUnicode_InternFromString("slice")) == NULL) return 0; + if ((state->step = PyUnicode_InternFromString("step")) == NULL) return 0; + if ((state->tag = PyUnicode_InternFromString("tag")) == NULL) return 0; + if ((state->target = PyUnicode_InternFromString("target")) == NULL) return 0; + if ((state->targets = PyUnicode_InternFromString("targets")) == NULL) return 0; + if ((state->test = PyUnicode_InternFromString("test")) == NULL) return 0; + if ((state->type = PyUnicode_InternFromString("type")) == NULL) return 0; + if ((state->type_comment = PyUnicode_InternFromString("type_comment")) == NULL) return 0; + if ((state->type_ignores = PyUnicode_InternFromString("type_ignores")) == NULL) return 0; + if ((state->upper = PyUnicode_InternFromString("upper")) == NULL) return 0; + if ((state->value = PyUnicode_InternFromString("value")) == NULL) return 0; + if ((state->values = PyUnicode_InternFromString("values")) == NULL) return 0; + if ((state->vararg = PyUnicode_InternFromString("vararg")) == NULL) return 0; + return 1; +}; + +static PyObject* ast2obj_mod(astmodulestate *state, void*); +static const char * const Module_fields[]={ "body", "type_ignores", }; -static PyTypeObject *Interactive_type; -static char *Interactive_fields[]={ +static const char * const Interactive_fields[]={ "body", }; -static PyTypeObject *Expression_type; -static char *Expression_fields[]={ +static const char * const Expression_fields[]={ "body", }; -static PyTypeObject *FunctionType_type; -_Py_IDENTIFIER(argtypes); -_Py_IDENTIFIER(returns); -static char *FunctionType_fields[]={ +static const char * const FunctionType_fields[]={ "argtypes", "returns", }; -static PyTypeObject *Suite_type; -static char *Suite_fields[]={ - "body", -}; -static PyTypeObject *stmt_type; -_Py_IDENTIFIER(lineno); -_Py_IDENTIFIER(col_offset); -_Py_IDENTIFIER(end_lineno); -_Py_IDENTIFIER(end_col_offset); -static char *stmt_attributes[] = { +static const char * const stmt_attributes[] = { "lineno", "col_offset", "end_lineno", "end_col_offset", }; -static PyObject* ast2obj_stmt(void*); -static PyTypeObject *FunctionDef_type; -_Py_IDENTIFIER(name); -_Py_IDENTIFIER(args); -_Py_IDENTIFIER(decorator_list); -_Py_IDENTIFIER(type_comment); -static char *FunctionDef_fields[]={ +static PyObject* ast2obj_stmt(astmodulestate *state, void*); +static const char * const FunctionDef_fields[]={ "name", "args", "body", @@ -59,8 +579,7 @@ static char *FunctionDef_fields[]={ "returns", "type_comment", }; -static PyTypeObject *AsyncFunctionDef_type; -static char *AsyncFunctionDef_fields[]={ +static const char * const AsyncFunctionDef_fields[]={ "name", "args", "body", @@ -68,414 +587,245 @@ static char *AsyncFunctionDef_fields[]={ "returns", "type_comment", }; -static PyTypeObject *ClassDef_type; -_Py_IDENTIFIER(bases); -_Py_IDENTIFIER(keywords); -static char *ClassDef_fields[]={ +static const char * const ClassDef_fields[]={ "name", "bases", "keywords", "body", "decorator_list", }; -static PyTypeObject *Return_type; -_Py_IDENTIFIER(value); -static char *Return_fields[]={ +static const char * const Return_fields[]={ "value", }; -static PyTypeObject *Delete_type; -_Py_IDENTIFIER(targets); -static char *Delete_fields[]={ +static const char * const Delete_fields[]={ "targets", }; -static PyTypeObject *Assign_type; -static char *Assign_fields[]={ +static const char * const Assign_fields[]={ "targets", "value", "type_comment", }; -static PyTypeObject *AugAssign_type; -_Py_IDENTIFIER(target); -_Py_IDENTIFIER(op); -static char *AugAssign_fields[]={ +static const char * const AugAssign_fields[]={ "target", "op", "value", }; -static PyTypeObject *AnnAssign_type; -_Py_IDENTIFIER(annotation); -_Py_IDENTIFIER(simple); -static char *AnnAssign_fields[]={ +static const char * const AnnAssign_fields[]={ "target", "annotation", "value", "simple", }; -static PyTypeObject *For_type; -_Py_IDENTIFIER(iter); -_Py_IDENTIFIER(orelse); -static char *For_fields[]={ +static const char * const For_fields[]={ "target", "iter", "body", "orelse", "type_comment", }; -static PyTypeObject *AsyncFor_type; -static char *AsyncFor_fields[]={ +static const char * const AsyncFor_fields[]={ "target", "iter", "body", "orelse", "type_comment", }; -static PyTypeObject *While_type; -_Py_IDENTIFIER(test); -static char *While_fields[]={ +static const char * const While_fields[]={ "test", "body", "orelse", }; -static PyTypeObject *If_type; -static char *If_fields[]={ +static const char * const If_fields[]={ "test", "body", "orelse", }; -static PyTypeObject *With_type; -_Py_IDENTIFIER(items); -static char *With_fields[]={ +static const char * const With_fields[]={ "items", "body", "type_comment", }; -static PyTypeObject *AsyncWith_type; -static char *AsyncWith_fields[]={ +static const char * const AsyncWith_fields[]={ "items", "body", "type_comment", }; -static PyTypeObject *Raise_type; -_Py_IDENTIFIER(exc); -_Py_IDENTIFIER(cause); -static char *Raise_fields[]={ +static const char * const Raise_fields[]={ "exc", "cause", }; -static PyTypeObject *Try_type; -_Py_IDENTIFIER(handlers); -_Py_IDENTIFIER(finalbody); -static char *Try_fields[]={ +static const char * const Try_fields[]={ "body", "handlers", "orelse", "finalbody", }; -static PyTypeObject *Assert_type; -_Py_IDENTIFIER(msg); -static char *Assert_fields[]={ +static const char * const Assert_fields[]={ "test", "msg", }; -static PyTypeObject *Import_type; -_Py_IDENTIFIER(names); -static char *Import_fields[]={ +static const char * const Import_fields[]={ "names", }; -static PyTypeObject *ImportFrom_type; -_Py_IDENTIFIER(module); -_Py_IDENTIFIER(level); -static char *ImportFrom_fields[]={ +static const char * const ImportFrom_fields[]={ "module", "names", "level", }; -static PyTypeObject *Global_type; -static char *Global_fields[]={ +static const char * const Global_fields[]={ "names", }; -static PyTypeObject *Nonlocal_type; -static char *Nonlocal_fields[]={ +static const char * const Nonlocal_fields[]={ "names", }; -static PyTypeObject *Expr_type; -static char *Expr_fields[]={ +static const char * const Expr_fields[]={ "value", }; -static PyTypeObject *Pass_type; -static PyTypeObject *Break_type; -static PyTypeObject *Continue_type; -static PyTypeObject *expr_type; -static char *expr_attributes[] = { +static const char * const expr_attributes[] = { "lineno", "col_offset", "end_lineno", "end_col_offset", }; -static PyObject* ast2obj_expr(void*); -static PyTypeObject *BoolOp_type; -_Py_IDENTIFIER(values); -static char *BoolOp_fields[]={ +static PyObject* ast2obj_expr(astmodulestate *state, void*); +static const char * const BoolOp_fields[]={ "op", "values", }; -static PyTypeObject *NamedExpr_type; -static char *NamedExpr_fields[]={ +static const char * const NamedExpr_fields[]={ "target", "value", }; -static PyTypeObject *BinOp_type; -_Py_IDENTIFIER(left); -_Py_IDENTIFIER(right); -static char *BinOp_fields[]={ +static const char * const BinOp_fields[]={ "left", "op", "right", }; -static PyTypeObject *UnaryOp_type; -_Py_IDENTIFIER(operand); -static char *UnaryOp_fields[]={ +static const char * const UnaryOp_fields[]={ "op", "operand", }; -static PyTypeObject *Lambda_type; -static char *Lambda_fields[]={ +static const char * const Lambda_fields[]={ "args", "body", }; -static PyTypeObject *IfExp_type; -static char *IfExp_fields[]={ +static const char * const IfExp_fields[]={ "test", "body", "orelse", }; -static PyTypeObject *Dict_type; -_Py_IDENTIFIER(keys); -static char *Dict_fields[]={ +static const char * const Dict_fields[]={ "keys", "values", }; -static PyTypeObject *Set_type; -_Py_IDENTIFIER(elts); -static char *Set_fields[]={ +static const char * const Set_fields[]={ "elts", }; -static PyTypeObject *ListComp_type; -_Py_IDENTIFIER(elt); -_Py_IDENTIFIER(generators); -static char *ListComp_fields[]={ +static const char * const ListComp_fields[]={ "elt", "generators", }; -static PyTypeObject *SetComp_type; -static char *SetComp_fields[]={ +static const char * const SetComp_fields[]={ "elt", "generators", }; -static PyTypeObject *DictComp_type; -_Py_IDENTIFIER(key); -static char *DictComp_fields[]={ +static const char * const DictComp_fields[]={ "key", "value", "generators", }; -static PyTypeObject *GeneratorExp_type; -static char *GeneratorExp_fields[]={ +static const char * const GeneratorExp_fields[]={ "elt", "generators", }; -static PyTypeObject *Await_type; -static char *Await_fields[]={ +static const char * const Await_fields[]={ "value", }; -static PyTypeObject *Yield_type; -static char *Yield_fields[]={ +static const char * const Yield_fields[]={ "value", }; -static PyTypeObject *YieldFrom_type; -static char *YieldFrom_fields[]={ +static const char * const YieldFrom_fields[]={ "value", }; -static PyTypeObject *Compare_type; -_Py_IDENTIFIER(ops); -_Py_IDENTIFIER(comparators); -static char *Compare_fields[]={ +static const char * const Compare_fields[]={ "left", "ops", "comparators", }; -static PyTypeObject *Call_type; -_Py_IDENTIFIER(func); -static char *Call_fields[]={ +static const char * const Call_fields[]={ "func", "args", "keywords", }; -static PyTypeObject *FormattedValue_type; -_Py_IDENTIFIER(conversion); -_Py_IDENTIFIER(format_spec); -static char *FormattedValue_fields[]={ +static const char * const FormattedValue_fields[]={ "value", "conversion", "format_spec", }; -static PyTypeObject *JoinedStr_type; -static char *JoinedStr_fields[]={ +static const char * const JoinedStr_fields[]={ "values", }; -static PyTypeObject *Constant_type; -_Py_IDENTIFIER(kind); -static char *Constant_fields[]={ +static const char * const Constant_fields[]={ "value", "kind", }; -static PyTypeObject *Attribute_type; -_Py_IDENTIFIER(attr); -_Py_IDENTIFIER(ctx); -static char *Attribute_fields[]={ +static const char * const Attribute_fields[]={ "value", "attr", "ctx", }; -static PyTypeObject *Subscript_type; -_Py_IDENTIFIER(slice); -static char *Subscript_fields[]={ +static const char * const Subscript_fields[]={ "value", "slice", "ctx", }; -static PyTypeObject *Starred_type; -static char *Starred_fields[]={ +static const char * const Starred_fields[]={ "value", "ctx", }; -static PyTypeObject *Name_type; -_Py_IDENTIFIER(id); -static char *Name_fields[]={ +static const char * const Name_fields[]={ "id", "ctx", }; -static PyTypeObject *List_type; -static char *List_fields[]={ +static const char * const List_fields[]={ "elts", "ctx", }; -static PyTypeObject *Tuple_type; -static char *Tuple_fields[]={ +static const char * const Tuple_fields[]={ "elts", "ctx", }; -static PyTypeObject *expr_context_type; -static PyObject *Load_singleton, *Store_singleton, *Del_singleton, -*AugLoad_singleton, *AugStore_singleton, *Param_singleton; -static PyObject* ast2obj_expr_context(expr_context_ty); -static PyTypeObject *Load_type; -static PyTypeObject *Store_type; -static PyTypeObject *Del_type; -static PyTypeObject *AugLoad_type; -static PyTypeObject *AugStore_type; -static PyTypeObject *Param_type; -static PyTypeObject *slice_type; -static PyObject* ast2obj_slice(void*); -static PyTypeObject *Slice_type; -_Py_IDENTIFIER(lower); -_Py_IDENTIFIER(upper); -_Py_IDENTIFIER(step); -static char *Slice_fields[]={ +static const char * const Slice_fields[]={ "lower", "upper", "step", }; -static PyTypeObject *ExtSlice_type; -_Py_IDENTIFIER(dims); -static char *ExtSlice_fields[]={ - "dims", -}; -static PyTypeObject *Index_type; -static char *Index_fields[]={ - "value", -}; -static PyTypeObject *boolop_type; -static PyObject *And_singleton, *Or_singleton; -static PyObject* ast2obj_boolop(boolop_ty); -static PyTypeObject *And_type; -static PyTypeObject *Or_type; -static PyTypeObject *operator_type; -static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton, -*MatMult_singleton, *Div_singleton, *Mod_singleton, *Pow_singleton, -*LShift_singleton, *RShift_singleton, *BitOr_singleton, *BitXor_singleton, -*BitAnd_singleton, *FloorDiv_singleton; -static PyObject* ast2obj_operator(operator_ty); -static PyTypeObject *Add_type; -static PyTypeObject *Sub_type; -static PyTypeObject *Mult_type; -static PyTypeObject *MatMult_type; -static PyTypeObject *Div_type; -static PyTypeObject *Mod_type; -static PyTypeObject *Pow_type; -static PyTypeObject *LShift_type; -static PyTypeObject *RShift_type; -static PyTypeObject *BitOr_type; -static PyTypeObject *BitXor_type; -static PyTypeObject *BitAnd_type; -static PyTypeObject *FloorDiv_type; -static PyTypeObject *unaryop_type; -static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton, -*USub_singleton; -static PyObject* ast2obj_unaryop(unaryop_ty); -static PyTypeObject *Invert_type; -static PyTypeObject *Not_type; -static PyTypeObject *UAdd_type; -static PyTypeObject *USub_type; -static PyTypeObject *cmpop_type; -static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton, -*Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton, -*NotIn_singleton; -static PyObject* ast2obj_cmpop(cmpop_ty); -static PyTypeObject *Eq_type; -static PyTypeObject *NotEq_type; -static PyTypeObject *Lt_type; -static PyTypeObject *LtE_type; -static PyTypeObject *Gt_type; -static PyTypeObject *GtE_type; -static PyTypeObject *Is_type; -static PyTypeObject *IsNot_type; -static PyTypeObject *In_type; -static PyTypeObject *NotIn_type; -static PyTypeObject *comprehension_type; -static PyObject* ast2obj_comprehension(void*); -_Py_IDENTIFIER(ifs); -_Py_IDENTIFIER(is_async); -static char *comprehension_fields[]={ +static PyObject* ast2obj_expr_context(astmodulestate *state, expr_context_ty); +static PyObject* ast2obj_boolop(astmodulestate *state, boolop_ty); +static PyObject* ast2obj_operator(astmodulestate *state, operator_ty); +static PyObject* ast2obj_unaryop(astmodulestate *state, unaryop_ty); +static PyObject* ast2obj_cmpop(astmodulestate *state, cmpop_ty); +static PyObject* ast2obj_comprehension(astmodulestate *state, void*); +static const char * const comprehension_fields[]={ "target", "iter", "ifs", "is_async", }; -static PyTypeObject *excepthandler_type; -static char *excepthandler_attributes[] = { +static const char * const excepthandler_attributes[] = { "lineno", "col_offset", "end_lineno", "end_col_offset", }; -static PyObject* ast2obj_excepthandler(void*); -static PyTypeObject *ExceptHandler_type; -_Py_IDENTIFIER(type); -static char *ExceptHandler_fields[]={ +static PyObject* ast2obj_excepthandler(astmodulestate *state, void*); +static const char * const ExceptHandler_fields[]={ "type", "name", "body", }; -static PyTypeObject *arguments_type; -static PyObject* ast2obj_arguments(void*); -_Py_IDENTIFIER(posonlyargs); -_Py_IDENTIFIER(vararg); -_Py_IDENTIFIER(kwonlyargs); -_Py_IDENTIFIER(kw_defaults); -_Py_IDENTIFIER(kwarg); -_Py_IDENTIFIER(defaults); -static char *arguments_fields[]={ +static PyObject* ast2obj_arguments(astmodulestate *state, void*); +static const char * const arguments_fields[]={ "posonlyargs", "args", "vararg", @@ -484,53 +834,46 @@ static char *arguments_fields[]={ "kwarg", "defaults", }; -static PyTypeObject *arg_type; -static PyObject* ast2obj_arg(void*); -static char *arg_attributes[] = { +static PyObject* ast2obj_arg(astmodulestate *state, void*); +static const char * const arg_attributes[] = { "lineno", "col_offset", "end_lineno", "end_col_offset", }; -_Py_IDENTIFIER(arg); -static char *arg_fields[]={ +static const char * const arg_fields[]={ "arg", "annotation", "type_comment", }; -static PyTypeObject *keyword_type; -static PyObject* ast2obj_keyword(void*); -static char *keyword_fields[]={ +static PyObject* ast2obj_keyword(astmodulestate *state, void*); +static const char * const keyword_attributes[] = { + "lineno", + "col_offset", + "end_lineno", + "end_col_offset", +}; +static const char * const keyword_fields[]={ "arg", "value", }; -static PyTypeObject *alias_type; -static PyObject* ast2obj_alias(void*); -_Py_IDENTIFIER(asname); -static char *alias_fields[]={ +static PyObject* ast2obj_alias(astmodulestate *state, void*); +static const char * const alias_fields[]={ "name", "asname", }; -static PyTypeObject *withitem_type; -static PyObject* ast2obj_withitem(void*); -_Py_IDENTIFIER(context_expr); -_Py_IDENTIFIER(optional_vars); -static char *withitem_fields[]={ +static PyObject* ast2obj_withitem(astmodulestate *state, void*); +static const char * const withitem_fields[]={ "context_expr", "optional_vars", }; -static PyTypeObject *type_ignore_type; -static PyObject* ast2obj_type_ignore(void*); -static PyTypeObject *TypeIgnore_type; -_Py_IDENTIFIER(tag); -static char *TypeIgnore_fields[]={ +static PyObject* ast2obj_type_ignore(astmodulestate *state, void*); +static const char * const TypeIgnore_fields[]={ "lineno", "tag", }; -_Py_IDENTIFIER(_fields); -_Py_IDENTIFIER(_attributes); typedef struct { PyObject_HEAD @@ -541,14 +884,19 @@ static void ast_dealloc(AST_object *self) { /* bpo-31095: UnTrack is needed before calling any callbacks */ + PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_CLEAR(self->dict); - Py_TYPE(self)->tp_free(self); + freefunc free_func = PyType_GetSlot(tp, Py_tp_free); + assert(free_func != NULL); + free_func(self); + Py_DECREF(tp); } static int ast_traverse(AST_object *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(self->dict); return 0; } @@ -563,10 +911,15 @@ ast_clear(AST_object *self) static int ast_type_init(PyObject *self, PyObject *args, PyObject *kw) { + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { + return -1; + } + Py_ssize_t i, numfields = 0; int res = -1; PyObject *key, *value, *fields; - if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) { + if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) { goto cleanup; } if (fields) { @@ -580,7 +933,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) if (numfields < PyTuple_GET_SIZE(args)) { PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most " "%zd positional argument%s", - Py_TYPE(self)->tp_name, + _PyType_Name(Py_TYPE(self)), numfields, numfields == 1 ? "" : "s"); res = -1; goto cleanup; @@ -634,9 +987,13 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) static PyObject * ast_type_reduce(PyObject *self, PyObject *unused) { - _Py_IDENTIFIER(__dict__); + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { + return NULL; + } + PyObject *dict; - if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) { + if (_PyObject_LookupAttr(self, state->__dict__, &dict) < 0) { return NULL; } if (dict) { @@ -645,6 +1002,11 @@ ast_type_reduce(PyObject *self, PyObject *unused) return Py_BuildValue("O()", Py_TYPE(self)); } +static PyMemberDef ast_type_members[] = { + {"__dictoffset__", T_PYSSIZET, offsetof(AST_object, dict), READONLY}, + {NULL} /* Sentinel */ +}; + static PyMethodDef ast_type_methods[] = { {"__reduce__", ast_type_reduce, METH_NOARGS, NULL}, {NULL} @@ -655,96 +1017,79 @@ static PyGetSetDef ast_type_getsets[] = { {NULL} }; -static PyTypeObject AST_type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "_ast.AST", +static PyType_Slot AST_type_slots[] = { + {Py_tp_dealloc, ast_dealloc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_setattro, PyObject_GenericSetAttr}, + {Py_tp_traverse, ast_traverse}, + {Py_tp_clear, ast_clear}, + {Py_tp_members, ast_type_members}, + {Py_tp_methods, ast_type_methods}, + {Py_tp_getset, ast_type_getsets}, + {Py_tp_init, ast_type_init}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_free, PyObject_GC_Del}, + {0, 0}, +}; + +static PyType_Spec AST_type_spec = { + "ast.AST", sizeof(AST_object), 0, - (destructor)ast_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - 0, /* tp_doc */ - (traverseproc)ast_traverse, /* tp_traverse */ - (inquiry)ast_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - ast_type_methods, /* tp_methods */ - 0, /* tp_members */ - ast_type_getsets, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - offsetof(AST_object, dict),/* tp_dictoffset */ - (initproc)ast_type_init, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ - PyObject_GC_Del, /* tp_free */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + AST_type_slots }; - -static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields) +static PyObject * +make_type(astmodulestate *state, const char *type, PyObject* base, + const char* const* fields, int num_fields, const char *doc) { - _Py_IDENTIFIER(__module__); - _Py_IDENTIFIER(_ast); PyObject *fnames, *result; int i; fnames = PyTuple_New(num_fields); if (!fnames) return NULL; for (i = 0; i < num_fields; i++) { - PyObject *field = PyUnicode_FromString(fields[i]); + PyObject *field = PyUnicode_InternFromString(fields[i]); if (!field) { Py_DECREF(fnames); return NULL; } PyTuple_SET_ITEM(fnames, i, field); } - result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}", + result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOOOs}", type, base, - _PyUnicode_FromId(&PyId__fields), fnames, - _PyUnicode_FromId(&PyId___module__), - _PyUnicode_FromId(&PyId__ast)); + state->_fields, fnames, + state->__module__, + state->ast, + state->__doc__, doc); Py_DECREF(fnames); - return (PyTypeObject*)result; + return result; } -static int add_attributes(PyTypeObject* type, char**attrs, int num_fields) +static int +add_attributes(astmodulestate *state, PyObject *type, const char * const *attrs, int num_fields) { int i, result; PyObject *s, *l = PyTuple_New(num_fields); if (!l) return 0; for (i = 0; i < num_fields; i++) { - s = PyUnicode_FromString(attrs[i]); + s = PyUnicode_InternFromString(attrs[i]); if (!s) { Py_DECREF(l); return 0; } PyTuple_SET_ITEM(l, i, s); } - result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0; + result = PyObject_SetAttr(type, state->_attributes, l) >= 0; Py_DECREF(l); return result; } /* Conversion AST -> Python */ -static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*)) +static PyObject* ast2obj_list(astmodulestate *state, asdl_seq *seq, PyObject* (*func)(astmodulestate *state, void*)) { Py_ssize_t i, n = asdl_seq_LEN(seq); PyObject *result = PyList_New(n); @@ -752,7 +1097,7 @@ static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*)) if (!result) return NULL; for (i = 0; i < n; i++) { - value = func(asdl_seq_GET(seq, i)); + value = func(state, asdl_seq_GET(seq, i)); if (!value) { Py_DECREF(result); return NULL; @@ -762,27 +1107,25 @@ static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*)) return result; } -static PyObject* ast2obj_object(void *o) +static PyObject* ast2obj_object(astmodulestate *Py_UNUSED(state), void *o) { if (!o) o = Py_None; Py_INCREF((PyObject*)o); return (PyObject*)o; } -#define ast2obj_singleton ast2obj_object #define ast2obj_constant ast2obj_object #define ast2obj_identifier ast2obj_object #define ast2obj_string ast2obj_object -#define ast2obj_bytes ast2obj_object -static PyObject* ast2obj_int(long b) +static PyObject* ast2obj_int(astmodulestate *Py_UNUSED(state), long b) { return PyLong_FromLong(b); } /* Conversion Python -> AST */ -static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_object(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (obj == Py_None) obj = NULL; @@ -797,7 +1140,7 @@ static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena) return 0; } -static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_constant(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (PyArena_AddPyObject(arena, obj) < 0) { *out = NULL; @@ -808,25 +1151,25 @@ static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena) return 0; } -static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_identifier(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && obj != Py_None) { PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str"); return 1; } - return obj2ast_object(obj, out, arena); + return obj2ast_object(state, obj, out, arena); } -static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_string(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) { PyErr_SetString(PyExc_TypeError, "AST string must be of type str"); return 1; } - return obj2ast_object(obj, out, arena); + return obj2ast_object(state, obj, out, arena); } -static int obj2ast_int(PyObject* obj, int* out, PyArena* arena) +static int obj2ast_int(astmodulestate* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena) { int i; if (!PyLong_Check(obj)) { @@ -841,16 +1184,13 @@ static int obj2ast_int(PyObject* obj, int* out, PyArena* arena) return 0; } -static int add_ast_fields(void) +static int add_ast_fields(astmodulestate *state) { - PyObject *empty_tuple, *d; - if (PyType_Ready(&AST_type) < 0) - return -1; - d = AST_type.tp_dict; + PyObject *empty_tuple; empty_tuple = PyTuple_New(0); if (!empty_tuple || - _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 || - _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) { + PyObject_SetAttrString(state->AST_type, "_fields", empty_tuple) < 0 || + PyObject_SetAttrString(state->AST_type, "_attributes", empty_tuple) < 0) { Py_XDECREF(empty_tuple); return -1; } @@ -859,359 +1199,717 @@ static int add_ast_fields(void) } -static int init_types(void) +static int init_types(astmodulestate *state) { - static int initialized; - if (initialized) return 1; - if (add_ast_fields() < 0) return 0; - mod_type = make_type("mod", &AST_type, NULL, 0); - if (!mod_type) return 0; - if (!add_attributes(mod_type, NULL, 0)) return 0; - Module_type = make_type("Module", mod_type, Module_fields, 2); - if (!Module_type) return 0; - Interactive_type = make_type("Interactive", mod_type, Interactive_fields, - 1); - if (!Interactive_type) return 0; - Expression_type = make_type("Expression", mod_type, Expression_fields, 1); - if (!Expression_type) return 0; - FunctionType_type = make_type("FunctionType", mod_type, - FunctionType_fields, 2); - if (!FunctionType_type) return 0; - Suite_type = make_type("Suite", mod_type, Suite_fields, 1); - if (!Suite_type) return 0; - stmt_type = make_type("stmt", &AST_type, NULL, 0); - if (!stmt_type) return 0; - if (!add_attributes(stmt_type, stmt_attributes, 4)) return 0; - FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields, - 6); - if (!FunctionDef_type) return 0; - AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type, - AsyncFunctionDef_fields, 6); - if (!AsyncFunctionDef_type) return 0; - ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 5); - if (!ClassDef_type) return 0; - Return_type = make_type("Return", stmt_type, Return_fields, 1); - if (!Return_type) return 0; - Delete_type = make_type("Delete", stmt_type, Delete_fields, 1); - if (!Delete_type) return 0; - Assign_type = make_type("Assign", stmt_type, Assign_fields, 3); - if (!Assign_type) return 0; - AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3); - if (!AugAssign_type) return 0; - AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4); - if (!AnnAssign_type) return 0; - For_type = make_type("For", stmt_type, For_fields, 5); - if (!For_type) return 0; - AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 5); - if (!AsyncFor_type) return 0; - While_type = make_type("While", stmt_type, While_fields, 3); - if (!While_type) return 0; - If_type = make_type("If", stmt_type, If_fields, 3); - if (!If_type) return 0; - With_type = make_type("With", stmt_type, With_fields, 3); - if (!With_type) return 0; - AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 3); - if (!AsyncWith_type) return 0; - Raise_type = make_type("Raise", stmt_type, Raise_fields, 2); - if (!Raise_type) return 0; - Try_type = make_type("Try", stmt_type, Try_fields, 4); - if (!Try_type) return 0; - Assert_type = make_type("Assert", stmt_type, Assert_fields, 2); - if (!Assert_type) return 0; - Import_type = make_type("Import", stmt_type, Import_fields, 1); - if (!Import_type) return 0; - ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3); - if (!ImportFrom_type) return 0; - Global_type = make_type("Global", stmt_type, Global_fields, 1); - if (!Global_type) return 0; - Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1); - if (!Nonlocal_type) return 0; - Expr_type = make_type("Expr", stmt_type, Expr_fields, 1); - if (!Expr_type) return 0; - Pass_type = make_type("Pass", stmt_type, NULL, 0); - if (!Pass_type) return 0; - Break_type = make_type("Break", stmt_type, NULL, 0); - if (!Break_type) return 0; - Continue_type = make_type("Continue", stmt_type, NULL, 0); - if (!Continue_type) return 0; - expr_type = make_type("expr", &AST_type, NULL, 0); - if (!expr_type) return 0; - if (!add_attributes(expr_type, expr_attributes, 4)) return 0; - BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2); - if (!BoolOp_type) return 0; - NamedExpr_type = make_type("NamedExpr", expr_type, NamedExpr_fields, 2); - if (!NamedExpr_type) return 0; - BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3); - if (!BinOp_type) return 0; - UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2); - if (!UnaryOp_type) return 0; - Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2); - if (!Lambda_type) return 0; - IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3); - if (!IfExp_type) return 0; - Dict_type = make_type("Dict", expr_type, Dict_fields, 2); - if (!Dict_type) return 0; - Set_type = make_type("Set", expr_type, Set_fields, 1); - if (!Set_type) return 0; - ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2); - if (!ListComp_type) return 0; - SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2); - if (!SetComp_type) return 0; - DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3); - if (!DictComp_type) return 0; - GeneratorExp_type = make_type("GeneratorExp", expr_type, - GeneratorExp_fields, 2); - if (!GeneratorExp_type) return 0; - Await_type = make_type("Await", expr_type, Await_fields, 1); - if (!Await_type) return 0; - Yield_type = make_type("Yield", expr_type, Yield_fields, 1); - if (!Yield_type) return 0; - YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1); - if (!YieldFrom_type) return 0; - Compare_type = make_type("Compare", expr_type, Compare_fields, 3); - if (!Compare_type) return 0; - Call_type = make_type("Call", expr_type, Call_fields, 3); - if (!Call_type) return 0; - FormattedValue_type = make_type("FormattedValue", expr_type, - FormattedValue_fields, 3); - if (!FormattedValue_type) return 0; - JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1); - if (!JoinedStr_type) return 0; - Constant_type = make_type("Constant", expr_type, Constant_fields, 2); - if (!Constant_type) return 0; - Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3); - if (!Attribute_type) return 0; - Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3); - if (!Subscript_type) return 0; - Starred_type = make_type("Starred", expr_type, Starred_fields, 2); - if (!Starred_type) return 0; - Name_type = make_type("Name", expr_type, Name_fields, 2); - if (!Name_type) return 0; - List_type = make_type("List", expr_type, List_fields, 2); - if (!List_type) return 0; - Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2); - if (!Tuple_type) return 0; - expr_context_type = make_type("expr_context", &AST_type, NULL, 0); - if (!expr_context_type) return 0; - if (!add_attributes(expr_context_type, NULL, 0)) return 0; - Load_type = make_type("Load", expr_context_type, NULL, 0); - if (!Load_type) return 0; - Load_singleton = PyType_GenericNew(Load_type, NULL, NULL); - if (!Load_singleton) return 0; - Store_type = make_type("Store", expr_context_type, NULL, 0); - if (!Store_type) return 0; - Store_singleton = PyType_GenericNew(Store_type, NULL, NULL); - if (!Store_singleton) return 0; - Del_type = make_type("Del", expr_context_type, NULL, 0); - if (!Del_type) return 0; - Del_singleton = PyType_GenericNew(Del_type, NULL, NULL); - if (!Del_singleton) return 0; - AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0); - if (!AugLoad_type) return 0; - AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL); - if (!AugLoad_singleton) return 0; - AugStore_type = make_type("AugStore", expr_context_type, NULL, 0); - if (!AugStore_type) return 0; - AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL); - if (!AugStore_singleton) return 0; - Param_type = make_type("Param", expr_context_type, NULL, 0); - if (!Param_type) return 0; - Param_singleton = PyType_GenericNew(Param_type, NULL, NULL); - if (!Param_singleton) return 0; - slice_type = make_type("slice", &AST_type, NULL, 0); - if (!slice_type) return 0; - if (!add_attributes(slice_type, NULL, 0)) return 0; - Slice_type = make_type("Slice", slice_type, Slice_fields, 3); - if (!Slice_type) return 0; - ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1); - if (!ExtSlice_type) return 0; - Index_type = make_type("Index", slice_type, Index_fields, 1); - if (!Index_type) return 0; - boolop_type = make_type("boolop", &AST_type, NULL, 0); - if (!boolop_type) return 0; - if (!add_attributes(boolop_type, NULL, 0)) return 0; - And_type = make_type("And", boolop_type, NULL, 0); - if (!And_type) return 0; - And_singleton = PyType_GenericNew(And_type, NULL, NULL); - if (!And_singleton) return 0; - Or_type = make_type("Or", boolop_type, NULL, 0); - if (!Or_type) return 0; - Or_singleton = PyType_GenericNew(Or_type, NULL, NULL); - if (!Or_singleton) return 0; - operator_type = make_type("operator", &AST_type, NULL, 0); - if (!operator_type) return 0; - if (!add_attributes(operator_type, NULL, 0)) return 0; - Add_type = make_type("Add", operator_type, NULL, 0); - if (!Add_type) return 0; - Add_singleton = PyType_GenericNew(Add_type, NULL, NULL); - if (!Add_singleton) return 0; - Sub_type = make_type("Sub", operator_type, NULL, 0); - if (!Sub_type) return 0; - Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL); - if (!Sub_singleton) return 0; - Mult_type = make_type("Mult", operator_type, NULL, 0); - if (!Mult_type) return 0; - Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL); - if (!Mult_singleton) return 0; - MatMult_type = make_type("MatMult", operator_type, NULL, 0); - if (!MatMult_type) return 0; - MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL); - if (!MatMult_singleton) return 0; - Div_type = make_type("Div", operator_type, NULL, 0); - if (!Div_type) return 0; - Div_singleton = PyType_GenericNew(Div_type, NULL, NULL); - if (!Div_singleton) return 0; - Mod_type = make_type("Mod", operator_type, NULL, 0); - if (!Mod_type) return 0; - Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL); - if (!Mod_singleton) return 0; - Pow_type = make_type("Pow", operator_type, NULL, 0); - if (!Pow_type) return 0; - Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL); - if (!Pow_singleton) return 0; - LShift_type = make_type("LShift", operator_type, NULL, 0); - if (!LShift_type) return 0; - LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL); - if (!LShift_singleton) return 0; - RShift_type = make_type("RShift", operator_type, NULL, 0); - if (!RShift_type) return 0; - RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL); - if (!RShift_singleton) return 0; - BitOr_type = make_type("BitOr", operator_type, NULL, 0); - if (!BitOr_type) return 0; - BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL); - if (!BitOr_singleton) return 0; - BitXor_type = make_type("BitXor", operator_type, NULL, 0); - if (!BitXor_type) return 0; - BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL); - if (!BitXor_singleton) return 0; - BitAnd_type = make_type("BitAnd", operator_type, NULL, 0); - if (!BitAnd_type) return 0; - BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL); - if (!BitAnd_singleton) return 0; - FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0); - if (!FloorDiv_type) return 0; - FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL); - if (!FloorDiv_singleton) return 0; - unaryop_type = make_type("unaryop", &AST_type, NULL, 0); - if (!unaryop_type) return 0; - if (!add_attributes(unaryop_type, NULL, 0)) return 0; - Invert_type = make_type("Invert", unaryop_type, NULL, 0); - if (!Invert_type) return 0; - Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL); - if (!Invert_singleton) return 0; - Not_type = make_type("Not", unaryop_type, NULL, 0); - if (!Not_type) return 0; - Not_singleton = PyType_GenericNew(Not_type, NULL, NULL); - if (!Not_singleton) return 0; - UAdd_type = make_type("UAdd", unaryop_type, NULL, 0); - if (!UAdd_type) return 0; - UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL); - if (!UAdd_singleton) return 0; - USub_type = make_type("USub", unaryop_type, NULL, 0); - if (!USub_type) return 0; - USub_singleton = PyType_GenericNew(USub_type, NULL, NULL); - if (!USub_singleton) return 0; - cmpop_type = make_type("cmpop", &AST_type, NULL, 0); - if (!cmpop_type) return 0; - if (!add_attributes(cmpop_type, NULL, 0)) return 0; - Eq_type = make_type("Eq", cmpop_type, NULL, 0); - if (!Eq_type) return 0; - Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL); - if (!Eq_singleton) return 0; - NotEq_type = make_type("NotEq", cmpop_type, NULL, 0); - if (!NotEq_type) return 0; - NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL); - if (!NotEq_singleton) return 0; - Lt_type = make_type("Lt", cmpop_type, NULL, 0); - if (!Lt_type) return 0; - Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL); - if (!Lt_singleton) return 0; - LtE_type = make_type("LtE", cmpop_type, NULL, 0); - if (!LtE_type) return 0; - LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL); - if (!LtE_singleton) return 0; - Gt_type = make_type("Gt", cmpop_type, NULL, 0); - if (!Gt_type) return 0; - Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL); - if (!Gt_singleton) return 0; - GtE_type = make_type("GtE", cmpop_type, NULL, 0); - if (!GtE_type) return 0; - GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL); - if (!GtE_singleton) return 0; - Is_type = make_type("Is", cmpop_type, NULL, 0); - if (!Is_type) return 0; - Is_singleton = PyType_GenericNew(Is_type, NULL, NULL); - if (!Is_singleton) return 0; - IsNot_type = make_type("IsNot", cmpop_type, NULL, 0); - if (!IsNot_type) return 0; - IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL); - if (!IsNot_singleton) return 0; - In_type = make_type("In", cmpop_type, NULL, 0); - if (!In_type) return 0; - In_singleton = PyType_GenericNew(In_type, NULL, NULL); - if (!In_singleton) return 0; - NotIn_type = make_type("NotIn", cmpop_type, NULL, 0); - if (!NotIn_type) return 0; - NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL); - if (!NotIn_singleton) return 0; - comprehension_type = make_type("comprehension", &AST_type, - comprehension_fields, 4); - if (!comprehension_type) return 0; - if (!add_attributes(comprehension_type, NULL, 0)) return 0; - excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0); - if (!excepthandler_type) return 0; - if (!add_attributes(excepthandler_type, excepthandler_attributes, 4)) - return 0; - ExceptHandler_type = make_type("ExceptHandler", excepthandler_type, - ExceptHandler_fields, 3); - if (!ExceptHandler_type) return 0; - arguments_type = make_type("arguments", &AST_type, arguments_fields, 7); - if (!arguments_type) return 0; - if (!add_attributes(arguments_type, NULL, 0)) return 0; - arg_type = make_type("arg", &AST_type, arg_fields, 3); - if (!arg_type) return 0; - if (!add_attributes(arg_type, arg_attributes, 4)) return 0; - keyword_type = make_type("keyword", &AST_type, keyword_fields, 2); - if (!keyword_type) return 0; - if (!add_attributes(keyword_type, NULL, 0)) return 0; - alias_type = make_type("alias", &AST_type, alias_fields, 2); - if (!alias_type) return 0; - if (!add_attributes(alias_type, NULL, 0)) return 0; - withitem_type = make_type("withitem", &AST_type, withitem_fields, 2); - if (!withitem_type) return 0; - if (!add_attributes(withitem_type, NULL, 0)) return 0; - type_ignore_type = make_type("type_ignore", &AST_type, NULL, 0); - if (!type_ignore_type) return 0; - if (!add_attributes(type_ignore_type, NULL, 0)) return 0; - TypeIgnore_type = make_type("TypeIgnore", type_ignore_type, - TypeIgnore_fields, 2); - if (!TypeIgnore_type) return 0; - initialized = 1; + if (state->initialized) return 1; + if (init_identifiers(state) < 0) return 0; + state->AST_type = PyType_FromSpec(&AST_type_spec); + if (!state->AST_type) return 0; + if (add_ast_fields(state) < 0) return 0; + state->mod_type = make_type(state, "mod", state->AST_type, NULL, 0, + "mod = Module(stmt* body, type_ignore* type_ignores)\n" + " | Interactive(stmt* body)\n" + " | Expression(expr body)\n" + " | FunctionType(expr* argtypes, expr returns)"); + if (!state->mod_type) return 0; + if (!add_attributes(state, state->mod_type, NULL, 0)) return 0; + state->Module_type = make_type(state, "Module", state->mod_type, + Module_fields, 2, + "Module(stmt* body, type_ignore* type_ignores)"); + if (!state->Module_type) return 0; + state->Interactive_type = make_type(state, "Interactive", state->mod_type, + Interactive_fields, 1, + "Interactive(stmt* body)"); + if (!state->Interactive_type) return 0; + state->Expression_type = make_type(state, "Expression", state->mod_type, + Expression_fields, 1, + "Expression(expr body)"); + if (!state->Expression_type) return 0; + state->FunctionType_type = make_type(state, "FunctionType", + state->mod_type, FunctionType_fields, + 2, + "FunctionType(expr* argtypes, expr returns)"); + if (!state->FunctionType_type) return 0; + state->stmt_type = make_type(state, "stmt", state->AST_type, NULL, 0, + "stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n" + " | AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n" + " | ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)\n" + " | Return(expr? value)\n" + " | Delete(expr* targets)\n" + " | Assign(expr* targets, expr value, string? type_comment)\n" + " | AugAssign(expr target, operator op, expr value)\n" + " | AnnAssign(expr target, expr annotation, expr? value, int simple)\n" + " | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n" + " | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n" + " | While(expr test, stmt* body, stmt* orelse)\n" + " | If(expr test, stmt* body, stmt* orelse)\n" + " | With(withitem* items, stmt* body, string? type_comment)\n" + " | AsyncWith(withitem* items, stmt* body, string? type_comment)\n" + " | Raise(expr? exc, expr? cause)\n" + " | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)\n" + " | Assert(expr test, expr? msg)\n" + " | Import(alias* names)\n" + " | ImportFrom(identifier? module, alias* names, int? level)\n" + " | Global(identifier* names)\n" + " | Nonlocal(identifier* names)\n" + " | Expr(expr value)\n" + " | Pass\n" + " | Break\n" + " | Continue"); + if (!state->stmt_type) return 0; + if (!add_attributes(state, state->stmt_type, stmt_attributes, 4)) return 0; + if (PyObject_SetAttr(state->stmt_type, state->end_lineno, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->stmt_type, state->end_col_offset, Py_None) == + -1) + return 0; + state->FunctionDef_type = make_type(state, "FunctionDef", state->stmt_type, + FunctionDef_fields, 6, + "FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)"); + if (!state->FunctionDef_type) return 0; + if (PyObject_SetAttr(state->FunctionDef_type, state->returns, Py_None) == + -1) + return 0; + if (PyObject_SetAttr(state->FunctionDef_type, state->type_comment, Py_None) + == -1) + return 0; + state->AsyncFunctionDef_type = make_type(state, "AsyncFunctionDef", + state->stmt_type, + AsyncFunctionDef_fields, 6, + "AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)"); + if (!state->AsyncFunctionDef_type) return 0; + if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->returns, Py_None) + == -1) + return 0; + if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->type_comment, + Py_None) == -1) + return 0; + state->ClassDef_type = make_type(state, "ClassDef", state->stmt_type, + ClassDef_fields, 5, + "ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)"); + if (!state->ClassDef_type) return 0; + state->Return_type = make_type(state, "Return", state->stmt_type, + Return_fields, 1, + "Return(expr? value)"); + if (!state->Return_type) return 0; + if (PyObject_SetAttr(state->Return_type, state->value, Py_None) == -1) + return 0; + state->Delete_type = make_type(state, "Delete", state->stmt_type, + Delete_fields, 1, + "Delete(expr* targets)"); + if (!state->Delete_type) return 0; + state->Assign_type = make_type(state, "Assign", state->stmt_type, + Assign_fields, 3, + "Assign(expr* targets, expr value, string? type_comment)"); + if (!state->Assign_type) return 0; + if (PyObject_SetAttr(state->Assign_type, state->type_comment, Py_None) == + -1) + return 0; + state->AugAssign_type = make_type(state, "AugAssign", state->stmt_type, + AugAssign_fields, 3, + "AugAssign(expr target, operator op, expr value)"); + if (!state->AugAssign_type) return 0; + state->AnnAssign_type = make_type(state, "AnnAssign", state->stmt_type, + AnnAssign_fields, 4, + "AnnAssign(expr target, expr annotation, expr? value, int simple)"); + if (!state->AnnAssign_type) return 0; + if (PyObject_SetAttr(state->AnnAssign_type, state->value, Py_None) == -1) + return 0; + state->For_type = make_type(state, "For", state->stmt_type, For_fields, 5, + "For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)"); + if (!state->For_type) return 0; + if (PyObject_SetAttr(state->For_type, state->type_comment, Py_None) == -1) + return 0; + state->AsyncFor_type = make_type(state, "AsyncFor", state->stmt_type, + AsyncFor_fields, 5, + "AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)"); + if (!state->AsyncFor_type) return 0; + if (PyObject_SetAttr(state->AsyncFor_type, state->type_comment, Py_None) == + -1) + return 0; + state->While_type = make_type(state, "While", state->stmt_type, + While_fields, 3, + "While(expr test, stmt* body, stmt* orelse)"); + if (!state->While_type) return 0; + state->If_type = make_type(state, "If", state->stmt_type, If_fields, 3, + "If(expr test, stmt* body, stmt* orelse)"); + if (!state->If_type) return 0; + state->With_type = make_type(state, "With", state->stmt_type, With_fields, + 3, + "With(withitem* items, stmt* body, string? type_comment)"); + if (!state->With_type) return 0; + if (PyObject_SetAttr(state->With_type, state->type_comment, Py_None) == -1) + return 0; + state->AsyncWith_type = make_type(state, "AsyncWith", state->stmt_type, + AsyncWith_fields, 3, + "AsyncWith(withitem* items, stmt* body, string? type_comment)"); + if (!state->AsyncWith_type) return 0; + if (PyObject_SetAttr(state->AsyncWith_type, state->type_comment, Py_None) + == -1) + return 0; + state->Raise_type = make_type(state, "Raise", state->stmt_type, + Raise_fields, 2, + "Raise(expr? exc, expr? cause)"); + if (!state->Raise_type) return 0; + if (PyObject_SetAttr(state->Raise_type, state->exc, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->Raise_type, state->cause, Py_None) == -1) + return 0; + state->Try_type = make_type(state, "Try", state->stmt_type, Try_fields, 4, + "Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)"); + if (!state->Try_type) return 0; + state->Assert_type = make_type(state, "Assert", state->stmt_type, + Assert_fields, 2, + "Assert(expr test, expr? msg)"); + if (!state->Assert_type) return 0; + if (PyObject_SetAttr(state->Assert_type, state->msg, Py_None) == -1) + return 0; + state->Import_type = make_type(state, "Import", state->stmt_type, + Import_fields, 1, + "Import(alias* names)"); + if (!state->Import_type) return 0; + state->ImportFrom_type = make_type(state, "ImportFrom", state->stmt_type, + ImportFrom_fields, 3, + "ImportFrom(identifier? module, alias* names, int? level)"); + if (!state->ImportFrom_type) return 0; + if (PyObject_SetAttr(state->ImportFrom_type, state->module, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->ImportFrom_type, state->level, Py_None) == -1) + return 0; + state->Global_type = make_type(state, "Global", state->stmt_type, + Global_fields, 1, + "Global(identifier* names)"); + if (!state->Global_type) return 0; + state->Nonlocal_type = make_type(state, "Nonlocal", state->stmt_type, + Nonlocal_fields, 1, + "Nonlocal(identifier* names)"); + if (!state->Nonlocal_type) return 0; + state->Expr_type = make_type(state, "Expr", state->stmt_type, Expr_fields, + 1, + "Expr(expr value)"); + if (!state->Expr_type) return 0; + state->Pass_type = make_type(state, "Pass", state->stmt_type, NULL, 0, + "Pass"); + if (!state->Pass_type) return 0; + state->Break_type = make_type(state, "Break", state->stmt_type, NULL, 0, + "Break"); + if (!state->Break_type) return 0; + state->Continue_type = make_type(state, "Continue", state->stmt_type, NULL, + 0, + "Continue"); + if (!state->Continue_type) return 0; + state->expr_type = make_type(state, "expr", state->AST_type, NULL, 0, + "expr = BoolOp(boolop op, expr* values)\n" + " | NamedExpr(expr target, expr value)\n" + " | BinOp(expr left, operator op, expr right)\n" + " | UnaryOp(unaryop op, expr operand)\n" + " | Lambda(arguments args, expr body)\n" + " | IfExp(expr test, expr body, expr orelse)\n" + " | Dict(expr* keys, expr* values)\n" + " | Set(expr* elts)\n" + " | ListComp(expr elt, comprehension* generators)\n" + " | SetComp(expr elt, comprehension* generators)\n" + " | DictComp(expr key, expr value, comprehension* generators)\n" + " | GeneratorExp(expr elt, comprehension* generators)\n" + " | Await(expr value)\n" + " | Yield(expr? value)\n" + " | YieldFrom(expr value)\n" + " | Compare(expr left, cmpop* ops, expr* comparators)\n" + " | Call(expr func, expr* args, keyword* keywords)\n" + " | FormattedValue(expr value, int? conversion, expr? format_spec)\n" + " | JoinedStr(expr* values)\n" + " | Constant(constant value, string? kind)\n" + " | Attribute(expr value, identifier attr, expr_context ctx)\n" + " | Subscript(expr value, expr slice, expr_context ctx)\n" + " | Starred(expr value, expr_context ctx)\n" + " | Name(identifier id, expr_context ctx)\n" + " | List(expr* elts, expr_context ctx)\n" + " | Tuple(expr* elts, expr_context ctx)\n" + " | Slice(expr? lower, expr? upper, expr? step)"); + if (!state->expr_type) return 0; + if (!add_attributes(state, state->expr_type, expr_attributes, 4)) return 0; + if (PyObject_SetAttr(state->expr_type, state->end_lineno, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->expr_type, state->end_col_offset, Py_None) == + -1) + return 0; + state->BoolOp_type = make_type(state, "BoolOp", state->expr_type, + BoolOp_fields, 2, + "BoolOp(boolop op, expr* values)"); + if (!state->BoolOp_type) return 0; + state->NamedExpr_type = make_type(state, "NamedExpr", state->expr_type, + NamedExpr_fields, 2, + "NamedExpr(expr target, expr value)"); + if (!state->NamedExpr_type) return 0; + state->BinOp_type = make_type(state, "BinOp", state->expr_type, + BinOp_fields, 3, + "BinOp(expr left, operator op, expr right)"); + if (!state->BinOp_type) return 0; + state->UnaryOp_type = make_type(state, "UnaryOp", state->expr_type, + UnaryOp_fields, 2, + "UnaryOp(unaryop op, expr operand)"); + if (!state->UnaryOp_type) return 0; + state->Lambda_type = make_type(state, "Lambda", state->expr_type, + Lambda_fields, 2, + "Lambda(arguments args, expr body)"); + if (!state->Lambda_type) return 0; + state->IfExp_type = make_type(state, "IfExp", state->expr_type, + IfExp_fields, 3, + "IfExp(expr test, expr body, expr orelse)"); + if (!state->IfExp_type) return 0; + state->Dict_type = make_type(state, "Dict", state->expr_type, Dict_fields, + 2, + "Dict(expr* keys, expr* values)"); + if (!state->Dict_type) return 0; + state->Set_type = make_type(state, "Set", state->expr_type, Set_fields, 1, + "Set(expr* elts)"); + if (!state->Set_type) return 0; + state->ListComp_type = make_type(state, "ListComp", state->expr_type, + ListComp_fields, 2, + "ListComp(expr elt, comprehension* generators)"); + if (!state->ListComp_type) return 0; + state->SetComp_type = make_type(state, "SetComp", state->expr_type, + SetComp_fields, 2, + "SetComp(expr elt, comprehension* generators)"); + if (!state->SetComp_type) return 0; + state->DictComp_type = make_type(state, "DictComp", state->expr_type, + DictComp_fields, 3, + "DictComp(expr key, expr value, comprehension* generators)"); + if (!state->DictComp_type) return 0; + state->GeneratorExp_type = make_type(state, "GeneratorExp", + state->expr_type, GeneratorExp_fields, + 2, + "GeneratorExp(expr elt, comprehension* generators)"); + if (!state->GeneratorExp_type) return 0; + state->Await_type = make_type(state, "Await", state->expr_type, + Await_fields, 1, + "Await(expr value)"); + if (!state->Await_type) return 0; + state->Yield_type = make_type(state, "Yield", state->expr_type, + Yield_fields, 1, + "Yield(expr? value)"); + if (!state->Yield_type) return 0; + if (PyObject_SetAttr(state->Yield_type, state->value, Py_None) == -1) + return 0; + state->YieldFrom_type = make_type(state, "YieldFrom", state->expr_type, + YieldFrom_fields, 1, + "YieldFrom(expr value)"); + if (!state->YieldFrom_type) return 0; + state->Compare_type = make_type(state, "Compare", state->expr_type, + Compare_fields, 3, + "Compare(expr left, cmpop* ops, expr* comparators)"); + if (!state->Compare_type) return 0; + state->Call_type = make_type(state, "Call", state->expr_type, Call_fields, + 3, + "Call(expr func, expr* args, keyword* keywords)"); + if (!state->Call_type) return 0; + state->FormattedValue_type = make_type(state, "FormattedValue", + state->expr_type, + FormattedValue_fields, 3, + "FormattedValue(expr value, int? conversion, expr? format_spec)"); + if (!state->FormattedValue_type) return 0; + if (PyObject_SetAttr(state->FormattedValue_type, state->conversion, + Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->FormattedValue_type, state->format_spec, + Py_None) == -1) + return 0; + state->JoinedStr_type = make_type(state, "JoinedStr", state->expr_type, + JoinedStr_fields, 1, + "JoinedStr(expr* values)"); + if (!state->JoinedStr_type) return 0; + state->Constant_type = make_type(state, "Constant", state->expr_type, + Constant_fields, 2, + "Constant(constant value, string? kind)"); + if (!state->Constant_type) return 0; + if (PyObject_SetAttr(state->Constant_type, state->kind, Py_None) == -1) + return 0; + state->Attribute_type = make_type(state, "Attribute", state->expr_type, + Attribute_fields, 3, + "Attribute(expr value, identifier attr, expr_context ctx)"); + if (!state->Attribute_type) return 0; + state->Subscript_type = make_type(state, "Subscript", state->expr_type, + Subscript_fields, 3, + "Subscript(expr value, expr slice, expr_context ctx)"); + if (!state->Subscript_type) return 0; + state->Starred_type = make_type(state, "Starred", state->expr_type, + Starred_fields, 2, + "Starred(expr value, expr_context ctx)"); + if (!state->Starred_type) return 0; + state->Name_type = make_type(state, "Name", state->expr_type, Name_fields, + 2, + "Name(identifier id, expr_context ctx)"); + if (!state->Name_type) return 0; + state->List_type = make_type(state, "List", state->expr_type, List_fields, + 2, + "List(expr* elts, expr_context ctx)"); + if (!state->List_type) return 0; + state->Tuple_type = make_type(state, "Tuple", state->expr_type, + Tuple_fields, 2, + "Tuple(expr* elts, expr_context ctx)"); + if (!state->Tuple_type) return 0; + state->Slice_type = make_type(state, "Slice", state->expr_type, + Slice_fields, 3, + "Slice(expr? lower, expr? upper, expr? step)"); + if (!state->Slice_type) return 0; + if (PyObject_SetAttr(state->Slice_type, state->lower, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->Slice_type, state->upper, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->Slice_type, state->step, Py_None) == -1) + return 0; + state->expr_context_type = make_type(state, "expr_context", + state->AST_type, NULL, 0, + "expr_context = Load | Store | Del"); + if (!state->expr_context_type) return 0; + if (!add_attributes(state, state->expr_context_type, NULL, 0)) return 0; + state->Load_type = make_type(state, "Load", state->expr_context_type, NULL, + 0, + "Load"); + if (!state->Load_type) return 0; + state->Load_singleton = PyType_GenericNew((PyTypeObject *)state->Load_type, + NULL, NULL); + if (!state->Load_singleton) return 0; + state->Store_type = make_type(state, "Store", state->expr_context_type, + NULL, 0, + "Store"); + if (!state->Store_type) return 0; + state->Store_singleton = PyType_GenericNew((PyTypeObject + *)state->Store_type, NULL, NULL); + if (!state->Store_singleton) return 0; + state->Del_type = make_type(state, "Del", state->expr_context_type, NULL, 0, + "Del"); + if (!state->Del_type) return 0; + state->Del_singleton = PyType_GenericNew((PyTypeObject *)state->Del_type, + NULL, NULL); + if (!state->Del_singleton) return 0; + state->boolop_type = make_type(state, "boolop", state->AST_type, NULL, 0, + "boolop = And | Or"); + if (!state->boolop_type) return 0; + if (!add_attributes(state, state->boolop_type, NULL, 0)) return 0; + state->And_type = make_type(state, "And", state->boolop_type, NULL, 0, + "And"); + if (!state->And_type) return 0; + state->And_singleton = PyType_GenericNew((PyTypeObject *)state->And_type, + NULL, NULL); + if (!state->And_singleton) return 0; + state->Or_type = make_type(state, "Or", state->boolop_type, NULL, 0, + "Or"); + if (!state->Or_type) return 0; + state->Or_singleton = PyType_GenericNew((PyTypeObject *)state->Or_type, + NULL, NULL); + if (!state->Or_singleton) return 0; + state->operator_type = make_type(state, "operator", state->AST_type, NULL, + 0, + "operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift | RShift | BitOr | BitXor | BitAnd | FloorDiv"); + if (!state->operator_type) return 0; + if (!add_attributes(state, state->operator_type, NULL, 0)) return 0; + state->Add_type = make_type(state, "Add", state->operator_type, NULL, 0, + "Add"); + if (!state->Add_type) return 0; + state->Add_singleton = PyType_GenericNew((PyTypeObject *)state->Add_type, + NULL, NULL); + if (!state->Add_singleton) return 0; + state->Sub_type = make_type(state, "Sub", state->operator_type, NULL, 0, + "Sub"); + if (!state->Sub_type) return 0; + state->Sub_singleton = PyType_GenericNew((PyTypeObject *)state->Sub_type, + NULL, NULL); + if (!state->Sub_singleton) return 0; + state->Mult_type = make_type(state, "Mult", state->operator_type, NULL, 0, + "Mult"); + if (!state->Mult_type) return 0; + state->Mult_singleton = PyType_GenericNew((PyTypeObject *)state->Mult_type, + NULL, NULL); + if (!state->Mult_singleton) return 0; + state->MatMult_type = make_type(state, "MatMult", state->operator_type, + NULL, 0, + "MatMult"); + if (!state->MatMult_type) return 0; + state->MatMult_singleton = PyType_GenericNew((PyTypeObject + *)state->MatMult_type, NULL, + NULL); + if (!state->MatMult_singleton) return 0; + state->Div_type = make_type(state, "Div", state->operator_type, NULL, 0, + "Div"); + if (!state->Div_type) return 0; + state->Div_singleton = PyType_GenericNew((PyTypeObject *)state->Div_type, + NULL, NULL); + if (!state->Div_singleton) return 0; + state->Mod_type = make_type(state, "Mod", state->operator_type, NULL, 0, + "Mod"); + if (!state->Mod_type) return 0; + state->Mod_singleton = PyType_GenericNew((PyTypeObject *)state->Mod_type, + NULL, NULL); + if (!state->Mod_singleton) return 0; + state->Pow_type = make_type(state, "Pow", state->operator_type, NULL, 0, + "Pow"); + if (!state->Pow_type) return 0; + state->Pow_singleton = PyType_GenericNew((PyTypeObject *)state->Pow_type, + NULL, NULL); + if (!state->Pow_singleton) return 0; + state->LShift_type = make_type(state, "LShift", state->operator_type, NULL, + 0, + "LShift"); + if (!state->LShift_type) return 0; + state->LShift_singleton = PyType_GenericNew((PyTypeObject + *)state->LShift_type, NULL, + NULL); + if (!state->LShift_singleton) return 0; + state->RShift_type = make_type(state, "RShift", state->operator_type, NULL, + 0, + "RShift"); + if (!state->RShift_type) return 0; + state->RShift_singleton = PyType_GenericNew((PyTypeObject + *)state->RShift_type, NULL, + NULL); + if (!state->RShift_singleton) return 0; + state->BitOr_type = make_type(state, "BitOr", state->operator_type, NULL, 0, + "BitOr"); + if (!state->BitOr_type) return 0; + state->BitOr_singleton = PyType_GenericNew((PyTypeObject + *)state->BitOr_type, NULL, NULL); + if (!state->BitOr_singleton) return 0; + state->BitXor_type = make_type(state, "BitXor", state->operator_type, NULL, + 0, + "BitXor"); + if (!state->BitXor_type) return 0; + state->BitXor_singleton = PyType_GenericNew((PyTypeObject + *)state->BitXor_type, NULL, + NULL); + if (!state->BitXor_singleton) return 0; + state->BitAnd_type = make_type(state, "BitAnd", state->operator_type, NULL, + 0, + "BitAnd"); + if (!state->BitAnd_type) return 0; + state->BitAnd_singleton = PyType_GenericNew((PyTypeObject + *)state->BitAnd_type, NULL, + NULL); + if (!state->BitAnd_singleton) return 0; + state->FloorDiv_type = make_type(state, "FloorDiv", state->operator_type, + NULL, 0, + "FloorDiv"); + if (!state->FloorDiv_type) return 0; + state->FloorDiv_singleton = PyType_GenericNew((PyTypeObject + *)state->FloorDiv_type, NULL, + NULL); + if (!state->FloorDiv_singleton) return 0; + state->unaryop_type = make_type(state, "unaryop", state->AST_type, NULL, 0, + "unaryop = Invert | Not | UAdd | USub"); + if (!state->unaryop_type) return 0; + if (!add_attributes(state, state->unaryop_type, NULL, 0)) return 0; + state->Invert_type = make_type(state, "Invert", state->unaryop_type, NULL, + 0, + "Invert"); + if (!state->Invert_type) return 0; + state->Invert_singleton = PyType_GenericNew((PyTypeObject + *)state->Invert_type, NULL, + NULL); + if (!state->Invert_singleton) return 0; + state->Not_type = make_type(state, "Not", state->unaryop_type, NULL, 0, + "Not"); + if (!state->Not_type) return 0; + state->Not_singleton = PyType_GenericNew((PyTypeObject *)state->Not_type, + NULL, NULL); + if (!state->Not_singleton) return 0; + state->UAdd_type = make_type(state, "UAdd", state->unaryop_type, NULL, 0, + "UAdd"); + if (!state->UAdd_type) return 0; + state->UAdd_singleton = PyType_GenericNew((PyTypeObject *)state->UAdd_type, + NULL, NULL); + if (!state->UAdd_singleton) return 0; + state->USub_type = make_type(state, "USub", state->unaryop_type, NULL, 0, + "USub"); + if (!state->USub_type) return 0; + state->USub_singleton = PyType_GenericNew((PyTypeObject *)state->USub_type, + NULL, NULL); + if (!state->USub_singleton) return 0; + state->cmpop_type = make_type(state, "cmpop", state->AST_type, NULL, 0, + "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn"); + if (!state->cmpop_type) return 0; + if (!add_attributes(state, state->cmpop_type, NULL, 0)) return 0; + state->Eq_type = make_type(state, "Eq", state->cmpop_type, NULL, 0, + "Eq"); + if (!state->Eq_type) return 0; + state->Eq_singleton = PyType_GenericNew((PyTypeObject *)state->Eq_type, + NULL, NULL); + if (!state->Eq_singleton) return 0; + state->NotEq_type = make_type(state, "NotEq", state->cmpop_type, NULL, 0, + "NotEq"); + if (!state->NotEq_type) return 0; + state->NotEq_singleton = PyType_GenericNew((PyTypeObject + *)state->NotEq_type, NULL, NULL); + if (!state->NotEq_singleton) return 0; + state->Lt_type = make_type(state, "Lt", state->cmpop_type, NULL, 0, + "Lt"); + if (!state->Lt_type) return 0; + state->Lt_singleton = PyType_GenericNew((PyTypeObject *)state->Lt_type, + NULL, NULL); + if (!state->Lt_singleton) return 0; + state->LtE_type = make_type(state, "LtE", state->cmpop_type, NULL, 0, + "LtE"); + if (!state->LtE_type) return 0; + state->LtE_singleton = PyType_GenericNew((PyTypeObject *)state->LtE_type, + NULL, NULL); + if (!state->LtE_singleton) return 0; + state->Gt_type = make_type(state, "Gt", state->cmpop_type, NULL, 0, + "Gt"); + if (!state->Gt_type) return 0; + state->Gt_singleton = PyType_GenericNew((PyTypeObject *)state->Gt_type, + NULL, NULL); + if (!state->Gt_singleton) return 0; + state->GtE_type = make_type(state, "GtE", state->cmpop_type, NULL, 0, + "GtE"); + if (!state->GtE_type) return 0; + state->GtE_singleton = PyType_GenericNew((PyTypeObject *)state->GtE_type, + NULL, NULL); + if (!state->GtE_singleton) return 0; + state->Is_type = make_type(state, "Is", state->cmpop_type, NULL, 0, + "Is"); + if (!state->Is_type) return 0; + state->Is_singleton = PyType_GenericNew((PyTypeObject *)state->Is_type, + NULL, NULL); + if (!state->Is_singleton) return 0; + state->IsNot_type = make_type(state, "IsNot", state->cmpop_type, NULL, 0, + "IsNot"); + if (!state->IsNot_type) return 0; + state->IsNot_singleton = PyType_GenericNew((PyTypeObject + *)state->IsNot_type, NULL, NULL); + if (!state->IsNot_singleton) return 0; + state->In_type = make_type(state, "In", state->cmpop_type, NULL, 0, + "In"); + if (!state->In_type) return 0; + state->In_singleton = PyType_GenericNew((PyTypeObject *)state->In_type, + NULL, NULL); + if (!state->In_singleton) return 0; + state->NotIn_type = make_type(state, "NotIn", state->cmpop_type, NULL, 0, + "NotIn"); + if (!state->NotIn_type) return 0; + state->NotIn_singleton = PyType_GenericNew((PyTypeObject + *)state->NotIn_type, NULL, NULL); + if (!state->NotIn_singleton) return 0; + state->comprehension_type = make_type(state, "comprehension", + state->AST_type, + comprehension_fields, 4, + "comprehension(expr target, expr iter, expr* ifs, int is_async)"); + if (!state->comprehension_type) return 0; + if (!add_attributes(state, state->comprehension_type, NULL, 0)) return 0; + state->excepthandler_type = make_type(state, "excepthandler", + state->AST_type, NULL, 0, + "excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)"); + if (!state->excepthandler_type) return 0; + if (!add_attributes(state, state->excepthandler_type, + excepthandler_attributes, 4)) return 0; + if (PyObject_SetAttr(state->excepthandler_type, state->end_lineno, Py_None) + == -1) + return 0; + if (PyObject_SetAttr(state->excepthandler_type, state->end_col_offset, + Py_None) == -1) + return 0; + state->ExceptHandler_type = make_type(state, "ExceptHandler", + state->excepthandler_type, + ExceptHandler_fields, 3, + "ExceptHandler(expr? type, identifier? name, stmt* body)"); + if (!state->ExceptHandler_type) return 0; + if (PyObject_SetAttr(state->ExceptHandler_type, state->type, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->ExceptHandler_type, state->name, Py_None) == -1) + return 0; + state->arguments_type = make_type(state, "arguments", state->AST_type, + arguments_fields, 7, + "arguments(arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults, arg? kwarg, expr* defaults)"); + if (!state->arguments_type) return 0; + if (!add_attributes(state, state->arguments_type, NULL, 0)) return 0; + if (PyObject_SetAttr(state->arguments_type, state->vararg, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->arguments_type, state->kwarg, Py_None) == -1) + return 0; + state->arg_type = make_type(state, "arg", state->AST_type, arg_fields, 3, + "arg(identifier arg, expr? annotation, string? type_comment)"); + if (!state->arg_type) return 0; + if (!add_attributes(state, state->arg_type, arg_attributes, 4)) return 0; + if (PyObject_SetAttr(state->arg_type, state->annotation, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->arg_type, state->type_comment, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->arg_type, state->end_lineno, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->arg_type, state->end_col_offset, Py_None) == -1) + return 0; + state->keyword_type = make_type(state, "keyword", state->AST_type, + keyword_fields, 2, + "keyword(identifier? arg, expr value)"); + if (!state->keyword_type) return 0; + if (!add_attributes(state, state->keyword_type, keyword_attributes, 4)) + return 0; + if (PyObject_SetAttr(state->keyword_type, state->arg, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->keyword_type, state->end_lineno, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->keyword_type, state->end_col_offset, Py_None) + == -1) + return 0; + state->alias_type = make_type(state, "alias", state->AST_type, + alias_fields, 2, + "alias(identifier name, identifier? asname)"); + if (!state->alias_type) return 0; + if (!add_attributes(state, state->alias_type, NULL, 0)) return 0; + if (PyObject_SetAttr(state->alias_type, state->asname, Py_None) == -1) + return 0; + state->withitem_type = make_type(state, "withitem", state->AST_type, + withitem_fields, 2, + "withitem(expr context_expr, expr? optional_vars)"); + if (!state->withitem_type) return 0; + if (!add_attributes(state, state->withitem_type, NULL, 0)) return 0; + if (PyObject_SetAttr(state->withitem_type, state->optional_vars, Py_None) + == -1) + return 0; + state->type_ignore_type = make_type(state, "type_ignore", state->AST_type, + NULL, 0, + "type_ignore = TypeIgnore(int lineno, string tag)"); + if (!state->type_ignore_type) return 0; + if (!add_attributes(state, state->type_ignore_type, NULL, 0)) return 0; + state->TypeIgnore_type = make_type(state, "TypeIgnore", + state->type_ignore_type, + TypeIgnore_fields, 2, + "TypeIgnore(int lineno, string tag)"); + if (!state->TypeIgnore_type) return 0; + state->initialized = 1; return 1; } -static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena); -static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena); -static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena); -static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* - arena); -static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena); -static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena); -static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena); -static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena); -static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena); -static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* - arena); -static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* - arena); -static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena); -static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena); -static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena); -static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena); -static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena); -static int obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* - arena); +static int obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, + PyArena* arena); +static int obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, + PyArena* arena); +static int obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, + PyArena* arena); +static int obj2ast_expr_context(astmodulestate *state, PyObject* obj, + expr_context_ty* out, PyArena* arena); +static int obj2ast_boolop(astmodulestate *state, PyObject* obj, boolop_ty* out, + PyArena* arena); +static int obj2ast_operator(astmodulestate *state, PyObject* obj, operator_ty* + out, PyArena* arena); +static int obj2ast_unaryop(astmodulestate *state, PyObject* obj, unaryop_ty* + out, PyArena* arena); +static int obj2ast_cmpop(astmodulestate *state, PyObject* obj, cmpop_ty* out, + PyArena* arena); +static int obj2ast_comprehension(astmodulestate *state, PyObject* obj, + comprehension_ty* out, PyArena* arena); +static int obj2ast_excepthandler(astmodulestate *state, PyObject* obj, + excepthandler_ty* out, PyArena* arena); +static int obj2ast_arguments(astmodulestate *state, PyObject* obj, + arguments_ty* out, PyArena* arena); +static int obj2ast_arg(astmodulestate *state, PyObject* obj, arg_ty* out, + PyArena* arena); +static int obj2ast_keyword(astmodulestate *state, PyObject* obj, keyword_ty* + out, PyArena* arena); +static int obj2ast_alias(astmodulestate *state, PyObject* obj, alias_ty* out, + PyArena* arena); +static int obj2ast_withitem(astmodulestate *state, PyObject* obj, withitem_ty* + out, PyArena* arena); +static int obj2ast_type_ignore(astmodulestate *state, PyObject* obj, + type_ignore_ty* out, PyArena* arena); mod_ty Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena) @@ -1244,7 +1942,7 @@ Expression(expr_ty body, PyArena *arena) mod_ty p; if (!body) { PyErr_SetString(PyExc_ValueError, - "field body is required for Expression"); + "field 'body' is required for Expression"); return NULL; } p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1261,7 +1959,7 @@ FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena) mod_ty p; if (!returns) { PyErr_SetString(PyExc_ValueError, - "field returns is required for FunctionType"); + "field 'returns' is required for FunctionType"); return NULL; } p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1273,18 +1971,6 @@ FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena) return p; } -mod_ty -Suite(asdl_seq * body, PyArena *arena) -{ - mod_ty p; - p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); - if (!p) - return NULL; - p->kind = Suite_kind; - p->v.Suite.body = body; - return p; -} - stmt_ty FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * decorator_list, expr_ty returns, string type_comment, int lineno, @@ -1293,12 +1979,12 @@ FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * stmt_ty p; if (!name) { PyErr_SetString(PyExc_ValueError, - "field name is required for FunctionDef"); + "field 'name' is required for FunctionDef"); return NULL; } if (!args) { PyErr_SetString(PyExc_ValueError, - "field args is required for FunctionDef"); + "field 'args' is required for FunctionDef"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1327,12 +2013,12 @@ AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq stmt_ty p; if (!name) { PyErr_SetString(PyExc_ValueError, - "field name is required for AsyncFunctionDef"); + "field 'name' is required for AsyncFunctionDef"); return NULL; } if (!args) { PyErr_SetString(PyExc_ValueError, - "field args is required for AsyncFunctionDef"); + "field 'args' is required for AsyncFunctionDef"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1360,7 +2046,7 @@ ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq * stmt_ty p; if (!name) { PyErr_SetString(PyExc_ValueError, - "field name is required for ClassDef"); + "field 'name' is required for ClassDef"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1420,7 +2106,7 @@ Assign(asdl_seq * targets, expr_ty value, string type_comment, int lineno, int stmt_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Assign"); + "field 'value' is required for Assign"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1444,17 +2130,17 @@ AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int stmt_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for AugAssign"); + "field 'target' is required for AugAssign"); return NULL; } if (!op) { PyErr_SetString(PyExc_ValueError, - "field op is required for AugAssign"); + "field 'op' is required for AugAssign"); return NULL; } if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for AugAssign"); + "field 'value' is required for AugAssign"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1479,12 +2165,12 @@ AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int stmt_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for AnnAssign"); + "field 'target' is required for AnnAssign"); return NULL; } if (!annotation) { PyErr_SetString(PyExc_ValueError, - "field annotation is required for AnnAssign"); + "field 'annotation' is required for AnnAssign"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1510,12 +2196,12 @@ For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, string stmt_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for For"); + "field 'target' is required for For"); return NULL; } if (!iter) { PyErr_SetString(PyExc_ValueError, - "field iter is required for For"); + "field 'iter' is required for For"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1542,12 +2228,12 @@ AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, stmt_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for AsyncFor"); + "field 'target' is required for AsyncFor"); return NULL; } if (!iter) { PyErr_SetString(PyExc_ValueError, - "field iter is required for AsyncFor"); + "field 'iter' is required for AsyncFor"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1573,7 +2259,7 @@ While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int stmt_ty p; if (!test) { PyErr_SetString(PyExc_ValueError, - "field test is required for While"); + "field 'test' is required for While"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1597,7 +2283,7 @@ If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int stmt_ty p; if (!test) { PyErr_SetString(PyExc_ValueError, - "field test is required for If"); + "field 'test' is required for If"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1698,7 +2384,7 @@ Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno, stmt_ty p; if (!test) { PyErr_SetString(PyExc_ValueError, - "field test is required for Assert"); + "field 'test' is required for Assert"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1791,7 +2477,7 @@ Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int stmt_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Expr"); + "field 'value' is required for Expr"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1861,7 +2547,7 @@ BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, int expr_ty p; if (!op) { PyErr_SetString(PyExc_ValueError, - "field op is required for BoolOp"); + "field 'op' is required for BoolOp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1884,12 +2570,12 @@ NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int expr_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for NamedExpr"); + "field 'target' is required for NamedExpr"); return NULL; } if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for NamedExpr"); + "field 'value' is required for NamedExpr"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1912,17 +2598,17 @@ BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset, expr_ty p; if (!left) { PyErr_SetString(PyExc_ValueError, - "field left is required for BinOp"); + "field 'left' is required for BinOp"); return NULL; } if (!op) { PyErr_SetString(PyExc_ValueError, - "field op is required for BinOp"); + "field 'op' is required for BinOp"); return NULL; } if (!right) { PyErr_SetString(PyExc_ValueError, - "field right is required for BinOp"); + "field 'right' is required for BinOp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1946,12 +2632,12 @@ UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int expr_ty p; if (!op) { PyErr_SetString(PyExc_ValueError, - "field op is required for UnaryOp"); + "field 'op' is required for UnaryOp"); return NULL; } if (!operand) { PyErr_SetString(PyExc_ValueError, - "field operand is required for UnaryOp"); + "field 'operand' is required for UnaryOp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1974,12 +2660,12 @@ Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int expr_ty p; if (!args) { PyErr_SetString(PyExc_ValueError, - "field args is required for Lambda"); + "field 'args' is required for Lambda"); return NULL; } if (!body) { PyErr_SetString(PyExc_ValueError, - "field body is required for Lambda"); + "field 'body' is required for Lambda"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2002,17 +2688,17 @@ IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset, expr_ty p; if (!test) { PyErr_SetString(PyExc_ValueError, - "field test is required for IfExp"); + "field 'test' is required for IfExp"); return NULL; } if (!body) { PyErr_SetString(PyExc_ValueError, - "field body is required for IfExp"); + "field 'body' is required for IfExp"); return NULL; } if (!orelse) { PyErr_SetString(PyExc_ValueError, - "field orelse is required for IfExp"); + "field 'orelse' is required for IfExp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2071,7 +2757,7 @@ ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int expr_ty p; if (!elt) { PyErr_SetString(PyExc_ValueError, - "field elt is required for ListComp"); + "field 'elt' is required for ListComp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2094,7 +2780,7 @@ SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int expr_ty p; if (!elt) { PyErr_SetString(PyExc_ValueError, - "field elt is required for SetComp"); + "field 'elt' is required for SetComp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2117,12 +2803,12 @@ DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int expr_ty p; if (!key) { PyErr_SetString(PyExc_ValueError, - "field key is required for DictComp"); + "field 'key' is required for DictComp"); return NULL; } if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for DictComp"); + "field 'value' is required for DictComp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2146,7 +2832,7 @@ GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, expr_ty p; if (!elt) { PyErr_SetString(PyExc_ValueError, - "field elt is required for GeneratorExp"); + "field 'elt' is required for GeneratorExp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2169,7 +2855,7 @@ Await(expr_ty value, int lineno, int col_offset, int end_lineno, int expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Await"); + "field 'value' is required for Await"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2208,7 +2894,7 @@ YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for YieldFrom"); + "field 'value' is required for YieldFrom"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2230,7 +2916,7 @@ Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno, expr_ty p; if (!left) { PyErr_SetString(PyExc_ValueError, - "field left is required for Compare"); + "field 'left' is required for Compare"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2254,7 +2940,7 @@ Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int expr_ty p; if (!func) { PyErr_SetString(PyExc_ValueError, - "field func is required for Call"); + "field 'func' is required for Call"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2279,7 +2965,7 @@ FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno, expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for FormattedValue"); + "field 'value' is required for FormattedValue"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2320,7 +3006,7 @@ Constant(constant value, string kind, int lineno, int col_offset, int expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Constant"); + "field 'value' is required for Constant"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2343,17 +3029,17 @@ Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Attribute"); + "field 'value' is required for Attribute"); return NULL; } if (!attr) { PyErr_SetString(PyExc_ValueError, - "field attr is required for Attribute"); + "field 'attr' is required for Attribute"); return NULL; } if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for Attribute"); + "field 'ctx' is required for Attribute"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2371,23 +3057,23 @@ Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int } expr_ty -Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int +Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Subscript"); + "field 'value' is required for Subscript"); return NULL; } if (!slice) { PyErr_SetString(PyExc_ValueError, - "field slice is required for Subscript"); + "field 'slice' is required for Subscript"); return NULL; } if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for Subscript"); + "field 'ctx' is required for Subscript"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2411,12 +3097,12 @@ Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Starred"); + "field 'value' is required for Starred"); return NULL; } if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for Starred"); + "field 'ctx' is required for Starred"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2439,12 +3125,12 @@ Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int expr_ty p; if (!id) { PyErr_SetString(PyExc_ValueError, - "field id is required for Name"); + "field 'id' is required for Name"); return NULL; } if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for Name"); + "field 'ctx' is required for Name"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2467,7 +3153,7 @@ List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int expr_ty p; if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for List"); + "field 'ctx' is required for List"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2490,7 +3176,7 @@ Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int expr_ty p; if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for Tuple"); + "field 'ctx' is required for Tuple"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2506,46 +3192,22 @@ Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int return p; } -slice_ty -Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena) +expr_ty +Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena *arena) { - slice_ty p; - p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); + expr_ty p; + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) return NULL; p->kind = Slice_kind; p->v.Slice.lower = lower; p->v.Slice.upper = upper; p->v.Slice.step = step; - return p; -} - -slice_ty -ExtSlice(asdl_seq * dims, PyArena *arena) -{ - slice_ty p; - p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); - if (!p) - return NULL; - p->kind = ExtSlice_kind; - p->v.ExtSlice.dims = dims; - return p; -} - -slice_ty -Index(expr_ty value, PyArena *arena) -{ - slice_ty p; - if (!value) { - PyErr_SetString(PyExc_ValueError, - "field value is required for Index"); - return NULL; - } - p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); - if (!p) - return NULL; - p->kind = Index_kind; - p->v.Index.value = value; + p->lineno = lineno; + p->col_offset = col_offset; + p->end_lineno = end_lineno; + p->end_col_offset = end_col_offset; return p; } @@ -2556,12 +3218,12 @@ comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async, comprehension_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for comprehension"); + "field 'target' is required for comprehension"); return NULL; } if (!iter) { PyErr_SetString(PyExc_ValueError, - "field iter is required for comprehension"); + "field 'iter' is required for comprehension"); return NULL; } p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2619,7 +3281,7 @@ arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int arg_ty p; if (!arg) { PyErr_SetString(PyExc_ValueError, - "field arg is required for arg"); + "field 'arg' is required for arg"); return NULL; } p = (arg_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2636,12 +3298,13 @@ arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int } keyword_ty -keyword(identifier arg, expr_ty value, PyArena *arena) +keyword(identifier arg, expr_ty value, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena) { keyword_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for keyword"); + "field 'value' is required for keyword"); return NULL; } p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2649,6 +3312,10 @@ keyword(identifier arg, expr_ty value, PyArena *arena) return NULL; p->arg = arg; p->value = value; + p->lineno = lineno; + p->col_offset = col_offset; + p->end_lineno = end_lineno; + p->end_col_offset = end_col_offset; return p; } @@ -2658,7 +3325,7 @@ alias(identifier name, identifier asname, PyArena *arena) alias_ty p; if (!name) { PyErr_SetString(PyExc_ValueError, - "field name is required for alias"); + "field 'name' is required for alias"); return NULL; } p = (alias_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2675,7 +3342,7 @@ withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena) withitem_ty p; if (!context_expr) { PyErr_SetString(PyExc_ValueError, - "field context_expr is required for withitem"); + "field 'context_expr' is required for withitem"); return NULL; } p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2692,7 +3359,7 @@ TypeIgnore(int lineno, string tag, PyArena *arena) type_ignore_ty p; if (!tag) { PyErr_SetString(PyExc_ValueError, - "field tag is required for TypeIgnore"); + "field 'tag' is required for TypeIgnore"); return NULL; } p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2706,67 +3373,63 @@ TypeIgnore(int lineno, string tag, PyArena *arena) PyObject* -ast2obj_mod(void* _o) +ast2obj_mod(astmodulestate *state, void* _o) { mod_ty o = (mod_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - switch (o->kind) { case Module_kind: - result = PyType_GenericNew(Module_type, NULL, NULL); + tp = (PyTypeObject *)state->Module_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Module.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.Module.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Module.type_ignores, ast2obj_type_ignore); + value = ast2obj_list(state, o->v.Module.type_ignores, + ast2obj_type_ignore); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_ignores, value) == -1) + if (PyObject_SetAttr(result, state->type_ignores, value) == -1) goto failed; Py_DECREF(value); break; case Interactive_kind: - result = PyType_GenericNew(Interactive_type, NULL, NULL); + tp = (PyTypeObject *)state->Interactive_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.Interactive.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); break; case Expression_kind: - result = PyType_GenericNew(Expression_type, NULL, NULL); + tp = (PyTypeObject *)state->Expression_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Expression.body); + value = ast2obj_expr(state, o->v.Expression.body); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); break; case FunctionType_kind: - result = PyType_GenericNew(FunctionType_type, NULL, NULL); + tp = (PyTypeObject *)state->FunctionType_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.FunctionType.argtypes, ast2obj_expr); + value = ast2obj_list(state, o->v.FunctionType.argtypes, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_argtypes, value) == -1) + if (PyObject_SetAttr(result, state->argtypes, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.FunctionType.returns); + value = ast2obj_expr(state, o->v.FunctionType.returns); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1) - goto failed; - Py_DECREF(value); - break; - case Suite_kind: - result = PyType_GenericNew(Suite_type, NULL, NULL); - if (!result) goto failed; - value = ast2obj_list(o->v.Suite.body, ast2obj_stmt); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->returns, value) == -1) goto failed; Py_DECREF(value); break; @@ -2779,465 +3442,491 @@ failed: } PyObject* -ast2obj_stmt(void* _o) +ast2obj_stmt(astmodulestate *state, void* _o) { stmt_ty o = (stmt_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - switch (o->kind) { case FunctionDef_kind: - result = PyType_GenericNew(FunctionDef_type, NULL, NULL); + tp = (PyTypeObject *)state->FunctionDef_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_identifier(o->v.FunctionDef.name); + value = ast2obj_identifier(state, o->v.FunctionDef.name); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) + if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_arguments(o->v.FunctionDef.args); + value = ast2obj_arguments(state, o->v.FunctionDef.args); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) + if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.FunctionDef.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr); + value = ast2obj_list(state, o->v.FunctionDef.decorator_list, + ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1) + if (PyObject_SetAttr(result, state->decorator_list, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.FunctionDef.returns); + value = ast2obj_expr(state, o->v.FunctionDef.returns); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1) + if (PyObject_SetAttr(result, state->returns, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.FunctionDef.type_comment); + value = ast2obj_string(state, o->v.FunctionDef.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case AsyncFunctionDef_kind: - result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL); + tp = (PyTypeObject *)state->AsyncFunctionDef_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_identifier(o->v.AsyncFunctionDef.name); + value = ast2obj_identifier(state, o->v.AsyncFunctionDef.name); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) + if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_arguments(o->v.AsyncFunctionDef.args); + value = ast2obj_arguments(state, o->v.AsyncFunctionDef.args); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) + if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.AsyncFunctionDef.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list, + value = ast2obj_list(state, o->v.AsyncFunctionDef.decorator_list, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1) + if (PyObject_SetAttr(result, state->decorator_list, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.AsyncFunctionDef.returns); + value = ast2obj_expr(state, o->v.AsyncFunctionDef.returns); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1) + if (PyObject_SetAttr(result, state->returns, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.AsyncFunctionDef.type_comment); + value = ast2obj_string(state, o->v.AsyncFunctionDef.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case ClassDef_kind: - result = PyType_GenericNew(ClassDef_type, NULL, NULL); + tp = (PyTypeObject *)state->ClassDef_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_identifier(o->v.ClassDef.name); + value = ast2obj_identifier(state, o->v.ClassDef.name); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) + if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr); + value = ast2obj_list(state, o->v.ClassDef.bases, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1) + if (PyObject_SetAttr(result, state->bases, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword); + value = ast2obj_list(state, o->v.ClassDef.keywords, ast2obj_keyword); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1) + if (PyObject_SetAttr(result, state->keywords, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.ClassDef.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr); + value = ast2obj_list(state, o->v.ClassDef.decorator_list, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1) + if (PyObject_SetAttr(result, state->decorator_list, value) == -1) goto failed; Py_DECREF(value); break; case Return_kind: - result = PyType_GenericNew(Return_type, NULL, NULL); + tp = (PyTypeObject *)state->Return_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Return.value); + value = ast2obj_expr(state, o->v.Return.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case Delete_kind: - result = PyType_GenericNew(Delete_type, NULL, NULL); + tp = (PyTypeObject *)state->Delete_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Delete.targets, ast2obj_expr); + value = ast2obj_list(state, o->v.Delete.targets, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1) + if (PyObject_SetAttr(result, state->targets, value) == -1) goto failed; Py_DECREF(value); break; case Assign_kind: - result = PyType_GenericNew(Assign_type, NULL, NULL); + tp = (PyTypeObject *)state->Assign_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Assign.targets, ast2obj_expr); + value = ast2obj_list(state, o->v.Assign.targets, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1) + if (PyObject_SetAttr(result, state->targets, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.Assign.value); + value = ast2obj_expr(state, o->v.Assign.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.Assign.type_comment); + value = ast2obj_string(state, o->v.Assign.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case AugAssign_kind: - result = PyType_GenericNew(AugAssign_type, NULL, NULL); + tp = (PyTypeObject *)state->AugAssign_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.AugAssign.target); + value = ast2obj_expr(state, o->v.AugAssign.target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_operator(o->v.AugAssign.op); + value = ast2obj_operator(state, o->v.AugAssign.op); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) + if (PyObject_SetAttr(result, state->op, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.AugAssign.value); + value = ast2obj_expr(state, o->v.AugAssign.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case AnnAssign_kind: - result = PyType_GenericNew(AnnAssign_type, NULL, NULL); + tp = (PyTypeObject *)state->AnnAssign_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.AnnAssign.target); + value = ast2obj_expr(state, o->v.AnnAssign.target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.AnnAssign.annotation); + value = ast2obj_expr(state, o->v.AnnAssign.annotation); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1) + if (PyObject_SetAttr(result, state->annotation, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.AnnAssign.value); + value = ast2obj_expr(state, o->v.AnnAssign.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_int(o->v.AnnAssign.simple); + value = ast2obj_int(state, o->v.AnnAssign.simple); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1) + if (PyObject_SetAttr(result, state->simple, value) == -1) goto failed; Py_DECREF(value); break; case For_kind: - result = PyType_GenericNew(For_type, NULL, NULL); + tp = (PyTypeObject *)state->For_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.For.target); + value = ast2obj_expr(state, o->v.For.target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.For.iter); + value = ast2obj_expr(state, o->v.For.iter); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1) + if (PyObject_SetAttr(result, state->iter, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.For.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.For.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.For.orelse, ast2obj_stmt); + value = ast2obj_list(state, o->v.For.orelse, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.For.type_comment); + value = ast2obj_string(state, o->v.For.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case AsyncFor_kind: - result = PyType_GenericNew(AsyncFor_type, NULL, NULL); + tp = (PyTypeObject *)state->AsyncFor_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.AsyncFor.target); + value = ast2obj_expr(state, o->v.AsyncFor.target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.AsyncFor.iter); + value = ast2obj_expr(state, o->v.AsyncFor.iter); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1) + if (PyObject_SetAttr(result, state->iter, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.AsyncFor.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt); + value = ast2obj_list(state, o->v.AsyncFor.orelse, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.AsyncFor.type_comment); + value = ast2obj_string(state, o->v.AsyncFor.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case While_kind: - result = PyType_GenericNew(While_type, NULL, NULL); + tp = (PyTypeObject *)state->While_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.While.test); + value = ast2obj_expr(state, o->v.While.test); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) + if (PyObject_SetAttr(result, state->test, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.While.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.While.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.While.orelse, ast2obj_stmt); + value = ast2obj_list(state, o->v.While.orelse, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); break; case If_kind: - result = PyType_GenericNew(If_type, NULL, NULL); + tp = (PyTypeObject *)state->If_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.If.test); + value = ast2obj_expr(state, o->v.If.test); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) + if (PyObject_SetAttr(result, state->test, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.If.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.If.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.If.orelse, ast2obj_stmt); + value = ast2obj_list(state, o->v.If.orelse, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); break; case With_kind: - result = PyType_GenericNew(With_type, NULL, NULL); + tp = (PyTypeObject *)state->With_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.With.items, ast2obj_withitem); + value = ast2obj_list(state, o->v.With.items, ast2obj_withitem); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_items, value) == -1) + if (PyObject_SetAttr(result, state->items, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.With.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.With.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.With.type_comment); + value = ast2obj_string(state, o->v.With.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case AsyncWith_kind: - result = PyType_GenericNew(AsyncWith_type, NULL, NULL); + tp = (PyTypeObject *)state->AsyncWith_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem); + value = ast2obj_list(state, o->v.AsyncWith.items, ast2obj_withitem); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_items, value) == -1) + if (PyObject_SetAttr(result, state->items, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.AsyncWith.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.AsyncWith.type_comment); + value = ast2obj_string(state, o->v.AsyncWith.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case Raise_kind: - result = PyType_GenericNew(Raise_type, NULL, NULL); + tp = (PyTypeObject *)state->Raise_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Raise.exc); + value = ast2obj_expr(state, o->v.Raise.exc); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1) + if (PyObject_SetAttr(result, state->exc, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.Raise.cause); + value = ast2obj_expr(state, o->v.Raise.cause); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1) + if (PyObject_SetAttr(result, state->cause, value) == -1) goto failed; Py_DECREF(value); break; case Try_kind: - result = PyType_GenericNew(Try_type, NULL, NULL); + tp = (PyTypeObject *)state->Try_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Try.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.Try.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler); + value = ast2obj_list(state, o->v.Try.handlers, ast2obj_excepthandler); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1) + if (PyObject_SetAttr(result, state->handlers, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt); + value = ast2obj_list(state, o->v.Try.orelse, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt); + value = ast2obj_list(state, o->v.Try.finalbody, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1) + if (PyObject_SetAttr(result, state->finalbody, value) == -1) goto failed; Py_DECREF(value); break; case Assert_kind: - result = PyType_GenericNew(Assert_type, NULL, NULL); + tp = (PyTypeObject *)state->Assert_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Assert.test); + value = ast2obj_expr(state, o->v.Assert.test); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) + if (PyObject_SetAttr(result, state->test, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.Assert.msg); + value = ast2obj_expr(state, o->v.Assert.msg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1) + if (PyObject_SetAttr(result, state->msg, value) == -1) goto failed; Py_DECREF(value); break; case Import_kind: - result = PyType_GenericNew(Import_type, NULL, NULL); + tp = (PyTypeObject *)state->Import_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Import.names, ast2obj_alias); + value = ast2obj_list(state, o->v.Import.names, ast2obj_alias); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) + if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; Py_DECREF(value); break; case ImportFrom_kind: - result = PyType_GenericNew(ImportFrom_type, NULL, NULL); + tp = (PyTypeObject *)state->ImportFrom_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_identifier(o->v.ImportFrom.module); + value = ast2obj_identifier(state, o->v.ImportFrom.module); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_module, value) == -1) + if (PyObject_SetAttr(result, state->module, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias); + value = ast2obj_list(state, o->v.ImportFrom.names, ast2obj_alias); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) + if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_int(o->v.ImportFrom.level); + value = ast2obj_int(state, o->v.ImportFrom.level); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_level, value) == -1) + if (PyObject_SetAttr(result, state->level, value) == -1) goto failed; Py_DECREF(value); break; case Global_kind: - result = PyType_GenericNew(Global_type, NULL, NULL); + tp = (PyTypeObject *)state->Global_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Global.names, ast2obj_identifier); + value = ast2obj_list(state, o->v.Global.names, ast2obj_identifier); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) + if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; Py_DECREF(value); break; case Nonlocal_kind: - result = PyType_GenericNew(Nonlocal_type, NULL, NULL); + tp = (PyTypeObject *)state->Nonlocal_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier); + value = ast2obj_list(state, o->v.Nonlocal.names, ast2obj_identifier); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) + if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; Py_DECREF(value); break; case Expr_kind: - result = PyType_GenericNew(Expr_type, NULL, NULL); + tp = (PyTypeObject *)state->Expr_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Expr.value); + value = ast2obj_expr(state, o->v.Expr.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case Pass_kind: - result = PyType_GenericNew(Pass_type, NULL, NULL); + tp = (PyTypeObject *)state->Pass_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; break; case Break_kind: - result = PyType_GenericNew(Break_type, NULL, NULL); + tp = (PyTypeObject *)state->Break_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; break; case Continue_kind: - result = PyType_GenericNew(Continue_type, NULL, NULL); + tp = (PyTypeObject *)state->Continue_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; break; } - value = ast2obj_int(o->lineno); + value = ast2obj_int(state, o->lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) + if (PyObject_SetAttr(result, state->lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->col_offset); + value = ast2obj_int(state, o->col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->col_offset, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_lineno); + value = ast2obj_int(state, o->end_lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0) + if (PyObject_SetAttr(result, state->end_lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_col_offset); + value = ast2obj_int(state, o->end_col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->end_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -3248,227 +3937,246 @@ failed: } PyObject* -ast2obj_expr(void* _o) +ast2obj_expr(astmodulestate *state, void* _o) { expr_ty o = (expr_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - switch (o->kind) { case BoolOp_kind: - result = PyType_GenericNew(BoolOp_type, NULL, NULL); + tp = (PyTypeObject *)state->BoolOp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_boolop(o->v.BoolOp.op); + value = ast2obj_boolop(state, o->v.BoolOp.op); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) + if (PyObject_SetAttr(result, state->op, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr); + value = ast2obj_list(state, o->v.BoolOp.values, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_values, value) == -1) + if (PyObject_SetAttr(result, state->values, value) == -1) goto failed; Py_DECREF(value); break; case NamedExpr_kind: - result = PyType_GenericNew(NamedExpr_type, NULL, NULL); + tp = (PyTypeObject *)state->NamedExpr_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.NamedExpr.target); + value = ast2obj_expr(state, o->v.NamedExpr.target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.NamedExpr.value); + value = ast2obj_expr(state, o->v.NamedExpr.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case BinOp_kind: - result = PyType_GenericNew(BinOp_type, NULL, NULL); + tp = (PyTypeObject *)state->BinOp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.BinOp.left); + value = ast2obj_expr(state, o->v.BinOp.left); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_left, value) == -1) + if (PyObject_SetAttr(result, state->left, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_operator(o->v.BinOp.op); + value = ast2obj_operator(state, o->v.BinOp.op); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) + if (PyObject_SetAttr(result, state->op, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.BinOp.right); + value = ast2obj_expr(state, o->v.BinOp.right); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_right, value) == -1) + if (PyObject_SetAttr(result, state->right, value) == -1) goto failed; Py_DECREF(value); break; case UnaryOp_kind: - result = PyType_GenericNew(UnaryOp_type, NULL, NULL); + tp = (PyTypeObject *)state->UnaryOp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_unaryop(o->v.UnaryOp.op); + value = ast2obj_unaryop(state, o->v.UnaryOp.op); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) + if (PyObject_SetAttr(result, state->op, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.UnaryOp.operand); + value = ast2obj_expr(state, o->v.UnaryOp.operand); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1) + if (PyObject_SetAttr(result, state->operand, value) == -1) goto failed; Py_DECREF(value); break; case Lambda_kind: - result = PyType_GenericNew(Lambda_type, NULL, NULL); + tp = (PyTypeObject *)state->Lambda_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_arguments(o->v.Lambda.args); + value = ast2obj_arguments(state, o->v.Lambda.args); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) + if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.Lambda.body); + value = ast2obj_expr(state, o->v.Lambda.body); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); break; case IfExp_kind: - result = PyType_GenericNew(IfExp_type, NULL, NULL); + tp = (PyTypeObject *)state->IfExp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.IfExp.test); + value = ast2obj_expr(state, o->v.IfExp.test); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) + if (PyObject_SetAttr(result, state->test, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.IfExp.body); + value = ast2obj_expr(state, o->v.IfExp.body); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.IfExp.orelse); + value = ast2obj_expr(state, o->v.IfExp.orelse); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); break; case Dict_kind: - result = PyType_GenericNew(Dict_type, NULL, NULL); + tp = (PyTypeObject *)state->Dict_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Dict.keys, ast2obj_expr); + value = ast2obj_list(state, o->v.Dict.keys, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1) + if (PyObject_SetAttr(result, state->keys, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Dict.values, ast2obj_expr); + value = ast2obj_list(state, o->v.Dict.values, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_values, value) == -1) + if (PyObject_SetAttr(result, state->values, value) == -1) goto failed; Py_DECREF(value); break; case Set_kind: - result = PyType_GenericNew(Set_type, NULL, NULL); + tp = (PyTypeObject *)state->Set_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Set.elts, ast2obj_expr); + value = ast2obj_list(state, o->v.Set.elts, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1) + if (PyObject_SetAttr(result, state->elts, value) == -1) goto failed; Py_DECREF(value); break; case ListComp_kind: - result = PyType_GenericNew(ListComp_type, NULL, NULL); + tp = (PyTypeObject *)state->ListComp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.ListComp.elt); + value = ast2obj_expr(state, o->v.ListComp.elt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1) + if (PyObject_SetAttr(result, state->elt, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension); + value = ast2obj_list(state, o->v.ListComp.generators, + ast2obj_comprehension); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) + if (PyObject_SetAttr(result, state->generators, value) == -1) goto failed; Py_DECREF(value); break; case SetComp_kind: - result = PyType_GenericNew(SetComp_type, NULL, NULL); + tp = (PyTypeObject *)state->SetComp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.SetComp.elt); + value = ast2obj_expr(state, o->v.SetComp.elt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1) + if (PyObject_SetAttr(result, state->elt, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension); + value = ast2obj_list(state, o->v.SetComp.generators, + ast2obj_comprehension); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) + if (PyObject_SetAttr(result, state->generators, value) == -1) goto failed; Py_DECREF(value); break; case DictComp_kind: - result = PyType_GenericNew(DictComp_type, NULL, NULL); + tp = (PyTypeObject *)state->DictComp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.DictComp.key); + value = ast2obj_expr(state, o->v.DictComp.key); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_key, value) == -1) + if (PyObject_SetAttr(result, state->key, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.DictComp.value); + value = ast2obj_expr(state, o->v.DictComp.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension); + value = ast2obj_list(state, o->v.DictComp.generators, + ast2obj_comprehension); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) + if (PyObject_SetAttr(result, state->generators, value) == -1) goto failed; Py_DECREF(value); break; case GeneratorExp_kind: - result = PyType_GenericNew(GeneratorExp_type, NULL, NULL); + tp = (PyTypeObject *)state->GeneratorExp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.GeneratorExp.elt); + value = ast2obj_expr(state, o->v.GeneratorExp.elt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1) + if (PyObject_SetAttr(result, state->elt, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.GeneratorExp.generators, + value = ast2obj_list(state, o->v.GeneratorExp.generators, ast2obj_comprehension); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) + if (PyObject_SetAttr(result, state->generators, value) == -1) goto failed; Py_DECREF(value); break; case Await_kind: - result = PyType_GenericNew(Await_type, NULL, NULL); + tp = (PyTypeObject *)state->Await_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Await.value); + value = ast2obj_expr(state, o->v.Await.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case Yield_kind: - result = PyType_GenericNew(Yield_type, NULL, NULL); + tp = (PyTypeObject *)state->Yield_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Yield.value); + value = ast2obj_expr(state, o->v.Yield.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case YieldFrom_kind: - result = PyType_GenericNew(YieldFrom_type, NULL, NULL); + tp = (PyTypeObject *)state->YieldFrom_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.YieldFrom.value); + value = ast2obj_expr(state, o->v.YieldFrom.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case Compare_kind: - result = PyType_GenericNew(Compare_type, NULL, NULL); + tp = (PyTypeObject *)state->Compare_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Compare.left); + value = ast2obj_expr(state, o->v.Compare.left); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_left, value) == -1) + if (PyObject_SetAttr(result, state->left, value) == -1) goto failed; Py_DECREF(value); { @@ -3476,192 +4184,222 @@ ast2obj_expr(void* _o) value = PyList_New(n); if (!value) goto failed; for(i = 0; i < n; i++) - PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i))); + PyList_SET_ITEM(value, i, ast2obj_cmpop(state, (cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i))); } if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1) + if (PyObject_SetAttr(result, state->ops, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr); + value = ast2obj_list(state, o->v.Compare.comparators, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1) + if (PyObject_SetAttr(result, state->comparators, value) == -1) goto failed; Py_DECREF(value); break; case Call_kind: - result = PyType_GenericNew(Call_type, NULL, NULL); + tp = (PyTypeObject *)state->Call_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Call.func); + value = ast2obj_expr(state, o->v.Call.func); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_func, value) == -1) + if (PyObject_SetAttr(result, state->func, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Call.args, ast2obj_expr); + value = ast2obj_list(state, o->v.Call.args, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) + if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword); + value = ast2obj_list(state, o->v.Call.keywords, ast2obj_keyword); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1) + if (PyObject_SetAttr(result, state->keywords, value) == -1) goto failed; Py_DECREF(value); break; case FormattedValue_kind: - result = PyType_GenericNew(FormattedValue_type, NULL, NULL); + tp = (PyTypeObject *)state->FormattedValue_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.FormattedValue.value); + value = ast2obj_expr(state, o->v.FormattedValue.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_int(o->v.FormattedValue.conversion); + value = ast2obj_int(state, o->v.FormattedValue.conversion); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1) + if (PyObject_SetAttr(result, state->conversion, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.FormattedValue.format_spec); + value = ast2obj_expr(state, o->v.FormattedValue.format_spec); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1) + if (PyObject_SetAttr(result, state->format_spec, value) == -1) goto failed; Py_DECREF(value); break; case JoinedStr_kind: - result = PyType_GenericNew(JoinedStr_type, NULL, NULL); + tp = (PyTypeObject *)state->JoinedStr_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr); + value = ast2obj_list(state, o->v.JoinedStr.values, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_values, value) == -1) + if (PyObject_SetAttr(result, state->values, value) == -1) goto failed; Py_DECREF(value); break; case Constant_kind: - result = PyType_GenericNew(Constant_type, NULL, NULL); + tp = (PyTypeObject *)state->Constant_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_constant(o->v.Constant.value); + value = ast2obj_constant(state, o->v.Constant.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.Constant.kind); + value = ast2obj_string(state, o->v.Constant.kind); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_kind, value) == -1) + if (PyObject_SetAttr(result, state->kind, value) == -1) goto failed; Py_DECREF(value); break; case Attribute_kind: - result = PyType_GenericNew(Attribute_type, NULL, NULL); + tp = (PyTypeObject *)state->Attribute_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Attribute.value); + value = ast2obj_expr(state, o->v.Attribute.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_identifier(o->v.Attribute.attr); + value = ast2obj_identifier(state, o->v.Attribute.attr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1) + if (PyObject_SetAttr(result, state->attr, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.Attribute.ctx); + value = ast2obj_expr_context(state, o->v.Attribute.ctx); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->ctx, value) == -1) goto failed; Py_DECREF(value); break; case Subscript_kind: - result = PyType_GenericNew(Subscript_type, NULL, NULL); + tp = (PyTypeObject *)state->Subscript_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Subscript.value); + value = ast2obj_expr(state, o->v.Subscript.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_slice(o->v.Subscript.slice); + value = ast2obj_expr(state, o->v.Subscript.slice); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1) + if (PyObject_SetAttr(result, state->slice, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.Subscript.ctx); + value = ast2obj_expr_context(state, o->v.Subscript.ctx); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->ctx, value) == -1) goto failed; Py_DECREF(value); break; case Starred_kind: - result = PyType_GenericNew(Starred_type, NULL, NULL); + tp = (PyTypeObject *)state->Starred_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Starred.value); + value = ast2obj_expr(state, o->v.Starred.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.Starred.ctx); + value = ast2obj_expr_context(state, o->v.Starred.ctx); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->ctx, value) == -1) goto failed; Py_DECREF(value); break; case Name_kind: - result = PyType_GenericNew(Name_type, NULL, NULL); + tp = (PyTypeObject *)state->Name_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_identifier(o->v.Name.id); + value = ast2obj_identifier(state, o->v.Name.id); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_id, value) == -1) + if (PyObject_SetAttr(result, state->id, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.Name.ctx); + value = ast2obj_expr_context(state, o->v.Name.ctx); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->ctx, value) == -1) goto failed; Py_DECREF(value); break; case List_kind: - result = PyType_GenericNew(List_type, NULL, NULL); + tp = (PyTypeObject *)state->List_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.List.elts, ast2obj_expr); + value = ast2obj_list(state, o->v.List.elts, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1) + if (PyObject_SetAttr(result, state->elts, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.List.ctx); + value = ast2obj_expr_context(state, o->v.List.ctx); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->ctx, value) == -1) goto failed; Py_DECREF(value); break; case Tuple_kind: - result = PyType_GenericNew(Tuple_type, NULL, NULL); + tp = (PyTypeObject *)state->Tuple_type; + result = PyType_GenericNew(tp, NULL, NULL); + if (!result) goto failed; + value = ast2obj_list(state, o->v.Tuple.elts, ast2obj_expr); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->elts, value) == -1) + goto failed; + Py_DECREF(value); + value = ast2obj_expr_context(state, o->v.Tuple.ctx); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->ctx, value) == -1) + goto failed; + Py_DECREF(value); + break; + case Slice_kind: + tp = (PyTypeObject *)state->Slice_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr); + value = ast2obj_expr(state, o->v.Slice.lower); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1) + if (PyObject_SetAttr(result, state->lower, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.Tuple.ctx); + value = ast2obj_expr(state, o->v.Slice.upper); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->upper, value) == -1) + goto failed; + Py_DECREF(value); + value = ast2obj_expr(state, o->v.Slice.step); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->step, value) == -1) goto failed; Py_DECREF(value); break; } - value = ast2obj_int(o->lineno); + value = ast2obj_int(state, o->lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) + if (PyObject_SetAttr(result, state->lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->col_offset); + value = ast2obj_int(state, o->col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->col_offset, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_lineno); + value = ast2obj_int(state, o->end_lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0) + if (PyObject_SetAttr(result, state->end_lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_col_offset); + value = ast2obj_int(state, o->end_col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->end_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -3671,240 +4409,162 @@ failed: return NULL; } -PyObject* ast2obj_expr_context(expr_context_ty o) +PyObject* ast2obj_expr_context(astmodulestate *state, expr_context_ty o) { switch(o) { case Load: - Py_INCREF(Load_singleton); - return Load_singleton; + Py_INCREF(state->Load_singleton); + return state->Load_singleton; case Store: - Py_INCREF(Store_singleton); - return Store_singleton; + Py_INCREF(state->Store_singleton); + return state->Store_singleton; case Del: - Py_INCREF(Del_singleton); - return Del_singleton; - case AugLoad: - Py_INCREF(AugLoad_singleton); - return AugLoad_singleton; - case AugStore: - Py_INCREF(AugStore_singleton); - return AugStore_singleton; - case Param: - Py_INCREF(Param_singleton); - return Param_singleton; - default: - /* should never happen, but just in case ... */ - PyErr_Format(PyExc_SystemError, "unknown expr_context found"); - return NULL; - } -} -PyObject* -ast2obj_slice(void* _o) -{ - slice_ty o = (slice_ty)_o; - PyObject *result = NULL, *value = NULL; - if (!o) { - Py_RETURN_NONE; - } - - switch (o->kind) { - case Slice_kind: - result = PyType_GenericNew(Slice_type, NULL, NULL); - if (!result) goto failed; - value = ast2obj_expr(o->v.Slice.lower); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1) - goto failed; - Py_DECREF(value); - value = ast2obj_expr(o->v.Slice.upper); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1) - goto failed; - Py_DECREF(value); - value = ast2obj_expr(o->v.Slice.step); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_step, value) == -1) - goto failed; - Py_DECREF(value); - break; - case ExtSlice_kind: - result = PyType_GenericNew(ExtSlice_type, NULL, NULL); - if (!result) goto failed; - value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1) - goto failed; - Py_DECREF(value); - break; - case Index_kind: - result = PyType_GenericNew(Index_type, NULL, NULL); - if (!result) goto failed; - value = ast2obj_expr(o->v.Index.value); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) - goto failed; - Py_DECREF(value); - break; + Py_INCREF(state->Del_singleton); + return state->Del_singleton; } - return result; -failed: - Py_XDECREF(value); - Py_XDECREF(result); - return NULL; + Py_UNREACHABLE(); } - -PyObject* ast2obj_boolop(boolop_ty o) +PyObject* ast2obj_boolop(astmodulestate *state, boolop_ty o) { switch(o) { case And: - Py_INCREF(And_singleton); - return And_singleton; + Py_INCREF(state->And_singleton); + return state->And_singleton; case Or: - Py_INCREF(Or_singleton); - return Or_singleton; - default: - /* should never happen, but just in case ... */ - PyErr_Format(PyExc_SystemError, "unknown boolop found"); - return NULL; + Py_INCREF(state->Or_singleton); + return state->Or_singleton; } + Py_UNREACHABLE(); } -PyObject* ast2obj_operator(operator_ty o) +PyObject* ast2obj_operator(astmodulestate *state, operator_ty o) { switch(o) { case Add: - Py_INCREF(Add_singleton); - return Add_singleton; + Py_INCREF(state->Add_singleton); + return state->Add_singleton; case Sub: - Py_INCREF(Sub_singleton); - return Sub_singleton; + Py_INCREF(state->Sub_singleton); + return state->Sub_singleton; case Mult: - Py_INCREF(Mult_singleton); - return Mult_singleton; + Py_INCREF(state->Mult_singleton); + return state->Mult_singleton; case MatMult: - Py_INCREF(MatMult_singleton); - return MatMult_singleton; + Py_INCREF(state->MatMult_singleton); + return state->MatMult_singleton; case Div: - Py_INCREF(Div_singleton); - return Div_singleton; + Py_INCREF(state->Div_singleton); + return state->Div_singleton; case Mod: - Py_INCREF(Mod_singleton); - return Mod_singleton; + Py_INCREF(state->Mod_singleton); + return state->Mod_singleton; case Pow: - Py_INCREF(Pow_singleton); - return Pow_singleton; + Py_INCREF(state->Pow_singleton); + return state->Pow_singleton; case LShift: - Py_INCREF(LShift_singleton); - return LShift_singleton; + Py_INCREF(state->LShift_singleton); + return state->LShift_singleton; case RShift: - Py_INCREF(RShift_singleton); - return RShift_singleton; + Py_INCREF(state->RShift_singleton); + return state->RShift_singleton; case BitOr: - Py_INCREF(BitOr_singleton); - return BitOr_singleton; + Py_INCREF(state->BitOr_singleton); + return state->BitOr_singleton; case BitXor: - Py_INCREF(BitXor_singleton); - return BitXor_singleton; + Py_INCREF(state->BitXor_singleton); + return state->BitXor_singleton; case BitAnd: - Py_INCREF(BitAnd_singleton); - return BitAnd_singleton; + Py_INCREF(state->BitAnd_singleton); + return state->BitAnd_singleton; case FloorDiv: - Py_INCREF(FloorDiv_singleton); - return FloorDiv_singleton; - default: - /* should never happen, but just in case ... */ - PyErr_Format(PyExc_SystemError, "unknown operator found"); - return NULL; + Py_INCREF(state->FloorDiv_singleton); + return state->FloorDiv_singleton; } + Py_UNREACHABLE(); } -PyObject* ast2obj_unaryop(unaryop_ty o) +PyObject* ast2obj_unaryop(astmodulestate *state, unaryop_ty o) { switch(o) { case Invert: - Py_INCREF(Invert_singleton); - return Invert_singleton; + Py_INCREF(state->Invert_singleton); + return state->Invert_singleton; case Not: - Py_INCREF(Not_singleton); - return Not_singleton; + Py_INCREF(state->Not_singleton); + return state->Not_singleton; case UAdd: - Py_INCREF(UAdd_singleton); - return UAdd_singleton; + Py_INCREF(state->UAdd_singleton); + return state->UAdd_singleton; case USub: - Py_INCREF(USub_singleton); - return USub_singleton; - default: - /* should never happen, but just in case ... */ - PyErr_Format(PyExc_SystemError, "unknown unaryop found"); - return NULL; + Py_INCREF(state->USub_singleton); + return state->USub_singleton; } + Py_UNREACHABLE(); } -PyObject* ast2obj_cmpop(cmpop_ty o) +PyObject* ast2obj_cmpop(astmodulestate *state, cmpop_ty o) { switch(o) { case Eq: - Py_INCREF(Eq_singleton); - return Eq_singleton; + Py_INCREF(state->Eq_singleton); + return state->Eq_singleton; case NotEq: - Py_INCREF(NotEq_singleton); - return NotEq_singleton; + Py_INCREF(state->NotEq_singleton); + return state->NotEq_singleton; case Lt: - Py_INCREF(Lt_singleton); - return Lt_singleton; + Py_INCREF(state->Lt_singleton); + return state->Lt_singleton; case LtE: - Py_INCREF(LtE_singleton); - return LtE_singleton; + Py_INCREF(state->LtE_singleton); + return state->LtE_singleton; case Gt: - Py_INCREF(Gt_singleton); - return Gt_singleton; + Py_INCREF(state->Gt_singleton); + return state->Gt_singleton; case GtE: - Py_INCREF(GtE_singleton); - return GtE_singleton; + Py_INCREF(state->GtE_singleton); + return state->GtE_singleton; case Is: - Py_INCREF(Is_singleton); - return Is_singleton; + Py_INCREF(state->Is_singleton); + return state->Is_singleton; case IsNot: - Py_INCREF(IsNot_singleton); - return IsNot_singleton; + Py_INCREF(state->IsNot_singleton); + return state->IsNot_singleton; case In: - Py_INCREF(In_singleton); - return In_singleton; + Py_INCREF(state->In_singleton); + return state->In_singleton; case NotIn: - Py_INCREF(NotIn_singleton); - return NotIn_singleton; - default: - /* should never happen, but just in case ... */ - PyErr_Format(PyExc_SystemError, "unknown cmpop found"); - return NULL; + Py_INCREF(state->NotIn_singleton); + return state->NotIn_singleton; } + Py_UNREACHABLE(); } PyObject* -ast2obj_comprehension(void* _o) +ast2obj_comprehension(astmodulestate *state, void* _o) { comprehension_ty o = (comprehension_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(comprehension_type, NULL, NULL); + tp = (PyTypeObject *)state->comprehension_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_expr(o->target); + value = ast2obj_expr(state, o->target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->iter); + value = ast2obj_expr(state, o->iter); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1) + if (PyObject_SetAttr(result, state->iter, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->ifs, ast2obj_expr); + value = ast2obj_list(state, o->ifs, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1) + if (PyObject_SetAttr(result, state->ifs, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_int(o->is_async); + value = ast2obj_int(state, o->is_async); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1) + if (PyObject_SetAttr(result, state->is_async, value) == -1) goto failed; Py_DECREF(value); return result; @@ -3915,53 +4575,54 @@ failed: } PyObject* -ast2obj_excepthandler(void* _o) +ast2obj_excepthandler(astmodulestate *state, void* _o) { excepthandler_ty o = (excepthandler_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - switch (o->kind) { case ExceptHandler_kind: - result = PyType_GenericNew(ExceptHandler_type, NULL, NULL); + tp = (PyTypeObject *)state->ExceptHandler_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.ExceptHandler.type); + value = ast2obj_expr(state, o->v.ExceptHandler.type); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type, value) == -1) + if (PyObject_SetAttr(result, state->type, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_identifier(o->v.ExceptHandler.name); + value = ast2obj_identifier(state, o->v.ExceptHandler.name); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) + if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.ExceptHandler.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); break; } - value = ast2obj_int(o->lineno); + value = ast2obj_int(state, o->lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) + if (PyObject_SetAttr(result, state->lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->col_offset); + value = ast2obj_int(state, o->col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->col_offset, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_lineno); + value = ast2obj_int(state, o->end_lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0) + if (PyObject_SetAttr(result, state->end_lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_col_offset); + value = ast2obj_int(state, o->end_col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->end_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -3972,49 +4633,50 @@ failed: } PyObject* -ast2obj_arguments(void* _o) +ast2obj_arguments(astmodulestate *state, void* _o) { arguments_ty o = (arguments_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(arguments_type, NULL, NULL); + tp = (PyTypeObject *)state->arguments_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_list(o->posonlyargs, ast2obj_arg); + value = ast2obj_list(state, o->posonlyargs, ast2obj_arg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_posonlyargs, value) == -1) + if (PyObject_SetAttr(result, state->posonlyargs, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->args, ast2obj_arg); + value = ast2obj_list(state, o->args, ast2obj_arg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) + if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_arg(o->vararg); + value = ast2obj_arg(state, o->vararg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1) + if (PyObject_SetAttr(result, state->vararg, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->kwonlyargs, ast2obj_arg); + value = ast2obj_list(state, o->kwonlyargs, ast2obj_arg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1) + if (PyObject_SetAttr(result, state->kwonlyargs, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->kw_defaults, ast2obj_expr); + value = ast2obj_list(state, o->kw_defaults, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1) + if (PyObject_SetAttr(result, state->kw_defaults, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_arg(o->kwarg); + value = ast2obj_arg(state, o->kwarg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1) + if (PyObject_SetAttr(result, state->kwarg, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->defaults, ast2obj_expr); + value = ast2obj_list(state, o->defaults, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1) + if (PyObject_SetAttr(result, state->defaults, value) == -1) goto failed; Py_DECREF(value); return result; @@ -4025,49 +4687,50 @@ failed: } PyObject* -ast2obj_arg(void* _o) +ast2obj_arg(astmodulestate *state, void* _o) { arg_ty o = (arg_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(arg_type, NULL, NULL); + tp = (PyTypeObject *)state->arg_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_identifier(o->arg); + value = ast2obj_identifier(state, o->arg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1) + if (PyObject_SetAttr(result, state->arg, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->annotation); + value = ast2obj_expr(state, o->annotation); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1) + if (PyObject_SetAttr(result, state->annotation, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->type_comment); + value = ast2obj_string(state, o->type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_int(o->lineno); + value = ast2obj_int(state, o->lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) + if (PyObject_SetAttr(result, state->lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->col_offset); + value = ast2obj_int(state, o->col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->col_offset, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_lineno); + value = ast2obj_int(state, o->end_lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0) + if (PyObject_SetAttr(result, state->end_lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_col_offset); + value = ast2obj_int(state, o->end_col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->end_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -4078,24 +4741,45 @@ failed: } PyObject* -ast2obj_keyword(void* _o) +ast2obj_keyword(astmodulestate *state, void* _o) { keyword_ty o = (keyword_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(keyword_type, NULL, NULL); + tp = (PyTypeObject *)state->keyword_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_identifier(o->arg); + value = ast2obj_identifier(state, o->arg); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->arg, value) == -1) + goto failed; + Py_DECREF(value); + value = ast2obj_expr(state, o->value); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->value, value) == -1) + goto failed; + Py_DECREF(value); + value = ast2obj_int(state, o->lineno); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->lineno, value) < 0) + goto failed; + Py_DECREF(value); + value = ast2obj_int(state, o->col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1) + if (PyObject_SetAttr(result, state->col_offset, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->value); + value = ast2obj_int(state, o->end_lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->end_lineno, value) < 0) + goto failed; + Py_DECREF(value); + value = ast2obj_int(state, o->end_col_offset); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->end_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -4106,24 +4790,25 @@ failed: } PyObject* -ast2obj_alias(void* _o) +ast2obj_alias(astmodulestate *state, void* _o) { alias_ty o = (alias_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(alias_type, NULL, NULL); + tp = (PyTypeObject *)state->alias_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_identifier(o->name); + value = ast2obj_identifier(state, o->name); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) + if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_identifier(o->asname); + value = ast2obj_identifier(state, o->asname); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1) + if (PyObject_SetAttr(result, state->asname, value) == -1) goto failed; Py_DECREF(value); return result; @@ -4134,24 +4819,25 @@ failed: } PyObject* -ast2obj_withitem(void* _o) +ast2obj_withitem(astmodulestate *state, void* _o) { withitem_ty o = (withitem_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(withitem_type, NULL, NULL); + tp = (PyTypeObject *)state->withitem_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_expr(o->context_expr); + value = ast2obj_expr(state, o->context_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1) + if (PyObject_SetAttr(result, state->context_expr, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->optional_vars); + value = ast2obj_expr(state, o->optional_vars); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1) + if (PyObject_SetAttr(result, state->optional_vars, value) == -1) goto failed; Py_DECREF(value); return result; @@ -4162,26 +4848,27 @@ failed: } PyObject* -ast2obj_type_ignore(void* _o) +ast2obj_type_ignore(astmodulestate *state, void* _o) { type_ignore_ty o = (type_ignore_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - switch (o->kind) { case TypeIgnore_kind: - result = PyType_GenericNew(TypeIgnore_type, NULL, NULL); + tp = (PyTypeObject *)state->TypeIgnore_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_int(o->v.TypeIgnore.lineno); + value = ast2obj_int(state, o->v.TypeIgnore.lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lineno, value) == -1) + if (PyObject_SetAttr(result, state->lineno, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.TypeIgnore.tag); + value = ast2obj_string(state, o->v.TypeIgnore.tag); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_tag, value) == -1) + if (PyObject_SetAttr(result, state->tag, value) == -1) goto failed; Py_DECREF(value); break; @@ -4195,17 +4882,19 @@ failed: int -obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) +obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena) { int isinstance; PyObject *tmp = NULL; + PyObject *tp; if (obj == Py_None) { *out = NULL; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type); + tp = state->Module_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4213,7 +4902,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) asdl_seq* body; asdl_seq* type_ignores; - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4225,7 +4914,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4233,7 +4922,10 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration"); @@ -4243,7 +4935,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_ignores, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_ignores, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4255,7 +4947,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4263,7 +4955,10 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (type_ignores == NULL) goto failed; for (i = 0; i < len; i++) { type_ignore_ty val; - res = obj2ast_type_ignore(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_type_ignore(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration"); @@ -4277,14 +4972,15 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type); + tp = state->Interactive_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* body; - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4296,7 +4992,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4304,7 +5000,10 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration"); @@ -4318,14 +5017,15 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type); + tp = state->Expression_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty body; - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4334,7 +5034,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &body, arena); + res = obj2ast_expr(state, tmp, &body, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -4342,7 +5042,8 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionType_type); + tp = state->FunctionType_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4350,7 +5051,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) asdl_seq* argtypes; expr_ty returns; - if (_PyObject_LookupAttrId(obj, &PyId_argtypes, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->argtypes, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4362,7 +5063,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4370,7 +5071,10 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (argtypes == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration"); @@ -4380,7 +5084,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4389,7 +5093,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &returns, arena); + res = obj2ast_expr(state, tmp, &returns, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -4397,47 +5101,6 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - asdl_seq* body; - - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { - return 1; - } - if (tmp == NULL) { - PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite"); - return 1; - } - else { - int res; - Py_ssize_t len; - Py_ssize_t i; - if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); - goto failed; - } - len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); - if (body == NULL) goto failed; - for (i = 0; i < len; i++) { - stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); - if (res != 0) goto failed; - if (len != PyList_GET_SIZE(tmp)) { - PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration"); - goto failed; - } - asdl_seq_SET(body, i, val); - } - Py_CLEAR(tmp); - } - *out = Suite(body, arena); - if (*out == NULL) goto failed; - return 0; - } PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj); failed: @@ -4446,11 +5109,12 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } int -obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) +obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) { int isinstance; PyObject *tmp = NULL; + PyObject *tp; int lineno; int col_offset; int end_lineno; @@ -4460,7 +5124,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) *out = NULL; return 0; } - if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4469,11 +5133,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &lineno, arena); + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4482,11 +5146,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &col_offset, arena); + res = obj2ast_int(state, tmp, &col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4495,11 +5159,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_lineno, arena); + res = obj2ast_int(state, tmp, &end_lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4508,11 +5172,12 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_col_offset, arena); + res = obj2ast_int(state, tmp, &end_col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type); + tp = state->FunctionDef_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4524,7 +5189,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty returns; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4533,11 +5198,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &name, arena); + res = obj2ast_identifier(state, tmp, &name, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4546,11 +5211,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_arguments(tmp, &args, arena); + res = obj2ast_arguments(state, tmp, &args, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4562,7 +5227,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4570,7 +5235,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration"); @@ -4580,7 +5248,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4592,7 +5260,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4600,7 +5268,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration"); @@ -4610,7 +5281,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4619,11 +5290,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &returns, arena); + res = obj2ast_expr(state, tmp, &returns, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4632,7 +5303,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -4642,7 +5313,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type); + tp = state->AsyncFunctionDef_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4654,7 +5326,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty returns; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4663,11 +5335,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &name, arena); + res = obj2ast_identifier(state, tmp, &name, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4676,11 +5348,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_arguments(tmp, &args, arena); + res = obj2ast_arguments(state, tmp, &args, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4692,7 +5364,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4700,7 +5372,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration"); @@ -4710,7 +5385,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4722,7 +5397,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4730,7 +5405,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration"); @@ -4740,7 +5418,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4749,11 +5427,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &returns, arena); + res = obj2ast_expr(state, tmp, &returns, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4762,7 +5440,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -4772,7 +5450,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type); + tp = state->ClassDef_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4783,7 +5462,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; asdl_seq* decorator_list; - if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4792,11 +5471,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &name, arena); + res = obj2ast_identifier(state, tmp, &name, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_bases, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->bases, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4808,7 +5487,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4816,7 +5495,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (bases == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration"); @@ -4826,7 +5508,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4838,7 +5520,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4846,7 +5528,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty val; - res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_keyword(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration"); @@ -4856,7 +5541,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4868,7 +5553,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4876,7 +5561,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration"); @@ -4886,7 +5574,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4898,7 +5586,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4906,7 +5594,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration"); @@ -4921,14 +5612,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type); + tp = state->Return_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4937,7 +5629,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -4946,14 +5638,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type); + tp = state->Delete_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* targets; - if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4965,7 +5658,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4973,7 +5666,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration"); @@ -4988,7 +5684,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type); + tp = state->Assign_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4997,7 +5694,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty value; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5009,7 +5706,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5017,7 +5714,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration"); @@ -5027,7 +5727,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5036,11 +5736,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5049,7 +5749,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5058,7 +5758,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type); + tp = state->AugAssign_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5067,7 +5768,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) operator_ty op; expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5076,11 +5777,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5089,11 +5790,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_operator(tmp, &op, arena); + res = obj2ast_operator(state, tmp, &op, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5102,7 +5803,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5111,7 +5812,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type); + tp = state->AnnAssign_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5121,7 +5823,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty value; int simple; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5130,11 +5832,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5143,11 +5845,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &annotation, arena); + res = obj2ast_expr(state, tmp, &annotation, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5156,11 +5858,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_simple, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->simple, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5169,7 +5871,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &simple, arena); + res = obj2ast_int(state, tmp, &simple, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5178,7 +5880,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)For_type); + tp = state->For_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5189,7 +5892,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* orelse; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5198,11 +5901,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5211,11 +5914,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &iter, arena); + res = obj2ast_expr(state, tmp, &iter, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5227,7 +5930,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5235,7 +5938,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration"); @@ -5245,7 +5951,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5257,7 +5963,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5265,7 +5971,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration"); @@ -5275,7 +5984,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5284,7 +5993,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5293,7 +6002,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type); + tp = state->AsyncFor_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5304,7 +6014,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* orelse; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5313,11 +6023,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5326,11 +6036,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &iter, arena); + res = obj2ast_expr(state, tmp, &iter, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5342,7 +6052,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5350,7 +6060,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration"); @@ -5360,7 +6073,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5372,7 +6085,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5380,7 +6093,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration"); @@ -5390,7 +6106,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5399,7 +6115,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5408,7 +6124,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)While_type); + tp = state->While_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5417,7 +6134,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; asdl_seq* orelse; - if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5426,11 +6143,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &test, arena); + res = obj2ast_expr(state, tmp, &test, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5442,7 +6159,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5450,7 +6167,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration"); @@ -5460,7 +6180,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5472,7 +6192,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5480,7 +6200,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration"); @@ -5495,7 +6218,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)If_type); + tp = state->If_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5504,7 +6228,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; asdl_seq* orelse; - if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5513,11 +6237,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &test, arena); + res = obj2ast_expr(state, tmp, &test, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5529,7 +6253,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5537,7 +6261,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration"); @@ -5547,7 +6274,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5559,7 +6286,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5567,7 +6294,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration"); @@ -5582,7 +6312,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)With_type); + tp = state->With_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5591,7 +6322,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5603,7 +6334,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5611,7 +6342,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (items == NULL) goto failed; for (i = 0; i < len; i++) { withitem_ty val; - res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_withitem(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration"); @@ -5621,7 +6355,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5633,7 +6367,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5641,7 +6375,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration"); @@ -5651,7 +6388,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5660,7 +6397,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5669,7 +6406,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type); + tp = state->AsyncWith_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5678,7 +6416,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5690,7 +6428,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5698,7 +6436,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (items == NULL) goto failed; for (i = 0; i < len; i++) { withitem_ty val; - res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_withitem(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration"); @@ -5708,7 +6449,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5720,7 +6461,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5728,7 +6469,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration"); @@ -5738,7 +6482,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5747,7 +6491,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5756,7 +6500,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type); + tp = state->Raise_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5764,7 +6509,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty exc; expr_ty cause; - if (_PyObject_LookupAttrId(obj, &PyId_exc, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->exc, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5773,11 +6518,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &exc, arena); + res = obj2ast_expr(state, tmp, &exc, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_cause, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->cause, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5786,7 +6531,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &cause, arena); + res = obj2ast_expr(state, tmp, &cause, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5795,7 +6540,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type); + tp = state->Try_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5805,7 +6551,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* orelse; asdl_seq* finalbody; - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5817,7 +6563,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5825,7 +6571,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration"); @@ -5835,7 +6584,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_handlers, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->handlers, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5847,7 +6596,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5855,7 +6604,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (handlers == NULL) goto failed; for (i = 0; i < len; i++) { excepthandler_ty val; - res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_excepthandler(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration"); @@ -5865,7 +6617,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5877,7 +6629,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5885,7 +6637,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration"); @@ -5895,7 +6650,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_finalbody, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->finalbody, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5907,7 +6662,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5915,7 +6670,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (finalbody == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration"); @@ -5930,7 +6688,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type); + tp = state->Assert_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5938,7 +6697,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty test; expr_ty msg; - if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5947,11 +6706,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &test, arena); + res = obj2ast_expr(state, tmp, &test, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_msg, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->msg, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5960,7 +6719,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &msg, arena); + res = obj2ast_expr(state, tmp, &msg, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5969,14 +6728,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type); + tp = state->Import_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* names; - if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5988,7 +6748,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5996,7 +6756,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty val; - res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_alias(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration"); @@ -6011,7 +6774,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type); + tp = state->ImportFrom_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6020,7 +6784,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* names; int level; - if (_PyObject_LookupAttrId(obj, &PyId_module, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->module, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -6029,11 +6793,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &module, arena); + res = obj2ast_identifier(state, tmp, &module, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6045,7 +6809,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6053,7 +6817,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty val; - res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_alias(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration"); @@ -6063,7 +6830,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_level, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->level, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -6072,7 +6839,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &level, arena); + res = obj2ast_int(state, tmp, &level, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6081,14 +6848,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type); + tp = state->Global_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* names; - if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6100,7 +6868,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6108,7 +6876,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier val; - res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_identifier(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration"); @@ -6123,14 +6894,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type); + tp = state->Nonlocal_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* names; - if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6142,7 +6914,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6150,7 +6922,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier val; - res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_identifier(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration"); @@ -6165,14 +6940,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type); + tp = state->Expr_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6181,7 +6957,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6190,7 +6966,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type); + tp = state->Pass_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6200,7 +6977,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type); + tp = state->Break_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6210,7 +6988,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type); + tp = state->Continue_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6228,11 +7007,12 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } int -obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) +obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) { int isinstance; PyObject *tmp = NULL; + PyObject *tp; int lineno; int col_offset; int end_lineno; @@ -6242,7 +7022,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) *out = NULL; return 0; } - if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6251,11 +7031,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &lineno, arena); + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6264,11 +7044,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &col_offset, arena); + res = obj2ast_int(state, tmp, &col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -6277,11 +7057,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_lineno, arena); + res = obj2ast_int(state, tmp, &end_lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -6290,11 +7070,12 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_col_offset, arena); + res = obj2ast_int(state, tmp, &end_col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type); + tp = state->BoolOp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6302,7 +7083,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) boolop_ty op; asdl_seq* values; - if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6311,11 +7092,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_boolop(tmp, &op, arena); + res = obj2ast_boolop(state, tmp, &op, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6327,7 +7108,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6335,7 +7116,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration"); @@ -6350,7 +7134,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)NamedExpr_type); + tp = state->NamedExpr_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6358,7 +7143,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty target; expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6367,11 +7152,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6380,7 +7165,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6389,7 +7174,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type); + tp = state->BinOp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6398,7 +7184,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) operator_ty op; expr_ty right; - if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6407,11 +7193,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &left, arena); + res = obj2ast_expr(state, tmp, &left, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6420,11 +7206,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_operator(tmp, &op, arena); + res = obj2ast_operator(state, tmp, &op, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_right, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->right, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6433,7 +7219,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &right, arena); + res = obj2ast_expr(state, tmp, &right, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6442,7 +7228,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type); + tp = state->UnaryOp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6450,7 +7237,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) unaryop_ty op; expr_ty operand; - if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6459,11 +7246,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_unaryop(tmp, &op, arena); + res = obj2ast_unaryop(state, tmp, &op, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_operand, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->operand, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6472,7 +7259,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &operand, arena); + res = obj2ast_expr(state, tmp, &operand, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6481,7 +7268,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type); + tp = state->Lambda_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6489,7 +7277,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) arguments_ty args; expr_ty body; - if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6498,11 +7286,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_arguments(tmp, &args, arena); + res = obj2ast_arguments(state, tmp, &args, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6511,7 +7299,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &body, arena); + res = obj2ast_expr(state, tmp, &body, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6520,7 +7308,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type); + tp = state->IfExp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6529,7 +7318,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty body; expr_ty orelse; - if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6538,11 +7327,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &test, arena); + res = obj2ast_expr(state, tmp, &test, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6551,11 +7340,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &body, arena); + res = obj2ast_expr(state, tmp, &body, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6564,7 +7353,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &orelse, arena); + res = obj2ast_expr(state, tmp, &orelse, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6573,7 +7362,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type); + tp = state->Dict_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6581,7 +7371,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) asdl_seq* keys; asdl_seq* values; - if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->keys, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6593,7 +7383,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6601,7 +7391,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (keys == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration"); @@ -6611,7 +7404,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6623,7 +7416,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6631,7 +7424,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration"); @@ -6646,14 +7442,15 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type); + tp = state->Set_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* elts; - if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6665,7 +7462,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6673,7 +7470,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration"); @@ -6687,7 +7487,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type); + tp = state->ListComp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6695,7 +7496,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty elt; asdl_seq* generators; - if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6704,11 +7505,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &elt, arena); + res = obj2ast_expr(state, tmp, &elt, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6720,7 +7521,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6728,7 +7529,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; - res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_comprehension(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration"); @@ -6743,7 +7547,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type); + tp = state->SetComp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6751,7 +7556,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty elt; asdl_seq* generators; - if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6760,11 +7565,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &elt, arena); + res = obj2ast_expr(state, tmp, &elt, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6776,7 +7581,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6784,7 +7589,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; - res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_comprehension(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration"); @@ -6799,7 +7607,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type); + tp = state->DictComp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6808,7 +7617,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty value; asdl_seq* generators; - if (_PyObject_LookupAttrId(obj, &PyId_key, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->key, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6817,11 +7626,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &key, arena); + res = obj2ast_expr(state, tmp, &key, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6830,11 +7639,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6846,7 +7655,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6854,7 +7663,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; - res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_comprehension(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration"); @@ -6869,7 +7681,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type); + tp = state->GeneratorExp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6877,7 +7690,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty elt; asdl_seq* generators; - if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6886,11 +7699,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &elt, arena); + res = obj2ast_expr(state, tmp, &elt, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6902,7 +7715,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6910,7 +7723,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; - res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_comprehension(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration"); @@ -6925,14 +7741,15 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type); + tp = state->Await_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6941,7 +7758,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6950,14 +7767,15 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type); + tp = state->Yield_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -6966,7 +7784,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6975,14 +7793,15 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type); + tp = state->YieldFrom_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6991,7 +7810,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7000,7 +7819,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type); + tp = state->Compare_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7009,7 +7829,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) asdl_int_seq* ops; asdl_seq* comparators; - if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7018,11 +7838,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &left, arena); + res = obj2ast_expr(state, tmp, &left, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ops, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ops, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7034,7 +7854,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7042,7 +7862,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (ops == NULL) goto failed; for (i = 0; i < len; i++) { cmpop_ty val; - res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_cmpop(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration"); @@ -7052,7 +7875,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_comparators, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->comparators, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7064,7 +7887,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7072,7 +7895,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (comparators == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration"); @@ -7087,7 +7913,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type); + tp = state->Call_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7096,7 +7923,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) asdl_seq* args; asdl_seq* keywords; - if (_PyObject_LookupAttrId(obj, &PyId_func, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->func, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7105,11 +7932,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &func, arena); + res = obj2ast_expr(state, tmp, &func, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7121,7 +7948,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7129,7 +7956,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (args == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration"); @@ -7139,7 +7969,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7151,7 +7981,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7159,7 +7989,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty val; - res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_keyword(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration"); @@ -7174,7 +8007,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type); + tp = state->FormattedValue_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7183,7 +8017,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) int conversion; expr_ty format_spec; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7192,11 +8026,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_conversion, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->conversion, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7205,11 +8039,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &conversion, arena); + res = obj2ast_int(state, tmp, &conversion, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_format_spec, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->format_spec, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7218,7 +8052,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &format_spec, arena); + res = obj2ast_expr(state, tmp, &format_spec, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7227,14 +8061,15 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type); + tp = state->JoinedStr_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* values; - if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7246,7 +8081,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7254,7 +8089,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration"); @@ -7269,7 +8107,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type); + tp = state->Constant_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7277,7 +8116,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) constant value; string kind; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7286,11 +8125,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_constant(tmp, &value, arena); + res = obj2ast_constant(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_kind, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->kind, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7299,7 +8138,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &kind, arena); + res = obj2ast_string(state, tmp, &kind, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7308,7 +8147,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type); + tp = state->Attribute_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7317,7 +8157,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) identifier attr; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7326,11 +8166,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_attr, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->attr, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7339,11 +8179,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &attr, arena); + res = obj2ast_identifier(state, tmp, &attr, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7352,7 +8192,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7361,16 +8201,17 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type); + tp = state->Subscript_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - slice_ty slice; + expr_ty slice; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7379,11 +8220,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_slice, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->slice, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7392,11 +8233,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_slice(tmp, &slice, arena); + res = obj2ast_expr(state, tmp, &slice, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7405,7 +8246,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7414,7 +8255,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type); + tp = state->Starred_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7422,7 +8264,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty value; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7431,11 +8273,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7444,7 +8286,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7453,7 +8295,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type); + tp = state->Name_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7461,7 +8304,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) identifier id; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_id, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->id, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7470,11 +8313,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &id, arena); + res = obj2ast_identifier(state, tmp, &id, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7483,7 +8326,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7492,7 +8335,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)List_type); + tp = state->List_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7500,7 +8344,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) asdl_seq* elts; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7512,7 +8356,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7520,7 +8364,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration"); @@ -7530,7 +8377,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7539,7 +8386,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7548,7 +8395,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type); + tp = state->Tuple_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7556,7 +8404,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) asdl_seq* elts; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7568,7 +8416,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7576,7 +8424,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration"); @@ -7586,7 +8437,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7595,7 +8446,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7604,92 +8455,17 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } + tp = state->Slice_type; + isinstance = PyObject_IsInstance(obj, tp); + if (isinstance == -1) { + return 1; + } + if (isinstance) { + expr_ty lower; + expr_ty upper; + expr_ty step; - PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj); - failed: - Py_XDECREF(tmp); - return 1; -} - -int -obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena) -{ - int isinstance; - - isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = Load; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = Store; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = Del; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = AugLoad; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = AugStore; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = Param; - return 0; - } - - PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj); - return 1; -} - -int -obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) -{ - int isinstance; - - PyObject *tmp = NULL; - - if (obj == Py_None) { - *out = NULL; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - expr_ty lower; - expr_ty upper; - expr_ty step; - - if (_PyObject_LookupAttrId(obj, &PyId_lower, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lower, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7698,11 +8474,11 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &lower, arena); + res = obj2ast_expr(state, tmp, &lower, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_upper, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->upper, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7711,11 +8487,11 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &upper, arena); + res = obj2ast_expr(state, tmp, &upper, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_step, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->step, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7724,92 +8500,64 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &step, arena); + res = obj2ast_expr(state, tmp, &step, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - *out = Slice(lower, upper, step, arena); + *out = Slice(lower, upper, step, lineno, col_offset, end_lineno, + end_col_offset, arena); if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type); + + PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj); + failed: + Py_XDECREF(tmp); + return 1; +} + +int +obj2ast_expr_context(astmodulestate *state, PyObject* obj, expr_context_ty* + out, PyArena* arena) +{ + int isinstance; + + isinstance = PyObject_IsInstance(obj, state->Load_type); if (isinstance == -1) { return 1; } if (isinstance) { - asdl_seq* dims; - - if (_PyObject_LookupAttrId(obj, &PyId_dims, &tmp) < 0) { - return 1; - } - if (tmp == NULL) { - PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice"); - return 1; - } - else { - int res; - Py_ssize_t len; - Py_ssize_t i; - if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name); - goto failed; - } - len = PyList_GET_SIZE(tmp); - dims = _Py_asdl_seq_new(len, arena); - if (dims == NULL) goto failed; - for (i = 0; i < len; i++) { - slice_ty val; - res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena); - if (res != 0) goto failed; - if (len != PyList_GET_SIZE(tmp)) { - PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration"); - goto failed; - } - asdl_seq_SET(dims, i, val); - } - Py_CLEAR(tmp); - } - *out = ExtSlice(dims, arena); - if (*out == NULL) goto failed; + *out = Load; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type); + isinstance = PyObject_IsInstance(obj, state->Store_type); if (isinstance == -1) { return 1; } if (isinstance) { - expr_ty value; - - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { - return 1; - } - if (tmp == NULL) { - PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index"); - return 1; - } - else { - int res; - res = obj2ast_expr(tmp, &value, arena); - if (res != 0) goto failed; - Py_CLEAR(tmp); - } - *out = Index(value, arena); - if (*out == NULL) goto failed; + *out = Store; + return 0; + } + isinstance = PyObject_IsInstance(obj, state->Del_type); + if (isinstance == -1) { + return 1; + } + if (isinstance) { + *out = Del; return 0; } - PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj); - failed: - Py_XDECREF(tmp); + PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj); return 1; } int -obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena) +obj2ast_boolop(astmodulestate *state, PyObject* obj, boolop_ty* out, PyArena* + arena) { int isinstance; - isinstance = PyObject_IsInstance(obj, (PyObject *)And_type); + isinstance = PyObject_IsInstance(obj, state->And_type); if (isinstance == -1) { return 1; } @@ -7817,7 +8565,7 @@ obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena) *out = And; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type); + isinstance = PyObject_IsInstance(obj, state->Or_type); if (isinstance == -1) { return 1; } @@ -7831,11 +8579,12 @@ obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena) } int -obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) +obj2ast_operator(astmodulestate *state, PyObject* obj, operator_ty* out, + PyArena* arena) { int isinstance; - isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type); + isinstance = PyObject_IsInstance(obj, state->Add_type); if (isinstance == -1) { return 1; } @@ -7843,7 +8592,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Add; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type); + isinstance = PyObject_IsInstance(obj, state->Sub_type); if (isinstance == -1) { return 1; } @@ -7851,7 +8600,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Sub; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type); + isinstance = PyObject_IsInstance(obj, state->Mult_type); if (isinstance == -1) { return 1; } @@ -7859,7 +8608,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Mult; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type); + isinstance = PyObject_IsInstance(obj, state->MatMult_type); if (isinstance == -1) { return 1; } @@ -7867,7 +8616,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = MatMult; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type); + isinstance = PyObject_IsInstance(obj, state->Div_type); if (isinstance == -1) { return 1; } @@ -7875,7 +8624,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Div; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type); + isinstance = PyObject_IsInstance(obj, state->Mod_type); if (isinstance == -1) { return 1; } @@ -7883,7 +8632,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Mod; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type); + isinstance = PyObject_IsInstance(obj, state->Pow_type); if (isinstance == -1) { return 1; } @@ -7891,7 +8640,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Pow; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type); + isinstance = PyObject_IsInstance(obj, state->LShift_type); if (isinstance == -1) { return 1; } @@ -7899,7 +8648,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = LShift; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type); + isinstance = PyObject_IsInstance(obj, state->RShift_type); if (isinstance == -1) { return 1; } @@ -7907,7 +8656,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = RShift; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type); + isinstance = PyObject_IsInstance(obj, state->BitOr_type); if (isinstance == -1) { return 1; } @@ -7915,7 +8664,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = BitOr; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type); + isinstance = PyObject_IsInstance(obj, state->BitXor_type); if (isinstance == -1) { return 1; } @@ -7923,7 +8672,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = BitXor; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type); + isinstance = PyObject_IsInstance(obj, state->BitAnd_type); if (isinstance == -1) { return 1; } @@ -7931,7 +8680,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = BitAnd; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type); + isinstance = PyObject_IsInstance(obj, state->FloorDiv_type); if (isinstance == -1) { return 1; } @@ -7945,11 +8694,12 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) } int -obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena) +obj2ast_unaryop(astmodulestate *state, PyObject* obj, unaryop_ty* out, PyArena* + arena) { int isinstance; - isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type); + isinstance = PyObject_IsInstance(obj, state->Invert_type); if (isinstance == -1) { return 1; } @@ -7957,7 +8707,7 @@ obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena) *out = Invert; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type); + isinstance = PyObject_IsInstance(obj, state->Not_type); if (isinstance == -1) { return 1; } @@ -7965,7 +8715,7 @@ obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena) *out = Not; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type); + isinstance = PyObject_IsInstance(obj, state->UAdd_type); if (isinstance == -1) { return 1; } @@ -7973,7 +8723,7 @@ obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena) *out = UAdd; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type); + isinstance = PyObject_IsInstance(obj, state->USub_type); if (isinstance == -1) { return 1; } @@ -7987,11 +8737,12 @@ obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena) } int -obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) +obj2ast_cmpop(astmodulestate *state, PyObject* obj, cmpop_ty* out, PyArena* + arena) { int isinstance; - isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type); + isinstance = PyObject_IsInstance(obj, state->Eq_type); if (isinstance == -1) { return 1; } @@ -7999,7 +8750,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = Eq; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type); + isinstance = PyObject_IsInstance(obj, state->NotEq_type); if (isinstance == -1) { return 1; } @@ -8007,7 +8758,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = NotEq; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type); + isinstance = PyObject_IsInstance(obj, state->Lt_type); if (isinstance == -1) { return 1; } @@ -8015,7 +8766,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = Lt; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type); + isinstance = PyObject_IsInstance(obj, state->LtE_type); if (isinstance == -1) { return 1; } @@ -8023,7 +8774,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = LtE; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type); + isinstance = PyObject_IsInstance(obj, state->Gt_type); if (isinstance == -1) { return 1; } @@ -8031,7 +8782,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = Gt; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type); + isinstance = PyObject_IsInstance(obj, state->GtE_type); if (isinstance == -1) { return 1; } @@ -8039,7 +8790,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = GtE; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type); + isinstance = PyObject_IsInstance(obj, state->Is_type); if (isinstance == -1) { return 1; } @@ -8047,7 +8798,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = Is; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type); + isinstance = PyObject_IsInstance(obj, state->IsNot_type); if (isinstance == -1) { return 1; } @@ -8055,7 +8806,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = IsNot; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)In_type); + isinstance = PyObject_IsInstance(obj, state->In_type); if (isinstance == -1) { return 1; } @@ -8063,7 +8814,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = In; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type); + isinstance = PyObject_IsInstance(obj, state->NotIn_type); if (isinstance == -1) { return 1; } @@ -8077,7 +8828,8 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) } int -obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) +obj2ast_comprehension(astmodulestate *state, PyObject* obj, comprehension_ty* + out, PyArena* arena) { PyObject* tmp = NULL; expr_ty target; @@ -8085,7 +8837,7 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) asdl_seq* ifs; int is_async; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8094,11 +8846,11 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8107,11 +8859,11 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &iter, arena); + res = obj2ast_expr(state, tmp, &iter, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ifs, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ifs, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8123,7 +8875,7 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8131,7 +8883,10 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) if (ifs == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration"); @@ -8141,7 +8896,7 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_is_async, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->is_async, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8150,7 +8905,7 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &is_async, arena); + res = obj2ast_int(state, tmp, &is_async, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8162,11 +8917,13 @@ failed: } int -obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) +obj2ast_excepthandler(astmodulestate *state, PyObject* obj, excepthandler_ty* + out, PyArena* arena) { int isinstance; PyObject *tmp = NULL; + PyObject *tp; int lineno; int col_offset; int end_lineno; @@ -8176,7 +8933,7 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) *out = NULL; return 0; } - if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8185,11 +8942,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &lineno, arena); + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8198,11 +8955,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &col_offset, arena); + res = obj2ast_int(state, tmp, &col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8211,11 +8968,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_lineno, arena); + res = obj2ast_int(state, tmp, &end_lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8224,11 +8981,12 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_col_offset, arena); + res = obj2ast_int(state, tmp, &end_col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type); + tp = state->ExceptHandler_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -8237,7 +8995,7 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) identifier name; asdl_seq* body; - if (_PyObject_LookupAttrId(obj, &PyId_type, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8246,11 +9004,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &type, arena); + res = obj2ast_expr(state, tmp, &type, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8259,11 +9017,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &name, arena); + res = obj2ast_identifier(state, tmp, &name, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8275,7 +9033,7 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8283,7 +9041,10 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration"); @@ -8306,7 +9067,8 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } int -obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) +obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out, + PyArena* arena) { PyObject* tmp = NULL; asdl_seq* posonlyargs; @@ -8317,7 +9079,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) arg_ty kwarg; asdl_seq* defaults; - if (_PyObject_LookupAttrId(obj, &PyId_posonlyargs, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->posonlyargs, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8329,7 +9091,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"posonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"posonlyargs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8337,7 +9099,10 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) if (posonlyargs == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty val; - res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_arg(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "arguments field \"posonlyargs\" changed size during iteration"); @@ -8347,7 +9112,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8359,7 +9124,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8367,7 +9132,10 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) if (args == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty val; - res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_arg(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration"); @@ -8377,7 +9145,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_vararg, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->vararg, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8386,11 +9154,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } else { int res; - res = obj2ast_arg(tmp, &vararg, arena); + res = obj2ast_arg(state, tmp, &vararg, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_kwonlyargs, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->kwonlyargs, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8402,7 +9170,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8410,7 +9178,10 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) if (kwonlyargs == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty val; - res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_arg(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration"); @@ -8420,7 +9191,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_kw_defaults, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->kw_defaults, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8432,7 +9203,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8440,7 +9211,10 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) if (kw_defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration"); @@ -8450,7 +9224,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_kwarg, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->kwarg, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8459,11 +9233,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } else { int res; - res = obj2ast_arg(tmp, &kwarg, arena); + res = obj2ast_arg(state, tmp, &kwarg, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_defaults, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->defaults, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8475,7 +9249,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8483,7 +9257,10 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) if (defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration"); @@ -8502,7 +9279,7 @@ failed: } int -obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) +obj2ast_arg(astmodulestate *state, PyObject* obj, arg_ty* out, PyArena* arena) { PyObject* tmp = NULL; identifier arg; @@ -8513,7 +9290,7 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) int end_lineno; int end_col_offset; - if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8522,11 +9299,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &arg, arena); + res = obj2ast_identifier(state, tmp, &arg, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8535,11 +9312,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &annotation, arena); + res = obj2ast_expr(state, tmp, &annotation, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8548,11 +9325,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8561,11 +9338,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &lineno, arena); + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8574,11 +9351,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &col_offset, arena); + res = obj2ast_int(state, tmp, &col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8587,11 +9364,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_lineno, arena); + res = obj2ast_int(state, tmp, &end_lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8600,7 +9377,7 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_col_offset, arena); + res = obj2ast_int(state, tmp, &end_col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8613,13 +9390,18 @@ failed: } int -obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena) +obj2ast_keyword(astmodulestate *state, PyObject* obj, keyword_ty* out, PyArena* + arena) { PyObject* tmp = NULL; identifier arg; expr_ty value; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; - if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8628,11 +9410,11 @@ obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &arg, arena); + res = obj2ast_identifier(state, tmp, &arg, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8641,11 +9423,64 @@ obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { + return 1; + } + if (tmp == NULL) { + PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from keyword"); + return 1; + } + else { + int res; + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - *out = keyword(arg, value, arena); + if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) { + return 1; + } + if (tmp == NULL) { + PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from keyword"); + return 1; + } + else { + int res; + res = obj2ast_int(state, tmp, &col_offset, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + end_lineno = 0; + } + else { + int res; + res = obj2ast_int(state, tmp, &end_lineno, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + end_col_offset = 0; + } + else { + int res; + res = obj2ast_int(state, tmp, &end_col_offset, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = keyword(arg, value, lineno, col_offset, end_lineno, end_col_offset, + arena); return 0; failed: Py_XDECREF(tmp); @@ -8653,13 +9488,14 @@ failed: } int -obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena) +obj2ast_alias(astmodulestate *state, PyObject* obj, alias_ty* out, PyArena* + arena) { PyObject* tmp = NULL; identifier name; identifier asname; - if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8668,11 +9504,11 @@ obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &name, arena); + res = obj2ast_identifier(state, tmp, &name, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_asname, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->asname, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8681,7 +9517,7 @@ obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &asname, arena); + res = obj2ast_identifier(state, tmp, &asname, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8693,13 +9529,14 @@ failed: } int -obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena) +obj2ast_withitem(astmodulestate *state, PyObject* obj, withitem_ty* out, + PyArena* arena) { PyObject* tmp = NULL; expr_ty context_expr; expr_ty optional_vars; - if (_PyObject_LookupAttrId(obj, &PyId_context_expr, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->context_expr, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8708,11 +9545,11 @@ obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &context_expr, arena); + res = obj2ast_expr(state, tmp, &context_expr, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_optional_vars, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->optional_vars, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8721,7 +9558,7 @@ obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &optional_vars, arena); + res = obj2ast_expr(state, tmp, &optional_vars, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8733,17 +9570,20 @@ failed: } int -obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) +obj2ast_type_ignore(astmodulestate *state, PyObject* obj, type_ignore_ty* out, + PyArena* arena) { int isinstance; PyObject *tmp = NULL; + PyObject *tp; if (obj == Py_None) { *out = NULL; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)TypeIgnore_type); + tp = state->TypeIgnore_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -8751,7 +9591,7 @@ obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) int lineno; string tag; - if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8760,11 +9600,11 @@ obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &lineno, arena); + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_tag, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->tag, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8773,7 +9613,7 @@ obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &tag, arena); + res = obj2ast_string(state, tmp, &tag, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8789,257 +9629,514 @@ obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) } +static int +astmodule_exec(PyObject *m) +{ + astmodulestate *state = get_ast_state(m); + + if (!init_types(state)) { + return -1; + } + if (PyModule_AddObject(m, "AST", state->AST_type) < 0) { + return -1; + } + Py_INCREF(state->AST_type); + if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) { + return -1; + } + if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) { + return -1; + } + if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) { + return -1; + } + if (PyModule_AddObject(m, "mod", state->mod_type) < 0) { + return -1; + } + Py_INCREF(state->mod_type); + if (PyModule_AddObject(m, "Module", state->Module_type) < 0) { + return -1; + } + Py_INCREF(state->Module_type); + if (PyModule_AddObject(m, "Interactive", state->Interactive_type) < 0) { + return -1; + } + Py_INCREF(state->Interactive_type); + if (PyModule_AddObject(m, "Expression", state->Expression_type) < 0) { + return -1; + } + Py_INCREF(state->Expression_type); + if (PyModule_AddObject(m, "FunctionType", state->FunctionType_type) < 0) { + return -1; + } + Py_INCREF(state->FunctionType_type); + if (PyModule_AddObject(m, "stmt", state->stmt_type) < 0) { + return -1; + } + Py_INCREF(state->stmt_type); + if (PyModule_AddObject(m, "FunctionDef", state->FunctionDef_type) < 0) { + return -1; + } + Py_INCREF(state->FunctionDef_type); + if (PyModule_AddObject(m, "AsyncFunctionDef", state->AsyncFunctionDef_type) + < 0) { + return -1; + } + Py_INCREF(state->AsyncFunctionDef_type); + if (PyModule_AddObject(m, "ClassDef", state->ClassDef_type) < 0) { + return -1; + } + Py_INCREF(state->ClassDef_type); + if (PyModule_AddObject(m, "Return", state->Return_type) < 0) { + return -1; + } + Py_INCREF(state->Return_type); + if (PyModule_AddObject(m, "Delete", state->Delete_type) < 0) { + return -1; + } + Py_INCREF(state->Delete_type); + if (PyModule_AddObject(m, "Assign", state->Assign_type) < 0) { + return -1; + } + Py_INCREF(state->Assign_type); + if (PyModule_AddObject(m, "AugAssign", state->AugAssign_type) < 0) { + return -1; + } + Py_INCREF(state->AugAssign_type); + if (PyModule_AddObject(m, "AnnAssign", state->AnnAssign_type) < 0) { + return -1; + } + Py_INCREF(state->AnnAssign_type); + if (PyModule_AddObject(m, "For", state->For_type) < 0) { + return -1; + } + Py_INCREF(state->For_type); + if (PyModule_AddObject(m, "AsyncFor", state->AsyncFor_type) < 0) { + return -1; + } + Py_INCREF(state->AsyncFor_type); + if (PyModule_AddObject(m, "While", state->While_type) < 0) { + return -1; + } + Py_INCREF(state->While_type); + if (PyModule_AddObject(m, "If", state->If_type) < 0) { + return -1; + } + Py_INCREF(state->If_type); + if (PyModule_AddObject(m, "With", state->With_type) < 0) { + return -1; + } + Py_INCREF(state->With_type); + if (PyModule_AddObject(m, "AsyncWith", state->AsyncWith_type) < 0) { + return -1; + } + Py_INCREF(state->AsyncWith_type); + if (PyModule_AddObject(m, "Raise", state->Raise_type) < 0) { + return -1; + } + Py_INCREF(state->Raise_type); + if (PyModule_AddObject(m, "Try", state->Try_type) < 0) { + return -1; + } + Py_INCREF(state->Try_type); + if (PyModule_AddObject(m, "Assert", state->Assert_type) < 0) { + return -1; + } + Py_INCREF(state->Assert_type); + if (PyModule_AddObject(m, "Import", state->Import_type) < 0) { + return -1; + } + Py_INCREF(state->Import_type); + if (PyModule_AddObject(m, "ImportFrom", state->ImportFrom_type) < 0) { + return -1; + } + Py_INCREF(state->ImportFrom_type); + if (PyModule_AddObject(m, "Global", state->Global_type) < 0) { + return -1; + } + Py_INCREF(state->Global_type); + if (PyModule_AddObject(m, "Nonlocal", state->Nonlocal_type) < 0) { + return -1; + } + Py_INCREF(state->Nonlocal_type); + if (PyModule_AddObject(m, "Expr", state->Expr_type) < 0) { + return -1; + } + Py_INCREF(state->Expr_type); + if (PyModule_AddObject(m, "Pass", state->Pass_type) < 0) { + return -1; + } + Py_INCREF(state->Pass_type); + if (PyModule_AddObject(m, "Break", state->Break_type) < 0) { + return -1; + } + Py_INCREF(state->Break_type); + if (PyModule_AddObject(m, "Continue", state->Continue_type) < 0) { + return -1; + } + Py_INCREF(state->Continue_type); + if (PyModule_AddObject(m, "expr", state->expr_type) < 0) { + return -1; + } + Py_INCREF(state->expr_type); + if (PyModule_AddObject(m, "BoolOp", state->BoolOp_type) < 0) { + return -1; + } + Py_INCREF(state->BoolOp_type); + if (PyModule_AddObject(m, "NamedExpr", state->NamedExpr_type) < 0) { + return -1; + } + Py_INCREF(state->NamedExpr_type); + if (PyModule_AddObject(m, "BinOp", state->BinOp_type) < 0) { + return -1; + } + Py_INCREF(state->BinOp_type); + if (PyModule_AddObject(m, "UnaryOp", state->UnaryOp_type) < 0) { + return -1; + } + Py_INCREF(state->UnaryOp_type); + if (PyModule_AddObject(m, "Lambda", state->Lambda_type) < 0) { + return -1; + } + Py_INCREF(state->Lambda_type); + if (PyModule_AddObject(m, "IfExp", state->IfExp_type) < 0) { + return -1; + } + Py_INCREF(state->IfExp_type); + if (PyModule_AddObject(m, "Dict", state->Dict_type) < 0) { + return -1; + } + Py_INCREF(state->Dict_type); + if (PyModule_AddObject(m, "Set", state->Set_type) < 0) { + return -1; + } + Py_INCREF(state->Set_type); + if (PyModule_AddObject(m, "ListComp", state->ListComp_type) < 0) { + return -1; + } + Py_INCREF(state->ListComp_type); + if (PyModule_AddObject(m, "SetComp", state->SetComp_type) < 0) { + return -1; + } + Py_INCREF(state->SetComp_type); + if (PyModule_AddObject(m, "DictComp", state->DictComp_type) < 0) { + return -1; + } + Py_INCREF(state->DictComp_type); + if (PyModule_AddObject(m, "GeneratorExp", state->GeneratorExp_type) < 0) { + return -1; + } + Py_INCREF(state->GeneratorExp_type); + if (PyModule_AddObject(m, "Await", state->Await_type) < 0) { + return -1; + } + Py_INCREF(state->Await_type); + if (PyModule_AddObject(m, "Yield", state->Yield_type) < 0) { + return -1; + } + Py_INCREF(state->Yield_type); + if (PyModule_AddObject(m, "YieldFrom", state->YieldFrom_type) < 0) { + return -1; + } + Py_INCREF(state->YieldFrom_type); + if (PyModule_AddObject(m, "Compare", state->Compare_type) < 0) { + return -1; + } + Py_INCREF(state->Compare_type); + if (PyModule_AddObject(m, "Call", state->Call_type) < 0) { + return -1; + } + Py_INCREF(state->Call_type); + if (PyModule_AddObject(m, "FormattedValue", state->FormattedValue_type) < + 0) { + return -1; + } + Py_INCREF(state->FormattedValue_type); + if (PyModule_AddObject(m, "JoinedStr", state->JoinedStr_type) < 0) { + return -1; + } + Py_INCREF(state->JoinedStr_type); + if (PyModule_AddObject(m, "Constant", state->Constant_type) < 0) { + return -1; + } + Py_INCREF(state->Constant_type); + if (PyModule_AddObject(m, "Attribute", state->Attribute_type) < 0) { + return -1; + } + Py_INCREF(state->Attribute_type); + if (PyModule_AddObject(m, "Subscript", state->Subscript_type) < 0) { + return -1; + } + Py_INCREF(state->Subscript_type); + if (PyModule_AddObject(m, "Starred", state->Starred_type) < 0) { + return -1; + } + Py_INCREF(state->Starred_type); + if (PyModule_AddObject(m, "Name", state->Name_type) < 0) { + return -1; + } + Py_INCREF(state->Name_type); + if (PyModule_AddObject(m, "List", state->List_type) < 0) { + return -1; + } + Py_INCREF(state->List_type); + if (PyModule_AddObject(m, "Tuple", state->Tuple_type) < 0) { + return -1; + } + Py_INCREF(state->Tuple_type); + if (PyModule_AddObject(m, "Slice", state->Slice_type) < 0) { + return -1; + } + Py_INCREF(state->Slice_type); + if (PyModule_AddObject(m, "expr_context", state->expr_context_type) < 0) { + return -1; + } + Py_INCREF(state->expr_context_type); + if (PyModule_AddObject(m, "Load", state->Load_type) < 0) { + return -1; + } + Py_INCREF(state->Load_type); + if (PyModule_AddObject(m, "Store", state->Store_type) < 0) { + return -1; + } + Py_INCREF(state->Store_type); + if (PyModule_AddObject(m, "Del", state->Del_type) < 0) { + return -1; + } + Py_INCREF(state->Del_type); + if (PyModule_AddObject(m, "boolop", state->boolop_type) < 0) { + return -1; + } + Py_INCREF(state->boolop_type); + if (PyModule_AddObject(m, "And", state->And_type) < 0) { + return -1; + } + Py_INCREF(state->And_type); + if (PyModule_AddObject(m, "Or", state->Or_type) < 0) { + return -1; + } + Py_INCREF(state->Or_type); + if (PyModule_AddObject(m, "operator", state->operator_type) < 0) { + return -1; + } + Py_INCREF(state->operator_type); + if (PyModule_AddObject(m, "Add", state->Add_type) < 0) { + return -1; + } + Py_INCREF(state->Add_type); + if (PyModule_AddObject(m, "Sub", state->Sub_type) < 0) { + return -1; + } + Py_INCREF(state->Sub_type); + if (PyModule_AddObject(m, "Mult", state->Mult_type) < 0) { + return -1; + } + Py_INCREF(state->Mult_type); + if (PyModule_AddObject(m, "MatMult", state->MatMult_type) < 0) { + return -1; + } + Py_INCREF(state->MatMult_type); + if (PyModule_AddObject(m, "Div", state->Div_type) < 0) { + return -1; + } + Py_INCREF(state->Div_type); + if (PyModule_AddObject(m, "Mod", state->Mod_type) < 0) { + return -1; + } + Py_INCREF(state->Mod_type); + if (PyModule_AddObject(m, "Pow", state->Pow_type) < 0) { + return -1; + } + Py_INCREF(state->Pow_type); + if (PyModule_AddObject(m, "LShift", state->LShift_type) < 0) { + return -1; + } + Py_INCREF(state->LShift_type); + if (PyModule_AddObject(m, "RShift", state->RShift_type) < 0) { + return -1; + } + Py_INCREF(state->RShift_type); + if (PyModule_AddObject(m, "BitOr", state->BitOr_type) < 0) { + return -1; + } + Py_INCREF(state->BitOr_type); + if (PyModule_AddObject(m, "BitXor", state->BitXor_type) < 0) { + return -1; + } + Py_INCREF(state->BitXor_type); + if (PyModule_AddObject(m, "BitAnd", state->BitAnd_type) < 0) { + return -1; + } + Py_INCREF(state->BitAnd_type); + if (PyModule_AddObject(m, "FloorDiv", state->FloorDiv_type) < 0) { + return -1; + } + Py_INCREF(state->FloorDiv_type); + if (PyModule_AddObject(m, "unaryop", state->unaryop_type) < 0) { + return -1; + } + Py_INCREF(state->unaryop_type); + if (PyModule_AddObject(m, "Invert", state->Invert_type) < 0) { + return -1; + } + Py_INCREF(state->Invert_type); + if (PyModule_AddObject(m, "Not", state->Not_type) < 0) { + return -1; + } + Py_INCREF(state->Not_type); + if (PyModule_AddObject(m, "UAdd", state->UAdd_type) < 0) { + return -1; + } + Py_INCREF(state->UAdd_type); + if (PyModule_AddObject(m, "USub", state->USub_type) < 0) { + return -1; + } + Py_INCREF(state->USub_type); + if (PyModule_AddObject(m, "cmpop", state->cmpop_type) < 0) { + return -1; + } + Py_INCREF(state->cmpop_type); + if (PyModule_AddObject(m, "Eq", state->Eq_type) < 0) { + return -1; + } + Py_INCREF(state->Eq_type); + if (PyModule_AddObject(m, "NotEq", state->NotEq_type) < 0) { + return -1; + } + Py_INCREF(state->NotEq_type); + if (PyModule_AddObject(m, "Lt", state->Lt_type) < 0) { + return -1; + } + Py_INCREF(state->Lt_type); + if (PyModule_AddObject(m, "LtE", state->LtE_type) < 0) { + return -1; + } + Py_INCREF(state->LtE_type); + if (PyModule_AddObject(m, "Gt", state->Gt_type) < 0) { + return -1; + } + Py_INCREF(state->Gt_type); + if (PyModule_AddObject(m, "GtE", state->GtE_type) < 0) { + return -1; + } + Py_INCREF(state->GtE_type); + if (PyModule_AddObject(m, "Is", state->Is_type) < 0) { + return -1; + } + Py_INCREF(state->Is_type); + if (PyModule_AddObject(m, "IsNot", state->IsNot_type) < 0) { + return -1; + } + Py_INCREF(state->IsNot_type); + if (PyModule_AddObject(m, "In", state->In_type) < 0) { + return -1; + } + Py_INCREF(state->In_type); + if (PyModule_AddObject(m, "NotIn", state->NotIn_type) < 0) { + return -1; + } + Py_INCREF(state->NotIn_type); + if (PyModule_AddObject(m, "comprehension", state->comprehension_type) < 0) { + return -1; + } + Py_INCREF(state->comprehension_type); + if (PyModule_AddObject(m, "excepthandler", state->excepthandler_type) < 0) { + return -1; + } + Py_INCREF(state->excepthandler_type); + if (PyModule_AddObject(m, "ExceptHandler", state->ExceptHandler_type) < 0) { + return -1; + } + Py_INCREF(state->ExceptHandler_type); + if (PyModule_AddObject(m, "arguments", state->arguments_type) < 0) { + return -1; + } + Py_INCREF(state->arguments_type); + if (PyModule_AddObject(m, "arg", state->arg_type) < 0) { + return -1; + } + Py_INCREF(state->arg_type); + if (PyModule_AddObject(m, "keyword", state->keyword_type) < 0) { + return -1; + } + Py_INCREF(state->keyword_type); + if (PyModule_AddObject(m, "alias", state->alias_type) < 0) { + return -1; + } + Py_INCREF(state->alias_type); + if (PyModule_AddObject(m, "withitem", state->withitem_type) < 0) { + return -1; + } + Py_INCREF(state->withitem_type); + if (PyModule_AddObject(m, "type_ignore", state->type_ignore_type) < 0) { + return -1; + } + Py_INCREF(state->type_ignore_type); + if (PyModule_AddObject(m, "TypeIgnore", state->TypeIgnore_type) < 0) { + return -1; + } + Py_INCREF(state->TypeIgnore_type); + return 0; +} + +static PyModuleDef_Slot astmodule_slots[] = { + {Py_mod_exec, astmodule_exec}, + {0, NULL} +}; + static struct PyModuleDef _astmodule = { - PyModuleDef_HEAD_INIT, "_ast" + PyModuleDef_HEAD_INIT, + .m_name = "_ast", + // The _ast module uses a global state (global_ast_state). + .m_size = 0, + .m_slots = astmodule_slots, }; + PyMODINIT_FUNC PyInit__ast(void) { - PyObject *m, *d; - if (!init_types()) return NULL; - m = PyModule_Create(&_astmodule); - if (!m) return NULL; - d = PyModule_GetDict(m); - if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL; - if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) - return NULL; - if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) - return NULL; - if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) - return NULL; - if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "FunctionType", (PyObject*)FunctionType_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL; - if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "AsyncFunctionDef", - (PyObject*)AsyncFunctionDef_type) < 0) return NULL; - if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL; - if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL; - if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL; - if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL; - if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "NamedExpr", (PyObject*)NamedExpr_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL; - if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL; - if (PyDict_SetItemString(d, "FormattedValue", - (PyObject*)FormattedValue_type) < 0) return NULL; - if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL; - if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL; - if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL; - if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL; - if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL; - if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL; - if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL; - if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL; - if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL; - if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL; - if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL; - if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL; - if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL; - if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type) - < 0) return NULL; - if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type) - < 0) return NULL; - if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type) - < 0) return NULL; - if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL; - if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "type_ignore", (PyObject*)type_ignore_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "TypeIgnore", (PyObject*)TypeIgnore_type) < 0) - return NULL; - return m; + return PyModuleDef_Init(&_astmodule); } PyObject* PyAST_mod2obj(mod_ty t) { - if (!init_types()) + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { return NULL; - return ast2obj_mod(t); + } + return ast2obj_mod(state, t); } /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) { - PyObject *req_type[3]; - char *req_name[] = {"Module", "Expression", "Interactive"}; + const char * const 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; + astmodulestate *state = get_global_ast_state(); + PyObject *req_type[3]; + req_type[0] = state->Module_type; + req_type[1] = state->Expression_type; + req_type[2] = state->Interactive_type; assert(0 <= mode && mode <= 2); - if (!init_types()) - return NULL; - isinstance = PyObject_IsInstance(ast, req_type[mode]); if (isinstance == -1) return NULL; if (!isinstance) { PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s", - req_name[mode], Py_TYPE(ast)->tp_name); + req_name[mode], _PyType_Name(Py_TYPE(ast))); return NULL; } mod_ty res = NULL; - if (obj2ast_mod(ast, &res, arena) != 0) + if (obj2ast_mod(state, ast, &res, arena) != 0) return NULL; else return res; @@ -9047,9 +10144,11 @@ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) int PyAST_Check(PyObject* obj) { - if (!init_types()) + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { return -1; - return PyObject_IsInstance(obj, (PyObject*)&AST_type); + } + return PyObject_IsInstance(obj, state->AST_type); } diff --git a/Python/_warnings.c b/Python/_warnings.c index 52a13dfc..4d65bb30 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -1,6 +1,9 @@ #include "Python.h" -#include "pycore_pystate.h" -#include "frameobject.h" +#include "pycore_initconfig.h" +#include "pycore_interp.h" // PyInterpreterState.warnings +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "frameobject.h" // PyFrame_GetBack() #include "clinic/_warnings.c.h" #define MODULE_NAME "_warnings" @@ -23,14 +26,17 @@ typedef struct _warnings_runtime_state WarningsState; /* Forward declaration of the _warnings module definition. */ static struct PyModuleDef warningsmodule; +_Py_IDENTIFIER(__name__); + /* Given a module object, get its per-module state. */ static WarningsState * -_Warnings_GetState() +warnings_get_state(void) { - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *tstate = _PyThreadState_GET(); if (tstate == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "_Warnings_GetState: could not identify current interpreter"); + _PyErr_SetString(tstate, PyExc_RuntimeError, + "warnings_get_state: could not identify " + "current interpreter"); return NULL; } return &tstate->interp->warnings; @@ -38,7 +44,7 @@ _Warnings_GetState() /* Clear the given warnings module state. */ static void -_Warnings_ClearState(WarningsState *st) +warnings_clear_state(WarningsState *st) { Py_CLEAR(st->filters); Py_CLEAR(st->once_registry); @@ -108,7 +114,7 @@ init_filters(void) /* Initialize the given warnings module state. */ static int -_Warnings_InitState(WarningsState *st) +warnings_init_state(WarningsState *st) { if (st->filters == NULL) { st->filters = init_filters(); @@ -136,7 +142,7 @@ _Warnings_InitState(WarningsState *st) return 0; error: - _Warnings_ClearState(st); + warnings_clear_state(st); return -1; } @@ -164,7 +170,7 @@ check_matched(PyObject *obj, PyObject *arg) } /* Otherwise assume a regex filter and call its match() method */ - result = _PyObject_CallMethodIdObjArgs(obj, &PyId_match, arg, NULL); + result = _PyObject_CallMethodIdOneArg(obj, &PyId_match, arg); if (result == NULL) return -1; @@ -206,7 +212,7 @@ get_warnings_attr(_Py_Identifier *attr_id, int try_import) gone, then we can't even use PyImport_GetModule without triggering an interpreter abort. */ - if (!_PyInterpreterState_GET_UNSAFE()->modules) { + if (!_PyInterpreterState_GET()->modules) { return NULL; } warnings_module = PyImport_GetModule(warnings_str); @@ -282,7 +288,7 @@ get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno, Py_ssize_t i; PyObject *warnings_filters; _Py_IDENTIFIER(filters); - WarningsState *st = _Warnings_GetState(); + WarningsState *st = warnings_get_state(); if (st == NULL) { return NULL; } @@ -384,7 +390,7 @@ already_warned(PyObject *registry, PyObject *key, int should_set) if (key == NULL) return -1; - WarningsState *st = _Warnings_GetState(); + WarningsState *st = warnings_get_state(); if (st == NULL) { return -1; } @@ -430,7 +436,7 @@ normalize_module(PyObject *filename) { PyObject *module; int kind; - void *data; + const void *data; Py_ssize_t len; len = PyUnicode_GetLength(filename); @@ -482,13 +488,13 @@ show_warning(PyObject *filename, int lineno, PyObject *text, PyObject *f_stderr; PyObject *name; char lineno_str[128]; - _Py_IDENTIFIER(__name__); PyOS_snprintf(lineno_str, sizeof(lineno_str), ":%d: ", lineno); name = _PyObject_GetAttrId(category, &PyId___name__); - if (name == NULL) /* XXX Can an object lack a '__name__' attribute? */ + if (name == NULL) { goto error; + } f_stderr = _PySys_GetObjectId(&PyId_stderr); if (f_stderr == NULL) { @@ -514,7 +520,7 @@ show_warning(PyObject *filename, int lineno, PyObject *text, /* Print " source_line\n" */ if (sourceline) { int kind; - void *data; + const void *data; Py_ssize_t i, len; Py_UCS4 ch; PyObject *truncated; @@ -590,7 +596,7 @@ call_show_warning(PyObject *category, PyObject *text, PyObject *message, if (msg == NULL) goto error; - res = PyObject_CallFunctionObjArgs(show_fn, msg, NULL); + res = PyObject_CallOneArg(show_fn, msg); Py_DECREF(show_fn); Py_DECREF(msg); @@ -647,11 +653,11 @@ warn_explicit(PyObject *category, PyObject *message, text = PyObject_Str(message); if (text == NULL) goto cleanup; - category = (PyObject*)message->ob_type; + category = (PyObject*)Py_TYPE(message); } else { text = message; - message = PyObject_CallFunctionObjArgs(category, message, NULL); + message = PyObject_CallOneArg(category, message); if (message == NULL) goto cleanup; } @@ -703,7 +709,7 @@ warn_explicit(PyObject *category, PyObject *message, if (_PyUnicode_EqualToASCIIString(action, "once")) { if (registry == NULL || registry == Py_None) { - WarningsState *st = _Warnings_GetState(); + WarningsState *st = warnings_get_state(); if (st == NULL) { goto cleanup; } @@ -756,7 +762,6 @@ is_internal_frame(PyFrameObject *frame) { static PyObject *importlib_string = NULL; static PyObject *bootstrap_string = NULL; - PyObject *filename; int contains; if (importlib_string == NULL) { @@ -774,14 +779,21 @@ is_internal_frame(PyFrameObject *frame) Py_INCREF(bootstrap_string); } - if (frame == NULL || frame->f_code == NULL || - frame->f_code->co_filename == NULL) { + if (frame == NULL) { + return 0; + } + + PyCodeObject *code = PyFrame_GetCode(frame); + PyObject *filename = code->co_filename; + Py_DECREF(code); + + if (filename == NULL) { return 0; } - filename = frame->f_code->co_filename; if (!PyUnicode_Check(filename)) { return 0; } + contains = PyUnicode_Contains(filename, importlib_string); if (contains < 0) { return 0; @@ -803,7 +815,9 @@ static PyFrameObject * next_external_frame(PyFrameObject *frame) { do { - frame = frame->f_back; + PyFrameObject *back = PyFrame_GetBack(frame); + Py_DECREF(frame); + frame = back; } while (frame != NULL && is_internal_frame(frame)); return frame; @@ -816,16 +830,18 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, PyObject **module, PyObject **registry) { _Py_IDENTIFIER(__warningregistry__); - _Py_IDENTIFIER(__name__); PyObject *globals; /* Setup globals, filename and lineno. */ - PyFrameObject *f = _PyThreadState_GET()->frame; + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *f = PyThreadState_GetFrame(tstate); // Stack level comparisons to Python code is off by one as there is no // warnings-related stack level to avoid. if (stack_level <= 0 || is_internal_frame(f)) { while (--stack_level > 0 && f != NULL) { - f = f->f_back; + PyFrameObject *back = PyFrame_GetBack(f); + Py_DECREF(f); + f = back; } } else { @@ -835,15 +851,18 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, } if (f == NULL) { - globals = _PyInterpreterState_GET_UNSAFE()->sysdict; + globals = _PyInterpreterState_GET()->sysdict; *filename = PyUnicode_FromString("sys"); *lineno = 1; } else { globals = f->f_globals; - *filename = f->f_code->co_filename; + PyCodeObject *code = PyFrame_GetCode(f); + *filename = code->co_filename; + Py_DECREF(code); Py_INCREF(*filename); *lineno = PyFrame_GetLineNumber(f); + Py_DECREF(f); } *module = NULL; @@ -855,7 +874,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, if (*registry == NULL) { int rc; - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { goto handle_error; } *registry = PyDict_New(); @@ -874,7 +893,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, if (*module == Py_None || (*module != NULL && PyUnicode_Check(*module))) { Py_INCREF(*module); } - else if (PyErr_Occurred()) { + else if (_PyErr_Occurred(tstate)) { goto handle_error; } else { @@ -903,7 +922,7 @@ get_category(PyObject *message, PyObject *category) return NULL; if (rc == 1) - category = (PyObject*)message->ob_type; + category = (PyObject*)Py_TYPE(message); else if (category == NULL || category == Py_None) category = PyExc_UserWarning; @@ -966,7 +985,6 @@ get_source_line(PyObject *module_globals, int lineno) { _Py_IDENTIFIER(get_source); _Py_IDENTIFIER(__loader__); - _Py_IDENTIFIER(__name__); PyObject *loader; PyObject *module_name; PyObject *get_source; @@ -995,7 +1013,7 @@ get_source_line(PyObject *module_globals, int lineno) return NULL; } /* Call get_source() to get the source code. */ - source = PyObject_CallFunctionObjArgs(get_source, module_name, NULL); + source = PyObject_CallOneArg(get_source, module_name); Py_DECREF(get_source); Py_DECREF(module_name); if (!source) { @@ -1064,7 +1082,7 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds) static PyObject * warnings_filters_mutated(PyObject *self, PyObject *args) { - WarningsState *st = _Warnings_GetState(); + WarningsState *st = warnings_get_state(); if (st == NULL) { return NULL; } @@ -1126,6 +1144,23 @@ PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, return res; } +static int +_PyErr_WarnFormat(PyObject *source, PyObject *category, Py_ssize_t stack_level, + const char *format, ...) +{ + int res; + va_list vargs; + +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, format); +#else + va_start(vargs); +#endif + res = _PyErr_WarnFormatV(source, category, stack_level, format, vargs); + va_end(vargs); + return res; +} + int PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level, const char *format, ...) @@ -1282,7 +1317,7 @@ _PyErr_WarnUnawaitedCoroutine(PyObject *coro) int warned = 0; PyObject *fn = get_warnings_attr(&PyId__warn_unawaited_coroutine, 1); if (fn) { - PyObject *res = PyObject_CallFunctionObjArgs(fn, coro, NULL); + PyObject *res = PyObject_CallOneArg(fn, coro); Py_DECREF(fn); if (res || PyErr_ExceptionMatches(PyExc_RuntimeWarning)) { warned = 1; @@ -1294,9 +1329,9 @@ _PyErr_WarnUnawaitedCoroutine(PyObject *coro) PyErr_WriteUnraisable(coro); } if (!warned) { - if (PyErr_WarnFormat(PyExc_RuntimeWarning, 1, - "coroutine '%.50S' was never awaited", - ((PyCoroObject *)coro)->cr_qualname) < 0) + if (_PyErr_WarnFormat(coro, PyExc_RuntimeWarning, 1, + "coroutine '%S' was never awaited", + ((PyCoroObject *)coro)->cr_qualname) < 0) { PyErr_WriteUnraisable(coro); } @@ -1331,6 +1366,16 @@ static struct PyModuleDef warningsmodule = { }; +PyStatus +_PyWarnings_InitState(PyThreadState *tstate) +{ + if (warnings_init_state(&tstate->interp->warnings) < 0) { + return _PyStatus_ERR("can't initialize warnings"); + } + return _PyStatus_OK(); +} + + PyMODINIT_FUNC _PyWarnings_Init(void) { @@ -1341,11 +1386,11 @@ _PyWarnings_Init(void) return NULL; } - WarningsState *st = _Warnings_GetState(); + WarningsState *st = warnings_get_state(); if (st == NULL) { goto error; } - if (_Warnings_InitState(st) < 0) { + if (warnings_init_state(st) < 0) { goto error; } @@ -1368,7 +1413,7 @@ _PyWarnings_Init(void) error: if (st != NULL) { - _Warnings_ClearState(st); + warnings_clear_state(st); } Py_DECREF(m); return NULL; @@ -1378,5 +1423,5 @@ error: void _PyWarnings_Fini(PyInterpreterState *interp) { - _Warnings_ClearState(&interp->warnings); + warnings_clear_state(&interp->warnings); } diff --git a/Python/ast.c b/Python/ast.c index 7c1d24de..c7ba4d9c 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -58,31 +58,6 @@ validate_comprehension(asdl_seq *gens) return 1; } -static int -validate_slice(slice_ty slice) -{ - switch (slice->kind) { - case Slice_kind: - return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) && - (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) && - (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load)); - case ExtSlice_kind: { - Py_ssize_t i; - if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice")) - return 0; - for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++) - if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i))) - return 0; - return 1; - } - case Index_kind: - return validate_expr(slice->v.Index.value, Load); - default: - PyErr_SetString(PyExc_SystemError, "unknown slice node"); - return 0; - } -} - static int validate_keywords(asdl_seq *keywords) { @@ -115,12 +90,6 @@ expr_context_name(expr_context_ty ctx) return "Store"; case Del: return "Del"; - case AugLoad: - return "AugLoad"; - case AugStore: - return "AugStore"; - case Param: - return "Param"; default: Py_UNREACHABLE(); } @@ -197,6 +166,11 @@ validate_constant(PyObject *value) return 1; } + if (!PyErr_Occurred()) { + PyErr_Format(PyExc_TypeError, + "got an invalid type in Constant: %s", + _PyType_Name(Py_TYPE(value))); + } return 0; } @@ -314,9 +288,6 @@ validate_expr(expr_ty exp, expr_context_ty ctx) validate_keywords(exp->v.Call.keywords); case Constant_kind: if (!validate_constant(exp->v.Constant.value)) { - PyErr_Format(PyExc_TypeError, - "got an invalid type in Constant: %s", - Py_TYPE(exp->v.Constant.value)->tp_name); return 0; } return 1; @@ -331,10 +302,14 @@ validate_expr(expr_ty exp, expr_context_ty ctx) case Attribute_kind: return validate_expr(exp->v.Attribute.value, Load); case Subscript_kind: - return validate_slice(exp->v.Subscript.slice) && + return validate_expr(exp->v.Subscript.slice, Load) && validate_expr(exp->v.Subscript.value, Load); case Starred_kind: return validate_expr(exp->v.Starred.value, ctx); + case Slice_kind: + return (!exp->v.Slice.lower || validate_expr(exp->v.Slice.lower, Load)) && + (!exp->v.Slice.upper || validate_expr(exp->v.Slice.upper, Load)) && + (!exp->v.Slice.step || validate_expr(exp->v.Slice.step, Load)); case List_kind: return validate_exprs(exp->v.List.elts, ctx, 0); case Tuple_kind: @@ -567,9 +542,6 @@ PyAST_Validate(mod_ty mod) case Expression_kind: res = validate_expr(mod->v.Expression.body, Load); break; - case Suite_kind: - PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler"); - break; default: PyErr_SetString(PyExc_SystemError, "impossible module node"); res = 0; @@ -640,12 +612,11 @@ new_identifier(const char *n, struct compiling *c) identifier; if so, normalize to NFKC. */ if (!PyUnicode_IS_ASCII(id)) { PyObject *id2; - _Py_IDENTIFIER(NFKC); if (!c->c_normalize && !init_normalization(c)) { Py_DECREF(id); return NULL; } - PyObject *form = _PyUnicode_FromId(&PyId_NFKC); + PyObject *form = PyUnicode_InternFromString("NFKC"); if (form == NULL) { Py_DECREF(id); return NULL; @@ -653,13 +624,14 @@ new_identifier(const char *n, struct compiling *c) PyObject *args[2] = {form, id}; id2 = _PyObject_FastCall(c->c_normalize, args, 2); Py_DECREF(id); + Py_DECREF(form); if (!id2) return NULL; if (!PyUnicode_Check(id2)) { PyErr_Format(PyExc_TypeError, "unicodedata.normalize() must return a string, not " "%.200s", - Py_TYPE(id2)->tp_name); + _PyType_Name(Py_TYPE(id2))); Py_DECREF(id2); return NULL; } @@ -777,11 +749,8 @@ num_stmts(const node *n) return l; } default: { - char buf[128]; - - sprintf(buf, "Non-statement found: %d %d", - TYPE(n), NCH(n)); - Py_FatalError(buf); + _Py_FatalErrorFormat(__func__, "Non-statement found: %d %d", + TYPE(n), NCH(n)); } } Py_UNREACHABLE(); @@ -1148,14 +1117,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n) { asdl_seq *s = NULL; - /* The ast defines augmented store and load contexts, but the - implementation here doesn't actually use them. The code may be - a little more complex than necessary as a result. It also means - that expressions in an augmented assignment have a Store context. - Consider restructuring so that augmented assignment uses - set_context(), too. - */ - assert(ctx != AugStore && ctx != AugLoad); + /* Expressions in an augmented assignment have a Store context. */ switch (e->kind) { case Attribute_kind: @@ -1714,80 +1676,16 @@ ast_for_arguments(struct compiling *c, const node *n) return arguments(posonlyargs, posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena); } -static expr_ty -ast_for_dotted_name(struct compiling *c, const node *n) -{ - expr_ty e; - identifier id; - int lineno, col_offset; - int i; - node *ch; - - REQ(n, dotted_name); - - lineno = LINENO(n); - col_offset = n->n_col_offset; - - ch = CHILD(n, 0); - id = NEW_IDENTIFIER(ch); - if (!id) - return NULL; - e = Name(id, Load, lineno, col_offset, - ch->n_end_lineno, ch->n_end_col_offset, c->c_arena); - if (!e) - return NULL; - - for (i = 2; i < NCH(n); i+=2) { - const node *child = CHILD(n, i); - id = NEW_IDENTIFIER(child); - if (!id) - return NULL; - e = Attribute(e, id, Load, lineno, col_offset, - child->n_end_lineno, child->n_end_col_offset, c->c_arena); - if (!e) - return NULL; - } - - return e; -} - static expr_ty ast_for_decorator(struct compiling *c, const node *n) { - /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */ - expr_ty d = NULL; - expr_ty name_expr; + /* decorator: '@' namedexpr_test NEWLINE */ REQ(n, decorator); REQ(CHILD(n, 0), AT); - REQ(RCHILD(n, -1), NEWLINE); - - name_expr = ast_for_dotted_name(c, CHILD(n, 1)); - if (!name_expr) - return NULL; - - if (NCH(n) == 3) { /* No arguments */ - d = name_expr; - name_expr = NULL; - } - else if (NCH(n) == 5) { /* Call with no arguments */ - d = Call(name_expr, NULL, NULL, - name_expr->lineno, name_expr->col_offset, - CHILD(n, 3)->n_end_lineno, CHILD(n, 3)->n_end_col_offset, - c->c_arena); - if (!d) - return NULL; - name_expr = NULL; - } - else { - d = ast_for_call(c, CHILD(n, 3), name_expr, - CHILD(n, 1), CHILD(n, 2), CHILD(n, 4)); - if (!d) - return NULL; - name_expr = NULL; - } + REQ(CHILD(n, 2), NEWLINE); - return d; + return ast_for_expr(c, CHILD(n, 1)); } static asdl_seq* @@ -2561,7 +2459,7 @@ ast_for_atom(struct compiling *c, const node *n) } } -static slice_ty +static expr_ty ast_for_slice(struct compiling *c, const node *n) { node *ch; @@ -2575,13 +2473,7 @@ ast_for_slice(struct compiling *c, const node *n) */ ch = CHILD(n, 0); if (NCH(n) == 1 && TYPE(ch) == test) { - /* 'step' variable hold no significance in terms of being used over - other vars */ - step = ast_for_expr(c, ch); - if (!step) - return NULL; - - return Index(step, c->c_arena); + return ast_for_expr(c, ch); } if (TYPE(ch) == test) { @@ -2623,7 +2515,8 @@ ast_for_slice(struct compiling *c, const node *n) } } - return Slice(lower, upper, step, c->c_arena); + return Slice(lower, upper, step, LINENO(n), n->n_col_offset, + n->n_end_lineno, n->n_end_col_offset, c->c_arena); } static expr_ty @@ -2711,7 +2604,7 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr, const nod REQ(CHILD(n, 2), RSQB); n = CHILD(n, 1); if (NCH(n) == 1) { - slice_ty slc = ast_for_slice(c, CHILD(n, 0)); + expr_ty slc = ast_for_slice(c, CHILD(n, 0)); if (!slc) return NULL; return Subscript(left_expr, slc, Load, LINENO(start), start->n_col_offset, @@ -2719,47 +2612,27 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr, const nod c->c_arena); } else { - /* The grammar is ambiguous here. The ambiguity is resolved - by treating the sequence as a tuple literal if there are - no slice features. - */ - Py_ssize_t j; - slice_ty slc; - expr_ty e; - int simple = 1; - asdl_seq *slices, *elts; - slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); - if (!slices) + int j; + expr_ty slc, e; + asdl_seq *elts; + elts = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + if (!elts) return NULL; for (j = 0; j < NCH(n); j += 2) { slc = ast_for_slice(c, CHILD(n, j)); if (!slc) return NULL; - if (slc->kind != Index_kind) - simple = 0; - asdl_seq_SET(slices, j / 2, slc); - } - if (!simple) { - return Subscript(left_expr, ExtSlice(slices, c->c_arena), - Load, LINENO(start), start->n_col_offset, - n_copy->n_end_lineno, n_copy->n_end_col_offset, c->c_arena); - } - /* extract Index values and put them in a Tuple */ - elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); - if (!elts) - return NULL; - for (j = 0; j < asdl_seq_LEN(slices); ++j) { - slc = (slice_ty)asdl_seq_GET(slices, j); - assert(slc->kind == Index_kind && slc->v.Index.value); - asdl_seq_SET(elts, j, slc->v.Index.value); + asdl_seq_SET(elts, j / 2, slc); } e = Tuple(elts, Load, LINENO(n), n->n_col_offset, - n->n_end_lineno, n->n_end_col_offset, c->c_arena); + n->n_end_lineno, n->n_end_col_offset, + c->c_arena); if (!e) return NULL; - return Subscript(left_expr, Index(e, c->c_arena), + return Subscript(left_expr, e, Load, LINENO(start), start->n_col_offset, - n_copy->n_end_lineno, n_copy->n_end_col_offset, c->c_arena); + n_copy->n_end_lineno, n_copy->n_end_col_offset, + c->c_arena); } } } @@ -3163,7 +3036,8 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, e = ast_for_expr(c, CHILD(ch, 1)); if (!e) return NULL; - kw = keyword(NULL, e, c->c_arena); + kw = keyword(NULL, e, chch->n_lineno, chch->n_col_offset, + e->end_lineno, e->end_col_offset, c->c_arena); asdl_seq_SET(keywords, nkeywords++, kw); ndoublestars++; } @@ -3197,8 +3071,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, else { /* a keyword argument */ keyword_ty kw; - identifier key, tmp; - int k; + identifier key; // To remain LL(1), the grammar accepts any test (basically, any // expression) in the keyword slot of a call site. So, we need @@ -3242,18 +3115,12 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, if (forbidden_name(c, key, chch, 1)) { return NULL; } - for (k = 0; k < nkeywords; k++) { - tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg; - if (tmp && !PyUnicode_Compare(tmp, key)) { - ast_error(c, chch, - "keyword argument repeated"); - return NULL; - } - } e = ast_for_expr(c, CHILD(ch, 2)); if (!e) return NULL; - kw = keyword(key, e, c->c_arena); + kw = keyword(key, e, chch->n_lineno, chch->n_col_offset, + e->end_lineno, e->end_col_offset, c->c_arena); + if (!kw) return NULL; asdl_seq_SET(keywords, nkeywords++, kw); @@ -3320,10 +3187,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n) expr1 = ast_for_testlist(c, ch); if (!expr1) return NULL; - if(!set_context(c, expr1, Store, ch)) - return NULL; - /* set_context checks that most expressions are not the left side. - Augmented assignments can only have a name, a subscript, or an + /* Augmented assignments can only have a name, a subscript, or an attribute on the left, though, so we have to explicitly check for those. */ switch (expr1->kind) { @@ -3332,10 +3196,16 @@ ast_for_expr_stmt(struct compiling *c, const node *n) case Subscript_kind: break; default: - ast_error(c, ch, "illegal expression for augmented assignment"); + ast_error(c, ch, "'%s' is an illegal expression for augmented assignment", + get_expr_name(expr1)); return NULL; } + /* set_context checks that most expressions are not the left side. */ + if(!set_context(c, expr1, Store, ch)) { + return NULL; + } + ch = CHILD(n, 2); if (TYPE(ch) == testlist) expr2 = ast_for_testlist(c, ch); @@ -3707,9 +3577,6 @@ alias_for_import_name(struct compiling *c, const node *n, int store) "unexpected import name: %d", TYPE(n)); return NULL; } - - PyErr_SetString(PyExc_SystemError, "unhandled import name condition"); - return NULL; } static stmt_ty @@ -4747,7 +4614,7 @@ decode_unicode_with_escapes(struct compiling *c, const node *n, const char *s, if (*s & 0x80) { /* XXX inefficient */ PyObject *w; int kind; - void *data; + const void *data; Py_ssize_t len, i; w = decode_utf8(c, &s, end); if (w == NULL) { @@ -4793,7 +4660,7 @@ decode_bytes_with_escapes(struct compiling *c, const node *n, const char *s, size_t len) { const char *first_invalid_escape; - PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, 0, NULL, + PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, &first_invalid_escape); if (result == NULL) return NULL; @@ -5289,7 +5156,7 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, *str += 1; /* If we're in = mode (detected by non-NULL expr_text), and have no format - spec and no explict conversion, set the conversion to 'r'. */ + spec and no explicit conversion, set the conversion to 'r'. */ if (*expr_text && format_spec == NULL && conversion == -1) { conversion = 'r'; } diff --git a/Python/ast_opt.c b/Python/ast_opt.c index f2a2c259..ff786d6f 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -19,6 +19,7 @@ make_const(expr_ty node, PyObject *val, PyArena *arena) return 0; } node->kind = Constant_kind; + node->v.Constant.kind = NULL; node->v.Constant.value = val; return 1; } @@ -35,7 +36,7 @@ unary_not(PyObject *v) } static int -fold_unaryop(expr_ty node, PyArena *arena, int optimize) +fold_unaryop(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) { expr_ty arg = node->v.UnaryOp.operand; @@ -212,7 +213,7 @@ safe_mod(PyObject *v, PyObject *w) } static int -fold_binop(expr_ty node, PyArena *arena, int optimize) +fold_binop(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) { expr_ty lhs, rhs; lhs = node->v.BinOp.left; @@ -294,7 +295,7 @@ make_const_tuple(asdl_seq *elts) } static int -fold_tuple(expr_ty node, PyArena *arena, int optimize) +fold_tuple(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) { PyObject *newval; @@ -306,24 +307,20 @@ fold_tuple(expr_ty node, PyArena *arena, int optimize) } static int -fold_subscr(expr_ty node, PyArena *arena, int optimize) +fold_subscr(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) { PyObject *newval; expr_ty arg, idx; - slice_ty slice; arg = node->v.Subscript.value; - slice = node->v.Subscript.slice; + idx = node->v.Subscript.slice; if (node->v.Subscript.ctx != Load || arg->kind != Constant_kind || - /* TODO: handle other types of slices */ - slice->kind != Index_kind || - slice->v.Index.value->kind != Constant_kind) + idx->kind != Constant_kind) { return 1; } - idx = slice->v.Index.value; newval = PyObject_GetItem(arg->v.Constant.value, idx->v.Constant.value); return make_const(node, newval, arena); } @@ -335,7 +332,7 @@ fold_subscr(expr_ty node, PyArena *arena, int optimize) in "for" loop and comprehensions. */ static int -fold_iter(expr_ty arg, PyArena *arena, int optimize) +fold_iter(expr_ty arg, PyArena *arena, _PyASTOptimizeState *state) { PyObject *newval; if (arg->kind == List_kind) { @@ -368,7 +365,7 @@ fold_iter(expr_ty arg, PyArena *arena, int optimize) } static int -fold_compare(expr_ty node, PyArena *arena, int optimize) +fold_compare(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) { asdl_int_seq *ops; asdl_seq *args; @@ -382,29 +379,28 @@ fold_compare(expr_ty node, PyArena *arena, int optimize) i = asdl_seq_LEN(ops) - 1; int op = asdl_seq_GET(ops, i); if (op == In || op == NotIn) { - if (!fold_iter((expr_ty)asdl_seq_GET(args, i), arena, optimize)) { + if (!fold_iter((expr_ty)asdl_seq_GET(args, i), arena, state)) { return 0; } } return 1; } -static int astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_); -static int astfold_stmt(stmt_ty node_, PyArena *ctx_, int optimize_); -static int astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_); -static int astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_); -static int astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_); -static int astfold_keyword(keyword_ty node_, PyArena *ctx_, int optimize_); -static int astfold_slice(slice_ty node_, PyArena *ctx_, int optimize_); -static int astfold_arg(arg_ty node_, PyArena *ctx_, int optimize_); -static int astfold_withitem(withitem_ty node_, PyArena *ctx_, int optimize_); -static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int optimize_); +static int astfold_mod(mod_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_expr(expr_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_arguments(arguments_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_comprehension(comprehension_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_keyword(keyword_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_arg(arg_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_withitem(withitem_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); #define CALL(FUNC, TYPE, ARG) \ - if (!FUNC((ARG), ctx_, optimize_)) \ + if (!FUNC((ARG), ctx_, state)) \ return 0; #define CALL_OPT(FUNC, TYPE, ARG) \ - if ((ARG) != NULL && !FUNC((ARG), ctx_, optimize_)) \ + if ((ARG) != NULL && !FUNC((ARG), ctx_, state)) \ return 0; #define CALL_SEQ(FUNC, TYPE, ARG) { \ @@ -412,7 +408,7 @@ static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int opti asdl_seq *seq = (ARG); /* avoid variable capture */ \ for (i = 0; i < asdl_seq_LEN(seq); i++) { \ TYPE elt = (TYPE)asdl_seq_GET(seq, i); \ - if (elt != NULL && !FUNC(elt, ctx_, optimize_)) \ + if (elt != NULL && !FUNC(elt, ctx_, state)) \ return 0; \ } \ } @@ -422,13 +418,13 @@ static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int opti asdl_int_seq *seq = (ARG); /* avoid variable capture */ \ for (i = 0; i < asdl_seq_LEN(seq); i++) { \ TYPE elt = (TYPE)asdl_seq_GET(seq, i); \ - if (!FUNC(elt, ctx_, optimize_)) \ + if (!FUNC(elt, ctx_, state)) \ return 0; \ } \ } static int -astfold_body(asdl_seq *stmts, PyArena *ctx_, int optimize_) +astfold_body(asdl_seq *stmts, PyArena *ctx_, _PyASTOptimizeState *state) { int docstring = _PyAST_GetDocString(stmts) != NULL; CALL_SEQ(astfold_stmt, stmt_ty, stmts); @@ -450,7 +446,7 @@ astfold_body(asdl_seq *stmts, PyArena *ctx_, int optimize_) } static int -astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_) +astfold_mod(mod_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { switch (node_->kind) { case Module_kind: @@ -462,9 +458,6 @@ astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_) case Expression_kind: CALL(astfold_expr, expr_ty, node_->v.Expression.body); break; - case Suite_kind: - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.Suite.body); - break; default: break; } @@ -472,7 +465,7 @@ astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_) +astfold_expr(expr_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { switch (node_->kind) { case BoolOp_kind: @@ -551,12 +544,17 @@ astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_) break; case Subscript_kind: CALL(astfold_expr, expr_ty, node_->v.Subscript.value); - CALL(astfold_slice, slice_ty, node_->v.Subscript.slice); + CALL(astfold_expr, expr_ty, node_->v.Subscript.slice); CALL(fold_subscr, expr_ty, node_); break; case Starred_kind: CALL(astfold_expr, expr_ty, node_->v.Starred.value); break; + case Slice_kind: + CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.lower); + CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.upper); + CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.step); + break; case List_kind: CALL_SEQ(astfold_expr, expr_ty, node_->v.List.elts); break; @@ -565,8 +563,9 @@ astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_) CALL(fold_tuple, expr_ty, node_); break; case Name_kind: - if (_PyUnicode_EqualToASCIIString(node_->v.Name.id, "__debug__")) { - return make_const(node_, PyBool_FromLong(!optimize_), ctx_); + if (node_->v.Name.ctx == Load && + _PyUnicode_EqualToASCIIString(node_->v.Name.id, "__debug__")) { + return make_const(node_, PyBool_FromLong(!state->optimize), ctx_); } break; default: @@ -576,35 +575,14 @@ astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_slice(slice_ty node_, PyArena *ctx_, int optimize_) -{ - switch (node_->kind) { - case Slice_kind: - CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.lower); - CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.upper); - CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.step); - break; - case ExtSlice_kind: - CALL_SEQ(astfold_slice, slice_ty, node_->v.ExtSlice.dims); - break; - case Index_kind: - CALL(astfold_expr, expr_ty, node_->v.Index.value); - break; - default: - break; - } - return 1; -} - -static int -astfold_keyword(keyword_ty node_, PyArena *ctx_, int optimize_) +astfold_keyword(keyword_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { CALL(astfold_expr, expr_ty, node_->value); return 1; } static int -astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_) +astfold_comprehension(comprehension_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { CALL(astfold_expr, expr_ty, node_->target); CALL(astfold_expr, expr_ty, node_->iter); @@ -615,7 +593,7 @@ astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_) +astfold_arguments(arguments_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { CALL_SEQ(astfold_arg, arg_ty, node_->posonlyargs); CALL_SEQ(astfold_arg, arg_ty, node_->args); @@ -628,27 +606,33 @@ astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_arg(arg_ty node_, PyArena *ctx_, int optimize_) +astfold_arg(arg_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { - CALL_OPT(astfold_expr, expr_ty, node_->annotation); + if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { + CALL_OPT(astfold_expr, expr_ty, node_->annotation); + } return 1; } static int -astfold_stmt(stmt_ty node_, PyArena *ctx_, int optimize_) +astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { switch (node_->kind) { case FunctionDef_kind: CALL(astfold_arguments, arguments_ty, node_->v.FunctionDef.args); CALL(astfold_body, asdl_seq, node_->v.FunctionDef.body); CALL_SEQ(astfold_expr, expr_ty, node_->v.FunctionDef.decorator_list); - CALL_OPT(astfold_expr, expr_ty, node_->v.FunctionDef.returns); + if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { + CALL_OPT(astfold_expr, expr_ty, node_->v.FunctionDef.returns); + } break; case AsyncFunctionDef_kind: CALL(astfold_arguments, arguments_ty, node_->v.AsyncFunctionDef.args); CALL(astfold_body, asdl_seq, node_->v.AsyncFunctionDef.body); CALL_SEQ(astfold_expr, expr_ty, node_->v.AsyncFunctionDef.decorator_list); - CALL_OPT(astfold_expr, expr_ty, node_->v.AsyncFunctionDef.returns); + if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { + CALL_OPT(astfold_expr, expr_ty, node_->v.AsyncFunctionDef.returns); + } break; case ClassDef_kind: CALL_SEQ(astfold_expr, expr_ty, node_->v.ClassDef.bases); @@ -672,7 +656,9 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, int optimize_) break; case AnnAssign_kind: CALL(astfold_expr, expr_ty, node_->v.AnnAssign.target); - CALL(astfold_expr, expr_ty, node_->v.AnnAssign.annotation); + if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { + CALL(astfold_expr, expr_ty, node_->v.AnnAssign.annotation); + } CALL_OPT(astfold_expr, expr_ty, node_->v.AnnAssign.value); break; case For_kind: @@ -731,7 +717,7 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int optimize_) +astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { switch (node_->kind) { case ExceptHandler_kind: @@ -745,7 +731,7 @@ astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_withitem(withitem_ty node_, PyArena *ctx_, int optimize_) +astfold_withitem(withitem_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { CALL(astfold_expr, expr_ty, node_->context_expr); CALL_OPT(astfold_expr, expr_ty, node_->optional_vars); @@ -758,9 +744,9 @@ astfold_withitem(withitem_ty node_, PyArena *ctx_, int optimize_) #undef CALL_INT_SEQ int -_PyAST_Optimize(mod_ty mod, PyArena *arena, int optimize) +_PyAST_Optimize(mod_ty mod, PyArena *arena, _PyASTOptimizeState *state) { - int ret = astfold_mod(mod, arena, optimize); + int ret = astfold_mod(mod, arena, state); assert(ret || PyErr_Occurred()); return ret; } diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index af9604eb..e699751a 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -1,3 +1,4 @@ +#include /* DBL_MAX_10_EXP */ #include #include "Python.h" #include "Python-ast.h" @@ -6,6 +7,8 @@ static PyObject *_str_open_br; static PyObject *_str_dbl_open_br; static PyObject *_str_close_br; static PyObject *_str_dbl_close_br; +static PyObject *_str_inf; +static PyObject *_str_replace_inf; /* Forward declarations for recursion via helper functions. */ static PyObject * @@ -15,9 +18,9 @@ append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level); static int append_joinedstr(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec); static int -append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec); +append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e); static int -append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice); +append_ast_slice(_PyUnicodeWriter *writer, expr_ty e); static int append_charp(_PyUnicodeWriter *writer, const char *charp) @@ -61,13 +64,28 @@ append_charp(_PyUnicodeWriter *writer, const char *charp) static int append_repr(_PyUnicodeWriter *writer, PyObject *obj) { - int ret; - PyObject *repr; - repr = PyObject_Repr(obj); + PyObject *repr = PyObject_Repr(obj); + if (!repr) { return -1; } - ret = _PyUnicodeWriter_WriteStr(writer, repr); + + if ((PyFloat_CheckExact(obj) && Py_IS_INFINITY(PyFloat_AS_DOUBLE(obj))) || + PyComplex_CheckExact(obj)) + { + PyObject *new_repr = PyUnicode_Replace( + repr, + _str_inf, + _str_replace_inf, + -1 + ); + Py_DECREF(repr); + if (!new_repr) { + return -1; + } + repr = new_repr; + } + int ret = _PyUnicodeWriter_WriteStr(writer, repr); Py_DECREF(repr); return ret; } @@ -583,7 +601,7 @@ append_fstring_element(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) case JoinedStr_kind: return append_joinedstr(writer, e, is_format_spec); case FormattedValue_kind: - return append_formattedvalue(writer, e, is_format_spec); + return append_formattedvalue(writer, e); default: PyErr_SetString(PyExc_SystemError, "unknown expression kind inside f-string"); @@ -640,7 +658,7 @@ append_joinedstr(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) } static int -append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) +append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e) { const char *conversion; const char *outer_brace = "{"; @@ -697,6 +715,28 @@ append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) APPEND_STR_FINISH("}"); } +static int +append_ast_constant(_PyUnicodeWriter *writer, PyObject *constant) +{ + if (PyTuple_CheckExact(constant)) { + Py_ssize_t i, elem_count; + + elem_count = PyTuple_GET_SIZE(constant); + APPEND_STR("("); + for (i = 0; i < elem_count; i++) { + APPEND_STR_IF(i > 0, ", "); + if (append_ast_constant(writer, PyTuple_GET_ITEM(constant, i)) < 0) { + return -1; + } + } + + APPEND_STR_IF(elem_count == 1, ","); + APPEND_STR(")"); + return 0; + } + return append_repr(writer, constant); +} + static int append_ast_attribute(_PyUnicodeWriter *writer, expr_ty e) { @@ -718,79 +758,42 @@ append_ast_attribute(_PyUnicodeWriter *writer, expr_ty e) } static int -append_ast_simple_slice(_PyUnicodeWriter *writer, slice_ty slice) +append_ast_slice(_PyUnicodeWriter *writer, expr_ty e) { - if (slice->v.Slice.lower) { - APPEND_EXPR(slice->v.Slice.lower, PR_TEST); + if (e->v.Slice.lower) { + APPEND_EXPR(e->v.Slice.lower, PR_TEST); } APPEND_STR(":"); - if (slice->v.Slice.upper) { - APPEND_EXPR(slice->v.Slice.upper, PR_TEST); + if (e->v.Slice.upper) { + APPEND_EXPR(e->v.Slice.upper, PR_TEST); } - if (slice->v.Slice.step) { + if (e->v.Slice.step) { APPEND_STR(":"); - APPEND_EXPR(slice->v.Slice.step, PR_TEST); - } - return 0; -} - -static int -append_ast_ext_slice(_PyUnicodeWriter *writer, slice_ty slice) -{ - Py_ssize_t i, dims_count; - dims_count = asdl_seq_LEN(slice->v.ExtSlice.dims); - for (i = 0; i < dims_count; i++) { - APPEND_STR_IF(i > 0, ", "); - APPEND(slice, (slice_ty)asdl_seq_GET(slice->v.ExtSlice.dims, i)); + APPEND_EXPR(e->v.Slice.step, PR_TEST); } - APPEND_STR_IF(dims_count == 1, ","); return 0; } static int -append_ast_index_slice(_PyUnicodeWriter *writer, slice_ty slice) +append_ast_subscript(_PyUnicodeWriter *writer, expr_ty e) { + APPEND_EXPR(e->v.Subscript.value, PR_ATOM); int level = PR_TUPLE; - expr_ty value = slice->v.Index.value; - if (value->kind == Tuple_kind) { - for (Py_ssize_t i = 0; i < asdl_seq_LEN(value->v.Tuple.elts); i++) { - expr_ty element = asdl_seq_GET(value->v.Tuple.elts, i); + expr_ty slice = e->v.Subscript.slice; + if (slice->kind == Tuple_kind) { + for (Py_ssize_t i = 0; i < asdl_seq_LEN(slice->v.Tuple.elts); i++) { + expr_ty element = asdl_seq_GET(slice->v.Tuple.elts, i); if (element->kind == Starred_kind) { ++level; break; } } } - APPEND_EXPR(value, level); - return 0; -} - -static int -append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice) -{ - switch (slice->kind) { - case Slice_kind: - return append_ast_simple_slice(writer, slice); - case ExtSlice_kind: - return append_ast_ext_slice(writer, slice); - case Index_kind: - return append_ast_index_slice(writer, slice); - default: - PyErr_SetString(PyExc_SystemError, - "unexpected slice kind"); - return -1; - } -} - -static int -append_ast_subscript(_PyUnicodeWriter *writer, expr_ty e) -{ - APPEND_EXPR(e->v.Subscript.value, PR_ATOM); APPEND_STR("["); - APPEND(slice, e->v.Subscript.slice); + APPEND_EXPR(e->v.Subscript.slice, level); APPEND_STR_FINISH("]"); } @@ -837,7 +840,7 @@ append_named_expr(_PyUnicodeWriter *writer, expr_ty e, int level) { APPEND_STR_IF(level > PR_TUPLE, "("); APPEND_EXPR(e->v.NamedExpr.target, PR_ATOM); - APPEND_STR(":="); + APPEND_STR(" := "); APPEND_EXPR(e->v.NamedExpr.value, PR_ATOM); APPEND_STR_IF(level > PR_TUPLE, ")"); return 0; @@ -883,11 +886,15 @@ append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level) if (e->v.Constant.value == Py_Ellipsis) { APPEND_STR_FINISH("..."); } - return append_repr(writer, e->v.Constant.value); + if (e->v.Constant.kind != NULL + && -1 == _PyUnicodeWriter_WriteStr(writer, e->v.Constant.kind)) { + return -1; + } + return append_ast_constant(writer, e->v.Constant.value); case JoinedStr_kind: return append_joinedstr(writer, e, false); case FormattedValue_kind: - return append_formattedvalue(writer, e, false); + return append_formattedvalue(writer, e); /* The following exprs can be assignment targets. */ case Attribute_kind: return append_ast_attribute(writer, e); @@ -895,6 +902,8 @@ append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level) return append_ast_subscript(writer, e); case Starred_kind: return append_ast_starred(writer, e); + case Slice_kind: + return append_ast_slice(writer, e); case Name_kind: return _PyUnicodeWriter_WriteStr(writer, e->v.Name.id); case List_kind: @@ -929,6 +938,14 @@ maybe_init_static_strings(void) !(_str_dbl_close_br = PyUnicode_InternFromString("}}"))) { return -1; } + if (!_str_inf && + !(_str_inf = PyUnicode_FromString("inf"))) { + return -1; + } + if (!_str_replace_inf && + !(_str_replace_inf = PyUnicode_FromFormat("1e%d", 1 + DBL_MAX_10_EXP))) { + return -1; + } return 0; } diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index e42d5f24..199b09c4 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -4,7 +4,9 @@ #include #include "ast.h" #undef Yield /* undefine macro conflicting with */ -#include "pycore_pystate.h" +#include "pycore_object.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tupleobject.h" _Py_IDENTIFIER(__builtins__); @@ -29,7 +31,6 @@ update_bases(PyObject *bases, PyObject *const *args, Py_ssize_t nargs) { Py_ssize_t i, j; PyObject *base, *meth, *new_base, *result, *new_bases = NULL; - PyObject *stack[1] = {bases}; assert(PyTuple_Check(bases)); for (i = 0; i < nargs; i++) { @@ -55,7 +56,7 @@ update_bases(PyObject *bases, PyObject *const *args, Py_ssize_t nargs) } continue; } - new_base = _PyObject_FastCall(meth, stack, 1); + new_base = PyObject_CallOneArg(meth, bases); Py_DECREF(meth); if (!new_base) { goto error; @@ -169,7 +170,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, /* else get the type of the first base */ else { PyObject *base0 = PyTuple_GET_ITEM(bases, 0); - meta = (PyObject *) (base0->ob_type); + meta = (PyObject *)Py_TYPE(base0); } Py_INCREF(meta); isclass = 1; /* meta is really a class */ @@ -202,7 +203,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, } else { PyObject *pargs[2] = {name, bases}; - ns = _PyObject_FastCallDict(prep, pargs, 2, mkw); + ns = PyObject_VectorcallDict(prep, pargs, 2, mkw); Py_DECREF(prep); } if (ns == NULL) { @@ -228,7 +229,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, } } PyObject *margs[3] = {name, bases, ns}; - cls = _PyObject_FastCallDict(meta, margs, 3, mkw); + cls = PyObject_VectorcallDict(meta, margs, 3, mkw); if (cls != NULL && PyType_Check(cls) && PyCell_Check(cell)) { PyObject *cell_cls = PyCell_GET(cell); if (cell_cls != cls) { @@ -488,7 +489,7 @@ builtin_breakpoint(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb } Py_INCREF(hook); - PyObject *retval = _PyObject_Vectorcall(hook, args, nargs, keywords); + PyObject *retval = PyObject_Vectorcall(hook, args, nargs, keywords); Py_DECREF(hook); return retval; } @@ -574,7 +575,7 @@ filter_next(filterobject *lz) ok = PyObject_IsTrue(item); } else { PyObject *good; - good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; @@ -816,6 +817,7 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, goto error; result = Py_CompileStringObject(str, filename, start[compile_mode], &cf, optimize); + Py_XDECREF(source_copy); goto finally; @@ -1001,13 +1003,13 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, if (!PyDict_Check(globals)) { PyErr_Format(PyExc_TypeError, "exec() globals must be a dict, not %.100s", - globals->ob_type->tp_name); + Py_TYPE(globals)->tp_name); return NULL; } if (!PyMapping_Check(locals)) { PyErr_Format(PyExc_TypeError, "locals must be a mapping or None, not %.100s", - locals->ob_type->tp_name); + Py_TYPE(locals)->tp_name); return NULL; } if (_PyDict_GetItemIdWithError(globals, &PyId___builtins__) == NULL) { @@ -1255,23 +1257,23 @@ map_next(mapobject *lz) { PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; PyObject **stack; - Py_ssize_t niters, nargs, i; PyObject *result = NULL; + PyThreadState *tstate = _PyThreadState_GET(); - niters = PyTuple_GET_SIZE(lz->iters); + const Py_ssize_t niters = PyTuple_GET_SIZE(lz->iters); if (niters <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { stack = small_stack; } else { stack = PyMem_Malloc(niters * sizeof(stack[0])); if (stack == NULL) { - PyErr_NoMemory(); + _PyErr_NoMemory(tstate); return NULL; } } - nargs = 0; - for (i=0; i < niters; i++) { + Py_ssize_t nargs = 0; + for (Py_ssize_t i=0; i < niters; i++) { PyObject *it = PyTuple_GET_ITEM(lz->iters, i); PyObject *val = Py_TYPE(it)->tp_iternext(it); if (val == NULL) { @@ -1281,10 +1283,10 @@ map_next(mapobject *lz) nargs++; } - result = _PyObject_FastCall(lz->func, stack, nargs); + result = _PyObject_VectorcallTstate(tstate, lz->func, stack, nargs, NULL); exit: - for (i=0; i < nargs; i++) { + for (Py_ssize_t i=0; i < nargs; i++) { Py_DECREF(stack[i]); } if (stack != small_stack) { @@ -1382,11 +1384,11 @@ builtin_next(PyObject *self, PyObject *const *args, Py_ssize_t nargs) if (!PyIter_Check(it)) { PyErr_Format(PyExc_TypeError, "'%.200s' object is not an iterator", - it->ob_type->tp_name); + Py_TYPE(it)->tp_name); return NULL; } - res = (*it->ob_type->tp_iternext)(it); + res = (*Py_TYPE(it)->tp_iternext)(it); if (res != NULL) { return res; } else if (nargs > 1) { @@ -1589,10 +1591,15 @@ min_max(PyObject *args, PyObject *kwds, int op) const int positional = PyTuple_Size(args) > 1; int ret; - if (positional) + if (positional) { v = args; - else if (!PyArg_UnpackTuple(args, name, 1, 1, &v)) + } + else if (!PyArg_UnpackTuple(args, name, 1, 1, &v)) { + if (PyExceptionClass_Check(PyExc_TypeError)) { + PyErr_Format(PyExc_TypeError, "%s expected at least 1 argument, got 0", name); + } return NULL; + } emptytuple = PyTuple_New(0); if (emptytuple == NULL) @@ -1625,7 +1632,7 @@ min_max(PyObject *args, PyObject *kwds, int op) while (( item = PyIter_Next(it) )) { /* get the value from the key function */ if (keyfunc != NULL) { - val = PyObject_CallFunctionObjArgs(keyfunc, item, NULL); + val = PyObject_CallOneArg(keyfunc, item); if (val == NULL) goto Fail_it_item; } @@ -1782,7 +1789,7 @@ builtin_ord(PyObject *module, PyObject *c) else { PyErr_Format(PyExc_TypeError, "ord() expected string of length 1, but " \ - "%.200s found", c->ob_type->tp_name); + "%.200s found", Py_TYPE(c)->tp_name); return NULL; } @@ -1821,8 +1828,9 @@ static PyObject * builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { static const char * const _keywords[] = {"sep", "end", "file", "flush", 0}; - static struct _PyArg_Parser _parser = {"|OOOO:print", _keywords, 0}; - PyObject *sep = NULL, *end = NULL, *file = NULL, *flush = NULL; + static struct _PyArg_Parser _parser = {"|OOOp:print", _keywords, 0}; + PyObject *sep = NULL, *end = NULL, *file = NULL; + int flush = 0; int i, err; if (kwnames != NULL && @@ -1849,7 +1857,7 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject else if (sep && !PyUnicode_Check(sep)) { PyErr_Format(PyExc_TypeError, "sep must be None or a string, not %.200s", - sep->ob_type->tp_name); + Py_TYPE(sep)->tp_name); return NULL; } if (end == Py_None) { @@ -1858,7 +1866,7 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject else if (end && !PyUnicode_Check(end)) { PyErr_Format(PyExc_TypeError, "end must be None or a string, not %.200s", - end->ob_type->tp_name); + Py_TYPE(end)->tp_name); return NULL; } @@ -1884,18 +1892,11 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject if (err) return NULL; - if (flush != NULL) { - PyObject *tmp; - int do_flush = PyObject_IsTrue(flush); - if (do_flush == -1) + if (flush) { + PyObject *tmp = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); + if (tmp == NULL) return NULL; - else if (do_flush) { - tmp = _PyObject_CallMethodId(file, &PyId_flush, NULL); - if (tmp == NULL) - return NULL; - else - Py_DECREF(tmp); - } + Py_DECREF(tmp); } Py_RETURN_NONE; @@ -1960,7 +1961,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) } /* First of all, flush stderr */ - tmp = _PyObject_CallMethodId(ferr, &PyId_flush, NULL); + tmp = _PyObject_CallMethodIdNoArgs(ferr, &PyId_flush); if (tmp == NULL) PyErr_Clear(); else @@ -1969,7 +1970,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) /* We should only use (GNU) readline if Python's sys.stdin and sys.stdout are the same as C's stdin and stdout, because we need to pass it those. */ - tmp = _PyObject_CallMethodId(fin, &PyId_fileno, NULL); + tmp = _PyObject_CallMethodIdNoArgs(fin, &PyId_fileno); if (tmp == NULL) { PyErr_Clear(); tty = 0; @@ -1982,7 +1983,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) tty = fd == fileno(stdin) && isatty(fd); } if (tty) { - tmp = _PyObject_CallMethodId(fout, &PyId_fileno, NULL); + tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_fileno); if (tmp == NULL) { PyErr_Clear(); tty = 0; @@ -2020,7 +2021,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) stdin_errors_str = PyUnicode_AsUTF8(stdin_errors); if (!stdin_encoding_str || !stdin_errors_str) goto _readline_errors; - tmp = _PyObject_CallMethodId(fout, &PyId_flush, NULL); + tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_flush); if (tmp == NULL) PyErr_Clear(); else @@ -2115,7 +2116,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) if (PyFile_WriteObject(prompt, fout, Py_PRINT_RAW) != 0) return NULL; } - tmp = _PyObject_CallMethodId(fout, &PyId_flush, NULL); + tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_flush); if (tmp == NULL) PyErr_Clear(); else @@ -2178,7 +2179,7 @@ builtin_round_impl(PyObject *module, PyObject *number, PyObject *ndigits) if (ndigits == Py_None) result = _PyObject_CallNoArg(round); else - result = PyObject_CallFunctionObjArgs(round, ndigits, NULL); + result = PyObject_CallOneArg(round, ndigits); Py_DECREF(round); return result; } @@ -2234,7 +2235,7 @@ builtin_sorted(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject } assert(nargs >= 1); - v = _PyObject_Vectorcall(callable, args + 1, nargs - 1, kwnames); + v = PyObject_Vectorcall(callable, args + 1, nargs - 1, kwnames); Py_DECREF(callable); if (v == NULL) { Py_DECREF(newlist); @@ -2349,7 +2350,7 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) return NULL; return PyLong_FromLong(i_result); } - if (PyLong_CheckExact(item)) { + if (PyLong_CheckExact(item) || PyBool_Check(item)) { long b = PyLong_AsLongAndOverflow(item, &overflow); if (overflow == 0 && (i_result >= 0 ? (b <= LONG_MAX - i_result) @@ -2391,20 +2392,16 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) return PyFloat_FromDouble(f_result); } if (PyFloat_CheckExact(item)) { - PyFPE_START_PROTECT("add", Py_DECREF(item); Py_DECREF(iter); return 0) f_result += PyFloat_AS_DOUBLE(item); - PyFPE_END_PROTECT(f_result) Py_DECREF(item); continue; } - if (PyLong_CheckExact(item)) { + if (PyLong_Check(item)) { long value; int overflow; value = PyLong_AsLongAndOverflow(item, &overflow); if (!overflow) { - PyFPE_START_PROTECT("add", Py_DECREF(item); Py_DECREF(iter); return 0) f_result += (double)value; - PyFPE_END_PROTECT(f_result) Py_DECREF(item); continue; } @@ -2445,7 +2442,11 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) empty = [] sum([[x] for x in range(10)], empty) - would change the value of empty. */ + would change the value of empty. In fact, using + in-place addition rather that binary addition for + any of the steps introduces subtle behavior changes: + + https://bugs.python.org/issue18305 */ temp = PyNumber_Add(result, item); Py_DECREF(result); Py_DECREF(item); @@ -2769,11 +2770,11 @@ static struct PyModuleDef builtinsmodule = { PyObject * -_PyBuiltin_Init(void) +_PyBuiltin_Init(PyThreadState *tstate) { PyObject *mod, *dict, *debug; - const PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); if (PyType_Ready(&PyFilter_Type) < 0 || PyType_Ready(&PyMap_Type) < 0 || diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c index eb2b6d08..47369305 100644 --- a/Python/bootstrap_hash.c +++ b/Python/bootstrap_hash.c @@ -163,7 +163,7 @@ py_getrandom(void *buffer, Py_ssize_t size, int blocking, int raise) } /* getrandom(GRND_NONBLOCK) fails with EAGAIN if the system urandom - is not initialiazed yet. For _PyRandom_Init(), we ignore the + is not initialized yet. For _PyRandom_Init(), we ignore the error and fall back on reading /dev/urandom which never blocks, even if the system urandom is not initialized yet: see the PEP 524. */ @@ -580,7 +580,7 @@ _Py_HashRandomization_Init(const PyConfig *config) res = pyurandom(secret, secret_size, 0, 0); if (res < 0) { return _PyStatus_ERR("failed to get random numbers " - "to initialize Python"); + "to initialize Python"); } } return _PyStatus_OK(); diff --git a/Python/ceval.c b/Python/ceval.c index 1873e37c..3392cd03 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -10,12 +10,17 @@ #define PY_LOCAL_AGGRESSIVE #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_call.h" #include "pycore_ceval.h" #include "pycore_code.h" +#include "pycore_initconfig.h" #include "pycore_object.h" #include "pycore_pyerrors.h" #include "pycore_pylifecycle.h" -#include "pycore_pystate.h" +#include "pycore_pymem.h" // _PyMem_IsPtrFreed() +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "pycore_sysmodule.h" #include "pycore_tupleobject.h" #include "code.h" @@ -24,7 +29,6 @@ #include "opcode.h" #include "pydtrace.h" #include "setobject.h" -#include "structmember.h" #include @@ -38,10 +42,7 @@ # error "ceval.c must be build with Py_BUILD_CORE define for best performance" #endif -/* Private API for the LOAD_METHOD opcode. */ -extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **); - -typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *); +_Py_IDENTIFIER(__name__); /* Forward declarations */ Py_LOCAL_INLINE(PyObject *) call_function( @@ -70,7 +71,6 @@ static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *); static void dtrace_function_entry(PyFrameObject *); static void dtrace_function_return(PyFrameObject *); -static PyObject * cmp_outcome(PyThreadState *, int, PyObject *, PyObject *); static PyObject * import_name(PyThreadState *, PyFrameObject *, PyObject *, PyObject *, PyObject *); static PyObject * import_from(PyThreadState *, PyObject *, PyObject *); @@ -82,7 +82,7 @@ static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *, static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *); static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg); static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs); -static void format_awaitable_error(PyThreadState *, PyTypeObject *, int); +static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int); #define NAME_ERROR_MSG \ "name '%.200s' is not defined" @@ -122,129 +122,194 @@ static size_t opcache_global_hits = 0; static size_t opcache_global_misses = 0; #endif -#define GIL_REQUEST _Py_atomic_load_relaxed(&ceval->gil_drop_request) + +#ifndef NDEBUG +/* Ensure that tstate is valid: sanity check for PyEval_AcquireThread() and + PyEval_RestoreThread(). Detect if tstate memory was freed. It can happen + when a thread continues to run after Python finalization, especially + daemon threads. */ +static int +is_tstate_valid(PyThreadState *tstate) +{ + assert(!_PyMem_IsPtrFreed(tstate)); + assert(!_PyMem_IsPtrFreed(tstate->interp)); + return 1; +} +#endif + /* This can set eval_breaker to 0 even though gil_drop_request became 1. We believe this is all right because the eval loop will release the GIL eventually anyway. */ -#define COMPUTE_EVAL_BREAKER(ceval) \ - _Py_atomic_store_relaxed( \ - &(ceval)->eval_breaker, \ - GIL_REQUEST | \ - _Py_atomic_load_relaxed(&(ceval)->signals_pending) | \ - _Py_atomic_load_relaxed(&(ceval)->pending.calls_to_do) | \ - (ceval)->pending.async_exc) - -#define SET_GIL_DROP_REQUEST(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 1); \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ - } while (0) +static inline void +COMPUTE_EVAL_BREAKER(PyInterpreterState *interp, + struct _ceval_runtime_state *ceval, + struct _ceval_state *ceval2) +{ + _Py_atomic_store_relaxed(&ceval2->eval_breaker, + _Py_atomic_load_relaxed(&ceval2->gil_drop_request) + | (_Py_atomic_load_relaxed(&ceval->signals_pending) + && _Py_ThreadCanHandleSignals(interp)) + | (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do) + && _Py_ThreadCanHandlePendingCalls()) + | ceval2->pending.async_exc); +} -#define RESET_GIL_DROP_REQUEST(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 0); \ - COMPUTE_EVAL_BREAKER(ceval); \ - } while (0) -/* Pending calls are only modified under pending_lock */ -#define SIGNAL_PENDING_CALLS(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 1); \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ - } while (0) +static inline void +SET_GIL_DROP_REQUEST(PyInterpreterState *interp) +{ + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 1); + _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1); +} -#define UNSIGNAL_PENDING_CALLS(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 0); \ - COMPUTE_EVAL_BREAKER(ceval); \ - } while (0) -#define SIGNAL_PENDING_SIGNALS(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->signals_pending, 1); \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ - } while (0) +static inline void +RESET_GIL_DROP_REQUEST(PyInterpreterState *interp) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 0); + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); +} -#define UNSIGNAL_PENDING_SIGNALS(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->signals_pending, 0); \ - COMPUTE_EVAL_BREAKER(ceval); \ - } while (0) -#define SIGNAL_ASYNC_EXC(ceval) \ - do { \ - (ceval)->pending.async_exc = 1; \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ - } while (0) +static inline void +SIGNAL_PENDING_CALLS(PyInterpreterState *interp) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 1); + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); +} -#define UNSIGNAL_ASYNC_EXC(ceval) \ - do { \ - (ceval)->pending.async_exc = 0; \ - COMPUTE_EVAL_BREAKER(ceval); \ - } while (0) + +static inline void +UNSIGNAL_PENDING_CALLS(PyInterpreterState *interp) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 0); + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); +} + + +static inline void +SIGNAL_PENDING_SIGNALS(PyInterpreterState *interp) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval->signals_pending, 1); + /* eval_breaker is not set to 1 if thread_can_handle_signals() is false */ + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); +} + + +static inline void +UNSIGNAL_PENDING_SIGNALS(PyInterpreterState *interp) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval->signals_pending, 0); + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); +} + + +static inline void +SIGNAL_ASYNC_EXC(PyInterpreterState *interp) +{ + struct _ceval_state *ceval2 = &interp->ceval; + ceval2->pending.async_exc = 1; + _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1); +} + + +static inline void +UNSIGNAL_ASYNC_EXC(PyInterpreterState *interp) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + ceval2->pending.async_exc = 0; + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); +} #ifdef HAVE_ERRNO_H #include #endif -#include "pythread.h" #include "ceval_gil.h" +void _Py_NO_RETURN +_Py_FatalError_TstateNULL(const char *func) +{ + _Py_FatalErrorFunc(func, + "the function must be called with the GIL held, " + "but the GIL is released " + "(the current Python thread state is NULL)"); +} + + int -PyEval_ThreadsInitialized(void) +_PyEval_ThreadsInitialized(_PyRuntimeState *runtime) { - return gil_created(&_PyRuntime.ceval.gil); + return gil_created(&runtime->ceval.gil); } -void -PyEval_InitThreads(void) +int +PyEval_ThreadsInitialized(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; - struct _gil_runtime_state *gil = &ceval->gil; - if (gil_created(gil)) { - return; + return _PyEval_ThreadsInitialized(runtime); +} + +PyStatus +_PyEval_InitGIL(PyThreadState *tstate) +{ + if (!_Py_IsMainInterpreter(tstate)) { + /* Currently, the GIL is shared by all interpreters, + and only the main interpreter is responsible to create + and destroy it. */ + return _PyStatus_OK(); } + struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil; + assert(!gil_created(gil)); + PyThread_init_thread(); create_gil(gil); - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - take_gil(ceval, tstate); - struct _pending_calls *pending = &ceval->pending; - pending->lock = PyThread_allocate_lock(); - if (pending->lock == NULL) { - Py_FatalError("Can't initialize threads for pending calls"); - } + take_gil(tstate); + + assert(gil_created(gil)); + return _PyStatus_OK(); } void -_PyEval_FiniThreads(struct _ceval_runtime_state *ceval) +_PyEval_FiniGIL(PyThreadState *tstate) { - struct _gil_runtime_state *gil = &ceval->gil; + if (!_Py_IsMainInterpreter(tstate)) { + /* Currently, the GIL is shared by all interpreters, + and only the main interpreter is responsible to create + and destroy it. */ + return; + } + + struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil; if (!gil_created(gil)) { + /* First Py_InitializeFromConfig() call: the GIL doesn't exist + yet: do nothing. */ return; } destroy_gil(gil); assert(!gil_created(gil)); - - struct _pending_calls *pending = &ceval->pending; - if (pending->lock != NULL) { - PyThread_free_lock(pending->lock); - pending->lock = NULL; - } } -static inline void -exit_thread_if_finalizing(_PyRuntimeState *runtime, PyThreadState *tstate) +void +PyEval_InitThreads(void) { - /* _Py_Finalizing is protected by the GIL */ - if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) { - drop_gil(&runtime->ceval, tstate); - PyThread_exit_thread(); - } + /* Do nothing: kept for backward compatibility */ } void @@ -280,13 +345,10 @@ void PyEval_AcquireLock(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - if (tstate == NULL) { - Py_FatalError("PyEval_AcquireLock: current thread state is NULL"); - } - take_gil(ceval, tstate); - exit_thread_if_finalizing(runtime, tstate); + _Py_EnsureTstateNotNULL(tstate); + + take_gil(tstate); } void @@ -296,45 +358,49 @@ PyEval_ReleaseLock(void) PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); /* This function must succeed when the current thread state is NULL. We therefore avoid PyThreadState_Get() which dumps a fatal error - in debug mode. - */ - drop_gil(&runtime->ceval, tstate); + in debug mode. */ + struct _ceval_runtime_state *ceval = &runtime->ceval; + struct _ceval_state *ceval2 = &tstate->interp->ceval; + drop_gil(ceval, ceval2, tstate); +} + +void +_PyEval_ReleaseLock(PyThreadState *tstate) +{ + struct _ceval_runtime_state *ceval = &tstate->interp->runtime->ceval; + struct _ceval_state *ceval2 = &tstate->interp->ceval; + drop_gil(ceval, ceval2, tstate); } void PyEval_AcquireThread(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("PyEval_AcquireThread: NULL new thread state"); - } + _Py_EnsureTstateNotNULL(tstate); - _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; + take_gil(tstate); - /* Check someone has called PyEval_InitThreads() to create the lock */ - assert(gil_created(&ceval->gil)); - take_gil(ceval, tstate); - exit_thread_if_finalizing(runtime, tstate); - if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { - Py_FatalError("PyEval_AcquireThread: non-NULL old thread state"); + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; + if (_PyThreadState_Swap(gilstate, tstate) != NULL) { + Py_FatalError("non-NULL old thread state"); } } void PyEval_ReleaseThread(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("PyEval_ReleaseThread: NULL thread state"); - } + assert(is_tstate_valid(tstate)); - _PyRuntimeState *runtime = &_PyRuntime; + _PyRuntimeState *runtime = tstate->interp->runtime; PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); if (new_tstate != tstate) { - Py_FatalError("PyEval_ReleaseThread: wrong thread state"); + Py_FatalError("wrong thread state"); } - drop_gil(&runtime->ceval, tstate); + struct _ceval_runtime_state *ceval = &runtime->ceval; + struct _ceval_state *ceval2 = &tstate->interp->ceval; + drop_gil(ceval, ceval2, tstate); } +#ifdef HAVE_FORK /* This function is called from PyOS_AfterFork_Child to destroy all threads * which are not running in the child process, and clear internal locks * which might be held by those threads. @@ -343,64 +409,60 @@ PyEval_ReleaseThread(PyThreadState *tstate) void _PyEval_ReInitThreads(_PyRuntimeState *runtime) { - struct _ceval_runtime_state *ceval = &runtime->ceval; - if (!gil_created(&ceval->gil)) { + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + _Py_EnsureTstateNotNULL(tstate); + + struct _gil_runtime_state *gil = &runtime->ceval.gil; + if (!gil_created(gil)) { return; } - recreate_gil(&ceval->gil); - PyThreadState *current_tstate = _PyRuntimeState_GetThreadState(runtime); - take_gil(ceval, current_tstate); + recreate_gil(gil); - struct _pending_calls *pending = &ceval->pending; - pending->lock = PyThread_allocate_lock(); - if (pending->lock == NULL) { + take_gil(tstate); + + struct _pending_calls *pending = &tstate->interp->ceval.pending; + if (_PyThread_at_fork_reinit(&pending->lock) < 0) { Py_FatalError("Can't initialize threads for pending calls"); } /* Destroy all threads except the current one */ - _PyThreadState_DeleteExcept(runtime, current_tstate); + _PyThreadState_DeleteExcept(runtime, tstate); } +#endif /* This function is used to signal that async exceptions are waiting to be raised. */ void -_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval) +_PyEval_SignalAsyncExc(PyThreadState *tstate) { - SIGNAL_ASYNC_EXC(ceval); + assert(is_tstate_valid(tstate)); + SIGNAL_ASYNC_EXC(tstate->interp); } PyThreadState * PyEval_SaveThread(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); - if (tstate == NULL) { - Py_FatalError("PyEval_SaveThread: NULL tstate"); - } + _Py_EnsureTstateNotNULL(tstate); + + struct _ceval_runtime_state *ceval = &runtime->ceval; + struct _ceval_state *ceval2 = &tstate->interp->ceval; assert(gil_created(&ceval->gil)); - drop_gil(ceval, tstate); + drop_gil(ceval, ceval2, tstate); return tstate; } void PyEval_RestoreThread(PyThreadState *tstate) { - _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; - - if (tstate == NULL) { - Py_FatalError("PyEval_RestoreThread: NULL tstate"); - } - assert(gil_created(&ceval->gil)); + _Py_EnsureTstateNotNULL(tstate); - int err = errno; - take_gil(ceval, tstate); - exit_thread_if_finalizing(runtime, tstate); - errno = err; + take_gil(tstate); - _PyThreadState_Swap(&runtime->gilstate, tstate); + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; + _PyThreadState_Swap(gilstate, tstate); } @@ -427,12 +489,12 @@ PyEval_RestoreThread(PyThreadState *tstate) */ void -_PyEval_SignalReceived(struct _ceval_runtime_state *ceval) +_PyEval_SignalReceived(PyInterpreterState *interp) { /* bpo-30703: Function called when the C signal handler of Python gets a - signal. We cannot queue a callback using Py_AddPendingCall() since + signal. We cannot queue a callback using _PyEval_AddPendingCall() since that function is not async-signal-safe. */ - SIGNAL_PENDING_SIGNALS(ceval); + SIGNAL_PENDING_SIGNALS(interp); } /* Push one item onto the queue while holding the lock. */ @@ -472,91 +534,96 @@ _pop_pending_call(struct _pending_calls *pending, */ int -_PyEval_AddPendingCall(PyThreadState *tstate, - struct _ceval_runtime_state *ceval, +_PyEval_AddPendingCall(PyInterpreterState *interp, int (*func)(void *), void *arg) { - struct _pending_calls *pending = &ceval->pending; + struct _pending_calls *pending = &interp->ceval.pending; - PyThread_acquire_lock(pending->lock, WAIT_LOCK); - if (pending->finishing) { - PyThread_release_lock(pending->lock); + /* Ensure that _PyEval_InitPendingCalls() was called + and that _PyEval_FiniPendingCalls() is not called yet. */ + assert(pending->lock != NULL); - PyObject *exc, *val, *tb; - _PyErr_Fetch(tstate, &exc, &val, &tb); - _PyErr_SetString(tstate, PyExc_SystemError, - "Py_AddPendingCall: cannot add pending calls " - "(Python shutting down)"); - _PyErr_Print(tstate); - _PyErr_Restore(tstate, exc, val, tb); - return -1; - } + PyThread_acquire_lock(pending->lock, WAIT_LOCK); int result = _push_pending_call(pending, func, arg); PyThread_release_lock(pending->lock); /* signal main loop */ - SIGNAL_PENDING_CALLS(ceval); + SIGNAL_PENDING_CALLS(interp); return result; } int Py_AddPendingCall(int (*func)(void *), void *arg) { - _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - return _PyEval_AddPendingCall(tstate, &runtime->ceval, func, arg); + /* Best-effort to support subinterpreters and calls with the GIL released. + + First attempt _PyThreadState_GET() since it supports subinterpreters. + + If the GIL is released, _PyThreadState_GET() returns NULL . In this + case, use PyGILState_GetThisThreadState() which works even if the GIL + is released. + + Sadly, PyGILState_GetThisThreadState() doesn't support subinterpreters: + see bpo-10915 and bpo-15751. + + Py_AddPendingCall() doesn't require the caller to hold the GIL. */ + PyThreadState *tstate = _PyThreadState_GET(); + if (tstate == NULL) { + tstate = PyGILState_GetThisThreadState(); + } + + PyInterpreterState *interp; + if (tstate != NULL) { + interp = tstate->interp; + } + else { + /* Last resort: use the main interpreter */ + interp = _PyRuntime.interpreters.main; + } + return _PyEval_AddPendingCall(interp, func, arg); } static int -handle_signals(_PyRuntimeState *runtime) +handle_signals(PyThreadState *tstate) { - /* Only handle signals on main thread. PyEval_InitThreads must - * have been called already. - */ - if (PyThread_get_thread_ident() != runtime->main_thread) { - return 0; - } - /* - * Ensure that the thread isn't currently running some other - * interpreter. - */ - PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; - if (interp != runtime->interpreters.main) { + assert(is_tstate_valid(tstate)); + if (!_Py_ThreadCanHandleSignals(tstate->interp)) { return 0; } - struct _ceval_runtime_state *ceval = &runtime->ceval; - UNSIGNAL_PENDING_SIGNALS(ceval); - if (_PyErr_CheckSignals() < 0) { - SIGNAL_PENDING_SIGNALS(ceval); /* We're not done yet */ + UNSIGNAL_PENDING_SIGNALS(tstate->interp); + if (_PyErr_CheckSignalsTstate(tstate) < 0) { + /* On failure, re-schedule a call to handle_signals(). */ + SIGNAL_PENDING_SIGNALS(tstate->interp); return -1; } return 0; } static int -make_pending_calls(_PyRuntimeState *runtime) +make_pending_calls(PyThreadState *tstate) { - static int busy = 0; + assert(is_tstate_valid(tstate)); - /* only service pending calls on main thread */ - if (PyThread_get_thread_ident() != runtime->main_thread) { + /* only execute pending calls on main thread */ + if (!_Py_ThreadCanHandlePendingCalls()) { return 0; } /* don't perform recursive pending calls */ + static int busy = 0; if (busy) { return 0; } busy = 1; - struct _ceval_runtime_state *ceval = &runtime->ceval; + /* unsignal before starting to call callbacks, so that any callback added in-between re-signals */ - UNSIGNAL_PENDING_CALLS(ceval); + UNSIGNAL_PENDING_CALLS(tstate->interp); int res = 0; /* perform a bounded number of calls, in case of recursion */ - struct _pending_calls *pending = &ceval->pending; + struct _pending_calls *pending = &tstate->interp->ceval.pending; for (int i=0; iinterp); return res; } void -_Py_FinishPendingCalls(_PyRuntimeState *runtime) +_Py_FinishPendingCalls(PyThreadState *tstate) { assert(PyGILState_Check()); - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - struct _pending_calls *pending = &runtime->ceval.pending; - - PyThread_acquire_lock(pending->lock, WAIT_LOCK); - pending->finishing = 1; - PyThread_release_lock(pending->lock); + struct _pending_calls *pending = &tstate->interp->ceval.pending; if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) { return; } - if (make_pending_calls(runtime) < 0) { + if (make_pending_calls(tstate) < 0) { PyObject *exc, *val, *tb; _PyErr_Fetch(tstate, &exc, &val, &tb); PyErr_BadInternalCall(); @@ -617,15 +679,16 @@ Py_MakePendingCalls(void) { assert(PyGILState_Check()); + PyThreadState *tstate = _PyThreadState_GET(); + /* Python signal handler doesn't really queue a callback: it only signals that a signal was received, see _PyEval_SignalReceived(). */ - _PyRuntimeState *runtime = &_PyRuntime; - int res = handle_signals(runtime); + int res = handle_signals(tstate); if (res != 0) { return res; } - res = make_pending_calls(runtime); + res = make_pending_calls(tstate); if (res != 0) { return res; } @@ -642,38 +705,64 @@ Py_MakePendingCalls(void) int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; void -_PyEval_Initialize(struct _ceval_runtime_state *state) +_PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval) { - state->recursion_limit = Py_DEFAULT_RECURSION_LIMIT; _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; - _gil_initialize(&state->gil); + _gil_initialize(&ceval->gil); +} + +int +_PyEval_InitState(struct _ceval_state *ceval) +{ + ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT; + + struct _pending_calls *pending = &ceval->pending; + assert(pending->lock == NULL); + + pending->lock = PyThread_allocate_lock(); + if (pending->lock == NULL) { + return -1; + } + + return 0; +} + +void +_PyEval_FiniState(struct _ceval_state *ceval) +{ + struct _pending_calls *pending = &ceval->pending; + if (pending->lock != NULL) { + PyThread_free_lock(pending->lock); + pending->lock = NULL; + } } int Py_GetRecursionLimit(void) { - return _PyRuntime.ceval.recursion_limit; + PyThreadState *tstate = _PyThreadState_GET(); + return tstate->interp->ceval.recursion_limit; } void Py_SetRecursionLimit(int new_limit) { - struct _ceval_runtime_state *ceval = &_PyRuntime.ceval; - ceval->recursion_limit = new_limit; - _Py_CheckRecursionLimit = ceval->recursion_limit; + PyThreadState *tstate = _PyThreadState_GET(); + tstate->interp->ceval.recursion_limit = new_limit; + if (_Py_IsMainInterpreter(tstate)) { + _Py_CheckRecursionLimit = new_limit; + } } -/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() +/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() if the recursion_depth reaches _Py_CheckRecursionLimit. If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit to guarantee that _Py_CheckRecursiveCall() is regularly called. Without USE_STACKCHECK, there is no need for this. */ int -_Py_CheckRecursiveCall(const char *where) +_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where) { - _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - int recursion_limit = runtime->ceval.recursion_limit; + int recursion_limit = tstate->interp->ceval.recursion_limit; #ifdef USE_STACKCHECK tstate->stackcheck_counter = 0; @@ -682,8 +771,10 @@ _Py_CheckRecursiveCall(const char *where) _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow"); return -1; } - /* Needed for ABI backwards-compatibility (see bpo-31857) */ - _Py_CheckRecursionLimit = recursion_limit; + if (_Py_IsMainInterpreter(tstate)) { + /* Needed for ABI backwards-compatibility (see bpo-31857) */ + _Py_CheckRecursionLimit = recursion_limit; + } #endif if (tstate->recursion_critical) /* Somebody asked that we don't check for recursion. */ @@ -727,23 +818,79 @@ PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) /* Interpreter main loop */ PyObject * -PyEval_EvalFrame(PyFrameObject *f) { - /* This is for backward compatibility with extension modules that - used this API; core interpreter code should call - PyEval_EvalFrameEx() */ - return PyEval_EvalFrameEx(f, 0); +PyEval_EvalFrame(PyFrameObject *f) +{ + /* Function kept for backward compatibility */ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyEval_EvalFrame(tstate, f, 0); } PyObject * PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - return interp->eval_frame(f, throwflag); + PyThreadState *tstate = _PyThreadState_GET(); + return _PyEval_EvalFrame(tstate, f, throwflag); +} + + +/* Handle signals, pending calls, GIL drop request + and asynchronous exception */ +static int +eval_frame_handle_pending(PyThreadState *tstate) +{ + _PyRuntimeState * const runtime = &_PyRuntime; + struct _ceval_runtime_state *ceval = &runtime->ceval; + + /* Pending signals */ + if (_Py_atomic_load_relaxed(&ceval->signals_pending)) { + if (handle_signals(tstate) != 0) { + return -1; + } + } + + /* Pending calls */ + struct _ceval_state *ceval2 = &tstate->interp->ceval; + if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) { + if (make_pending_calls(tstate) != 0) { + return -1; + } + } + + /* GIL drop request */ + if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) { + /* Give another thread a chance */ + if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) { + Py_FatalError("tstate mix-up"); + } + drop_gil(ceval, ceval2, tstate); + + /* Other threads may run now */ + + take_gil(tstate); + + if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { + Py_FatalError("orphan tstate"); + } + } + + /* Check for asynchronous exception. */ + if (tstate->async_exc != NULL) { + PyObject *exc = tstate->async_exc; + tstate->async_exc = NULL; + UNSIGNAL_ASYNC_EXC(tstate->interp); + _PyErr_SetNone(tstate, exc); + Py_DECREF(exc); + return -1; + } + + return 0; } PyObject* _Py_HOT_FUNCTION -_PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) +_PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) { + _Py_EnsureTstateNotNULL(tstate); + #ifdef DXPAIRS int lastopcode = 0; #endif @@ -753,10 +900,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) int oparg; /* Current opcode argument, if any */ PyObject **fastlocals, **freevars; PyObject *retval = NULL; /* Return value */ - _PyRuntimeState * const runtime = &_PyRuntime; - PyThreadState * const tstate = _PyRuntimeState_GetThreadState(runtime); - struct _ceval_runtime_state * const ceval = &runtime->ceval; - _Py_atomic_int * const eval_breaker = &ceval->eval_breaker; + struct _ceval_state * const ceval2 = &tstate->interp->ceval; + _Py_atomic_int * const eval_breaker = &ceval2->eval_breaker; PyCodeObject *co; /* when tracing we set things up so that @@ -844,7 +989,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #ifdef LLTRACE #define FAST_DISPATCH() \ { \ - if (!lltrace && !_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \ + if (!lltrace && !_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \ f->f_lasti = INSTR_OFFSET(); \ NEXTOPARG(); \ goto *opcode_targets[opcode]; \ @@ -854,7 +999,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #else #define FAST_DISPATCH() \ { \ - if (!_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \ + if (!_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \ f->f_lasti = INSTR_OFFSET(); \ NEXTOPARG(); \ goto *opcode_targets[opcode]; \ @@ -926,21 +1071,23 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) */ +#define PREDICT_ID(op) PRED_##op + #if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS -#define PREDICT(op) if (0) goto PRED_##op +#define PREDICT(op) if (0) goto PREDICT_ID(op) #else #define PREDICT(op) \ - do{ \ + do { \ _Py_CODEUNIT word = *next_instr; \ opcode = _Py_OPCODE(word); \ - if (opcode == op){ \ + if (opcode == op) { \ oparg = _Py_OPARG(word); \ next_instr++; \ - goto PRED_##op; \ + goto PREDICT_ID(op); \ } \ } while(0) #endif -#define PREDICTED(op) PRED_##op: +#define PREDICTED(op) PREDICT_ID(op): /* Stack manipulation macros */ @@ -1077,8 +1224,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* Start of code */ /* push frame */ - if (Py_EnterRecursiveCall("")) + if (_Py_EnterRecursiveCall(tstate, "")) { return NULL; + } tstate->frame = f; @@ -1178,7 +1326,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) goto error; #ifdef Py_DEBUG - /* PyEval_EvalFrameEx() must not be called with an exception set, + /* _PyEval_EvalFrameDefault() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ assert(!_PyErr_Occurred(tstate)); @@ -1193,7 +1341,7 @@ main_loop: /* Do periodic things. Doing this every time through the loop would add too much overhead, so we do it only every Nth instruction. We also do it if - ``pendingcalls_to_do'' is set, i.e. when an asynchronous + ``pending.calls_to_do'' is set, i.e. when an asynchronous event needs attention (e.g. a signal handler or async I/O handler); see Py_AddPendingCall() and Py_MakePendingCalls() above. */ @@ -1223,42 +1371,7 @@ main_loop: goto fast_next_opcode; } - if (_Py_atomic_load_relaxed(&ceval->signals_pending)) { - if (handle_signals(runtime) != 0) { - goto error; - } - } - if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) { - if (make_pending_calls(runtime) != 0) { - goto error; - } - } - - if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) { - /* Give another thread a chance */ - if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) { - Py_FatalError("ceval: tstate mix-up"); - } - drop_gil(ceval, tstate); - - /* Other threads may run now */ - - take_gil(ceval, tstate); - - /* Check if we should make a quick exit. */ - exit_thread_if_finalizing(runtime, tstate); - - if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { - Py_FatalError("ceval: orphan tstate"); - } - } - /* Check for asynchronous exceptions. */ - if (tstate->async_exc != NULL) { - PyObject *exc = tstate->async_exc; - tstate->async_exc = NULL; - UNSIGNAL_ASYNC_EXC(ceval); - _PyErr_SetNone(tstate, exc); - Py_DECREF(exc); + if (eval_frame_handle_pending(tstate) != 0) { goto error; } } @@ -1271,7 +1384,7 @@ main_loop: /* line-by-line tracing support */ - if (_Py_TracingPossible(ceval) && + if (_Py_TracingPossible(ceval2) && tstate->c_tracefunc != NULL && !tstate->tracing) { int err; /* see maybe_call_line_trace @@ -1878,7 +1991,7 @@ main_loop: Py_DECREF(value); goto error; } - res = PyObject_CallFunctionObjArgs(hook, value, NULL); + res = PyObject_CallOneArg(hook, value); Py_DECREF(value); if (res == NULL) goto error; @@ -1911,7 +2024,8 @@ main_loop: case TARGET(RETURN_VALUE): { retval = POP(); assert(f->f_iblock == 0); - goto exit_returning; + assert(EMPTY()); + goto exiting; } case TARGET(GET_AITER): { @@ -2015,7 +2129,12 @@ main_loop: PyObject *iter = _PyCoro_GetAwaitableIter(iterable); if (iter == NULL) { + int opcode_at_minus_3 = 0; + if ((next_instr - first_instr) > 2) { + opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]); + } format_awaitable_error(tstate, Py_TYPE(iterable), + opcode_at_minus_3, _Py_OPCODE(next_instr[-2])); } @@ -2056,7 +2175,7 @@ main_loop: if (v == Py_None) retval = Py_TYPE(receiver)->tp_iternext(receiver); else - retval = _PyObject_CallMethodIdObjArgs(receiver, &PyId_send, v, NULL); + retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v); } Py_DECREF(v); if (retval == NULL) { @@ -2076,7 +2195,7 @@ main_loop: /* and repeat... */ assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT)); f->f_lasti -= sizeof(_Py_CODEUNIT); - goto exit_yielding; + goto exiting; } case TARGET(YIELD_VALUE): { @@ -2093,7 +2212,7 @@ main_loop: } f->f_stacktop = stack_pointer; - goto exit_yielding; + goto exiting; } case TARGET(POP_EXCEPT): { @@ -2126,104 +2245,13 @@ main_loop: DISPATCH(); } - case TARGET(POP_FINALLY): { - /* If oparg is 0 at the top of the stack are 1 or 6 values: - Either: - - TOP = NULL or an integer - or: - - (TOP, SECOND, THIRD) = exc_info() - - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER - - If oparg is 1 the value for 'return' was additionally pushed - at the top of the stack. - */ - PyObject *res = NULL; - if (oparg) { - res = POP(); - } - PyObject *exc = POP(); - if (exc == NULL || PyLong_CheckExact(exc)) { - Py_XDECREF(exc); - } - else { - Py_DECREF(exc); - Py_DECREF(POP()); - Py_DECREF(POP()); - - PyObject *type, *value, *traceback; - _PyErr_StackItem *exc_info; - PyTryBlock *b = PyFrame_BlockPop(f); - if (b->b_type != EXCEPT_HANDLER) { - _PyErr_SetString(tstate, PyExc_SystemError, - "popped block is not an except handler"); - Py_XDECREF(res); - goto error; - } - assert(STACK_LEVEL() == (b)->b_level + 3); - exc_info = tstate->exc_info; - type = exc_info->exc_type; - value = exc_info->exc_value; - traceback = exc_info->exc_traceback; - exc_info->exc_type = POP(); - exc_info->exc_value = POP(); - exc_info->exc_traceback = POP(); - Py_XDECREF(type); - Py_XDECREF(value); - Py_XDECREF(traceback); - } - if (oparg) { - PUSH(res); - } - DISPATCH(); - } - - case TARGET(CALL_FINALLY): { - PyObject *ret = PyLong_FromLong(INSTR_OFFSET()); - if (ret == NULL) { - goto error; - } - PUSH(ret); - JUMPBY(oparg); - FAST_DISPATCH(); - } - - case TARGET(BEGIN_FINALLY): { - /* Push NULL onto the stack for using it in END_FINALLY, - POP_FINALLY, WITH_CLEANUP_START and WITH_CLEANUP_FINISH. - */ - PUSH(NULL); - FAST_DISPATCH(); - } - - case TARGET(END_FINALLY): { - PREDICTED(END_FINALLY); - /* At the top of the stack are 1 or 6 values: - Either: - - TOP = NULL or an integer - or: - - (TOP, SECOND, THIRD) = exc_info() - - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER - */ + case TARGET(RERAISE): { PyObject *exc = POP(); - if (exc == NULL) { - FAST_DISPATCH(); - } - else if (PyLong_CheckExact(exc)) { - int ret = _PyLong_AsInt(exc); - Py_DECREF(exc); - if (ret == -1 && _PyErr_Occurred(tstate)) { - goto error; - } - JUMPTO(ret); - FAST_DISPATCH(); - } - else { - assert(PyExceptionClass_Check(exc)); - PyObject *val = POP(); - PyObject *tb = POP(); - _PyErr_Restore(tstate, exc, val, tb); - goto exception_unwind; - } + PyObject *val = POP(); + PyObject *tb = POP(); + assert(PyExceptionClass_Check(exc)); + _PyErr_Restore(tstate, exc, val, tb); + goto exception_unwind; } case TARGET(END_ASYNC_FOR): { @@ -2246,6 +2274,13 @@ main_loop: } } + case TARGET(LOAD_ASSERTION_ERROR): { + PyObject *value = PyExc_AssertionError; + Py_INCREF(value); + PUSH(value); + FAST_DISPATCH(); + } + case TARGET(LOAD_BUILD_CLASS): { _Py_IDENTIFIER(__build_class__); @@ -2698,46 +2733,46 @@ main_loop: DISPATCH(); } - case TARGET(BUILD_TUPLE_UNPACK_WITH_CALL): - case TARGET(BUILD_TUPLE_UNPACK): - case TARGET(BUILD_LIST_UNPACK): { - int convert_to_tuple = opcode != BUILD_LIST_UNPACK; - Py_ssize_t i; - PyObject *sum = PyList_New(0); - PyObject *return_value; - - if (sum == NULL) + case TARGET(LIST_TO_TUPLE): { + PyObject *list = POP(); + PyObject *tuple = PyList_AsTuple(list); + Py_DECREF(list); + if (tuple == NULL) { goto error; + } + PUSH(tuple); + DISPATCH(); + } - for (i = oparg; i > 0; i--) { - PyObject *none_val; - - none_val = _PyList_Extend((PyListObject *)sum, PEEK(i)); - if (none_val == NULL) { - if (opcode == BUILD_TUPLE_UNPACK_WITH_CALL && - _PyErr_ExceptionMatches(tstate, PyExc_TypeError)) - { - check_args_iterable(tstate, PEEK(1 + oparg), PEEK(i)); - } - Py_DECREF(sum); - goto error; + case TARGET(LIST_EXTEND): { + PyObject *iterable = POP(); + PyObject *list = PEEK(oparg); + PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); + if (none_val == NULL) { + if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && + (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable))) + { + _PyErr_Clear(tstate); + _PyErr_Format(tstate, PyExc_TypeError, + "Value after * must be an iterable, not %.200s", + Py_TYPE(iterable)->tp_name); } - Py_DECREF(none_val); + Py_DECREF(iterable); + goto error; } + Py_DECREF(none_val); + Py_DECREF(iterable); + DISPATCH(); + } - if (convert_to_tuple) { - return_value = PyList_AsTuple(sum); - Py_DECREF(sum); - if (return_value == NULL) - goto error; - } - else { - return_value = sum; + case TARGET(SET_UPDATE): { + PyObject *iterable = POP(); + PyObject *set = PEEK(oparg); + int err = _PySet_Update(set, iterable); + Py_DECREF(iterable); + if (err < 0) { + goto error; } - - while (oparg--) - Py_DECREF(POP()); - PUSH(return_value); DISPATCH(); } @@ -2751,33 +2786,14 @@ main_loop: PyObject *item = PEEK(i); if (err == 0) err = PySet_Add(set, item); - Py_DECREF(item); - } - STACK_SHRINK(oparg); - if (err != 0) { - Py_DECREF(set); - goto error; - } - PUSH(set); - DISPATCH(); - } - - case TARGET(BUILD_SET_UNPACK): { - Py_ssize_t i; - PyObject *sum = PySet_New(NULL); - if (sum == NULL) + Py_DECREF(item); + } + STACK_SHRINK(oparg); + if (err != 0) { + Py_DECREF(set); goto error; - - for (i = oparg; i > 0; i--) { - if (_PySet_Update(sum, PEEK(i)) < 0) { - Py_DECREF(sum); - goto error; - } } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); + PUSH(set); DISPATCH(); } @@ -2897,49 +2913,33 @@ main_loop: DISPATCH(); } - case TARGET(BUILD_MAP_UNPACK): { - Py_ssize_t i; - PyObject *sum = PyDict_New(); - if (sum == NULL) - goto error; - - for (i = oparg; i > 0; i--) { - PyObject *arg = PEEK(i); - if (PyDict_Update(sum, arg) < 0) { - if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { - _PyErr_Format(tstate, PyExc_TypeError, - "'%.200s' object is not a mapping", - arg->ob_type->tp_name); - } - Py_DECREF(sum); - goto error; + case TARGET(DICT_UPDATE): { + PyObject *update = POP(); + PyObject *dict = PEEK(oparg); + if (PyDict_Update(dict, update) < 0) { + if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object is not a mapping", + Py_TYPE(update)->tp_name); } + Py_DECREF(update); + goto error; } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); + Py_DECREF(update); DISPATCH(); } - case TARGET(BUILD_MAP_UNPACK_WITH_CALL): { - Py_ssize_t i; - PyObject *sum = PyDict_New(); - if (sum == NULL) - goto error; + case TARGET(DICT_MERGE): { + PyObject *update = POP(); + PyObject *dict = PEEK(oparg); - for (i = oparg; i > 0; i--) { - PyObject *arg = PEEK(i); - if (_PyDict_MergeEx(sum, arg, 2) < 0) { - Py_DECREF(sum); - format_kwargs_error(tstate, PEEK(2 + oparg), arg); - goto error; - } + if (_PyDict_MergeEx(dict, update, 2) < 0) { + format_kwargs_error(tstate, PEEK(2 + oparg), update); + Py_DECREF(update); + goto error; } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); + Py_DECREF(update); + PREDICT(CALL_FUNCTION_EX); DISPATCH(); } @@ -2972,12 +2972,13 @@ main_loop: } case TARGET(COMPARE_OP): { + assert(oparg <= Py_GE); PyObject *right = POP(); PyObject *left = TOP(); - PyObject *res = cmp_outcome(tstate, oparg, left, right); + PyObject *res = PyObject_RichCompare(left, right, oparg); + SET_TOP(res); Py_DECREF(left); Py_DECREF(right); - SET_TOP(res); if (res == NULL) goto error; PREDICT(POP_JUMP_IF_FALSE); @@ -2985,6 +2986,81 @@ main_loop: DISPATCH(); } + case TARGET(IS_OP): { + PyObject *right = POP(); + PyObject *left = TOP(); + int res = (left == right)^oparg; + PyObject *b = res ? Py_True : Py_False; + Py_INCREF(b); + SET_TOP(b); + Py_DECREF(left); + Py_DECREF(right); + PREDICT(POP_JUMP_IF_FALSE); + PREDICT(POP_JUMP_IF_TRUE); + FAST_DISPATCH(); + } + + case TARGET(CONTAINS_OP): { + PyObject *right = POP(); + PyObject *left = POP(); + int res = PySequence_Contains(right, left); + Py_DECREF(left); + Py_DECREF(right); + if (res < 0) { + goto error; + } + PyObject *b = (res^oparg) ? Py_True : Py_False; + Py_INCREF(b); + PUSH(b); + PREDICT(POP_JUMP_IF_FALSE); + PREDICT(POP_JUMP_IF_TRUE); + FAST_DISPATCH(); + } + +#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ + "BaseException is not allowed" + + case TARGET(JUMP_IF_NOT_EXC_MATCH): { + PyObject *right = POP(); + PyObject *left = POP(); + if (PyTuple_Check(right)) { + Py_ssize_t i, length; + length = PyTuple_GET_SIZE(right); + for (i = 0; i < length; i++) { + PyObject *exc = PyTuple_GET_ITEM(right, i); + if (!PyExceptionClass_Check(exc)) { + _PyErr_SetString(tstate, PyExc_TypeError, + CANNOT_CATCH_MSG); + Py_DECREF(left); + Py_DECREF(right); + goto error; + } + } + } + else { + if (!PyExceptionClass_Check(right)) { + _PyErr_SetString(tstate, PyExc_TypeError, + CANNOT_CATCH_MSG); + Py_DECREF(left); + Py_DECREF(right); + goto error; + } + } + int res = PyErr_GivenExceptionMatches(left, right); + Py_DECREF(left); + Py_DECREF(right); + if (res > 0) { + /* Exception matches -- Do nothing */; + } + else if (res == 0) { + JUMPTO(oparg); + } + else { + goto error; + } + DISPATCH(); + } + case TARGET(IMPORT_NAME): { PyObject *name = GETITEM(names, oparg); PyObject *fromlist = POP(); @@ -3199,7 +3275,7 @@ main_loop: PREDICTED(FOR_ITER); /* before: [iter]; after: [iter, iter()] *or* [] */ PyObject *iter = TOP(); - PyObject *next = (*iter->ob_type->tp_iternext)(iter); + PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter); if (next != NULL) { PUSH(next); PREDICT(STORE_FAST); @@ -3224,31 +3300,27 @@ main_loop: } case TARGET(SETUP_FINALLY): { - /* NOTE: If you add any new block-setup opcodes that - are not try/except/finally handlers, you may need - to update the PyGen_NeedsFinalizing() function. - */ - PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg, STACK_LEVEL()); DISPATCH(); } case TARGET(BEFORE_ASYNC_WITH): { - _Py_IDENTIFIER(__aexit__); _Py_IDENTIFIER(__aenter__); - + _Py_IDENTIFIER(__aexit__); PyObject *mgr = TOP(); - PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__), - *enter; + PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__); PyObject *res; - if (exit == NULL) + if (enter == NULL) { + goto error; + } + PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__); + if (exit == NULL) { + Py_DECREF(enter); goto error; + } SET_TOP(exit); - enter = special_lookup(tstate, mgr, &PyId___aenter__); Py_DECREF(mgr); - if (enter == NULL) - goto error; res = _PyObject_CallNoArg(enter); Py_DECREF(enter); if (res == NULL) @@ -3269,8 +3341,8 @@ main_loop: } case TARGET(SETUP_WITH): { - _Py_IDENTIFIER(__exit__); _Py_IDENTIFIER(__enter__); + _Py_IDENTIFIER(__exit__); PyObject *mgr = TOP(); PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__); PyObject *res; @@ -3297,113 +3369,31 @@ main_loop: DISPATCH(); } - case TARGET(WITH_CLEANUP_START): { - /* At the top of the stack are 1 or 6 values indicating - how/why we entered the finally clause: - - TOP = NULL + case TARGET(WITH_EXCEPT_START): { + /* At the top of the stack are 7 values: - (TOP, SECOND, THIRD) = exc_info() - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER - Below them is EXIT, the context.__exit__ or context.__aexit__ - bound method. - In the first case, we must call - EXIT(None, None, None) - otherwise we must call - EXIT(TOP, SECOND, THIRD) - - In the first case, we remove EXIT from the - stack, leaving TOP, and push TOP on the stack. - Otherwise we shift the bottom 3 values of the - stack down, replace the empty spot with NULL, and push - None on the stack. - - Finally we push the result of the call. + - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER + - SEVENTH: the context.__exit__ bound method + We call SEVENTH(TOP, SECOND, THIRD). + Then we push again the TOP exception and the __exit__ + return value. */ - PyObject *stack[3]; PyObject *exit_func; PyObject *exc, *val, *tb, *res; - val = tb = Py_None; exc = TOP(); - if (exc == NULL) { - STACK_SHRINK(1); - exit_func = TOP(); - SET_TOP(exc); - exc = Py_None; - } - else { - assert(PyExceptionClass_Check(exc)); - PyObject *tp2, *exc2, *tb2; - PyTryBlock *block; - val = SECOND(); - tb = THIRD(); - tp2 = FOURTH(); - exc2 = PEEK(5); - tb2 = PEEK(6); - exit_func = PEEK(7); - SET_VALUE(7, tb2); - SET_VALUE(6, exc2); - SET_VALUE(5, tp2); - /* UNWIND_EXCEPT_HANDLER will pop this off. */ - SET_FOURTH(NULL); - /* We just shifted the stack down, so we have - to tell the except handler block that the - values are lower than it expects. */ - assert(f->f_iblock > 0); - block = &f->f_blockstack[f->f_iblock - 1]; - assert(block->b_type == EXCEPT_HANDLER); - assert(block->b_level > 0); - block->b_level--; - } - - stack[0] = exc; - stack[1] = val; - stack[2] = tb; - res = _PyObject_FastCall(exit_func, stack, 3); - Py_DECREF(exit_func); + val = SECOND(); + tb = THIRD(); + assert(exc != Py_None); + assert(!PyLong_Check(exc)); + exit_func = PEEK(7); + PyObject *stack[4] = {NULL, exc, val, tb}; + res = PyObject_Vectorcall(exit_func, stack + 1, + 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); if (res == NULL) goto error; - Py_INCREF(exc); /* Duplicating the exception on the stack */ - PUSH(exc); PUSH(res); - PREDICT(WITH_CLEANUP_FINISH); - DISPATCH(); - } - - case TARGET(WITH_CLEANUP_FINISH): { - PREDICTED(WITH_CLEANUP_FINISH); - /* TOP = the result of calling the context.__exit__ bound method - SECOND = either None or exception type - - If SECOND is None below is NULL or the return address, - otherwise below are 7 values representing an exception. - */ - PyObject *res = POP(); - PyObject *exc = POP(); - int err; - - if (exc != Py_None) - err = PyObject_IsTrue(res); - else - err = 0; - - Py_DECREF(res); - Py_DECREF(exc); - - if (err < 0) - goto error; - else if (err > 0) { - /* There was an exception and a True return. - * We must manually unwind the EXCEPT_HANDLER block - * which was created when the exception was caught, - * otherwise the stack will be in an inconsistent state. - */ - PyTryBlock *b = PyFrame_BlockPop(f); - assert(b->b_type == EXCEPT_HANDLER); - UNWIND_EXCEPT_HANDLER(b); - PUSH(NULL); - } - PREDICT(END_FINALLY); DISPATCH(); } @@ -3510,7 +3500,9 @@ main_loop: PyObject **sp, *res, *names; names = POP(); - assert(PyTuple_CheckExact(names) && PyTuple_GET_SIZE(names) <= oparg); + assert(PyTuple_Check(names)); + assert(PyTuple_GET_SIZE(names) <= oparg); + /* We assume without checking that names contains only strings */ sp = stack_pointer; res = call_function(tstate, &sp, oparg, names); stack_pointer = sp; @@ -3524,6 +3516,7 @@ main_loop: } case TARGET(CALL_FUNCTION_EX): { + PREDICTED(CALL_FUNCTION_EX); PyObject *func, *callargs, *kwargs = NULL, *result; if (oparg & 0x01) { kwargs = POP(); @@ -3770,6 +3763,16 @@ exception_unwind: PUSH(val); PUSH(exc); JUMPTO(handler); + if (_Py_TracingPossible(ceval2)) { + int needs_new_execution_window = (f->f_lasti < instr_lb || f->f_lasti >= instr_ub); + int needs_line_update = (f->f_lasti == instr_lb || f->f_lasti < instr_prev); + /* Make sure that we trace line after exception if we are in a new execution + * window or we don't need a line update and we are not in the first instruction + * of the line. */ + if (needs_new_execution_window || (!needs_line_update && instr_lb > 0)) { + instr_prev = INT_MAX; + } + } /* Resume normal execution */ goto main_loop; } @@ -3782,15 +3785,13 @@ exception_unwind: assert(retval == NULL); assert(_PyErr_Occurred(tstate)); -exit_returning: - /* Pop remaining stack entries. */ while (!EMPTY()) { PyObject *o = POP(); Py_XDECREF(o); } -exit_yielding: +exiting: if (tstate->use_tracing) { if (tstate->c_tracefunc) { if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj, @@ -3810,11 +3811,11 @@ exit_yielding: exit_eval_frame: if (PyDTrace_FUNCTION_RETURN_ENABLED()) dtrace_function_return(f); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); f->f_executing = 0; tstate->frame = f->f_back; - return _Py_CheckFunctionResult(NULL, retval, "PyEval_EvalFrameEx"); + return _Py_CheckFunctionResult(tstate, NULL, retval, __func__); } static void @@ -4042,7 +4043,8 @@ fail: the test in the if statements in Misc/gdbinit (pystack and pystackv). */ PyObject * -_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, +_PyEval_EvalCode(PyThreadState *tstate, + PyObject *_co, PyObject *globals, PyObject *locals, PyObject *const *args, Py_ssize_t argcount, PyObject *const *kwnames, PyObject *const *kwargs, Py_ssize_t kwcount, int kwstep, @@ -4050,6 +4052,8 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, PyObject *kwdefs, PyObject *closure, PyObject *name, PyObject *qualname) { + assert(is_tstate_valid(tstate)); + PyCodeObject* co = (PyCodeObject*)_co; PyFrameObject *f; PyObject *retval = NULL; @@ -4059,9 +4063,6 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, Py_ssize_t i, j, n; PyObject *kwdict; - PyThreadState *tstate = _PyThreadState_GET(); - assert(tstate != NULL); - if (globals == NULL) { _PyErr_SetString(tstate, PyExc_SystemError, "PyEval_EvalCodeEx: NULL globals"); @@ -4295,7 +4296,7 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, return gen; } - retval = PyEval_EvalFrameEx(f,0); + retval = _PyEval_EvalFrame(tstate, f, 0); fail: /* Jump here from prelude on failure */ @@ -4304,7 +4305,6 @@ fail: /* Jump here from prelude on failure */ current Python frame (f), the associated C stack is still in use, so recursion_depth must be boosted for the duration. */ - assert(tstate != NULL); if (Py_REFCNT(f) > 1) { Py_DECREF(f); _PyObject_GC_TRACK(f); @@ -4317,6 +4317,26 @@ fail: /* Jump here from prelude on failure */ return retval; } + +PyObject * +_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, + PyObject *const *args, Py_ssize_t argcount, + PyObject *const *kwnames, PyObject *const *kwargs, + Py_ssize_t kwcount, int kwstep, + PyObject *const *defs, Py_ssize_t defcount, + PyObject *kwdefs, PyObject *closure, + PyObject *name, PyObject *qualname) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyEval_EvalCode(tstate, _co, globals, locals, + args, argcount, + kwnames, kwargs, + kwcount, kwstep, + defs, defcount, + kwdefs, closure, + name, qualname); +} + PyObject * PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, PyObject *const *args, int argcount, @@ -4339,7 +4359,7 @@ special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id) PyObject *res; res = _PyObject_LookupSpecial(o, id); if (res == NULL && !_PyErr_Occurred(tstate)) { - _PyErr_SetObject(tstate, PyExc_AttributeError, id->object); + _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id)); return NULL; } return res; @@ -4432,7 +4452,7 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause) } _PyErr_SetObject(tstate, type, value); - /* PyErr_SetObject incref's its arguments */ + /* _PyErr_SetObject incref's its arguments */ Py_DECREF(value); Py_DECREF(type); return 0; @@ -4466,11 +4486,11 @@ unpack_iterable(PyThreadState *tstate, PyObject *v, it = PyObject_GetIter(v); if (it == NULL) { if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && - v->ob_type->tp_iter == NULL && !PySequence_Check(v)) + Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v)) { _PyErr_Format(tstate, PyExc_TypeError, "cannot unpack non-iterable %.200s object", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); } return 0; } @@ -4533,7 +4553,7 @@ unpack_iterable(PyThreadState *tstate, PyObject *v, *--sp = PyList_GET_ITEM(l, ll - j); } /* Resize the list. */ - Py_SIZE(l) = ll - argcntafter; + Py_SET_SIZE(l, ll - argcntafter); Py_DECREF(it); return 1; @@ -4682,58 +4702,97 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj, return result; } -void -PyEval_SetProfile(Py_tracefunc func, PyObject *arg) +int +_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) { - if (PySys_Audit("sys.setprofile", NULL) < 0) { - _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL); - return; + assert(is_tstate_valid(tstate)); + /* The caller must hold the GIL */ + assert(PyGILState_Check()); + + /* Call _PySys_Audit() in the context of the current thread state, + even if tstate is not the current thread state. */ + PyThreadState *current_tstate = _PyThreadState_GET(); + if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) { + return -1; } - PyThreadState *tstate = _PyThreadState_GET(); - PyObject *temp = tstate->c_profileobj; - Py_XINCREF(arg); + PyObject *profileobj = tstate->c_profileobj; + tstate->c_profilefunc = NULL; tstate->c_profileobj = NULL; - /* Must make sure that tracing is not ignored if 'temp' is freed */ + /* Must make sure that tracing is not ignored if 'profileobj' is freed */ tstate->use_tracing = tstate->c_tracefunc != NULL; - Py_XDECREF(temp); - tstate->c_profilefunc = func; + Py_XDECREF(profileobj); + + Py_XINCREF(arg); tstate->c_profileobj = arg; + tstate->c_profilefunc = func; + /* Flag that tracing or profiling is turned on */ tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL); + return 0; } void -PyEval_SetTrace(Py_tracefunc func, PyObject *arg) +PyEval_SetProfile(Py_tracefunc func, PyObject *arg) { - if (PySys_Audit("sys.settrace", NULL) < 0) { - _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL); - return; + PyThreadState *tstate = _PyThreadState_GET(); + if (_PyEval_SetProfile(tstate, func, arg) < 0) { + /* Log _PySys_Audit() error */ + _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL); } +} + +int +_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) +{ + assert(is_tstate_valid(tstate)); + /* The caller must hold the GIL */ + assert(PyGILState_Check()); + + /* Call _PySys_Audit() in the context of the current thread state, + even if tstate is not the current thread state. */ + PyThreadState *current_tstate = _PyThreadState_GET(); + if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) { + return -1; + } + + struct _ceval_state *ceval2 = &tstate->interp->ceval; + PyObject *traceobj = tstate->c_traceobj; + ceval2->tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL); - _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - PyObject *temp = tstate->c_traceobj; - runtime->ceval.tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL); - Py_XINCREF(arg); tstate->c_tracefunc = NULL; tstate->c_traceobj = NULL; - /* Must make sure that profiling is not ignored if 'temp' is freed */ - tstate->use_tracing = tstate->c_profilefunc != NULL; - Py_XDECREF(temp); - tstate->c_tracefunc = func; + /* Must make sure that profiling is not ignored if 'traceobj' is freed */ + tstate->use_tracing = (tstate->c_profilefunc != NULL); + Py_XDECREF(traceobj); + + Py_XINCREF(arg); tstate->c_traceobj = arg; + tstate->c_tracefunc = func; + /* Flag that tracing or profiling is turned on */ tstate->use_tracing = ((func != NULL) || (tstate->c_profilefunc != NULL)); + + return 0; +} + +void +PyEval_SetTrace(Py_tracefunc func, PyObject *arg) +{ + PyThreadState *tstate = _PyThreadState_GET(); + if (_PyEval_SetTrace(tstate, func, arg) < 0) { + /* Log _PySys_Audit() error */ + _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL); + } } + void -_PyEval_SetCoroutineOriginTrackingDepth(int new_depth) +_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth) { assert(new_depth >= 0); - PyThreadState *tstate = _PyThreadState_GET(); tstate->coroutine_origin_tracking_depth = new_depth; } @@ -4744,6 +4803,20 @@ _PyEval_GetCoroutineOriginTrackingDepth(void) return tstate->coroutine_origin_tracking_depth; } +int +_PyEval_SetAsyncGenFirstiter(PyObject *firstiter) +{ + PyThreadState *tstate = _PyThreadState_GET(); + + if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) { + return -1; + } + + Py_XINCREF(firstiter); + Py_XSETREF(tstate->async_gen_firstiter, firstiter); + return 0; +} + PyObject * _PyEval_GetAsyncGenFirstiter(void) { @@ -4751,31 +4824,39 @@ _PyEval_GetAsyncGenFirstiter(void) return tstate->async_gen_firstiter; } -PyObject * -_PyEval_GetAsyncGenFinalizer(void) +int +_PyEval_SetAsyncGenFinalizer(PyObject *finalizer) { PyThreadState *tstate = _PyThreadState_GET(); - return tstate->async_gen_finalizer; + + if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) { + return -1; + } + + Py_XINCREF(finalizer); + Py_XSETREF(tstate->async_gen_finalizer, finalizer); + return 0; } -static PyFrameObject * -_PyEval_GetFrame(PyThreadState *tstate) +PyObject * +_PyEval_GetAsyncGenFinalizer(void) { - return _PyRuntime.gilstate.getframe(tstate); + PyThreadState *tstate = _PyThreadState_GET(); + return tstate->async_gen_finalizer; } PyFrameObject * PyEval_GetFrame(void) { PyThreadState *tstate = _PyThreadState_GET(); - return _PyEval_GetFrame(tstate); + return tstate->frame; } PyObject * PyEval_GetBuiltins(void) { PyThreadState *tstate = _PyThreadState_GET(); - PyFrameObject *current_frame = _PyEval_GetFrame(tstate); + PyFrameObject *current_frame = tstate->frame; if (current_frame == NULL) return tstate->interp->builtins; else @@ -4801,7 +4882,7 @@ PyObject * PyEval_GetLocals(void) { PyThreadState *tstate = _PyThreadState_GET(); - PyFrameObject *current_frame = _PyEval_GetFrame(tstate); + PyFrameObject *current_frame = tstate->frame; if (current_frame == NULL) { _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist"); return NULL; @@ -4819,7 +4900,7 @@ PyObject * PyEval_GetGlobals(void) { PyThreadState *tstate = _PyThreadState_GET(); - PyFrameObject *current_frame = _PyEval_GetFrame(tstate); + PyFrameObject *current_frame = tstate->frame; if (current_frame == NULL) { return NULL; } @@ -4832,7 +4913,7 @@ int PyEval_MergeCompilerFlags(PyCompilerFlags *cf) { PyThreadState *tstate = _PyThreadState_GET(); - PyFrameObject *current_frame = _PyEval_GetFrame(tstate); + PyFrameObject *current_frame = tstate->frame; int result = cf->cf_flags != 0; if (current_frame != NULL) { @@ -4863,7 +4944,7 @@ PyEval_GetFuncName(PyObject *func) else if (PyCFunction_Check(func)) return ((PyCFunctionObject*)func)->m_ml->ml_name; else - return func->ob_type->tp_name; + return Py_TYPE(func)->tp_name; } const char * @@ -4918,11 +4999,11 @@ trace_call_function(PyThreadState *tstate, PyObject *kwnames) { PyObject *x; - if (PyCFunction_Check(func)) { - C_TRACE(x, _PyObject_Vectorcall(func, args, nargs, kwnames)); + if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) { + C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames)); return x; } - else if (Py_TYPE(func) == &PyMethodDescr_Type && nargs > 0) { + else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) { /* We need to create a temporary bound method as argument for profiling. @@ -4935,13 +5016,13 @@ trace_call_function(PyThreadState *tstate, if (func == NULL) { return NULL; } - C_TRACE(x, _PyObject_Vectorcall(func, + C_TRACE(x, PyObject_Vectorcall(func, args+1, nargs-1, kwnames)); Py_DECREF(func); return x; } - return _PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); + return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); } /* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault() @@ -4960,7 +5041,7 @@ call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyO x = trace_call_function(tstate, func, stack, nargs, kwnames); } else { - x = _PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); + x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); } assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); @@ -4979,11 +5060,11 @@ do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject { PyObject *result; - if (PyCFunction_Check(func)) { - C_TRACE(result, PyCFunction_Call(func, callargs, kwdict)); + if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) { + C_TRACE(result, PyObject_Call(func, callargs, kwdict)); return result; } - else if (Py_TYPE(func) == &PyMethodDescr_Type) { + else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) { Py_ssize_t nargs = PyTuple_GET_SIZE(callargs); if (nargs > 0 && tstate->use_tracing) { /* We need to create a temporary bound method as argument @@ -4999,10 +5080,11 @@ do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject return NULL; } - C_TRACE(result, _PyObject_FastCallDict(func, - &_PyTuple_ITEMS(callargs)[1], - nargs - 1, - kwdict)); + C_TRACE(result, _PyObject_FastCallDictTstate( + tstate, func, + &_PyTuple_ITEMS(callargs)[1], + nargs - 1, + kwdict)); Py_DECREF(func); return result; } @@ -5022,7 +5104,7 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) PyThreadState *tstate = _PyThreadState_GET(); if (v != Py_None) { Py_ssize_t x; - if (PyIndex_Check(v)) { + if (_PyIndex_Check(v)) { x = PyNumber_AsSsize_t(v, NULL); if (x == -1 && _PyErr_Occurred(tstate)) return 0; @@ -5043,7 +5125,7 @@ _PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi) { PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t x; - if (PyIndex_Check(v)) { + if (_PyIndex_Check(v)) { x = PyNumber_AsSsize_t(v, NULL); if (x == -1 && _PyErr_Occurred(tstate)) return 0; @@ -5058,62 +5140,6 @@ _PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi) return 1; } - -#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ - "BaseException is not allowed" - -static PyObject * -cmp_outcome(PyThreadState *tstate, int op, PyObject *v, PyObject *w) -{ - int res = 0; - switch (op) { - case PyCmp_IS: - res = (v == w); - break; - case PyCmp_IS_NOT: - res = (v != w); - break; - case PyCmp_IN: - res = PySequence_Contains(w, v); - if (res < 0) - return NULL; - break; - case PyCmp_NOT_IN: - res = PySequence_Contains(w, v); - if (res < 0) - return NULL; - res = !res; - break; - case PyCmp_EXC_MATCH: - if (PyTuple_Check(w)) { - Py_ssize_t i, length; - length = PyTuple_Size(w); - for (i = 0; i < length; i += 1) { - PyObject *exc = PyTuple_GET_ITEM(w, i); - if (!PyExceptionClass_Check(exc)) { - _PyErr_SetString(tstate, PyExc_TypeError, - CANNOT_CATCH_MSG); - return NULL; - } - } - } - else { - if (!PyExceptionClass_Check(w)) { - _PyErr_SetString(tstate, PyExc_TypeError, - CANNOT_CATCH_MSG); - return NULL; - } - } - res = PyErr_GivenExceptionMatches(v, w); - break; - default: - return PyObject_RichCompare(v, w, op); - } - v = res ? Py_True : Py_False; - Py_INCREF(v); - return v; -} - static PyObject * import_name(PyThreadState *tstate, PyFrameObject *f, PyObject *name, PyObject *fromlist, PyObject *level) @@ -5161,7 +5187,6 @@ static PyObject * import_from(PyThreadState *tstate, PyObject *v, PyObject *name) { PyObject *x; - _Py_IDENTIFIER(__name__); PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg; if (_PyObject_LookupAttr(v, name, &x) != 0) { @@ -5237,7 +5262,6 @@ import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v) { _Py_IDENTIFIER(__all__); _Py_IDENTIFIER(__dict__); - _Py_IDENTIFIER(__name__); PyObject *all, *dict, *name, *value; int skip_leading_underscores = 0; int pos, err; @@ -5327,13 +5351,18 @@ import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v) static int check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args) { - if (args->ob_type->tp_iter == NULL && !PySequence_Check(args)) { - _PyErr_Format(tstate, PyExc_TypeError, - "%.200s%.200s argument after * " - "must be an iterable, not %.200s", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - args->ob_type->tp_name); + if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) { + /* check_args_iterable() may be called with a live exception: + * clear it to prevent calling _PyObject_FunctionStr() with an + * exception set. */ + _PyErr_Clear(tstate); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U argument after * must be an iterable, not %.200s", + funcstr, Py_TYPE(args)->tp_name); + Py_DECREF(funcstr); + } return -1; } return 0; @@ -5349,31 +5378,29 @@ format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs) * is not a mapping. */ if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { - _PyErr_Format(tstate, PyExc_TypeError, - "%.200s%.200s argument after ** " - "must be a mapping, not %.200s", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - kwargs->ob_type->tp_name); + _PyErr_Clear(tstate); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + _PyErr_Format( + tstate, PyExc_TypeError, + "%U argument after ** must be a mapping, not %.200s", + funcstr, Py_TYPE(kwargs)->tp_name); + Py_DECREF(funcstr); + } } else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { PyObject *exc, *val, *tb; _PyErr_Fetch(tstate, &exc, &val, &tb); if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) { - PyObject *key = PyTuple_GET_ITEM(val, 0); - if (!PyUnicode_Check(key)) { - _PyErr_Format(tstate, PyExc_TypeError, - "%.200s%.200s keywords must be strings", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func)); - } - else { - _PyErr_Format(tstate, PyExc_TypeError, - "%.200s%.200s got multiple " - "values for keyword argument '%U'", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - key); + _PyErr_Clear(tstate); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + PyObject *key = PyTuple_GET_ITEM(val, 0); + _PyErr_Format( + tstate, PyExc_TypeError, + "%U got multiple values for keyword argument '%S'", + funcstr, key); + Py_DECREF(funcstr); } Py_XDECREF(exc); Py_XDECREF(val); @@ -5424,7 +5451,7 @@ format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg) } static void -format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevopcode) +format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode) { if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) { if (prevopcode == BEFORE_ASYNC_WITH) { @@ -5433,7 +5460,7 @@ format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevopcode "that does not implement __await__: %.100s", type->tp_name); } - else if (prevopcode == WITH_CLEANUP_START) { + else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) { _PyErr_Format(tstate, PyExc_TypeError, "'async with' received an object from __aexit__ " "that does not implement __await__: %.100s", @@ -5545,7 +5572,7 @@ _Py_GetDXProfile(PyObject *self, PyObject *args) Py_ssize_t _PyEval_RequestCodeExtraIndex(freefunc free) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); Py_ssize_t new_index; if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) { @@ -5563,9 +5590,10 @@ dtrace_function_entry(PyFrameObject *f) const char *funcname; int lineno; - filename = PyUnicode_AsUTF8(f->f_code->co_filename); - funcname = PyUnicode_AsUTF8(f->f_code->co_name); - lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); + PyCodeObject *code = f->f_code; + filename = PyUnicode_AsUTF8(code->co_filename); + funcname = PyUnicode_AsUTF8(code->co_name); + lineno = PyCode_Addr2Line(code, f->f_lasti); PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno); } @@ -5577,9 +5605,10 @@ dtrace_function_return(PyFrameObject *f) const char *funcname; int lineno; - filename = PyUnicode_AsUTF8(f->f_code->co_filename); - funcname = PyUnicode_AsUTF8(f->f_code->co_name); - lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); + PyCodeObject *code = f->f_code; + filename = PyUnicode_AsUTF8(code->co_filename); + funcname = PyUnicode_AsUTF8(code->co_name); + lineno = PyCode_Addr2Line(code, f->f_lasti); PyDTrace_FUNCTION_RETURN(filename, funcname, lineno); } @@ -5617,3 +5646,21 @@ maybe_dtrace_line(PyFrameObject *frame, } *instr_prev = frame->f_lasti; } + + +/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions + for the limited API. */ + +#undef Py_EnterRecursiveCall + +int Py_EnterRecursiveCall(const char *where) +{ + return _Py_EnterRecursiveCall_inline(where); +} + +#undef Py_LeaveRecursiveCall + +void Py_LeaveRecursiveCall(void) +{ + _Py_LeaveRecursiveCall_inline(); +} diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index 34d48c99..3510675a 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -141,7 +141,8 @@ static void recreate_gil(struct _gil_runtime_state *gil) } static void -drop_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) +drop_gil(struct _ceval_runtime_state *ceval, struct _ceval_state *ceval2, + PyThreadState *tstate) { struct _gil_runtime_state *gil = &ceval->gil; if (!_Py_atomic_load_relaxed(&gil->locked)) { @@ -163,12 +164,13 @@ drop_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) MUTEX_UNLOCK(gil->mutex); #ifdef FORCE_SWITCHING - if (_Py_atomic_load_relaxed(&ceval->gil_drop_request) && tstate != NULL) { + if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request) && tstate != NULL) { MUTEX_LOCK(gil->switch_mutex); /* Not switched yet => wait */ if (((PyThreadState*)_Py_atomic_load_relaxed(&gil->last_holder)) == tstate) { - RESET_GIL_DROP_REQUEST(ceval); + assert(is_tstate_valid(tstate)); + RESET_GIL_DROP_REQUEST(tstate->interp); /* NOTE: if COND_WAIT does not atomically start waiting when releasing the mutex, another thread can run through, take the GIL and drop it again, and reset the condition @@ -180,15 +182,57 @@ drop_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) #endif } + +/* Check if a Python thread must exit immediately, rather than taking the GIL + if Py_Finalize() has been called. + + When this function is called by a daemon thread after Py_Finalize() has been + called, the GIL does no longer exist. + + tstate must be non-NULL. */ +static inline int +tstate_must_exit(PyThreadState *tstate) +{ + /* bpo-39877: Access _PyRuntime directly rather than using + tstate->interp->runtime to support calls from Python daemon threads. + After Py_Finalize() has been called, tstate can be a dangling pointer: + point to PyThreadState freed memory. */ + PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(&_PyRuntime); + return (finalizing != NULL && finalizing != tstate); +} + + +/* Take the GIL. + + The function saves errno at entry and restores its value at exit. + + tstate must be non-NULL. */ static void -take_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) +take_gil(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("take_gil: NULL tstate"); + int err = errno; + + assert(tstate != NULL); + + if (tstate_must_exit(tstate)) { + /* bpo-39877: If Py_Finalize() has been called and tstate is not the + thread which called Py_Finalize(), exit immediately the thread. + + This code path can be reached by a daemon thread after Py_Finalize() + completes. In this case, tstate is a dangling pointer: points to + PyThreadState freed memory. */ + PyThread_exit_thread(); } + assert(is_tstate_valid(tstate)); + PyInterpreterState *interp = tstate->interp; + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; struct _gil_runtime_state *gil = &ceval->gil; - int err = errno; + + /* Check that _PyEval_InitThreads() was called to create the lock */ + assert(gil_created(gil)); + MUTEX_LOCK(gil->mutex); if (!_Py_atomic_load_relaxed(&gil->locked)) { @@ -196,23 +240,28 @@ take_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) } while (_Py_atomic_load_relaxed(&gil->locked)) { - int timed_out = 0; - unsigned long saved_switchnum; - - saved_switchnum = gil->switch_number; - + unsigned long saved_switchnum = gil->switch_number; unsigned long interval = (gil->interval >= 1 ? gil->interval : 1); + int timed_out = 0; COND_TIMED_WAIT(gil->cond, gil->mutex, interval, timed_out); + /* If we timed out and no switch occurred in the meantime, it is time to ask the GIL-holding thread to drop it. */ if (timed_out && _Py_atomic_load_relaxed(&gil->locked) && gil->switch_number == saved_switchnum) { - SET_GIL_DROP_REQUEST(ceval); + if (tstate_must_exit(tstate)) { + MUTEX_UNLOCK(gil->mutex); + PyThread_exit_thread(); + } + assert(is_tstate_valid(tstate)); + + SET_GIL_DROP_REQUEST(interp); } } + _ready: #ifdef FORCE_SWITCHING /* This mutex must be taken before modifying gil->last_holder: @@ -232,23 +281,51 @@ _ready: COND_SIGNAL(gil->switch_cond); MUTEX_UNLOCK(gil->switch_mutex); #endif - if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) { - RESET_GIL_DROP_REQUEST(ceval); + + if (tstate_must_exit(tstate)) { + /* bpo-36475: If Py_Finalize() has been called and tstate is not + the thread which called Py_Finalize(), exit immediately the + thread. + + This code path can be reached by a daemon thread which was waiting + in take_gil() while the main thread called + wait_for_thread_shutdown() from Py_Finalize(). */ + MUTEX_UNLOCK(gil->mutex); + drop_gil(ceval, ceval2, tstate); + PyThread_exit_thread(); + } + assert(is_tstate_valid(tstate)); + + if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) { + RESET_GIL_DROP_REQUEST(interp); } + else { + /* bpo-40010: eval_breaker should be recomputed to be set to 1 if there + is a pending signal: signal received by another thread which cannot + handle signals. + + Note: RESET_GIL_DROP_REQUEST() calls COMPUTE_EVAL_BREAKER(). */ + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); + } + + /* Don't access tstate if the thread must exit */ if (tstate->async_exc != NULL) { - _PyEval_SignalAsyncExc(ceval); + _PyEval_SignalAsyncExc(tstate); } MUTEX_UNLOCK(gil->mutex); + errno = err; } void _PyEval_SetSwitchInterval(unsigned long microseconds) { - _PyRuntime.ceval.gil.interval = microseconds; + struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil; + gil->interval = microseconds; } unsigned long _PyEval_GetSwitchInterval() { - return _PyRuntime.ceval.gil.interval; + struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil; + return gil->interval; } diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index d2d15039..4615ebaa 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -281,62 +281,6 @@ sys_getprofile(PyObject *module, PyObject *Py_UNUSED(ignored)) return sys_getprofile_impl(module); } -PyDoc_STRVAR(sys_setcheckinterval__doc__, -"setcheckinterval($module, n, /)\n" -"--\n" -"\n" -"Set the async event check interval to n instructions.\n" -"\n" -"This tells the Python interpreter to check for asynchronous events\n" -"every n instructions.\n" -"\n" -"This also affects how often thread switches occur."); - -#define SYS_SETCHECKINTERVAL_METHODDEF \ - {"setcheckinterval", (PyCFunction)sys_setcheckinterval, METH_O, sys_setcheckinterval__doc__}, - -static PyObject * -sys_setcheckinterval_impl(PyObject *module, int n); - -static PyObject * -sys_setcheckinterval(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - int n; - - if (PyFloat_Check(arg)) { - PyErr_SetString(PyExc_TypeError, - "integer argument expected, got float" ); - goto exit; - } - n = _PyLong_AsInt(arg); - if (n == -1 && PyErr_Occurred()) { - goto exit; - } - return_value = sys_setcheckinterval_impl(module, n); - -exit: - return return_value; -} - -PyDoc_STRVAR(sys_getcheckinterval__doc__, -"getcheckinterval($module, /)\n" -"--\n" -"\n" -"Return the current check interval; see sys.setcheckinterval()."); - -#define SYS_GETCHECKINTERVAL_METHODDEF \ - {"getcheckinterval", (PyCFunction)sys_getcheckinterval, METH_NOARGS, sys_getcheckinterval__doc__}, - -static PyObject * -sys_getcheckinterval_impl(PyObject *module); - -static PyObject * -sys_getcheckinterval(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - return sys_getcheckinterval_impl(module); -} - PyDoc_STRVAR(sys_setswitchinterval__doc__, "setswitchinterval($module, interval, /)\n" "--\n" @@ -814,27 +758,6 @@ exit: return return_value; } -#if defined(COUNT_ALLOCS) - -PyDoc_STRVAR(sys_getcounts__doc__, -"getcounts($module, /)\n" -"--\n" -"\n"); - -#define SYS_GETCOUNTS_METHODDEF \ - {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS, sys_getcounts__doc__}, - -static PyObject * -sys_getcounts_impl(PyObject *module); - -static PyObject * -sys_getcounts(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - return sys_getcounts_impl(module); -} - -#endif /* defined(COUNT_ALLOCS) */ - PyDoc_STRVAR(sys__getframe__doc__, "_getframe($module, depth=0, /)\n" "--\n" @@ -941,43 +864,6 @@ exit: return return_value; } -PyDoc_STRVAR(sys_callstats__doc__, -"callstats($module, /)\n" -"--\n" -"\n" -"Return a tuple of function call statistics.\n" -"\n" -"A tuple is returned only if CALL_PROFILE was defined when Python was\n" -"built. Otherwise, this returns None.\n" -"\n" -"When enabled, this function returns detailed, implementation-specific\n" -"details about the number of function calls executed. The return value\n" -"is a 11-tuple where the entries in the tuple are counts of:\n" -"0. all function calls\n" -"1. calls to PyFunction_Type objects\n" -"2. PyFunction calls that do not create an argument tuple\n" -"3. PyFunction calls that do not create an argument tuple\n" -" and bypass PyEval_EvalCodeEx()\n" -"4. PyMethod calls\n" -"5. PyMethod calls on bound methods\n" -"6. PyType calls\n" -"7. PyCFunction calls\n" -"8. generator calls\n" -"9. All other calls\n" -"10. Number of stack pops performed by call_function()"); - -#define SYS_CALLSTATS_METHODDEF \ - {"callstats", (PyCFunction)sys_callstats, METH_NOARGS, sys_callstats__doc__}, - -static PyObject * -sys_callstats_impl(PyObject *module); - -static PyObject * -sys_callstats(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - return sys_callstats_impl(module); -} - PyDoc_STRVAR(sys__debugmallocstats__doc__, "_debugmallocstats($module, /)\n" "--\n" @@ -1081,11 +967,7 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) #define SYS_GETTOTALREFCOUNT_METHODDEF #endif /* !defined(SYS_GETTOTALREFCOUNT_METHODDEF) */ -#ifndef SYS_GETCOUNTS_METHODDEF - #define SYS_GETCOUNTS_METHODDEF -#endif /* !defined(SYS_GETCOUNTS_METHODDEF) */ - #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=273f9cec8bfcab91 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=39eb34a01fb9a919 input=a9049054013a1b77]*/ diff --git a/Python/codecs.c b/Python/codecs.c index 4bd28ec9..0f18c27e 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -9,7 +9,8 @@ Copyright (c) Corporation for National Research Initiatives. ------------------------------------------------------------------------ */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_interp.h" // PyInterpreterState.codec_search_path +#include "pycore_pystate.h" // _PyInterpreterState_GET() #include "ucnhash.h" #include @@ -32,7 +33,7 @@ static int _PyCodecRegistry_Init(void); /* Forward */ int PyCodec_Register(PyObject *search_function) { - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (interp->codec_search_path == NULL && _PyCodecRegistry_Init()) goto onError; if (search_function == NULL) { @@ -49,15 +50,16 @@ int PyCodec_Register(PyObject *search_function) return -1; } -/* Convert a string to a normalized Python string: all characters are - converted to lower case, spaces are replaced with underscores. */ +extern int _Py_normalize_encoding(const char *, char *, size_t); + +/* Convert a string to a normalized Python string(decoded from UTF-8): all characters are + converted to lower case, spaces and hyphens are replaced with underscores. */ static PyObject *normalizestring(const char *string) { - size_t i; size_t len = strlen(string); - char *p; + char *encoding; PyObject *v; if (len > PY_SSIZE_T_MAX) { @@ -65,20 +67,19 @@ PyObject *normalizestring(const char *string) return NULL; } - p = PyMem_Malloc(len + 1); - if (p == NULL) + encoding = PyMem_Malloc(len + 1); + if (encoding == NULL) return PyErr_NoMemory(); - for (i = 0; i < len; i++) { - char ch = string[i]; - if (ch == ' ') - ch = '-'; - else - ch = Py_TOLOWER(Py_CHARMASK(ch)); - p[i] = ch; + + if (!_Py_normalize_encoding(string, encoding, len + 1)) + { + PyErr_SetString(PyExc_RuntimeError, "_Py_normalize_encoding() failed"); + PyMem_Free(encoding); + return NULL; } - p[i] = '\0'; - v = PyUnicode_FromString(p); - PyMem_Free(p); + + v = PyUnicode_FromString(encoding); + PyMem_Free(encoding); return v; } @@ -99,47 +100,38 @@ PyObject *normalizestring(const char *string) PyObject *_PyCodec_Lookup(const char *encoding) { - PyObject *result, *args = NULL, *v; - Py_ssize_t i, len; - if (encoding == NULL) { PyErr_BadArgument(); - goto onError; + return NULL; } - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - if (interp->codec_search_path == NULL && _PyCodecRegistry_Init()) - goto onError; + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (interp->codec_search_path == NULL && _PyCodecRegistry_Init()) { + return NULL; + } /* Convert the encoding to a normalized Python string: all characters are converted to lower case, spaces and hyphens are replaced with underscores. */ - v = normalizestring(encoding); - if (v == NULL) - goto onError; + PyObject *v = normalizestring(encoding); + if (v == NULL) { + return NULL; + } PyUnicode_InternInPlace(&v); /* First, try to lookup the name in the registry dictionary */ - result = PyDict_GetItemWithError(interp->codec_search_cache, v); + PyObject *result = PyDict_GetItemWithError(interp->codec_search_cache, v); if (result != NULL) { Py_INCREF(result); Py_DECREF(v); return result; } else if (PyErr_Occurred()) { - Py_DECREF(v); - return NULL; + goto onError; } /* Next, scan the search functions in order of registration */ - args = PyTuple_New(1); - if (args == NULL) { - Py_DECREF(v); - return NULL; - } - PyTuple_SET_ITEM(args,0,v); - - len = PyList_Size(interp->codec_search_path); + const Py_ssize_t len = PyList_Size(interp->codec_search_path); if (len < 0) goto onError; if (len == 0) { @@ -149,13 +141,14 @@ PyObject *_PyCodec_Lookup(const char *encoding) goto onError; } + Py_ssize_t i; for (i = 0; i < len; i++) { PyObject *func; func = PyList_GetItem(interp->codec_search_path, i); if (func == NULL) goto onError; - result = PyEval_CallObject(func, args); + result = PyObject_CallOneArg(func, v); if (result == NULL) goto onError; if (result == Py_None) { @@ -182,11 +175,11 @@ PyObject *_PyCodec_Lookup(const char *encoding) Py_DECREF(result); goto onError; } - Py_DECREF(args); + Py_DECREF(v); return result; onError: - Py_XDECREF(args); + Py_DECREF(v); return NULL; } @@ -195,7 +188,7 @@ int _PyCodec_Forget(const char *encoding) PyObject *v; int result; - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (interp->codec_search_path == NULL) { return -1; } @@ -325,7 +318,7 @@ PyObject *codec_getstreamcodec(const char *encoding, if (errors != NULL) streamcodec = PyObject_CallFunction(codeccls, "Os", stream, errors); else - streamcodec = PyObject_CallFunctionObjArgs(codeccls, stream, NULL); + streamcodec = PyObject_CallOneArg(codeccls, stream); Py_DECREF(codecs); return streamcodec; } @@ -424,7 +417,7 @@ _PyCodec_EncodeInternal(PyObject *object, if (args == NULL) goto onError; - result = PyEval_CallObject(encoder, args); + result = PyObject_Call(encoder, args, NULL); if (result == NULL) { wrap_codec_error("encoding", encoding); goto onError; @@ -470,7 +463,7 @@ _PyCodec_DecodeInternal(PyObject *object, if (args == NULL) goto onError; - result = PyEval_CallObject(decoder,args); + result = PyObject_Call(decoder, args, NULL); if (result == NULL) { wrap_codec_error("decoding", encoding); goto onError; @@ -628,7 +621,7 @@ PyObject *_PyCodec_DecodeText(PyObject *object, Return 0 on success, -1 on error */ int PyCodec_RegisterError(const char *name, PyObject *error) { - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (interp->codec_search_path == NULL && _PyCodecRegistry_Init()) return -1; if (!PyCallable_Check(error)) { @@ -646,7 +639,7 @@ PyObject *PyCodec_LookupError(const char *name) { PyObject *handler = NULL; - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (interp->codec_search_path == NULL && _PyCodecRegistry_Init()) return NULL; @@ -666,7 +659,7 @@ static void wrong_exception_type(PyObject *exc) { PyErr_Format(PyExc_TypeError, "don't know how to handle %.200s in error callback", - exc->ob_type->tp_name); + Py_TYPE(exc)->tp_name); } PyObject *PyCodec_StrictErrors(PyObject *exc) @@ -709,8 +702,7 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeEncodeError)) { PyObject *res; - int kind; - void *data; + Py_UCS1 *outp; if (PyUnicodeEncodeError_GetStart(exc, &start)) return NULL; if (PyUnicodeEncodeError_GetEnd(exc, &end)) @@ -719,10 +711,10 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) res = PyUnicode_New(len, '?'); if (res == NULL) return NULL; - kind = PyUnicode_KIND(res); - data = PyUnicode_DATA(res); + assert(PyUnicode_KIND(res) == PyUnicode_1BYTE_KIND); + outp = PyUnicode_1BYTE_DATA(res); for (i = 0; i < len; ++i) - PyUnicode_WRITE(kind, data, i, '?'); + outp[i] = '?'; assert(_PyUnicode_CheckConsistency(res, 1)); return Py_BuildValue("(Nn)", res, end); } @@ -735,8 +727,7 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) } else if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeTranslateError)) { PyObject *res; - int kind; - void *data; + Py_UCS2 *outp; if (PyUnicodeTranslateError_GetStart(exc, &start)) return NULL; if (PyUnicodeTranslateError_GetEnd(exc, &end)) @@ -745,10 +736,10 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) res = PyUnicode_New(len, Py_UNICODE_REPLACEMENT_CHARACTER); if (res == NULL) return NULL; - kind = PyUnicode_KIND(res); - data = PyUnicode_DATA(res); - for (i=0; i < len; i++) - PyUnicode_WRITE(kind, data, i, Py_UNICODE_REPLACEMENT_CHARACTER); + assert(PyUnicode_KIND(res) == PyUnicode_2BYTE_KIND); + outp = PyUnicode_2BYTE_DATA(res); + for (i = 0; i < len; i++) + outp[i] = Py_UNICODE_REPLACEMENT_CHARACTER; assert(_PyUnicode_CheckConsistency(res, 1)); return Py_BuildValue("(Nn)", res, end); } @@ -767,7 +758,7 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc) Py_ssize_t start; Py_ssize_t end; PyObject *res; - unsigned char *outp; + Py_UCS1 *outp; Py_ssize_t ressize; Py_UCS4 ch; if (PyUnicodeEncodeError_GetStart(exc, &start)) @@ -863,7 +854,7 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc) Py_ssize_t start; Py_ssize_t end; PyObject *res; - unsigned char *outp; + Py_UCS1 *outp; int ressize; Py_UCS4 c; @@ -974,7 +965,7 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc) Py_ssize_t start; Py_ssize_t end; PyObject *res; - unsigned char *outp; + Py_UCS1 *outp; Py_ssize_t ressize; int replsize; Py_UCS4 c; @@ -1500,34 +1491,39 @@ static int _PyCodecRegistry_Init(void) } }; - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); PyObject *mod; - unsigned i; if (interp->codec_search_path != NULL) return 0; interp->codec_search_path = PyList_New(0); + if (interp->codec_search_path == NULL) { + return -1; + } + interp->codec_search_cache = PyDict_New(); + if (interp->codec_search_cache == NULL) { + return -1; + } + interp->codec_error_registry = PyDict_New(); + if (interp->codec_error_registry == NULL) { + return -1; + } - if (interp->codec_error_registry) { - for (i = 0; i < Py_ARRAY_LENGTH(methods); ++i) { - PyObject *func = PyCFunction_NewEx(&methods[i].def, NULL, NULL); - int res; - if (!func) - Py_FatalError("can't initialize codec error registry"); - res = PyCodec_RegisterError(methods[i].name, func); - Py_DECREF(func); - if (res) - Py_FatalError("can't initialize codec error registry"); + for (size_t i = 0; i < Py_ARRAY_LENGTH(methods); ++i) { + PyObject *func = PyCFunction_NewEx(&methods[i].def, NULL, NULL); + if (!func) { + return -1; } - } - if (interp->codec_search_path == NULL || - interp->codec_search_cache == NULL || - interp->codec_error_registry == NULL) - Py_FatalError("can't initialize codec registry"); + int res = PyCodec_RegisterError(methods[i].name, func); + Py_DECREF(func); + if (res) { + return -1; + } + } mod = PyImport_ImportModuleNoBlock("encodings"); if (mod == NULL) { diff --git a/Python/compile.c b/Python/compile.c index 3259e8a4..51af28b5 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -23,7 +23,6 @@ #include "Python.h" -#include "pycore_pystate.h" /* _PyInterpreterState_GET_UNSAFE() */ #include "Python-ast.h" #include "ast.h" #include "code.h" @@ -85,14 +84,16 @@ It's called a frame block to distinguish it from a basic block in the compiler IR. */ -enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_TRY2, FINALLY_END, - WITH, ASYNC_WITH, HANDLER_CLEANUP }; +enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_END, + WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE }; struct fblockinfo { enum fblocktype fb_type; basicblock *fb_block; /* (optional) type-specific exit or cleanup block */ basicblock *fb_exit; + /* (optional) additional information required for unwinding */ + void *fb_datum; }; enum { @@ -140,8 +141,6 @@ struct compiler_unit { int u_firstlineno; /* the first lineno of the block */ int u_lineno; /* the lineno for the current stmt */ int u_col_offset; /* the offset of the current stmt */ - int u_lineno_set; /* boolean to indicate whether instr - has been generated with current lineno */ }; /* This struct captures the global state of a compilation. @@ -181,7 +180,7 @@ struct compiler { static int compiler_enter_scope(struct compiler *, identifier, int, void *, int); static void compiler_free(struct compiler *); static basicblock *compiler_new_block(struct compiler *); -static int compiler_next_instr(struct compiler *, basicblock *); +static int compiler_next_instr(basicblock *); static int compiler_addop(struct compiler *, int); static int compiler_addop_i(struct compiler *, int, Py_ssize_t); static int compiler_addop_j(struct compiler *, int, basicblock *, int); @@ -195,10 +194,11 @@ static int compiler_visit_keyword(struct compiler *, keyword_ty); static int compiler_visit_expr(struct compiler *, expr_ty); static int compiler_augassign(struct compiler *, stmt_ty); static int compiler_annassign(struct compiler *, stmt_ty); -static int compiler_visit_slice(struct compiler *, slice_ty, - expr_context_ty); +static int compiler_subscript(struct compiler *, expr_ty); +static int compiler_slice(struct compiler *, expr_ty); -static int inplace_binop(struct compiler *, operator_ty); +static int inplace_binop(operator_ty); +static int are_all_items_const(asdl_seq *, Py_ssize_t, Py_ssize_t); static int expr_constant(expr_ty); static int compiler_with(struct compiler *, stmt_ty, int); @@ -213,11 +213,13 @@ static int compiler_set_qualname(struct compiler *); static int compiler_sync_comprehension_generator( struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type); static int compiler_async_comprehension_generator( struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type); static PyCodeObject *assemble(struct compiler *, int addNone); @@ -320,7 +322,6 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, PyCodeObject *co = NULL; PyCompilerFlags local_flags = _PyCompilerFlags_INIT; int merged; - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; if (!__doc__) { __doc__ = PyUnicode_InternFromString("__doc__"); @@ -347,11 +348,15 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, c.c_future->ff_features = merged; flags->cf_flags = merged; c.c_flags = flags; - c.c_optimize = (optimize == -1) ? config->optimization_level : optimize; + c.c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize; c.c_nestlevel = 0; c.c_do_not_emit_bytecode = 0; - if (!_PyAST_Optimize(mod, arena, c.c_optimize)) { + _PyASTOptimizeState state; + state.optimize = c.c_optimize; + state.ff_features = merged; + + if (!_PyAST_Optimize(mod, arena, &state)) { goto finally; } @@ -554,13 +559,12 @@ compiler_enter_scope(struct compiler *c, identifier name, struct compiler_unit *u; basicblock *block; - u = (struct compiler_unit *)PyObject_Malloc(sizeof( + u = (struct compiler_unit *)PyObject_Calloc(1, sizeof( struct compiler_unit)); if (!u) { PyErr_NoMemory(); return 0; } - memset(u, 0, sizeof(struct compiler_unit)); u->u_scope_type = scope_type; u->u_argcount = 0; u->u_posonlyargcount = 0; @@ -609,7 +613,6 @@ compiler_enter_scope(struct compiler *c, identifier name, u->u_firstlineno = lineno; u->u_lineno = 0; u->u_col_offset = 0; - u->u_lineno_set = 0; u->u_consts = PyDict_New(); if (!u->u_consts) { compiler_unit_free(u); @@ -764,12 +767,11 @@ compiler_new_block(struct compiler *c) struct compiler_unit *u; u = c->u; - b = (basicblock *)PyObject_Malloc(sizeof(basicblock)); + b = (basicblock *)PyObject_Calloc(1, sizeof(basicblock)); if (b == NULL) { PyErr_NoMemory(); return NULL; } - memset((void *)b, 0, sizeof(basicblock)); /* Extend the singly linked list of blocks with new block. */ b->b_list = u->u_blocks; u->u_blocks = b; @@ -802,19 +804,17 @@ compiler_use_next_block(struct compiler *c, basicblock *block) */ static int -compiler_next_instr(struct compiler *c, basicblock *b) +compiler_next_instr(basicblock *b) { assert(b != NULL); if (b->b_instr == NULL) { - b->b_instr = (struct instr *)PyObject_Malloc( - sizeof(struct instr) * DEFAULT_BLOCK_SIZE); + b->b_instr = (struct instr *)PyObject_Calloc( + DEFAULT_BLOCK_SIZE, sizeof(struct instr)); if (b->b_instr == NULL) { PyErr_NoMemory(); return -1; } b->b_ialloc = DEFAULT_BLOCK_SIZE; - memset((char *)b->b_instr, 0, - sizeof(struct instr) * DEFAULT_BLOCK_SIZE); } else if (b->b_iused == b->b_ialloc) { struct instr *tmp; @@ -844,28 +844,18 @@ compiler_next_instr(struct compiler *c, basicblock *b) return b->b_iused++; } -/* Set the i_lineno member of the instruction at offset off if the - line number for the current expression/statement has not - already been set. If it has been set, the call has no effect. +/* Set the line number and column offset for the following instructions. The line number is reset in the following cases: - when entering a new scope - on each statement - - on each expression that start a new line + - on each expression and sub-expression - before the "except" and "finally" clauses - - before the "for" and "while" expressions */ -static void -compiler_set_lineno(struct compiler *c, int off) -{ - basicblock *b; - if (c->u->u_lineno_set) - return; - c->u->u_lineno_set = 1; - b = c->u->u_curblock; - b->b_instr[off].i_lineno = c->u->u_lineno; -} +#define SET_LOC(c, x) \ + (c)->u->u_lineno = (x)->lineno; \ + (c)->u->u_col_offset = (x)->col_offset; /* Return the stack effect of opcode with argument oparg. @@ -964,12 +954,6 @@ stack_effect(int opcode, int oparg, int jump) * Restore the stack position and push 6 values before jumping to * the handler if an exception be raised. */ return jump ? 6 : 1; - case WITH_CLEANUP_START: - return 2; /* or 1, depending on TOS */ - case WITH_CLEANUP_FINISH: - /* Pop a variable number of values pushed by WITH_CLEANUP_START - * + __exit__ or __aexit__. */ - return -3; case RETURN_VALUE: return -1; case IMPORT_STAR: @@ -984,10 +968,6 @@ stack_effect(int opcode, int oparg, int jump) return 0; case POP_EXCEPT: return -3; - case END_FINALLY: - case POP_FINALLY: - /* Pop 6 values when an exception was raised. */ - return -6; case STORE_NAME: return -1; @@ -1018,13 +998,6 @@ stack_effect(int opcode, int oparg, int jump) case BUILD_SET: case BUILD_STRING: return 1-oparg; - case BUILD_LIST_UNPACK: - case BUILD_TUPLE_UNPACK: - case BUILD_TUPLE_UNPACK_WITH_CALL: - case BUILD_SET_UNPACK: - case BUILD_MAP_UNPACK: - case BUILD_MAP_UNPACK_WITH_CALL: - return 1 - oparg; case BUILD_MAP: return 1 - 2*oparg; case BUILD_CONST_KEY_MAP: @@ -1032,7 +1005,11 @@ stack_effect(int opcode, int oparg, int jump) case LOAD_ATTR: return 0; case COMPARE_OP: + case IS_OP: + case CONTAINS_OP: return -1; + case JUMP_IF_NOT_EXC_MATCH: + return -2; case IMPORT_NAME: return -1; case IMPORT_FROM: @@ -1060,14 +1037,11 @@ stack_effect(int opcode, int oparg, int jump) * Restore the stack position and push 6 values before jumping to * the handler if an exception be raised. */ return jump ? 6 : 0; - case BEGIN_FINALLY: - /* Actually pushes 1 value, but count 6 for balancing with - * END_FINALLY and POP_FINALLY. - * This is the main reason of using this opcode instead of - * "LOAD_CONST None". */ - return 6; - case CALL_FINALLY: - return jump ? 1 : 0; + case RERAISE: + return -3; + + case WITH_EXCEPT_START: + return 1; case LOAD_FAST: return 1; @@ -1133,6 +1107,15 @@ stack_effect(int opcode, int oparg, int jump) return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0; case LOAD_METHOD: return 1; + case LOAD_ASSERTION_ERROR: + return 1; + case LIST_TO_TUPLE: + return 0; + case LIST_EXTEND: + case SET_UPDATE: + case DICT_MERGE: + case DICT_UPDATE: + return -1; default: return PY_INVALID_STACK_EFFECT; } @@ -1165,7 +1148,7 @@ compiler_addop(struct compiler *c, int opcode) if (c->c_do_not_emit_bytecode) { return 1; } - off = compiler_next_instr(c, c->u->u_curblock); + off = compiler_next_instr(c->u->u_curblock); if (off < 0) return 0; b = c->u->u_curblock; @@ -1174,12 +1157,12 @@ compiler_addop(struct compiler *c, int opcode) i->i_oparg = 0; if (opcode == RETURN_VALUE) b->b_return = 1; - compiler_set_lineno(c, off); + i->i_lineno = c->u->u_lineno; return 1; } static Py_ssize_t -compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o) +compiler_add_o(PyObject *dict, PyObject *o) { PyObject *v; Py_ssize_t arg; @@ -1327,7 +1310,7 @@ compiler_add_const(struct compiler *c, PyObject *o) return -1; } - Py_ssize_t arg = compiler_add_o(c, c->u->u_consts, key); + Py_ssize_t arg = compiler_add_o(c->u->u_consts, key); Py_DECREF(key); return arg; } @@ -1353,7 +1336,7 @@ compiler_addop_o(struct compiler *c, int opcode, PyObject *dict, return 1; } - Py_ssize_t arg = compiler_add_o(c, dict, o); + Py_ssize_t arg = compiler_add_o(dict, o); if (arg < 0) return 0; return compiler_addop_i(c, opcode, arg); @@ -1372,7 +1355,7 @@ compiler_addop_name(struct compiler *c, int opcode, PyObject *dict, PyObject *mangled = _Py_Mangle(c->u->u_private, o); if (!mangled) return 0; - arg = compiler_add_o(c, dict, mangled); + arg = compiler_add_o(dict, mangled); Py_DECREF(mangled); if (arg < 0) return 0; @@ -1403,13 +1386,13 @@ compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg) assert(HAS_ARG(opcode)); assert(0 <= oparg && oparg <= 2147483647); - off = compiler_next_instr(c, c->u->u_curblock); + off = compiler_next_instr(c->u->u_curblock); if (off < 0) return 0; i = &c->u->u_curblock->b_instr[off]; i->i_opcode = opcode; i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int); - compiler_set_lineno(c, off); + i->i_lineno = c->u->u_lineno; return 1; } @@ -1425,7 +1408,7 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute) assert(HAS_ARG(opcode)); assert(b != NULL); - off = compiler_next_instr(c, c->u->u_curblock); + off = compiler_next_instr(c->u->u_curblock); if (off < 0) return 0; i = &c->u->u_curblock->b_instr[off]; @@ -1435,7 +1418,7 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute) i->i_jabs = 1; else i->i_jrel = 1; - compiler_set_lineno(c, off); + i->i_lineno = c->u->u_lineno; return 1; } @@ -1514,6 +1497,12 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute) return 0; \ } + +#define ADDOP_COMPARE(C, CMP) { \ + if (!compiler_addcompare((C), (cmpop_ty)(CMP))) \ + return 0; \ +} + /* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use the ASDL name to synthesize the name of the C type and the visit function. */ @@ -1631,7 +1620,7 @@ find_ann(asdl_seq *stmts) static int compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b, - basicblock *exit) + basicblock *exit, void *datum) { struct fblockinfo *f; if (c->u->u_nfblocks >= CO_MAXBLOCKS) { @@ -1643,6 +1632,7 @@ compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b, f->fb_type = t; f->fb_block = b; f->fb_exit = exit; + f->fb_datum = datum; return 1; } @@ -1656,8 +1646,19 @@ compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b) assert(u->u_fblock[u->u_nfblocks].fb_block == b); } +static int +compiler_call_exit_with_nones(struct compiler *c) { + ADDOP_O(c, LOAD_CONST, Py_None, consts); + ADDOP(c, DUP_TOP); + ADDOP(c, DUP_TOP); + ADDOP_I(c, CALL_FUNCTION, 3); + return 1; +} + /* Unwind a frame block. If preserve_tos is true, the TOS before - * popping the blocks will be restored afterwards. + * popping the blocks will be restored afterwards, unless another + * return, break or continue is found. In which case, the TOS will + * be popped. */ static int compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, @@ -1667,15 +1668,6 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, case WHILE_LOOP: return 1; - case FINALLY_END: - info->fb_exit = NULL; - ADDOP_I(c, POP_FINALLY, preserve_tos); - if (preserve_tos) { - ADDOP(c, ROT_TWO); - } - ADDOP(c, POP_TOP); - return 1; - case FOR_LOOP: /* Pop the iterator */ if (preserve_tos) { @@ -1690,20 +1682,31 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, case FINALLY_TRY: ADDOP(c, POP_BLOCK); - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); + if (preserve_tos) { + if (!compiler_push_fblock(c, POP_VALUE, NULL, NULL, NULL)) { + return 0; + } + } + /* Emit the finally block, restoring the line number when done */ + int saved_lineno = c->u->u_lineno; + VISIT_SEQ(c, stmt, info->fb_datum); + c->u->u_lineno = saved_lineno; + if (preserve_tos) { + compiler_pop_fblock(c, POP_VALUE, NULL); + } return 1; - case FINALLY_TRY2: - ADDOP(c, POP_BLOCK); + case FINALLY_END: if (preserve_tos) { - ADDOP(c, ROT_TWO); - ADDOP(c, POP_TOP); - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); + ADDOP(c, ROT_FOUR); } - else { - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); - ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + if (preserve_tos) { + ADDOP(c, ROT_FOUR); } + ADDOP(c, POP_EXCEPT); return 1; case WITH: @@ -1712,34 +1715,66 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, if (preserve_tos) { ADDOP(c, ROT_TWO); } - ADDOP(c, BEGIN_FINALLY); - ADDOP(c, WITH_CLEANUP_START); + if(!compiler_call_exit_with_nones(c)) { + return 0; + } if (info->fb_type == ASYNC_WITH) { ADDOP(c, GET_AWAITABLE); ADDOP_LOAD_CONST(c, Py_None); ADDOP(c, YIELD_FROM); } - ADDOP(c, WITH_CLEANUP_FINISH); - ADDOP_I(c, POP_FINALLY, 0); + ADDOP(c, POP_TOP); return 1; case HANDLER_CLEANUP: + if (info->fb_datum) { + ADDOP(c, POP_BLOCK); + } if (preserve_tos) { ADDOP(c, ROT_FOUR); } - if (info->fb_exit) { - ADDOP(c, POP_BLOCK); - ADDOP(c, POP_EXCEPT); - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); + ADDOP(c, POP_EXCEPT); + if (info->fb_datum) { + ADDOP_LOAD_CONST(c, Py_None); + compiler_nameop(c, info->fb_datum, Store); + compiler_nameop(c, info->fb_datum, Del); } - else { - ADDOP(c, POP_EXCEPT); + return 1; + + case POP_VALUE: + if (preserve_tos) { + ADDOP(c, ROT_TWO); } + ADDOP(c, POP_TOP); return 1; } Py_UNREACHABLE(); } +/** Unwind block stack. If loop is not NULL, then stop when the first loop is encountered. */ +static int +compiler_unwind_fblock_stack(struct compiler *c, int preserve_tos, struct fblockinfo **loop) { + if (c->u->u_nfblocks == 0) { + return 1; + } + struct fblockinfo *top = &c->u->u_fblock[c->u->u_nfblocks-1]; + if (loop != NULL && (top->fb_type == WHILE_LOOP || top->fb_type == FOR_LOOP)) { + *loop = top; + return 1; + } + struct fblockinfo copy = *top; + c->u->u_nfblocks--; + if (!compiler_unwind_fblock(c, ©, preserve_tos)) { + return 0; + } + if (!compiler_unwind_fblock_stack(c, preserve_tos, loop)) { + return 0; + } + c->u->u_fblock[c->u->u_nfblocks] = copy; + c->u->u_nfblocks++; + return 1; +} + /* Compile a sequence of statements, checking for a docstring and for annotations. */ @@ -1754,10 +1789,9 @@ compiler_body(struct compiler *c, asdl_seq *stmts) This way line number for SETUP_ANNOTATIONS will always coincide with the line number of first "real" statement in module. If body is empty, then lineno will be set later in assemble. */ - if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && - !c->u->u_lineno && asdl_seq_LEN(stmts)) { + if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && asdl_seq_LEN(stmts)) { st = (stmt_ty)asdl_seq_GET(stmts, 0); - c->u->u_lineno = st->lineno; + SET_LOC(c, st); } /* Every annotated class and module should have __annotations__. */ if (find_ann(stmts)) { @@ -1815,10 +1849,6 @@ compiler_mod(struct compiler *c, mod_ty mod) VISIT_IN_SCOPE(c, expr, mod->v.Expression.body); addNone = 0; break; - case Suite_kind: - PyErr_SetString(PyExc_SystemError, - "suite should not be possible"); - return 0; default: PyErr_Format(PyExc_SystemError, "module kind %d should not be possible", @@ -1844,18 +1874,15 @@ get_ref_type(struct compiler *c, PyObject *name) return CELL; scope = PyST_GetScope(c->u->u_ste, name); if (scope == 0) { - char buf[350]; - PyOS_snprintf(buf, sizeof(buf), - "unknown scope for %.100s in %.100s(%s)\n" - "symbols: %s\nlocals: %s\nglobals: %s", - PyUnicode_AsUTF8(name), - PyUnicode_AsUTF8(c->u->u_name), - PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)), - PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)), - PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)), - PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names)) - ); - Py_FatalError(buf); + _Py_FatalErrorFormat(__func__, + "unknown scope for %.100s in %.100s(%s)\n" + "symbols: %s\nlocals: %s\nglobals: %s", + PyUnicode_AsUTF8(name), + PyUnicode_AsUTF8(c->u->u_name), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names))); } return scope; @@ -1890,7 +1917,7 @@ compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, Py free variable that has the same name as a method, the name will be considered free *and* local in the class. It should be handled by the closure, as - well as by the normal name loookup logic. + well as by the normal name lookup logic. */ reftype = get_ref_type(c, name); if (reftype == CELL) @@ -1898,7 +1925,7 @@ compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, Py else /* (reftype == FREE) */ arg = compiler_lookup_arg(c->u->u_freevars, name); if (arg == -1) { - fprintf(stderr, + _Py_FatalErrorFormat(__func__, "lookup %s in %s %d %d\n" "freevars of %s: %s\n", PyUnicode_AsUTF8(PyObject_Repr(name)), @@ -1906,7 +1933,6 @@ compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, Py reftype, arg, PyUnicode_AsUTF8(co->co_name), PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars))); - Py_FatalError("compiler_make_closure()"); } ADDOP_I(c, LOAD_CLOSURE, arg); } @@ -2126,6 +2152,55 @@ compiler_default_arguments(struct compiler *c, arguments_ty args) return funcflags; } +static int +forbidden_name(struct compiler *c, identifier name, expr_context_ty ctx) +{ + + if (ctx == Store && _PyUnicode_EqualToASCIIString(name, "__debug__")) { + compiler_error(c, "cannot assign to __debug__"); + return 1; + } + return 0; +} + +static int +compiler_check_debug_one_arg(struct compiler *c, arg_ty arg) +{ + if (arg != NULL) { + if (forbidden_name(c, arg->arg, Store)) + return 0; + } + return 1; +} + +static int +compiler_check_debug_args_seq(struct compiler *c, asdl_seq *args) +{ + if (args != NULL) { + for (Py_ssize_t i = 0, n = asdl_seq_LEN(args); i < n; i++) { + if (!compiler_check_debug_one_arg(c, asdl_seq_GET(args, i))) + return 0; + } + } + return 1; +} + +static int +compiler_check_debug_args(struct compiler *c, arguments_ty args) +{ + if (!compiler_check_debug_args_seq(c, args->posonlyargs)) + return 0; + if (!compiler_check_debug_args_seq(c, args->args)) + return 0; + if (!compiler_check_debug_one_arg(c, args->vararg)) + return 0; + if (!compiler_check_debug_args_seq(c, args->kwonlyargs)) + return 0; + if (!compiler_check_debug_one_arg(c, args->kwarg)) + return 0; + return 1; +} + static int compiler_function(struct compiler *c, stmt_ty s, int is_async) { @@ -2163,6 +2238,9 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async) scope_type = COMPILER_SCOPE_FUNCTION; } + if (!compiler_check_debug_args(c, args)) + return 0; + if (!compiler_decorators(c, decos)) return 0; @@ -2398,35 +2476,49 @@ check_compare(struct compiler *c, expr_ty e) return 1; } -static int -cmpop(cmpop_ty op) +static int compiler_addcompare(struct compiler *c, cmpop_ty op) { + int cmp; switch (op) { case Eq: - return PyCmp_EQ; + cmp = Py_EQ; + break; case NotEq: - return PyCmp_NE; + cmp = Py_NE; + break; case Lt: - return PyCmp_LT; + cmp = Py_LT; + break; case LtE: - return PyCmp_LE; + cmp = Py_LE; + break; case Gt: - return PyCmp_GT; + cmp = Py_GT; + break; case GtE: - return PyCmp_GE; + cmp = Py_GE; + break; case Is: - return PyCmp_IS; + ADDOP_I(c, IS_OP, 0); + return 1; case IsNot: - return PyCmp_IS_NOT; + ADDOP_I(c, IS_OP, 1); + return 1; case In: - return PyCmp_IN; + ADDOP_I(c, CONTAINS_OP, 0); + return 1; case NotIn: - return PyCmp_NOT_IN; + ADDOP_I(c, CONTAINS_OP, 1); + return 1; default: - return PyCmp_BAD; + Py_UNREACHABLE(); } + ADDOP_I(c, COMPARE_OP, cmp); + return 1; } + + static int compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond) { @@ -2491,14 +2583,12 @@ compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond) (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); ADDOP(c, DUP_TOP); ADDOP(c, ROT_THREE); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i)); ADDOP_JABS(c, POP_JUMP_IF_FALSE, cleanup); NEXT_BLOCK(c); } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n)); ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next); basicblock *end = compiler_new_block(c); if (end == NULL) @@ -2558,6 +2648,9 @@ compiler_lambda(struct compiler *c, expr_ty e) arguments_ty args = e->v.Lambda.args; assert(e->kind == Lambda_kind); + if (!compiler_check_debug_args(c, args)) + return 0; + if (!name) { name = PyUnicode_InternFromString(""); if (!name) @@ -2636,10 +2729,12 @@ compiler_if(struct compiler *c, stmt_ty s) if (next == NULL) return 0; } - else + else { next = end; - if (!compiler_jump_if(c, s->v.If.test, next, 0)) + } + if (!compiler_jump_if(c, s->v.If.test, next, 0)) { return 0; + } VISIT_SEQ(c, stmt, s->v.If.body); if (asdl_seq_LEN(s->v.If.orelse)) { ADDOP_JREL(c, JUMP_FORWARD, end); @@ -2659,12 +2754,12 @@ compiler_for(struct compiler *c, stmt_ty s) start = compiler_new_block(c); cleanup = compiler_new_block(c); end = compiler_new_block(c); - if (start == NULL || end == NULL || cleanup == NULL) + if (start == NULL || end == NULL || cleanup == NULL) { return 0; - - if (!compiler_push_fblock(c, FOR_LOOP, start, end)) + } + if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) { return 0; - + } VISIT(c, expr, s->v.For.iter); ADDOP(c, GET_ITER); compiler_use_next_block(c, start); @@ -2696,16 +2791,16 @@ compiler_async_for(struct compiler *c, stmt_ty s) except = compiler_new_block(c); end = compiler_new_block(c); - if (start == NULL || except == NULL || end == NULL) + if (start == NULL || except == NULL || end == NULL) { return 0; - + } VISIT(c, expr, s->v.AsyncFor.iter); ADDOP(c, GET_AITER); compiler_use_next_block(c, start); - if (!compiler_push_fblock(c, FOR_LOOP, start, end)) + if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) { return 0; - + } /* SETUP_FINALLY to guard the __anext__ call */ ADDOP_JREL(c, SETUP_FINALLY, except); ADDOP(c, GET_ANEXT); @@ -2743,7 +2838,7 @@ compiler_while(struct compiler *c, stmt_ty s) // Push a dummy block so the VISIT_SEQ knows that we are // inside a while loop so it can correctly evaluate syntax // errors. - if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL)) { + if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL, NULL)) { return 0; } VISIT_SEQ(c, stmt, s->v.While.body); @@ -2773,7 +2868,7 @@ compiler_while(struct compiler *c, stmt_ty s) orelse = NULL; compiler_use_next_block(c, loop); - if (!compiler_push_fblock(c, WHILE_LOOP, loop, end)) + if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL)) return 0; if (constant == -1) { if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) @@ -2813,12 +2908,8 @@ compiler_return(struct compiler *c, stmt_ty s) if (preserve_tos) { VISIT(c, expr, s->v.Return.value); } - for (int depth = c->u->u_nfblocks; depth--;) { - struct fblockinfo *info = &c->u->u_fblock[depth]; - - if (!compiler_unwind_fblock(c, info, preserve_tos)) - return 0; - } + if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL)) + return 0; if (s->v.Return.value == NULL) { ADDOP_LOAD_CONST(c, Py_None); } @@ -2833,33 +2924,32 @@ compiler_return(struct compiler *c, stmt_ty s) static int compiler_break(struct compiler *c) { - for (int depth = c->u->u_nfblocks; depth--;) { - struct fblockinfo *info = &c->u->u_fblock[depth]; - - if (!compiler_unwind_fblock(c, info, 0)) - return 0; - if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) { - ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_exit); - return 1; - } + struct fblockinfo *loop = NULL; + if (!compiler_unwind_fblock_stack(c, 0, &loop)) { + return 0; + } + if (loop == NULL) { + return compiler_error(c, "'break' outside loop"); + } + if (!compiler_unwind_fblock(c, loop, 0)) { + return 0; } - return compiler_error(c, "'break' outside loop"); + ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_exit); + return 1; } static int compiler_continue(struct compiler *c) { - for (int depth = c->u->u_nfblocks; depth--;) { - struct fblockinfo *info = &c->u->u_fblock[depth]; - - if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) { - ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_block); - return 1; - } - if (!compiler_unwind_fblock(c, info, 0)) - return 0; + struct fblockinfo *loop = NULL; + if (!compiler_unwind_fblock_stack(c, 0, &loop)) { + return 0; } - return compiler_error(c, "'continue' not properly in loop"); + if (loop == NULL) { + return compiler_error(c, "'continue' not properly in loop"); + } + ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_block); + return 1; } @@ -2868,10 +2958,11 @@ compiler_continue(struct compiler *c) SETUP_FINALLY L POP_BLOCK - BEGIN_FINALLY + + JUMP E L: - END_FINALLY + E: The special instructions use the block stack. Each block stack entry contains the instruction that created it (here @@ -2883,11 +2974,6 @@ compiler_continue(struct compiler *c) onto the block stack. POP_BLOCK: Pops en entry from the block stack. - BEGIN_FINALLY - Pushes NULL onto the value stack. - END_FINALLY: - Pops 1 (NULL or int) or 6 entries from the *value* stack and restore - the raised and the caught exceptions they specify. The block stack is unwound when an exception is raised: when a SETUP_FINALLY entry is found, the raised and the caught @@ -2899,47 +2985,18 @@ compiler_continue(struct compiler *c) static int compiler_try_finally(struct compiler *c, stmt_ty s) { - basicblock *start, *newcurblock, *body, *end; - int break_finally = 1; + basicblock *body, *end, *exit; body = compiler_new_block(c); end = compiler_new_block(c); - if (body == NULL || end == NULL) - return 0; - - start = c->u->u_curblock; - - /* `finally` block. Compile it first to determine if any of "break", - "continue" or "return" are used in it. */ - compiler_use_next_block(c, end); - if (!compiler_push_fblock(c, FINALLY_END, end, end)) + exit = compiler_new_block(c); + if (body == NULL || end == NULL || exit == NULL) return 0; - VISIT_SEQ(c, stmt, s->v.Try.finalbody); - ADDOP(c, END_FINALLY); - break_finally = (c->u->u_fblock[c->u->u_nfblocks - 1].fb_exit == NULL); - if (break_finally) { - /* Pops a placeholder. See below */ - ADDOP(c, POP_TOP); - } - compiler_pop_fblock(c, FINALLY_END, end); - - newcurblock = c->u->u_curblock; - c->u->u_curblock = start; - start->b_next = NULL; /* `try` block */ - c->u->u_lineno_set = 0; - c->u->u_lineno = s->lineno; - c->u->u_col_offset = s->col_offset; - if (break_finally) { - /* Pushes a placeholder for the value of "return" in the "try" block - to balance the stack for "break", "continue" and "return" in - the "finally" block. */ - ADDOP_LOAD_CONST(c, Py_None); - } ADDOP_JREL(c, SETUP_FINALLY, end); compiler_use_next_block(c, body); - if (!compiler_push_fblock(c, break_finally ? FINALLY_TRY2 : FINALLY_TRY, body, end)) + if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.Try.finalbody)) return 0; if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) { if (!compiler_try_except(c, s)) @@ -2949,12 +3006,17 @@ compiler_try_finally(struct compiler *c, stmt_ty s) VISIT_SEQ(c, stmt, s->v.Try.body); } ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); - compiler_pop_fblock(c, break_finally ? FINALLY_TRY2 : FINALLY_TRY, body); - - c->u->u_curblock->b_next = end; - c->u->u_curblock = newcurblock; - + compiler_pop_fblock(c, FINALLY_TRY, body); + VISIT_SEQ(c, stmt, s->v.Try.finalbody); + ADDOP_JREL(c, JUMP_FORWARD, exit); + /* `finally` block */ + compiler_use_next_block(c, end); + if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL)) + return 0; + VISIT_SEQ(c, stmt, s->v.Try.finalbody); + compiler_pop_fblock(c, FINALLY_END, end); + ADDOP(c, RERAISE); + compiler_use_next_block(c, exit); return 1; } @@ -2972,8 +3034,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s) [tb, val, exc] L1: DUP ) [tb, val, exc, exc] ) - [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1 - [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 ) + [tb, val, exc, exc, E1] JUMP_IF_NOT_EXC_MATCH L2 ) only if E1 [tb, val, exc] POP [tb, val] (or POP if no V1) [tb] POP @@ -2983,7 +3044,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s) [tb, val, exc] L2: DUP .............................etc....................... - [tb, val, exc] Ln+1: END_FINALLY # re-raise exception + [tb, val, exc] Ln+1: RERAISE # re-raise exception [] L0: @@ -3003,7 +3064,7 @@ compiler_try_except(struct compiler *c, stmt_ty s) return 0; ADDOP_JREL(c, SETUP_FINALLY, except); compiler_use_next_block(c, body); - if (!compiler_push_fblock(c, EXCEPT, body, NULL)) + if (!compiler_push_fblock(c, EXCEPT, body, NULL, NULL)) return 0; VISIT_SEQ(c, stmt, s->v.Try.body); ADDOP(c, POP_BLOCK); @@ -3016,17 +3077,14 @@ compiler_try_except(struct compiler *c, stmt_ty s) s->v.Try.handlers, i); if (!handler->v.ExceptHandler.type && i < n-1) return compiler_error(c, "default 'except:' must be last"); - c->u->u_lineno_set = 0; - c->u->u_lineno = handler->lineno; - c->u->u_col_offset = handler->col_offset; + SET_LOC(c, handler); except = compiler_new_block(c); if (except == NULL) return 0; if (handler->v.ExceptHandler.type) { ADDOP(c, DUP_TOP); VISIT(c, expr, handler->v.ExceptHandler.type); - ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH); - ADDOP_JABS(c, POP_JUMP_IF_FALSE, except); + ADDOP_JABS(c, JUMP_IF_NOT_EXC_MATCH, except); } ADDOP(c, POP_TOP); if (handler->v.ExceptHandler.name) { @@ -3055,28 +3113,29 @@ compiler_try_except(struct compiler *c, stmt_ty s) /* second try: */ ADDOP_JREL(c, SETUP_FINALLY, cleanup_end); compiler_use_next_block(c, cleanup_body); - if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, cleanup_end)) + if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name)) return 0; /* second # body */ VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); - ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body); + ADDOP(c, POP_BLOCK); + ADDOP(c, POP_EXCEPT); + /* name = None; del name */ + ADDOP_LOAD_CONST(c, Py_None); + compiler_nameop(c, handler->v.ExceptHandler.name, Store); + compiler_nameop(c, handler->v.ExceptHandler.name, Del); + ADDOP_JREL(c, JUMP_FORWARD, end); - /* finally: */ + /* except: */ compiler_use_next_block(c, cleanup_end); - if (!compiler_push_fblock(c, FINALLY_END, cleanup_end, NULL)) - return 0; /* name = None; del name */ ADDOP_LOAD_CONST(c, Py_None); compiler_nameop(c, handler->v.ExceptHandler.name, Store); compiler_nameop(c, handler->v.ExceptHandler.name, Del); - ADDOP(c, END_FINALLY); - ADDOP(c, POP_EXCEPT); - compiler_pop_fblock(c, FINALLY_END, cleanup_end); + ADDOP(c, RERAISE); } else { basicblock *cleanup_body; @@ -3088,16 +3147,16 @@ compiler_try_except(struct compiler *c, stmt_ty s) ADDOP(c, POP_TOP); ADDOP(c, POP_TOP); compiler_use_next_block(c, cleanup_body); - if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL)) + if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, NULL)) return 0; VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); - ADDOP(c, POP_EXCEPT); compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body); + ADDOP(c, POP_EXCEPT); + ADDOP_JREL(c, JUMP_FORWARD, end); } - ADDOP_JREL(c, JUMP_FORWARD, end); compiler_use_next_block(c, except); } - ADDOP(c, END_FINALLY); + ADDOP(c, RERAISE); compiler_use_next_block(c, orelse); VISIT_SEQ(c, stmt, s->v.Try.orelse); compiler_use_next_block(c, end); @@ -3265,16 +3324,10 @@ compiler_from_import(struct compiler *c, stmt_ty s) static int compiler_assert(struct compiler *c, stmt_ty s) { - static PyObject *assertion_error = NULL; basicblock *end; if (c->c_optimize) return 1; - if (assertion_error == NULL) { - assertion_error = PyUnicode_InternFromString("AssertionError"); - if (assertion_error == NULL) - return 0; - } if (s->v.Assert.test->kind == Tuple_kind && asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) { @@ -3289,7 +3342,7 @@ compiler_assert(struct compiler *c, stmt_ty s) return 0; if (!compiler_jump_if(c, s->v.Assert.test, end, 1)) return 0; - ADDOP_O(c, LOAD_GLOBAL, assertion_error, names); + ADDOP(c, LOAD_ASSERTION_ERROR); if (s->v.Assert.msg) { VISIT(c, expr, s->v.Assert.msg); ADDOP_I(c, CALL_FUNCTION, 1); @@ -3324,9 +3377,7 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s) Py_ssize_t i, n; /* Always assign a lineno to the next instruction for a stmt. */ - c->u->u_lineno = s->lineno; - c->u->u_col_offset = s->col_offset; - c->u->u_lineno_set = 0; + SET_LOC(c, s); switch (s->kind) { case FunctionDef_kind: @@ -3422,7 +3473,7 @@ unaryop(unaryop_ty op) } static int -binop(struct compiler *c, operator_ty op) +binop(operator_ty op) { switch (op) { case Add: @@ -3459,7 +3510,7 @@ binop(struct compiler *c, operator_ty op) } static int -inplace_binop(struct compiler *c, operator_ty op) +inplace_binop(operator_ty op) { switch (op) { case Add: @@ -3504,12 +3555,14 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) PyObject *dict = c->u->u_names; PyObject *mangled; - /* XXX AugStore isn't used anywhere! */ assert(!_PyUnicode_EqualToASCIIString(name, "None") && !_PyUnicode_EqualToASCIIString(name, "True") && !_PyUnicode_EqualToASCIIString(name, "False")); + if (forbidden_name(c, name, ctx)) + return 0; + mangled = _Py_Mangle(c->u->u_private, name); if (!mangled) return 0; @@ -3551,76 +3604,36 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) case Load: op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF; break; - case Store: - op = STORE_DEREF; - break; - case AugLoad: - case AugStore: - break; + case Store: op = STORE_DEREF; break; case Del: op = DELETE_DEREF; break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid for deref variable"); - return 0; } break; case OP_FAST: switch (ctx) { case Load: op = LOAD_FAST; break; - case Store: - op = STORE_FAST; - break; + case Store: op = STORE_FAST; break; case Del: op = DELETE_FAST; break; - case AugLoad: - case AugStore: - break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid for local variable"); - return 0; } ADDOP_N(c, op, mangled, varnames); return 1; case OP_GLOBAL: switch (ctx) { case Load: op = LOAD_GLOBAL; break; - case Store: - op = STORE_GLOBAL; - break; + case Store: op = STORE_GLOBAL; break; case Del: op = DELETE_GLOBAL; break; - case AugLoad: - case AugStore: - break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid for global variable"); - return 0; } break; case OP_NAME: switch (ctx) { case Load: op = LOAD_NAME; break; - case Store: - op = STORE_NAME; - break; + case Store: op = STORE_NAME; break; case Del: op = DELETE_NAME; break; - case AugLoad: - case AugStore: - break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid for name variable"); - return 0; } break; } assert(op); - arg = compiler_add_o(c, dict, mangled); + arg = compiler_add_o(dict, mangled); Py_DECREF(mangled); if (arg < 0) return 0; @@ -3656,36 +3669,79 @@ compiler_boolop(struct compiler *c, expr_ty e) } static int -starunpack_helper(struct compiler *c, asdl_seq *elts, - int single_op, int inner_op, int outer_op) +starunpack_helper(struct compiler *c, asdl_seq *elts, int pushed, + int build, int add, int extend, int tuple) { Py_ssize_t n = asdl_seq_LEN(elts); - Py_ssize_t i, nsubitems = 0, nseen = 0; + Py_ssize_t i, seen_star = 0; + if (n > 2 && are_all_items_const(elts, 0, n)) { + PyObject *folded = PyTuple_New(n); + if (folded == NULL) { + return 0; + } + PyObject *val; + for (i = 0; i < n; i++) { + val = ((expr_ty)asdl_seq_GET(elts, i))->v.Constant.value; + Py_INCREF(val); + PyTuple_SET_ITEM(folded, i, val); + } + if (tuple) { + ADDOP_LOAD_CONST_NEW(c, folded); + } else { + if (add == SET_ADD) { + Py_SETREF(folded, PyFrozenSet_New(folded)); + if (folded == NULL) { + return 0; + } + } + ADDOP_I(c, build, pushed); + ADDOP_LOAD_CONST_NEW(c, folded); + ADDOP_I(c, extend, 1); + } + return 1; + } + for (i = 0; i < n; i++) { expr_ty elt = asdl_seq_GET(elts, i); if (elt->kind == Starred_kind) { - if (nseen) { - ADDOP_I(c, inner_op, nseen); - nseen = 0; - nsubitems++; + seen_star = 1; + } + } + if (seen_star) { + seen_star = 0; + for (i = 0; i < n; i++) { + expr_ty elt = asdl_seq_GET(elts, i); + if (elt->kind == Starred_kind) { + if (seen_star == 0) { + ADDOP_I(c, build, i+pushed); + seen_star = 1; + } + VISIT(c, expr, elt->v.Starred.value); + ADDOP_I(c, extend, 1); + } + else { + VISIT(c, expr, elt); + if (seen_star) { + ADDOP_I(c, add, 1); + } } - VISIT(c, expr, elt->v.Starred.value); - nsubitems++; } - else { - VISIT(c, expr, elt); - nseen++; + assert(seen_star); + if (tuple) { + ADDOP(c, LIST_TO_TUPLE); } } - if (nsubitems) { - if (nseen) { - ADDOP_I(c, inner_op, nseen); - nsubitems++; + else { + for (i = 0; i < n; i++) { + expr_ty elt = asdl_seq_GET(elts, i); + VISIT(c, expr, elt); + } + if (tuple) { + ADDOP_I(c, BUILD_TUPLE, n+pushed); + } else { + ADDOP_I(c, build, n+pushed); } - ADDOP_I(c, outer_op, nsubitems); } - else - ADDOP_I(c, single_op, nseen); return 1; } @@ -3705,17 +3761,19 @@ assignment_helper(struct compiler *c, asdl_seq *elts) "star-unpacking assignment"); ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8))); seen_star = 1; - asdl_seq_SET(elts, i, elt->v.Starred.value); } else if (elt->kind == Starred_kind) { return compiler_error(c, - "two starred expressions in assignment"); + "multiple starred expressions in assignment"); } } if (!seen_star) { ADDOP_I(c, UNPACK_SEQUENCE, n); } - VISIT_SEQ(c, expr, elts); + for (i = 0; i < n; i++) { + expr_ty elt = asdl_seq_GET(elts, i); + VISIT(c, expr, elt->kind != Starred_kind ? elt : elt->v.Starred.value); + } return 1; } @@ -3727,8 +3785,8 @@ compiler_list(struct compiler *c, expr_ty e) return assignment_helper(c, elts); } else if (e->v.List.ctx == Load) { - return starunpack_helper(c, elts, - BUILD_LIST, BUILD_TUPLE, BUILD_LIST_UNPACK); + return starunpack_helper(c, elts, 0, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 0); } else VISIT_SEQ(c, expr, elts); @@ -3743,8 +3801,8 @@ compiler_tuple(struct compiler *c, expr_ty e) return assignment_helper(c, elts); } else if (e->v.Tuple.ctx == Load) { - return starunpack_helper(c, elts, - BUILD_TUPLE, BUILD_TUPLE, BUILD_TUPLE_UNPACK); + return starunpack_helper(c, elts, 0, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 1); } else VISIT_SEQ(c, expr, elts); @@ -3754,8 +3812,8 @@ compiler_tuple(struct compiler *c, expr_ty e) static int compiler_set(struct compiler *c, expr_ty e) { - return starunpack_helper(c, e->v.Set.elts, BUILD_SET, - BUILD_SET, BUILD_SET_UNPACK); + return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET, + SET_ADD, SET_UPDATE, 0); } static int @@ -3805,37 +3863,58 @@ static int compiler_dict(struct compiler *c, expr_ty e) { Py_ssize_t i, n, elements; - int containers; + int have_dict; int is_unpacking = 0; n = asdl_seq_LEN(e->v.Dict.values); - containers = 0; + have_dict = 0; elements = 0; for (i = 0; i < n; i++) { is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL; - if (elements == 0xFFFF || (elements && is_unpacking)) { - if (!compiler_subdict(c, e, i - elements, i)) - return 0; - containers++; - elements = 0; - } if (is_unpacking) { + if (elements) { + if (!compiler_subdict(c, e, i - elements, i)) { + return 0; + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; + elements = 0; + } + if (have_dict == 0) { + ADDOP_I(c, BUILD_MAP, 0); + have_dict = 1; + } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i)); - containers++; + ADDOP_I(c, DICT_UPDATE, 1); } else { - elements++; + if (elements == 0xFFFF) { + if (!compiler_subdict(c, e, i - elements, i + 1)) { + return 0; + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; + elements = 0; + } + else { + elements++; + } } } - if (elements || containers == 0) { - if (!compiler_subdict(c, e, n - elements, n)) + if (elements) { + if (!compiler_subdict(c, e, n - elements, n)) { return 0; - containers++; - } - /* If there is more than one dict, they need to be merged into a new - * dict. If there is one dict and it's an unpacking, then it needs - * to be copied into a new dict." */ - if (containers > 1 || is_unpacking) { - ADDOP_I(c, BUILD_MAP_UNPACK, containers); + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; + } + if (!have_dict) { + ADDOP_I(c, BUILD_MAP, 0); } return 1; } @@ -3853,8 +3932,7 @@ compiler_compare(struct compiler *c, expr_ty e) n = asdl_seq_LEN(e->v.Compare.ops) - 1; if (n == 0) { VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, 0)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0)); } else { basicblock *cleanup = compiler_new_block(c); @@ -3865,14 +3943,12 @@ compiler_compare(struct compiler *c, expr_ty e) (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); ADDOP(c, DUP_TOP); ADDOP(c, ROT_THREE); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i)); ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup); NEXT_BLOCK(c); } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n)); basicblock *end = compiler_new_block(c); if (end == NULL) return 0; @@ -3908,7 +3984,7 @@ infer_type(expr_ty e) case FormattedValue_kind: return &PyUnicode_Type; case Constant_kind: - return e->v.Constant.value->ob_type; + return Py_TYPE(e->v.Constant.value); default: return NULL; } @@ -3965,14 +4041,11 @@ check_subscripter(struct compiler *c, expr_ty e) } static int -check_index(struct compiler *c, expr_ty e, slice_ty s) +check_index(struct compiler *c, expr_ty e, expr_ty s) { PyObject *v; - if (s->kind != Index_kind) { - return 1; - } - PyTypeObject *index_type = infer_type(s->v.Index.value); + PyTypeObject *index_type = infer_type(s); if (index_type == NULL || PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS) || index_type == &PySlice_Type) { @@ -4032,6 +4105,35 @@ maybe_optimize_method_call(struct compiler *c, expr_ty e) return 1; } +static int +validate_keywords(struct compiler *c, asdl_seq *keywords) +{ + Py_ssize_t nkeywords = asdl_seq_LEN(keywords); + for (Py_ssize_t i = 0; i < nkeywords; i++) { + keyword_ty key = ((keyword_ty)asdl_seq_GET(keywords, i)); + if (key->arg == NULL) { + continue; + } + if (forbidden_name(c, key->arg, Store)) { + return -1; + } + for (Py_ssize_t j = i + 1; j < nkeywords; j++) { + keyword_ty other = ((keyword_ty)asdl_seq_GET(keywords, j)); + if (other->arg && !PyUnicode_Compare(key->arg, other->arg)) { + PyObject *msg = PyUnicode_FromFormat("keyword argument repeated: %U", key->arg); + if (msg == NULL) { + return -1; + } + c->u->u_col_offset = other->col_offset; + compiler_error(c, PyUnicode_AsUTF8(msg)); + Py_DECREF(msg); + return -1; + } + } + } + return 0; +} + static int compiler_call(struct compiler *c, expr_ty e) { @@ -4147,70 +4249,90 @@ compiler_call_helper(struct compiler *c, asdl_seq *keywords) { Py_ssize_t i, nseen, nelts, nkwelts; - int mustdictunpack = 0; - /* the number of tuples and dictionaries on the stack */ - Py_ssize_t nsubargs = 0, nsubkwargs = 0; + if (validate_keywords(c, keywords) == -1) { + return 0; + } nelts = asdl_seq_LEN(args); nkwelts = asdl_seq_LEN(keywords); + for (i = 0; i < nelts; i++) { + expr_ty elt = asdl_seq_GET(args, i); + if (elt->kind == Starred_kind) { + goto ex_call; + } + } for (i = 0; i < nkwelts; i++) { keyword_ty kw = asdl_seq_GET(keywords, i); if (kw->arg == NULL) { - mustdictunpack = 1; - break; + goto ex_call; } } - nseen = n; /* the number of positional arguments on the stack */ + /* No * or ** args, so can use faster calling sequence */ for (i = 0; i < nelts; i++) { expr_ty elt = asdl_seq_GET(args, i); - if (elt->kind == Starred_kind) { - /* A star-arg. If we've seen positional arguments, - pack the positional arguments into a tuple. */ - if (nseen) { - ADDOP_I(c, BUILD_TUPLE, nseen); - nseen = 0; - nsubargs++; - } - VISIT(c, expr, elt->v.Starred.value); - nsubargs++; + assert(elt->kind != Starred_kind); + VISIT(c, expr, elt); + } + if (nkwelts) { + PyObject *names; + VISIT_SEQ(c, keyword, keywords); + names = PyTuple_New(nkwelts); + if (names == NULL) { + return 0; } - else { - VISIT(c, expr, elt); - nseen++; + for (i = 0; i < nkwelts; i++) { + keyword_ty kw = asdl_seq_GET(keywords, i); + Py_INCREF(kw->arg); + PyTuple_SET_ITEM(names, i, kw->arg); } + ADDOP_LOAD_CONST_NEW(c, names); + ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts); + return 1; + } + else { + ADDOP_I(c, CALL_FUNCTION, n + nelts); + return 1; } - /* Same dance again for keyword arguments */ - if (nsubargs || mustdictunpack) { - if (nseen) { - /* Pack up any trailing positional arguments. */ - ADDOP_I(c, BUILD_TUPLE, nseen); - nsubargs++; - } - if (nsubargs > 1) { - /* If we ended up with more than one stararg, we need - to concatenate them into a single sequence. */ - ADDOP_I(c, BUILD_TUPLE_UNPACK_WITH_CALL, nsubargs); - } - else if (nsubargs == 0) { - ADDOP_I(c, BUILD_TUPLE, 0); - } +ex_call: + + /* Do positional arguments. */ + if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) { + VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value); + } + else if (starunpack_helper(c, args, n, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 1) == 0) { + return 0; + } + /* Then keyword arguments */ + if (nkwelts) { + /* Has a new dict been pushed */ + int have_dict = 0; + nseen = 0; /* the number of keyword arguments on the stack following */ for (i = 0; i < nkwelts; i++) { keyword_ty kw = asdl_seq_GET(keywords, i); if (kw->arg == NULL) { /* A keyword argument unpacking. */ if (nseen) { - if (!compiler_subkwargs(c, keywords, i - nseen, i)) + if (!compiler_subkwargs(c, keywords, i - nseen, i)) { return 0; - nsubkwargs++; + } + if (have_dict) { + ADDOP_I(c, DICT_MERGE, 1); + } + have_dict = 1; nseen = 0; } + if (!have_dict) { + ADDOP_I(c, BUILD_MAP, 0); + have_dict = 1; + } VISIT(c, expr, kw->value); - nsubkwargs++; + ADDOP_I(c, DICT_MERGE, 1); } else { nseen++; @@ -4218,37 +4340,18 @@ compiler_call_helper(struct compiler *c, } if (nseen) { /* Pack up any trailing keyword arguments. */ - if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) + if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) { return 0; - nsubkwargs++; - } - if (nsubkwargs > 1) { - /* Pack it all up */ - ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs); - } - ADDOP_I(c, CALL_FUNCTION_EX, nsubkwargs > 0); - return 1; - } - else if (nkwelts) { - PyObject *names; - VISIT_SEQ(c, keyword, keywords); - names = PyTuple_New(nkwelts); - if (names == NULL) { - return 0; - } - for (i = 0; i < nkwelts; i++) { - keyword_ty kw = asdl_seq_GET(keywords, i); - Py_INCREF(kw->arg); - PyTuple_SET_ITEM(names, i, kw->arg); + } + if (have_dict) { + ADDOP_I(c, DICT_MERGE, 1); + } + have_dict = 1; } - ADDOP_LOAD_CONST_NEW(c, names); - ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts); - return 1; - } - else { - ADDOP_I(c, CALL_FUNCTION, n + nelts); - return 1; + assert(have_dict); } + ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0); + return 1; } @@ -4269,22 +4372,24 @@ compiler_call_helper(struct compiler *c, static int compiler_comprehension_generator(struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type) { comprehension_ty gen; gen = (comprehension_ty)asdl_seq_GET(generators, gen_index); if (gen->is_async) { return compiler_async_comprehension_generator( - c, generators, gen_index, elt, val, type); + c, generators, gen_index, depth, elt, val, type); } else { return compiler_sync_comprehension_generator( - c, generators, gen_index, elt, val, type); + c, generators, gen_index, depth, elt, val, type); } } static int compiler_sync_comprehension_generator(struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type) { /* generate code for the iterator, then each of the ifs, @@ -4312,12 +4417,38 @@ compiler_sync_comprehension_generator(struct compiler *c, } else { /* Sub-iter - calculate on the fly */ - VISIT(c, expr, gen->iter); - ADDOP(c, GET_ITER); + /* Fast path for the temporary variable assignment idiom: + for y in [f(x)] + */ + asdl_seq *elts; + switch (gen->iter->kind) { + case List_kind: + elts = gen->iter->v.List.elts; + break; + case Tuple_kind: + elts = gen->iter->v.Tuple.elts; + break; + default: + elts = NULL; + } + if (asdl_seq_LEN(elts) == 1) { + expr_ty elt = asdl_seq_GET(elts, 0); + if (elt->kind != Starred_kind) { + VISIT(c, expr, elt); + start = NULL; + } + } + if (start) { + VISIT(c, expr, gen->iter); + ADDOP(c, GET_ITER); + } + } + if (start) { + depth++; + compiler_use_next_block(c, start); + ADDOP_JREL(c, FOR_ITER, anchor); + NEXT_BLOCK(c); } - compiler_use_next_block(c, start); - ADDOP_JREL(c, FOR_ITER, anchor); - NEXT_BLOCK(c); VISIT(c, expr, gen->target); /* XXX this needs to be cleaned up...a lot! */ @@ -4331,7 +4462,7 @@ compiler_sync_comprehension_generator(struct compiler *c, if (++gen_index < asdl_seq_LEN(generators)) if (!compiler_comprehension_generator(c, - generators, gen_index, + generators, gen_index, depth, elt, val, type)) return 0; @@ -4346,18 +4477,18 @@ compiler_sync_comprehension_generator(struct compiler *c, break; case COMP_LISTCOMP: VISIT(c, expr, elt); - ADDOP_I(c, LIST_APPEND, gen_index + 1); + ADDOP_I(c, LIST_APPEND, depth + 1); break; case COMP_SETCOMP: VISIT(c, expr, elt); - ADDOP_I(c, SET_ADD, gen_index + 1); + ADDOP_I(c, SET_ADD, depth + 1); break; case COMP_DICTCOMP: /* With '{k: v}', k is evaluated before v, so we do the same. */ VISIT(c, expr, elt); VISIT(c, expr, val); - ADDOP_I(c, MAP_ADD, gen_index + 1); + ADDOP_I(c, MAP_ADD, depth + 1); break; default: return 0; @@ -4366,8 +4497,10 @@ compiler_sync_comprehension_generator(struct compiler *c, compiler_use_next_block(c, skip); } compiler_use_next_block(c, if_cleanup); - ADDOP_JABS(c, JUMP_ABSOLUTE, start); - compiler_use_next_block(c, anchor); + if (start) { + ADDOP_JABS(c, JUMP_ABSOLUTE, start); + compiler_use_next_block(c, anchor); + } return 1; } @@ -4375,6 +4508,7 @@ compiler_sync_comprehension_generator(struct compiler *c, static int compiler_async_comprehension_generator(struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type) { comprehension_ty gen; @@ -4418,9 +4552,10 @@ compiler_async_comprehension_generator(struct compiler *c, NEXT_BLOCK(c); } + depth++; if (++gen_index < asdl_seq_LEN(generators)) if (!compiler_comprehension_generator(c, - generators, gen_index, + generators, gen_index, depth, elt, val, type)) return 0; @@ -4435,18 +4570,18 @@ compiler_async_comprehension_generator(struct compiler *c, break; case COMP_LISTCOMP: VISIT(c, expr, elt); - ADDOP_I(c, LIST_APPEND, gen_index + 1); + ADDOP_I(c, LIST_APPEND, depth + 1); break; case COMP_SETCOMP: VISIT(c, expr, elt); - ADDOP_I(c, SET_ADD, gen_index + 1); + ADDOP_I(c, SET_ADD, depth + 1); break; case COMP_DICTCOMP: /* With '{k: v}', k is evaluated before v, so we do the same. */ VISIT(c, expr, elt); VISIT(c, expr, val); - ADDOP_I(c, MAP_ADD, gen_index + 1); + ADDOP_I(c, MAP_ADD, depth + 1); break; default: return 0; @@ -4511,7 +4646,7 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, ADDOP_I(c, op, 0); } - if (!compiler_comprehension_generator(c, generators, 0, elt, + if (!compiler_comprehension_generator(c, generators, 0, 0, elt, val, type)) goto error_in_scope; @@ -4643,6 +4778,22 @@ expr_constant(expr_ty e) return -1; } +static int +compiler_with_except_finish(struct compiler *c) { + basicblock *exit; + exit = compiler_new_block(c); + if (exit == NULL) + return 0; + ADDOP_JABS(c, POP_JUMP_IF_TRUE, exit); + ADDOP(c, RERAISE); + compiler_use_next_block(c, exit); + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + ADDOP(c, POP_EXCEPT); + ADDOP(c, POP_TOP); + return 1; +} /* Implements the async with statement. @@ -4671,7 +4822,7 @@ expr_constant(expr_ty e) static int compiler_async_with(struct compiler *c, stmt_ty s, int pos) { - basicblock *block, *finally; + basicblock *block, *final, *exit; withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos); assert(s->kind == AsyncWith_kind); @@ -4682,8 +4833,9 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos) } block = compiler_new_block(c); - finally = compiler_new_block(c); - if (!block || !finally) + final = compiler_new_block(c); + exit = compiler_new_block(c); + if (!block || !final || !exit) return 0; /* Evaluate EXPR */ @@ -4694,11 +4846,11 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos) ADDOP_LOAD_CONST(c, Py_None); ADDOP(c, YIELD_FROM); - ADDOP_JREL(c, SETUP_ASYNC_WITH, finally); + ADDOP_JREL(c, SETUP_ASYNC_WITH, final); /* SETUP_ASYNC_WITH pushes a finally block. */ compiler_use_next_block(c, block); - if (!compiler_push_fblock(c, ASYNC_WITH, block, finally)) { + if (!compiler_push_fblock(c, ASYNC_WITH, block, final, NULL)) { return 0; } @@ -4717,76 +4869,80 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos) else if (!compiler_async_with(c, s, pos)) return 0; - /* End of try block; start the finally block */ - ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); compiler_pop_fblock(c, ASYNC_WITH, block); + ADDOP(c, POP_BLOCK); + /* End of body; start the cleanup */ - compiler_use_next_block(c, finally); - if (!compiler_push_fblock(c, FINALLY_END, finally, NULL)) + /* For successful outcome: + * call __exit__(None, None, None) + */ + if(!compiler_call_exit_with_nones(c)) return 0; + ADDOP(c, GET_AWAITABLE); + ADDOP_O(c, LOAD_CONST, Py_None, consts); + ADDOP(c, YIELD_FROM); - /* Finally block starts; context.__exit__ is on the stack under - the exception or return information. Just issue our magic - opcode. */ - ADDOP(c, WITH_CLEANUP_START); + ADDOP(c, POP_TOP); + + ADDOP_JABS(c, JUMP_ABSOLUTE, exit); + /* For exceptional outcome: */ + compiler_use_next_block(c, final); + + ADDOP(c, WITH_EXCEPT_START); ADDOP(c, GET_AWAITABLE); ADDOP_LOAD_CONST(c, Py_None); ADDOP(c, YIELD_FROM); + compiler_with_except_finish(c); - ADDOP(c, WITH_CLEANUP_FINISH); - - /* Finally block ends. */ - ADDOP(c, END_FINALLY); - compiler_pop_fblock(c, FINALLY_END, finally); +compiler_use_next_block(c, exit); return 1; } /* Implements the with statement from PEP 343. - - The semantics outlined in that PEP are as follows: - with EXPR as VAR: BLOCK - - It is implemented roughly as: - - context = EXPR - exit = context.__exit__ # not calling it - value = context.__enter__() - try: - VAR = value # if VAR present in the syntax - BLOCK - finally: - if an exception was raised: - exc = copy of (exception, instance, traceback) - else: - exc = (None, None, None) - exit(*exc) + is implemented as: + + SETUP_WITH E + or POP_TOP + + LOAD_CONST (None, None, None) + CALL_FUNCTION_EX 0 + JUMP_FORWARD EXIT + E: WITH_EXCEPT_START (calls EXPR.__exit__) + POP_JUMP_IF_TRUE T: + RERAISE + T: POP_TOP * 3 (remove exception from stack) + POP_EXCEPT + POP_TOP + EXIT: */ + static int compiler_with(struct compiler *c, stmt_ty s, int pos) { - basicblock *block, *finally; + basicblock *block, *final, *exit; withitem_ty item = asdl_seq_GET(s->v.With.items, pos); assert(s->kind == With_kind); block = compiler_new_block(c); - finally = compiler_new_block(c); - if (!block || !finally) + final = compiler_new_block(c); + exit = compiler_new_block(c); + if (!block || !final || !exit) return 0; /* Evaluate EXPR */ VISIT(c, expr, item->context_expr); - ADDOP_JREL(c, SETUP_WITH, finally); + /* Will push bound __exit__ */ + ADDOP_JREL(c, SETUP_WITH, final); /* SETUP_WITH pushes a finally block. */ compiler_use_next_block(c, block); - if (!compiler_push_fblock(c, WITH, block, finally)) { + if (!compiler_push_fblock(c, WITH, block, final, NULL)) { return 0; } @@ -4805,24 +4961,26 @@ compiler_with(struct compiler *c, stmt_ty s, int pos) else if (!compiler_with(c, s, pos)) return 0; - /* End of try block; start the finally block */ ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); compiler_pop_fblock(c, WITH, block); - compiler_use_next_block(c, finally); - if (!compiler_push_fblock(c, FINALLY_END, finally, NULL)) + /* End of body; start the cleanup. */ + + /* For successful outcome: + * call __exit__(None, None, None) + */ + if (!compiler_call_exit_with_nones(c)) return 0; + ADDOP(c, POP_TOP); + ADDOP_JREL(c, JUMP_FORWARD, exit); - /* Finally block starts; context.__exit__ is on the stack under - the exception or return information. Just issue our magic - opcode. */ - ADDOP(c, WITH_CLEANUP_START); - ADDOP(c, WITH_CLEANUP_FINISH); + /* For exceptional outcome: */ + compiler_use_next_block(c, final); - /* Finally block ends. */ - ADDOP(c, END_FINALLY); - compiler_pop_fblock(c, FINALLY_END, finally); + ADDOP(c, WITH_EXCEPT_START); + compiler_with_except_finish(c); + + compiler_use_next_block(c, exit); return 1; } @@ -4840,7 +4998,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) case BinOp_kind: VISIT(c, expr, e->v.BinOp.left); VISIT(c, expr, e->v.BinOp.right); - ADDOP(c, binop(c, e->v.BinOp.op)); + ADDOP(c, binop(e->v.BinOp.op)); break; case UnaryOp_kind: VISIT(c, expr, e->v.UnaryOp.operand); @@ -4915,65 +5073,23 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) return compiler_formatted_value(c, e); /* The following exprs can be assignment targets. */ case Attribute_kind: - if (e->v.Attribute.ctx != AugStore) - VISIT(c, expr, e->v.Attribute.value); + VISIT(c, expr, e->v.Attribute.value); switch (e->v.Attribute.ctx) { - case AugLoad: - ADDOP(c, DUP_TOP); - /* Fall through */ case Load: ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names); break; - case AugStore: - ADDOP(c, ROT_TWO); - /* Fall through */ case Store: + if (forbidden_name(c, e->v.Attribute.attr, e->v.Attribute.ctx)) + return 0; ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names); break; case Del: ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names); break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid in attribute expression"); - return 0; } break; case Subscript_kind: - switch (e->v.Subscript.ctx) { - case AugLoad: - VISIT(c, expr, e->v.Subscript.value); - VISIT_SLICE(c, e->v.Subscript.slice, AugLoad); - break; - case Load: - if (!check_subscripter(c, e->v.Subscript.value)) { - return 0; - } - if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) { - return 0; - } - VISIT(c, expr, e->v.Subscript.value); - VISIT_SLICE(c, e->v.Subscript.slice, Load); - break; - case AugStore: - VISIT_SLICE(c, e->v.Subscript.slice, AugStore); - break; - case Store: - VISIT(c, expr, e->v.Subscript.value); - VISIT_SLICE(c, e->v.Subscript.slice, Store); - break; - case Del: - VISIT(c, expr, e->v.Subscript.value); - VISIT_SLICE(c, e->v.Subscript.slice, Del); - break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid in subscript expression"); - return 0; - } - break; + return compiler_subscript(c, e); case Starred_kind: switch (e->v.Starred.ctx) { case Store: @@ -4985,6 +5101,9 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) return compiler_error(c, "can't use starred expression here"); } + break; + case Slice_kind: + return compiler_slice(c, e); case Name_kind: return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx); /* child nodes of List and Tuple will have expr_context set */ @@ -4999,24 +5118,11 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) static int compiler_visit_expr(struct compiler *c, expr_ty e) { - /* If expr e has a different line number than the last expr/stmt, - set a new line number for the next instruction. - */ int old_lineno = c->u->u_lineno; int old_col_offset = c->u->u_col_offset; - if (e->lineno != c->u->u_lineno) { - c->u->u_lineno = e->lineno; - c->u->u_lineno_set = 0; - } - /* Updating the column offset is always harmless. */ - c->u->u_col_offset = e->col_offset; - + SET_LOC(c, e); int res = compiler_visit_expr1(c, e); - - if (old_lineno != c->u->u_lineno) { - c->u->u_lineno = old_lineno; - c->u->u_lineno_set = 0; - } + c->u->u_lineno = old_lineno; c->u->u_col_offset = old_col_offset; return res; } @@ -5024,48 +5130,58 @@ compiler_visit_expr(struct compiler *c, expr_ty e) static int compiler_augassign(struct compiler *c, stmt_ty s) { + assert(s->kind == AugAssign_kind); expr_ty e = s->v.AugAssign.target; - expr_ty auge; - assert(s->kind == AugAssign_kind); + int old_lineno = c->u->u_lineno; + int old_col_offset = c->u->u_col_offset; + SET_LOC(c, e); switch (e->kind) { case Attribute_kind: - auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr, - AugLoad, e->lineno, e->col_offset, - e->end_lineno, e->end_col_offset, c->c_arena); - if (auge == NULL) - return 0; - VISIT(c, expr, auge); - VISIT(c, expr, s->v.AugAssign.value); - ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); - auge->v.Attribute.ctx = AugStore; - VISIT(c, expr, auge); + VISIT(c, expr, e->v.Attribute.value); + ADDOP(c, DUP_TOP); + ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names); break; case Subscript_kind: - auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice, - AugLoad, e->lineno, e->col_offset, - e->end_lineno, e->end_col_offset, c->c_arena); - if (auge == NULL) - return 0; - VISIT(c, expr, auge); - VISIT(c, expr, s->v.AugAssign.value); - ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); - auge->v.Subscript.ctx = AugStore; - VISIT(c, expr, auge); + VISIT(c, expr, e->v.Subscript.value); + VISIT(c, expr, e->v.Subscript.slice); + ADDOP(c, DUP_TOP_TWO); + ADDOP(c, BINARY_SUBSCR); break; case Name_kind: if (!compiler_nameop(c, e->v.Name.id, Load)) return 0; - VISIT(c, expr, s->v.AugAssign.value); - ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); - return compiler_nameop(c, e->v.Name.id, Store); + break; default: PyErr_Format(PyExc_SystemError, "invalid node type (%d) for augmented assignment", e->kind); return 0; } + + c->u->u_lineno = old_lineno; + c->u->u_col_offset = old_col_offset; + + VISIT(c, expr, s->v.AugAssign.value); + ADDOP(c, inplace_binop(s->v.AugAssign.op)); + + SET_LOC(c, e); + + switch (e->kind) { + case Attribute_kind: + ADDOP(c, ROT_TWO); + ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names); + break; + case Subscript_kind: + ADDOP(c, ROT_THREE); + ADDOP(c, STORE_SUBSCR); + break; + case Name_kind: + return compiler_nameop(c, e->v.Name.id, Store); + default: + Py_UNREACHABLE(); + } return 1; } @@ -5089,68 +5205,35 @@ check_annotation(struct compiler *c, stmt_ty s) } static int -check_ann_slice(struct compiler *c, slice_ty sl) +check_ann_subscr(struct compiler *c, expr_ty e) { - switch(sl->kind) { - case Index_kind: - return check_ann_expr(c, sl->v.Index.value); + /* We check that everything in a subscript is defined at runtime. */ + switch (e->kind) { case Slice_kind: - if (sl->v.Slice.lower && !check_ann_expr(c, sl->v.Slice.lower)) { + if (e->v.Slice.lower && !check_ann_expr(c, e->v.Slice.lower)) { return 0; } - if (sl->v.Slice.upper && !check_ann_expr(c, sl->v.Slice.upper)) { + if (e->v.Slice.upper && !check_ann_expr(c, e->v.Slice.upper)) { return 0; } - if (sl->v.Slice.step && !check_ann_expr(c, sl->v.Slice.step)) { + if (e->v.Slice.step && !check_ann_expr(c, e->v.Slice.step)) { return 0; } - break; - default: - PyErr_SetString(PyExc_SystemError, - "unexpected slice kind"); - return 0; - } - return 1; -} - -static int -check_ann_subscr(struct compiler *c, slice_ty sl) -{ - /* We check that everything in a subscript is defined at runtime. */ - Py_ssize_t i, n; - - switch (sl->kind) { - case Index_kind: - case Slice_kind: - if (!check_ann_slice(c, sl)) { - return 0; - } - break; - case ExtSlice_kind: - n = asdl_seq_LEN(sl->v.ExtSlice.dims); + return 1; + case Tuple_kind: { + /* extended slice */ + asdl_seq *elts = e->v.Tuple.elts; + Py_ssize_t i, n = asdl_seq_LEN(elts); for (i = 0; i < n; i++) { - slice_ty subsl = (slice_ty)asdl_seq_GET(sl->v.ExtSlice.dims, i); - switch (subsl->kind) { - case Index_kind: - case Slice_kind: - if (!check_ann_slice(c, subsl)) { - return 0; - } - break; - case ExtSlice_kind: - default: - PyErr_SetString(PyExc_SystemError, - "extended slice invalid in nested slice"); + if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) { return 0; } } - break; + return 1; + } default: - PyErr_Format(PyExc_SystemError, - "invalid subscript kind %d", sl->kind); - return 0; + return check_ann_expr(c, e); } - return 1; } static int @@ -5168,6 +5251,8 @@ compiler_annassign(struct compiler *c, stmt_ty s) } switch (targ->kind) { case Name_kind: + if (forbidden_name(c, targ->v.Name.id, Store)) + return 0; /* If we have a simple name in a module or class, store annotation. */ if (s->v.AnnAssign.simple && (c->u->u_scope_type == COMPILER_SCOPE_MODULE || @@ -5185,6 +5270,8 @@ compiler_annassign(struct compiler *c, stmt_ty s) } break; case Attribute_kind: + if (forbidden_name(c, targ->v.Attribute.attr, Store)) + return 0; if (!s->v.AnnAssign.value && !check_ann_expr(c, targ->v.Attribute.value)) { return 0; @@ -5276,36 +5363,34 @@ compiler_warn(struct compiler *c, const char *format, ...) } static int -compiler_handle_subscr(struct compiler *c, const char *kind, - expr_context_ty ctx) +compiler_subscript(struct compiler *c, expr_ty e) { + expr_context_ty ctx = e->v.Subscript.ctx; int op = 0; - /* XXX this code is duplicated */ + if (ctx == Load) { + if (!check_subscripter(c, e->v.Subscript.value)) { + return 0; + } + if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) { + return 0; + } + } + switch (ctx) { - case AugLoad: /* fall through to Load */ case Load: op = BINARY_SUBSCR; break; - case AugStore:/* fall through to Store */ case Store: op = STORE_SUBSCR; break; case Del: op = DELETE_SUBSCR; break; - case Param: - PyErr_Format(PyExc_SystemError, - "invalid %s kind %d in subscript\n", - kind, ctx); - return 0; - } - if (ctx == AugLoad) { - ADDOP(c, DUP_TOP_TWO); - } - else if (ctx == AugStore) { - ADDOP(c, ROT_THREE); } + assert(op); + VISIT(c, expr, e->v.Subscript.value); + VISIT(c, expr, e->v.Subscript.slice); ADDOP(c, op); return 1; } static int -compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) +compiler_slice(struct compiler *c, expr_ty s) { int n = 2; assert(s->kind == Slice_kind); @@ -5333,64 +5418,6 @@ compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) return 1; } -static int -compiler_visit_nested_slice(struct compiler *c, slice_ty s, - expr_context_ty ctx) -{ - switch (s->kind) { - case Slice_kind: - return compiler_slice(c, s, ctx); - case Index_kind: - VISIT(c, expr, s->v.Index.value); - break; - case ExtSlice_kind: - default: - PyErr_SetString(PyExc_SystemError, - "extended slice invalid in nested slice"); - return 0; - } - return 1; -} - -static int -compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) -{ - const char * kindname = NULL; - switch (s->kind) { - case Index_kind: - kindname = "index"; - if (ctx != AugStore) { - VISIT(c, expr, s->v.Index.value); - } - break; - case Slice_kind: - kindname = "slice"; - if (ctx != AugStore) { - if (!compiler_slice(c, s, ctx)) - return 0; - } - break; - case ExtSlice_kind: - kindname = "extended slice"; - if (ctx != AugStore) { - Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims); - for (i = 0; i < n; i++) { - slice_ty sub = (slice_ty)asdl_seq_GET( - s->v.ExtSlice.dims, i); - if (!compiler_visit_nested_slice(c, sub, ctx)) - return 0; - } - ADDOP_I(c, BUILD_TUPLE, n); - } - break; - default: - PyErr_Format(PyExc_SystemError, - "invalid subscript kind %d", s->kind); - return 0; - } - return compiler_handle_subscr(c, kindname, ctx); -} - /* End of the compiler section, beginning of the assembler section */ /* do depth-first search of basic block graph, starting with block. @@ -5440,7 +5467,7 @@ Py_LOCAL_INLINE(void) stackdepth_push(basicblock ***sp, basicblock *b, int depth) { assert(b->b_startdepth < 0 || b->b_startdepth == depth); - if (b->b_startdepth < depth) { + if (b->b_startdepth < depth && b->b_startdepth < 100) { assert(b->b_startdepth < 0); b->b_startdepth = depth; *(*sp)++ = b; @@ -5480,8 +5507,8 @@ stackdepth(struct compiler *c) struct instr *instr = &b->b_instr[i]; int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0); if (effect == PY_INVALID_STACK_EFFECT) { - fprintf(stderr, "opcode = %d\n", instr->i_opcode); - Py_FatalError("PyCompile_OpcodeStackEffect()"); + _Py_FatalErrorFormat(__func__, + "opcode = %d", instr->i_opcode); } int new_depth = depth + effect; if (new_depth > maxdepth) { @@ -5496,19 +5523,14 @@ stackdepth(struct compiler *c) maxdepth = target_depth; } assert(target_depth >= 0); /* invalid code or bug in stackdepth() */ - if (instr->i_opcode == CALL_FINALLY) { - assert(instr->i_target->b_startdepth >= 0); - assert(instr->i_target->b_startdepth >= target_depth); - depth = new_depth; - continue; - } stackdepth_push(&sp, instr->i_target, target_depth); } depth = new_depth; if (instr->i_opcode == JUMP_ABSOLUTE || instr->i_opcode == JUMP_FORWARD || instr->i_opcode == RETURN_VALUE || - instr->i_opcode == RAISE_VARARGS) + instr->i_opcode == RAISE_VARARGS || + instr->i_opcode == RERAISE) { /* remaining code is dead */ next = NULL; @@ -5578,14 +5600,14 @@ assemble_lnotab(struct assembler *a, struct instr *i) Py_ssize_t len; unsigned char *lnotab; - d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT); d_lineno = i->i_lineno - a->a_lineno; + if (d_lineno == 0) { + return 1; + } + d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT); assert(d_bytecode >= 0); - if(d_bytecode == 0 && d_lineno == 0) - return 1; - if (d_bytecode > 255) { int j, nbytes, ncodes = d_bytecode / 255; nbytes = a->a_lnotab_off + 2 * ncodes; @@ -5934,7 +5956,7 @@ makecode(struct compiler *c, struct assembler *a) goto error; } co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount, - posonlyargcount, kwonlyargcount, nlocals_int, + posonlyargcount, kwonlyargcount, nlocals_int, maxdepth, flags, bytecode, consts, names, varnames, freevars, cellvars, c->c_filename, c->u->u_name, c->u->u_firstlineno, a->a_lnotab); diff --git a/Python/context.c b/Python/context.c index 5c30e47f..bacc7010 100644 --- a/Python/context.c +++ b/Python/context.c @@ -1,10 +1,12 @@ #include "Python.h" #include "pycore_context.h" +#include "pycore_gc.h" // _PyObject_GC_MAY_BE_TRACKED() #include "pycore_hamt.h" #include "pycore_object.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "structmember.h" // PyMemberDef #define CONTEXT_FREELIST_MAXLEN 255 @@ -101,21 +103,18 @@ PyContext_CopyCurrent(void) } -int -PyContext_Enter(PyObject *octx) +static int +_PyContext_Enter(PyThreadState *ts, PyObject *octx) { ENSURE_Context(octx, -1) PyContext *ctx = (PyContext *)octx; if (ctx->ctx_entered) { - PyErr_Format(PyExc_RuntimeError, - "cannot enter context: %R is already entered", ctx); + _PyErr_Format(ts, PyExc_RuntimeError, + "cannot enter context: %R is already entered", ctx); return -1; } - PyThreadState *ts = _PyThreadState_GET(); - assert(ts != NULL); - ctx->ctx_prev = (PyContext *)ts->context; /* borrow */ ctx->ctx_entered = 1; @@ -128,7 +127,16 @@ PyContext_Enter(PyObject *octx) int -PyContext_Exit(PyObject *octx) +PyContext_Enter(PyObject *octx) +{ + PyThreadState *ts = _PyThreadState_GET(); + assert(ts != NULL); + return _PyContext_Enter(ts, octx); +} + + +static int +_PyContext_Exit(PyThreadState *ts, PyObject *octx) { ENSURE_Context(octx, -1) PyContext *ctx = (PyContext *)octx; @@ -139,9 +147,6 @@ PyContext_Exit(PyObject *octx) return -1; } - PyThreadState *ts = _PyThreadState_GET(); - assert(ts != NULL); - if (ts->context != (PyObject *)ctx) { /* Can only happen if someone misuses the C API */ PyErr_SetString(PyExc_RuntimeError, @@ -159,6 +164,14 @@ PyContext_Exit(PyObject *octx) return 0; } +int +PyContext_Exit(PyObject *octx) +{ + PyThreadState *ts = _PyThreadState_GET(); + assert(ts != NULL); + return _PyContext_Exit(ts, octx); +} + PyObject * PyContextVar_New(const char *name, PyObject *def) @@ -621,20 +634,22 @@ static PyObject * context_run(PyContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { + PyThreadState *ts = _PyThreadState_GET(); + if (nargs < 1) { - PyErr_SetString(PyExc_TypeError, - "run() missing 1 required positional argument"); + _PyErr_SetString(ts, PyExc_TypeError, + "run() missing 1 required positional argument"); return NULL; } - if (PyContext_Enter((PyObject *)self)) { + if (_PyContext_Enter(ts, (PyObject *)self)) { return NULL; } - PyObject *call_result = _PyObject_Vectorcall( - args[0], args + 1, nargs - 1, kwnames); + PyObject *call_result = _PyObject_VectorcallTstate( + ts, args[0], args + 1, nargs - 1, kwnames); - if (PyContext_Exit((PyObject *)self)) { + if (_PyContext_Exit(ts, (PyObject *)self)) { return NULL; } @@ -1009,13 +1024,6 @@ _contextvars_ContextVar_reset(PyContextVar *self, PyObject *token) } -static PyObject * -contextvar_cls_getitem(PyObject *self, PyObject *arg) -{ - Py_INCREF(self); - return self; -} - static PyMemberDef PyContextVar_members[] = { {"name", T_OBJECT, offsetof(PyContextVar, var_name), READONLY}, {NULL} @@ -1025,8 +1033,8 @@ static PyMethodDef PyContextVar_methods[] = { _CONTEXTVARS_CONTEXTVAR_GET_METHODDEF _CONTEXTVARS_CONTEXTVAR_SET_METHODDEF _CONTEXTVARS_CONTEXTVAR_RESET_METHODDEF - {"__class_getitem__", contextvar_cls_getitem, - METH_O | METH_CLASS, NULL}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} }; @@ -1165,10 +1173,17 @@ static PyGetSetDef PyContextTokenType_getsetlist[] = { {NULL} }; +static PyMethodDef PyContextTokenType_methods[] = { + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, + {NULL} +}; + PyTypeObject PyContextToken_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "Token", sizeof(PyContextToken), + .tp_methods = PyContextTokenType_methods, .tp_getset = PyContextTokenType_getsetlist, .tp_dealloc = (destructor)token_tp_dealloc, .tp_getattro = PyObject_GenericGetAttr, @@ -1255,18 +1270,15 @@ get_token_missing(void) /////////////////////////// -int -PyContext_ClearFreeList(void) +void +_PyContext_ClearFreeList(void) { - int size = ctx_freelist_len; - while (ctx_freelist_len) { + for (; ctx_freelist_len; ctx_freelist_len--) { PyContext *ctx = ctx_freelist; ctx_freelist = (PyContext *)ctx->ctx_weakreflist; ctx->ctx_weakreflist = NULL; PyObject_GC_Del(ctx); - ctx_freelist_len--; } - return size; } @@ -1274,8 +1286,8 @@ void _PyContext_Fini(void) { Py_CLEAR(_token_missing); - (void)PyContext_ClearFreeList(); - (void)_PyHamt_Fini(); + _PyContext_ClearFreeList(); + _PyHamt_Fini(); } diff --git a/Python/dtoa.c b/Python/dtoa.c index b7bb7acf..e629b296 100644 --- a/Python/dtoa.c +++ b/Python/dtoa.c @@ -64,6 +64,9 @@ * 7. _Py_dg_strtod has been modified so that it doesn't accept strings with * leading whitespace. * + * 8. A corner case where _Py_dg_dtoa didn't strip trailing zeros has been + * fixed. (bugs.python.org/issue40780) + * ***************************************************************/ /* Please send bug reports for the original dtoa.c code to David M. Gay (dmg @@ -115,6 +118,7 @@ /* Linking of Python's #defines to Gay's #defines starts here. */ #include "Python.h" +#include "pycore_dtoa.h" /* if PY_NO_SHORT_FLOAT_REPR is defined, then don't even try to compile the following code */ @@ -2562,6 +2566,14 @@ _Py_dg_dtoa(double dd, int mode, int ndigits, } ++*s++; } + else { + /* Strip trailing zeros. This branch was missing from the + original dtoa.c, leading to surplus trailing zeros in + some cases. See bugs.python.org/issue40780. */ + while (s > s0 && s[-1] == '0') { + --s; + } + } break; } } diff --git a/Python/dynload_aix.c b/Python/dynload_aix.c index b3ff8e28..684f10a8 100644 --- a/Python/dynload_aix.c +++ b/Python/dynload_aix.c @@ -140,7 +140,7 @@ aix_loaderror(const char *pathname) if (nerr == load_errtab[j].errNo && load_errtab[j].errstr) ERRBUF_APPEND(load_errtab[j].errstr); } - while (Py_ISDIGIT(Py_CHARMASK(*message[i]))) message[i]++ ; + while (Py_ISDIGIT(*message[i])) message[i]++ ; ERRBUF_APPEND(message[i]); ERRBUF_APPEND("\n"); } diff --git a/Python/dynload_hpux.c b/Python/dynload_hpux.c index e59d0043..4b964a69 100644 --- a/Python/dynload_hpux.c +++ b/Python/dynload_hpux.c @@ -6,7 +6,6 @@ #include "Python.h" #include "importdl.h" -#include "pycore_pystate.h" #if defined(__hp9000s300) #define FUNCNAME_PATTERN "_%.20s_%.200s" @@ -21,7 +20,7 @@ dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix, const char *pathname, FILE *fp) { int flags = BIND_FIRST | BIND_DEFERRED; - int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose; + int verbose = _Py_GetConfig()->verbose; if (verbose) { flags = BIND_FIRST | BIND_IMMEDIATE | BIND_NONFATAL | BIND_VERBOSE; diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c index c51f97ab..082154dd 100644 --- a/Python/dynload_shlib.c +++ b/Python/dynload_shlib.c @@ -2,7 +2,8 @@ /* Support for dynamic loading of extension modules */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_interp.h" // _PyInterpreterState.dlopenflags +#include "pycore_pystate.h" // _PyInterpreterState_GET() #include "importdl.h" #include @@ -94,7 +95,7 @@ _PyImport_FindSharedFuncptr(const char *prefix, } } - dlopenflags = _PyInterpreterState_Get()->dlopenflags; + dlopenflags = _PyInterpreterState_GET()->dlopenflags; handle = dlopen(pathname, dlopenflags); diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 4896c6dc..8431c5b3 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -12,12 +12,6 @@ #include "patchlevel.h" #include -// "activation context" magic - see dl_nt.c... -#if HAVE_SXS -extern ULONG_PTR _Py_ActivateActCtx(); -void _Py_DeactivateActCtx(ULONG_PTR cookie); -#endif - #ifdef _DEBUG #define PYD_DEBUG_SUFFIX "_d" #else @@ -185,16 +179,10 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, { HINSTANCE hDLL = NULL; unsigned int old_mode; -#if HAVE_SXS - ULONG_PTR cookie = 0; -#endif /* Don't display a message box when Python can't load a DLL */ old_mode = SetErrorMode(SEM_FAILCRITICALERRORS); -#if HAVE_SXS - cookie = _Py_ActivateActCtx(); -#endif /* bpo-36085: We use LoadLibraryEx with restricted search paths to avoid DLL preloading attacks and enable use of the AddDllDirectory function. We add SEARCH_DLL_LOAD_DIR to @@ -204,9 +192,6 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); Py_END_ALLOW_THREADS -#if HAVE_SXS - _Py_DeactivateActCtx(cookie); -#endif /* restore old error mode settings */ SetErrorMode(old_mode); diff --git a/Python/errors.c b/Python/errors.c index 1360c0d9..87af39d5 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -4,7 +4,8 @@ #include "Python.h" #include "pycore_initconfig.h" #include "pycore_pyerrors.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_sysmodule.h" #include "pycore_traceback.h" #ifndef __STDC__ @@ -24,11 +25,11 @@ extern char *strerror(int); extern "C" { #endif +_Py_IDENTIFIER(__module__); _Py_IDENTIFIER(builtins); _Py_IDENTIFIER(stderr); _Py_IDENTIFIER(flush); - /* Forward declarations */ static PyObject * _PyErr_FormatV(PyThreadState *tstate, PyObject *exception, @@ -93,7 +94,7 @@ _PyErr_CreateException(PyObject *exception, PyObject *value) return PyObject_Call(exception, value, NULL); } else { - return PyObject_CallFunctionObjArgs(exception, value, NULL); + return PyObject_CallOneArg(exception, value); } } @@ -106,7 +107,8 @@ _PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value) if (exception != NULL && !PyExceptionClass_Check(exception)) { _PyErr_Format(tstate, PyExc_SystemError, - "exception %R not a BaseException subclass", + "_PyErr_SetObject: " + "exception %R is not a BaseException subclass", exception); return; } @@ -218,6 +220,9 @@ PyErr_SetString(PyObject *exception, const char *string) PyObject* _Py_HOT_FUNCTION PyErr_Occurred(void) { + /* The caller must hold the GIL. */ + assert(PyGILState_Check()); + PyThreadState *tstate = _PyThreadState_GET(); return _PyErr_Occurred(tstate); } @@ -430,21 +435,27 @@ PyErr_Clear(void) void -PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) +_PyErr_GetExcInfo(PyThreadState *tstate, + PyObject **p_type, PyObject **p_value, PyObject **p_traceback) { - PyThreadState *tstate = _PyThreadState_GET(); - _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate); *p_type = exc_info->exc_type; *p_value = exc_info->exc_value; *p_traceback = exc_info->exc_traceback; - Py_XINCREF(*p_type); Py_XINCREF(*p_value); Py_XINCREF(*p_traceback); } + +void +PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) +{ + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback); +} + void PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback) { @@ -466,7 +477,9 @@ PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback) /* Like PyErr_Restore(), but if an exception is already set, set the context associated with it. - */ + + The caller is responsible for ensuring that this call won't create + any cycles in the exception context chain. */ void _PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb) { @@ -474,6 +487,15 @@ _PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb) return; PyThreadState *tstate = _PyThreadState_GET(); + + if (!PyExceptionClass_Check(exc)) { + _PyErr_Format(tstate, PyExc_SystemError, + "_PyErr_ChainExceptions: " + "exception %R is not a BaseException subclass", + exc); + return; + } + if (_PyErr_Occurred(tstate)) { PyObject *exc2, *val2, *tb2; _PyErr_Fetch(tstate, &exc2, &val2, &tb2); @@ -492,6 +514,62 @@ _PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb) } } +/* Set the currently set exception's context to the given exception. + + If the provided exc_info is NULL, then the current Python thread state's + exc_info will be used for the context instead. + + This function can only be called when _PyErr_Occurred() is true. + Also, this function won't create any cycles in the exception context + chain to the extent that _PyErr_SetObject ensures this. */ +void +_PyErr_ChainStackItem(_PyErr_StackItem *exc_info) +{ + PyThreadState *tstate = _PyThreadState_GET(); + assert(_PyErr_Occurred(tstate)); + + int exc_info_given; + if (exc_info == NULL) { + exc_info_given = 0; + exc_info = tstate->exc_info; + } else { + exc_info_given = 1; + } + if (exc_info->exc_type == NULL || exc_info->exc_type == Py_None) { + return; + } + + _PyErr_StackItem *saved_exc_info; + if (exc_info_given) { + /* Temporarily set the thread state's exc_info since this is what + _PyErr_SetObject uses for implicit exception chaining. */ + saved_exc_info = tstate->exc_info; + tstate->exc_info = exc_info; + } + + PyObject *exc, *val, *tb; + _PyErr_Fetch(tstate, &exc, &val, &tb); + + PyObject *exc2, *val2, *tb2; + exc2 = exc_info->exc_type; + val2 = exc_info->exc_value; + tb2 = exc_info->exc_traceback; + _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2); + if (tb2 != NULL) { + PyException_SetTraceback(val2, tb2); + } + + /* _PyErr_SetObject sets the context from PyThreadState. */ + _PyErr_SetObject(tstate, exc, val); + Py_DECREF(exc); // since _PyErr_Occurred was true + Py_XDECREF(val); + Py_XDECREF(tb); + + if (exc_info_given) { + tstate->exc_info = saved_exc_info; + } +} + static PyObject * _PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception, const char *format, va_list vargs) @@ -520,6 +598,21 @@ _PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception, return NULL; } +PyObject * +_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception, + const char *format, ...) +{ + va_list vargs; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, format); +#else + va_start(vargs); +#endif + _PyErr_FormatVFromCause(tstate, exception, format, vargs); + va_end(vargs); + return NULL; +} + PyObject * _PyErr_FormatFromCause(PyObject *exception, const char *format, ...) { @@ -547,10 +640,9 @@ PyErr_BadArgument(void) } PyObject * -PyErr_NoMemory(void) +_PyErr_NoMemory(PyThreadState *tstate) { - PyThreadState *tstate = _PyThreadState_GET(); - if (Py_TYPE(PyExc_MemoryError) == NULL) { + if (Py_IS_TYPE(PyExc_MemoryError, NULL)) { /* PyErr_NoMemory() has been called before PyExc_MemoryError has been initialized by _PyExc_Init() */ Py_FatalError("Out of memory and PyExc_MemoryError is not " @@ -560,6 +652,13 @@ PyErr_NoMemory(void) return NULL; } +PyObject * +PyErr_NoMemory(void) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyErr_NoMemory(tstate); +} + PyObject * PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) { @@ -877,7 +976,7 @@ PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, goto done; } - error = _PyObject_FastCallDict(exception, &msg, 1, kwargs); + error = PyObject_VectorcallDict(exception, &msg, 1, kwargs); if (error != NULL) { _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error); Py_DECREF(error); @@ -979,7 +1078,6 @@ PyObject * PyErr_NewException(const char *name, PyObject *base, PyObject *dict) { PyThreadState *tstate = _PyThreadState_GET(); - _Py_IDENTIFIER(__module__); PyObject *modulename = NULL; PyObject *classname = NULL; PyObject *mydict = NULL; @@ -1205,7 +1303,6 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, } } - _Py_IDENTIFIER(__module__); PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__); if (moduleName == NULL || !PyUnicode_Check(moduleName)) { Py_XDECREF(moduleName); @@ -1257,7 +1354,7 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, } /* Explicitly call file.flush() */ - PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL); + PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); if (!res) { return -1; } @@ -1293,7 +1390,7 @@ _PyErr_WriteUnraisableDefaultHook(PyObject *args) { PyThreadState *tstate = _PyThreadState_GET(); - if (Py_TYPE(args) != &UnraisableHookArgsType) { + if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) { _PyErr_SetString(tstate, PyExc_TypeError, "sys.unraisablehook argument type " "must be UnraisableHookArgs"); @@ -1329,7 +1426,7 @@ void _PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) { PyThreadState *tstate = _PyThreadState_GET(); - assert(tstate != NULL); + _Py_EnsureTstateNotNULL(tstate); PyObject *err_msg = NULL; PyObject *exc_type, *exc_value, *exc_tb; @@ -1343,7 +1440,7 @@ _PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) } if (exc_tb == NULL) { - struct _frame *frame = tstate->frame; + PyFrameObject *frame = tstate->frame; if (frame != NULL) { exc_tb = _PyTraceBack_FromFrame(NULL, frame); if (exc_tb == NULL) { @@ -1382,7 +1479,7 @@ _PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) goto default_hook; } - if (PySys_Audit("sys.unraisablehook", "OO", hook, hook_args) < 0) { + if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) { Py_DECREF(hook_args); err_msg_str = "Exception ignored in audit hook"; obj = NULL; @@ -1394,8 +1491,7 @@ _PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) goto default_hook; } - PyObject *args[1] = {hook_args}; - PyObject *res = _PyObject_FastCall(hook, args, 1); + PyObject *res = PyObject_CallOneArg(hook, hook_args); Py_DECREF(hook_args); if (res != NULL) { Py_DECREF(res); @@ -1552,16 +1648,18 @@ err_programtext(PyThreadState *tstate, FILE *fp, int lineno) { int i; char linebuf[1000]; - - if (fp == NULL) + if (fp == NULL) { return NULL; + } + for (i = 0; i < lineno; i++) { char *pLastChar = &linebuf[sizeof(linebuf) - 2]; do { *pLastChar = '\0'; if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, - fp, NULL) == NULL) - break; + fp, NULL) == NULL) { + goto after_loop; + } /* fgets read *something*; if it didn't get as far as pLastChar, it must have found a newline or hit the end of the file; if pLastChar is \n, @@ -1569,6 +1667,8 @@ err_programtext(PyThreadState *tstate, FILE *fp, int lineno) yet seen a newline, so must continue */ } while (*pLastChar != '\0' && *pLastChar != '\n'); } + +after_loop: fclose(fp); if (i == lineno) { PyObject *res; diff --git a/Python/fileutils.c b/Python/fileutils.c index b2741167..2c86828b 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1,6 +1,6 @@ #include "Python.h" #include "pycore_fileutils.h" -#include "osdefs.h" +#include "osdefs.h" // SEP #include #ifdef MS_WINDOWS @@ -1467,7 +1467,7 @@ _Py_fopen_obj(PyObject *path, const char *mode) && errno == EINTR && !(async_err = PyErr_CheckSignals())); #else PyObject *bytes; - char *path_bytes; + const char *path_bytes; assert(PyGILState_Check()); @@ -1684,8 +1684,9 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t buflen) { char *cpath; char cbuf[MAXPATHLEN]; + size_t cbuf_len = Py_ARRAY_LENGTH(cbuf); wchar_t *wbuf; - int res; + Py_ssize_t res; size_t r1; cpath = _Py_EncodeLocaleRaw(path, NULL); @@ -1693,11 +1694,12 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t buflen) errno = EINVAL; return -1; } - res = (int)readlink(cpath, cbuf, Py_ARRAY_LENGTH(cbuf)); + res = readlink(cpath, cbuf, cbuf_len); PyMem_RawFree(cpath); - if (res == -1) + if (res == -1) { return -1; - if (res == Py_ARRAY_LENGTH(cbuf)) { + } + if ((size_t)res == cbuf_len) { errno = EINVAL; return -1; } @@ -1762,6 +1764,103 @@ _Py_wrealpath(const wchar_t *path, } #endif + +#ifndef MS_WINDOWS +int +_Py_isabs(const wchar_t *path) +{ + return (path[0] == SEP); +} +#endif + + +/* Get an absolute path. + On error (ex: fail to get the current directory), return -1. + On memory allocation failure, set *abspath_p to NULL and return 0. + On success, return a newly allocated to *abspath_p to and return 0. + The string must be freed by PyMem_RawFree(). */ +int +_Py_abspath(const wchar_t *path, wchar_t **abspath_p) +{ +#ifdef MS_WINDOWS + wchar_t woutbuf[MAX_PATH], *woutbufp = woutbuf; + DWORD result; + + result = GetFullPathNameW(path, + Py_ARRAY_LENGTH(woutbuf), woutbuf, + NULL); + if (!result) { + return -1; + } + + if (result > Py_ARRAY_LENGTH(woutbuf)) { + if ((size_t)result <= (size_t)PY_SSIZE_T_MAX / sizeof(wchar_t)) { + woutbufp = PyMem_RawMalloc((size_t)result * sizeof(wchar_t)); + } + else { + woutbufp = NULL; + } + if (!woutbufp) { + *abspath_p = NULL; + return 0; + } + + result = GetFullPathNameW(path, result, woutbufp, NULL); + if (!result) { + PyMem_RawFree(woutbufp); + return -1; + } + } + + if (woutbufp != woutbuf) { + *abspath_p = woutbufp; + return 0; + } + + *abspath_p = _PyMem_RawWcsdup(woutbufp); + return 0; +#else + if (_Py_isabs(path)) { + *abspath_p = _PyMem_RawWcsdup(path); + return 0; + } + + wchar_t cwd[MAXPATHLEN + 1]; + cwd[Py_ARRAY_LENGTH(cwd) - 1] = 0; + if (!_Py_wgetcwd(cwd, Py_ARRAY_LENGTH(cwd) - 1)) { + /* unable to get the current directory */ + return -1; + } + + size_t cwd_len = wcslen(cwd); + size_t path_len = wcslen(path); + size_t len = cwd_len + 1 + path_len + 1; + if (len <= (size_t)PY_SSIZE_T_MAX / sizeof(wchar_t)) { + *abspath_p = PyMem_RawMalloc(len * sizeof(wchar_t)); + } + else { + *abspath_p = NULL; + } + if (*abspath_p == NULL) { + return 0; + } + + wchar_t *abspath = *abspath_p; + memcpy(abspath, cwd, cwd_len * sizeof(wchar_t)); + abspath += cwd_len; + + *abspath = (wchar_t)SEP; + abspath++; + + memcpy(abspath, path, path_len * sizeof(wchar_t)); + abspath += path_len; + + *abspath = 0; + return 0; +#endif +} + + /* Get the current directory. buflen is the buffer size in wide characters including the null character. Decode the path from the locale encoding. diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c index 7c4ecf0b..ed95f267 100644 --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -62,7 +62,7 @@ get_integer(PyObject *str, Py_ssize_t *ppos, Py_ssize_t end, Py_ssize_t accumulator, digitval, pos = *ppos; int numdigits; int kind = PyUnicode_KIND(str); - void *data = PyUnicode_DATA(str); + const void *data = PyUnicode_DATA(str); accumulator = numdigits = 0; for (; pos < end; pos++, numdigits++) { @@ -170,7 +170,7 @@ parse_internal_render_format_spec(PyObject *format_spec, { Py_ssize_t pos = start; int kind = PyUnicode_KIND(format_spec); - void *data = PyUnicode_DATA(format_spec); + const void *data = PyUnicode_DATA(format_spec); /* end-pos is used throughout this code to specify the length of the input string */ #define READ_spec(index) PyUnicode_READ(kind, data, index) @@ -252,8 +252,10 @@ parse_internal_render_format_spec(PyObject *format_spec, ++pos; } if (end-pos && READ_spec(pos) == ',') { - invalid_comma_and_underscore(); - return 0; + if (format->thousands_separators == LT_UNDERSCORE_LOCALE) { + invalid_comma_and_underscore(); + return 0; + } } /* Parse field precision */ @@ -443,7 +445,7 @@ parse_number(PyObject *s, Py_ssize_t pos, Py_ssize_t end, { Py_ssize_t remainder; int kind = PyUnicode_KIND(s); - void *data = PyUnicode_DATA(s); + const void *data = PyUnicode_DATA(s); while (posn_lpadding = n_padding; break; default: - /* Shouldn't get here, but treat it as '>' */ + /* Shouldn't get here */ Py_UNREACHABLE(); } } @@ -595,7 +597,7 @@ calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix, Return -1 on error, or 0 on success. */ static int fill_number(_PyUnicodeWriter *writer, const NumberFieldWidths *spec, - PyObject *digits, Py_ssize_t d_start, Py_ssize_t d_end, + PyObject *digits, Py_ssize_t d_start, PyObject *prefix, Py_ssize_t p_start, Py_UCS4 fill_char, LocaleInfo *locale, int toupper) @@ -983,7 +985,7 @@ format_long_internal(PyObject *value, const InternalFormatSpec *format, goto done; /* Calculate how much memory we'll need. */ - n_total = calc_number_widths(&spec, n_prefix, sign_char, tmp, inumeric_chars, + n_total = calc_number_widths(&spec, n_prefix, sign_char, inumeric_chars, inumeric_chars + n_digits, n_remainder, 0, &locale, format, &maxchar); if (n_total == -1) { @@ -996,7 +998,7 @@ format_long_internal(PyObject *value, const InternalFormatSpec *format, /* Populate the memory. */ result = fill_number(writer, &spec, - tmp, inumeric_chars, inumeric_chars + n_digits, + tmp, inumeric_chars, tmp, prefix, format->fill_char, &locale, format->type == 'X'); @@ -1131,7 +1133,7 @@ format_float_internal(PyObject *value, goto done; /* Calculate how much memory we'll need. */ - n_total = calc_number_widths(&spec, 0, sign_char, unicode_tmp, index, + n_total = calc_number_widths(&spec, 0, sign_char, index, index + n_digits, n_remainder, has_decimal, &locale, format, &maxchar); if (n_total == -1) { @@ -1144,7 +1146,7 @@ format_float_internal(PyObject *value, /* Populate the memory. */ result = fill_number(writer, &spec, - unicode_tmp, index, index + n_digits, + unicode_tmp, index, NULL, 0, format->fill_char, &locale, 0); @@ -1316,7 +1318,7 @@ format_complex_internal(PyObject *value, tmp_format.width = -1; /* Calculate how much memory we'll need. */ - n_re_total = calc_number_widths(&re_spec, 0, re_sign_char, re_unicode_tmp, + n_re_total = calc_number_widths(&re_spec, 0, re_sign_char, i_re, i_re + n_re_digits, n_re_remainder, re_has_decimal, &locale, &tmp_format, &maxchar); @@ -1329,7 +1331,7 @@ format_complex_internal(PyObject *value, * requested by the original format. */ if (!skip_re) tmp_format.sign = '+'; - n_im_total = calc_number_widths(&im_spec, 0, im_sign_char, im_unicode_tmp, + n_im_total = calc_number_widths(&im_spec, 0, im_sign_char, i_im, i_im + n_im_digits, n_im_remainder, im_has_decimal, &locale, &tmp_format, &maxchar); @@ -1366,7 +1368,7 @@ format_complex_internal(PyObject *value, if (!skip_re) { result = fill_number(writer, &re_spec, - re_unicode_tmp, i_re, i_re + n_re_digits, + re_unicode_tmp, i_re, NULL, 0, 0, &locale, 0); @@ -1374,7 +1376,7 @@ format_complex_internal(PyObject *value, goto done; } result = fill_number(writer, &im_spec, - im_unicode_tmp, i_im, i_im + n_im_digits, + im_unicode_tmp, i_im, NULL, 0, 0, &locale, 0); @@ -1447,7 +1449,7 @@ _PyUnicode_FormatAdvancedWriter(_PyUnicodeWriter *writer, return format_string_internal(obj, &format, writer); default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); return -1; } } @@ -1458,7 +1460,7 @@ _PyLong_FormatAdvancedWriter(_PyUnicodeWriter *writer, PyObject *format_spec, Py_ssize_t start, Py_ssize_t end) { - PyObject *tmp = NULL, *str = NULL; + PyObject *tmp = NULL; InternalFormatSpec format; int result = -1; @@ -1505,13 +1507,12 @@ _PyLong_FormatAdvancedWriter(_PyUnicodeWriter *writer, default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); goto done; } done: Py_XDECREF(tmp); - Py_XDECREF(str); return result; } @@ -1549,7 +1550,7 @@ _PyFloat_FormatAdvancedWriter(_PyUnicodeWriter *writer, default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); return -1; } } @@ -1587,7 +1588,7 @@ _PyComplex_FormatAdvancedWriter(_PyUnicodeWriter *writer, default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); return -1; } } diff --git a/Python/frozenmain.c b/Python/frozenmain.c index 7f9cc193..dd04d609 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -2,7 +2,7 @@ /* Python interpreter main program for frozen scripts */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_runtime.h" // _PyRuntime_Initialize() #include #ifdef MS_WINDOWS @@ -99,7 +99,7 @@ Py_FrozenMain(int argc, char **argv) n = PyImport_ImportFrozenModule("__main__"); if (n == 0) - Py_FatalError("__main__ not frozen"); + Py_FatalError("the __main__ module is not frozen"); if (n < 0) { PyErr_Print(); sts = 1; diff --git a/Python/getargs.c b/Python/getargs.c index c1b7b1a2..d4a531a5 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -106,7 +106,7 @@ PyArg_Parse(PyObject *args, const char *format, ...) return retval; } -int +PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *args, const char *format, ...) { int retval; @@ -131,7 +131,7 @@ PyArg_ParseTuple(PyObject *args, const char *format, ...) return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *args, const char *format, ...) { int retval; @@ -156,7 +156,7 @@ _PyArg_ParseStack(PyObject *const *args, Py_ssize_t nargs, const char *format, . return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseStack_SizeT(PyObject *const *args, Py_ssize_t nargs, const char *format, ...) { int retval; @@ -182,7 +182,7 @@ PyArg_VaParse(PyObject *args, const char *format, va_list va) return retval; } -int +PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *args, const char *format, va_list va) { va_list lva; @@ -312,7 +312,7 @@ vgetargs1_impl(PyObject *compat_args, PyObject *const *stack, Py_ssize_t nargs, break; default: if (level == 0) { - if (Py_ISALPHA(Py_CHARMASK(c))) + if (Py_ISALPHA(c)) if (c != 'e') /* skip encoded */ max++; } @@ -397,7 +397,7 @@ vgetargs1_impl(PyObject *compat_args, PyObject *const *stack, Py_ssize_t nargs, } } - if (*format != '\0' && !Py_ISALPHA(Py_CHARMASK(*format)) && + if (*format != '\0' && !Py_ISALPHA(*format) && *format != '(' && *format != '|' && *format != ':' && *format != ';') { PyErr_Format(PyExc_SystemError, @@ -521,7 +521,7 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } else if (c == ':' || c == ';' || c == '\0') break; - else if (level == 0 && Py_ISALPHA(Py_CHARMASK(c))) + else if (level == 0 && Py_ISALPHA(c)) n++; } @@ -531,7 +531,7 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, toplevel ? "expected %d arguments, not %.50s" : "must be %d-item sequence, not %.50s", n, - arg == Py_None ? "None" : arg->ob_type->tp_name); + arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); return msgbuf; } @@ -621,7 +621,7 @@ _PyArg_BadArgument(const char *fname, const char *displayname, PyErr_Format(PyExc_TypeError, "%.200s() %.200s must be %.50s, not %.50s", fname, displayname, expected, - arg == Py_None ? "None" : arg->ob_type->tp_name); + arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); } static const char * @@ -636,7 +636,7 @@ converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize) else { PyOS_snprintf(msgbuf, bufsize, "must be %.50s, not %.50s", expected, - arg == Py_None ? "None" : arg->ob_type->tp_name); + arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); } return msgbuf; } @@ -923,7 +923,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'C': {/* unicode char */ int *p = va_arg(*p_va, int *); int kind; - void *data; + const void *data; if (!PyUnicode_Check(arg)) return converterr("a unicode character", arg, msgbuf, bufsize); @@ -1070,6 +1070,9 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'u': /* raw unicode buffer (Py_UNICODE *) */ case 'Z': /* raw unicode buffer or None */ { + // TODO: Raise DeprecationWarning +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); if (*format == '#') { @@ -1109,6 +1112,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, arg, msgbuf, bufsize); } break; +_Py_COMP_DIAG_POP } case 'e': {/* encoded string */ @@ -1331,7 +1335,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, type = va_arg(*p_va, PyTypeObject*); p = va_arg(*p_va, PyObject **); format++; - if (PyType_IsSubtype(arg->ob_type, type)) + if (PyType_IsSubtype(Py_TYPE(arg), type)) *p = arg; else return converterr(type->tp_name, arg, msgbuf, bufsize); @@ -1466,7 +1470,7 @@ PyArg_ParseTupleAndKeywords(PyObject *args, return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args, PyObject *keywords, const char *format, @@ -1517,7 +1521,7 @@ PyArg_VaParseTupleAndKeywords(PyObject *args, return retval; } -int +PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, PyObject *keywords, const char *format, @@ -1543,7 +1547,7 @@ _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords, struct _PyArg_Parser *parser, ...) { @@ -1556,7 +1560,7 @@ _PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords, return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords, struct _PyArg_Parser *parser, ...) { @@ -1569,7 +1573,7 @@ _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords, return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames, struct _PyArg_Parser *parser, ...) { @@ -1582,7 +1586,7 @@ _PyArg_ParseStackAndKeywords(PyObject *const *args, Py_ssize_t nargs, PyObject * return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames, struct _PyArg_Parser *parser, ...) { @@ -1596,7 +1600,7 @@ _PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs, PyOb } -int +PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords, struct _PyArg_Parser *parser, va_list va) { @@ -1610,7 +1614,7 @@ _PyArg_VaParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords, return retval; } -int +PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords, struct _PyArg_Parser *parser, va_list va) { @@ -2053,19 +2057,19 @@ find_keyword(PyObject *kwnames, PyObject *const *kwstack, PyObject *key) Py_ssize_t i, nkwargs; nkwargs = PyTuple_GET_SIZE(kwnames); - for (i=0; i < nkwargs; i++) { + for (i = 0; i < nkwargs; i++) { PyObject *kwname = PyTuple_GET_ITEM(kwnames, i); - /* ptr==ptr should match in most cases since keyword keys - should be interned strings */ + /* kwname == key will normally find a match in since keyword keys + should be interned strings; if not retry below in a new loop. */ if (kwname == key) { return kwstack[i]; } - if (!PyUnicode_Check(kwname)) { - /* ignore non-string keyword keys: - an error will be raised below */ - continue; - } + } + + for (i = 0; i < nkwargs; i++) { + PyObject *kwname = PyTuple_GET_ITEM(kwnames, i); + assert(PyUnicode_Check(kwname)); if (_PyUnicode_EQ(kwname, key)) { return kwstack[i]; } @@ -2293,16 +2297,11 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs, j++; } - if (!PyUnicode_Check(keyword)) { - PyErr_SetString(PyExc_TypeError, - "keywords must be strings"); - return cleanreturn(0, &freelist); - } match = PySequence_Contains(kwtuple, keyword); if (match <= 0) { if (!match) { PyErr_Format(PyExc_TypeError, - "'%U' is an invalid keyword " + "'%S' is an invalid keyword " "argument for %.200s%s", keyword, (parser->fname == NULL) ? "this function" : parser->fname, @@ -2523,16 +2522,11 @@ _PyArg_UnpackKeywords(PyObject *const *args, Py_ssize_t nargs, j++; } - if (!PyUnicode_Check(keyword)) { - PyErr_SetString(PyExc_TypeError, - "keywords must be strings"); - return NULL; - } match = PySequence_Contains(kwtuple, keyword); if (match <= 0) { if (!match) { PyErr_Format(PyExc_TypeError, - "'%U' is an invalid keyword " + "'%S' is an invalid keyword " "argument for %.200s%s", keyword, (parser->fname == NULL) ? "this function" : parser->fname, @@ -2797,6 +2791,7 @@ _PyArg_UnpackStack(PyObject *const *args, Py_ssize_t nargs, const char *name, #undef _PyArg_NoKeywords +#undef _PyArg_NoKwnames #undef _PyArg_NoPositional /* For type constructors that don't take keyword args @@ -2823,7 +2818,6 @@ _PyArg_NoKeywords(const char *funcname, PyObject *kwargs) return 0; } - int _PyArg_NoPositional(const char *funcname, PyObject *args) { @@ -2841,6 +2835,23 @@ _PyArg_NoPositional(const char *funcname, PyObject *args) return 0; } +int +_PyArg_NoKwnames(const char *funcname, PyObject *kwnames) +{ + if (kwnames == NULL) { + return 1; + } + + assert(PyTuple_CheckExact(kwnames)); + + if (PyTuple_GET_SIZE(kwnames) == 0) { + return 1; + } + + PyErr_Format(PyExc_TypeError, "%s() takes no keyword arguments", funcname); + return 0; +} + void _PyArg_Fini(void) { diff --git a/Python/getopt.c b/Python/getopt.c index 249ad1e8..2e3891aa 100644 --- a/Python/getopt.c +++ b/Python/getopt.c @@ -18,10 +18,6 @@ * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Nevertheless, I would like to know about bugs in this library or - * suggestions for improvment. Send bug reports and feedback to - * davegottner@delphi.com. *---------------------------------------------------------------------------*/ /* Modified to support --help and --version, as well as /? on Windows diff --git a/Python/graminit.c b/Python/graminit.c index 7c40ce93..b7aa5289 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -1,7 +1,8 @@ /* Generated by Parser/pgen */ +#include "exports.h" #include "grammar.h" -grammar _PyParser_Grammar; +Py_EXPORTED_SYMBOL grammar _PyParser_Grammar; static const arc arcs_0_0[3] = { {2, 1}, {3, 2}, @@ -51,31 +52,17 @@ static const arc arcs_3_0[1] = { static const arc arcs_3_1[1] = { {49, 2}, }; -static const arc arcs_3_2[2] = { - {5, 3}, - {2, 4}, -}; -static const arc arcs_3_3[2] = { - {50, 5}, - {51, 6}, -}; -static const arc arcs_3_4[1] = { - {0, 4}, -}; -static const arc arcs_3_5[1] = { - {2, 4}, +static const arc arcs_3_2[1] = { + {2, 3}, }; -static const arc arcs_3_6[1] = { - {50, 5}, +static const arc arcs_3_3[1] = { + {0, 3}, }; -static state states_3[7] = { +static state states_3[4] = { {1, arcs_3_0}, {1, arcs_3_1}, - {2, arcs_3_2}, - {2, arcs_3_3}, - {1, arcs_3_4}, - {1, arcs_3_5}, - {1, arcs_3_6}, + {1, arcs_3_2}, + {1, arcs_3_3}, }; static const arc arcs_4_0[1] = { {48, 1}, @@ -89,12 +76,12 @@ static state states_4[2] = { {2, arcs_4_1}, }; static const arc arcs_5_0[1] = { - {52, 1}, + {50, 1}, }; static const arc arcs_5_1[3] = { + {52, 2}, + {53, 2}, {54, 2}, - {55, 2}, - {56, 2}, }; static const arc arcs_5_2[1] = { {0, 2}, @@ -108,7 +95,7 @@ static const arc arcs_6_0[1] = { {38, 1}, }; static const arc arcs_6_1[1] = { - {56, 2}, + {54, 2}, }; static const arc arcs_6_2[1] = { {0, 2}, @@ -125,24 +112,24 @@ static const arc arcs_7_1[1] = { {40, 2}, }; static const arc arcs_7_2[1] = { - {57, 3}, + {55, 3}, }; static const arc arcs_7_3[2] = { - {58, 4}, - {59, 5}, + {56, 4}, + {57, 5}, }; static const arc arcs_7_4[1] = { - {60, 6}, + {58, 6}, }; static const arc arcs_7_5[2] = { - {61, 7}, - {62, 8}, + {59, 7}, + {60, 8}, }; static const arc arcs_7_6[1] = { - {59, 5}, + {57, 5}, }; static const arc arcs_7_7[1] = { - {62, 8}, + {60, 8}, }; static const arc arcs_7_8[1] = { {0, 8}, @@ -162,14 +149,14 @@ static const arc arcs_8_0[1] = { {5, 1}, }; static const arc arcs_8_1[2] = { - {50, 2}, - {63, 3}, + {61, 2}, + {62, 3}, }; static const arc arcs_8_2[1] = { {0, 2}, }; static const arc arcs_8_3[1] = { - {50, 2}, + {61, 2}, }; static state states_8[4] = { {1, arcs_8_0}, @@ -179,217 +166,217 @@ static state states_8[4] = { }; static const arc arcs_9_0[3] = { {6, 1}, - {64, 2}, - {65, 3}, + {63, 2}, + {64, 3}, }; static const arc arcs_9_1[4] = { - {66, 4}, - {61, 5}, - {65, 6}, + {65, 4}, + {59, 5}, + {64, 6}, {0, 1}, }; static const arc arcs_9_2[1] = { - {65, 7}, + {64, 7}, }; static const arc arcs_9_3[4] = { - {66, 8}, - {67, 9}, - {61, 5}, + {65, 8}, + {66, 9}, + {59, 5}, {0, 3}, }; static const arc arcs_9_4[4] = { - {64, 2}, - {61, 10}, - {65, 11}, + {63, 2}, + {59, 10}, + {64, 11}, {0, 4}, }; static const arc arcs_9_5[1] = { {0, 5}, }; static const arc arcs_9_6[3] = { - {66, 4}, - {61, 5}, + {65, 4}, + {59, 5}, {0, 6}, }; static const arc arcs_9_7[3] = { - {66, 12}, - {61, 5}, + {65, 12}, + {59, 5}, {0, 7}, }; static const arc arcs_9_8[6] = { {6, 13}, - {64, 2}, - {68, 14}, - {61, 15}, - {65, 3}, + {63, 2}, + {67, 14}, + {59, 15}, + {64, 3}, {0, 8}, }; static const arc arcs_9_9[1] = { - {60, 16}, + {58, 16}, }; static const arc arcs_9_10[3] = { - {64, 2}, - {65, 11}, + {63, 2}, + {64, 11}, {0, 10}, }; static const arc arcs_9_11[4] = { - {66, 4}, - {67, 17}, - {61, 5}, + {65, 4}, + {66, 17}, + {59, 5}, {0, 11}, }; static const arc arcs_9_12[2] = { - {61, 5}, + {59, 5}, {0, 12}, }; static const arc arcs_9_13[4] = { - {66, 18}, - {61, 5}, - {65, 19}, + {65, 18}, + {59, 5}, + {64, 19}, {0, 13}, }; static const arc arcs_9_14[2] = { - {66, 20}, + {65, 20}, {0, 14}, }; static const arc arcs_9_15[5] = { {6, 13}, - {64, 2}, - {68, 14}, - {65, 3}, + {63, 2}, + {67, 14}, + {64, 3}, {0, 15}, }; static const arc arcs_9_16[3] = { - {66, 8}, - {61, 5}, + {65, 8}, + {59, 5}, {0, 16}, }; static const arc arcs_9_17[1] = { - {60, 6}, + {58, 6}, }; static const arc arcs_9_18[4] = { - {64, 2}, - {61, 21}, - {65, 22}, + {63, 2}, + {59, 21}, + {64, 22}, {0, 18}, }; static const arc arcs_9_19[3] = { - {66, 18}, - {61, 5}, + {65, 18}, + {59, 5}, {0, 19}, }; static const arc arcs_9_20[5] = { {6, 23}, - {64, 2}, - {61, 24}, - {65, 25}, + {63, 2}, + {59, 24}, + {64, 25}, {0, 20}, }; static const arc arcs_9_21[3] = { - {64, 2}, - {65, 22}, + {63, 2}, + {64, 22}, {0, 21}, }; static const arc arcs_9_22[4] = { - {66, 18}, - {67, 26}, - {61, 5}, + {65, 18}, + {66, 26}, + {59, 5}, {0, 22}, }; static const arc arcs_9_23[4] = { - {66, 27}, - {61, 5}, - {65, 28}, + {65, 27}, + {59, 5}, + {64, 28}, {0, 23}, }; static const arc arcs_9_24[1] = { - {65, 25}, + {64, 25}, }; static const arc arcs_9_25[4] = { - {66, 29}, - {67, 30}, - {61, 5}, + {65, 29}, + {66, 30}, + {59, 5}, {0, 25}, }; static const arc arcs_9_26[1] = { - {60, 19}, + {58, 19}, }; static const arc arcs_9_27[4] = { - {64, 2}, - {61, 31}, - {65, 32}, + {63, 2}, + {59, 31}, + {64, 32}, {0, 27}, }; static const arc arcs_9_28[3] = { - {66, 27}, - {61, 5}, + {65, 27}, + {59, 5}, {0, 28}, }; static const arc arcs_9_29[5] = { {6, 33}, - {64, 2}, - {61, 34}, - {65, 25}, + {63, 2}, + {59, 34}, + {64, 25}, {0, 29}, }; static const arc arcs_9_30[1] = { - {60, 35}, + {58, 35}, }; static const arc arcs_9_31[3] = { - {64, 2}, - {65, 32}, + {63, 2}, + {64, 32}, {0, 31}, }; static const arc arcs_9_32[4] = { - {66, 27}, - {67, 36}, - {61, 5}, + {65, 27}, + {66, 36}, + {59, 5}, {0, 32}, }; static const arc arcs_9_33[4] = { - {66, 37}, - {61, 5}, - {65, 38}, + {65, 37}, + {59, 5}, + {64, 38}, {0, 33}, }; static const arc arcs_9_34[4] = { {6, 33}, - {64, 2}, - {65, 25}, + {63, 2}, + {64, 25}, {0, 34}, }; static const arc arcs_9_35[3] = { - {66, 29}, - {61, 5}, + {65, 29}, + {59, 5}, {0, 35}, }; static const arc arcs_9_36[1] = { - {60, 28}, + {58, 28}, }; static const arc arcs_9_37[4] = { - {64, 2}, - {61, 39}, - {65, 40}, + {63, 2}, + {59, 39}, + {64, 40}, {0, 37}, }; static const arc arcs_9_38[3] = { - {66, 37}, - {61, 5}, + {65, 37}, + {59, 5}, {0, 38}, }; static const arc arcs_9_39[3] = { - {64, 2}, - {65, 40}, + {63, 2}, + {64, 40}, {0, 39}, }; static const arc arcs_9_40[4] = { - {66, 37}, - {67, 41}, - {61, 5}, + {65, 37}, + {66, 41}, + {59, 5}, {0, 40}, }; static const arc arcs_9_41[1] = { - {60, 38}, + {58, 38}, }; static state states_9[42] = { {3, arcs_9_0}, @@ -439,11 +426,11 @@ static const arc arcs_10_0[1] = { {40, 1}, }; static const arc arcs_10_1[2] = { - {59, 2}, + {57, 2}, {0, 1}, }; static const arc arcs_10_2[1] = { - {60, 3}, + {58, 3}, }; static const arc arcs_10_3[1] = { {0, 3}, @@ -456,153 +443,153 @@ static state states_10[4] = { }; static const arc arcs_11_0[3] = { {6, 1}, - {64, 2}, - {70, 3}, + {63, 2}, + {69, 3}, }; static const arc arcs_11_1[3] = { - {66, 4}, - {70, 5}, + {65, 4}, + {69, 5}, {0, 1}, }; static const arc arcs_11_2[1] = { - {70, 6}, + {69, 6}, }; static const arc arcs_11_3[3] = { - {66, 7}, - {67, 8}, + {65, 7}, + {66, 8}, {0, 3}, }; static const arc arcs_11_4[3] = { - {64, 2}, - {70, 9}, + {63, 2}, + {69, 9}, {0, 4}, }; static const arc arcs_11_5[2] = { - {66, 4}, + {65, 4}, {0, 5}, }; static const arc arcs_11_6[2] = { - {66, 10}, + {65, 10}, {0, 6}, }; static const arc arcs_11_7[5] = { {6, 11}, - {64, 2}, - {68, 12}, - {70, 3}, + {63, 2}, + {67, 12}, + {69, 3}, {0, 7}, }; static const arc arcs_11_8[1] = { - {60, 13}, + {58, 13}, }; static const arc arcs_11_9[3] = { - {66, 4}, - {67, 14}, + {65, 4}, + {66, 14}, {0, 9}, }; static const arc arcs_11_10[1] = { {0, 10}, }; static const arc arcs_11_11[3] = { - {66, 15}, - {70, 16}, + {65, 15}, + {69, 16}, {0, 11}, }; static const arc arcs_11_12[2] = { - {66, 17}, + {65, 17}, {0, 12}, }; static const arc arcs_11_13[2] = { - {66, 7}, + {65, 7}, {0, 13}, }; static const arc arcs_11_14[1] = { - {60, 5}, + {58, 5}, }; static const arc arcs_11_15[3] = { - {64, 2}, - {70, 18}, + {63, 2}, + {69, 18}, {0, 15}, }; static const arc arcs_11_16[2] = { - {66, 15}, + {65, 15}, {0, 16}, }; static const arc arcs_11_17[4] = { {6, 19}, - {64, 2}, - {70, 20}, + {63, 2}, + {69, 20}, {0, 17}, }; static const arc arcs_11_18[3] = { - {66, 15}, - {67, 21}, + {65, 15}, + {66, 21}, {0, 18}, }; static const arc arcs_11_19[3] = { - {66, 22}, - {70, 23}, + {65, 22}, + {69, 23}, {0, 19}, }; static const arc arcs_11_20[3] = { - {66, 24}, - {67, 25}, + {65, 24}, + {66, 25}, {0, 20}, }; static const arc arcs_11_21[1] = { - {60, 16}, + {58, 16}, }; static const arc arcs_11_22[3] = { - {64, 2}, - {70, 26}, + {63, 2}, + {69, 26}, {0, 22}, }; static const arc arcs_11_23[2] = { - {66, 22}, + {65, 22}, {0, 23}, }; static const arc arcs_11_24[4] = { {6, 27}, - {64, 2}, - {70, 20}, + {63, 2}, + {69, 20}, {0, 24}, }; static const arc arcs_11_25[1] = { - {60, 28}, + {58, 28}, }; static const arc arcs_11_26[3] = { - {66, 22}, - {67, 29}, + {65, 22}, + {66, 29}, {0, 26}, }; static const arc arcs_11_27[3] = { - {66, 30}, - {70, 31}, + {65, 30}, + {69, 31}, {0, 27}, }; static const arc arcs_11_28[2] = { - {66, 24}, + {65, 24}, {0, 28}, }; static const arc arcs_11_29[1] = { - {60, 23}, + {58, 23}, }; static const arc arcs_11_30[3] = { - {64, 2}, - {70, 32}, + {63, 2}, + {69, 32}, {0, 30}, }; static const arc arcs_11_31[2] = { - {66, 30}, + {65, 30}, {0, 31}, }; static const arc arcs_11_32[3] = { - {66, 30}, - {67, 33}, + {65, 30}, + {66, 33}, {0, 32}, }; static const arc arcs_11_33[1] = { - {60, 31}, + {58, 31}, }; static state states_11[34] = { {3, arcs_11_0}, @@ -662,15 +649,15 @@ static state states_13[2] = { {1, arcs_13_1}, }; static const arc arcs_14_0[1] = { - {71, 1}, + {70, 1}, }; static const arc arcs_14_1[2] = { - {72, 2}, + {71, 2}, {2, 3}, }; static const arc arcs_14_2[2] = { {2, 3}, - {71, 1}, + {70, 1}, }; static const arc arcs_14_3[1] = { {0, 3}, @@ -682,6 +669,7 @@ static state states_14[4] = { {1, arcs_14_3}, }; static const arc arcs_15_0[8] = { + {72, 1}, {73, 1}, {74, 1}, {75, 1}, @@ -689,7 +677,6 @@ static const arc arcs_15_0[8] = { {77, 1}, {78, 1}, {79, 1}, - {80, 1}, }; static const arc arcs_15_1[1] = { {0, 1}, @@ -699,28 +686,28 @@ static state states_15[2] = { {1, arcs_15_1}, }; static const arc arcs_16_0[1] = { - {81, 1}, + {80, 1}, }; static const arc arcs_16_1[4] = { - {67, 2}, - {82, 3}, - {83, 4}, + {66, 2}, + {81, 3}, + {82, 4}, {0, 1}, }; static const arc arcs_16_2[2] = { - {81, 5}, - {84, 5}, + {80, 5}, + {83, 5}, }; static const arc arcs_16_3[1] = { {0, 3}, }; static const arc arcs_16_4[2] = { {47, 3}, - {84, 3}, + {83, 3}, }; static const arc arcs_16_5[3] = { - {67, 2}, - {61, 3}, + {66, 2}, + {59, 3}, {0, 5}, }; static state states_16[6] = { @@ -732,18 +719,18 @@ static state states_16[6] = { {3, arcs_16_5}, }; static const arc arcs_17_0[1] = { - {59, 1}, + {57, 1}, }; static const arc arcs_17_1[1] = { - {60, 2}, + {58, 2}, }; static const arc arcs_17_2[2] = { - {67, 3}, + {66, 3}, {0, 2}, }; static const arc arcs_17_3[2] = { - {81, 4}, - {84, 4}, + {80, 4}, + {83, 4}, }; static const arc arcs_17_4[1] = { {0, 4}, @@ -756,16 +743,16 @@ static state states_17[5] = { {1, arcs_17_4}, }; static const arc arcs_18_0[2] = { - {85, 1}, - {60, 1}, + {84, 1}, + {58, 1}, }; static const arc arcs_18_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_18_2[3] = { - {85, 1}, - {60, 1}, + {84, 1}, + {58, 1}, {0, 2}, }; static state states_18[3] = { @@ -774,6 +761,7 @@ static state states_18[3] = { {3, arcs_18_2}, }; static const arc arcs_19_0[13] = { + {85, 1}, {86, 1}, {87, 1}, {88, 1}, @@ -786,7 +774,6 @@ static const arc arcs_19_0[13] = { {95, 1}, {96, 1}, {97, 1}, - {98, 1}, }; static const arc arcs_19_1[1] = { {0, 1}, @@ -799,7 +786,7 @@ static const arc arcs_20_0[1] = { {20, 1}, }; static const arc arcs_20_1[1] = { - {99, 2}, + {98, 2}, }; static const arc arcs_20_2[1] = { {0, 2}, @@ -820,11 +807,11 @@ static state states_21[2] = { {1, arcs_21_1}, }; static const arc arcs_22_0[5] = { + {99, 1}, {100, 1}, {101, 1}, {102, 1}, {103, 1}, - {104, 1}, }; static const arc arcs_22_1[1] = { {0, 1}, @@ -857,7 +844,7 @@ static const arc arcs_25_0[1] = { {31, 1}, }; static const arc arcs_25_1[2] = { - {81, 2}, + {80, 2}, {0, 1}, }; static const arc arcs_25_2[1] = { @@ -869,7 +856,7 @@ static state states_25[3] = { {1, arcs_25_2}, }; static const arc arcs_26_0[1] = { - {84, 1}, + {83, 1}, }; static const arc arcs_26_1[1] = { {0, 1}, @@ -882,7 +869,7 @@ static const arc arcs_27_0[1] = { {30, 1}, }; static const arc arcs_27_1[2] = { - {60, 2}, + {58, 2}, {0, 1}, }; static const arc arcs_27_2[2] = { @@ -890,7 +877,7 @@ static const arc arcs_27_2[2] = { {0, 2}, }; static const arc arcs_27_3[1] = { - {60, 4}, + {58, 4}, }; static const arc arcs_27_4[1] = { {0, 4}, @@ -903,8 +890,8 @@ static state states_27[5] = { {1, arcs_27_4}, }; static const arc arcs_28_0[2] = { + {104, 1}, {105, 1}, - {106, 1}, }; static const arc arcs_28_1[1] = { {0, 1}, @@ -917,7 +904,7 @@ static const arc arcs_29_0[1] = { {25, 1}, }; static const arc arcs_29_1[1] = { - {107, 2}, + {106, 2}, }; static const arc arcs_29_2[1] = { {0, 2}, @@ -931,15 +918,15 @@ static const arc arcs_30_0[1] = { {22, 1}, }; static const arc arcs_30_1[3] = { - {108, 2}, + {107, 2}, {9, 2}, - {49, 3}, + {108, 3}, }; static const arc arcs_30_2[4] = { - {108, 2}, + {107, 2}, {9, 2}, {25, 4}, - {49, 3}, + {108, 3}, }; static const arc arcs_30_3[1] = { {25, 4}, @@ -956,7 +943,7 @@ static const arc arcs_30_6[1] = { {0, 6}, }; static const arc arcs_30_7[1] = { - {50, 6}, + {61, 6}, }; static state states_30[8] = { {1, arcs_30_0}, @@ -988,7 +975,7 @@ static state states_31[4] = { {1, arcs_31_3}, }; static const arc arcs_32_0[1] = { - {49, 1}, + {108, 1}, }; static const arc arcs_32_1[2] = { {111, 2}, @@ -1010,7 +997,7 @@ static const arc arcs_33_0[1] = { {110, 1}, }; static const arc arcs_33_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_33_2[2] = { @@ -1026,7 +1013,7 @@ static const arc arcs_34_0[1] = { {112, 1}, }; static const arc arcs_34_1[2] = { - {66, 0}, + {65, 0}, {0, 1}, }; static state states_34[2] = { @@ -1037,7 +1024,7 @@ static const arc arcs_35_0[1] = { {40, 1}, }; static const arc arcs_35_1[2] = { - {108, 0}, + {107, 0}, {0, 1}, }; static state states_35[2] = { @@ -1051,7 +1038,7 @@ static const arc arcs_36_1[1] = { {40, 2}, }; static const arc arcs_36_2[2] = { - {66, 1}, + {65, 1}, {0, 2}, }; static state states_36[3] = { @@ -1066,7 +1053,7 @@ static const arc arcs_37_1[1] = { {40, 2}, }; static const arc arcs_37_2[2] = { - {66, 1}, + {65, 1}, {0, 2}, }; static state states_37[3] = { @@ -1078,14 +1065,14 @@ static const arc arcs_38_0[1] = { {15, 1}, }; static const arc arcs_38_1[1] = { - {60, 2}, + {58, 2}, }; static const arc arcs_38_2[2] = { - {66, 3}, + {65, 3}, {0, 2}, }; static const arc arcs_38_3[1] = { - {60, 4}, + {58, 4}, }; static const arc arcs_38_4[1] = { {0, 4}, @@ -1099,10 +1086,10 @@ static state states_38[5] = { }; static const arc arcs_39_0[9] = { {113, 1}, - {55, 1}, {53, 1}, + {51, 1}, {114, 1}, - {56, 1}, + {54, 1}, {115, 1}, {116, 1}, {117, 1}, @@ -1120,7 +1107,7 @@ static const arc arcs_40_0[1] = { }; static const arc arcs_40_1[3] = { {114, 2}, - {56, 2}, + {54, 2}, {118, 2}, }; static const arc arcs_40_2[1] = { @@ -1135,24 +1122,24 @@ static const arc arcs_41_0[1] = { {24, 1}, }; static const arc arcs_41_1[1] = { - {119, 2}, + {49, 2}, }; static const arc arcs_41_2[1] = { - {59, 3}, + {57, 3}, }; static const arc arcs_41_3[1] = { - {120, 4}, + {119, 4}, }; static const arc arcs_41_4[3] = { - {121, 1}, - {122, 5}, + {120, 1}, + {121, 5}, {0, 4}, }; static const arc arcs_41_5[1] = { - {59, 6}, + {57, 6}, }; static const arc arcs_41_6[1] = { - {120, 7}, + {119, 7}, }; static const arc arcs_41_7[1] = { {0, 7}, @@ -1171,23 +1158,23 @@ static const arc arcs_42_0[1] = { {33, 1}, }; static const arc arcs_42_1[1] = { - {119, 2}, + {49, 2}, }; static const arc arcs_42_2[1] = { - {59, 3}, + {57, 3}, }; static const arc arcs_42_3[1] = { - {120, 4}, + {119, 4}, }; static const arc arcs_42_4[2] = { - {122, 5}, + {121, 5}, {0, 4}, }; static const arc arcs_42_5[1] = { - {59, 6}, + {57, 6}, }; static const arc arcs_42_6[1] = { - {120, 7}, + {119, 7}, }; static const arc arcs_42_7[1] = { {0, 7}, @@ -1206,33 +1193,33 @@ static const arc arcs_43_0[1] = { {21, 1}, }; static const arc arcs_43_1[1] = { - {99, 2}, + {98, 2}, }; static const arc arcs_43_2[1] = { - {123, 3}, + {122, 3}, }; static const arc arcs_43_3[1] = { {47, 4}, }; static const arc arcs_43_4[1] = { - {59, 5}, + {57, 5}, }; static const arc arcs_43_5[2] = { - {61, 6}, - {120, 7}, + {59, 6}, + {119, 7}, }; static const arc arcs_43_6[1] = { - {120, 7}, + {119, 7}, }; static const arc arcs_43_7[2] = { - {122, 8}, + {121, 8}, {0, 7}, }; static const arc arcs_43_8[1] = { - {59, 9}, + {57, 9}, }; static const arc arcs_43_9[1] = { - {120, 10}, + {119, 10}, }; static const arc arcs_43_10[1] = { {0, 10}, @@ -1254,44 +1241,44 @@ static const arc arcs_44_0[1] = { {32, 1}, }; static const arc arcs_44_1[1] = { - {59, 2}, + {57, 2}, }; static const arc arcs_44_2[1] = { - {120, 3}, + {119, 3}, }; static const arc arcs_44_3[2] = { - {124, 4}, - {125, 5}, + {123, 4}, + {124, 5}, }; static const arc arcs_44_4[1] = { - {59, 6}, + {57, 6}, }; static const arc arcs_44_5[1] = { - {59, 7}, + {57, 7}, }; static const arc arcs_44_6[1] = { - {120, 8}, + {119, 8}, }; static const arc arcs_44_7[1] = { - {120, 9}, + {119, 9}, }; static const arc arcs_44_8[1] = { {0, 8}, }; static const arc arcs_44_9[4] = { - {122, 10}, - {124, 4}, - {125, 5}, + {121, 10}, + {123, 4}, + {124, 5}, {0, 9}, }; static const arc arcs_44_10[1] = { - {59, 11}, + {57, 11}, }; static const arc arcs_44_11[1] = { - {120, 12}, + {119, 12}, }; static const arc arcs_44_12[2] = { - {124, 4}, + {123, 4}, {0, 12}, }; static state states_44[13] = { @@ -1313,18 +1300,18 @@ static const arc arcs_45_0[1] = { {34, 1}, }; static const arc arcs_45_1[1] = { - {126, 2}, + {125, 2}, }; static const arc arcs_45_2[2] = { - {66, 1}, - {59, 3}, + {65, 1}, + {57, 3}, }; static const arc arcs_45_3[2] = { - {61, 4}, - {120, 5}, + {59, 4}, + {119, 5}, }; static const arc arcs_45_4[1] = { - {120, 5}, + {119, 5}, }; static const arc arcs_45_5[1] = { {0, 5}, @@ -1338,14 +1325,14 @@ static state states_45[6] = { {1, arcs_45_5}, }; static const arc arcs_46_0[1] = { - {60, 1}, + {58, 1}, }; static const arc arcs_46_1[2] = { {111, 2}, {0, 1}, }; static const arc arcs_46_2[1] = { - {127, 3}, + {126, 3}, }; static const arc arcs_46_3[1] = { {0, 3}, @@ -1357,10 +1344,10 @@ static state states_46[4] = { {1, arcs_46_3}, }; static const arc arcs_47_0[1] = { - {128, 1}, + {127, 1}, }; static const arc arcs_47_1[2] = { - {60, 2}, + {58, 2}, {0, 1}, }; static const arc arcs_47_2[2] = { @@ -1385,7 +1372,7 @@ static const arc arcs_48_0[2] = { {4, 2}, }; static const arc arcs_48_1[1] = { - {129, 3}, + {128, 3}, }; static const arc arcs_48_2[1] = { {0, 2}, @@ -1394,7 +1381,7 @@ static const arc arcs_48_3[1] = { {45, 4}, }; static const arc arcs_48_4[2] = { - {130, 2}, + {129, 2}, {45, 4}, }; static state states_48[5] = { @@ -1405,14 +1392,14 @@ static state states_48[5] = { {2, arcs_48_4}, }; static const arc arcs_49_0[1] = { - {60, 1}, + {58, 1}, }; static const arc arcs_49_1[2] = { - {131, 2}, + {130, 2}, {0, 1}, }; static const arc arcs_49_2[1] = { - {60, 3}, + {58, 3}, }; static const arc arcs_49_3[1] = { {0, 3}, @@ -1424,8 +1411,8 @@ static state states_49[4] = { {1, arcs_49_3}, }; static const arc arcs_50_0[2] = { - {132, 1}, - {133, 2}, + {131, 1}, + {132, 2}, }; static const arc arcs_50_1[1] = { {0, 1}, @@ -1435,13 +1422,13 @@ static const arc arcs_50_2[2] = { {0, 2}, }; static const arc arcs_50_3[1] = { - {133, 4}, + {132, 4}, }; static const arc arcs_50_4[1] = { - {122, 5}, + {121, 5}, }; static const arc arcs_50_5[1] = { - {60, 1}, + {58, 1}, }; static state states_50[6] = { {2, arcs_50_0}, @@ -1452,8 +1439,8 @@ static state states_50[6] = { {1, arcs_50_5}, }; static const arc arcs_51_0[2] = { - {135, 1}, - {133, 1}, + {134, 1}, + {132, 1}, }; static const arc arcs_51_1[1] = { {0, 1}, @@ -1466,14 +1453,14 @@ static const arc arcs_52_0[1] = { {26, 1}, }; static const arc arcs_52_1[2] = { - {59, 2}, - {69, 3}, + {57, 2}, + {68, 3}, }; static const arc arcs_52_2[1] = { - {60, 4}, + {58, 4}, }; static const arc arcs_52_3[1] = { - {59, 2}, + {57, 2}, }; static const arc arcs_52_4[1] = { {0, 4}, @@ -1489,14 +1476,14 @@ static const arc arcs_53_0[1] = { {26, 1}, }; static const arc arcs_53_1[2] = { - {59, 2}, - {69, 3}, + {57, 2}, + {68, 3}, }; static const arc arcs_53_2[1] = { - {134, 4}, + {133, 4}, }; static const arc arcs_53_3[1] = { - {59, 2}, + {57, 2}, }; static const arc arcs_53_4[1] = { {0, 4}, @@ -1509,10 +1496,10 @@ static state states_53[5] = { {1, arcs_53_4}, }; static const arc arcs_54_0[1] = { - {136, 1}, + {135, 1}, }; static const arc arcs_54_1[2] = { - {137, 0}, + {136, 0}, {0, 1}, }; static state states_54[2] = { @@ -1520,10 +1507,10 @@ static state states_54[2] = { {2, arcs_54_1}, }; static const arc arcs_55_0[1] = { - {138, 1}, + {137, 1}, }; static const arc arcs_55_1[2] = { - {139, 0}, + {138, 0}, {0, 1}, }; static state states_55[2] = { @@ -1532,10 +1519,10 @@ static state states_55[2] = { }; static const arc arcs_56_0[2] = { {28, 1}, - {140, 2}, + {139, 2}, }; static const arc arcs_56_1[1] = { - {138, 2}, + {137, 2}, }; static const arc arcs_56_2[1] = { {0, 2}, @@ -1546,10 +1533,10 @@ static state states_56[3] = { {1, arcs_56_2}, }; static const arc arcs_57_0[1] = { - {127, 1}, + {126, 1}, }; static const arc arcs_57_1[2] = { - {141, 0}, + {140, 0}, {0, 1}, }; static state states_57[2] = { @@ -1557,15 +1544,15 @@ static state states_57[2] = { {2, arcs_57_1}, }; static const arc arcs_58_0[10] = { + {141, 1}, {142, 1}, {143, 1}, + {141, 1}, {144, 1}, - {142, 1}, {145, 1}, {146, 1}, - {147, 1}, - {123, 1}, - {148, 2}, + {122, 1}, + {147, 2}, {28, 3}, }; static const arc arcs_58_1[1] = { @@ -1576,7 +1563,7 @@ static const arc arcs_58_2[2] = { {0, 2}, }; static const arc arcs_58_3[1] = { - {123, 1}, + {122, 1}, }; static state states_58[4] = { {10, arcs_58_0}, @@ -1588,7 +1575,7 @@ static const arc arcs_59_0[1] = { {6, 1}, }; static const arc arcs_59_1[1] = { - {127, 2}, + {126, 2}, }; static const arc arcs_59_2[1] = { {0, 2}, @@ -1599,10 +1586,10 @@ static state states_59[3] = { {1, arcs_59_2}, }; static const arc arcs_60_0[1] = { - {149, 1}, + {148, 1}, }; static const arc arcs_60_1[2] = { - {150, 0}, + {149, 0}, {0, 1}, }; static state states_60[2] = { @@ -1610,10 +1597,10 @@ static state states_60[2] = { {2, arcs_60_1}, }; static const arc arcs_61_0[1] = { - {151, 1}, + {150, 1}, }; static const arc arcs_61_1[2] = { - {152, 0}, + {151, 0}, {0, 1}, }; static state states_61[2] = { @@ -1621,10 +1608,10 @@ static state states_61[2] = { {2, arcs_61_1}, }; static const arc arcs_62_0[1] = { - {153, 1}, + {152, 1}, }; static const arc arcs_62_1[2] = { - {154, 0}, + {153, 0}, {0, 1}, }; static state states_62[2] = { @@ -1632,11 +1619,11 @@ static state states_62[2] = { {2, arcs_62_1}, }; static const arc arcs_63_0[1] = { - {155, 1}, + {154, 1}, }; static const arc arcs_63_1[3] = { + {155, 0}, {156, 0}, - {157, 0}, {0, 1}, }; static state states_63[2] = { @@ -1644,7 +1631,7 @@ static state states_63[2] = { {3, arcs_63_1}, }; static const arc arcs_64_0[1] = { - {158, 1}, + {157, 1}, }; static const arc arcs_64_1[3] = { {7, 0}, @@ -1656,13 +1643,13 @@ static state states_64[2] = { {3, arcs_64_1}, }; static const arc arcs_65_0[1] = { - {159, 1}, + {158, 1}, }; static const arc arcs_65_1[6] = { - {160, 0}, + {159, 0}, {6, 0}, - {68, 0}, - {161, 0}, + {67, 0}, + {160, 0}, {10, 0}, {0, 1}, }; @@ -1674,10 +1661,10 @@ static const arc arcs_66_0[4] = { {7, 1}, {8, 1}, {37, 1}, - {162, 2}, + {161, 2}, }; static const arc arcs_66_1[1] = { - {159, 2}, + {158, 2}, }; static const arc arcs_66_2[1] = { {0, 2}, @@ -1688,14 +1675,14 @@ static state states_66[3] = { {1, arcs_66_2}, }; static const arc arcs_67_0[1] = { - {163, 1}, + {162, 1}, }; static const arc arcs_67_1[2] = { - {64, 2}, + {63, 2}, {0, 1}, }; static const arc arcs_67_2[1] = { - {159, 3}, + {158, 3}, }; static const arc arcs_67_3[1] = { {0, 3}, @@ -1708,13 +1695,13 @@ static state states_67[4] = { }; static const arc arcs_68_0[2] = { {39, 1}, - {164, 2}, + {163, 2}, }; static const arc arcs_68_1[1] = { - {164, 2}, + {163, 2}, }; static const arc arcs_68_2[2] = { - {165, 2}, + {164, 2}, {0, 2}, }; static state states_68[3] = { @@ -1735,33 +1722,33 @@ static const arc arcs_69_0[10] = { {42, 5}, }; static const arc arcs_69_1[3] = { - {50, 2}, - {166, 6}, - {84, 6}, + {61, 2}, + {165, 6}, + {83, 6}, }; static const arc arcs_69_2[1] = { {0, 2}, }; static const arc arcs_69_3[2] = { - {167, 2}, - {166, 7}, + {166, 2}, + {165, 7}, }; static const arc arcs_69_4[2] = { - {168, 2}, - {169, 8}, + {167, 2}, + {168, 8}, }; static const arc arcs_69_5[2] = { {42, 5}, {0, 5}, }; static const arc arcs_69_6[1] = { - {50, 2}, + {61, 2}, }; static const arc arcs_69_7[1] = { - {167, 2}, + {166, 2}, }; static const arc arcs_69_8[1] = { - {168, 2}, + {167, 2}, }; static state states_69[9] = { {10, arcs_69_0}, @@ -1775,24 +1762,24 @@ static state states_69[9] = { {1, arcs_69_8}, }; static const arc arcs_70_0[2] = { - {119, 1}, - {85, 1}, + {49, 1}, + {84, 1}, }; static const arc arcs_70_1[3] = { - {66, 2}, - {170, 3}, + {65, 2}, + {169, 3}, {0, 1}, }; static const arc arcs_70_2[3] = { - {119, 4}, - {85, 4}, + {49, 4}, + {84, 4}, {0, 2}, }; static const arc arcs_70_3[1] = { {0, 3}, }; static const arc arcs_70_4[2] = { - {66, 2}, + {65, 2}, {0, 4}, }; static state states_70[5] = { @@ -1804,12 +1791,12 @@ static state states_70[5] = { }; static const arc arcs_71_0[3] = { {5, 1}, - {108, 2}, + {107, 2}, {14, 3}, }; static const arc arcs_71_1[2] = { - {50, 4}, - {51, 5}, + {61, 4}, + {170, 5}, }; static const arc arcs_71_2[1] = { {40, 4}, @@ -1821,10 +1808,10 @@ static const arc arcs_71_4[1] = { {0, 4}, }; static const arc arcs_71_5[1] = { - {50, 4}, + {61, 4}, }; static const arc arcs_71_6[1] = { - {167, 4}, + {166, 4}, }; static state states_71[7] = { {3, arcs_71_0}, @@ -1839,7 +1826,7 @@ static const arc arcs_72_0[1] = { {172, 1}, }; static const arc arcs_72_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_72_2[2] = { @@ -1852,16 +1839,16 @@ static state states_72[3] = { {2, arcs_72_2}, }; static const arc arcs_73_0[2] = { - {59, 1}, - {60, 2}, + {57, 1}, + {58, 2}, }; static const arc arcs_73_1[3] = { {173, 3}, - {60, 4}, + {58, 4}, {0, 1}, }; static const arc arcs_73_2[2] = { - {59, 1}, + {57, 1}, {0, 2}, }; static const arc arcs_73_3[1] = { @@ -1879,10 +1866,10 @@ static state states_73[5] = { {2, arcs_73_4}, }; static const arc arcs_74_0[1] = { - {59, 1}, + {57, 1}, }; static const arc arcs_74_1[2] = { - {60, 2}, + {58, 2}, {0, 1}, }; static const arc arcs_74_2[1] = { @@ -1894,16 +1881,16 @@ static state states_74[3] = { {1, arcs_74_2}, }; static const arc arcs_75_0[2] = { - {127, 1}, - {85, 1}, + {126, 1}, + {84, 1}, }; static const arc arcs_75_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_75_2[3] = { - {127, 1}, - {85, 1}, + {126, 1}, + {84, 1}, {0, 2}, }; static state states_75[3] = { @@ -1912,14 +1899,14 @@ static state states_75[3] = { {3, arcs_75_2}, }; static const arc arcs_76_0[1] = { - {60, 1}, + {58, 1}, }; static const arc arcs_76_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_76_2[2] = { - {60, 1}, + {58, 1}, {0, 2}, }; static state states_76[3] = { @@ -1928,61 +1915,61 @@ static state states_76[3] = { {2, arcs_76_2}, }; static const arc arcs_77_0[3] = { - {64, 1}, - {85, 2}, - {60, 3}, + {63, 1}, + {84, 2}, + {58, 3}, }; static const arc arcs_77_1[1] = { - {127, 4}, + {126, 4}, }; static const arc arcs_77_2[3] = { - {66, 5}, - {170, 6}, + {65, 5}, + {169, 6}, {0, 2}, }; static const arc arcs_77_3[4] = { - {66, 5}, - {59, 7}, - {170, 6}, + {65, 5}, + {57, 7}, + {169, 6}, {0, 3}, }; static const arc arcs_77_4[3] = { - {66, 8}, - {170, 6}, + {65, 8}, + {169, 6}, {0, 4}, }; static const arc arcs_77_5[3] = { - {85, 9}, - {60, 9}, + {84, 9}, + {58, 9}, {0, 5}, }; static const arc arcs_77_6[1] = { {0, 6}, }; static const arc arcs_77_7[1] = { - {60, 4}, + {58, 4}, }; static const arc arcs_77_8[3] = { - {64, 10}, - {60, 11}, + {63, 10}, + {58, 11}, {0, 8}, }; static const arc arcs_77_9[2] = { - {66, 5}, + {65, 5}, {0, 9}, }; static const arc arcs_77_10[1] = { - {127, 12}, + {126, 12}, }; static const arc arcs_77_11[1] = { - {59, 13}, + {57, 13}, }; static const arc arcs_77_12[2] = { - {66, 8}, + {65, 8}, {0, 12}, }; static const arc arcs_77_13[1] = { - {60, 12}, + {58, 12}, }; static state states_77[14] = { {3, arcs_77_0}, @@ -2008,20 +1995,20 @@ static const arc arcs_78_1[1] = { }; static const arc arcs_78_2[2] = { {5, 3}, - {59, 4}, + {57, 4}, }; static const arc arcs_78_3[2] = { - {50, 5}, - {51, 6}, + {61, 5}, + {170, 6}, }; static const arc arcs_78_4[1] = { - {120, 7}, + {119, 7}, }; static const arc arcs_78_5[1] = { - {59, 4}, + {57, 4}, }; static const arc arcs_78_6[1] = { - {50, 5}, + {61, 5}, }; static const arc arcs_78_7[1] = { {0, 7}, @@ -2040,7 +2027,7 @@ static const arc arcs_79_0[1] = { {174, 1}, }; static const arc arcs_79_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_79_2[2] = { @@ -2054,16 +2041,16 @@ static state states_79[3] = { }; static const arc arcs_80_0[3] = { {6, 1}, - {64, 1}, - {60, 2}, + {63, 1}, + {58, 2}, }; static const arc arcs_80_1[1] = { - {60, 3}, + {58, 3}, }; static const arc arcs_80_2[4] = { - {131, 1}, - {67, 1}, - {170, 3}, + {130, 1}, + {66, 1}, + {169, 3}, {0, 2}, }; static const arc arcs_80_3[1] = { @@ -2076,7 +2063,7 @@ static state states_80[4] = { {1, arcs_80_3}, }; static const arc arcs_81_0[2] = { - {170, 1}, + {169, 1}, {176, 1}, }; static const arc arcs_81_1[1] = { @@ -2090,13 +2077,13 @@ static const arc arcs_82_0[1] = { {21, 1}, }; static const arc arcs_82_1[1] = { - {99, 2}, + {98, 2}, }; static const arc arcs_82_2[1] = { - {123, 3}, + {122, 3}, }; static const arc arcs_82_3[1] = { - {133, 4}, + {132, 4}, }; static const arc arcs_82_4[2] = { {175, 5}, @@ -2132,7 +2119,7 @@ static const arc arcs_84_0[1] = { {24, 1}, }; static const arc arcs_84_1[1] = { - {134, 2}, + {133, 2}, }; static const arc arcs_84_2[2] = { {175, 3}, @@ -2174,10 +2161,10 @@ static state states_86[3] = { }; static const arc arcs_87_0[2] = { {22, 1}, - {81, 2}, + {80, 2}, }; static const arc arcs_87_1[1] = { - {60, 2}, + {58, 2}, }; static const arc arcs_87_2[1] = { {0, 2}, @@ -2192,8 +2179,8 @@ static const arc arcs_88_0[2] = { {4, 2}, }; static const arc arcs_88_1[2] = { - {129, 3}, - {61, 4}, + {128, 3}, + {59, 4}, }; static const arc arcs_88_2[1] = { {0, 2}, @@ -2205,11 +2192,11 @@ static const arc arcs_88_4[1] = { {2, 6}, }; static const arc arcs_88_5[2] = { - {130, 2}, + {129, 2}, {45, 5}, }; static const arc arcs_88_6[1] = { - {129, 3}, + {128, 3}, }; static state states_88[7] = { {2, arcs_88_0}, @@ -2239,17 +2226,17 @@ static const arc arcs_90_0[1] = { {5, 1}, }; static const arc arcs_90_1[2] = { - {50, 2}, + {61, 2}, {182, 3}, }; static const arc arcs_90_2[1] = { - {58, 4}, + {56, 4}, }; static const arc arcs_90_3[1] = { - {50, 2}, + {61, 2}, }; static const arc arcs_90_4[1] = { - {60, 5}, + {58, 5}, }; static const arc arcs_90_5[1] = { {0, 5}, @@ -2264,27 +2251,27 @@ static state states_90[6] = { }; static const arc arcs_91_0[3] = { {6, 1}, - {64, 2}, - {60, 3}, + {63, 2}, + {58, 3}, }; static const arc arcs_91_1[3] = { - {66, 4}, - {60, 5}, + {65, 4}, + {58, 5}, {0, 1}, }; static const arc arcs_91_2[1] = { - {60, 6}, + {58, 6}, }; static const arc arcs_91_3[2] = { - {66, 7}, + {65, 7}, {0, 3}, }; static const arc arcs_91_4[2] = { - {64, 2}, - {60, 5}, + {63, 2}, + {58, 5}, }; static const arc arcs_91_5[2] = { - {66, 4}, + {65, 4}, {0, 5}, }; static const arc arcs_91_6[1] = { @@ -2292,21 +2279,21 @@ static const arc arcs_91_6[1] = { }; static const arc arcs_91_7[4] = { {6, 8}, - {64, 2}, - {60, 3}, + {63, 2}, + {58, 3}, {0, 7}, }; static const arc arcs_91_8[3] = { - {66, 9}, - {60, 10}, + {65, 9}, + {58, 10}, {0, 8}, }; static const arc arcs_91_9[2] = { - {64, 2}, - {60, 10}, + {63, 2}, + {58, 10}, }; static const arc arcs_91_10[2] = { - {66, 9}, + {65, 9}, {0, 10}, }; static state states_91[11] = { @@ -2329,7 +2316,7 @@ static const dfa dfas[92] = { "\344\377\377\377\377\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {258, "eval_input", 3, states_2, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {259, "decorator", 7, states_3, + {259, "decorator", 4, states_3, "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {260, "decorators", 2, states_4, "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, @@ -2342,11 +2329,11 @@ static const dfa dfas[92] = { {264, "parameters", 4, states_8, "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {265, "typedargslist", 42, states_9, - "\100\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\100\000\000\000\000\001\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {266, "tfpdef", 4, states_10, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {267, "varargslist", 34, states_11, - "\100\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\100\000\000\000\000\001\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {268, "vfpdef", 2, states_12, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {269, "stmt", 2, states_13, @@ -2358,11 +2345,11 @@ static const dfa dfas[92] = { {272, "expr_stmt", 6, states_16, "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {273, "annassign", 5, states_17, - "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {274, "testlist_star_expr", 3, states_18, "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {275, "augassign", 2, states_19, - "\000\000\000\000\000\000\000\000\000\000\300\377\007\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\340\377\003\000\000\000\000\000\000\000\000\000\000"}, {276, "del_stmt", 3, states_20, "\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {277, "pass_stmt", 2, states_21, @@ -2418,7 +2405,7 @@ static const dfa dfas[92] = { {302, "with_item", 4, states_46, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {303, "except_clause", 5, states_47, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"}, {304, "suite", 5, states_48, "\344\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {305, "namedexpr_test", 4, states_49, @@ -2440,7 +2427,7 @@ static const dfa dfas[92] = { {313, "comparison", 2, states_57, "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {314, "comp_op", 4, states_58, - "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\010\000\300\037\000\000\000\000"}, + "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\004\000\340\017\000\000\000\000"}, {315, "star_expr", 3, states_59, "\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {316, "expr", 2, states_60, @@ -2466,25 +2453,25 @@ static const dfa dfas[92] = { {326, "testlist_comp", 5, states_70, "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {327, "trailer", 7, states_71, - "\040\100\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000"}, + "\040\100\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000"}, {328, "subscriptlist", 3, states_72, - "\240\173\000\024\260\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {329, "subscript", 5, states_73, - "\240\173\000\024\260\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {330, "sliceop", 3, states_74, - "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {331, "exprlist", 3, states_75, "\340\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {332, "testlist", 3, states_76, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {333, "dictorsetmaker", 14, states_77, - "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {334, "classdef", 8, states_78, "\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {335, "arglist", 3, states_79, - "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {336, "argument", 4, states_80, - "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {337, "comp_iter", 2, states_81, "\000\000\040\001\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {338, "sync_comp_for", 6, states_82, @@ -2506,7 +2493,7 @@ static const dfa dfas[92] = { {346, "func_type", 6, states_90, "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {347, "typelist", 11, states_91, - "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, }; static const label labels[183] = { {0, "EMPTY"}, @@ -2558,9 +2545,7 @@ static const label labels[183] = { {258, 0}, {332, 0}, {259, 0}, - {291, 0}, - {8, 0}, - {335, 0}, + {305, 0}, {260, 0}, {261, 0}, {262, 0}, @@ -2572,6 +2557,7 @@ static const label labels[183] = { {306, 0}, {58, 0}, {344, 0}, + {8, 0}, {265, 0}, {35, 0}, {266, 0}, @@ -2618,6 +2604,7 @@ static const label labels[183] = { {285, 0}, {290, 0}, {23, 0}, + {291, 0}, {289, 0}, {287, 0}, {1, "as"}, @@ -2628,7 +2615,6 @@ static const label labels[183] = { {300, 0}, {298, 0}, {301, 0}, - {305, 0}, {304, 0}, {1, "elif"}, {1, "else"}, @@ -2680,6 +2666,7 @@ static const label labels[183] = { {26, 0}, {333, 0}, {339, 0}, + {335, 0}, {328, 0}, {329, 0}, {330, 0}, @@ -2693,7 +2680,7 @@ static const label labels[183] = { {346, 0}, {347, 0}, }; -grammar _PyParser_Grammar = { +Py_EXPORTED_SYMBOL grammar _PyParser_Grammar = { 92, dfas, {183, labels}, diff --git a/Python/hamt.c b/Python/hamt.c index 5efc8d7f..8801c5ea 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -1,9 +1,8 @@ #include "Python.h" #include "pycore_hamt.h" -#include "pycore_object.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "pycore_object.h" // _PyObject_GC_TRACK() +#include // offsetof() /* This file provides an implementation of an immutable mapping using the @@ -274,9 +273,9 @@ to introspect the tree: */ -#define IS_ARRAY_NODE(node) (Py_TYPE(node) == &_PyHamt_ArrayNode_Type) -#define IS_BITMAP_NODE(node) (Py_TYPE(node) == &_PyHamt_BitmapNode_Type) -#define IS_COLLISION_NODE(node) (Py_TYPE(node) == &_PyHamt_CollisionNode_Type) +#define IS_ARRAY_NODE(node) Py_IS_TYPE(node, &_PyHamt_ArrayNode_Type) +#define IS_BITMAP_NODE(node) Py_IS_TYPE(node, &_PyHamt_BitmapNode_Type) +#define IS_COLLISION_NODE(node) Py_IS_TYPE(node, &_PyHamt_CollisionNode_Type) /* Return type for 'find' (lookup a key) functions. @@ -551,7 +550,7 @@ hamt_node_bitmap_new(Py_ssize_t size) return NULL; } - Py_SIZE(node) = size; + Py_SET_SIZE(node, size); for (i = 0; i < size; i++) { node->b_array[i] = NULL; @@ -830,7 +829,7 @@ hamt_node_bitmap_assoc(PyHamtNode_Bitmap *self, Instead we start using an Array node, which has simpler (faster) implementation at the expense of - having prealocated 32 pointers for its keys/values + having preallocated 32 pointers for its keys/values pairs. Small hamt objects (<30 keys) usually don't have any @@ -1288,7 +1287,7 @@ hamt_node_collision_new(int32_t hash, Py_ssize_t size) node->c_array[i] = NULL; } - Py_SIZE(node) = size; + Py_SET_SIZE(node, size); node->c_hash = hash; _PyObject_GC_TRACK(node); diff --git a/Python/hashtable.c b/Python/hashtable.c new file mode 100644 index 00000000..09501de1 --- /dev/null +++ b/Python/hashtable.c @@ -0,0 +1,417 @@ +/* The implementation of the hash table (_Py_hashtable_t) is based on the + cfuhash project: + http://sourceforge.net/projects/libcfu/ + + Copyright of cfuhash: + ---------------------------------- + Creation date: 2005-06-24 21:22:40 + Authors: Don + Change log: + + Copyright (c) 2005 Don Owens + All rights reserved. + + This code is released under the BSD license: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the author nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + OF THE POSSIBILITY OF SUCH DAMAGE. + ---------------------------------- +*/ + +#include "Python.h" +#include "pycore_hashtable.h" + +#define HASHTABLE_MIN_SIZE 16 +#define HASHTABLE_HIGH 0.50 +#define HASHTABLE_LOW 0.10 +#define HASHTABLE_REHASH_FACTOR 2.0 / (HASHTABLE_LOW + HASHTABLE_HIGH) + +#define BUCKETS_HEAD(SLIST) \ + ((_Py_hashtable_entry_t *)_Py_SLIST_HEAD(&(SLIST))) +#define TABLE_HEAD(HT, BUCKET) \ + ((_Py_hashtable_entry_t *)_Py_SLIST_HEAD(&(HT)->buckets[BUCKET])) +#define ENTRY_NEXT(ENTRY) \ + ((_Py_hashtable_entry_t *)_Py_SLIST_ITEM_NEXT(ENTRY)) + +/* Forward declaration */ +static int hashtable_rehash(_Py_hashtable_t *ht); + +static void +_Py_slist_init(_Py_slist_t *list) +{ + list->head = NULL; +} + + +static void +_Py_slist_prepend(_Py_slist_t *list, _Py_slist_item_t *item) +{ + item->next = list->head; + list->head = item; +} + + +static void +_Py_slist_remove(_Py_slist_t *list, _Py_slist_item_t *previous, + _Py_slist_item_t *item) +{ + if (previous != NULL) + previous->next = item->next; + else + list->head = item->next; +} + + +Py_uhash_t +_Py_hashtable_hash_ptr(const void *key) +{ + return (Py_uhash_t)_Py_HashPointerRaw(key); +} + + +int +_Py_hashtable_compare_direct(const void *key1, const void *key2) +{ + return (key1 == key2); +} + + +/* makes sure the real size of the buckets array is a power of 2 */ +static size_t +round_size(size_t s) +{ + size_t i; + if (s < HASHTABLE_MIN_SIZE) + return HASHTABLE_MIN_SIZE; + i = 1; + while (i < s) + i <<= 1; + return i; +} + + +size_t +_Py_hashtable_size(const _Py_hashtable_t *ht) +{ + size_t size = sizeof(_Py_hashtable_t); + /* buckets */ + size += ht->nbuckets * sizeof(_Py_hashtable_entry_t *); + /* entries */ + size += ht->nentries * sizeof(_Py_hashtable_entry_t); + return size; +} + + +_Py_hashtable_entry_t * +_Py_hashtable_get_entry_generic(_Py_hashtable_t *ht, const void *key) +{ + Py_uhash_t key_hash = ht->hash_func(key); + size_t index = key_hash & (ht->nbuckets - 1); + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, index); + while (1) { + if (entry == NULL) { + return NULL; + } + if (entry->key_hash == key_hash && ht->compare_func(key, entry->key)) { + break; + } + entry = ENTRY_NEXT(entry); + } + return entry; +} + + +// Specialized for: +// hash_func == _Py_hashtable_hash_ptr +// compare_func == _Py_hashtable_compare_direct +static _Py_hashtable_entry_t * +_Py_hashtable_get_entry_ptr(_Py_hashtable_t *ht, const void *key) +{ + Py_uhash_t key_hash = _Py_hashtable_hash_ptr(key); + size_t index = key_hash & (ht->nbuckets - 1); + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, index); + while (1) { + if (entry == NULL) { + return NULL; + } + // Compare directly keys (ignore entry->key_hash) + if (entry->key == key) { + break; + } + entry = ENTRY_NEXT(entry); + } + return entry; +} + + +void* +_Py_hashtable_steal(_Py_hashtable_t *ht, const void *key) +{ + Py_uhash_t key_hash = ht->hash_func(key); + size_t index = key_hash & (ht->nbuckets - 1); + + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, index); + _Py_hashtable_entry_t *previous = NULL; + while (1) { + if (entry == NULL) { + // not found + return NULL; + } + if (entry->key_hash == key_hash && ht->compare_func(key, entry->key)) { + break; + } + previous = entry; + entry = ENTRY_NEXT(entry); + } + + _Py_slist_remove(&ht->buckets[index], (_Py_slist_item_t *)previous, + (_Py_slist_item_t *)entry); + ht->nentries--; + + void *value = entry->value; + ht->alloc.free(entry); + + if ((float)ht->nentries / (float)ht->nbuckets < HASHTABLE_LOW) { + // Ignore failure: error cannot be reported to the caller + hashtable_rehash(ht); + } + return value; +} + + +int +_Py_hashtable_set(_Py_hashtable_t *ht, const void *key, void *value) +{ + _Py_hashtable_entry_t *entry; + +#ifndef NDEBUG + /* Don't write the assertion on a single line because it is interesting + to know the duplicated entry if the assertion failed. The entry can + be read using a debugger. */ + entry = ht->get_entry_func(ht, key); + assert(entry == NULL); +#endif + + + entry = ht->alloc.malloc(sizeof(_Py_hashtable_entry_t)); + if (entry == NULL) { + /* memory allocation failed */ + return -1; + } + + entry->key_hash = ht->hash_func(key); + entry->key = (void *)key; + entry->value = value; + + ht->nentries++; + if ((float)ht->nentries / (float)ht->nbuckets > HASHTABLE_HIGH) { + if (hashtable_rehash(ht) < 0) { + ht->nentries--; + ht->alloc.free(entry); + return -1; + } + } + + size_t index = entry->key_hash & (ht->nbuckets - 1); + _Py_slist_prepend(&ht->buckets[index], (_Py_slist_item_t*)entry); + return 0; +} + + +void* +_Py_hashtable_get(_Py_hashtable_t *ht, const void *key) +{ + _Py_hashtable_entry_t *entry = ht->get_entry_func(ht, key); + if (entry != NULL) { + return entry->value; + } + else { + return NULL; + } +} + + +int +_Py_hashtable_foreach(_Py_hashtable_t *ht, + _Py_hashtable_foreach_func func, + void *user_data) +{ + for (size_t hv = 0; hv < ht->nbuckets; hv++) { + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, hv); + while (entry != NULL) { + int res = func(ht, entry->key, entry->value, user_data); + if (res) { + return res; + } + entry = ENTRY_NEXT(entry); + } + } + return 0; +} + + +static int +hashtable_rehash(_Py_hashtable_t *ht) +{ + size_t new_size = round_size((size_t)(ht->nentries * HASHTABLE_REHASH_FACTOR)); + if (new_size == ht->nbuckets) { + return 0; + } + + size_t buckets_size = new_size * sizeof(ht->buckets[0]); + _Py_slist_t *new_buckets = ht->alloc.malloc(buckets_size); + if (new_buckets == NULL) { + /* memory allocation failed */ + return -1; + } + memset(new_buckets, 0, buckets_size); + + for (size_t bucket = 0; bucket < ht->nbuckets; bucket++) { + _Py_hashtable_entry_t *entry = BUCKETS_HEAD(ht->buckets[bucket]); + while (entry != NULL) { + assert(ht->hash_func(entry->key) == entry->key_hash); + _Py_hashtable_entry_t *next = ENTRY_NEXT(entry); + size_t entry_index = entry->key_hash & (new_size - 1); + + _Py_slist_prepend(&new_buckets[entry_index], (_Py_slist_item_t*)entry); + + entry = next; + } + } + + ht->alloc.free(ht->buckets); + ht->nbuckets = new_size; + ht->buckets = new_buckets; + return 0; +} + + +_Py_hashtable_t * +_Py_hashtable_new_full(_Py_hashtable_hash_func hash_func, + _Py_hashtable_compare_func compare_func, + _Py_hashtable_destroy_func key_destroy_func, + _Py_hashtable_destroy_func value_destroy_func, + _Py_hashtable_allocator_t *allocator) +{ + _Py_hashtable_allocator_t alloc; + if (allocator == NULL) { + alloc.malloc = PyMem_Malloc; + alloc.free = PyMem_Free; + } + else { + alloc = *allocator; + } + + _Py_hashtable_t *ht = (_Py_hashtable_t *)alloc.malloc(sizeof(_Py_hashtable_t)); + if (ht == NULL) { + return ht; + } + + ht->nbuckets = HASHTABLE_MIN_SIZE; + ht->nentries = 0; + + size_t buckets_size = ht->nbuckets * sizeof(ht->buckets[0]); + ht->buckets = alloc.malloc(buckets_size); + if (ht->buckets == NULL) { + alloc.free(ht); + return NULL; + } + memset(ht->buckets, 0, buckets_size); + + ht->get_entry_func = _Py_hashtable_get_entry_generic; + ht->hash_func = hash_func; + ht->compare_func = compare_func; + ht->key_destroy_func = key_destroy_func; + ht->value_destroy_func = value_destroy_func; + ht->alloc = alloc; + if (ht->hash_func == _Py_hashtable_hash_ptr + && ht->compare_func == _Py_hashtable_compare_direct) + { + ht->get_entry_func = _Py_hashtable_get_entry_ptr; + } + return ht; +} + + +_Py_hashtable_t * +_Py_hashtable_new(_Py_hashtable_hash_func hash_func, + _Py_hashtable_compare_func compare_func) +{ + return _Py_hashtable_new_full(hash_func, compare_func, + NULL, NULL, NULL); +} + + +static void +_Py_hashtable_destroy_entry(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry) +{ + if (ht->key_destroy_func) { + ht->key_destroy_func(entry->key); + } + if (ht->value_destroy_func) { + ht->value_destroy_func(entry->value); + } + ht->alloc.free(entry); +} + + +void +_Py_hashtable_clear(_Py_hashtable_t *ht) +{ + for (size_t i=0; i < ht->nbuckets; i++) { + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, i); + while (entry != NULL) { + _Py_hashtable_entry_t *next = ENTRY_NEXT(entry); + _Py_hashtable_destroy_entry(ht, entry); + entry = next; + } + _Py_slist_init(&ht->buckets[i]); + } + ht->nentries = 0; + // Ignore failure: clear function is not expected to fail + // because of a memory allocation failure. + (void)hashtable_rehash(ht); +} + + +void +_Py_hashtable_destroy(_Py_hashtable_t *ht) +{ + for (size_t i = 0; i < ht->nbuckets; i++) { + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, i); + while (entry) { + _Py_hashtable_entry_t *entry_next = ENTRY_NEXT(entry); + _Py_hashtable_destroy_entry(ht, entry); + entry = entry_next; + } + } + + ht->alloc.free(ht->buckets); + ht->alloc.free(ht); +} diff --git a/Python/import.c b/Python/import.c index b73fe2f9..0e2e7c37 100644 --- a/Python/import.c +++ b/Python/import.c @@ -4,15 +4,17 @@ #include "Python-ast.h" #undef Yield /* undefine macro conflicting with */ +#include "pycore_initconfig.h" +#include "pycore_pyerrors.h" #include "pycore_pyhash.h" #include "pycore_pylifecycle.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" +#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() +#include "pycore_interp.h" // _PyInterpreterState_ClearModules() +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "pycore_sysmodule.h" #include "errcode.h" #include "marshal.h" #include "code.h" -#include "frameobject.h" -#include "osdefs.h" #include "importdl.h" #include "pydtrace.h" @@ -25,6 +27,9 @@ extern "C" { #define CACHEDIR "__pycache__" +/* Forward references */ +static PyObject *import_add_module(PyThreadState *tstate, PyObject *name); + /* See _PyImport_FixupExtensionObject() below */ static PyObject *extensions = NULL; @@ -34,6 +39,9 @@ extern struct _inittab _PyImport_Inittab[]; struct _inittab *PyImport_Inittab = _PyImport_Inittab; static struct _inittab *inittab_copy = NULL; +_Py_IDENTIFIER(__path__); +_Py_IDENTIFIER(__spec__); + /*[clinic input] module _imp [clinic start generated code]*/ @@ -44,17 +52,7 @@ module _imp /* Initialize things */ PyStatus -_PyImport_Init(PyInterpreterState *interp) -{ - interp->builtins_copy = PyDict_Copy(interp->builtins); - if (interp->builtins_copy == NULL) { - return _PyStatus_ERR("Can't backup builtins dict"); - } - return _PyStatus_OK(); -} - -PyStatus -_PyImportHooks_Init(void) +_PyImportHooks_Init(PyThreadState *tstate) { PyObject *v, *path_hooks = NULL; int err = 0; @@ -85,31 +83,32 @@ _PyImportHooks_Init(void) return _PyStatus_OK(); error: - PyErr_Print(); + _PyErr_Print(tstate); return _PyStatus_ERR("initializing sys.meta_path, sys.path_hooks, " "or path_importer_cache failed"); } PyStatus -_PyImportZip_Init(PyInterpreterState *interp) +_PyImportZip_Init(PyThreadState *tstate) { PyObject *path_hooks, *zipimport; int err = 0; path_hooks = PySys_GetObject("path_hooks"); if (path_hooks == NULL) { - PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path_hooks"); + _PyErr_SetString(tstate, PyExc_RuntimeError, + "unable to get sys.path_hooks"); goto error; } - int verbose = interp->config.verbose; + int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose; if (verbose) { PySys_WriteStderr("# installing zipimport hook\n"); } zipimport = PyImport_ImportModule("zipimport"); if (zipimport == NULL) { - PyErr_Clear(); /* No zip import module -- okay */ + _PyErr_Clear(tstate); /* No zip import module -- okay */ if (verbose) { PySys_WriteStderr("# can't import zipimport\n"); } @@ -120,7 +119,7 @@ _PyImportZip_Init(PyInterpreterState *interp) &PyId_zipimporter); Py_DECREF(zipimport); if (zipimporter == NULL) { - PyErr_Clear(); /* No zipimporter object -- okay */ + _PyErr_Clear(tstate); /* No zipimporter object -- okay */ if (verbose) { PySys_WriteStderr("# can't import zipimport.zipimporter\n"); } @@ -149,8 +148,6 @@ _PyImportZip_Init(PyInterpreterState *interp) in different threads to return with a partially loaded module. These calls are serialized by the global interpreter lock. */ -#include "pythread.h" - static PyThread_type_lock import_lock = 0; static unsigned long import_lock_thread = PYTHREAD_INVALID_THREAD_ID; static int import_lock_level = 0; @@ -199,6 +196,7 @@ _PyImport_ReleaseLock(void) return 1; } +#ifdef HAVE_FORK /* This function is called from PyOS_AfterFork_Child to ensure that newly created child processes do not share locks with the parent. We now acquire the import lock around fork() calls but on some platforms @@ -208,9 +206,8 @@ void _PyImport_ReInitLock(void) { if (import_lock != NULL) { - import_lock = PyThread_allocate_lock(); - if (import_lock == NULL) { - Py_FatalError("PyImport_ReInitLock failed to create a new lock"); + if (_PyThread_at_fork_reinit(&import_lock) < 0) { + _Py_FatalErrorFunc(__func__, "failed to create a new lock"); } } if (import_lock_level > 1) { @@ -228,6 +225,7 @@ _PyImport_ReInitLock(void) import_lock_level = 0; } } +#endif /*[clinic input] _imp.lock_held @@ -310,9 +308,9 @@ _PyImport_Fini2(void) PyObject * PyImport_GetModuleDict(void) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (interp->modules == NULL) { - Py_FatalError("PyImport_GetModuleDict: no module dictionary!"); + Py_FatalError("interpreter has no modules dictionary"); } return interp->modules; } @@ -342,26 +340,30 @@ _PyImport_GetModuleId(struct _Py_Identifier *nameid) int _PyImport_SetModule(PyObject *name, PyObject *m) { - PyObject *modules = PyImport_GetModuleDict(); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *modules = tstate->interp->modules; return PyObject_SetItem(modules, name, m); } int _PyImport_SetModuleString(const char *name, PyObject *m) { - PyObject *modules = PyImport_GetModuleDict(); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *modules = tstate->interp->modules; return PyMapping_SetItemString(modules, name, m); } -PyObject * -PyImport_GetModule(PyObject *name) +static PyObject * +import_get_module(PyThreadState *tstate, PyObject *name) { - PyObject *m; - PyObject *modules = PyImport_GetModuleDict(); + PyObject *modules = tstate->interp->modules; if (modules == NULL) { - PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules"); + _PyErr_SetString(tstate, PyExc_RuntimeError, + "unable to get sys.modules"); return NULL; } + + PyObject *m; Py_INCREF(modules); if (PyDict_CheckExact(modules)) { m = PyDict_GetItemWithError(modules, name); /* borrowed */ @@ -369,8 +371,8 @@ PyImport_GetModule(PyObject *name) } else { m = PyObject_GetItem(modules, name); - if (m == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) { - PyErr_Clear(); + if (m == NULL && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); } } Py_DECREF(modules); @@ -378,6 +380,35 @@ PyImport_GetModule(PyObject *name) } +static int +import_ensure_initialized(PyThreadState *tstate, PyObject *mod, PyObject *name) +{ + PyInterpreterState *interp = tstate->interp; + PyObject *spec; + + _Py_IDENTIFIER(_lock_unlock_module); + + /* Optimization: only call _bootstrap._lock_unlock_module() if + __spec__._initializing is true. + NOTE: because of this, initializing must be set *before* + stuffing the new module in sys.modules. + */ + spec = _PyObject_GetAttrId(mod, &PyId___spec__); + int busy = _PyModuleSpec_IsInitializing(spec); + Py_XDECREF(spec); + if (busy) { + /* Wait until module is done importing. */ + PyObject *value = _PyObject_CallMethodIdOneArg( + interp->importlib, &PyId__lock_unlock_module, name); + if (value == NULL) { + return -1; + } + Py_DECREF(value); + } + return 0; +} + + /* List of names to clear in sys */ static const char * const sys_deletes[] = { "path", "argv", "ps1", "ps2", @@ -397,17 +428,14 @@ static const char * const sys_files[] = { /* Un-initialize things, as good as we can */ void -PyImport_Cleanup(void) +_PyImport_Cleanup(PyThreadState *tstate) { - Py_ssize_t pos; - PyObject *key, *value, *dict; - PyInterpreterState *interp = _PyInterpreterState_Get(); - PyObject *modules = PyImport_GetModuleDict(); - PyObject *weaklist = NULL; - const char * const *p; - - if (modules == NULL) - return; /* Already done */ + PyInterpreterState *interp = tstate->interp; + PyObject *modules = interp->modules; + if (modules == NULL) { + /* Already done */ + return; + } /* Delete some special variables first. These are common places where user values hide and people complain when their @@ -417,7 +445,7 @@ PyImport_Cleanup(void) /* XXX Perhaps these precautions are obsolete. Who knows? */ - int verbose = interp->config.verbose; + int verbose = _PyInterpreterState_GetConfig(interp)->verbose; if (verbose) { PySys_WriteStderr("# clear builtins._\n"); } @@ -425,6 +453,7 @@ PyImport_Cleanup(void) PyErr_WriteUnraisable(NULL); } + const char * const *p; for (p = sys_deletes; *p != NULL; p++) { if (verbose) { PySys_WriteStderr("# clear sys.%s\n", *p); @@ -437,9 +466,10 @@ PyImport_Cleanup(void) if (verbose) { PySys_WriteStderr("# restore sys.%s\n", *p); } - value = _PyDict_GetItemStringWithError(interp->sysdict, *(p+1)); + PyObject *value = _PyDict_GetItemStringWithError(interp->sysdict, + *(p+1)); if (value == NULL) { - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { PyErr_WriteUnraisable(NULL); } value = Py_None; @@ -453,7 +483,7 @@ PyImport_Cleanup(void) modules when they are removed from sys.modules. The name is used for diagnosis messages (in verbose mode), while the weakref helps detect those modules which have been held alive. */ - weaklist = PyList_New(0); + PyObject *weaklist = PyList_New(0); if (weaklist == NULL) { PyErr_WriteUnraisable(NULL); } @@ -487,7 +517,8 @@ PyImport_Cleanup(void) /* Remove all modules from sys.modules, hoping that garbage collection can reclaim most of them. */ if (PyDict_CheckExact(modules)) { - pos = 0; + Py_ssize_t pos = 0; + PyObject *key, *value; while (PyDict_Next(modules, &pos, &key, &value)) { CLEAR_MODULE(key, value); } @@ -498,8 +529,9 @@ PyImport_Cleanup(void) PyErr_WriteUnraisable(NULL); } else { + PyObject *key; while ((key = PyIter_Next(iterator))) { - value = PyObject_GetItem(modules, key); + PyObject *value = PyObject_GetItem(modules, key); if (value == NULL) { PyErr_WriteUnraisable(NULL); continue; @@ -521,28 +553,26 @@ PyImport_Cleanup(void) } else { _Py_IDENTIFIER(clear); - if (_PyObject_CallMethodId(modules, &PyId_clear, "") == NULL) { + if (_PyObject_CallMethodIdNoArgs(modules, &PyId_clear) == NULL) { PyErr_WriteUnraisable(NULL); } } /* Restore the original builtins dict, to ensure that any user data gets cleared. */ - dict = PyDict_Copy(interp->builtins); + PyObject *dict = PyDict_Copy(interp->builtins); if (dict == NULL) { PyErr_WriteUnraisable(NULL); } PyDict_Clear(interp->builtins); if (PyDict_Update(interp->builtins, interp->builtins_copy)) { - PyErr_Clear(); + _PyErr_Clear(tstate); } Py_XDECREF(dict); - /* Clear module dict copies stored in the interpreter state */ - _PyState_ClearModules(); /* Collect references */ _PyGC_CollectNoFail(); /* Dump GC stats before it's too late, since it uses the warnings machinery. */ - _PyGC_DumpShutdownStats(&_PyRuntime); + _PyGC_DumpShutdownStats(tstate); /* Now, if there are any modules left alive, clear their globals to minimize potential leaks. All C extension modules actually end @@ -589,6 +619,9 @@ PyImport_Cleanup(void) } _PyModule_ClearDict(interp->builtins); + /* Clear module dict copies stored in the interpreter state */ + _PyInterpreterState_ClearModules(interp); + /* Clear and delete the modules directory. Actual modules will still be there only if imported during the execution of some destructor. */ @@ -609,7 +642,7 @@ long PyImport_GetMagicNumber(void) { long res; - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); PyObject *external, *pyc_magic; external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external"); @@ -652,52 +685,64 @@ PyImport_GetMagicTag(void) int _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, - PyObject *filename, PyObject *modules) + PyObject *filename, PyObject *modules) { - PyObject *dict, *key; - struct PyModuleDef *def; - int res; - if (extensions == NULL) { - extensions = PyDict_New(); - if (extensions == NULL) - return -1; - } if (mod == NULL || !PyModule_Check(mod)) { PyErr_BadInternalCall(); return -1; } - def = PyModule_GetDef(mod); + + struct PyModuleDef *def = PyModule_GetDef(mod); if (!def) { PyErr_BadInternalCall(); return -1; } - if (PyObject_SetItem(modules, name, mod) < 0) + + PyThreadState *tstate = _PyThreadState_GET(); + if (PyObject_SetItem(modules, name, mod) < 0) { return -1; - if (_PyState_AddModule(mod, def) < 0) { + } + if (_PyState_AddModule(tstate, mod, def) < 0) { PyMapping_DelItem(modules, name); return -1; } - if (def->m_size == -1) { - if (def->m_base.m_copy) { - /* Somebody already imported the module, - likely under a different name. - XXX this should really not happen. */ - Py_CLEAR(def->m_base.m_copy); + + if (_Py_IsMainInterpreter(tstate)) { + if (def->m_size == -1) { + if (def->m_base.m_copy) { + /* Somebody already imported the module, + likely under a different name. + XXX this should really not happen. */ + Py_CLEAR(def->m_base.m_copy); + } + PyObject *dict = PyModule_GetDict(mod); + if (dict == NULL) { + return -1; + } + def->m_base.m_copy = PyDict_Copy(dict); + if (def->m_base.m_copy == NULL) { + return -1; + } } - dict = PyModule_GetDict(mod); - if (dict == NULL) + + if (extensions == NULL) { + extensions = PyDict_New(); + if (extensions == NULL) { + return -1; + } + } + + PyObject *key = PyTuple_Pack(2, filename, name); + if (key == NULL) { return -1; - def->m_base.m_copy = PyDict_Copy(dict); - if (def->m_base.m_copy == NULL) + } + int res = PyDict_SetItem(extensions, key, (PyObject *)def); + Py_DECREF(key); + if (res < 0) { return -1; + } } - key = PyTuple_Pack(2, filename, name); - if (key == NULL) - return -1; - res = PyDict_SetItem(extensions, key, (PyObject *)def); - Py_DECREF(key); - if (res < 0) - return -1; + return 0; } @@ -714,33 +759,32 @@ _PyImport_FixupBuiltin(PyObject *mod, const char *name, PyObject *modules) return res; } -PyObject * -_PyImport_FindExtensionObject(PyObject *name, PyObject *filename) -{ - PyObject *modules = PyImport_GetModuleDict(); - return _PyImport_FindExtensionObjectEx(name, filename, modules); -} - -PyObject * -_PyImport_FindExtensionObjectEx(PyObject *name, PyObject *filename, - PyObject *modules) +static PyObject * +import_find_extension(PyThreadState *tstate, PyObject *name, + PyObject *filename) { - PyObject *mod, *mdict, *key; - PyModuleDef* def; - if (extensions == NULL) + if (extensions == NULL) { return NULL; - key = PyTuple_Pack(2, filename, name); - if (key == NULL) + } + + PyObject *key = PyTuple_Pack(2, filename, name); + if (key == NULL) { return NULL; - def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key); + } + PyModuleDef* def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key); Py_DECREF(key); - if (def == NULL) + if (def == NULL) { return NULL; + } + + PyObject *mod, *mdict; + PyObject *modules = tstate->interp->modules; + if (def->m_size == -1) { /* Module does not support repeated initialization */ if (def->m_base.m_copy == NULL) return NULL; - mod = _PyImport_AddModuleObject(name, modules); + mod = import_add_module(tstate, name); if (mod == NULL) return NULL; mdict = PyModule_GetDict(mod); @@ -761,27 +805,35 @@ _PyImport_FindExtensionObjectEx(PyObject *name, PyObject *filename, } Py_DECREF(mod); } - if (_PyState_AddModule(mod, def) < 0) { + if (_PyState_AddModule(tstate, mod, def) < 0) { PyMapping_DelItem(modules, name); return NULL; } - int verbose = _PyInterpreterState_Get()->config.verbose; + + int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose; if (verbose) { PySys_FormatStderr("import %U # previously loaded (%R)\n", name, filename); } return mod; +} +PyObject * +_PyImport_FindExtensionObject(PyObject *name, PyObject *filename) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return import_find_extension(tstate, name, filename); } + PyObject * -_PyImport_FindBuiltin(const char *name, PyObject *modules) +_PyImport_FindBuiltin(PyThreadState *tstate, const char *name) { PyObject *res, *nameobj; nameobj = PyUnicode_InternFromString(name); if (nameobj == NULL) return NULL; - res = _PyImport_FindExtensionObjectEx(nameobj, nameobj, modules); + res = import_find_extension(tstate, nameobj, nameobj); Py_DECREF(nameobj); return res; } @@ -792,29 +844,29 @@ _PyImport_FindBuiltin(const char *name, PyObject *modules) Because the former action is most common, THIS DOES NOT RETURN A 'NEW' REFERENCE! */ -PyObject * -PyImport_AddModuleObject(PyObject *name) +static PyObject * +import_add_module(PyThreadState *tstate, PyObject *name) { - PyObject *modules = PyImport_GetModuleDict(); - return _PyImport_AddModuleObject(name, modules); -} + PyObject *modules = tstate->interp->modules; + if (modules == NULL) { + _PyErr_SetString(tstate, PyExc_RuntimeError, + "no import module dictionary"); + return NULL; + } -PyObject * -_PyImport_AddModuleObject(PyObject *name, PyObject *modules) -{ PyObject *m; if (PyDict_CheckExact(modules)) { m = PyDict_GetItemWithError(modules, name); } else { m = PyObject_GetItem(modules, name); - // For backward-comaptibility we copy the behavior + // For backward-compatibility we copy the behavior // of PyDict_GetItemWithError(). - if (PyErr_ExceptionMatches(PyExc_KeyError)) { - PyErr_Clear(); + if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); } } - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { return NULL; } if (m != NULL && PyModule_Check(m)) { @@ -832,14 +884,22 @@ _PyImport_AddModuleObject(PyObject *name, PyObject *modules) return m; } +PyObject * +PyImport_AddModuleObject(PyObject *name) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return import_add_module(tstate, name); +} + + PyObject * PyImport_AddModule(const char *name) { - PyObject *nameobj, *module; - nameobj = PyUnicode_FromString(name); - if (nameobj == NULL) + PyObject *nameobj = PyUnicode_FromString(name); + if (nameobj == NULL) { return NULL; - module = PyImport_AddModuleObject(nameobj); + } + PyObject *module = PyImport_AddModuleObject(nameobj); Py_DECREF(nameobj); return module; } @@ -847,20 +907,24 @@ PyImport_AddModule(const char *name) /* Remove name from sys.modules, if it's there. */ static void -remove_module(PyObject *name) +remove_module(PyThreadState *tstate, PyObject *name) { PyObject *type, *value, *traceback; - PyErr_Fetch(&type, &value, &traceback); - PyObject *modules = PyImport_GetModuleDict(); + _PyErr_Fetch(tstate, &type, &value, &traceback); + + PyObject *modules = tstate->interp->modules; if (!PyMapping_HasKey(modules, name)) { goto out; } if (PyMapping_DelItem(modules, name) < 0) { - Py_FatalError("import: deleting existing key in " - "sys.modules failed"); + _PyErr_SetString(tstate, PyExc_RuntimeError, + "deleting key in sys.modules failed"); + _PyErr_ChainExceptions(type, value, traceback); + return; } + out: - PyErr_Restore(type, value, traceback); + _PyErr_Restore(tstate, type, value, traceback); } @@ -914,20 +978,18 @@ PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, goto error; } else if (cpathobj != NULL) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); _Py_IDENTIFIER(_get_sourcefile); if (interp == NULL) { - Py_FatalError("PyImport_ExecCodeModuleWithPathnames: " - "no interpreter!"); + Py_FatalError("no current interpreter"); } external= PyObject_GetAttrString(interp->importlib, "_bootstrap_external"); if (external != NULL) { - pathobj = _PyObject_CallMethodIdObjArgs(external, - &PyId__get_sourcefile, cpathobj, - NULL); + pathobj = _PyObject_CallMethodIdOneArg( + external, &PyId__get_sourcefile, cpathobj); Py_DECREF(external); } if (pathobj == NULL) @@ -945,23 +1007,23 @@ error: } static PyObject * -module_dict_for_exec(PyObject *name) +module_dict_for_exec(PyThreadState *tstate, PyObject *name) { _Py_IDENTIFIER(__builtins__); PyObject *m, *d = NULL; - m = PyImport_AddModuleObject(name); + m = import_add_module(tstate, name); if (m == NULL) return NULL; /* If the module is being reloaded, we get the old module back and re-use its dict to exec the new code. */ d = PyModule_GetDict(m); if (_PyDict_GetItemIdWithError(d, &PyId___builtins__) == NULL) { - if (PyErr_Occurred() || + if (_PyErr_Occurred(tstate) || _PyDict_SetItemId(d, &PyId___builtins__, PyEval_GetBuiltins()) != 0) { - remove_module(name); + remove_module(tstate, name); return NULL; } } @@ -970,22 +1032,23 @@ module_dict_for_exec(PyObject *name) } static PyObject * -exec_code_in_module(PyObject *name, PyObject *module_dict, PyObject *code_object) +exec_code_in_module(PyThreadState *tstate, PyObject *name, + PyObject *module_dict, PyObject *code_object) { PyObject *v, *m; v = PyEval_EvalCode(code_object, module_dict, module_dict); if (v == NULL) { - remove_module(name); + remove_module(tstate, name); return NULL; } Py_DECREF(v); - m = PyImport_GetModule(name); - if (m == NULL && !PyErr_Occurred()) { - PyErr_Format(PyExc_ImportError, - "Loaded module %R not found in sys.modules", - name); + m = import_get_module(tstate, name); + if (m == NULL && !_PyErr_Occurred(tstate)) { + _PyErr_Format(tstate, PyExc_ImportError, + "Loaded module %R not found in sys.modules", + name); } return m; @@ -995,11 +1058,11 @@ PyObject* PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject *d, *external, *res; - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); _Py_IDENTIFIER(_fix_up_module); - d = module_dict_for_exec(name); + d = module_dict_for_exec(tstate, name); if (d == NULL) { return NULL; } @@ -1007,7 +1070,8 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, if (pathname == NULL) { pathname = ((PyCodeObject *)co)->co_filename; } - external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external"); + external = PyObject_GetAttrString(tstate->interp->importlib, + "_bootstrap_external"); if (external == NULL) return NULL; res = _PyObject_CallMethodIdObjArgs(external, @@ -1016,7 +1080,7 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, Py_DECREF(external); if (res != NULL) { Py_DECREF(res); - res = exec_code_in_module(name, d, co); + res = exec_code_in_module(tstate, name, d, co); } return res; } @@ -1115,8 +1179,8 @@ is_builtin(PyObject *name) Returns a borrowed reference. */ static PyObject * -get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, - PyObject *p) +get_path_importer(PyThreadState *tstate, PyObject *path_importer_cache, + PyObject *path_hooks, PyObject *p) { PyObject *importer; Py_ssize_t j, nhooks; @@ -1130,7 +1194,7 @@ get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, return NULL; /* Shouldn't happen */ importer = PyDict_GetItemWithError(path_importer_cache, p); - if (importer != NULL || PyErr_Occurred()) + if (importer != NULL || _PyErr_Occurred(tstate)) return importer; /* set path_importer_cache[p] to None to avoid recursion */ @@ -1141,14 +1205,14 @@ get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, PyObject *hook = PyList_GetItem(path_hooks, j); if (hook == NULL) return NULL; - importer = PyObject_CallFunctionObjArgs(hook, p, NULL); + importer = PyObject_CallOneArg(hook, p); if (importer != NULL) break; - if (!PyErr_ExceptionMatches(PyExc_ImportError)) { + if (!_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) { return NULL; } - PyErr_Clear(); + _PyErr_Clear(tstate); } if (importer == NULL) { return Py_None; @@ -1163,13 +1227,15 @@ get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, } PyObject * -PyImport_GetImporter(PyObject *path) { +PyImport_GetImporter(PyObject *path) +{ + PyThreadState *tstate = _PyThreadState_GET(); PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL; path_importer_cache = PySys_GetObject("path_importer_cache"); path_hooks = PySys_GetObject("path_hooks"); if (path_importer_cache != NULL && path_hooks != NULL) { - importer = get_path_importer(path_importer_cache, + importer = get_path_importer(tstate, path_importer_cache, path_hooks, path); } Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */ @@ -1189,6 +1255,7 @@ static PyObject * _imp_create_builtin(PyObject *module, PyObject *spec) /*[clinic end generated code: output=ace7ff22271e6f39 input=37f966f890384e47]*/ { + PyThreadState *tstate = _PyThreadState_GET(); struct _inittab *p; PyObject *name; const char *namestr; @@ -1200,7 +1267,7 @@ _imp_create_builtin(PyObject *module, PyObject *spec) } mod = _PyImport_FindExtensionObject(name, name); - if (mod || PyErr_Occurred()) { + if (mod || _PyErr_Occurred(tstate)) { Py_DECREF(name); Py_XINCREF(mod); return mod; @@ -1212,7 +1279,7 @@ _imp_create_builtin(PyObject *module, PyObject *spec) return NULL; } - PyObject *modules = NULL; + PyObject *modules = tstate->interp->modules; for (p = PyImport_Inittab; p->name != NULL; p++) { PyModuleDef *def; if (_PyUnicode_EqualToASCIIString(name, p->name)) { @@ -1238,9 +1305,6 @@ _imp_create_builtin(PyObject *module, PyObject *spec) return NULL; } def->m_base.m_init = p->initfunc; - if (modules == NULL) { - modules = PyImport_GetModuleDict(); - } if (_PyImport_FixupExtensionObject(mod, name, name, modules) < 0) { Py_DECREF(name); @@ -1329,6 +1393,7 @@ is_frozen_package(PyObject *name) int PyImport_ImportFrozenModuleObject(PyObject *name) { + PyThreadState *tstate = _PyThreadState_GET(); const struct _frozen *p; PyObject *co, *m, *d; int ispackage; @@ -1339,9 +1404,9 @@ PyImport_ImportFrozenModuleObject(PyObject *name) if (p == NULL) return 0; if (p->code == NULL) { - PyErr_Format(PyExc_ImportError, - "Excluded frozen object named %R", - name); + _PyErr_Format(tstate, PyExc_ImportError, + "Excluded frozen object named %R", + name); return -1; } size = p->size; @@ -1352,16 +1417,16 @@ PyImport_ImportFrozenModuleObject(PyObject *name) if (co == NULL) return -1; if (!PyCode_Check(co)) { - PyErr_Format(PyExc_TypeError, - "frozen object %R is not a code object", - name); + _PyErr_Format(tstate, PyExc_TypeError, + "frozen object %R is not a code object", + name); goto err_return; } if (ispackage) { /* Set __path__ to the empty list */ PyObject *l; int err; - m = PyImport_AddModuleObject(name); + m = import_add_module(tstate, name); if (m == NULL) goto err_return; d = PyModule_GetDict(m); @@ -1374,16 +1439,18 @@ PyImport_ImportFrozenModuleObject(PyObject *name) if (err != 0) goto err_return; } - d = module_dict_for_exec(name); + d = module_dict_for_exec(tstate, name); if (d == NULL) { goto err_return; } - m = exec_code_in_module(name, d, co); - if (m == NULL) + m = exec_code_in_module(tstate, name, d, co); + if (m == NULL) { goto err_return; + } Py_DECREF(co); Py_DECREF(m); return 1; + err_return: Py_DECREF(co); return -1; @@ -1420,6 +1487,7 @@ PyImport_ImportModule(const char *name) return result; } + /* Import a module without blocking * * At first it tries to fetch the module from sys.modules. If the module was @@ -1439,7 +1507,7 @@ PyImport_ImportModuleNoBlock(const char *name) /* Remove importlib frames from the traceback, * except in Verbose mode. */ static void -remove_importlib_frames(PyInterpreterState *interp) +remove_importlib_frames(PyThreadState *tstate) { const char *importlib_filename = ""; const char *external_filename = ""; @@ -1453,8 +1521,8 @@ remove_importlib_frames(PyInterpreterState *interp) from the traceback. We always trim chunks which end with a call to "_call_with_frames_removed". */ - PyErr_Fetch(&exception, &value, &base_tb); - if (!exception || interp->config.verbose) { + _PyErr_Fetch(tstate, &exception, &value, &base_tb); + if (!exception || _PyInterpreterState_GetConfig(tstate->interp)->verbose) { goto done; } @@ -1468,7 +1536,7 @@ remove_importlib_frames(PyInterpreterState *interp) PyTracebackObject *traceback = (PyTracebackObject *)tb; PyObject *next = (PyObject *) traceback->tb_next; PyFrameObject *frame = traceback->tb_frame; - PyCodeObject *code = frame->f_code; + PyCodeObject *code = PyFrame_GetCode(frame); int now_in_importlib; assert(PyTraceBack_Check(tb)); @@ -1490,19 +1558,18 @@ remove_importlib_frames(PyInterpreterState *interp) else { prev_link = (PyObject **) &traceback->tb_next; } + Py_DECREF(code); tb = next; } done: - PyErr_Restore(exception, value, base_tb); + _PyErr_Restore(tstate, exception, value, base_tb); } static PyObject * -resolve_name(PyObject *name, PyObject *globals, int level) +resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level) { - _Py_IDENTIFIER(__spec__); _Py_IDENTIFIER(__package__); - _Py_IDENTIFIER(__path__); _Py_IDENTIFIER(__name__); _Py_IDENTIFIER(parent); PyObject *abs_name; @@ -1513,29 +1580,30 @@ resolve_name(PyObject *name, PyObject *globals, int level) int level_up; if (globals == NULL) { - PyErr_SetString(PyExc_KeyError, "'__name__' not in globals"); + _PyErr_SetString(tstate, PyExc_KeyError, "'__name__' not in globals"); goto error; } if (!PyDict_Check(globals)) { - PyErr_SetString(PyExc_TypeError, "globals must be a dict"); + _PyErr_SetString(tstate, PyExc_TypeError, "globals must be a dict"); goto error; } package = _PyDict_GetItemIdWithError(globals, &PyId___package__); if (package == Py_None) { package = NULL; } - else if (package == NULL && PyErr_Occurred()) { + else if (package == NULL && _PyErr_Occurred(tstate)) { goto error; } spec = _PyDict_GetItemIdWithError(globals, &PyId___spec__); - if (spec == NULL && PyErr_Occurred()) { + if (spec == NULL && _PyErr_Occurred(tstate)) { goto error; } if (package != NULL) { Py_INCREF(package); if (!PyUnicode_Check(package)) { - PyErr_SetString(PyExc_TypeError, "package must be a string"); + _PyErr_SetString(tstate, PyExc_TypeError, + "package must be a string"); goto error; } else if (spec != NULL && spec != Py_None) { @@ -1564,8 +1632,8 @@ resolve_name(PyObject *name, PyObject *globals, int level) goto error; } else if (!PyUnicode_Check(package)) { - PyErr_SetString(PyExc_TypeError, - "__spec__.parent must be a string"); + _PyErr_SetString(tstate, PyExc_TypeError, + "__spec__.parent must be a string"); goto error; } } @@ -1578,22 +1646,24 @@ resolve_name(PyObject *name, PyObject *globals, int level) package = _PyDict_GetItemIdWithError(globals, &PyId___name__); if (package == NULL) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_KeyError, "'__name__' not in globals"); + if (!_PyErr_Occurred(tstate)) { + _PyErr_SetString(tstate, PyExc_KeyError, + "'__name__' not in globals"); } goto error; } Py_INCREF(package); if (!PyUnicode_Check(package)) { - PyErr_SetString(PyExc_TypeError, "__name__ must be a string"); + _PyErr_SetString(tstate, PyExc_TypeError, + "__name__ must be a string"); goto error; } if (_PyDict_GetItemIdWithError(globals, &PyId___path__) == NULL) { Py_ssize_t dot; - if (PyErr_Occurred() || PyUnicode_READY(package) < 0) { + if (_PyErr_Occurred(tstate) || PyUnicode_READY(package) < 0) { goto error; } @@ -1624,9 +1694,9 @@ resolve_name(PyObject *name, PyObject *globals, int level) goto error; } else if (last_dot == -1) { - PyErr_SetString(PyExc_ValueError, - "attempted relative import beyond top-level " - "package"); + _PyErr_SetString(tstate, PyExc_ImportError, + "attempted relative import beyond top-level " + "package"); goto error; } } @@ -1642,7 +1712,7 @@ resolve_name(PyObject *name, PyObject *globals, int level) return abs_name; no_parent_error: - PyErr_SetString(PyExc_ImportError, + _PyErr_SetString(tstate, PyExc_ImportError, "attempted relative import " "with no known parent package"); @@ -1652,12 +1722,12 @@ resolve_name(PyObject *name, PyObject *globals, int level) } static PyObject * -import_find_and_load(PyObject *abs_name) +import_find_and_load(PyThreadState *tstate, PyObject *abs_name) { _Py_IDENTIFIER(_find_and_load); PyObject *mod = NULL; - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - int import_time = interp->config.import_time; + PyInterpreterState *interp = tstate->interp; + int import_time = _PyInterpreterState_GetConfig(interp)->import_time; static int import_level; static _PyTime_t accumulated; @@ -1666,10 +1736,10 @@ import_find_and_load(PyObject *abs_name) 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) { + if (_PySys_Audit(tstate, "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; } @@ -1718,21 +1788,39 @@ import_find_and_load(PyObject *abs_name) return mod; } +PyObject * +PyImport_GetModule(PyObject *name) +{ + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *mod; + + mod = import_get_module(tstate, name); + if (mod != NULL && mod != Py_None) { + if (import_ensure_initialized(tstate, mod, name) < 0) { + Py_DECREF(mod); + remove_importlib_frames(tstate); + return NULL; + } + } + return mod; +} + PyObject * PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level) { + PyThreadState *tstate = _PyThreadState_GET(); _Py_IDENTIFIER(_handle_fromlist); PyObject *abs_name = NULL; PyObject *final_mod = NULL; PyObject *mod = NULL; PyObject *package = NULL; - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = tstate->interp; int has_from; if (name == NULL) { - PyErr_SetString(PyExc_ValueError, "Empty module name"); + _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name"); goto error; } @@ -1740,62 +1828,45 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, for added performance. */ if (!PyUnicode_Check(name)) { - PyErr_SetString(PyExc_TypeError, "module name must be a string"); + _PyErr_SetString(tstate, PyExc_TypeError, + "module name must be a string"); goto error; } if (PyUnicode_READY(name) < 0) { goto error; } if (level < 0) { - PyErr_SetString(PyExc_ValueError, "level must be >= 0"); + _PyErr_SetString(tstate, PyExc_ValueError, "level must be >= 0"); goto error; } if (level > 0) { - abs_name = resolve_name(name, globals, level); + abs_name = resolve_name(tstate, name, globals, level); if (abs_name == NULL) goto error; } else { /* level == 0 */ if (PyUnicode_GET_LENGTH(name) == 0) { - PyErr_SetString(PyExc_ValueError, "Empty module name"); + _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name"); goto error; } abs_name = name; Py_INCREF(abs_name); } - mod = PyImport_GetModule(abs_name); - if (mod == NULL && PyErr_Occurred()) { + mod = import_get_module(tstate, abs_name); + if (mod == NULL && _PyErr_Occurred(tstate)) { goto error; } if (mod != NULL && mod != Py_None) { - _Py_IDENTIFIER(__spec__); - _Py_IDENTIFIER(_lock_unlock_module); - PyObject *spec; - - /* Optimization: only call _bootstrap._lock_unlock_module() if - __spec__._initializing is true. - NOTE: because of this, initializing must be set *before* - stuffing the new module in sys.modules. - */ - spec = _PyObject_GetAttrId(mod, &PyId___spec__); - if (_PyModuleSpec_IsInitializing(spec)) { - PyObject *value = _PyObject_CallMethodIdObjArgs(interp->importlib, - &PyId__lock_unlock_module, abs_name, - NULL); - if (value == NULL) { - Py_DECREF(spec); - goto error; - } - Py_DECREF(value); + if (import_ensure_initialized(tstate, mod, name) < 0) { + goto error; } - Py_XDECREF(spec); } else { Py_XDECREF(mod); - mod = import_find_and_load(abs_name); + mod = import_find_and_load(tstate, abs_name); if (mod == NULL) { goto error; } @@ -1842,13 +1913,13 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, goto error; } - final_mod = PyImport_GetModule(to_return); + final_mod = import_get_module(tstate, to_return); Py_DECREF(to_return); if (final_mod == NULL) { - if (!PyErr_Occurred()) { - PyErr_Format(PyExc_KeyError, - "%R not in sys.modules as expected", - to_return); + if (!_PyErr_Occurred(tstate)) { + _PyErr_Format(tstate, PyExc_KeyError, + "%R not in sys.modules as expected", + to_return); } goto error; } @@ -1860,7 +1931,6 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, } } else { - _Py_IDENTIFIER(__path__); PyObject *path; if (_PyObject_LookupAttrId(mod, &PyId___path__, &path) < 0) { goto error; @@ -1882,7 +1952,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, Py_XDECREF(mod); Py_XDECREF(package); if (final_mod == NULL) { - remove_importlib_frames(interp); + remove_importlib_frames(tstate); } return final_mod; } @@ -1923,7 +1993,7 @@ PyImport_ReloadModule(PyObject *m) } } - reloaded_module = _PyObject_CallMethodIdObjArgs(importlib, &PyId_reload, m, NULL); + reloaded_module = _PyObject_CallMethodIdOneArg(importlib, &PyId_reload, m); Py_DECREF(importlib); return reloaded_module; } @@ -1941,6 +2011,7 @@ PyImport_ReloadModule(PyObject *m) PyObject * PyImport_Import(PyObject *module_name) { + PyThreadState *tstate = _PyThreadState_GET(); static PyObject *silly_list = NULL; static PyObject *builtins_str = NULL; static PyObject *import_str = NULL; @@ -1984,8 +2055,9 @@ PyImport_Import(PyObject *module_name) /* Get the __import__ function from the builtins */ if (PyDict_Check(builtins)) { import = PyObject_GetItem(builtins, import_str); - if (import == NULL) - PyErr_SetObject(PyExc_KeyError, import_str); + if (import == NULL) { + _PyErr_SetObject(tstate, PyExc_KeyError, import_str); + } } else import = PyObject_GetAttr(builtins, import_str); @@ -2001,9 +2073,9 @@ PyImport_Import(PyObject *module_name) goto err; Py_DECREF(r); - r = PyImport_GetModule(module_name); - if (r == NULL && !PyErr_Occurred()) { - PyErr_SetObject(PyExc_KeyError, module_name); + r = import_get_module(tstate, module_name); + if (r == NULL && !_PyErr_Occurred(tstate)) { + _PyErr_SetObject(tstate, PyExc_KeyError, module_name); } err: @@ -2064,6 +2136,7 @@ static PyObject * _imp_init_frozen_impl(PyObject *module, PyObject *name) /*[clinic end generated code: output=fc0511ed869fd69c input=13019adfc04f3fb3]*/ { + PyThreadState *tstate = _PyThreadState_GET(); int ret; PyObject *m; @@ -2073,7 +2146,7 @@ _imp_init_frozen_impl(PyObject *module, PyObject *name) if (ret == 0) { Py_RETURN_NONE; } - m = PyImport_AddModuleObject(name); + m = import_add_module(tstate, name); Py_XINCREF(m); return m; } @@ -2340,7 +2413,7 @@ PyInit__imp(void) goto failure; } - const wchar_t *mode = _PyInterpreterState_Get()->config.check_hash_pycs_mode; + const wchar_t *mode = _Py_GetConfig()->check_hash_pycs_mode; PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1); if (pyc_mode == NULL) { goto failure; diff --git a/Python/importdl.c b/Python/importdl.c index 1d0d32a2..fbeb9fb7 100644 --- a/Python/importdl.c +++ b/Python/importdl.c @@ -181,7 +181,7 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp) m = NULL; goto error; } - if (Py_TYPE(m) == NULL) { + if (Py_IS_TYPE(m, NULL)) { /* This can happen when a PyModuleDef is returned without calling * PyModuleDef_Init on it */ diff --git a/Python/importlib.h b/Python/importlib.h index 67195747..1fb877a7 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -118,894 +118,903 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 58,0,0,0,115,12,0,0,0,0,1,10,1,10,1,6, 1,6,1,6,1,122,20,95,77,111,100,117,108,101,76,111, 99,107,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,60,0,0,0,116,0,160,1,161,0,125, - 1,124,0,106,2,125,2,116,3,160,4,124,2,161,1,125, - 3,124,3,100,0,107,8,114,36,100,1,83,0,124,3,106, - 2,125,2,124,2,124,1,107,2,114,14,100,2,83,0,113, - 14,100,0,83,0,41,3,78,70,84,41,5,114,23,0,0, - 0,218,9,103,101,116,95,105,100,101,110,116,114,26,0,0, - 0,218,12,95,98,108,111,99,107,105,110,103,95,111,110,218, - 3,103,101,116,41,4,114,30,0,0,0,90,2,109,101,218, - 3,116,105,100,114,24,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,12,104,97,115,95,100,101, - 97,100,108,111,99,107,66,0,0,0,115,16,0,0,0,0, - 2,8,1,6,2,10,1,8,1,4,1,6,1,8,1,122, - 24,95,77,111,100,117,108,101,76,111,99,107,46,104,97,115, - 95,100,101,97,100,108,111,99,107,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,9,0,0,0,67,0, - 0,0,115,178,0,0,0,116,0,160,1,161,0,125,1,124, - 0,116,2,124,1,60,0,122,148,124,0,106,3,143,110,1, - 0,124,0,106,4,100,1,107,2,115,46,124,0,106,5,124, - 1,107,2,114,84,124,1,124,0,95,5,124,0,4,0,106, - 4,100,2,55,0,2,0,95,4,87,0,53,0,81,0,82, - 0,163,0,87,0,162,86,100,3,83,0,124,0,160,6,161, - 0,114,104,116,7,100,4,124,0,22,0,131,1,130,1,124, - 0,106,8,160,9,100,5,161,1,114,130,124,0,4,0,106, - 10,100,2,55,0,2,0,95,10,87,0,53,0,81,0,82, - 0,88,0,124,0,106,8,160,9,161,0,1,0,124,0,106, - 8,160,11,161,0,1,0,113,18,87,0,53,0,116,2,124, - 1,61,0,88,0,100,6,83,0,41,7,122,185,10,32,32, - 32,32,32,32,32,32,65,99,113,117,105,114,101,32,116,104, - 101,32,109,111,100,117,108,101,32,108,111,99,107,46,32,32, - 73,102,32,97,32,112,111,116,101,110,116,105,97,108,32,100, - 101,97,100,108,111,99,107,32,105,115,32,100,101,116,101,99, - 116,101,100,44,10,32,32,32,32,32,32,32,32,97,32,95, - 68,101,97,100,108,111,99,107,69,114,114,111,114,32,105,115, - 32,114,97,105,115,101,100,46,10,32,32,32,32,32,32,32, - 32,79,116,104,101,114,119,105,115,101,44,32,116,104,101,32, - 108,111,99,107,32,105,115,32,97,108,119,97,121,115,32,97, - 99,113,117,105,114,101,100,32,97,110,100,32,84,114,117,101, - 32,105,115,32,114,101,116,117,114,110,101,100,46,10,32,32, - 32,32,32,32,32,32,114,22,0,0,0,233,1,0,0,0, - 84,122,23,100,101,97,100,108,111,99,107,32,100,101,116,101, - 99,116,101,100,32,98,121,32,37,114,70,78,41,12,114,23, - 0,0,0,114,32,0,0,0,114,33,0,0,0,114,24,0, - 0,0,114,27,0,0,0,114,26,0,0,0,114,36,0,0, - 0,114,19,0,0,0,114,25,0,0,0,218,7,97,99,113, - 117,105,114,101,114,28,0,0,0,218,7,114,101,108,101,97, - 115,101,169,2,114,30,0,0,0,114,35,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,38,0, - 0,0,78,0,0,0,115,30,0,0,0,0,6,8,1,8, - 1,2,2,8,1,20,1,6,1,14,1,18,1,8,1,12, - 1,12,1,24,2,10,1,16,2,122,19,95,77,111,100,117, - 108,101,76,111,99,107,46,97,99,113,117,105,114,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,9, - 0,0,0,67,0,0,0,115,122,0,0,0,116,0,160,1, - 161,0,125,1,124,0,106,2,143,98,1,0,124,0,106,3, - 124,1,107,3,114,34,116,4,100,1,131,1,130,1,124,0, - 106,5,100,2,107,4,115,48,116,6,130,1,124,0,4,0, - 106,5,100,3,56,0,2,0,95,5,124,0,106,5,100,2, - 107,2,114,108,100,0,124,0,95,3,124,0,106,7,114,108, - 124,0,4,0,106,7,100,3,56,0,2,0,95,7,124,0, - 106,8,160,9,161,0,1,0,87,0,53,0,81,0,82,0, - 88,0,100,0,83,0,41,4,78,250,31,99,97,110,110,111, - 116,32,114,101,108,101,97,115,101,32,117,110,45,97,99,113, - 117,105,114,101,100,32,108,111,99,107,114,22,0,0,0,114, - 37,0,0,0,41,10,114,23,0,0,0,114,32,0,0,0, - 114,24,0,0,0,114,26,0,0,0,218,12,82,117,110,116, - 105,109,101,69,114,114,111,114,114,27,0,0,0,218,14,65, - 115,115,101,114,116,105,111,110,69,114,114,111,114,114,28,0, - 0,0,114,25,0,0,0,114,39,0,0,0,114,40,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,39,0,0,0,103,0,0,0,115,22,0,0,0,0,1, - 8,1,8,1,10,1,8,1,14,1,14,1,10,1,6,1, - 6,1,14,1,122,19,95,77,111,100,117,108,101,76,111,99, - 107,46,114,101,108,101,97,115,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,18,0,0,0,100,1,160,0,124,0,106,1,116, - 2,124,0,131,1,161,2,83,0,41,2,78,122,23,95,77, - 111,100,117,108,101,76,111,99,107,40,123,33,114,125,41,32, - 97,116,32,123,125,169,3,218,6,102,111,114,109,97,116,114, - 17,0,0,0,218,2,105,100,169,1,114,30,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, - 95,95,114,101,112,114,95,95,116,0,0,0,115,2,0,0, - 0,0,1,122,20,95,77,111,100,117,108,101,76,111,99,107, - 46,95,95,114,101,112,114,95,95,78,41,9,114,1,0,0, - 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, - 114,31,0,0,0,114,36,0,0,0,114,38,0,0,0,114, - 39,0,0,0,114,48,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,20,0, - 0,0,52,0,0,0,115,12,0,0,0,8,1,4,5,8, - 8,8,12,8,25,8,13,114,20,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,48,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,83,0,41,11,218,16,95,68, - 117,109,109,121,77,111,100,117,108,101,76,111,99,107,122,86, - 65,32,115,105,109,112,108,101,32,95,77,111,100,117,108,101, - 76,111,99,107,32,101,113,117,105,118,97,108,101,110,116,32, - 102,111,114,32,80,121,116,104,111,110,32,98,117,105,108,100, - 115,32,119,105,116,104,111,117,116,10,32,32,32,32,109,117, - 108,116,105,45,116,104,114,101,97,100,105,110,103,32,115,117, - 112,112,111,114,116,46,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, - 16,0,0,0,124,1,124,0,95,0,100,1,124,0,95,1, - 100,0,83,0,114,21,0,0,0,41,2,114,17,0,0,0, - 114,27,0,0,0,114,29,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,31,0,0,0,124,0, - 0,0,115,4,0,0,0,0,1,6,1,122,25,95,68,117, - 109,109,121,77,111,100,117,108,101,76,111,99,107,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,3,0,0,0,67,0,0,0,115, - 18,0,0,0,124,0,4,0,106,0,100,1,55,0,2,0, - 95,0,100,2,83,0,41,3,78,114,37,0,0,0,84,41, - 1,114,27,0,0,0,114,47,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,38,0,0,0,128, - 0,0,0,115,4,0,0,0,0,1,14,1,122,24,95,68, - 117,109,109,121,77,111,100,117,108,101,76,111,99,107,46,97, + 0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0, + 67,0,0,0,115,88,0,0,0,116,0,160,1,161,0,125, + 1,124,0,106,2,125,2,116,3,131,0,125,3,116,4,160, + 5,124,2,161,1,125,4,124,4,100,0,117,0,114,42,100, + 1,83,0,124,4,106,2,125,2,124,2,124,1,107,2,114, + 60,100,2,83,0,124,2,124,3,118,0,114,72,100,1,83, + 0,124,3,160,6,124,2,161,1,1,0,113,20,100,0,83, + 0,41,3,78,70,84,41,7,114,23,0,0,0,218,9,103, + 101,116,95,105,100,101,110,116,114,26,0,0,0,218,3,115, + 101,116,218,12,95,98,108,111,99,107,105,110,103,95,111,110, + 218,3,103,101,116,218,3,97,100,100,41,5,114,30,0,0, + 0,90,2,109,101,218,3,116,105,100,90,4,115,101,101,110, + 114,24,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,12,104,97,115,95,100,101,97,100,108,111, + 99,107,66,0,0,0,115,24,0,0,0,0,2,8,1,6, + 1,6,2,10,1,8,1,4,1,6,1,8,1,4,1,8, + 6,4,1,122,24,95,77,111,100,117,108,101,76,111,99,107, + 46,104,97,115,95,100,101,97,100,108,111,99,107,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0, + 0,0,67,0,0,0,115,210,0,0,0,116,0,160,1,161, + 0,125,1,124,0,116,2,124,1,60,0,122,180,124,0,106, + 3,143,126,1,0,124,0,106,4,100,1,107,2,115,46,124, + 0,106,5,124,1,107,2,114,90,124,1,124,0,95,5,124, + 0,4,0,106,4,100,2,55,0,2,0,95,4,87,0,100, + 3,4,0,4,0,131,3,1,0,87,0,116,2,124,1,61, + 0,100,4,83,0,124,0,160,6,161,0,114,110,116,7,100, + 5,124,0,22,0,131,1,130,1,124,0,106,8,160,9,100, + 6,161,1,114,136,124,0,4,0,106,10,100,2,55,0,2, + 0,95,10,87,0,100,3,4,0,4,0,131,3,1,0,110, + 16,49,0,115,156,48,0,1,0,1,0,1,0,89,0,1, + 0,124,0,106,8,160,9,161,0,1,0,124,0,106,8,160, + 11,161,0,1,0,113,18,87,0,116,2,124,1,61,0,110, + 8,116,2,124,1,61,0,48,0,100,3,83,0,41,7,122, + 185,10,32,32,32,32,32,32,32,32,65,99,113,117,105,114, + 101,32,116,104,101,32,109,111,100,117,108,101,32,108,111,99, + 107,46,32,32,73,102,32,97,32,112,111,116,101,110,116,105, + 97,108,32,100,101,97,100,108,111,99,107,32,105,115,32,100, + 101,116,101,99,116,101,100,44,10,32,32,32,32,32,32,32, + 32,97,32,95,68,101,97,100,108,111,99,107,69,114,114,111, + 114,32,105,115,32,114,97,105,115,101,100,46,10,32,32,32, + 32,32,32,32,32,79,116,104,101,114,119,105,115,101,44,32, + 116,104,101,32,108,111,99,107,32,105,115,32,97,108,119,97, + 121,115,32,97,99,113,117,105,114,101,100,32,97,110,100,32, + 84,114,117,101,32,105,115,32,114,101,116,117,114,110,101,100, + 46,10,32,32,32,32,32,32,32,32,114,22,0,0,0,233, + 1,0,0,0,78,84,122,23,100,101,97,100,108,111,99,107, + 32,100,101,116,101,99,116,101,100,32,98,121,32,37,114,70, + 41,12,114,23,0,0,0,114,32,0,0,0,114,34,0,0, + 0,114,24,0,0,0,114,27,0,0,0,114,26,0,0,0, + 114,38,0,0,0,114,19,0,0,0,114,25,0,0,0,218, + 7,97,99,113,117,105,114,101,114,28,0,0,0,218,7,114, + 101,108,101,97,115,101,169,2,114,30,0,0,0,114,37,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,40,0,0,0,87,0,0,0,115,34,0,0,0,0, + 6,8,1,8,1,2,2,8,1,20,1,6,1,14,1,14, + 9,6,247,4,1,8,1,12,1,12,1,44,2,10,1,14, + 2,122,19,95,77,111,100,117,108,101,76,111,99,107,46,97, 99,113,117,105,114,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, - 36,0,0,0,124,0,106,0,100,1,107,2,114,18,116,1, - 100,2,131,1,130,1,124,0,4,0,106,0,100,3,56,0, - 2,0,95,0,100,0,83,0,41,4,78,114,22,0,0,0, - 114,41,0,0,0,114,37,0,0,0,41,2,114,27,0,0, - 0,114,42,0,0,0,114,47,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,39,0,0,0,132, - 0,0,0,115,6,0,0,0,0,1,10,1,8,1,122,24, + 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, + 142,0,0,0,116,0,160,1,161,0,125,1,124,0,106,2, + 143,108,1,0,124,0,106,3,124,1,107,3,114,34,116,4, + 100,1,131,1,130,1,124,0,106,5,100,2,107,4,115,48, + 74,0,130,1,124,0,4,0,106,5,100,3,56,0,2,0, + 95,5,124,0,106,5,100,2,107,2,114,108,100,0,124,0, + 95,3,124,0,106,6,114,108,124,0,4,0,106,6,100,3, + 56,0,2,0,95,6,124,0,106,7,160,8,161,0,1,0, + 87,0,100,0,4,0,4,0,131,3,1,0,110,16,49,0, + 115,128,48,0,1,0,1,0,1,0,89,0,1,0,100,0, + 83,0,41,4,78,250,31,99,97,110,110,111,116,32,114,101, + 108,101,97,115,101,32,117,110,45,97,99,113,117,105,114,101, + 100,32,108,111,99,107,114,22,0,0,0,114,39,0,0,0, + 41,9,114,23,0,0,0,114,32,0,0,0,114,24,0,0, + 0,114,26,0,0,0,218,12,82,117,110,116,105,109,101,69, + 114,114,111,114,114,27,0,0,0,114,28,0,0,0,114,25, + 0,0,0,114,41,0,0,0,114,42,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,41,0,0, + 0,112,0,0,0,115,22,0,0,0,0,1,8,1,8,1, + 10,1,8,1,14,1,14,1,10,1,6,1,6,1,14,1, + 122,19,95,77,111,100,117,108,101,76,111,99,107,46,114,101, + 108,101,97,115,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,18, + 0,0,0,100,1,160,0,124,0,106,1,116,2,124,0,131, + 1,161,2,83,0,41,2,78,122,23,95,77,111,100,117,108, + 101,76,111,99,107,40,123,33,114,125,41,32,97,116,32,123, + 125,169,3,218,6,102,111,114,109,97,116,114,17,0,0,0, + 218,2,105,100,169,1,114,30,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,8,95,95,114,101, + 112,114,95,95,125,0,0,0,115,2,0,0,0,0,1,122, + 20,95,77,111,100,117,108,101,76,111,99,107,46,95,95,114, + 101,112,114,95,95,78,41,9,114,1,0,0,0,114,0,0, + 0,0,114,2,0,0,0,114,3,0,0,0,114,31,0,0, + 0,114,38,0,0,0,114,40,0,0,0,114,41,0,0,0, + 114,49,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,20,0,0,0,52,0, + 0,0,115,12,0,0,0,8,1,4,5,8,8,8,21,8, + 25,8,13,114,20,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,48,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,83,0,41,11,218,16,95,68,117,109,109,121, + 77,111,100,117,108,101,76,111,99,107,122,86,65,32,115,105, + 109,112,108,101,32,95,77,111,100,117,108,101,76,111,99,107, + 32,101,113,117,105,118,97,108,101,110,116,32,102,111,114,32, + 80,121,116,104,111,110,32,98,117,105,108,100,115,32,119,105, + 116,104,111,117,116,10,32,32,32,32,109,117,108,116,105,45, + 116,104,114,101,97,100,105,110,103,32,115,117,112,112,111,114, + 116,46,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,16,0,0,0, + 124,1,124,0,95,0,100,1,124,0,95,1,100,0,83,0, + 114,21,0,0,0,41,2,114,17,0,0,0,114,27,0,0, + 0,114,29,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,31,0,0,0,133,0,0,0,115,4, + 0,0,0,0,1,6,1,122,25,95,68,117,109,109,121,77, + 111,100,117,108,101,76,111,99,107,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,3,0,0,0,67,0,0,0,115,18,0,0,0, + 124,0,4,0,106,0,100,1,55,0,2,0,95,0,100,2, + 83,0,41,3,78,114,39,0,0,0,84,41,1,114,27,0, + 0,0,114,48,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,40,0,0,0,137,0,0,0,115, + 4,0,0,0,0,1,14,1,122,24,95,68,117,109,109,121, + 77,111,100,117,108,101,76,111,99,107,46,97,99,113,117,105, + 114,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,36,0,0,0, + 124,0,106,0,100,1,107,2,114,18,116,1,100,2,131,1, + 130,1,124,0,4,0,106,0,100,3,56,0,2,0,95,0, + 100,0,83,0,41,4,78,114,22,0,0,0,114,43,0,0, + 0,114,39,0,0,0,41,2,114,27,0,0,0,114,44,0, + 0,0,114,48,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,41,0,0,0,141,0,0,0,115, + 6,0,0,0,0,1,10,1,8,1,122,24,95,68,117,109, + 109,121,77,111,100,117,108,101,76,111,99,107,46,114,101,108, + 101,97,115,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,18,0, + 0,0,100,1,160,0,124,0,106,1,116,2,124,0,131,1, + 161,2,83,0,41,2,78,122,28,95,68,117,109,109,121,77, + 111,100,117,108,101,76,111,99,107,40,123,33,114,125,41,32, + 97,116,32,123,125,114,45,0,0,0,114,48,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,49, + 0,0,0,146,0,0,0,115,2,0,0,0,0,1,122,25, 95,68,117,109,109,121,77,111,100,117,108,101,76,111,99,107, - 46,114,101,108,101,97,115,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,18,0,0,0,100,1,160,0,124,0,106,1,116,2, - 124,0,131,1,161,2,83,0,41,2,78,122,28,95,68,117, - 109,109,121,77,111,100,117,108,101,76,111,99,107,40,123,33, - 114,125,41,32,97,116,32,123,125,114,44,0,0,0,114,47, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,48,0,0,0,137,0,0,0,115,2,0,0,0, - 0,1,122,25,95,68,117,109,109,121,77,111,100,117,108,101, - 76,111,99,107,46,95,95,114,101,112,114,95,95,78,41,8, - 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, - 3,0,0,0,114,31,0,0,0,114,38,0,0,0,114,39, + 46,95,95,114,101,112,114,95,95,78,41,8,114,1,0,0, + 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, + 114,31,0,0,0,114,40,0,0,0,114,41,0,0,0,114, + 49,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,50,0,0,0,129,0,0, + 0,115,10,0,0,0,8,1,4,3,8,4,8,4,8,5, + 114,50,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,36, + 0,0,0,101,0,90,1,100,0,90,2,100,1,100,2,132, + 0,90,3,100,3,100,4,132,0,90,4,100,5,100,6,132, + 0,90,5,100,7,83,0,41,8,218,18,95,77,111,100,117, + 108,101,76,111,99,107,77,97,110,97,103,101,114,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,16,0,0,0,124,1,124,0,95, + 0,100,0,124,0,95,1,100,0,83,0,114,13,0,0,0, + 41,2,218,5,95,110,97,109,101,218,5,95,108,111,99,107, + 114,29,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,31,0,0,0,152,0,0,0,115,4,0, + 0,0,0,1,6,1,122,27,95,77,111,100,117,108,101,76, + 111,99,107,77,97,110,97,103,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,26,0,0, + 0,116,0,124,0,106,1,131,1,124,0,95,2,124,0,106, + 2,160,3,161,0,1,0,100,0,83,0,114,13,0,0,0, + 41,4,218,16,95,103,101,116,95,109,111,100,117,108,101,95, + 108,111,99,107,114,52,0,0,0,114,53,0,0,0,114,40, 0,0,0,114,48,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,49,0,0, - 0,120,0,0,0,115,10,0,0,0,8,1,4,3,8,4, - 8,4,8,5,114,49,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,36,0,0,0,101,0,90,1,100,0,90,2,100, - 1,100,2,132,0,90,3,100,3,100,4,132,0,90,4,100, - 5,100,6,132,0,90,5,100,7,83,0,41,8,218,18,95, - 77,111,100,117,108,101,76,111,99,107,77,97,110,97,103,101, - 114,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,16,0,0,0,124, - 1,124,0,95,0,100,0,124,0,95,1,100,0,83,0,114, - 13,0,0,0,41,2,218,5,95,110,97,109,101,218,5,95, - 108,111,99,107,114,29,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,31,0,0,0,143,0,0, - 0,115,4,0,0,0,0,1,6,1,122,27,95,77,111,100, - 117,108,101,76,111,99,107,77,97,110,97,103,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,26,0,0,0,116,0,124,0,106,1,131,1,124,0,95, - 2,124,0,106,2,160,3,161,0,1,0,100,0,83,0,114, - 13,0,0,0,41,4,218,16,95,103,101,116,95,109,111,100, - 117,108,101,95,108,111,99,107,114,51,0,0,0,114,52,0, - 0,0,114,38,0,0,0,114,47,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,9,95,95,101, - 110,116,101,114,95,95,147,0,0,0,115,4,0,0,0,0, - 1,12,1,122,28,95,77,111,100,117,108,101,76,111,99,107, - 77,97,110,97,103,101,114,46,95,95,101,110,116,101,114,95, - 95,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,2,0,0,0,79,0,0,0,115,14,0,0,0,124, - 0,106,0,160,1,161,0,1,0,100,0,83,0,114,13,0, - 0,0,41,2,114,52,0,0,0,114,39,0,0,0,41,3, - 114,30,0,0,0,218,4,97,114,103,115,90,6,107,119,97, - 114,103,115,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,8,95,95,101,120,105,116,95,95,151,0,0,0, - 115,2,0,0,0,0,1,122,27,95,77,111,100,117,108,101, - 76,111,99,107,77,97,110,97,103,101,114,46,95,95,101,120, - 105,116,95,95,78,41,6,114,1,0,0,0,114,0,0,0, - 0,114,2,0,0,0,114,31,0,0,0,114,54,0,0,0, - 114,56,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,50,0,0,0,141,0, - 0,0,115,6,0,0,0,8,2,8,4,8,4,114,50,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,8,0,0,0,67,0,0,0,115,130,0,0,0, - 116,0,160,1,161,0,1,0,122,106,122,14,116,3,124,0, - 25,0,131,0,125,1,87,0,110,24,4,0,116,4,107,10, - 114,48,1,0,1,0,1,0,100,1,125,1,89,0,110,2, - 88,0,124,1,100,1,107,8,114,112,116,5,100,1,107,8, - 114,76,116,6,124,0,131,1,125,1,110,8,116,7,124,0, - 131,1,125,1,124,0,102,1,100,2,100,3,132,1,125,2, - 116,8,160,9,124,1,124,2,161,2,116,3,124,0,60,0, - 87,0,53,0,116,0,160,2,161,0,1,0,88,0,124,1, - 83,0,41,4,122,139,71,101,116,32,111,114,32,99,114,101, - 97,116,101,32,116,104,101,32,109,111,100,117,108,101,32,108, - 111,99,107,32,102,111,114,32,97,32,103,105,118,101,110,32, - 109,111,100,117,108,101,32,110,97,109,101,46,10,10,32,32, - 32,32,65,99,113,117,105,114,101,47,114,101,108,101,97,115, - 101,32,105,110,116,101,114,110,97,108,108,121,32,116,104,101, - 32,103,108,111,98,97,108,32,105,109,112,111,114,116,32,108, - 111,99,107,32,116,111,32,112,114,111,116,101,99,116,10,32, - 32,32,32,95,109,111,100,117,108,101,95,108,111,99,107,115, - 46,78,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,83,0,0,0,115,48,0,0,0, - 116,0,160,1,161,0,1,0,122,24,116,3,160,4,124,1, - 161,1,124,0,107,8,114,30,116,3,124,1,61,0,87,0, - 53,0,116,0,160,2,161,0,1,0,88,0,100,0,83,0, - 114,13,0,0,0,41,5,218,4,95,105,109,112,218,12,97, - 99,113,117,105,114,101,95,108,111,99,107,218,12,114,101,108, - 101,97,115,101,95,108,111,99,107,218,13,95,109,111,100,117, - 108,101,95,108,111,99,107,115,114,34,0,0,0,41,2,218, - 3,114,101,102,114,17,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,2,99,98,176,0,0,0, - 115,10,0,0,0,0,1,8,1,2,4,14,1,10,2,122, - 28,95,103,101,116,95,109,111,100,117,108,101,95,108,111,99, - 107,46,60,108,111,99,97,108,115,62,46,99,98,41,10,114, - 57,0,0,0,114,58,0,0,0,114,59,0,0,0,114,60, - 0,0,0,218,8,75,101,121,69,114,114,111,114,114,23,0, - 0,0,114,49,0,0,0,114,20,0,0,0,218,8,95,119, - 101,97,107,114,101,102,114,61,0,0,0,41,3,114,17,0, - 0,0,114,24,0,0,0,114,62,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,53,0,0,0, - 157,0,0,0,115,28,0,0,0,0,6,8,1,2,1,2, - 1,14,1,14,1,10,2,8,1,8,1,10,2,8,2,12, - 11,20,2,10,2,114,53,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,67, - 0,0,0,115,54,0,0,0,116,0,124,0,131,1,125,1, - 122,12,124,1,160,1,161,0,1,0,87,0,110,20,4,0, - 116,2,107,10,114,40,1,0,1,0,1,0,89,0,110,10, - 88,0,124,1,160,3,161,0,1,0,100,1,83,0,41,2, - 122,189,65,99,113,117,105,114,101,115,32,116,104,101,110,32, - 114,101,108,101,97,115,101,115,32,116,104,101,32,109,111,100, - 117,108,101,32,108,111,99,107,32,102,111,114,32,97,32,103, - 105,118,101,110,32,109,111,100,117,108,101,32,110,97,109,101, - 46,10,10,32,32,32,32,84,104,105,115,32,105,115,32,117, - 115,101,100,32,116,111,32,101,110,115,117,114,101,32,97,32, - 109,111,100,117,108,101,32,105,115,32,99,111,109,112,108,101, - 116,101,108,121,32,105,110,105,116,105,97,108,105,122,101,100, - 44,32,105,110,32,116,104,101,10,32,32,32,32,101,118,101, - 110,116,32,105,116,32,105,115,32,98,101,105,110,103,32,105, - 109,112,111,114,116,101,100,32,98,121,32,97,110,111,116,104, - 101,114,32,116,104,114,101,97,100,46,10,32,32,32,32,78, - 41,4,114,53,0,0,0,114,38,0,0,0,114,19,0,0, - 0,114,39,0,0,0,41,2,114,17,0,0,0,114,24,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,19,95,108,111,99,107,95,117,110,108,111,99,107,95, - 109,111,100,117,108,101,194,0,0,0,115,12,0,0,0,0, - 6,8,1,2,1,12,1,14,3,6,2,114,65,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,79,0,0,0,115,10,0,0,0,124,0, - 124,1,124,2,142,1,83,0,41,1,97,46,1,0,0,114, - 101,109,111,118,101,95,105,109,112,111,114,116,108,105,98,95, - 102,114,97,109,101,115,32,105,110,32,105,109,112,111,114,116, - 46,99,32,119,105,108,108,32,97,108,119,97,121,115,32,114, - 101,109,111,118,101,32,115,101,113,117,101,110,99,101,115,10, - 32,32,32,32,111,102,32,105,109,112,111,114,116,108,105,98, - 32,102,114,97,109,101,115,32,116,104,97,116,32,101,110,100, - 32,119,105,116,104,32,97,32,99,97,108,108,32,116,111,32, - 116,104,105,115,32,102,117,110,99,116,105,111,110,10,10,32, - 32,32,32,85,115,101,32,105,116,32,105,110,115,116,101,97, - 100,32,111,102,32,97,32,110,111,114,109,97,108,32,99,97, - 108,108,32,105,110,32,112,108,97,99,101,115,32,119,104,101, - 114,101,32,105,110,99,108,117,100,105,110,103,32,116,104,101, - 32,105,109,112,111,114,116,108,105,98,10,32,32,32,32,102, - 114,97,109,101,115,32,105,110,116,114,111,100,117,99,101,115, - 32,117,110,119,97,110,116,101,100,32,110,111,105,115,101,32, - 105,110,116,111,32,116,104,101,32,116,114,97,99,101,98,97, - 99,107,32,40,101,46,103,46,32,119,104,101,110,32,101,120, - 101,99,117,116,105,110,103,10,32,32,32,32,109,111,100,117, - 108,101,32,99,111,100,101,41,10,32,32,32,32,114,10,0, - 0,0,41,3,218,1,102,114,55,0,0,0,90,4,107,119, - 100,115,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,25,95,99,97,108,108,95,119,105,116,104,95,102,114, - 97,109,101,115,95,114,101,109,111,118,101,100,211,0,0,0, - 115,2,0,0,0,0,8,114,67,0,0,0,114,37,0,0, - 0,41,1,218,9,118,101,114,98,111,115,105,116,121,99,1, - 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,4, - 0,0,0,71,0,0,0,115,54,0,0,0,116,0,106,1, - 106,2,124,1,107,5,114,50,124,0,160,3,100,1,161,1, - 115,30,100,2,124,0,23,0,125,0,116,4,124,0,106,5, - 124,2,142,0,116,0,106,6,100,3,141,2,1,0,100,4, - 83,0,41,5,122,61,80,114,105,110,116,32,116,104,101,32, - 109,101,115,115,97,103,101,32,116,111,32,115,116,100,101,114, - 114,32,105,102,32,45,118,47,80,89,84,72,79,78,86,69, - 82,66,79,83,69,32,105,115,32,116,117,114,110,101,100,32, - 111,110,46,41,2,250,1,35,122,7,105,109,112,111,114,116, - 32,122,2,35,32,41,1,90,4,102,105,108,101,78,41,7, - 114,15,0,0,0,218,5,102,108,97,103,115,218,7,118,101, - 114,98,111,115,101,218,10,115,116,97,114,116,115,119,105,116, - 104,218,5,112,114,105,110,116,114,45,0,0,0,218,6,115, - 116,100,101,114,114,41,3,218,7,109,101,115,115,97,103,101, - 114,68,0,0,0,114,55,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,16,95,118,101,114,98, - 111,115,101,95,109,101,115,115,97,103,101,222,0,0,0,115, - 8,0,0,0,0,2,12,1,10,1,8,1,114,76,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,3,0,0,0,115,26,0,0,0,135, - 0,102,1,100,1,100,2,132,8,125,1,116,0,124,1,136, - 0,131,2,1,0,124,1,83,0,41,3,122,49,68,101,99, - 111,114,97,116,111,114,32,116,111,32,118,101,114,105,102,121, - 32,116,104,101,32,110,97,109,101,100,32,109,111,100,117,108, - 101,32,105,115,32,98,117,105,108,116,45,105,110,46,99,2, + 0,0,114,11,0,0,0,218,9,95,95,101,110,116,101,114, + 95,95,156,0,0,0,115,4,0,0,0,0,1,12,1,122, + 28,95,77,111,100,117,108,101,76,111,99,107,77,97,110,97, + 103,101,114,46,95,95,101,110,116,101,114,95,95,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0, + 0,0,79,0,0,0,115,14,0,0,0,124,0,106,0,160, + 1,161,0,1,0,100,0,83,0,114,13,0,0,0,41,2, + 114,53,0,0,0,114,41,0,0,0,41,3,114,30,0,0, + 0,218,4,97,114,103,115,90,6,107,119,97,114,103,115,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, + 95,95,101,120,105,116,95,95,160,0,0,0,115,2,0,0, + 0,0,1,122,27,95,77,111,100,117,108,101,76,111,99,107, + 77,97,110,97,103,101,114,46,95,95,101,120,105,116,95,95, + 78,41,6,114,1,0,0,0,114,0,0,0,0,114,2,0, + 0,0,114,31,0,0,0,114,55,0,0,0,114,57,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,51,0,0,0,150,0,0,0,115,6, + 0,0,0,8,2,8,4,8,4,114,51,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8, + 0,0,0,67,0,0,0,115,136,0,0,0,116,0,160,1, + 161,0,1,0,122,112,122,14,116,2,124,0,25,0,131,0, + 125,1,87,0,110,22,4,0,116,3,121,46,1,0,1,0, + 1,0,100,1,125,1,89,0,110,2,48,0,124,1,100,1, + 117,0,114,110,116,4,100,1,117,0,114,74,116,5,124,0, + 131,1,125,1,110,8,116,6,124,0,131,1,125,1,124,0, + 102,1,100,2,100,3,132,1,125,2,116,7,160,8,124,1, + 124,2,161,2,116,2,124,0,60,0,87,0,116,0,160,9, + 161,0,1,0,110,10,116,0,160,9,161,0,1,0,48,0, + 124,1,83,0,41,4,122,139,71,101,116,32,111,114,32,99, + 114,101,97,116,101,32,116,104,101,32,109,111,100,117,108,101, + 32,108,111,99,107,32,102,111,114,32,97,32,103,105,118,101, + 110,32,109,111,100,117,108,101,32,110,97,109,101,46,10,10, + 32,32,32,32,65,99,113,117,105,114,101,47,114,101,108,101, + 97,115,101,32,105,110,116,101,114,110,97,108,108,121,32,116, + 104,101,32,103,108,111,98,97,108,32,105,109,112,111,114,116, + 32,108,111,99,107,32,116,111,32,112,114,111,116,101,99,116, + 10,32,32,32,32,95,109,111,100,117,108,101,95,108,111,99, + 107,115,46,78,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,8,0,0,0,83,0,0,0,115,56,0, + 0,0,116,0,160,1,161,0,1,0,122,32,116,2,160,3, + 124,1,161,1,124,0,117,0,114,30,116,2,124,1,61,0, + 87,0,116,0,160,4,161,0,1,0,110,10,116,0,160,4, + 161,0,1,0,48,0,100,0,83,0,114,13,0,0,0,41, + 5,218,4,95,105,109,112,218,12,97,99,113,117,105,114,101, + 95,108,111,99,107,218,13,95,109,111,100,117,108,101,95,108, + 111,99,107,115,114,35,0,0,0,218,12,114,101,108,101,97, + 115,101,95,108,111,99,107,41,2,218,3,114,101,102,114,17, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,2,99,98,185,0,0,0,115,10,0,0,0,0, + 1,8,1,2,4,14,1,8,2,122,28,95,103,101,116,95, + 109,111,100,117,108,101,95,108,111,99,107,46,60,108,111,99, + 97,108,115,62,46,99,98,41,10,114,58,0,0,0,114,59, + 0,0,0,114,60,0,0,0,218,8,75,101,121,69,114,114, + 111,114,114,23,0,0,0,114,50,0,0,0,114,20,0,0, + 0,218,8,95,119,101,97,107,114,101,102,114,62,0,0,0, + 114,61,0,0,0,41,3,114,17,0,0,0,114,24,0,0, + 0,114,63,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,54,0,0,0,166,0,0,0,115,28, + 0,0,0,0,6,8,1,2,1,2,1,14,1,12,1,10, + 2,8,1,8,1,10,2,8,2,12,11,18,2,20,2,114, + 54,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,8,0,0,0,67,0,0,0,115,52,0, + 0,0,116,0,124,0,131,1,125,1,122,12,124,1,160,1, + 161,0,1,0,87,0,110,18,4,0,116,2,121,38,1,0, + 1,0,1,0,89,0,110,10,48,0,124,1,160,3,161,0, + 1,0,100,1,83,0,41,2,122,189,65,99,113,117,105,114, + 101,115,32,116,104,101,110,32,114,101,108,101,97,115,101,115, + 32,116,104,101,32,109,111,100,117,108,101,32,108,111,99,107, + 32,102,111,114,32,97,32,103,105,118,101,110,32,109,111,100, + 117,108,101,32,110,97,109,101,46,10,10,32,32,32,32,84, + 104,105,115,32,105,115,32,117,115,101,100,32,116,111,32,101, + 110,115,117,114,101,32,97,32,109,111,100,117,108,101,32,105, + 115,32,99,111,109,112,108,101,116,101,108,121,32,105,110,105, + 116,105,97,108,105,122,101,100,44,32,105,110,32,116,104,101, + 10,32,32,32,32,101,118,101,110,116,32,105,116,32,105,115, + 32,98,101,105,110,103,32,105,109,112,111,114,116,101,100,32, + 98,121,32,97,110,111,116,104,101,114,32,116,104,114,101,97, + 100,46,10,32,32,32,32,78,41,4,114,54,0,0,0,114, + 40,0,0,0,114,19,0,0,0,114,41,0,0,0,41,2, + 114,17,0,0,0,114,24,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,19,95,108,111,99,107, + 95,117,110,108,111,99,107,95,109,111,100,117,108,101,203,0, + 0,0,115,12,0,0,0,0,6,8,1,2,1,12,1,12, + 3,6,2,114,66,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,4,0,0,0,79,0,0, + 0,115,14,0,0,0,124,0,124,1,105,0,124,2,164,1, + 142,1,83,0,41,1,97,46,1,0,0,114,101,109,111,118, + 101,95,105,109,112,111,114,116,108,105,98,95,102,114,97,109, + 101,115,32,105,110,32,105,109,112,111,114,116,46,99,32,119, + 105,108,108,32,97,108,119,97,121,115,32,114,101,109,111,118, + 101,32,115,101,113,117,101,110,99,101,115,10,32,32,32,32, + 111,102,32,105,109,112,111,114,116,108,105,98,32,102,114,97, + 109,101,115,32,116,104,97,116,32,101,110,100,32,119,105,116, + 104,32,97,32,99,97,108,108,32,116,111,32,116,104,105,115, + 32,102,117,110,99,116,105,111,110,10,10,32,32,32,32,85, + 115,101,32,105,116,32,105,110,115,116,101,97,100,32,111,102, + 32,97,32,110,111,114,109,97,108,32,99,97,108,108,32,105, + 110,32,112,108,97,99,101,115,32,119,104,101,114,101,32,105, + 110,99,108,117,100,105,110,103,32,116,104,101,32,105,109,112, + 111,114,116,108,105,98,10,32,32,32,32,102,114,97,109,101, + 115,32,105,110,116,114,111,100,117,99,101,115,32,117,110,119, + 97,110,116,101,100,32,110,111,105,115,101,32,105,110,116,111, + 32,116,104,101,32,116,114,97,99,101,98,97,99,107,32,40, + 101,46,103,46,32,119,104,101,110,32,101,120,101,99,117,116, + 105,110,103,10,32,32,32,32,109,111,100,117,108,101,32,99, + 111,100,101,41,10,32,32,32,32,114,10,0,0,0,41,3, + 218,1,102,114,56,0,0,0,90,4,107,119,100,115,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,25,95, + 99,97,108,108,95,119,105,116,104,95,102,114,97,109,101,115, + 95,114,101,109,111,118,101,100,220,0,0,0,115,2,0,0, + 0,0,8,114,68,0,0,0,114,39,0,0,0,41,1,218, + 9,118,101,114,98,111,115,105,116,121,99,1,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,4,0,0,0,71, + 0,0,0,115,54,0,0,0,116,0,106,1,106,2,124,1, + 107,5,114,50,124,0,160,3,100,1,161,1,115,30,100,2, + 124,0,23,0,125,0,116,4,124,0,106,5,124,2,142,0, + 116,0,106,6,100,3,141,2,1,0,100,4,83,0,41,5, + 122,61,80,114,105,110,116,32,116,104,101,32,109,101,115,115, + 97,103,101,32,116,111,32,115,116,100,101,114,114,32,105,102, + 32,45,118,47,80,89,84,72,79,78,86,69,82,66,79,83, + 69,32,105,115,32,116,117,114,110,101,100,32,111,110,46,41, + 2,250,1,35,122,7,105,109,112,111,114,116,32,122,2,35, + 32,41,1,90,4,102,105,108,101,78,41,7,114,15,0,0, + 0,218,5,102,108,97,103,115,218,7,118,101,114,98,111,115, + 101,218,10,115,116,97,114,116,115,119,105,116,104,218,5,112, + 114,105,110,116,114,46,0,0,0,218,6,115,116,100,101,114, + 114,41,3,218,7,109,101,115,115,97,103,101,114,69,0,0, + 0,114,56,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,16,95,118,101,114,98,111,115,101,95, + 109,101,115,115,97,103,101,231,0,0,0,115,8,0,0,0, + 0,2,12,1,10,1,8,1,114,77,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,3,0,0,0,115,26,0,0,0,135,0,102,1,100, + 1,100,2,132,8,125,1,116,0,124,1,136,0,131,2,1, + 0,124,1,83,0,41,3,122,49,68,101,99,111,114,97,116, + 111,114,32,116,111,32,118,101,114,105,102,121,32,116,104,101, + 32,110,97,109,101,100,32,109,111,100,117,108,101,32,105,115, + 32,98,117,105,108,116,45,105,110,46,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,19, + 0,0,0,115,38,0,0,0,124,1,116,0,106,1,118,1, + 114,28,116,2,100,1,160,3,124,1,161,1,124,1,100,2, + 141,2,130,1,136,0,124,0,124,1,131,2,83,0,41,3, + 78,250,29,123,33,114,125,32,105,115,32,110,111,116,32,97, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 114,16,0,0,0,41,4,114,15,0,0,0,218,20,98,117, + 105,108,116,105,110,95,109,111,100,117,108,101,95,110,97,109, + 101,115,218,11,73,109,112,111,114,116,69,114,114,111,114,114, + 46,0,0,0,169,2,114,30,0,0,0,218,8,102,117,108, + 108,110,97,109,101,169,1,218,3,102,120,110,114,10,0,0, + 0,114,11,0,0,0,218,25,95,114,101,113,117,105,114,101, + 115,95,98,117,105,108,116,105,110,95,119,114,97,112,112,101, + 114,241,0,0,0,115,10,0,0,0,0,1,10,1,10,1, + 2,255,6,2,122,52,95,114,101,113,117,105,114,101,115,95, + 98,117,105,108,116,105,110,46,60,108,111,99,97,108,115,62, + 46,95,114,101,113,117,105,114,101,115,95,98,117,105,108,116, + 105,110,95,119,114,97,112,112,101,114,169,1,114,12,0,0, + 0,41,2,114,84,0,0,0,114,85,0,0,0,114,10,0, + 0,0,114,83,0,0,0,114,11,0,0,0,218,17,95,114, + 101,113,117,105,114,101,115,95,98,117,105,108,116,105,110,239, + 0,0,0,115,6,0,0,0,0,2,12,5,10,1,114,87, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,3,0,0,0,115,26,0,0, + 0,135,0,102,1,100,1,100,2,132,8,125,1,116,0,124, + 1,136,0,131,2,1,0,124,1,83,0,41,3,122,47,68, + 101,99,111,114,97,116,111,114,32,116,111,32,118,101,114,105, + 102,121,32,116,104,101,32,110,97,109,101,100,32,109,111,100, + 117,108,101,32,105,115,32,102,114,111,122,101,110,46,99,2, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,19,0,0,0,115,38,0,0,0,124,1,116,0, - 106,1,107,7,114,28,116,2,100,1,160,3,124,1,161,1, + 0,0,0,19,0,0,0,115,38,0,0,0,116,0,160,1, + 124,1,161,1,115,28,116,2,100,1,160,3,124,1,161,1, 124,1,100,2,141,2,130,1,136,0,124,0,124,1,131,2, - 83,0,41,3,78,250,29,123,33,114,125,32,105,115,32,110, - 111,116,32,97,32,98,117,105,108,116,45,105,110,32,109,111, - 100,117,108,101,114,16,0,0,0,41,4,114,15,0,0,0, - 218,20,98,117,105,108,116,105,110,95,109,111,100,117,108,101, - 95,110,97,109,101,115,218,11,73,109,112,111,114,116,69,114, - 114,111,114,114,45,0,0,0,169,2,114,30,0,0,0,218, - 8,102,117,108,108,110,97,109,101,169,1,218,3,102,120,110, - 114,10,0,0,0,114,11,0,0,0,218,25,95,114,101,113, - 117,105,114,101,115,95,98,117,105,108,116,105,110,95,119,114, - 97,112,112,101,114,232,0,0,0,115,10,0,0,0,0,1, - 10,1,10,1,2,255,6,2,122,52,95,114,101,113,117,105, - 114,101,115,95,98,117,105,108,116,105,110,46,60,108,111,99, - 97,108,115,62,46,95,114,101,113,117,105,114,101,115,95,98, - 117,105,108,116,105,110,95,119,114,97,112,112,101,114,169,1, - 114,12,0,0,0,41,2,114,83,0,0,0,114,84,0,0, - 0,114,10,0,0,0,114,82,0,0,0,114,11,0,0,0, - 218,17,95,114,101,113,117,105,114,101,115,95,98,117,105,108, - 116,105,110,230,0,0,0,115,6,0,0,0,0,2,12,5, - 10,1,114,86,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0, - 115,26,0,0,0,135,0,102,1,100,1,100,2,132,8,125, - 1,116,0,124,1,136,0,131,2,1,0,124,1,83,0,41, - 3,122,47,68,101,99,111,114,97,116,111,114,32,116,111,32, - 118,101,114,105,102,121,32,116,104,101,32,110,97,109,101,100, - 32,109,111,100,117,108,101,32,105,115,32,102,114,111,122,101, - 110,46,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,19,0,0,0,115,38,0,0,0, - 116,0,160,1,124,1,161,1,115,28,116,2,100,1,160,3, - 124,1,161,1,124,1,100,2,141,2,130,1,136,0,124,0, - 124,1,131,2,83,0,169,3,78,122,27,123,33,114,125,32, - 105,115,32,110,111,116,32,97,32,102,114,111,122,101,110,32, - 109,111,100,117,108,101,114,16,0,0,0,41,4,114,57,0, - 0,0,218,9,105,115,95,102,114,111,122,101,110,114,79,0, - 0,0,114,45,0,0,0,114,80,0,0,0,114,82,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,24,95,114,101, - 113,117,105,114,101,115,95,102,114,111,122,101,110,95,119,114, - 97,112,112,101,114,243,0,0,0,115,10,0,0,0,0,1, - 10,1,10,1,2,255,6,2,122,50,95,114,101,113,117,105, - 114,101,115,95,102,114,111,122,101,110,46,60,108,111,99,97, - 108,115,62,46,95,114,101,113,117,105,114,101,115,95,102,114, - 111,122,101,110,95,119,114,97,112,112,101,114,114,85,0,0, - 0,41,2,114,83,0,0,0,114,89,0,0,0,114,10,0, - 0,0,114,82,0,0,0,114,11,0,0,0,218,16,95,114, - 101,113,117,105,114,101,115,95,102,114,111,122,101,110,241,0, - 0,0,115,6,0,0,0,0,2,12,5,10,1,114,90,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,3,0,0,0,67,0,0,0,115,62,0,0,0, - 116,0,124,1,124,0,131,2,125,2,124,1,116,1,106,2, - 107,6,114,50,116,1,106,2,124,1,25,0,125,3,116,3, - 124,2,124,3,131,2,1,0,116,1,106,2,124,1,25,0, - 83,0,116,4,124,2,131,1,83,0,100,1,83,0,41,2, - 122,128,76,111,97,100,32,116,104,101,32,115,112,101,99,105, - 102,105,101,100,32,109,111,100,117,108,101,32,105,110,116,111, - 32,115,121,115,46,109,111,100,117,108,101,115,32,97,110,100, - 32,114,101,116,117,114,110,32,105,116,46,10,10,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,108,111,97,100,101,114,46,101,120,101,99,95,109,111,100, - 117,108,101,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,78,41,5,218,16,115,112,101,99,95,102,114,111,109, - 95,108,111,97,100,101,114,114,15,0,0,0,218,7,109,111, - 100,117,108,101,115,218,5,95,101,120,101,99,218,5,95,108, - 111,97,100,41,4,114,30,0,0,0,114,81,0,0,0,218, - 4,115,112,101,99,218,6,109,111,100,117,108,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,17,95,108, - 111,97,100,95,109,111,100,117,108,101,95,115,104,105,109,253, - 0,0,0,115,12,0,0,0,0,6,10,1,10,1,10,1, - 10,1,10,2,114,97,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,8,0,0,0,67,0, - 0,0,115,226,0,0,0,116,0,124,0,100,1,100,0,131, - 3,125,1,116,1,124,1,100,2,131,2,114,56,122,12,124, - 1,160,2,124,0,161,1,87,0,83,0,4,0,116,3,107, - 10,114,54,1,0,1,0,1,0,89,0,110,2,88,0,122, - 10,124,0,106,4,125,2,87,0,110,20,4,0,116,5,107, - 10,114,86,1,0,1,0,1,0,89,0,110,18,88,0,124, - 2,100,0,107,9,114,104,116,6,124,2,131,1,83,0,122, - 10,124,0,106,7,125,3,87,0,110,24,4,0,116,5,107, - 10,114,138,1,0,1,0,1,0,100,3,125,3,89,0,110, - 2,88,0,122,10,124,0,106,8,125,4,87,0,110,58,4, - 0,116,5,107,10,114,208,1,0,1,0,1,0,124,1,100, - 0,107,8,114,188,100,4,160,9,124,3,161,1,6,0,89, - 0,83,0,100,5,160,9,124,3,124,1,161,2,6,0,89, - 0,83,0,89,0,110,14,88,0,100,6,160,9,124,3,124, - 4,161,2,83,0,100,0,83,0,41,7,78,218,10,95,95, - 108,111,97,100,101,114,95,95,218,11,109,111,100,117,108,101, - 95,114,101,112,114,250,1,63,250,13,60,109,111,100,117,108, - 101,32,123,33,114,125,62,250,20,60,109,111,100,117,108,101, - 32,123,33,114,125,32,40,123,33,114,125,41,62,250,23,60, - 109,111,100,117,108,101,32,123,33,114,125,32,102,114,111,109, - 32,123,33,114,125,62,41,10,114,6,0,0,0,114,4,0, - 0,0,114,99,0,0,0,218,9,69,120,99,101,112,116,105, - 111,110,218,8,95,95,115,112,101,99,95,95,218,14,65,116, - 116,114,105,98,117,116,101,69,114,114,111,114,218,22,95,109, - 111,100,117,108,101,95,114,101,112,114,95,102,114,111,109,95, - 115,112,101,99,114,1,0,0,0,218,8,95,95,102,105,108, - 101,95,95,114,45,0,0,0,41,5,114,96,0,0,0,218, - 6,108,111,97,100,101,114,114,95,0,0,0,114,17,0,0, - 0,218,8,102,105,108,101,110,97,109,101,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,12,95,109,111,100, - 117,108,101,95,114,101,112,114,13,1,0,0,115,46,0,0, - 0,0,2,12,1,10,4,2,1,12,1,14,1,6,1,2, - 1,10,1,14,1,6,2,8,1,8,4,2,1,10,1,14, - 1,10,1,2,1,10,1,14,1,8,1,14,2,22,2,114, - 111,0,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,114,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 100,2,100,2,100,3,156,3,100,4,100,5,132,2,90,4, - 100,6,100,7,132,0,90,5,100,8,100,9,132,0,90,6, - 101,7,100,10,100,11,132,0,131,1,90,8,101,8,106,9, - 100,12,100,11,132,0,131,1,90,8,101,7,100,13,100,14, - 132,0,131,1,90,10,101,7,100,15,100,16,132,0,131,1, - 90,11,101,11,106,9,100,17,100,16,132,0,131,1,90,11, - 100,2,83,0,41,18,218,10,77,111,100,117,108,101,83,112, - 101,99,97,208,5,0,0,84,104,101,32,115,112,101,99,105, - 102,105,99,97,116,105,111,110,32,102,111,114,32,97,32,109, - 111,100,117,108,101,44,32,117,115,101,100,32,102,111,114,32, - 108,111,97,100,105,110,103,46,10,10,32,32,32,32,65,32, - 109,111,100,117,108,101,39,115,32,115,112,101,99,32,105,115, - 32,116,104,101,32,115,111,117,114,99,101,32,102,111,114,32, - 105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117, - 116,32,116,104,101,32,109,111,100,117,108,101,46,32,32,70, - 111,114,10,32,32,32,32,100,97,116,97,32,97,115,115,111, - 99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32, - 109,111,100,117,108,101,44,32,105,110,99,108,117,100,105,110, - 103,32,115,111,117,114,99,101,44,32,117,115,101,32,116,104, - 101,32,115,112,101,99,39,115,10,32,32,32,32,108,111,97, - 100,101,114,46,10,10,32,32,32,32,96,110,97,109,101,96, - 32,105,115,32,116,104,101,32,97,98,115,111,108,117,116,101, - 32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,100, - 117,108,101,46,32,32,96,108,111,97,100,101,114,96,32,105, - 115,32,116,104,101,32,108,111,97,100,101,114,10,32,32,32, - 32,116,111,32,117,115,101,32,119,104,101,110,32,108,111,97, - 100,105,110,103,32,116,104,101,32,109,111,100,117,108,101,46, - 32,32,96,112,97,114,101,110,116,96,32,105,115,32,116,104, - 101,32,110,97,109,101,32,111,102,32,116,104,101,10,32,32, - 32,32,112,97,99,107,97,103,101,32,116,104,101,32,109,111, - 100,117,108,101,32,105,115,32,105,110,46,32,32,84,104,101, - 32,112,97,114,101,110,116,32,105,115,32,100,101,114,105,118, - 101,100,32,102,114,111,109,32,116,104,101,32,110,97,109,101, - 46,10,10,32,32,32,32,96,105,115,95,112,97,99,107,97, - 103,101,96,32,100,101,116,101,114,109,105,110,101,115,32,105, - 102,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32, - 99,111,110,115,105,100,101,114,101,100,32,97,32,112,97,99, - 107,97,103,101,32,111,114,10,32,32,32,32,110,111,116,46, - 32,32,79,110,32,109,111,100,117,108,101,115,32,116,104,105, - 115,32,105,115,32,114,101,102,108,101,99,116,101,100,32,98, - 121,32,116,104,101,32,96,95,95,112,97,116,104,95,95,96, - 32,97,116,116,114,105,98,117,116,101,46,10,10,32,32,32, - 32,96,111,114,105,103,105,110,96,32,105,115,32,116,104,101, - 32,115,112,101,99,105,102,105,99,32,108,111,99,97,116,105, - 111,110,32,117,115,101,100,32,98,121,32,116,104,101,32,108, - 111,97,100,101,114,32,102,114,111,109,32,119,104,105,99,104, - 32,116,111,10,32,32,32,32,108,111,97,100,32,116,104,101, - 32,109,111,100,117,108,101,44,32,105,102,32,116,104,97,116, - 32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32, - 97,118,97,105,108,97,98,108,101,46,32,32,87,104,101,110, - 32,102,105,108,101,110,97,109,101,32,105,115,10,32,32,32, - 32,115,101,116,44,32,111,114,105,103,105,110,32,119,105,108, - 108,32,109,97,116,99,104,46,10,10,32,32,32,32,96,104, - 97,115,95,108,111,99,97,116,105,111,110,96,32,105,110,100, - 105,99,97,116,101,115,32,116,104,97,116,32,97,32,115,112, - 101,99,39,115,32,34,111,114,105,103,105,110,34,32,114,101, - 102,108,101,99,116,115,32,97,32,108,111,99,97,116,105,111, - 110,46,10,32,32,32,32,87,104,101,110,32,116,104,105,115, - 32,105,115,32,84,114,117,101,44,32,96,95,95,102,105,108, - 101,95,95,96,32,97,116,116,114,105,98,117,116,101,32,111, - 102,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32, - 115,101,116,46,10,10,32,32,32,32,96,99,97,99,104,101, - 100,96,32,105,115,32,116,104,101,32,108,111,99,97,116,105, - 111,110,32,111,102,32,116,104,101,32,99,97,99,104,101,100, - 32,98,121,116,101,99,111,100,101,32,102,105,108,101,44,32, - 105,102,32,97,110,121,46,32,32,73,116,10,32,32,32,32, - 99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116, - 104,101,32,96,95,95,99,97,99,104,101,100,95,95,96,32, - 97,116,116,114,105,98,117,116,101,46,10,10,32,32,32,32, - 96,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, - 104,95,108,111,99,97,116,105,111,110,115,96,32,105,115,32, - 116,104,101,32,115,101,113,117,101,110,99,101,32,111,102,32, - 112,97,116,104,32,101,110,116,114,105,101,115,32,116,111,10, - 32,32,32,32,115,101,97,114,99,104,32,119,104,101,110,32, - 105,109,112,111,114,116,105,110,103,32,115,117,98,109,111,100, - 117,108,101,115,46,32,32,73,102,32,115,101,116,44,32,105, - 115,95,112,97,99,107,97,103,101,32,115,104,111,117,108,100, - 32,98,101,10,32,32,32,32,84,114,117,101,45,45,97,110, - 100,32,70,97,108,115,101,32,111,116,104,101,114,119,105,115, - 101,46,10,10,32,32,32,32,80,97,99,107,97,103,101,115, - 32,97,114,101,32,115,105,109,112,108,121,32,109,111,100,117, - 108,101,115,32,116,104,97,116,32,40,109,97,121,41,32,104, - 97,118,101,32,115,117,98,109,111,100,117,108,101,115,46,32, - 32,73,102,32,97,32,115,112,101,99,10,32,32,32,32,104, - 97,115,32,97,32,110,111,110,45,78,111,110,101,32,118,97, - 108,117,101,32,105,110,32,96,115,117,98,109,111,100,117,108, - 101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111, - 110,115,96,44,32,116,104,101,32,105,109,112,111,114,116,10, - 32,32,32,32,115,121,115,116,101,109,32,119,105,108,108,32, - 99,111,110,115,105,100,101,114,32,109,111,100,117,108,101,115, - 32,108,111,97,100,101,100,32,102,114,111,109,32,116,104,101, - 32,115,112,101,99,32,97,115,32,112,97,99,107,97,103,101, - 115,46,10,10,32,32,32,32,79,110,108,121,32,102,105,110, - 100,101,114,115,32,40,115,101,101,32,105,109,112,111,114,116, - 108,105,98,46,97,98,99,46,77,101,116,97,80,97,116,104, - 70,105,110,100,101,114,32,97,110,100,10,32,32,32,32,105, - 109,112,111,114,116,108,105,98,46,97,98,99,46,80,97,116, - 104,69,110,116,114,121,70,105,110,100,101,114,41,32,115,104, - 111,117,108,100,32,109,111,100,105,102,121,32,77,111,100,117, - 108,101,83,112,101,99,32,105,110,115,116,97,110,99,101,115, - 46,10,10,32,32,32,32,78,41,3,218,6,111,114,105,103, - 105,110,218,12,108,111,97,100,101,114,95,115,116,97,116,101, - 218,10,105,115,95,112,97,99,107,97,103,101,99,3,0,0, - 0,0,0,0,0,3,0,0,0,6,0,0,0,2,0,0, - 0,67,0,0,0,115,54,0,0,0,124,1,124,0,95,0, - 124,2,124,0,95,1,124,3,124,0,95,2,124,4,124,0, - 95,3,124,5,114,32,103,0,110,2,100,0,124,0,95,4, - 100,1,124,0,95,5,100,0,124,0,95,6,100,0,83,0, - 169,2,78,70,41,7,114,17,0,0,0,114,109,0,0,0, - 114,113,0,0,0,114,114,0,0,0,218,26,115,117,98,109, - 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,218,13,95,115,101,116,95,102,105,108, - 101,97,116,116,114,218,7,95,99,97,99,104,101,100,41,6, - 114,30,0,0,0,114,17,0,0,0,114,109,0,0,0,114, - 113,0,0,0,114,114,0,0,0,114,115,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,31,0, - 0,0,86,1,0,0,115,14,0,0,0,0,2,6,1,6, - 1,6,1,6,1,14,3,6,1,122,19,77,111,100,117,108, - 101,83,112,101,99,46,95,95,105,110,105,116,95,95,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,6, - 0,0,0,67,0,0,0,115,102,0,0,0,100,1,160,0, - 124,0,106,1,161,1,100,2,160,0,124,0,106,2,161,1, - 103,2,125,1,124,0,106,3,100,0,107,9,114,52,124,1, - 160,4,100,3,160,0,124,0,106,3,161,1,161,1,1,0, - 124,0,106,5,100,0,107,9,114,80,124,1,160,4,100,4, - 160,0,124,0,106,5,161,1,161,1,1,0,100,5,160,0, - 124,0,106,6,106,7,100,6,160,8,124,1,161,1,161,2, - 83,0,41,7,78,122,9,110,97,109,101,61,123,33,114,125, - 122,11,108,111,97,100,101,114,61,123,33,114,125,122,11,111, - 114,105,103,105,110,61,123,33,114,125,122,29,115,117,98,109, + 83,0,169,3,78,122,27,123,33,114,125,32,105,115,32,110, + 111,116,32,97,32,102,114,111,122,101,110,32,109,111,100,117, + 108,101,114,16,0,0,0,41,4,114,58,0,0,0,218,9, + 105,115,95,102,114,111,122,101,110,114,80,0,0,0,114,46, + 0,0,0,114,81,0,0,0,114,83,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,24,95,114,101,113,117,105,114, + 101,115,95,102,114,111,122,101,110,95,119,114,97,112,112,101, + 114,252,0,0,0,115,10,0,0,0,0,1,10,1,10,1, + 2,255,6,2,122,50,95,114,101,113,117,105,114,101,115,95, + 102,114,111,122,101,110,46,60,108,111,99,97,108,115,62,46, + 95,114,101,113,117,105,114,101,115,95,102,114,111,122,101,110, + 95,119,114,97,112,112,101,114,114,86,0,0,0,41,2,114, + 84,0,0,0,114,90,0,0,0,114,10,0,0,0,114,83, + 0,0,0,114,11,0,0,0,218,16,95,114,101,113,117,105, + 114,101,115,95,102,114,111,122,101,110,250,0,0,0,115,6, + 0,0,0,0,2,12,5,10,1,114,91,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3, + 0,0,0,67,0,0,0,115,62,0,0,0,116,0,124,1, + 124,0,131,2,125,2,124,1,116,1,106,2,118,0,114,50, + 116,1,106,2,124,1,25,0,125,3,116,3,124,2,124,3, + 131,2,1,0,116,1,106,2,124,1,25,0,83,0,116,4, + 124,2,131,1,83,0,100,1,83,0,41,2,122,128,76,111, + 97,100,32,116,104,101,32,115,112,101,99,105,102,105,101,100, + 32,109,111,100,117,108,101,32,105,110,116,111,32,115,121,115, + 46,109,111,100,117,108,101,115,32,97,110,100,32,114,101,116, + 117,114,110,32,105,116,46,10,10,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,108,111,97, + 100,101,114,46,101,120,101,99,95,109,111,100,117,108,101,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,78,41, + 5,218,16,115,112,101,99,95,102,114,111,109,95,108,111,97, + 100,101,114,114,15,0,0,0,218,7,109,111,100,117,108,101, + 115,218,5,95,101,120,101,99,218,5,95,108,111,97,100,41, + 4,114,30,0,0,0,114,82,0,0,0,218,4,115,112,101, + 99,218,6,109,111,100,117,108,101,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,17,95,108,111,97,100,95, + 109,111,100,117,108,101,95,115,104,105,109,6,1,0,0,115, + 12,0,0,0,0,6,10,1,10,1,10,1,10,1,10,2, + 114,98,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,8,0,0,0,67,0,0,0,115,218, + 0,0,0,116,0,124,0,100,1,100,0,131,3,125,1,116, + 1,124,1,100,2,131,2,114,54,122,12,124,1,160,2,124, + 0,161,1,87,0,83,0,4,0,116,3,121,52,1,0,1, + 0,1,0,89,0,110,2,48,0,122,10,124,0,106,4,125, + 2,87,0,110,18,4,0,116,5,121,82,1,0,1,0,1, + 0,89,0,110,18,48,0,124,2,100,0,117,1,114,100,116, + 6,124,2,131,1,83,0,122,10,124,0,106,7,125,3,87, + 0,110,22,4,0,116,5,121,132,1,0,1,0,1,0,100, + 3,125,3,89,0,110,2,48,0,122,10,124,0,106,8,125, + 4,87,0,110,56,4,0,116,5,121,200,1,0,1,0,1, + 0,124,1,100,0,117,0,114,180,100,4,160,9,124,3,161, + 1,6,0,89,0,83,0,100,5,160,9,124,3,124,1,161, + 2,6,0,89,0,83,0,89,0,110,14,48,0,100,6,160, + 9,124,3,124,4,161,2,83,0,100,0,83,0,41,7,78, + 218,10,95,95,108,111,97,100,101,114,95,95,218,11,109,111, + 100,117,108,101,95,114,101,112,114,250,1,63,250,13,60,109, + 111,100,117,108,101,32,123,33,114,125,62,250,20,60,109,111, + 100,117,108,101,32,123,33,114,125,32,40,123,33,114,125,41, + 62,250,23,60,109,111,100,117,108,101,32,123,33,114,125,32, + 102,114,111,109,32,123,33,114,125,62,41,10,114,6,0,0, + 0,114,4,0,0,0,114,100,0,0,0,218,9,69,120,99, + 101,112,116,105,111,110,218,8,95,95,115,112,101,99,95,95, + 218,14,65,116,116,114,105,98,117,116,101,69,114,114,111,114, + 218,22,95,109,111,100,117,108,101,95,114,101,112,114,95,102, + 114,111,109,95,115,112,101,99,114,1,0,0,0,218,8,95, + 95,102,105,108,101,95,95,114,46,0,0,0,41,5,114,97, + 0,0,0,218,6,108,111,97,100,101,114,114,96,0,0,0, + 114,17,0,0,0,218,8,102,105,108,101,110,97,109,101,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,12, + 95,109,111,100,117,108,101,95,114,101,112,114,22,1,0,0, + 115,46,0,0,0,0,2,12,1,10,4,2,1,12,1,12, + 1,6,1,2,1,10,1,12,1,6,2,8,1,8,4,2, + 1,10,1,12,1,10,1,2,1,10,1,12,1,8,1,14, + 2,22,2,114,112,0,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,114,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,2,100,2,100,3,156,3,100,4,100,5, + 132,2,90,4,100,6,100,7,132,0,90,5,100,8,100,9, + 132,0,90,6,101,7,100,10,100,11,132,0,131,1,90,8, + 101,8,106,9,100,12,100,11,132,0,131,1,90,8,101,7, + 100,13,100,14,132,0,131,1,90,10,101,7,100,15,100,16, + 132,0,131,1,90,11,101,11,106,9,100,17,100,16,132,0, + 131,1,90,11,100,2,83,0,41,18,218,10,77,111,100,117, + 108,101,83,112,101,99,97,208,5,0,0,84,104,101,32,115, + 112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114, + 32,97,32,109,111,100,117,108,101,44,32,117,115,101,100,32, + 102,111,114,32,108,111,97,100,105,110,103,46,10,10,32,32, + 32,32,65,32,109,111,100,117,108,101,39,115,32,115,112,101, + 99,32,105,115,32,116,104,101,32,115,111,117,114,99,101,32, + 102,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32, + 97,98,111,117,116,32,116,104,101,32,109,111,100,117,108,101, + 46,32,32,70,111,114,10,32,32,32,32,100,97,116,97,32, + 97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32, + 116,104,101,32,109,111,100,117,108,101,44,32,105,110,99,108, + 117,100,105,110,103,32,115,111,117,114,99,101,44,32,117,115, + 101,32,116,104,101,32,115,112,101,99,39,115,10,32,32,32, + 32,108,111,97,100,101,114,46,10,10,32,32,32,32,96,110, + 97,109,101,96,32,105,115,32,116,104,101,32,97,98,115,111, + 108,117,116,101,32,110,97,109,101,32,111,102,32,116,104,101, + 32,109,111,100,117,108,101,46,32,32,96,108,111,97,100,101, + 114,96,32,105,115,32,116,104,101,32,108,111,97,100,101,114, + 10,32,32,32,32,116,111,32,117,115,101,32,119,104,101,110, + 32,108,111,97,100,105,110,103,32,116,104,101,32,109,111,100, + 117,108,101,46,32,32,96,112,97,114,101,110,116,96,32,105, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,10,32,32,32,32,112,97,99,107,97,103,101,32,116,104, + 101,32,109,111,100,117,108,101,32,105,115,32,105,110,46,32, + 32,84,104,101,32,112,97,114,101,110,116,32,105,115,32,100, + 101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32, + 110,97,109,101,46,10,10,32,32,32,32,96,105,115,95,112, + 97,99,107,97,103,101,96,32,100,101,116,101,114,109,105,110, + 101,115,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, + 32,112,97,99,107,97,103,101,32,111,114,10,32,32,32,32, + 110,111,116,46,32,32,79,110,32,109,111,100,117,108,101,115, + 32,116,104,105,115,32,105,115,32,114,101,102,108,101,99,116, + 101,100,32,98,121,32,116,104,101,32,96,95,95,112,97,116, + 104,95,95,96,32,97,116,116,114,105,98,117,116,101,46,10, + 10,32,32,32,32,96,111,114,105,103,105,110,96,32,105,115, + 32,116,104,101,32,115,112,101,99,105,102,105,99,32,108,111, + 99,97,116,105,111,110,32,117,115,101,100,32,98,121,32,116, + 104,101,32,108,111,97,100,101,114,32,102,114,111,109,32,119, + 104,105,99,104,32,116,111,10,32,32,32,32,108,111,97,100, + 32,116,104,101,32,109,111,100,117,108,101,44,32,105,102,32, + 116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110, + 32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,32, + 87,104,101,110,32,102,105,108,101,110,97,109,101,32,105,115, + 10,32,32,32,32,115,101,116,44,32,111,114,105,103,105,110, + 32,119,105,108,108,32,109,97,116,99,104,46,10,10,32,32, + 32,32,96,104,97,115,95,108,111,99,97,116,105,111,110,96, + 32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32, + 97,32,115,112,101,99,39,115,32,34,111,114,105,103,105,110, + 34,32,114,101,102,108,101,99,116,115,32,97,32,108,111,99, + 97,116,105,111,110,46,10,32,32,32,32,87,104,101,110,32, + 116,104,105,115,32,105,115,32,84,114,117,101,44,32,96,95, + 95,102,105,108,101,95,95,96,32,97,116,116,114,105,98,117, + 116,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,115,101,116,46,10,10,32,32,32,32,96,99, + 97,99,104,101,100,96,32,105,115,32,116,104,101,32,108,111, + 99,97,116,105,111,110,32,111,102,32,116,104,101,32,99,97, + 99,104,101,100,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,44,32,105,102,32,97,110,121,46,32,32,73,116,10, + 32,32,32,32,99,111,114,114,101,115,112,111,110,100,115,32, + 116,111,32,116,104,101,32,96,95,95,99,97,99,104,101,100, + 95,95,96,32,97,116,116,114,105,98,117,116,101,46,10,10, + 32,32,32,32,96,115,117,98,109,111,100,117,108,101,95,115, + 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,96, + 32,105,115,32,116,104,101,32,115,101,113,117,101,110,99,101, + 32,111,102,32,112,97,116,104,32,101,110,116,114,105,101,115, + 32,116,111,10,32,32,32,32,115,101,97,114,99,104,32,119, + 104,101,110,32,105,109,112,111,114,116,105,110,103,32,115,117, + 98,109,111,100,117,108,101,115,46,32,32,73,102,32,115,101, + 116,44,32,105,115,95,112,97,99,107,97,103,101,32,115,104, + 111,117,108,100,32,98,101,10,32,32,32,32,84,114,117,101, + 45,45,97,110,100,32,70,97,108,115,101,32,111,116,104,101, + 114,119,105,115,101,46,10,10,32,32,32,32,80,97,99,107, + 97,103,101,115,32,97,114,101,32,115,105,109,112,108,121,32, + 109,111,100,117,108,101,115,32,116,104,97,116,32,40,109,97, + 121,41,32,104,97,118,101,32,115,117,98,109,111,100,117,108, + 101,115,46,32,32,73,102,32,97,32,115,112,101,99,10,32, + 32,32,32,104,97,115,32,97,32,110,111,110,45,78,111,110, + 101,32,118,97,108,117,101,32,105,110,32,96,115,117,98,109, 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,61,123,125,122,6,123,125,40,123,125, - 41,122,2,44,32,41,9,114,45,0,0,0,114,17,0,0, - 0,114,109,0,0,0,114,113,0,0,0,218,6,97,112,112, - 101,110,100,114,117,0,0,0,218,9,95,95,99,108,97,115, - 115,95,95,114,1,0,0,0,218,4,106,111,105,110,41,2, - 114,30,0,0,0,114,55,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,48,0,0,0,98,1, - 0,0,115,20,0,0,0,0,1,10,1,10,255,4,2,10, - 1,18,1,10,1,8,1,4,255,6,2,122,19,77,111,100, - 117,108,101,83,112,101,99,46,95,95,114,101,112,114,95,95, - 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,106,0,0,0,124,0, - 106,0,125,2,122,72,124,0,106,1,124,1,106,1,107,2, - 111,76,124,0,106,2,124,1,106,2,107,2,111,76,124,0, - 106,3,124,1,106,3,107,2,111,76,124,2,124,1,106,0, - 107,2,111,76,124,0,106,4,124,1,106,4,107,2,111,76, - 124,0,106,5,124,1,106,5,107,2,87,0,83,0,4,0, - 116,6,107,10,114,100,1,0,1,0,1,0,89,0,100,1, - 83,0,88,0,100,0,83,0,114,116,0,0,0,41,7,114, - 117,0,0,0,114,17,0,0,0,114,109,0,0,0,114,113, - 0,0,0,218,6,99,97,99,104,101,100,218,12,104,97,115, - 95,108,111,99,97,116,105,111,110,114,106,0,0,0,41,3, - 114,30,0,0,0,90,5,111,116,104,101,114,90,4,115,109, - 115,108,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,6,95,95,101,113,95,95,108,1,0,0,115,30,0, - 0,0,0,1,6,1,2,1,12,1,10,255,2,2,10,254, - 2,3,8,253,2,4,10,252,2,5,10,251,4,6,14,1, - 122,17,77,111,100,117,108,101,83,112,101,99,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,58,0,0, - 0,124,0,106,0,100,0,107,8,114,52,124,0,106,1,100, - 0,107,9,114,52,124,0,106,2,114,52,116,3,100,0,107, - 8,114,38,116,4,130,1,116,3,160,5,124,0,106,1,161, - 1,124,0,95,0,124,0,106,0,83,0,114,13,0,0,0, - 41,6,114,119,0,0,0,114,113,0,0,0,114,118,0,0, - 0,218,19,95,98,111,111,116,115,116,114,97,112,95,101,120, - 116,101,114,110,97,108,218,19,78,111,116,73,109,112,108,101, - 109,101,110,116,101,100,69,114,114,111,114,90,11,95,103,101, - 116,95,99,97,99,104,101,100,114,47,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,123,0,0, - 0,120,1,0,0,115,12,0,0,0,0,2,10,1,16,1, - 8,1,4,1,14,1,122,17,77,111,100,117,108,101,83,112, - 101,99,46,99,97,99,104,101,100,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,10,0,0,0,124,1,124,0,95,0,100,0,83, - 0,114,13,0,0,0,41,1,114,119,0,0,0,41,2,114, - 30,0,0,0,114,123,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,123,0,0,0,129,1,0, - 0,115,2,0,0,0,0,2,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,36,0,0,0,124,0,106,0,100,1,107,8,114,26, - 124,0,106,1,160,2,100,2,161,1,100,3,25,0,83,0, - 124,0,106,1,83,0,100,1,83,0,41,4,122,32,84,104, - 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, - 100,117,108,101,39,115,32,112,97,114,101,110,116,46,78,218, - 1,46,114,22,0,0,0,41,3,114,117,0,0,0,114,17, - 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, - 47,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,6,112,97,114,101,110,116,133,1,0,0,115, - 6,0,0,0,0,3,10,1,16,2,122,17,77,111,100,117, - 108,101,83,112,101,99,46,112,97,114,101,110,116,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, - 0,114,13,0,0,0,41,1,114,118,0,0,0,114,47,0, + 97,116,105,111,110,115,96,44,32,116,104,101,32,105,109,112, + 111,114,116,10,32,32,32,32,115,121,115,116,101,109,32,119, + 105,108,108,32,99,111,110,115,105,100,101,114,32,109,111,100, + 117,108,101,115,32,108,111,97,100,101,100,32,102,114,111,109, + 32,116,104,101,32,115,112,101,99,32,97,115,32,112,97,99, + 107,97,103,101,115,46,10,10,32,32,32,32,79,110,108,121, + 32,102,105,110,100,101,114,115,32,40,115,101,101,32,105,109, + 112,111,114,116,108,105,98,46,97,98,99,46,77,101,116,97, + 80,97,116,104,70,105,110,100,101,114,32,97,110,100,10,32, + 32,32,32,105,109,112,111,114,116,108,105,98,46,97,98,99, + 46,80,97,116,104,69,110,116,114,121,70,105,110,100,101,114, + 41,32,115,104,111,117,108,100,32,109,111,100,105,102,121,32, + 77,111,100,117,108,101,83,112,101,99,32,105,110,115,116,97, + 110,99,101,115,46,10,10,32,32,32,32,78,41,3,218,6, + 111,114,105,103,105,110,218,12,108,111,97,100,101,114,95,115, + 116,97,116,101,218,10,105,115,95,112,97,99,107,97,103,101, + 99,3,0,0,0,0,0,0,0,3,0,0,0,6,0,0, + 0,2,0,0,0,67,0,0,0,115,54,0,0,0,124,1, + 124,0,95,0,124,2,124,0,95,1,124,3,124,0,95,2, + 124,4,124,0,95,3,124,5,114,32,103,0,110,2,100,0, + 124,0,95,4,100,1,124,0,95,5,100,0,124,0,95,6, + 100,0,83,0,41,2,78,70,41,7,114,17,0,0,0,114, + 110,0,0,0,114,114,0,0,0,114,115,0,0,0,218,26, + 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, + 95,108,111,99,97,116,105,111,110,115,218,13,95,115,101,116, + 95,102,105,108,101,97,116,116,114,218,7,95,99,97,99,104, + 101,100,41,6,114,30,0,0,0,114,17,0,0,0,114,110, + 0,0,0,114,114,0,0,0,114,115,0,0,0,114,116,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,124,0,0,0,141,1,0,0,115,2,0,0,0,0, - 2,122,23,77,111,100,117,108,101,83,112,101,99,46,104,97, - 115,95,108,111,99,97,116,105,111,110,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,14,0,0,0,116,0,124,1,131,1,124,0, - 95,1,100,0,83,0,114,13,0,0,0,41,2,218,4,98, - 111,111,108,114,118,0,0,0,41,2,114,30,0,0,0,218, - 5,118,97,108,117,101,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,124,0,0,0,145,1,0,0,115,2, - 0,0,0,0,2,41,12,114,1,0,0,0,114,0,0,0, - 0,114,2,0,0,0,114,3,0,0,0,114,31,0,0,0, - 114,48,0,0,0,114,125,0,0,0,218,8,112,114,111,112, - 101,114,116,121,114,123,0,0,0,218,6,115,101,116,116,101, - 114,114,130,0,0,0,114,124,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 112,0,0,0,49,1,0,0,115,32,0,0,0,8,1,4, - 36,4,1,2,255,12,12,8,10,8,12,2,1,10,8,4, - 1,10,3,2,1,10,7,2,1,10,3,4,1,114,112,0, - 0,0,169,2,114,113,0,0,0,114,115,0,0,0,99,2, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,154,0,0,0,116,0,124,1, - 100,1,131,2,114,74,116,1,100,2,107,8,114,22,116,2, - 130,1,116,1,106,3,125,4,124,3,100,2,107,8,114,48, - 124,4,124,0,124,1,100,3,141,2,83,0,124,3,114,56, - 103,0,110,2,100,2,125,5,124,4,124,0,124,1,124,5, - 100,4,141,3,83,0,124,3,100,2,107,8,114,138,116,0, - 124,1,100,5,131,2,114,134,122,14,124,1,160,4,124,0, - 161,1,125,3,87,0,113,138,4,0,116,5,107,10,114,130, - 1,0,1,0,1,0,100,2,125,3,89,0,113,138,88,0, - 110,4,100,6,125,3,116,6,124,0,124,1,124,2,124,3, - 100,7,141,4,83,0,41,8,122,53,82,101,116,117,114,110, - 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, - 97,115,101,100,32,111,110,32,118,97,114,105,111,117,115,32, - 108,111,97,100,101,114,32,109,101,116,104,111,100,115,46,90, - 12,103,101,116,95,102,105,108,101,110,97,109,101,78,41,1, - 114,109,0,0,0,41,2,114,109,0,0,0,114,117,0,0, - 0,114,115,0,0,0,70,114,135,0,0,0,41,7,114,4, - 0,0,0,114,126,0,0,0,114,127,0,0,0,218,23,115, - 112,101,99,95,102,114,111,109,95,102,105,108,101,95,108,111, - 99,97,116,105,111,110,114,115,0,0,0,114,79,0,0,0, - 114,112,0,0,0,41,6,114,17,0,0,0,114,109,0,0, - 0,114,113,0,0,0,114,115,0,0,0,114,136,0,0,0, - 90,6,115,101,97,114,99,104,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,91,0,0,0,150,1,0,0, - 115,36,0,0,0,0,2,10,1,8,1,4,1,6,2,8, - 1,12,1,12,1,6,1,2,255,6,3,8,1,10,1,2, - 1,14,1,14,1,12,3,4,2,114,91,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8, - 0,0,0,67,0,0,0,115,56,1,0,0,122,10,124,0, - 106,0,125,3,87,0,110,20,4,0,116,1,107,10,114,30, - 1,0,1,0,1,0,89,0,110,14,88,0,124,3,100,0, - 107,9,114,44,124,3,83,0,124,0,106,2,125,4,124,1, - 100,0,107,8,114,90,122,10,124,0,106,3,125,1,87,0, - 110,20,4,0,116,1,107,10,114,88,1,0,1,0,1,0, - 89,0,110,2,88,0,122,10,124,0,106,4,125,5,87,0, - 110,24,4,0,116,1,107,10,114,124,1,0,1,0,1,0, - 100,0,125,5,89,0,110,2,88,0,124,2,100,0,107,8, - 114,184,124,5,100,0,107,8,114,180,122,10,124,1,106,5, - 125,2,87,0,113,184,4,0,116,1,107,10,114,176,1,0, - 1,0,1,0,100,0,125,2,89,0,113,184,88,0,110,4, - 124,5,125,2,122,10,124,0,106,6,125,6,87,0,110,24, - 4,0,116,1,107,10,114,218,1,0,1,0,1,0,100,0, - 125,6,89,0,110,2,88,0,122,14,116,7,124,0,106,8, - 131,1,125,7,87,0,110,26,4,0,116,1,107,10,144,1, - 114,4,1,0,1,0,1,0,100,0,125,7,89,0,110,2, - 88,0,116,9,124,4,124,1,124,2,100,1,141,3,125,3, - 124,5,100,0,107,8,144,1,114,34,100,2,110,2,100,3, - 124,3,95,10,124,6,124,3,95,11,124,7,124,3,95,12, - 124,3,83,0,41,4,78,169,1,114,113,0,0,0,70,84, - 41,13,114,105,0,0,0,114,106,0,0,0,114,1,0,0, - 0,114,98,0,0,0,114,108,0,0,0,218,7,95,79,82, - 73,71,73,78,218,10,95,95,99,97,99,104,101,100,95,95, - 218,4,108,105,115,116,218,8,95,95,112,97,116,104,95,95, - 114,112,0,0,0,114,118,0,0,0,114,123,0,0,0,114, - 117,0,0,0,41,8,114,96,0,0,0,114,109,0,0,0, - 114,113,0,0,0,114,95,0,0,0,114,17,0,0,0,90, - 8,108,111,99,97,116,105,111,110,114,123,0,0,0,114,117, + 0,114,31,0,0,0,95,1,0,0,115,14,0,0,0,0, + 2,6,1,6,1,6,1,6,1,14,3,6,1,122,19,77, + 111,100,117,108,101,83,112,101,99,46,95,95,105,110,105,116, + 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,6,0,0,0,67,0,0,0,115,102,0,0,0, + 100,1,160,0,124,0,106,1,161,1,100,2,160,0,124,0, + 106,2,161,1,103,2,125,1,124,0,106,3,100,0,117,1, + 114,52,124,1,160,4,100,3,160,0,124,0,106,3,161,1, + 161,1,1,0,124,0,106,5,100,0,117,1,114,80,124,1, + 160,4,100,4,160,0,124,0,106,5,161,1,161,1,1,0, + 100,5,160,0,124,0,106,6,106,7,100,6,160,8,124,1, + 161,1,161,2,83,0,41,7,78,122,9,110,97,109,101,61, + 123,33,114,125,122,11,108,111,97,100,101,114,61,123,33,114, + 125,122,11,111,114,105,103,105,110,61,123,33,114,125,122,29, + 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, + 95,108,111,99,97,116,105,111,110,115,61,123,125,122,6,123, + 125,40,123,125,41,122,2,44,32,41,9,114,46,0,0,0, + 114,17,0,0,0,114,110,0,0,0,114,114,0,0,0,218, + 6,97,112,112,101,110,100,114,117,0,0,0,218,9,95,95, + 99,108,97,115,115,95,95,114,1,0,0,0,218,4,106,111, + 105,110,41,2,114,30,0,0,0,114,56,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,49,0, + 0,0,107,1,0,0,115,20,0,0,0,0,1,10,1,10, + 255,4,2,10,1,18,1,10,1,8,1,4,255,6,2,122, + 19,77,111,100,117,108,101,83,112,101,99,46,95,95,114,101, + 112,114,95,95,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,106,0, + 0,0,124,0,106,0,125,2,122,72,124,0,106,1,124,1, + 106,1,107,2,111,76,124,0,106,2,124,1,106,2,107,2, + 111,76,124,0,106,3,124,1,106,3,107,2,111,76,124,2, + 124,1,106,0,107,2,111,76,124,0,106,4,124,1,106,4, + 107,2,111,76,124,0,106,5,124,1,106,5,107,2,87,0, + 83,0,4,0,116,6,121,100,1,0,1,0,1,0,116,7, + 6,0,89,0,83,0,48,0,100,0,83,0,114,13,0,0, + 0,41,8,114,117,0,0,0,114,17,0,0,0,114,110,0, + 0,0,114,114,0,0,0,218,6,99,97,99,104,101,100,218, + 12,104,97,115,95,108,111,99,97,116,105,111,110,114,107,0, + 0,0,218,14,78,111,116,73,109,112,108,101,109,101,110,116, + 101,100,41,3,114,30,0,0,0,90,5,111,116,104,101,114, + 90,4,115,109,115,108,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,6,95,95,101,113,95,95,117,1,0, + 0,115,30,0,0,0,0,1,6,1,2,1,12,1,10,255, + 2,2,10,254,2,3,8,253,2,4,10,252,2,5,10,251, + 4,6,12,1,122,17,77,111,100,117,108,101,83,112,101,99, + 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,58,0,0,0,124,0,106,0,100,0,117,0,114,52,124, + 0,106,1,100,0,117,1,114,52,124,0,106,2,114,52,116, + 3,100,0,117,0,114,38,116,4,130,1,116,3,160,5,124, + 0,106,1,161,1,124,0,95,0,124,0,106,0,83,0,114, + 13,0,0,0,41,6,114,119,0,0,0,114,114,0,0,0, + 114,118,0,0,0,218,19,95,98,111,111,116,115,116,114,97, + 112,95,101,120,116,101,114,110,97,108,218,19,78,111,116,73, + 109,112,108,101,109,101,110,116,101,100,69,114,114,111,114,90, + 11,95,103,101,116,95,99,97,99,104,101,100,114,48,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,123,0,0,0,129,1,0,0,115,12,0,0,0,0,2, + 10,1,16,1,8,1,4,1,14,1,122,17,77,111,100,117, + 108,101,83,112,101,99,46,99,97,99,104,101,100,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,10,0,0,0,124,1,124,0,95, + 0,100,0,83,0,114,13,0,0,0,41,1,114,119,0,0, + 0,41,2,114,30,0,0,0,114,123,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,123,0,0, + 0,138,1,0,0,115,2,0,0,0,0,2,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,36,0,0,0,124,0,106,0,100,1, + 117,0,114,26,124,0,106,1,160,2,100,2,161,1,100,3, + 25,0,83,0,124,0,106,1,83,0,100,1,83,0,41,4, + 122,32,84,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,32,109,111,100,117,108,101,39,115,32,112,97,114,101,110, + 116,46,78,218,1,46,114,22,0,0,0,41,3,114,117,0, + 0,0,114,17,0,0,0,218,10,114,112,97,114,116,105,116, + 105,111,110,114,48,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,6,112,97,114,101,110,116,142, + 1,0,0,115,6,0,0,0,0,3,10,1,16,2,122,17, + 77,111,100,117,108,101,83,112,101,99,46,112,97,114,101,110, + 116,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,1,0,0,0,67,0,0,0,115,6,0,0,0,124, + 0,106,0,83,0,114,13,0,0,0,41,1,114,118,0,0, + 0,114,48,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,124,0,0,0,150,1,0,0,115,2, + 0,0,0,0,2,122,23,77,111,100,117,108,101,83,112,101, + 99,46,104,97,115,95,108,111,99,97,116,105,111,110,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,14,0,0,0,116,0,124,1, + 131,1,124,0,95,1,100,0,83,0,114,13,0,0,0,41, + 2,218,4,98,111,111,108,114,118,0,0,0,41,2,114,30, + 0,0,0,218,5,118,97,108,117,101,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,124,0,0,0,154,1, + 0,0,115,2,0,0,0,0,2,41,12,114,1,0,0,0, + 114,0,0,0,0,114,2,0,0,0,114,3,0,0,0,114, + 31,0,0,0,114,49,0,0,0,114,126,0,0,0,218,8, + 112,114,111,112,101,114,116,121,114,123,0,0,0,218,6,115, + 101,116,116,101,114,114,131,0,0,0,114,124,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,113,0,0,0,58,1,0,0,115,32,0,0, + 0,8,1,4,36,4,1,2,255,12,12,8,10,8,12,2, + 1,10,8,4,1,10,3,2,1,10,7,2,1,10,3,4, + 1,114,113,0,0,0,169,2,114,114,0,0,0,114,116,0, + 0,0,99,2,0,0,0,0,0,0,0,2,0,0,0,6, + 0,0,0,8,0,0,0,67,0,0,0,115,152,0,0,0, + 116,0,124,1,100,1,131,2,114,74,116,1,100,2,117,0, + 114,22,116,2,130,1,116,1,106,3,125,4,124,3,100,2, + 117,0,114,48,124,4,124,0,124,1,100,3,141,2,83,0, + 124,3,114,56,103,0,110,2,100,2,125,5,124,4,124,0, + 124,1,124,5,100,4,141,3,83,0,124,3,100,2,117,0, + 114,136,116,0,124,1,100,5,131,2,114,132,122,14,124,1, + 160,4,124,0,161,1,125,3,87,0,113,136,4,0,116,5, + 121,128,1,0,1,0,1,0,100,2,125,3,89,0,113,136, + 48,0,110,4,100,6,125,3,116,6,124,0,124,1,124,2, + 124,3,100,7,141,4,83,0,41,8,122,53,82,101,116,117, + 114,110,32,97,32,109,111,100,117,108,101,32,115,112,101,99, + 32,98,97,115,101,100,32,111,110,32,118,97,114,105,111,117, + 115,32,108,111,97,100,101,114,32,109,101,116,104,111,100,115, + 46,90,12,103,101,116,95,102,105,108,101,110,97,109,101,78, + 41,1,114,110,0,0,0,41,2,114,110,0,0,0,114,117, + 0,0,0,114,116,0,0,0,70,114,136,0,0,0,41,7, + 114,4,0,0,0,114,127,0,0,0,114,128,0,0,0,218, + 23,115,112,101,99,95,102,114,111,109,95,102,105,108,101,95, + 108,111,99,97,116,105,111,110,114,116,0,0,0,114,80,0, + 0,0,114,113,0,0,0,41,6,114,17,0,0,0,114,110, + 0,0,0,114,114,0,0,0,114,116,0,0,0,114,137,0, + 0,0,90,6,115,101,97,114,99,104,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,92,0,0,0,159,1, + 0,0,115,36,0,0,0,0,2,10,1,8,1,4,1,6, + 2,8,1,12,1,12,1,6,1,2,255,6,3,8,1,10, + 1,2,1,14,1,12,1,12,3,4,2,114,92,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,8,0,0, + 0,8,0,0,0,67,0,0,0,115,42,1,0,0,122,10, + 124,0,106,0,125,3,87,0,110,18,4,0,116,1,121,28, + 1,0,1,0,1,0,89,0,110,14,48,0,124,3,100,0, + 117,1,114,42,124,3,83,0,124,0,106,2,125,4,124,1, + 100,0,117,0,114,86,122,10,124,0,106,3,125,1,87,0, + 110,18,4,0,116,1,121,84,1,0,1,0,1,0,89,0, + 110,2,48,0,122,10,124,0,106,4,125,5,87,0,110,22, + 4,0,116,1,121,118,1,0,1,0,1,0,100,0,125,5, + 89,0,110,2,48,0,124,2,100,0,117,0,114,176,124,5, + 100,0,117,0,114,172,122,10,124,1,106,5,125,2,87,0, + 113,176,4,0,116,1,121,168,1,0,1,0,1,0,100,0, + 125,2,89,0,113,176,48,0,110,4,124,5,125,2,122,10, + 124,0,106,6,125,6,87,0,110,22,4,0,116,1,121,208, + 1,0,1,0,1,0,100,0,125,6,89,0,110,2,48,0, + 122,14,116,7,124,0,106,8,131,1,125,7,87,0,110,22, + 4,0,116,1,121,246,1,0,1,0,1,0,100,0,125,7, + 89,0,110,2,48,0,116,9,124,4,124,1,124,2,100,1, + 141,3,125,3,124,5,100,0,117,0,144,1,114,20,100,2, + 110,2,100,3,124,3,95,10,124,6,124,3,95,11,124,7, + 124,3,95,12,124,3,83,0,41,4,78,169,1,114,114,0, + 0,0,70,84,41,13,114,106,0,0,0,114,107,0,0,0, + 114,1,0,0,0,114,99,0,0,0,114,109,0,0,0,218, + 7,95,79,82,73,71,73,78,218,10,95,95,99,97,99,104, + 101,100,95,95,218,4,108,105,115,116,218,8,95,95,112,97, + 116,104,95,95,114,113,0,0,0,114,118,0,0,0,114,123, + 0,0,0,114,117,0,0,0,41,8,114,97,0,0,0,114, + 110,0,0,0,114,114,0,0,0,114,96,0,0,0,114,17, + 0,0,0,90,8,108,111,99,97,116,105,111,110,114,123,0, + 0,0,114,117,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,17,95,115,112,101,99,95,102,114, + 111,109,95,109,111,100,117,108,101,185,1,0,0,115,72,0, + 0,0,0,2,2,1,10,1,12,1,6,2,8,1,4,2, + 6,1,8,1,2,1,10,1,12,2,6,1,2,1,10,1, + 12,1,10,1,8,1,8,1,2,1,10,1,12,1,12,2, + 4,1,2,1,10,1,12,1,10,1,2,1,14,1,12,1, + 10,2,14,1,20,1,6,1,6,1,114,143,0,0,0,70, + 169,1,218,8,111,118,101,114,114,105,100,101,99,2,0,0, + 0,0,0,0,0,1,0,0,0,5,0,0,0,8,0,0, + 0,67,0,0,0,115,210,1,0,0,124,2,115,20,116,0, + 124,1,100,1,100,0,131,3,100,0,117,0,114,52,122,12, + 124,0,106,1,124,1,95,2,87,0,110,18,4,0,116,3, + 121,50,1,0,1,0,1,0,89,0,110,2,48,0,124,2, + 115,72,116,0,124,1,100,2,100,0,131,3,100,0,117,0, + 114,174,124,0,106,4,125,3,124,3,100,0,117,0,114,144, + 124,0,106,5,100,0,117,1,114,144,116,6,100,0,117,0, + 114,108,116,7,130,1,116,6,106,8,125,4,124,4,160,9, + 124,4,161,1,125,3,124,0,106,5,124,3,95,10,124,3, + 124,0,95,4,100,0,124,1,95,11,122,10,124,3,124,1, + 95,12,87,0,110,18,4,0,116,3,121,172,1,0,1,0, + 1,0,89,0,110,2,48,0,124,2,115,194,116,0,124,1, + 100,3,100,0,131,3,100,0,117,0,114,226,122,12,124,0, + 106,13,124,1,95,14,87,0,110,18,4,0,116,3,121,224, + 1,0,1,0,1,0,89,0,110,2,48,0,122,10,124,0, + 124,1,95,15,87,0,110,18,4,0,116,3,121,254,1,0, + 1,0,1,0,89,0,110,2,48,0,124,2,144,1,115,24, + 116,0,124,1,100,4,100,0,131,3,100,0,117,0,144,1, + 114,70,124,0,106,5,100,0,117,1,144,1,114,70,122,12, + 124,0,106,5,124,1,95,16,87,0,110,20,4,0,116,3, + 144,1,121,68,1,0,1,0,1,0,89,0,110,2,48,0, + 124,0,106,17,144,1,114,206,124,2,144,1,115,102,116,0, + 124,1,100,5,100,0,131,3,100,0,117,0,144,1,114,136, + 122,12,124,0,106,18,124,1,95,11,87,0,110,20,4,0, + 116,3,144,1,121,134,1,0,1,0,1,0,89,0,110,2, + 48,0,124,2,144,1,115,160,116,0,124,1,100,6,100,0, + 131,3,100,0,117,0,144,1,114,206,124,0,106,19,100,0, + 117,1,144,1,114,206,122,12,124,0,106,19,124,1,95,20, + 87,0,110,20,4,0,116,3,144,1,121,204,1,0,1,0, + 1,0,89,0,110,2,48,0,124,1,83,0,41,7,78,114, + 1,0,0,0,114,99,0,0,0,218,11,95,95,112,97,99, + 107,97,103,101,95,95,114,142,0,0,0,114,109,0,0,0, + 114,140,0,0,0,41,21,114,6,0,0,0,114,17,0,0, + 0,114,1,0,0,0,114,107,0,0,0,114,110,0,0,0, + 114,117,0,0,0,114,127,0,0,0,114,128,0,0,0,218, + 16,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,218,7,95,95,110,101,119,95,95,90,5,95,112,97,116, + 104,114,109,0,0,0,114,99,0,0,0,114,131,0,0,0, + 114,146,0,0,0,114,106,0,0,0,114,142,0,0,0,114, + 124,0,0,0,114,114,0,0,0,114,123,0,0,0,114,140, + 0,0,0,41,5,114,96,0,0,0,114,97,0,0,0,114, + 145,0,0,0,114,110,0,0,0,114,147,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,18,95, + 105,110,105,116,95,109,111,100,117,108,101,95,97,116,116,114, + 115,230,1,0,0,115,96,0,0,0,0,4,20,1,2,1, + 12,1,12,1,6,2,20,1,6,1,8,2,10,1,8,1, + 4,1,6,2,10,1,8,1,6,11,6,1,2,1,10,1, + 12,1,6,2,20,1,2,1,12,1,12,1,6,2,2,1, + 10,1,12,1,6,2,24,1,12,1,2,1,12,1,14,1, + 6,2,8,1,24,1,2,1,12,1,14,1,6,2,24,1, + 12,1,2,1,12,1,14,1,6,1,114,149,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,67,0,0,0,115,82,0,0,0,100,1,125, + 1,116,0,124,0,106,1,100,2,131,2,114,30,124,0,106, + 1,160,2,124,0,161,1,125,1,110,20,116,0,124,0,106, + 1,100,3,131,2,114,50,116,3,100,4,131,1,130,1,124, + 1,100,1,117,0,114,68,116,4,124,0,106,5,131,1,125, + 1,116,6,124,0,124,1,131,2,1,0,124,1,83,0,41, + 5,122,43,67,114,101,97,116,101,32,97,32,109,111,100,117, + 108,101,32,98,97,115,101,100,32,111,110,32,116,104,101,32, + 112,114,111,118,105,100,101,100,32,115,112,101,99,46,78,218, + 13,99,114,101,97,116,101,95,109,111,100,117,108,101,218,11, + 101,120,101,99,95,109,111,100,117,108,101,122,66,108,111,97, + 100,101,114,115,32,116,104,97,116,32,100,101,102,105,110,101, + 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,109, + 117,115,116,32,97,108,115,111,32,100,101,102,105,110,101,32, + 99,114,101,97,116,101,95,109,111,100,117,108,101,40,41,41, + 7,114,4,0,0,0,114,110,0,0,0,114,150,0,0,0, + 114,80,0,0,0,114,18,0,0,0,114,17,0,0,0,114, + 149,0,0,0,169,2,114,96,0,0,0,114,97,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 16,109,111,100,117,108,101,95,102,114,111,109,95,115,112,101, + 99,46,2,0,0,115,18,0,0,0,0,3,4,1,12,3, + 14,1,12,1,8,2,8,1,10,1,10,1,114,153,0,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,106,0,0,0,124, + 0,106,0,100,1,117,0,114,14,100,2,110,4,124,0,106, + 0,125,1,124,0,106,1,100,1,117,0,114,66,124,0,106, + 2,100,1,117,0,114,50,100,3,160,3,124,1,161,1,83, + 0,100,4,160,3,124,1,124,0,106,2,161,2,83,0,110, + 36,124,0,106,4,114,86,100,5,160,3,124,1,124,0,106, + 1,161,2,83,0,100,6,160,3,124,0,106,0,124,0,106, + 1,161,2,83,0,100,1,83,0,41,7,122,38,82,101,116, + 117,114,110,32,116,104,101,32,114,101,112,114,32,116,111,32, + 117,115,101,32,102,111,114,32,116,104,101,32,109,111,100,117, + 108,101,46,78,114,101,0,0,0,114,102,0,0,0,114,103, + 0,0,0,114,104,0,0,0,250,18,60,109,111,100,117,108, + 101,32,123,33,114,125,32,40,123,125,41,62,41,5,114,17, + 0,0,0,114,114,0,0,0,114,110,0,0,0,114,46,0, + 0,0,114,124,0,0,0,41,2,114,96,0,0,0,114,17, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,17,95,115,112,101,99,95,102,114,111,109,95,109, - 111,100,117,108,101,176,1,0,0,115,72,0,0,0,0,2, - 2,1,10,1,14,1,6,2,8,1,4,2,6,1,8,1, - 2,1,10,1,14,2,6,1,2,1,10,1,14,1,10,1, - 8,1,8,1,2,1,10,1,14,1,12,2,4,1,2,1, - 10,1,14,1,10,1,2,1,14,1,16,1,10,2,14,1, - 20,1,6,1,6,1,114,142,0,0,0,70,169,1,218,8, - 111,118,101,114,114,105,100,101,99,2,0,0,0,0,0,0, - 0,1,0,0,0,5,0,0,0,8,0,0,0,67,0,0, - 0,115,226,1,0,0,124,2,115,20,116,0,124,1,100,1, - 100,0,131,3,100,0,107,8,114,54,122,12,124,0,106,1, - 124,1,95,2,87,0,110,20,4,0,116,3,107,10,114,52, - 1,0,1,0,1,0,89,0,110,2,88,0,124,2,115,74, - 116,0,124,1,100,2,100,0,131,3,100,0,107,8,114,178, - 124,0,106,4,125,3,124,3,100,0,107,8,114,146,124,0, - 106,5,100,0,107,9,114,146,116,6,100,0,107,8,114,110, - 116,7,130,1,116,6,106,8,125,4,124,4,160,9,124,4, - 161,1,125,3,124,0,106,5,124,3,95,10,124,3,124,0, - 95,4,100,0,124,1,95,11,122,10,124,3,124,1,95,12, - 87,0,110,20,4,0,116,3,107,10,114,176,1,0,1,0, - 1,0,89,0,110,2,88,0,124,2,115,198,116,0,124,1, - 100,3,100,0,131,3,100,0,107,8,114,232,122,12,124,0, - 106,13,124,1,95,14,87,0,110,20,4,0,116,3,107,10, - 114,230,1,0,1,0,1,0,89,0,110,2,88,0,122,10, - 124,0,124,1,95,15,87,0,110,22,4,0,116,3,107,10, - 144,1,114,8,1,0,1,0,1,0,89,0,110,2,88,0, - 124,2,144,1,115,34,116,0,124,1,100,4,100,0,131,3, - 100,0,107,8,144,1,114,82,124,0,106,5,100,0,107,9, - 144,1,114,82,122,12,124,0,106,5,124,1,95,16,87,0, - 110,22,4,0,116,3,107,10,144,1,114,80,1,0,1,0, - 1,0,89,0,110,2,88,0,124,0,106,17,144,1,114,222, - 124,2,144,1,115,114,116,0,124,1,100,5,100,0,131,3, - 100,0,107,8,144,1,114,150,122,12,124,0,106,18,124,1, - 95,11,87,0,110,22,4,0,116,3,107,10,144,1,114,148, - 1,0,1,0,1,0,89,0,110,2,88,0,124,2,144,1, - 115,174,116,0,124,1,100,6,100,0,131,3,100,0,107,8, - 144,1,114,222,124,0,106,19,100,0,107,9,144,1,114,222, - 122,12,124,0,106,19,124,1,95,20,87,0,110,22,4,0, - 116,3,107,10,144,1,114,220,1,0,1,0,1,0,89,0, - 110,2,88,0,124,1,83,0,41,7,78,114,1,0,0,0, - 114,98,0,0,0,218,11,95,95,112,97,99,107,97,103,101, - 95,95,114,141,0,0,0,114,108,0,0,0,114,139,0,0, - 0,41,21,114,6,0,0,0,114,17,0,0,0,114,1,0, - 0,0,114,106,0,0,0,114,109,0,0,0,114,117,0,0, - 0,114,126,0,0,0,114,127,0,0,0,218,16,95,78,97, - 109,101,115,112,97,99,101,76,111,97,100,101,114,218,7,95, - 95,110,101,119,95,95,90,5,95,112,97,116,104,114,108,0, - 0,0,114,98,0,0,0,114,130,0,0,0,114,145,0,0, - 0,114,105,0,0,0,114,141,0,0,0,114,124,0,0,0, - 114,113,0,0,0,114,123,0,0,0,114,139,0,0,0,41, - 5,114,95,0,0,0,114,96,0,0,0,114,144,0,0,0, - 114,109,0,0,0,114,146,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,18,95,105,110,105,116, - 95,109,111,100,117,108,101,95,97,116,116,114,115,221,1,0, - 0,115,96,0,0,0,0,4,20,1,2,1,12,1,14,1, - 6,2,20,1,6,1,8,2,10,1,8,1,4,1,6,2, - 10,1,8,1,6,11,6,1,2,1,10,1,14,1,6,2, - 20,1,2,1,12,1,14,1,6,2,2,1,10,1,16,1, - 6,2,24,1,12,1,2,1,12,1,16,1,6,2,8,1, - 24,1,2,1,12,1,16,1,6,2,24,1,12,1,2,1, - 12,1,16,1,6,1,114,148,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,82,0,0,0,100,1,125,1,116,0,124, - 0,106,1,100,2,131,2,114,30,124,0,106,1,160,2,124, - 0,161,1,125,1,110,20,116,0,124,0,106,1,100,3,131, - 2,114,50,116,3,100,4,131,1,130,1,124,1,100,1,107, - 8,114,68,116,4,124,0,106,5,131,1,125,1,116,6,124, - 0,124,1,131,2,1,0,124,1,83,0,41,5,122,43,67, - 114,101,97,116,101,32,97,32,109,111,100,117,108,101,32,98, - 97,115,101,100,32,111,110,32,116,104,101,32,112,114,111,118, - 105,100,101,100,32,115,112,101,99,46,78,218,13,99,114,101, - 97,116,101,95,109,111,100,117,108,101,218,11,101,120,101,99, - 95,109,111,100,117,108,101,122,66,108,111,97,100,101,114,115, - 32,116,104,97,116,32,100,101,102,105,110,101,32,101,120,101, - 99,95,109,111,100,117,108,101,40,41,32,109,117,115,116,32, - 97,108,115,111,32,100,101,102,105,110,101,32,99,114,101,97, - 116,101,95,109,111,100,117,108,101,40,41,41,7,114,4,0, - 0,0,114,109,0,0,0,114,149,0,0,0,114,79,0,0, - 0,114,18,0,0,0,114,17,0,0,0,114,148,0,0,0, - 169,2,114,95,0,0,0,114,96,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,16,109,111,100, - 117,108,101,95,102,114,111,109,95,115,112,101,99,37,2,0, - 0,115,18,0,0,0,0,3,4,1,12,3,14,1,12,1, - 8,2,8,1,10,1,10,1,114,152,0,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,106,0,0,0,124,0,106,0,100, - 1,107,8,114,14,100,2,110,4,124,0,106,0,125,1,124, - 0,106,1,100,1,107,8,114,66,124,0,106,2,100,1,107, - 8,114,50,100,3,160,3,124,1,161,1,83,0,100,4,160, - 3,124,1,124,0,106,2,161,2,83,0,110,36,124,0,106, - 4,114,86,100,5,160,3,124,1,124,0,106,1,161,2,83, - 0,100,6,160,3,124,0,106,0,124,0,106,1,161,2,83, - 0,100,1,83,0,41,7,122,38,82,101,116,117,114,110,32, - 116,104,101,32,114,101,112,114,32,116,111,32,117,115,101,32, - 102,111,114,32,116,104,101,32,109,111,100,117,108,101,46,78, - 114,100,0,0,0,114,101,0,0,0,114,102,0,0,0,114, - 103,0,0,0,250,18,60,109,111,100,117,108,101,32,123,33, - 114,125,32,40,123,125,41,62,41,5,114,17,0,0,0,114, - 113,0,0,0,114,109,0,0,0,114,45,0,0,0,114,124, - 0,0,0,41,2,114,95,0,0,0,114,17,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,107, - 0,0,0,54,2,0,0,115,16,0,0,0,0,3,20,1, - 10,1,10,1,10,2,16,2,6,1,14,2,114,107,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,10,0,0,0,67,0,0,0,115,204,0,0,0,124, - 0,106,0,125,2,116,1,124,2,131,1,143,180,1,0,116, - 2,106,3,160,4,124,2,161,1,124,1,107,9,114,54,100, - 1,160,5,124,2,161,1,125,3,116,6,124,3,124,2,100, - 2,141,2,130,1,122,106,124,0,106,8,100,3,107,8,114, - 106,124,0,106,9,100,3,107,8,114,90,116,6,100,4,124, - 0,106,0,100,2,141,2,130,1,116,10,124,0,124,1,100, - 5,100,6,141,3,1,0,110,52,116,10,124,0,124,1,100, - 5,100,6,141,3,1,0,116,11,124,0,106,8,100,7,131, - 2,115,146,124,0,106,8,160,12,124,2,161,1,1,0,110, - 12,124,0,106,8,160,13,124,1,161,1,1,0,87,0,53, - 0,116,2,106,3,160,7,124,0,106,0,161,1,125,1,124, - 1,116,2,106,3,124,0,106,0,60,0,88,0,87,0,53, - 0,81,0,82,0,88,0,124,1,83,0,41,8,122,70,69, - 120,101,99,117,116,101,32,116,104,101,32,115,112,101,99,39, - 115,32,115,112,101,99,105,102,105,101,100,32,109,111,100,117, - 108,101,32,105,110,32,97,110,32,101,120,105,115,116,105,110, - 103,32,109,111,100,117,108,101,39,115,32,110,97,109,101,115, - 112,97,99,101,46,122,30,109,111,100,117,108,101,32,123,33, - 114,125,32,110,111,116,32,105,110,32,115,121,115,46,109,111, - 100,117,108,101,115,114,16,0,0,0,78,250,14,109,105,115, - 115,105,110,103,32,108,111,97,100,101,114,84,114,143,0,0, - 0,114,150,0,0,0,41,14,114,17,0,0,0,114,50,0, - 0,0,114,15,0,0,0,114,92,0,0,0,114,34,0,0, - 0,114,45,0,0,0,114,79,0,0,0,218,3,112,111,112, - 114,109,0,0,0,114,117,0,0,0,114,148,0,0,0,114, - 4,0,0,0,218,11,108,111,97,100,95,109,111,100,117,108, - 101,114,150,0,0,0,41,4,114,95,0,0,0,114,96,0, - 0,0,114,17,0,0,0,218,3,109,115,103,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,93,0,0,0, - 71,2,0,0,115,34,0,0,0,0,2,6,1,10,1,16, - 1,10,1,12,1,2,1,10,1,10,1,14,2,16,2,14, - 1,12,4,14,2,16,4,14,1,24,1,114,93,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,8,0,0,0,67,0,0,0,115,26,1,0,0,122,18, - 124,0,106,0,160,1,124,0,106,2,161,1,1,0,87,0, - 110,52,1,0,1,0,1,0,124,0,106,2,116,3,106,4, - 107,6,114,64,116,3,106,4,160,5,124,0,106,2,161,1, - 125,1,124,1,116,3,106,4,124,0,106,2,60,0,130,0, - 89,0,110,2,88,0,116,3,106,4,160,5,124,0,106,2, - 161,1,125,1,124,1,116,3,106,4,124,0,106,2,60,0, - 116,6,124,1,100,1,100,0,131,3,100,0,107,8,114,148, - 122,12,124,0,106,0,124,1,95,7,87,0,110,20,4,0, - 116,8,107,10,114,146,1,0,1,0,1,0,89,0,110,2, - 88,0,116,6,124,1,100,2,100,0,131,3,100,0,107,8, - 114,226,122,40,124,1,106,9,124,1,95,10,116,11,124,1, - 100,3,131,2,115,202,124,0,106,2,160,12,100,4,161,1, - 100,5,25,0,124,1,95,10,87,0,110,20,4,0,116,8, - 107,10,114,224,1,0,1,0,1,0,89,0,110,2,88,0, - 116,6,124,1,100,6,100,0,131,3,100,0,107,8,144,1, - 114,22,122,10,124,0,124,1,95,13,87,0,110,22,4,0, - 116,8,107,10,144,1,114,20,1,0,1,0,1,0,89,0, - 110,2,88,0,124,1,83,0,41,7,78,114,98,0,0,0, - 114,145,0,0,0,114,141,0,0,0,114,128,0,0,0,114, - 22,0,0,0,114,105,0,0,0,41,14,114,109,0,0,0, + 0,0,114,108,0,0,0,63,2,0,0,115,16,0,0,0, + 0,3,20,1,10,1,10,1,10,2,16,2,6,1,14,2, + 114,108,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,10,0,0,0,67,0,0,0,115,250, + 0,0,0,124,0,106,0,125,2,116,1,124,2,131,1,143, + 216,1,0,116,2,106,3,160,4,124,2,161,1,124,1,117, + 1,114,54,100,1,160,5,124,2,161,1,125,3,116,6,124, + 3,124,2,100,2,141,2,130,1,122,132,124,0,106,7,100, + 3,117,0,114,106,124,0,106,8,100,3,117,0,114,90,116, + 6,100,4,124,0,106,0,100,2,141,2,130,1,116,9,124, + 0,124,1,100,5,100,6,141,3,1,0,110,52,116,9,124, + 0,124,1,100,5,100,6,141,3,1,0,116,10,124,0,106, + 7,100,7,131,2,115,146,124,0,106,7,160,11,124,2,161, + 1,1,0,110,12,124,0,106,7,160,12,124,1,161,1,1, + 0,87,0,116,2,106,3,160,13,124,0,106,0,161,1,125, + 1,124,1,116,2,106,3,124,0,106,0,60,0,110,28,116, + 2,106,3,160,13,124,0,106,0,161,1,125,1,124,1,116, + 2,106,3,124,0,106,0,60,0,48,0,87,0,100,3,4, + 0,4,0,131,3,1,0,110,16,49,0,115,236,48,0,1, + 0,1,0,1,0,89,0,1,0,124,1,83,0,41,8,122, + 70,69,120,101,99,117,116,101,32,116,104,101,32,115,112,101, + 99,39,115,32,115,112,101,99,105,102,105,101,100,32,109,111, + 100,117,108,101,32,105,110,32,97,110,32,101,120,105,115,116, + 105,110,103,32,109,111,100,117,108,101,39,115,32,110,97,109, + 101,115,112,97,99,101,46,122,30,109,111,100,117,108,101,32, + 123,33,114,125,32,110,111,116,32,105,110,32,115,121,115,46, + 109,111,100,117,108,101,115,114,16,0,0,0,78,250,14,109, + 105,115,115,105,110,103,32,108,111,97,100,101,114,84,114,144, + 0,0,0,114,151,0,0,0,41,14,114,17,0,0,0,114, + 51,0,0,0,114,15,0,0,0,114,93,0,0,0,114,35, + 0,0,0,114,46,0,0,0,114,80,0,0,0,114,110,0, + 0,0,114,117,0,0,0,114,149,0,0,0,114,4,0,0, + 0,218,11,108,111,97,100,95,109,111,100,117,108,101,114,151, + 0,0,0,218,3,112,111,112,41,4,114,96,0,0,0,114, + 97,0,0,0,114,17,0,0,0,218,3,109,115,103,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,94,0, + 0,0,80,2,0,0,115,38,0,0,0,0,2,6,1,10, + 1,16,1,10,1,12,1,2,1,10,1,10,1,14,2,16, + 2,14,1,12,4,14,2,14,4,14,1,14,255,14,1,44, + 1,114,94,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, + 20,1,0,0,122,18,124,0,106,0,160,1,124,0,106,2, + 161,1,1,0,87,0,110,52,1,0,1,0,1,0,124,0, + 106,2,116,3,106,4,118,0,114,64,116,3,106,4,160,5, + 124,0,106,2,161,1,125,1,124,1,116,3,106,4,124,0, + 106,2,60,0,130,0,89,0,110,2,48,0,116,3,106,4, + 160,5,124,0,106,2,161,1,125,1,124,1,116,3,106,4, + 124,0,106,2,60,0,116,6,124,1,100,1,100,0,131,3, + 100,0,117,0,114,146,122,12,124,0,106,0,124,1,95,7, + 87,0,110,18,4,0,116,8,121,144,1,0,1,0,1,0, + 89,0,110,2,48,0,116,6,124,1,100,2,100,0,131,3, + 100,0,117,0,114,222,122,40,124,1,106,9,124,1,95,10, + 116,11,124,1,100,3,131,2,115,200,124,0,106,2,160,12, + 100,4,161,1,100,5,25,0,124,1,95,10,87,0,110,18, + 4,0,116,8,121,220,1,0,1,0,1,0,89,0,110,2, + 48,0,116,6,124,1,100,6,100,0,131,3,100,0,117,0, + 144,1,114,16,122,10,124,0,124,1,95,13,87,0,110,20, + 4,0,116,8,144,1,121,14,1,0,1,0,1,0,89,0, + 110,2,48,0,124,1,83,0,41,7,78,114,99,0,0,0, + 114,146,0,0,0,114,142,0,0,0,114,129,0,0,0,114, + 22,0,0,0,114,106,0,0,0,41,14,114,110,0,0,0, 114,156,0,0,0,114,17,0,0,0,114,15,0,0,0,114, - 92,0,0,0,114,155,0,0,0,114,6,0,0,0,114,98, - 0,0,0,114,106,0,0,0,114,1,0,0,0,114,145,0, - 0,0,114,4,0,0,0,114,129,0,0,0,114,105,0,0, - 0,114,151,0,0,0,114,10,0,0,0,114,10,0,0,0, + 93,0,0,0,114,157,0,0,0,114,6,0,0,0,114,99, + 0,0,0,114,107,0,0,0,114,1,0,0,0,114,146,0, + 0,0,114,4,0,0,0,114,130,0,0,0,114,106,0,0, + 0,114,152,0,0,0,114,10,0,0,0,114,10,0,0,0, 114,11,0,0,0,218,25,95,108,111,97,100,95,98,97,99, 107,119,97,114,100,95,99,111,109,112,97,116,105,98,108,101, - 101,2,0,0,115,54,0,0,0,0,4,2,1,18,1,6, + 110,2,0,0,115,54,0,0,0,0,4,2,1,18,1,6, 1,12,1,14,1,12,1,8,3,14,1,12,1,16,1,2, - 1,12,1,14,1,6,1,16,1,2,4,8,1,10,1,22, - 1,14,1,6,1,18,1,2,1,10,1,16,1,6,1,114, - 158,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,11,0,0,0,67,0,0,0,115,220,0, - 0,0,124,0,106,0,100,0,107,9,114,30,116,1,124,0, + 1,12,1,12,1,6,1,16,1,2,4,8,1,10,1,22, + 1,12,1,6,1,18,1,2,1,10,1,14,1,6,1,114, + 159,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,11,0,0,0,67,0,0,0,115,224,0, + 0,0,124,0,106,0,100,0,117,1,114,30,116,1,124,0, 106,0,100,1,131,2,115,30,116,2,124,0,131,1,83,0, - 116,3,124,0,131,1,125,1,100,2,124,0,95,4,122,162, + 116,3,124,0,131,1,125,1,100,2,124,0,95,4,122,166, 124,1,116,5,106,6,124,0,106,7,60,0,122,52,124,0, - 106,0,100,0,107,8,114,96,124,0,106,8,100,0,107,8, - 114,108,116,9,100,4,124,0,106,7,100,5,141,2,130,1, + 106,0,100,0,117,0,114,96,124,0,106,8,100,0,117,0, + 114,108,116,9,100,3,124,0,106,7,100,4,141,2,130,1, 110,12,124,0,106,0,160,10,124,1,161,1,1,0,87,0, - 110,50,1,0,1,0,1,0,122,14,116,5,106,6,124,0, - 106,7,61,0,87,0,110,20,4,0,116,11,107,10,114,152, - 1,0,1,0,1,0,89,0,110,2,88,0,130,0,89,0, - 110,2,88,0,116,5,106,6,160,12,124,0,106,7,161,1, - 125,1,124,1,116,5,106,6,124,0,106,7,60,0,116,13, - 100,6,124,0,106,7,124,0,106,0,131,3,1,0,87,0, - 53,0,100,3,124,0,95,4,88,0,124,1,83,0,41,7, - 78,114,150,0,0,0,84,70,114,154,0,0,0,114,16,0, - 0,0,122,18,105,109,112,111,114,116,32,123,33,114,125,32, - 35,32,123,33,114,125,41,14,114,109,0,0,0,114,4,0, - 0,0,114,158,0,0,0,114,152,0,0,0,90,13,95,105, - 110,105,116,105,97,108,105,122,105,110,103,114,15,0,0,0, - 114,92,0,0,0,114,17,0,0,0,114,117,0,0,0,114, - 79,0,0,0,114,150,0,0,0,114,63,0,0,0,114,155, - 0,0,0,114,76,0,0,0,114,151,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,14,95,108, - 111,97,100,95,117,110,108,111,99,107,101,100,138,2,0,0, - 115,46,0,0,0,0,2,10,2,12,1,8,2,8,5,6, - 1,2,1,12,1,2,1,10,1,10,1,16,3,16,1,6, - 1,2,1,14,1,14,1,6,1,8,5,14,1,12,1,20, - 2,8,2,114,159,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,10,0,0,0,67,0,0, - 0,115,42,0,0,0,116,0,124,0,106,1,131,1,143,22, - 1,0,116,2,124,0,131,1,87,0,2,0,53,0,81,0, - 82,0,163,0,83,0,81,0,82,0,88,0,100,1,83,0, + 110,48,1,0,1,0,1,0,122,14,116,5,106,6,124,0, + 106,7,61,0,87,0,110,18,4,0,116,11,121,150,1,0, + 1,0,1,0,89,0,110,2,48,0,130,0,89,0,110,2, + 48,0,116,5,106,6,160,12,124,0,106,7,161,1,125,1, + 124,1,116,5,106,6,124,0,106,7,60,0,116,13,100,5, + 124,0,106,7,124,0,106,0,131,3,1,0,87,0,100,6, + 124,0,95,4,110,8,100,6,124,0,95,4,48,0,124,1, + 83,0,41,7,78,114,151,0,0,0,84,114,155,0,0,0, + 114,16,0,0,0,122,18,105,109,112,111,114,116,32,123,33, + 114,125,32,35,32,123,33,114,125,70,41,14,114,110,0,0, + 0,114,4,0,0,0,114,159,0,0,0,114,153,0,0,0, + 90,13,95,105,110,105,116,105,97,108,105,122,105,110,103,114, + 15,0,0,0,114,93,0,0,0,114,17,0,0,0,114,117, + 0,0,0,114,80,0,0,0,114,151,0,0,0,114,64,0, + 0,0,114,157,0,0,0,114,77,0,0,0,114,152,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,14,95,108,111,97,100,95,117,110,108,111,99,107,101,100, + 147,2,0,0,115,46,0,0,0,0,2,10,2,12,1,8, + 2,8,5,6,1,2,1,12,1,2,1,10,1,10,1,16, + 3,16,1,6,1,2,1,14,1,12,1,6,1,8,5,14, + 1,12,1,18,2,16,2,114,160,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, + 0,67,0,0,0,115,54,0,0,0,116,0,124,0,106,1, + 131,1,143,24,1,0,116,2,124,0,131,1,87,0,2,0, + 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,40, + 48,0,1,0,1,0,1,0,89,0,1,0,100,1,83,0, 41,2,122,191,82,101,116,117,114,110,32,97,32,110,101,119, 32,109,111,100,117,108,101,32,111,98,106,101,99,116,44,32, 108,111,97,100,101,100,32,98,121,32,116,104,101,32,115,112, @@ -1018,772 +1027,786 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 108,101,115,44,32,116,104,97,116,32,101,120,105,115,116,105, 110,103,32,109,111,100,117,108,101,32,103,101,116,115,10,32, 32,32,32,99,108,111,98,98,101,114,101,100,46,10,10,32, - 32,32,32,78,41,3,114,50,0,0,0,114,17,0,0,0, - 114,159,0,0,0,41,1,114,95,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,94,0,0,0, - 180,2,0,0,115,4,0,0,0,0,9,12,1,114,94,0, + 32,32,32,78,41,3,114,51,0,0,0,114,17,0,0,0, + 114,160,0,0,0,41,1,114,96,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,95,0,0,0, + 189,2,0,0,115,4,0,0,0,0,9,12,1,114,95,0, 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,136,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,6,100,19,100,5,100,6, - 132,1,131,1,90,7,101,6,100,20,100,7,100,8,132,1, - 131,1,90,8,101,6,100,9,100,10,132,0,131,1,90,9, - 101,6,100,11,100,12,132,0,131,1,90,10,101,6,101,11, - 100,13,100,14,132,0,131,1,131,1,90,12,101,6,101,11, - 100,15,100,16,132,0,131,1,131,1,90,13,101,6,101,11, - 100,17,100,18,132,0,131,1,131,1,90,14,101,6,101,15, - 131,1,90,16,100,4,83,0,41,21,218,15,66,117,105,108, - 116,105,110,73,109,112,111,114,116,101,114,122,144,77,101,116, - 97,32,112,97,116,104,32,105,109,112,111,114,116,32,102,111, - 114,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 0,0,0,4,0,0,0,64,0,0,0,115,140,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, + 101,5,100,3,100,4,132,0,131,1,90,6,101,7,100,20, + 100,6,100,7,132,1,131,1,90,8,101,7,100,21,100,8, + 100,9,132,1,131,1,90,9,101,7,100,10,100,11,132,0, + 131,1,90,10,101,7,100,12,100,13,132,0,131,1,90,11, + 101,7,101,12,100,14,100,15,132,0,131,1,131,1,90,13, + 101,7,101,12,100,16,100,17,132,0,131,1,131,1,90,14, + 101,7,101,12,100,18,100,19,132,0,131,1,131,1,90,15, + 101,7,101,16,131,1,90,17,100,5,83,0,41,22,218,15, + 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,122, + 144,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, + 116,32,102,111,114,32,98,117,105,108,116,45,105,110,32,109, + 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, + 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, + 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, + 116,105,99,32,109,101,116,104,111,100,115,32,116,111,32,97, + 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, + 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, + 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, + 32,122,8,98,117,105,108,116,45,105,110,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,22,0,0,0,100,1,124,0,106,0,155, + 2,100,2,116,1,106,2,155,0,100,3,157,5,83,0,41, + 4,250,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,8,60,109,111,100,117,108,101,32, + 122,2,32,40,122,2,41,62,41,3,114,1,0,0,0,114, + 161,0,0,0,114,139,0,0,0,41,1,114,97,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 100,0,0,0,215,2,0,0,115,2,0,0,0,0,7,122, + 27,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, + 46,109,111,100,117,108,101,95,114,101,112,114,78,99,4,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, + 0,0,67,0,0,0,115,46,0,0,0,124,2,100,0,117, + 1,114,12,100,0,83,0,116,0,160,1,124,1,161,1,114, + 38,116,2,124,1,124,0,124,0,106,3,100,1,141,3,83, + 0,100,0,83,0,100,0,83,0,169,2,78,114,138,0,0, + 0,41,4,114,58,0,0,0,90,10,105,115,95,98,117,105, + 108,116,105,110,114,92,0,0,0,114,139,0,0,0,169,4, + 218,3,99,108,115,114,82,0,0,0,218,4,112,97,116,104, + 218,6,116,97,114,103,101,116,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,9,102,105,110,100,95,115,112, + 101,99,224,2,0,0,115,10,0,0,0,0,2,8,1,4, + 1,10,1,16,2,122,25,66,117,105,108,116,105,110,73,109, + 112,111,114,116,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,117,1, + 114,26,124,3,106,1,83,0,100,1,83,0,41,2,122,175, + 70,105,110,100,32,116,104,101,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, + 32,32,32,73,102,32,39,112,97,116,104,39,32,105,115,32, + 101,118,101,114,32,115,112,101,99,105,102,105,101,100,32,116, + 104,101,110,32,116,104,101,32,115,101,97,114,99,104,32,105, + 115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,102, + 97,105,108,117,114,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, + 41,2,114,168,0,0,0,114,110,0,0,0,41,4,114,165, + 0,0,0,114,82,0,0,0,114,166,0,0,0,114,96,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,11,102,105,110,100,95,109,111,100,117,108,101,233,2, + 0,0,115,4,0,0,0,0,9,12,1,122,27,66,117,105, + 108,116,105,110,73,109,112,111,114,116,101,114,46,102,105,110, + 100,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,46,0,0,0,124,1,106,0,116,1,106,2,118,1, + 114,34,116,3,100,1,160,4,124,1,106,0,161,1,124,1, + 106,0,100,2,141,2,130,1,116,5,116,6,106,7,124,1, + 131,2,83,0,41,3,122,24,67,114,101,97,116,101,32,97, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 114,78,0,0,0,114,16,0,0,0,41,8,114,17,0,0, + 0,114,15,0,0,0,114,79,0,0,0,114,80,0,0,0, + 114,46,0,0,0,114,68,0,0,0,114,58,0,0,0,90, + 14,99,114,101,97,116,101,95,98,117,105,108,116,105,110,41, + 2,114,30,0,0,0,114,96,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,150,0,0,0,245, + 2,0,0,115,10,0,0,0,0,3,12,1,12,1,4,255, + 6,2,122,29,66,117,105,108,116,105,110,73,109,112,111,114, + 116,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,3,0,0,0,67,0,0,0,115,16,0,0,0,116, + 0,116,1,106,2,124,1,131,2,1,0,100,1,83,0,41, + 2,122,22,69,120,101,99,32,97,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,78,41,3,114,68,0,0, + 0,114,58,0,0,0,90,12,101,120,101,99,95,98,117,105, + 108,116,105,110,41,2,114,30,0,0,0,114,97,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 151,0,0,0,253,2,0,0,115,2,0,0,0,0,3,122, + 27,66,117,105,108,116,105,110,73,109,112,111,114,116,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,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, + 122,57,82,101,116,117,114,110,32,78,111,110,101,32,97,115, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 115,32,100,111,32,110,111,116,32,104,97,118,101,32,99,111, + 100,101,32,111,98,106,101,99,116,115,46,78,114,10,0,0, + 0,169,2,114,165,0,0,0,114,82,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,8,103,101, + 116,95,99,111,100,101,2,3,0,0,115,2,0,0,0,0, + 4,122,24,66,117,105,108,116,105,110,73,109,112,111,114,116, + 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, + 56,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, + 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, + 114,99,101,32,99,111,100,101,46,78,114,10,0,0,0,114, + 170,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,8, + 3,0,0,115,2,0,0,0,0,4,122,26,66,117,105,108, + 116,105,110,73,109,112,111,114,116,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, + 4,0,0,0,100,1,83,0,41,2,122,52,82,101,116,117, + 114,110,32,70,97,108,115,101,32,97,115,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,115,32,97,114,101, + 32,110,101,118,101,114,32,112,97,99,107,97,103,101,115,46, + 70,114,10,0,0,0,114,170,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,116,0,0,0,14, + 3,0,0,115,2,0,0,0,0,4,122,26,66,117,105,108, + 116,105,110,73,109,112,111,114,116,101,114,46,105,115,95,112, + 97,99,107,97,103,101,41,2,78,78,41,1,78,41,18,114, + 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, + 0,0,0,114,139,0,0,0,218,12,115,116,97,116,105,99, + 109,101,116,104,111,100,114,100,0,0,0,218,11,99,108,97, + 115,115,109,101,116,104,111,100,114,168,0,0,0,114,169,0, + 0,0,114,150,0,0,0,114,151,0,0,0,114,87,0,0, + 0,114,171,0,0,0,114,172,0,0,0,114,116,0,0,0, + 114,98,0,0,0,114,156,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,161, + 0,0,0,204,2,0,0,115,44,0,0,0,8,2,4,7, + 4,2,2,1,10,8,2,1,12,8,2,1,12,11,2,1, + 10,7,2,1,10,4,2,1,2,1,12,4,2,1,2,1, + 12,4,2,1,2,1,12,4,114,161,0,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,144,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,90,4,101,5,100,3,100, + 4,132,0,131,1,90,6,101,7,100,22,100,6,100,7,132, + 1,131,1,90,8,101,7,100,23,100,8,100,9,132,1,131, + 1,90,9,101,7,100,10,100,11,132,0,131,1,90,10,101, + 5,100,12,100,13,132,0,131,1,90,11,101,7,100,14,100, + 15,132,0,131,1,90,12,101,7,101,13,100,16,100,17,132, + 0,131,1,131,1,90,14,101,7,101,13,100,18,100,19,132, + 0,131,1,131,1,90,15,101,7,101,13,100,20,100,21,132, + 0,131,1,131,1,90,16,100,5,83,0,41,24,218,14,70, + 114,111,122,101,110,73,109,112,111,114,116,101,114,122,142,77, + 101,116,97,32,112,97,116,104,32,105,109,112,111,114,116,32, + 102,111,114,32,102,114,111,122,101,110,32,109,111,100,117,108, 101,115,46,10,10,32,32,32,32,65,108,108,32,109,101,116, 104,111,100,115,32,97,114,101,32,101,105,116,104,101,114,32, 99,108,97,115,115,32,111,114,32,115,116,97,116,105,99,32, 109,101,116,104,111,100,115,32,116,111,32,97,118,111,105,100, 32,116,104,101,32,110,101,101,100,32,116,111,10,32,32,32, 32,105,110,115,116,97,110,116,105,97,116,101,32,116,104,101, - 32,99,108,97,115,115,46,10,10,32,32,32,32,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,250,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,24, - 60,109,111,100,117,108,101,32,123,33,114,125,32,40,98,117, - 105,108,116,45,105,110,41,62,41,2,114,45,0,0,0,114, - 1,0,0,0,41,1,114,96,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,99,0,0,0,204, - 2,0,0,115,2,0,0,0,0,7,122,27,66,117,105,108, - 116,105,110,73,109,112,111,114,116,101,114,46,109,111,100,117, - 108,101,95,114,101,112,114,78,99,4,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, - 0,115,44,0,0,0,124,2,100,0,107,9,114,12,100,0, - 83,0,116,0,160,1,124,1,161,1,114,36,116,2,124,1, - 124,0,100,1,100,2,141,3,83,0,100,0,83,0,100,0, - 83,0,41,3,78,122,8,98,117,105,108,116,45,105,110,114, - 137,0,0,0,41,3,114,57,0,0,0,90,10,105,115,95, - 98,117,105,108,116,105,110,114,91,0,0,0,169,4,218,3, - 99,108,115,114,81,0,0,0,218,4,112,97,116,104,218,6, - 116,97,114,103,101,116,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,9,102,105,110,100,95,115,112,101,99, - 213,2,0,0,115,10,0,0,0,0,2,8,1,4,1,10, - 1,14,2,122,25,66,117,105,108,116,105,110,73,109,112,111, - 114,116,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,9,114,26, - 124,3,106,1,83,0,100,1,83,0,41,2,122,175,70,105, - 110,100,32,116,104,101,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, - 32,73,102,32,39,112,97,116,104,39,32,105,115,32,101,118, - 101,114,32,115,112,101,99,105,102,105,101,100,32,116,104,101, - 110,32,116,104,101,32,115,101,97,114,99,104,32,105,115,32, - 99,111,110,115,105,100,101,114,101,100,32,97,32,102,97,105, - 108,117,114,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,41,2, - 114,166,0,0,0,114,109,0,0,0,41,4,114,163,0,0, - 0,114,81,0,0,0,114,164,0,0,0,114,95,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 11,102,105,110,100,95,109,111,100,117,108,101,222,2,0,0, - 115,4,0,0,0,0,9,12,1,122,27,66,117,105,108,116, - 105,110,73,109,112,111,114,116,101,114,46,102,105,110,100,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, - 46,0,0,0,124,1,106,0,116,1,106,2,107,7,114,34, - 116,3,100,1,160,4,124,1,106,0,161,1,124,1,106,0, - 100,2,141,2,130,1,116,5,116,6,106,7,124,1,131,2, - 83,0,41,3,122,24,67,114,101,97,116,101,32,97,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,114,77, - 0,0,0,114,16,0,0,0,41,8,114,17,0,0,0,114, - 15,0,0,0,114,78,0,0,0,114,79,0,0,0,114,45, - 0,0,0,114,67,0,0,0,114,57,0,0,0,90,14,99, - 114,101,97,116,101,95,98,117,105,108,116,105,110,41,2,114, - 30,0,0,0,114,95,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,149,0,0,0,234,2,0, - 0,115,10,0,0,0,0,3,12,1,12,1,4,255,6,2, - 122,29,66,117,105,108,116,105,110,73,109,112,111,114,116,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, - 3,0,0,0,67,0,0,0,115,16,0,0,0,116,0,116, - 1,106,2,124,1,131,2,1,0,100,1,83,0,41,2,122, - 22,69,120,101,99,32,97,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,78,41,3,114,67,0,0,0,114, - 57,0,0,0,90,12,101,120,101,99,95,98,117,105,108,116, - 105,110,41,2,114,30,0,0,0,114,96,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,150,0, - 0,0,242,2,0,0,115,2,0,0,0,0,3,122,27,66, - 117,105,108,116,105,110,73,109,112,111,114,116,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,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,57, - 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, - 100,111,32,110,111,116,32,104,97,118,101,32,99,111,100,101, - 32,111,98,106,101,99,116,115,46,78,114,10,0,0,0,169, - 2,114,163,0,0,0,114,81,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,8,103,101,116,95, - 99,111,100,101,247,2,0,0,115,2,0,0,0,0,4,122, - 24,66,117,105,108,116,105,110,73,109,112,111,114,116,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,56,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,100, - 111,32,110,111,116,32,104,97,118,101,32,115,111,117,114,99, - 101,32,99,111,100,101,46,78,114,10,0,0,0,114,168,0, + 32,99,108,97,115,115,46,10,10,32,32,32,32,90,6,102, + 114,111,122,101,110,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,16, + 0,0,0,100,1,160,0,124,0,106,1,116,2,106,3,161, + 2,83,0,41,2,114,162,0,0,0,114,154,0,0,0,41, + 4,114,46,0,0,0,114,1,0,0,0,114,175,0,0,0, + 114,139,0,0,0,41,1,218,1,109,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,100,0,0,0,34,3, + 0,0,115,2,0,0,0,0,7,122,26,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,109,111,100,117,108,101, + 95,114,101,112,114,78,99,4,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, + 34,0,0,0,116,0,160,1,124,1,161,1,114,26,116,2, + 124,1,124,0,124,0,106,3,100,1,141,3,83,0,100,0, + 83,0,100,0,83,0,114,163,0,0,0,41,4,114,58,0, + 0,0,114,89,0,0,0,114,92,0,0,0,114,139,0,0, + 0,114,164,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,168,0,0,0,43,3,0,0,115,6, + 0,0,0,0,2,10,1,16,2,122,24,70,114,111,122,101, + 110,73,109,112,111,114,116,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, + 3,0,0,0,3,0,0,0,67,0,0,0,115,18,0,0, + 0,116,0,160,1,124,1,161,1,114,14,124,0,83,0,100, + 1,83,0,41,2,122,93,70,105,110,100,32,97,32,102,114, + 111,122,101,110,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,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,2,114,58,0,0,0,114,89,0,0, + 0,41,3,114,165,0,0,0,114,82,0,0,0,114,166,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,10,103,101,116,95,115,111,117,114,99,101,253,2,0, - 0,115,2,0,0,0,0,4,122,26,66,117,105,108,116,105, - 110,73,109,112,111,114,116,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,4,0, - 0,0,100,1,83,0,41,2,122,52,82,101,116,117,114,110, - 32,70,97,108,115,101,32,97,115,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,32,97,114,101,32,110, - 101,118,101,114,32,112,97,99,107,97,103,101,115,46,70,114, - 10,0,0,0,114,168,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,115,0,0,0,3,3,0, - 0,115,2,0,0,0,0,4,122,26,66,117,105,108,116,105, - 110,73,109,112,111,114,116,101,114,46,105,115,95,112,97,99, - 107,97,103,101,41,2,78,78,41,1,78,41,17,114,1,0, - 0,0,114,0,0,0,0,114,2,0,0,0,114,3,0,0, - 0,218,12,115,116,97,116,105,99,109,101,116,104,111,100,114, - 99,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111, - 100,114,166,0,0,0,114,167,0,0,0,114,149,0,0,0, - 114,150,0,0,0,114,86,0,0,0,114,169,0,0,0,114, - 170,0,0,0,114,115,0,0,0,114,97,0,0,0,114,156, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,160,0,0,0,195,2,0,0, - 115,42,0,0,0,8,2,4,7,2,1,10,8,2,1,12, - 8,2,1,12,11,2,1,10,7,2,1,10,4,2,1,2, - 1,12,4,2,1,2,1,12,4,2,1,2,1,12,4,114, - 160,0,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,144,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 90,4,101,5,100,3,100,4,132,0,131,1,90,6,101,7, - 100,22,100,6,100,7,132,1,131,1,90,8,101,7,100,23, - 100,8,100,9,132,1,131,1,90,9,101,7,100,10,100,11, - 132,0,131,1,90,10,101,5,100,12,100,13,132,0,131,1, - 90,11,101,7,100,14,100,15,132,0,131,1,90,12,101,7, - 101,13,100,16,100,17,132,0,131,1,131,1,90,14,101,7, - 101,13,100,18,100,19,132,0,131,1,131,1,90,15,101,7, - 101,13,100,20,100,21,132,0,131,1,131,1,90,16,100,5, - 83,0,41,24,218,14,70,114,111,122,101,110,73,109,112,111, - 114,116,101,114,122,142,77,101,116,97,32,112,97,116,104,32, - 105,109,112,111,114,116,32,102,111,114,32,102,114,111,122,101, - 110,32,109,111,100,117,108,101,115,46,10,10,32,32,32,32, - 65,108,108,32,109,101,116,104,111,100,115,32,97,114,101,32, - 101,105,116,104,101,114,32,99,108,97,115,115,32,111,114,32, - 115,116,97,116,105,99,32,109,101,116,104,111,100,115,32,116, - 111,32,97,118,111,105,100,32,116,104,101,32,110,101,101,100, - 32,116,111,10,32,32,32,32,105,110,115,116,97,110,116,105, - 97,116,101,32,116,104,101,32,99,108,97,115,115,46,10,10, - 32,32,32,32,90,6,102,114,111,122,101,110,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,16,0,0,0,100,1,160,0,124,0, - 106,1,116,2,106,3,161,2,83,0,41,2,114,161,0,0, - 0,114,153,0,0,0,41,4,114,45,0,0,0,114,1,0, - 0,0,114,173,0,0,0,114,138,0,0,0,41,1,218,1, - 109,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,99,0,0,0,23,3,0,0,115,2,0,0,0,0,7, - 122,26,70,114,111,122,101,110,73,109,112,111,114,116,101,114, - 46,109,111,100,117,108,101,95,114,101,112,114,78,99,4,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, - 0,0,67,0,0,0,115,34,0,0,0,116,0,160,1,124, - 1,161,1,114,26,116,2,124,1,124,0,124,0,106,3,100, - 1,141,3,83,0,100,0,83,0,100,0,83,0,41,2,78, - 114,137,0,0,0,41,4,114,57,0,0,0,114,88,0,0, - 0,114,91,0,0,0,114,138,0,0,0,114,162,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 166,0,0,0,32,3,0,0,115,6,0,0,0,0,2,10, - 1,16,2,122,24,70,114,111,122,101,110,73,109,112,111,114, - 116,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,3,0,0,0,3,0, - 0,0,67,0,0,0,115,18,0,0,0,116,0,160,1,124, - 1,161,1,114,14,124,0,83,0,100,1,83,0,41,2,122, - 93,70,105,110,100,32,97,32,102,114,111,122,101,110,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, - 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, - 2,114,57,0,0,0,114,88,0,0,0,41,3,114,163,0, - 0,0,114,81,0,0,0,114,164,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,167,0,0,0, - 39,3,0,0,115,2,0,0,0,0,7,122,26,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,102,105,110,100, - 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,1,83,0,41,2,122,42,85,115,101, - 32,100,101,102,97,117,108,116,32,115,101,109,97,110,116,105, - 99,115,32,102,111,114,32,109,111,100,117,108,101,32,99,114, - 101,97,116,105,111,110,46,78,114,10,0,0,0,41,2,114, - 163,0,0,0,114,95,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,149,0,0,0,48,3,0, - 0,115,2,0,0,0,0,2,122,28,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,46,99,114,101,97,116,101,95, - 109,111,100,117,108,101,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,124,0,106,0,106,1,125,1,116,2,160,3, - 124,1,161,1,115,36,116,4,100,1,160,5,124,1,161,1, - 124,1,100,2,141,2,130,1,116,6,116,2,106,7,124,1, - 131,2,125,2,116,8,124,2,124,0,106,9,131,2,1,0, - 100,0,83,0,114,87,0,0,0,41,10,114,105,0,0,0, - 114,17,0,0,0,114,57,0,0,0,114,88,0,0,0,114, - 79,0,0,0,114,45,0,0,0,114,67,0,0,0,218,17, - 103,101,116,95,102,114,111,122,101,110,95,111,98,106,101,99, - 116,218,4,101,120,101,99,114,7,0,0,0,41,3,114,96, - 0,0,0,114,17,0,0,0,218,4,99,111,100,101,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,150,0, - 0,0,52,3,0,0,115,14,0,0,0,0,2,8,1,10, - 1,10,1,2,255,6,2,12,1,122,26,70,114,111,122,101, - 110,73,109,112,111,114,116,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,3,0,0,0,67,0,0,0,115,10, - 0,0,0,116,0,124,0,124,1,131,2,83,0,41,1,122, - 95,76,111,97,100,32,97,32,102,114,111,122,101,110,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, - 41,1,114,97,0,0,0,114,168,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,156,0,0,0, - 61,3,0,0,115,2,0,0,0,0,7,122,26,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,108,111,97,100, - 95,109,111,100,117,108,101,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,10,0,0,0,116,0,160,1,124,1,161,1,83,0,41, - 1,122,45,82,101,116,117,114,110,32,116,104,101,32,99,111, - 100,101,32,111,98,106,101,99,116,32,102,111,114,32,116,104, - 101,32,102,114,111,122,101,110,32,109,111,100,117,108,101,46, - 41,2,114,57,0,0,0,114,175,0,0,0,114,168,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,169,0,0,0,70,3,0,0,115,2,0,0,0,0,4, - 122,23,70,114,111,122,101,110,73,109,112,111,114,116,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,54,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,115,32,100,111,32, - 110,111,116,32,104,97,118,101,32,115,111,117,114,99,101,32, - 99,111,100,101,46,78,114,10,0,0,0,114,168,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 170,0,0,0,76,3,0,0,115,2,0,0,0,0,4,122, - 25,70,114,111,122,101,110,73,109,112,111,114,116,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,3,0,0,0,67, - 0,0,0,115,10,0,0,0,116,0,160,1,124,1,161,1, - 83,0,41,1,122,46,82,101,116,117,114,110,32,84,114,117, - 101,32,105,102,32,116,104,101,32,102,114,111,122,101,110,32, - 109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,107, - 97,103,101,46,41,2,114,57,0,0,0,90,17,105,115,95, - 102,114,111,122,101,110,95,112,97,99,107,97,103,101,114,168, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,115,0,0,0,82,3,0,0,115,2,0,0,0, - 0,4,122,25,70,114,111,122,101,110,73,109,112,111,114,116, - 101,114,46,105,115,95,112,97,99,107,97,103,101,41,2,78, - 78,41,1,78,41,17,114,1,0,0,0,114,0,0,0,0, - 114,2,0,0,0,114,3,0,0,0,114,138,0,0,0,114, - 171,0,0,0,114,99,0,0,0,114,172,0,0,0,114,166, - 0,0,0,114,167,0,0,0,114,149,0,0,0,114,150,0, - 0,0,114,156,0,0,0,114,90,0,0,0,114,169,0,0, - 0,114,170,0,0,0,114,115,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 173,0,0,0,12,3,0,0,115,46,0,0,0,8,2,4, - 7,4,2,2,1,10,8,2,1,12,6,2,1,12,8,2, - 1,10,3,2,1,10,8,2,1,10,8,2,1,2,1,12, - 4,2,1,2,1,12,4,2,1,2,1,114,173,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,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,18,95,73,109,112,111,114,116,76,111,99,107,67,111,110, - 116,101,120,116,122,36,67,111,110,116,101,120,116,32,109,97, - 110,97,103,101,114,32,102,111,114,32,116,104,101,32,105,109, - 112,111,114,116,32,108,111,99,107,46,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,12,0,0,0,116,0,160,1,161,0,1,0, - 100,1,83,0,41,2,122,24,65,99,113,117,105,114,101,32, - 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, - 78,41,2,114,57,0,0,0,114,58,0,0,0,114,47,0, + 0,114,169,0,0,0,50,3,0,0,115,2,0,0,0,0, + 7,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,46,102,105,110,100,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,1,83,0,41, + 2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,115, + 101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,100, + 117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,10, + 0,0,0,41,2,114,165,0,0,0,114,96,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,150, + 0,0,0,59,3,0,0,115,2,0,0,0,0,2,122,28, + 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,99, + 114,101,97,116,101,95,109,111,100,117,108,101,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,124,0,106,0,106,1, + 125,1,116,2,160,3,124,1,161,1,115,36,116,4,100,1, + 160,5,124,1,161,1,124,1,100,2,141,2,130,1,116,6, + 116,2,106,7,124,1,131,2,125,2,116,8,124,2,124,0, + 106,9,131,2,1,0,100,0,83,0,114,88,0,0,0,41, + 10,114,106,0,0,0,114,17,0,0,0,114,58,0,0,0, + 114,89,0,0,0,114,80,0,0,0,114,46,0,0,0,114, + 68,0,0,0,218,17,103,101,116,95,102,114,111,122,101,110, + 95,111,98,106,101,99,116,218,4,101,120,101,99,114,7,0, + 0,0,41,3,114,97,0,0,0,114,17,0,0,0,218,4, + 99,111,100,101,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,151,0,0,0,63,3,0,0,115,14,0,0, + 0,0,2,8,1,10,1,10,1,2,255,6,2,12,1,122, + 26,70,114,111,122,101,110,73,109,112,111,114,116,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,3,0,0,0, + 67,0,0,0,115,10,0,0,0,116,0,124,0,124,1,131, + 2,83,0,41,1,122,95,76,111,97,100,32,97,32,102,114, + 111,122,101,110,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,41,1,114,98,0,0,0,114,170,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,54,0,0,0,95,3,0,0,115,2,0,0,0,0, - 2,122,28,95,73,109,112,111,114,116,76,111,99,107,67,111, - 110,116,101,120,116,46,95,95,101,110,116,101,114,95,95,99, - 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 2,0,0,0,67,0,0,0,115,12,0,0,0,116,0,160, - 1,161,0,1,0,100,1,83,0,41,2,122,60,82,101,108, - 101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32, - 108,111,99,107,32,114,101,103,97,114,100,108,101,115,115,32, - 111,102,32,97,110,121,32,114,97,105,115,101,100,32,101,120, - 99,101,112,116,105,111,110,115,46,78,41,2,114,57,0,0, - 0,114,59,0,0,0,41,4,114,30,0,0,0,218,8,101, - 120,99,95,116,121,112,101,218,9,101,120,99,95,118,97,108, - 117,101,218,13,101,120,99,95,116,114,97,99,101,98,97,99, - 107,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,56,0,0,0,99,3,0,0,115,2,0,0,0,0,2, - 122,27,95,73,109,112,111,114,116,76,111,99,107,67,111,110, - 116,101,120,116,46,95,95,101,120,105,116,95,95,78,41,6, - 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, - 3,0,0,0,114,54,0,0,0,114,56,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,178,0,0,0,91,3,0,0,115,6,0,0,0, - 8,2,4,2,8,4,114,178,0,0,0,99,3,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, - 67,0,0,0,115,64,0,0,0,124,1,160,0,100,1,124, - 2,100,2,24,0,161,2,125,3,116,1,124,3,131,1,124, - 2,107,0,114,36,116,2,100,3,131,1,130,1,124,3,100, - 4,25,0,125,4,124,0,114,60,100,5,160,3,124,4,124, - 0,161,2,83,0,124,4,83,0,41,6,122,50,82,101,115, - 111,108,118,101,32,97,32,114,101,108,97,116,105,118,101,32, - 109,111,100,117,108,101,32,110,97,109,101,32,116,111,32,97, - 110,32,97,98,115,111,108,117,116,101,32,111,110,101,46,114, - 128,0,0,0,114,37,0,0,0,122,50,97,116,116,101,109, - 112,116,101,100,32,114,101,108,97,116,105,118,101,32,105,109, - 112,111,114,116,32,98,101,121,111,110,100,32,116,111,112,45, - 108,101,118,101,108,32,112,97,99,107,97,103,101,114,22,0, - 0,0,250,5,123,125,46,123,125,41,4,218,6,114,115,112, - 108,105,116,218,3,108,101,110,218,10,86,97,108,117,101,69, - 114,114,111,114,114,45,0,0,0,41,5,114,17,0,0,0, - 218,7,112,97,99,107,97,103,101,218,5,108,101,118,101,108, - 90,4,98,105,116,115,90,4,98,97,115,101,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,13,95,114,101, - 115,111,108,118,101,95,110,97,109,101,104,3,0,0,115,10, - 0,0,0,0,2,16,1,12,1,8,1,8,1,114,188,0, - 0,0,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,34,0,0,0, - 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,0, - 107,8,114,24,100,0,83,0,116,1,124,1,124,3,131,2, - 83,0,114,13,0,0,0,41,2,114,167,0,0,0,114,91, - 0,0,0,41,4,218,6,102,105,110,100,101,114,114,17,0, - 0,0,114,164,0,0,0,114,109,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,17,95,102,105, - 110,100,95,115,112,101,99,95,108,101,103,97,99,121,113,3, - 0,0,115,8,0,0,0,0,3,12,1,8,1,4,1,114, - 190,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,10,0,0,0,10,0,0,0,67,0,0,0,115,12,1, - 0,0,116,0,106,1,125,3,124,3,100,1,107,8,114,22, - 116,2,100,2,131,1,130,1,124,3,115,38,116,3,160,4, - 100,3,116,5,161,2,1,0,124,0,116,0,106,6,107,6, - 125,4,124,3,68,0,93,210,125,5,116,7,131,0,143,84, - 1,0,122,10,124,5,106,8,125,6,87,0,110,54,4,0, - 116,9,107,10,114,128,1,0,1,0,1,0,116,10,124,5, - 124,0,124,1,131,3,125,7,124,7,100,1,107,8,114,124, - 89,0,87,0,53,0,81,0,82,0,163,0,113,52,89,0, - 110,14,88,0,124,6,124,0,124,1,124,2,131,3,125,7, - 87,0,53,0,81,0,82,0,88,0,124,7,100,1,107,9, - 114,52,124,4,144,0,115,254,124,0,116,0,106,6,107,6, - 144,0,114,254,116,0,106,6,124,0,25,0,125,8,122,10, - 124,8,106,11,125,9,87,0,110,28,4,0,116,9,107,10, - 114,226,1,0,1,0,1,0,124,7,6,0,89,0,2,0, - 1,0,83,0,88,0,124,9,100,1,107,8,114,244,124,7, - 2,0,1,0,83,0,124,9,2,0,1,0,83,0,113,52, - 124,7,2,0,1,0,83,0,113,52,100,1,83,0,41,4, - 122,21,70,105,110,100,32,97,32,109,111,100,117,108,101,39, - 115,32,115,112,101,99,46,78,122,53,115,121,115,46,109,101, - 116,97,95,112,97,116,104,32,105,115,32,78,111,110,101,44, - 32,80,121,116,104,111,110,32,105,115,32,108,105,107,101,108, - 121,32,115,104,117,116,116,105,110,103,32,100,111,119,110,122, - 22,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, - 115,32,101,109,112,116,121,41,12,114,15,0,0,0,218,9, - 109,101,116,97,95,112,97,116,104,114,79,0,0,0,218,9, - 95,119,97,114,110,105,110,103,115,218,4,119,97,114,110,218, - 13,73,109,112,111,114,116,87,97,114,110,105,110,103,114,92, - 0,0,0,114,178,0,0,0,114,166,0,0,0,114,106,0, - 0,0,114,190,0,0,0,114,105,0,0,0,41,10,114,17, - 0,0,0,114,164,0,0,0,114,165,0,0,0,114,191,0, - 0,0,90,9,105,115,95,114,101,108,111,97,100,114,189,0, - 0,0,114,166,0,0,0,114,95,0,0,0,114,96,0,0, - 0,114,105,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,10,95,102,105,110,100,95,115,112,101, - 99,122,3,0,0,115,54,0,0,0,0,2,6,1,8,2, - 8,3,4,1,12,5,10,1,8,1,8,1,2,1,10,1, - 14,1,12,1,8,1,20,2,22,1,8,2,18,1,10,1, - 2,1,10,1,14,4,14,2,8,1,8,2,10,2,10,2, - 114,195,0,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,108, - 0,0,0,116,0,124,0,116,1,131,2,115,28,116,2,100, - 1,160,3,116,4,124,0,131,1,161,1,131,1,130,1,124, - 2,100,2,107,0,114,44,116,5,100,3,131,1,130,1,124, - 2,100,2,107,4,114,84,116,0,124,1,116,1,131,2,115, - 72,116,2,100,4,131,1,130,1,110,12,124,1,115,84,116, - 6,100,5,131,1,130,1,124,0,115,104,124,2,100,2,107, - 2,114,104,116,5,100,6,131,1,130,1,100,7,83,0,41, - 8,122,28,86,101,114,105,102,121,32,97,114,103,117,109,101, - 110,116,115,32,97,114,101,32,34,115,97,110,101,34,46,122, - 31,109,111,100,117,108,101,32,110,97,109,101,32,109,117,115, - 116,32,98,101,32,115,116,114,44,32,110,111,116,32,123,125, - 114,22,0,0,0,122,18,108,101,118,101,108,32,109,117,115, - 116,32,98,101,32,62,61,32,48,122,31,95,95,112,97,99, - 107,97,103,101,95,95,32,110,111,116,32,115,101,116,32,116, - 111,32,97,32,115,116,114,105,110,103,122,54,97,116,116,101, - 109,112,116,101,100,32,114,101,108,97,116,105,118,101,32,105, - 109,112,111,114,116,32,119,105,116,104,32,110,111,32,107,110, - 111,119,110,32,112,97,114,101,110,116,32,112,97,99,107,97, - 103,101,122,17,69,109,112,116,121,32,109,111,100,117,108,101, - 32,110,97,109,101,78,41,7,218,10,105,115,105,110,115,116, - 97,110,99,101,218,3,115,116,114,218,9,84,121,112,101,69, - 114,114,111,114,114,45,0,0,0,114,14,0,0,0,114,185, - 0,0,0,114,79,0,0,0,169,3,114,17,0,0,0,114, - 186,0,0,0,114,187,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,13,95,115,97,110,105,116, - 121,95,99,104,101,99,107,169,3,0,0,115,22,0,0,0, - 0,2,10,1,18,1,8,1,8,1,8,1,10,1,10,1, - 4,1,8,2,12,1,114,200,0,0,0,122,16,78,111,32, - 109,111,100,117,108,101,32,110,97,109,101,100,32,122,4,123, - 33,114,125,99,2,0,0,0,0,0,0,0,0,0,0,0, - 8,0,0,0,8,0,0,0,67,0,0,0,115,220,0,0, - 0,100,0,125,2,124,0,160,0,100,1,161,1,100,2,25, - 0,125,3,124,3,114,134,124,3,116,1,106,2,107,7,114, - 42,116,3,124,1,124,3,131,2,1,0,124,0,116,1,106, - 2,107,6,114,62,116,1,106,2,124,0,25,0,83,0,116, - 1,106,2,124,3,25,0,125,4,122,10,124,4,106,4,125, - 2,87,0,110,50,4,0,116,5,107,10,114,132,1,0,1, - 0,1,0,116,6,100,3,23,0,160,7,124,0,124,3,161, - 2,125,5,116,8,124,5,124,0,100,4,141,2,100,0,130, - 2,89,0,110,2,88,0,116,9,124,0,124,2,131,2,125, - 6,124,6,100,0,107,8,114,172,116,8,116,6,160,7,124, - 0,161,1,124,0,100,4,141,2,130,1,110,8,116,10,124, - 6,131,1,125,7,124,3,114,216,116,1,106,2,124,3,25, - 0,125,4,116,11,124,4,124,0,160,0,100,1,161,1,100, - 5,25,0,124,7,131,3,1,0,124,7,83,0,41,6,78, - 114,128,0,0,0,114,22,0,0,0,122,23,59,32,123,33, - 114,125,32,105,115,32,110,111,116,32,97,32,112,97,99,107, - 97,103,101,114,16,0,0,0,233,2,0,0,0,41,12,114, - 129,0,0,0,114,15,0,0,0,114,92,0,0,0,114,67, - 0,0,0,114,141,0,0,0,114,106,0,0,0,218,8,95, - 69,82,82,95,77,83,71,114,45,0,0,0,218,19,77,111, - 100,117,108,101,78,111,116,70,111,117,110,100,69,114,114,111, - 114,114,195,0,0,0,114,159,0,0,0,114,5,0,0,0, - 41,8,114,17,0,0,0,218,7,105,109,112,111,114,116,95, - 114,164,0,0,0,114,130,0,0,0,90,13,112,97,114,101, - 110,116,95,109,111,100,117,108,101,114,157,0,0,0,114,95, - 0,0,0,114,96,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,23,95,102,105,110,100,95,97, - 110,100,95,108,111,97,100,95,117,110,108,111,99,107,101,100, - 188,3,0,0,115,42,0,0,0,0,1,4,1,14,1,4, - 1,10,1,10,2,10,1,10,1,10,1,2,1,10,1,14, - 1,16,1,20,1,10,1,8,1,20,2,8,1,4,2,10, - 1,22,1,114,205,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,10,0,0,0,67,0,0, - 0,115,106,0,0,0,116,0,124,0,131,1,143,50,1,0, - 116,1,106,2,160,3,124,0,116,4,161,2,125,2,124,2, - 116,4,107,8,114,54,116,5,124,0,124,1,131,2,87,0, - 2,0,53,0,81,0,82,0,163,0,83,0,87,0,53,0, - 81,0,82,0,88,0,124,2,100,1,107,8,114,94,100,2, - 160,6,124,0,161,1,125,3,116,7,124,3,124,0,100,3, - 141,2,130,1,116,8,124,0,131,1,1,0,124,2,83,0, - 41,4,122,25,70,105,110,100,32,97,110,100,32,108,111,97, - 100,32,116,104,101,32,109,111,100,117,108,101,46,78,122,40, - 105,109,112,111,114,116,32,111,102,32,123,125,32,104,97,108, - 116,101,100,59,32,78,111,110,101,32,105,110,32,115,121,115, - 46,109,111,100,117,108,101,115,114,16,0,0,0,41,9,114, - 50,0,0,0,114,15,0,0,0,114,92,0,0,0,114,34, - 0,0,0,218,14,95,78,69,69,68,83,95,76,79,65,68, - 73,78,71,114,205,0,0,0,114,45,0,0,0,114,203,0, - 0,0,114,65,0,0,0,41,4,114,17,0,0,0,114,204, - 0,0,0,114,96,0,0,0,114,75,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,14,95,102, - 105,110,100,95,97,110,100,95,108,111,97,100,218,3,0,0, - 115,22,0,0,0,0,2,10,1,14,1,8,1,32,2,8, - 1,4,1,2,255,4,2,12,2,8,1,114,207,0,0,0, - 114,22,0,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,42, - 0,0,0,116,0,124,0,124,1,124,2,131,3,1,0,124, - 2,100,1,107,4,114,32,116,1,124,0,124,1,124,2,131, - 3,125,0,116,2,124,0,116,3,131,2,83,0,41,2,97, - 50,1,0,0,73,109,112,111,114,116,32,97,110,100,32,114, - 101,116,117,114,110,32,116,104,101,32,109,111,100,117,108,101, - 32,98,97,115,101,100,32,111,110,32,105,116,115,32,110,97, - 109,101,44,32,116,104,101,32,112,97,99,107,97,103,101,32, - 116,104,101,32,99,97,108,108,32,105,115,10,32,32,32,32, - 98,101,105,110,103,32,109,97,100,101,32,102,114,111,109,44, - 32,97,110,100,32,116,104,101,32,108,101,118,101,108,32,97, - 100,106,117,115,116,109,101,110,116,46,10,10,32,32,32,32, - 84,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101, - 112,114,101,115,101,110,116,115,32,116,104,101,32,103,114,101, - 97,116,101,115,116,32,99,111,109,109,111,110,32,100,101,110, - 111,109,105,110,97,116,111,114,32,111,102,32,102,117,110,99, - 116,105,111,110,97,108,105,116,121,10,32,32,32,32,98,101, - 116,119,101,101,110,32,105,109,112,111,114,116,95,109,111,100, - 117,108,101,32,97,110,100,32,95,95,105,109,112,111,114,116, - 95,95,46,32,84,104,105,115,32,105,110,99,108,117,100,101, - 115,32,115,101,116,116,105,110,103,32,95,95,112,97,99,107, - 97,103,101,95,95,32,105,102,10,32,32,32,32,116,104,101, - 32,108,111,97,100,101,114,32,100,105,100,32,110,111,116,46, - 10,10,32,32,32,32,114,22,0,0,0,41,4,114,200,0, - 0,0,114,188,0,0,0,114,207,0,0,0,218,11,95,103, - 99,100,95,105,109,112,111,114,116,114,199,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,208,0, - 0,0,234,3,0,0,115,8,0,0,0,0,9,12,1,8, - 1,12,1,114,208,0,0,0,169,1,218,9,114,101,99,117, - 114,115,105,118,101,99,3,0,0,0,0,0,0,0,1,0, - 0,0,8,0,0,0,11,0,0,0,67,0,0,0,115,226, - 0,0,0,124,1,68,0,93,216,125,4,116,0,124,4,116, - 1,131,2,115,66,124,3,114,34,124,0,106,2,100,1,23, - 0,125,5,110,4,100,2,125,5,116,3,100,3,124,5,155, - 0,100,4,116,4,124,4,131,1,106,2,155,0,157,4,131, - 1,130,1,113,4,124,4,100,5,107,2,114,108,124,3,115, - 220,116,5,124,0,100,6,131,2,114,220,116,6,124,0,124, - 0,106,7,124,2,100,7,100,8,141,4,1,0,113,4,116, - 5,124,0,124,4,131,2,115,4,100,9,160,8,124,0,106, - 2,124,4,161,2,125,6,122,14,116,9,124,2,124,6,131, - 2,1,0,87,0,113,4,4,0,116,10,107,10,114,218,1, - 0,125,7,1,0,122,42,124,7,106,11,124,6,107,2,114, - 200,116,12,106,13,160,14,124,6,116,15,161,2,100,10,107, - 9,114,200,87,0,89,0,162,8,113,4,130,0,87,0,53, - 0,100,10,125,7,126,7,88,0,89,0,113,4,88,0,113, - 4,124,0,83,0,41,11,122,238,70,105,103,117,114,101,32, - 111,117,116,32,119,104,97,116,32,95,95,105,109,112,111,114, - 116,95,95,32,115,104,111,117,108,100,32,114,101,116,117,114, - 110,46,10,10,32,32,32,32,84,104,101,32,105,109,112,111, - 114,116,95,32,112,97,114,97,109,101,116,101,114,32,105,115, - 32,97,32,99,97,108,108,97,98,108,101,32,119,104,105,99, - 104,32,116,97,107,101,115,32,116,104,101,32,110,97,109,101, - 32,111,102,32,109,111,100,117,108,101,32,116,111,10,32,32, - 32,32,105,109,112,111,114,116,46,32,73,116,32,105,115,32, - 114,101,113,117,105,114,101,100,32,116,111,32,100,101,99,111, - 117,112,108,101,32,116,104,101,32,102,117,110,99,116,105,111, - 110,32,102,114,111,109,32,97,115,115,117,109,105,110,103,32, - 105,109,112,111,114,116,108,105,98,39,115,10,32,32,32,32, - 105,109,112,111,114,116,32,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,32,105,115,32,100,101,115,105,114,101,100, - 46,10,10,32,32,32,32,122,8,46,95,95,97,108,108,95, - 95,122,13,96,96,102,114,111,109,32,108,105,115,116,39,39, - 122,8,73,116,101,109,32,105,110,32,122,18,32,109,117,115, - 116,32,98,101,32,115,116,114,44,32,110,111,116,32,250,1, - 42,218,7,95,95,97,108,108,95,95,84,114,209,0,0,0, - 114,182,0,0,0,78,41,16,114,196,0,0,0,114,197,0, - 0,0,114,1,0,0,0,114,198,0,0,0,114,14,0,0, - 0,114,4,0,0,0,218,16,95,104,97,110,100,108,101,95, - 102,114,111,109,108,105,115,116,114,212,0,0,0,114,45,0, - 0,0,114,67,0,0,0,114,203,0,0,0,114,17,0,0, - 0,114,15,0,0,0,114,92,0,0,0,114,34,0,0,0, - 114,206,0,0,0,41,8,114,96,0,0,0,218,8,102,114, - 111,109,108,105,115,116,114,204,0,0,0,114,210,0,0,0, - 218,1,120,90,5,119,104,101,114,101,90,9,102,114,111,109, - 95,110,97,109,101,90,3,101,120,99,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,213,0,0,0,249,3, - 0,0,115,44,0,0,0,0,10,8,1,10,1,4,1,12, - 2,4,1,28,2,8,1,14,1,10,1,2,255,8,2,10, - 1,14,1,2,1,14,1,16,4,10,1,16,255,2,2,8, - 1,22,1,114,213,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,6,0,0,0,67,0,0, - 0,115,146,0,0,0,124,0,160,0,100,1,161,1,125,1, - 124,0,160,0,100,2,161,1,125,2,124,1,100,3,107,9, - 114,82,124,2,100,3,107,9,114,78,124,1,124,2,106,1, - 107,3,114,78,116,2,106,3,100,4,124,1,155,2,100,5, - 124,2,106,1,155,2,100,6,157,5,116,4,100,7,100,8, - 141,3,1,0,124,1,83,0,124,2,100,3,107,9,114,96, - 124,2,106,1,83,0,116,2,106,3,100,9,116,4,100,7, - 100,8,141,3,1,0,124,0,100,10,25,0,125,1,100,11, - 124,0,107,7,114,142,124,1,160,5,100,12,161,1,100,13, - 25,0,125,1,124,1,83,0,41,14,122,167,67,97,108,99, - 117,108,97,116,101,32,119,104,97,116,32,95,95,112,97,99, - 107,97,103,101,95,95,32,115,104,111,117,108,100,32,98,101, - 46,10,10,32,32,32,32,95,95,112,97,99,107,97,103,101, - 95,95,32,105,115,32,110,111,116,32,103,117,97,114,97,110, - 116,101,101,100,32,116,111,32,98,101,32,100,101,102,105,110, - 101,100,32,111,114,32,99,111,117,108,100,32,98,101,32,115, - 101,116,32,116,111,32,78,111,110,101,10,32,32,32,32,116, - 111,32,114,101,112,114,101,115,101,110,116,32,116,104,97,116, - 32,105,116,115,32,112,114,111,112,101,114,32,118,97,108,117, - 101,32,105,115,32,117,110,107,110,111,119,110,46,10,10,32, - 32,32,32,114,145,0,0,0,114,105,0,0,0,78,122,32, - 95,95,112,97,99,107,97,103,101,95,95,32,33,61,32,95, - 95,115,112,101,99,95,95,46,112,97,114,101,110,116,32,40, - 122,4,32,33,61,32,250,1,41,233,3,0,0,0,41,1, - 90,10,115,116,97,99,107,108,101,118,101,108,122,89,99,97, - 110,39,116,32,114,101,115,111,108,118,101,32,112,97,99,107, - 97,103,101,32,102,114,111,109,32,95,95,115,112,101,99,95, - 95,32,111,114,32,95,95,112,97,99,107,97,103,101,95,95, - 44,32,102,97,108,108,105,110,103,32,98,97,99,107,32,111, - 110,32,95,95,110,97,109,101,95,95,32,97,110,100,32,95, - 95,112,97,116,104,95,95,114,1,0,0,0,114,141,0,0, - 0,114,128,0,0,0,114,22,0,0,0,41,6,114,34,0, - 0,0,114,130,0,0,0,114,192,0,0,0,114,193,0,0, - 0,114,194,0,0,0,114,129,0,0,0,41,3,218,7,103, - 108,111,98,97,108,115,114,186,0,0,0,114,95,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 17,95,99,97,108,99,95,95,95,112,97,99,107,97,103,101, - 95,95,30,4,0,0,115,38,0,0,0,0,7,10,1,10, - 1,8,1,18,1,22,2,2,0,2,254,6,3,4,1,8, - 1,6,2,6,2,2,0,2,254,6,3,8,1,8,1,14, - 1,114,219,0,0,0,114,10,0,0,0,99,5,0,0,0, - 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, - 67,0,0,0,115,180,0,0,0,124,4,100,1,107,2,114, - 18,116,0,124,0,131,1,125,5,110,36,124,1,100,2,107, - 9,114,30,124,1,110,2,105,0,125,6,116,1,124,6,131, - 1,125,7,116,0,124,0,124,7,124,4,131,3,125,5,124, - 3,115,150,124,4,100,1,107,2,114,84,116,0,124,0,160, - 2,100,3,161,1,100,1,25,0,131,1,83,0,124,0,115, - 92,124,5,83,0,116,3,124,0,131,1,116,3,124,0,160, - 2,100,3,161,1,100,1,25,0,131,1,24,0,125,8,116, - 4,106,5,124,5,106,6,100,2,116,3,124,5,106,6,131, - 1,124,8,24,0,133,2,25,0,25,0,83,0,110,26,116, - 7,124,5,100,4,131,2,114,172,116,8,124,5,124,3,116, - 0,131,3,83,0,124,5,83,0,100,2,83,0,41,5,97, - 215,1,0,0,73,109,112,111,114,116,32,97,32,109,111,100, - 117,108,101,46,10,10,32,32,32,32,84,104,101,32,39,103, - 108,111,98,97,108,115,39,32,97,114,103,117,109,101,110,116, - 32,105,115,32,117,115,101,100,32,116,111,32,105,110,102,101, - 114,32,119,104,101,114,101,32,116,104,101,32,105,109,112,111, - 114,116,32,105,115,32,111,99,99,117,114,114,105,110,103,32, - 102,114,111,109,10,32,32,32,32,116,111,32,104,97,110,100, - 108,101,32,114,101,108,97,116,105,118,101,32,105,109,112,111, - 114,116,115,46,32,84,104,101,32,39,108,111,99,97,108,115, - 39,32,97,114,103,117,109,101,110,116,32,105,115,32,105,103, - 110,111,114,101,100,46,32,84,104,101,10,32,32,32,32,39, - 102,114,111,109,108,105,115,116,39,32,97,114,103,117,109,101, - 110,116,32,115,112,101,99,105,102,105,101,115,32,119,104,97, - 116,32,115,104,111,117,108,100,32,101,120,105,115,116,32,97, - 115,32,97,116,116,114,105,98,117,116,101,115,32,111,110,32, - 116,104,101,32,109,111,100,117,108,101,10,32,32,32,32,98, - 101,105,110,103,32,105,109,112,111,114,116,101,100,32,40,101, - 46,103,46,32,96,96,102,114,111,109,32,109,111,100,117,108, - 101,32,105,109,112,111,114,116,32,60,102,114,111,109,108,105, - 115,116,62,96,96,41,46,32,32,84,104,101,32,39,108,101, - 118,101,108,39,10,32,32,32,32,97,114,103,117,109,101,110, - 116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101, - 32,112,97,99,107,97,103,101,32,108,111,99,97,116,105,111, - 110,32,116,111,32,105,109,112,111,114,116,32,102,114,111,109, - 32,105,110,32,97,32,114,101,108,97,116,105,118,101,10,32, - 32,32,32,105,109,112,111,114,116,32,40,101,46,103,46,32, - 96,96,102,114,111,109,32,46,46,112,107,103,32,105,109,112, - 111,114,116,32,109,111,100,96,96,32,119,111,117,108,100,32, - 104,97,118,101,32,97,32,39,108,101,118,101,108,39,32,111, - 102,32,50,41,46,10,10,32,32,32,32,114,22,0,0,0, - 78,114,128,0,0,0,114,141,0,0,0,41,9,114,208,0, - 0,0,114,219,0,0,0,218,9,112,97,114,116,105,116,105, - 111,110,114,184,0,0,0,114,15,0,0,0,114,92,0,0, - 0,114,1,0,0,0,114,4,0,0,0,114,213,0,0,0, - 41,9,114,17,0,0,0,114,218,0,0,0,218,6,108,111, - 99,97,108,115,114,214,0,0,0,114,187,0,0,0,114,96, - 0,0,0,90,8,103,108,111,98,97,108,115,95,114,186,0, - 0,0,90,7,99,117,116,95,111,102,102,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,10,95,95,105,109, - 112,111,114,116,95,95,57,4,0,0,115,30,0,0,0,0, - 11,8,1,10,2,16,1,8,1,12,1,4,3,8,1,18, - 1,4,1,4,4,26,3,32,1,10,1,12,2,114,222,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 116,0,160,1,124,0,161,1,125,1,124,1,100,0,107,8, - 114,30,116,2,100,1,124,0,23,0,131,1,130,1,116,3, - 124,1,131,1,83,0,41,2,78,122,25,110,111,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,32,110,97, - 109,101,100,32,41,4,114,160,0,0,0,114,166,0,0,0, - 114,79,0,0,0,114,159,0,0,0,41,2,114,17,0,0, - 0,114,95,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,18,95,98,117,105,108,116,105,110,95, - 102,114,111,109,95,110,97,109,101,94,4,0,0,115,8,0, - 0,0,0,1,10,1,8,1,12,1,114,223,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, - 5,0,0,0,67,0,0,0,115,166,0,0,0,124,1,97, - 0,124,0,97,1,116,2,116,1,131,1,125,2,116,1,106, - 3,160,4,161,0,68,0,93,72,92,2,125,3,125,4,116, - 5,124,4,124,2,131,2,114,26,124,3,116,1,106,6,107, - 6,114,60,116,7,125,5,110,18,116,0,160,8,124,3,161, - 1,114,26,116,9,125,5,110,2,113,26,116,10,124,4,124, - 5,131,2,125,6,116,11,124,6,124,4,131,2,1,0,113, - 26,116,1,106,3,116,12,25,0,125,7,100,1,68,0,93, - 46,125,8,124,8,116,1,106,3,107,7,114,138,116,13,124, - 8,131,1,125,9,110,10,116,1,106,3,124,8,25,0,125, - 9,116,14,124,7,124,8,124,9,131,3,1,0,113,114,100, - 2,83,0,41,3,122,250,83,101,116,117,112,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,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,10,32, - 32,32,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,65,115,32,115,121,115,32,105,115,32,110,101,101, - 100,101,100,32,102,111,114,32,115,121,115,46,109,111,100,117, - 108,101,115,32,97,99,99,101,115,115,32,97,110,100,32,95, - 105,109,112,32,105,115,32,110,101,101,100,101,100,32,116,111, - 32,108,111,97,100,32,98,117,105,108,116,45,105,110,10,32, - 32,32,32,109,111,100,117,108,101,115,44,32,116,104,111,115, - 101,32,116,119,111,32,109,111,100,117,108,101,115,32,109,117, - 115,116,32,98,101,32,101,120,112,108,105,99,105,116,108,121, - 32,112,97,115,115,101,100,32,105,110,46,10,10,32,32,32, - 32,41,3,114,23,0,0,0,114,192,0,0,0,114,64,0, - 0,0,78,41,15,114,57,0,0,0,114,15,0,0,0,114, - 14,0,0,0,114,92,0,0,0,218,5,105,116,101,109,115, - 114,196,0,0,0,114,78,0,0,0,114,160,0,0,0,114, - 88,0,0,0,114,173,0,0,0,114,142,0,0,0,114,148, - 0,0,0,114,1,0,0,0,114,223,0,0,0,114,5,0, - 0,0,41,10,218,10,115,121,115,95,109,111,100,117,108,101, - 218,11,95,105,109,112,95,109,111,100,117,108,101,90,11,109, - 111,100,117,108,101,95,116,121,112,101,114,17,0,0,0,114, - 96,0,0,0,114,109,0,0,0,114,95,0,0,0,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,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,6,95,115,101,116,117,112, - 101,4,0,0,115,36,0,0,0,0,9,4,1,4,3,8, - 1,18,1,10,1,10,1,6,1,10,1,6,2,2,1,10, - 1,12,3,10,1,8,1,10,1,10,2,10,1,114,227,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,38,0,0,0, - 116,0,124,0,124,1,131,2,1,0,116,1,106,2,160,3, - 116,4,161,1,1,0,116,1,106,2,160,3,116,5,161,1, - 1,0,100,1,83,0,41,2,122,48,73,110,115,116,97,108, - 108,32,105,109,112,111,114,116,101,114,115,32,102,111,114,32, - 98,117,105,108,116,105,110,32,97,110,100,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,115,78,41,6,114,227,0, - 0,0,114,15,0,0,0,114,191,0,0,0,114,120,0,0, - 0,114,160,0,0,0,114,173,0,0,0,41,2,114,225,0, - 0,0,114,226,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,95,105,110,115,116,97,108,108, - 136,4,0,0,115,6,0,0,0,0,2,10,2,12,1,114, - 228,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,4,0,0,0,67,0,0,0,115,32,0, - 0,0,100,1,100,2,108,0,125,0,124,0,97,1,124,0, - 160,2,116,3,106,4,116,5,25,0,161,1,1,0,100,2, - 83,0,41,3,122,57,73,110,115,116,97,108,108,32,105,109, - 112,111,114,116,101,114,115,32,116,104,97,116,32,114,101,113, - 117,105,114,101,32,101,120,116,101,114,110,97,108,32,102,105, - 108,101,115,121,115,116,101,109,32,97,99,99,101,115,115,114, - 22,0,0,0,78,41,6,218,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,126,0,0,0,114,228,0,0,0,114,15,0, - 0,0,114,92,0,0,0,114,1,0,0,0,41,1,114,229, + 0,114,156,0,0,0,72,3,0,0,115,2,0,0,0,0, + 7,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,46,108,111,97,100,95,109,111,100,117,108,101,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,10,0,0,0,116,0,160,1,124, + 1,161,1,83,0,41,1,122,45,82,101,116,117,114,110,32, + 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, + 102,111,114,32,116,104,101,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,46,41,2,114,58,0,0,0,114,177,0, + 0,0,114,170,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,171,0,0,0,81,3,0,0,115, + 2,0,0,0,0,4,122,23,70,114,111,122,101,110,73,109, + 112,111,114,116,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,54,82,101,116,117,114,110,32,78,111,110,101, + 32,97,115,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, + 111,117,114,99,101,32,99,111,100,101,46,78,114,10,0,0, + 0,114,170,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,172,0,0,0,87,3,0,0,115,2, + 0,0,0,0,4,122,25,70,114,111,122,101,110,73,109,112, + 111,114,116,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,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, + 160,1,124,1,161,1,83,0,41,1,122,46,82,101,116,117, + 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,102, + 114,111,122,101,110,32,109,111,100,117,108,101,32,105,115,32, + 97,32,112,97,99,107,97,103,101,46,41,2,114,58,0,0, + 0,90,17,105,115,95,102,114,111,122,101,110,95,112,97,99, + 107,97,103,101,114,170,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,116,0,0,0,93,3,0, + 0,115,2,0,0,0,0,4,122,25,70,114,111,122,101,110, + 73,109,112,111,114,116,101,114,46,105,115,95,112,97,99,107, + 97,103,101,41,2,78,78,41,1,78,41,17,114,1,0,0, + 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, + 114,139,0,0,0,114,173,0,0,0,114,100,0,0,0,114, + 174,0,0,0,114,168,0,0,0,114,169,0,0,0,114,150, + 0,0,0,114,151,0,0,0,114,156,0,0,0,114,91,0, + 0,0,114,171,0,0,0,114,172,0,0,0,114,116,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,175,0,0,0,23,3,0,0,115,46, + 0,0,0,8,2,4,7,4,2,2,1,10,8,2,1,12, + 6,2,1,12,8,2,1,10,3,2,1,10,8,2,1,10, + 8,2,1,2,1,12,4,2,1,2,1,12,4,2,1,2, + 1,114,175,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, + 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,18,95,73,109,112,111,114,116,76, + 111,99,107,67,111,110,116,101,120,116,122,36,67,111,110,116, + 101,120,116,32,109,97,110,97,103,101,114,32,102,111,114,32, + 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, + 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,12,0,0,0,116,0, + 160,1,161,0,1,0,100,1,83,0,41,2,122,24,65,99, + 113,117,105,114,101,32,116,104,101,32,105,109,112,111,114,116, + 32,108,111,99,107,46,78,41,2,114,58,0,0,0,114,59, + 0,0,0,114,48,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,55,0,0,0,106,3,0,0, + 115,2,0,0,0,0,2,122,28,95,73,109,112,111,114,116, + 76,111,99,107,67,111,110,116,101,120,116,46,95,95,101,110, + 116,101,114,95,95,99,4,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,2,0,0,0,67,0,0,0,115,12, + 0,0,0,116,0,160,1,161,0,1,0,100,1,83,0,41, + 2,122,60,82,101,108,101,97,115,101,32,116,104,101,32,105, + 109,112,111,114,116,32,108,111,99,107,32,114,101,103,97,114, + 100,108,101,115,115,32,111,102,32,97,110,121,32,114,97,105, + 115,101,100,32,101,120,99,101,112,116,105,111,110,115,46,78, + 41,2,114,58,0,0,0,114,61,0,0,0,41,4,114,30, + 0,0,0,218,8,101,120,99,95,116,121,112,101,218,9,101, + 120,99,95,118,97,108,117,101,218,13,101,120,99,95,116,114, + 97,99,101,98,97,99,107,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,57,0,0,0,110,3,0,0,115, + 2,0,0,0,0,2,122,27,95,73,109,112,111,114,116,76, + 111,99,107,67,111,110,116,101,120,116,46,95,95,101,120,105, + 116,95,95,78,41,6,114,1,0,0,0,114,0,0,0,0, + 114,2,0,0,0,114,3,0,0,0,114,55,0,0,0,114, + 57,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,180,0,0,0,102,3,0, + 0,115,6,0,0,0,8,2,4,2,8,4,114,180,0,0, + 0,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,5,0,0,0,67,0,0,0,115,64,0,0,0,124, + 1,160,0,100,1,124,2,100,2,24,0,161,2,125,3,116, + 1,124,3,131,1,124,2,107,0,114,36,116,2,100,3,131, + 1,130,1,124,3,100,4,25,0,125,4,124,0,114,60,100, + 5,160,3,124,4,124,0,161,2,83,0,124,4,83,0,41, + 6,122,50,82,101,115,111,108,118,101,32,97,32,114,101,108, + 97,116,105,118,101,32,109,111,100,117,108,101,32,110,97,109, + 101,32,116,111,32,97,110,32,97,98,115,111,108,117,116,101, + 32,111,110,101,46,114,129,0,0,0,114,39,0,0,0,122, + 50,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, + 105,118,101,32,105,109,112,111,114,116,32,98,101,121,111,110, + 100,32,116,111,112,45,108,101,118,101,108,32,112,97,99,107, + 97,103,101,114,22,0,0,0,250,5,123,125,46,123,125,41, + 4,218,6,114,115,112,108,105,116,218,3,108,101,110,114,80, + 0,0,0,114,46,0,0,0,41,5,114,17,0,0,0,218, + 7,112,97,99,107,97,103,101,218,5,108,101,118,101,108,90, + 4,98,105,116,115,90,4,98,97,115,101,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,13,95,114,101,115, + 111,108,118,101,95,110,97,109,101,115,3,0,0,115,10,0, + 0,0,0,2,16,1,12,1,8,1,8,1,114,189,0,0, + 0,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,34,0,0,0,124, + 0,160,0,124,1,124,2,161,2,125,3,124,3,100,0,117, + 0,114,24,100,0,83,0,116,1,124,1,124,3,131,2,83, + 0,114,13,0,0,0,41,2,114,169,0,0,0,114,92,0, + 0,0,41,4,218,6,102,105,110,100,101,114,114,17,0,0, + 0,114,166,0,0,0,114,110,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,17,95,102,105,110, + 100,95,115,112,101,99,95,108,101,103,97,99,121,124,3,0, + 0,115,8,0,0,0,0,3,12,1,8,1,4,1,114,191, + 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, + 10,0,0,0,10,0,0,0,67,0,0,0,115,32,1,0, + 0,116,0,106,1,125,3,124,3,100,1,117,0,114,22,116, + 2,100,2,131,1,130,1,124,3,115,38,116,3,160,4,100, + 3,116,5,161,2,1,0,124,0,116,0,106,6,118,0,125, + 4,124,3,68,0,93,230,125,5,116,7,131,0,143,94,1, + 0,122,10,124,5,106,8,125,6,87,0,110,54,4,0,116, + 9,121,128,1,0,1,0,1,0,116,10,124,5,124,0,124, + 1,131,3,125,7,124,7,100,1,117,0,114,124,89,0,87, + 0,100,1,4,0,4,0,131,3,1,0,113,52,89,0,110, + 14,48,0,124,6,124,0,124,1,124,2,131,3,125,7,87, + 0,100,1,4,0,4,0,131,3,1,0,110,16,49,0,115, + 162,48,0,1,0,1,0,1,0,89,0,1,0,124,7,100, + 1,117,1,114,52,124,4,144,1,115,18,124,0,116,0,106, + 6,118,0,144,1,114,18,116,0,106,6,124,0,25,0,125, + 8,122,10,124,8,106,11,125,9,87,0,110,26,4,0,116, + 9,121,244,1,0,1,0,1,0,124,7,6,0,89,0,2, + 0,1,0,83,0,48,0,124,9,100,1,117,0,144,1,114, + 8,124,7,2,0,1,0,83,0,124,9,2,0,1,0,83, + 0,113,52,124,7,2,0,1,0,83,0,113,52,100,1,83, + 0,41,4,122,21,70,105,110,100,32,97,32,109,111,100,117, + 108,101,39,115,32,115,112,101,99,46,78,122,53,115,121,115, + 46,109,101,116,97,95,112,97,116,104,32,105,115,32,78,111, + 110,101,44,32,80,121,116,104,111,110,32,105,115,32,108,105, + 107,101,108,121,32,115,104,117,116,116,105,110,103,32,100,111, + 119,110,122,22,115,121,115,46,109,101,116,97,95,112,97,116, + 104,32,105,115,32,101,109,112,116,121,41,12,114,15,0,0, + 0,218,9,109,101,116,97,95,112,97,116,104,114,80,0,0, + 0,218,9,95,119,97,114,110,105,110,103,115,218,4,119,97, + 114,110,218,13,73,109,112,111,114,116,87,97,114,110,105,110, + 103,114,93,0,0,0,114,180,0,0,0,114,168,0,0,0, + 114,107,0,0,0,114,191,0,0,0,114,106,0,0,0,41, + 10,114,17,0,0,0,114,166,0,0,0,114,167,0,0,0, + 114,192,0,0,0,90,9,105,115,95,114,101,108,111,97,100, + 114,190,0,0,0,114,168,0,0,0,114,96,0,0,0,114, + 97,0,0,0,114,106,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,10,95,102,105,110,100,95, + 115,112,101,99,133,3,0,0,115,54,0,0,0,0,2,6, + 1,8,2,8,3,4,1,12,5,10,1,8,1,8,1,2, + 1,10,1,12,1,12,1,8,1,22,2,42,1,8,2,18, + 1,10,1,2,1,10,1,12,4,14,2,10,1,8,2,10, + 2,10,2,114,196,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0, + 0,115,108,0,0,0,116,0,124,0,116,1,131,2,115,28, + 116,2,100,1,160,3,116,4,124,0,131,1,161,1,131,1, + 130,1,124,2,100,2,107,0,114,44,116,5,100,3,131,1, + 130,1,124,2,100,2,107,4,114,84,116,0,124,1,116,1, + 131,2,115,72,116,2,100,4,131,1,130,1,110,12,124,1, + 115,84,116,6,100,5,131,1,130,1,124,0,115,104,124,2, + 100,2,107,2,114,104,116,5,100,6,131,1,130,1,100,7, + 83,0,41,8,122,28,86,101,114,105,102,121,32,97,114,103, + 117,109,101,110,116,115,32,97,114,101,32,34,115,97,110,101, + 34,46,122,31,109,111,100,117,108,101,32,110,97,109,101,32, + 109,117,115,116,32,98,101,32,115,116,114,44,32,110,111,116, + 32,123,125,114,22,0,0,0,122,18,108,101,118,101,108,32, + 109,117,115,116,32,98,101,32,62,61,32,48,122,31,95,95, + 112,97,99,107,97,103,101,95,95,32,110,111,116,32,115,101, + 116,32,116,111,32,97,32,115,116,114,105,110,103,122,54,97, + 116,116,101,109,112,116,101,100,32,114,101,108,97,116,105,118, + 101,32,105,109,112,111,114,116,32,119,105,116,104,32,110,111, + 32,107,110,111,119,110,32,112,97,114,101,110,116,32,112,97, + 99,107,97,103,101,122,17,69,109,112,116,121,32,109,111,100, + 117,108,101,32,110,97,109,101,78,41,7,218,10,105,115,105, + 110,115,116,97,110,99,101,218,3,115,116,114,218,9,84,121, + 112,101,69,114,114,111,114,114,46,0,0,0,114,14,0,0, + 0,218,10,86,97,108,117,101,69,114,114,111,114,114,80,0, + 0,0,169,3,114,17,0,0,0,114,187,0,0,0,114,188, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,27,95,105,110,115,116,97,108,108,95,101,120,116, - 101,114,110,97,108,95,105,109,112,111,114,116,101,114,115,144, - 4,0,0,115,6,0,0,0,0,3,8,1,4,1,114,230, - 0,0,0,41,2,78,78,41,1,78,41,2,78,114,22,0, - 0,0,41,4,78,78,114,10,0,0,0,114,22,0,0,0, - 41,50,114,3,0,0,0,114,126,0,0,0,114,12,0,0, - 0,114,18,0,0,0,114,60,0,0,0,114,33,0,0,0, - 114,42,0,0,0,114,19,0,0,0,114,20,0,0,0,114, - 49,0,0,0,114,50,0,0,0,114,53,0,0,0,114,65, - 0,0,0,114,67,0,0,0,114,76,0,0,0,114,86,0, - 0,0,114,90,0,0,0,114,97,0,0,0,114,111,0,0, - 0,114,112,0,0,0,114,91,0,0,0,114,142,0,0,0, - 114,148,0,0,0,114,152,0,0,0,114,107,0,0,0,114, - 93,0,0,0,114,158,0,0,0,114,159,0,0,0,114,94, - 0,0,0,114,160,0,0,0,114,173,0,0,0,114,178,0, - 0,0,114,188,0,0,0,114,190,0,0,0,114,195,0,0, - 0,114,200,0,0,0,90,15,95,69,82,82,95,77,83,71, - 95,80,82,69,70,73,88,114,202,0,0,0,114,205,0,0, - 0,218,6,111,98,106,101,99,116,114,206,0,0,0,114,207, - 0,0,0,114,208,0,0,0,114,213,0,0,0,114,219,0, - 0,0,114,222,0,0,0,114,223,0,0,0,114,227,0,0, - 0,114,228,0,0,0,114,230,0,0,0,114,10,0,0,0, + 0,0,218,13,95,115,97,110,105,116,121,95,99,104,101,99, + 107,180,3,0,0,115,22,0,0,0,0,2,10,1,18,1, + 8,1,8,1,8,1,10,1,10,1,4,1,8,2,12,1, + 114,202,0,0,0,122,16,78,111,32,109,111,100,117,108,101, + 32,110,97,109,101,100,32,122,4,123,33,114,125,99,2,0, + 0,0,0,0,0,0,0,0,0,0,9,0,0,0,8,0, + 0,0,67,0,0,0,115,22,1,0,0,100,0,125,2,124, + 0,160,0,100,1,161,1,100,2,25,0,125,3,124,3,114, + 132,124,3,116,1,106,2,118,1,114,42,116,3,124,1,124, + 3,131,2,1,0,124,0,116,1,106,2,118,0,114,62,116, + 1,106,2,124,0,25,0,83,0,116,1,106,2,124,3,25, + 0,125,4,122,10,124,4,106,4,125,2,87,0,110,48,4, + 0,116,5,121,130,1,0,1,0,1,0,116,6,100,3,23, + 0,160,7,124,0,124,3,161,2,125,5,116,8,124,5,124, + 0,100,4,141,2,100,0,130,2,89,0,110,2,48,0,116, + 9,124,0,124,2,131,2,125,6,124,6,100,0,117,0,114, + 170,116,8,116,6,160,7,124,0,161,1,124,0,100,4,141, + 2,130,1,110,8,116,10,124,6,131,1,125,7,124,3,144, + 1,114,18,116,1,106,2,124,3,25,0,125,4,124,0,160, + 0,100,1,161,1,100,5,25,0,125,8,122,16,116,11,124, + 4,124,8,124,7,131,3,1,0,87,0,110,48,4,0,116, + 5,144,1,121,16,1,0,1,0,1,0,100,6,124,3,155, + 2,100,7,124,8,155,2,157,4,125,5,116,12,160,13,124, + 5,116,14,161,2,1,0,89,0,110,2,48,0,124,7,83, + 0,41,8,78,114,129,0,0,0,114,22,0,0,0,122,23, + 59,32,123,33,114,125,32,105,115,32,110,111,116,32,97,32, + 112,97,99,107,97,103,101,114,16,0,0,0,233,2,0,0, + 0,122,27,67,97,110,110,111,116,32,115,101,116,32,97,110, + 32,97,116,116,114,105,98,117,116,101,32,111,110,32,122,18, + 32,102,111,114,32,99,104,105,108,100,32,109,111,100,117,108, + 101,32,41,15,114,130,0,0,0,114,15,0,0,0,114,93, + 0,0,0,114,68,0,0,0,114,142,0,0,0,114,107,0, + 0,0,218,8,95,69,82,82,95,77,83,71,114,46,0,0, + 0,218,19,77,111,100,117,108,101,78,111,116,70,111,117,110, + 100,69,114,114,111,114,114,196,0,0,0,114,160,0,0,0, + 114,5,0,0,0,114,193,0,0,0,114,194,0,0,0,114, + 195,0,0,0,41,9,114,17,0,0,0,218,7,105,109,112, + 111,114,116,95,114,166,0,0,0,114,131,0,0,0,90,13, + 112,97,114,101,110,116,95,109,111,100,117,108,101,114,158,0, + 0,0,114,96,0,0,0,114,97,0,0,0,90,5,99,104, + 105,108,100,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,23,95,102,105,110,100,95,97,110,100,95,108,111, + 97,100,95,117,110,108,111,99,107,101,100,199,3,0,0,115, + 52,0,0,0,0,1,4,1,14,1,4,1,10,1,10,2, + 10,1,10,1,10,1,2,1,10,1,12,1,16,1,20,1, + 10,1,8,1,20,2,8,1,6,2,10,1,14,1,2,1, + 16,1,14,1,16,1,18,1,114,207,0,0,0,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,128,0,0,0,116,0,124,0,131, + 1,143,62,1,0,116,1,106,2,160,3,124,0,116,4,161, + 2,125,2,124,2,116,4,117,0,114,56,116,5,124,0,124, + 1,131,2,87,0,2,0,100,1,4,0,4,0,131,3,1, + 0,83,0,87,0,100,1,4,0,4,0,131,3,1,0,110, + 16,49,0,115,76,48,0,1,0,1,0,1,0,89,0,1, + 0,124,2,100,1,117,0,114,116,100,2,160,6,124,0,161, + 1,125,3,116,7,124,3,124,0,100,3,141,2,130,1,116, + 8,124,0,131,1,1,0,124,2,83,0,41,4,122,25,70, + 105,110,100,32,97,110,100,32,108,111,97,100,32,116,104,101, + 32,109,111,100,117,108,101,46,78,122,40,105,109,112,111,114, + 116,32,111,102,32,123,125,32,104,97,108,116,101,100,59,32, + 78,111,110,101,32,105,110,32,115,121,115,46,109,111,100,117, + 108,101,115,114,16,0,0,0,41,9,114,51,0,0,0,114, + 15,0,0,0,114,93,0,0,0,114,35,0,0,0,218,14, + 95,78,69,69,68,83,95,76,79,65,68,73,78,71,114,207, + 0,0,0,114,46,0,0,0,114,205,0,0,0,114,66,0, + 0,0,41,4,114,17,0,0,0,114,206,0,0,0,114,97, + 0,0,0,114,76,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,14,95,102,105,110,100,95,97, + 110,100,95,108,111,97,100,234,3,0,0,115,22,0,0,0, + 0,2,10,1,14,1,8,1,54,2,8,1,4,1,2,255, + 4,2,12,2,8,1,114,209,0,0,0,114,22,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,67,0,0,0,115,42,0,0,0,116,0, + 124,0,124,1,124,2,131,3,1,0,124,2,100,1,107,4, + 114,32,116,1,124,0,124,1,124,2,131,3,125,0,116,2, + 124,0,116,3,131,2,83,0,41,2,97,50,1,0,0,73, + 109,112,111,114,116,32,97,110,100,32,114,101,116,117,114,110, + 32,116,104,101,32,109,111,100,117,108,101,32,98,97,115,101, + 100,32,111,110,32,105,116,115,32,110,97,109,101,44,32,116, + 104,101,32,112,97,99,107,97,103,101,32,116,104,101,32,99, + 97,108,108,32,105,115,10,32,32,32,32,98,101,105,110,103, + 32,109,97,100,101,32,102,114,111,109,44,32,97,110,100,32, + 116,104,101,32,108,101,118,101,108,32,97,100,106,117,115,116, + 109,101,110,116,46,10,10,32,32,32,32,84,104,105,115,32, + 102,117,110,99,116,105,111,110,32,114,101,112,114,101,115,101, + 110,116,115,32,116,104,101,32,103,114,101,97,116,101,115,116, + 32,99,111,109,109,111,110,32,100,101,110,111,109,105,110,97, + 116,111,114,32,111,102,32,102,117,110,99,116,105,111,110,97, + 108,105,116,121,10,32,32,32,32,98,101,116,119,101,101,110, + 32,105,109,112,111,114,116,95,109,111,100,117,108,101,32,97, + 110,100,32,95,95,105,109,112,111,114,116,95,95,46,32,84, + 104,105,115,32,105,110,99,108,117,100,101,115,32,115,101,116, + 116,105,110,103,32,95,95,112,97,99,107,97,103,101,95,95, + 32,105,102,10,32,32,32,32,116,104,101,32,108,111,97,100, + 101,114,32,100,105,100,32,110,111,116,46,10,10,32,32,32, + 32,114,22,0,0,0,41,4,114,202,0,0,0,114,189,0, + 0,0,114,209,0,0,0,218,11,95,103,99,100,95,105,109, + 112,111,114,116,114,201,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,210,0,0,0,250,3,0, + 0,115,8,0,0,0,0,9,12,1,8,1,12,1,114,210, + 0,0,0,169,1,218,9,114,101,99,117,114,115,105,118,101, + 99,3,0,0,0,0,0,0,0,1,0,0,0,8,0,0, + 0,11,0,0,0,67,0,0,0,115,232,0,0,0,124,1, + 68,0,93,222,125,4,116,0,124,4,116,1,131,2,115,66, + 124,3,114,34,124,0,106,2,100,1,23,0,125,5,110,4, + 100,2,125,5,116,3,100,3,124,5,155,0,100,4,116,4, + 124,4,131,1,106,2,155,0,157,4,131,1,130,1,113,4, + 124,4,100,5,107,2,114,108,124,3,115,226,116,5,124,0, + 100,6,131,2,114,226,116,6,124,0,124,0,106,7,124,2, + 100,7,100,8,141,4,1,0,113,4,116,5,124,0,124,4, + 131,2,115,4,100,9,160,8,124,0,106,2,124,4,161,2, + 125,6,122,14,116,9,124,2,124,6,131,2,1,0,87,0, + 113,4,4,0,116,10,121,224,1,0,125,7,1,0,122,54, + 124,7,106,11,124,6,107,2,114,202,116,12,106,13,160,14, + 124,6,116,15,161,2,100,10,117,1,114,202,87,0,89,0, + 100,10,125,7,126,7,113,4,130,0,87,0,89,0,100,10, + 125,7,126,7,113,4,100,10,125,7,126,7,48,0,48,0, + 113,4,124,0,83,0,41,11,122,238,70,105,103,117,114,101, + 32,111,117,116,32,119,104,97,116,32,95,95,105,109,112,111, + 114,116,95,95,32,115,104,111,117,108,100,32,114,101,116,117, + 114,110,46,10,10,32,32,32,32,84,104,101,32,105,109,112, + 111,114,116,95,32,112,97,114,97,109,101,116,101,114,32,105, + 115,32,97,32,99,97,108,108,97,98,108,101,32,119,104,105, + 99,104,32,116,97,107,101,115,32,116,104,101,32,110,97,109, + 101,32,111,102,32,109,111,100,117,108,101,32,116,111,10,32, + 32,32,32,105,109,112,111,114,116,46,32,73,116,32,105,115, + 32,114,101,113,117,105,114,101,100,32,116,111,32,100,101,99, + 111,117,112,108,101,32,116,104,101,32,102,117,110,99,116,105, + 111,110,32,102,114,111,109,32,97,115,115,117,109,105,110,103, + 32,105,109,112,111,114,116,108,105,98,39,115,10,32,32,32, + 32,105,109,112,111,114,116,32,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,32,105,115,32,100,101,115,105,114,101, + 100,46,10,10,32,32,32,32,122,8,46,95,95,97,108,108, + 95,95,122,13,96,96,102,114,111,109,32,108,105,115,116,39, + 39,122,8,73,116,101,109,32,105,110,32,122,18,32,109,117, + 115,116,32,98,101,32,115,116,114,44,32,110,111,116,32,250, + 1,42,218,7,95,95,97,108,108,95,95,84,114,211,0,0, + 0,114,184,0,0,0,78,41,16,114,197,0,0,0,114,198, + 0,0,0,114,1,0,0,0,114,199,0,0,0,114,14,0, + 0,0,114,4,0,0,0,218,16,95,104,97,110,100,108,101, + 95,102,114,111,109,108,105,115,116,114,214,0,0,0,114,46, + 0,0,0,114,68,0,0,0,114,205,0,0,0,114,17,0, + 0,0,114,15,0,0,0,114,93,0,0,0,114,35,0,0, + 0,114,208,0,0,0,41,8,114,97,0,0,0,218,8,102, + 114,111,109,108,105,115,116,114,206,0,0,0,114,212,0,0, + 0,218,1,120,90,5,119,104,101,114,101,90,9,102,114,111, + 109,95,110,97,109,101,90,3,101,120,99,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,215,0,0,0,9, + 4,0,0,115,48,0,0,0,0,10,8,1,10,1,4,1, + 12,2,4,1,10,1,8,255,10,2,8,1,14,1,10,1, + 2,255,8,2,10,1,14,1,2,1,14,1,14,4,10,1, + 16,255,2,2,12,1,26,1,114,215,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,6,0, + 0,0,67,0,0,0,115,146,0,0,0,124,0,160,0,100, + 1,161,1,125,1,124,0,160,0,100,2,161,1,125,2,124, + 1,100,3,117,1,114,82,124,2,100,3,117,1,114,78,124, + 1,124,2,106,1,107,3,114,78,116,2,106,3,100,4,124, + 1,155,2,100,5,124,2,106,1,155,2,100,6,157,5,116, + 4,100,7,100,8,141,3,1,0,124,1,83,0,124,2,100, + 3,117,1,114,96,124,2,106,1,83,0,116,2,106,3,100, + 9,116,4,100,7,100,8,141,3,1,0,124,0,100,10,25, + 0,125,1,100,11,124,0,118,1,114,142,124,1,160,5,100, + 12,161,1,100,13,25,0,125,1,124,1,83,0,41,14,122, + 167,67,97,108,99,117,108,97,116,101,32,119,104,97,116,32, + 95,95,112,97,99,107,97,103,101,95,95,32,115,104,111,117, + 108,100,32,98,101,46,10,10,32,32,32,32,95,95,112,97, + 99,107,97,103,101,95,95,32,105,115,32,110,111,116,32,103, + 117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32, + 100,101,102,105,110,101,100,32,111,114,32,99,111,117,108,100, + 32,98,101,32,115,101,116,32,116,111,32,78,111,110,101,10, + 32,32,32,32,116,111,32,114,101,112,114,101,115,101,110,116, + 32,116,104,97,116,32,105,116,115,32,112,114,111,112,101,114, + 32,118,97,108,117,101,32,105,115,32,117,110,107,110,111,119, + 110,46,10,10,32,32,32,32,114,146,0,0,0,114,106,0, + 0,0,78,122,32,95,95,112,97,99,107,97,103,101,95,95, + 32,33,61,32,95,95,115,112,101,99,95,95,46,112,97,114, + 101,110,116,32,40,122,4,32,33,61,32,250,1,41,233,3, + 0,0,0,41,1,90,10,115,116,97,99,107,108,101,118,101, + 108,122,89,99,97,110,39,116,32,114,101,115,111,108,118,101, + 32,112,97,99,107,97,103,101,32,102,114,111,109,32,95,95, + 115,112,101,99,95,95,32,111,114,32,95,95,112,97,99,107, + 97,103,101,95,95,44,32,102,97,108,108,105,110,103,32,98, + 97,99,107,32,111,110,32,95,95,110,97,109,101,95,95,32, + 97,110,100,32,95,95,112,97,116,104,95,95,114,1,0,0, + 0,114,142,0,0,0,114,129,0,0,0,114,22,0,0,0, + 41,6,114,35,0,0,0,114,131,0,0,0,114,193,0,0, + 0,114,194,0,0,0,114,195,0,0,0,114,130,0,0,0, + 41,3,218,7,103,108,111,98,97,108,115,114,187,0,0,0, + 114,96,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,17,95,99,97,108,99,95,95,95,112,97, + 99,107,97,103,101,95,95,46,4,0,0,115,42,0,0,0, + 0,7,10,1,10,1,8,1,18,1,6,1,2,255,4,1, + 4,255,6,2,4,254,6,3,4,1,8,1,6,2,6,2, + 4,254,6,3,8,1,8,1,14,1,114,221,0,0,0,114, + 10,0,0,0,99,5,0,0,0,0,0,0,0,0,0,0, + 0,9,0,0,0,5,0,0,0,67,0,0,0,115,180,0, + 0,0,124,4,100,1,107,2,114,18,116,0,124,0,131,1, + 125,5,110,36,124,1,100,2,117,1,114,30,124,1,110,2, + 105,0,125,6,116,1,124,6,131,1,125,7,116,0,124,0, + 124,7,124,4,131,3,125,5,124,3,115,150,124,4,100,1, + 107,2,114,84,116,0,124,0,160,2,100,3,161,1,100,1, + 25,0,131,1,83,0,124,0,115,92,124,5,83,0,116,3, + 124,0,131,1,116,3,124,0,160,2,100,3,161,1,100,1, + 25,0,131,1,24,0,125,8,116,4,106,5,124,5,106,6, + 100,2,116,3,124,5,106,6,131,1,124,8,24,0,133,2, + 25,0,25,0,83,0,110,26,116,7,124,5,100,4,131,2, + 114,172,116,8,124,5,124,3,116,0,131,3,83,0,124,5, + 83,0,100,2,83,0,41,5,97,215,1,0,0,73,109,112, + 111,114,116,32,97,32,109,111,100,117,108,101,46,10,10,32, + 32,32,32,84,104,101,32,39,103,108,111,98,97,108,115,39, + 32,97,114,103,117,109,101,110,116,32,105,115,32,117,115,101, + 100,32,116,111,32,105,110,102,101,114,32,119,104,101,114,101, + 32,116,104,101,32,105,109,112,111,114,116,32,105,115,32,111, + 99,99,117,114,114,105,110,103,32,102,114,111,109,10,32,32, + 32,32,116,111,32,104,97,110,100,108,101,32,114,101,108,97, + 116,105,118,101,32,105,109,112,111,114,116,115,46,32,84,104, + 101,32,39,108,111,99,97,108,115,39,32,97,114,103,117,109, + 101,110,116,32,105,115,32,105,103,110,111,114,101,100,46,32, + 84,104,101,10,32,32,32,32,39,102,114,111,109,108,105,115, + 116,39,32,97,114,103,117,109,101,110,116,32,115,112,101,99, + 105,102,105,101,115,32,119,104,97,116,32,115,104,111,117,108, + 100,32,101,120,105,115,116,32,97,115,32,97,116,116,114,105, + 98,117,116,101,115,32,111,110,32,116,104,101,32,109,111,100, + 117,108,101,10,32,32,32,32,98,101,105,110,103,32,105,109, + 112,111,114,116,101,100,32,40,101,46,103,46,32,96,96,102, + 114,111,109,32,109,111,100,117,108,101,32,105,109,112,111,114, + 116,32,60,102,114,111,109,108,105,115,116,62,96,96,41,46, + 32,32,84,104,101,32,39,108,101,118,101,108,39,10,32,32, + 32,32,97,114,103,117,109,101,110,116,32,114,101,112,114,101, + 115,101,110,116,115,32,116,104,101,32,112,97,99,107,97,103, + 101,32,108,111,99,97,116,105,111,110,32,116,111,32,105,109, + 112,111,114,116,32,102,114,111,109,32,105,110,32,97,32,114, + 101,108,97,116,105,118,101,10,32,32,32,32,105,109,112,111, + 114,116,32,40,101,46,103,46,32,96,96,102,114,111,109,32, + 46,46,112,107,103,32,105,109,112,111,114,116,32,109,111,100, + 96,96,32,119,111,117,108,100,32,104,97,118,101,32,97,32, + 39,108,101,118,101,108,39,32,111,102,32,50,41,46,10,10, + 32,32,32,32,114,22,0,0,0,78,114,129,0,0,0,114, + 142,0,0,0,41,9,114,210,0,0,0,114,221,0,0,0, + 218,9,112,97,114,116,105,116,105,111,110,114,186,0,0,0, + 114,15,0,0,0,114,93,0,0,0,114,1,0,0,0,114, + 4,0,0,0,114,215,0,0,0,41,9,114,17,0,0,0, + 114,220,0,0,0,218,6,108,111,99,97,108,115,114,216,0, + 0,0,114,188,0,0,0,114,97,0,0,0,90,8,103,108, + 111,98,97,108,115,95,114,187,0,0,0,90,7,99,117,116, + 95,111,102,102,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,10,95,95,105,109,112,111,114,116,95,95,73, + 4,0,0,115,30,0,0,0,0,11,8,1,10,2,16,1, + 8,1,12,1,4,3,8,1,18,1,4,1,4,4,26,3, + 32,1,10,1,12,2,114,224,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,38,0,0,0,116,0,160,1,124,0,161, + 1,125,1,124,1,100,0,117,0,114,30,116,2,100,1,124, + 0,23,0,131,1,130,1,116,3,124,1,131,1,83,0,41, + 2,78,122,25,110,111,32,98,117,105,108,116,45,105,110,32, + 109,111,100,117,108,101,32,110,97,109,101,100,32,41,4,114, + 161,0,0,0,114,168,0,0,0,114,80,0,0,0,114,160, + 0,0,0,41,2,114,17,0,0,0,114,96,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,18, + 95,98,117,105,108,116,105,110,95,102,114,111,109,95,110,97, + 109,101,110,4,0,0,115,8,0,0,0,0,1,10,1,8, + 1,12,1,114,225,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,10,0,0,0,5,0,0,0,67,0,0, + 0,115,166,0,0,0,124,1,97,0,124,0,97,1,116,2, + 116,1,131,1,125,2,116,1,106,3,160,4,161,0,68,0, + 93,72,92,2,125,3,125,4,116,5,124,4,124,2,131,2, + 114,26,124,3,116,1,106,6,118,0,114,60,116,7,125,5, + 110,18,116,0,160,8,124,3,161,1,114,26,116,9,125,5, + 110,2,113,26,116,10,124,4,124,5,131,2,125,6,116,11, + 124,6,124,4,131,2,1,0,113,26,116,1,106,3,116,12, + 25,0,125,7,100,1,68,0,93,46,125,8,124,8,116,1, + 106,3,118,1,114,138,116,13,124,8,131,1,125,9,110,10, + 116,1,106,3,124,8,25,0,125,9,116,14,124,7,124,8, + 124,9,131,3,1,0,113,114,100,2,83,0,41,3,122,250, + 83,101,116,117,112,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,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,10,32,32,32,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,65,115,32,115, + 121,115,32,105,115,32,110,101,101,100,101,100,32,102,111,114, + 32,115,121,115,46,109,111,100,117,108,101,115,32,97,99,99, + 101,115,115,32,97,110,100,32,95,105,109,112,32,105,115,32, + 110,101,101,100,101,100,32,116,111,32,108,111,97,100,32,98, + 117,105,108,116,45,105,110,10,32,32,32,32,109,111,100,117, + 108,101,115,44,32,116,104,111,115,101,32,116,119,111,32,109, + 111,100,117,108,101,115,32,109,117,115,116,32,98,101,32,101, + 120,112,108,105,99,105,116,108,121,32,112,97,115,115,101,100, + 32,105,110,46,10,10,32,32,32,32,41,3,114,23,0,0, + 0,114,193,0,0,0,114,65,0,0,0,78,41,15,114,58, + 0,0,0,114,15,0,0,0,114,14,0,0,0,114,93,0, + 0,0,218,5,105,116,101,109,115,114,197,0,0,0,114,79, + 0,0,0,114,161,0,0,0,114,89,0,0,0,114,175,0, + 0,0,114,143,0,0,0,114,149,0,0,0,114,1,0,0, + 0,114,225,0,0,0,114,5,0,0,0,41,10,218,10,115, + 121,115,95,109,111,100,117,108,101,218,11,95,105,109,112,95, + 109,111,100,117,108,101,90,11,109,111,100,117,108,101,95,116, + 121,112,101,114,17,0,0,0,114,97,0,0,0,114,110,0, + 0,0,114,96,0,0,0,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,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,6,95,115,101,116,117,112,117,4,0,0,115,36,0, + 0,0,0,9,4,1,4,3,8,1,18,1,10,1,10,1, + 6,1,10,1,6,2,2,1,10,1,12,3,10,1,8,1, + 10,1,10,2,10,1,114,229,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,38,0,0,0,116,0,124,0,124,1,131, + 2,1,0,116,1,106,2,160,3,116,4,161,1,1,0,116, + 1,106,2,160,3,116,5,161,1,1,0,100,1,83,0,41, + 2,122,48,73,110,115,116,97,108,108,32,105,109,112,111,114, + 116,101,114,115,32,102,111,114,32,98,117,105,108,116,105,110, + 32,97,110,100,32,102,114,111,122,101,110,32,109,111,100,117, + 108,101,115,78,41,6,114,229,0,0,0,114,15,0,0,0, + 114,192,0,0,0,114,120,0,0,0,114,161,0,0,0,114, + 175,0,0,0,41,2,114,227,0,0,0,114,228,0,0,0, 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 8,60,109,111,100,117,108,101,62,1,0,0,0,115,94,0, - 0,0,4,24,4,2,8,8,8,8,4,2,4,3,16,4, - 14,68,14,21,14,16,8,37,8,17,8,11,14,8,8,11, - 8,12,8,16,8,36,14,101,16,26,10,45,14,72,8,17, - 8,17,8,30,8,37,8,42,8,15,14,73,14,79,14,13, - 8,9,8,9,10,47,8,16,4,1,8,2,8,27,6,3, - 8,16,10,15,14,37,8,27,10,37,8,7,8,35,8,8, + 8,95,105,110,115,116,97,108,108,152,4,0,0,115,6,0, + 0,0,0,2,10,2,12,1,114,230,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, + 0,0,67,0,0,0,115,32,0,0,0,100,1,100,2,108, + 0,125,0,124,0,97,1,124,0,160,2,116,3,106,4,116, + 5,25,0,161,1,1,0,100,2,83,0,41,3,122,57,73, + 110,115,116,97,108,108,32,105,109,112,111,114,116,101,114,115, + 32,116,104,97,116,32,114,101,113,117,105,114,101,32,101,120, + 116,101,114,110,97,108,32,102,105,108,101,115,121,115,116,101, + 109,32,97,99,99,101,115,115,114,22,0,0,0,78,41,6, + 218,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,127,0,0, + 0,114,230,0,0,0,114,15,0,0,0,114,93,0,0,0, + 114,1,0,0,0,41,1,114,231,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,27,95,105,110, + 115,116,97,108,108,95,101,120,116,101,114,110,97,108,95,105, + 109,112,111,114,116,101,114,115,160,4,0,0,115,6,0,0, + 0,0,3,8,1,4,1,114,232,0,0,0,41,2,78,78, + 41,1,78,41,2,78,114,22,0,0,0,41,4,78,78,114, + 10,0,0,0,114,22,0,0,0,41,50,114,3,0,0,0, + 114,127,0,0,0,114,12,0,0,0,114,18,0,0,0,114, + 60,0,0,0,114,34,0,0,0,114,44,0,0,0,114,19, + 0,0,0,114,20,0,0,0,114,50,0,0,0,114,51,0, + 0,0,114,54,0,0,0,114,66,0,0,0,114,68,0,0, + 0,114,77,0,0,0,114,87,0,0,0,114,91,0,0,0, + 114,98,0,0,0,114,112,0,0,0,114,113,0,0,0,114, + 92,0,0,0,114,143,0,0,0,114,149,0,0,0,114,153, + 0,0,0,114,108,0,0,0,114,94,0,0,0,114,159,0, + 0,0,114,160,0,0,0,114,95,0,0,0,114,161,0,0, + 0,114,175,0,0,0,114,180,0,0,0,114,189,0,0,0, + 114,191,0,0,0,114,196,0,0,0,114,202,0,0,0,90, + 15,95,69,82,82,95,77,83,71,95,80,82,69,70,73,88, + 114,204,0,0,0,114,207,0,0,0,218,6,111,98,106,101, + 99,116,114,208,0,0,0,114,209,0,0,0,114,210,0,0, + 0,114,215,0,0,0,114,221,0,0,0,114,224,0,0,0, + 114,225,0,0,0,114,229,0,0,0,114,230,0,0,0,114, + 232,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,8,60,109,111,100,117,108, + 101,62,1,0,0,0,115,94,0,0,0,4,24,4,2,8, + 8,8,8,4,2,4,3,16,4,14,77,14,21,14,16,8, + 37,8,17,8,11,14,8,8,11,8,12,8,16,8,36,14, + 101,16,26,10,45,14,72,8,17,8,17,8,30,8,37,8, + 42,8,15,14,75,14,79,14,13,8,9,8,9,10,47,8, + 16,4,1,8,2,8,32,6,3,8,16,10,15,14,37,8, + 27,10,37,8,7,8,35,8,8, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 74d98bde..a8d5d9aa 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -69,796 +69,805 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,67,65,83,69,79,75,115,12,0,0,0,80,89,84,72, 79,78,67,65,83,69,79,75,99,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,19,0,0, - 0,115,10,0,0,0,136,0,116,0,106,1,107,6,83,0, - 41,1,250,53,84,114,117,101,32,105,102,32,102,105,108,101, - 110,97,109,101,115,32,109,117,115,116,32,98,101,32,99,104, - 101,99,107,101,100,32,99,97,115,101,45,105,110,115,101,110, - 115,105,116,105,118,101,108,121,46,41,2,218,3,95,111,115, - 90,7,101,110,118,105,114,111,110,169,0,169,1,218,3,107, - 101,121,114,3,0,0,0,250,38,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,95,101,120,116,101,114,110,97,108,62,218, - 11,95,114,101,108,97,120,95,99,97,115,101,36,0,0,0, - 115,2,0,0,0,0,2,122,37,95,109,97,107,101,95,114, - 101,108,97,120,95,99,97,115,101,46,60,108,111,99,97,108, - 115,62,46,95,114,101,108,97,120,95,99,97,115,101,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,83,0,0,0,115,4,0,0,0,100,1,83,0, - 41,2,114,1,0,0,0,70,114,3,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,7,0,0,0,40,0,0,0,115,2,0,0,0,0, - 2,41,5,218,3,115,121,115,218,8,112,108,97,116,102,111, - 114,109,218,10,115,116,97,114,116,115,119,105,116,104,218,27, - 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,218,35,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,83,84,82,95,75,69,89, - 41,1,114,7,0,0,0,114,3,0,0,0,114,4,0,0, - 0,114,6,0,0,0,218,16,95,109,97,107,101,95,114,101, - 108,97,120,95,99,97,115,101,29,0,0,0,115,14,0,0, - 0,0,1,12,1,12,1,6,2,4,2,14,4,8,3,114, - 13,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,20,0, - 0,0,116,0,124,0,131,1,100,1,64,0,160,1,100,2, - 100,3,161,2,83,0,41,4,122,42,67,111,110,118,101,114, - 116,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103, - 101,114,32,116,111,32,108,105,116,116,108,101,45,101,110,100, - 105,97,110,46,236,3,0,0,0,255,127,255,127,3,0,233, - 4,0,0,0,218,6,108,105,116,116,108,101,41,2,218,3, - 105,110,116,218,8,116,111,95,98,121,116,101,115,41,1,218, - 1,120,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,12,95,112,97,99,107,95,117,105,110,116,51,50,46, - 0,0,0,115,2,0,0,0,0,2,114,20,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,116,0,124, - 0,131,1,100,1,107,2,115,16,116,1,130,1,116,2,160, - 3,124,0,100,2,161,2,83,0,41,3,122,47,67,111,110, - 118,101,114,116,32,52,32,98,121,116,101,115,32,105,110,32, - 108,105,116,116,108,101,45,101,110,100,105,97,110,32,116,111, - 32,97,110,32,105,110,116,101,103,101,114,46,114,15,0,0, - 0,114,16,0,0,0,169,4,218,3,108,101,110,218,14,65, - 115,115,101,114,116,105,111,110,69,114,114,111,114,114,17,0, - 0,0,218,10,102,114,111,109,95,98,121,116,101,115,169,1, - 218,4,100,97,116,97,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,14,95,117,110,112,97,99,107,95,117, - 105,110,116,51,50,51,0,0,0,115,4,0,0,0,0,2, - 16,1,114,27,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,116,0,124,0,131,1,100,1,107,2,115, - 16,116,1,130,1,116,2,160,3,124,0,100,2,161,2,83, - 0,41,3,122,47,67,111,110,118,101,114,116,32,50,32,98, - 121,116,101,115,32,105,110,32,108,105,116,116,108,101,45,101, - 110,100,105,97,110,32,116,111,32,97,110,32,105,110,116,101, - 103,101,114,46,233,2,0,0,0,114,16,0,0,0,114,21, - 0,0,0,114,25,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,14,95,117,110,112,97,99,107, - 95,117,105,110,116,49,54,56,0,0,0,115,4,0,0,0, - 0,2,16,1,114,29,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,4,0,0,0,71,0, - 0,0,115,20,0,0,0,116,0,160,1,100,1,100,2,132, - 0,124,0,68,0,131,1,161,1,83,0,41,3,122,31,82, - 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, - 115,46,112,97,116,104,46,106,111,105,110,40,41,46,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,5, - 0,0,0,83,0,0,0,115,26,0,0,0,103,0,124,0, - 93,18,125,1,124,1,114,4,124,1,160,0,116,1,161,1, - 145,2,113,4,83,0,114,3,0,0,0,41,2,218,6,114, - 115,116,114,105,112,218,15,112,97,116,104,95,115,101,112,97, - 114,97,116,111,114,115,41,2,218,2,46,48,218,4,112,97, - 114,116,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,10,60,108,105,115,116,99,111,109,112,62,64,0,0, - 0,115,6,0,0,0,6,1,2,0,4,255,122,30,95,112, - 97,116,104,95,106,111,105,110,46,60,108,111,99,97,108,115, - 62,46,60,108,105,115,116,99,111,109,112,62,41,2,218,8, - 112,97,116,104,95,115,101,112,218,4,106,111,105,110,41,1, - 218,10,112,97,116,104,95,112,97,114,116,115,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,10,95,112,97, - 116,104,95,106,111,105,110,62,0,0,0,115,6,0,0,0, - 0,2,10,1,2,255,114,38,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, - 67,0,0,0,115,96,0,0,0,116,0,116,1,131,1,100, - 1,107,2,114,36,124,0,160,2,116,3,161,1,92,3,125, - 1,125,2,125,3,124,1,124,3,102,2,83,0,116,4,124, - 0,131,1,68,0,93,42,125,4,124,4,116,1,107,6,114, - 44,124,0,106,5,124,4,100,1,100,2,141,2,92,2,125, - 1,125,3,124,1,124,3,102,2,2,0,1,0,83,0,113, - 44,100,3,124,0,102,2,83,0,41,4,122,32,82,101,112, - 108,97,99,101,109,101,110,116,32,102,111,114,32,111,115,46, - 112,97,116,104,46,115,112,108,105,116,40,41,46,233,1,0, - 0,0,41,1,90,8,109,97,120,115,112,108,105,116,218,0, - 41,6,114,22,0,0,0,114,31,0,0,0,218,10,114,112, - 97,114,116,105,116,105,111,110,114,35,0,0,0,218,8,114, - 101,118,101,114,115,101,100,218,6,114,115,112,108,105,116,41, - 5,218,4,112,97,116,104,90,5,102,114,111,110,116,218,1, - 95,218,4,116,97,105,108,114,19,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,11,95,112,97, - 116,104,95,115,112,108,105,116,68,0,0,0,115,16,0,0, - 0,0,2,12,1,16,1,8,1,12,1,8,1,18,1,14, - 1,114,47,0,0,0,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, - 10,0,0,0,116,0,160,1,124,0,161,1,83,0,41,1, - 122,126,83,116,97,116,32,116,104,101,32,112,97,116,104,46, - 10,10,32,32,32,32,77,97,100,101,32,97,32,115,101,112, - 97,114,97,116,101,32,102,117,110,99,116,105,111,110,32,116, - 111,32,109,97,107,101,32,105,116,32,101,97,115,105,101,114, - 32,116,111,32,111,118,101,114,114,105,100,101,32,105,110,32, - 101,120,112,101,114,105,109,101,110,116,115,10,32,32,32,32, - 40,101,46,103,46,32,99,97,99,104,101,32,115,116,97,116, - 32,114,101,115,117,108,116,115,41,46,10,10,32,32,32,32, - 41,2,114,2,0,0,0,90,4,115,116,97,116,169,1,114, - 44,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,10,95,112,97,116,104,95,115,116,97,116,80, - 0,0,0,115,2,0,0,0,0,7,114,49,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,50,0,0,0,122,12,116, - 0,124,0,131,1,125,2,87,0,110,22,4,0,116,1,107, - 10,114,34,1,0,1,0,1,0,89,0,100,1,83,0,88, - 0,124,2,106,2,100,2,64,0,124,1,107,2,83,0,41, - 3,122,49,84,101,115,116,32,119,104,101,116,104,101,114,32, - 116,104,101,32,112,97,116,104,32,105,115,32,116,104,101,32, - 115,112,101,99,105,102,105,101,100,32,109,111,100,101,32,116, - 121,112,101,46,70,105,0,240,0,0,41,3,114,49,0,0, - 0,218,7,79,83,69,114,114,111,114,218,7,115,116,95,109, - 111,100,101,41,3,114,44,0,0,0,218,4,109,111,100,101, - 90,9,115,116,97,116,95,105,110,102,111,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,18,95,112,97,116, - 104,95,105,115,95,109,111,100,101,95,116,121,112,101,90,0, - 0,0,115,10,0,0,0,0,2,2,1,12,1,14,1,8, - 1,114,53,0,0,0,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, - 10,0,0,0,116,0,124,0,100,1,131,2,83,0,41,2, - 122,31,82,101,112,108,97,99,101,109,101,110,116,32,102,111, - 114,32,111,115,46,112,97,116,104,46,105,115,102,105,108,101, - 46,105,0,128,0,0,41,1,114,53,0,0,0,114,48,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,12,95,112,97,116,104,95,105,115,102,105,108,101,99, - 0,0,0,115,2,0,0,0,0,2,114,54,0,0,0,99, + 0,115,20,0,0,0,116,0,106,1,106,2,12,0,111,18, + 136,0,116,3,106,4,118,0,83,0,41,1,122,94,84,114, + 117,101,32,105,102,32,102,105,108,101,110,97,109,101,115,32, + 109,117,115,116,32,98,101,32,99,104,101,99,107,101,100,32, + 99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101, + 108,121,32,97,110,100,32,105,103,110,111,114,101,32,101,110, + 118,105,114,111,110,109,101,110,116,32,102,108,97,103,115,32, + 97,114,101,32,110,111,116,32,115,101,116,46,41,5,218,3, + 115,121,115,218,5,102,108,97,103,115,218,18,105,103,110,111, + 114,101,95,101,110,118,105,114,111,110,109,101,110,116,218,3, + 95,111,115,90,7,101,110,118,105,114,111,110,169,0,169,1, + 218,3,107,101,121,114,5,0,0,0,250,38,60,102,114,111, + 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, + 111,111,116,115,116,114,97,112,95,101,120,116,101,114,110,97, + 108,62,218,11,95,114,101,108,97,120,95,99,97,115,101,36, + 0,0,0,115,2,0,0,0,0,2,122,37,95,109,97,107, + 101,95,114,101,108,97,120,95,99,97,115,101,46,60,108,111, + 99,97,108,115,62,46,95,114,101,108,97,120,95,99,97,115, + 101,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,83,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,122,53,84,114,117,101,32,105,102,32,102, + 105,108,101,110,97,109,101,115,32,109,117,115,116,32,98,101, + 32,99,104,101,99,107,101,100,32,99,97,115,101,45,105,110, + 115,101,110,115,105,116,105,118,101,108,121,46,70,114,5,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,9,0,0,0,40,0,0,0,115, + 2,0,0,0,0,2,41,5,114,1,0,0,0,218,8,112, + 108,97,116,102,111,114,109,218,10,115,116,97,114,116,115,119, + 105,116,104,218,27,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, + 218,35,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,83,84, + 82,95,75,69,89,41,1,114,9,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,8,0,0,0,218,16,95,109,97, + 107,101,95,114,101,108,97,120,95,99,97,115,101,29,0,0, + 0,115,14,0,0,0,0,1,12,1,12,1,6,2,4,2, + 14,4,8,3,114,14,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,20,0,0,0,116,0,124,0,131,1,100,1,64, + 0,160,1,100,2,100,3,161,2,83,0,41,4,122,42,67, + 111,110,118,101,114,116,32,97,32,51,50,45,98,105,116,32, + 105,110,116,101,103,101,114,32,116,111,32,108,105,116,116,108, + 101,45,101,110,100,105,97,110,46,236,3,0,0,0,255,127, + 255,127,3,0,233,4,0,0,0,218,6,108,105,116,116,108, + 101,41,2,218,3,105,110,116,218,8,116,111,95,98,121,116, + 101,115,41,1,218,1,120,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,12,95,112,97,99,107,95,117,105, + 110,116,51,50,46,0,0,0,115,2,0,0,0,0,2,114, + 21,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,116,0,124,0,131,1,100,1,107,2,115,16,74,0, + 130,1,116,1,160,2,124,0,100,2,161,2,83,0,41,3, + 122,47,67,111,110,118,101,114,116,32,52,32,98,121,116,101, + 115,32,105,110,32,108,105,116,116,108,101,45,101,110,100,105, + 97,110,32,116,111,32,97,110,32,105,110,116,101,103,101,114, + 46,114,16,0,0,0,114,17,0,0,0,169,3,218,3,108, + 101,110,114,18,0,0,0,218,10,102,114,111,109,95,98,121, + 116,101,115,169,1,218,4,100,97,116,97,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,14,95,117,110,112, + 97,99,107,95,117,105,110,116,51,50,51,0,0,0,115,4, + 0,0,0,0,2,16,1,114,27,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,116,0,124,0,131,1, + 100,1,107,2,115,16,74,0,130,1,116,1,160,2,124,0, + 100,2,161,2,83,0,41,3,122,47,67,111,110,118,101,114, + 116,32,50,32,98,121,116,101,115,32,105,110,32,108,105,116, + 116,108,101,45,101,110,100,105,97,110,32,116,111,32,97,110, + 32,105,110,116,101,103,101,114,46,233,2,0,0,0,114,17, + 0,0,0,114,22,0,0,0,114,25,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,14,95,117, + 110,112,97,99,107,95,117,105,110,116,49,54,56,0,0,0, + 115,4,0,0,0,0,2,16,1,114,29,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, + 0,0,0,71,0,0,0,115,20,0,0,0,116,0,160,1, + 100,1,100,2,132,0,124,0,68,0,131,1,161,1,83,0, + 41,3,122,31,82,101,112,108,97,99,101,109,101,110,116,32, + 102,111,114,32,111,115,46,112,97,116,104,46,106,111,105,110, + 40,41,46,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,5,0,0,0,83,0,0,0,115,26,0,0, + 0,103,0,124,0,93,18,125,1,124,1,114,4,124,1,160, + 0,116,1,161,1,145,2,113,4,83,0,114,5,0,0,0, + 41,2,218,6,114,115,116,114,105,112,218,15,112,97,116,104, + 95,115,101,112,97,114,97,116,111,114,115,41,2,218,2,46, + 48,218,4,112,97,114,116,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,10,60,108,105,115,116,99,111,109, + 112,62,64,0,0,0,115,4,0,0,0,6,1,6,255,122, + 30,95,112,97,116,104,95,106,111,105,110,46,60,108,111,99, + 97,108,115,62,46,60,108,105,115,116,99,111,109,112,62,41, + 2,218,8,112,97,116,104,95,115,101,112,218,4,106,111,105, + 110,41,1,218,10,112,97,116,104,95,112,97,114,116,115,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,10, + 95,112,97,116,104,95,106,111,105,110,62,0,0,0,115,6, + 0,0,0,0,2,10,1,2,255,114,38,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5, + 0,0,0,67,0,0,0,115,96,0,0,0,116,0,116,1, + 131,1,100,1,107,2,114,36,124,0,160,2,116,3,161,1, + 92,3,125,1,125,2,125,3,124,1,124,3,102,2,83,0, + 116,4,124,0,131,1,68,0,93,42,125,4,124,4,116,1, + 118,0,114,44,124,0,106,5,124,4,100,1,100,2,141,2, + 92,2,125,1,125,3,124,1,124,3,102,2,2,0,1,0, + 83,0,113,44,100,3,124,0,102,2,83,0,41,4,122,32, + 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32, + 111,115,46,112,97,116,104,46,115,112,108,105,116,40,41,46, + 233,1,0,0,0,41,1,90,8,109,97,120,115,112,108,105, + 116,218,0,41,6,114,23,0,0,0,114,31,0,0,0,218, + 10,114,112,97,114,116,105,116,105,111,110,114,35,0,0,0, + 218,8,114,101,118,101,114,115,101,100,218,6,114,115,112,108, + 105,116,41,5,218,4,112,97,116,104,90,5,102,114,111,110, + 116,218,1,95,218,4,116,97,105,108,114,20,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,11, + 95,112,97,116,104,95,115,112,108,105,116,68,0,0,0,115, + 16,0,0,0,0,2,12,1,16,1,8,1,12,1,8,1, + 18,1,14,1,114,47,0,0,0,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,10,0,0,0,116,0,160,1,124,0,161,1,83, + 0,41,1,122,126,83,116,97,116,32,116,104,101,32,112,97, + 116,104,46,10,10,32,32,32,32,77,97,100,101,32,97,32, + 115,101,112,97,114,97,116,101,32,102,117,110,99,116,105,111, + 110,32,116,111,32,109,97,107,101,32,105,116,32,101,97,115, + 105,101,114,32,116,111,32,111,118,101,114,114,105,100,101,32, + 105,110,32,101,120,112,101,114,105,109,101,110,116,115,10,32, + 32,32,32,40,101,46,103,46,32,99,97,99,104,101,32,115, + 116,97,116,32,114,101,115,117,108,116,115,41,46,10,10,32, + 32,32,32,41,2,114,4,0,0,0,90,4,115,116,97,116, + 169,1,114,44,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,10,95,112,97,116,104,95,115,116, + 97,116,80,0,0,0,115,2,0,0,0,0,7,114,49,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,48,0,0,0, + 122,12,116,0,124,0,131,1,125,2,87,0,110,20,4,0, + 116,1,121,32,1,0,1,0,1,0,89,0,100,1,83,0, + 48,0,124,2,106,2,100,2,64,0,124,1,107,2,83,0, + 41,3,122,49,84,101,115,116,32,119,104,101,116,104,101,114, + 32,116,104,101,32,112,97,116,104,32,105,115,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,32,109,111,100,101,32, + 116,121,112,101,46,70,105,0,240,0,0,41,3,114,49,0, + 0,0,218,7,79,83,69,114,114,111,114,218,7,115,116,95, + 109,111,100,101,41,3,114,44,0,0,0,218,4,109,111,100, + 101,90,9,115,116,97,116,95,105,110,102,111,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,18,95,112,97, + 116,104,95,105,115,95,109,111,100,101,95,116,121,112,101,90, + 0,0,0,115,10,0,0,0,0,2,2,1,12,1,12,1, + 8,1,114,53,0,0,0,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,10,0,0,0,116,0,124,0,100,1,131,2,83,0,41, + 2,122,31,82,101,112,108,97,99,101,109,101,110,116,32,102, + 111,114,32,111,115,46,112,97,116,104,46,105,115,102,105,108, + 101,46,105,0,128,0,0,41,1,114,53,0,0,0,114,48, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,12,95,112,97,116,104,95,105,115,102,105,108,101, + 99,0,0,0,115,2,0,0,0,0,2,114,54,0,0,0, + 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,22,0,0,0,124,0, + 115,12,116,0,160,1,161,0,125,0,116,2,124,0,100,1, + 131,2,83,0,41,2,122,30,82,101,112,108,97,99,101,109, + 101,110,116,32,102,111,114,32,111,115,46,112,97,116,104,46, + 105,115,100,105,114,46,105,0,64,0,0,41,3,114,4,0, + 0,0,218,6,103,101,116,99,119,100,114,53,0,0,0,114, + 48,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,11,95,112,97,116,104,95,105,115,100,105,114, + 104,0,0,0,115,6,0,0,0,0,2,4,1,8,1,114, + 56,0,0,0,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,26,0, + 0,0,124,0,160,0,116,1,161,1,112,24,124,0,100,1, + 100,2,133,2,25,0,116,2,118,0,83,0,41,3,122,142, + 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32, + 111,115,46,112,97,116,104,46,105,115,97,98,115,46,10,10, + 32,32,32,32,67,111,110,115,105,100,101,114,115,32,97,32, + 87,105,110,100,111,119,115,32,100,114,105,118,101,45,114,101, + 108,97,116,105,118,101,32,112,97,116,104,32,40,110,111,32, + 100,114,105,118,101,44,32,98,117,116,32,115,116,97,114,116, + 115,32,119,105,116,104,32,115,108,97,115,104,41,32,116,111, + 10,32,32,32,32,115,116,105,108,108,32,98,101,32,34,97, + 98,115,111,108,117,116,101,34,46,10,32,32,32,32,114,39, + 0,0,0,233,3,0,0,0,41,3,114,11,0,0,0,114, + 31,0,0,0,218,20,95,112,97,116,104,115,101,112,115,95, + 119,105,116,104,95,99,111,108,111,110,114,48,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,11, + 95,112,97,116,104,95,105,115,97,98,115,111,0,0,0,115, + 2,0,0,0,0,6,114,59,0,0,0,233,182,1,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,11,0,0,0,67,0,0,0,115,178,0,0,0,100,1, + 160,0,124,0,116,1,124,0,131,1,161,2,125,3,116,2, + 160,3,124,3,116,2,106,4,116,2,106,5,66,0,116,2, + 106,6,66,0,124,2,100,2,64,0,161,3,125,4,122,70, + 116,7,160,8,124,4,100,3,161,2,143,26,125,5,124,5, + 160,9,124,1,161,1,1,0,87,0,100,4,4,0,4,0, + 131,3,1,0,110,16,49,0,115,94,48,0,1,0,1,0, + 1,0,89,0,1,0,116,2,160,10,124,3,124,0,161,2, + 1,0,87,0,110,54,4,0,116,11,121,172,1,0,1,0, + 1,0,122,14,116,2,160,12,124,3,161,1,1,0,87,0, + 110,18,4,0,116,11,121,164,1,0,1,0,1,0,89,0, + 110,2,48,0,130,0,89,0,110,2,48,0,100,4,83,0, + 41,5,122,162,66,101,115,116,45,101,102,102,111,114,116,32, + 102,117,110,99,116,105,111,110,32,116,111,32,119,114,105,116, + 101,32,100,97,116,97,32,116,111,32,97,32,112,97,116,104, + 32,97,116,111,109,105,99,97,108,108,121,46,10,32,32,32, + 32,66,101,32,112,114,101,112,97,114,101,100,32,116,111,32, + 104,97,110,100,108,101,32,97,32,70,105,108,101,69,120,105, + 115,116,115,69,114,114,111,114,32,105,102,32,99,111,110,99, + 117,114,114,101,110,116,32,119,114,105,116,105,110,103,32,111, + 102,32,116,104,101,10,32,32,32,32,116,101,109,112,111,114, + 97,114,121,32,102,105,108,101,32,105,115,32,97,116,116,101, + 109,112,116,101,100,46,250,5,123,125,46,123,125,114,60,0, + 0,0,90,2,119,98,78,41,13,218,6,102,111,114,109,97, + 116,218,2,105,100,114,4,0,0,0,90,4,111,112,101,110, + 90,6,79,95,69,88,67,76,90,7,79,95,67,82,69,65, + 84,90,8,79,95,87,82,79,78,76,89,218,3,95,105,111, + 218,6,70,105,108,101,73,79,218,5,119,114,105,116,101,218, + 7,114,101,112,108,97,99,101,114,50,0,0,0,90,6,117, + 110,108,105,110,107,41,6,114,44,0,0,0,114,26,0,0, + 0,114,52,0,0,0,90,8,112,97,116,104,95,116,109,112, + 90,2,102,100,218,4,102,105,108,101,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,13,95,119,114,105,116, + 101,95,97,116,111,109,105,99,120,0,0,0,115,28,0,0, + 0,0,5,16,1,6,1,22,255,4,2,2,3,14,1,40, + 1,16,1,12,1,2,1,14,1,12,1,6,1,114,69,0, + 0,0,105,97,13,0,0,114,28,0,0,0,114,17,0,0, + 0,115,2,0,0,0,13,10,90,11,95,95,112,121,99,97, + 99,104,101,95,95,122,4,111,112,116,45,122,3,46,112,121, + 122,4,46,112,121,99,78,41,1,218,12,111,112,116,105,109, + 105,122,97,116,105,111,110,99,2,0,0,0,0,0,0,0, + 1,0,0,0,12,0,0,0,5,0,0,0,67,0,0,0, + 115,88,1,0,0,124,1,100,1,117,1,114,52,116,0,160, + 1,100,2,116,2,161,2,1,0,124,2,100,1,117,1,114, + 40,100,3,125,3,116,3,124,3,131,1,130,1,124,1,114, + 48,100,4,110,2,100,5,125,2,116,4,160,5,124,0,161, + 1,125,0,116,6,124,0,131,1,92,2,125,4,125,5,124, + 5,160,7,100,6,161,1,92,3,125,6,125,7,125,8,116, + 8,106,9,106,10,125,9,124,9,100,1,117,0,114,114,116, + 11,100,7,131,1,130,1,100,4,160,12,124,6,114,126,124, + 6,110,2,124,8,124,7,124,9,103,3,161,1,125,10,124, + 2,100,1,117,0,114,172,116,8,106,13,106,14,100,8,107, + 2,114,164,100,4,125,2,110,8,116,8,106,13,106,14,125, + 2,116,15,124,2,131,1,125,2,124,2,100,4,107,3,114, + 224,124,2,160,16,161,0,115,210,116,17,100,9,160,18,124, + 2,161,1,131,1,130,1,100,10,160,18,124,10,116,19,124, + 2,161,3,125,10,124,10,116,20,100,8,25,0,23,0,125, + 11,116,8,106,21,100,1,117,1,144,1,114,76,116,22,124, + 4,131,1,144,1,115,16,116,23,116,4,160,24,161,0,124, + 4,131,2,125,4,124,4,100,5,25,0,100,11,107,2,144, + 1,114,56,124,4,100,8,25,0,116,25,118,1,144,1,114, + 56,124,4,100,12,100,1,133,2,25,0,125,4,116,23,116, + 8,106,21,124,4,160,26,116,25,161,1,124,11,131,3,83, + 0,116,23,124,4,116,27,124,11,131,3,83,0,41,13,97, + 254,2,0,0,71,105,118,101,110,32,116,104,101,32,112,97, + 116,104,32,116,111,32,97,32,46,112,121,32,102,105,108,101, + 44,32,114,101,116,117,114,110,32,116,104,101,32,112,97,116, + 104,32,116,111,32,105,116,115,32,46,112,121,99,32,102,105, + 108,101,46,10,10,32,32,32,32,84,104,101,32,46,112,121, + 32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,110, + 101,101,100,32,116,111,32,101,120,105,115,116,59,32,116,104, + 105,115,32,115,105,109,112,108,121,32,114,101,116,117,114,110, + 115,32,116,104,101,32,112,97,116,104,32,116,111,32,116,104, + 101,10,32,32,32,32,46,112,121,99,32,102,105,108,101,32, + 99,97,108,99,117,108,97,116,101,100,32,97,115,32,105,102, + 32,116,104,101,32,46,112,121,32,102,105,108,101,32,119,101, + 114,101,32,105,109,112,111,114,116,101,100,46,10,10,32,32, + 32,32,84,104,101,32,39,111,112,116,105,109,105,122,97,116, + 105,111,110,39,32,112,97,114,97,109,101,116,101,114,32,99, + 111,110,116,114,111,108,115,32,116,104,101,32,112,114,101,115, + 117,109,101,100,32,111,112,116,105,109,105,122,97,116,105,111, + 110,32,108,101,118,101,108,32,111,102,10,32,32,32,32,116, + 104,101,32,98,121,116,101,99,111,100,101,32,102,105,108,101, + 46,32,73,102,32,39,111,112,116,105,109,105,122,97,116,105, + 111,110,39,32,105,115,32,110,111,116,32,78,111,110,101,44, + 32,116,104,101,32,115,116,114,105,110,103,32,114,101,112,114, + 101,115,101,110,116,97,116,105,111,110,10,32,32,32,32,111, + 102,32,116,104,101,32,97,114,103,117,109,101,110,116,32,105, + 115,32,116,97,107,101,110,32,97,110,100,32,118,101,114,105, + 102,105,101,100,32,116,111,32,98,101,32,97,108,112,104,97, + 110,117,109,101,114,105,99,32,40,101,108,115,101,32,86,97, + 108,117,101,69,114,114,111,114,10,32,32,32,32,105,115,32, + 114,97,105,115,101,100,41,46,10,10,32,32,32,32,84,104, + 101,32,100,101,98,117,103,95,111,118,101,114,114,105,100,101, + 32,112,97,114,97,109,101,116,101,114,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,73,102,32,100,101,98, + 117,103,95,111,118,101,114,114,105,100,101,32,105,115,32,110, + 111,116,32,78,111,110,101,44,10,32,32,32,32,97,32,84, + 114,117,101,32,118,97,108,117,101,32,105,115,32,116,104,101, + 32,115,97,109,101,32,97,115,32,115,101,116,116,105,110,103, + 32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,32, + 116,111,32,116,104,101,32,101,109,112,116,121,32,115,116,114, + 105,110,103,10,32,32,32,32,119,104,105,108,101,32,97,32, + 70,97,108,115,101,32,118,97,108,117,101,32,105,115,32,101, + 113,117,105,118,97,108,101,110,116,32,116,111,32,115,101,116, + 116,105,110,103,32,39,111,112,116,105,109,105,122,97,116,105, + 111,110,39,32,116,111,32,39,49,39,46,10,10,32,32,32, + 32,73,102,32,115,121,115,46,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,46,99,97,99,104,101,95,116,97,103, + 32,105,115,32,78,111,110,101,32,116,104,101,110,32,78,111, + 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, + 114,32,105,115,32,114,97,105,115,101,100,46,10,10,32,32, + 32,32,78,122,70,116,104,101,32,100,101,98,117,103,95,111, + 118,101,114,114,105,100,101,32,112,97,114,97,109,101,116,101, + 114,32,105,115,32,100,101,112,114,101,99,97,116,101,100,59, + 32,117,115,101,32,39,111,112,116,105,109,105,122,97,116,105, + 111,110,39,32,105,110,115,116,101,97,100,122,50,100,101,98, + 117,103,95,111,118,101,114,114,105,100,101,32,111,114,32,111, + 112,116,105,109,105,122,97,116,105,111,110,32,109,117,115,116, + 32,98,101,32,115,101,116,32,116,111,32,78,111,110,101,114, + 40,0,0,0,114,39,0,0,0,218,1,46,250,36,115,121, + 115,46,105,109,112,108,101,109,101,110,116,97,116,105,111,110, + 46,99,97,99,104,101,95,116,97,103,32,105,115,32,78,111, + 110,101,233,0,0,0,0,122,24,123,33,114,125,32,105,115, + 32,110,111,116,32,97,108,112,104,97,110,117,109,101,114,105, + 99,122,7,123,125,46,123,125,123,125,250,1,58,114,28,0, + 0,0,41,28,218,9,95,119,97,114,110,105,110,103,115,218, + 4,119,97,114,110,218,18,68,101,112,114,101,99,97,116,105, + 111,110,87,97,114,110,105,110,103,218,9,84,121,112,101,69, + 114,114,111,114,114,4,0,0,0,218,6,102,115,112,97,116, + 104,114,47,0,0,0,114,41,0,0,0,114,1,0,0,0, + 218,14,105,109,112,108,101,109,101,110,116,97,116,105,111,110, + 218,9,99,97,99,104,101,95,116,97,103,218,19,78,111,116, + 73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,114, + 114,36,0,0,0,114,2,0,0,0,218,8,111,112,116,105, + 109,105,122,101,218,3,115,116,114,218,7,105,115,97,108,110, + 117,109,218,10,86,97,108,117,101,69,114,114,111,114,114,62, + 0,0,0,218,4,95,79,80,84,218,17,66,89,84,69,67, + 79,68,69,95,83,85,70,70,73,88,69,83,218,14,112,121, + 99,97,99,104,101,95,112,114,101,102,105,120,114,59,0,0, + 0,114,38,0,0,0,114,55,0,0,0,114,31,0,0,0, + 218,6,108,115,116,114,105,112,218,8,95,80,89,67,65,67, + 72,69,41,12,114,44,0,0,0,90,14,100,101,98,117,103, + 95,111,118,101,114,114,105,100,101,114,70,0,0,0,218,7, + 109,101,115,115,97,103,101,218,4,104,101,97,100,114,46,0, + 0,0,90,4,98,97,115,101,218,3,115,101,112,218,4,114, + 101,115,116,90,3,116,97,103,90,15,97,108,109,111,115,116, + 95,102,105,108,101,110,97,109,101,218,8,102,105,108,101,110, + 97,109,101,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,17,99,97,99,104,101,95,102,114,111,109,95,115, + 111,117,114,99,101,45,1,0,0,115,72,0,0,0,0,18, + 8,1,6,1,2,255,4,2,8,1,4,1,8,1,12,1, + 10,1,12,1,16,1,8,1,8,1,8,1,24,1,8,1, + 12,1,6,2,8,1,8,1,8,1,8,1,14,1,14,1, + 12,1,12,9,10,1,14,5,28,1,12,4,2,1,4,1, + 8,1,2,253,4,5,114,97,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,10,0,0,0,5,0,0,0, + 67,0,0,0,115,46,1,0,0,116,0,106,1,106,2,100, + 1,117,0,114,20,116,3,100,2,131,1,130,1,116,4,160, + 5,124,0,161,1,125,0,116,6,124,0,131,1,92,2,125, + 1,125,2,100,3,125,3,116,0,106,7,100,1,117,1,114, + 102,116,0,106,7,160,8,116,9,161,1,125,4,124,1,160, + 10,124,4,116,11,23,0,161,1,114,102,124,1,116,12,124, + 4,131,1,100,1,133,2,25,0,125,1,100,4,125,3,124, + 3,115,144,116,6,124,1,131,1,92,2,125,1,125,5,124, + 5,116,13,107,3,114,144,116,14,116,13,155,0,100,5,124, + 0,155,2,157,3,131,1,130,1,124,2,160,15,100,6,161, + 1,125,6,124,6,100,7,118,1,114,178,116,14,100,8,124, + 2,155,2,157,2,131,1,130,1,110,92,124,6,100,9,107, + 2,144,1,114,14,124,2,160,16,100,6,100,10,161,2,100, + 11,25,0,125,7,124,7,160,10,116,17,161,1,115,228,116, + 14,100,12,116,17,155,2,157,2,131,1,130,1,124,7,116, + 12,116,17,131,1,100,1,133,2,25,0,125,8,124,8,160, + 18,161,0,144,1,115,14,116,14,100,13,124,7,155,2,100, + 14,157,3,131,1,130,1,124,2,160,19,100,6,161,1,100, + 15,25,0,125,9,116,20,124,1,124,9,116,21,100,15,25, + 0,23,0,131,2,83,0,41,16,97,110,1,0,0,71,105, + 118,101,110,32,116,104,101,32,112,97,116,104,32,116,111,32, + 97,32,46,112,121,99,46,32,102,105,108,101,44,32,114,101, + 116,117,114,110,32,116,104,101,32,112,97,116,104,32,116,111, + 32,105,116,115,32,46,112,121,32,102,105,108,101,46,10,10, + 32,32,32,32,84,104,101,32,46,112,121,99,32,102,105,108, + 101,32,100,111,101,115,32,110,111,116,32,110,101,101,100,32, + 116,111,32,101,120,105,115,116,59,32,116,104,105,115,32,115, + 105,109,112,108,121,32,114,101,116,117,114,110,115,32,116,104, + 101,32,112,97,116,104,32,116,111,10,32,32,32,32,116,104, + 101,32,46,112,121,32,102,105,108,101,32,99,97,108,99,117, + 108,97,116,101,100,32,116,111,32,99,111,114,114,101,115,112, + 111,110,100,32,116,111,32,116,104,101,32,46,112,121,99,32, + 102,105,108,101,46,32,32,73,102,32,112,97,116,104,32,100, + 111,101,115,10,32,32,32,32,110,111,116,32,99,111,110,102, + 111,114,109,32,116,111,32,80,69,80,32,51,49,52,55,47, + 52,56,56,32,102,111,114,109,97,116,44,32,86,97,108,117, + 101,69,114,114,111,114,32,119,105,108,108,32,98,101,32,114, + 97,105,115,101,100,46,32,73,102,10,32,32,32,32,115,121, + 115,46,105,109,112,108,101,109,101,110,116,97,116,105,111,110, + 46,99,97,99,104,101,95,116,97,103,32,105,115,32,78,111, + 110,101,32,116,104,101,110,32,78,111,116,73,109,112,108,101, + 109,101,110,116,101,100,69,114,114,111,114,32,105,115,32,114, + 97,105,115,101,100,46,10,10,32,32,32,32,78,114,72,0, + 0,0,70,84,122,31,32,110,111,116,32,98,111,116,116,111, + 109,45,108,101,118,101,108,32,100,105,114,101,99,116,111,114, + 121,32,105,110,32,114,71,0,0,0,62,2,0,0,0,114, + 28,0,0,0,114,57,0,0,0,122,29,101,120,112,101,99, + 116,101,100,32,111,110,108,121,32,50,32,111,114,32,51,32, + 100,111,116,115,32,105,110,32,114,57,0,0,0,114,28,0, + 0,0,233,254,255,255,255,122,53,111,112,116,105,109,105,122, + 97,116,105,111,110,32,112,111,114,116,105,111,110,32,111,102, + 32,102,105,108,101,110,97,109,101,32,100,111,101,115,32,110, + 111,116,32,115,116,97,114,116,32,119,105,116,104,32,122,19, + 111,112,116,105,109,105,122,97,116,105,111,110,32,108,101,118, + 101,108,32,122,29,32,105,115,32,110,111,116,32,97,110,32, + 97,108,112,104,97,110,117,109,101,114,105,99,32,118,97,108, + 117,101,114,73,0,0,0,41,22,114,1,0,0,0,114,80, + 0,0,0,114,81,0,0,0,114,82,0,0,0,114,4,0, + 0,0,114,79,0,0,0,114,47,0,0,0,114,89,0,0, + 0,114,30,0,0,0,114,31,0,0,0,114,11,0,0,0, + 114,35,0,0,0,114,23,0,0,0,114,91,0,0,0,114, + 86,0,0,0,218,5,99,111,117,110,116,114,43,0,0,0, + 114,87,0,0,0,114,85,0,0,0,218,9,112,97,114,116, + 105,116,105,111,110,114,38,0,0,0,218,15,83,79,85,82, + 67,69,95,83,85,70,70,73,88,69,83,41,10,114,44,0, + 0,0,114,93,0,0,0,90,16,112,121,99,97,99,104,101, + 95,102,105,108,101,110,97,109,101,90,23,102,111,117,110,100, + 95,105,110,95,112,121,99,97,99,104,101,95,112,114,101,102, + 105,120,90,13,115,116,114,105,112,112,101,100,95,112,97,116, + 104,90,7,112,121,99,97,99,104,101,90,9,100,111,116,95, + 99,111,117,110,116,114,70,0,0,0,90,9,111,112,116,95, + 108,101,118,101,108,90,13,98,97,115,101,95,102,105,108,101, + 110,97,109,101,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,17,115,111,117,114,99,101,95,102,114,111,109, + 95,99,97,99,104,101,116,1,0,0,115,60,0,0,0,0, + 9,12,1,8,1,10,1,12,1,4,1,10,1,12,1,14, + 1,16,1,4,1,4,1,12,1,8,1,8,1,2,255,8, + 2,10,1,8,1,16,1,10,1,16,1,10,1,4,1,2, + 255,8,2,16,1,10,1,16,2,14,1,114,102,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,9,0,0,0,67,0,0,0,115,124,0,0,0,116,0, + 124,0,131,1,100,1,107,2,114,16,100,2,83,0,124,0, + 160,1,100,3,161,1,92,3,125,1,125,2,125,3,124,1, + 114,56,124,3,160,2,161,0,100,4,100,5,133,2,25,0, + 100,6,107,3,114,60,124,0,83,0,122,12,116,3,124,0, + 131,1,125,4,87,0,110,34,4,0,116,4,116,5,102,2, + 121,106,1,0,1,0,1,0,124,0,100,2,100,5,133,2, + 25,0,125,4,89,0,110,2,48,0,116,6,124,4,131,1, + 114,120,124,4,83,0,124,0,83,0,41,7,122,188,67,111, + 110,118,101,114,116,32,97,32,98,121,116,101,99,111,100,101, + 32,102,105,108,101,32,112,97,116,104,32,116,111,32,97,32, + 115,111,117,114,99,101,32,112,97,116,104,32,40,105,102,32, + 112,111,115,115,105,98,108,101,41,46,10,10,32,32,32,32, + 84,104,105,115,32,102,117,110,99,116,105,111,110,32,101,120, + 105,115,116,115,32,112,117,114,101,108,121,32,102,111,114,32, + 98,97,99,107,119,97,114,100,115,45,99,111,109,112,97,116, + 105,98,105,108,105,116,121,32,102,111,114,10,32,32,32,32, + 80,121,73,109,112,111,114,116,95,69,120,101,99,67,111,100, + 101,77,111,100,117,108,101,87,105,116,104,70,105,108,101,110, + 97,109,101,115,40,41,32,105,110,32,116,104,101,32,67,32, + 65,80,73,46,10,10,32,32,32,32,114,73,0,0,0,78, + 114,71,0,0,0,233,253,255,255,255,233,255,255,255,255,90, + 2,112,121,41,7,114,23,0,0,0,114,41,0,0,0,218, + 5,108,111,119,101,114,114,102,0,0,0,114,82,0,0,0, + 114,86,0,0,0,114,54,0,0,0,41,5,218,13,98,121, + 116,101,99,111,100,101,95,112,97,116,104,114,95,0,0,0, + 114,45,0,0,0,90,9,101,120,116,101,110,115,105,111,110, + 218,11,115,111,117,114,99,101,95,112,97,116,104,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,15,95,103, + 101,116,95,115,111,117,114,99,101,102,105,108,101,156,1,0, + 0,115,20,0,0,0,0,7,12,1,4,1,16,1,24,1, + 4,1,2,1,12,1,16,1,18,1,114,108,0,0,0,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,22,0,0,0,124,0,115, - 12,116,0,160,1,161,0,125,0,116,2,124,0,100,1,131, - 2,83,0,41,2,122,30,82,101,112,108,97,99,101,109,101, - 110,116,32,102,111,114,32,111,115,46,112,97,116,104,46,105, - 115,100,105,114,46,105,0,64,0,0,41,3,114,2,0,0, - 0,218,6,103,101,116,99,119,100,114,53,0,0,0,114,48, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,11,95,112,97,116,104,95,105,115,100,105,114,104, - 0,0,0,115,6,0,0,0,0,2,4,1,8,1,114,56, + 8,0,0,0,67,0,0,0,115,72,0,0,0,124,0,160, + 0,116,1,116,2,131,1,161,1,114,46,122,10,116,3,124, + 0,131,1,87,0,83,0,4,0,116,4,121,42,1,0,1, + 0,1,0,89,0,113,68,48,0,110,22,124,0,160,0,116, + 1,116,5,131,1,161,1,114,64,124,0,83,0,100,0,83, + 0,100,0,83,0,169,1,78,41,6,218,8,101,110,100,115, + 119,105,116,104,218,5,116,117,112,108,101,114,101,0,0,0, + 114,97,0,0,0,114,82,0,0,0,114,88,0,0,0,41, + 1,114,96,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,11,95,103,101,116,95,99,97,99,104, + 101,100,175,1,0,0,115,16,0,0,0,0,1,14,1,2, + 1,10,1,12,1,8,1,14,1,4,2,114,112,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,8,0,0,0,67,0,0,0,115,50,0,0,0,122,14, + 116,0,124,0,131,1,106,1,125,1,87,0,110,22,4,0, + 116,2,121,36,1,0,1,0,1,0,100,1,125,1,89,0, + 110,2,48,0,124,1,100,2,79,0,125,1,124,1,83,0, + 41,3,122,51,67,97,108,99,117,108,97,116,101,32,116,104, + 101,32,109,111,100,101,32,112,101,114,109,105,115,115,105,111, + 110,115,32,102,111,114,32,97,32,98,121,116,101,99,111,100, + 101,32,102,105,108,101,46,114,60,0,0,0,233,128,0,0, + 0,41,3,114,49,0,0,0,114,51,0,0,0,114,50,0, + 0,0,41,2,114,44,0,0,0,114,52,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,10,95, + 99,97,108,99,95,109,111,100,101,187,1,0,0,115,12,0, + 0,0,0,2,2,1,14,1,12,1,10,3,8,1,114,114, 0,0,0,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,26,0,0, - 0,124,0,160,0,116,1,161,1,112,24,124,0,100,1,100, - 2,133,2,25,0,116,2,107,6,83,0,41,3,122,142,82, - 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, - 115,46,112,97,116,104,46,105,115,97,98,115,46,10,10,32, - 32,32,32,67,111,110,115,105,100,101,114,115,32,97,32,87, - 105,110,100,111,119,115,32,100,114,105,118,101,45,114,101,108, - 97,116,105,118,101,32,112,97,116,104,32,40,110,111,32,100, - 114,105,118,101,44,32,98,117,116,32,115,116,97,114,116,115, - 32,119,105,116,104,32,115,108,97,115,104,41,32,116,111,10, - 32,32,32,32,115,116,105,108,108,32,98,101,32,34,97,98, - 115,111,108,117,116,101,34,46,10,32,32,32,32,114,39,0, - 0,0,233,3,0,0,0,41,3,114,10,0,0,0,114,31, - 0,0,0,218,20,95,112,97,116,104,115,101,112,115,95,119, - 105,116,104,95,99,111,108,111,110,114,48,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,95, - 112,97,116,104,95,105,115,97,98,115,111,0,0,0,115,2, - 0,0,0,0,6,114,59,0,0,0,233,182,1,0,0,99, - 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, - 11,0,0,0,67,0,0,0,115,162,0,0,0,100,1,160, - 0,124,0,116,1,124,0,131,1,161,2,125,3,116,2,160, - 3,124,3,116,2,106,4,116,2,106,5,66,0,116,2,106, - 6,66,0,124,2,100,2,64,0,161,3,125,4,122,50,116, - 7,160,8,124,4,100,3,161,2,143,16,125,5,124,5,160, - 9,124,1,161,1,1,0,87,0,53,0,81,0,82,0,88, - 0,116,2,160,10,124,3,124,0,161,2,1,0,87,0,110, - 58,4,0,116,11,107,10,114,156,1,0,1,0,1,0,122, - 14,116,2,160,12,124,3,161,1,1,0,87,0,110,20,4, - 0,116,11,107,10,114,148,1,0,1,0,1,0,89,0,110, - 2,88,0,130,0,89,0,110,2,88,0,100,4,83,0,41, - 5,122,162,66,101,115,116,45,101,102,102,111,114,116,32,102, - 117,110,99,116,105,111,110,32,116,111,32,119,114,105,116,101, - 32,100,97,116,97,32,116,111,32,97,32,112,97,116,104,32, - 97,116,111,109,105,99,97,108,108,121,46,10,32,32,32,32, - 66,101,32,112,114,101,112,97,114,101,100,32,116,111,32,104, - 97,110,100,108,101,32,97,32,70,105,108,101,69,120,105,115, - 116,115,69,114,114,111,114,32,105,102,32,99,111,110,99,117, - 114,114,101,110,116,32,119,114,105,116,105,110,103,32,111,102, - 32,116,104,101,10,32,32,32,32,116,101,109,112,111,114,97, - 114,121,32,102,105,108,101,32,105,115,32,97,116,116,101,109, - 112,116,101,100,46,250,5,123,125,46,123,125,114,60,0,0, - 0,90,2,119,98,78,41,13,218,6,102,111,114,109,97,116, - 218,2,105,100,114,2,0,0,0,90,4,111,112,101,110,90, - 6,79,95,69,88,67,76,90,7,79,95,67,82,69,65,84, - 90,8,79,95,87,82,79,78,76,89,218,3,95,105,111,218, - 6,70,105,108,101,73,79,218,5,119,114,105,116,101,218,7, - 114,101,112,108,97,99,101,114,50,0,0,0,90,6,117,110, - 108,105,110,107,41,6,114,44,0,0,0,114,26,0,0,0, - 114,52,0,0,0,90,8,112,97,116,104,95,116,109,112,90, - 2,102,100,218,4,102,105,108,101,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,13,95,119,114,105,116,101, - 95,97,116,111,109,105,99,120,0,0,0,115,30,0,0,0, - 0,5,16,1,6,1,16,0,6,255,4,2,2,3,14,1, - 20,1,16,1,14,1,2,1,14,1,14,1,6,1,114,69, - 0,0,0,105,85,13,0,0,114,28,0,0,0,114,16,0, - 0,0,115,2,0,0,0,13,10,90,11,95,95,112,121,99, - 97,99,104,101,95,95,122,4,111,112,116,45,122,3,46,112, - 121,122,4,46,112,121,99,78,41,1,218,12,111,112,116,105, - 109,105,122,97,116,105,111,110,99,2,0,0,0,0,0,0, - 0,1,0,0,0,12,0,0,0,5,0,0,0,67,0,0, - 0,115,88,1,0,0,124,1,100,1,107,9,114,52,116,0, - 160,1,100,2,116,2,161,2,1,0,124,2,100,1,107,9, - 114,40,100,3,125,3,116,3,124,3,131,1,130,1,124,1, - 114,48,100,4,110,2,100,5,125,2,116,4,160,5,124,0, - 161,1,125,0,116,6,124,0,131,1,92,2,125,4,125,5, - 124,5,160,7,100,6,161,1,92,3,125,6,125,7,125,8, - 116,8,106,9,106,10,125,9,124,9,100,1,107,8,114,114, - 116,11,100,7,131,1,130,1,100,4,160,12,124,6,114,126, - 124,6,110,2,124,8,124,7,124,9,103,3,161,1,125,10, - 124,2,100,1,107,8,114,172,116,8,106,13,106,14,100,8, - 107,2,114,164,100,4,125,2,110,8,116,8,106,13,106,14, - 125,2,116,15,124,2,131,1,125,2,124,2,100,4,107,3, - 114,224,124,2,160,16,161,0,115,210,116,17,100,9,160,18, - 124,2,161,1,131,1,130,1,100,10,160,18,124,10,116,19, - 124,2,161,3,125,10,124,10,116,20,100,8,25,0,23,0, - 125,11,116,8,106,21,100,1,107,9,144,1,114,76,116,22, - 124,4,131,1,144,1,115,16,116,23,116,4,160,24,161,0, - 124,4,131,2,125,4,124,4,100,5,25,0,100,11,107,2, - 144,1,114,56,124,4,100,8,25,0,116,25,107,7,144,1, - 114,56,124,4,100,12,100,1,133,2,25,0,125,4,116,23, - 116,8,106,21,124,4,160,26,116,25,161,1,124,11,131,3, - 83,0,116,23,124,4,116,27,124,11,131,3,83,0,41,13, - 97,254,2,0,0,71,105,118,101,110,32,116,104,101,32,112, - 97,116,104,32,116,111,32,97,32,46,112,121,32,102,105,108, - 101,44,32,114,101,116,117,114,110,32,116,104,101,32,112,97, - 116,104,32,116,111,32,105,116,115,32,46,112,121,99,32,102, - 105,108,101,46,10,10,32,32,32,32,84,104,101,32,46,112, - 121,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32, - 110,101,101,100,32,116,111,32,101,120,105,115,116,59,32,116, - 104,105,115,32,115,105,109,112,108,121,32,114,101,116,117,114, - 110,115,32,116,104,101,32,112,97,116,104,32,116,111,32,116, - 104,101,10,32,32,32,32,46,112,121,99,32,102,105,108,101, - 32,99,97,108,99,117,108,97,116,101,100,32,97,115,32,105, - 102,32,116,104,101,32,46,112,121,32,102,105,108,101,32,119, - 101,114,101,32,105,109,112,111,114,116,101,100,46,10,10,32, - 32,32,32,84,104,101,32,39,111,112,116,105,109,105,122,97, - 116,105,111,110,39,32,112,97,114,97,109,101,116,101,114,32, - 99,111,110,116,114,111,108,115,32,116,104,101,32,112,114,101, - 115,117,109,101,100,32,111,112,116,105,109,105,122,97,116,105, - 111,110,32,108,101,118,101,108,32,111,102,10,32,32,32,32, - 116,104,101,32,98,121,116,101,99,111,100,101,32,102,105,108, - 101,46,32,73,102,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,105,115,32,110,111,116,32,78,111,110,101, - 44,32,116,104,101,32,115,116,114,105,110,103,32,114,101,112, - 114,101,115,101,110,116,97,116,105,111,110,10,32,32,32,32, - 111,102,32,116,104,101,32,97,114,103,117,109,101,110,116,32, - 105,115,32,116,97,107,101,110,32,97,110,100,32,118,101,114, - 105,102,105,101,100,32,116,111,32,98,101,32,97,108,112,104, - 97,110,117,109,101,114,105,99,32,40,101,108,115,101,32,86, - 97,108,117,101,69,114,114,111,114,10,32,32,32,32,105,115, - 32,114,97,105,115,101,100,41,46,10,10,32,32,32,32,84, - 104,101,32,100,101,98,117,103,95,111,118,101,114,114,105,100, - 101,32,112,97,114,97,109,101,116,101,114,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,73,102,32,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,32,105,115,32, - 110,111,116,32,78,111,110,101,44,10,32,32,32,32,97,32, - 84,114,117,101,32,118,97,108,117,101,32,105,115,32,116,104, - 101,32,115,97,109,101,32,97,115,32,115,101,116,116,105,110, - 103,32,39,111,112,116,105,109,105,122,97,116,105,111,110,39, - 32,116,111,32,116,104,101,32,101,109,112,116,121,32,115,116, - 114,105,110,103,10,32,32,32,32,119,104,105,108,101,32,97, - 32,70,97,108,115,101,32,118,97,108,117,101,32,105,115,32, - 101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,101, - 116,116,105,110,103,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,116,111,32,39,49,39,46,10,10,32,32, - 32,32,73,102,32,115,121,115,46,105,109,112,108,101,109,101, - 110,116,97,116,105,111,110,46,99,97,99,104,101,95,116,97, - 103,32,105,115,32,78,111,110,101,32,116,104,101,110,32,78, - 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, + 3,0,0,0,8,0,0,0,3,0,0,0,115,66,0,0, + 0,100,6,135,0,102,1,100,2,100,3,132,9,125,1,122, + 10,116,0,106,1,125,2,87,0,110,26,4,0,116,2,121, + 50,1,0,1,0,1,0,100,4,100,5,132,0,125,2,89, + 0,110,2,48,0,124,2,124,1,136,0,131,2,1,0,124, + 1,83,0,41,7,122,252,68,101,99,111,114,97,116,111,114, + 32,116,111,32,118,101,114,105,102,121,32,116,104,97,116,32, + 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103, + 32,114,101,113,117,101,115,116,101,100,32,109,97,116,99,104, + 101,115,32,116,104,101,32,111,110,101,32,116,104,101,10,32, + 32,32,32,108,111,97,100,101,114,32,99,97,110,32,104,97, + 110,100,108,101,46,10,10,32,32,32,32,84,104,101,32,102, + 105,114,115,116,32,97,114,103,117,109,101,110,116,32,40,115, + 101,108,102,41,32,109,117,115,116,32,100,101,102,105,110,101, + 32,95,110,97,109,101,32,119,104,105,99,104,32,116,104,101, + 32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116, + 32,105,115,10,32,32,32,32,99,111,109,112,97,114,101,100, + 32,97,103,97,105,110,115,116,46,32,73,102,32,116,104,101, + 32,99,111,109,112,97,114,105,115,111,110,32,102,97,105,108, + 115,32,116,104,101,110,32,73,109,112,111,114,116,69,114,114, 111,114,32,105,115,32,114,97,105,115,101,100,46,10,10,32, - 32,32,32,78,122,70,116,104,101,32,100,101,98,117,103,95, - 111,118,101,114,114,105,100,101,32,112,97,114,97,109,101,116, - 101,114,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 59,32,117,115,101,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,105,110,115,116,101,97,100,122,50,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,32,111,114,32, - 111,112,116,105,109,105,122,97,116,105,111,110,32,109,117,115, - 116,32,98,101,32,115,101,116,32,116,111,32,78,111,110,101, - 114,40,0,0,0,114,39,0,0,0,218,1,46,250,36,115, - 121,115,46,105,109,112,108,101,109,101,110,116,97,116,105,111, - 110,46,99,97,99,104,101,95,116,97,103,32,105,115,32,78, - 111,110,101,233,0,0,0,0,122,24,123,33,114,125,32,105, - 115,32,110,111,116,32,97,108,112,104,97,110,117,109,101,114, - 105,99,122,7,123,125,46,123,125,123,125,250,1,58,114,28, - 0,0,0,41,28,218,9,95,119,97,114,110,105,110,103,115, - 218,4,119,97,114,110,218,18,68,101,112,114,101,99,97,116, - 105,111,110,87,97,114,110,105,110,103,218,9,84,121,112,101, - 69,114,114,111,114,114,2,0,0,0,218,6,102,115,112,97, - 116,104,114,47,0,0,0,114,41,0,0,0,114,8,0,0, - 0,218,14,105,109,112,108,101,109,101,110,116,97,116,105,111, - 110,218,9,99,97,99,104,101,95,116,97,103,218,19,78,111, - 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, - 114,114,36,0,0,0,218,5,102,108,97,103,115,218,8,111, - 112,116,105,109,105,122,101,218,3,115,116,114,218,7,105,115, - 97,108,110,117,109,218,10,86,97,108,117,101,69,114,114,111, - 114,114,62,0,0,0,218,4,95,79,80,84,218,17,66,89, - 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,218, - 14,112,121,99,97,99,104,101,95,112,114,101,102,105,120,114, - 59,0,0,0,114,38,0,0,0,114,55,0,0,0,114,31, - 0,0,0,218,6,108,115,116,114,105,112,218,8,95,80,89, - 67,65,67,72,69,41,12,114,44,0,0,0,90,14,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,114,70,0,0, - 0,218,7,109,101,115,115,97,103,101,218,4,104,101,97,100, - 114,46,0,0,0,90,4,98,97,115,101,218,3,115,101,112, - 218,4,114,101,115,116,90,3,116,97,103,90,15,97,108,109, - 111,115,116,95,102,105,108,101,110,97,109,101,218,8,102,105, - 108,101,110,97,109,101,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,17,99,97,99,104,101,95,102,114,111, - 109,95,115,111,117,114,99,101,38,1,0,0,115,72,0,0, - 0,0,18,8,1,6,1,2,255,4,2,8,1,4,1,8, - 1,12,1,10,1,12,1,16,1,8,1,8,1,8,1,24, - 1,8,1,12,1,6,2,8,1,8,1,8,1,8,1,14, - 1,14,1,12,1,12,9,10,1,14,5,28,1,12,4,2, - 1,4,1,8,1,2,253,4,5,114,98,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,5, - 0,0,0,67,0,0,0,115,46,1,0,0,116,0,106,1, - 106,2,100,1,107,8,114,20,116,3,100,2,131,1,130,1, - 116,4,160,5,124,0,161,1,125,0,116,6,124,0,131,1, - 92,2,125,1,125,2,100,3,125,3,116,0,106,7,100,1, - 107,9,114,102,116,0,106,7,160,8,116,9,161,1,125,4, - 124,1,160,10,124,4,116,11,23,0,161,1,114,102,124,1, - 116,12,124,4,131,1,100,1,133,2,25,0,125,1,100,4, - 125,3,124,3,115,144,116,6,124,1,131,1,92,2,125,1, - 125,5,124,5,116,13,107,3,114,144,116,14,116,13,155,0, - 100,5,124,0,155,2,157,3,131,1,130,1,124,2,160,15, - 100,6,161,1,125,6,124,6,100,7,107,7,114,178,116,14, - 100,8,124,2,155,2,157,2,131,1,130,1,110,92,124,6, - 100,9,107,2,144,1,114,14,124,2,160,16,100,6,100,10, - 161,2,100,11,25,0,125,7,124,7,160,10,116,17,161,1, - 115,228,116,14,100,12,116,17,155,2,157,2,131,1,130,1, - 124,7,116,12,116,17,131,1,100,1,133,2,25,0,125,8, - 124,8,160,18,161,0,144,1,115,14,116,14,100,13,124,7, - 155,2,100,14,157,3,131,1,130,1,124,2,160,19,100,6, - 161,1,100,15,25,0,125,9,116,20,124,1,124,9,116,21, - 100,15,25,0,23,0,131,2,83,0,41,16,97,110,1,0, - 0,71,105,118,101,110,32,116,104,101,32,112,97,116,104,32, - 116,111,32,97,32,46,112,121,99,46,32,102,105,108,101,44, - 32,114,101,116,117,114,110,32,116,104,101,32,112,97,116,104, - 32,116,111,32,105,116,115,32,46,112,121,32,102,105,108,101, - 46,10,10,32,32,32,32,84,104,101,32,46,112,121,99,32, - 102,105,108,101,32,100,111,101,115,32,110,111,116,32,110,101, - 101,100,32,116,111,32,101,120,105,115,116,59,32,116,104,105, - 115,32,115,105,109,112,108,121,32,114,101,116,117,114,110,115, - 32,116,104,101,32,112,97,116,104,32,116,111,10,32,32,32, - 32,116,104,101,32,46,112,121,32,102,105,108,101,32,99,97, - 108,99,117,108,97,116,101,100,32,116,111,32,99,111,114,114, - 101,115,112,111,110,100,32,116,111,32,116,104,101,32,46,112, - 121,99,32,102,105,108,101,46,32,32,73,102,32,112,97,116, - 104,32,100,111,101,115,10,32,32,32,32,110,111,116,32,99, - 111,110,102,111,114,109,32,116,111,32,80,69,80,32,51,49, - 52,55,47,52,56,56,32,102,111,114,109,97,116,44,32,86, - 97,108,117,101,69,114,114,111,114,32,119,105,108,108,32,98, - 101,32,114,97,105,115,101,100,46,32,73,102,10,32,32,32, - 32,115,121,115,46,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,46,99,97,99,104,101,95,116,97,103,32,105,115, - 32,78,111,110,101,32,116,104,101,110,32,78,111,116,73,109, - 112,108,101,109,101,110,116,101,100,69,114,114,111,114,32,105, - 115,32,114,97,105,115,101,100,46,10,10,32,32,32,32,78, - 114,72,0,0,0,70,84,122,31,32,110,111,116,32,98,111, - 116,116,111,109,45,108,101,118,101,108,32,100,105,114,101,99, - 116,111,114,121,32,105,110,32,114,71,0,0,0,62,2,0, - 0,0,114,28,0,0,0,114,57,0,0,0,122,29,101,120, - 112,101,99,116,101,100,32,111,110,108,121,32,50,32,111,114, - 32,51,32,100,111,116,115,32,105,110,32,114,57,0,0,0, - 114,28,0,0,0,233,254,255,255,255,122,53,111,112,116,105, - 109,105,122,97,116,105,111,110,32,112,111,114,116,105,111,110, - 32,111,102,32,102,105,108,101,110,97,109,101,32,100,111,101, - 115,32,110,111,116,32,115,116,97,114,116,32,119,105,116,104, - 32,122,19,111,112,116,105,109,105,122,97,116,105,111,110,32, - 108,101,118,101,108,32,122,29,32,105,115,32,110,111,116,32, - 97,110,32,97,108,112,104,97,110,117,109,101,114,105,99,32, - 118,97,108,117,101,114,73,0,0,0,41,22,114,8,0,0, - 0,114,80,0,0,0,114,81,0,0,0,114,82,0,0,0, - 114,2,0,0,0,114,79,0,0,0,114,47,0,0,0,114, - 90,0,0,0,114,30,0,0,0,114,31,0,0,0,114,10, - 0,0,0,114,35,0,0,0,114,22,0,0,0,114,92,0, - 0,0,114,87,0,0,0,218,5,99,111,117,110,116,114,43, - 0,0,0,114,88,0,0,0,114,86,0,0,0,218,9,112, - 97,114,116,105,116,105,111,110,114,38,0,0,0,218,15,83, - 79,85,82,67,69,95,83,85,70,70,73,88,69,83,41,10, - 114,44,0,0,0,114,94,0,0,0,90,16,112,121,99,97, - 99,104,101,95,102,105,108,101,110,97,109,101,90,23,102,111, - 117,110,100,95,105,110,95,112,121,99,97,99,104,101,95,112, - 114,101,102,105,120,90,13,115,116,114,105,112,112,101,100,95, - 112,97,116,104,90,7,112,121,99,97,99,104,101,90,9,100, - 111,116,95,99,111,117,110,116,114,70,0,0,0,90,9,111, - 112,116,95,108,101,118,101,108,90,13,98,97,115,101,95,102, - 105,108,101,110,97,109,101,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,17,115,111,117,114,99,101,95,102, - 114,111,109,95,99,97,99,104,101,109,1,0,0,115,52,0, - 0,0,0,9,12,1,8,1,10,1,12,1,4,1,10,1, - 12,1,14,1,16,1,4,1,4,1,12,1,8,1,18,2, - 10,1,8,1,16,1,10,1,16,1,10,1,14,2,16,1, - 10,1,16,2,14,1,114,103,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,9,0,0,0, - 67,0,0,0,115,126,0,0,0,116,0,124,0,131,1,100, - 1,107,2,114,16,100,2,83,0,124,0,160,1,100,3,161, - 1,92,3,125,1,125,2,125,3,124,1,114,56,124,3,160, - 2,161,0,100,4,100,5,133,2,25,0,100,6,107,3,114, - 60,124,0,83,0,122,12,116,3,124,0,131,1,125,4,87, - 0,110,36,4,0,116,4,116,5,102,2,107,10,114,108,1, - 0,1,0,1,0,124,0,100,2,100,5,133,2,25,0,125, - 4,89,0,110,2,88,0,116,6,124,4,131,1,114,122,124, - 4,83,0,124,0,83,0,41,7,122,188,67,111,110,118,101, - 114,116,32,97,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,32,112,97,116,104,32,116,111,32,97,32,115,111,117, - 114,99,101,32,112,97,116,104,32,40,105,102,32,112,111,115, - 115,105,98,108,101,41,46,10,10,32,32,32,32,84,104,105, - 115,32,102,117,110,99,116,105,111,110,32,101,120,105,115,116, - 115,32,112,117,114,101,108,121,32,102,111,114,32,98,97,99, - 107,119,97,114,100,115,45,99,111,109,112,97,116,105,98,105, - 108,105,116,121,32,102,111,114,10,32,32,32,32,80,121,73, - 109,112,111,114,116,95,69,120,101,99,67,111,100,101,77,111, - 100,117,108,101,87,105,116,104,70,105,108,101,110,97,109,101, - 115,40,41,32,105,110,32,116,104,101,32,67,32,65,80,73, - 46,10,10,32,32,32,32,114,73,0,0,0,78,114,71,0, - 0,0,233,253,255,255,255,233,255,255,255,255,90,2,112,121, - 41,7,114,22,0,0,0,114,41,0,0,0,218,5,108,111, - 119,101,114,114,103,0,0,0,114,82,0,0,0,114,87,0, - 0,0,114,54,0,0,0,41,5,218,13,98,121,116,101,99, - 111,100,101,95,112,97,116,104,114,96,0,0,0,114,45,0, - 0,0,90,9,101,120,116,101,110,115,105,111,110,218,11,115, - 111,117,114,99,101,95,112,97,116,104,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,15,95,103,101,116,95, - 115,111,117,114,99,101,102,105,108,101,149,1,0,0,115,20, - 0,0,0,0,7,12,1,4,1,16,1,24,1,4,1,2, - 1,12,1,18,1,18,1,114,109,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,67,0,0,0,115,74,0,0,0,124,0,160,0,116,1, - 116,2,131,1,161,1,114,48,122,10,116,3,124,0,131,1, - 87,0,83,0,4,0,116,4,107,10,114,44,1,0,1,0, - 1,0,89,0,113,70,88,0,110,22,124,0,160,0,116,1, - 116,5,131,1,161,1,114,66,124,0,83,0,100,0,83,0, - 100,0,83,0,169,1,78,41,6,218,8,101,110,100,115,119, - 105,116,104,218,5,116,117,112,108,101,114,102,0,0,0,114, - 98,0,0,0,114,82,0,0,0,114,89,0,0,0,41,1, - 114,97,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,11,95,103,101,116,95,99,97,99,104,101, - 100,168,1,0,0,115,16,0,0,0,0,1,14,1,2,1, - 10,1,14,1,8,1,14,1,4,2,114,113,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 8,0,0,0,67,0,0,0,115,52,0,0,0,122,14,116, - 0,124,0,131,1,106,1,125,1,87,0,110,24,4,0,116, - 2,107,10,114,38,1,0,1,0,1,0,100,1,125,1,89, - 0,110,2,88,0,124,1,100,2,79,0,125,1,124,1,83, - 0,41,3,122,51,67,97,108,99,117,108,97,116,101,32,116, - 104,101,32,109,111,100,101,32,112,101,114,109,105,115,115,105, - 111,110,115,32,102,111,114,32,97,32,98,121,116,101,99,111, - 100,101,32,102,105,108,101,46,114,60,0,0,0,233,128,0, - 0,0,41,3,114,49,0,0,0,114,51,0,0,0,114,50, - 0,0,0,41,2,114,44,0,0,0,114,52,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,10, - 95,99,97,108,99,95,109,111,100,101,180,1,0,0,115,12, - 0,0,0,0,2,2,1,14,1,14,1,10,3,8,1,114, - 115,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,8,0,0,0,3,0,0,0,115,68,0, - 0,0,100,6,135,0,102,1,100,2,100,3,132,9,125,1, - 122,10,116,0,106,1,125,2,87,0,110,28,4,0,116,2, - 107,10,114,52,1,0,1,0,1,0,100,4,100,5,132,0, - 125,2,89,0,110,2,88,0,124,2,124,1,136,0,131,2, - 1,0,124,1,83,0,41,7,122,252,68,101,99,111,114,97, - 116,111,114,32,116,111,32,118,101,114,105,102,121,32,116,104, - 97,116,32,116,104,101,32,109,111,100,117,108,101,32,98,101, - 105,110,103,32,114,101,113,117,101,115,116,101,100,32,109,97, - 116,99,104,101,115,32,116,104,101,32,111,110,101,32,116,104, - 101,10,32,32,32,32,108,111,97,100,101,114,32,99,97,110, - 32,104,97,110,100,108,101,46,10,10,32,32,32,32,84,104, - 101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116, - 32,40,115,101,108,102,41,32,109,117,115,116,32,100,101,102, - 105,110,101,32,95,110,97,109,101,32,119,104,105,99,104,32, - 116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109, - 101,110,116,32,105,115,10,32,32,32,32,99,111,109,112,97, - 114,101,100,32,97,103,97,105,110,115,116,46,32,73,102,32, - 116,104,101,32,99,111,109,112,97,114,105,115,111,110,32,102, - 97,105,108,115,32,116,104,101,110,32,73,109,112,111,114,116, - 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46, - 10,10,32,32,32,32,78,99,2,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,31,0,0,0, - 115,66,0,0,0,124,1,100,0,107,8,114,16,124,0,106, - 0,125,1,110,32,124,0,106,0,124,1,107,3,114,48,116, - 1,100,1,124,0,106,0,124,1,102,2,22,0,124,1,100, - 2,141,2,130,1,136,0,124,0,124,1,102,2,124,2,158, - 2,124,3,142,1,83,0,41,3,78,122,30,108,111,97,100, - 101,114,32,102,111,114,32,37,115,32,99,97,110,110,111,116, - 32,104,97,110,100,108,101,32,37,115,169,1,218,4,110,97, - 109,101,41,2,114,117,0,0,0,218,11,73,109,112,111,114, - 116,69,114,114,111,114,41,4,218,4,115,101,108,102,114,117, - 0,0,0,218,4,97,114,103,115,218,6,107,119,97,114,103, - 115,169,1,218,6,109,101,116,104,111,100,114,3,0,0,0, - 114,6,0,0,0,218,19,95,99,104,101,99,107,95,110,97, - 109,101,95,119,114,97,112,112,101,114,200,1,0,0,115,18, - 0,0,0,0,1,8,1,8,1,10,1,4,1,8,255,2, - 1,2,255,6,2,122,40,95,99,104,101,99,107,95,110,97, - 109,101,46,60,108,111,99,97,108,115,62,46,95,99,104,101, - 99,107,95,110,97,109,101,95,119,114,97,112,112,101,114,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 7,0,0,0,83,0,0,0,115,56,0,0,0,100,1,68, - 0,93,32,125,2,116,0,124,1,124,2,131,2,114,4,116, - 1,124,0,124,2,116,2,124,1,124,2,131,2,131,3,1, - 0,113,4,124,0,106,3,160,4,124,1,106,3,161,1,1, - 0,100,0,83,0,41,2,78,41,4,218,10,95,95,109,111, - 100,117,108,101,95,95,218,8,95,95,110,97,109,101,95,95, - 218,12,95,95,113,117,97,108,110,97,109,101,95,95,218,7, - 95,95,100,111,99,95,95,41,5,218,7,104,97,115,97,116, - 116,114,218,7,115,101,116,97,116,116,114,218,7,103,101,116, - 97,116,116,114,218,8,95,95,100,105,99,116,95,95,218,6, - 117,112,100,97,116,101,41,3,90,3,110,101,119,90,3,111, - 108,100,114,67,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,5,95,119,114,97,112,211,1,0, - 0,115,8,0,0,0,0,1,8,1,10,1,20,1,122,26, - 95,99,104,101,99,107,95,110,97,109,101,46,60,108,111,99, - 97,108,115,62,46,95,119,114,97,112,41,1,78,41,3,218, - 10,95,98,111,111,116,115,116,114,97,112,114,134,0,0,0, - 218,9,78,97,109,101,69,114,114,111,114,41,3,114,123,0, - 0,0,114,124,0,0,0,114,134,0,0,0,114,3,0,0, - 0,114,122,0,0,0,114,6,0,0,0,218,11,95,99,104, - 101,99,107,95,110,97,109,101,192,1,0,0,115,14,0,0, - 0,0,8,14,7,2,1,10,1,14,2,14,5,10,1,114, - 137,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,6,0,0,0,67,0,0,0,115,60,0, - 0,0,124,0,160,0,124,1,161,1,92,2,125,2,125,3, - 124,2,100,1,107,8,114,56,116,1,124,3,131,1,114,56, - 100,2,125,4,116,2,160,3,124,4,160,4,124,3,100,3, - 25,0,161,1,116,5,161,2,1,0,124,2,83,0,41,4, - 122,155,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,32, - 98,121,32,100,101,108,101,103,97,116,105,110,103,32,116,111, - 10,32,32,32,32,115,101,108,102,46,102,105,110,100,95,108, - 111,97,100,101,114,40,41,46,10,10,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,32,105,110,32,102,97,118,111,114, - 32,111,102,32,102,105,110,100,101,114,46,102,105,110,100,95, - 115,112,101,99,40,41,46,10,10,32,32,32,32,78,122,44, - 78,111,116,32,105,109,112,111,114,116,105,110,103,32,100,105, - 114,101,99,116,111,114,121,32,123,125,58,32,109,105,115,115, - 105,110,103,32,95,95,105,110,105,116,95,95,114,73,0,0, - 0,41,6,218,11,102,105,110,100,95,108,111,97,100,101,114, - 114,22,0,0,0,114,75,0,0,0,114,76,0,0,0,114, - 62,0,0,0,218,13,73,109,112,111,114,116,87,97,114,110, - 105,110,103,41,5,114,119,0,0,0,218,8,102,117,108,108, - 110,97,109,101,218,6,108,111,97,100,101,114,218,8,112,111, - 114,116,105,111,110,115,218,3,109,115,103,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,95,102,105,110, - 100,95,109,111,100,117,108,101,95,115,104,105,109,220,1,0, - 0,115,10,0,0,0,0,10,14,1,16,1,4,1,22,1, - 114,144,0,0,0,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,158, - 0,0,0,124,0,100,1,100,2,133,2,25,0,125,3,124, - 3,116,0,107,3,114,60,100,3,124,1,155,2,100,4,124, - 3,155,2,157,4,125,4,116,1,160,2,100,5,124,4,161, - 2,1,0,116,3,124,4,102,1,124,2,142,1,130,1,116, - 4,124,0,131,1,100,6,107,0,114,102,100,7,124,1,155, - 2,157,2,125,4,116,1,160,2,100,5,124,4,161,2,1, - 0,116,5,124,4,131,1,130,1,116,6,124,0,100,2,100, - 8,133,2,25,0,131,1,125,5,124,5,100,9,64,0,114, - 154,100,10,124,5,155,2,100,11,124,1,155,2,157,4,125, - 4,116,3,124,4,102,1,124,2,142,1,130,1,124,5,83, - 0,41,12,97,84,2,0,0,80,101,114,102,111,114,109,32, - 98,97,115,105,99,32,118,97,108,105,100,105,116,121,32,99, - 104,101,99,107,105,110,103,32,111,102,32,97,32,112,121,99, - 32,104,101,97,100,101,114,32,97,110,100,32,114,101,116,117, - 114,110,32,116,104,101,32,102,108,97,103,115,32,102,105,101, - 108,100,44,10,32,32,32,32,119,104,105,99,104,32,100,101, - 116,101,114,109,105,110,101,115,32,104,111,119,32,116,104,101, - 32,112,121,99,32,115,104,111,117,108,100,32,98,101,32,102, - 117,114,116,104,101,114,32,118,97,108,105,100,97,116,101,100, - 32,97,103,97,105,110,115,116,32,116,104,101,32,115,111,117, - 114,99,101,46,10,10,32,32,32,32,42,100,97,116,97,42, - 32,105,115,32,116,104,101,32,99,111,110,116,101,110,116,115, - 32,111,102,32,116,104,101,32,112,121,99,32,102,105,108,101, - 46,32,40,79,110,108,121,32,116,104,101,32,102,105,114,115, - 116,32,49,54,32,98,121,116,101,115,32,97,114,101,10,32, - 32,32,32,114,101,113,117,105,114,101,100,44,32,116,104,111, - 117,103,104,46,41,10,10,32,32,32,32,42,110,97,109,101, - 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, - 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, - 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, - 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, - 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, - 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, - 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, - 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, - 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, - 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, - 103,105,110,103,46,10,10,32,32,32,32,73,109,112,111,114, + 32,32,32,78,99,2,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,4,0,0,0,31,0,0,0,115,72,0, + 0,0,124,1,100,0,117,0,114,16,124,0,106,0,125,1, + 110,32,124,0,106,0,124,1,107,3,114,48,116,1,100,1, + 124,0,106,0,124,1,102,2,22,0,124,1,100,2,141,2, + 130,1,136,0,124,0,124,1,103,2,124,2,162,1,82,0, + 105,0,124,3,164,1,142,1,83,0,41,3,78,122,30,108, + 111,97,100,101,114,32,102,111,114,32,37,115,32,99,97,110, + 110,111,116,32,104,97,110,100,108,101,32,37,115,169,1,218, + 4,110,97,109,101,41,2,114,116,0,0,0,218,11,73,109, + 112,111,114,116,69,114,114,111,114,41,4,218,4,115,101,108, + 102,114,116,0,0,0,218,4,97,114,103,115,218,6,107,119, + 97,114,103,115,169,1,218,6,109,101,116,104,111,100,114,5, + 0,0,0,114,8,0,0,0,218,19,95,99,104,101,99,107, + 95,110,97,109,101,95,119,114,97,112,112,101,114,207,1,0, + 0,115,18,0,0,0,0,1,8,1,8,1,10,1,4,1, + 8,255,2,1,2,255,6,2,122,40,95,99,104,101,99,107, + 95,110,97,109,101,46,60,108,111,99,97,108,115,62,46,95, + 99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,112, + 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,7,0,0,0,83,0,0,0,115,56,0,0,0, + 100,1,68,0,93,32,125,2,116,0,124,1,124,2,131,2, + 114,4,116,1,124,0,124,2,116,2,124,1,124,2,131,2, + 131,3,1,0,113,4,124,0,106,3,160,4,124,1,106,3, + 161,1,1,0,100,0,83,0,41,2,78,41,4,218,10,95, + 95,109,111,100,117,108,101,95,95,218,8,95,95,110,97,109, + 101,95,95,218,12,95,95,113,117,97,108,110,97,109,101,95, + 95,218,7,95,95,100,111,99,95,95,41,5,218,7,104,97, + 115,97,116,116,114,218,7,115,101,116,97,116,116,114,218,7, + 103,101,116,97,116,116,114,218,8,95,95,100,105,99,116,95, + 95,218,6,117,112,100,97,116,101,41,3,90,3,110,101,119, + 90,3,111,108,100,114,67,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,5,95,119,114,97,112, + 218,1,0,0,115,8,0,0,0,0,1,8,1,10,1,20, + 1,122,26,95,99,104,101,99,107,95,110,97,109,101,46,60, + 108,111,99,97,108,115,62,46,95,119,114,97,112,41,1,78, + 41,3,218,10,95,98,111,111,116,115,116,114,97,112,114,133, + 0,0,0,218,9,78,97,109,101,69,114,114,111,114,41,3, + 114,122,0,0,0,114,123,0,0,0,114,133,0,0,0,114, + 5,0,0,0,114,121,0,0,0,114,8,0,0,0,218,11, + 95,99,104,101,99,107,95,110,97,109,101,199,1,0,0,115, + 14,0,0,0,0,8,14,7,2,1,10,1,12,2,14,5, + 10,1,114,136,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,6,0,0,0,67,0,0,0, + 115,60,0,0,0,124,0,160,0,124,1,161,1,92,2,125, + 2,125,3,124,2,100,1,117,0,114,56,116,1,124,3,131, + 1,114,56,100,2,125,4,116,2,160,3,124,4,160,4,124, + 3,100,3,25,0,161,1,116,5,161,2,1,0,124,2,83, + 0,41,4,122,155,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,32,98,121,32,100,101,108,101,103,97,116,105,110,103, + 32,116,111,10,32,32,32,32,115,101,108,102,46,102,105,110, + 100,95,108,111,97,100,101,114,40,41,46,10,10,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,32,105,110,32,102,97, + 118,111,114,32,111,102,32,102,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,40,41,46,10,10,32,32,32,32, + 78,122,44,78,111,116,32,105,109,112,111,114,116,105,110,103, + 32,100,105,114,101,99,116,111,114,121,32,123,125,58,32,109, + 105,115,115,105,110,103,32,95,95,105,110,105,116,95,95,114, + 73,0,0,0,41,6,218,11,102,105,110,100,95,108,111,97, + 100,101,114,114,23,0,0,0,114,75,0,0,0,114,76,0, + 0,0,114,62,0,0,0,218,13,73,109,112,111,114,116,87, + 97,114,110,105,110,103,41,5,114,118,0,0,0,218,8,102, + 117,108,108,110,97,109,101,218,6,108,111,97,100,101,114,218, + 8,112,111,114,116,105,111,110,115,218,3,109,115,103,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,17,95, + 102,105,110,100,95,109,111,100,117,108,101,95,115,104,105,109, + 227,1,0,0,115,10,0,0,0,0,10,14,1,16,1,4, + 1,22,1,114,143,0,0,0,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,166,0,0,0,124,0,100,1,100,2,133,2,25,0, + 125,3,124,3,116,0,107,3,114,64,100,3,124,1,155,2, + 100,4,124,3,155,2,157,4,125,4,116,1,160,2,100,5, + 124,4,161,2,1,0,116,3,124,4,102,1,105,0,124,2, + 164,1,142,1,130,1,116,4,124,0,131,1,100,6,107,0, + 114,106,100,7,124,1,155,2,157,2,125,4,116,1,160,2, + 100,5,124,4,161,2,1,0,116,5,124,4,131,1,130,1, + 116,6,124,0,100,2,100,8,133,2,25,0,131,1,125,5, + 124,5,100,9,64,0,114,162,100,10,124,5,155,2,100,11, + 124,1,155,2,157,4,125,4,116,3,124,4,102,1,105,0, + 124,2,164,1,142,1,130,1,124,5,83,0,41,12,97,84, + 2,0,0,80,101,114,102,111,114,109,32,98,97,115,105,99, + 32,118,97,108,105,100,105,116,121,32,99,104,101,99,107,105, + 110,103,32,111,102,32,97,32,112,121,99,32,104,101,97,100, + 101,114,32,97,110,100,32,114,101,116,117,114,110,32,116,104, + 101,32,102,108,97,103,115,32,102,105,101,108,100,44,10,32, + 32,32,32,119,104,105,99,104,32,100,101,116,101,114,109,105, + 110,101,115,32,104,111,119,32,116,104,101,32,112,121,99,32, + 115,104,111,117,108,100,32,98,101,32,102,117,114,116,104,101, + 114,32,118,97,108,105,100,97,116,101,100,32,97,103,97,105, + 110,115,116,32,116,104,101,32,115,111,117,114,99,101,46,10, + 10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,116, + 104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116, + 104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,110, + 108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,32, + 98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,101, + 113,117,105,114,101,100,44,32,116,104,111,117,103,104,46,41, + 10,10,32,32,32,32,42,110,97,109,101,42,32,105,115,32, + 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32, + 109,111,100,117,108,101,32,98,101,105,110,103,32,105,109,112, + 111,114,116,101,100,46,32,73,116,32,105,115,32,117,115,101, + 100,32,102,111,114,32,108,111,103,103,105,110,103,46,10,10, + 32,32,32,32,42,101,120,99,95,100,101,116,97,105,108,115, + 42,32,105,115,32,97,32,100,105,99,116,105,111,110,97,114, + 121,32,112,97,115,115,101,100,32,116,111,32,73,109,112,111, + 114,116,69,114,114,111,114,32,105,102,32,105,116,32,114,97, + 105,115,101,100,32,102,111,114,10,32,32,32,32,105,109,112, + 114,111,118,101,100,32,100,101,98,117,103,103,105,110,103,46, + 10,10,32,32,32,32,73,109,112,111,114,116,69,114,114,111, + 114,32,105,115,32,114,97,105,115,101,100,32,119,104,101,110, + 32,116,104,101,32,109,97,103,105,99,32,110,117,109,98,101, + 114,32,105,115,32,105,110,99,111,114,114,101,99,116,32,111, + 114,32,119,104,101,110,32,116,104,101,32,102,108,97,103,115, + 10,32,32,32,32,102,105,101,108,100,32,105,115,32,105,110, + 118,97,108,105,100,46,32,69,79,70,69,114,114,111,114,32, + 105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,116, + 104,101,32,100,97,116,97,32,105,115,32,102,111,117,110,100, + 32,116,111,32,98,101,32,116,114,117,110,99,97,116,101,100, + 46,10,10,32,32,32,32,78,114,16,0,0,0,122,20,98, + 97,100,32,109,97,103,105,99,32,110,117,109,98,101,114,32, + 105,110,32,122,2,58,32,250,2,123,125,233,16,0,0,0, + 122,40,114,101,97,99,104,101,100,32,69,79,70,32,119,104, + 105,108,101,32,114,101,97,100,105,110,103,32,112,121,99,32, + 104,101,97,100,101,114,32,111,102,32,233,8,0,0,0,233, + 252,255,255,255,122,14,105,110,118,97,108,105,100,32,102,108, + 97,103,115,32,122,4,32,105,110,32,41,7,218,12,77,65, + 71,73,67,95,78,85,77,66,69,82,114,134,0,0,0,218, + 16,95,118,101,114,98,111,115,101,95,109,101,115,115,97,103, + 101,114,117,0,0,0,114,23,0,0,0,218,8,69,79,70, + 69,114,114,111,114,114,27,0,0,0,41,6,114,26,0,0, + 0,114,116,0,0,0,218,11,101,120,99,95,100,101,116,97, + 105,108,115,90,5,109,97,103,105,99,114,92,0,0,0,114, + 2,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,13,95,99,108,97,115,115,105,102,121,95,112, + 121,99,244,1,0,0,115,28,0,0,0,0,16,12,1,8, + 1,16,1,12,1,16,1,12,1,10,1,12,1,8,1,16, + 2,8,1,16,1,16,1,114,152,0,0,0,99,5,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, + 0,67,0,0,0,115,120,0,0,0,116,0,124,0,100,1, + 100,2,133,2,25,0,131,1,124,1,100,3,64,0,107,3, + 114,62,100,4,124,3,155,2,157,2,125,5,116,1,160,2, + 100,5,124,5,161,2,1,0,116,3,124,5,102,1,105,0, + 124,4,164,1,142,1,130,1,124,2,100,6,117,1,114,116, + 116,0,124,0,100,2,100,7,133,2,25,0,131,1,124,2, + 100,3,64,0,107,3,114,116,116,3,100,4,124,3,155,2, + 157,2,102,1,105,0,124,4,164,1,142,1,130,1,100,6, + 83,0,41,8,97,7,2,0,0,86,97,108,105,100,97,116, + 101,32,97,32,112,121,99,32,97,103,97,105,110,115,116,32, + 116,104,101,32,115,111,117,114,99,101,32,108,97,115,116,45, + 109,111,100,105,102,105,101,100,32,116,105,109,101,46,10,10, + 32,32,32,32,42,100,97,116,97,42,32,105,115,32,116,104, + 101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104, + 101,32,112,121,99,32,102,105,108,101,46,32,40,79,110,108, + 121,32,116,104,101,32,102,105,114,115,116,32,49,54,32,98, + 121,116,101,115,32,97,114,101,10,32,32,32,32,114,101,113, + 117,105,114,101,100,46,41,10,10,32,32,32,32,42,115,111, + 117,114,99,101,95,109,116,105,109,101,42,32,105,115,32,116, + 104,101,32,108,97,115,116,32,109,111,100,105,102,105,101,100, + 32,116,105,109,101,115,116,97,109,112,32,111,102,32,116,104, + 101,32,115,111,117,114,99,101,32,102,105,108,101,46,10,10, + 32,32,32,32,42,115,111,117,114,99,101,95,115,105,122,101, + 42,32,105,115,32,78,111,110,101,32,111,114,32,116,104,101, + 32,115,105,122,101,32,111,102,32,116,104,101,32,115,111,117, + 114,99,101,32,102,105,108,101,32,105,110,32,98,121,116,101, + 115,46,10,10,32,32,32,32,42,110,97,109,101,42,32,105, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105, + 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117, + 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46, + 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105, + 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110, + 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32, + 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105, + 109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,110, + 103,46,10,10,32,32,32,32,65,110,32,73,109,112,111,114, 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, - 32,119,104,101,110,32,116,104,101,32,109,97,103,105,99,32, - 110,117,109,98,101,114,32,105,115,32,105,110,99,111,114,114, - 101,99,116,32,111,114,32,119,104,101,110,32,116,104,101,32, - 102,108,97,103,115,10,32,32,32,32,102,105,101,108,100,32, - 105,115,32,105,110,118,97,108,105,100,46,32,69,79,70,69, - 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,119, - 104,101,110,32,116,104,101,32,100,97,116,97,32,105,115,32, - 102,111,117,110,100,32,116,111,32,98,101,32,116,114,117,110, - 99,97,116,101,100,46,10,10,32,32,32,32,78,114,15,0, - 0,0,122,20,98,97,100,32,109,97,103,105,99,32,110,117, - 109,98,101,114,32,105,110,32,122,2,58,32,250,2,123,125, - 233,16,0,0,0,122,40,114,101,97,99,104,101,100,32,69, - 79,70,32,119,104,105,108,101,32,114,101,97,100,105,110,103, - 32,112,121,99,32,104,101,97,100,101,114,32,111,102,32,233, - 8,0,0,0,233,252,255,255,255,122,14,105,110,118,97,108, - 105,100,32,102,108,97,103,115,32,122,4,32,105,110,32,41, - 7,218,12,77,65,71,73,67,95,78,85,77,66,69,82,114, - 135,0,0,0,218,16,95,118,101,114,98,111,115,101,95,109, - 101,115,115,97,103,101,114,118,0,0,0,114,22,0,0,0, - 218,8,69,79,70,69,114,114,111,114,114,27,0,0,0,41, - 6,114,26,0,0,0,114,117,0,0,0,218,11,101,120,99, - 95,100,101,116,97,105,108,115,90,5,109,97,103,105,99,114, - 93,0,0,0,114,83,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,13,95,99,108,97,115,115, - 105,102,121,95,112,121,99,237,1,0,0,115,28,0,0,0, - 0,16,12,1,8,1,16,1,12,1,12,1,12,1,10,1, - 12,1,8,1,16,2,8,1,16,1,12,1,114,153,0,0, - 0,99,5,0,0,0,0,0,0,0,0,0,0,0,6,0, - 0,0,4,0,0,0,67,0,0,0,115,112,0,0,0,116, - 0,124,0,100,1,100,2,133,2,25,0,131,1,124,1,100, - 3,64,0,107,3,114,58,100,4,124,3,155,2,157,2,125, - 5,116,1,160,2,100,5,124,5,161,2,1,0,116,3,124, - 5,102,1,124,4,142,1,130,1,124,2,100,6,107,9,114, - 108,116,0,124,0,100,2,100,7,133,2,25,0,131,1,124, - 2,100,3,64,0,107,3,114,108,116,3,100,4,124,3,155, - 2,157,2,102,1,124,4,142,1,130,1,100,6,83,0,41, - 8,97,7,2,0,0,86,97,108,105,100,97,116,101,32,97, - 32,112,121,99,32,97,103,97,105,110,115,116,32,116,104,101, - 32,115,111,117,114,99,101,32,108,97,115,116,45,109,111,100, - 105,102,105,101,100,32,116,105,109,101,46,10,10,32,32,32, - 32,42,100,97,116,97,42,32,105,115,32,116,104,101,32,99, - 111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,112, - 121,99,32,102,105,108,101,46,32,40,79,110,108,121,32,116, - 104,101,32,102,105,114,115,116,32,49,54,32,98,121,116,101, - 115,32,97,114,101,10,32,32,32,32,114,101,113,117,105,114, - 101,100,46,41,10,10,32,32,32,32,42,115,111,117,114,99, - 101,95,109,116,105,109,101,42,32,105,115,32,116,104,101,32, - 108,97,115,116,32,109,111,100,105,102,105,101,100,32,116,105, - 109,101,115,116,97,109,112,32,111,102,32,116,104,101,32,115, - 111,117,114,99,101,32,102,105,108,101,46,10,10,32,32,32, - 32,42,115,111,117,114,99,101,95,115,105,122,101,42,32,105, - 115,32,78,111,110,101,32,111,114,32,116,104,101,32,115,105, - 122,101,32,111,102,32,116,104,101,32,115,111,117,114,99,101, - 32,102,105,108,101,32,105,110,32,98,121,116,101,115,46,10, - 10,32,32,32,32,42,110,97,109,101,42,32,105,115,32,116, - 104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109, - 111,100,117,108,101,32,98,101,105,110,103,32,105,109,112,111, - 114,116,101,100,46,32,73,116,32,105,115,32,117,115,101,100, - 32,102,111,114,32,108,111,103,103,105,110,103,46,10,10,32, - 32,32,32,42,101,120,99,95,100,101,116,97,105,108,115,42, - 32,105,115,32,97,32,100,105,99,116,105,111,110,97,114,121, - 32,112,97,115,115,101,100,32,116,111,32,73,109,112,111,114, - 116,69,114,114,111,114,32,105,102,32,105,116,32,114,97,105, - 115,101,100,32,102,111,114,10,32,32,32,32,105,109,112,114, - 111,118,101,100,32,100,101,98,117,103,103,105,110,103,46,10, - 10,32,32,32,32,65,110,32,73,109,112,111,114,116,69,114, - 114,111,114,32,105,115,32,114,97,105,115,101,100,32,105,102, - 32,116,104,101,32,98,121,116,101,99,111,100,101,32,105,115, - 32,115,116,97,108,101,46,10,10,32,32,32,32,114,147,0, - 0,0,233,12,0,0,0,114,14,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,114,145,0,0,0,78,114,146,0,0,0,41, - 4,114,27,0,0,0,114,135,0,0,0,114,150,0,0,0, - 114,118,0,0,0,41,6,114,26,0,0,0,218,12,115,111, - 117,114,99,101,95,109,116,105,109,101,218,11,115,111,117,114, - 99,101,95,115,105,122,101,114,117,0,0,0,114,152,0,0, - 0,114,93,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,23,95,118,97,108,105,100,97,116,101, - 95,116,105,109,101,115,116,97,109,112,95,112,121,99,14,2, - 0,0,115,16,0,0,0,0,19,24,1,10,1,12,1,12, - 1,8,1,22,255,2,2,114,157,0,0,0,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,38,0,0,0,124,0,100,1,100,2, - 133,2,25,0,124,1,107,3,114,34,116,0,100,3,124,2, - 155,2,157,2,102,1,124,3,142,1,130,1,100,4,83,0, - 41,5,97,243,1,0,0,86,97,108,105,100,97,116,101,32, - 97,32,104,97,115,104,45,98,97,115,101,100,32,112,121,99, - 32,98,121,32,99,104,101,99,107,105,110,103,32,116,104,101, - 32,114,101,97,108,32,115,111,117,114,99,101,32,104,97,115, - 104,32,97,103,97,105,110,115,116,32,116,104,101,32,111,110, - 101,32,105,110,10,32,32,32,32,116,104,101,32,112,121,99, - 32,104,101,97,100,101,114,46,10,10,32,32,32,32,42,100, - 97,116,97,42,32,105,115,32,116,104,101,32,99,111,110,116, - 101,110,116,115,32,111,102,32,116,104,101,32,112,121,99,32, - 102,105,108,101,46,32,40,79,110,108,121,32,116,104,101,32, - 102,105,114,115,116,32,49,54,32,98,121,116,101,115,32,97, - 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,46, - 41,10,10,32,32,32,32,42,115,111,117,114,99,101,95,104, - 97,115,104,42,32,105,115,32,116,104,101,32,105,109,112,111, - 114,116,108,105,98,46,117,116,105,108,46,115,111,117,114,99, - 101,95,104,97,115,104,40,41,32,111,102,32,116,104,101,32, - 115,111,117,114,99,101,32,102,105,108,101,46,10,10,32,32, - 32,32,42,110,97,109,101,42,32,105,115,32,116,104,101,32, - 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, - 108,101,32,98,101,105,110,103,32,105,109,112,111,114,116,101, - 100,46,32,73,116,32,105,115,32,117,115,101,100,32,102,111, - 114,32,108,111,103,103,105,110,103,46,10,10,32,32,32,32, - 42,101,120,99,95,100,101,116,97,105,108,115,42,32,105,115, - 32,97,32,100,105,99,116,105,111,110,97,114,121,32,112,97, - 115,115,101,100,32,116,111,32,73,109,112,111,114,116,69,114, - 114,111,114,32,105,102,32,105,116,32,114,97,105,115,101,100, - 32,102,111,114,10,32,32,32,32,105,109,112,114,111,118,101, - 100,32,100,101,98,117,103,103,105,110,103,46,10,10,32,32, - 32,32,65,110,32,73,109,112,111,114,116,69,114,114,111,114, - 32,105,115,32,114,97,105,115,101,100,32,105,102,32,116,104, - 101,32,98,121,116,101,99,111,100,101,32,105,115,32,115,116, - 97,108,101,46,10,10,32,32,32,32,114,147,0,0,0,114, - 146,0,0,0,122,46,104,97,115,104,32,105,110,32,98,121, - 116,101,99,111,100,101,32,100,111,101,115,110,39,116,32,109, - 97,116,99,104,32,104,97,115,104,32,111,102,32,115,111,117, - 114,99,101,32,78,41,1,114,118,0,0,0,41,4,114,26, - 0,0,0,218,11,115,111,117,114,99,101,95,104,97,115,104, - 114,117,0,0,0,114,152,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,18,95,118,97,108,105, - 100,97,116,101,95,104,97,115,104,95,112,121,99,42,2,0, - 0,115,12,0,0,0,0,17,16,1,2,1,8,255,2,2, - 2,254,114,159,0,0,0,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,80,0,0,0,116,0,160,1,124,0,161,1,125,4,116, - 2,124,4,116,3,131,2,114,56,116,4,160,5,100,1,124, - 2,161,2,1,0,124,3,100,2,107,9,114,52,116,6,160, - 7,124,4,124,3,161,2,1,0,124,4,83,0,116,8,100, - 3,160,9,124,2,161,1,124,1,124,2,100,4,141,3,130, - 1,100,2,83,0,41,5,122,35,67,111,109,112,105,108,101, - 32,98,121,116,101,99,111,100,101,32,97,115,32,102,111,117, - 110,100,32,105,110,32,97,32,112,121,99,46,122,21,99,111, - 100,101,32,111,98,106,101,99,116,32,102,114,111,109,32,123, - 33,114,125,78,122,23,78,111,110,45,99,111,100,101,32,111, - 98,106,101,99,116,32,105,110,32,123,33,114,125,169,2,114, - 117,0,0,0,114,44,0,0,0,41,10,218,7,109,97,114, - 115,104,97,108,90,5,108,111,97,100,115,218,10,105,115,105, - 110,115,116,97,110,99,101,218,10,95,99,111,100,101,95,116, - 121,112,101,114,135,0,0,0,114,150,0,0,0,218,4,95, - 105,109,112,90,16,95,102,105,120,95,99,111,95,102,105,108, - 101,110,97,109,101,114,118,0,0,0,114,62,0,0,0,41, - 5,114,26,0,0,0,114,117,0,0,0,114,107,0,0,0, - 114,108,0,0,0,218,4,99,111,100,101,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,95,99,111,109, - 112,105,108,101,95,98,121,116,101,99,111,100,101,66,2,0, - 0,115,20,0,0,0,0,2,10,1,10,1,12,1,8,1, - 12,1,4,2,10,1,2,0,2,255,114,166,0,0,0,114, - 73,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,5,0,0,0,67,0,0,0,115,70,0, - 0,0,116,0,116,1,131,1,125,3,124,3,160,2,116,3, - 100,1,131,1,161,1,1,0,124,3,160,2,116,3,124,1, - 131,1,161,1,1,0,124,3,160,2,116,3,124,2,131,1, - 161,1,1,0,124,3,160,2,116,4,160,5,124,0,161,1, - 161,1,1,0,124,3,83,0,41,2,122,43,80,114,111,100, - 117,99,101,32,116,104,101,32,100,97,116,97,32,102,111,114, - 32,97,32,116,105,109,101,115,116,97,109,112,45,98,97,115, - 101,100,32,112,121,99,46,114,73,0,0,0,41,6,218,9, - 98,121,116,101,97,114,114,97,121,114,149,0,0,0,218,6, - 101,120,116,101,110,100,114,20,0,0,0,114,161,0,0,0, - 218,5,100,117,109,112,115,41,4,114,165,0,0,0,218,5, - 109,116,105,109,101,114,156,0,0,0,114,26,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,22, - 95,99,111,100,101,95,116,111,95,116,105,109,101,115,116,97, - 109,112,95,112,121,99,79,2,0,0,115,12,0,0,0,0, - 2,8,1,14,1,14,1,14,1,16,1,114,171,0,0,0, - 84,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,5,0,0,0,67,0,0,0,115,80,0,0,0,116, - 0,116,1,131,1,125,3,100,1,124,2,100,1,62,0,66, - 0,125,4,124,3,160,2,116,3,124,4,131,1,161,1,1, - 0,116,4,124,1,131,1,100,2,107,2,115,50,116,5,130, - 1,124,3,160,2,124,1,161,1,1,0,124,3,160,2,116, - 6,160,7,124,0,161,1,161,1,1,0,124,3,83,0,41, - 3,122,38,80,114,111,100,117,99,101,32,116,104,101,32,100, - 97,116,97,32,102,111,114,32,97,32,104,97,115,104,45,98, - 97,115,101,100,32,112,121,99,46,114,39,0,0,0,114,147, - 0,0,0,41,8,114,167,0,0,0,114,149,0,0,0,114, - 168,0,0,0,114,20,0,0,0,114,22,0,0,0,114,23, - 0,0,0,114,161,0,0,0,114,169,0,0,0,41,5,114, - 165,0,0,0,114,158,0,0,0,90,7,99,104,101,99,107, - 101,100,114,26,0,0,0,114,83,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,17,95,99,111, - 100,101,95,116,111,95,104,97,115,104,95,112,121,99,89,2, + 32,105,102,32,116,104,101,32,98,121,116,101,99,111,100,101, + 32,105,115,32,115,116,97,108,101,46,10,10,32,32,32,32, + 114,146,0,0,0,233,12,0,0,0,114,15,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,114,144,0,0,0,78,114,145,0, + 0,0,41,4,114,27,0,0,0,114,134,0,0,0,114,149, + 0,0,0,114,117,0,0,0,41,6,114,26,0,0,0,218, + 12,115,111,117,114,99,101,95,109,116,105,109,101,218,11,115, + 111,117,114,99,101,95,115,105,122,101,114,116,0,0,0,114, + 151,0,0,0,114,92,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,23,95,118,97,108,105,100, + 97,116,101,95,116,105,109,101,115,116,97,109,112,95,112,121, + 99,21,2,0,0,115,16,0,0,0,0,19,24,1,10,1, + 12,1,16,1,8,1,22,255,2,2,114,156,0,0,0,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,42,0,0,0,124,0,100, + 1,100,2,133,2,25,0,124,1,107,3,114,38,116,0,100, + 3,124,2,155,2,157,2,102,1,105,0,124,3,164,1,142, + 1,130,1,100,4,83,0,41,5,97,243,1,0,0,86,97, + 108,105,100,97,116,101,32,97,32,104,97,115,104,45,98,97, + 115,101,100,32,112,121,99,32,98,121,32,99,104,101,99,107, + 105,110,103,32,116,104,101,32,114,101,97,108,32,115,111,117, + 114,99,101,32,104,97,115,104,32,97,103,97,105,110,115,116, + 32,116,104,101,32,111,110,101,32,105,110,10,32,32,32,32, + 116,104,101,32,112,121,99,32,104,101,97,100,101,114,46,10, + 10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,116, + 104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116, + 104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,110, + 108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,32, + 98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,101, + 113,117,105,114,101,100,46,41,10,10,32,32,32,32,42,115, + 111,117,114,99,101,95,104,97,115,104,42,32,105,115,32,116, + 104,101,32,105,109,112,111,114,116,108,105,98,46,117,116,105, + 108,46,115,111,117,114,99,101,95,104,97,115,104,40,41,32, + 111,102,32,116,104,101,32,115,111,117,114,99,101,32,102,105, + 108,101,46,10,10,32,32,32,32,42,110,97,109,101,42,32, + 105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116, + 104,101,32,109,111,100,117,108,101,32,98,101,105,110,103,32, + 105,109,112,111,114,116,101,100,46,32,73,116,32,105,115,32, + 117,115,101,100,32,102,111,114,32,108,111,103,103,105,110,103, + 46,10,10,32,32,32,32,42,101,120,99,95,100,101,116,97, + 105,108,115,42,32,105,115,32,97,32,100,105,99,116,105,111, + 110,97,114,121,32,112,97,115,115,101,100,32,116,111,32,73, + 109,112,111,114,116,69,114,114,111,114,32,105,102,32,105,116, + 32,114,97,105,115,101,100,32,102,111,114,10,32,32,32,32, + 105,109,112,114,111,118,101,100,32,100,101,98,117,103,103,105, + 110,103,46,10,10,32,32,32,32,65,110,32,73,109,112,111, + 114,116,69,114,114,111,114,32,105,115,32,114,97,105,115,101, + 100,32,105,102,32,116,104,101,32,98,121,116,101,99,111,100, + 101,32,105,115,32,115,116,97,108,101,46,10,10,32,32,32, + 32,114,146,0,0,0,114,145,0,0,0,122,46,104,97,115, + 104,32,105,110,32,98,121,116,101,99,111,100,101,32,100,111, + 101,115,110,39,116,32,109,97,116,99,104,32,104,97,115,104, + 32,111,102,32,115,111,117,114,99,101,32,78,41,1,114,117, + 0,0,0,41,4,114,26,0,0,0,218,11,115,111,117,114, + 99,101,95,104,97,115,104,114,116,0,0,0,114,151,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,18,95,118,97,108,105,100,97,116,101,95,104,97,115,104, + 95,112,121,99,49,2,0,0,115,12,0,0,0,0,17,16, + 1,2,1,8,255,4,2,2,254,114,158,0,0,0,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,80,0,0,0,116,0,160,1, + 124,0,161,1,125,4,116,2,124,4,116,3,131,2,114,56, + 116,4,160,5,100,1,124,2,161,2,1,0,124,3,100,2, + 117,1,114,52,116,6,160,7,124,4,124,3,161,2,1,0, + 124,4,83,0,116,8,100,3,160,9,124,2,161,1,124,1, + 124,2,100,4,141,3,130,1,100,2,83,0,41,5,122,35, + 67,111,109,112,105,108,101,32,98,121,116,101,99,111,100,101, + 32,97,115,32,102,111,117,110,100,32,105,110,32,97,32,112, + 121,99,46,122,21,99,111,100,101,32,111,98,106,101,99,116, + 32,102,114,111,109,32,123,33,114,125,78,122,23,78,111,110, + 45,99,111,100,101,32,111,98,106,101,99,116,32,105,110,32, + 123,33,114,125,169,2,114,116,0,0,0,114,44,0,0,0, + 41,10,218,7,109,97,114,115,104,97,108,90,5,108,111,97, + 100,115,218,10,105,115,105,110,115,116,97,110,99,101,218,10, + 95,99,111,100,101,95,116,121,112,101,114,134,0,0,0,114, + 149,0,0,0,218,4,95,105,109,112,90,16,95,102,105,120, + 95,99,111,95,102,105,108,101,110,97,109,101,114,117,0,0, + 0,114,62,0,0,0,41,5,114,26,0,0,0,114,116,0, + 0,0,114,106,0,0,0,114,107,0,0,0,218,4,99,111, + 100,101,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,17,95,99,111,109,112,105,108,101,95,98,121,116,101, + 99,111,100,101,73,2,0,0,115,18,0,0,0,0,2,10, + 1,10,1,12,1,8,1,12,1,4,2,10,1,4,255,114, + 165,0,0,0,114,73,0,0,0,99,3,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,5,0,0,0,67,0, + 0,0,115,70,0,0,0,116,0,116,1,131,1,125,3,124, + 3,160,2,116,3,100,1,131,1,161,1,1,0,124,3,160, + 2,116,3,124,1,131,1,161,1,1,0,124,3,160,2,116, + 3,124,2,131,1,161,1,1,0,124,3,160,2,116,4,160, + 5,124,0,161,1,161,1,1,0,124,3,83,0,41,2,122, + 43,80,114,111,100,117,99,101,32,116,104,101,32,100,97,116, + 97,32,102,111,114,32,97,32,116,105,109,101,115,116,97,109, + 112,45,98,97,115,101,100,32,112,121,99,46,114,73,0,0, + 0,41,6,218,9,98,121,116,101,97,114,114,97,121,114,148, + 0,0,0,218,6,101,120,116,101,110,100,114,21,0,0,0, + 114,160,0,0,0,218,5,100,117,109,112,115,41,4,114,164, + 0,0,0,218,5,109,116,105,109,101,114,155,0,0,0,114, + 26,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,22,95,99,111,100,101,95,116,111,95,116,105, + 109,101,115,116,97,109,112,95,112,121,99,86,2,0,0,115, + 12,0,0,0,0,2,8,1,14,1,14,1,14,1,16,1, + 114,170,0,0,0,84,99,3,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, + 80,0,0,0,116,0,116,1,131,1,125,3,100,1,124,2, + 100,1,62,0,66,0,125,4,124,3,160,2,116,3,124,4, + 131,1,161,1,1,0,116,4,124,1,131,1,100,2,107,2, + 115,50,74,0,130,1,124,3,160,2,124,1,161,1,1,0, + 124,3,160,2,116,5,160,6,124,0,161,1,161,1,1,0, + 124,3,83,0,41,3,122,38,80,114,111,100,117,99,101,32, + 116,104,101,32,100,97,116,97,32,102,111,114,32,97,32,104, + 97,115,104,45,98,97,115,101,100,32,112,121,99,46,114,39, + 0,0,0,114,146,0,0,0,41,7,114,166,0,0,0,114, + 148,0,0,0,114,167,0,0,0,114,21,0,0,0,114,23, + 0,0,0,114,160,0,0,0,114,168,0,0,0,41,5,114, + 164,0,0,0,114,157,0,0,0,90,7,99,104,101,99,107, + 101,100,114,26,0,0,0,114,2,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,17,95,99,111, + 100,101,95,116,111,95,104,97,115,104,95,112,121,99,96,2, 0,0,115,14,0,0,0,0,2,8,1,12,1,14,1,16, - 1,10,1,16,1,114,172,0,0,0,99,1,0,0,0,0, + 1,10,1,16,1,114,171,0,0,0,99,1,0,0,0,0, 0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,67, 0,0,0,115,62,0,0,0,100,1,100,2,108,0,125,1, 116,1,160,2,124,0,161,1,106,3,125,2,124,1,160,4, @@ -879,1856 +888,1847 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 25,73,110,99,114,101,109,101,110,116,97,108,78,101,119,108, 105,110,101,68,101,99,111,100,101,114,218,6,100,101,99,111, 100,101,41,5,218,12,115,111,117,114,99,101,95,98,121,116, - 101,115,114,173,0,0,0,90,21,115,111,117,114,99,101,95, + 101,115,114,172,0,0,0,90,21,115,111,117,114,99,101,95, 98,121,116,101,115,95,114,101,97,100,108,105,110,101,218,8, 101,110,99,111,100,105,110,103,90,15,110,101,119,108,105,110, - 101,95,100,101,99,111,100,101,114,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,13,100,101,99,111,100,101, - 95,115,111,117,114,99,101,100,2,0,0,115,10,0,0,0, - 0,5,8,1,12,1,10,1,12,1,114,177,0,0,0,169, - 2,114,141,0,0,0,218,26,115,117,98,109,111,100,117,108, + 101,95,100,101,99,111,100,101,114,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,13,100,101,99,111,100,101, + 95,115,111,117,114,99,101,107,2,0,0,115,10,0,0,0, + 0,5,8,1,12,1,10,1,12,1,114,176,0,0,0,169, + 2,114,140,0,0,0,218,26,115,117,98,109,111,100,117,108, 101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111, 110,115,99,2,0,0,0,0,0,0,0,2,0,0,0,9, - 0,0,0,8,0,0,0,67,0,0,0,115,16,1,0,0, - 124,1,100,1,107,8,114,60,100,2,125,1,116,0,124,2, - 100,3,131,2,114,70,122,14,124,2,160,1,124,0,161,1, - 125,1,87,0,113,70,4,0,116,2,107,10,114,56,1,0, - 1,0,1,0,89,0,113,70,88,0,110,10,116,3,160,4, - 124,1,161,1,125,1,116,5,106,6,124,0,124,2,124,1, - 100,4,141,3,125,4,100,5,124,4,95,7,124,2,100,1, - 107,8,114,154,116,8,131,0,68,0,93,42,92,2,125,5, - 125,6,124,1,160,9,116,10,124,6,131,1,161,1,114,106, - 124,5,124,0,124,1,131,2,125,2,124,2,124,4,95,11, - 1,0,113,154,113,106,100,1,83,0,124,3,116,12,107,8, - 114,220,116,0,124,2,100,6,131,2,114,226,122,14,124,2, - 160,13,124,0,161,1,125,7,87,0,110,20,4,0,116,2, - 107,10,114,206,1,0,1,0,1,0,89,0,113,226,88,0, - 124,7,114,226,103,0,124,4,95,14,110,6,124,3,124,4, - 95,14,124,4,106,14,103,0,107,2,144,1,114,12,124,1, - 144,1,114,12,116,15,124,1,131,1,100,7,25,0,125,8, - 124,4,106,14,160,16,124,8,161,1,1,0,124,4,83,0, - 41,8,97,61,1,0,0,82,101,116,117,114,110,32,97,32, - 109,111,100,117,108,101,32,115,112,101,99,32,98,97,115,101, - 100,32,111,110,32,97,32,102,105,108,101,32,108,111,99,97, - 116,105,111,110,46,10,10,32,32,32,32,84,111,32,105,110, - 100,105,99,97,116,101,32,116,104,97,116,32,116,104,101,32, - 109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,107, - 97,103,101,44,32,115,101,116,10,32,32,32,32,115,117,98, - 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, - 99,97,116,105,111,110,115,32,116,111,32,97,32,108,105,115, - 116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,112, - 97,116,104,115,46,32,32,65,110,10,32,32,32,32,101,109, - 112,116,121,32,108,105,115,116,32,105,115,32,115,117,102,102, - 105,99,105,101,110,116,44,32,116,104,111,117,103,104,32,105, - 116,115,32,110,111,116,32,111,116,104,101,114,119,105,115,101, - 32,117,115,101,102,117,108,32,116,111,32,116,104,101,10,32, - 32,32,32,105,109,112,111,114,116,32,115,121,115,116,101,109, - 46,10,10,32,32,32,32,84,104,101,32,108,111,97,100,101, - 114,32,109,117,115,116,32,116,97,107,101,32,97,32,115,112, - 101,99,32,97,115,32,105,116,115,32,111,110,108,121,32,95, - 95,105,110,105,116,95,95,40,41,32,97,114,103,46,10,10, - 32,32,32,32,78,122,9,60,117,110,107,110,111,119,110,62, - 218,12,103,101,116,95,102,105,108,101,110,97,109,101,169,1, - 218,6,111,114,105,103,105,110,84,218,10,105,115,95,112,97, - 99,107,97,103,101,114,73,0,0,0,41,17,114,129,0,0, - 0,114,180,0,0,0,114,118,0,0,0,114,2,0,0,0, - 114,79,0,0,0,114,135,0,0,0,218,10,77,111,100,117, - 108,101,83,112,101,99,90,13,95,115,101,116,95,102,105,108, - 101,97,116,116,114,218,27,95,103,101,116,95,115,117,112,112, - 111,114,116,101,100,95,102,105,108,101,95,108,111,97,100,101, - 114,115,114,111,0,0,0,114,112,0,0,0,114,141,0,0, - 0,218,9,95,80,79,80,85,76,65,84,69,114,183,0,0, - 0,114,179,0,0,0,114,47,0,0,0,218,6,97,112,112, - 101,110,100,41,9,114,117,0,0,0,90,8,108,111,99,97, - 116,105,111,110,114,141,0,0,0,114,179,0,0,0,218,4, - 115,112,101,99,218,12,108,111,97,100,101,114,95,99,108,97, - 115,115,218,8,115,117,102,102,105,120,101,115,114,183,0,0, - 0,90,7,100,105,114,110,97,109,101,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,23,115,112,101,99,95, - 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, - 111,110,117,2,0,0,115,62,0,0,0,0,12,8,4,4, - 1,10,2,2,1,14,1,14,1,8,2,10,8,16,1,6, - 3,8,1,14,1,14,1,10,1,6,1,6,2,4,3,8, - 2,10,1,2,1,14,1,14,1,6,2,4,1,8,2,6, - 1,12,1,6,1,12,1,12,2,114,191,0,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,80,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,90,4,100,3,90,5, - 100,4,90,6,101,7,100,5,100,6,132,0,131,1,90,8, - 101,7,100,7,100,8,132,0,131,1,90,9,101,7,100,14, - 100,10,100,11,132,1,131,1,90,10,101,7,100,15,100,12, - 100,13,132,1,131,1,90,11,100,9,83,0,41,16,218,21, - 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,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,109,111,100,117, - 108,101,115,32,100,101,99,108,97,114,101,100,32,105,110,32, - 116,104,101,32,87,105,110,100,111,119,115,32,114,101,103,105, - 115,116,114,121,46,122,59,83,111,102,116,119,97,114,101,92, - 80,121,116,104,111,110,92,80,121,116,104,111,110,67,111,114, - 101,92,123,115,121,115,95,118,101,114,115,105,111,110,125,92, - 77,111,100,117,108,101,115,92,123,102,117,108,108,110,97,109, - 101,125,122,65,83,111,102,116,119,97,114,101,92,80,121,116, - 104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123, - 115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100, - 117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,92, - 68,101,98,117,103,70,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, - 56,0,0,0,122,16,116,0,160,1,116,0,106,2,124,1, - 161,2,87,0,83,0,4,0,116,3,107,10,114,50,1,0, - 1,0,1,0,116,0,160,1,116,0,106,4,124,1,161,2, - 6,0,89,0,83,0,88,0,100,0,83,0,114,110,0,0, - 0,41,5,218,7,95,119,105,110,114,101,103,90,7,79,112, - 101,110,75,101,121,90,17,72,75,69,89,95,67,85,82,82, - 69,78,84,95,85,83,69,82,114,50,0,0,0,90,18,72, - 75,69,89,95,76,79,67,65,76,95,77,65,67,72,73,78, - 69,41,2,218,3,99,108,115,114,5,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,14,95,111, - 112,101,110,95,114,101,103,105,115,116,114,121,197,2,0,0, - 115,8,0,0,0,0,2,2,1,16,1,14,1,122,36,87, - 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, - 110,100,101,114,46,95,111,112,101,110,95,114,101,103,105,115, - 116,114,121,99,2,0,0,0,0,0,0,0,0,0,0,0, - 6,0,0,0,9,0,0,0,67,0,0,0,115,114,0,0, - 0,124,0,106,0,114,14,124,0,106,1,125,2,110,6,124, - 0,106,2,125,2,124,2,106,3,124,1,100,1,116,4,106, - 5,100,0,100,2,133,2,25,0,22,0,100,3,141,2,125, - 3,122,38,124,0,160,6,124,3,161,1,143,18,125,4,116, - 7,160,8,124,4,100,4,161,2,125,5,87,0,53,0,81, - 0,82,0,88,0,87,0,110,22,4,0,116,9,107,10,114, - 108,1,0,1,0,1,0,89,0,100,0,83,0,88,0,124, - 5,83,0,41,5,78,122,5,37,100,46,37,100,114,28,0, - 0,0,41,2,114,140,0,0,0,90,11,115,121,115,95,118, - 101,114,115,105,111,110,114,40,0,0,0,41,10,218,11,68, - 69,66,85,71,95,66,85,73,76,68,218,18,82,69,71,73, - 83,84,82,89,95,75,69,89,95,68,69,66,85,71,218,12, - 82,69,71,73,83,84,82,89,95,75,69,89,114,62,0,0, - 0,114,8,0,0,0,218,12,118,101,114,115,105,111,110,95, - 105,110,102,111,114,195,0,0,0,114,193,0,0,0,90,10, - 81,117,101,114,121,86,97,108,117,101,114,50,0,0,0,41, - 6,114,194,0,0,0,114,140,0,0,0,90,12,114,101,103, - 105,115,116,114,121,95,107,101,121,114,5,0,0,0,90,4, - 104,107,101,121,218,8,102,105,108,101,112,97,116,104,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,16,95, - 115,101,97,114,99,104,95,114,101,103,105,115,116,114,121,204, - 2,0,0,115,24,0,0,0,0,2,6,1,8,2,6,1, - 6,1,16,255,6,2,2,1,12,1,26,1,14,1,8,1, - 122,38,87,105,110,100,111,119,115,82,101,103,105,115,116,114, - 121,70,105,110,100,101,114,46,95,115,101,97,114,99,104,95, - 114,101,103,105,115,116,114,121,78,99,4,0,0,0,0,0, - 0,0,0,0,0,0,8,0,0,0,8,0,0,0,67,0, - 0,0,115,122,0,0,0,124,0,160,0,124,1,161,1,125, - 4,124,4,100,0,107,8,114,22,100,0,83,0,122,12,116, - 1,124,4,131,1,1,0,87,0,110,22,4,0,116,2,107, - 10,114,56,1,0,1,0,1,0,89,0,100,0,83,0,88, - 0,116,3,131,0,68,0,93,52,92,2,125,5,125,6,124, - 4,160,4,116,5,124,6,131,1,161,1,114,64,116,6,106, - 7,124,1,124,5,124,1,124,4,131,2,124,4,100,1,141, - 3,125,7,124,7,2,0,1,0,83,0,113,64,100,0,83, - 0,41,2,78,114,181,0,0,0,41,8,114,201,0,0,0, - 114,49,0,0,0,114,50,0,0,0,114,185,0,0,0,114, - 111,0,0,0,114,112,0,0,0,114,135,0,0,0,218,16, - 115,112,101,99,95,102,114,111,109,95,108,111,97,100,101,114, - 41,8,114,194,0,0,0,114,140,0,0,0,114,44,0,0, - 0,218,6,116,97,114,103,101,116,114,200,0,0,0,114,141, - 0,0,0,114,190,0,0,0,114,188,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,9,102,105, - 110,100,95,115,112,101,99,219,2,0,0,115,28,0,0,0, - 0,2,10,1,8,1,4,1,2,1,12,1,14,1,8,1, - 14,1,14,1,6,1,8,1,2,254,6,3,122,31,87,105, - 110,100,111,119,115,82,101,103,105,115,116,114,121,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,34,0,0,0,124,0,160,0,124, - 1,124,2,161,2,125,3,124,3,100,1,107,9,114,26,124, - 3,106,1,83,0,100,1,83,0,100,1,83,0,41,2,122, - 108,70,105,110,100,32,109,111,100,117,108,101,32,110,97,109, - 101,100,32,105,110,32,116,104,101,32,114,101,103,105,115,116, - 114,121,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,78,169,2, - 114,204,0,0,0,114,141,0,0,0,169,4,114,194,0,0, - 0,114,140,0,0,0,114,44,0,0,0,114,188,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 11,102,105,110,100,95,109,111,100,117,108,101,235,2,0,0, - 115,8,0,0,0,0,7,12,1,8,1,6,2,122,33,87, - 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, - 110,100,101,114,46,102,105,110,100,95,109,111,100,117,108,101, - 41,2,78,78,41,1,78,41,12,114,126,0,0,0,114,125, - 0,0,0,114,127,0,0,0,114,128,0,0,0,114,198,0, - 0,0,114,197,0,0,0,114,196,0,0,0,218,11,99,108, - 97,115,115,109,101,116,104,111,100,114,195,0,0,0,114,201, - 0,0,0,114,204,0,0,0,114,207,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,192,0,0,0,185,2,0,0,115,28,0,0,0,8, - 2,4,3,2,255,2,4,2,255,2,3,4,2,2,1,10, - 6,2,1,10,14,2,1,12,15,2,1,114,192,0,0,0, + 0,0,0,8,0,0,0,67,0,0,0,115,12,1,0,0, + 124,1,100,1,117,0,114,58,100,2,125,1,116,0,124,2, + 100,3,131,2,114,68,122,14,124,2,160,1,124,0,161,1, + 125,1,87,0,113,68,4,0,116,2,121,54,1,0,1,0, + 1,0,89,0,113,68,48,0,110,10,116,3,160,4,124,1, + 161,1,125,1,116,5,106,6,124,0,124,2,124,1,100,4, + 141,3,125,4,100,5,124,4,95,7,124,2,100,1,117,0, + 114,152,116,8,131,0,68,0,93,42,92,2,125,5,125,6, + 124,1,160,9,116,10,124,6,131,1,161,1,114,104,124,5, + 124,0,124,1,131,2,125,2,124,2,124,4,95,11,1,0, + 113,152,113,104,100,1,83,0,124,3,116,12,117,0,114,216, + 116,0,124,2,100,6,131,2,114,222,122,14,124,2,160,13, + 124,0,161,1,125,7,87,0,110,18,4,0,116,2,121,202, + 1,0,1,0,1,0,89,0,113,222,48,0,124,7,114,222, + 103,0,124,4,95,14,110,6,124,3,124,4,95,14,124,4, + 106,14,103,0,107,2,144,1,114,8,124,1,144,1,114,8, + 116,15,124,1,131,1,100,7,25,0,125,8,124,4,106,14, + 160,16,124,8,161,1,1,0,124,4,83,0,41,8,97,61, + 1,0,0,82,101,116,117,114,110,32,97,32,109,111,100,117, + 108,101,32,115,112,101,99,32,98,97,115,101,100,32,111,110, + 32,97,32,102,105,108,101,32,108,111,99,97,116,105,111,110, + 46,10,10,32,32,32,32,84,111,32,105,110,100,105,99,97, + 116,101,32,116,104,97,116,32,116,104,101,32,109,111,100,117, + 108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,44, + 32,115,101,116,10,32,32,32,32,115,117,98,109,111,100,117, + 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, + 111,110,115,32,116,111,32,97,32,108,105,115,116,32,111,102, + 32,100,105,114,101,99,116,111,114,121,32,112,97,116,104,115, + 46,32,32,65,110,10,32,32,32,32,101,109,112,116,121,32, + 108,105,115,116,32,105,115,32,115,117,102,102,105,99,105,101, + 110,116,44,32,116,104,111,117,103,104,32,105,116,115,32,110, + 111,116,32,111,116,104,101,114,119,105,115,101,32,117,115,101, + 102,117,108,32,116,111,32,116,104,101,10,32,32,32,32,105, + 109,112,111,114,116,32,115,121,115,116,101,109,46,10,10,32, + 32,32,32,84,104,101,32,108,111,97,100,101,114,32,109,117, + 115,116,32,116,97,107,101,32,97,32,115,112,101,99,32,97, + 115,32,105,116,115,32,111,110,108,121,32,95,95,105,110,105, + 116,95,95,40,41,32,97,114,103,46,10,10,32,32,32,32, + 78,122,9,60,117,110,107,110,111,119,110,62,218,12,103,101, + 116,95,102,105,108,101,110,97,109,101,169,1,218,6,111,114, + 105,103,105,110,84,218,10,105,115,95,112,97,99,107,97,103, + 101,114,73,0,0,0,41,17,114,128,0,0,0,114,179,0, + 0,0,114,117,0,0,0,114,4,0,0,0,114,79,0,0, + 0,114,134,0,0,0,218,10,77,111,100,117,108,101,83,112, + 101,99,90,13,95,115,101,116,95,102,105,108,101,97,116,116, + 114,218,27,95,103,101,116,95,115,117,112,112,111,114,116,101, + 100,95,102,105,108,101,95,108,111,97,100,101,114,115,114,110, + 0,0,0,114,111,0,0,0,114,140,0,0,0,218,9,95, + 80,79,80,85,76,65,84,69,114,182,0,0,0,114,178,0, + 0,0,114,47,0,0,0,218,6,97,112,112,101,110,100,41, + 9,114,116,0,0,0,90,8,108,111,99,97,116,105,111,110, + 114,140,0,0,0,114,178,0,0,0,218,4,115,112,101,99, + 218,12,108,111,97,100,101,114,95,99,108,97,115,115,218,8, + 115,117,102,102,105,120,101,115,114,182,0,0,0,90,7,100, + 105,114,110,97,109,101,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,23,115,112,101,99,95,102,114,111,109, + 95,102,105,108,101,95,108,111,99,97,116,105,111,110,124,2, + 0,0,115,62,0,0,0,0,12,8,4,4,1,10,2,2, + 1,14,1,12,1,8,2,10,8,16,1,6,3,8,1,14, + 1,14,1,10,1,6,1,6,2,4,3,8,2,10,1,2, + 1,14,1,12,1,6,2,4,1,8,2,6,1,12,1,6, + 1,12,1,12,2,114,190,0,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,80,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,90,4,100,3,90,5,100,4,90,6, + 101,7,100,5,100,6,132,0,131,1,90,8,101,7,100,7, + 100,8,132,0,131,1,90,9,101,7,100,14,100,10,100,11, + 132,1,131,1,90,10,101,7,100,15,100,12,100,13,132,1, + 131,1,90,11,100,9,83,0,41,16,218,21,87,105,110,100, + 111,119,115,82,101,103,105,115,116,114,121,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,109,111,100,117,108,101,115,32, + 100,101,99,108,97,114,101,100,32,105,110,32,116,104,101,32, + 87,105,110,100,111,119,115,32,114,101,103,105,115,116,114,121, + 46,122,59,83,111,102,116,119,97,114,101,92,80,121,116,104, + 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, + 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, + 108,101,115,92,123,102,117,108,108,110,97,109,101,125,122,65, + 83,111,102,116,119,97,114,101,92,80,121,116,104,111,110,92, + 80,121,116,104,111,110,67,111,114,101,92,123,115,121,115,95, + 118,101,114,115,105,111,110,125,92,77,111,100,117,108,101,115, + 92,123,102,117,108,108,110,97,109,101,125,92,68,101,98,117, + 103,70,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,8,0,0,0,67,0,0,0,115,54,0,0,0, + 122,16,116,0,160,1,116,0,106,2,124,1,161,2,87,0, + 83,0,4,0,116,3,121,48,1,0,1,0,1,0,116,0, + 160,1,116,0,106,4,124,1,161,2,6,0,89,0,83,0, + 48,0,100,0,83,0,114,109,0,0,0,41,5,218,6,119, + 105,110,114,101,103,90,7,79,112,101,110,75,101,121,90,17, + 72,75,69,89,95,67,85,82,82,69,78,84,95,85,83,69, + 82,114,50,0,0,0,90,18,72,75,69,89,95,76,79,67, + 65,76,95,77,65,67,72,73,78,69,41,2,218,3,99,108, + 115,114,7,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,14,95,111,112,101,110,95,114,101,103, + 105,115,116,114,121,204,2,0,0,115,8,0,0,0,0,2, + 2,1,16,1,12,1,122,36,87,105,110,100,111,119,115,82, + 101,103,105,115,116,114,121,70,105,110,100,101,114,46,95,111, + 112,101,110,95,114,101,103,105,115,116,114,121,99,2,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,8,0,0, + 0,67,0,0,0,115,132,0,0,0,124,0,106,0,114,14, + 124,0,106,1,125,2,110,6,124,0,106,2,125,2,124,2, + 106,3,124,1,100,1,116,4,106,5,100,0,100,2,133,2, + 25,0,22,0,100,3,141,2,125,3,122,58,124,0,160,6, + 124,3,161,1,143,28,125,4,116,7,160,8,124,4,100,4, + 161,2,125,5,87,0,100,0,4,0,4,0,131,3,1,0, + 110,16,49,0,115,94,48,0,1,0,1,0,1,0,89,0, + 1,0,87,0,110,20,4,0,116,9,121,126,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,124,5,83,0,41,5, + 78,122,5,37,100,46,37,100,114,28,0,0,0,41,2,114, + 139,0,0,0,90,11,115,121,115,95,118,101,114,115,105,111, + 110,114,40,0,0,0,41,10,218,11,68,69,66,85,71,95, + 66,85,73,76,68,218,18,82,69,71,73,83,84,82,89,95, + 75,69,89,95,68,69,66,85,71,218,12,82,69,71,73,83, + 84,82,89,95,75,69,89,114,62,0,0,0,114,1,0,0, + 0,218,12,118,101,114,115,105,111,110,95,105,110,102,111,114, + 194,0,0,0,114,192,0,0,0,90,10,81,117,101,114,121, + 86,97,108,117,101,114,50,0,0,0,41,6,114,193,0,0, + 0,114,139,0,0,0,90,12,114,101,103,105,115,116,114,121, + 95,107,101,121,114,7,0,0,0,90,4,104,107,101,121,218, + 8,102,105,108,101,112,97,116,104,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,16,95,115,101,97,114,99, + 104,95,114,101,103,105,115,116,114,121,211,2,0,0,115,24, + 0,0,0,0,2,6,1,8,2,6,1,6,1,16,255,6, + 2,2,1,12,1,46,1,12,1,8,1,122,38,87,105,110, + 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, + 101,114,46,95,115,101,97,114,99,104,95,114,101,103,105,115, + 116,114,121,78,99,4,0,0,0,0,0,0,0,0,0,0, + 0,8,0,0,0,8,0,0,0,67,0,0,0,115,120,0, + 0,0,124,0,160,0,124,1,161,1,125,4,124,4,100,0, + 117,0,114,22,100,0,83,0,122,12,116,1,124,4,131,1, + 1,0,87,0,110,20,4,0,116,2,121,54,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,116,3,131,0,68,0, + 93,52,92,2,125,5,125,6,124,4,160,4,116,5,124,6, + 131,1,161,1,114,62,116,6,106,7,124,1,124,5,124,1, + 124,4,131,2,124,4,100,1,141,3,125,7,124,7,2,0, + 1,0,83,0,113,62,100,0,83,0,41,2,78,114,180,0, + 0,0,41,8,114,200,0,0,0,114,49,0,0,0,114,50, + 0,0,0,114,184,0,0,0,114,110,0,0,0,114,111,0, + 0,0,114,134,0,0,0,218,16,115,112,101,99,95,102,114, + 111,109,95,108,111,97,100,101,114,41,8,114,193,0,0,0, + 114,139,0,0,0,114,44,0,0,0,218,6,116,97,114,103, + 101,116,114,199,0,0,0,114,140,0,0,0,114,189,0,0, + 0,114,187,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,9,102,105,110,100,95,115,112,101,99, + 226,2,0,0,115,28,0,0,0,0,2,10,1,8,1,4, + 1,2,1,12,1,12,1,8,1,14,1,14,1,6,1,8, + 1,2,254,6,3,122,31,87,105,110,100,111,119,115,82,101, + 103,105,115,116,114,121,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, + 34,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, + 124,3,100,1,117,1,114,26,124,3,106,1,83,0,100,1, + 83,0,100,1,83,0,41,2,122,108,70,105,110,100,32,109, + 111,100,117,108,101,32,110,97,109,101,100,32,105,110,32,116, + 104,101,32,114,101,103,105,115,116,114,121,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,78,169,2,114,203,0,0,0,114,140, + 0,0,0,169,4,114,193,0,0,0,114,139,0,0,0,114, + 44,0,0,0,114,187,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,11,102,105,110,100,95,109, + 111,100,117,108,101,242,2,0,0,115,8,0,0,0,0,7, + 12,1,8,1,6,2,122,33,87,105,110,100,111,119,115,82, + 101,103,105,115,116,114,121,70,105,110,100,101,114,46,102,105, + 110,100,95,109,111,100,117,108,101,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,197,0,0,0,114,196,0,0,0, + 114,195,0,0,0,218,11,99,108,97,115,115,109,101,116,104, + 111,100,114,194,0,0,0,114,200,0,0,0,114,203,0,0, + 0,114,206,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,191,0,0,0,192, + 2,0,0,115,28,0,0,0,8,2,4,3,2,255,2,4, + 2,255,2,3,4,2,2,1,10,6,2,1,10,14,2,1, + 12,15,2,1,114,191,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,48,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,83,0,41,11,218,13,95,76,111,97,100, + 101,114,66,97,115,105,99,115,122,83,66,97,115,101,32,99, + 108,97,115,115,32,111,102,32,99,111,109,109,111,110,32,99, + 111,100,101,32,110,101,101,100,101,100,32,98,121,32,98,111, + 116,104,32,83,111,117,114,99,101,76,111,97,100,101,114,32, + 97,110,100,10,32,32,32,32,83,111,117,114,99,101,108,101, + 115,115,70,105,108,101,76,111,97,100,101,114,46,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0, + 0,0,67,0,0,0,115,64,0,0,0,116,0,124,0,160, + 1,124,1,161,1,131,1,100,1,25,0,125,2,124,2,160, + 2,100,2,100,1,161,2,100,3,25,0,125,3,124,1,160, + 3,100,2,161,1,100,4,25,0,125,4,124,3,100,5,107, + 2,111,62,124,4,100,5,107,3,83,0,41,6,122,141,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,73,110,115,112,101,99, + 116,76,111,97,100,101,114,46,105,115,95,112,97,99,107,97, + 103,101,32,98,121,32,99,104,101,99,107,105,110,103,32,105, + 102,10,32,32,32,32,32,32,32,32,116,104,101,32,112,97, + 116,104,32,114,101,116,117,114,110,101,100,32,98,121,32,103, + 101,116,95,102,105,108,101,110,97,109,101,32,104,97,115,32, + 97,32,102,105,108,101,110,97,109,101,32,111,102,32,39,95, + 95,105,110,105,116,95,95,46,112,121,39,46,114,39,0,0, + 0,114,71,0,0,0,114,73,0,0,0,114,28,0,0,0, + 218,8,95,95,105,110,105,116,95,95,41,4,114,47,0,0, + 0,114,179,0,0,0,114,43,0,0,0,114,41,0,0,0, + 41,5,114,118,0,0,0,114,139,0,0,0,114,96,0,0, + 0,90,13,102,105,108,101,110,97,109,101,95,98,97,115,101, + 90,9,116,97,105,108,95,110,97,109,101,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,182,0,0,0,5, + 3,0,0,115,8,0,0,0,0,3,18,1,16,1,14,1, + 122,24,95,76,111,97,100,101,114,66,97,115,105,99,115,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,169,2,122,42, + 85,115,101,32,100,101,102,97,117,108,116,32,115,101,109,97, + 110,116,105,99,115,32,102,111,114,32,109,111,100,117,108,101, + 32,99,114,101,97,116,105,111,110,46,78,114,5,0,0,0, + 169,2,114,118,0,0,0,114,187,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,13,99,114,101, + 97,116,101,95,109,111,100,117,108,101,13,3,0,0,115,2, + 0,0,0,0,1,122,27,95,76,111,97,100,101,114,66,97, + 115,105,99,115,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,3, + 0,0,0,5,0,0,0,67,0,0,0,115,56,0,0,0, + 124,0,160,0,124,1,106,1,161,1,125,2,124,2,100,1, + 117,0,114,36,116,2,100,2,160,3,124,1,106,1,161,1, + 131,1,130,1,116,4,160,5,116,6,124,2,124,1,106,7, + 161,3,1,0,100,1,83,0,41,3,122,19,69,120,101,99, + 117,116,101,32,116,104,101,32,109,111,100,117,108,101,46,78, + 122,52,99,97,110,110,111,116,32,108,111,97,100,32,109,111, + 100,117,108,101,32,123,33,114,125,32,119,104,101,110,32,103, + 101,116,95,99,111,100,101,40,41,32,114,101,116,117,114,110, + 115,32,78,111,110,101,41,8,218,8,103,101,116,95,99,111, + 100,101,114,125,0,0,0,114,117,0,0,0,114,62,0,0, + 0,114,134,0,0,0,218,25,95,99,97,108,108,95,119,105, + 116,104,95,102,114,97,109,101,115,95,114,101,109,111,118,101, + 100,218,4,101,120,101,99,114,131,0,0,0,41,3,114,118, + 0,0,0,218,6,109,111,100,117,108,101,114,164,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 11,101,120,101,99,95,109,111,100,117,108,101,16,3,0,0, + 115,12,0,0,0,0,2,12,1,8,1,6,1,4,255,6, + 2,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, + 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,12,0,0,0,116,0,160,1,124,0, + 124,1,161,2,83,0,41,1,122,26,84,104,105,115,32,109, + 111,100,117,108,101,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,41,2,114,134,0,0,0,218,17,95,108,111, + 97,100,95,109,111,100,117,108,101,95,115,104,105,109,169,2, + 114,118,0,0,0,114,139,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,11,108,111,97,100,95, + 109,111,100,117,108,101,24,3,0,0,115,2,0,0,0,0, + 2,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, + 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114, + 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, + 0,0,0,114,182,0,0,0,114,212,0,0,0,114,217,0, + 0,0,114,220,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,208,0,0,0, + 0,3,0,0,115,10,0,0,0,8,2,4,3,8,8,8, + 3,8,8,114,208,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,74,0,0,0,101,0,90,1,100,0,90,2,100,1, + 100,2,132,0,90,3,100,3,100,4,132,0,90,4,100,5, + 100,6,132,0,90,5,100,7,100,8,132,0,90,6,100,9, + 100,10,132,0,90,7,100,11,100,12,156,1,100,13,100,14, + 132,2,90,8,100,15,100,16,132,0,90,9,100,17,83,0, + 41,18,218,12,83,111,117,114,99,101,76,111,97,100,101,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,8,0,0,0,116,0, + 130,1,100,1,83,0,41,2,122,165,79,112,116,105,111,110, + 97,108,32,109,101,116,104,111,100,32,116,104,97,116,32,114, + 101,116,117,114,110,115,32,116,104,101,32,109,111,100,105,102, + 105,99,97,116,105,111,110,32,116,105,109,101,32,40,97,110, + 32,105,110,116,41,32,102,111,114,32,116,104,101,10,32,32, + 32,32,32,32,32,32,115,112,101,99,105,102,105,101,100,32, + 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, + 32,32,32,32,32,32,32,82,97,105,115,101,115,32,79,83, + 69,114,114,111,114,32,119,104,101,110,32,116,104,101,32,112, + 97,116,104,32,99,97,110,110,111,116,32,98,101,32,104,97, + 110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,78, + 41,1,114,50,0,0,0,169,2,114,118,0,0,0,114,44, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,10,112,97,116,104,95,109,116,105,109,101,31,3, + 0,0,115,2,0,0,0,0,6,122,23,83,111,117,114,99, + 101,76,111,97,100,101,114,46,112,97,116,104,95,109,116,105, + 109,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,14,0,0,0, + 100,1,124,0,160,0,124,1,161,1,105,1,83,0,41,2, + 97,158,1,0,0,79,112,116,105,111,110,97,108,32,109,101, + 116,104,111,100,32,114,101,116,117,114,110,105,110,103,32,97, + 32,109,101,116,97,100,97,116,97,32,100,105,99,116,32,102, + 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, + 10,32,32,32,32,32,32,32,32,112,97,116,104,32,40,97, + 32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,32, + 80,111,115,115,105,98,108,101,32,107,101,121,115,58,10,32, + 32,32,32,32,32,32,32,45,32,39,109,116,105,109,101,39, + 32,40,109,97,110,100,97,116,111,114,121,41,32,105,115,32, + 116,104,101,32,110,117,109,101,114,105,99,32,116,105,109,101, + 115,116,97,109,112,32,111,102,32,108,97,115,116,32,115,111, + 117,114,99,101,10,32,32,32,32,32,32,32,32,32,32,99, + 111,100,101,32,109,111,100,105,102,105,99,97,116,105,111,110, + 59,10,32,32,32,32,32,32,32,32,45,32,39,115,105,122, + 101,39,32,40,111,112,116,105,111,110,97,108,41,32,105,115, + 32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,116, + 101,115,32,111,102,32,116,104,101,32,115,111,117,114,99,101, + 32,99,111,100,101,46,10,10,32,32,32,32,32,32,32,32, + 73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,105, + 115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,32, + 116,104,101,32,108,111,97,100,101,114,32,116,111,32,114,101, + 97,100,32,98,121,116,101,99,111,100,101,32,102,105,108,101, + 115,46,10,32,32,32,32,32,32,32,32,82,97,105,115,101, + 115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,116, + 104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,98, + 101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,32, + 32,32,32,114,169,0,0,0,41,1,114,223,0,0,0,114, + 222,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,10,112,97,116,104,95,115,116,97,116,115,39, + 3,0,0,115,2,0,0,0,0,12,122,23,83,111,117,114, + 99,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, + 4,0,0,0,4,0,0,0,67,0,0,0,115,12,0,0, + 0,124,0,160,0,124,2,124,3,161,2,83,0,41,1,122, + 228,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, + 32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,97, + 116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,32, + 102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,114, + 41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, + 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, + 116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,32, + 116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,98, + 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,10, + 32,32,32,32,32,32,32,32,84,104,101,32,115,111,117,114, + 99,101,32,112,97,116,104,32,105,115,32,110,101,101,100,101, + 100,32,105,110,32,111,114,100,101,114,32,116,111,32,99,111, + 114,114,101,99,116,108,121,32,116,114,97,110,115,102,101,114, + 32,112,101,114,109,105,115,115,105,111,110,115,10,32,32,32, + 32,32,32,32,32,41,1,218,8,115,101,116,95,100,97,116, + 97,41,4,114,118,0,0,0,114,107,0,0,0,90,10,99, + 97,99,104,101,95,112,97,116,104,114,26,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,15,95, + 99,97,99,104,101,95,98,121,116,101,99,111,100,101,53,3, + 0,0,115,2,0,0,0,0,8,122,28,83,111,117,114,99, + 101,76,111,97,100,101,114,46,95,99,97,99,104,101,95,98, + 121,116,101,99,111,100,101,99,3,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,150,79,112,116, + 105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,105, + 99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,40, + 98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,101, + 32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,10, + 32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,110, + 116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,100, + 32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,32, + 119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,99, + 111,100,101,32,102,105,108,101,115,46,10,32,32,32,32,32, + 32,32,32,78,114,5,0,0,0,41,3,114,118,0,0,0, + 114,44,0,0,0,114,26,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,225,0,0,0,63,3, + 0,0,115,2,0,0,0,0,1,122,21,83,111,117,114,99, + 101,76,111,97,100,101,114,46,115,101,116,95,100,97,116,97, + 99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,10,0,0,0,67,0,0,0,115,84,0,0,0,124,0, + 160,0,124,1,161,1,125,2,122,14,124,0,160,1,124,2, + 161,1,125,3,87,0,110,50,4,0,116,2,121,74,1,0, + 125,4,1,0,122,26,116,3,100,1,124,1,100,2,141,2, + 124,4,130,2,87,0,89,0,100,3,125,4,126,4,110,10, + 100,3,125,4,126,4,48,0,48,0,116,4,124,3,131,1, + 83,0,41,4,122,52,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,73,110,115,112,101,99,116,76,111,97,100,101,114,46,103, + 101,116,95,115,111,117,114,99,101,46,122,39,115,111,117,114, + 99,101,32,110,111,116,32,97,118,97,105,108,97,98,108,101, + 32,116,104,114,111,117,103,104,32,103,101,116,95,100,97,116, + 97,40,41,114,115,0,0,0,78,41,5,114,179,0,0,0, + 218,8,103,101,116,95,100,97,116,97,114,50,0,0,0,114, + 117,0,0,0,114,176,0,0,0,41,5,114,118,0,0,0, + 114,139,0,0,0,114,44,0,0,0,114,174,0,0,0,218, + 3,101,120,99,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,70, + 3,0,0,115,20,0,0,0,0,2,10,1,2,1,14,1, + 14,1,4,1,2,255,4,1,2,255,24,2,122,23,83,111, + 117,114,99,101,76,111,97,100,101,114,46,103,101,116,95,115, + 111,117,114,99,101,114,104,0,0,0,41,1,218,9,95,111, + 112,116,105,109,105,122,101,99,3,0,0,0,0,0,0,0, + 1,0,0,0,4,0,0,0,8,0,0,0,67,0,0,0, + 115,22,0,0,0,116,0,106,1,116,2,124,1,124,2,100, + 1,100,2,124,3,100,3,141,6,83,0,41,4,122,130,82, + 101,116,117,114,110,32,116,104,101,32,99,111,100,101,32,111, + 98,106,101,99,116,32,99,111,109,112,105,108,101,100,32,102, + 114,111,109,32,115,111,117,114,99,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,101,32,39,100,97,116,97,39,32, + 97,114,103,117,109,101,110,116,32,99,97,110,32,98,101,32, + 97,110,121,32,111,98,106,101,99,116,32,116,121,112,101,32, + 116,104,97,116,32,99,111,109,112,105,108,101,40,41,32,115, + 117,112,112,111,114,116,115,46,10,32,32,32,32,32,32,32, + 32,114,215,0,0,0,84,41,2,218,12,100,111,110,116,95, + 105,110,104,101,114,105,116,114,83,0,0,0,41,3,114,134, + 0,0,0,114,214,0,0,0,218,7,99,111,109,112,105,108, + 101,41,4,114,118,0,0,0,114,26,0,0,0,114,44,0, + 0,0,114,230,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,14,115,111,117,114,99,101,95,116, + 111,95,99,111,100,101,80,3,0,0,115,6,0,0,0,0, + 5,12,1,4,255,122,27,83,111,117,114,99,101,76,111,97, + 100,101,114,46,115,111,117,114,99,101,95,116,111,95,99,111, + 100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,15, + 0,0,0,9,0,0,0,67,0,0,0,115,24,2,0,0, + 124,0,160,0,124,1,161,1,125,2,100,1,125,3,100,1, + 125,4,100,1,125,5,100,2,125,6,100,3,125,7,122,12, + 116,1,124,2,131,1,125,8,87,0,110,24,4,0,116,2, + 121,66,1,0,1,0,1,0,100,1,125,8,89,0,144,1, + 110,42,48,0,122,14,124,0,160,3,124,2,161,1,125,9, + 87,0,110,20,4,0,116,4,121,102,1,0,1,0,1,0, + 89,0,144,1,110,6,48,0,116,5,124,9,100,4,25,0, + 131,1,125,3,122,14,124,0,160,6,124,8,161,1,125,10, + 87,0,110,18,4,0,116,4,121,148,1,0,1,0,1,0, + 89,0,110,216,48,0,124,1,124,8,100,5,156,2,125,11, + 122,148,116,7,124,10,124,1,124,11,131,3,125,12,116,8, + 124,10,131,1,100,6,100,1,133,2,25,0,125,13,124,12, + 100,7,64,0,100,8,107,3,125,6,124,6,144,1,114,30, + 124,12,100,9,64,0,100,8,107,3,125,7,116,9,106,10, + 100,10,107,3,144,1,114,50,124,7,115,248,116,9,106,10, + 100,11,107,2,144,1,114,50,124,0,160,6,124,2,161,1, + 125,4,116,9,160,11,116,12,124,4,161,2,125,5,116,13, + 124,10,124,5,124,1,124,11,131,4,1,0,110,20,116,14, + 124,10,124,3,124,9,100,12,25,0,124,1,124,11,131,5, + 1,0,87,0,110,24,4,0,116,15,116,16,102,2,144,1, + 121,76,1,0,1,0,1,0,89,0,110,32,48,0,116,17, + 160,18,100,13,124,8,124,2,161,3,1,0,116,19,124,13, + 124,1,124,8,124,2,100,14,141,4,83,0,124,4,100,1, + 117,0,144,1,114,128,124,0,160,6,124,2,161,1,125,4, + 124,0,160,20,124,4,124,2,161,2,125,14,116,17,160,18, + 100,15,124,2,161,2,1,0,116,21,106,22,144,2,115,20, + 124,8,100,1,117,1,144,2,114,20,124,3,100,1,117,1, + 144,2,114,20,124,6,144,1,114,220,124,5,100,1,117,0, + 144,1,114,206,116,9,160,11,124,4,161,1,125,5,116,23, + 124,14,124,5,124,7,131,3,125,10,110,16,116,24,124,14, + 124,3,116,25,124,4,131,1,131,3,125,10,122,18,124,0, + 160,26,124,2,124,8,124,10,161,3,1,0,87,0,110,20, + 4,0,116,2,144,2,121,18,1,0,1,0,1,0,89,0, + 110,2,48,0,124,14,83,0,41,16,122,190,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,73,110,115,112,101,99,116,76,111, + 97,100,101,114,46,103,101,116,95,99,111,100,101,46,10,10, + 32,32,32,32,32,32,32,32,82,101,97,100,105,110,103,32, + 111,102,32,98,121,116,101,99,111,100,101,32,114,101,113,117, + 105,114,101,115,32,112,97,116,104,95,115,116,97,116,115,32, + 116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101, + 100,46,32,84,111,32,119,114,105,116,101,10,32,32,32,32, + 32,32,32,32,98,121,116,101,99,111,100,101,44,32,115,101, + 116,95,100,97,116,97,32,109,117,115,116,32,97,108,115,111, + 32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,46, + 10,10,32,32,32,32,32,32,32,32,78,70,84,114,169,0, + 0,0,114,159,0,0,0,114,145,0,0,0,114,39,0,0, + 0,114,73,0,0,0,114,28,0,0,0,90,5,110,101,118, + 101,114,90,6,97,108,119,97,121,115,218,4,115,105,122,101, + 122,13,123,125,32,109,97,116,99,104,101,115,32,123,125,41, + 3,114,116,0,0,0,114,106,0,0,0,114,107,0,0,0, + 122,19,99,111,100,101,32,111,98,106,101,99,116,32,102,114, + 111,109,32,123,125,41,27,114,179,0,0,0,114,97,0,0, + 0,114,82,0,0,0,114,224,0,0,0,114,50,0,0,0, + 114,18,0,0,0,114,227,0,0,0,114,152,0,0,0,218, + 10,109,101,109,111,114,121,118,105,101,119,114,163,0,0,0, + 90,21,99,104,101,99,107,95,104,97,115,104,95,98,97,115, + 101,100,95,112,121,99,115,114,157,0,0,0,218,17,95,82, + 65,87,95,77,65,71,73,67,95,78,85,77,66,69,82,114, + 158,0,0,0,114,156,0,0,0,114,117,0,0,0,114,150, + 0,0,0,114,134,0,0,0,114,149,0,0,0,114,165,0, + 0,0,114,233,0,0,0,114,1,0,0,0,218,19,100,111, + 110,116,95,119,114,105,116,101,95,98,121,116,101,99,111,100, + 101,114,171,0,0,0,114,170,0,0,0,114,23,0,0,0, + 114,226,0,0,0,41,15,114,118,0,0,0,114,139,0,0, + 0,114,107,0,0,0,114,154,0,0,0,114,174,0,0,0, + 114,157,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,114, + 106,0,0,0,218,2,115,116,114,26,0,0,0,114,151,0, + 0,0,114,2,0,0,0,90,10,98,121,116,101,115,95,100, + 97,116,97,90,11,99,111,100,101,95,111,98,106,101,99,116, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 213,0,0,0,88,3,0,0,115,152,0,0,0,0,7,10, + 1,4,1,4,1,4,1,4,1,4,1,2,1,12,1,12, + 1,12,2,2,1,14,1,12,1,8,2,12,1,2,1,14, + 1,12,1,6,3,2,1,2,254,6,4,2,1,12,1,16, + 1,12,1,6,1,12,1,12,1,2,255,2,2,8,254,4, + 3,10,1,4,1,2,1,2,254,4,4,8,1,2,255,6, + 3,2,1,2,1,2,1,6,1,2,1,2,251,8,7,18, + 1,6,2,8,1,2,255,4,2,6,1,2,1,2,254,6, + 3,10,1,10,1,12,1,12,1,18,1,6,255,4,2,6, + 1,10,1,10,1,14,2,6,1,6,255,4,2,2,1,18, + 1,14,1,6,1,122,21,83,111,117,114,99,101,76,111,97, + 100,101,114,46,103,101,116,95,99,111,100,101,78,41,10,114, + 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,223, + 0,0,0,114,224,0,0,0,114,226,0,0,0,114,225,0, + 0,0,114,229,0,0,0,114,233,0,0,0,114,213,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,221,0,0,0,29,3,0,0,115,14, + 0,0,0,8,2,8,8,8,14,8,10,8,7,8,10,14, + 8,114,221,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,115, + 124,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,101,7,135,0,102,1,100,8, + 100,9,132,8,131,1,90,8,101,7,100,10,100,11,132,0, + 131,1,90,9,100,12,100,13,132,0,90,10,101,7,100,14, + 100,15,132,0,131,1,90,11,100,16,100,17,132,0,90,12, + 100,18,100,19,132,0,90,13,100,20,100,21,132,0,90,14, + 100,22,100,23,132,0,90,15,135,0,4,0,90,16,83,0, + 41,24,218,10,70,105,108,101,76,111,97,100,101,114,122,103, + 66,97,115,101,32,102,105,108,101,32,108,111,97,100,101,114, + 32,99,108,97,115,115,32,119,104,105,99,104,32,105,109,112, + 108,101,109,101,110,116,115,32,116,104,101,32,108,111,97,100, + 101,114,32,112,114,111,116,111,99,111,108,32,109,101,116,104, + 111,100,115,32,116,104,97,116,10,32,32,32,32,114,101,113, + 117,105,114,101,32,102,105,108,101,32,115,121,115,116,101,109, + 32,117,115,97,103,101,46,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,1,83,0,41,2,122,75,67,97,99,104,101,32,116, + 104,101,32,109,111,100,117,108,101,32,110,97,109,101,32,97, + 110,100,32,116,104,101,32,112,97,116,104,32,116,111,32,116, + 104,101,32,102,105,108,101,32,102,111,117,110,100,32,98,121, + 32,116,104,101,10,32,32,32,32,32,32,32,32,102,105,110, + 100,101,114,46,78,114,159,0,0,0,41,3,114,118,0,0, + 0,114,139,0,0,0,114,44,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,178, + 3,0,0,115,4,0,0,0,0,3,6,1,122,19,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,109,0,0,0,169,2,218,9, + 95,95,99,108,97,115,115,95,95,114,131,0,0,0,169,2, + 114,118,0,0,0,90,5,111,116,104,101,114,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,6,95,95,101, + 113,95,95,184,3,0,0,115,6,0,0,0,0,1,12,1, + 10,255,122,17,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,109,0,0,0,169,3,218,4, + 104,97,115,104,114,116,0,0,0,114,44,0,0,0,169,1, + 114,118,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,8,95,95,104,97,115,104,95,95,188,3, + 0,0,115,2,0,0,0,0,1,122,19,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,2,0,0,0,3, + 0,0,0,3,0,0,0,115,16,0,0,0,116,0,116,1, + 124,0,131,2,160,2,124,1,161,1,83,0,41,1,122,100, + 76,111,97,100,32,97,32,109,111,100,117,108,101,32,102,114, + 111,109,32,97,32,102,105,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,41,3,218,5,115,117,112,101,114,114,239,0, + 0,0,114,220,0,0,0,114,219,0,0,0,169,1,114,241, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,220,0, + 0,0,191,3,0,0,115,2,0,0,0,0,10,122,22,70, + 105,108,101,76,111,97,100,101,114,46,108,111,97,100,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,6, + 0,0,0,124,0,106,0,83,0,169,1,122,58,82,101,116, + 117,114,110,32,116,104,101,32,112,97,116,104,32,116,111,32, + 116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,32, + 97,115,32,102,111,117,110,100,32,98,121,32,116,104,101,32, + 102,105,110,100,101,114,46,114,48,0,0,0,114,219,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,179,0,0,0,203,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,8,0,0,0,67,0, + 0,0,115,126,0,0,0,116,0,124,0,116,1,116,2,102, + 2,131,2,114,70,116,3,160,4,116,5,124,1,131,1,161, + 1,143,24,125,2,124,2,160,6,161,0,87,0,2,0,100, + 1,4,0,4,0,131,3,1,0,83,0,49,0,115,58,48, + 0,1,0,1,0,1,0,89,0,1,0,110,52,116,3,160, + 7,124,1,100,2,161,2,143,24,125,2,124,2,160,6,161, + 0,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, + 0,49,0,115,112,48,0,1,0,1,0,1,0,89,0,1, + 0,100,1,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, + 78,218,1,114,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,84,0,0,0,90,4,114,101,97,100, + 114,65,0,0,0,41,3,114,118,0,0,0,114,44,0,0, + 0,114,68,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,227,0,0,0,208,3,0,0,115,10, + 0,0,0,0,2,14,1,16,1,40,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,109,0,0,0,41,1,114,182,0,0,0,169,2, + 114,118,0,0,0,114,216,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,19,103,101,116,95,114, + 101,115,111,117,114,99,101,95,114,101,97,100,101,114,219,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,118,0,0,0,90,8,114,101,115,111, + 117,114,99,101,114,44,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,13,111,112,101,110,95,114, + 101,115,111,117,114,99,101,225,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,255,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 13,114,101,115,111,117,114,99,101,95,112,97,116,104,229,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,118,0,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,118,0,0,0,114,116,0,0,0,114, + 44,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,2,1,0,0,235,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,4,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,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,8,99,111,110,116,101,110,116,115,241,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,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,5,0,0,0, + 114,5,0,0,0,114,249,0,0,0,114,8,0,0,0,114, + 239,0,0,0,173,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,118,0,0,0,114,44,0,0,0,114,238,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 224,0,0,0,249,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,114,0,0,0,114,225,0,0,0,41,5,114,118, + 0,0,0,114,107,0,0,0,114,106,0,0,0,114,26,0, + 0,0,114,52,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,226,0,0,0,254,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,252,0, + 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,104, + 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,113,60,4,0,116,7, + 121,110,1,0,1,0,1,0,89,0,113,60,89,0,113,60, + 4,0,116,8,121,162,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, + 100,2,125,8,126,8,1,0,100,2,83,0,100,2,125,8, + 126,8,48,0,48,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,52,4,0,116,8,144,0,121,246,1,0, + 125,8,1,0,122,26,116,9,160,10,100,1,124,1,124,8, + 161,3,1,0,87,0,89,0,100,2,125,8,126,8,110,10, + 100,2,125,8,126,8,48,0,48,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,4,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,118,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,96,0,0,0,114,37,0,0,0,114,33,0, + 0,0,114,228,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,225,0,0,0,3,4,0,0,115, + 46,0,0,0,0,2,12,1,4,2,12,1,12,1,12,2, + 12,1,10,1,2,1,14,1,12,2,8,1,14,3,6,1, + 4,255,4,2,28,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,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,9,1,0,0,245,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,116,0,0,0,114,106,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, + 118,0,0,0,114,139,0,0,0,114,44,0,0,0,114,26, + 0,0,0,114,151,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,213,0,0,0,38,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,5,0,0,0,114,219,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,229,0,0,0,54,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,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,15,1,0,0,34,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,2,0,0,0,64,0,0,0,115,48,0,0,0,101,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,83,0,41,11, - 218,13,95,76,111,97,100,101,114,66,97,115,105,99,115,122, - 83,66,97,115,101,32,99,108,97,115,115,32,111,102,32,99, - 111,109,109,111,110,32,99,111,100,101,32,110,101,101,100,101, - 100,32,98,121,32,98,111,116,104,32,83,111,117,114,99,101, - 76,111,97,100,101,114,32,97,110,100,10,32,32,32,32,83, - 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97, - 100,101,114,46,99,2,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,4,0,0,0,67,0,0,0,115,64,0, - 0,0,116,0,124,0,160,1,124,1,161,1,131,1,100,1, - 25,0,125,2,124,2,160,2,100,2,100,1,161,2,100,3, - 25,0,125,3,124,1,160,3,100,2,161,1,100,4,25,0, - 125,4,124,3,100,5,107,2,111,62,124,4,100,5,107,3, - 83,0,41,6,122,141,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,73,110,115,112,101,99,116,76,111,97,100,101,114,46,105, - 115,95,112,97,99,107,97,103,101,32,98,121,32,99,104,101, - 99,107,105,110,103,32,105,102,10,32,32,32,32,32,32,32, - 32,116,104,101,32,112,97,116,104,32,114,101,116,117,114,110, - 101,100,32,98,121,32,103,101,116,95,102,105,108,101,110,97, - 109,101,32,104,97,115,32,97,32,102,105,108,101,110,97,109, - 101,32,111,102,32,39,95,95,105,110,105,116,95,95,46,112, - 121,39,46,114,39,0,0,0,114,71,0,0,0,114,73,0, - 0,0,114,28,0,0,0,218,8,95,95,105,110,105,116,95, - 95,41,4,114,47,0,0,0,114,180,0,0,0,114,43,0, - 0,0,114,41,0,0,0,41,5,114,119,0,0,0,114,140, - 0,0,0,114,97,0,0,0,90,13,102,105,108,101,110,97, - 109,101,95,98,97,115,101,90,9,116,97,105,108,95,110,97, - 109,101,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,183,0,0,0,254,2,0,0,115,8,0,0,0,0, - 3,18,1,16,1,14,1,122,24,95,76,111,97,100,101,114, - 66,97,115,105,99,115,46,105,115,95,112,97,99,107,97,103, + 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,109, + 0,0,0,114,159,0,0,0,114,5,1,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,209,0,0, + 0,71,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,109,0,0,0,114,240,0,0,0,114,242,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,243,0,0,0,75,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,109,0,0,0,114,244,0,0,0,114,246,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,247,0,0,0,79,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,116,0,0,0,114,44,0, + 0,0,41,3,114,118,0,0,0,114,187,0,0,0,114,216, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,114,212,0,0,0,82,4,0,0,115,14,0,0,0, + 0,2,4,1,6,255,4,2,6,1,8,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,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,169,2,122,42,85,115,101,32,100,101,102,97,117, - 108,116,32,115,101,109,97,110,116,105,99,115,32,102,111,114, - 32,109,111,100,117,108,101,32,99,114,101,97,116,105,111,110, - 46,78,114,3,0,0,0,169,2,114,119,0,0,0,114,188, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,13,99,114,101,97,116,101,95,109,111,100,117,108, - 101,6,3,0,0,115,2,0,0,0,0,1,122,27,95,76, - 111,97,100,101,114,66,97,115,105,99,115,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,3,0,0,0,5,0,0,0,67,0, - 0,0,115,56,0,0,0,124,0,160,0,124,1,106,1,161, - 1,125,2,124,2,100,1,107,8,114,36,116,2,100,2,160, - 3,124,1,106,1,161,1,131,1,130,1,116,4,160,5,116, - 6,124,2,124,1,106,7,161,3,1,0,100,1,83,0,41, - 3,122,19,69,120,101,99,117,116,101,32,116,104,101,32,109, - 111,100,117,108,101,46,78,122,52,99,97,110,110,111,116,32, - 108,111,97,100,32,109,111,100,117,108,101,32,123,33,114,125, - 32,119,104,101,110,32,103,101,116,95,99,111,100,101,40,41, - 32,114,101,116,117,114,110,115,32,78,111,110,101,41,8,218, - 8,103,101,116,95,99,111,100,101,114,126,0,0,0,114,118, - 0,0,0,114,62,0,0,0,114,135,0,0,0,218,25,95, - 99,97,108,108,95,119,105,116,104,95,102,114,97,109,101,115, - 95,114,101,109,111,118,101,100,218,4,101,120,101,99,114,132, - 0,0,0,41,3,114,119,0,0,0,218,6,109,111,100,117, - 108,101,114,165,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,11,101,120,101,99,95,109,111,100, - 117,108,101,9,3,0,0,115,12,0,0,0,0,2,12,1, - 8,1,6,1,4,255,6,2,122,25,95,76,111,97,100,101, - 114,66,97,115,105,99,115,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,12,0,0, - 0,116,0,160,1,124,0,124,1,161,2,83,0,41,1,122, - 26,84,104,105,115,32,109,111,100,117,108,101,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,41,2,114,135,0, - 0,0,218,17,95,108,111,97,100,95,109,111,100,117,108,101, - 95,115,104,105,109,169,2,114,119,0,0,0,114,140,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,11,108,111,97,100,95,109,111,100,117,108,101,17,3,0, - 0,115,2,0,0,0,0,2,122,25,95,76,111,97,100,101, - 114,66,97,115,105,99,115,46,108,111,97,100,95,109,111,100, - 117,108,101,78,41,8,114,126,0,0,0,114,125,0,0,0, - 114,127,0,0,0,114,128,0,0,0,114,183,0,0,0,114, - 213,0,0,0,114,218,0,0,0,114,221,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,209,0,0,0,249,2,0,0,115,10,0,0,0, - 8,2,4,3,8,8,8,3,8,8,114,209,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,74,0,0,0,101,0,90, - 1,100,0,90,2,100,1,100,2,132,0,90,3,100,3,100, - 4,132,0,90,4,100,5,100,6,132,0,90,5,100,7,100, - 8,132,0,90,6,100,9,100,10,132,0,90,7,100,11,100, - 12,156,1,100,13,100,14,132,2,90,8,100,15,100,16,132, - 0,90,9,100,17,83,0,41,18,218,12,83,111,117,114,99, - 101,76,111,97,100,101,114,99,2,0,0,0,0,0,0,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,116,0,0,0,114,44,0,0,0,114,253, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,114,217,0,0,0,90,4,0,0,115,8,0,0,0, + 0,2,14,1,6,1,8,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,5,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,5,0,0,0,114,8,0,0,0, + 218,9,60,103,101,110,101,120,112,114,62,99,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,5,0,0,0,114,18,1,0,0,114, + 8,0,0,0,114,182,0,0,0,96,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,5,0,0,0,114,219,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,213,0,0,0,102,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,8,0,0,0,116,0,130,1,100,1,83,0,41,2,122, - 165,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, - 32,116,104,97,116,32,114,101,116,117,114,110,115,32,116,104, - 101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,116, - 105,109,101,32,40,97,110,32,105,110,116,41,32,102,111,114, - 32,116,104,101,10,32,32,32,32,32,32,32,32,115,112,101, - 99,105,102,105,101,100,32,112,97,116,104,32,40,97,32,115, - 116,114,41,46,10,10,32,32,32,32,32,32,32,32,82,97, - 105,115,101,115,32,79,83,69,114,114,111,114,32,119,104,101, - 110,32,116,104,101,32,112,97,116,104,32,99,97,110,110,111, - 116,32,98,101,32,104,97,110,100,108,101,100,46,10,32,32, - 32,32,32,32,32,32,78,41,1,114,50,0,0,0,169,2, - 114,119,0,0,0,114,44,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,10,112,97,116,104,95, - 109,116,105,109,101,24,3,0,0,115,2,0,0,0,0,6, - 122,23,83,111,117,114,99,101,76,111,97,100,101,114,46,112, - 97,116,104,95,109,116,105,109,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,14,0,0,0,100,1,124,0,160,0,124,1,161, - 1,105,1,83,0,41,2,97,158,1,0,0,79,112,116,105, - 111,110,97,108,32,109,101,116,104,111,100,32,114,101,116,117, - 114,110,105,110,103,32,97,32,109,101,116,97,100,97,116,97, - 32,100,105,99,116,32,102,111,114,32,116,104,101,32,115,112, - 101,99,105,102,105,101,100,10,32,32,32,32,32,32,32,32, - 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, - 32,32,32,32,32,32,32,80,111,115,115,105,98,108,101,32, - 107,101,121,115,58,10,32,32,32,32,32,32,32,32,45,32, - 39,109,116,105,109,101,39,32,40,109,97,110,100,97,116,111, - 114,121,41,32,105,115,32,116,104,101,32,110,117,109,101,114, - 105,99,32,116,105,109,101,115,116,97,109,112,32,111,102,32, - 108,97,115,116,32,115,111,117,114,99,101,10,32,32,32,32, - 32,32,32,32,32,32,99,111,100,101,32,109,111,100,105,102, - 105,99,97,116,105,111,110,59,10,32,32,32,32,32,32,32, - 32,45,32,39,115,105,122,101,39,32,40,111,112,116,105,111, - 110,97,108,41,32,105,115,32,116,104,101,32,115,105,122,101, - 32,105,110,32,98,121,116,101,115,32,111,102,32,116,104,101, - 32,115,111,117,114,99,101,32,99,111,100,101,46,10,10,32, - 32,32,32,32,32,32,32,73,109,112,108,101,109,101,110,116, - 105,110,103,32,116,104,105,115,32,109,101,116,104,111,100,32, - 97,108,108,111,119,115,32,116,104,101,32,108,111,97,100,101, - 114,32,116,111,32,114,101,97,100,32,98,121,116,101,99,111, - 100,101,32,102,105,108,101,115,46,10,32,32,32,32,32,32, - 32,32,82,97,105,115,101,115,32,79,83,69,114,114,111,114, - 32,119,104,101,110,32,116,104,101,32,112,97,116,104,32,99, - 97,110,110,111,116,32,98,101,32,104,97,110,100,108,101,100, - 46,10,32,32,32,32,32,32,32,32,114,170,0,0,0,41, - 1,114,224,0,0,0,114,223,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,10,112,97,116,104, - 95,115,116,97,116,115,32,3,0,0,115,2,0,0,0,0, - 12,122,23,83,111,117,114,99,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,4,0,0,0,4,0,0,0,67, - 0,0,0,115,12,0,0,0,124,0,160,0,124,2,124,3, - 161,2,83,0,41,1,122,228,79,112,116,105,111,110,97,108, - 32,109,101,116,104,111,100,32,119,104,105,99,104,32,119,114, - 105,116,101,115,32,100,97,116,97,32,40,98,121,116,101,115, - 41,32,116,111,32,97,32,102,105,108,101,32,112,97,116,104, - 32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,32, - 32,32,32,73,109,112,108,101,109,101,110,116,105,110,103,32, - 116,104,105,115,32,109,101,116,104,111,100,32,97,108,108,111, - 119,115,32,102,111,114,32,116,104,101,32,119,114,105,116,105, - 110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,102, - 105,108,101,115,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,115,111,117,114,99,101,32,112,97,116,104,32,105, - 115,32,110,101,101,100,101,100,32,105,110,32,111,114,100,101, - 114,32,116,111,32,99,111,114,114,101,99,116,108,121,32,116, - 114,97,110,115,102,101,114,32,112,101,114,109,105,115,115,105, - 111,110,115,10,32,32,32,32,32,32,32,32,41,1,218,8, - 115,101,116,95,100,97,116,97,41,4,114,119,0,0,0,114, - 108,0,0,0,90,10,99,97,99,104,101,95,112,97,116,104, - 114,26,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,15,95,99,97,99,104,101,95,98,121,116, - 101,99,111,100,101,46,3,0,0,115,2,0,0,0,0,8, - 122,28,83,111,117,114,99,101,76,111,97,100,101,114,46,95, - 99,97,99,104,101,95,98,121,116,101,99,111,100,101,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, - 41,2,122,150,79,112,116,105,111,110,97,108,32,109,101,116, - 104,111,100,32,119,104,105,99,104,32,119,114,105,116,101,115, - 32,100,97,116,97,32,40,98,121,116,101,115,41,32,116,111, - 32,97,32,102,105,108,101,32,112,97,116,104,32,40,97,32, - 115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,73, - 109,112,108,101,109,101,110,116,105,110,103,32,116,104,105,115, - 32,109,101,116,104,111,100,32,97,108,108,111,119,115,32,102, - 111,114,32,116,104,101,32,119,114,105,116,105,110,103,32,111, - 102,32,98,121,116,101,99,111,100,101,32,102,105,108,101,115, - 46,10,32,32,32,32,32,32,32,32,78,114,3,0,0,0, - 41,3,114,119,0,0,0,114,44,0,0,0,114,26,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,226,0,0,0,56,3,0,0,115,2,0,0,0,0,1, - 122,21,83,111,117,114,99,101,76,111,97,100,101,114,46,115, - 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,10,0,0,0,67,0,0,0, - 115,82,0,0,0,124,0,160,0,124,1,161,1,125,2,122, - 14,124,0,160,1,124,2,161,1,125,3,87,0,110,48,4, - 0,116,2,107,10,114,72,1,0,125,4,1,0,122,18,116, - 3,100,1,124,1,100,2,141,2,124,4,130,2,87,0,53, - 0,100,3,125,4,126,4,88,0,89,0,110,2,88,0,116, - 4,124,3,131,1,83,0,41,4,122,52,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,73,110,115,112,101,99,116,76,111,97, - 100,101,114,46,103,101,116,95,115,111,117,114,99,101,46,122, - 39,115,111,117,114,99,101,32,110,111,116,32,97,118,97,105, - 108,97,98,108,101,32,116,104,114,111,117,103,104,32,103,101, - 116,95,100,97,116,97,40,41,114,116,0,0,0,78,41,5, - 114,180,0,0,0,218,8,103,101,116,95,100,97,116,97,114, - 50,0,0,0,114,118,0,0,0,114,177,0,0,0,41,5, - 114,119,0,0,0,114,140,0,0,0,114,44,0,0,0,114, - 175,0,0,0,218,3,101,120,99,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,10,103,101,116,95,115,111, - 117,114,99,101,63,3,0,0,115,20,0,0,0,0,2,10, - 1,2,1,14,1,16,1,4,1,2,255,4,1,2,255,20, - 2,122,23,83,111,117,114,99,101,76,111,97,100,101,114,46, - 103,101,116,95,115,111,117,114,99,101,114,105,0,0,0,41, - 1,218,9,95,111,112,116,105,109,105,122,101,99,3,0,0, - 0,0,0,0,0,1,0,0,0,4,0,0,0,8,0,0, - 0,67,0,0,0,115,22,0,0,0,116,0,106,1,116,2, - 124,1,124,2,100,1,100,2,124,3,100,3,141,6,83,0, - 41,4,122,130,82,101,116,117,114,110,32,116,104,101,32,99, - 111,100,101,32,111,98,106,101,99,116,32,99,111,109,112,105, - 108,101,100,32,102,114,111,109,32,115,111,117,114,99,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,101,32,39,100, - 97,116,97,39,32,97,114,103,117,109,101,110,116,32,99,97, - 110,32,98,101,32,97,110,121,32,111,98,106,101,99,116,32, - 116,121,112,101,32,116,104,97,116,32,99,111,109,112,105,108, - 101,40,41,32,115,117,112,112,111,114,116,115,46,10,32,32, - 32,32,32,32,32,32,114,216,0,0,0,84,41,2,218,12, - 100,111,110,116,95,105,110,104,101,114,105,116,114,84,0,0, - 0,41,3,114,135,0,0,0,114,215,0,0,0,218,7,99, - 111,109,112,105,108,101,41,4,114,119,0,0,0,114,26,0, - 0,0,114,44,0,0,0,114,231,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,14,115,111,117, - 114,99,101,95,116,111,95,99,111,100,101,73,3,0,0,115, - 8,0,0,0,0,5,12,1,2,0,2,255,122,27,83,111, - 117,114,99,101,76,111,97,100,101,114,46,115,111,117,114,99, - 101,95,116,111,95,99,111,100,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,15,0,0,0,9,0,0,0,67,0, - 0,0,115,34,2,0,0,124,0,160,0,124,1,161,1,125, - 2,100,1,125,3,100,1,125,4,100,1,125,5,100,2,125, - 6,100,3,125,7,122,12,116,1,124,2,131,1,125,8,87, - 0,110,26,4,0,116,2,107,10,114,68,1,0,1,0,1, - 0,100,1,125,8,89,0,144,1,110,48,88,0,122,14,124, - 0,160,3,124,2,161,1,125,9,87,0,110,22,4,0,116, - 4,107,10,114,106,1,0,1,0,1,0,89,0,144,1,110, - 10,88,0,116,5,124,9,100,4,25,0,131,1,125,3,122, - 14,124,0,160,6,124,8,161,1,125,10,87,0,110,20,4, - 0,116,4,107,10,114,154,1,0,1,0,1,0,89,0,110, - 218,88,0,124,1,124,8,100,5,156,2,125,11,122,148,116, - 7,124,10,124,1,124,11,131,3,125,12,116,8,124,10,131, - 1,100,6,100,1,133,2,25,0,125,13,124,12,100,7,64, - 0,100,8,107,3,125,6,124,6,144,1,114,36,124,12,100, - 9,64,0,100,8,107,3,125,7,116,9,106,10,100,10,107, - 3,144,1,114,56,124,7,115,254,116,9,106,10,100,11,107, - 2,144,1,114,56,124,0,160,6,124,2,161,1,125,4,116, - 9,160,11,116,12,124,4,161,2,125,5,116,13,124,10,124, - 5,124,1,124,11,131,4,1,0,110,20,116,14,124,10,124, - 3,124,9,100,12,25,0,124,1,124,11,131,5,1,0,87, - 0,110,26,4,0,116,15,116,16,102,2,107,10,144,1,114, - 84,1,0,1,0,1,0,89,0,110,32,88,0,116,17,160, - 18,100,13,124,8,124,2,161,3,1,0,116,19,124,13,124, - 1,124,8,124,2,100,14,141,4,83,0,124,4,100,1,107, - 8,144,1,114,136,124,0,160,6,124,2,161,1,125,4,124, - 0,160,20,124,4,124,2,161,2,125,14,116,17,160,18,100, - 15,124,2,161,2,1,0,116,21,106,22,144,2,115,30,124, - 8,100,1,107,9,144,2,114,30,124,3,100,1,107,9,144, - 2,114,30,124,6,144,1,114,228,124,5,100,1,107,8,144, - 1,114,214,116,9,160,11,124,4,161,1,125,5,116,23,124, - 14,124,5,124,7,131,3,125,10,110,16,116,24,124,14,124, - 3,116,25,124,4,131,1,131,3,125,10,122,18,124,0,160, - 26,124,2,124,8,124,10,161,3,1,0,87,0,110,22,4, - 0,116,2,107,10,144,2,114,28,1,0,1,0,1,0,89, - 0,110,2,88,0,124,14,83,0,41,16,122,190,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,73,110,115,112,101,99,116,76, - 111,97,100,101,114,46,103,101,116,95,99,111,100,101,46,10, - 10,32,32,32,32,32,32,32,32,82,101,97,100,105,110,103, - 32,111,102,32,98,121,116,101,99,111,100,101,32,114,101,113, - 117,105,114,101,115,32,112,97,116,104,95,115,116,97,116,115, - 32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116, - 101,100,46,32,84,111,32,119,114,105,116,101,10,32,32,32, - 32,32,32,32,32,98,121,116,101,99,111,100,101,44,32,115, - 101,116,95,100,97,116,97,32,109,117,115,116,32,97,108,115, - 111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100, - 46,10,10,32,32,32,32,32,32,32,32,78,70,84,114,170, - 0,0,0,114,160,0,0,0,114,146,0,0,0,114,39,0, - 0,0,114,73,0,0,0,114,28,0,0,0,90,5,110,101, - 118,101,114,90,6,97,108,119,97,121,115,218,4,115,105,122, - 101,122,13,123,125,32,109,97,116,99,104,101,115,32,123,125, - 41,3,114,117,0,0,0,114,107,0,0,0,114,108,0,0, - 0,122,19,99,111,100,101,32,111,98,106,101,99,116,32,102, - 114,111,109,32,123,125,41,27,114,180,0,0,0,114,98,0, - 0,0,114,82,0,0,0,114,225,0,0,0,114,50,0,0, - 0,114,17,0,0,0,114,228,0,0,0,114,153,0,0,0, - 218,10,109,101,109,111,114,121,118,105,101,119,114,164,0,0, - 0,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, - 115,101,100,95,112,121,99,115,114,158,0,0,0,218,17,95, - 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, - 114,159,0,0,0,114,157,0,0,0,114,118,0,0,0,114, - 151,0,0,0,114,135,0,0,0,114,150,0,0,0,114,166, - 0,0,0,114,234,0,0,0,114,8,0,0,0,218,19,100, - 111,110,116,95,119,114,105,116,101,95,98,121,116,101,99,111, - 100,101,114,172,0,0,0,114,171,0,0,0,114,22,0,0, - 0,114,227,0,0,0,41,15,114,119,0,0,0,114,140,0, - 0,0,114,108,0,0,0,114,155,0,0,0,114,175,0,0, - 0,114,158,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, - 114,107,0,0,0,218,2,115,116,114,26,0,0,0,114,152, - 0,0,0,114,83,0,0,0,90,10,98,121,116,101,115,95, - 100,97,116,97,90,11,99,111,100,101,95,111,98,106,101,99, - 116,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,214,0,0,0,81,3,0,0,115,152,0,0,0,0,7, - 10,1,4,1,4,1,4,1,4,1,4,1,2,1,12,1, - 14,1,12,2,2,1,14,1,14,1,8,2,12,1,2,1, - 14,1,14,1,6,3,2,1,2,254,6,4,2,1,12,1, - 16,1,12,1,6,1,12,1,12,1,2,255,2,2,8,254, - 4,3,10,1,4,1,2,1,2,254,4,4,8,1,2,255, - 6,3,2,1,2,1,2,1,6,1,2,1,2,251,8,7, - 20,1,6,2,8,1,2,255,4,2,6,1,2,1,2,254, - 6,3,10,1,10,1,12,1,12,1,18,1,6,255,4,2, - 6,1,10,1,10,1,14,2,6,1,6,255,4,2,2,1, - 18,1,16,1,6,1,122,21,83,111,117,114,99,101,76,111, - 97,100,101,114,46,103,101,116,95,99,111,100,101,78,41,10, - 114,126,0,0,0,114,125,0,0,0,114,127,0,0,0,114, - 224,0,0,0,114,225,0,0,0,114,227,0,0,0,114,226, - 0,0,0,114,230,0,0,0,114,234,0,0,0,114,214,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,222,0,0,0,22,3,0,0,115, - 14,0,0,0,8,2,8,8,8,14,8,10,8,7,8,10, - 14,8,114,222,0,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, - 115,124,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,101,7,135,0,102,1,100, - 8,100,9,132,8,131,1,90,8,101,7,100,10,100,11,132, - 0,131,1,90,9,100,12,100,13,132,0,90,10,101,7,100, - 14,100,15,132,0,131,1,90,11,100,16,100,17,132,0,90, - 12,100,18,100,19,132,0,90,13,100,20,100,21,132,0,90, - 14,100,22,100,23,132,0,90,15,135,0,4,0,90,16,83, - 0,41,24,218,10,70,105,108,101,76,111,97,100,101,114,122, - 103,66,97,115,101,32,102,105,108,101,32,108,111,97,100,101, - 114,32,99,108,97,115,115,32,119,104,105,99,104,32,105,109, - 112,108,101,109,101,110,116,115,32,116,104,101,32,108,111,97, - 100,101,114,32,112,114,111,116,111,99,111,108,32,109,101,116, - 104,111,100,115,32,116,104,97,116,10,32,32,32,32,114,101, - 113,117,105,114,101,32,102,105,108,101,32,115,121,115,116,101, - 109,32,117,115,97,103,101,46,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,1,83,0,41,2,122,75,67,97,99,104,101,32, - 116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,32, - 97,110,100,32,116,104,101,32,112,97,116,104,32,116,111,32, - 116,104,101,32,102,105,108,101,32,102,111,117,110,100,32,98, - 121,32,116,104,101,10,32,32,32,32,32,32,32,32,102,105, - 110,100,101,114,46,78,114,160,0,0,0,41,3,114,119,0, - 0,0,114,140,0,0,0,114,44,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,210,0,0,0, - 171,3,0,0,115,4,0,0,0,0,3,6,1,122,19,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,169,2,218, - 9,95,95,99,108,97,115,115,95,95,114,132,0,0,0,169, - 2,114,119,0,0,0,90,5,111,116,104,101,114,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,6,95,95, - 101,113,95,95,177,3,0,0,115,6,0,0,0,0,1,12, - 1,10,255,122,17,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,169,3,218, - 4,104,97,115,104,114,117,0,0,0,114,44,0,0,0,169, - 1,114,119,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,8,95,95,104,97,115,104,95,95,181, - 3,0,0,115,2,0,0,0,0,1,122,19,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,2,0,0,0, - 3,0,0,0,3,0,0,0,115,16,0,0,0,116,0,116, - 1,124,0,131,2,160,2,124,1,161,1,83,0,41,1,122, - 100,76,111,97,100,32,97,32,109,111,100,117,108,101,32,102, - 114,111,109,32,97,32,102,105,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,41,3,218,5,115,117,112,101,114,114,240, - 0,0,0,114,221,0,0,0,114,220,0,0,0,169,1,114, - 242,0,0,0,114,3,0,0,0,114,6,0,0,0,114,221, - 0,0,0,184,3,0,0,115,2,0,0,0,0,10,122,22, - 70,105,108,101,76,111,97,100,101,114,46,108,111,97,100,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, - 6,0,0,0,124,0,106,0,83,0,169,1,122,58,82,101, - 116,117,114,110,32,116,104,101,32,112,97,116,104,32,116,111, - 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, - 32,97,115,32,102,111,117,110,100,32,98,121,32,116,104,101, - 32,102,105,110,100,101,114,46,114,48,0,0,0,114,220,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,180,0,0,0,196,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,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, - 162,0,0,0,114,222,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,228, - 0,0,0,201,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,183,0,0,0,169,2,114,119,0,0,0,114,217, - 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,212,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,252,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, - 218,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,0,1,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,222,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,3,1,0, - 0,228,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,2,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,247,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,234,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,126,0,0,0,114,125,0,0,0,114, - 127,0,0,0,114,128,0,0,0,114,210,0,0,0,114,244, - 0,0,0,114,248,0,0,0,114,137,0,0,0,114,221,0, - 0,0,114,180,0,0,0,114,228,0,0,0,114,255,0,0, - 0,114,1,1,0,0,114,5,1,0,0,114,3,1,0,0, - 114,9,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,250, - 0,0,0,114,6,0,0,0,114,240,0,0,0,166,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,240,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,170,0,0,0,114,235,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,239,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,225,0,0,0,242,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,226,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, - 227,0,0,0,247,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,12,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,252,0,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,108,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,113,60,4,0,116,7,107,10,114,112,1,0,1, - 0,1,0,89,0,113,60,89,0,113,60,4,0,116,8,107, - 10,114,166,1,0,125,8,1,0,122,26,116,9,160,10,100, - 1,124,4,124,8,161,3,1,0,87,0,89,0,162,6,1, - 0,100,2,83,0,100,2,125,8,126,8,88,0,89,0,113, - 60,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,246,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,187, - 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, - 135,0,0,0,114,150,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, - 13,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,229,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 226,0,0,0,252,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,28, - 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,126,0,0,0, - 114,125,0,0,0,114,127,0,0,0,114,128,0,0,0,114, - 225,0,0,0,114,227,0,0,0,114,226,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,10,1,0,0,238,3,0,0,115,8,0,0,0, - 8,2,4,2,8,5,8,5,114,10,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,160,0,0,0,114,146,0,0, - 0,41,2,114,117,0,0,0,114,107,0,0,0,41,5,114, - 180,0,0,0,114,228,0,0,0,114,153,0,0,0,114,166, - 0,0,0,114,236,0,0,0,41,5,114,119,0,0,0,114, - 140,0,0,0,114,44,0,0,0,114,26,0,0,0,114,152, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,214,0,0,0,31,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,220,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,230,0,0, - 0,47,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,126,0,0,0,114,125,0,0,0,114,127,0,0,0,114, - 128,0,0,0,114,214,0,0,0,114,230,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,16,1,0,0,27,4,0,0,115,6,0,0,0, - 8,2,4,2,8,16,114,16,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,253,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,160, - 0,0,0,114,6,1,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,210,0,0,0,64,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,241,0,0,0,114,243,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,244,0,0,0, - 68,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, + 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,5,0,0,0,114,219,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,229,0,0, + 0,106,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, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,179, + 0,0,0,110,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,5,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,252,0, + 0,0,63,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,109,0,0,0, + 41,6,218,5,95,110,97,109,101,218,5,95,112,97,116,104, + 114,111,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,118,0,0,0,114, + 116,0,0,0,114,44,0,0,0,90,11,112,97,116,104,95, + 102,105,110,100,101,114,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,209,0,0,0,123,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,1,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,118,0,0,0,114,14,1, + 0,0,218,3,100,111,116,90,2,109,101,114,5,0,0,0, + 114,5,0,0,0,114,8,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,129,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,109,0,0,0,41,4,114,30,1, + 0,0,114,130,0,0,0,114,1,0,0,0,218,7,109,111, + 100,117,108,101,115,41,3,114,118,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,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 25,1,0,0,139,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,117,1,114,68,124,2,106,5, + 100,0,117,0,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,109,0,0,0,41,8,114,111,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,118,0,0,0,90,11,112,97,114,101,110,116,95,112, + 97,116,104,114,187,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,12,95,114,101,99,97,108,99, + 117,108,97,116,101,143,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,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,245,0,0,0,114,247,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,248,0,0,0, - 72,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, - 135,0,0,0,114,215,0,0,0,114,164,0,0,0,90,14, - 99,114,101,97,116,101,95,100,121,110,97,109,105,99,114,150, - 0,0,0,114,117,0,0,0,114,44,0,0,0,41,3,114, - 119,0,0,0,114,188,0,0,0,114,217,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,213,0, - 0,0,75,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,135,0,0,0,114,215,0,0,0,114,164,0,0,0, - 90,12,101,120,101,99,95,100,121,110,97,109,105,99,114,150, - 0,0,0,114,117,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,114,218,0,0,0,83,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,210,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,92,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,220,0,0,0,114,3,0,0,0,114,19,1,0,0, - 114,6,0,0,0,114,183,0,0,0,89,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,220,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,214,0,0,0,95, - 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,220,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,230,0, - 0,0,99,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,251,0,0,0,114,48,0,0,0,114,220,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 180,0,0,0,103,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,126,0,0,0,114,125,0,0,0,114,127, - 0,0,0,114,128,0,0,0,114,210,0,0,0,114,244,0, - 0,0,114,248,0,0,0,114,213,0,0,0,114,218,0,0, - 0,114,183,0,0,0,114,214,0,0,0,114,230,0,0,0, - 114,137,0,0,0,114,180,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,253, - 0,0,0,56,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,253,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,210,0,0,0,116,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,24,1, - 0,0,114,41,0,0,0,41,4,114,119,0,0,0,114,15, - 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,122,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,31, - 1,0,0,114,131,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,26,1,0,0,132,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,26,1, - 0,0,114,27,1,0,0,114,28,1,0,0,114,24,1,0, - 0,114,141,0,0,0,114,179,0,0,0,114,25,1,0,0, - 41,3,114,119,0,0,0,90,11,112,97,114,101,110,116,95, - 112,97,116,104,114,188,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,136,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,7,1, - 0,0,114,33,1,0,0,114,247,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,149,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,33,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,152,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,25,1,0,0,41,3,114,119,0,0,0,114, - 36,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,155,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,33,1,0,0,114,247,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,158,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,25,1,0,0,114,247,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,161,4,0,0,115,2,0,0,0,0,1,122, + 67,0,0,0,115,12,0,0,0,116,0,124,0,160,1,161, + 0,131,1,83,0,114,109,0,0,0,41,2,114,6,1,0, + 0,114,32,1,0,0,114,246,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,8,95,95,105,116, + 101,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,124,1,124,0,160,0,161,0,107,6, - 83,0,114,110,0,0,0,114,35,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,164,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,25,1,0,0,114,187,0,0,0,114,41,1, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,187,0,0,0,167,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,126,0,0,0, - 114,125,0,0,0,114,127,0,0,0,114,128,0,0,0,114, - 210,0,0,0,114,31,1,0,0,114,26,1,0,0,114,33, - 1,0,0,114,34,1,0,0,114,37,1,0,0,114,38,1, - 0,0,114,39,1,0,0,114,40,1,0,0,114,43,1,0, - 0,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,23,1,0,0,109, - 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,23,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,23, - 1,0,0,114,25,1,0,0,114,29,1,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,210,0,0, - 0,173,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, + 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,109,0,0,0,169,1,114,32,1,0,0,41,2, + 114,118,0,0,0,218,5,105,110,100,101,120,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,11,95,95,103, + 101,116,105,116,101,109,95,95,159,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,109,0,0,0, + 41,1,114,24,1,0,0,41,3,114,118,0,0,0,114,35, + 1,0,0,114,44,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,11,95,95,115,101,116,105,116, + 101,109,95,95,162,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,109,0,0,0,41,2,114,23,0,0, + 0,114,32,1,0,0,114,246,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,7,95,95,108,101, + 110,95,95,165,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,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,8,95,95,114,101,112, + 114,95,95,168,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,126,0,0,0,41, - 2,114,194,0,0,0,114,217,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,176,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,220,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 183,0,0,0,185,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,220,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 230,0,0,0,188,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,216,0,0, - 0,84,41,1,114,232,0,0,0,41,1,114,233,0,0,0, - 114,220,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,214,0,0,0,191,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, + 115,12,0,0,0,124,1,124,0,160,0,161,0,118,0,83, + 0,114,109,0,0,0,114,34,1,0,0,169,2,114,118,0, + 0,0,218,4,105,116,101,109,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,12,95,95,99,111,110,116,97, + 105,110,115,95,95,171,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,109,0,0,0, + 41,2,114,24,1,0,0,114,186,0,0,0,114,40,1,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,186,0,0,0,174,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,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,22,1,0,0,116,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,109,0,0,0,41,2,114,22,1, + 0,0,114,24,1,0,0,114,28,1,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,209,0,0,0, + 180,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,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,11,109,111,100,117,108, + 101,95,114,101,112,114,183,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,114,211,0,0,0,114,3,0,0,0,114,212,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 213,0,0,0,194,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,254,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 218,0,0,0,197,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,135,0,0,0,114,150,0,0,0,114, - 25,1,0,0,114,219,0,0,0,114,220,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,221,0, - 0,0,200,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,126,0,0,0,114,125,0,0,0,114,127, - 0,0,0,114,210,0,0,0,114,208,0,0,0,114,45,1, - 0,0,114,183,0,0,0,114,230,0,0,0,114,214,0,0, - 0,114,213,0,0,0,114,218,0,0,0,114,221,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,44,1,0,0,172,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,44,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,118,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,19,100,11,100,12,132,1,131,1,90, - 9,101,4,100,20,100,13,100,14,132,1,131,1,90,10,101, - 4,100,21,100,15,100,16,132,1,131,1,90,11,101,4,100, - 17,100,18,132,0,131,1,90,12,100,10,83,0,41,22,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,129,0,0,0,114,47,1,0, - 0,41,3,114,194,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,47,1,0,0,218,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,139,0,0,0,114,118,0,0,0,41, - 3,114,194,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,228,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,4,1,0, - 0,114,8,0,0,0,114,49,1,0,0,218,8,75,101,121, - 69,114,114,111,114,114,53,1,0,0,41,3,114,194,0,0, - 0,114,44,0,0,0,114,51,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, - 241,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,138,0,0,0,41,7,114,129,0,0,0,114, - 138,0,0,0,114,207,0,0,0,114,135,0,0,0,114,202, - 0,0,0,114,184,0,0,0,114,179,0,0,0,41,6,114, - 194,0,0,0,114,140,0,0,0,114,51,1,0,0,114,141, - 0,0,0,114,142,0,0,0,114,188,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,7,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, - 204,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,162,0,0,0, - 114,85,0,0,0,218,5,98,121,116,101,115,114,55,1,0, - 0,114,129,0,0,0,114,204,0,0,0,114,56,1,0,0, - 114,141,0,0,0,114,179,0,0,0,114,118,0,0,0,114, - 168,0,0,0,114,135,0,0,0,114,184,0,0,0,41,9, - 114,194,0,0,0,114,140,0,0,0,114,44,0,0,0,114, - 203,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,51,1,0,0, - 114,188,0,0,0,114,142,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,22,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,59,1,0,0, - 114,141,0,0,0,114,179,0,0,0,114,182,0,0,0,114, - 23,1,0,0,41,6,114,194,0,0,0,114,140,0,0,0, - 114,44,0,0,0,114,203,0,0,0,114,188,0,0,0,114, - 58,1,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,204,0,0,0,54,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,205,0,0, - 0,114,206,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,207,0,0,0,78,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,99,1,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,3,0,0,0,79,0,0,0,115,24,0,0, - 0,100,1,100,2,108,0,109,1,125,3,1,0,124,3,106, - 2,124,1,124,2,142,1,83,0,41,3,97,32,1,0,0, - 10,32,32,32,32,32,32,32,32,70,105,110,100,32,100,105, - 115,116,114,105,98,117,116,105,111,110,115,46,10,10,32,32, - 32,32,32,32,32,32,82,101,116,117,114,110,32,97,110,32, - 105,116,101,114,97,98,108,101,32,111,102,32,97,108,108,32, - 68,105,115,116,114,105,98,117,116,105,111,110,32,105,110,115, - 116,97,110,99,101,115,32,99,97,112,97,98,108,101,32,111, - 102,10,32,32,32,32,32,32,32,32,108,111,97,100,105,110, - 103,32,116,104,101,32,109,101,116,97,100,97,116,97,32,102, - 111,114,32,112,97,99,107,97,103,101,115,32,109,97,116,99, - 104,105,110,103,32,96,96,99,111,110,116,101,120,116,46,110, - 97,109,101,96,96,10,32,32,32,32,32,32,32,32,40,111, - 114,32,97,108,108,32,110,97,109,101,115,32,105,102,32,96, - 96,78,111,110,101,96,96,32,105,110,100,105,99,97,116,101, - 100,41,32,97,108,111,110,103,32,116,104,101,32,112,97,116, - 104,115,32,105,110,32,116,104,101,32,108,105,115,116,10,32, - 32,32,32,32,32,32,32,111,102,32,100,105,114,101,99,116, - 111,114,105,101,115,32,96,96,99,111,110,116,101,120,116,46, - 112,97,116,104,96,96,46,10,32,32,32,32,32,32,32,32, - 114,73,0,0,0,41,1,218,18,77,101,116,97,100,97,116, - 97,80,97,116,104,70,105,110,100,101,114,41,3,90,18,105, - 109,112,111,114,116,108,105,98,46,109,101,116,97,100,97,116, - 97,114,60,1,0,0,218,18,102,105,110,100,95,100,105,115, - 116,114,105,98,117,116,105,111,110,115,41,4,114,194,0,0, - 0,114,120,0,0,0,114,121,0,0,0,114,60,1,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 61,1,0,0,91,5,0,0,115,4,0,0,0,0,10,12, - 1,122,29,80,97,116,104,70,105,110,100,101,114,46,102,105, - 110,100,95,100,105,115,116,114,105,98,117,116,105,111,110,115, - 41,1,78,41,2,78,78,41,1,78,41,13,114,126,0,0, - 0,114,125,0,0,0,114,127,0,0,0,114,128,0,0,0, - 114,208,0,0,0,114,47,1,0,0,114,53,1,0,0,114, - 55,1,0,0,114,56,1,0,0,114,59,1,0,0,114,204, - 0,0,0,114,207,0,0,0,114,61,1,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,214,4,0,0,115,34,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,12,12,2, - 1,114,46,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,17,1,0,0,169,1,114, - 141,0,0,0,114,3,0,0,0,114,6,0,0,0,114,20, - 1,0,0,120,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,168,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,190,0,0,0,114,3,0,0,0,114,63,1,0, - 0,114,6,0,0,0,114,210,0,0,0,114,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,65,1,0, - 0,114,247,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,47,1,0,0,128,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, + 0,41,2,78,84,114,5,0,0,0,114,219,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,182, + 0,0,0,192,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,5,0,0,0,114,219,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,229, + 0,0,0,195,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,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,213,0,0,0,198,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,5,0,0,0,114,211,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,212, + 0,0,0,201,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,109,0,0,0,114,5,0,0,0,114,253,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,217, + 0,0,0,204,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,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,220,0,0, + 0,207,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, + 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,43,1,0,0,179,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,118,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,19,100,11,100,12,132,1,131,1,90,9, + 101,4,100,20,100,13,100,14,132,1,131,1,90,10,101,4, + 100,21,100,15,100,16,132,1,131,1,90,11,101,4,100,17, + 100,18,132,0,131,1,90,12,100,10,83,0,41,22,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,117,0,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,1,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,116,0,0,0,218,6,102,105, + 110,100,101,114,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,46,1,0,0,225,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,82,0,0,0,116,0,106,1,100,1,117,1,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,42,125,2,122,14,124, + 2,124,1,131,1,87,0,2,0,1,0,83,0,4,0,116, + 5,121,74,1,0,1,0,1,0,89,0,113,34,89,0,113, + 34,48,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,1,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,117,0,0,0,41,3,114,193, + 0,0,0,114,44,0,0,0,90,4,104,111,111,107,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,11,95, + 112,97,116,104,95,104,111,111,107,115,235,4,0,0,115,16, + 0,0,0,0,3,16,1,12,1,10,1,2,1,14,1,12, + 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,100,0,0,0,124,1,100,1,107,2,114, + 42,122,12,116,0,160,1,161,0,125,1,87,0,110,20,4, + 0,116,2,121,40,1,0,1,0,1,0,89,0,100,2,83, + 0,48,0,122,14,116,3,106,4,124,1,25,0,125,2,87, + 0,110,38,4,0,116,5,121,94,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,48,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,4,0,0,0, + 114,55,0,0,0,114,3,1,0,0,114,1,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,5,0,0,0,114,5,0,0,0,114,8, + 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,248,4,0,0,115,22,0, + 0,0,0,8,8,1,2,1,12,1,12,3,8,1,2,1, + 14,1,12,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,117,1,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,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,16,95,108,101,103,97,99,121,95,103, + 101,116,95,115,112,101,99,14,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,117,1,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,117,0,114,92,113,8,124,7,106,7,100,1, + 117,1,114,110,124,7,2,0,1,0,83,0,124,7,106,8, + 125,8,124,8,100,1,117,0,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,84,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,117,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,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,9,95,103,101,116,95,115,112,101,99,29,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,117,0,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,117,0,114,40,100,1,83,0,124,4,106,3,100,1, + 117,0,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,1,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,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,203,0,0, + 0,61,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,117,0,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,41,3,114,204,0,0,0,114,141,0,0, - 0,114,179,0,0,0,41,3,114,119,0,0,0,114,140,0, - 0,0,114,188,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,138,0,0,0,134,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, - 178,0,0,0,41,1,114,191,0,0,0,41,7,114,119,0, - 0,0,114,189,0,0,0,114,140,0,0,0,114,44,0,0, - 0,90,4,115,109,115,108,114,203,0,0,0,114,141,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,59,1,0,0,146,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,98,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,150,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,82,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,114,224,116, - 15,124,12,131,1,114,224,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,94,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,210,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,11,1,0,0,114,50,0,0,0,114,65, - 1,0,0,218,11,95,102,105,108,108,95,99,97,99,104,101, - 114,7,0,0,0,114,68,1,0,0,114,106,0,0,0,114, - 67,1,0,0,114,38,0,0,0,114,64,1,0,0,114,54, - 0,0,0,114,59,1,0,0,114,56,0,0,0,114,135,0, - 0,0,114,150,0,0,0,114,184,0,0,0,114,179,0,0, - 0,41,14,114,119,0,0,0,114,140,0,0,0,114,203,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,170,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,18,1,0,0,114,189,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,188,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,204,0,0,0,151, - 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,12,1,8,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, + 32,32,32,32,78,114,204,0,0,0,114,205,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,206, + 0,0,0,85,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,99,1,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, + 0,79,0,0,0,115,28,0,0,0,100,1,100,2,108,0, + 109,1,125,3,1,0,124,3,106,2,124,1,105,0,124,2, + 164,1,142,1,83,0,41,3,97,32,1,0,0,10,32,32, + 32,32,32,32,32,32,70,105,110,100,32,100,105,115,116,114, + 105,98,117,116,105,111,110,115,46,10,10,32,32,32,32,32, + 32,32,32,82,101,116,117,114,110,32,97,110,32,105,116,101, + 114,97,98,108,101,32,111,102,32,97,108,108,32,68,105,115, + 116,114,105,98,117,116,105,111,110,32,105,110,115,116,97,110, + 99,101,115,32,99,97,112,97,98,108,101,32,111,102,10,32, + 32,32,32,32,32,32,32,108,111,97,100,105,110,103,32,116, + 104,101,32,109,101,116,97,100,97,116,97,32,102,111,114,32, + 112,97,99,107,97,103,101,115,32,109,97,116,99,104,105,110, + 103,32,96,96,99,111,110,116,101,120,116,46,110,97,109,101, + 96,96,10,32,32,32,32,32,32,32,32,40,111,114,32,97, + 108,108,32,110,97,109,101,115,32,105,102,32,96,96,78,111, + 110,101,96,96,32,105,110,100,105,99,97,116,101,100,41,32, + 97,108,111,110,103,32,116,104,101,32,112,97,116,104,115,32, + 105,110,32,116,104,101,32,108,105,115,116,10,32,32,32,32, + 32,32,32,32,111,102,32,100,105,114,101,99,116,111,114,105, + 101,115,32,96,96,99,111,110,116,101,120,116,46,112,97,116, + 104,96,96,46,10,32,32,32,32,32,32,32,32,114,73,0, + 0,0,41,1,218,18,77,101,116,97,100,97,116,97,80,97, + 116,104,70,105,110,100,101,114,41,3,90,18,105,109,112,111, + 114,116,108,105,98,46,109,101,116,97,100,97,116,97,114,59, + 1,0,0,218,18,102,105,110,100,95,100,105,115,116,114,105, + 98,117,116,105,111,110,115,41,4,114,193,0,0,0,114,119, + 0,0,0,114,120,0,0,0,114,59,1,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,60,1,0, + 0,98,5,0,0,115,4,0,0,0,0,10,12,1,122,29, + 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, + 100,105,115,116,114,105,98,117,116,105,111,110,115,41,1,78, + 41,2,78,78,41,1,78,41,13,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,60,1,0,0,114,5,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,45, + 1,0,0,221,4,0,0,115,34,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,12,12,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,109,0,0,0, + 114,5,0,0,0,114,16,1,0,0,169,1,114,140,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,19,1,0,0, + 127,5,0,0,243,0,0,0,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,104,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,118,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,5,0,0,0,114,62,1,0,0,114,8,0,0,0,114, + 209,0,0,0,121,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,104,0, + 0,0,78,41,1,114,65,1,0,0,114,246,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,46, + 1,0,0,135,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,117,0,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,118,0,0,0,114,139,0,0,0,114,187,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 137,0,0,0,141,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,118,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,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,58,1,0,0,153,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, + 96,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,22, + 4,0,116,6,121,64,1,0,1,0,1,0,100,4,125,5, + 89,0,110,2,48,0,124,5,124,0,106,7,107,3,114,90, + 124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,9, + 131,0,114,112,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,118,0,114,216,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,148,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,148,116,17,124,8,131,1,125,3,124,0,106,14, + 68,0,93,82,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,118,0,114,222,116,15,124,12,131,1,114,222,124,0, + 160,16,124,10,124,1,124,12,100,8,124,2,161,5,2,0, + 1,0,83,0,113,222,124,3,144,1,114,92,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,104,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,4,0,0,0,114,55,0,0,0,114,10,1,0,0, + 114,50,0,0,0,114,65,1,0,0,218,11,95,102,105,108, + 108,95,99,97,99,104,101,114,9,0,0,0,114,68,1,0, + 0,114,105,0,0,0,114,67,1,0,0,114,38,0,0,0, + 114,64,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,118,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,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,203,0,0,0,158,5,0,0,115,72,0,0,0,0, + 5,4,1,14,1,2,1,24,1,12,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,12,1,8,1,10,1,4,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,188,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,28,4,0,116,4,116,5,116, + 6,102,3,121,56,1,0,1,0,1,0,103,0,125,2,89, + 0,110,2,48,0,116,7,106,8,160,9,100,1,161,1,115, + 82,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,134,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, + 92,124,3,124,0,95,11,116,7,106,8,160,9,116,16,161, + 1,114,184,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,5,0,0,0,41,1,114,105,0,0,0,41,2,114,32, + 0,0,0,90,2,102,110,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,9,60,115,101,116,99,111,109,112, + 62,235,5,0,0,114,63,1,0,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,4,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,1,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,66,1,0,0,114,67,1,0,0,114, + 100,0,0,0,114,62,0,0,0,114,105,0,0,0,218,3, + 97,100,100,114,12,0,0,0,114,68,1,0,0,41,9,114, + 118,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,116,0,0,0,114, + 29,1,0,0,114,17,1,0,0,90,8,110,101,119,95,110, + 97,109,101,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,114,70,1,0,0,206,5,0,0,115,34,0,0,0, + 0,2,6,1,2,1,22,1,18,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,36, + 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,103,1,136,1,162, + 1,82,0,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,117,0,0,0,114,48,0,0,0,169,2, + 114,193,0,0,0,114,69,1,0,0,114,5,0,0,0,114, + 8,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,247,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,5,0,0,0,41,3,114,193,0,0, + 0,114,69,1,0,0,114,76,1,0,0,114,5,0,0,0, + 114,75,1,0,0,114,8,0,0,0,218,9,112,97,116,104, + 95,104,111,111,107,237,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,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,39,1,0,0,255,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,70,1,0,0,114,207,0, + 0,0,114,77,1,0,0,114,39,1,0,0,114,5,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,61,1,0,0,112,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,61,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,144,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, + 18,4,0,116,5,121,138,1,0,1,0,1,0,89,0,110, + 2,48,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,62,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,116,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,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,14,95,102,105,120, + 95,117,112,95,109,111,100,117,108,101,5,6,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,12,2,114,82,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,101,0,0,0,114,15,1,0,0, + 114,88,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,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,184,0,0,0,28,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,10,0,0,0, + 9,0,0,0,67,0,0,0,115,132,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,100,2,103,1,102,2,100, + 3,100,4,100,2,103,2,102,2,102,2,125,2,124,2,68, + 0,93,108,92,2,125,3,125,4,116,5,100,5,100,6,132, + 0,124,4,68,0,131,1,131,1,115,82,74,0,130,1,124, + 4,100,7,25,0,125,5,124,3,116,1,106,3,118,0,114, + 116,116,1,106,3,124,3,25,0,125,6,1,0,113,170,113, + 52,122,20,116,0,160,6,124,3,161,1,125,6,87,0,1, + 0,113,170,87,0,113,52,4,0,116,7,121,158,1,0,1, + 0,1,0,89,0,113,52,89,0,113,52,48,0,113,52,116, + 7,100,8,131,1,130,1,116,8,124,1,100,9,124,6,131, + 3,1,0,116,8,124,1,100,10,124,5,131,3,1,0,116, + 8,124,1,100,11,100,12,160,9,124,4,161,1,131,3,1, + 0,116,8,124,1,100,13,100,14,100,15,132,0,124,4,68, + 0,131,1,131,3,1,0,103,0,100,16,162,1,125,7,124, + 3,100,3,107,2,144,1,114,6,124,7,160,10,100,17,161, + 1,1,0,124,7,68,0,93,52,125,8,124,8,116,1,106, + 3,118,1,144,1,114,38,116,0,160,6,124,8,161,1,125, + 9,110,10,116,1,106,3,124,8,25,0,125,9,116,8,124, + 1,124,8,124,9,131,3,1,0,144,1,113,10,116,8,124, + 1,100,18,116,11,131,0,131,3,1,0,116,12,160,13,116, + 2,160,14,161,0,161,1,1,0,124,3,100,3,107,2,144, + 1,114,128,116,15,160,10,100,19,161,1,1,0,100,20,116, + 12,118,0,144,1,114,128,100,21,116,16,95,17,100,22,83, + 0,41,23,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,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,23,0,0,0,41,2,114,32,0,0, + 0,114,94,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,19,1,0,0,57,6,0,0,114,63, + 1,0,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,4,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,5,0,0,0,41,2,114,32, + 0,0,0,218,1,115,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,71,1,0,0,74,6,0,0,114,63, + 1,0,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,41,3, + 114,64,0,0,0,114,75,0,0,0,114,160,0,0,0,114, + 192,0,0,0,114,9,0,0,0,122,4,46,112,121,119,122, + 6,95,100,46,112,121,100,84,78,41,18,114,134,0,0,0, + 114,1,0,0,0,114,163,0,0,0,114,31,1,0,0,114, + 125,0,0,0,218,3,97,108,108,90,18,95,98,117,105,108, + 116,105,110,95,102,114,111,109,95,110,97,109,101,114,117,0, + 0,0,114,129,0,0,0,114,36,0,0,0,114,186,0,0, + 0,114,14,0,0,0,114,21,1,0,0,114,167,0,0,0, + 114,83,1,0,0,114,101,0,0,0,114,191,0,0,0,114, + 195,0,0,0,41,10,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,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,98,117,105,108,116,105,110,95,110,97,109, + 101,115,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, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 6,95,115,101,116,117,112,39,6,0,0,115,70,0,0,0, + 0,8,4,1,6,1,6,2,10,3,22,1,12,2,22,1, + 8,1,10,1,10,1,6,2,2,1,10,1,10,1,12,1, + 12,2,8,2,12,1,12,1,18,1,22,3,8,1,10,1, + 10,1,8,1,12,1,12,2,10,1,16,3,14,1,14,1, + 10,1,10,1,10,1,114,89,1,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,228,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,8,1,0,0,114,55,0,0,0,114,4,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,66,1,0,0,114,67,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,68,1,0,0,41,9, - 114,119,0,0,0,114,44,0,0,0,114,9,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,42,1,0,0,114,117,0,0,0, - 114,30,1,0,0,114,18,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,70,1,0,0,199,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, - 194,0,0,0,114,69,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,240,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,194,0,0,0, - 114,69,1,0,0,114,76,1,0,0,114,3,0,0,0,114, - 75,1,0,0,114,6,0,0,0,218,9,112,97,116,104,95, - 104,111,111,107,230,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,247,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,40,1,0,0,248,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,126,0,0,0,114,125,0,0,0,114,127,0,0,0,114, - 128,0,0,0,114,210,0,0,0,114,47,1,0,0,114,144, - 0,0,0,114,207,0,0,0,114,138,0,0,0,114,59,1, - 0,0,114,204,0,0,0,114,70,1,0,0,114,208,0,0, - 0,114,77,1,0,0,114,40,1,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 62,1,0,0,105,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,62,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,63,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,141,0,0,0,114,16,1,0,0,114,10,1, - 0,0,114,191,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,141,0,0,0,114,188,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,254,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,82,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,253,0,0,0,114,164,0,0,0,218,18, - 101,120,116,101,110,115,105,111,110,95,115,117,102,102,105,120, - 101,115,114,10,1,0,0,114,102,0,0,0,114,16,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,185,0,0,0,21,6,0,0,115,8, - 0,0,0,0,5,12,1,8,1,8,1,114,185,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,161,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, - 20,1,0,0,57,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,71,1,0,0,73,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,193,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,135,0,0,0,114,8,0,0, - 0,114,164,0,0,0,114,32,1,0,0,114,126,0,0,0, - 90,18,95,98,117,105,108,116,105,110,95,102,114,111,109,95, - 110,97,109,101,114,130,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,22,1,0,0,114,168,0,0,0,114,83,1,0, - 0,114,102,0,0,0,114,187,0,0,0,114,192,0,0,0, - 114,196,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,32,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,90, - 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,90,1,0,0,114,185,0,0,0,114,8,0, - 0,0,114,52,1,0,0,114,168,0,0,0,114,62,1,0, - 0,114,77,1,0,0,218,9,109,101,116,97,95,112,97,116, - 104,114,187,0,0,0,114,46,1,0,0,41,2,114,89,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,97,6, - 0,0,115,8,0,0,0,0,2,8,1,6,1,20,1,114, - 92,1,0,0,41,1,114,60,0,0,0,41,1,78,41,3, - 78,78,78,41,2,114,73,0,0,0,114,73,0,0,0,41, - 1,84,41,1,78,41,1,78,41,63,114,128,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,163,0,0, - 0,114,18,0,0,0,114,149,0,0,0,114,17,0,0,0, - 114,24,0,0,0,114,237,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,137,0, - 0,0,114,144,0,0,0,114,153,0,0,0,114,157,0,0, - 0,114,159,0,0,0,114,166,0,0,0,114,171,0,0,0, - 114,172,0,0,0,114,177,0,0,0,218,6,111,98,106,101, - 99,116,114,186,0,0,0,114,191,0,0,0,114,192,0,0, - 0,114,209,0,0,0,114,222,0,0,0,114,240,0,0,0, - 114,10,1,0,0,114,16,1,0,0,114,22,1,0,0,114, - 253,0,0,0,114,23,1,0,0,114,44,1,0,0,114,46, - 1,0,0,114,62,1,0,0,114,82,1,0,0,114,185,0, - 0,0,114,90,1,0,0,114,92,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,10,22,10,127,0,13,16,1,12,2,4, - 1,4,2,6,2,6,2,8,2,16,71,8,40,8,19,8, - 12,8,12,8,28,8,17,8,33,8,28,8,24,10,13,10, - 10,10,11,8,14,6,3,4,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,20,14,127,0,22,10,23,8,11,8, - 65, + 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,89,1,0,0, + 114,184,0,0,0,114,1,0,0,0,114,51,1,0,0,114, + 167,0,0,0,114,61,1,0,0,114,77,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,88,1,0,0,90,17,115,117,112,112, + 111,114,116,101,100,95,108,111,97,100,101,114,115,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,8,95,105, + 110,115,116,97,108,108,96,6,0,0,115,8,0,0,0,0, + 2,8,1,6,1,20,1,114,91,1,0,0,41,1,114,60, + 0,0,0,41,1,78,41,3,78,78,78,41,2,114,73,0, + 0,0,114,73,0,0,0,41,1,84,41,1,78,41,1,78, + 41,63,114,127,0,0,0,114,13,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,12,0,0,0,114,14,0,0,0,114,21,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,19,0,0,0,114,148, + 0,0,0,114,18,0,0,0,114,24,0,0,0,114,236,0, + 0,0,114,91,0,0,0,114,87,0,0,0,114,101,0,0, + 0,114,88,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,97,0,0, + 0,114,102,0,0,0,114,108,0,0,0,114,112,0,0,0, + 114,114,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,61,1,0,0, + 114,82,1,0,0,114,184,0,0,0,114,89,1,0,0,114, + 91,1,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,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,10,22,10, + 127,0,20,16,1,12,2,4,1,4,2,6,2,6,2,8, + 2,16,71,8,40,8,19,8,12,8,12,8,28,8,17,8, + 33,8,28,8,24,10,13,10,10,10,11,8,14,6,3,4, + 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,20,14, + 127,0,22,10,23,8,11,8,57, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index f013b414..373b1366 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -117,965 +117,963 @@ const unsigned char _Py_M__zipimport[] = { 111,102,32,116,104,101,10,32,32,32,32,122,105,112,102,105, 108,101,32,116,97,114,103,101,116,101,100,46,10,32,32,32, 32,99,2,0,0,0,0,0,0,0,0,0,0,0,8,0, - 0,0,9,0,0,0,67,0,0,0,115,36,1,0,0,116, + 0,0,9,0,0,0,67,0,0,0,115,32,1,0,0,116, 0,124,1,116,1,131,2,115,28,100,1,100,0,108,2,125, 2,124,2,160,3,124,1,161,1,125,1,124,1,115,44,116, 4,100,2,124,1,100,3,141,2,130,1,116,5,114,60,124, 1,160,6,116,5,116,7,161,2,125,1,103,0,125,3,122, - 14,116,8,160,9,124,1,161,1,125,4,87,0,110,72,4, - 0,116,10,116,11,102,2,107,10,114,150,1,0,1,0,1, - 0,116,8,160,12,124,1,161,1,92,2,125,5,125,6,124, - 5,124,1,107,2,114,132,116,4,100,4,124,1,100,3,141, - 2,130,1,124,5,125,1,124,3,160,13,124,6,161,1,1, - 0,89,0,113,64,88,0,124,4,106,14,100,5,64,0,100, - 6,107,3,114,182,116,4,100,4,124,1,100,3,141,2,130, - 1,113,182,113,64,122,12,116,15,124,1,25,0,125,7,87, - 0,110,36,4,0,116,16,107,10,114,230,1,0,1,0,1, - 0,116,17,124,1,131,1,125,7,124,7,116,15,124,1,60, - 0,89,0,110,2,88,0,124,7,124,0,95,18,124,1,124, - 0,95,19,116,8,106,20,124,3,100,0,100,0,100,7,133, - 3,25,0,142,0,124,0,95,21,124,0,106,21,144,1,114, - 32,124,0,4,0,106,21,116,7,55,0,2,0,95,21,100, - 0,83,0,41,8,78,114,0,0,0,0,122,21,97,114,99, - 104,105,118,101,32,112,97,116,104,32,105,115,32,101,109,112, - 116,121,169,1,218,4,112,97,116,104,122,14,110,111,116,32, - 97,32,90,105,112,32,102,105,108,101,105,0,240,0,0,105, - 0,128,0,0,233,255,255,255,255,41,22,218,10,105,115,105, - 110,115,116,97,110,99,101,218,3,115,116,114,218,2,111,115, - 90,8,102,115,100,101,99,111,100,101,114,3,0,0,0,218, - 12,97,108,116,95,112,97,116,104,95,115,101,112,218,7,114, - 101,112,108,97,99,101,218,8,112,97,116,104,95,115,101,112, - 218,19,95,98,111,111,116,115,116,114,97,112,95,101,120,116, - 101,114,110,97,108,90,10,95,112,97,116,104,95,115,116,97, - 116,218,7,79,83,69,114,114,111,114,218,10,86,97,108,117, - 101,69,114,114,111,114,90,11,95,112,97,116,104,95,115,112, - 108,105,116,218,6,97,112,112,101,110,100,90,7,115,116,95, - 109,111,100,101,218,20,95,122,105,112,95,100,105,114,101,99, - 116,111,114,121,95,99,97,99,104,101,218,8,75,101,121,69, - 114,114,111,114,218,15,95,114,101,97,100,95,100,105,114,101, - 99,116,111,114,121,218,6,95,102,105,108,101,115,218,7,97, - 114,99,104,105,118,101,218,10,95,112,97,116,104,95,106,111, - 105,110,218,6,112,114,101,102,105,120,41,8,218,4,115,101, - 108,102,114,13,0,0,0,114,17,0,0,0,114,31,0,0, - 0,90,2,115,116,90,7,100,105,114,110,97,109,101,90,8, - 98,97,115,101,110,97,109,101,218,5,102,105,108,101,115,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, - 95,95,105,110,105,116,95,95,63,0,0,0,115,58,0,0, - 0,0,1,10,1,8,1,10,1,4,1,12,1,4,1,12, - 2,4,2,2,1,14,1,18,3,14,1,8,1,12,1,4, - 1,16,3,14,2,12,1,4,2,2,1,12,1,14,1,8, - 1,14,1,6,1,6,2,22,1,8,1,122,20,122,105,112, - 105,109,112,111,114,116,101,114,46,95,95,105,110,105,116,95, - 95,78,99,3,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,4,0,0,0,67,0,0,0,115,78,0,0,0, - 116,0,124,0,124,1,131,2,125,3,124,3,100,1,107,9, - 114,26,124,0,103,0,102,2,83,0,116,1,124,0,124,1, - 131,2,125,4,116,2,124,0,124,4,131,2,114,70,100,1, - 124,0,106,3,155,0,116,4,155,0,124,4,155,0,157,3, - 103,1,102,2,83,0,100,1,103,0,102,2,83,0,41,2, - 97,239,1,0,0,102,105,110,100,95,108,111,97,100,101,114, - 40,102,117,108,108,110,97,109,101,44,32,112,97,116,104,61, - 78,111,110,101,41,32,45,62,32,115,101,108,102,44,32,115, - 116,114,32,111,114,32,78,111,110,101,46,10,10,32,32,32, - 32,32,32,32,32,83,101,97,114,99,104,32,102,111,114,32, - 97,32,109,111,100,117,108,101,32,115,112,101,99,105,102,105, - 101,100,32,98,121,32,39,102,117,108,108,110,97,109,101,39, - 46,32,39,102,117,108,108,110,97,109,101,39,32,109,117,115, - 116,32,98,101,32,116,104,101,10,32,32,32,32,32,32,32, - 32,102,117,108,108,121,32,113,117,97,108,105,102,105,101,100, - 32,40,100,111,116,116,101,100,41,32,109,111,100,117,108,101, - 32,110,97,109,101,46,32,73,116,32,114,101,116,117,114,110, - 115,32,116,104,101,32,122,105,112,105,109,112,111,114,116,101, - 114,10,32,32,32,32,32,32,32,32,105,110,115,116,97,110, - 99,101,32,105,116,115,101,108,102,32,105,102,32,116,104,101, - 32,109,111,100,117,108,101,32,119,97,115,32,102,111,117,110, - 100,44,32,97,32,115,116,114,105,110,103,32,99,111,110,116, - 97,105,110,105,110,103,32,116,104,101,10,32,32,32,32,32, - 32,32,32,102,117,108,108,32,112,97,116,104,32,110,97,109, - 101,32,105,102,32,105,116,39,115,32,112,111,115,115,105,98, - 108,121,32,97,32,112,111,114,116,105,111,110,32,111,102,32, - 97,32,110,97,109,101,115,112,97,99,101,32,112,97,99,107, - 97,103,101,44,10,32,32,32,32,32,32,32,32,111,114,32, - 78,111,110,101,32,111,116,104,101,114,119,105,115,101,46,32, - 84,104,101,32,111,112,116,105,111,110,97,108,32,39,112,97, - 116,104,39,32,97,114,103,117,109,101,110,116,32,105,115,32, - 105,103,110,111,114,101,100,32,45,45,32,105,116,39,115,10, - 32,32,32,32,32,32,32,32,116,104,101,114,101,32,102,111, - 114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32, - 119,105,116,104,32,116,104,101,32,105,109,112,111,114,116,101, - 114,32,112,114,111,116,111,99,111,108,46,10,32,32,32,32, - 32,32,32,32,78,41,5,218,16,95,103,101,116,95,109,111, - 100,117,108,101,95,105,110,102,111,218,16,95,103,101,116,95, - 109,111,100,117,108,101,95,112,97,116,104,218,7,95,105,115, - 95,100,105,114,114,29,0,0,0,114,20,0,0,0,41,5, - 114,32,0,0,0,218,8,102,117,108,108,110,97,109,101,114, - 13,0,0,0,218,2,109,105,218,7,109,111,100,112,97,116, - 104,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,11,102,105,110,100,95,108,111,97,100,101,114,109,0,0, - 0,115,14,0,0,0,0,10,10,1,8,2,8,7,10,1, - 10,4,24,2,122,23,122,105,112,105,109,112,111,114,116,101, - 114,46,102,105,110,100,95,108,111,97,100,101,114,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,67,0,0,0,115,16,0,0,0,124,0,160,0,124, - 1,124,2,161,2,100,1,25,0,83,0,41,2,97,139,1, - 0,0,102,105,110,100,95,109,111,100,117,108,101,40,102,117, - 108,108,110,97,109,101,44,32,112,97,116,104,61,78,111,110, - 101,41,32,45,62,32,115,101,108,102,32,111,114,32,78,111, - 110,101,46,10,10,32,32,32,32,32,32,32,32,83,101,97, - 114,99,104,32,102,111,114,32,97,32,109,111,100,117,108,101, - 32,115,112,101,99,105,102,105,101,100,32,98,121,32,39,102, - 117,108,108,110,97,109,101,39,46,32,39,102,117,108,108,110, - 97,109,101,39,32,109,117,115,116,32,98,101,32,116,104,101, - 10,32,32,32,32,32,32,32,32,102,117,108,108,121,32,113, - 117,97,108,105,102,105,101,100,32,40,100,111,116,116,101,100, - 41,32,109,111,100,117,108,101,32,110,97,109,101,46,32,73, - 116,32,114,101,116,117,114,110,115,32,116,104,101,32,122,105, - 112,105,109,112,111,114,116,101,114,10,32,32,32,32,32,32, - 32,32,105,110,115,116,97,110,99,101,32,105,116,115,101,108, - 102,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32, - 119,97,115,32,102,111,117,110,100,44,32,111,114,32,78,111, - 110,101,32,105,102,32,105,116,32,119,97,115,110,39,116,46, - 10,32,32,32,32,32,32,32,32,84,104,101,32,111,112,116, - 105,111,110,97,108,32,39,112,97,116,104,39,32,97,114,103, - 117,109,101,110,116,32,105,115,32,105,103,110,111,114,101,100, - 32,45,45,32,105,116,39,115,32,116,104,101,114,101,32,102, - 111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121, - 10,32,32,32,32,32,32,32,32,119,105,116,104,32,116,104, - 101,32,105,109,112,111,114,116,101,114,32,112,114,111,116,111, - 99,111,108,46,10,32,32,32,32,32,32,32,32,114,0,0, - 0,0,41,1,114,41,0,0,0,41,3,114,32,0,0,0, - 114,38,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,102,105,110,100,95, - 109,111,100,117,108,101,141,0,0,0,115,2,0,0,0,0, - 9,122,23,122,105,112,105,109,112,111,114,116,101,114,46,102, - 105,110,100,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,67, - 0,0,0,115,20,0,0,0,116,0,124,0,124,1,131,2, - 92,3,125,2,125,3,125,4,124,2,83,0,41,1,122,163, - 103,101,116,95,99,111,100,101,40,102,117,108,108,110,97,109, - 101,41,32,45,62,32,99,111,100,101,32,111,98,106,101,99, - 116,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, - 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101, - 99,116,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,32,82,97,105, - 115,101,32,90,105,112,73,109,112,111,114,116,69,114,114,111, - 114,10,32,32,32,32,32,32,32,32,105,102,32,116,104,101, - 32,109,111,100,117,108,101,32,99,111,117,108,100,110,39,116, - 32,98,101,32,102,111,117,110,100,46,10,32,32,32,32,32, - 32,32,32,169,1,218,16,95,103,101,116,95,109,111,100,117, - 108,101,95,99,111,100,101,169,5,114,32,0,0,0,114,38, - 0,0,0,218,4,99,111,100,101,218,9,105,115,112,97,99, - 107,97,103,101,114,40,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,8,103,101,116,95,99,111, - 100,101,153,0,0,0,115,4,0,0,0,0,6,16,1,122, - 20,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, - 95,99,111,100,101,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,118, - 0,0,0,116,0,114,16,124,1,160,1,116,0,116,2,161, - 2,125,1,124,1,125,2,124,1,160,3,124,0,106,4,116, - 2,23,0,161,1,114,58,124,1,116,5,124,0,106,4,116, - 2,23,0,131,1,100,1,133,2,25,0,125,2,122,14,124, - 0,106,6,124,2,25,0,125,3,87,0,110,32,4,0,116, - 7,107,10,114,104,1,0,1,0,1,0,116,8,100,2,100, - 3,124,2,131,3,130,1,89,0,110,2,88,0,116,9,124, - 0,106,4,124,3,131,2,83,0,41,4,122,154,103,101,116, - 95,100,97,116,97,40,112,97,116,104,110,97,109,101,41,32, - 45,62,32,115,116,114,105,110,103,32,119,105,116,104,32,102, - 105,108,101,32,100,97,116,97,46,10,10,32,32,32,32,32, - 32,32,32,82,101,116,117,114,110,32,116,104,101,32,100,97, - 116,97,32,97,115,115,111,99,105,97,116,101,100,32,119,105, - 116,104,32,39,112,97,116,104,110,97,109,101,39,46,32,82, - 97,105,115,101,32,79,83,69,114,114,111,114,32,105,102,10, - 32,32,32,32,32,32,32,32,116,104,101,32,102,105,108,101, - 32,119,97,115,110,39,116,32,102,111,117,110,100,46,10,32, - 32,32,32,32,32,32,32,78,114,0,0,0,0,218,0,41, - 10,114,18,0,0,0,114,19,0,0,0,114,20,0,0,0, - 218,10,115,116,97,114,116,115,119,105,116,104,114,29,0,0, - 0,218,3,108,101,110,114,28,0,0,0,114,26,0,0,0, - 114,22,0,0,0,218,9,95,103,101,116,95,100,97,116,97, - 41,4,114,32,0,0,0,218,8,112,97,116,104,110,97,109, - 101,90,3,107,101,121,218,9,116,111,99,95,101,110,116,114, - 121,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,8,103,101,116,95,100,97,116,97,163,0,0,0,115,20, - 0,0,0,0,6,4,1,12,2,4,1,16,1,22,2,2, - 1,14,1,14,1,18,1,122,20,122,105,112,105,109,112,111, - 114,116,101,114,46,103,101,116,95,100,97,116,97,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,0, - 0,0,67,0,0,0,115,20,0,0,0,116,0,124,0,124, - 1,131,2,92,3,125,2,125,3,125,4,124,4,83,0,41, - 1,122,106,103,101,116,95,102,105,108,101,110,97,109,101,40, - 102,117,108,108,110,97,109,101,41,32,45,62,32,102,105,108, - 101,110,97,109,101,32,115,116,114,105,110,103,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,32,116,104, - 101,32,102,105,108,101,110,97,109,101,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,32,32,32,32,32,32,32,32,114,43,0, - 0,0,114,45,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,12,103,101,116,95,102,105,108,101, - 110,97,109,101,184,0,0,0,115,4,0,0,0,0,7,16, - 1,122,24,122,105,112,105,109,112,111,114,116,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,6,0,0,0,8,0,0,0, - 67,0,0,0,115,128,0,0,0,116,0,124,0,124,1,131, - 2,125,2,124,2,100,1,107,8,114,36,116,1,100,2,124, - 1,155,2,157,2,124,1,100,3,141,2,130,1,116,2,124, - 0,124,1,131,2,125,3,124,2,114,64,116,3,160,4,124, - 3,100,4,161,2,125,4,110,10,124,3,155,0,100,5,157, - 2,125,4,122,14,124,0,106,5,124,4,25,0,125,5,87, - 0,110,22,4,0,116,6,107,10,114,110,1,0,1,0,1, - 0,89,0,100,1,83,0,88,0,116,7,124,0,106,8,124, - 5,131,2,160,9,161,0,83,0,41,6,122,253,103,101,116, - 95,115,111,117,114,99,101,40,102,117,108,108,110,97,109,101, - 41,32,45,62,32,115,111,117,114,99,101,32,115,116,114,105, - 110,103,46,10,10,32,32,32,32,32,32,32,32,82,101,116, - 117,114,110,32,116,104,101,32,115,111,117,114,99,101,32,99, - 111,100,101,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,32,82,97, - 105,115,101,32,90,105,112,73,109,112,111,114,116,69,114,114, - 111,114,10,32,32,32,32,32,32,32,32,105,102,32,116,104, - 101,32,109,111,100,117,108,101,32,99,111,117,108,100,110,39, - 116,32,98,101,32,102,111,117,110,100,44,32,114,101,116,117, - 114,110,32,78,111,110,101,32,105,102,32,116,104,101,32,97, - 114,99,104,105,118,101,32,100,111,101,115,10,32,32,32,32, - 32,32,32,32,99,111,110,116,97,105,110,32,116,104,101,32, - 109,111,100,117,108,101,44,32,98,117,116,32,104,97,115,32, - 110,111,32,115,111,117,114,99,101,32,102,111,114,32,105,116, - 46,10,32,32,32,32,32,32,32,32,78,250,18,99,97,110, - 39,116,32,102,105,110,100,32,109,111,100,117,108,101,32,169, - 1,218,4,110,97,109,101,250,11,95,95,105,110,105,116,95, - 95,46,112,121,250,3,46,112,121,41,10,114,35,0,0,0, - 114,3,0,0,0,114,36,0,0,0,114,21,0,0,0,114, - 30,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52, - 0,0,0,114,29,0,0,0,218,6,100,101,99,111,100,101, - 41,6,114,32,0,0,0,114,38,0,0,0,114,39,0,0, - 0,114,13,0,0,0,218,8,102,117,108,108,112,97,116,104, - 114,54,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,218,10,103,101,116,95,115,111,117,114,99,101, - 195,0,0,0,115,24,0,0,0,0,7,10,1,8,1,18, - 2,10,1,4,1,14,2,10,2,2,1,14,1,14,2,8, - 1,122,22,122,105,112,105,109,112,111,114,116,101,114,46,103, - 101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,0, + 14,116,8,160,9,124,1,161,1,125,4,87,0,110,70,4, + 0,116,10,116,11,102,2,121,148,1,0,1,0,1,0,116, + 8,160,12,124,1,161,1,92,2,125,5,125,6,124,5,124, + 1,107,2,114,130,116,4,100,4,124,1,100,3,141,2,130, + 1,124,5,125,1,124,3,160,13,124,6,161,1,1,0,89, + 0,113,64,48,0,124,4,106,14,100,5,64,0,100,6,107, + 3,114,180,116,4,100,4,124,1,100,3,141,2,130,1,113, + 180,113,64,122,12,116,15,124,1,25,0,125,7,87,0,110, + 34,4,0,116,16,121,226,1,0,1,0,1,0,116,17,124, + 1,131,1,125,7,124,7,116,15,124,1,60,0,89,0,110, + 2,48,0,124,7,124,0,95,18,124,1,124,0,95,19,116, + 8,106,20,124,3,100,0,100,0,100,7,133,3,25,0,142, + 0,124,0,95,21,124,0,106,21,144,1,114,28,124,0,4, + 0,106,21,116,7,55,0,2,0,95,21,100,0,83,0,41, + 8,78,114,0,0,0,0,122,21,97,114,99,104,105,118,101, + 32,112,97,116,104,32,105,115,32,101,109,112,116,121,169,1, + 218,4,112,97,116,104,122,14,110,111,116,32,97,32,90,105, + 112,32,102,105,108,101,105,0,240,0,0,105,0,128,0,0, + 233,255,255,255,255,41,22,218,10,105,115,105,110,115,116,97, + 110,99,101,218,3,115,116,114,218,2,111,115,90,8,102,115, + 100,101,99,111,100,101,114,3,0,0,0,218,12,97,108,116, + 95,112,97,116,104,95,115,101,112,218,7,114,101,112,108,97, + 99,101,218,8,112,97,116,104,95,115,101,112,218,19,95,98, + 111,111,116,115,116,114,97,112,95,101,120,116,101,114,110,97, + 108,90,10,95,112,97,116,104,95,115,116,97,116,218,7,79, + 83,69,114,114,111,114,218,10,86,97,108,117,101,69,114,114, + 111,114,90,11,95,112,97,116,104,95,115,112,108,105,116,218, + 6,97,112,112,101,110,100,90,7,115,116,95,109,111,100,101, + 218,20,95,122,105,112,95,100,105,114,101,99,116,111,114,121, + 95,99,97,99,104,101,218,8,75,101,121,69,114,114,111,114, + 218,15,95,114,101,97,100,95,100,105,114,101,99,116,111,114, + 121,218,6,95,102,105,108,101,115,218,7,97,114,99,104,105, + 118,101,218,10,95,112,97,116,104,95,106,111,105,110,218,6, + 112,114,101,102,105,120,41,8,218,4,115,101,108,102,114,13, + 0,0,0,114,17,0,0,0,114,31,0,0,0,90,2,115, + 116,90,7,100,105,114,110,97,109,101,90,8,98,97,115,101, + 110,97,109,101,218,5,102,105,108,101,115,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,8,95,95,105,110, + 105,116,95,95,63,0,0,0,115,58,0,0,0,0,1,10, + 1,8,1,10,1,4,1,12,1,4,1,12,2,4,2,2, + 1,14,1,16,3,14,1,8,1,12,1,4,1,16,3,14, + 2,12,1,4,2,2,1,12,1,12,1,8,1,14,1,6, + 1,6,2,22,1,8,1,122,20,122,105,112,105,109,112,111, + 114,116,101,114,46,95,95,105,110,105,116,95,95,78,99,3, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4, + 0,0,0,67,0,0,0,115,78,0,0,0,116,0,124,0, + 124,1,131,2,125,3,124,3,100,1,117,1,114,26,124,0, + 103,0,102,2,83,0,116,1,124,0,124,1,131,2,125,4, + 116,2,124,0,124,4,131,2,114,70,100,1,124,0,106,3, + 155,0,116,4,155,0,124,4,155,0,157,3,103,1,102,2, + 83,0,100,1,103,0,102,2,83,0,41,2,97,239,1,0, + 0,102,105,110,100,95,108,111,97,100,101,114,40,102,117,108, + 108,110,97,109,101,44,32,112,97,116,104,61,78,111,110,101, + 41,32,45,62,32,115,101,108,102,44,32,115,116,114,32,111, + 114,32,78,111,110,101,46,10,10,32,32,32,32,32,32,32, + 32,83,101,97,114,99,104,32,102,111,114,32,97,32,109,111, + 100,117,108,101,32,115,112,101,99,105,102,105,101,100,32,98, + 121,32,39,102,117,108,108,110,97,109,101,39,46,32,39,102, + 117,108,108,110,97,109,101,39,32,109,117,115,116,32,98,101, + 32,116,104,101,10,32,32,32,32,32,32,32,32,102,117,108, + 108,121,32,113,117,97,108,105,102,105,101,100,32,40,100,111, + 116,116,101,100,41,32,109,111,100,117,108,101,32,110,97,109, + 101,46,32,73,116,32,114,101,116,117,114,110,115,32,116,104, + 101,32,122,105,112,105,109,112,111,114,116,101,114,10,32,32, + 32,32,32,32,32,32,105,110,115,116,97,110,99,101,32,105, + 116,115,101,108,102,32,105,102,32,116,104,101,32,109,111,100, + 117,108,101,32,119,97,115,32,102,111,117,110,100,44,32,97, + 32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105, + 110,103,32,116,104,101,10,32,32,32,32,32,32,32,32,102, + 117,108,108,32,112,97,116,104,32,110,97,109,101,32,105,102, + 32,105,116,39,115,32,112,111,115,115,105,98,108,121,32,97, + 32,112,111,114,116,105,111,110,32,111,102,32,97,32,110,97, + 109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,44, + 10,32,32,32,32,32,32,32,32,111,114,32,78,111,110,101, + 32,111,116,104,101,114,119,105,115,101,46,32,84,104,101,32, + 111,112,116,105,111,110,97,108,32,39,112,97,116,104,39,32, + 97,114,103,117,109,101,110,116,32,105,115,32,105,103,110,111, + 114,101,100,32,45,45,32,105,116,39,115,10,32,32,32,32, + 32,32,32,32,116,104,101,114,101,32,102,111,114,32,99,111, + 109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104, + 32,116,104,101,32,105,109,112,111,114,116,101,114,32,112,114, + 111,116,111,99,111,108,46,10,32,32,32,32,32,32,32,32, + 78,41,5,218,16,95,103,101,116,95,109,111,100,117,108,101, + 95,105,110,102,111,218,16,95,103,101,116,95,109,111,100,117, + 108,101,95,112,97,116,104,218,7,95,105,115,95,100,105,114, + 114,29,0,0,0,114,20,0,0,0,41,5,114,32,0,0, + 0,218,8,102,117,108,108,110,97,109,101,114,13,0,0,0, + 218,2,109,105,218,7,109,111,100,112,97,116,104,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,11,102,105, + 110,100,95,108,111,97,100,101,114,109,0,0,0,115,14,0, + 0,0,0,10,10,1,8,2,8,7,10,1,10,4,24,2, + 122,23,122,105,112,105,109,112,111,114,116,101,114,46,102,105, + 110,100,95,108,111,97,100,101,114,99,3,0,0,0,0,0, 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, - 0,0,115,40,0,0,0,116,0,124,0,124,1,131,2,125, - 2,124,2,100,1,107,8,114,36,116,1,100,2,124,1,155, - 2,157,2,124,1,100,3,141,2,130,1,124,2,83,0,41, - 4,122,171,105,115,95,112,97,99,107,97,103,101,40,102,117, - 108,108,110,97,109,101,41,32,45,62,32,98,111,111,108,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 32,84,114,117,101,32,105,102,32,116,104,101,32,109,111,100, - 117,108,101,32,115,112,101,99,105,102,105,101,100,32,98,121, - 32,102,117,108,108,110,97,109,101,32,105,115,32,97,32,112, - 97,99,107,97,103,101,46,10,32,32,32,32,32,32,32,32, - 82,97,105,115,101,32,90,105,112,73,109,112,111,114,116,69, - 114,114,111,114,32,105,102,32,116,104,101,32,109,111,100,117, - 108,101,32,99,111,117,108,100,110,39,116,32,98,101,32,102, - 111,117,110,100,46,10,32,32,32,32,32,32,32,32,78,114, - 57,0,0,0,114,58,0,0,0,41,2,114,35,0,0,0, - 114,3,0,0,0,41,3,114,32,0,0,0,114,38,0,0, - 0,114,39,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,10,105,115,95,112,97,99,107,97,103, - 101,221,0,0,0,115,8,0,0,0,0,6,10,1,8,1, - 18,1,122,22,122,105,112,105,109,112,111,114,116,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,8,0,0,0,8,0,0,0,67, - 0,0,0,115,248,0,0,0,116,0,124,0,124,1,131,2, - 92,3,125,2,125,3,125,4,116,1,106,2,160,3,124,1, - 161,1,125,5,124,5,100,1,107,8,115,46,116,4,124,5, - 116,5,131,2,115,64,116,5,124,1,131,1,125,5,124,5, - 116,1,106,2,124,1,60,0,124,0,124,5,95,6,122,84, - 124,3,114,108,116,7,124,0,124,1,131,2,125,6,116,8, - 160,9,124,0,106,10,124,6,161,2,125,7,124,7,103,1, - 124,5,95,11,116,12,124,5,100,2,131,2,115,124,116,13, - 124,5,95,13,116,8,160,14,124,5,106,15,124,1,124,4, - 161,3,1,0,116,16,124,2,124,5,106,15,131,2,1,0, - 87,0,110,22,1,0,1,0,1,0,116,1,106,2,124,1, - 61,0,130,0,89,0,110,2,88,0,122,14,116,1,106,2, - 124,1,25,0,125,5,87,0,110,36,4,0,116,17,107,10, - 114,228,1,0,1,0,1,0,116,18,100,3,124,1,155,2, - 100,4,157,3,131,1,130,1,89,0,110,2,88,0,116,19, - 160,20,100,5,124,1,124,4,161,3,1,0,124,5,83,0, - 41,6,122,245,108,111,97,100,95,109,111,100,117,108,101,40, - 102,117,108,108,110,97,109,101,41,32,45,62,32,109,111,100, - 117,108,101,46,10,10,32,32,32,32,32,32,32,32,76,111, - 97,100,32,116,104,101,32,109,111,100,117,108,101,32,115,112, - 101,99,105,102,105,101,100,32,98,121,32,39,102,117,108,108, - 110,97,109,101,39,46,32,39,102,117,108,108,110,97,109,101, - 39,32,109,117,115,116,32,98,101,32,116,104,101,10,32,32, - 32,32,32,32,32,32,102,117,108,108,121,32,113,117,97,108, - 105,102,105,101,100,32,40,100,111,116,116,101,100,41,32,109, - 111,100,117,108,101,32,110,97,109,101,46,32,73,116,32,114, - 101,116,117,114,110,115,32,116,104,101,32,105,109,112,111,114, - 116,101,100,10,32,32,32,32,32,32,32,32,109,111,100,117, - 108,101,44,32,111,114,32,114,97,105,115,101,115,32,90,105, + 0,0,115,16,0,0,0,124,0,160,0,124,1,124,2,161, + 2,100,1,25,0,83,0,41,2,97,139,1,0,0,102,105, + 110,100,95,109,111,100,117,108,101,40,102,117,108,108,110,97, + 109,101,44,32,112,97,116,104,61,78,111,110,101,41,32,45, + 62,32,115,101,108,102,32,111,114,32,78,111,110,101,46,10, + 10,32,32,32,32,32,32,32,32,83,101,97,114,99,104,32, + 102,111,114,32,97,32,109,111,100,117,108,101,32,115,112,101, + 99,105,102,105,101,100,32,98,121,32,39,102,117,108,108,110, + 97,109,101,39,46,32,39,102,117,108,108,110,97,109,101,39, + 32,109,117,115,116,32,98,101,32,116,104,101,10,32,32,32, + 32,32,32,32,32,102,117,108,108,121,32,113,117,97,108,105, + 102,105,101,100,32,40,100,111,116,116,101,100,41,32,109,111, + 100,117,108,101,32,110,97,109,101,46,32,73,116,32,114,101, + 116,117,114,110,115,32,116,104,101,32,122,105,112,105,109,112, + 111,114,116,101,114,10,32,32,32,32,32,32,32,32,105,110, + 115,116,97,110,99,101,32,105,116,115,101,108,102,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,119,97,115,32, + 102,111,117,110,100,44,32,111,114,32,78,111,110,101,32,105, + 102,32,105,116,32,119,97,115,110,39,116,46,10,32,32,32, + 32,32,32,32,32,84,104,101,32,111,112,116,105,111,110,97, + 108,32,39,112,97,116,104,39,32,97,114,103,117,109,101,110, + 116,32,105,115,32,105,103,110,111,114,101,100,32,45,45,32, + 105,116,39,115,32,116,104,101,114,101,32,102,111,114,32,99, + 111,109,112,97,116,105,98,105,108,105,116,121,10,32,32,32, + 32,32,32,32,32,119,105,116,104,32,116,104,101,32,105,109, + 112,111,114,116,101,114,32,112,114,111,116,111,99,111,108,46, + 10,32,32,32,32,32,32,32,32,114,0,0,0,0,41,1, + 114,41,0,0,0,41,3,114,32,0,0,0,114,38,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,102,105,110,100,95,109,111,100,117, + 108,101,141,0,0,0,115,2,0,0,0,0,9,122,23,122, + 105,112,105,109,112,111,114,116,101,114,46,102,105,110,100,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,3,0,0,0,67,0,0,0,115, + 20,0,0,0,116,0,124,0,124,1,131,2,92,3,125,2, + 125,3,125,4,124,2,83,0,41,1,122,163,103,101,116,95, + 99,111,100,101,40,102,117,108,108,110,97,109,101,41,32,45, + 62,32,99,111,100,101,32,111,98,106,101,99,116,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,116, + 104,101,32,99,111,100,101,32,111,98,106,101,99,116,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,32,82,97,105,115,101,32,90, + 105,112,73,109,112,111,114,116,69,114,114,111,114,10,32,32, + 32,32,32,32,32,32,105,102,32,116,104,101,32,109,111,100, + 117,108,101,32,99,111,117,108,100,110,39,116,32,98,101,32, + 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,169, + 1,218,16,95,103,101,116,95,109,111,100,117,108,101,95,99, + 111,100,101,169,5,114,32,0,0,0,114,38,0,0,0,218, + 4,99,111,100,101,218,9,105,115,112,97,99,107,97,103,101, + 114,40,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,8,103,101,116,95,99,111,100,101,153,0, + 0,0,115,4,0,0,0,0,6,16,1,122,20,122,105,112, + 105,109,112,111,114,116,101,114,46,103,101,116,95,99,111,100, + 101,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,116,0,0,0,116, + 0,114,16,124,1,160,1,116,0,116,2,161,2,125,1,124, + 1,125,2,124,1,160,3,124,0,106,4,116,2,23,0,161, + 1,114,58,124,1,116,5,124,0,106,4,116,2,23,0,131, + 1,100,1,133,2,25,0,125,2,122,14,124,0,106,6,124, + 2,25,0,125,3,87,0,110,30,4,0,116,7,121,102,1, + 0,1,0,1,0,116,8,100,2,100,3,124,2,131,3,130, + 1,89,0,110,2,48,0,116,9,124,0,106,4,124,3,131, + 2,83,0,41,4,122,154,103,101,116,95,100,97,116,97,40, + 112,97,116,104,110,97,109,101,41,32,45,62,32,115,116,114, + 105,110,103,32,119,105,116,104,32,102,105,108,101,32,100,97, + 116,97,46,10,10,32,32,32,32,32,32,32,32,82,101,116, + 117,114,110,32,116,104,101,32,100,97,116,97,32,97,115,115, + 111,99,105,97,116,101,100,32,119,105,116,104,32,39,112,97, + 116,104,110,97,109,101,39,46,32,82,97,105,115,101,32,79, + 83,69,114,114,111,114,32,105,102,10,32,32,32,32,32,32, + 32,32,116,104,101,32,102,105,108,101,32,119,97,115,110,39, + 116,32,102,111,117,110,100,46,10,32,32,32,32,32,32,32, + 32,78,114,0,0,0,0,218,0,41,10,114,18,0,0,0, + 114,19,0,0,0,114,20,0,0,0,218,10,115,116,97,114, + 116,115,119,105,116,104,114,29,0,0,0,218,3,108,101,110, + 114,28,0,0,0,114,26,0,0,0,114,22,0,0,0,218, + 9,95,103,101,116,95,100,97,116,97,41,4,114,32,0,0, + 0,218,8,112,97,116,104,110,97,109,101,90,3,107,101,121, + 218,9,116,111,99,95,101,110,116,114,121,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,8,103,101,116,95, + 100,97,116,97,163,0,0,0,115,20,0,0,0,0,6,4, + 1,12,2,4,1,16,1,22,2,2,1,14,1,12,1,18, + 1,122,20,122,105,112,105,109,112,111,114,116,101,114,46,103, + 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,3,0,0,0,67,0,0,0, + 115,20,0,0,0,116,0,124,0,124,1,131,2,92,3,125, + 2,125,3,125,4,124,4,83,0,41,1,122,106,103,101,116, + 95,102,105,108,101,110,97,109,101,40,102,117,108,108,110,97, + 109,101,41,32,45,62,32,102,105,108,101,110,97,109,101,32, + 115,116,114,105,110,103,46,10,10,32,32,32,32,32,32,32, + 32,82,101,116,117,114,110,32,116,104,101,32,102,105,108,101, + 110,97,109,101,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,32, + 32,32,32,32,32,32,32,114,43,0,0,0,114,45,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,12,103,101,116,95,102,105,108,101,110,97,109,101,184,0, + 0,0,115,4,0,0,0,0,7,16,1,122,24,122,105,112, + 105,109,112,111,114,116,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,6,0,0,0,8,0,0,0,67,0,0,0,115,126, + 0,0,0,116,0,124,0,124,1,131,2,125,2,124,2,100, + 1,117,0,114,36,116,1,100,2,124,1,155,2,157,2,124, + 1,100,3,141,2,130,1,116,2,124,0,124,1,131,2,125, + 3,124,2,114,64,116,3,160,4,124,3,100,4,161,2,125, + 4,110,10,124,3,155,0,100,5,157,2,125,4,122,14,124, + 0,106,5,124,4,25,0,125,5,87,0,110,20,4,0,116, + 6,121,108,1,0,1,0,1,0,89,0,100,1,83,0,48, + 0,116,7,124,0,106,8,124,5,131,2,160,9,161,0,83, + 0,41,6,122,253,103,101,116,95,115,111,117,114,99,101,40, + 102,117,108,108,110,97,109,101,41,32,45,62,32,115,111,117, + 114,99,101,32,115,116,114,105,110,103,46,10,10,32,32,32, + 32,32,32,32,32,82,101,116,117,114,110,32,116,104,101,32, + 115,111,117,114,99,101,32,99,111,100,101,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,32,82,97,105,115,101,32,90,105,112,73, + 109,112,111,114,116,69,114,114,111,114,10,32,32,32,32,32, + 32,32,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,99,111,117,108,100,110,39,116,32,98,101,32,102,111,117, + 110,100,44,32,114,101,116,117,114,110,32,78,111,110,101,32, + 105,102,32,116,104,101,32,97,114,99,104,105,118,101,32,100, + 111,101,115,10,32,32,32,32,32,32,32,32,99,111,110,116, + 97,105,110,32,116,104,101,32,109,111,100,117,108,101,44,32, + 98,117,116,32,104,97,115,32,110,111,32,115,111,117,114,99, + 101,32,102,111,114,32,105,116,46,10,32,32,32,32,32,32, + 32,32,78,250,18,99,97,110,39,116,32,102,105,110,100,32, + 109,111,100,117,108,101,32,169,1,218,4,110,97,109,101,250, + 11,95,95,105,110,105,116,95,95,46,112,121,250,3,46,112, + 121,41,10,114,35,0,0,0,114,3,0,0,0,114,36,0, + 0,0,114,21,0,0,0,114,30,0,0,0,114,28,0,0, + 0,114,26,0,0,0,114,52,0,0,0,114,29,0,0,0, + 218,6,100,101,99,111,100,101,41,6,114,32,0,0,0,114, + 38,0,0,0,114,39,0,0,0,114,13,0,0,0,218,8, + 102,117,108,108,112,97,116,104,114,54,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,10,103,101, + 116,95,115,111,117,114,99,101,195,0,0,0,115,24,0,0, + 0,0,7,10,1,8,1,18,2,10,1,4,1,14,2,10, + 2,2,1,14,1,12,2,8,1,122,22,122,105,112,105,109, + 112,111,114,116,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,3,0, + 0,0,4,0,0,0,67,0,0,0,115,40,0,0,0,116, + 0,124,0,124,1,131,2,125,2,124,2,100,1,117,0,114, + 36,116,1,100,2,124,1,155,2,157,2,124,1,100,3,141, + 2,130,1,124,2,83,0,41,4,122,171,105,115,95,112,97, + 99,107,97,103,101,40,102,117,108,108,110,97,109,101,41,32, + 45,62,32,98,111,111,108,46,10,10,32,32,32,32,32,32, + 32,32,82,101,116,117,114,110,32,84,114,117,101,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,115,112,101,99, + 105,102,105,101,100,32,98,121,32,102,117,108,108,110,97,109, + 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,10, + 32,32,32,32,32,32,32,32,82,97,105,115,101,32,90,105, 112,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, - 105,116,32,119,97,115,110,39,116,32,102,111,117,110,100,46, - 10,32,32,32,32,32,32,32,32,78,218,12,95,95,98,117, - 105,108,116,105,110,115,95,95,122,14,76,111,97,100,101,100, - 32,109,111,100,117,108,101,32,122,25,32,110,111,116,32,102, - 111,117,110,100,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,122,30,105,109,112,111,114,116,32,123,125,32,35, - 32,108,111,97,100,101,100,32,102,114,111,109,32,90,105,112, - 32,123,125,41,21,114,44,0,0,0,218,3,115,121,115,218, - 7,109,111,100,117,108,101,115,218,3,103,101,116,114,15,0, - 0,0,218,12,95,109,111,100,117,108,101,95,116,121,112,101, - 218,10,95,95,108,111,97,100,101,114,95,95,114,36,0,0, - 0,114,21,0,0,0,114,30,0,0,0,114,29,0,0,0, - 90,8,95,95,112,97,116,104,95,95,218,7,104,97,115,97, - 116,116,114,114,66,0,0,0,90,14,95,102,105,120,95,117, - 112,95,109,111,100,117,108,101,218,8,95,95,100,105,99,116, - 95,95,218,4,101,120,101,99,114,26,0,0,0,218,11,73, - 109,112,111,114,116,69,114,114,111,114,218,10,95,98,111,111, - 116,115,116,114,97,112,218,16,95,118,101,114,98,111,115,101, - 95,109,101,115,115,97,103,101,41,8,114,32,0,0,0,114, - 38,0,0,0,114,46,0,0,0,114,47,0,0,0,114,40, - 0,0,0,90,3,109,111,100,114,13,0,0,0,114,63,0, + 116,104,101,32,109,111,100,117,108,101,32,99,111,117,108,100, + 110,39,116,32,98,101,32,102,111,117,110,100,46,10,32,32, + 32,32,32,32,32,32,78,114,57,0,0,0,114,58,0,0, + 0,41,2,114,35,0,0,0,114,3,0,0,0,41,3,114, + 32,0,0,0,114,38,0,0,0,114,39,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,10,105, + 115,95,112,97,99,107,97,103,101,221,0,0,0,115,8,0, + 0,0,0,6,10,1,8,1,18,1,122,22,122,105,112,105, + 109,112,111,114,116,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,8, + 0,0,0,8,0,0,0,67,0,0,0,115,246,0,0,0, + 116,0,124,0,124,1,131,2,92,3,125,2,125,3,125,4, + 116,1,106,2,160,3,124,1,161,1,125,5,124,5,100,1, + 117,0,115,46,116,4,124,5,116,5,131,2,115,64,116,5, + 124,1,131,1,125,5,124,5,116,1,106,2,124,1,60,0, + 124,0,124,5,95,6,122,84,124,3,114,108,116,7,124,0, + 124,1,131,2,125,6,116,8,160,9,124,0,106,10,124,6, + 161,2,125,7,124,7,103,1,124,5,95,11,116,12,124,5, + 100,2,131,2,115,124,116,13,124,5,95,13,116,8,160,14, + 124,5,106,15,124,1,124,4,161,3,1,0,116,16,124,2, + 124,5,106,15,131,2,1,0,87,0,110,22,1,0,1,0, + 1,0,116,1,106,2,124,1,61,0,130,0,89,0,110,2, + 48,0,122,14,116,1,106,2,124,1,25,0,125,5,87,0, + 110,34,4,0,116,17,121,226,1,0,1,0,1,0,116,18, + 100,3,124,1,155,2,100,4,157,3,131,1,130,1,89,0, + 110,2,48,0,116,19,160,20,100,5,124,1,124,4,161,3, + 1,0,124,5,83,0,41,6,122,245,108,111,97,100,95,109, + 111,100,117,108,101,40,102,117,108,108,110,97,109,101,41,32, + 45,62,32,109,111,100,117,108,101,46,10,10,32,32,32,32, + 32,32,32,32,76,111,97,100,32,116,104,101,32,109,111,100, + 117,108,101,32,115,112,101,99,105,102,105,101,100,32,98,121, + 32,39,102,117,108,108,110,97,109,101,39,46,32,39,102,117, + 108,108,110,97,109,101,39,32,109,117,115,116,32,98,101,32, + 116,104,101,10,32,32,32,32,32,32,32,32,102,117,108,108, + 121,32,113,117,97,108,105,102,105,101,100,32,40,100,111,116, + 116,101,100,41,32,109,111,100,117,108,101,32,110,97,109,101, + 46,32,73,116,32,114,101,116,117,114,110,115,32,116,104,101, + 32,105,109,112,111,114,116,101,100,10,32,32,32,32,32,32, + 32,32,109,111,100,117,108,101,44,32,111,114,32,114,97,105, + 115,101,115,32,90,105,112,73,109,112,111,114,116,69,114,114, + 111,114,32,105,102,32,105,116,32,119,97,115,110,39,116,32, + 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,78, + 218,12,95,95,98,117,105,108,116,105,110,115,95,95,122,14, + 76,111,97,100,101,100,32,109,111,100,117,108,101,32,122,25, + 32,110,111,116,32,102,111,117,110,100,32,105,110,32,115,121, + 115,46,109,111,100,117,108,101,115,122,30,105,109,112,111,114, + 116,32,123,125,32,35,32,108,111,97,100,101,100,32,102,114, + 111,109,32,90,105,112,32,123,125,41,21,114,44,0,0,0, + 218,3,115,121,115,218,7,109,111,100,117,108,101,115,218,3, + 103,101,116,114,15,0,0,0,218,12,95,109,111,100,117,108, + 101,95,116,121,112,101,218,10,95,95,108,111,97,100,101,114, + 95,95,114,36,0,0,0,114,21,0,0,0,114,30,0,0, + 0,114,29,0,0,0,90,8,95,95,112,97,116,104,95,95, + 218,7,104,97,115,97,116,116,114,114,66,0,0,0,90,14, + 95,102,105,120,95,117,112,95,109,111,100,117,108,101,218,8, + 95,95,100,105,99,116,95,95,218,4,101,120,101,99,114,26, + 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, + 218,10,95,98,111,111,116,115,116,114,97,112,218,16,95,118, + 101,114,98,111,115,101,95,109,101,115,115,97,103,101,41,8, + 114,32,0,0,0,114,38,0,0,0,114,46,0,0,0,114, + 47,0,0,0,114,40,0,0,0,90,3,109,111,100,114,13, + 0,0,0,114,63,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,11,108,111,97,100,95,109,111, + 100,117,108,101,234,0,0,0,115,48,0,0,0,0,7,16, + 1,12,1,18,1,8,1,10,1,6,2,2,1,4,3,10, + 1,14,1,8,2,10,1,6,1,16,1,16,1,6,1,8, + 1,8,2,2,1,14,1,12,1,22,1,14,1,122,23,122, + 105,112,105,109,112,111,114,116,101,114,46,108,111,97,100,95, + 109,111,100,117,108,101,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,122,20,124,0,160,0,124,1,161,1,115,18, + 87,0,100,1,83,0,87,0,110,20,4,0,116,1,121,40, + 1,0,1,0,1,0,89,0,100,1,83,0,48,0,116,2, + 106,3,115,76,100,2,100,3,108,4,109,5,125,2,1,0, + 124,2,160,6,116,2,161,1,1,0,100,4,116,2,95,3, + 116,2,124,0,124,1,131,2,83,0,41,5,122,204,82,101, + 116,117,114,110,32,116,104,101,32,82,101,115,111,117,114,99, + 101,82,101,97,100,101,114,32,102,111,114,32,97,32,112,97, + 99,107,97,103,101,32,105,110,32,97,32,122,105,112,32,102, + 105,108,101,46,10,10,32,32,32,32,32,32,32,32,73,102, + 32,39,102,117,108,108,110,97,109,101,39,32,105,115,32,97, + 32,112,97,99,107,97,103,101,32,119,105,116,104,105,110,32, + 116,104,101,32,122,105,112,32,102,105,108,101,44,32,114,101, + 116,117,114,110,32,116,104,101,10,32,32,32,32,32,32,32, + 32,39,82,101,115,111,117,114,99,101,82,101,97,100,101,114, + 39,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101, + 32,112,97,99,107,97,103,101,46,32,32,79,116,104,101,114, + 119,105,115,101,32,114,101,116,117,114,110,32,78,111,110,101, + 46,10,32,32,32,32,32,32,32,32,78,114,0,0,0,0, + 41,1,218,14,82,101,115,111,117,114,99,101,82,101,97,100, + 101,114,84,41,7,114,65,0,0,0,114,3,0,0,0,218, + 24,95,90,105,112,73,109,112,111,114,116,82,101,115,111,117, + 114,99,101,82,101,97,100,101,114,218,11,95,114,101,103,105, + 115,116,101,114,101,100,90,13,105,109,112,111,114,116,108,105, + 98,46,97,98,99,114,79,0,0,0,90,8,114,101,103,105, + 115,116,101,114,41,3,114,32,0,0,0,114,38,0,0,0, + 114,79,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,19,103,101,116,95,114,101,115,111,117,114, + 99,101,95,114,101,97,100,101,114,16,1,0,0,115,20,0, + 0,0,0,6,2,1,10,1,10,1,12,1,8,1,6,1, + 12,1,10,1,6,1,122,31,122,105,112,105,109,112,111,114, + 116,101,114,46,103,101,116,95,114,101,115,111,117,114,99,101, + 95,114,101,97,100,101,114,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,100,1,124,0,106,0,155,0,116,1,155, + 0,124,0,106,2,155,0,100,2,157,5,83,0,41,3,78, + 122,21,60,122,105,112,105,109,112,111,114,116,101,114,32,111, + 98,106,101,99,116,32,34,122,2,34,62,41,3,114,29,0, + 0,0,114,20,0,0,0,114,31,0,0,0,41,1,114,32, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,8,95,95,114,101,112,114,95,95,34,1,0,0, + 115,2,0,0,0,0,1,122,20,122,105,112,105,109,112,111, + 114,116,101,114,46,95,95,114,101,112,114,95,95,41,1,78, + 41,1,78,41,15,114,6,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,7,95,95,100,111,99,95,95,114,34,0, + 0,0,114,41,0,0,0,114,42,0,0,0,114,48,0,0, + 0,114,55,0,0,0,114,56,0,0,0,114,64,0,0,0, + 114,65,0,0,0,114,78,0,0,0,114,82,0,0,0,114, + 83,0,0,0,114,9,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,4,0,0,0,45,0,0, + 0,115,24,0,0,0,8,1,4,17,8,46,10,32,10,12, + 8,10,8,21,8,11,8,26,8,13,8,38,8,18,122,12, + 95,95,105,110,105,116,95,95,46,112,121,99,84,114,60,0, + 0,0,70,41,3,122,4,46,112,121,99,84,70,41,3,114, + 61,0,0,0,70,70,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, + 20,0,0,0,124,0,106,0,124,1,160,1,100,1,161,1, + 100,2,25,0,23,0,83,0,41,3,78,218,1,46,233,2, + 0,0,0,41,2,114,31,0,0,0,218,10,114,112,97,114, + 116,105,116,105,111,110,41,2,114,32,0,0,0,114,38,0, 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,11,108,111,97,100,95,109,111,100,117,108,101,234,0, - 0,0,115,48,0,0,0,0,7,16,1,12,1,18,1,8, - 1,10,1,6,2,2,1,4,3,10,1,14,1,8,2,10, - 1,6,1,16,1,16,1,6,1,8,1,8,2,2,1,14, - 1,14,1,22,1,14,1,122,23,122,105,112,105,109,112,111, - 114,116,101,114,46,108,111,97,100,95,109,111,100,117,108,101, - 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,88,0,0,0,122,20, - 124,0,160,0,124,1,161,1,115,18,87,0,100,1,83,0, - 87,0,110,22,4,0,116,1,107,10,114,42,1,0,1,0, - 1,0,89,0,100,1,83,0,88,0,116,2,106,3,115,78, - 100,2,100,3,108,4,109,5,125,2,1,0,124,2,160,6, - 116,2,161,1,1,0,100,4,116,2,95,3,116,2,124,0, - 124,1,131,2,83,0,41,5,122,204,82,101,116,117,114,110, - 32,116,104,101,32,82,101,115,111,117,114,99,101,82,101,97, - 100,101,114,32,102,111,114,32,97,32,112,97,99,107,97,103, - 101,32,105,110,32,97,32,122,105,112,32,102,105,108,101,46, - 10,10,32,32,32,32,32,32,32,32,73,102,32,39,102,117, - 108,108,110,97,109,101,39,32,105,115,32,97,32,112,97,99, - 107,97,103,101,32,119,105,116,104,105,110,32,116,104,101,32, - 122,105,112,32,102,105,108,101,44,32,114,101,116,117,114,110, - 32,116,104,101,10,32,32,32,32,32,32,32,32,39,82,101, - 115,111,117,114,99,101,82,101,97,100,101,114,39,32,111,98, - 106,101,99,116,32,102,111,114,32,116,104,101,32,112,97,99, - 107,97,103,101,46,32,32,79,116,104,101,114,119,105,115,101, - 32,114,101,116,117,114,110,32,78,111,110,101,46,10,32,32, - 32,32,32,32,32,32,78,114,0,0,0,0,41,1,218,14, - 82,101,115,111,117,114,99,101,82,101,97,100,101,114,84,41, - 7,114,65,0,0,0,114,3,0,0,0,218,24,95,90,105, - 112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82, - 101,97,100,101,114,218,11,95,114,101,103,105,115,116,101,114, - 101,100,90,13,105,109,112,111,114,116,108,105,98,46,97,98, - 99,114,79,0,0,0,90,8,114,101,103,105,115,116,101,114, - 41,3,114,32,0,0,0,114,38,0,0,0,114,79,0,0, - 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,19,103,101,116,95,114,101,115,111,117,114,99,101,95,114, - 101,97,100,101,114,16,1,0,0,115,20,0,0,0,0,6, - 2,1,10,1,10,1,14,1,8,1,6,1,12,1,10,1, - 6,1,122,31,122,105,112,105,109,112,111,114,116,101,114,46, - 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, - 100,101,114,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,100,1,124,0,106,0,155,0,116,1,155,0,124,0,106, - 2,155,0,100,2,157,5,83,0,41,3,78,122,21,60,122, - 105,112,105,109,112,111,114,116,101,114,32,111,98,106,101,99, - 116,32,34,122,2,34,62,41,3,114,29,0,0,0,114,20, - 0,0,0,114,31,0,0,0,41,1,114,32,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, - 95,95,114,101,112,114,95,95,34,1,0,0,115,2,0,0, - 0,0,1,122,20,122,105,112,105,109,112,111,114,116,101,114, - 46,95,95,114,101,112,114,95,95,41,1,78,41,1,78,41, - 15,114,6,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,7,95,95,100,111,99,95,95,114,34,0,0,0,114,41, - 0,0,0,114,42,0,0,0,114,48,0,0,0,114,55,0, - 0,0,114,56,0,0,0,114,64,0,0,0,114,65,0,0, - 0,114,78,0,0,0,114,82,0,0,0,114,83,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,4,0,0,0,45,0,0,0,115,24,0, - 0,0,8,1,4,17,8,46,10,32,10,12,8,10,8,21, - 8,11,8,26,8,13,8,38,8,18,122,12,95,95,105,110, - 105,116,95,95,46,112,121,99,84,114,60,0,0,0,70,41, - 3,122,4,46,112,121,99,84,70,41,3,114,61,0,0,0, - 70,70,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,20,0,0,0, - 124,0,106,0,124,1,160,1,100,1,161,1,100,2,25,0, - 23,0,83,0,41,3,78,218,1,46,233,2,0,0,0,41, - 2,114,31,0,0,0,218,10,114,112,97,114,116,105,116,105, - 111,110,41,2,114,32,0,0,0,114,38,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,114,36,0, - 0,0,52,1,0,0,115,2,0,0,0,0,1,114,36,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,2,0,0,0,67,0,0,0,115,18,0,0,0, - 124,1,116,0,23,0,125,2,124,2,124,0,106,1,107,6, - 83,0,169,1,78,41,2,114,20,0,0,0,114,28,0,0, - 0,41,3,114,32,0,0,0,114,13,0,0,0,90,7,100, - 105,114,112,97,116,104,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,114,37,0,0,0,56,1,0,0,115,4, - 0,0,0,0,4,8,2,114,37,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,7,0,0,0,4,0,0, - 0,67,0,0,0,115,56,0,0,0,116,0,124,0,124,1, - 131,2,125,2,116,1,68,0,93,36,92,3,125,3,125,4, - 125,5,124,2,124,3,23,0,125,6,124,6,124,0,106,2, - 107,6,114,14,124,5,2,0,1,0,83,0,113,14,100,0, - 83,0,114,88,0,0,0,41,3,114,36,0,0,0,218,16, - 95,122,105,112,95,115,101,97,114,99,104,111,114,100,101,114, - 114,28,0,0,0,41,7,114,32,0,0,0,114,38,0,0, - 0,114,13,0,0,0,218,6,115,117,102,102,105,120,218,10, - 105,115,98,121,116,101,99,111,100,101,114,47,0,0,0,114, - 63,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 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,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, + 0,114,36,0,0,0,52,1,0,0,115,2,0,0,0,0, + 1,114,36,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, + 18,0,0,0,124,1,116,0,23,0,125,2,124,2,124,0, + 106,1,118,0,83,0,169,1,78,41,2,114,20,0,0,0, + 114,28,0,0,0,41,3,114,32,0,0,0,114,13,0,0, + 0,90,7,100,105,114,112,97,116,104,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,37,0,0,0,56,1, + 0,0,115,4,0,0,0,0,4,8,2,114,37,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,7,0,0, + 0,4,0,0,0,67,0,0,0,115,56,0,0,0,116,0, + 124,0,124,1,131,2,125,2,116,1,68,0,93,36,92,3, + 125,3,125,4,125,5,124,2,124,3,23,0,125,6,124,6, + 124,0,106,2,118,0,114,14,124,5,2,0,1,0,83,0, + 113,14,100,0,83,0,114,88,0,0,0,41,3,114,36,0, + 0,0,218,16,95,122,105,112,95,115,101,97,114,99,104,111, + 114,100,101,114,114,28,0,0,0,41,7,114,32,0,0,0, + 114,38,0,0,0,114,13,0,0,0,218,6,115,117,102,102, + 105,120,218,10,105,115,98,121,116,101,99,111,100,101,114,47, + 0,0,0,114,63,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,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, + 2,5,0,0,122,14,116,0,160,1,124,0,161,1,125,1, + 87,0,110,36,4,0,116,2,121,50,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,48,0,124,1,144,4,143,164,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,36,4,0,116,2,121,132,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, + 141,2,130,1,89,0,110,2,48,0,116,8,124,3,131,1, + 116,5,107,3,114,164,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, + 25,0,116,9,107,3,144,1,114,170,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, + 87,0,110,36,4,0,116,2,121,242,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,48,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,38,4,0,116,2,144,1,121,66,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,48,0,124,6,160,12,116,9,161,1, + 125,7,124,7,100,6,107,0,144,1,114,106,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,154,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,230,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,2,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,46, + 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,38,4,0,116,2,144,2, + 121,106,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,48,0, + 124,1,160,7,100,15,161,1,125,3,116,8,124,3,131,1, + 100,5,107,0,144,2,114,140,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,162,144,4,113,208,116,8,124,3,131,1,100,15,107,3, + 144,2,114,184,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,144,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,38,4,0,116,2, + 144,3,121,204,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, + 48,0,116,8,124,23,131,1,124,19,107,3,144,3,114,238, + 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,30, + 116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,87,0,110,38,4,0,116,2,144,4,121,70,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,5,100, - 6,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,4,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,70,114,0,0,0,0,169,1,218, - 10,100,101,99,111,109,112,114,101,115,115,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,60,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,22,4,0,116,2,107,10, - 114,50,1,0,1,0,1,0,89,0,100,0,83,0,88,0, - 124,6,100,2,64,0,100,3,107,3,125,7,124,7,114,182, - 124,6,100,4,64,0,100,3,107,3,125,8,116,3,106,4, - 100,5,107,3,114,180,124,8,115,104,116,3,106,4,100,6, - 107,2,114,180,116,5,124,0,124,2,131,2,125,9,124,9, - 100,0,107,9,114,180,116,3,160,6,116,0,106,7,124,9, - 161,2,125,10,122,20,116,0,160,8,124,4,124,10,124,3, - 124,5,161,4,1,0,87,0,110,22,4,0,116,2,107,10, - 114,178,1,0,1,0,1,0,89,0,100,0,83,0,88,0, - 110,84,116,9,124,0,124,2,131,2,92,2,125,11,125,12, - 124,11,144,1,114,10,116,10,116,11,124,4,100,7,100,8, - 133,2,25,0,131,1,124,11,131,2,114,246,116,11,124,4, - 100,8,100,9,133,2,25,0,131,1,124,12,107,3,144,1, - 114,10,116,12,160,13,100,10,124,3,155,2,157,2,161,1, - 1,0,100,0,83,0,116,14,160,15,124,4,100,9,100,0, - 133,2,25,0,161,1,125,13,116,16,124,13,116,17,131,2, - 144,1,115,56,116,18,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,19,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,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,8,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, - 10,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, + 100,2,141,2,130,1,89,0,110,2,48,0,124,13,100,28, + 64,0,144,4,114,92,124,23,160,16,161,0,125,23,110,52, + 122,14,124,23,160,16,100,29,161,1,125,23,87,0,110,36, + 4,0,116,17,144,4,121,142,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,48,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,108,87,0,100,0,4,0,4,0,131,3,1,0, + 110,18,49,0,144,4,115,230,48,0,1,0,1,0,1,0, + 89,0,1,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,12,1,24,2,8,1,2,1,14,1,8, + 1,14,1,12,1,24,1,12,1,18,1,18,3,2,1,12, + 1,12,1,12,1,10,1,2,255,12,2,8,1,2,255,2, + 1,2,255,4,2,2,1,10,1,12,1,14,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,14,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,14,1,24,1,14,1,18, + 4,2,1,28,1,22,1,14,1,24,2,10,2,10,3,2, + 1,14,1,14,1,22,2,12,1,12,1,20,1,8,1,44, + 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,110,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,62,122,16,100,4,100,5,108,4,109,5,125, + 0,1,0,87,0,110,36,4,0,116,6,121,80,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,48,0,87,0,100,6,97, + 0,110,6,100,6,97,0,48,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,12,1,10,1,16, + 2,12,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,144,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,14,125,10,122,14,124,10,160,3, + 124,6,161,1,1,0,87,0,110,36,4,0,116,4,121,100, + 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,48,0,124,10, + 160,5,100,5,161,1,125,11,116,6,124,11,131,1,100,5, + 107,3,114,132,116,7,100,6,131,1,130,1,124,11,100,0, + 100,7,133,2,25,0,100,8,107,3,114,166,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,38,4,0,116,4,144,1,121,14,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,48,0,124,10,160,5,124,4,161,1, + 125,15,116,6,124,15,131,1,124,4,107,3,144,1,114,48, + 116,4,100,12,131,1,130,1,87,0,100,0,4,0,4,0, + 131,3,1,0,110,18,49,0,144,1,115,70,48,0,1,0, + 1,0,1,0,89,0,1,0,124,3,100,1,107,2,144,1, + 114,94,124,15,83,0,122,10,116,9,131,0,125,16,87,0, + 110,28,4,0,116,10,144,1,121,132,1,0,1,0,1,0, + 116,0,100,13,131,1,130,1,89,0,110,2,48,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,12,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,14,1, + 24,1,10,1,14,1,40,2,10,2,4,3,2,1,10,1, + 14,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, - 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, + 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,56,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,20,4,0,116,2,121,48,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,124,6,100,2,64,0, + 100,3,107,3,125,7,124,7,114,178,124,6,100,4,64,0, + 100,3,107,3,125,8,116,3,106,4,100,5,107,3,114,176, + 124,8,115,102,116,3,106,4,100,6,107,2,114,176,116,5, + 124,0,124,2,131,2,125,9,124,9,100,0,117,1,114,176, + 116,3,160,6,116,0,106,7,124,9,161,2,125,10,122,20, + 116,0,160,8,124,4,124,10,124,3,124,5,161,4,1,0, + 87,0,110,20,4,0,116,2,121,174,1,0,1,0,1,0, + 89,0,100,0,83,0,48,0,110,84,116,9,124,0,124,2, + 131,2,92,2,125,11,125,12,124,11,144,1,114,6,116,10, + 116,11,124,4,100,7,100,8,133,2,25,0,131,1,124,11, + 131,2,114,242,116,11,124,4,100,8,100,9,133,2,25,0, + 131,1,124,12,107,3,144,1,114,6,116,12,160,13,100,10, + 124,3,155,2,157,2,161,1,1,0,100,0,83,0,116,14, + 160,15,124,4,100,9,100,0,133,2,25,0,161,1,125,13, + 116,16,124,13,116,17,131,2,144,1,115,52,116,18,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,19,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,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,82,0,0,0,0,2,2,1, + 2,254,6,5,2,1,18,1,12,1,8,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,8,255,8,2, + 12,1,10,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,18,0,0,0, + 0,1,4,1,10,1,10,1,6,1,6,1,10,1,10,1, + 6,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,114,0,0,0,122,82,124,1,100,1,100,0,133,2,25, + 0,100,2,118,0,115,22,74,0,130,1,124,1,100,0,100, + 1,133,2,25,0,125,1,124,0,106,0,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,1,124,4,124,3,131, + 2,124,5,102,2,87,0,83,0,4,0,116,2,116,3,116, + 4,102,3,121,108,1,0,1,0,1,0,89,0,100,6,83, + 0,48,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,5,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,18,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,84,0,0,0,124,1,100,1,100,0,133,2,25,0, + 100,2,118,0,115,20,74,0,130,1,124,1,100,0,100,1, + 133,2,25,0,125,1,122,14,124,0,106,0,124,1,25,0, + 125,2,87,0,110,20,4,0,116,1,121,66,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,116,2,124,0,106,3, + 124,2,131,2,83,0,100,0,83,0,41,3,78,114,14,0, + 0,0,114,170,0,0,0,41,4,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,12,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,196,0,0,0,116,0,124,0, + 124,1,131,2,125,2,116,1,68,0,93,158,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,18,4,0,116,7,121,86,1,0,1,0,1,0,89,0, + 113,14,48,0,124,7,100,4,25,0,125,8,116,8,124,0, + 106,4,124,7,131,2,125,9,124,4,114,130,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,117,0,114,150, + 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,12,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,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, + 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,90,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,121,84,1,0,1, + 0,1,0,116,7,124,3,131,1,130,1,89,0,110,2,48, + 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,176,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,176,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,12,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,177,0,0,0,41,2,114,32,0,0,0,114,178,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, + 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,70,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,20,4,0, + 116,4,121,64,1,0,1,0,1,0,89,0,100,3,83,0, + 48,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,179,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,12,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,184,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,74,0,130,1,124,3,106,8,125,4,116,9,131, + 0,125,5,124,0,106,2,106,10,68,0,93,100,125,6,122, + 18,124,1,124,6,131,1,160,5,124,4,161,1,125,7,87, + 0,110,22,4,0,116,11,121,122,1,0,1,0,1,0,89, + 0,113,78,89,0,110,2,48,0,124,7,106,8,106,7,125, + 8,116,12,124,8,131,1,100,1,107,2,114,154,124,7,106, + 7,86,0,1,0,113,78,124,8,124,5,118,1,114,78,124, + 5,160,13,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,14,90,7,112,97, + 116,104,108,105,98,114,183,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, + 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,183,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,12,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,180,0,0,0,114,181,0,0,0,114,182,0,0,0,114, + 187,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/initconfig.c b/Python/initconfig.c index b28e0a07..e882a1fb 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1,27 +1,33 @@ #include "Python.h" -#include "osdefs.h" /* DELIM */ -#include "pycore_fileutils.h" -#include "pycore_getopt.h" -#include "pycore_initconfig.h" -#include "pycore_pathconfig.h" -#include "pycore_pyerrors.h" -#include "pycore_pylifecycle.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" /* _PyRuntime */ -#include /* setlocale() */ +#include "pycore_fileutils.h" // _Py_HasFileSystemDefaultEncodeErrors +#include "pycore_getopt.h" // _PyOS_GetOpt() +#include "pycore_initconfig.h" // _PyStatus_OK() +#include "pycore_interp.h" // _PyInterpreterState.runtime +#include "pycore_pathconfig.h" // _Py_path_config +#include "pycore_pyerrors.h" // _PyErr_Fetch() +#include "pycore_pylifecycle.h" // _Py_PreInitializeFromConfig() +#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() +#include "pycore_pystate.h" // _PyThreadState_GET() + +#include "osdefs.h" // DELIM +#include // setlocale() #ifdef HAVE_LANGINFO_H -# include /* nl_langinfo(CODESET) */ +# include // nl_langinfo(CODESET) #endif #if defined(MS_WINDOWS) || defined(__CYGWIN__) -# include /* GetACP() */ +# include // GetACP() # ifdef HAVE_IO_H # include # endif # ifdef HAVE_FCNTL_H -# include /* O_BINARY */ +# include // O_BINARY # endif #endif +#ifndef PLATLIBDIR +# error "PLATLIBDIR macro must be defined" +#endif + /* --- Command line options --------------------------------------- */ @@ -66,6 +72,7 @@ static const char usage_3[] = "\ -X opt : set implementation-specific option. The following options are available:\n\ \n\ -X faulthandler: enable faulthandler\n\ + -X oldparser: enable the traditional LL(1) parser; also PYTHONOLDPARSER\n\ -X showrefcount: output the total reference count and number of used\n\ memory blocks when the program finishes or after each statement in the\n\ interactive interpreter. This only works on debug builds\n\ @@ -73,9 +80,6 @@ static const char usage_3[] = "\ tracemalloc module. By default, only the most recent frame is stored in a\n\ traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a\n\ traceback limit of NFRAME frames\n\ - -X showalloccount: output the total count of allocated objects for each\n\ - type when the program finishes. This only works when Python was built with\n\ - COUNT_ALLOCS defined\n\ -X importtime: show how long each import takes. It shows module name,\n\ cumulative time (including nested imports) and self time (excluding\n\ nested imports). Note that its output may be broken in multi-threaded\n\ @@ -110,6 +114,7 @@ PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\ static const char usage_5[] = "PYTHONHOME : alternate directory (or %lc).\n" " The default module search path uses %s.\n" +"PYTHONPLATLIBDIR : override sys.platlibdir.\n" "PYTHONCASEOK : ignore case in 'import' statements (Windows).\n" "PYTHONUTF8: if set to 1, enable the UTF-8 mode.\n" "PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n" @@ -543,8 +548,6 @@ _Py_SetArgcArgv(Py_ssize_t argc, wchar_t * const *argv) } -/* Make the *original* argc/argv available to other modules. - This is rare, but it is needed by the secureware extension. */ void Py_GetArgcArgv(int *argc, wchar_t ***argv) { @@ -588,6 +591,7 @@ PyConfig_Clear(PyConfig *config) CLEAR(config->base_prefix); CLEAR(config->exec_prefix); CLEAR(config->base_exec_prefix); + CLEAR(config->platlibdir); CLEAR(config->filesystem_encoding); CLEAR(config->filesystem_errors); @@ -597,6 +601,8 @@ PyConfig_Clear(PyConfig *config) CLEAR(config->run_module); CLEAR(config->run_filename); CLEAR(config->check_hash_pycs_mode); + + _PyWideStringList_Clear(&config->_orig_argv); #undef CLEAR } @@ -632,9 +638,11 @@ _PyConfig_InitCompatConfig(PyConfig *config) config->check_hash_pycs_mode = NULL; config->pathconfig_warnings = -1; config->_init_main = 1; + config->_isolated_interpreter = 0; #ifdef MS_WINDOWS config->legacy_windows_stdio = -1; #endif + config->_use_peg_parser = 1; } @@ -792,6 +800,7 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_ATTR(isolated); COPY_ATTR(use_environment); COPY_ATTR(dev_mode); + COPY_ATTR(_use_peg_parser); COPY_ATTR(install_signal_handlers); COPY_ATTR(use_hash_seed); COPY_ATTR(hash_seed); @@ -800,7 +809,6 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_ATTR(tracemalloc); COPY_ATTR(import_time); COPY_ATTR(show_ref_count); - COPY_ATTR(show_alloc_count); COPY_ATTR(dump_refs); COPY_ATTR(malloc_stats); @@ -822,6 +830,7 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_WSTR_ATTR(base_prefix); COPY_WSTR_ATTR(exec_prefix); COPY_WSTR_ATTR(base_exec_prefix); + COPY_WSTR_ATTR(platlibdir); COPY_ATTR(site_import); COPY_ATTR(bytes_warning); @@ -849,6 +858,8 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_WSTR_ATTR(check_hash_pycs_mode); COPY_ATTR(pathconfig_warnings); COPY_ATTR(_init_main); + COPY_ATTR(_isolated_interpreter); + COPY_WSTRLIST(_orig_argv); #undef COPY_ATTR #undef COPY_WSTR_ATTR @@ -896,6 +907,7 @@ config_as_dict(const PyConfig *config) SET_ITEM_INT(isolated); SET_ITEM_INT(use_environment); SET_ITEM_INT(dev_mode); + SET_ITEM_INT(_use_peg_parser); SET_ITEM_INT(install_signal_handlers); SET_ITEM_INT(use_hash_seed); SET_ITEM_UINT(hash_seed); @@ -903,7 +915,6 @@ config_as_dict(const PyConfig *config) SET_ITEM_INT(tracemalloc); SET_ITEM_INT(import_time); SET_ITEM_INT(show_ref_count); - SET_ITEM_INT(show_alloc_count); SET_ITEM_INT(dump_refs); SET_ITEM_INT(malloc_stats); SET_ITEM_WSTR(filesystem_encoding); @@ -923,6 +934,7 @@ config_as_dict(const PyConfig *config) SET_ITEM_WSTR(base_prefix); SET_ITEM_WSTR(exec_prefix); SET_ITEM_WSTR(base_exec_prefix); + SET_ITEM_WSTR(platlibdir); SET_ITEM_INT(site_import); SET_ITEM_INT(bytes_warning); SET_ITEM_INT(inspect); @@ -948,6 +960,8 @@ config_as_dict(const PyConfig *config) SET_ITEM_WSTR(check_hash_pycs_mode); SET_ITEM_INT(pathconfig_warnings); SET_ITEM_INT(_init_main); + SET_ITEM_INT(_isolated_interpreter); + SET_ITEM_WSTRLIST(_orig_argv); return dict; @@ -1119,7 +1133,7 @@ config_init_program_name(PyConfig *config) or rather, to work around Apple's overly strict requirements of the process name. However, we still need a usable sys.executable, so the actual executable path is passed in an environment variable. - See Lib/plat-mac/bundlebuiler.py for details about the bootstrap + See Lib/plat-mac/bundlebuilder.py for details about the bootstrap script. */ const char *p = config_get_env(config, "PYTHONEXECUTABLE"); if (p != NULL) { @@ -1332,6 +1346,14 @@ config_read_env_vars(PyConfig *config) } } + if(config->platlibdir == NULL) { + status = CONFIG_GET_ENV_DUP(config, &config->platlibdir, + L"PYTHONPLATLIBDIR", "PYTHONPLATLIBDIR"); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } + if (config->use_hash_seed < 0) { status = config_init_hash_seed(config); if (_PyStatus_EXCEPTION(status)) { @@ -1431,6 +1453,11 @@ config_read_complex_options(PyConfig *config) config->import_time = 1; } + if (config_get_env(config, "PYTHONOLDPARSER") + || config_get_xoption(config, L"oldparser")) { + config->_use_peg_parser = 0; + } + PyStatus status; if (config->tracemalloc < 0) { status = config_init_tracemalloc(config); @@ -1450,7 +1477,7 @@ config_read_complex_options(PyConfig *config) static const wchar_t * -config_get_stdio_errors(const PyConfig *config) +config_get_stdio_errors(void) { #ifndef MS_WINDOWS const char *loc = setlocale(LC_CTYPE, NULL); @@ -1606,7 +1633,7 @@ config_init_stdio_encoding(PyConfig *config, } } if (config->stdio_errors == NULL) { - const wchar_t *errors = config_get_stdio_errors(config); + const wchar_t *errors = config_get_stdio_errors(); assert(errors != NULL); status = PyConfig_SetString(config, &config->stdio_errors, errors); @@ -1702,9 +1729,6 @@ config_read(PyConfig *config) if (config_get_xoption(config, L"showrefcount")) { config->show_ref_count = 1; } - if (config_get_xoption(config, L"showalloccount")) { - config->show_alloc_count = 1; - } status = config_read_complex_options(config); if (_PyStatus_EXCEPTION(status)) { @@ -1725,6 +1749,14 @@ config_read(PyConfig *config) } } + if(config->platlibdir == NULL) { + status = CONFIG_SET_BYTES_STR(config, &config->platlibdir, PLATLIBDIR, + "PLATLIBDIR macro"); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } + if (config->_install_importlib) { status = _PyConfig_InitPathConfig(config); if (_PyStatus_EXCEPTION(status)) { @@ -1826,7 +1858,7 @@ config_init_stdio(const PyConfig *config) - set Py_xxx global configuration variables - initialize C standard streams (stdin, stdout, stderr) */ -void +PyStatus _PyConfig_Write(const PyConfig *config, _PyRuntimeState *runtime) { config_set_global_vars(config); @@ -1840,6 +1872,13 @@ _PyConfig_Write(const PyConfig *config, _PyRuntimeState *runtime) preconfig->isolated = config->isolated; preconfig->use_environment = config->use_environment; preconfig->dev_mode = config->dev_mode; + + if (_Py_SetArgcArgv(config->_orig_argv.length, + config->_orig_argv.items) < 0) + { + return _PyStatus_NO_MEMORY(); + } + return _PyStatus_OK(); } @@ -2241,6 +2280,7 @@ config_update_argv(PyConfig *config, Py_ssize_t opt_index) /* Force sys.argv[0] = '-m'*/ arg0 = L"-m"; } + if (arg0 != NULL) { arg0 = _PyMem_RawWcsdup(arg0); if (arg0 == NULL) { @@ -2291,6 +2331,37 @@ core_read_precmdline(PyConfig *config, _PyPreCmdline *precmdline) } +/* Get run_filename absolute path */ +static PyStatus +config_run_filename_abspath(PyConfig *config) +{ + if (!config->run_filename) { + return _PyStatus_OK(); + } + +#ifndef MS_WINDOWS + if (_Py_isabs(config->run_filename)) { + /* path is already absolute */ + return _PyStatus_OK(); + } +#endif + + wchar_t *abs_filename; + if (_Py_abspath(config->run_filename, &abs_filename) < 0) { + /* failed to get the absolute path of the command line filename: + ignore the error, keep the relative path */ + return _PyStatus_OK(); + } + if (abs_filename == NULL) { + return _PyStatus_NO_MEMORY(); + } + + PyMem_RawFree(config->run_filename); + config->run_filename = abs_filename; + return _PyStatus_OK(); +} + + static PyStatus config_read_cmdline(PyConfig *config) { @@ -2317,11 +2388,22 @@ config_read_cmdline(PyConfig *config) goto done; } + status = config_run_filename_abspath(config); + if (_PyStatus_EXCEPTION(status)) { + goto done; + } + status = config_update_argv(config, opt_index); if (_PyStatus_EXCEPTION(status)) { goto done; } } + else { + status = config_run_filename_abspath(config); + if (_PyStatus_EXCEPTION(status)) { + goto done; + } + } if (config->use_environment) { status = config_init_env_warnoptions(config, &env_warnoptions); @@ -2420,7 +2502,6 @@ PyStatus PyConfig_Read(PyConfig *config) { PyStatus status; - PyWideStringList orig_argv = _PyWideStringList_INIT; status = _Py_PreInitializeFromConfig(config, NULL); if (_PyStatus_EXCEPTION(status)) { @@ -2429,8 +2510,13 @@ PyConfig_Read(PyConfig *config) config_get_global_vars(config); - if (_PyWideStringList_Copy(&orig_argv, &config->argv) < 0) { - return _PyStatus_NO_MEMORY(); + if (config->_orig_argv.length == 0 + && !(config->argv.length == 1 + && wcscmp(config->argv.items[0], L"") == 0)) + { + if (_PyWideStringList_Copy(&config->_orig_argv, &config->argv) < 0) { + return _PyStatus_NO_MEMORY(); + } } _PyPreCmdline precmdline = _PyPreCmdline_INIT; @@ -2461,15 +2547,11 @@ PyConfig_Read(PyConfig *config) goto done; } - if (_Py_SetArgcArgv(orig_argv.length, orig_argv.items) < 0) { - status = _PyStatus_NO_MEMORY(); - goto done; - } - /* Check config consistency */ assert(config->isolated >= 0); assert(config->use_environment >= 0); assert(config->dev_mode >= 0); + assert(config->_use_peg_parser >= 0); assert(config->install_signal_handlers >= 0); assert(config->use_hash_seed >= 0); assert(config->faulthandler >= 0); @@ -2504,6 +2586,7 @@ PyConfig_Read(PyConfig *config) assert(config->exec_prefix != NULL); assert(config->base_exec_prefix != NULL); } + assert(config->platlibdir != NULL); assert(config->filesystem_encoding != NULL); assert(config->filesystem_errors != NULL); assert(config->stdio_encoding != NULL); @@ -2516,11 +2599,11 @@ PyConfig_Read(PyConfig *config) assert(config->check_hash_pycs_mode != NULL); assert(config->_install_importlib >= 0); assert(config->pathconfig_warnings >= 0); + assert(_PyWideStringList_CheckConsistency(&config->_orig_argv)); status = _PyStatus_OK(); done: - _PyWideStringList_Clear(&orig_argv); _PyPreCmdline_Clear(&precmdline); return status; } @@ -2548,8 +2631,8 @@ _Py_GetConfigsAsDict(void) Py_CLEAR(dict); /* pre config */ - PyInterpreterState *interp = _PyInterpreterState_Get(); - const PyPreConfig *pre_config = &_PyRuntime.preconfig; + PyThreadState *tstate = _PyThreadState_GET(); + const PyPreConfig *pre_config = &tstate->interp->runtime->preconfig; dict = _PyPreConfig_AsDict(pre_config); if (dict == NULL) { goto error; @@ -2560,7 +2643,7 @@ _Py_GetConfigsAsDict(void) Py_CLEAR(dict); /* core config */ - const PyConfig *config = &interp->config; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); dict = config_as_dict(config); if (dict == NULL) { goto error; @@ -2593,7 +2676,7 @@ init_dump_ascii_wstr(const wchar_t *str) if (ch == L'\'') { PySys_WriteStderr("\\'"); } else if (0x20 <= ch && ch < 0x7f) { - PySys_WriteStderr("%lc", ch); + PySys_WriteStderr("%c", ch); } else if (ch <= 0xff) { PySys_WriteStderr("\\x%02x", ch); @@ -2627,7 +2710,7 @@ _Py_DumpPathConfig(PyThreadState *tstate) PySys_WriteStderr("\n"); \ } while (0) - PyConfig *config = &tstate->interp->config; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); DUMP_CONFIG("PYTHONHOME", home); DUMP_CONFIG("PYTHONPATH", pythonpath_env); DUMP_CONFIG("program name", program_name); @@ -2654,6 +2737,7 @@ _Py_DumpPathConfig(PyThreadState *tstate) DUMP_SYS(_base_executable); DUMP_SYS(base_prefix); DUMP_SYS(base_exec_prefix); + DUMP_SYS(platlibdir); DUMP_SYS(executable); DUMP_SYS(prefix); DUMP_SYS(exec_prefix); diff --git a/Python/marshal.c b/Python/marshal.c index a9ba7a43..c4538bd3 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -12,7 +12,7 @@ #include "longintrepr.h" #include "code.h" #include "marshal.h" -#include "../Modules/hashtable.h" +#include "pycore_hashtable.h" /*[clinic input] module marshal @@ -83,7 +83,7 @@ typedef struct { int depth; PyObject *str; char *ptr; - char *end; + const char *end; char *buf; _Py_hashtable_t *hashtable; int version; @@ -114,7 +114,7 @@ w_reserve(WFILE *p, Py_ssize_t needed) } assert(p->str != NULL); pos = p->ptr - p->buf; - size = PyBytes_Size(p->str); + size = PyBytes_GET_SIZE(p->str); if (size > 16*1024*1024) delta = (size >> 3); /* 12.5% overallocation */ else @@ -126,7 +126,7 @@ w_reserve(WFILE *p, Py_ssize_t needed) } size += delta; if (_PyBytes_Resize(&p->str, size) != 0) { - p->ptr = p->buf = p->end = NULL; + p->end = p->ptr = p->buf = NULL; return 0; } else { @@ -138,7 +138,7 @@ w_reserve(WFILE *p, Py_ssize_t needed) } static void -w_string(const char *s, Py_ssize_t n, WFILE *p) +w_string(const void *s, Py_ssize_t n, WFILE *p) { Py_ssize_t m; if (!n || p->ptr == NULL) @@ -194,14 +194,14 @@ w_long(long x, WFILE *p) #endif static void -w_pstring(const char *s, Py_ssize_t n, WFILE *p) +w_pstring(const void *s, Py_ssize_t n, WFILE *p) { W_SIZE(n, p); w_string(s, n, p); } static void -w_short_pstring(const char *s, Py_ssize_t n, WFILE *p) +w_short_pstring(const void *s, Py_ssize_t n, WFILE *p) { w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p); w_string(s, n, p); @@ -274,21 +274,18 @@ w_float_bin(double v, WFILE *p) p->error = WFERR_UNMARSHALLABLE; return; } - w_string((const char *)buf, 8, p); + w_string(buf, 8, p); } static void w_float_str(double v, WFILE *p) { - int n; char *buf = PyOS_double_to_string(v, 'g', 17, 0, NULL); if (!buf) { p->error = WFERR_NOMEMORY; return; } - n = (int)strlen(buf); - w_byte(n, p); - w_string(buf, n, p); + w_short_pstring(buf, strlen(buf), p); PyMem_Free(buf); } @@ -305,17 +302,17 @@ w_ref(PyObject *v, char *flag, WFILE *p) if (Py_REFCNT(v) == 1) return 0; - entry = _Py_HASHTABLE_GET_ENTRY(p->hashtable, v); + entry = _Py_hashtable_get_entry(p->hashtable, v); if (entry != NULL) { /* write the reference index to the stream */ - _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, entry, w); + w = (int)(uintptr_t)entry->value; /* we don't store "long" indices in the dict */ assert(0 <= w && w <= 0x7fffffff); w_byte(TYPE_REF, p); w_long(w, p); return 1; } else { - size_t s = p->hashtable->entries; + size_t s = p->hashtable->nentries; /* we don't support long indices */ if (s >= 0x7fffffff) { PyErr_SetString(PyExc_ValueError, "too many objects"); @@ -323,7 +320,7 @@ w_ref(PyObject *v, char *flag, WFILE *p) } w = (int)s; Py_INCREF(v); - if (_Py_HASHTABLE_SET(p->hashtable, v, w) < 0) { + if (_Py_hashtable_set(p->hashtable, v, (void *)(uintptr_t)w) < 0) { Py_DECREF(v); goto err; } @@ -378,11 +375,10 @@ w_complex_object(PyObject *v, char flag, WFILE *p) Py_ssize_t i, n; if (PyLong_CheckExact(v)) { - long x = PyLong_AsLong(v); - if ((x == -1) && PyErr_Occurred()) { - PyLongObject *ob = (PyLongObject *)v; - PyErr_Clear(); - w_PyLong(ob, flag, p); + int overflow; + long x = PyLong_AsLongAndOverflow(v, &overflow); + if (overflow) { + w_PyLong((PyLongObject *)v, flag, p); } else { #if SIZEOF_LONG > 4 @@ -433,7 +429,7 @@ w_complex_object(PyObject *v, char flag, WFILE *p) W_TYPE(TYPE_SHORT_ASCII_INTERNED, p); else W_TYPE(TYPE_SHORT_ASCII, p); - w_short_pstring((char *) PyUnicode_1BYTE_DATA(v), + w_short_pstring(PyUnicode_1BYTE_DATA(v), PyUnicode_GET_LENGTH(v), p); } else { @@ -441,7 +437,7 @@ w_complex_object(PyObject *v, char flag, WFILE *p) W_TYPE(TYPE_ASCII_INTERNED, p); else W_TYPE(TYPE_ASCII, p); - w_pstring((char *) PyUnicode_1BYTE_DATA(v), + w_pstring(PyUnicode_1BYTE_DATA(v), PyUnicode_GET_LENGTH(v), p); } } @@ -462,7 +458,7 @@ w_complex_object(PyObject *v, char flag, WFILE *p) } } else if (PyTuple_CheckExact(v)) { - n = PyTuple_Size(v); + n = PyTuple_GET_SIZE(v); if (p->version >= 4 && n < 256) { W_TYPE(TYPE_SMALL_TUPLE, p); w_byte((unsigned char)n, p); @@ -496,34 +492,18 @@ w_complex_object(PyObject *v, char flag, WFILE *p) w_object((PyObject *)NULL, p); } else if (PyAnySet_CheckExact(v)) { - PyObject *value, *it; + PyObject *value; + Py_ssize_t pos = 0; + Py_hash_t hash; - if (PyObject_TypeCheck(v, &PySet_Type)) - W_TYPE(TYPE_SET, p); - else + if (PyFrozenSet_CheckExact(v)) W_TYPE(TYPE_FROZENSET, p); - n = PyObject_Size(v); - if (n == -1) { - p->depth--; - p->error = WFERR_UNMARSHALLABLE; - return; - } + else + W_TYPE(TYPE_SET, p); + n = PySet_GET_SIZE(v); W_SIZE(n, p); - it = PyObject_GetIter(v); - if (it == NULL) { - p->depth--; - p->error = WFERR_UNMARSHALLABLE; - return; - } - while ((value = PyIter_Next(it)) != NULL) { + while (_PySet_NextEntry(v, &pos, &value, &hash)) { w_object(value, p); - Py_DECREF(value); - } - Py_DECREF(it); - if (PyErr_Occurred()) { - p->depth--; - p->error = WFERR_UNMARSHALLABLE; - return; } } else if (PyCode_Check(v)) { @@ -565,13 +545,20 @@ w_complex_object(PyObject *v, char flag, WFILE *p) } } +static void +w_decref_entry(void *key) +{ + PyObject *entry_key = (PyObject *)key; + Py_XDECREF(entry_key); +} + static int w_init_refs(WFILE *wf, int version) { if (version >= 3) { - wf->hashtable = _Py_hashtable_new(sizeof(PyObject *), sizeof(int), - _Py_hashtable_hash_ptr, - _Py_hashtable_compare_direct); + wf->hashtable = _Py_hashtable_new_full(_Py_hashtable_hash_ptr, + _Py_hashtable_compare_direct, + w_decref_entry, NULL, NULL); if (wf->hashtable == NULL) { PyErr_NoMemory(); return -1; @@ -580,22 +567,10 @@ w_init_refs(WFILE *wf, int version) return 0; } -static int -w_decref_entry(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry, - void *Py_UNUSED(data)) -{ - PyObject *entry_key; - - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, entry_key); - Py_XDECREF(entry_key); - return 0; -} - static void w_clear_refs(WFILE *wf) { if (wf->hashtable != NULL) { - _Py_hashtable_foreach(wf->hashtable, w_decref_entry, NULL); _Py_hashtable_destroy(wf->hashtable); } } @@ -638,8 +613,8 @@ typedef struct { FILE *fp; int depth; PyObject *readable; /* Stream-like object being read from */ - char *ptr; - char *end; + const char *ptr; + const char *end; char *buf; Py_ssize_t buf_size; PyObject *refs; /* a list */ @@ -652,7 +627,7 @@ r_string(Py_ssize_t n, RFILE *p) if (p->ptr != NULL) { /* Fast path for loads() */ - char *res = p->ptr; + const char *res = p->ptr; Py_ssize_t left = p->end - p->ptr; if (left < n) { PyErr_SetString(PyExc_EOFError, @@ -813,7 +788,7 @@ r_PyLong(RFILE *p) if (ob == NULL) return NULL; - Py_SIZE(ob) = n > 0 ? size : -size; + Py_SET_SIZE(ob, n > 0 ? size : -size); for (i = 0; i < size-1; i++) { d = 0; @@ -1570,8 +1545,8 @@ PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len) PyObject *result; rf.fp = NULL; rf.readable = NULL; - rf.ptr = (char *)str; - rf.end = (char *)str + len; + rf.ptr = str; + rf.end = str + len; rf.buf = NULL; rf.depth = 0; rf.refs = PyList_New(0); @@ -1593,8 +1568,8 @@ PyMarshal_WriteObjectToString(PyObject *x, int version) wf.str = PyBytes_FromStringAndSize((char *)NULL, 50); if (wf.str == NULL) return NULL; - wf.ptr = wf.buf = PyBytes_AS_STRING((PyBytesObject *)wf.str); - wf.end = wf.ptr + PyBytes_Size(wf.str); + wf.ptr = wf.buf = PyBytes_AS_STRING(wf.str); + wf.end = wf.ptr + PyBytes_GET_SIZE(wf.str); wf.error = WFERR_OK; wf.version = version; if (w_init_refs(&wf, version)) { @@ -1604,13 +1579,7 @@ PyMarshal_WriteObjectToString(PyObject *x, int version) w_object(x, &wf); w_clear_refs(&wf); if (wf.str != NULL) { - char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str); - if (wf.ptr - base > PY_SSIZE_T_MAX) { - Py_DECREF(wf.str); - PyErr_SetString(PyExc_OverflowError, - "too much marshal data for a bytes object"); - return NULL; - } + const char *base = PyBytes_AS_STRING(wf.str); if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0) return NULL; } @@ -1659,7 +1628,7 @@ marshal_dump_impl(PyObject *module, PyObject *value, PyObject *file, s = PyMarshal_WriteObjectToString(value, version); if (s == NULL) return NULL; - res = _PyObject_CallMethodIdObjArgs(file, &PyId_write, s, NULL); + res = _PyObject_CallMethodIdOneArg(file, &PyId_write, s); Py_DECREF(s); return res; } @@ -1702,7 +1671,7 @@ marshal_load(PyObject *module, PyObject *file) if (!PyBytes_Check(data)) { PyErr_Format(PyExc_TypeError, "file.read() returned not bytes but %.100s", - data->ob_type->tp_name); + Py_TYPE(data)->tp_name); result = NULL; } else { diff --git a/Python/modsupport.c b/Python/modsupport.c index 50628119..13482c65 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -2,6 +2,7 @@ /* Module support implementation */ #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() #define FLAG_SIZE_T 1 typedef double va_double; @@ -20,7 +21,7 @@ _Py_convert_optional_to_ssize_t(PyObject *obj, void *result) if (obj == Py_None) { return 1; } - else if (PyIndex_Check(obj)) { + else if (_PyIndex_Check(obj)) { limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError); if (limit == -1 && PyErr_Occurred()) { return 0; @@ -681,3 +682,22 @@ PyModule_AddStringConstant(PyObject *m, const char *name, const char *value) Py_DECREF(o); return -1; } + +int +PyModule_AddType(PyObject *module, PyTypeObject *type) +{ + if (PyType_Ready(type) < 0) { + return -1; + } + + const char *name = _PyType_Name(type); + assert(name != NULL); + + Py_INCREF(type); + if (PyModule_AddObject(module, name, (PyObject *)type) < 0) { + Py_DECREF(type); + return -1; + } + + return 0; +} diff --git a/Python/mysnprintf.c b/Python/mysnprintf.c index a08e249b..458ca14d 100644 --- a/Python/mysnprintf.c +++ b/Python/mysnprintf.c @@ -1,6 +1,8 @@ #include "Python.h" -/* snprintf() wrappers. If the platform has vsnprintf, we use it, else we +/* snprintf() and vsnprintf() wrappers. + + If the platform has vsnprintf, we use it, else we emulate it in a half-hearted way. Even if the platform has it, we wrap it because platforms differ in what vsnprintf does in case the buffer is too small: C99 behavior is to return the number of characters that @@ -52,16 +54,17 @@ PyOS_snprintf(char *str, size_t size, const char *format, ...) int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) { + assert(str != NULL); + assert(size > 0); + assert(format != NULL); + int len; /* # bytes written, excluding \0 */ -#ifdef HAVE_SNPRINTF -#define _PyOS_vsnprintf_EXTRA_SPACE 1 +#if defined(_MSC_VER) || defined(HAVE_SNPRINTF) +# define _PyOS_vsnprintf_EXTRA_SPACE 1 #else -#define _PyOS_vsnprintf_EXTRA_SPACE 512 +# define _PyOS_vsnprintf_EXTRA_SPACE 512 char *buffer; #endif - assert(str != NULL); - assert(size > 0); - assert(format != NULL); /* We take a size_t as input but return an int. Sanity check * our input so that it won't cause an overflow in the * vsnprintf return value or the buffer malloc size. */ @@ -70,10 +73,12 @@ PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) goto Done; } -#ifdef HAVE_SNPRINTF +#if defined(_MSC_VER) + len = _vsnprintf(str, size, format, va); +#elif defined(HAVE_SNPRINTF) len = vsnprintf(str, size, format, va); #else - /* Emulate it. */ + /* Emulate vsnprintf(). */ buffer = PyMem_MALLOC(size + _PyOS_vsnprintf_EXTRA_SPACE); if (buffer == NULL) { len = -666; @@ -81,12 +86,12 @@ PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) } len = vsprintf(buffer, format, va); - if (len < 0) + if (len < 0) { /* ignore the error */; - - else if ((size_t)len >= size + _PyOS_vsnprintf_EXTRA_SPACE) - Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf"); - + } + else if ((size_t)len >= size + _PyOS_vsnprintf_EXTRA_SPACE) { + _Py_FatalErrorFunc(__func__, "Buffer overflow"); + } else { const size_t to_copy = (size_t)len < size ? (size_t)len : size - 1; @@ -96,9 +101,11 @@ PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) } PyMem_FREE(buffer); #endif + Done: - if (size > 0) + if (size > 0) { str[size-1] = '\0'; + } return len; #undef _PyOS_vsnprintf_EXTRA_SPACE } diff --git a/Python/mystrtoul.c b/Python/mystrtoul.c index 7ab58142..19fa57aa 100644 --- a/Python/mystrtoul.c +++ b/Python/mystrtoul.c @@ -99,7 +99,7 @@ PyOS_strtoul(const char *str, char **ptr, int base) int ovlimit; /* required digits to overflow */ /* skip leading white space */ - while (*str && Py_ISSPACE(Py_CHARMASK(*str))) + while (*str && Py_ISSPACE(*str)) ++str; /* check for leading 0b, 0o or 0x for auto-base or base 16 */ @@ -138,7 +138,7 @@ PyOS_strtoul(const char *str, char **ptr, int base) /* skip all zeroes... */ while (*str == '0') ++str; - while (Py_ISSPACE(Py_CHARMASK(*str))) + while (Py_ISSPACE(*str)) ++str; if (ptr) *ptr = (char *)str; @@ -266,7 +266,7 @@ PyOS_strtol(const char *str, char **ptr, int base) unsigned long uresult; char sign; - while (*str && Py_ISSPACE(Py_CHARMASK(*str))) + while (*str && Py_ISSPACE(*str)) str++; sign = *str; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index e82959be..538fdbe3 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -47,12 +47,12 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_RERAISE, + &&TARGET_WITH_EXCEPT_START, &&TARGET_GET_AITER, &&TARGET_GET_ANEXT, &&TARGET_BEFORE_ASYNC_WITH, - &&TARGET_BEGIN_FINALLY, + &&_unknown_opcode, &&TARGET_END_ASYNC_FOR, &&TARGET_INPLACE_ADD, &&TARGET_INPLACE_SUBTRACT, @@ -73,21 +73,21 @@ static void *opcode_targets[256] = { &&TARGET_LOAD_BUILD_CLASS, &&TARGET_YIELD_FROM, &&TARGET_GET_AWAITABLE, - &&_unknown_opcode, + &&TARGET_LOAD_ASSERTION_ERROR, &&TARGET_INPLACE_LSHIFT, &&TARGET_INPLACE_RSHIFT, &&TARGET_INPLACE_AND, &&TARGET_INPLACE_XOR, &&TARGET_INPLACE_OR, &&_unknown_opcode, - &&TARGET_WITH_CLEANUP_START, - &&TARGET_WITH_CLEANUP_FINISH, + &&_unknown_opcode, + &&TARGET_LIST_TO_TUPLE, &&TARGET_RETURN_VALUE, &&TARGET_IMPORT_STAR, &&TARGET_SETUP_ANNOTATIONS, &&TARGET_YIELD_VALUE, &&TARGET_POP_BLOCK, - &&TARGET_END_FINALLY, + &&_unknown_opcode, &&TARGET_POP_EXCEPT, &&TARGET_STORE_NAME, &&TARGET_DELETE_NAME, @@ -116,11 +116,11 @@ static void *opcode_targets[256] = { &&TARGET_POP_JUMP_IF_FALSE, &&TARGET_POP_JUMP_IF_TRUE, &&TARGET_LOAD_GLOBAL, + &&TARGET_IS_OP, + &&TARGET_CONTAINS_OP, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_JUMP_IF_NOT_EXC_MATCH, &&TARGET_SETUP_FINALLY, &&_unknown_opcode, &&TARGET_LOAD_FAST, @@ -148,23 +148,23 @@ static void *opcode_targets[256] = { &&TARGET_SET_ADD, &&TARGET_MAP_ADD, &&TARGET_LOAD_CLASSDEREF, - &&TARGET_BUILD_LIST_UNPACK, - &&TARGET_BUILD_MAP_UNPACK, - &&TARGET_BUILD_MAP_UNPACK_WITH_CALL, - &&TARGET_BUILD_TUPLE_UNPACK, - &&TARGET_BUILD_SET_UNPACK, + &&_unknown_opcode, + &&_unknown_opcode, + &&_unknown_opcode, + &&_unknown_opcode, + &&_unknown_opcode, &&TARGET_SETUP_ASYNC_WITH, &&TARGET_FORMAT_VALUE, &&TARGET_BUILD_CONST_KEY_MAP, &&TARGET_BUILD_STRING, - &&TARGET_BUILD_TUPLE_UNPACK_WITH_CALL, + &&_unknown_opcode, &&_unknown_opcode, &&TARGET_LOAD_METHOD, &&TARGET_CALL_METHOD, - &&TARGET_CALL_FINALLY, - &&TARGET_POP_FINALLY, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_LIST_EXTEND, + &&TARGET_SET_UPDATE, + &&TARGET_DICT_MERGE, + &&TARGET_DICT_UPDATE, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 60c10449..9a302213 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -1,13 +1,15 @@ /* Path configuration like module_search_path (sys.path) */ #include "Python.h" -#include "osdefs.h" +#include "osdefs.h" // DELIM #include "pycore_initconfig.h" #include "pycore_fileutils.h" #include "pycore_pathconfig.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" +#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() #include +#ifdef MS_WINDOWS +# include // GetFullPathNameW(), MAX_PATH +#endif #ifdef __cplusplus extern "C" { @@ -201,9 +203,8 @@ config_init_module_search_paths(PyConfig *config, _PyPathConfig *pathconfig) const wchar_t *sys_path = pathconfig->module_search_path; const wchar_t delim = DELIM; - const wchar_t *p = sys_path; while (1) { - p = wcschr(sys_path, delim); + const wchar_t *p = wcschr(sys_path, delim); if (p == NULL) { p = sys_path + wcslen(sys_path); /* End of string */ } @@ -439,6 +440,12 @@ pathconfig_global_init(void) /* External interface */ +static void _Py_NO_RETURN +path_out_of_memory(const char *func) +{ + _Py_FatalErrorFunc(func, "out of memory"); +} + void Py_SetPath(const wchar_t *path) { @@ -470,7 +477,7 @@ Py_SetPath(const wchar_t *path) || _Py_path_config.exec_prefix == NULL || _Py_path_config.module_search_path == NULL) { - Py_FatalError("Py_SetPath() failed: out of memory"); + path_out_of_memory(__func__); } } @@ -491,7 +498,7 @@ Py_SetPythonHome(const wchar_t *home) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); if (_Py_path_config.home == NULL) { - Py_FatalError("Py_SetPythonHome() failed: out of memory"); + path_out_of_memory(__func__); } } @@ -512,7 +519,7 @@ Py_SetProgramName(const wchar_t *program_name) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); if (_Py_path_config.program_name == NULL) { - Py_FatalError("Py_SetProgramName() failed: out of memory"); + path_out_of_memory(__func__); } } @@ -532,7 +539,7 @@ _Py_SetProgramFullPath(const wchar_t *program_full_path) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); if (_Py_path_config.program_full_path == NULL) { - Py_FatalError("_Py_SetProgramFullPath() failed: out of memory"); + path_out_of_memory(__func__); } } @@ -731,16 +738,20 @@ _PyPathConfig_ComputeSysPath0(const PyWideStringList *argv, PyObject **path0_p) #endif /* Search for a prefix value in an environment file (pyvenv.cfg). - If found, copy it into the provided buffer. */ -int + + - If found, copy it into *value_p: string which must be freed by + PyMem_RawFree(). + - If not found, *value_p is set to NULL. +*/ +PyStatus _Py_FindEnvConfigValue(FILE *env_file, const wchar_t *key, - wchar_t *value, size_t value_size) + wchar_t **value_p) { - int result = 0; /* meaning not found */ + *value_p = NULL; + char buffer[MAXPATHLEN * 2 + 1]; /* allow extra for key, '=', etc. */ buffer[Py_ARRAY_LENGTH(buffer)-1] = '\0'; - fseek(env_file, 0, SEEK_SET); while (!feof(env_file)) { char * p = fgets(buffer, Py_ARRAY_LENGTH(buffer) - 1, env_file); @@ -767,18 +778,24 @@ _Py_FindEnvConfigValue(FILE *env_file, const wchar_t *key, if ((tok != NULL) && !wcscmp(tok, L"=")) { tok = WCSTOK(NULL, L"\r\n", &state); if (tok != NULL) { - wcsncpy(value, tok, value_size - 1); - value[value_size - 1] = L'\0'; - result = 1; + *value_p = _PyMem_RawWcsdup(tok); PyMem_RawFree(tmpbuffer); - break; + + if (*value_p == NULL) { + return _PyStatus_NO_MEMORY(); + } + + /* found */ + return _PyStatus_OK(); } } } PyMem_RawFree(tmpbuffer); } } - return result; + + /* not found */ + return _PyStatus_OK(); } #ifdef __cplusplus diff --git a/Python/peephole.c b/Python/peephole.c index d8596484..84de1abc 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -12,10 +12,10 @@ #define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD) #define CONDITIONAL_JUMP(op) (op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \ - || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP) + || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP || op==JUMP_IF_NOT_EXC_MATCH) #define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE \ || op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \ - || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP) + || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP || op==JUMP_IF_NOT_EXC_MATCH) #define JUMPS_ON_TRUE(op) (op==POP_JUMP_IF_TRUE || op==JUMP_IF_TRUE_OR_POP) #define GETJUMPTGT(arr, i) (get_arg(arr, i) / sizeof(_Py_CODEUNIT) + \ (ABSOLUTE_JUMP(_Py_OPCODE(arr[i])) ? 0 : i+1)) @@ -194,11 +194,11 @@ markblocks(_Py_CODEUNIT *code, Py_ssize_t len) case JUMP_IF_TRUE_OR_POP: case POP_JUMP_IF_FALSE: case POP_JUMP_IF_TRUE: + case JUMP_IF_NOT_EXC_MATCH: case JUMP_ABSOLUTE: case SETUP_FINALLY: case SETUP_WITH: case SETUP_ASYNC_WITH: - case CALL_FINALLY: j = GETJUMPTGT(code, i); assert(j < len); blocks[j] = 1; @@ -432,14 +432,10 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, /* Remove unreachable ops after RETURN */ case RETURN_VALUE: h = i + 1; - /* END_FINALLY should be kept since it denotes the end of - the 'finally' block in frame_setlineno() in frameobject.c. - SETUP_FINALLY should be kept for balancing. - */ - while (h < codelen && ISBASICBLOCK(blocks, i, h) && - _Py_OPCODE(codestr[h]) != END_FINALLY) + while (h < codelen && ISBASICBLOCK(blocks, i, h)) { - if (_Py_OPCODE(codestr[h]) == SETUP_FINALLY) { + /* Leave SETUP_FINALLY and RERAISE in place to help find block limits. */ + if (_Py_OPCODE(codestr[h]) == SETUP_FINALLY || _Py_OPCODE(codestr[h]) == RERAISE) { while (h > i + 1 && _Py_OPCODE(codestr[h - 1]) == EXTENDED_ARG) { @@ -498,6 +494,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case POP_JUMP_IF_TRUE: case JUMP_IF_FALSE_OR_POP: case JUMP_IF_TRUE_OR_POP: + case JUMP_IF_NOT_EXC_MATCH: j = blocks[j / sizeof(_Py_CODEUNIT)] * sizeof(_Py_CODEUNIT); break; @@ -506,7 +503,6 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case SETUP_FINALLY: case SETUP_WITH: case SETUP_ASYNC_WITH: - case CALL_FINALLY: j = blocks[j / sizeof(_Py_CODEUNIT) + i + 1] - blocks[i] - 1; j *= sizeof(_Py_CODEUNIT); break; @@ -515,8 +511,12 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, if (instrsize(j) > ilen) { goto exitUnchanged; } - assert(ilen <= INT_MAX); /* If instrsize(j) < ilen, we'll emit EXTENDED_ARG 0 */ + if (ilen > 4) { + /* Can only happen when PyCode_Optimize() is called with + malformed bytecode. */ + goto exitUnchanged; + } write_op_arg(codestr + h, opcode, j, (int)ilen); h += ilen; } diff --git a/Python/preconfig.c b/Python/preconfig.c index 89a6227f..262738fa 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -1,8 +1,9 @@ #include "Python.h" -#include "pycore_initconfig.h" -#include "pycore_getopt.h" -#include "pycore_pystate.h" /* _PyRuntime_Initialize() */ -#include /* setlocale() */ +#include "pycore_getopt.h" // _PyOS_GetOpt() +#include "pycore_initconfig.h" // _PyArgv +#include "pycore_pymem.h" // _PyMem_GetAllocatorName() +#include "pycore_runtime.h" // _PyRuntime_Initialize() +#include // setlocale() #define DECODE_LOCALE_ERR(NAME, LEN) \ diff --git a/Python/pyhash.c b/Python/pyhash.c index c0355ae6..3843079f 100644 --- a/Python/pyhash.c +++ b/Python/pyhash.c @@ -129,16 +129,22 @@ _Py_HashDouble(double v) } Py_hash_t -_Py_HashPointer(void *p) +_Py_HashPointerRaw(const void *p) { - Py_hash_t x; size_t y = (size_t)p; /* bottom 3 or 4 bits are likely to be 0; rotate y by 4 to avoid excessive hash collisions for dicts and sets */ y = (y >> 4) | (y << (8 * SIZEOF_VOID_P - 4)); - x = (Py_hash_t)y; - if (x == -1) + return (Py_hash_t)y; +} + +Py_hash_t +_Py_HashPointer(const void *p) +{ + Py_hash_t x = _Py_HashPointerRaw(p); + if (x == -1) { x = -2; + } return x; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index dc2d13db..cfb3a7d9 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -4,48 +4,41 @@ #include "Python-ast.h" #undef Yield /* undefine macro conflicting with */ -#include "pycore_ceval.h" -#include "pycore_context.h" -#include "pycore_initconfig.h" -#include "pycore_fileutils.h" -#include "pycore_hamt.h" -#include "pycore_pathconfig.h" -#include "pycore_pylifecycle.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "pycore_traceback.h" -#include "grammar.h" -#include "node.h" -#include "token.h" -#include "parsetok.h" -#include "errcode.h" -#include "code.h" -#include "symtable.h" -#include "ast.h" -#include "marshal.h" -#include "osdefs.h" -#include -#ifdef HAVE_SIGNAL_H -#include -#endif +#include "pycore_ceval.h" // _PyEval_FiniGIL() +#include "pycore_context.h" // _PyContext_Init() +#include "pycore_fileutils.h" // _Py_ResetForceASCII() +#include "pycore_import.h" // _PyImport_Cleanup() +#include "pycore_initconfig.h" // _PyStatus_OK() +#include "pycore_object.h" // _PyDebug_PrintTotalRefs() +#include "pycore_pathconfig.h" // _PyConfig_WritePathConfig() +#include "pycore_pyerrors.h" // _PyErr_Occurred() +#include "pycore_pylifecycle.h" // _PyErr_Print() +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_sysmodule.h" // _PySys_ClearAuditHooks() +#include "pycore_traceback.h" // _Py_DumpTracebackThreads() + +#include "grammar.h" // PyGrammar_RemoveAccelerators() +#include // setlocale() -#ifdef MS_WINDOWS -#include "malloc.h" /* for alloca */ +#ifdef HAVE_SIGNAL_H +# include // SIG_IGN #endif #ifdef HAVE_LANGINFO_H -#include +# include // nl_langinfo(CODESET) #endif #ifdef MS_WINDOWS -#undef BYTE -#include "windows.h" +# undef BYTE +# include "windows.h" -extern PyTypeObject PyWindowsConsoleIO_Type; -#define PyWindowsConsoleIO_Check(op) (PyObject_TypeCheck((op), &PyWindowsConsoleIO_Type)) + extern PyTypeObject PyWindowsConsoleIO_Type; +# define PyWindowsConsoleIO_Check(op) \ + (PyObject_TypeCheck((op), &PyWindowsConsoleIO_Type)) #endif + _Py_IDENTIFIER(flush); _Py_IDENTIFIER(name); _Py_IDENTIFIER(stdin); @@ -59,13 +52,14 @@ extern "C" { extern grammar _PyParser_Grammar; /* From graminit.c */ -/* Forward */ +/* Forward declarations */ static PyStatus add_main_module(PyInterpreterState *interp); -static PyStatus init_import_size(void); -static PyStatus init_sys_streams(PyInterpreterState *interp); -static PyStatus init_signals(void); -static void call_py_exitfuncs(PyInterpreterState *); -static void wait_for_thread_shutdown(void); +static PyStatus init_import_site(void); +static PyStatus init_set_builtins_open(void); +static PyStatus init_sys_streams(PyThreadState *tstate); +static PyStatus init_signals(PyThreadState *tstate); +static void call_py_exitfuncs(PyThreadState *tstate); +static void wait_for_thread_shutdown(PyThreadState *tstate); static void call_ll_exitfuncs(_PyRuntimeState *runtime); int _Py_UnhandledKeyboardInterrupt = 0; @@ -99,7 +93,7 @@ _PyRuntime_Finalize(void) int _Py_IsFinalizing(void) { - return _PyRuntime.finalizing != NULL; + return _PyRuntimeState_GetFinalizing(&_PyRuntime) != NULL; } /* Hack to force loading of object files */ @@ -146,12 +140,13 @@ Py_IsInitialized(void) */ static PyStatus -init_importlib(PyInterpreterState *interp, PyObject *sysmod) +init_importlib(PyThreadState *tstate, PyObject *sysmod) { PyObject *importlib; PyObject *impmod; PyObject *value; - int verbose = interp->config.verbose; + PyInterpreterState *interp = tstate->interp; + int verbose = _PyInterpreterState_GetConfig(interp)->verbose; /* Import _importlib through its frozen version, _frozen_importlib. */ if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) { @@ -187,7 +182,7 @@ init_importlib(PyInterpreterState *interp, PyObject *sysmod) /* Install importlib as the implementation of import */ value = PyObject_CallMethod(importlib, "_install", "OO", sysmod, impmod); if (value == NULL) { - PyErr_Print(); + _PyErr_Print(tstate); return _PyStatus_ERR("importlib install failed"); } Py_DECREF(value); @@ -197,17 +192,17 @@ init_importlib(PyInterpreterState *interp, PyObject *sysmod) } static PyStatus -init_importlib_external(PyInterpreterState *interp) +init_importlib_external(PyThreadState *tstate) { PyObject *value; - value = PyObject_CallMethod(interp->importlib, + value = PyObject_CallMethod(tstate->interp->importlib, "_install_external_importers", ""); if (value == NULL) { - PyErr_Print(); + _PyErr_Print(tstate); return _PyStatus_ERR("external importer setup failed"); } Py_DECREF(value); - return _PyImportZip_Init(interp); + return _PyImportZip_Init(tstate); } /* Helper functions to better handle the legacy C locale @@ -256,6 +251,7 @@ _Py_LegacyLocaleDetected(int warn) #endif } +#ifndef MS_WINDOWS static const char *_C_LOCALE_WARNING = "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII " "encoding), which may cause Unicode compatibility problems. Using C.UTF-8, " @@ -270,6 +266,7 @@ emit_stderr_warning_for_legacy_locale(_PyRuntimeState *runtime) PySys_FormatStderr("%s", _C_LOCALE_WARNING); } } +#endif /* !defined(MS_WINDOWS) */ typedef struct _CandidateLocale { const char *locale_name; /* The locale to try as a coercion target */ @@ -448,7 +445,7 @@ _Py_SetLocaleFromEnv(int category) static PyStatus pyinit_core_reconfigure(_PyRuntimeState *runtime, - PyInterpreterState **interp_p, + PyThreadState **tstate_p, const PyConfig *config) { PyStatus status; @@ -456,20 +453,23 @@ pyinit_core_reconfigure(_PyRuntimeState *runtime, if (!tstate) { return _PyStatus_ERR("failed to read thread state"); } + *tstate_p = tstate; PyInterpreterState *interp = tstate->interp; if (interp == NULL) { return _PyStatus_ERR("can't make main interpreter"); } - *interp_p = interp; - _PyConfig_Write(config, runtime); + status = _PyConfig_Write(config, runtime); + if (_PyStatus_EXCEPTION(status)) { + return status; + } - status = _PyConfig_Copy(&interp->config, config); + status = _PyInterpreterState_SetConfig(interp, config); if (_PyStatus_EXCEPTION(status)) { return status; } - config = &interp->config; + config = _PyInterpreterState_GetConfig(interp); if (config->_install_importlib) { status = _PyConfig_WritePathConfig(config); @@ -489,7 +489,10 @@ pycore_init_runtime(_PyRuntimeState *runtime, return _PyStatus_ERR("main interpreter already initialized"); } - _PyConfig_Write(config, runtime); + PyStatus status = _PyConfig_Write(config, runtime); + if (_PyStatus_EXCEPTION(status)) { + return status; + } /* Py_Finalize leaves _Py_Finalizing set in order to help daemon * threads behave a little more gracefully at interpreter shutdown. @@ -500,9 +503,9 @@ pycore_init_runtime(_PyRuntimeState *runtime, * threads still hanging around from a previous Py_Initialize/Finalize * pair :( */ - runtime->finalizing = NULL; + _PyRuntimeState_SetFinalizing(runtime, NULL); - PyStatus status = _Py_HashRandomization_Init(config); + status = _Py_HashRandomization_Init(config); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -515,77 +518,105 @@ pycore_init_runtime(_PyRuntimeState *runtime, } +static PyStatus +init_interp_create_gil(PyThreadState *tstate) +{ + PyStatus status; + + /* finalize_interp_delete() comment explains why _PyEval_FiniGIL() is + only called here. */ + _PyEval_FiniGIL(tstate); + + /* Auto-thread-state API */ + status = _PyGILState_Init(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + /* Create the GIL and take it */ + status = _PyEval_InitGIL(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + return _PyStatus_OK(); +} + + static PyStatus pycore_create_interpreter(_PyRuntimeState *runtime, const PyConfig *config, - PyInterpreterState **interp_p) + PyThreadState **tstate_p) { PyInterpreterState *interp = PyInterpreterState_New(); if (interp == NULL) { return _PyStatus_ERR("can't make main interpreter"); } - *interp_p = interp; - PyStatus status = _PyConfig_Copy(&interp->config, config); + PyStatus status = _PyInterpreterState_SetConfig(interp, config); if (_PyStatus_EXCEPTION(status)) { return status; } - config = &interp->config; PyThreadState *tstate = PyThreadState_New(interp); - if (tstate == NULL) + if (tstate == NULL) { return _PyStatus_ERR("can't make first thread"); + } (void) PyThreadState_Swap(tstate); - /* We can't call _PyEval_FiniThreads() in Py_FinalizeEx because - destroying the GIL might fail when it is being referenced from - another running thread (see issue #9901). - Instead we destroy the previously created GIL here, which ensures - that we can call Py_Initialize / Py_FinalizeEx multiple times. */ - _PyEval_FiniThreads(&runtime->ceval); - - /* Auto-thread-state API */ - _PyGILState_Init(runtime, interp, tstate); - - /* Create the GIL */ - PyEval_InitThreads(); + status = init_interp_create_gil(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + *tstate_p = tstate; return _PyStatus_OK(); } static PyStatus -pycore_init_types(void) +pycore_init_types(PyThreadState *tstate) { - PyStatus status = _PyTypes_Init(); - if (_PyStatus_EXCEPTION(status)) { - return status; - } + PyStatus status; + int is_main_interp = _Py_IsMainInterpreter(tstate); - status = _PyUnicode_Init(); + status = _PyGC_Init(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } - if (_PyStructSequence_Init() < 0) { - return _PyStatus_ERR("can't initialize structseq"); + if (is_main_interp) { + status = _PyTypes_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; + } } - if (!_PyLong_Init()) { + + if (!_PyLong_Init(tstate)) { return _PyStatus_ERR("can't init longs"); } + if (is_main_interp) { + status = _PyUnicode_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } + status = _PyExc_Init(); if (_PyStatus_EXCEPTION(status)) { return status; } - if (!_PyFloat_Init()) { - return _PyStatus_ERR("can't init float"); - } + if (is_main_interp) { + if (!_PyFloat_Init()) { + return _PyStatus_ERR("can't init float"); + } - if (!_PyContext_Init()) { - return _PyStatus_ERR("can't init context"); + if (_PyStructSequence_Init() < 0) { + return _PyStatus_ERR("can't initialize structseq"); + } } status = _PyErr_Init(); @@ -593,109 +624,147 @@ pycore_init_types(void) return status; } + if (is_main_interp) { + if (!_PyContext_Init()) { + return _PyStatus_ERR("can't init context"); + } + } + return _PyStatus_OK(); } static PyStatus -pycore_init_builtins(PyInterpreterState *interp) +pycore_init_builtins(PyThreadState *tstate) { - PyObject *bimod = _PyBuiltin_Init(); + assert(!_PyErr_Occurred(tstate)); + + PyObject *bimod = _PyBuiltin_Init(tstate); if (bimod == NULL) { - return _PyStatus_ERR("can't initialize builtins modules"); + goto error; } - _PyImport_FixupBuiltin(bimod, "builtins", interp->modules); - interp->builtins = PyModule_GetDict(bimod); - if (interp->builtins == NULL) { - return _PyStatus_ERR("can't initialize builtins dict"); + PyInterpreterState *interp = tstate->interp; + if (_PyImport_FixupBuiltin(bimod, "builtins", interp->modules) < 0) { + goto error; } - Py_INCREF(interp->builtins); + + PyObject *builtins_dict = PyModule_GetDict(bimod); + if (builtins_dict == NULL) { + goto error; + } + Py_INCREF(builtins_dict); + interp->builtins = builtins_dict; PyStatus status = _PyBuiltins_AddExceptions(bimod); if (_PyStatus_EXCEPTION(status)) { return status; } + + interp->builtins_copy = PyDict_Copy(interp->builtins); + if (interp->builtins_copy == NULL) { + goto error; + } + Py_DECREF(bimod); + + assert(!_PyErr_Occurred(tstate)); + return _PyStatus_OK(); + +error: + Py_XDECREF(bimod); + return _PyStatus_ERR("can't initialize builtins module"); } static PyStatus -pycore_init_import_warnings(PyInterpreterState *interp, PyObject *sysmod) +pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod) { - const PyConfig *config = &interp->config; + assert(!_PyErr_Occurred(tstate)); - PyStatus status = _PyImport_Init(interp); + PyStatus status = _PyImportHooks_Init(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } - status = _PyImportHooks_Init(); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - /* Initialize _warnings. */ - if (_PyWarnings_Init() == NULL) { - return _PyStatus_ERR("can't initialize warnings"); - } - - if (config->_install_importlib) { - status = _PyConfig_WritePathConfig(config); + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); + if (_Py_IsMainInterpreter(tstate)) { + /* Initialize _warnings. */ + status = _PyWarnings_InitState(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } + + if (config->_install_importlib) { + status = _PyConfig_WritePathConfig(config); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } } /* This call sets up builtin and frozen import support */ if (config->_install_importlib) { - status = init_importlib(interp, sysmod); + status = init_importlib(tstate, sysmod); if (_PyStatus_EXCEPTION(status)) { return status; } } + + assert(!_PyErr_Occurred(tstate)); + return _PyStatus_OK(); } static PyStatus -pyinit_config(_PyRuntimeState *runtime, - PyInterpreterState **interp_p, - const PyConfig *config) +pycore_interp_init(PyThreadState *tstate) { - PyInterpreterState *interp; - - _PyConfig_Write(config, runtime); + PyStatus status; + PyObject *sysmod = NULL; - PyStatus status = pycore_init_runtime(runtime, config); + status = pycore_init_types(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } - status = pycore_create_interpreter(runtime, config, &interp); + status = _PySys_Create(tstate, &sysmod); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } - config = &interp->config; - *interp_p = interp; - status = pycore_init_types(); + status = pycore_init_builtins(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } - PyObject *sysmod; - status = _PySys_Create(runtime, interp, &sysmod); + status = pycore_init_import_warnings(tstate, sysmod); + +done: + /* sys.modules['sys'] contains a strong reference to the module */ + Py_XDECREF(sysmod); + return status; +} + + +static PyStatus +pyinit_config(_PyRuntimeState *runtime, + PyThreadState **tstate_p, + const PyConfig *config) +{ + PyStatus status = pycore_init_runtime(runtime, config); if (_PyStatus_EXCEPTION(status)) { return status; } - status = pycore_init_builtins(interp); + PyThreadState *tstate; + status = pycore_create_interpreter(runtime, config, &tstate); if (_PyStatus_EXCEPTION(status)) { return status; } + *tstate_p = tstate; - status = pycore_init_import_warnings(interp, sysmod); + status = pycore_interp_init(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -833,7 +902,7 @@ _Py_PreInitializeFromConfig(const PyConfig *config, static PyStatus pyinit_core(_PyRuntimeState *runtime, const PyConfig *src_config, - PyInterpreterState **interp_p) + PyThreadState **tstate_p) { PyStatus status; @@ -856,10 +925,10 @@ pyinit_core(_PyRuntimeState *runtime, } if (!runtime->core_initialized) { - status = pyinit_config(runtime, interp_p, &config); + status = pyinit_config(runtime, tstate_p, &config); } else { - status = pyinit_core_reconfigure(runtime, interp_p, &config); + status = pyinit_core_reconfigure(runtime, tstate_p, &config); } if (_PyStatus_EXCEPTION(status)) { goto done; @@ -875,16 +944,16 @@ done: configuration. Example of bpo-34008: Py_Main() called after Py_Initialize(). */ static PyStatus -_Py_ReconfigureMainInterpreter(PyInterpreterState *interp) +_Py_ReconfigureMainInterpreter(PyThreadState *tstate) { - PyConfig *config = &interp->config; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); PyObject *argv = _PyWideStringList_AsList(&config->argv); if (argv == NULL) { return _PyStatus_NO_MEMORY(); \ } - int res = PyDict_SetItemString(interp->sysdict, "argv", argv); + int res = PyDict_SetItemString(tstate->interp->sysdict, "argv", argv); Py_DECREF(argv); if (res < 0) { return _PyStatus_ERR("fail to set sys.argv"); @@ -892,30 +961,16 @@ _Py_ReconfigureMainInterpreter(PyInterpreterState *interp) return _PyStatus_OK(); } -/* Update interpreter state based on supplied configuration settings - * - * After calling this function, most of the restrictions on the interpreter - * are lifted. The only remaining incomplete settings are those related - * to the main module (sys.argv[0], __main__ metadata) - * - * Calling this when the interpreter is not initializing, is already - * initialized or without a valid current thread state is a fatal error. - * Other errors should be reported as normal Python exceptions with a - * non-zero return code. - */ + static PyStatus -pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) +init_interp_main(PyThreadState *tstate) { - if (!runtime->core_initialized) { - return _PyStatus_ERR("runtime core not initialized"); - } + assert(!_PyErr_Occurred(tstate)); - /* Configure the main interpreter */ - PyConfig *config = &interp->config; - - if (runtime->initialized) { - return _Py_ReconfigureMainInterpreter(interp); - } + PyStatus status; + int is_main_interp = _Py_IsMainInterpreter(tstate); + PyInterpreterState *interp = tstate->interp; + const PyConfig *config = _PyInterpreterState_GetConfig(interp); if (!config->_install_importlib) { /* Special mode for freeze_importlib: run with no import system @@ -923,85 +978,134 @@ pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) * This means anything which needs support from extension modules * or pure Python code in the standard library won't work. */ - runtime->initialized = 1; + if (is_main_interp) { + interp->runtime->initialized = 1; + } return _PyStatus_OK(); } - if (_PyTime_Init() < 0) { - return _PyStatus_ERR("can't initialize time"); + if (is_main_interp) { + if (_PyTime_Init() < 0) { + return _PyStatus_ERR("can't initialize time"); + } } - if (_PySys_InitMain(runtime, interp) < 0) { + if (_PySys_InitMain(tstate) < 0) { return _PyStatus_ERR("can't finish initializing sys"); } - PyStatus status = init_importlib_external(interp); + status = init_importlib_external(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } - /* initialize the faulthandler module */ - status = _PyFaulthandler_Init(config->faulthandler); - if (_PyStatus_EXCEPTION(status)) { - return status; + if (is_main_interp) { + /* initialize the faulthandler module */ + status = _PyFaulthandler_Init(config->faulthandler); + if (_PyStatus_EXCEPTION(status)) { + return status; + } } - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); status = _PyUnicode_InitEncodings(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } - if (config->install_signal_handlers) { - status = init_signals(); - if (_PyStatus_EXCEPTION(status)) { - return status; + if (is_main_interp) { + if (config->install_signal_handlers) { + status = init_signals(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } + + if (_PyTraceMalloc_Init(config->tracemalloc) < 0) { + return _PyStatus_ERR("can't initialize tracemalloc"); } } - if (_PyTraceMalloc_Init(config->tracemalloc) < 0) { - return _PyStatus_ERR("can't initialize tracemalloc"); + status = init_sys_streams(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; } - status = add_main_module(interp); + status = init_set_builtins_open(); if (_PyStatus_EXCEPTION(status)) { return status; } - status = init_sys_streams(interp); + status = add_main_module(interp); if (_PyStatus_EXCEPTION(status)) { return status; } - /* Initialize warnings. */ - PyObject *warnoptions = PySys_GetObject("warnoptions"); - if (warnoptions != NULL && PyList_Size(warnoptions) > 0) - { - PyObject *warnings_module = PyImport_ImportModule("warnings"); - if (warnings_module == NULL) { - fprintf(stderr, "'import warnings' failed; traceback:\n"); - PyErr_Print(); + if (is_main_interp) { + /* Initialize warnings. */ + PyObject *warnoptions = PySys_GetObject("warnoptions"); + if (warnoptions != NULL && PyList_Size(warnoptions) > 0) + { + PyObject *warnings_module = PyImport_ImportModule("warnings"); + if (warnings_module == NULL) { + fprintf(stderr, "'import warnings' failed; traceback:\n"); + _PyErr_Print(tstate); + } + Py_XDECREF(warnings_module); } - Py_XDECREF(warnings_module); - } - runtime->initialized = 1; + interp->runtime->initialized = 1; + } if (config->site_import) { - status = init_import_size(); /* Module site */ + status = init_import_site(); if (_PyStatus_EXCEPTION(status)) { return status; } } + if (is_main_interp) { #ifndef MS_WINDOWS - emit_stderr_warning_for_legacy_locale(runtime); + emit_stderr_warning_for_legacy_locale(interp->runtime); #endif + } + + assert(!_PyErr_Occurred(tstate)); return _PyStatus_OK(); } +/* Update interpreter state based on supplied configuration settings + * + * After calling this function, most of the restrictions on the interpreter + * are lifted. The only remaining incomplete settings are those related + * to the main module (sys.argv[0], __main__ metadata) + * + * Calling this when the interpreter is not initializing, is already + * initialized or without a valid current thread state is a fatal error. + * Other errors should be reported as normal Python exceptions with a + * non-zero return code. + */ +static PyStatus +pyinit_main(PyThreadState *tstate) +{ + PyInterpreterState *interp = tstate->interp; + if (!interp->runtime->core_initialized) { + return _PyStatus_ERR("runtime core not initialized"); + } + + if (interp->runtime->initialized) { + return _Py_ReconfigureMainInterpreter(tstate); + } + + PyStatus status = init_interp_main(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + return _PyStatus_OK(); +} + + PyStatus _Py_InitializeMain(void) { @@ -1010,9 +1114,8 @@ _Py_InitializeMain(void) return status; } _PyRuntimeState *runtime = &_PyRuntime; - PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; - - return pyinit_main(runtime, interp); + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + return pyinit_main(tstate); } @@ -1031,15 +1134,15 @@ Py_InitializeFromConfig(const PyConfig *config) } _PyRuntimeState *runtime = &_PyRuntime; - PyInterpreterState *interp = NULL; - status = pyinit_core(runtime, config, &interp); + PyThreadState *tstate = NULL; + status = pyinit_core(runtime, config, &tstate); if (_PyStatus_EXCEPTION(status)) { return status; } - config = &interp->config; + config = _PyInterpreterState_GetConfig(tstate->interp); if (config->_init_main) { - status = pyinit_main(runtime, interp); + status = pyinit_main(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -1083,10 +1186,6 @@ Py_Initialize(void) } -#ifdef COUNT_ALLOCS -extern void _Py_dump_counts(FILE*); -#endif - /* Flush stdout and stderr */ static int @@ -1114,7 +1213,7 @@ flush_std_files(void) int status = 0; if (fout != NULL && fout != Py_None && !file_is_closed(fout)) { - tmp = _PyObject_CallMethodId(fout, &PyId_flush, NULL); + tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_flush); if (tmp == NULL) { PyErr_WriteUnraisable(fout); status = -1; @@ -1124,7 +1223,7 @@ flush_std_files(void) } if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) { - tmp = _PyObject_CallMethodId(ferr, &PyId_flush, NULL); + tmp = _PyObject_CallMethodIdNoArgs(ferr, &PyId_flush); if (tmp == NULL) { PyErr_Clear(); status = -1; @@ -1150,6 +1249,102 @@ flush_std_files(void) */ + +static void +finalize_interp_types(PyThreadState *tstate, int is_main_interp) +{ + if (is_main_interp) { + /* Sundry finalizers */ + _PyAST_Fini(); + _PyFrame_Fini(); + _PyTuple_Fini(); + _PyList_Fini(); + _PySet_Fini(); + _PyBytes_Fini(); + } + + _PyLong_Fini(tstate); + + if (is_main_interp) { + _PyFloat_Fini(); + _PyDict_Fini(); + _PySlice_Fini(); + } + + _PyWarnings_Fini(tstate->interp); + + if (is_main_interp) { + _Py_HashRandomization_Fini(); + _PyArg_Fini(); + _PyAsyncGen_Fini(); + _PyContext_Fini(); + } + + /* Cleanup Unicode implementation */ + _PyUnicode_Fini(tstate); + + if (is_main_interp) { + _Py_ClearFileSystemEncoding(); + } +} + + +static void +finalize_interp_clear(PyThreadState *tstate) +{ + int is_main_interp = _Py_IsMainInterpreter(tstate); + + /* Clear interpreter state and all thread states */ + PyInterpreterState_Clear(tstate->interp); + + /* Trigger a GC collection on subinterpreters*/ + if (!is_main_interp) { + _PyGC_CollectNoFail(); + } + + /* Clear all loghooks */ + /* Both _PySys_Audit function and users still need PyObject, such as tuple. + Call _PySys_ClearAuditHooks when PyObject available. */ + if (is_main_interp) { + _PySys_ClearAuditHooks(tstate); + } + + finalize_interp_types(tstate, is_main_interp); + + if (is_main_interp) { + /* XXX Still allocated: + - various static ad-hoc pointers to interned strings + - int and float free list blocks + - whatever various modules and libraries allocate + */ + + PyGrammar_RemoveAccelerators(&_PyParser_Grammar); + + _PyExc_Fini(); + } + + _PyGC_Fini(tstate); +} + + +static void +finalize_interp_delete(PyThreadState *tstate) +{ + if (_Py_IsMainInterpreter(tstate)) { + /* Cleanup auto-thread-state */ + _PyGILState_Fini(tstate); + } + + /* We can't call _PyEval_FiniGIL() here because destroying the GIL lock can + fail when it is being awaited by another running daemon thread (see + bpo-9901). Instead pycore_create_interpreter() destroys the previously + created GIL, which ensures that Py_Initialize / Py_FinalizeEx can be + called multiple times. */ + + PyInterpreterState_Delete(tstate->interp); +} + + int Py_FinalizeEx(void) { @@ -1160,16 +1355,16 @@ Py_FinalizeEx(void) return status; } - // Wrap up existing "threading"-module-created, non-daemon threads. - wait_for_thread_shutdown(); - - // Make any remaining pending calls. - _Py_FinishPendingCalls(runtime); - /* Get current thread state and interpreter pointer */ PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); PyInterpreterState *interp = tstate->interp; + // Wrap up existing "threading"-module-created, non-daemon threads. + wait_for_thread_shutdown(tstate); + + // Make any remaining pending calls. + _Py_FinishPendingCalls(tstate); + /* The interpreter is still entirely intact at this point, and the * exit funcs may be relying on that. In particular, if some thread * or exit func is still waiting to do an import, the import machinery @@ -1180,7 +1375,7 @@ Py_FinalizeEx(void) * the threads created via Threading. */ - call_py_exitfuncs(interp); + call_py_exitfuncs(tstate); /* Copy the core config, PyInterpreterState_Delete() free the core config memory */ @@ -1194,12 +1389,22 @@ Py_FinalizeEx(void) int malloc_stats = interp->config.malloc_stats; #endif - /* Remaining threads (e.g. daemon threads) will automatically exit - after taking the GIL (in PyEval_RestoreThread()). */ - runtime->finalizing = tstate; + /* Remaining daemon threads will automatically exit + when they attempt to take the GIL (ex: PyEval_RestoreThread()). */ + _PyRuntimeState_SetFinalizing(runtime, tstate); runtime->initialized = 0; runtime->core_initialized = 0; + /* Destroy the state of all threads of the interpreter, except of the + current thread. In practice, only daemon threads should still be alive, + except if wait_for_thread_shutdown() has been cancelled by CTRL+C. + Clear frames of other threads to call objects destructors. Destructors + will be called in the current Python thread. Since + _PyRuntimeState_SetFinalizing() has been called, no other Python thread + can take the GIL at this point: if they try, they will exit + immediately. */ + _PyThreadState_DeleteExcept(runtime, tstate); + /* Flush sys.stdout and sys.stderr */ if (flush_std_files() < 0) { status = -1; @@ -1221,16 +1426,9 @@ Py_FinalizeEx(void) * XXX I haven't seen a real-life report of either of these. */ _PyGC_CollectIfEnabled(); -#ifdef COUNT_ALLOCS - /* With COUNT_ALLOCS, it helps to run GC multiple times: - each collection might release some types from the type - list, so they become garbage. */ - while (_PyGC_CollectIfEnabled() > 0) - /* nothing */; -#endif /* Destroy all modules */ - PyImport_Cleanup(); + _PyImport_Cleanup(tstate); /* Print debug stats if any */ _PyEval_Fini(); @@ -1272,10 +1470,6 @@ Py_FinalizeEx(void) /* unload faulthandler module */ _PyFaulthandler_Fini(); - /* Debugging stuff */ -#ifdef COUNT_ALLOCS - _Py_dump_counts(stderr); -#endif /* dump hash stats */ _PyHash_Fini(); @@ -1296,63 +1490,8 @@ Py_FinalizeEx(void) } #endif /* Py_TRACE_REFS */ - /* Clear interpreter state and all thread states. */ - PyInterpreterState_Clear(interp); - - /* 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(); - - /* Now we decref the exception classes. After this point nothing - can raise an exception. That's okay, because each Fini() method - below has been checked to make sure no exceptions are ever - raised. - */ - - _PyExc_Fini(); - - /* Sundry finalizers */ - PyMethod_Fini(); - PyFrame_Fini(); - PyCFunction_Fini(); - PyTuple_Fini(); - PyList_Fini(); - PySet_Fini(); - PyBytes_Fini(); - PyLong_Fini(); - PyFloat_Fini(); - PyDict_Fini(); - PySlice_Fini(); - _PyGC_Fini(runtime); - _PyWarnings_Fini(interp); - _Py_HashRandomization_Fini(); - _PyArg_Fini(); - PyAsyncGen_Fini(); - _PyContext_Fini(); - - /* Cleanup Unicode implementation */ - _PyUnicode_Fini(); - - _Py_ClearFileSystemEncoding(); - - /* XXX Still allocated: - - various static ad-hoc pointers to interned strings - - int and float free list blocks - - whatever various modules and libraries allocate - */ - - PyGrammar_RemoveAccelerators(&_PyParser_Grammar); - - /* Cleanup auto-thread-state */ - _PyGILState_Fini(runtime); - - /* Delete current thread. After this, many C API calls become crashy. */ - PyThreadState_Swap(NULL); - - PyInterpreterState_Delete(interp); + finalize_interp_clear(tstate); + finalize_interp_delete(tstate); #ifdef Py_TRACE_REFS /* Display addresses (& refcnts) of all objects still alive. @@ -1381,6 +1520,7 @@ Py_Finalize(void) Py_FinalizeEx(); } + /* Create and initialize a new interpreter and thread, and return the new thread. This requires that Py_Initialize() has been called first. @@ -1395,7 +1535,7 @@ Py_Finalize(void) */ static PyStatus -new_interpreter(PyThreadState **tstate_p) +new_interpreter(PyThreadState **tstate_p, int isolated_subinterpreter) { PyStatus status; @@ -1411,7 +1551,7 @@ new_interpreter(PyThreadState **tstate_p) /* Issue #10915, #15751: The GIL API doesn't work with multiple interpreters: disable PyGILState_Check(). */ - _PyGILState_check_enabled = 0; + runtime->gilstate.check_enabled = 0; PyInterpreterState *interp = PyInterpreterState_New(); if (interp == NULL) { @@ -1429,140 +1569,59 @@ new_interpreter(PyThreadState **tstate_p) PyThreadState *save_tstate = PyThreadState_Swap(tstate); /* Copy the current interpreter config into the new interpreter */ - PyConfig *config; + const PyConfig *config; if (save_tstate != NULL) { - config = &save_tstate->interp->config; - } else { + config = _PyInterpreterState_GetConfig(save_tstate->interp); + } + else + { /* No current thread state, copy from the main interpreter */ PyInterpreterState *main_interp = PyInterpreterState_Main(); - config = &main_interp->config; + config = _PyInterpreterState_GetConfig(main_interp); } - status = _PyConfig_Copy(&interp->config, config); + status = _PyInterpreterState_SetConfig(interp, config); if (_PyStatus_EXCEPTION(status)) { - return status; + goto error; } - config = &interp->config; + interp->config._isolated_interpreter = isolated_subinterpreter; - status = _PyExc_Init(); + status = init_interp_create_gil(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; + goto error; } - status = _PyErr_Init(); + status = pycore_interp_init(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; - } - - - /* XXX The following is lax in error checking */ - PyObject *modules = PyDict_New(); - if (modules == NULL) { - return _PyStatus_ERR("can't make modules dictionary"); - } - interp->modules = modules; - - PyObject *sysmod = _PyImport_FindBuiltin("sys", modules); - if (sysmod != NULL) { - interp->sysdict = PyModule_GetDict(sysmod); - if (interp->sysdict == NULL) { - goto handle_error; - } - Py_INCREF(interp->sysdict); - PyDict_SetItemString(interp->sysdict, "modules", modules); - if (_PySys_InitMain(runtime, interp) < 0) { - return _PyStatus_ERR("can't finish initializing sys"); - } - } - else if (PyErr_Occurred()) { - goto handle_error; - } - - PyObject *bimod = _PyImport_FindBuiltin("builtins", modules); - if (bimod != NULL) { - interp->builtins = PyModule_GetDict(bimod); - if (interp->builtins == NULL) - goto handle_error; - Py_INCREF(interp->builtins); - } - else if (PyErr_Occurred()) { - goto handle_error; - } - - if (bimod != NULL && sysmod != NULL) { - status = _PyBuiltins_AddExceptions(bimod); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = _PySys_SetPreliminaryStderr(interp->sysdict); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = _PyImportHooks_Init(); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = init_importlib(interp, sysmod); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = init_importlib_external(interp); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = _PyUnicode_InitEncodings(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = init_sys_streams(interp); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = add_main_module(interp); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - if (config->site_import) { - status = init_import_size(); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } + goto error; } - if (PyErr_Occurred()) { - goto handle_error; + status = init_interp_main(tstate); + if (_PyStatus_EXCEPTION(status)) { + goto error; } *tstate_p = tstate; return _PyStatus_OK(); -handle_error: - /* Oops, it didn't work. Undo it all. */ +error: + *tstate_p = NULL; + /* Oops, it didn't work. Undo it all. */ PyErr_PrintEx(0); PyThreadState_Clear(tstate); - PyThreadState_Swap(save_tstate); PyThreadState_Delete(tstate); PyInterpreterState_Delete(interp); + PyThreadState_Swap(save_tstate); - *tstate_p = NULL; - return _PyStatus_OK(); + return status; } PyThreadState * -Py_NewInterpreter(void) +_Py_NewInterpreter(int isolated_subinterpreter) { PyThreadState *tstate = NULL; - PyStatus status = new_interpreter(&tstate); + PyStatus status = new_interpreter(&tstate, isolated_subinterpreter); if (_PyStatus_EXCEPTION(status)) { Py_ExitStatusException(status); } @@ -1570,6 +1629,12 @@ Py_NewInterpreter(void) } +PyThreadState * +Py_NewInterpreter(void) +{ + return _Py_NewInterpreter(0); +} + /* Delete an interpreter and its last thread. This requires that the given thread state is current, that the thread has no remaining frames, and that it is its interpreter's only remaining thread. @@ -1587,24 +1652,26 @@ Py_EndInterpreter(PyThreadState *tstate) { PyInterpreterState *interp = tstate->interp; - if (tstate != _PyThreadState_GET()) - Py_FatalError("Py_EndInterpreter: thread is not current"); - if (tstate->frame != NULL) - Py_FatalError("Py_EndInterpreter: thread still has a frame"); + if (tstate != _PyThreadState_GET()) { + Py_FatalError("thread is not current"); + } + if (tstate->frame != NULL) { + Py_FatalError("thread still has a frame"); + } interp->finalizing = 1; // Wrap up existing "threading"-module-created, non-daemon threads. - wait_for_thread_shutdown(); + wait_for_thread_shutdown(tstate); - call_py_exitfuncs(interp); + call_py_exitfuncs(tstate); - if (tstate != interp->tstate_head || tstate->next != NULL) - Py_FatalError("Py_EndInterpreter: not the last thread"); + if (tstate != interp->tstate_head || tstate->next != NULL) { + Py_FatalError("not the last thread"); + } - PyImport_Cleanup(); - PyInterpreterState_Clear(interp); - PyThreadState_Swap(NULL); - PyInterpreterState_Delete(interp); + _PyImport_Cleanup(tstate); + finalize_interp_clear(tstate); + finalize_interp_delete(tstate); } /* Add the __main__ module */ @@ -1660,7 +1727,7 @@ add_main_module(PyInterpreterState *interp) /* Import the site module (not into __main__ though) */ static PyStatus -init_import_size(void) +init_import_site(void) { PyObject *m; m = PyImport_ImportModule("site"); @@ -1740,10 +1807,10 @@ create_stdio(const PyConfig *config, PyObject* io, mode = "wb"; else mode = "rb"; - buf = _PyObject_CallMethodId(io, &PyId_open, "isiOOOi", + buf = _PyObject_CallMethodId(io, &PyId_open, "isiOOOO", fd, mode, buffering, Py_None, Py_None, /* encoding, errors */ - Py_None, 0); /* newline, closefd */ + Py_None, Py_False); /* newline, closefd */ if (buf == NULL) goto error; @@ -1767,7 +1834,7 @@ create_stdio(const PyConfig *config, PyObject* io, text = PyUnicode_FromString(name); if (text == NULL || _PyObject_SetAttrId(raw, &PyId_name, text) < 0) goto error; - res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL); + res = _PyObject_CallMethodIdNoArgs(raw, &PyId_isatty); if (res == NULL) goto error; isatty = PyObject_IsTrue(res); @@ -1778,7 +1845,7 @@ create_stdio(const PyConfig *config, PyObject* io, write_through = Py_True; else write_through = Py_False; - if (isatty && buffered_stdio) + if (buffered_stdio && (isatty || fd == fileno(stderr))) line_buffering = Py_True; else line_buffering = Py_False; @@ -1845,18 +1912,55 @@ error: return NULL; } -/* Initialize sys.stdin, stdout, stderr and builtins.open */ +/* Set builtins.open to io.OpenWrapper */ static PyStatus -init_sys_streams(PyInterpreterState *interp) +init_set_builtins_open(void) { PyObject *iomod = NULL, *wrapper; PyObject *bimod = NULL; + PyStatus res = _PyStatus_OK(); + + if (!(iomod = PyImport_ImportModule("io"))) { + goto error; + } + + if (!(bimod = PyImport_ImportModule("builtins"))) { + goto error; + } + + if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) { + goto error; + } + + /* Set builtins.open */ + if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) { + Py_DECREF(wrapper); + goto error; + } + Py_DECREF(wrapper); + goto done; + +error: + res = _PyStatus_ERR("can't initialize io.open"); + +done: + Py_XDECREF(bimod); + Py_XDECREF(iomod); + return res; +} + + +/* Initialize sys.stdin, stdout, stderr and builtins.open */ +static PyStatus +init_sys_streams(PyThreadState *tstate) +{ + PyObject *iomod = NULL; PyObject *m; PyObject *std = NULL; int fd; PyObject * encoding_attr; PyStatus res = _PyStatus_OK(); - PyConfig *config = &interp->config; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); /* Check that stdin is not a directory Using shell redirection, you can redirect stdin to a directory, @@ -1883,23 +1987,9 @@ init_sys_streams(PyInterpreterState *interp) } Py_DECREF(m); - if (!(bimod = PyImport_ImportModule("builtins"))) { - goto error; - } - if (!(iomod = PyImport_ImportModule("io"))) { goto error; } - if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) { - goto error; - } - - /* Set builtins.open */ - if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) { - Py_DECREF(wrapper); - goto error; - } - Py_DECREF(wrapper); /* Set sys.stdin */ fd = fileno(stdin); @@ -1947,7 +2037,7 @@ init_sys_streams(PyInterpreterState *interp) } Py_DECREF(encoding_attr); } - PyErr_Clear(); /* Not a fatal error if codec isn't available */ + _PyErr_Clear(tstate); /* Not a fatal error if codec isn't available */ if (PySys_SetObject("__stderr__", std) < 0) { Py_DECREF(std); @@ -1967,8 +2057,6 @@ error: done: _Py_ClearStandardStreamEncoding(); - - Py_XDECREF(bimod); Py_XDECREF(iomod); return res; } @@ -1994,13 +2082,13 @@ _Py_FatalError_DumpTracebacks(int fd, PyInterpreterState *interp, Return 1 if the traceback was displayed, 0 otherwise. */ static int -_Py_FatalError_PrintExc(int fd) +_Py_FatalError_PrintExc(PyThreadState *tstate) { PyObject *ferr, *res; PyObject *exception, *v, *tb; int has_tb; - PyErr_Fetch(&exception, &v, &tb); + _PyErr_Fetch(tstate, &exception, &v, &tb); if (exception == NULL) { /* No current exception */ return 0; @@ -2013,7 +2101,7 @@ _Py_FatalError_PrintExc(int fd) return 0; } - PyErr_NormalizeException(&exception, &v, &tb); + _PyErr_NormalizeException(tstate, &exception, &v, &tb); if (tb == NULL) { tb = Py_None; Py_INCREF(tb); @@ -2031,11 +2119,13 @@ _Py_FatalError_PrintExc(int fd) Py_XDECREF(tb); /* sys.stderr may be buffered: call sys.stderr.flush() */ - res = _PyObject_CallMethodId(ferr, &PyId_flush, NULL); - if (res == NULL) - PyErr_Clear(); - else + res = _PyObject_CallMethodIdNoArgs(ferr, &PyId_flush); + if (res == NULL) { + _PyErr_Clear(tstate); + } + else { Py_DECREF(res); + } return has_tb; } @@ -2082,8 +2172,9 @@ static void fatal_error_dump_runtime(FILE *stream, _PyRuntimeState *runtime) { fprintf(stream, "Python runtime state: "); - if (runtime->finalizing) { - fprintf(stream, "finalizing (tstate=%p)", runtime->finalizing); + PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(runtime); + if (finalizing) { + fprintf(stream, "finalizing (tstate=%p)", finalizing); } else if (runtime->initialized) { fprintf(stream, "initialized"); @@ -2105,33 +2196,50 @@ fatal_error_dump_runtime(FILE *stream, _PyRuntimeState *runtime) } +static inline void _Py_NO_RETURN +fatal_error_exit(int status) +{ + if (status < 0) { +#if defined(MS_WINDOWS) && defined(_DEBUG) + DebugBreak(); +#endif + abort(); + } + else { + exit(status); + } +} + + static void _Py_NO_RETURN -fatal_error(const char *prefix, const char *msg, int status) +fatal_error(FILE *stream, int header, const char *prefix, const char *msg, + int status) { - FILE *stream = stderr; const int fd = fileno(stream); static int reentrant = 0; if (reentrant) { /* Py_FatalError() caused a second fatal error. Example: flush_std_files() raises a recursion error. */ - goto exit; + fatal_error_exit(status); } reentrant = 1; - fprintf(stream, "Fatal Python error: "); - if (prefix) { - fputs(prefix, stream); - fputs(": ", stream); - } - if (msg) { - fputs(msg, stream); - } - else { - fprintf(stream, ""); + if (header) { + fprintf(stream, "Fatal Python error: "); + if (prefix) { + fputs(prefix, stream); + fputs(": ", stream); + } + if (msg) { + fputs(msg, stream); + } + else { + fprintf(stream, ""); + } + fputs("\n", stream); + fflush(stream); } - fputs("\n", stream); - fflush(stream); /* it helps in Windows debug build */ _PyRuntimeState *runtime = &_PyRuntime; fatal_error_dump_runtime(stream, runtime); @@ -2154,7 +2262,7 @@ fatal_error(const char *prefix, const char *msg, int status) int has_tstate_and_gil = (tss_tstate != NULL && tss_tstate == tstate); if (has_tstate_and_gil) { /* If an exception is set, print the exception with its traceback */ - if (!_Py_FatalError_PrintExc(fd)) { + if (!_Py_FatalError_PrintExc(tss_tstate)) { /* No exception is set, or an exception is set without traceback */ _Py_FatalError_DumpTracebacks(fd, interp, tss_tstate); } @@ -2179,24 +2287,60 @@ fatal_error(const char *prefix, const char *msg, int status) fatal_output_debug(msg); #endif /* MS_WINDOWS */ -exit: - if (status < 0) { -#if defined(MS_WINDOWS) && defined(_DEBUG) - DebugBreak(); -#endif - abort(); - } - else { - exit(status); - } + fatal_error_exit(status); } + +#undef Py_FatalError + void _Py_NO_RETURN Py_FatalError(const char *msg) { - fatal_error(NULL, msg, -1); + fatal_error(stderr, 1, NULL, msg, -1); } + +void _Py_NO_RETURN +_Py_FatalErrorFunc(const char *func, const char *msg) +{ + fatal_error(stderr, 1, func, msg, -1); +} + + +void _Py_NO_RETURN +_Py_FatalErrorFormat(const char *func, const char *format, ...) +{ + static int reentrant = 0; + if (reentrant) { + /* _Py_FatalErrorFormat() caused a second fatal error */ + fatal_error_exit(-1); + } + reentrant = 1; + + FILE *stream = stderr; + fprintf(stream, "Fatal Python error: "); + if (func) { + fputs(func, stream); + fputs(": ", stream); + } + fflush(stream); + + va_list vargs; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, format); +#else + va_start(vargs); +#endif + vfprintf(stream, format, vargs); + va_end(vargs); + + fputs("\n", stream); + fflush(stream); + + fatal_error(stream, 0, NULL, NULL, -1); +} + + void _Py_NO_RETURN Py_ExitStatusException(PyStatus status) { @@ -2204,7 +2348,7 @@ Py_ExitStatusException(PyStatus status) exit(status.exitcode); } else if (_PyStatus_IS_ERROR(status)) { - fatal_error(status.func, status.err_msg, 1); + fatal_error(stderr, 1, status.func, status.err_msg, 1); } else { Py_FatalError("Py_ExitStatusException() must not be called on success"); @@ -2213,12 +2357,10 @@ Py_ExitStatusException(PyStatus status) /* Clean up and exit */ -# include "pythread.h" - /* For the atexit module. */ void _Py_PyAtExit(void (*func)(PyObject *), PyObject *module) { - PyInterpreterState *is = _PyInterpreterState_Get(); + PyInterpreterState *is = _PyInterpreterState_GET(); /* Guard against API misuse (see bpo-17852) */ assert(is->pyexitfunc == NULL || is->pyexitfunc == func); @@ -2228,13 +2370,14 @@ void _Py_PyAtExit(void (*func)(PyObject *), PyObject *module) } static void -call_py_exitfuncs(PyInterpreterState *istate) +call_py_exitfuncs(PyThreadState *tstate) { - if (istate->pyexitfunc == NULL) + PyInterpreterState *interp = tstate->interp; + if (interp->pyexitfunc == NULL) return; - (*istate->pyexitfunc)(istate->pyexitmodule); - PyErr_Clear(); + (*interp->pyexitfunc)(interp->pyexitmodule); + _PyErr_Clear(tstate); } /* Wait until threading._shutdown completes, provided @@ -2242,19 +2385,19 @@ call_py_exitfuncs(PyInterpreterState *istate) The shutdown routine will wait until all non-daemon "threading" threads have completed. */ static void -wait_for_thread_shutdown(void) +wait_for_thread_shutdown(PyThreadState *tstate) { _Py_IDENTIFIER(_shutdown); PyObject *result; PyObject *threading = _PyImport_GetModuleId(&PyId_threading); if (threading == NULL) { - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { PyErr_WriteUnraisable(NULL); } /* else: threading not imported */ return; } - result = _PyObject_CallMethodId(threading, &PyId__shutdown, NULL); + result = _PyObject_CallMethodIdNoArgs(threading, &PyId__shutdown); if (result == NULL) { PyErr_WriteUnraisable(threading); } @@ -2300,7 +2443,7 @@ Py_Exit(int sts) } static PyStatus -init_signals(void) +init_signals(PyThreadState *tstate) { #ifdef SIGPIPE PyOS_setsig(SIGPIPE, SIG_IGN); @@ -2312,7 +2455,7 @@ init_signals(void) PyOS_setsig(SIGXFSZ, SIG_IGN); #endif PyOS_InitInterrupts(); /* May imply init_signals() */ - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { return _PyStatus_ERR("can't import signal"); } return _PyStatus_OK(); @@ -2324,6 +2467,8 @@ init_signals(void) * All of the code in this function must only use async-signal-safe functions, * listed at `man 7 signal` or * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html. + * + * If this function is updated, update also _posix_spawn() of subprocess.py. */ void _Py_RestoreSignals(void) diff --git a/Python/pymath.c b/Python/pymath.c index 24b80422..a08a0e79 100644 --- a/Python/pymath.c +++ b/Python/pymath.c @@ -79,3 +79,18 @@ round(double x) return copysign(y, x); } #endif /* HAVE_ROUND */ + +static const unsigned int BitLengthTable[32] = { + 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 +}; + +unsigned int _Py_bit_length(unsigned long d) { + unsigned int d_bits = 0; + while (d >= 32) { + d_bits += 6; + d >>= 6; + } + d_bits += BitLengthTable[d]; + return d_bits; +} diff --git a/Python/pystate.c b/Python/pystate.c index b1d0f1cb..9beefa8e 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -4,9 +4,11 @@ #include "Python.h" #include "pycore_ceval.h" #include "pycore_initconfig.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" #include "pycore_pylifecycle.h" +#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_sysmodule.h" /* -------------------------------------------------------------------------- CAUTION @@ -39,7 +41,7 @@ extern "C" { /* Forward declarations */ static PyThreadState *_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate); -static void _PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate); +static void _PyThreadState_Delete(PyThreadState *tstate, int check_current); static PyStatus @@ -58,8 +60,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) runtime->open_code_userdata = open_code_userdata; runtime->audit_hook_head = audit_hook_head; - _PyGC_Initialize(&runtime->gc); - _PyEval_Initialize(&runtime->ceval); + _PyEval_InitRuntimeState(&runtime->ceval); PyPreConfig_InitPythonConfig(&runtime->preconfig); @@ -121,6 +122,7 @@ _PyRuntimeState_Fini(_PyRuntimeState *runtime) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } +#ifdef HAVE_FORK /* This function is called from PyOS_AfterFork_Child to ensure that * newly created child processes do not share locks with the parent. */ @@ -136,24 +138,25 @@ _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime) PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - runtime->interpreters.mutex = PyThread_allocate_lock(); - runtime->interpreters.main->id_mutex = PyThread_allocate_lock(); - runtime->xidregistry.mutex = PyThread_allocate_lock(); + int interp_mutex = _PyThread_at_fork_reinit(&runtime->interpreters.mutex); + int main_interp_id_mutex = _PyThread_at_fork_reinit(&runtime->interpreters.main->id_mutex); + int xidregistry_mutex = _PyThread_at_fork_reinit(&runtime->xidregistry.mutex); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - if (runtime->interpreters.mutex == NULL) { + if (interp_mutex < 0) { Py_FatalError("Can't initialize lock for runtime interpreters"); } - if (runtime->interpreters.main->id_mutex == NULL) { + if (main_interp_id_mutex < 0) { Py_FatalError("Can't initialize ID lock for main interpreter"); } - if (runtime->xidregistry.mutex == NULL) { + if (xidregistry_mutex < 0) { Py_FatalError("Can't initialize lock for cross-interpreter data registry"); } } +#endif #define HEAD_LOCK(runtime) \ PyThread_acquire_lock((runtime)->interpreters.mutex, WAIT_LOCK) @@ -193,19 +196,29 @@ _PyInterpreterState_Enable(_PyRuntimeState *runtime) PyInterpreterState * PyInterpreterState_New(void) { - if (PySys_Audit("cpython.PyInterpreterState_New", NULL) < 0) { + PyThreadState *tstate = _PyThreadState_GET(); + /* tstate is NULL when Py_InitializeFromConfig() calls + PyInterpreterState_New() to create the main interpreter. */ + if (_PySys_Audit(tstate, "cpython.PyInterpreterState_New", NULL) < 0) { return NULL; } - PyInterpreterState *interp = PyMem_RawMalloc(sizeof(PyInterpreterState)); + PyInterpreterState *interp = PyMem_RawCalloc(1, sizeof(PyInterpreterState)); if (interp == NULL) { return NULL; } - memset(interp, 0, sizeof(*interp)); interp->id_refcount = -1; - interp->check_interval = 100; + /* Don't get runtime from tstate since tstate can be NULL */ + _PyRuntimeState *runtime = &_PyRuntime; + interp->runtime = runtime; + + if (_PyEval_InitState(&interp->ceval) < 0) { + goto out_of_memory; + } + + _PyGC_InitState(&interp->gc); PyConfig_InitPythonConfig(&interp->config); interp->eval_frame = _PyEval_EvalFrameDefault; @@ -217,14 +230,15 @@ PyInterpreterState_New(void) #endif #endif - _PyRuntimeState *runtime = &_PyRuntime; struct pyinterpreters *interpreters = &runtime->interpreters; HEAD_LOCK(runtime); if (interpreters->next_id < 0) { /* overflow or Py_Initialize() not called! */ - PyErr_SetString(PyExc_RuntimeError, - "failed to get an interpreter ID"); + if (tstate != NULL) { + _PyErr_SetString(tstate, PyExc_RuntimeError, + "failed to get an interpreter ID"); + } PyMem_RawFree(interp); interp = NULL; } @@ -248,14 +262,27 @@ PyInterpreterState_New(void) interp->audit_hooks = NULL; return interp; + +out_of_memory: + if (tstate != NULL) { + _PyErr_NoMemory(tstate); + } + + PyMem_RawFree(interp); + return NULL; } -static void -_PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) +void +PyInterpreterState_Clear(PyInterpreterState *interp) { - if (PySys_Audit("cpython.PyInterpreterState_Clear", NULL) < 0) { - PyErr_Clear(); + _PyRuntimeState *runtime = interp->runtime; + + /* Use the current Python thread state to call audit hooks, + not the current Python thread state of 'interp'. */ + PyThreadState *tstate = _PyThreadState_GET(); + if (_PySys_Audit(tstate, "cpython.PyInterpreterState_Clear", NULL) < 0) { + _PyErr_Clear(tstate); } HEAD_LOCK(runtime); @@ -283,7 +310,7 @@ _PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) Py_CLEAR(interp->after_forkers_parent); Py_CLEAR(interp->after_forkers_child); #endif - if (runtime->finalizing == NULL) { + if (_PyRuntimeState_GetFinalizing(runtime) == NULL) { _PyWarnings_Fini(interp); } // XXX Once we have one allocator per interpreter (i.e. @@ -291,52 +318,54 @@ _PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) // objects have been cleaned up at the point. } -void -PyInterpreterState_Clear(PyInterpreterState *interp) -{ - _PyInterpreterState_Clear(&_PyRuntime, interp); -} - static void -zapthreads(_PyRuntimeState *runtime, PyInterpreterState *interp) +zapthreads(PyInterpreterState *interp, int check_current) { - PyThreadState *p; + PyThreadState *tstate; /* No need to lock the mutex here because this should only happen when the threads are all really dead (XXX famous last words). */ - while ((p = interp->tstate_head) != NULL) { - _PyThreadState_Delete(runtime, p); + while ((tstate = interp->tstate_head) != NULL) { + _PyThreadState_Delete(tstate, check_current); } } -static void -_PyInterpreterState_Delete(_PyRuntimeState *runtime, - PyInterpreterState *interp) +void +PyInterpreterState_Delete(PyInterpreterState *interp) { + _PyRuntimeState *runtime = interp->runtime; struct pyinterpreters *interpreters = &runtime->interpreters; - zapthreads(runtime, interp); + zapthreads(interp, 0); + + _PyEval_FiniState(&interp->ceval); + + /* Delete current thread. After this, many C API calls become crashy. */ + _PyThreadState_Swap(&runtime->gilstate, NULL); + HEAD_LOCK(runtime); PyInterpreterState **p; for (p = &interpreters->head; ; p = &(*p)->next) { if (*p == NULL) { - Py_FatalError("PyInterpreterState_Delete: invalid interp"); + Py_FatalError("NULL interpreter"); } if (*p == interp) { break; } } if (interp->tstate_head != NULL) { - Py_FatalError("PyInterpreterState_Delete: remaining threads"); + Py_FatalError("remaining threads"); } *p = interp->next; + if (interpreters->main == interp) { interpreters->main = NULL; if (interpreters->head != NULL) { - Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters"); + Py_FatalError("remaining subinterpreters"); } } HEAD_UNLOCK(runtime); + if (interp->id_mutex != NULL) { PyThread_free_lock(interp->id_mutex); } @@ -344,13 +373,6 @@ _PyInterpreterState_Delete(_PyRuntimeState *runtime, } -void -PyInterpreterState_Delete(PyInterpreterState *interp) -{ - _PyInterpreterState_Delete(&_PyRuntime, interp); -} - - /* * Delete all interpreter states except the main interpreter. If there * is a current interpreter state, it *must* be the main interpreter. @@ -363,7 +385,7 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime) PyThreadState *tstate = _PyThreadState_Swap(gilstate, NULL); if (tstate != NULL && tstate->interp != interpreters->main) { - Py_FatalError("PyInterpreterState_DeleteExceptMain: not main interpreter"); + Py_FatalError("not main interpreter"); } HEAD_LOCK(runtime); @@ -377,8 +399,8 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime) continue; } - _PyInterpreterState_Clear(runtime, interp); // XXX must activate? - zapthreads(runtime, interp); + PyInterpreterState_Clear(interp); // XXX must activate? + zapthreads(interp, 1); if (interp->id_mutex != NULL) { PyThread_free_lock(interp->id_mutex); } @@ -389,22 +411,20 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime) HEAD_UNLOCK(runtime); if (interpreters->head == NULL) { - Py_FatalError("PyInterpreterState_DeleteExceptMain: missing main"); + Py_FatalError("missing main interpreter"); } _PyThreadState_Swap(gilstate, tstate); } PyInterpreterState * -_PyInterpreterState_Get(void) +PyInterpreterState_Get(void) { PyThreadState *tstate = _PyThreadState_GET(); - if (tstate == NULL) { - Py_FatalError("_PyInterpreterState_Get(): no current thread state"); - } + _Py_EnsureTstateNotNULL(tstate); PyInterpreterState *interp = tstate->interp; if (interp == NULL) { - Py_FatalError("_PyInterpreterState_Get(): no current interpreter"); + Py_FatalError("no current interpreter"); } return interp; } @@ -422,11 +442,11 @@ PyInterpreterState_GetID(PyInterpreterState *interp) static PyInterpreterState * -interp_look_up_id(_PyRuntimeState *runtime, PY_INT64_T requested_id) +interp_look_up_id(_PyRuntimeState *runtime, int64_t requested_id) { PyInterpreterState *interp = runtime->interpreters.head; while (interp != NULL) { - PY_INT64_T id = PyInterpreterState_GetID(interp); + int64_t id = PyInterpreterState_GetID(interp); if (id < 0) { return NULL; } @@ -439,7 +459,7 @@ interp_look_up_id(_PyRuntimeState *runtime, PY_INT64_T requested_id) } PyInterpreterState * -_PyInterpreterState_LookUpID(PY_INT64_T requested_id) +_PyInterpreterState_LookUpID(int64_t requested_id) { PyInterpreterState *interp = NULL; if (requested_id >= 0) { @@ -543,26 +563,15 @@ PyInterpreterState_GetDict(PyInterpreterState *interp) return interp->dict; } -/* Default implementation for _PyThreadState_GetFrame */ -static struct _frame * -threadstate_getframe(PyThreadState *self) -{ - return self->frame; -} - static PyThreadState * new_threadstate(PyInterpreterState *interp, int init) { - _PyRuntimeState *runtime = &_PyRuntime; + _PyRuntimeState *runtime = interp->runtime; PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState)); if (tstate == NULL) { return NULL; } - if (_PyThreadState_GetFrame == NULL) { - _PyThreadState_GetFrame = threadstate_getframe; - } - tstate->interp = interp; tstate->frame = NULL; @@ -607,7 +616,7 @@ new_threadstate(PyInterpreterState *interp, int init) tstate->context_ver = 1; if (init) { - _PyThreadState_Init(runtime, tstate); + _PyThreadState_Init(tstate); } HEAD_LOCK(runtime); @@ -635,16 +644,16 @@ _PyThreadState_Prealloc(PyInterpreterState *interp) } void -_PyThreadState_Init(_PyRuntimeState *runtime, PyThreadState *tstate) +_PyThreadState_Init(PyThreadState *tstate) { - _PyGILState_NoteThreadState(&runtime->gilstate, tstate); + _PyGILState_NoteThreadState(&tstate->interp->runtime->gilstate, tstate); } PyObject* PyState_FindModule(struct PyModuleDef* module) { Py_ssize_t index = module->m_base.m_index; - PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *state = _PyInterpreterState_GET(); PyObject *res; if (module->m_slots) { return NULL; @@ -660,107 +669,120 @@ PyState_FindModule(struct PyModuleDef* module) } int -_PyState_AddModule(PyObject* module, struct PyModuleDef* def) +_PyState_AddModule(PyThreadState *tstate, PyObject* module, struct PyModuleDef* def) { - PyInterpreterState *state; if (!def) { - assert(PyErr_Occurred()); + assert(_PyErr_Occurred(tstate)); return -1; } if (def->m_slots) { - PyErr_SetString(PyExc_SystemError, - "PyState_AddModule called on module with slots"); + _PyErr_SetString(tstate, + PyExc_SystemError, + "PyState_AddModule called on module with slots"); return -1; } - state = _PyInterpreterState_GET_UNSAFE(); - if (!state->modules_by_index) { - state->modules_by_index = PyList_New(0); - if (!state->modules_by_index) + + PyInterpreterState *interp = tstate->interp; + if (!interp->modules_by_index) { + interp->modules_by_index = PyList_New(0); + if (!interp->modules_by_index) { return -1; + } } - while (PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index) - if (PyList_Append(state->modules_by_index, Py_None) < 0) + + while (PyList_GET_SIZE(interp->modules_by_index) <= def->m_base.m_index) { + if (PyList_Append(interp->modules_by_index, Py_None) < 0) { return -1; + } + } + Py_INCREF(module); - return PyList_SetItem(state->modules_by_index, + return PyList_SetItem(interp->modules_by_index, def->m_base.m_index, module); } int PyState_AddModule(PyObject* module, struct PyModuleDef* def) { - Py_ssize_t index; - PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE(); if (!def) { - Py_FatalError("PyState_AddModule: Module Definition is NULL"); + Py_FatalError("module definition is NULL"); return -1; } - index = def->m_base.m_index; - if (state->modules_by_index && - index < PyList_GET_SIZE(state->modules_by_index) && - module == PyList_GET_ITEM(state->modules_by_index, index)) { - Py_FatalError("PyState_AddModule: Module already added!"); + + PyThreadState *tstate = _PyThreadState_GET(); + PyInterpreterState *interp = tstate->interp; + Py_ssize_t index = def->m_base.m_index; + if (interp->modules_by_index && + index < PyList_GET_SIZE(interp->modules_by_index) && + module == PyList_GET_ITEM(interp->modules_by_index, index)) + { + _Py_FatalErrorFormat(__func__, "module %p already added", module); return -1; } - return _PyState_AddModule(module, def); + return _PyState_AddModule(tstate, module, def); } int PyState_RemoveModule(struct PyModuleDef* def) { - PyInterpreterState *state; - Py_ssize_t index = def->m_base.m_index; + PyThreadState *tstate = _PyThreadState_GET(); + PyInterpreterState *interp = tstate->interp; + if (def->m_slots) { - PyErr_SetString(PyExc_SystemError, - "PyState_RemoveModule called on module with slots"); + _PyErr_SetString(tstate, + PyExc_SystemError, + "PyState_RemoveModule called on module with slots"); return -1; } - state = _PyInterpreterState_GET_UNSAFE(); + + Py_ssize_t index = def->m_base.m_index; if (index == 0) { - Py_FatalError("PyState_RemoveModule: Module index invalid."); - return -1; + Py_FatalError("invalid module index"); } - if (state->modules_by_index == NULL) { - Py_FatalError("PyState_RemoveModule: Interpreters module-list not accessible."); - return -1; + if (interp->modules_by_index == NULL) { + Py_FatalError("Interpreters module-list not accessible."); } - if (index > PyList_GET_SIZE(state->modules_by_index)) { - Py_FatalError("PyState_RemoveModule: Module index out of bounds."); - return -1; + if (index > PyList_GET_SIZE(interp->modules_by_index)) { + Py_FatalError("Module index out of bounds."); } + Py_INCREF(Py_None); - return PyList_SetItem(state->modules_by_index, index, Py_None); + return PyList_SetItem(interp->modules_by_index, index, Py_None); } -/* used by import.c:PyImport_Cleanup */ +/* Used by PyImport_Cleanup() */ void -_PyState_ClearModules(void) -{ - PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE(); - if (state->modules_by_index) { - Py_ssize_t i; - for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) { - PyObject *m = PyList_GET_ITEM(state->modules_by_index, i); - if (PyModule_Check(m)) { - /* cleanup the saved copy of module dicts */ - PyModuleDef *md = PyModule_GetDef(m); - if (md) - Py_CLEAR(md->m_base.m_copy); +_PyInterpreterState_ClearModules(PyInterpreterState *interp) +{ + if (!interp->modules_by_index) { + return; + } + + Py_ssize_t i; + for (i = 0; i < PyList_GET_SIZE(interp->modules_by_index); i++) { + PyObject *m = PyList_GET_ITEM(interp->modules_by_index, i); + if (PyModule_Check(m)) { + /* cleanup the saved copy of module dicts */ + PyModuleDef *md = PyModule_GetDef(m); + if (md) { + Py_CLEAR(md->m_base.m_copy); } } - /* Setting modules_by_index to NULL could be dangerous, so we - clear the list instead. */ - if (PyList_SetSlice(state->modules_by_index, - 0, PyList_GET_SIZE(state->modules_by_index), - NULL)) - PyErr_WriteUnraisable(state->modules_by_index); + } + + /* Setting modules_by_index to NULL could be dangerous, so we + clear the list instead. */ + if (PyList_SetSlice(interp->modules_by_index, + 0, PyList_GET_SIZE(interp->modules_by_index), + NULL)) { + PyErr_WriteUnraisable(interp->modules_by_index); } } void PyThreadState_Clear(PyThreadState *tstate) { - int verbose = tstate->interp->config.verbose; + int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose; if (verbose && tstate->frame != NULL) { /* bpo-20526: After the main thread calls @@ -802,80 +824,83 @@ PyThreadState_Clear(PyThreadState *tstate) Py_CLEAR(tstate->async_gen_finalizer); Py_CLEAR(tstate->context); + + if (tstate->on_delete != NULL) { + tstate->on_delete(tstate->on_delete_data); + } } /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */ static void -tstate_delete_common(_PyRuntimeState *runtime, PyThreadState *tstate) +tstate_delete_common(PyThreadState *tstate, + struct _gilstate_runtime_state *gilstate) { - if (tstate == NULL) { - Py_FatalError("PyThreadState_Delete: NULL tstate"); - } + _Py_EnsureTstateNotNULL(tstate); PyInterpreterState *interp = tstate->interp; if (interp == NULL) { - Py_FatalError("PyThreadState_Delete: NULL interp"); + Py_FatalError("NULL interpreter"); } + _PyRuntimeState *runtime = interp->runtime; + HEAD_LOCK(runtime); - if (tstate->prev) + if (tstate->prev) { tstate->prev->next = tstate->next; - else + } + else { interp->tstate_head = tstate->next; - if (tstate->next) + } + if (tstate->next) { tstate->next->prev = tstate->prev; + } HEAD_UNLOCK(runtime); - if (tstate->on_delete != NULL) { - tstate->on_delete(tstate->on_delete_data); + + if (gilstate->autoInterpreterState && + PyThread_tss_get(&gilstate->autoTSSkey) == tstate) + { + PyThread_tss_set(&gilstate->autoTSSkey, NULL); } - PyMem_RawFree(tstate); } static void -_PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate) +_PyThreadState_Delete(PyThreadState *tstate, int check_current) { - struct _gilstate_runtime_state *gilstate = &runtime->gilstate; - if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) { - Py_FatalError("PyThreadState_Delete: tstate is still current"); - } - if (gilstate->autoInterpreterState && - PyThread_tss_get(&gilstate->autoTSSkey) == tstate) - { - PyThread_tss_set(&gilstate->autoTSSkey, NULL); + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; + if (check_current) { + if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) { + _Py_FatalErrorFormat(__func__, "tstate %p is still current", tstate); + } } - tstate_delete_common(runtime, tstate); + tstate_delete_common(tstate, gilstate); + PyMem_RawFree(tstate); } void PyThreadState_Delete(PyThreadState *tstate) { - _PyThreadState_Delete(&_PyRuntime, tstate); + _PyThreadState_Delete(tstate, 1); } -static void -_PyThreadState_DeleteCurrent(_PyRuntimeState *runtime) +void +_PyThreadState_DeleteCurrent(PyThreadState *tstate) { - struct _gilstate_runtime_state *gilstate = &runtime->gilstate; - PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate); - if (tstate == NULL) - Py_FatalError( - "PyThreadState_DeleteCurrent: no current tstate"); - tstate_delete_common(runtime, tstate); - if (gilstate->autoInterpreterState && - PyThread_tss_get(&gilstate->autoTSSkey) == tstate) - { - PyThread_tss_set(&gilstate->autoTSSkey, NULL); - } + _Py_EnsureTstateNotNULL(tstate); + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; + tstate_delete_common(tstate, gilstate); _PyRuntimeGILState_SetThreadState(gilstate, NULL); - PyEval_ReleaseLock(); + _PyEval_ReleaseLock(tstate); + PyMem_RawFree(tstate); } void -PyThreadState_DeleteCurrent() +PyThreadState_DeleteCurrent(void) { - _PyThreadState_DeleteCurrent(&_PyRuntime); + struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; + PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate); + _PyThreadState_DeleteCurrent(tstate); } @@ -890,25 +915,30 @@ void _PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate) { PyInterpreterState *interp = tstate->interp; - PyThreadState *p, *next, *garbage; + HEAD_LOCK(runtime); /* Remove all thread states, except tstate, from the linked list of thread states. This will allow calling PyThreadState_Clear() without holding the lock. */ - garbage = interp->tstate_head; - if (garbage == tstate) - garbage = tstate->next; - if (tstate->prev) + PyThreadState *list = interp->tstate_head; + if (list == tstate) { + list = tstate->next; + } + if (tstate->prev) { tstate->prev->next = tstate->next; - if (tstate->next) + } + if (tstate->next) { tstate->next->prev = tstate->prev; + } tstate->prev = tstate->next = NULL; interp->tstate_head = tstate; HEAD_UNLOCK(runtime); + /* Clear and deallocate all stale thread states. Even if this executes Python code, we should be safe since it executes in the current thread, not one of the stale threads. */ - for (p = garbage; p; p = next) { + PyThreadState *p, *next; + for (p = list; p; p = next) { next = p->next; PyThreadState_Clear(p); PyMem_RawFree(p); @@ -927,9 +957,7 @@ PyThreadState * PyThreadState_Get(void) { PyThreadState *tstate = _PyThreadState_GET(); - if (tstate == NULL) - Py_FatalError("PyThreadState_Get: no current thread"); - + _Py_EnsureTstateNotNULL(tstate); return tstate; } @@ -971,20 +999,54 @@ PyThreadState_Swap(PyThreadState *newts) PyThreadState_GetDict() returns NULL, an exception has *not* been raised and the caller should assume no per-thread state is available. */ +PyObject * +_PyThreadState_GetDict(PyThreadState *tstate) +{ + assert(tstate != NULL); + if (tstate->dict == NULL) { + tstate->dict = PyDict_New(); + if (tstate->dict == NULL) { + _PyErr_Clear(tstate); + } + } + return tstate->dict; +} + + PyObject * PyThreadState_GetDict(void) { PyThreadState *tstate = _PyThreadState_GET(); - if (tstate == NULL) + if (tstate == NULL) { return NULL; - - if (tstate->dict == NULL) { - PyObject *d; - tstate->dict = d = PyDict_New(); - if (d == NULL) - PyErr_Clear(); } - return tstate->dict; + return _PyThreadState_GetDict(tstate); +} + + +PyInterpreterState * +PyThreadState_GetInterpreter(PyThreadState *tstate) +{ + assert(tstate != NULL); + return tstate->interp; +} + + +PyFrameObject* +PyThreadState_GetFrame(PyThreadState *tstate) +{ + assert(tstate != NULL); + PyFrameObject *frame = tstate->frame; + Py_XINCREF(frame); + return frame; +} + + +uint64_t +PyThreadState_GetID(PyThreadState *tstate) +{ + assert(tstate != NULL); + return tstate->id; } @@ -1009,23 +1071,26 @@ PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) * head_mutex for the duration. */ HEAD_LOCK(runtime); - for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) { - if (p->thread_id == id) { - /* Tricky: we need to decref the current value - * (if any) in p->async_exc, but that can in turn - * allow arbitrary Python code to run, including - * perhaps calls to this function. To prevent - * deadlock, we need to release head_mutex before - * the decref. - */ - PyObject *old_exc = p->async_exc; - Py_XINCREF(exc); - p->async_exc = exc; - HEAD_UNLOCK(runtime); - Py_XDECREF(old_exc); - _PyEval_SignalAsyncExc(&runtime->ceval); - return 1; + for (PyThreadState *tstate = interp->tstate_head; tstate != NULL; tstate = tstate->next) { + if (tstate->thread_id != id) { + continue; } + + /* Tricky: we need to decref the current value + * (if any) in tstate->async_exc, but that can in turn + * allow arbitrary Python code to run, including + * perhaps calls to this function. To prevent + * deadlock, we need to release head_mutex before + * the decref. + */ + PyObject *old_exc = tstate->async_exc; + Py_XINCREF(exc); + tstate->async_exc = exc; + HEAD_UNLOCK(runtime); + + Py_XDECREF(old_exc); + _PyEval_SignalAsyncExc(tstate); + return 1; } HEAD_UNLOCK(runtime); return 0; @@ -1070,16 +1135,15 @@ PyThreadState_Next(PyThreadState *tstate) { PyObject * _PyThread_CurrentFrames(void) { - PyObject *result; - PyInterpreterState *i; - - if (PySys_Audit("sys._current_frames", NULL) < 0) { + PyThreadState *tstate = _PyThreadState_GET(); + if (_PySys_Audit(tstate, "sys._current_frames", NULL) < 0) { return NULL; } - result = PyDict_New(); - if (result == NULL) + PyObject *result = PyDict_New(); + if (result == NULL) { return NULL; + } /* for i in all interpreters: * for t in all of i's thread states: @@ -1087,32 +1151,35 @@ _PyThread_CurrentFrames(void) * Because these lists can mutate even when the GIL is held, we * need to grab head_mutex for the duration. */ - _PyRuntimeState *runtime = &_PyRuntime; + _PyRuntimeState *runtime = tstate->interp->runtime; HEAD_LOCK(runtime); + PyInterpreterState *i; for (i = runtime->interpreters.head; i != NULL; i = i->next) { PyThreadState *t; for (t = i->tstate_head; t != NULL; t = t->next) { - PyObject *id; - int stat; - struct _frame *frame = t->frame; - if (frame == NULL) + PyFrameObject *frame = t->frame; + if (frame == NULL) { continue; - id = PyLong_FromUnsignedLong(t->thread_id); - if (id == NULL) - goto Fail; - stat = PyDict_SetItem(result, id, (PyObject *)frame); + } + PyObject *id = PyLong_FromUnsignedLong(t->thread_id); + if (id == NULL) { + goto fail; + } + int stat = PyDict_SetItem(result, id, (PyObject *)frame); Py_DECREF(id); - if (stat < 0) - goto Fail; + if (stat < 0) { + goto fail; + } } } - HEAD_UNLOCK(runtime); - return result; + goto done; + +fail: + Py_CLEAR(result); - Fail: +done: HEAD_UNLOCK(runtime); - Py_DECREF(result); - return NULL; + return result; } /* Python "auto thread state" API. */ @@ -1137,24 +1204,30 @@ PyThreadState_IsCurrent(PyThreadState *tstate) /* Internal initialization/finalization functions called by Py_Initialize/Py_FinalizeEx */ -void -_PyGILState_Init(_PyRuntimeState *runtime, - PyInterpreterState *interp, PyThreadState *tstate) +PyStatus +_PyGILState_Init(PyThreadState *tstate) { + if (!_Py_IsMainInterpreter(tstate)) { + /* Currently, PyGILState is shared by all interpreters. The main + * interpreter is responsible to initialize it. */ + return _PyStatus_OK(); + } + /* must init with valid states */ - assert(interp != NULL); assert(tstate != NULL); + assert(tstate->interp != NULL); - struct _gilstate_runtime_state *gilstate = &runtime->gilstate; + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) { - Py_FatalError("Could not allocate TSS entry"); + return _PyStatus_NO_MEMORY(); } - gilstate->autoInterpreterState = interp; + gilstate->autoInterpreterState = tstate->interp; assert(PyThread_tss_get(&gilstate->autoTSSkey) == NULL); assert(tstate->gilstate_counter == 0); _PyGILState_NoteThreadState(gilstate, tstate); + return _PyStatus_OK(); } PyInterpreterState * @@ -1164,9 +1237,9 @@ _PyGILState_GetInterpreterStateUnsafe(void) } void -_PyGILState_Fini(_PyRuntimeState *runtime) +_PyGILState_Fini(PyThreadState *tstate) { - struct _gilstate_runtime_state *gilstate = &runtime->gilstate; + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; PyThread_tss_delete(&gilstate->autoTSSkey); gilstate->autoInterpreterState = NULL; } @@ -1250,12 +1323,11 @@ PyGILState_GetThisThreadState(void) int PyGILState_Check(void) { - - if (!_PyGILState_check_enabled) { + struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; + if (!gilstate->check_enabled) { return 1; } - struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; if (!PyThread_tss_is_created(&gilstate->autoTSSkey)) { return 1; } @@ -1271,27 +1343,28 @@ PyGILState_Check(void) PyGILState_STATE PyGILState_Ensure(void) { - struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; - int current; - PyThreadState *tcur; - int need_init_threads = 0; + _PyRuntimeState *runtime = &_PyRuntime; + struct _gilstate_runtime_state *gilstate = &runtime->gilstate; /* Note that we do not auto-init Python here - apart from potential races with 2 threads auto-initializing, pep-311 spells out other issues. Embedders are expected to have - called Py_Initialize() and usually PyEval_InitThreads(). - */ - /* Py_Initialize() hasn't been called! */ + called Py_Initialize(). */ + + /* Ensure that _PyEval_InitThreads() and _PyGILState_Init() have been + called by Py_Initialize() */ + assert(_PyEval_ThreadsInitialized(runtime)); assert(gilstate->autoInterpreterState); - tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey); + PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey); + int current; if (tcur == NULL) { - need_init_threads = 1; - - /* Create a new thread state for this thread */ + /* Create a new Python thread state for this thread */ tcur = PyThreadState_New(gilstate->autoInterpreterState); - if (tcur == NULL) + if (tcur == NULL) { Py_FatalError("Couldn't create thread-state for new thread"); + } + /* This is our thread state! We'll need to delete it in the matching call to PyGILState_Release(). */ tcur->gilstate_counter = 0; @@ -1312,13 +1385,6 @@ PyGILState_Ensure(void) */ ++tcur->gilstate_counter; - if (need_init_threads) { - /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is - called from a new thread for the first time, we need the create the - GIL. */ - PyEval_InitThreads(); - } - return current ? PyGILState_LOCKED : PyGILState_UNLOCKED; } @@ -1326,8 +1392,8 @@ void PyGILState_Release(PyGILState_STATE oldstate) { _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tcur = PyThread_tss_get(&runtime->gilstate.autoTSSkey); - if (tcur == NULL) { + PyThreadState *tstate = PyThread_tss_get(&runtime->gilstate.autoTSSkey); + if (tstate == NULL) { Py_FatalError("auto-releasing thread-state, " "but no thread-state for this thread"); } @@ -1337,26 +1403,29 @@ PyGILState_Release(PyGILState_STATE oldstate) but while this is very new (April 2003), the extra check by release-only users can't hurt. */ - if (!PyThreadState_IsCurrent(tcur)) { - Py_FatalError("This thread state must be current when releasing"); + if (!PyThreadState_IsCurrent(tstate)) { + _Py_FatalErrorFormat(__func__, + "thread state %p must be current when releasing", + tstate); } - assert(PyThreadState_IsCurrent(tcur)); - --tcur->gilstate_counter; - assert(tcur->gilstate_counter >= 0); /* illegal counter value */ + assert(PyThreadState_IsCurrent(tstate)); + --tstate->gilstate_counter; + assert(tstate->gilstate_counter >= 0); /* illegal counter value */ /* If we're going to destroy this thread-state, we must * clear it while the GIL is held, as destructors may run. */ - if (tcur->gilstate_counter == 0) { + if (tstate->gilstate_counter == 0) { /* can't have been locked when we created it */ assert(oldstate == PyGILState_UNLOCKED); - PyThreadState_Clear(tcur); + PyThreadState_Clear(tstate); /* Delete the thread-state. Note this releases the GIL too! * It's vital that the GIL be held here, to avoid shutdown * races; see bugs 225673 and 1061968 (that nasty bug has a * habit of coming back). */ - _PyThreadState_DeleteCurrent(runtime); + assert(_PyRuntimeGILState_GetThreadState(&runtime->gilstate) == tstate); + _PyThreadState_DeleteCurrent(tstate); } /* Release the lock if necessary */ else if (oldstate == PyGILState_UNLOCKED) @@ -1395,19 +1464,19 @@ _PyObject_CheckCrossInterpreterData(PyObject *obj) } static int -_check_xidata(_PyCrossInterpreterData *data) +_check_xidata(PyThreadState *tstate, _PyCrossInterpreterData *data) { // data->data can be anything, including NULL, so we don't check it. // data->obj may be NULL, so we don't check it. if (data->interp < 0) { - PyErr_SetString(PyExc_SystemError, "missing interp"); + _PyErr_SetString(tstate, PyExc_SystemError, "missing interp"); return -1; } if (data->new_object == NULL) { - PyErr_SetString(PyExc_SystemError, "missing new_object func"); + _PyErr_SetString(tstate, PyExc_SystemError, "missing new_object func"); return -1; } @@ -1419,9 +1488,9 @@ _check_xidata(_PyCrossInterpreterData *data) int _PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data) { - // _PyInterpreterState_Get() aborts if lookup fails, so we don't need - // to check the result for NULL. - PyInterpreterState *interp = _PyInterpreterState_Get(); + // PyThreadState_Get() aborts if tstate is NULL. + PyThreadState *tstate = PyThreadState_Get(); + PyInterpreterState *interp = tstate->interp; // Reset data before re-populating. *data = (_PyCrossInterpreterData){0}; @@ -1442,7 +1511,7 @@ _PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data) // Fill in the blanks and validate the result. data->interp = interp->id; - if (_check_xidata(data) != 0) { + if (_check_xidata(tstate, data) != 0) { _PyCrossInterpreterData_Release(data); return -1; } @@ -1496,7 +1565,7 @@ _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) // Switch to the original interpreter. PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp); if (interp == NULL) { - // The intepreter was already destroyed. + // The interpreter was already destroyed. if (data->free != NULL) { // XXX Someone leaked some memory... } @@ -1718,6 +1787,44 @@ _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry) } +_PyFrameEvalFunction +_PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp) +{ + return interp->eval_frame; +} + + +void +_PyInterpreterState_SetEvalFrameFunc(PyInterpreterState *interp, + _PyFrameEvalFunction eval_frame) +{ + interp->eval_frame = eval_frame; +} + + +const PyConfig* +_PyInterpreterState_GetConfig(PyInterpreterState *interp) +{ + return &interp->config; +} + + +PyStatus +_PyInterpreterState_SetConfig(PyInterpreterState *interp, + const PyConfig *config) +{ + return _PyConfig_Copy(&interp->config, config); +} + + +const PyConfig* +_Py_GetConfig(void) +{ + assert(PyGILState_Check()); + PyThreadState *tstate = _PyThreadState_GET(); + return _PyInterpreterState_GetConfig(tstate->interp); +} + #ifdef __cplusplus } #endif diff --git a/Python/pystrhex.c b/Python/pystrhex.c index 9d34f71a..b74e57ad 100644 --- a/Python/pystrhex.c +++ b/Python/pystrhex.c @@ -8,12 +8,9 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, const PyObject* sep, int bytes_per_sep_group, const int return_bytes) { - PyObject *retval; - Py_UCS1* retbuf; - Py_ssize_t i, j, resultlen = 0; - Py_UCS1 sep_char = 0; - unsigned int abs_bytes_per_sep; + assert(arglen >= 0); + Py_UCS1 sep_char = 0; if (sep) { Py_ssize_t seplen = PyObject_Length((PyObject*)sep); if (seplen < 0) { @@ -31,9 +28,11 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, return NULL; } sep_char = PyUnicode_READ_CHAR(sep, 0); - } else if (PyBytes_Check(sep)) { + } + else if (PyBytes_Check(sep)) { sep_char = PyBytes_AS_STRING(sep)[0]; - } else { + } + else { PyErr_SetString(PyExc_TypeError, "sep must be str or bytes."); return NULL; } @@ -41,12 +40,13 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, PyErr_SetString(PyExc_ValueError, "sep must be ASCII."); return NULL; } - } else { + } + else { bytes_per_sep_group = 0; } - assert(arglen >= 0); - abs_bytes_per_sep = abs(bytes_per_sep_group); + unsigned int abs_bytes_per_sep = abs(bytes_per_sep_group); + Py_ssize_t resultlen = 0; if (bytes_per_sep_group && arglen > 0) { /* How many sep characters we'll be inserting. */ resultlen = (arglen - 1) / abs_bytes_per_sep; @@ -62,43 +62,82 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, abs_bytes_per_sep = 0; } + PyObject *retval; + Py_UCS1 *retbuf; if (return_bytes) { /* If _PyBytes_FromSize() were public we could avoid malloc+copy. */ - retbuf = (Py_UCS1*) PyMem_Malloc(resultlen); - if (!retbuf) - return PyErr_NoMemory(); - retval = NULL; /* silence a compiler warning, assigned later. */ - } else { + retval = PyBytes_FromStringAndSize(NULL, resultlen); + if (!retval) { + return NULL; + } + retbuf = (Py_UCS1 *)PyBytes_AS_STRING(retval); + } + else { retval = PyUnicode_New(resultlen, 127); - if (!retval) + if (!retval) { return NULL; + } retbuf = PyUnicode_1BYTE_DATA(retval); } /* Hexlify */ - for (i=j=0; i < arglen; ++i) { - assert(j < resultlen); - unsigned char c; - c = (argbuf[i] >> 4) & 0xf; - retbuf[j++] = Py_hexdigits[c]; - c = argbuf[i] & 0xf; - retbuf[j++] = Py_hexdigits[c]; - if (bytes_per_sep_group && i < arglen - 1) { - Py_ssize_t anchor; - anchor = (bytes_per_sep_group > 0) ? (arglen - 1 - i) : (i + 1); - if (anchor % abs_bytes_per_sep == 0) { + Py_ssize_t i, j; + unsigned char c; + + if (bytes_per_sep_group == 0) { + for (i = j = 0; i < arglen; ++i) { + assert((j + 1) < resultlen); + c = argbuf[i]; + retbuf[j++] = Py_hexdigits[c >> 4]; + retbuf[j++] = Py_hexdigits[c & 0x0f]; + } + assert(j == resultlen); + } + else { + /* The number of complete chunk+sep periods */ + Py_ssize_t chunks = (arglen - 1) / abs_bytes_per_sep; + Py_ssize_t chunk; + unsigned int k; + + if (bytes_per_sep_group < 0) { + i = j = 0; + for (chunk = 0; chunk < chunks; chunk++) { + for (k = 0; k < abs_bytes_per_sep; k++) { + c = argbuf[i++]; + retbuf[j++] = Py_hexdigits[c >> 4]; + retbuf[j++] = Py_hexdigits[c & 0x0f]; + } retbuf[j++] = sep_char; } + while (i < arglen) { + c = argbuf[i++]; + retbuf[j++] = Py_hexdigits[c >> 4]; + retbuf[j++] = Py_hexdigits[c & 0x0f]; + } + assert(j == resultlen); + } + else { + i = arglen - 1; + j = resultlen - 1; + for (chunk = 0; chunk < chunks; chunk++) { + for (k = 0; k < abs_bytes_per_sep; k++) { + c = argbuf[i--]; + retbuf[j--] = Py_hexdigits[c & 0x0f]; + retbuf[j--] = Py_hexdigits[c >> 4]; + } + retbuf[j--] = sep_char; + } + while (i >= 0) { + c = argbuf[i--]; + retbuf[j--] = Py_hexdigits[c & 0x0f]; + retbuf[j--] = Py_hexdigits[c >> 4]; + } + assert(j == -1); } } - assert(j == resultlen); - if (return_bytes) { - retval = PyBytes_FromStringAndSize((const char *)retbuf, resultlen); - PyMem_Free(retbuf); - } #ifdef Py_DEBUG - else { + if (!return_bytes) { assert(_PyUnicode_CheckConsistency(retval, 1)); } #endif diff --git a/Python/pystrtod.c b/Python/pystrtod.c index 4aa99d54..1c8202c7 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -1,6 +1,7 @@ /* -*- Mode: C; c-file-style: "python" -*- */ #include +#include "pycore_dtoa.h" #include /* Case-insensitive string match used for nan and inf detection; t should be @@ -342,9 +343,7 @@ PyOS_string_to_double(const char *s, char *fail_pos; errno = 0; - PyFPE_START_PROTECT("PyOS_string_to_double", return -1.0) x = _PyOS_ascii_strtod(s, &fail_pos); - PyFPE_END_PROTECT(x) if (errno == ENOMEM) { PyErr_NoMemory(); diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 6cdd8ea7..70748dc5 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -12,34 +12,35 @@ #include "Python-ast.h" #undef Yield /* undefine macro conflicting with */ -#include "pycore_pyerrors.h" -#include "pycore_pylifecycle.h" -#include "pycore_pystate.h" -#include "grammar.h" -#include "node.h" -#include "token.h" -#include "parsetok.h" -#include "errcode.h" -#include "code.h" -#include "symtable.h" -#include "ast.h" -#include "marshal.h" -#include "osdefs.h" -#include - -#ifdef HAVE_SIGNAL_H -#include -#endif + +#include "pycore_interp.h" // PyInterpreterState.importlib +#include "pycore_object.h" // _PyDebug_PrintTotalRefs() +#include "pycore_pyerrors.h" // _PyErr_Fetch +#include "pycore_pylifecycle.h" // _Py_UnhandledKeyboardInterrupt +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "pycore_sysmodule.h" // _PySys_Audit() + +#include "node.h" // node +#include "token.h" // INDENT +#include "parsetok.h" // perrdetail +#include "errcode.h" // E_EOF +#include "code.h" // PyCodeObject +#include "symtable.h" // PySymtable_BuildObject() +#include "ast.h" // PyAST_FromNodeObject() +#include "marshal.h" // PyMarshal_ReadLongFromFile() + +#include "pegen_interface.h" // PyPegen_ASTFrom* #ifdef MS_WINDOWS -#include "malloc.h" /* for alloca */ +# include "malloc.h" // alloca() #endif #ifdef MS_WINDOWS -#undef BYTE -#include "windows.h" +# undef BYTE +# include "windows.h" #endif + _Py_IDENTIFIER(builtins); _Py_IDENTIFIER(excepthook); _Py_IDENTIFIER(flush); @@ -57,7 +58,7 @@ _Py_static_string(PyId_string, ""); extern "C" { #endif -extern grammar _PyParser_Grammar; /* From graminit.c */ +extern Py_EXPORTED_SYMBOL grammar _PyParser_Grammar; /* From graminit.c */ /* Forward */ static void flush_io(void); @@ -94,7 +95,7 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags * PyCompilerFlags local_flags = _PyCompilerFlags_INIT; int nomem_count = 0; #ifdef Py_REF_DEBUG - int show_ref_count = _PyInterpreterState_Get()->config.show_ref_count; + int show_ref_count = _Py_GetConfig()->show_ref_count; #endif filename = PyUnicode_DecodeFSDefault(filename_str); @@ -184,6 +185,7 @@ PyRun_InteractiveOneObjectEx(FILE *fp, PyObject *filename, PyArena *arena; const char *ps1 = "", *ps2 = "", *enc = NULL; int errcode = 0; + int use_peg = _PyInterpreterState_GET()->config._use_peg_parser; _Py_IDENTIFIER(encoding); _Py_IDENTIFIER(__main__); @@ -236,9 +238,17 @@ PyRun_InteractiveOneObjectEx(FILE *fp, PyObject *filename, Py_XDECREF(oenc); return -1; } - mod = PyParser_ASTFromFileObject(fp, filename, enc, - Py_single_input, ps1, ps2, - flags, &errcode, arena); + + if (use_peg) { + mod = PyPegen_ASTFromFileObject(fp, filename, Py_single_input, + enc, ps1, ps2, flags, &errcode, arena); + } + else { + mod = PyParser_ASTFromFileObject(fp, filename, enc, + Py_single_input, ps1, ps2, + flags, &errcode, arena); + } + Py_XDECREF(v); Py_XDECREF(w); Py_XDECREF(oenc); @@ -345,7 +355,7 @@ set_main_loader(PyObject *d, const char *filename, const char *loader_name) filename_obj = PyUnicode_DecodeFSDefault(filename); if (filename_obj == NULL) return -1; - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); bootstrap = PyObject_GetAttrString(interp->importlib, "_bootstrap_external"); if (bootstrap != NULL) { @@ -468,9 +478,9 @@ PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags) static int parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, - int *lineno, int *offset, PyObject **text) + Py_ssize_t *lineno, Py_ssize_t *offset, PyObject **text) { - int hold; + Py_ssize_t hold; PyObject *v; _Py_IDENTIFIER(msg); _Py_IDENTIFIER(filename); @@ -503,7 +513,7 @@ parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, v = _PyObject_GetAttrId(err, &PyId_lineno); if (!v) goto finally; - hold = _PyLong_AsInt(v); + hold = PyLong_AsSsize_t(v); Py_DECREF(v); if (hold < 0 && PyErr_Occurred()) goto finally; @@ -516,7 +526,7 @@ parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, *offset = -1; Py_DECREF(v); } else { - hold = _PyLong_AsInt(v); + hold = PyLong_AsSsize_t(v); Py_DECREF(v); if (hold < 0 && PyErr_Occurred()) goto finally; @@ -542,39 +552,67 @@ finally: } static void -print_error_text(PyObject *f, int offset, PyObject *text_obj) +print_error_text(PyObject *f, Py_ssize_t offset, PyObject *text_obj) { - const char *text; - const char *nl; - - text = PyUnicode_AsUTF8(text_obj); + /* Convert text to a char pointer; return if error */ + const char *text = PyUnicode_AsUTF8(text_obj); if (text == NULL) return; - if (offset >= 0) { - if (offset > 0 && (size_t)offset == strlen(text) && text[offset - 1] == '\n') - offset--; - for (;;) { - nl = strchr(text, '\n'); - if (nl == NULL || nl-text >= offset) - break; - offset -= (int)(nl+1-text); - text = nl+1; + /* Convert offset from 1-based to 0-based */ + offset--; + + /* Strip leading whitespace from text, adjusting offset as we go */ + while (*text == ' ' || *text == '\t' || *text == '\f') { + text++; + offset--; + } + + /* Calculate text length excluding trailing newline */ + Py_ssize_t len = strlen(text); + if (len > 0 && text[len-1] == '\n') { + len--; + } + + /* Clip offset to at most len */ + if (offset > len) { + offset = len; + } + + /* Skip past newlines embedded in text */ + for (;;) { + const char *nl = strchr(text, '\n'); + if (nl == NULL) { + break; } - while (*text == ' ' || *text == '\t' || *text == '\f') { - text++; - offset--; + Py_ssize_t inl = nl - text; + if (inl >= offset) { + break; } + inl += 1; + text += inl; + len -= inl; + offset -= (int)inl; } + + /* Print text */ PyFile_WriteString(" ", f); PyFile_WriteString(text, f); - if (*text == '\0' || text[strlen(text)-1] != '\n') + + /* Make sure there's a newline at the end */ + if (text[len] != '\n') { PyFile_WriteString("\n", f); - if (offset == -1) + } + + /* Don't print caret if it points to the left of the text */ + if (offset < 0) return; + + /* Write caret line */ PyFile_WriteString(" ", f); - while (--offset > 0) + while (--offset >= 0) { PyFile_WriteString(" ", f); + } PyFile_WriteString("^\n", f); } @@ -582,7 +620,7 @@ print_error_text(PyObject *f, int offset, PyObject *text_obj) int _Py_HandleSystemExit(int *exitcode_p) { - int inspect = _PyInterpreterState_GET_UNSAFE()->config.inspect; + int inspect = _Py_GetConfig()->inspect; if (inspect) { /* Don't exit if -i flag was given. This flag is set to 0 * when entering interactive mode for inspecting. */ @@ -695,8 +733,8 @@ _PyErr_PrintEx(PyThreadState *tstate, int set_sys_last_vars) } } hook = _PySys_GetObjectId(&PyId_excepthook); - if (PySys_Audit("sys.excepthook", "OOOO", hook ? hook : Py_None, - exception, v, tb) < 0) { + if (_PySys_Audit(tstate, "sys.excepthook", "OOOO", hook ? hook : Py_None, + exception, v, tb) < 0) { if (PyErr_ExceptionMatches(PyExc_RuntimeError)) { PyErr_Clear(); goto done; @@ -795,7 +833,7 @@ print_exception(PyObject *f, PyObject *value) _PyObject_HasAttrId(value, &PyId_print_file_and_line)) { PyObject *message, *filename, *text; - int lineno, offset; + Py_ssize_t lineno, offset; if (!parse_syntax_error(value, &message, &filename, &lineno, &offset, &text)) PyErr_Clear(); @@ -805,7 +843,7 @@ print_exception(PyObject *f, PyObject *value) Py_DECREF(value); value = message; - line = PyUnicode_FromFormat(" File \"%S\", line %d\n", + line = PyUnicode_FromFormat(" File \"%S\", line %zd\n", filename, lineno); Py_DECREF(filename); if (line != NULL) { @@ -986,7 +1024,7 @@ _PyErr_Display(PyObject *file, PyObject *exception, PyObject *value, PyObject *t Py_XDECREF(seen); /* Call file.flush() */ - PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL); + PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); if (!res) { /* Silently ignore file.flush() error */ PyErr_Clear(); @@ -1020,6 +1058,7 @@ PyRun_StringFlags(const char *str, int start, PyObject *globals, mod_ty mod; PyArena *arena; PyObject *filename; + int use_peg = _PyInterpreterState_GET()->config._use_peg_parser; filename = _PyUnicode_FromId(&PyId_string); /* borrowed */ if (filename == NULL) @@ -1029,7 +1068,13 @@ PyRun_StringFlags(const char *str, int start, PyObject *globals, if (arena == NULL) return NULL; - mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + if (use_peg) { + mod = PyPegen_ASTFromStringObject(str, filename, start, flags, arena); + } + else { + mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + } + if (mod != NULL) ret = run_mod(mod, filename, globals, locals, flags, arena); PyArena_Free(arena); @@ -1044,6 +1089,7 @@ PyRun_FileExFlags(FILE *fp, const char *filename_str, int start, PyObject *globa mod_ty mod; PyArena *arena = NULL; PyObject *filename; + int use_peg = _PyInterpreterState_GET()->config._use_peg_parser; filename = PyUnicode_DecodeFSDefault(filename_str); if (filename == NULL) @@ -1053,8 +1099,15 @@ PyRun_FileExFlags(FILE *fp, const char *filename_str, int start, PyObject *globa if (arena == NULL) goto exit; - mod = PyParser_ASTFromFileObject(fp, filename, NULL, start, 0, 0, - flags, NULL, arena); + if (use_peg) { + mod = PyPegen_ASTFromFileObject(fp, filename, start, NULL, NULL, NULL, + flags, NULL, arena); + } + else { + mod = PyParser_ASTFromFileObject(fp, filename, NULL, start, 0, 0, + flags, NULL, arena); + } + if (closeit) fclose(fp); if (mod == NULL) { @@ -1080,7 +1133,7 @@ flush_io(void) f = _PySys_GetObjectId(&PyId_stderr); if (f != NULL) { - r = _PyObject_CallMethodId(f, &PyId_flush, NULL); + r = _PyObject_CallMethodIdNoArgs(f, &PyId_flush); if (r) Py_DECREF(r); else @@ -1088,7 +1141,7 @@ flush_io(void) } f = _PySys_GetObjectId(&PyId_stdout); if (f != NULL) { - r = _PyObject_CallMethodId(f, &PyId_flush, NULL); + r = _PyObject_CallMethodIdNoArgs(f, &PyId_flush); if (r) Py_DECREF(r); else @@ -1099,7 +1152,7 @@ flush_io(void) } static PyObject * -run_eval_code_obj(PyCodeObject *co, PyObject *globals, PyObject *locals) +run_eval_code_obj(PyThreadState *tstate, PyCodeObject *co, PyObject *globals, PyObject *locals) { PyObject *v; /* @@ -1116,14 +1169,14 @@ run_eval_code_obj(PyCodeObject *co, PyObject *globals, PyObject *locals) /* Set globals['__builtins__'] if it doesn't exist */ if (globals != NULL && PyDict_GetItemString(globals, "__builtins__") == NULL) { - PyInterpreterState *interp = _PyInterpreterState_Get(); - if (PyDict_SetItemString(globals, "__builtins__", interp->builtins) < 0) { + if (PyDict_SetItemString(globals, "__builtins__", + tstate->interp->builtins) < 0) { return NULL; } } v = PyEval_EvalCode((PyObject*)co, globals, locals); - if (!v && PyErr_Occurred() == PyExc_KeyboardInterrupt) { + if (!v && _PyErr_Occurred(tstate) == PyExc_KeyboardInterrupt) { _Py_UnhandledKeyboardInterrupt = 1; } return v; @@ -1133,18 +1186,17 @@ static PyObject * run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals, PyCompilerFlags *flags, PyArena *arena) { - PyCodeObject *co; - PyObject *v; - co = PyAST_CompileObject(mod, filename, flags, -1, arena); + PyThreadState *tstate = _PyThreadState_GET(); + PyCodeObject *co = PyAST_CompileObject(mod, filename, flags, -1, arena); if (co == NULL) return NULL; - if (PySys_Audit("exec", "O", co) < 0) { + if (_PySys_Audit(tstate, "exec", "O", co) < 0) { Py_DECREF(co); return NULL; } - v = run_eval_code_obj(co, globals, locals); + PyObject *v = run_eval_code_obj(tstate, co, globals, locals); Py_DECREF(co); return v; } @@ -1153,6 +1205,7 @@ static PyObject * run_pyc_file(FILE *fp, const char *filename, PyObject *globals, PyObject *locals, PyCompilerFlags *flags) { + PyThreadState *tstate = _PyThreadState_GET(); PyCodeObject *co; PyObject *v; long magic; @@ -1181,7 +1234,7 @@ run_pyc_file(FILE *fp, const char *filename, PyObject *globals, } fclose(fp); co = (PyCodeObject *)v; - v = run_eval_code_obj(co, globals, locals); + v = run_eval_code_obj(tstate, co, globals, locals); if (v && flags) flags->cf_flags |= (co->co_flags & PyCF_MASK); Py_DECREF(co); @@ -1197,11 +1250,17 @@ Py_CompileStringObject(const char *str, PyObject *filename, int start, { PyCodeObject *co; mod_ty mod; + int use_peg = _PyInterpreterState_GET()->config._use_peg_parser; PyArena *arena = PyArena_New(); if (arena == NULL) return NULL; - mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + if (use_peg) { + mod = PyPegen_ASTFromStringObject(str, filename, start, flags, arena); + } + else { + mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + } if (mod == NULL) { PyArena_Free(arena); return NULL; @@ -1298,13 +1357,19 @@ _Py_SymtableStringObjectFlags(const char *str, PyObject *filename, int start, Py { struct symtable *st; mod_ty mod; + int use_peg = _PyInterpreterState_GET()->config._use_peg_parser; PyArena *arena; arena = PyArena_New(); if (arena == NULL) return NULL; - mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + if (use_peg) { + mod = PyPegen_ASTFromStringObject(str, filename, start, flags, arena); + } + else { + mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + } if (mod == NULL) { PyArena_Free(arena); return NULL; @@ -1566,9 +1631,6 @@ err_input(perrdetail *err) msg = "unexpected character after line continuation character"; break; - case E_IDENTIFIER: - msg = "invalid character in identifier"; - break; case E_BADSINGLE: msg = "multiple statements found while compiling a single statement"; break; diff --git a/Python/pytime.c b/Python/pytime.c index 109d5269..b121b432 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -718,11 +718,7 @@ pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise) #else /* HAVE_CLOCK_GETTIME */ /* test gettimeofday() */ -#ifdef GETTIMEOFDAY_NO_TZ - err = gettimeofday(&tv); -#else err = gettimeofday(&tv, (struct timezone *)NULL); -#endif if (err) { if (raise) { PyErr_SetFromErrno(PyExc_OSError); @@ -750,7 +746,7 @@ _PyTime_GetSystemClock(void) _PyTime_t t; if (pygettimeofday(&t, NULL, 0) < 0) { /* should not happen, _PyTime_Init() checked the clock at startup */ - Py_UNREACHABLE(); + Py_FatalError("pygettimeofday() failed"); } return t; } @@ -780,7 +776,7 @@ pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise) return -1; } /* Hello, time traveler! */ - Py_UNREACHABLE(); + Py_FatalError("pymonotonic: integer overflow"); } *tp = t * MS_TO_NS; @@ -922,7 +918,7 @@ _PyTime_GetMonotonicClock(void) if (pymonotonic(&t, NULL, 0) < 0) { /* should not happen, _PyTime_Init() checked that monotonic clock at startup */ - Py_UNREACHABLE(); + Py_FatalError("pymonotonic() failed"); } return t; } @@ -1023,7 +1019,7 @@ _PyTime_GetPerfCounter(void) { _PyTime_t t; if (_PyTime_GetPerfCounterWithInfo(&t, NULL)) { - Py_UNREACHABLE(); + Py_FatalError("_PyTime_GetPerfCounterWithInfo() failed"); } return t; } @@ -1063,7 +1059,7 @@ _PyTime_localtime(time_t t, struct tm *tm) return 0; #else /* !MS_WINDOWS */ -#ifdef _AIX +#if defined(_AIX) && (SIZEOF_TIME_T < 8) /* bpo-34373: AIX does not return NULL if t is too small or too large */ if (t < -2145916800 /* 1902-01-01 */ || t > 2145916800 /* 2038-01-01 */) { diff --git a/Python/structmember.c b/Python/structmember.c index e653d027..ba88e15f 100644 --- a/Python/structmember.c +++ b/Python/structmember.c @@ -2,8 +2,7 @@ /* Map C struct members to Python object attributes */ #include "Python.h" - -#include "structmember.h" +#include "structmember.h" // PyMemberDef PyObject * PyMember_GetOne(const char *addr, PyMemberDef *l) diff --git a/Python/symtable.c b/Python/symtable.c index 30482d99..d192f31d 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -1,8 +1,8 @@ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "symtable.h" #undef Yield /* undefine macro conflicting with */ -#include "structmember.h" +#include "structmember.h" // PyMemberDef /* error strings used for warnings */ #define GLOBAL_PARAM \ @@ -190,7 +190,7 @@ static int symtable_analyze(struct symtable *st); static int symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block, void *ast, int lineno, int col_offset); -static int symtable_exit_block(struct symtable *st, void *ast); +static int symtable_exit_block(struct symtable *st); static int symtable_visit_stmt(struct symtable *st, stmt_ty s); static int symtable_visit_expr(struct symtable *st, expr_ty s); static int symtable_visit_genexp(struct symtable *st, expr_ty s); @@ -202,11 +202,10 @@ static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty); static int symtable_visit_alias(struct symtable *st, alias_ty); static int symtable_visit_comprehension(struct symtable *st, comprehension_ty); static int symtable_visit_keyword(struct symtable *st, keyword_ty); -static int symtable_visit_slice(struct symtable *st, slice_ty); static int symtable_visit_params(struct symtable *st, asdl_seq *args); static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args); static int symtable_implicit_arg(struct symtable *st, int pos); -static int symtable_visit_annotations(struct symtable *st, stmt_ty s, arguments_ty, expr_ty); +static int symtable_visit_annotations(struct symtable *st, arguments_ty, expr_ty); static int symtable_visit_withitem(struct symtable *st, withitem_ty item); @@ -318,16 +317,12 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future) (stmt_ty)asdl_seq_GET(seq, i))) goto error; break; - case Suite_kind: - PyErr_SetString(PyExc_RuntimeError, - "this compiler does not handle Suites"); - goto error; case FunctionType_kind: PyErr_SetString(PyExc_RuntimeError, "this compiler does not handle FunctionTypes"); goto error; } - if (!symtable_exit_block(st, (void *)mod)) { + if (!symtable_exit_block(st)) { PySymtable_Free(st); return NULL; } @@ -345,7 +340,7 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future) PySymtable_Free(st); return NULL; error: - (void) symtable_exit_block(st, (void *)mod); + (void) symtable_exit_block(st); PySymtable_Free(st); return NULL; } @@ -954,7 +949,7 @@ symtable_analyze(struct symtable *st) */ static int -symtable_exit_block(struct symtable *st, void *ast) +symtable_exit_block(struct symtable *st) { Py_ssize_t size; @@ -1188,7 +1183,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults); if (s->v.FunctionDef.args->kw_defaults) VISIT_SEQ_WITH_NULL(st, expr, s->v.FunctionDef.args->kw_defaults); - if (!symtable_visit_annotations(st, s, s->v.FunctionDef.args, + if (!symtable_visit_annotations(st, s->v.FunctionDef.args, s->v.FunctionDef.returns)) VISIT_QUIT(st, 0); if (s->v.FunctionDef.decorator_list) @@ -1199,7 +1194,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) VISIT_QUIT(st, 0); VISIT(st, arguments, s->v.FunctionDef.args); VISIT_SEQ(st, stmt, s->v.FunctionDef.body); - if (!symtable_exit_block(st, s)) + if (!symtable_exit_block(st)) VISIT_QUIT(st, 0); break; case ClassDef_kind: { @@ -1217,7 +1212,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) st->st_private = s->v.ClassDef.name; VISIT_SEQ(st, stmt, s->v.ClassDef.body); st->st_private = tmp; - if (!symtable_exit_block(st, s)) + if (!symtable_exit_block(st)) VISIT_QUIT(st, 0); break; } @@ -1406,7 +1401,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) if (s->v.AsyncFunctionDef.args->kw_defaults) VISIT_SEQ_WITH_NULL(st, expr, s->v.AsyncFunctionDef.args->kw_defaults); - if (!symtable_visit_annotations(st, s, s->v.AsyncFunctionDef.args, + if (!symtable_visit_annotations(st, s->v.AsyncFunctionDef.args, s->v.AsyncFunctionDef.returns)) VISIT_QUIT(st, 0); if (s->v.AsyncFunctionDef.decorator_list) @@ -1418,7 +1413,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) st->st_cur->ste_coroutine = 1; VISIT(st, arguments, s->v.AsyncFunctionDef.args); VISIT_SEQ(st, stmt, s->v.AsyncFunctionDef.body); - if (!symtable_exit_block(st, s)) + if (!symtable_exit_block(st)) VISIT_QUIT(st, 0); break; case AsyncWith_kind: @@ -1565,7 +1560,7 @@ symtable_visit_expr(struct symtable *st, expr_ty e) VISIT_QUIT(st, 0); VISIT(st, arguments, e->v.Lambda.args); VISIT(st, expr, e->v.Lambda.body); - if (!symtable_exit_block(st, (void *)e)) + if (!symtable_exit_block(st)) VISIT_QUIT(st, 0); break; } @@ -1636,11 +1631,19 @@ symtable_visit_expr(struct symtable *st, expr_ty e) break; case Subscript_kind: VISIT(st, expr, e->v.Subscript.value); - VISIT(st, slice, e->v.Subscript.slice); + VISIT(st, expr, e->v.Subscript.slice); break; case Starred_kind: VISIT(st, expr, e->v.Starred.value); break; + case Slice_kind: + if (e->v.Slice.lower) + VISIT(st, expr, e->v.Slice.lower) + if (e->v.Slice.upper) + VISIT(st, expr, e->v.Slice.upper) + if (e->v.Slice.step) + VISIT(st, expr, e->v.Slice.step) + break; case Name_kind: if (!symtable_add_def(st, e->v.Name.id, e->v.Name.ctx == Load ? USE : DEF_LOCAL)) @@ -1714,8 +1717,7 @@ symtable_visit_argannotations(struct symtable *st, asdl_seq *args) } static int -symtable_visit_annotations(struct symtable *st, stmt_ty s, - arguments_ty a, expr_ty returns) +symtable_visit_annotations(struct symtable *st, arguments_ty a, expr_ty returns) { if (a->posonlyargs && !symtable_visit_argannotations(st, a->posonlyargs)) return 0; @@ -1846,28 +1848,6 @@ symtable_visit_keyword(struct symtable *st, keyword_ty k) } -static int -symtable_visit_slice(struct symtable *st, slice_ty s) -{ - switch (s->kind) { - case Slice_kind: - if (s->v.Slice.lower) - VISIT(st, expr, s->v.Slice.lower) - if (s->v.Slice.upper) - VISIT(st, expr, s->v.Slice.upper) - if (s->v.Slice.step) - VISIT(st, expr, s->v.Slice.step) - break; - case ExtSlice_kind: - VISIT_SEQ(st, slice, s->v.ExtSlice.dims) - break; - case Index_kind: - VISIT(st, expr, s->v.Index.value) - break; - } - return 1; -} - static int symtable_handle_comprehension(struct symtable *st, expr_ty e, identifier scope_name, asdl_seq *generators, @@ -1893,7 +1873,7 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e, /* Outermost iter is received as an argument */ if (!symtable_implicit_arg(st, 0)) { - symtable_exit_block(st, (void *)e); + symtable_exit_block(st); return 0; } /* Visit iteration variable target, and mark them as such */ @@ -1915,11 +1895,11 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e, PyErr_SyntaxLocationObject(st->st_filename, st->st_cur->ste_lineno, st->st_cur->ste_col_offset + 1); - symtable_exit_block(st, (void *)e); + symtable_exit_block(st); return 0; } st->st_cur->ste_generator = is_generator; - return symtable_exit_block(st, (void *)e); + return symtable_exit_block(st); } static int diff --git a/Python/sysmodule.c b/Python/sysmodule.c index b544f2b7..3e4115fe 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -16,17 +16,19 @@ Data members: #include "Python.h" #include "code.h" -#include "frameobject.h" +#include "frameobject.h" // PyFrame_GetBack() +#include "pycore_ceval.h" // _Py_RecursionLimitLowerWaterMark() #include "pycore_initconfig.h" -#include "pycore_pylifecycle.h" -#include "pycore_pymem.h" +#include "pycore_object.h" #include "pycore_pathconfig.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" +#include "pycore_pylifecycle.h" +#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tupleobject.h" -#include "pythread.h" -#include "pydtrace.h" -#include "osdefs.h" +#include "pydtrace.h" +#include "osdefs.h" // DELIM #include #ifdef MS_WINDOWS @@ -59,30 +61,38 @@ _Py_IDENTIFIER(stderr); _Py_IDENTIFIER(warnoptions); _Py_IDENTIFIER(write); -PyObject * -_PySys_GetObjectId(_Py_Identifier *key) +static PyObject * +sys_get_object_id(PyThreadState *tstate, _Py_Identifier *key) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyObject *sd = tstate->interp->sysdict; if (sd == NULL) { return NULL; } return _PyDict_GetItemId(sd, key); } +PyObject * +_PySys_GetObjectId(_Py_Identifier *key) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return sys_get_object_id(tstate, key); +} + PyObject * PySys_GetObject(const char *name) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *sd = tstate->interp->sysdict; if (sd == NULL) { return NULL; } return PyDict_GetItemString(sd, name); } -int -_PySys_SetObjectId(_Py_Identifier *key, PyObject *v) +static int +sys_set_object_id(PyThreadState *tstate, _Py_Identifier *key, PyObject *v) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyObject *sd = tstate->interp->sysdict; if (v == NULL) { if (_PyDict_GetItemId(sd, key) == NULL) { return 0; @@ -97,9 +107,16 @@ _PySys_SetObjectId(_Py_Identifier *key, PyObject *v) } int -PySys_SetObject(const char *name, PyObject *v) +_PySys_SetObjectId(_Py_Identifier *key, PyObject *v) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyThreadState *tstate = _PyThreadState_GET(); + return sys_set_object_id(tstate, key, v); +} + +static int +sys_set_object(PyThreadState *tstate, const char *name, PyObject *v) +{ + PyObject *sd = tstate->interp->sysdict; if (v == NULL) { if (PyDict_GetItemString(sd, name) == NULL) { return 0; @@ -113,60 +130,74 @@ PySys_SetObject(const char *name, PyObject *v) } } +int +PySys_SetObject(const char *name, PyObject *v) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return sys_set_object(tstate, name, v); +} + + static int -should_audit(void) +should_audit(PyInterpreterState *is) { - PyThreadState *ts = _PyThreadState_GET(); - if (!ts) { + /* tstate->interp cannot be NULL, but test it just in case + for extra safety */ + assert(is != NULL); + if (!is) { return 0; } - PyInterpreterState *is = ts ? ts->interp : NULL; - return _PyRuntime.audit_hook_head - || (is && is->audit_hooks) - || PyDTrace_AUDIT_ENABLED(); + return (is->runtime->audit_hook_head + || 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; +static int +sys_audit_tstate(PyThreadState *ts, const char *event, + const char *argFormat, va_list vargs) +{ /* 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')); + if (!ts) { + /* Audit hooks cannot be called with a NULL thread state */ + return 0; + } + + /* The current implementation cannot be called if tstate is not + the current Python thread state. */ + assert(ts == _PyThreadState_GET()); + /* Early exit when no hooks are registered */ - if (!should_audit()) { + PyInterpreterState *is = ts->interp; + if (!should_audit(is)) { return 0; } - _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head; - PyThreadState *ts = _PyThreadState_GET(); - PyInterpreterState *is = ts ? ts->interp : NULL; + PyObject *eventName = NULL; + PyObject *eventArgs = NULL; + PyObject *hooks = NULL; + PyObject *hook = NULL; + int res = -1; + int dtrace = PyDTrace_AUDIT_ENABLED(); PyObject *exc_type, *exc_value, *exc_tb; - if (ts) { - PyErr_Fetch(&exc_type, &exc_value, &exc_tb); - } + _PyErr_Fetch(ts, &exc_type, &exc_value, &exc_tb); /* Initialize event args now */ if (argFormat && argFormat[0]) { - va_list args; - va_start(args, argFormat); - eventArgs = _Py_VaBuildValue_SizeT(argFormat, args); - va_end(args); + eventArgs = _Py_VaBuildValue_SizeT(argFormat, vargs); if (eventArgs && !PyTuple_Check(eventArgs)) { PyObject *argTuple = PyTuple_Pack(1, eventArgs); Py_DECREF(eventArgs); eventArgs = argTuple; } - } else { + } + else { eventArgs = PyTuple_New(0); } if (!eventArgs) { @@ -174,6 +205,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) } /* Call global hooks */ + _Py_AuditHookEntry *e = is->runtime->audit_hook_head; for (; e; e = e->next) { if (e->hookCFunction(event, eventArgs, e->userData) < 0) { goto exit; @@ -186,7 +218,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) } /* Call interpreter hooks */ - if (is && is->audit_hooks) { + if (is->audit_hooks) { eventName = PyUnicode_FromString(event); if (!eventName) { goto exit; @@ -215,8 +247,8 @@ PySys_Audit(const char *event, const char *argFormat, ...) ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc); ts->tracing--; } - o = PyObject_CallFunctionObjArgs(hook, eventName, - eventArgs, NULL); + PyObject* args[2] = {eventName, eventArgs}; + o = _PyObject_FastCallTstate(ts, hook, args, 2); if (canTrace) { ts->tracing++; ts->use_tracing = 0; @@ -229,7 +261,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) } ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc); ts->tracing--; - if (PyErr_Occurred()) { + if (_PyErr_Occurred(ts)) { goto exit; } } @@ -242,43 +274,81 @@ exit: 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); - } + if (!res) { + _PyErr_Restore(ts, exc_type, exc_value, exc_tb); + } + else { + assert(_PyErr_Occurred(ts)); + Py_XDECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); } return res; } +int +_PySys_Audit(PyThreadState *tstate, const char *event, + const char *argFormat, ...) +{ + va_list vargs; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, argFormat); +#else + va_start(vargs); +#endif + int res = sys_audit_tstate(tstate, event, argFormat, vargs); + va_end(vargs); + return res; +} + +int +PySys_Audit(const char *event, const char *argFormat, ...) +{ + PyThreadState *tstate = _PyThreadState_GET(); + va_list vargs; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, argFormat); +#else + va_start(vargs); +#endif + int res = sys_audit_tstate(tstate, event, argFormat, vargs); + va_end(vargs); + 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)) + * and as such the function is not exported. + * + * Must be finalizing to clear hooks */ +void +_PySys_ClearAuditHooks(PyThreadState *ts) +{ + assert(ts != NULL); + if (!ts) { return; + } - if (Py_VerboseFlag) { + _PyRuntimeState *runtime = ts->interp->runtime; + PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(runtime); + assert(finalizing == ts); + if (finalizing != ts) { + return; + } + + const PyConfig *config = _PyInterpreterState_GetConfig(ts->interp); + if (config->verbose) { 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(); + _PySys_Audit(ts, "cpython._PySys_ClearAuditHooks", NULL); + _PyErr_Clear(ts); - _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head, *n; - _PyRuntime.audit_hook_head = NULL; + _Py_AuditHookEntry *e = runtime->audit_hook_head, *n; + runtime->audit_hook_head = NULL; while (e) { n = e->next; PyMem_RawFree(e); @@ -289,33 +359,46 @@ void _PySys_ClearAuditHooks(void) { int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) { + /* tstate can be NULL, so access directly _PyRuntime: + PySys_AddAuditHook() can be called before Python is initialized. */ + _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *tstate; + if (runtime->initialized) { + tstate = _PyRuntimeState_GetThreadState(runtime); + } + else { + tstate = NULL; + } + /* 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_RuntimeError)) { + if (tstate != NULL) { + if (_PySys_Audit(tstate, "sys.addaudithook", NULL) < 0) { + if (_PyErr_ExceptionMatches(tstate, PyExc_RuntimeError)) { /* We do not report errors derived from RuntimeError */ - PyErr_Clear(); + _PyErr_Clear(tstate); return 0; } return -1; } } - _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head; + _Py_AuditHookEntry *e = runtime->audit_hook_head; if (!e) { e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry)); - _PyRuntime.audit_hook_head = e; + runtime->audit_hook_head = e; } else { - while (e->next) + while (e->next) { e = e->next; + } e = e->next = (_Py_AuditHookEntry*)PyMem_RawMalloc( sizeof(_Py_AuditHookEntry)); } if (!e) { - if (Py_IsInitialized()) - PyErr_NoMemory(); + if (tstate != NULL) { + _PyErr_NoMemory(tstate); + } return -1; } @@ -338,18 +421,19 @@ static PyObject * sys_addaudithook_impl(PyObject *module, PyObject *hook) /*[clinic end generated code: output=4f9c17aaeb02f44e input=0f3e191217a45e34]*/ { + PyThreadState *tstate = _PyThreadState_GET(); + /* Invoke existing audit hooks to allow them an opportunity to abort. */ - if (PySys_Audit("sys.addaudithook", NULL) < 0) { - if (PyErr_ExceptionMatches(PyExc_Exception)) { + if (_PySys_Audit(tstate, "sys.addaudithook", NULL) < 0) { + if (_PyErr_ExceptionMatches(tstate, PyExc_Exception)) { /* We do not report errors derived from Exception */ - PyErr_Clear(); + _PyErr_Clear(tstate); Py_RETURN_NONE; } return NULL; } - PyInterpreterState *is = _PyInterpreterState_Get(); - + PyInterpreterState *is = tstate->interp; if (is->audit_hooks == NULL) { is->audit_hooks = PyList_New(0); if (is->audit_hooks == NULL) { @@ -372,23 +456,30 @@ Passes the event to any audit hooks that are attached."); static PyObject * sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc) { + PyThreadState *tstate = _PyThreadState_GET(); + _Py_EnsureTstateNotNULL(tstate); + if (argc == 0) { - PyErr_SetString(PyExc_TypeError, "audit() missing 1 required positional argument: 'event'"); + _PyErr_SetString(tstate, PyExc_TypeError, + "audit() missing 1 required positional argument: " + "'event'"); return NULL; } - if (!should_audit()) { + if (!should_audit(tstate->interp)) { Py_RETURN_NONE; } PyObject *auditEvent = args[0]; if (!auditEvent) { - PyErr_SetString(PyExc_TypeError, "expected str for argument 'event'"); + _PyErr_SetString(tstate, 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); + _PyErr_Format(tstate, PyExc_TypeError, + "expected str for argument 'event', not %.200s", + Py_TYPE(auditEvent)->tp_name); return NULL; } const char *event = PyUnicode_AsUTF8(auditEvent); @@ -401,7 +492,7 @@ sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc) return NULL; } - int res = PySys_Audit(event, "O", auditArgs); + int res = _PySys_Audit(tstate, event, "O", auditArgs); Py_DECREF(auditArgs); if (res < 0) { @@ -415,7 +506,8 @@ sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc) static PyObject * sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords) { - assert(!PyErr_Occurred()); + PyThreadState *tstate = _PyThreadState_GET(); + assert(!_PyErr_Occurred(tstate)); char *envar = Py_GETENV("PYTHONBREAKPOINT"); if (envar == NULL || strlen(envar) == 0) { @@ -431,7 +523,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb * we need to save a copy of envar. */ envar = _PyMem_RawStrdup(envar); if (envar == NULL) { - PyErr_NoMemory(); + _PyErr_NoMemory(tstate); return NULL; } const char *last_dot = strrchr(envar, '.'); @@ -460,7 +552,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb Py_DECREF(modulepath); if (module == NULL) { - if (PyErr_ExceptionMatches(PyExc_ImportError)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) { goto warn; } PyMem_RawFree(envar); @@ -471,20 +563,20 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb Py_DECREF(module); if (hook == NULL) { - if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { goto warn; } PyMem_RawFree(envar); return NULL; } PyMem_RawFree(envar); - PyObject *retval = _PyObject_Vectorcall(hook, args, nargs, keywords); + PyObject *retval = PyObject_Vectorcall(hook, args, nargs, keywords); Py_DECREF(hook); return retval; warn: /* If any of the imports went wrong, then warn and ignore. */ - PyErr_Clear(); + _PyErr_Clear(tstate); int status = PyErr_WarnFormat( PyExc_RuntimeWarning, 0, "Ignoring unimportable $PYTHONBREAKPOINT: \"%s\"", envar); @@ -539,7 +631,7 @@ sys_displayhook_unencodable(PyObject *outf, PyObject *o) goto error; } if (buffer) { - result = _PyObject_CallMethodIdObjArgs(buffer, &PyId_write, encoded, NULL); + result = _PyObject_CallMethodIdOneArg(buffer, &PyId_write, encoded); Py_DECREF(buffer); Py_DECREF(encoded); if (result == NULL) @@ -583,12 +675,13 @@ sys_displayhook(PyObject *module, PyObject *o) PyObject *outf; PyObject *builtins; static PyObject *newline = NULL; - int err; + PyThreadState *tstate = _PyThreadState_GET(); builtins = _PyImport_GetModuleId(&PyId_builtins); if (builtins == NULL) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); + if (!_PyErr_Occurred(tstate)) { + _PyErr_SetString(tstate, PyExc_RuntimeError, + "lost builtins module"); } return NULL; } @@ -602,19 +695,21 @@ sys_displayhook(PyObject *module, PyObject *o) } if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0) return NULL; - outf = _PySys_GetObjectId(&PyId_stdout); + outf = sys_get_object_id(tstate, &PyId_stdout); if (outf == NULL || outf == Py_None) { - PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); + _PyErr_SetString(tstate, PyExc_RuntimeError, "lost sys.stdout"); return NULL; } if (PyFile_WriteObject(o, outf, 0) != 0) { - if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_UnicodeEncodeError)) { + int err; /* repr(o) is not encodable to sys.stdout.encoding with * sys.stdout.errors error handler (which is probably 'strict') */ - PyErr_Clear(); + _PyErr_Clear(tstate); err = sys_displayhook_unencodable(outf, o); - if (err) + if (err) { return NULL; + } } else { return NULL; @@ -721,7 +816,8 @@ sys_exit_impl(PyObject *module, PyObject *status) /*[clinic end generated code: output=13870986c1ab2ec0 input=b86ca9497baa94f2]*/ { /* Raise SystemExit so callers may catch it or clean up. */ - PyErr_SetObject(PyExc_SystemExit, status); + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_SetObject(tstate, PyExc_SystemExit, status); return NULL; } @@ -750,8 +846,8 @@ static PyObject * sys_getfilesystemencoding_impl(PyObject *module) /*[clinic end generated code: output=1dc4bdbe9be44aa7 input=8475f8649b8c7d8c]*/ { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - const PyConfig *config = &interp->config; + PyInterpreterState *interp = _PyInterpreterState_GET(); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); return PyUnicode_FromWideChar(config->filesystem_encoding, -1); } @@ -765,8 +861,8 @@ static PyObject * sys_getfilesystemencodeerrors_impl(PyObject *module) /*[clinic end generated code: output=ba77b36bbf7c96f5 input=22a1e8365566f1e5]*/ { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - const PyConfig *config = &interp->config; + PyInterpreterState *interp = _PyInterpreterState_GET(); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); return PyUnicode_FromWideChar(config->filesystem_errors, -1); } @@ -787,14 +883,15 @@ static PyObject * sys_intern_impl(PyObject *module, PyObject *s) /*[clinic end generated code: output=be680c24f5c9e5d6 input=849483c006924e2f]*/ { + PyThreadState *tstate = _PyThreadState_GET(); if (PyUnicode_CheckExact(s)) { Py_INCREF(s); PyUnicode_InternInPlace(&s); return s; } else { - PyErr_Format(PyExc_TypeError, - "can't intern %.400s", s->ob_type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "can't intern %.400s", Py_TYPE(s)->tp_name); return NULL; } } @@ -829,22 +926,20 @@ trace_init(void) static PyObject * -call_trampoline(PyObject* callback, +call_trampoline(PyThreadState *tstate, PyObject* callback, PyFrameObject *frame, int what, PyObject *arg) { - PyObject *result; - PyObject *stack[3]; - if (PyFrame_FastToLocalsWithError(frame) < 0) { return NULL; } + PyObject *stack[3]; stack[0] = (PyObject *)frame; stack[1] = whatstrings[what]; stack[2] = (arg != NULL) ? arg : Py_None; /* call the Python-level function */ - result = _PyObject_FastCall(callback, stack, 3); + PyObject *result = _PyObject_FastCallTstate(tstate, callback, stack, 3); PyFrame_LocalsToFast(frame, 1); if (result == NULL) { @@ -858,15 +953,17 @@ static int profile_trampoline(PyObject *self, PyFrameObject *frame, int what, PyObject *arg) { - PyObject *result; - - if (arg == NULL) + if (arg == NULL) { arg = Py_None; - result = call_trampoline(self, frame, what, arg); + } + + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *result = call_trampoline(tstate, self, frame, what, arg); if (result == NULL) { - PyEval_SetProfile(NULL, NULL); + _PyEval_SetProfile(tstate, NULL, NULL); return -1; } + Py_DECREF(result); return 0; } @@ -876,20 +973,24 @@ trace_trampoline(PyObject *self, PyFrameObject *frame, int what, PyObject *arg) { PyObject *callback; - PyObject *result; - - if (what == PyTrace_CALL) + if (what == PyTrace_CALL) { callback = self; - else + } + else { callback = frame->f_trace; - if (callback == NULL) + } + if (callback == NULL) { return 0; - result = call_trampoline(callback, frame, what, arg); + } + + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *result = call_trampoline(tstate, callback, frame, what, arg); if (result == NULL) { - PyEval_SetTrace(NULL, NULL); + _PyEval_SetTrace(tstate, NULL, NULL); Py_CLEAR(frame->f_trace); return -1; } + if (result != Py_None) { Py_XSETREF(frame->f_trace, result); } @@ -902,12 +1003,21 @@ trace_trampoline(PyObject *self, PyFrameObject *frame, static PyObject * sys_settrace(PyObject *self, PyObject *args) { - if (trace_init() == -1) + if (trace_init() == -1) { return NULL; - if (args == Py_None) - PyEval_SetTrace(NULL, NULL); - else - PyEval_SetTrace(trace_trampoline, args); + } + + PyThreadState *tstate = _PyThreadState_GET(); + if (args == Py_None) { + if (_PyEval_SetTrace(tstate, NULL, NULL) < 0) { + return NULL; + } + } + else { + if (_PyEval_SetTrace(tstate, trace_trampoline, args) < 0) { + return NULL; + } + } Py_RETURN_NONE; } @@ -942,12 +1052,21 @@ sys_gettrace_impl(PyObject *module) static PyObject * sys_setprofile(PyObject *self, PyObject *args) { - if (trace_init() == -1) + if (trace_init() == -1) { return NULL; - if (args == Py_None) - PyEval_SetProfile(NULL, NULL); - else - PyEval_SetProfile(profile_trampoline, args); + } + + PyThreadState *tstate = _PyThreadState_GET(); + if (args == Py_None) { + if (_PyEval_SetProfile(tstate, NULL, NULL) < 0) { + return NULL; + } + } + else { + if (_PyEval_SetProfile(tstate, profile_trampoline, args) < 0) { + return NULL; + } + } Py_RETURN_NONE; } @@ -979,53 +1098,6 @@ sys_getprofile_impl(PyObject *module) return temp; } -/*[clinic input] -sys.setcheckinterval - - n: int - / - -Set the async event check interval to n instructions. - -This tells the Python interpreter to check for asynchronous events -every n instructions. - -This also affects how often thread switches occur. -[clinic start generated code]*/ - -static PyObject * -sys_setcheckinterval_impl(PyObject *module, int n) -/*[clinic end generated code: output=3f686cef07e6e178 input=7a35b17bf22a6227]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "sys.getcheckinterval() and sys.setcheckinterval() " - "are deprecated. Use sys.setswitchinterval() " - "instead.", 1) < 0) - return NULL; - - PyInterpreterState *interp = _PyInterpreterState_Get(); - interp->check_interval = n; - Py_RETURN_NONE; -} - -/*[clinic input] -sys.getcheckinterval - -Return the current check interval; see sys.setcheckinterval(). -[clinic start generated code]*/ - -static PyObject * -sys_getcheckinterval_impl(PyObject *module) -/*[clinic end generated code: output=1b5060bf2b23a47c input=4b6589cbcca1db4e]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "sys.getcheckinterval() and sys.setcheckinterval() " - "are deprecated. Use sys.getswitchinterval() " - "instead.", 1) < 0) - return NULL; - PyInterpreterState *interp = _PyInterpreterState_Get(); - return PyLong_FromLong(interp->check_interval); -} /*[clinic input] sys.setswitchinterval @@ -1047,9 +1119,10 @@ static PyObject * sys_setswitchinterval_impl(PyObject *module, double interval) /*[clinic end generated code: output=65a19629e5153983 input=561b477134df91d9]*/ { + PyThreadState *tstate = _PyThreadState_GET(); if (interval <= 0.0) { - PyErr_SetString(PyExc_ValueError, - "switch interval must be strictly positive"); + _PyErr_SetString(tstate, PyExc_ValueError, + "switch interval must be strictly positive"); return NULL; } _PyEval_SetSwitchInterval((unsigned long) (1e6 * interval)); @@ -1088,11 +1161,11 @@ sys_setrecursionlimit_impl(PyObject *module, int new_limit) /*[clinic end generated code: output=35e1c64754800ace input=b0f7a23393924af3]*/ { int mark; - PyThreadState *tstate; + PyThreadState *tstate = _PyThreadState_GET(); if (new_limit < 1) { - PyErr_SetString(PyExc_ValueError, - "recursion limit must be greater or equal than 1"); + _PyErr_SetString(tstate, PyExc_ValueError, + "recursion limit must be greater or equal than 1"); return NULL; } @@ -1106,12 +1179,11 @@ sys_setrecursionlimit_impl(PyObject *module, int new_limit) the new low-water mark. Otherwise it may not be possible anymore to reset the overflowed flag to 0. */ mark = _Py_RecursionLimitLowerWaterMark(new_limit); - tstate = _PyThreadState_GET(); if (tstate->recursion_depth >= mark) { - PyErr_Format(PyExc_RecursionError, - "cannot set the recursion limit to %i at " - "the recursion depth %i: the limit is too low", - new_limit, tstate->recursion_depth); + _PyErr_Format(tstate, PyExc_RecursionError, + "cannot set the recursion limit to %i at " + "the recursion depth %i: the limit is too low", + new_limit, tstate->recursion_depth); return NULL; } @@ -1136,11 +1208,12 @@ static PyObject * sys_set_coroutine_origin_tracking_depth_impl(PyObject *module, int depth) /*[clinic end generated code: output=0a2123c1cc6759c5 input=a1d0a05f89d2c426]*/ { + PyThreadState *tstate = _PyThreadState_GET(); if (depth < 0) { - PyErr_SetString(PyExc_ValueError, "depth must be >= 0"); + _PyErr_SetString(tstate, PyExc_ValueError, "depth must be >= 0"); return NULL; } - _PyEval_SetCoroutineOriginTrackingDepth(depth); + _PyEval_SetCoroutineOriginTrackingDepth(tstate, depth); Py_RETURN_NONE; } @@ -1178,57 +1251,13 @@ static PyStructSequence_Desc asyncgen_hooks_desc = { 2 }; -static int -set_async_gen_firstiter(PyObject *firstiter) -{ - PyThreadState *tstate = _PyThreadState_GET(); - - if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) { - return -1; - } - - Py_XINCREF(firstiter); - Py_XSETREF(tstate->async_gen_firstiter, firstiter); - return 0; -} - -void -_PyEval_SetAsyncGenFirstiter(PyObject *firstiter) -{ - if (set_async_gen_firstiter(firstiter) < 0) { - PyErr_WriteUnraisable(NULL); - } -} - -static int -set_async_gen_finalizer(PyObject *finalizer) -{ - PyThreadState *tstate = _PyThreadState_GET(); - - if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) { - return -1; - } - - Py_XINCREF(finalizer); - Py_XSETREF(tstate->async_gen_finalizer, finalizer); - return 0; -} - -void -_PyEval_SetAsyncGenFinalizer(PyObject *finalizer) -{ - if (set_async_gen_finalizer(finalizer) < 0) { - PyErr_WriteUnraisable(NULL); - } -} - - static PyObject * sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) { static char *keywords[] = {"firstiter", "finalizer", NULL}; PyObject *firstiter = NULL; PyObject *finalizer = NULL; + PyThreadState *tstate = _PyThreadState_GET(); if (!PyArg_ParseTupleAndKeywords( args, kw, "|OO", keywords, @@ -1238,31 +1267,31 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) if (finalizer && finalizer != Py_None) { if (!PyCallable_Check(finalizer)) { - PyErr_Format(PyExc_TypeError, - "callable finalizer expected, got %.50s", - Py_TYPE(finalizer)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "callable finalizer expected, got %.50s", + Py_TYPE(finalizer)->tp_name); return NULL; } - if (set_async_gen_finalizer(finalizer) < 0) { + if (_PyEval_SetAsyncGenFinalizer(finalizer) < 0) { return NULL; } } - else if (finalizer == Py_None && set_async_gen_finalizer(NULL) < 0) { + else if (finalizer == Py_None && _PyEval_SetAsyncGenFinalizer(NULL) < 0) { return NULL; } if (firstiter && firstiter != Py_None) { if (!PyCallable_Check(firstiter)) { - PyErr_Format(PyExc_TypeError, - "callable firstiter expected, got %.50s", - Py_TYPE(firstiter)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "callable firstiter expected, got %.50s", + Py_TYPE(firstiter)->tp_name); return NULL; } - if (set_async_gen_firstiter(firstiter) < 0) { + if (_PyEval_SetAsyncGenFirstiter(firstiter) < 0) { return NULL; } } - else if (firstiter == Py_None && set_async_gen_firstiter(NULL) < 0) { + else if (firstiter == Py_None && _PyEval_SetAsyncGenFirstiter(NULL) < 0) { return NULL; } @@ -1345,7 +1374,7 @@ static PyStructSequence_Desc hash_info_desc = { }; static PyObject * -get_hash_info(void) +get_hash_info(PyThreadState *tstate) { PyObject *hash_info; int field = 0; @@ -1372,7 +1401,7 @@ get_hash_info(void) PyLong_FromLong(hashfunc->seed_bits)); PyStructSequence_SET_ITEM(hash_info, field++, PyLong_FromLong(Py_HASH_CUTOFF)); - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_CLEAR(hash_info); return NULL; } @@ -1456,6 +1485,7 @@ sys_getwindowsversion_impl(PyObject *module) wchar_t kernel32_path[MAX_PATH]; LPVOID verblock; DWORD verblock_size; + PyThreadState *tstate = _PyThreadState_GET(); ver.dwOSVersionInfoSize = sizeof(ver); if (!GetVersionExW((OSVERSIONINFOW*) &ver)) @@ -1506,7 +1536,7 @@ sys_getwindowsversion_impl(PyObject *module) realBuild )); - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_DECREF(version); return NULL; } @@ -1563,8 +1593,8 @@ static PyObject * sys_setdlopenflags_impl(PyObject *module, int new_val) /*[clinic end generated code: output=ec918b7fe0a37281 input=4c838211e857a77f]*/ { - PyInterpreterState *interp = _PyInterpreterState_Get(); - interp->dlopenflags = new_val; + PyThreadState *tstate = _PyThreadState_GET(); + tstate->interp->dlopenflags = new_val; Py_RETURN_NONE; } @@ -1581,8 +1611,8 @@ static PyObject * sys_getdlopenflags_impl(PyObject *module) /*[clinic end generated code: output=e92cd1bc5005da6e input=dc4ea0899c53b4b6]*/ { - PyInterpreterState *interp = _PyInterpreterState_Get(); - return PyLong_FromLong(interp->dlopenflags); + PyThreadState *tstate = _PyThreadState_GET(); + return PyLong_FromLong(tstate->interp->dlopenflags); } #endif /* HAVE_DLOPEN */ @@ -1614,17 +1644,20 @@ _PySys_GetSizeOf(PyObject *o) PyObject *res = NULL; PyObject *method; Py_ssize_t size; + PyThreadState *tstate = _PyThreadState_GET(); /* Make sure the type is initialized. float gets initialized late */ - if (PyType_Ready(Py_TYPE(o)) < 0) + if (PyType_Ready(Py_TYPE(o)) < 0) { return (size_t)-1; + } method = _PyObject_LookupSpecial(o, &PyId___sizeof__); if (method == NULL) { - if (!PyErr_Occurred()) - PyErr_Format(PyExc_TypeError, - "Type %.100s doesn't define __sizeof__", - Py_TYPE(o)->tp_name); + if (!_PyErr_Occurred(tstate)) { + _PyErr_Format(tstate, PyExc_TypeError, + "Type %.100s doesn't define __sizeof__", + Py_TYPE(o)->tp_name); + } } else { res = _PyObject_CallNoArg(method); @@ -1636,16 +1669,17 @@ _PySys_GetSizeOf(PyObject *o) size = PyLong_AsSsize_t(res); Py_DECREF(res); - if (size == -1 && PyErr_Occurred()) + if (size == -1 && _PyErr_Occurred(tstate)) return (size_t)-1; if (size < 0) { - PyErr_SetString(PyExc_ValueError, "__sizeof__() should return >= 0"); + _PyErr_SetString(tstate, PyExc_ValueError, + "__sizeof__() should return >= 0"); return (size_t)-1; } /* add gc_head size */ - if (PyObject_IS_GC(o)) + if (_PyObject_IS_GC(o)) return ((size_t)size) + sizeof(PyGC_Head); return (size_t)size; } @@ -1656,17 +1690,19 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) static char *kwlist[] = {"object", "default", 0}; size_t size; PyObject *o, *dflt = NULL; + PyThreadState *tstate = _PyThreadState_GET(); if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", - kwlist, &o, &dflt)) + kwlist, &o, &dflt)) { return NULL; + } size = _PySys_GetSizeOf(o); - if (size == (size_t)-1 && PyErr_Occurred()) { + if (size == (size_t)-1 && _PyErr_Occurred(tstate)) { /* Has a default value been given */ - if (dflt != NULL && PyErr_ExceptionMatches(PyExc_TypeError)) { - PyErr_Clear(); + if (dflt != NULL && _PyErr_ExceptionMatches(tstate, PyExc_TypeError)) { + _PyErr_Clear(tstate); Py_INCREF(dflt); return dflt; } @@ -1699,7 +1735,7 @@ static Py_ssize_t sys_getrefcount_impl(PyObject *module, PyObject *object) /*[clinic end generated code: output=5fd477f2264b85b2 input=bf474efd50a21535]*/ { - return object->ob_refcnt; + return Py_REFCNT(object); } #ifdef Py_REF_DEBUG @@ -1728,20 +1764,6 @@ sys_getallocatedblocks_impl(PyObject *module) return _Py_GetAllocatedBlocks(); } -#ifdef COUNT_ALLOCS -/*[clinic input] -sys.getcounts -[clinic start generated code]*/ - -static PyObject * -sys_getcounts_impl(PyObject *module) -/*[clinic end generated code: output=20df00bc164f43cb input=ad2ec7bda5424953]*/ -{ - extern PyObject *_Py_get_counts(void); - - return _Py_get_counts(); -} -#endif /*[clinic input] sys._getframe @@ -1764,22 +1786,25 @@ static PyObject * sys__getframe_impl(PyObject *module, int depth) /*[clinic end generated code: output=d438776c04d59804 input=c1be8a6464b11ee5]*/ { - PyFrameObject *f = _PyThreadState_GET()->frame; + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *f = PyThreadState_GetFrame(tstate); - if (PySys_Audit("sys._getframe", "O", f) < 0) { + if (_PySys_Audit(tstate, "sys._getframe", "O", f) < 0) { + Py_DECREF(f); return NULL; } while (depth > 0 && f != NULL) { - f = f->f_back; + PyFrameObject *back = PyFrame_GetBack(f); + Py_DECREF(f); + f = back; --depth; } if (f == NULL) { - PyErr_SetString(PyExc_ValueError, - "call stack is not deep enough"); + _PyErr_SetString(tstate, PyExc_ValueError, + "call stack is not deep enough"); return NULL; } - Py_INCREF(f); return (PyObject*)f; } @@ -1819,44 +1844,6 @@ sys_call_tracing_impl(PyObject *module, PyObject *func, PyObject *funcargs) return _PyEval_CallTracing(func, funcargs); } -/*[clinic input] -sys.callstats - -Return a tuple of function call statistics. - -A tuple is returned only if CALL_PROFILE was defined when Python was -built. Otherwise, this returns None. - -When enabled, this function returns detailed, implementation-specific -details about the number of function calls executed. The return value -is a 11-tuple where the entries in the tuple are counts of: -0. all function calls -1. calls to PyFunction_Type objects -2. PyFunction calls that do not create an argument tuple -3. PyFunction calls that do not create an argument tuple - and bypass PyEval_EvalCodeEx() -4. PyMethod calls -5. PyMethod calls on bound methods -6. PyType calls -7. PyCFunction calls -8. generator calls -9. All other calls -10. Number of stack pops performed by call_function() -[clinic start generated code]*/ - -static PyObject * -sys_callstats_impl(PyObject *module) -/*[clinic end generated code: output=edc4a74957fa8def input=d447d8d224d5d175]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "sys.callstats() has been deprecated in Python 3.7 " - "and will be removed in the future", 1) < 0) { - return NULL; - } - - Py_RETURN_NONE; -} - #ifdef __cplusplus extern "C" { @@ -1950,7 +1937,6 @@ static PyMethodDef sys_methods[] = { {"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 SYS__CLEAR_TYPE_CACHE_METHODDEF SYS__CURRENT_FRAMES_METHODDEF SYS_DISPLAYHOOK_METHODDEF @@ -1960,7 +1946,6 @@ static PyMethodDef sys_methods[] = { SYS_GETDEFAULTENCODING_METHODDEF SYS_GETDLOPENFLAGS_METHODDEF SYS_GETALLOCATEDBLOCKS_METHODDEF - SYS_GETCOUNTS_METHODDEF #ifdef DYNAMIC_EXECUTION_PROFILE {"getdxp", _Py_GetDXProfile, METH_VARARGS}, #endif @@ -1980,8 +1965,6 @@ static PyMethodDef sys_methods[] = { SYS_INTERN_METHODDEF SYS_IS_FINALIZING_METHODDEF SYS_MDEBUG_METHODDEF - SYS_SETCHECKINTERVAL_METHODDEF - SYS_GETCHECKINTERVAL_METHODDEF SYS_SETSWITCHINTERVAL_METHODDEF SYS_GETSWITCHINTERVAL_METHODDEF SYS_SETDLOPENFLAGS_METHODDEF @@ -2156,9 +2139,9 @@ _PySys_ReadPreinitXOptions(PyConfig *config) static PyObject * -get_warnoptions(void) +get_warnoptions(PyThreadState *tstate) { - PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); + PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions); if (warnoptions == NULL || !PyList_Check(warnoptions)) { /* PEP432 TODO: we can reach this if warnoptions is NULL in the main * interpreter config. When that happens, we need to properly set @@ -2171,9 +2154,10 @@ get_warnoptions(void) * reachable again. */ warnoptions = PyList_New(0); - if (warnoptions == NULL) + if (warnoptions == NULL) { return NULL; - if (_PySys_SetObjectId(&PyId_warnoptions, warnoptions)) { + } + if (sys_set_object_id(tstate, &PyId_warnoptions, warnoptions)) { Py_DECREF(warnoptions); return NULL; } @@ -2191,16 +2175,16 @@ PySys_ResetWarnOptions(void) return; } - PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); + PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions); if (warnoptions == NULL || !PyList_Check(warnoptions)) return; PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL); } static int -_PySys_AddWarnOptionWithError(PyObject *option) +_PySys_AddWarnOptionWithError(PyThreadState *tstate, PyObject *option) { - PyObject *warnoptions = get_warnoptions(); + PyObject *warnoptions = get_warnoptions(tstate); if (warnoptions == NULL) { return -1; } @@ -2213,10 +2197,11 @@ _PySys_AddWarnOptionWithError(PyObject *option) void PySys_AddWarnOptionUnicode(PyObject *option) { - if (_PySys_AddWarnOptionWithError(option) < 0) { + PyThreadState *tstate = _PyThreadState_GET(); + if (_PySys_AddWarnOptionWithError(tstate, option) < 0) { /* No return value, therefore clear error state if possible */ - if (_PyThreadState_UncheckedGet()) { - PyErr_Clear(); + if (tstate) { + _PyErr_Clear(tstate); } } } @@ -2240,15 +2225,16 @@ PySys_AddWarnOption(const wchar_t *s) int PySys_HasWarnOptions(void) { - PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions); return (warnoptions != NULL && PyList_Check(warnoptions) && PyList_GET_SIZE(warnoptions) > 0); } static PyObject * -get_xoptions(void) +get_xoptions(PyThreadState *tstate) { - PyObject *xoptions = _PySys_GetObjectId(&PyId__xoptions); + PyObject *xoptions = sys_get_object_id(tstate, &PyId__xoptions); if (xoptions == NULL || !PyDict_Check(xoptions)) { /* PEP432 TODO: we can reach this if xoptions is NULL in the main * interpreter config. When that happens, we need to properly set @@ -2261,9 +2247,10 @@ get_xoptions(void) * reachable again. */ xoptions = PyDict_New(); - if (xoptions == NULL) + if (xoptions == NULL) { return NULL; - if (_PySys_SetObjectId(&PyId__xoptions, xoptions)) { + } + if (sys_set_object_id(tstate, &PyId__xoptions, xoptions)) { Py_DECREF(xoptions); return NULL; } @@ -2277,7 +2264,8 @@ _PySys_AddXOptionWithError(const wchar_t *s) { PyObject *name = NULL, *value = NULL; - PyObject *opts = get_xoptions(); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *opts = get_xoptions(tstate); if (opts == NULL) { goto error; } @@ -2318,14 +2306,15 @@ PySys_AddXOption(const wchar_t *s) } if (_PySys_AddXOptionWithError(s) < 0) { /* No return value, therefore clear error state if possible */ - PyErr_Clear(); + _PyErr_Clear(tstate); } } PyObject * PySys_GetXOptions(void) { - return get_xoptions(); + PyThreadState *tstate = _PyThreadState_GET(); + return get_xoptions(tstate); } /* XXX This doc string is too long to be a single string literal in VC++ 5.0. @@ -2419,7 +2408,6 @@ getrefcount() -- return the reference count for an object (plus one :-)\n\ getrecursionlimit() -- return the max recursion depth for the interpreter\n\ getsizeof() -- return the size of an object in bytes\n\ gettrace() -- get the global debug tracing function\n\ -setcheckinterval() -- control how often the interpreter checks for events\n\ setdlopenflags() -- set the flags to be used for dlopen() calls\n\ setprofile() -- set the global profiling function\n\ setrecursionlimit() -- set the max recursion depth for the interpreter\n\ @@ -2465,17 +2453,18 @@ static PyStructSequence_Desc flags_desc = { }; static PyObject* -make_flags(_PyRuntimeState *runtime, PyInterpreterState *interp) +make_flags(PyThreadState *tstate) { - int pos = 0; - PyObject *seq; - const PyPreConfig *preconfig = &runtime->preconfig; - const PyConfig *config = &interp->config; + PyInterpreterState *interp = tstate->interp; + const PyPreConfig *preconfig = &interp->runtime->preconfig; + const PyConfig *config = _PyInterpreterState_GetConfig(interp); - seq = PyStructSequence_New(&FlagsType); - if (seq == NULL) + PyObject *seq = PyStructSequence_New(&FlagsType); + if (seq == NULL) { return NULL; + } + int pos = 0; #define SetFlag(flag) \ PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag)) @@ -2498,7 +2487,7 @@ make_flags(_PyRuntimeState *runtime, PyInterpreterState *interp) SetFlag(preconfig->utf8_mode); #undef SetFlag - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_DECREF(seq); return NULL; } @@ -2529,7 +2518,7 @@ static PyStructSequence_Desc version_info_desc = { }; static PyObject * -make_version_info(void) +make_version_info(PyThreadState *tstate) { PyObject *version_info; char *s; @@ -2567,7 +2556,7 @@ make_version_info(void) #undef SetIntItem #undef SetStrItem - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_CLEAR(version_info); return NULL; } @@ -2685,8 +2674,7 @@ static struct PyModuleDef sysmodule = { } while (0) static PyStatus -_PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, - PyObject *sysdict) +_PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) { PyObject *version_info; int res; @@ -2730,7 +2718,7 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, } } SET_SYS_FROM_STRING("hash_info", - get_hash_info()); + get_hash_info(tstate)); SET_SYS_FROM_STRING("maxunicode", PyLong_FromLong(0x10FFFF)); SET_SYS_FROM_STRING("builtin_module_names", @@ -2761,14 +2749,15 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, goto type_init_failed; } } - version_info = make_version_info(); + version_info = make_version_info(tstate); SET_SYS_FROM_STRING("version_info", version_info); /* prevent user from creating new instances */ VersionInfoType.tp_init = NULL; VersionInfoType.tp_new = NULL; res = PyDict_DelItemString(VersionInfoType.tp_dict, "__new__"); - if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) - PyErr_Clear(); + if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); + } /* implementation */ SET_SYS_FROM_STRING("implementation", make_impl_info(version_info)); @@ -2780,7 +2769,7 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, } } /* Set flags to their default values (updated by _PySys_InitMain()) */ - SET_SYS_FROM_STRING("flags", make_flags(runtime, interp)); + SET_SYS_FROM_STRING("flags", make_flags(tstate)); #if defined(MS_WINDOWS) /* getwindowsversion */ @@ -2792,10 +2781,10 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, /* prevent user from creating new instances */ WindowsVersionType.tp_init = NULL; WindowsVersionType.tp_new = NULL; - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); res = PyDict_DelItemString(WindowsVersionType.tp_dict, "__new__"); - if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) { - PyErr_Clear(); + if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); } #endif @@ -2818,7 +2807,7 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, } } - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { goto err_occurred; } return _PyStatus_OK(); @@ -2830,8 +2819,6 @@ err_occurred: return _PyStatus_ERR("can't initialize sys module"); } -#undef SET_SYS_FROM_STRING - /* Updating the sys namespace, returning integer error codes */ #define SET_SYS_FROM_STRING_INT_RESULT(key, value) \ do { \ @@ -2901,10 +2888,10 @@ sys_create_xoptions_dict(const PyConfig *config) int -_PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) +_PySys_InitMain(PyThreadState *tstate) { - PyObject *sysdict = interp->sysdict; - const PyConfig *config = &interp->config; + PyObject *sysdict = tstate->interp->sysdict; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); int res; #define COPY_LIST(KEY, VALUE) \ @@ -2935,6 +2922,7 @@ _PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) SET_SYS_FROM_WSTR("base_prefix", config->base_prefix); SET_SYS_FROM_WSTR("exec_prefix", config->exec_prefix); SET_SYS_FROM_WSTR("base_exec_prefix", config->base_exec_prefix); + SET_SYS_FROM_WSTR("platlibdir", config->platlibdir); if (config->pycache_prefix != NULL) { SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix); @@ -2955,30 +2943,33 @@ _PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) #undef COPY_LIST #undef SET_SYS_FROM_WSTR + /* Set flags to their final values */ - SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(runtime, interp)); + SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(tstate)); /* prevent user from creating new instances */ FlagsType.tp_init = NULL; FlagsType.tp_new = NULL; res = PyDict_DelItemString(FlagsType.tp_dict, "__new__"); if (res < 0) { - if (!PyErr_ExceptionMatches(PyExc_KeyError)) { + if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { return res; } - PyErr_Clear(); + _PyErr_Clear(tstate); } SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode", PyBool_FromLong(!config->write_bytecode)); - if (get_warnoptions() == NULL) + if (get_warnoptions(tstate) == NULL) { return -1; + } - if (get_xoptions() == NULL) + if (get_xoptions(tstate) == NULL) return -1; - if (PyErr_Occurred()) - return -1; + if (_PyErr_Occurred(tstate)) { + goto err_occurred; + } return 0; @@ -2986,6 +2977,7 @@ err_occurred: return -1; } +#undef SET_SYS_FROM_STRING #undef SET_SYS_FROM_STRING_BORROW #undef SET_SYS_FROM_STRING_INT_RESULT @@ -2994,7 +2986,7 @@ err_occurred: infrastructure for the io module in place. Use UTF-8/surrogateescape and ignore EAGAIN errors. */ -PyStatus +static PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict) { PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr)); @@ -3019,12 +3011,15 @@ error: /* Create sys module without all attributes: _PySys_InitMain() should be called later to add remaining attributes. */ PyStatus -_PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, - PyObject **sysmod_p) +_PySys_Create(PyThreadState *tstate, PyObject **sysmod_p) { + assert(!_PyErr_Occurred(tstate)); + + PyInterpreterState *interp = tstate->interp; + PyObject *modules = PyDict_New(); if (modules == NULL) { - return _PyStatus_ERR("can't make modules dictionary"); + goto error; } interp->modules = modules; @@ -3035,13 +3030,13 @@ _PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, PyObject *sysdict = PyModule_GetDict(sysmod); if (sysdict == NULL) { - return _PyStatus_ERR("can't initialize sys dict"); + goto error; } Py_INCREF(sysdict); interp->sysdict = sysdict; if (PyDict_SetItemString(sysdict, "modules", interp->modules) < 0) { - return _PyStatus_ERR("can't initialize sys module"); + goto error; } PyStatus status = _PySys_SetPreliminaryStderr(sysdict); @@ -3049,15 +3044,22 @@ _PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, return status; } - status = _PySys_InitCore(runtime, interp, sysdict); + status = _PySys_InitCore(tstate, sysdict); if (_PyStatus_EXCEPTION(status)) { return status; } - _PyImport_FixupBuiltin(sysmod, "sys", interp->modules); + if (_PyImport_FixupBuiltin(sysmod, "sys", interp->modules) < 0) { + goto error; + } + + assert(!_PyErr_Occurred(tstate)); *sysmod_p = sysmod; return _PyStatus_OK(); + +error: + return _PyStatus_ERR("can't initialize sys module"); } @@ -3100,8 +3102,10 @@ PySys_SetPath(const wchar_t *path) PyObject *v; if ((v = makepathobject(path, DELIM)) == NULL) Py_FatalError("can't create sys.path"); - if (_PySys_SetObjectId(&PyId_path, v) != 0) + PyThreadState *tstate = _PyThreadState_GET(); + if (sys_set_object_id(tstate, &PyId_path, v) != 0) { Py_FatalError("can't assign sys.path"); + } Py_DECREF(v); } @@ -3128,6 +3132,7 @@ void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) { wchar_t* empty_argv[1] = {L""}; + PyThreadState *tstate = _PyThreadState_GET(); if (argc < 1 || argv == NULL) { /* Ensure at least one (empty) argument is seen */ @@ -3139,7 +3144,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) if (av == NULL) { Py_FatalError("no mem for sys.argv"); } - if (PySys_SetObject("argv", av) != 0) { + if (sys_set_object(tstate, "argv", av) != 0) { Py_DECREF(av); Py_FatalError("can't assign sys.argv"); } @@ -3155,7 +3160,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) Py_FatalError("can't compute path0 from argv"); } - PyObject *sys_path = _PySys_GetObjectId(&PyId_path); + PyObject *sys_path = sys_get_object_id(tstate, &PyId_path); if (sys_path != NULL) { if (PyList_Insert(sys_path, 0, path0) < 0) { Py_DECREF(path0); @@ -3179,30 +3184,15 @@ PySys_SetArgv(int argc, wchar_t **argv) static int sys_pyfile_write_unicode(PyObject *unicode, PyObject *file) { - PyObject *writer = NULL, *result = NULL; - int err; - if (file == NULL) return -1; - - writer = _PyObject_GetAttrId(file, &PyId_write); - if (writer == NULL) - goto error; - - result = PyObject_CallFunctionObjArgs(writer, unicode, NULL); + assert(unicode != NULL); + PyObject *result = _PyObject_CallMethodIdOneArg(file, &PyId_write, unicode); if (result == NULL) { - goto error; - } else { - err = 0; - goto finally; + return -1; } - -error: - err = -1; -finally: - Py_XDECREF(writer); - Py_XDECREF(result); - return err; + Py_DECREF(result); + return 0; } static int @@ -3258,12 +3248,13 @@ sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va) PyObject *error_type, *error_value, *error_traceback; char buffer[1001]; int written; + PyThreadState *tstate = _PyThreadState_GET(); - PyErr_Fetch(&error_type, &error_value, &error_traceback); - file = _PySys_GetObjectId(key); + _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback); + file = sys_get_object_id(tstate, key); written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va); if (sys_pyfile_write(buffer, file) != 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); fputs(buffer, fp); } if (written < 0 || (size_t)written >= sizeof(buffer)) { @@ -3271,7 +3262,7 @@ sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va) if (sys_pyfile_write(truncated, file) != 0) fputs(truncated, fp); } - PyErr_Restore(error_type, error_value, error_traceback); + _PyErr_Restore(tstate, error_type, error_value, error_traceback); } void @@ -3300,20 +3291,21 @@ sys_format(_Py_Identifier *key, FILE *fp, const char *format, va_list va) PyObject *file, *message; PyObject *error_type, *error_value, *error_traceback; const char *utf8; + PyThreadState *tstate = _PyThreadState_GET(); - PyErr_Fetch(&error_type, &error_value, &error_traceback); - file = _PySys_GetObjectId(key); + _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback); + file = sys_get_object_id(tstate, key); message = PyUnicode_FromFormatV(format, va); if (message != NULL) { if (sys_pyfile_write_unicode(message, file) != 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); utf8 = PyUnicode_AsUTF8(message); if (utf8 != NULL) fputs(utf8, fp); } Py_DECREF(message); } - PyErr_Restore(error_type, error_value, error_traceback); + _PyErr_Restore(tstate, error_type, error_value, error_traceback); } void diff --git a/Python/thread.c b/Python/thread.c index c36ce6ff..a10f5728 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -6,7 +6,7 @@ Stuff shared by all thread_*.h files is collected here. */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyInterpreterState_GET() #ifndef _POSIX_THREADS /* This means pthreads are not implemented in libc headers, hence the macro @@ -23,8 +23,6 @@ #include -#include "pythread.h" - #ifndef _POSIX_THREADS /* Check if we're running on HP-UX and _SC_THREADS is defined. If so, then @@ -92,7 +90,7 @@ PyThread_init_thread(void) size_t PyThread_get_stacksize(void) { - return _PyInterpreterState_Get()->pythread_stacksize; + return _PyInterpreterState_GET()->pythread_stacksize; } /* Only platforms defining a THREAD_SET_STACKSIZE() macro diff --git a/Python/thread_nt.h b/Python/thread_nt.h index 23d585cf..05b982d3 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -1,3 +1,4 @@ +#include "pycore_interp.h" // _PyInterpreterState.pythread_stacksize /* This code implemented by Dag.Gruneau@elsa.preseco.comm.se */ /* Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru */ @@ -358,13 +359,13 @@ _pythread_nt_set_stacksize(size_t size) { /* set to default */ if (size == 0) { - _PyInterpreterState_GET_UNSAFE()->pythread_stacksize = 0; + _PyInterpreterState_GET()->pythread_stacksize = 0; return 0; } /* valid range? */ if (size >= THREAD_MIN_STACKSIZE && size < THREAD_MAX_STACKSIZE) { - _PyInterpreterState_GET_UNSAFE()->pythread_stacksize = size; + _PyInterpreterState_GET()->pythread_stacksize = size; return 0; } diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 78b99a77..e6910b30 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -1,3 +1,4 @@ +#include "pycore_interp.h" // _PyInterpreterState.pythread_stacksize /* Posix threads interface */ @@ -51,6 +52,16 @@ #undef THREAD_STACK_SIZE #define THREAD_STACK_SIZE 0x200000 #endif +/* bpo-38852: test_threading.test_recursion_limit() checks that 1000 recursive + Python calls (default recursion limit) doesn't crash, but raise a regular + RecursionError exception. In debug mode, Python function calls allocates + more memory on the stack, so use a stack of 8 MiB. */ +#if defined(__ANDROID__) && defined(THREAD_STACK_SIZE) && THREAD_STACK_SIZE == 0 +# ifdef Py_DEBUG +# undef THREAD_STACK_SIZE +# define THREAD_STACK_SIZE 0x800000 +# endif +#endif /* for safety, ensure a viable minimum stacksize */ #define THREAD_STACK_MIN 0x8000 /* 32 KiB */ #else /* !_POSIX_THREAD_ATTR_STACKSIZE */ @@ -97,17 +108,10 @@ #endif -/* We assume all modern POSIX systems have gettimeofday() */ -#ifdef GETTIMEOFDAY_NO_TZ -#define GETTIMEOFDAY(ptv) gettimeofday(ptv) -#else -#define GETTIMEOFDAY(ptv) gettimeofday(ptv, (struct timezone *)NULL) -#endif - #define MICROSECONDS_TO_TIMESPEC(microseconds, ts) \ do { \ struct timeval tv; \ - GETTIMEOFDAY(&tv); \ + gettimeofday(&tv, NULL); \ tv.tv_usec += microseconds % 1000000; \ tv.tv_sec += microseconds / 1000000; \ tv.tv_sec += tv.tv_usec / 1000000; \ @@ -544,9 +548,8 @@ PyThread_allocate_lock(void) if (!initialized) PyThread_init_thread(); - lock = (pthread_lock *) PyMem_RawMalloc(sizeof(pthread_lock)); + lock = (pthread_lock *) PyMem_RawCalloc(1, sizeof(pthread_lock)); if (lock) { - memset((void *)lock, '\0', sizeof(pthread_lock)); lock->locked = 0; status = pthread_mutex_init(&lock->mut, NULL); @@ -691,6 +694,26 @@ PyThread_release_lock(PyThread_type_lock lock) #endif /* USE_SEMAPHORES */ +int +_PyThread_at_fork_reinit(PyThread_type_lock *lock) +{ + PyThread_type_lock new_lock = PyThread_allocate_lock(); + if (new_lock == NULL) { + return -1; + } + + /* bpo-6721, bpo-40089: The old lock can be in an inconsistent state. + fork() can be called in the middle of an operation on the lock done by + another thread. So don't call PyThread_free_lock(*lock). + + Leak memory on purpose. Don't release the memory either since the + address of a mutex is relevant. Putting two mutexes at the same address + can lead to problems. */ + + *lock = new_lock; + return 0; +} + int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) { @@ -712,7 +735,7 @@ _pythread_pthread_set_stacksize(size_t size) /* set to default */ if (size == 0) { - _PyInterpreterState_GET_UNSAFE()->pythread_stacksize = 0; + _PyInterpreterState_GET()->pythread_stacksize = 0; return 0; } @@ -729,7 +752,7 @@ _pythread_pthread_set_stacksize(size_t size) rc = pthread_attr_setstacksize(&attrs, size); pthread_attr_destroy(&attrs); if (rc == 0) { - _PyInterpreterState_GET_UNSAFE()->pythread_stacksize = size; + _PyInterpreterState_GET()->pythread_stacksize = size; return 0; } } diff --git a/Python/traceback.c b/Python/traceback.c index 8e2f15e8..99b63af1 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -2,12 +2,11 @@ /* Traceback implementation */ #include "Python.h" -#include "pycore_pystate.h" #include "code.h" -#include "frameobject.h" -#include "structmember.h" -#include "osdefs.h" +#include "frameobject.h" // PyFrame_GetBack() +#include "structmember.h" // PyMemberDef +#include "osdefs.h" // SEP #ifdef HAVE_FCNTL_H #include #endif @@ -376,7 +375,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) int fd; int i; char *found_encoding; - char *encoding; + const char *encoding; PyObject *io; PyObject *binary; PyObject *fob = NULL; @@ -384,7 +383,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) PyObject *res; char buf[MAXPATHLEN+1]; int kind; - void *data; + const void *data; /* open the file */ if (filename == NULL) @@ -430,7 +429,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) if (fob == NULL) { PyErr_Clear(); - res = _PyObject_CallMethodId(binary, &PyId_close, NULL); + res = _PyObject_CallMethodIdNoArgs(binary, &PyId_close); Py_DECREF(binary); if (res) Py_DECREF(res); @@ -450,7 +449,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) break; } } - res = _PyObject_CallMethodId(fob, &PyId_close, NULL); + res = _PyObject_CallMethodIdNoArgs(fob, &PyId_close); if (res) Py_DECREF(res); else @@ -561,28 +560,28 @@ tb_printinternal(PyTracebackObject *tb, PyObject *f, long limit) tb = tb->tb_next; } while (tb != NULL && err == 0) { + PyCodeObject *code = PyFrame_GetCode(tb->tb_frame); if (last_file == NULL || - tb->tb_frame->f_code->co_filename != last_file || + code->co_filename != last_file || last_line == -1 || tb->tb_lineno != last_line || - last_name == NULL || tb->tb_frame->f_code->co_name != last_name) { + last_name == NULL || code->co_name != last_name) { if (cnt > TB_RECURSIVE_CUTOFF) { err = tb_print_line_repeated(f, cnt); } - last_file = tb->tb_frame->f_code->co_filename; + last_file = code->co_filename; last_line = tb->tb_lineno; - last_name = tb->tb_frame->f_code->co_name; + last_name = code->co_name; cnt = 0; } cnt++; if (err == 0 && cnt <= TB_RECURSIVE_CUTOFF) { - err = tb_displayline(f, - tb->tb_frame->f_code->co_filename, - tb->tb_lineno, - tb->tb_frame->f_code->co_name); + err = tb_displayline(f, code->co_filename, tb->tb_lineno, + code->co_name); if (err == 0) { err = PyErr_CheckSignals(); } } + Py_DECREF(code); tb = tb->tb_next; } if (err == 0 && cnt > TB_RECURSIVE_CUTOFF) { @@ -754,12 +753,9 @@ _Py_DumpASCII(int fd, PyObject *text) static void dump_frame(int fd, PyFrameObject *frame) { - PyCodeObject *code; - int lineno; - - code = frame->f_code; + PyCodeObject *code = PyFrame_GetCode(frame); PUTS(fd, " File "); - if (code != NULL && code->co_filename != NULL + if (code->co_filename != NULL && PyUnicode_Check(code->co_filename)) { PUTS(fd, "\""); @@ -770,7 +766,7 @@ dump_frame(int fd, PyFrameObject *frame) } /* PyFrame_GetLineNumber() was introduced in Python 2.7.0 and 3.2.0 */ - lineno = PyCode_Addr2Line(code, frame->f_lasti); + int lineno = PyCode_Addr2Line(code, frame->f_lasti); PUTS(fd, ", line "); if (lineno >= 0) { _Py_DumpDecimal(fd, (unsigned long)lineno); @@ -780,7 +776,7 @@ dump_frame(int fd, PyFrameObject *frame) } PUTS(fd, " in "); - if (code != NULL && code->co_name != NULL + if (code->co_name != NULL && PyUnicode_Check(code->co_name)) { _Py_DumpASCII(fd, code->co_name); } @@ -789,6 +785,7 @@ dump_frame(int fd, PyFrameObject *frame) } PUTS(fd, "\n"); + Py_DECREF(code); } static void @@ -801,22 +798,31 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header) PUTS(fd, "Stack (most recent call first):\n"); } - frame = _PyThreadState_GetFrame(tstate); + frame = PyThreadState_GetFrame(tstate); if (frame == NULL) { PUTS(fd, "\n"); return; } depth = 0; - while (frame != NULL) { + while (1) { if (MAX_FRAME_DEPTH <= depth) { + Py_DECREF(frame); PUTS(fd, " ...\n"); break; } - if (!PyFrame_Check(frame)) + if (!PyFrame_Check(frame)) { + Py_DECREF(frame); break; + } dump_frame(fd, frame); - frame = frame->f_back; + PyFrameObject *back = PyFrame_GetBack(frame); + Py_DECREF(frame); + + if (back == NULL) { + break; + } + frame = back; depth++; } } diff --git a/README.rst b/README.rst index 97a7191c..64885138 100644 --- a/README.rst +++ b/README.rst @@ -1,17 +1,21 @@ -This is Python version 3.8.6 +This is Python version 3.9.0 ============================ -.. image:: https://travis-ci.org/python/cpython.svg?branch=3.8 +.. image:: https://travis-ci.org/python/cpython.svg?branch=3.9 :alt: CPython build status on Travis CI - :target: https://travis-ci.org/python/cpython/branches + :target: https://travis-ci.org/python/cpython -.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=3.8 +.. image:: https://github.com/python/cpython/workflows/Tests/badge.svg + :alt: CPython build status on GitHub Actions + :target: https://github.com/python/cpython/actions + +.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=3.9 :alt: CPython build status on Azure DevOps - :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=3.8 + :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=3.9 -.. image:: https://codecov.io/gh/python/cpython/branch/3.8/graph/badge.svg +.. image:: https://codecov.io/gh/python/cpython/branch/3.9/graph/badge.svg :alt: CPython code coverage on Codecov - :target: https://codecov.io/gh/python/cpython/branch/3.8 + :target: https://codecov.io/gh/python/cpython .. image:: https://img.shields.io/badge/zulip-join_chat-brightgreen.svg :alt: Python Zulip chat @@ -75,10 +79,10 @@ dependencies for various Linux distributions and macOS. On macOS, there are additional configure and build options related to macOS framework and universal builds. Refer to `Mac/README.rst -`_. +`_. On Windows, see `PCbuild/readme.txt -`_. +`_. If you wish, you can create a subdirectory and invoke configure from there. For example:: @@ -137,11 +141,11 @@ What's New ---------- We have a comprehensive overview of the changes in the `What's New in Python -3.8 `_ document. For a more +3.9 `_ document. For a more detailed change log, read `Misc/NEWS -`_, but a full +`_, but a full accounting of changes can only be gleaned from the `commit history -`_. +`_. If you want to install multiple versions of Python, see the section below entitled "Installing multiple versions". @@ -150,7 +154,7 @@ entitled "Installing multiple versions". Documentation ------------- -`Documentation for Python 3.8 `_ is online, +`Documentation for Python 3.9 `_ is online, updated daily. It can also be downloaded in many formats for faster access. The documentation @@ -159,7 +163,7 @@ is primarily for documentation authors, translators, and people with special formatting requirements. For information about building Python's documentation, refer to `Doc/README.rst -`_. +`_. Converting From Python 2.x to 3.x @@ -209,8 +213,8 @@ intend to install multiple versions using the same prefix you must decide which version (if any) is your "primary" version. Install that version using ``make install``. Install all other versions using ``make altinstall``. -For example, if you want to install Python 2.7, 3.6, and 3.8 with 3.8 being the -primary version, you would execute ``make install`` in your 3.8 build directory +For example, if you want to install Python 2.7, 3.6, and 3.9 with 3.9 being the +primary version, you would execute ``make install`` in your 3.9 build directory and ``make altinstall`` in the others. @@ -240,7 +244,7 @@ All current PEPs, as well as guidelines for submitting a new PEP, are listed at Release Schedule ---------------- -See :pep:`569` for Python 3.8 release details. +See :pep:`596` for Python 3.9 release details. Copyright and License Information diff --git a/Tools/README b/Tools/README index 6c5fb208..b6d0b18e 100644 --- a/Tools/README +++ b/Tools/README @@ -23,6 +23,8 @@ msi Support for packaging Python as an MSI package on Windows. parser Un-parsing tool to generate code from an AST. +peg_generator PEG-based parser generator (pegen) used for new parser. + pynche A Tkinter-based color editor. scripts A number of useful single-file programs, e.g. tabnanny.py diff --git a/Tools/buildbot/remoteDeploy.bat b/Tools/buildbot/remoteDeploy.bat index d7737b70..90354efe 100644 --- a/Tools/buildbot/remoteDeploy.bat +++ b/Tools/buildbot/remoteDeploy.bat @@ -24,11 +24,18 @@ if NOT "%REMOTE_PYTHON_DIR:~-1,1%"=="\" (set REMOTE_PYTHON_DIR=%REMOTE_PYTHON_DI echo PYTHON_SOURCE = %PYTHON_SOURCE% echo REMOTE_PYTHON_DIR = %REMOTE_PYTHON_DIR% +REM stop Python processes and remove existing files if found +ssh %SSH_SERVER% "kill python.exe" +ssh %SSH_SERVER% "kill python_d.exe" ssh %SSH_SERVER% "if EXIST %REMOTE_PYTHON_DIR% (rd %REMOTE_PYTHON_DIR% /s/q)" + +REM Create Python directories ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%PCBuild\arm32" ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%temp" ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%Modules" ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%PC" + +REM Copy Python files for /f "USEBACKQ" %%i in (`dir PCbuild\*.bat /b`) do @scp PCBuild\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild" for /f "USEBACKQ" %%i in (`dir PCbuild\*.py /b`) do @scp PCBuild\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild" for /f "USEBACKQ" %%i in (`dir PCbuild\arm32\*.exe /b`) do @scp PCBuild\arm32\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild\arm32" diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat index f128345b..af917713 100644 --- a/Tools/buildbot/test.bat +++ b/Tools/buildbot/test.bat @@ -36,8 +36,10 @@ if NOT "%REMOTE_PYTHON_DIR:~-1,1%"=="\" (set REMOTE_PYTHON_DIR=%REMOTE_PYTHON_DI set TEMP_ARGS=--temp %REMOTE_PYTHON_DIR%temp set rt_args=%rt_opts% %dashU% -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% %TEMP_ARGS% -ssh %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp& %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args% -exit /b %ERRORLEVEL% +ssh %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp& cd %REMOTE_PYTHON_DIR% & %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args% +set ERR=%ERRORLEVEL% +scp %SSH_SERVER%:"%REMOTE_PYTHON_DIR%test-results.xml" "%PYTHON_SOURCE%\test-results.xml" +exit /b %ERR% :Arm32SshHelp echo SSH_SERVER environment variable must be set to administrator@[ip address] diff --git a/Tools/c-analyzer/README b/Tools/c-analyzer/README new file mode 100644 index 00000000..8cf20e27 --- /dev/null +++ b/Tools/c-analyzer/README @@ -0,0 +1,41 @@ +####################################### +# C Globals and CPython Runtime State. + +CPython's C code makes extensive use of global variables. Each global +falls into one of several categories: + +* (effectively) constants (incl. static types) +* globals used exclusively in main or in the REPL +* freelists, caches, and counters +* process-global state +* module state +* Python runtime state + +The ignored-globals.txt file is organized similarly. Of the different +categories, the last two are problematic and generally should not exist +in the codebase. + +Globals that hold module state (i.e. in Modules/*.c) cause problems +when multiple interpreters are in use. For more info, see PEP 3121, +which addresses the situation for extension modules in general. + +Globals in the last category should be avoided as well. The problem +isn't with the Python runtime having state. Rather, the problem is with +that state being spread throughout the codebase in dozens of individual +globals. Unlike the other globals, the runtime state represents a set +of values that are constantly shifting in a complex way. When they are +spread out it's harder to get a clear picture of what the runtime +involves. Furthermore, when they are spread out it complicates efforts +that change the runtime. + +Consequently, the globals for Python's runtime state have been +consolidated under a single top-level _PyRuntime global. No new globals +should be added for runtime state. Instead, they should be added to +_PyRuntimeState or one of its sub-structs. The check-c-globals script +should be run to ensure that no new globals have been added: + + python3 Tools/c-analyzer/check-c-globals.py + +If it reports any globals then they should be resolved. If the globals +are runtime state then they should be folded into _PyRuntimeState. +Otherwise they should be added to ignored-globals.txt. diff --git a/Tools/c-analyzer/TODO b/Tools/c-analyzer/TODO new file mode 100644 index 00000000..829daba2 --- /dev/null +++ b/Tools/c-analyzer/TODO @@ -0,0 +1,1072 @@ + +# allocator (16) +Objects/obmalloc.c:_PyMem static PyMemAllocatorEx _PyMem +Objects/obmalloc.c:_PyMem_Debug static struct { debug_alloc_api_t raw; debug_alloc_api_t mem; debug_alloc_api_t obj; } _PyMem_Debug +Objects/obmalloc.c:_PyMem_Raw static PyMemAllocatorEx _PyMem_Raw +Objects/obmalloc.c:_PyObject static PyMemAllocatorEx _PyObject +Objects/obmalloc.c:_PyObject_Arena static PyObjectArenaAllocator _PyObject_Arena +Objects/obmalloc.c:_Py_tracemalloc_config struct _PyTraceMalloc_Config _Py_tracemalloc_config +Objects/obmalloc.c:arenas static struct arena_object* arenas +Objects/obmalloc.c:maxarenas static uint maxarenas +Objects/obmalloc.c:narenas_currently_allocated static size_t narenas_currently_allocated +Objects/obmalloc.c:narenas_highwater static size_t narenas_highwater +Objects/obmalloc.c:nfp2lasta static struct arena_object* nfp2lasta[MAX_POOLS_IN_ARENA + 1] +Objects/obmalloc.c:ntimes_arena_allocated static size_t ntimes_arena_allocated +Objects/obmalloc.c:unused_arena_objects static struct arena_object* unused_arena_objects +Objects/obmalloc.c:usable_arenas static struct arena_object* usable_arenas +Objects/obmalloc.c:usedpools static poolp usedpools[2 * ((NB_SMALL_SIZE_CLASSES + 7) / 8) * 8] +Objects/obmalloc.c:new_arena():debug_stats static int debug_stats + + +# counters +Modules/_abc.c:abc_invalidation_counter static unsigned long long abc_invalidation_counter +Objects/bytesobject.c:_Py_null_strings Py_ssize_t _Py_null_strings +Objects/bytesobject.c:_Py_onel_strings Py_ssize_t _Py_one_strings + + +# constants (effectively) +Objects/dictobject.c:empty_keys_struct static PyDictKeysObject empty_keys_struct + + +# "initialized" +Python/fileutils.c:_Py_open_cloexec_works int _Py_open_cloexec_works + + +# freelists +Objects/dictobject.c:keys_free_list static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST] +Objects/dictobject.c:numfreekeys static int numfreekeys + + +# other non-object (43) +Modules/_tracemalloc.c:allocators static struct { PyMemAllocatorEx mem; PyMemAllocatorEx raw; PyMemAllocatorEx obj; } allocators +Modules/_tracemalloc.c:tables_lock static PyThread_type_lock tables_lock +Modules/_tracemalloc.c:tracemalloc_filenames static _Py_hashtable_t *tracemalloc_filenames +Modules/_tracemalloc.c:tracemalloc_peak_traced_memory static size_t tracemalloc_peak_traced_memory +Modules/_tracemalloc.c:tracemalloc_reentrant_key static Py_tss_t tracemalloc_reentrant_key +Modules/_tracemalloc.c:tracemalloc_tracebacks static _Py_hashtable_t *tracemalloc_tracebacks +Modules/_tracemalloc.c:tracemalloc_traced_memory static size_t tracemalloc_traced_memory +Modules/_tracemalloc.c:tracemalloc_traces static _Py_hashtable_t *tracemalloc_traces +Modules/faulthandler.c:old_stack static stack_t old_stack +Modules/faulthandler.c:stack static stack_t stack +Modules/faulthandler.c:faulthandler_dump_traceback():reentrant static volatile int reentrant +Modules/posixmodule.c:initialized static int initialized +Modules/signalmodule.c:initialized static int initialized +Modules/timemodule.c:initialized static int initialized +Objects/dictobject.c:pydict_global_version static uint64_t pydict_global_version +Objects/floatobject.c:detected_double_format static float_format_type detected_double_format +Objects/floatobject.c:detected_float_format static float_format_type detected_float_format +Objects/floatobject.c:double_format static float_format_type double_format +Objects/floatobject.c:float_format static float_format_type +Objects.longobject.c:_Py_quick_int_allocs Py_ssize_t _Py_quick_int_allocs +Objects.longobject.c:_Py_quick_neg_int_allocs Py_ssize_t _Py_quick_neg_int_allocs +Objects/moduleobject.c:max_module_number static Py_ssize_t max_module_number +Objects/object.c:_Py_RefTotal Py_ssize_t _Py_RefTotal +Objects/tupleobject.c:_Py_fast_tuple_allocs Py_ssize_t _Py_fast_tuple_allocs +Objects/tupleobject.c:_Py_tuple_zero_allocs Py_ssize_t _Py_tuple_zero_allocs +Objects/typeobject.c:next_version_tag static unsigned int next_version_tag +Parser/listnode.c:atbol static int atbol +Parser/listnode.c:level static int level +Python/Python-ast.c:init_types():initialized static int initialized +Python/bootstrap_hash.c:urandom_cache static struct { int fd; dev_t st_dev; ino_t st_ino; } urandom_cache +Python/ceval.c:_Py_CheckRecursionLimit int _Py_CheckRecursionLimit +Python/ceval.c:lltrace static int lltrace +Python/ceval.c:make_pending_calls():busy static int busy +Python/dynload_shlib.c:handles static struct { dev_t dev; ino_t ino; void *handle; } handles[128] +Python/dynload_shlib.c:nhandles static int nhandles +Python/import.c:import_lock static PyThread_type_lock import_lock +Python/import.c:import_lock_level static int import_lock_level +Python/import.c:import_lock_thread static unsigned long import_lock_thread +Python/import.c:import_find_and_load():accumulated static _PyTime_t accumulated +Python/import.c:import_find_and_load():header static int header +Python/import.c:import_find_and_load():import_level static int import_level +Python/pylifecycle.c:_Py_UnhandledKeyboardInterrupt int _Py_UnhandledKeyboardInterrupt +Python/pylifecycle.c:fatal_error():reentrant static int reentrant + + +####################################### +# PyObject (960) + +# freelists (10 + 10) +Modules/_collectionsmodule.c:freeblocks static block *freeblocks[MAXFREEBLOCKS] +Modules/_collectionsmodule.c:numfreeblocks static Py_ssize_t numfreeblocks +Objects/dictobject.c:free_list static PyDictObject *free_list[PyDict_MAXFREELIST] +Objects/dictobject.c:numfree static int numfree +Objects/exceptions.c:memerrors_freelist static PyBaseExceptionObject *memerrors_freelist +Objects/exceptions.c:memerrors_numfree static int memerrors_numfree +Objects/floatobject.c:free_list static PyFloatObject *free_list +Objects/floatobject.c:numfree static int numfree +Objects/frameobject.c:free_list static PyFrameObject *free_list +Objects/frameobject.c:numfree static int numfree +Objects/genobject.c:ag_asend_freelist static PyAsyncGenASend *ag_asend_freelist[_PyAsyncGen_MAXFREELIST] +Objects/genobject.c:ag_asend_freelist_free static int ag_asend_freelist_free +Objects/genobject.c:ag_value_freelist static _PyAsyncGenWrappedValue *ag_value_freelist[_PyAsyncGen_MAXFREELIST] +Objects/genobject.c:ag_value_freelist_free static int ag_value_freelist_free +Objects/listobject.c:free_list static PyListObject *free_list[PyList_MAXFREELIST] +Objects/listobject.c:numfree static int numfree +Objects/tupleobject.c:free_list static PyTupleObject *free_list[PyTuple_MAXSAVESIZE] +Objects/tupleobject.c:numfree static int numfree[PyTuple_MAXSAVESIZE] +Python/context.c:ctx_freelist static PyContext *ctx_freelist +Python/context.c:ctx_freelist_len static int ctx_freelist_len + + +# singletons (7) +Objects/boolobject.c:_Py_FalseStruct static struct _longobject _Py_FalseStruct +Objects/boolobject.c:_Py_TrueStruct static struct _longobject _Py_TrueStruct +Objects/boolobject.c:false_str static PyObject *false_str +Objects/boolobject.c:true_str static PyObject *true_str +Objects/object.c:_Py_NoneStruct PyObject _Py_NoneStruct +Objects/object.c:_Py_NotImplementedStruct PyObject _Py_NotImplementedStruct +Objects/sliceobject.c:_Py_EllipsisObject PyObject _Py_EllipsisObject + + +# module vars (9) +Modules/_functoolsmodule.c:kwd_mark static PyObject *kwd_mark +Modules/_localemodule.c:Error static PyObject *Error +Modules/_threadmodule.c:ThreadError static PyObject *ThreadError +Modules/_tracemalloc.c:unknown_filename static PyObject *unknown_filename +Modules/signalmodule.c:DefaultHandler static PyObject *DefaultHandler +Modules/signalmodule.c:IgnoreHandler static PyObject *IgnoreHandler +Modules/signalmodule.c:IntHandler static PyObject *IntHandler +Modules/signalmodule.c:ItimerError static PyObject *ItimerError +Objects/exceptions.c:errnomap static PyObject *errnomap + + +# other (non-cache) (5) +Modules/_tracemalloc.c:tracemalloc_traceback static traceback_t *tracemalloc_traceback +Modules/faulthandler.c:fatal_error static struct { int enabled; PyObject *file; int fd; int all_threads; PyInterpreterState *interp; void *exc_handler; } fatal_error +Modules/faulthandler.c:thread static struct { PyObject *file; int fd; PY_TIMEOUT_T timeout_us; int repeat; PyInterpreterState *interp; int exit; char *header; size_t header_len; PyThread_type_lock cancel_event; PyThread_type_lock running; } thread +Modules/signalmodule.c:Handlers static volatile struct { _Py_atomic_int tripped; PyObject *func; } Handlers[NSIG] +Objects/setobject.c:_dummy_struct static PyObject _dummy_struct + + +# caches (5) +Modules/posixmodule.c:posix_putenv_garbage static PyObject *posix_putenv_garbage +Objects/sliceobject.c:slice_cache static PySliceObject *slice_cache +Objects/typeobject.c:method_cache static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP] +Objects/unicodeobject.c:interned static PyObject *interned +Python/import.c:extensions static PyObject *extensions + + +# cached constants - non-str (15) +Modules/_io/_iomodule.c:_PyIO_empty_bytes PyObject *_PyIO_empty_bytes +Modules/_io/bufferedio.c:_PyIO_trap_eintr():eintr_int static PyObject *eintr_int +Modules/posixmodule.c:billion static PyObject *billion +Modules/posixmodule.c:wait_helper():struct_rusage static PyObject *struct_rusage +Objects/bytesobject.c:characters static PyBytesObject *characters[UCHAR_MAX + 1] +Objects/bytesobject.c:nullstring static PyBytesObject *nullstring +Objects/codeobject.c:PyCode_NewEmpty():nulltuple static PyObject *nulltuple +Objects/dictobject.c:empty_values static PyObject *empty_values[1] +Objects/listobject.c:indexerr static PyObject *indexerr +Objects/longobject.c:_PyLong_One PyObject *_PyLong_One +Objects/longobject.c:_PyLong_Zero PyObject *_PyLong_Zero +Objects/longobject.c:small_ints static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS] +Objects/setobject.c:emptyfrozenset static PyObject *emptyfrozenset +Python/context.c:_token_missing static PyObject *_token_missing +Python/hamt.c:_empty_hamt static PyHamtObject *_empty_hamt + + +# cached constants - str (441) +Modules/_io/_iomodule.c:_PyIO_empty_str PyObject *_PyIO_empty_str +Modules/_io/_iomodule.c:_PyIO_str_close PyObject *_PyIO_str_close +Modules/_io/_iomodule.c:_PyIO_str_closed PyObject *_PyIO_str_closed +Modules/_io/_iomodule.c:_PyIO_str_decode PyObject *_PyIO_str_decode +Modules/_io/_iomodule.c:_PyIO_str_encode PyObject *_PyIO_str_encode +Modules/_io/_iomodule.c:_PyIO_str_fileno PyObject *_PyIO_str_fileno +Modules/_io/_iomodule.c:_PyIO_str_flush PyObject *_PyIO_str_flush +Modules/_io/_iomodule.c:_PyIO_str_getstate PyObject *_PyIO_str_getstate +Modules/_io/_iomodule.c:_PyIO_str_isatty PyObject *_PyIO_str_isatty +Modules/_io/_iomodule.c:_PyIO_str_newlines PyObject *_PyIO_str_newlines +Modules/_io/_iomodule.c:_PyIO_str_nl PyObject *_PyIO_str_nl +Modules/_io/_iomodule.c:_PyIO_str_peek PyObject *_PyIO_str_peek +Modules/_io/_iomodule.c:_PyIO_str_read PyObject *_PyIO_str_read +Modules/_io/_iomodule.c:_PyIO_str_read1 PyObject *_PyIO_str_read1 +Modules/_io/_iomodule.c:_PyIO_str_readable PyObject *_PyIO_str_readable +Modules/_io/_iomodule.c:_PyIO_str_readall PyObject *_PyIO_str_readall +Modules/_io/_iomodule.c:_PyIO_str_readinto PyObject *_PyIO_str_readinto +Modules/_io/_iomodule.c:_PyIO_str_readline PyObject *_PyIO_str_readline +Modules/_io/_iomodule.c:_PyIO_str_reset PyObject *_PyIO_str_reset +Modules/_io/_iomodule.c:_PyIO_str_seek PyObject *_PyIO_str_seek +Modules/_io/_iomodule.c:_PyIO_str_seekable PyObject *_PyIO_str_seekable +Modules/_io/_iomodule.c:_PyIO_str_setstate PyObject *_PyIO_str_setstate +Modules/_io/_iomodule.c:_PyIO_str_tell PyObject *_PyIO_str_tell +Modules/_io/_iomodule.c:_PyIO_str_truncate PyObject *_PyIO_str_truncate +Modules/_io/_iomodule.c:_PyIO_str_writable PyObject *_PyIO_str_writable +Modules/_io/_iomodule.c:_PyIO_str_write PyObject *_PyIO_str_write +Modules/_threadmodule.c:str_dict static PyObject *str_dict +Modules/gcmodule.c:gc_str static PyObject *gc_str +Objects/classobject.c:instancemethod_get_doc():docstr static PyObject *docstr +Objects/classobject.c:method_get_doc():docstr static PyObject *docstr +Objects/codeobject.c:PyCode_NewEmpty():emptystring static PyObject *emptystring +Objects/exceptions.c:_check_for_legacy_statements():exec_prefix static PyObject *exec_prefix +Objects/exceptions.c:_check_for_legacy_statements():print_prefix static PyObject *print_prefix +Objects/funcobject.c:PyFunction_NewWithQualName():__name__ static PyObject *__name__ +Objects/typeobject.c:object___reduce_ex___impl():objreduce static PyObject *objreduce +Objects/typeobject.c:resolve_slotdups():pname static PyObject *pname +Objects/unicodeobject.c:unicode_empty static PyObject *unicode_empty +Objects/unicodeobject.c:unicode_latin1 static PyObject *unicode_latin1[256] +Python/_warnings.c:is_internal_frame():bootstrap_string static PyObject *bootstrap_string +Python/_warnings.c:is_internal_frame():importlib_string static PyObject *importlib_string +Python/ast.c:u_kind static PyObject *u_kind +Python/ast_unparse.c:_str_close_br static PyObject *_str_close_br +Python/ast_unparse.c:_str_dbl_close_br static PyObject *_str_dbl_close_br +Python/ast_unparse.c:_str_dbl_open_br static PyObject *_str_dbl_open_br +Python/ast_unparse.c:_str_open_br static PyObject *_str_open_br +Python/compile.c:__annotations__ static PyObject *__annotations__ +Python/compile.c:__doc__ static PyObject *__doc__ +Python/compile.c:compiler_dictcomp():name static identifier name +Python/compile.c:compiler_from_import():empty_string static PyObject *empty_string +Python/compile.c:compiler_genexp():name static identifier name +Python/compile.c:compiler_lambda():name static identifier name +Python/compile.c:compiler_listcomp():name static identifier name +Python/compile.c:compiler_setcomp():name static identifier name +Python/compile.c:compiler_visit_annotations():return_str static identifier return_str +Python/import.c:PyImport_Import():builtins_str static PyObject *builtins_str +Python/import.c:PyImport_Import():import_str static PyObject *import_str +Python/import.c:PyImport_Import():silly_list static PyObject *silly_list +Python/sysmodule.c:whatstrings static PyObject *whatstrings[8] +Python/sysmodule.c:sys_displayhook():newline static PyObject *newline +Objects/typeobject.c:object_new():comma_id _Py_static_string(comma_id, "", "") +Objects/typeobject.c:slot_nb_add():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_add():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_and():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_and():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_divmod():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_divmod():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_floor_divide():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_floor_divide():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_lshift():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_lshift():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_matrix_multiply():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_matrix_multiply():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_multiply():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_multiply():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_or():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_or():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_power_binary():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_power_binary():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_remainder():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_remainder():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_rshift():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_rshift():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_subtract():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_subtract():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_true_divide():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_true_divide():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_xor():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_xor():rop_id _Py_static_string(op_id, OPSTR) +Python/compile.c:compiler_set_qualname():dot _Py_static_string(dot, ""."") +Python/compile.c:compiler_set_qualname():dot_locals _Py_static_string(dot_locals, ""."") +Python/pythonrun.c:PyId_string _Py_static_string(PyId_string, """") +Modules/_abc.c:PyId___abstractmethods__ _Py_IDENTIFIER(__abstractmethods__) +Modules/_abc.c:PyId___bases__ _Py_IDENTIFIER(__bases__) +Modules/_abc.c:PyId___class__ _Py_IDENTIFIER(__class__) +Modules/_abc.c:PyId___dict__ _Py_IDENTIFIER(__dict__) +Modules/_abc.c:PyId___subclasscheck__ _Py_IDENTIFIER(__subclasscheck__) +Modules/_abc.c:PyId___subclasshook__ _Py_IDENTIFIER(__subclasshook__) +Modules/_abc.c:PyId__abc_impl _Py_IDENTIFIER(_abc_impl) +Modules/_collectionsmodule.c:_count_elements():PyId___setitem__ _Py_IDENTIFIER(__setitem__) +Modules/_collectionsmodule.c:_count_elements():PyId_get _Py_IDENTIFIER(get) +Modules/_collectionsmodule.c:defdict_reduce():PyId_items _Py_IDENTIFIER(items) +Modules/_dbmmodule.c:dbm__exit__():PyId_close _Py_IDENTIFIER(close) +Modules/_gdbmmodule.c:dbm__exit__():PyId_close _Py_IDENTIFIER(close) +Modules/_io/_iomodule.c:_io_open_impl():PyId__blksize _Py_IDENTIFIER(_blksize) +Modules/_io/_iomodule.c:_io_open_impl():PyId_isatty _Py_IDENTIFIER(isatty) +Modules/_io/_iomodule.c:_io_open_impl():PyId_mode _Py_IDENTIFIER(mode) +Modules/_io/bufferedio.c:PyId__dealloc_warn _Py_IDENTIFIER(_dealloc_warn) +Modules/_io/bufferedio.c:PyId_close _Py_IDENTIFIER(close) +Modules/_io/bufferedio.c:PyId_flush _Py_IDENTIFIER(flush) +Modules/_io/bufferedio.c:PyId_isatty _Py_IDENTIFIER(isatty) +Modules/_io/bufferedio.c:PyId_mode _Py_IDENTIFIER(mode) +Modules/_io/bufferedio.c:PyId_name _Py_IDENTIFIER(name) +Modules/_io/bufferedio.c:PyId_peek _Py_IDENTIFIER(peek) +Modules/_io/bufferedio.c:PyId_read _Py_IDENTIFIER(read) +Modules/_io/bufferedio.c:PyId_read1 _Py_IDENTIFIER(read1) +Modules/_io/bufferedio.c:PyId_readable _Py_IDENTIFIER(readable) +Modules/_io/bufferedio.c:PyId_readinto _Py_IDENTIFIER(readinto) +Modules/_io/bufferedio.c:PyId_readinto1 _Py_IDENTIFIER(readinto1) +Modules/_io/bufferedio.c:PyId_writable _Py_IDENTIFIER(writable) +Modules/_io/bufferedio.c:PyId_write _Py_IDENTIFIER(write) +Modules/_io/fileio.c:PyId_name _Py_IDENTIFIER(name) +Modules/_io/iobase.c:PyId___IOBase_closed _Py_IDENTIFIER(__IOBase_closed) +Modules/_io/iobase.c:PyId_read _Py_IDENTIFIER(read) +Modules/_io/iobase.c:_io__IOBase_tell_impl():PyId_seek _Py_IDENTIFIER(seek) +Modules/_io/iobase.c:_io__RawIOBase_read_impl():PyId_readall _Py_IDENTIFIER(readall) +Modules/_io/iobase.c:iobase_finalize():PyId__finalizing _Py_IDENTIFIER(_finalizing) +Modules/_io/textio.c:PyId__dealloc_warn _Py_IDENTIFIER(_dealloc_warn) +Modules/_io/textio.c:PyId_close _Py_IDENTIFIER(close) +Modules/_io/textio.c:PyId_decode _Py_IDENTIFIER(decode) +Modules/_io/textio.c:PyId_fileno _Py_IDENTIFIER(fileno) +Modules/_io/textio.c:PyId_flush _Py_IDENTIFIER(flush) +Modules/_io/textio.c:PyId_getpreferredencoding _Py_IDENTIFIER(getpreferredencoding) +Modules/_io/textio.c:PyId_isatty _Py_IDENTIFIER(isatty) +Modules/_io/textio.c:PyId_mode _Py_IDENTIFIER(mode) +Modules/_io/textio.c:PyId_name _Py_IDENTIFIER(name) +Modules/_io/textio.c:PyId_raw _Py_IDENTIFIER(raw) +Modules/_io/textio.c:PyId_read _Py_IDENTIFIER(read) +Modules/_io/textio.c:PyId_readable _Py_IDENTIFIER(readable) +Modules/_io/textio.c:PyId_replace _Py_IDENTIFIER(replace) +Modules/_io/textio.c:PyId_reset _Py_IDENTIFIER(reset) +Modules/_io/textio.c:PyId_seek _Py_IDENTIFIER(seek) +Modules/_io/textio.c:PyId_seekable _Py_IDENTIFIER(seekable) +Modules/_io/textio.c:PyId_setstate _Py_IDENTIFIER(setstate) +Modules/_io/textio.c:PyId_strict _Py_IDENTIFIER(strict) +Modules/_io/textio.c:PyId_tell _Py_IDENTIFIER(tell) +Modules/_io/textio.c:PyId_writable _Py_IDENTIFIER(writable) +Modules/_operator.c:methodcaller_reduce():PyId_partial _Py_IDENTIFIER(partial) +Modules/_pickle.c:do_append():PyId_extend _Py_IDENTIFIER(extend) +Modules/_pickle.c:load_build():PyId___setstate__ _Py_IDENTIFIER(__setstate__) +Modules/_threadmodule.c:PyId_flush _Py_IDENTIFIER(flush) +Modules/_threadmodule.c:PyId_stderr _Py_IDENTIFIER(stderr) +Modules/arraymodule.c:array_arrayiterator___reduce___impl():PyId_iter _Py_IDENTIFIER(iter) +Modules/faulthandler.c:PyId_enable _Py_IDENTIFIER(enable) +Modules/faulthandler.c:PyId_fileno _Py_IDENTIFIER(fileno) +Modules/faulthandler.c:PyId_flush _Py_IDENTIFIER(flush) +Modules/faulthandler.c:PyId_stderr _Py_IDENTIFIER(stderr) +Modules/itertoolsmodule.c:itertools_tee_impl():PyId___copy__ _Py_IDENTIFIER(__copy__) +Modules/itertoolsmodule.c:zip_longest_new():PyId_fillvalue _Py_IDENTIFIER(fillvalue) +Modules/main.c:pymain_sys_path_add_path0():PyId_path _Py_IDENTIFIER(path) +Modules/posixmodule.c:DirEntry_test_mode():PyId_st_mode _Py_IDENTIFIER(st_mode) +Modules/posixmodule.c:PyOS_FSPath():PyId___fspath__ _Py_IDENTIFIER(__fspath__) +Modules/posixmodule.c:path_converter():PyId___fspath__ _Py_IDENTIFIER(__fspath__) +Modules/posixmodule.c:wait_helper():PyId_struct_rusage _Py_IDENTIFIER(struct_rusage) +Modules/timemodule.c:time_strptime():PyId__strptime_time _Py_IDENTIFIER(_strptime_time) +Objects/abstract.c:PyMapping_Items():PyId_items _Py_IDENTIFIER(items) +Objects/abstract.c:PyMapping_Keys():PyId_keys _Py_IDENTIFIER(keys) +Objects/abstract.c:PyMapping_Values():PyId_values _Py_IDENTIFIER(values) +Objects/abstract.c:PyNumber_Long():PyId___trunc__ _Py_IDENTIFIER(__trunc__) +Objects/abstract.c:PyObject_Format():PyId___format__ _Py_IDENTIFIER(__format__) +Objects/abstract.c:PyObject_GetItem():PyId___class_getitem__ _Py_IDENTIFIER(__class_getitem__) +Objects/abstract.c:PyObject_IsInstance():PyId___instancecheck__ _Py_IDENTIFIER(__instancecheck__) +Objects/abstract.c:PyObject_IsSubclass():PyId___subclasscheck__ _Py_IDENTIFIER(__subclasscheck__) +Objects/abstract.c:PyObject_LengthHint():PyId___length_hint__ _Py_IDENTIFIER(__length_hint__) +Objects/abstract.c:abstract_get_bases():PyId___bases__ _Py_IDENTIFIER(__bases__) +Objects/abstract.c:recursive_isinstance():PyId___class__ _Py_IDENTIFIER(__class__) +Objects/bytearrayobject.c:_common_reduce():PyId___dict__ _Py_IDENTIFIER(__dict__) +Objects/bytearrayobject.c:bytearrayiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/bytesobject.c:bytes_new():PyId___bytes__ _Py_IDENTIFIER(__bytes__) +Objects/bytesobject.c:format_obj():PyId___bytes__ _Py_IDENTIFIER(__bytes__) +Objects/bytesobject.c:striter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/classobject.c:PyId___name__ _Py_IDENTIFIER(__name__) +Objects/classobject.c:PyId___qualname__ _Py_IDENTIFIER(__qualname__) +Objects/classobject.c:method_reduce():PyId_getattr _Py_IDENTIFIER(getattr) +Objects/complexobject.c:try_complex_special_method():PyId___complex__ _Py_IDENTIFIER(__complex__) +Objects/descrobject.c:calculate_qualname():PyId___qualname__ _Py_IDENTIFIER(__qualname__) +Objects/descrobject.c:descr_reduce():PyId_getattr _Py_IDENTIFIER(getattr) +Objects/descrobject.c:mappingproxy_copy():PyId_copy _Py_IDENTIFIER(copy) +Objects/descrobject.c:mappingproxy_get():PyId_get _Py_IDENTIFIER(get) +Objects/descrobject.c:mappingproxy_items():PyId_items _Py_IDENTIFIER(items) +Objects/descrobject.c:mappingproxy_keys():PyId_keys _Py_IDENTIFIER(keys) +Objects/descrobject.c:mappingproxy_values():PyId_values _Py_IDENTIFIER(values) +Objects/descrobject.c:property_init_impl():PyId___doc__ _Py_IDENTIFIER(__doc__) +Objects/descrobject.c:wrapper_reduce():PyId_getattr _Py_IDENTIFIER(getattr) +Objects/dictobject.c:_PyDictView_Intersect():PyId_intersection_update _Py_IDENTIFIER(intersection_update) +Objects/dictobject.c:dict_subscript():PyId___missing__ _Py_IDENTIFIER(__missing__) +Objects/dictobject.c:dict_update_common():PyId_keys _Py_IDENTIFIER(keys) +Objects/dictobject.c:dictiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/dictobject.c:dictviews_or():PyId_update _Py_IDENTIFIER(update) +Objects/dictobject.c:dictviews_sub():PyId_difference_update _Py_IDENTIFIER(difference_update) +Objects/dictobject.c:dictviews_xor():PyId_symmetric_difference_update _Py_IDENTIFIER(symmetric_difference_update) +Objects/enumobject.c:reversed_new_impl():PyId___reversed__ _Py_IDENTIFIER(__reversed__) +Objects/exceptions.c:ImportError_getstate():PyId_name _Py_IDENTIFIER(name) +Objects/exceptions.c:ImportError_getstate():PyId_path _Py_IDENTIFIER(path) +Objects/fileobject.c:PyFile_FromFd():PyId_open _Py_IDENTIFIER(open) +Objects/fileobject.c:PyFile_GetLine():PyId_readline _Py_IDENTIFIER(readline) +Objects/fileobject.c:PyFile_OpenCodeObject():PyId_open _Py_IDENTIFIER(open) +Objects/fileobject.c:PyFile_WriteObject():PyId_write _Py_IDENTIFIER(write) +Objects/fileobject.c:PyObject_AsFileDescriptor():PyId_fileno _Py_IDENTIFIER(fileno) +Objects/frameobject.c:PyId___builtins__ _Py_IDENTIFIER(__builtins__) +Objects/genobject.c:_gen_throw():PyId_throw _Py_IDENTIFIER(throw) +Objects/genobject.c:gen_close_iter():PyId_close _Py_IDENTIFIER(close) +Objects/iterobject.c:calliter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/iterobject.c:iter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/listobject.c:listiter_reduce_general():PyId_iter _Py_IDENTIFIER(iter) +Objects/listobject.c:listiter_reduce_general():PyId_reversed _Py_IDENTIFIER(reversed) +Objects/longobject.c:PyId_big _Py_IDENTIFIER(big) +Objects/longobject.c:PyId_little _Py_IDENTIFIER(little) +Objects/methodobject.c:meth_get__qualname__():PyId___qualname__ _Py_IDENTIFIER(__qualname__) +Objects/methodobject.c:meth_reduce():PyId_getattr _Py_IDENTIFIER(getattr) +Objects/moduleobject.c:PyModule_GetFilenameObject():PyId___file__ _Py_IDENTIFIER(__file__) +Objects/moduleobject.c:PyModule_GetNameObject():PyId___name__ _Py_IDENTIFIER(__name__) +Objects/moduleobject.c:PyModule_SetDocString():PyId___doc__ _Py_IDENTIFIER(__doc__) +Objects/moduleobject.c:_PyModuleSpec_IsInitializing():PyId__initializing _Py_IDENTIFIER(_initializing) +Objects/moduleobject.c:module_dir():PyId___dict__ _Py_IDENTIFIER(__dict__) +Objects/moduleobject.c:module_dir():PyId___dir__ _Py_IDENTIFIER(__dir__) +Objects/moduleobject.c:module_getattro():PyId___getattr__ _Py_IDENTIFIER(__getattr__) +Objects/moduleobject.c:module_getattro():PyId___name__ _Py_IDENTIFIER(__name__) +Objects/moduleobject.c:module_getattro():PyId___spec__ _Py_IDENTIFIER(__spec__) +Objects/moduleobject.c:module_init_dict():PyId___doc__ _Py_IDENTIFIER(__doc__) +Objects/moduleobject.c:module_init_dict():PyId___loader__ _Py_IDENTIFIER(__loader__) +Objects/moduleobject.c:module_init_dict():PyId___name__ _Py_IDENTIFIER(__name__) +Objects/moduleobject.c:module_init_dict():PyId___package__ _Py_IDENTIFIER(__package__) +Objects/moduleobject.c:module_init_dict():PyId___spec__ _Py_IDENTIFIER(__spec__) +Objects/object.c:PyId_Py_Repr _Py_IDENTIFIER(Py_Repr) +Objects/object.c:PyId___bytes__ _Py_IDENTIFIER(__bytes__) +Objects/object.c:PyId___dir__ _Py_IDENTIFIER(__dir__) +Objects/object.c:PyId___isabstractmethod__ _Py_IDENTIFIER(__isabstractmethod__) +Objects/odictobject.c:mutablemapping_update():PyId_items _Py_IDENTIFIER(items) +Objects/odictobject.c:mutablemapping_update():PyId_keys _Py_IDENTIFIER(keys) +Objects/odictobject.c:odict_reduce():PyId___dict__ _Py_IDENTIFIER(__dict__) +Objects/odictobject.c:odict_reduce():PyId_items _Py_IDENTIFIER(items) +Objects/odictobject.c:odict_repr():PyId_items _Py_IDENTIFIER(items) +Objects/odictobject.c:odictiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/rangeobject.c:longrangeiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/rangeobject.c:rangeiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/setobject.c:set_reduce():PyId___dict__ _Py_IDENTIFIER(__dict__) +Objects/setobject.c:setiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/structseq.c:PyId_n_fields _Py_IDENTIFIER(n_fields) +Objects/structseq.c:PyId_n_sequence_fields _Py_IDENTIFIER(n_sequence_fields) +Objects/structseq.c:PyId_n_unnamed_fields _Py_IDENTIFIER(n_unnamed_fields) +Objects/tupleobject.c:tupleiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/typeobject.c:PyId___abstractmethods__ _Py_IDENTIFIER(__abstractmethods__) +Objects/typeobject.c:PyId___class__ _Py_IDENTIFIER(__class__) +Objects/typeobject.c:PyId___class_getitem__ _Py_IDENTIFIER(__class_getitem__) +Objects/typeobject.c:PyId___delitem__ _Py_IDENTIFIER(__delitem__) +Objects/typeobject.c:PyId___dict__ _Py_IDENTIFIER(__dict__) +Objects/typeobject.c:PyId___doc__ _Py_IDENTIFIER(__doc__) +Objects/typeobject.c:PyId___getattribute__ _Py_IDENTIFIER(__getattribute__) +Objects/typeobject.c:PyId___getitem__ _Py_IDENTIFIER(__getitem__) +Objects/typeobject.c:PyId___hash__ _Py_IDENTIFIER(__hash__) +Objects/typeobject.c:PyId___init_subclass__ _Py_IDENTIFIER(__init_subclass__) +Objects/typeobject.c:PyId___len__ _Py_IDENTIFIER(__len__) +Objects/typeobject.c:PyId___module__ _Py_IDENTIFIER(__module__) +Objects/typeobject.c:PyId___name__ _Py_IDENTIFIER(__name__) +Objects/typeobject.c:PyId___new__ _Py_IDENTIFIER(__new__) +Objects/typeobject.c:PyId___set_name__ _Py_IDENTIFIER(__set_name__) +Objects/typeobject.c:PyId___setitem__ _Py_IDENTIFIER(__setitem__) +Objects/typeobject.c:PyId_builtins _Py_IDENTIFIER(builtins) +Objects/typeobject.c:_PyObject_GetItemsIter():PyId_items _Py_IDENTIFIER(items) +Objects/typeobject.c:_PyObject_GetNewArguments():PyId___getnewargs__ _Py_IDENTIFIER(__getnewargs__) +Objects/typeobject.c:_PyObject_GetNewArguments():PyId___getnewargs_ex__ _Py_IDENTIFIER(__getnewargs_ex__) +Objects/typeobject.c:_PyObject_GetState():PyId___getstate__ _Py_IDENTIFIER(__getstate__) +Objects/typeobject.c:_PyType_GetSlotNames():PyId___slotnames__ _Py_IDENTIFIER(__slotnames__) +Objects/typeobject.c:_PyType_GetSlotNames():PyId__slotnames _Py_IDENTIFIER(_slotnames) +Objects/typeobject.c:import_copyreg():PyId_copyreg _Py_IDENTIFIER(copyreg) +Objects/typeobject.c:merge_class_dict():PyId___bases__ _Py_IDENTIFIER(__bases__) +Objects/typeobject.c:mro_invoke():PyId_mro _Py_IDENTIFIER(mro) +Objects/typeobject.c:object___reduce_ex___impl():PyId___reduce__ _Py_IDENTIFIER(__reduce__) +Objects/typeobject.c:overrides_hash():PyId___eq__ _Py_IDENTIFIER(__eq__) +Objects/typeobject.c:reduce_newobj():PyId___newobj__ _Py_IDENTIFIER(__newobj__) +Objects/typeobject.c:reduce_newobj():PyId___newobj_ex__ _Py_IDENTIFIER(__newobj_ex__) +Objects/typeobject.c:slot_am_aiter():PyId___aiter__ _Py_IDENTIFIER(__aiter__) +Objects/typeobject.c:slot_am_anext():PyId___anext__ _Py_IDENTIFIER(__anext__) +Objects/typeobject.c:slot_am_await():PyId___await__ _Py_IDENTIFIER(__await__) +Objects/typeobject.c:slot_nb_bool():PyId___bool__ _Py_IDENTIFIER(__bool__) +Objects/typeobject.c:slot_nb_index():PyId___index__ _Py_IDENTIFIER(__index__) +Objects/typeobject.c:slot_nb_inplace_power():PyId___ipow__ _Py_IDENTIFIER(__ipow__) +Objects/typeobject.c:slot_nb_power():PyId___pow__ _Py_IDENTIFIER(__pow__) +Objects/typeobject.c:slot_sq_contains():PyId___contains__ _Py_IDENTIFIER(__contains__) +Objects/typeobject.c:slot_tp_call():PyId___call__ _Py_IDENTIFIER(__call__) +Objects/typeobject.c:slot_tp_descr_get():PyId___get__ _Py_IDENTIFIER(__get__) +Objects/typeobject.c:slot_tp_descr_set():PyId___delete__ _Py_IDENTIFIER(__delete__) +Objects/typeobject.c:slot_tp_descr_set():PyId___set__ _Py_IDENTIFIER(__set__) +Objects/typeobject.c:slot_tp_finalize():PyId___del__ _Py_IDENTIFIER(__del__) +Objects/typeobject.c:slot_tp_getattr_hook():PyId___getattr__ _Py_IDENTIFIER(__getattr__) +Objects/typeobject.c:slot_tp_init():PyId___init__ _Py_IDENTIFIER(__init__) +Objects/typeobject.c:slot_tp_iter():PyId___iter__ _Py_IDENTIFIER(__iter__) +Objects/typeobject.c:slot_tp_iternext():PyId___next__ _Py_IDENTIFIER(__next__) +Objects/typeobject.c:slot_tp_repr():PyId___repr__ _Py_IDENTIFIER(__repr__) +Objects/typeobject.c:slot_tp_setattro():PyId___delattr__ _Py_IDENTIFIER(__delattr__) +Objects/typeobject.c:slot_tp_setattro():PyId___setattr__ _Py_IDENTIFIER(__setattr__) +Objects/typeobject.c:type_mro_modified():PyId_mro _Py_IDENTIFIER(mro) +Objects/typeobject.c:type_new():PyId___classcell__ _Py_IDENTIFIER(__classcell__) +Objects/typeobject.c:type_new():PyId___mro_entries__ _Py_IDENTIFIER(__mro_entries__) +Objects/typeobject.c:type_new():PyId___qualname__ _Py_IDENTIFIER(__qualname__) +Objects/typeobject.c:type_new():PyId___slots__ _Py_IDENTIFIER(__slots__) +Objects/unicodeobject.c:unicodeiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/weakrefobject.c:proxy_bytes():PyId___bytes__ _Py_IDENTIFIER(__bytes__) +Objects/weakrefobject.c:weakref_repr():PyId___name__ _Py_IDENTIFIER(__name__) +Parser/tokenizer.c:fp_setreadl():PyId_open _Py_IDENTIFIER(open) +Parser/tokenizer.c:fp_setreadl():PyId_readline _Py_IDENTIFIER(readline) +Python/Python-ast.c:ast_type_reduce():PyId___dict__ _Py_IDENTIFIER(__dict__) +Python/Python-ast.c:make_type():PyId___module__ _Py_IDENTIFIER(__module__) +Python/_warnings.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/_warnings.c:_PyErr_WarnUnawaitedCoroutine():PyId__warn_unawaited_coroutine _Py_IDENTIFIER(_warn_unawaited_coroutine) +Python/_warnings.c:already_warned():PyId_version _Py_IDENTIFIER(version) +Python/_warnings.c:call_show_warning():PyId_WarningMessage _Py_IDENTIFIER(WarningMessage) +Python/_warnings.c:call_show_warning():PyId__showwarnmsg _Py_IDENTIFIER(_showwarnmsg) +Python/_warnings.c:check_matched():PyId_match _Py_IDENTIFIER(match) +Python/_warnings.c:get_default_action():PyId_defaultaction _Py_IDENTIFIER(defaultaction) +Python/_warnings.c:get_filter():PyId_filters _Py_IDENTIFIER(filters) +Python/_warnings.c:get_once_registry():PyId_onceregistry _Py_IDENTIFIER(onceregistry) +Python/_warnings.c:get_source_line():PyId___loader__ _Py_IDENTIFIER(__loader__) +Python/_warnings.c:get_source_line():PyId___name__ _Py_IDENTIFIER(__name__) +Python/_warnings.c:get_source_line():PyId_get_source _Py_IDENTIFIER(get_source) +Python/_warnings.c:get_warnings_attr():PyId_warnings _Py_IDENTIFIER(warnings) +Python/_warnings.c:setup_context():PyId___name__ _Py_IDENTIFIER(__name__) +Python/_warnings.c:setup_context():PyId___warningregistry__ _Py_IDENTIFIER(__warningregistry__) +Python/_warnings.c:show_warning():PyId___name__ _Py_IDENTIFIER(__name__) +Python/bltinmodule.c:PyId___builtins__ _Py_IDENTIFIER(__builtins__) +Python/bltinmodule.c:PyId___dict__ _Py_IDENTIFIER(__dict__) +Python/bltinmodule.c:PyId___mro_entries__ _Py_IDENTIFIER(__mro_entries__) +Python/bltinmodule.c:PyId___prepare__ _Py_IDENTIFIER(__prepare__) +Python/bltinmodule.c:PyId___round__ _Py_IDENTIFIER(__round__) +Python/bltinmodule.c:PyId_encoding _Py_IDENTIFIER(encoding) +Python/bltinmodule.c:PyId_errors _Py_IDENTIFIER(errors) +Python/bltinmodule.c:PyId_fileno _Py_IDENTIFIER(fileno) +Python/bltinmodule.c:PyId_flush _Py_IDENTIFIER(flush) +Python/bltinmodule.c:PyId_metaclass _Py_IDENTIFIER(metaclass) +Python/bltinmodule.c:PyId_sort _Py_IDENTIFIER(sort) +Python/bltinmodule.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/bltinmodule.c:PyId_stdin _Py_IDENTIFIER(stdin) +Python/bltinmodule.c:PyId_stdout _Py_IDENTIFIER(stdout) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___aenter__ _Py_IDENTIFIER(__aenter__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___aexit__ _Py_IDENTIFIER(__aexit__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___annotations__ _Py_IDENTIFIER(__annotations__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___build_class__ _Py_IDENTIFIER(__build_class__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___enter__ _Py_IDENTIFIER(__enter__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___exit__ _Py_IDENTIFIER(__exit__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___ltrace__ _Py_IDENTIFIER(__ltrace__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId_displayhook _Py_IDENTIFIER(displayhook) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId_send _Py_IDENTIFIER(send) +Python/ceval.c:import_all_from():PyId___all__ _Py_IDENTIFIER(__all__) +Python/ceval.c:import_all_from():PyId___dict__ _Py_IDENTIFIER(__dict__) +Python/ceval.c:import_all_from():PyId___name__ _Py_IDENTIFIER(__name__) +Python/ceval.c:import_from():PyId___name__ _Py_IDENTIFIER(__name__) +Python/ceval.c:import_name():PyId___import__ _Py_IDENTIFIER(__import__) +Python/codecs.c:_PyCodec_LookupTextEncoding():PyId__is_text_encoding _Py_IDENTIFIER(_is_text_encoding) +Python/compile.c:compiler_enter_scope():PyId___class__ _Py_IDENTIFIER(__class__) +Python/errors.c:PyId_builtins _Py_IDENTIFIER(builtins) +Python/errors.c:PyId_flush _Py_IDENTIFIER(flush) +Python/errors.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/errors.c:PyErr_NewException():PyId___module__ _Py_IDENTIFIER(__module__) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_filename _Py_IDENTIFIER(filename) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_lineno _Py_IDENTIFIER(lineno) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_msg _Py_IDENTIFIER(msg) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_offset _Py_IDENTIFIER(offset) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_print_file_and_line _Py_IDENTIFIER(print_file_and_line) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_text _Py_IDENTIFIER(text) +Python/errors.c:_PyErr_WriteUnraisableMsg():PyId_unraisablehook _Py_IDENTIFIER(unraisablehook) +Python/import.c:PyImport_Cleanup():PyId_clear _Py_IDENTIFIER(clear) +Python/import.c:PyImport_ExecCodeModuleObject():PyId__fix_up_module _Py_IDENTIFIER(_fix_up_module) +Python/import.c:PyImport_ExecCodeModuleWithPathnames():PyId__get_sourcefile _Py_IDENTIFIER(_get_sourcefile) +Python/import.c:PyImport_ImportModuleLevelObject():PyId___path__ _Py_IDENTIFIER(__path__) +Python/import.c:PyImport_ImportModuleLevelObject():PyId___spec__ _Py_IDENTIFIER(__spec__) +Python/import.c:PyImport_ImportModuleLevelObject():PyId__handle_fromlist _Py_IDENTIFIER(_handle_fromlist) +Python/import.c:PyImport_ImportModuleLevelObject():PyId__lock_unlock_module _Py_IDENTIFIER(_lock_unlock_module) +Python/import.c:PyImport_ReloadModule():PyId_imp _Py_IDENTIFIER(imp) +Python/import.c:PyImport_ReloadModule():PyId_reload _Py_IDENTIFIER(reload) +Python/import.c:_PyImportZip_Init():PyId_zipimporter _Py_IDENTIFIER(zipimporter) +Python/import.c:import_find_and_load():PyId__find_and_load _Py_IDENTIFIER(_find_and_load) +Python/import.c:module_dict_for_exec():PyId___builtins__ _Py_IDENTIFIER(__builtins__) +Python/import.c:resolve_name():PyId___name__ _Py_IDENTIFIER(__name__) +Python/import.c:resolve_name():PyId___package__ _Py_IDENTIFIER(__package__) +Python/import.c:resolve_name():PyId___path__ _Py_IDENTIFIER(__path__) +Python/import.c:resolve_name():PyId___spec__ _Py_IDENTIFIER(__spec__) +Python/import.c:resolve_name():PyId_parent _Py_IDENTIFIER(parent) +Python/importdl.c:get_encoded_name():PyId_replace _Py_IDENTIFIER(replace) +Python/marshal.c:marshal_dump_impl():PyId_write _Py_IDENTIFIER(write) +Python/marshal.c:marshal_load():PyId_read _Py_IDENTIFIER(read) +Python/marshal.c:r_string():PyId_readinto _Py_IDENTIFIER(readinto) +Python/pylifecycle.c:PyId_flush _Py_IDENTIFIER(flush) +Python/pylifecycle.c:PyId_name _Py_IDENTIFIER(name) +Python/pylifecycle.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/pylifecycle.c:PyId_stdin _Py_IDENTIFIER(stdin) +Python/pylifecycle.c:PyId_stdout _Py_IDENTIFIER(stdout) +Python/pylifecycle.c:PyId_threading _Py_IDENTIFIER(threading) +Python/pylifecycle.c:create_stdio():PyId_TextIOWrapper _Py_IDENTIFIER(TextIOWrapper) +Python/pylifecycle.c:create_stdio():PyId_isatty _Py_IDENTIFIER(isatty) +Python/pylifecycle.c:create_stdio():PyId_mode _Py_IDENTIFIER(mode) +Python/pylifecycle.c:create_stdio():PyId_open _Py_IDENTIFIER(open) +Python/pylifecycle.c:create_stdio():PyId_raw _Py_IDENTIFIER(raw) +Python/pylifecycle.c:wait_for_thread_shutdown():PyId__shutdown _Py_IDENTIFIER(_shutdown) +Python/pythonrun.c:PyId_builtins _Py_IDENTIFIER(builtins) +Python/pythonrun.c:PyId_excepthook _Py_IDENTIFIER(excepthook) +Python/pythonrun.c:PyId_flush _Py_IDENTIFIER(flush) +Python/pythonrun.c:PyId_last_traceback _Py_IDENTIFIER(last_traceback) +Python/pythonrun.c:PyId_last_type _Py_IDENTIFIER(last_type) +Python/pythonrun.c:PyId_last_value _Py_IDENTIFIER(last_value) +Python/pythonrun.c:PyId_ps1 _Py_IDENTIFIER(ps1) +Python/pythonrun.c:PyId_ps2 _Py_IDENTIFIER(ps2) +Python/pythonrun.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/pythonrun.c:PyId_stdin _Py_IDENTIFIER(stdin) +Python/pythonrun.c:PyId_stdout _Py_IDENTIFIER(stdout) +Python/pythonrun.c:PyRun_InteractiveOneObjectEx():PyId___main__ _Py_IDENTIFIER(__main__) +Python/pythonrun.c:PyRun_InteractiveOneObjectEx():PyId_encoding _Py_IDENTIFIER(encoding) +Python/pythonrun.c:_Py_HandleSystemExit():PyId_code _Py_IDENTIFIER(code) +Python/pythonrun.c:parse_syntax_error():PyId_filename _Py_IDENTIFIER(filename) +Python/pythonrun.c:parse_syntax_error():PyId_lineno _Py_IDENTIFIER(lineno) +Python/pythonrun.c:parse_syntax_error():PyId_msg _Py_IDENTIFIER(msg) +Python/pythonrun.c:parse_syntax_error():PyId_offset _Py_IDENTIFIER(offset) +Python/pythonrun.c:parse_syntax_error():PyId_text _Py_IDENTIFIER(text) +Python/pythonrun.c:print_exception():PyId___module__ _Py_IDENTIFIER(__module__) +Python/pythonrun.c:print_exception():PyId_print_file_and_line _Py_IDENTIFIER(print_file_and_line) +Python/sysmodule.c:PyId__ _Py_IDENTIFIER(_) +Python/sysmodule.c:PyId___sizeof__ _Py_IDENTIFIER(__sizeof__) +Python/sysmodule.c:PyId__xoptions _Py_IDENTIFIER(_xoptions) +Python/sysmodule.c:PyId_buffer _Py_IDENTIFIER(buffer) +Python/sysmodule.c:PyId_builtins _Py_IDENTIFIER(builtins) +Python/sysmodule.c:PyId_encoding _Py_IDENTIFIER(encoding) +Python/sysmodule.c:PyId_path _Py_IDENTIFIER(path) +Python/sysmodule.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/sysmodule.c:PyId_stdout _Py_IDENTIFIER(stdout) +Python/sysmodule.c:PyId_warnoptions _Py_IDENTIFIER(warnoptions) +Python/sysmodule.c:PyId_write _Py_IDENTIFIER(write) +Python/traceback.c:PyId_TextIOWrapper _Py_IDENTIFIER(TextIOWrapper) +Python/traceback.c:PyId_close _Py_IDENTIFIER(close) +Python/traceback.c:PyId_open _Py_IDENTIFIER(open) +Python/traceback.c:PyId_path _Py_IDENTIFIER(path) +Objects/typeobject.c:name_op static _Py_Identifier name_op[] +Objects/unicodeobject.c:static_strings static _Py_Identifier *static_strings + + +# PyTypeObject (311) +Modules/_abc.c:_abc_data_type static PyTypeObject _abc_data_type +Modules/_blake2/blake2b_impl.c:PyBlake2_BLAKE2bType PyTypeObject PyBlake2_BLAKE2bType +Modules/_blake2/blake2s_impl.c:PyBlake2_BLAKE2sType PyTypeObject PyBlake2_BLAKE2sType +Modules/_collectionsmodule.c:defdict_type static PyTypeObject defdict_type +Modules/_collectionsmodule.c:deque_type static PyTypeObject deque_type +Modules/_collectionsmodule.c:dequeiter_type static PyTypeObject dequeiter_type +Modules/_collectionsmodule.c:dequereviter_type static PyTypeObject dequereviter_type +Modules/_collectionsmodule.c:tuplegetter_type static PyTypeObject tuplegetter_type +Modules/_functoolsmodule.c:keyobject_type static PyTypeObject keyobject_type +Modules/_functoolsmodule.c:lru_cache_type static PyTypeObject lru_cache_type +Modules/_functoolsmodule.c:lru_list_elem_type static PyTypeObject lru_list_elem_type +Modules/_functoolsmodule.c:partial_type static PyTypeObject partial_type +Modules/_io/bufferedio.c:PyBufferedIOBase_Type PyTypeObject PyBufferedIOBase_Type +Modules/_io/bufferedio.c:PyBufferedRWPair_Type PyTypeObject PyBufferedRWPair_Type +Modules/_io/bufferedio.c:PyBufferedRandom_Type PyTypeObject PyBufferedRandom_Type +Modules/_io/bufferedio.c:PyBufferedReader_Type PyTypeObject PyBufferedReader_Type +Modules/_io/bufferedio.c:PyBufferedWriter_Type PyTypeObject PyBufferedWriter_Type +Modules/_io/bytesio.c:PyBytesIO_Type PyTypeObject PyBytesIO_Type +Modules/_io/bytesio.c:_PyBytesIOBuffer_Type PyTypeObject _PyBytesIOBuffer_Type +Modules/_io/fileio.c:PyFileIO_Type PyTypeObject PyFileIO_Type +Modules/_io/iobase.c:PyIOBase_Type PyTypeObject PyIOBase_Type +Modules/_io/iobase.c:PyRawIOBase_Type PyTypeObject PyRawIOBase_Type +Modules/_io/stringio.c:PyStringIO_Type PyTypeObject PyStringIO_Type +Modules/_io/textio.c:PyIncrementalNewlineDecoder_Type PyTypeObject PyIncrementalNewlineDecoder_Type +Modules/_io/textio.c:PyTextIOBase_Type PyTypeObject PyTextIOBase_Type +Modules/_io/textio.c:PyTextIOWrapper_Type PyTypeObject PyTextIOWrapper_Type +Modules/_operator.c:attrgetter_type static PyTypeObject attrgetter_type +Modules/_operator.c:itemgetter_type static PyTypeObject itemgetter_type +Modules/_operator.c:methodcaller_type static PyTypeObject methodcaller_type +Modules/_sre.c:Match_Type static PyTypeObject Match_Type +Modules/_sre.c:Pattern_Type static PyTypeObject Pattern_Type +Modules/_sre.c:Scanner_Type static PyTypeObject Scanner_Type +Modules/_threadmodule.c:ExceptHookArgsType static PyTypeObject ExceptHookArgsType +Modules/_threadmodule.c:Locktype static PyTypeObject Locktype +Modules/_threadmodule.c:RLocktype static PyTypeObject RLocktype +Modules/_threadmodule.c:localdummytype static PyTypeObject localdummytype +Modules/_threadmodule.c:localtype static PyTypeObject localtype +Modules/itertoolsmodule.c:_grouper_type static PyTypeObject _grouper_type +Modules/itertoolsmodule.c:accumulate_type static PyTypeObject accumulate_type +Modules/itertoolsmodule.c:chain_type static PyTypeObject chain_type +Modules/itertoolsmodule.c:combinations_type static PyTypeObject combinations_type +Modules/itertoolsmodule.c:compress_type static PyTypeObject compress_type +Modules/itertoolsmodule.c:count_type static PyTypeObject count_type +Modules/itertoolsmodule.c:cwr_type static PyTypeObject cwr_type +Modules/itertoolsmodule.c:cycle_type static PyTypeObject cycle_type +Modules/itertoolsmodule.c:dropwhile_type static PyTypeObject dropwhile_type +Modules/itertoolsmodule.c:filterfalse_type static PyTypeObject filterfalse_type +Modules/itertoolsmodule.c:groupby_type static PyTypeObject groupby_type +Modules/itertoolsmodule.c:islice_type static PyTypeObject islice_type +Modules/itertoolsmodule.c:permutations_type static PyTypeObject permutations_type +Modules/itertoolsmodule.c:product_type static PyTypeObject product_type +Modules/itertoolsmodule.c:repeat_type static PyTypeObject repeat_type +Modules/itertoolsmodule.c:starmap_type static PyTypeObject starmap_type +Modules/itertoolsmodule.c:takewhile_type static PyTypeObject takewhile_type +Modules/itertoolsmodule.c:tee_type static PyTypeObject tee_type +Modules/itertoolsmodule.c:teedataobject_type static PyTypeObject teedataobject_type +Modules/itertoolsmodule.c:ziplongest_type static PyTypeObject ziplongest_type +Modules/posixmodule.c:DirEntryType static PyTypeObject DirEntryType +Modules/posixmodule.c:ScandirIteratorType static PyTypeObject ScandirIteratorType +Modules/posixmodule.c:SchedParamType static PyTypeObject* SchedParamType +Modules/posixmodule.c:StatResultType static PyTypeObject* StatResultType +Modules/posixmodule.c:StatVFSResultType static PyTypeObject* StatVFSResultType +Modules/posixmodule.c:TerminalSizeType static PyTypeObject* TerminalSizeType +Modules/posixmodule.c:TimesResultType static PyTypeObject* TimesResultType +Modules/posixmodule.c:UnameResultType static PyTypeObject* UnameResultType +Modules/posixmodule.c:WaitidResultType static PyTypeObject* WaitidResultType +Modules/signalmodule.c:SiginfoType static PyTypeObject SiginfoType +Modules/timemodule.c:StructTimeType static PyTypeObject StructTimeType +Modules/xxsubtype.c:spamdict_type static PyTypeObject spamdict_type +Modules/xxsubtype.c:spamlist_type static PyTypeObject spamlist_type +Objects/boolobject.c:PyBool_Type PyTypeObject PyBool_Type +Objects/bytearrayobject.c:PyByteArrayIter_Type PyTypeObject PyByteArrayIter_Type +Objects/bytearrayobject.c:PyByteArray_Type PyTypeObject PyByteArray_Type +Objects/bytesobject.c:PyBytesIter_Type PyTypeObject PyBytesIter_Type +Objects/bytesobject.c:PyBytes_Type PyTypeObject PyBytes_Type +Objects/capsule.c:PyCapsule_Type PyTypeObject PyCapsule_Type +Objects/cellobject.c:PyCell_Type PyTypeObject PyCell_Type +Objects/classobject.c:PyInstanceMethod_Type PyTypeObject PyInstanceMethod_Type +Objects/classobject.c:PyMethod_Type PyTypeObject PyMethod_Type +Objects/codeobject.c:PyCode_Type PyTypeObject PyCode_Type +Objects/complexobject.c:PyComplex_Type PyTypeObject PyComplex_Type +Objects/descrobject.c:PyClassMethodDescr_Type PyTypeObject PyClassMethodDescr_Type +Objects/descrobject.c:PyDictProxy_Type PyTypeObject PyDictProxy_Type +Objects/descrobject.c:PyGetSetDescr_Type PyTypeObject PyGetSetDescr_Type +Objects/descrobject.c:PyMemberDescr_Type PyTypeObject PyMemberDescr_Type +Objects/descrobject.c:PyMethodDescr_Type PyTypeObject PyMethodDescr_Type +Objects/descrobject.c:PyProperty_Type PyTypeObject PyProperty_Type +Objects/descrobject.c:PyWrapperDescr_Type PyTypeObject PyWrapperDescr_Type +Objects/descrobject.c:_PyMethodWrapper_Type PyTypeObject _PyMethodWrapper_Type +Objects/dictobject.c:PyDictItems_Type PyTypeObject PyDictItems_Type +Objects/dictobject.c:PyDictIterItem_Type PyTypeObject PyDictIterItem_Type +Objects/dictobject.c:PyDictIterKey_Type PyTypeObject PyDictIterKey_Type +Objects/dictobject.c:PyDictIterValue_Type PyTypeObject PyDictIterValue_Type +Objects/dictobject.c:PyDictKeys_Type PyTypeObject PyDictKeys_Type +Objects/dictobject.c:PyDictRevIterItem_Type PyTypeObject PyDictRevIterItem_Type +Objects/dictobject.c:PyDictRevIterKey_Type PyTypeObject PyDictRevIterKey_Type +Objects/dictobject.c:PyDictRevIterValue_Type PyTypeObject PyDictRevIterValue_Type +Objects/dictobject.c:PyDictValues_Type PyTypeObject PyDictValues_Type +Objects/dictobject.c:PyDict_Type PyTypeObject PyDict_Type +Objects/enumobject.c:PyEnum_Type PyTypeObject PyEnum_Type +Objects/enumobject.c:PyReversed_Type PyTypeObject PyReversed_Type +Objects/exceptions.c:PyExc_ArithmeticError static PyTypeObject PyExc_ArithmeticError +Objects/exceptions.c:PyExc_AssertionError static PyTypeObject PyExc_AssertionError +Objects/exceptions.c:PyExc_AttributeError static PyTypeObject PyExc_AttributeError +Objects/exceptions.c:PyExc_BaseException static PyTypeObject PyExc_BaseException +Objects/exceptions.c:PyExc_BlockingIOError static PyTypeObject PyExc_BlockingIOError +Objects/exceptions.c:PyExc_BrokenPipeError static PyTypeObject PyExc_BrokenPipeError +Objects/exceptions.c:PyExc_BufferError static PyTypeObject PyExc_BufferError +Objects/exceptions.c:PyExc_BytesWarning static PyTypeObject PyExc_BytesWarning +Objects/exceptions.c:PyExc_ChildProcessError static PyTypeObject PyExc_ChildProcessError +Objects/exceptions.c:PyExc_ConnectionAbortedError static PyTypeObject PyExc_ConnectionAbortedError +Objects/exceptions.c:PyExc_ConnectionError static PyTypeObject PyExc_ConnectionError +Objects/exceptions.c:PyExc_ConnectionRefusedError static PyTypeObject PyExc_ConnectionRefusedError +Objects/exceptions.c:PyExc_ConnectionResetError static PyTypeObject PyExc_ConnectionResetError +Objects/exceptions.c:PyExc_DeprecationWarning static PyTypeObject PyExc_DeprecationWarning +Objects/exceptions.c:PyExc_EOFError static PyTypeObject PyExc_EOFError +Objects/exceptions.c:PyExc_EnvironmentError static PyTypeObject PyExc_EnvironmentError +Objects/exceptions.c:PyExc_Exception static PyTypeObject PyExc_Exception +Objects/exceptions.c:PyExc_FileExistsError static PyTypeObject PyExc_FileExistsError +Objects/exceptions.c:PyExc_FileNotFoundError static PyTypeObject PyExc_FileNotFoundError +Objects/exceptions.c:PyExc_FloatingPointError static PyTypeObject PyExc_FloatingPointError +Objects/exceptions.c:PyExc_FutureWarning static PyTypeObject PyExc_FutureWarning +Objects/exceptions.c:PyExc_GeneratorExit static PyTypeObject PyExc_GeneratorExit +Objects/exceptions.c:PyExc_IOError static PyTypeObject PyExc_IOError +Objects/exceptions.c:PyExc_ImportError static PyTypeObject PyExc_ImportError +Objects/exceptions.c:PyExc_ImportWarning static PyTypeObject PyExc_ImportWarning +Objects/exceptions.c:PyExc_IndentationError static PyTypeObject PyExc_IndentationError +Objects/exceptions.c:PyExc_IndexError static PyTypeObject PyExc_IndexError +Objects/exceptions.c:PyExc_InterruptedError static PyTypeObject PyExc_InterruptedError +Objects/exceptions.c:PyExc_IsADirectoryError static PyTypeObject PyExc_IsADirectoryError +Objects/exceptions.c:PyExc_KeyError static PyTypeObject PyExc_KeyError +Objects/exceptions.c:PyExc_KeyboardInterrupt static PyTypeObject PyExc_KeyboardInterrupt +Objects/exceptions.c:PyExc_LookupError static PyTypeObject PyExc_LookupError +Objects/exceptions.c:PyExc_MemoryError static PyTypeObject PyExc_MemoryError +Objects/exceptions.c:PyExc_ModuleNotFoundError static PyTypeObject PyExc_ModuleNotFoundError +Objects/exceptions.c:PyExc_NameError static PyTypeObject PyExc_NameError +Objects/exceptions.c:PyExc_NotADirectoryError static PyTypeObject PyExc_NotADirectoryError +Objects/exceptions.c:PyExc_NotImplementedError static PyTypeObject PyExc_NotImplementedError +Objects/exceptions.c:PyExc_OSError static PyTypeObject PyExc_OSError +Objects/exceptions.c:PyExc_OverflowError static PyTypeObject PyExc_OverflowError +Objects/exceptions.c:PyExc_PendingDeprecationWarning static PyTypeObject PyExc_PendingDeprecationWarning +Objects/exceptions.c:PyExc_PermissionError static PyTypeObject PyExc_PermissionError +Objects/exceptions.c:PyExc_ProcessLookupError static PyTypeObject PyExc_ProcessLookupError +Objects/exceptions.c:PyExc_RecursionError static PyTypeObject PyExc_RecursionError +Objects/exceptions.c:PyExc_ReferenceError static PyTypeObject PyExc_ReferenceError +Objects/exceptions.c:PyExc_ResourceWarning static PyTypeObject PyExc_ResourceWarning +Objects/exceptions.c:PyExc_RuntimeError static PyTypeObject PyExc_RuntimeError +Objects/exceptions.c:PyExc_RuntimeWarning static PyTypeObject PyExc_RuntimeWarning +Objects/exceptions.c:PyExc_StopAsyncIteration static PyTypeObject PyExc_StopAsyncIteration +Objects/exceptions.c:PyExc_StopIteration static PyTypeObject PyExc_StopIteration +Objects/exceptions.c:PyExc_SyntaxError static PyTypeObject PyExc_SyntaxError +Objects/exceptions.c:PyExc_SyntaxWarning static PyTypeObject PyExc_SyntaxWarning +Objects/exceptions.c:PyExc_SystemError static PyTypeObject PyExc_SystemError +Objects/exceptions.c:PyExc_SystemExit static PyTypeObject PyExc_SystemExit +Objects/exceptions.c:PyExc_TabError static PyTypeObject PyExc_TabError +Objects/exceptions.c:PyExc_TimeoutError static PyTypeObject PyExc_TimeoutError +Objects/exceptions.c:PyExc_TypeError static PyTypeObject PyExc_TypeError +Objects/exceptions.c:PyExc_UnboundLocalError static PyTypeObject PyExc_UnboundLocalError +Objects/exceptions.c:PyExc_UnicodeDecodeError static PyTypeObject PyExc_UnicodeDecodeError +Objects/exceptions.c:PyExc_UnicodeEncodeError static PyTypeObject PyExc_UnicodeEncodeError +Objects/exceptions.c:PyExc_UnicodeError static PyTypeObject PyExc_UnicodeError +Objects/exceptions.c:PyExc_UnicodeTranslateError static PyTypeObject PyExc_UnicodeTranslateError +Objects/exceptions.c:PyExc_UnicodeWarning static PyTypeObject PyExc_UnicodeWarning +Objects/exceptions.c:PyExc_UserWarning static PyTypeObject PyExc_UserWarning +Objects/exceptions.c:PyExc_ValueError static PyTypeObject PyExc_ValueError +Objects/exceptions.c:PyExc_Warning static PyTypeObject PyExc_Warning +Objects/exceptions.c:PyExc_ZeroDivisionError static PyTypeObject PyExc_ZeroDivisionError +Objects/exceptions.c:_PyExc_ArithmeticError static PyTypeObject _PyExc_ArithmeticError +Objects/exceptions.c:_PyExc_AssertionError static PyTypeObject _PyExc_AssertionError +Objects/exceptions.c:_PyExc_AttributeError static PyTypeObject _PyExc_AttributeError +Objects/exceptions.c:_PyExc_BaseException static PyTypeObject _PyExc_BaseException +Objects/exceptions.c:_PyExc_BlockingIOError static PyTypeObject _PyExc_BlockingIOError +Objects/exceptions.c:_PyExc_BrokenPipeError static PyTypeObject _PyExc_BrokenPipeError +Objects/exceptions.c:_PyExc_BufferError static PyTypeObject _PyExc_BufferError +Objects/exceptions.c:_PyExc_BytesWarning static PyTypeObject _PyExc_BytesWarning +Objects/exceptions.c:_PyExc_ChildProcessError static PyTypeObject _PyExc_ChildProcessError +Objects/exceptions.c:_PyExc_ConnectionAbortedError static PyTypeObject _PyExc_ConnectionAbortedError +Objects/exceptions.c:_PyExc_ConnectionError static PyTypeObject _PyExc_ConnectionError +Objects/exceptions.c:_PyExc_ConnectionRefusedError static PyTypeObject _PyExc_ConnectionRefusedError +Objects/exceptions.c:_PyExc_ConnectionResetError static PyTypeObject _PyExc_ConnectionResetError +Objects/exceptions.c:_PyExc_DeprecationWarning static PyTypeObject _PyExc_DeprecationWarning +Objects/exceptions.c:_PyExc_EOFError static PyTypeObject _PyExc_EOFError +Objects/exceptions.c:_PyExc_Exception static PyTypeObject _PyExc_Exception +Objects/exceptions.c:_PyExc_FileExistsError static PyTypeObject _PyExc_FileExistsError +Objects/exceptions.c:_PyExc_FileNotFoundError static PyTypeObject _PyExc_FileNotFoundError +Objects/exceptions.c:_PyExc_FloatingPointError static PyTypeObject _PyExc_FloatingPointError +Objects/exceptions.c:_PyExc_FutureWarning static PyTypeObject _PyExc_FutureWarning +Objects/exceptions.c:_PyExc_GeneratorExit static PyTypeObject _PyExc_GeneratorExit +Objects/exceptions.c:_PyExc_ImportError static PyTypeObject _PyExc_ImportError +Objects/exceptions.c:_PyExc_ImportWarning static PyTypeObject _PyExc_ImportWarning +Objects/exceptions.c:_PyExc_IndentationError static PyTypeObject _PyExc_IndentationError +Objects/exceptions.c:_PyExc_IndexError static PyTypeObject _PyExc_IndexError +Objects/exceptions.c:_PyExc_InterruptedError static PyTypeObject _PyExc_InterruptedError +Objects/exceptions.c:_PyExc_IsADirectoryError static PyTypeObject _PyExc_IsADirectoryError +Objects/exceptions.c:_PyExc_KeyError static PyTypeObject _PyExc_KeyError +Objects/exceptions.c:_PyExc_KeyboardInterrupt static PyTypeObject _PyExc_KeyboardInterrupt +Objects/exceptions.c:_PyExc_LookupError static PyTypeObject _PyExc_LookupError +Objects/exceptions.c:_PyExc_MemoryError static PyTypeObject _PyExc_MemoryError +Objects/exceptions.c:_PyExc_ModuleNotFoundError static PyTypeObject _PyExc_ModuleNotFoundError +Objects/exceptions.c:_PyExc_NameError static PyTypeObject _PyExc_NameError +Objects/exceptions.c:_PyExc_NotADirectoryError static PyTypeObject _PyExc_NotADirectoryError +Objects/exceptions.c:_PyExc_NotImplementedError static PyTypeObject _PyExc_NotImplementedError +Objects/exceptions.c:_PyExc_OSError static PyTypeObject _PyExc_OSError +Objects/exceptions.c:_PyExc_OverflowError static PyTypeObject _PyExc_OverflowError +Objects/exceptions.c:_PyExc_PendingDeprecationWarning static PyTypeObject _PyExc_PendingDeprecationWarning +Objects/exceptions.c:_PyExc_PermissionError static PyTypeObject _PyExc_PermissionError +Objects/exceptions.c:_PyExc_ProcessLookupError static PyTypeObject _PyExc_ProcessLookupError +Objects/exceptions.c:_PyExc_RecursionError static PyTypeObject _PyExc_RecursionError +Objects/exceptions.c:_PyExc_ReferenceError static PyTypeObject _PyExc_ReferenceError +Objects/exceptions.c:_PyExc_ResourceWarning static PyTypeObject _PyExc_ResourceWarning +Objects/exceptions.c:_PyExc_RuntimeError static PyTypeObject _PyExc_RuntimeError +Objects/exceptions.c:_PyExc_RuntimeWarning static PyTypeObject _PyExc_RuntimeWarning +Objects/exceptions.c:_PyExc_StopAsyncIteration static PyTypeObject _PyExc_StopAsyncIteration +Objects/exceptions.c:_PyExc_StopIteration static PyTypeObject _PyExc_StopIteration +Objects/exceptions.c:_PyExc_SyntaxError static PyTypeObject _PyExc_SyntaxError +Objects/exceptions.c:_PyExc_SyntaxWarning static PyTypeObject _PyExc_SyntaxWarning +Objects/exceptions.c:_PyExc_SystemError static PyTypeObject _PyExc_SystemError +Objects/exceptions.c:_PyExc_SystemExit static PyTypeObject _PyExc_SystemExit +Objects/exceptions.c:_PyExc_TabError static PyTypeObject _PyExc_TabError +Objects/exceptions.c:_PyExc_TimeoutError static PyTypeObject _PyExc_TimeoutError +Objects/exceptions.c:_PyExc_TypeError static PyTypeObject _PyExc_TypeError +Objects/exceptions.c:_PyExc_UnboundLocalError static PyTypeObject _PyExc_UnboundLocalError +Objects/exceptions.c:_PyExc_UnicodeDecodeError static PyTypeObject _PyExc_UnicodeDecodeError +Objects/exceptions.c:_PyExc_UnicodeEncodeError static PyTypeObject _PyExc_UnicodeEncodeError +Objects/exceptions.c:_PyExc_UnicodeError static PyTypeObject _PyExc_UnicodeError +Objects/exceptions.c:_PyExc_UnicodeTranslateError static PyTypeObject _PyExc_UnicodeTranslateError +Objects/exceptions.c:_PyExc_UnicodeWarning static PyTypeObject _PyExc_UnicodeWarning +Objects/exceptions.c:_PyExc_UserWarning static PyTypeObject _PyExc_UserWarning +Objects/exceptions.c:_PyExc_ValueError static PyTypeObject _PyExc_ValueError +Objects/exceptions.c:_PyExc_Warning static PyTypeObject _PyExc_Warning +Objects/exceptions.c:_PyExc_ZeroDivisionError static PyTypeObject _PyExc_ZeroDivisionError +Objects/fileobject.c:PyStdPrinter_Type PyTypeObject PyStdPrinter_Type +Objects/floatobject.c:FloatInfoType static PyTypeObject FloatInfoType +Objects/floatobject.c:PyFloat_Type PyTypeObject PyFloat_Type +Objects/frameobject.c:PyFrame_Type PyTypeObject PyFrame_Type +Objects/funcobject.c:PyClassMethod_Type PyTypeObject PyClassMethod_Type +Objects/funcobject.c:PyFunction_Type PyTypeObject PyFunction_Type +Objects/funcobject.c:PyStaticMethod_Type PyTypeObject PyStaticMethod_Type +Objects/genobject.c:PyAsyncGen_Type PyTypeObject PyAsyncGen_Type +Objects/genobject.c:PyCoro_Type PyTypeObject PyCoro_Type +Objects/genobject.c:PyGen_Type PyTypeObject PyGen_Type +Objects/genobject.c:_PyAsyncGenASend_Type PyTypeObject _PyAsyncGenASend_Type +Objects/genobject.c:_PyAsyncGenAThrow_Type PyTypeObject _PyAsyncGenAThrow_Type +Objects/genobject.c:_PyAsyncGenWrappedValue_Type PyTypeObject _PyAsyncGenWrappedValue_Type +Objects/genobject.c:_PyCoroWrapper_Type PyTypeObject _PyCoroWrapper_Type +Objects/interpreteridobject.c:_PyInterpreterID_Type PyTypeObject _PyInterpreterID_Type +Objects/iterobject.c:PyCallIter_Type PyTypeObject PyCallIter_Type +Objects/iterobject.c:PySeqIter_Type PyTypeObject PySeqIter_Type +Objects/listobject.c:PyListIter_Type PyTypeObject PyListIter_Type +Objects/listobject.c:PyListRevIter_Type PyTypeObject PyListRevIter_Type +Objects/listobject.c:PyList_Type PyTypeObject PyList_Type +Objects/longobject.c:Int_InfoType static PyTypeObject Int_InfoType +Objects/longobject.c:PyLong_Type PyTypeObject PyLong_Type +Objects/memoryobject.c:PyMemoryView_Type PyTypeObject PyMemoryView_Type +Objects/memoryobject.c:_PyManagedBuffer_Type PyTypeObject _PyManagedBuffer_Type +Objects/methodobject.c:PyCFunction_Type PyTypeObject PyCFunction_Type +Objects/moduleobject.c:PyModuleDef_Type PyTypeObject PyModuleDef_Type +Objects/moduleobject.c:PyModule_Type PyTypeObject PyModule_Type +Objects/namespaceobject.c:_PyNamespace_Type PyTypeObject _PyNamespace_Type +Objects/object.c:_PyNone_Type PyTypeObject _PyNone_Type +Objects/object.c:_PyNotImplemented_Type PyTypeObject _PyNotImplemented_Type +Objects/odictobject.c:PyODictItems_Type PyTypeObject PyODictItems_Type +Objects/odictobject.c:PyODictIter_Type PyTypeObject PyODictIter_Type +Objects/odictobject.c:PyODictKeys_Type PyTypeObject PyODictKeys_Type +Objects/odictobject.c:PyODictValues_Type PyTypeObject PyODictValues_Type +Objects/odictobject.c:PyODict_Type PyTypeObject PyODict_Type +Objects/picklebufobject.c:PyPickleBuffer_Type PyTypeObject PyPickleBuffer_Type +Objects/rangeobject.c:PyLongRangeIter_Type PyTypeObject PyLongRangeIter_Type +Objects/rangeobject.c:PyRangeIter_Type PyTypeObject PyRangeIter_Type +Objects/rangeobject.c:PyRange_Type PyTypeObject PyRange_Type +Objects/setobject.c:PyFrozenSet_Type PyTypeObject PyFrozenSet_Type +Objects/setobject.c:PySetIter_Type PyTypeObject PySetIter_Type +Objects/setobject.c:PySet_Type PyTypeObject PySet_Type +Objects/setobject.c:_PySetDummy_Type static PyTypeObject _PySetDummy_Type +Objects/sliceobject.c:PyEllipsis_Type PyTypeObject PyEllipsis_Type +Objects/sliceobject.c:PySlice_Type PyTypeObject PySlice_Type +Objects/stringlib/unicode_format.h:PyFieldNameIter_Type static PyTypeObject PyFieldNameIter_Type +Objects/stringlib/unicode_format.h:PyFormatterIter_Type static PyTypeObject PyFormatterIter_Type +Objects/tupleobject.c:PyTupleIter_Type PyTypeObject PyTupleIter_Type +Objects/tupleobject.c:PyTuple_Type PyTypeObject PyTuple_Type +Objects/typeobject.c:PyBaseObject_Type PyTypeObject PyBaseObject_Type +Objects/typeobject.c:PySuper_Type PyTypeObject PySuper_Type +Objects/typeobject.c:PyType_Type PyTypeObject PyType_Type +Objects/unicodeobject.c:EncodingMapType static PyTypeObject EncodingMapType +Objects/unicodeobject.c:PyUnicodeIter_Type PyTypeObject PyUnicodeIter_Type +Objects/unicodeobject.c:PyUnicode_Type PyTypeObject PyUnicode_Type +Objects/weakrefobject.c:_PyWeakref_CallableProxyType PyTypeObject _PyWeakref_CallableProxyType +Objects/weakrefobject.c:_PyWeakref_ProxyType PyTypeObject _PyWeakref_ProxyType +Objects/weakrefobject.c:_PyWeakref_RefType PyTypeObject _PyWeakref_RefType +Python/bltinmodule.c:PyFilter_Type PyTypeObject PyFilter_Type +Python/bltinmodule.c:PyMap_Type PyTypeObject PyMap_Type +Python/bltinmodule.c:PyZip_Type PyTypeObject PyZip_Type +Python/context.c:PyContextTokenMissing_Type PyTypeObject PyContextTokenMissing_Type +Python/context.c:PyContextToken_Type PyTypeObject PyContextToken_Type +Python/context.c:PyContextVar_Type PyTypeObject PyContextVar_Type +Python/context.c:PyContext_Type PyTypeObject PyContext_Type +Python/errors.c:UnraisableHookArgsType static PyTypeObject UnraisableHookArgsType +Python/hamt.c:_PyHamtItems_Type PyTypeObject _PyHamtItems_Type +Python/hamt.c:_PyHamtKeys_Type PyTypeObject _PyHamtKeys_Type +Python/hamt.c:_PyHamtValues_Type PyTypeObject _PyHamtValues_Type +Python/hamt.c:_PyHamt_ArrayNode_Type PyTypeObject _PyHamt_ArrayNode_Type +Python/hamt.c:_PyHamt_BitmapNode_Type PyTypeObject _PyHamt_BitmapNode_Type +Python/hamt.c:_PyHamt_CollisionNode_Type PyTypeObject _PyHamt_CollisionNode_Type +Python/hamt.c:_PyHamt_Type PyTypeObject _PyHamt_Type +Python/symtable.c:PySTEntry_Type PyTypeObject PySTEntry_Type +Python/sysmodule.c:AsyncGenHooksType static PyTypeObject AsyncGenHooksType +Python/sysmodule.c:FlagsType static PyTypeObject FlagsType +Python/sysmodule.c:Hash_InfoType static PyTypeObject Hash_InfoType +Python/sysmodule.c:VersionInfoType static PyTypeObject VersionInfoType +Python/thread.c:ThreadInfoType static PyTypeObject ThreadInfoType +Python/traceback.c:PyTraceBack_Type PyTypeObject PyTraceBack_Type + + +# _PyArg_Parser (147) +Modules/_blake2/clinic/blake2b_impl.c.h:py_blake2b_new():_parser static _PyArg_Parser _parser +Modules/_blake2/clinic/blake2s_impl.c.h:py_blake2s_new():_parser static _PyArg_Parser _parser +Modules/_io/clinic/_iomodule.c.h:_io_open():_parser static _PyArg_Parser _parser +Modules/_io/clinic/_iomodule.c.h:_io_open_code():_parser static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h:_io_BufferedRandom___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h:_io_BufferedReader___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h:_io_BufferedWriter___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/bytesio.c.h:_io_BytesIO___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/fileio.c.h:_io_FileIO___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/stringio.c.h:_io_StringIO___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h:_io_IncrementalNewlineDecoder___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h:_io_IncrementalNewlineDecoder_decode():_parser static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h:_io_TextIOWrapper___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h:_io_TextIOWrapper_reconfigure():_parser static _PyArg_Parser _parser +Modules/_io/clinic/winconsoleio.c.h:_io__WindowsConsoleIO___init__():_parser static _PyArg_Parser _parser +Modules/_multiprocessing/clinic/posixshmem.c.h:_posixshmem_shm_open():_parser static _PyArg_Parser _parser +Modules/_multiprocessing/clinic/posixshmem.c.h:_posixshmem_shm_unlink():_parser static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h:_multibytecodec_MultibyteCodec_decode():_parser static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h:_multibytecodec_MultibyteCodec_encode():_parser static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h:_multibytecodec_MultibyteIncrementalDecoder_decode():_parser static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h:_multibytecodec_MultibyteIncrementalEncoder_encode():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Future___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Future_add_done_callback():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Task___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Task_all_tasks():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Task_current_task():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Task_get_stack():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Task_print_stack():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio__enter_task():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio__leave_task():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio__register_task():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio__unregister_task():_parser static _PyArg_Parser _parser +Modules/clinic/_bz2module.c.h:_bz2_BZ2Decompressor_decompress():_parser static _PyArg_Parser _parser +Modules/clinic/_codecsmodule.c.h:_codecs_decode():_parser static _PyArg_Parser _parser +Modules/clinic/_codecsmodule.c.h:_codecs_encode():_parser static _PyArg_Parser _parser +Modules/clinic/_cursesmodule.c.h:_curses_setupterm():_parser static _PyArg_Parser _parser +Modules/clinic/_datetimemodule.c.h:datetime_datetime_now():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_find():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_findall():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_findtext():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_get():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_getiterator():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_iter():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_iterfind():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_TreeBuilder___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_XMLParser___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h:EVP_new():_parser static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h:_hashlib_hmac_digest():_parser static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h:_hashlib_scrypt():_parser static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h:pbkdf2_hmac():_parser static _PyArg_Parser _parser +Modules/clinic/_lzmamodule.c.h:_lzma_LZMADecompressor___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_lzmamodule.c.h:_lzma_LZMADecompressor_decompress():_parser static _PyArg_Parser _parser +Modules/clinic/_opcode.c.h:_opcode_stack_effect():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_Pickler___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_Unpickler___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_dump():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_dumps():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_load():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_loads():_parser static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h:_queue_SimpleQueue_get():_parser static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h:_queue_SimpleQueue_put():_parser static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h:_queue_SimpleQueue_put_nowait():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Match_expand():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Match_groupdict():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Match_groups():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_findall():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_finditer():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_fullmatch():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_match():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_scanner():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_search():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_split():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_sub():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_subn():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_compile():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLContext__wrap_bio():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLContext__wrap_socket():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLContext_get_ca_certs():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLContext_load_cert_chain():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLContext_load_verify_locations():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLSocket_get_channel_binding():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl_enum_certificates():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl_enum_crls():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl_txt2obj():_parser static _PyArg_Parser _parser +Modules/clinic/_struct.c.h:Struct___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_struct.c.h:Struct_unpack_from():_parser static _PyArg_Parser _parser +Modules/clinic/_struct.c.h:unpack_from():_parser static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h:_winapi_ConnectNamedPipe():_parser static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h:_winapi_GetFileType():_parser static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h:_winapi_ReadFile():_parser static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h:_winapi_WriteFile():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_a2b_qp():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_b2a_base64():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_b2a_hex():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_b2a_qp():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_b2a_uu():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_hexlify():_parser static _PyArg_Parser _parser +Modules/clinic/cmathmodule.c.h:cmath_isclose():_parser static _PyArg_Parser _parser +Modules/clinic/gcmodule.c.h:gc_collect():_parser static _PyArg_Parser _parser +Modules/clinic/gcmodule.c.h:gc_get_objects():_parser static _PyArg_Parser _parser +Modules/clinic/grpmodule.c.h:grp_getgrgid():_parser static _PyArg_Parser _parser +Modules/clinic/grpmodule.c.h:grp_getgrnam():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_decode():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_hex():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_rsplit():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_split():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_splitlines():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_translate():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_decode():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_hex():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_rsplit():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_split():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_splitlines():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_translate():_parser static _PyArg_Parser _parser +Objects/clinic/codeobject.c.h:code_replace():_parser static _PyArg_Parser _parser +Objects/clinic/complexobject.c.h:complex_new():_parser static _PyArg_Parser _parser +Objects/clinic/descrobject.c.h:mappingproxy_new():_parser static _PyArg_Parser _parser +Objects/clinic/descrobject.c.h:property_init():_parser static _PyArg_Parser _parser +Objects/clinic/enumobject.c.h:enum_new():_parser static _PyArg_Parser _parser +Objects/clinic/funcobject.c.h:func_new():_parser static _PyArg_Parser _parser +Objects/clinic/listobject.c.h:list_sort():_parser static _PyArg_Parser _parser +Objects/clinic/longobject.c.h:int_from_bytes():_parser static _PyArg_Parser _parser +Objects/clinic/longobject.c.h:int_to_bytes():_parser static _PyArg_Parser _parser +Objects/clinic/longobject.c.h:long_new():_parser static _PyArg_Parser _parser +Objects/clinic/memoryobject.c.h:memoryview_hex():_parser static _PyArg_Parser _parser +Objects/clinic/moduleobject.c.h:module___init__():_parser static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h:OrderedDict_fromkeys():_parser static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h:OrderedDict_move_to_end():_parser static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h:OrderedDict_popitem():_parser static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h:OrderedDict_setdefault():_parser static _PyArg_Parser _parser +Objects/clinic/structseq.c.h:structseq_new():_parser static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h:unicode_encode():_parser static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h:unicode_expandtabs():_parser static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h:unicode_rsplit():_parser static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h:unicode_split():_parser static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h:unicode_splitlines():_parser static _PyArg_Parser _parser +Objects/stringlib/clinic/transmogrify.h.h:stringlib_expandtabs():_parser static _PyArg_Parser _parser +Python/bltinmodule.c:builtin_print():_parser static struct _PyArg_Parser _parser +Python/clinic/_warnings.c.h:warnings_warn():_parser static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h:builtin_compile():_parser static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h:builtin_round():_parser static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h:builtin_sum():_parser static _PyArg_Parser _parser +Python/clinic/import.c.h:_imp_source_hash():_parser static _PyArg_Parser _parser +Python/clinic/sysmodule.c.h:sys_addaudithook():_parser static _PyArg_Parser _parser +Python/clinic/sysmodule.c.h:sys_set_coroutine_origin_tracking_depth():_parser static _PyArg_Parser _parser +Python/clinic/traceback.c.h:tb_new():_parser static _PyArg_Parser _parser diff --git a/Tools/c-analyzer/c-globals.py b/Tools/c-analyzer/c-globals.py new file mode 100644 index 00000000..b36b7912 --- /dev/null +++ b/Tools/c-analyzer/c-globals.py @@ -0,0 +1,9 @@ +# This is a script equivalent of running "python -m test.test_c_globals.cg". + +from cpython.__main__ import parse_args, main + + +# This is effectively copied from cg/__main__.py: +if __name__ == '__main__': + cmd, cmdkwargs = parse_args() + main(cmd, cmdkwargs) diff --git a/Tools/c-analyzer/c_analyzer/__init__.py b/Tools/c-analyzer/c_analyzer/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Tools/c-analyzer/c_analyzer/common/__init__.py b/Tools/c-analyzer/c_analyzer/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Tools/c-analyzer/c_analyzer/common/files.py b/Tools/c-analyzer/c_analyzer/common/files.py new file mode 100644 index 00000000..f630afe6 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/common/files.py @@ -0,0 +1,122 @@ +import glob +import os +import os.path + +# XXX need tests: +# * walk_tree() +# * glob_tree() +# * iter_files_by_suffix() + + +C_SOURCE_SUFFIXES = ('.c', '.h') + + +def _walk_tree(root, *, + _walk=os.walk, + ): + # A wrapper around os.walk that resolves the filenames. + for parent, _, names in _walk(root): + for name in names: + yield os.path.join(parent, name) + + +def walk_tree(root, *, + suffix=None, + walk=_walk_tree, + ): + """Yield each file in the tree under the given directory name. + + If "suffix" is provided then only files with that suffix will + be included. + """ + if suffix and not isinstance(suffix, str): + raise ValueError('suffix must be a string') + + for filename in walk(root): + if suffix and not filename.endswith(suffix): + continue + yield filename + + +def glob_tree(root, *, + suffix=None, + _glob=glob.iglob, + _escape=glob.escape, + _join=os.path.join, + ): + """Yield each file in the tree under the given directory name. + + If "suffix" is provided then only files with that suffix will + be included. + """ + suffix = suffix or '' + if not isinstance(suffix, str): + raise ValueError('suffix must be a string') + + for filename in _glob(_join(_escape(root), f'*{suffix}')): + yield filename + for filename in _glob(_join(_escape(root), f'**/*{suffix}')): + yield filename + + +def iter_files(root, suffix=None, relparent=None, *, + get_files=os.walk, + _glob=glob_tree, + _walk=walk_tree, + ): + """Yield each file in the tree under the given directory name. + + If "root" is a non-string iterable then do the same for each of + those trees. + + If "suffix" is provided then only files with that suffix will + be included. + + if "relparent" is provided then it is used to resolve each + filename as a relative path. + """ + if not isinstance(root, str): + roots = root + for root in roots: + yield from iter_files(root, suffix, relparent, + get_files=get_files, + _glob=_glob, _walk=_walk) + return + + # Use the right "walk" function. + if get_files in (glob.glob, glob.iglob, glob_tree): + get_files = _glob + else: + _files = _walk_tree if get_files in (os.walk, walk_tree) else get_files + get_files = (lambda *a, **k: _walk(*a, walk=_files, **k)) + + # Handle a single suffix. + if suffix and not isinstance(suffix, str): + filenames = get_files(root) + suffix = tuple(suffix) + else: + filenames = get_files(root, suffix=suffix) + suffix = None + + for filename in filenames: + if suffix and not isinstance(suffix, str): # multiple suffixes + if not filename.endswith(suffix): + continue + if relparent: + filename = os.path.relpath(filename, relparent) + yield filename + + +def iter_files_by_suffix(root, suffixes, relparent=None, *, + walk=walk_tree, + _iter_files=iter_files, + ): + """Yield each file in the tree that has the given suffixes. + + Unlike iter_files(), the results are in the original suffix order. + """ + if isinstance(suffixes, str): + suffixes = [suffixes] + # XXX Ignore repeated suffixes? + for suffix in suffixes: + yield from _iter_files(root, suffix, relparent) diff --git a/Tools/c-analyzer/c_analyzer/common/info.py b/Tools/c-analyzer/c_analyzer/common/info.py new file mode 100644 index 00000000..3f3f8c5b --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/common/info.py @@ -0,0 +1,138 @@ +from collections import namedtuple +import re + +from .util import classonly, _NTBase + +# XXX need tests: +# * ID.match() + + +UNKNOWN = '???' + +NAME_RE = re.compile(r'^([a-zA-Z]|_\w*[a-zA-Z]\w*|[a-zA-Z]\w*)$') + + +class ID(_NTBase, namedtuple('ID', 'filename funcname name')): + """A unique ID for a single symbol or declaration.""" + + __slots__ = () + # XXX Add optional conditions (tuple of strings) field. + #conditions = Slot() + + @classonly + def from_raw(cls, raw): + if not raw: + return None + if isinstance(raw, str): + return cls(None, None, raw) + try: + name, = raw + filename = None + except ValueError: + try: + filename, name = raw + except ValueError: + return super().from_raw(raw) + return cls(filename, None, name) + + def __new__(cls, filename, funcname, name): + self = super().__new__( + cls, + filename=str(filename) if filename else None, + funcname=str(funcname) if funcname else None, + name=str(name) if name else None, + ) + #cls.conditions.set(self, tuple(str(s) if s else None + # for s in conditions or ())) + return self + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + if not self.name: + raise TypeError('missing name') + else: + if not NAME_RE.match(self.name): + raise ValueError( + f'name must be an identifier, got {self.name!r}') + + # Symbols from a binary might not have filename/funcname info. + + if self.funcname: + if not self.filename: + raise TypeError('missing filename') + if not NAME_RE.match(self.funcname) and self.funcname != UNKNOWN: + raise ValueError( + f'name must be an identifier, got {self.funcname!r}') + + # XXX Require the filename (at least UNKONWN)? + # XXX Check the filename? + + @property + def islocal(self): + return self.funcname is not None + + def match(self, other, *, + match_files=(lambda f1, f2: f1 == f2), + ): + """Return True if the two match. + + At least one of the two must be completely valid (no UNKNOWN + anywhere). Otherwise False is returned. The remaining one + *may* have UNKNOWN for both funcname and filename. It must + have a valid name though. + + The caller is responsible for knowing which of the two is valid + (and which to use if both are valid). + """ + # First check the name. + if self.name is None: + return False + if other.name != self.name: + return False + + # Then check the filename. + if self.filename is None: + return False + if other.filename is None: + return False + if self.filename == UNKNOWN: + # "other" must be the valid one. + if other.funcname == UNKNOWN: + return False + elif self.funcname != UNKNOWN: + # XXX Try matching funcname even though we don't + # know the filename? + raise NotImplementedError + else: + return True + elif other.filename == UNKNOWN: + # "self" must be the valid one. + if self.funcname == UNKNOWN: + return False + elif other.funcname != UNKNOWN: + # XXX Try matching funcname even though we don't + # know the filename? + raise NotImplementedError + else: + return True + elif not match_files(self.filename, other.filename): + return False + + # Finally, check the funcname. + if self.funcname == UNKNOWN: + # "other" must be the valid one. + if other.funcname == UNKNOWN: + return False + else: + return other.funcname is not None + elif other.funcname == UNKNOWN: + # "self" must be the valid one. + if self.funcname == UNKNOWN: + return False + else: + return self.funcname is not None + elif self.funcname == other.funcname: + # Both are valid. + return True + + return False diff --git a/Tools/c-analyzer/c_analyzer/common/show.py b/Tools/c-analyzer/c_analyzer/common/show.py new file mode 100644 index 00000000..5f3cb1c2 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/common/show.py @@ -0,0 +1,11 @@ + +def basic(variables, *, + _print=print): + """Print each row simply.""" + for var in variables: + if var.funcname: + line = f'{var.filename}:{var.funcname}():{var.name}' + else: + line = f'{var.filename}:{var.name}' + line = f'{line:<64} {var.vartype}' + _print(line) diff --git a/Tools/c-analyzer/c_analyzer/common/util.py b/Tools/c-analyzer/c_analyzer/common/util.py new file mode 100644 index 00000000..43d0bb6e --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/common/util.py @@ -0,0 +1,243 @@ +import csv +import subprocess + + +_NOT_SET = object() + + +def run_cmd(argv, **kwargs): + proc = subprocess.run( + argv, + #capture_output=True, + #stderr=subprocess.STDOUT, + stdout=subprocess.PIPE, + text=True, + check=True, + **kwargs + ) + return proc.stdout + + +def read_tsv(infile, header, *, + _open=open, + _get_reader=csv.reader, + ): + """Yield each row of the given TSV (tab-separated) file.""" + if isinstance(infile, str): + with _open(infile, newline='') as infile: + yield from read_tsv(infile, header, + _open=_open, + _get_reader=_get_reader, + ) + return + lines = iter(infile) + + # Validate the header. + try: + actualheader = next(lines).strip() + except StopIteration: + actualheader = '' + if actualheader != header: + raise ValueError(f'bad header {actualheader!r}') + + for row in _get_reader(lines, delimiter='\t'): + yield tuple(v.strip() for v in row) + + +def write_tsv(outfile, header, rows, *, + _open=open, + _get_writer=csv.writer, + ): + """Write each of the rows to the given TSV (tab-separated) file.""" + if isinstance(outfile, str): + with _open(outfile, 'w', newline='') as outfile: + return write_tsv(outfile, header, rows, + _open=_open, + _get_writer=_get_writer, + ) + + if isinstance(header, str): + header = header.split('\t') + writer = _get_writer(outfile, delimiter='\t') + writer.writerow(header) + for row in rows: + writer.writerow('' if v is None else str(v) + for v in row) + + +class Slot: + """A descriptor that provides a slot. + + This is useful for types that can't have slots via __slots__, + e.g. tuple subclasses. + """ + + __slots__ = ('initial', 'default', 'readonly', 'instances', 'name') + + def __init__(self, initial=_NOT_SET, *, + default=_NOT_SET, + readonly=False, + ): + self.initial = initial + self.default = default + self.readonly = readonly + + # The instance cache is not inherently tied to the normal + # lifetime of the instances. So must do something in order to + # avoid keeping the instances alive by holding a reference here. + # Ideally we would use weakref.WeakValueDictionary to do this. + # However, most builtin types do not support weakrefs. So + # instead we monkey-patch __del__ on the attached class to clear + # the instance. + self.instances = {} + self.name = None + + def __set_name__(self, cls, name): + if self.name is not None: + raise TypeError('already used') + self.name = name + try: + slotnames = cls.__slot_names__ + except AttributeError: + slotnames = cls.__slot_names__ = [] + slotnames.append(name) + self._ensure___del__(cls, slotnames) + + def __get__(self, obj, cls): + if obj is None: # called on the class + return self + try: + value = self.instances[id(obj)] + except KeyError: + if self.initial is _NOT_SET: + value = self.default + else: + value = self.initial + self.instances[id(obj)] = value + if value is _NOT_SET: + raise AttributeError(self.name) + # XXX Optionally make a copy? + return value + + def __set__(self, obj, value): + if self.readonly: + raise AttributeError(f'{self.name} is readonly') + # XXX Optionally coerce? + self.instances[id(obj)] = value + + def __delete__(self, obj): + if self.readonly: + raise AttributeError(f'{self.name} is readonly') + self.instances[id(obj)] = self.default # XXX refleak? + + def _ensure___del__(self, cls, slotnames): # See the comment in __init__(). + try: + old___del__ = cls.__del__ + except AttributeError: + old___del__ = (lambda s: None) + else: + if getattr(old___del__, '_slotted', False): + return + + def __del__(_self): + for name in slotnames: + delattr(_self, name) + old___del__(_self) + __del__._slotted = True + cls.__del__ = __del__ + + def set(self, obj, value): + """Update the cached value for an object. + + This works even if the descriptor is read-only. This is + particularly useful when initializing the object (e.g. in + its __new__ or __init__). + """ + self.instances[id(obj)] = value + + +class classonly: + """A non-data descriptor that makes a value only visible on the class. + + This is like the "classmethod" builtin, but does not show up on + instances of the class. It may be used as a decorator. + """ + + def __init__(self, value): + self.value = value + self.getter = classmethod(value).__get__ + self.name = None + + def __set_name__(self, cls, name): + if self.name is not None: + raise TypeError('already used') + self.name = name + + def __get__(self, obj, cls): + if obj is not None: + raise AttributeError(self.name) + # called on the class + return self.getter(None, cls) + + +class _NTBase: + + __slots__ = () + + @classonly + def from_raw(cls, raw): + if not raw: + return None + elif isinstance(raw, cls): + return raw + elif isinstance(raw, str): + return cls.from_string(raw) + else: + if hasattr(raw, 'items'): + return cls(**raw) + try: + args = tuple(raw) + except TypeError: + pass + else: + return cls(*args) + raise NotImplementedError + + @classonly + def from_string(cls, value): + """Return a new instance based on the given string.""" + raise NotImplementedError + + @classmethod + def _make(cls, iterable): # The default _make() is not subclass-friendly. + return cls.__new__(cls, *iterable) + + # XXX Always validate? + #def __init__(self, *args, **kwargs): + # self.validate() + + # XXX The default __repr__() is not subclass-friendly (where the name changes). + #def __repr__(self): + # _, _, sig = super().__repr__().partition('(') + # return f'{self.__class__.__name__}({sig}' + + # To make sorting work with None: + def __lt__(self, other): + try: + return super().__lt__(other) + except TypeError: + if None in self: + return True + elif None in other: + return False + else: + raise + + def validate(self): + return + + # XXX Always validate? + #def _replace(self, **kwargs): + # obj = super()._replace(**kwargs) + # obj.validate() + # return obj diff --git a/Tools/c-analyzer/c_analyzer/parser/__init__.py b/Tools/c-analyzer/c_analyzer/parser/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Tools/c-analyzer/c_analyzer/parser/declarations.py b/Tools/c-analyzer/c_analyzer/parser/declarations.py new file mode 100644 index 00000000..f37072cc --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/parser/declarations.py @@ -0,0 +1,339 @@ +import re +import shlex +import subprocess + +from ..common.info import UNKNOWN + +from . import source + + +IDENTIFIER = r'(?:[a-zA-z]|_+[a-zA-Z0-9]\w*)' + +TYPE_QUAL = r'(?:const|volatile)' + +VAR_TYPE_SPEC = r'''(?: + void | + (?: + (?:(?:un)?signed\s+)? + (?: + char | + short | + int | + long | + long\s+int | + long\s+long + ) | + ) | + float | + double | + {IDENTIFIER} | + (?:struct|union)\s+{IDENTIFIER} + )''' + +POINTER = rf'''(?: + (?:\s+const)?\s*[*] + )''' + +#STRUCT = r'''(?: +# (?:struct|(struct\s+%s))\s*[{] +# [^}]* +# [}] +# )''' % (IDENTIFIER) +#UNION = r'''(?: +# (?:union|(union\s+%s))\s*[{] +# [^}]* +# [}] +# )''' % (IDENTIFIER) +#DECL_SPEC = rf'''(?: +# ({VAR_TYPE_SPEC}) | +# ({STRUCT}) | +# ({UNION}) +# )''' + +FUNC_START = rf'''(?: + (?: + (?: + extern | + static | + static\s+inline + )\s+ + )? + #(?:const\s+)? + {VAR_TYPE_SPEC} + )''' +#GLOBAL_VAR_START = rf'''(?: +# (?: +# (?: +# extern | +# static +# )\s+ +# )? +# (?: +# {TYPE_QUAL} +# (?:\s+{TYPE_QUAL})? +# )?\s+ +# {VAR_TYPE_SPEC} +# )''' +GLOBAL_DECL_START_RE = re.compile(rf''' + ^ + (?: + ({FUNC_START}) + ) + ''', re.VERBOSE) + +LOCAL_VAR_START = rf'''(?: + (?: + (?: + register | + static + )\s+ + )? + (?: + (?: + {TYPE_QUAL} + (?:\s+{TYPE_QUAL})? + )\s+ + )? + {VAR_TYPE_SPEC} + {POINTER}? + )''' +LOCAL_STMT_START_RE = re.compile(rf''' + ^ + (?: + ({LOCAL_VAR_START}) + ) + ''', re.VERBOSE) + + +def iter_global_declarations(lines): + """Yield (decl, body) for each global declaration in the given lines. + + For function definitions the header is reduced to one line and + the body is provided as-is. For other compound declarations (e.g. + struct) the entire declaration is reduced to one line and "body" + is None. Likewise for simple declarations (e.g. variables). + + Declarations inside function bodies are ignored, though their text + is provided in the function body. + """ + # XXX Bail out upon bogus syntax. + lines = source.iter_clean_lines(lines) + for line in lines: + if not GLOBAL_DECL_START_RE.match(line): + continue + # We only need functions here, since we only need locals for now. + if line.endswith(';'): + continue + if line.endswith('{') and '(' not in line: + continue + + # Capture the function. + # (assume no func is a one-liner) + decl = line + while '{' not in line: # assume no inline structs, etc. + try: + line = next(lines) + except StopIteration: + return + decl += ' ' + line + + body, end = _extract_block(lines) + if end is None: + return + assert end == '}' + yield (f'{decl}\n{body}\n{end}', body) + + +def iter_local_statements(lines): + """Yield (lines, blocks) for each statement in the given lines. + + For simple statements, "blocks" is None and the statement is reduced + to a single line. For compound statements, "blocks" is a pair of + (header, body) for each block in the statement. The headers are + reduced to a single line each, but the bpdies are provided as-is. + """ + # XXX Bail out upon bogus syntax. + lines = source.iter_clean_lines(lines) + for line in lines: + if not LOCAL_STMT_START_RE.match(line): + continue + + stmt = line + blocks = None + if not line.endswith(';'): + # XXX Support compound & multiline simple statements. + #blocks = [] + continue + + yield (stmt, blocks) + + +def _extract_block(lines): + end = None + depth = 1 + body = [] + for line in lines: + depth += line.count('{') - line.count('}') + if depth == 0: + end = line + break + body.append(line) + return '\n'.join(body), end + + +def parse_func(stmt, body): + """Return (name, signature) for the given function definition.""" + header, _, end = stmt.partition(body) + assert end.strip() == '}' + assert header.strip().endswith('{') + header, _, _= header.rpartition('{') + + signature = ' '.join(header.strip().splitlines()) + + _, _, name = signature.split('(')[0].strip().rpartition(' ') + assert name + + return name, signature + + +#TYPE_SPEC = rf'''(?: +# )''' +#VAR_DECLARATOR = rf'''(?: +# )''' +#VAR_DECL = rf'''(?: +# {TYPE_SPEC}+ +# {VAR_DECLARATOR} +# \s* +# )''' +#VAR_DECLARATION = rf'''(?: +# {VAR_DECL} +# (?: = [^=] [^;]* )? +# ; +# )''' +# +# +#def parse_variable(decl, *, inFunc=False): +# """Return [(name, storage, vartype)] for the given variable declaration.""" +# ... + + +def _parse_var(stmt): + """Return (name, vartype) for the given variable declaration.""" + stmt = stmt.rstrip(';') + m = LOCAL_STMT_START_RE.match(stmt) + assert m + vartype = m.group(0) + name = stmt[len(vartype):].partition('=')[0].strip() + + if name.startswith('('): + name, _, after = name[1:].partition(')') + assert after + name = name.replace('*', '* ') + inside, _, name = name.strip().rpartition(' ') + vartype = f'{vartype} ({inside.strip()}){after}' + else: + name = name.replace('*', '* ') + before, _, name = name.rpartition(' ') + vartype = f'{vartype} {before}' + + vartype = vartype.strip() + while ' ' in vartype: + vartype = vartype.replace(' ', ' ') + + return name, vartype + + +def extract_storage(decl, *, infunc=None): + """Return (storage, vartype) based on the given declaration. + + The default storage is "implicit" (or "local" if infunc is True). + """ + if decl == UNKNOWN: + return decl + if decl.startswith('static '): + return 'static' + #return 'static', decl.partition(' ')[2].strip() + elif decl.startswith('extern '): + return 'extern' + #return 'extern', decl.partition(' ')[2].strip() + elif re.match('.*\b(static|extern)\b', decl): + raise NotImplementedError + elif infunc: + return 'local' + else: + return 'implicit' + + +def parse_compound(stmt, blocks): + """Return (headers, bodies) for the given compound statement.""" + # XXX Identify declarations inside compound statements + # (if/switch/for/while). + raise NotImplementedError + + +def iter_variables(filename, *, + preprocessed=False, + _iter_source_lines=source.iter_lines, + _iter_global=iter_global_declarations, + _iter_local=iter_local_statements, + _parse_func=parse_func, + _parse_var=_parse_var, + _parse_compound=parse_compound, + ): + """Yield (funcname, name, vartype) for every variable in the given file.""" + if preprocessed: + raise NotImplementedError + lines = _iter_source_lines(filename) + for stmt, body in _iter_global(lines): + # At the file top-level we only have to worry about vars & funcs. + if not body: + name, vartype = _parse_var(stmt) + if name: + yield (None, name, vartype) + else: + funcname, _ = _parse_func(stmt, body) + localvars = _iter_locals(body, + _iter_statements=_iter_local, + _parse_var=_parse_var, + _parse_compound=_parse_compound, + ) + for name, vartype in localvars: + yield (funcname, name, vartype) + + +def _iter_locals(lines, *, + _iter_statements=iter_local_statements, + _parse_var=_parse_var, + _parse_compound=parse_compound, + ): + compound = [lines] + while compound: + body = compound.pop(0) + bodylines = body.splitlines() + for stmt, blocks in _iter_statements(bodylines): + if not blocks: + name, vartype = _parse_var(stmt) + if name: + yield (name, vartype) + else: + headers, bodies = _parse_compound(stmt, blocks) + for header in headers: + for line in header: + name, vartype = _parse_var(line) + if name: + yield (name, vartype) + compound.extend(bodies) + + +def iter_all(filename, *, + preprocessed=False, + ): + """Yield a Declaration for each one found. + + If there are duplicates, due to preprocessor conditionals, then + they are checked to make sure they are the same. + """ + # XXX For the moment we cheat. + for funcname, name, decl in iter_variables(filename, + preprocessed=preprocessed): + yield 'variable', funcname, name, decl diff --git a/Tools/c-analyzer/c_analyzer/parser/find.py b/Tools/c-analyzer/c_analyzer/parser/find.py new file mode 100644 index 00000000..3860d3d4 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/parser/find.py @@ -0,0 +1,107 @@ +from ..common.info import UNKNOWN, ID + +from . import declarations + +# XXX need tests: +# * variables +# * variable +# * variable_from_id + + +def _iter_vars(filenames, preprocessed, *, + handle_id=None, + _iter_decls=declarations.iter_all, + ): + if handle_id is None: + handle_id = ID + + for filename in filenames or (): + for kind, funcname, name, decl in _iter_decls(filename, + preprocessed=preprocessed, + ): + if kind != 'variable': + continue + varid = handle_id(filename, funcname, name) + yield varid, decl + + +# XXX Add a "handle_var" arg like we did for get_resolver()? + +def variables(*filenames, + perfilecache=None, + preprocessed=False, + known=None, # for types + handle_id=None, + _iter_vars=_iter_vars, + ): + """Yield (varid, decl) for each variable found in the given files. + + If "preprocessed" is provided (and not False/None) then it is used + to decide which tool to use to parse the source code after it runs + through the C preprocessor. Otherwise the raw + """ + if len(filenames) == 1 and not (filenames[0], str): + filenames, = filenames + + if perfilecache is None: + yield from _iter_vars(filenames, preprocessed) + else: + # XXX Cache per-file variables (e.g. `{filename: [(varid, decl)]}`). + raise NotImplementedError + + +def variable(name, filenames, *, + local=False, + perfilecache=None, + preprocessed=False, + handle_id=None, + _iter_vars=variables, + ): + """Return (varid, decl) for the first found variable that matches. + + If "local" is True then the first matching local variable in the + file will always be returned. To avoid that, pass perfilecache and + pop each variable from the cache after using it. + """ + for varid, decl in _iter_vars(filenames, + perfilecache=perfilecache, + preprocessed=preprocessed, + ): + if varid.name != name: + continue + if local: + if varid.funcname: + if varid.funcname == UNKNOWN: + raise NotImplementedError + return varid, decl + elif not varid.funcname: + return varid, decl + else: + return None, None # No matching variable was found. + + +def variable_from_id(id, filenames, *, + perfilecache=None, + preprocessed=False, + handle_id=None, + _get_var=variable, + ): + """Return (varid, decl) for the first found variable that matches.""" + local = False + if isinstance(id, str): + name = id + else: + if id.funcname == UNKNOWN: + local = True + elif id.funcname: + raise NotImplementedError + + name = id.name + if id.filename and id.filename != UNKNOWN: + filenames = [id.filename] + return _get_var(name, filenames, + local=local, + perfilecache=perfilecache, + preprocessed=preprocessed, + handle_id=handle_id, + ) diff --git a/Tools/c-analyzer/c_analyzer/parser/naive.py b/Tools/c-analyzer/c_analyzer/parser/naive.py new file mode 100644 index 00000000..4a4822d8 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/parser/naive.py @@ -0,0 +1,179 @@ +import re + +from ..common.info import UNKNOWN, ID + +from .preprocessor import _iter_clean_lines + + +_NOT_SET = object() + + +def get_srclines(filename, *, + cache=None, + _open=open, + _iter_lines=_iter_clean_lines, + ): + """Return the file's lines as a list. + + Each line will have trailing whitespace removed (including newline). + + If a cache is given the it is used. + """ + if cache is not None: + try: + return cache[filename] + except KeyError: + pass + + with _open(filename) as srcfile: + srclines = [line + for _, line in _iter_lines(srcfile) + if not line.startswith('#')] + for i, line in enumerate(srclines): + srclines[i] = line.rstrip() + + if cache is not None: + cache[filename] = srclines + return srclines + + +def parse_variable_declaration(srcline): + """Return (name, decl) for the given declaration line.""" + # XXX possible false negatives... + decl, sep, _ = srcline.partition('=') + if not sep: + if not srcline.endswith(';'): + return None, None + decl = decl.strip(';') + decl = decl.strip() + m = re.match(r'.*\b(\w+)\s*(?:\[[^\]]*\])?$', decl) + if not m: + return None, None + name = m.group(1) + return name, decl + + +def parse_variable(srcline, funcname=None): + """Return (varid, decl) for the variable declared on the line (or None).""" + line = srcline.strip() + + # XXX Handle more than just static variables. + if line.startswith('static '): + if '(' in line and '[' not in line: + # a function + return None, None + return parse_variable_declaration(line) + else: + return None, None + + +def iter_variables(filename, *, + srccache=None, + parse_variable=None, + _get_srclines=get_srclines, + _default_parse_variable=parse_variable, + ): + """Yield (varid, decl) for each variable in the given source file.""" + if parse_variable is None: + parse_variable = _default_parse_variable + + indent = '' + prev = '' + funcname = None + for line in _get_srclines(filename, cache=srccache): + # remember current funcname + if funcname: + if line == indent + '}': + funcname = None + continue + else: + if '(' in prev and line == indent + '{': + if not prev.startswith('__attribute__'): + funcname = prev.split('(')[0].split()[-1] + prev = '' + continue + indent = line[:-len(line.lstrip())] + prev = line + + info = parse_variable(line, funcname) + if isinstance(info, list): + for name, _funcname, decl in info: + yield ID(filename, _funcname, name), decl + continue + name, decl = info + + if name is None: + continue + yield ID(filename, funcname, name), decl + + +def _match_varid(variable, name, funcname, ignored=None): + if ignored and variable in ignored: + return False + + if variable.name != name: + return False + + if funcname == UNKNOWN: + if not variable.funcname: + return False + elif variable.funcname != funcname: + return False + + return True + + +def find_variable(filename, funcname, name, *, + ignored=None, + srccache=None, # {filename: lines} + parse_variable=None, + _iter_variables=iter_variables, + ): + """Return the matching variable. + + Return None if the variable is not found. + """ + for varid, decl in _iter_variables(filename, + srccache=srccache, + parse_variable=parse_variable, + ): + if _match_varid(varid, name, funcname, ignored): + return varid, decl + else: + return None + + +def find_variables(varids, filenames=None, *, + srccache=_NOT_SET, + parse_variable=None, + _find_symbol=find_variable, + ): + """Yield (varid, decl) for each ID. + + If the variable is not found then its decl will be UNKNOWN. That + way there will be one resulting variable per given ID. + """ + if srccache is _NOT_SET: + srccache = {} + + used = set() + for varid in varids: + if varid.filename and varid.filename != UNKNOWN: + srcfiles = [varid.filename] + else: + if not filenames: + yield varid, UNKNOWN + continue + srcfiles = filenames + for filename in srcfiles: + varid, decl = _find_varid(filename, varid.funcname, varid.name, + ignored=used, + srccache=srccache, + parse_variable=parse_variable, + ) + if varid: + yield varid, decl + used.add(varid) + break + else: + yield varid, UNKNOWN diff --git a/Tools/c-analyzer/c_analyzer/parser/preprocessor.py b/Tools/c-analyzer/c_analyzer/parser/preprocessor.py new file mode 100644 index 00000000..41f306e5 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/parser/preprocessor.py @@ -0,0 +1,511 @@ +from collections import namedtuple +import shlex +import os +import re + +from ..common import util, info + + +CONTINUATION = '\\' + os.linesep + +IDENTIFIER = r'(?:\w*[a-zA-Z]\w*)' +IDENTIFIER_RE = re.compile('^' + IDENTIFIER + '$') + + +def _coerce_str(value): + if not value: + return '' + return str(value).strip() + + +############################# +# directives + +DIRECTIVE_START = r''' + (?: + ^ \s* + [#] \s* + )''' +DIRECTIVE_TEXT = r''' + (?: + (?: \s+ ( .*\S ) )? + \s* $ + )''' +DIRECTIVE = rf''' + (?: + {DIRECTIVE_START} + ( + include | + error | warning | + pragma | + define | undef | + if | ifdef | ifndef | elseif | else | endif | + __FILE__ | __LINE__ | __DATE __ | __TIME__ | __TIMESTAMP__ + ) + {DIRECTIVE_TEXT} + )''' +# (?: +# [^\\\n] | +# \\ [^\n] | +# \\ \n +# )+ +# ) \n +# )''' +DIRECTIVE_RE = re.compile(DIRECTIVE, re.VERBOSE) + +DEFINE = rf''' + (?: + {DIRECTIVE_START} define \s+ + (?: + ( \w*[a-zA-Z]\w* ) + (?: \s* [(] ([^)]*) [)] )? + ) + {DIRECTIVE_TEXT} + )''' +DEFINE_RE = re.compile(DEFINE, re.VERBOSE) + + +def parse_directive(line): + """Return the appropriate directive for the given line.""" + line = line.strip() + if line.startswith('#'): + line = line[1:].lstrip() + line = '#' + line + directive = line + #directive = '#' + line + while ' ' in directive: + directive = directive.replace(' ', ' ') + return _parse_directive(directive) + + +def _parse_directive(line): + m = DEFINE_RE.match(line) + if m: + name, args, text = m.groups() + if args: + args = [a.strip() for a in args.split(',')] + return Macro(name, args, text) + else: + return Constant(name, text) + + m = DIRECTIVE_RE.match(line) + if not m: + raise ValueError(f'unsupported directive {line!r}') + kind, text = m.groups() + if not text: + if kind not in ('else', 'endif'): + raise ValueError(f'missing text in directive {line!r}') + elif kind in ('else', 'endif', 'define'): + raise ValueError(f'unexpected text in directive {line!r}') + if kind == 'include': + directive = Include(text) + elif kind in IfDirective.KINDS: + directive = IfDirective(kind, text) + else: + directive = OtherDirective(kind, text) + directive.validate() + return directive + + +class PreprocessorDirective(util._NTBase): + """The base class for directives.""" + + __slots__ = () + + KINDS = frozenset([ + 'include', + 'pragma', + 'error', 'warning', + 'define', 'undef', + 'if', 'ifdef', 'ifndef', 'elseif', 'else', 'endif', + '__FILE__', '__DATE__', '__LINE__', '__TIME__', '__TIMESTAMP__', + ]) + + @property + def text(self): + return ' '.join(v for v in self[1:] if v and v.strip()) or None + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if not self.kind: + raise TypeError('missing kind') + elif self.kind not in self.KINDS: + raise ValueError + + # text can be anything, including None. + + +class Constant(PreprocessorDirective, + namedtuple('Constant', 'kind name value')): + """A single "constant" directive ("define").""" + + __slots__ = () + + def __new__(cls, name, value=None): + self = super().__new__( + cls, + 'define', + name=_coerce_str(name) or None, + value=_coerce_str(value) or None, + ) + return self + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if not self.name: + raise TypeError('missing name') + elif not IDENTIFIER_RE.match(self.name): + raise ValueError(f'name must be identifier, got {self.name!r}') + + # value can be anything, including None + + +class Macro(PreprocessorDirective, + namedtuple('Macro', 'kind name args body')): + """A single "macro" directive ("define").""" + + __slots__ = () + + def __new__(cls, name, args, body=None): + # "args" must be a string or an iterable of strings (or "empty"). + if isinstance(args, str): + args = [v.strip() for v in args.split(',')] + if args: + args = tuple(_coerce_str(a) or None for a in args) + self = super().__new__( + cls, + kind='define', + name=_coerce_str(name) or None, + args=args if args else (), + body=_coerce_str(body) or None, + ) + return self + + @property + def text(self): + if self.body: + return f'{self.name}({", ".join(self.args)}) {self.body}' + else: + return f'{self.name}({", ".join(self.args)})' + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if not self.name: + raise TypeError('missing name') + elif not IDENTIFIER_RE.match(self.name): + raise ValueError(f'name must be identifier, got {self.name!r}') + + for arg in self.args: + if not arg: + raise ValueError(f'missing arg in {self.args}') + elif not IDENTIFIER_RE.match(arg): + raise ValueError(f'arg must be identifier, got {arg!r}') + + # body can be anything, including None + + +class IfDirective(PreprocessorDirective, + namedtuple('IfDirective', 'kind condition')): + """A single conditional directive (e.g. "if", "ifdef"). + + This only includes directives that actually provide conditions. The + related directives "else" and "endif" are covered by OtherDirective + instead. + """ + + __slots__ = () + + KINDS = frozenset([ + 'if', + 'ifdef', + 'ifndef', + 'elseif', + ]) + + @classmethod + def _condition_from_raw(cls, raw, kind): + #return Condition.from_raw(raw, _kind=kind) + condition = _coerce_str(raw) + if not condition: + return None + + if kind == 'ifdef': + condition = f'defined({condition})' + elif kind == 'ifndef': + condition = f'! defined({condition})' + + return condition + + def __new__(cls, kind, condition): + kind = _coerce_str(kind) + self = super().__new__( + cls, + kind=kind or None, + condition=cls._condition_from_raw(condition, kind), + ) + return self + + @property + def text(self): + if self.kind == 'ifdef': + return self.condition[8:-1] # strip "defined(" + elif self.kind == 'ifndef': + return self.condition[10:-1] # strip "! defined(" + else: + return self.condition + #return str(self.condition) + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if not self.condition: + raise TypeError('missing condition') + #else: + # for cond in self.condition: + # if not cond: + # raise ValueError(f'missing condition in {self.condition}') + # cond.validate() + # if self.kind in ('ifdef', 'ifndef'): + # if len(self.condition) != 1: + # raise ValueError('too many condition') + # if self.kind == 'ifdef': + # if not self.condition[0].startswith('defined '): + # raise ValueError('bad condition') + # else: + # if not self.condition[0].startswith('! defined '): + # raise ValueError('bad condition') + + +class Include(PreprocessorDirective, + namedtuple('Include', 'kind file')): + """A single "include" directive. + + Supported "file" values are either follow the bracket style + () or double quotes ("spam.h"). + """ + + __slots__ = () + + def __new__(cls, file): + self = super().__new__( + cls, + kind='include', + file=_coerce_str(file) or None, + ) + return self + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if not self.file: + raise TypeError('missing file') + + +class OtherDirective(PreprocessorDirective, + namedtuple('OtherDirective', 'kind text')): + """A single directive not covered by another class. + + This includes the "else", "endif", and "undef" directives, which are + otherwise inherently related to the directives covered by the + Constant, Macro, and IfCondition classes. + + Note that all directives must have a text value, except for "else" + and "endif" (which must have no text). + """ + + __slots__ = () + + KINDS = PreprocessorDirective.KINDS - {'include', 'define'} - IfDirective.KINDS + + def __new__(cls, kind, text): + self = super().__new__( + cls, + kind=_coerce_str(kind) or None, + text=_coerce_str(text) or None, + ) + return self + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if self.text: + if self.kind in ('else', 'endif'): + raise ValueError('unexpected text in directive') + elif self.kind not in ('else', 'endif'): + raise TypeError('missing text') + + +############################# +# iterating lines + +def _recompute_conditions(directive, ifstack): + if directive.kind in ('if', 'ifdef', 'ifndef'): + ifstack.append( + ([], directive.condition)) + elif directive.kind == 'elseif': + if ifstack: + negated, active = ifstack.pop() + if active: + negated.append(active) + else: + negated = [] + ifstack.append( + (negated, directive.condition)) + elif directive.kind == 'else': + if ifstack: + negated, active = ifstack.pop() + if active: + negated.append(active) + ifstack.append( + (negated, None)) + elif directive.kind == 'endif': + if ifstack: + ifstack.pop() + + conditions = [] + for negated, active in ifstack: + for condition in negated: + conditions.append(f'! ({condition})') + if active: + conditions.append(active) + return tuple(conditions) + + +def _iter_clean_lines(lines): + lines = iter(enumerate(lines, 1)) + for lno, line in lines: + # Handle line continuations. + while line.endswith(CONTINUATION): + try: + lno, _line = next(lines) + except StopIteration: + break + line = line[:-len(CONTINUATION)] + ' ' + _line + + # Deal with comments. + after = line + line = '' + while True: + # Look for a comment. + before, begin, remainder = after.partition('/*') + if '//' in before: + before, _, _ = before.partition('//') + line += before + ' ' # per the C99 spec + break + line += before + if not begin: + break + line += ' ' # per the C99 spec + + # Go until we find the end of the comment. + _, end, after = remainder.partition('*/') + while not end: + try: + lno, remainder = next(lines) + except StopIteration: + raise Exception('unterminated comment') + _, end, after = remainder.partition('*/') + + yield lno, line + + +def iter_lines(lines, *, + _iter_clean_lines=_iter_clean_lines, + _parse_directive=_parse_directive, + _recompute_conditions=_recompute_conditions, + ): + """Yield (lno, line, directive, active conditions) for each given line. + + This is effectively a subset of the operations taking place in + translation phases 2-4 from the C99 spec (ISO/IEC 9899:TC2); see + section 5.1.1.2. Line continuations are removed and comments + replaced with a single space. (In both cases "lno" will be the last + line involved.) Otherwise each line is returned as-is. + + "lno" is the (1-indexed) line number for the line. + + "directive" will be a PreprocessorDirective or None, depending on + whether or not there is a directive on the line. + + "active conditions" is the set of preprocessor conditions (e.g. + "defined()") under which the current line of code will be included + in compilation. That set is derived from every conditional + directive block (e.g. "if defined()", "ifdef", "else") containing + that line. That includes nested directives. Note that the + current line does not affect the active conditions for iteself. + It only impacts subsequent lines. That applies to directives + that close blocks (e.g. "endif") just as much as conditional + directvies. Also note that "else" and "elseif" directives + update the active conditions (for later lines), rather than + adding to them. + """ + ifstack = [] + conditions = () + for lno, line in _iter_clean_lines(lines): + stripped = line.strip() + if not stripped.startswith('#'): + yield lno, line, None, conditions + continue + + directive = '#' + stripped[1:].lstrip() + while ' ' in directive: + directive = directive.replace(' ', ' ') + directive = _parse_directive(directive) + yield lno, line, directive, conditions + + if directive.kind in ('else', 'endif'): + conditions = _recompute_conditions(directive, ifstack) + elif isinstance(directive, IfDirective): + conditions = _recompute_conditions(directive, ifstack) + + +############################# +# running (platform-specific?) + +def _gcc(filename, *, + _get_argv=(lambda: _get_gcc_argv()), + _run=util.run_cmd, + ): + argv = _get_argv() + argv.extend([ + '-E', filename, + ]) + output = _run(argv) + return output + + +def _get_gcc_argv(*, + _open=open, + _run=util.run_cmd, + ): + with _open('/tmp/print.mk', 'w') as tmpfile: + tmpfile.write('print-%:\n') + #tmpfile.write('\t@echo $* = $($*)\n') + tmpfile.write('\t@echo $($*)\n') + argv = ['/usr/bin/make', + '-f', 'Makefile', + '-f', '/tmp/print.mk', + 'print-CC', + 'print-PY_CORE_CFLAGS', + ] + output = _run(argv) + gcc, cflags = output.strip().splitlines() + argv = shlex.split(gcc.strip()) + cflags = shlex.split(cflags.strip()) + return argv + cflags + + +def run(filename, *, + _gcc=_gcc, + ): + """Return the text of the given file after running the preprocessor.""" + return _gcc(filename) diff --git a/Tools/c-analyzer/c_analyzer/parser/source.py b/Tools/c-analyzer/c_analyzer/parser/source.py new file mode 100644 index 00000000..f8998c8a --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/parser/source.py @@ -0,0 +1,34 @@ +from . import preprocessor + + +def iter_clean_lines(lines): + incomment = False + for line in lines: + # Deal with comments. + if incomment: + _, sep, line = line.partition('*/') + if sep: + incomment = False + continue + line, _, _ = line.partition('//') + line, sep, remainder = line.partition('/*') + if sep: + _, sep, after = remainder.partition('*/') + if not sep: + incomment = True + continue + line += ' ' + after + + # Ignore blank lines and leading/trailing whitespace. + line = line.strip() + if not line: + continue + + yield line + + +def iter_lines(filename, *, + preprocess=preprocessor.run, + ): + content = preprocess(filename) + return iter(content.splitlines()) diff --git a/Tools/c-analyzer/c_analyzer/symbols/__init__.py b/Tools/c-analyzer/c_analyzer/symbols/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Tools/c-analyzer/c_analyzer/symbols/_nm.py b/Tools/c-analyzer/c_analyzer/symbols/_nm.py new file mode 100644 index 00000000..f3a75a6d --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/symbols/_nm.py @@ -0,0 +1,117 @@ +import os.path +import shutil + +from c_analyzer.common import util, info + +from .info import Symbol + + +# XXX need tests: +# * iter_symbols + +NM_KINDS = { + 'b': Symbol.KIND.VARIABLE, # uninitialized + 'd': Symbol.KIND.VARIABLE, # initialized + #'g': Symbol.KIND.VARIABLE, # uninitialized + #'s': Symbol.KIND.VARIABLE, # initialized + 't': Symbol.KIND.FUNCTION, + } + +SPECIAL_SYMBOLS = { + # binary format (e.g. ELF) + '__bss_start', + '__data_start', + '__dso_handle', + '_DYNAMIC', + '_edata', + '_end', + '__environ@@GLIBC_2.2.5', + '_GLOBAL_OFFSET_TABLE_', + '__JCR_END__', + '__JCR_LIST__', + '__TMC_END__', + } + + +def _is_special_symbol(name): + if name in SPECIAL_SYMBOLS: + return True + if '@@GLIBC' in name: + return True + return False + + +def iter_symbols(binfile, *, + nm=None, + handle_id=None, + _which=shutil.which, + _run=util.run_cmd, + ): + """Yield a Symbol for each relevant entry reported by the "nm" command.""" + if nm is None: + nm = _which('nm') + if not nm: + raise NotImplementedError + if handle_id is None: + handle_id = info.ID + + argv = [nm, + '--line-numbers', + binfile, + ] + try: + output = _run(argv) + except Exception: + if nm is None: + # XXX Use dumpbin.exe /SYMBOLS on Windows. + raise NotImplementedError + raise + for line in output.splitlines(): + (name, kind, external, filename, funcname, + ) = _parse_nm_line(line) + if kind != Symbol.KIND.VARIABLE: + continue + elif _is_special_symbol(name): + continue + yield Symbol( + id=handle_id(filename, funcname, name), + kind=kind, + external=external, + ) + + +def _parse_nm_line(line): + _origline = line + _, _, line = line.partition(' ') # strip off the address + line = line.strip() + + kind, _, line = line.partition(' ') + line = line.strip() + external = kind.isupper() + kind = NM_KINDS.get(kind.lower(), Symbol.KIND.OTHER) + + name, _, filename = line.partition('\t') + name = name.strip() + if filename: + filename = os.path.relpath(filename.partition(':')[0]) + else: + filename = info.UNKNOWN + + name, islocal = _parse_nm_name(name, kind) + funcname = info.UNKNOWN if islocal else None + return name, kind, external, filename, funcname + + +def _parse_nm_name(name, kind): + if kind != Symbol.KIND.VARIABLE: + return name, None + if _is_special_symbol(name): + return name, None + + actual, sep, digits = name.partition('.') + if not sep: + return name, False + + if not digits.isdigit(): + raise Exception(f'got bogus name {name}') + return actual, True diff --git a/Tools/c-analyzer/c_analyzer/symbols/find.py b/Tools/c-analyzer/c_analyzer/symbols/find.py new file mode 100644 index 00000000..85646523 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/symbols/find.py @@ -0,0 +1,175 @@ +import os +import os.path +import shutil + +from ..common import files +from ..common.info import UNKNOWN, ID +from ..parser import find as p_find + +from . import _nm +from .info import Symbol + +# XXX need tests: +# * get_resolver() +# * get_resolver_from_dirs() +# * symbol() +# * symbols() +# * variables() + + +def _resolve_known(symbol, knownvars): + for varid in knownvars: + if symbol.match(varid): + break + else: + return None + return knownvars.pop(varid) + + +def get_resolver(filenames=None, known=None, *, + handle_var, + check_filename=None, + perfilecache=None, + preprocessed=False, + _from_source=p_find.variable_from_id, + ): + """Return a "resolver" func for the given known vars/types and filenames. + + "handle_var" is a callable that takes (ID, decl) and returns a + Variable. Variable.from_id is a suitable callable. + + The returned func takes a single Symbol and returns a corresponding + Variable. If the symbol was located then the variable will be + valid, populated with the corresponding information. Otherwise None + is returned. + """ + knownvars = (known or {}).get('variables') + if knownvars: + knownvars = dict(knownvars) # a copy + if filenames: + if check_filename is None: + filenames = list(filenames) + def check_filename(filename): + return filename in filenames + def resolve(symbol): + # XXX Check "found" instead? + if not check_filename(symbol.filename): + return None + found = _resolve_known(symbol, knownvars) + if found is None: + #return None + varid, decl = _from_source(symbol, filenames, + perfilecache=perfilecache, + preprocessed=preprocessed, + ) + found = handle_var(varid, decl) + return found + else: + def resolve(symbol): + return _resolve_known(symbol, knownvars) + elif filenames: + def resolve(symbol): + varid, decl = _from_source(symbol, filenames, + perfilecache=perfilecache, + preprocessed=preprocessed, + ) + return handle_var(varid, decl) + else: + def resolve(symbol): + return None + return resolve + + +def get_resolver_from_dirs(dirnames, known=None, *, + handle_var, + suffixes=('.c',), + perfilecache=None, + preprocessed=False, + _iter_files=files.iter_files_by_suffix, + _get_resolver=get_resolver, + ): + """Return a "resolver" func for the given known vars/types and filenames. + + "dirnames" should be absolute paths. If not then they will be + resolved relative to CWD. + + See get_resolver(). + """ + dirnames = [d if d.endswith(os.path.sep) else d + os.path.sep + for d in dirnames] + filenames = _iter_files(dirnames, suffixes) + def check_filename(filename): + for dirname in dirnames: + if filename.startswith(dirname): + return True + else: + return False + return _get_resolver(filenames, known, + handle_var=handle_var, + check_filename=check_filename, + perfilecache=perfilecache, + preprocessed=preprocessed, + ) + + +def symbol(symbol, filenames, known=None, *, + perfilecache=None, + preprocessed=False, + handle_id=None, + _get_resolver=get_resolver, + ): + """Return a Variable for the one matching the given symbol. + + "symbol" can be one of several objects: + + * Symbol - use the contained info + * name (str) - look for a global variable with that name + * (filename, name) - look for named global in file + * (filename, funcname, name) - look for named local in file + + A name is always required. If the filename is None, "", or + "UNKNOWN" then all files will be searched. If the funcname is + "" or "UNKNOWN" then only local variables will be searched for. + """ + resolve = _get_resolver(known, filenames, + handle_id=handle_id, + perfilecache=perfilecache, + preprocessed=preprocessed, + ) + return resolve(symbol) + + +def _get_platform_tool(): + if os.name == 'nt': + # XXX Support this. + raise NotImplementedError + elif nm := shutil.which('nm'): + return lambda b, hi: _nm.iter_symbols(b, nm=nm, handle_id=hi) + else: + raise NotImplementedError + + +def symbols(binfile, *, + handle_id=None, + _file_exists=os.path.exists, + _get_platform_tool=_get_platform_tool, + ): + """Yield a Symbol for each one found in the binary.""" + if not _file_exists(binfile): + raise Exception('executable missing (need to build it first?)') + + _iter_symbols = _get_platform_tool() + yield from _iter_symbols(binfile, handle_id) + + +def variables(binfile, *, + resolve, + handle_id=None, + _iter_symbols=symbols, + ): + """Yield (Variable, Symbol) for each found symbol.""" + for symbol in _iter_symbols(binfile, handle_id=handle_id): + if symbol.kind != Symbol.KIND.VARIABLE: + continue + var = resolve(symbol) or None + yield var, symbol diff --git a/Tools/c-analyzer/c_analyzer/symbols/info.py b/Tools/c-analyzer/c_analyzer/symbols/info.py new file mode 100644 index 00000000..96a251ab --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/symbols/info.py @@ -0,0 +1,51 @@ +from collections import namedtuple + +from c_analyzer.common.info import ID +from c_analyzer.common.util import classonly, _NTBase + + +class Symbol(_NTBase, namedtuple('Symbol', 'id kind external')): + """Info for a single compilation symbol.""" + + __slots__ = () + + class KIND: + VARIABLE = 'variable' + FUNCTION = 'function' + OTHER = 'other' + + @classonly + def from_name(cls, name, filename=None, kind=KIND.VARIABLE, external=None): + """Return a new symbol based on the given name.""" + id = ID(filename, None, name) + return cls(id, kind, external) + + def __new__(cls, id, kind=KIND.VARIABLE, external=None): + self = super().__new__( + cls, + id=ID.from_raw(id), + kind=str(kind) if kind else None, + external=bool(external) if external is not None else None, + ) + return self + + def __hash__(self): + return hash(self.id) + + def __getattr__(self, name): + return getattr(self.id, name) + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + if not self.id: + raise TypeError('missing id') + else: + self.id.validate() + + if not self.kind: + raise TypeError('missing kind') + elif self.kind not in vars(self.KIND).values(): + raise ValueError(f'unsupported kind {self.kind}') + + if self.external is None: + raise TypeError('missing external') diff --git a/Tools/c-analyzer/c_analyzer/variables/__init__.py b/Tools/c-analyzer/c_analyzer/variables/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Tools/c-analyzer/c_analyzer/variables/find.py b/Tools/c-analyzer/c_analyzer/variables/find.py new file mode 100644 index 00000000..3fe7284f --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/variables/find.py @@ -0,0 +1,75 @@ +from ..common import files +from ..common.info import UNKNOWN +from ..parser import ( + find as p_find, + ) +from ..symbols import ( + info as s_info, + find as s_find, + ) +from .info import Variable + +# XXX need tests: +# * vars_from_source + + +def _remove_cached(cache, var): + if not cache: + return + try: + cached = cache[var.filename] + cached.remove(var) + except (KeyError, IndexError): + pass + + +def vars_from_binary(binfile, *, + known=None, + filenames=None, + handle_id=None, + check_filename=None, + handle_var=Variable.from_id, + _iter_vars=s_find.variables, + _get_symbol_resolver=s_find.get_resolver, + ): + """Yield a Variable for each found Symbol. + + Details are filled in from the given "known" variables and types. + """ + cache = {} + resolve = _get_symbol_resolver(filenames, known, + handle_var=handle_var, + check_filename=check_filename, + perfilecache=cache, + ) + for var, symbol in _iter_vars(binfile, + resolve=resolve, + handle_id=handle_id, + ): + if var is None: + var = Variable(symbol.id, UNKNOWN, UNKNOWN) + yield var + _remove_cached(cache, var) + + +def vars_from_source(filenames, *, + preprocessed=None, + known=None, + handle_id=None, + handle_var=Variable.from_id, + iter_vars=p_find.variables, + ): + """Yield a Variable for each declaration in the raw source code. + + Details are filled in from the given "known" variables and types. + """ + cache = {} + for varid, decl in iter_vars(filenames or (), + perfilecache=cache, + preprocessed=preprocessed, + known=known, + handle_id=handle_id, + ): + var = handle_var(varid, decl) + yield var + _remove_cached(cache, var) diff --git a/Tools/c-analyzer/c_analyzer/variables/info.py b/Tools/c-analyzer/c_analyzer/variables/info.py new file mode 100644 index 00000000..336a523c --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/variables/info.py @@ -0,0 +1,93 @@ +from collections import namedtuple + +from ..common.info import ID, UNKNOWN +from ..common.util import classonly, _NTBase + + +def normalize_vartype(vartype): + """Return the canonical form for a variable type (or func signature).""" + # We allow empty strring through for semantic reasons. + if vartype is None: + return None + + # XXX finish! + # XXX Return (modifiers, type, pointer)? + return str(vartype) + + +# XXX Variable.vartype -> decl (Declaration). + +class Variable(_NTBase, + namedtuple('Variable', 'id storage vartype')): + """Information about a single variable declaration.""" + + __slots__ = () + + STORAGE = ( + 'static', + 'extern', + 'implicit', + 'local', + ) + + @classonly + def from_parts(cls, filename, funcname, name, decl, storage=None): + varid = ID(filename, funcname, name) + if storage is None: + self = cls.from_id(varid, decl) + else: + self = cls(varid, storage, decl) + return self + + @classonly + def from_id(cls, varid, decl): + from ..parser.declarations import extract_storage + storage = extract_storage(decl, infunc=varid.funcname) + return cls(varid, storage, decl) + + def __new__(cls, id, storage, vartype): + self = super().__new__( + cls, + id=ID.from_raw(id), + storage=str(storage) if storage else None, + vartype=normalize_vartype(vartype) if vartype else None, + ) + return self + + def __hash__(self): + return hash(self.id) + + def __getattr__(self, name): + return getattr(self.id, name) + + def _validate_id(self): + if not self.id: + raise TypeError('missing id') + + if not self.filename or self.filename == UNKNOWN: + raise TypeError(f'id missing filename ({self.id})') + + if self.funcname and self.funcname == UNKNOWN: + raise TypeError(f'id missing funcname ({self.id})') + + self.id.validate() + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + self._validate_id() + + if self.storage is None or self.storage == UNKNOWN: + raise TypeError('missing storage') + elif self.storage not in self.STORAGE: + raise ValueError(f'unsupported storage {self.storage:r}') + + if self.vartype is None or self.vartype == UNKNOWN: + raise TypeError('missing vartype') + + @property + def isglobal(self): + return self.storage != 'local' + + @property + def isconst(self): + return 'const' in self.vartype.split() diff --git a/Tools/c-analyzer/c_analyzer/variables/known.py b/Tools/c-analyzer/c_analyzer/variables/known.py new file mode 100644 index 00000000..aa2934a0 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/variables/known.py @@ -0,0 +1,91 @@ +import csv + +from ..common.info import ID, UNKNOWN +from ..common.util import read_tsv +from .info import Variable + + +# XXX need tests: +# * read_file() +# * look_up_variable() + + +COLUMNS = ('filename', 'funcname', 'name', 'kind', 'declaration') +HEADER = '\t'.join(COLUMNS) + + +def read_file(infile, *, + _read_tsv=read_tsv, + ): + """Yield (kind, id, decl) for each row in the data file. + + The caller is responsible for validating each row. + """ + for row in _read_tsv(infile, HEADER): + filename, funcname, name, kind, declaration = row + if not funcname or funcname == '-': + funcname = None + id = ID(filename, funcname, name) + yield kind, id, declaration + + +def from_file(infile, *, + handle_var=Variable.from_id, + _read_file=read_file, + ): + """Return the info for known declarations in the given file.""" + known = { + 'variables': {}, + #'types': {}, + #'constants': {}, + #'macros': {}, + } + for kind, id, decl in _read_file(infile): + if kind == 'variable': + values = known['variables'] + value = handle_var(id, decl) + else: + raise ValueError(f'unsupported kind in row {row}') + value.validate() + values[id] = value + return known + + +def look_up_variable(varid, knownvars, *, + match_files=(lambda f1, f2: f1 == f2), + ): + """Return the known Variable matching the given ID. + + "knownvars" is a mapping of ID to Variable. + + "match_files" is used to verify if two filenames point to + the same file. + + If no match is found then None is returned. + """ + if not knownvars: + return None + + if varid.funcname == UNKNOWN: + if not varid.filename or varid.filename == UNKNOWN: + for varid in knownvars: + if not varid.funcname: + continue + if varid.name == varid.name: + return knownvars[varid] + else: + return None + else: + for varid in knownvars: + if not varid.funcname: + continue + if not match_files(varid.filename, varid.filename): + continue + if varid.name == varid.name: + return knownvars[varid] + else: + return None + elif not varid.filename or varid.filename == UNKNOWN: + raise NotImplementedError + else: + return knownvars.get(varid.id) diff --git a/Tools/c-analyzer/check-c-globals.py b/Tools/c-analyzer/check-c-globals.py new file mode 100644 index 00000000..1371f927 --- /dev/null +++ b/Tools/c-analyzer/check-c-globals.py @@ -0,0 +1,448 @@ + +from collections import namedtuple +import glob +import os.path +import re +import shutil +import sys +import subprocess + + +VERBOSITY = 2 + +C_GLOBALS_DIR = os.path.abspath(os.path.dirname(__file__)) +TOOLS_DIR = os.path.dirname(C_GLOBALS_DIR) +ROOT_DIR = os.path.dirname(TOOLS_DIR) +GLOBALS_FILE = os.path.join(C_GLOBALS_DIR, 'ignored-globals.txt') + +SOURCE_DIRS = ['Include', 'Objects', 'Modules', 'Parser', 'Python'] + +CAPI_REGEX = re.compile(r'^ *PyAPI_DATA\([^)]*\) \W*(_?Py\w+(?:, \w+)*\w).*;.*$') + + +IGNORED_VARS = { + '_DYNAMIC', + '_GLOBAL_OFFSET_TABLE_', + '__JCR_LIST__', + '__JCR_END__', + '__TMC_END__', + '__bss_start', + '__data_start', + '__dso_handle', + '_edata', + '_end', + } + + +def find_capi_vars(root): + capi_vars = {} + for dirname in SOURCE_DIRS: + for filename in glob.glob(os.path.join( + glob.escape(os.path.join(ROOT_DIR, dirname)), + '**/*.[hc]'), + recursive=True): + with open(filename) as file: + for name in _find_capi_vars(file): + if name in capi_vars: + assert not filename.endswith('.c') + assert capi_vars[name].endswith('.c') + capi_vars[name] = filename + return capi_vars + + +def _find_capi_vars(lines): + for line in lines: + if not line.startswith('PyAPI_DATA'): + continue + assert '{' not in line + match = CAPI_REGEX.match(line) + assert match + names, = match.groups() + for name in names.split(', '): + yield name + + +def _read_global_names(filename): + # These variables are shared between all interpreters in the process. + with open(filename) as file: + return {line.partition('#')[0].strip() + for line in file + if line.strip() and not line.startswith('#')} + + +def _is_global_var(name, globalnames): + if _is_autogen_var(name): + return True + if _is_type_var(name): + return True + if _is_module(name): + return True + if _is_exception(name): + return True + if _is_compiler(name): + return True + return name in globalnames + + +def _is_autogen_var(name): + return ( + name.startswith('PyId_') or + '.' in name or + # Objects/typeobject.c + name.startswith('op_id.') or + name.startswith('rop_id.') or + # Python/graminit.c + name.startswith('arcs_') or + name.startswith('states_') + ) + + +def _is_type_var(name): + if name.endswith(('Type', '_Type', '_type')): # XXX Always a static type? + return True + if name.endswith('_desc'): # for structseq types + return True + return ( + name.startswith('doc_') or + name.endswith(('_doc', '__doc__', '_docstring')) or + name.endswith('_methods') or + name.endswith('_fields') or + name.endswith(('_memberlist', '_members')) or + name.endswith('_slots') or + name.endswith(('_getset', '_getsets', '_getsetlist')) or + name.endswith('_as_mapping') or + name.endswith('_as_number') or + name.endswith('_as_sequence') or + name.endswith('_as_buffer') or + name.endswith('_as_async') + ) + + +def _is_module(name): + if name.endswith(('_functions', 'Methods', '_Methods')): + return True + if name == 'module_def': + return True + if name == 'initialized': + return True + return name.endswith(('module', '_Module')) + + +def _is_exception(name): + # Other vars are enumerated in globals-core.txt. + if not name.startswith(('PyExc_', '_PyExc_')): + return False + return name.endswith(('Error', 'Warning')) + + +def _is_compiler(name): + return ( + # Python/Python-ast.c + name.endswith('_type') or + name.endswith('_singleton') or + name.endswith('_attributes') + ) + + +class Var(namedtuple('Var', 'name kind scope capi filename')): + + @classmethod + def parse_nm(cls, line, expected, ignored, capi_vars, globalnames): + _, _, line = line.partition(' ') # strip off the address + line = line.strip() + kind, _, line = line.partition(' ') + if kind in ignored or (): + return None + elif kind not in expected or (): + raise RuntimeError('unsupported NM type {!r}'.format(kind)) + + name, _, filename = line.partition('\t') + name = name.strip() + if _is_autogen_var(name): + return None + if _is_global_var(name, globalnames): + scope = 'global' + else: + scope = None + capi = (name in capi_vars or ()) + if filename: + filename = os.path.relpath(filename.partition(':')[0]) + return cls(name, kind, scope, capi, filename or '~???~') + + @property + def external(self): + return self.kind.isupper() + + +def find_vars(root, globals_filename=GLOBALS_FILE): + python = os.path.join(root, 'python') + if not os.path.exists(python): + raise RuntimeError('python binary missing (need to build it first?)') + capi_vars = find_capi_vars(root) + globalnames = _read_global_names(globals_filename) + + nm = shutil.which('nm') + if nm is None: + # XXX Use dumpbin.exe /SYMBOLS on Windows. + raise NotImplementedError + else: + yield from (var + for var in _find_var_symbols(python, nm, capi_vars, + globalnames) + if var.name not in IGNORED_VARS) + + +NM_FUNCS = set('Tt') +NM_PUBLIC_VARS = set('BD') +NM_PRIVATE_VARS = set('bd') +NM_VARS = NM_PUBLIC_VARS | NM_PRIVATE_VARS +NM_DATA = set('Rr') +NM_OTHER = set('ACGgiINpSsuUVvWw-?') +NM_IGNORED = NM_FUNCS | NM_DATA | NM_OTHER + + +def _find_var_symbols(python, nm, capi_vars, globalnames): + args = [nm, + '--line-numbers', + python] + out = subprocess.check_output(args) + for line in out.decode('utf-8').splitlines(): + var = Var.parse_nm(line, NM_VARS, NM_IGNORED, capi_vars, globalnames) + if var is None: + continue + yield var + + +####################################### + +class Filter(namedtuple('Filter', 'name op value action')): + + @classmethod + def parse(cls, raw): + action = '+' + if raw.startswith(('+', '-')): + action = raw[0] + raw = raw[1:] + # XXX Support < and >? + name, op, value = raw.partition('=') + return cls(name, op, value, action) + + def check(self, var): + value = getattr(var, self.name, None) + if not self.op: + matched = bool(value) + elif self.op == '=': + matched = (value == self.value) + else: + raise NotImplementedError + + if self.action == '+': + return matched + elif self.action == '-': + return not matched + else: + raise NotImplementedError + + +def filter_var(var, filters): + for filter in filters: + if not filter.check(var): + return False + return True + + +def make_sort_key(spec): + columns = [(col.strip('_'), '_' if col.startswith('_') else '') + for col in spec] + def sort_key(var): + return tuple(getattr(var, col).lstrip(prefix) + for col, prefix in columns) + return sort_key + + +def make_groups(allvars, spec): + group = spec + groups = {} + for var in allvars: + value = getattr(var, group) + key = '{}: {}'.format(group, value) + try: + groupvars = groups[key] + except KeyError: + groupvars = groups[key] = [] + groupvars.append(var) + return groups + + +def format_groups(groups, columns, fmts, widths): + for group in sorted(groups): + groupvars = groups[group] + yield '', 0 + yield ' # {}'.format(group), 0 + yield from format_vars(groupvars, columns, fmts, widths) + + +def format_vars(allvars, columns, fmts, widths): + fmt = ' '.join(fmts[col] for col in columns) + fmt = ' ' + fmt.replace(' ', ' ') + ' ' # for div margin + header = fmt.replace(':', ':^').format(*(col.upper() for col in columns)) + yield header, 0 + div = ' '.join('-'*(widths[col]+2) for col in columns) + yield div, 0 + for var in allvars: + values = (getattr(var, col) for col in columns) + row = fmt.format(*('X' if val is True else val or '' + for val in values)) + yield row, 1 + yield div, 0 + + +####################################### + +COLUMNS = 'name,external,capi,scope,filename' +COLUMN_NAMES = COLUMNS.split(',') + +COLUMN_WIDTHS = {col: len(col) + for col in COLUMN_NAMES} +COLUMN_WIDTHS.update({ + 'name': 50, + 'scope': 7, + 'filename': 40, + }) +COLUMN_FORMATS = {col: '{:%s}' % width + for col, width in COLUMN_WIDTHS.items()} +for col in COLUMN_FORMATS: + if COLUMN_WIDTHS[col] == len(col): + COLUMN_FORMATS[col] = COLUMN_FORMATS[col].replace(':', ':^') + + +def _parse_filters_arg(raw, error): + filters = [] + for value in raw.split(','): + value=value.strip() + if not value: + continue + try: + filter = Filter.parse(value) + if filter.name not in COLUMN_NAMES: + raise Exception('unsupported column {!r}'.format(filter.name)) + except Exception as e: + error('bad filter {!r}: {}'.format(raw, e)) + filters.append(filter) + return filters + + +def _parse_columns_arg(raw, error): + columns = raw.split(',') + for column in columns: + if column not in COLUMN_NAMES: + error('unsupported column {!r}'.format(column)) + return columns + + +def _parse_sort_arg(raw, error): + sort = raw.split(',') + for column in sort: + if column.lstrip('_') not in COLUMN_NAMES: + error('unsupported column {!r}'.format(column)) + return sort + + +def _parse_group_arg(raw, error): + if not raw: + return raw + group = raw + if group not in COLUMN_NAMES: + error('unsupported column {!r}'.format(group)) + if group != 'filename': + error('unsupported group {!r}'.format(group)) + return group + + +def parse_args(argv=None): + if argv is None: + argv = sys.argv[1:] + + import argparse + parser = argparse.ArgumentParser() + + parser.add_argument('-v', '--verbose', action='count', default=0) + parser.add_argument('-q', '--quiet', action='count', default=0) + + parser.add_argument('--filters', default='-scope', + help='[[-][=]] ...') + + parser.add_argument('--columns', default=COLUMNS, + help='a comma-separated list of columns to show') + parser.add_argument('--sort', default='filename,_name', + help='a comma-separated list of columns to sort') + parser.add_argument('--group', + help='group by the given column name (- to not group)') + + parser.add_argument('--rc-on-match', dest='rc', type=int) + + parser.add_argument('filename', nargs='?', default=GLOBALS_FILE) + + args = parser.parse_args(argv) + + verbose = vars(args).pop('verbose', 0) + quiet = vars(args).pop('quiet', 0) + args.verbosity = max(0, VERBOSITY + verbose - quiet) + + if args.sort.startswith('filename') and not args.group: + args.group = 'filename' + + if args.rc is None: + if '-scope=core' in args.filters or 'core' not in args.filters: + args.rc = 0 + else: + args.rc = 1 + + args.filters = _parse_filters_arg(args.filters, parser.error) + args.columns = _parse_columns_arg(args.columns, parser.error) + args.sort = _parse_sort_arg(args.sort, parser.error) + args.group = _parse_group_arg(args.group, parser.error) + + return args + + +def main(root=ROOT_DIR, filename=GLOBALS_FILE, + filters=None, columns=COLUMN_NAMES, sort=None, group=None, + verbosity=VERBOSITY, rc=1): + + log = lambda msg: ... + if verbosity >= 2: + log = lambda msg: print(msg) + + allvars = (var + for var in find_vars(root, filename) + if filter_var(var, filters)) + if sort: + allvars = sorted(allvars, key=make_sort_key(sort)) + + if group: + try: + columns.remove(group) + except ValueError: + pass + grouped = make_groups(allvars, group) + lines = format_groups(grouped, columns, COLUMN_FORMATS, COLUMN_WIDTHS) + else: + lines = format_vars(allvars, columns, COLUMN_FORMATS, COLUMN_WIDTHS) + + total = 0 + for line, count in lines: + total += count + log(line) + log('\ntotal: {}'.format(total)) + + if total and rc: + print('ERROR: found unsafe globals', file=sys.stderr) + return rc + return 0 + + +if __name__ == '__main__': + args = parse_args() + sys.exit( + main(**vars(args))) diff --git a/Tools/c-analyzer/cpython/README b/Tools/c-analyzer/cpython/README new file mode 100644 index 00000000..772b8be2 --- /dev/null +++ b/Tools/c-analyzer/cpython/README @@ -0,0 +1,72 @@ +####################################### +# C Globals and CPython Runtime State. + +CPython's C code makes extensive use of global variables (whether static +globals or static locals). Each such variable falls into one of several +categories: + +* strictly const data +* used exclusively in main or in the REPL +* process-global state (e.g. managing process-level resources + like signals and file descriptors) +* Python "global" runtime state +* per-interpreter runtime state + +The last one can be a problem as soon as anyone creates a second +interpreter (AKA "subinterpreter") in a process. It is definitely a +problem under subinterpreters if they are no longer sharing the GIL, +since the GIL protects us from a lot of race conditions. Keep in mind +that ultimately *all* objects (PyObject) should be treated as +per-interpreter state. This includes "static types", freelists, +_PyIdentifier, and singletons. Take that in for a second. It has +significant implications on where we use static variables! + +Be aware that module-global state (stored in C statics) is a kind of +per-interpreter state. There have been efforts across many years, and +still going, to provide extension module authors mechanisms to store +that state safely (see PEPs 3121, 489, etc.). + +(Note that there has been discussion around support for running multiple +Python runtimes in the same process. That would ends up with the same +problems, relative to static variables, that subinterpreters have.) + +Historically we have been bad at keeping per-interpreter state out of +static variables, mostly because until recently subinterpreters were +not widely used nor even factored in to solutions. However, the +feature is growing in popularity and use in the community. + +Mandate: "Eliminate use of static variables for per-interpreter state." + +The "c-statics.py" script in this directory, along with its accompanying +data files, are part of the effort to resolve existing problems with +our use of static variables and to prevent future problems. + +#------------------------- +## statics for actually-global state (and runtime state consolidation) + +In general, holding any kind of state in static variables +increases maintenance burden and increases the complexity of code (e.g. +we use TSS to identify the active thread state). So it is a good idea +to avoid using statics for state even if for the "global" runtime or +for process-global state. + +Relative to maintenance burden, one problem is where the runtime +state is spread throughout the codebase in dozens of individual +globals. Unlike the other globals, the runtime state represents a set +of values that are constantly shifting in a complex way. When they are +spread out it's harder to get a clear picture of what the runtime +involves. Furthermore, when they are spread out it complicates efforts +that change the runtime. + +Consequently, the globals for Python's runtime state have been +consolidated under a single top-level _PyRuntime global. No new globals +should be added for runtime state. Instead, they should be added to +_PyRuntimeState or one of its sub-structs. The tools in this directory +are run as part of the test suite to ensure that no new globals have +been added. The script can be run manually as well: + + ./python Lib/test/test_c_statics/c-statics.py check + +If it reports any globals then they should be resolved. If the globals +are runtime state then they should be folded into _PyRuntimeState. +Otherwise they should be marked as ignored. diff --git a/Tools/c-analyzer/cpython/__init__.py b/Tools/c-analyzer/cpython/__init__.py new file mode 100644 index 00000000..ae45b424 --- /dev/null +++ b/Tools/c-analyzer/cpython/__init__.py @@ -0,0 +1,29 @@ +import os.path +import sys + + +TOOL_ROOT = os.path.abspath( + os.path.dirname( # c-analyzer/ + os.path.dirname(__file__))) # cpython/ +DATA_DIR = TOOL_ROOT +REPO_ROOT = ( + os.path.dirname( # .. + os.path.dirname(TOOL_ROOT))) # Tools/ + +INCLUDE_DIRS = [os.path.join(REPO_ROOT, name) for name in [ + 'Include', + ]] +SOURCE_DIRS = [os.path.join(REPO_ROOT, name) for name in [ + 'Python', + 'Parser', + 'Objects', + 'Modules', + ]] + +#PYTHON = os.path.join(REPO_ROOT, 'python') +PYTHON = sys.executable + + +# Clean up the namespace. +del sys +del os diff --git a/Tools/c-analyzer/cpython/__main__.py b/Tools/c-analyzer/cpython/__main__.py new file mode 100644 index 00000000..6b0f9bcb --- /dev/null +++ b/Tools/c-analyzer/cpython/__main__.py @@ -0,0 +1,212 @@ +import argparse +import re +import sys + +from c_analyzer.common import show +from c_analyzer.common.info import UNKNOWN + +from . import SOURCE_DIRS +from .find import supported_vars +from .known import ( + from_file as known_from_file, + DATA_FILE as KNOWN_FILE, + ) +from .supported import IGNORED_FILE + + +def _check_results(unknown, knownvars, used): + def _match_unused_global(variable): + found = [] + for varid in knownvars: + if varid in used: + continue + if varid.funcname is not None: + continue + if varid.name != variable.name: + continue + if variable.filename and variable.filename != UNKNOWN: + if variable.filename == varid.filename: + found.append(varid) + else: + found.append(varid) + return found + + badknown = set() + for variable in sorted(unknown): + msg = None + if variable.funcname != UNKNOWN: + msg = f'could not find global symbol {variable.id}' + elif m := _match_unused_global(variable): + assert isinstance(m, list) + badknown.update(m) + elif variable.name in ('completed', 'id'): # XXX Figure out where these variables are. + unknown.remove(variable) + else: + msg = f'could not find local symbol {variable.id}' + if msg: + #raise Exception(msg) + print(msg) + if badknown: + print('---') + print(f'{len(badknown)} globals in known.tsv, but may actually be local:') + for varid in sorted(badknown): + print(f'{varid.filename:30} {varid.name}') + unused = sorted(varid + for varid in set(knownvars) - used + if varid.name != 'id') # XXX Figure out where these variables are. + if unused: + print('---') + print(f'did not use {len(unused)} known vars:') + for varid in unused: + print(f'{varid.filename:30} {varid.funcname or "-":20} {varid.name}') + raise Exception('not all known symbols used') + if unknown: + print('---') + raise Exception('could not find all symbols') + + +# XXX Move this check to its own command. +def cmd_check_cache(cmd, *, + known=KNOWN_FILE, + ignored=IGNORED_FILE, + _known_from_file=known_from_file, + _find=supported_vars, + ): + known = _known_from_file(known) + + used = set() + unknown = set() + for var, supported in _find(known=known, ignored=ignored): + if supported is None: + unknown.add(var) + continue + used.add(var.id) + _check_results(unknown, known['variables'], used) + + +def cmd_check(cmd, *, + known=KNOWN_FILE, + ignored=IGNORED_FILE, + _find=supported_vars, + _show=show.basic, + _print=print, + ): + """ + Fail if there are unsupported globals variables. + + In the failure case, the list of unsupported variables + will be printed out. + """ + unsupported = [] + for var, supported in _find(known=known, ignored=ignored): + if not supported: + unsupported.append(var) + + if not unsupported: + #_print('okay') + return + + _print('ERROR: found unsupported global variables') + _print() + _show(sorted(unsupported)) + _print(f' ({len(unsupported)} total)') + sys.exit(1) + + +def cmd_show(cmd, *, + known=KNOWN_FILE, + ignored=IGNORED_FILE, + skip_objects=False, + _find=supported_vars, + _show=show.basic, + _print=print, + ): + """ + Print out the list of found global variables. + + The variables will be distinguished as "supported" or "unsupported". + """ + allsupported = [] + allunsupported = [] + for found, supported in _find(known=known, + ignored=ignored, + skip_objects=skip_objects, + ): + if supported is None: + continue + (allsupported if supported else allunsupported + ).append(found) + + _print('supported:') + _print('----------') + _show(sorted(allsupported)) + _print(f' ({len(allsupported)} total)') + _print() + _print('unsupported:') + _print('------------') + _show(sorted(allunsupported)) + _print(f' ({len(allunsupported)} total)') + + +############################# +# the script + +COMMANDS = { + 'check': cmd_check, + 'show': cmd_show, + } + +PROG = sys.argv[0] +PROG = 'c-globals.py' + + +def parse_args(prog=PROG, argv=sys.argv[1:], *, _fail=None): + common = argparse.ArgumentParser(add_help=False) + common.add_argument('--ignored', metavar='FILE', + default=IGNORED_FILE, + help='path to file that lists ignored vars') + common.add_argument('--known', metavar='FILE', + default=KNOWN_FILE, + help='path to file that lists known types') + #common.add_argument('dirs', metavar='DIR', nargs='*', + # default=SOURCE_DIRS, + # help='a directory to check') + + parser = argparse.ArgumentParser( + prog=prog, + ) + subs = parser.add_subparsers(dest='cmd') + + check = subs.add_parser('check', parents=[common]) + + show = subs.add_parser('show', parents=[common]) + show.add_argument('--skip-objects', action='store_true') + + if _fail is None: + def _fail(msg): + parser.error(msg) + + # Now parse the args. + args = parser.parse_args(argv) + ns = vars(args) + + cmd = ns.pop('cmd') + if not cmd: + _fail('missing command') + + return cmd, ns + + +def main(cmd, cmdkwargs=None, *, _COMMANDS=COMMANDS): + try: + cmdfunc = _COMMANDS[cmd] + except KeyError: + raise ValueError( + f'unsupported cmd {cmd!r}' if cmd else 'missing cmd') + + cmdfunc(cmd, **cmdkwargs or {}) + + +if __name__ == '__main__': + cmd, cmdkwargs = parse_args() + main(cmd, cmdkwargs) diff --git a/Tools/c-analyzer/cpython/_generate.py b/Tools/c-analyzer/cpython/_generate.py new file mode 100644 index 00000000..4c340acf --- /dev/null +++ b/Tools/c-analyzer/cpython/_generate.py @@ -0,0 +1,329 @@ +# The code here consists of hacks for pre-populating the known.tsv file. + +from c_analyzer.parser.preprocessor import _iter_clean_lines +from c_analyzer.parser.naive import ( + iter_variables, parse_variable_declaration, find_variables, + ) +from c_analyzer.common.known import HEADER as KNOWN_HEADER +from c_analyzer.common.info import UNKNOWN, ID +from c_analyzer.variables import Variable +from c_analyzer.util import write_tsv + +from . import SOURCE_DIRS, REPO_ROOT +from .known import DATA_FILE as KNOWN_FILE +from .files import iter_cpython_files + + +POTS = ('char ', 'wchar_t ', 'int ', 'Py_ssize_t ') +POTS += tuple('const ' + v for v in POTS) +STRUCTS = ('PyTypeObject', 'PyObject', 'PyMethodDef', 'PyModuleDef', 'grammar') + + +def _parse_global(line, funcname=None): + line = line.strip() + if line.startswith('static '): + if '(' in line and '[' not in line and ' = ' not in line: + return None, None + name, decl = parse_variable_declaration(line) + elif line.startswith(('Py_LOCAL(', 'Py_LOCAL_INLINE(')): + name, decl = parse_variable_declaration(line) + elif line.startswith('_Py_static_string('): + decl = line.strip(';').strip() + name = line.split('(')[1].split(',')[0].strip() + elif line.startswith('_Py_IDENTIFIER('): + decl = line.strip(';').strip() + name = 'PyId_' + line.split('(')[1].split(')')[0].strip() + elif funcname: + return None, None + + # global-only + elif line.startswith('PyAPI_DATA('): # only in .h files + name, decl = parse_variable_declaration(line) + elif line.startswith('extern '): # only in .h files + name, decl = parse_variable_declaration(line) + elif line.startswith('PyDoc_VAR('): + decl = line.strip(';').strip() + name = line.split('(')[1].split(')')[0].strip() + elif line.startswith(POTS): # implied static + if '(' in line and '[' not in line and ' = ' not in line: + return None, None + name, decl = parse_variable_declaration(line) + elif line.startswith(STRUCTS) and line.endswith(' = {'): # implied static + name, decl = parse_variable_declaration(line) + elif line.startswith(STRUCTS) and line.endswith(' = NULL;'): # implied static + name, decl = parse_variable_declaration(line) + elif line.startswith('struct '): + if not line.endswith(' = {'): + return None, None + if not line.partition(' ')[2].startswith(STRUCTS): + return None, None + # implied static + name, decl = parse_variable_declaration(line) + + # file-specific + elif line.startswith(('SLOT1BINFULL(', 'SLOT1BIN(')): + # Objects/typeobject.c + funcname = line.split('(')[1].split(',')[0] + return [ + ('op_id', funcname, '_Py_static_string(op_id, OPSTR)'), + ('rop_id', funcname, '_Py_static_string(op_id, OPSTR)'), + ] + elif line.startswith('WRAP_METHOD('): + # Objects/weakrefobject.c + funcname, name = (v.strip() for v in line.split('(')[1].split(')')[0].split(',')) + return [ + ('PyId_' + name, funcname, f'_Py_IDENTIFIER({name})'), + ] + + else: + return None, None + return name, decl + + +def _pop_cached(varcache, filename, funcname, name, *, + _iter_variables=iter_variables, + ): + # Look for the file. + try: + cached = varcache[filename] + except KeyError: + cached = varcache[filename] = {} + for variable in _iter_variables(filename, + parse_variable=_parse_global, + ): + variable._isglobal = True + cached[variable.id] = variable + for var in cached: + print(' ', var) + + # Look for the variable. + if funcname == UNKNOWN: + for varid in cached: + if varid.name == name: + break + else: + return None + return cached.pop(varid) + else: + return cached.pop((filename, funcname, name), None) + + +def find_matching_variable(varid, varcache, allfilenames, *, + _pop_cached=_pop_cached, + ): + if varid.filename and varid.filename != UNKNOWN: + filenames = [varid.filename] + else: + filenames = allfilenames + for filename in filenames: + variable = _pop_cached(varcache, filename, varid.funcname, varid.name) + if variable is not None: + return variable + else: + if varid.filename and varid.filename != UNKNOWN and varid.funcname is None: + for filename in allfilenames: + if not filename.endswith('.h'): + continue + variable = _pop_cached(varcache, filename, None, varid.name) + if variable is not None: + return variable + return None + + +MULTILINE = { + # Python/Python-ast.c + 'Load_singleton': 'PyObject *', + 'Store_singleton': 'PyObject *', + 'Del_singleton': 'PyObject *', + 'AugLoad_singleton': 'PyObject *', + 'AugStore_singleton': 'PyObject *', + 'Param_singleton': 'PyObject *', + 'And_singleton': 'PyObject *', + 'Or_singleton': 'PyObject *', + 'Add_singleton': 'static PyObject *', + 'Sub_singleton': 'static PyObject *', + 'Mult_singleton': 'static PyObject *', + 'MatMult_singleton': 'static PyObject *', + 'Div_singleton': 'static PyObject *', + 'Mod_singleton': 'static PyObject *', + 'Pow_singleton': 'static PyObject *', + 'LShift_singleton': 'static PyObject *', + 'RShift_singleton': 'static PyObject *', + 'BitOr_singleton': 'static PyObject *', + 'BitXor_singleton': 'static PyObject *', + 'BitAnd_singleton': 'static PyObject *', + 'FloorDiv_singleton': 'static PyObject *', + 'Invert_singleton': 'static PyObject *', + 'Not_singleton': 'static PyObject *', + 'UAdd_singleton': 'static PyObject *', + 'USub_singleton': 'static PyObject *', + 'Eq_singleton': 'static PyObject *', + 'NotEq_singleton': 'static PyObject *', + 'Lt_singleton': 'static PyObject *', + 'LtE_singleton': 'static PyObject *', + 'Gt_singleton': 'static PyObject *', + 'GtE_singleton': 'static PyObject *', + 'Is_singleton': 'static PyObject *', + 'IsNot_singleton': 'static PyObject *', + 'In_singleton': 'static PyObject *', + 'NotIn_singleton': 'static PyObject *', + # Python/symtable.c + 'top': 'static identifier ', + 'lambda': 'static identifier ', + 'genexpr': 'static identifier ', + 'listcomp': 'static identifier ', + 'setcomp': 'static identifier ', + 'dictcomp': 'static identifier ', + '__class__': 'static identifier ', + # Python/compile.c + '__doc__': 'static PyObject *', + '__annotations__': 'static PyObject *', + # Objects/floatobject.c + 'double_format': 'static float_format_type ', + 'float_format': 'static float_format_type ', + 'detected_double_format': 'static float_format_type ', + 'detected_float_format': 'static float_format_type ', + # Parser/listnode.c + 'level': 'static int ', + 'atbol': 'static int ', + # Python/dtoa.c + 'private_mem': 'static double private_mem[PRIVATE_mem]', + 'pmem_next': 'static double *', + # Modules/_weakref.c + 'weakref_functions': 'static PyMethodDef ', +} +INLINE = { + # Modules/_tracemalloc.c + 'allocators': 'static struct { PyMemAllocatorEx mem; PyMemAllocatorEx raw; PyMemAllocatorEx obj; } ', + # Modules/faulthandler.c + 'fatal_error': 'static struct { int enabled; PyObject *file; int fd; int all_threads; PyInterpreterState *interp; void *exc_handler; } ', + 'thread': 'static struct { PyObject *file; int fd; PY_TIMEOUT_T timeout_us; int repeat; PyInterpreterState *interp; int exit; char *header; size_t header_len; PyThread_type_lock cancel_event; PyThread_type_lock running; } ', + # Modules/signalmodule.c + 'Handlers': 'static volatile struct { _Py_atomic_int tripped; PyObject *func; } Handlers[NSIG]', + 'wakeup': 'static volatile struct { SOCKET_T fd; int warn_on_full_buffer; int use_send; } ', + # Python/dynload_shlib.c + 'handles': 'static struct { dev_t dev; ino_t ino; void *handle; } handles[128]', + # Objects/obmalloc.c + '_PyMem_Debug': 'static struct { debug_alloc_api_t raw; debug_alloc_api_t mem; debug_alloc_api_t obj; } ', + # Python/bootstrap_hash.c + 'urandom_cache': 'static struct { int fd; dev_t st_dev; ino_t st_ino; } ', + } +FUNC = { + # Objects/object.c + '_Py_abstract_hack': 'Py_ssize_t (*_Py_abstract_hack)(PyObject *)', + # Parser/myreadline.c + 'PyOS_InputHook': 'int (*PyOS_InputHook)(void)', + # Python/pylifecycle.c + '_PyOS_mystrnicmp_hack': 'int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t)', + # Parser/myreadline.c + 'PyOS_ReadlineFunctionPointer': 'char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *)', + } +IMPLIED = { + # Objects/boolobject.c + '_Py_FalseStruct': 'static struct _longobject ', + '_Py_TrueStruct': 'static struct _longobject ', + # Modules/config.c + '_PyImport_Inittab': 'struct _inittab _PyImport_Inittab[]', + } +GLOBALS = {} +GLOBALS.update(MULTILINE) +GLOBALS.update(INLINE) +GLOBALS.update(FUNC) +GLOBALS.update(IMPLIED) + +LOCALS = { + 'buildinfo': ('Modules/getbuildinfo.c', + 'Py_GetBuildInfo', + 'static char buildinfo[50 + sizeof(GITVERSION) + ((sizeof(GITTAG) > sizeof(GITBRANCH)) ? sizeof(GITTAG) : sizeof(GITBRANCH))]'), + 'methods': ('Python/codecs.c', + '_PyCodecRegistry_Init', + 'static struct { char *name; PyMethodDef def; } methods[]'), + } + + +def _known(symbol): + if symbol.funcname: + if symbol.funcname != UNKNOWN or symbol.filename != UNKNOWN: + raise KeyError(symbol.name) + filename, funcname, decl = LOCALS[symbol.name] + varid = ID(filename, funcname, symbol.name) + elif not symbol.filename or symbol.filename == UNKNOWN: + raise KeyError(symbol.name) + else: + varid = symbol.id + try: + decl = GLOBALS[symbol.name] + except KeyError: + + if symbol.name.endswith('_methods'): + decl = 'static PyMethodDef ' + elif symbol.filename == 'Objects/exceptions.c' and symbol.name.startswith(('PyExc_', '_PyExc_')): + decl = 'static PyTypeObject ' + else: + raise + if symbol.name not in decl: + decl = decl + symbol.name + return Variable(varid, 'static', decl) + + +def known_row(varid, decl): + return ( + varid.filename, + varid.funcname or '-', + varid.name, + 'variable', + decl, + ) + + +def known_rows(symbols, *, + cached=True, + _get_filenames=iter_cpython_files, + _find_match=find_matching_variable, + _find_symbols=find_variables, + _as_known=known_row, + ): + filenames = list(_get_filenames()) + cache = {} + if cached: + for symbol in symbols: + try: + found = _known(symbol) + except KeyError: + found = _find_match(symbol, cache, filenames) + if found is None: + found = Variable(symbol.id, UNKNOWN, UNKNOWN) + yield _as_known(found.id, found.vartype) + else: + raise NotImplementedError # XXX incorporate KNOWN + for variable in _find_symbols(symbols, filenames, + srccache=cache, + parse_variable=_parse_global, + ): + #variable = variable._replace( + # filename=os.path.relpath(variable.filename, REPO_ROOT)) + if variable.funcname == UNKNOWN: + print(variable) + if variable.vartype== UNKNOWN: + print(variable) + yield _as_known(variable.id, variable.vartype) + + +def generate(symbols, filename=None, *, + _generate_rows=known_rows, + _write_tsv=write_tsv, + ): + if not filename: + filename = KNOWN_FILE + '.new' + + rows = _generate_rows(symbols) + _write_tsv(filename, KNOWN_HEADER, rows) + + +if __name__ == '__main__': + from c_symbols import binary + symbols = binary.iter_symbols( + binary.PYTHON, + find_local_symbol=None, + ) + generate(symbols) diff --git a/Tools/c-analyzer/cpython/files.py b/Tools/c-analyzer/cpython/files.py new file mode 100644 index 00000000..543097af --- /dev/null +++ b/Tools/c-analyzer/cpython/files.py @@ -0,0 +1,29 @@ +from c_analyzer.common.files import ( + C_SOURCE_SUFFIXES, walk_tree, iter_files_by_suffix, + ) + +from . import SOURCE_DIRS, REPO_ROOT + +# XXX need tests: +# * iter_files() + + +def iter_files(*, + walk=walk_tree, + _files=iter_files_by_suffix, + ): + """Yield each file in the tree for each of the given directory names.""" + excludedtrees = [ + os.path.join('Include', 'cpython', ''), + ] + def is_excluded(filename): + for root in excludedtrees: + if filename.startswith(root): + return True + return False + for filename in _files(SOURCE_DIRS, C_SOURCE_SUFFIXES, REPO_ROOT, + walk=walk, + ): + if is_excluded(filename): + continue + yield filename diff --git a/Tools/c-analyzer/cpython/find.py b/Tools/c-analyzer/cpython/find.py new file mode 100644 index 00000000..a7bc0b47 --- /dev/null +++ b/Tools/c-analyzer/cpython/find.py @@ -0,0 +1,101 @@ +import os.path + +from c_analyzer.common import files +from c_analyzer.common.info import UNKNOWN, ID +from c_analyzer.variables import find as _common + +from . import SOURCE_DIRS, PYTHON, REPO_ROOT +from .known import ( + from_file as known_from_file, + DATA_FILE as KNOWN_FILE, + ) +from .supported import ( + ignored_from_file, IGNORED_FILE, is_supported, _is_object, + ) + +# XXX need tests: +# * vars_from_binary() +# * vars_from_source() +# * supported_vars() + + +def _handle_id(filename, funcname, name, *, + _relpath=os.path.relpath, + ): + filename = _relpath(filename, REPO_ROOT) + return ID(filename, funcname, name) + + +def vars_from_binary(*, + known=KNOWN_FILE, + _known_from_file=known_from_file, + _iter_files=files.iter_files_by_suffix, + _iter_vars=_common.vars_from_binary, + ): + """Yield a Variable for each found Symbol. + + Details are filled in from the given "known" variables and types. + """ + if isinstance(known, str): + known = _known_from_file(known) + dirnames = SOURCE_DIRS + suffixes = ('.c',) + filenames = _iter_files(dirnames, suffixes) + # XXX For now we only use known variables (no source lookup). + filenames = None + yield from _iter_vars(PYTHON, + known=known, + filenames=filenames, + handle_id=_handle_id, + check_filename=(lambda n: True), + ) + + +def vars_from_source(*, + preprocessed=None, + known=KNOWN_FILE, + _known_from_file=known_from_file, + _iter_files=files.iter_files_by_suffix, + _iter_vars=_common.vars_from_source, + ): + """Yield a Variable for each declaration in the raw source code. + + Details are filled in from the given "known" variables and types. + """ + if isinstance(known, str): + known = _known_from_file(known) + dirnames = SOURCE_DIRS + suffixes = ('.c',) + filenames = _iter_files(dirnames, suffixes) + yield from _iter_vars(filenames, + preprocessed=preprocessed, + known=known, + handle_id=_handle_id, + ) + + +def supported_vars(*, + known=KNOWN_FILE, + ignored=IGNORED_FILE, + skip_objects=False, + _known_from_file=known_from_file, + _ignored_from_file=ignored_from_file, + _iter_vars=vars_from_binary, + _is_supported=is_supported, + ): + """Yield (var, is supported) for each found variable.""" + if isinstance(known, str): + known = _known_from_file(known) + if isinstance(ignored, str): + ignored = _ignored_from_file(ignored) + + for var in _iter_vars(known=known): + if not var.isglobal: + continue + elif var.vartype == UNKNOWN: + yield var, None + # XXX Support proper filters instead. + elif skip_objects and _is_object(found.vartype): + continue + else: + yield var, _is_supported(var, ignored, known) diff --git a/Tools/c-analyzer/cpython/known.py b/Tools/c-analyzer/cpython/known.py new file mode 100644 index 00000000..c3cc2c06 --- /dev/null +++ b/Tools/c-analyzer/cpython/known.py @@ -0,0 +1,66 @@ +import csv +import os.path + +from c_analyzer.parser.declarations import extract_storage +from c_analyzer.variables import known as _common +from c_analyzer.variables.info import Variable + +from . import DATA_DIR + + +# XXX need tests: +# * from_file() +# * look_up_variable() + + +DATA_FILE = os.path.join(DATA_DIR, 'known.tsv') + + +def _get_storage(decl, infunc): + # statics + if decl.startswith(('Py_LOCAL(', 'Py_LOCAL_INLINE(')): + return 'static' + if decl.startswith(('_Py_IDENTIFIER(', '_Py_static_string(')): + return 'static' + if decl.startswith('PyDoc_VAR('): + return 'static' + if decl.startswith(('SLOT1BINFULL(', 'SLOT1BIN(')): + return 'static' + if decl.startswith('WRAP_METHOD('): + return 'static' + # public extern + if decl.startswith('PyAPI_DATA('): + return 'extern' + # Fall back to the normal handler. + return extract_storage(decl, infunc=infunc) + + +def _handle_var(varid, decl): +# if varid.name == 'id' and decl == UNKNOWN: +# # None of these are variables. +# decl = 'int id'; + storage = _get_storage(decl, varid.funcname) + return Variable(varid, storage, decl) + + +def from_file(infile=DATA_FILE, *, + _from_file=_common.from_file, + _handle_var=_handle_var, + ): + """Return the info for known declarations in the given file.""" + return _from_file(infile, handle_var=_handle_var) + + +def look_up_variable(varid, knownvars, *, + _lookup=_common.look_up_variable, + ): + """Return the known variable matching the given ID. + + "knownvars" is a mapping of ID to Variable. + + "match_files" is used to verify if two filenames point to + the same file. + + If no match is found then None is returned. + """ + return _lookup(varid, knownvars) diff --git a/Tools/c-analyzer/cpython/supported.py b/Tools/c-analyzer/cpython/supported.py new file mode 100644 index 00000000..18786eef --- /dev/null +++ b/Tools/c-analyzer/cpython/supported.py @@ -0,0 +1,398 @@ +import os.path +import re + +from c_analyzer.common.info import ID +from c_analyzer.common.util import read_tsv, write_tsv + +from . import DATA_DIR + +# XXX need tests: +# * generate / script + + +IGNORED_FILE = os.path.join(DATA_DIR, 'ignored.tsv') + +IGNORED_COLUMNS = ('filename', 'funcname', 'name', 'kind', 'reason') +IGNORED_HEADER = '\t'.join(IGNORED_COLUMNS) + +# XXX Move these to ignored.tsv. +IGNORED = { + # global + 'PyImport_FrozenModules': 'process-global', + 'M___hello__': 'process-global', + 'inittab_copy': 'process-global', + 'PyHash_Func': 'process-global', + '_Py_HashSecret_Initialized': 'process-global', + '_TARGET_LOCALES': 'process-global', + + # startup (only changed before/during) + '_PyRuntime': 'runtime startup', + 'runtime_initialized': 'runtime startup', + 'static_arg_parsers': 'runtime startup', + 'orig_argv': 'runtime startup', + 'opt_ptr': 'runtime startup', + '_preinit_warnoptions': 'runtime startup', + '_Py_StandardStreamEncoding': 'runtime startup', + 'Py_FileSystemDefaultEncoding': 'runtime startup', + '_Py_StandardStreamErrors': 'runtime startup', + 'Py_FileSystemDefaultEncodeErrors': 'runtime startup', + 'Py_BytesWarningFlag': 'runtime startup', + 'Py_DebugFlag': 'runtime startup', + 'Py_DontWriteBytecodeFlag': 'runtime startup', + 'Py_FrozenFlag': 'runtime startup', + 'Py_HashRandomizationFlag': 'runtime startup', + 'Py_IgnoreEnvironmentFlag': 'runtime startup', + 'Py_InspectFlag': 'runtime startup', + 'Py_InteractiveFlag': 'runtime startup', + 'Py_IsolatedFlag': 'runtime startup', + 'Py_NoSiteFlag': 'runtime startup', + 'Py_NoUserSiteDirectory': 'runtime startup', + 'Py_OptimizeFlag': 'runtime startup', + 'Py_QuietFlag': 'runtime startup', + 'Py_UTF8Mode': 'runtime startup', + 'Py_UnbufferedStdioFlag': 'runtime startup', + 'Py_VerboseFlag': 'runtime startup', + '_Py_path_config': 'runtime startup', + '_PyOS_optarg': 'runtime startup', + '_PyOS_opterr': 'runtime startup', + '_PyOS_optind': 'runtime startup', + '_Py_HashSecret': 'runtime startup', + + # REPL + '_PyOS_ReadlineLock': 'repl', + '_PyOS_ReadlineTState': 'repl', + + # effectively const + 'tracemalloc_empty_traceback': 'const', + '_empty_bitmap_node': 'const', + 'posix_constants_pathconf': 'const', + 'posix_constants_confstr': 'const', + 'posix_constants_sysconf': 'const', + '_PySys_ImplCacheTag': 'const', + '_PySys_ImplName': 'const', + 'PyImport_Inittab': 'const', + '_PyImport_DynLoadFiletab': 'const', + '_PyParser_Grammar': 'const', + 'Py_hexdigits': 'const', + '_PyImport_Inittab': 'const', + '_PyByteArray_empty_string': 'const', + '_PyLong_DigitValue': 'const', + '_Py_SwappedOp': 'const', + 'PyStructSequence_UnnamedField': 'const', + + # signals are main-thread only + 'faulthandler_handlers': 'signals are main-thread only', + 'user_signals': 'signals are main-thread only', + 'wakeup': 'signals are main-thread only', + + # hacks + '_PySet_Dummy': 'only used as a placeholder', + } + +BENIGN = 'races here are benign and unlikely' + + +def is_supported(variable, ignored=None, known=None, *, + _ignored=(lambda *a, **k: _is_ignored(*a, **k)), + _vartype_okay=(lambda *a, **k: _is_vartype_okay(*a, **k)), + ): + """Return True if the given global variable is okay in CPython.""" + if _ignored(variable, + ignored and ignored.get('variables')): + return True + elif _vartype_okay(variable.vartype, + ignored.get('types')): + return True + else: + return False + + +def _is_ignored(variable, ignoredvars=None, *, + _IGNORED=IGNORED, + ): + """Return the reason if the variable is a supported global. + + Return None if the variable is not a supported global. + """ + if ignoredvars and (reason := ignoredvars.get(variable.id)): + return reason + + if variable.funcname is None: + if reason := _IGNORED.get(variable.name): + return reason + + # compiler + if variable.filename == 'Python/graminit.c': + if variable.vartype.startswith('static state '): + return 'compiler' + if variable.filename == 'Python/symtable.c': + if variable.vartype.startswith('static identifier '): + return 'compiler' + if variable.filename == 'Python/Python-ast.c': + # These should be const. + if variable.name.endswith('_field'): + return 'compiler' + if variable.name.endswith('_attribute'): + return 'compiler' + + # other + if variable.filename == 'Python/dtoa.c': + # guarded by lock? + if variable.name in ('p5s', 'freelist'): + return 'dtoa is thread-safe?' + if variable.name in ('private_mem', 'pmem_next'): + return 'dtoa is thread-safe?' + if variable.filename == 'Python/thread.c': + # Threads do not become an issue until after these have been set + # and these never get changed after that. + if variable.name in ('initialized', 'thread_debug'): + return 'thread-safe' + if variable.filename == 'Python/getversion.c': + if variable.name == 'version': + # Races are benign here, as well as unlikely. + return BENIGN + if variable.filename == 'Python/fileutils.c': + if variable.name == 'force_ascii': + return BENIGN + if variable.name == 'ioctl_works': + return BENIGN + if variable.name == '_Py_open_cloexec_works': + return BENIGN + if variable.filename == 'Python/codecs.c': + if variable.name == 'ucnhash_CAPI': + return BENIGN + if variable.filename == 'Python/bootstrap_hash.c': + if variable.name == 'getrandom_works': + return BENIGN + if variable.filename == 'Objects/unicodeobject.c': + if variable.name == 'ucnhash_CAPI': + return BENIGN + if variable.name == 'bloom_linebreak': + # *mostly* benign + return BENIGN + if variable.filename == 'Modules/getbuildinfo.c': + if variable.name == 'buildinfo': + # The static is used for pre-allocation. + return BENIGN + if variable.filename == 'Modules/posixmodule.c': + if variable.name == 'ticks_per_second': + return BENIGN + if variable.name == 'dup3_works': + return BENIGN + if variable.filename == 'Modules/timemodule.c': + if variable.name == 'ticks_per_second': + return BENIGN + if variable.filename == 'Objects/longobject.c': + if variable.name == 'log_base_BASE': + return BENIGN + if variable.name == 'convwidth_base': + return BENIGN + if variable.name == 'convmultmax_base': + return BENIGN + + return None + + +def _is_vartype_okay(vartype, ignoredtypes=None): + if _is_object(vartype): + return None + + if vartype.startswith('static const '): + return 'const' + if vartype.startswith('const '): + return 'const' + + # components for TypeObject definitions + for name in ('PyMethodDef', 'PyGetSetDef', 'PyMemberDef'): + if name in vartype: + return 'const' + for name in ('PyNumberMethods', 'PySequenceMethods', 'PyMappingMethods', + 'PyBufferProcs', 'PyAsyncMethods'): + if name in vartype: + return 'const' + for name in ('slotdef', 'newfunc'): + if name in vartype: + return 'const' + + # structseq + for name in ('PyStructSequence_Desc', 'PyStructSequence_Field'): + if name in vartype: + return 'const' + + # other definiitions + if 'PyModuleDef' in vartype: + return 'const' + + # thread-safe + if '_Py_atomic_int' in vartype: + return 'thread-safe' + if 'pthread_condattr_t' in vartype: + return 'thread-safe' + + # startup + if '_Py_PreInitEntry' in vartype: + return 'startup' + + # global +# if 'PyMemAllocatorEx' in vartype: +# return True + + # others +# if 'PyThread_type_lock' in vartype: +# return True + + # XXX ??? + # _Py_tss_t + # _Py_hashtable_t + # stack_t + # _PyUnicode_Name_CAPI + + # functions + if '(' in vartype and '[' not in vartype: + return 'function pointer' + + # XXX finish! + # * allow const values? + #raise NotImplementedError + return None + + +PYOBJECT_RE = re.compile(r''' + ^ + ( + # must start with "static " + static \s+ + ( + identifier + ) + \b + ) | + ( + # may start with "static " + ( static \s+ )? + ( + .* + ( + PyObject | + PyTypeObject | + _? Py \w+ Object | + _PyArg_Parser | + _Py_Identifier | + traceback_t | + PyAsyncGenASend | + _PyAsyncGenWrappedValue | + PyContext | + method_cache_entry + ) + \b + ) | + ( + ( + _Py_IDENTIFIER | + _Py_static_string + ) + [(] + ) + ) + ''', re.VERBOSE) + + +def _is_object(vartype): + if 'PyDictKeysObject' in vartype: + return False + if PYOBJECT_RE.match(vartype): + return True + if vartype.endswith((' _Py_FalseStruct', ' _Py_TrueStruct')): + return True + + # XXX Add more? + + #for part in vartype.split(): + # # XXX const is automatic True? + # if part == 'PyObject' or part.startswith('PyObject['): + # return True + return False + + +def ignored_from_file(infile, *, + _read_tsv=read_tsv, + ): + """Yield a Variable for each ignored var in the file.""" + ignored = { + 'variables': {}, + #'types': {}, + #'constants': {}, + #'macros': {}, + } + for row in _read_tsv(infile, IGNORED_HEADER): + filename, funcname, name, kind, reason = row + if not funcname or funcname == '-': + funcname = None + id = ID(filename, funcname, name) + if kind == 'variable': + values = ignored['variables'] + else: + raise ValueError(f'unsupported kind in row {row}') + values[id] = reason + return ignored + + +################################## +# generate + +def _get_row(varid, reason): + return ( + varid.filename, + varid.funcname or '-', + varid.name, + 'variable', + str(reason), + ) + + +def _get_rows(variables, ignored=None, *, + _as_row=_get_row, + _is_ignored=_is_ignored, + _vartype_okay=_is_vartype_okay, + ): + count = 0 + for variable in variables: + reason = _is_ignored(variable, + ignored and ignored.get('variables'), + ) + if not reason: + reason = _vartype_okay(variable.vartype, + ignored and ignored.get('types')) + if not reason: + continue + + print(' ', variable, repr(reason)) + yield _as_row(variable.id, reason) + count += 1 + print(f'total: {count}') + + +def _generate_ignored_file(variables, filename=None, *, + _generate_rows=_get_rows, + _write_tsv=write_tsv, + ): + if not filename: + filename = IGNORED_FILE + '.new' + rows = _generate_rows(variables) + _write_tsv(filename, IGNORED_HEADER, rows) + + +if __name__ == '__main__': + from cpython import SOURCE_DIRS + from cpython.known import ( + from_file as known_from_file, + DATA_FILE as KNOWN_FILE, + ) + # XXX This is wrong! + from . import find + known = known_from_file(KNOWN_FILE) + knownvars = (known or {}).get('variables') + variables = find.globals_from_binary(knownvars=knownvars, + dirnames=SOURCE_DIRS) + + _generate_ignored_file(variables) diff --git a/Tools/c-analyzer/ignored-globals.txt b/Tools/c-analyzer/ignored-globals.txt new file mode 100644 index 00000000..ce6d1d80 --- /dev/null +++ b/Tools/c-analyzer/ignored-globals.txt @@ -0,0 +1,492 @@ +# All variables declared here are shared between all interpreters +# in a single process. That means that they must not be changed +# unless that change should apply to all interpreters. +# +# See check-c-globals.py. +# +# Many generic names are handled via the script: +# +# * most exceptions and all warnings handled via _is_exception() +# * for builtin modules, generic names are handled via _is_module() +# * generic names for static types handled via _is_type_var() +# * AST vars handled via _is_compiler() + + +####################################### +# main + +# Modules/getpath.c +exec_prefix +module_search_path +prefix +progpath + +# Modules/main.c +orig_argc +orig_argv + +# Python/getopt.c +opt_ptr +_PyOS_optarg +_PyOS_opterr +_PyOS_optind + + +####################################### +# REPL + +# Parser/myreadline.c +PyOS_InputHook +PyOS_ReadlineFunctionPointer +_PyOS_ReadlineLock +_PyOS_ReadlineTState + + +####################################### +# state + +# Python/dtoa.c +p5s +pmem_next # very slight race +private_mem # very slight race + +# Python/import.c +# For the moment the import lock stays global. Ultimately there should +# be a global lock for extension modules and a per-interpreter lock. +import_lock +import_lock_level +import_lock_thread + +# Python/pylifecycle.c +_PyRuntime + + +#--------------------------------- +# module globals (PyObject) + +# Modules/_functoolsmodule.c +kwd_mark + +# Modules/_localemodule.c +Error + +# Modules/_threadmodule.c +ThreadError + +# Modules/_tracemalloc.c +unknown_filename + +# Modules/gcmodule.c +gc_str + +# Modules/posixmodule.c +billion +posix_putenv_garbage + +# Modules/signalmodule.c +DefaultHandler +IgnoreHandler +IntHandler +ItimerError + +# Modules/zipimport.c +ZipImportError +zip_directory_cache + + +#--------------------------------- +# module globals (other) + +# Modules/_tracemalloc.c +allocators +tables_lock +tracemalloc_config +tracemalloc_empty_traceback +tracemalloc_filenames +tracemalloc_peak_traced_memory +tracemalloc_reentrant_key +tracemalloc_traceback +tracemalloc_tracebacks +tracemalloc_traced_memory +tracemalloc_traces + +# Modules/faulthandler.c +fatal_error +faulthandler_handlers +old_stack +stack +thread +user_signals + +# Modules/posixmodule.c +posix_constants_confstr +posix_constants_pathconf +posix_constants_sysconf +structseq_new +ticks_per_second + +# Modules/signalmodule.c +Handlers # main thread only +is_tripped # main thread only +main_pid +main_thread +old_siginthandler +wakeup_fd # main thread only + +# Modules/zipimport.c +zip_searchorder + +# Python/bltinmodule.c +Py_FileSystemDefaultEncodeErrors +Py_FileSystemDefaultEncoding +Py_HasFileSystemDefaultEncoding + +# Python/sysmodule.c +_PySys_ImplCacheTag +_PySys_ImplName + + +#--------------------------------- +# freelists + +# Modules/_collectionsmodule.c +freeblocks +numfreeblocks + +# Objects/classobject.c +free_list +numfree + +# Objects/dictobject.c +free_list +keys_free_list +numfree +numfreekeys + +# Objects/exceptions.c +memerrors_freelist +memerrors_numfree + +# Objects/floatobject.c +free_list +numfree + +# Objects/frameobject.c +free_list +numfree + +# Objects/genobject.c +ag_asend_freelist +ag_asend_freelist_free +ag_value_freelist +ag_value_freelist_free + +# Objects/listobject.c +free_list +numfree + +# Objects/methodobject.c +free_list +numfree + +# Objects/sliceobject.c +slice_cache # slight race + +# Objects/tupleobject.c +free_list +numfree + +# Python/dtoa.c +freelist # very slight race + + +#--------------------------------- +# caches (PyObject) + +# Objects/typeobject.c +method_cache # only for static types +next_version_tag # only for static types + +# Python/dynload_shlib.c +handles # slight race during import +nhandles # slight race during import + +# Python/import.c +extensions # slight race on init during import + + +#--------------------------------- +# caches (other) + +# Python/bootstrap_hash.c +urandom_cache + +# Python/modsupport.c +_Py_PackageContext # Slight race during import! Move to PyThreadState? + + +#--------------------------------- +# counters + +# Objects/bytesobject.c +null_strings +one_strings + +# Objects/dictobject.c +pydict_global_version + +# Objects/moduleobject.c +max_module_number # slight race during import + + +####################################### +# constants + +#--------------------------------- +# singletons + +# Objects/boolobject.c +_Py_FalseStruct +_Py_TrueStruct + +# Objects/object.c +_Py_NoneStruct +_Py_NotImplementedStruct + +# Objects/sliceobject.c +_Py_EllipsisObject + + +#--------------------------------- +# constants (other) + +# Modules/config.c +_PyImport_Inittab + +# Objects/bytearrayobject.c +_PyByteArray_empty_string + +# Objects/dictobject.c +empty_keys_struct +empty_values + +# Objects/floatobject.c +detected_double_format +detected_float_format +double_format +float_format + +# Objects/longobject.c +_PyLong_DigitValue + +# Objects/object.c +_Py_SwappedOp + +# Objects/obmalloc.c +_PyMem_Debug + +# Objects/setobject.c +_dummy_struct + +# Objects/structseq.c +PyStructSequence_UnnamedField + +# Objects/typeobject.c +name_op +slotdefs # almost +slotdefs_initialized # almost +subtype_getsets_dict_only +subtype_getsets_full +subtype_getsets_weakref_only +tp_new_methoddef + +# Objects/unicodeobject.c +bloom_linebreak +static_strings # slight race + +# Parser/tokenizer.c +_PyParser_TokenNames + +# Python/Python-ast.c +alias_fields + +# Python/codecs.c +Py_hexdigits +ucnhash_CAPI # slight performance-only race + +# Python/dynload_shlib.c +_PyImport_DynLoadFiletab + +# Python/fileutils.c +_Py_open_cloexec_works +force_ascii + +# Python/frozen.c +M___hello__ +PyImport_FrozenModules + +# Python/graminit.c +_PyParser_Grammar +dfas +labels + +# Python/import.c +PyImport_Inittab + +# Python/pylifecycle.c +_TARGET_LOCALES + + +#--------------------------------- +# initialized (PyObject) + +# Objects/bytesobject.c +characters +nullstring + +# Objects/exceptions.c +PyExc_RecursionErrorInst +errnomap + +# Objects/longobject.c +_PyLong_One +_PyLong_Zero +small_ints + +# Objects/setobject.c +emptyfrozenset + +# Objects/unicodeobject.c +interned # slight race on init in PyUnicode_InternInPlace() +unicode_empty +unicode_latin1 + + +#--------------------------------- +# initialized (other) + +# Python/getargs.c +static_arg_parsers + +# Python/pyhash.c +PyHash_Func +_Py_HashSecret +_Py_HashSecret_Initialized + +# Python/pylifecycle.c +_Py_StandardStreamEncoding +_Py_StandardStreamErrors +default_home +env_home +progname +Py_BytesWarningFlag +Py_DebugFlag +Py_DontWriteBytecodeFlag +Py_FrozenFlag +Py_HashRandomizationFlag +Py_IgnoreEnvironmentFlag +Py_InspectFlag +Py_InteractiveFlag +Py_IsolatedFlag +Py_NoSiteFlag +Py_NoUserSiteDirectory +Py_OptimizeFlag +Py_QuietFlag +Py_UnbufferedStdioFlag +Py_VerboseFlag + + +#--------------------------------- +# types + +# Modules/_threadmodule.c +Locktype +RLocktype +localdummytype +localtype + +# Objects/exceptions.c +PyExc_BaseException +PyExc_Exception +PyExc_GeneratorExit +PyExc_KeyboardInterrupt +PyExc_StopAsyncIteration +PyExc_StopIteration +PyExc_SystemExit +_PyExc_BaseException +_PyExc_Exception +_PyExc_GeneratorExit +_PyExc_KeyboardInterrupt +_PyExc_StopAsyncIteration +_PyExc_StopIteration +_PyExc_SystemExit + +# Objects/structseq.c +_struct_sequence_template + + +#--------------------------------- +# interned strings/bytes + +# Modules/_io/_iomodule.c +_PyIO_empty_bytes +_PyIO_empty_str +_PyIO_str_close +_PyIO_str_closed +_PyIO_str_decode +_PyIO_str_encode +_PyIO_str_fileno +_PyIO_str_flush +_PyIO_str_getstate +_PyIO_str_isatty +_PyIO_str_newlines +_PyIO_str_nl +_PyIO_str_read +_PyIO_str_read1 +_PyIO_str_readable +_PyIO_str_readall +_PyIO_str_readinto +_PyIO_str_readline +_PyIO_str_reset +_PyIO_str_seek +_PyIO_str_seekable +_PyIO_str_setstate +_PyIO_str_tell +_PyIO_str_truncate +_PyIO_str_writable +_PyIO_str_write + +# Modules/_threadmodule.c +str_dict + +# Objects/boolobject.c +false_str +true_str + +# Objects/listobject.c +indexerr + +# Python/symtable.c +__class__ +dictcomp +genexpr +lambda +listcomp +setcomp +top + +# Python/sysmodule.c +whatstrings + + +####################################### +# hacks + +# Objects/object.c +_Py_abstract_hack + +# Objects/setobject.c +_PySet_Dummy + +# Python/pylifecycle.c +_PyOS_mystrnicmp_hack diff --git a/Tools/c-analyzer/ignored.tsv b/Tools/c-analyzer/ignored.tsv new file mode 100644 index 00000000..a0e0e503 --- /dev/null +++ b/Tools/c-analyzer/ignored.tsv @@ -0,0 +1 @@ +filename funcname name kind reason diff --git a/Tools/c-analyzer/known.tsv b/Tools/c-analyzer/known.tsv new file mode 100644 index 00000000..db44080b --- /dev/null +++ b/Tools/c-analyzer/known.tsv @@ -0,0 +1,1930 @@ +filename funcname name kind declaration +Modules/_abc.c - _abc_data_type variable static PyTypeObject _abc_data_type +Modules/_abc.c - abc_invalidation_counter variable static unsigned long long abc_invalidation_counter +Modules/_abc.c - _abcmodule variable static struct PyModuleDef _abcmodule +Python/import.c import_find_and_load accumulated variable static _PyTime_t accumulated +Modules/itertoolsmodule.c - accumulate_methods variable static PyMethodDef accumulate_methods +Modules/itertoolsmodule.c - accumulate_type variable static PyTypeObject accumulate_type +Python/Python-ast.c - Add_singleton variable static PyObject *Add_singleton +Python/Python-ast.c - Add_type variable static PyTypeObject *Add_type +Objects/genobject.c - ag_asend_freelist variable static PyAsyncGenASend *ag_asend_freelist[_PyAsyncGen_MAXFREELIST] +Objects/genobject.c - ag_asend_freelist_free variable static int ag_asend_freelist_free +Objects/genobject.c - ag_value_freelist variable static _PyAsyncGenWrappedValue *ag_value_freelist[_PyAsyncGen_MAXFREELIST] +Objects/genobject.c - ag_value_freelist_free variable static int ag_value_freelist_free +Python/Python-ast.c - alias_fields variable static const char *alias_fields[] +Python/Python-ast.c - alias_type variable static PyTypeObject *alias_type +Modules/_tracemalloc.c - allocators variable static struct { PyMemAllocatorEx mem; PyMemAllocatorEx raw; PyMemAllocatorEx obj; } allocators +Python/Python-ast.c - And_singleton variable static PyObject *And_singleton +Python/Python-ast.c - And_type variable static PyTypeObject *And_type +Python/Python-ast.c - AnnAssign_fields variable static const char *AnnAssign_fields[] +Python/Python-ast.c - AnnAssign_type variable static PyTypeObject *AnnAssign_type +Python/compile.c - __annotations__ variable static PyObject *__annotations__ +Objects/obmalloc.c - arenas variable static struct arena_object* arenas +Python/Python-ast.c - arg_attributes variable static const char *arg_attributes[] +Python/Python-ast.c - arg_fields variable static const char *arg_fields[] +Python/Python-ast.c - arg_type variable static PyTypeObject *arg_type +Python/Python-ast.c - arguments_fields variable static const char *arguments_fields[] +Python/Python-ast.c - arguments_type variable static PyTypeObject *arguments_type +Python/Python-ast.c - Assert_fields variable static const char *Assert_fields[] +Python/compile.c compiler_assert assertion_error variable static PyObject *assertion_error +Python/Python-ast.c - Assert_type variable static PyTypeObject *Assert_type +Python/Python-ast.c - Assign_fields variable static const char *Assign_fields[] +Python/Python-ast.c - Assign_type variable static PyTypeObject *Assign_type +Python/Python-ast.c - _astmodule variable static struct PyModuleDef _astmodule +Python/Python-ast.c - AST_type variable static PyTypeObject AST_type +Python/Python-ast.c - ast_type_getsets variable static PyGetSetDef ast_type_getsets[] +Python/Python-ast.c - ast_type_methods variable static PyMethodDef ast_type_methods +Python/Python-ast.c - AsyncFor_fields variable static const char *AsyncFor_fields[] +Python/Python-ast.c - AsyncFor_type variable static PyTypeObject *AsyncFor_type +Python/Python-ast.c - AsyncFunctionDef_fields variable static const char *AsyncFunctionDef_fields[] +Python/Python-ast.c - AsyncFunctionDef_type variable static PyTypeObject *AsyncFunctionDef_type +Objects/genobject.c - async_gen_as_async variable static PyAsyncMethods async_gen_as_async +Objects/genobject.c - async_gen_asend_as_async variable static PyAsyncMethods async_gen_asend_as_async +Objects/genobject.c - async_gen_asend_methods variable static PyMethodDef async_gen_asend_methods +Objects/genobject.c - async_gen_athrow_as_async variable static PyAsyncMethods async_gen_athrow_as_async +Objects/genobject.c - async_gen_athrow_methods variable static PyMethodDef async_gen_athrow_methods +Objects/genobject.c - async_gen_getsetlist variable static PyGetSetDef async_gen_getsetlist[] +Python/sysmodule.c - asyncgen_hooks_desc variable static PyStructSequence_Desc asyncgen_hooks_desc +Python/sysmodule.c - asyncgen_hooks_fields variable static PyStructSequence_Field asyncgen_hooks_fields[] +Python/sysmodule.c - AsyncGenHooksType variable static PyTypeObject AsyncGenHooksType +Objects/genobject.c - async_gen_memberlist variable static PyMemberDef async_gen_memberlist[] +Objects/genobject.c - async_gen_methods variable static PyMethodDef async_gen_methods +Python/Python-ast.c - AsyncWith_fields variable static const char *AsyncWith_fields[] +Python/Python-ast.c - AsyncWith_type variable static PyTypeObject *AsyncWith_type +Parser/listnode.c - atbol variable static int atbol +Modules/atexitmodule.c - atexit_methods variable static PyMethodDef atexit_methods +Modules/atexitmodule.c - atexitmodule variable static struct PyModuleDef atexitmodule +Modules/atexitmodule.c - atexit_slots variable static PyModuleDef_Slot atexit_slots[] +Modules/_operator.c - attrgetter_methods variable static PyMethodDef attrgetter_methods +Modules/_operator.c - attrgetter_type variable static PyTypeObject attrgetter_type +Python/Python-ast.c - Attribute_fields variable static const char *Attribute_fields[] +Python/Python-ast.c - Attribute_type variable static PyTypeObject *Attribute_type +Python/Python-ast.c - AugAssign_fields variable static const char *AugAssign_fields[] +Python/Python-ast.c - AugAssign_type variable static PyTypeObject *AugAssign_type +Python/Python-ast.c - AugLoad_singleton variable static PyObject *AugLoad_singleton +Python/Python-ast.c - AugLoad_type variable static PyTypeObject *AugLoad_type +Python/Python-ast.c - AugStore_singleton variable static PyObject *AugStore_singleton +Python/Python-ast.c - AugStore_type variable static PyTypeObject *AugStore_type +Python/Python-ast.c - Await_fields variable static const char *Await_fields[] +Python/Python-ast.c - Await_type variable static PyTypeObject *Await_type +Objects/exceptions.c - BaseException_getset variable static PyGetSetDef BaseException_getset[] +Objects/exceptions.c - BaseException_members variable static struct PyMemberDef BaseException_members[] +Objects/exceptions.c - BaseException_methods variable static PyMethodDef BaseException_methods +Modules/posixmodule.c - billion variable static PyObject *billion +Python/Python-ast.c - BinOp_fields variable static const char *BinOp_fields[] +Python/Python-ast.c - BinOp_type variable static PyTypeObject *BinOp_type +Python/Python-ast.c - BitAnd_singleton variable static PyObject *BitAnd_singleton +Python/Python-ast.c - BitAnd_type variable static PyTypeObject *BitAnd_type +Python/Python-ast.c - BitOr_singleton variable static PyObject *BitOr_singleton +Python/Python-ast.c - BitOr_type variable static PyTypeObject *BitOr_type +Python/Python-ast.c - BitXor_singleton variable static PyObject *BitXor_singleton +Python/Python-ast.c - BitXor_type variable static PyTypeObject *BitXor_type +Objects/unicodeobject.c - bloom_linebreak variable static BLOOM_MASK bloom_linebreak +Objects/boolobject.c - bool_as_number variable static PyNumberMethods bool_as_number +Python/Python-ast.c - BoolOp_fields variable static const char *BoolOp_fields[] +Python/Python-ast.c - boolop_type variable static PyTypeObject *boolop_type +Python/Python-ast.c - BoolOp_type variable static PyTypeObject *BoolOp_type +Python/_warnings.c is_internal_frame bootstrap_string variable static PyObject *bootstrap_string +Python/Python-ast.c - Break_type variable static PyTypeObject *Break_type +Modules/_io/bufferedio.c - bufferediobase_methods variable static PyMethodDef bufferediobase_methods +Modules/_io/bufferedio.c - bufferedrandom_getset variable static PyGetSetDef bufferedrandom_getset[] +Modules/_io/bufferedio.c - bufferedrandom_members variable static PyMemberDef bufferedrandom_members[] +Modules/_io/bufferedio.c - bufferedrandom_methods variable static PyMethodDef bufferedrandom_methods +Modules/_io/bufferedio.c - bufferedreader_getset variable static PyGetSetDef bufferedreader_getset[] +Modules/_io/bufferedio.c - bufferedreader_members variable static PyMemberDef bufferedreader_members[] +Modules/_io/bufferedio.c - bufferedreader_methods variable static PyMethodDef bufferedreader_methods +Modules/_io/bufferedio.c - bufferedrwpair_getset variable static PyGetSetDef bufferedrwpair_getset[] +Modules/_io/bufferedio.c - bufferedrwpair_methods variable static PyMethodDef bufferedrwpair_methods +Modules/_io/bufferedio.c - bufferedwriter_getset variable static PyGetSetDef bufferedwriter_getset[] +Modules/_io/bufferedio.c - bufferedwriter_members variable static PyMemberDef bufferedwriter_members[] +Modules/_io/bufferedio.c - bufferedwriter_methods variable static PyMethodDef bufferedwriter_methods +Modules/getbuildinfo.c Py_GetBuildInfo buildinfo variable static char buildinfo[50 + sizeof(GITVERSION) + ((sizeof(GITTAG) > sizeof(GITBRANCH)) ? sizeof(GITTAG) : sizeof(GITBRANCH))] +Python/bltinmodule.c - builtin_methods variable static PyMethodDef builtin_methods +Python/bltinmodule.c - builtinsmodule variable static struct PyModuleDef builtinsmodule +Python/import.c PyImport_Import builtins_str variable static PyObject *builtins_str +Python/ceval.c make_pending_calls busy variable static int busy +Objects/bytearrayobject.c - bytearray_as_buffer variable static PyBufferProcs bytearray_as_buffer +Objects/bytearrayobject.c - bytearray_as_mapping variable static PyMappingMethods bytearray_as_mapping +Objects/bytearrayobject.c - bytearray_as_number variable static PyNumberMethods bytearray_as_number +Objects/bytearrayobject.c - bytearray_as_sequence variable static PySequenceMethods bytearray_as_sequence +Objects/bytearrayobject.c - bytearrayiter_methods variable static PyMethodDef bytearrayiter_methods +Objects/bytearrayobject.c - bytearray_methods variable static PyMethodDef bytearray_methods +Objects/bytesobject.c - bytes_as_buffer variable static PyBufferProcs bytes_as_buffer +Objects/bytesobject.c - bytes_as_mapping variable static PyMappingMethods bytes_as_mapping +Objects/bytesobject.c - bytes_as_number variable static PyNumberMethods bytes_as_number +Objects/bytesobject.c - bytes_as_sequence variable static PySequenceMethods bytes_as_sequence +Modules/_io/bytesio.c - bytesiobuf_as_buffer variable static PyBufferProcs bytesiobuf_as_buffer +Modules/_io/bytesio.c - bytesio_getsetlist variable static PyGetSetDef bytesio_getsetlist[] +Modules/_io/bytesio.c - bytesio_methods variable static PyMethodDef bytesio_methods +Objects/bytesobject.c - bytes_methods variable static PyMethodDef bytes_methods +Python/thread_pthread.h init_condattr ca variable static pthread_condattr_t ca +Python/Python-ast.c - Call_fields variable static const char *Call_fields[] +Objects/iterobject.c - calliter_methods variable static PyMethodDef calliter_methods +Python/Python-ast.c - Call_type variable static PyTypeObject *Call_type +Objects/cellobject.c - cell_getsetlist variable static PyGetSetDef cell_getsetlist[] +Modules/itertoolsmodule.c - chain_methods variable static PyMethodDef chain_methods +Modules/itertoolsmodule.c - chain_type variable static PyTypeObject chain_type +Objects/bytesobject.c - characters variable static PyBytesObject *characters[UCHAR_MAX + 1] +Python/symtable.c - __class__ variable static identifier __class__ +Python/Python-ast.c - ClassDef_fields variable static const char *ClassDef_fields[] +Python/Python-ast.c - ClassDef_type variable static PyTypeObject *ClassDef_type +Objects/funcobject.c - cm_getsetlist variable static PyGetSetDef cm_getsetlist[] +Objects/funcobject.c - cm_memberlist variable static PyMemberDef cm_memberlist[] +Python/Python-ast.c - cmpop_type variable static PyTypeObject *cmpop_type +Modules/_codecsmodule.c - _codecs_functions variable static PyMethodDef _codecs_functions[] +Modules/_codecsmodule.c - codecsmodule variable static struct PyModuleDef codecsmodule +Objects/codeobject.c - code_memberlist variable static PyMemberDef code_memberlist[] +Objects/codeobject.c - code_methods variable static PyMethodDef code_methods +Modules/_collectionsmodule.c - _collectionsmodule variable static struct PyModuleDef _collectionsmodule +Modules/itertoolsmodule.c - combinations_methods variable static PyMethodDef combinations_methods +Modules/itertoolsmodule.c - combinations_type variable static PyTypeObject combinations_type +Objects/typeobject.c object_new comma_id variable _Py_static_string(comma_id, "", "") +Python/Python-ast.c - Compare_fields variable static const char *Compare_fields[] +Python/Python-ast.c - Compare_type variable static PyTypeObject *Compare_type +Objects/complexobject.c - complex_as_number variable static PyNumberMethods complex_as_number +Objects/complexobject.c - complex_members variable static PyMemberDef complex_members[] +Objects/complexobject.c - complex_methods variable static PyMethodDef complex_methods +Python/Python-ast.c - comprehension_fields variable static const char *comprehension_fields[] +Python/Python-ast.c - comprehension_type variable static PyTypeObject *comprehension_type +Modules/itertoolsmodule.c - compress_methods variable static PyMethodDef compress_methods +Modules/itertoolsmodule.c - compress_type variable static PyTypeObject compress_type +Python/thread_pthread.h - condattr_monotonic variable static pthread_condattr_t *condattr_monotonic +Python/Python-ast.c - Constant_fields variable static const char *Constant_fields[] +Python/Python-ast.c - Constant_type variable static PyTypeObject *Constant_type +Python/Python-ast.c - Continue_type variable static PyTypeObject *Continue_type +Objects/longobject.c PyLong_FromString convmultmax_base variable static twodigits convmultmax_base[37] +Objects/longobject.c PyLong_FromString convwidth_base variable static int convwidth_base[37] +Objects/genobject.c - coro_as_async variable static PyAsyncMethods coro_as_async +Objects/genobject.c - coro_getsetlist variable static PyGetSetDef coro_getsetlist[] +Objects/genobject.c - coro_memberlist variable static PyMemberDef coro_memberlist[] +Objects/genobject.c - coro_methods variable static PyMethodDef coro_methods +Objects/genobject.c - coro_wrapper_methods variable static PyMethodDef coro_wrapper_methods +Modules/itertoolsmodule.c - count_methods variable static PyMethodDef count_methods +Modules/itertoolsmodule.c - count_type variable static PyTypeObject count_type +Python/context.c - ctx_freelist variable static PyContext *ctx_freelist +Python/context.c - ctx_freelist_len variable static int ctx_freelist_len +Modules/itertoolsmodule.c - cwr_methods variable static PyMethodDef cwr_methods +Modules/itertoolsmodule.c - cwr_type variable static PyTypeObject cwr_type +Modules/itertoolsmodule.c - cycle_methods variable static PyMethodDef cycle_methods +Modules/itertoolsmodule.c - cycle_type variable static PyTypeObject cycle_type +Objects/obmalloc.c new_arena debug_stats variable static int debug_stats +Modules/signalmodule.c - DefaultHandler variable static PyObject *DefaultHandler +Modules/_collectionsmodule.c - defdict_members variable static PyMemberDef defdict_members[] +Modules/_collectionsmodule.c - defdict_methods variable static PyMethodDef defdict_methods +Modules/_collectionsmodule.c - defdict_type variable static PyTypeObject defdict_type +Python/Python-ast.c - Delete_fields variable static const char *Delete_fields[] +Python/Python-ast.c - Delete_type variable static PyTypeObject *Delete_type +Python/Python-ast.c - Del_singleton variable static PyObject *Del_singleton +Python/Python-ast.c - Del_type variable static PyTypeObject *Del_type +Modules/_collectionsmodule.c - deque_as_number variable static PyNumberMethods deque_as_number +Modules/_collectionsmodule.c - deque_as_sequence variable static PySequenceMethods deque_as_sequence +Modules/_collectionsmodule.c - deque_getset variable static PyGetSetDef deque_getset[] +Modules/_collectionsmodule.c - dequeiter_methods variable static PyMethodDef dequeiter_methods +Modules/_collectionsmodule.c - dequeiter_type variable static PyTypeObject dequeiter_type +Modules/_collectionsmodule.c - deque_methods variable static PyMethodDef deque_methods +Modules/_collectionsmodule.c - dequereviter_type variable static PyTypeObject dequereviter_type +Modules/_collectionsmodule.c - deque_type variable static PyTypeObject deque_type +Objects/descrobject.c - descr_members variable static PyMemberDef descr_members[] +Objects/descrobject.c - descr_methods variable static PyMethodDef descr_methods +Modules/_abc.c - _destroy_def variable static PyMethodDef _destroy_def +Objects/floatobject.c - detected_double_format variable static float_format_type detected_double_format +Objects/floatobject.c - detected_float_format variable static float_format_type detected_float_format +Objects/dictobject.c - dict_as_mapping variable static PyMappingMethods dict_as_mapping +Objects/dictobject.c - dict_as_sequence variable static PySequenceMethods dict_as_sequence +Python/symtable.c - dictcomp variable static identifier dictcomp +Python/Python-ast.c - DictComp_fields variable static const char *DictComp_fields[] +Python/Python-ast.c - DictComp_type variable static PyTypeObject *DictComp_type +Python/Python-ast.c - Dict_fields variable static const char *Dict_fields[] +Objects/dictobject.c - dictitems_as_sequence variable static PySequenceMethods dictitems_as_sequence +Objects/dictobject.c - dictitems_methods variable static PyMethodDef dictitems_methods +Objects/dictobject.c - dictiter_methods variable static PyMethodDef dictiter_methods +Objects/dictobject.c - dictkeys_as_sequence variable static PySequenceMethods dictkeys_as_sequence +Objects/dictobject.c - dictkeys_methods variable static PyMethodDef dictkeys_methods +Python/Python-ast.c - Dict_type variable static PyTypeObject *Dict_type +Objects/dictobject.c - dictvalues_as_sequence variable static PySequenceMethods dictvalues_as_sequence +Objects/dictobject.c - dictvalues_methods variable static PyMethodDef dictvalues_methods +Objects/dictobject.c - dictviews_as_number variable static PyNumberMethods dictviews_as_number +Modules/posixmodule.c - DirEntry_members variable static PyMemberDef DirEntry_members[] +Modules/posixmodule.c - DirEntry_methods variable static PyMethodDef DirEntry_methods +Modules/posixmodule.c - DirEntryType variable static PyTypeObject DirEntryType +Python/Python-ast.c - Div_singleton variable static PyObject *Div_singleton +Python/Python-ast.c - Div_type variable static PyTypeObject *Div_type +Python/compile.c - __doc__ variable static PyObject *__doc__ +Objects/classobject.c method_get_doc docstr variable static PyObject *docstr +Objects/classobject.c instancemethod_get_doc docstr variable static PyObject *docstr +Python/compile.c compiler_set_qualname dot variable _Py_static_string(dot, ""."") +Python/compile.c compiler_set_qualname dot_locals variable _Py_static_string(dot_locals, ""."") +Objects/floatobject.c - double_format variable static float_format_type double_format +Modules/itertoolsmodule.c - dropwhile_methods variable static PyMethodDef dropwhile_methods +Modules/itertoolsmodule.c - dropwhile_type variable static PyTypeObject dropwhile_type +Objects/setobject.c - _dummy_struct variable static PyObject _dummy_struct +Modules/posixmodule.c os_dup2_impl dup3_works variable static int dup3_works +Modules/_io/bufferedio.c _PyIO_trap_eintr eintr_int variable static PyObject *eintr_int +Objects/sliceobject.c - ellipsis_methods variable static PyMethodDef ellipsis_methods +Python/hamt.c - _empty_bitmap_node variable static PyHamtNode_Bitmap *_empty_bitmap_node +Objects/setobject.c - emptyfrozenset variable static PyObject *emptyfrozenset +Python/hamt.c - _empty_hamt variable static PyHamtObject *_empty_hamt +Objects/dictobject.c - empty_keys_struct variable static PyDictKeysObject empty_keys_struct +Objects/codeobject.c PyCode_NewEmpty emptystring variable static PyObject *emptystring +Python/compile.c compiler_from_import empty_string variable static PyObject *empty_string +Objects/dictobject.c - empty_values variable static PyObject *empty_values[1] +Objects/unicodeobject.c - encoding_map_methods variable static PyMethodDef encoding_map_methods +Objects/unicodeobject.c - EncodingMapType variable static PyTypeObject EncodingMapType +Objects/enumobject.c - enum_methods variable static PyMethodDef enum_methods +Python/Python-ast.c - Eq_singleton variable static PyObject *Eq_singleton +Python/Python-ast.c - Eq_type variable static PyTypeObject *Eq_type +Objects/exceptions.c - errnomap variable static PyObject *errnomap +Modules/errnomodule.c - errno_methods variable static PyMethodDef errno_methods +Modules/errnomodule.c - errnomodule variable static struct PyModuleDef errnomodule +Modules/_localemodule.c - Error variable static PyObject *Error +Python/Python-ast.c - excepthandler_attributes variable static const char *excepthandler_attributes[] +Python/Python-ast.c - ExceptHandler_fields variable static const char *ExceptHandler_fields[] +Python/Python-ast.c - excepthandler_type variable static PyTypeObject *excepthandler_type +Python/Python-ast.c - ExceptHandler_type variable static PyTypeObject *ExceptHandler_type +Modules/_threadmodule.c - ExceptHookArgs_desc variable static PyStructSequence_Desc ExceptHookArgs_desc +Modules/_threadmodule.c - ExceptHookArgs_fields variable static PyStructSequence_Field ExceptHookArgs_fields[] +Modules/_threadmodule.c - ExceptHookArgsType variable static PyTypeObject ExceptHookArgsType +Objects/exceptions.c _check_for_legacy_statements exec_prefix variable static PyObject *exec_prefix +Python/Python-ast.c - expr_attributes variable static const char *expr_attributes[] +Python/Python-ast.c - expr_context_type variable static PyTypeObject *expr_context_type +Python/Python-ast.c - Expression_fields variable static const char *Expression_fields[] +Python/Python-ast.c - Expression_type variable static PyTypeObject *Expression_type +Python/Python-ast.c - Expr_fields variable static const char *Expr_fields[] +Python/Python-ast.c - expr_type variable static PyTypeObject *expr_type +Python/Python-ast.c - Expr_type variable static PyTypeObject *Expr_type +Python/import.c - extensions variable static PyObject *extensions +Python/Python-ast.c - ExtSlice_fields variable static const char *ExtSlice_fields[] +Python/Python-ast.c - ExtSlice_type variable static PyTypeObject *ExtSlice_type +Objects/boolobject.c - false_str variable static PyObject *false_str +Modules/faulthandler.c - fatal_error variable static struct { int enabled; PyObject *file; int fd; int all_threads; PyInterpreterState *interp; void *exc_handler; } fatal_error +Modules/faulthandler.c - faulthandler_handlers variable static fault_handler_t faulthandler_handlers[] +Objects/stringlib/unicode_format.h - fieldnameiter_methods variable static PyMethodDef fieldnameiter_methods +Modules/_io/fileio.c - fileio_getsetlist variable static PyGetSetDef fileio_getsetlist[] +Modules/_io/fileio.c - fileio_members variable static PyMemberDef fileio_members[] +Modules/_io/fileio.c - fileio_methods variable static PyMethodDef fileio_methods +Modules/itertoolsmodule.c - filterfalse_methods variable static PyMethodDef filterfalse_methods +Modules/itertoolsmodule.c - filterfalse_type variable static PyTypeObject filterfalse_type +Python/bltinmodule.c - filter_methods variable static PyMethodDef filter_methods +Python/sysmodule.c - flags_desc variable static PyStructSequence_Desc flags_desc +Python/sysmodule.c - flags_fields variable static PyStructSequence_Field flags_fields[] +Python/sysmodule.c - FlagsType variable static PyTypeObject FlagsType +Objects/floatobject.c - float_as_number variable static PyNumberMethods float_as_number +Objects/floatobject.c - float_format variable static float_format_type +Objects/floatobject.c - float_getset variable static PyGetSetDef float_getset[] +Objects/floatobject.c - floatinfo_desc variable static PyStructSequence_Desc floatinfo_desc +Objects/floatobject.c - floatinfo_fields variable static PyStructSequence_Field floatinfo_fields[] +Objects/floatobject.c - FloatInfoType variable static PyTypeObject FloatInfoType +Objects/floatobject.c - float_methods variable static PyMethodDef float_methods +Python/Python-ast.c - FloorDiv_singleton variable static PyObject *FloorDiv_singleton +Python/Python-ast.c - FloorDiv_type variable static PyTypeObject *FloorDiv_type +Python/fileutils.c - force_ascii variable static int force_ascii +Python/Python-ast.c - For_fields variable static const char *For_fields[] +Python/Python-ast.c - FormattedValue_fields variable static const char *FormattedValue_fields[] +Python/Python-ast.c - FormattedValue_type variable static PyTypeObject *FormattedValue_type +Objects/stringlib/unicode_format.h - formatteriter_methods variable static PyMethodDef formatteriter_methods +Python/Python-ast.c - For_type variable static PyTypeObject *For_type +Objects/frameobject.c - frame_getsetlist variable static PyGetSetDef frame_getsetlist[] +Objects/frameobject.c - frame_memberlist variable static PyMemberDef frame_memberlist[] +Objects/frameobject.c - frame_methods variable static PyMethodDef frame_methods +Modules/_collectionsmodule.c - freeblocks variable static block *freeblocks[MAXFREEBLOCKS] +Python/dtoa.c - freelist variable static Bigint *freelist[Kmax+1] +Objects/floatobject.c - free_list variable static PyFloatObject *free_list +Objects/frameobject.c - free_list variable static PyFrameObject *free_list +Objects/listobject.c - free_list variable static PyListObject *free_list[PyList_MAXFREELIST] +Objects/dictobject.c - free_list variable static PyDictObject *free_list[PyDict_MAXFREELIST] +Objects/methodobject.c - free_list variable static PyCFunctionObject *free_list +Objects/tupleobject.c - free_list variable static PyTupleObject *free_list[PyTuple_MAXSAVESIZE] +Objects/classobject.c - free_list variable static PyMethodObject *free_list +Objects/setobject.c - frozenset_as_number variable static PyNumberMethods frozenset_as_number +Objects/setobject.c - frozenset_methods variable static PyMethodDef frozenset_methods +Objects/funcobject.c - func_getsetlist variable static PyGetSetDef func_getsetlist[] +Objects/funcobject.c - func_memberlist variable static PyMemberDef func_memberlist[] +Python/Python-ast.c - FunctionDef_fields variable static const char *FunctionDef_fields[] +Python/Python-ast.c - FunctionDef_type variable static PyTypeObject *FunctionDef_type +Modules/_sre.c - _functions variable static PyMethodDef _functions[] +Python/Python-ast.c - FunctionType_fields variable static const char *FunctionType_fields[] +Python/Python-ast.c - FunctionType_type variable static PyTypeObject *FunctionType_type +Modules/_functoolsmodule.c - _functoolsmodule variable static struct PyModuleDef _functoolsmodule +Modules/gcmodule.c - GcMethods variable static PyMethodDef GcMethods[] +Modules/gcmodule.c - gcmodule variable static struct PyModuleDef gcmodule +Modules/gcmodule.c - gc_str variable static PyObject *gc_str +Python/Python-ast.c - GeneratorExp_fields variable static const char *GeneratorExp_fields[] +Python/Python-ast.c - GeneratorExp_type variable static PyTypeObject *GeneratorExp_type +Python/symtable.c - genexpr variable static identifier genexpr +Objects/genobject.c - gen_getsetlist variable static PyGetSetDef gen_getsetlist[] +Objects/genobject.c - gen_memberlist variable static PyMemberDef gen_memberlist[] +Objects/genobject.c - gen_methods variable static PyMethodDef gen_methods +Python/bootstrap_hash.c py_getrandom getrandom_works variable static int getrandom_works +Objects/descrobject.c - getset_getset variable static PyGetSetDef getset_getset[] +Python/Python-ast.c - Global_fields variable static const char *Global_fields[] +Python/Python-ast.c - Global_type variable static PyTypeObject *Global_type +Modules/itertoolsmodule.c - groupby_methods variable static PyMethodDef groupby_methods +Modules/itertoolsmodule.c - groupby_type variable static PyTypeObject groupby_type +Modules/itertoolsmodule.c - _grouper_methods variable static PyMethodDef _grouper_methods +Modules/itertoolsmodule.c - _grouper_type variable static PyTypeObject _grouper_type +Python/Python-ast.c - GtE_singleton variable static PyObject *GtE_singleton +Python/Python-ast.c - GtE_type variable static PyTypeObject *GtE_type +Python/Python-ast.c - Gt_singleton variable static PyObject *Gt_singleton +Python/Python-ast.c - Gt_type variable static PyTypeObject *Gt_type +Modules/signalmodule.c - Handlers variable static volatile struct { _Py_atomic_int tripped; PyObject *func; } Handlers[NSIG] +Python/dynload_shlib.c - handles variable static struct { dev_t dev; ino_t ino; void *handle; } handles[128] +Python/sysmodule.c - hash_info_desc variable static PyStructSequence_Desc hash_info_desc +Python/sysmodule.c - hash_info_fields variable static PyStructSequence_Field hash_info_fields[] +Python/sysmodule.c - Hash_InfoType variable static PyTypeObject Hash_InfoType +Python/import.c import_find_and_load header variable static int header +Python/Python-ast.c - IfExp_fields variable static const char *IfExp_fields[] +Python/Python-ast.c - IfExp_type variable static PyTypeObject *IfExp_type +Python/Python-ast.c - If_fields variable static const char *If_fields[] +Python/Python-ast.c - If_type variable static PyTypeObject *If_type +Modules/signalmodule.c - IgnoreHandler variable static PyObject *IgnoreHandler +Python/import.c - imp_methods variable static PyMethodDef imp_methods +Python/import.c - impmodule variable static struct PyModuleDef impmodule +Objects/exceptions.c - ImportError_members variable static PyMemberDef ImportError_members[] +Objects/exceptions.c - ImportError_methods variable static PyMethodDef ImportError_methods +Python/Python-ast.c - Import_fields variable static const char *Import_fields[] +Python/Python-ast.c - ImportFrom_fields variable static const char *ImportFrom_fields[] +Python/Python-ast.c - ImportFrom_type variable static PyTypeObject *ImportFrom_type +Python/import.c import_find_and_load import_level variable static int import_level +Python/_warnings.c is_internal_frame importlib_string variable static PyObject *importlib_string +Python/import.c - import_lock variable static PyThread_type_lock import_lock +Python/import.c - import_lock_level variable static int import_lock_level +Python/import.c - import_lock_thread variable static unsigned long import_lock_thread +Python/import.c PyImport_Import import_str variable static PyObject *import_str +Python/Python-ast.c - Import_type variable static PyTypeObject *Import_type +Modules/_io/textio.c - incrementalnewlinedecoder_getset variable static PyGetSetDef incrementalnewlinedecoder_getset[] +Modules/_io/textio.c - incrementalnewlinedecoder_methods variable static PyMethodDef incrementalnewlinedecoder_methods +Objects/listobject.c - indexerr variable static PyObject *indexerr +Python/Python-ast.c - Index_fields variable static const char *Index_fields[] +Python/Python-ast.c - Index_type variable static PyTypeObject *Index_type +Python/thread.c - initialized variable static int initialized +Modules/posixmodule.c - initialized variable static int initialized +Modules/pwdmodule.c - initialized variable static int initialized +Modules/signalmodule.c - initialized variable static int initialized +Modules/timemodule.c - initialized variable static int initialized +Python/Python-ast.c init_types initialized variable static int initialized +Objects/listobject.c PyList_New initialized variable static int initialized +Python/import.c - inittab_copy variable static struct _inittab *inittab_copy +Python/Python-ast.c - In_singleton variable static PyObject *In_singleton +Objects/classobject.c - instancemethod_getset variable static PyGetSetDef instancemethod_getset[] +Objects/classobject.c - instancemethod_memberlist variable static PyMemberDef instancemethod_memberlist[] +Python/Python-ast.c - Interactive_fields variable static const char *Interactive_fields[] +Python/Python-ast.c - Interactive_type variable static PyTypeObject *Interactive_type +Objects/unicodeobject.c - interned variable static PyObject *interned +Objects/interpreteridobject.c - interpid_as_number variable static PyNumberMethods interpid_as_number +Modules/signalmodule.c - IntHandler variable static PyObject *IntHandler +Objects/longobject.c - int_info_desc variable static PyStructSequence_Desc int_info_desc +Objects/longobject.c - int_info_fields variable static PyStructSequence_Field int_info_fields[] +Objects/longobject.c - Int_InfoType variable static PyTypeObject Int_InfoType +Python/Python-ast.c - In_type variable static PyTypeObject *In_type +Python/Python-ast.c - Invert_singleton variable static PyObject *Invert_singleton +Python/Python-ast.c - Invert_type variable static PyTypeObject *Invert_type +Modules/_io/iobase.c - iobase_getset variable static PyGetSetDef iobase_getset[] +Modules/_io/iobase.c - iobase_methods variable static PyMethodDef iobase_methods +Python/fileutils.c set_inheritable ioctl_works variable static int ioctl_works +Modules/itertoolsmodule.c - islice_methods variable static PyMethodDef islice_methods +Modules/itertoolsmodule.c - islice_type variable static PyTypeObject islice_type +Python/Python-ast.c - IsNot_singleton variable static PyObject *IsNot_singleton +Python/Python-ast.c - IsNot_type variable static PyTypeObject *IsNot_type +Python/Python-ast.c - Is_singleton variable static PyObject *Is_singleton +Modules/signalmodule.c - is_tripped variable static _Py_atomic_int is_tripped +Python/Python-ast.c - Is_type variable static PyTypeObject *Is_type +Modules/_operator.c - itemgetter_methods variable static PyMethodDef itemgetter_methods +Modules/_operator.c - itemgetter_type variable static PyTypeObject itemgetter_type +Modules/itertoolsmodule.c - itertoolsmodule variable static struct PyModuleDef itertoolsmodule +Modules/signalmodule.c - ItimerError variable static PyObject *ItimerError +Python/Python-ast.c - JoinedStr_fields variable static const char *JoinedStr_fields[] +Python/Python-ast.c - JoinedStr_type variable static PyTypeObject *JoinedStr_type +Modules/_functoolsmodule.c - keyobject_members variable static PyMemberDef keyobject_members[] +Modules/_functoolsmodule.c - keyobject_type variable static PyTypeObject keyobject_type +Objects/dictobject.c - keys_free_list variable static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST] +Python/Python-ast.c - keyword_fields variable static const char *keyword_fields[] +Python/sysmodule.c sys_set_asyncgen_hooks keywords variable static const char *keywords[] +Modules/_bisectmodule.c bisect_right keywords variable static const char *keywords[] +Modules/_bisectmodule.c insort_right keywords variable static const char *keywords[] +Python/Python-ast.c - keyword_type variable static PyTypeObject *keyword_type +Modules/_functoolsmodule.c keyobject_call kwargs variable static const char *kwargs[] +Modules/_functoolsmodule.c functools_cmp_to_key kwargs variable static const char *kwargs[] +Modules/itertoolsmodule.c repeat_new kwargs variable static const char *kwargs[] +Python/_warnings.c warnings_warn_explicit kwd_list variable static const char *kwd_list[] +Modules/_functoolsmodule.c - kwd_mark variable static PyObject *kwd_mark +Python/bltinmodule.c builtin___import__ kwlist variable static const char *kwlist[] +Python/bltinmodule.c min_max kwlist variable static const char *kwlist[] +Python/context.c contextvar_tp_new kwlist variable static const char *kwlist[] +Python/sysmodule.c sys_getsizeof kwlist variable static const char *kwlist[] +Objects/bytearrayobject.c bytearray_init kwlist variable static const char *kwlist[] +Objects/bytesobject.c bytes_new kwlist variable static const char *kwlist[] +Objects/exceptions.c ImportError_init kwlist variable static const char *kwlist[] +Objects/interpreteridobject.c interpid_new kwlist variable static const char *kwlist[] +Objects/memoryobject.c memory_new kwlist variable static const char *kwlist[] +Objects/memoryobject.c memory_cast kwlist variable static const char *kwlist[] +Objects/memoryobject.c memory_tobytes kwlist variable static const char *kwlist[] +Objects/odictobject.c odict_pop kwlist variable static const char *kwlist[] +Objects/unicodeobject.c unicode_new kwlist variable static const char *kwlist[] +Objects/weakrefobject.c weakref_call kwlist variable static const char *kwlist[] +Modules/_elementtree.c element_setstate_from_Python kwlist variable static const char *kwlist[] +Modules/_json.c scanner_call kwlist variable static const char *kwlist[] +Modules/_json.c scanner_new kwlist variable static const char *kwlist[] +Modules/_json.c encoder_new kwlist variable static const char *kwlist[] +Modules/_json.c encoder_call kwlist variable static const char *kwlist[] +Python/symtable.c - lambda variable static identifier lambda +Python/Python-ast.c - Lambda_fields variable static const char *Lambda_fields[] +Python/Python-ast.c - Lambda_type variable static PyTypeObject *Lambda_type +Parser/listnode.c - level variable static int level +Objects/listobject.c - list_as_mapping variable static PyMappingMethods list_as_mapping +Objects/listobject.c - list_as_sequence variable static PySequenceMethods list_as_sequence +Python/symtable.c - listcomp variable static identifier listcomp +Python/Python-ast.c - ListComp_fields variable static const char *ListComp_fields[] +Python/Python-ast.c - ListComp_type variable static PyTypeObject *ListComp_type +Python/Python-ast.c - List_fields variable static const char *List_fields[] +Objects/listobject.c - listiter_methods variable static PyMethodDef listiter_methods +Objects/listobject.c - list_methods variable static PyMethodDef list_methods +Objects/listobject.c - listreviter_methods variable static PyMethodDef listreviter_methods +Python/Python-ast.c - List_type variable static PyTypeObject *List_type +Python/ceval.c - lltrace variable static int lltrace +Python/Python-ast.c - Load_singleton variable static PyObject *Load_singleton +Python/Python-ast.c - Load_type variable static PyTypeObject *Load_type +Modules/_threadmodule.c - localdummytype variable static PyTypeObject localdummytype +Modules/_localemodule.c - _localemodule variable static struct PyModuleDef _localemodule +Modules/_threadmodule.c - localtype variable static PyTypeObject localtype +Modules/_threadmodule.c - lock_methods variable static PyMethodDef lock_methods +Modules/_threadmodule.c - Locktype variable static PyTypeObject Locktype +Objects/longobject.c PyLong_FromString log_base_BASE variable static double log_base_BASE[37] +Objects/longobject.c - long_as_number variable static PyNumberMethods long_as_number +Objects/longobject.c - long_getset variable static PyGetSetDef long_getset[] +Objects/longobject.c - long_methods variable static PyMethodDef long_methods +Objects/rangeobject.c - longrangeiter_methods variable static PyMethodDef longrangeiter_methods +Modules/_functoolsmodule.c - lru_cache_getsetlist variable static PyGetSetDef lru_cache_getsetlist[] +Modules/_functoolsmodule.c - lru_cache_methods variable static PyMethodDef lru_cache_methods +Modules/_functoolsmodule.c - lru_cache_type variable static PyTypeObject lru_cache_type +Modules/_functoolsmodule.c - lru_list_elem_type variable static PyTypeObject lru_list_elem_type +Python/Python-ast.c - LShift_singleton variable static PyObject *LShift_singleton +Python/Python-ast.c - LShift_type variable static PyTypeObject *LShift_type +Python/Python-ast.c - LtE_singleton variable static PyObject *LtE_singleton +Python/Python-ast.c - LtE_type variable static PyTypeObject *LtE_type +Python/Python-ast.c - Lt_singleton variable static PyObject *Lt_singleton +Python/Python-ast.c - Lt_type variable static PyTypeObject *Lt_type +Python/bltinmodule.c - map_methods variable static PyMethodDef map_methods +Objects/descrobject.c - mappingproxy_as_mapping variable static PyMappingMethods mappingproxy_as_mapping +Objects/descrobject.c - mappingproxy_as_sequence variable static PySequenceMethods mappingproxy_as_sequence +Objects/descrobject.c - mappingproxy_methods variable static PyMethodDef mappingproxy_methods +Objects/dictobject.c - mapp_methods variable static PyMethodDef mapp_methods +Python/marshal.c - marshal_methods variable static PyMethodDef marshal_methods +Python/marshal.c - marshalmodule variable static struct PyModuleDef marshalmodule +Modules/_sre.c - match_as_mapping variable static PyMappingMethods match_as_mapping +Modules/_sre.c - match_getset variable static PyGetSetDef match_getset[] +Modules/_sre.c - match_members variable static PyMemberDef match_members[] +Modules/_sre.c - match_methods variable static PyMethodDef match_methods +Modules/_sre.c - Match_Type variable static PyTypeObject Match_Type +Python/Python-ast.c - MatMult_singleton variable static PyObject *MatMult_singleton +Python/Python-ast.c - MatMult_type variable static PyTypeObject *MatMult_type +Objects/obmalloc.c - maxarenas variable static uint maxarenas +Objects/moduleobject.c - max_module_number variable static Py_ssize_t max_module_number +Objects/descrobject.c - member_getset variable static PyGetSetDef member_getset[] +Objects/exceptions.c - memerrors_freelist variable static PyBaseExceptionObject *memerrors_freelist +Objects/exceptions.c - memerrors_numfree variable static int memerrors_numfree +Objects/memoryobject.c - memory_as_buffer variable static PyBufferProcs memory_as_buffer +Objects/memoryobject.c - memory_as_mapping variable static PyMappingMethods memory_as_mapping +Objects/memoryobject.c - memory_as_sequence variable static PySequenceMethods memory_as_sequence +Objects/memoryobject.c - memory_getsetlist variable static PyGetSetDef memory_getsetlist[] +Objects/memoryobject.c - memory_methods variable static PyMethodDef memory_methods +Objects/methodobject.c - meth_getsets variable static PyGetSetDef meth_getsets [] +Objects/methodobject.c - meth_members variable static PyMemberDef meth_members[] +Objects/methodobject.c - meth_methods variable static PyMethodDef meth_methods +Objects/typeobject.c - method_cache variable static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP] +Modules/_operator.c - methodcaller_methods variable static PyMethodDef methodcaller_methods +Modules/_operator.c - methodcaller_type variable static PyTypeObject methodcaller_type +Objects/classobject.c - method_getset variable static PyGetSetDef method_getset[] +Objects/descrobject.c - method_getset variable static PyGetSetDef method_getset[] +Objects/classobject.c - method_memberlist variable static PyMemberDef method_memberlist[] +Objects/classobject.c - method_methods variable static PyMethodDef method_methods +Python/codecs.c _PyCodecRegistry_Init methods variable static struct { char *name; PyMethodDef def; } methods[] +Python/frozen.c - M___hello__ variable static unsigned char M___hello__[] +Python/Python-ast.c - Mod_singleton variable static PyObject *Mod_singleton +Python/Python-ast.c - mod_type variable static PyTypeObject *mod_type +Python/Python-ast.c - Mod_type variable static PyTypeObject *Mod_type +Modules/faulthandler.c - module_def variable static struct PyModuleDef module_def +Modules/_tracemalloc.c - module_def variable static struct PyModuleDef module_def +Python/Python-ast.c - Module_fields variable static const char *Module_fields[] +Modules/_collectionsmodule.c - module_functions variable static struct PyMethodDef module_functions[] +Modules/_abc.c - module_functions variable static struct PyMethodDef module_functions[] +Objects/moduleobject.c - module_members variable static PyMemberDef module_members[] +Objects/moduleobject.c - module_methods variable static PyMethodDef module_methods +Modules/_functoolsmodule.c - module_methods variable static PyMethodDef module_methods +Modules/itertoolsmodule.c - module_methods variable static PyMethodDef module_methods +Modules/_io/_iomodule.c - module_methods variable static PyMethodDef module_methods +Modules/faulthandler.c - module_methods variable static PyMethodDef module_methods +Modules/_tracemalloc.c - module_methods variable static PyMethodDef module_methods +Python/Python-ast.c - Module_type variable static PyTypeObject *Module_type +Python/Python-ast.c - Mult_singleton variable static PyObject *Mult_singleton +Python/Python-ast.c - Mult_type variable static PyTypeObject *Mult_type +Objects/funcobject.c PyFunction_NewWithQualName __name__ variable static PyObject *__name__ +Python/compile.c compiler_lambda name variable static identifier name +Python/compile.c compiler_genexp name variable static identifier name +Python/compile.c compiler_listcomp name variable static identifier name +Python/compile.c compiler_setcomp name variable static identifier name +Python/compile.c compiler_dictcomp name variable static identifier name +Python/Python-ast.c - NamedExpr_fields variable static const char *NamedExpr_fields[] +Python/Python-ast.c - NamedExpr_type variable static PyTypeObject *NamedExpr_type +Python/Python-ast.c - Name_fields variable static const char *Name_fields[] +Objects/typeobject.c - name_op variable static _Py_Identifier name_op[] +Objects/namespaceobject.c - namespace_members variable static PyMemberDef namespace_members[] +Objects/namespaceobject.c - namespace_methods variable static PyMethodDef namespace_methods +Python/Python-ast.c - Name_type variable static PyTypeObject *Name_type +Objects/obmalloc.c - narenas_currently_allocated variable static size_t narenas_currently_allocated +Objects/obmalloc.c - narenas_highwater variable static size_t narenas_highwater +Python/sysmodule.c sys_displayhook newline variable static PyObject *newline +Objects/typeobject.c - next_version_tag variable static unsigned int next_version_tag +Objects/obmalloc.c - nfp2lasta variable static struct arena_object* nfp2lasta[MAX_POOLS_IN_ARENA + 1] +Python/dynload_shlib.c - nhandles variable static int nhandles +Objects/object.c - none_as_number variable static PyNumberMethods none_as_number +Python/Python-ast.c - Nonlocal_fields variable static const char *Nonlocal_fields[] +Python/Python-ast.c - Nonlocal_type variable static PyTypeObject *Nonlocal_type +Python/Python-ast.c - NotEq_singleton variable static PyObject *NotEq_singleton +Python/Python-ast.c - NotEq_type variable static PyTypeObject *NotEq_type +Objects/object.c - notimplemented_methods variable static PyMethodDef notimplemented_methods +Python/Python-ast.c - NotIn_singleton variable static PyObject *NotIn_singleton +Python/Python-ast.c - NotIn_type variable static PyTypeObject *NotIn_type +Python/Python-ast.c - Not_singleton variable static PyObject *Not_singleton +Python/Python-ast.c - Not_type variable static PyTypeObject *Not_type +Objects/obmalloc.c - ntimes_arena_allocated variable static size_t ntimes_arena_allocated +Objects/bytesobject.c - nullstring variable static PyBytesObject *nullstring +Objects/codeobject.c PyCode_NewEmpty nulltuple variable static PyObject *nulltuple +Objects/floatobject.c - numfree variable static int numfree +Objects/frameobject.c - numfree variable static int numfree +Objects/listobject.c - numfree variable static int numfree +Objects/dictobject.c - numfree variable static int numfree +Objects/methodobject.c - numfree variable static int numfree +Objects/tupleobject.c - numfree variable static int numfree[PyTuple_MAXSAVESIZE] +Objects/classobject.c - numfree variable static int numfree +Modules/_collectionsmodule.c - numfreeblocks variable static Py_ssize_t numfreeblocks +Objects/dictobject.c - numfreekeys variable static int numfreekeys +Objects/typeobject.c - object_getsets variable static PyGetSetDef object_getsets[] +Objects/typeobject.c - object_methods variable static PyMethodDef object_methods +Objects/typeobject.c object___reduce_ex___impl objreduce variable static PyObject *objreduce +Objects/odictobject.c - odict_as_mapping variable static PyMappingMethods odict_as_mapping +Objects/odictobject.c - odict_getset variable static PyGetSetDef odict_getset[] +Objects/odictobject.c - odictitems_methods variable static PyMethodDef odictitems_methods +Objects/odictobject.c - odictiter_methods variable static PyMethodDef odictiter_methods +Objects/odictobject.c - odictkeys_methods variable static PyMethodDef odictkeys_methods +Objects/odictobject.c - odict_methods variable static PyMethodDef odict_methods +Objects/odictobject.c - odictvalues_methods variable static PyMethodDef odictvalues_methods +Modules/faulthandler.c - old_stack variable static stack_t old_stack +Modules/_operator.c - operator_methods variable static PyMethodDef operator_methods +Modules/_operator.c - operatormodule variable static struct PyModuleDef operatormodule +Python/Python-ast.c - operator_type variable static PyTypeObject *operator_type +Objects/typeobject.c slot_nb_add op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_subtract op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_multiply op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_matrix_multiply op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_remainder op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_divmod op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_power_binary op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_lshift op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_rshift op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_and op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_xor op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_or op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_floor_divide op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_true_divide op_id variable _Py_static_string(op_id, OPSTR) +Python/getopt.c - opt_ptr variable static const wchar_t *opt_ptr +Python/initconfig.c - orig_argv variable static PyWideStringList orig_argv +Python/Python-ast.c - Or_singleton variable static PyObject *Or_singleton +Python/Python-ast.c - Or_type variable static PyTypeObject *Or_type +Objects/exceptions.c - OSError_getset variable static PyGetSetDef OSError_getset[] +Objects/exceptions.c - OSError_members variable static PyMemberDef OSError_members[] +Objects/exceptions.c - OSError_methods variable static PyMethodDef OSError_methods +Python/dtoa.c - p5s variable static Bigint *p5s +Python/Python-ast.c - Param_singleton variable static PyObject *Param_singleton +Python/Python-ast.c - Param_type variable static PyTypeObject *Param_type +Python/bltinmodule.c builtin_print _parser variable static struct _PyArg_Parser _parser +Python/clinic/_warnings.c.h warnings_warn _parser variable static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h builtin_compile _parser variable static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h builtin_round _parser variable static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h builtin_sum _parser variable static _PyArg_Parser _parser +Python/clinic/import.c.h _imp_source_hash _parser variable static _PyArg_Parser _parser +Python/clinic/sysmodule.c.h sys_addaudithook _parser variable static _PyArg_Parser _parser +Python/clinic/sysmodule.c.h sys_set_coroutine_origin_tracking_depth _parser variable static _PyArg_Parser _parser +Python/clinic/traceback.c.h tb_new _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_translate _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_split _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_rsplit _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_decode _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_splitlines _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_hex _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_split _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_rsplit _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_translate _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_decode _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_splitlines _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_hex _parser variable static _PyArg_Parser _parser +Objects/clinic/codeobject.c.h code_replace _parser variable static _PyArg_Parser _parser +Objects/clinic/complexobject.c.h complex_new _parser variable static _PyArg_Parser _parser +Objects/clinic/descrobject.c.h mappingproxy_new _parser variable static _PyArg_Parser _parser +Objects/clinic/descrobject.c.h property_init _parser variable static _PyArg_Parser _parser +Objects/clinic/enumobject.c.h enum_new _parser variable static _PyArg_Parser _parser +Objects/clinic/funcobject.c.h func_new _parser variable static _PyArg_Parser _parser +Objects/clinic/listobject.c.h list_sort _parser variable static _PyArg_Parser _parser +Objects/clinic/longobject.c.h long_new _parser variable static _PyArg_Parser _parser +Objects/clinic/longobject.c.h int_to_bytes _parser variable static _PyArg_Parser _parser +Objects/clinic/longobject.c.h int_from_bytes _parser variable static _PyArg_Parser _parser +Objects/clinic/memoryobject.c.h memoryview_hex _parser variable static _PyArg_Parser _parser +Objects/clinic/moduleobject.c.h module___init__ _parser variable static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h OrderedDict_fromkeys _parser variable static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h OrderedDict_setdefault _parser variable static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h OrderedDict_popitem _parser variable static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h OrderedDict_move_to_end _parser variable static _PyArg_Parser _parser +Objects/clinic/structseq.c.h structseq_new _parser variable static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h unicode_encode _parser variable static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h unicode_expandtabs _parser variable static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h unicode_split _parser variable static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h unicode_rsplit _parser variable static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h unicode_splitlines _parser variable static _PyArg_Parser _parser +Objects/stringlib/clinic/transmogrify.h.h stringlib_expandtabs _parser variable static _PyArg_Parser _parser +Modules/_blake2/clinic/blake2b_impl.c.h py_blake2b_new _parser variable static _PyArg_Parser _parser +Modules/_blake2/clinic/blake2s_impl.c.h py_blake2s_new _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/_iomodule.c.h _io_open _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/_iomodule.c.h _io_open_code _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h _io_BufferedReader___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h _io_BufferedWriter___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h _io_BufferedRandom___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/bytesio.c.h _io_BytesIO___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/fileio.c.h _io_FileIO___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/stringio.c.h _io_StringIO___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h _io_IncrementalNewlineDecoder___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h _io_IncrementalNewlineDecoder_decode _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h _io_TextIOWrapper___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h _io_TextIOWrapper_reconfigure _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/winconsoleio.c.h _io__WindowsConsoleIO___init__ _parser variable static _PyArg_Parser _parser +Modules/_multiprocessing/clinic/posixshmem.c.h _posixshmem_shm_open _parser variable static _PyArg_Parser _parser +Modules/_multiprocessing/clinic/posixshmem.c.h _posixshmem_shm_unlink _parser variable static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteCodec_encode _parser variable static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteCodec_decode _parser variable static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteIncrementalEncoder_encode _parser variable static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteIncrementalDecoder_decode _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Future___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Future_add_done_callback _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Task___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Task_current_task _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Task_all_tasks _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Task_get_stack _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Task_print_stack _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio__register_task _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio__unregister_task _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio__enter_task _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio__leave_task _parser variable static _PyArg_Parser _parser +Modules/clinic/_bz2module.c.h _bz2_BZ2Decompressor_decompress _parser variable static _PyArg_Parser _parser +Modules/clinic/_codecsmodule.c.h _codecs_encode _parser variable static _PyArg_Parser _parser +Modules/clinic/_codecsmodule.c.h _codecs_decode _parser variable static _PyArg_Parser _parser +Modules/clinic/_cursesmodule.c.h _curses_setupterm _parser variable static _PyArg_Parser _parser +Modules/clinic/_datetimemodule.c.h datetime_datetime_now _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_find _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_findtext _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_findall _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_iterfind _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_get _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_iter _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_getiterator _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_TreeBuilder___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_XMLParser___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h EVP_new _parser variable static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h pbkdf2_hmac _parser variable static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h _hashlib_scrypt _parser variable static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h _hashlib_hmac_digest _parser variable static _PyArg_Parser _parser +Modules/clinic/_lzmamodule.c.h _lzma_LZMADecompressor_decompress _parser variable static _PyArg_Parser _parser +Modules/clinic/_lzmamodule.c.h _lzma_LZMADecompressor___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_opcode.c.h _opcode_stack_effect _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_Pickler___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_Unpickler___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_dump _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_dumps _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_load _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_loads _parser variable static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_put _parser variable static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_put_nowait _parser variable static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_get _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_match _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_fullmatch _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_search _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_findall _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_finditer _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_scanner _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_split _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_sub _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_subn _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_compile _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Match_expand _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Match_groups _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Match_groupdict _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLSocket_get_channel_binding _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLContext_load_cert_chain _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLContext_load_verify_locations _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLContext__wrap_socket _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLContext__wrap_bio _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLContext_get_ca_certs _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl_txt2obj _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl_enum_certificates _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl_enum_crls _parser variable static _PyArg_Parser _parser +Modules/clinic/_struct.c.h Struct___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_struct.c.h Struct_unpack_from _parser variable static _PyArg_Parser _parser +Modules/clinic/_struct.c.h unpack_from _parser variable static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h _winapi_ConnectNamedPipe _parser variable static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h _winapi_ReadFile _parser variable static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h _winapi_WriteFile _parser variable static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h _winapi_GetFileType _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_b2a_uu _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_b2a_base64 _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_b2a_hex _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_hexlify _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_a2b_qp _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_b2a_qp _parser variable static _PyArg_Parser _parser +Modules/clinic/cmathmodule.c.h cmath_isclose _parser variable static _PyArg_Parser _parser +Modules/clinic/gcmodule.c.h gc_collect _parser variable static _PyArg_Parser _parser +Modules/clinic/gcmodule.c.h gc_get_objects _parser variable static _PyArg_Parser _parser +Modules/clinic/grpmodule.c.h grp_getgrgid _parser variable static _PyArg_Parser _parser +Modules/clinic/grpmodule.c.h grp_getgrnam _parser variable static _PyArg_Parser _parser +Modules/_functoolsmodule.c - partial_getsetlist variable static PyGetSetDef partial_getsetlist[] +Modules/_functoolsmodule.c - partial_memberlist variable static PyMemberDef partial_memberlist[] +Modules/_functoolsmodule.c - partial_methods variable static PyMethodDef partial_methods +Modules/_functoolsmodule.c - partial_type variable static PyTypeObject partial_type +Python/Python-ast.c - Pass_type variable static PyTypeObject *Pass_type +Modules/_sre.c - pattern_getset variable static PyGetSetDef pattern_getset[] +Modules/_sre.c - pattern_members variable static PyMemberDef pattern_members[] +Modules/_sre.c - pattern_methods variable static PyMethodDef pattern_methods +Modules/_sre.c - Pattern_Type variable static PyTypeObject Pattern_Type +Modules/itertoolsmodule.c - permuations_methods variable static PyMethodDef permuations_methods +Modules/itertoolsmodule.c - permutations_type variable static PyTypeObject permutations_type +Objects/picklebufobject.c - picklebuf_as_buffer variable static PyBufferProcs picklebuf_as_buffer +Objects/picklebufobject.c - picklebuf_methods variable static PyMethodDef picklebuf_methods +Python/dtoa.c - pmem_next variable static double *pmem_next +Objects/typeobject.c resolve_slotdups pname variable static PyObject *pname +Modules/posixmodule.c - posix_constants_confstr variable static struct constdef posix_constants_confstr[] +Modules/posixmodule.c - posix_constants_pathconf variable static struct constdef posix_constants_pathconf[] +Modules/posixmodule.c - posix_constants_sysconf variable static struct constdef posix_constants_sysconf[] +Modules/posixmodule.c - posix_methods variable static PyMethodDef posix_methods +Modules/posixmodule.c - posixmodule variable static struct PyModuleDef posixmodule +Modules/posixmodule.c - posix_putenv_garbage variable static PyObject *posix_putenv_garbage +Python/Python-ast.c - Pow_singleton variable static PyObject *Pow_singleton +Python/Python-ast.c - Pow_type variable static PyTypeObject *Pow_type +Python/sysmodule.c - _preinit_warnoptions variable static _Py_PreInitEntry _preinit_warnoptions +Python/sysmodule.c - _preinit_xoptions variable static _Py_PreInitEntry _preinit_xoptions +Objects/exceptions.c _check_for_legacy_statements print_prefix variable static PyObject *print_prefix +Python/dtoa.c - private_mem variable static double private_mem[PRIVATE_mem] +Modules/itertoolsmodule.c - product_methods variable static PyMethodDef product_methods +Modules/itertoolsmodule.c - product_type variable static PyTypeObject product_type +Objects/descrobject.c - property_getsetlist variable static PyGetSetDef property_getsetlist[] +Objects/descrobject.c - property_members variable static PyMemberDef property_members[] +Objects/descrobject.c - property_methods variable static PyMethodDef property_methods +Objects/weakrefobject.c - proxy_as_mapping variable static PyMappingMethods proxy_as_mapping +Objects/weakrefobject.c - proxy_as_number variable static PyNumberMethods proxy_as_number +Objects/weakrefobject.c - proxy_as_sequence variable static PySequenceMethods proxy_as_sequence +Objects/weakrefobject.c - proxy_methods variable static PyMethodDef proxy_methods +Objects/typeobject.c resolve_slotdups ptrs variable static slotdef *ptrs[MAX_EQUIV] +Modules/pwdmodule.c - pwd_methods variable static PyMethodDef pwd_methods +Modules/pwdmodule.c - pwdmodule variable static struct PyModuleDef pwdmodule +Objects/obmalloc.c - _Py_AllocatedBlocks variable static Py_ssize_t _Py_AllocatedBlocks +Objects/genobject.c - _PyAsyncGenASend_Type variable PyTypeObject _PyAsyncGenASend_Type +Objects/genobject.c - _PyAsyncGenAThrow_Type variable PyTypeObject _PyAsyncGenAThrow_Type +Objects/genobject.c - PyAsyncGen_Type variable PyTypeObject PyAsyncGen_Type +Objects/genobject.c - _PyAsyncGenWrappedValue_Type variable PyTypeObject _PyAsyncGenWrappedValue_Type +Objects/typeobject.c - PyBaseObject_Type variable PyTypeObject PyBaseObject_Type +Modules/_blake2/blake2b_impl.c - PyBlake2_BLAKE2bType variable PyTypeObject PyBlake2_BLAKE2bType +Modules/_blake2/blake2s_impl.c - PyBlake2_BLAKE2sType variable PyTypeObject PyBlake2_BLAKE2sType +Objects/boolobject.c - PyBool_Type variable PyTypeObject PyBool_Type +Modules/_io/bufferedio.c - PyBufferedIOBase_Type variable PyTypeObject PyBufferedIOBase_Type +Modules/_io/bufferedio.c - PyBufferedRandom_Type variable PyTypeObject PyBufferedRandom_Type +Modules/_io/bufferedio.c - PyBufferedReader_Type variable PyTypeObject PyBufferedReader_Type +Modules/_io/bufferedio.c - PyBufferedRWPair_Type variable PyTypeObject PyBufferedRWPair_Type +Modules/_io/bufferedio.c - PyBufferedWriter_Type variable PyTypeObject PyBufferedWriter_Type +Objects/bytearrayobject.c - _PyByteArray_empty_string variable char _PyByteArray_empty_string[] +Objects/bytearrayobject.c - PyByteArrayIter_Type variable PyTypeObject PyByteArrayIter_Type +Objects/bytearrayobject.c - PyByteArray_Type variable PyTypeObject PyByteArray_Type +Modules/_io/bytesio.c - _PyBytesIOBuffer_Type variable PyTypeObject _PyBytesIOBuffer_Type +Modules/_io/bytesio.c - PyBytesIO_Type variable PyTypeObject PyBytesIO_Type +Objects/bytesobject.c - PyBytesIter_Type variable PyTypeObject PyBytesIter_Type +Objects/bytesobject.c - PyBytes_Type variable PyTypeObject PyBytes_Type +Python/initconfig.c - Py_BytesWarningFlag variable int Py_BytesWarningFlag +Objects/iterobject.c - PyCallIter_Type variable PyTypeObject PyCallIter_Type +Objects/capsule.c - PyCapsule_Type variable PyTypeObject PyCapsule_Type +Objects/cellobject.c - PyCell_Type variable PyTypeObject PyCell_Type +Objects/methodobject.c - PyCFunction_Type variable PyTypeObject PyCFunction_Type +Python/ceval.c - _Py_CheckRecursionLimit variable int _Py_CheckRecursionLimit +Objects/descrobject.c - PyClassMethodDescr_Type variable PyTypeObject PyClassMethodDescr_Type +Objects/funcobject.c - PyClassMethod_Type variable PyTypeObject PyClassMethod_Type +Objects/codeobject.c - PyCode_Type variable PyTypeObject PyCode_Type +Objects/complexobject.c - PyComplex_Type variable PyTypeObject PyComplex_Type +Python/context.c - PyContext_as_mapping variable static PyMappingMethods PyContext_as_mapping +Python/context.c - PyContext_as_sequence variable static PySequenceMethods PyContext_as_sequence +Python/context.c - PyContext_methods variable static PyMethodDef PyContext_methods +Python/context.c - PyContextTokenMissing_Type variable PyTypeObject PyContextTokenMissing_Type +Python/context.c - PyContextToken_Type variable PyTypeObject PyContextToken_Type +Python/context.c - PyContextTokenType_getsetlist variable static PyGetSetDef PyContextTokenType_getsetlist[] +Python/context.c - PyContext_Type variable PyTypeObject PyContext_Type +Python/context.c - PyContextVar_members variable static PyMemberDef PyContextVar_members[] +Python/context.c - PyContextVar_methods variable static PyMethodDef PyContextVar_methods +Python/context.c - PyContextVar_Type variable PyTypeObject PyContextVar_Type +Objects/genobject.c - PyCoro_Type variable PyTypeObject PyCoro_Type +Objects/genobject.c - _PyCoroWrapper_Type variable PyTypeObject _PyCoroWrapper_Type +Python/initconfig.c - Py_DebugFlag variable int Py_DebugFlag +Objects/dictobject.c - pydict_global_version variable static uint64_t pydict_global_version +Objects/dictobject.c - PyDictItems_Type variable PyTypeObject PyDictItems_Type +Objects/dictobject.c - PyDictIterItem_Type variable PyTypeObject PyDictIterItem_Type +Objects/dictobject.c - PyDictIterKey_Type variable PyTypeObject PyDictIterKey_Type +Objects/dictobject.c - PyDictIterValue_Type variable PyTypeObject PyDictIterValue_Type +Objects/dictobject.c - PyDictKeys_Type variable PyTypeObject PyDictKeys_Type +Objects/descrobject.c - PyDictProxy_Type variable PyTypeObject PyDictProxy_Type +Objects/dictobject.c - PyDictRevIterItem_Type variable PyTypeObject PyDictRevIterItem_Type +Objects/dictobject.c - PyDictRevIterKey_Type variable PyTypeObject PyDictRevIterKey_Type +Objects/dictobject.c - PyDictRevIterValue_Type variable PyTypeObject PyDictRevIterValue_Type +Objects/dictobject.c - PyDict_Type variable PyTypeObject PyDict_Type +Objects/dictobject.c - PyDictValues_Type variable PyTypeObject PyDictValues_Type +Python/initconfig.c - Py_DontWriteBytecodeFlag variable int Py_DontWriteBytecodeFlag +Objects/sliceobject.c - _Py_EllipsisObject variable PyObject _Py_EllipsisObject +Objects/sliceobject.c - PyEllipsis_Type variable PyTypeObject PyEllipsis_Type +Objects/enumobject.c - PyEnum_Type variable PyTypeObject PyEnum_Type +Objects/exceptions.c - _PyExc_ArithmeticError variable static PyTypeObject _PyExc_ArithmeticError +Objects/exceptions.c - PyExc_ArithmeticError variable static PyTypeObject PyExc_ArithmeticError +Objects/exceptions.c - _PyExc_AssertionError variable static PyTypeObject _PyExc_AssertionError +Objects/exceptions.c - PyExc_AssertionError variable static PyTypeObject PyExc_AssertionError +Objects/exceptions.c - _PyExc_AttributeError variable static PyTypeObject _PyExc_AttributeError +Objects/exceptions.c - PyExc_AttributeError variable static PyTypeObject PyExc_AttributeError +Objects/exceptions.c - _PyExc_BaseException variable static PyTypeObject _PyExc_BaseException +Objects/exceptions.c - PyExc_BaseException variable static PyTypeObject PyExc_BaseException +Objects/exceptions.c - _PyExc_BlockingIOError variable static PyTypeObject _PyExc_BlockingIOError +Objects/exceptions.c - PyExc_BlockingIOError variable static PyTypeObject PyExc_BlockingIOError +Objects/exceptions.c - _PyExc_BrokenPipeError variable static PyTypeObject _PyExc_BrokenPipeError +Objects/exceptions.c - PyExc_BrokenPipeError variable static PyTypeObject PyExc_BrokenPipeError +Objects/exceptions.c - _PyExc_BufferError variable static PyTypeObject _PyExc_BufferError +Objects/exceptions.c - PyExc_BufferError variable static PyTypeObject PyExc_BufferError +Objects/exceptions.c - _PyExc_BytesWarning variable static PyTypeObject _PyExc_BytesWarning +Objects/exceptions.c - PyExc_BytesWarning variable static PyTypeObject PyExc_BytesWarning +Objects/exceptions.c - _PyExc_ChildProcessError variable static PyTypeObject _PyExc_ChildProcessError +Objects/exceptions.c - PyExc_ChildProcessError variable static PyTypeObject PyExc_ChildProcessError +Objects/exceptions.c - _PyExc_ConnectionAbortedError variable static PyTypeObject _PyExc_ConnectionAbortedError +Objects/exceptions.c - PyExc_ConnectionAbortedError variable static PyTypeObject PyExc_ConnectionAbortedError +Objects/exceptions.c - _PyExc_ConnectionError variable static PyTypeObject _PyExc_ConnectionError +Objects/exceptions.c - PyExc_ConnectionError variable static PyTypeObject PyExc_ConnectionError +Objects/exceptions.c - _PyExc_ConnectionRefusedError variable static PyTypeObject _PyExc_ConnectionRefusedError +Objects/exceptions.c - PyExc_ConnectionRefusedError variable static PyTypeObject PyExc_ConnectionRefusedError +Objects/exceptions.c - _PyExc_ConnectionResetError variable static PyTypeObject _PyExc_ConnectionResetError +Objects/exceptions.c - PyExc_ConnectionResetError variable static PyTypeObject PyExc_ConnectionResetError +Objects/exceptions.c - _PyExc_DeprecationWarning variable static PyTypeObject _PyExc_DeprecationWarning +Objects/exceptions.c - PyExc_DeprecationWarning variable static PyTypeObject PyExc_DeprecationWarning +Objects/exceptions.c - PyExc_EnvironmentError variable static PyTypeObject PyExc_EnvironmentError +Objects/exceptions.c - _PyExc_EOFError variable static PyTypeObject _PyExc_EOFError +Objects/exceptions.c - PyExc_EOFError variable static PyTypeObject PyExc_EOFError +Objects/exceptions.c - _PyExc_Exception variable static PyTypeObject _PyExc_Exception +Objects/exceptions.c - PyExc_Exception variable static PyTypeObject PyExc_Exception +Objects/exceptions.c - _PyExc_FileExistsError variable static PyTypeObject _PyExc_FileExistsError +Objects/exceptions.c - PyExc_FileExistsError variable static PyTypeObject PyExc_FileExistsError +Objects/exceptions.c - _PyExc_FileNotFoundError variable static PyTypeObject _PyExc_FileNotFoundError +Objects/exceptions.c - PyExc_FileNotFoundError variable static PyTypeObject PyExc_FileNotFoundError +Objects/exceptions.c - _PyExc_FloatingPointError variable static PyTypeObject _PyExc_FloatingPointError +Objects/exceptions.c - PyExc_FloatingPointError variable static PyTypeObject PyExc_FloatingPointError +Objects/exceptions.c - _PyExc_FutureWarning variable static PyTypeObject _PyExc_FutureWarning +Objects/exceptions.c - PyExc_FutureWarning variable static PyTypeObject PyExc_FutureWarning +Objects/exceptions.c - _PyExc_GeneratorExit variable static PyTypeObject _PyExc_GeneratorExit +Objects/exceptions.c - PyExc_GeneratorExit variable static PyTypeObject PyExc_GeneratorExit +Objects/exceptions.c - _PyExc_ImportError variable static PyTypeObject _PyExc_ImportError +Objects/exceptions.c - PyExc_ImportError variable static PyTypeObject PyExc_ImportError +Objects/exceptions.c - _PyExc_ImportWarning variable static PyTypeObject _PyExc_ImportWarning +Objects/exceptions.c - PyExc_ImportWarning variable static PyTypeObject PyExc_ImportWarning +Objects/exceptions.c - _PyExc_IndentationError variable static PyTypeObject _PyExc_IndentationError +Objects/exceptions.c - PyExc_IndentationError variable static PyTypeObject PyExc_IndentationError +Objects/exceptions.c - _PyExc_IndexError variable static PyTypeObject _PyExc_IndexError +Objects/exceptions.c - PyExc_IndexError variable static PyTypeObject PyExc_IndexError +Objects/exceptions.c - _PyExc_InterruptedError variable static PyTypeObject _PyExc_InterruptedError +Objects/exceptions.c - PyExc_InterruptedError variable static PyTypeObject PyExc_InterruptedError +Objects/exceptions.c - PyExc_IOError variable static PyTypeObject PyExc_IOError +Objects/exceptions.c - _PyExc_IsADirectoryError variable static PyTypeObject _PyExc_IsADirectoryError +Objects/exceptions.c - PyExc_IsADirectoryError variable static PyTypeObject PyExc_IsADirectoryError +Objects/exceptions.c - _PyExc_KeyboardInterrupt variable static PyTypeObject _PyExc_KeyboardInterrupt +Objects/exceptions.c - PyExc_KeyboardInterrupt variable static PyTypeObject PyExc_KeyboardInterrupt +Objects/exceptions.c - _PyExc_KeyError variable static PyTypeObject _PyExc_KeyError +Objects/exceptions.c - PyExc_KeyError variable static PyTypeObject PyExc_KeyError +Objects/exceptions.c - _PyExc_LookupError variable static PyTypeObject _PyExc_LookupError +Objects/exceptions.c - PyExc_LookupError variable static PyTypeObject PyExc_LookupError +Objects/exceptions.c - _PyExc_MemoryError variable static PyTypeObject _PyExc_MemoryError +Objects/exceptions.c - PyExc_MemoryError variable static PyTypeObject PyExc_MemoryError +Objects/exceptions.c - _PyExc_ModuleNotFoundError variable static PyTypeObject _PyExc_ModuleNotFoundError +Objects/exceptions.c - PyExc_ModuleNotFoundError variable static PyTypeObject PyExc_ModuleNotFoundError +Objects/exceptions.c - _PyExc_NameError variable static PyTypeObject _PyExc_NameError +Objects/exceptions.c - PyExc_NameError variable static PyTypeObject PyExc_NameError +Objects/exceptions.c - _PyExc_NotADirectoryError variable static PyTypeObject _PyExc_NotADirectoryError +Objects/exceptions.c - PyExc_NotADirectoryError variable static PyTypeObject PyExc_NotADirectoryError +Objects/exceptions.c - _PyExc_NotImplementedError variable static PyTypeObject _PyExc_NotImplementedError +Objects/exceptions.c - PyExc_NotImplementedError variable static PyTypeObject PyExc_NotImplementedError +Objects/exceptions.c - _PyExc_OSError variable static PyTypeObject _PyExc_OSError +Objects/exceptions.c - PyExc_OSError variable static PyTypeObject PyExc_OSError +Objects/exceptions.c - _PyExc_OverflowError variable static PyTypeObject _PyExc_OverflowError +Objects/exceptions.c - PyExc_OverflowError variable static PyTypeObject PyExc_OverflowError +Objects/exceptions.c - _PyExc_PendingDeprecationWarning variable static PyTypeObject _PyExc_PendingDeprecationWarning +Objects/exceptions.c - PyExc_PendingDeprecationWarning variable static PyTypeObject PyExc_PendingDeprecationWarning +Objects/exceptions.c - _PyExc_PermissionError variable static PyTypeObject _PyExc_PermissionError +Objects/exceptions.c - PyExc_PermissionError variable static PyTypeObject PyExc_PermissionError +Objects/exceptions.c - _PyExc_ProcessLookupError variable static PyTypeObject _PyExc_ProcessLookupError +Objects/exceptions.c - PyExc_ProcessLookupError variable static PyTypeObject PyExc_ProcessLookupError +Objects/exceptions.c - _PyExc_RecursionError variable static PyTypeObject _PyExc_RecursionError +Objects/exceptions.c - PyExc_RecursionError variable static PyTypeObject PyExc_RecursionError +Objects/exceptions.c - _PyExc_ReferenceError variable static PyTypeObject _PyExc_ReferenceError +Objects/exceptions.c - PyExc_ReferenceError variable static PyTypeObject PyExc_ReferenceError +Objects/exceptions.c - _PyExc_ResourceWarning variable static PyTypeObject _PyExc_ResourceWarning +Objects/exceptions.c - PyExc_ResourceWarning variable static PyTypeObject PyExc_ResourceWarning +Objects/exceptions.c - _PyExc_RuntimeError variable static PyTypeObject _PyExc_RuntimeError +Objects/exceptions.c - PyExc_RuntimeError variable static PyTypeObject PyExc_RuntimeError +Objects/exceptions.c - _PyExc_RuntimeWarning variable static PyTypeObject _PyExc_RuntimeWarning +Objects/exceptions.c - PyExc_RuntimeWarning variable static PyTypeObject PyExc_RuntimeWarning +Objects/exceptions.c - _PyExc_StopAsyncIteration variable static PyTypeObject _PyExc_StopAsyncIteration +Objects/exceptions.c - PyExc_StopAsyncIteration variable static PyTypeObject PyExc_StopAsyncIteration +Objects/exceptions.c - _PyExc_StopIteration variable static PyTypeObject _PyExc_StopIteration +Objects/exceptions.c - PyExc_StopIteration variable static PyTypeObject PyExc_StopIteration +Objects/exceptions.c - _PyExc_SyntaxError variable static PyTypeObject _PyExc_SyntaxError +Objects/exceptions.c - PyExc_SyntaxError variable static PyTypeObject PyExc_SyntaxError +Objects/exceptions.c - _PyExc_SyntaxWarning variable static PyTypeObject _PyExc_SyntaxWarning +Objects/exceptions.c - PyExc_SyntaxWarning variable static PyTypeObject PyExc_SyntaxWarning +Objects/exceptions.c - _PyExc_SystemError variable static PyTypeObject _PyExc_SystemError +Objects/exceptions.c - PyExc_SystemError variable static PyTypeObject PyExc_SystemError +Objects/exceptions.c - _PyExc_SystemExit variable static PyTypeObject _PyExc_SystemExit +Objects/exceptions.c - PyExc_SystemExit variable static PyTypeObject PyExc_SystemExit +Objects/exceptions.c - _PyExc_TabError variable static PyTypeObject _PyExc_TabError +Objects/exceptions.c - PyExc_TabError variable static PyTypeObject PyExc_TabError +Objects/exceptions.c - _PyExc_TargetScopeError variable static PyTypeObject _PyExc_TargetScopeError +Objects/exceptions.c - PyExc_TargetScopeError variable static PyTypeObject PyExc_TargetScopeError +Objects/exceptions.c - _PyExc_TimeoutError variable static PyTypeObject _PyExc_TimeoutError +Objects/exceptions.c - PyExc_TimeoutError variable static PyTypeObject PyExc_TimeoutError +Objects/exceptions.c - _PyExc_TypeError variable static PyTypeObject _PyExc_TypeError +Objects/exceptions.c - PyExc_TypeError variable static PyTypeObject PyExc_TypeError +Objects/exceptions.c - _PyExc_UnboundLocalError variable static PyTypeObject _PyExc_UnboundLocalError +Objects/exceptions.c - PyExc_UnboundLocalError variable static PyTypeObject PyExc_UnboundLocalError +Objects/exceptions.c - _PyExc_UnicodeDecodeError variable static PyTypeObject _PyExc_UnicodeDecodeError +Objects/exceptions.c - PyExc_UnicodeDecodeError variable static PyTypeObject PyExc_UnicodeDecodeError +Objects/exceptions.c - _PyExc_UnicodeEncodeError variable static PyTypeObject _PyExc_UnicodeEncodeError +Objects/exceptions.c - PyExc_UnicodeEncodeError variable static PyTypeObject PyExc_UnicodeEncodeError +Objects/exceptions.c - _PyExc_UnicodeError variable static PyTypeObject _PyExc_UnicodeError +Objects/exceptions.c - PyExc_UnicodeError variable static PyTypeObject PyExc_UnicodeError +Objects/exceptions.c - _PyExc_UnicodeTranslateError variable static PyTypeObject _PyExc_UnicodeTranslateError +Objects/exceptions.c - PyExc_UnicodeTranslateError variable static PyTypeObject PyExc_UnicodeTranslateError +Objects/exceptions.c - _PyExc_UnicodeWarning variable static PyTypeObject _PyExc_UnicodeWarning +Objects/exceptions.c - PyExc_UnicodeWarning variable static PyTypeObject PyExc_UnicodeWarning +Objects/exceptions.c - _PyExc_UserWarning variable static PyTypeObject _PyExc_UserWarning +Objects/exceptions.c - PyExc_UserWarning variable static PyTypeObject PyExc_UserWarning +Objects/exceptions.c - _PyExc_ValueError variable static PyTypeObject _PyExc_ValueError +Objects/exceptions.c - PyExc_ValueError variable static PyTypeObject PyExc_ValueError +Objects/exceptions.c - _PyExc_Warning variable static PyTypeObject _PyExc_Warning +Objects/exceptions.c - PyExc_Warning variable static PyTypeObject PyExc_Warning +Objects/exceptions.c - _PyExc_ZeroDivisionError variable static PyTypeObject _PyExc_ZeroDivisionError +Objects/exceptions.c - PyExc_ZeroDivisionError variable static PyTypeObject PyExc_ZeroDivisionError +Objects/boolobject.c - _Py_FalseStruct variable static struct _longobject _Py_FalseStruct +Objects/tupleobject.c - _Py_fast_tuple_allocs variable Py_ssize_t _Py_fast_tuple_allocs +Objects/stringlib/unicode_format.h - PyFieldNameIter_Type variable static PyTypeObject PyFieldNameIter_Type +Modules/_io/fileio.c - PyFileIO_Type variable PyTypeObject PyFileIO_Type +Python/preconfig.c - Py_FileSystemDefaultEncodeErrors variable const char *Py_FileSystemDefaultEncodeErrors +Python/preconfig.c - Py_FileSystemDefaultEncoding variable const char * Py_FileSystemDefaultEncoding +Python/bltinmodule.c - PyFilter_Type variable PyTypeObject PyFilter_Type +Objects/floatobject.c - PyFloat_Type variable PyTypeObject PyFloat_Type +Objects/stringlib/unicode_format.h - PyFormatterIter_Type variable static PyTypeObject PyFormatterIter_Type +Objects/frameobject.c - PyFrame_Type variable PyTypeObject PyFrame_Type +Python/initconfig.c - Py_FrozenFlag variable int Py_FrozenFlag +Objects/setobject.c - PyFrozenSet_Type variable PyTypeObject PyFrozenSet_Type +Objects/funcobject.c - PyFunction_Type variable PyTypeObject PyFunction_Type +Objects/genobject.c - PyGen_Type variable PyTypeObject PyGen_Type +Objects/descrobject.c - PyGetSetDescr_Type variable PyTypeObject PyGetSetDescr_Type +Python/hamt.c - _PyHamt_ArrayNode_Type variable PyTypeObject _PyHamt_ArrayNode_Type +Python/hamt.c - PyHamt_as_mapping variable static PyMappingMethods PyHamt_as_mapping +Python/hamt.c - PyHamt_as_sequence variable static PySequenceMethods PyHamt_as_sequence +Python/hamt.c - _PyHamt_BitmapNode_Type variable PyTypeObject _PyHamt_BitmapNode_Type +Python/hamt.c - _PyHamt_CollisionNode_Type variable PyTypeObject _PyHamt_CollisionNode_Type +Python/hamt.c - _PyHamtItems_Type variable PyTypeObject _PyHamtItems_Type +Python/hamt.c - PyHamtIterator_as_mapping variable static PyMappingMethods PyHamtIterator_as_mapping +Python/hamt.c - _PyHamtKeys_Type variable PyTypeObject _PyHamtKeys_Type +Python/hamt.c - PyHamt_methods variable static PyMethodDef PyHamt_methods +Python/hamt.c - _PyHamt_Type variable PyTypeObject _PyHamt_Type +Python/hamt.c - _PyHamtValues_Type variable PyTypeObject _PyHamtValues_Type +Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors variable const(int) _Py_HasFileSystemDefaultEncodeErrors +Python/preconfig.c - Py_HasFileSystemDefaultEncoding variable const(int) Py_HasFileSystemDefaultEncoding +Python/pyhash.c - PyHash_Func variable static PyHash_FuncDef PyHash_Func +Python/initconfig.c - Py_HashRandomizationFlag variable int Py_HashRandomizationFlag +Python/pyhash.c - _Py_HashSecret variable _Py_HashSecret_t _Py_HashSecret +Python/bootstrap_hash.c - _Py_HashSecret_Initialized variable static int _Py_HashSecret_Initialized +Python/codecs.c - Py_hexdigits variable const char * Py_hexdigits +Python/sysmodule.c - PyId__ variable _Py_IDENTIFIER(_) +Modules/_abc.c - PyId__abc_impl variable _Py_IDENTIFIER(_abc_impl) +Objects/typeobject.c - PyId___abstractmethods__ variable _Py_IDENTIFIER(__abstractmethods__) +Modules/_abc.c - PyId___abstractmethods__ variable _Py_IDENTIFIER(__abstractmethods__) +Python/ceval.c _PyEval_EvalFrameDefault PyId___aenter__ variable _Py_IDENTIFIER(__aenter__) +Python/ceval.c _PyEval_EvalFrameDefault PyId___aexit__ variable _Py_IDENTIFIER(__aexit__) +Objects/typeobject.c slot_am_aiter PyId___aiter__ variable _Py_IDENTIFIER(__aiter__) +Python/ceval.c import_all_from PyId___all__ variable _Py_IDENTIFIER(__all__) +Objects/typeobject.c slot_am_anext PyId___anext__ variable _Py_IDENTIFIER(__anext__) +Python/Python-ast.c - PyId_annotation variable _Py_IDENTIFIER(annotation) +Python/ceval.c _PyEval_EvalFrameDefault PyId___annotations__ variable _Py_IDENTIFIER(__annotations__) +Python/Python-ast.c - PyId_arg variable _Py_IDENTIFIER(arg) +Python/Python-ast.c - PyId_args variable _Py_IDENTIFIER(args) +Python/Python-ast.c - PyId_argtypes variable _Py_IDENTIFIER(argtypes) +Python/Python-ast.c - PyId_asname variable _Py_IDENTIFIER(asname) +Python/Python-ast.c make_type PyId__ast variable _Py_IDENTIFIER(_ast) +Python/Python-ast.c - PyId_attr variable _Py_IDENTIFIER(attr) +Python/Python-ast.c - PyId__attributes variable _Py_IDENTIFIER(_attributes) +Objects/typeobject.c slot_am_await PyId___await__ variable _Py_IDENTIFIER(__await__) +Python/Python-ast.c - PyId_bases variable _Py_IDENTIFIER(bases) +Modules/_abc.c - PyId___bases__ variable _Py_IDENTIFIER(__bases__) +Objects/abstract.c abstract_get_bases PyId___bases__ variable _Py_IDENTIFIER(__bases__) +Objects/typeobject.c merge_class_dict PyId___bases__ variable _Py_IDENTIFIER(__bases__) +Objects/longobject.c - PyId_big variable _Py_IDENTIFIER(big) +Modules/_io/_iomodule.c _io_open_impl PyId__blksize variable _Py_IDENTIFIER(_blksize) +Python/Python-ast.c - PyId_body variable _Py_IDENTIFIER(body) +Objects/typeobject.c slot_nb_bool PyId___bool__ variable _Py_IDENTIFIER(__bool__) +Python/sysmodule.c - PyId_buffer variable _Py_IDENTIFIER(buffer) +Python/ceval.c _PyEval_EvalFrameDefault PyId___build_class__ variable _Py_IDENTIFIER(__build_class__) +Objects/typeobject.c - PyId_builtins variable _Py_IDENTIFIER(builtins) +Python/errors.c - PyId_builtins variable _Py_IDENTIFIER(builtins) +Python/pythonrun.c - PyId_builtins variable _Py_IDENTIFIER(builtins) +Python/sysmodule.c - PyId_builtins variable _Py_IDENTIFIER(builtins) +Objects/frameobject.c - PyId___builtins__ variable _Py_IDENTIFIER(__builtins__) +Python/bltinmodule.c - PyId___builtins__ variable _Py_IDENTIFIER(__builtins__) +Python/import.c module_dict_for_exec PyId___builtins__ variable _Py_IDENTIFIER(__builtins__) +Objects/object.c - PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) +Objects/bytesobject.c format_obj PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) +Objects/bytesobject.c bytes_new PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) +Objects/weakrefobject.c proxy_bytes PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) +Objects/typeobject.c slot_tp_call PyId___call__ variable _Py_IDENTIFIER(__call__) +Python/Python-ast.c - PyId_cause variable _Py_IDENTIFIER(cause) +Objects/typeobject.c - PyId___class__ variable _Py_IDENTIFIER(__class__) +Modules/_abc.c - PyId___class__ variable _Py_IDENTIFIER(__class__) +Python/compile.c compiler_enter_scope PyId___class__ variable _Py_IDENTIFIER(__class__) +Objects/abstract.c recursive_isinstance PyId___class__ variable _Py_IDENTIFIER(__class__) +Objects/typeobject.c type_new PyId___classcell__ variable _Py_IDENTIFIER(__classcell__) +Objects/typeobject.c - PyId___class_getitem__ variable _Py_IDENTIFIER(__class_getitem__) +Objects/abstract.c PyObject_GetItem PyId___class_getitem__ variable _Py_IDENTIFIER(__class_getitem__) +Python/import.c PyImport_Cleanup PyId_clear variable _Py_IDENTIFIER(clear) +Python/traceback.c - PyId_close variable _Py_IDENTIFIER(close) +Modules/_io/bufferedio.c - PyId_close variable _Py_IDENTIFIER(close) +Modules/_io/textio.c - PyId_close variable _Py_IDENTIFIER(close) +Objects/genobject.c gen_close_iter PyId_close variable _Py_IDENTIFIER(close) +Modules/_dbmmodule.c dbm__exit__ PyId_close variable _Py_IDENTIFIER(close) +Modules/_gdbmmodule.c dbm__exit__ PyId_close variable _Py_IDENTIFIER(close) +Python/pythonrun.c _Py_HandleSystemExit PyId_code variable _Py_IDENTIFIER(code) +Python/Python-ast.c - PyId_col_offset variable _Py_IDENTIFIER(col_offset) +Python/Python-ast.c - PyId_comparators variable _Py_IDENTIFIER(comparators) +Objects/complexobject.c try_complex_special_method PyId___complex__ variable _Py_IDENTIFIER(__complex__) +Objects/typeobject.c slot_sq_contains PyId___contains__ variable _Py_IDENTIFIER(__contains__) +Python/Python-ast.c - PyId_context_expr variable _Py_IDENTIFIER(context_expr) +Python/Python-ast.c - PyId_conversion variable _Py_IDENTIFIER(conversion) +Modules/itertoolsmodule.c itertools_tee_impl PyId___copy__ variable _Py_IDENTIFIER(__copy__) +Objects/descrobject.c mappingproxy_copy PyId_copy variable _Py_IDENTIFIER(copy) +Objects/typeobject.c import_copyreg PyId_copyreg variable _Py_IDENTIFIER(copyreg) +Python/Python-ast.c - PyId_ctx variable _Py_IDENTIFIER(ctx) +Modules/_io/bufferedio.c - PyId__dealloc_warn variable _Py_IDENTIFIER(_dealloc_warn) +Modules/_io/textio.c - PyId__dealloc_warn variable _Py_IDENTIFIER(_dealloc_warn) +Modules/_io/textio.c - PyId_decode variable _Py_IDENTIFIER(decode) +Python/Python-ast.c - PyId_decorator_list variable _Py_IDENTIFIER(decorator_list) +Python/_warnings.c get_default_action PyId_defaultaction variable _Py_IDENTIFIER(defaultaction) +Python/Python-ast.c - PyId_defaults variable _Py_IDENTIFIER(defaults) +Objects/typeobject.c slot_tp_finalize PyId___del__ variable _Py_IDENTIFIER(__del__) +Objects/typeobject.c slot_tp_setattro PyId___delattr__ variable _Py_IDENTIFIER(__delattr__) +Objects/typeobject.c slot_tp_descr_set PyId___delete__ variable _Py_IDENTIFIER(__delete__) +Objects/typeobject.c - PyId___delitem__ variable _Py_IDENTIFIER(__delitem__) +Objects/typeobject.c - PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Modules/_abc.c - PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Python/bltinmodule.c - PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Python/Python-ast.c ast_type_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Python/ceval.c import_all_from PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Objects/bytearrayobject.c _common_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Objects/moduleobject.c module_dir PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Objects/odictobject.c odict_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Objects/setobject.c set_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Modules/_collectionsmodule.c deque_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Objects/dictobject.c dictviews_sub PyId_difference_update variable _Py_IDENTIFIER(difference_update) +Python/Python-ast.c - PyId_dims variable _Py_IDENTIFIER(dims) +Objects/object.c - PyId___dir__ variable _Py_IDENTIFIER(__dir__) +Objects/moduleobject.c module_dir PyId___dir__ variable _Py_IDENTIFIER(__dir__) +Python/ceval.c _PyEval_EvalFrameDefault PyId_displayhook variable _Py_IDENTIFIER(displayhook) +Objects/typeobject.c - PyId___doc__ variable _Py_IDENTIFIER(__doc__) +Objects/descrobject.c property_init_impl PyId___doc__ variable _Py_IDENTIFIER(__doc__) +Objects/moduleobject.c module_init_dict PyId___doc__ variable _Py_IDENTIFIER(__doc__) +Objects/moduleobject.c PyModule_SetDocString PyId___doc__ variable _Py_IDENTIFIER(__doc__) +Python/Python-ast.c - PyId_elt variable _Py_IDENTIFIER(elt) +Python/Python-ast.c - PyId_elts variable _Py_IDENTIFIER(elts) +Modules/faulthandler.c - PyId_enable variable _Py_IDENTIFIER(enable) +Python/sysmodule.c - PyId_encoding variable _Py_IDENTIFIER(encoding) +Python/bltinmodule.c - PyId_encoding variable _Py_IDENTIFIER(encoding) +Python/pythonrun.c PyRun_InteractiveOneObjectEx PyId_encoding variable _Py_IDENTIFIER(encoding) +Python/Python-ast.c - PyId_end_col_offset variable _Py_IDENTIFIER(end_col_offset) +Python/Python-ast.c - PyId_end_lineno variable _Py_IDENTIFIER(end_lineno) +Python/ceval.c _PyEval_EvalFrameDefault PyId___enter__ variable _Py_IDENTIFIER(__enter__) +Objects/typeobject.c overrides_hash PyId___eq__ variable _Py_IDENTIFIER(__eq__) +Python/bltinmodule.c - PyId_errors variable _Py_IDENTIFIER(errors) +Python/Python-ast.c - PyId_exc variable _Py_IDENTIFIER(exc) +Python/pythonrun.c - PyId_excepthook variable _Py_IDENTIFIER(excepthook) +Python/ceval.c _PyEval_EvalFrameDefault PyId___exit__ variable _Py_IDENTIFIER(__exit__) +Modules/_pickle.c do_append PyId_extend variable _Py_IDENTIFIER(extend) +Python/Python-ast.c - PyId__fields variable _Py_IDENTIFIER(_fields) +Objects/moduleobject.c PyModule_GetFilenameObject PyId___file__ variable _Py_IDENTIFIER(__file__) +Python/errors.c PyErr_SyntaxLocationObject PyId_filename variable _Py_IDENTIFIER(filename) +Python/pythonrun.c parse_syntax_error PyId_filename variable _Py_IDENTIFIER(filename) +Modules/_io/textio.c - PyId_fileno variable _Py_IDENTIFIER(fileno) +Modules/faulthandler.c - PyId_fileno variable _Py_IDENTIFIER(fileno) +Python/bltinmodule.c - PyId_fileno variable _Py_IDENTIFIER(fileno) +Objects/fileobject.c PyObject_AsFileDescriptor PyId_fileno variable _Py_IDENTIFIER(fileno) +Modules/itertoolsmodule.c zip_longest_new PyId_fillvalue variable _Py_IDENTIFIER(fillvalue) +Python/_warnings.c get_filter PyId_filters variable _Py_IDENTIFIER(filters) +Python/Python-ast.c - PyId_finalbody variable _Py_IDENTIFIER(finalbody) +Modules/_io/iobase.c iobase_finalize PyId__finalizing variable _Py_IDENTIFIER(_finalizing) +Python/import.c import_find_and_load PyId__find_and_load variable _Py_IDENTIFIER(_find_and_load) +Python/import.c PyImport_ExecCodeModuleObject PyId__fix_up_module variable _Py_IDENTIFIER(_fix_up_module) +Python/errors.c - PyId_flush variable _Py_IDENTIFIER(flush) +Python/pylifecycle.c - PyId_flush variable _Py_IDENTIFIER(flush) +Python/pythonrun.c - PyId_flush variable _Py_IDENTIFIER(flush) +Modules/_threadmodule.c - PyId_flush variable _Py_IDENTIFIER(flush) +Modules/_io/bufferedio.c - PyId_flush variable _Py_IDENTIFIER(flush) +Modules/_io/textio.c - PyId_flush variable _Py_IDENTIFIER(flush) +Modules/faulthandler.c - PyId_flush variable _Py_IDENTIFIER(flush) +Python/bltinmodule.c - PyId_flush variable _Py_IDENTIFIER(flush) +Objects/abstract.c PyObject_Format PyId___format__ variable _Py_IDENTIFIER(__format__) +Python/Python-ast.c - PyId_format_spec variable _Py_IDENTIFIER(format_spec) +Modules/posixmodule.c path_converter PyId___fspath__ variable _Py_IDENTIFIER(__fspath__) +Modules/posixmodule.c PyOS_FSPath PyId___fspath__ variable _Py_IDENTIFIER(__fspath__) +Python/Python-ast.c - PyId_func variable _Py_IDENTIFIER(func) +Python/Python-ast.c - PyId_generators variable _Py_IDENTIFIER(generators) +Objects/descrobject.c mappingproxy_get PyId_get variable _Py_IDENTIFIER(get) +Modules/_collectionsmodule.c _count_elements PyId_get variable _Py_IDENTIFIER(get) +Objects/typeobject.c slot_tp_descr_get PyId___get__ variable _Py_IDENTIFIER(__get__) +Objects/classobject.c method_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) +Objects/descrobject.c descr_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) +Objects/descrobject.c wrapper_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) +Objects/moduleobject.c module_getattro PyId___getattr__ variable _Py_IDENTIFIER(__getattr__) +Objects/methodobject.c meth_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) +Objects/typeobject.c slot_tp_getattr_hook PyId___getattr__ variable _Py_IDENTIFIER(__getattr__) +Objects/typeobject.c - PyId___getattribute__ variable _Py_IDENTIFIER(__getattribute__) +Objects/typeobject.c - PyId___getitem__ variable _Py_IDENTIFIER(__getitem__) +Objects/typeobject.c _PyObject_GetNewArguments PyId___getnewargs__ variable _Py_IDENTIFIER(__getnewargs__) +Objects/typeobject.c _PyObject_GetNewArguments PyId___getnewargs_ex__ variable _Py_IDENTIFIER(__getnewargs_ex__) +Modules/_io/textio.c - PyId_getpreferredencoding variable _Py_IDENTIFIER(getpreferredencoding) +Python/_warnings.c get_source_line PyId_get_source variable _Py_IDENTIFIER(get_source) +Python/import.c PyImport_ExecCodeModuleWithPathnames PyId__get_sourcefile variable _Py_IDENTIFIER(_get_sourcefile) +Objects/typeobject.c _PyObject_GetState PyId___getstate__ variable _Py_IDENTIFIER(__getstate__) +Python/import.c PyImport_ImportModuleLevelObject PyId__handle_fromlist variable _Py_IDENTIFIER(_handle_fromlist) +Python/Python-ast.c - PyId_handlers variable _Py_IDENTIFIER(handlers) +Objects/typeobject.c - PyId___hash__ variable _Py_IDENTIFIER(__hash__) +Python/Python-ast.c - PyId_id variable _Py_IDENTIFIER(id) +Python/Python-ast.c - PyId_ifs variable _Py_IDENTIFIER(ifs) +Python/import.c PyImport_ReloadModule PyId_imp variable _Py_IDENTIFIER(imp) +Python/ceval.c import_name PyId___import__ variable _Py_IDENTIFIER(__import__) +Objects/typeobject.c slot_nb_index PyId___index__ variable _Py_IDENTIFIER(__index__) +Objects/typeobject.c slot_tp_init PyId___init__ variable _Py_IDENTIFIER(__init__) +Objects/moduleobject.c _PyModuleSpec_IsInitializing PyId__initializing variable _Py_IDENTIFIER(_initializing) +Objects/typeobject.c - PyId___init_subclass__ variable _Py_IDENTIFIER(__init_subclass__) +Objects/abstract.c PyObject_IsInstance PyId___instancecheck__ variable _Py_IDENTIFIER(__instancecheck__) +Objects/dictobject.c _PyDictView_Intersect PyId_intersection_update variable _Py_IDENTIFIER(intersection_update) +Modules/_io/iobase.c - PyId___IOBase_closed variable _Py_IDENTIFIER(__IOBase_closed) +Objects/typeobject.c slot_nb_inplace_power PyId___ipow__ variable _Py_IDENTIFIER(__ipow__) +Objects/object.c - PyId___isabstractmethod__ variable _Py_IDENTIFIER(__isabstractmethod__) +Python/Python-ast.c - PyId_is_async variable _Py_IDENTIFIER(is_async) +Modules/_io/bufferedio.c - PyId_isatty variable _Py_IDENTIFIER(isatty) +Modules/_io/textio.c - PyId_isatty variable _Py_IDENTIFIER(isatty) +Python/pylifecycle.c create_stdio PyId_isatty variable _Py_IDENTIFIER(isatty) +Modules/_io/_iomodule.c _io_open_impl PyId_isatty variable _Py_IDENTIFIER(isatty) +Python/codecs.c _PyCodec_LookupTextEncoding PyId__is_text_encoding variable _Py_IDENTIFIER(_is_text_encoding) +Python/Python-ast.c - PyId_items variable _Py_IDENTIFIER(items) +Objects/abstract.c PyMapping_Items PyId_items variable _Py_IDENTIFIER(items) +Objects/descrobject.c mappingproxy_items PyId_items variable _Py_IDENTIFIER(items) +Objects/odictobject.c odict_reduce PyId_items variable _Py_IDENTIFIER(items) +Objects/odictobject.c odict_repr PyId_items variable _Py_IDENTIFIER(items) +Objects/odictobject.c mutablemapping_update PyId_items variable _Py_IDENTIFIER(items) +Objects/typeobject.c _PyObject_GetItemsIter PyId_items variable _Py_IDENTIFIER(items) +Modules/_collectionsmodule.c defdict_reduce PyId_items variable _Py_IDENTIFIER(items) +Python/Python-ast.c - PyId_iter variable _Py_IDENTIFIER(iter) +Objects/bytearrayobject.c bytearrayiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/bytesobject.c striter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/dictobject.c dictiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/iterobject.c iter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/iterobject.c calliter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/listobject.c listiter_reduce_general PyId_iter variable _Py_IDENTIFIER(iter) +Objects/odictobject.c odictiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/rangeobject.c rangeiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/rangeobject.c longrangeiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/setobject.c setiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/tupleobject.c tupleiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/unicodeobject.c unicodeiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/typeobject.c slot_tp_iter PyId___iter__ variable _Py_IDENTIFIER(__iter__) +Modules/arraymodule.c array_arrayiterator___reduce___impl PyId_iter variable _Py_IDENTIFIER(iter) +Python/Python-ast.c - PyId_key variable _Py_IDENTIFIER(key) +Python/Python-ast.c - PyId_keys variable _Py_IDENTIFIER(keys) +Objects/abstract.c PyMapping_Keys PyId_keys variable _Py_IDENTIFIER(keys) +Objects/descrobject.c mappingproxy_keys PyId_keys variable _Py_IDENTIFIER(keys) +Objects/dictobject.c dict_update_common PyId_keys variable _Py_IDENTIFIER(keys) +Objects/odictobject.c mutablemapping_update PyId_keys variable _Py_IDENTIFIER(keys) +Python/Python-ast.c - PyId_keywords variable _Py_IDENTIFIER(keywords) +Python/Python-ast.c - PyId_kind variable _Py_IDENTIFIER(kind) +Python/Python-ast.c - PyId_kwarg variable _Py_IDENTIFIER(kwarg) +Python/Python-ast.c - PyId_kw_defaults variable _Py_IDENTIFIER(kw_defaults) +Python/Python-ast.c - PyId_kwonlyargs variable _Py_IDENTIFIER(kwonlyargs) +Python/pythonrun.c - PyId_last_traceback variable _Py_IDENTIFIER(last_traceback) +Python/pythonrun.c - PyId_last_type variable _Py_IDENTIFIER(last_type) +Python/pythonrun.c - PyId_last_value variable _Py_IDENTIFIER(last_value) +Python/Python-ast.c - PyId_left variable _Py_IDENTIFIER(left) +Objects/typeobject.c - PyId___len__ variable _Py_IDENTIFIER(__len__) +Objects/abstract.c PyObject_LengthHint PyId___length_hint__ variable _Py_IDENTIFIER(__length_hint__) +Python/Python-ast.c - PyId_level variable _Py_IDENTIFIER(level) +Python/Python-ast.c - PyId_lineno variable _Py_IDENTIFIER(lineno) +Python/errors.c PyErr_SyntaxLocationObject PyId_lineno variable _Py_IDENTIFIER(lineno) +Python/pythonrun.c parse_syntax_error PyId_lineno variable _Py_IDENTIFIER(lineno) +Objects/longobject.c - PyId_little variable _Py_IDENTIFIER(little) +Python/_warnings.c get_source_line PyId___loader__ variable _Py_IDENTIFIER(__loader__) +Objects/moduleobject.c module_init_dict PyId___loader__ variable _Py_IDENTIFIER(__loader__) +Python/import.c PyImport_ImportModuleLevelObject PyId__lock_unlock_module variable _Py_IDENTIFIER(_lock_unlock_module) +Python/Python-ast.c - PyId_lower variable _Py_IDENTIFIER(lower) +Python/ceval.c _PyEval_EvalFrameDefault PyId___ltrace__ variable _Py_IDENTIFIER(__ltrace__) +Python/pythonrun.c PyRun_InteractiveOneObjectEx PyId___main__ variable _Py_IDENTIFIER(__main__) +Python/_warnings.c check_matched PyId_match variable _Py_IDENTIFIER(match) +Python/bltinmodule.c - PyId_metaclass variable _Py_IDENTIFIER(metaclass) +Objects/dictobject.c dict_subscript PyId___missing__ variable _Py_IDENTIFIER(__missing__) +Modules/_io/bufferedio.c - PyId_mode variable _Py_IDENTIFIER(mode) +Modules/_io/textio.c - PyId_mode variable _Py_IDENTIFIER(mode) +Python/pylifecycle.c create_stdio PyId_mode variable _Py_IDENTIFIER(mode) +Modules/_io/_iomodule.c _io_open_impl PyId_mode variable _Py_IDENTIFIER(mode) +Python/Python-ast.c - PyId_module variable _Py_IDENTIFIER(module) +Objects/typeobject.c - PyId___module__ variable _Py_IDENTIFIER(__module__) +Python/Python-ast.c make_type PyId___module__ variable _Py_IDENTIFIER(__module__) +Python/errors.c PyErr_NewException PyId___module__ variable _Py_IDENTIFIER(__module__) +Python/errors.c PyErr_NewException PyId___module__ variable _Py_IDENTIFIER(__module__) +Python/pythonrun.c print_exception PyId___module__ variable _Py_IDENTIFIER(__module__) +Modules/_pickle.c whichmodule PyId___module__ variable _Py_IDENTIFIER(__module__) +Objects/typeobject.c type_mro_modified PyId_mro variable _Py_IDENTIFIER(mro) +Objects/typeobject.c mro_invoke PyId_mro variable _Py_IDENTIFIER(mro) +Python/bltinmodule.c - PyId___mro_entries__ variable _Py_IDENTIFIER(__mro_entries__) +Objects/typeobject.c type_new PyId___mro_entries__ variable _Py_IDENTIFIER(__mro_entries__) +Python/Python-ast.c - PyId_msg variable _Py_IDENTIFIER(msg) +Python/errors.c PyErr_SyntaxLocationObject PyId_msg variable _Py_IDENTIFIER(msg) +Python/pythonrun.c parse_syntax_error PyId_msg variable _Py_IDENTIFIER(msg) +Python/pylifecycle.c - PyId_name variable _Py_IDENTIFIER(name) +Modules/_io/fileio.c - PyId_name variable _Py_IDENTIFIER(name) +Modules/_io/bufferedio.c - PyId_name variable _Py_IDENTIFIER(name) +Modules/_io/textio.c - PyId_name variable _Py_IDENTIFIER(name) +Python/Python-ast.c - PyId_name variable _Py_IDENTIFIER(name) +Objects/exceptions.c ImportError_getstate PyId_name variable _Py_IDENTIFIER(name) +Objects/typeobject.c - PyId___name__ variable _Py_IDENTIFIER(__name__) +Objects/classobject.c - PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/_warnings.c setup_context PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/_warnings.c get_source_line PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/_warnings.c show_warning PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/ceval.c import_from PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/ceval.c import_all_from PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/import.c resolve_name PyId___name__ variable _Py_IDENTIFIER(__name__) +Objects/moduleobject.c module_init_dict PyId___name__ variable _Py_IDENTIFIER(__name__) +Objects/moduleobject.c PyModule_GetNameObject PyId___name__ variable _Py_IDENTIFIER(__name__) +Objects/moduleobject.c module_getattro PyId___name__ variable _Py_IDENTIFIER(__name__) +Objects/weakrefobject.c weakref_repr PyId___name__ variable _Py_IDENTIFIER(__name__) +Modules/_pickle.c save_global PyId___name__ variable _Py_IDENTIFIER(__name__) +Modules/_pickle.c save_reduce PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/Python-ast.c - PyId_names variable _Py_IDENTIFIER(names) +Objects/typeobject.c - PyId___new__ variable _Py_IDENTIFIER(__new__) +Objects/typeobject.c reduce_newobj PyId___newobj__ variable _Py_IDENTIFIER(__newobj__) +Objects/typeobject.c reduce_newobj PyId___newobj_ex__ variable _Py_IDENTIFIER(__newobj_ex__) +Objects/typeobject.c slot_tp_iternext PyId___next__ variable _Py_IDENTIFIER(__next__) +Objects/structseq.c - PyId_n_fields variable _Py_IDENTIFIER(n_fields) +Python/ast.c new_identifier PyId_NFKC variable _Py_IDENTIFIER(NFKC) +Objects/structseq.c - PyId_n_sequence_fields variable _Py_IDENTIFIER(n_sequence_fields) +Objects/structseq.c - PyId_n_unnamed_fields variable _Py_IDENTIFIER(n_unnamed_fields) +Python/errors.c PyErr_SyntaxLocationObject PyId_offset variable _Py_IDENTIFIER(offset) +Python/pythonrun.c parse_syntax_error PyId_offset variable _Py_IDENTIFIER(offset) +Python/_warnings.c get_once_registry PyId_onceregistry variable _Py_IDENTIFIER(onceregistry) +Python/Python-ast.c - PyId_op variable _Py_IDENTIFIER(op) +Python/traceback.c - PyId_open variable _Py_IDENTIFIER(open) +Python/pylifecycle.c create_stdio PyId_open variable _Py_IDENTIFIER(open) +Parser/tokenizer.c fp_setreadl PyId_open variable _Py_IDENTIFIER(open) +Objects/fileobject.c PyFile_FromFd PyId_open variable _Py_IDENTIFIER(open) +Objects/fileobject.c PyFile_OpenCodeObject PyId_open variable _Py_IDENTIFIER(open) +Python/Python-ast.c - PyId_operand variable _Py_IDENTIFIER(operand) +Python/Python-ast.c - PyId_ops variable _Py_IDENTIFIER(ops) +Python/Python-ast.c - PyId_optional_vars variable _Py_IDENTIFIER(optional_vars) +Python/Python-ast.c - PyId_orelse variable _Py_IDENTIFIER(orelse) +Python/import.c resolve_name PyId___package__ variable _Py_IDENTIFIER(__package__) +Objects/moduleobject.c module_init_dict PyId___package__ variable _Py_IDENTIFIER(__package__) +Python/import.c resolve_name PyId_parent variable _Py_IDENTIFIER(parent) +Modules/_operator.c methodcaller_reduce PyId_partial variable _Py_IDENTIFIER(partial) +Python/sysmodule.c - PyId_path variable _Py_IDENTIFIER(path) +Python/traceback.c - PyId_path variable _Py_IDENTIFIER(path) +Objects/exceptions.c ImportError_getstate PyId_path variable _Py_IDENTIFIER(path) +Modules/main.c pymain_sys_path_add_path0 PyId_path variable _Py_IDENTIFIER(path) +Python/import.c resolve_name PyId___path__ variable _Py_IDENTIFIER(__path__) +Python/import.c PyImport_ImportModuleLevelObject PyId___path__ variable _Py_IDENTIFIER(__path__) +Modules/_io/bufferedio.c - PyId_peek variable _Py_IDENTIFIER(peek) +Python/Python-ast.c - PyId_posonlyargs variable _Py_IDENTIFIER(posonlyargs) +Objects/typeobject.c slot_nb_power PyId___pow__ variable _Py_IDENTIFIER(__pow__) +Python/bltinmodule.c - PyId___prepare__ variable _Py_IDENTIFIER(__prepare__) +Python/errors.c PyErr_SyntaxLocationObject PyId_print_file_and_line variable _Py_IDENTIFIER(print_file_and_line) +Python/pythonrun.c print_exception PyId_print_file_and_line variable _Py_IDENTIFIER(print_file_and_line) +Python/pythonrun.c - PyId_ps1 variable _Py_IDENTIFIER(ps1) +Python/pythonrun.c - PyId_ps2 variable _Py_IDENTIFIER(ps2) +Objects/object.c - PyId_Py_Repr variable _Py_IDENTIFIER(Py_Repr) +Objects/classobject.c - PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) +Objects/descrobject.c calculate_qualname PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) +Objects/methodobject.c meth_get__qualname__ PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) +Objects/typeobject.c type_new PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) +Modules/_io/textio.c - PyId_raw variable _Py_IDENTIFIER(raw) +Python/pylifecycle.c create_stdio PyId_raw variable _Py_IDENTIFIER(raw) +Modules/_io/iobase.c - PyId_read variable _Py_IDENTIFIER(read) +Modules/_io/bufferedio.c - PyId_read variable _Py_IDENTIFIER(read) +Modules/_io/textio.c - PyId_read variable _Py_IDENTIFIER(read) +Modules/_io/bufferedio.c - PyId_read1 variable _Py_IDENTIFIER(read1) +Python/marshal.c marshal_load PyId_read variable _Py_IDENTIFIER(read) +Modules/_io/bufferedio.c - PyId_readable variable _Py_IDENTIFIER(readable) +Modules/_io/textio.c - PyId_readable variable _Py_IDENTIFIER(readable) +Modules/_io/iobase.c _io__RawIOBase_read_impl PyId_readall variable _Py_IDENTIFIER(readall) +Modules/_io/bufferedio.c - PyId_readinto variable _Py_IDENTIFIER(readinto) +Modules/_io/bufferedio.c - PyId_readinto1 variable _Py_IDENTIFIER(readinto1) +Python/marshal.c r_string PyId_readinto variable _Py_IDENTIFIER(readinto) +Parser/tokenizer.c fp_setreadl PyId_readline variable _Py_IDENTIFIER(readline) +Objects/fileobject.c PyFile_GetLine PyId_readline variable _Py_IDENTIFIER(readline) +Objects/typeobject.c object___reduce_ex___impl PyId___reduce__ variable _Py_IDENTIFIER(__reduce__) +Python/import.c PyImport_ReloadModule PyId_reload variable _Py_IDENTIFIER(reload) +Modules/_io/textio.c - PyId_replace variable _Py_IDENTIFIER(replace) +Python/importdl.c get_encoded_name PyId_replace variable _Py_IDENTIFIER(replace) +Objects/typeobject.c slot_tp_repr PyId___repr__ variable _Py_IDENTIFIER(__repr__) +Modules/_io/textio.c - PyId_reset variable _Py_IDENTIFIER(reset) +Python/Python-ast.c - PyId_returns variable _Py_IDENTIFIER(returns) +Objects/enumobject.c reversed_new_impl PyId___reversed__ variable _Py_IDENTIFIER(__reversed__) +Objects/listobject.c listiter_reduce_general PyId_reversed variable _Py_IDENTIFIER(reversed) +Python/Python-ast.c - PyId_right variable _Py_IDENTIFIER(right) +Python/bltinmodule.c - PyId___round__ variable _Py_IDENTIFIER(__round__) +Modules/_io/textio.c - PyId_seek variable _Py_IDENTIFIER(seek) +Modules/_io/iobase.c _io__IOBase_tell_impl PyId_seek variable _Py_IDENTIFIER(seek) +Modules/_io/textio.c - PyId_seekable variable _Py_IDENTIFIER(seekable) +Python/ceval.c _PyEval_EvalFrameDefault PyId_send variable _Py_IDENTIFIER(send) +Objects/typeobject.c slot_tp_descr_set PyId___set__ variable _Py_IDENTIFIER(__set__) +Objects/typeobject.c slot_tp_setattro PyId___setattr__ variable _Py_IDENTIFIER(__setattr__) +Objects/typeobject.c - PyId___setitem__ variable _Py_IDENTIFIER(__setitem__) +Modules/_collectionsmodule.c _count_elements PyId___setitem__ variable _Py_IDENTIFIER(__setitem__) +Objects/typeobject.c - PyId___set_name__ variable _Py_IDENTIFIER(__set_name__) +Modules/_io/textio.c - PyId_setstate variable _Py_IDENTIFIER(setstate) +Modules/_pickle.c load_build PyId___setstate__ variable _Py_IDENTIFIER(__setstate__) +Python/_warnings.c call_show_warning PyId__showwarnmsg variable _Py_IDENTIFIER(_showwarnmsg) +Python/pylifecycle.c wait_for_thread_shutdown PyId__shutdown variable _Py_IDENTIFIER(_shutdown) +Python/Python-ast.c - PyId_simple variable _Py_IDENTIFIER(simple) +Python/sysmodule.c - PyId___sizeof__ variable _Py_IDENTIFIER(__sizeof__) +Python/Python-ast.c - PyId_slice variable _Py_IDENTIFIER(slice) +Objects/typeobject.c _PyType_GetSlotNames PyId___slotnames__ variable _Py_IDENTIFIER(__slotnames__) +Objects/typeobject.c _PyType_GetSlotNames PyId__slotnames variable _Py_IDENTIFIER(_slotnames) +Objects/typeobject.c type_new PyId___slots__ variable _Py_IDENTIFIER(__slots__) +Python/bltinmodule.c - PyId_sort variable _Py_IDENTIFIER(sort) +Python/import.c resolve_name PyId___spec__ variable _Py_IDENTIFIER(__spec__) +Python/import.c PyImport_ImportModuleLevelObject PyId___spec__ variable _Py_IDENTIFIER(__spec__) +Objects/moduleobject.c module_init_dict PyId___spec__ variable _Py_IDENTIFIER(__spec__) +Objects/moduleobject.c module_getattro PyId___spec__ variable _Py_IDENTIFIER(__spec__) +Python/_warnings.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/errors.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/pylifecycle.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/pythonrun.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/sysmodule.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Modules/_threadmodule.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Modules/faulthandler.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/bltinmodule.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/pylifecycle.c - PyId_stdin variable _Py_IDENTIFIER(stdin) +Python/pythonrun.c - PyId_stdin variable _Py_IDENTIFIER(stdin) +Python/bltinmodule.c - PyId_stdin variable _Py_IDENTIFIER(stdin) +Python/pylifecycle.c - PyId_stdout variable _Py_IDENTIFIER(stdout) +Python/pythonrun.c - PyId_stdout variable _Py_IDENTIFIER(stdout) +Python/sysmodule.c - PyId_stdout variable _Py_IDENTIFIER(stdout) +Python/bltinmodule.c - PyId_stdout variable _Py_IDENTIFIER(stdout) +Python/Python-ast.c - PyId_step variable _Py_IDENTIFIER(step) +Modules/posixmodule.c DirEntry_test_mode PyId_st_mode variable _Py_IDENTIFIER(st_mode) +Modules/_io/textio.c - PyId_strict variable _Py_IDENTIFIER(strict) +Python/pythonrun.c - PyId_string variable _Py_static_string(PyId_string, """") +Modules/timemodule.c time_strptime PyId__strptime_time variable _Py_IDENTIFIER(_strptime_time) +Modules/posixmodule.c wait_helper PyId_struct_rusage variable _Py_IDENTIFIER(struct_rusage) +Modules/_abc.c - PyId___subclasscheck__ variable _Py_IDENTIFIER(__subclasscheck__) +Objects/abstract.c PyObject_IsSubclass PyId___subclasscheck__ variable _Py_IDENTIFIER(__subclasscheck__) +Modules/_abc.c - PyId___subclasshook__ variable _Py_IDENTIFIER(__subclasshook__) +Objects/dictobject.c dictviews_xor PyId_symmetric_difference_update variable _Py_IDENTIFIER(symmetric_difference_update) +Python/Python-ast.c - PyId_tag variable _Py_IDENTIFIER(tag) +Python/Python-ast.c - PyId_target variable _Py_IDENTIFIER(target) +Python/Python-ast.c - PyId_targets variable _Py_IDENTIFIER(targets) +Modules/_io/textio.c - PyId_tell variable _Py_IDENTIFIER(tell) +Python/Python-ast.c - PyId_test variable _Py_IDENTIFIER(test) +Python/errors.c PyErr_SyntaxLocationObject PyId_text variable _Py_IDENTIFIER(text) +Python/pythonrun.c parse_syntax_error PyId_text variable _Py_IDENTIFIER(text) +Python/traceback.c - PyId_TextIOWrapper variable _Py_IDENTIFIER(TextIOWrapper) +Python/pylifecycle.c create_stdio PyId_TextIOWrapper variable _Py_IDENTIFIER(TextIOWrapper) +Python/pylifecycle.c - PyId_threading variable _Py_IDENTIFIER(threading) +Objects/genobject.c _gen_throw PyId_throw variable _Py_IDENTIFIER(throw) +Objects/abstract.c PyNumber_Long PyId___trunc__ variable _Py_IDENTIFIER(__trunc__) +Python/Python-ast.c - PyId_type variable _Py_IDENTIFIER(type) +Python/Python-ast.c - PyId_type_comment variable _Py_IDENTIFIER(type_comment) +Python/Python-ast.c - PyId_type_ignores variable _Py_IDENTIFIER(type_ignores) +Python/errors.c _PyErr_WriteUnraisableMsg PyId_unraisablehook variable _Py_IDENTIFIER(unraisablehook) +Objects/dictobject.c dictviews_or PyId_update variable _Py_IDENTIFIER(update) +Python/Python-ast.c - PyId_upper variable _Py_IDENTIFIER(upper) +Python/Python-ast.c - PyId_value variable _Py_IDENTIFIER(value) +Python/Python-ast.c - PyId_values variable _Py_IDENTIFIER(values) +Objects/abstract.c PyMapping_Values PyId_values variable _Py_IDENTIFIER(values) +Objects/descrobject.c mappingproxy_values PyId_values variable _Py_IDENTIFIER(values) +Python/Python-ast.c - PyId_vararg variable _Py_IDENTIFIER(vararg) +Python/_warnings.c already_warned PyId_version variable _Py_IDENTIFIER(version) +Python/_warnings.c call_show_warning PyId_WarningMessage variable _Py_IDENTIFIER(WarningMessage) +Python/_warnings.c setup_context PyId___warningregistry__ variable _Py_IDENTIFIER(__warningregistry__) +Python/_warnings.c get_warnings_attr PyId_warnings variable _Py_IDENTIFIER(warnings) +Python/sysmodule.c - PyId_warnoptions variable _Py_IDENTIFIER(warnoptions) +Python/_warnings.c _PyErr_WarnUnawaitedCoroutine PyId__warn_unawaited_coroutine variable _Py_IDENTIFIER(_warn_unawaited_coroutine) +Modules/_io/bufferedio.c - PyId_writable variable _Py_IDENTIFIER(writable) +Modules/_io/textio.c - PyId_writable variable _Py_IDENTIFIER(writable) +Python/sysmodule.c - PyId_write variable _Py_IDENTIFIER(write) +Modules/_io/bufferedio.c - PyId_write variable _Py_IDENTIFIER(write) +Python/marshal.c marshal_dump_impl PyId_write variable _Py_IDENTIFIER(write) +Objects/fileobject.c PyFile_WriteObject PyId_write variable _Py_IDENTIFIER(write) +Python/sysmodule.c - PyId__xoptions variable _Py_IDENTIFIER(_xoptions) +Python/import.c _PyImportZip_Init PyId_zipimporter variable _Py_IDENTIFIER(zipimporter) +Python/initconfig.c - Py_IgnoreEnvironmentFlag variable int Py_IgnoreEnvironmentFlag +Python/dynload_shlib.c - _PyImport_DynLoadFiletab variable const char *_PyImport_DynLoadFiletab[] +Python/frozen.c - PyImport_FrozenModules variable const struct _frozen * PyImport_FrozenModules +Modules/config.c - _PyImport_Inittab variable struct _inittab _PyImport_Inittab[] +Python/import.c - PyImport_Inittab variable struct _inittab * PyImport_Inittab +Modules/_io/textio.c - PyIncrementalNewlineDecoder_Type variable PyTypeObject PyIncrementalNewlineDecoder_Type +Python/initconfig.c - Py_InspectFlag variable int Py_InspectFlag +Objects/classobject.c - PyInstanceMethod_Type variable PyTypeObject PyInstanceMethod_Type +Python/initconfig.c - Py_InteractiveFlag variable int Py_InteractiveFlag +Objects/interpreteridobject.c - _PyInterpreterID_Type variable PyTypeObject _PyInterpreterID_Type +Modules/_io/iobase.c - PyIOBase_Type variable PyTypeObject PyIOBase_Type +Modules/_io/_iomodule.c - _PyIO_empty_bytes variable PyObject *_PyIO_empty_bytes +Modules/_io/_iomodule.c - _PyIO_empty_str variable PyObject *_PyIO_empty_str +Modules/_io/_iomodule.c - _PyIO_Module variable struct PyModuleDef _PyIO_Module +Modules/_io/_iomodule.c - _PyIO_str_close variable PyObject *_PyIO_str_close +Modules/_io/_iomodule.c - _PyIO_str_closed variable PyObject *_PyIO_str_closed +Modules/_io/_iomodule.c - _PyIO_str_decode variable PyObject *_PyIO_str_decode +Modules/_io/_iomodule.c - _PyIO_str_encode variable PyObject *_PyIO_str_encode +Modules/_io/_iomodule.c - _PyIO_str_fileno variable PyObject *_PyIO_str_fileno +Modules/_io/_iomodule.c - _PyIO_str_flush variable PyObject *_PyIO_str_flush +Modules/_io/_iomodule.c - _PyIO_str_getstate variable PyObject *_PyIO_str_getstate +Modules/_io/_iomodule.c - _PyIO_str_isatty variable PyObject *_PyIO_str_isatty +Modules/_io/_iomodule.c - _PyIO_str_newlines variable PyObject *_PyIO_str_newlines +Modules/_io/_iomodule.c - _PyIO_str_nl variable PyObject *_PyIO_str_nl +Modules/_io/_iomodule.c - _PyIO_str_peek variable PyObject *_PyIO_str_peek +Modules/_io/_iomodule.c - _PyIO_str_read variable PyObject *_PyIO_str_read +Modules/_io/_iomodule.c - _PyIO_str_read1 variable PyObject *_PyIO_str_read1 +Modules/_io/_iomodule.c - _PyIO_str_readable variable PyObject *_PyIO_str_readable +Modules/_io/_iomodule.c - _PyIO_str_readall variable PyObject *_PyIO_str_readall +Modules/_io/_iomodule.c - _PyIO_str_readinto variable PyObject *_PyIO_str_readinto +Modules/_io/_iomodule.c - _PyIO_str_readline variable PyObject *_PyIO_str_readline +Modules/_io/_iomodule.c - _PyIO_str_reset variable PyObject *_PyIO_str_reset +Modules/_io/_iomodule.c - _PyIO_str_seek variable PyObject *_PyIO_str_seek +Modules/_io/_iomodule.c - _PyIO_str_seekable variable PyObject *_PyIO_str_seekable +Modules/_io/_iomodule.c - _PyIO_str_setstate variable PyObject *_PyIO_str_setstate +Modules/_io/_iomodule.c - _PyIO_str_tell variable PyObject *_PyIO_str_tell +Modules/_io/_iomodule.c - _PyIO_str_truncate variable PyObject *_PyIO_str_truncate +Modules/_io/_iomodule.c - _PyIO_str_writable variable PyObject *_PyIO_str_writable +Modules/_io/_iomodule.c - _PyIO_str_write variable PyObject *_PyIO_str_write +Python/initconfig.c - Py_IsolatedFlag variable int Py_IsolatedFlag +Objects/listobject.c - PyListIter_Type variable PyTypeObject PyListIter_Type +Objects/listobject.c - PyListRevIter_Type variable PyTypeObject PyListRevIter_Type +Objects/listobject.c - PyList_Type variable PyTypeObject PyList_Type +Modules/_localemodule.c - PyLocale_Methods variable static struct PyMethodDef PyLocale_Methods[] +Objects/longobject.c - _PyLong_DigitValue variable unsigned char _PyLong_DigitValue[256] +Objects/longobject.c - _PyLong_One variable PyObject *_PyLong_One +Objects/rangeobject.c - PyLongRangeIter_Type variable PyTypeObject PyLongRangeIter_Type +Objects/longobject.c - PyLong_Type variable PyTypeObject PyLong_Type +Objects/longobject.c - _PyLong_Zero variable PyObject *_PyLong_Zero +Objects/memoryobject.c - _PyManagedBuffer_Type variable PyTypeObject _PyManagedBuffer_Type +Python/bltinmodule.c - PyMap_Type variable PyTypeObject PyMap_Type +Objects/obmalloc.c - _PyMem variable static PyMemAllocatorEx _PyMem +Objects/descrobject.c - PyMemberDescr_Type variable PyTypeObject PyMemberDescr_Type +Objects/obmalloc.c - _PyMem_Debug variable static struct { debug_alloc_api_t raw; debug_alloc_api_t mem; debug_alloc_api_t obj; } _PyMem_Debug +Objects/memoryobject.c - PyMemoryView_Type variable PyTypeObject PyMemoryView_Type +Objects/obmalloc.c - _PyMem_Raw variable static PyMemAllocatorEx _PyMem_Raw +Objects/descrobject.c - PyMethodDescr_Type variable PyTypeObject PyMethodDescr_Type +Objects/classobject.c - PyMethod_Type variable PyTypeObject PyMethod_Type +Objects/descrobject.c - _PyMethodWrapper_Type variable PyTypeObject _PyMethodWrapper_Type +Objects/moduleobject.c - PyModuleDef_Type variable PyTypeObject PyModuleDef_Type +Objects/moduleobject.c - PyModule_Type variable PyTypeObject PyModule_Type +Objects/namespaceobject.c - _PyNamespace_Type variable PyTypeObject _PyNamespace_Type +Objects/object.c - _Py_NoneStruct variable PyObject _Py_NoneStruct +Objects/object.c - _PyNone_Type variable PyTypeObject _PyNone_Type +Python/initconfig.c - Py_NoSiteFlag variable int Py_NoSiteFlag +Objects/object.c - _Py_NotImplementedStruct variable PyObject _Py_NotImplementedStruct +Objects/object.c - _PyNotImplemented_Type variable PyTypeObject _PyNotImplemented_Type +Python/initconfig.c - Py_NoUserSiteDirectory variable int Py_NoUserSiteDirectory +Objects/bytesobject.c - _Py_null_strings variable Py_ssize_t _Py_null_strings +Objects/obmalloc.c - _PyObject variable static PyMemAllocatorEx _PyObject +Objects/obmalloc.c - _PyObject_Arena variable static PyObjectArenaAllocator _PyObject_Arena +Objects/odictobject.c - PyODictItems_Type variable PyTypeObject PyODictItems_Type +Objects/odictobject.c - PyODictIter_Type variable PyTypeObject PyODictIter_Type +Objects/odictobject.c - PyODictKeys_Type variable PyTypeObject PyODictKeys_Type +Objects/odictobject.c - PyODict_Type variable PyTypeObject PyODict_Type +Objects/odictobject.c - PyODictValues_Type variable PyTypeObject PyODictValues_Type +Python/fileutils.c - _Py_open_cloexec_works variable int _Py_open_cloexec_works +Objects/bytesobject.c - _Py_one_strings variable Py_ssize_t _Py_one_strings +Python/initconfig.c - Py_OptimizeFlag variable int Py_OptimizeFlag +Parser/myreadline.c - PyOS_InputHook variable int (*PyOS_InputHook)(void) +Python/pylifecycle.c - _PyOS_mystrnicmp_hack variable int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) +Python/getopt.c - _PyOS_optarg variable const wchar_t *_PyOS_optarg +Python/getopt.c - _PyOS_opterr variable int _PyOS_opterr +Python/getopt.c - _PyOS_optind variable Py_ssize_t _PyOS_optind +Parser/myreadline.c - PyOS_ReadlineFunctionPointer variable char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *) +Parser/myreadline.c - _PyOS_ReadlineLock variable static PyThread_type_lock _PyOS_ReadlineLock +Parser/myreadline.c - _PyOS_ReadlineTState variable PyThreadState* _PyOS_ReadlineTState +Python/modsupport.c - _Py_PackageContext variable const char *_Py_PackageContext +Python/graminit.c - _PyParser_Grammar variable grammar _PyParser_Grammar +Python/pathconfig.c - _Py_path_config variable _PyPathConfig _Py_path_config +Objects/picklebufobject.c - PyPickleBuffer_Type variable PyTypeObject PyPickleBuffer_Type +Objects/descrobject.c - PyProperty_Type variable PyTypeObject PyProperty_Type +Python/initconfig.c - Py_QuietFlag variable int Py_QuietFlag +Objects.longobject.c - _Py_quick_int_allocs variable Py_ssize_t _Py_quick_int_allocs +Objects.longobject.c - _Py_quick_new_int_allocs variable Py_ssize_t _Py_quick_new_int_allocs +Objects/rangeobject.c - PyRangeIter_Type variable PyTypeObject PyRangeIter_Type +Objects/rangeobject.c - PyRange_Type variable PyTypeObject PyRange_Type +Modules/_io/iobase.c - PyRawIOBase_Type variable PyTypeObject PyRawIOBase_Type +Objects/object.c - _Py_RefTotal variable Py_ssize_t _Py_RefTotal +Objects/enumobject.c - PyReversed_Type variable PyTypeObject PyReversed_Type +Python/pylifecycle.c - _PyRuntime variable _PyRuntimeState _PyRuntime +Objects/iterobject.c - PySeqIter_Type variable PyTypeObject PySeqIter_Type +Objects/setobject.c - _PySet_Dummy variable PyObject * _PySet_Dummy +Objects/setobject.c - _PySetDummy_Type variable static PyTypeObject _PySetDummy_Type +Objects/setobject.c - PySetIter_Type variable PyTypeObject PySetIter_Type +Objects/setobject.c - PySet_Type variable PyTypeObject PySet_Type +Objects/sliceobject.c - PySlice_Type variable PyTypeObject PySlice_Type +Python/initconfig.c - _Py_StandardStreamEncoding variable static char *_Py_StandardStreamEncoding +Python/initconfig.c - _Py_StandardStreamErrors variable static char *_Py_StandardStreamErrors +Objects/funcobject.c - PyStaticMethod_Type variable PyTypeObject PyStaticMethod_Type +Objects/fileobject.c - PyStdPrinter_Type variable PyTypeObject PyStdPrinter_Type +Python/symtable.c - PySTEntry_Type variable PyTypeObject PySTEntry_Type +Modules/_io/stringio.c - PyStringIO_Type variable PyTypeObject PyStringIO_Type +Objects/structseq.c - PyStructSequence_UnnamedField variable char *PyStructSequence_UnnamedField +Objects/typeobject.c - PySuper_Type variable PyTypeObject PySuper_Type +Objects/object.c - _Py_SwappedOp variable int _Py_SwappedOp[] +Python/sysmodule.c - _PySys_ImplCacheTag variable const char *_PySys_ImplCacheTag +Python/sysmodule.c - _PySys_ImplName variable const char *_PySys_ImplName +Modules/_io/textio.c - PyTextIOBase_Type variable PyTypeObject PyTextIOBase_Type +Modules/_io/textio.c - PyTextIOWrapper_Type variable PyTypeObject PyTextIOWrapper_Type +Python/traceback.c - PyTraceBack_Type variable PyTypeObject PyTraceBack_Type +Objects/obmalloc.c - _Py_tracemalloc_config variable struct _PyTraceMalloc_Config _Py_tracemalloc_config +Objects/boolobject.c - _Py_TrueStruct variable static struct _longobject _Py_TrueStruct +Objects/tupleobject.c - PyTupleIter_Type variable PyTypeObject PyTupleIter_Type +Objects/tupleobject.c - PyTuple_Type variable PyTypeObject PyTuple_Type +Objects/tupleobject.c - _Py_tuple_zero_allocs variable Py_ssize_t _Py_tuple_zero_allocs +Objects/typeobject.c - PyType_Type variable PyTypeObject PyType_Type +Python/initconfig.c - Py_UnbufferedStdioFlag variable int Py_UnbufferedStdioFlag +Python/pylifecycle.c - _Py_UnhandledKeyboardInterrupt variable int _Py_UnhandledKeyboardInterrupt +Objects/unicodeobject.c - PyUnicodeIter_Type variable PyTypeObject PyUnicodeIter_Type +Objects/unicodeobject.c - PyUnicode_Type variable PyTypeObject PyUnicode_Type +Python/initconfig.c - Py_UTF8Mode variable int Py_UTF8Mode +Python/initconfig.c - Py_VerboseFlag variable int Py_VerboseFlag +Objects/weakrefobject.c - _PyWeakref_CallableProxyType variable PyTypeObject _PyWeakref_CallableProxyType +Objects/weakrefobject.c - _PyWeakref_ProxyType variable PyTypeObject _PyWeakref_ProxyType +Objects/weakrefobject.c - _PyWeakref_RefType variable PyTypeObject _PyWeakref_RefType +Objects/weakrefobject.c - _PyWeakref_RefType variable PyTypeObject _PyWeakref_RefType +Objects/descrobject.c - PyWrapperDescr_Type variable PyTypeObject PyWrapperDescr_Type +Python/bltinmodule.c - PyZip_Type variable PyTypeObject PyZip_Type +Python/Python-ast.c - Raise_fields variable static const char *Raise_fields[] +Python/Python-ast.c - Raise_type variable static PyTypeObject *Raise_type +Objects/rangeobject.c - range_as_mapping variable static PyMappingMethods range_as_mapping +Objects/rangeobject.c - range_as_number variable static PyNumberMethods range_as_number +Objects/rangeobject.c - range_as_sequence variable static PySequenceMethods range_as_sequence +Objects/rangeobject.c - rangeiter_methods variable static PyMethodDef rangeiter_methods +Objects/rangeobject.c - range_members variable static PyMemberDef range_members[] +Objects/rangeobject.c - range_methods variable static PyMethodDef range_methods +Modules/_io/iobase.c - rawiobase_methods variable static PyMethodDef rawiobase_methods +Python/pylifecycle.c fatal_error reentrant variable static int reentrant +Modules/faulthandler.c faulthandler_dump_traceback reentrant variable static volatile int reentrant +Modules/itertoolsmodule.c - repeat_methods variable static PyMethodDef repeat_methods +Modules/itertoolsmodule.c - repeat_type variable static PyTypeObject repeat_type +Python/Python-ast.c - Return_fields variable static const char *Return_fields[] +Python/compile.c compiler_visit_annotations return_str variable static identifier return_str +Python/Python-ast.c - Return_type variable static PyTypeObject *Return_type +Objects/enumobject.c - reversediter_methods variable static PyMethodDef reversediter_methods +Modules/_threadmodule.c - rlock_methods variable static PyMethodDef rlock_methods +Modules/_threadmodule.c - RLocktype variable static PyTypeObject RLocktype +Objects/typeobject.c slot_nb_add rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_subtract rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_multiply rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_matrix_multiply rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_remainder rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_divmod rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_power_binary rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_lshift rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_rshift rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_and rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_xor rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_or rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_floor_divide rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_true_divide rop_id variable _Py_static_string(op_id, OPSTR) +Python/Python-ast.c - RShift_singleton variable static PyObject *RShift_singleton +Python/Python-ast.c - RShift_type variable static PyTypeObject *RShift_type +Python/pylifecycle.c - runtime_initialized variable static int runtime_initialized +Modules/posixmodule.c - ScandirIterator_methods variable static PyMethodDef ScandirIterator_methods +Modules/posixmodule.c - ScandirIteratorType variable static PyTypeObject ScandirIteratorType +Modules/_sre.c - scanner_members variable static PyMemberDef scanner_members[] +Modules/_sre.c - scanner_methods variable static PyMethodDef scanner_methods +Modules/_sre.c - Scanner_Type variable static PyTypeObject Scanner_Type +Modules/posixmodule.c - sched_param_desc variable static PyStructSequence_Desc sched_param_desc +Modules/posixmodule.c - sched_param_fields variable static PyStructSequence_Field sched_param_fields[] +Modules/posixmodule.c - SchedParamType variable static PyTypeObject* SchedParamType +Objects/iterobject.c - seqiter_methods variable static PyMethodDef seqiter_methods +Objects/setobject.c - set_as_number variable static PyNumberMethods set_as_number +Objects/setobject.c - set_as_sequence variable static PySequenceMethods set_as_sequence +Python/symtable.c - setcomp variable static identifier setcomp +Python/Python-ast.c - SetComp_fields variable static const char *SetComp_fields[] +Python/Python-ast.c - SetComp_type variable static PyTypeObject *SetComp_type +Python/Python-ast.c - Set_fields variable static const char *Set_fields[] +Objects/setobject.c - setiter_methods variable static PyMethodDef setiter_methods +Objects/setobject.c - set_methods variable static PyMethodDef set_methods +Python/Python-ast.c - Set_type variable static PyTypeObject *Set_type +Modules/signalmodule.c - SiginfoType variable static PyTypeObject SiginfoType +Modules/signalmodule.c - signal_methods variable static PyMethodDef signal_methods +Modules/signalmodule.c - signalmodule variable static struct PyModuleDef signalmodule +Python/import.c PyImport_Import silly_list variable static PyObject *silly_list +Objects/sliceobject.c - slice_cache variable static PySliceObject *slice_cache +Python/Python-ast.c - Slice_fields variable static const char *Slice_fields[] +Objects/sliceobject.c - slice_members variable static PyMemberDef slice_members[] +Objects/sliceobject.c - slice_methods variable static PyMethodDef slice_methods +Python/Python-ast.c - slice_type variable static PyTypeObject *slice_type +Python/Python-ast.c - Slice_type variable static PyTypeObject *Slice_type +Objects/typeobject.c - slotdefs variable static slotdef slotdefs[] +Objects/typeobject.c - slotdefs_initialized variable static int slotdefs_initialized +Objects/longobject.c - small_ints variable static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS] +Objects/funcobject.c - sm_getsetlist variable static PyGetSetDef sm_getsetlist[] +Objects/funcobject.c - sm_memberlist variable static PyMemberDef sm_memberlist[] +Modules/xxsubtype.c - spamdict_members variable static PyMemberDef spamdict_members[] +Modules/xxsubtype.c - spamdict_methods variable static PyMethodDef spamdict_methods +Modules/xxsubtype.c - spamdict_type variable static PyTypeObject spamdict_type +Modules/xxsubtype.c - spamlist_getsets variable static PyGetSetDef spamlist_getsets[] +Modules/xxsubtype.c - spamlist_methods variable static PyMethodDef spamlist_methods +Modules/xxsubtype.c - spamlist_type variable static PyTypeObject spamlist_type +Modules/_sre.c - sremodule variable static struct PyModuleDef sremodule +Modules/faulthandler.c - stack variable static stack_t stack +Modules/itertoolsmodule.c - starmap_methods variable static PyMethodDef starmap_methods +Modules/itertoolsmodule.c - starmap_type variable static PyTypeObject starmap_type +Python/Python-ast.c - Starred_fields variable static const char *Starred_fields[] +Python/Python-ast.c - Starred_type variable static PyTypeObject *Starred_type +Python/graminit.c - states_0 variable static state states_0[3] +Python/graminit.c - states_1 variable static state states_1[2] +Python/graminit.c - states_10 variable static state states_10[4] +Python/graminit.c - states_11 variable static state states_11[34] +Python/graminit.c - states_12 variable static state states_12[2] +Python/graminit.c - states_13 variable static state states_13[2] +Python/graminit.c - states_14 variable static state states_14[4] +Python/graminit.c - states_15 variable static state states_15[2] +Python/graminit.c - states_16 variable static state states_16[6] +Python/graminit.c - states_17 variable static state states_17[5] +Python/graminit.c - states_18 variable static state states_18[3] +Python/graminit.c - states_19 variable static state states_19[2] +Python/graminit.c - states_2 variable static state states_2[3] +Python/graminit.c - states_20 variable static state states_20[3] +Python/graminit.c - states_21 variable static state states_21[2] +Python/graminit.c - states_22 variable static state states_22[2] +Python/graminit.c - states_23 variable static state states_23[2] +Python/graminit.c - states_24 variable static state states_24[2] +Python/graminit.c - states_25 variable static state states_25[3] +Python/graminit.c - states_26 variable static state states_26[2] +Python/graminit.c - states_27 variable static state states_27[5] +Python/graminit.c - states_28 variable static state states_28[2] +Python/graminit.c - states_29 variable static state states_29[3] +Python/graminit.c - states_3 variable static state states_3[7] +Python/graminit.c - states_30 variable static state states_30[8] +Python/graminit.c - states_31 variable static state states_31[4] +Python/graminit.c - states_32 variable static state states_32[4] +Python/graminit.c - states_33 variable static state states_33[3] +Python/graminit.c - states_34 variable static state states_34[2] +Python/graminit.c - states_35 variable static state states_35[2] +Python/graminit.c - states_36 variable static state states_36[3] +Python/graminit.c - states_37 variable static state states_37[3] +Python/graminit.c - states_38 variable static state states_38[5] +Python/graminit.c - states_39 variable static state states_39[2] +Python/graminit.c - states_4 variable static state states_4[2] +Python/graminit.c - states_40 variable static state states_40[3] +Python/graminit.c - states_41 variable static state states_41[8] +Python/graminit.c - states_42 variable static state states_42[8] +Python/graminit.c - states_43 variable static state states_43[11] +Python/graminit.c - states_44 variable static state states_44[13] +Python/graminit.c - states_45 variable static state states_45[6] +Python/graminit.c - states_46 variable static state states_46[4] +Python/graminit.c - states_47 variable static state states_47[5] +Python/graminit.c - states_48 variable static state states_48[5] +Python/graminit.c - states_49 variable static state states_49[4] +Python/graminit.c - states_5 variable static state states_5[3] +Python/graminit.c - states_50 variable static state states_50[6] +Python/graminit.c - states_51 variable static state states_51[2] +Python/graminit.c - states_52 variable static state states_52[5] +Python/graminit.c - states_53 variable static state states_53[5] +Python/graminit.c - states_54 variable static state states_54[2] +Python/graminit.c - states_55 variable static state states_55[2] +Python/graminit.c - states_56 variable static state states_56[3] +Python/graminit.c - states_57 variable static state states_57[2] +Python/graminit.c - states_58 variable static state states_58[4] +Python/graminit.c - states_59 variable static state states_59[3] +Python/graminit.c - states_6 variable static state states_6[3] +Python/graminit.c - states_60 variable static state states_60[2] +Python/graminit.c - states_61 variable static state states_61[2] +Python/graminit.c - states_62 variable static state states_62[2] +Python/graminit.c - states_63 variable static state states_63[2] +Python/graminit.c - states_64 variable static state states_64[2] +Python/graminit.c - states_65 variable static state states_65[2] +Python/graminit.c - states_66 variable static state states_66[3] +Python/graminit.c - states_67 variable static state states_67[4] +Python/graminit.c - states_68 variable static state states_68[3] +Python/graminit.c - states_69 variable static state states_69[9] +Python/graminit.c - states_7 variable static state states_7[9] +Python/graminit.c - states_70 variable static state states_70[5] +Python/graminit.c - states_71 variable static state states_71[7] +Python/graminit.c - states_72 variable static state states_72[3] +Python/graminit.c - states_73 variable static state states_73[5] +Python/graminit.c - states_74 variable static state states_74[3] +Python/graminit.c - states_75 variable static state states_75[3] +Python/graminit.c - states_76 variable static state states_76[3] +Python/graminit.c - states_77 variable static state states_77[14] +Python/graminit.c - states_78 variable static state states_78[8] +Python/graminit.c - states_79 variable static state states_79[3] +Python/graminit.c - states_8 variable static state states_8[4] +Python/graminit.c - states_80 variable static state states_80[4] +Python/graminit.c - states_81 variable static state states_81[2] +Python/graminit.c - states_82 variable static state states_82[6] +Python/graminit.c - states_83 variable static state states_83[3] +Python/graminit.c - states_84 variable static state states_84[4] +Python/graminit.c - states_85 variable static state states_85[2] +Python/graminit.c - states_86 variable static state states_86[3] +Python/graminit.c - states_87 variable static state states_87[3] +Python/graminit.c - states_88 variable static state states_88[7] +Python/graminit.c - states_89 variable static state states_89[3] +Python/graminit.c - states_9 variable static state states_9[42] +Python/graminit.c - states_90 variable static state states_90[6] +Python/graminit.c - states_91 variable static state states_91[11] +Python/getargs.c - static_arg_parsers variable static struct _PyArg_Parser *static_arg_parsers +Objects/unicodeobject.c - static_strings variable static _Py_Identifier *static_strings +Modules/_stat.c - stat_methods variable static PyMethodDef stat_methods +Modules/_stat.c - statmodule variable static struct PyModuleDef statmodule +Modules/posixmodule.c - stat_result_desc variable static PyStructSequence_Desc stat_result_desc +Modules/posixmodule.c - stat_result_fields variable static PyStructSequence_Field stat_result_fields[] +Modules/posixmodule.c - StatResultType variable static PyTypeObject* StatResultType +Modules/posixmodule.c - statvfs_result_desc variable static PyStructSequence_Desc statvfs_result_desc +Modules/posixmodule.c - statvfs_result_fields variable static PyStructSequence_Field statvfs_result_fields[] +Modules/posixmodule.c - StatVFSResultType variable static PyTypeObject* StatVFSResultType +Objects/fileobject.c - stdprinter_getsetlist variable static PyGetSetDef stdprinter_getsetlist[] +Objects/fileobject.c - stdprinter_methods variable static PyMethodDef stdprinter_methods +Python/symtable.c - ste_memberlist variable static PyMemberDef ste_memberlist[] +Python/Python-ast.c - stmt_attributes variable static const char *stmt_attributes[] +Python/Python-ast.c - stmt_type variable static PyTypeObject *stmt_type +Objects/exceptions.c - StopIteration_members variable static PyMemberDef StopIteration_members[] +Python/Python-ast.c - Store_singleton variable static PyObject *Store_singleton +Python/Python-ast.c - Store_type variable static PyTypeObject *Store_type +Python/ast_unparse.c - _str_close_br variable static PyObject *_str_close_br +Python/ast_unparse.c - _str_dbl_close_br variable static PyObject *_str_dbl_close_br +Python/ast_unparse.c - _str_dbl_open_br variable static PyObject *_str_dbl_open_br +Modules/_threadmodule.c - str_dict variable static PyObject *str_dict +Modules/_io/stringio.c - stringio_getset variable static PyGetSetDef stringio_getset[] +Modules/_io/stringio.c - stringio_methods variable static PyMethodDef stringio_methods +Objects/unicodeobject.c - _string_methods variable static PyMethodDef _string_methods +Objects/unicodeobject.c - _string_module variable static struct PyModuleDef _string_module +Objects/bytesobject.c - striter_methods variable static PyMethodDef striter_methods +Python/ast_unparse.c - _str_open_br variable static PyObject *_str_open_br +Modules/pwdmodule.c - StructPwdType variable static PyTypeObject StructPwdType +Modules/pwdmodule.c - struct_pwd_type_desc variable static PyStructSequence_Desc struct_pwd_type_desc +Modules/pwdmodule.c - struct_pwd_type_fields variable static PyStructSequence_Field struct_pwd_type_fields[] +Modules/posixmodule.c wait_helper struct_rusage variable static PyObject *struct_rusage +Objects/structseq.c - structseq_methods variable static PyMethodDef structseq_methods +Modules/posixmodule.c - structseq_new variable static newfunc structseq_new +Modules/signalmodule.c - struct_siginfo_desc variable static PyStructSequence_Desc struct_siginfo_desc +Modules/signalmodule.c - struct_siginfo_fields variable static PyStructSequence_Field struct_siginfo_fields[] +Modules/timemodule.c - StructTimeType variable static PyTypeObject StructTimeType +Modules/timemodule.c - struct_time_type_desc variable static PyStructSequence_Desc struct_time_type_desc +Modules/timemodule.c - struct_time_type_fields variable static PyStructSequence_Field struct_time_type_fields[] +Python/Python-ast.c - Subscript_fields variable static const char *Subscript_fields[] +Python/Python-ast.c - Subscript_type variable static PyTypeObject *Subscript_type +Python/Python-ast.c - Sub_singleton variable static PyObject *Sub_singleton +Python/Python-ast.c - Sub_type variable static PyTypeObject *Sub_type +Objects/typeobject.c - subtype_getsets_dict_only variable static PyGetSetDef subtype_getsets_dict_only[] +Objects/typeobject.c - subtype_getsets_full variable static PyGetSetDef subtype_getsets_full[] +Objects/typeobject.c - subtype_getsets_weakref_only variable static PyGetSetDef subtype_getsets_weakref_only[] +Python/Python-ast.c - Suite_fields variable static const char *Suite_fields[] +Python/Python-ast.c - Suite_type variable static PyTypeObject *Suite_type +Objects/typeobject.c - super_members variable static PyMemberDef super_members[] +Modules/symtablemodule.c - symtable_methods variable static PyMethodDef symtable_methods +Modules/symtablemodule.c - symtablemodule variable static struct PyModuleDef symtablemodule +Objects/exceptions.c - SyntaxError_members variable static PyMemberDef SyntaxError_members[] +Python/sysmodule.c - sys_methods variable static PyMethodDef sys_methods +Python/sysmodule.c - sysmodule variable static struct PyModuleDef sysmodule +Objects/exceptions.c - SystemExit_members variable static PyMemberDef SystemExit_members[] +Modules/_tracemalloc.c - tables_lock variable static PyThread_type_lock tables_lock +Modules/itertoolsmodule.c - takewhile_reduce_methods variable static PyMethodDef takewhile_reduce_methods +Modules/itertoolsmodule.c - takewhile_type variable static PyTypeObject takewhile_type +Python/pylifecycle.c - _TARGET_LOCALES variable static _LocaleCoercionTarget _TARGET_LOCALES[] +Python/traceback.c - tb_getsetters variable static PyGetSetDef tb_getsetters[] +Python/traceback.c - tb_memberlist variable static PyMemberDef tb_memberlist[] +Python/traceback.c - tb_methods variable static PyMethodDef tb_methods +Modules/itertoolsmodule.c - teedataobject_methods variable static PyMethodDef teedataobject_methods +Modules/itertoolsmodule.c - teedataobject_type variable static PyTypeObject teedataobject_type +Modules/itertoolsmodule.c - tee_methods variable static PyMethodDef tee_methods +Modules/itertoolsmodule.c - tee_type variable static PyTypeObject tee_type +Modules/posixmodule.c - TerminalSize_desc variable static PyStructSequence_Desc TerminalSize_desc +Modules/posixmodule.c - TerminalSize_fields variable static PyStructSequence_Field TerminalSize_fields[] +Modules/posixmodule.c - TerminalSizeType variable static PyTypeObject* TerminalSizeType +Modules/_io/textio.c - textiobase_getset variable static PyGetSetDef textiobase_getset[] +Modules/_io/textio.c - textiobase_methods variable static PyMethodDef textiobase_methods +Modules/_io/textio.c - textiowrapper_getset variable static PyGetSetDef textiowrapper_getset[] +Modules/_io/textio.c - textiowrapper_members variable static PyMemberDef textiowrapper_members[] +Modules/_io/textio.c - textiowrapper_methods variable static PyMethodDef textiowrapper_methods +Modules/faulthandler.c - thread variable static struct { PyObject *file; int fd; PY_TIMEOUT_T timeout_us; int repeat; PyInterpreterState *interp; int exit; char *header; size_t header_len; PyThread_type_lock cancel_event; PyThread_type_lock running; } thread +Python/thread.c - thread_debug variable static int thread_debug +Modules/_threadmodule.c - ThreadError variable static PyObject *ThreadError +Python/thread.c - threadinfo_desc variable static PyStructSequence_Desc threadinfo_desc +Python/thread.c - threadinfo_fields variable static PyStructSequence_Field threadinfo_fields[] +Python/thread.c - ThreadInfoType variable static PyTypeObject ThreadInfoType +Modules/_threadmodule.c - thread_methods variable static PyMethodDef thread_methods +Modules/_threadmodule.c - threadmodule variable static struct PyModuleDef threadmodule +Modules/posixmodule.c - ticks_per_second variable static long ticks_per_second +Modules/timemodule.c _PyTime_GetProcessTimeWithInfo ticks_per_second variable static long ticks_per_second +Modules/timemodule.c - time_methods variable static PyMethodDef time_methods +Modules/timemodule.c - timemodule variable static struct PyModuleDef timemodule +Modules/posixmodule.c - times_result_desc variable static PyStructSequence_Desc times_result_desc +Modules/posixmodule.c - times_result_fields variable static PyStructSequence_Field times_result_fields[] +Modules/posixmodule.c - TimesResultType variable static PyTypeObject* TimesResultType +Python/context.c - _token_missing variable static PyObject *_token_missing +Python/symtable.c - top variable static identifier top +Objects/typeobject.c - tp_new_methoddef variable static struct PyMethodDef tp_new_methoddef[] +Modules/_tracemalloc.c - tracemalloc_empty_traceback variable static traceback_t tracemalloc_empty_traceback +Modules/_tracemalloc.c - tracemalloc_filenames variable static _Py_hashtable_t *tracemalloc_filenames +Modules/_tracemalloc.c - tracemalloc_peak_traced_memory variable static size_t tracemalloc_peak_traced_memory +Modules/_tracemalloc.c - tracemalloc_reentrant_key variable static Py_tss_t tracemalloc_reentrant_key +Modules/_tracemalloc.c - tracemalloc_traceback variable static traceback_t *tracemalloc_traceback +Modules/_tracemalloc.c - tracemalloc_tracebacks variable static _Py_hashtable_t *tracemalloc_tracebacks +Modules/_tracemalloc.c - tracemalloc_traced_memory variable static size_t tracemalloc_traced_memory +Modules/_tracemalloc.c - tracemalloc_traces variable static _Py_hashtable_t *tracemalloc_traces +Objects/boolobject.c - true_str variable static PyObject *true_str +Python/Python-ast.c - Try_fields variable static const char *Try_fields[] +Python/Python-ast.c - Try_type variable static PyTypeObject *Try_type +Objects/tupleobject.c - tuple_as_mapping variable static PyMappingMethods tuple_as_mapping +Objects/tupleobject.c - tuple_as_sequence variable static PySequenceMethods tuple_as_sequence +Python/Python-ast.c - Tuple_fields variable static const char *Tuple_fields[] +Modules/_collectionsmodule.c - tuplegetter_members variable static PyMemberDef tuplegetter_members[] +Modules/_collectionsmodule.c - tuplegetter_methods variable static PyMethodDef tuplegetter_methods +Modules/_collectionsmodule.c - tuplegetter_type variable static PyTypeObject tuplegetter_type +Objects/tupleobject.c - tupleiter_methods variable static PyMethodDef tupleiter_methods +Objects/tupleobject.c - tuple_methods variable static PyMethodDef tuple_methods +Python/Python-ast.c - Tuple_type variable static PyTypeObject *Tuple_type +Objects/typeobject.c - type_getsets variable static PyGetSetDef type_getsets[] +Python/Python-ast.c - TypeIgnore_fields variable static const char *TypeIgnore_fields[] +Python/Python-ast.c - type_ignore_type variable static PyTypeObject *type_ignore_type +Python/Python-ast.c - TypeIgnore_type variable static PyTypeObject *TypeIgnore_type +Objects/typeobject.c - type_members variable static PyMemberDef type_members[] +Objects/typeobject.c - type_methods variable static PyMethodDef type_methods +Python/Python-ast.c - UAdd_singleton variable static PyObject *UAdd_singleton +Python/Python-ast.c - UAdd_type variable static PyTypeObject *UAdd_type +Objects/unicodeobject.c - ucnhash_CAPI variable static _PyUnicode_Name_CAPI *ucnhash_CAPI +Python/codecs.c - ucnhash_CAPI variable static _PyUnicode_Name_CAPI *ucnhash_CAPI +Python/ast.c - u_kind variable static PyObject *u_kind +Modules/posixmodule.c - uname_result_desc variable static PyStructSequence_Desc uname_result_desc +Modules/posixmodule.c - uname_result_fields variable static PyStructSequence_Field uname_result_fields[] +Modules/posixmodule.c - UnameResultType variable static PyTypeObject* UnameResultType +Python/Python-ast.c - UnaryOp_fields variable static const char *UnaryOp_fields[] +Python/Python-ast.c - unaryop_type variable static PyTypeObject *unaryop_type +Python/Python-ast.c - UnaryOp_type variable static PyTypeObject *UnaryOp_type +Objects/unicodeobject.c - unicode_as_mapping variable static PyMappingMethods unicode_as_mapping +Objects/unicodeobject.c - unicode_as_number variable static PyNumberMethods unicode_as_number +Objects/unicodeobject.c - unicode_as_sequence variable static PySequenceMethods unicode_as_sequence +Objects/unicodeobject.c - unicode_empty variable static PyObject *unicode_empty +Objects/exceptions.c - UnicodeError_members variable static PyMemberDef UnicodeError_members[] +Objects/unicodeobject.c - unicodeiter_methods variable static PyMethodDef unicodeiter_methods +Objects/unicodeobject.c - unicode_latin1 variable static PyObject *unicode_latin1[256] +Objects/unicodeobject.c - unicode_methods variable static PyMethodDef unicode_methods +Modules/_tracemalloc.c - unknown_filename variable static PyObject *unknown_filename +Python/errors.c - UnraisableHookArgs_desc variable static PyStructSequence_Desc UnraisableHookArgs_desc +Python/errors.c - UnraisableHookArgs_fields variable static PyStructSequence_Field UnraisableHookArgs_fields[] +Python/errors.c - UnraisableHookArgsType variable static PyTypeObject UnraisableHookArgsType +Objects/obmalloc.c - unused_arena_objects variable static struct arena_object* unused_arena_objects +Python/bootstrap_hash.c - urandom_cache variable static struct { int fd; dev_t st_dev; ino_t st_ino; } urandom_cache +Objects/obmalloc.c - usable_arenas variable static struct arena_object* usable_arenas +Objects/obmalloc.c - usedpools variable static poolp usedpools[2 * ((NB_SMALL_SIZE_CLASSES + 7) / 8) * 8] +Modules/faulthandler.c - user_signals variable static user_signal_t *user_signals +Python/Python-ast.c - USub_singleton variable static PyObject *USub_singleton +Python/Python-ast.c - USub_type variable static PyTypeObject *USub_type +Python/getversion.c Py_GetVersion version variable static char version[250] +Python/sysmodule.c - version_info_desc variable static PyStructSequence_Desc version_info_desc +Python/sysmodule.c - version_info_fields variable static PyStructSequence_Field version_info_fields[] +Python/sysmodule.c - VersionInfoType variable static PyTypeObject VersionInfoType +Modules/posixmodule.c - waitid_result_desc variable static PyStructSequence_Desc waitid_result_desc +Modules/posixmodule.c - waitid_result_fields variable static PyStructSequence_Field waitid_result_fields[] +Modules/posixmodule.c - WaitidResultType variable static PyTypeObject* WaitidResultType +Modules/signalmodule.c - wakeup variable static volatile struct { SOCKET_T fd; int warn_on_full_buffer; int use_send; } wakeup +Python/_warnings.c - warnings_functions variable static PyMethodDef warnings_functions[] +Python/_warnings.c - warningsmodule variable static struct PyModuleDef warningsmodule +Modules/_weakref.c - weakref_functions variable static PyMethodDef weakref_functions +Objects/weakrefobject.c - weakref_members variable static PyMemberDef weakref_members[] +Modules/_weakref.c - weakrefmodule variable static struct PyModuleDef weakrefmodule +Python/sysmodule.c - whatstrings variable static PyObject *whatstrings[8] +Python/Python-ast.c - While_fields variable static const char *While_fields[] +Python/Python-ast.c - While_type variable static PyTypeObject *While_type +Python/Python-ast.c - With_fields variable static const char *With_fields[] +Python/Python-ast.c - withitem_fields variable static const char *withitem_fields[] +Python/Python-ast.c - withitem_type variable static PyTypeObject *withitem_type +Python/Python-ast.c - With_type variable static PyTypeObject *With_type +Objects/descrobject.c - wrapperdescr_getset variable static PyGetSetDef wrapperdescr_getset[] +Objects/descrobject.c - wrapper_getsets variable static PyGetSetDef wrapper_getsets[] +Objects/descrobject.c - wrapper_members variable static PyMemberDef wrapper_members[] +Objects/descrobject.c - wrapper_methods variable static PyMethodDef wrapper_methods +Modules/_threadmodule.c local_new wr_callback_def variable static PyMethodDef wr_callback_def +Modules/xxsubtype.c - xxsubtype_functions variable static PyMethodDef xxsubtype_functions[] +Modules/xxsubtype.c - xxsubtypemodule variable static struct PyModuleDef xxsubtypemodule +Modules/xxsubtype.c - xxsubtype_slots variable static struct PyModuleDef_Slot xxsubtype_slots[] +Python/Python-ast.c - Yield_fields variable static const char *Yield_fields[] +Python/Python-ast.c - YieldFrom_fields variable static const char *YieldFrom_fields[] +Python/Python-ast.c - YieldFrom_type variable static PyTypeObject *YieldFrom_type +Python/Python-ast.c - Yield_type variable static PyTypeObject *Yield_type +Modules/itertoolsmodule.c - zip_longest_methods variable static PyMethodDef zip_longest_methods +Modules/itertoolsmodule.c - ziplongest_type variable static PyTypeObject ziplongest_type +Python/bltinmodule.c - zip_methods variable static PyMethodDef zip_methods diff --git a/Tools/c-globals/README b/Tools/c-globals/README deleted file mode 100644 index 0ee8ac38..00000000 --- a/Tools/c-globals/README +++ /dev/null @@ -1,41 +0,0 @@ -####################################### -# C Globals and CPython Runtime State. - -CPython's C code makes extensive use of global variables. Each global -falls into one of several categories: - -* (effectively) constants (incl. static types) -* globals used exclusively in main or in the REPL -* freelists, caches, and counters -* process-global state -* module state -* Python runtime state - -The ignored-globals.txt file is organized similarly. Of the different -categories, the last two are problematic and generally should not exist -in the codebase. - -Globals that hold module state (i.e. in Modules/*.c) cause problems -when multiple interpreters are in use. For more info, see PEP 3121, -which addresses the situation for extension modules in general. - -Globals in the last category should be avoided as well. The problem -isn't with the Python runtime having state. Rather, the problem is with -that state being spread throughout the codebase in dozens of individual -globals. Unlike the other globals, the runtime state represents a set -of values that are constantly shifting in a complex way. When they are -spread out it's harder to get a clear picture of what the runtime -involves. Furthermore, when they are spread out it complicates efforts -that change the runtime. - -Consequently, the globals for Python's runtime state have been -consolidated under a single top-level _PyRuntime global. No new globals -should be added for runtime state. Instead, they should be added to -_PyRuntimeState or one of its sub-structs. The check-c-globals script -should be run to ensure that no new globals have been added: - - python3 Tools/c-globals/check-c-globals.py - -If it reports any globals then they should be resolved. If the globals -are runtime state then they should be folded into _PyRuntimeState. -Otherwise they should be added to ignored-globals.txt. diff --git a/Tools/c-globals/check-c-globals.py b/Tools/c-globals/check-c-globals.py deleted file mode 100644 index 1371f927..00000000 --- a/Tools/c-globals/check-c-globals.py +++ /dev/null @@ -1,448 +0,0 @@ - -from collections import namedtuple -import glob -import os.path -import re -import shutil -import sys -import subprocess - - -VERBOSITY = 2 - -C_GLOBALS_DIR = os.path.abspath(os.path.dirname(__file__)) -TOOLS_DIR = os.path.dirname(C_GLOBALS_DIR) -ROOT_DIR = os.path.dirname(TOOLS_DIR) -GLOBALS_FILE = os.path.join(C_GLOBALS_DIR, 'ignored-globals.txt') - -SOURCE_DIRS = ['Include', 'Objects', 'Modules', 'Parser', 'Python'] - -CAPI_REGEX = re.compile(r'^ *PyAPI_DATA\([^)]*\) \W*(_?Py\w+(?:, \w+)*\w).*;.*$') - - -IGNORED_VARS = { - '_DYNAMIC', - '_GLOBAL_OFFSET_TABLE_', - '__JCR_LIST__', - '__JCR_END__', - '__TMC_END__', - '__bss_start', - '__data_start', - '__dso_handle', - '_edata', - '_end', - } - - -def find_capi_vars(root): - capi_vars = {} - for dirname in SOURCE_DIRS: - for filename in glob.glob(os.path.join( - glob.escape(os.path.join(ROOT_DIR, dirname)), - '**/*.[hc]'), - recursive=True): - with open(filename) as file: - for name in _find_capi_vars(file): - if name in capi_vars: - assert not filename.endswith('.c') - assert capi_vars[name].endswith('.c') - capi_vars[name] = filename - return capi_vars - - -def _find_capi_vars(lines): - for line in lines: - if not line.startswith('PyAPI_DATA'): - continue - assert '{' not in line - match = CAPI_REGEX.match(line) - assert match - names, = match.groups() - for name in names.split(', '): - yield name - - -def _read_global_names(filename): - # These variables are shared between all interpreters in the process. - with open(filename) as file: - return {line.partition('#')[0].strip() - for line in file - if line.strip() and not line.startswith('#')} - - -def _is_global_var(name, globalnames): - if _is_autogen_var(name): - return True - if _is_type_var(name): - return True - if _is_module(name): - return True - if _is_exception(name): - return True - if _is_compiler(name): - return True - return name in globalnames - - -def _is_autogen_var(name): - return ( - name.startswith('PyId_') or - '.' in name or - # Objects/typeobject.c - name.startswith('op_id.') or - name.startswith('rop_id.') or - # Python/graminit.c - name.startswith('arcs_') or - name.startswith('states_') - ) - - -def _is_type_var(name): - if name.endswith(('Type', '_Type', '_type')): # XXX Always a static type? - return True - if name.endswith('_desc'): # for structseq types - return True - return ( - name.startswith('doc_') or - name.endswith(('_doc', '__doc__', '_docstring')) or - name.endswith('_methods') or - name.endswith('_fields') or - name.endswith(('_memberlist', '_members')) or - name.endswith('_slots') or - name.endswith(('_getset', '_getsets', '_getsetlist')) or - name.endswith('_as_mapping') or - name.endswith('_as_number') or - name.endswith('_as_sequence') or - name.endswith('_as_buffer') or - name.endswith('_as_async') - ) - - -def _is_module(name): - if name.endswith(('_functions', 'Methods', '_Methods')): - return True - if name == 'module_def': - return True - if name == 'initialized': - return True - return name.endswith(('module', '_Module')) - - -def _is_exception(name): - # Other vars are enumerated in globals-core.txt. - if not name.startswith(('PyExc_', '_PyExc_')): - return False - return name.endswith(('Error', 'Warning')) - - -def _is_compiler(name): - return ( - # Python/Python-ast.c - name.endswith('_type') or - name.endswith('_singleton') or - name.endswith('_attributes') - ) - - -class Var(namedtuple('Var', 'name kind scope capi filename')): - - @classmethod - def parse_nm(cls, line, expected, ignored, capi_vars, globalnames): - _, _, line = line.partition(' ') # strip off the address - line = line.strip() - kind, _, line = line.partition(' ') - if kind in ignored or (): - return None - elif kind not in expected or (): - raise RuntimeError('unsupported NM type {!r}'.format(kind)) - - name, _, filename = line.partition('\t') - name = name.strip() - if _is_autogen_var(name): - return None - if _is_global_var(name, globalnames): - scope = 'global' - else: - scope = None - capi = (name in capi_vars or ()) - if filename: - filename = os.path.relpath(filename.partition(':')[0]) - return cls(name, kind, scope, capi, filename or '~???~') - - @property - def external(self): - return self.kind.isupper() - - -def find_vars(root, globals_filename=GLOBALS_FILE): - python = os.path.join(root, 'python') - if not os.path.exists(python): - raise RuntimeError('python binary missing (need to build it first?)') - capi_vars = find_capi_vars(root) - globalnames = _read_global_names(globals_filename) - - nm = shutil.which('nm') - if nm is None: - # XXX Use dumpbin.exe /SYMBOLS on Windows. - raise NotImplementedError - else: - yield from (var - for var in _find_var_symbols(python, nm, capi_vars, - globalnames) - if var.name not in IGNORED_VARS) - - -NM_FUNCS = set('Tt') -NM_PUBLIC_VARS = set('BD') -NM_PRIVATE_VARS = set('bd') -NM_VARS = NM_PUBLIC_VARS | NM_PRIVATE_VARS -NM_DATA = set('Rr') -NM_OTHER = set('ACGgiINpSsuUVvWw-?') -NM_IGNORED = NM_FUNCS | NM_DATA | NM_OTHER - - -def _find_var_symbols(python, nm, capi_vars, globalnames): - args = [nm, - '--line-numbers', - python] - out = subprocess.check_output(args) - for line in out.decode('utf-8').splitlines(): - var = Var.parse_nm(line, NM_VARS, NM_IGNORED, capi_vars, globalnames) - if var is None: - continue - yield var - - -####################################### - -class Filter(namedtuple('Filter', 'name op value action')): - - @classmethod - def parse(cls, raw): - action = '+' - if raw.startswith(('+', '-')): - action = raw[0] - raw = raw[1:] - # XXX Support < and >? - name, op, value = raw.partition('=') - return cls(name, op, value, action) - - def check(self, var): - value = getattr(var, self.name, None) - if not self.op: - matched = bool(value) - elif self.op == '=': - matched = (value == self.value) - else: - raise NotImplementedError - - if self.action == '+': - return matched - elif self.action == '-': - return not matched - else: - raise NotImplementedError - - -def filter_var(var, filters): - for filter in filters: - if not filter.check(var): - return False - return True - - -def make_sort_key(spec): - columns = [(col.strip('_'), '_' if col.startswith('_') else '') - for col in spec] - def sort_key(var): - return tuple(getattr(var, col).lstrip(prefix) - for col, prefix in columns) - return sort_key - - -def make_groups(allvars, spec): - group = spec - groups = {} - for var in allvars: - value = getattr(var, group) - key = '{}: {}'.format(group, value) - try: - groupvars = groups[key] - except KeyError: - groupvars = groups[key] = [] - groupvars.append(var) - return groups - - -def format_groups(groups, columns, fmts, widths): - for group in sorted(groups): - groupvars = groups[group] - yield '', 0 - yield ' # {}'.format(group), 0 - yield from format_vars(groupvars, columns, fmts, widths) - - -def format_vars(allvars, columns, fmts, widths): - fmt = ' '.join(fmts[col] for col in columns) - fmt = ' ' + fmt.replace(' ', ' ') + ' ' # for div margin - header = fmt.replace(':', ':^').format(*(col.upper() for col in columns)) - yield header, 0 - div = ' '.join('-'*(widths[col]+2) for col in columns) - yield div, 0 - for var in allvars: - values = (getattr(var, col) for col in columns) - row = fmt.format(*('X' if val is True else val or '' - for val in values)) - yield row, 1 - yield div, 0 - - -####################################### - -COLUMNS = 'name,external,capi,scope,filename' -COLUMN_NAMES = COLUMNS.split(',') - -COLUMN_WIDTHS = {col: len(col) - for col in COLUMN_NAMES} -COLUMN_WIDTHS.update({ - 'name': 50, - 'scope': 7, - 'filename': 40, - }) -COLUMN_FORMATS = {col: '{:%s}' % width - for col, width in COLUMN_WIDTHS.items()} -for col in COLUMN_FORMATS: - if COLUMN_WIDTHS[col] == len(col): - COLUMN_FORMATS[col] = COLUMN_FORMATS[col].replace(':', ':^') - - -def _parse_filters_arg(raw, error): - filters = [] - for value in raw.split(','): - value=value.strip() - if not value: - continue - try: - filter = Filter.parse(value) - if filter.name not in COLUMN_NAMES: - raise Exception('unsupported column {!r}'.format(filter.name)) - except Exception as e: - error('bad filter {!r}: {}'.format(raw, e)) - filters.append(filter) - return filters - - -def _parse_columns_arg(raw, error): - columns = raw.split(',') - for column in columns: - if column not in COLUMN_NAMES: - error('unsupported column {!r}'.format(column)) - return columns - - -def _parse_sort_arg(raw, error): - sort = raw.split(',') - for column in sort: - if column.lstrip('_') not in COLUMN_NAMES: - error('unsupported column {!r}'.format(column)) - return sort - - -def _parse_group_arg(raw, error): - if not raw: - return raw - group = raw - if group not in COLUMN_NAMES: - error('unsupported column {!r}'.format(group)) - if group != 'filename': - error('unsupported group {!r}'.format(group)) - return group - - -def parse_args(argv=None): - if argv is None: - argv = sys.argv[1:] - - import argparse - parser = argparse.ArgumentParser() - - parser.add_argument('-v', '--verbose', action='count', default=0) - parser.add_argument('-q', '--quiet', action='count', default=0) - - parser.add_argument('--filters', default='-scope', - help='[[-][=]] ...') - - parser.add_argument('--columns', default=COLUMNS, - help='a comma-separated list of columns to show') - parser.add_argument('--sort', default='filename,_name', - help='a comma-separated list of columns to sort') - parser.add_argument('--group', - help='group by the given column name (- to not group)') - - parser.add_argument('--rc-on-match', dest='rc', type=int) - - parser.add_argument('filename', nargs='?', default=GLOBALS_FILE) - - args = parser.parse_args(argv) - - verbose = vars(args).pop('verbose', 0) - quiet = vars(args).pop('quiet', 0) - args.verbosity = max(0, VERBOSITY + verbose - quiet) - - if args.sort.startswith('filename') and not args.group: - args.group = 'filename' - - if args.rc is None: - if '-scope=core' in args.filters or 'core' not in args.filters: - args.rc = 0 - else: - args.rc = 1 - - args.filters = _parse_filters_arg(args.filters, parser.error) - args.columns = _parse_columns_arg(args.columns, parser.error) - args.sort = _parse_sort_arg(args.sort, parser.error) - args.group = _parse_group_arg(args.group, parser.error) - - return args - - -def main(root=ROOT_DIR, filename=GLOBALS_FILE, - filters=None, columns=COLUMN_NAMES, sort=None, group=None, - verbosity=VERBOSITY, rc=1): - - log = lambda msg: ... - if verbosity >= 2: - log = lambda msg: print(msg) - - allvars = (var - for var in find_vars(root, filename) - if filter_var(var, filters)) - if sort: - allvars = sorted(allvars, key=make_sort_key(sort)) - - if group: - try: - columns.remove(group) - except ValueError: - pass - grouped = make_groups(allvars, group) - lines = format_groups(grouped, columns, COLUMN_FORMATS, COLUMN_WIDTHS) - else: - lines = format_vars(allvars, columns, COLUMN_FORMATS, COLUMN_WIDTHS) - - total = 0 - for line, count in lines: - total += count - log(line) - log('\ntotal: {}'.format(total)) - - if total and rc: - print('ERROR: found unsafe globals', file=sys.stderr) - return rc - return 0 - - -if __name__ == '__main__': - args = parse_args() - sys.exit( - main(**vars(args))) diff --git a/Tools/c-globals/ignored-globals.txt b/Tools/c-globals/ignored-globals.txt deleted file mode 100644 index ce6d1d80..00000000 --- a/Tools/c-globals/ignored-globals.txt +++ /dev/null @@ -1,492 +0,0 @@ -# All variables declared here are shared between all interpreters -# in a single process. That means that they must not be changed -# unless that change should apply to all interpreters. -# -# See check-c-globals.py. -# -# Many generic names are handled via the script: -# -# * most exceptions and all warnings handled via _is_exception() -# * for builtin modules, generic names are handled via _is_module() -# * generic names for static types handled via _is_type_var() -# * AST vars handled via _is_compiler() - - -####################################### -# main - -# Modules/getpath.c -exec_prefix -module_search_path -prefix -progpath - -# Modules/main.c -orig_argc -orig_argv - -# Python/getopt.c -opt_ptr -_PyOS_optarg -_PyOS_opterr -_PyOS_optind - - -####################################### -# REPL - -# Parser/myreadline.c -PyOS_InputHook -PyOS_ReadlineFunctionPointer -_PyOS_ReadlineLock -_PyOS_ReadlineTState - - -####################################### -# state - -# Python/dtoa.c -p5s -pmem_next # very slight race -private_mem # very slight race - -# Python/import.c -# For the moment the import lock stays global. Ultimately there should -# be a global lock for extension modules and a per-interpreter lock. -import_lock -import_lock_level -import_lock_thread - -# Python/pylifecycle.c -_PyRuntime - - -#--------------------------------- -# module globals (PyObject) - -# Modules/_functoolsmodule.c -kwd_mark - -# Modules/_localemodule.c -Error - -# Modules/_threadmodule.c -ThreadError - -# Modules/_tracemalloc.c -unknown_filename - -# Modules/gcmodule.c -gc_str - -# Modules/posixmodule.c -billion -posix_putenv_garbage - -# Modules/signalmodule.c -DefaultHandler -IgnoreHandler -IntHandler -ItimerError - -# Modules/zipimport.c -ZipImportError -zip_directory_cache - - -#--------------------------------- -# module globals (other) - -# Modules/_tracemalloc.c -allocators -tables_lock -tracemalloc_config -tracemalloc_empty_traceback -tracemalloc_filenames -tracemalloc_peak_traced_memory -tracemalloc_reentrant_key -tracemalloc_traceback -tracemalloc_tracebacks -tracemalloc_traced_memory -tracemalloc_traces - -# Modules/faulthandler.c -fatal_error -faulthandler_handlers -old_stack -stack -thread -user_signals - -# Modules/posixmodule.c -posix_constants_confstr -posix_constants_pathconf -posix_constants_sysconf -structseq_new -ticks_per_second - -# Modules/signalmodule.c -Handlers # main thread only -is_tripped # main thread only -main_pid -main_thread -old_siginthandler -wakeup_fd # main thread only - -# Modules/zipimport.c -zip_searchorder - -# Python/bltinmodule.c -Py_FileSystemDefaultEncodeErrors -Py_FileSystemDefaultEncoding -Py_HasFileSystemDefaultEncoding - -# Python/sysmodule.c -_PySys_ImplCacheTag -_PySys_ImplName - - -#--------------------------------- -# freelists - -# Modules/_collectionsmodule.c -freeblocks -numfreeblocks - -# Objects/classobject.c -free_list -numfree - -# Objects/dictobject.c -free_list -keys_free_list -numfree -numfreekeys - -# Objects/exceptions.c -memerrors_freelist -memerrors_numfree - -# Objects/floatobject.c -free_list -numfree - -# Objects/frameobject.c -free_list -numfree - -# Objects/genobject.c -ag_asend_freelist -ag_asend_freelist_free -ag_value_freelist -ag_value_freelist_free - -# Objects/listobject.c -free_list -numfree - -# Objects/methodobject.c -free_list -numfree - -# Objects/sliceobject.c -slice_cache # slight race - -# Objects/tupleobject.c -free_list -numfree - -# Python/dtoa.c -freelist # very slight race - - -#--------------------------------- -# caches (PyObject) - -# Objects/typeobject.c -method_cache # only for static types -next_version_tag # only for static types - -# Python/dynload_shlib.c -handles # slight race during import -nhandles # slight race during import - -# Python/import.c -extensions # slight race on init during import - - -#--------------------------------- -# caches (other) - -# Python/bootstrap_hash.c -urandom_cache - -# Python/modsupport.c -_Py_PackageContext # Slight race during import! Move to PyThreadState? - - -#--------------------------------- -# counters - -# Objects/bytesobject.c -null_strings -one_strings - -# Objects/dictobject.c -pydict_global_version - -# Objects/moduleobject.c -max_module_number # slight race during import - - -####################################### -# constants - -#--------------------------------- -# singletons - -# Objects/boolobject.c -_Py_FalseStruct -_Py_TrueStruct - -# Objects/object.c -_Py_NoneStruct -_Py_NotImplementedStruct - -# Objects/sliceobject.c -_Py_EllipsisObject - - -#--------------------------------- -# constants (other) - -# Modules/config.c -_PyImport_Inittab - -# Objects/bytearrayobject.c -_PyByteArray_empty_string - -# Objects/dictobject.c -empty_keys_struct -empty_values - -# Objects/floatobject.c -detected_double_format -detected_float_format -double_format -float_format - -# Objects/longobject.c -_PyLong_DigitValue - -# Objects/object.c -_Py_SwappedOp - -# Objects/obmalloc.c -_PyMem_Debug - -# Objects/setobject.c -_dummy_struct - -# Objects/structseq.c -PyStructSequence_UnnamedField - -# Objects/typeobject.c -name_op -slotdefs # almost -slotdefs_initialized # almost -subtype_getsets_dict_only -subtype_getsets_full -subtype_getsets_weakref_only -tp_new_methoddef - -# Objects/unicodeobject.c -bloom_linebreak -static_strings # slight race - -# Parser/tokenizer.c -_PyParser_TokenNames - -# Python/Python-ast.c -alias_fields - -# Python/codecs.c -Py_hexdigits -ucnhash_CAPI # slight performance-only race - -# Python/dynload_shlib.c -_PyImport_DynLoadFiletab - -# Python/fileutils.c -_Py_open_cloexec_works -force_ascii - -# Python/frozen.c -M___hello__ -PyImport_FrozenModules - -# Python/graminit.c -_PyParser_Grammar -dfas -labels - -# Python/import.c -PyImport_Inittab - -# Python/pylifecycle.c -_TARGET_LOCALES - - -#--------------------------------- -# initialized (PyObject) - -# Objects/bytesobject.c -characters -nullstring - -# Objects/exceptions.c -PyExc_RecursionErrorInst -errnomap - -# Objects/longobject.c -_PyLong_One -_PyLong_Zero -small_ints - -# Objects/setobject.c -emptyfrozenset - -# Objects/unicodeobject.c -interned # slight race on init in PyUnicode_InternInPlace() -unicode_empty -unicode_latin1 - - -#--------------------------------- -# initialized (other) - -# Python/getargs.c -static_arg_parsers - -# Python/pyhash.c -PyHash_Func -_Py_HashSecret -_Py_HashSecret_Initialized - -# Python/pylifecycle.c -_Py_StandardStreamEncoding -_Py_StandardStreamErrors -default_home -env_home -progname -Py_BytesWarningFlag -Py_DebugFlag -Py_DontWriteBytecodeFlag -Py_FrozenFlag -Py_HashRandomizationFlag -Py_IgnoreEnvironmentFlag -Py_InspectFlag -Py_InteractiveFlag -Py_IsolatedFlag -Py_NoSiteFlag -Py_NoUserSiteDirectory -Py_OptimizeFlag -Py_QuietFlag -Py_UnbufferedStdioFlag -Py_VerboseFlag - - -#--------------------------------- -# types - -# Modules/_threadmodule.c -Locktype -RLocktype -localdummytype -localtype - -# Objects/exceptions.c -PyExc_BaseException -PyExc_Exception -PyExc_GeneratorExit -PyExc_KeyboardInterrupt -PyExc_StopAsyncIteration -PyExc_StopIteration -PyExc_SystemExit -_PyExc_BaseException -_PyExc_Exception -_PyExc_GeneratorExit -_PyExc_KeyboardInterrupt -_PyExc_StopAsyncIteration -_PyExc_StopIteration -_PyExc_SystemExit - -# Objects/structseq.c -_struct_sequence_template - - -#--------------------------------- -# interned strings/bytes - -# Modules/_io/_iomodule.c -_PyIO_empty_bytes -_PyIO_empty_str -_PyIO_str_close -_PyIO_str_closed -_PyIO_str_decode -_PyIO_str_encode -_PyIO_str_fileno -_PyIO_str_flush -_PyIO_str_getstate -_PyIO_str_isatty -_PyIO_str_newlines -_PyIO_str_nl -_PyIO_str_read -_PyIO_str_read1 -_PyIO_str_readable -_PyIO_str_readall -_PyIO_str_readinto -_PyIO_str_readline -_PyIO_str_reset -_PyIO_str_seek -_PyIO_str_seekable -_PyIO_str_setstate -_PyIO_str_tell -_PyIO_str_truncate -_PyIO_str_writable -_PyIO_str_write - -# Modules/_threadmodule.c -str_dict - -# Objects/boolobject.c -false_str -true_str - -# Objects/listobject.c -indexerr - -# Python/symtable.c -__class__ -dictcomp -genexpr -lambda -listcomp -setcomp -top - -# Python/sysmodule.c -whatstrings - - -####################################### -# hacks - -# Objects/object.c -_Py_abstract_hack - -# Objects/setobject.c -_PySet_Dummy - -# Python/pylifecycle.c -_PyOS_mystrnicmp_hack diff --git a/Tools/ccbench/ccbench.py b/Tools/ccbench/ccbench.py index 60cec3e9..ab1465a2 100644 --- a/Tools/ccbench/ccbench.py +++ b/Tools/ccbench/ccbench.py @@ -84,13 +84,6 @@ def task_regex(): pat = re.compile(r'^(\s*def\s)|(.*(?= newbottom: break c.move(p, 0, 1) diff --git a/Tools/demo/rpythond.py b/Tools/demo/rpythond.py index a885b3e9..a18de137 100755 --- a/Tools/demo/rpythond.py +++ b/Tools/demo/rpythond.py @@ -29,7 +29,7 @@ def main(): with conn: print('connection from', remotehost, remoteport) request = b'' - while 1: + while True: data = conn.recv(BUFSIZE) if not data: break diff --git a/Tools/demo/sortvisu.py b/Tools/demo/sortvisu.py index 8447bc75..056a0e05 100755 --- a/Tools/demo/sortvisu.py +++ b/Tools/demo/sortvisu.py @@ -444,7 +444,7 @@ def quicksort(array): array.wait(1000) left = first right = last - while 1: + while True: array.message("Sweep right pointer") right = right-1 array.show_right(right) @@ -473,7 +473,7 @@ def quicksort(array): array.hide_partition() def demosort(array): - while 1: + while True: for alg in [quicksort, insertionsort, selectionsort, bubblesort]: randomize(array) alg(array) diff --git a/Tools/demo/spreadsheet.py b/Tools/demo/spreadsheet.py new file mode 100755 index 00000000..bf88820d --- /dev/null +++ b/Tools/demo/spreadsheet.py @@ -0,0 +1,829 @@ +#!/usr/bin/env python3 + +""" +SS1 -- a spreadsheet-like application. +""" + +import os +import re +import sys +from xml.parsers import expat +from xml.sax.saxutils import escape + +LEFT, CENTER, RIGHT = "LEFT", "CENTER", "RIGHT" + +def ljust(x, n): + return x.ljust(n) +def center(x, n): + return x.center(n) +def rjust(x, n): + return x.rjust(n) +align2action = {LEFT: ljust, CENTER: center, RIGHT: rjust} + +align2xml = {LEFT: "left", CENTER: "center", RIGHT: "right"} +xml2align = {"left": LEFT, "center": CENTER, "right": RIGHT} + +align2anchor = {LEFT: "w", CENTER: "center", RIGHT: "e"} + +def sum(seq): + total = 0 + for x in seq: + if x is not None: + total += x + return total + +class Sheet: + + def __init__(self): + self.cells = {} # {(x, y): cell, ...} + self.ns = dict( + cell = self.cellvalue, + cells = self.multicellvalue, + sum = sum, + ) + + def cellvalue(self, x, y): + cell = self.getcell(x, y) + if hasattr(cell, 'recalc'): + return cell.recalc(self.ns) + else: + return cell + + def multicellvalue(self, x1, y1, x2, y2): + if x1 > x2: + x1, x2 = x2, x1 + if y1 > y2: + y1, y2 = y2, y1 + seq = [] + for y in range(y1, y2+1): + for x in range(x1, x2+1): + seq.append(self.cellvalue(x, y)) + return seq + + def getcell(self, x, y): + return self.cells.get((x, y)) + + def setcell(self, x, y, cell): + assert x > 0 and y > 0 + assert isinstance(cell, BaseCell) + self.cells[x, y] = cell + + def clearcell(self, x, y): + try: + del self.cells[x, y] + except KeyError: + pass + + def clearcells(self, x1, y1, x2, y2): + for xy in self.selectcells(x1, y1, x2, y2): + del self.cells[xy] + + def clearrows(self, y1, y2): + self.clearcells(0, y1, sys.maxsize, y2) + + def clearcolumns(self, x1, x2): + self.clearcells(x1, 0, x2, sys.maxsize) + + def selectcells(self, x1, y1, x2, y2): + if x1 > x2: + x1, x2 = x2, x1 + if y1 > y2: + y1, y2 = y2, y1 + return [(x, y) for x, y in self.cells + if x1 <= x <= x2 and y1 <= y <= y2] + + def movecells(self, x1, y1, x2, y2, dx, dy): + if dx == 0 and dy == 0: + return + if x1 > x2: + x1, x2 = x2, x1 + if y1 > y2: + y1, y2 = y2, y1 + assert x1+dx > 0 and y1+dy > 0 + new = {} + for x, y in self.cells: + cell = self.cells[x, y] + if hasattr(cell, 'renumber'): + cell = cell.renumber(x1, y1, x2, y2, dx, dy) + if x1 <= x <= x2 and y1 <= y <= y2: + x += dx + y += dy + new[x, y] = cell + self.cells = new + + def insertrows(self, y, n): + assert n > 0 + self.movecells(0, y, sys.maxsize, sys.maxsize, 0, n) + + def deleterows(self, y1, y2): + if y1 > y2: + y1, y2 = y2, y1 + self.clearrows(y1, y2) + self.movecells(0, y2+1, sys.maxsize, sys.maxsize, 0, y1-y2-1) + + def insertcolumns(self, x, n): + assert n > 0 + self.movecells(x, 0, sys.maxsize, sys.maxsize, n, 0) + + def deletecolumns(self, x1, x2): + if x1 > x2: + x1, x2 = x2, x1 + self.clearcells(x1, x2) + self.movecells(x2+1, 0, sys.maxsize, sys.maxsize, x1-x2-1, 0) + + def getsize(self): + maxx = maxy = 0 + for x, y in self.cells: + maxx = max(maxx, x) + maxy = max(maxy, y) + return maxx, maxy + + def reset(self): + for cell in self.cells.values(): + if hasattr(cell, 'reset'): + cell.reset() + + def recalc(self): + self.reset() + for cell in self.cells.values(): + if hasattr(cell, 'recalc'): + cell.recalc(self.ns) + + def display(self): + maxx, maxy = self.getsize() + width, height = maxx+1, maxy+1 + colwidth = [1] * width + full = {} + # Add column heading labels in row 0 + for x in range(1, width): + full[x, 0] = text, alignment = colnum2name(x), RIGHT + colwidth[x] = max(colwidth[x], len(text)) + # Add row labels in column 0 + for y in range(1, height): + full[0, y] = text, alignment = str(y), RIGHT + colwidth[0] = max(colwidth[0], len(text)) + # Add sheet cells in columns with x>0 and y>0 + for (x, y), cell in self.cells.items(): + if x <= 0 or y <= 0: + continue + if hasattr(cell, 'recalc'): + cell.recalc(self.ns) + if hasattr(cell, 'format'): + text, alignment = cell.format() + assert isinstance(text, str) + assert alignment in (LEFT, CENTER, RIGHT) + else: + text = str(cell) + if isinstance(cell, str): + alignment = LEFT + else: + alignment = RIGHT + full[x, y] = (text, alignment) + colwidth[x] = max(colwidth[x], len(text)) + # Calculate the horizontal separator line (dashes and dots) + sep = "" + for x in range(width): + if sep: + sep += "+" + sep += "-"*colwidth[x] + # Now print The full grid + for y in range(height): + line = "" + for x in range(width): + text, alignment = full.get((x, y)) or ("", LEFT) + text = align2action[alignment](text, colwidth[x]) + if line: + line += '|' + line += text + print(line) + if y == 0: + print(sep) + + def xml(self): + out = [''] + for (x, y), cell in self.cells.items(): + if hasattr(cell, 'xml'): + cellxml = cell.xml() + else: + cellxml = '%s' % escape(cell) + out.append('\n %s\n' % + (y, x, cellxml)) + out.append('') + return '\n'.join(out) + + def save(self, filename): + text = self.xml() + with open(filename, "w", encoding='utf-8') as f: + f.write(text) + if text and not text.endswith('\n'): + f.write('\n') + + def load(self, filename): + with open(filename, 'rb') as f: + SheetParser(self).parsefile(f) + +class SheetParser: + + def __init__(self, sheet): + self.sheet = sheet + + def parsefile(self, f): + parser = expat.ParserCreate() + parser.StartElementHandler = self.startelement + parser.EndElementHandler = self.endelement + parser.CharacterDataHandler = self.data + parser.ParseFile(f) + + def startelement(self, tag, attrs): + method = getattr(self, 'start_'+tag, None) + if method: + method(attrs) + self.texts = [] + + def data(self, text): + self.texts.append(text) + + def endelement(self, tag): + method = getattr(self, 'end_'+tag, None) + if method: + method("".join(self.texts)) + + def start_cell(self, attrs): + self.y = int(attrs.get("row")) + self.x = int(attrs.get("col")) + + def start_value(self, attrs): + self.fmt = attrs.get('format') + self.alignment = xml2align.get(attrs.get('align')) + + start_formula = start_value + + def end_int(self, text): + try: + self.value = int(text) + except (TypeError, ValueError): + self.value = None + + end_long = end_int + + def end_double(self, text): + try: + self.value = float(text) + except (TypeError, ValueError): + self.value = None + + def end_complex(self, text): + try: + self.value = complex(text) + except (TypeError, ValueError): + self.value = None + + def end_string(self, text): + self.value = text + + def end_value(self, text): + if isinstance(self.value, BaseCell): + self.cell = self.value + elif isinstance(self.value, str): + self.cell = StringCell(self.value, + self.fmt or "%s", + self.alignment or LEFT) + else: + self.cell = NumericCell(self.value, + self.fmt or "%s", + self.alignment or RIGHT) + + def end_formula(self, text): + self.cell = FormulaCell(text, + self.fmt or "%s", + self.alignment or RIGHT) + + def end_cell(self, text): + self.sheet.setcell(self.x, self.y, self.cell) + +class BaseCell: + __init__ = None # Must provide + """Abstract base class for sheet cells. + + Subclasses may but needn't provide the following APIs: + + cell.reset() -- prepare for recalculation + cell.recalc(ns) -> value -- recalculate formula + cell.format() -> (value, alignment) -- return formatted value + cell.xml() -> string -- return XML + """ + +class NumericCell(BaseCell): + + def __init__(self, value, fmt="%s", alignment=RIGHT): + assert isinstance(value, (int, float, complex)) + assert alignment in (LEFT, CENTER, RIGHT) + self.value = value + self.fmt = fmt + self.alignment = alignment + + def recalc(self, ns): + return self.value + + def format(self): + try: + text = self.fmt % self.value + except: + text = str(self.value) + return text, self.alignment + + def xml(self): + method = getattr(self, '_xml_' + type(self.value).__name__) + return '%s' % ( + align2xml[self.alignment], + self.fmt, + method()) + + def _xml_int(self): + if -2**31 <= self.value < 2**31: + return '%s' % self.value + else: + return '%s' % self.value + + def _xml_float(self): + return '%r' % self.value + + def _xml_complex(self): + return '%r' % self.value + +class StringCell(BaseCell): + + def __init__(self, text, fmt="%s", alignment=LEFT): + assert isinstance(text, str) + assert alignment in (LEFT, CENTER, RIGHT) + self.text = text + self.fmt = fmt + self.alignment = alignment + + def recalc(self, ns): + return self.text + + def format(self): + return self.text, self.alignment + + def xml(self): + s = '%s' + return s % ( + align2xml[self.alignment], + self.fmt, + escape(self.text)) + +class FormulaCell(BaseCell): + + def __init__(self, formula, fmt="%s", alignment=RIGHT): + assert alignment in (LEFT, CENTER, RIGHT) + self.formula = formula + self.translated = translate(self.formula) + self.fmt = fmt + self.alignment = alignment + self.reset() + + def reset(self): + self.value = None + + def recalc(self, ns): + if self.value is None: + try: + self.value = eval(self.translated, ns) + except: + exc = sys.exc_info()[0] + if hasattr(exc, "__name__"): + self.value = exc.__name__ + else: + self.value = str(exc) + return self.value + + def format(self): + try: + text = self.fmt % self.value + except: + text = str(self.value) + return text, self.alignment + + def xml(self): + return '%s' % ( + align2xml[self.alignment], + self.fmt, + escape(self.formula)) + + def renumber(self, x1, y1, x2, y2, dx, dy): + out = [] + for part in re.split(r'(\w+)', self.formula): + m = re.match('^([A-Z]+)([1-9][0-9]*)$', part) + if m is not None: + sx, sy = m.groups() + x = colname2num(sx) + y = int(sy) + if x1 <= x <= x2 and y1 <= y <= y2: + part = cellname(x+dx, y+dy) + out.append(part) + return FormulaCell("".join(out), self.fmt, self.alignment) + +def translate(formula): + """Translate a formula containing fancy cell names to valid Python code. + + Examples: + B4 -> cell(2, 4) + B4:Z100 -> cells(2, 4, 26, 100) + """ + out = [] + for part in re.split(r"(\w+(?::\w+)?)", formula): + m = re.match(r"^([A-Z]+)([1-9][0-9]*)(?::([A-Z]+)([1-9][0-9]*))?$", part) + if m is None: + out.append(part) + else: + x1, y1, x2, y2 = m.groups() + x1 = colname2num(x1) + if x2 is None: + s = "cell(%s, %s)" % (x1, y1) + else: + x2 = colname2num(x2) + s = "cells(%s, %s, %s, %s)" % (x1, y1, x2, y2) + out.append(s) + return "".join(out) + +def cellname(x, y): + "Translate a cell coordinate to a fancy cell name (e.g. (1, 1)->'A1')." + assert x > 0 # Column 0 has an empty name, so can't use that + return colnum2name(x) + str(y) + +def colname2num(s): + "Translate a column name to number (e.g. 'A'->1, 'Z'->26, 'AA'->27)." + s = s.upper() + n = 0 + for c in s: + assert 'A' <= c <= 'Z' + n = n*26 + ord(c) - ord('A') + 1 + return n + +def colnum2name(n): + "Translate a column number to name (e.g. 1->'A', etc.)." + assert n > 0 + s = "" + while n: + n, m = divmod(n-1, 26) + s = chr(m+ord('A')) + s + return s + +import tkinter as Tk + +class SheetGUI: + + """Beginnings of a GUI for a spreadsheet. + + TO DO: + - clear multiple cells + - Insert, clear, remove rows or columns + - Show new contents while typing + - Scroll bars + - Grow grid when window is grown + - Proper menus + - Undo, redo + - Cut, copy and paste + - Formatting and alignment + """ + + def __init__(self, filename="sheet1.xml", rows=10, columns=5): + """Constructor. + + Load the sheet from the filename argument. + Set up the Tk widget tree. + """ + # Create and load the sheet + self.filename = filename + self.sheet = Sheet() + if os.path.isfile(filename): + self.sheet.load(filename) + # Calculate the needed grid size + maxx, maxy = self.sheet.getsize() + rows = max(rows, maxy) + columns = max(columns, maxx) + # Create the widgets + self.root = Tk.Tk() + self.root.wm_title("Spreadsheet: %s" % self.filename) + self.beacon = Tk.Label(self.root, text="A1", + font=('helvetica', 16, 'bold')) + self.entry = Tk.Entry(self.root) + self.savebutton = Tk.Button(self.root, text="Save", + command=self.save) + self.cellgrid = Tk.Frame(self.root) + # Configure the widget lay-out + self.cellgrid.pack(side="bottom", expand=1, fill="both") + self.beacon.pack(side="left") + self.savebutton.pack(side="right") + self.entry.pack(side="left", expand=1, fill="x") + # Bind some events + self.entry.bind("", self.return_event) + self.entry.bind("", self.shift_return_event) + self.entry.bind("", self.tab_event) + self.entry.bind("", self.shift_tab_event) + self.entry.bind("", self.delete_event) + self.entry.bind("", self.escape_event) + # Now create the cell grid + self.makegrid(rows, columns) + # Select the top-left cell + self.currentxy = None + self.cornerxy = None + self.setcurrent(1, 1) + # Copy the sheet cells to the GUI cells + self.sync() + + def delete_event(self, event): + if self.cornerxy != self.currentxy and self.cornerxy is not None: + self.sheet.clearcells(*(self.currentxy + self.cornerxy)) + else: + self.sheet.clearcell(*self.currentxy) + self.sync() + self.entry.delete(0, 'end') + return "break" + + def escape_event(self, event): + x, y = self.currentxy + self.load_entry(x, y) + + def load_entry(self, x, y): + cell = self.sheet.getcell(x, y) + if cell is None: + text = "" + elif isinstance(cell, FormulaCell): + text = '=' + cell.formula + else: + text, alignment = cell.format() + self.entry.delete(0, 'end') + self.entry.insert(0, text) + self.entry.selection_range(0, 'end') + + def makegrid(self, rows, columns): + """Helper to create the grid of GUI cells. + + The edge (x==0 or y==0) is filled with labels; the rest is real cells. + """ + self.rows = rows + self.columns = columns + self.gridcells = {} + # Create the top left corner cell (which selects all) + cell = Tk.Label(self.cellgrid, relief='raised') + cell.grid_configure(column=0, row=0, sticky='NSWE') + cell.bind("", self.selectall) + # Create the top row of labels, and configure the grid columns + for x in range(1, columns+1): + self.cellgrid.grid_columnconfigure(x, minsize=64) + cell = Tk.Label(self.cellgrid, text=colnum2name(x), relief='raised') + cell.grid_configure(column=x, row=0, sticky='WE') + self.gridcells[x, 0] = cell + cell.__x = x + cell.__y = 0 + cell.bind("", self.selectcolumn) + cell.bind("", self.extendcolumn) + cell.bind("", self.extendcolumn) + cell.bind("", self.extendcolumn) + # Create the leftmost column of labels + for y in range(1, rows+1): + cell = Tk.Label(self.cellgrid, text=str(y), relief='raised') + cell.grid_configure(column=0, row=y, sticky='WE') + self.gridcells[0, y] = cell + cell.__x = 0 + cell.__y = y + cell.bind("", self.selectrow) + cell.bind("", self.extendrow) + cell.bind("", self.extendrow) + cell.bind("", self.extendrow) + # Create the real cells + for x in range(1, columns+1): + for y in range(1, rows+1): + cell = Tk.Label(self.cellgrid, relief='sunken', + bg='white', fg='black') + cell.grid_configure(column=x, row=y, sticky='NSWE') + self.gridcells[x, y] = cell + cell.__x = x + cell.__y = y + # Bind mouse events + cell.bind("", self.press) + cell.bind("", self.motion) + cell.bind("", self.release) + cell.bind("", self.release) + + def selectall(self, event): + self.setcurrent(1, 1) + self.setcorner(sys.maxsize, sys.maxsize) + + def selectcolumn(self, event): + x, y = self.whichxy(event) + self.setcurrent(x, 1) + self.setcorner(x, sys.maxsize) + + def extendcolumn(self, event): + x, y = self.whichxy(event) + if x > 0: + self.setcurrent(self.currentxy[0], 1) + self.setcorner(x, sys.maxsize) + + def selectrow(self, event): + x, y = self.whichxy(event) + self.setcurrent(1, y) + self.setcorner(sys.maxsize, y) + + def extendrow(self, event): + x, y = self.whichxy(event) + if y > 0: + self.setcurrent(1, self.currentxy[1]) + self.setcorner(sys.maxsize, y) + + def press(self, event): + x, y = self.whichxy(event) + if x > 0 and y > 0: + self.setcurrent(x, y) + + def motion(self, event): + x, y = self.whichxy(event) + if x > 0 and y > 0: + self.setcorner(x, y) + + release = motion + + def whichxy(self, event): + w = self.cellgrid.winfo_containing(event.x_root, event.y_root) + if w is not None and isinstance(w, Tk.Label): + try: + return w.__x, w.__y + except AttributeError: + pass + return 0, 0 + + def save(self): + self.sheet.save(self.filename) + + def setcurrent(self, x, y): + "Make (x, y) the current cell." + if self.currentxy is not None: + self.change_cell() + self.clearfocus() + self.beacon['text'] = cellname(x, y) + self.load_entry(x, y) + self.entry.focus_set() + self.currentxy = x, y + self.cornerxy = None + gridcell = self.gridcells.get(self.currentxy) + if gridcell is not None: + gridcell['bg'] = 'yellow' + + def setcorner(self, x, y): + if self.currentxy is None or self.currentxy == (x, y): + self.setcurrent(x, y) + return + self.clearfocus() + self.cornerxy = x, y + x1, y1 = self.currentxy + x2, y2 = self.cornerxy or self.currentxy + if x1 > x2: + x1, x2 = x2, x1 + if y1 > y2: + y1, y2 = y2, y1 + for (x, y), cell in self.gridcells.items(): + if x1 <= x <= x2 and y1 <= y <= y2: + cell['bg'] = 'lightBlue' + gridcell = self.gridcells.get(self.currentxy) + if gridcell is not None: + gridcell['bg'] = 'yellow' + self.setbeacon(x1, y1, x2, y2) + + def setbeacon(self, x1, y1, x2, y2): + if x1 == y1 == 1 and x2 == y2 == sys.maxsize: + name = ":" + elif (x1, x2) == (1, sys.maxsize): + if y1 == y2: + name = "%d" % y1 + else: + name = "%d:%d" % (y1, y2) + elif (y1, y2) == (1, sys.maxsize): + if x1 == x2: + name = "%s" % colnum2name(x1) + else: + name = "%s:%s" % (colnum2name(x1), colnum2name(x2)) + else: + name1 = cellname(*self.currentxy) + name2 = cellname(*self.cornerxy) + name = "%s:%s" % (name1, name2) + self.beacon['text'] = name + + + def clearfocus(self): + if self.currentxy is not None: + x1, y1 = self.currentxy + x2, y2 = self.cornerxy or self.currentxy + if x1 > x2: + x1, x2 = x2, x1 + if y1 > y2: + y1, y2 = y2, y1 + for (x, y), cell in self.gridcells.items(): + if x1 <= x <= x2 and y1 <= y <= y2: + cell['bg'] = 'white' + + def return_event(self, event): + "Callback for the Return key." + self.change_cell() + x, y = self.currentxy + self.setcurrent(x, y+1) + return "break" + + def shift_return_event(self, event): + "Callback for the Return key with Shift modifier." + self.change_cell() + x, y = self.currentxy + self.setcurrent(x, max(1, y-1)) + return "break" + + def tab_event(self, event): + "Callback for the Tab key." + self.change_cell() + x, y = self.currentxy + self.setcurrent(x+1, y) + return "break" + + def shift_tab_event(self, event): + "Callback for the Tab key with Shift modifier." + self.change_cell() + x, y = self.currentxy + self.setcurrent(max(1, x-1), y) + return "break" + + def change_cell(self): + "Set the current cell from the entry widget." + x, y = self.currentxy + text = self.entry.get() + cell = None + if text.startswith('='): + cell = FormulaCell(text[1:]) + else: + for cls in int, float, complex: + try: + value = cls(text) + except (TypeError, ValueError): + continue + else: + cell = NumericCell(value) + break + if cell is None and text: + cell = StringCell(text) + if cell is None: + self.sheet.clearcell(x, y) + else: + self.sheet.setcell(x, y, cell) + self.sync() + + def sync(self): + "Fill the GUI cells from the sheet cells." + self.sheet.recalc() + for (x, y), gridcell in self.gridcells.items(): + if x == 0 or y == 0: + continue + cell = self.sheet.getcell(x, y) + if cell is None: + gridcell['text'] = "" + else: + if hasattr(cell, 'format'): + text, alignment = cell.format() + else: + text, alignment = str(cell), LEFT + gridcell['text'] = text + gridcell['anchor'] = align2anchor[alignment] + + +def test_basic(): + "Basic non-gui self-test." + a = Sheet() + for x in range(1, 11): + for y in range(1, 11): + if x == 1: + cell = NumericCell(y) + elif y == 1: + cell = NumericCell(x) + else: + c1 = cellname(x, 1) + c2 = cellname(1, y) + formula = "%s*%s" % (c1, c2) + cell = FormulaCell(formula) + a.setcell(x, y, cell) +## if os.path.isfile("sheet1.xml"): +## print "Loading from sheet1.xml" +## a.load("sheet1.xml") + a.display() + a.save("sheet1.xml") + +def test_gui(): + "GUI test." + if sys.argv[1:]: + filename = sys.argv[1] + else: + filename = "sheet1.xml" + g = SheetGUI(filename) + g.root.mainloop() + +if __name__ == '__main__': + #test_basic() + test_gui() diff --git a/Tools/demo/ss1.py b/Tools/demo/ss1.py deleted file mode 100755 index bf88820d..00000000 --- a/Tools/demo/ss1.py +++ /dev/null @@ -1,829 +0,0 @@ -#!/usr/bin/env python3 - -""" -SS1 -- a spreadsheet-like application. -""" - -import os -import re -import sys -from xml.parsers import expat -from xml.sax.saxutils import escape - -LEFT, CENTER, RIGHT = "LEFT", "CENTER", "RIGHT" - -def ljust(x, n): - return x.ljust(n) -def center(x, n): - return x.center(n) -def rjust(x, n): - return x.rjust(n) -align2action = {LEFT: ljust, CENTER: center, RIGHT: rjust} - -align2xml = {LEFT: "left", CENTER: "center", RIGHT: "right"} -xml2align = {"left": LEFT, "center": CENTER, "right": RIGHT} - -align2anchor = {LEFT: "w", CENTER: "center", RIGHT: "e"} - -def sum(seq): - total = 0 - for x in seq: - if x is not None: - total += x - return total - -class Sheet: - - def __init__(self): - self.cells = {} # {(x, y): cell, ...} - self.ns = dict( - cell = self.cellvalue, - cells = self.multicellvalue, - sum = sum, - ) - - def cellvalue(self, x, y): - cell = self.getcell(x, y) - if hasattr(cell, 'recalc'): - return cell.recalc(self.ns) - else: - return cell - - def multicellvalue(self, x1, y1, x2, y2): - if x1 > x2: - x1, x2 = x2, x1 - if y1 > y2: - y1, y2 = y2, y1 - seq = [] - for y in range(y1, y2+1): - for x in range(x1, x2+1): - seq.append(self.cellvalue(x, y)) - return seq - - def getcell(self, x, y): - return self.cells.get((x, y)) - - def setcell(self, x, y, cell): - assert x > 0 and y > 0 - assert isinstance(cell, BaseCell) - self.cells[x, y] = cell - - def clearcell(self, x, y): - try: - del self.cells[x, y] - except KeyError: - pass - - def clearcells(self, x1, y1, x2, y2): - for xy in self.selectcells(x1, y1, x2, y2): - del self.cells[xy] - - def clearrows(self, y1, y2): - self.clearcells(0, y1, sys.maxsize, y2) - - def clearcolumns(self, x1, x2): - self.clearcells(x1, 0, x2, sys.maxsize) - - def selectcells(self, x1, y1, x2, y2): - if x1 > x2: - x1, x2 = x2, x1 - if y1 > y2: - y1, y2 = y2, y1 - return [(x, y) for x, y in self.cells - if x1 <= x <= x2 and y1 <= y <= y2] - - def movecells(self, x1, y1, x2, y2, dx, dy): - if dx == 0 and dy == 0: - return - if x1 > x2: - x1, x2 = x2, x1 - if y1 > y2: - y1, y2 = y2, y1 - assert x1+dx > 0 and y1+dy > 0 - new = {} - for x, y in self.cells: - cell = self.cells[x, y] - if hasattr(cell, 'renumber'): - cell = cell.renumber(x1, y1, x2, y2, dx, dy) - if x1 <= x <= x2 and y1 <= y <= y2: - x += dx - y += dy - new[x, y] = cell - self.cells = new - - def insertrows(self, y, n): - assert n > 0 - self.movecells(0, y, sys.maxsize, sys.maxsize, 0, n) - - def deleterows(self, y1, y2): - if y1 > y2: - y1, y2 = y2, y1 - self.clearrows(y1, y2) - self.movecells(0, y2+1, sys.maxsize, sys.maxsize, 0, y1-y2-1) - - def insertcolumns(self, x, n): - assert n > 0 - self.movecells(x, 0, sys.maxsize, sys.maxsize, n, 0) - - def deletecolumns(self, x1, x2): - if x1 > x2: - x1, x2 = x2, x1 - self.clearcells(x1, x2) - self.movecells(x2+1, 0, sys.maxsize, sys.maxsize, x1-x2-1, 0) - - def getsize(self): - maxx = maxy = 0 - for x, y in self.cells: - maxx = max(maxx, x) - maxy = max(maxy, y) - return maxx, maxy - - def reset(self): - for cell in self.cells.values(): - if hasattr(cell, 'reset'): - cell.reset() - - def recalc(self): - self.reset() - for cell in self.cells.values(): - if hasattr(cell, 'recalc'): - cell.recalc(self.ns) - - def display(self): - maxx, maxy = self.getsize() - width, height = maxx+1, maxy+1 - colwidth = [1] * width - full = {} - # Add column heading labels in row 0 - for x in range(1, width): - full[x, 0] = text, alignment = colnum2name(x), RIGHT - colwidth[x] = max(colwidth[x], len(text)) - # Add row labels in column 0 - for y in range(1, height): - full[0, y] = text, alignment = str(y), RIGHT - colwidth[0] = max(colwidth[0], len(text)) - # Add sheet cells in columns with x>0 and y>0 - for (x, y), cell in self.cells.items(): - if x <= 0 or y <= 0: - continue - if hasattr(cell, 'recalc'): - cell.recalc(self.ns) - if hasattr(cell, 'format'): - text, alignment = cell.format() - assert isinstance(text, str) - assert alignment in (LEFT, CENTER, RIGHT) - else: - text = str(cell) - if isinstance(cell, str): - alignment = LEFT - else: - alignment = RIGHT - full[x, y] = (text, alignment) - colwidth[x] = max(colwidth[x], len(text)) - # Calculate the horizontal separator line (dashes and dots) - sep = "" - for x in range(width): - if sep: - sep += "+" - sep += "-"*colwidth[x] - # Now print The full grid - for y in range(height): - line = "" - for x in range(width): - text, alignment = full.get((x, y)) or ("", LEFT) - text = align2action[alignment](text, colwidth[x]) - if line: - line += '|' - line += text - print(line) - if y == 0: - print(sep) - - def xml(self): - out = [''] - for (x, y), cell in self.cells.items(): - if hasattr(cell, 'xml'): - cellxml = cell.xml() - else: - cellxml = '%s' % escape(cell) - out.append('\n %s\n' % - (y, x, cellxml)) - out.append('') - return '\n'.join(out) - - def save(self, filename): - text = self.xml() - with open(filename, "w", encoding='utf-8') as f: - f.write(text) - if text and not text.endswith('\n'): - f.write('\n') - - def load(self, filename): - with open(filename, 'rb') as f: - SheetParser(self).parsefile(f) - -class SheetParser: - - def __init__(self, sheet): - self.sheet = sheet - - def parsefile(self, f): - parser = expat.ParserCreate() - parser.StartElementHandler = self.startelement - parser.EndElementHandler = self.endelement - parser.CharacterDataHandler = self.data - parser.ParseFile(f) - - def startelement(self, tag, attrs): - method = getattr(self, 'start_'+tag, None) - if method: - method(attrs) - self.texts = [] - - def data(self, text): - self.texts.append(text) - - def endelement(self, tag): - method = getattr(self, 'end_'+tag, None) - if method: - method("".join(self.texts)) - - def start_cell(self, attrs): - self.y = int(attrs.get("row")) - self.x = int(attrs.get("col")) - - def start_value(self, attrs): - self.fmt = attrs.get('format') - self.alignment = xml2align.get(attrs.get('align')) - - start_formula = start_value - - def end_int(self, text): - try: - self.value = int(text) - except (TypeError, ValueError): - self.value = None - - end_long = end_int - - def end_double(self, text): - try: - self.value = float(text) - except (TypeError, ValueError): - self.value = None - - def end_complex(self, text): - try: - self.value = complex(text) - except (TypeError, ValueError): - self.value = None - - def end_string(self, text): - self.value = text - - def end_value(self, text): - if isinstance(self.value, BaseCell): - self.cell = self.value - elif isinstance(self.value, str): - self.cell = StringCell(self.value, - self.fmt or "%s", - self.alignment or LEFT) - else: - self.cell = NumericCell(self.value, - self.fmt or "%s", - self.alignment or RIGHT) - - def end_formula(self, text): - self.cell = FormulaCell(text, - self.fmt or "%s", - self.alignment or RIGHT) - - def end_cell(self, text): - self.sheet.setcell(self.x, self.y, self.cell) - -class BaseCell: - __init__ = None # Must provide - """Abstract base class for sheet cells. - - Subclasses may but needn't provide the following APIs: - - cell.reset() -- prepare for recalculation - cell.recalc(ns) -> value -- recalculate formula - cell.format() -> (value, alignment) -- return formatted value - cell.xml() -> string -- return XML - """ - -class NumericCell(BaseCell): - - def __init__(self, value, fmt="%s", alignment=RIGHT): - assert isinstance(value, (int, float, complex)) - assert alignment in (LEFT, CENTER, RIGHT) - self.value = value - self.fmt = fmt - self.alignment = alignment - - def recalc(self, ns): - return self.value - - def format(self): - try: - text = self.fmt % self.value - except: - text = str(self.value) - return text, self.alignment - - def xml(self): - method = getattr(self, '_xml_' + type(self.value).__name__) - return '%s' % ( - align2xml[self.alignment], - self.fmt, - method()) - - def _xml_int(self): - if -2**31 <= self.value < 2**31: - return '%s' % self.value - else: - return '%s' % self.value - - def _xml_float(self): - return '%r' % self.value - - def _xml_complex(self): - return '%r' % self.value - -class StringCell(BaseCell): - - def __init__(self, text, fmt="%s", alignment=LEFT): - assert isinstance(text, str) - assert alignment in (LEFT, CENTER, RIGHT) - self.text = text - self.fmt = fmt - self.alignment = alignment - - def recalc(self, ns): - return self.text - - def format(self): - return self.text, self.alignment - - def xml(self): - s = '%s' - return s % ( - align2xml[self.alignment], - self.fmt, - escape(self.text)) - -class FormulaCell(BaseCell): - - def __init__(self, formula, fmt="%s", alignment=RIGHT): - assert alignment in (LEFT, CENTER, RIGHT) - self.formula = formula - self.translated = translate(self.formula) - self.fmt = fmt - self.alignment = alignment - self.reset() - - def reset(self): - self.value = None - - def recalc(self, ns): - if self.value is None: - try: - self.value = eval(self.translated, ns) - except: - exc = sys.exc_info()[0] - if hasattr(exc, "__name__"): - self.value = exc.__name__ - else: - self.value = str(exc) - return self.value - - def format(self): - try: - text = self.fmt % self.value - except: - text = str(self.value) - return text, self.alignment - - def xml(self): - return '%s' % ( - align2xml[self.alignment], - self.fmt, - escape(self.formula)) - - def renumber(self, x1, y1, x2, y2, dx, dy): - out = [] - for part in re.split(r'(\w+)', self.formula): - m = re.match('^([A-Z]+)([1-9][0-9]*)$', part) - if m is not None: - sx, sy = m.groups() - x = colname2num(sx) - y = int(sy) - if x1 <= x <= x2 and y1 <= y <= y2: - part = cellname(x+dx, y+dy) - out.append(part) - return FormulaCell("".join(out), self.fmt, self.alignment) - -def translate(formula): - """Translate a formula containing fancy cell names to valid Python code. - - Examples: - B4 -> cell(2, 4) - B4:Z100 -> cells(2, 4, 26, 100) - """ - out = [] - for part in re.split(r"(\w+(?::\w+)?)", formula): - m = re.match(r"^([A-Z]+)([1-9][0-9]*)(?::([A-Z]+)([1-9][0-9]*))?$", part) - if m is None: - out.append(part) - else: - x1, y1, x2, y2 = m.groups() - x1 = colname2num(x1) - if x2 is None: - s = "cell(%s, %s)" % (x1, y1) - else: - x2 = colname2num(x2) - s = "cells(%s, %s, %s, %s)" % (x1, y1, x2, y2) - out.append(s) - return "".join(out) - -def cellname(x, y): - "Translate a cell coordinate to a fancy cell name (e.g. (1, 1)->'A1')." - assert x > 0 # Column 0 has an empty name, so can't use that - return colnum2name(x) + str(y) - -def colname2num(s): - "Translate a column name to number (e.g. 'A'->1, 'Z'->26, 'AA'->27)." - s = s.upper() - n = 0 - for c in s: - assert 'A' <= c <= 'Z' - n = n*26 + ord(c) - ord('A') + 1 - return n - -def colnum2name(n): - "Translate a column number to name (e.g. 1->'A', etc.)." - assert n > 0 - s = "" - while n: - n, m = divmod(n-1, 26) - s = chr(m+ord('A')) + s - return s - -import tkinter as Tk - -class SheetGUI: - - """Beginnings of a GUI for a spreadsheet. - - TO DO: - - clear multiple cells - - Insert, clear, remove rows or columns - - Show new contents while typing - - Scroll bars - - Grow grid when window is grown - - Proper menus - - Undo, redo - - Cut, copy and paste - - Formatting and alignment - """ - - def __init__(self, filename="sheet1.xml", rows=10, columns=5): - """Constructor. - - Load the sheet from the filename argument. - Set up the Tk widget tree. - """ - # Create and load the sheet - self.filename = filename - self.sheet = Sheet() - if os.path.isfile(filename): - self.sheet.load(filename) - # Calculate the needed grid size - maxx, maxy = self.sheet.getsize() - rows = max(rows, maxy) - columns = max(columns, maxx) - # Create the widgets - self.root = Tk.Tk() - self.root.wm_title("Spreadsheet: %s" % self.filename) - self.beacon = Tk.Label(self.root, text="A1", - font=('helvetica', 16, 'bold')) - self.entry = Tk.Entry(self.root) - self.savebutton = Tk.Button(self.root, text="Save", - command=self.save) - self.cellgrid = Tk.Frame(self.root) - # Configure the widget lay-out - self.cellgrid.pack(side="bottom", expand=1, fill="both") - self.beacon.pack(side="left") - self.savebutton.pack(side="right") - self.entry.pack(side="left", expand=1, fill="x") - # Bind some events - self.entry.bind("", self.return_event) - self.entry.bind("", self.shift_return_event) - self.entry.bind("", self.tab_event) - self.entry.bind("", self.shift_tab_event) - self.entry.bind("", self.delete_event) - self.entry.bind("", self.escape_event) - # Now create the cell grid - self.makegrid(rows, columns) - # Select the top-left cell - self.currentxy = None - self.cornerxy = None - self.setcurrent(1, 1) - # Copy the sheet cells to the GUI cells - self.sync() - - def delete_event(self, event): - if self.cornerxy != self.currentxy and self.cornerxy is not None: - self.sheet.clearcells(*(self.currentxy + self.cornerxy)) - else: - self.sheet.clearcell(*self.currentxy) - self.sync() - self.entry.delete(0, 'end') - return "break" - - def escape_event(self, event): - x, y = self.currentxy - self.load_entry(x, y) - - def load_entry(self, x, y): - cell = self.sheet.getcell(x, y) - if cell is None: - text = "" - elif isinstance(cell, FormulaCell): - text = '=' + cell.formula - else: - text, alignment = cell.format() - self.entry.delete(0, 'end') - self.entry.insert(0, text) - self.entry.selection_range(0, 'end') - - def makegrid(self, rows, columns): - """Helper to create the grid of GUI cells. - - The edge (x==0 or y==0) is filled with labels; the rest is real cells. - """ - self.rows = rows - self.columns = columns - self.gridcells = {} - # Create the top left corner cell (which selects all) - cell = Tk.Label(self.cellgrid, relief='raised') - cell.grid_configure(column=0, row=0, sticky='NSWE') - cell.bind("", self.selectall) - # Create the top row of labels, and configure the grid columns - for x in range(1, columns+1): - self.cellgrid.grid_columnconfigure(x, minsize=64) - cell = Tk.Label(self.cellgrid, text=colnum2name(x), relief='raised') - cell.grid_configure(column=x, row=0, sticky='WE') - self.gridcells[x, 0] = cell - cell.__x = x - cell.__y = 0 - cell.bind("", self.selectcolumn) - cell.bind("", self.extendcolumn) - cell.bind("", self.extendcolumn) - cell.bind("", self.extendcolumn) - # Create the leftmost column of labels - for y in range(1, rows+1): - cell = Tk.Label(self.cellgrid, text=str(y), relief='raised') - cell.grid_configure(column=0, row=y, sticky='WE') - self.gridcells[0, y] = cell - cell.__x = 0 - cell.__y = y - cell.bind("", self.selectrow) - cell.bind("", self.extendrow) - cell.bind("", self.extendrow) - cell.bind("", self.extendrow) - # Create the real cells - for x in range(1, columns+1): - for y in range(1, rows+1): - cell = Tk.Label(self.cellgrid, relief='sunken', - bg='white', fg='black') - cell.grid_configure(column=x, row=y, sticky='NSWE') - self.gridcells[x, y] = cell - cell.__x = x - cell.__y = y - # Bind mouse events - cell.bind("", self.press) - cell.bind("", self.motion) - cell.bind("", self.release) - cell.bind("", self.release) - - def selectall(self, event): - self.setcurrent(1, 1) - self.setcorner(sys.maxsize, sys.maxsize) - - def selectcolumn(self, event): - x, y = self.whichxy(event) - self.setcurrent(x, 1) - self.setcorner(x, sys.maxsize) - - def extendcolumn(self, event): - x, y = self.whichxy(event) - if x > 0: - self.setcurrent(self.currentxy[0], 1) - self.setcorner(x, sys.maxsize) - - def selectrow(self, event): - x, y = self.whichxy(event) - self.setcurrent(1, y) - self.setcorner(sys.maxsize, y) - - def extendrow(self, event): - x, y = self.whichxy(event) - if y > 0: - self.setcurrent(1, self.currentxy[1]) - self.setcorner(sys.maxsize, y) - - def press(self, event): - x, y = self.whichxy(event) - if x > 0 and y > 0: - self.setcurrent(x, y) - - def motion(self, event): - x, y = self.whichxy(event) - if x > 0 and y > 0: - self.setcorner(x, y) - - release = motion - - def whichxy(self, event): - w = self.cellgrid.winfo_containing(event.x_root, event.y_root) - if w is not None and isinstance(w, Tk.Label): - try: - return w.__x, w.__y - except AttributeError: - pass - return 0, 0 - - def save(self): - self.sheet.save(self.filename) - - def setcurrent(self, x, y): - "Make (x, y) the current cell." - if self.currentxy is not None: - self.change_cell() - self.clearfocus() - self.beacon['text'] = cellname(x, y) - self.load_entry(x, y) - self.entry.focus_set() - self.currentxy = x, y - self.cornerxy = None - gridcell = self.gridcells.get(self.currentxy) - if gridcell is not None: - gridcell['bg'] = 'yellow' - - def setcorner(self, x, y): - if self.currentxy is None or self.currentxy == (x, y): - self.setcurrent(x, y) - return - self.clearfocus() - self.cornerxy = x, y - x1, y1 = self.currentxy - x2, y2 = self.cornerxy or self.currentxy - if x1 > x2: - x1, x2 = x2, x1 - if y1 > y2: - y1, y2 = y2, y1 - for (x, y), cell in self.gridcells.items(): - if x1 <= x <= x2 and y1 <= y <= y2: - cell['bg'] = 'lightBlue' - gridcell = self.gridcells.get(self.currentxy) - if gridcell is not None: - gridcell['bg'] = 'yellow' - self.setbeacon(x1, y1, x2, y2) - - def setbeacon(self, x1, y1, x2, y2): - if x1 == y1 == 1 and x2 == y2 == sys.maxsize: - name = ":" - elif (x1, x2) == (1, sys.maxsize): - if y1 == y2: - name = "%d" % y1 - else: - name = "%d:%d" % (y1, y2) - elif (y1, y2) == (1, sys.maxsize): - if x1 == x2: - name = "%s" % colnum2name(x1) - else: - name = "%s:%s" % (colnum2name(x1), colnum2name(x2)) - else: - name1 = cellname(*self.currentxy) - name2 = cellname(*self.cornerxy) - name = "%s:%s" % (name1, name2) - self.beacon['text'] = name - - - def clearfocus(self): - if self.currentxy is not None: - x1, y1 = self.currentxy - x2, y2 = self.cornerxy or self.currentxy - if x1 > x2: - x1, x2 = x2, x1 - if y1 > y2: - y1, y2 = y2, y1 - for (x, y), cell in self.gridcells.items(): - if x1 <= x <= x2 and y1 <= y <= y2: - cell['bg'] = 'white' - - def return_event(self, event): - "Callback for the Return key." - self.change_cell() - x, y = self.currentxy - self.setcurrent(x, y+1) - return "break" - - def shift_return_event(self, event): - "Callback for the Return key with Shift modifier." - self.change_cell() - x, y = self.currentxy - self.setcurrent(x, max(1, y-1)) - return "break" - - def tab_event(self, event): - "Callback for the Tab key." - self.change_cell() - x, y = self.currentxy - self.setcurrent(x+1, y) - return "break" - - def shift_tab_event(self, event): - "Callback for the Tab key with Shift modifier." - self.change_cell() - x, y = self.currentxy - self.setcurrent(max(1, x-1), y) - return "break" - - def change_cell(self): - "Set the current cell from the entry widget." - x, y = self.currentxy - text = self.entry.get() - cell = None - if text.startswith('='): - cell = FormulaCell(text[1:]) - else: - for cls in int, float, complex: - try: - value = cls(text) - except (TypeError, ValueError): - continue - else: - cell = NumericCell(value) - break - if cell is None and text: - cell = StringCell(text) - if cell is None: - self.sheet.clearcell(x, y) - else: - self.sheet.setcell(x, y, cell) - self.sync() - - def sync(self): - "Fill the GUI cells from the sheet cells." - self.sheet.recalc() - for (x, y), gridcell in self.gridcells.items(): - if x == 0 or y == 0: - continue - cell = self.sheet.getcell(x, y) - if cell is None: - gridcell['text'] = "" - else: - if hasattr(cell, 'format'): - text, alignment = cell.format() - else: - text, alignment = str(cell), LEFT - gridcell['text'] = text - gridcell['anchor'] = align2anchor[alignment] - - -def test_basic(): - "Basic non-gui self-test." - a = Sheet() - for x in range(1, 11): - for y in range(1, 11): - if x == 1: - cell = NumericCell(y) - elif y == 1: - cell = NumericCell(x) - else: - c1 = cellname(x, 1) - c2 = cellname(1, y) - formula = "%s*%s" % (c1, c2) - cell = FormulaCell(formula) - a.setcell(x, y, cell) -## if os.path.isfile("sheet1.xml"): -## print "Loading from sheet1.xml" -## a.load("sheet1.xml") - a.display() - a.save("sheet1.xml") - -def test_gui(): - "GUI test." - if sys.argv[1:]: - filename = sys.argv[1] - else: - filename = "sheet1.xml" - g = SheetGUI(filename) - g.root.mainloop() - -if __name__ == '__main__': - #test_basic() - test_gui() diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index ffb18137..33bf5ac8 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -1566,7 +1566,7 @@ class Frame(object): return False if (caller.startswith('cfunction_vectorcall_') or - caller == 'cfunction_call_varargs'): + caller == 'cfunction_call'): arg_name = 'func' # Within that frame: # "func" is the local containing the PyObject* of the diff --git a/Tools/msi/README.txt b/Tools/msi/README.txt index f5656b97..82635f3d 100644 --- a/Tools/msi/README.txt +++ b/Tools/msi/README.txt @@ -11,7 +11,7 @@ Tools/msi/buildrelease.bat script and environment variables: set PYTHON= set SPHINXBUILD= - set PATH=; + set PATH=; ;%PATH% buildrelease.bat [-x86] [-x64] [-D] [-B] @@ -106,7 +106,7 @@ Tools/msi/buildrelease.bat script: set PYTHON= set SPHINXBUILD= - set PATH=; + set PATH=; ;%PATH% buildrelease.bat [-x86] [-x64] [-D] [-B] @@ -131,7 +131,7 @@ installer. Official releases of Python must be signed. Ensure %PYTHON% and %SPHINXBUILD% are set when passing this option. You may also set %HTMLHELP% to the Html Help Compiler (hhc.exe), or put HHC -on your PATH or in externals/. You will also need Mercurial (hg.exe) on +on your PATH or in externals/. You will also need Git (git.exe) on your PATH. If WiX is not found on your system, it will be automatically downloaded diff --git a/Tools/msi/bundle/Default.thm b/Tools/msi/bundle/Default.thm index 1c0bd08e..f5ba43d8 100644 --- a/Tools/msi/bundle/Default.thm +++ b/Tools/msi/bundle/Default.thm @@ -116,9 +116,9 @@ #(loc.SuccessHeader) - + - + #(loc.SuccessRestartText) diff --git a/Tools/msi/bundle/Default.wxl b/Tools/msi/bundle/Default.wxl index 43506d61..791ce6ea 100644 --- a/Tools/msi/bundle/Default.wxl +++ b/Tools/msi/bundle/Default.wxl @@ -89,7 +89,7 @@ Select Customize to review current options. Install &launcher for all users (recommended) &Precompile standard library Download debugging &symbols - Download debu&g binaries (requires VS 2015 or later) + Download debu&g binaries (requires VS 2017 or later) [ActionLikeInstallation] Progress [ActionLikeInstalling]: @@ -105,11 +105,9 @@ Select Customize to review current options. &Launch You may need to restart your computer to finish updating files. &Restart - Special thanks to Mark Hammond, without whose years of freely shared Windows expertise, Python for Windows would still be Python for DOS. + New to Python? Start with the <a href="https://docs.python.org/[ShortVersion]/tutorial/index.html">online tutorial</a> and <a href="https://docs.python.org/[ShortVersion]/index.html">documentation</a>. At your terminal, type "py" to launch Python, or search for Python in your Start menu. -New to Python? Start with the <a href="https://docs.python.org/[ShortVersion]/tutorial/index.html">online tutorial</a> and <a href="https://docs.python.org/[ShortVersion]/index.html">documentation</a>. - -See <a href="https://docs.python.org/[ShortVersion]/whatsnew/[ShortVersion].html">what's new</a> in this release. +See <a href="https://docs.python.org/[ShortVersion]/whatsnew/[ShortVersion].html">what's new</a> in this release, or find more info about <a href="https://docs.python.org/[ShortVersion]/using/windows.html">using Python on Windows</a>. Thank you for using [WixBundleName]. Thank you for using [WixBundleName]. @@ -123,26 +121,9 @@ Feel free to email <a href="mailto:python-list@python.org">python-list@pyt &Restart Unable to install [WixBundleName] due to an existing install. Use Programs and Features to modify, repair or remove [WixBundleName]. - Windows 7 Service Pack 1 and all applicable updates are required to install [WixBundleName]. - -Please <a href="https://www.bing.com/search?q=how%20to%20install%20windows%207%20service%20pack%201">update your machine</a> and then restart the installation. - Windows Vista Service Pack 2 and all applicable updates are required to install [WixBundleName]. - -Please <a href="https://www.bing.com/search?q=how%20to%20install%20windows%20vista%20service%20pack%202">update your machine</a> and then restart the installation. - Windows Vista or later is required to install and use [WixBundleName]. - -Visit <a href="https://www.python.org/">python.org</a> to download Python 3.4. - - Windows Server 2008 R2 Service Pack 1 and all applicable updates are required to install [WixBundleName]. - -Please <a href="https://www.bing.com/search?q=how%20to%20install%20windows%20server%202008%20r2%20service%20pack%201">update your machine</a> and then restart the installation. - Windows Server 2008 Service Pack 2 and all applicable updates are required to install [WixBundleName]. - -Please <a href="https://www.bing.com/search?q=how%20to%20install%20windows%20server%202008%20service%20pack%202">update your machine</a> and then restart the installation. - Windows Server 2008 SP2 or later is required to install and use [WixBundleName]. - -Visit <a href="https://www.python.org/">python.org</a> to download Python 3.4. + At least Windows 8.1 or Windows Server 2012 are required to install [WixBundleName] +Visit <a href="https://www.python.org/">python.org</a> to download an earlier version of Python. Disable path length limit Changes your machine configuration to allow programs, including Python, to bypass the 260 character "MAX_PATH" limitation. diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp index fbdf7b64..3c54e401 100644 --- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp +++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp @@ -3011,65 +3011,35 @@ private: BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows Server 2012 or later"); return; } else if (IsWindowsVersionOrGreater(6, 1, 1)) { - HMODULE hKernel32 = GetModuleHandleW(L"kernel32"); - if (hKernel32 && !GetProcAddress(hKernel32, "AddDllDirectory")) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2008 R2 without KB2533623"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533623 update is required to continue."); - /* The "MissingSP1" error also specifies updates are required */ - LocGetString(_wixLoc, L"#(loc.FailureWS2K8R2MissingSP1)", &pLocString); - } else { - BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows Server 2008 R2 or later"); - return; - } + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Detected Windows Server 2008 R2"); } else if (IsWindowsVersionOrGreater(6, 1, 0)) { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2008 R2"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Service Pack 1 is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureWS2K8R2MissingSP1)", &pLocString); - } else if (IsWindowsVersionOrGreater(6, 0, 2)) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Target OS is Windows Server 2008 SP2 or later"); - return; } else if (IsWindowsVersionOrGreater(6, 0, 0)) { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2008"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Service Pack 2 is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureWS2K8MissingSP2)", &pLocString); } else { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2003 or earlier"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Windows Server 2008 SP2 or later is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureWS2K3OrEarlier)", &pLocString); } + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Windows Server 2012 or later is required to continue installation"); } else { - if (IsWindows8OrGreater()) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 8 or later"); + if (IsWindows10OrGreater()) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 10 or later"); return; - } else if (IsWindows7SP1OrGreater()) { - HMODULE hKernel32 = GetModuleHandleW(L"kernel32"); - if (hKernel32 && !GetProcAddress(hKernel32, "AddDllDirectory")) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7 SP1 without KB2533623"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533623 update is required to continue."); - /* The "MissingSP1" error also specifies updates are required */ - LocGetString(_wixLoc, L"#(loc.FailureWin7MissingSP1)", &pLocString); - } else { - BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 7 SP1 or later"); - return; - } - } else if (IsWindows7OrGreater()) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7 RTM"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Service Pack 1 is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureWin7MissingSP1)", &pLocString); - } else if (IsWindowsVistaSP2OrGreater()) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Target OS is Windows Vista SP2"); + } else if (IsWindows8Point1OrGreater()) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 8.1"); return; + } else if (IsWindows8OrGreater()) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 8"); + } else if (IsWindows7OrGreater()) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7"); } else if (IsWindowsVistaOrGreater()) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Vista RTM or SP1"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Service Pack 2 is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureVistaMissingSP2)", &pLocString); + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Vista"); } else { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows XP or earlier"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Windows Vista SP2 or later is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureXPOrEarlier)", &pLocString); } + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Windows 8.1 or later is required to continue installation"); } + LocGetString(_wixLoc, L"#(loc.FailureOldOS)", &pLocString); if (pLocString && pLocString->wzText) { BalFormatString(pLocString->wzText, &_failedMessage); } diff --git a/Tools/msi/bundle/packagegroups/crt.wxs b/Tools/msi/bundle/packagegroups/crt.wxs index 61b756fc..f931da14 100644 --- a/Tools/msi/bundle/packagegroups/crt.wxs +++ b/Tools/msi/bundle/packagegroups/crt.wxs @@ -4,7 +4,7 @@ @@ -12,7 +12,7 @@ diff --git a/Tools/msi/lib/lib_files.wxs b/Tools/msi/lib/lib_files.wxs index b4623725..037fc38f 100644 --- a/Tools/msi/lib/lib_files.wxs +++ b/Tools/msi/lib/lib_files.wxs @@ -1,6 +1,6 @@  - + diff --git a/Tools/nuget/python.nuspec b/Tools/nuget/python.nuspec index 2da5f203..8f98e808 100644 --- a/Tools/nuget/python.nuspec +++ b/Tools/nuget/python.nuspec @@ -13,6 +13,6 @@ - + diff --git a/Tools/nuget/pythonarm32.nuspec b/Tools/nuget/pythonarm32.nuspec index 2d197931..273d79a0 100644 --- a/Tools/nuget/pythonarm32.nuspec +++ b/Tools/nuget/pythonarm32.nuspec @@ -14,7 +14,6 @@ - - + diff --git a/Tools/nuget/pythondaily.nuspec b/Tools/nuget/pythondaily.nuspec index 7df1983f..5cf55806 100644 --- a/Tools/nuget/pythondaily.nuspec +++ b/Tools/nuget/pythondaily.nuspec @@ -13,7 +13,6 @@ - - + diff --git a/Tools/nuget/pythonx86.nuspec b/Tools/nuget/pythonx86.nuspec index ea878ba0..27ef67e7 100644 --- a/Tools/nuget/pythonx86.nuspec +++ b/Tools/nuget/pythonx86.nuspec @@ -13,7 +13,6 @@ - - + diff --git a/Tools/parser/unparse.py b/Tools/parser/unparse.py deleted file mode 100644 index 0642b84d..00000000 --- a/Tools/parser/unparse.py +++ /dev/null @@ -1,719 +0,0 @@ -"Usage: unparse.py " -import sys -import ast -import tokenize -import io -import os - -# Large float and imaginary literals get turned into infinities in the AST. -# We unparse those infinities to INFSTR. -INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1) - -def interleave(inter, f, seq): - """Call f on each item in seq, calling inter() in between. - """ - seq = iter(seq) - try: - f(next(seq)) - except StopIteration: - pass - else: - for x in seq: - inter() - f(x) - -class Unparser: - """Methods in this class recursively traverse an AST and - output source code for the abstract syntax; original formatting - is disregarded. """ - - def __init__(self, tree, file = sys.stdout): - """Unparser(tree, file=sys.stdout) -> None. - Print the source for tree to file.""" - self.f = file - self._indent = 0 - self.dispatch(tree) - print("", file=self.f) - self.f.flush() - - def fill(self, text = ""): - "Indent a piece of text, according to the current indentation level" - self.f.write("\n"+" "*self._indent + text) - - def write(self, text): - "Append a piece of text to the current line." - self.f.write(text) - - def enter(self): - "Print ':', and increase the indentation." - self.write(":") - self._indent += 1 - - def leave(self): - "Decrease the indentation level." - self._indent -= 1 - - def dispatch(self, tree): - "Dispatcher function, dispatching tree type T to method _T." - if isinstance(tree, list): - for t in tree: - self.dispatch(t) - return - meth = getattr(self, "_"+tree.__class__.__name__) - meth(tree) - - - ############### Unparsing methods ###################### - # There should be one method per concrete grammar type # - # Constructors should be grouped by sum type. Ideally, # - # this would follow the order in the grammar, but # - # currently doesn't. # - ######################################################## - - def _Module(self, tree): - for stmt in tree.body: - self.dispatch(stmt) - - # stmt - def _Expr(self, tree): - self.fill() - self.dispatch(tree.value) - - def _NamedExpr(self, tree): - self.write("(") - self.dispatch(tree.target) - self.write(" := ") - self.dispatch(tree.value) - self.write(")") - - def _Import(self, t): - self.fill("import ") - interleave(lambda: self.write(", "), self.dispatch, t.names) - - def _ImportFrom(self, t): - self.fill("from ") - self.write("." * t.level) - if t.module: - self.write(t.module) - self.write(" import ") - interleave(lambda: self.write(", "), self.dispatch, t.names) - - def _Assign(self, t): - self.fill() - for target in t.targets: - self.dispatch(target) - self.write(" = ") - self.dispatch(t.value) - - def _AugAssign(self, t): - self.fill() - self.dispatch(t.target) - self.write(" "+self.binop[t.op.__class__.__name__]+"= ") - self.dispatch(t.value) - - def _AnnAssign(self, t): - self.fill() - if not t.simple and isinstance(t.target, ast.Name): - self.write('(') - self.dispatch(t.target) - if not t.simple and isinstance(t.target, ast.Name): - self.write(')') - self.write(": ") - self.dispatch(t.annotation) - if t.value: - self.write(" = ") - self.dispatch(t.value) - - def _Return(self, t): - self.fill("return") - if t.value: - self.write(" ") - self.dispatch(t.value) - - def _Pass(self, t): - self.fill("pass") - - def _Break(self, t): - self.fill("break") - - def _Continue(self, t): - self.fill("continue") - - def _Delete(self, t): - self.fill("del ") - interleave(lambda: self.write(", "), self.dispatch, t.targets) - - def _Assert(self, t): - self.fill("assert ") - self.dispatch(t.test) - if t.msg: - self.write(", ") - self.dispatch(t.msg) - - def _Global(self, t): - self.fill("global ") - interleave(lambda: self.write(", "), self.write, t.names) - - def _Nonlocal(self, t): - self.fill("nonlocal ") - interleave(lambda: self.write(", "), self.write, t.names) - - def _Await(self, t): - self.write("(") - self.write("await") - if t.value: - self.write(" ") - self.dispatch(t.value) - self.write(")") - - def _Yield(self, t): - self.write("(") - self.write("yield") - if t.value: - self.write(" ") - self.dispatch(t.value) - self.write(")") - - def _YieldFrom(self, t): - self.write("(") - self.write("yield from") - if t.value: - self.write(" ") - self.dispatch(t.value) - self.write(")") - - def _Raise(self, t): - self.fill("raise") - if not t.exc: - assert not t.cause - return - self.write(" ") - self.dispatch(t.exc) - if t.cause: - self.write(" from ") - self.dispatch(t.cause) - - def _Try(self, t): - self.fill("try") - self.enter() - self.dispatch(t.body) - self.leave() - for ex in t.handlers: - self.dispatch(ex) - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - if t.finalbody: - self.fill("finally") - self.enter() - self.dispatch(t.finalbody) - self.leave() - - def _ExceptHandler(self, t): - self.fill("except") - if t.type: - self.write(" ") - self.dispatch(t.type) - if t.name: - self.write(" as ") - self.write(t.name) - self.enter() - self.dispatch(t.body) - self.leave() - - def _ClassDef(self, t): - self.write("\n") - for deco in t.decorator_list: - self.fill("@") - self.dispatch(deco) - self.fill("class "+t.name) - self.write("(") - comma = False - for e in t.bases: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - for e in t.keywords: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - self.write(")") - - self.enter() - self.dispatch(t.body) - self.leave() - - def _FunctionDef(self, t): - self.__FunctionDef_helper(t, "def") - - def _AsyncFunctionDef(self, t): - self.__FunctionDef_helper(t, "async def") - - def __FunctionDef_helper(self, t, fill_suffix): - self.write("\n") - for deco in t.decorator_list: - self.fill("@") - self.dispatch(deco) - def_str = fill_suffix+" "+t.name + "(" - self.fill(def_str) - self.dispatch(t.args) - self.write(")") - if t.returns: - self.write(" -> ") - self.dispatch(t.returns) - self.enter() - self.dispatch(t.body) - self.leave() - - def _For(self, t): - self.__For_helper("for ", t) - - def _AsyncFor(self, t): - self.__For_helper("async for ", t) - - def __For_helper(self, fill, t): - self.fill(fill) - self.dispatch(t.target) - self.write(" in ") - self.dispatch(t.iter) - self.enter() - self.dispatch(t.body) - self.leave() - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - - def _If(self, t): - self.fill("if ") - self.dispatch(t.test) - self.enter() - self.dispatch(t.body) - self.leave() - # collapse nested ifs into equivalent elifs. - while (t.orelse and len(t.orelse) == 1 and - isinstance(t.orelse[0], ast.If)): - t = t.orelse[0] - self.fill("elif ") - self.dispatch(t.test) - self.enter() - self.dispatch(t.body) - self.leave() - # final else - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - - def _While(self, t): - self.fill("while ") - self.dispatch(t.test) - self.enter() - self.dispatch(t.body) - self.leave() - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - - def _With(self, t): - self.fill("with ") - interleave(lambda: self.write(", "), self.dispatch, t.items) - self.enter() - self.dispatch(t.body) - self.leave() - - def _AsyncWith(self, t): - self.fill("async with ") - interleave(lambda: self.write(", "), self.dispatch, t.items) - self.enter() - self.dispatch(t.body) - self.leave() - - # expr - def _JoinedStr(self, t): - self.write("f") - string = io.StringIO() - self._fstring_JoinedStr(t, string.write) - self.write(repr(string.getvalue())) - - def _FormattedValue(self, t): - self.write("f") - string = io.StringIO() - self._fstring_FormattedValue(t, string.write) - self.write(repr(string.getvalue())) - - def _fstring_JoinedStr(self, t, write): - for value in t.values: - meth = getattr(self, "_fstring_" + type(value).__name__) - meth(value, write) - - def _fstring_Constant(self, t, write): - assert isinstance(t.value, str) - value = t.value.replace("{", "{{").replace("}", "}}") - write(value) - - def _fstring_FormattedValue(self, t, write): - write("{") - expr = io.StringIO() - Unparser(t.value, expr) - expr = expr.getvalue().rstrip("\n") - if expr.startswith("{"): - write(" ") # Separate pair of opening brackets as "{ {" - write(expr) - if t.conversion != -1: - conversion = chr(t.conversion) - assert conversion in "sra" - write(f"!{conversion}") - if t.format_spec: - write(":") - meth = getattr(self, "_fstring_" + type(t.format_spec).__name__) - meth(t.format_spec, write) - write("}") - - def _Name(self, t): - self.write(t.id) - - def _write_constant(self, value): - if isinstance(value, (float, complex)): - # Substitute overflowing decimal literal for AST infinities. - self.write(repr(value).replace("inf", INFSTR)) - else: - self.write(repr(value)) - - def _Constant(self, t): - value = t.value - if isinstance(value, tuple): - self.write("(") - if len(value) == 1: - self._write_constant(value[0]) - self.write(",") - else: - interleave(lambda: self.write(", "), self._write_constant, value) - self.write(")") - elif value is ...: - self.write("...") - else: - if t.kind == "u": - self.write("u") - self._write_constant(t.value) - - def _List(self, t): - self.write("[") - interleave(lambda: self.write(", "), self.dispatch, t.elts) - self.write("]") - - def _ListComp(self, t): - self.write("[") - self.dispatch(t.elt) - for gen in t.generators: - self.dispatch(gen) - self.write("]") - - def _GeneratorExp(self, t): - self.write("(") - self.dispatch(t.elt) - for gen in t.generators: - self.dispatch(gen) - self.write(")") - - def _SetComp(self, t): - self.write("{") - self.dispatch(t.elt) - for gen in t.generators: - self.dispatch(gen) - self.write("}") - - def _DictComp(self, t): - self.write("{") - self.dispatch(t.key) - self.write(": ") - self.dispatch(t.value) - for gen in t.generators: - self.dispatch(gen) - self.write("}") - - def _comprehension(self, t): - if t.is_async: - self.write(" async for ") - else: - self.write(" for ") - self.dispatch(t.target) - self.write(" in ") - self.dispatch(t.iter) - for if_clause in t.ifs: - self.write(" if ") - self.dispatch(if_clause) - - def _IfExp(self, t): - self.write("(") - self.dispatch(t.body) - self.write(" if ") - self.dispatch(t.test) - self.write(" else ") - self.dispatch(t.orelse) - self.write(")") - - def _Set(self, t): - assert(t.elts) # should be at least one element - self.write("{") - interleave(lambda: self.write(", "), self.dispatch, t.elts) - self.write("}") - - def _Dict(self, t): - self.write("{") - def write_key_value_pair(k, v): - self.dispatch(k) - self.write(": ") - self.dispatch(v) - - def write_item(item): - k, v = item - if k is None: - # for dictionary unpacking operator in dicts {**{'y': 2}} - # see PEP 448 for details - self.write("**") - self.dispatch(v) - else: - write_key_value_pair(k, v) - interleave(lambda: self.write(", "), write_item, zip(t.keys, t.values)) - self.write("}") - - def _Tuple(self, t): - self.write("(") - if len(t.elts) == 1: - elt = t.elts[0] - self.dispatch(elt) - self.write(",") - else: - interleave(lambda: self.write(", "), self.dispatch, t.elts) - self.write(")") - - unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"} - def _UnaryOp(self, t): - self.write("(") - self.write(self.unop[t.op.__class__.__name__]) - self.write(" ") - self.dispatch(t.operand) - self.write(")") - - binop = { "Add":"+", "Sub":"-", "Mult":"*", "MatMult":"@", "Div":"/", "Mod":"%", - "LShift":"<<", "RShift":">>", "BitOr":"|", "BitXor":"^", "BitAnd":"&", - "FloorDiv":"//", "Pow": "**"} - def _BinOp(self, t): - self.write("(") - self.dispatch(t.left) - self.write(" " + self.binop[t.op.__class__.__name__] + " ") - self.dispatch(t.right) - self.write(")") - - cmpops = {"Eq":"==", "NotEq":"!=", "Lt":"<", "LtE":"<=", "Gt":">", "GtE":">=", - "Is":"is", "IsNot":"is not", "In":"in", "NotIn":"not in"} - def _Compare(self, t): - self.write("(") - self.dispatch(t.left) - for o, e in zip(t.ops, t.comparators): - self.write(" " + self.cmpops[o.__class__.__name__] + " ") - self.dispatch(e) - self.write(")") - - boolops = {ast.And: 'and', ast.Or: 'or'} - def _BoolOp(self, t): - self.write("(") - s = " %s " % self.boolops[t.op.__class__] - interleave(lambda: self.write(s), self.dispatch, t.values) - self.write(")") - - def _Attribute(self,t): - self.dispatch(t.value) - # Special case: 3.__abs__() is a syntax error, so if t.value - # is an integer literal then we need to either parenthesize - # it or add an extra space to get 3 .__abs__(). - if isinstance(t.value, ast.Constant) and isinstance(t.value.value, int): - self.write(" ") - self.write(".") - self.write(t.attr) - - def _Call(self, t): - self.dispatch(t.func) - self.write("(") - comma = False - for e in t.args: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - for e in t.keywords: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - self.write(")") - - def _Subscript(self, t): - self.dispatch(t.value) - self.write("[") - if (isinstance(t.slice, ast.Index) - and isinstance(t.slice.value, ast.Tuple) - and t.slice.value.elts): - if len(t.slice.value.elts) == 1: - elt = t.slice.value.elts[0] - self.dispatch(elt) - self.write(",") - else: - interleave(lambda: self.write(", "), self.dispatch, t.slice.value.elts) - else: - self.dispatch(t.slice) - self.write("]") - - def _Starred(self, t): - self.write("*") - self.dispatch(t.value) - - # slice - def _Ellipsis(self, t): - self.write("...") - - def _Index(self, t): - self.dispatch(t.value) - - def _Slice(self, t): - if t.lower: - self.dispatch(t.lower) - self.write(":") - if t.upper: - self.dispatch(t.upper) - if t.step: - self.write(":") - self.dispatch(t.step) - - def _ExtSlice(self, t): - if len(t.dims) == 1: - elt = t.dims[0] - self.dispatch(elt) - self.write(",") - else: - interleave(lambda: self.write(', '), self.dispatch, t.dims) - - # argument - def _arg(self, t): - self.write(t.arg) - if t.annotation: - self.write(": ") - self.dispatch(t.annotation) - - # others - def _arguments(self, t): - first = True - # normal arguments - all_args = t.posonlyargs + t.args - defaults = [None] * (len(all_args) - len(t.defaults)) + t.defaults - for index, elements in enumerate(zip(all_args, defaults), 1): - a, d = elements - if first:first = False - else: self.write(", ") - self.dispatch(a) - if d: - self.write("=") - self.dispatch(d) - if index == len(t.posonlyargs): - self.write(", /") - - # varargs, or bare '*' if no varargs but keyword-only arguments present - if t.vararg or t.kwonlyargs: - if first:first = False - else: self.write(", ") - self.write("*") - if t.vararg: - self.write(t.vararg.arg) - if t.vararg.annotation: - self.write(": ") - self.dispatch(t.vararg.annotation) - - # keyword-only arguments - if t.kwonlyargs: - for a, d in zip(t.kwonlyargs, t.kw_defaults): - if first:first = False - else: self.write(", ") - self.dispatch(a), - if d: - self.write("=") - self.dispatch(d) - - # kwargs - if t.kwarg: - if first:first = False - else: self.write(", ") - self.write("**"+t.kwarg.arg) - if t.kwarg.annotation: - self.write(": ") - self.dispatch(t.kwarg.annotation) - - def _keyword(self, t): - if t.arg is None: - self.write("**") - else: - self.write(t.arg) - self.write("=") - self.dispatch(t.value) - - def _Lambda(self, t): - self.write("(") - self.write("lambda ") - self.dispatch(t.args) - self.write(": ") - self.dispatch(t.body) - self.write(")") - - def _alias(self, t): - self.write(t.name) - if t.asname: - self.write(" as "+t.asname) - - def _withitem(self, t): - self.dispatch(t.context_expr) - if t.optional_vars: - self.write(" as ") - self.dispatch(t.optional_vars) - -def roundtrip(filename, output=sys.stdout): - with open(filename, "rb") as pyfile: - encoding = tokenize.detect_encoding(pyfile.readline)[0] - with open(filename, "r", encoding=encoding) as pyfile: - source = pyfile.read() - tree = compile(source, filename, "exec", ast.PyCF_ONLY_AST) - Unparser(tree, output) - - - -def testdir(a): - try: - names = [n for n in os.listdir(a) if n.endswith('.py')] - except OSError: - print("Directory not readable: %s" % a, file=sys.stderr) - else: - for n in names: - fullname = os.path.join(a, n) - if os.path.isfile(fullname): - output = io.StringIO() - print('Testing %s' % fullname) - try: - roundtrip(fullname, output) - except Exception as e: - print(' Failed to compile, exception is %s' % repr(e)) - elif os.path.isdir(fullname): - testdir(fullname) - -def main(args): - if args[0] == '--testdir': - for a in args[1:]: - testdir(a) - else: - for a in args: - roundtrip(a) - -if __name__=='__main__': - main(sys.argv[1:]) diff --git a/Tools/peg_generator/.clang-format b/Tools/peg_generator/.clang-format new file mode 100644 index 00000000..b2bb93db --- /dev/null +++ b/Tools/peg_generator/.clang-format @@ -0,0 +1,17 @@ +# A clang-format style that approximates Python's PEP 7 +BasedOnStyle: Google +AlwaysBreakAfterReturnType: All +AllowShortIfStatementsOnASingleLine: false +AlignAfterOpenBracket: Align +BreakBeforeBraces: Stroustrup +ColumnLimit: 95 +DerivePointerAlignment: false +IndentWidth: 4 +Language: Cpp +PointerAlignment: Right +ReflowComments: true +SpaceBeforeParens: ControlStatements +SpacesInParentheses: false +TabWidth: 4 +UseTab: Never +SortIncludes: false diff --git a/Tools/peg_generator/.gitignore b/Tools/peg_generator/.gitignore new file mode 100644 index 00000000..f25e5419 --- /dev/null +++ b/Tools/peg_generator/.gitignore @@ -0,0 +1,4 @@ +peg_extension/parse.c +data/xxl.py +venv/ +@data diff --git a/Tools/peg_generator/Makefile b/Tools/peg_generator/Makefile new file mode 100644 index 00000000..fb727c04 --- /dev/null +++ b/Tools/peg_generator/Makefile @@ -0,0 +1,115 @@ +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Linux) + PYTHON ?= ../../python +endif +ifeq ($(UNAME_S),Darwin) + PYTHON ?= ../../python.exe +endif +VENVDIR ?= ./venv +VENVPYTHON ?= $(VENVDIR)/bin/python +CPYTHON ?= ../../Lib +MYPY ?= mypy + +GRAMMAR = ../../Grammar/python.gram +TOKENS = ../../Grammar/Tokens +TESTFILE = data/cprog.py +TIMEFILE = data/xxl.py +TESTDIR = . +TESTFLAGS = --short + +data/xxl.py: + $(PYTHON) -m zipfile -e data/xxl.zip data + +build: peg_extension/parse.c + +peg_extension/parse.c: $(GRAMMAR) $(TOKENS) pegen/*.py peg_extension/peg_extension.c ../../Parser/pegen/pegen.c ../../Parser/pegen/parse_string.c ../../Parser/pegen/*.h pegen/grammar_parser.py + $(PYTHON) -m pegen -q c $(GRAMMAR) $(TOKENS) -o peg_extension/parse.c --compile-extension + +clean: + -rm -f peg_extension/*.o peg_extension/*.so peg_extension/parse.c + -rm -f data/xxl.py + -rm -rf $(VENVDIR) + +dump: peg_extension/parse.c + cat -n $(TESTFILE) + $(PYTHON) -c "from peg_extension import parse; import ast; t = parse.parse_file('$(TESTFILE)', mode=1); print(ast.dump(t))" + +regen-metaparser: pegen/metagrammar.gram pegen/*.py + $(PYTHON) -m pegen -q python pegen/metagrammar.gram -o pegen/grammar_parser.py + +# Note: These targets really depend on the generated shared object in peg_extension/parse.*.so but +# this has different names in different systems so we are abusing the implicit dependency on +# parse.c by the use of --compile-extension. + +.PHONY: test + +venv: + $(PYTHON) -m venv $(VENVDIR) + $(VENVPYTHON) -m pip install -U pip setuptools + $(VENVPYTHON) -m pip install -r requirements.pip + @echo "The venv has been created in the $(VENVDIR) directory" + +test: run + +run: peg_extension/parse.c + $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)'); exec(t)" + +compile: peg_extension/parse.c + $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)', mode=2)" + +parse: peg_extension/parse.c + $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)', mode=1)" + +check: peg_extension/parse.c + $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)', mode=0)" + +stats: peg_extension/parse.c data/xxl.py + $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TIMEFILE)', mode=0); parse.dump_memo_stats()" >@data + $(PYTHON) scripts/joinstats.py @data + +time: time_compile + +time_compile: venv data/xxl.py + $(VENVPYTHON) scripts/benchmark.py --parser=new --target=xxl compile + +time_parse: venv data/xxl.py + $(VENVPYTHON) scripts/benchmark.py --parser=new --target=xxl parse + +time_old: time_old_compile + +time_old_compile: venv data/xxl.py + $(VENVPYTHON) scripts/benchmark.py --parser=old --target=xxl compile + +time_old_parse: venv data/xxl.py + $(VENVPYTHON) scripts/benchmark.py --parser=old --target=xxl parse + +time_peg_dir: venv + $(VENVPYTHON) scripts/test_parse_directory.py \ + -d $(TESTDIR) \ + $(TESTFLAGS) \ + --exclude "*/failset/*" \ + --exclude "*/failset/**" \ + --exclude "*/failset/**/*" + +time_stdlib: $(CPYTHON) venv + $(VENVPYTHON) scripts/test_parse_directory.py \ + -d $(CPYTHON) \ + $(TESTFLAGS) \ + --exclude "*/bad*" \ + --exclude "*/lib2to3/tests/data/*" + +mypy: regen-metaparser + $(MYPY) # For list of files, see mypy.ini + +format-python: + black pegen scripts + +format: format-python + +find_max_nesting: + $(PYTHON) scripts/find_max_nesting.py + +tags: TAGS + +TAGS: pegen/*.py test/test_pegen.py + etags pegen/*.py test/test_pegen.py diff --git a/Tools/peg_generator/data/cprog.py b/Tools/peg_generator/data/cprog.py new file mode 100644 index 00000000..79a42983 --- /dev/null +++ b/Tools/peg_generator/data/cprog.py @@ -0,0 +1,11 @@ +if 1: + print("Hello " + "world") + if 0: + print("then") + print("clause") + elif 1: + pass + elif 1: + pass + else: + print("else-clause") diff --git a/Tools/peg_generator/data/top-pypi-packages-365-days.json b/Tools/peg_generator/data/top-pypi-packages-365-days.json new file mode 100644 index 00000000..63ff0843 --- /dev/null +++ b/Tools/peg_generator/data/top-pypi-packages-365-days.json @@ -0,0 +1,16011 @@ +{ + "last_update": "2020-01-17 15:34:44", + "query": { + "bytes_billed": 646188105728, + "bytes_processed": 646187256701, + "cached": false, + "estimated_cost": "2.94" + }, + "rows": [ + { + "download_count": 910195765, + "project": "urllib3" + }, + { + "download_count": 749120890, + "project": "six" + }, + { + "download_count": 670113460, + "project": "botocore" + }, + { + "download_count": 629757389, + "project": "python-dateutil" + }, + { + "download_count": 629606070, + "project": "pip" + }, + { + "download_count": 626954494, + "project": "requests" + }, + { + "download_count": 595019137, + "project": "s3transfer" + }, + { + "download_count": 570148733, + "project": "certifi" + }, + { + "download_count": 542241710, + "project": "idna" + }, + { + "download_count": 534393540, + "project": "pyyaml" + }, + { + "download_count": 531342983, + "project": "pyasn1" + }, + { + "download_count": 518080177, + "project": "docutils" + }, + { + "download_count": 516892347, + "project": "chardet" + }, + { + "download_count": 502956749, + "project": "rsa" + }, + { + "download_count": 480905080, + "project": "jmespath" + }, + { + "download_count": 410856025, + "project": "setuptools" + }, + { + "download_count": 410196551, + "project": "pytz" + }, + { + "download_count": 397671253, + "project": "awscli" + }, + { + "download_count": 392932234, + "project": "futures" + }, + { + "download_count": 375594752, + "project": "colorama" + }, + { + "download_count": 346035749, + "project": "simplejson" + }, + { + "download_count": 337185380, + "project": "boto3" + }, + { + "download_count": 305750769, + "project": "numpy" + }, + { + "download_count": 304101394, + "project": "wheel" + }, + { + "download_count": 264199809, + "project": "protobuf" + }, + { + "download_count": 244941990, + "project": "markupsafe" + }, + { + "download_count": 242351858, + "project": "cffi" + }, + { + "download_count": 214070466, + "project": "jinja2" + }, + { + "download_count": 212238740, + "project": "pyasn1-modules" + }, + { + "download_count": 210982876, + "project": "cryptography" + }, + { + "download_count": 190156825, + "project": "attrs" + }, + { + "download_count": 182755695, + "project": "cachetools" + }, + { + "download_count": 178075863, + "project": "google-api-core" + }, + { + "download_count": 177966855, + "project": "enum34" + }, + { + "download_count": 173568874, + "project": "click" + }, + { + "download_count": 168990924, + "project": "future" + }, + { + "download_count": 168313449, + "project": "google-auth" + }, + { + "download_count": 165064404, + "project": "pandas" + }, + { + "download_count": 161184509, + "project": "grpcio" + }, + { + "download_count": 153694077, + "project": "google-cloud-core" + }, + { + "download_count": 152780068, + "project": "pycparser" + }, + { + "download_count": 150391523, + "project": "googleapis-common-protos" + }, + { + "download_count": 145133278, + "project": "pyparsing" + }, + { + "download_count": 143193200, + "project": "werkzeug" + }, + { + "download_count": 136092386, + "project": "pytest" + }, + { + "download_count": 135106914, + "project": "decorator" + }, + { + "download_count": 128924918, + "project": "asn1crypto" + }, + { + "download_count": 126657878, + "project": "more-itertools" + }, + { + "download_count": 126309809, + "project": "awscli-cwlogs" + }, + { + "download_count": 120300118, + "project": "pluggy" + }, + { + "download_count": 117455899, + "project": "flask" + }, + { + "download_count": 116968652, + "project": "scipy" + }, + { + "download_count": 113639938, + "project": "itsdangerous" + }, + { + "download_count": 111213522, + "project": "oauthlib" + }, + { + "download_count": 106969182, + "project": "py" + }, + { + "download_count": 106245186, + "project": "coverage" + }, + { + "download_count": 104256236, + "project": "virtualenv" + }, + { + "download_count": 102765613, + "project": "requests-oauthlib" + }, + { + "download_count": 102590841, + "project": "psutil" + }, + { + "download_count": 102589154, + "project": "ipaddress" + }, + { + "download_count": 102291693, + "project": "jsonschema" + }, + { + "download_count": 100560003, + "project": "scikit-learn" + }, + { + "download_count": 99249602, + "project": "importlib-metadata" + }, + { + "download_count": 95618798, + "project": "pygments" + }, + { + "download_count": 94913658, + "project": "wcwidth" + }, + { + "download_count": 93958133, + "project": "zipp" + }, + { + "download_count": 93185870, + "project": "pyopenssl" + }, + { + "download_count": 92353815, + "project": "pyjwt" + }, + { + "download_count": 92018680, + "project": "mock" + }, + { + "download_count": 90635179, + "project": "wrapt" + }, + { + "download_count": 90150749, + "project": "google-cloud-storage" + }, + { + "download_count": 86097386, + "project": "pillow" + }, + { + "download_count": 85698334, + "project": "websocket-client" + }, + { + "download_count": 84842257, + "project": "packaging" + }, + { + "download_count": 84475934, + "project": "pbr" + }, + { + "download_count": 82019683, + "project": "ipython" + }, + { + "download_count": 81402313, + "project": "prompt-toolkit" + }, + { + "download_count": 80731622, + "project": "matplotlib" + }, + { + "download_count": 80443033, + "project": "httplib2" + }, + { + "download_count": 78391981, + "project": "boto" + }, + { + "download_count": 77428445, + "project": "lxml" + }, + { + "download_count": 76599773, + "project": "docker" + }, + { + "download_count": 75883487, + "project": "atomicwrites" + }, + { + "download_count": 73114976, + "project": "google-resumable-media" + }, + { + "download_count": 72286328, + "project": "sqlalchemy" + }, + { + "download_count": 71355694, + "project": "argparse" + }, + { + "download_count": 70247997, + "project": "kiwisolver" + }, + { + "download_count": 70157529, + "project": "mccabe" + }, + { + "download_count": 69616809, + "project": "configparser" + }, + { + "download_count": 68080016, + "project": "multidict" + }, + { + "download_count": 65738785, + "project": "tqdm" + }, + { + "download_count": 65716434, + "project": "tornado" + }, + { + "download_count": 65152549, + "project": "funcsigs" + }, + { + "download_count": 64373372, + "project": "beautifulsoup4" + }, + { + "download_count": 64241326, + "project": "paramiko" + }, + { + "download_count": 63570436, + "project": "psycopg2" + }, + { + "download_count": 63544025, + "project": "pyrsistent" + }, + { + "download_count": 63424037, + "project": "typing" + }, + { + "download_count": 62605787, + "project": "markdown" + }, + { + "download_count": 62535342, + "project": "google-api-python-client" + }, + { + "download_count": 61655343, + "project": "redis" + }, + { + "download_count": 61634970, + "project": "bcrypt" + }, + { + "download_count": 60696872, + "project": "pexpect" + }, + { + "download_count": 60144339, + "project": "pycodestyle" + }, + { + "download_count": 60125614, + "project": "absl-py" + }, + { + "download_count": 59496247, + "project": "ptyprocess" + }, + { + "download_count": 59137610, + "project": "aiohttp" + }, + { + "download_count": 59052497, + "project": "entrypoints" + }, + { + "download_count": 58282657, + "project": "oauth2client" + }, + { + "download_count": 57910701, + "project": "docopt" + }, + { + "download_count": 57238190, + "project": "pynacl" + }, + { + "download_count": 55087716, + "project": "traitlets" + }, + { + "download_count": 55005408, + "project": "tabulate" + }, + { + "download_count": 54655331, + "project": "backports-functools-lru-cache" + }, + { + "download_count": 54439203, + "project": "lazy-object-proxy" + }, + { + "download_count": 54278961, + "project": "dill" + }, + { + "download_count": 53875643, + "project": "ipython-genutils" + }, + { + "download_count": 53414364, + "project": "pathlib2" + }, + { + "download_count": 53208142, + "project": "isodate" + }, + { + "download_count": 52918821, + "project": "azure-common" + }, + { + "download_count": 52876560, + "project": "gunicorn" + }, + { + "download_count": 52367394, + "project": "uritemplate" + }, + { + "download_count": 52356165, + "project": "cycler" + }, + { + "download_count": 52009177, + "project": "defusedxml" + }, + { + "download_count": 51204829, + "project": "psycopg2-binary" + }, + { + "download_count": 51194283, + "project": "h5py" + }, + { + "download_count": 51011471, + "project": "termcolor" + }, + { + "download_count": 50365341, + "project": "pickleshare" + }, + { + "download_count": 50282815, + "project": "soupsieve" + }, + { + "download_count": 50184503, + "project": "pyflakes" + }, + { + "download_count": 49235593, + "project": "requests-toolbelt" + }, + { + "download_count": 48265870, + "project": "google-cloud-bigquery" + }, + { + "download_count": 47092132, + "project": "tensorboard" + }, + { + "download_count": 46785233, + "project": "typed-ast" + }, + { + "download_count": 46639206, + "project": "networkx" + }, + { + "download_count": 45991420, + "project": "webencodings" + }, + { + "download_count": 45685686, + "project": "async-timeout" + }, + { + "download_count": 45449338, + "project": "tensorflow" + }, + { + "download_count": 45435235, + "project": "gitpython" + }, + { + "download_count": 45275021, + "project": "pymongo" + }, + { + "download_count": 45205520, + "project": "azure-storage-blob" + }, + { + "download_count": 45085736, + "project": "flake8" + }, + { + "download_count": 44565799, + "project": "isort" + }, + { + "download_count": 44491717, + "project": "contextlib2" + }, + { + "download_count": 44308938, + "project": "scandir" + }, + { + "download_count": 44265261, + "project": "functools32" + }, + { + "download_count": 44039749, + "project": "gevent" + }, + { + "download_count": 42987880, + "project": "pytest-cov" + }, + { + "download_count": 42298933, + "project": "docker-pycreds" + }, + { + "download_count": 42280978, + "project": "joblib" + }, + { + "download_count": 42125807, + "project": "yarl" + }, + { + "download_count": 42105718, + "project": "grpc-google-iam-v1" + }, + { + "download_count": 42070985, + "project": "greenlet" + }, + { + "download_count": 41679952, + "project": "zope-interface" + }, + { + "download_count": 41396597, + "project": "pyzmq" + }, + { + "download_count": 41281740, + "project": "pymysql" + }, + { + "download_count": 41194733, + "project": "django" + }, + { + "download_count": 41174124, + "project": "datadog" + }, + { + "download_count": 41132868, + "project": "bleach" + }, + { + "download_count": 40599053, + "project": "astroid" + }, + { + "download_count": 40529351, + "project": "gitdb2" + }, + { + "download_count": 40342805, + "project": "pylint" + }, + { + "download_count": 40116789, + "project": "babel" + }, + { + "download_count": 39847400, + "project": "azure-storage-common" + }, + { + "download_count": 39689270, + "project": "keras-applications" + }, + { + "download_count": 39395842, + "project": "keras-preprocessing" + }, + { + "download_count": 39184540, + "project": "smmap2" + }, + { + "download_count": 38876199, + "project": "opencv-python" + }, + { + "download_count": 38852272, + "project": "subprocess32" + }, + { + "download_count": 38836392, + "project": "msrest" + }, + { + "download_count": 38732044, + "project": "google-auth-httplib2" + }, + { + "download_count": 38166504, + "project": "parso" + }, + { + "download_count": 37940669, + "project": "jedi" + }, + { + "download_count": 37805943, + "project": "pycryptodome" + }, + { + "download_count": 37739739, + "project": "astor" + }, + { + "download_count": 37110085, + "project": "gast" + }, + { + "download_count": 36881409, + "project": "retrying" + }, + { + "download_count": 35451582, + "project": "elasticsearch" + }, + { + "download_count": 35263938, + "project": "jsonpickle" + }, + { + "download_count": 34975483, + "project": "sqlparse" + }, + { + "download_count": 34879648, + "project": "pyarrow" + }, + { + "download_count": 34858569, + "project": "ordereddict" + }, + { + "download_count": 33824794, + "project": "scikit-image" + }, + { + "download_count": 33775490, + "project": "pycrypto" + }, + { + "download_count": 32742937, + "project": "appdirs" + }, + { + "download_count": 32689782, + "project": "toml" + }, + { + "download_count": 32684718, + "project": "adal" + }, + { + "download_count": 32591485, + "project": "azure-nspkg" + }, + { + "download_count": 32103427, + "project": "xlrd" + }, + { + "download_count": 32000159, + "project": "jupyter-core" + }, + { + "download_count": 31774601, + "project": "xmltodict" + }, + { + "download_count": 31736336, + "project": "toolz" + }, + { + "download_count": 31576642, + "project": "cached-property" + }, + { + "download_count": 31550164, + "project": "prometheus-client" + }, + { + "download_count": 31302562, + "project": "tensorflow-estimator" + }, + { + "download_count": 31010564, + "project": "py4j" + }, + { + "download_count": 30527374, + "project": "websockets" + }, + { + "download_count": 30383292, + "project": "dnspython" + }, + { + "download_count": 30245623, + "project": "nbformat" + }, + { + "download_count": 30162734, + "project": "monotonic" + }, + { + "download_count": 29978338, + "project": "nose" + }, + { + "download_count": 29531870, + "project": "typing-extensions" + }, + { + "download_count": 29443454, + "project": "sklearn" + }, + { + "download_count": 29064516, + "project": "cloudpickle" + }, + { + "download_count": 28794637, + "project": "pywavelets" + }, + { + "download_count": 28710649, + "project": "pycryptodomex" + }, + { + "download_count": 28533182, + "project": "ansible" + }, + { + "download_count": 28501824, + "project": "singledispatch" + }, + { + "download_count": 28281846, + "project": "ply" + }, + { + "download_count": 27973857, + "project": "cython" + }, + { + "download_count": 27913607, + "project": "mako" + }, + { + "download_count": 27864029, + "project": "selenium" + }, + { + "download_count": 27848508, + "project": "html5lib" + }, + { + "download_count": 27745677, + "project": "simplegeneric" + }, + { + "download_count": 27671952, + "project": "apache-beam" + }, + { + "download_count": 27579084, + "project": "backcall" + }, + { + "download_count": 26844011, + "project": "msgpack" + }, + { + "download_count": 26331607, + "project": "dask" + }, + { + "download_count": 26266166, + "project": "regex" + }, + { + "download_count": 26239282, + "project": "ipykernel" + }, + { + "download_count": 25952891, + "project": "ujson" + }, + { + "download_count": 25898723, + "project": "mistune" + }, + { + "download_count": 25796973, + "project": "backports-ssl-match-hostname" + }, + { + "download_count": 25756543, + "project": "amqp" + }, + { + "download_count": 25750485, + "project": "jupyter-client" + }, + { + "download_count": 25701706, + "project": "docker-compose" + }, + { + "download_count": 25315661, + "project": "kombu" + }, + { + "download_count": 25281035, + "project": "ruamel-yaml" + }, + { + "download_count": 25271754, + "project": "nltk" + }, + { + "download_count": 25075126, + "project": "alembic" + }, + { + "download_count": 24664889, + "project": "google-auth-oauthlib" + }, + { + "download_count": 24499399, + "project": "raven" + }, + { + "download_count": 24483899, + "project": "python-editor" + }, + { + "download_count": 24388318, + "project": "sortedcontainers" + }, + { + "download_count": 24375921, + "project": "nbconvert" + }, + { + "download_count": 24045975, + "project": "thrift" + }, + { + "download_count": 23835990, + "project": "notebook" + }, + { + "download_count": 23817589, + "project": "hdfs" + }, + { + "download_count": 23689627, + "project": "slackclient" + }, + { + "download_count": 23619686, + "project": "testpath" + }, + { + "download_count": 23536824, + "project": "s3fs" + }, + { + "download_count": 23476069, + "project": "keras" + }, + { + "download_count": 23364791, + "project": "celery" + }, + { + "download_count": 23339282, + "project": "discord-py" + }, + { + "download_count": 23232254, + "project": "billiard" + }, + { + "download_count": 23210897, + "project": "filelock" + }, + { + "download_count": 23187414, + "project": "snowballstemmer" + }, + { + "download_count": 23088875, + "project": "unidecode" + }, + { + "download_count": 23011985, + "project": "netaddr" + }, + { + "download_count": 22993463, + "project": "pandocfilters" + }, + { + "download_count": 22747435, + "project": "send2trash" + }, + { + "download_count": 22715519, + "project": "terminado" + }, + { + "download_count": 22431738, + "project": "backports-shutil-get-terminal-size" + }, + { + "download_count": 22409669, + "project": "backports-weakref" + }, + { + "download_count": 22231171, + "project": "msrestazure" + }, + { + "download_count": 21906531, + "project": "sentry-sdk" + }, + { + "download_count": 21817254, + "project": "ipywidgets" + }, + { + "download_count": 21711592, + "project": "tzlocal" + }, + { + "download_count": 21626474, + "project": "widgetsnbextension" + }, + { + "download_count": 21533795, + "project": "ijson" + }, + { + "download_count": 21335834, + "project": "mysqlclient" + }, + { + "download_count": 20939369, + "project": "tox" + }, + { + "download_count": 20733637, + "project": "lockfile" + }, + { + "download_count": 20642115, + "project": "xgboost" + }, + { + "download_count": 20630795, + "project": "arrow" + }, + { + "download_count": 20559416, + "project": "vine" + }, + { + "download_count": 20399386, + "project": "google-cloud-pubsub" + }, + { + "download_count": 20372136, + "project": "sphinx" + }, + { + "download_count": 20261684, + "project": "djangorestframework" + }, + { + "download_count": 20222772, + "project": "openpyxl" + }, + { + "download_count": 20101811, + "project": "ecdsa" + }, + { + "download_count": 20081473, + "project": "xlsxwriter" + }, + { + "download_count": 20021156, + "project": "snowflake-connector-python" + }, + { + "download_count": 19972964, + "project": "pyhamcrest" + }, + { + "download_count": 19806017, + "project": "google-cloud-firestore" + }, + { + "download_count": 19717486, + "project": "google-cloud-datastore" + }, + { + "download_count": 19580510, + "project": "google-pasta" + }, + { + "download_count": 19191080, + "project": "qtconsole" + }, + { + "download_count": 19179159, + "project": "bs4" + }, + { + "download_count": 19098496, + "project": "text-unidecode" + }, + { + "download_count": 19089305, + "project": "prettytable" + }, + { + "download_count": 19018504, + "project": "jdcal" + }, + { + "download_count": 19002384, + "project": "google-cloud-logging" + }, + { + "download_count": 18962785, + "project": "backports-abc" + }, + { + "download_count": 18918332, + "project": "jupyter-console" + }, + { + "download_count": 18706905, + "project": "smart-open" + }, + { + "download_count": 18670352, + "project": "alabaster" + }, + { + "download_count": 18664013, + "project": "pyspark" + }, + { + "download_count": 18533388, + "project": "jupyter" + }, + { + "download_count": 18480060, + "project": "statsmodels" + }, + { + "download_count": 18431746, + "project": "unicodecsv" + }, + { + "download_count": 18351262, + "project": "dockerpty" + }, + { + "download_count": 18303864, + "project": "shapely" + }, + { + "download_count": 18289269, + "project": "twisted" + }, + { + "download_count": 18288202, + "project": "hiredis" + }, + { + "download_count": 18166239, + "project": "virtualenv-clone" + }, + { + "download_count": 18139397, + "project": "imagesize" + }, + { + "download_count": 18056871, + "project": "idna-ssl" + }, + { + "download_count": 18052633, + "project": "fasteners" + }, + { + "download_count": 18027552, + "project": "marshmallow" + }, + { + "download_count": 18017517, + "project": "plotly" + }, + { + "download_count": 17675962, + "project": "pytest-forked" + }, + { + "download_count": 17577035, + "project": "texttable" + }, + { + "download_count": 17473671, + "project": "et-xmlfile" + }, + { + "download_count": 17113449, + "project": "kubernetes" + }, + { + "download_count": 17078526, + "project": "incremental" + }, + { + "download_count": 16916001, + "project": "iso8601" + }, + { + "download_count": 16883776, + "project": "applicationinsights" + }, + { + "download_count": 16840538, + "project": "google-cloud-bigtable" + }, + { + "download_count": 16823748, + "project": "pathlib" + }, + { + "download_count": 16759673, + "project": "constantly" + }, + { + "download_count": 16691118, + "project": "automat" + }, + { + "download_count": 16638971, + "project": "hyperlink" + }, + { + "download_count": 16463703, + "project": "azure-mgmt-resource" + }, + { + "download_count": 16410162, + "project": "croniter" + }, + { + "download_count": 16390810, + "project": "python-jose" + }, + { + "download_count": 16303498, + "project": "pipenv" + }, + { + "download_count": 15658966, + "project": "pathspec" + }, + { + "download_count": 15520321, + "project": "nvidia-ml-py3" + }, + { + "download_count": 15364508, + "project": "execnet" + }, + { + "download_count": 15314360, + "project": "aniso8601" + }, + { + "download_count": 15247809, + "project": "python-magic" + }, + { + "download_count": 15213240, + "project": "flask-cors" + }, + { + "download_count": 15203298, + "project": "inflection" + }, + { + "download_count": 15113541, + "project": "gym" + }, + { + "download_count": 14999608, + "project": "mypy" + }, + { + "download_count": 14927461, + "project": "azure-mgmt-storage" + }, + { + "download_count": 14835131, + "project": "flask-sqlalchemy" + }, + { + "download_count": 14822442, + "project": "service-identity" + }, + { + "download_count": 14807088, + "project": "mozrunner" + }, + { + "download_count": 14682178, + "project": "argcomplete" + }, + { + "download_count": 14637155, + "project": "faker" + }, + { + "download_count": 14609350, + "project": "uvloop" + }, + { + "download_count": 14582824, + "project": "apipkg" + }, + { + "download_count": 14479520, + "project": "stevedore" + }, + { + "download_count": 14469933, + "project": "azure-storage-nspkg" + }, + { + "download_count": 14356576, + "project": "ndg-httpsclient" + }, + { + "download_count": 14226382, + "project": "pyserial" + }, + { + "download_count": 14190037, + "project": "seaborn" + }, + { + "download_count": 14151070, + "project": "distro" + }, + { + "download_count": 14141290, + "project": "pytest-timeout" + }, + { + "download_count": 14122087, + "project": "bz2file" + }, + { + "download_count": 14098838, + "project": "patsy" + }, + { + "download_count": 14036101, + "project": "cssselect" + }, + { + "download_count": 13956987, + "project": "tenacity" + }, + { + "download_count": 13927328, + "project": "tensorflow-metadata" + }, + { + "download_count": 13870715, + "project": "graphviz" + }, + { + "download_count": 13850391, + "project": "pydot" + }, + { + "download_count": 13813387, + "project": "azure-mgmt-nspkg" + }, + { + "download_count": 13809809, + "project": "avro" + }, + { + "download_count": 13771055, + "project": "imageio" + }, + { + "download_count": 13764392, + "project": "fastavro" + }, + { + "download_count": 13686467, + "project": "gensim" + }, + { + "download_count": 13643493, + "project": "trueskill" + }, + { + "download_count": 13548711, + "project": "statsd" + }, + { + "download_count": 13505330, + "project": "pytest-xdist" + }, + { + "download_count": 13453212, + "project": "azure-mgmt-containerregistry" + }, + { + "download_count": 13380441, + "project": "mypy-extensions" + }, + { + "download_count": 13340370, + "project": "azure-mgmt-keyvault" + }, + { + "download_count": 13259227, + "project": "ua-parser" + }, + { + "download_count": 13241753, + "project": "configobj" + }, + { + "download_count": 13193523, + "project": "mozlog" + }, + { + "download_count": 13161090, + "project": "fuzzywuzzy" + }, + { + "download_count": 13153967, + "project": "google-gax" + }, + { + "download_count": 12999681, + "project": "responses" + }, + { + "download_count": 12946906, + "project": "aliyun-python-sdk-core" + }, + { + "download_count": 12863346, + "project": "azure-datalake-store" + }, + { + "download_count": 12839810, + "project": "pytest-mock" + }, + { + "download_count": 12835022, + "project": "aliyun-python-sdk-ecs" + }, + { + "download_count": 12816025, + "project": "elasticsearch-dsl" + }, + { + "download_count": 12792645, + "project": "azure-mgmt-authorization" + }, + { + "download_count": 12780433, + "project": "google-apitools" + }, + { + "download_count": 12772525, + "project": "python-daemon" + }, + { + "download_count": 12766382, + "project": "azure-graphrbac" + }, + { + "download_count": 12561149, + "project": "netifaces" + }, + { + "download_count": 12538305, + "project": "s3cmd" + }, + { + "download_count": 12534903, + "project": "python-json-logger" + }, + { + "download_count": 12484719, + "project": "aliyunsdkcore" + }, + { + "download_count": 12406280, + "project": "manhole" + }, + { + "download_count": 12261609, + "project": "hvac" + }, + { + "download_count": 12253367, + "project": "humanfriendly" + }, + { + "download_count": 12246930, + "project": "ipdb" + }, + { + "download_count": 12209179, + "project": "deepdiff" + }, + { + "download_count": 12207990, + "project": "freezegun" + }, + { + "download_count": 12098216, + "project": "maxminddb" + }, + { + "download_count": 12042231, + "project": "uwsgi" + }, + { + "download_count": 11947362, + "project": "pykube" + }, + { + "download_count": 11860617, + "project": "appnope" + }, + { + "download_count": 11805813, + "project": "databricks-cli" + }, + { + "download_count": 11788737, + "project": "python-levenshtein" + }, + { + "download_count": 11778504, + "project": "tensorflow-transform" + }, + { + "download_count": 11612558, + "project": "tldextract" + }, + { + "download_count": 11569388, + "project": "pyodbc" + }, + { + "download_count": 11561349, + "project": "autopep8" + }, + { + "download_count": 11432600, + "project": "pendulum" + }, + { + "download_count": 11383453, + "project": "newrelic" + }, + { + "download_count": 11361327, + "project": "python-dotenv" + }, + { + "download_count": 11334209, + "project": "pytzdata" + }, + { + "download_count": 11270038, + "project": "wtforms" + }, + { + "download_count": 11224152, + "project": "pytest-runner" + }, + { + "download_count": 11104163, + "project": "libtmux" + }, + { + "download_count": 11089587, + "project": "zope-deprecation" + }, + { + "download_count": 11017907, + "project": "jsonpointer" + }, + { + "download_count": 10994575, + "project": "webob" + }, + { + "download_count": 10990219, + "project": "retry" + }, + { + "download_count": 10987260, + "project": "blinker" + }, + { + "download_count": 10973921, + "project": "semantic-version" + }, + { + "download_count": 10843556, + "project": "requests-file" + }, + { + "download_count": 10781388, + "project": "graphql-core" + }, + { + "download_count": 10728518, + "project": "blessings" + }, + { + "download_count": 10716974, + "project": "backoff" + }, + { + "download_count": 10695298, + "project": "black" + }, + { + "download_count": 10686016, + "project": "geopy" + }, + { + "download_count": 10629161, + "project": "google-cloud" + }, + { + "download_count": 10551343, + "project": "bottle" + }, + { + "download_count": 10527245, + "project": "pep8" + }, + { + "download_count": 10511519, + "project": "geoip2" + }, + { + "download_count": 10451332, + "project": "grpcio-tools" + }, + { + "download_count": 10410102, + "project": "traceback2" + }, + { + "download_count": 10386312, + "project": "linecache2" + }, + { + "download_count": 10351287, + "project": "django-extensions" + }, + { + "download_count": 10318239, + "project": "sphinxcontrib-websupport" + }, + { + "download_count": 10239847, + "project": "unittest2" + }, + { + "download_count": 10187032, + "project": "fsspec" + }, + { + "download_count": 10146539, + "project": "django-cors-headers" + }, + { + "download_count": 10119472, + "project": "pkginfo" + }, + { + "download_count": 10077843, + "project": "django-filter" + }, + { + "download_count": 10057055, + "project": "secretstorage" + }, + { + "download_count": 10050204, + "project": "user-agents" + }, + { + "download_count": 10001744, + "project": "configargparse" + }, + { + "download_count": 9957349, + "project": "scp" + }, + { + "download_count": 9942530, + "project": "azure-devops" + }, + { + "download_count": 9938936, + "project": "azure-mgmt-compute" + }, + { + "download_count": 9934159, + "project": "azure-mgmt-network" + }, + { + "download_count": 9904711, + "project": "msgpack-python" + }, + { + "download_count": 9827614, + "project": "azure-mgmt-datalake-nspkg" + }, + { + "download_count": 9735081, + "project": "azure-mgmt-datalake-store" + }, + { + "download_count": 9706197, + "project": "google-cloud-monitoring" + }, + { + "download_count": 9674967, + "project": "mpi4py" + }, + { + "download_count": 9609045, + "project": "mozdevice" + }, + { + "download_count": 9561083, + "project": "azure-keyvault" + }, + { + "download_count": 9523786, + "project": "pysocks" + }, + { + "download_count": 9521848, + "project": "azure-cli" + }, + { + "download_count": 9493349, + "project": "jsondiff" + }, + { + "download_count": 9467938, + "project": "cherrypy" + }, + { + "download_count": 9467625, + "project": "pika" + }, + { + "download_count": 9410911, + "project": "parsedatetime" + }, + { + "download_count": 9399772, + "project": "azure-mgmt-batch" + }, + { + "download_count": 9376391, + "project": "lightgbm" + }, + { + "download_count": 9375734, + "project": "querystring-parser" + }, + { + "download_count": 9342152, + "project": "pyrfc3339" + }, + { + "download_count": 9319192, + "project": "argh" + }, + { + "download_count": 9315946, + "project": "pyproj" + }, + { + "download_count": 9307163, + "project": "mozprofile" + }, + { + "download_count": 9301729, + "project": "pycurl" + }, + { + "download_count": 9288555, + "project": "dictdiffer" + }, + { + "download_count": 9274785, + "project": "flask-wtf" + }, + { + "download_count": 9274704, + "project": "mysql-connector-python" + }, + { + "download_count": 9272854, + "project": "cheroot" + }, + { + "download_count": 9261620, + "project": "codecov" + }, + { + "download_count": 9224842, + "project": "mozinfo" + }, + { + "download_count": 9222371, + "project": "jsonpatch" + }, + { + "download_count": 9217176, + "project": "glob2" + }, + { + "download_count": 9059754, + "project": "azure-batch" + }, + { + "download_count": 9057979, + "project": "crcmod" + }, + { + "download_count": 9033939, + "project": "jaraco-functools" + }, + { + "download_count": 8995380, + "project": "tempora" + }, + { + "download_count": 8959399, + "project": "azure-mgmt-dns" + }, + { + "download_count": 8945640, + "project": "pyhive" + }, + { + "download_count": 8906609, + "project": "azure-mgmt-rdbms" + }, + { + "download_count": 8891960, + "project": "azure-mgmt-sql" + }, + { + "download_count": 8888437, + "project": "mozprocess" + }, + { + "download_count": 8874708, + "project": "portend" + }, + { + "download_count": 8853246, + "project": "geographiclib" + }, + { + "download_count": 8803957, + "project": "azure-mgmt-web" + }, + { + "download_count": 8753999, + "project": "deprecated" + }, + { + "download_count": 8739361, + "project": "munch" + }, + { + "download_count": 8687617, + "project": "jpype1" + }, + { + "download_count": 8659485, + "project": "pysftp" + }, + { + "download_count": 8648248, + "project": "watchdog" + }, + { + "download_count": 8644057, + "project": "ruamel-yaml-clib" + }, + { + "download_count": 8628293, + "project": "mlflow" + }, + { + "download_count": 8605163, + "project": "kafka-python" + }, + { + "download_count": 8593398, + "project": "google" + }, + { + "download_count": 8591157, + "project": "gapic-google-cloud-logging-v2" + }, + { + "download_count": 8565550, + "project": "mujoco-py" + }, + { + "download_count": 8557624, + "project": "zeep" + }, + { + "download_count": 8557527, + "project": "proto-google-cloud-logging-v2" + }, + { + "download_count": 8555221, + "project": "azure-storage" + }, + { + "download_count": 8548889, + "project": "pathtools" + }, + { + "download_count": 8547554, + "project": "django-storages" + }, + { + "download_count": 8493425, + "project": "spacy" + }, + { + "download_count": 8479997, + "project": "pytest-instafail" + }, + { + "download_count": 8476835, + "project": "thinc" + }, + { + "download_count": 8468171, + "project": "factory-boy" + }, + { + "download_count": 8466351, + "project": "preshed" + }, + { + "download_count": 8433752, + "project": "google-cloud-spanner" + }, + { + "download_count": 8433718, + "project": "simpleflock" + }, + { + "download_count": 8402292, + "project": "cymem" + }, + { + "download_count": 8374248, + "project": "azure-storage-queue" + }, + { + "download_count": 8367380, + "project": "azure-mgmt-monitor" + }, + { + "download_count": 8361234, + "project": "murmurhash" + }, + { + "download_count": 8360473, + "project": "jeepney" + }, + { + "download_count": 8358801, + "project": "azure-mgmt-containerservice" + }, + { + "download_count": 8334989, + "project": "zc-lockfile" + }, + { + "download_count": 8334854, + "project": "numpy-stl" + }, + { + "download_count": 8334779, + "project": "requests-mock" + }, + { + "download_count": 8331547, + "project": "tensorflow-serving-api" + }, + { + "download_count": 8316359, + "project": "passlib" + }, + { + "download_count": 8257864, + "project": "aws-xray-sdk" + }, + { + "download_count": 8253117, + "project": "waitress" + }, + { + "download_count": 8213115, + "project": "azure-mgmt-containerinstance" + }, + { + "download_count": 8194190, + "project": "oauth" + }, + { + "download_count": 8192420, + "project": "azure-mgmt-redis" + }, + { + "download_count": 8182626, + "project": "azure-mgmt-cognitiveservices" + }, + { + "download_count": 8169888, + "project": "fabric" + }, + { + "download_count": 8160603, + "project": "sphinx-rtd-theme" + }, + { + "download_count": 8151766, + "project": "azure-mgmt-trafficmanager" + }, + { + "download_count": 8146427, + "project": "pystache" + }, + { + "download_count": 8142774, + "project": "python-slugify" + }, + { + "download_count": 8104254, + "project": "azure-mgmt-devtestlabs" + }, + { + "download_count": 8101969, + "project": "sh" + }, + { + "download_count": 8100079, + "project": "azure-mgmt-cdn" + }, + { + "download_count": 8084499, + "project": "azure-mgmt-datalake-analytics" + }, + { + "download_count": 8068973, + "project": "pyaml" + }, + { + "download_count": 8068659, + "project": "azure-mgmt-iothub" + }, + { + "download_count": 8045085, + "project": "azure-mgmt-cosmosdb" + }, + { + "download_count": 8043637, + "project": "jira" + }, + { + "download_count": 8016426, + "project": "mozterm" + }, + { + "download_count": 8000597, + "project": "flask-login" + }, + { + "download_count": 7983143, + "project": "pycairo" + }, + { + "download_count": 7981647, + "project": "invoke" + }, + { + "download_count": 7969857, + "project": "pyxdg" + }, + { + "download_count": 7896477, + "project": "flask-restful" + }, + { + "download_count": 7892342, + "project": "pymssql" + }, + { + "download_count": 7872871, + "project": "plac" + }, + { + "download_count": 7871712, + "project": "colorlog" + }, + { + "download_count": 7841110, + "project": "stripe" + }, + { + "download_count": 7795667, + "project": "pygobject" + }, + { + "download_count": 7793570, + "project": "vsts" + }, + { + "download_count": 7786931, + "project": "azure-mgmt-applicationinsights" + }, + { + "download_count": 7755436, + "project": "azure-cosmosdb-table" + }, + { + "download_count": 7751414, + "project": "zope-event" + }, + { + "download_count": 7745717, + "project": "gspread" + }, + { + "download_count": 7724172, + "project": "phonenumbers" + }, + { + "download_count": 7698105, + "project": "torch" + }, + { + "download_count": 7677484, + "project": "django-debug-toolbar" + }, + { + "download_count": 7669014, + "project": "azure-mgmt-eventhub" + }, + { + "download_count": 7653695, + "project": "sendgrid" + }, + { + "download_count": 7621120, + "project": "azure-core" + }, + { + "download_count": 7618409, + "project": "requests-aws4auth" + }, + { + "download_count": 7606270, + "project": "zope-component" + }, + { + "download_count": 7602809, + "project": "azure-mgmt-marketplaceordering" + }, + { + "download_count": 7589910, + "project": "holidays" + }, + { + "download_count": 7568947, + "project": "azure-cosmosdb-nspkg" + }, + { + "download_count": 7560913, + "project": "azure-mgmt-servicebus" + }, + { + "download_count": 7555791, + "project": "azure-mgmt-loganalytics" + }, + { + "download_count": 7533328, + "project": "azure-mgmt-recoveryservices" + }, + { + "download_count": 7532133, + "project": "azure-mgmt-recoveryservicesbackup" + }, + { + "download_count": 7519987, + "project": "azure-mgmt-eventgrid" + }, + { + "download_count": 7511851, + "project": "simple-salesforce" + }, + { + "download_count": 7493612, + "project": "azure-mgmt-reservations" + }, + { + "download_count": 7490404, + "project": "mysql-python" + }, + { + "download_count": 7471849, + "project": "azure-mgmt-advisor" + }, + { + "download_count": 7470909, + "project": "azure-mgmt-media" + }, + { + "download_count": 7461600, + "project": "backports-tempfile" + }, + { + "download_count": 7452831, + "project": "azure-mgmt-msi" + }, + { + "download_count": 7444403, + "project": "azure-mgmt-batchai" + }, + { + "download_count": 7443190, + "project": "azure-mgmt-iothubprovisioningservices" + }, + { + "download_count": 7427082, + "project": "azure-mgmt-search" + }, + { + "download_count": 7426073, + "project": "azure-mgmt-consumption" + }, + { + "download_count": 7421118, + "project": "azure-mgmt-servicefabric" + }, + { + "download_count": 7420661, + "project": "azure-mgmt-billing" + }, + { + "download_count": 7410977, + "project": "semver" + }, + { + "download_count": 7399599, + "project": "w3lib" + }, + { + "download_count": 7377445, + "project": "supervisor" + }, + { + "download_count": 7371140, + "project": "moto" + }, + { + "download_count": 7360517, + "project": "josepy" + }, + { + "download_count": 7359916, + "project": "azure-mgmt-relay" + }, + { + "download_count": 7325634, + "project": "pandas-gbq" + }, + { + "download_count": 7317868, + "project": "acme" + }, + { + "download_count": 7308144, + "project": "azure-servicebus" + }, + { + "download_count": 7271321, + "project": "xlwt" + }, + { + "download_count": 7270699, + "project": "structlog" + }, + { + "download_count": 7268987, + "project": "sphinxcontrib-serializinghtml" + }, + { + "download_count": 7268175, + "project": "sphinxcontrib-htmlhelp" + }, + { + "download_count": 7251725, + "project": "keyring" + }, + { + "download_count": 7251674, + "project": "sphinxcontrib-qthelp" + }, + { + "download_count": 7251256, + "project": "sphinxcontrib-devhelp" + }, + { + "download_count": 7251076, + "project": "sphinxcontrib-applehelp" + }, + { + "download_count": 7250627, + "project": "sphinxcontrib-jsmath" + }, + { + "download_count": 7239285, + "project": "pytest-django" + }, + { + "download_count": 7236146, + "project": "voluptuous" + }, + { + "download_count": 7235602, + "project": "llvmlite" + }, + { + "download_count": 7112734, + "project": "theano" + }, + { + "download_count": 7042677, + "project": "numba" + }, + { + "download_count": 7038235, + "project": "shellingham" + }, + { + "download_count": 7023740, + "project": "pydocumentdb" + }, + { + "download_count": 7014759, + "project": "parse" + }, + { + "download_count": 7011858, + "project": "coloredlogs" + }, + { + "download_count": 6991011, + "project": "certbot" + }, + { + "download_count": 6989202, + "project": "google-cloud-vision" + }, + { + "download_count": 6983443, + "project": "influxdb" + }, + { + "download_count": 6981795, + "project": "azure-mgmt-managementgroups" + }, + { + "download_count": 6962527, + "project": "azure-mgmt-datamigration" + }, + { + "download_count": 6935874, + "project": "cheetah" + }, + { + "download_count": 6931267, + "project": "azure-mgmt-policyinsights" + }, + { + "download_count": 6910342, + "project": "python-augeas" + }, + { + "download_count": 6902895, + "project": "tblib" + }, + { + "download_count": 6885492, + "project": "azure-mgmt-iotcentral" + }, + { + "download_count": 6882533, + "project": "azure-mgmt-signalr" + }, + { + "download_count": 6879787, + "project": "instana" + }, + { + "download_count": 6848658, + "project": "uptime" + }, + { + "download_count": 6823328, + "project": "azure-mgmt-maps" + }, + { + "download_count": 6811121, + "project": "coreapi" + }, + { + "download_count": 6805884, + "project": "setproctitle" + }, + { + "download_count": 6803339, + "project": "pymemcache" + }, + { + "download_count": 6790921, + "project": "opt-einsum" + }, + { + "download_count": 6746204, + "project": "coreschema" + }, + { + "download_count": 6733204, + "project": "dicttoxml" + }, + { + "download_count": 6709540, + "project": "python-mimeparse" + }, + { + "download_count": 6686487, + "project": "letsencrypt" + }, + { + "download_count": 6671209, + "project": "pypdf2" + }, + { + "download_count": 6659143, + "project": "certbot-apache" + }, + { + "download_count": 6650051, + "project": "feedparser" + }, + { + "download_count": 6629341, + "project": "itypes" + }, + { + "download_count": 6607528, + "project": "datetime" + }, + { + "download_count": 6595896, + "project": "pyglet" + }, + { + "download_count": 6565703, + "project": "pywin32" + }, + { + "download_count": 6555587, + "project": "cachecontrol" + }, + { + "download_count": 6537738, + "project": "whichcraft" + }, + { + "download_count": 6493687, + "project": "repoze-lru" + }, + { + "download_count": 6483589, + "project": "opentracing" + }, + { + "download_count": 6471332, + "project": "yapf" + }, + { + "download_count": 6470521, + "project": "reportlab" + }, + { + "download_count": 6454108, + "project": "pyperclip" + }, + { + "download_count": 6427226, + "project": "sasl" + }, + { + "download_count": 6416154, + "project": "pydocstyle" + }, + { + "download_count": 6412179, + "project": "ldap3" + }, + { + "download_count": 6364528, + "project": "python-http-client" + }, + { + "download_count": 6363103, + "project": "pycountry" + }, + { + "download_count": 6348755, + "project": "azure-servicemanagement-legacy" + }, + { + "download_count": 6348419, + "project": "certbot-nginx" + }, + { + "download_count": 6347386, + "project": "python-gnupg" + }, + { + "download_count": 6338642, + "project": "suds-jurko" + }, + { + "download_count": 6325028, + "project": "promise" + }, + { + "download_count": 6321828, + "project": "twine" + }, + { + "download_count": 6310843, + "project": "django-redis" + }, + { + "download_count": 6310630, + "project": "redis-py-cluster" + }, + { + "download_count": 6301931, + "project": "mysql-connector" + }, + { + "download_count": 6295377, + "project": "python-jenkins" + }, + { + "download_count": 6275920, + "project": "azure-servicefabric" + }, + { + "download_count": 6251258, + "project": "expiringdict" + }, + { + "download_count": 6237744, + "project": "pyvcf" + }, + { + "download_count": 6217846, + "project": "watchtower" + }, + { + "download_count": 6191358, + "project": "poyo" + }, + { + "download_count": 6177944, + "project": "html2text" + }, + { + "download_count": 6167605, + "project": "binaryornot" + }, + { + "download_count": 6156388, + "project": "azure-mgmt" + }, + { + "download_count": 6141630, + "project": "bokeh" + }, + { + "download_count": 6124335, + "project": "python3-openid" + }, + { + "download_count": 6124110, + "project": "azure-storage-file" + }, + { + "download_count": 6123086, + "project": "oscrypto" + }, + { + "download_count": 6089609, + "project": "kazoo" + }, + { + "download_count": 6087309, + "project": "cookiecutter" + }, + { + "download_count": 6069231, + "project": "jinja2-time" + }, + { + "download_count": 6060397, + "project": "azure" + }, + { + "download_count": 6048114, + "project": "google-cloud-translate" + }, + { + "download_count": 6041366, + "project": "humanize" + }, + { + "download_count": 6039221, + "project": "numexpr" + }, + { + "download_count": 6020894, + "project": "twilio" + }, + { + "download_count": 6012401, + "project": "cerberus" + }, + { + "download_count": 6012147, + "project": "azure-mgmt-logic" + }, + { + "download_count": 6006198, + "project": "google-cloud-language" + }, + { + "download_count": 6003966, + "project": "nodeenv" + }, + { + "download_count": 5973514, + "project": "azure-mgmt-scheduler" + }, + { + "download_count": 5943411, + "project": "backports-csv" + }, + { + "download_count": 5918171, + "project": "multi-key-dict" + }, + { + "download_count": 5880962, + "project": "python-memcached" + }, + { + "download_count": 5873333, + "project": "srsly" + }, + { + "download_count": 5867465, + "project": "cx-oracle" + }, + { + "download_count": 5859924, + "project": "blis" + }, + { + "download_count": 5855262, + "project": "azure-mgmt-datafactory" + }, + { + "download_count": 5829317, + "project": "identify" + }, + { + "download_count": 5817248, + "project": "pydata-google-auth" + }, + { + "download_count": 5816751, + "project": "parsel" + }, + { + "download_count": 5808925, + "project": "setuptools-scm" + }, + { + "download_count": 5798570, + "project": "confluent-kafka" + }, + { + "download_count": 5780362, + "project": "lunardate" + }, + { + "download_count": 5770962, + "project": "eventlet" + }, + { + "download_count": 5764369, + "project": "webtest" + }, + { + "download_count": 5762114, + "project": "sqlalchemy-utils" + }, + { + "download_count": 5748385, + "project": "pre-commit" + }, + { + "download_count": 5744591, + "project": "flask-restplus" + }, + { + "download_count": 5741800, + "project": "google-cloud-error-reporting" + }, + { + "download_count": 5727692, + "project": "gapic-google-cloud-datastore-v1" + }, + { + "download_count": 5726258, + "project": "google-cloud-speech" + }, + { + "download_count": 5696390, + "project": "tensorflow-gpu" + }, + { + "download_count": 5671626, + "project": "youtube-dl" + }, + { + "download_count": 5669862, + "project": "zope-proxy" + }, + { + "download_count": 5668657, + "project": "zope-hookable" + }, + { + "download_count": 5666674, + "project": "aspy-yaml" + }, + { + "download_count": 5665846, + "project": "pystan" + }, + { + "download_count": 5658876, + "project": "meld3" + }, + { + "download_count": 5657136, + "project": "zope-deferredimport" + }, + { + "download_count": 5646525, + "project": "altgraph" + }, + { + "download_count": 5638012, + "project": "yamllint" + }, + { + "download_count": 5627465, + "project": "pydispatcher" + }, + { + "download_count": 5598597, + "project": "pytest-html" + }, + { + "download_count": 5589472, + "project": "queuelib" + }, + { + "download_count": 5580580, + "project": "mpmath" + }, + { + "download_count": 5556096, + "project": "wasabi" + }, + { + "download_count": 5538810, + "project": "dateparser" + }, + { + "download_count": 5522745, + "project": "azure-mgmt-subscription" + }, + { + "download_count": 5500243, + "project": "flask-migrate" + }, + { + "download_count": 5494861, + "project": "cfgv" + }, + { + "download_count": 5490908, + "project": "azure-mgmt-notificationhubs" + }, + { + "download_count": 5479229, + "project": "azure-mgmt-managementpartner" + }, + { + "download_count": 5477766, + "project": "azure-mgmt-powerbiembedded" + }, + { + "download_count": 5471458, + "project": "azure-eventgrid" + }, + { + "download_count": 5469115, + "project": "azure-mgmt-commerce" + }, + { + "download_count": 5465959, + "project": "azure-mgmt-machinelearningcompute" + }, + { + "download_count": 5462201, + "project": "readme-renderer" + }, + { + "download_count": 5461957, + "project": "azure-mgmt-hanaonazure" + }, + { + "download_count": 5447652, + "project": "rfc3986" + }, + { + "download_count": 5440586, + "project": "scrapy" + }, + { + "download_count": 5434695, + "project": "aenum" + }, + { + "download_count": 5420091, + "project": "anyjson" + }, + { + "download_count": 5407106, + "project": "proto-google-cloud-datastore-v1" + }, + { + "download_count": 5387258, + "project": "sympy" + }, + { + "download_count": 5374203, + "project": "pygithub" + }, + { + "download_count": 5373585, + "project": "pytest-metadata" + }, + { + "download_count": 5340852, + "project": "paho-mqtt" + }, + { + "download_count": 5335035, + "project": "multiprocess" + }, + { + "download_count": 5333251, + "project": "googledatastore" + }, + { + "download_count": 5328607, + "project": "phoenixdb" + }, + { + "download_count": 5322559, + "project": "nose-exclude" + }, + { + "download_count": 5309246, + "project": "importlib-resources" + }, + { + "download_count": 5299450, + "project": "cookies" + }, + { + "download_count": 5277019, + "project": "tensorflow-tensorboard" + }, + { + "download_count": 5255084, + "project": "thrift-sasl" + }, + { + "download_count": 5249244, + "project": "jsonpath-rw" + }, + { + "download_count": 5245636, + "project": "oslo-i18n" + }, + { + "download_count": 5245466, + "project": "s2sphere" + }, + { + "download_count": 5245010, + "project": "whitenoise" + }, + { + "download_count": 5236181, + "project": "google-cloud-dns" + }, + { + "download_count": 5223390, + "project": "aws-sam-translator" + }, + { + "download_count": 5213027, + "project": "slacker" + }, + { + "download_count": 5165706, + "project": "hypothesis" + }, + { + "download_count": 5155283, + "project": "google-cloud-resource-manager" + }, + { + "download_count": 5152438, + "project": "debtcollector" + }, + { + "download_count": 5141790, + "project": "ruamel-ordereddict" + }, + { + "download_count": 5136659, + "project": "azure-loganalytics" + }, + { + "download_count": 5089358, + "project": "rx" + }, + { + "download_count": 5083806, + "project": "discord" + }, + { + "download_count": 5082337, + "project": "click-plugins" + }, + { + "download_count": 5069136, + "project": "google-cloud-videointelligence" + }, + { + "download_count": 5067821, + "project": "google-cloud-runtimeconfig" + }, + { + "download_count": 5043933, + "project": "inflect" + }, + { + "download_count": 5006490, + "project": "pulp" + }, + { + "download_count": 5001567, + "project": "oslo-utils" + }, + { + "download_count": 4965630, + "project": "azure-mgmt-devspaces" + }, + { + "download_count": 4949806, + "project": "stringcase" + }, + { + "download_count": 4926195, + "project": "django-appconf" + }, + { + "download_count": 4913373, + "project": "pynamodb" + }, + { + "download_count": 4913090, + "project": "dogpile-cache" + }, + { + "download_count": 4899768, + "project": "python-consul" + }, + { + "download_count": 4896198, + "project": "milksnake" + }, + { + "download_count": 4875874, + "project": "pypng" + }, + { + "download_count": 4868256, + "project": "oslo-config" + }, + { + "download_count": 4857940, + "project": "haversine" + }, + { + "download_count": 4854545, + "project": "azure-applicationinsights" + }, + { + "download_count": 4830085, + "project": "flower" + }, + { + "download_count": 4787508, + "project": "bandit" + }, + { + "download_count": 4766743, + "project": "strict-rfc3339" + }, + { + "download_count": 4744246, + "project": "findspark" + }, + { + "download_count": 4742234, + "project": "flask-admin" + }, + { + "download_count": 4742026, + "project": "qds-sdk" + }, + { + "download_count": 4735803, + "project": "pip-tools" + }, + { + "download_count": 4701984, + "project": "cliff" + }, + { + "download_count": 4701803, + "project": "ddtrace" + }, + { + "download_count": 4693878, + "project": "progressbar2" + }, + { + "download_count": 4652633, + "project": "python-utils" + }, + { + "download_count": 4645712, + "project": "cairocffi" + }, + { + "download_count": 4645547, + "project": "google-cloud-trace" + }, + { + "download_count": 4636704, + "project": "docker-py" + }, + { + "download_count": 4632853, + "project": "tinycss2" + }, + { + "download_count": 4627762, + "project": "apscheduler" + }, + { + "download_count": 4606642, + "project": "python-pam" + }, + { + "download_count": 4606137, + "project": "grpcio-gcp" + }, + { + "download_count": 4605186, + "project": "parse-type" + }, + { + "download_count": 4601072, + "project": "parameterized" + }, + { + "download_count": 4600206, + "project": "avro-python3" + }, + { + "download_count": 4589906, + "project": "pypiwin32" + }, + { + "download_count": 4587705, + "project": "olefile" + }, + { + "download_count": 4586230, + "project": "testtools" + }, + { + "download_count": 4583482, + "project": "dj-database-url" + }, + { + "download_count": 4572193, + "project": "basictracer" + }, + { + "download_count": 4567533, + "project": "macholib" + }, + { + "download_count": 4563623, + "project": "cligj" + }, + { + "download_count": 4560977, + "project": "google-cloud-container" + }, + { + "download_count": 4553683, + "project": "oslo-serialization" + }, + { + "download_count": 4544031, + "project": "logging" + }, + { + "download_count": 4543347, + "project": "click-completion" + }, + { + "download_count": 4542581, + "project": "pycares" + }, + { + "download_count": 4461143, + "project": "fiona" + }, + { + "download_count": 4454845, + "project": "mmh3" + }, + { + "download_count": 4447608, + "project": "jws" + }, + { + "download_count": 4433310, + "project": "python-docx" + }, + { + "download_count": 4432803, + "project": "mleap" + }, + { + "download_count": 4430881, + "project": "extras" + }, + { + "download_count": 4394588, + "project": "dataclasses" + }, + { + "download_count": 4384805, + "project": "fixtures" + }, + { + "download_count": 4368983, + "project": "cfn-lint" + }, + { + "download_count": 4347507, + "project": "cairosvg" + }, + { + "download_count": 4345671, + "project": "lz4" + }, + { + "download_count": 4341286, + "project": "flask-script" + }, + { + "download_count": 4335840, + "project": "statistics" + }, + { + "download_count": 4332342, + "project": "fbprophet" + }, + { + "download_count": 4329185, + "project": "cmd2" + }, + { + "download_count": 4323965, + "project": "brotli" + }, + { + "download_count": 4323647, + "project": "cytoolz" + }, + { + "download_count": 4315817, + "project": "polyaxon-client" + }, + { + "download_count": 4309639, + "project": "portalocker" + }, + { + "download_count": 4302427, + "project": "torchvision" + }, + { + "download_count": 4299923, + "project": "bumpversion" + }, + { + "download_count": 4291946, + "project": "python-jwt" + }, + { + "download_count": 4264873, + "project": "polyaxon-cli" + }, + { + "download_count": 4263296, + "project": "polyaxon-deploy" + }, + { + "download_count": 4260496, + "project": "coveralls" + }, + { + "download_count": 4256821, + "project": "python-geohash" + }, + { + "download_count": 4247442, + "project": "flask-caching" + }, + { + "download_count": 4223430, + "project": "cssselect2" + }, + { + "download_count": 4217166, + "project": "behave" + }, + { + "download_count": 4198998, + "project": "mozfile" + }, + { + "download_count": 4198846, + "project": "ddt" + }, + { + "download_count": 4192314, + "project": "aiodns" + }, + { + "download_count": 4180658, + "project": "googleads" + }, + { + "download_count": 4151629, + "project": "flake8-polyfill" + }, + { + "download_count": 4142826, + "project": "pyphen" + }, + { + "download_count": 4130090, + "project": "fastparquet" + }, + { + "download_count": 4125828, + "project": "flask-babel" + }, + { + "download_count": 4114954, + "project": "gcloud" + }, + { + "download_count": 4098408, + "project": "google-cloud-bigquery-datatransfer" + }, + { + "download_count": 4088308, + "project": "gorilla" + }, + { + "download_count": 4081407, + "project": "keystoneauth1" + }, + { + "download_count": 4077553, + "project": "requests-futures" + }, + { + "download_count": 4054249, + "project": "azureml-core" + }, + { + "download_count": 4042252, + "project": "python-ldap" + }, + { + "download_count": 4007776, + "project": "pathos" + }, + { + "download_count": 3999757, + "project": "ephem" + }, + { + "download_count": 3969692, + "project": "hyperopt" + }, + { + "download_count": 3949966, + "project": "testfixtures" + }, + { + "download_count": 3937830, + "project": "fonttools" + }, + { + "download_count": 3935226, + "project": "terminaltables" + }, + { + "download_count": 3927254, + "project": "easyprocess" + }, + { + "download_count": 3922990, + "project": "python-gflags" + }, + { + "download_count": 3912801, + "project": "deprecation" + }, + { + "download_count": 3905705, + "project": "nvidia-ml-py" + }, + { + "download_count": 3885807, + "project": "google-cloud-kms" + }, + { + "download_count": 3865843, + "project": "geojson" + }, + { + "download_count": 3828132, + "project": "robotframework" + }, + { + "download_count": 3820453, + "project": "gcsfs" + }, + { + "download_count": 3810489, + "project": "convertdate" + }, + { + "download_count": 3809802, + "project": "sockjs-tornado" + }, + { + "download_count": 3799689, + "project": "multipledispatch" + }, + { + "download_count": 3798810, + "project": "weasyprint" + }, + { + "download_count": 3793665, + "project": "tomlkit" + }, + { + "download_count": 3792308, + "project": "python-snappy" + }, + { + "download_count": 3787259, + "project": "django-model-utils" + }, + { + "download_count": 3780397, + "project": "distributed" + }, + { + "download_count": 3775038, + "project": "grequests" + }, + { + "download_count": 3771741, + "project": "flask-bcrypt" + }, + { + "download_count": 3769931, + "project": "fakeredis" + }, + { + "download_count": 3752939, + "project": "schedule" + }, + { + "download_count": 3746896, + "project": "validators" + }, + { + "download_count": 3721493, + "project": "knack" + }, + { + "download_count": 3693854, + "project": "pox" + }, + { + "download_count": 3682964, + "project": "sshtunnel" + }, + { + "download_count": 3681065, + "project": "tftpy" + }, + { + "download_count": 3676291, + "project": "pdfminer" + }, + { + "download_count": 3664933, + "project": "google-compute-engine" + }, + { + "download_count": 3647507, + "project": "graphene" + }, + { + "download_count": 3639253, + "project": "setuptools-git" + }, + { + "download_count": 3630380, + "project": "unittest-xml-reporting" + }, + { + "download_count": 3627156, + "project": "ciso8601" + }, + { + "download_count": 3627033, + "project": "sockjs" + }, + { + "download_count": 3625069, + "project": "shortuuid" + }, + { + "download_count": 3616592, + "project": "ray" + }, + { + "download_count": 3613699, + "project": "ppft" + }, + { + "download_count": 3597147, + "project": "shap" + }, + { + "download_count": 3590917, + "project": "azureml-model-management-sdk" + }, + { + "download_count": 3588391, + "project": "pygsheets" + }, + { + "download_count": 3584999, + "project": "flask-swagger" + }, + { + "download_count": 3575551, + "project": "cssutils" + }, + { + "download_count": 3568283, + "project": "pattern" + }, + { + "download_count": 3549188, + "project": "pylev" + }, + { + "download_count": 3544798, + "project": "ibm-db-sa" + }, + { + "download_count": 3526181, + "project": "pyathenajdbc" + }, + { + "download_count": 3518011, + "project": "pylint-plugin-utils" + }, + { + "download_count": 3517988, + "project": "pg8000" + }, + { + "download_count": 3517712, + "project": "tensorflow-model-analysis" + }, + { + "download_count": 3507991, + "project": "os-service-types" + }, + { + "download_count": 3489788, + "project": "python-swiftclient" + }, + { + "download_count": 3477450, + "project": "openstacksdk" + }, + { + "download_count": 3465240, + "project": "cfn-flip" + }, + { + "download_count": 3459223, + "project": "catkin-pkg" + }, + { + "download_count": 3455963, + "project": "cleo" + }, + { + "download_count": 3448945, + "project": "python-keystoneclient" + }, + { + "download_count": 3448335, + "project": "jellyfish" + }, + { + "download_count": 3444950, + "project": "apispec" + }, + { + "download_count": 3443490, + "project": "pastel" + }, + { + "download_count": 3434078, + "project": "django-tables2" + }, + { + "download_count": 3429540, + "project": "qrcode" + }, + { + "download_count": 3426160, + "project": "collectd-nvidianvml" + }, + { + "download_count": 3420045, + "project": "apache-airflow" + }, + { + "download_count": 3411604, + "project": "prison" + }, + { + "download_count": 3402478, + "project": "pefile" + }, + { + "download_count": 3393690, + "project": "commonmark" + }, + { + "download_count": 3388484, + "project": "tablib" + }, + { + "download_count": 3384168, + "project": "ntlm-auth" + }, + { + "download_count": 3377675, + "project": "geopandas" + }, + { + "download_count": 3366350, + "project": "jsmin" + }, + { + "download_count": 3361635, + "project": "antlr4-python3-runtime" + }, + { + "download_count": 3340033, + "project": "polyaxon-dockerizer" + }, + { + "download_count": 3293582, + "project": "odfpy" + }, + { + "download_count": 3269264, + "project": "openapi-codec" + }, + { + "download_count": 3258675, + "project": "utm" + }, + { + "download_count": 3251855, + "project": "pyvmomi" + }, + { + "download_count": 3251588, + "project": "poetry" + }, + { + "download_count": 3247520, + "project": "bitarray" + }, + { + "download_count": 3244587, + "project": "python-crontab" + }, + { + "download_count": 3243979, + "project": "django-mysql" + }, + { + "download_count": 3242901, + "project": "databricks-pypi1" + }, + { + "download_count": 3238235, + "project": "marshmallow-sqlalchemy" + }, + { + "download_count": 3226761, + "project": "emoji" + }, + { + "download_count": 3224704, + "project": "initools" + }, + { + "download_count": 3209542, + "project": "capstone" + }, + { + "download_count": 3200795, + "project": "djangorestframework-jwt" + }, + { + "download_count": 3184641, + "project": "django-rest-swagger" + }, + { + "download_count": 3181604, + "project": "tensorflow-hub" + }, + { + "download_count": 3179141, + "project": "ratelimit" + }, + { + "download_count": 3176283, + "project": "asyncio" + }, + { + "download_count": 3176119, + "project": "spark-sklearn" + }, + { + "download_count": 3173008, + "project": "paste" + }, + { + "download_count": 3169917, + "project": "pytest-asyncio" + }, + { + "download_count": 3159532, + "project": "django-crispy-forms" + }, + { + "download_count": 3156134, + "project": "cachy" + }, + { + "download_count": 3150001, + "project": "asgiref" + }, + { + "download_count": 3138323, + "project": "django-environ" + }, + { + "download_count": 3127100, + "project": "fire" + }, + { + "download_count": 3123851, + "project": "salesforce-bulk" + }, + { + "download_count": 3117730, + "project": "lightstep" + }, + { + "download_count": 3116358, + "project": "azure-cli-core" + }, + { + "download_count": 3110959, + "project": "recommonmark" + }, + { + "download_count": 3095813, + "project": "pysqlite" + }, + { + "download_count": 3088484, + "project": "clickclick" + }, + { + "download_count": 3077942, + "project": "heapdict" + }, + { + "download_count": 3077928, + "project": "google-cloud-dataflow" + }, + { + "download_count": 3073863, + "project": "spotinst-agent" + }, + { + "download_count": 3073217, + "project": "analytics-python" + }, + { + "download_count": 3065872, + "project": "nose-timer" + }, + { + "download_count": 3064209, + "project": "rq" + }, + { + "download_count": 3062467, + "project": "wandb" + }, + { + "download_count": 3060966, + "project": "jsonfield" + }, + { + "download_count": 3050206, + "project": "pyinotify" + }, + { + "download_count": 3048455, + "project": "pygame" + }, + { + "download_count": 3043542, + "project": "intel-openmp" + }, + { + "download_count": 3042574, + "project": "zict" + }, + { + "download_count": 3040916, + "project": "pytest-split-tests" + }, + { + "download_count": 3036872, + "project": "pep8-naming" + }, + { + "download_count": 3029439, + "project": "ordered-set" + }, + { + "download_count": 3025549, + "project": "graphql-relay" + }, + { + "download_count": 3019093, + "project": "troposphere" + }, + { + "download_count": 3009250, + "project": "azure-kusto-data" + }, + { + "download_count": 3008025, + "project": "opencv-contrib-python" + }, + { + "download_count": 3003750, + "project": "requests-ntlm" + }, + { + "download_count": 3003003, + "project": "tb-nightly" + }, + { + "download_count": 2996766, + "project": "credstash" + }, + { + "download_count": 2989520, + "project": "flask-appbuilder" + }, + { + "download_count": 2980537, + "project": "plumbum" + }, + { + "download_count": 2973597, + "project": "pager" + }, + { + "download_count": 2967237, + "project": "schema" + }, + { + "download_count": 2965535, + "project": "mkl" + }, + { + "download_count": 2963377, + "project": "blessed" + }, + { + "download_count": 2953182, + "project": "datashape" + }, + { + "download_count": 2941855, + "project": "validate-email" + }, + { + "download_count": 2939744, + "project": "pylint-django" + }, + { + "download_count": 2938945, + "project": "webapp2" + }, + { + "download_count": 2936891, + "project": "livereload" + }, + { + "download_count": 2935073, + "project": "cvxopt" + }, + { + "download_count": 2934589, + "project": "cement" + }, + { + "download_count": 2931314, + "project": "tfx-bsl" + }, + { + "download_count": 2922270, + "project": "rospkg" + }, + { + "download_count": 2912677, + "project": "flaky" + }, + { + "download_count": 2909121, + "project": "filemagic" + }, + { + "download_count": 2902933, + "project": "msgpack-numpy" + }, + { + "download_count": 2895921, + "project": "uamqp" + }, + { + "download_count": 2895636, + "project": "accumulation-tree" + }, + { + "download_count": 2894366, + "project": "pyudorandom" + }, + { + "download_count": 2892673, + "project": "tdigest" + }, + { + "download_count": 2888615, + "project": "tensorflow-data-validation" + }, + { + "download_count": 2886531, + "project": "python-subunit" + }, + { + "download_count": 2878388, + "project": "gitdb" + }, + { + "download_count": 2874189, + "project": "python-novaclient" + }, + { + "download_count": 2857065, + "project": "asyncpg" + }, + { + "download_count": 2847295, + "project": "social-auth-core" + }, + { + "download_count": 2838600, + "project": "azure-cli-nspkg" + }, + { + "download_count": 2838428, + "project": "requestsexceptions" + }, + { + "download_count": 2834024, + "project": "filechunkio" + }, + { + "download_count": 2828975, + "project": "argon2-cffi" + }, + { + "download_count": 2822266, + "project": "beautifulsoup" + }, + { + "download_count": 2821979, + "project": "smmap" + }, + { + "download_count": 2819754, + "project": "django-multiselectfield" + }, + { + "download_count": 2815640, + "project": "drf-yasg" + }, + { + "download_count": 2813694, + "project": "boltons" + }, + { + "download_count": 2810269, + "project": "httpretty" + }, + { + "download_count": 2806190, + "project": "pyqt5" + }, + { + "download_count": 2802770, + "project": "hashids" + }, + { + "download_count": 2792830, + "project": "pdfrw" + }, + { + "download_count": 2792334, + "project": "flask-openid" + }, + { + "download_count": 2791834, + "project": "gapic-google-cloud-error-reporting-v1beta1" + }, + { + "download_count": 2790983, + "project": "cookiejar" + }, + { + "download_count": 2788259, + "project": "proto-google-cloud-error-reporting-v1beta1" + }, + { + "download_count": 2779755, + "project": "flask-marshmallow" + }, + { + "download_count": 2753420, + "project": "pyinstaller" + }, + { + "download_count": 2752867, + "project": "sqlalchemy-redshift" + }, + { + "download_count": 2749279, + "project": "python-logstash" + }, + { + "download_count": 2747409, + "project": "django-nose" + }, + { + "download_count": 2744486, + "project": "azure-cosmos" + }, + { + "download_count": 2738853, + "project": "verboselogs" + }, + { + "download_count": 2724920, + "project": "googlemaps" + }, + { + "download_count": 2722861, + "project": "social-auth-app-django" + }, + { + "download_count": 2706844, + "project": "async-generator" + }, + { + "download_count": 2704711, + "project": "funcy" + }, + { + "download_count": 2703274, + "project": "clint" + }, + { + "download_count": 2701212, + "project": "pytest-sugar" + }, + { + "download_count": 2699840, + "project": "django-timezone-field" + }, + { + "download_count": 2697450, + "project": "jaydebeapi" + }, + { + "download_count": 2693049, + "project": "brotlipy" + }, + { + "download_count": 2686973, + "project": "args" + }, + { + "download_count": 2683870, + "project": "vcrpy" + }, + { + "download_count": 2677855, + "project": "marshmallow-enum" + }, + { + "download_count": 2673327, + "project": "peewee" + }, + { + "download_count": 2670889, + "project": "osc-lib" + }, + { + "download_count": 2670484, + "project": "langdetect" + }, + { + "download_count": 2663228, + "project": "enum" + }, + { + "download_count": 2655265, + "project": "azure-cli-telemetry" + }, + { + "download_count": 2651881, + "project": "tables" + }, + { + "download_count": 2649758, + "project": "pastedeploy" + }, + { + "download_count": 2646163, + "project": "swagger-spec-validator" + }, + { + "download_count": 2644724, + "project": "tld" + }, + { + "download_count": 2642975, + "project": "kafka" + }, + { + "download_count": 2641270, + "project": "cchardet" + }, + { + "download_count": 2636532, + "project": "timezonefinder" + }, + { + "download_count": 2634114, + "project": "mongoengine" + }, + { + "download_count": 2615568, + "project": "python-crfsuite" + }, + { + "download_count": 2600491, + "project": "timeout-decorator" + }, + { + "download_count": 2592520, + "project": "rjsmin" + }, + { + "download_count": 2589546, + "project": "brunel" + }, + { + "download_count": 2585708, + "project": "autobahn" + }, + { + "download_count": 2584709, + "project": "webargs" + }, + { + "download_count": 2584111, + "project": "pyvirtualdisplay" + }, + { + "download_count": 2580140, + "project": "descartes" + }, + { + "download_count": 2551557, + "project": "cassandra-driver" + }, + { + "download_count": 2549257, + "project": "aws-requests-auth" + }, + { + "download_count": 2540875, + "project": "rope" + }, + { + "download_count": 2538617, + "project": "aiofiles" + }, + { + "download_count": 2532557, + "project": "pycountry-convert" + }, + { + "download_count": 2528277, + "project": "branca" + }, + { + "download_count": 2524264, + "project": "mechanize" + }, + { + "download_count": 2519234, + "project": "mysql-connector-python-rf" + }, + { + "download_count": 2517497, + "project": "pywebhdfs" + }, + { + "download_count": 2503645, + "project": "folium" + }, + { + "download_count": 2498263, + "project": "aiohttp-cors" + }, + { + "download_count": 2497590, + "project": "flask-httpauth" + }, + { + "download_count": 2495242, + "project": "django-ipware" + }, + { + "download_count": 2494397, + "project": "jupyterlab" + }, + { + "download_count": 2493673, + "project": "pybind11" + }, + { + "download_count": 2492477, + "project": "diff-match-patch" + }, + { + "download_count": 2491248, + "project": "jupyter-pip" + }, + { + "download_count": 2488659, + "project": "dpath" + }, + { + "download_count": 2488591, + "project": "marionette-driver" + }, + { + "download_count": 2484149, + "project": "dotnetcore2" + }, + { + "download_count": 2478052, + "project": "pythonwhois" + }, + { + "download_count": 2470002, + "project": "google-cloud-dataproc" + }, + { + "download_count": 2458163, + "project": "enum-compat" + }, + { + "download_count": 2455272, + "project": "awsebcli" + }, + { + "download_count": 2454145, + "project": "django-celery-beat" + }, + { + "download_count": 2453795, + "project": "rfc3987" + }, + { + "download_count": 2447431, + "project": "py-bcrypt" + }, + { + "download_count": 2442569, + "project": "python-gitlab" + }, + { + "download_count": 2439713, + "project": "translationstring" + }, + { + "download_count": 2439355, + "project": "yq" + }, + { + "download_count": 2435098, + "project": "pysnmp" + }, + { + "download_count": 2432521, + "project": "first" + }, + { + "download_count": 2429585, + "project": "hpack" + }, + { + "download_count": 2428283, + "project": "python-glanceclient" + }, + { + "download_count": 2422100, + "project": "venusian" + }, + { + "download_count": 2416591, + "project": "bitstring" + }, + { + "download_count": 2408841, + "project": "flake8-docstrings" + }, + { + "download_count": 2407495, + "project": "attrdict" + }, + { + "download_count": 2404932, + "project": "ws4py" + }, + { + "download_count": 2402857, + "project": "os-client-config" + }, + { + "download_count": 2401078, + "project": "locustio" + }, + { + "download_count": 2398281, + "project": "junit-xml" + }, + { + "download_count": 2395343, + "project": "mozversion" + }, + { + "download_count": 2395052, + "project": "azureml-dataprep" + }, + { + "download_count": 2390036, + "project": "sshpubkeys" + }, + { + "download_count": 2387469, + "project": "h2" + }, + { + "download_count": 2386629, + "project": "ansible-lint" + }, + { + "download_count": 2381639, + "project": "txaio" + }, + { + "download_count": 2380783, + "project": "wget" + }, + { + "download_count": 2375129, + "project": "pytest-rerunfailures" + }, + { + "download_count": 2371842, + "project": "oslo-log" + }, + { + "download_count": 2370221, + "project": "hyperframe" + }, + { + "download_count": 2364172, + "project": "python-openid" + }, + { + "download_count": 2357263, + "project": "flask-jwt-extended" + }, + { + "download_count": 2354920, + "project": "azureml-dataprep-native" + }, + { + "download_count": 2346411, + "project": "flake8-import-order" + }, + { + "download_count": 2334525, + "project": "pypandoc" + }, + { + "download_count": 2329461, + "project": "pysmi" + }, + { + "download_count": 2328121, + "project": "json-merge-patch" + }, + { + "download_count": 2325050, + "project": "falcon" + }, + { + "download_count": 2314962, + "project": "google-cloud-automl" + }, + { + "download_count": 2313548, + "project": "azure-kusto-ingest" + }, + { + "download_count": 2311574, + "project": "aioredis" + }, + { + "download_count": 2307595, + "project": "py-cpuinfo" + }, + { + "download_count": 2305070, + "project": "imbalanced-learn" + }, + { + "download_count": 2304296, + "project": "django-compressor" + }, + { + "download_count": 2304263, + "project": "memoized-property" + }, + { + "download_count": 2304114, + "project": "azureml-telemetry" + }, + { + "download_count": 2301461, + "project": "textblob" + }, + { + "download_count": 2299510, + "project": "snowflake-sqlalchemy" + }, + { + "download_count": 2287102, + "project": "schematics" + }, + { + "download_count": 2276329, + "project": "virtualenvwrapper" + }, + { + "download_count": 2272329, + "project": "aws-encryption-sdk" + }, + { + "download_count": 2272227, + "project": "opencensus" + }, + { + "download_count": 2267894, + "project": "django-allauth" + }, + { + "download_count": 2267072, + "project": "ibm-db" + }, + { + "download_count": 2258528, + "project": "python-cinderclient" + }, + { + "download_count": 2252312, + "project": "objectpath" + }, + { + "download_count": 2242218, + "project": "tf-estimator-nightly" + }, + { + "download_count": 2231619, + "project": "flask-compress" + }, + { + "download_count": 2224267, + "project": "azureml-pipeline-core" + }, + { + "download_count": 2221757, + "project": "connexion" + }, + { + "download_count": 2219740, + "project": "django-phonenumber-field" + }, + { + "download_count": 2214496, + "project": "warlock" + }, + { + "download_count": 2213923, + "project": "pyqt5-sip" + }, + { + "download_count": 2210221, + "project": "phonenumberslite" + }, + { + "download_count": 2209512, + "project": "oslo-context" + }, + { + "download_count": 2194021, + "project": "azure-cli-command-modules-nspkg" + }, + { + "download_count": 2185051, + "project": "pathlib-mate" + }, + { + "download_count": 2184347, + "project": "jsonref" + }, + { + "download_count": 2182555, + "project": "pytimeparse" + }, + { + "download_count": 2180696, + "project": "databricks-pypi2" + }, + { + "download_count": 2178821, + "project": "natsort" + }, + { + "download_count": 2176243, + "project": "ipaddr" + }, + { + "download_count": 2171374, + "project": "path-py" + }, + { + "download_count": 2170378, + "project": "azure-mgmt-hdinsight" + }, + { + "download_count": 2153590, + "project": "firebase-admin" + }, + { + "download_count": 2150903, + "project": "azureml-train-core" + }, + { + "download_count": 2148663, + "project": "pypyodbc" + }, + { + "download_count": 2145885, + "project": "uszipcode" + }, + { + "download_count": 2145383, + "project": "azureml-train-restclients-hyperdrive" + }, + { + "download_count": 2142865, + "project": "premailer" + }, + { + "download_count": 2137325, + "project": "h11" + }, + { + "download_count": 2132743, + "project": "pyformance" + }, + { + "download_count": 2132535, + "project": "shellescape" + }, + { + "download_count": 2130341, + "project": "django-import-export" + }, + { + "download_count": 2127667, + "project": "wsaccel" + }, + { + "download_count": 2126611, + "project": "django-js-asset" + }, + { + "download_count": 2126191, + "project": "snakebite" + }, + { + "download_count": 2124659, + "project": "wordcloud" + }, + { + "download_count": 2109163, + "project": "antlr4-python2-runtime" + }, + { + "download_count": 2099008, + "project": "naked" + }, + { + "download_count": 2098854, + "project": "jinja2-cli" + }, + { + "download_count": 2097764, + "project": "onnx" + }, + { + "download_count": 2081320, + "project": "pytesseract" + }, + { + "download_count": 2076961, + "project": "azureml-pipeline-steps" + }, + { + "download_count": 2073133, + "project": "flask-testing" + }, + { + "download_count": 2072907, + "project": "pytest-env" + }, + { + "download_count": 2072150, + "project": "django-widget-tweaks" + }, + { + "download_count": 2070728, + "project": "django-webpack-loader" + }, + { + "download_count": 2069730, + "project": "azureml-pipeline" + }, + { + "download_count": 2069241, + "project": "mrjob" + }, + { + "download_count": 2055974, + "project": "public" + }, + { + "download_count": 2053631, + "project": "python-whois" + }, + { + "download_count": 2052521, + "project": "safety" + }, + { + "download_count": 2038912, + "project": "azure-multiapi-storage" + }, + { + "download_count": 2038114, + "project": "google-cloud-tasks" + }, + { + "download_count": 2037912, + "project": "partd" + }, + { + "download_count": 2033573, + "project": "rcssmin" + }, + { + "download_count": 2032537, + "project": "uuid" + }, + { + "download_count": 2030463, + "project": "azureml-train" + }, + { + "download_count": 2028467, + "project": "vsts-cd-manager" + }, + { + "download_count": 2025661, + "project": "pyjks" + }, + { + "download_count": 2025022, + "project": "flake8-quotes" + }, + { + "download_count": 2022199, + "project": "python-socketio" + }, + { + "download_count": 2021994, + "project": "slimit" + }, + { + "download_count": 2021337, + "project": "pygeocoder" + }, + { + "download_count": 2020656, + "project": "javaobj-py3" + }, + { + "download_count": 2019345, + "project": "tweepy" + }, + { + "download_count": 2015977, + "project": "grpc-google-logging-v2" + }, + { + "download_count": 2013359, + "project": "twofish" + }, + { + "download_count": 2010440, + "project": "urwid" + }, + { + "download_count": 2008501, + "project": "pyathena" + }, + { + "download_count": 2004648, + "project": "azureml-sdk" + }, + { + "download_count": 2002586, + "project": "pdfminer-six" + }, + { + "download_count": 2000934, + "project": "grpc-google-pubsub-v1" + }, + { + "download_count": 1999960, + "project": "astral" + }, + { + "download_count": 1996773, + "project": "python-box" + }, + { + "download_count": 1992382, + "project": "python-openstackclient" + }, + { + "download_count": 1987939, + "project": "toposort" + }, + { + "download_count": 1984547, + "project": "httptools" + }, + { + "download_count": 1980989, + "project": "asynctest" + }, + { + "download_count": 1978811, + "project": "pycalverter" + }, + { + "download_count": 1975990, + "project": "django-mptt" + }, + { + "download_count": 1974600, + "project": "nameparser" + }, + { + "download_count": 1974472, + "project": "geomet" + }, + { + "download_count": 1974084, + "project": "rtree" + }, + { + "download_count": 1970886, + "project": "gax-google-logging-v2" + }, + { + "download_count": 1967604, + "project": "openapi-spec-validator" + }, + { + "download_count": 1966141, + "project": "simpleeval" + }, + { + "download_count": 1965371, + "project": "gax-google-pubsub-v1" + }, + { + "download_count": 1964155, + "project": "pympler" + }, + { + "download_count": 1957946, + "project": "pint" + }, + { + "download_count": 1954321, + "project": "django-celery-results" + }, + { + "download_count": 1950586, + "project": "oauth2" + }, + { + "download_count": 1947313, + "project": "collections-extended" + }, + { + "download_count": 1943588, + "project": "dparse" + }, + { + "download_count": 1937747, + "project": "azure-mgmt-botservice" + }, + { + "download_count": 1935888, + "project": "facebook-business" + }, + { + "download_count": 1932910, + "project": "django-localflavor" + }, + { + "download_count": 1931470, + "project": "slackweb" + }, + { + "download_count": 1919103, + "project": "azure-eventhub" + }, + { + "download_count": 1918652, + "project": "django-braces" + }, + { + "download_count": 1917375, + "project": "fake-useragent" + }, + { + "download_count": 1916732, + "project": "python-engineio" + }, + { + "download_count": 1904465, + "project": "django-countries" + }, + { + "download_count": 1901273, + "project": "ptvsd" + }, + { + "download_count": 1899393, + "project": "orderedmultidict" + }, + { + "download_count": 1897121, + "project": "jwcrypto" + }, + { + "download_count": 1895022, + "project": "azure-mgmt-security" + }, + { + "download_count": 1893082, + "project": "awacs" + }, + { + "download_count": 1889385, + "project": "azure-functions-devops-build" + }, + { + "download_count": 1884376, + "project": "locket" + }, + { + "download_count": 1882404, + "project": "ctutlz" + }, + { + "download_count": 1875062, + "project": "snapshottest" + }, + { + "download_count": 1874184, + "project": "pdfkit" + }, + { + "download_count": 1870591, + "project": "scapy" + }, + { + "download_count": 1869037, + "project": "opencensus-context" + }, + { + "download_count": 1862753, + "project": "flask-mail" + }, + { + "download_count": 1860985, + "project": "intervaltree" + }, + { + "download_count": 1856012, + "project": "azure-mgmt-sqlvirtualmachine" + }, + { + "download_count": 1853788, + "project": "azure-mgmt-kusto" + }, + { + "download_count": 1853245, + "project": "luigi" + }, + { + "download_count": 1852083, + "project": "pylru" + }, + { + "download_count": 1848356, + "project": "sklearn-pandas" + }, + { + "download_count": 1846838, + "project": "pydantic" + }, + { + "download_count": 1845633, + "project": "email-validator" + }, + { + "download_count": 1844376, + "project": "pyquery" + }, + { + "download_count": 1841139, + "project": "django-oauth-toolkit" + }, + { + "download_count": 1839835, + "project": "memory-profiler" + }, + { + "download_count": 1839825, + "project": "jupyterlab-server" + }, + { + "download_count": 1835726, + "project": "sqlalchemy-migrate" + }, + { + "download_count": 1832053, + "project": "retry-decorator" + }, + { + "download_count": 1830194, + "project": "robotframework-seleniumlibrary" + }, + { + "download_count": 1825914, + "project": "koalas" + }, + { + "download_count": 1822090, + "project": "amazon-dax-client" + }, + { + "download_count": 1821759, + "project": "python-nvd3" + }, + { + "download_count": 1818147, + "project": "utlz" + }, + { + "download_count": 1813328, + "project": "requests-kerberos" + }, + { + "download_count": 1803051, + "project": "ftfy" + }, + { + "download_count": 1798001, + "project": "crypto" + }, + { + "download_count": 1792237, + "project": "distlib" + }, + { + "download_count": 1791068, + "project": "wordsegment" + }, + { + "download_count": 1790178, + "project": "django-taggit" + }, + { + "download_count": 1783750, + "project": "suds" + }, + { + "download_count": 1782898, + "project": "fabric3" + }, + { + "download_count": 1782756, + "project": "socksipy-branch" + }, + { + "download_count": 1778530, + "project": "webcolors" + }, + { + "download_count": 1773769, + "project": "orderedset" + }, + { + "download_count": 1770892, + "project": "mxnet" + }, + { + "download_count": 1767740, + "project": "mixpanel" + }, + { + "download_count": 1766756, + "project": "python-stdnum" + }, + { + "download_count": 1765611, + "project": "polib" + }, + { + "download_count": 1762017, + "project": "pysaml2" + }, + { + "download_count": 1760938, + "project": "pywinpty" + }, + { + "download_count": 1760472, + "project": "curlify" + }, + { + "download_count": 1759532, + "project": "dulwich" + }, + { + "download_count": 1755858, + "project": "tzwhere" + }, + { + "download_count": 1753697, + "project": "pyotp" + }, + { + "download_count": 1752520, + "project": "dropbox" + }, + { + "download_count": 1748789, + "project": "thriftpy" + }, + { + "download_count": 1744492, + "project": "yattag" + }, + { + "download_count": 1744207, + "project": "xxhash" + }, + { + "download_count": 1740901, + "project": "colorlover" + }, + { + "download_count": 1740812, + "project": "mkdocs" + }, + { + "download_count": 1723311, + "project": "iso3166" + }, + { + "download_count": 1722795, + "project": "gcs-oauth2-boto-plugin" + }, + { + "download_count": 1720946, + "project": "protorpc" + }, + { + "download_count": 1717972, + "project": "sentinels" + }, + { + "download_count": 1716396, + "project": "pykalman" + }, + { + "download_count": 1715123, + "project": "pkgconfig" + }, + { + "download_count": 1714704, + "project": "geohash" + }, + { + "download_count": 1712854, + "project": "google-cloud-dlp" + }, + { + "download_count": 1711556, + "project": "resampy" + }, + { + "download_count": 1705164, + "project": "request" + }, + { + "download_count": 1696070, + "project": "usaddress" + }, + { + "download_count": 1694720, + "project": "superlance" + }, + { + "download_count": 1692010, + "project": "librato-metrics" + }, + { + "download_count": 1690356, + "project": "flask-oauthlib" + }, + { + "download_count": 1686047, + "project": "google-cloud-texttospeech" + }, + { + "download_count": 1677666, + "project": "post" + }, + { + "download_count": 1675876, + "project": "get" + }, + { + "download_count": 1669578, + "project": "daphne" + }, + { + "download_count": 1665895, + "project": "librosa" + }, + { + "download_count": 1665557, + "project": "pyelftools" + }, + { + "download_count": 1665384, + "project": "query-string" + }, + { + "download_count": 1663244, + "project": "pywinrm" + }, + { + "download_count": 1660863, + "project": "pyreadline" + }, + { + "download_count": 1657504, + "project": "ez-setup" + }, + { + "download_count": 1656438, + "project": "channels" + }, + { + "download_count": 1640299, + "project": "node-semver" + }, + { + "download_count": 1638276, + "project": "tensorboardx" + }, + { + "download_count": 1631659, + "project": "htmlmin" + }, + { + "download_count": 1625146, + "project": "tensorflow-datasets" + }, + { + "download_count": 1624914, + "project": "audioread" + }, + { + "download_count": 1621703, + "project": "couchdb" + }, + { + "download_count": 1618223, + "project": "google-reauth" + }, + { + "download_count": 1616648, + "project": "google-cloud-redis" + }, + { + "download_count": 1615335, + "project": "autograd" + }, + { + "download_count": 1609038, + "project": "rollbar" + }, + { + "download_count": 1608426, + "project": "pyu2f" + }, + { + "download_count": 1603406, + "project": "iptools" + }, + { + "download_count": 1601716, + "project": "compatibility-lib" + }, + { + "download_count": 1599718, + "project": "google-cloud-asset" + }, + { + "download_count": 1599709, + "project": "azure-mgmt-privatedns" + }, + { + "download_count": 1596670, + "project": "python-decouple" + }, + { + "download_count": 1592734, + "project": "oslo-concurrency" + }, + { + "download_count": 1590149, + "project": "mongomock" + }, + { + "download_count": 1590067, + "project": "fluent-logger" + }, + { + "download_count": 1589332, + "project": "pygrok" + }, + { + "download_count": 1586920, + "project": "rauth" + }, + { + "download_count": 1585024, + "project": "probableparsing" + }, + { + "download_count": 1580625, + "project": "dominate" + }, + { + "download_count": 1577725, + "project": "pykerberos" + }, + { + "download_count": 1577380, + "project": "pyramid" + }, + { + "download_count": 1575279, + "project": "flask-cache" + }, + { + "download_count": 1575048, + "project": "pytest-cache" + }, + { + "download_count": 1574450, + "project": "pyee" + }, + { + "download_count": 1572539, + "project": "bingads" + }, + { + "download_count": 1569151, + "project": "appium-python-client" + }, + { + "download_count": 1567159, + "project": "pygam" + }, + { + "download_count": 1564680, + "project": "fysom" + }, + { + "download_count": 1563117, + "project": "tempita" + }, + { + "download_count": 1561979, + "project": "pywin32-ctypes" + }, + { + "download_count": 1561323, + "project": "diskcache" + }, + { + "download_count": 1558407, + "project": "pyhs2" + }, + { + "download_count": 1556417, + "project": "frozendict" + }, + { + "download_count": 1556392, + "project": "immutables" + }, + { + "download_count": 1550611, + "project": "python-neutronclient" + }, + { + "download_count": 1549879, + "project": "gspread-dataframe" + }, + { + "download_count": 1545947, + "project": "pyro4" + }, + { + "download_count": 1539049, + "project": "vertica-python" + }, + { + "download_count": 1538249, + "project": "google-cloud-securitycenter" + }, + { + "download_count": 1532048, + "project": "m3u8" + }, + { + "download_count": 1530674, + "project": "serpent" + }, + { + "download_count": 1527389, + "project": "aiobotocore" + }, + { + "download_count": 1526900, + "project": "django-reversion" + }, + { + "download_count": 1525911, + "project": "tox-travis" + }, + { + "download_count": 1524549, + "project": "pluginbase" + }, + { + "download_count": 1523680, + "project": "google-cloud-iot" + }, + { + "download_count": 1523139, + "project": "pykafka" + }, + { + "download_count": 1522621, + "project": "anyconfig" + }, + { + "download_count": 1520539, + "project": "pyjwkest" + }, + { + "download_count": 1520176, + "project": "django-formtools" + }, + { + "download_count": 1519701, + "project": "vowpalwabbit" + }, + { + "download_count": 1518864, + "project": "gprof2dot" + }, + { + "download_count": 1517841, + "project": "presto-python-client" + }, + { + "download_count": 1515284, + "project": "delorean" + }, + { + "download_count": 1514817, + "project": "json5" + }, + { + "download_count": 1511462, + "project": "num2words" + }, + { + "download_count": 1507178, + "project": "pylibmc" + }, + { + "download_count": 1505966, + "project": "httpagentparser" + }, + { + "download_count": 1504331, + "project": "drf-nested-routers" + }, + { + "download_count": 1504075, + "project": "icalendar" + }, + { + "download_count": 1503765, + "project": "google-cloud-websecurityscanner" + }, + { + "download_count": 1501399, + "project": "lru-dict" + }, + { + "download_count": 1496923, + "project": "cloudant" + }, + { + "download_count": 1493340, + "project": "keyrings-alt" + }, + { + "download_count": 1492739, + "project": "cattrs" + }, + { + "download_count": 1491297, + "project": "model-mommy" + }, + { + "download_count": 1490933, + "project": "jenkinsapi" + }, + { + "download_count": 1488901, + "project": "workalendar" + }, + { + "download_count": 1486683, + "project": "lifetimes" + }, + { + "download_count": 1484449, + "project": "sseclient-py" + }, + { + "download_count": 1481519, + "project": "python-etcd" + }, + { + "download_count": 1480386, + "project": "testinfra" + }, + { + "download_count": 1479219, + "project": "sentencepiece" + }, + { + "download_count": 1479194, + "project": "scikit-optimize" + }, + { + "download_count": 1477712, + "project": "flask-responses" + }, + { + "download_count": 1468207, + "project": "django-polymorphic" + }, + { + "download_count": 1467601, + "project": "azure-mgmt-deploymentmanager" + }, + { + "download_count": 1464092, + "project": "routes" + }, + { + "download_count": 1463152, + "project": "editdistance" + }, + { + "download_count": 1460523, + "project": "bugsnag" + }, + { + "download_count": 1453426, + "project": "conan" + }, + { + "download_count": 1449766, + "project": "autowrapt" + }, + { + "download_count": 1448235, + "project": "fasttext" + }, + { + "download_count": 1445709, + "project": "django-rest-auth" + }, + { + "download_count": 1444092, + "project": "catboost" + }, + { + "download_count": 1442809, + "project": "pydash" + }, + { + "download_count": 1442503, + "project": "libsass" + }, + { + "download_count": 1441996, + "project": "importlib" + }, + { + "download_count": 1440920, + "project": "pytest-flask" + }, + { + "download_count": 1440731, + "project": "django-simple-history" + }, + { + "download_count": 1439129, + "project": "django-picklefield" + }, + { + "download_count": 1437255, + "project": "trollius" + }, + { + "download_count": 1433413, + "project": "ml-metadata" + }, + { + "download_count": 1428493, + "project": "port-for" + }, + { + "download_count": 1426881, + "project": "flake8-bugbear" + }, + { + "download_count": 1425070, + "project": "python-nmap" + }, + { + "download_count": 1424275, + "project": "newlinejson" + }, + { + "download_count": 1423507, + "project": "pytest-benchmark" + }, + { + "download_count": 1422061, + "project": "hacking" + }, + { + "download_count": 1420833, + "project": "ratelim" + }, + { + "download_count": 1416683, + "project": "rdflib" + }, + { + "download_count": 1415247, + "project": "ninja" + }, + { + "download_count": 1413811, + "project": "geocoder" + }, + { + "download_count": 1413778, + "project": "parsimonious" + }, + { + "download_count": 1409060, + "project": "xmlsec" + }, + { + "download_count": 1407612, + "project": "jsonpath-ng" + }, + { + "download_count": 1404958, + "project": "authy" + }, + { + "download_count": 1399670, + "project": "python3-saml" + }, + { + "download_count": 1399023, + "project": "django-ratelimit" + }, + { + "download_count": 1398229, + "project": "watson-machine-learning-client" + }, + { + "download_count": 1397882, + "project": "motor" + }, + { + "download_count": 1397503, + "project": "pyusb" + }, + { + "download_count": 1393071, + "project": "eli5" + }, + { + "download_count": 1392124, + "project": "facebook-sdk" + }, + { + "download_count": 1391265, + "project": "py-zabbix" + }, + { + "download_count": 1390039, + "project": "threatconnect" + }, + { + "download_count": 1389772, + "project": "github3-py" + }, + { + "download_count": 1384962, + "project": "dash-renderer" + }, + { + "download_count": 1384373, + "project": "pyzipcode3" + }, + { + "download_count": 1384208, + "project": "transaction" + }, + { + "download_count": 1377748, + "project": "dash" + }, + { + "download_count": 1377392, + "project": "contextvars" + }, + { + "download_count": 1375491, + "project": "pyppeteer" + }, + { + "download_count": 1374745, + "project": "imutils" + }, + { + "download_count": 1373022, + "project": "predicthq" + }, + { + "download_count": 1371449, + "project": "furl" + }, + { + "download_count": 1370079, + "project": "graypy" + }, + { + "download_count": 1368582, + "project": "ipy" + }, + { + "download_count": 1365609, + "project": "apache-libcloud" + }, + { + "download_count": 1363504, + "project": "langid" + }, + { + "download_count": 1362248, + "project": "happybase" + }, + { + "download_count": 1362080, + "project": "wand" + }, + { + "download_count": 1359167, + "project": "dash-core-components" + }, + { + "download_count": 1355835, + "project": "teamcity-messages" + }, + { + "download_count": 1353938, + "project": "django-treebeard" + }, + { + "download_count": 1353094, + "project": "bottleneck" + }, + { + "download_count": 1347193, + "project": "pipdeptree" + }, + { + "download_count": 1346804, + "project": "flask-socketio" + }, + { + "download_count": 1345086, + "project": "feather-format" + }, + { + "download_count": 1345015, + "project": "pyshp" + }, + { + "download_count": 1340081, + "project": "cerberus-python-client" + }, + { + "download_count": 1339531, + "project": "pytest-ordering" + }, + { + "download_count": 1337974, + "project": "dateutils" + }, + { + "download_count": 1337690, + "project": "ccy" + }, + { + "download_count": 1336766, + "project": "ec2-metadata" + }, + { + "download_count": 1336028, + "project": "gevent-websocket" + }, + { + "download_count": 1333439, + "project": "pyenchant" + }, + { + "download_count": 1333043, + "project": "pykwalify" + }, + { + "download_count": 1331164, + "project": "ptable" + }, + { + "download_count": 1324399, + "project": "dash-html-components" + }, + { + "download_count": 1323369, + "project": "wmctrl" + }, + { + "download_count": 1322854, + "project": "markdown2" + }, + { + "download_count": 1320709, + "project": "fancycompleter" + }, + { + "download_count": 1320502, + "project": "genson" + }, + { + "download_count": 1317756, + "project": "pyhocon" + }, + { + "download_count": 1317236, + "project": "pdbpp" + }, + { + "download_count": 1316522, + "project": "crc16" + }, + { + "download_count": 1310312, + "project": "gnupg" + }, + { + "download_count": 1306934, + "project": "palettable" + }, + { + "download_count": 1306842, + "project": "fake-factory" + }, + { + "download_count": 1302234, + "project": "bson" + }, + { + "download_count": 1293536, + "project": "jsonpath-rw-ext" + }, + { + "download_count": 1291830, + "project": "graphene-django" + }, + { + "download_count": 1288532, + "project": "elasticsearch-curator" + }, + { + "download_count": 1287159, + "project": "agate" + }, + { + "download_count": 1286419, + "project": "pyluach" + }, + { + "download_count": 1276264, + "project": "pytoml" + }, + { + "download_count": 1275859, + "project": "xhtml2pdf" + }, + { + "download_count": 1275165, + "project": "mandrill" + }, + { + "download_count": 1274724, + "project": "aws-sam-cli" + }, + { + "download_count": 1274476, + "project": "aws-lambda-builders" + }, + { + "download_count": 1274226, + "project": "algoliasearch" + }, + { + "download_count": 1273921, + "project": "hupper" + }, + { + "download_count": 1261688, + "project": "testscenarios" + }, + { + "download_count": 1259972, + "project": "cufflinks" + }, + { + "download_count": 1258105, + "project": "signalfx" + }, + { + "download_count": 1257144, + "project": "moviepy" + }, + { + "download_count": 1255798, + "project": "objgraph" + }, + { + "download_count": 1252062, + "project": "chevron" + }, + { + "download_count": 1235194, + "project": "pdf2image" + }, + { + "download_count": 1234160, + "project": "uvicorn" + }, + { + "download_count": 1233486, + "project": "tlslite" + }, + { + "download_count": 1231831, + "project": "pybase64" + }, + { + "download_count": 1230654, + "project": "createsend" + }, + { + "download_count": 1230170, + "project": "gql" + }, + { + "download_count": 1230039, + "project": "imagehash" + }, + { + "download_count": 1228048, + "project": "azureml-defaults" + }, + { + "download_count": 1227477, + "project": "azure-mgmt-imagebuilder" + }, + { + "download_count": 1226165, + "project": "serverlessrepo" + }, + { + "download_count": 1221206, + "project": "pytest-watch" + }, + { + "download_count": 1220741, + "project": "google-cloud-bigquery-storage" + }, + { + "download_count": 1218278, + "project": "django-ses" + }, + { + "download_count": 1217113, + "project": "luminol" + }, + { + "download_count": 1213653, + "project": "pyaes" + }, + { + "download_count": 1213392, + "project": "flask-mongoalchemy" + }, + { + "download_count": 1212483, + "project": "flake8-print" + }, + { + "download_count": 1208573, + "project": "resource" + }, + { + "download_count": 1207795, + "project": "stemming" + }, + { + "download_count": 1206452, + "project": "python-easyconfig" + }, + { + "download_count": 1206109, + "project": "jsonform" + }, + { + "download_count": 1205968, + "project": "jsonsir" + }, + { + "download_count": 1202856, + "project": "logbook" + }, + { + "download_count": 1198077, + "project": "import-from-github-com" + }, + { + "download_count": 1195471, + "project": "mss" + }, + { + "download_count": 1195405, + "project": "robotframework-requests" + }, + { + "download_count": 1194828, + "project": "nose2" + }, + { + "download_count": 1194314, + "project": "fusepy" + }, + { + "download_count": 1193288, + "project": "cmake" + }, + { + "download_count": 1192641, + "project": "httpbin" + }, + { + "download_count": 1190084, + "project": "graphql-server-core" + }, + { + "download_count": 1189375, + "project": "stestr" + }, + { + "download_count": 1188229, + "project": "recordclass" + }, + { + "download_count": 1186101, + "project": "django-bootstrap4" + }, + { + "download_count": 1181472, + "project": "tree-format" + }, + { + "download_count": 1180564, + "project": "django-guardian" + }, + { + "download_count": 1180286, + "project": "django-celery" + }, + { + "download_count": 1179046, + "project": "publicsuffix" + }, + { + "download_count": 1178235, + "project": "astropy" + }, + { + "download_count": 1177835, + "project": "konlpy" + }, + { + "download_count": 1174516, + "project": "threadloop" + }, + { + "download_count": 1174367, + "project": "radon" + }, + { + "download_count": 1172767, + "project": "azure-cli-profile" + }, + { + "download_count": 1172663, + "project": "jieba" + }, + { + "download_count": 1172300, + "project": "pyfakefs" + }, + { + "download_count": 1172278, + "project": "namedlist" + }, + { + "download_count": 1171988, + "project": "pubnub" + }, + { + "download_count": 1170778, + "project": "flasgger" + }, + { + "download_count": 1168270, + "project": "pymeeus" + }, + { + "download_count": 1164230, + "project": "transitions" + }, + { + "download_count": 1163775, + "project": "visitor" + }, + { + "download_count": 1161777, + "project": "django-redis-cache" + }, + { + "download_count": 1161264, + "project": "lmdb" + }, + { + "download_count": 1160572, + "project": "json-logging-py" + }, + { + "download_count": 1159436, + "project": "protobuf3-to-dict" + }, + { + "download_count": 1153262, + "project": "patch" + }, + { + "download_count": 1152875, + "project": "horovod" + }, + { + "download_count": 1152461, + "project": "pyzabbix" + }, + { + "download_count": 1148339, + "project": "tailer" + }, + { + "download_count": 1146680, + "project": "azure-cli-resource" + }, + { + "download_count": 1145300, + "project": "etcd3" + }, + { + "download_count": 1143148, + "project": "azure-cli-iot" + }, + { + "download_count": 1143069, + "project": "djangorestframework-xml" + }, + { + "download_count": 1139676, + "project": "logutils" + }, + { + "download_count": 1138222, + "project": "javaproperties" + }, + { + "download_count": 1137231, + "project": "azure-cli-extension" + }, + { + "download_count": 1137033, + "project": "python-telegram-bot" + }, + { + "download_count": 1135140, + "project": "platformio" + }, + { + "download_count": 1134846, + "project": "xvfbwrapper" + }, + { + "download_count": 1133241, + "project": "pytest-pythonpath" + }, + { + "download_count": 1129508, + "project": "google-cloud-iam" + }, + { + "download_count": 1129177, + "project": "pydrive" + }, + { + "download_count": 1128895, + "project": "minio" + }, + { + "download_count": 1128310, + "project": "python-heatclient" + }, + { + "download_count": 1127447, + "project": "azure-cli-dls" + }, + { + "download_count": 1127383, + "project": "demjson" + }, + { + "download_count": 1126928, + "project": "pygal" + }, + { + "download_count": 1123556, + "project": "azure-cli-role" + }, + { + "download_count": 1123087, + "project": "azure-cli-monitor" + }, + { + "download_count": 1121560, + "project": "azure-cli-storage" + }, + { + "download_count": 1121500, + "project": "azure-cli-sql" + }, + { + "download_count": 1121354, + "project": "azure-cli-keyvault" + }, + { + "download_count": 1121021, + "project": "azure-cli-network" + }, + { + "download_count": 1120955, + "project": "azure-cli-interactive" + }, + { + "download_count": 1120732, + "project": "azure-cli-container" + }, + { + "download_count": 1120661, + "project": "azure-cli-appservice" + }, + { + "download_count": 1120619, + "project": "azure-cli-lab" + }, + { + "download_count": 1120596, + "project": "pydub" + }, + { + "download_count": 1120448, + "project": "azure-cli-acr" + }, + { + "download_count": 1120440, + "project": "pem" + }, + { + "download_count": 1119943, + "project": "azure-cli-acs" + }, + { + "download_count": 1119731, + "project": "azure-cli-cognitiveservices" + }, + { + "download_count": 1118667, + "project": "azure-cli-batch" + }, + { + "download_count": 1118554, + "project": "azure-cli-rdbms" + }, + { + "download_count": 1118179, + "project": "dumbyaml" + }, + { + "download_count": 1118164, + "project": "azure-cli-cosmosdb" + }, + { + "download_count": 1117990, + "project": "azure-cli-dla" + }, + { + "download_count": 1117671, + "project": "azure-cli-vm" + }, + { + "download_count": 1117663, + "project": "graphite-web" + }, + { + "download_count": 1117633, + "project": "easy-thumbnails" + }, + { + "download_count": 1117629, + "project": "ggplot" + }, + { + "download_count": 1117326, + "project": "ncclient" + }, + { + "download_count": 1115734, + "project": "azure-cli-cdn" + }, + { + "download_count": 1115095, + "project": "ipyparallel" + }, + { + "download_count": 1114052, + "project": "uritemplate-py" + }, + { + "download_count": 1113849, + "project": "azure-cli-servicefabric" + }, + { + "download_count": 1112830, + "project": "azure-cli-batchai" + }, + { + "download_count": 1112111, + "project": "colander" + }, + { + "download_count": 1112004, + "project": "libhoney" + }, + { + "download_count": 1111031, + "project": "robotframework-selenium2library" + }, + { + "download_count": 1110924, + "project": "azure-cli-reservations" + }, + { + "download_count": 1110554, + "project": "selectors34" + }, + { + "download_count": 1109781, + "project": "python-redis-lock" + }, + { + "download_count": 1109474, + "project": "django-waffle" + }, + { + "download_count": 1109341, + "project": "construct" + }, + { + "download_count": 1107612, + "project": "pyhcl" + }, + { + "download_count": 1107023, + "project": "allure-python-commons" + }, + { + "download_count": 1106855, + "project": "opencv-python-headless" + }, + { + "download_count": 1104732, + "project": "nibabel" + }, + { + "download_count": 1104394, + "project": "ntplib" + }, + { + "download_count": 1101855, + "project": "gsutil" + }, + { + "download_count": 1099271, + "project": "python-redis" + }, + { + "download_count": 1099171, + "project": "honeycomb-beeline" + }, + { + "download_count": 1095266, + "project": "google-cloud-profiler" + }, + { + "download_count": 1094548, + "project": "djangorestframework-csv" + }, + { + "download_count": 1093507, + "project": "imageio-ffmpeg" + }, + { + "download_count": 1093006, + "project": "rpyc" + }, + { + "download_count": 1092127, + "project": "databricks-api" + }, + { + "download_count": 1091012, + "project": "django-otp" + }, + { + "download_count": 1089786, + "project": "atlassian-jwt-auth" + }, + { + "download_count": 1089668, + "project": "pyscreeze" + }, + { + "download_count": 1088119, + "project": "jsonlines" + }, + { + "download_count": 1087785, + "project": "google-cloud-scheduler" + }, + { + "download_count": 1086837, + "project": "py-moneyed" + }, + { + "download_count": 1086168, + "project": "prospector" + }, + { + "download_count": 1084845, + "project": "pyfcm" + }, + { + "download_count": 1084588, + "project": "leather" + }, + { + "download_count": 1083842, + "project": "flask-session" + }, + { + "download_count": 1083772, + "project": "flask-principal" + }, + { + "download_count": 1081797, + "project": "azure-mgmt-managedservices" + }, + { + "download_count": 1080061, + "project": "zope-sqlalchemy" + }, + { + "download_count": 1079118, + "project": "wikipedia" + }, + { + "download_count": 1078680, + "project": "pyopengl" + }, + { + "download_count": 1077281, + "project": "django-anymail" + }, + { + "download_count": 1075981, + "project": "cov-core" + }, + { + "download_count": 1075897, + "project": "azure-mgmt-netapp" + }, + { + "download_count": 1074798, + "project": "pytest-flake8" + }, + { + "download_count": 1071887, + "project": "requests-cache" + }, + { + "download_count": 1071617, + "project": "plaster-pastedeploy" + }, + { + "download_count": 1071057, + "project": "boxsdk" + }, + { + "download_count": 1070181, + "project": "numpydoc" + }, + { + "download_count": 1069130, + "project": "dodgy" + }, + { + "download_count": 1067802, + "project": "sphinxcontrib-httpdomain" + }, + { + "download_count": 1067667, + "project": "git-url-parse" + }, + { + "download_count": 1065839, + "project": "restructuredtext-lint" + }, + { + "download_count": 1063327, + "project": "django-storages-redux" + }, + { + "download_count": 1061635, + "project": "h2o-pysparkling-2-4" + }, + { + "download_count": 1060942, + "project": "flatbuffers" + }, + { + "download_count": 1059650, + "project": "webassets" + }, + { + "download_count": 1057175, + "project": "gdata" + }, + { + "download_count": 1055836, + "project": "pytest-pep8" + }, + { + "download_count": 1054787, + "project": "setoptconf" + }, + { + "download_count": 1053777, + "project": "flask-graphql" + }, + { + "download_count": 1051978, + "project": "lark-parser" + }, + { + "download_count": 1046552, + "project": "google-cloud-datacatalog" + }, + { + "download_count": 1045356, + "project": "requirements-detector" + }, + { + "download_count": 1043870, + "project": "google-cloud-talent" + }, + { + "download_count": 1043546, + "project": "utils" + }, + { + "download_count": 1043075, + "project": "google-cloud-datalabeling" + }, + { + "download_count": 1042791, + "project": "django-mailgun" + }, + { + "download_count": 1041833, + "project": "google-cloud-os-login" + }, + { + "download_count": 1040789, + "project": "plaster" + }, + { + "download_count": 1040645, + "project": "google-cloud-webrisk" + }, + { + "download_count": 1040329, + "project": "beaker" + }, + { + "download_count": 1039677, + "project": "django-fsm" + }, + { + "download_count": 1039618, + "project": "grpcio-health-checking" + }, + { + "download_count": 1039569, + "project": "flask-apispec" + }, + { + "download_count": 1037586, + "project": "flake8-comprehensions" + }, + { + "download_count": 1036471, + "project": "pylint-flask" + }, + { + "download_count": 1036185, + "project": "pygerduty" + }, + { + "download_count": 1036096, + "project": "pudb" + }, + { + "download_count": 1036044, + "project": "biopython" + }, + { + "download_count": 1035148, + "project": "brewer2mpl" + }, + { + "download_count": 1034346, + "project": "rpy2" + }, + { + "download_count": 1033958, + "project": "dash-table" + }, + { + "download_count": 1033827, + "project": "base58" + }, + { + "download_count": 1033818, + "project": "proto-google-cloud-pubsub-v1" + }, + { + "download_count": 1033419, + "project": "maxminddb-geolite2" + }, + { + "download_count": 1032216, + "project": "bravado-core" + }, + { + "download_count": 1031978, + "project": "starlette" + }, + { + "download_count": 1031797, + "project": "cftime" + }, + { + "download_count": 1030527, + "project": "papermill" + }, + { + "download_count": 1030356, + "project": "pytest-aiohttp" + }, + { + "download_count": 1028784, + "project": "neotime" + }, + { + "download_count": 1028024, + "project": "django-grappelli" + }, + { + "download_count": 1026556, + "project": "csvkit" + }, + { + "download_count": 1026453, + "project": "azure-mgmt-appconfiguration" + }, + { + "download_count": 1025532, + "project": "mando" + }, + { + "download_count": 1025061, + "project": "python-pptx" + }, + { + "download_count": 1024849, + "project": "futurist" + }, + { + "download_count": 1024564, + "project": "tfx" + }, + { + "download_count": 1023148, + "project": "shyaml" + }, + { + "download_count": 1020560, + "project": "whoosh" + }, + { + "download_count": 1019249, + "project": "netcdf4" + }, + { + "download_count": 1018441, + "project": "braintree" + }, + { + "download_count": 1017498, + "project": "pylint-celery" + }, + { + "download_count": 1015935, + "project": "pyautogui" + }, + { + "download_count": 1015329, + "project": "uritools" + }, + { + "download_count": 1014941, + "project": "openshift" + }, + { + "download_count": 1014682, + "project": "jinjasql" + }, + { + "download_count": 1011470, + "project": "bunch" + }, + { + "download_count": 1011345, + "project": "tribool" + }, + { + "download_count": 1010041, + "project": "shade" + }, + { + "download_count": 1009923, + "project": "geoalchemy2" + }, + { + "download_count": 1007914, + "project": "stups-tokens" + }, + { + "download_count": 1007728, + "project": "django-health-check" + }, + { + "download_count": 1006511, + "project": "ansiwrap" + }, + { + "download_count": 1005973, + "project": "djangorestframework-simplejwt" + }, + { + "download_count": 1004447, + "project": "repoze-who" + }, + { + "download_count": 1003341, + "project": "u-msgpack-python" + }, + { + "download_count": 1002884, + "project": "psycogreen" + }, + { + "download_count": 1002180, + "project": "pyroute2" + }, + { + "download_count": 997107, + "project": "impyla" + }, + { + "download_count": 997057, + "project": "functools" + }, + { + "download_count": 995470, + "project": "rq-scheduler" + }, + { + "download_count": 995174, + "project": "xarray" + }, + { + "download_count": 995018, + "project": "dictionaries" + }, + { + "download_count": 995017, + "project": "django-haystack" + }, + { + "download_count": 992160, + "project": "check-manifest" + }, + { + "download_count": 990507, + "project": "python-rapidjson" + }, + { + "download_count": 989611, + "project": "py-vapid" + }, + { + "download_count": 989525, + "project": "textwrap3" + }, + { + "download_count": 988451, + "project": "soundfile" + }, + { + "download_count": 987924, + "project": "python-string-utils" + }, + { + "download_count": 987136, + "project": "pywinauto" + }, + { + "download_count": 985267, + "project": "oslo-db" + }, + { + "download_count": 984514, + "project": "xmlrunner" + }, + { + "download_count": 983293, + "project": "pymdown-extensions" + }, + { + "download_count": 982272, + "project": "sphinx-autobuild" + }, + { + "download_count": 981717, + "project": "django-ckeditor" + }, + { + "download_count": 979521, + "project": "sorl-thumbnail" + }, + { + "download_count": 979220, + "project": "pysmb" + }, + { + "download_count": 978290, + "project": "pymsgbox" + }, + { + "download_count": 977363, + "project": "gapic-google-cloud-pubsub-v1" + }, + { + "download_count": 977316, + "project": "flake8-isort" + }, + { + "download_count": 976939, + "project": "tensorflow-probability" + }, + { + "download_count": 976069, + "project": "oslo-messaging" + }, + { + "download_count": 975772, + "project": "python-coveralls" + }, + { + "download_count": 975418, + "project": "flex" + }, + { + "download_count": 973597, + "project": "seleniumbase" + }, + { + "download_count": 972851, + "project": "flake8-commas" + }, + { + "download_count": 972025, + "project": "dirq" + }, + { + "download_count": 971725, + "project": "glfw" + }, + { + "download_count": 968128, + "project": "trains" + }, + { + "download_count": 967325, + "project": "hjson" + }, + { + "download_count": 966886, + "project": "fs" + }, + { + "download_count": 965395, + "project": "pyahocorasick" + }, + { + "download_count": 965068, + "project": "pytest-repeat" + }, + { + "download_count": 964628, + "project": "swagger-ui-bundle" + }, + { + "download_count": 964597, + "project": "typing-inspect" + }, + { + "download_count": 964448, + "project": "sagemaker" + }, + { + "download_count": 964057, + "project": "vobject" + }, + { + "download_count": 963489, + "project": "dbfread" + }, + { + "download_count": 962456, + "project": "bidict" + }, + { + "download_count": 960677, + "project": "google-python-cloud-debugger" + }, + { + "download_count": 958036, + "project": "cognite-sdk" + }, + { + "download_count": 957690, + "project": "vulture" + }, + { + "download_count": 957559, + "project": "pytweening" + }, + { + "download_count": 954913, + "project": "circleci" + }, + { + "download_count": 954734, + "project": "onnxmltools" + }, + { + "download_count": 953896, + "project": "django-jsonfield" + }, + { + "download_count": 952673, + "project": "skl2onnx" + }, + { + "download_count": 951906, + "project": "azure-cli-configure" + }, + { + "download_count": 951530, + "project": "readerwriterlock" + }, + { + "download_count": 951124, + "project": "django-silk" + }, + { + "download_count": 948790, + "project": "json-log-formatter" + }, + { + "download_count": 948696, + "project": "stups-zign" + }, + { + "download_count": 948084, + "project": "commentjson" + }, + { + "download_count": 947759, + "project": "opentracing-instrumentation" + }, + { + "download_count": 947140, + "project": "hurry-filesize" + }, + { + "download_count": 946596, + "project": "httpie" + }, + { + "download_count": 945434, + "project": "comtypes" + }, + { + "download_count": 944648, + "project": "azure-cli-cloud" + }, + { + "download_count": 942122, + "project": "stups-cli-support" + }, + { + "download_count": 941812, + "project": "textfsm" + }, + { + "download_count": 941227, + "project": "django-bulk-update" + }, + { + "download_count": 940485, + "project": "pydotplus" + }, + { + "download_count": 939994, + "project": "logilab-common" + }, + { + "download_count": 939219, + "project": "thriftpy2" + }, + { + "download_count": 937977, + "project": "pyldap" + }, + { + "download_count": 937103, + "project": "progressbar" + }, + { + "download_count": 936822, + "project": "limits" + }, + { + "download_count": 935302, + "project": "empy" + }, + { + "download_count": 933336, + "project": "interval" + }, + { + "download_count": 933102, + "project": "twitter-common-lang" + }, + { + "download_count": 932594, + "project": "sanic" + }, + { + "download_count": 932344, + "project": "twitter-common-dirutil" + }, + { + "download_count": 931618, + "project": "uhashring" + }, + { + "download_count": 929734, + "project": "asana" + }, + { + "download_count": 926851, + "project": "base64io" + }, + { + "download_count": 925789, + "project": "django-user-agents" + }, + { + "download_count": 924447, + "project": "reno" + }, + { + "download_count": 923715, + "project": "netmiko" + }, + { + "download_count": 923299, + "project": "twitter-common-options" + }, + { + "download_count": 923153, + "project": "twitter-common-log" + }, + { + "download_count": 923141, + "project": "parsley" + }, + { + "download_count": 921602, + "project": "azure-cli-find" + }, + { + "download_count": 920951, + "project": "azure-cli-redis" + }, + { + "download_count": 920654, + "project": "aws-encryption-sdk-cli" + }, + { + "download_count": 920109, + "project": "stop-words" + }, + { + "download_count": 919963, + "project": "azure-cli-consumption" + }, + { + "download_count": 919735, + "project": "pydevd" + }, + { + "download_count": 919608, + "project": "azure-cli-billing" + }, + { + "download_count": 919364, + "project": "azure-cli-feedback" + }, + { + "download_count": 919204, + "project": "click-log" + }, + { + "download_count": 916168, + "project": "pypd" + }, + { + "download_count": 914683, + "project": "azure-cli-advisor" + }, + { + "download_count": 914682, + "project": "neobolt" + }, + { + "download_count": 911537, + "project": "azure-cli-eventgrid" + }, + { + "download_count": 911471, + "project": "annoy" + }, + { + "download_count": 910544, + "project": "scramp" + }, + { + "download_count": 910046, + "project": "azure-cli-backup" + }, + { + "download_count": 908651, + "project": "flask-assets" + }, + { + "download_count": 908244, + "project": "oslo-service" + }, + { + "download_count": 905587, + "project": "flask-bootstrap" + }, + { + "download_count": 903282, + "project": "proglog" + }, + { + "download_count": 903200, + "project": "keras2onnx" + }, + { + "download_count": 902334, + "project": "plyvel" + }, + { + "download_count": 900779, + "project": "pybluez" + }, + { + "download_count": 899502, + "project": "pyudev" + }, + { + "download_count": 899012, + "project": "testrepository" + }, + { + "download_count": 898793, + "project": "oslo-policy" + }, + { + "download_count": 897914, + "project": "pmdarima" + }, + { + "download_count": 897653, + "project": "django-autocomplete-light" + }, + { + "download_count": 895791, + "project": "artifactory" + }, + { + "download_count": 895766, + "project": "pytest-variables" + }, + { + "download_count": 895437, + "project": "azure-cli-eventhubs" + }, + { + "download_count": 895142, + "project": "twitter-common-collections" + }, + { + "download_count": 894979, + "project": "azure-cli-servicebus" + }, + { + "download_count": 894815, + "project": "testresources" + }, + { + "download_count": 894191, + "project": "pybs" + }, + { + "download_count": 893842, + "project": "azure-cli-dms" + }, + { + "download_count": 893592, + "project": "channels-redis" + }, + { + "download_count": 893412, + "project": "junitparser" + }, + { + "download_count": 891540, + "project": "tifffile" + }, + { + "download_count": 891533, + "project": "easydict" + }, + { + "download_count": 891481, + "project": "json2parquet" + }, + { + "download_count": 891341, + "project": "pyicu" + }, + { + "download_count": 888690, + "project": "azure-cli-ams" + }, + { + "download_count": 886402, + "project": "pyeapi" + }, + { + "download_count": 885171, + "project": "python-gilt" + }, + { + "download_count": 884033, + "project": "azure-cli-search" + }, + { + "download_count": 882989, + "project": "jupyter-nbextensions-configurator" + }, + { + "download_count": 881790, + "project": "monthdelta" + }, + { + "download_count": 880765, + "project": "pynput" + }, + { + "download_count": 880406, + "project": "pyfiglet" + }, + { + "download_count": 878563, + "project": "jsonnet" + }, + { + "download_count": 874987, + "project": "pvlib" + }, + { + "download_count": 874000, + "project": "jupyter-contrib-core" + }, + { + "download_count": 872790, + "project": "mockito" + }, + { + "download_count": 872554, + "project": "nosexcover" + }, + { + "download_count": 872485, + "project": "peakutils" + }, + { + "download_count": 872331, + "project": "rednose" + }, + { + "download_count": 872127, + "project": "ansicolors" + }, + { + "download_count": 871498, + "project": "j2cli" + }, + { + "download_count": 868629, + "project": "awsiotpythonsdk" + }, + { + "download_count": 867297, + "project": "pywfm" + }, + { + "download_count": 866741, + "project": "lml" + }, + { + "download_count": 865346, + "project": "imblearn" + }, + { + "download_count": 863870, + "project": "openstackdocstheme" + }, + { + "download_count": 863120, + "project": "jupyter-contrib-nbextensions" + }, + { + "download_count": 860421, + "project": "molecule" + }, + { + "download_count": 858716, + "project": "zstandard" + }, + { + "download_count": 858408, + "project": "pyqrcode" + }, + { + "download_count": 856466, + "project": "line-profiler" + }, + { + "download_count": 856334, + "project": "flask-api" + }, + { + "download_count": 856299, + "project": "honcho" + }, + { + "download_count": 856226, + "project": "jplephem" + }, + { + "download_count": 855767, + "project": "rpqueue" + }, + { + "download_count": 854839, + "project": "autoflake" + }, + { + "download_count": 854260, + "project": "azure-mgmt-apimanagement" + }, + { + "download_count": 854182, + "project": "cognite-model-hosting" + }, + { + "download_count": 852933, + "project": "pytest-dependency" + }, + { + "download_count": 852580, + "project": "pytest-pylint" + }, + { + "download_count": 852418, + "project": "deepmerge" + }, + { + "download_count": 850683, + "project": "jupyter-latex-envs" + }, + { + "download_count": 849484, + "project": "polyline" + }, + { + "download_count": 849092, + "project": "yappi" + }, + { + "download_count": 849002, + "project": "logmatic-python" + }, + { + "download_count": 848508, + "project": "sgp4" + }, + { + "download_count": 848205, + "project": "onnxconverter-common" + }, + { + "download_count": 847724, + "project": "django-pipeline" + }, + { + "download_count": 847508, + "project": "envs" + }, + { + "download_count": 847487, + "project": "jupyter-highlight-selected-word" + }, + { + "download_count": 846088, + "project": "googletrans" + }, + { + "download_count": 845652, + "project": "mkdocs-material" + }, + { + "download_count": 845331, + "project": "django-bootstrap3" + }, + { + "download_count": 843583, + "project": "isoweek" + }, + { + "download_count": 843510, + "project": "image" + }, + { + "download_count": 842232, + "project": "solartime" + }, + { + "download_count": 841714, + "project": "flask-debugtoolbar" + }, + { + "download_count": 840214, + "project": "rasterio" + }, + { + "download_count": 839139, + "project": "diamond" + }, + { + "download_count": 837673, + "project": "mailchimp3" + }, + { + "download_count": 835610, + "project": "oslo-middleware" + }, + { + "download_count": 835257, + "project": "mutagen" + }, + { + "download_count": 834695, + "project": "catalogue" + }, + { + "download_count": 834133, + "project": "faulthandler" + }, + { + "download_count": 832671, + "project": "sacrebleu" + }, + { + "download_count": 832545, + "project": "python-jose-cryptodome" + }, + { + "download_count": 831517, + "project": "zeroconf" + }, + { + "download_count": 830534, + "project": "jinja2-pluralize" + }, + { + "download_count": 829948, + "project": "suds-py3" + }, + { + "download_count": 829228, + "project": "pandasql" + }, + { + "download_count": 828892, + "project": "logstash-formatter" + }, + { + "download_count": 828549, + "project": "lifelines" + }, + { + "download_count": 827727, + "project": "liac-arff" + }, + { + "download_count": 827554, + "project": "diff-cover" + }, + { + "download_count": 826205, + "project": "elastic-apm" + }, + { + "download_count": 826135, + "project": "django-coverage-plugin" + }, + { + "download_count": 825300, + "project": "skyfield" + }, + { + "download_count": 824924, + "project": "drf-extensions" + }, + { + "download_count": 823613, + "project": "databricks-pypi-extras" + }, + { + "download_count": 823180, + "project": "azure-cli-relay" + }, + { + "download_count": 822954, + "project": "azure-cli-iotcentral" + }, + { + "download_count": 822898, + "project": "azure-cli-hdinsight" + }, + { + "download_count": 822664, + "project": "azure-cli-maps" + }, + { + "download_count": 822562, + "project": "azure-cli-botservice" + }, + { + "download_count": 822180, + "project": "azure-cli-signalr" + }, + { + "download_count": 822129, + "project": "lime" + }, + { + "download_count": 821534, + "project": "transifex-client" + }, + { + "download_count": 820293, + "project": "azure-cli-policyinsights" + }, + { + "download_count": 819714, + "project": "django-classy-tags" + }, + { + "download_count": 818561, + "project": "clickhouse-driver" + }, + { + "download_count": 815459, + "project": "scrapy-splash" + }, + { + "download_count": 815166, + "project": "pybrake" + }, + { + "download_count": 814136, + "project": "carbon" + }, + { + "download_count": 813628, + "project": "wmi" + }, + { + "download_count": 810452, + "project": "python-ironicclient" + }, + { + "download_count": 808082, + "project": "pusher" + }, + { + "download_count": 806951, + "project": "datadiff" + }, + { + "download_count": 806876, + "project": "js2py" + }, + { + "download_count": 805430, + "project": "urlobject" + }, + { + "download_count": 804845, + "project": "tinydb" + }, + { + "download_count": 804621, + "project": "pytest-randomly" + }, + { + "download_count": 804371, + "project": "placebo" + }, + { + "download_count": 804270, + "project": "progress" + }, + { + "download_count": 804201, + "project": "nimbusml" + }, + { + "download_count": 803677, + "project": "ffmpeg-python" + }, + { + "download_count": 803390, + "project": "pandas-profiling" + }, + { + "download_count": 803033, + "project": "pyspark-flame" + }, + { + "download_count": 802518, + "project": "nose-xunitmp" + }, + { + "download_count": 801270, + "project": "ftputil" + }, + { + "download_count": 800466, + "project": "pyexcel-io" + }, + { + "download_count": 800452, + "project": "pysam" + }, + { + "download_count": 800033, + "project": "oslo-cache" + }, + { + "download_count": 799400, + "project": "jinja2schema" + }, + { + "download_count": 797811, + "project": "skyfield-data" + }, + { + "download_count": 797080, + "project": "bashate" + }, + { + "download_count": 796778, + "project": "pytest-base-url" + }, + { + "download_count": 795722, + "project": "mpld3" + }, + { + "download_count": 795138, + "project": "pytest-selenium" + }, + { + "download_count": 794945, + "project": "facebookads" + }, + { + "download_count": 792726, + "project": "testing-common-database" + }, + { + "download_count": 792699, + "project": "requests-unixsocket" + }, + { + "download_count": 791454, + "project": "ansible-tower-cli" + }, + { + "download_count": 790178, + "project": "dlib" + }, + { + "download_count": 788016, + "project": "web3" + }, + { + "download_count": 787379, + "project": "pygresql" + }, + { + "download_count": 786501, + "project": "update-checker" + }, + { + "download_count": 784385, + "project": "pygetwindow" + }, + { + "download_count": 783264, + "project": "allure-pytest" + }, + { + "download_count": 782719, + "project": "pycontracts" + }, + { + "download_count": 782492, + "project": "wsgi-request-logger" + }, + { + "download_count": 780141, + "project": "m2crypto" + }, + { + "download_count": 779854, + "project": "scrapyd" + }, + { + "download_count": 779681, + "project": "centrosome" + }, + { + "download_count": 779517, + "project": "flask-mongoengine" + }, + { + "download_count": 778027, + "project": "dataclasses-json" + }, + { + "download_count": 777762, + "project": "splinter" + }, + { + "download_count": 777345, + "project": "htmlparser" + }, + { + "download_count": 775376, + "project": "loguru" + }, + { + "download_count": 774793, + "project": "dumb-init" + }, + { + "download_count": 774504, + "project": "python-designateclient" + }, + { + "download_count": 774495, + "project": "speaklater" + }, + { + "download_count": 773679, + "project": "eth-utils" + }, + { + "download_count": 772719, + "project": "spark-df-profiling" + }, + { + "download_count": 772355, + "project": "javabridge" + }, + { + "download_count": 771179, + "project": "us" + }, + { + "download_count": 769552, + "project": "xdg" + }, + { + "download_count": 769306, + "project": "librabbitmq" + }, + { + "download_count": 769240, + "project": "lepl" + }, + { + "download_count": 769163, + "project": "pysolr" + }, + { + "download_count": 768526, + "project": "google-cloud-happybase" + }, + { + "download_count": 768426, + "project": "graphene-sqlalchemy" + }, + { + "download_count": 768057, + "project": "google-endpoints-api-management" + }, + { + "download_count": 767991, + "project": "affine" + }, + { + "download_count": 767570, + "project": "colour" + }, + { + "download_count": 764562, + "project": "django-constance" + }, + { + "download_count": 762359, + "project": "infinity" + }, + { + "download_count": 761920, + "project": "djangorestframework-filters" + }, + { + "download_count": 760164, + "project": "robotremoteserver" + }, + { + "download_count": 759992, + "project": "keystonemiddleware" + }, + { + "download_count": 758677, + "project": "distribute" + }, + { + "download_count": 757044, + "project": "hyper" + }, + { + "download_count": 755707, + "project": "pyscreenshot" + }, + { + "download_count": 755554, + "project": "google-endpoints" + }, + { + "download_count": 754592, + "project": "intervals" + }, + { + "download_count": 754564, + "project": "pysal" + }, + { + "download_count": 754317, + "project": "svgwrite" + }, + { + "download_count": 753732, + "project": "cognite-logger" + }, + { + "download_count": 753586, + "project": "pytest-spark" + }, + { + "download_count": 753503, + "project": "nose-parallel" + }, + { + "download_count": 753048, + "project": "dynaconf" + }, + { + "download_count": 752651, + "project": "mahotas" + }, + { + "download_count": 751112, + "project": "databricks-pypi" + }, + { + "download_count": 749141, + "project": "mysql" + }, + { + "download_count": 749102, + "project": "flake8-builtins" + }, + { + "download_count": 748778, + "project": "humpty" + }, + { + "download_count": 748490, + "project": "pyspark-dist-explore" + }, + { + "download_count": 746836, + "project": "django-annoying" + }, + { + "download_count": 746781, + "project": "tinyrpc" + }, + { + "download_count": 746415, + "project": "wincertstore" + }, + { + "download_count": 745591, + "project": "django-axes" + }, + { + "download_count": 742692, + "project": "aerospike" + }, + { + "download_count": 739560, + "project": "pycadf" + }, + { + "download_count": 739333, + "project": "django-csp" + }, + { + "download_count": 737212, + "project": "django-compat" + }, + { + "download_count": 735567, + "project": "azure-cli-security" + }, + { + "download_count": 735347, + "project": "asyncssh" + }, + { + "download_count": 734370, + "project": "robotframework-sshlibrary" + }, + { + "download_count": 734265, + "project": "concurrentloghandler" + }, + { + "download_count": 734033, + "project": "django-object-actions" + }, + { + "download_count": 733362, + "project": "azure-cli-kusto" + }, + { + "download_count": 733347, + "project": "tensorflowonspark" + }, + { + "download_count": 732849, + "project": "aioresponses" + }, + { + "download_count": 731576, + "project": "jenkins-job-builder" + }, + { + "download_count": 731088, + "project": "bravado" + }, + { + "download_count": 728665, + "project": "prometheus-flask-exporter" + }, + { + "download_count": 727540, + "project": "pprint" + }, + { + "download_count": 726931, + "project": "jaeger-client" + }, + { + "download_count": 726893, + "project": "nose-parameterized" + }, + { + "download_count": 726613, + "project": "pyrect" + }, + { + "download_count": 726590, + "project": "htcondor" + }, + { + "download_count": 723307, + "project": "pip-licenses" + }, + { + "download_count": 723172, + "project": "mlxtend" + }, + { + "download_count": 721353, + "project": "py2-ipaddress" + }, + { + "download_count": 719973, + "project": "osprofiler" + }, + { + "download_count": 719532, + "project": "pandas-datareader" + }, + { + "download_count": 718534, + "project": "ngram" + }, + { + "download_count": 718362, + "project": "h2o" + }, + { + "download_count": 717198, + "project": "homeassistant" + }, + { + "download_count": 716605, + "project": "pytest-mypy" + }, + { + "download_count": 716398, + "project": "eth-typing" + }, + { + "download_count": 716263, + "project": "django-auth-ldap" + }, + { + "download_count": 714558, + "project": "jsonmerge" + }, + { + "download_count": 714088, + "project": "django-cacheops" + }, + { + "download_count": 713825, + "project": "python-bioformats" + }, + { + "download_count": 713644, + "project": "stomp-py" + }, + { + "download_count": 713346, + "project": "scrypt" + }, + { + "download_count": 710233, + "project": "prokaryote" + }, + { + "download_count": 709352, + "project": "testing-postgresql" + }, + { + "download_count": 708670, + "project": "azure-cli-sqlvm" + }, + { + "download_count": 708401, + "project": "shrub-py" + }, + { + "download_count": 708219, + "project": "django-tinymce" + }, + { + "download_count": 708181, + "project": "scrapyd-client" + }, + { + "download_count": 707527, + "project": "apiclient" + }, + { + "download_count": 707254, + "project": "imgaug" + }, + { + "download_count": 707113, + "project": "nbsphinx" + }, + { + "download_count": 707083, + "project": "waiting" + }, + { + "download_count": 705264, + "project": "colorclass" + }, + { + "download_count": 703706, + "project": "consul-kv" + }, + { + "download_count": 702978, + "project": "html" + }, + { + "download_count": 702738, + "project": "rlp" + }, + { + "download_count": 702351, + "project": "nose-cov" + }, + { + "download_count": 702193, + "project": "python-twitter" + }, + { + "download_count": 701163, + "project": "splunk-sdk" + }, + { + "download_count": 700250, + "project": "fastcluster" + }, + { + "download_count": 698719, + "project": "yamale" + }, + { + "download_count": 698219, + "project": "pyramid-arima" + }, + { + "download_count": 697868, + "project": "termstyle" + }, + { + "download_count": 697474, + "project": "xstatic-bootstrap-scss" + }, + { + "download_count": 695211, + "project": "pyrouge" + }, + { + "download_count": 694603, + "project": "snuggs" + }, + { + "download_count": 693279, + "project": "python-barbicanclient" + }, + { + "download_count": 693249, + "project": "pyaudio" + }, + { + "download_count": 692957, + "project": "cvxpy" + }, + { + "download_count": 692001, + "project": "async-lru" + }, + { + "download_count": 691907, + "project": "mizani" + }, + { + "download_count": 691307, + "project": "petname" + }, + { + "download_count": 691300, + "project": "rouge" + }, + { + "download_count": 689543, + "project": "agate-dbf" + }, + { + "download_count": 688981, + "project": "fastapi" + }, + { + "download_count": 687783, + "project": "category-encoders" + }, + { + "download_count": 687548, + "project": "oyaml" + }, + { + "download_count": 687522, + "project": "gnureadline" + }, + { + "download_count": 687081, + "project": "rake-nltk" + }, + { + "download_count": 686921, + "project": "titlecase" + }, + { + "download_count": 685900, + "project": "robotframework-pabot" + }, + { + "download_count": 685000, + "project": "pygraphviz" + }, + { + "download_count": 684549, + "project": "awesome-slugify" + }, + { + "download_count": 684157, + "project": "ibmiotf" + }, + { + "download_count": 683792, + "project": "cpplint" + }, + { + "download_count": 683191, + "project": "transforms3d" + }, + { + "download_count": 681681, + "project": "junos-eznc" + }, + { + "download_count": 680817, + "project": "edn-format" + }, + { + "download_count": 680484, + "project": "kappa" + }, + { + "download_count": 680439, + "project": "dist-keras" + }, + { + "download_count": 679352, + "project": "wagtail" + }, + { + "download_count": 679107, + "project": "xstatic" + }, + { + "download_count": 678488, + "project": "sparkpost" + }, + { + "download_count": 677907, + "project": "django-configurations" + }, + { + "download_count": 676671, + "project": "warrant" + }, + { + "download_count": 675669, + "project": "coremltools" + }, + { + "download_count": 675660, + "project": "pystemmer" + }, + { + "download_count": 674957, + "project": "piexif" + }, + { + "download_count": 674880, + "project": "xstatic-jquery" + }, + { + "download_count": 674487, + "project": "ebaysdk" + }, + { + "download_count": 672829, + "project": "durationpy" + }, + { + "download_count": 670913, + "project": "odo" + }, + { + "download_count": 670060, + "project": "django-admin-rangefilter" + }, + { + "download_count": 669445, + "project": "pytrie" + }, + { + "download_count": 669083, + "project": "wxpython" + }, + { + "download_count": 667717, + "project": "ovs" + }, + { + "download_count": 667474, + "project": "ecos" + }, + { + "download_count": 666906, + "project": "tinycss" + }, + { + "download_count": 666871, + "project": "osqp" + }, + { + "download_count": 666786, + "project": "eth-hash" + }, + { + "download_count": 666275, + "project": "requirements-parser" + }, + { + "download_count": 665693, + "project": "glom" + }, + { + "download_count": 661492, + "project": "cbor" + }, + { + "download_count": 661312, + "project": "typeguard" + }, + { + "download_count": 660570, + "project": "auth0-python" + }, + { + "download_count": 660013, + "project": "grpcio-opentracing" + }, + { + "download_count": 659377, + "project": "fastcache" + }, + { + "download_count": 659193, + "project": "eth-abi" + }, + { + "download_count": 659114, + "project": "django-modelcluster" + }, + { + "download_count": 657030, + "project": "jgscm" + }, + { + "download_count": 656904, + "project": "xlocal" + }, + { + "download_count": 656475, + "project": "plotnine" + }, + { + "download_count": 655373, + "project": "oslo-reports" + }, + { + "download_count": 654961, + "project": "selectors2" + }, + { + "download_count": 653743, + "project": "pyexcel" + }, + { + "download_count": 653621, + "project": "mongoalchemy" + }, + { + "download_count": 652980, + "project": "django-celery-monitor" + }, + { + "download_count": 652428, + "project": "django-modeltranslation" + }, + { + "download_count": 651995, + "project": "m3-cdecimal" + }, + { + "download_count": 651743, + "project": "django-prometheus" + }, + { + "download_count": 649810, + "project": "pylama" + }, + { + "download_count": 649753, + "project": "pygtrie" + }, + { + "download_count": 649300, + "project": "zappa" + }, + { + "download_count": 648596, + "project": "lambda-packages" + }, + { + "download_count": 648298, + "project": "chainmap" + }, + { + "download_count": 648259, + "project": "sqlitedict" + }, + { + "download_count": 646634, + "project": "weakrefmethod" + }, + { + "download_count": 646583, + "project": "pyephem" + }, + { + "download_count": 646316, + "project": "pecan" + }, + { + "download_count": 646192, + "project": "grpcio-testing" + }, + { + "download_count": 645984, + "project": "ptpython" + }, + { + "download_count": 645726, + "project": "uwsgitop" + }, + { + "download_count": 645705, + "project": "xattr" + }, + { + "download_count": 645542, + "project": "sseclient" + }, + { + "download_count": 644773, + "project": "distance" + }, + { + "download_count": 641990, + "project": "crayons" + }, + { + "download_count": 641666, + "project": "scs" + }, + { + "download_count": 641155, + "project": "youtube-dl-server" + }, + { + "download_count": 640583, + "project": "pydicom" + }, + { + "download_count": 640562, + "project": "disklist" + }, + { + "download_count": 640283, + "project": "oslo-versionedobjects" + }, + { + "download_count": 639381, + "project": "property-manager" + }, + { + "download_count": 639343, + "project": "pyramid-tm" + }, + { + "download_count": 638235, + "project": "civis" + }, + { + "download_count": 638153, + "project": "flask-sslify" + }, + { + "download_count": 637064, + "project": "tflearn" + }, + { + "download_count": 635676, + "project": "pygeoif" + }, + { + "download_count": 635375, + "project": "anytree" + }, + { + "download_count": 634585, + "project": "prawcore" + }, + { + "download_count": 633579, + "project": "httmock" + }, + { + "download_count": 633551, + "project": "praw" + }, + { + "download_count": 633536, + "project": "blaze" + }, + { + "download_count": 630085, + "project": "dogstatsd-python" + }, + { + "download_count": 629789, + "project": "df2gspread" + }, + { + "download_count": 629728, + "project": "intelhex" + }, + { + "download_count": 628881, + "project": "flask-pymongo" + }, + { + "download_count": 628208, + "project": "ara" + }, + { + "download_count": 628016, + "project": "supervisor-checks" + }, + { + "download_count": 626928, + "project": "portpicker" + }, + { + "download_count": 626822, + "project": "willow" + }, + { + "download_count": 624147, + "project": "django-admin-sortable2" + }, + { + "download_count": 623219, + "project": "py2neo" + }, + { + "download_count": 622538, + "project": "dis3" + }, + { + "download_count": 621132, + "project": "dask-ml" + }, + { + "download_count": 620942, + "project": "doc8" + }, + { + "download_count": 620211, + "project": "duo-client" + }, + { + "download_count": 620141, + "project": "django-rq" + }, + { + "download_count": 619804, + "project": "cronex" + }, + { + "download_count": 619350, + "project": "quandl" + }, + { + "download_count": 616490, + "project": "fpdf" + }, + { + "download_count": 615575, + "project": "dpkt" + }, + { + "download_count": 615407, + "project": "img2pdf" + }, + { + "download_count": 614677, + "project": "twython" + }, + { + "download_count": 612945, + "project": "django-tastypie" + }, + { + "download_count": 612710, + "project": "fastkml" + }, + { + "download_count": 611741, + "project": "pychef" + }, + { + "download_count": 611286, + "project": "pbkdf2" + }, + { + "download_count": 611114, + "project": "envparse" + }, + { + "download_count": 610989, + "project": "pytest-profiling" + }, + { + "download_count": 610971, + "project": "face" + }, + { + "download_count": 609341, + "project": "sphinxcontrib-plantuml" + }, + { + "download_count": 609245, + "project": "pockets" + }, + { + "download_count": 609190, + "project": "pex" + }, + { + "download_count": 607985, + "project": "codacy-coverage" + }, + { + "download_count": 607915, + "project": "smtpapi" + }, + { + "download_count": 607247, + "project": "recordtype" + }, + { + "download_count": 604747, + "project": "django-sekizai" + }, + { + "download_count": 604376, + "project": "glances" + }, + { + "download_count": 603378, + "project": "pysha3" + }, + { + "download_count": 602654, + "project": "sphinxcontrib-napoleon" + }, + { + "download_count": 601446, + "project": "authlib" + }, + { + "download_count": 601374, + "project": "python-intercom" + }, + { + "download_count": 600575, + "project": "flask-limiter" + }, + { + "download_count": 600277, + "project": "python-statsd" + }, + { + "download_count": 599602, + "project": "draftjs-exporter" + }, + { + "download_count": 598699, + "project": "flake8-debugger" + }, + { + "download_count": 598674, + "project": "oslo-upgradecheck" + }, + { + "download_count": 598119, + "project": "libvirt-python" + }, + { + "download_count": 597629, + "project": "cron-descriptor" + }, + { + "download_count": 597332, + "project": "wsproto" + }, + { + "download_count": 597238, + "project": "asyncio-nats-client" + }, + { + "download_count": 597234, + "project": "pytorch-pretrained-bert" + }, + { + "download_count": 597090, + "project": "fixture" + }, + { + "download_count": 596614, + "project": "alpha-vantage" + }, + { + "download_count": 596308, + "project": "edgegrid-python" + }, + { + "download_count": 596233, + "project": "eth-keys" + }, + { + "download_count": 596043, + "project": "impacket" + }, + { + "download_count": 595545, + "project": "win-inet-pton" + }, + { + "download_count": 595350, + "project": "mox3" + }, + { + "download_count": 595102, + "project": "rarfile" + }, + { + "download_count": 593426, + "project": "yarn-api-client" + }, + { + "download_count": 593291, + "project": "colored" + }, + { + "download_count": 592042, + "project": "txaws" + }, + { + "download_count": 591199, + "project": "speechrecognition" + }, + { + "download_count": 591134, + "project": "frozen-flask" + }, + { + "download_count": 590993, + "project": "django-log-request-id" + }, + { + "download_count": 589804, + "project": "funcparserlib" + }, + { + "download_count": 589445, + "project": "djangorestframework-camel-case" + }, + { + "download_count": 588165, + "project": "oslo-privsep" + }, + { + "download_count": 587455, + "project": "tf-nightly" + }, + { + "download_count": 587372, + "project": "caniusepython3" + }, + { + "download_count": 586559, + "project": "envtpl" + }, + { + "download_count": 586159, + "project": "mockredispy" + }, + { + "download_count": 586076, + "project": "properties" + }, + { + "download_count": 585723, + "project": "ansi2html" + }, + { + "download_count": 585253, + "project": "pyzipcode" + }, + { + "download_count": 584788, + "project": "sphinx-autodoc-typehints" + }, + { + "download_count": 583551, + "project": "environs" + }, + { + "download_count": 583517, + "project": "junit2html" + }, + { + "download_count": 583339, + "project": "yoyo-migrations" + }, + { + "download_count": 582030, + "project": "junitxml" + }, + { + "download_count": 580290, + "project": "django-heroku" + }, + { + "download_count": 579947, + "project": "chart-studio" + }, + { + "download_count": 579171, + "project": "pyexecjs" + }, + { + "download_count": 578063, + "project": "datasketch" + }, + { + "download_count": 577373, + "project": "django-autoslug" + }, + { + "download_count": 577155, + "project": "pyrepl" + }, + { + "download_count": 576195, + "project": "polygon-geohasher" + }, + { + "download_count": 575933, + "project": "addict" + }, + { + "download_count": 575932, + "project": "tooz" + }, + { + "download_count": 575622, + "project": "mecab-python3" + }, + { + "download_count": 575453, + "project": "shippo" + }, + { + "download_count": 575188, + "project": "bindep" + }, + { + "download_count": 574250, + "project": "requests-html" + }, + { + "download_count": 573651, + "project": "python-louvain" + }, + { + "download_count": 572787, + "project": "zmq" + }, + { + "download_count": 571317, + "project": "eth-account" + }, + { + "download_count": 571250, + "project": "ortools" + }, + { + "download_count": 570798, + "project": "automaton" + }, + { + "download_count": 570379, + "project": "django-cors-middleware" + }, + { + "download_count": 570213, + "project": "rq-dashboard" + }, + { + "download_count": 569967, + "project": "oslo-rootwrap" + }, + { + "download_count": 569775, + "project": "pilkit" + }, + { + "download_count": 569584, + "project": "readthedocs-sphinx-ext" + }, + { + "download_count": 569334, + "project": "latexcodec" + }, + { + "download_count": 568887, + "project": "south" + }, + { + "download_count": 568427, + "project": "agate-excel" + }, + { + "download_count": 568046, + "project": "hexbytes" + }, + { + "download_count": 567653, + "project": "django-money" + }, + { + "download_count": 567483, + "project": "agate-sql" + }, + { + "download_count": 566872, + "project": "kitchen" + }, + { + "download_count": 566696, + "project": "unipath" + }, + { + "download_count": 566631, + "project": "sshuttle" + }, + { + "download_count": 566158, + "project": "robotframework-faker" + }, + { + "download_count": 565395, + "project": "pybtex" + }, + { + "download_count": 565136, + "project": "django-nested-admin" + }, + { + "download_count": 564284, + "project": "eth-keyfile" + }, + { + "download_count": 564232, + "project": "djangorestframework-bulk" + }, + { + "download_count": 564010, + "project": "dataset" + }, + { + "download_count": 563254, + "project": "trafaret" + }, + { + "download_count": 562622, + "project": "cheetah3" + }, + { + "download_count": 561733, + "project": "flask-security" + }, + { + "download_count": 560775, + "project": "aliyun-python-sdk-core-v3" + }, + { + "download_count": 560763, + "project": "azureml-train-automl" + }, + { + "download_count": 559850, + "project": "control" + }, + { + "download_count": 559644, + "project": "implicit" + }, + { + "download_count": 559092, + "project": "dependency-injector" + }, + { + "download_count": 558284, + "project": "lazy" + }, + { + "download_count": 558189, + "project": "unidiff" + }, + { + "download_count": 557350, + "project": "textdistance" + }, + { + "download_count": 557098, + "project": "python-monkey-business" + }, + { + "download_count": 556600, + "project": "untangle" + }, + { + "download_count": 556409, + "project": "reverse-geocoder" + }, + { + "download_count": 556261, + "project": "pygeoip" + }, + { + "download_count": 554953, + "project": "eth-rlp" + }, + { + "download_count": 552622, + "project": "databricks" + }, + { + "download_count": 552459, + "project": "pyvim" + }, + { + "download_count": 551935, + "project": "taskflow" + }, + { + "download_count": 551365, + "project": "ifaddr" + }, + { + "download_count": 549608, + "project": "eeweather" + }, + { + "download_count": 549360, + "project": "clickhouse-cityhash" + }, + { + "download_count": 548549, + "project": "django-hijack" + }, + { + "download_count": 547813, + "project": "names" + }, + { + "download_count": 547796, + "project": "castellan" + }, + { + "download_count": 547711, + "project": "sacremoses" + }, + { + "download_count": 547488, + "project": "flake8-blind-except" + }, + { + "download_count": 547363, + "project": "mozdebug" + }, + { + "download_count": 547215, + "project": "ofxparse" + }, + { + "download_count": 546668, + "project": "vatnumber" + }, + { + "download_count": 546665, + "project": "remoto" + }, + { + "download_count": 546052, + "project": "checksumdir" + }, + { + "download_count": 545735, + "project": "pyowm" + }, + { + "download_count": 545330, + "project": "poster" + }, + { + "download_count": 543997, + "project": "lzstring" + }, + { + "download_count": 543850, + "project": "pyminizip" + }, + { + "download_count": 543634, + "project": "np-utils" + }, + { + "download_count": 543596, + "project": "injector" + }, + { + "download_count": 543183, + "project": "django-imagekit" + }, + { + "download_count": 542497, + "project": "five9" + }, + { + "download_count": 542414, + "project": "static3" + }, + { + "download_count": 541667, + "project": "oset" + }, + { + "download_count": 540962, + "project": "jsbeautifier" + }, + { + "download_count": 540750, + "project": "hdbscan" + }, + { + "download_count": 540280, + "project": "os-testr" + }, + { + "download_count": 540000, + "project": "flask-babelex" + }, + { + "download_count": 539901, + "project": "positional" + }, + { + "download_count": 539021, + "project": "profilehooks" + }, + { + "download_count": 538332, + "project": "flask-rq2" + }, + { + "download_count": 538314, + "project": "pygpgme" + }, + { + "download_count": 538159, + "project": "ts-flint" + }, + { + "download_count": 538112, + "project": "google-api-helper" + }, + { + "download_count": 537857, + "project": "markuppy" + }, + { + "download_count": 537565, + "project": "keras-mxnet" + }, + { + "download_count": 535795, + "project": "kwargs-only" + }, + { + "download_count": 534335, + "project": "django-mathfilters" + }, + { + "download_count": 534222, + "project": "dj-static" + }, + { + "download_count": 533502, + "project": "web-py" + }, + { + "download_count": 533322, + "project": "zenpy" + }, + { + "download_count": 533300, + "project": "django-enumfields" + }, + { + "download_count": 533281, + "project": "georaptor" + }, + { + "download_count": 533198, + "project": "heroku3" + }, + { + "download_count": 533034, + "project": "oci" + }, + { + "download_count": 532545, + "project": "django-fernet-fields" + }, + { + "download_count": 531368, + "project": "pyftpdlib" + }, + { + "download_count": 529065, + "project": "neutron-lib" + }, + { + "download_count": 529026, + "project": "grpcio-reflection" + }, + { + "download_count": 528753, + "project": "python-jsonschema-objects" + }, + { + "download_count": 528555, + "project": "django-dynamic-fixture" + }, + { + "download_count": 528426, + "project": "pyod" + }, + { + "download_count": 528307, + "project": "simplekml" + }, + { + "download_count": 527593, + "project": "overrides" + }, + { + "download_count": 526989, + "project": "ovsdbapp" + }, + { + "download_count": 526603, + "project": "tavern" + }, + { + "download_count": 526180, + "project": "peppercorn" + }, + { + "download_count": 526018, + "project": "cbapi" + }, + { + "download_count": 525952, + "project": "twitter-common-contextutil" + }, + { + "download_count": 523345, + "project": "pypdf" + }, + { + "download_count": 523091, + "project": "couchbase" + }, + { + "download_count": 522723, + "project": "profanityfilter" + }, + { + "download_count": 522269, + "project": "blist" + }, + { + "download_count": 522185, + "project": "pydns" + }, + { + "download_count": 521431, + "project": "stopit" + }, + { + "download_count": 521064, + "project": "keyboard" + }, + { + "download_count": 520346, + "project": "twitter-common-util" + }, + { + "download_count": 520255, + "project": "flatten-json" + }, + { + "download_count": 519427, + "project": "twitter-common-string" + }, + { + "download_count": 519406, + "project": "tableauserverclient" + }, + { + "download_count": 519368, + "project": "m2r" + }, + { + "download_count": 519326, + "project": "twitter-common-process" + }, + { + "download_count": 519222, + "project": "twitter-common-app" + }, + { + "download_count": 518985, + "project": "json-rpc" + }, + { + "download_count": 517770, + "project": "slack-webhook-cli" + }, + { + "download_count": 517297, + "project": "antigate" + }, + { + "download_count": 516754, + "project": "sphinxcontrib-bibtex" + }, + { + "download_count": 516195, + "project": "pybtex-docutils" + }, + { + "download_count": 515133, + "project": "rfc6266-parser" + }, + { + "download_count": 514541, + "project": "nflx-genie-client" + }, + { + "download_count": 513202, + "project": "missingno" + }, + { + "download_count": 513069, + "project": "mitmproxy" + }, + { + "download_count": 512838, + "project": "conan-package-tools" + }, + { + "download_count": 512668, + "project": "xlutils" + }, + { + "download_count": 512441, + "project": "pprintpp" + }, + { + "download_count": 512440, + "project": "os-traits" + }, + { + "download_count": 512397, + "project": "svglib" + }, + { + "download_count": 510713, + "project": "btrees" + }, + { + "download_count": 510636, + "project": "graphframes" + }, + { + "download_count": 509946, + "project": "sarge" + }, + { + "download_count": 509466, + "project": "shadowsocks" + }, + { + "download_count": 509388, + "project": "hmsclient" + }, + { + "download_count": 509166, + "project": "azure-mgmt-servermanager" + }, + { + "download_count": 508757, + "project": "elasticache-pyclient" + }, + { + "download_count": 508756, + "project": "xstatic-patternfly" + }, + { + "download_count": 508352, + "project": "pep257" + }, + { + "download_count": 508010, + "project": "xstatic-patternfly-bootstrap-treeview" + }, + { + "download_count": 507803, + "project": "xstatic-datatables" + }, + { + "download_count": 507499, + "project": "django-recaptcha" + }, + { + "download_count": 507473, + "project": "persistent" + }, + { + "download_count": 507135, + "project": "altair" + }, + { + "download_count": 505888, + "project": "edx-enterprise" + }, + { + "download_count": 505690, + "project": "graphy" + }, + { + "download_count": 505101, + "project": "redlock-py" + }, + { + "download_count": 504911, + "project": "pymc3" + }, + { + "download_count": 504787, + "project": "mercantile" + }, + { + "download_count": 504175, + "project": "lftools" + }, + { + "download_count": 502985, + "project": "robotframework-httplibrary" + }, + { + "download_count": 501914, + "project": "tsfresh" + }, + { + "download_count": 501627, + "project": "fitbit" + }, + { + "download_count": 501439, + "project": "lightfm" + }, + { + "download_count": 501354, + "project": "djoser" + }, + { + "download_count": 501217, + "project": "pytest-faulthandler" + }, + { + "download_count": 500476, + "project": "formencode" + }, + { + "download_count": 500465, + "project": "spyne" + }, + { + "download_count": 500288, + "project": "backports-os" + }, + { + "download_count": 500147, + "project": "customerio" + }, + { + "download_count": 499726, + "project": "os-win" + }, + { + "download_count": 499639, + "project": "neptune-client" + }, + { + "download_count": 499204, + "project": "googleappenginecloudstorageclient" + }, + { + "download_count": 498658, + "project": "sparqlwrapper" + }, + { + "download_count": 498519, + "project": "sphinxcontrib-spelling" + }, + { + "download_count": 498177, + "project": "geotext" + }, + { + "download_count": 497560, + "project": "pytest-lazy-fixture" + }, + { + "download_count": 497085, + "project": "pyarabic" + }, + { + "download_count": 497017, + "project": "auditwheel" + }, + { + "download_count": 496676, + "project": "django-debug-panel" + }, + { + "download_count": 495919, + "project": "cssmin" + }, + { + "download_count": 495656, + "project": "nose-progressive" + }, + { + "download_count": 495187, + "project": "django-suit" + }, + { + "download_count": 495183, + "project": "mercurial" + }, + { + "download_count": 495032, + "project": "python-hosts" + }, + { + "download_count": 494652, + "project": "pywatchman" + }, + { + "download_count": 494192, + "project": "pip-lock" + }, + { + "download_count": 494177, + "project": "clikit" + }, + { + "download_count": 494100, + "project": "flake8-per-file-ignores" + }, + { + "download_count": 493208, + "project": "os-brick" + }, + { + "download_count": 492737, + "project": "cloudinary" + }, + { + "download_count": 492342, + "project": "pyroma" + }, + { + "download_count": 491821, + "project": "aiohttp-jinja2" + }, + { + "download_count": 491668, + "project": "func-timeout" + }, + { + "download_count": 491557, + "project": "ldapdomaindump" + }, + { + "download_count": 490771, + "project": "logzio-python-handler" + }, + { + "download_count": 490651, + "project": "yarg" + }, + { + "download_count": 490261, + "project": "python-geoip" + }, + { + "download_count": 489169, + "project": "gremlinpython" + }, + { + "download_count": 488646, + "project": "uplink" + }, + { + "download_count": 487621, + "project": "pyjarowinkler" + }, + { + "download_count": 485859, + "project": "qt4reactor" + }, + { + "download_count": 485712, + "project": "records" + }, + { + "download_count": 485512, + "project": "flake8-string-format" + }, + { + "download_count": 485371, + "project": "django-rest-framework" + }, + { + "download_count": 485084, + "project": "pydruid" + }, + { + "download_count": 484914, + "project": "meson" + }, + { + "download_count": 484556, + "project": "django-select2" + }, + { + "download_count": 484267, + "project": "pamqp" + }, + { + "download_count": 484090, + "project": "xmljson" + }, + { + "download_count": 483920, + "project": "slots" + }, + { + "download_count": 483748, + "project": "doublemetaphone" + }, + { + "download_count": 483545, + "project": "pycli" + }, + { + "download_count": 483354, + "project": "jupyterlab-launcher" + }, + { + "download_count": 482936, + "project": "editorconfig" + }, + { + "download_count": 482719, + "project": "pamela" + }, + { + "download_count": 482539, + "project": "rdpy" + }, + { + "download_count": 482395, + "project": "word2number" + }, + { + "download_count": 482346, + "project": "pykmip" + }, + { + "download_count": 480460, + "project": "recurly" + }, + { + "download_count": 479945, + "project": "datarobot" + }, + { + "download_count": 479251, + "project": "email-reply-parser" + }, + { + "download_count": 479059, + "project": "geohash2" + }, + { + "download_count": 478838, + "project": "readchar" + }, + { + "download_count": 478822, + "project": "mohawk" + }, + { + "download_count": 478394, + "project": "orjson" + }, + { + "download_count": 478032, + "project": "pycocotools" + }, + { + "download_count": 477626, + "project": "pythonnet" + }, + { + "download_count": 477384, + "project": "deap" + }, + { + "download_count": 476311, + "project": "cursor" + }, + { + "download_count": 475480, + "project": "django-jenkins" + }, + { + "download_count": 475049, + "project": "azureml-automl-core" + }, + { + "download_count": 474562, + "project": "sklearn-crfsuite" + }, + { + "download_count": 472571, + "project": "azure-mgmt-documentdb" + }, + { + "download_count": 471293, + "project": "paretochart" + }, + { + "download_count": 471137, + "project": "python-debian" + }, + { + "download_count": 471045, + "project": "rply" + }, + { + "download_count": 469934, + "project": "pynliner" + }, + { + "download_count": 469110, + "project": "ipwhois" + }, + { + "download_count": 468984, + "project": "pylint-quotes" + }, + { + "download_count": 468853, + "project": "sfmergeutility" + }, + { + "download_count": 468745, + "project": "pyside2" + }, + { + "download_count": 468673, + "project": "cupy-cuda100" + }, + { + "download_count": 468012, + "project": "tokenize-rt" + }, + { + "download_count": 467174, + "project": "halo" + }, + { + "download_count": 467029, + "project": "pyblake2" + }, + { + "download_count": 466658, + "project": "python-keyczar" + }, + { + "download_count": 466596, + "project": "pytest-factoryboy" + }, + { + "download_count": 466322, + "project": "pyramid-mako" + }, + { + "download_count": 465692, + "project": "speedtest-cli" + }, + { + "download_count": 465559, + "project": "ansible-vault" + }, + { + "download_count": 465439, + "project": "sure" + }, + { + "download_count": 465170, + "project": "h3" + }, + { + "download_count": 464606, + "project": "pysolar" + }, + { + "download_count": 464135, + "project": "os-vif" + }, + { + "download_count": 462962, + "project": "gcovr" + }, + { + "download_count": 462652, + "project": "gputil" + }, + { + "download_count": 462649, + "project": "pyexcel-xlsx" + }, + { + "download_count": 462258, + "project": "pytest-bdd" + }, + { + "download_count": 462062, + "project": "qtpy" + }, + { + "download_count": 461447, + "project": "marshmallow-jsonschema" + }, + { + "download_count": 461130, + "project": "xmlschema" + }, + { + "download_count": 461066, + "project": "log-symbols" + }, + { + "download_count": 461026, + "project": "aiopg" + }, + { + "download_count": 461021, + "project": "paypalrestsdk" + }, + { + "download_count": 459361, + "project": "bpython" + }, + { + "download_count": 459221, + "project": "django-memoize" + }, + { + "download_count": 458741, + "project": "pastescript" + }, + { + "download_count": 458467, + "project": "djangorestframework-gis" + }, + { + "download_count": 458421, + "project": "yamlordereddictloader" + }, + { + "download_count": 458237, + "project": "azure-cli-privatedns" + }, + { + "download_count": 457094, + "project": "jupyterhub" + }, + { + "download_count": 457021, + "project": "pytest-random-order" + }, + { + "download_count": 456889, + "project": "cli-helpers" + }, + { + "download_count": 456492, + "project": "django-jet" + }, + { + "download_count": 456487, + "project": "django-solo" + }, + { + "download_count": 455927, + "project": "easypkg" + }, + { + "download_count": 455745, + "project": "oslotest" + }, + { + "download_count": 455660, + "project": "td-client" + }, + { + "download_count": 455550, + "project": "docker-buildtool" + }, + { + "download_count": 455228, + "project": "pyactiveresource" + }, + { + "download_count": 455148, + "project": "filetype" + }, + { + "download_count": 454275, + "project": "integrationhelper" + }, + { + "download_count": 454060, + "project": "treeinterpreter" + }, + { + "download_count": 453726, + "project": "spinners" + }, + { + "download_count": 453478, + "project": "tinys3" + }, + { + "download_count": 452911, + "project": "google-nucleus" + }, + { + "download_count": 452905, + "project": "sfctl" + }, + { + "download_count": 452659, + "project": "wsme" + }, + { + "download_count": 452548, + "project": "cloudml-hypertune" + }, + { + "download_count": 452284, + "project": "djrill" + }, + { + "download_count": 451894, + "project": "rdflib-jsonld" + }, + { + "download_count": 451751, + "project": "pyhull" + }, + { + "download_count": 451388, + "project": "weka-easypy" + }, + { + "download_count": 451340, + "project": "zerorpc" + }, + { + "download_count": 450074, + "project": "requests-aws-sign" + }, + { + "download_count": 449859, + "project": "apns2" + }, + { + "download_count": 449829, + "project": "pytest-freezegun" + }, + { + "download_count": 449733, + "project": "logentries" + }, + { + "download_count": 449274, + "project": "polling" + }, + { + "download_count": 449144, + "project": "ner" + }, + { + "download_count": 448946, + "project": "pycuber" + }, + { + "download_count": 448187, + "project": "dfply" + }, + { + "download_count": 447960, + "project": "elasticsearch5" + }, + { + "download_count": 447647, + "project": "pyramid-debugtoolbar" + }, + { + "download_count": 447433, + "project": "dohq-artifactory" + }, + { + "download_count": 447042, + "project": "graphyte" + }, + { + "download_count": 446699, + "project": "gtts-token" + }, + { + "download_count": 446599, + "project": "s3io" + }, + { + "download_count": 446457, + "project": "pyldavis" + }, + { + "download_count": 446070, + "project": "dm-xmlsec-binding" + }, + { + "download_count": 445558, + "project": "oslo-vmware" + }, + { + "download_count": 445493, + "project": "mkdocs-minify-plugin" + }, + { + "download_count": 442789, + "project": "systemd-python" + }, + { + "download_count": 441825, + "project": "django-daterange-filter" + }, + { + "download_count": 441288, + "project": "pycld2" + }, + { + "download_count": 441011, + "project": "ffmpy" + }, + { + "download_count": 440747, + "project": "onnxruntime" + }, + { + "download_count": 440442, + "project": "pathmatch" + }, + { + "download_count": 440074, + "project": "beatbox" + }, + { + "download_count": 439695, + "project": "dotmap" + }, + { + "download_count": 439566, + "project": "atari-py" + }, + { + "download_count": 436976, + "project": "pytest-socket" + }, + { + "download_count": 436145, + "project": "matplotlib-venn" + }, + { + "download_count": 434595, + "project": "dnslib" + }, + { + "download_count": 434167, + "project": "leveldb" + }, + { + "download_count": 433865, + "project": "django-dirtyfields" + }, + { + "download_count": 433860, + "project": "shiboken2" + }, + { + "download_count": 433596, + "project": "chameleon" + }, + { + "download_count": 433574, + "project": "python-social-auth" + }, + { + "download_count": 433514, + "project": "xunitparser" + }, + { + "download_count": 433494, + "project": "tempest" + }, + { + "download_count": 433330, + "project": "django-extra-views" + }, + { + "download_count": 433032, + "project": "django-sslserver" + }, + { + "download_count": 432924, + "project": "netstorageapi" + }, + { + "download_count": 432577, + "project": "django-bootstrap-form" + }, + { + "download_count": 431716, + "project": "aio-pika" + }, + { + "download_count": 431533, + "project": "curtsies" + }, + { + "download_count": 431368, + "project": "edx-proctoring" + }, + { + "download_count": 429918, + "project": "rules" + }, + { + "download_count": 429501, + "project": "treq" + }, + { + "download_count": 429446, + "project": "python2-pythondialog" + }, + { + "download_count": 429251, + "project": "shopifyapi" + }, + { + "download_count": 429239, + "project": "pyros-genmsg" + }, + { + "download_count": 428668, + "project": "pyros-genpy" + }, + { + "download_count": 427728, + "project": "django-webtest" + }, + { + "download_count": 427374, + "project": "cpp-coveralls" + }, + { + "download_count": 426629, + "project": "hyperloglog" + }, + { + "download_count": 425518, + "project": "pathvalidate" + }, + { + "download_count": 424129, + "project": "marisa-trie" + }, + { + "download_count": 423827, + "project": "graphene-file-upload" + }, + { + "download_count": 423528, + "project": "wurlitzer" + }, + { + "download_count": 423446, + "project": "geoip" + }, + { + "download_count": 423400, + "project": "nameko" + }, + { + "download_count": 422280, + "project": "pipreqs" + }, + { + "download_count": 422034, + "project": "airbrake" + }, + { + "download_count": 421423, + "project": "python-barcode" + }, + { + "download_count": 420487, + "project": "featuretools" + }, + { + "download_count": 420463, + "project": "pydes" + }, + { + "download_count": 420080, + "project": "oss2" + }, + { + "download_count": 419064, + "project": "win-unicode-console" + }, + { + "download_count": 418651, + "project": "aiocontextvars" + }, + { + "download_count": 417979, + "project": "flake8-logging-format" + }, + { + "download_count": 417452, + "project": "aiokafka" + }, + { + "download_count": 416219, + "project": "astunparse" + }, + { + "download_count": 414872, + "project": "doit" + }, + { + "download_count": 414706, + "project": "scikit-surprise" + }, + { + "download_count": 414280, + "project": "flask-mysql" + }, + { + "download_count": 414268, + "project": "pygerrit2" + }, + { + "download_count": 412851, + "project": "requests-http-signature" + }, + { + "download_count": 412476, + "project": "django-dotenv" + }, + { + "download_count": 412152, + "project": "ffmpeg-quality-metrics" + }, + { + "download_count": 412022, + "project": "spotify-tensorflow" + }, + { + "download_count": 411026, + "project": "wsgi-intercept" + }, + { + "download_count": 410904, + "project": "breathe" + }, + { + "download_count": 410783, + "project": "google-api-python-client-uritemplate" + }, + { + "download_count": 408750, + "project": "django-ajax-selects" + }, + { + "download_count": 408606, + "project": "websocket" + }, + { + "download_count": 408486, + "project": "healthcheck" + }, + { + "download_count": 408427, + "project": "redo" + }, + { + "download_count": 408117, + "project": "pypiserver" + }, + { + "download_count": 408017, + "project": "localstack-client" + }, + { + "download_count": 407856, + "project": "fastai" + }, + { + "download_count": 407560, + "project": "django-impersonate" + }, + { + "download_count": 407287, + "project": "zipcodes" + }, + { + "download_count": 407121, + "project": "treelib" + }, + { + "download_count": 407028, + "project": "django-stubs" + }, + { + "download_count": 406712, + "project": "django-two-factor-auth" + }, + { + "download_count": 405396, + "project": "json-delta" + }, + { + "download_count": 405170, + "project": "socketio-client" + }, + { + "download_count": 405065, + "project": "gin-config" + }, + { + "download_count": 405060, + "project": "coverage-badge" + }, + { + "download_count": 404993, + "project": "django-sendgrid-v5" + }, + { + "download_count": 404902, + "project": "shutilwhich" + }, + { + "download_count": 404866, + "project": "flask-redis" + }, + { + "download_count": 404373, + "project": "pep562" + }, + { + "download_count": 404209, + "project": "niet" + }, + { + "download_count": 403508, + "project": "dask-glm" + }, + { + "download_count": 402928, + "project": "evergreen-py" + }, + { + "download_count": 402697, + "project": "zxcvbn" + }, + { + "download_count": 402692, + "project": "dataproperty" + }, + { + "download_count": 402398, + "project": "pygeohash" + }, + { + "download_count": 401062, + "project": "ast" + }, + { + "download_count": 400982, + "project": "pyobjc-core" + }, + { + "download_count": 400958, + "project": "http-ece" + }, + { + "download_count": 400803, + "project": "readline" + }, + { + "download_count": 400450, + "project": "django-elasticsearch-dsl" + }, + { + "download_count": 400436, + "project": "python-xlib" + }, + { + "download_count": 400407, + "project": "flatten-dict" + }, + { + "download_count": 399614, + "project": "gherkin-official" + }, + { + "download_count": 399263, + "project": "elementpath" + }, + { + "download_count": 399214, + "project": "gdal" + }, + { + "download_count": 399000, + "project": "roman" + }, + { + "download_count": 398885, + "project": "click-spinner" + }, + { + "download_count": 398873, + "project": "chalice" + }, + { + "download_count": 398463, + "project": "django-filer" + }, + { + "download_count": 398402, + "project": "ldclient-py" + }, + { + "download_count": 398269, + "project": "gtts" + }, + { + "download_count": 397948, + "project": "django-registration" + }, + { + "download_count": 397646, + "project": "collectfast" + }, + { + "download_count": 396999, + "project": "django-jinja" + }, + { + "download_count": 396968, + "project": "eradicate" + }, + { + "download_count": 396714, + "project": "neo4j-driver" + }, + { + "download_count": 396369, + "project": "cybox" + }, + { + "download_count": 396364, + "project": "asgi-redis" + }, + { + "download_count": 396056, + "project": "boto3-type-annotations" + }, + { + "download_count": 395861, + "project": "etcd3gw" + }, + { + "download_count": 395415, + "project": "face-recognition" + }, + { + "download_count": 395184, + "project": "os-xenapi" + }, + { + "download_count": 395153, + "project": "neo4j" + }, + { + "download_count": 394185, + "project": "pytrends" + }, + { + "download_count": 393950, + "project": "grpcio-status" + }, + { + "download_count": 393467, + "project": "sailthru-client" + }, + { + "download_count": 393315, + "project": "repoze-sendmail" + }, + { + "download_count": 393244, + "project": "bayesian-optimization" + }, + { + "download_count": 393069, + "project": "pillow-simd" + }, + { + "download_count": 392655, + "project": "inquirer" + }, + { + "download_count": 391989, + "project": "watson-developer-cloud" + }, + { + "download_count": 391807, + "project": "assertpy" + }, + { + "download_count": 391722, + "project": "chainer" + }, + { + "download_count": 391162, + "project": "aiogithubapi" + }, + { + "download_count": 391117, + "project": "pyclustering" + }, + { + "download_count": 390635, + "project": "django-test-plus" + }, + { + "download_count": 389572, + "project": "azureml-explain-model" + }, + { + "download_count": 389554, + "project": "param" + }, + { + "download_count": 388843, + "project": "smartsheet-python-sdk" + }, + { + "download_count": 388646, + "project": "google-ads" + }, + { + "download_count": 387346, + "project": "unicode-slugify" + }, + { + "download_count": 387007, + "project": "django-smtp-ssl" + }, + { + "download_count": 386636, + "project": "udatetime" + }, + { + "download_count": 386540, + "project": "pyobjc-framework-cocoa" + }, + { + "download_count": 386296, + "project": "confuse" + }, + { + "download_count": 386037, + "project": "hdfs3" + }, + { + "download_count": 385593, + "project": "moznetwork" + }, + { + "download_count": 385320, + "project": "pydot2" + }, + { + "download_count": 385150, + "project": "djangocms-admin-style" + }, + { + "download_count": 384650, + "project": "pyquaternion" + }, + { + "download_count": 384272, + "project": "xblock" + }, + { + "download_count": 384195, + "project": "flask-talisman" + }, + { + "download_count": 383670, + "project": "paver" + }, + { + "download_count": 383579, + "project": "pytorch-transformers" + }, + { + "download_count": 383499, + "project": "netdisco" + }, + { + "download_count": 383345, + "project": "kivy" + }, + { + "download_count": 383182, + "project": "django-uuidfield" + }, + { + "download_count": 382848, + "project": "jwt" + }, + { + "download_count": 382404, + "project": "logdna" + }, + { + "download_count": 382235, + "project": "relativetimebuilder" + }, + { + "download_count": 381845, + "project": "json2html" + }, + { + "download_count": 381570, + "project": "pytest-helpers-namespace" + }, + { + "download_count": 381409, + "project": "codespell" + }, + { + "download_count": 381241, + "project": "open3d-python" + }, + { + "download_count": 381173, + "project": "aws" + }, + { + "download_count": 381129, + "project": "plyfile" + }, + { + "download_count": 380993, + "project": "py-spy" + }, + { + "download_count": 380964, + "project": "aliyun-python-sdk-kms" + }, + { + "download_count": 380771, + "project": "stix" + }, + { + "download_count": 379960, + "project": "pywebpush" + }, + { + "download_count": 379915, + "project": "paramiko-expect" + }, + { + "download_count": 379467, + "project": "face-recognition-models" + }, + { + "download_count": 379302, + "project": "umap-learn" + }, + { + "download_count": 378977, + "project": "cbor2" + }, + { + "download_count": 378025, + "project": "django-redis-sessions" + }, + { + "download_count": 377737, + "project": "pymisp" + }, + { + "download_count": 377661, + "project": "django-test-without-migrations" + }, + { + "download_count": 377526, + "project": "readability-lxml" + }, + { + "download_count": 377300, + "project": "python-jsonrpc-server" + }, + { + "download_count": 377259, + "project": "yara-python" + }, + { + "download_count": 376371, + "project": "scikit-build" + }, + { + "download_count": 376213, + "project": "wasmer" + }, + { + "download_count": 376182, + "project": "django-templated-email" + }, + { + "download_count": 375778, + "project": "www-authenticate" + }, + { + "download_count": 375656, + "project": "plaid-python" + }, + { + "download_count": 375163, + "project": "mixbox" + }, + { + "download_count": 374823, + "project": "fastdiff" + }, + { + "download_count": 374712, + "project": "pyang" + }, + { + "download_count": 373785, + "project": "flake8-tidy-imports" + }, + { + "download_count": 373672, + "project": "dnspython3" + }, + { + "download_count": 373668, + "project": "twitter-common-confluence" + }, + { + "download_count": 373502, + "project": "cursive" + }, + { + "download_count": 372891, + "project": "requests-oauth" + }, + { + "download_count": 372768, + "project": "edx-opaque-keys" + }, + { + "download_count": 372679, + "project": "flake8-mutable" + }, + { + "download_count": 372516, + "project": "docxtpl" + }, + { + "download_count": 372505, + "project": "reloader" + }, + { + "download_count": 371987, + "project": "ibm-cos-sdk" + }, + { + "download_count": 371891, + "project": "python-multipart" + }, + { + "download_count": 371361, + "project": "shodan" + }, + { + "download_count": 370894, + "project": "glance-store" + }, + { + "download_count": 370618, + "project": "blobxfer" + }, + { + "download_count": 370307, + "project": "mailchimp" + }, + { + "download_count": 370281, + "project": "amazon-kclpy" + }, + { + "download_count": 369713, + "project": "azure-cli-deploymentmanager" + }, + { + "download_count": 369303, + "project": "cfscrape" + }, + { + "download_count": 369271, + "project": "gabbi" + }, + { + "download_count": 368704, + "project": "docker-registry-client" + }, + { + "download_count": 368627, + "project": "visdom" + }, + { + "download_count": 368133, + "project": "djangosaml2" + }, + { + "download_count": 367774, + "project": "torchfile" + }, + { + "download_count": 367743, + "project": "python-language-server" + }, + { + "download_count": 367741, + "project": "django-registration-redux" + }, + { + "download_count": 366408, + "project": "pypowervm" + }, + { + "download_count": 365959, + "project": "pypubsub" + }, + { + "download_count": 365726, + "project": "flake8-mypy" + }, + { + "download_count": 365550, + "project": "mixer" + }, + { + "download_count": 365313, + "project": "config" + }, + { + "download_count": 365224, + "project": "pytorch" + }, + { + "download_count": 364756, + "project": "py-geohash-any" + }, + { + "download_count": 364330, + "project": "pantsbuild-pants" + }, + { + "download_count": 364200, + "project": "strif" + }, + { + "download_count": 364189, + "project": "pgc-interface" + }, + { + "download_count": 363919, + "project": "pyrasite" + }, + { + "download_count": 363463, + "project": "browsermob-proxy" + }, + { + "download_count": 362770, + "project": "marshmallow-oneofschema" + }, + { + "download_count": 362569, + "project": "python-saml" + }, + { + "download_count": 362447, + "project": "pymc" + }, + { + "download_count": 362409, + "project": "vadersentiment" + }, + { + "download_count": 362107, + "project": "pyxero" + }, + { + "download_count": 361277, + "project": "ccxt" + }, + { + "download_count": 361145, + "project": "executor" + }, + { + "download_count": 360517, + "project": "requests-pkcs12" + }, + { + "download_count": 360423, + "project": "instaclone" + }, + { + "download_count": 360015, + "project": "exchangelib" + }, + { + "download_count": 359650, + "project": "lomond" + }, + { + "download_count": 359422, + "project": "mibian" + }, + { + "download_count": 359376, + "project": "sip" + }, + { + "download_count": 358575, + "project": "django-ordered-model" + }, + { + "download_count": 358484, + "project": "eyed3" + }, + { + "download_count": 358443, + "project": "pysendfile" + }, + { + "download_count": 358260, + "project": "nose-testconfig" + }, + { + "download_count": 358034, + "project": "delegator-py" + }, + { + "download_count": 357573, + "project": "currencyconverter" + }, + { + "download_count": 356478, + "project": "backports-lzma" + }, + { + "download_count": 356429, + "project": "p4python" + }, + { + "download_count": 356412, + "project": "zope-index" + }, + { + "download_count": 356169, + "project": "cloudflare" + }, + { + "download_count": 356004, + "project": "cql" + }, + { + "download_count": 355945, + "project": "dacite" + }, + { + "download_count": 355827, + "project": "python-cjson" + }, + { + "download_count": 355794, + "project": "marshmallow-arrow" + }, + { + "download_count": 355729, + "project": "mbstrdecoder" + }, + { + "download_count": 354987, + "project": "urlextract" + }, + { + "download_count": 354886, + "project": "typepy" + }, + { + "download_count": 354885, + "project": "htpasswd" + }, + { + "download_count": 354555, + "project": "mod-wsgi" + }, + { + "download_count": 354506, + "project": "django-cms" + }, + { + "download_count": 353955, + "project": "flask-apscheduler" + }, + { + "download_count": 353201, + "project": "pymobiledetect" + }, + { + "download_count": 353184, + "project": "times" + }, + { + "download_count": 352996, + "project": "zabbix-api" + }, + { + "download_count": 352927, + "project": "bcdoc" + }, + { + "download_count": 352725, + "project": "torchtext" + }, + { + "download_count": 352313, + "project": "flashtext" + }, + { + "download_count": 351678, + "project": "referer-parser" + }, + { + "download_count": 350758, + "project": "pyexcel-xls" + }, + { + "download_count": 350681, + "project": "edx-drf-extensions" + }, + { + "download_count": 350665, + "project": "falcon-multipart" + }, + { + "download_count": 350619, + "project": "inotify" + }, + { + "download_count": 350184, + "project": "tpot" + }, + { + "download_count": 349490, + "project": "mypy-protobuf" + }, + { + "download_count": 349330, + "project": "pygit2" + }, + { + "download_count": 348567, + "project": "robotbackgroundlogger" + }, + { + "download_count": 348256, + "project": "traces" + }, + { + "download_count": 348166, + "project": "django-extra-fields" + }, + { + "download_count": 348009, + "project": "rook" + }, + { + "download_count": 348008, + "project": "ssh2-python" + }, + { + "download_count": 347979, + "project": "jupytext" + }, + { + "download_count": 347497, + "project": "optunity" + }, + { + "download_count": 347125, + "project": "django-safedelete" + }, + { + "download_count": 347040, + "project": "django-jsonview" + }, + { + "download_count": 347003, + "project": "allure-behave" + }, + { + "download_count": 346883, + "project": "forex-python" + }, + { + "download_count": 346742, + "project": "logger" + }, + { + "download_count": 346329, + "project": "django-choices" + }, + { + "download_count": 345484, + "project": "xdis" + }, + { + "download_count": 345296, + "project": "django-babel" + }, + { + "download_count": 345262, + "project": "parse-accept-language" + }, + { + "download_count": 344856, + "project": "scons" + }, + { + "download_count": 344819, + "project": "klein" + }, + { + "download_count": 344742, + "project": "flask-shell-ipython" + }, + { + "download_count": 344586, + "project": "amqplib" + }, + { + "download_count": 344301, + "project": "betamax" + }, + { + "download_count": 344260, + "project": "flask-basicauth" + }, + { + "download_count": 344021, + "project": "pybarcode" + }, + { + "download_count": 343992, + "project": "pytest-json" + }, + { + "download_count": 343912, + "project": "uiautomation" + }, + { + "download_count": 343788, + "project": "pyemd" + }, + { + "download_count": 343547, + "project": "flufl-enum" + }, + { + "download_count": 342092, + "project": "normality" + }, + { + "download_count": 341312, + "project": "osc-placement" + }, + { + "download_count": 340998, + "project": "pytest-parallel" + }, + { + "download_count": 340763, + "project": "crochet" + }, + { + "download_count": 340105, + "project": "proximityhash" + }, + { + "download_count": 339952, + "project": "pyscss" + }, + { + "download_count": 339480, + "project": "python-qpid-proton" + }, + { + "download_count": 339302, + "project": "vtk" + }, + { + "download_count": 338910, + "project": "hmmlearn" + }, + { + "download_count": 338542, + "project": "pyqtwebengine" + }, + { + "download_count": 337957, + "project": "django-watchman" + }, + { + "download_count": 337701, + "project": "python-igraph" + }, + { + "download_count": 337586, + "project": "edxval" + }, + { + "download_count": 337501, + "project": "ibm-cos-sdk-core" + }, + { + "download_count": 337200, + "project": "edx-django-utils" + }, + { + "download_count": 336856, + "project": "ibm-cos-sdk-s3transfer" + }, + { + "download_count": 336294, + "project": "spark-nlp" + }, + { + "download_count": 335964, + "project": "rhea" + }, + { + "download_count": 335873, + "project": "exifread" + }, + { + "download_count": 335709, + "project": "tensorflow-estimator-2-0-preview" + }, + { + "download_count": 335463, + "project": "python-binary-memcached" + }, + { + "download_count": 335218, + "project": "spyder" + }, + { + "download_count": 334977, + "project": "rstr" + }, + { + "download_count": 334204, + "project": "asteval" + }, + { + "download_count": 333818, + "project": "uncompyle6" + }, + { + "download_count": 333754, + "project": "requests-async" + }, + { + "download_count": 333266, + "project": "kaitaistruct" + }, + { + "download_count": 332129, + "project": "multiprocessing" + }, + { + "download_count": 332061, + "project": "chromedriver" + }, + { + "download_count": 332013, + "project": "iso-639" + }, + { + "download_count": 331946, + "project": "daiquiri" + }, + { + "download_count": 331588, + "project": "tendo" + }, + { + "download_count": 331525, + "project": "spark-parser" + }, + { + "download_count": 331379, + "project": "setuptools-git-version" + }, + { + "download_count": 331153, + "project": "priority" + }, + { + "download_count": 330940, + "project": "cachelib" + }, + { + "download_count": 330879, + "project": "os-ken" + }, + { + "download_count": 330608, + "project": "microversion-parse" + }, + { + "download_count": 329253, + "project": "django-contrib-comments" + }, + { + "download_count": 329155, + "project": "o365" + }, + { + "download_count": 328801, + "project": "panda" + }, + { + "download_count": 328625, + "project": "ed25519" + }, + { + "download_count": 327877, + "project": "pyxb" + }, + { + "download_count": 327798, + "project": "rest-condition" + }, + { + "download_count": 327008, + "project": "pandavro" + }, + { + "download_count": 326932, + "project": "flask-autoindex" + }, + { + "download_count": 326745, + "project": "jieba3k" + }, + { + "download_count": 326444, + "project": "pipfile" + }, + { + "download_count": 325679, + "project": "js2xml" + }, + { + "download_count": 325610, + "project": "freetype-py" + }, + { + "download_count": 325570, + "project": "sigopt" + }, + { + "download_count": 325566, + "project": "flask-silk" + }, + { + "download_count": 325431, + "project": "pynvim" + }, + { + "download_count": 324936, + "project": "hunspell" + }, + { + "download_count": 324782, + "project": "pytest-localserver" + }, + { + "download_count": 324466, + "project": "genshi" + }, + { + "download_count": 324252, + "project": "pyqtgraph" + }, + { + "download_count": 324239, + "project": "backport-collections" + }, + { + "download_count": 324070, + "project": "daemonize" + }, + { + "download_count": 324045, + "project": "pafy" + }, + { + "download_count": 323910, + "project": "pyvcloud" + }, + { + "download_count": 322541, + "project": "imapclient" + }, + { + "download_count": 321480, + "project": "tika" + }, + { + "download_count": 321355, + "project": "simplekv" + }, + { + "download_count": 321196, + "project": "rtslib-fb" + }, + { + "download_count": 321126, + "project": "flake8-colors" + }, + { + "download_count": 321035, + "project": "helper" + }, + { + "download_count": 320909, + "project": "guessit" + }, + { + "download_count": 320580, + "project": "ryu" + }, + { + "download_count": 320316, + "project": "salt" + }, + { + "download_count": 320262, + "project": "flexmock" + }, + { + "download_count": 320230, + "project": "pytils" + }, + { + "download_count": 320212, + "project": "phik" + }, + { + "download_count": 319164, + "project": "sphinx-bootstrap-theme" + }, + { + "download_count": 319042, + "project": "flake8-pep3101" + }, + { + "download_count": 318722, + "project": "turicreate" + }, + { + "download_count": 318705, + "project": "attr" + }, + { + "download_count": 318586, + "project": "spyder-kernels" + }, + { + "download_count": 318398, + "project": "drf-writable-nested" + }, + { + "download_count": 318092, + "project": "future-fstrings" + }, + { + "download_count": 317793, + "project": "python-mistralclient" + }, + { + "download_count": 317688, + "project": "fuzzy" + }, + { + "download_count": 317529, + "project": "pyxlsb" + }, + { + "download_count": 317467, + "project": "twitter" + }, + { + "download_count": 317447, + "project": "slumber" + }, + { + "download_count": 316898, + "project": "protobuf-to-dict" + }, + { + "download_count": 316783, + "project": "djangorestframework-recursive" + }, + { + "download_count": 316760, + "project": "treeherder-client" + }, + { + "download_count": 316758, + "project": "python-nomad" + }, + { + "download_count": 316352, + "project": "click-default-group" + }, + { + "download_count": 316307, + "project": "logzero" + }, + { + "download_count": 316290, + "project": "orionsdk" + }, + { + "download_count": 316243, + "project": "sanic-cors" + }, + { + "download_count": 316239, + "project": "fastdtw" + }, + { + "download_count": 315929, + "project": "python-moztelemetry" + }, + { + "download_count": 315911, + "project": "pytest-azurepipelines" + }, + { + "download_count": 315673, + "project": "expects" + }, + { + "download_count": 314691, + "project": "feedfinder2" + }, + { + "download_count": 314446, + "project": "multimethod" + }, + { + "download_count": 314259, + "project": "janome" + }, + { + "download_count": 314133, + "project": "voluptuous-serialize" + }, + { + "download_count": 314097, + "project": "pyculiar" + }, + { + "download_count": 314051, + "project": "mozdownload" + }, + { + "download_count": 313826, + "project": "pylzma" + }, + { + "download_count": 313796, + "project": "qtawesome" + }, + { + "download_count": 313736, + "project": "everett" + }, + { + "download_count": 313653, + "project": "coincurve" + }, + { + "download_count": 313244, + "project": "characteristic" + }, + { + "download_count": 312696, + "project": "python-can" + }, + { + "download_count": 312614, + "project": "planout" + }, + { + "download_count": 312044, + "project": "submit50" + }, + { + "download_count": 312044, + "project": "transformers" + }, + { + "download_count": 311745, + "project": "django-celery-email" + }, + { + "download_count": 311632, + "project": "check50" + }, + { + "download_count": 311531, + "project": "ansimarkup" + }, + { + "download_count": 311273, + "project": "flatdict" + }, + { + "download_count": 311140, + "project": "minimal-snowplow-tracker" + }, + { + "download_count": 311122, + "project": "python-troveclient" + }, + { + "download_count": 310826, + "project": "pycpfcnpj" + }, + { + "download_count": 310446, + "project": "python-lzf" + }, + { + "download_count": 310429, + "project": "apsw" + }, + { + "download_count": 310269, + "project": "stem" + }, + { + "download_count": 310019, + "project": "mozinstall" + }, + { + "download_count": 309655, + "project": "os-resource-classes" + }, + { + "download_count": 309355, + "project": "mimeparse" + }, + { + "download_count": 309293, + "project": "comet-ml" + }, + { + "download_count": 309286, + "project": "serpy" + }, + { + "download_count": 309092, + "project": "skimage" + }, + { + "download_count": 308894, + "project": "pandas-ml" + }, + { + "download_count": 308548, + "project": "python-magnumclient" + }, + { + "download_count": 307984, + "project": "azure-devtools" + }, + { + "download_count": 307690, + "project": "typesentry" + }, + { + "download_count": 307277, + "project": "awslogs" + }, + { + "download_count": 306928, + "project": "pytest-flakes" + }, + { + "download_count": 306784, + "project": "thespian" + }, + { + "download_count": 305826, + "project": "pykcs11" + }, + { + "download_count": 305226, + "project": "singer-python" + }, + { + "download_count": 304755, + "project": "pyprind" + }, + { + "download_count": 304717, + "project": "abbyy" + }, + { + "download_count": 304490, + "project": "flask-restful-swagger" + }, + { + "download_count": 304399, + "project": "os-api-ref" + }, + { + "download_count": 304195, + "project": "simpleitk" + }, + { + "download_count": 304060, + "project": "unicorn" + }, + { + "download_count": 304021, + "project": "jobspy" + }, + { + "download_count": 303998, + "project": "devpi-common" + }, + { + "download_count": 303970, + "project": "jsonpath" + }, + { + "download_count": 303806, + "project": "pysubnettree" + }, + { + "download_count": 303693, + "project": "hypercorn" + }, + { + "download_count": 303592, + "project": "scrapy-random-useragent" + }, + { + "download_count": 303497, + "project": "zope-schema" + }, + { + "download_count": 303260, + "project": "newspaper3k" + }, + { + "download_count": 302739, + "project": "pyspellchecker" + }, + { + "download_count": 302714, + "project": "password" + }, + { + "download_count": 302400, + "project": "testlink-api-python-client" + }, + { + "download_count": 302299, + "project": "dogpile-core" + }, + { + "download_count": 302266, + "project": "nilearn" + }, + { + "download_count": 302076, + "project": "pylibftdi" + }, + { + "download_count": 301868, + "project": "python-termstyle" + }, + { + "download_count": 301830, + "project": "pybreaker" + }, + { + "download_count": 301435, + "project": "django-wkhtmltopdf" + }, + { + "download_count": 300585, + "project": "pyxdameraulevenshtein" + }, + { + "download_count": 300425, + "project": "hpsklearn" + }, + { + "download_count": 300421, + "project": "tesserocr" + }, + { + "download_count": 300359, + "project": "django-templated-mail" + }, + { + "download_count": 300207, + "project": "comet-git-pure" + }, + { + "download_count": 299910, + "project": "httpcore" + }, + { + "download_count": 299706, + "project": "simhash" + }, + { + "download_count": 299276, + "project": "aspy-refactor-imports" + }, + { + "download_count": 298943, + "project": "fcm-django" + }, + { + "download_count": 298927, + "project": "flask-jwt" + }, + { + "download_count": 298823, + "project": "serial" + }, + { + "download_count": 298802, + "project": "binary" + }, + { + "download_count": 298544, + "project": "plaidml" + }, + { + "download_count": 298085, + "project": "python-oauth2" + }, + { + "download_count": 297969, + "project": "opencv-contrib-python-headless" + }, + { + "download_count": 297585, + "project": "djangocms-text-ckeditor" + }, + { + "download_count": 297361, + "project": "better-exceptions-fork" + }, + { + "download_count": 297253, + "project": "dynamodb-json" + }, + { + "download_count": 297052, + "project": "bitmath" + }, + { + "download_count": 296269, + "project": "condor-git-config" + }, + { + "download_count": 296162, + "project": "cornice" + }, + { + "download_count": 295986, + "project": "polyglot" + }, + { + "download_count": 295722, + "project": "pytelegrambotapi" + }, + { + "download_count": 295667, + "project": "mbed-cloud-sdk" + }, + { + "download_count": 295592, + "project": "behave-django" + }, + { + "download_count": 295509, + "project": "modernize" + }, + { + "download_count": 295419, + "project": "libusb1" + }, + { + "download_count": 295355, + "project": "edx-organizations" + }, + { + "download_count": 294743, + "project": "sendgrid-django" + }, + { + "download_count": 294453, + "project": "sniffio" + }, + { + "download_count": 294364, + "project": "slugid" + }, + { + "download_count": 294093, + "project": "pypika" + }, + { + "download_count": 293799, + "project": "oci-cli" + }, + { + "download_count": 293404, + "project": "django-rosetta" + }, + { + "download_count": 293277, + "project": "proxmoxer" + }, + { + "download_count": 292761, + "project": "anytemplate" + }, + { + "download_count": 292649, + "project": "raven-aiohttp" + }, + { + "download_count": 292327, + "project": "bbcode" + }, + { + "download_count": 292281, + "project": "protego" + }, + { + "download_count": 292277, + "project": "securesystemslib" + }, + { + "download_count": 292249, + "project": "outcome" + }, + { + "download_count": 291695, + "project": "crontab" + }, + { + "download_count": 291636, + "project": "pytelegraf" + }, + { + "download_count": 291495, + "project": "pylbfgs" + }, + { + "download_count": 291341, + "project": "asttokens" + }, + { + "download_count": 291275, + "project": "wtforms-components" + }, + { + "download_count": 291039, + "project": "elasticsearch-async" + }, + { + "download_count": 290811, + "project": "py-dateutil" + }, + { + "download_count": 290793, + "project": "buildbot-worker" + }, + { + "download_count": 290753, + "project": "atpublic" + }, + { + "download_count": 290628, + "project": "django-cleanup" + }, + { + "download_count": 290574, + "project": "urlopen" + }, + { + "download_count": 290457, + "project": "cleanco" + }, + { + "download_count": 290025, + "project": "home-assistant-frontend" + }, + { + "download_count": 289983, + "project": "azureml-widgets" + }, + { + "download_count": 289907, + "project": "pycallgraph" + }, + { + "download_count": 289633, + "project": "biplist" + }, + { + "download_count": 289587, + "project": "django-datatables-view" + }, + { + "download_count": 289573, + "project": "guppy" + }, + { + "download_count": 289366, + "project": "kaggle" + }, + { + "download_count": 289053, + "project": "ratelimiter" + }, + { + "download_count": 288392, + "project": "requests-aws" + }, + { + "download_count": 288145, + "project": "prov" + }, + { + "download_count": 288066, + "project": "xmodem" + }, + { + "download_count": 287756, + "project": "pyobjc-framework-fsevents" + }, + { + "download_count": 287736, + "project": "djangorestframework-stubs" + }, + { + "download_count": 287716, + "project": "dailymotion" + }, + { + "download_count": 287610, + "project": "airspeed" + }, + { + "download_count": 287211, + "project": "pdfminer3k" + }, + { + "download_count": 286932, + "project": "django-admin-tools" + }, + { + "download_count": 286676, + "project": "rfc3339" + }, + { + "download_count": 286568, + "project": "runlike" + }, + { + "download_count": 286494, + "project": "pyobjc-framework-systemconfiguration" + }, + { + "download_count": 286287, + "project": "flask-swagger-ui" + }, + { + "download_count": 286286, + "project": "pyrabbit" + }, + { + "download_count": 286217, + "project": "pyobjc-framework-cfnetwork" + }, + { + "download_count": 285962, + "project": "django-htmlmin" + }, + { + "download_count": 285937, + "project": "affinegap" + }, + { + "download_count": 285640, + "project": "django-smart-selects" + }, + { + "download_count": 285368, + "project": "jaraco-classes" + }, + { + "download_count": 285182, + "project": "pyjq" + }, + { + "download_count": 284862, + "project": "plaidml-keras" + }, + { + "download_count": 284806, + "project": "pyobjc-framework-webkit" + }, + { + "download_count": 284790, + "project": "jq" + }, + { + "download_count": 284781, + "project": "django-taggit-serializer" + }, + { + "download_count": 284424, + "project": "robotframework-databaselibrary" + }, + { + "download_count": 284410, + "project": "httpsig-cffi" + }, + { + "download_count": 284050, + "project": "instaloader" + }, + { + "download_count": 284049, + "project": "powerline-status" + }, + { + "download_count": 283986, + "project": "tap-py" + }, + { + "download_count": 283939, + "project": "devpi-client" + }, + { + "download_count": 283785, + "project": "banal" + }, + { + "download_count": 283663, + "project": "docx" + }, + { + "download_count": 283563, + "project": "python-geoip-geolite2" + }, + { + "download_count": 283441, + "project": "bitstruct" + }, + { + "download_count": 283402, + "project": "pyramid-jinja2" + }, + { + "download_count": 283279, + "project": "graphitesend" + }, + { + "download_count": 283227, + "project": "metafone" + }, + { + "download_count": 283149, + "project": "tinysegmenter" + }, + { + "download_count": 282747, + "project": "sqlalchemy-continuum" + }, + { + "download_count": 282696, + "project": "opencensus-ext-stackdriver" + }, + { + "download_count": 282668, + "project": "waiter" + }, + { + "download_count": 282655, + "project": "sphinx-gallery" + }, + { + "download_count": 282575, + "project": "git-pylint-commit-hook" + }, + { + "download_count": 282479, + "project": "fuzzyset" + }, + { + "download_count": 282254, + "project": "pytest-custom-exit-code" + }, + { + "download_count": 281823, + "project": "hyperas" + }, + { + "download_count": 281726, + "project": "django-simple-captcha" + }, + { + "download_count": 281640, + "project": "dynamodb-encryption-sdk" + }, + { + "download_count": 281597, + "project": "openexr" + }, + { + "download_count": 281522, + "project": "pid" + }, + { + "download_count": 281467, + "project": "irc3-plugins-test" + }, + { + "download_count": 280788, + "project": "murmurhash3" + }, + { + "download_count": 280402, + "project": "quart" + }, + { + "download_count": 280081, + "project": "salesforce-bulkipy" + }, + { + "download_count": 279935, + "project": "sphinx-argparse" + }, + { + "download_count": 279690, + "project": "pptree" + }, + { + "download_count": 279227, + "project": "djangorestframework-jsonapi" + }, + { + "download_count": 279117, + "project": "marshmallow-polyfield" + }, + { + "download_count": 278996, + "project": "tls-syslog" + }, + { + "download_count": 278801, + "project": "fastprogress" + }, + { + "download_count": 278661, + "project": "style" + }, + { + "download_count": 278616, + "project": "pyjsparser" + }, + { + "download_count": 278381, + "project": "celery-redbeat" + }, + { + "download_count": 278041, + "project": "dbutils" + }, + { + "download_count": 277922, + "project": "zvmcloudconnector" + }, + { + "download_count": 277703, + "project": "blockdiag" + }, + { + "download_count": 277555, + "project": "jsl" + }, + { + "download_count": 277355, + "project": "aiomysql" + }, + { + "download_count": 277155, + "project": "softlayer" + }, + { + "download_count": 276993, + "project": "levenshtein-search" + }, + { + "download_count": 276886, + "project": "gender-guesser" + }, + { + "download_count": 276825, + "project": "msal" + }, + { + "download_count": 276567, + "project": "sqlalchemy-stubs" + }, + { + "download_count": 276536, + "project": "pyliblzma" + }, + { + "download_count": 276486, + "project": "django-sass-processor" + }, + { + "download_count": 276464, + "project": "django-url-filter" + }, + { + "download_count": 276353, + "project": "sanic-plugins-framework" + }, + { + "download_count": 276240, + "project": "jxmlease" + }, + { + "download_count": 275861, + "project": "purl" + }, + { + "download_count": 275254, + "project": "base36" + }, + { + "download_count": 275159, + "project": "pytools" + }, + { + "download_count": 275147, + "project": "datrie" + }, + { + "download_count": 274643, + "project": "zxcvbn-python" + }, + { + "download_count": 274395, + "project": "pytest-datafiles" + }, + { + "download_count": 273920, + "project": "pyspark-stubs" + }, + { + "download_count": 273728, + "project": "natto-py" + }, + { + "download_count": 273719, + "project": "mechanicalsoup" + }, + { + "download_count": 273603, + "project": "sqlalchemy-postgres-copy" + }, + { + "download_count": 273574, + "project": "pycosat" + }, + { + "download_count": 273348, + "project": "q" + }, + { + "download_count": 273202, + "project": "backpack" + }, + { + "download_count": 273056, + "project": "gmplot" + }, + { + "download_count": 273050, + "project": "websockify" + }, + { + "download_count": 273001, + "project": "measurement" + }, + { + "download_count": 272990, + "project": "hass-nabucasa" + }, + { + "download_count": 272948, + "project": "virtualenvwrapper-win" + }, + { + "download_count": 272942, + "project": "email" + }, + { + "download_count": 272542, + "project": "pyobjc-framework-launchservices" + }, + { + "download_count": 272383, + "project": "webdriver-manager" + }, + { + "download_count": 272315, + "project": "google-oauth" + }, + { + "download_count": 272029, + "project": "django-js-reverse" + }, + { + "download_count": 271929, + "project": "meinheld" + }, + { + "download_count": 271914, + "project": "yapsy" + }, + { + "download_count": 271877, + "project": "nteract-scrapbook" + }, + { + "download_count": 271874, + "project": "mouseinfo" + }, + { + "download_count": 271864, + "project": "pyobjc-framework-exceptionhandling" + }, + { + "download_count": 271786, + "project": "dbt" + }, + { + "download_count": 271483, + "project": "django-tagging" + }, + { + "download_count": 271439, + "project": "taskcluster" + }, + { + "download_count": 271349, + "project": "evdev" + }, + { + "download_count": 270918, + "project": "dedupe-hcluster" + }, + { + "download_count": 270898, + "project": "tensor2tensor" + }, + { + "download_count": 270014, + "project": "pymacaroons" + }, + { + "download_count": 269770, + "project": "kivy-garden" + }, + { + "download_count": 269533, + "project": "nine" + }, + { + "download_count": 269249, + "project": "highered" + }, + { + "download_count": 269216, + "project": "sounddevice" + }, + { + "download_count": 268421, + "project": "docx2txt" + }, + { + "download_count": 268411, + "project": "robotframework-debuglibrary" + }, + { + "download_count": 268172, + "project": "aioamqp" + }, + { + "download_count": 268107, + "project": "cma" + }, + { + "download_count": 267772, + "project": "netstruct" + }, + { + "download_count": 267766, + "project": "pyhacrf-datamade" + }, + { + "download_count": 267588, + "project": "flake8-junit-report" + }, + { + "download_count": 267292, + "project": "wptools" + }, + { + "download_count": 266807, + "project": "bump2version" + }, + { + "download_count": 266733, + "project": "lesscpy" + }, + { + "download_count": 266561, + "project": "pytest-vcr" + }, + { + "download_count": 266544, + "project": "pyexcel-webio" + }, + { + "download_count": 266422, + "project": "maya" + }, + { + "download_count": 266355, + "project": "robotframework-xvfb" + }, + { + "download_count": 266132, + "project": "dedupe" + }, + { + "download_count": 266017, + "project": "pyminifier" + }, + { + "download_count": 265818, + "project": "winkerberos" + }, + { + "download_count": 265798, + "project": "mozanalysis" + }, + { + "download_count": 265437, + "project": "username-generator" + }, + { + "download_count": 265328, + "project": "phpserialize" + }, + { + "download_count": 265105, + "project": "crc32c" + }, + { + "download_count": 264933, + "project": "pretrainedmodels" + }, + { + "download_count": 264845, + "project": "pytest-remotedata" + }, + { + "download_count": 264729, + "project": "python-owasp-zap-v2-4" + }, + { + "download_count": 264669, + "project": "nexpose" + }, + { + "download_count": 264414, + "project": "http-parser" + }, + { + "download_count": 264412, + "project": "pyobjc-framework-diskarbitration" + }, + { + "download_count": 264322, + "project": "dsp3" + }, + { + "download_count": 264189, + "project": "rlr" + }, + { + "download_count": 263902, + "project": "pyqt5-tools" + }, + { + "download_count": 263840, + "project": "json-tricks" + }, + { + "download_count": 263390, + "project": "categorical-distance" + }, + { + "download_count": 263282, + "project": "datalab" + }, + { + "download_count": 263021, + "project": "update" + }, + { + "download_count": 262783, + "project": "blobfile" + }, + { + "download_count": 262644, + "project": "zc-buildout" + }, + { + "download_count": 262529, + "project": "dedupe-variable-datetime" + }, + { + "download_count": 262152, + "project": "simplecosine" + }, + { + "download_count": 261988, + "project": "pytest-mockito" + }, + { + "download_count": 261860, + "project": "django-otp-twilio" + }, + { + "download_count": 261797, + "project": "django-chartit" + }, + { + "download_count": 261611, + "project": "datetime-distance" + }, + { + "download_count": 260878, + "project": "jaraco-text" + }, + { + "download_count": 260837, + "project": "fastrlock" + }, + { + "download_count": 260816, + "project": "flake8-future-import" + }, + { + "download_count": 260795, + "project": "pyghmi" + }, + { + "download_count": 260576, + "project": "orator" + }, + { + "download_count": 260536, + "project": "flake8-tuple" + }, + { + "download_count": 260250, + "project": "aiocache" + }, + { + "download_count": 260202, + "project": "cli53" + }, + { + "download_count": 260043, + "project": "untokenize" + }, + { + "download_count": 259904, + "project": "newrelic-plugin-agent" + }, + { + "download_count": 259773, + "project": "pyangbind" + }, + { + "download_count": 259756, + "project": "django-pyodbc-azure" + }, + { + "download_count": 259273, + "project": "zstd" + }, + { + "download_count": 258974, + "project": "pymodbus" + }, + { + "download_count": 258942, + "project": "jupyter-spark" + }, + { + "download_count": 258875, + "project": "django-sortedm2m" + }, + { + "download_count": 258300, + "project": "python-logstash-async" + }, + { + "download_count": 258254, + "project": "django-graphql-jwt" + }, + { + "download_count": 257389, + "project": "elasticquery" + }, + { + "download_count": 257227, + "project": "python-keycloak" + }, + { + "download_count": 257086, + "project": "dbus-python" + }, + { + "download_count": 257005, + "project": "cmarkgfm" + }, + { + "download_count": 256972, + "project": "pysrt" + }, + { + "download_count": 256801, + "project": "pyobjc-framework-coreservices" + }, + { + "download_count": 256683, + "project": "django-paypal" + }, + { + "download_count": 256576, + "project": "spur" + }, + { + "download_count": 256447, + "project": "iniparse" + }, + { + "download_count": 256111, + "project": "python-terraform" + }, + { + "download_count": 255860, + "project": "djangorestframework-jsonp" + }, + { + "download_count": 255835, + "project": "rethinkdb" + }, + { + "download_count": 255719, + "project": "mozcrash" + }, + { + "download_count": 255201, + "project": "pyobjc-framework-quartz" + }, + { + "download_count": 254935, + "project": "django-organizations" + }, + { + "download_count": 254677, + "project": "django-colorfield" + }, + { + "download_count": 254646, + "project": "marshmallow-jsonapi" + }, + { + "download_count": 254107, + "project": "djangorestframework-expander" + }, + { + "download_count": 253885, + "project": "dci-utils" + }, + { + "download_count": 253884, + "project": "pql" + }, + { + "download_count": 253867, + "project": "tf-nightly-2-0-preview" + }, + { + "download_count": 253608, + "project": "django-parler" + }, + { + "download_count": 253475, + "project": "telethon" + }, + { + "download_count": 253099, + "project": "celery-once" + }, + { + "download_count": 253054, + "project": "scales" + }, + { + "download_count": 253035, + "project": "rocketchat-api" + }, + { + "download_count": 252896, + "project": "jaraco-collections" + }, + { + "download_count": 252760, + "project": "yaql" + }, + { + "download_count": 252588, + "project": "pyinquirer" + }, + { + "download_count": 252471, + "project": "django-session-security" + }, + { + "download_count": 252413, + "project": "django-rest-knox" + }, + { + "download_count": 252295, + "project": "django-redshift-backend" + }, + { + "download_count": 251901, + "project": "sphinx-markdown-tables" + }, + { + "download_count": 251862, + "project": "sceptre" + }, + { + "download_count": 251840, + "project": "py-mini-racer" + }, + { + "download_count": 251759, + "project": "python-rake" + }, + { + "download_count": 251594, + "project": "oauth2-client" + }, + { + "download_count": 251347, + "project": "env" + }, + { + "download_count": 251337, + "project": "timedelta" + }, + { + "download_count": 250784, + "project": "awkward" + }, + { + "download_count": 250362, + "project": "edx-rbac" + }, + { + "download_count": 250192, + "project": "flask-log-request-id" + }, + { + "download_count": 250110, + "project": "globre" + }, + { + "download_count": 249752, + "project": "django-easy-pdf" + }, + { + "download_count": 249646, + "project": "prettyexc" + }, + { + "download_count": 249416, + "project": "django-notifications-hq" + }, + { + "download_count": 249316, + "project": "mozleak" + }, + { + "download_count": 249286, + "project": "autograd-gamma" + }, + { + "download_count": 249216, + "project": "flask-injector" + }, + { + "download_count": 249101, + "project": "holoviews" + }, + { + "download_count": 249064, + "project": "inflector" + }, + { + "download_count": 248895, + "project": "django-honeypot" + }, + { + "download_count": 248839, + "project": "pip-api" + }, + { + "download_count": 248670, + "project": "pytest-testmon" + }, + { + "download_count": 248527, + "project": "pycapnp" + }, + { + "download_count": 248395, + "project": "pgpy" + }, + { + "download_count": 248134, + "project": "pretend" + }, + { + "download_count": 247952, + "project": "webhelpers" + }, + { + "download_count": 247612, + "project": "iso4217" + }, + { + "download_count": 247588, + "project": "chargebee" + }, + { + "download_count": 247194, + "project": "logging-tree" + }, + { + "download_count": 247097, + "project": "bcolz" + }, + { + "download_count": 247095, + "project": "pydomo" + }, + { + "download_count": 247093, + "project": "pyviz-comms" + }, + { + "download_count": 246905, + "project": "pyes" + }, + { + "download_count": 246637, + "project": "patool" + }, + { + "download_count": 246609, + "project": "django-saml2-auth" + }, + { + "download_count": 246442, + "project": "lorem" + }, + { + "download_count": 246345, + "project": "kociemba" + }, + { + "download_count": 245924, + "project": "nylas" + }, + { + "download_count": 245599, + "project": "urlparse3" + }, + { + "download_count": 245592, + "project": "pytest-tornado" + }, + { + "download_count": 245425, + "project": "inject" + }, + { + "download_count": 244242, + "project": "tabledata" + }, + { + "download_count": 244197, + "project": "percy" + }, + { + "download_count": 243680, + "project": "snitun" + }, + { + "download_count": 243665, + "project": "django-debug-toolbar-line-profiler" + }, + { + "download_count": 243077, + "project": "bottlenose" + }, + { + "download_count": 242781, + "project": "infi-clickhouse-orm" + }, + { + "download_count": 242659, + "project": "reppy" + }, + { + "download_count": 242378, + "project": "in-toto" + }, + { + "download_count": 242112, + "project": "azureml" + }, + { + "download_count": 242067, + "project": "django-common-helpers" + }, + { + "download_count": 241994, + "project": "django-hijack-admin" + }, + { + "download_count": 241868, + "project": "cmreshandler" + }, + { + "download_count": 241645, + "project": "ruptures" + }, + { + "download_count": 241594, + "project": "goslate" + }, + { + "download_count": 241370, + "project": "aggdraw" + }, + { + "download_count": 241223, + "project": "django-boto" + }, + { + "download_count": 240546, + "project": "svn" + }, + { + "download_count": 240121, + "project": "ssh" + }, + { + "download_count": 240049, + "project": "py3dns" + }, + { + "download_count": 239971, + "project": "pymonkey" + }, + { + "download_count": 239838, + "project": "great-expectations" + }, + { + "download_count": 239830, + "project": "pip-custom-platform" + }, + { + "download_count": 239729, + "project": "django-libsass" + }, + { + "download_count": 239683, + "project": "mirakuru" + }, + { + "download_count": 239680, + "project": "microsoftgraph-python" + }, + { + "download_count": 239524, + "project": "gnocchiclient" + }, + { + "download_count": 239407, + "project": "pyct" + }, + { + "download_count": 239390, + "project": "ansible-runner" + }, + { + "download_count": 239360, + "project": "dbt-core" + }, + { + "download_count": 239183, + "project": "hellosign-python-sdk" + }, + { + "download_count": 239095, + "project": "pyaudioanalysis" + }, + { + "download_count": 239001, + "project": "reportportal-client" + }, + { + "download_count": 238983, + "project": "itunes-iap" + }, + { + "download_count": 238603, + "project": "terminalone" + }, + { + "download_count": 238597, + "project": "snaptime" + }, + { + "download_count": 238394, + "project": "aiormq" + }, + { + "download_count": 238154, + "project": "djangocms-attributes-field" + }, + { + "download_count": 238141, + "project": "django-versatileimagefield" + }, + { + "download_count": 237972, + "project": "django-push-notifications" + }, + { + "download_count": 237750, + "project": "transliterate" + }, + { + "download_count": 237652, + "project": "whaaaaat" + }, + { + "download_count": 237622, + "project": "django-sslify" + }, + { + "download_count": 237558, + "project": "towncrier" + }, + { + "download_count": 237018, + "project": "py-lz4framed" + }, + { + "download_count": 236912, + "project": "uproot-methods" + }, + { + "download_count": 236619, + "project": "django-statici18n" + }, + { + "download_count": 236529, + "project": "pytd" + }, + { + "download_count": 236270, + "project": "pep517" + }, + { + "download_count": 236180, + "project": "py-ecc" + }, + { + "download_count": 236180, + "project": "layered-yaml-attrdict-config" + }, + { + "download_count": 235952, + "project": "varint" + }, + { + "download_count": 235921, + "project": "spotipy" + }, + { + "download_count": 235732, + "project": "django-markdown-deux" + }, + { + "download_count": 235635, + "project": "geventhttpclient-wheels" + }, + { + "download_count": 235481, + "project": "parallel-ssh" + }, + { + "download_count": 235241, + "project": "event-tracking" + }, + { + "download_count": 234835, + "project": "jupyterthemes" + }, + { + "download_count": 234721, + "project": "django-pandas" + }, + { + "download_count": 234582, + "project": "stackprinter" + }, + { + "download_count": 234393, + "project": "probablepeople" + }, + { + "download_count": 234334, + "project": "flake8-eradicate" + }, + { + "download_count": 234277, + "project": "mode" + }, + { + "download_count": 234271, + "project": "asset" + }, + { + "download_count": 234150, + "project": "loggly-python-handler" + }, + { + "download_count": 233705, + "project": "supervisor-wildcards" + }, + { + "download_count": 233601, + "project": "edx-bulk-grades" + }, + { + "download_count": 233407, + "project": "glean-parser" + }, + { + "download_count": 233242, + "project": "morfessor" + }, + { + "download_count": 233191, + "project": "pyzbar" + }, + { + "download_count": 232874, + "project": "nbstripout" + }, + { + "download_count": 232838, + "project": "mnemonic" + }, + { + "download_count": 232704, + "project": "pyeclib" + }, + { + "download_count": 232607, + "project": "flask-sockets" + }, + { + "download_count": 232578, + "project": "esrally" + }, + { + "download_count": 232565, + "project": "django-crontab" + }, + { + "download_count": 232517, + "project": "standardjson" + }, + { + "download_count": 232389, + "project": "sphinxcontrib-svg2pdfconverter" + }, + { + "download_count": 232208, + "project": "jep" + }, + { + "download_count": 231947, + "project": "contractions" + }, + { + "download_count": 231914, + "project": "hashlib" + }, + { + "download_count": 231894, + "project": "hdrhistogram" + }, + { + "download_count": 231873, + "project": "pydoe" + }, + { + "download_count": 231818, + "project": "colorhash" + }, + { + "download_count": 231678, + "project": "venv-update" + }, + { + "download_count": 231678, + "project": "pytidylib" + }, + { + "download_count": 231634, + "project": "sas7bdat" + }, + { + "download_count": 231555, + "project": "pybrain" + }, + { + "download_count": 231491, + "project": "locust" + }, + { + "download_count": 231449, + "project": "easygui" + }, + { + "download_count": 231322, + "project": "pytest-qt" + }, + { + "download_count": 231297, + "project": "prance" + }, + { + "download_count": 231250, + "project": "nose-ignore-docstring" + }, + { + "download_count": 231113, + "project": "snakeviz" + }, + { + "download_count": 231027, + "project": "pygaljs" + }, + { + "download_count": 230954, + "project": "rainbow-saddle" + }, + { + "download_count": 230879, + "project": "wsgiref" + }, + { + "download_count": 230659, + "project": "django-config-models" + }, + { + "download_count": 230631, + "project": "django-partial-index" + }, + { + "download_count": 230614, + "project": "restrictedpython" + }, + { + "download_count": 230470, + "project": "consulate" + }, + { + "download_count": 230441, + "project": "django-s3-storage" + }, + { + "download_count": 230436, + "project": "jenkins" + }, + { + "download_count": 230427, + "project": "mtranslate" + }, + { + "download_count": 230393, + "project": "aiosmtplib" + }, + { + "download_count": 230248, + "project": "django-statsd-mozilla" + }, + { + "download_count": 229850, + "project": "ffmpeg" + }, + { + "download_count": 229620, + "project": "django-ranged-response" + }, + { + "download_count": 229579, + "project": "pytest-cover" + }, + { + "download_count": 229403, + "project": "flexget" + }, + { + "download_count": 229292, + "project": "django-cachalot" + }, + { + "download_count": 229142, + "project": "django-activity-stream" + }, + { + "download_count": 229046, + "project": "daemonocle" + }, + { + "download_count": 228702, + "project": "mimerender" + }, + { + "download_count": 228552, + "project": "mathematics-dataset" + }, + { + "download_count": 228521, + "project": "money" + }, + { + "download_count": 228488, + "project": "flake8-formatter-junit-xml" + }, + { + "download_count": 228281, + "project": "python-vagrant" + }, + { + "download_count": 228240, + "project": "parquet" + }, + { + "download_count": 228235, + "project": "asciimatics" + }, + { + "download_count": 228066, + "project": "singleton-decorator" + }, + { + "download_count": 228004, + "project": "petl" + }, + { + "download_count": 227997, + "project": "dogpile" + }, + { + "download_count": 227746, + "project": "beaver" + }, + { + "download_count": 227738, + "project": "dbt-postgres" + }, + { + "download_count": 227570, + "project": "patch-ng" + }, + { + "download_count": 227212, + "project": "pytest-replay" + }, + { + "download_count": 227202, + "project": "django-settings-export" + }, + { + "download_count": 227048, + "project": "traittypes" + }, + { + "download_count": 227010, + "project": "ipcalc" + }, + { + "download_count": 226931, + "project": "django-elasticache" + }, + { + "download_count": 226656, + "project": "pywsd" + }, + { + "download_count": 226426, + "project": "flask-kvsession" + }, + { + "download_count": 226328, + "project": "pytest-logging" + }, + { + "download_count": 226143, + "project": "java-random" + }, + { + "download_count": 226134, + "project": "flask-seasurf" + }, + { + "download_count": 226129, + "project": "posix-ipc" + }, + { + "download_count": 226063, + "project": "zconfig" + }, + { + "download_count": 225964, + "project": "flask-uuid" + }, + { + "download_count": 225932, + "project": "djangorestframework-oauth" + }, + { + "download_count": 225898, + "project": "nest-asyncio" + }, + { + "download_count": 225852, + "project": "flock" + }, + { + "download_count": 225551, + "project": "taskcluster-urls" + }, + { + "download_count": 225391, + "project": "cntk" + }, + { + "download_count": 224972, + "project": "lolcat" + }, + { + "download_count": 224933, + "project": "pyramid-beaker" + }, + { + "download_count": 224799, + "project": "pytest-allure-adaptor" + }, + { + "download_count": 224606, + "project": "openapi-core" + }, + { + "download_count": 224528, + "project": "jaraco-itertools" + }, + { + "download_count": 224426, + "project": "emcee" + }, + { + "download_count": 224246, + "project": "trio" + }, + { + "download_count": 224218, + "project": "plotly-express" + }, + { + "download_count": 224064, + "project": "hexdump" + }, + { + "download_count": 224043, + "project": "binpacking" + }, + { + "download_count": 224021, + "project": "babelfish" + }, + { + "download_count": 223853, + "project": "bincrafters-package-tools" + }, + { + "download_count": 223736, + "project": "edx-rest-api-client" + }, + { + "download_count": 223721, + "project": "rstcheck" + }, + { + "download_count": 223494, + "project": "pylogo" + }, + { + "download_count": 223248, + "project": "h2o-pysparkling-2-3" + }, + { + "download_count": 223214, + "project": "pybloom" + }, + { + "download_count": 222931, + "project": "python3-memcached" + }, + { + "download_count": 222858, + "project": "conda" + }, + { + "download_count": 222781, + "project": "confusable-homoglyphs" + }, + { + "download_count": 222739, + "project": "loky" + }, + { + "download_count": 222684, + "project": "super-csv" + }, + { + "download_count": 222634, + "project": "jprops" + }, + { + "download_count": 222587, + "project": "keyvaultlib" + }, + { + "download_count": 222554, + "project": "fbmessenger" + }, + { + "download_count": 222508, + "project": "wiremock" + }, + { + "download_count": 222412, + "project": "django-prettyjson" + }, + { + "download_count": 222176, + "project": "hug" + }, + { + "download_count": 222175, + "project": "mws" + }, + { + "download_count": 221970, + "project": "dash-daq" + }, + { + "download_count": 221895, + "project": "slycot" + }, + { + "download_count": 221892, + "project": "flask-uploads" + }, + { + "download_count": 221647, + "project": "alooma" + }, + { + "download_count": 221631, + "project": "muffnn" + }, + { + "download_count": 221604, + "project": "python-gettext" + }, + { + "download_count": 221598, + "project": "civisml-extensions" + }, + { + "download_count": 221440, + "project": "jaydebeapi3" + }, + { + "download_count": 221407, + "project": "scikit-plot" + }, + { + "download_count": 220993, + "project": "twitter-ads" + }, + { + "download_count": 220495, + "project": "pandoc" + }, + { + "download_count": 220301, + "project": "nplusone" + }, + { + "download_count": 220198, + "project": "sudachipy" + }, + { + "download_count": 220107, + "project": "django-render-block" + }, + { + "download_count": 219983, + "project": "pyrebase" + }, + { + "download_count": 219731, + "project": "fabric2" + }, + { + "download_count": 219711, + "project": "cloudfoundry-client" + }, + { + "download_count": 219544, + "project": "edx-completion" + }, + { + "download_count": 219404, + "project": "tabulator" + }, + { + "download_count": 219376, + "project": "django-cron" + }, + { + "download_count": 219261, + "project": "sk-video" + }, + { + "download_count": 219216, + "project": "zope-i18nmessageid" + }, + { + "download_count": 218973, + "project": "colorful" + }, + { + "download_count": 218307, + "project": "s4cmd" + }, + { + "download_count": 218171, + "project": "pychromecast" + }, + { + "download_count": 218073, + "project": "pyvisa" + }, + { + "download_count": 217824, + "project": "bok-choy" + }, + { + "download_count": 217614, + "project": "py-zipkin" + }, + { + "download_count": 217311, + "project": "ansible-modules-hashivault" + }, + { + "download_count": 217201, + "project": "datefinder" + }, + { + "download_count": 217188, + "project": "json-logic-qubit" + }, + { + "download_count": 216980, + "project": "sparse-dot-topn" + }, + { + "download_count": 216825, + "project": "flask-dance" + }, + { + "download_count": 216707, + "project": "aiml" + }, + { + "download_count": 216645, + "project": "certipy" + }, + { + "download_count": 216205, + "project": "area" + }, + { + "download_count": 216115, + "project": "sphinx-click" + }, + { + "download_count": 215902, + "project": "pylint-common" + }, + { + "download_count": 215763, + "project": "stompest" + }, + { + "download_count": 215715, + "project": "questionary" + }, + { + "download_count": 215011, + "project": "lupa" + }, + { + "download_count": 214880, + "project": "usbinfo" + }, + { + "download_count": 214864, + "project": "marshmallow-objects" + }, + { + "download_count": 214855, + "project": "django-encrypted-filefield" + }, + { + "download_count": 214793, + "project": "kerberos" + }, + { + "download_count": 214757, + "project": "isim" + }, + { + "download_count": 214507, + "project": "flask-moment" + }, + { + "download_count": 214468, + "project": "boto3-session-cache" + }, + { + "download_count": 214280, + "project": "yacs" + }, + { + "download_count": 214088, + "project": "bigquery-python" + }, + { + "download_count": 213952, + "project": "mobly" + }, + { + "download_count": 213688, + "project": "pyethash" + }, + { + "download_count": 213494, + "project": "django-colorful" + }, + { + "download_count": 213445, + "project": "ics" + }, + { + "download_count": 213185, + "project": "eyes-selenium" + }, + { + "download_count": 213156, + "project": "zdesk" + }, + { + "download_count": 213151, + "project": "requests-credssp" + }, + { + "download_count": 213071, + "project": "autosemver" + }, + { + "download_count": 212879, + "project": "ffx" + }, + { + "download_count": 212740, + "project": "wn" + }, + { + "download_count": 212739, + "project": "linear-tsv" + }, + { + "download_count": 212738, + "project": "webexteamssdk" + }, + { + "download_count": 212640, + "project": "circus" + }, + { + "download_count": 212529, + "project": "multiaddr" + }, + { + "download_count": 212516, + "project": "zipcode" + }, + { + "download_count": 212435, + "project": "dbt-bigquery" + }, + { + "download_count": 212295, + "project": "androguard" + }, + { + "download_count": 212275, + "project": "gapic-google-cloud-spanner-v1" + }, + { + "download_count": 212211, + "project": "gapic-google-cloud-spanner-admin-database-v1" + }, + { + "download_count": 212204, + "project": "gapic-google-cloud-spanner-admin-instance-v1" + }, + { + "download_count": 212074, + "project": "proto-google-cloud-spanner-v1" + }, + { + "download_count": 211988, + "project": "pip-review" + }, + { + "download_count": 211861, + "project": "passwordmeter" + }, + { + "download_count": 211783, + "project": "dbt-redshift" + }, + { + "download_count": 211766, + "project": "proto-google-cloud-spanner-admin-database-v1" + }, + { + "download_count": 211758, + "project": "proto-google-cloud-spanner-admin-instance-v1" + }, + { + "download_count": 211695, + "project": "python-prctl" + }, + { + "download_count": 211523, + "project": "dbt-snowflake" + }, + { + "download_count": 211483, + "project": "aws-kinesis-agg" + }, + { + "download_count": 211368, + "project": "pwntools" + }, + { + "download_count": 211309, + "project": "fs-s3fs" + }, + { + "download_count": 211286, + "project": "cloudshell-automation-api" + }, + { + "download_count": 211188, + "project": "postgres" + }, + { + "download_count": 211130, + "project": "pymeta3" + }, + { + "download_count": 210970, + "project": "robotframework-jsonlibrary" + }, + { + "download_count": 210929, + "project": "conllu" + }, + { + "download_count": 210633, + "project": "rpi-gpio" + }, + { + "download_count": 210596, + "project": "aresponses" + }, + { + "download_count": 210520, + "project": "textacy" + }, + { + "download_count": 210501, + "project": "djangocms-link" + }, + { + "download_count": 210080, + "project": "uproot" + }, + { + "download_count": 209987, + "project": "django-fsm-admin" + }, + { + "download_count": 209975, + "project": "anybadge" + }, + { + "download_count": 209424, + "project": "clearbit" + }, + { + "download_count": 209150, + "project": "fakenewsredis" + }, + { + "download_count": 209126, + "project": "sdnotify" + }, + { + "download_count": 209028, + "project": "python-baseconv" + }, + { + "download_count": 208950, + "project": "pytest-dotenv" + }, + { + "download_count": 208654, + "project": "pytest-logger" + }, + { + "download_count": 208524, + "project": "c7n" + }, + { + "download_count": 208338, + "project": "webium" + }, + { + "download_count": 208232, + "project": "eliot" + }, + { + "download_count": 208191, + "project": "anaconda" + }, + { + "download_count": 208167, + "project": "zope-configuration" + }, + { + "download_count": 208131, + "project": "talon" + }, + { + "download_count": 208092, + "project": "django-split-settings" + }, + { + "download_count": 207912, + "project": "elasticsearch6" + }, + { + "download_count": 207665, + "project": "cx-freeze" + }, + { + "download_count": 207551, + "project": "pyclipper" + }, + { + "download_count": 207474, + "project": "duo-web" + }, + { + "download_count": 207412, + "project": "django-easy-select2" + }, + { + "download_count": 207319, + "project": "pytricia" + }, + { + "download_count": 207241, + "project": "pyecharts" + }, + { + "download_count": 207068, + "project": "zendesk" + }, + { + "download_count": 206988, + "project": "zodbpickle" + }, + { + "download_count": 206923, + "project": "scout-apm" + }, + { + "download_count": 206832, + "project": "contexttimer" + }, + { + "download_count": 206379, + "project": "ngxtop" + }, + { + "download_count": 206215, + "project": "python-xmp-toolkit" + }, + { + "download_count": 205992, + "project": "redlock" + }, + { + "download_count": 205889, + "project": "smartypants" + }, + { + "download_count": 205562, + "project": "flake8-coding" + }, + { + "download_count": 205284, + "project": "zodb" + }, + { + "download_count": 205270, + "project": "django-reversion-compare" + }, + { + "download_count": 205192, + "project": "html-linter" + }, + { + "download_count": 205141, + "project": "client" + }, + { + "download_count": 205070, + "project": "backports-shutil-which" + }, + { + "download_count": 204937, + "project": "frida" + }, + { + "download_count": 204809, + "project": "dawg-python" + }, + { + "download_count": 204696, + "project": "django-transaction-hooks" + }, + { + "download_count": 204486, + "project": "aiotask-context" + }, + { + "download_count": 204328, + "project": "lazy-property" + }, + { + "download_count": 204268, + "project": "urlparse2" + }, + { + "download_count": 204251, + "project": "template-remover" + }, + { + "download_count": 204130, + "project": "pyttsx3" + }, + { + "download_count": 204053, + "project": "mesh-tensorflow" + }, + { + "download_count": 203892, + "project": "django-crum" + }, + { + "download_count": 203786, + "project": "asciitree" + }, + { + "download_count": 203548, + "project": "flake8-deprecated" + }, + { + "download_count": 203495, + "project": "weberror" + }, + { + "download_count": 203493, + "project": "shudder" + }, + { + "download_count": 203310, + "project": "dash-auth" + }, + { + "download_count": 203161, + "project": "rasa-nlu" + }, + { + "download_count": 203073, + "project": "conf-d" + }, + { + "download_count": 202765, + "project": "django-slack" + }, + { + "download_count": 202648, + "project": "pocketsphinx" + }, + { + "download_count": 202044, + "project": "pydivert" + }, + { + "download_count": 202007, + "project": "blosc" + }, + { + "download_count": 201958, + "project": "zipstream" + }, + { + "download_count": 201831, + "project": "parallel-sync" + }, + { + "download_count": 201651, + "project": "pycuda" + }, + { + "download_count": 201622, + "project": "ta-lib" + }, + { + "download_count": 201459, + "project": "jmxquery" + }, + { + "download_count": 201457, + "project": "tabula-py" + }, + { + "download_count": 201395, + "project": "pytest-flask-sqlalchemy" + }, + { + "download_count": 201101, + "project": "collectd" + }, + { + "download_count": 201096, + "project": "django-rest-multiple-models" + }, + { + "download_count": 201084, + "project": "pyobjc-framework-coretext" + }, + { + "download_count": 200633, + "project": "smart-getenv" + }, + { + "download_count": 200507, + "project": "pyramid-retry" + }, + { + "download_count": 200444, + "project": "codeclimate-test-reporter" + }, + { + "download_count": 200411, + "project": "publicsuffixlist" + }, + { + "download_count": 200394, + "project": "algoliasearch-django" + }, + { + "download_count": 200267, + "project": "pytest-salt" + }, + { + "download_count": 200235, + "project": "pytest-doctestplus" + }, + { + "download_count": 200035, + "project": "zope-lifecycleevent" + }, + { + "download_count": 199808, + "project": "python-zaqarclient" + }, + { + "download_count": 199774, + "project": "iniherit" + }, + { + "download_count": 199753, + "project": "pymorphy2-dicts" + }, + { + "download_count": 199695, + "project": "hanging-threads" + }, + { + "download_count": 199645, + "project": "flask-classful" + }, + { + "download_count": 199602, + "project": "pyrad" + }, + { + "download_count": 199568, + "project": "jsoncompare" + }, + { + "download_count": 199376, + "project": "python-graph-core" + }, + { + "download_count": 199234, + "project": "flask-mysqldb" + }, + { + "download_count": 199123, + "project": "pymorphy2" + }, + { + "download_count": 199116, + "project": "uncertainties" + }, + { + "download_count": 198904, + "project": "jdatetime" + }, + { + "download_count": 198768, + "project": "package" + }, + { + "download_count": 198699, + "project": "django-user-sessions" + }, + { + "download_count": 198662, + "project": "jproperties" + }, + { + "download_count": 198655, + "project": "optional-django" + }, + { + "download_count": 198573, + "project": "azure-mgmt-common" + }, + { + "download_count": 198386, + "project": "csscompressor" + }, + { + "download_count": 198360, + "project": "robotframework-lint" + }, + { + "download_count": 198297, + "project": "bintrees" + }, + { + "download_count": 198099, + "project": "esptool" + }, + { + "download_count": 198014, + "project": "sox" + }, + { + "download_count": 197847, + "project": "cotyledon" + }, + { + "download_count": 197484, + "project": "kafka-utils" + }, + { + "download_count": 197448, + "project": "pingparsing" + }, + { + "download_count": 197436, + "project": "semidbm" + }, + { + "download_count": 197405, + "project": "polyaxon-schemas" + }, + { + "download_count": 196830, + "project": "python-mozaggregator" + }, + { + "download_count": 196757, + "project": "pandas-summary" + }, + { + "download_count": 196390, + "project": "nbval" + }, + { + "download_count": 196154, + "project": "python3-xlib" + }, + { + "download_count": 195862, + "project": "pyobjc-framework-coredata" + }, + { + "download_count": 195697, + "project": "django-json-widget" + }, + { + "download_count": 194638, + "project": "trimesh" + }, + { + "download_count": 194604, + "project": "pyobjc-framework-addressbook" + }, + { + "download_count": 194552, + "project": "sq-blocks" + }, + { + "download_count": 194524, + "project": "simple-crypt" + }, + { + "download_count": 194469, + "project": "imgkit" + }, + { + "download_count": 194216, + "project": "pytype" + }, + { + "download_count": 193866, + "project": "aiohttp-session" + }, + { + "download_count": 193810, + "project": "lib" + }, + { + "download_count": 193713, + "project": "pyobjc-framework-screensaver" + }, + { + "download_count": 193702, + "project": "remote-pdb" + }, + { + "download_count": 193646, + "project": "pyobjc-framework-syncservices" + }, + { + "download_count": 193463, + "project": "pyobjc-framework-scriptingbridge" + }, + { + "download_count": 193206, + "project": "glmnet-py" + }, + { + "download_count": 193173, + "project": "edx-django-release-util" + }, + { + "download_count": 193118, + "project": "pyobjc-framework-corelocation" + }, + { + "download_count": 193105, + "project": "pyobjc-framework-inputmethodkit" + }, + { + "download_count": 193099, + "project": "lob" + }, + { + "download_count": 192939, + "project": "deb-pkg-tools" + }, + { + "download_count": 192929, + "project": "traits" + }, + { + "download_count": 192741, + "project": "django-revproxy" + }, + { + "download_count": 192721, + "project": "edx-submissions" + }, + { + "download_count": 192662, + "project": "simpy" + }, + { + "download_count": 192636, + "project": "ebooklib" + }, + { + "download_count": 192632, + "project": "importlab" + }, + { + "download_count": 192581, + "project": "tweet-preprocessor" + }, + { + "download_count": 192462, + "project": "eight" + }, + { + "download_count": 192349, + "project": "edx-when" + }, + { + "download_count": 192282, + "project": "telepot" + }, + { + "download_count": 192227, + "project": "django-recaptcha2" + }, + { + "download_count": 192174, + "project": "fastjsonschema" + }, + { + "download_count": 191971, + "project": "rebulk" + }, + { + "download_count": 191767, + "project": "zope-dottedname" + }, + { + "download_count": 191702, + "project": "cli-proton-python" + }, + { + "download_count": 191581, + "project": "schema-salad" + }, + { + "download_count": 191533, + "project": "progressbar33" + }, + { + "download_count": 191495, + "project": "libnacl" + }, + { + "download_count": 191407, + "project": "mattermostwrapper" + }, + { + "download_count": 191403, + "project": "mox" + }, + { + "download_count": 191379, + "project": "esprima" + }, + { + "download_count": 191100, + "project": "tf-nightly-gpu" + }, + { + "download_count": 191091, + "project": "python-firebase" + }, + { + "download_count": 190890, + "project": "flake8-bandit" + }, + { + "download_count": 190752, + "project": "python3-logstash" + }, + { + "download_count": 190743, + "project": "pyutilib" + }, + { + "download_count": 190491, + "project": "easypost" + }, + { + "download_count": 190474, + "project": "web-fragments" + }, + { + "download_count": 190430, + "project": "pytest-coverage" + }, + { + "download_count": 190275, + "project": "mailjet-rest" + }, + { + "download_count": 190267, + "project": "riemann-client" + }, + { + "download_count": 190168, + "project": "pytest-test-groups" + }, + { + "download_count": 189997, + "project": "dialogflow" + }, + { + "download_count": 189912, + "project": "tableschema" + }, + { + "download_count": 189480, + "project": "segtok" + }, + { + "download_count": 189475, + "project": "contentful" + }, + { + "download_count": 189290, + "project": "ropgadget" + }, + { + "download_count": 189289, + "project": "user-agent" + }, + { + "download_count": 189193, + "project": "django-profiler" + }, + { + "download_count": 189156, + "project": "devstack-tools" + }, + { + "download_count": 188865, + "project": "django-leaflet" + }, + { + "download_count": 188683, + "project": "datetime-truncate" + }, + { + "download_count": 188451, + "project": "pyjslint" + }, + { + "download_count": 188348, + "project": "dvc" + }, + { + "download_count": 188172, + "project": "zope-cachedescriptors" + }, + { + "download_count": 188122, + "project": "onetoken" + }, + { + "download_count": 188063, + "project": "ipfshttpclient" + }, + { + "download_count": 187976, + "project": "azure-functions" + }, + { + "download_count": 187875, + "project": "optimizely-sdk" + }, + { + "download_count": 187858, + "project": "cwltool" + }, + { + "download_count": 187574, + "project": "seqdiag" + }, + { + "download_count": 187547, + "project": "libthumbor" + }, + { + "download_count": 187440, + "project": "atlassian-python-api" + }, + { + "download_count": 187397, + "project": "pyobjc-framework-corewlan" + }, + { + "download_count": 187363, + "project": "azure-cli-natgateway" + }, + { + "download_count": 187117, + "project": "pyobjc-framework-imagecapturecore" + }, + { + "download_count": 186984, + "project": "django-hosts" + }, + { + "download_count": 186865, + "project": "pytest-reportportal" + }, + { + "download_count": 186711, + "project": "pyobjc-framework-avfoundation" + }, + { + "download_count": 186705, + "project": "pyobjc-framework-corebluetooth" + }, + { + "download_count": 186590, + "project": "glog" + }, + { + "download_count": 186547, + "project": "pyobjc-framework-mapkit" + }, + { + "download_count": 186536, + "project": "pyobjc-framework-avkit" + }, + { + "download_count": 186474, + "project": "pyobjc-framework-storekit" + }, + { + "download_count": 186445, + "project": "pypom" + }, + { + "download_count": 186363, + "project": "pyobjc-framework-multipeerconnectivity" + }, + { + "download_count": 186349, + "project": "pyobjc-framework-scenekit" + }, + { + "download_count": 186324, + "project": "richenum" + }, + { + "download_count": 186299, + "project": "pyobjc-framework-imserviceplugin" + }, + { + "download_count": 186260, + "project": "pyobjc-framework-gamecenter" + }, + { + "download_count": 186239, + "project": "boto3-type-annotations-with-docs" + }, + { + "download_count": 186229, + "project": "pyobjc-framework-spritekit" + }, + { + "download_count": 186187, + "project": "pyobjc-framework-notificationcenter" + }, + { + "download_count": 186170, + "project": "salttesting" + }, + { + "download_count": 186131, + "project": "you-get" + }, + { + "download_count": 186067, + "project": "pyobjc-framework-cryptotokenkit" + }, + { + "download_count": 186058, + "project": "pytest-catchlog" + }, + { + "download_count": 185930, + "project": "iptcinfo" + }, + { + "download_count": 185874, + "project": "hashin" + }, + { + "download_count": 185785, + "project": "colormath" + }, + { + "download_count": 185776, + "project": "nanotime" + }, + { + "download_count": 185712, + "project": "python-saharaclient" + }, + { + "download_count": 185687, + "project": "yanc" + }, + { + "download_count": 185684, + "project": "methodtools" + }, + { + "download_count": 185575, + "project": "pytest-openfiles" + }, + { + "download_count": 185568, + "project": "zope-security" + }, + { + "download_count": 185489, + "project": "django-crequest" + }, + { + "download_count": 185383, + "project": "pymemoize" + }, + { + "download_count": 185321, + "project": "django-fsm-log" + }, + { + "download_count": 185307, + "project": "django-warrant" + }, + { + "download_count": 185226, + "project": "acora" + }, + { + "download_count": 184984, + "project": "python-hpilo" + }, + { + "download_count": 184866, + "project": "zope-exceptions" + }, + { + "download_count": 184842, + "project": "ase" + }, + { + "download_count": 184834, + "project": "django-debug-toolbar-request-history" + }, + { + "download_count": 184816, + "project": "clipboard" + }, + { + "download_count": 184780, + "project": "manifest-tool" + }, + { + "download_count": 184769, + "project": "pdftotext" + }, + { + "download_count": 184767, + "project": "events" + }, + { + "download_count": 184609, + "project": "zope-contenttype" + }, + { + "download_count": 184473, + "project": "django-discover-runner" + }, + { + "download_count": 184469, + "project": "libtiff" + }, + { + "download_count": 184406, + "project": "sqlacodegen" + }, + { + "download_count": 184172, + "project": "pyomo" + }, + { + "download_count": 184107, + "project": "django-admin-sortable" + }, + { + "download_count": 183722, + "project": "oic" + }, + { + "download_count": 183626, + "project": "django-user-tasks" + }, + { + "download_count": 183425, + "project": "edx-lint" + }, + { + "download_count": 183383, + "project": "netfilterqueue" + }, + { + "download_count": 183355, + "project": "zope-location" + }, + { + "download_count": 183073, + "project": "pyobjc-framework-qtkit" + }, + { + "download_count": 183058, + "project": "apispec-webframeworks" + }, + { + "download_count": 183054, + "project": "django-dbbackup" + }, + { + "download_count": 182995, + "project": "interpret-core" + }, + { + "download_count": 182971, + "project": "docker-compose-wait" + }, + { + "download_count": 182913, + "project": "socketpool" + }, + { + "download_count": 182775, + "project": "qgrid" + }, + { + "download_count": 182678, + "project": "localstack-ext" + }, + { + "download_count": 182643, + "project": "munkres" + }, + { + "download_count": 182633, + "project": "django-admin-list-filter-dropdown" + }, + { + "download_count": 182500, + "project": "edx-ccx-keys" + }, + { + "download_count": 182205, + "project": "jsonrpclib" + }, + { + "download_count": 182178, + "project": "pyinstrument-cext" + }, + { + "download_count": 182161, + "project": "wsgiproxy2" + }, + { + "download_count": 182080, + "project": "msgfy" + }, + { + "download_count": 182061, + "project": "localstack" + }, + { + "download_count": 182033, + "project": "mpl-finance" + }, + { + "download_count": 182028, + "project": "sinon" + }, + { + "download_count": 181902, + "project": "pyobjc-framework-photos" + }, + { + "download_count": 181883, + "project": "pyobjc-framework-contacts" + }, + { + "download_count": 181832, + "project": "pyobjc-framework-safariservices" + }, + { + "download_count": 181822, + "project": "nagiosplugin" + }, + { + "download_count": 181811, + "project": "hbmqtt" + }, + { + "download_count": 181809, + "project": "pyobjc-framework-photosui" + }, + { + "download_count": 181782, + "project": "rfc6266" + }, + { + "download_count": 181770, + "project": "wtforms-alchemy" + }, + { + "download_count": 181753, + "project": "pyobjc-framework-modelio" + }, + { + "download_count": 181752, + "project": "gocardless-pro" + }, + { + "download_count": 181742, + "project": "pyobjc-framework-applicationservices" + }, + { + "download_count": 181658, + "project": "datadog-checks-base" + }, + { + "download_count": 181619, + "project": "pyobjc-framework-contactsui" + }, + { + "download_count": 181492, + "project": "zope-publisher" + }, + { + "download_count": 181460, + "project": "pyobjc-framework-applescriptkit" + }, + { + "download_count": 181449, + "project": "pyobjc-framework-networkextension" + }, + { + "download_count": 181408, + "project": "zope-i18n" + }, + { + "download_count": 181315, + "project": "recordio" + }, + { + "download_count": 181306, + "project": "pyobjc-framework-preferencepanes" + }, + { + "download_count": 181204, + "project": "pyobjc-framework-installerplugins" + }, + { + "download_count": 181198, + "project": "pyobjc-framework-automator" + }, + { + "download_count": 181194, + "project": "python-interface" + }, + { + "download_count": 181178, + "project": "dogslow" + }, + { + "download_count": 181007, + "project": "s3pypi" + }, + { + "download_count": 180930, + "project": "arpeggio" + }, + { + "download_count": 180918, + "project": "pyobjc-framework-searchkit" + }, + { + "download_count": 180910, + "project": "pyobjc-framework-latentsemanticmapping" + }, + { + "download_count": 180898, + "project": "imgurpython" + }, + { + "download_count": 180787, + "project": "huey" + }, + { + "download_count": 180646, + "project": "pyobjc-framework-applescriptobjc" + }, + { + "download_count": 180541, + "project": "pyobjc-framework-instantmessage" + }, + { + "download_count": 180484, + "project": "pyclamd" + }, + { + "download_count": 180478, + "project": "pyobjc-framework-accounts" + }, + { + "download_count": 180443, + "project": "pyobjc-framework-servicemanagement" + }, + { + "download_count": 180359, + "project": "sortedcollections" + }, + { + "download_count": 180352, + "project": "pyobjc-framework-dictionaryservices" + }, + { + "download_count": 180326, + "project": "pyobjc-framework-pubsub" + }, + { + "download_count": 180234, + "project": "pyobjc-framework-collaboration" + }, + { + "download_count": 180184, + "project": "cqlsh" + }, + { + "download_count": 180108, + "project": "hacs-frontend" + }, + { + "download_count": 179819, + "project": "pyobjc-framework-social" + }, + { + "download_count": 179803, + "project": "pybars3" + }, + { + "download_count": 179768, + "project": "pyobjc-framework-eventkit" + }, + { + "download_count": 179757, + "project": "pyobjc-framework-opendirectory" + }, + { + "download_count": 179716, + "project": "chatterbot" + }, + { + "download_count": 179610, + "project": "neovim" + }, + { + "download_count": 179540, + "project": "json-logging" + }, + { + "download_count": 179401, + "project": "pytest-splinter" + }, + { + "download_count": 179317, + "project": "fig" + }, + { + "download_count": 179255, + "project": "pyte" + }, + { + "download_count": 179193, + "project": "bagit" + }, + { + "download_count": 179031, + "project": "aiohttp-swagger" + }, + { + "download_count": 178930, + "project": "django-cronman" + }, + { + "download_count": 178836, + "project": "robotframework-pageobjectlibrary" + }, + { + "download_count": 178805, + "project": "django-tenant-schemas" + }, + { + "download_count": 178606, + "project": "pypcd" + }, + { + "download_count": 178579, + "project": "s3contents" + }, + { + "download_count": 178532, + "project": "pytube" + }, + { + "download_count": 178420, + "project": "srvlookup" + }, + { + "download_count": 178249, + "project": "django-cache-url" + }, + { + "download_count": 178237, + "project": "pytest-sanic" + }, + { + "download_count": 178164, + "project": "pybase62" + }, + { + "download_count": 178040, + "project": "modulegraph" + }, + { + "download_count": 177513, + "project": "flufl-lock" + }, + { + "download_count": 177343, + "project": "pyobjc-framework-intents" + }, + { + "download_count": 177128, + "project": "playsound" + }, + { + "download_count": 177060, + "project": "django-sql-explorer" + }, + { + "download_count": 177040, + "project": "pymavlink" + }, + { + "download_count": 176939, + "project": "snowflake" + }, + { + "download_count": 176684, + "project": "drfdocs" + }, + { + "download_count": 176663, + "project": "django-sendfile" + }, + { + "download_count": 176504, + "project": "zope-testing" + }, + { + "download_count": 176439, + "project": "autocorrect" + }, + { + "download_count": 176429, + "project": "django-filters" + }, + { + "download_count": 176316, + "project": "delighted" + }, + { + "download_count": 176189, + "project": "pick" + }, + { + "download_count": 176166, + "project": "restricted-pkg" + }, + { + "download_count": 176069, + "project": "tlslite-ng" + }, + { + "download_count": 175910, + "project": "click-datetime" + }, + { + "download_count": 175901, + "project": "mapbox" + }, + { + "download_count": 175833, + "project": "zope-traversing" + }, + { + "download_count": 175827, + "project": "yagmail" + }, + { + "download_count": 175386, + "project": "os-diskconfig-python-novaclient-ext" + }, + { + "download_count": 175252, + "project": "env-utils" + }, + { + "download_count": 175153, + "project": "pyramid-chameleon" + }, + { + "download_count": 175039, + "project": "pysphere" + }, + { + "download_count": 174995, + "project": "pyobjc-framework-calendarstore" + }, + { + "download_count": 174675, + "project": "tfrecord-lite" + }, + { + "download_count": 174598, + "project": "zope-container" + }, + { + "download_count": 174537, + "project": "pyobjc-framework-iosurface" + }, + { + "download_count": 174516, + "project": "pyobjc-framework-netfs" + }, + { + "download_count": 174283, + "project": "zope-browser" + }, + { + "download_count": 174221, + "project": "cymysql" + }, + { + "download_count": 174210, + "project": "scrapy-fake-useragent" + }, + { + "download_count": 174182, + "project": "pysnooper" + }, + { + "download_count": 174143, + "project": "allennlp" + }, + { + "download_count": 174141, + "project": "itchat" + }, + { + "download_count": 174002, + "project": "pytest-arraydiff" + }, + { + "download_count": 174001, + "project": "multimethods" + }, + { + "download_count": 173985, + "project": "concurrencytest" + }, + { + "download_count": 173985, + "project": "pyxattr" + }, + { + "download_count": 173977, + "project": "pyobjc-framework-medialibrary" + }, + { + "download_count": 173974, + "project": "python-vlc" + }, + { + "download_count": 173922, + "project": "django-summernote" + }, + { + "download_count": 173897, + "project": "msal-extensions" + }, + { + "download_count": 173878, + "project": "pyobjc-framework-gamecontroller" + }, + { + "download_count": 173812, + "project": "pyobjc-framework-findersync" + }, + { + "download_count": 173771, + "project": "pyobjc-framework-cloudkit" + }, + { + "download_count": 173753, + "project": "pyobjc-framework-localauthentication" + }, + { + "download_count": 173686, + "project": "pyobjc-framework-mediaaccessibility" + }, + { + "download_count": 173647, + "project": "vega" + }, + { + "download_count": 173582, + "project": "textstat" + }, + { + "download_count": 173469, + "project": "neomodel" + }, + { + "download_count": 173417, + "project": "pyobjc" + }, + { + "download_count": 173414, + "project": "check-puppet-agent" + }, + { + "download_count": 173066, + "project": "os-networksv2-python-novaclient-ext" + }, + { + "download_count": 173034, + "project": "vcd-cli" + }, + { + "download_count": 172953, + "project": "numdifftools" + }, + { + "download_count": 172704, + "project": "tensorflow-graphics" + }, + { + "download_count": 172697, + "project": "pysqslistener" + }, + { + "download_count": 172681, + "project": "kazurator" + }, + { + "download_count": 172661, + "project": "xstatic-roboto-fontface" + }, + { + "download_count": 172595, + "project": "asyncio-nats-streaming" + }, + { + "download_count": 172285, + "project": "slugify" + }, + { + "download_count": 172276, + "project": "jupyter-notebook-gist" + }, + { + "download_count": 172213, + "project": "awsretry" + }, + { + "download_count": 172075, + "project": "flup" + }, + { + "download_count": 172011, + "project": "tornado-aws" + }, + { + "download_count": 171812, + "project": "rackspace-novaclient" + }, + { + "download_count": 171679, + "project": "django-q" + }, + { + "download_count": 171593, + "project": "rax-default-network-flags-python-novaclient-ext" + }, + { + "download_count": 171548, + "project": "object-pool" + }, + { + "download_count": 171504, + "project": "xstatic-font-awesome" + }, + { + "download_count": 171492, + "project": "rackspace-auth-openstack" + }, + { + "download_count": 171339, + "project": "qdarkstyle" + }, + { + "download_count": 171275, + "project": "tox-monorepo" + } + ] +} diff --git a/Tools/peg_generator/data/xxl.zip b/Tools/peg_generator/data/xxl.zip new file mode 100644 index 00000000..54214088 Binary files /dev/null and b/Tools/peg_generator/data/xxl.zip differ diff --git a/Tools/peg_generator/mypy.ini b/Tools/peg_generator/mypy.ini new file mode 100644 index 00000000..80d5c057 --- /dev/null +++ b/Tools/peg_generator/mypy.ini @@ -0,0 +1,26 @@ +[mypy] +files = pegen, scripts + +follow_imports = error +no_implicit_optional = True +strict_optional = True + +#check_untyped_defs = True +disallow_untyped_calls = True +disallow_untyped_defs = True + +disallow_any_generics = true +disallow_any_unimported = True +disallow_incomplete_defs = True +disallow_subclassing_any = True + +warn_unused_configs = True +warn_unused_ignores = true +warn_redundant_casts = true +warn_no_return = True + +show_traceback = True +show_error_codes = True + +[mypy-pegen.grammar_parser] +strict_optional = False diff --git a/Tools/peg_generator/peg_extension/__init__.py b/Tools/peg_generator/peg_extension/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Tools/peg_generator/peg_extension/peg_extension.c b/Tools/peg_generator/peg_extension/peg_extension.c new file mode 100644 index 00000000..96d3a52b --- /dev/null +++ b/Tools/peg_generator/peg_extension/peg_extension.c @@ -0,0 +1,154 @@ +#include "pegen.h" + +PyObject * +_build_return_object(mod_ty module, int mode, PyObject *filename_ob, PyArena *arena) +{ + PyObject *result = NULL; + + if (mode == 2) { + result = (PyObject *)PyAST_CompileObject(module, filename_ob, NULL, -1, arena); + } else if (mode == 1) { + result = PyAST_mod2obj(module); + } else { + result = Py_None; + Py_INCREF(result); + } + + return result; +} + +static PyObject * +parse_file(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *keywords[] = {"file", "mode", NULL}; + const char *filename; + int mode = 2; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|i", keywords, &filename, &mode)) { + return NULL; + } + if (mode < 0 || mode > 2) { + return PyErr_Format(PyExc_ValueError, "Bad mode, must be 0 <= mode <= 2"); + } + + PyArena *arena = PyArena_New(); + if (arena == NULL) { + return NULL; + } + + PyObject *result = NULL; + + PyObject *filename_ob = PyUnicode_FromString(filename); + if (filename_ob == NULL) { + goto error; + } + + PyCompilerFlags flags = _PyCompilerFlags_INIT; + mod_ty res = _PyPegen_run_parser_from_file(filename, Py_file_input, filename_ob, &flags, arena); + if (res == NULL) { + goto error; + } + + result = _build_return_object(res, mode, filename_ob, arena); + +error: + Py_XDECREF(filename_ob); + PyArena_Free(arena); + return result; +} + +static PyObject * +parse_string(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *keywords[] = {"str", "mode", NULL}; + const char *the_string; + int mode = 2; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|i", keywords, &the_string, &mode)) { + return NULL; + } + if (mode < 0 || mode > 2) { + return PyErr_Format(PyExc_ValueError, "Bad mode, must be 0 <= mode <= 2"); + } + + PyArena *arena = PyArena_New(); + if (arena == NULL) { + return NULL; + } + + PyObject *result = NULL; + + PyObject *filename_ob = PyUnicode_FromString(""); + if (filename_ob == NULL) { + goto error; + } + + PyCompilerFlags flags = _PyCompilerFlags_INIT; + mod_ty res = _PyPegen_run_parser_from_string(the_string, Py_file_input, filename_ob, + &flags, arena); + if (res == NULL) { + goto error; + } + result = _build_return_object(res, mode, filename_ob, arena); + +error: + Py_XDECREF(filename_ob); + PyArena_Free(arena); + return result; +} + +static PyObject * +clear_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) +{ + _PyPegen_clear_memo_statistics(); + Py_RETURN_NONE; +} + +static PyObject * +get_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) +{ + return _PyPegen_get_memo_statistics(); +} + +// TODO: Write to Python's sys.stdout instead of C's stdout. +static PyObject * +dump_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) +{ + PyObject *list = _PyPegen_get_memo_statistics(); + if (list == NULL) { + return NULL; + } + Py_ssize_t len = PyList_Size(list); + for (Py_ssize_t i = 0; i < len; i++) { + PyObject *value = PyList_GetItem(list, i); // Borrowed reference. + long count = PyLong_AsLong(value); + if (count < 0) { + break; + } + if (count > 0) { + printf("%4zd %9ld\n", i, count); + } + } + Py_DECREF(list); + Py_RETURN_NONE; +} + +static PyMethodDef ParseMethods[] = { + {"parse_file", (PyCFunction)(void(*)(void))parse_file, METH_VARARGS|METH_KEYWORDS, "Parse a file."}, + {"parse_string", (PyCFunction)(void(*)(void))parse_string, METH_VARARGS|METH_KEYWORDS, "Parse a string."}, + {"clear_memo_stats", clear_memo_stats, METH_NOARGS}, + {"dump_memo_stats", dump_memo_stats, METH_NOARGS}, + {"get_memo_stats", get_memo_stats, METH_NOARGS}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +static struct PyModuleDef parsemodule = { + PyModuleDef_HEAD_INIT, + .m_name = "parse", + .m_doc = "A parser.", + .m_methods = ParseMethods, +}; + +PyMODINIT_FUNC +PyInit_parse(void) +{ + return PyModule_Create(&parsemodule); +} diff --git a/Tools/peg_generator/pegen/__init__.py b/Tools/peg_generator/pegen/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Tools/peg_generator/pegen/__main__.py b/Tools/peg_generator/pegen/__main__.py new file mode 100755 index 00000000..1dcbaad1 --- /dev/null +++ b/Tools/peg_generator/pegen/__main__.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3.8 + +"""pegen -- PEG Generator. + +Search the web for PEG Parsers for reference. +""" + +import argparse +import sys +import time +import token +import traceback + +from typing import Tuple + +from pegen.build import Grammar, Parser, Tokenizer, ParserGenerator + + +def generate_c_code( + args: argparse.Namespace, +) -> Tuple[Grammar, Parser, Tokenizer, ParserGenerator]: + from pegen.build import build_c_parser_and_generator + + verbose = args.verbose + verbose_tokenizer = verbose >= 3 + verbose_parser = verbose == 2 or verbose >= 4 + try: + grammar, parser, tokenizer, gen = build_c_parser_and_generator( + args.grammar_filename, + args.tokens_filename, + args.output, + args.compile_extension, + verbose_tokenizer, + verbose_parser, + args.verbose, + keep_asserts_in_extension=False if args.optimized else True, + skip_actions=args.skip_actions, + ) + return grammar, parser, tokenizer, gen + except Exception as err: + if args.verbose: + raise # Show traceback + traceback.print_exception(err.__class__, err, None) + sys.stderr.write("For full traceback, use -v\n") + sys.exit(1) + + +def generate_python_code( + args: argparse.Namespace, +) -> Tuple[Grammar, Parser, Tokenizer, ParserGenerator]: + from pegen.build import build_python_parser_and_generator + + verbose = args.verbose + verbose_tokenizer = verbose >= 3 + verbose_parser = verbose == 2 or verbose >= 4 + try: + grammar, parser, tokenizer, gen = build_python_parser_and_generator( + args.grammar_filename, + args.output, + verbose_tokenizer, + verbose_parser, + skip_actions=args.skip_actions, + ) + return grammar, parser, tokenizer, gen + except Exception as err: + if args.verbose: + raise # Show traceback + traceback.print_exception(err.__class__, err, None) + sys.stderr.write("For full traceback, use -v\n") + sys.exit(1) + + +argparser = argparse.ArgumentParser( + prog="pegen", description="Experimental PEG-like parser generator" +) +argparser.add_argument("-q", "--quiet", action="store_true", help="Don't print the parsed grammar") +argparser.add_argument( + "-v", + "--verbose", + action="count", + default=0, + help="Print timing stats; repeat for more debug output", +) +subparsers = argparser.add_subparsers(help="target language for the generated code") + +c_parser = subparsers.add_parser("c", help="Generate C code for inclusion into CPython") +c_parser.set_defaults(func=generate_c_code) +c_parser.add_argument("grammar_filename", help="Grammar description") +c_parser.add_argument("tokens_filename", help="Tokens description") +c_parser.add_argument( + "-o", "--output", metavar="OUT", default="parse.c", help="Where to write the generated parser" +) +c_parser.add_argument( + "--compile-extension", + action="store_true", + help="Compile generated C code into an extension module", +) +c_parser.add_argument( + "--optimized", action="store_true", help="Compile the extension in optimized mode" +) +c_parser.add_argument( + "--skip-actions", action="store_true", help="Suppress code emission for rule actions", +) + +python_parser = subparsers.add_parser("python", help="Generate Python code") +python_parser.set_defaults(func=generate_python_code) +python_parser.add_argument("grammar_filename", help="Grammar description") +python_parser.add_argument( + "-o", + "--output", + metavar="OUT", + default="parse.py", + help="Where to write the generated parser", +) +python_parser.add_argument( + "--skip-actions", action="store_true", help="Suppress code emission for rule actions", +) + + +def main() -> None: + from pegen.testutil import print_memstats + + args = argparser.parse_args() + if "func" not in args: + argparser.error("Must specify the target language mode ('c' or 'python')") + + t0 = time.time() + grammar, parser, tokenizer, gen = args.func(args) + t1 = time.time() + + if not args.quiet: + if args.verbose: + print("Raw Grammar:") + for line in repr(grammar).splitlines(): + print(" ", line) + + print("Clean Grammar:") + for line in str(grammar).splitlines(): + print(" ", line) + + if args.verbose: + print("First Graph:") + for src, dsts in gen.first_graph.items(): + print(f" {src} -> {', '.join(dsts)}") + print("First SCCS:") + for scc in gen.first_sccs: + print(" ", scc, end="") + if len(scc) > 1: + print( + " # Indirectly left-recursive; leaders:", + {name for name in scc if grammar.rules[name].leader}, + ) + else: + name = next(iter(scc)) + if name in gen.first_graph[name]: + print(" # Left-recursive") + else: + print() + + if args.verbose: + dt = t1 - t0 + diag = tokenizer.diagnose() + nlines = diag.end[0] + if diag.type == token.ENDMARKER: + nlines -= 1 + print(f"Total time: {dt:.3f} sec; {nlines} lines", end="") + if dt: + print(f"; {nlines / dt:.0f} lines/sec") + else: + print() + print("Caches sizes:") + print(f" token array : {len(tokenizer._tokens):10}") + print(f" cache : {len(parser._cache):10}") + if not print_memstats(): + print("(Can't find psutil; install it for memory stats.)") + + +if __name__ == "__main__": + if sys.version_info < (3, 8): + print("ERROR: using pegen requires at least Python 3.8!", file=sys.stderr) + sys.exit(1) + main() diff --git a/Tools/peg_generator/pegen/ast_dump.py b/Tools/peg_generator/pegen/ast_dump.py new file mode 100644 index 00000000..93dfbfd9 --- /dev/null +++ b/Tools/peg_generator/pegen/ast_dump.py @@ -0,0 +1,63 @@ +""" +Copy-parse of ast.dump, removing the `isinstance` checks. This is needed, +because testing pegen requires generating a C extension module, which contains +a copy of the symbols defined in Python-ast.c. Thus, the isinstance check would +always fail. We rely on string comparison of the base classes instead. +TODO: Remove the above-described hack. +""" + + +def ast_dump(node, annotate_fields=True, include_attributes=False, *, indent=None): + def _format(node, level=0): + if indent is not None: + level += 1 + prefix = "\n" + indent * level + sep = ",\n" + indent * level + else: + prefix = "" + sep = ", " + if any(cls.__name__ == "AST" for cls in node.__class__.__mro__): + cls = type(node) + args = [] + allsimple = True + keywords = annotate_fields + for name in node._fields: + try: + value = getattr(node, name) + except AttributeError: + keywords = True + continue + if value is None and getattr(cls, name, ...) is None: + keywords = True + continue + value, simple = _format(value, level) + allsimple = allsimple and simple + if keywords: + args.append("%s=%s" % (name, value)) + else: + args.append(value) + if include_attributes and node._attributes: + for name in node._attributes: + try: + value = getattr(node, name) + except AttributeError: + continue + if value is None and getattr(cls, name, ...) is None: + continue + value, simple = _format(value, level) + allsimple = allsimple and simple + args.append("%s=%s" % (name, value)) + if allsimple and len(args) <= 3: + return "%s(%s)" % (node.__class__.__name__, ", ".join(args)), not args + return "%s(%s%s)" % (node.__class__.__name__, prefix, sep.join(args)), False + elif isinstance(node, list): + if not node: + return "[]", True + return "[%s%s]" % (prefix, sep.join(_format(x, level)[0] for x in node)), False + return repr(node), True + + if all(cls.__name__ != "AST" for cls in node.__class__.__mro__): + raise TypeError("expected AST, got %r" % node.__class__.__name__) + if indent is not None and not isinstance(indent, str): + indent = " " * indent + return _format(node)[0] diff --git a/Tools/peg_generator/pegen/build.py b/Tools/peg_generator/pegen/build.py new file mode 100644 index 00000000..931ffc78 --- /dev/null +++ b/Tools/peg_generator/pegen/build.py @@ -0,0 +1,248 @@ +import pathlib +import shutil +import tokenize +import sysconfig +import tempfile +import itertools + +from typing import Optional, Tuple, List, IO, Set, Dict + +from pegen.c_generator import CParserGenerator +from pegen.grammar import Grammar +from pegen.grammar_parser import GeneratedParser as GrammarParser +from pegen.parser import Parser +from pegen.parser_generator import ParserGenerator +from pegen.python_generator import PythonParserGenerator +from pegen.tokenizer import Tokenizer + +MOD_DIR = pathlib.Path(__file__).resolve().parent + +TokenDefinitions = Tuple[Dict[int, str], Dict[str, int], Set[str]] + + +def get_extra_flags(compiler_flags: str, compiler_py_flags_nodist: str) -> List[str]: + flags = sysconfig.get_config_var(compiler_flags) + py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist) + if flags is None or py_flags_nodist is None: + return [] + return f"{flags} {py_flags_nodist}".split() + + +def compile_c_extension( + generated_source_path: str, + build_dir: Optional[str] = None, + verbose: bool = False, + keep_asserts: bool = True, +) -> str: + """Compile the generated source for a parser generator into an extension module. + + The extension module will be generated in the same directory as the provided path + for the generated source, with the same basename (in addition to extension module + metadata). For example, for the source mydir/parser.c the generated extension + in a darwin system with python 3.8 will be mydir/parser.cpython-38-darwin.so. + + If *build_dir* is provided, that path will be used as the temporary build directory + of distutils (this is useful in case you want to use a temporary directory). + """ + import distutils.log + from distutils.core import Distribution, Extension + from distutils.command.clean import clean # type: ignore + from distutils.command.build_ext import build_ext # type: ignore + from distutils.tests.support import fixup_build_ext # type: ignore + + if verbose: + distutils.log.set_verbosity(distutils.log.DEBUG) + + source_file_path = pathlib.Path(generated_source_path) + extension_name = source_file_path.stem + extra_compile_args = get_extra_flags("CFLAGS", "PY_CFLAGS_NODIST") + extra_link_args = get_extra_flags("LDFLAGS", "PY_LDFLAGS_NODIST") + if keep_asserts: + extra_compile_args.append("-UNDEBUG") + extension = [ + Extension( + extension_name, + sources=[ + str(MOD_DIR.parent.parent.parent / "Python" / "Python-ast.c"), + str(MOD_DIR.parent.parent.parent / "Python" / "asdl.c"), + str(MOD_DIR.parent.parent.parent / "Parser" / "tokenizer.c"), + str(MOD_DIR.parent.parent.parent / "Parser" / "pegen" / "pegen.c"), + str(MOD_DIR.parent.parent.parent / "Parser" / "pegen" / "parse_string.c"), + str(MOD_DIR.parent / "peg_extension" / "peg_extension.c"), + generated_source_path, + ], + include_dirs=[ + str(MOD_DIR.parent.parent.parent / "Include" / "internal"), + str(MOD_DIR.parent.parent.parent / "Parser"), + str(MOD_DIR.parent.parent.parent / "Parser" / "pegen"), + ], + extra_compile_args=extra_compile_args, + extra_link_args=extra_link_args, + ) + ] + dist = Distribution({"name": extension_name, "ext_modules": extension}) + cmd = build_ext(dist) + fixup_build_ext(cmd) + cmd.inplace = True + if build_dir: + cmd.build_temp = build_dir + cmd.build_lib = build_dir + cmd.ensure_finalized() + cmd.run() + + extension_path = source_file_path.parent / cmd.get_ext_filename(extension_name) + shutil.move(cmd.get_ext_fullpath(extension_name), extension_path) + + cmd = clean(dist) + cmd.finalize_options() + cmd.run() + + return extension_path + + +def build_parser( + grammar_file: str, verbose_tokenizer: bool = False, verbose_parser: bool = False +) -> Tuple[Grammar, Parser, Tokenizer]: + with open(grammar_file) as file: + tokenizer = Tokenizer(tokenize.generate_tokens(file.readline), verbose=verbose_tokenizer) + parser = GrammarParser(tokenizer, verbose=verbose_parser) + grammar = parser.start() + + if not grammar: + raise parser.make_syntax_error(grammar_file) + + return grammar, parser, tokenizer + + +def generate_token_definitions(tokens: IO[str]) -> TokenDefinitions: + all_tokens = {} + exact_tokens = {} + non_exact_tokens = set() + numbers = itertools.count(0) + + for line in tokens: + line = line.strip() + + if not line or line.startswith("#"): + continue + + pieces = line.split() + index = next(numbers) + + if len(pieces) == 1: + (token,) = pieces + non_exact_tokens.add(token) + all_tokens[index] = token + elif len(pieces) == 2: + token, op = pieces + exact_tokens[op.strip("'")] = index + all_tokens[index] = token + else: + raise ValueError(f"Unexpected line found in Tokens file: {line}") + + return all_tokens, exact_tokens, non_exact_tokens + + +def build_c_generator( + grammar: Grammar, + grammar_file: str, + tokens_file: str, + output_file: str, + compile_extension: bool = False, + verbose_c_extension: bool = False, + keep_asserts_in_extension: bool = True, + skip_actions: bool = False, +) -> ParserGenerator: + with open(tokens_file, "r") as tok_file: + all_tokens, exact_tok, non_exact_tok = generate_token_definitions(tok_file) + with open(output_file, "w") as file: + gen: ParserGenerator = CParserGenerator( + grammar, all_tokens, exact_tok, non_exact_tok, file, skip_actions=skip_actions + ) + gen.generate(grammar_file) + + if compile_extension: + with tempfile.TemporaryDirectory() as build_dir: + compile_c_extension( + output_file, + build_dir=build_dir, + verbose=verbose_c_extension, + keep_asserts=keep_asserts_in_extension, + ) + return gen + + +def build_python_generator( + grammar: Grammar, grammar_file: str, output_file: str, skip_actions: bool = False, +) -> ParserGenerator: + with open(output_file, "w") as file: + gen: ParserGenerator = PythonParserGenerator(grammar, file) # TODO: skip_actions + gen.generate(grammar_file) + return gen + + +def build_c_parser_and_generator( + grammar_file: str, + tokens_file: str, + output_file: str, + compile_extension: bool = False, + verbose_tokenizer: bool = False, + verbose_parser: bool = False, + verbose_c_extension: bool = False, + keep_asserts_in_extension: bool = True, + skip_actions: bool = False, +) -> Tuple[Grammar, Parser, Tokenizer, ParserGenerator]: + """Generate rules, C parser, tokenizer, parser generator for a given grammar + + Args: + grammar_file (string): Path for the grammar file + tokens_file (string): Path for the tokens file + output_file (string): Path for the output file + compile_extension (bool, optional): Whether to compile the C extension. + Defaults to False. + verbose_tokenizer (bool, optional): Whether to display additional output + when generating the tokenizer. Defaults to False. + verbose_parser (bool, optional): Whether to display additional output + when generating the parser. Defaults to False. + verbose_c_extension (bool, optional): Whether to display additional + output when compiling the C extension . Defaults to False. + keep_asserts_in_extension (bool, optional): Whether to keep the assert statements + when compiling the extension module. Defaults to True. + skip_actions (bool, optional): Whether to pretend no rule has any actions. + """ + grammar, parser, tokenizer = build_parser(grammar_file, verbose_tokenizer, verbose_parser) + gen = build_c_generator( + grammar, + grammar_file, + tokens_file, + output_file, + compile_extension, + verbose_c_extension, + keep_asserts_in_extension, + skip_actions=skip_actions, + ) + + return grammar, parser, tokenizer, gen + + +def build_python_parser_and_generator( + grammar_file: str, + output_file: str, + verbose_tokenizer: bool = False, + verbose_parser: bool = False, + skip_actions: bool = False, +) -> Tuple[Grammar, Parser, Tokenizer, ParserGenerator]: + """Generate rules, python parser, tokenizer, parser generator for a given grammar + + Args: + grammar_file (string): Path for the grammar file + output_file (string): Path for the output file + verbose_tokenizer (bool, optional): Whether to display additional output + when generating the tokenizer. Defaults to False. + verbose_parser (bool, optional): Whether to display additional output + when generating the parser. Defaults to False. + skip_actions (bool, optional): Whether to pretend no rule has any actions. + """ + grammar, parser, tokenizer = build_parser(grammar_file, verbose_tokenizer, verbose_parser) + gen = build_python_generator(grammar, grammar_file, output_file, skip_actions=skip_actions,) + return grammar, parser, tokenizer, gen diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py new file mode 100644 index 00000000..aee668c3 --- /dev/null +++ b/Tools/peg_generator/pegen/c_generator.py @@ -0,0 +1,785 @@ +import ast +from dataclasses import field, dataclass +import re +from typing import Any, Dict, IO, Optional, List, Text, Tuple, Set +from enum import Enum + +from pegen import grammar +from pegen.grammar import ( + Alt, + Cut, + Gather, + GrammarVisitor, + Group, + Lookahead, + NamedItem, + NameLeaf, + NegativeLookahead, + Opt, + PositiveLookahead, + Repeat0, + Repeat1, + Rhs, + Rule, + StringLeaf, +) +from pegen.parser_generator import ParserGenerator + + +EXTENSION_PREFIX = """\ +#include "pegen.h" + +#if defined(Py_DEBUG) && defined(Py_BUILD_CORE) +extern int Py_DebugFlag; +#define D(x) if (Py_DebugFlag) x; +#else +#define D(x) +#endif + +""" + + +EXTENSION_SUFFIX = """ +void * +_PyPegen_parse(Parser *p) +{ + // Initialize keywords + p->keywords = reserved_keywords; + p->n_keyword_lists = n_keyword_lists; + + return start_rule(p); +} +""" + + +class NodeTypes(Enum): + NAME_TOKEN = 0 + NUMBER_TOKEN = 1 + STRING_TOKEN = 2 + GENERIC_TOKEN = 3 + KEYWORD = 4 + SOFT_KEYWORD = 5 + CUT_OPERATOR = 6 + + +BASE_NODETYPES = { + "NAME": NodeTypes.NAME_TOKEN, + "NUMBER": NodeTypes.NUMBER_TOKEN, + "STRING": NodeTypes.STRING_TOKEN, +} + + +@dataclass +class FunctionCall: + function: str + arguments: List[Any] = field(default_factory=list) + assigned_variable: Optional[str] = None + return_type: Optional[str] = None + nodetype: Optional[NodeTypes] = None + force_true: bool = False + comment: Optional[str] = None + + def __str__(self) -> str: + parts = [] + parts.append(self.function) + if self.arguments: + parts.append(f"({', '.join(map(str, self.arguments))})") + if self.force_true: + parts.append(", 1") + if self.assigned_variable: + parts = ["(", self.assigned_variable, " = ", *parts, ")"] + if self.comment: + parts.append(f" // {self.comment}") + return "".join(parts) + + +class CCallMakerVisitor(GrammarVisitor): + def __init__( + self, + parser_generator: ParserGenerator, + exact_tokens: Dict[str, int], + non_exact_tokens: Set[str], + ): + self.gen = parser_generator + self.exact_tokens = exact_tokens + self.non_exact_tokens = non_exact_tokens + self.cache: Dict[Any, FunctionCall] = {} + self.keyword_cache: Dict[str, int] = {} + self.soft_keywords: Set[str] = set() + + def keyword_helper(self, keyword: str) -> FunctionCall: + if keyword not in self.keyword_cache: + self.keyword_cache[keyword] = self.gen.keyword_type() + return FunctionCall( + assigned_variable="_keyword", + function="_PyPegen_expect_token", + arguments=["p", self.keyword_cache[keyword]], + return_type="Token *", + nodetype=NodeTypes.KEYWORD, + comment=f"token='{keyword}'", + ) + + def soft_keyword_helper(self, value: str) -> FunctionCall: + self.soft_keywords.add(value.replace('"', "")) + return FunctionCall( + assigned_variable="_keyword", + function="_PyPegen_expect_soft_keyword", + arguments=["p", value], + return_type="expr_ty", + nodetype=NodeTypes.SOFT_KEYWORD, + comment=f"soft_keyword='{value}'", + ) + + def visit_NameLeaf(self, node: NameLeaf) -> FunctionCall: + name = node.value + if name in self.non_exact_tokens: + if name in BASE_NODETYPES: + return FunctionCall( + assigned_variable=f"{name.lower()}_var", + function=f"_PyPegen_{name.lower()}_token", + arguments=["p"], + nodetype=BASE_NODETYPES[name], + return_type="expr_ty", + comment=name, + ) + return FunctionCall( + assigned_variable=f"{name.lower()}_var", + function=f"_PyPegen_expect_token", + arguments=["p", name], + nodetype=NodeTypes.GENERIC_TOKEN, + return_type="Token *", + comment=f"token='{name}'", + ) + + type = None + rule = self.gen.all_rules.get(name.lower()) + if rule is not None: + type = "asdl_seq *" if rule.is_loop() or rule.is_gather() else rule.type + + return FunctionCall( + assigned_variable=f"{name}_var", + function=f"{name}_rule", + arguments=["p"], + return_type=type, + comment=f"{node}", + ) + + def visit_StringLeaf(self, node: StringLeaf) -> FunctionCall: + val = ast.literal_eval(node.value) + if re.match(r"[a-zA-Z_]\w*\Z", val): # This is a keyword + if node.value.endswith("'"): + return self.keyword_helper(val) + else: + return self.soft_keyword_helper(node.value) + else: + assert val in self.exact_tokens, f"{node.value} is not a known literal" + type = self.exact_tokens[val] + return FunctionCall( + assigned_variable="_literal", + function=f"_PyPegen_expect_token", + arguments=["p", type], + nodetype=NodeTypes.GENERIC_TOKEN, + return_type="Token *", + comment=f"token='{val}'", + ) + + def visit_Rhs(self, node: Rhs) -> FunctionCall: + def can_we_inline(node: Rhs) -> int: + if len(node.alts) != 1 or len(node.alts[0].items) != 1: + return False + # If the alternative has an action we cannot inline + if getattr(node.alts[0], "action", None) is not None: + return False + return True + + if node in self.cache: + return self.cache[node] + if can_we_inline(node): + self.cache[node] = self.generate_call(node.alts[0].items[0]) + else: + name = self.gen.name_node(node) + self.cache[node] = FunctionCall( + assigned_variable=f"{name}_var", + function=f"{name}_rule", + arguments=["p"], + comment=f"{node}", + ) + return self.cache[node] + + def visit_NamedItem(self, node: NamedItem) -> FunctionCall: + call = self.generate_call(node.item) + if node.name: + call.assigned_variable = node.name + return call + + def lookahead_call_helper(self, node: Lookahead, positive: int) -> FunctionCall: + call = self.generate_call(node.node) + if call.nodetype == NodeTypes.NAME_TOKEN: + return FunctionCall( + function=f"_PyPegen_lookahead_with_name", + arguments=[positive, call.function, *call.arguments], + return_type="int", + ) + elif call.nodetype == NodeTypes.SOFT_KEYWORD: + return FunctionCall( + function=f"_PyPegen_lookahead_with_string", + arguments=[positive, call.function, *call.arguments], + return_type="int", + ) + elif call.nodetype in {NodeTypes.GENERIC_TOKEN, NodeTypes.KEYWORD}: + return FunctionCall( + function=f"_PyPegen_lookahead_with_int", + arguments=[positive, call.function, *call.arguments], + return_type="int", + comment=f"token={node.node}", + ) + else: + return FunctionCall( + function=f"_PyPegen_lookahead", + arguments=[positive, call.function, *call.arguments], + return_type="int", + ) + + def visit_PositiveLookahead(self, node: PositiveLookahead) -> FunctionCall: + return self.lookahead_call_helper(node, 1) + + def visit_NegativeLookahead(self, node: NegativeLookahead) -> FunctionCall: + return self.lookahead_call_helper(node, 0) + + def visit_Opt(self, node: Opt) -> FunctionCall: + call = self.generate_call(node.node) + return FunctionCall( + assigned_variable="_opt_var", + function=call.function, + arguments=call.arguments, + force_true=True, + comment=f"{node}", + ) + + def visit_Repeat0(self, node: Repeat0) -> FunctionCall: + if node in self.cache: + return self.cache[node] + name = self.gen.name_loop(node.node, False) + self.cache[node] = FunctionCall( + assigned_variable=f"{name}_var", + function=f"{name}_rule", + arguments=["p"], + return_type="asdl_seq *", + comment=f"{node}", + ) + return self.cache[node] + + def visit_Repeat1(self, node: Repeat1) -> FunctionCall: + if node in self.cache: + return self.cache[node] + name = self.gen.name_loop(node.node, True) + self.cache[node] = FunctionCall( + assigned_variable=f"{name}_var", + function=f"{name}_rule", + arguments=["p"], + return_type="asdl_seq *", + comment=f"{node}", + ) + return self.cache[node] + + def visit_Gather(self, node: Gather) -> FunctionCall: + if node in self.cache: + return self.cache[node] + name = self.gen.name_gather(node) + self.cache[node] = FunctionCall( + assigned_variable=f"{name}_var", + function=f"{name}_rule", + arguments=["p"], + return_type="asdl_seq *", + comment=f"{node}", + ) + return self.cache[node] + + def visit_Group(self, node: Group) -> FunctionCall: + return self.generate_call(node.rhs) + + def visit_Cut(self, node: Cut) -> FunctionCall: + return FunctionCall( + assigned_variable="_cut_var", + return_type="int", + function="1", + nodetype=NodeTypes.CUT_OPERATOR, + ) + + def generate_call(self, node: Any) -> FunctionCall: + return super().visit(node) + + +class CParserGenerator(ParserGenerator, GrammarVisitor): + def __init__( + self, + grammar: grammar.Grammar, + tokens: Dict[int, str], + exact_tokens: Dict[str, int], + non_exact_tokens: Set[str], + file: Optional[IO[Text]], + debug: bool = False, + skip_actions: bool = False, + ): + super().__init__(grammar, tokens, file) + self.callmakervisitor: CCallMakerVisitor = CCallMakerVisitor( + self, exact_tokens, non_exact_tokens + ) + self._varname_counter = 0 + self.debug = debug + self.skip_actions = skip_actions + + def add_level(self) -> None: + self.print("D(p->level++);") + + def remove_level(self) -> None: + self.print("D(p->level--);") + + def add_return(self, ret_val: str) -> None: + self.remove_level() + self.print(f"return {ret_val};") + + def unique_varname(self, name: str = "tmpvar") -> str: + new_var = name + "_" + str(self._varname_counter) + self._varname_counter += 1 + return new_var + + def call_with_errorcheck_return(self, call_text: str, returnval: str) -> None: + error_var = self.unique_varname() + self.print(f"int {error_var} = {call_text};") + self.print(f"if ({error_var}) {{") + with self.indent(): + self.add_return(returnval) + self.print("}") + + def call_with_errorcheck_goto(self, call_text: str, goto_target: str) -> None: + error_var = self.unique_varname() + self.print(f"int {error_var} = {call_text};") + self.print(f"if ({error_var}) {{") + with self.indent(): + self.print(f"goto {goto_target};") + self.print(f"}}") + + def out_of_memory_return(self, expr: str, cleanup_code: Optional[str] = None,) -> None: + self.print(f"if ({expr}) {{") + with self.indent(): + if cleanup_code is not None: + self.print(cleanup_code) + self.print("p->error_indicator = 1;") + self.print("PyErr_NoMemory();") + self.add_return("NULL") + self.print(f"}}") + + def out_of_memory_goto(self, expr: str, goto_target: str) -> None: + self.print(f"if ({expr}) {{") + with self.indent(): + self.print("PyErr_NoMemory();") + self.print(f"goto {goto_target};") + self.print(f"}}") + + def generate(self, filename: str) -> None: + self.collect_todo() + self.print(f"// @generated by pegen.py from {filename}") + header = self.grammar.metas.get("header", EXTENSION_PREFIX) + if header: + self.print(header.rstrip("\n")) + subheader = self.grammar.metas.get("subheader", "") + if subheader: + self.print(subheader) + self._setup_keywords() + for i, (rulename, rule) in enumerate(self.todo.items(), 1000): + comment = " // Left-recursive" if rule.left_recursive else "" + self.print(f"#define {rulename}_type {i}{comment}") + self.print() + for rulename, rule in self.todo.items(): + if rule.is_loop() or rule.is_gather(): + type = "asdl_seq *" + elif rule.type: + type = rule.type + " " + else: + type = "void *" + self.print(f"static {type}{rulename}_rule(Parser *p);") + self.print() + while self.todo: + for rulename, rule in list(self.todo.items()): + del self.todo[rulename] + self.print() + if rule.left_recursive: + self.print("// Left-recursive") + self.visit(rule) + if self.skip_actions: + mode = 0 + else: + mode = int(self.rules["start"].type == "mod_ty") if "start" in self.rules else 1 + if mode == 1 and self.grammar.metas.get("bytecode"): + mode += 1 + modulename = self.grammar.metas.get("modulename", "parse") + trailer = self.grammar.metas.get("trailer", EXTENSION_SUFFIX) + if trailer: + self.print(trailer.rstrip("\n") % dict(mode=mode, modulename=modulename)) + + def _group_keywords_by_length(self) -> Dict[int, List[Tuple[str, int]]]: + groups: Dict[int, List[Tuple[str, int]]] = {} + for keyword_str, keyword_type in self.callmakervisitor.keyword_cache.items(): + length = len(keyword_str) + if length in groups: + groups[length].append((keyword_str, keyword_type)) + else: + groups[length] = [(keyword_str, keyword_type)] + return groups + + def _setup_keywords(self) -> None: + keyword_cache = self.callmakervisitor.keyword_cache + n_keyword_lists = ( + len(max(keyword_cache.keys(), key=len)) + 1 if len(keyword_cache) > 0 else 0 + ) + self.print(f"static const int n_keyword_lists = {n_keyword_lists};") + groups = self._group_keywords_by_length() + self.print("static KeywordToken *reserved_keywords[] = {") + with self.indent(): + num_groups = max(groups) + 1 if groups else 1 + for keywords_length in range(num_groups): + if keywords_length not in groups.keys(): + self.print("(KeywordToken[]) {{NULL, -1}},") + else: + self.print("(KeywordToken[]) {") + with self.indent(): + for keyword_str, keyword_type in groups[keywords_length]: + self.print(f'{{"{keyword_str}", {keyword_type}}},') + self.print("{NULL, -1},") + self.print("},") + self.print("};") + + def _set_up_token_start_metadata_extraction(self) -> None: + self.print("if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) {") + with self.indent(): + self.print("p->error_indicator = 1;") + self.add_return("NULL") + self.print("}") + self.print("int _start_lineno = p->tokens[_mark]->lineno;") + self.print("UNUSED(_start_lineno); // Only used by EXTRA macro") + self.print("int _start_col_offset = p->tokens[_mark]->col_offset;") + self.print("UNUSED(_start_col_offset); // Only used by EXTRA macro") + + def _set_up_token_end_metadata_extraction(self) -> None: + self.print("Token *_token = _PyPegen_get_last_nonnwhitespace_token(p);") + self.print("if (_token == NULL) {") + with self.indent(): + self.add_return("NULL") + self.print("}") + self.print("int _end_lineno = _token->end_lineno;") + self.print("UNUSED(_end_lineno); // Only used by EXTRA macro") + self.print("int _end_col_offset = _token->end_col_offset;") + self.print("UNUSED(_end_col_offset); // Only used by EXTRA macro") + + def _check_for_errors(self) -> None: + self.print("if (p->error_indicator) {") + with self.indent(): + self.add_return("NULL") + self.print("}") + + def _set_up_rule_memoization(self, node: Rule, result_type: str) -> None: + self.print("{") + with self.indent(): + self.add_level() + self.print(f"{result_type} _res = NULL;") + self.print(f"if (_PyPegen_is_memoized(p, {node.name}_type, &_res)) {{") + with self.indent(): + self.add_return("_res") + self.print("}") + self.print("int _mark = p->mark;") + self.print("int _resmark = p->mark;") + self.print("while (1) {") + with self.indent(): + self.call_with_errorcheck_return( + f"_PyPegen_update_memo(p, _mark, {node.name}_type, _res)", "_res" + ) + self.print("p->mark = _mark;") + self.print(f"void *_raw = {node.name}_raw(p);") + self.print("if (_raw == NULL || p->mark <= _resmark)") + with self.indent(): + self.print("break;") + self.print(f"_resmark = p->mark;") + self.print("_res = _raw;") + self.print("}") + self.print(f"p->mark = _resmark;") + self.add_return("_res") + self.print("}") + self.print(f"static {result_type}") + self.print(f"{node.name}_raw(Parser *p)") + + def _should_memoize(self, node: Rule) -> bool: + return node.memo and not node.left_recursive + + def _handle_default_rule_body(self, node: Rule, rhs: Rhs, result_type: str) -> None: + memoize = self._should_memoize(node) + + with self.indent(): + self.add_level() + self._check_for_errors() + self.print(f"{result_type} _res = NULL;") + if memoize: + self.print(f"if (_PyPegen_is_memoized(p, {node.name}_type, &_res)) {{") + with self.indent(): + self.add_return("_res") + self.print("}") + self.print("int _mark = p->mark;") + if any(alt.action and "EXTRA" in alt.action for alt in rhs.alts): + self._set_up_token_start_metadata_extraction() + self.visit( + rhs, is_loop=False, is_gather=node.is_gather(), rulename=node.name, + ) + if self.debug: + self.print(f'D(fprintf(stderr, "Fail at %d: {node.name}\\n", p->mark));') + self.print("_res = NULL;") + self.print(" done:") + with self.indent(): + if memoize: + self.print(f"_PyPegen_insert_memo(p, _mark, {node.name}_type, _res);") + self.add_return("_res") + + def _handle_loop_rule_body(self, node: Rule, rhs: Rhs) -> None: + memoize = self._should_memoize(node) + is_repeat1 = node.name.startswith("_loop1") + + with self.indent(): + self.add_level() + self._check_for_errors() + self.print("void *_res = NULL;") + if memoize: + self.print(f"if (_PyPegen_is_memoized(p, {node.name}_type, &_res)) {{") + with self.indent(): + self.add_return("_res") + self.print("}") + self.print("int _mark = p->mark;") + self.print("int _start_mark = p->mark;") + self.print("void **_children = PyMem_Malloc(sizeof(void *));") + self.out_of_memory_return(f"!_children") + self.print("ssize_t _children_capacity = 1;") + self.print("ssize_t _n = 0;") + if any(alt.action and "EXTRA" in alt.action for alt in rhs.alts): + self._set_up_token_start_metadata_extraction() + self.visit( + rhs, is_loop=True, is_gather=node.is_gather(), rulename=node.name, + ) + if is_repeat1: + self.print("if (_n == 0 || p->error_indicator) {") + with self.indent(): + self.print("PyMem_Free(_children);") + self.add_return("NULL") + self.print("}") + self.print("asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena);") + self.out_of_memory_return(f"!_seq", cleanup_code="PyMem_Free(_children);") + self.print("for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]);") + self.print("PyMem_Free(_children);") + if node.name: + self.print(f"_PyPegen_insert_memo(p, _start_mark, {node.name}_type, _seq);") + self.add_return("_seq") + + def visit_Rule(self, node: Rule) -> None: + is_loop = node.is_loop() + is_gather = node.is_gather() + rhs = node.flatten() + if is_loop or is_gather: + result_type = "asdl_seq *" + elif node.type: + result_type = node.type + else: + result_type = "void *" + + for line in str(node).splitlines(): + self.print(f"// {line}") + if node.left_recursive and node.leader: + self.print(f"static {result_type} {node.name}_raw(Parser *);") + + self.print(f"static {result_type}") + self.print(f"{node.name}_rule(Parser *p)") + + if node.left_recursive and node.leader: + self._set_up_rule_memoization(node, result_type) + + self.print("{") + if is_loop: + self._handle_loop_rule_body(node, rhs) + else: + self._handle_default_rule_body(node, rhs, result_type) + self.print("}") + + def visit_NamedItem(self, node: NamedItem) -> None: + call = self.callmakervisitor.generate_call(node) + if call.assigned_variable: + call.assigned_variable = self.dedupe(call.assigned_variable) + self.print(call) + + def visit_Rhs( + self, node: Rhs, is_loop: bool, is_gather: bool, rulename: Optional[str] + ) -> None: + if is_loop: + assert len(node.alts) == 1 + for alt in node.alts: + self.visit(alt, is_loop=is_loop, is_gather=is_gather, rulename=rulename) + + def join_conditions(self, keyword: str, node: Any) -> None: + self.print(f"{keyword} (") + with self.indent(): + first = True + for item in node.items: + if first: + first = False + else: + self.print("&&") + self.visit(item) + self.print(")") + + def emit_action(self, node: Alt, cleanup_code: Optional[str] = None) -> None: + self.print(f"_res = {node.action};") + + self.print("if (_res == NULL && PyErr_Occurred()) {") + with self.indent(): + self.print("p->error_indicator = 1;") + if cleanup_code: + self.print(cleanup_code) + self.add_return("NULL") + self.print("}") + + if self.debug: + self.print( + f'D(fprintf(stderr, "Hit with action [%d-%d]: %s\\n", _mark, p->mark, "{node}"));' + ) + + def emit_default_action(self, is_gather: bool, node: Alt) -> None: + if len(self.local_variable_names) > 1: + if is_gather: + assert len(self.local_variable_names) == 2 + self.print( + f"_res = _PyPegen_seq_insert_in_front(p, " + f"{self.local_variable_names[0]}, {self.local_variable_names[1]});" + ) + else: + if self.debug: + self.print( + f'D(fprintf(stderr, "Hit without action [%d:%d]: %s\\n", _mark, p->mark, "{node}"));' + ) + self.print( + f"_res = _PyPegen_dummy_name(p, {', '.join(self.local_variable_names)});" + ) + else: + if self.debug: + self.print( + f'D(fprintf(stderr, "Hit with default action [%d:%d]: %s\\n", _mark, p->mark, "{node}"));' + ) + self.print(f"_res = {self.local_variable_names[0]};") + + def emit_dummy_action(self) -> None: + self.print("_res = _PyPegen_dummy_name(p);") + + def handle_alt_normal(self, node: Alt, is_gather: bool, rulename: Optional[str]) -> None: + self.join_conditions(keyword="if", node=node) + self.print("{") + # We have parsed successfully all the conditions for the option. + with self.indent(): + node_str = str(node).replace('"', '\\"') + self.print( + f'D(fprintf(stderr, "%*c+ {rulename}[%d-%d]: %s succeeded!\\n", p->level, \' \', _mark, p->mark, "{node_str}"));' + ) + # Prepare to emmit the rule action and do so + if node.action and "EXTRA" in node.action: + self._set_up_token_end_metadata_extraction() + if self.skip_actions: + self.emit_dummy_action() + elif node.action: + self.emit_action(node) + else: + self.emit_default_action(is_gather, node) + + # As the current option has parsed correctly, do not continue with the rest. + self.print(f"goto done;") + self.print("}") + + def handle_alt_loop(self, node: Alt, is_gather: bool, rulename: Optional[str]) -> None: + # Condition of the main body of the alternative + self.join_conditions(keyword="while", node=node) + self.print("{") + # We have parsed successfully one item! + with self.indent(): + # Prepare to emit the rule action and do so + if node.action and "EXTRA" in node.action: + self._set_up_token_end_metadata_extraction() + if self.skip_actions: + self.emit_dummy_action() + elif node.action: + self.emit_action(node, cleanup_code="PyMem_Free(_children);") + else: + self.emit_default_action(is_gather, node) + + # Add the result of rule to the temporary buffer of children. This buffer + # will populate later an asdl_seq with all elements to return. + self.print("if (_n == _children_capacity) {") + with self.indent(): + self.print("_children_capacity *= 2;") + self.print( + "void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));" + ) + self.out_of_memory_return(f"!_new_children") + self.print("_children = _new_children;") + self.print("}") + self.print("_children[_n++] = _res;") + self.print("_mark = p->mark;") + self.print("}") + + def visit_Alt( + self, node: Alt, is_loop: bool, is_gather: bool, rulename: Optional[str] + ) -> None: + self.print(f"{{ // {node}") + with self.indent(): + self._check_for_errors() + node_str = str(node).replace('"', '\\"') + self.print( + f'D(fprintf(stderr, "%*c> {rulename}[%d-%d]: %s\\n", p->level, \' \', _mark, p->mark, "{node_str}"));' + ) + # Prepare variable declarations for the alternative + vars = self.collect_vars(node) + for v, var_type in sorted(item for item in vars.items() if item[0] is not None): + if not var_type: + var_type = "void *" + else: + var_type += " " + if v == "_cut_var": + v += " = 0" # cut_var must be initialized + self.print(f"{var_type}{v};") + if v.startswith("_opt_var"): + self.print(f"UNUSED({v}); // Silence compiler warnings") + + with self.local_variable_context(): + if is_loop: + self.handle_alt_loop(node, is_gather, rulename) + else: + self.handle_alt_normal(node, is_gather, rulename) + + self.print("p->mark = _mark;") + node_str = str(node).replace('"', '\\"') + self.print( + f"D(fprintf(stderr, \"%*c%s {rulename}[%d-%d]: %s failed!\\n\", p->level, ' ',\n" + f' p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "{node_str}"));' + ) + if "_cut_var" in vars: + self.print("if (_cut_var) {") + with self.indent(): + self.add_return("NULL") + self.print("}") + self.print("}") + + def collect_vars(self, node: Alt) -> Dict[Optional[str], Optional[str]]: + types = {} + with self.local_variable_context(): + for item in node.items: + name, type = self.add_var(item) + types[name] = type + return types + + def add_var(self, node: NamedItem) -> Tuple[Optional[str], Optional[str]]: + call = self.callmakervisitor.generate_call(node.item) + name = node.name if node.name else call.assigned_variable + if name is not None: + name = self.dedupe(name) + return name, call.return_type diff --git a/Tools/peg_generator/pegen/first_sets.py b/Tools/peg_generator/pegen/first_sets.py new file mode 100755 index 00000000..71be5a2e --- /dev/null +++ b/Tools/peg_generator/pegen/first_sets.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3.8 + +import argparse +import pprint +import sys +from typing import Set, Dict + +from pegen.build import build_parser +from pegen.grammar import ( + Alt, + Cut, + Gather, + Grammar, + GrammarVisitor, + Group, + Leaf, + Lookahead, + NamedItem, + NameLeaf, + NegativeLookahead, + Opt, + Repeat, + Repeat0, + Repeat1, + Rhs, + Rule, + StringLeaf, + PositiveLookahead, +) + +argparser = argparse.ArgumentParser( + prog="calculate_first_sets", description="Calculate the first sets of a grammar", +) +argparser.add_argument("grammar_file", help="The grammar file") + + +class FirstSetCalculator(GrammarVisitor): + def __init__(self, rules: Dict[str, Rule]) -> None: + self.rules = rules + for rule in rules.values(): + rule.nullable_visit(rules) + self.first_sets: Dict[str, Set[str]] = dict() + self.in_process: Set[str] = set() + + def calculate(self) -> Dict[str, Set[str]]: + for name, rule in self.rules.items(): + self.visit(rule) + return self.first_sets + + def visit_Alt(self, item: Alt) -> Set[str]: + result: Set[str] = set() + to_remove: Set[str] = set() + for other in item.items: + new_terminals = self.visit(other) + if isinstance(other.item, NegativeLookahead): + to_remove |= new_terminals + result |= new_terminals + if to_remove: + result -= to_remove + + # If the set of new terminals can start with the empty string, + # it means that the item is completelly nullable and we should + # also considering at least the next item in case the current + # one fails to parse. + + if "" in new_terminals: + continue + + if not isinstance(other.item, (Opt, NegativeLookahead, Repeat0)): + break + + # Do not allow the empty string to propagate. + result.discard("") + + return result + + def visit_Cut(self, item: Cut) -> Set[str]: + return set() + + def visit_Group(self, item: Group) -> Set[str]: + return self.visit(item.rhs) + + def visit_PositiveLookahead(self, item: Lookahead) -> Set[str]: + return self.visit(item.node) + + def visit_NegativeLookahead(self, item: NegativeLookahead) -> Set[str]: + return self.visit(item.node) + + def visit_NamedItem(self, item: NamedItem) -> Set[str]: + return self.visit(item.item) + + def visit_Opt(self, item: Opt) -> Set[str]: + return self.visit(item.node) + + def visit_Gather(self, item: Gather) -> Set[str]: + return self.visit(item.node) + + def visit_Repeat0(self, item: Repeat0) -> Set[str]: + return self.visit(item.node) + + def visit_Repeat1(self, item: Repeat1) -> Set[str]: + return self.visit(item.node) + + def visit_NameLeaf(self, item: NameLeaf) -> Set[str]: + if item.value not in self.rules: + return {item.value} + + if item.value not in self.first_sets: + self.first_sets[item.value] = self.visit(self.rules[item.value]) + return self.first_sets[item.value] + elif item.value in self.in_process: + return set() + + return self.first_sets[item.value] + + def visit_StringLeaf(self, item: StringLeaf) -> Set[str]: + return {item.value} + + def visit_Rhs(self, item: Rhs) -> Set[str]: + result: Set[str] = set() + for alt in item.alts: + result |= self.visit(alt) + return result + + def visit_Rule(self, item: Rule) -> Set[str]: + if item.name in self.in_process: + return set() + elif item.name not in self.first_sets: + self.in_process.add(item.name) + terminals = self.visit(item.rhs) + if item.nullable: + terminals.add("") + self.first_sets[item.name] = terminals + self.in_process.remove(item.name) + return self.first_sets[item.name] + + +def main() -> None: + args = argparser.parse_args() + + try: + grammar, parser, tokenizer = build_parser(args.grammar_file) + except Exception as err: + print("ERROR: Failed to parse grammar file", file=sys.stderr) + sys.exit(1) + + firs_sets = FirstSetCalculator(grammar.rules).calculate() + pprint.pprint(firs_sets) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/pegen/grammar.py b/Tools/peg_generator/pegen/grammar.py new file mode 100644 index 00000000..78edf412 --- /dev/null +++ b/Tools/peg_generator/pegen/grammar.py @@ -0,0 +1,467 @@ +from __future__ import annotations + +from abc import abstractmethod +from typing import ( + AbstractSet, + Any, + Dict, + Iterable, + Iterator, + List, + Optional, + Set, + Tuple, + TYPE_CHECKING, + Union, +) + + +if TYPE_CHECKING: + from pegen.parser_generator import ParserGenerator + + +class GrammarError(Exception): + pass + + +class GrammarVisitor: + def visit(self, node: Any, *args: Any, **kwargs: Any) -> Any: + """Visit a node.""" + method = "visit_" + node.__class__.__name__ + visitor = getattr(self, method, self.generic_visit) + return visitor(node, *args, **kwargs) + + def generic_visit(self, node: Iterable[Any], *args: Any, **kwargs: Any) -> None: + """Called if no explicit visitor function exists for a node.""" + for value in node: + if isinstance(value, list): + for item in value: + self.visit(item, *args, **kwargs) + else: + self.visit(value, *args, **kwargs) + + +class Grammar: + def __init__(self, rules: Iterable[Rule], metas: Iterable[Tuple[str, Optional[str]]]): + self.rules = {rule.name: rule for rule in rules} + self.metas = dict(metas) + + def __str__(self) -> str: + return "\n".join(str(rule) for name, rule in self.rules.items()) + + def __repr__(self) -> str: + lines = ["Grammar("] + lines.append(" [") + for rule in self.rules.values(): + lines.append(f" {repr(rule)},") + lines.append(" ],") + lines.append(" {repr(list(self.metas.items()))}") + lines.append(")") + return "\n".join(lines) + + def __iter__(self) -> Iterator[Rule]: + yield from self.rules.values() + + +# Global flag whether we want actions in __str__() -- default off. +SIMPLE_STR = True + + +class Rule: + def __init__(self, name: str, type: Optional[str], rhs: Rhs, memo: Optional[object] = None): + self.name = name + self.type = type + self.rhs = rhs + self.memo = bool(memo) + self.visited = False + self.nullable = False + self.left_recursive = False + self.leader = False + + def is_loop(self) -> bool: + return self.name.startswith("_loop") + + def is_gather(self) -> bool: + return self.name.startswith("_gather") + + def __str__(self) -> str: + if SIMPLE_STR or self.type is None: + res = f"{self.name}: {self.rhs}" + else: + res = f"{self.name}[{self.type}]: {self.rhs}" + if len(res) < 88: + return res + lines = [res.split(":")[0] + ":"] + lines += [f" | {alt}" for alt in self.rhs.alts] + return "\n".join(lines) + + def __repr__(self) -> str: + return f"Rule({self.name!r}, {self.type!r}, {self.rhs!r})" + + def __iter__(self) -> Iterator[Rhs]: + yield self.rhs + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + if self.visited: + # A left-recursive rule is considered non-nullable. + return False + self.visited = True + self.nullable = self.rhs.nullable_visit(rules) + return self.nullable + + def initial_names(self) -> AbstractSet[str]: + return self.rhs.initial_names() + + def flatten(self) -> Rhs: + # If it's a single parenthesized group, flatten it. + rhs = self.rhs + if ( + not self.is_loop() + and len(rhs.alts) == 1 + and len(rhs.alts[0].items) == 1 + and isinstance(rhs.alts[0].items[0].item, Group) + ): + rhs = rhs.alts[0].items[0].item.rhs + return rhs + + def collect_todo(self, gen: ParserGenerator) -> None: + rhs = self.flatten() + rhs.collect_todo(gen) + + +class Leaf: + def __init__(self, value: str): + self.value = value + + def __str__(self) -> str: + return self.value + + def __iter__(self) -> Iterable[str]: + if False: + yield + + @abstractmethod + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + raise NotImplementedError + + @abstractmethod + def initial_names(self) -> AbstractSet[str]: + raise NotImplementedError + + +class NameLeaf(Leaf): + """The value is the name.""" + + def __str__(self) -> str: + if self.value == "ENDMARKER": + return "$" + return super().__str__() + + def __repr__(self) -> str: + return f"NameLeaf({self.value!r})" + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + if self.value in rules: + return rules[self.value].nullable_visit(rules) + # Token or unknown; never empty. + return False + + def initial_names(self) -> AbstractSet[str]: + return {self.value} + + +class StringLeaf(Leaf): + """The value is a string literal, including quotes.""" + + def __repr__(self) -> str: + return f"StringLeaf({self.value!r})" + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + # The string token '' is considered empty. + return not self.value + + def initial_names(self) -> AbstractSet[str]: + return set() + + +class Rhs: + def __init__(self, alts: List[Alt]): + self.alts = alts + self.memo: Optional[Tuple[Optional[str], str]] = None + + def __str__(self) -> str: + return " | ".join(str(alt) for alt in self.alts) + + def __repr__(self) -> str: + return f"Rhs({self.alts!r})" + + def __iter__(self) -> Iterator[List[Alt]]: + yield self.alts + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + for alt in self.alts: + if alt.nullable_visit(rules): + return True + return False + + def initial_names(self) -> AbstractSet[str]: + names: Set[str] = set() + for alt in self.alts: + names |= alt.initial_names() + return names + + def collect_todo(self, gen: ParserGenerator) -> None: + for alt in self.alts: + alt.collect_todo(gen) + + +class Alt: + def __init__(self, items: List[NamedItem], *, icut: int = -1, action: Optional[str] = None): + self.items = items + self.icut = icut + self.action = action + + def __str__(self) -> str: + core = " ".join(str(item) for item in self.items) + if not SIMPLE_STR and self.action: + return f"{core} {{ {self.action} }}" + else: + return core + + def __repr__(self) -> str: + args = [repr(self.items)] + if self.icut >= 0: + args.append(f"icut={self.icut}") + if self.action: + args.append(f"action={self.action!r}") + return f"Alt({', '.join(args)})" + + def __iter__(self) -> Iterator[List[NamedItem]]: + yield self.items + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + for item in self.items: + if not item.nullable_visit(rules): + return False + return True + + def initial_names(self) -> AbstractSet[str]: + names: Set[str] = set() + for item in self.items: + names |= item.initial_names() + if not item.nullable: + break + return names + + def collect_todo(self, gen: ParserGenerator) -> None: + for item in self.items: + item.collect_todo(gen) + + +class NamedItem: + def __init__(self, name: Optional[str], item: Item): + self.name = name + self.item = item + self.nullable = False + + def __str__(self) -> str: + if not SIMPLE_STR and self.name: + return f"{self.name}={self.item}" + else: + return str(self.item) + + def __repr__(self) -> str: + return f"NamedItem({self.name!r}, {self.item!r})" + + def __iter__(self) -> Iterator[Item]: + yield self.item + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + self.nullable = self.item.nullable_visit(rules) + return self.nullable + + def initial_names(self) -> AbstractSet[str]: + return self.item.initial_names() + + def collect_todo(self, gen: ParserGenerator) -> None: + gen.callmakervisitor.visit(self.item) + + +class Lookahead: + def __init__(self, node: Plain, sign: str): + self.node = node + self.sign = sign + + def __str__(self) -> str: + return f"{self.sign}{self.node}" + + def __iter__(self) -> Iterator[Plain]: + yield self.node + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return True + + def initial_names(self) -> AbstractSet[str]: + return set() + + +class PositiveLookahead(Lookahead): + def __init__(self, node: Plain): + super().__init__(node, "&") + + def __repr__(self) -> str: + return f"PositiveLookahead({self.node!r})" + + +class NegativeLookahead(Lookahead): + def __init__(self, node: Plain): + super().__init__(node, "!") + + def __repr__(self) -> str: + return f"NegativeLookahead({self.node!r})" + + +class Opt: + def __init__(self, node: Item): + self.node = node + + def __str__(self) -> str: + s = str(self.node) + # TODO: Decide whether to use [X] or X? based on type of X + if " " in s: + return f"[{s}]" + else: + return f"{s}?" + + def __repr__(self) -> str: + return f"Opt({self.node!r})" + + def __iter__(self) -> Iterator[Item]: + yield self.node + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return True + + def initial_names(self) -> AbstractSet[str]: + return self.node.initial_names() + + +class Repeat: + """Shared base class for x* and x+.""" + + def __init__(self, node: Plain): + self.node = node + self.memo: Optional[Tuple[Optional[str], str]] = None + + @abstractmethod + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + raise NotImplementedError + + def __iter__(self) -> Iterator[Plain]: + yield self.node + + def initial_names(self) -> AbstractSet[str]: + return self.node.initial_names() + + +class Repeat0(Repeat): + def __str__(self) -> str: + s = str(self.node) + # TODO: Decide whether to use (X)* or X* based on type of X + if " " in s: + return f"({s})*" + else: + return f"{s}*" + + def __repr__(self) -> str: + return f"Repeat0({self.node!r})" + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return True + + +class Repeat1(Repeat): + def __str__(self) -> str: + s = str(self.node) + # TODO: Decide whether to use (X)+ or X+ based on type of X + if " " in s: + return f"({s})+" + else: + return f"{s}+" + + def __repr__(self) -> str: + return f"Repeat1({self.node!r})" + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return False + + +class Gather(Repeat): + def __init__(self, separator: Plain, node: Plain): + self.separator = separator + self.node = node + + def __str__(self) -> str: + return f"{self.separator!s}.{self.node!s}+" + + def __repr__(self) -> str: + return f"Gather({self.separator!r}, {self.node!r})" + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return False + + +class Group: + def __init__(self, rhs: Rhs): + self.rhs = rhs + + def __str__(self) -> str: + return f"({self.rhs})" + + def __repr__(self) -> str: + return f"Group({self.rhs!r})" + + def __iter__(self) -> Iterator[Rhs]: + yield self.rhs + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return self.rhs.nullable_visit(rules) + + def initial_names(self) -> AbstractSet[str]: + return self.rhs.initial_names() + + +class Cut: + def __init__(self) -> None: + pass + + def __repr__(self) -> str: + return f"Cut()" + + def __str__(self) -> str: + return f"~" + + def __iter__(self) -> Iterator[Tuple[str, str]]: + if False: + yield + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Cut): + return NotImplemented + return True + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return True + + def initial_names(self) -> AbstractSet[str]: + return set() + + +Plain = Union[Leaf, Group] +Item = Union[Plain, Opt, Repeat, Lookahead, Rhs, Cut] +RuleName = Tuple[str, str] +MetaTuple = Tuple[str, Optional[str]] +MetaList = List[MetaTuple] +RuleList = List[Rule] +NamedItemList = List[NamedItem] +LookaheadOrCut = Union[Lookahead, Cut] diff --git a/Tools/peg_generator/pegen/grammar_parser.py b/Tools/peg_generator/pegen/grammar_parser.py new file mode 100644 index 00000000..c784cfdf --- /dev/null +++ b/Tools/peg_generator/pegen/grammar_parser.py @@ -0,0 +1,677 @@ +#!/usr/bin/env python3.8 +# @generated by pegen from ./Tools/peg_generator/pegen/metagrammar.gram + +import ast +import sys +import tokenize + +from typing import Any, Optional + +from pegen.parser import memoize, memoize_left_rec, logger, Parser +from ast import literal_eval + +from pegen.grammar import ( + Alt, + Cut, + Gather, + Group, + Item, + Lookahead, + LookaheadOrCut, + MetaTuple, + MetaList, + NameLeaf, + NamedItem, + NamedItemList, + NegativeLookahead, + Opt, + Plain, + PositiveLookahead, + Repeat0, + Repeat1, + Rhs, + Rule, + RuleList, + RuleName, + Grammar, + StringLeaf, +) + +class GeneratedParser(Parser): + + @memoize + def start(self) -> Optional[Grammar]: + # start: grammar $ + mark = self.mark() + cut = False + if ( + (grammar := self.grammar()) + and + (endmarker := self.expect('ENDMARKER')) + ): + return grammar + self.reset(mark) + if cut: return None + return None + + @memoize + def grammar(self) -> Optional[Grammar]: + # grammar: metas rules | rules + mark = self.mark() + cut = False + if ( + (metas := self.metas()) + and + (rules := self.rules()) + ): + return Grammar ( rules , metas ) + self.reset(mark) + if cut: return None + cut = False + if ( + (rules := self.rules()) + ): + return Grammar ( rules , [ ] ) + self.reset(mark) + if cut: return None + return None + + @memoize + def metas(self) -> Optional[MetaList]: + # metas: meta metas | meta + mark = self.mark() + cut = False + if ( + (meta := self.meta()) + and + (metas := self.metas()) + ): + return [ meta ] + metas + self.reset(mark) + if cut: return None + cut = False + if ( + (meta := self.meta()) + ): + return [ meta ] + self.reset(mark) + if cut: return None + return None + + @memoize + def meta(self) -> Optional[MetaTuple]: + # meta: "@" NAME NEWLINE | "@" NAME NAME NEWLINE | "@" NAME STRING NEWLINE + mark = self.mark() + cut = False + if ( + (literal := self.expect("@")) + and + (name := self.name()) + and + (newline := self.expect('NEWLINE')) + ): + return ( name . string , None ) + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect("@")) + and + (a := self.name()) + and + (b := self.name()) + and + (newline := self.expect('NEWLINE')) + ): + return ( a . string , b . string ) + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect("@")) + and + (name := self.name()) + and + (string := self.string()) + and + (newline := self.expect('NEWLINE')) + ): + return ( name . string , literal_eval ( string . string ) ) + self.reset(mark) + if cut: return None + return None + + @memoize + def rules(self) -> Optional[RuleList]: + # rules: rule rules | rule + mark = self.mark() + cut = False + if ( + (rule := self.rule()) + and + (rules := self.rules()) + ): + return [ rule ] + rules + self.reset(mark) + if cut: return None + cut = False + if ( + (rule := self.rule()) + ): + return [ rule ] + self.reset(mark) + if cut: return None + return None + + @memoize + def rule(self) -> Optional[Rule]: + # rule: rulename memoflag? ":" alts NEWLINE INDENT more_alts DEDENT | rulename memoflag? ":" NEWLINE INDENT more_alts DEDENT | rulename memoflag? ":" alts NEWLINE + mark = self.mark() + cut = False + if ( + (rulename := self.rulename()) + and + (opt := self.memoflag(),) + and + (literal := self.expect(":")) + and + (alts := self.alts()) + and + (newline := self.expect('NEWLINE')) + and + (indent := self.expect('INDENT')) + and + (more_alts := self.more_alts()) + and + (dedent := self.expect('DEDENT')) + ): + return Rule ( rulename [ 0 ] , rulename [ 1 ] , Rhs ( alts . alts + more_alts . alts ) , memo = opt ) + self.reset(mark) + if cut: return None + cut = False + if ( + (rulename := self.rulename()) + and + (opt := self.memoflag(),) + and + (literal := self.expect(":")) + and + (newline := self.expect('NEWLINE')) + and + (indent := self.expect('INDENT')) + and + (more_alts := self.more_alts()) + and + (dedent := self.expect('DEDENT')) + ): + return Rule ( rulename [ 0 ] , rulename [ 1 ] , more_alts , memo = opt ) + self.reset(mark) + if cut: return None + cut = False + if ( + (rulename := self.rulename()) + and + (opt := self.memoflag(),) + and + (literal := self.expect(":")) + and + (alts := self.alts()) + and + (newline := self.expect('NEWLINE')) + ): + return Rule ( rulename [ 0 ] , rulename [ 1 ] , alts , memo = opt ) + self.reset(mark) + if cut: return None + return None + + @memoize + def rulename(self) -> Optional[RuleName]: + # rulename: NAME '[' NAME '*' ']' | NAME '[' NAME ']' | NAME + mark = self.mark() + cut = False + if ( + (name := self.name()) + and + (literal := self.expect('[')) + and + (type := self.name()) + and + (literal_1 := self.expect('*')) + and + (literal_2 := self.expect(']')) + ): + return ( name . string , type . string + "*" ) + self.reset(mark) + if cut: return None + cut = False + if ( + (name := self.name()) + and + (literal := self.expect('[')) + and + (type := self.name()) + and + (literal_1 := self.expect(']')) + ): + return ( name . string , type . string ) + self.reset(mark) + if cut: return None + cut = False + if ( + (name := self.name()) + ): + return ( name . string , None ) + self.reset(mark) + if cut: return None + return None + + @memoize + def memoflag(self) -> Optional[str]: + # memoflag: '(' 'memo' ')' + mark = self.mark() + cut = False + if ( + (literal := self.expect('(')) + and + (literal_1 := self.expect('memo')) + and + (literal_2 := self.expect(')')) + ): + return "memo" + self.reset(mark) + if cut: return None + return None + + @memoize + def alts(self) -> Optional[Rhs]: + # alts: alt "|" alts | alt + mark = self.mark() + cut = False + if ( + (alt := self.alt()) + and + (literal := self.expect("|")) + and + (alts := self.alts()) + ): + return Rhs ( [ alt ] + alts . alts ) + self.reset(mark) + if cut: return None + cut = False + if ( + (alt := self.alt()) + ): + return Rhs ( [ alt ] ) + self.reset(mark) + if cut: return None + return None + + @memoize + def more_alts(self) -> Optional[Rhs]: + # more_alts: "|" alts NEWLINE more_alts | "|" alts NEWLINE + mark = self.mark() + cut = False + if ( + (literal := self.expect("|")) + and + (alts := self.alts()) + and + (newline := self.expect('NEWLINE')) + and + (more_alts := self.more_alts()) + ): + return Rhs ( alts . alts + more_alts . alts ) + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect("|")) + and + (alts := self.alts()) + and + (newline := self.expect('NEWLINE')) + ): + return Rhs ( alts . alts ) + self.reset(mark) + if cut: return None + return None + + @memoize + def alt(self) -> Optional[Alt]: + # alt: items '$' action | items '$' | items action | items + mark = self.mark() + cut = False + if ( + (items := self.items()) + and + (literal := self.expect('$')) + and + (action := self.action()) + ): + return Alt ( items + [ NamedItem ( None , NameLeaf ( 'ENDMARKER' ) ) ] , action = action ) + self.reset(mark) + if cut: return None + cut = False + if ( + (items := self.items()) + and + (literal := self.expect('$')) + ): + return Alt ( items + [ NamedItem ( None , NameLeaf ( 'ENDMARKER' ) ) ] , action = None ) + self.reset(mark) + if cut: return None + cut = False + if ( + (items := self.items()) + and + (action := self.action()) + ): + return Alt ( items , action = action ) + self.reset(mark) + if cut: return None + cut = False + if ( + (items := self.items()) + ): + return Alt ( items , action = None ) + self.reset(mark) + if cut: return None + return None + + @memoize + def items(self) -> Optional[NamedItemList]: + # items: named_item items | named_item + mark = self.mark() + cut = False + if ( + (named_item := self.named_item()) + and + (items := self.items()) + ): + return [ named_item ] + items + self.reset(mark) + if cut: return None + cut = False + if ( + (named_item := self.named_item()) + ): + return [ named_item ] + self.reset(mark) + if cut: return None + return None + + @memoize + def named_item(self) -> Optional[NamedItem]: + # named_item: NAME '=' ~ item | item | lookahead + mark = self.mark() + cut = False + if ( + (name := self.name()) + and + (literal := self.expect('=')) + and + (cut := True) + and + (item := self.item()) + ): + return NamedItem ( name . string , item ) + self.reset(mark) + if cut: return None + cut = False + if ( + (item := self.item()) + ): + return NamedItem ( None , item ) + self.reset(mark) + if cut: return None + cut = False + if ( + (it := self.lookahead()) + ): + return NamedItem ( None , it ) + self.reset(mark) + if cut: return None + return None + + @memoize + def lookahead(self) -> Optional[LookaheadOrCut]: + # lookahead: '&' ~ atom | '!' ~ atom | '~' + mark = self.mark() + cut = False + if ( + (literal := self.expect('&')) + and + (cut := True) + and + (atom := self.atom()) + ): + return PositiveLookahead ( atom ) + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect('!')) + and + (cut := True) + and + (atom := self.atom()) + ): + return NegativeLookahead ( atom ) + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect('~')) + ): + return Cut ( ) + self.reset(mark) + if cut: return None + return None + + @memoize + def item(self) -> Optional[Item]: + # item: '[' ~ alts ']' | atom '?' | atom '*' | atom '+' | atom '.' atom '+' | atom + mark = self.mark() + cut = False + if ( + (literal := self.expect('[')) + and + (cut := True) + and + (alts := self.alts()) + and + (literal_1 := self.expect(']')) + ): + return Opt ( alts ) + self.reset(mark) + if cut: return None + cut = False + if ( + (atom := self.atom()) + and + (literal := self.expect('?')) + ): + return Opt ( atom ) + self.reset(mark) + if cut: return None + cut = False + if ( + (atom := self.atom()) + and + (literal := self.expect('*')) + ): + return Repeat0 ( atom ) + self.reset(mark) + if cut: return None + cut = False + if ( + (atom := self.atom()) + and + (literal := self.expect('+')) + ): + return Repeat1 ( atom ) + self.reset(mark) + if cut: return None + cut = False + if ( + (sep := self.atom()) + and + (literal := self.expect('.')) + and + (node := self.atom()) + and + (literal_1 := self.expect('+')) + ): + return Gather ( sep , node ) + self.reset(mark) + if cut: return None + cut = False + if ( + (atom := self.atom()) + ): + return atom + self.reset(mark) + if cut: return None + return None + + @memoize + def atom(self) -> Optional[Plain]: + # atom: '(' ~ alts ')' | NAME | STRING + mark = self.mark() + cut = False + if ( + (literal := self.expect('(')) + and + (cut := True) + and + (alts := self.alts()) + and + (literal_1 := self.expect(')')) + ): + return Group ( alts ) + self.reset(mark) + if cut: return None + cut = False + if ( + (name := self.name()) + ): + return NameLeaf ( name . string ) + self.reset(mark) + if cut: return None + cut = False + if ( + (string := self.string()) + ): + return StringLeaf ( string . string ) + self.reset(mark) + if cut: return None + return None + + @memoize + def action(self) -> Optional[str]: + # action: "{" ~ target_atoms "}" + mark = self.mark() + cut = False + if ( + (literal := self.expect("{")) + and + (cut := True) + and + (target_atoms := self.target_atoms()) + and + (literal_1 := self.expect("}")) + ): + return target_atoms + self.reset(mark) + if cut: return None + return None + + @memoize + def target_atoms(self) -> Optional[str]: + # target_atoms: target_atom target_atoms | target_atom + mark = self.mark() + cut = False + if ( + (target_atom := self.target_atom()) + and + (target_atoms := self.target_atoms()) + ): + return target_atom + " " + target_atoms + self.reset(mark) + if cut: return None + cut = False + if ( + (target_atom := self.target_atom()) + ): + return target_atom + self.reset(mark) + if cut: return None + return None + + @memoize + def target_atom(self) -> Optional[str]: + # target_atom: "{" ~ target_atoms "}" | NAME | NUMBER | STRING | "?" | ":" | !"}" OP + mark = self.mark() + cut = False + if ( + (literal := self.expect("{")) + and + (cut := True) + and + (target_atoms := self.target_atoms()) + and + (literal_1 := self.expect("}")) + ): + return "{" + target_atoms + "}" + self.reset(mark) + if cut: return None + cut = False + if ( + (name := self.name()) + ): + return name . string + self.reset(mark) + if cut: return None + cut = False + if ( + (number := self.number()) + ): + return number . string + self.reset(mark) + if cut: return None + cut = False + if ( + (string := self.string()) + ): + return string . string + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect("?")) + ): + return "?" + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect(":")) + ): + return ":" + self.reset(mark) + if cut: return None + cut = False + if ( + self.negative_lookahead(self.expect, "}") + and + (op := self.op()) + ): + return op . string + self.reset(mark) + if cut: return None + return None + + +if __name__ == '__main__': + from pegen.parser import simple_parser_main + simple_parser_main(GeneratedParser) diff --git a/Tools/peg_generator/pegen/grammar_visualizer.py b/Tools/peg_generator/pegen/grammar_visualizer.py new file mode 100644 index 00000000..7362ec5f --- /dev/null +++ b/Tools/peg_generator/pegen/grammar_visualizer.py @@ -0,0 +1,65 @@ +import argparse +import sys + +from typing import Any, Iterator, Callable + +from pegen.build import build_parser +from pegen.grammar import Grammar, Rule + +argparser = argparse.ArgumentParser( + prog="pegen", description="Pretty print the AST for a given PEG grammar" +) +argparser.add_argument("filename", help="Grammar description") + + +class ASTGrammarPrinter: + def children(self, node: Rule) -> Iterator[Any]: + for value in node: + if isinstance(value, list): + yield from value + else: + yield value + + def name(self, node: Rule) -> str: + if not list(self.children(node)): + return repr(node) + return node.__class__.__name__ + + def print_grammar_ast(self, grammar: Grammar, printer: Callable[..., None] = print) -> None: + for rule in grammar.rules.values(): + printer(self.print_nodes_recursively(rule)) + + def print_nodes_recursively(self, node: Rule, prefix: str = "", istail: bool = True) -> str: + + children = list(self.children(node)) + value = self.name(node) + + line = prefix + ("└──" if istail else "├──") + value + "\n" + sufix = " " if istail else "│ " + + if not children: + return line + + *children, last = children + for child in children: + line += self.print_nodes_recursively(child, prefix + sufix, False) + line += self.print_nodes_recursively(last, prefix + sufix, True) + + return line + + +def main() -> None: + args = argparser.parse_args() + + try: + grammar, parser, tokenizer = build_parser(args.filename) + except Exception as err: + print("ERROR: Failed to parse grammar file", file=sys.stderr) + sys.exit(1) + + visitor = ASTGrammarPrinter() + visitor.print_grammar_ast(grammar) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/pegen/keywordgen.py b/Tools/peg_generator/pegen/keywordgen.py new file mode 100644 index 00000000..fa57770d --- /dev/null +++ b/Tools/peg_generator/pegen/keywordgen.py @@ -0,0 +1,78 @@ +"""Generate Lib/keyword.py from the Grammar and Tokens files using pgen""" + +import argparse + +from .build import build_parser, generate_token_definitions +from .c_generator import CParserGenerator + +TEMPLATE = r''' +"""Keywords (from "Grammar/python.gram") + +This file is automatically generated; please don't muck it up! + +To update the symbols in this file, 'cd' to the top directory of +the python source tree and run: + + PYTHONPATH=Tools/peg_generator python3 -m pegen.keywordgen \ + Grammar/Grammar \ + Grammar/Tokens \ + Lib/keyword.py + +Alternatively, you can run 'make regen-keyword'. +""" + +__all__ = ["iskeyword", "issoftkeyword", "kwlist", "softkwlist"] + +kwlist = [ +{keywords} +] + +softkwlist = [ +{soft_keywords} +] + +iskeyword = frozenset(kwlist).__contains__ +issoftkeyword = frozenset(softkwlist).__contains__ +'''.lstrip() + +EXTRA_KEYWORDS = ["async", "await"] + + +def main(): + parser = argparse.ArgumentParser( + description="Generate the Lib/keywords.py file from the grammar." + ) + parser.add_argument( + "grammar", type=str, help="The file with the grammar definition in PEG format" + ) + parser.add_argument( + "tokens_file", + type=argparse.FileType("r"), + help="The file with the token definitions" + ) + parser.add_argument( + "keyword_file", + type=argparse.FileType("w"), + help="The path to write the keyword definitions", + ) + args = parser.parse_args() + + grammar, _, _ = build_parser(args.grammar) + with args.tokens_file as tok_file: + all_tokens, exact_tok, non_exact_tok = generate_token_definitions(tok_file) + gen: ParserGenerator = CParserGenerator( + grammar, all_tokens, exact_tok, non_exact_tok, file=None + ) + gen.collect_todo() + + with args.keyword_file as thefile: + all_keywords = sorted(list(gen.callmakervisitor.keyword_cache.keys()) + EXTRA_KEYWORDS) + all_soft_keywords = sorted(gen.callmakervisitor.soft_keywords) + + keywords = "" if not all_keywords else " " + ",\n ".join(map(repr, all_keywords)) + soft_keywords = "" if not all_soft_keywords else " " + ",\n ".join(map(repr, all_soft_keywords)) + thefile.write(TEMPLATE.format(keywords=keywords, soft_keywords=soft_keywords)) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/pegen/metagrammar.gram b/Tools/peg_generator/pegen/metagrammar.gram new file mode 100644 index 00000000..f0c5ac3a --- /dev/null +++ b/Tools/peg_generator/pegen/metagrammar.gram @@ -0,0 +1,123 @@ +@subheader """\ +from ast import literal_eval + +from pegen.grammar import ( + Alt, + Cut, + Gather, + Group, + Item, + Lookahead, + LookaheadOrCut, + MetaTuple, + MetaList, + NameLeaf, + NamedItem, + NamedItemList, + NegativeLookahead, + Opt, + Plain, + PositiveLookahead, + Repeat0, + Repeat1, + Rhs, + Rule, + RuleList, + RuleName, + Grammar, + StringLeaf, +) +""" + +start[Grammar]: grammar ENDMARKER { grammar } + +grammar[Grammar]: + | metas rules { Grammar(rules, metas) } + | rules { Grammar(rules, []) } + +metas[MetaList]: + | meta metas { [meta] + metas } + | meta { [meta] } + +meta[MetaTuple]: + | "@" NAME NEWLINE { (name.string, None) } + | "@" a=NAME b=NAME NEWLINE { (a.string, b.string) } + | "@" NAME STRING NEWLINE { (name.string, literal_eval(string.string)) } + +rules[RuleList]: + | rule rules { [rule] + rules } + | rule { [rule] } + +rule[Rule]: + | rulename memoflag? ":" alts NEWLINE INDENT more_alts DEDENT { + Rule(rulename[0], rulename[1], Rhs(alts.alts + more_alts.alts), memo=opt) } + | rulename memoflag? ":" NEWLINE INDENT more_alts DEDENT { + Rule(rulename[0], rulename[1], more_alts, memo=opt) } + | rulename memoflag? ":" alts NEWLINE { Rule(rulename[0], rulename[1], alts, memo=opt) } + +rulename[RuleName]: + | NAME '[' type=NAME '*' ']' { (name.string, type.string+"*") } + | NAME '[' type=NAME ']' { (name.string, type.string) } + | NAME { (name.string, None) } + +# In the future this may return something more complicated +memoflag[str]: + | '(' 'memo' ')' { "memo" } + +alts[Rhs]: + | alt "|" alts { Rhs([alt] + alts.alts)} + | alt { Rhs([alt]) } + +more_alts[Rhs]: + | "|" alts NEWLINE more_alts { Rhs(alts.alts + more_alts.alts) } + | "|" alts NEWLINE { Rhs(alts.alts) } + +alt[Alt]: + | items '$' action { Alt(items + [NamedItem(None, NameLeaf('ENDMARKER'))], action=action) } + | items '$' { Alt(items + [NamedItem(None, NameLeaf('ENDMARKER'))], action=None) } + | items action { Alt(items, action=action) } + | items { Alt(items, action=None) } + +items[NamedItemList]: + | named_item items { [named_item] + items } + | named_item { [named_item] } + +named_item[NamedItem]: + | NAME '=' ~ item {NamedItem(name.string, item)} + | item {NamedItem(None, item)} + | it=lookahead {NamedItem(None, it)} + +lookahead[LookaheadOrCut]: + | '&' ~ atom {PositiveLookahead(atom)} + | '!' ~ atom {NegativeLookahead(atom)} + | '~' {Cut()} + +item[Item]: + | '[' ~ alts ']' {Opt(alts)} + | atom '?' {Opt(atom)} + | atom '*' {Repeat0(atom)} + | atom '+' {Repeat1(atom)} + | sep=atom '.' node=atom '+' {Gather(sep, node)} + | atom {atom} + +atom[Plain]: + | '(' ~ alts ')' {Group(alts)} + | NAME {NameLeaf(name.string) } + | STRING {StringLeaf(string.string)} + +# Mini-grammar for the actions + +action[str]: "{" ~ target_atoms "}" { target_atoms } + +target_atoms[str]: + | target_atom target_atoms { target_atom + " " + target_atoms } + | target_atom { target_atom } + +target_atom[str]: + | "{" ~ target_atoms "}" { "{" + target_atoms + "}" } + | NAME { name.string } + | NUMBER { number.string } + | STRING { string.string } + | "?" { "?" } + | ":" { ":" } + | !"}" OP { op.string } diff --git a/Tools/peg_generator/pegen/parser.py b/Tools/peg_generator/pegen/parser.py new file mode 100644 index 00000000..16d954dc --- /dev/null +++ b/Tools/peg_generator/pegen/parser.py @@ -0,0 +1,310 @@ +import argparse +import sys +import time +import token +import tokenize +import traceback + +from abc import abstractmethod +from typing import Any, Callable, cast, Dict, Optional, Tuple, Type, TypeVar + +from pegen.tokenizer import exact_token_types +from pegen.tokenizer import Mark +from pegen.tokenizer import Tokenizer + +T = TypeVar("T") +P = TypeVar("P", bound="Parser") +F = TypeVar("F", bound=Callable[..., Any]) + + +def logger(method: F) -> F: + """For non-memoized functions that we want to be logged. + + (In practice this is only non-leader left-recursive functions.) + """ + method_name = method.__name__ + + def logger_wrapper(self: P, *args: object) -> T: + if not self._verbose: + return method(self, *args) + argsr = ",".join(repr(arg) for arg in args) + fill = " " * self._level + print(f"{fill}{method_name}({argsr}) .... (looking at {self.showpeek()})") + self._level += 1 + tree = method(self, *args) + self._level -= 1 + print(f"{fill}... {method_name}({argsr}) --> {tree!s:.200}") + return tree + + logger_wrapper.__wrapped__ = method # type: ignore + return cast(F, logger_wrapper) + + +def memoize(method: F) -> F: + """Memoize a symbol method.""" + method_name = method.__name__ + + def memoize_wrapper(self: P, *args: object) -> T: + mark = self.mark() + key = mark, method_name, args + # Fast path: cache hit, and not verbose. + if key in self._cache and not self._verbose: + tree, endmark = self._cache[key] + self.reset(endmark) + return tree + # Slow path: no cache hit, or verbose. + verbose = self._verbose + argsr = ",".join(repr(arg) for arg in args) + fill = " " * self._level + if key not in self._cache: + if verbose: + print(f"{fill}{method_name}({argsr}) ... (looking at {self.showpeek()})") + self._level += 1 + tree = method(self, *args) + self._level -= 1 + if verbose: + print(f"{fill}... {method_name}({argsr}) -> {tree!s:.200}") + endmark = self.mark() + self._cache[key] = tree, endmark + else: + tree, endmark = self._cache[key] + if verbose: + print(f"{fill}{method_name}({argsr}) -> {tree!s:.200}") + self.reset(endmark) + return tree + + memoize_wrapper.__wrapped__ = method # type: ignore + return cast(F, memoize_wrapper) + + +def memoize_left_rec(method: Callable[[P], Optional[T]]) -> Callable[[P], Optional[T]]: + """Memoize a left-recursive symbol method.""" + method_name = method.__name__ + + def memoize_left_rec_wrapper(self: P) -> Optional[T]: + mark = self.mark() + key = mark, method_name, () + # Fast path: cache hit, and not verbose. + if key in self._cache and not self._verbose: + tree, endmark = self._cache[key] + self.reset(endmark) + return tree + # Slow path: no cache hit, or verbose. + verbose = self._verbose + fill = " " * self._level + if key not in self._cache: + if verbose: + print(f"{fill}{method_name} ... (looking at {self.showpeek()})") + self._level += 1 + + # For left-recursive rules we manipulate the cache and + # loop until the rule shows no progress, then pick the + # previous result. For an explanation why this works, see + # https://github.com/PhilippeSigaud/Pegged/wiki/Left-Recursion + # (But we use the memoization cache instead of a static + # variable; perhaps this is similar to a paper by Warth et al. + # (http://web.cs.ucla.edu/~todd/research/pub.php?id=pepm08). + + # Prime the cache with a failure. + self._cache[key] = None, mark + lastresult, lastmark = None, mark + depth = 0 + if verbose: + print(f"{fill}Recursive {method_name} at {mark} depth {depth}") + + while True: + self.reset(mark) + result = method(self) + endmark = self.mark() + depth += 1 + if verbose: + print( + f"{fill}Recursive {method_name} at {mark} depth {depth}: {result!s:.200} to {endmark}" + ) + if not result: + if verbose: + print(f"{fill}Fail with {lastresult!s:.200} to {lastmark}") + break + if endmark <= lastmark: + if verbose: + print(f"{fill}Bailing with {lastresult!s:.200} to {lastmark}") + break + self._cache[key] = lastresult, lastmark = result, endmark + + self.reset(lastmark) + tree = lastresult + + self._level -= 1 + if verbose: + print(f"{fill}{method_name}() -> {tree!s:.200} [cached]") + if tree: + endmark = self.mark() + else: + endmark = mark + self.reset(endmark) + self._cache[key] = tree, endmark + else: + tree, endmark = self._cache[key] + if verbose: + print(f"{fill}{method_name}() -> {tree!s:.200} [fresh]") + if tree: + self.reset(endmark) + return tree + + memoize_left_rec_wrapper.__wrapped__ = method # type: ignore + return memoize_left_rec_wrapper + + +class Parser: + """Parsing base class.""" + + def __init__(self, tokenizer: Tokenizer, *, verbose: bool = False): + self._tokenizer = tokenizer + self._verbose = verbose + self._level = 0 + self._cache: Dict[Tuple[Mark, str, Tuple[Any, ...]], Tuple[Any, Mark]] = {} + # Pass through common tokenizer methods. + # TODO: Rename to _mark and _reset. + self.mark = self._tokenizer.mark + self.reset = self._tokenizer.reset + + @abstractmethod + def start(self) -> Any: + pass + + def showpeek(self) -> str: + tok = self._tokenizer.peek() + return f"{tok.start[0]}.{tok.start[1]}: {token.tok_name[tok.type]}:{tok.string!r}" + + @memoize + def name(self) -> Optional[tokenize.TokenInfo]: + tok = self._tokenizer.peek() + if tok.type == token.NAME: + return self._tokenizer.getnext() + return None + + @memoize + def number(self) -> Optional[tokenize.TokenInfo]: + tok = self._tokenizer.peek() + if tok.type == token.NUMBER: + return self._tokenizer.getnext() + return None + + @memoize + def string(self) -> Optional[tokenize.TokenInfo]: + tok = self._tokenizer.peek() + if tok.type == token.STRING: + return self._tokenizer.getnext() + return None + + @memoize + def op(self) -> Optional[tokenize.TokenInfo]: + tok = self._tokenizer.peek() + if tok.type == token.OP: + return self._tokenizer.getnext() + return None + + @memoize + def expect(self, type: str) -> Optional[tokenize.TokenInfo]: + tok = self._tokenizer.peek() + if tok.string == type: + return self._tokenizer.getnext() + if type in exact_token_types: + if tok.type == exact_token_types[type]: + return self._tokenizer.getnext() + if type in token.__dict__: + if tok.type == token.__dict__[type]: + return self._tokenizer.getnext() + if tok.type == token.OP and tok.string == type: + return self._tokenizer.getnext() + return None + + def positive_lookahead(self, func: Callable[..., T], *args: object) -> T: + mark = self.mark() + ok = func(*args) + self.reset(mark) + return ok + + def negative_lookahead(self, func: Callable[..., object], *args: object) -> bool: + mark = self.mark() + ok = func(*args) + self.reset(mark) + return not ok + + def make_syntax_error(self, filename: str = "") -> SyntaxError: + tok = self._tokenizer.diagnose() + return SyntaxError( + "pegen parse failure", (filename, tok.start[0], 1 + tok.start[1], tok.line) + ) + + +def simple_parser_main(parser_class: Type[Parser]) -> None: + argparser = argparse.ArgumentParser() + argparser.add_argument( + "-v", + "--verbose", + action="count", + default=0, + help="Print timing stats; repeat for more debug output", + ) + argparser.add_argument( + "-q", "--quiet", action="store_true", help="Don't print the parsed program" + ) + argparser.add_argument("filename", help="Input file ('-' to use stdin)") + + args = argparser.parse_args() + verbose = args.verbose + verbose_tokenizer = verbose >= 3 + verbose_parser = verbose == 2 or verbose >= 4 + + t0 = time.time() + + filename = args.filename + if filename == "" or filename == "-": + filename = "" + file = sys.stdin + else: + file = open(args.filename) + try: + tokengen = tokenize.generate_tokens(file.readline) + tokenizer = Tokenizer(tokengen, verbose=verbose_tokenizer) + parser = parser_class(tokenizer, verbose=verbose_parser) + tree = parser.start() + try: + if file.isatty(): + endpos = 0 + else: + endpos = file.tell() + except IOError: + endpos = 0 + finally: + if file is not sys.stdin: + file.close() + + t1 = time.time() + + if not tree: + err = parser.make_syntax_error(filename) + traceback.print_exception(err.__class__, err, None) + sys.exit(1) + + if not args.quiet: + print(tree) + + if verbose: + dt = t1 - t0 + diag = tokenizer.diagnose() + nlines = diag.end[0] + if diag.type == token.ENDMARKER: + nlines -= 1 + print(f"Total time: {dt:.3f} sec; {nlines} lines", end="") + if endpos: + print(f" ({endpos} bytes)", end="") + if dt: + print(f"; {nlines / dt:.0f} lines/sec") + else: + print() + print("Caches sizes:") + print(f" token array : {len(tokenizer._tokens):10}") + print(f" cache : {len(parser._cache):10}") + ## print_memstats() diff --git a/Tools/peg_generator/pegen/parser_generator.py b/Tools/peg_generator/pegen/parser_generator.py new file mode 100644 index 00000000..364eccb8 --- /dev/null +++ b/Tools/peg_generator/pegen/parser_generator.py @@ -0,0 +1,209 @@ +import contextlib +from abc import abstractmethod + +from typing import AbstractSet, Dict, IO, Iterator, List, Optional, Set, Text, Tuple + +from pegen import sccutils +from pegen.grammar import ( + Grammar, + Rule, + Rhs, + Alt, + NamedItem, + Plain, + NameLeaf, + Gather, +) +from pegen.grammar import GrammarError, GrammarVisitor + + +class RuleCheckingVisitor(GrammarVisitor): + def __init__(self, rules: Dict[str, Rule], tokens: Dict[int, str]): + self.rules = rules + self.tokens = tokens + + def visit_NameLeaf(self, node: NameLeaf) -> None: + if node.value not in self.rules and node.value not in self.tokens.values(): + # TODO: Add line/col info to (leaf) nodes + raise GrammarError(f"Dangling reference to rule {node.value!r}") + + def visit_NamedItem(self, node: NamedItem) -> None: + if node.name and node.name.startswith("_"): + raise GrammarError(f"Variable names cannot start with underscore: '{node.name}'") + self.visit(node.item) + + +class ParserGenerator: + + callmakervisitor: GrammarVisitor + + def __init__(self, grammar: Grammar, tokens: Dict[int, str], file: Optional[IO[Text]]): + self.grammar = grammar + self.tokens = tokens + self.rules = grammar.rules + self.validate_rule_names() + if "trailer" not in grammar.metas and "start" not in self.rules: + raise GrammarError("Grammar without a trailer must have a 'start' rule") + checker = RuleCheckingVisitor(self.rules, self.tokens) + for rule in self.rules.values(): + checker.visit(rule) + self.file = file + self.level = 0 + compute_nullables(self.rules) + self.first_graph, self.first_sccs = compute_left_recursives(self.rules) + self.todo = self.rules.copy() # Rules to generate + self.counter = 0 # For name_rule()/name_loop() + self.keyword_counter = 499 # For keyword_type() + self.all_rules: Dict[str, Rule] = {} # Rules + temporal rules + self._local_variable_stack: List[List[str]] = [] + + def validate_rule_names(self) -> None: + for rule in self.rules: + if rule.startswith("_"): + raise GrammarError(f"Rule names cannot start with underscore: '{rule}'") + + @contextlib.contextmanager + def local_variable_context(self) -> Iterator[None]: + self._local_variable_stack.append([]) + yield + self._local_variable_stack.pop() + + @property + def local_variable_names(self) -> List[str]: + return self._local_variable_stack[-1] + + @abstractmethod + def generate(self, filename: str) -> None: + raise NotImplementedError + + @contextlib.contextmanager + def indent(self) -> Iterator[None]: + self.level += 1 + try: + yield + finally: + self.level -= 1 + + def print(self, *args: object) -> None: + if not args: + print(file=self.file) + else: + print(" " * self.level, end="", file=self.file) + print(*args, file=self.file) + + def printblock(self, lines: str) -> None: + for line in lines.splitlines(): + self.print(line) + + def collect_todo(self) -> None: + done: Set[str] = set() + while True: + alltodo = list(self.todo) + self.all_rules.update(self.todo) + todo = [i for i in alltodo if i not in done] + if not todo: + break + for rulename in todo: + self.todo[rulename].collect_todo(self) + done = set(alltodo) + + def keyword_type(self) -> int: + self.keyword_counter += 1 + return self.keyword_counter + + def name_node(self, rhs: Rhs) -> str: + self.counter += 1 + name = f"_tmp_{self.counter}" # TODO: Pick a nicer name. + self.todo[name] = Rule(name, None, rhs) + return name + + def name_loop(self, node: Plain, is_repeat1: bool) -> str: + self.counter += 1 + if is_repeat1: + prefix = "_loop1_" + else: + prefix = "_loop0_" + name = f"{prefix}{self.counter}" # TODO: It's ugly to signal via the name. + self.todo[name] = Rule(name, None, Rhs([Alt([NamedItem(None, node)])])) + return name + + def name_gather(self, node: Gather) -> str: + self.counter += 1 + name = f"_gather_{self.counter}" + self.counter += 1 + extra_function_name = f"_loop0_{self.counter}" + extra_function_alt = Alt( + [NamedItem(None, node.separator), NamedItem("elem", node.node)], action="elem", + ) + self.todo[extra_function_name] = Rule( + extra_function_name, None, Rhs([extra_function_alt]), + ) + alt = Alt([NamedItem("elem", node.node), NamedItem("seq", NameLeaf(extra_function_name))],) + self.todo[name] = Rule(name, None, Rhs([alt]),) + return name + + def dedupe(self, name: str) -> str: + origname = name + counter = 0 + while name in self.local_variable_names: + counter += 1 + name = f"{origname}_{counter}" + self.local_variable_names.append(name) + return name + + +def compute_nullables(rules: Dict[str, Rule]) -> None: + """Compute which rules in a grammar are nullable. + + Thanks to TatSu (tatsu/leftrec.py) for inspiration. + """ + for rule in rules.values(): + rule.nullable_visit(rules) + + +def compute_left_recursives( + rules: Dict[str, Rule] +) -> Tuple[Dict[str, AbstractSet[str]], List[AbstractSet[str]]]: + graph = make_first_graph(rules) + sccs = list(sccutils.strongly_connected_components(graph.keys(), graph)) + for scc in sccs: + if len(scc) > 1: + for name in scc: + rules[name].left_recursive = True + # Try to find a leader such that all cycles go through it. + leaders = set(scc) + for start in scc: + for cycle in sccutils.find_cycles_in_scc(graph, scc, start): + # print("Cycle:", " -> ".join(cycle)) + leaders -= scc - set(cycle) + if not leaders: + raise ValueError( + f"SCC {scc} has no leadership candidate (no element is included in all cycles)" + ) + # print("Leaders:", leaders) + leader = min(leaders) # Pick an arbitrary leader from the candidates. + rules[leader].leader = True + else: + name = min(scc) # The only element. + if name in graph[name]: + rules[name].left_recursive = True + rules[name].leader = True + return graph, sccs + + +def make_first_graph(rules: Dict[str, Rule]) -> Dict[str, AbstractSet[str]]: + """Compute the graph of left-invocations. + + There's an edge from A to B if A may invoke B at its initial + position. + + Note that this requires the nullable flags to have been computed. + """ + graph = {} + vertices: Set[str] = set() + for rulename, rhs in rules.items(): + graph[rulename] = names = rhs.initial_names() + vertices |= names + for vertex in vertices: + graph.setdefault(vertex, set()) + return graph diff --git a/Tools/peg_generator/pegen/python_generator.py b/Tools/peg_generator/pegen/python_generator.py new file mode 100644 index 00000000..b786de7f --- /dev/null +++ b/Tools/peg_generator/pegen/python_generator.py @@ -0,0 +1,241 @@ +import token +from typing import Any, Dict, Optional, IO, Text, Tuple + +from pegen.grammar import ( + Cut, + GrammarVisitor, + NameLeaf, + StringLeaf, + Rhs, + NamedItem, + Lookahead, + PositiveLookahead, + NegativeLookahead, + Opt, + Repeat0, + Repeat1, + Gather, + Group, + Rule, + Alt, +) +from pegen import grammar +from pegen.parser_generator import ParserGenerator + +MODULE_PREFIX = """\ +#!/usr/bin/env python3.8 +# @generated by pegen from {filename} + +import ast +import sys +import tokenize + +from typing import Any, Optional + +from pegen.parser import memoize, memoize_left_rec, logger, Parser + +""" +MODULE_SUFFIX = """ + +if __name__ == '__main__': + from pegen.parser import simple_parser_main + simple_parser_main(GeneratedParser) +""" + + +class PythonCallMakerVisitor(GrammarVisitor): + def __init__(self, parser_generator: ParserGenerator): + self.gen = parser_generator + self.cache: Dict[Any, Any] = {} + + def visit_NameLeaf(self, node: NameLeaf) -> Tuple[Optional[str], str]: + name = node.value + if name in ("NAME", "NUMBER", "STRING", "OP"): + name = name.lower() + return name, f"self.{name}()" + if name in ("NEWLINE", "DEDENT", "INDENT", "ENDMARKER", "ASYNC", "AWAIT"): + return name.lower(), f"self.expect({name!r})" + return name, f"self.{name}()" + + def visit_StringLeaf(self, node: StringLeaf) -> Tuple[str, str]: + return "literal", f"self.expect({node.value})" + + def visit_Rhs(self, node: Rhs) -> Tuple[Optional[str], str]: + if node in self.cache: + return self.cache[node] + if len(node.alts) == 1 and len(node.alts[0].items) == 1: + self.cache[node] = self.visit(node.alts[0].items[0]) + else: + name = self.gen.name_node(node) + self.cache[node] = name, f"self.{name}()" + return self.cache[node] + + def visit_NamedItem(self, node: NamedItem) -> Tuple[Optional[str], str]: + name, call = self.visit(node.item) + if node.name: + name = node.name + return name, call + + def lookahead_call_helper(self, node: Lookahead) -> Tuple[str, str]: + name, call = self.visit(node.node) + head, tail = call.split("(", 1) + assert tail[-1] == ")" + tail = tail[:-1] + return head, tail + + def visit_PositiveLookahead(self, node: PositiveLookahead) -> Tuple[None, str]: + head, tail = self.lookahead_call_helper(node) + return None, f"self.positive_lookahead({head}, {tail})" + + def visit_NegativeLookahead(self, node: NegativeLookahead) -> Tuple[None, str]: + head, tail = self.lookahead_call_helper(node) + return None, f"self.negative_lookahead({head}, {tail})" + + def visit_Opt(self, node: Opt) -> Tuple[str, str]: + name, call = self.visit(node.node) + # Note trailing comma (the call may already have one comma + # at the end, for example when rules have both repeat0 and optional + # markers, e.g: [rule*]) + if call.endswith(","): + return "opt", call + else: + return "opt", f"{call}," + + def visit_Repeat0(self, node: Repeat0) -> Tuple[str, str]: + if node in self.cache: + return self.cache[node] + name = self.gen.name_loop(node.node, False) + self.cache[node] = name, f"self.{name}()," # Also a trailing comma! + return self.cache[node] + + def visit_Repeat1(self, node: Repeat1) -> Tuple[str, str]: + if node in self.cache: + return self.cache[node] + name = self.gen.name_loop(node.node, True) + self.cache[node] = name, f"self.{name}()" # But no trailing comma here! + return self.cache[node] + + def visit_Gather(self, node: Gather) -> Tuple[str, str]: + if node in self.cache: + return self.cache[node] + name = self.gen.name_gather(node) + self.cache[node] = name, f"self.{name}()" # No trailing comma here either! + return self.cache[node] + + def visit_Group(self, node: Group) -> Tuple[Optional[str], str]: + return self.visit(node.rhs) + + def visit_Cut(self, node: Cut) -> Tuple[str, str]: + return "cut", "True" + + +class PythonParserGenerator(ParserGenerator, GrammarVisitor): + def __init__( + self, + grammar: grammar.Grammar, + file: Optional[IO[Text]], + tokens: Dict[int, str] = token.tok_name, + ): + super().__init__(grammar, tokens, file) + self.callmakervisitor = PythonCallMakerVisitor(self) + + def generate(self, filename: str) -> None: + header = self.grammar.metas.get("header", MODULE_PREFIX) + if header is not None: + self.print(header.rstrip("\n").format(filename=filename)) + subheader = self.grammar.metas.get("subheader", "") + if subheader: + self.print(subheader.format(filename=filename)) + self.print("class GeneratedParser(Parser):") + while self.todo: + for rulename, rule in list(self.todo.items()): + del self.todo[rulename] + self.print() + with self.indent(): + self.visit(rule) + trailer = self.grammar.metas.get("trailer", MODULE_SUFFIX) + if trailer is not None: + self.print(trailer.rstrip("\n")) + + def visit_Rule(self, node: Rule) -> None: + is_loop = node.is_loop() + is_gather = node.is_gather() + rhs = node.flatten() + if node.left_recursive: + if node.leader: + self.print("@memoize_left_rec") + else: + # Non-leader rules in a cycle are not memoized, + # but they must still be logged. + self.print("@logger") + else: + self.print("@memoize") + node_type = node.type or "Any" + self.print(f"def {node.name}(self) -> Optional[{node_type}]:") + with self.indent(): + self.print(f"# {node.name}: {rhs}") + if node.nullable: + self.print(f"# nullable={node.nullable}") + self.print("mark = self.mark()") + if is_loop: + self.print("children = []") + self.visit(rhs, is_loop=is_loop, is_gather=is_gather) + if is_loop: + self.print("return children") + else: + self.print("return None") + + def visit_NamedItem(self, node: NamedItem) -> None: + name, call = self.callmakervisitor.visit(node.item) + if node.name: + name = node.name + if not name: + self.print(call) + else: + if name != "cut": + name = self.dedupe(name) + self.print(f"({name} := {call})") + + def visit_Rhs(self, node: Rhs, is_loop: bool = False, is_gather: bool = False) -> None: + if is_loop: + assert len(node.alts) == 1 + for alt in node.alts: + self.visit(alt, is_loop=is_loop, is_gather=is_gather) + + def visit_Alt(self, node: Alt, is_loop: bool, is_gather: bool) -> None: + with self.local_variable_context(): + self.print("cut = False") # TODO: Only if needed. + if is_loop: + self.print("while (") + else: + self.print("if (") + with self.indent(): + first = True + for item in node.items: + if first: + first = False + else: + self.print("and") + self.visit(item) + if is_gather: + self.print("is not None") + + self.print("):") + with self.indent(): + action = node.action + if not action: + if is_gather: + assert len(self.local_variable_names) == 2 + action = ( + f"[{self.local_variable_names[0]}] + {self.local_variable_names[1]}" + ) + else: + action = f"[{', '.join(self.local_variable_names)}]" + if is_loop: + self.print(f"children.append({action})") + self.print(f"mark = self.mark()") + else: + self.print(f"return {action}") + self.print("self.reset(mark)") + # Skip remaining alternatives if a cut was reached. + self.print("if cut: return None") # TODO: Only if needed. diff --git a/Tools/peg_generator/pegen/sccutils.py b/Tools/peg_generator/pegen/sccutils.py new file mode 100644 index 00000000..1f0586bb --- /dev/null +++ b/Tools/peg_generator/pegen/sccutils.py @@ -0,0 +1,128 @@ +# Adapted from mypy (mypy/build.py) under the MIT license. + +from typing import * + + +def strongly_connected_components( + vertices: AbstractSet[str], edges: Dict[str, AbstractSet[str]] +) -> Iterator[AbstractSet[str]]: + """Compute Strongly Connected Components of a directed graph. + + Args: + vertices: the labels for the vertices + edges: for each vertex, gives the target vertices of its outgoing edges + + Returns: + An iterator yielding strongly connected components, each + represented as a set of vertices. Each input vertex will occur + exactly once; vertices not part of a SCC are returned as + singleton sets. + + From http://code.activestate.com/recipes/578507/. + """ + identified: Set[str] = set() + stack: List[str] = [] + index: Dict[str, int] = {} + boundaries: List[int] = [] + + def dfs(v: str) -> Iterator[Set[str]]: + index[v] = len(stack) + stack.append(v) + boundaries.append(index[v]) + + for w in edges[v]: + if w not in index: + yield from dfs(w) + elif w not in identified: + while index[w] < boundaries[-1]: + boundaries.pop() + + if boundaries[-1] == index[v]: + boundaries.pop() + scc = set(stack[index[v] :]) + del stack[index[v] :] + identified.update(scc) + yield scc + + for v in vertices: + if v not in index: + yield from dfs(v) + + +def topsort( + data: Dict[AbstractSet[str], Set[AbstractSet[str]]] +) -> Iterable[AbstractSet[AbstractSet[str]]]: + """Topological sort. + + Args: + data: A map from SCCs (represented as frozen sets of strings) to + sets of SCCs, its dependencies. NOTE: This data structure + is modified in place -- for normalization purposes, + self-dependencies are removed and entries representing + orphans are added. + + Returns: + An iterator yielding sets of SCCs that have an equivalent + ordering. NOTE: The algorithm doesn't care about the internal + structure of SCCs. + + Example: + Suppose the input has the following structure: + + {A: {B, C}, B: {D}, C: {D}} + + This is normalized to: + + {A: {B, C}, B: {D}, C: {D}, D: {}} + + The algorithm will yield the following values: + + {D} + {B, C} + {A} + + From http://code.activestate.com/recipes/577413/. + """ + # TODO: Use a faster algorithm? + for k, v in data.items(): + v.discard(k) # Ignore self dependencies. + for item in set.union(*data.values()) - set(data.keys()): + data[item] = set() + while True: + ready = {item for item, dep in data.items() if not dep} + if not ready: + break + yield ready + data = {item: (dep - ready) for item, dep in data.items() if item not in ready} + assert not data, "A cyclic dependency exists amongst %r" % data + + +def find_cycles_in_scc( + graph: Dict[str, AbstractSet[str]], scc: AbstractSet[str], start: str +) -> Iterable[List[str]]: + """Find cycles in SCC emanating from start. + + Yields lists of the form ['A', 'B', 'C', 'A'], which means there's + a path from A -> B -> C -> A. The first item is always the start + argument, but the last item may be another element, e.g. ['A', + 'B', 'C', 'B'] means there's a path from A to B and there's a + cycle from B to C and back. + """ + # Basic input checks. + assert start in scc, (start, scc) + assert scc <= graph.keys(), scc - graph.keys() + + # Reduce the graph to nodes in the SCC. + graph = {src: {dst for dst in dsts if dst in scc} for src, dsts in graph.items() if src in scc} + assert start in graph + + # Recursive helper that yields cycles. + def dfs(node: str, path: List[str]) -> Iterator[List[str]]: + if node in path: + yield path + [node] + return + path = path + [node] # TODO: Make this not quadratic. + for child in graph[node]: + yield from dfs(child, path) + + yield from dfs(start, []) diff --git a/Tools/peg_generator/pegen/testutil.py b/Tools/peg_generator/pegen/testutil.py new file mode 100644 index 00000000..920d2465 --- /dev/null +++ b/Tools/peg_generator/pegen/testutil.py @@ -0,0 +1,133 @@ +import importlib.util +import io +import os +import pathlib +import sys +import textwrap +import tokenize +import token + +from typing import Any, cast, Dict, IO, Type, Final + +from pegen.build import compile_c_extension +from pegen.c_generator import CParserGenerator +from pegen.grammar import Grammar +from pegen.grammar_parser import GeneratedParser as GrammarParser +from pegen.parser import Parser +from pegen.python_generator import PythonParserGenerator +from pegen.tokenizer import Tokenizer + +ALL_TOKENS = token.tok_name +EXACT_TOKENS = token.EXACT_TOKEN_TYPES # type: ignore +NON_EXACT_TOKENS = { + name for index, name in token.tok_name.items() if index not in EXACT_TOKENS.values() +} + + +def generate_parser(grammar: Grammar) -> Type[Parser]: + # Generate a parser. + out = io.StringIO() + genr = PythonParserGenerator(grammar, out) + genr.generate("") + + # Load the generated parser class. + ns: Dict[str, Any] = {} + exec(out.getvalue(), ns) + return ns["GeneratedParser"] + + +def run_parser(file: IO[bytes], parser_class: Type[Parser], *, verbose: bool = False) -> Any: + # Run a parser on a file (stream). + tokenizer = Tokenizer(tokenize.generate_tokens(file.readline)) # type: ignore # typeshed issue #3515 + parser = parser_class(tokenizer, verbose=verbose) + result = parser.start() + if result is None: + raise parser.make_syntax_error() + return result + + +def parse_string( + source: str, parser_class: Type[Parser], *, dedent: bool = True, verbose: bool = False +) -> Any: + # Run the parser on a string. + if dedent: + source = textwrap.dedent(source) + file = io.StringIO(source) + return run_parser(file, parser_class, verbose=verbose) # type: ignore # typeshed issue #3515 + + +def make_parser(source: str) -> Type[Parser]: + # Combine parse_string() and generate_parser(). + grammar = parse_string(source, GrammarParser) + return generate_parser(grammar) + + +def import_file(full_name: str, path: str) -> Any: + """Import a python module from a path""" + + spec = importlib.util.spec_from_file_location(full_name, path) + mod = importlib.util.module_from_spec(spec) + + # We assume this is not None and has an exec_module() method. + # See https://docs.python.org/3/reference/import.html?highlight=exec_module#loading + loader = cast(Any, spec.loader) + loader.exec_module(mod) + return mod + + +def generate_c_parser_source(grammar: Grammar) -> str: + out = io.StringIO() + genr = CParserGenerator(grammar, ALL_TOKENS, EXACT_TOKENS, NON_EXACT_TOKENS, out) + genr.generate("") + return out.getvalue() + + +def generate_parser_c_extension( + grammar: Grammar, path: pathlib.PurePath, debug: bool = False +) -> Any: + """Generate a parser c extension for the given grammar in the given path + + Returns a module object with a parse_string() method. + TODO: express that using a Protocol. + """ + # Make sure that the working directory is empty: reusing non-empty temporary + # directories when generating extensions can lead to segmentation faults. + # Check issue #95 (https://github.com/gvanrossum/pegen/issues/95) for more + # context. + assert not os.listdir(path) + source = path / "parse.c" + with open(source, "w", encoding="utf-8") as file: + genr = CParserGenerator( + grammar, ALL_TOKENS, EXACT_TOKENS, NON_EXACT_TOKENS, file, debug=debug + ) + genr.generate("parse.c") + compile_c_extension(str(source), build_dir=str(path)) + + +def print_memstats() -> bool: + MiB: Final = 2 ** 20 + try: + import psutil # type: ignore + except ImportError: + return False + print("Memory stats:") + process = psutil.Process() + meminfo = process.memory_info() + res = {} + res["rss"] = meminfo.rss / MiB + res["vms"] = meminfo.vms / MiB + if sys.platform == "win32": + res["maxrss"] = meminfo.peak_wset / MiB + else: + # See https://stackoverflow.com/questions/938733/total-memory-used-by-python-process + import resource # Since it doesn't exist on Windows. + + rusage = resource.getrusage(resource.RUSAGE_SELF) + if sys.platform == "darwin": + factor = 1 + else: + factor = 1024 # Linux + res["maxrss"] = rusage.ru_maxrss * factor / MiB + for key, value in res.items(): + print(f" {key:12.12s}: {value:10.0f} MiB") + return True diff --git a/Tools/peg_generator/pegen/tokenizer.py b/Tools/peg_generator/pegen/tokenizer.py new file mode 100644 index 00000000..61a28efc --- /dev/null +++ b/Tools/peg_generator/pegen/tokenizer.py @@ -0,0 +1,86 @@ +import token +import tokenize +from typing import List, Iterator + +Mark = int # NewType('Mark', int) + +exact_token_types = token.EXACT_TOKEN_TYPES # type: ignore + + +def shorttok(tok: tokenize.TokenInfo) -> str: + return "%-25.25s" % f"{tok.start[0]}.{tok.start[1]}: {token.tok_name[tok.type]}:{tok.string!r}" + + +class Tokenizer: + """Caching wrapper for the tokenize module. + + This is pretty tied to Python's syntax. + """ + + _tokens: List[tokenize.TokenInfo] + + def __init__(self, tokengen: Iterator[tokenize.TokenInfo], *, verbose: bool = False): + self._tokengen = tokengen + self._tokens = [] + self._index = 0 + self._verbose = verbose + if verbose: + self.report(False, False) + + def getnext(self) -> tokenize.TokenInfo: + """Return the next token and updates the index.""" + cached = True + while self._index == len(self._tokens): + tok = next(self._tokengen) + if tok.type in (tokenize.NL, tokenize.COMMENT): + continue + if tok.type == token.ERRORTOKEN and tok.string.isspace(): + continue + self._tokens.append(tok) + cached = False + tok = self._tokens[self._index] + self._index += 1 + if self._verbose: + self.report(cached, False) + return tok + + def peek(self) -> tokenize.TokenInfo: + """Return the next token *without* updating the index.""" + while self._index == len(self._tokens): + tok = next(self._tokengen) + if tok.type in (tokenize.NL, tokenize.COMMENT): + continue + if tok.type == token.ERRORTOKEN and tok.string.isspace(): + continue + self._tokens.append(tok) + return self._tokens[self._index] + + def diagnose(self) -> tokenize.TokenInfo: + if not self._tokens: + self.getnext() + return self._tokens[-1] + + def mark(self) -> Mark: + return self._index + + def reset(self, index: Mark) -> None: + if index == self._index: + return + assert 0 <= index <= len(self._tokens), (index, len(self._tokens)) + old_index = self._index + self._index = index + if self._verbose: + self.report(True, index < old_index) + + def report(self, cached: bool, back: bool) -> None: + if back: + fill = "-" * self._index + "-" + elif cached: + fill = "-" * self._index + ">" + else: + fill = "-" * self._index + "*" + if self._index == 0: + print(f"{fill} (Bof)") + else: + tok = self._tokens[self._index - 1] + print(f"{fill} {shorttok(tok)}") diff --git a/Tools/peg_generator/pyproject.toml b/Tools/peg_generator/pyproject.toml new file mode 100644 index 00000000..f69c5b5e --- /dev/null +++ b/Tools/peg_generator/pyproject.toml @@ -0,0 +1,9 @@ +[tool.black] +line-length = 99 +target_version = ['py38'] +exclude = ''' +( + /pegen/grammar_parser.py # generated file + | /test/test_data/ # test files +) +''' diff --git a/Tools/peg_generator/requirements.pip b/Tools/peg_generator/requirements.pip new file mode 100644 index 00000000..190b3488 --- /dev/null +++ b/Tools/peg_generator/requirements.pip @@ -0,0 +1,2 @@ +memory-profiler==0.57.0 +psutil==5.7.0 diff --git a/Tools/peg_generator/scripts/__init__.py b/Tools/peg_generator/scripts/__init__.py new file mode 100644 index 00000000..1e423f48 --- /dev/null +++ b/Tools/peg_generator/scripts/__init__.py @@ -0,0 +1 @@ +# This exists to let mypy find modules here diff --git a/Tools/peg_generator/scripts/ast_timings.py b/Tools/peg_generator/scripts/ast_timings.py new file mode 100644 index 00000000..ca252208 --- /dev/null +++ b/Tools/peg_generator/scripts/ast_timings.py @@ -0,0 +1,26 @@ +import ast +import sys +import time + +from pegen.testutil import print_memstats + + +def main() -> None: + t0 = time.time() + for filename in sys.argv[1:]: + print(filename, end="\r") + try: + with open(filename) as file: + source = file.read() + tree = ast.parse(source, filename) + except Exception as err: + print(f"{filename}: {err.__class__.__name__}: {err}", file=sys.stderr) + tok = None + t1 = time.time() + dt = t1 - t0 + print(f"Parsed in {dt:.3f} secs", file=sys.stderr) + print_memstats() + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/benchmark.py b/Tools/peg_generator/scripts/benchmark.py new file mode 100644 index 00000000..af356bed --- /dev/null +++ b/Tools/peg_generator/scripts/benchmark.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 + +import argparse +import ast +import sys +import os +from time import time + +import _peg_parser + +try: + import memory_profiler +except ModuleNotFoundError: + print("Please run `make venv` to create a virtual environment and install" + " all the dependencies, before running this script.") + sys.exit(1) + +sys.path.insert(0, os.getcwd()) +from scripts.test_parse_directory import parse_directory + +argparser = argparse.ArgumentParser( + prog="benchmark", description="Reproduce the various pegen benchmarks" +) +argparser.add_argument( + "--parser", + action="store", + choices=["new", "old"], + default="pegen", + help="Which parser to benchmark (default is pegen)", +) +argparser.add_argument( + "--target", + action="store", + choices=["xxl", "stdlib"], + default="xxl", + help="Which target to use for the benchmark (default is xxl.py)", +) + +subcommands = argparser.add_subparsers(title="Benchmarks", dest="subcommand") +command_compile = subcommands.add_parser( + "compile", help="Benchmark parsing and compiling to bytecode" +) +command_parse = subcommands.add_parser( + "parse", help="Benchmark parsing and generating an ast.AST" +) +command_notree = subcommands.add_parser( + "notree", help="Benchmark parsing and dumping the tree" +) + + +def benchmark(func): + def wrapper(*args): + times = list() + for _ in range(3): + start = time() + result = func(*args) + end = time() + times.append(end - start) + memory = memory_profiler.memory_usage((func, args)) + print(f"{func.__name__}") + print(f"\tTime: {sum(times)/3:.3f} seconds on an average of 3 runs") + print(f"\tMemory: {max(memory)} MiB on an average of 3 runs") + return result + + return wrapper + + +@benchmark +def time_compile(source, parser): + if parser == "old": + return _peg_parser.compile_string( + source, + oldparser=True, + ) + else: + return _peg_parser.compile_string(source) + + +@benchmark +def time_parse(source, parser): + if parser == "old": + return _peg_parser.parse_string(source, oldparser=True) + else: + return _peg_parser.parse_string(source) + + +@benchmark +def time_notree(source, parser): + if parser == "old": + return _peg_parser.parse_string(source, oldparser=True, ast=False) + else: + return _peg_parser.parse_string(source, ast=False) + + +def run_benchmark_xxl(subcommand, parser, source): + if subcommand == "compile": + time_compile(source, parser) + elif subcommand == "parse": + time_parse(source, parser) + elif subcommand == "notree": + time_notree(source, parser) + + +def run_benchmark_stdlib(subcommand, parser): + modes = {"compile": 2, "parse": 1, "notree": 0} + for _ in range(3): + parse_directory( + "../../Lib", + verbose=False, + excluded_files=["*/bad*", "*/lib2to3/tests/data/*",], + tree_arg=0, + short=True, + mode=modes[subcommand], + oldparser=(parser == "old"), + ) + + +def main(): + args = argparser.parse_args() + subcommand = args.subcommand + parser = args.parser + target = args.target + + if subcommand is None: + argparser.error("A benchmark to run is required") + + if target == "xxl": + with open(os.path.join("data", "xxl.py"), "r") as f: + source = f.read() + run_benchmark_xxl(subcommand, parser, source) + elif target == "stdlib": + run_benchmark_stdlib(subcommand, parser) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/download_pypi_packages.py b/Tools/peg_generator/scripts/download_pypi_packages.py new file mode 100755 index 00000000..9874202d --- /dev/null +++ b/Tools/peg_generator/scripts/download_pypi_packages.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3.8 + +import argparse +import os +import json + +from typing import Dict, Any +from urllib.request import urlretrieve + +argparser = argparse.ArgumentParser( + prog="download_pypi_packages", description="Helper program to download PyPI packages", +) +argparser.add_argument( + "-n", "--number", type=int, default=100, help="Number of packages to download" +) +argparser.add_argument( + "-a", "--all", action="store_true", help="Download all packages listed in the json file" +) + + +def load_json(filename: str) -> Dict[Any, Any]: + with open(os.path.join("data", f"{filename}.json"), "r") as f: + j = json.loads(f.read()) + return j + + +def remove_json(filename: str) -> None: + path = os.path.join("data", f"{filename}.json") + os.remove(path) + + +def download_package_json(package_name: str) -> None: + url = f"https://pypi.org/pypi/{package_name}/json" + urlretrieve(url, os.path.join("data", f"{package_name}.json")) + + +def download_package_code(name: str, package_json: Dict[Any, Any]) -> None: + source_index = -1 + for idx, url_info in enumerate(package_json["urls"]): + if url_info["python_version"] == "source": + source_index = idx + break + filename = package_json["urls"][source_index]["filename"] + url = package_json["urls"][source_index]["url"] + urlretrieve(url, os.path.join("data", "pypi", filename)) + + +def main() -> None: + args = argparser.parse_args() + number_packages = args.number + all_packages = args.all + + top_pypi_packages = load_json("top-pypi-packages-365-days") + if all_packages: + top_pypi_packages = top_pypi_packages["rows"] + elif number_packages >= 0 and number_packages <= 4000: + top_pypi_packages = top_pypi_packages["rows"][:number_packages] + else: + raise AssertionError("Unknown value for NUMBER_OF_PACKAGES") + + try: + os.mkdir(os.path.join("data", "pypi")) + except FileExistsError: + pass + + for package in top_pypi_packages: + package_name = package["project"] + + print(f"Downloading JSON Data for {package_name}... ", end="") + download_package_json(package_name) + print("Done") + + package_json = load_json(package_name) + try: + print(f"Dowloading and compressing package {package_name} ... ", end="") + download_package_code(package_name, package_json) + print("Done") + except (IndexError, KeyError): + print(f"Could not locate source for {package_name}") + continue + finally: + remove_json(package_name) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/find_max_nesting.py b/Tools/peg_generator/scripts/find_max_nesting.py new file mode 100755 index 00000000..f2fdd00b --- /dev/null +++ b/Tools/peg_generator/scripts/find_max_nesting.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3.8 +"""Find the maximum amount of nesting for an expression that can be parsed +without causing a parse error. + +Starting at the INITIAL_NESTING_DEPTH, an expression containing n parenthesis +around a 0 is generated then tested with both the C and Python parsers. We +continue incrementing the number of parenthesis by 10 until both parsers have +failed. As soon as a single parser fails, we stop testing that parser. + +The grammar file, initial nesting size, and amount by which the nested size is +incremented on each success can be controlled by changing the GRAMMAR_FILE, +INITIAL_NESTING_DEPTH, or NESTED_INCR_AMT variables. + +Usage: python -m scripts.find_max_nesting +""" +import sys + +from _peg_parser import parse_string + +GRAMMAR_FILE = "data/python.gram" +INITIAL_NESTING_DEPTH = 10 +NESTED_INCR_AMT = 10 + + +FAIL = "\033[91m" +ENDC = "\033[0m" + + +def check_nested_expr(nesting_depth: int) -> bool: + expr = f"{'(' * nesting_depth}0{')' * nesting_depth}" + + try: + parse_string(expr) + print(f"Nesting depth of {nesting_depth} is successful") + return True + except Exception as err: + print(f"{FAIL}(Failed with nesting depth of {nesting_depth}{ENDC}") + print(f"{FAIL}\t{err}{ENDC}") + return False + + +def main() -> None: + print(f"Testing {GRAMMAR_FILE} starting at nesting depth of {INITIAL_NESTING_DEPTH}...") + + nesting_depth = INITIAL_NESTING_DEPTH + succeeded = True + while succeeded: + expr = f"{'(' * nesting_depth}0{')' * nesting_depth}" + if succeeded: + succeeded = check_nested_expr(nesting_depth) + nesting_depth += NESTED_INCR_AMT + + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/grammar_grapher.py b/Tools/peg_generator/scripts/grammar_grapher.py new file mode 100755 index 00000000..4afdbce8 --- /dev/null +++ b/Tools/peg_generator/scripts/grammar_grapher.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3.8 + +""" Convert a grammar into a dot-file suitable for use with GraphViz + + For example: + Generate the GraphViz file: + # scripts/grammar_grapher.py data/python.gram > python.gv + + Then generate the graph... + + # twopi python.gv -Tpng > python_twopi.png + + or + + # dot python.gv -Tpng > python_dot.png + + NOTE: The _dot_ and _twopi_ tools seem to produce the most useful results. + The _circo_ tool is the worst of the bunch. Don't even bother. +""" + +import argparse +import sys + +from typing import Any, List + +sys.path.insert(0, ".") + +from pegen.build import build_parser +from pegen.grammar import ( + Alt, + Cut, + Grammar, + Group, + Leaf, + Lookahead, + Rule, + NameLeaf, + NamedItem, + Opt, + Repeat, + Rhs, +) + +argparser = argparse.ArgumentParser(prog="graph_grammar", description="Graph a grammar tree",) +argparser.add_argument( + "-s", + "--start", + choices=["exec", "eval", "single"], + default="exec", + help="Choose the grammar's start rule (exec, eval or single)", +) +argparser.add_argument("grammar_file", help="The grammar file to graph") + + +def references_for_item(item: Any) -> List[Any]: + if isinstance(item, Alt): + return [_ref for _item in item.items for _ref in references_for_item(_item)] + elif isinstance(item, Cut): + return [] + elif isinstance(item, Group): + return references_for_item(item.rhs) + elif isinstance(item, Lookahead): + return references_for_item(item.node) + elif isinstance(item, NamedItem): + return references_for_item(item.item) + + # NOTE NameLeaf must be before Leaf + elif isinstance(item, NameLeaf): + if item.value == "ENDMARKER": + return [] + return [item.value] + elif isinstance(item, Leaf): + return [] + + elif isinstance(item, Opt): + return references_for_item(item.node) + elif isinstance(item, Repeat): + return references_for_item(item.node) + elif isinstance(item, Rhs): + return [_ref for alt in item.alts for _ref in references_for_item(alt)] + elif isinstance(item, Rule): + return references_for_item(item.rhs) + else: + raise RuntimeError(f"Unknown item: {type(item)}") + + +def main() -> None: + args = argparser.parse_args() + + try: + grammar, parser, tokenizer = build_parser(args.grammar_file) + except Exception as err: + print("ERROR: Failed to parse grammar file", file=sys.stderr) + sys.exit(1) + + references = {} + for name, rule in grammar.rules.items(): + references[name] = set(references_for_item(rule)) + + # Flatten the start node if has only a single reference + root_node = {"exec": "file", "eval": "eval", "single": "interactive"}[args.start] + + print("digraph g1 {") + print('\toverlap="scale";') # Force twopi to scale the graph to avoid overlaps + print(f'\troot="{root_node}";') + print(f"\t{root_node} [color=green, shape=circle];") + for name, refs in references.items(): + for ref in refs: + print(f"\t{name} -> {ref};") + print("}") + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/joinstats.py b/Tools/peg_generator/scripts/joinstats.py new file mode 100644 index 00000000..b2d762b3 --- /dev/null +++ b/Tools/peg_generator/scripts/joinstats.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3.8 + +"""Produce a report about the most-memoable types. + +Reads a list of statistics from stdin. Each line must be two numbers, +being a type and a count. We then read some other files and produce a +list sorted by most frequent type. + +There should also be something to recognize left-recursive rules. +""" + +import os +import re +import sys + +from typing import Dict + +reporoot = os.path.dirname(os.path.dirname(__file__)) +parse_c = os.path.join(reporoot, "peg_extension", "parse.c") + + +class TypeMapper: + """State used to map types to names.""" + + def __init__(self, filename: str) -> None: + self.table: Dict[int, str] = {} + with open(filename) as f: + for line in f: + match = re.match(r"#define (\w+)_type (\d+)", line) + if match: + name, type = match.groups() + if "left" in line.lower(): + name += " // Left-recursive" + self.table[int(type)] = name + + def lookup(self, type: int) -> str: + return self.table.get(type, str(type)) + + +def main() -> None: + mapper = TypeMapper(parse_c) + table = [] + filename = sys.argv[1] + with open(filename) as f: + for lineno, line in enumerate(f, 1): + line = line.strip() + if not line or line.startswith("#"): + continue + parts = line.split() + # Extra fields ignored + if len(parts) < 2: + print(f"{lineno}: bad input ({line!r})") + continue + try: + type, count = map(int, parts[:2]) + except ValueError as err: + print(f"{lineno}: non-integer input ({line!r})") + continue + table.append((type, count)) + table.sort(key=lambda values: -values[1]) + for type, count in table: + print(f"{type:4d} {count:9d} {mapper.lookup(type)}") + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/show_parse.py b/Tools/peg_generator/scripts/show_parse.py new file mode 100755 index 00000000..b4ee5a1b --- /dev/null +++ b/Tools/peg_generator/scripts/show_parse.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3.8 + +"""Show the parse tree for a given program, nicely formatted. + +Example: + +$ scripts/show_parse.py a+b +Module( + body=[ + Expr( + value=BinOp( + left=Name(id="a", ctx=Load()), op=Add(), right=Name(id="b", ctx=Load()) + ) + ) + ], + type_ignores=[], +) +$ + +Use -v to show line numbers and column offsets. + +The formatting is done using black. You can also import this module +and call one of its functions. +""" + +import argparse +import ast +import difflib +import os +import sys +import tempfile + +import _peg_parser + +from typing import List + +sys.path.insert(0, os.getcwd()) +from pegen.ast_dump import ast_dump + +parser = argparse.ArgumentParser() +parser.add_argument( + "-d", "--diff", action="store_true", help="show diff between grammar and ast (requires -g)" +) +parser.add_argument( + "-p", + "--parser", + choices=["new", "old"], + default="new", + help="choose the parser to use" +) +parser.add_argument( + "-m", + "--multiline", + action="store_true", + help="concatenate program arguments using newline instead of space", +) +parser.add_argument("-v", "--verbose", action="store_true", help="show line/column numbers") +parser.add_argument("program", nargs="+", help="program to parse (will be concatenated)") + + +def format_tree(tree: ast.AST, verbose: bool = False) -> str: + with tempfile.NamedTemporaryFile("w+") as tf: + tf.write(ast_dump(tree, include_attributes=verbose)) + tf.write("\n") + tf.flush() + cmd = f"black -q {tf.name}" + sts = os.system(cmd) + if sts: + raise RuntimeError(f"Command {cmd!r} failed with status 0x{sts:x}") + tf.seek(0) + return tf.read() + + +def diff_trees(a: ast.AST, b: ast.AST, verbose: bool = False) -> List[str]: + sa = format_tree(a, verbose) + sb = format_tree(b, verbose) + la = sa.splitlines() + lb = sb.splitlines() + return list(difflib.unified_diff(la, lb, "a", "b", lineterm="")) + + +def show_parse(source: str, verbose: bool = False) -> str: + tree = _peg_parser.parse_string(source, oldparser=True) + return format_tree(tree, verbose).rstrip("\n") + + +def print_parse(source: str, verbose: bool = False) -> None: + print(show_parse(source, verbose)) + + +def main() -> None: + args = parser.parse_args() + new_parser = args.parser == "new" + if args.multiline: + sep = "\n" + else: + sep = " " + program = sep.join(args.program) + if new_parser: + tree = _peg_parser.parse_string(program) + + if args.diff: + a = _peg_parser.parse_string(program, oldparser=True) + b = tree + diff = diff_trees(a, b, args.verbose) + if diff: + for line in diff: + print(line) + else: + print("# Trees are the same") + else: + print("# Parsed using the new parser") + print(format_tree(tree, args.verbose)) + else: + tree = _peg_parser.parse_string(program, oldparser=True) + print("# Parsed using the old parser") + print(format_tree(tree, args.verbose)) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/test_parse_directory.py b/Tools/peg_generator/scripts/test_parse_directory.py new file mode 100755 index 00000000..100db1d4 --- /dev/null +++ b/Tools/peg_generator/scripts/test_parse_directory.py @@ -0,0 +1,259 @@ +#!/usr/bin/env python3.8 + +import argparse +import ast +import os +import sys +import time +import traceback +import tokenize +<<<<<<< HEAD +import _peg_parser +from glob import glob +======= +from glob import glob, escape +>>>>>>> 9355868458... bpo-41043: Escape literal part of the path for glob(). (GH-20994) +from pathlib import PurePath + +from typing import List, Optional, Any, Tuple + +sys.path.insert(0, os.getcwd()) +from pegen.ast_dump import ast_dump +from pegen.testutil import print_memstats +from scripts import show_parse + +SUCCESS = "\033[92m" +FAIL = "\033[91m" +ENDC = "\033[0m" + +COMPILE = 2 +PARSE = 1 +NOTREE = 0 + +argparser = argparse.ArgumentParser( + prog="test_parse_directory", + description="Helper program to test directories or files for pegen", +) +argparser.add_argument("-d", "--directory", help="Directory path containing files to test") +argparser.add_argument( + "-e", "--exclude", action="append", default=[], help="Glob(s) for matching files to exclude" +) +argparser.add_argument( + "-s", "--short", action="store_true", help="Only show errors, in a more Emacs-friendly format" +) +argparser.add_argument( + "-v", "--verbose", action="store_true", help="Display detailed errors for failures" +) +argparser.add_argument( + "-t", "--tree", action="count", help="Compare parse tree to official AST", default=0 +) + + +def report_status( + succeeded: bool, + file: str, + verbose: bool, + error: Optional[Exception] = None, + short: bool = False, +) -> None: + if short and succeeded: + return + + if succeeded is True: + status = "OK" + COLOR = SUCCESS + else: + status = "Fail" + COLOR = FAIL + + if short: + lineno = 0 + offset = 0 + if isinstance(error, SyntaxError): + lineno = error.lineno or 1 + offset = error.offset or 1 + message = error.args[0] + else: + message = f"{error.__class__.__name__}: {error}" + print(f"{file}:{lineno}:{offset}: {message}") + else: + print(f"{COLOR}{file:60} {status}{ENDC}") + + if error and verbose: + print(f" {str(error.__class__.__name__)}: {error}") + + +def compare_trees( + actual_tree: ast.AST, file: str, verbose: bool, include_attributes: bool = False, +) -> int: + with open(file) as f: + expected_tree = _peg_parser.parse_string(f.read(), oldparser=True) + + expected_text = ast_dump(expected_tree, include_attributes=include_attributes) + actual_text = ast_dump(actual_tree, include_attributes=include_attributes) + if actual_text == expected_text: + if verbose: + print("Tree for {file}:") + print(show_parse.format_tree(actual_tree, include_attributes)) + return 0 + + print(f"Diffing ASTs for {file} ...") + + expected = show_parse.format_tree(expected_tree, include_attributes) + actual = show_parse.format_tree(actual_tree, include_attributes) + + if verbose: + print("Expected for {file}:") + print(expected) + print("Actual for {file}:") + print(actual) + print(f"Diff for {file}:") + + diff = show_parse.diff_trees(expected_tree, actual_tree, include_attributes) + for line in diff: + print(line) + + return 1 + + +def parse_file(source: str, file: str, mode: int, oldparser: bool) -> Tuple[Any, float]: + t0 = time.time() + if mode == COMPILE: + result = _peg_parser.compile_string( + source, + filename=file, + oldparser=oldparser, + ) + else: + result = _peg_parser.parse_string( + source, + filename=file, + oldparser=oldparser, + ast=(mode == PARSE), + ) + t1 = time.time() + return result, t1 - t0 + + +def is_parsing_failure(source: str) -> bool: + try: + _peg_parser.parse_string(source, mode="exec", oldparser=True) + except SyntaxError: + return False + return True + + +def generate_time_stats(files, total_seconds) -> None: + total_files = len(files) + total_bytes = 0 + total_lines = 0 + for file in files: + # Count lines and bytes separately + with open(file, "rb") as f: + total_lines += sum(1 for _ in f) + total_bytes += f.tell() + + print( + f"Checked {total_files:,} files, {total_lines:,} lines,", + f"{total_bytes:,} bytes in {total_seconds:,.3f} seconds.", + ) + if total_seconds > 0: + print( + f"That's {total_lines / total_seconds :,.0f} lines/sec,", + f"or {total_bytes / total_seconds :,.0f} bytes/sec.", + ) + + +def parse_directory( + directory: str, + verbose: bool, + excluded_files: List[str], + tree_arg: int, + short: bool, + mode: int, + oldparser: bool, +) -> int: + if tree_arg: + assert mode == PARSE, "Mode should be 1 (parse), when comparing the generated trees" + + if oldparser and tree_arg: + print("Cannot specify tree argument with the cpython parser.", file=sys.stderr) + return 1 + + # For a given directory, traverse files and attempt to parse each one + # - Output success/failure for each file + errors = 0 + files = [] + trees = {} # Trees to compare (after everything else is done) + total_seconds = 0 + + for file in sorted(glob(os.path.join(escape(directory), f"**/*.py"), recursive=True)): + # Only attempt to parse Python files and files that are not excluded + if any(PurePath(file).match(pattern) for pattern in excluded_files): + continue + + with tokenize.open(file) as f: + source = f.read() + + try: + result, dt = parse_file(source, file, mode, oldparser) + total_seconds += dt + if tree_arg: + trees[file] = result + report_status(succeeded=True, file=file, verbose=verbose, short=short) + except SyntaxError as error: + if is_parsing_failure(source): + print(f"File {file} cannot be parsed by either parser.") + else: + report_status( + succeeded=False, file=file, verbose=verbose, error=error, short=short + ) + errors += 1 + files.append(file) + + t1 = time.time() + + generate_time_stats(files, total_seconds) + if short: + print_memstats() + + if errors: + print(f"Encountered {errors} failures.", file=sys.stderr) + + # Compare trees (the dict is empty unless -t is given) + compare_trees_errors = 0 + for file, tree in trees.items(): + if not short: + print("Comparing ASTs for", file) + if compare_trees(tree, file, verbose, tree_arg >= 2) == 1: + compare_trees_errors += 1 + + if errors or compare_trees_errors: + return 1 + + return 0 + + +def main() -> None: + args = argparser.parse_args() + directory = args.directory + verbose = args.verbose + excluded_files = args.exclude + tree = args.tree + short = args.short + mode = 1 if args.tree else 2 + sys.exit( + parse_directory( + directory, + verbose, + excluded_files, + tree, + short, + mode, + oldparser=False, + ) + ) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/test_pypi_packages.py b/Tools/peg_generator/scripts/test_pypi_packages.py new file mode 100755 index 00000000..f014753b --- /dev/null +++ b/Tools/peg_generator/scripts/test_pypi_packages.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3.8 + +import argparse +import os +import glob +import tarfile +import zipfile +import shutil +import pathlib +import sys + +from typing import Generator, Any + +sys.path.insert(0, ".") + +from pegen import build +from scripts import test_parse_directory + +HERE = pathlib.Path(__file__).resolve().parent + +argparser = argparse.ArgumentParser( + prog="test_pypi_packages", description="Helper program to test parsing PyPI packages", +) +argparser.add_argument( + "-t", "--tree", action="count", help="Compare parse tree to official AST", default=0 +) + + +def get_packages() -> Generator[str, None, None]: + all_packages = ( + glob.glob("./data/pypi/*.tar.gz") + + glob.glob("./data/pypi/*.zip") + + glob.glob("./data/pypi/*.tgz") + ) + for package in all_packages: + yield package + + +def extract_files(filename: str) -> None: + savedir = os.path.join("data", "pypi") + if tarfile.is_tarfile(filename): + tarfile.open(filename).extractall(savedir) + elif zipfile.is_zipfile(filename): + zipfile.ZipFile(filename).extractall(savedir) + else: + raise ValueError(f"Could not identify type of compressed file {filename}") + + +def find_dirname(package_name: str) -> str: + for name in os.listdir(os.path.join("data", "pypi")): + full_path = os.path.join("data", "pypi", name) + if os.path.isdir(full_path) and name in package_name: + return full_path + assert False # This is to fix mypy, should never be reached + + +def run_tests(dirname: str, tree: int) -> int: + return test_parse_directory.parse_directory( + dirname, + verbose=False, + excluded_files=[], + tree_arg=tree, + short=True, + mode=1 if tree else 0, + parser="pegen", + ) + + +def main() -> None: + args = argparser.parse_args() + tree = args.tree + + for package in get_packages(): + print(f"Extracting files from {package}... ", end="") + try: + extract_files(package) + print("Done") + except ValueError as e: + print(e) + continue + + print(f"Trying to parse all python files ... ") + dirname = find_dirname(package) + status = run_tests(dirname, tree) + if status == 0: + shutil.rmtree(dirname) + else: + print(f"Failed to parse {dirname}") + + +if __name__ == "__main__": + main() diff --git a/Tools/pynche/PyncheWidget.py b/Tools/pynche/PyncheWidget.py index 364f22b0..ef12198a 100644 --- a/Tools/pynche/PyncheWidget.py +++ b/Tools/pynche/PyncheWidget.py @@ -281,10 +281,14 @@ class PopupViewer: self.__window.deiconify() def __eq__(self, other): - return self.__menutext == other.__menutext + if isinstance(self, PopupViewer): + return self.__menutext == other.__menutext + return NotImplemented def __lt__(self, other): - return self.__menutext < other.__menutext + if isinstance(self, PopupViewer): + return self.__menutext < other.__menutext + return NotImplemented def make_view_popups(switchboard, root, extrapath): diff --git a/Tools/pynche/StripViewer.py b/Tools/pynche/StripViewer.py index 2b0ede39..6914ca94 100644 --- a/Tools/pynche/StripViewer.py +++ b/Tools/pynche/StripViewer.py @@ -371,22 +371,6 @@ class StripViewer: command=self.__togglehex) hexbtn.grid(row=1, column=1, sticky=W) - # XXX: ignore this feature for now; it doesn't work quite right yet - -## gentypevar = self.__gentypevar = IntVar() -## self.__variations = Radiobutton(frame, -## text='Variations', -## variable=gentypevar, -## value=0, -## command=self.__togglegentype) -## self.__variations.grid(row=0, column=1, sticky=W) -## self.__constants = Radiobutton(frame, -## text='Constants', -## variable=gentypevar, -## value=1, -## command=self.__togglegentype) -## self.__constants.grid(row=1, column=1, sticky=W) - # create the white button whitebtn = Button(frame2, text='White', @@ -402,26 +386,6 @@ class StripViewer: red, green, blue = self.__sb.current_rgb() self.update_yourself(red, green, blue) -## def __togglegentype(self, event=None): -## which = self.__gentypevar.get() -## if which == 0: -## self.__reds.set(label='Red Variations', -## generator=constant_cyan_generator) -## self.__greens.set(label='Green Variations', -## generator=constant_magenta_generator) -## self.__blues.set(label='Blue Variations', -## generator=constant_yellow_generator) -## elif which == 1: -## self.__reds.set(label='Red Constant', -## generator=constant_red_generator) -## self.__greens.set(label='Green Constant', -## generator=constant_green_generator) -## self.__blues.set(label='Blue Constant', -## generator=constant_blue_generator) -## else: -## assert 0 -## self.__sb.update_views_current() - def __toblack(self, event=None): self.__sb.update_views(0, 0, 0) diff --git a/Tools/scripts/README b/Tools/scripts/README index d4ac2ade..7fc51a10 100644 --- a/Tools/scripts/README +++ b/Tools/scripts/README @@ -7,7 +7,6 @@ abitype.py Converts a C file to use the PEP 384 type definition A analyze_dxp.py Analyzes the result of sys.getdxp() byext.py Print lines/words/chars stats of files by extension byteyears.py Print product of a file's size and age -checkpyc.py Check presence and validity of ".pyc" files cleanfuture.py Fix redundant Python __future__ statements combinerefs.py A helper for analyzing PYTHONDUMPREFS output copytime.py Copy one file's atime and mtime to another @@ -30,7 +29,6 @@ ftpmirror.py FTP mirror script get-remote-certificate.py Fetch the certificate that the server(s) are providing in PEM form google.py Open a webbrowser with Google gprof2html.py Transform gprof(1) output into useful HTML -h2py.py Translate #define's into Python assignments highlight.py Python syntax highlighting with HTML output idle3 Main program to start IDLE ifdef.py Remove #if(n)def groups from C sources diff --git a/Tools/scripts/checkpyc.py b/Tools/scripts/checkpyc.py deleted file mode 100755 index bbaa3d13..00000000 --- a/Tools/scripts/checkpyc.py +++ /dev/null @@ -1,69 +0,0 @@ -#! /usr/bin/env python3 -# Check that all ".pyc" files exist and are up-to-date -# Uses module 'os' - -import sys -import os -from stat import ST_MTIME -import importlib.util - -# PEP 3147 compatibility (PYC Repository Directories) -cache_from_source = (importlib.util.cache_from_source if sys.implementation.cache_tag - else lambda path: path + 'c') - - -def main(): - if len(sys.argv) > 1: - verbose = (sys.argv[1] == '-v') - silent = (sys.argv[1] == '-s') - else: - verbose = silent = False - MAGIC = importlib.util.MAGIC_NUMBER - if not silent: - print('Using MAGIC word', repr(MAGIC)) - for dirname in sys.path: - try: - names = os.listdir(dirname) - except OSError: - print('Cannot list directory', repr(dirname)) - continue - if not silent: - print('Checking ', repr(dirname), '...') - for name in sorted(names): - if name.endswith('.py'): - name = os.path.join(dirname, name) - try: - st = os.stat(name) - except OSError: - print('Cannot stat', repr(name)) - continue - if verbose: - print('Check', repr(name), '...') - name_c = cache_from_source(name) - try: - with open(name_c, 'rb') as f: - magic_str = f.read(4) - mtime_str = f.read(4) - except IOError: - print('Cannot open', repr(name_c)) - continue - if magic_str != MAGIC: - print('Bad MAGIC word in ".pyc" file', end=' ') - print(repr(name_c)) - continue - mtime = get_long(mtime_str) - if mtime in {0, -1}: - print('Bad ".pyc" file', repr(name_c)) - elif mtime != st[ST_MTIME]: - print('Out-of-date ".pyc" file', end=' ') - print(repr(name_c)) - - -def get_long(s): - if len(s) != 4: - return -1 - return s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24) - - -if __name__ == '__main__': - main() diff --git a/Tools/scripts/generate_opcode_h.py b/Tools/scripts/generate_opcode_h.py index b184ffa1..873f8215 100644 --- a/Tools/scripts/generate_opcode_h.py +++ b/Tools/scripts/generate_opcode_h.py @@ -22,11 +22,6 @@ footer = """ remaining private.*/ #define EXCEPT_HANDLER 257 - -enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, - PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN, - PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; - #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) #ifdef __cplusplus diff --git a/Tools/scripts/generate_token.py b/Tools/scripts/generate_token.py old mode 100644 new mode 100755 index f2745e83..77bb5bd5 --- a/Tools/scripts/generate_token.py +++ b/Tools/scripts/generate_token.py @@ -69,6 +69,10 @@ extern "C" { #define ISTERMINAL(x) ((x) < NT_OFFSET) #define ISNONTERMINAL(x) ((x) >= NT_OFFSET) #define ISEOF(x) ((x) == ENDMARKER) +#define ISWHITESPACE(x) ((x) == ENDMARKER || \\ + (x) == NEWLINE || \\ + (x) == INDENT || \\ + (x) == DEDENT) PyAPI_DATA(const char * const) _PyParser_TokenNames[]; /* Token names */ diff --git a/Tools/scripts/h2py.py b/Tools/scripts/h2py.py deleted file mode 100755 index ea37c04d..00000000 --- a/Tools/scripts/h2py.py +++ /dev/null @@ -1,171 +0,0 @@ -#! /usr/bin/env python3 - -# Read #define's and translate to Python code. -# Handle #include statements. -# Handle #define macros with one argument. -# Anything that isn't recognized or doesn't translate into valid -# Python is ignored. - -# Without filename arguments, acts as a filter. -# If one or more filenames are given, output is written to corresponding -# filenames in the local directory, translated to all uppercase, with -# the extension replaced by ".py". - -# By passing one or more options of the form "-i regular_expression" -# you can specify additional strings to be ignored. This is useful -# e.g. to ignore casts to u_long: simply specify "-i '(u_long)'". - -# XXX To do: -# - turn trailing C comments into Python comments -# - turn C Boolean operators "&& || !" into Python "and or not" -# - what to do about #if(def)? -# - what to do about macros with multiple parameters? - -import sys, re, getopt, os - -p_define = re.compile(r'^[\t ]*#[\t ]*define[\t ]+([a-zA-Z0-9_]+)[\t ]+') - -p_macro = re.compile( - r'^[\t ]*#[\t ]*define[\t ]+' - r'([a-zA-Z0-9_]+)\(([_a-zA-Z][_a-zA-Z0-9]*)\)[\t ]+') - -p_include = re.compile(r'^[\t ]*#[\t ]*include[\t ]+<([^>\n]+)>') - -p_comment = re.compile(r'/\*([^*]+|\*+[^/])*(\*+/)?') -p_cpp_comment = re.compile('//.*') - -ignores = [p_comment, p_cpp_comment] - -p_char = re.compile(r"'(\\.[^\\]*|[^\\])'") - -p_hex = re.compile(r"0x([0-9a-fA-F]+)L?") - -filedict = {} -importable = {} - -try: - searchdirs=os.environ['include'].split(';') -except KeyError: - try: - searchdirs=os.environ['INCLUDE'].split(';') - except KeyError: - searchdirs=['/usr/include'] - try: - searchdirs.insert(0, os.path.join('/usr/include', - os.environ['MULTIARCH'])) - except KeyError: - pass - -def main(): - global filedict - opts, args = getopt.getopt(sys.argv[1:], 'i:') - for o, a in opts: - if o == '-i': - ignores.append(re.compile(a)) - if not args: - args = ['-'] - for filename in args: - if filename == '-': - sys.stdout.write('# Generated by h2py from stdin\n') - process(sys.stdin, sys.stdout) - else: - with open(filename) as fp: - outfile = os.path.basename(filename) - i = outfile.rfind('.') - if i > 0: outfile = outfile[:i] - modname = outfile.upper() - outfile = modname + '.py' - with open(outfile, 'w') as outfp: - outfp.write('# Generated by h2py from %s\n' % filename) - filedict = {} - for dir in searchdirs: - if filename[:len(dir)] == dir: - filedict[filename[len(dir)+1:]] = None # no '/' trailing - importable[filename[len(dir)+1:]] = modname - break - process(fp, outfp) - -def pytify(body): - # replace ignored patterns by spaces - for p in ignores: - body = p.sub(' ', body) - # replace char literals by ord(...) - body = p_char.sub("ord('\\1')", body) - # Compute negative hexadecimal constants - start = 0 - UMAX = 2*(sys.maxsize+1) - while 1: - m = p_hex.search(body, start) - if not m: break - s,e = m.span() - val = int(body[slice(*m.span(1))], 16) - if val > sys.maxsize: - val -= UMAX - body = body[:s] + "(" + str(val) + ")" + body[e:] - start = s + 1 - return body - -def process(fp, outfp, env = {}): - lineno = 0 - while 1: - line = fp.readline() - if not line: break - lineno = lineno + 1 - match = p_define.match(line) - if match: - # gobble up continuation lines - while line[-2:] == '\\\n': - nextline = fp.readline() - if not nextline: break - lineno = lineno + 1 - line = line + nextline - name = match.group(1) - body = line[match.end():] - body = pytify(body) - ok = 0 - stmt = '%s = %s\n' % (name, body.strip()) - try: - exec(stmt, env) - except: - sys.stderr.write('Skipping: %s' % stmt) - else: - outfp.write(stmt) - match = p_macro.match(line) - if match: - macro, arg = match.group(1, 2) - body = line[match.end():] - body = pytify(body) - stmt = 'def %s(%s): return %s\n' % (macro, arg, body) - try: - exec(stmt, env) - except: - sys.stderr.write('Skipping: %s' % stmt) - else: - outfp.write(stmt) - match = p_include.match(line) - if match: - regs = match.regs - a, b = regs[1] - filename = line[a:b] - if filename in importable: - outfp.write('from %s import *\n' % importable[filename]) - elif filename not in filedict: - filedict[filename] = None - inclfp = None - for dir in searchdirs: - try: - inclfp = open(dir + '/' + filename) - break - except IOError: - pass - if inclfp: - with inclfp: - outfp.write( - '\n# Included from %s\n' % filename) - process(inclfp, outfp, env) - else: - sys.stderr.write('Warning - could not find file %s\n' % - filename) - -if __name__ == '__main__': - main() diff --git a/Tools/scripts/run_tests.py b/Tools/scripts/run_tests.py index 3c1c3bd0..bcfa5e94 100644 --- a/Tools/scripts/run_tests.py +++ b/Tools/scripts/run_tests.py @@ -25,8 +25,10 @@ def main(regrtest_args): '-u', # Unbuffered stdout and stderr '-W', 'default', # Warnings set to 'default' '-bb', # Warnings about bytes/bytearray - '-E', # Ignore environment variables ] + if 'PYTHONOLDPARSER' not in os.environ: + args.append('-E') # Ignore environment variables + # Allow user-specified interpreter options to override our defaults. args.extend(test.support.args_from_interpreter_flags()) diff --git a/Tools/scripts/which.py b/Tools/scripts/which.py index df54ce03..b42e07c7 100755 --- a/Tools/scripts/which.py +++ b/Tools/scripts/which.py @@ -49,6 +49,7 @@ def main(): msg(filename + ': not executable') if longlist: sts = os.system('ls ' + longlist + ' ' + filename) + sts = os.waitstatus_to_exitcode(sts) if sts: msg('"ls -l" exit status: ' + repr(sts)) if not ident: msg(prog + ': not found') diff --git a/Tools/ssl/make_ssl_data.py b/Tools/ssl/make_ssl_data.py index c39e38c5..1dc234f5 100755 --- a/Tools/ssl/make_ssl_data.py +++ b/Tools/ssl/make_ssl_data.py @@ -2,7 +2,7 @@ """ This script should be called *manually* when we want to upgrade SSLError -`library` and `reason` mnemnonics to a more recent OpenSSL version. +`library` and `reason` mnemonics to a more recent OpenSSL version. It takes two arguments: - the path to the OpenSSL source tree (e.g. git checkout) diff --git a/Tools/unicode/genmap_japanese.py b/Tools/unicode/genmap_japanese.py new file mode 100644 index 00000000..21de37b6 --- /dev/null +++ b/Tools/unicode/genmap_japanese.py @@ -0,0 +1,251 @@ +# +# genmap_ja_codecs.py: Japanese Codecs Map Generator +# +# Original Author: Hye-Shik Chang +# Modified Author: Dong-hee Na +# +import os + +from genmap_support import * + +JISX0208_C1 = (0x21, 0x74) +JISX0208_C2 = (0x21, 0x7e) +JISX0212_C1 = (0x22, 0x6d) +JISX0212_C2 = (0x21, 0x7e) +JISX0213_C1 = (0x21, 0x7e) +JISX0213_C2 = (0x21, 0x7e) +CP932P0_C1 = (0x81, 0x81) # patches between shift-jis and cp932 +CP932P0_C2 = (0x5f, 0xca) +CP932P1_C1 = (0x87, 0x87) # CP932 P1 +CP932P1_C2 = (0x40, 0x9c) +CP932P2_C1 = (0xed, 0xfc) # CP932 P2 +CP932P2_C2 = (0x40, 0xfc) + +MAPPINGS_JIS0208 = 'http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0208.TXT' +MAPPINGS_JIS0212 = 'http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0212.TXT' +MAPPINGS_CP932 = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT' +MAPPINGS_JISX0213_2004 = 'http://wakaba-web.hp.infoseek.co.jp/table/jisx0213-2004-std.txt' + + +def loadmap_jisx0213(fo): + decmap3, decmap4 = {}, {} # maps to BMP for level 3 and 4 + decmap3_2, decmap4_2 = {}, {} # maps to U+2xxxx for level 3 and 4 + decmap3_pair = {} # maps to BMP-pair for level 3 + for line in fo: + line = line.split('#', 1)[0].strip() + if not line or len(line.split()) < 2: + continue + + row = line.split() + loc = eval('0x' + row[0][2:]) + level = eval(row[0][0]) + m = None + if len(row[1].split('+')) == 2: # single unicode + uni = eval('0x' + row[1][2:]) + if level == 3: + if uni < 0x10000: + m = decmap3 + elif 0x20000 <= uni < 0x30000: + uni -= 0x20000 + m = decmap3_2 + elif level == 4: + if uni < 0x10000: + m = decmap4 + elif 0x20000 <= uni < 0x30000: + uni -= 0x20000 + m = decmap4_2 + m.setdefault((loc >> 8), {}) + m[(loc >> 8)][(loc & 0xff)] = uni + else: # pair + uniprefix = eval('0x' + row[1][2:6]) # body + uni = eval('0x' + row[1][7:11]) # modifier + if level != 3: + raise ValueError("invalid map") + decmap3_pair.setdefault(uniprefix, {}) + m = decmap3_pair[uniprefix] + + if m is None: + raise ValueError("invalid map") + m.setdefault((loc >> 8), {}) + m[(loc >> 8)][(loc & 0xff)] = uni + + return decmap3, decmap4, decmap3_2, decmap4_2, decmap3_pair + + +def main(): + jisx0208file = open_mapping_file('python-mappings/JIS0208.TXT', MAPPINGS_JIS0208) + jisx0212file = open_mapping_file('python-mappings/JIS0212.TXT', MAPPINGS_JIS0212) + cp932file = open_mapping_file('python-mappings/CP932.TXT', MAPPINGS_CP932) + jisx0213file = open_mapping_file('python-mappings/jisx0213-2004-std.txt', MAPPINGS_JISX0213_2004) + + print("Loading Mapping File...") + + sjisdecmap = loadmap(jisx0208file, natcol=0, unicol=2) + jisx0208decmap = loadmap(jisx0208file, natcol=1, unicol=2) + jisx0212decmap = loadmap(jisx0212file) + cp932decmap = loadmap(cp932file) + jis3decmap, jis4decmap, jis3_2_decmap, jis4_2_decmap, jis3_pairdecmap = loadmap_jisx0213(jisx0213file) + + if jis3decmap[0x21][0x24] != 0xff0c: + raise SystemExit('Please adjust your JIS X 0213 map using jisx0213-2000-std.txt.diff') + + sjisencmap, cp932encmap = {}, {} + jisx0208_0212encmap = {} + for c1, m in sjisdecmap.items(): + for c2, code in m.items(): + sjisencmap.setdefault(code >> 8, {}) + sjisencmap[code >> 8][code & 0xff] = c1 << 8 | c2 + for c1, m in cp932decmap.items(): + for c2, code in m.items(): + cp932encmap.setdefault(code >> 8, {}) + if (code & 0xff) not in cp932encmap[code >> 8]: + cp932encmap[code >> 8][code & 0xff] = c1 << 8 | c2 + for c1, m in cp932encmap.copy().items(): + for c2, code in m.copy().items(): + if c1 in sjisencmap and c2 in sjisencmap[c1] and sjisencmap[c1][c2] == code: + del cp932encmap[c1][c2] + if not cp932encmap[c1]: + del cp932encmap[c1] + + jisx0213pairdecmap = {} + jisx0213pairencmap = [] + for unibody, m1 in jis3_pairdecmap.items(): + for c1, m2 in m1.items(): + for c2, modifier in m2.items(): + jisx0213pairencmap.append((unibody, modifier, c1 << 8 | c2)) + jisx0213pairdecmap.setdefault(c1, {}) + jisx0213pairdecmap[c1][c2] = unibody << 16 | modifier + + # Twinmap for both of JIS X 0208 (MSB unset) and JIS X 0212 (MSB set) + for c1, m in jisx0208decmap.items(): + for c2, code in m.items(): + jisx0208_0212encmap.setdefault(code >> 8, {}) + jisx0208_0212encmap[code >> 8][code & 0xff] = c1 << 8 | c2 + + for c1, m in jisx0212decmap.items(): + for c2, code in m.items(): + jisx0208_0212encmap.setdefault(code >> 8, {}) + if (code & 0xff) in jisx0208_0212encmap[code >> 8]: + print("OOPS!!!", (code)) + jisx0208_0212encmap[code >> 8][code & 0xff] = 0x8000 | c1 << 8 | c2 + + jisx0213bmpencmap = {} + for c1, m in jis3decmap.copy().items(): + for c2, code in m.copy().items(): + if c1 in jisx0208decmap and c2 in jisx0208decmap[c1]: + if code in jis3_pairdecmap: + jisx0213bmpencmap[code >> 8][code & 0xff] = (0,) # pair + jisx0213pairencmap.append((code, 0, c1 << 8 | c2)) + elif jisx0208decmap[c1][c2] == code: + del jis3decmap[c1][c2] + if not jis3decmap[c1]: + del jis3decmap[c1] + else: + raise ValueError("Difference between JIS X 0208 and JIS X 0213 Plane 1 is found.") + else: + jisx0213bmpencmap.setdefault(code >> 8, {}) + if code not in jis3_pairdecmap: + jisx0213bmpencmap[code >> 8][code & 0xff] = c1 << 8 | c2 + else: + jisx0213bmpencmap[code >> 8][code & 0xff] = (0,) # pair + jisx0213pairencmap.append((code, 0, c1 << 8 | c2)) + + for c1, m in jis4decmap.items(): + for c2, code in m.items(): + jisx0213bmpencmap.setdefault(code >> 8, {}) + jisx0213bmpencmap[code >> 8][code & 0xff] = 0x8000 | c1 << 8 | c2 + + jisx0213empencmap = {} + for c1, m in jis3_2_decmap.items(): + for c2, code in m.items(): + jisx0213empencmap.setdefault(code >> 8, {}) + jisx0213empencmap[code >> 8][code & 0xff] = c1 << 8 | c2 + for c1, m in jis4_2_decmap.items(): + for c2, code in m.items(): + jisx0213empencmap.setdefault(code >> 8, {}) + jisx0213empencmap[code >> 8][code & 0xff] = 0x8000 | c1 << 8 | c2 + + with open("mappings_jp.h", "w") as fp: + print_autogen(fp, os.path.basename(__file__)) + print("Generating JIS X 0208 decode map...") + writer = DecodeMapWriter(fp, "jisx0208", jisx0208decmap) + writer.update_decode_map(JISX0208_C1, JISX0208_C2) + writer.generate() + + print("Generating JIS X 0212 decode map...") + writer = DecodeMapWriter(fp, "jisx0212", jisx0212decmap) + writer.update_decode_map(JISX0212_C1, JISX0212_C2) + writer.generate() + + print("Generating JIS X 0208 && JIS X 0212 encode map...") + writer = EncodeMapWriter(fp, "jisxcommon", jisx0208_0212encmap) + writer.generate() + + print("Generating CP932 Extension decode map...") + writer = DecodeMapWriter(fp, "cp932ext", cp932decmap) + writer.update_decode_map(CP932P0_C1, CP932P0_C2) + writer.update_decode_map(CP932P1_C1, CP932P1_C2) + writer.update_decode_map(CP932P2_C1, CP932P2_C2) + writer.generate() + + print("Generating CP932 Extension encode map...") + writer = EncodeMapWriter(fp, "cp932ext", cp932encmap) + writer.generate() + + print("Generating JIS X 0213 Plane 1 BMP decode map...") + writer = DecodeMapWriter(fp, "jisx0213_1_bmp", jis3decmap) + writer.update_decode_map(JISX0213_C1, JISX0213_C2) + writer.generate() + + print("Generating JIS X 0213 Plane 2 BMP decode map...") + writer = DecodeMapWriter(fp, "jisx0213_2_bmp", jis4decmap) + writer.update_decode_map(JISX0213_C1, JISX0213_C2) + writer.generate() + + print("Generating JIS X 0213 BMP encode map...") + writer = EncodeMapWriter(fp, "jisx0213_bmp", jisx0213bmpencmap) + writer.generate() + + print("Generating JIS X 0213 Plane 1 EMP decode map...") + writer = DecodeMapWriter(fp, "jisx0213_1_emp", jis3_2_decmap) + writer.update_decode_map(JISX0213_C1, JISX0213_C2) + writer.generate() + + print("Generating JIS X 0213 Plane 2 EMP decode map...") + writer = DecodeMapWriter(fp, "jisx0213_2_emp", jis4_2_decmap) + writer.update_decode_map(JISX0213_C1, JISX0213_C2) + writer.generate() + + print("Generating JIS X 0213 EMP encode map...") + writer = EncodeMapWriter(fp, "jisx0213_emp", jisx0213empencmap) + writer.generate() + + with open('mappings_jisx0213_pair.h', 'w') as fp: + print_autogen(fp, os.path.basename(__file__)) + fp.write(f"#define JISX0213_ENCPAIRS {len(jisx0213pairencmap)}\n") + fp.write("""\ +#ifdef EXTERN_JISX0213_PAIR +static const struct widedbcs_index *jisx0213_pair_decmap; +static const struct pair_encodemap *jisx0213_pair_encmap; +#else +""") + + print("Generating JIS X 0213 unicode-pair decode map...") + writer = DecodeMapWriter(fp, "jisx0213_pair", jisx0213pairdecmap) + writer.update_decode_map(JISX0213_C1, JISX0213_C2) + writer.generate(wide=True) + + print("Generating JIS X 0213 unicode-pair encode map...") + jisx0213pairencmap.sort() + fp.write("static const struct pair_encodemap jisx0213_pair_encmap[JISX0213_ENCPAIRS] = {\n") + filler = BufferedFiller() + for body, modifier, jis in jisx0213pairencmap: + filler.write('{', '0x%04x%04x,' % (body, modifier), '0x%04x' % jis, '},') + filler.printout(fp) + fp.write("};\n") + fp.write("#endif\n") + + print("Done!") + +if __name__ == '__main__': + main() diff --git a/Tools/unicode/genmap_korean.py b/Tools/unicode/genmap_korean.py new file mode 100644 index 00000000..4b94a6c4 --- /dev/null +++ b/Tools/unicode/genmap_korean.py @@ -0,0 +1,62 @@ +# +# genmap_korean.py: Korean Codecs Map Generator +# +# Original Author: Hye-Shik Chang +# Modified Author: Dong-hee Na +# +import os + +from genmap_support import * + + +KSX1001_C1 = (0x21, 0x7e) +KSX1001_C2 = (0x21, 0x7e) +UHCL1_C1 = (0x81, 0xa0) +UHCL1_C2 = (0x41, 0xfe) +UHCL2_C1 = (0xa1, 0xfe) +UHCL2_C2 = (0x41, 0xa0) +MAPPINGS_CP949 = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT' + + +def main(): + mapfile = open_mapping_file('python-mappings/CP949.TXT', MAPPINGS_CP949) + print("Loading Mapping File...") + decmap = loadmap(mapfile) + uhcdecmap, ksx1001decmap, cp949encmap = {}, {}, {} + for c1, c2map in decmap.items(): + for c2, code in c2map.items(): + if c1 >= 0xa1 and c2 >= 0xa1: + ksx1001decmap.setdefault(c1 & 0x7f, {}) + ksx1001decmap[c1 & 0x7f][c2 & 0x7f] = c2map[c2] + cp949encmap.setdefault(code >> 8, {}) + cp949encmap[code >> 8][code & 0xFF] = (c1 << 8 | c2) & 0x7f7f + else: + # uhc + uhcdecmap.setdefault(c1, {}) + uhcdecmap[c1][c2] = c2map[c2] + cp949encmap.setdefault(code >> 8, {}) # MSB set + cp949encmap[code >> 8][code & 0xFF] = (c1 << 8 | c2) + + with open('mappings_kr.h', 'w') as fp: + print_autogen(fp, os.path.basename(__file__)) + + print("Generating KS X 1001 decode map...") + writer = DecodeMapWriter(fp, "ksx1001", ksx1001decmap) + writer.update_decode_map(KSX1001_C1, KSX1001_C2) + writer.generate() + + print("Generating UHC decode map...") + writer = DecodeMapWriter(fp, "cp949ext", uhcdecmap) + writer.update_decode_map(UHCL1_C1, UHCL1_C2) + writer.update_decode_map(UHCL2_C1, UHCL2_C2) + writer.generate() + + print("Generating CP949 (includes KS X 1001) encode map...") + writer = EncodeMapWriter(fp, "cp949", cp949encmap) + writer.generate() + + print("Done!") + + +if __name__ == '__main__': + main() diff --git a/Tools/unicode/genmap_schinese.py b/Tools/unicode/genmap_schinese.py new file mode 100644 index 00000000..647c0333 --- /dev/null +++ b/Tools/unicode/genmap_schinese.py @@ -0,0 +1,149 @@ +# +# genmap_schinese.py: Simplified Chinese Codecs Map Generator +# +# Original Author: Hye-Shik Chang +# Modified Author: Dong-hee Na +# +import os +import re + +from genmap_support import * + + +GB2312_C1 = (0x21, 0x7e) +GB2312_C2 = (0x21, 0x7e) +GBKL1_C1 = (0x81, 0xa8) +GBKL1_C2 = (0x40, 0xfe) +GBKL2_C1 = (0xa9, 0xfe) +GBKL2_C2 = (0x40, 0xa0) +GB18030EXTP1_C1 = (0xa1, 0xa9) +GB18030EXTP1_C2 = (0x40, 0xfe) +GB18030EXTP2_C1 = (0xaa, 0xaf) +GB18030EXTP2_C2 = (0xa1, 0xfe) +GB18030EXTP3_C1 = (0xd7, 0xd7) +GB18030EXTP3_C2 = (0xfa, 0xfe) +GB18030EXTP4_C1 = (0xf8, 0xfd) +GB18030EXTP4_C2 = (0xa1, 0xfe) +GB18030EXTP5_C1 = (0xfe, 0xfe) +GB18030EXTP5_C2 = (0x50, 0xfe) + +MAPPINGS_GB2312 = 'http://people.freebsd.org/~perky/i18n/GB2312.TXT' +MAPPINGS_CP936 = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT' +MAPPINGS_GB18030 = 'http://oss.software.ibm.com/cvs/icu/~checkout~/charset/data/xml/gb-18030-2000.xml' + +re_gb18030ass = re.compile('') + + +def parse_gb18030map(fo): + m, gbuni = {}, {} + for i in range(65536): + if i < 0xd800 or i > 0xdfff: # exclude unicode surrogate area + gbuni[i] = None + for uni, native in re_gb18030ass.findall(fo.read()): + uni = eval('0x'+uni) + native = [eval('0x'+u) for u in native.split()] + if len(native) <= 2: + del gbuni[uni] + if len(native) == 2: # we can decode algorithmically for 1 or 4 bytes + m.setdefault(native[0], {}) + m[native[0]][native[1]] = uni + gbuni = [k for k in gbuni.keys()] + gbuni.sort() + return m, gbuni + +def main(): + print("Loading Mapping File...") + gb2312map = open_mapping_file('python-mappings/GB2312.TXT', MAPPINGS_GB2312) + cp936map = open_mapping_file('python-mappings/CP936.TXT', MAPPINGS_CP936) + gb18030map = open_mapping_file('python-mappings/gb-18030-2000.xml', MAPPINGS_GB18030) + + gb18030decmap, gb18030unilinear = parse_gb18030map(gb18030map) + gbkdecmap = loadmap(cp936map) + gb2312decmap = loadmap(gb2312map) + difmap = {} + for c1, m in gbkdecmap.items(): + for c2, code in m.items(): + del gb18030decmap[c1][c2] + if not gb18030decmap[c1]: + del gb18030decmap[c1] + for c1, m in gb2312decmap.items(): + for c2, code in m.items(): + gbkc1, gbkc2 = c1 | 0x80, c2 | 0x80 + if gbkdecmap[gbkc1][gbkc2] == code: + del gbkdecmap[gbkc1][gbkc2] + if not gbkdecmap[gbkc1]: + del gbkdecmap[gbkc1] + + gb2312_gbkencmap, gb18030encmap = {}, {} + for c1, m in gbkdecmap.items(): + for c2, code in m.items(): + gb2312_gbkencmap.setdefault(code >> 8, {}) + gb2312_gbkencmap[code >> 8][code & 0xff] = c1 << 8 | c2 # MSB set + for c1, m in gb2312decmap.items(): + for c2, code in m.items(): + gb2312_gbkencmap.setdefault(code >> 8, {}) + gb2312_gbkencmap[code >> 8][code & 0xff] = c1 << 8 | c2 # MSB unset + for c1, m in gb18030decmap.items(): + for c2, code in m.items(): + gb18030encmap.setdefault(code >> 8, {}) + gb18030encmap[code >> 8][code & 0xff] = c1 << 8 | c2 + + with open('mappings_cn.h', 'w') as fp: + print_autogen(fp, os.path.basename(__file__)) + + print("Generating GB2312 decode map...") + writer = DecodeMapWriter(fp, "gb2312", gb2312decmap) + writer.update_decode_map(GB2312_C1, GB2312_C2) + writer.generate() + + print("Generating GBK decode map...") + writer = DecodeMapWriter(fp, "gbkext", gbkdecmap) + writer.update_decode_map(GBKL1_C1, GBKL1_C2) + writer.update_decode_map(GBKL2_C1, GBKL2_C2) + writer.generate() + + print("Generating GB2312 && GBK encode map...") + writer = EncodeMapWriter(fp, "gbcommon", gb2312_gbkencmap) + writer.generate() + + print("Generating GB18030 extension decode map...") + writer = DecodeMapWriter(fp, "gb18030ext", gb18030decmap) + for i in range(1, 6): + writer.update_decode_map(eval("GB18030EXTP%d_C1" % i), eval("GB18030EXTP%d_C2" % i)) + + writer.generate() + + print("Generating GB18030 extension encode map...") + writer = EncodeMapWriter(fp, "gb18030ext", gb18030encmap) + writer.generate() + + print("Generating GB18030 Unicode BMP Mapping Ranges...") + ranges = [[-1, -1, -1]] + gblinnum = 0 + fp.write(""" +static const struct _gb18030_to_unibmp_ranges { + Py_UCS4 first, last; + DBCHAR base; +} gb18030_to_unibmp_ranges[] = { +""") + + for uni in gb18030unilinear: + if uni == ranges[-1][1] + 1: + ranges[-1][1] = uni + else: + ranges.append([uni, uni, gblinnum]) + gblinnum += 1 + + filler = BufferedFiller() + for first, last, base in ranges[1:]: + filler.write('{', str(first), ',', str(last), ',', str(base), '},') + + filler.write('{', '0,', '0,', str( + ranges[-1][2] + ranges[-1][1] - ranges[-1][0] + 1), '}', '};') + filler.printout(fp) + + print("Done!") + + +if __name__ == '__main__': + main() diff --git a/Tools/unicode/genmap_support.py b/Tools/unicode/genmap_support.py new file mode 100644 index 00000000..5e1d9ee7 --- /dev/null +++ b/Tools/unicode/genmap_support.py @@ -0,0 +1,198 @@ +# +# genmap_support.py: Multibyte Codec Map Generator +# +# Original Author: Hye-Shik Chang +# Modified Author: Dong-hee Na +# + + +class BufferedFiller: + def __init__(self, column=78): + self.column = column + self.buffered = [] + self.cline = [] + self.clen = 0 + self.count = 0 + + def write(self, *data): + for s in data: + if len(s) > self.column: + raise ValueError("token is too long") + if len(s) + self.clen > self.column: + self.flush() + self.clen += len(s) + self.cline.append(s) + self.count += 1 + + def flush(self): + if not self.cline: + return + self.buffered.append(''.join(self.cline)) + self.clen = 0 + del self.cline[:] + + def printout(self, fp): + self.flush() + for l in self.buffered: + fp.write(f'{l}\n') + del self.buffered[:] + + def __len__(self): + return self.count + + +class DecodeMapWriter: + filler_class = BufferedFiller + + def __init__(self, fp, prefix, decode_map): + self.fp = fp + self.prefix = prefix + self.decode_map = decode_map + self.filler = self.filler_class() + + def update_decode_map(self, c1range, c2range, onlymask=(), wide=0): + c2values = range(c2range[0], c2range[1] + 1) + + for c1 in range(c1range[0], c1range[1] + 1): + if c1 not in self.decode_map or (onlymask and c1 not in onlymask): + continue + c2map = self.decode_map[c1] + rc2values = [n for n in c2values if n in c2map] + if not rc2values: + continue + + c2map[self.prefix] = True + c2map['min'] = rc2values[0] + c2map['max'] = rc2values[-1] + c2map['midx'] = len(self.filler) + + for v in range(rc2values[0], rc2values[-1] + 1): + if v in c2map: + self.filler.write('%d,' % c2map[v]) + else: + self.filler.write('U,') + + def generate(self, wide=False): + if not wide: + self.fp.write(f"static const ucs2_t __{self.prefix}_decmap[{len(self.filler)}] = {{\n") + else: + self.fp.write(f"static const Py_UCS4 __{self.prefix}_decmap[{len(self.filler)}] = {{\n") + + self.filler.printout(self.fp) + self.fp.write("};\n\n") + + if not wide: + self.fp.write(f"static const struct dbcs_index {self.prefix}_decmap[256] = {{\n") + else: + self.fp.write(f"static const struct widedbcs_index {self.prefix}_decmap[256] = {{\n") + + for i in range(256): + if i in self.decode_map and self.prefix in self.decode_map[i]: + m = self.decode_map + prefix = self.prefix + else: + self.filler.write("{", "0,", "0,", "0", "},") + continue + + self.filler.write("{", "__%s_decmap" % prefix, "+", "%d" % m[i]['midx'], + ",", "%d," % m[i]['min'], "%d" % m[i]['max'], "},") + self.filler.printout(self.fp) + self.fp.write("};\n\n") + + +class EncodeMapWriter: + filler_class = BufferedFiller + elemtype = 'DBCHAR' + indextype = 'struct unim_index' + + def __init__(self, fp, prefix, encode_map): + self.fp = fp + self.prefix = prefix + self.encode_map = encode_map + self.filler = self.filler_class() + + def generate(self): + self.buildmap() + self.printmap() + + def buildmap(self): + for c1 in range(0, 256): + if c1 not in self.encode_map: + continue + c2map = self.encode_map[c1] + rc2values = [k for k in c2map.keys()] + rc2values.sort() + if not rc2values: + continue + + c2map[self.prefix] = True + c2map['min'] = rc2values[0] + c2map['max'] = rc2values[-1] + c2map['midx'] = len(self.filler) + + for v in range(rc2values[0], rc2values[-1] + 1): + if v not in c2map: + self.write_nochar() + elif isinstance(c2map[v], int): + self.write_char(c2map[v]) + elif isinstance(c2map[v], tuple): + self.write_multic(c2map[v]) + else: + raise ValueError + + def write_nochar(self): + self.filler.write('N,') + + def write_multic(self, point): + self.filler.write('M,') + + def write_char(self, point): + self.filler.write(str(point) + ',') + + def printmap(self): + self.fp.write(f"static const {self.elemtype} __{self.prefix}_encmap[{len(self.filler)}] = {{\n") + self.filler.printout(self.fp) + self.fp.write("};\n\n") + self.fp.write(f"static const {self.indextype} {self.prefix}_encmap[256] = {{\n") + + for i in range(256): + if i in self.encode_map and self.prefix in self.encode_map[i]: + self.filler.write("{", "__%s_encmap" % self.prefix, "+", + "%d" % self.encode_map[i]['midx'], ",", + "%d," % self.encode_map[i]['min'], + "%d" % self.encode_map[i]['max'], "},") + else: + self.filler.write("{", "0,", "0,", "0", "},") + continue + self.filler.printout(self.fp) + self.fp.write("};\n\n") + + +def open_mapping_file(path, source): + try: + f = open(path) + except IOError: + raise SystemExit(f'{source} is needed') + return f + + +def print_autogen(fo, source): + fo.write(f'// AUTO-GENERATED FILE FROM {source}: DO NOT EDIT\n') + + +def loadmap(fo, natcol=0, unicol=1, sbcs=0): + print("Loading from", fo) + fo.seek(0, 0) + decmap = {} + for line in fo: + line = line.split('#', 1)[0].strip() + if not line or len(line.split()) < 2: + continue + + row = [eval(e) for e in line.split()] + loc, uni = row[natcol], row[unicol] + if loc >= 0x100 or sbcs: + decmap.setdefault((loc >> 8), {}) + decmap[(loc >> 8)][(loc & 0xff)] = uni + + return decmap diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py index 5b9427ac..810b285d 100644 --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -26,12 +26,14 @@ # written by Fredrik Lundh (fredrik@pythonware.com) # +import dataclasses import os import sys import zipfile -from textwrap import dedent from functools import partial +from textwrap import dedent +from typing import Iterator, List, Optional, Set, Tuple SCRIPT = sys.argv[0] VERSION = "3.3" @@ -42,7 +44,7 @@ VERSION = "3.3" # * Doc/library/stdtypes.rst, and # * Doc/library/unicodedata.rst # * Doc/reference/lexical_analysis.rst (two occurrences) -UNIDATA_VERSION = "12.1.0" +UNIDATA_VERSION = "13.0.0" UNICODE_DATA = "UnicodeData%s.txt" COMPOSITION_EXCLUSIONS = "CompositionExclusions%s.txt" EASTASIAN_WIDTH = "EastAsianWidth%s.txt" @@ -98,13 +100,14 @@ EXTENDED_CASE_MASK = 0x4000 # these ranges need to match unicodedata.c:is_unified_ideograph cjk_ranges = [ - ('3400', '4DB5'), - ('4E00', '9FEF'), - ('20000', '2A6D6'), + ('3400', '4DBF'), + ('4E00', '9FFC'), + ('20000', '2A6DD'), ('2A700', '2B734'), ('2B740', '2B81D'), ('2B820', '2CEA1'), ('2CEB0', '2EBE0'), + ('30000', '3134A'), ] @@ -147,12 +150,12 @@ def makeunicodedata(unicode, trace): record = unicode.table[char] if record: # extract database properties - category = CATEGORY_NAMES.index(record[2]) - combining = int(record[3]) - bidirectional = BIDIRECTIONAL_NAMES.index(record[4]) - mirrored = record[9] == "Y" - eastasianwidth = EASTASIANWIDTH_NAMES.index(record[15]) - normalizationquickcheck = record[17] + category = CATEGORY_NAMES.index(record.general_category) + combining = int(record.canonical_combining_class) + bidirectional = BIDIRECTIONAL_NAMES.index(record.bidi_class) + mirrored = record.bidi_mirrored == "Y" + eastasianwidth = EASTASIANWIDTH_NAMES.index(record.east_asian_width) + normalizationquickcheck = record.quick_check item = ( category, combining, bidirectional, mirrored, eastasianwidth, normalizationquickcheck @@ -178,8 +181,8 @@ def makeunicodedata(unicode, trace): for char in unicode.chars: record = unicode.table[char] if record: - if record[5]: - decomp = record[5].split() + if record.decomposition_type: + decomp = record.decomposition_type.split() if len(decomp) > 19: raise Exception("character %x has a decomposition too large for nfd_nfkd" % char) # prefix @@ -199,7 +202,7 @@ def makeunicodedata(unicode, trace): # Collect NFC pairs if not prefix and len(decomp) == 3 and \ char not in unicode.exclusions and \ - unicode.table[decomp[1]][3] == "0": + unicode.table[decomp[1]].canonical_combining_class == "0": p, l, r = decomp comp_first[l] = 1 comp_last[r] = 1 @@ -403,9 +406,9 @@ def makeunicodetype(unicode, trace): record = unicode.table[char] if record: # extract database properties - category = record[2] - bidirectional = record[4] - properties = record[16] + category = record.general_category + bidirectional = record.bidi_class + properties = record.binary_properties flags = 0 if category in ["Lm", "Lt", "Lu", "Ll", "Lo"]: flags |= ALPHA_MASK @@ -433,16 +436,16 @@ def makeunicodetype(unicode, trace): flags |= CASE_IGNORABLE_MASK sc = unicode.special_casing.get(char) cf = unicode.case_folding.get(char, [char]) - if record[12]: - upper = int(record[12], 16) + if record.simple_uppercase_mapping: + upper = int(record.simple_uppercase_mapping, 16) else: upper = char - if record[13]: - lower = int(record[13], 16) + if record.simple_lowercase_mapping: + lower = int(record.simple_lowercase_mapping, 16) else: lower = char - if record[14]: - title = int(record[14], 16) + if record.simple_titlecase_mapping: + title = int(record.simple_titlecase_mapping, 16) else: title = upper if sc is None and cf != [lower]: @@ -479,16 +482,16 @@ def makeunicodetype(unicode, trace): extra_casing.extend(sc[1]) # decimal digit, integer digit decimal = 0 - if record[6]: + if record.decomposition_mapping: flags |= DECIMAL_MASK - decimal = int(record[6]) + decimal = int(record.decomposition_mapping) digit = 0 - if record[7]: + if record.numeric_type: flags |= DIGIT_MASK - digit = int(record[7]) - if record[8]: + digit = int(record.numeric_type) + if record.numeric_value: flags |= NUMERIC_MASK - numeric.setdefault(record[8], []).append(char) + numeric.setdefault(record.numeric_value, []).append(char) item = ( upper, lower, title, decimal, digit, flags ) @@ -608,7 +611,7 @@ def makeunicodename(unicode, trace): for char in unicode.chars: record = unicode.table[char] if record: - name = record[1].strip() + name = record.name.strip() if name and name[0] != "<": names[char] = name + chr(0) @@ -718,7 +721,7 @@ def makeunicodename(unicode, trace): for char in unicode.chars: record = unicode.table[char] if record: - name = record[1].strip() + name = record.name.strip() if name and name[0] != "<": data.append((name, char)) @@ -818,31 +821,27 @@ def merge_old_version(version, new, old): continue # check characters that differ if old.table[i] != new.table[i]: - for k in range(len(old.table[i])): - if old.table[i][k] != new.table[i][k]: - value = old.table[i][k] + for k, field in enumerate(dataclasses.fields(UcdRecord)): + value = getattr(old.table[i], field.name) + new_value = getattr(new.table[i], field.name) + if value != new_value: if k == 1 and i in PUA_15: # the name is not set in the old.table, but in the # new.table we are using it for aliases and named seq assert value == '' elif k == 2: - #print "CATEGORY",hex(i), old.table[i][k], new.table[i][k] category_changes[i] = CATEGORY_NAMES.index(value) elif k == 4: - #print "BIDIR",hex(i), old.table[i][k], new.table[i][k] bidir_changes[i] = BIDIRECTIONAL_NAMES.index(value) elif k == 5: - #print "DECOMP",hex(i), old.table[i][k], new.table[i][k] # We assume that all normalization changes are in 1:1 mappings assert " " not in value normalization_changes.append((i, value)) elif k == 6: - #print "DECIMAL",hex(i), old.table[i][k], new.table[i][k] # we only support changes where the old value is a single digit assert value in "0123456789" decimal_changes[i] = int(value) elif k == 8: - # print "NUMERIC",hex(i), `old.table[i][k]`, new.table[i][k] # Since 0 encodes "no change", the old value is better not 0 if not value: numeric_changes[i] = -1 @@ -886,15 +885,18 @@ def merge_old_version(version, new, old): normalization_changes)) +DATA_DIR = os.path.join('Tools', 'unicode', 'data') + def open_data(template, version): - local = template % ('-'+version,) + local = os.path.join(DATA_DIR, template % ('-'+version,)) if not os.path.exists(local): import urllib.request if version == '3.2.0': # irregular url structure - url = 'http://www.unicode.org/Public/3.2-Update/' + local + url = ('https://www.unicode.org/Public/3.2-Update/'+template) % ('-'+version,) else: - url = ('http://www.unicode.org/Public/%s/ucd/'+template) % (version, '') + url = ('https://www.unicode.org/Public/%s/ucd/'+template) % (version, '') + os.makedirs(DATA_DIR, exist_ok=True) urllib.request.urlretrieve(url, filename=local) if local.endswith('.txt'): return open(local, encoding='utf-8') @@ -903,6 +905,90 @@ def open_data(template, version): return open(local, 'rb') +def expand_range(char_range: str) -> Iterator[int]: + ''' + Parses ranges of code points, as described in UAX #44: + https://www.unicode.org/reports/tr44/#Code_Point_Ranges + ''' + if '..' in char_range: + first, last = [int(c, 16) for c in char_range.split('..')] + else: + first = last = int(char_range, 16) + for char in range(first, last+1): + yield char + + +class UcdFile: + ''' + A file in the standard format of the UCD. + + See: https://www.unicode.org/reports/tr44/#Format_Conventions + + Note that, as described there, the Unihan data files have their + own separate format. + ''' + + def __init__(self, template: str, version: str) -> None: + self.template = template + self.version = version + + def records(self) -> Iterator[List[str]]: + with open_data(self.template, self.version) as file: + for line in file: + line = line.split('#', 1)[0].strip() + if not line: + continue + yield [field.strip() for field in line.split(';')] + + def __iter__(self) -> Iterator[List[str]]: + return self.records() + + def expanded(self) -> Iterator[Tuple[int, List[str]]]: + for record in self.records(): + char_range, rest = record[0], record[1:] + for char in expand_range(char_range): + yield char, rest + + +@dataclasses.dataclass +class UcdRecord: + # 15 fields from UnicodeData.txt . See: + # https://www.unicode.org/reports/tr44/#UnicodeData.txt + codepoint: str + name: str + general_category: str + canonical_combining_class: str + bidi_class: str + decomposition_type: str + decomposition_mapping: str + numeric_type: str + numeric_value: str + bidi_mirrored: str + unicode_1_name: str # obsolete + iso_comment: str # obsolete + simple_uppercase_mapping: str + simple_lowercase_mapping: str + simple_titlecase_mapping: str + + # https://www.unicode.org/reports/tr44/#EastAsianWidth.txt + east_asian_width: Optional[str] + + # Binary properties, as a set of those that are true. + # Taken from multiple files: + # https://www.unicode.org/reports/tr44/#DerivedCoreProperties.txt + # https://www.unicode.org/reports/tr44/#LineBreak.txt + binary_properties: Set[str] + + # The Quick_Check properties related to normalization: + # https://www.unicode.org/reports/tr44/#Decompositions_and_Normalization + # We store them as a bitmask. + quick_check: int + + +def from_row(row: List[str]) -> UcdRecord: + return UcdRecord(*row, None, set(), 0) + + # -------------------------------------------------------------------- # the following support code is taken from the unidb utilities # Copyright (c) 1999-2000 by Secret Labs AB @@ -910,50 +996,38 @@ def open_data(template, version): # load a unicode-data file from disk class UnicodeData: - # Record structure: - # [ID, name, category, combining, bidi, decomp, (6) - # decimal, digit, numeric, bidi-mirrored, Unicode-1-name, (11) - # ISO-comment, uppercase, lowercase, titlecase, ea-width, (16) - # derived-props] (17) - - def __init__(self, version, - linebreakprops=False, - expand=1, - cjk_check=True): + # table: List[Optional[UcdRecord]] # index is codepoint; None means unassigned + + def __init__(self, version, cjk_check=True): self.changed = [] table = [None] * 0x110000 - with open_data(UNICODE_DATA, version) as file: - while 1: - s = file.readline() - if not s: - break - s = s.strip().split(";") - char = int(s[0], 16) - table[char] = s + for s in UcdFile(UNICODE_DATA, version): + char = int(s[0], 16) + table[char] = from_row(s) cjk_ranges_found = [] # expand first-last ranges - if expand: - field = None - for i in range(0, 0x110000): - s = table[i] - if s: - if s[1][-6:] == "First>": - s[1] = "" - field = s - elif s[1][-5:] == "Last>": - if s[1].startswith("": + s.name = "" + field = dataclasses.astuple(s)[:15] + elif s.name[-5:] == "Last>": + if s.name.startswith(">quickcheck_shift)&3 - quickchecks[char] |= quickcheck + for s in UcdFile(DERIVEDNORMALIZATION_PROPS, version): + if len(s) < 2 or s[1] not in qc_order: + continue + quickcheck = 'MN'.index(s[2]) + 1 # Maybe or No + quickcheck_shift = qc_order.index(s[1])*2 + quickcheck <<= quickcheck_shift + for char in expand_range(s[0]): + assert not (quickchecks[char]>>quickcheck_shift)&3 + quickchecks[char] |= quickcheck for i in range(0, 0x110000): if table[i] is not None: - table[i].append(quickchecks[i]) + table[i].quick_check = quickchecks[i] with open_data(UNIHAN, version) as file: zip = zipfile.ZipFile(file) @@ -1121,35 +1133,27 @@ class UnicodeData: i = int(code[2:], 16) # Patch the numeric field if table[i] is not None: - table[i][8] = value + table[i].numeric_value = value + sc = self.special_casing = {} - with open_data(SPECIAL_CASING, version) as file: - for s in file: - s = s[:-1].split('#', 1)[0] - if not s: - continue - data = s.split("; ") - if data[4]: - # We ignore all conditionals (since they depend on - # languages) except for one, which is hardcoded. See - # handle_capital_sigma in unicodeobject.c. - continue - c = int(data[0], 16) - lower = [int(char, 16) for char in data[1].split()] - title = [int(char, 16) for char in data[2].split()] - upper = [int(char, 16) for char in data[3].split()] - sc[c] = (lower, title, upper) + for data in UcdFile(SPECIAL_CASING, version): + if data[4]: + # We ignore all conditionals (since they depend on + # languages) except for one, which is hardcoded. See + # handle_capital_sigma in unicodeobject.c. + continue + c = int(data[0], 16) + lower = [int(char, 16) for char in data[1].split()] + title = [int(char, 16) for char in data[2].split()] + upper = [int(char, 16) for char in data[3].split()] + sc[c] = (lower, title, upper) + cf = self.case_folding = {} if version != '3.2.0': - with open_data(CASE_FOLDING, version) as file: - for s in file: - s = s[:-1].split('#', 1)[0] - if not s: - continue - data = s.split("; ") - if data[1] in "CF": - c = int(data[0], 16) - cf[c] = [int(char, 16) for char in data[2].split()] + for data in UcdFile(CASE_FOLDING, version): + if data[1] in "CF": + c = int(data[0], 16) + cf[c] = [int(char, 16) for char in data[2].split()] def uselatin1(self): # restrict character range to ISO Latin 1 diff --git a/Tools/unicode/mkstringprep.py b/Tools/unicode/mkstringprep.py index ead020c3..42718838 100644 --- a/Tools/unicode/mkstringprep.py +++ b/Tools/unicode/mkstringprep.py @@ -1,9 +1,6 @@ -import re, sys +import re from unicodedata import ucd_3_2_0 as unicodedata -if sys.maxunicode == 65535: - raise RuntimeError("need UCS-4 Python") - def gen_category(cats): for i in range(0, 0x110000): if unicodedata.category(chr(i)) in cats: diff --git a/Tools/unicode/python-mappings/GB2312.TXT b/Tools/unicode/python-mappings/GB2312.TXT new file mode 100644 index 00000000..334b4cdb --- /dev/null +++ b/Tools/unicode/python-mappings/GB2312.TXT @@ -0,0 +1,7515 @@ +# +# Name: GB2312-80 to Unicode table (complete, hex format) +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 October 8 +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# +# This table contains one set of mappings from GB2312-80 into Unicode. +# Note that these data are *possible* mappings only and may not be the +# same as those used by actual products, nor may they be the best suited +# for all uses. For more information on the mappings between various code +# pages incorporating the repertoire of GB2312-80 and Unicode, consult the +# VENDORS mapping data. Normative information on the mapping between +# GB2312-80 and Unicode may be found in the Unihan.txt file in the +# latest Unicode Character Database. +# +# If you have carefully considered the fact that the mappings in +# this table are only one possible set of mappings between GB2312-80 and +# Unicode and have no normative status, but still feel that you +# have located an error in the table that requires fixing, you may +# report any such error to errata@unicode.org. +# +# +# Format: Three tab-separated columns +# Column #1 is the GB2312 code (in hex as 0xXXXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# The official names for Unicode characters U+4E00 +# to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX", +# where XXXX is the code point. Including all these +# names in this file increases its size substantially +# and needlessly. The token "" is used for the +# name of these characters. If necessary, it can be +# expanded algorithmically by a parser or editor. +# +# The entries are in GB2312 order +# +# The following algorithms can be used to change the hex form +# of GB2312 to other standard forms: +# +# To change hex to EUC form, add 0x8080 +# To change hex to kuten form, first subtract 0x2020. Then +# the high and low bytes correspond to the ku and ten of +# the kuten form. For example, 0x2121 -> 0x0101 -> 0101; +# 0x777E -> 0x575E -> 8794 +# +# Version history +# 1.0 version updates 0.0d2 version by correcting mapping for 0x212C +# from U+2225 to U+2016. +# +# +0x2121 0x3000 # IDEOGRAPHIC SPACE +0x2122 0x3001 # IDEOGRAPHIC COMMA +0x2123 0x3002 # IDEOGRAPHIC FULL STOP +0x2124 0x30FB # KATAKANA MIDDLE DOT +0x2125 0x02C9 # MODIFIER LETTER MACRON (Mandarin Chinese first tone) +0x2126 0x02C7 # CARON (Mandarin Chinese third tone) +0x2127 0x00A8 # DIAERESIS +0x2128 0x3003 # DITTO MARK +0x2129 0x3005 # IDEOGRAPHIC ITERATION MARK +0x212A 0x2015 # HORIZONTAL BAR +0x212B 0xFF5E # FULLWIDTH TILDE +0x212C 0x2016 # DOUBLE VERTICAL LINE +0x212D 0x2026 # HORIZONTAL ELLIPSIS +0x212E 0x2018 # LEFT SINGLE QUOTATION MARK +0x212F 0x2019 # RIGHT SINGLE QUOTATION MARK +0x2130 0x201C # LEFT DOUBLE QUOTATION MARK +0x2131 0x201D # RIGHT DOUBLE QUOTATION MARK +0x2132 0x3014 # LEFT TORTOISE SHELL BRACKET +0x2133 0x3015 # RIGHT TORTOISE SHELL BRACKET +0x2134 0x3008 # LEFT ANGLE BRACKET +0x2135 0x3009 # RIGHT ANGLE BRACKET +0x2136 0x300A # LEFT DOUBLE ANGLE BRACKET +0x2137 0x300B # RIGHT DOUBLE ANGLE BRACKET +0x2138 0x300C # LEFT CORNER BRACKET +0x2139 0x300D # RIGHT CORNER BRACKET +0x213A 0x300E # LEFT WHITE CORNER BRACKET +0x213B 0x300F # RIGHT WHITE CORNER BRACKET +0x213C 0x3016 # LEFT WHITE LENTICULAR BRACKET +0x213D 0x3017 # RIGHT WHITE LENTICULAR BRACKET +0x213E 0x3010 # LEFT BLACK LENTICULAR BRACKET +0x213F 0x3011 # RIGHT BLACK LENTICULAR BRACKET +0x2140 0x00B1 # PLUS-MINUS SIGN +0x2141 0x00D7 # MULTIPLICATION SIGN +0x2142 0x00F7 # DIVISION SIGN +0x2143 0x2236 # RATIO +0x2144 0x2227 # LOGICAL AND +0x2145 0x2228 # LOGICAL OR +0x2146 0x2211 # N-ARY SUMMATION +0x2147 0x220F # N-ARY PRODUCT +0x2148 0x222A # UNION +0x2149 0x2229 # INTERSECTION +0x214A 0x2208 # ELEMENT OF +0x214B 0x2237 # PROPORTION +0x214C 0x221A # SQUARE ROOT +0x214D 0x22A5 # UP TACK +0x214E 0x2225 # PARALLEL TO +0x214F 0x2220 # ANGLE +0x2150 0x2312 # ARC +0x2151 0x2299 # CIRCLED DOT OPERATOR +0x2152 0x222B # INTEGRAL +0x2153 0x222E # CONTOUR INTEGRAL +0x2154 0x2261 # IDENTICAL TO +0x2155 0x224C # ALL EQUAL TO +0x2156 0x2248 # ALMOST EQUAL TO +0x2157 0x223D # REVERSED TILDE +0x2158 0x221D # PROPORTIONAL TO +0x2159 0x2260 # NOT EQUAL TO +0x215A 0x226E # NOT LESS-THAN +0x215B 0x226F # NOT GREATER-THAN +0x215C 0x2264 # LESS-THAN OR EQUAL TO +0x215D 0x2265 # GREATER-THAN OR EQUAL TO +0x215E 0x221E # INFINITY +0x215F 0x2235 # BECAUSE +0x2160 0x2234 # THEREFORE +0x2161 0x2642 # MALE SIGN +0x2162 0x2640 # FEMALE SIGN +0x2163 0x00B0 # DEGREE SIGN +0x2164 0x2032 # PRIME +0x2165 0x2033 # DOUBLE PRIME +0x2166 0x2103 # DEGREE CELSIUS +0x2167 0xFF04 # FULLWIDTH DOLLAR SIGN +0x2168 0x00A4 # CURRENCY SIGN +0x2169 0xFFE0 # FULLWIDTH CENT SIGN +0x216A 0xFFE1 # FULLWIDTH POUND SIGN +0x216B 0x2030 # PER MILLE SIGN +0x216C 0x00A7 # SECTION SIGN +0x216D 0x2116 # NUMERO SIGN +0x216E 0x2606 # WHITE STAR +0x216F 0x2605 # BLACK STAR +0x2170 0x25CB # WHITE CIRCLE +0x2171 0x25CF # BLACK CIRCLE +0x2172 0x25CE # BULLSEYE +0x2173 0x25C7 # WHITE DIAMOND +0x2174 0x25C6 # BLACK DIAMOND +0x2175 0x25A1 # WHITE SQUARE +0x2176 0x25A0 # BLACK SQUARE +0x2177 0x25B3 # WHITE UP-POINTING TRIANGLE +0x2178 0x25B2 # BLACK UP-POINTING TRIANGLE +0x2179 0x203B # REFERENCE MARK +0x217A 0x2192 # RIGHTWARDS ARROW +0x217B 0x2190 # LEFTWARDS ARROW +0x217C 0x2191 # UPWARDS ARROW +0x217D 0x2193 # DOWNWARDS ARROW +0x217E 0x3013 # GETA MARK +0x2231 0x2488 # DIGIT ONE FULL STOP +0x2232 0x2489 # DIGIT TWO FULL STOP +0x2233 0x248A # DIGIT THREE FULL STOP +0x2234 0x248B # DIGIT FOUR FULL STOP +0x2235 0x248C # DIGIT FIVE FULL STOP +0x2236 0x248D # DIGIT SIX FULL STOP +0x2237 0x248E # DIGIT SEVEN FULL STOP +0x2238 0x248F # DIGIT EIGHT FULL STOP +0x2239 0x2490 # DIGIT NINE FULL STOP +0x223A 0x2491 # NUMBER TEN FULL STOP +0x223B 0x2492 # NUMBER ELEVEN FULL STOP +0x223C 0x2493 # NUMBER TWELVE FULL STOP +0x223D 0x2494 # NUMBER THIRTEEN FULL STOP +0x223E 0x2495 # NUMBER FOURTEEN FULL STOP +0x223F 0x2496 # NUMBER FIFTEEN FULL STOP +0x2240 0x2497 # NUMBER SIXTEEN FULL STOP +0x2241 0x2498 # NUMBER SEVENTEEN FULL STOP +0x2242 0x2499 # NUMBER EIGHTEEN FULL STOP +0x2243 0x249A # NUMBER NINETEEN FULL STOP +0x2244 0x249B # NUMBER TWENTY FULL STOP +0x2245 0x2474 # PARENTHESIZED DIGIT ONE +0x2246 0x2475 # PARENTHESIZED DIGIT TWO +0x2247 0x2476 # PARENTHESIZED DIGIT THREE +0x2248 0x2477 # PARENTHESIZED DIGIT FOUR +0x2249 0x2478 # PARENTHESIZED DIGIT FIVE +0x224A 0x2479 # PARENTHESIZED DIGIT SIX +0x224B 0x247A # PARENTHESIZED DIGIT SEVEN +0x224C 0x247B # PARENTHESIZED DIGIT EIGHT +0x224D 0x247C # PARENTHESIZED DIGIT NINE +0x224E 0x247D # PARENTHESIZED NUMBER TEN +0x224F 0x247E # PARENTHESIZED NUMBER ELEVEN +0x2250 0x247F # PARENTHESIZED NUMBER TWELVE +0x2251 0x2480 # PARENTHESIZED NUMBER THIRTEEN +0x2252 0x2481 # PARENTHESIZED NUMBER FOURTEEN +0x2253 0x2482 # PARENTHESIZED NUMBER FIFTEEN +0x2254 0x2483 # PARENTHESIZED NUMBER SIXTEEN +0x2255 0x2484 # PARENTHESIZED NUMBER SEVENTEEN +0x2256 0x2485 # PARENTHESIZED NUMBER EIGHTEEN +0x2257 0x2486 # PARENTHESIZED NUMBER NINETEEN +0x2258 0x2487 # PARENTHESIZED NUMBER TWENTY +0x2259 0x2460 # CIRCLED DIGIT ONE +0x225A 0x2461 # CIRCLED DIGIT TWO +0x225B 0x2462 # CIRCLED DIGIT THREE +0x225C 0x2463 # CIRCLED DIGIT FOUR +0x225D 0x2464 # CIRCLED DIGIT FIVE +0x225E 0x2465 # CIRCLED DIGIT SIX +0x225F 0x2466 # CIRCLED DIGIT SEVEN +0x2260 0x2467 # CIRCLED DIGIT EIGHT +0x2261 0x2468 # CIRCLED DIGIT NINE +0x2262 0x2469 # CIRCLED NUMBER TEN +0x2265 0x3220 # PARENTHESIZED IDEOGRAPH ONE +0x2266 0x3221 # PARENTHESIZED IDEOGRAPH TWO +0x2267 0x3222 # PARENTHESIZED IDEOGRAPH THREE +0x2268 0x3223 # PARENTHESIZED IDEOGRAPH FOUR +0x2269 0x3224 # PARENTHESIZED IDEOGRAPH FIVE +0x226A 0x3225 # PARENTHESIZED IDEOGRAPH SIX +0x226B 0x3226 # PARENTHESIZED IDEOGRAPH SEVEN +0x226C 0x3227 # PARENTHESIZED IDEOGRAPH EIGHT +0x226D 0x3228 # PARENTHESIZED IDEOGRAPH NINE +0x226E 0x3229 # PARENTHESIZED IDEOGRAPH TEN +0x2271 0x2160 # ROMAN NUMERAL ONE +0x2272 0x2161 # ROMAN NUMERAL TWO +0x2273 0x2162 # ROMAN NUMERAL THREE +0x2274 0x2163 # ROMAN NUMERAL FOUR +0x2275 0x2164 # ROMAN NUMERAL FIVE +0x2276 0x2165 # ROMAN NUMERAL SIX +0x2277 0x2166 # ROMAN NUMERAL SEVEN +0x2278 0x2167 # ROMAN NUMERAL EIGHT +0x2279 0x2168 # ROMAN NUMERAL NINE +0x227A 0x2169 # ROMAN NUMERAL TEN +0x227B 0x216A # ROMAN NUMERAL ELEVEN +0x227C 0x216B # ROMAN NUMERAL TWELVE +0x2321 0xFF01 # FULLWIDTH EXCLAMATION MARK +0x2322 0xFF02 # FULLWIDTH QUOTATION MARK +0x2323 0xFF03 # FULLWIDTH NUMBER SIGN +0x2324 0xFFE5 # FULLWIDTH YEN SIGN +0x2325 0xFF05 # FULLWIDTH PERCENT SIGN +0x2326 0xFF06 # FULLWIDTH AMPERSAND +0x2327 0xFF07 # FULLWIDTH APOSTROPHE +0x2328 0xFF08 # FULLWIDTH LEFT PARENTHESIS +0x2329 0xFF09 # FULLWIDTH RIGHT PARENTHESIS +0x232A 0xFF0A # FULLWIDTH ASTERISK +0x232B 0xFF0B # FULLWIDTH PLUS SIGN +0x232C 0xFF0C # FULLWIDTH COMMA +0x232D 0xFF0D # FULLWIDTH HYPHEN-MINUS +0x232E 0xFF0E # FULLWIDTH FULL STOP +0x232F 0xFF0F # FULLWIDTH SOLIDUS +0x2330 0xFF10 # FULLWIDTH DIGIT ZERO +0x2331 0xFF11 # FULLWIDTH DIGIT ONE +0x2332 0xFF12 # FULLWIDTH DIGIT TWO +0x2333 0xFF13 # FULLWIDTH DIGIT THREE +0x2334 0xFF14 # FULLWIDTH DIGIT FOUR +0x2335 0xFF15 # FULLWIDTH DIGIT FIVE +0x2336 0xFF16 # FULLWIDTH DIGIT SIX +0x2337 0xFF17 # FULLWIDTH DIGIT SEVEN +0x2338 0xFF18 # FULLWIDTH DIGIT EIGHT +0x2339 0xFF19 # FULLWIDTH DIGIT NINE +0x233A 0xFF1A # FULLWIDTH COLON +0x233B 0xFF1B # FULLWIDTH SEMICOLON +0x233C 0xFF1C # FULLWIDTH LESS-THAN SIGN +0x233D 0xFF1D # FULLWIDTH EQUALS SIGN +0x233E 0xFF1E # FULLWIDTH GREATER-THAN SIGN +0x233F 0xFF1F # FULLWIDTH QUESTION MARK +0x2340 0xFF20 # FULLWIDTH COMMERCIAL AT +0x2341 0xFF21 # FULLWIDTH LATIN CAPITAL LETTER A +0x2342 0xFF22 # FULLWIDTH LATIN CAPITAL LETTER B +0x2343 0xFF23 # FULLWIDTH LATIN CAPITAL LETTER C +0x2344 0xFF24 # FULLWIDTH LATIN CAPITAL LETTER D +0x2345 0xFF25 # FULLWIDTH LATIN CAPITAL LETTER E +0x2346 0xFF26 # FULLWIDTH LATIN CAPITAL LETTER F +0x2347 0xFF27 # FULLWIDTH LATIN CAPITAL LETTER G +0x2348 0xFF28 # FULLWIDTH LATIN CAPITAL LETTER H +0x2349 0xFF29 # FULLWIDTH LATIN CAPITAL LETTER I +0x234A 0xFF2A # FULLWIDTH LATIN CAPITAL LETTER J +0x234B 0xFF2B # FULLWIDTH LATIN CAPITAL LETTER K +0x234C 0xFF2C # FULLWIDTH LATIN CAPITAL LETTER L +0x234D 0xFF2D # FULLWIDTH LATIN CAPITAL LETTER M +0x234E 0xFF2E # FULLWIDTH LATIN CAPITAL LETTER N +0x234F 0xFF2F # FULLWIDTH LATIN CAPITAL LETTER O +0x2350 0xFF30 # FULLWIDTH LATIN CAPITAL LETTER P +0x2351 0xFF31 # FULLWIDTH LATIN CAPITAL LETTER Q +0x2352 0xFF32 # FULLWIDTH LATIN CAPITAL LETTER R +0x2353 0xFF33 # FULLWIDTH LATIN CAPITAL LETTER S +0x2354 0xFF34 # FULLWIDTH LATIN CAPITAL LETTER T +0x2355 0xFF35 # FULLWIDTH LATIN CAPITAL LETTER U +0x2356 0xFF36 # FULLWIDTH LATIN CAPITAL LETTER V +0x2357 0xFF37 # FULLWIDTH LATIN CAPITAL LETTER W +0x2358 0xFF38 # FULLWIDTH LATIN CAPITAL LETTER X +0x2359 0xFF39 # FULLWIDTH LATIN CAPITAL LETTER Y +0x235A 0xFF3A # FULLWIDTH LATIN CAPITAL LETTER Z +0x235B 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET +0x235C 0xFF3C # FULLWIDTH REVERSE SOLIDUS +0x235D 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET +0x235E 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT +0x235F 0xFF3F # FULLWIDTH LOW LINE +0x2360 0xFF40 # FULLWIDTH GRAVE ACCENT +0x2361 0xFF41 # FULLWIDTH LATIN SMALL LETTER A +0x2362 0xFF42 # FULLWIDTH LATIN SMALL LETTER B +0x2363 0xFF43 # FULLWIDTH LATIN SMALL LETTER C +0x2364 0xFF44 # FULLWIDTH LATIN SMALL LETTER D +0x2365 0xFF45 # FULLWIDTH LATIN SMALL LETTER E +0x2366 0xFF46 # FULLWIDTH LATIN SMALL LETTER F +0x2367 0xFF47 # FULLWIDTH LATIN SMALL LETTER G +0x2368 0xFF48 # FULLWIDTH LATIN SMALL LETTER H +0x2369 0xFF49 # FULLWIDTH LATIN SMALL LETTER I +0x236A 0xFF4A # FULLWIDTH LATIN SMALL LETTER J +0x236B 0xFF4B # FULLWIDTH LATIN SMALL LETTER K +0x236C 0xFF4C # FULLWIDTH LATIN SMALL LETTER L +0x236D 0xFF4D # FULLWIDTH LATIN SMALL LETTER M +0x236E 0xFF4E # FULLWIDTH LATIN SMALL LETTER N +0x236F 0xFF4F # FULLWIDTH LATIN SMALL LETTER O +0x2370 0xFF50 # FULLWIDTH LATIN SMALL LETTER P +0x2371 0xFF51 # FULLWIDTH LATIN SMALL LETTER Q +0x2372 0xFF52 # FULLWIDTH LATIN SMALL LETTER R +0x2373 0xFF53 # FULLWIDTH LATIN SMALL LETTER S +0x2374 0xFF54 # FULLWIDTH LATIN SMALL LETTER T +0x2375 0xFF55 # FULLWIDTH LATIN SMALL LETTER U +0x2376 0xFF56 # FULLWIDTH LATIN SMALL LETTER V +0x2377 0xFF57 # FULLWIDTH LATIN SMALL LETTER W +0x2378 0xFF58 # FULLWIDTH LATIN SMALL LETTER X +0x2379 0xFF59 # FULLWIDTH LATIN SMALL LETTER Y +0x237A 0xFF5A # FULLWIDTH LATIN SMALL LETTER Z +0x237B 0xFF5B # FULLWIDTH LEFT CURLY BRACKET +0x237C 0xFF5C # FULLWIDTH VERTICAL LINE +0x237D 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET +0x237E 0xFFE3 # FULLWIDTH MACRON +0x2421 0x3041 # HIRAGANA LETTER SMALL A +0x2422 0x3042 # HIRAGANA LETTER A +0x2423 0x3043 # HIRAGANA LETTER SMALL I +0x2424 0x3044 # HIRAGANA LETTER I +0x2425 0x3045 # HIRAGANA LETTER SMALL U +0x2426 0x3046 # HIRAGANA LETTER U +0x2427 0x3047 # HIRAGANA LETTER SMALL E +0x2428 0x3048 # HIRAGANA LETTER E +0x2429 0x3049 # HIRAGANA LETTER SMALL O +0x242A 0x304A # HIRAGANA LETTER O +0x242B 0x304B # HIRAGANA LETTER KA +0x242C 0x304C # HIRAGANA LETTER GA +0x242D 0x304D # HIRAGANA LETTER KI +0x242E 0x304E # HIRAGANA LETTER GI +0x242F 0x304F # HIRAGANA LETTER KU +0x2430 0x3050 # HIRAGANA LETTER GU +0x2431 0x3051 # HIRAGANA LETTER KE +0x2432 0x3052 # HIRAGANA LETTER GE +0x2433 0x3053 # HIRAGANA LETTER KO +0x2434 0x3054 # HIRAGANA LETTER GO +0x2435 0x3055 # HIRAGANA LETTER SA +0x2436 0x3056 # HIRAGANA LETTER ZA +0x2437 0x3057 # HIRAGANA LETTER SI +0x2438 0x3058 # HIRAGANA LETTER ZI +0x2439 0x3059 # HIRAGANA LETTER SU +0x243A 0x305A # HIRAGANA LETTER ZU +0x243B 0x305B # HIRAGANA LETTER SE +0x243C 0x305C # HIRAGANA LETTER ZE +0x243D 0x305D # HIRAGANA LETTER SO +0x243E 0x305E # HIRAGANA LETTER ZO +0x243F 0x305F # HIRAGANA LETTER TA +0x2440 0x3060 # HIRAGANA LETTER DA +0x2441 0x3061 # HIRAGANA LETTER TI +0x2442 0x3062 # HIRAGANA LETTER DI +0x2443 0x3063 # HIRAGANA LETTER SMALL TU +0x2444 0x3064 # HIRAGANA LETTER TU +0x2445 0x3065 # HIRAGANA LETTER DU +0x2446 0x3066 # HIRAGANA LETTER TE +0x2447 0x3067 # HIRAGANA LETTER DE +0x2448 0x3068 # HIRAGANA LETTER TO +0x2449 0x3069 # HIRAGANA LETTER DO +0x244A 0x306A # HIRAGANA LETTER NA +0x244B 0x306B # HIRAGANA LETTER NI +0x244C 0x306C # HIRAGANA LETTER NU +0x244D 0x306D # HIRAGANA LETTER NE +0x244E 0x306E # HIRAGANA LETTER NO +0x244F 0x306F # HIRAGANA LETTER HA +0x2450 0x3070 # HIRAGANA LETTER BA +0x2451 0x3071 # HIRAGANA LETTER PA +0x2452 0x3072 # HIRAGANA LETTER HI +0x2453 0x3073 # HIRAGANA LETTER BI +0x2454 0x3074 # HIRAGANA LETTER PI +0x2455 0x3075 # HIRAGANA LETTER HU +0x2456 0x3076 # HIRAGANA LETTER BU +0x2457 0x3077 # HIRAGANA LETTER PU +0x2458 0x3078 # HIRAGANA LETTER HE +0x2459 0x3079 # HIRAGANA LETTER BE +0x245A 0x307A # HIRAGANA LETTER PE +0x245B 0x307B # HIRAGANA LETTER HO +0x245C 0x307C # HIRAGANA LETTER BO +0x245D 0x307D # HIRAGANA LETTER PO +0x245E 0x307E # HIRAGANA LETTER MA +0x245F 0x307F # HIRAGANA LETTER MI +0x2460 0x3080 # HIRAGANA LETTER MU +0x2461 0x3081 # HIRAGANA LETTER ME +0x2462 0x3082 # HIRAGANA LETTER MO +0x2463 0x3083 # HIRAGANA LETTER SMALL YA +0x2464 0x3084 # HIRAGANA LETTER YA +0x2465 0x3085 # HIRAGANA LETTER SMALL YU +0x2466 0x3086 # HIRAGANA LETTER YU +0x2467 0x3087 # HIRAGANA LETTER SMALL YO +0x2468 0x3088 # HIRAGANA LETTER YO +0x2469 0x3089 # HIRAGANA LETTER RA +0x246A 0x308A # HIRAGANA LETTER RI +0x246B 0x308B # HIRAGANA LETTER RU +0x246C 0x308C # HIRAGANA LETTER RE +0x246D 0x308D # HIRAGANA LETTER RO +0x246E 0x308E # HIRAGANA LETTER SMALL WA +0x246F 0x308F # HIRAGANA LETTER WA +0x2470 0x3090 # HIRAGANA LETTER WI +0x2471 0x3091 # HIRAGANA LETTER WE +0x2472 0x3092 # HIRAGANA LETTER WO +0x2473 0x3093 # HIRAGANA LETTER N +0x2521 0x30A1 # KATAKANA LETTER SMALL A +0x2522 0x30A2 # KATAKANA LETTER A +0x2523 0x30A3 # KATAKANA LETTER SMALL I +0x2524 0x30A4 # KATAKANA LETTER I +0x2525 0x30A5 # KATAKANA LETTER SMALL U +0x2526 0x30A6 # KATAKANA LETTER U +0x2527 0x30A7 # KATAKANA LETTER SMALL E +0x2528 0x30A8 # KATAKANA LETTER E +0x2529 0x30A9 # KATAKANA LETTER SMALL O +0x252A 0x30AA # KATAKANA LETTER O +0x252B 0x30AB # KATAKANA LETTER KA +0x252C 0x30AC # KATAKANA LETTER GA +0x252D 0x30AD # KATAKANA LETTER KI +0x252E 0x30AE # KATAKANA LETTER GI +0x252F 0x30AF # KATAKANA LETTER KU +0x2530 0x30B0 # KATAKANA LETTER GU +0x2531 0x30B1 # KATAKANA LETTER KE +0x2532 0x30B2 # KATAKANA LETTER GE +0x2533 0x30B3 # KATAKANA LETTER KO +0x2534 0x30B4 # KATAKANA LETTER GO +0x2535 0x30B5 # KATAKANA LETTER SA +0x2536 0x30B6 # KATAKANA LETTER ZA +0x2537 0x30B7 # KATAKANA LETTER SI +0x2538 0x30B8 # KATAKANA LETTER ZI +0x2539 0x30B9 # KATAKANA LETTER SU +0x253A 0x30BA # KATAKANA LETTER ZU +0x253B 0x30BB # KATAKANA LETTER SE +0x253C 0x30BC # KATAKANA LETTER ZE +0x253D 0x30BD # KATAKANA LETTER SO +0x253E 0x30BE # KATAKANA LETTER ZO +0x253F 0x30BF # KATAKANA LETTER TA +0x2540 0x30C0 # KATAKANA LETTER DA +0x2541 0x30C1 # KATAKANA LETTER TI +0x2542 0x30C2 # KATAKANA LETTER DI +0x2543 0x30C3 # KATAKANA LETTER SMALL TU +0x2544 0x30C4 # KATAKANA LETTER TU +0x2545 0x30C5 # KATAKANA LETTER DU +0x2546 0x30C6 # KATAKANA LETTER TE +0x2547 0x30C7 # KATAKANA LETTER DE +0x2548 0x30C8 # KATAKANA LETTER TO +0x2549 0x30C9 # KATAKANA LETTER DO +0x254A 0x30CA # KATAKANA LETTER NA +0x254B 0x30CB # KATAKANA LETTER NI +0x254C 0x30CC # KATAKANA LETTER NU +0x254D 0x30CD # KATAKANA LETTER NE +0x254E 0x30CE # KATAKANA LETTER NO +0x254F 0x30CF # KATAKANA LETTER HA +0x2550 0x30D0 # KATAKANA LETTER BA +0x2551 0x30D1 # KATAKANA LETTER PA +0x2552 0x30D2 # KATAKANA LETTER HI +0x2553 0x30D3 # KATAKANA LETTER BI +0x2554 0x30D4 # KATAKANA LETTER PI +0x2555 0x30D5 # KATAKANA LETTER HU +0x2556 0x30D6 # KATAKANA LETTER BU +0x2557 0x30D7 # KATAKANA LETTER PU +0x2558 0x30D8 # KATAKANA LETTER HE +0x2559 0x30D9 # KATAKANA LETTER BE +0x255A 0x30DA # KATAKANA LETTER PE +0x255B 0x30DB # KATAKANA LETTER HO +0x255C 0x30DC # KATAKANA LETTER BO +0x255D 0x30DD # KATAKANA LETTER PO +0x255E 0x30DE # KATAKANA LETTER MA +0x255F 0x30DF # KATAKANA LETTER MI +0x2560 0x30E0 # KATAKANA LETTER MU +0x2561 0x30E1 # KATAKANA LETTER ME +0x2562 0x30E2 # KATAKANA LETTER MO +0x2563 0x30E3 # KATAKANA LETTER SMALL YA +0x2564 0x30E4 # KATAKANA LETTER YA +0x2565 0x30E5 # KATAKANA LETTER SMALL YU +0x2566 0x30E6 # KATAKANA LETTER YU +0x2567 0x30E7 # KATAKANA LETTER SMALL YO +0x2568 0x30E8 # KATAKANA LETTER YO +0x2569 0x30E9 # KATAKANA LETTER RA +0x256A 0x30EA # KATAKANA LETTER RI +0x256B 0x30EB # KATAKANA LETTER RU +0x256C 0x30EC # KATAKANA LETTER RE +0x256D 0x30ED # KATAKANA LETTER RO +0x256E 0x30EE # KATAKANA LETTER SMALL WA +0x256F 0x30EF # KATAKANA LETTER WA +0x2570 0x30F0 # KATAKANA LETTER WI +0x2571 0x30F1 # KATAKANA LETTER WE +0x2572 0x30F2 # KATAKANA LETTER WO +0x2573 0x30F3 # KATAKANA LETTER N +0x2574 0x30F4 # KATAKANA LETTER VU +0x2575 0x30F5 # KATAKANA LETTER SMALL KA +0x2576 0x30F6 # KATAKANA LETTER SMALL KE +0x2621 0x0391 # GREEK CAPITAL LETTER ALPHA +0x2622 0x0392 # GREEK CAPITAL LETTER BETA +0x2623 0x0393 # GREEK CAPITAL LETTER GAMMA +0x2624 0x0394 # GREEK CAPITAL LETTER DELTA +0x2625 0x0395 # GREEK CAPITAL LETTER EPSILON +0x2626 0x0396 # GREEK CAPITAL LETTER ZETA +0x2627 0x0397 # GREEK CAPITAL LETTER ETA +0x2628 0x0398 # GREEK CAPITAL LETTER THETA +0x2629 0x0399 # GREEK CAPITAL LETTER IOTA +0x262A 0x039A # GREEK CAPITAL LETTER KAPPA +0x262B 0x039B # GREEK CAPITAL LETTER LAMDA +0x262C 0x039C # GREEK CAPITAL LETTER MU +0x262D 0x039D # GREEK CAPITAL LETTER NU +0x262E 0x039E # GREEK CAPITAL LETTER XI +0x262F 0x039F # GREEK CAPITAL LETTER OMICRON +0x2630 0x03A0 # GREEK CAPITAL LETTER PI +0x2631 0x03A1 # GREEK CAPITAL LETTER RHO +0x2632 0x03A3 # GREEK CAPITAL LETTER SIGMA +0x2633 0x03A4 # GREEK CAPITAL LETTER TAU +0x2634 0x03A5 # GREEK CAPITAL LETTER UPSILON +0x2635 0x03A6 # GREEK CAPITAL LETTER PHI +0x2636 0x03A7 # GREEK CAPITAL LETTER CHI +0x2637 0x03A8 # GREEK CAPITAL LETTER PSI +0x2638 0x03A9 # GREEK CAPITAL LETTER OMEGA +0x2641 0x03B1 # GREEK SMALL LETTER ALPHA +0x2642 0x03B2 # GREEK SMALL LETTER BETA +0x2643 0x03B3 # GREEK SMALL LETTER GAMMA +0x2644 0x03B4 # GREEK SMALL LETTER DELTA +0x2645 0x03B5 # GREEK SMALL LETTER EPSILON +0x2646 0x03B6 # GREEK SMALL LETTER ZETA +0x2647 0x03B7 # GREEK SMALL LETTER ETA +0x2648 0x03B8 # GREEK SMALL LETTER THETA +0x2649 0x03B9 # GREEK SMALL LETTER IOTA +0x264A 0x03BA # GREEK SMALL LETTER KAPPA +0x264B 0x03BB # GREEK SMALL LETTER LAMDA +0x264C 0x03BC # GREEK SMALL LETTER MU +0x264D 0x03BD # GREEK SMALL LETTER NU +0x264E 0x03BE # GREEK SMALL LETTER XI +0x264F 0x03BF # GREEK SMALL LETTER OMICRON +0x2650 0x03C0 # GREEK SMALL LETTER PI +0x2651 0x03C1 # GREEK SMALL LETTER RHO +0x2652 0x03C3 # GREEK SMALL LETTER SIGMA +0x2653 0x03C4 # GREEK SMALL LETTER TAU +0x2654 0x03C5 # GREEK SMALL LETTER UPSILON +0x2655 0x03C6 # GREEK SMALL LETTER PHI +0x2656 0x03C7 # GREEK SMALL LETTER CHI +0x2657 0x03C8 # GREEK SMALL LETTER PSI +0x2658 0x03C9 # GREEK SMALL LETTER OMEGA +0x2721 0x0410 # CYRILLIC CAPITAL LETTER A +0x2722 0x0411 # CYRILLIC CAPITAL LETTER BE +0x2723 0x0412 # CYRILLIC CAPITAL LETTER VE +0x2724 0x0413 # CYRILLIC CAPITAL LETTER GHE +0x2725 0x0414 # CYRILLIC CAPITAL LETTER DE +0x2726 0x0415 # CYRILLIC CAPITAL LETTER IE +0x2727 0x0401 # CYRILLIC CAPITAL LETTER IO +0x2728 0x0416 # CYRILLIC CAPITAL LETTER ZHE +0x2729 0x0417 # CYRILLIC CAPITAL LETTER ZE +0x272A 0x0418 # CYRILLIC CAPITAL LETTER I +0x272B 0x0419 # CYRILLIC CAPITAL LETTER SHORT I +0x272C 0x041A # CYRILLIC CAPITAL LETTER KA +0x272D 0x041B # CYRILLIC CAPITAL LETTER EL +0x272E 0x041C # CYRILLIC CAPITAL LETTER EM +0x272F 0x041D # CYRILLIC CAPITAL LETTER EN +0x2730 0x041E # CYRILLIC CAPITAL LETTER O +0x2731 0x041F # CYRILLIC CAPITAL LETTER PE +0x2732 0x0420 # CYRILLIC CAPITAL LETTER ER +0x2733 0x0421 # CYRILLIC CAPITAL LETTER ES +0x2734 0x0422 # CYRILLIC CAPITAL LETTER TE +0x2735 0x0423 # CYRILLIC CAPITAL LETTER U +0x2736 0x0424 # CYRILLIC CAPITAL LETTER EF +0x2737 0x0425 # CYRILLIC CAPITAL LETTER HA +0x2738 0x0426 # CYRILLIC CAPITAL LETTER TSE +0x2739 0x0427 # CYRILLIC CAPITAL LETTER CHE +0x273A 0x0428 # CYRILLIC CAPITAL LETTER SHA +0x273B 0x0429 # CYRILLIC CAPITAL LETTER SHCHA +0x273C 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN +0x273D 0x042B # CYRILLIC CAPITAL LETTER YERU +0x273E 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN +0x273F 0x042D # CYRILLIC CAPITAL LETTER E +0x2740 0x042E # CYRILLIC CAPITAL LETTER YU +0x2741 0x042F # CYRILLIC CAPITAL LETTER YA +0x2751 0x0430 # CYRILLIC SMALL LETTER A +0x2752 0x0431 # CYRILLIC SMALL LETTER BE +0x2753 0x0432 # CYRILLIC SMALL LETTER VE +0x2754 0x0433 # CYRILLIC SMALL LETTER GHE +0x2755 0x0434 # CYRILLIC SMALL LETTER DE +0x2756 0x0435 # CYRILLIC SMALL LETTER IE +0x2757 0x0451 # CYRILLIC SMALL LETTER IO +0x2758 0x0436 # CYRILLIC SMALL LETTER ZHE +0x2759 0x0437 # CYRILLIC SMALL LETTER ZE +0x275A 0x0438 # CYRILLIC SMALL LETTER I +0x275B 0x0439 # CYRILLIC SMALL LETTER SHORT I +0x275C 0x043A # CYRILLIC SMALL LETTER KA +0x275D 0x043B # CYRILLIC SMALL LETTER EL +0x275E 0x043C # CYRILLIC SMALL LETTER EM +0x275F 0x043D # CYRILLIC SMALL LETTER EN +0x2760 0x043E # CYRILLIC SMALL LETTER O +0x2761 0x043F # CYRILLIC SMALL LETTER PE +0x2762 0x0440 # CYRILLIC SMALL LETTER ER +0x2763 0x0441 # CYRILLIC SMALL LETTER ES +0x2764 0x0442 # CYRILLIC SMALL LETTER TE +0x2765 0x0443 # CYRILLIC SMALL LETTER U +0x2766 0x0444 # CYRILLIC SMALL LETTER EF +0x2767 0x0445 # CYRILLIC SMALL LETTER HA +0x2768 0x0446 # CYRILLIC SMALL LETTER TSE +0x2769 0x0447 # CYRILLIC SMALL LETTER CHE +0x276A 0x0448 # CYRILLIC SMALL LETTER SHA +0x276B 0x0449 # CYRILLIC SMALL LETTER SHCHA +0x276C 0x044A # CYRILLIC SMALL LETTER HARD SIGN +0x276D 0x044B # CYRILLIC SMALL LETTER YERU +0x276E 0x044C # CYRILLIC SMALL LETTER SOFT SIGN +0x276F 0x044D # CYRILLIC SMALL LETTER E +0x2770 0x044E # CYRILLIC SMALL LETTER YU +0x2771 0x044F # CYRILLIC SMALL LETTER YA +0x2821 0x0101 # LATIN SMALL LETTER A WITH MACRON +0x2822 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0x2823 0x01CE # LATIN SMALL LETTER A WITH CARON +0x2824 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0x2825 0x0113 # LATIN SMALL LETTER E WITH MACRON +0x2826 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0x2827 0x011B # LATIN SMALL LETTER E WITH CARON +0x2828 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0x2829 0x012B # LATIN SMALL LETTER I WITH MACRON +0x282A 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0x282B 0x01D0 # LATIN SMALL LETTER I WITH CARON +0x282C 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0x282D 0x014D # LATIN SMALL LETTER O WITH MACRON +0x282E 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0x282F 0x01D2 # LATIN SMALL LETTER O WITH CARON +0x2830 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0x2831 0x016B # LATIN SMALL LETTER U WITH MACRON +0x2832 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0x2833 0x01D4 # LATIN SMALL LETTER U WITH CARON +0x2834 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0x2835 0x01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +0x2836 0x01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +0x2837 0x01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON +0x2838 0x01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +0x2839 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0x283A 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0x2845 0x3105 # BOPOMOFO LETTER B +0x2846 0x3106 # BOPOMOFO LETTER P +0x2847 0x3107 # BOPOMOFO LETTER M +0x2848 0x3108 # BOPOMOFO LETTER F +0x2849 0x3109 # BOPOMOFO LETTER D +0x284A 0x310A # BOPOMOFO LETTER T +0x284B 0x310B # BOPOMOFO LETTER N +0x284C 0x310C # BOPOMOFO LETTER L +0x284D 0x310D # BOPOMOFO LETTER G +0x284E 0x310E # BOPOMOFO LETTER K +0x284F 0x310F # BOPOMOFO LETTER H +0x2850 0x3110 # BOPOMOFO LETTER J +0x2851 0x3111 # BOPOMOFO LETTER Q +0x2852 0x3112 # BOPOMOFO LETTER X +0x2853 0x3113 # BOPOMOFO LETTER ZH +0x2854 0x3114 # BOPOMOFO LETTER CH +0x2855 0x3115 # BOPOMOFO LETTER SH +0x2856 0x3116 # BOPOMOFO LETTER R +0x2857 0x3117 # BOPOMOFO LETTER Z +0x2858 0x3118 # BOPOMOFO LETTER C +0x2859 0x3119 # BOPOMOFO LETTER S +0x285A 0x311A # BOPOMOFO LETTER A +0x285B 0x311B # BOPOMOFO LETTER O +0x285C 0x311C # BOPOMOFO LETTER E +0x285D 0x311D # BOPOMOFO LETTER EH +0x285E 0x311E # BOPOMOFO LETTER AI +0x285F 0x311F # BOPOMOFO LETTER EI +0x2860 0x3120 # BOPOMOFO LETTER AU +0x2861 0x3121 # BOPOMOFO LETTER OU +0x2862 0x3122 # BOPOMOFO LETTER AN +0x2863 0x3123 # BOPOMOFO LETTER EN +0x2864 0x3124 # BOPOMOFO LETTER ANG +0x2865 0x3125 # BOPOMOFO LETTER ENG +0x2866 0x3126 # BOPOMOFO LETTER ER +0x2867 0x3127 # BOPOMOFO LETTER I +0x2868 0x3128 # BOPOMOFO LETTER U +0x2869 0x3129 # BOPOMOFO LETTER IU +0x2924 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL +0x2925 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL +0x2926 0x2502 # BOX DRAWINGS LIGHT VERTICAL +0x2927 0x2503 # BOX DRAWINGS HEAVY VERTICAL +0x2928 0x2504 # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +0x2929 0x2505 # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +0x292A 0x2506 # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +0x292B 0x2507 # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +0x292C 0x2508 # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +0x292D 0x2509 # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +0x292E 0x250A # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +0x292F 0x250B # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +0x2930 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT +0x2931 0x250D # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +0x2932 0x250E # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +0x2933 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT +0x2934 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT +0x2935 0x2511 # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +0x2936 0x2512 # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +0x2937 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT +0x2938 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT +0x2939 0x2515 # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +0x293A 0x2516 # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +0x293B 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT +0x293C 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT +0x293D 0x2519 # BOX DRAWINGS UP LIGHT AND LEFT HEAVY +0x293E 0x251A # BOX DRAWINGS UP HEAVY AND LEFT LIGHT +0x293F 0x251B # BOX DRAWINGS HEAVY UP AND LEFT +0x2940 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0x2941 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +0x2942 0x251E # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +0x2943 0x251F # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +0x2944 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +0x2945 0x2521 # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +0x2946 0x2522 # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +0x2947 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT +0x2948 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT +0x2949 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +0x294A 0x2526 # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +0x294B 0x2527 # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +0x294C 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +0x294D 0x2529 # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +0x294E 0x252A # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +0x294F 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT +0x2950 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0x2951 0x252D # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +0x2952 0x252E # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +0x2953 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +0x2954 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +0x2955 0x2531 # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +0x2956 0x2532 # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +0x2957 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +0x2958 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL +0x2959 0x2535 # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +0x295A 0x2536 # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +0x295B 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +0x295C 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +0x295D 0x2539 # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +0x295E 0x253A # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +0x295F 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL +0x2960 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0x2961 0x253D # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +0x2962 0x253E # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +0x2963 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +0x2964 0x2540 # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +0x2965 0x2541 # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +0x2966 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +0x2967 0x2543 # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +0x2968 0x2544 # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +0x2969 0x2545 # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +0x296A 0x2546 # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +0x296B 0x2547 # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +0x296C 0x2548 # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +0x296D 0x2549 # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +0x296E 0x254A # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +0x296F 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +0x3021 0x554A # +0x3022 0x963F # +0x3023 0x57C3 # +0x3024 0x6328 # +0x3025 0x54CE # +0x3026 0x5509 # +0x3027 0x54C0 # +0x3028 0x7691 # +0x3029 0x764C # +0x302A 0x853C # +0x302B 0x77EE # +0x302C 0x827E # +0x302D 0x788D # +0x302E 0x7231 # +0x302F 0x9698 # +0x3030 0x978D # +0x3031 0x6C28 # +0x3032 0x5B89 # +0x3033 0x4FFA # +0x3034 0x6309 # +0x3035 0x6697 # +0x3036 0x5CB8 # +0x3037 0x80FA # +0x3038 0x6848 # +0x3039 0x80AE # +0x303A 0x6602 # +0x303B 0x76CE # +0x303C 0x51F9 # +0x303D 0x6556 # +0x303E 0x71AC # +0x303F 0x7FF1 # +0x3040 0x8884 # +0x3041 0x50B2 # +0x3042 0x5965 # +0x3043 0x61CA # +0x3044 0x6FB3 # +0x3045 0x82AD # +0x3046 0x634C # +0x3047 0x6252 # +0x3048 0x53ED # +0x3049 0x5427 # +0x304A 0x7B06 # +0x304B 0x516B # +0x304C 0x75A4 # +0x304D 0x5DF4 # +0x304E 0x62D4 # +0x304F 0x8DCB # +0x3050 0x9776 # +0x3051 0x628A # +0x3052 0x8019 # +0x3053 0x575D # +0x3054 0x9738 # +0x3055 0x7F62 # +0x3056 0x7238 # +0x3057 0x767D # +0x3058 0x67CF # +0x3059 0x767E # +0x305A 0x6446 # +0x305B 0x4F70 # +0x305C 0x8D25 # +0x305D 0x62DC # +0x305E 0x7A17 # +0x305F 0x6591 # +0x3060 0x73ED # +0x3061 0x642C # +0x3062 0x6273 # +0x3063 0x822C # +0x3064 0x9881 # +0x3065 0x677F # +0x3066 0x7248 # +0x3067 0x626E # +0x3068 0x62CC # +0x3069 0x4F34 # +0x306A 0x74E3 # +0x306B 0x534A # +0x306C 0x529E # +0x306D 0x7ECA # +0x306E 0x90A6 # +0x306F 0x5E2E # +0x3070 0x6886 # +0x3071 0x699C # +0x3072 0x8180 # +0x3073 0x7ED1 # +0x3074 0x68D2 # +0x3075 0x78C5 # +0x3076 0x868C # +0x3077 0x9551 # +0x3078 0x508D # +0x3079 0x8C24 # +0x307A 0x82DE # +0x307B 0x80DE # +0x307C 0x5305 # +0x307D 0x8912 # +0x307E 0x5265 # +0x3121 0x8584 # +0x3122 0x96F9 # +0x3123 0x4FDD # +0x3124 0x5821 # +0x3125 0x9971 # +0x3126 0x5B9D # +0x3127 0x62B1 # +0x3128 0x62A5 # +0x3129 0x66B4 # +0x312A 0x8C79 # +0x312B 0x9C8D # +0x312C 0x7206 # +0x312D 0x676F # +0x312E 0x7891 # +0x312F 0x60B2 # +0x3130 0x5351 # +0x3131 0x5317 # +0x3132 0x8F88 # +0x3133 0x80CC # +0x3134 0x8D1D # +0x3135 0x94A1 # +0x3136 0x500D # +0x3137 0x72C8 # +0x3138 0x5907 # +0x3139 0x60EB # +0x313A 0x7119 # +0x313B 0x88AB # +0x313C 0x5954 # +0x313D 0x82EF # +0x313E 0x672C # +0x313F 0x7B28 # +0x3140 0x5D29 # +0x3141 0x7EF7 # +0x3142 0x752D # +0x3143 0x6CF5 # +0x3144 0x8E66 # +0x3145 0x8FF8 # +0x3146 0x903C # +0x3147 0x9F3B # +0x3148 0x6BD4 # +0x3149 0x9119 # +0x314A 0x7B14 # +0x314B 0x5F7C # +0x314C 0x78A7 # +0x314D 0x84D6 # +0x314E 0x853D # +0x314F 0x6BD5 # +0x3150 0x6BD9 # +0x3151 0x6BD6 # +0x3152 0x5E01 # +0x3153 0x5E87 # +0x3154 0x75F9 # +0x3155 0x95ED # +0x3156 0x655D # +0x3157 0x5F0A # +0x3158 0x5FC5 # +0x3159 0x8F9F # +0x315A 0x58C1 # +0x315B 0x81C2 # +0x315C 0x907F # +0x315D 0x965B # +0x315E 0x97AD # +0x315F 0x8FB9 # +0x3160 0x7F16 # +0x3161 0x8D2C # +0x3162 0x6241 # +0x3163 0x4FBF # +0x3164 0x53D8 # +0x3165 0x535E # +0x3166 0x8FA8 # +0x3167 0x8FA9 # +0x3168 0x8FAB # +0x3169 0x904D # +0x316A 0x6807 # +0x316B 0x5F6A # +0x316C 0x8198 # +0x316D 0x8868 # +0x316E 0x9CD6 # +0x316F 0x618B # +0x3170 0x522B # +0x3171 0x762A # +0x3172 0x5F6C # +0x3173 0x658C # +0x3174 0x6FD2 # +0x3175 0x6EE8 # +0x3176 0x5BBE # +0x3177 0x6448 # +0x3178 0x5175 # +0x3179 0x51B0 # +0x317A 0x67C4 # +0x317B 0x4E19 # +0x317C 0x79C9 # +0x317D 0x997C # +0x317E 0x70B3 # +0x3221 0x75C5 # +0x3222 0x5E76 # +0x3223 0x73BB # +0x3224 0x83E0 # +0x3225 0x64AD # +0x3226 0x62E8 # +0x3227 0x94B5 # +0x3228 0x6CE2 # +0x3229 0x535A # +0x322A 0x52C3 # +0x322B 0x640F # +0x322C 0x94C2 # +0x322D 0x7B94 # +0x322E 0x4F2F # +0x322F 0x5E1B # +0x3230 0x8236 # +0x3231 0x8116 # +0x3232 0x818A # +0x3233 0x6E24 # +0x3234 0x6CCA # +0x3235 0x9A73 # +0x3236 0x6355 # +0x3237 0x535C # +0x3238 0x54FA # +0x3239 0x8865 # +0x323A 0x57E0 # +0x323B 0x4E0D # +0x323C 0x5E03 # +0x323D 0x6B65 # +0x323E 0x7C3F # +0x323F 0x90E8 # +0x3240 0x6016 # +0x3241 0x64E6 # +0x3242 0x731C # +0x3243 0x88C1 # +0x3244 0x6750 # +0x3245 0x624D # +0x3246 0x8D22 # +0x3247 0x776C # +0x3248 0x8E29 # +0x3249 0x91C7 # +0x324A 0x5F69 # +0x324B 0x83DC # +0x324C 0x8521 # +0x324D 0x9910 # +0x324E 0x53C2 # +0x324F 0x8695 # +0x3250 0x6B8B # +0x3251 0x60ED # +0x3252 0x60E8 # +0x3253 0x707F # +0x3254 0x82CD # +0x3255 0x8231 # +0x3256 0x4ED3 # +0x3257 0x6CA7 # +0x3258 0x85CF # +0x3259 0x64CD # +0x325A 0x7CD9 # +0x325B 0x69FD # +0x325C 0x66F9 # +0x325D 0x8349 # +0x325E 0x5395 # +0x325F 0x7B56 # +0x3260 0x4FA7 # +0x3261 0x518C # +0x3262 0x6D4B # +0x3263 0x5C42 # +0x3264 0x8E6D # +0x3265 0x63D2 # +0x3266 0x53C9 # +0x3267 0x832C # +0x3268 0x8336 # +0x3269 0x67E5 # +0x326A 0x78B4 # +0x326B 0x643D # +0x326C 0x5BDF # +0x326D 0x5C94 # +0x326E 0x5DEE # +0x326F 0x8BE7 # +0x3270 0x62C6 # +0x3271 0x67F4 # +0x3272 0x8C7A # +0x3273 0x6400 # +0x3274 0x63BA # +0x3275 0x8749 # +0x3276 0x998B # +0x3277 0x8C17 # +0x3278 0x7F20 # +0x3279 0x94F2 # +0x327A 0x4EA7 # +0x327B 0x9610 # +0x327C 0x98A4 # +0x327D 0x660C # +0x327E 0x7316 # +0x3321 0x573A # +0x3322 0x5C1D # +0x3323 0x5E38 # +0x3324 0x957F # +0x3325 0x507F # +0x3326 0x80A0 # +0x3327 0x5382 # +0x3328 0x655E # +0x3329 0x7545 # +0x332A 0x5531 # +0x332B 0x5021 # +0x332C 0x8D85 # +0x332D 0x6284 # +0x332E 0x949E # +0x332F 0x671D # +0x3330 0x5632 # +0x3331 0x6F6E # +0x3332 0x5DE2 # +0x3333 0x5435 # +0x3334 0x7092 # +0x3335 0x8F66 # +0x3336 0x626F # +0x3337 0x64A4 # +0x3338 0x63A3 # +0x3339 0x5F7B # +0x333A 0x6F88 # +0x333B 0x90F4 # +0x333C 0x81E3 # +0x333D 0x8FB0 # +0x333E 0x5C18 # +0x333F 0x6668 # +0x3340 0x5FF1 # +0x3341 0x6C89 # +0x3342 0x9648 # +0x3343 0x8D81 # +0x3344 0x886C # +0x3345 0x6491 # +0x3346 0x79F0 # +0x3347 0x57CE # +0x3348 0x6A59 # +0x3349 0x6210 # +0x334A 0x5448 # +0x334B 0x4E58 # +0x334C 0x7A0B # +0x334D 0x60E9 # +0x334E 0x6F84 # +0x334F 0x8BDA # +0x3350 0x627F # +0x3351 0x901E # +0x3352 0x9A8B # +0x3353 0x79E4 # +0x3354 0x5403 # +0x3355 0x75F4 # +0x3356 0x6301 # +0x3357 0x5319 # +0x3358 0x6C60 # +0x3359 0x8FDF # +0x335A 0x5F1B # +0x335B 0x9A70 # +0x335C 0x803B # +0x335D 0x9F7F # +0x335E 0x4F88 # +0x335F 0x5C3A # +0x3360 0x8D64 # +0x3361 0x7FC5 # +0x3362 0x65A5 # +0x3363 0x70BD # +0x3364 0x5145 # +0x3365 0x51B2 # +0x3366 0x866B # +0x3367 0x5D07 # +0x3368 0x5BA0 # +0x3369 0x62BD # +0x336A 0x916C # +0x336B 0x7574 # +0x336C 0x8E0C # +0x336D 0x7A20 # +0x336E 0x6101 # +0x336F 0x7B79 # +0x3370 0x4EC7 # +0x3371 0x7EF8 # +0x3372 0x7785 # +0x3373 0x4E11 # +0x3374 0x81ED # +0x3375 0x521D # +0x3376 0x51FA # +0x3377 0x6A71 # +0x3378 0x53A8 # +0x3379 0x8E87 # +0x337A 0x9504 # +0x337B 0x96CF # +0x337C 0x6EC1 # +0x337D 0x9664 # +0x337E 0x695A # +0x3421 0x7840 # +0x3422 0x50A8 # +0x3423 0x77D7 # +0x3424 0x6410 # +0x3425 0x89E6 # +0x3426 0x5904 # +0x3427 0x63E3 # +0x3428 0x5DDD # +0x3429 0x7A7F # +0x342A 0x693D # +0x342B 0x4F20 # +0x342C 0x8239 # +0x342D 0x5598 # +0x342E 0x4E32 # +0x342F 0x75AE # +0x3430 0x7A97 # +0x3431 0x5E62 # +0x3432 0x5E8A # +0x3433 0x95EF # +0x3434 0x521B # +0x3435 0x5439 # +0x3436 0x708A # +0x3437 0x6376 # +0x3438 0x9524 # +0x3439 0x5782 # +0x343A 0x6625 # +0x343B 0x693F # +0x343C 0x9187 # +0x343D 0x5507 # +0x343E 0x6DF3 # +0x343F 0x7EAF # +0x3440 0x8822 # +0x3441 0x6233 # +0x3442 0x7EF0 # +0x3443 0x75B5 # +0x3444 0x8328 # +0x3445 0x78C1 # +0x3446 0x96CC # +0x3447 0x8F9E # +0x3448 0x6148 # +0x3449 0x74F7 # +0x344A 0x8BCD # +0x344B 0x6B64 # +0x344C 0x523A # +0x344D 0x8D50 # +0x344E 0x6B21 # +0x344F 0x806A # +0x3450 0x8471 # +0x3451 0x56F1 # +0x3452 0x5306 # +0x3453 0x4ECE # +0x3454 0x4E1B # +0x3455 0x51D1 # +0x3456 0x7C97 # +0x3457 0x918B # +0x3458 0x7C07 # +0x3459 0x4FC3 # +0x345A 0x8E7F # +0x345B 0x7BE1 # +0x345C 0x7A9C # +0x345D 0x6467 # +0x345E 0x5D14 # +0x345F 0x50AC # +0x3460 0x8106 # +0x3461 0x7601 # +0x3462 0x7CB9 # +0x3463 0x6DEC # +0x3464 0x7FE0 # +0x3465 0x6751 # +0x3466 0x5B58 # +0x3467 0x5BF8 # +0x3468 0x78CB # +0x3469 0x64AE # +0x346A 0x6413 # +0x346B 0x63AA # +0x346C 0x632B # +0x346D 0x9519 # +0x346E 0x642D # +0x346F 0x8FBE # +0x3470 0x7B54 # +0x3471 0x7629 # +0x3472 0x6253 # +0x3473 0x5927 # +0x3474 0x5446 # +0x3475 0x6B79 # +0x3476 0x50A3 # +0x3477 0x6234 # +0x3478 0x5E26 # +0x3479 0x6B86 # +0x347A 0x4EE3 # +0x347B 0x8D37 # +0x347C 0x888B # +0x347D 0x5F85 # +0x347E 0x902E # +0x3521 0x6020 # +0x3522 0x803D # +0x3523 0x62C5 # +0x3524 0x4E39 # +0x3525 0x5355 # +0x3526 0x90F8 # +0x3527 0x63B8 # +0x3528 0x80C6 # +0x3529 0x65E6 # +0x352A 0x6C2E # +0x352B 0x4F46 # +0x352C 0x60EE # +0x352D 0x6DE1 # +0x352E 0x8BDE # +0x352F 0x5F39 # +0x3530 0x86CB # +0x3531 0x5F53 # +0x3532 0x6321 # +0x3533 0x515A # +0x3534 0x8361 # +0x3535 0x6863 # +0x3536 0x5200 # +0x3537 0x6363 # +0x3538 0x8E48 # +0x3539 0x5012 # +0x353A 0x5C9B # +0x353B 0x7977 # +0x353C 0x5BFC # +0x353D 0x5230 # +0x353E 0x7A3B # +0x353F 0x60BC # +0x3540 0x9053 # +0x3541 0x76D7 # +0x3542 0x5FB7 # +0x3543 0x5F97 # +0x3544 0x7684 # +0x3545 0x8E6C # +0x3546 0x706F # +0x3547 0x767B # +0x3548 0x7B49 # +0x3549 0x77AA # +0x354A 0x51F3 # +0x354B 0x9093 # +0x354C 0x5824 # +0x354D 0x4F4E # +0x354E 0x6EF4 # +0x354F 0x8FEA # +0x3550 0x654C # +0x3551 0x7B1B # +0x3552 0x72C4 # +0x3553 0x6DA4 # +0x3554 0x7FDF # +0x3555 0x5AE1 # +0x3556 0x62B5 # +0x3557 0x5E95 # +0x3558 0x5730 # +0x3559 0x8482 # +0x355A 0x7B2C # +0x355B 0x5E1D # +0x355C 0x5F1F # +0x355D 0x9012 # +0x355E 0x7F14 # +0x355F 0x98A0 # +0x3560 0x6382 # +0x3561 0x6EC7 # +0x3562 0x7898 # +0x3563 0x70B9 # +0x3564 0x5178 # +0x3565 0x975B # +0x3566 0x57AB # +0x3567 0x7535 # +0x3568 0x4F43 # +0x3569 0x7538 # +0x356A 0x5E97 # +0x356B 0x60E6 # +0x356C 0x5960 # +0x356D 0x6DC0 # +0x356E 0x6BBF # +0x356F 0x7889 # +0x3570 0x53FC # +0x3571 0x96D5 # +0x3572 0x51CB # +0x3573 0x5201 # +0x3574 0x6389 # +0x3575 0x540A # +0x3576 0x9493 # +0x3577 0x8C03 # +0x3578 0x8DCC # +0x3579 0x7239 # +0x357A 0x789F # +0x357B 0x8776 # +0x357C 0x8FED # +0x357D 0x8C0D # +0x357E 0x53E0 # +0x3621 0x4E01 # +0x3622 0x76EF # +0x3623 0x53EE # +0x3624 0x9489 # +0x3625 0x9876 # +0x3626 0x9F0E # +0x3627 0x952D # +0x3628 0x5B9A # +0x3629 0x8BA2 # +0x362A 0x4E22 # +0x362B 0x4E1C # +0x362C 0x51AC # +0x362D 0x8463 # +0x362E 0x61C2 # +0x362F 0x52A8 # +0x3630 0x680B # +0x3631 0x4F97 # +0x3632 0x606B # +0x3633 0x51BB # +0x3634 0x6D1E # +0x3635 0x515C # +0x3636 0x6296 # +0x3637 0x6597 # +0x3638 0x9661 # +0x3639 0x8C46 # +0x363A 0x9017 # +0x363B 0x75D8 # +0x363C 0x90FD # +0x363D 0x7763 # +0x363E 0x6BD2 # +0x363F 0x728A # +0x3640 0x72EC # +0x3641 0x8BFB # +0x3642 0x5835 # +0x3643 0x7779 # +0x3644 0x8D4C # +0x3645 0x675C # +0x3646 0x9540 # +0x3647 0x809A # +0x3648 0x5EA6 # +0x3649 0x6E21 # +0x364A 0x5992 # +0x364B 0x7AEF # +0x364C 0x77ED # +0x364D 0x953B # +0x364E 0x6BB5 # +0x364F 0x65AD # +0x3650 0x7F0E # +0x3651 0x5806 # +0x3652 0x5151 # +0x3653 0x961F # +0x3654 0x5BF9 # +0x3655 0x58A9 # +0x3656 0x5428 # +0x3657 0x8E72 # +0x3658 0x6566 # +0x3659 0x987F # +0x365A 0x56E4 # +0x365B 0x949D # +0x365C 0x76FE # +0x365D 0x9041 # +0x365E 0x6387 # +0x365F 0x54C6 # +0x3660 0x591A # +0x3661 0x593A # +0x3662 0x579B # +0x3663 0x8EB2 # +0x3664 0x6735 # +0x3665 0x8DFA # +0x3666 0x8235 # +0x3667 0x5241 # +0x3668 0x60F0 # +0x3669 0x5815 # +0x366A 0x86FE # +0x366B 0x5CE8 # +0x366C 0x9E45 # +0x366D 0x4FC4 # +0x366E 0x989D # +0x366F 0x8BB9 # +0x3670 0x5A25 # +0x3671 0x6076 # +0x3672 0x5384 # +0x3673 0x627C # +0x3674 0x904F # +0x3675 0x9102 # +0x3676 0x997F # +0x3677 0x6069 # +0x3678 0x800C # +0x3679 0x513F # +0x367A 0x8033 # +0x367B 0x5C14 # +0x367C 0x9975 # +0x367D 0x6D31 # +0x367E 0x4E8C # +0x3721 0x8D30 # +0x3722 0x53D1 # +0x3723 0x7F5A # +0x3724 0x7B4F # +0x3725 0x4F10 # +0x3726 0x4E4F # +0x3727 0x9600 # +0x3728 0x6CD5 # +0x3729 0x73D0 # +0x372A 0x85E9 # +0x372B 0x5E06 # +0x372C 0x756A # +0x372D 0x7FFB # +0x372E 0x6A0A # +0x372F 0x77FE # +0x3730 0x9492 # +0x3731 0x7E41 # +0x3732 0x51E1 # +0x3733 0x70E6 # +0x3734 0x53CD # +0x3735 0x8FD4 # +0x3736 0x8303 # +0x3737 0x8D29 # +0x3738 0x72AF # +0x3739 0x996D # +0x373A 0x6CDB # +0x373B 0x574A # +0x373C 0x82B3 # +0x373D 0x65B9 # +0x373E 0x80AA # +0x373F 0x623F # +0x3740 0x9632 # +0x3741 0x59A8 # +0x3742 0x4EFF # +0x3743 0x8BBF # +0x3744 0x7EBA # +0x3745 0x653E # +0x3746 0x83F2 # +0x3747 0x975E # +0x3748 0x5561 # +0x3749 0x98DE # +0x374A 0x80A5 # +0x374B 0x532A # +0x374C 0x8BFD # +0x374D 0x5420 # +0x374E 0x80BA # +0x374F 0x5E9F # +0x3750 0x6CB8 # +0x3751 0x8D39 # +0x3752 0x82AC # +0x3753 0x915A # +0x3754 0x5429 # +0x3755 0x6C1B # +0x3756 0x5206 # +0x3757 0x7EB7 # +0x3758 0x575F # +0x3759 0x711A # +0x375A 0x6C7E # +0x375B 0x7C89 # +0x375C 0x594B # +0x375D 0x4EFD # +0x375E 0x5FFF # +0x375F 0x6124 # +0x3760 0x7CAA # +0x3761 0x4E30 # +0x3762 0x5C01 # +0x3763 0x67AB # +0x3764 0x8702 # +0x3765 0x5CF0 # +0x3766 0x950B # +0x3767 0x98CE # +0x3768 0x75AF # +0x3769 0x70FD # +0x376A 0x9022 # +0x376B 0x51AF # +0x376C 0x7F1D # +0x376D 0x8BBD # +0x376E 0x5949 # +0x376F 0x51E4 # +0x3770 0x4F5B # +0x3771 0x5426 # +0x3772 0x592B # +0x3773 0x6577 # +0x3774 0x80A4 # +0x3775 0x5B75 # +0x3776 0x6276 # +0x3777 0x62C2 # +0x3778 0x8F90 # +0x3779 0x5E45 # +0x377A 0x6C1F # +0x377B 0x7B26 # +0x377C 0x4F0F # +0x377D 0x4FD8 # +0x377E 0x670D # +0x3821 0x6D6E # +0x3822 0x6DAA # +0x3823 0x798F # +0x3824 0x88B1 # +0x3825 0x5F17 # +0x3826 0x752B # +0x3827 0x629A # +0x3828 0x8F85 # +0x3829 0x4FEF # +0x382A 0x91DC # +0x382B 0x65A7 # +0x382C 0x812F # +0x382D 0x8151 # +0x382E 0x5E9C # +0x382F 0x8150 # +0x3830 0x8D74 # +0x3831 0x526F # +0x3832 0x8986 # +0x3833 0x8D4B # +0x3834 0x590D # +0x3835 0x5085 # +0x3836 0x4ED8 # +0x3837 0x961C # +0x3838 0x7236 # +0x3839 0x8179 # +0x383A 0x8D1F # +0x383B 0x5BCC # +0x383C 0x8BA3 # +0x383D 0x9644 # +0x383E 0x5987 # +0x383F 0x7F1A # +0x3840 0x5490 # +0x3841 0x5676 # +0x3842 0x560E # +0x3843 0x8BE5 # +0x3844 0x6539 # +0x3845 0x6982 # +0x3846 0x9499 # +0x3847 0x76D6 # +0x3848 0x6E89 # +0x3849 0x5E72 # +0x384A 0x7518 # +0x384B 0x6746 # +0x384C 0x67D1 # +0x384D 0x7AFF # +0x384E 0x809D # +0x384F 0x8D76 # +0x3850 0x611F # +0x3851 0x79C6 # +0x3852 0x6562 # +0x3853 0x8D63 # +0x3854 0x5188 # +0x3855 0x521A # +0x3856 0x94A2 # +0x3857 0x7F38 # +0x3858 0x809B # +0x3859 0x7EB2 # +0x385A 0x5C97 # +0x385B 0x6E2F # +0x385C 0x6760 # +0x385D 0x7BD9 # +0x385E 0x768B # +0x385F 0x9AD8 # +0x3860 0x818F # +0x3861 0x7F94 # +0x3862 0x7CD5 # +0x3863 0x641E # +0x3864 0x9550 # +0x3865 0x7A3F # +0x3866 0x544A # +0x3867 0x54E5 # +0x3868 0x6B4C # +0x3869 0x6401 # +0x386A 0x6208 # +0x386B 0x9E3D # +0x386C 0x80F3 # +0x386D 0x7599 # +0x386E 0x5272 # +0x386F 0x9769 # +0x3870 0x845B # +0x3871 0x683C # +0x3872 0x86E4 # +0x3873 0x9601 # +0x3874 0x9694 # +0x3875 0x94EC # +0x3876 0x4E2A # +0x3877 0x5404 # +0x3878 0x7ED9 # +0x3879 0x6839 # +0x387A 0x8DDF # +0x387B 0x8015 # +0x387C 0x66F4 # +0x387D 0x5E9A # +0x387E 0x7FB9 # +0x3921 0x57C2 # +0x3922 0x803F # +0x3923 0x6897 # +0x3924 0x5DE5 # +0x3925 0x653B # +0x3926 0x529F # +0x3927 0x606D # +0x3928 0x9F9A # +0x3929 0x4F9B # +0x392A 0x8EAC # +0x392B 0x516C # +0x392C 0x5BAB # +0x392D 0x5F13 # +0x392E 0x5DE9 # +0x392F 0x6C5E # +0x3930 0x62F1 # +0x3931 0x8D21 # +0x3932 0x5171 # +0x3933 0x94A9 # +0x3934 0x52FE # +0x3935 0x6C9F # +0x3936 0x82DF # +0x3937 0x72D7 # +0x3938 0x57A2 # +0x3939 0x6784 # +0x393A 0x8D2D # +0x393B 0x591F # +0x393C 0x8F9C # +0x393D 0x83C7 # +0x393E 0x5495 # +0x393F 0x7B8D # +0x3940 0x4F30 # +0x3941 0x6CBD # +0x3942 0x5B64 # +0x3943 0x59D1 # +0x3944 0x9F13 # +0x3945 0x53E4 # +0x3946 0x86CA # +0x3947 0x9AA8 # +0x3948 0x8C37 # +0x3949 0x80A1 # +0x394A 0x6545 # +0x394B 0x987E # +0x394C 0x56FA # +0x394D 0x96C7 # +0x394E 0x522E # +0x394F 0x74DC # +0x3950 0x5250 # +0x3951 0x5BE1 # +0x3952 0x6302 # +0x3953 0x8902 # +0x3954 0x4E56 # +0x3955 0x62D0 # +0x3956 0x602A # +0x3957 0x68FA # +0x3958 0x5173 # +0x3959 0x5B98 # +0x395A 0x51A0 # +0x395B 0x89C2 # +0x395C 0x7BA1 # +0x395D 0x9986 # +0x395E 0x7F50 # +0x395F 0x60EF # +0x3960 0x704C # +0x3961 0x8D2F # +0x3962 0x5149 # +0x3963 0x5E7F # +0x3964 0x901B # +0x3965 0x7470 # +0x3966 0x89C4 # +0x3967 0x572D # +0x3968 0x7845 # +0x3969 0x5F52 # +0x396A 0x9F9F # +0x396B 0x95FA # +0x396C 0x8F68 # +0x396D 0x9B3C # +0x396E 0x8BE1 # +0x396F 0x7678 # +0x3970 0x6842 # +0x3971 0x67DC # +0x3972 0x8DEA # +0x3973 0x8D35 # +0x3974 0x523D # +0x3975 0x8F8A # +0x3976 0x6EDA # +0x3977 0x68CD # +0x3978 0x9505 # +0x3979 0x90ED # +0x397A 0x56FD # +0x397B 0x679C # +0x397C 0x88F9 # +0x397D 0x8FC7 # +0x397E 0x54C8 # +0x3A21 0x9AB8 # +0x3A22 0x5B69 # +0x3A23 0x6D77 # +0x3A24 0x6C26 # +0x3A25 0x4EA5 # +0x3A26 0x5BB3 # +0x3A27 0x9A87 # +0x3A28 0x9163 # +0x3A29 0x61A8 # +0x3A2A 0x90AF # +0x3A2B 0x97E9 # +0x3A2C 0x542B # +0x3A2D 0x6DB5 # +0x3A2E 0x5BD2 # +0x3A2F 0x51FD # +0x3A30 0x558A # +0x3A31 0x7F55 # +0x3A32 0x7FF0 # +0x3A33 0x64BC # +0x3A34 0x634D # +0x3A35 0x65F1 # +0x3A36 0x61BE # +0x3A37 0x608D # +0x3A38 0x710A # +0x3A39 0x6C57 # +0x3A3A 0x6C49 # +0x3A3B 0x592F # +0x3A3C 0x676D # +0x3A3D 0x822A # +0x3A3E 0x58D5 # +0x3A3F 0x568E # +0x3A40 0x8C6A # +0x3A41 0x6BEB # +0x3A42 0x90DD # +0x3A43 0x597D # +0x3A44 0x8017 # +0x3A45 0x53F7 # +0x3A46 0x6D69 # +0x3A47 0x5475 # +0x3A48 0x559D # +0x3A49 0x8377 # +0x3A4A 0x83CF # +0x3A4B 0x6838 # +0x3A4C 0x79BE # +0x3A4D 0x548C # +0x3A4E 0x4F55 # +0x3A4F 0x5408 # +0x3A50 0x76D2 # +0x3A51 0x8C89 # +0x3A52 0x9602 # +0x3A53 0x6CB3 # +0x3A54 0x6DB8 # +0x3A55 0x8D6B # +0x3A56 0x8910 # +0x3A57 0x9E64 # +0x3A58 0x8D3A # +0x3A59 0x563F # +0x3A5A 0x9ED1 # +0x3A5B 0x75D5 # +0x3A5C 0x5F88 # +0x3A5D 0x72E0 # +0x3A5E 0x6068 # +0x3A5F 0x54FC # +0x3A60 0x4EA8 # +0x3A61 0x6A2A # +0x3A62 0x8861 # +0x3A63 0x6052 # +0x3A64 0x8F70 # +0x3A65 0x54C4 # +0x3A66 0x70D8 # +0x3A67 0x8679 # +0x3A68 0x9E3F # +0x3A69 0x6D2A # +0x3A6A 0x5B8F # +0x3A6B 0x5F18 # +0x3A6C 0x7EA2 # +0x3A6D 0x5589 # +0x3A6E 0x4FAF # +0x3A6F 0x7334 # +0x3A70 0x543C # +0x3A71 0x539A # +0x3A72 0x5019 # +0x3A73 0x540E # +0x3A74 0x547C # +0x3A75 0x4E4E # +0x3A76 0x5FFD # +0x3A77 0x745A # +0x3A78 0x58F6 # +0x3A79 0x846B # +0x3A7A 0x80E1 # +0x3A7B 0x8774 # +0x3A7C 0x72D0 # +0x3A7D 0x7CCA # +0x3A7E 0x6E56 # +0x3B21 0x5F27 # +0x3B22 0x864E # +0x3B23 0x552C # +0x3B24 0x62A4 # +0x3B25 0x4E92 # +0x3B26 0x6CAA # +0x3B27 0x6237 # +0x3B28 0x82B1 # +0x3B29 0x54D7 # +0x3B2A 0x534E # +0x3B2B 0x733E # +0x3B2C 0x6ED1 # +0x3B2D 0x753B # +0x3B2E 0x5212 # +0x3B2F 0x5316 # +0x3B30 0x8BDD # +0x3B31 0x69D0 # +0x3B32 0x5F8A # +0x3B33 0x6000 # +0x3B34 0x6DEE # +0x3B35 0x574F # +0x3B36 0x6B22 # +0x3B37 0x73AF # +0x3B38 0x6853 # +0x3B39 0x8FD8 # +0x3B3A 0x7F13 # +0x3B3B 0x6362 # +0x3B3C 0x60A3 # +0x3B3D 0x5524 # +0x3B3E 0x75EA # +0x3B3F 0x8C62 # +0x3B40 0x7115 # +0x3B41 0x6DA3 # +0x3B42 0x5BA6 # +0x3B43 0x5E7B # +0x3B44 0x8352 # +0x3B45 0x614C # +0x3B46 0x9EC4 # +0x3B47 0x78FA # +0x3B48 0x8757 # +0x3B49 0x7C27 # +0x3B4A 0x7687 # +0x3B4B 0x51F0 # +0x3B4C 0x60F6 # +0x3B4D 0x714C # +0x3B4E 0x6643 # +0x3B4F 0x5E4C # +0x3B50 0x604D # +0x3B51 0x8C0E # +0x3B52 0x7070 # +0x3B53 0x6325 # +0x3B54 0x8F89 # +0x3B55 0x5FBD # +0x3B56 0x6062 # +0x3B57 0x86D4 # +0x3B58 0x56DE # +0x3B59 0x6BC1 # +0x3B5A 0x6094 # +0x3B5B 0x6167 # +0x3B5C 0x5349 # +0x3B5D 0x60E0 # +0x3B5E 0x6666 # +0x3B5F 0x8D3F # +0x3B60 0x79FD # +0x3B61 0x4F1A # +0x3B62 0x70E9 # +0x3B63 0x6C47 # +0x3B64 0x8BB3 # +0x3B65 0x8BF2 # +0x3B66 0x7ED8 # +0x3B67 0x8364 # +0x3B68 0x660F # +0x3B69 0x5A5A # +0x3B6A 0x9B42 # +0x3B6B 0x6D51 # +0x3B6C 0x6DF7 # +0x3B6D 0x8C41 # +0x3B6E 0x6D3B # +0x3B6F 0x4F19 # +0x3B70 0x706B # +0x3B71 0x83B7 # +0x3B72 0x6216 # +0x3B73 0x60D1 # +0x3B74 0x970D # +0x3B75 0x8D27 # +0x3B76 0x7978 # +0x3B77 0x51FB # +0x3B78 0x573E # +0x3B79 0x57FA # +0x3B7A 0x673A # +0x3B7B 0x7578 # +0x3B7C 0x7A3D # +0x3B7D 0x79EF # +0x3B7E 0x7B95 # +0x3C21 0x808C # +0x3C22 0x9965 # +0x3C23 0x8FF9 # +0x3C24 0x6FC0 # +0x3C25 0x8BA5 # +0x3C26 0x9E21 # +0x3C27 0x59EC # +0x3C28 0x7EE9 # +0x3C29 0x7F09 # +0x3C2A 0x5409 # +0x3C2B 0x6781 # +0x3C2C 0x68D8 # +0x3C2D 0x8F91 # +0x3C2E 0x7C4D # +0x3C2F 0x96C6 # +0x3C30 0x53CA # +0x3C31 0x6025 # +0x3C32 0x75BE # +0x3C33 0x6C72 # +0x3C34 0x5373 # +0x3C35 0x5AC9 # +0x3C36 0x7EA7 # +0x3C37 0x6324 # +0x3C38 0x51E0 # +0x3C39 0x810A # +0x3C3A 0x5DF1 # +0x3C3B 0x84DF # +0x3C3C 0x6280 # +0x3C3D 0x5180 # +0x3C3E 0x5B63 # +0x3C3F 0x4F0E # +0x3C40 0x796D # +0x3C41 0x5242 # +0x3C42 0x60B8 # +0x3C43 0x6D4E # +0x3C44 0x5BC4 # +0x3C45 0x5BC2 # +0x3C46 0x8BA1 # +0x3C47 0x8BB0 # +0x3C48 0x65E2 # +0x3C49 0x5FCC # +0x3C4A 0x9645 # +0x3C4B 0x5993 # +0x3C4C 0x7EE7 # +0x3C4D 0x7EAA # +0x3C4E 0x5609 # +0x3C4F 0x67B7 # +0x3C50 0x5939 # +0x3C51 0x4F73 # +0x3C52 0x5BB6 # +0x3C53 0x52A0 # +0x3C54 0x835A # +0x3C55 0x988A # +0x3C56 0x8D3E # +0x3C57 0x7532 # +0x3C58 0x94BE # +0x3C59 0x5047 # +0x3C5A 0x7A3C # +0x3C5B 0x4EF7 # +0x3C5C 0x67B6 # +0x3C5D 0x9A7E # +0x3C5E 0x5AC1 # +0x3C5F 0x6B7C # +0x3C60 0x76D1 # +0x3C61 0x575A # +0x3C62 0x5C16 # +0x3C63 0x7B3A # +0x3C64 0x95F4 # +0x3C65 0x714E # +0x3C66 0x517C # +0x3C67 0x80A9 # +0x3C68 0x8270 # +0x3C69 0x5978 # +0x3C6A 0x7F04 # +0x3C6B 0x8327 # +0x3C6C 0x68C0 # +0x3C6D 0x67EC # +0x3C6E 0x78B1 # +0x3C6F 0x7877 # +0x3C70 0x62E3 # +0x3C71 0x6361 # +0x3C72 0x7B80 # +0x3C73 0x4FED # +0x3C74 0x526A # +0x3C75 0x51CF # +0x3C76 0x8350 # +0x3C77 0x69DB # +0x3C78 0x9274 # +0x3C79 0x8DF5 # +0x3C7A 0x8D31 # +0x3C7B 0x89C1 # +0x3C7C 0x952E # +0x3C7D 0x7BAD # +0x3C7E 0x4EF6 # +0x3D21 0x5065 # +0x3D22 0x8230 # +0x3D23 0x5251 # +0x3D24 0x996F # +0x3D25 0x6E10 # +0x3D26 0x6E85 # +0x3D27 0x6DA7 # +0x3D28 0x5EFA # +0x3D29 0x50F5 # +0x3D2A 0x59DC # +0x3D2B 0x5C06 # +0x3D2C 0x6D46 # +0x3D2D 0x6C5F # +0x3D2E 0x7586 # +0x3D2F 0x848B # +0x3D30 0x6868 # +0x3D31 0x5956 # +0x3D32 0x8BB2 # +0x3D33 0x5320 # +0x3D34 0x9171 # +0x3D35 0x964D # +0x3D36 0x8549 # +0x3D37 0x6912 # +0x3D38 0x7901 # +0x3D39 0x7126 # +0x3D3A 0x80F6 # +0x3D3B 0x4EA4 # +0x3D3C 0x90CA # +0x3D3D 0x6D47 # +0x3D3E 0x9A84 # +0x3D3F 0x5A07 # +0x3D40 0x56BC # +0x3D41 0x6405 # +0x3D42 0x94F0 # +0x3D43 0x77EB # +0x3D44 0x4FA5 # +0x3D45 0x811A # +0x3D46 0x72E1 # +0x3D47 0x89D2 # +0x3D48 0x997A # +0x3D49 0x7F34 # +0x3D4A 0x7EDE # +0x3D4B 0x527F # +0x3D4C 0x6559 # +0x3D4D 0x9175 # +0x3D4E 0x8F7F # +0x3D4F 0x8F83 # +0x3D50 0x53EB # +0x3D51 0x7A96 # +0x3D52 0x63ED # +0x3D53 0x63A5 # +0x3D54 0x7686 # +0x3D55 0x79F8 # +0x3D56 0x8857 # +0x3D57 0x9636 # +0x3D58 0x622A # +0x3D59 0x52AB # +0x3D5A 0x8282 # +0x3D5B 0x6854 # +0x3D5C 0x6770 # +0x3D5D 0x6377 # +0x3D5E 0x776B # +0x3D5F 0x7AED # +0x3D60 0x6D01 # +0x3D61 0x7ED3 # +0x3D62 0x89E3 # +0x3D63 0x59D0 # +0x3D64 0x6212 # +0x3D65 0x85C9 # +0x3D66 0x82A5 # +0x3D67 0x754C # +0x3D68 0x501F # +0x3D69 0x4ECB # +0x3D6A 0x75A5 # +0x3D6B 0x8BEB # +0x3D6C 0x5C4A # +0x3D6D 0x5DFE # +0x3D6E 0x7B4B # +0x3D6F 0x65A4 # +0x3D70 0x91D1 # +0x3D71 0x4ECA # +0x3D72 0x6D25 # +0x3D73 0x895F # +0x3D74 0x7D27 # +0x3D75 0x9526 # +0x3D76 0x4EC5 # +0x3D77 0x8C28 # +0x3D78 0x8FDB # +0x3D79 0x9773 # +0x3D7A 0x664B # +0x3D7B 0x7981 # +0x3D7C 0x8FD1 # +0x3D7D 0x70EC # +0x3D7E 0x6D78 # +0x3E21 0x5C3D # +0x3E22 0x52B2 # +0x3E23 0x8346 # +0x3E24 0x5162 # +0x3E25 0x830E # +0x3E26 0x775B # +0x3E27 0x6676 # +0x3E28 0x9CB8 # +0x3E29 0x4EAC # +0x3E2A 0x60CA # +0x3E2B 0x7CBE # +0x3E2C 0x7CB3 # +0x3E2D 0x7ECF # +0x3E2E 0x4E95 # +0x3E2F 0x8B66 # +0x3E30 0x666F # +0x3E31 0x9888 # +0x3E32 0x9759 # +0x3E33 0x5883 # +0x3E34 0x656C # +0x3E35 0x955C # +0x3E36 0x5F84 # +0x3E37 0x75C9 # +0x3E38 0x9756 # +0x3E39 0x7ADF # +0x3E3A 0x7ADE # +0x3E3B 0x51C0 # +0x3E3C 0x70AF # +0x3E3D 0x7A98 # +0x3E3E 0x63EA # +0x3E3F 0x7A76 # +0x3E40 0x7EA0 # +0x3E41 0x7396 # +0x3E42 0x97ED # +0x3E43 0x4E45 # +0x3E44 0x7078 # +0x3E45 0x4E5D # +0x3E46 0x9152 # +0x3E47 0x53A9 # +0x3E48 0x6551 # +0x3E49 0x65E7 # +0x3E4A 0x81FC # +0x3E4B 0x8205 # +0x3E4C 0x548E # +0x3E4D 0x5C31 # +0x3E4E 0x759A # +0x3E4F 0x97A0 # +0x3E50 0x62D8 # +0x3E51 0x72D9 # +0x3E52 0x75BD # +0x3E53 0x5C45 # +0x3E54 0x9A79 # +0x3E55 0x83CA # +0x3E56 0x5C40 # +0x3E57 0x5480 # +0x3E58 0x77E9 # +0x3E59 0x4E3E # +0x3E5A 0x6CAE # +0x3E5B 0x805A # +0x3E5C 0x62D2 # +0x3E5D 0x636E # +0x3E5E 0x5DE8 # +0x3E5F 0x5177 # +0x3E60 0x8DDD # +0x3E61 0x8E1E # +0x3E62 0x952F # +0x3E63 0x4FF1 # +0x3E64 0x53E5 # +0x3E65 0x60E7 # +0x3E66 0x70AC # +0x3E67 0x5267 # +0x3E68 0x6350 # +0x3E69 0x9E43 # +0x3E6A 0x5A1F # +0x3E6B 0x5026 # +0x3E6C 0x7737 # +0x3E6D 0x5377 # +0x3E6E 0x7EE2 # +0x3E6F 0x6485 # +0x3E70 0x652B # +0x3E71 0x6289 # +0x3E72 0x6398 # +0x3E73 0x5014 # +0x3E74 0x7235 # +0x3E75 0x89C9 # +0x3E76 0x51B3 # +0x3E77 0x8BC0 # +0x3E78 0x7EDD # +0x3E79 0x5747 # +0x3E7A 0x83CC # +0x3E7B 0x94A7 # +0x3E7C 0x519B # +0x3E7D 0x541B # +0x3E7E 0x5CFB # +0x3F21 0x4FCA # +0x3F22 0x7AE3 # +0x3F23 0x6D5A # +0x3F24 0x90E1 # +0x3F25 0x9A8F # +0x3F26 0x5580 # +0x3F27 0x5496 # +0x3F28 0x5361 # +0x3F29 0x54AF # +0x3F2A 0x5F00 # +0x3F2B 0x63E9 # +0x3F2C 0x6977 # +0x3F2D 0x51EF # +0x3F2E 0x6168 # +0x3F2F 0x520A # +0x3F30 0x582A # +0x3F31 0x52D8 # +0x3F32 0x574E # +0x3F33 0x780D # +0x3F34 0x770B # +0x3F35 0x5EB7 # +0x3F36 0x6177 # +0x3F37 0x7CE0 # +0x3F38 0x625B # +0x3F39 0x6297 # +0x3F3A 0x4EA2 # +0x3F3B 0x7095 # +0x3F3C 0x8003 # +0x3F3D 0x62F7 # +0x3F3E 0x70E4 # +0x3F3F 0x9760 # +0x3F40 0x5777 # +0x3F41 0x82DB # +0x3F42 0x67EF # +0x3F43 0x68F5 # +0x3F44 0x78D5 # +0x3F45 0x9897 # +0x3F46 0x79D1 # +0x3F47 0x58F3 # +0x3F48 0x54B3 # +0x3F49 0x53EF # +0x3F4A 0x6E34 # +0x3F4B 0x514B # +0x3F4C 0x523B # +0x3F4D 0x5BA2 # +0x3F4E 0x8BFE # +0x3F4F 0x80AF # +0x3F50 0x5543 # +0x3F51 0x57A6 # +0x3F52 0x6073 # +0x3F53 0x5751 # +0x3F54 0x542D # +0x3F55 0x7A7A # +0x3F56 0x6050 # +0x3F57 0x5B54 # +0x3F58 0x63A7 # +0x3F59 0x62A0 # +0x3F5A 0x53E3 # +0x3F5B 0x6263 # +0x3F5C 0x5BC7 # +0x3F5D 0x67AF # +0x3F5E 0x54ED # +0x3F5F 0x7A9F # +0x3F60 0x82E6 # +0x3F61 0x9177 # +0x3F62 0x5E93 # +0x3F63 0x88E4 # +0x3F64 0x5938 # +0x3F65 0x57AE # +0x3F66 0x630E # +0x3F67 0x8DE8 # +0x3F68 0x80EF # +0x3F69 0x5757 # +0x3F6A 0x7B77 # +0x3F6B 0x4FA9 # +0x3F6C 0x5FEB # +0x3F6D 0x5BBD # +0x3F6E 0x6B3E # +0x3F6F 0x5321 # +0x3F70 0x7B50 # +0x3F71 0x72C2 # +0x3F72 0x6846 # +0x3F73 0x77FF # +0x3F74 0x7736 # +0x3F75 0x65F7 # +0x3F76 0x51B5 # +0x3F77 0x4E8F # +0x3F78 0x76D4 # +0x3F79 0x5CBF # +0x3F7A 0x7AA5 # +0x3F7B 0x8475 # +0x3F7C 0x594E # +0x3F7D 0x9B41 # +0x3F7E 0x5080 # +0x4021 0x9988 # +0x4022 0x6127 # +0x4023 0x6E83 # +0x4024 0x5764 # +0x4025 0x6606 # +0x4026 0x6346 # +0x4027 0x56F0 # +0x4028 0x62EC # +0x4029 0x6269 # +0x402A 0x5ED3 # +0x402B 0x9614 # +0x402C 0x5783 # +0x402D 0x62C9 # +0x402E 0x5587 # +0x402F 0x8721 # +0x4030 0x814A # +0x4031 0x8FA3 # +0x4032 0x5566 # +0x4033 0x83B1 # +0x4034 0x6765 # +0x4035 0x8D56 # +0x4036 0x84DD # +0x4037 0x5A6A # +0x4038 0x680F # +0x4039 0x62E6 # +0x403A 0x7BEE # +0x403B 0x9611 # +0x403C 0x5170 # +0x403D 0x6F9C # +0x403E 0x8C30 # +0x403F 0x63FD # +0x4040 0x89C8 # +0x4041 0x61D2 # +0x4042 0x7F06 # +0x4043 0x70C2 # +0x4044 0x6EE5 # +0x4045 0x7405 # +0x4046 0x6994 # +0x4047 0x72FC # +0x4048 0x5ECA # +0x4049 0x90CE # +0x404A 0x6717 # +0x404B 0x6D6A # +0x404C 0x635E # +0x404D 0x52B3 # +0x404E 0x7262 # +0x404F 0x8001 # +0x4050 0x4F6C # +0x4051 0x59E5 # +0x4052 0x916A # +0x4053 0x70D9 # +0x4054 0x6D9D # +0x4055 0x52D2 # +0x4056 0x4E50 # +0x4057 0x96F7 # +0x4058 0x956D # +0x4059 0x857E # +0x405A 0x78CA # +0x405B 0x7D2F # +0x405C 0x5121 # +0x405D 0x5792 # +0x405E 0x64C2 # +0x405F 0x808B # +0x4060 0x7C7B # +0x4061 0x6CEA # +0x4062 0x68F1 # +0x4063 0x695E # +0x4064 0x51B7 # +0x4065 0x5398 # +0x4066 0x68A8 # +0x4067 0x7281 # +0x4068 0x9ECE # +0x4069 0x7BF1 # +0x406A 0x72F8 # +0x406B 0x79BB # +0x406C 0x6F13 # +0x406D 0x7406 # +0x406E 0x674E # +0x406F 0x91CC # +0x4070 0x9CA4 # +0x4071 0x793C # +0x4072 0x8389 # +0x4073 0x8354 # +0x4074 0x540F # +0x4075 0x6817 # +0x4076 0x4E3D # +0x4077 0x5389 # +0x4078 0x52B1 # +0x4079 0x783E # +0x407A 0x5386 # +0x407B 0x5229 # +0x407C 0x5088 # +0x407D 0x4F8B # +0x407E 0x4FD0 # +0x4121 0x75E2 # +0x4122 0x7ACB # +0x4123 0x7C92 # +0x4124 0x6CA5 # +0x4125 0x96B6 # +0x4126 0x529B # +0x4127 0x7483 # +0x4128 0x54E9 # +0x4129 0x4FE9 # +0x412A 0x8054 # +0x412B 0x83B2 # +0x412C 0x8FDE # +0x412D 0x9570 # +0x412E 0x5EC9 # +0x412F 0x601C # +0x4130 0x6D9F # +0x4131 0x5E18 # +0x4132 0x655B # +0x4133 0x8138 # +0x4134 0x94FE # +0x4135 0x604B # +0x4136 0x70BC # +0x4137 0x7EC3 # +0x4138 0x7CAE # +0x4139 0x51C9 # +0x413A 0x6881 # +0x413B 0x7CB1 # +0x413C 0x826F # +0x413D 0x4E24 # +0x413E 0x8F86 # +0x413F 0x91CF # +0x4140 0x667E # +0x4141 0x4EAE # +0x4142 0x8C05 # +0x4143 0x64A9 # +0x4144 0x804A # +0x4145 0x50DA # +0x4146 0x7597 # +0x4147 0x71CE # +0x4148 0x5BE5 # +0x4149 0x8FBD # +0x414A 0x6F66 # +0x414B 0x4E86 # +0x414C 0x6482 # +0x414D 0x9563 # +0x414E 0x5ED6 # +0x414F 0x6599 # +0x4150 0x5217 # +0x4151 0x88C2 # +0x4152 0x70C8 # +0x4153 0x52A3 # +0x4154 0x730E # +0x4155 0x7433 # +0x4156 0x6797 # +0x4157 0x78F7 # +0x4158 0x9716 # +0x4159 0x4E34 # +0x415A 0x90BB # +0x415B 0x9CDE # +0x415C 0x6DCB # +0x415D 0x51DB # +0x415E 0x8D41 # +0x415F 0x541D # +0x4160 0x62CE # +0x4161 0x73B2 # +0x4162 0x83F1 # +0x4163 0x96F6 # +0x4164 0x9F84 # +0x4165 0x94C3 # +0x4166 0x4F36 # +0x4167 0x7F9A # +0x4168 0x51CC # +0x4169 0x7075 # +0x416A 0x9675 # +0x416B 0x5CAD # +0x416C 0x9886 # +0x416D 0x53E6 # +0x416E 0x4EE4 # +0x416F 0x6E9C # +0x4170 0x7409 # +0x4171 0x69B4 # +0x4172 0x786B # +0x4173 0x998F # +0x4174 0x7559 # +0x4175 0x5218 # +0x4176 0x7624 # +0x4177 0x6D41 # +0x4178 0x67F3 # +0x4179 0x516D # +0x417A 0x9F99 # +0x417B 0x804B # +0x417C 0x5499 # +0x417D 0x7B3C # +0x417E 0x7ABF # +0x4221 0x9686 # +0x4222 0x5784 # +0x4223 0x62E2 # +0x4224 0x9647 # +0x4225 0x697C # +0x4226 0x5A04 # +0x4227 0x6402 # +0x4228 0x7BD3 # +0x4229 0x6F0F # +0x422A 0x964B # +0x422B 0x82A6 # +0x422C 0x5362 # +0x422D 0x9885 # +0x422E 0x5E90 # +0x422F 0x7089 # +0x4230 0x63B3 # +0x4231 0x5364 # +0x4232 0x864F # +0x4233 0x9C81 # +0x4234 0x9E93 # +0x4235 0x788C # +0x4236 0x9732 # +0x4237 0x8DEF # +0x4238 0x8D42 # +0x4239 0x9E7F # +0x423A 0x6F5E # +0x423B 0x7984 # +0x423C 0x5F55 # +0x423D 0x9646 # +0x423E 0x622E # +0x423F 0x9A74 # +0x4240 0x5415 # +0x4241 0x94DD # +0x4242 0x4FA3 # +0x4243 0x65C5 # +0x4244 0x5C65 # +0x4245 0x5C61 # +0x4246 0x7F15 # +0x4247 0x8651 # +0x4248 0x6C2F # +0x4249 0x5F8B # +0x424A 0x7387 # +0x424B 0x6EE4 # +0x424C 0x7EFF # +0x424D 0x5CE6 # +0x424E 0x631B # +0x424F 0x5B6A # +0x4250 0x6EE6 # +0x4251 0x5375 # +0x4252 0x4E71 # +0x4253 0x63A0 # +0x4254 0x7565 # +0x4255 0x62A1 # +0x4256 0x8F6E # +0x4257 0x4F26 # +0x4258 0x4ED1 # +0x4259 0x6CA6 # +0x425A 0x7EB6 # +0x425B 0x8BBA # +0x425C 0x841D # +0x425D 0x87BA # +0x425E 0x7F57 # +0x425F 0x903B # +0x4260 0x9523 # +0x4261 0x7BA9 # +0x4262 0x9AA1 # +0x4263 0x88F8 # +0x4264 0x843D # +0x4265 0x6D1B # +0x4266 0x9A86 # +0x4267 0x7EDC # +0x4268 0x5988 # +0x4269 0x9EBB # +0x426A 0x739B # +0x426B 0x7801 # +0x426C 0x8682 # +0x426D 0x9A6C # +0x426E 0x9A82 # +0x426F 0x561B # +0x4270 0x5417 # +0x4271 0x57CB # +0x4272 0x4E70 # +0x4273 0x9EA6 # +0x4274 0x5356 # +0x4275 0x8FC8 # +0x4276 0x8109 # +0x4277 0x7792 # +0x4278 0x9992 # +0x4279 0x86EE # +0x427A 0x6EE1 # +0x427B 0x8513 # +0x427C 0x66FC # +0x427D 0x6162 # +0x427E 0x6F2B # +0x4321 0x8C29 # +0x4322 0x8292 # +0x4323 0x832B # +0x4324 0x76F2 # +0x4325 0x6C13 # +0x4326 0x5FD9 # +0x4327 0x83BD # +0x4328 0x732B # +0x4329 0x8305 # +0x432A 0x951A # +0x432B 0x6BDB # +0x432C 0x77DB # +0x432D 0x94C6 # +0x432E 0x536F # +0x432F 0x8302 # +0x4330 0x5192 # +0x4331 0x5E3D # +0x4332 0x8C8C # +0x4333 0x8D38 # +0x4334 0x4E48 # +0x4335 0x73AB # +0x4336 0x679A # +0x4337 0x6885 # +0x4338 0x9176 # +0x4339 0x9709 # +0x433A 0x7164 # +0x433B 0x6CA1 # +0x433C 0x7709 # +0x433D 0x5A92 # +0x433E 0x9541 # +0x433F 0x6BCF # +0x4340 0x7F8E # +0x4341 0x6627 # +0x4342 0x5BD0 # +0x4343 0x59B9 # +0x4344 0x5A9A # +0x4345 0x95E8 # +0x4346 0x95F7 # +0x4347 0x4EEC # +0x4348 0x840C # +0x4349 0x8499 # +0x434A 0x6AAC # +0x434B 0x76DF # +0x434C 0x9530 # +0x434D 0x731B # +0x434E 0x68A6 # +0x434F 0x5B5F # +0x4350 0x772F # +0x4351 0x919A # +0x4352 0x9761 # +0x4353 0x7CDC # +0x4354 0x8FF7 # +0x4355 0x8C1C # +0x4356 0x5F25 # +0x4357 0x7C73 # +0x4358 0x79D8 # +0x4359 0x89C5 # +0x435A 0x6CCC # +0x435B 0x871C # +0x435C 0x5BC6 # +0x435D 0x5E42 # +0x435E 0x68C9 # +0x435F 0x7720 # +0x4360 0x7EF5 # +0x4361 0x5195 # +0x4362 0x514D # +0x4363 0x52C9 # +0x4364 0x5A29 # +0x4365 0x7F05 # +0x4366 0x9762 # +0x4367 0x82D7 # +0x4368 0x63CF # +0x4369 0x7784 # +0x436A 0x85D0 # +0x436B 0x79D2 # +0x436C 0x6E3A # +0x436D 0x5E99 # +0x436E 0x5999 # +0x436F 0x8511 # +0x4370 0x706D # +0x4371 0x6C11 # +0x4372 0x62BF # +0x4373 0x76BF # +0x4374 0x654F # +0x4375 0x60AF # +0x4376 0x95FD # +0x4377 0x660E # +0x4378 0x879F # +0x4379 0x9E23 # +0x437A 0x94ED # +0x437B 0x540D # +0x437C 0x547D # +0x437D 0x8C2C # +0x437E 0x6478 # +0x4421 0x6479 # +0x4422 0x8611 # +0x4423 0x6A21 # +0x4424 0x819C # +0x4425 0x78E8 # +0x4426 0x6469 # +0x4427 0x9B54 # +0x4428 0x62B9 # +0x4429 0x672B # +0x442A 0x83AB # +0x442B 0x58A8 # +0x442C 0x9ED8 # +0x442D 0x6CAB # +0x442E 0x6F20 # +0x442F 0x5BDE # +0x4430 0x964C # +0x4431 0x8C0B # +0x4432 0x725F # +0x4433 0x67D0 # +0x4434 0x62C7 # +0x4435 0x7261 # +0x4436 0x4EA9 # +0x4437 0x59C6 # +0x4438 0x6BCD # +0x4439 0x5893 # +0x443A 0x66AE # +0x443B 0x5E55 # +0x443C 0x52DF # +0x443D 0x6155 # +0x443E 0x6728 # +0x443F 0x76EE # +0x4440 0x7766 # +0x4441 0x7267 # +0x4442 0x7A46 # +0x4443 0x62FF # +0x4444 0x54EA # +0x4445 0x5450 # +0x4446 0x94A0 # +0x4447 0x90A3 # +0x4448 0x5A1C # +0x4449 0x7EB3 # +0x444A 0x6C16 # +0x444B 0x4E43 # +0x444C 0x5976 # +0x444D 0x8010 # +0x444E 0x5948 # +0x444F 0x5357 # +0x4450 0x7537 # +0x4451 0x96BE # +0x4452 0x56CA # +0x4453 0x6320 # +0x4454 0x8111 # +0x4455 0x607C # +0x4456 0x95F9 # +0x4457 0x6DD6 # +0x4458 0x5462 # +0x4459 0x9981 # +0x445A 0x5185 # +0x445B 0x5AE9 # +0x445C 0x80FD # +0x445D 0x59AE # +0x445E 0x9713 # +0x445F 0x502A # +0x4460 0x6CE5 # +0x4461 0x5C3C # +0x4462 0x62DF # +0x4463 0x4F60 # +0x4464 0x533F # +0x4465 0x817B # +0x4466 0x9006 # +0x4467 0x6EBA # +0x4468 0x852B # +0x4469 0x62C8 # +0x446A 0x5E74 # +0x446B 0x78BE # +0x446C 0x64B5 # +0x446D 0x637B # +0x446E 0x5FF5 # +0x446F 0x5A18 # +0x4470 0x917F # +0x4471 0x9E1F # +0x4472 0x5C3F # +0x4473 0x634F # +0x4474 0x8042 # +0x4475 0x5B7D # +0x4476 0x556E # +0x4477 0x954A # +0x4478 0x954D # +0x4479 0x6D85 # +0x447A 0x60A8 # +0x447B 0x67E0 # +0x447C 0x72DE # +0x447D 0x51DD # +0x447E 0x5B81 # +0x4521 0x62E7 # +0x4522 0x6CDE # +0x4523 0x725B # +0x4524 0x626D # +0x4525 0x94AE # +0x4526 0x7EBD # +0x4527 0x8113 # +0x4528 0x6D53 # +0x4529 0x519C # +0x452A 0x5F04 # +0x452B 0x5974 # +0x452C 0x52AA # +0x452D 0x6012 # +0x452E 0x5973 # +0x452F 0x6696 # +0x4530 0x8650 # +0x4531 0x759F # +0x4532 0x632A # +0x4533 0x61E6 # +0x4534 0x7CEF # +0x4535 0x8BFA # +0x4536 0x54E6 # +0x4537 0x6B27 # +0x4538 0x9E25 # +0x4539 0x6BB4 # +0x453A 0x85D5 # +0x453B 0x5455 # +0x453C 0x5076 # +0x453D 0x6CA4 # +0x453E 0x556A # +0x453F 0x8DB4 # +0x4540 0x722C # +0x4541 0x5E15 # +0x4542 0x6015 # +0x4543 0x7436 # +0x4544 0x62CD # +0x4545 0x6392 # +0x4546 0x724C # +0x4547 0x5F98 # +0x4548 0x6E43 # +0x4549 0x6D3E # +0x454A 0x6500 # +0x454B 0x6F58 # +0x454C 0x76D8 # +0x454D 0x78D0 # +0x454E 0x76FC # +0x454F 0x7554 # +0x4550 0x5224 # +0x4551 0x53DB # +0x4552 0x4E53 # +0x4553 0x5E9E # +0x4554 0x65C1 # +0x4555 0x802A # +0x4556 0x80D6 # +0x4557 0x629B # +0x4558 0x5486 # +0x4559 0x5228 # +0x455A 0x70AE # +0x455B 0x888D # +0x455C 0x8DD1 # +0x455D 0x6CE1 # +0x455E 0x5478 # +0x455F 0x80DA # +0x4560 0x57F9 # +0x4561 0x88F4 # +0x4562 0x8D54 # +0x4563 0x966A # +0x4564 0x914D # +0x4565 0x4F69 # +0x4566 0x6C9B # +0x4567 0x55B7 # +0x4568 0x76C6 # +0x4569 0x7830 # +0x456A 0x62A8 # +0x456B 0x70F9 # +0x456C 0x6F8E # +0x456D 0x5F6D # +0x456E 0x84EC # +0x456F 0x68DA # +0x4570 0x787C # +0x4571 0x7BF7 # +0x4572 0x81A8 # +0x4573 0x670B # +0x4574 0x9E4F # +0x4575 0x6367 # +0x4576 0x78B0 # +0x4577 0x576F # +0x4578 0x7812 # +0x4579 0x9739 # +0x457A 0x6279 # +0x457B 0x62AB # +0x457C 0x5288 # +0x457D 0x7435 # +0x457E 0x6BD7 # +0x4621 0x5564 # +0x4622 0x813E # +0x4623 0x75B2 # +0x4624 0x76AE # +0x4625 0x5339 # +0x4626 0x75DE # +0x4627 0x50FB # +0x4628 0x5C41 # +0x4629 0x8B6C # +0x462A 0x7BC7 # +0x462B 0x504F # +0x462C 0x7247 # +0x462D 0x9A97 # +0x462E 0x98D8 # +0x462F 0x6F02 # +0x4630 0x74E2 # +0x4631 0x7968 # +0x4632 0x6487 # +0x4633 0x77A5 # +0x4634 0x62FC # +0x4635 0x9891 # +0x4636 0x8D2B # +0x4637 0x54C1 # +0x4638 0x8058 # +0x4639 0x4E52 # +0x463A 0x576A # +0x463B 0x82F9 # +0x463C 0x840D # +0x463D 0x5E73 # +0x463E 0x51ED # +0x463F 0x74F6 # +0x4640 0x8BC4 # +0x4641 0x5C4F # +0x4642 0x5761 # +0x4643 0x6CFC # +0x4644 0x9887 # +0x4645 0x5A46 # +0x4646 0x7834 # +0x4647 0x9B44 # +0x4648 0x8FEB # +0x4649 0x7C95 # +0x464A 0x5256 # +0x464B 0x6251 # +0x464C 0x94FA # +0x464D 0x4EC6 # +0x464E 0x8386 # +0x464F 0x8461 # +0x4650 0x83E9 # +0x4651 0x84B2 # +0x4652 0x57D4 # +0x4653 0x6734 # +0x4654 0x5703 # +0x4655 0x666E # +0x4656 0x6D66 # +0x4657 0x8C31 # +0x4658 0x66DD # +0x4659 0x7011 # +0x465A 0x671F # +0x465B 0x6B3A # +0x465C 0x6816 # +0x465D 0x621A # +0x465E 0x59BB # +0x465F 0x4E03 # +0x4660 0x51C4 # +0x4661 0x6F06 # +0x4662 0x67D2 # +0x4663 0x6C8F # +0x4664 0x5176 # +0x4665 0x68CB # +0x4666 0x5947 # +0x4667 0x6B67 # +0x4668 0x7566 # +0x4669 0x5D0E # +0x466A 0x8110 # +0x466B 0x9F50 # +0x466C 0x65D7 # +0x466D 0x7948 # +0x466E 0x7941 # +0x466F 0x9A91 # +0x4670 0x8D77 # +0x4671 0x5C82 # +0x4672 0x4E5E # +0x4673 0x4F01 # +0x4674 0x542F # +0x4675 0x5951 # +0x4676 0x780C # +0x4677 0x5668 # +0x4678 0x6C14 # +0x4679 0x8FC4 # +0x467A 0x5F03 # +0x467B 0x6C7D # +0x467C 0x6CE3 # +0x467D 0x8BAB # +0x467E 0x6390 # +0x4721 0x6070 # +0x4722 0x6D3D # +0x4723 0x7275 # +0x4724 0x6266 # +0x4725 0x948E # +0x4726 0x94C5 # +0x4727 0x5343 # +0x4728 0x8FC1 # +0x4729 0x7B7E # +0x472A 0x4EDF # +0x472B 0x8C26 # +0x472C 0x4E7E # +0x472D 0x9ED4 # +0x472E 0x94B1 # +0x472F 0x94B3 # +0x4730 0x524D # +0x4731 0x6F5C # +0x4732 0x9063 # +0x4733 0x6D45 # +0x4734 0x8C34 # +0x4735 0x5811 # +0x4736 0x5D4C # +0x4737 0x6B20 # +0x4738 0x6B49 # +0x4739 0x67AA # +0x473A 0x545B # +0x473B 0x8154 # +0x473C 0x7F8C # +0x473D 0x5899 # +0x473E 0x8537 # +0x473F 0x5F3A # +0x4740 0x62A2 # +0x4741 0x6A47 # +0x4742 0x9539 # +0x4743 0x6572 # +0x4744 0x6084 # +0x4745 0x6865 # +0x4746 0x77A7 # +0x4747 0x4E54 # +0x4748 0x4FA8 # +0x4749 0x5DE7 # +0x474A 0x9798 # +0x474B 0x64AC # +0x474C 0x7FD8 # +0x474D 0x5CED # +0x474E 0x4FCF # +0x474F 0x7A8D # +0x4750 0x5207 # +0x4751 0x8304 # +0x4752 0x4E14 # +0x4753 0x602F # +0x4754 0x7A83 # +0x4755 0x94A6 # +0x4756 0x4FB5 # +0x4757 0x4EB2 # +0x4758 0x79E6 # +0x4759 0x7434 # +0x475A 0x52E4 # +0x475B 0x82B9 # +0x475C 0x64D2 # +0x475D 0x79BD # +0x475E 0x5BDD # +0x475F 0x6C81 # +0x4760 0x9752 # +0x4761 0x8F7B # +0x4762 0x6C22 # +0x4763 0x503E # +0x4764 0x537F # +0x4765 0x6E05 # +0x4766 0x64CE # +0x4767 0x6674 # +0x4768 0x6C30 # +0x4769 0x60C5 # +0x476A 0x9877 # +0x476B 0x8BF7 # +0x476C 0x5E86 # +0x476D 0x743C # +0x476E 0x7A77 # +0x476F 0x79CB # +0x4770 0x4E18 # +0x4771 0x90B1 # +0x4772 0x7403 # +0x4773 0x6C42 # +0x4774 0x56DA # +0x4775 0x914B # +0x4776 0x6CC5 # +0x4777 0x8D8B # +0x4778 0x533A # +0x4779 0x86C6 # +0x477A 0x66F2 # +0x477B 0x8EAF # +0x477C 0x5C48 # +0x477D 0x9A71 # +0x477E 0x6E20 # +0x4821 0x53D6 # +0x4822 0x5A36 # +0x4823 0x9F8B # +0x4824 0x8DA3 # +0x4825 0x53BB # +0x4826 0x5708 # +0x4827 0x98A7 # +0x4828 0x6743 # +0x4829 0x919B # +0x482A 0x6CC9 # +0x482B 0x5168 # +0x482C 0x75CA # +0x482D 0x62F3 # +0x482E 0x72AC # +0x482F 0x5238 # +0x4830 0x529D # +0x4831 0x7F3A # +0x4832 0x7094 # +0x4833 0x7638 # +0x4834 0x5374 # +0x4835 0x9E4A # +0x4836 0x69B7 # +0x4837 0x786E # +0x4838 0x96C0 # +0x4839 0x88D9 # +0x483A 0x7FA4 # +0x483B 0x7136 # +0x483C 0x71C3 # +0x483D 0x5189 # +0x483E 0x67D3 # +0x483F 0x74E4 # +0x4840 0x58E4 # +0x4841 0x6518 # +0x4842 0x56B7 # +0x4843 0x8BA9 # +0x4844 0x9976 # +0x4845 0x6270 # +0x4846 0x7ED5 # +0x4847 0x60F9 # +0x4848 0x70ED # +0x4849 0x58EC # +0x484A 0x4EC1 # +0x484B 0x4EBA # +0x484C 0x5FCD # +0x484D 0x97E7 # +0x484E 0x4EFB # +0x484F 0x8BA4 # +0x4850 0x5203 # +0x4851 0x598A # +0x4852 0x7EAB # +0x4853 0x6254 # +0x4854 0x4ECD # +0x4855 0x65E5 # +0x4856 0x620E # +0x4857 0x8338 # +0x4858 0x84C9 # +0x4859 0x8363 # +0x485A 0x878D # +0x485B 0x7194 # +0x485C 0x6EB6 # +0x485D 0x5BB9 # +0x485E 0x7ED2 # +0x485F 0x5197 # +0x4860 0x63C9 # +0x4861 0x67D4 # +0x4862 0x8089 # +0x4863 0x8339 # +0x4864 0x8815 # +0x4865 0x5112 # +0x4866 0x5B7A # +0x4867 0x5982 # +0x4868 0x8FB1 # +0x4869 0x4E73 # +0x486A 0x6C5D # +0x486B 0x5165 # +0x486C 0x8925 # +0x486D 0x8F6F # +0x486E 0x962E # +0x486F 0x854A # +0x4870 0x745E # +0x4871 0x9510 # +0x4872 0x95F0 # +0x4873 0x6DA6 # +0x4874 0x82E5 # +0x4875 0x5F31 # +0x4876 0x6492 # +0x4877 0x6D12 # +0x4878 0x8428 # +0x4879 0x816E # +0x487A 0x9CC3 # +0x487B 0x585E # +0x487C 0x8D5B # +0x487D 0x4E09 # +0x487E 0x53C1 # +0x4921 0x4F1E # +0x4922 0x6563 # +0x4923 0x6851 # +0x4924 0x55D3 # +0x4925 0x4E27 # +0x4926 0x6414 # +0x4927 0x9A9A # +0x4928 0x626B # +0x4929 0x5AC2 # +0x492A 0x745F # +0x492B 0x8272 # +0x492C 0x6DA9 # +0x492D 0x68EE # +0x492E 0x50E7 # +0x492F 0x838E # +0x4930 0x7802 # +0x4931 0x6740 # +0x4932 0x5239 # +0x4933 0x6C99 # +0x4934 0x7EB1 # +0x4935 0x50BB # +0x4936 0x5565 # +0x4937 0x715E # +0x4938 0x7B5B # +0x4939 0x6652 # +0x493A 0x73CA # +0x493B 0x82EB # +0x493C 0x6749 # +0x493D 0x5C71 # +0x493E 0x5220 # +0x493F 0x717D # +0x4940 0x886B # +0x4941 0x95EA # +0x4942 0x9655 # +0x4943 0x64C5 # +0x4944 0x8D61 # +0x4945 0x81B3 # +0x4946 0x5584 # +0x4947 0x6C55 # +0x4948 0x6247 # +0x4949 0x7F2E # +0x494A 0x5892 # +0x494B 0x4F24 # +0x494C 0x5546 # +0x494D 0x8D4F # +0x494E 0x664C # +0x494F 0x4E0A # +0x4950 0x5C1A # +0x4951 0x88F3 # +0x4952 0x68A2 # +0x4953 0x634E # +0x4954 0x7A0D # +0x4955 0x70E7 # +0x4956 0x828D # +0x4957 0x52FA # +0x4958 0x97F6 # +0x4959 0x5C11 # +0x495A 0x54E8 # +0x495B 0x90B5 # +0x495C 0x7ECD # +0x495D 0x5962 # +0x495E 0x8D4A # +0x495F 0x86C7 # +0x4960 0x820C # +0x4961 0x820D # +0x4962 0x8D66 # +0x4963 0x6444 # +0x4964 0x5C04 # +0x4965 0x6151 # +0x4966 0x6D89 # +0x4967 0x793E # +0x4968 0x8BBE # +0x4969 0x7837 # +0x496A 0x7533 # +0x496B 0x547B # +0x496C 0x4F38 # +0x496D 0x8EAB # +0x496E 0x6DF1 # +0x496F 0x5A20 # +0x4970 0x7EC5 # +0x4971 0x795E # +0x4972 0x6C88 # +0x4973 0x5BA1 # +0x4974 0x5A76 # +0x4975 0x751A # +0x4976 0x80BE # +0x4977 0x614E # +0x4978 0x6E17 # +0x4979 0x58F0 # +0x497A 0x751F # +0x497B 0x7525 # +0x497C 0x7272 # +0x497D 0x5347 # +0x497E 0x7EF3 # +0x4A21 0x7701 # +0x4A22 0x76DB # +0x4A23 0x5269 # +0x4A24 0x80DC # +0x4A25 0x5723 # +0x4A26 0x5E08 # +0x4A27 0x5931 # +0x4A28 0x72EE # +0x4A29 0x65BD # +0x4A2A 0x6E7F # +0x4A2B 0x8BD7 # +0x4A2C 0x5C38 # +0x4A2D 0x8671 # +0x4A2E 0x5341 # +0x4A2F 0x77F3 # +0x4A30 0x62FE # +0x4A31 0x65F6 # +0x4A32 0x4EC0 # +0x4A33 0x98DF # +0x4A34 0x8680 # +0x4A35 0x5B9E # +0x4A36 0x8BC6 # +0x4A37 0x53F2 # +0x4A38 0x77E2 # +0x4A39 0x4F7F # +0x4A3A 0x5C4E # +0x4A3B 0x9A76 # +0x4A3C 0x59CB # +0x4A3D 0x5F0F # +0x4A3E 0x793A # +0x4A3F 0x58EB # +0x4A40 0x4E16 # +0x4A41 0x67FF # +0x4A42 0x4E8B # +0x4A43 0x62ED # +0x4A44 0x8A93 # +0x4A45 0x901D # +0x4A46 0x52BF # +0x4A47 0x662F # +0x4A48 0x55DC # +0x4A49 0x566C # +0x4A4A 0x9002 # +0x4A4B 0x4ED5 # +0x4A4C 0x4F8D # +0x4A4D 0x91CA # +0x4A4E 0x9970 # +0x4A4F 0x6C0F # +0x4A50 0x5E02 # +0x4A51 0x6043 # +0x4A52 0x5BA4 # +0x4A53 0x89C6 # +0x4A54 0x8BD5 # +0x4A55 0x6536 # +0x4A56 0x624B # +0x4A57 0x9996 # +0x4A58 0x5B88 # +0x4A59 0x5BFF # +0x4A5A 0x6388 # +0x4A5B 0x552E # +0x4A5C 0x53D7 # +0x4A5D 0x7626 # +0x4A5E 0x517D # +0x4A5F 0x852C # +0x4A60 0x67A2 # +0x4A61 0x68B3 # +0x4A62 0x6B8A # +0x4A63 0x6292 # +0x4A64 0x8F93 # +0x4A65 0x53D4 # +0x4A66 0x8212 # +0x4A67 0x6DD1 # +0x4A68 0x758F # +0x4A69 0x4E66 # +0x4A6A 0x8D4E # +0x4A6B 0x5B70 # +0x4A6C 0x719F # +0x4A6D 0x85AF # +0x4A6E 0x6691 # +0x4A6F 0x66D9 # +0x4A70 0x7F72 # +0x4A71 0x8700 # +0x4A72 0x9ECD # +0x4A73 0x9F20 # +0x4A74 0x5C5E # +0x4A75 0x672F # +0x4A76 0x8FF0 # +0x4A77 0x6811 # +0x4A78 0x675F # +0x4A79 0x620D # +0x4A7A 0x7AD6 # +0x4A7B 0x5885 # +0x4A7C 0x5EB6 # +0x4A7D 0x6570 # +0x4A7E 0x6F31 # +0x4B21 0x6055 # +0x4B22 0x5237 # +0x4B23 0x800D # +0x4B24 0x6454 # +0x4B25 0x8870 # +0x4B26 0x7529 # +0x4B27 0x5E05 # +0x4B28 0x6813 # +0x4B29 0x62F4 # +0x4B2A 0x971C # +0x4B2B 0x53CC # +0x4B2C 0x723D # +0x4B2D 0x8C01 # +0x4B2E 0x6C34 # +0x4B2F 0x7761 # +0x4B30 0x7A0E # +0x4B31 0x542E # +0x4B32 0x77AC # +0x4B33 0x987A # +0x4B34 0x821C # +0x4B35 0x8BF4 # +0x4B36 0x7855 # +0x4B37 0x6714 # +0x4B38 0x70C1 # +0x4B39 0x65AF # +0x4B3A 0x6495 # +0x4B3B 0x5636 # +0x4B3C 0x601D # +0x4B3D 0x79C1 # +0x4B3E 0x53F8 # +0x4B3F 0x4E1D # +0x4B40 0x6B7B # +0x4B41 0x8086 # +0x4B42 0x5BFA # +0x4B43 0x55E3 # +0x4B44 0x56DB # +0x4B45 0x4F3A # +0x4B46 0x4F3C # +0x4B47 0x9972 # +0x4B48 0x5DF3 # +0x4B49 0x677E # +0x4B4A 0x8038 # +0x4B4B 0x6002 # +0x4B4C 0x9882 # +0x4B4D 0x9001 # +0x4B4E 0x5B8B # +0x4B4F 0x8BBC # +0x4B50 0x8BF5 # +0x4B51 0x641C # +0x4B52 0x8258 # +0x4B53 0x64DE # +0x4B54 0x55FD # +0x4B55 0x82CF # +0x4B56 0x9165 # +0x4B57 0x4FD7 # +0x4B58 0x7D20 # +0x4B59 0x901F # +0x4B5A 0x7C9F # +0x4B5B 0x50F3 # +0x4B5C 0x5851 # +0x4B5D 0x6EAF # +0x4B5E 0x5BBF # +0x4B5F 0x8BC9 # +0x4B60 0x8083 # +0x4B61 0x9178 # +0x4B62 0x849C # +0x4B63 0x7B97 # +0x4B64 0x867D # +0x4B65 0x968B # +0x4B66 0x968F # +0x4B67 0x7EE5 # +0x4B68 0x9AD3 # +0x4B69 0x788E # +0x4B6A 0x5C81 # +0x4B6B 0x7A57 # +0x4B6C 0x9042 # +0x4B6D 0x96A7 # +0x4B6E 0x795F # +0x4B6F 0x5B59 # +0x4B70 0x635F # +0x4B71 0x7B0B # +0x4B72 0x84D1 # +0x4B73 0x68AD # +0x4B74 0x5506 # +0x4B75 0x7F29 # +0x4B76 0x7410 # +0x4B77 0x7D22 # +0x4B78 0x9501 # +0x4B79 0x6240 # +0x4B7A 0x584C # +0x4B7B 0x4ED6 # +0x4B7C 0x5B83 # +0x4B7D 0x5979 # +0x4B7E 0x5854 # +0x4C21 0x736D # +0x4C22 0x631E # +0x4C23 0x8E4B # +0x4C24 0x8E0F # +0x4C25 0x80CE # +0x4C26 0x82D4 # +0x4C27 0x62AC # +0x4C28 0x53F0 # +0x4C29 0x6CF0 # +0x4C2A 0x915E # +0x4C2B 0x592A # +0x4C2C 0x6001 # +0x4C2D 0x6C70 # +0x4C2E 0x574D # +0x4C2F 0x644A # +0x4C30 0x8D2A # +0x4C31 0x762B # +0x4C32 0x6EE9 # +0x4C33 0x575B # +0x4C34 0x6A80 # +0x4C35 0x75F0 # +0x4C36 0x6F6D # +0x4C37 0x8C2D # +0x4C38 0x8C08 # +0x4C39 0x5766 # +0x4C3A 0x6BEF # +0x4C3B 0x8892 # +0x4C3C 0x78B3 # +0x4C3D 0x63A2 # +0x4C3E 0x53F9 # +0x4C3F 0x70AD # +0x4C40 0x6C64 # +0x4C41 0x5858 # +0x4C42 0x642A # +0x4C43 0x5802 # +0x4C44 0x68E0 # +0x4C45 0x819B # +0x4C46 0x5510 # +0x4C47 0x7CD6 # +0x4C48 0x5018 # +0x4C49 0x8EBA # +0x4C4A 0x6DCC # +0x4C4B 0x8D9F # +0x4C4C 0x70EB # +0x4C4D 0x638F # +0x4C4E 0x6D9B # +0x4C4F 0x6ED4 # +0x4C50 0x7EE6 # +0x4C51 0x8404 # +0x4C52 0x6843 # +0x4C53 0x9003 # +0x4C54 0x6DD8 # +0x4C55 0x9676 # +0x4C56 0x8BA8 # +0x4C57 0x5957 # +0x4C58 0x7279 # +0x4C59 0x85E4 # +0x4C5A 0x817E # +0x4C5B 0x75BC # +0x4C5C 0x8A8A # +0x4C5D 0x68AF # +0x4C5E 0x5254 # +0x4C5F 0x8E22 # +0x4C60 0x9511 # +0x4C61 0x63D0 # +0x4C62 0x9898 # +0x4C63 0x8E44 # +0x4C64 0x557C # +0x4C65 0x4F53 # +0x4C66 0x66FF # +0x4C67 0x568F # +0x4C68 0x60D5 # +0x4C69 0x6D95 # +0x4C6A 0x5243 # +0x4C6B 0x5C49 # +0x4C6C 0x5929 # +0x4C6D 0x6DFB # +0x4C6E 0x586B # +0x4C6F 0x7530 # +0x4C70 0x751C # +0x4C71 0x606C # +0x4C72 0x8214 # +0x4C73 0x8146 # +0x4C74 0x6311 # +0x4C75 0x6761 # +0x4C76 0x8FE2 # +0x4C77 0x773A # +0x4C78 0x8DF3 # +0x4C79 0x8D34 # +0x4C7A 0x94C1 # +0x4C7B 0x5E16 # +0x4C7C 0x5385 # +0x4C7D 0x542C # +0x4C7E 0x70C3 # +0x4D21 0x6C40 # +0x4D22 0x5EF7 # +0x4D23 0x505C # +0x4D24 0x4EAD # +0x4D25 0x5EAD # +0x4D26 0x633A # +0x4D27 0x8247 # +0x4D28 0x901A # +0x4D29 0x6850 # +0x4D2A 0x916E # +0x4D2B 0x77B3 # +0x4D2C 0x540C # +0x4D2D 0x94DC # +0x4D2E 0x5F64 # +0x4D2F 0x7AE5 # +0x4D30 0x6876 # +0x4D31 0x6345 # +0x4D32 0x7B52 # +0x4D33 0x7EDF # +0x4D34 0x75DB # +0x4D35 0x5077 # +0x4D36 0x6295 # +0x4D37 0x5934 # +0x4D38 0x900F # +0x4D39 0x51F8 # +0x4D3A 0x79C3 # +0x4D3B 0x7A81 # +0x4D3C 0x56FE # +0x4D3D 0x5F92 # +0x4D3E 0x9014 # +0x4D3F 0x6D82 # +0x4D40 0x5C60 # +0x4D41 0x571F # +0x4D42 0x5410 # +0x4D43 0x5154 # +0x4D44 0x6E4D # +0x4D45 0x56E2 # +0x4D46 0x63A8 # +0x4D47 0x9893 # +0x4D48 0x817F # +0x4D49 0x8715 # +0x4D4A 0x892A # +0x4D4B 0x9000 # +0x4D4C 0x541E # +0x4D4D 0x5C6F # +0x4D4E 0x81C0 # +0x4D4F 0x62D6 # +0x4D50 0x6258 # +0x4D51 0x8131 # +0x4D52 0x9E35 # +0x4D53 0x9640 # +0x4D54 0x9A6E # +0x4D55 0x9A7C # +0x4D56 0x692D # +0x4D57 0x59A5 # +0x4D58 0x62D3 # +0x4D59 0x553E # +0x4D5A 0x6316 # +0x4D5B 0x54C7 # +0x4D5C 0x86D9 # +0x4D5D 0x6D3C # +0x4D5E 0x5A03 # +0x4D5F 0x74E6 # +0x4D60 0x889C # +0x4D61 0x6B6A # +0x4D62 0x5916 # +0x4D63 0x8C4C # +0x4D64 0x5F2F # +0x4D65 0x6E7E # +0x4D66 0x73A9 # +0x4D67 0x987D # +0x4D68 0x4E38 # +0x4D69 0x70F7 # +0x4D6A 0x5B8C # +0x4D6B 0x7897 # +0x4D6C 0x633D # +0x4D6D 0x665A # +0x4D6E 0x7696 # +0x4D6F 0x60CB # +0x4D70 0x5B9B # +0x4D71 0x5A49 # +0x4D72 0x4E07 # +0x4D73 0x8155 # +0x4D74 0x6C6A # +0x4D75 0x738B # +0x4D76 0x4EA1 # +0x4D77 0x6789 # +0x4D78 0x7F51 # +0x4D79 0x5F80 # +0x4D7A 0x65FA # +0x4D7B 0x671B # +0x4D7C 0x5FD8 # +0x4D7D 0x5984 # +0x4D7E 0x5A01 # +0x4E21 0x5DCD # +0x4E22 0x5FAE # +0x4E23 0x5371 # +0x4E24 0x97E6 # +0x4E25 0x8FDD # +0x4E26 0x6845 # +0x4E27 0x56F4 # +0x4E28 0x552F # +0x4E29 0x60DF # +0x4E2A 0x4E3A # +0x4E2B 0x6F4D # +0x4E2C 0x7EF4 # +0x4E2D 0x82C7 # +0x4E2E 0x840E # +0x4E2F 0x59D4 # +0x4E30 0x4F1F # +0x4E31 0x4F2A # +0x4E32 0x5C3E # +0x4E33 0x7EAC # +0x4E34 0x672A # +0x4E35 0x851A # +0x4E36 0x5473 # +0x4E37 0x754F # +0x4E38 0x80C3 # +0x4E39 0x5582 # +0x4E3A 0x9B4F # +0x4E3B 0x4F4D # +0x4E3C 0x6E2D # +0x4E3D 0x8C13 # +0x4E3E 0x5C09 # +0x4E3F 0x6170 # +0x4E40 0x536B # +0x4E41 0x761F # +0x4E42 0x6E29 # +0x4E43 0x868A # +0x4E44 0x6587 # +0x4E45 0x95FB # +0x4E46 0x7EB9 # +0x4E47 0x543B # +0x4E48 0x7A33 # +0x4E49 0x7D0A # +0x4E4A 0x95EE # +0x4E4B 0x55E1 # +0x4E4C 0x7FC1 # +0x4E4D 0x74EE # +0x4E4E 0x631D # +0x4E4F 0x8717 # +0x4E50 0x6DA1 # +0x4E51 0x7A9D # +0x4E52 0x6211 # +0x4E53 0x65A1 # +0x4E54 0x5367 # +0x4E55 0x63E1 # +0x4E56 0x6C83 # +0x4E57 0x5DEB # +0x4E58 0x545C # +0x4E59 0x94A8 # +0x4E5A 0x4E4C # +0x4E5B 0x6C61 # +0x4E5C 0x8BEC # +0x4E5D 0x5C4B # +0x4E5E 0x65E0 # +0x4E5F 0x829C # +0x4E60 0x68A7 # +0x4E61 0x543E # +0x4E62 0x5434 # +0x4E63 0x6BCB # +0x4E64 0x6B66 # +0x4E65 0x4E94 # +0x4E66 0x6342 # +0x4E67 0x5348 # +0x4E68 0x821E # +0x4E69 0x4F0D # +0x4E6A 0x4FAE # +0x4E6B 0x575E # +0x4E6C 0x620A # +0x4E6D 0x96FE # +0x4E6E 0x6664 # +0x4E6F 0x7269 # +0x4E70 0x52FF # +0x4E71 0x52A1 # +0x4E72 0x609F # +0x4E73 0x8BEF # +0x4E74 0x6614 # +0x4E75 0x7199 # +0x4E76 0x6790 # +0x4E77 0x897F # +0x4E78 0x7852 # +0x4E79 0x77FD # +0x4E7A 0x6670 # +0x4E7B 0x563B # +0x4E7C 0x5438 # +0x4E7D 0x9521 # +0x4E7E 0x727A # +0x4F21 0x7A00 # +0x4F22 0x606F # +0x4F23 0x5E0C # +0x4F24 0x6089 # +0x4F25 0x819D # +0x4F26 0x5915 # +0x4F27 0x60DC # +0x4F28 0x7184 # +0x4F29 0x70EF # +0x4F2A 0x6EAA # +0x4F2B 0x6C50 # +0x4F2C 0x7280 # +0x4F2D 0x6A84 # +0x4F2E 0x88AD # +0x4F2F 0x5E2D # +0x4F30 0x4E60 # +0x4F31 0x5AB3 # +0x4F32 0x559C # +0x4F33 0x94E3 # +0x4F34 0x6D17 # +0x4F35 0x7CFB # +0x4F36 0x9699 # +0x4F37 0x620F # +0x4F38 0x7EC6 # +0x4F39 0x778E # +0x4F3A 0x867E # +0x4F3B 0x5323 # +0x4F3C 0x971E # +0x4F3D 0x8F96 # +0x4F3E 0x6687 # +0x4F3F 0x5CE1 # +0x4F40 0x4FA0 # +0x4F41 0x72ED # +0x4F42 0x4E0B # +0x4F43 0x53A6 # +0x4F44 0x590F # +0x4F45 0x5413 # +0x4F46 0x6380 # +0x4F47 0x9528 # +0x4F48 0x5148 # +0x4F49 0x4ED9 # +0x4F4A 0x9C9C # +0x4F4B 0x7EA4 # +0x4F4C 0x54B8 # +0x4F4D 0x8D24 # +0x4F4E 0x8854 # +0x4F4F 0x8237 # +0x4F50 0x95F2 # +0x4F51 0x6D8E # +0x4F52 0x5F26 # +0x4F53 0x5ACC # +0x4F54 0x663E # +0x4F55 0x9669 # +0x4F56 0x73B0 # +0x4F57 0x732E # +0x4F58 0x53BF # +0x4F59 0x817A # +0x4F5A 0x9985 # +0x4F5B 0x7FA1 # +0x4F5C 0x5BAA # +0x4F5D 0x9677 # +0x4F5E 0x9650 # +0x4F5F 0x7EBF # +0x4F60 0x76F8 # +0x4F61 0x53A2 # +0x4F62 0x9576 # +0x4F63 0x9999 # +0x4F64 0x7BB1 # +0x4F65 0x8944 # +0x4F66 0x6E58 # +0x4F67 0x4E61 # +0x4F68 0x7FD4 # +0x4F69 0x7965 # +0x4F6A 0x8BE6 # +0x4F6B 0x60F3 # +0x4F6C 0x54CD # +0x4F6D 0x4EAB # +0x4F6E 0x9879 # +0x4F6F 0x5DF7 # +0x4F70 0x6A61 # +0x4F71 0x50CF # +0x4F72 0x5411 # +0x4F73 0x8C61 # +0x4F74 0x8427 # +0x4F75 0x785D # +0x4F76 0x9704 # +0x4F77 0x524A # +0x4F78 0x54EE # +0x4F79 0x56A3 # +0x4F7A 0x9500 # +0x4F7B 0x6D88 # +0x4F7C 0x5BB5 # +0x4F7D 0x6DC6 # +0x4F7E 0x6653 # +0x5021 0x5C0F # +0x5022 0x5B5D # +0x5023 0x6821 # +0x5024 0x8096 # +0x5025 0x5578 # +0x5026 0x7B11 # +0x5027 0x6548 # +0x5028 0x6954 # +0x5029 0x4E9B # +0x502A 0x6B47 # +0x502B 0x874E # +0x502C 0x978B # +0x502D 0x534F # +0x502E 0x631F # +0x502F 0x643A # +0x5030 0x90AA # +0x5031 0x659C # +0x5032 0x80C1 # +0x5033 0x8C10 # +0x5034 0x5199 # +0x5035 0x68B0 # +0x5036 0x5378 # +0x5037 0x87F9 # +0x5038 0x61C8 # +0x5039 0x6CC4 # +0x503A 0x6CFB # +0x503B 0x8C22 # +0x503C 0x5C51 # +0x503D 0x85AA # +0x503E 0x82AF # +0x503F 0x950C # +0x5040 0x6B23 # +0x5041 0x8F9B # +0x5042 0x65B0 # +0x5043 0x5FFB # +0x5044 0x5FC3 # +0x5045 0x4FE1 # +0x5046 0x8845 # +0x5047 0x661F # +0x5048 0x8165 # +0x5049 0x7329 # +0x504A 0x60FA # +0x504B 0x5174 # +0x504C 0x5211 # +0x504D 0x578B # +0x504E 0x5F62 # +0x504F 0x90A2 # +0x5050 0x884C # +0x5051 0x9192 # +0x5052 0x5E78 # +0x5053 0x674F # +0x5054 0x6027 # +0x5055 0x59D3 # +0x5056 0x5144 # +0x5057 0x51F6 # +0x5058 0x80F8 # +0x5059 0x5308 # +0x505A 0x6C79 # +0x505B 0x96C4 # +0x505C 0x718A # +0x505D 0x4F11 # +0x505E 0x4FEE # +0x505F 0x7F9E # +0x5060 0x673D # +0x5061 0x55C5 # +0x5062 0x9508 # +0x5063 0x79C0 # +0x5064 0x8896 # +0x5065 0x7EE3 # +0x5066 0x589F # +0x5067 0x620C # +0x5068 0x9700 # +0x5069 0x865A # +0x506A 0x5618 # +0x506B 0x987B # +0x506C 0x5F90 # +0x506D 0x8BB8 # +0x506E 0x84C4 # +0x506F 0x9157 # +0x5070 0x53D9 # +0x5071 0x65ED # +0x5072 0x5E8F # +0x5073 0x755C # +0x5074 0x6064 # +0x5075 0x7D6E # +0x5076 0x5A7F # +0x5077 0x7EEA # +0x5078 0x7EED # +0x5079 0x8F69 # +0x507A 0x55A7 # +0x507B 0x5BA3 # +0x507C 0x60AC # +0x507D 0x65CB # +0x507E 0x7384 # +0x5121 0x9009 # +0x5122 0x7663 # +0x5123 0x7729 # +0x5124 0x7EDA # +0x5125 0x9774 # +0x5126 0x859B # +0x5127 0x5B66 # +0x5128 0x7A74 # +0x5129 0x96EA # +0x512A 0x8840 # +0x512B 0x52CB # +0x512C 0x718F # +0x512D 0x5FAA # +0x512E 0x65EC # +0x512F 0x8BE2 # +0x5130 0x5BFB # +0x5131 0x9A6F # +0x5132 0x5DE1 # +0x5133 0x6B89 # +0x5134 0x6C5B # +0x5135 0x8BAD # +0x5136 0x8BAF # +0x5137 0x900A # +0x5138 0x8FC5 # +0x5139 0x538B # +0x513A 0x62BC # +0x513B 0x9E26 # +0x513C 0x9E2D # +0x513D 0x5440 # +0x513E 0x4E2B # +0x513F 0x82BD # +0x5140 0x7259 # +0x5141 0x869C # +0x5142 0x5D16 # +0x5143 0x8859 # +0x5144 0x6DAF # +0x5145 0x96C5 # +0x5146 0x54D1 # +0x5147 0x4E9A # +0x5148 0x8BB6 # +0x5149 0x7109 # +0x514A 0x54BD # +0x514B 0x9609 # +0x514C 0x70DF # +0x514D 0x6DF9 # +0x514E 0x76D0 # +0x514F 0x4E25 # +0x5150 0x7814 # +0x5151 0x8712 # +0x5152 0x5CA9 # +0x5153 0x5EF6 # +0x5154 0x8A00 # +0x5155 0x989C # +0x5156 0x960E # +0x5157 0x708E # +0x5158 0x6CBF # +0x5159 0x5944 # +0x515A 0x63A9 # +0x515B 0x773C # +0x515C 0x884D # +0x515D 0x6F14 # +0x515E 0x8273 # +0x515F 0x5830 # +0x5160 0x71D5 # +0x5161 0x538C # +0x5162 0x781A # +0x5163 0x96C1 # +0x5164 0x5501 # +0x5165 0x5F66 # +0x5166 0x7130 # +0x5167 0x5BB4 # +0x5168 0x8C1A # +0x5169 0x9A8C # +0x516A 0x6B83 # +0x516B 0x592E # +0x516C 0x9E2F # +0x516D 0x79E7 # +0x516E 0x6768 # +0x516F 0x626C # +0x5170 0x4F6F # +0x5171 0x75A1 # +0x5172 0x7F8A # +0x5173 0x6D0B # +0x5174 0x9633 # +0x5175 0x6C27 # +0x5176 0x4EF0 # +0x5177 0x75D2 # +0x5178 0x517B # +0x5179 0x6837 # +0x517A 0x6F3E # +0x517B 0x9080 # +0x517C 0x8170 # +0x517D 0x5996 # +0x517E 0x7476 # +0x5221 0x6447 # +0x5222 0x5C27 # +0x5223 0x9065 # +0x5224 0x7A91 # +0x5225 0x8C23 # +0x5226 0x59DA # +0x5227 0x54AC # +0x5228 0x8200 # +0x5229 0x836F # +0x522A 0x8981 # +0x522B 0x8000 # +0x522C 0x6930 # +0x522D 0x564E # +0x522E 0x8036 # +0x522F 0x7237 # +0x5230 0x91CE # +0x5231 0x51B6 # +0x5232 0x4E5F # +0x5233 0x9875 # +0x5234 0x6396 # +0x5235 0x4E1A # +0x5236 0x53F6 # +0x5237 0x66F3 # +0x5238 0x814B # +0x5239 0x591C # +0x523A 0x6DB2 # +0x523B 0x4E00 # +0x523C 0x58F9 # +0x523D 0x533B # +0x523E 0x63D6 # +0x523F 0x94F1 # +0x5240 0x4F9D # +0x5241 0x4F0A # +0x5242 0x8863 # +0x5243 0x9890 # +0x5244 0x5937 # +0x5245 0x9057 # +0x5246 0x79FB # +0x5247 0x4EEA # +0x5248 0x80F0 # +0x5249 0x7591 # +0x524A 0x6C82 # +0x524B 0x5B9C # +0x524C 0x59E8 # +0x524D 0x5F5D # +0x524E 0x6905 # +0x524F 0x8681 # +0x5250 0x501A # +0x5251 0x5DF2 # +0x5252 0x4E59 # +0x5253 0x77E3 # +0x5254 0x4EE5 # +0x5255 0x827A # +0x5256 0x6291 # +0x5257 0x6613 # +0x5258 0x9091 # +0x5259 0x5C79 # +0x525A 0x4EBF # +0x525B 0x5F79 # +0x525C 0x81C6 # +0x525D 0x9038 # +0x525E 0x8084 # +0x525F 0x75AB # +0x5260 0x4EA6 # +0x5261 0x88D4 # +0x5262 0x610F # +0x5263 0x6BC5 # +0x5264 0x5FC6 # +0x5265 0x4E49 # +0x5266 0x76CA # +0x5267 0x6EA2 # +0x5268 0x8BE3 # +0x5269 0x8BAE # +0x526A 0x8C0A # +0x526B 0x8BD1 # +0x526C 0x5F02 # +0x526D 0x7FFC # +0x526E 0x7FCC # +0x526F 0x7ECE # +0x5270 0x8335 # +0x5271 0x836B # +0x5272 0x56E0 # +0x5273 0x6BB7 # +0x5274 0x97F3 # +0x5275 0x9634 # +0x5276 0x59FB # +0x5277 0x541F # +0x5278 0x94F6 # +0x5279 0x6DEB # +0x527A 0x5BC5 # +0x527B 0x996E # +0x527C 0x5C39 # +0x527D 0x5F15 # +0x527E 0x9690 # +0x5321 0x5370 # +0x5322 0x82F1 # +0x5323 0x6A31 # +0x5324 0x5A74 # +0x5325 0x9E70 # +0x5326 0x5E94 # +0x5327 0x7F28 # +0x5328 0x83B9 # +0x5329 0x8424 # +0x532A 0x8425 # +0x532B 0x8367 # +0x532C 0x8747 # +0x532D 0x8FCE # +0x532E 0x8D62 # +0x532F 0x76C8 # +0x5330 0x5F71 # +0x5331 0x9896 # +0x5332 0x786C # +0x5333 0x6620 # +0x5334 0x54DF # +0x5335 0x62E5 # +0x5336 0x4F63 # +0x5337 0x81C3 # +0x5338 0x75C8 # +0x5339 0x5EB8 # +0x533A 0x96CD # +0x533B 0x8E0A # +0x533C 0x86F9 # +0x533D 0x548F # +0x533E 0x6CF3 # +0x533F 0x6D8C # +0x5340 0x6C38 # +0x5341 0x607F # +0x5342 0x52C7 # +0x5343 0x7528 # +0x5344 0x5E7D # +0x5345 0x4F18 # +0x5346 0x60A0 # +0x5347 0x5FE7 # +0x5348 0x5C24 # +0x5349 0x7531 # +0x534A 0x90AE # +0x534B 0x94C0 # +0x534C 0x72B9 # +0x534D 0x6CB9 # +0x534E 0x6E38 # +0x534F 0x9149 # +0x5350 0x6709 # +0x5351 0x53CB # +0x5352 0x53F3 # +0x5353 0x4F51 # +0x5354 0x91C9 # +0x5355 0x8BF1 # +0x5356 0x53C8 # +0x5357 0x5E7C # +0x5358 0x8FC2 # +0x5359 0x6DE4 # +0x535A 0x4E8E # +0x535B 0x76C2 # +0x535C 0x6986 # +0x535D 0x865E # +0x535E 0x611A # +0x535F 0x8206 # +0x5360 0x4F59 # +0x5361 0x4FDE # +0x5362 0x903E # +0x5363 0x9C7C # +0x5364 0x6109 # +0x5365 0x6E1D # +0x5366 0x6E14 # +0x5367 0x9685 # +0x5368 0x4E88 # +0x5369 0x5A31 # +0x536A 0x96E8 # +0x536B 0x4E0E # +0x536C 0x5C7F # +0x536D 0x79B9 # +0x536E 0x5B87 # +0x536F 0x8BED # +0x5370 0x7FBD # +0x5371 0x7389 # +0x5372 0x57DF # +0x5373 0x828B # +0x5374 0x90C1 # +0x5375 0x5401 # +0x5376 0x9047 # +0x5377 0x55BB # +0x5378 0x5CEA # +0x5379 0x5FA1 # +0x537A 0x6108 # +0x537B 0x6B32 # +0x537C 0x72F1 # +0x537D 0x80B2 # +0x537E 0x8A89 # +0x5421 0x6D74 # +0x5422 0x5BD3 # +0x5423 0x88D5 # +0x5424 0x9884 # +0x5425 0x8C6B # +0x5426 0x9A6D # +0x5427 0x9E33 # +0x5428 0x6E0A # +0x5429 0x51A4 # +0x542A 0x5143 # +0x542B 0x57A3 # +0x542C 0x8881 # +0x542D 0x539F # +0x542E 0x63F4 # +0x542F 0x8F95 # +0x5430 0x56ED # +0x5431 0x5458 # +0x5432 0x5706 # +0x5433 0x733F # +0x5434 0x6E90 # +0x5435 0x7F18 # +0x5436 0x8FDC # +0x5437 0x82D1 # +0x5438 0x613F # +0x5439 0x6028 # +0x543A 0x9662 # +0x543B 0x66F0 # +0x543C 0x7EA6 # +0x543D 0x8D8A # +0x543E 0x8DC3 # +0x543F 0x94A5 # +0x5440 0x5CB3 # +0x5441 0x7CA4 # +0x5442 0x6708 # +0x5443 0x60A6 # +0x5444 0x9605 # +0x5445 0x8018 # +0x5446 0x4E91 # +0x5447 0x90E7 # +0x5448 0x5300 # +0x5449 0x9668 # +0x544A 0x5141 # +0x544B 0x8FD0 # +0x544C 0x8574 # +0x544D 0x915D # +0x544E 0x6655 # +0x544F 0x97F5 # +0x5450 0x5B55 # +0x5451 0x531D # +0x5452 0x7838 # +0x5453 0x6742 # +0x5454 0x683D # +0x5455 0x54C9 # +0x5456 0x707E # +0x5457 0x5BB0 # +0x5458 0x8F7D # +0x5459 0x518D # +0x545A 0x5728 # +0x545B 0x54B1 # +0x545C 0x6512 # +0x545D 0x6682 # +0x545E 0x8D5E # +0x545F 0x8D43 # +0x5460 0x810F # +0x5461 0x846C # +0x5462 0x906D # +0x5463 0x7CDF # +0x5464 0x51FF # +0x5465 0x85FB # +0x5466 0x67A3 # +0x5467 0x65E9 # +0x5468 0x6FA1 # +0x5469 0x86A4 # +0x546A 0x8E81 # +0x546B 0x566A # +0x546C 0x9020 # +0x546D 0x7682 # +0x546E 0x7076 # +0x546F 0x71E5 # +0x5470 0x8D23 # +0x5471 0x62E9 # +0x5472 0x5219 # +0x5473 0x6CFD # +0x5474 0x8D3C # +0x5475 0x600E # +0x5476 0x589E # +0x5477 0x618E # +0x5478 0x66FE # +0x5479 0x8D60 # +0x547A 0x624E # +0x547B 0x55B3 # +0x547C 0x6E23 # +0x547D 0x672D # +0x547E 0x8F67 # +0x5521 0x94E1 # +0x5522 0x95F8 # +0x5523 0x7728 # +0x5524 0x6805 # +0x5525 0x69A8 # +0x5526 0x548B # +0x5527 0x4E4D # +0x5528 0x70B8 # +0x5529 0x8BC8 # +0x552A 0x6458 # +0x552B 0x658B # +0x552C 0x5B85 # +0x552D 0x7A84 # +0x552E 0x503A # +0x552F 0x5BE8 # +0x5530 0x77BB # +0x5531 0x6BE1 # +0x5532 0x8A79 # +0x5533 0x7C98 # +0x5534 0x6CBE # +0x5535 0x76CF # +0x5536 0x65A9 # +0x5537 0x8F97 # +0x5538 0x5D2D # +0x5539 0x5C55 # +0x553A 0x8638 # +0x553B 0x6808 # +0x553C 0x5360 # +0x553D 0x6218 # +0x553E 0x7AD9 # +0x553F 0x6E5B # +0x5540 0x7EFD # +0x5541 0x6A1F # +0x5542 0x7AE0 # +0x5543 0x5F70 # +0x5544 0x6F33 # +0x5545 0x5F20 # +0x5546 0x638C # +0x5547 0x6DA8 # +0x5548 0x6756 # +0x5549 0x4E08 # +0x554A 0x5E10 # +0x554B 0x8D26 # +0x554C 0x4ED7 # +0x554D 0x80C0 # +0x554E 0x7634 # +0x554F 0x969C # +0x5550 0x62DB # +0x5551 0x662D # +0x5552 0x627E # +0x5553 0x6CBC # +0x5554 0x8D75 # +0x5555 0x7167 # +0x5556 0x7F69 # +0x5557 0x5146 # +0x5558 0x8087 # +0x5559 0x53EC # +0x555A 0x906E # +0x555B 0x6298 # +0x555C 0x54F2 # +0x555D 0x86F0 # +0x555E 0x8F99 # +0x555F 0x8005 # +0x5560 0x9517 # +0x5561 0x8517 # +0x5562 0x8FD9 # +0x5563 0x6D59 # +0x5564 0x73CD # +0x5565 0x659F # +0x5566 0x771F # +0x5567 0x7504 # +0x5568 0x7827 # +0x5569 0x81FB # +0x556A 0x8D1E # +0x556B 0x9488 # +0x556C 0x4FA6 # +0x556D 0x6795 # +0x556E 0x75B9 # +0x556F 0x8BCA # +0x5570 0x9707 # +0x5571 0x632F # +0x5572 0x9547 # +0x5573 0x9635 # +0x5574 0x84B8 # +0x5575 0x6323 # +0x5576 0x7741 # +0x5577 0x5F81 # +0x5578 0x72F0 # +0x5579 0x4E89 # +0x557A 0x6014 # +0x557B 0x6574 # +0x557C 0x62EF # +0x557D 0x6B63 # +0x557E 0x653F # +0x5621 0x5E27 # +0x5622 0x75C7 # +0x5623 0x90D1 # +0x5624 0x8BC1 # +0x5625 0x829D # +0x5626 0x679D # +0x5627 0x652F # +0x5628 0x5431 # +0x5629 0x8718 # +0x562A 0x77E5 # +0x562B 0x80A2 # +0x562C 0x8102 # +0x562D 0x6C41 # +0x562E 0x4E4B # +0x562F 0x7EC7 # +0x5630 0x804C # +0x5631 0x76F4 # +0x5632 0x690D # +0x5633 0x6B96 # +0x5634 0x6267 # +0x5635 0x503C # +0x5636 0x4F84 # +0x5637 0x5740 # +0x5638 0x6307 # +0x5639 0x6B62 # +0x563A 0x8DBE # +0x563B 0x53EA # +0x563C 0x65E8 # +0x563D 0x7EB8 # +0x563E 0x5FD7 # +0x563F 0x631A # +0x5640 0x63B7 # +0x5641 0x81F3 # +0x5642 0x81F4 # +0x5643 0x7F6E # +0x5644 0x5E1C # +0x5645 0x5CD9 # +0x5646 0x5236 # +0x5647 0x667A # +0x5648 0x79E9 # +0x5649 0x7A1A # +0x564A 0x8D28 # +0x564B 0x7099 # +0x564C 0x75D4 # +0x564D 0x6EDE # +0x564E 0x6CBB # +0x564F 0x7A92 # +0x5650 0x4E2D # +0x5651 0x76C5 # +0x5652 0x5FE0 # +0x5653 0x949F # +0x5654 0x8877 # +0x5655 0x7EC8 # +0x5656 0x79CD # +0x5657 0x80BF # +0x5658 0x91CD # +0x5659 0x4EF2 # +0x565A 0x4F17 # +0x565B 0x821F # +0x565C 0x5468 # +0x565D 0x5DDE # +0x565E 0x6D32 # +0x565F 0x8BCC # +0x5660 0x7CA5 # +0x5661 0x8F74 # +0x5662 0x8098 # +0x5663 0x5E1A # +0x5664 0x5492 # +0x5665 0x76B1 # +0x5666 0x5B99 # +0x5667 0x663C # +0x5668 0x9AA4 # +0x5669 0x73E0 # +0x566A 0x682A # +0x566B 0x86DB # +0x566C 0x6731 # +0x566D 0x732A # +0x566E 0x8BF8 # +0x566F 0x8BDB # +0x5670 0x9010 # +0x5671 0x7AF9 # +0x5672 0x70DB # +0x5673 0x716E # +0x5674 0x62C4 # +0x5675 0x77A9 # +0x5676 0x5631 # +0x5677 0x4E3B # +0x5678 0x8457 # +0x5679 0x67F1 # +0x567A 0x52A9 # +0x567B 0x86C0 # +0x567C 0x8D2E # +0x567D 0x94F8 # +0x567E 0x7B51 # +0x5721 0x4F4F # +0x5722 0x6CE8 # +0x5723 0x795D # +0x5724 0x9A7B # +0x5725 0x6293 # +0x5726 0x722A # +0x5727 0x62FD # +0x5728 0x4E13 # +0x5729 0x7816 # +0x572A 0x8F6C # +0x572B 0x64B0 # +0x572C 0x8D5A # +0x572D 0x7BC6 # +0x572E 0x6869 # +0x572F 0x5E84 # +0x5730 0x88C5 # +0x5731 0x5986 # +0x5732 0x649E # +0x5733 0x58EE # +0x5734 0x72B6 # +0x5735 0x690E # +0x5736 0x9525 # +0x5737 0x8FFD # +0x5738 0x8D58 # +0x5739 0x5760 # +0x573A 0x7F00 # +0x573B 0x8C06 # +0x573C 0x51C6 # +0x573D 0x6349 # +0x573E 0x62D9 # +0x573F 0x5353 # +0x5740 0x684C # +0x5741 0x7422 # +0x5742 0x8301 # +0x5743 0x914C # +0x5744 0x5544 # +0x5745 0x7740 # +0x5746 0x707C # +0x5747 0x6D4A # +0x5748 0x5179 # +0x5749 0x54A8 # +0x574A 0x8D44 # +0x574B 0x59FF # +0x574C 0x6ECB # +0x574D 0x6DC4 # +0x574E 0x5B5C # +0x574F 0x7D2B # +0x5750 0x4ED4 # +0x5751 0x7C7D # +0x5752 0x6ED3 # +0x5753 0x5B50 # +0x5754 0x81EA # +0x5755 0x6E0D # +0x5756 0x5B57 # +0x5757 0x9B03 # +0x5758 0x68D5 # +0x5759 0x8E2A # +0x575A 0x5B97 # +0x575B 0x7EFC # +0x575C 0x603B # +0x575D 0x7EB5 # +0x575E 0x90B9 # +0x575F 0x8D70 # +0x5760 0x594F # +0x5761 0x63CD # +0x5762 0x79DF # +0x5763 0x8DB3 # +0x5764 0x5352 # +0x5765 0x65CF # +0x5766 0x7956 # +0x5767 0x8BC5 # +0x5768 0x963B # +0x5769 0x7EC4 # +0x576A 0x94BB # +0x576B 0x7E82 # +0x576C 0x5634 # +0x576D 0x9189 # +0x576E 0x6700 # +0x576F 0x7F6A # +0x5770 0x5C0A # +0x5771 0x9075 # +0x5772 0x6628 # +0x5773 0x5DE6 # +0x5774 0x4F50 # +0x5775 0x67DE # +0x5776 0x505A # +0x5777 0x4F5C # +0x5778 0x5750 # +0x5779 0x5EA7 # +0x5821 0x4E8D # +0x5822 0x4E0C # +0x5823 0x5140 # +0x5824 0x4E10 # +0x5825 0x5EFF # +0x5826 0x5345 # +0x5827 0x4E15 # +0x5828 0x4E98 # +0x5829 0x4E1E # +0x582A 0x9B32 # +0x582B 0x5B6C # +0x582C 0x5669 # +0x582D 0x4E28 # +0x582E 0x79BA # +0x582F 0x4E3F # +0x5830 0x5315 # +0x5831 0x4E47 # +0x5832 0x592D # +0x5833 0x723B # +0x5834 0x536E # +0x5835 0x6C10 # +0x5836 0x56DF # +0x5837 0x80E4 # +0x5838 0x9997 # +0x5839 0x6BD3 # +0x583A 0x777E # +0x583B 0x9F17 # +0x583C 0x4E36 # +0x583D 0x4E9F # +0x583E 0x9F10 # +0x583F 0x4E5C # +0x5840 0x4E69 # +0x5841 0x4E93 # +0x5842 0x8288 # +0x5843 0x5B5B # +0x5844 0x556C # +0x5845 0x560F # +0x5846 0x4EC4 # +0x5847 0x538D # +0x5848 0x539D # +0x5849 0x53A3 # +0x584A 0x53A5 # +0x584B 0x53AE # +0x584C 0x9765 # +0x584D 0x8D5D # +0x584E 0x531A # +0x584F 0x53F5 # +0x5850 0x5326 # +0x5851 0x532E # +0x5852 0x533E # +0x5853 0x8D5C # +0x5854 0x5366 # +0x5855 0x5363 # +0x5856 0x5202 # +0x5857 0x5208 # +0x5858 0x520E # +0x5859 0x522D # +0x585A 0x5233 # +0x585B 0x523F # +0x585C 0x5240 # +0x585D 0x524C # +0x585E 0x525E # +0x585F 0x5261 # +0x5860 0x525C # +0x5861 0x84AF # +0x5862 0x527D # +0x5863 0x5282 # +0x5864 0x5281 # +0x5865 0x5290 # +0x5866 0x5293 # +0x5867 0x5182 # +0x5868 0x7F54 # +0x5869 0x4EBB # +0x586A 0x4EC3 # +0x586B 0x4EC9 # +0x586C 0x4EC2 # +0x586D 0x4EE8 # +0x586E 0x4EE1 # +0x586F 0x4EEB # +0x5870 0x4EDE # +0x5871 0x4F1B # +0x5872 0x4EF3 # +0x5873 0x4F22 # +0x5874 0x4F64 # +0x5875 0x4EF5 # +0x5876 0x4F25 # +0x5877 0x4F27 # +0x5878 0x4F09 # +0x5879 0x4F2B # +0x587A 0x4F5E # +0x587B 0x4F67 # +0x587C 0x6538 # +0x587D 0x4F5A # +0x587E 0x4F5D # +0x5921 0x4F5F # +0x5922 0x4F57 # +0x5923 0x4F32 # +0x5924 0x4F3D # +0x5925 0x4F76 # +0x5926 0x4F74 # +0x5927 0x4F91 # +0x5928 0x4F89 # +0x5929 0x4F83 # +0x592A 0x4F8F # +0x592B 0x4F7E # +0x592C 0x4F7B # +0x592D 0x4FAA # +0x592E 0x4F7C # +0x592F 0x4FAC # +0x5930 0x4F94 # +0x5931 0x4FE6 # +0x5932 0x4FE8 # +0x5933 0x4FEA # +0x5934 0x4FC5 # +0x5935 0x4FDA # +0x5936 0x4FE3 # +0x5937 0x4FDC # +0x5938 0x4FD1 # +0x5939 0x4FDF # +0x593A 0x4FF8 # +0x593B 0x5029 # +0x593C 0x504C # +0x593D 0x4FF3 # +0x593E 0x502C # +0x593F 0x500F # +0x5940 0x502E # +0x5941 0x502D # +0x5942 0x4FFE # +0x5943 0x501C # +0x5944 0x500C # +0x5945 0x5025 # +0x5946 0x5028 # +0x5947 0x507E # +0x5948 0x5043 # +0x5949 0x5055 # +0x594A 0x5048 # +0x594B 0x504E # +0x594C 0x506C # +0x594D 0x507B # +0x594E 0x50A5 # +0x594F 0x50A7 # +0x5950 0x50A9 # +0x5951 0x50BA # +0x5952 0x50D6 # +0x5953 0x5106 # +0x5954 0x50ED # +0x5955 0x50EC # +0x5956 0x50E6 # +0x5957 0x50EE # +0x5958 0x5107 # +0x5959 0x510B # +0x595A 0x4EDD # +0x595B 0x6C3D # +0x595C 0x4F58 # +0x595D 0x4F65 # +0x595E 0x4FCE # +0x595F 0x9FA0 # +0x5960 0x6C46 # +0x5961 0x7C74 # +0x5962 0x516E # +0x5963 0x5DFD # +0x5964 0x9EC9 # +0x5965 0x9998 # +0x5966 0x5181 # +0x5967 0x5914 # +0x5968 0x52F9 # +0x5969 0x530D # +0x596A 0x8A07 # +0x596B 0x5310 # +0x596C 0x51EB # +0x596D 0x5919 # +0x596E 0x5155 # +0x596F 0x4EA0 # +0x5970 0x5156 # +0x5971 0x4EB3 # +0x5972 0x886E # +0x5973 0x88A4 # +0x5974 0x4EB5 # +0x5975 0x8114 # +0x5976 0x88D2 # +0x5977 0x7980 # +0x5978 0x5B34 # +0x5979 0x8803 # +0x597A 0x7FB8 # +0x597B 0x51AB # +0x597C 0x51B1 # +0x597D 0x51BD # +0x597E 0x51BC # +0x5A21 0x51C7 # +0x5A22 0x5196 # +0x5A23 0x51A2 # +0x5A24 0x51A5 # +0x5A25 0x8BA0 # +0x5A26 0x8BA6 # +0x5A27 0x8BA7 # +0x5A28 0x8BAA # +0x5A29 0x8BB4 # +0x5A2A 0x8BB5 # +0x5A2B 0x8BB7 # +0x5A2C 0x8BC2 # +0x5A2D 0x8BC3 # +0x5A2E 0x8BCB # +0x5A2F 0x8BCF # +0x5A30 0x8BCE # +0x5A31 0x8BD2 # +0x5A32 0x8BD3 # +0x5A33 0x8BD4 # +0x5A34 0x8BD6 # +0x5A35 0x8BD8 # +0x5A36 0x8BD9 # +0x5A37 0x8BDC # +0x5A38 0x8BDF # +0x5A39 0x8BE0 # +0x5A3A 0x8BE4 # +0x5A3B 0x8BE8 # +0x5A3C 0x8BE9 # +0x5A3D 0x8BEE # +0x5A3E 0x8BF0 # +0x5A3F 0x8BF3 # +0x5A40 0x8BF6 # +0x5A41 0x8BF9 # +0x5A42 0x8BFC # +0x5A43 0x8BFF # +0x5A44 0x8C00 # +0x5A45 0x8C02 # +0x5A46 0x8C04 # +0x5A47 0x8C07 # +0x5A48 0x8C0C # +0x5A49 0x8C0F # +0x5A4A 0x8C11 # +0x5A4B 0x8C12 # +0x5A4C 0x8C14 # +0x5A4D 0x8C15 # +0x5A4E 0x8C16 # +0x5A4F 0x8C19 # +0x5A50 0x8C1B # +0x5A51 0x8C18 # +0x5A52 0x8C1D # +0x5A53 0x8C1F # +0x5A54 0x8C20 # +0x5A55 0x8C21 # +0x5A56 0x8C25 # +0x5A57 0x8C27 # +0x5A58 0x8C2A # +0x5A59 0x8C2B # +0x5A5A 0x8C2E # +0x5A5B 0x8C2F # +0x5A5C 0x8C32 # +0x5A5D 0x8C33 # +0x5A5E 0x8C35 # +0x5A5F 0x8C36 # +0x5A60 0x5369 # +0x5A61 0x537A # +0x5A62 0x961D # +0x5A63 0x9622 # +0x5A64 0x9621 # +0x5A65 0x9631 # +0x5A66 0x962A # +0x5A67 0x963D # +0x5A68 0x963C # +0x5A69 0x9642 # +0x5A6A 0x9649 # +0x5A6B 0x9654 # +0x5A6C 0x965F # +0x5A6D 0x9667 # +0x5A6E 0x966C # +0x5A6F 0x9672 # +0x5A70 0x9674 # +0x5A71 0x9688 # +0x5A72 0x968D # +0x5A73 0x9697 # +0x5A74 0x96B0 # +0x5A75 0x9097 # +0x5A76 0x909B # +0x5A77 0x909D # +0x5A78 0x9099 # +0x5A79 0x90AC # +0x5A7A 0x90A1 # +0x5A7B 0x90B4 # +0x5A7C 0x90B3 # +0x5A7D 0x90B6 # +0x5A7E 0x90BA # +0x5B21 0x90B8 # +0x5B22 0x90B0 # +0x5B23 0x90CF # +0x5B24 0x90C5 # +0x5B25 0x90BE # +0x5B26 0x90D0 # +0x5B27 0x90C4 # +0x5B28 0x90C7 # +0x5B29 0x90D3 # +0x5B2A 0x90E6 # +0x5B2B 0x90E2 # +0x5B2C 0x90DC # +0x5B2D 0x90D7 # +0x5B2E 0x90DB # +0x5B2F 0x90EB # +0x5B30 0x90EF # +0x5B31 0x90FE # +0x5B32 0x9104 # +0x5B33 0x9122 # +0x5B34 0x911E # +0x5B35 0x9123 # +0x5B36 0x9131 # +0x5B37 0x912F # +0x5B38 0x9139 # +0x5B39 0x9143 # +0x5B3A 0x9146 # +0x5B3B 0x520D # +0x5B3C 0x5942 # +0x5B3D 0x52A2 # +0x5B3E 0x52AC # +0x5B3F 0x52AD # +0x5B40 0x52BE # +0x5B41 0x54FF # +0x5B42 0x52D0 # +0x5B43 0x52D6 # +0x5B44 0x52F0 # +0x5B45 0x53DF # +0x5B46 0x71EE # +0x5B47 0x77CD # +0x5B48 0x5EF4 # +0x5B49 0x51F5 # +0x5B4A 0x51FC # +0x5B4B 0x9B2F # +0x5B4C 0x53B6 # +0x5B4D 0x5F01 # +0x5B4E 0x755A # +0x5B4F 0x5DEF # +0x5B50 0x574C # +0x5B51 0x57A9 # +0x5B52 0x57A1 # +0x5B53 0x587E # +0x5B54 0x58BC # +0x5B55 0x58C5 # +0x5B56 0x58D1 # +0x5B57 0x5729 # +0x5B58 0x572C # +0x5B59 0x572A # +0x5B5A 0x5733 # +0x5B5B 0x5739 # +0x5B5C 0x572E # +0x5B5D 0x572F # +0x5B5E 0x575C # +0x5B5F 0x573B # +0x5B60 0x5742 # +0x5B61 0x5769 # +0x5B62 0x5785 # +0x5B63 0x576B # +0x5B64 0x5786 # +0x5B65 0x577C # +0x5B66 0x577B # +0x5B67 0x5768 # +0x5B68 0x576D # +0x5B69 0x5776 # +0x5B6A 0x5773 # +0x5B6B 0x57AD # +0x5B6C 0x57A4 # +0x5B6D 0x578C # +0x5B6E 0x57B2 # +0x5B6F 0x57CF # +0x5B70 0x57A7 # +0x5B71 0x57B4 # +0x5B72 0x5793 # +0x5B73 0x57A0 # +0x5B74 0x57D5 # +0x5B75 0x57D8 # +0x5B76 0x57DA # +0x5B77 0x57D9 # +0x5B78 0x57D2 # +0x5B79 0x57B8 # +0x5B7A 0x57F4 # +0x5B7B 0x57EF # +0x5B7C 0x57F8 # +0x5B7D 0x57E4 # +0x5B7E 0x57DD # +0x5C21 0x580B # +0x5C22 0x580D # +0x5C23 0x57FD # +0x5C24 0x57ED # +0x5C25 0x5800 # +0x5C26 0x581E # +0x5C27 0x5819 # +0x5C28 0x5844 # +0x5C29 0x5820 # +0x5C2A 0x5865 # +0x5C2B 0x586C # +0x5C2C 0x5881 # +0x5C2D 0x5889 # +0x5C2E 0x589A # +0x5C2F 0x5880 # +0x5C30 0x99A8 # +0x5C31 0x9F19 # +0x5C32 0x61FF # +0x5C33 0x8279 # +0x5C34 0x827D # +0x5C35 0x827F # +0x5C36 0x828F # +0x5C37 0x828A # +0x5C38 0x82A8 # +0x5C39 0x8284 # +0x5C3A 0x828E # +0x5C3B 0x8291 # +0x5C3C 0x8297 # +0x5C3D 0x8299 # +0x5C3E 0x82AB # +0x5C3F 0x82B8 # +0x5C40 0x82BE # +0x5C41 0x82B0 # +0x5C42 0x82C8 # +0x5C43 0x82CA # +0x5C44 0x82E3 # +0x5C45 0x8298 # +0x5C46 0x82B7 # +0x5C47 0x82AE # +0x5C48 0x82CB # +0x5C49 0x82CC # +0x5C4A 0x82C1 # +0x5C4B 0x82A9 # +0x5C4C 0x82B4 # +0x5C4D 0x82A1 # +0x5C4E 0x82AA # +0x5C4F 0x829F # +0x5C50 0x82C4 # +0x5C51 0x82CE # +0x5C52 0x82A4 # +0x5C53 0x82E1 # +0x5C54 0x8309 # +0x5C55 0x82F7 # +0x5C56 0x82E4 # +0x5C57 0x830F # +0x5C58 0x8307 # +0x5C59 0x82DC # +0x5C5A 0x82F4 # +0x5C5B 0x82D2 # +0x5C5C 0x82D8 # +0x5C5D 0x830C # +0x5C5E 0x82FB # +0x5C5F 0x82D3 # +0x5C60 0x8311 # +0x5C61 0x831A # +0x5C62 0x8306 # +0x5C63 0x8314 # +0x5C64 0x8315 # +0x5C65 0x82E0 # +0x5C66 0x82D5 # +0x5C67 0x831C # +0x5C68 0x8351 # +0x5C69 0x835B # +0x5C6A 0x835C # +0x5C6B 0x8308 # +0x5C6C 0x8392 # +0x5C6D 0x833C # +0x5C6E 0x8334 # +0x5C6F 0x8331 # +0x5C70 0x839B # +0x5C71 0x835E # +0x5C72 0x832F # +0x5C73 0x834F # +0x5C74 0x8347 # +0x5C75 0x8343 # +0x5C76 0x835F # +0x5C77 0x8340 # +0x5C78 0x8317 # +0x5C79 0x8360 # +0x5C7A 0x832D # +0x5C7B 0x833A # +0x5C7C 0x8333 # +0x5C7D 0x8366 # +0x5C7E 0x8365 # +0x5D21 0x8368 # +0x5D22 0x831B # +0x5D23 0x8369 # +0x5D24 0x836C # +0x5D25 0x836A # +0x5D26 0x836D # +0x5D27 0x836E # +0x5D28 0x83B0 # +0x5D29 0x8378 # +0x5D2A 0x83B3 # +0x5D2B 0x83B4 # +0x5D2C 0x83A0 # +0x5D2D 0x83AA # +0x5D2E 0x8393 # +0x5D2F 0x839C # +0x5D30 0x8385 # +0x5D31 0x837C # +0x5D32 0x83B6 # +0x5D33 0x83A9 # +0x5D34 0x837D # +0x5D35 0x83B8 # +0x5D36 0x837B # +0x5D37 0x8398 # +0x5D38 0x839E # +0x5D39 0x83A8 # +0x5D3A 0x83BA # +0x5D3B 0x83BC # +0x5D3C 0x83C1 # +0x5D3D 0x8401 # +0x5D3E 0x83E5 # +0x5D3F 0x83D8 # +0x5D40 0x5807 # +0x5D41 0x8418 # +0x5D42 0x840B # +0x5D43 0x83DD # +0x5D44 0x83FD # +0x5D45 0x83D6 # +0x5D46 0x841C # +0x5D47 0x8438 # +0x5D48 0x8411 # +0x5D49 0x8406 # +0x5D4A 0x83D4 # +0x5D4B 0x83DF # +0x5D4C 0x840F # +0x5D4D 0x8403 # +0x5D4E 0x83F8 # +0x5D4F 0x83F9 # +0x5D50 0x83EA # +0x5D51 0x83C5 # +0x5D52 0x83C0 # +0x5D53 0x8426 # +0x5D54 0x83F0 # +0x5D55 0x83E1 # +0x5D56 0x845C # +0x5D57 0x8451 # +0x5D58 0x845A # +0x5D59 0x8459 # +0x5D5A 0x8473 # +0x5D5B 0x8487 # +0x5D5C 0x8488 # +0x5D5D 0x847A # +0x5D5E 0x8489 # +0x5D5F 0x8478 # +0x5D60 0x843C # +0x5D61 0x8446 # +0x5D62 0x8469 # +0x5D63 0x8476 # +0x5D64 0x848C # +0x5D65 0x848E # +0x5D66 0x8431 # +0x5D67 0x846D # +0x5D68 0x84C1 # +0x5D69 0x84CD # +0x5D6A 0x84D0 # +0x5D6B 0x84E6 # +0x5D6C 0x84BD # +0x5D6D 0x84D3 # +0x5D6E 0x84CA # +0x5D6F 0x84BF # +0x5D70 0x84BA # +0x5D71 0x84E0 # +0x5D72 0x84A1 # +0x5D73 0x84B9 # +0x5D74 0x84B4 # +0x5D75 0x8497 # +0x5D76 0x84E5 # +0x5D77 0x84E3 # +0x5D78 0x850C # +0x5D79 0x750D # +0x5D7A 0x8538 # +0x5D7B 0x84F0 # +0x5D7C 0x8539 # +0x5D7D 0x851F # +0x5D7E 0x853A # +0x5E21 0x8556 # +0x5E22 0x853B # +0x5E23 0x84FF # +0x5E24 0x84FC # +0x5E25 0x8559 # +0x5E26 0x8548 # +0x5E27 0x8568 # +0x5E28 0x8564 # +0x5E29 0x855E # +0x5E2A 0x857A # +0x5E2B 0x77A2 # +0x5E2C 0x8543 # +0x5E2D 0x8572 # +0x5E2E 0x857B # +0x5E2F 0x85A4 # +0x5E30 0x85A8 # +0x5E31 0x8587 # +0x5E32 0x858F # +0x5E33 0x8579 # +0x5E34 0x85AE # +0x5E35 0x859C # +0x5E36 0x8585 # +0x5E37 0x85B9 # +0x5E38 0x85B7 # +0x5E39 0x85B0 # +0x5E3A 0x85D3 # +0x5E3B 0x85C1 # +0x5E3C 0x85DC # +0x5E3D 0x85FF # +0x5E3E 0x8627 # +0x5E3F 0x8605 # +0x5E40 0x8629 # +0x5E41 0x8616 # +0x5E42 0x863C # +0x5E43 0x5EFE # +0x5E44 0x5F08 # +0x5E45 0x593C # +0x5E46 0x5941 # +0x5E47 0x8037 # +0x5E48 0x5955 # +0x5E49 0x595A # +0x5E4A 0x5958 # +0x5E4B 0x530F # +0x5E4C 0x5C22 # +0x5E4D 0x5C25 # +0x5E4E 0x5C2C # +0x5E4F 0x5C34 # +0x5E50 0x624C # +0x5E51 0x626A # +0x5E52 0x629F # +0x5E53 0x62BB # +0x5E54 0x62CA # +0x5E55 0x62DA # +0x5E56 0x62D7 # +0x5E57 0x62EE # +0x5E58 0x6322 # +0x5E59 0x62F6 # +0x5E5A 0x6339 # +0x5E5B 0x634B # +0x5E5C 0x6343 # +0x5E5D 0x63AD # +0x5E5E 0x63F6 # +0x5E5F 0x6371 # +0x5E60 0x637A # +0x5E61 0x638E # +0x5E62 0x63B4 # +0x5E63 0x636D # +0x5E64 0x63AC # +0x5E65 0x638A # +0x5E66 0x6369 # +0x5E67 0x63AE # +0x5E68 0x63BC # +0x5E69 0x63F2 # +0x5E6A 0x63F8 # +0x5E6B 0x63E0 # +0x5E6C 0x63FF # +0x5E6D 0x63C4 # +0x5E6E 0x63DE # +0x5E6F 0x63CE # +0x5E70 0x6452 # +0x5E71 0x63C6 # +0x5E72 0x63BE # +0x5E73 0x6445 # +0x5E74 0x6441 # +0x5E75 0x640B # +0x5E76 0x641B # +0x5E77 0x6420 # +0x5E78 0x640C # +0x5E79 0x6426 # +0x5E7A 0x6421 # +0x5E7B 0x645E # +0x5E7C 0x6484 # +0x5E7D 0x646D # +0x5E7E 0x6496 # +0x5F21 0x647A # +0x5F22 0x64B7 # +0x5F23 0x64B8 # +0x5F24 0x6499 # +0x5F25 0x64BA # +0x5F26 0x64C0 # +0x5F27 0x64D0 # +0x5F28 0x64D7 # +0x5F29 0x64E4 # +0x5F2A 0x64E2 # +0x5F2B 0x6509 # +0x5F2C 0x6525 # +0x5F2D 0x652E # +0x5F2E 0x5F0B # +0x5F2F 0x5FD2 # +0x5F30 0x7519 # +0x5F31 0x5F11 # +0x5F32 0x535F # +0x5F33 0x53F1 # +0x5F34 0x53FD # +0x5F35 0x53E9 # +0x5F36 0x53E8 # +0x5F37 0x53FB # +0x5F38 0x5412 # +0x5F39 0x5416 # +0x5F3A 0x5406 # +0x5F3B 0x544B # +0x5F3C 0x5452 # +0x5F3D 0x5453 # +0x5F3E 0x5454 # +0x5F3F 0x5456 # +0x5F40 0x5443 # +0x5F41 0x5421 # +0x5F42 0x5457 # +0x5F43 0x5459 # +0x5F44 0x5423 # +0x5F45 0x5432 # +0x5F46 0x5482 # +0x5F47 0x5494 # +0x5F48 0x5477 # +0x5F49 0x5471 # +0x5F4A 0x5464 # +0x5F4B 0x549A # +0x5F4C 0x549B # +0x5F4D 0x5484 # +0x5F4E 0x5476 # +0x5F4F 0x5466 # +0x5F50 0x549D # +0x5F51 0x54D0 # +0x5F52 0x54AD # +0x5F53 0x54C2 # +0x5F54 0x54B4 # +0x5F55 0x54D2 # +0x5F56 0x54A7 # +0x5F57 0x54A6 # +0x5F58 0x54D3 # +0x5F59 0x54D4 # +0x5F5A 0x5472 # +0x5F5B 0x54A3 # +0x5F5C 0x54D5 # +0x5F5D 0x54BB # +0x5F5E 0x54BF # +0x5F5F 0x54CC # +0x5F60 0x54D9 # +0x5F61 0x54DA # +0x5F62 0x54DC # +0x5F63 0x54A9 # +0x5F64 0x54AA # +0x5F65 0x54A4 # +0x5F66 0x54DD # +0x5F67 0x54CF # +0x5F68 0x54DE # +0x5F69 0x551B # +0x5F6A 0x54E7 # +0x5F6B 0x5520 # +0x5F6C 0x54FD # +0x5F6D 0x5514 # +0x5F6E 0x54F3 # +0x5F6F 0x5522 # +0x5F70 0x5523 # +0x5F71 0x550F # +0x5F72 0x5511 # +0x5F73 0x5527 # +0x5F74 0x552A # +0x5F75 0x5567 # +0x5F76 0x558F # +0x5F77 0x55B5 # +0x5F78 0x5549 # +0x5F79 0x556D # +0x5F7A 0x5541 # +0x5F7B 0x5555 # +0x5F7C 0x553F # +0x5F7D 0x5550 # +0x5F7E 0x553C # +0x6021 0x5537 # +0x6022 0x5556 # +0x6023 0x5575 # +0x6024 0x5576 # +0x6025 0x5577 # +0x6026 0x5533 # +0x6027 0x5530 # +0x6028 0x555C # +0x6029 0x558B # +0x602A 0x55D2 # +0x602B 0x5583 # +0x602C 0x55B1 # +0x602D 0x55B9 # +0x602E 0x5588 # +0x602F 0x5581 # +0x6030 0x559F # +0x6031 0x557E # +0x6032 0x55D6 # +0x6033 0x5591 # +0x6034 0x557B # +0x6035 0x55DF # +0x6036 0x55BD # +0x6037 0x55BE # +0x6038 0x5594 # +0x6039 0x5599 # +0x603A 0x55EA # +0x603B 0x55F7 # +0x603C 0x55C9 # +0x603D 0x561F # +0x603E 0x55D1 # +0x603F 0x55EB # +0x6040 0x55EC # +0x6041 0x55D4 # +0x6042 0x55E6 # +0x6043 0x55DD # +0x6044 0x55C4 # +0x6045 0x55EF # +0x6046 0x55E5 # +0x6047 0x55F2 # +0x6048 0x55F3 # +0x6049 0x55CC # +0x604A 0x55CD # +0x604B 0x55E8 # +0x604C 0x55F5 # +0x604D 0x55E4 # +0x604E 0x8F94 # +0x604F 0x561E # +0x6050 0x5608 # +0x6051 0x560C # +0x6052 0x5601 # +0x6053 0x5624 # +0x6054 0x5623 # +0x6055 0x55FE # +0x6056 0x5600 # +0x6057 0x5627 # +0x6058 0x562D # +0x6059 0x5658 # +0x605A 0x5639 # +0x605B 0x5657 # +0x605C 0x562C # +0x605D 0x564D # +0x605E 0x5662 # +0x605F 0x5659 # +0x6060 0x565C # +0x6061 0x564C # +0x6062 0x5654 # +0x6063 0x5686 # +0x6064 0x5664 # +0x6065 0x5671 # +0x6066 0x566B # +0x6067 0x567B # +0x6068 0x567C # +0x6069 0x5685 # +0x606A 0x5693 # +0x606B 0x56AF # +0x606C 0x56D4 # +0x606D 0x56D7 # +0x606E 0x56DD # +0x606F 0x56E1 # +0x6070 0x56F5 # +0x6071 0x56EB # +0x6072 0x56F9 # +0x6073 0x56FF # +0x6074 0x5704 # +0x6075 0x570A # +0x6076 0x5709 # +0x6077 0x571C # +0x6078 0x5E0F # +0x6079 0x5E19 # +0x607A 0x5E14 # +0x607B 0x5E11 # +0x607C 0x5E31 # +0x607D 0x5E3B # +0x607E 0x5E3C # +0x6121 0x5E37 # +0x6122 0x5E44 # +0x6123 0x5E54 # +0x6124 0x5E5B # +0x6125 0x5E5E # +0x6126 0x5E61 # +0x6127 0x5C8C # +0x6128 0x5C7A # +0x6129 0x5C8D # +0x612A 0x5C90 # +0x612B 0x5C96 # +0x612C 0x5C88 # +0x612D 0x5C98 # +0x612E 0x5C99 # +0x612F 0x5C91 # +0x6130 0x5C9A # +0x6131 0x5C9C # +0x6132 0x5CB5 # +0x6133 0x5CA2 # +0x6134 0x5CBD # +0x6135 0x5CAC # +0x6136 0x5CAB # +0x6137 0x5CB1 # +0x6138 0x5CA3 # +0x6139 0x5CC1 # +0x613A 0x5CB7 # +0x613B 0x5CC4 # +0x613C 0x5CD2 # +0x613D 0x5CE4 # +0x613E 0x5CCB # +0x613F 0x5CE5 # +0x6140 0x5D02 # +0x6141 0x5D03 # +0x6142 0x5D27 # +0x6143 0x5D26 # +0x6144 0x5D2E # +0x6145 0x5D24 # +0x6146 0x5D1E # +0x6147 0x5D06 # +0x6148 0x5D1B # +0x6149 0x5D58 # +0x614A 0x5D3E # +0x614B 0x5D34 # +0x614C 0x5D3D # +0x614D 0x5D6C # +0x614E 0x5D5B # +0x614F 0x5D6F # +0x6150 0x5D5D # +0x6151 0x5D6B # +0x6152 0x5D4B # +0x6153 0x5D4A # +0x6154 0x5D69 # +0x6155 0x5D74 # +0x6156 0x5D82 # +0x6157 0x5D99 # +0x6158 0x5D9D # +0x6159 0x8C73 # +0x615A 0x5DB7 # +0x615B 0x5DC5 # +0x615C 0x5F73 # +0x615D 0x5F77 # +0x615E 0x5F82 # +0x615F 0x5F87 # +0x6160 0x5F89 # +0x6161 0x5F8C # +0x6162 0x5F95 # +0x6163 0x5F99 # +0x6164 0x5F9C # +0x6165 0x5FA8 # +0x6166 0x5FAD # +0x6167 0x5FB5 # +0x6168 0x5FBC # +0x6169 0x8862 # +0x616A 0x5F61 # +0x616B 0x72AD # +0x616C 0x72B0 # +0x616D 0x72B4 # +0x616E 0x72B7 # +0x616F 0x72B8 # +0x6170 0x72C3 # +0x6171 0x72C1 # +0x6172 0x72CE # +0x6173 0x72CD # +0x6174 0x72D2 # +0x6175 0x72E8 # +0x6176 0x72EF # +0x6177 0x72E9 # +0x6178 0x72F2 # +0x6179 0x72F4 # +0x617A 0x72F7 # +0x617B 0x7301 # +0x617C 0x72F3 # +0x617D 0x7303 # +0x617E 0x72FA # +0x6221 0x72FB # +0x6222 0x7317 # +0x6223 0x7313 # +0x6224 0x7321 # +0x6225 0x730A # +0x6226 0x731E # +0x6227 0x731D # +0x6228 0x7315 # +0x6229 0x7322 # +0x622A 0x7339 # +0x622B 0x7325 # +0x622C 0x732C # +0x622D 0x7338 # +0x622E 0x7331 # +0x622F 0x7350 # +0x6230 0x734D # +0x6231 0x7357 # +0x6232 0x7360 # +0x6233 0x736C # +0x6234 0x736F # +0x6235 0x737E # +0x6236 0x821B # +0x6237 0x5925 # +0x6238 0x98E7 # +0x6239 0x5924 # +0x623A 0x5902 # +0x623B 0x9963 # +0x623C 0x9967 # +0x623D 0x9968 # +0x623E 0x9969 # +0x623F 0x996A # +0x6240 0x996B # +0x6241 0x996C # +0x6242 0x9974 # +0x6243 0x9977 # +0x6244 0x997D # +0x6245 0x9980 # +0x6246 0x9984 # +0x6247 0x9987 # +0x6248 0x998A # +0x6249 0x998D # +0x624A 0x9990 # +0x624B 0x9991 # +0x624C 0x9993 # +0x624D 0x9994 # +0x624E 0x9995 # +0x624F 0x5E80 # +0x6250 0x5E91 # +0x6251 0x5E8B # +0x6252 0x5E96 # +0x6253 0x5EA5 # +0x6254 0x5EA0 # +0x6255 0x5EB9 # +0x6256 0x5EB5 # +0x6257 0x5EBE # +0x6258 0x5EB3 # +0x6259 0x8D53 # +0x625A 0x5ED2 # +0x625B 0x5ED1 # +0x625C 0x5EDB # +0x625D 0x5EE8 # +0x625E 0x5EEA # +0x625F 0x81BA # +0x6260 0x5FC4 # +0x6261 0x5FC9 # +0x6262 0x5FD6 # +0x6263 0x5FCF # +0x6264 0x6003 # +0x6265 0x5FEE # +0x6266 0x6004 # +0x6267 0x5FE1 # +0x6268 0x5FE4 # +0x6269 0x5FFE # +0x626A 0x6005 # +0x626B 0x6006 # +0x626C 0x5FEA # +0x626D 0x5FED # +0x626E 0x5FF8 # +0x626F 0x6019 # +0x6270 0x6035 # +0x6271 0x6026 # +0x6272 0x601B # +0x6273 0x600F # +0x6274 0x600D # +0x6275 0x6029 # +0x6276 0x602B # +0x6277 0x600A # +0x6278 0x603F # +0x6279 0x6021 # +0x627A 0x6078 # +0x627B 0x6079 # +0x627C 0x607B # +0x627D 0x607A # +0x627E 0x6042 # +0x6321 0x606A # +0x6322 0x607D # +0x6323 0x6096 # +0x6324 0x609A # +0x6325 0x60AD # +0x6326 0x609D # +0x6327 0x6083 # +0x6328 0x6092 # +0x6329 0x608C # +0x632A 0x609B # +0x632B 0x60EC # +0x632C 0x60BB # +0x632D 0x60B1 # +0x632E 0x60DD # +0x632F 0x60D8 # +0x6330 0x60C6 # +0x6331 0x60DA # +0x6332 0x60B4 # +0x6333 0x6120 # +0x6334 0x6126 # +0x6335 0x6115 # +0x6336 0x6123 # +0x6337 0x60F4 # +0x6338 0x6100 # +0x6339 0x610E # +0x633A 0x612B # +0x633B 0x614A # +0x633C 0x6175 # +0x633D 0x61AC # +0x633E 0x6194 # +0x633F 0x61A7 # +0x6340 0x61B7 # +0x6341 0x61D4 # +0x6342 0x61F5 # +0x6343 0x5FDD # +0x6344 0x96B3 # +0x6345 0x95E9 # +0x6346 0x95EB # +0x6347 0x95F1 # +0x6348 0x95F3 # +0x6349 0x95F5 # +0x634A 0x95F6 # +0x634B 0x95FC # +0x634C 0x95FE # +0x634D 0x9603 # +0x634E 0x9604 # +0x634F 0x9606 # +0x6350 0x9608 # +0x6351 0x960A # +0x6352 0x960B # +0x6353 0x960C # +0x6354 0x960D # +0x6355 0x960F # +0x6356 0x9612 # +0x6357 0x9615 # +0x6358 0x9616 # +0x6359 0x9617 # +0x635A 0x9619 # +0x635B 0x961A # +0x635C 0x4E2C # +0x635D 0x723F # +0x635E 0x6215 # +0x635F 0x6C35 # +0x6360 0x6C54 # +0x6361 0x6C5C # +0x6362 0x6C4A # +0x6363 0x6CA3 # +0x6364 0x6C85 # +0x6365 0x6C90 # +0x6366 0x6C94 # +0x6367 0x6C8C # +0x6368 0x6C68 # +0x6369 0x6C69 # +0x636A 0x6C74 # +0x636B 0x6C76 # +0x636C 0x6C86 # +0x636D 0x6CA9 # +0x636E 0x6CD0 # +0x636F 0x6CD4 # +0x6370 0x6CAD # +0x6371 0x6CF7 # +0x6372 0x6CF8 # +0x6373 0x6CF1 # +0x6374 0x6CD7 # +0x6375 0x6CB2 # +0x6376 0x6CE0 # +0x6377 0x6CD6 # +0x6378 0x6CFA # +0x6379 0x6CEB # +0x637A 0x6CEE # +0x637B 0x6CB1 # +0x637C 0x6CD3 # +0x637D 0x6CEF # +0x637E 0x6CFE # +0x6421 0x6D39 # +0x6422 0x6D27 # +0x6423 0x6D0C # +0x6424 0x6D43 # +0x6425 0x6D48 # +0x6426 0x6D07 # +0x6427 0x6D04 # +0x6428 0x6D19 # +0x6429 0x6D0E # +0x642A 0x6D2B # +0x642B 0x6D4D # +0x642C 0x6D2E # +0x642D 0x6D35 # +0x642E 0x6D1A # +0x642F 0x6D4F # +0x6430 0x6D52 # +0x6431 0x6D54 # +0x6432 0x6D33 # +0x6433 0x6D91 # +0x6434 0x6D6F # +0x6435 0x6D9E # +0x6436 0x6DA0 # +0x6437 0x6D5E # +0x6438 0x6D93 # +0x6439 0x6D94 # +0x643A 0x6D5C # +0x643B 0x6D60 # +0x643C 0x6D7C # +0x643D 0x6D63 # +0x643E 0x6E1A # +0x643F 0x6DC7 # +0x6440 0x6DC5 # +0x6441 0x6DDE # +0x6442 0x6E0E # +0x6443 0x6DBF # +0x6444 0x6DE0 # +0x6445 0x6E11 # +0x6446 0x6DE6 # +0x6447 0x6DDD # +0x6448 0x6DD9 # +0x6449 0x6E16 # +0x644A 0x6DAB # +0x644B 0x6E0C # +0x644C 0x6DAE # +0x644D 0x6E2B # +0x644E 0x6E6E # +0x644F 0x6E4E # +0x6450 0x6E6B # +0x6451 0x6EB2 # +0x6452 0x6E5F # +0x6453 0x6E86 # +0x6454 0x6E53 # +0x6455 0x6E54 # +0x6456 0x6E32 # +0x6457 0x6E25 # +0x6458 0x6E44 # +0x6459 0x6EDF # +0x645A 0x6EB1 # +0x645B 0x6E98 # +0x645C 0x6EE0 # +0x645D 0x6F2D # +0x645E 0x6EE2 # +0x645F 0x6EA5 # +0x6460 0x6EA7 # +0x6461 0x6EBD # +0x6462 0x6EBB # +0x6463 0x6EB7 # +0x6464 0x6ED7 # +0x6465 0x6EB4 # +0x6466 0x6ECF # +0x6467 0x6E8F # +0x6468 0x6EC2 # +0x6469 0x6E9F # +0x646A 0x6F62 # +0x646B 0x6F46 # +0x646C 0x6F47 # +0x646D 0x6F24 # +0x646E 0x6F15 # +0x646F 0x6EF9 # +0x6470 0x6F2F # +0x6471 0x6F36 # +0x6472 0x6F4B # +0x6473 0x6F74 # +0x6474 0x6F2A # +0x6475 0x6F09 # +0x6476 0x6F29 # +0x6477 0x6F89 # +0x6478 0x6F8D # +0x6479 0x6F8C # +0x647A 0x6F78 # +0x647B 0x6F72 # +0x647C 0x6F7C # +0x647D 0x6F7A # +0x647E 0x6FD1 # +0x6521 0x6FC9 # +0x6522 0x6FA7 # +0x6523 0x6FB9 # +0x6524 0x6FB6 # +0x6525 0x6FC2 # +0x6526 0x6FE1 # +0x6527 0x6FEE # +0x6528 0x6FDE # +0x6529 0x6FE0 # +0x652A 0x6FEF # +0x652B 0x701A # +0x652C 0x7023 # +0x652D 0x701B # +0x652E 0x7039 # +0x652F 0x7035 # +0x6530 0x704F # +0x6531 0x705E # +0x6532 0x5B80 # +0x6533 0x5B84 # +0x6534 0x5B95 # +0x6535 0x5B93 # +0x6536 0x5BA5 # +0x6537 0x5BB8 # +0x6538 0x752F # +0x6539 0x9A9E # +0x653A 0x6434 # +0x653B 0x5BE4 # +0x653C 0x5BEE # +0x653D 0x8930 # +0x653E 0x5BF0 # +0x653F 0x8E47 # +0x6540 0x8B07 # +0x6541 0x8FB6 # +0x6542 0x8FD3 # +0x6543 0x8FD5 # +0x6544 0x8FE5 # +0x6545 0x8FEE # +0x6546 0x8FE4 # +0x6547 0x8FE9 # +0x6548 0x8FE6 # +0x6549 0x8FF3 # +0x654A 0x8FE8 # +0x654B 0x9005 # +0x654C 0x9004 # +0x654D 0x900B # +0x654E 0x9026 # +0x654F 0x9011 # +0x6550 0x900D # +0x6551 0x9016 # +0x6552 0x9021 # +0x6553 0x9035 # +0x6554 0x9036 # +0x6555 0x902D # +0x6556 0x902F # +0x6557 0x9044 # +0x6558 0x9051 # +0x6559 0x9052 # +0x655A 0x9050 # +0x655B 0x9068 # +0x655C 0x9058 # +0x655D 0x9062 # +0x655E 0x905B # +0x655F 0x66B9 # +0x6560 0x9074 # +0x6561 0x907D # +0x6562 0x9082 # +0x6563 0x9088 # +0x6564 0x9083 # +0x6565 0x908B # +0x6566 0x5F50 # +0x6567 0x5F57 # +0x6568 0x5F56 # +0x6569 0x5F58 # +0x656A 0x5C3B # +0x656B 0x54AB # +0x656C 0x5C50 # +0x656D 0x5C59 # +0x656E 0x5B71 # +0x656F 0x5C63 # +0x6570 0x5C66 # +0x6571 0x7FBC # +0x6572 0x5F2A # +0x6573 0x5F29 # +0x6574 0x5F2D # +0x6575 0x8274 # +0x6576 0x5F3C # +0x6577 0x9B3B # +0x6578 0x5C6E # +0x6579 0x5981 # +0x657A 0x5983 # +0x657B 0x598D # +0x657C 0x59A9 # +0x657D 0x59AA # +0x657E 0x59A3 # +0x6621 0x5997 # +0x6622 0x59CA # +0x6623 0x59AB # +0x6624 0x599E # +0x6625 0x59A4 # +0x6626 0x59D2 # +0x6627 0x59B2 # +0x6628 0x59AF # +0x6629 0x59D7 # +0x662A 0x59BE # +0x662B 0x5A05 # +0x662C 0x5A06 # +0x662D 0x59DD # +0x662E 0x5A08 # +0x662F 0x59E3 # +0x6630 0x59D8 # +0x6631 0x59F9 # +0x6632 0x5A0C # +0x6633 0x5A09 # +0x6634 0x5A32 # +0x6635 0x5A34 # +0x6636 0x5A11 # +0x6637 0x5A23 # +0x6638 0x5A13 # +0x6639 0x5A40 # +0x663A 0x5A67 # +0x663B 0x5A4A # +0x663C 0x5A55 # +0x663D 0x5A3C # +0x663E 0x5A62 # +0x663F 0x5A75 # +0x6640 0x80EC # +0x6641 0x5AAA # +0x6642 0x5A9B # +0x6643 0x5A77 # +0x6644 0x5A7A # +0x6645 0x5ABE # +0x6646 0x5AEB # +0x6647 0x5AB2 # +0x6648 0x5AD2 # +0x6649 0x5AD4 # +0x664A 0x5AB8 # +0x664B 0x5AE0 # +0x664C 0x5AE3 # +0x664D 0x5AF1 # +0x664E 0x5AD6 # +0x664F 0x5AE6 # +0x6650 0x5AD8 # +0x6651 0x5ADC # +0x6652 0x5B09 # +0x6653 0x5B17 # +0x6654 0x5B16 # +0x6655 0x5B32 # +0x6656 0x5B37 # +0x6657 0x5B40 # +0x6658 0x5C15 # +0x6659 0x5C1C # +0x665A 0x5B5A # +0x665B 0x5B65 # +0x665C 0x5B73 # +0x665D 0x5B51 # +0x665E 0x5B53 # +0x665F 0x5B62 # +0x6660 0x9A75 # +0x6661 0x9A77 # +0x6662 0x9A78 # +0x6663 0x9A7A # +0x6664 0x9A7F # +0x6665 0x9A7D # +0x6666 0x9A80 # +0x6667 0x9A81 # +0x6668 0x9A85 # +0x6669 0x9A88 # +0x666A 0x9A8A # +0x666B 0x9A90 # +0x666C 0x9A92 # +0x666D 0x9A93 # +0x666E 0x9A96 # +0x666F 0x9A98 # +0x6670 0x9A9B # +0x6671 0x9A9C # +0x6672 0x9A9D # +0x6673 0x9A9F # +0x6674 0x9AA0 # +0x6675 0x9AA2 # +0x6676 0x9AA3 # +0x6677 0x9AA5 # +0x6678 0x9AA7 # +0x6679 0x7E9F # +0x667A 0x7EA1 # +0x667B 0x7EA3 # +0x667C 0x7EA5 # +0x667D 0x7EA8 # +0x667E 0x7EA9 # +0x6721 0x7EAD # +0x6722 0x7EB0 # +0x6723 0x7EBE # +0x6724 0x7EC0 # +0x6725 0x7EC1 # +0x6726 0x7EC2 # +0x6727 0x7EC9 # +0x6728 0x7ECB # +0x6729 0x7ECC # +0x672A 0x7ED0 # +0x672B 0x7ED4 # +0x672C 0x7ED7 # +0x672D 0x7EDB # +0x672E 0x7EE0 # +0x672F 0x7EE1 # +0x6730 0x7EE8 # +0x6731 0x7EEB # +0x6732 0x7EEE # +0x6733 0x7EEF # +0x6734 0x7EF1 # +0x6735 0x7EF2 # +0x6736 0x7F0D # +0x6737 0x7EF6 # +0x6738 0x7EFA # +0x6739 0x7EFB # +0x673A 0x7EFE # +0x673B 0x7F01 # +0x673C 0x7F02 # +0x673D 0x7F03 # +0x673E 0x7F07 # +0x673F 0x7F08 # +0x6740 0x7F0B # +0x6741 0x7F0C # +0x6742 0x7F0F # +0x6743 0x7F11 # +0x6744 0x7F12 # +0x6745 0x7F17 # +0x6746 0x7F19 # +0x6747 0x7F1C # +0x6748 0x7F1B # +0x6749 0x7F1F # +0x674A 0x7F21 # +0x674B 0x7F22 # +0x674C 0x7F23 # +0x674D 0x7F24 # +0x674E 0x7F25 # +0x674F 0x7F26 # +0x6750 0x7F27 # +0x6751 0x7F2A # +0x6752 0x7F2B # +0x6753 0x7F2C # +0x6754 0x7F2D # +0x6755 0x7F2F # +0x6756 0x7F30 # +0x6757 0x7F31 # +0x6758 0x7F32 # +0x6759 0x7F33 # +0x675A 0x7F35 # +0x675B 0x5E7A # +0x675C 0x757F # +0x675D 0x5DDB # +0x675E 0x753E # +0x675F 0x9095 # +0x6760 0x738E # +0x6761 0x7391 # +0x6762 0x73AE # +0x6763 0x73A2 # +0x6764 0x739F # +0x6765 0x73CF # +0x6766 0x73C2 # +0x6767 0x73D1 # +0x6768 0x73B7 # +0x6769 0x73B3 # +0x676A 0x73C0 # +0x676B 0x73C9 # +0x676C 0x73C8 # +0x676D 0x73E5 # +0x676E 0x73D9 # +0x676F 0x987C # +0x6770 0x740A # +0x6771 0x73E9 # +0x6772 0x73E7 # +0x6773 0x73DE # +0x6774 0x73BA # +0x6775 0x73F2 # +0x6776 0x740F # +0x6777 0x742A # +0x6778 0x745B # +0x6779 0x7426 # +0x677A 0x7425 # +0x677B 0x7428 # +0x677C 0x7430 # +0x677D 0x742E # +0x677E 0x742C # +0x6821 0x741B # +0x6822 0x741A # +0x6823 0x7441 # +0x6824 0x745C # +0x6825 0x7457 # +0x6826 0x7455 # +0x6827 0x7459 # +0x6828 0x7477 # +0x6829 0x746D # +0x682A 0x747E # +0x682B 0x749C # +0x682C 0x748E # +0x682D 0x7480 # +0x682E 0x7481 # +0x682F 0x7487 # +0x6830 0x748B # +0x6831 0x749E # +0x6832 0x74A8 # +0x6833 0x74A9 # +0x6834 0x7490 # +0x6835 0x74A7 # +0x6836 0x74D2 # +0x6837 0x74BA # +0x6838 0x97EA # +0x6839 0x97EB # +0x683A 0x97EC # +0x683B 0x674C # +0x683C 0x6753 # +0x683D 0x675E # +0x683E 0x6748 # +0x683F 0x6769 # +0x6840 0x67A5 # +0x6841 0x6787 # +0x6842 0x676A # +0x6843 0x6773 # +0x6844 0x6798 # +0x6845 0x67A7 # +0x6846 0x6775 # +0x6847 0x67A8 # +0x6848 0x679E # +0x6849 0x67AD # +0x684A 0x678B # +0x684B 0x6777 # +0x684C 0x677C # +0x684D 0x67F0 # +0x684E 0x6809 # +0x684F 0x67D8 # +0x6850 0x680A # +0x6851 0x67E9 # +0x6852 0x67B0 # +0x6853 0x680C # +0x6854 0x67D9 # +0x6855 0x67B5 # +0x6856 0x67DA # +0x6857 0x67B3 # +0x6858 0x67DD # +0x6859 0x6800 # +0x685A 0x67C3 # +0x685B 0x67B8 # +0x685C 0x67E2 # +0x685D 0x680E # +0x685E 0x67C1 # +0x685F 0x67FD # +0x6860 0x6832 # +0x6861 0x6833 # +0x6862 0x6860 # +0x6863 0x6861 # +0x6864 0x684E # +0x6865 0x6862 # +0x6866 0x6844 # +0x6867 0x6864 # +0x6868 0x6883 # +0x6869 0x681D # +0x686A 0x6855 # +0x686B 0x6866 # +0x686C 0x6841 # +0x686D 0x6867 # +0x686E 0x6840 # +0x686F 0x683E # +0x6870 0x684A # +0x6871 0x6849 # +0x6872 0x6829 # +0x6873 0x68B5 # +0x6874 0x688F # +0x6875 0x6874 # +0x6876 0x6877 # +0x6877 0x6893 # +0x6878 0x686B # +0x6879 0x68C2 # +0x687A 0x696E # +0x687B 0x68FC # +0x687C 0x691F # +0x687D 0x6920 # +0x687E 0x68F9 # +0x6921 0x6924 # +0x6922 0x68F0 # +0x6923 0x690B # +0x6924 0x6901 # +0x6925 0x6957 # +0x6926 0x68E3 # +0x6927 0x6910 # +0x6928 0x6971 # +0x6929 0x6939 # +0x692A 0x6960 # +0x692B 0x6942 # +0x692C 0x695D # +0x692D 0x6984 # +0x692E 0x696B # +0x692F 0x6980 # +0x6930 0x6998 # +0x6931 0x6978 # +0x6932 0x6934 # +0x6933 0x69CC # +0x6934 0x6987 # +0x6935 0x6988 # +0x6936 0x69CE # +0x6937 0x6989 # +0x6938 0x6966 # +0x6939 0x6963 # +0x693A 0x6979 # +0x693B 0x699B # +0x693C 0x69A7 # +0x693D 0x69BB # +0x693E 0x69AB # +0x693F 0x69AD # +0x6940 0x69D4 # +0x6941 0x69B1 # +0x6942 0x69C1 # +0x6943 0x69CA # +0x6944 0x69DF # +0x6945 0x6995 # +0x6946 0x69E0 # +0x6947 0x698D # +0x6948 0x69FF # +0x6949 0x6A2F # +0x694A 0x69ED # +0x694B 0x6A17 # +0x694C 0x6A18 # +0x694D 0x6A65 # +0x694E 0x69F2 # +0x694F 0x6A44 # +0x6950 0x6A3E # +0x6951 0x6AA0 # +0x6952 0x6A50 # +0x6953 0x6A5B # +0x6954 0x6A35 # +0x6955 0x6A8E # +0x6956 0x6A79 # +0x6957 0x6A3D # +0x6958 0x6A28 # +0x6959 0x6A58 # +0x695A 0x6A7C # +0x695B 0x6A91 # +0x695C 0x6A90 # +0x695D 0x6AA9 # +0x695E 0x6A97 # +0x695F 0x6AAB # +0x6960 0x7337 # +0x6961 0x7352 # +0x6962 0x6B81 # +0x6963 0x6B82 # +0x6964 0x6B87 # +0x6965 0x6B84 # +0x6966 0x6B92 # +0x6967 0x6B93 # +0x6968 0x6B8D # +0x6969 0x6B9A # +0x696A 0x6B9B # +0x696B 0x6BA1 # +0x696C 0x6BAA # +0x696D 0x8F6B # +0x696E 0x8F6D # +0x696F 0x8F71 # +0x6970 0x8F72 # +0x6971 0x8F73 # +0x6972 0x8F75 # +0x6973 0x8F76 # +0x6974 0x8F78 # +0x6975 0x8F77 # +0x6976 0x8F79 # +0x6977 0x8F7A # +0x6978 0x8F7C # +0x6979 0x8F7E # +0x697A 0x8F81 # +0x697B 0x8F82 # +0x697C 0x8F84 # +0x697D 0x8F87 # +0x697E 0x8F8B # +0x6A21 0x8F8D # +0x6A22 0x8F8E # +0x6A23 0x8F8F # +0x6A24 0x8F98 # +0x6A25 0x8F9A # +0x6A26 0x8ECE # +0x6A27 0x620B # +0x6A28 0x6217 # +0x6A29 0x621B # +0x6A2A 0x621F # +0x6A2B 0x6222 # +0x6A2C 0x6221 # +0x6A2D 0x6225 # +0x6A2E 0x6224 # +0x6A2F 0x622C # +0x6A30 0x81E7 # +0x6A31 0x74EF # +0x6A32 0x74F4 # +0x6A33 0x74FF # +0x6A34 0x750F # +0x6A35 0x7511 # +0x6A36 0x7513 # +0x6A37 0x6534 # +0x6A38 0x65EE # +0x6A39 0x65EF # +0x6A3A 0x65F0 # +0x6A3B 0x660A # +0x6A3C 0x6619 # +0x6A3D 0x6772 # +0x6A3E 0x6603 # +0x6A3F 0x6615 # +0x6A40 0x6600 # +0x6A41 0x7085 # +0x6A42 0x66F7 # +0x6A43 0x661D # +0x6A44 0x6634 # +0x6A45 0x6631 # +0x6A46 0x6636 # +0x6A47 0x6635 # +0x6A48 0x8006 # +0x6A49 0x665F # +0x6A4A 0x6654 # +0x6A4B 0x6641 # +0x6A4C 0x664F # +0x6A4D 0x6656 # +0x6A4E 0x6661 # +0x6A4F 0x6657 # +0x6A50 0x6677 # +0x6A51 0x6684 # +0x6A52 0x668C # +0x6A53 0x66A7 # +0x6A54 0x669D # +0x6A55 0x66BE # +0x6A56 0x66DB # +0x6A57 0x66DC # +0x6A58 0x66E6 # +0x6A59 0x66E9 # +0x6A5A 0x8D32 # +0x6A5B 0x8D33 # +0x6A5C 0x8D36 # +0x6A5D 0x8D3B # +0x6A5E 0x8D3D # +0x6A5F 0x8D40 # +0x6A60 0x8D45 # +0x6A61 0x8D46 # +0x6A62 0x8D48 # +0x6A63 0x8D49 # +0x6A64 0x8D47 # +0x6A65 0x8D4D # +0x6A66 0x8D55 # +0x6A67 0x8D59 # +0x6A68 0x89C7 # +0x6A69 0x89CA # +0x6A6A 0x89CB # +0x6A6B 0x89CC # +0x6A6C 0x89CE # +0x6A6D 0x89CF # +0x6A6E 0x89D0 # +0x6A6F 0x89D1 # +0x6A70 0x726E # +0x6A71 0x729F # +0x6A72 0x725D # +0x6A73 0x7266 # +0x6A74 0x726F # +0x6A75 0x727E # +0x6A76 0x727F # +0x6A77 0x7284 # +0x6A78 0x728B # +0x6A79 0x728D # +0x6A7A 0x728F # +0x6A7B 0x7292 # +0x6A7C 0x6308 # +0x6A7D 0x6332 # +0x6A7E 0x63B0 # +0x6B21 0x643F # +0x6B22 0x64D8 # +0x6B23 0x8004 # +0x6B24 0x6BEA # +0x6B25 0x6BF3 # +0x6B26 0x6BFD # +0x6B27 0x6BF5 # +0x6B28 0x6BF9 # +0x6B29 0x6C05 # +0x6B2A 0x6C07 # +0x6B2B 0x6C06 # +0x6B2C 0x6C0D # +0x6B2D 0x6C15 # +0x6B2E 0x6C18 # +0x6B2F 0x6C19 # +0x6B30 0x6C1A # +0x6B31 0x6C21 # +0x6B32 0x6C29 # +0x6B33 0x6C24 # +0x6B34 0x6C2A # +0x6B35 0x6C32 # +0x6B36 0x6535 # +0x6B37 0x6555 # +0x6B38 0x656B # +0x6B39 0x724D # +0x6B3A 0x7252 # +0x6B3B 0x7256 # +0x6B3C 0x7230 # +0x6B3D 0x8662 # +0x6B3E 0x5216 # +0x6B3F 0x809F # +0x6B40 0x809C # +0x6B41 0x8093 # +0x6B42 0x80BC # +0x6B43 0x670A # +0x6B44 0x80BD # +0x6B45 0x80B1 # +0x6B46 0x80AB # +0x6B47 0x80AD # +0x6B48 0x80B4 # +0x6B49 0x80B7 # +0x6B4A 0x80E7 # +0x6B4B 0x80E8 # +0x6B4C 0x80E9 # +0x6B4D 0x80EA # +0x6B4E 0x80DB # +0x6B4F 0x80C2 # +0x6B50 0x80C4 # +0x6B51 0x80D9 # +0x6B52 0x80CD # +0x6B53 0x80D7 # +0x6B54 0x6710 # +0x6B55 0x80DD # +0x6B56 0x80EB # +0x6B57 0x80F1 # +0x6B58 0x80F4 # +0x6B59 0x80ED # +0x6B5A 0x810D # +0x6B5B 0x810E # +0x6B5C 0x80F2 # +0x6B5D 0x80FC # +0x6B5E 0x6715 # +0x6B5F 0x8112 # +0x6B60 0x8C5A # +0x6B61 0x8136 # +0x6B62 0x811E # +0x6B63 0x812C # +0x6B64 0x8118 # +0x6B65 0x8132 # +0x6B66 0x8148 # +0x6B67 0x814C # +0x6B68 0x8153 # +0x6B69 0x8174 # +0x6B6A 0x8159 # +0x6B6B 0x815A # +0x6B6C 0x8171 # +0x6B6D 0x8160 # +0x6B6E 0x8169 # +0x6B6F 0x817C # +0x6B70 0x817D # +0x6B71 0x816D # +0x6B72 0x8167 # +0x6B73 0x584D # +0x6B74 0x5AB5 # +0x6B75 0x8188 # +0x6B76 0x8182 # +0x6B77 0x8191 # +0x6B78 0x6ED5 # +0x6B79 0x81A3 # +0x6B7A 0x81AA # +0x6B7B 0x81CC # +0x6B7C 0x6726 # +0x6B7D 0x81CA # +0x6B7E 0x81BB # +0x6C21 0x81C1 # +0x6C22 0x81A6 # +0x6C23 0x6B24 # +0x6C24 0x6B37 # +0x6C25 0x6B39 # +0x6C26 0x6B43 # +0x6C27 0x6B46 # +0x6C28 0x6B59 # +0x6C29 0x98D1 # +0x6C2A 0x98D2 # +0x6C2B 0x98D3 # +0x6C2C 0x98D5 # +0x6C2D 0x98D9 # +0x6C2E 0x98DA # +0x6C2F 0x6BB3 # +0x6C30 0x5F40 # +0x6C31 0x6BC2 # +0x6C32 0x89F3 # +0x6C33 0x6590 # +0x6C34 0x9F51 # +0x6C35 0x6593 # +0x6C36 0x65BC # +0x6C37 0x65C6 # +0x6C38 0x65C4 # +0x6C39 0x65C3 # +0x6C3A 0x65CC # +0x6C3B 0x65CE # +0x6C3C 0x65D2 # +0x6C3D 0x65D6 # +0x6C3E 0x7080 # +0x6C3F 0x709C # +0x6C40 0x7096 # +0x6C41 0x709D # +0x6C42 0x70BB # +0x6C43 0x70C0 # +0x6C44 0x70B7 # +0x6C45 0x70AB # +0x6C46 0x70B1 # +0x6C47 0x70E8 # +0x6C48 0x70CA # +0x6C49 0x7110 # +0x6C4A 0x7113 # +0x6C4B 0x7116 # +0x6C4C 0x712F # +0x6C4D 0x7131 # +0x6C4E 0x7173 # +0x6C4F 0x715C # +0x6C50 0x7168 # +0x6C51 0x7145 # +0x6C52 0x7172 # +0x6C53 0x714A # +0x6C54 0x7178 # +0x6C55 0x717A # +0x6C56 0x7198 # +0x6C57 0x71B3 # +0x6C58 0x71B5 # +0x6C59 0x71A8 # +0x6C5A 0x71A0 # +0x6C5B 0x71E0 # +0x6C5C 0x71D4 # +0x6C5D 0x71E7 # +0x6C5E 0x71F9 # +0x6C5F 0x721D # +0x6C60 0x7228 # +0x6C61 0x706C # +0x6C62 0x7118 # +0x6C63 0x7166 # +0x6C64 0x71B9 # +0x6C65 0x623E # +0x6C66 0x623D # +0x6C67 0x6243 # +0x6C68 0x6248 # +0x6C69 0x6249 # +0x6C6A 0x793B # +0x6C6B 0x7940 # +0x6C6C 0x7946 # +0x6C6D 0x7949 # +0x6C6E 0x795B # +0x6C6F 0x795C # +0x6C70 0x7953 # +0x6C71 0x795A # +0x6C72 0x7962 # +0x6C73 0x7957 # +0x6C74 0x7960 # +0x6C75 0x796F # +0x6C76 0x7967 # +0x6C77 0x797A # +0x6C78 0x7985 # +0x6C79 0x798A # +0x6C7A 0x799A # +0x6C7B 0x79A7 # +0x6C7C 0x79B3 # +0x6C7D 0x5FD1 # +0x6C7E 0x5FD0 # +0x6D21 0x603C # +0x6D22 0x605D # +0x6D23 0x605A # +0x6D24 0x6067 # +0x6D25 0x6041 # +0x6D26 0x6059 # +0x6D27 0x6063 # +0x6D28 0x60AB # +0x6D29 0x6106 # +0x6D2A 0x610D # +0x6D2B 0x615D # +0x6D2C 0x61A9 # +0x6D2D 0x619D # +0x6D2E 0x61CB # +0x6D2F 0x61D1 # +0x6D30 0x6206 # +0x6D31 0x8080 # +0x6D32 0x807F # +0x6D33 0x6C93 # +0x6D34 0x6CF6 # +0x6D35 0x6DFC # +0x6D36 0x77F6 # +0x6D37 0x77F8 # +0x6D38 0x7800 # +0x6D39 0x7809 # +0x6D3A 0x7817 # +0x6D3B 0x7818 # +0x6D3C 0x7811 # +0x6D3D 0x65AB # +0x6D3E 0x782D # +0x6D3F 0x781C # +0x6D40 0x781D # +0x6D41 0x7839 # +0x6D42 0x783A # +0x6D43 0x783B # +0x6D44 0x781F # +0x6D45 0x783C # +0x6D46 0x7825 # +0x6D47 0x782C # +0x6D48 0x7823 # +0x6D49 0x7829 # +0x6D4A 0x784E # +0x6D4B 0x786D # +0x6D4C 0x7856 # +0x6D4D 0x7857 # +0x6D4E 0x7826 # +0x6D4F 0x7850 # +0x6D50 0x7847 # +0x6D51 0x784C # +0x6D52 0x786A # +0x6D53 0x789B # +0x6D54 0x7893 # +0x6D55 0x789A # +0x6D56 0x7887 # +0x6D57 0x789C # +0x6D58 0x78A1 # +0x6D59 0x78A3 # +0x6D5A 0x78B2 # +0x6D5B 0x78B9 # +0x6D5C 0x78A5 # +0x6D5D 0x78D4 # +0x6D5E 0x78D9 # +0x6D5F 0x78C9 # +0x6D60 0x78EC # +0x6D61 0x78F2 # +0x6D62 0x7905 # +0x6D63 0x78F4 # +0x6D64 0x7913 # +0x6D65 0x7924 # +0x6D66 0x791E # +0x6D67 0x7934 # +0x6D68 0x9F9B # +0x6D69 0x9EF9 # +0x6D6A 0x9EFB # +0x6D6B 0x9EFC # +0x6D6C 0x76F1 # +0x6D6D 0x7704 # +0x6D6E 0x770D # +0x6D6F 0x76F9 # +0x6D70 0x7707 # +0x6D71 0x7708 # +0x6D72 0x771A # +0x6D73 0x7722 # +0x6D74 0x7719 # +0x6D75 0x772D # +0x6D76 0x7726 # +0x6D77 0x7735 # +0x6D78 0x7738 # +0x6D79 0x7750 # +0x6D7A 0x7751 # +0x6D7B 0x7747 # +0x6D7C 0x7743 # +0x6D7D 0x775A # +0x6D7E 0x7768 # +0x6E21 0x7762 # +0x6E22 0x7765 # +0x6E23 0x777F # +0x6E24 0x778D # +0x6E25 0x777D # +0x6E26 0x7780 # +0x6E27 0x778C # +0x6E28 0x7791 # +0x6E29 0x779F # +0x6E2A 0x77A0 # +0x6E2B 0x77B0 # +0x6E2C 0x77B5 # +0x6E2D 0x77BD # +0x6E2E 0x753A # +0x6E2F 0x7540 # +0x6E30 0x754E # +0x6E31 0x754B # +0x6E32 0x7548 # +0x6E33 0x755B # +0x6E34 0x7572 # +0x6E35 0x7579 # +0x6E36 0x7583 # +0x6E37 0x7F58 # +0x6E38 0x7F61 # +0x6E39 0x7F5F # +0x6E3A 0x8A48 # +0x6E3B 0x7F68 # +0x6E3C 0x7F74 # +0x6E3D 0x7F71 # +0x6E3E 0x7F79 # +0x6E3F 0x7F81 # +0x6E40 0x7F7E # +0x6E41 0x76CD # +0x6E42 0x76E5 # +0x6E43 0x8832 # +0x6E44 0x9485 # +0x6E45 0x9486 # +0x6E46 0x9487 # +0x6E47 0x948B # +0x6E48 0x948A # +0x6E49 0x948C # +0x6E4A 0x948D # +0x6E4B 0x948F # +0x6E4C 0x9490 # +0x6E4D 0x9494 # +0x6E4E 0x9497 # +0x6E4F 0x9495 # +0x6E50 0x949A # +0x6E51 0x949B # +0x6E52 0x949C # +0x6E53 0x94A3 # +0x6E54 0x94A4 # +0x6E55 0x94AB # +0x6E56 0x94AA # +0x6E57 0x94AD # +0x6E58 0x94AC # +0x6E59 0x94AF # +0x6E5A 0x94B0 # +0x6E5B 0x94B2 # +0x6E5C 0x94B4 # +0x6E5D 0x94B6 # +0x6E5E 0x94B7 # +0x6E5F 0x94B8 # +0x6E60 0x94B9 # +0x6E61 0x94BA # +0x6E62 0x94BC # +0x6E63 0x94BD # +0x6E64 0x94BF # +0x6E65 0x94C4 # +0x6E66 0x94C8 # +0x6E67 0x94C9 # +0x6E68 0x94CA # +0x6E69 0x94CB # +0x6E6A 0x94CC # +0x6E6B 0x94CD # +0x6E6C 0x94CE # +0x6E6D 0x94D0 # +0x6E6E 0x94D1 # +0x6E6F 0x94D2 # +0x6E70 0x94D5 # +0x6E71 0x94D6 # +0x6E72 0x94D7 # +0x6E73 0x94D9 # +0x6E74 0x94D8 # +0x6E75 0x94DB # +0x6E76 0x94DE # +0x6E77 0x94DF # +0x6E78 0x94E0 # +0x6E79 0x94E2 # +0x6E7A 0x94E4 # +0x6E7B 0x94E5 # +0x6E7C 0x94E7 # +0x6E7D 0x94E8 # +0x6E7E 0x94EA # +0x6F21 0x94E9 # +0x6F22 0x94EB # +0x6F23 0x94EE # +0x6F24 0x94EF # +0x6F25 0x94F3 # +0x6F26 0x94F4 # +0x6F27 0x94F5 # +0x6F28 0x94F7 # +0x6F29 0x94F9 # +0x6F2A 0x94FC # +0x6F2B 0x94FD # +0x6F2C 0x94FF # +0x6F2D 0x9503 # +0x6F2E 0x9502 # +0x6F2F 0x9506 # +0x6F30 0x9507 # +0x6F31 0x9509 # +0x6F32 0x950A # +0x6F33 0x950D # +0x6F34 0x950E # +0x6F35 0x950F # +0x6F36 0x9512 # +0x6F37 0x9513 # +0x6F38 0x9514 # +0x6F39 0x9515 # +0x6F3A 0x9516 # +0x6F3B 0x9518 # +0x6F3C 0x951B # +0x6F3D 0x951D # +0x6F3E 0x951E # +0x6F3F 0x951F # +0x6F40 0x9522 # +0x6F41 0x952A # +0x6F42 0x952B # +0x6F43 0x9529 # +0x6F44 0x952C # +0x6F45 0x9531 # +0x6F46 0x9532 # +0x6F47 0x9534 # +0x6F48 0x9536 # +0x6F49 0x9537 # +0x6F4A 0x9538 # +0x6F4B 0x953C # +0x6F4C 0x953E # +0x6F4D 0x953F # +0x6F4E 0x9542 # +0x6F4F 0x9535 # +0x6F50 0x9544 # +0x6F51 0x9545 # +0x6F52 0x9546 # +0x6F53 0x9549 # +0x6F54 0x954C # +0x6F55 0x954E # +0x6F56 0x954F # +0x6F57 0x9552 # +0x6F58 0x9553 # +0x6F59 0x9554 # +0x6F5A 0x9556 # +0x6F5B 0x9557 # +0x6F5C 0x9558 # +0x6F5D 0x9559 # +0x6F5E 0x955B # +0x6F5F 0x955E # +0x6F60 0x955F # +0x6F61 0x955D # +0x6F62 0x9561 # +0x6F63 0x9562 # +0x6F64 0x9564 # +0x6F65 0x9565 # +0x6F66 0x9566 # +0x6F67 0x9567 # +0x6F68 0x9568 # +0x6F69 0x9569 # +0x6F6A 0x956A # +0x6F6B 0x956B # +0x6F6C 0x956C # +0x6F6D 0x956F # +0x6F6E 0x9571 # +0x6F6F 0x9572 # +0x6F70 0x9573 # +0x6F71 0x953A # +0x6F72 0x77E7 # +0x6F73 0x77EC # +0x6F74 0x96C9 # +0x6F75 0x79D5 # +0x6F76 0x79ED # +0x6F77 0x79E3 # +0x6F78 0x79EB # +0x6F79 0x7A06 # +0x6F7A 0x5D47 # +0x6F7B 0x7A03 # +0x6F7C 0x7A02 # +0x6F7D 0x7A1E # +0x6F7E 0x7A14 # +0x7021 0x7A39 # +0x7022 0x7A37 # +0x7023 0x7A51 # +0x7024 0x9ECF # +0x7025 0x99A5 # +0x7026 0x7A70 # +0x7027 0x7688 # +0x7028 0x768E # +0x7029 0x7693 # +0x702A 0x7699 # +0x702B 0x76A4 # +0x702C 0x74DE # +0x702D 0x74E0 # +0x702E 0x752C # +0x702F 0x9E20 # +0x7030 0x9E22 # +0x7031 0x9E28 # +0x7032 0x9E29 # +0x7033 0x9E2A # +0x7034 0x9E2B # +0x7035 0x9E2C # +0x7036 0x9E32 # +0x7037 0x9E31 # +0x7038 0x9E36 # +0x7039 0x9E38 # +0x703A 0x9E37 # +0x703B 0x9E39 # +0x703C 0x9E3A # +0x703D 0x9E3E # +0x703E 0x9E41 # +0x703F 0x9E42 # +0x7040 0x9E44 # +0x7041 0x9E46 # +0x7042 0x9E47 # +0x7043 0x9E48 # +0x7044 0x9E49 # +0x7045 0x9E4B # +0x7046 0x9E4C # +0x7047 0x9E4E # +0x7048 0x9E51 # +0x7049 0x9E55 # +0x704A 0x9E57 # +0x704B 0x9E5A # +0x704C 0x9E5B # +0x704D 0x9E5C # +0x704E 0x9E5E # +0x704F 0x9E63 # +0x7050 0x9E66 # +0x7051 0x9E67 # +0x7052 0x9E68 # +0x7053 0x9E69 # +0x7054 0x9E6A # +0x7055 0x9E6B # +0x7056 0x9E6C # +0x7057 0x9E71 # +0x7058 0x9E6D # +0x7059 0x9E73 # +0x705A 0x7592 # +0x705B 0x7594 # +0x705C 0x7596 # +0x705D 0x75A0 # +0x705E 0x759D # +0x705F 0x75AC # +0x7060 0x75A3 # +0x7061 0x75B3 # +0x7062 0x75B4 # +0x7063 0x75B8 # +0x7064 0x75C4 # +0x7065 0x75B1 # +0x7066 0x75B0 # +0x7067 0x75C3 # +0x7068 0x75C2 # +0x7069 0x75D6 # +0x706A 0x75CD # +0x706B 0x75E3 # +0x706C 0x75E8 # +0x706D 0x75E6 # +0x706E 0x75E4 # +0x706F 0x75EB # +0x7070 0x75E7 # +0x7071 0x7603 # +0x7072 0x75F1 # +0x7073 0x75FC # +0x7074 0x75FF # +0x7075 0x7610 # +0x7076 0x7600 # +0x7077 0x7605 # +0x7078 0x760C # +0x7079 0x7617 # +0x707A 0x760A # +0x707B 0x7625 # +0x707C 0x7618 # +0x707D 0x7615 # +0x707E 0x7619 # +0x7121 0x761B # +0x7122 0x763C # +0x7123 0x7622 # +0x7124 0x7620 # +0x7125 0x7640 # +0x7126 0x762D # +0x7127 0x7630 # +0x7128 0x763F # +0x7129 0x7635 # +0x712A 0x7643 # +0x712B 0x763E # +0x712C 0x7633 # +0x712D 0x764D # +0x712E 0x765E # +0x712F 0x7654 # +0x7130 0x765C # +0x7131 0x7656 # +0x7132 0x766B # +0x7133 0x766F # +0x7134 0x7FCA # +0x7135 0x7AE6 # +0x7136 0x7A78 # +0x7137 0x7A79 # +0x7138 0x7A80 # +0x7139 0x7A86 # +0x713A 0x7A88 # +0x713B 0x7A95 # +0x713C 0x7AA6 # +0x713D 0x7AA0 # +0x713E 0x7AAC # +0x713F 0x7AA8 # +0x7140 0x7AAD # +0x7141 0x7AB3 # +0x7142 0x8864 # +0x7143 0x8869 # +0x7144 0x8872 # +0x7145 0x887D # +0x7146 0x887F # +0x7147 0x8882 # +0x7148 0x88A2 # +0x7149 0x88C6 # +0x714A 0x88B7 # +0x714B 0x88BC # +0x714C 0x88C9 # +0x714D 0x88E2 # +0x714E 0x88CE # +0x714F 0x88E3 # +0x7150 0x88E5 # +0x7151 0x88F1 # +0x7152 0x891A # +0x7153 0x88FC # +0x7154 0x88E8 # +0x7155 0x88FE # +0x7156 0x88F0 # +0x7157 0x8921 # +0x7158 0x8919 # +0x7159 0x8913 # +0x715A 0x891B # +0x715B 0x890A # +0x715C 0x8934 # +0x715D 0x892B # +0x715E 0x8936 # +0x715F 0x8941 # +0x7160 0x8966 # +0x7161 0x897B # +0x7162 0x758B # +0x7163 0x80E5 # +0x7164 0x76B2 # +0x7165 0x76B4 # +0x7166 0x77DC # +0x7167 0x8012 # +0x7168 0x8014 # +0x7169 0x8016 # +0x716A 0x801C # +0x716B 0x8020 # +0x716C 0x8022 # +0x716D 0x8025 # +0x716E 0x8026 # +0x716F 0x8027 # +0x7170 0x8029 # +0x7171 0x8028 # +0x7172 0x8031 # +0x7173 0x800B # +0x7174 0x8035 # +0x7175 0x8043 # +0x7176 0x8046 # +0x7177 0x804D # +0x7178 0x8052 # +0x7179 0x8069 # +0x717A 0x8071 # +0x717B 0x8983 # +0x717C 0x9878 # +0x717D 0x9880 # +0x717E 0x9883 # +0x7221 0x9889 # +0x7222 0x988C # +0x7223 0x988D # +0x7224 0x988F # +0x7225 0x9894 # +0x7226 0x989A # +0x7227 0x989B # +0x7228 0x989E # +0x7229 0x989F # +0x722A 0x98A1 # +0x722B 0x98A2 # +0x722C 0x98A5 # +0x722D 0x98A6 # +0x722E 0x864D # +0x722F 0x8654 # +0x7230 0x866C # +0x7231 0x866E # +0x7232 0x867F # +0x7233 0x867A # +0x7234 0x867C # +0x7235 0x867B # +0x7236 0x86A8 # +0x7237 0x868D # +0x7238 0x868B # +0x7239 0x86AC # +0x723A 0x869D # +0x723B 0x86A7 # +0x723C 0x86A3 # +0x723D 0x86AA # +0x723E 0x8693 # +0x723F 0x86A9 # +0x7240 0x86B6 # +0x7241 0x86C4 # +0x7242 0x86B5 # +0x7243 0x86CE # +0x7244 0x86B0 # +0x7245 0x86BA # +0x7246 0x86B1 # +0x7247 0x86AF # +0x7248 0x86C9 # +0x7249 0x86CF # +0x724A 0x86B4 # +0x724B 0x86E9 # +0x724C 0x86F1 # +0x724D 0x86F2 # +0x724E 0x86ED # +0x724F 0x86F3 # +0x7250 0x86D0 # +0x7251 0x8713 # +0x7252 0x86DE # +0x7253 0x86F4 # +0x7254 0x86DF # +0x7255 0x86D8 # +0x7256 0x86D1 # +0x7257 0x8703 # +0x7258 0x8707 # +0x7259 0x86F8 # +0x725A 0x8708 # +0x725B 0x870A # +0x725C 0x870D # +0x725D 0x8709 # +0x725E 0x8723 # +0x725F 0x873B # +0x7260 0x871E # +0x7261 0x8725 # +0x7262 0x872E # +0x7263 0x871A # +0x7264 0x873E # +0x7265 0x8748 # +0x7266 0x8734 # +0x7267 0x8731 # +0x7268 0x8729 # +0x7269 0x8737 # +0x726A 0x873F # +0x726B 0x8782 # +0x726C 0x8722 # +0x726D 0x877D # +0x726E 0x877E # +0x726F 0x877B # +0x7270 0x8760 # +0x7271 0x8770 # +0x7272 0x874C # +0x7273 0x876E # +0x7274 0x878B # +0x7275 0x8753 # +0x7276 0x8763 # +0x7277 0x877C # +0x7278 0x8764 # +0x7279 0x8759 # +0x727A 0x8765 # +0x727B 0x8793 # +0x727C 0x87AF # +0x727D 0x87A8 # +0x727E 0x87D2 # +0x7321 0x87C6 # +0x7322 0x8788 # +0x7323 0x8785 # +0x7324 0x87AD # +0x7325 0x8797 # +0x7326 0x8783 # +0x7327 0x87AB # +0x7328 0x87E5 # +0x7329 0x87AC # +0x732A 0x87B5 # +0x732B 0x87B3 # +0x732C 0x87CB # +0x732D 0x87D3 # +0x732E 0x87BD # +0x732F 0x87D1 # +0x7330 0x87C0 # +0x7331 0x87CA # +0x7332 0x87DB # +0x7333 0x87EA # +0x7334 0x87E0 # +0x7335 0x87EE # +0x7336 0x8816 # +0x7337 0x8813 # +0x7338 0x87FE # +0x7339 0x880A # +0x733A 0x881B # +0x733B 0x8821 # +0x733C 0x8839 # +0x733D 0x883C # +0x733E 0x7F36 # +0x733F 0x7F42 # +0x7340 0x7F44 # +0x7341 0x7F45 # +0x7342 0x8210 # +0x7343 0x7AFA # +0x7344 0x7AFD # +0x7345 0x7B08 # +0x7346 0x7B03 # +0x7347 0x7B04 # +0x7348 0x7B15 # +0x7349 0x7B0A # +0x734A 0x7B2B # +0x734B 0x7B0F # +0x734C 0x7B47 # +0x734D 0x7B38 # +0x734E 0x7B2A # +0x734F 0x7B19 # +0x7350 0x7B2E # +0x7351 0x7B31 # +0x7352 0x7B20 # +0x7353 0x7B25 # +0x7354 0x7B24 # +0x7355 0x7B33 # +0x7356 0x7B3E # +0x7357 0x7B1E # +0x7358 0x7B58 # +0x7359 0x7B5A # +0x735A 0x7B45 # +0x735B 0x7B75 # +0x735C 0x7B4C # +0x735D 0x7B5D # +0x735E 0x7B60 # +0x735F 0x7B6E # +0x7360 0x7B7B # +0x7361 0x7B62 # +0x7362 0x7B72 # +0x7363 0x7B71 # +0x7364 0x7B90 # +0x7365 0x7BA6 # +0x7366 0x7BA7 # +0x7367 0x7BB8 # +0x7368 0x7BAC # +0x7369 0x7B9D # +0x736A 0x7BA8 # +0x736B 0x7B85 # +0x736C 0x7BAA # +0x736D 0x7B9C # +0x736E 0x7BA2 # +0x736F 0x7BAB # +0x7370 0x7BB4 # +0x7371 0x7BD1 # +0x7372 0x7BC1 # +0x7373 0x7BCC # +0x7374 0x7BDD # +0x7375 0x7BDA # +0x7376 0x7BE5 # +0x7377 0x7BE6 # +0x7378 0x7BEA # +0x7379 0x7C0C # +0x737A 0x7BFE # +0x737B 0x7BFC # +0x737C 0x7C0F # +0x737D 0x7C16 # +0x737E 0x7C0B # +0x7421 0x7C1F # +0x7422 0x7C2A # +0x7423 0x7C26 # +0x7424 0x7C38 # +0x7425 0x7C41 # +0x7426 0x7C40 # +0x7427 0x81FE # +0x7428 0x8201 # +0x7429 0x8202 # +0x742A 0x8204 # +0x742B 0x81EC # +0x742C 0x8844 # +0x742D 0x8221 # +0x742E 0x8222 # +0x742F 0x8223 # +0x7430 0x822D # +0x7431 0x822F # +0x7432 0x8228 # +0x7433 0x822B # +0x7434 0x8238 # +0x7435 0x823B # +0x7436 0x8233 # +0x7437 0x8234 # +0x7438 0x823E # +0x7439 0x8244 # +0x743A 0x8249 # +0x743B 0x824B # +0x743C 0x824F # +0x743D 0x825A # +0x743E 0x825F # +0x743F 0x8268 # +0x7440 0x887E # +0x7441 0x8885 # +0x7442 0x8888 # +0x7443 0x88D8 # +0x7444 0x88DF # +0x7445 0x895E # +0x7446 0x7F9D # +0x7447 0x7F9F # +0x7448 0x7FA7 # +0x7449 0x7FAF # +0x744A 0x7FB0 # +0x744B 0x7FB2 # +0x744C 0x7C7C # +0x744D 0x6549 # +0x744E 0x7C91 # +0x744F 0x7C9D # +0x7450 0x7C9C # +0x7451 0x7C9E # +0x7452 0x7CA2 # +0x7453 0x7CB2 # +0x7454 0x7CBC # +0x7455 0x7CBD # +0x7456 0x7CC1 # +0x7457 0x7CC7 # +0x7458 0x7CCC # +0x7459 0x7CCD # +0x745A 0x7CC8 # +0x745B 0x7CC5 # +0x745C 0x7CD7 # +0x745D 0x7CE8 # +0x745E 0x826E # +0x745F 0x66A8 # +0x7460 0x7FBF # +0x7461 0x7FCE # +0x7462 0x7FD5 # +0x7463 0x7FE5 # +0x7464 0x7FE1 # +0x7465 0x7FE6 # +0x7466 0x7FE9 # +0x7467 0x7FEE # +0x7468 0x7FF3 # +0x7469 0x7CF8 # +0x746A 0x7D77 # +0x746B 0x7DA6 # +0x746C 0x7DAE # +0x746D 0x7E47 # +0x746E 0x7E9B # +0x746F 0x9EB8 # +0x7470 0x9EB4 # +0x7471 0x8D73 # +0x7472 0x8D84 # +0x7473 0x8D94 # +0x7474 0x8D91 # +0x7475 0x8DB1 # +0x7476 0x8D67 # +0x7477 0x8D6D # +0x7478 0x8C47 # +0x7479 0x8C49 # +0x747A 0x914A # +0x747B 0x9150 # +0x747C 0x914E # +0x747D 0x914F # +0x747E 0x9164 # +0x7521 0x9162 # +0x7522 0x9161 # +0x7523 0x9170 # +0x7524 0x9169 # +0x7525 0x916F # +0x7526 0x917D # +0x7527 0x917E # +0x7528 0x9172 # +0x7529 0x9174 # +0x752A 0x9179 # +0x752B 0x918C # +0x752C 0x9185 # +0x752D 0x9190 # +0x752E 0x918D # +0x752F 0x9191 # +0x7530 0x91A2 # +0x7531 0x91A3 # +0x7532 0x91AA # +0x7533 0x91AD # +0x7534 0x91AE # +0x7535 0x91AF # +0x7536 0x91B5 # +0x7537 0x91B4 # +0x7538 0x91BA # +0x7539 0x8C55 # +0x753A 0x9E7E # +0x753B 0x8DB8 # +0x753C 0x8DEB # +0x753D 0x8E05 # +0x753E 0x8E59 # +0x753F 0x8E69 # +0x7540 0x8DB5 # +0x7541 0x8DBF # +0x7542 0x8DBC # +0x7543 0x8DBA # +0x7544 0x8DC4 # +0x7545 0x8DD6 # +0x7546 0x8DD7 # +0x7547 0x8DDA # +0x7548 0x8DDE # +0x7549 0x8DCE # +0x754A 0x8DCF # +0x754B 0x8DDB # +0x754C 0x8DC6 # +0x754D 0x8DEC # +0x754E 0x8DF7 # +0x754F 0x8DF8 # +0x7550 0x8DE3 # +0x7551 0x8DF9 # +0x7552 0x8DFB # +0x7553 0x8DE4 # +0x7554 0x8E09 # +0x7555 0x8DFD # +0x7556 0x8E14 # +0x7557 0x8E1D # +0x7558 0x8E1F # +0x7559 0x8E2C # +0x755A 0x8E2E # +0x755B 0x8E23 # +0x755C 0x8E2F # +0x755D 0x8E3A # +0x755E 0x8E40 # +0x755F 0x8E39 # +0x7560 0x8E35 # +0x7561 0x8E3D # +0x7562 0x8E31 # +0x7563 0x8E49 # +0x7564 0x8E41 # +0x7565 0x8E42 # +0x7566 0x8E51 # +0x7567 0x8E52 # +0x7568 0x8E4A # +0x7569 0x8E70 # +0x756A 0x8E76 # +0x756B 0x8E7C # +0x756C 0x8E6F # +0x756D 0x8E74 # +0x756E 0x8E85 # +0x756F 0x8E8F # +0x7570 0x8E94 # +0x7571 0x8E90 # +0x7572 0x8E9C # +0x7573 0x8E9E # +0x7574 0x8C78 # +0x7575 0x8C82 # +0x7576 0x8C8A # +0x7577 0x8C85 # +0x7578 0x8C98 # +0x7579 0x8C94 # +0x757A 0x659B # +0x757B 0x89D6 # +0x757C 0x89DE # +0x757D 0x89DA # +0x757E 0x89DC # +0x7621 0x89E5 # +0x7622 0x89EB # +0x7623 0x89EF # +0x7624 0x8A3E # +0x7625 0x8B26 # +0x7626 0x9753 # +0x7627 0x96E9 # +0x7628 0x96F3 # +0x7629 0x96EF # +0x762A 0x9706 # +0x762B 0x9701 # +0x762C 0x9708 # +0x762D 0x970F # +0x762E 0x970E # +0x762F 0x972A # +0x7630 0x972D # +0x7631 0x9730 # +0x7632 0x973E # +0x7633 0x9F80 # +0x7634 0x9F83 # +0x7635 0x9F85 # +0x7636 0x9F86 # +0x7637 0x9F87 # +0x7638 0x9F88 # +0x7639 0x9F89 # +0x763A 0x9F8A # +0x763B 0x9F8C # +0x763C 0x9EFE # +0x763D 0x9F0B # +0x763E 0x9F0D # +0x763F 0x96B9 # +0x7640 0x96BC # +0x7641 0x96BD # +0x7642 0x96CE # +0x7643 0x96D2 # +0x7644 0x77BF # +0x7645 0x96E0 # +0x7646 0x928E # +0x7647 0x92AE # +0x7648 0x92C8 # +0x7649 0x933E # +0x764A 0x936A # +0x764B 0x93CA # +0x764C 0x938F # +0x764D 0x943E # +0x764E 0x946B # +0x764F 0x9C7F # +0x7650 0x9C82 # +0x7651 0x9C85 # +0x7652 0x9C86 # +0x7653 0x9C87 # +0x7654 0x9C88 # +0x7655 0x7A23 # +0x7656 0x9C8B # +0x7657 0x9C8E # +0x7658 0x9C90 # +0x7659 0x9C91 # +0x765A 0x9C92 # +0x765B 0x9C94 # +0x765C 0x9C95 # +0x765D 0x9C9A # +0x765E 0x9C9B # +0x765F 0x9C9E # +0x7660 0x9C9F # +0x7661 0x9CA0 # +0x7662 0x9CA1 # +0x7663 0x9CA2 # +0x7664 0x9CA3 # +0x7665 0x9CA5 # +0x7666 0x9CA6 # +0x7667 0x9CA7 # +0x7668 0x9CA8 # +0x7669 0x9CA9 # +0x766A 0x9CAB # +0x766B 0x9CAD # +0x766C 0x9CAE # +0x766D 0x9CB0 # +0x766E 0x9CB1 # +0x766F 0x9CB2 # +0x7670 0x9CB3 # +0x7671 0x9CB4 # +0x7672 0x9CB5 # +0x7673 0x9CB6 # +0x7674 0x9CB7 # +0x7675 0x9CBA # +0x7676 0x9CBB # +0x7677 0x9CBC # +0x7678 0x9CBD # +0x7679 0x9CC4 # +0x767A 0x9CC5 # +0x767B 0x9CC6 # +0x767C 0x9CC7 # +0x767D 0x9CCA # +0x767E 0x9CCB # +0x7721 0x9CCC # +0x7722 0x9CCD # +0x7723 0x9CCE # +0x7724 0x9CCF # +0x7725 0x9CD0 # +0x7726 0x9CD3 # +0x7727 0x9CD4 # +0x7728 0x9CD5 # +0x7729 0x9CD7 # +0x772A 0x9CD8 # +0x772B 0x9CD9 # +0x772C 0x9CDC # +0x772D 0x9CDD # +0x772E 0x9CDF # +0x772F 0x9CE2 # +0x7730 0x977C # +0x7731 0x9785 # +0x7732 0x9791 # +0x7733 0x9792 # +0x7734 0x9794 # +0x7735 0x97AF # +0x7736 0x97AB # +0x7737 0x97A3 # +0x7738 0x97B2 # +0x7739 0x97B4 # +0x773A 0x9AB1 # +0x773B 0x9AB0 # +0x773C 0x9AB7 # +0x773D 0x9E58 # +0x773E 0x9AB6 # +0x773F 0x9ABA # +0x7740 0x9ABC # +0x7741 0x9AC1 # +0x7742 0x9AC0 # +0x7743 0x9AC5 # +0x7744 0x9AC2 # +0x7745 0x9ACB # +0x7746 0x9ACC # +0x7747 0x9AD1 # +0x7748 0x9B45 # +0x7749 0x9B43 # +0x774A 0x9B47 # +0x774B 0x9B49 # +0x774C 0x9B48 # +0x774D 0x9B4D # +0x774E 0x9B51 # +0x774F 0x98E8 # +0x7750 0x990D # +0x7751 0x992E # +0x7752 0x9955 # +0x7753 0x9954 # +0x7754 0x9ADF # +0x7755 0x9AE1 # +0x7756 0x9AE6 # +0x7757 0x9AEF # +0x7758 0x9AEB # +0x7759 0x9AFB # +0x775A 0x9AED # +0x775B 0x9AF9 # +0x775C 0x9B08 # +0x775D 0x9B0F # +0x775E 0x9B13 # +0x775F 0x9B1F # +0x7760 0x9B23 # +0x7761 0x9EBD # +0x7762 0x9EBE # +0x7763 0x7E3B # +0x7764 0x9E82 # +0x7765 0x9E87 # +0x7766 0x9E88 # +0x7767 0x9E8B # +0x7768 0x9E92 # +0x7769 0x93D6 # +0x776A 0x9E9D # +0x776B 0x9E9F # +0x776C 0x9EDB # +0x776D 0x9EDC # +0x776E 0x9EDD # +0x776F 0x9EE0 # +0x7770 0x9EDF # +0x7771 0x9EE2 # +0x7772 0x9EE9 # +0x7773 0x9EE7 # +0x7774 0x9EE5 # +0x7775 0x9EEA # +0x7776 0x9EEF # +0x7777 0x9F22 # +0x7778 0x9F2C # +0x7779 0x9F2F # +0x777A 0x9F39 # +0x777B 0x9F37 # +0x777C 0x9F3D # +0x777D 0x9F3E # +0x777E 0x9F44 # diff --git a/Tools/unicode/python-mappings/diff/jisx0213-2000-std.txt.diff b/Tools/unicode/python-mappings/diff/jisx0213-2000-std.txt.diff new file mode 100644 index 00000000..e4171d5e --- /dev/null +++ b/Tools/unicode/python-mappings/diff/jisx0213-2000-std.txt.diff @@ -0,0 +1,271 @@ +--- jisx0213-2000-std.txt.orig Tue Apr 16 23:32:38 2002 ++++ jisx0213-2000-std.txt Wed Jun 16 14:49:05 2004 +@@ -23,21 +23,21 @@ + 3-2121 U+3000 # IDEOGRAPHIC SPACE + 3-2122 U+3001 # IDEOGRAPHIC COMMA + 3-2123 U+3002 # IDEOGRAPHIC FULL STOP +-3-2124 U+002C # COMMA Fullwidth: U+FF0C +-3-2125 U+002E # FULL STOP Fullwidth: U+FF0E ++3-2124 U+FF0C # COMMA Fullwidth: U+FF0C ++3-2125 U+FF0E # FULL STOP Fullwidth: U+FF0E + 3-2126 U+30FB # KATAKANA MIDDLE DOT +-3-2127 U+003A # COLON Fullwidth: U+FF1A +-3-2128 U+003B # SEMICOLON Fullwidth: U+FF1B +-3-2129 U+003F # QUESTION MARK Fullwidth: U+FF1F +-3-212A U+0021 # EXCLAMATION MARK Fullwidth: U+FF01 ++3-2127 U+FF1A # COLON Fullwidth: U+FF1A ++3-2128 U+FF1B # SEMICOLON Fullwidth: U+FF1B ++3-2129 U+FF1F # QUESTION MARK Fullwidth: U+FF1F ++3-212A U+FF01 # EXCLAMATION MARK Fullwidth: U+FF01 + 3-212B U+309B # KATAKANA-HIRAGANA VOICED SOUND MARK + 3-212C U+309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + 3-212D U+00B4 # ACUTE ACCENT +-3-212E U+0060 # GRAVE ACCENT Fullwidth: U+FF40 ++3-212E U+FF40 # GRAVE ACCENT Fullwidth: U+FF40 + 3-212F U+00A8 # DIAERESIS +-3-2130 U+005E # CIRCUMFLEX ACCENT Fullwidth: U+FF3E +-3-2131 U+203E # OVERLINE Windows: U+FFE3 +-3-2132 U+005F # LOW LINE Fullwidth: U+FF3F ++3-2130 U+FF3E # CIRCUMFLEX ACCENT Fullwidth: U+FF3E ++3-2131 U+FFE3 # OVERLINE Windows: U+FFE3 ++3-2132 U+FF3F # LOW LINE Fullwidth: U+FF3F + 3-2133 U+30FD # KATAKANA ITERATION MARK + 3-2134 U+30FE # KATAKANA VOICED ITERATION MARK + 3-2135 U+309D # HIRAGANA ITERATION MARK +@@ -48,27 +48,27 @@ + 3-213A U+3006 # IDEOGRAPHIC CLOSING MARK + 3-213B U+3007 # IDEOGRAPHIC NUMBER ZERO + 3-213C U+30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK +-3-213D U+2014 # EM DASH Windows: U+2015 ++3-213D U+2015 # EM DASH Windows: U+2015 + 3-213E U+2010 # HYPHEN +-3-213F U+002F # SOLIDUS Fullwidth: U+FF0F ++3-213F U+FF0F # SOLIDUS Fullwidth: U+FF0F + 3-2140 U+005C # REVERSE SOLIDUS Fullwidth: U+FF3C + 3-2141 U+301C # WAVE DASH Windows: U+FF5E + 3-2142 U+2016 # DOUBLE VERTICAL LINE Windows: U+2225 +-3-2143 U+007C # VERTICAL LINE Fullwidth: U+FF5C ++3-2143 U+FF5C # VERTICAL LINE Fullwidth: U+FF5C + 3-2144 U+2026 # HORIZONTAL ELLIPSIS + 3-2145 U+2025 # TWO DOT LEADER + 3-2146 U+2018 # LEFT SINGLE QUOTATION MARK + 3-2147 U+2019 # RIGHT SINGLE QUOTATION MARK + 3-2148 U+201C # LEFT DOUBLE QUOTATION MARK + 3-2149 U+201D # RIGHT DOUBLE QUOTATION MARK +-3-214A U+0028 # LEFT PARENTHESIS Fullwidth: U+FF08 +-3-214B U+0029 # RIGHT PARENTHESIS Fullwidth: U+FF09 ++3-214A U+FF08 # LEFT PARENTHESIS Fullwidth: U+FF08 ++3-214B U+FF09 # RIGHT PARENTHESIS Fullwidth: U+FF09 + 3-214C U+3014 # LEFT TORTOISE SHELL BRACKET + 3-214D U+3015 # RIGHT TORTOISE SHELL BRACKET +-3-214E U+005B # LEFT SQUARE BRACKET Fullwidth: U+FF3B +-3-214F U+005D # RIGHT SQUARE BRACKET Fullwidth: U+FF3D +-3-2150 U+007B # LEFT CURLY BRACKET Fullwidth: U+FF5B +-3-2151 U+007D # RIGHT CURLY BRACKET Fullwidth: U+FF5D ++3-214E U+FF3B # LEFT SQUARE BRACKET Fullwidth: U+FF3B ++3-214F U+FF3D # RIGHT SQUARE BRACKET Fullwidth: U+FF3D ++3-2150 U+FF5B # LEFT CURLY BRACKET Fullwidth: U+FF5B ++3-2151 U+FF5D # RIGHT CURLY BRACKET Fullwidth: U+FF5D + 3-2152 U+3008 # LEFT ANGLE BRACKET + 3-2153 U+3009 # RIGHT ANGLE BRACKET + 3-2154 U+300A # LEFT DOUBLE ANGLE BRACKET +@@ -79,15 +79,15 @@ + 3-2159 U+300F # RIGHT WHITE CORNER BRACKET + 3-215A U+3010 # LEFT BLACK LENTICULAR BRACKET + 3-215B U+3011 # RIGHT BLACK LENTICULAR BRACKET +-3-215C U+002B # PLUS SIGN Fullwidth: U+FF0B ++3-215C U+FF0B # PLUS SIGN Fullwidth: U+FF0B + 3-215D U+2212 # MINUS SIGN Windows: U+FF0D + 3-215E U+00B1 # PLUS-MINUS SIGN + 3-215F U+00D7 # MULTIPLICATION SIGN + 3-2160 U+00F7 # DIVISION SIGN +-3-2161 U+003D # EQUALS SIGN Fullwidth: U+FF1D ++3-2161 U+FF1D # EQUALS SIGN Fullwidth: U+FF1D + 3-2162 U+2260 # NOT EQUAL TO +-3-2163 U+003C # LESS-THAN SIGN Fullwidth: U+FF1C +-3-2164 U+003E # GREATER-THAN SIGN Fullwidth: U+FF1E ++3-2163 U+FF1C # LESS-THAN SIGN Fullwidth: U+FF1C ++3-2164 U+FF1E # GREATER-THAN SIGN Fullwidth: U+FF1E + 3-2165 U+2266 # LESS-THAN OVER EQUAL TO + 3-2166 U+2267 # GREATER-THAN OVER EQUAL TO + 3-2167 U+221E # INFINITY +@@ -98,15 +98,15 @@ + 3-216C U+2032 # PRIME + 3-216D U+2033 # DOUBLE PRIME + 3-216E U+2103 # DEGREE CELSIUS +-3-216F U+00A5 # YEN SIGN Windows: U+FFE5 +-3-2170 U+0024 # DOLLAR SIGN Fullwidth: U+FF04 ++3-216F U+FFE5 # YEN SIGN Windows: U+FFE5 ++3-2170 U+FF04 # DOLLAR SIGN Fullwidth: U+FF04 + 3-2171 U+00A2 # CENT SIGN Windows: U+FFE0 + 3-2172 U+00A3 # POUND SIGN Windows: U+FFE1 +-3-2173 U+0025 # PERCENT SIGN Fullwidth: U+FF05 +-3-2174 U+0023 # NUMBER SIGN Fullwidth: U+FF03 +-3-2175 U+0026 # AMPERSAND Fullwidth: U+FF06 +-3-2176 U+002A # ASTERISK Fullwidth: U+FF0A +-3-2177 U+0040 # COMMERCIAL AT Fullwidth: U+FF20 ++3-2173 U+FF05 # PERCENT SIGN Fullwidth: U+FF05 ++3-2174 U+FF03 # NUMBER SIGN Fullwidth: U+FF03 ++3-2175 U+FF06 # AMPERSAND Fullwidth: U+FF06 ++3-2176 U+FF0A # ASTERISK Fullwidth: U+FF0A ++3-2177 U+FF20 # COMMERCIAL AT Fullwidth: U+FF20 + 3-2178 U+00A7 # SECTION SIGN + 3-2179 U+2606 # WHITE STAR + 3-217A U+2605 # BLACK STAR +@@ -128,9 +128,9 @@ + 3-222C U+2191 # UPWARDS ARROW + 3-222D U+2193 # DOWNWARDS ARROW + 3-222E U+3013 # GETA MARK +-3-222F U+0027 # APOSTROPHE Fullwidth: U+FF07 +-3-2230 U+0022 # QUOTATION MARK [2000] Fullwidth: U+FF02 +-3-2231 U+002D # HYPHEN-MINUS [2000] Fullwidth: U+FF0D ++3-222F U+FF07 # APOSTROPHE Fullwidth: U+FF07 ++3-2230 U+FF02 # QUOTATION MARK [2000] Fullwidth: U+FF02 ++3-2231 U+FF0D # HYPHEN-MINUS [2000] Fullwidth: U+FF0D + 3-2232 U+007E # TILDE [2000] Fullwidth: U+FF5E + 3-2233 U+3033 # VERTICAL KANA REPEAT MARK UPPER HALF [2000] + 3-2234 U+3034 # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF [2000] +@@ -223,16 +223,16 @@ + 3-232D U+21E9 # DOWNWARDS WHITE ARROW [2000] + 3-232E U+2934 # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS [2000] [Unicode3.2] + 3-232F U+2935 # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS [2000] [Unicode3.2] +-3-2330 U+0030 # DIGIT ZERO Fullwidth: U+FF10 +-3-2331 U+0031 # DIGIT ONE Fullwidth: U+FF11 +-3-2332 U+0032 # DIGIT TWO Fullwidth: U+FF12 +-3-2333 U+0033 # DIGIT THREE Fullwidth: U+FF13 +-3-2334 U+0034 # DIGIT FOUR Fullwidth: U+FF14 +-3-2335 U+0035 # DIGIT FIVE Fullwidth: U+FF15 +-3-2336 U+0036 # DIGIT SIX Fullwidth: U+FF16 +-3-2337 U+0037 # DIGIT SEVEN Fullwidth: U+FF17 +-3-2338 U+0038 # DIGIT EIGHT Fullwidth: U+FF18 +-3-2339 U+0039 # DIGIT NINE Fullwidth: U+FF19 ++3-2330 U+FF10 # DIGIT ZERO Fullwidth: U+FF10 ++3-2331 U+FF11 # DIGIT ONE Fullwidth: U+FF11 ++3-2332 U+FF12 # DIGIT TWO Fullwidth: U+FF12 ++3-2333 U+FF13 # DIGIT THREE Fullwidth: U+FF13 ++3-2334 U+FF14 # DIGIT FOUR Fullwidth: U+FF14 ++3-2335 U+FF15 # DIGIT FIVE Fullwidth: U+FF15 ++3-2336 U+FF16 # DIGIT SIX Fullwidth: U+FF16 ++3-2337 U+FF17 # DIGIT SEVEN Fullwidth: U+FF17 ++3-2338 U+FF18 # DIGIT EIGHT Fullwidth: U+FF18 ++3-2339 U+FF19 # DIGIT NINE Fullwidth: U+FF19 + 3-233A U+29BF # CIRCLED BULLET [2000] [Unicode3.2] + 3-233B U+25C9 # FISHEYE [2000] + 3-233C U+303D # PART ALTERNATION MARK [2000] [Unicode3.2] +@@ -240,64 +240,64 @@ + 3-233E U+FE45 # SESAME DOT [2000] [Unicode3.2] + 3-233F U+25E6 # WHITE BULLET [2000] + 3-2340 U+2022 # BULLET [2000] +-3-2341 U+0041 # LATIN CAPITAL LETTER A Fullwidth: U+FF21 +-3-2342 U+0042 # LATIN CAPITAL LETTER B Fullwidth: U+FF22 +-3-2343 U+0043 # LATIN CAPITAL LETTER C Fullwidth: U+FF23 +-3-2344 U+0044 # LATIN CAPITAL LETTER D Fullwidth: U+FF24 +-3-2345 U+0045 # LATIN CAPITAL LETTER E Fullwidth: U+FF25 +-3-2346 U+0046 # LATIN CAPITAL LETTER F Fullwidth: U+FF26 +-3-2347 U+0047 # LATIN CAPITAL LETTER G Fullwidth: U+FF27 +-3-2348 U+0048 # LATIN CAPITAL LETTER H Fullwidth: U+FF28 +-3-2349 U+0049 # LATIN CAPITAL LETTER I Fullwidth: U+FF29 +-3-234A U+004A # LATIN CAPITAL LETTER J Fullwidth: U+FF2A +-3-234B U+004B # LATIN CAPITAL LETTER K Fullwidth: U+FF2B +-3-234C U+004C # LATIN CAPITAL LETTER L Fullwidth: U+FF2C +-3-234D U+004D # LATIN CAPITAL LETTER M Fullwidth: U+FF2D +-3-234E U+004E # LATIN CAPITAL LETTER N Fullwidth: U+FF2E +-3-234F U+004F # LATIN CAPITAL LETTER O Fullwidth: U+FF2F +-3-2350 U+0050 # LATIN CAPITAL LETTER P Fullwidth: U+FF30 +-3-2351 U+0051 # LATIN CAPITAL LETTER Q Fullwidth: U+FF31 +-3-2352 U+0052 # LATIN CAPITAL LETTER R Fullwidth: U+FF32 +-3-2353 U+0053 # LATIN CAPITAL LETTER S Fullwidth: U+FF33 +-3-2354 U+0054 # LATIN CAPITAL LETTER T Fullwidth: U+FF34 +-3-2355 U+0055 # LATIN CAPITAL LETTER U Fullwidth: U+FF35 +-3-2356 U+0056 # LATIN CAPITAL LETTER V Fullwidth: U+FF36 +-3-2357 U+0057 # LATIN CAPITAL LETTER W Fullwidth: U+FF37 +-3-2358 U+0058 # LATIN CAPITAL LETTER X Fullwidth: U+FF38 +-3-2359 U+0059 # LATIN CAPITAL LETTER Y Fullwidth: U+FF39 +-3-235A U+005A # LATIN CAPITAL LETTER Z Fullwidth: U+FF3A ++3-2341 U+FF21 # LATIN CAPITAL LETTER A Fullwidth: U+FF21 ++3-2342 U+FF22 # LATIN CAPITAL LETTER B Fullwidth: U+FF22 ++3-2343 U+FF23 # LATIN CAPITAL LETTER C Fullwidth: U+FF23 ++3-2344 U+FF24 # LATIN CAPITAL LETTER D Fullwidth: U+FF24 ++3-2345 U+FF25 # LATIN CAPITAL LETTER E Fullwidth: U+FF25 ++3-2346 U+FF26 # LATIN CAPITAL LETTER F Fullwidth: U+FF26 ++3-2347 U+FF27 # LATIN CAPITAL LETTER G Fullwidth: U+FF27 ++3-2348 U+FF28 # LATIN CAPITAL LETTER H Fullwidth: U+FF28 ++3-2349 U+FF29 # LATIN CAPITAL LETTER I Fullwidth: U+FF29 ++3-234A U+FF2A # LATIN CAPITAL LETTER J Fullwidth: U+FF2A ++3-234B U+FF2B # LATIN CAPITAL LETTER K Fullwidth: U+FF2B ++3-234C U+FF2C # LATIN CAPITAL LETTER L Fullwidth: U+FF2C ++3-234D U+FF2D # LATIN CAPITAL LETTER M Fullwidth: U+FF2D ++3-234E U+FF2E # LATIN CAPITAL LETTER N Fullwidth: U+FF2E ++3-234F U+FF2F # LATIN CAPITAL LETTER O Fullwidth: U+FF2F ++3-2350 U+FF30 # LATIN CAPITAL LETTER P Fullwidth: U+FF30 ++3-2351 U+FF31 # LATIN CAPITAL LETTER Q Fullwidth: U+FF31 ++3-2352 U+FF32 # LATIN CAPITAL LETTER R Fullwidth: U+FF32 ++3-2353 U+FF33 # LATIN CAPITAL LETTER S Fullwidth: U+FF33 ++3-2354 U+FF34 # LATIN CAPITAL LETTER T Fullwidth: U+FF34 ++3-2355 U+FF35 # LATIN CAPITAL LETTER U Fullwidth: U+FF35 ++3-2356 U+FF36 # LATIN CAPITAL LETTER V Fullwidth: U+FF36 ++3-2357 U+FF37 # LATIN CAPITAL LETTER W Fullwidth: U+FF37 ++3-2358 U+FF38 # LATIN CAPITAL LETTER X Fullwidth: U+FF38 ++3-2359 U+FF39 # LATIN CAPITAL LETTER Y Fullwidth: U+FF39 ++3-235A U+FF3A # LATIN CAPITAL LETTER Z Fullwidth: U+FF3A + 3-235B U+2213 # MINUS-OR-PLUS SIGN [2000] + 3-235C U+2135 # ALEF SYMBOL [2000] + 3-235D U+210F # PLANCK CONSTANT OVER TWO PI [2000] + 3-235E U+33CB # SQUARE HP [2000] + 3-235F U+2113 # SCRIPT SMALL L [2000] + 3-2360 U+2127 # INVERTED OHM SIGN [2000] +-3-2361 U+0061 # LATIN SMALL LETTER A Fullwidth: U+FF41 +-3-2362 U+0062 # LATIN SMALL LETTER B Fullwidth: U+FF42 +-3-2363 U+0063 # LATIN SMALL LETTER C Fullwidth: U+FF43 +-3-2364 U+0064 # LATIN SMALL LETTER D Fullwidth: U+FF44 +-3-2365 U+0065 # LATIN SMALL LETTER E Fullwidth: U+FF45 +-3-2366 U+0066 # LATIN SMALL LETTER F Fullwidth: U+FF46 +-3-2367 U+0067 # LATIN SMALL LETTER G Fullwidth: U+FF47 +-3-2368 U+0068 # LATIN SMALL LETTER H Fullwidth: U+FF48 +-3-2369 U+0069 # LATIN SMALL LETTER I Fullwidth: U+FF49 +-3-236A U+006A # LATIN SMALL LETTER J Fullwidth: U+FF4A +-3-236B U+006B # LATIN SMALL LETTER K Fullwidth: U+FF4B +-3-236C U+006C # LATIN SMALL LETTER L Fullwidth: U+FF4C +-3-236D U+006D # LATIN SMALL LETTER M Fullwidth: U+FF4D +-3-236E U+006E # LATIN SMALL LETTER N Fullwidth: U+FF4E +-3-236F U+006F # LATIN SMALL LETTER O Fullwidth: U+FF4F +-3-2370 U+0070 # LATIN SMALL LETTER P Fullwidth: U+FF50 +-3-2371 U+0071 # LATIN SMALL LETTER Q Fullwidth: U+FF51 +-3-2372 U+0072 # LATIN SMALL LETTER R Fullwidth: U+FF52 +-3-2373 U+0073 # LATIN SMALL LETTER S Fullwidth: U+FF53 +-3-2374 U+0074 # LATIN SMALL LETTER T Fullwidth: U+FF54 +-3-2375 U+0075 # LATIN SMALL LETTER U Fullwidth: U+FF55 +-3-2376 U+0076 # LATIN SMALL LETTER V Fullwidth: U+FF56 +-3-2377 U+0077 # LATIN SMALL LETTER W Fullwidth: U+FF57 +-3-2378 U+0078 # LATIN SMALL LETTER X Fullwidth: U+FF58 +-3-2379 U+0079 # LATIN SMALL LETTER Y Fullwidth: U+FF59 +-3-237A U+007A # LATIN SMALL LETTER Z Fullwidth: U+FF5A ++3-2361 U+FF41 # LATIN SMALL LETTER A Fullwidth: U+FF41 ++3-2362 U+FF42 # LATIN SMALL LETTER B Fullwidth: U+FF42 ++3-2363 U+FF43 # LATIN SMALL LETTER C Fullwidth: U+FF43 ++3-2364 U+FF44 # LATIN SMALL LETTER D Fullwidth: U+FF44 ++3-2365 U+FF45 # LATIN SMALL LETTER E Fullwidth: U+FF45 ++3-2366 U+FF46 # LATIN SMALL LETTER F Fullwidth: U+FF46 ++3-2367 U+FF47 # LATIN SMALL LETTER G Fullwidth: U+FF47 ++3-2368 U+FF48 # LATIN SMALL LETTER H Fullwidth: U+FF48 ++3-2369 U+FF49 # LATIN SMALL LETTER I Fullwidth: U+FF49 ++3-236A U+FF4A # LATIN SMALL LETTER J Fullwidth: U+FF4A ++3-236B U+FF4B # LATIN SMALL LETTER K Fullwidth: U+FF4B ++3-236C U+FF4C # LATIN SMALL LETTER L Fullwidth: U+FF4C ++3-236D U+FF4D # LATIN SMALL LETTER M Fullwidth: U+FF4D ++3-236E U+FF4E # LATIN SMALL LETTER N Fullwidth: U+FF4E ++3-236F U+FF4F # LATIN SMALL LETTER O Fullwidth: U+FF4F ++3-2370 U+FF50 # LATIN SMALL LETTER P Fullwidth: U+FF50 ++3-2371 U+FF51 # LATIN SMALL LETTER Q Fullwidth: U+FF51 ++3-2372 U+FF52 # LATIN SMALL LETTER R Fullwidth: U+FF52 ++3-2373 U+FF53 # LATIN SMALL LETTER S Fullwidth: U+FF53 ++3-2374 U+FF54 # LATIN SMALL LETTER T Fullwidth: U+FF54 ++3-2375 U+FF55 # LATIN SMALL LETTER U Fullwidth: U+FF55 ++3-2376 U+FF56 # LATIN SMALL LETTER V Fullwidth: U+FF56 ++3-2377 U+FF57 # LATIN SMALL LETTER W Fullwidth: U+FF57 ++3-2378 U+FF58 # LATIN SMALL LETTER X Fullwidth: U+FF58 ++3-2379 U+FF59 # LATIN SMALL LETTER Y Fullwidth: U+FF59 ++3-237A U+FF5A # LATIN SMALL LETTER Z Fullwidth: U+FF5A + 3-237B U+30A0 # KATAKANA-HIRAGANA DOUBLE HYPHEN [2000] [Unicode3.2] + 3-237C U+2013 # EN DASH [2000] + 3-237D U+29FA # DOUBLE PLUS [2000] [Unicode3.2] diff --git a/Tools/unicode/python-mappings/diff/jisx0213-2004-std.txt.diff b/Tools/unicode/python-mappings/diff/jisx0213-2004-std.txt.diff new file mode 100644 index 00000000..f862a49e --- /dev/null +++ b/Tools/unicode/python-mappings/diff/jisx0213-2004-std.txt.diff @@ -0,0 +1,351 @@ +--- jisx0213-2000-std.txt.orig Tue Apr 16 23:32:38 2002 ++++ jisx0213-2004-std.txt Thu Jul 8 11:51:54 2004 +@@ -1,6 +1,6 @@ +-## JIS X 0213:2000 vs Unicode mapping table ++## JIS X 0213:2004 vs Unicode mapping table + ## +-## Date: 16 Apr 2002 13:09:49 GMT ++## Date: 7 Jul 2004 13:09:49 GMT + ## License: + ## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved. + ## Copyright (C) 2001 I'O, All Rights Reserved. +@@ -23,21 +23,21 @@ + 3-2121 U+3000 # IDEOGRAPHIC SPACE + 3-2122 U+3001 # IDEOGRAPHIC COMMA + 3-2123 U+3002 # IDEOGRAPHIC FULL STOP +-3-2124 U+002C # COMMA Fullwidth: U+FF0C +-3-2125 U+002E # FULL STOP Fullwidth: U+FF0E ++3-2124 U+FF0C # COMMA Fullwidth: U+FF0C ++3-2125 U+FF0E # FULL STOP Fullwidth: U+FF0E + 3-2126 U+30FB # KATAKANA MIDDLE DOT +-3-2127 U+003A # COLON Fullwidth: U+FF1A +-3-2128 U+003B # SEMICOLON Fullwidth: U+FF1B +-3-2129 U+003F # QUESTION MARK Fullwidth: U+FF1F +-3-212A U+0021 # EXCLAMATION MARK Fullwidth: U+FF01 ++3-2127 U+FF1A # COLON Fullwidth: U+FF1A ++3-2128 U+FF1B # SEMICOLON Fullwidth: U+FF1B ++3-2129 U+FF1F # QUESTION MARK Fullwidth: U+FF1F ++3-212A U+FF01 # EXCLAMATION MARK Fullwidth: U+FF01 + 3-212B U+309B # KATAKANA-HIRAGANA VOICED SOUND MARK + 3-212C U+309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + 3-212D U+00B4 # ACUTE ACCENT +-3-212E U+0060 # GRAVE ACCENT Fullwidth: U+FF40 ++3-212E U+FF40 # GRAVE ACCENT Fullwidth: U+FF40 + 3-212F U+00A8 # DIAERESIS +-3-2130 U+005E # CIRCUMFLEX ACCENT Fullwidth: U+FF3E +-3-2131 U+203E # OVERLINE Windows: U+FFE3 +-3-2132 U+005F # LOW LINE Fullwidth: U+FF3F ++3-2130 U+FF3E # CIRCUMFLEX ACCENT Fullwidth: U+FF3E ++3-2131 U+FFE3 # OVERLINE Windows: U+FFE3 ++3-2132 U+FF3F # LOW LINE Fullwidth: U+FF3F + 3-2133 U+30FD # KATAKANA ITERATION MARK + 3-2134 U+30FE # KATAKANA VOICED ITERATION MARK + 3-2135 U+309D # HIRAGANA ITERATION MARK +@@ -48,27 +48,27 @@ + 3-213A U+3006 # IDEOGRAPHIC CLOSING MARK + 3-213B U+3007 # IDEOGRAPHIC NUMBER ZERO + 3-213C U+30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK +-3-213D U+2014 # EM DASH Windows: U+2015 ++3-213D U+2015 # EM DASH Windows: U+2015 + 3-213E U+2010 # HYPHEN +-3-213F U+002F # SOLIDUS Fullwidth: U+FF0F ++3-213F U+FF0F # SOLIDUS Fullwidth: U+FF0F + 3-2140 U+005C # REVERSE SOLIDUS Fullwidth: U+FF3C + 3-2141 U+301C # WAVE DASH Windows: U+FF5E + 3-2142 U+2016 # DOUBLE VERTICAL LINE Windows: U+2225 +-3-2143 U+007C # VERTICAL LINE Fullwidth: U+FF5C ++3-2143 U+FF5C # VERTICAL LINE Fullwidth: U+FF5C + 3-2144 U+2026 # HORIZONTAL ELLIPSIS + 3-2145 U+2025 # TWO DOT LEADER + 3-2146 U+2018 # LEFT SINGLE QUOTATION MARK + 3-2147 U+2019 # RIGHT SINGLE QUOTATION MARK + 3-2148 U+201C # LEFT DOUBLE QUOTATION MARK + 3-2149 U+201D # RIGHT DOUBLE QUOTATION MARK +-3-214A U+0028 # LEFT PARENTHESIS Fullwidth: U+FF08 +-3-214B U+0029 # RIGHT PARENTHESIS Fullwidth: U+FF09 ++3-214A U+FF08 # LEFT PARENTHESIS Fullwidth: U+FF08 ++3-214B U+FF09 # RIGHT PARENTHESIS Fullwidth: U+FF09 + 3-214C U+3014 # LEFT TORTOISE SHELL BRACKET + 3-214D U+3015 # RIGHT TORTOISE SHELL BRACKET +-3-214E U+005B # LEFT SQUARE BRACKET Fullwidth: U+FF3B +-3-214F U+005D # RIGHT SQUARE BRACKET Fullwidth: U+FF3D +-3-2150 U+007B # LEFT CURLY BRACKET Fullwidth: U+FF5B +-3-2151 U+007D # RIGHT CURLY BRACKET Fullwidth: U+FF5D ++3-214E U+FF3B # LEFT SQUARE BRACKET Fullwidth: U+FF3B ++3-214F U+FF3D # RIGHT SQUARE BRACKET Fullwidth: U+FF3D ++3-2150 U+FF5B # LEFT CURLY BRACKET Fullwidth: U+FF5B ++3-2151 U+FF5D # RIGHT CURLY BRACKET Fullwidth: U+FF5D + 3-2152 U+3008 # LEFT ANGLE BRACKET + 3-2153 U+3009 # RIGHT ANGLE BRACKET + 3-2154 U+300A # LEFT DOUBLE ANGLE BRACKET +@@ -79,15 +79,15 @@ + 3-2159 U+300F # RIGHT WHITE CORNER BRACKET + 3-215A U+3010 # LEFT BLACK LENTICULAR BRACKET + 3-215B U+3011 # RIGHT BLACK LENTICULAR BRACKET +-3-215C U+002B # PLUS SIGN Fullwidth: U+FF0B ++3-215C U+FF0B # PLUS SIGN Fullwidth: U+FF0B + 3-215D U+2212 # MINUS SIGN Windows: U+FF0D + 3-215E U+00B1 # PLUS-MINUS SIGN + 3-215F U+00D7 # MULTIPLICATION SIGN + 3-2160 U+00F7 # DIVISION SIGN +-3-2161 U+003D # EQUALS SIGN Fullwidth: U+FF1D ++3-2161 U+FF1D # EQUALS SIGN Fullwidth: U+FF1D + 3-2162 U+2260 # NOT EQUAL TO +-3-2163 U+003C # LESS-THAN SIGN Fullwidth: U+FF1C +-3-2164 U+003E # GREATER-THAN SIGN Fullwidth: U+FF1E ++3-2163 U+FF1C # LESS-THAN SIGN Fullwidth: U+FF1C ++3-2164 U+FF1E # GREATER-THAN SIGN Fullwidth: U+FF1E + 3-2165 U+2266 # LESS-THAN OVER EQUAL TO + 3-2166 U+2267 # GREATER-THAN OVER EQUAL TO + 3-2167 U+221E # INFINITY +@@ -98,15 +98,15 @@ + 3-216C U+2032 # PRIME + 3-216D U+2033 # DOUBLE PRIME + 3-216E U+2103 # DEGREE CELSIUS +-3-216F U+00A5 # YEN SIGN Windows: U+FFE5 +-3-2170 U+0024 # DOLLAR SIGN Fullwidth: U+FF04 ++3-216F U+FFE5 # YEN SIGN Windows: U+FFE5 ++3-2170 U+FF04 # DOLLAR SIGN Fullwidth: U+FF04 + 3-2171 U+00A2 # CENT SIGN Windows: U+FFE0 + 3-2172 U+00A3 # POUND SIGN Windows: U+FFE1 +-3-2173 U+0025 # PERCENT SIGN Fullwidth: U+FF05 +-3-2174 U+0023 # NUMBER SIGN Fullwidth: U+FF03 +-3-2175 U+0026 # AMPERSAND Fullwidth: U+FF06 +-3-2176 U+002A # ASTERISK Fullwidth: U+FF0A +-3-2177 U+0040 # COMMERCIAL AT Fullwidth: U+FF20 ++3-2173 U+FF05 # PERCENT SIGN Fullwidth: U+FF05 ++3-2174 U+FF03 # NUMBER SIGN Fullwidth: U+FF03 ++3-2175 U+FF06 # AMPERSAND Fullwidth: U+FF06 ++3-2176 U+FF0A # ASTERISK Fullwidth: U+FF0A ++3-2177 U+FF20 # COMMERCIAL AT Fullwidth: U+FF20 + 3-2178 U+00A7 # SECTION SIGN + 3-2179 U+2606 # WHITE STAR + 3-217A U+2605 # BLACK STAR +@@ -128,9 +128,9 @@ + 3-222C U+2191 # UPWARDS ARROW + 3-222D U+2193 # DOWNWARDS ARROW + 3-222E U+3013 # GETA MARK +-3-222F U+0027 # APOSTROPHE Fullwidth: U+FF07 +-3-2230 U+0022 # QUOTATION MARK [2000] Fullwidth: U+FF02 +-3-2231 U+002D # HYPHEN-MINUS [2000] Fullwidth: U+FF0D ++3-222F U+FF07 # APOSTROPHE Fullwidth: U+FF07 ++3-2230 U+FF02 # QUOTATION MARK [2000] Fullwidth: U+FF02 ++3-2231 U+FF0D # HYPHEN-MINUS [2000] Fullwidth: U+FF0D + 3-2232 U+007E # TILDE [2000] Fullwidth: U+FF5E + 3-2233 U+3033 # VERTICAL KANA REPEAT MARK UPPER HALF [2000] + 3-2234 U+3034 # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF [2000] +@@ -223,16 +223,16 @@ + 3-232D U+21E9 # DOWNWARDS WHITE ARROW [2000] + 3-232E U+2934 # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS [2000] [Unicode3.2] + 3-232F U+2935 # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS [2000] [Unicode3.2] +-3-2330 U+0030 # DIGIT ZERO Fullwidth: U+FF10 +-3-2331 U+0031 # DIGIT ONE Fullwidth: U+FF11 +-3-2332 U+0032 # DIGIT TWO Fullwidth: U+FF12 +-3-2333 U+0033 # DIGIT THREE Fullwidth: U+FF13 +-3-2334 U+0034 # DIGIT FOUR Fullwidth: U+FF14 +-3-2335 U+0035 # DIGIT FIVE Fullwidth: U+FF15 +-3-2336 U+0036 # DIGIT SIX Fullwidth: U+FF16 +-3-2337 U+0037 # DIGIT SEVEN Fullwidth: U+FF17 +-3-2338 U+0038 # DIGIT EIGHT Fullwidth: U+FF18 +-3-2339 U+0039 # DIGIT NINE Fullwidth: U+FF19 ++3-2330 U+FF10 # DIGIT ZERO Fullwidth: U+FF10 ++3-2331 U+FF11 # DIGIT ONE Fullwidth: U+FF11 ++3-2332 U+FF12 # DIGIT TWO Fullwidth: U+FF12 ++3-2333 U+FF13 # DIGIT THREE Fullwidth: U+FF13 ++3-2334 U+FF14 # DIGIT FOUR Fullwidth: U+FF14 ++3-2335 U+FF15 # DIGIT FIVE Fullwidth: U+FF15 ++3-2336 U+FF16 # DIGIT SIX Fullwidth: U+FF16 ++3-2337 U+FF17 # DIGIT SEVEN Fullwidth: U+FF17 ++3-2338 U+FF18 # DIGIT EIGHT Fullwidth: U+FF18 ++3-2339 U+FF19 # DIGIT NINE Fullwidth: U+FF19 + 3-233A U+29BF # CIRCLED BULLET [2000] [Unicode3.2] + 3-233B U+25C9 # FISHEYE [2000] + 3-233C U+303D # PART ALTERNATION MARK [2000] [Unicode3.2] +@@ -240,64 +240,64 @@ + 3-233E U+FE45 # SESAME DOT [2000] [Unicode3.2] + 3-233F U+25E6 # WHITE BULLET [2000] + 3-2340 U+2022 # BULLET [2000] +-3-2341 U+0041 # LATIN CAPITAL LETTER A Fullwidth: U+FF21 +-3-2342 U+0042 # LATIN CAPITAL LETTER B Fullwidth: U+FF22 +-3-2343 U+0043 # LATIN CAPITAL LETTER C Fullwidth: U+FF23 +-3-2344 U+0044 # LATIN CAPITAL LETTER D Fullwidth: U+FF24 +-3-2345 U+0045 # LATIN CAPITAL LETTER E Fullwidth: U+FF25 +-3-2346 U+0046 # LATIN CAPITAL LETTER F Fullwidth: U+FF26 +-3-2347 U+0047 # LATIN CAPITAL LETTER G Fullwidth: U+FF27 +-3-2348 U+0048 # LATIN CAPITAL LETTER H Fullwidth: U+FF28 +-3-2349 U+0049 # LATIN CAPITAL LETTER I Fullwidth: U+FF29 +-3-234A U+004A # LATIN CAPITAL LETTER J Fullwidth: U+FF2A +-3-234B U+004B # LATIN CAPITAL LETTER K Fullwidth: U+FF2B +-3-234C U+004C # LATIN CAPITAL LETTER L Fullwidth: U+FF2C +-3-234D U+004D # LATIN CAPITAL LETTER M Fullwidth: U+FF2D +-3-234E U+004E # LATIN CAPITAL LETTER N Fullwidth: U+FF2E +-3-234F U+004F # LATIN CAPITAL LETTER O Fullwidth: U+FF2F +-3-2350 U+0050 # LATIN CAPITAL LETTER P Fullwidth: U+FF30 +-3-2351 U+0051 # LATIN CAPITAL LETTER Q Fullwidth: U+FF31 +-3-2352 U+0052 # LATIN CAPITAL LETTER R Fullwidth: U+FF32 +-3-2353 U+0053 # LATIN CAPITAL LETTER S Fullwidth: U+FF33 +-3-2354 U+0054 # LATIN CAPITAL LETTER T Fullwidth: U+FF34 +-3-2355 U+0055 # LATIN CAPITAL LETTER U Fullwidth: U+FF35 +-3-2356 U+0056 # LATIN CAPITAL LETTER V Fullwidth: U+FF36 +-3-2357 U+0057 # LATIN CAPITAL LETTER W Fullwidth: U+FF37 +-3-2358 U+0058 # LATIN CAPITAL LETTER X Fullwidth: U+FF38 +-3-2359 U+0059 # LATIN CAPITAL LETTER Y Fullwidth: U+FF39 +-3-235A U+005A # LATIN CAPITAL LETTER Z Fullwidth: U+FF3A ++3-2341 U+FF21 # LATIN CAPITAL LETTER A Fullwidth: U+FF21 ++3-2342 U+FF22 # LATIN CAPITAL LETTER B Fullwidth: U+FF22 ++3-2343 U+FF23 # LATIN CAPITAL LETTER C Fullwidth: U+FF23 ++3-2344 U+FF24 # LATIN CAPITAL LETTER D Fullwidth: U+FF24 ++3-2345 U+FF25 # LATIN CAPITAL LETTER E Fullwidth: U+FF25 ++3-2346 U+FF26 # LATIN CAPITAL LETTER F Fullwidth: U+FF26 ++3-2347 U+FF27 # LATIN CAPITAL LETTER G Fullwidth: U+FF27 ++3-2348 U+FF28 # LATIN CAPITAL LETTER H Fullwidth: U+FF28 ++3-2349 U+FF29 # LATIN CAPITAL LETTER I Fullwidth: U+FF29 ++3-234A U+FF2A # LATIN CAPITAL LETTER J Fullwidth: U+FF2A ++3-234B U+FF2B # LATIN CAPITAL LETTER K Fullwidth: U+FF2B ++3-234C U+FF2C # LATIN CAPITAL LETTER L Fullwidth: U+FF2C ++3-234D U+FF2D # LATIN CAPITAL LETTER M Fullwidth: U+FF2D ++3-234E U+FF2E # LATIN CAPITAL LETTER N Fullwidth: U+FF2E ++3-234F U+FF2F # LATIN CAPITAL LETTER O Fullwidth: U+FF2F ++3-2350 U+FF30 # LATIN CAPITAL LETTER P Fullwidth: U+FF30 ++3-2351 U+FF31 # LATIN CAPITAL LETTER Q Fullwidth: U+FF31 ++3-2352 U+FF32 # LATIN CAPITAL LETTER R Fullwidth: U+FF32 ++3-2353 U+FF33 # LATIN CAPITAL LETTER S Fullwidth: U+FF33 ++3-2354 U+FF34 # LATIN CAPITAL LETTER T Fullwidth: U+FF34 ++3-2355 U+FF35 # LATIN CAPITAL LETTER U Fullwidth: U+FF35 ++3-2356 U+FF36 # LATIN CAPITAL LETTER V Fullwidth: U+FF36 ++3-2357 U+FF37 # LATIN CAPITAL LETTER W Fullwidth: U+FF37 ++3-2358 U+FF38 # LATIN CAPITAL LETTER X Fullwidth: U+FF38 ++3-2359 U+FF39 # LATIN CAPITAL LETTER Y Fullwidth: U+FF39 ++3-235A U+FF3A # LATIN CAPITAL LETTER Z Fullwidth: U+FF3A + 3-235B U+2213 # MINUS-OR-PLUS SIGN [2000] + 3-235C U+2135 # ALEF SYMBOL [2000] + 3-235D U+210F # PLANCK CONSTANT OVER TWO PI [2000] + 3-235E U+33CB # SQUARE HP [2000] + 3-235F U+2113 # SCRIPT SMALL L [2000] + 3-2360 U+2127 # INVERTED OHM SIGN [2000] +-3-2361 U+0061 # LATIN SMALL LETTER A Fullwidth: U+FF41 +-3-2362 U+0062 # LATIN SMALL LETTER B Fullwidth: U+FF42 +-3-2363 U+0063 # LATIN SMALL LETTER C Fullwidth: U+FF43 +-3-2364 U+0064 # LATIN SMALL LETTER D Fullwidth: U+FF44 +-3-2365 U+0065 # LATIN SMALL LETTER E Fullwidth: U+FF45 +-3-2366 U+0066 # LATIN SMALL LETTER F Fullwidth: U+FF46 +-3-2367 U+0067 # LATIN SMALL LETTER G Fullwidth: U+FF47 +-3-2368 U+0068 # LATIN SMALL LETTER H Fullwidth: U+FF48 +-3-2369 U+0069 # LATIN SMALL LETTER I Fullwidth: U+FF49 +-3-236A U+006A # LATIN SMALL LETTER J Fullwidth: U+FF4A +-3-236B U+006B # LATIN SMALL LETTER K Fullwidth: U+FF4B +-3-236C U+006C # LATIN SMALL LETTER L Fullwidth: U+FF4C +-3-236D U+006D # LATIN SMALL LETTER M Fullwidth: U+FF4D +-3-236E U+006E # LATIN SMALL LETTER N Fullwidth: U+FF4E +-3-236F U+006F # LATIN SMALL LETTER O Fullwidth: U+FF4F +-3-2370 U+0070 # LATIN SMALL LETTER P Fullwidth: U+FF50 +-3-2371 U+0071 # LATIN SMALL LETTER Q Fullwidth: U+FF51 +-3-2372 U+0072 # LATIN SMALL LETTER R Fullwidth: U+FF52 +-3-2373 U+0073 # LATIN SMALL LETTER S Fullwidth: U+FF53 +-3-2374 U+0074 # LATIN SMALL LETTER T Fullwidth: U+FF54 +-3-2375 U+0075 # LATIN SMALL LETTER U Fullwidth: U+FF55 +-3-2376 U+0076 # LATIN SMALL LETTER V Fullwidth: U+FF56 +-3-2377 U+0077 # LATIN SMALL LETTER W Fullwidth: U+FF57 +-3-2378 U+0078 # LATIN SMALL LETTER X Fullwidth: U+FF58 +-3-2379 U+0079 # LATIN SMALL LETTER Y Fullwidth: U+FF59 +-3-237A U+007A # LATIN SMALL LETTER Z Fullwidth: U+FF5A ++3-2361 U+FF41 # LATIN SMALL LETTER A Fullwidth: U+FF41 ++3-2362 U+FF42 # LATIN SMALL LETTER B Fullwidth: U+FF42 ++3-2363 U+FF43 # LATIN SMALL LETTER C Fullwidth: U+FF43 ++3-2364 U+FF44 # LATIN SMALL LETTER D Fullwidth: U+FF44 ++3-2365 U+FF45 # LATIN SMALL LETTER E Fullwidth: U+FF45 ++3-2366 U+FF46 # LATIN SMALL LETTER F Fullwidth: U+FF46 ++3-2367 U+FF47 # LATIN SMALL LETTER G Fullwidth: U+FF47 ++3-2368 U+FF48 # LATIN SMALL LETTER H Fullwidth: U+FF48 ++3-2369 U+FF49 # LATIN SMALL LETTER I Fullwidth: U+FF49 ++3-236A U+FF4A # LATIN SMALL LETTER J Fullwidth: U+FF4A ++3-236B U+FF4B # LATIN SMALL LETTER K Fullwidth: U+FF4B ++3-236C U+FF4C # LATIN SMALL LETTER L Fullwidth: U+FF4C ++3-236D U+FF4D # LATIN SMALL LETTER M Fullwidth: U+FF4D ++3-236E U+FF4E # LATIN SMALL LETTER N Fullwidth: U+FF4E ++3-236F U+FF4F # LATIN SMALL LETTER O Fullwidth: U+FF4F ++3-2370 U+FF50 # LATIN SMALL LETTER P Fullwidth: U+FF50 ++3-2371 U+FF51 # LATIN SMALL LETTER Q Fullwidth: U+FF51 ++3-2372 U+FF52 # LATIN SMALL LETTER R Fullwidth: U+FF52 ++3-2373 U+FF53 # LATIN SMALL LETTER S Fullwidth: U+FF53 ++3-2374 U+FF54 # LATIN SMALL LETTER T Fullwidth: U+FF54 ++3-2375 U+FF55 # LATIN SMALL LETTER U Fullwidth: U+FF55 ++3-2376 U+FF56 # LATIN SMALL LETTER V Fullwidth: U+FF56 ++3-2377 U+FF57 # LATIN SMALL LETTER W Fullwidth: U+FF57 ++3-2378 U+FF58 # LATIN SMALL LETTER X Fullwidth: U+FF58 ++3-2379 U+FF59 # LATIN SMALL LETTER Y Fullwidth: U+FF59 ++3-237A U+FF5A # LATIN SMALL LETTER Z Fullwidth: U+FF5A + 3-237B U+30A0 # KATAKANA-HIRAGANA DOUBLE HYPHEN [2000] [Unicode3.2] + 3-237C U+2013 # EN DASH [2000] + 3-237D U+29FA # DOUBLE PLUS [2000] [Unicode3.2] +@@ -1242,7 +1242,7 @@ + 3-2D7C # Windows: U+222A + 3-2D7D U+2756 # BLACK DIAMOND MINUS WHITE X [2000] + 3-2D7E U+261E # WHITE RIGHT POINTING INDEX [2000] +-3-2E21 # ++3-2E21 U+4FF1 # [2004] + 3-2E22 U+2000B # [2000] [Unicode3.1] Private: U+F780 + 3-2E23 U+3402 # [2000] + 3-2E24 U+4E28 # [2000] +@@ -1429,7 +1429,7 @@ + 3-2F7B U+218BD # [2000] [Unicode3.1] Private: U+F78F + 3-2F7C U+5B19 # [2000] + 3-2F7D U+5B25 # [2000] +-3-2F7E # ++3-2F7E U+525D # [2004] + 3-3021 U+4E9C # + 3-3022 U+5516 # + 3-3023 U+5A03 # +@@ -4395,7 +4395,7 @@ + 3-4F51 U+6E7E # + 3-4F52 U+7897 # + 3-4F53 U+8155 # +-3-4F54 # ++3-4F54 U+20B9F # [2004] + 3-4F55 U+5B41 # [2000] + 3-4F56 U+5B56 # [2000] + 3-4F57 U+5B7D # [2000] +@@ -4437,7 +4437,7 @@ + 3-4F7B U+5DA7 # [2000] + 3-4F7C U+5DB8 # [2000] + 3-4F7D U+5DCB # [2000] +-3-4F7E # ++3-4F7E U+541E # [2004] + 3-5021 U+5F0C # + 3-5022 U+4E10 # + 3-5023 U+4E15 # +@@ -7828,7 +7828,7 @@ + 3-7424 U+7464 # [1983] + 3-7425 U+51DC # [1990] + 3-7426 U+7199 # [1990] +-3-7427 # ++3-7427 U+5653 # [2004] + 3-7428 U+5DE2 # [2000] + 3-7429 U+5E14 # [2000] + 3-742A U+5E18 # [2000] +@@ -8851,11 +8851,11 @@ + 3-7E77 U+9F94 # [2000] + 3-7E78 U+9F97 # [2000] + 3-7E79 U+9FA2 # [2000] +-3-7E7A # +-3-7E7B # +-3-7E7C # +-3-7E7D # +-3-7E7E # ++3-7E7A U+59F8 # [2004] ++3-7E7B U+5C5B # [2004] ++3-7E7C U+5E77 # [2004] ++3-7E7D U+7626 # [2004] ++3-7E7E U+7E6B # [2004] + 4-2121 U+20089 # [2000] [Unicode3.1] Private: U+F7D1 + 4-2122 U+4E02 # [2000] + 4-2123 U+4E0F # [2000] +@@ -11138,7 +11138,7 @@ + 4-7D38 U+9B10 # [2000] + 4-7D39 U+9B12 # [2000] + 4-7D3A U+9B16 # [2000] +-4-7D3B U+9B1D # [2000] ++4-7D3B U+9B1C # [2000] + 4-7D3C U+9B2B # [2000] + 4-7D3D U+9B33 # [2000] + 4-7D3E U+9B3D # [2000] diff --git a/Tools/unicode/python-mappings/gb-18030-2000.xml b/Tools/unicode/python-mappings/gb-18030-2000.xml new file mode 100644 index 00000000..ef86d83e --- /dev/null +++ b/Tools/unicode/python-mappings/gb-18030-2000.xml @@ -0,0 +1,30917 @@ + + + + + + 0x80 appears to be a valid (and unassigned) single-byte code, added to the validity. + + + New mapping data, changing all four-byte mappings to the BMP. + Removed mappings to single surrogates. + + + Original table. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tools/unicode/python-mappings/jisx0213-2004-std.txt b/Tools/unicode/python-mappings/jisx0213-2004-std.txt new file mode 100644 index 00000000..a302fa19 --- /dev/null +++ b/Tools/unicode/python-mappings/jisx0213-2004-std.txt @@ -0,0 +1,11294 @@ +## JIS X 0213:2004 vs Unicode mapping table +## +## Date: 7 Jul 2004 13:09:49 GMT +## License: +## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved. +## Copyright (C) 2001 I'O, All Rights Reserved. +## You can use, modify, distribute this table freely. +## Note: +## 3-XXXX JIS X 0213:2000 plane 1 (GL encoding) +## 4-XXXX JIS X 0213:2000 plane 2 (GL encoding) +## [1983] JIS codepoint defined by JIS X 0208-1983 +## [1990] JIS codepoint defined by JIS X 0208-1990 +## [2000] JIS codepoint defined by JIS X 0213:2000 +## [Unicode3.1] UCS codepoint defined by Unicode 3.1 +## [Unicode3.2] UCS codepoint defined by Unicode 3.2 +## Fullwidth UCS fullwidth form (U+Fxxx) +## Windows Windows (CP932) mapping +## Private UCS private area mapping +## Some 0213 character can't represent by one UCS character. +## In this table, such characters are described as 'U+xxxx+xxxx'. +## +## JIS Unicode Name Note +3-2121 U+3000 # IDEOGRAPHIC SPACE +3-2122 U+3001 # IDEOGRAPHIC COMMA +3-2123 U+3002 # IDEOGRAPHIC FULL STOP +3-2124 U+FF0C # COMMA Fullwidth: U+FF0C +3-2125 U+FF0E # FULL STOP Fullwidth: U+FF0E +3-2126 U+30FB # KATAKANA MIDDLE DOT +3-2127 U+FF1A # COLON Fullwidth: U+FF1A +3-2128 U+FF1B # SEMICOLON Fullwidth: U+FF1B +3-2129 U+FF1F # QUESTION MARK Fullwidth: U+FF1F +3-212A U+FF01 # EXCLAMATION MARK Fullwidth: U+FF01 +3-212B U+309B # KATAKANA-HIRAGANA VOICED SOUND MARK +3-212C U+309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +3-212D U+00B4 # ACUTE ACCENT +3-212E U+FF40 # GRAVE ACCENT Fullwidth: U+FF40 +3-212F U+00A8 # DIAERESIS +3-2130 U+FF3E # CIRCUMFLEX ACCENT Fullwidth: U+FF3E +3-2131 U+FFE3 # OVERLINE Windows: U+FFE3 +3-2132 U+FF3F # LOW LINE Fullwidth: U+FF3F +3-2133 U+30FD # KATAKANA ITERATION MARK +3-2134 U+30FE # KATAKANA VOICED ITERATION MARK +3-2135 U+309D # HIRAGANA ITERATION MARK +3-2136 U+309E # HIRAGANA VOICED ITERATION MARK +3-2137 U+3003 # DITTO MARK +3-2138 U+4EDD # +3-2139 U+3005 # IDEOGRAPHIC ITERATION MARK +3-213A U+3006 # IDEOGRAPHIC CLOSING MARK +3-213B U+3007 # IDEOGRAPHIC NUMBER ZERO +3-213C U+30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK +3-213D U+2015 # EM DASH Windows: U+2015 +3-213E U+2010 # HYPHEN +3-213F U+FF0F # SOLIDUS Fullwidth: U+FF0F +3-2140 U+005C # REVERSE SOLIDUS Fullwidth: U+FF3C +3-2141 U+301C # WAVE DASH Windows: U+FF5E +3-2142 U+2016 # DOUBLE VERTICAL LINE Windows: U+2225 +3-2143 U+FF5C # VERTICAL LINE Fullwidth: U+FF5C +3-2144 U+2026 # HORIZONTAL ELLIPSIS +3-2145 U+2025 # TWO DOT LEADER +3-2146 U+2018 # LEFT SINGLE QUOTATION MARK +3-2147 U+2019 # RIGHT SINGLE QUOTATION MARK +3-2148 U+201C # LEFT DOUBLE QUOTATION MARK +3-2149 U+201D # RIGHT DOUBLE QUOTATION MARK +3-214A U+FF08 # LEFT PARENTHESIS Fullwidth: U+FF08 +3-214B U+FF09 # RIGHT PARENTHESIS Fullwidth: U+FF09 +3-214C U+3014 # LEFT TORTOISE SHELL BRACKET +3-214D U+3015 # RIGHT TORTOISE SHELL BRACKET +3-214E U+FF3B # LEFT SQUARE BRACKET Fullwidth: U+FF3B +3-214F U+FF3D # RIGHT SQUARE BRACKET Fullwidth: U+FF3D +3-2150 U+FF5B # LEFT CURLY BRACKET Fullwidth: U+FF5B +3-2151 U+FF5D # RIGHT CURLY BRACKET Fullwidth: U+FF5D +3-2152 U+3008 # LEFT ANGLE BRACKET +3-2153 U+3009 # RIGHT ANGLE BRACKET +3-2154 U+300A # LEFT DOUBLE ANGLE BRACKET +3-2155 U+300B # RIGHT DOUBLE ANGLE BRACKET +3-2156 U+300C # LEFT CORNER BRACKET +3-2157 U+300D # RIGHT CORNER BRACKET +3-2158 U+300E # LEFT WHITE CORNER BRACKET +3-2159 U+300F # RIGHT WHITE CORNER BRACKET +3-215A U+3010 # LEFT BLACK LENTICULAR BRACKET +3-215B U+3011 # RIGHT BLACK LENTICULAR BRACKET +3-215C U+FF0B # PLUS SIGN Fullwidth: U+FF0B +3-215D U+2212 # MINUS SIGN Windows: U+FF0D +3-215E U+00B1 # PLUS-MINUS SIGN +3-215F U+00D7 # MULTIPLICATION SIGN +3-2160 U+00F7 # DIVISION SIGN +3-2161 U+FF1D # EQUALS SIGN Fullwidth: U+FF1D +3-2162 U+2260 # NOT EQUAL TO +3-2163 U+FF1C # LESS-THAN SIGN Fullwidth: U+FF1C +3-2164 U+FF1E # GREATER-THAN SIGN Fullwidth: U+FF1E +3-2165 U+2266 # LESS-THAN OVER EQUAL TO +3-2166 U+2267 # GREATER-THAN OVER EQUAL TO +3-2167 U+221E # INFINITY +3-2168 U+2234 # THEREFORE +3-2169 U+2642 # MALE SIGN +3-216A U+2640 # FEMALE SIGN +3-216B U+00B0 # DEGREE SIGN +3-216C U+2032 # PRIME +3-216D U+2033 # DOUBLE PRIME +3-216E U+2103 # DEGREE CELSIUS +3-216F U+FFE5 # YEN SIGN Windows: U+FFE5 +3-2170 U+FF04 # DOLLAR SIGN Fullwidth: U+FF04 +3-2171 U+00A2 # CENT SIGN Windows: U+FFE0 +3-2172 U+00A3 # POUND SIGN Windows: U+FFE1 +3-2173 U+FF05 # PERCENT SIGN Fullwidth: U+FF05 +3-2174 U+FF03 # NUMBER SIGN Fullwidth: U+FF03 +3-2175 U+FF06 # AMPERSAND Fullwidth: U+FF06 +3-2176 U+FF0A # ASTERISK Fullwidth: U+FF0A +3-2177 U+FF20 # COMMERCIAL AT Fullwidth: U+FF20 +3-2178 U+00A7 # SECTION SIGN +3-2179 U+2606 # WHITE STAR +3-217A U+2605 # BLACK STAR +3-217B U+25CB # WHITE CIRCLE +3-217C U+25CF # BLACK CIRCLE +3-217D U+25CE # BULLSEYE +3-217E U+25C7 # WHITE DIAMOND +3-2221 U+25C6 # BLACK DIAMOND +3-2222 U+25A1 # WHITE SQUARE +3-2223 U+25A0 # BLACK SQUARE +3-2224 U+25B3 # WHITE UP-POINTING TRIANGLE +3-2225 U+25B2 # BLACK UP-POINTING TRIANGLE +3-2226 U+25BD # WHITE DOWN-POINTING TRIANGLE +3-2227 U+25BC # BLACK DOWN-POINTING TRIANGLE +3-2228 U+203B # REFERENCE MARK +3-2229 U+3012 # POSTAL MARK +3-222A U+2192 # RIGHTWARDS ARROW +3-222B U+2190 # LEFTWARDS ARROW +3-222C U+2191 # UPWARDS ARROW +3-222D U+2193 # DOWNWARDS ARROW +3-222E U+3013 # GETA MARK +3-222F U+FF07 # APOSTROPHE Fullwidth: U+FF07 +3-2230 U+FF02 # QUOTATION MARK [2000] Fullwidth: U+FF02 +3-2231 U+FF0D # HYPHEN-MINUS [2000] Fullwidth: U+FF0D +3-2232 U+007E # TILDE [2000] Fullwidth: U+FF5E +3-2233 U+3033 # VERTICAL KANA REPEAT MARK UPPER HALF [2000] +3-2234 U+3034 # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF [2000] +3-2235 U+3035 # VERTICAL KANA REPEAT MARK LOWER HALF [2000] +3-2236 U+303B # VERTICAL IDEOGRAPHIC ITERATION MARK [2000] [Unicode3.2] +3-2237 U+303C # MASU MARK [2000] [Unicode3.2] +3-2238 U+30FF # KATAKANA DIGRAPH KOTO [2000] [Unicode3.2] +3-2239 U+309F # HIRAGANA DIGRAPH YORI [2000] [Unicode3.2] +3-223A U+2208 # ELEMENT OF [1983] +3-223B U+220B # CONTAINS AS MEMBER [1983] +3-223C U+2286 # SUBSET OF OR EQUAL TO [1983] +3-223D U+2287 # SUPERSET OF OR EQUAL TO [1983] +3-223E U+2282 # SUBSET OF [1983] +3-223F U+2283 # SUPERSET OF [1983] +3-2240 U+222A # UNION [1983] +3-2241 U+2229 # INTERSECTION [1983] +3-2242 U+2284 # NOT A SUBSET OF [2000] +3-2243 U+2285 # NOT A SUPERSET OF [2000] +3-2244 U+228A # SUBSET OF WITH NOT EQUAL TO [2000] +3-2245 U+228B # SUPERSET OF WITH NOT EQUAL TO [2000] +3-2246 U+2209 # NOT AN ELEMENT OF [2000] +3-2247 U+2205 # EMPTY SET [2000] +3-2248 U+2305 # PROJECTIVE [2000] +3-2249 U+2306 # PERSPECTIVE [2000] +3-224A U+2227 # LOGICAL AND [1983] +3-224B U+2228 # LOGICAL OR [1983] +3-224C U+00AC # NOT SIGN [1983] Windows: U+FFE2 +3-224D U+21D2 # RIGHTWARDS DOUBLE ARROW [1983] +3-224E U+21D4 # LEFT RIGHT DOUBLE ARROW [1983] +3-224F U+2200 # FOR ALL [1983] +3-2250 U+2203 # THERE EXISTS [1983] +3-2251 U+2295 # CIRCLED PLUS [2000] +3-2252 U+2296 # CIRCLED MINUS [2000] +3-2253 U+2297 # CIRCLED TIMES [2000] +3-2254 U+2225 # PARALLEL TO [2000] +3-2255 U+2226 # NOT PARALLEL TO [2000] +3-2256 U+2985 # LEFT WHITE PARENTHESIS [2000] [Unicode3.2] +3-2257 U+2986 # RIGHT WHITE PARENTHESIS [2000] [Unicode3.2] +3-2258 U+3018 # LEFT WHITE TORTOISE SHELL BRACKET [2000] +3-2259 U+3019 # RIGHT WHITE TORTOISE SHELL BRACKET [2000] +3-225A U+3016 # LEFT WHITE LENTICULAR BRACKET [2000] +3-225B U+3017 # RIGHT WHITE LENTICULAR BRACKET [2000] +3-225C U+2220 # ANGLE [1983] +3-225D U+22A5 # UP TACK [1983] +3-225E U+2312 # ARC [1983] +3-225F U+2202 # PARTIAL DIFFERENTIAL [1983] +3-2260 U+2207 # NABLA [1983] +3-2261 U+2261 # IDENTICAL TO [1983] +3-2262 U+2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF [1983] +3-2263 U+226A # MUCH LESS-THAN [1983] +3-2264 U+226B # MUCH GREATER-THAN [1983] +3-2265 U+221A # SQUARE ROOT [1983] +3-2266 U+223D # REVERSED TILDE [1983] +3-2267 U+221D # PROPORTIONAL TO [1983] +3-2268 U+2235 # BECAUSE [1983] +3-2269 U+222B # INTEGRAL [1983] +3-226A U+222C # DOUBLE INTEGRAL [1983] +3-226B U+2262 # NOT IDENTICAL TO [2000] +3-226C U+2243 # ASYMPTOTICALLY EQUAL TO [2000] +3-226D U+2245 # APPROXIMATELY EQUAL TO [2000] +3-226E U+2248 # ALMOST EQUAL TO [2000] +3-226F U+2276 # LESS-THAN OR GREATER-THAN [2000] +3-2270 U+2277 # GREATER-THAN OR LESS-THAN [2000] +3-2271 U+2194 # LEFT RIGHT ARROW [2000] +3-2272 U+212B # ANGSTROM SIGN [1983] +3-2273 U+2030 # PER MILLE SIGN [1983] +3-2274 U+266F # MUSIC SHARP SIGN [1983] +3-2275 U+266D # MUSIC FLAT SIGN [1983] +3-2276 U+266A # EIGHTH NOTE [1983] +3-2277 U+2020 # DAGGER [1983] +3-2278 U+2021 # DOUBLE DAGGER [1983] +3-2279 U+00B6 # PILCROW SIGN [1983] +3-227A U+266E # MUSIC NATURAL SIGN [2000] +3-227B U+266B # BEAMED EIGHTH NOTES [2000] +3-227C U+266C # BEAMED SIXTEENTH NOTES [2000] +3-227D U+2669 # QUARTER NOTE [2000] +3-227E U+25EF # LARGE CIRCLE [1983] +3-2321 U+25B7 # WHITE RIGHT-POINTING TRIANGLE [2000] +3-2322 U+25B6 # BLACK RIGHT-POINTING TRIANGLE [2000] +3-2323 U+25C1 # WHITE LEFT-POINTING TRIANGLE [2000] +3-2324 U+25C0 # BLACK LEFT-POINTING TRIANGLE [2000] +3-2325 U+2197 # NORTH EAST ARROW [2000] +3-2326 U+2198 # SOUTH EAST ARROW [2000] +3-2327 U+2196 # NORTH WEST ARROW [2000] +3-2328 U+2199 # SOUTH WEST ARROW [2000] +3-2329 U+21C4 # RIGHTWARDS ARROW OVER LEFTWARDS ARROW [2000] +3-232A U+21E8 # RIGHTWARDS WHITE ARROW [2000] +3-232B U+21E6 # LEFTWARDS WHITE ARROW [2000] +3-232C U+21E7 # UPWARDS WHITE ARROW [2000] +3-232D U+21E9 # DOWNWARDS WHITE ARROW [2000] +3-232E U+2934 # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS [2000] [Unicode3.2] +3-232F U+2935 # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS [2000] [Unicode3.2] +3-2330 U+FF10 # DIGIT ZERO Fullwidth: U+FF10 +3-2331 U+FF11 # DIGIT ONE Fullwidth: U+FF11 +3-2332 U+FF12 # DIGIT TWO Fullwidth: U+FF12 +3-2333 U+FF13 # DIGIT THREE Fullwidth: U+FF13 +3-2334 U+FF14 # DIGIT FOUR Fullwidth: U+FF14 +3-2335 U+FF15 # DIGIT FIVE Fullwidth: U+FF15 +3-2336 U+FF16 # DIGIT SIX Fullwidth: U+FF16 +3-2337 U+FF17 # DIGIT SEVEN Fullwidth: U+FF17 +3-2338 U+FF18 # DIGIT EIGHT Fullwidth: U+FF18 +3-2339 U+FF19 # DIGIT NINE Fullwidth: U+FF19 +3-233A U+29BF # CIRCLED BULLET [2000] [Unicode3.2] +3-233B U+25C9 # FISHEYE [2000] +3-233C U+303D # PART ALTERNATION MARK [2000] [Unicode3.2] +3-233D U+FE46 # WHITE SESAME DOT [2000] [Unicode3.2] +3-233E U+FE45 # SESAME DOT [2000] [Unicode3.2] +3-233F U+25E6 # WHITE BULLET [2000] +3-2340 U+2022 # BULLET [2000] +3-2341 U+FF21 # LATIN CAPITAL LETTER A Fullwidth: U+FF21 +3-2342 U+FF22 # LATIN CAPITAL LETTER B Fullwidth: U+FF22 +3-2343 U+FF23 # LATIN CAPITAL LETTER C Fullwidth: U+FF23 +3-2344 U+FF24 # LATIN CAPITAL LETTER D Fullwidth: U+FF24 +3-2345 U+FF25 # LATIN CAPITAL LETTER E Fullwidth: U+FF25 +3-2346 U+FF26 # LATIN CAPITAL LETTER F Fullwidth: U+FF26 +3-2347 U+FF27 # LATIN CAPITAL LETTER G Fullwidth: U+FF27 +3-2348 U+FF28 # LATIN CAPITAL LETTER H Fullwidth: U+FF28 +3-2349 U+FF29 # LATIN CAPITAL LETTER I Fullwidth: U+FF29 +3-234A U+FF2A # LATIN CAPITAL LETTER J Fullwidth: U+FF2A +3-234B U+FF2B # LATIN CAPITAL LETTER K Fullwidth: U+FF2B +3-234C U+FF2C # LATIN CAPITAL LETTER L Fullwidth: U+FF2C +3-234D U+FF2D # LATIN CAPITAL LETTER M Fullwidth: U+FF2D +3-234E U+FF2E # LATIN CAPITAL LETTER N Fullwidth: U+FF2E +3-234F U+FF2F # LATIN CAPITAL LETTER O Fullwidth: U+FF2F +3-2350 U+FF30 # LATIN CAPITAL LETTER P Fullwidth: U+FF30 +3-2351 U+FF31 # LATIN CAPITAL LETTER Q Fullwidth: U+FF31 +3-2352 U+FF32 # LATIN CAPITAL LETTER R Fullwidth: U+FF32 +3-2353 U+FF33 # LATIN CAPITAL LETTER S Fullwidth: U+FF33 +3-2354 U+FF34 # LATIN CAPITAL LETTER T Fullwidth: U+FF34 +3-2355 U+FF35 # LATIN CAPITAL LETTER U Fullwidth: U+FF35 +3-2356 U+FF36 # LATIN CAPITAL LETTER V Fullwidth: U+FF36 +3-2357 U+FF37 # LATIN CAPITAL LETTER W Fullwidth: U+FF37 +3-2358 U+FF38 # LATIN CAPITAL LETTER X Fullwidth: U+FF38 +3-2359 U+FF39 # LATIN CAPITAL LETTER Y Fullwidth: U+FF39 +3-235A U+FF3A # LATIN CAPITAL LETTER Z Fullwidth: U+FF3A +3-235B U+2213 # MINUS-OR-PLUS SIGN [2000] +3-235C U+2135 # ALEF SYMBOL [2000] +3-235D U+210F # PLANCK CONSTANT OVER TWO PI [2000] +3-235E U+33CB # SQUARE HP [2000] +3-235F U+2113 # SCRIPT SMALL L [2000] +3-2360 U+2127 # INVERTED OHM SIGN [2000] +3-2361 U+FF41 # LATIN SMALL LETTER A Fullwidth: U+FF41 +3-2362 U+FF42 # LATIN SMALL LETTER B Fullwidth: U+FF42 +3-2363 U+FF43 # LATIN SMALL LETTER C Fullwidth: U+FF43 +3-2364 U+FF44 # LATIN SMALL LETTER D Fullwidth: U+FF44 +3-2365 U+FF45 # LATIN SMALL LETTER E Fullwidth: U+FF45 +3-2366 U+FF46 # LATIN SMALL LETTER F Fullwidth: U+FF46 +3-2367 U+FF47 # LATIN SMALL LETTER G Fullwidth: U+FF47 +3-2368 U+FF48 # LATIN SMALL LETTER H Fullwidth: U+FF48 +3-2369 U+FF49 # LATIN SMALL LETTER I Fullwidth: U+FF49 +3-236A U+FF4A # LATIN SMALL LETTER J Fullwidth: U+FF4A +3-236B U+FF4B # LATIN SMALL LETTER K Fullwidth: U+FF4B +3-236C U+FF4C # LATIN SMALL LETTER L Fullwidth: U+FF4C +3-236D U+FF4D # LATIN SMALL LETTER M Fullwidth: U+FF4D +3-236E U+FF4E # LATIN SMALL LETTER N Fullwidth: U+FF4E +3-236F U+FF4F # LATIN SMALL LETTER O Fullwidth: U+FF4F +3-2370 U+FF50 # LATIN SMALL LETTER P Fullwidth: U+FF50 +3-2371 U+FF51 # LATIN SMALL LETTER Q Fullwidth: U+FF51 +3-2372 U+FF52 # LATIN SMALL LETTER R Fullwidth: U+FF52 +3-2373 U+FF53 # LATIN SMALL LETTER S Fullwidth: U+FF53 +3-2374 U+FF54 # LATIN SMALL LETTER T Fullwidth: U+FF54 +3-2375 U+FF55 # LATIN SMALL LETTER U Fullwidth: U+FF55 +3-2376 U+FF56 # LATIN SMALL LETTER V Fullwidth: U+FF56 +3-2377 U+FF57 # LATIN SMALL LETTER W Fullwidth: U+FF57 +3-2378 U+FF58 # LATIN SMALL LETTER X Fullwidth: U+FF58 +3-2379 U+FF59 # LATIN SMALL LETTER Y Fullwidth: U+FF59 +3-237A U+FF5A # LATIN SMALL LETTER Z Fullwidth: U+FF5A +3-237B U+30A0 # KATAKANA-HIRAGANA DOUBLE HYPHEN [2000] [Unicode3.2] +3-237C U+2013 # EN DASH [2000] +3-237D U+29FA # DOUBLE PLUS [2000] [Unicode3.2] +3-237E U+29FB # TRIPLE PLUS [2000] [Unicode3.2] +3-2421 U+3041 # HIRAGANA LETTER SMALL A +3-2422 U+3042 # HIRAGANA LETTER A +3-2423 U+3043 # HIRAGANA LETTER SMALL I +3-2424 U+3044 # HIRAGANA LETTER I +3-2425 U+3045 # HIRAGANA LETTER SMALL U +3-2426 U+3046 # HIRAGANA LETTER U +3-2427 U+3047 # HIRAGANA LETTER SMALL E +3-2428 U+3048 # HIRAGANA LETTER E +3-2429 U+3049 # HIRAGANA LETTER SMALL O +3-242A U+304A # HIRAGANA LETTER O +3-242B U+304B # HIRAGANA LETTER KA +3-242C U+304C # HIRAGANA LETTER GA +3-242D U+304D # HIRAGANA LETTER KI +3-242E U+304E # HIRAGANA LETTER GI +3-242F U+304F # HIRAGANA LETTER KU +3-2430 U+3050 # HIRAGANA LETTER GU +3-2431 U+3051 # HIRAGANA LETTER KE +3-2432 U+3052 # HIRAGANA LETTER GE +3-2433 U+3053 # HIRAGANA LETTER KO +3-2434 U+3054 # HIRAGANA LETTER GO +3-2435 U+3055 # HIRAGANA LETTER SA +3-2436 U+3056 # HIRAGANA LETTER ZA +3-2437 U+3057 # HIRAGANA LETTER SI +3-2438 U+3058 # HIRAGANA LETTER ZI +3-2439 U+3059 # HIRAGANA LETTER SU +3-243A U+305A # HIRAGANA LETTER ZU +3-243B U+305B # HIRAGANA LETTER SE +3-243C U+305C # HIRAGANA LETTER ZE +3-243D U+305D # HIRAGANA LETTER SO +3-243E U+305E # HIRAGANA LETTER ZO +3-243F U+305F # HIRAGANA LETTER TA +3-2440 U+3060 # HIRAGANA LETTER DA +3-2441 U+3061 # HIRAGANA LETTER TI +3-2442 U+3062 # HIRAGANA LETTER DI +3-2443 U+3063 # HIRAGANA LETTER SMALL TU +3-2444 U+3064 # HIRAGANA LETTER TU +3-2445 U+3065 # HIRAGANA LETTER DU +3-2446 U+3066 # HIRAGANA LETTER TE +3-2447 U+3067 # HIRAGANA LETTER DE +3-2448 U+3068 # HIRAGANA LETTER TO +3-2449 U+3069 # HIRAGANA LETTER DO +3-244A U+306A # HIRAGANA LETTER NA +3-244B U+306B # HIRAGANA LETTER NI +3-244C U+306C # HIRAGANA LETTER NU +3-244D U+306D # HIRAGANA LETTER NE +3-244E U+306E # HIRAGANA LETTER NO +3-244F U+306F # HIRAGANA LETTER HA +3-2450 U+3070 # HIRAGANA LETTER BA +3-2451 U+3071 # HIRAGANA LETTER PA +3-2452 U+3072 # HIRAGANA LETTER HI +3-2453 U+3073 # HIRAGANA LETTER BI +3-2454 U+3074 # HIRAGANA LETTER PI +3-2455 U+3075 # HIRAGANA LETTER HU +3-2456 U+3076 # HIRAGANA LETTER BU +3-2457 U+3077 # HIRAGANA LETTER PU +3-2458 U+3078 # HIRAGANA LETTER HE +3-2459 U+3079 # HIRAGANA LETTER BE +3-245A U+307A # HIRAGANA LETTER PE +3-245B U+307B # HIRAGANA LETTER HO +3-245C U+307C # HIRAGANA LETTER BO +3-245D U+307D # HIRAGANA LETTER PO +3-245E U+307E # HIRAGANA LETTER MA +3-245F U+307F # HIRAGANA LETTER MI +3-2460 U+3080 # HIRAGANA LETTER MU +3-2461 U+3081 # HIRAGANA LETTER ME +3-2462 U+3082 # HIRAGANA LETTER MO +3-2463 U+3083 # HIRAGANA LETTER SMALL YA +3-2464 U+3084 # HIRAGANA LETTER YA +3-2465 U+3085 # HIRAGANA LETTER SMALL YU +3-2466 U+3086 # HIRAGANA LETTER YU +3-2467 U+3087 # HIRAGANA LETTER SMALL YO +3-2468 U+3088 # HIRAGANA LETTER YO +3-2469 U+3089 # HIRAGANA LETTER RA +3-246A U+308A # HIRAGANA LETTER RI +3-246B U+308B # HIRAGANA LETTER RU +3-246C U+308C # HIRAGANA LETTER RE +3-246D U+308D # HIRAGANA LETTER RO +3-246E U+308E # HIRAGANA LETTER SMALL WA +3-246F U+308F # HIRAGANA LETTER WA +3-2470 U+3090 # HIRAGANA LETTER WI +3-2471 U+3091 # HIRAGANA LETTER WE +3-2472 U+3092 # HIRAGANA LETTER WO +3-2473 U+3093 # HIRAGANA LETTER N +3-2474 U+3094 # HIRAGANA LETTER VU [2000] +3-2475 U+3095 # HIRAGANA LETTER SMALL KA [2000] [Unicode3.2] +3-2476 U+3096 # HIRAGANA LETTER SMALL KE [2000] [Unicode3.2] +3-2477 U+304B+309A # [2000] Private: U+F711 +3-2478 U+304D+309A # [2000] Private: U+F712 +3-2479 U+304F+309A # [2000] Private: U+F713 +3-247A U+3051+309A # [2000] Private: U+F714 +3-247B U+3053+309A # [2000] Private: U+F715 +3-247C # +3-247D # +3-247E # +3-2521 U+30A1 # KATAKANA LETTER SMALL A +3-2522 U+30A2 # KATAKANA LETTER A +3-2523 U+30A3 # KATAKANA LETTER SMALL I +3-2524 U+30A4 # KATAKANA LETTER I +3-2525 U+30A5 # KATAKANA LETTER SMALL U +3-2526 U+30A6 # KATAKANA LETTER U +3-2527 U+30A7 # KATAKANA LETTER SMALL E +3-2528 U+30A8 # KATAKANA LETTER E +3-2529 U+30A9 # KATAKANA LETTER SMALL O +3-252A U+30AA # KATAKANA LETTER O +3-252B U+30AB # KATAKANA LETTER KA +3-252C U+30AC # KATAKANA LETTER GA +3-252D U+30AD # KATAKANA LETTER KI +3-252E U+30AE # KATAKANA LETTER GI +3-252F U+30AF # KATAKANA LETTER KU +3-2530 U+30B0 # KATAKANA LETTER GU +3-2531 U+30B1 # KATAKANA LETTER KE +3-2532 U+30B2 # KATAKANA LETTER GE +3-2533 U+30B3 # KATAKANA LETTER KO +3-2534 U+30B4 # KATAKANA LETTER GO +3-2535 U+30B5 # KATAKANA LETTER SA +3-2536 U+30B6 # KATAKANA LETTER ZA +3-2537 U+30B7 # KATAKANA LETTER SI +3-2538 U+30B8 # KATAKANA LETTER ZI +3-2539 U+30B9 # KATAKANA LETTER SU +3-253A U+30BA # KATAKANA LETTER ZU +3-253B U+30BB # KATAKANA LETTER SE +3-253C U+30BC # KATAKANA LETTER ZE +3-253D U+30BD # KATAKANA LETTER SO +3-253E U+30BE # KATAKANA LETTER ZO +3-253F U+30BF # KATAKANA LETTER TA +3-2540 U+30C0 # KATAKANA LETTER DA +3-2541 U+30C1 # KATAKANA LETTER TI +3-2542 U+30C2 # KATAKANA LETTER DI +3-2543 U+30C3 # KATAKANA LETTER SMALL TU +3-2544 U+30C4 # KATAKANA LETTER TU +3-2545 U+30C5 # KATAKANA LETTER DU +3-2546 U+30C6 # KATAKANA LETTER TE +3-2547 U+30C7 # KATAKANA LETTER DE +3-2548 U+30C8 # KATAKANA LETTER TO +3-2549 U+30C9 # KATAKANA LETTER DO +3-254A U+30CA # KATAKANA LETTER NA +3-254B U+30CB # KATAKANA LETTER NI +3-254C U+30CC # KATAKANA LETTER NU +3-254D U+30CD # KATAKANA LETTER NE +3-254E U+30CE # KATAKANA LETTER NO +3-254F U+30CF # KATAKANA LETTER HA +3-2550 U+30D0 # KATAKANA LETTER BA +3-2551 U+30D1 # KATAKANA LETTER PA +3-2552 U+30D2 # KATAKANA LETTER HI +3-2553 U+30D3 # KATAKANA LETTER BI +3-2554 U+30D4 # KATAKANA LETTER PI +3-2555 U+30D5 # KATAKANA LETTER HU +3-2556 U+30D6 # KATAKANA LETTER BU +3-2557 U+30D7 # KATAKANA LETTER PU +3-2558 U+30D8 # KATAKANA LETTER HE +3-2559 U+30D9 # KATAKANA LETTER BE +3-255A U+30DA # KATAKANA LETTER PE +3-255B U+30DB # KATAKANA LETTER HO +3-255C U+30DC # KATAKANA LETTER BO +3-255D U+30DD # KATAKANA LETTER PO +3-255E U+30DE # KATAKANA LETTER MA +3-255F U+30DF # KATAKANA LETTER MI +3-2560 U+30E0 # KATAKANA LETTER MU +3-2561 U+30E1 # KATAKANA LETTER ME +3-2562 U+30E2 # KATAKANA LETTER MO +3-2563 U+30E3 # KATAKANA LETTER SMALL YA +3-2564 U+30E4 # KATAKANA LETTER YA +3-2565 U+30E5 # KATAKANA LETTER SMALL YU +3-2566 U+30E6 # KATAKANA LETTER YU +3-2567 U+30E7 # KATAKANA LETTER SMALL YO +3-2568 U+30E8 # KATAKANA LETTER YO +3-2569 U+30E9 # KATAKANA LETTER RA +3-256A U+30EA # KATAKANA LETTER RI +3-256B U+30EB # KATAKANA LETTER RU +3-256C U+30EC # KATAKANA LETTER RE +3-256D U+30ED # KATAKANA LETTER RO +3-256E U+30EE # KATAKANA LETTER SMALL WA +3-256F U+30EF # KATAKANA LETTER WA +3-2570 U+30F0 # KATAKANA LETTER WI +3-2571 U+30F1 # KATAKANA LETTER WE +3-2572 U+30F2 # KATAKANA LETTER WO +3-2573 U+30F3 # KATAKANA LETTER N +3-2574 U+30F4 # KATAKANA LETTER VU +3-2575 U+30F5 # KATAKANA LETTER SMALL KA +3-2576 U+30F6 # KATAKANA LETTER SMALL KE +3-2577 U+30AB+309A # [2000] Private: U+F716 +3-2578 U+30AD+309A # [2000] Private: U+F717 +3-2579 U+30AF+309A # [2000] Private: U+F718 +3-257A U+30B1+309A # [2000] Private: U+F719 +3-257B U+30B3+309A # [2000] Private: U+F71A +3-257C U+30BB+309A # [2000] Private: U+F71B +3-257D U+30C4+309A # [2000] Private: U+F71C +3-257E U+30C8+309A # [2000] Private: U+F71D +3-2621 U+0391 # GREEK CAPITAL LETTER ALPHA +3-2622 U+0392 # GREEK CAPITAL LETTER BETA +3-2623 U+0393 # GREEK CAPITAL LETTER GAMMA +3-2624 U+0394 # GREEK CAPITAL LETTER DELTA +3-2625 U+0395 # GREEK CAPITAL LETTER EPSILON +3-2626 U+0396 # GREEK CAPITAL LETTER ZETA +3-2627 U+0397 # GREEK CAPITAL LETTER ETA +3-2628 U+0398 # GREEK CAPITAL LETTER THETA +3-2629 U+0399 # GREEK CAPITAL LETTER IOTA +3-262A U+039A # GREEK CAPITAL LETTER KAPPA +3-262B U+039B # GREEK CAPITAL LETTER LAMDA +3-262C U+039C # GREEK CAPITAL LETTER MU +3-262D U+039D # GREEK CAPITAL LETTER NU +3-262E U+039E # GREEK CAPITAL LETTER XI +3-262F U+039F # GREEK CAPITAL LETTER OMICRON +3-2630 U+03A0 # GREEK CAPITAL LETTER PI +3-2631 U+03A1 # GREEK CAPITAL LETTER RHO +3-2632 U+03A3 # GREEK CAPITAL LETTER SIGMA +3-2633 U+03A4 # GREEK CAPITAL LETTER TAU +3-2634 U+03A5 # GREEK CAPITAL LETTER UPSILON +3-2635 U+03A6 # GREEK CAPITAL LETTER PHI +3-2636 U+03A7 # GREEK CAPITAL LETTER CHI +3-2637 U+03A8 # GREEK CAPITAL LETTER PSI +3-2638 U+03A9 # GREEK CAPITAL LETTER OMEGA +3-2639 U+2664 # WHITE SPADE SUIT [2000] +3-263A U+2660 # BLACK SPADE SUIT [2000] +3-263B U+2662 # WHITE DIAMOND SUIT [2000] +3-263C U+2666 # BLACK DIAMOND SUIT [2000] +3-263D U+2661 # WHITE HEART SUIT [2000] +3-263E U+2665 # BLACK HEART SUIT [2000] +3-263F U+2667 # WHITE CLUB SUIT [2000] +3-2640 U+2663 # BLACK CLUB SUIT [2000] +3-2641 U+03B1 # GREEK SMALL LETTER ALPHA +3-2642 U+03B2 # GREEK SMALL LETTER BETA +3-2643 U+03B3 # GREEK SMALL LETTER GAMMA +3-2644 U+03B4 # GREEK SMALL LETTER DELTA +3-2645 U+03B5 # GREEK SMALL LETTER EPSILON +3-2646 U+03B6 # GREEK SMALL LETTER ZETA +3-2647 U+03B7 # GREEK SMALL LETTER ETA +3-2648 U+03B8 # GREEK SMALL LETTER THETA +3-2649 U+03B9 # GREEK SMALL LETTER IOTA +3-264A U+03BA # GREEK SMALL LETTER KAPPA +3-264B U+03BB # GREEK SMALL LETTER LAMDA +3-264C U+03BC # GREEK SMALL LETTER MU +3-264D U+03BD # GREEK SMALL LETTER NU +3-264E U+03BE # GREEK SMALL LETTER XI +3-264F U+03BF # GREEK SMALL LETTER OMICRON +3-2650 U+03C0 # GREEK SMALL LETTER PI +3-2651 U+03C1 # GREEK SMALL LETTER RHO +3-2652 U+03C3 # GREEK SMALL LETTER SIGMA +3-2653 U+03C4 # GREEK SMALL LETTER TAU +3-2654 U+03C5 # GREEK SMALL LETTER UPSILON +3-2655 U+03C6 # GREEK SMALL LETTER PHI +3-2656 U+03C7 # GREEK SMALL LETTER CHI +3-2657 U+03C8 # GREEK SMALL LETTER PSI +3-2658 U+03C9 # GREEK SMALL LETTER OMEGA +3-2659 U+03C2 # GREEK SMALL LETTER FINAL SIGMA [2000] +3-265A U+24F5 # DOUBLE CIRCLED DIGIT ONE [2000] [Unicode3.2] +3-265B U+24F6 # DOUBLE CIRCLED DIGIT TWO [2000] [Unicode3.2] +3-265C U+24F7 # DOUBLE CIRCLED DIGIT THREE [2000] [Unicode3.2] +3-265D U+24F8 # DOUBLE CIRCLED DIGIT FOUR [2000] [Unicode3.2] +3-265E U+24F9 # DOUBLE CIRCLED DIGIT FIVE [2000] [Unicode3.2] +3-265F U+24FA # DOUBLE CIRCLED DIGIT SIX [2000] [Unicode3.2] +3-2660 U+24FB # DOUBLE CIRCLED DIGIT SEVEN [2000] [Unicode3.2] +3-2661 U+24FC # DOUBLE CIRCLED DIGIT EIGHT [2000] [Unicode3.2] +3-2662 U+24FD # DOUBLE CIRCLED DIGIT NINE [2000] [Unicode3.2] +3-2663 U+24FE # DOUBLE CIRCLED NUMBER TEN [2000] [Unicode3.2] +3-2664 U+2616 # WHITE SHOGI PIECE [2000] [Unicode3.2] +3-2665 U+2617 # BLACK SHOGI PIECE [2000] [Unicode3.2] +3-2666 U+3020 # POSTAL MARK FACE [2000] +3-2667 U+260E # BLACK TELEPHONE [2000] +3-2668 U+2600 # BLACK SUN WITH RAYS [2000] +3-2669 U+2601 # CLOUD [2000] +3-266A U+2602 # UMBRELLA [2000] +3-266B U+2603 # SNOWMAN [2000] +3-266C U+2668 # HOT SPRINGS [2000] +3-266D U+25B1 # WHITE PARALLELOGRAM [2000] +3-266E U+31F0 # KATAKANA LETTER SMALL KU [2000] [Unicode3.2] +3-266F U+31F1 # KATAKANA LETTER SMALL SI [2000] [Unicode3.2] +3-2670 U+31F2 # KATAKANA LETTER SMALL SU [2000] [Unicode3.2] +3-2671 U+31F3 # KATAKANA LETTER SMALL TO [2000] [Unicode3.2] +3-2672 U+31F4 # KATAKANA LETTER SMALL NU [2000] [Unicode3.2] +3-2673 U+31F5 # KATAKANA LETTER SMALL HA [2000] [Unicode3.2] +3-2674 U+31F6 # KATAKANA LETTER SMALL HI [2000] [Unicode3.2] +3-2675 U+31F7 # KATAKANA LETTER SMALL HU [2000] [Unicode3.2] +3-2676 U+31F8 # KATAKANA LETTER SMALL HE [2000] [Unicode3.2] +3-2677 U+31F9 # KATAKANA LETTER SMALL HO [2000] [Unicode3.2] +3-2678 U+31F7+309A # [2000] Private: U+F734 +3-2679 U+31FA # KATAKANA LETTER SMALL MU [2000] [Unicode3.2] +3-267A U+31FB # KATAKANA LETTER SMALL RA [2000] [Unicode3.2] +3-267B U+31FC # KATAKANA LETTER SMALL RI [2000] [Unicode3.2] +3-267C U+31FD # KATAKANA LETTER SMALL RU [2000] [Unicode3.2] +3-267D U+31FE # KATAKANA LETTER SMALL RE [2000] [Unicode3.2] +3-267E U+31FF # KATAKANA LETTER SMALL RO [2000] [Unicode3.2] +3-2721 U+0410 # CYRILLIC CAPITAL LETTER A +3-2722 U+0411 # CYRILLIC CAPITAL LETTER BE +3-2723 U+0412 # CYRILLIC CAPITAL LETTER VE +3-2724 U+0413 # CYRILLIC CAPITAL LETTER GHE +3-2725 U+0414 # CYRILLIC CAPITAL LETTER DE +3-2726 U+0415 # CYRILLIC CAPITAL LETTER IE +3-2727 U+0401 # CYRILLIC CAPITAL LETTER IO +3-2728 U+0416 # CYRILLIC CAPITAL LETTER ZHE +3-2729 U+0417 # CYRILLIC CAPITAL LETTER ZE +3-272A U+0418 # CYRILLIC CAPITAL LETTER I +3-272B U+0419 # CYRILLIC CAPITAL LETTER SHORT I +3-272C U+041A # CYRILLIC CAPITAL LETTER KA +3-272D U+041B # CYRILLIC CAPITAL LETTER EL +3-272E U+041C # CYRILLIC CAPITAL LETTER EM +3-272F U+041D # CYRILLIC CAPITAL LETTER EN +3-2730 U+041E # CYRILLIC CAPITAL LETTER O +3-2731 U+041F # CYRILLIC CAPITAL LETTER PE +3-2732 U+0420 # CYRILLIC CAPITAL LETTER ER +3-2733 U+0421 # CYRILLIC CAPITAL LETTER ES +3-2734 U+0422 # CYRILLIC CAPITAL LETTER TE +3-2735 U+0423 # CYRILLIC CAPITAL LETTER U +3-2736 U+0424 # CYRILLIC CAPITAL LETTER EF +3-2737 U+0425 # CYRILLIC CAPITAL LETTER HA +3-2738 U+0426 # CYRILLIC CAPITAL LETTER TSE +3-2739 U+0427 # CYRILLIC CAPITAL LETTER CHE +3-273A U+0428 # CYRILLIC CAPITAL LETTER SHA +3-273B U+0429 # CYRILLIC CAPITAL LETTER SHCHA +3-273C U+042A # CYRILLIC CAPITAL LETTER HARD SIGN +3-273D U+042B # CYRILLIC CAPITAL LETTER YERU +3-273E U+042C # CYRILLIC CAPITAL LETTER SOFT SIGN +3-273F U+042D # CYRILLIC CAPITAL LETTER E +3-2740 U+042E # CYRILLIC CAPITAL LETTER YU +3-2741 U+042F # CYRILLIC CAPITAL LETTER YA +3-2742 U+23BE # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT [2000] [Unicode3.2] +3-2743 U+23BF # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT [2000] [Unicode3.2] +3-2744 U+23C0 # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE [2000] [Unicode3.2] +3-2745 U+23C1 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2] +3-2746 U+23C2 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2] +3-2747 U+23C3 # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE [2000] [Unicode3.2] +3-2748 U+23C4 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2] +3-2749 U+23C5 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2] +3-274A U+23C6 # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE [2000] [Unicode3.2] +3-274B U+23C7 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE [2000] [Unicode3.2] +3-274C U+23C8 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE [2000] [Unicode3.2] +3-274D U+23C9 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL [2000] [Unicode3.2] +3-274E U+23CA # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL [2000] [Unicode3.2] +3-274F U+23CB # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT [2000] [Unicode3.2] +3-2750 U+23CC # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT [2000] [Unicode3.2] +3-2751 U+0430 # CYRILLIC SMALL LETTER A +3-2752 U+0431 # CYRILLIC SMALL LETTER BE +3-2753 U+0432 # CYRILLIC SMALL LETTER VE +3-2754 U+0433 # CYRILLIC SMALL LETTER GHE +3-2755 U+0434 # CYRILLIC SMALL LETTER DE +3-2756 U+0435 # CYRILLIC SMALL LETTER IE +3-2757 U+0451 # CYRILLIC SMALL LETTER IO +3-2758 U+0436 # CYRILLIC SMALL LETTER ZHE +3-2759 U+0437 # CYRILLIC SMALL LETTER ZE +3-275A U+0438 # CYRILLIC SMALL LETTER I +3-275B U+0439 # CYRILLIC SMALL LETTER SHORT I +3-275C U+043A # CYRILLIC SMALL LETTER KA +3-275D U+043B # CYRILLIC SMALL LETTER EL +3-275E U+043C # CYRILLIC SMALL LETTER EM +3-275F U+043D # CYRILLIC SMALL LETTER EN +3-2760 U+043E # CYRILLIC SMALL LETTER O +3-2761 U+043F # CYRILLIC SMALL LETTER PE +3-2762 U+0440 # CYRILLIC SMALL LETTER ER +3-2763 U+0441 # CYRILLIC SMALL LETTER ES +3-2764 U+0442 # CYRILLIC SMALL LETTER TE +3-2765 U+0443 # CYRILLIC SMALL LETTER U +3-2766 U+0444 # CYRILLIC SMALL LETTER EF +3-2767 U+0445 # CYRILLIC SMALL LETTER HA +3-2768 U+0446 # CYRILLIC SMALL LETTER TSE +3-2769 U+0447 # CYRILLIC SMALL LETTER CHE +3-276A U+0448 # CYRILLIC SMALL LETTER SHA +3-276B U+0449 # CYRILLIC SMALL LETTER SHCHA +3-276C U+044A # CYRILLIC SMALL LETTER HARD SIGN +3-276D U+044B # CYRILLIC SMALL LETTER YERU +3-276E U+044C # CYRILLIC SMALL LETTER SOFT SIGN +3-276F U+044D # CYRILLIC SMALL LETTER E +3-2770 U+044E # CYRILLIC SMALL LETTER YU +3-2771 U+044F # CYRILLIC SMALL LETTER YA +3-2772 U+30F7 # KATAKANA LETTER VA [2000] +3-2773 U+30F8 # KATAKANA LETTER VI [2000] +3-2774 U+30F9 # KATAKANA LETTER VE [2000] +3-2775 U+30FA # KATAKANA LETTER VO [2000] +3-2776 U+22DA # LESS-THAN EQUAL TO OR GREATER-THAN [2000] +3-2777 U+22DB # GREATER-THAN EQUAL TO OR LESS-THAN [2000] +3-2778 U+2153 # VULGAR FRACTION ONE THIRD [2000] +3-2779 U+2154 # VULGAR FRACTION TWO THIRDS [2000] +3-277A U+2155 # VULGAR FRACTION ONE FIFTH [2000] +3-277B U+2713 # CHECK MARK [2000] +3-277C U+2318 # PLACE OF INTEREST SIGN [2000] +3-277D U+2423 # OPEN BOX [2000] +3-277E U+23CE # RETURN SYMBOL [2000] [Unicode3.2] +3-2821 U+2500 # BOX DRAWINGS LIGHT HORIZONTAL [1983] +3-2822 U+2502 # BOX DRAWINGS LIGHT VERTICAL [1983] +3-2823 U+250C # BOX DRAWINGS LIGHT DOWN AND RIGHT [1983] +3-2824 U+2510 # BOX DRAWINGS LIGHT DOWN AND LEFT [1983] +3-2825 U+2518 # BOX DRAWINGS LIGHT UP AND LEFT [1983] +3-2826 U+2514 # BOX DRAWINGS LIGHT UP AND RIGHT [1983] +3-2827 U+251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT [1983] +3-2828 U+252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL [1983] +3-2829 U+2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT [1983] +3-282A U+2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL [1983] +3-282B U+253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL [1983] +3-282C U+2501 # BOX DRAWINGS HEAVY HORIZONTAL [1983] +3-282D U+2503 # BOX DRAWINGS HEAVY VERTICAL [1983] +3-282E U+250F # BOX DRAWINGS HEAVY DOWN AND RIGHT [1983] +3-282F U+2513 # BOX DRAWINGS HEAVY DOWN AND LEFT [1983] +3-2830 U+251B # BOX DRAWINGS HEAVY UP AND LEFT [1983] +3-2831 U+2517 # BOX DRAWINGS HEAVY UP AND RIGHT [1983] +3-2832 U+2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT [1983] +3-2833 U+2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL [1983] +3-2834 U+252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT [1983] +3-2835 U+253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL [1983] +3-2836 U+254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL [1983] +3-2837 U+2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT [1983] +3-2838 U+252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY [1983] +3-2839 U+2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT [1983] +3-283A U+2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY [1983] +3-283B U+253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY [1983] +3-283C U+251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY [1983] +3-283D U+2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT [1983] +3-283E U+2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY [1983] +3-283F U+2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT [1983] +3-2840 U+2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT [1983] +3-2841 U+3251 # CIRCLED NUMBER TWENTY ONE [2000] [Unicode3.2] +3-2842 U+3252 # CIRCLED NUMBER TWENTY TWO [2000] [Unicode3.2] +3-2843 U+3253 # CIRCLED NUMBER TWENTY THREE [2000] [Unicode3.2] +3-2844 U+3254 # CIRCLED NUMBER TWENTY FOUR [2000] [Unicode3.2] +3-2845 U+3255 # CIRCLED NUMBER TWENTY FIVE [2000] [Unicode3.2] +3-2846 U+3256 # CIRCLED NUMBER TWENTY SIX [2000] [Unicode3.2] +3-2847 U+3257 # CIRCLED NUMBER TWENTY SEVEN [2000] [Unicode3.2] +3-2848 U+3258 # CIRCLED NUMBER TWENTY EIGHT [2000] [Unicode3.2] +3-2849 U+3259 # CIRCLED NUMBER TWENTY NINE [2000] [Unicode3.2] +3-284A U+325A # CIRCLED NUMBER THIRTY [2000] [Unicode3.2] +3-284B U+325B # CIRCLED NUMBER THIRTY ONE [2000] [Unicode3.2] +3-284C U+325C # CIRCLED NUMBER THIRTY TWO [2000] [Unicode3.2] +3-284D U+325D # CIRCLED NUMBER THIRTY THREE [2000] [Unicode3.2] +3-284E U+325E # CIRCLED NUMBER THIRTY FOUR [2000] [Unicode3.2] +3-284F U+325F # CIRCLED NUMBER THIRTY FIVE [2000] [Unicode3.2] +3-2850 U+32B1 # CIRCLED NUMBER THIRTY SIX [2000] [Unicode3.2] +3-2851 U+32B2 # CIRCLED NUMBER THIRTY SEVEN [2000] [Unicode3.2] +3-2852 U+32B3 # CIRCLED NUMBER THIRTY EIGHT [2000] [Unicode3.2] +3-2853 U+32B4 # CIRCLED NUMBER THIRTY NINE [2000] [Unicode3.2] +3-2854 U+32B5 # CIRCLED NUMBER FORTY [2000] [Unicode3.2] +3-2855 U+32B6 # CIRCLED NUMBER FORTY ONE [2000] [Unicode3.2] +3-2856 U+32B7 # CIRCLED NUMBER FORTY TWO [2000] [Unicode3.2] +3-2857 U+32B8 # CIRCLED NUMBER FORTY THREE [2000] [Unicode3.2] +3-2858 U+32B9 # CIRCLED NUMBER FORTY FOUR [2000] [Unicode3.2] +3-2859 U+32BA # CIRCLED NUMBER FORTY FIVE [2000] [Unicode3.2] +3-285A U+32BB # CIRCLED NUMBER FORTY SIX [2000] [Unicode3.2] +3-285B U+32BC # CIRCLED NUMBER FORTY SEVEN [2000] [Unicode3.2] +3-285C U+32BD # CIRCLED NUMBER FORTY EIGHT [2000] [Unicode3.2] +3-285D U+32BE # CIRCLED NUMBER FORTY NINE [2000] [Unicode3.2] +3-285E U+32BF # CIRCLED NUMBER FIFTY [2000] [Unicode3.2] +3-285F # +3-2860 # +3-2861 # +3-2862 # +3-2863 # +3-2864 # +3-2865 # +3-2866 # +3-2867 U+25D0 # CIRCLE WITH LEFT HALF BLACK [2000] +3-2868 U+25D1 # CIRCLE WITH RIGHT HALF BLACK [2000] +3-2869 U+25D2 # CIRCLE WITH LOWER HALF BLACK [2000] +3-286A U+25D3 # CIRCLE WITH UPPER HALF BLACK [2000] +3-286B U+203C # DOUBLE EXCLAMATION MARK [2000] +3-286C U+2047 # DOUBLE QUESTION MARK [2000] [Unicode3.2] +3-286D U+2048 # QUESTION EXCLAMATION MARK [2000] +3-286E U+2049 # EXCLAMATION QUESTION MARK [2000] +3-286F U+01CD # LATIN CAPITAL LETTER A WITH CARON [2000] +3-2870 U+01CE # LATIN SMALL LETTER A WITH CARON [2000] +3-2871 U+01D0 # LATIN SMALL LETTER I WITH CARON [2000] +3-2872 U+1E3E # LATIN CAPITAL LETTER M WITH ACUTE [2000] +3-2873 U+1E3F # LATIN SMALL LETTER M WITH ACUTE [2000] +3-2874 U+01F8 # LATIN CAPITAL LETTER N WITH GRAVE [2000] +3-2875 U+01F9 # LATIN SMALL LETTER N WITH GRAVE [2000] +3-2876 U+01D1 # LATIN CAPITAL LETTER O WITH CARON [2000] +3-2877 U+01D2 # LATIN SMALL LETTER O WITH CARON [2000] +3-2878 U+01D4 # LATIN SMALL LETTER U WITH CARON [2000] +3-2879 U+01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON [2000] +3-287A U+01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE [2000] +3-287B U+01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON [2000] +3-287C U+01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE [2000] +3-287D # +3-287E # +3-2921 U+20AC # EURO SIGN [2000] +3-2922 U+00A0 # NO-BREAK SPACE [2000] +3-2923 U+00A1 # INVERTED EXCLAMATION MARK [2000] +3-2924 U+00A4 # CURRENCY SIGN [2000] +3-2925 U+00A6 # BROKEN BAR [2000] +3-2926 U+00A9 # COPYRIGHT SIGN [2000] +3-2927 U+00AA # FEMININE ORDINAL INDICATOR [2000] +3-2928 U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK [2000] +3-2929 U+00AD # SOFT HYPHEN [2000] +3-292A U+00AE # REGISTERED SIGN [2000] +3-292B U+00AF # MACRON [2000] +3-292C U+00B2 # SUPERSCRIPT TWO [2000] +3-292D U+00B3 # SUPERSCRIPT THREE [2000] +3-292E U+00B7 # MIDDLE DOT [2000] +3-292F U+00B8 # CEDILLA [2000] +3-2930 U+00B9 # SUPERSCRIPT ONE [2000] +3-2931 U+00BA # MASCULINE ORDINAL INDICATOR [2000] +3-2932 U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK [2000] +3-2933 U+00BC # VULGAR FRACTION ONE QUARTER [2000] +3-2934 U+00BD # VULGAR FRACTION ONE HALF [2000] +3-2935 U+00BE # VULGAR FRACTION THREE QUARTERS [2000] +3-2936 U+00BF # INVERTED QUESTION MARK [2000] +3-2937 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE [2000] +3-2938 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE [2000] +3-2939 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX [2000] +3-293A U+00C3 # LATIN CAPITAL LETTER A WITH TILDE [2000] +3-293B U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS [2000] +3-293C U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE [2000] +3-293D U+00C6 # LATIN CAPITAL LETTER AE [2000] +3-293E U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA [2000] +3-293F U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE [2000] +3-2940 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE [2000] +3-2941 U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX [2000] +3-2942 U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS [2000] +3-2943 U+00CC # LATIN CAPITAL LETTER I WITH GRAVE [2000] +3-2944 U+00CD # LATIN CAPITAL LETTER I WITH ACUTE [2000] +3-2945 U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX [2000] +3-2946 U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS [2000] +3-2947 U+00D0 # LATIN CAPITAL LETTER ETH [2000] +3-2948 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE [2000] +3-2949 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE [2000] +3-294A U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE [2000] +3-294B U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX [2000] +3-294C U+00D5 # LATIN CAPITAL LETTER O WITH TILDE [2000] +3-294D U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS [2000] +3-294E U+00D8 # LATIN CAPITAL LETTER O WITH STROKE [2000] +3-294F U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE [2000] +3-2950 U+00DA # LATIN CAPITAL LETTER U WITH ACUTE [2000] +3-2951 U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX [2000] +3-2952 U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS [2000] +3-2953 U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE [2000] +3-2954 U+00DE # LATIN CAPITAL LETTER THORN [2000] +3-2955 U+00DF # LATIN SMALL LETTER SHARP S [2000] +3-2956 U+00E0 # LATIN SMALL LETTER A WITH GRAVE [2000] +3-2957 U+00E1 # LATIN SMALL LETTER A WITH ACUTE [2000] +3-2958 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX [2000] +3-2959 U+00E3 # LATIN SMALL LETTER A WITH TILDE [2000] +3-295A U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS [2000] +3-295B U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE [2000] +3-295C U+00E6 # LATIN SMALL LETTER AE [2000] +3-295D U+00E7 # LATIN SMALL LETTER C WITH CEDILLA [2000] +3-295E U+00E8 # LATIN SMALL LETTER E WITH GRAVE [2000] +3-295F U+00E9 # LATIN SMALL LETTER E WITH ACUTE [2000] +3-2960 U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX [2000] +3-2961 U+00EB # LATIN SMALL LETTER E WITH DIAERESIS [2000] +3-2962 U+00EC # LATIN SMALL LETTER I WITH GRAVE [2000] +3-2963 U+00ED # LATIN SMALL LETTER I WITH ACUTE [2000] +3-2964 U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX [2000] +3-2965 U+00EF # LATIN SMALL LETTER I WITH DIAERESIS [2000] +3-2966 U+00F0 # LATIN SMALL LETTER ETH [2000] +3-2967 U+00F1 # LATIN SMALL LETTER N WITH TILDE [2000] +3-2968 U+00F2 # LATIN SMALL LETTER O WITH GRAVE [2000] +3-2969 U+00F3 # LATIN SMALL LETTER O WITH ACUTE [2000] +3-296A U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX [2000] +3-296B U+00F5 # LATIN SMALL LETTER O WITH TILDE [2000] +3-296C U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS [2000] +3-296D U+00F8 # LATIN SMALL LETTER O WITH STROKE [2000] +3-296E U+00F9 # LATIN SMALL LETTER U WITH GRAVE [2000] +3-296F U+00FA # LATIN SMALL LETTER U WITH ACUTE [2000] +3-2970 U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX [2000] +3-2971 U+00FC # LATIN SMALL LETTER U WITH DIAERESIS [2000] +3-2972 U+00FD # LATIN SMALL LETTER Y WITH ACUTE [2000] +3-2973 U+00FE # LATIN SMALL LETTER THORN [2000] +3-2974 U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS [2000] +3-2975 U+0100 # LATIN CAPITAL LETTER A WITH MACRON [2000] +3-2976 U+012A # LATIN CAPITAL LETTER I WITH MACRON [2000] +3-2977 U+016A # LATIN CAPITAL LETTER U WITH MACRON [2000] +3-2978 U+0112 # LATIN CAPITAL LETTER E WITH MACRON [2000] +3-2979 U+014C # LATIN CAPITAL LETTER O WITH MACRON [2000] +3-297A U+0101 # LATIN SMALL LETTER A WITH MACRON [2000] +3-297B U+012B # LATIN SMALL LETTER I WITH MACRON [2000] +3-297C U+016B # LATIN SMALL LETTER U WITH MACRON [2000] +3-297D U+0113 # LATIN SMALL LETTER E WITH MACRON [2000] +3-297E U+014D # LATIN SMALL LETTER O WITH MACRON [2000] +3-2A21 U+0104 # LATIN CAPITAL LETTER A WITH OGONEK [2000] +3-2A22 U+02D8 # BREVE [2000] +3-2A23 U+0141 # LATIN CAPITAL LETTER L WITH STROKE [2000] +3-2A24 U+013D # LATIN CAPITAL LETTER L WITH CARON [2000] +3-2A25 U+015A # LATIN CAPITAL LETTER S WITH ACUTE [2000] +3-2A26 U+0160 # LATIN CAPITAL LETTER S WITH CARON [2000] +3-2A27 U+015E # LATIN CAPITAL LETTER S WITH CEDILLA [2000] +3-2A28 U+0164 # LATIN CAPITAL LETTER T WITH CARON [2000] +3-2A29 U+0179 # LATIN CAPITAL LETTER Z WITH ACUTE [2000] +3-2A2A U+017D # LATIN CAPITAL LETTER Z WITH CARON [2000] +3-2A2B U+017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE [2000] +3-2A2C U+0105 # LATIN SMALL LETTER A WITH OGONEK [2000] +3-2A2D U+02DB # OGONEK [2000] +3-2A2E U+0142 # LATIN SMALL LETTER L WITH STROKE [2000] +3-2A2F U+013E # LATIN SMALL LETTER L WITH CARON [2000] +3-2A30 U+015B # LATIN SMALL LETTER S WITH ACUTE [2000] +3-2A31 U+02C7 # CARON [2000] +3-2A32 U+0161 # LATIN SMALL LETTER S WITH CARON [2000] +3-2A33 U+015F # LATIN SMALL LETTER S WITH CEDILLA [2000] +3-2A34 U+0165 # LATIN SMALL LETTER T WITH CARON [2000] +3-2A35 U+017A # LATIN SMALL LETTER Z WITH ACUTE [2000] +3-2A36 U+02DD # DOUBLE ACUTE ACCENT [2000] +3-2A37 U+017E # LATIN SMALL LETTER Z WITH CARON [2000] +3-2A38 U+017C # LATIN SMALL LETTER Z WITH DOT ABOVE [2000] +3-2A39 U+0154 # LATIN CAPITAL LETTER R WITH ACUTE [2000] +3-2A3A U+0102 # LATIN CAPITAL LETTER A WITH BREVE [2000] +3-2A3B U+0139 # LATIN CAPITAL LETTER L WITH ACUTE [2000] +3-2A3C U+0106 # LATIN CAPITAL LETTER C WITH ACUTE [2000] +3-2A3D U+010C # LATIN CAPITAL LETTER C WITH CARON [2000] +3-2A3E U+0118 # LATIN CAPITAL LETTER E WITH OGONEK [2000] +3-2A3F U+011A # LATIN CAPITAL LETTER E WITH CARON [2000] +3-2A40 U+010E # LATIN CAPITAL LETTER D WITH CARON [2000] +3-2A41 U+0143 # LATIN CAPITAL LETTER N WITH ACUTE [2000] +3-2A42 U+0147 # LATIN CAPITAL LETTER N WITH CARON [2000] +3-2A43 U+0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE [2000] +3-2A44 U+0158 # LATIN CAPITAL LETTER R WITH CARON [2000] +3-2A45 U+016E # LATIN CAPITAL LETTER U WITH RING ABOVE [2000] +3-2A46 U+0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE [2000] +3-2A47 U+0162 # LATIN CAPITAL LETTER T WITH CEDILLA [2000] +3-2A48 U+0155 # LATIN SMALL LETTER R WITH ACUTE [2000] +3-2A49 U+0103 # LATIN SMALL LETTER A WITH BREVE [2000] +3-2A4A U+013A # LATIN SMALL LETTER L WITH ACUTE [2000] +3-2A4B U+0107 # LATIN SMALL LETTER C WITH ACUTE [2000] +3-2A4C U+010D # LATIN SMALL LETTER C WITH CARON [2000] +3-2A4D U+0119 # LATIN SMALL LETTER E WITH OGONEK [2000] +3-2A4E U+011B # LATIN SMALL LETTER E WITH CARON [2000] +3-2A4F U+010F # LATIN SMALL LETTER D WITH CARON [2000] +3-2A50 U+0111 # LATIN SMALL LETTER D WITH STROKE [2000] +3-2A51 U+0144 # LATIN SMALL LETTER N WITH ACUTE [2000] +3-2A52 U+0148 # LATIN SMALL LETTER N WITH CARON [2000] +3-2A53 U+0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE [2000] +3-2A54 U+0159 # LATIN SMALL LETTER R WITH CARON [2000] +3-2A55 U+016F # LATIN SMALL LETTER U WITH RING ABOVE [2000] +3-2A56 U+0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE [2000] +3-2A57 U+0163 # LATIN SMALL LETTER T WITH CEDILLA [2000] +3-2A58 U+02D9 # DOT ABOVE [2000] +3-2A59 U+0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX [2000] +3-2A5A U+011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX [2000] +3-2A5B U+0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX [2000] +3-2A5C U+0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX [2000] +3-2A5D U+015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX [2000] +3-2A5E U+016C # LATIN CAPITAL LETTER U WITH BREVE [2000] +3-2A5F U+0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX [2000] +3-2A60 U+011D # LATIN SMALL LETTER G WITH CIRCUMFLEX [2000] +3-2A61 U+0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX [2000] +3-2A62 U+0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX [2000] +3-2A63 U+015D # LATIN SMALL LETTER S WITH CIRCUMFLEX [2000] +3-2A64 U+016D # LATIN SMALL LETTER U WITH BREVE [2000] +3-2A65 U+0271 # LATIN SMALL LETTER M WITH HOOK [2000] +3-2A66 U+028B # LATIN SMALL LETTER V WITH HOOK [2000] +3-2A67 U+027E # LATIN SMALL LETTER R WITH FISHHOOK [2000] +3-2A68 U+0283 # LATIN SMALL LETTER ESH [2000] +3-2A69 U+0292 # LATIN SMALL LETTER EZH [2000] +3-2A6A U+026C # LATIN SMALL LETTER L WITH BELT [2000] +3-2A6B U+026E # LATIN SMALL LETTER LEZH [2000] +3-2A6C U+0279 # LATIN SMALL LETTER TURNED R [2000] +3-2A6D U+0288 # LATIN SMALL LETTER T WITH RETROFLEX HOOK [2000] +3-2A6E U+0256 # LATIN SMALL LETTER D WITH TAIL [2000] +3-2A6F U+0273 # LATIN SMALL LETTER N WITH RETROFLEX HOOK [2000] +3-2A70 U+027D # LATIN SMALL LETTER R WITH TAIL [2000] +3-2A71 U+0282 # LATIN SMALL LETTER S WITH HOOK [2000] +3-2A72 U+0290 # LATIN SMALL LETTER Z WITH RETROFLEX HOOK [2000] +3-2A73 U+027B # LATIN SMALL LETTER TURNED R WITH HOOK [2000] +3-2A74 U+026D # LATIN SMALL LETTER L WITH RETROFLEX HOOK [2000] +3-2A75 U+025F # LATIN SMALL LETTER DOTLESS J WITH STROKE [2000] +3-2A76 U+0272 # LATIN SMALL LETTER N WITH LEFT HOOK [2000] +3-2A77 U+029D # LATIN SMALL LETTER J WITH CROSSED-TAIL [2000] +3-2A78 U+028E # LATIN SMALL LETTER TURNED Y [2000] +3-2A79 U+0261 # LATIN SMALL LETTER SCRIPT G [2000] +3-2A7A U+014B # LATIN SMALL LETTER ENG [2000] +3-2A7B U+0270 # LATIN SMALL LETTER TURNED M WITH LONG LEG [2000] +3-2A7C U+0281 # LATIN LETTER SMALL CAPITAL INVERTED R [2000] +3-2A7D U+0127 # LATIN SMALL LETTER H WITH STROKE [2000] +3-2A7E U+0295 # LATIN LETTER PHARYNGEAL VOICED FRICATIVE [2000] +3-2B21 U+0294 # LATIN LETTER GLOTTAL STOP [2000] +3-2B22 U+0266 # LATIN SMALL LETTER H WITH HOOK [2000] +3-2B23 U+0298 # LATIN LETTER BILABIAL CLICK [2000] +3-2B24 U+01C2 # LATIN LETTER ALVEOLAR CLICK [2000] +3-2B25 U+0253 # LATIN SMALL LETTER B WITH HOOK [2000] +3-2B26 U+0257 # LATIN SMALL LETTER D WITH HOOK [2000] +3-2B27 U+0284 # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK [2000] +3-2B28 U+0260 # LATIN SMALL LETTER G WITH HOOK [2000] +3-2B29 U+0193 # LATIN CAPITAL LETTER G WITH HOOK [2000] +3-2B2A U+0153 # LATIN SMALL LIGATURE OE [2000] +3-2B2B U+0152 # LATIN CAPITAL LIGATURE OE [2000] +3-2B2C U+0268 # LATIN SMALL LETTER I WITH STROKE [2000] +3-2B2D U+0289 # LATIN SMALL LETTER U BAR [2000] +3-2B2E U+0258 # LATIN SMALL LETTER REVERSED E [2000] +3-2B2F U+0275 # LATIN SMALL LETTER BARRED O [2000] +3-2B30 U+0259 # LATIN SMALL LETTER SCHWA [2000] +3-2B31 U+025C # LATIN SMALL LETTER REVERSED OPEN E [2000] +3-2B32 U+025E # LATIN SMALL LETTER CLOSED REVERSED OPEN E [2000] +3-2B33 U+0250 # LATIN SMALL LETTER TURNED A [2000] +3-2B34 U+026F # LATIN SMALL LETTER TURNED M [2000] +3-2B35 U+028A # LATIN SMALL LETTER UPSILON [2000] +3-2B36 U+0264 # LATIN SMALL LETTER RAMS HORN [2000] +3-2B37 U+028C # LATIN SMALL LETTER TURNED V [2000] +3-2B38 U+0254 # LATIN SMALL LETTER OPEN O [2000] +3-2B39 U+0251 # LATIN SMALL LETTER ALPHA [2000] +3-2B3A U+0252 # LATIN SMALL LETTER TURNED ALPHA [2000] +3-2B3B U+028D # LATIN SMALL LETTER TURNED W [2000] +3-2B3C U+0265 # LATIN SMALL LETTER TURNED H [2000] +3-2B3D U+02A2 # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE [2000] +3-2B3E U+02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE [2000] +3-2B3F U+0255 # LATIN SMALL LETTER C WITH CURL [2000] +3-2B40 U+0291 # LATIN SMALL LETTER Z WITH CURL [2000] +3-2B41 U+027A # LATIN SMALL LETTER TURNED R WITH LONG LEG [2000] +3-2B42 U+0267 # LATIN SMALL LETTER HENG WITH HOOK [2000] +3-2B43 U+025A # LATIN SMALL LETTER SCHWA WITH HOOK [2000] +3-2B44 U+00E6+0300 # [2000] Private: U+F76A +3-2B45 U+01FD # LATIN SMALL LETTER AE WITH ACUTE [2000] +3-2B46 U+1F70 # GREEK SMALL LETTER ALPHA WITH VARIA [2000] +3-2B47 U+1F71 # GREEK SMALL LETTER ALPHA WITH OXIA [2000] +3-2B48 U+0254+0300 # [2000] Private: U+F76B +3-2B49 U+0254+0301 # [2000] Private: U+F76C +3-2B4A U+028C+0300 # [2000] Private: U+F76D +3-2B4B U+028C+0301 # [2000] Private: U+F76E +3-2B4C U+0259+0300 # [2000] Private: U+F76F +3-2B4D U+0259+0301 # [2000] Private: U+F770 +3-2B4E U+025A+0300 # [2000] Private: U+F771 +3-2B4F U+025A+0301 # [2000] Private: U+F772 +3-2B50 U+1F72 # GREEK SMALL LETTER EPSILON WITH VARIA [2000] +3-2B51 U+1F73 # GREEK SMALL LETTER EPSILON WITH OXIA [2000] +3-2B52 U+0361 # COMBINING DOUBLE INVERTED BREVE [2000] +3-2B53 U+02C8 # MODIFIER LETTER VERTICAL LINE [2000] +3-2B54 U+02CC # MODIFIER LETTER LOW VERTICAL LINE [2000] +3-2B55 U+02D0 # MODIFIER LETTER TRIANGULAR COLON [2000] +3-2B56 U+02D1 # MODIFIER LETTER HALF TRIANGULAR COLON [2000] +3-2B57 U+0306 # COMBINING BREVE [2000] +3-2B58 U+203F # UNDERTIE [2000] +3-2B59 U+030B # COMBINING DOUBLE ACUTE ACCENT [2000] +3-2B5A U+0301 # COMBINING ACUTE ACCENT [2000] +3-2B5B U+0304 # COMBINING MACRON [2000] +3-2B5C U+0300 # COMBINING GRAVE ACCENT [2000] +3-2B5D U+030F # COMBINING DOUBLE GRAVE ACCENT [2000] +3-2B5E U+030C # COMBINING CARON [2000] +3-2B5F U+0302 # COMBINING CIRCUMFLEX ACCENT [2000] +3-2B60 U+02E5 # MODIFIER LETTER EXTRA-HIGH TONE BAR [2000] +3-2B61 U+02E6 # MODIFIER LETTER HIGH TONE BAR [2000] +3-2B62 U+02E7 # MODIFIER LETTER MID TONE BAR [2000] +3-2B63 U+02E8 # MODIFIER LETTER LOW TONE BAR [2000] +3-2B64 U+02E9 # MODIFIER LETTER EXTRA-LOW TONE BAR [2000] +3-2B65 U+02E9+02E5 # [2000] Private: U+F773 +3-2B66 U+02E5+02E9 # [2000] Private: U+F774 +3-2B67 U+0325 # COMBINING RING BELOW [2000] +3-2B68 U+032C # COMBINING CARON BELOW [2000] +3-2B69 U+0339 # COMBINING RIGHT HALF RING BELOW [2000] +3-2B6A U+031C # COMBINING LEFT HALF RING BELOW [2000] +3-2B6B U+031F # COMBINING PLUS SIGN BELOW [2000] +3-2B6C U+0320 # COMBINING MINUS SIGN BELOW [2000] +3-2B6D U+0308 # COMBINING DIAERESIS [2000] +3-2B6E U+033D # COMBINING X ABOVE [2000] +3-2B6F U+0329 # COMBINING VERTICAL LINE BELOW [2000] +3-2B70 U+032F # COMBINING INVERTED BREVE BELOW [2000] +3-2B71 U+02DE # MODIFIER LETTER RHOTIC HOOK [2000] +3-2B72 U+0324 # COMBINING DIAERESIS BELOW [2000] +3-2B73 U+0330 # COMBINING TILDE BELOW [2000] +3-2B74 U+033C # COMBINING SEAGULL BELOW [2000] +3-2B75 U+0334 # COMBINING TILDE OVERLAY [2000] +3-2B76 U+031D # COMBINING UP TACK BELOW [2000] +3-2B77 U+031E # COMBINING DOWN TACK BELOW [2000] +3-2B78 U+0318 # COMBINING LEFT TACK BELOW [2000] +3-2B79 U+0319 # COMBINING RIGHT TACK BELOW [2000] +3-2B7A U+032A # COMBINING BRIDGE BELOW [2000] +3-2B7B U+033A # COMBINING INVERTED BRIDGE BELOW [2000] +3-2B7C U+033B # COMBINING SQUARE BELOW [2000] +3-2B7D U+0303 # COMBINING TILDE [2000] +3-2B7E U+031A # COMBINING LEFT ANGLE ABOVE [2000] +3-2C21 U+2776 # DINGBAT NEGATIVE CIRCLED DIGIT ONE [2000] +3-2C22 U+2777 # DINGBAT NEGATIVE CIRCLED DIGIT TWO [2000] +3-2C23 U+2778 # DINGBAT NEGATIVE CIRCLED DIGIT THREE [2000] +3-2C24 U+2779 # DINGBAT NEGATIVE CIRCLED DIGIT FOUR [2000] +3-2C25 U+277A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE [2000] +3-2C26 U+277B # DINGBAT NEGATIVE CIRCLED DIGIT SIX [2000] +3-2C27 U+277C # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN [2000] +3-2C28 U+277D # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT [2000] +3-2C29 U+277E # DINGBAT NEGATIVE CIRCLED DIGIT NINE [2000] +3-2C2A U+277F # DINGBAT NEGATIVE CIRCLED NUMBER TEN [2000] +3-2C2B U+24EB # NEGATIVE CIRCLED NUMBER ELEVEN [2000] [Unicode3.2] +3-2C2C U+24EC # NEGATIVE CIRCLED NUMBER TWELVE [2000] [Unicode3.2] +3-2C2D U+24ED # NEGATIVE CIRCLED NUMBER THIRTEEN [2000] [Unicode3.2] +3-2C2E U+24EE # NEGATIVE CIRCLED NUMBER FOURTEEN [2000] [Unicode3.2] +3-2C2F U+24EF # NEGATIVE CIRCLED NUMBER FIFTEEN [2000] [Unicode3.2] +3-2C30 U+24F0 # NEGATIVE CIRCLED NUMBER SIXTEEN [2000] [Unicode3.2] +3-2C31 U+24F1 # NEGATIVE CIRCLED NUMBER SEVENTEEN [2000] [Unicode3.2] +3-2C32 U+24F2 # NEGATIVE CIRCLED NUMBER EIGHTEEN [2000] [Unicode3.2] +3-2C33 U+24F3 # NEGATIVE CIRCLED NUMBER NINETEEN [2000] [Unicode3.2] +3-2C34 U+24F4 # NEGATIVE CIRCLED NUMBER TWENTY [2000] [Unicode3.2] +3-2C35 U+2170 # SMALL ROMAN NUMERAL ONE [2000] +3-2C36 U+2171 # SMALL ROMAN NUMERAL TWO [2000] +3-2C37 U+2172 # SMALL ROMAN NUMERAL THREE [2000] +3-2C38 U+2173 # SMALL ROMAN NUMERAL FOUR [2000] +3-2C39 U+2174 # SMALL ROMAN NUMERAL FIVE [2000] +3-2C3A U+2175 # SMALL ROMAN NUMERAL SIX [2000] +3-2C3B U+2176 # SMALL ROMAN NUMERAL SEVEN [2000] +3-2C3C U+2177 # SMALL ROMAN NUMERAL EIGHT [2000] +3-2C3D U+2178 # SMALL ROMAN NUMERAL NINE [2000] +3-2C3E U+2179 # SMALL ROMAN NUMERAL TEN [2000] +3-2C3F U+217A # SMALL ROMAN NUMERAL ELEVEN [2000] +3-2C40 U+217B # SMALL ROMAN NUMERAL TWELVE [2000] +3-2C41 U+24D0 # CIRCLED LATIN SMALL LETTER A [2000] +3-2C42 U+24D1 # CIRCLED LATIN SMALL LETTER B [2000] +3-2C43 U+24D2 # CIRCLED LATIN SMALL LETTER C [2000] +3-2C44 U+24D3 # CIRCLED LATIN SMALL LETTER D [2000] +3-2C45 U+24D4 # CIRCLED LATIN SMALL LETTER E [2000] +3-2C46 U+24D5 # CIRCLED LATIN SMALL LETTER F [2000] +3-2C47 U+24D6 # CIRCLED LATIN SMALL LETTER G [2000] +3-2C48 U+24D7 # CIRCLED LATIN SMALL LETTER H [2000] +3-2C49 U+24D8 # CIRCLED LATIN SMALL LETTER I [2000] +3-2C4A U+24D9 # CIRCLED LATIN SMALL LETTER J [2000] +3-2C4B U+24DA # CIRCLED LATIN SMALL LETTER K [2000] +3-2C4C U+24DB # CIRCLED LATIN SMALL LETTER L [2000] +3-2C4D U+24DC # CIRCLED LATIN SMALL LETTER M [2000] +3-2C4E U+24DD # CIRCLED LATIN SMALL LETTER N [2000] +3-2C4F U+24DE # CIRCLED LATIN SMALL LETTER O [2000] +3-2C50 U+24DF # CIRCLED LATIN SMALL LETTER P [2000] +3-2C51 U+24E0 # CIRCLED LATIN SMALL LETTER Q [2000] +3-2C52 U+24E1 # CIRCLED LATIN SMALL LETTER R [2000] +3-2C53 U+24E2 # CIRCLED LATIN SMALL LETTER S [2000] +3-2C54 U+24E3 # CIRCLED LATIN SMALL LETTER T [2000] +3-2C55 U+24E4 # CIRCLED LATIN SMALL LETTER U [2000] +3-2C56 U+24E5 # CIRCLED LATIN SMALL LETTER V [2000] +3-2C57 U+24E6 # CIRCLED LATIN SMALL LETTER W [2000] +3-2C58 U+24E7 # CIRCLED LATIN SMALL LETTER X [2000] +3-2C59 U+24E8 # CIRCLED LATIN SMALL LETTER Y [2000] +3-2C5A U+24E9 # CIRCLED LATIN SMALL LETTER Z [2000] +3-2C5B U+32D0 # CIRCLED KATAKANA A [2000] +3-2C5C U+32D1 # CIRCLED KATAKANA I [2000] +3-2C5D U+32D2 # CIRCLED KATAKANA U [2000] +3-2C5E U+32D3 # CIRCLED KATAKANA E [2000] +3-2C5F U+32D4 # CIRCLED KATAKANA O [2000] +3-2C60 U+32D5 # CIRCLED KATAKANA KA [2000] +3-2C61 U+32D6 # CIRCLED KATAKANA KI [2000] +3-2C62 U+32D7 # CIRCLED KATAKANA KU [2000] +3-2C63 U+32D8 # CIRCLED KATAKANA KE [2000] +3-2C64 U+32D9 # CIRCLED KATAKANA KO [2000] +3-2C65 U+32DA # CIRCLED KATAKANA SA [2000] +3-2C66 U+32DB # CIRCLED KATAKANA SI [2000] +3-2C67 U+32DC # CIRCLED KATAKANA SU [2000] +3-2C68 U+32DD # CIRCLED KATAKANA SE [2000] +3-2C69 U+32DE # CIRCLED KATAKANA SO [2000] +3-2C6A U+32DF # CIRCLED KATAKANA TA [2000] +3-2C6B U+32E0 # CIRCLED KATAKANA TI [2000] +3-2C6C U+32E1 # CIRCLED KATAKANA TU [2000] +3-2C6D U+32E2 # CIRCLED KATAKANA TE [2000] +3-2C6E U+32E3 # CIRCLED KATAKANA TO [2000] +3-2C6F U+32FA # CIRCLED KATAKANA RO [2000] +3-2C70 U+32E9 # CIRCLED KATAKANA HA [2000] +3-2C71 U+32E5 # CIRCLED KATAKANA NI [2000] +3-2C72 U+32ED # CIRCLED KATAKANA HO [2000] +3-2C73 U+32EC # CIRCLED KATAKANA HE [2000] +3-2C74 # +3-2C75 # +3-2C76 # +3-2C77 # +3-2C78 # +3-2C79 # +3-2C7A # +3-2C7B # +3-2C7C # +3-2C7D U+2051 # TWO ASTERISKS ALIGNED VERTICALLY [2000] [Unicode3.2] +3-2C7E U+2042 # ASTERISM [2000] +3-2D21 U+2460 # CIRCLED DIGIT ONE [2000] +3-2D22 U+2461 # CIRCLED DIGIT TWO [2000] +3-2D23 U+2462 # CIRCLED DIGIT THREE [2000] +3-2D24 U+2463 # CIRCLED DIGIT FOUR [2000] +3-2D25 U+2464 # CIRCLED DIGIT FIVE [2000] +3-2D26 U+2465 # CIRCLED DIGIT SIX [2000] +3-2D27 U+2466 # CIRCLED DIGIT SEVEN [2000] +3-2D28 U+2467 # CIRCLED DIGIT EIGHT [2000] +3-2D29 U+2468 # CIRCLED DIGIT NINE [2000] +3-2D2A U+2469 # CIRCLED NUMBER TEN [2000] +3-2D2B U+246A # CIRCLED NUMBER ELEVEN [2000] +3-2D2C U+246B # CIRCLED NUMBER TWELVE [2000] +3-2D2D U+246C # CIRCLED NUMBER THIRTEEN [2000] +3-2D2E U+246D # CIRCLED NUMBER FOURTEEN [2000] +3-2D2F U+246E # CIRCLED NUMBER FIFTEEN [2000] +3-2D30 U+246F # CIRCLED NUMBER SIXTEEN [2000] +3-2D31 U+2470 # CIRCLED NUMBER SEVENTEEN [2000] +3-2D32 U+2471 # CIRCLED NUMBER EIGHTEEN [2000] +3-2D33 U+2472 # CIRCLED NUMBER NINETEEN [2000] +3-2D34 U+2473 # CIRCLED NUMBER TWENTY [2000] +3-2D35 U+2160 # ROMAN NUMERAL ONE [2000] +3-2D36 U+2161 # ROMAN NUMERAL TWO [2000] +3-2D37 U+2162 # ROMAN NUMERAL THREE [2000] +3-2D38 U+2163 # ROMAN NUMERAL FOUR [2000] +3-2D39 U+2164 # ROMAN NUMERAL FIVE [2000] +3-2D3A U+2165 # ROMAN NUMERAL SIX [2000] +3-2D3B U+2166 # ROMAN NUMERAL SEVEN [2000] +3-2D3C U+2167 # ROMAN NUMERAL EIGHT [2000] +3-2D3D U+2168 # ROMAN NUMERAL NINE [2000] +3-2D3E U+2169 # ROMAN NUMERAL TEN [2000] +3-2D3F U+216A # ROMAN NUMERAL ELEVEN [2000] +3-2D40 U+3349 # SQUARE MIRI [2000] +3-2D41 U+3314 # SQUARE KIRO [2000] +3-2D42 U+3322 # SQUARE SENTI [2000] +3-2D43 U+334D # SQUARE MEETORU [2000] +3-2D44 U+3318 # SQUARE GURAMU [2000] +3-2D45 U+3327 # SQUARE TON [2000] +3-2D46 U+3303 # SQUARE AARU [2000] +3-2D47 U+3336 # SQUARE HEKUTAARU [2000] +3-2D48 U+3351 # SQUARE RITTORU [2000] +3-2D49 U+3357 # SQUARE WATTO [2000] +3-2D4A U+330D # SQUARE KARORII [2000] +3-2D4B U+3326 # SQUARE DORU [2000] +3-2D4C U+3323 # SQUARE SENTO [2000] +3-2D4D U+332B # SQUARE PAASENTO [2000] +3-2D4E U+334A # SQUARE MIRIBAARU [2000] +3-2D4F U+333B # SQUARE PEEZI [2000] +3-2D50 U+339C # SQUARE MM [2000] +3-2D51 U+339D # SQUARE CM [2000] +3-2D52 U+339E # SQUARE KM [2000] +3-2D53 U+338E # SQUARE MG [2000] +3-2D54 U+338F # SQUARE KG [2000] +3-2D55 U+33C4 # SQUARE CC [2000] +3-2D56 U+33A1 # SQUARE M SQUARED [2000] +3-2D57 U+216B # ROMAN NUMERAL TWELVE [2000] +3-2D58 # +3-2D59 # +3-2D5A # +3-2D5B # +3-2D5C # +3-2D5D # +3-2D5E # +3-2D5F U+337B # SQUARE ERA NAME HEISEI [2000] +3-2D60 U+301D # REVERSED DOUBLE PRIME QUOTATION MARK [2000] +3-2D61 U+301F # LOW DOUBLE PRIME QUOTATION MARK [2000] +3-2D62 U+2116 # NUMERO SIGN [2000] +3-2D63 U+33CD # SQUARE KK [2000] +3-2D64 U+2121 # TELEPHONE SIGN [2000] +3-2D65 U+32A4 # CIRCLED IDEOGRAPH HIGH [2000] +3-2D66 U+32A5 # CIRCLED IDEOGRAPH CENTRE [2000] +3-2D67 U+32A6 # CIRCLED IDEOGRAPH LOW [2000] +3-2D68 U+32A7 # CIRCLED IDEOGRAPH LEFT [2000] +3-2D69 U+32A8 # CIRCLED IDEOGRAPH RIGHT [2000] +3-2D6A U+3231 # PARENTHESIZED IDEOGRAPH STOCK [2000] +3-2D6B U+3232 # PARENTHESIZED IDEOGRAPH HAVE [2000] +3-2D6C U+3239 # PARENTHESIZED IDEOGRAPH REPRESENT [2000] +3-2D6D U+337E # SQUARE ERA NAME MEIZI [2000] +3-2D6E U+337D # SQUARE ERA NAME TAISYOU [2000] +3-2D6F U+337C # SQUARE ERA NAME SYOUWA [2000] +3-2D70 # Windows: U+2252 +3-2D71 # Windows: U+2261 +3-2D72 # Windows: U+222B +3-2D73 U+222E # CONTOUR INTEGRAL [2000] +3-2D74 # Windows: U+2211 +3-2D75 # Windows: U+221A +3-2D76 # Windows: U+22A5 +3-2D77 # Windows: U+2220 +3-2D78 U+221F # RIGHT ANGLE [2000] +3-2D79 U+22BF # RIGHT TRIANGLE [2000] +3-2D7A # Windows: U+2235 +3-2D7B # Windows: U+2229 +3-2D7C # Windows: U+222A +3-2D7D U+2756 # BLACK DIAMOND MINUS WHITE X [2000] +3-2D7E U+261E # WHITE RIGHT POINTING INDEX [2000] +3-2E21 U+4FF1 # [2004] +3-2E22 U+2000B # [2000] [Unicode3.1] Private: U+F780 +3-2E23 U+3402 # [2000] +3-2E24 U+4E28 # [2000] +3-2E25 U+4E2F # [2000] +3-2E26 U+4E30 # [2000] +3-2E27 U+4E8D # [2000] +3-2E28 U+4EE1 # [2000] +3-2E29 U+4EFD # [2000] +3-2E2A U+4EFF # [2000] +3-2E2B U+4F03 # [2000] +3-2E2C U+4F0B # [2000] +3-2E2D U+4F60 # [2000] +3-2E2E U+4F48 # [2000] +3-2E2F U+4F49 # [2000] +3-2E30 U+4F56 # [2000] +3-2E31 U+4F5F # [2000] +3-2E32 U+4F6A # [2000] +3-2E33 U+4F6C # [2000] +3-2E34 U+4F7E # [2000] +3-2E35 U+4F8A # [2000] +3-2E36 U+4F94 # [2000] +3-2E37 U+4F97 # [2000] +3-2E38 U+FA30 # CJK COMPATIBILITY IDEOGRAPH-FA30 [2000] [Unicode3.2] +3-2E39 U+4FC9 # [2000] +3-2E3A U+4FE0 # [2000] +3-2E3B U+5001 # [2000] +3-2E3C U+5002 # [2000] +3-2E3D U+500E # [2000] +3-2E3E U+5018 # [2000] +3-2E3F U+5027 # [2000] +3-2E40 U+502E # [2000] +3-2E41 U+5040 # [2000] +3-2E42 U+503B # [2000] +3-2E43 U+5041 # [2000] +3-2E44 U+5094 # [2000] +3-2E45 U+50CC # [2000] +3-2E46 U+50F2 # [2000] +3-2E47 U+50D0 # [2000] +3-2E48 U+50E6 # [2000] +3-2E49 U+FA31 # CJK COMPATIBILITY IDEOGRAPH-FA31 [2000] [Unicode3.2] +3-2E4A U+5106 # [2000] +3-2E4B U+5103 # [2000] +3-2E4C U+510B # [2000] +3-2E4D U+511E # [2000] +3-2E4E U+5135 # [2000] +3-2E4F U+514A # [2000] +3-2E50 U+FA32 # CJK COMPATIBILITY IDEOGRAPH-FA32 [2000] [Unicode3.2] +3-2E51 U+5155 # [2000] +3-2E52 U+5157 # [2000] +3-2E53 U+34B5 # [2000] +3-2E54 U+519D # [2000] +3-2E55 U+51C3 # [2000] +3-2E56 U+51CA # [2000] +3-2E57 U+51DE # [2000] +3-2E58 U+51E2 # [2000] +3-2E59 U+51EE # [2000] +3-2E5A U+5201 # [2000] +3-2E5B U+34DB # [2000] +3-2E5C U+5213 # [2000] +3-2E5D U+5215 # [2000] +3-2E5E U+5249 # [2000] +3-2E5F U+5257 # [2000] +3-2E60 U+5261 # [2000] +3-2E61 U+5293 # [2000] +3-2E62 U+52C8 # [2000] +3-2E63 U+FA33 # CJK COMPATIBILITY IDEOGRAPH-FA33 [2000] [Unicode3.2] +3-2E64 U+52CC # [2000] +3-2E65 U+52D0 # [2000] +3-2E66 U+52D6 # [2000] +3-2E67 U+52DB # [2000] +3-2E68 U+FA34 # CJK COMPATIBILITY IDEOGRAPH-FA34 [2000] [Unicode3.2] +3-2E69 U+52F0 # [2000] +3-2E6A U+52FB # [2000] +3-2E6B U+5300 # [2000] +3-2E6C U+5307 # [2000] +3-2E6D U+531C # [2000] +3-2E6E U+FA35 # CJK COMPATIBILITY IDEOGRAPH-FA35 [2000] [Unicode3.2] +3-2E6F U+5361 # [2000] +3-2E70 U+5363 # [2000] +3-2E71 U+537D # [2000] +3-2E72 U+5393 # [2000] +3-2E73 U+539D # [2000] +3-2E74 U+53B2 # [2000] +3-2E75 U+5412 # [2000] +3-2E76 U+5427 # [2000] +3-2E77 U+544D # [2000] +3-2E78 U+549C # [2000] +3-2E79 U+546B # [2000] +3-2E7A U+5474 # [2000] +3-2E7B U+547F # [2000] +3-2E7C U+5488 # [2000] +3-2E7D U+5496 # [2000] +3-2E7E U+54A1 # [2000] +3-2F21 U+54A9 # [2000] +3-2F22 U+54C6 # [2000] +3-2F23 U+54FF # [2000] +3-2F24 U+550E # [2000] +3-2F25 U+552B # [2000] +3-2F26 U+5535 # [2000] +3-2F27 U+5550 # [2000] +3-2F28 U+555E # [2000] +3-2F29 U+5581 # [2000] +3-2F2A U+5586 # [2000] +3-2F2B U+558E # [2000] +3-2F2C U+FA36 # CJK COMPATIBILITY IDEOGRAPH-FA36 [2000] [Unicode3.2] +3-2F2D U+55AD # [2000] +3-2F2E U+55CE # [2000] +3-2F2F U+FA37 # CJK COMPATIBILITY IDEOGRAPH-FA37 [2000] [Unicode3.2] +3-2F30 U+5608 # [2000] +3-2F31 U+560E # [2000] +3-2F32 U+563B # [2000] +3-2F33 U+5649 # [2000] +3-2F34 U+5676 # [2000] +3-2F35 U+5666 # [2000] +3-2F36 U+FA38 # CJK COMPATIBILITY IDEOGRAPH-FA38 [2000] [Unicode3.2] +3-2F37 U+566F # [2000] +3-2F38 U+5671 # [2000] +3-2F39 U+5672 # [2000] +3-2F3A U+5699 # [2000] +3-2F3B U+569E # [2000] +3-2F3C U+56A9 # [2000] +3-2F3D U+56AC # [2000] +3-2F3E U+56B3 # [2000] +3-2F3F U+56C9 # [2000] +3-2F40 U+56CA # [2000] +3-2F41 U+570A # [2000] +3-2F42 U+2123D # [2000] [Unicode3.1] Private: U+F78A +3-2F43 U+5721 # [2000] +3-2F44 U+572F # [2000] +3-2F45 U+5733 # [2000] +3-2F46 U+5734 # [2000] +3-2F47 U+5770 # [2000] +3-2F48 U+5777 # [2000] +3-2F49 U+577C # [2000] +3-2F4A U+579C # [2000] +3-2F4B U+FA0F # CJK COMPATIBILITY IDEOGRAPH-FA0F [2000] +3-2F4C U+2131B # [2000] [Unicode3.1] Private: U+F78B +3-2F4D U+57B8 # [2000] +3-2F4E U+57C7 # [2000] +3-2F4F U+57C8 # [2000] +3-2F50 U+57CF # [2000] +3-2F51 U+57E4 # [2000] +3-2F52 U+57ED # [2000] +3-2F53 U+57F5 # [2000] +3-2F54 U+57F6 # [2000] +3-2F55 U+57FF # [2000] +3-2F56 U+5809 # [2000] +3-2F57 U+FA10 # CJK COMPATIBILITY IDEOGRAPH-FA10 [2000] +3-2F58 U+5861 # [2000] +3-2F59 U+5864 # [2000] +3-2F5A U+FA39 # CJK COMPATIBILITY IDEOGRAPH-FA39 [2000] [Unicode3.2] +3-2F5B U+587C # [2000] +3-2F5C U+5889 # [2000] +3-2F5D U+589E # [2000] +3-2F5E U+FA3A # CJK COMPATIBILITY IDEOGRAPH-FA3A [2000] [Unicode3.2] +3-2F5F U+58A9 # [2000] +3-2F60 U+2146E # [2000] [Unicode3.1] Private: U+F78E +3-2F61 U+58D2 # [2000] +3-2F62 U+58CE # [2000] +3-2F63 U+58D4 # [2000] +3-2F64 U+58DA # [2000] +3-2F65 U+58E0 # [2000] +3-2F66 U+58E9 # [2000] +3-2F67 U+590C # [2000] +3-2F68 U+8641 # [2000] +3-2F69 U+595D # [2000] +3-2F6A U+596D # [2000] +3-2F6B U+598B # [2000] +3-2F6C U+5992 # [2000] +3-2F6D U+59A4 # [2000] +3-2F6E U+59C3 # [2000] +3-2F6F U+59D2 # [2000] +3-2F70 U+59DD # [2000] +3-2F71 U+5A13 # [2000] +3-2F72 U+5A23 # [2000] +3-2F73 U+5A67 # [2000] +3-2F74 U+5A6D # [2000] +3-2F75 U+5A77 # [2000] +3-2F76 U+5A7E # [2000] +3-2F77 U+5A84 # [2000] +3-2F78 U+5A9E # [2000] +3-2F79 U+5AA7 # [2000] +3-2F7A U+5AC4 # [2000] +3-2F7B U+218BD # [2000] [Unicode3.1] Private: U+F78F +3-2F7C U+5B19 # [2000] +3-2F7D U+5B25 # [2000] +3-2F7E U+525D # [2004] +3-3021 U+4E9C # +3-3022 U+5516 # +3-3023 U+5A03 # +3-3024 U+963F # +3-3025 U+54C0 # +3-3026 U+611B # +3-3027 U+6328 # +3-3028 U+59F6 # +3-3029 U+9022 # +3-302A U+8475 # +3-302B U+831C # +3-302C U+7A50 # +3-302D U+60AA # +3-302E U+63E1 # +3-302F U+6E25 # +3-3030 U+65ED # +3-3031 U+8466 # +3-3032 U+82A6 # +3-3033 U+9BF5 # +3-3034 U+6893 # +3-3035 U+5727 # +3-3036 U+65A1 # +3-3037 U+6271 # +3-3038 U+5B9B # +3-3039 U+59D0 # +3-303A U+867B # +3-303B U+98F4 # +3-303C U+7D62 # +3-303D U+7DBE # +3-303E U+9B8E # +3-303F U+6216 # +3-3040 U+7C9F # +3-3041 U+88B7 # +3-3042 U+5B89 # +3-3043 U+5EB5 # +3-3044 U+6309 # +3-3045 U+6697 # +3-3046 U+6848 # +3-3047 U+95C7 # +3-3048 U+978D # +3-3049 U+674F # +3-304A U+4EE5 # +3-304B U+4F0A # +3-304C U+4F4D # +3-304D U+4F9D # +3-304E U+5049 # +3-304F U+56F2 # +3-3050 U+5937 # +3-3051 U+59D4 # +3-3052 U+5A01 # +3-3053 U+5C09 # +3-3054 U+60DF # +3-3055 U+610F # +3-3056 U+6170 # +3-3057 U+6613 # +3-3058 U+6905 # +3-3059 U+70BA # +3-305A U+754F # +3-305B U+7570 # +3-305C U+79FB # +3-305D U+7DAD # +3-305E U+7DEF # +3-305F U+80C3 # +3-3060 U+840E # +3-3061 U+8863 # +3-3062 U+8B02 # +3-3063 U+9055 # +3-3064 U+907A # +3-3065 U+533B # +3-3066 U+4E95 # +3-3067 U+4EA5 # +3-3068 U+57DF # +3-3069 U+80B2 # +3-306A U+90C1 # +3-306B U+78EF # +3-306C U+4E00 # +3-306D U+58F1 # +3-306E U+6EA2 # +3-306F U+9038 # +3-3070 U+7A32 # +3-3071 U+8328 # +3-3072 U+828B # +3-3073 U+9C2F # +3-3074 U+5141 # +3-3075 U+5370 # +3-3076 U+54BD # +3-3077 U+54E1 # +3-3078 U+56E0 # +3-3079 U+59FB # +3-307A U+5F15 # +3-307B U+98F2 # +3-307C U+6DEB # +3-307D U+80E4 # +3-307E U+852D # +3-3121 U+9662 # +3-3122 U+9670 # +3-3123 U+96A0 # +3-3124 U+97FB # +3-3125 U+540B # +3-3126 U+53F3 # +3-3127 U+5B87 # +3-3128 U+70CF # +3-3129 U+7FBD # +3-312A U+8FC2 # +3-312B U+96E8 # +3-312C U+536F # +3-312D U+9D5C # +3-312E U+7ABA # +3-312F U+4E11 # +3-3130 U+7893 # +3-3131 U+81FC # +3-3132 U+6E26 # +3-3133 U+5618 # +3-3134 U+5504 # +3-3135 U+6B1D # +3-3136 U+851A # +3-3137 U+9C3B # +3-3138 U+59E5 # +3-3139 U+53A9 # +3-313A U+6D66 # +3-313B U+74DC # +3-313C U+958F # +3-313D U+5642 # +3-313E U+4E91 # +3-313F U+904B # +3-3140 U+96F2 # +3-3141 U+834F # +3-3142 U+990C # +3-3143 U+53E1 # +3-3144 U+55B6 # +3-3145 U+5B30 # +3-3146 U+5F71 # +3-3147 U+6620 # +3-3148 U+66F3 # +3-3149 U+6804 # +3-314A U+6C38 # +3-314B U+6CF3 # +3-314C U+6D29 # +3-314D U+745B # +3-314E U+76C8 # +3-314F U+7A4E # +3-3150 U+9834 # +3-3151 U+82F1 # +3-3152 U+885B # +3-3153 U+8A60 # +3-3154 U+92ED # +3-3155 U+6DB2 # +3-3156 U+75AB # +3-3157 U+76CA # +3-3158 U+99C5 # +3-3159 U+60A6 # +3-315A U+8B01 # +3-315B U+8D8A # +3-315C U+95B2 # +3-315D U+698E # +3-315E U+53AD # +3-315F U+5186 # +3-3160 U+5712 # +3-3161 U+5830 # +3-3162 U+5944 # +3-3163 U+5BB4 # +3-3164 U+5EF6 # +3-3165 U+6028 # +3-3166 U+63A9 # +3-3167 U+63F4 # +3-3168 U+6CBF # +3-3169 U+6F14 # +3-316A U+708E # +3-316B U+7114 # +3-316C U+7159 # +3-316D U+71D5 # +3-316E U+733F # +3-316F U+7E01 # +3-3170 U+8276 # +3-3171 U+82D1 # +3-3172 U+8597 # +3-3173 U+9060 # +3-3174 U+925B # +3-3175 U+9D1B # +3-3176 U+5869 # +3-3177 U+65BC # +3-3178 U+6C5A # +3-3179 U+7525 # +3-317A U+51F9 # +3-317B U+592E # +3-317C U+5965 # +3-317D U+5F80 # +3-317E U+5FDC # +3-3221 U+62BC # +3-3222 U+65FA # +3-3223 U+6A2A # +3-3224 U+6B27 # +3-3225 U+6BB4 # +3-3226 U+738B # +3-3227 U+7FC1 # +3-3228 U+8956 # +3-3229 U+9D2C # +3-322A U+9D0E # +3-322B U+9EC4 # +3-322C U+5CA1 # +3-322D U+6C96 # +3-322E U+837B # +3-322F U+5104 # +3-3230 U+5C4B # +3-3231 U+61B6 # +3-3232 U+81C6 # +3-3233 U+6876 # +3-3234 U+7261 # +3-3235 U+4E59 # +3-3236 U+4FFA # +3-3237 U+5378 # +3-3238 U+6069 # +3-3239 U+6E29 # +3-323A U+7A4F # +3-323B U+97F3 # +3-323C U+4E0B # +3-323D U+5316 # +3-323E U+4EEE # +3-323F U+4F55 # +3-3240 U+4F3D # +3-3241 U+4FA1 # +3-3242 U+4F73 # +3-3243 U+52A0 # +3-3244 U+53EF # +3-3245 U+5609 # +3-3246 U+590F # +3-3247 U+5AC1 # +3-3248 U+5BB6 # +3-3249 U+5BE1 # +3-324A U+79D1 # +3-324B U+6687 # +3-324C U+679C # +3-324D U+67B6 # +3-324E U+6B4C # +3-324F U+6CB3 # +3-3250 U+706B # +3-3251 U+73C2 # +3-3252 U+798D # +3-3253 U+79BE # +3-3254 U+7A3C # +3-3255 U+7B87 # +3-3256 U+82B1 # +3-3257 U+82DB # +3-3258 U+8304 # +3-3259 U+8377 # +3-325A U+83EF # +3-325B U+83D3 # +3-325C U+8766 # +3-325D U+8AB2 # +3-325E U+5629 # +3-325F U+8CA8 # +3-3260 U+8FE6 # +3-3261 U+904E # +3-3262 U+971E # +3-3263 U+868A # +3-3264 U+4FC4 # +3-3265 U+5CE8 # +3-3266 U+6211 # +3-3267 U+7259 # +3-3268 U+753B # +3-3269 U+81E5 # +3-326A U+82BD # +3-326B U+86FE # +3-326C U+8CC0 # +3-326D U+96C5 # +3-326E U+9913 # +3-326F U+99D5 # +3-3270 U+4ECB # +3-3271 U+4F1A # +3-3272 U+89E3 # +3-3273 U+56DE # +3-3274 U+584A # +3-3275 U+58CA # +3-3276 U+5EFB # +3-3277 U+5FEB # +3-3278 U+602A # +3-3279 U+6094 # +3-327A U+6062 # +3-327B U+61D0 # +3-327C U+6212 # +3-327D U+62D0 # +3-327E U+6539 # +3-3321 U+9B41 # +3-3322 U+6666 # +3-3323 U+68B0 # +3-3324 U+6D77 # +3-3325 U+7070 # +3-3326 U+754C # +3-3327 U+7686 # +3-3328 U+7D75 # +3-3329 U+82A5 # +3-332A U+87F9 # +3-332B U+958B # +3-332C U+968E # +3-332D U+8C9D # +3-332E U+51F1 # +3-332F U+52BE # +3-3330 U+5916 # +3-3331 U+54B3 # +3-3332 U+5BB3 # +3-3333 U+5D16 # +3-3334 U+6168 # +3-3335 U+6982 # +3-3336 U+6DAF # +3-3337 U+788D # +3-3338 U+84CB # +3-3339 U+8857 # +3-333A U+8A72 # +3-333B U+93A7 # +3-333C U+9AB8 # +3-333D U+6D6C # +3-333E U+99A8 # +3-333F U+86D9 # +3-3340 U+57A3 # +3-3341 U+67FF # +3-3342 U+86CE # +3-3343 U+920E # +3-3344 U+5283 # +3-3345 U+5687 # +3-3346 U+5404 # +3-3347 U+5ED3 # +3-3348 U+62E1 # +3-3349 U+64B9 # +3-334A U+683C # +3-334B U+6838 # +3-334C U+6BBB # +3-334D U+7372 # +3-334E U+78BA # +3-334F U+7A6B # +3-3350 U+899A # +3-3351 U+89D2 # +3-3352 U+8D6B # +3-3353 U+8F03 # +3-3354 U+90ED # +3-3355 U+95A3 # +3-3356 U+9694 # +3-3357 U+9769 # +3-3358 U+5B66 # +3-3359 U+5CB3 # +3-335A U+697D # +3-335B U+984D # +3-335C U+984E # +3-335D U+639B # +3-335E U+7B20 # +3-335F U+6A2B # +3-3360 U+6A7F # +3-3361 U+68B6 # +3-3362 U+9C0D # +3-3363 U+6F5F # +3-3364 U+5272 # +3-3365 U+559D # +3-3366 U+6070 # +3-3367 U+62EC # +3-3368 U+6D3B # +3-3369 U+6E07 # +3-336A U+6ED1 # +3-336B U+845B # +3-336C U+8910 # +3-336D U+8F44 # +3-336E U+4E14 # +3-336F U+9C39 # +3-3370 U+53F6 # +3-3371 U+691B # +3-3372 U+6A3A # +3-3373 U+9784 # +3-3374 U+682A # +3-3375 U+515C # +3-3376 U+7AC3 # +3-3377 U+84B2 # +3-3378 U+91DC # +3-3379 U+938C # +3-337A U+565B # +3-337B U+9D28 # +3-337C U+6822 # +3-337D U+8305 # +3-337E U+8431 # +3-3421 U+7CA5 # +3-3422 U+5208 # +3-3423 U+82C5 # +3-3424 U+74E6 # +3-3425 U+4E7E # +3-3426 U+4F83 # +3-3427 U+51A0 # +3-3428 U+5BD2 # +3-3429 U+520A # +3-342A U+52D8 # +3-342B U+52E7 # +3-342C U+5DFB # +3-342D U+559A # +3-342E U+582A # +3-342F U+59E6 # +3-3430 U+5B8C # +3-3431 U+5B98 # +3-3432 U+5BDB # +3-3433 U+5E72 # +3-3434 U+5E79 # +3-3435 U+60A3 # +3-3436 U+611F # +3-3437 U+6163 # +3-3438 U+61BE # +3-3439 U+63DB # +3-343A U+6562 # +3-343B U+67D1 # +3-343C U+6853 # +3-343D U+68FA # +3-343E U+6B3E # +3-343F U+6B53 # +3-3440 U+6C57 # +3-3441 U+6F22 # +3-3442 U+6F97 # +3-3443 U+6F45 # +3-3444 U+74B0 # +3-3445 U+7518 # +3-3446 U+76E3 # +3-3447 U+770B # +3-3448 U+7AFF # +3-3449 U+7BA1 # +3-344A U+7C21 # +3-344B U+7DE9 # +3-344C U+7F36 # +3-344D U+7FF0 # +3-344E U+809D # +3-344F U+8266 # +3-3450 U+839E # +3-3451 U+89B3 # +3-3452 U+8ACC # +3-3453 U+8CAB # +3-3454 U+9084 # +3-3455 U+9451 # +3-3456 U+9593 # +3-3457 U+9591 # +3-3458 U+95A2 # +3-3459 U+9665 # +3-345A U+97D3 # +3-345B U+9928 # +3-345C U+8218 # +3-345D U+4E38 # +3-345E U+542B # +3-345F U+5CB8 # +3-3460 U+5DCC # +3-3461 U+73A9 # +3-3462 U+764C # +3-3463 U+773C # +3-3464 U+5CA9 # +3-3465 U+7FEB # +3-3466 U+8D0B # +3-3467 U+96C1 # +3-3468 U+9811 # +3-3469 U+9854 # +3-346A U+9858 # +3-346B U+4F01 # +3-346C U+4F0E # +3-346D U+5371 # +3-346E U+559C # +3-346F U+5668 # +3-3470 U+57FA # +3-3471 U+5947 # +3-3472 U+5B09 # +3-3473 U+5BC4 # +3-3474 U+5C90 # +3-3475 U+5E0C # +3-3476 U+5E7E # +3-3477 U+5FCC # +3-3478 U+63EE # +3-3479 U+673A # +3-347A U+65D7 # +3-347B U+65E2 # +3-347C U+671F # +3-347D U+68CB # +3-347E U+68C4 # +3-3521 U+6A5F # +3-3522 U+5E30 # +3-3523 U+6BC5 # +3-3524 U+6C17 # +3-3525 U+6C7D # +3-3526 U+757F # +3-3527 U+7948 # +3-3528 U+5B63 # +3-3529 U+7A00 # +3-352A U+7D00 # +3-352B U+5FBD # +3-352C U+898F # +3-352D U+8A18 # +3-352E U+8CB4 # +3-352F U+8D77 # +3-3530 U+8ECC # +3-3531 U+8F1D # +3-3532 U+98E2 # +3-3533 U+9A0E # +3-3534 U+9B3C # +3-3535 U+4E80 # +3-3536 U+507D # +3-3537 U+5100 # +3-3538 U+5993 # +3-3539 U+5B9C # +3-353A U+622F # +3-353B U+6280 # +3-353C U+64EC # +3-353D U+6B3A # +3-353E U+72A0 # +3-353F U+7591 # +3-3540 U+7947 # +3-3541 U+7FA9 # +3-3542 U+87FB # +3-3543 U+8ABC # +3-3544 U+8B70 # +3-3545 U+63AC # +3-3546 U+83CA # +3-3547 U+97A0 # +3-3548 U+5409 # +3-3549 U+5403 # +3-354A U+55AB # +3-354B U+6854 # +3-354C U+6A58 # +3-354D U+8A70 # +3-354E U+7827 # +3-354F U+6775 # +3-3550 U+9ECD # +3-3551 U+5374 # +3-3552 U+5BA2 # +3-3553 U+811A # +3-3554 U+8650 # +3-3555 U+9006 # +3-3556 U+4E18 # +3-3557 U+4E45 # +3-3558 U+4EC7 # +3-3559 U+4F11 # +3-355A U+53CA # +3-355B U+5438 # +3-355C U+5BAE # +3-355D U+5F13 # +3-355E U+6025 # +3-355F U+6551 # +3-3560 U+673D # +3-3561 U+6C42 # +3-3562 U+6C72 # +3-3563 U+6CE3 # +3-3564 U+7078 # +3-3565 U+7403 # +3-3566 U+7A76 # +3-3567 U+7AAE # +3-3568 U+7B08 # +3-3569 U+7D1A # +3-356A U+7CFE # +3-356B U+7D66 # +3-356C U+65E7 # +3-356D U+725B # +3-356E U+53BB # +3-356F U+5C45 # +3-3570 U+5DE8 # +3-3571 U+62D2 # +3-3572 U+62E0 # +3-3573 U+6319 # +3-3574 U+6E20 # +3-3575 U+865A # +3-3576 U+8A31 # +3-3577 U+8DDD # +3-3578 U+92F8 # +3-3579 U+6F01 # +3-357A U+79A6 # +3-357B U+9B5A # +3-357C U+4EA8 # +3-357D U+4EAB # +3-357E U+4EAC # +3-3621 U+4F9B # +3-3622 U+4FA0 # +3-3623 U+50D1 # +3-3624 U+5147 # +3-3625 U+7AF6 # +3-3626 U+5171 # +3-3627 U+51F6 # +3-3628 U+5354 # +3-3629 U+5321 # +3-362A U+537F # +3-362B U+53EB # +3-362C U+55AC # +3-362D U+5883 # +3-362E U+5CE1 # +3-362F U+5F37 # +3-3630 U+5F4A # +3-3631 U+602F # +3-3632 U+6050 # +3-3633 U+606D # +3-3634 U+631F # +3-3635 U+6559 # +3-3636 U+6A4B # +3-3637 U+6CC1 # +3-3638 U+72C2 # +3-3639 U+72ED # +3-363A U+77EF # +3-363B U+80F8 # +3-363C U+8105 # +3-363D U+8208 # +3-363E U+854E # +3-363F U+90F7 # +3-3640 U+93E1 # +3-3641 U+97FF # +3-3642 U+9957 # +3-3643 U+9A5A # +3-3644 U+4EF0 # +3-3645 U+51DD # +3-3646 U+5C2D # +3-3647 U+6681 # +3-3648 U+696D # +3-3649 U+5C40 # +3-364A U+66F2 # +3-364B U+6975 # +3-364C U+7389 # +3-364D U+6850 # +3-364E U+7C81 # +3-364F U+50C5 # +3-3650 U+52E4 # +3-3651 U+5747 # +3-3652 U+5DFE # +3-3653 U+9326 # +3-3654 U+65A4 # +3-3655 U+6B23 # +3-3656 U+6B3D # +3-3657 U+7434 # +3-3658 U+7981 # +3-3659 U+79BD # +3-365A U+7B4B # +3-365B U+7DCA # +3-365C U+82B9 # +3-365D U+83CC # +3-365E U+887F # +3-365F U+895F # +3-3660 U+8B39 # +3-3661 U+8FD1 # +3-3662 U+91D1 # +3-3663 U+541F # +3-3664 U+9280 # +3-3665 U+4E5D # +3-3666 U+5036 # +3-3667 U+53E5 # +3-3668 U+533A # +3-3669 U+72D7 # +3-366A U+7396 # +3-366B U+77E9 # +3-366C U+82E6 # +3-366D U+8EAF # +3-366E U+99C6 # +3-366F U+99C8 # +3-3670 U+99D2 # +3-3671 U+5177 # +3-3672 U+611A # +3-3673 U+865E # +3-3674 U+55B0 # +3-3675 U+7A7A # +3-3676 U+5076 # +3-3677 U+5BD3 # +3-3678 U+9047 # +3-3679 U+9685 # +3-367A U+4E32 # +3-367B U+6ADB # +3-367C U+91E7 # +3-367D U+5C51 # +3-367E U+5C48 # +3-3721 U+6398 # +3-3722 U+7A9F # +3-3723 U+6C93 # +3-3724 U+9774 # +3-3725 U+8F61 # +3-3726 U+7AAA # +3-3727 U+718A # +3-3728 U+9688 # +3-3729 U+7C82 # +3-372A U+6817 # +3-372B U+7E70 # +3-372C U+6851 # +3-372D U+936C # +3-372E U+52F2 # +3-372F U+541B # +3-3730 U+85AB # +3-3731 U+8A13 # +3-3732 U+7FA4 # +3-3733 U+8ECD # +3-3734 U+90E1 # +3-3735 U+5366 # +3-3736 U+8888 # +3-3737 U+7941 # +3-3738 U+4FC2 # +3-3739 U+50BE # +3-373A U+5211 # +3-373B U+5144 # +3-373C U+5553 # +3-373D U+572D # +3-373E U+73EA # +3-373F U+578B # +3-3740 U+5951 # +3-3741 U+5F62 # +3-3742 U+5F84 # +3-3743 U+6075 # +3-3744 U+6176 # +3-3745 U+6167 # +3-3746 U+61A9 # +3-3747 U+63B2 # +3-3748 U+643A # +3-3749 U+656C # +3-374A U+666F # +3-374B U+6842 # +3-374C U+6E13 # +3-374D U+7566 # +3-374E U+7A3D # +3-374F U+7CFB # +3-3750 U+7D4C # +3-3751 U+7D99 # +3-3752 U+7E4B # +3-3753 U+7F6B # +3-3754 U+830E # +3-3755 U+834A # +3-3756 U+86CD # +3-3757 U+8A08 # +3-3758 U+8A63 # +3-3759 U+8B66 # +3-375A U+8EFD # +3-375B U+981A # +3-375C U+9D8F # +3-375D U+82B8 # +3-375E U+8FCE # +3-375F U+9BE8 # +3-3760 U+5287 # +3-3761 U+621F # +3-3762 U+6483 # +3-3763 U+6FC0 # +3-3764 U+9699 # +3-3765 U+6841 # +3-3766 U+5091 # +3-3767 U+6B20 # +3-3768 U+6C7A # +3-3769 U+6F54 # +3-376A U+7A74 # +3-376B U+7D50 # +3-376C U+8840 # +3-376D U+8A23 # +3-376E U+6708 # +3-376F U+4EF6 # +3-3770 U+5039 # +3-3771 U+5026 # +3-3772 U+5065 # +3-3773 U+517C # +3-3774 U+5238 # +3-3775 U+5263 # +3-3776 U+55A7 # +3-3777 U+570F # +3-3778 U+5805 # +3-3779 U+5ACC # +3-377A U+5EFA # +3-377B U+61B2 # +3-377C U+61F8 # +3-377D U+62F3 # +3-377E U+6372 # +3-3821 U+691C # +3-3822 U+6A29 # +3-3823 U+727D # +3-3824 U+72AC # +3-3825 U+732E # +3-3826 U+7814 # +3-3827 U+786F # +3-3828 U+7D79 # +3-3829 U+770C # +3-382A U+80A9 # +3-382B U+898B # +3-382C U+8B19 # +3-382D U+8CE2 # +3-382E U+8ED2 # +3-382F U+9063 # +3-3830 U+9375 # +3-3831 U+967A # +3-3832 U+9855 # +3-3833 U+9A13 # +3-3834 U+9E78 # +3-3835 U+5143 # +3-3836 U+539F # +3-3837 U+53B3 # +3-3838 U+5E7B # +3-3839 U+5F26 # +3-383A U+6E1B # +3-383B U+6E90 # +3-383C U+7384 # +3-383D U+73FE # +3-383E U+7D43 # +3-383F U+8237 # +3-3840 U+8A00 # +3-3841 U+8AFA # +3-3842 U+9650 # +3-3843 U+4E4E # +3-3844 U+500B # +3-3845 U+53E4 # +3-3846 U+547C # +3-3847 U+56FA # +3-3848 U+59D1 # +3-3849 U+5B64 # +3-384A U+5DF1 # +3-384B U+5EAB # +3-384C U+5F27 # +3-384D U+6238 # +3-384E U+6545 # +3-384F U+67AF # +3-3850 U+6E56 # +3-3851 U+72D0 # +3-3852 U+7CCA # +3-3853 U+88B4 # +3-3854 U+80A1 # +3-3855 U+80E1 # +3-3856 U+83F0 # +3-3857 U+864E # +3-3858 U+8A87 # +3-3859 U+8DE8 # +3-385A U+9237 # +3-385B U+96C7 # +3-385C U+9867 # +3-385D U+9F13 # +3-385E U+4E94 # +3-385F U+4E92 # +3-3860 U+4F0D # +3-3861 U+5348 # +3-3862 U+5449 # +3-3863 U+543E # +3-3864 U+5A2F # +3-3865 U+5F8C # +3-3866 U+5FA1 # +3-3867 U+609F # +3-3868 U+68A7 # +3-3869 U+6A8E # +3-386A U+745A # +3-386B U+7881 # +3-386C U+8A9E # +3-386D U+8AA4 # +3-386E U+8B77 # +3-386F U+9190 # +3-3870 U+4E5E # +3-3871 U+9BC9 # +3-3872 U+4EA4 # +3-3873 U+4F7C # +3-3874 U+4FAF # +3-3875 U+5019 # +3-3876 U+5016 # +3-3877 U+5149 # +3-3878 U+516C # +3-3879 U+529F # +3-387A U+52B9 # +3-387B U+52FE # +3-387C U+539A # +3-387D U+53E3 # +3-387E U+5411 # +3-3921 U+540E # +3-3922 U+5589 # +3-3923 U+5751 # +3-3924 U+57A2 # +3-3925 U+597D # +3-3926 U+5B54 # +3-3927 U+5B5D # +3-3928 U+5B8F # +3-3929 U+5DE5 # +3-392A U+5DE7 # +3-392B U+5DF7 # +3-392C U+5E78 # +3-392D U+5E83 # +3-392E U+5E9A # +3-392F U+5EB7 # +3-3930 U+5F18 # +3-3931 U+6052 # +3-3932 U+614C # +3-3933 U+6297 # +3-3934 U+62D8 # +3-3935 U+63A7 # +3-3936 U+653B # +3-3937 U+6602 # +3-3938 U+6643 # +3-3939 U+66F4 # +3-393A U+676D # +3-393B U+6821 # +3-393C U+6897 # +3-393D U+69CB # +3-393E U+6C5F # +3-393F U+6D2A # +3-3940 U+6D69 # +3-3941 U+6E2F # +3-3942 U+6E9D # +3-3943 U+7532 # +3-3944 U+7687 # +3-3945 U+786C # +3-3946 U+7A3F # +3-3947 U+7CE0 # +3-3948 U+7D05 # +3-3949 U+7D18 # +3-394A U+7D5E # +3-394B U+7DB1 # +3-394C U+8015 # +3-394D U+8003 # +3-394E U+80AF # +3-394F U+80B1 # +3-3950 U+8154 # +3-3951 U+818F # +3-3952 U+822A # +3-3953 U+8352 # +3-3954 U+884C # +3-3955 U+8861 # +3-3956 U+8B1B # +3-3957 U+8CA2 # +3-3958 U+8CFC # +3-3959 U+90CA # +3-395A U+9175 # +3-395B U+9271 # +3-395C U+783F # +3-395D U+92FC # +3-395E U+95A4 # +3-395F U+964D # +3-3960 U+9805 # +3-3961 U+9999 # +3-3962 U+9AD8 # +3-3963 U+9D3B # +3-3964 U+525B # +3-3965 U+52AB # +3-3966 U+53F7 # +3-3967 U+5408 # +3-3968 U+58D5 # +3-3969 U+62F7 # +3-396A U+6FE0 # +3-396B U+8C6A # +3-396C U+8F5F # +3-396D U+9EB9 # +3-396E U+514B # +3-396F U+523B # +3-3970 U+544A # +3-3971 U+56FD # +3-3972 U+7A40 # +3-3973 U+9177 # +3-3974 U+9D60 # +3-3975 U+9ED2 # +3-3976 U+7344 # +3-3977 U+6F09 # +3-3978 U+8170 # +3-3979 U+7511 # +3-397A U+5FFD # +3-397B U+60DA # +3-397C U+9AA8 # +3-397D U+72DB # +3-397E U+8FBC # +3-3A21 U+6B64 # +3-3A22 U+9803 # +3-3A23 U+4ECA # +3-3A24 U+56F0 # +3-3A25 U+5764 # +3-3A26 U+58BE # +3-3A27 U+5A5A # +3-3A28 U+6068 # +3-3A29 U+61C7 # +3-3A2A U+660F # +3-3A2B U+6606 # +3-3A2C U+6839 # +3-3A2D U+68B1 # +3-3A2E U+6DF7 # +3-3A2F U+75D5 # +3-3A30 U+7D3A # +3-3A31 U+826E # +3-3A32 U+9B42 # +3-3A33 U+4E9B # +3-3A34 U+4F50 # +3-3A35 U+53C9 # +3-3A36 U+5506 # +3-3A37 U+5D6F # +3-3A38 U+5DE6 # +3-3A39 U+5DEE # +3-3A3A U+67FB # +3-3A3B U+6C99 # +3-3A3C U+7473 # +3-3A3D U+7802 # +3-3A3E U+8A50 # +3-3A3F U+9396 # +3-3A40 U+88DF # +3-3A41 U+5750 # +3-3A42 U+5EA7 # +3-3A43 U+632B # +3-3A44 U+50B5 # +3-3A45 U+50AC # +3-3A46 U+518D # +3-3A47 U+6700 # +3-3A48 U+54C9 # +3-3A49 U+585E # +3-3A4A U+59BB # +3-3A4B U+5BB0 # +3-3A4C U+5F69 # +3-3A4D U+624D # +3-3A4E U+63A1 # +3-3A4F U+683D # +3-3A50 U+6B73 # +3-3A51 U+6E08 # +3-3A52 U+707D # +3-3A53 U+91C7 # +3-3A54 U+7280 # +3-3A55 U+7815 # +3-3A56 U+7826 # +3-3A57 U+796D # +3-3A58 U+658E # +3-3A59 U+7D30 # +3-3A5A U+83DC # +3-3A5B U+88C1 # +3-3A5C U+8F09 # +3-3A5D U+969B # +3-3A5E U+5264 # +3-3A5F U+5728 # +3-3A60 U+6750 # +3-3A61 U+7F6A # +3-3A62 U+8CA1 # +3-3A63 U+51B4 # +3-3A64 U+5742 # +3-3A65 U+962A # +3-3A66 U+583A # +3-3A67 U+698A # +3-3A68 U+80B4 # +3-3A69 U+54B2 # +3-3A6A U+5D0E # +3-3A6B U+57FC # +3-3A6C U+7895 # +3-3A6D U+9DFA # +3-3A6E U+4F5C # +3-3A6F U+524A # +3-3A70 U+548B # +3-3A71 U+643E # +3-3A72 U+6628 # +3-3A73 U+6714 # +3-3A74 U+67F5 # +3-3A75 U+7A84 # +3-3A76 U+7B56 # +3-3A77 U+7D22 # +3-3A78 U+932F # +3-3A79 U+685C # +3-3A7A U+9BAD # +3-3A7B U+7B39 # +3-3A7C U+5319 # +3-3A7D U+518A # +3-3A7E U+5237 # +3-3B21 U+5BDF # +3-3B22 U+62F6 # +3-3B23 U+64AE # +3-3B24 U+64E6 # +3-3B25 U+672D # +3-3B26 U+6BBA # +3-3B27 U+85A9 # +3-3B28 U+96D1 # +3-3B29 U+7690 # +3-3B2A U+9BD6 # +3-3B2B U+634C # +3-3B2C U+9306 # +3-3B2D U+9BAB # +3-3B2E U+76BF # +3-3B2F U+6652 # +3-3B30 U+4E09 # +3-3B31 U+5098 # +3-3B32 U+53C2 # +3-3B33 U+5C71 # +3-3B34 U+60E8 # +3-3B35 U+6492 # +3-3B36 U+6563 # +3-3B37 U+685F # +3-3B38 U+71E6 # +3-3B39 U+73CA # +3-3B3A U+7523 # +3-3B3B U+7B97 # +3-3B3C U+7E82 # +3-3B3D U+8695 # +3-3B3E U+8B83 # +3-3B3F U+8CDB # +3-3B40 U+9178 # +3-3B41 U+9910 # +3-3B42 U+65AC # +3-3B43 U+66AB # +3-3B44 U+6B8B # +3-3B45 U+4ED5 # +3-3B46 U+4ED4 # +3-3B47 U+4F3A # +3-3B48 U+4F7F # +3-3B49 U+523A # +3-3B4A U+53F8 # +3-3B4B U+53F2 # +3-3B4C U+55E3 # +3-3B4D U+56DB # +3-3B4E U+58EB # +3-3B4F U+59CB # +3-3B50 U+59C9 # +3-3B51 U+59FF # +3-3B52 U+5B50 # +3-3B53 U+5C4D # +3-3B54 U+5E02 # +3-3B55 U+5E2B # +3-3B56 U+5FD7 # +3-3B57 U+601D # +3-3B58 U+6307 # +3-3B59 U+652F # +3-3B5A U+5B5C # +3-3B5B U+65AF # +3-3B5C U+65BD # +3-3B5D U+65E8 # +3-3B5E U+679D # +3-3B5F U+6B62 # +3-3B60 U+6B7B # +3-3B61 U+6C0F # +3-3B62 U+7345 # +3-3B63 U+7949 # +3-3B64 U+79C1 # +3-3B65 U+7CF8 # +3-3B66 U+7D19 # +3-3B67 U+7D2B # +3-3B68 U+80A2 # +3-3B69 U+8102 # +3-3B6A U+81F3 # +3-3B6B U+8996 # +3-3B6C U+8A5E # +3-3B6D U+8A69 # +3-3B6E U+8A66 # +3-3B6F U+8A8C # +3-3B70 U+8AEE # +3-3B71 U+8CC7 # +3-3B72 U+8CDC # +3-3B73 U+96CC # +3-3B74 U+98FC # +3-3B75 U+6B6F # +3-3B76 U+4E8B # +3-3B77 U+4F3C # +3-3B78 U+4F8D # +3-3B79 U+5150 # +3-3B7A U+5B57 # +3-3B7B U+5BFA # +3-3B7C U+6148 # +3-3B7D U+6301 # +3-3B7E U+6642 # +3-3C21 U+6B21 # +3-3C22 U+6ECB # +3-3C23 U+6CBB # +3-3C24 U+723E # +3-3C25 U+74BD # +3-3C26 U+75D4 # +3-3C27 U+78C1 # +3-3C28 U+793A # +3-3C29 U+800C # +3-3C2A U+8033 # +3-3C2B U+81EA # +3-3C2C U+8494 # +3-3C2D U+8F9E # +3-3C2E U+6C50 # +3-3C2F U+9E7F # +3-3C30 U+5F0F # +3-3C31 U+8B58 # +3-3C32 U+9D2B # +3-3C33 U+7AFA # +3-3C34 U+8EF8 # +3-3C35 U+5B8D # +3-3C36 U+96EB # +3-3C37 U+4E03 # +3-3C38 U+53F1 # +3-3C39 U+57F7 # +3-3C3A U+5931 # +3-3C3B U+5AC9 # +3-3C3C U+5BA4 # +3-3C3D U+6089 # +3-3C3E U+6E7F # +3-3C3F U+6F06 # +3-3C40 U+75BE # +3-3C41 U+8CEA # +3-3C42 U+5B9F # +3-3C43 U+8500 # +3-3C44 U+7BE0 # +3-3C45 U+5072 # +3-3C46 U+67F4 # +3-3C47 U+829D # +3-3C48 U+5C61 # +3-3C49 U+854A # +3-3C4A U+7E1E # +3-3C4B U+820E # +3-3C4C U+5199 # +3-3C4D U+5C04 # +3-3C4E U+6368 # +3-3C4F U+8D66 # +3-3C50 U+659C # +3-3C51 U+716E # +3-3C52 U+793E # +3-3C53 U+7D17 # +3-3C54 U+8005 # +3-3C55 U+8B1D # +3-3C56 U+8ECA # +3-3C57 U+906E # +3-3C58 U+86C7 # +3-3C59 U+90AA # +3-3C5A U+501F # +3-3C5B U+52FA # +3-3C5C U+5C3A # +3-3C5D U+6753 # +3-3C5E U+707C # +3-3C5F U+7235 # +3-3C60 U+914C # +3-3C61 U+91C8 # +3-3C62 U+932B # +3-3C63 U+82E5 # +3-3C64 U+5BC2 # +3-3C65 U+5F31 # +3-3C66 U+60F9 # +3-3C67 U+4E3B # +3-3C68 U+53D6 # +3-3C69 U+5B88 # +3-3C6A U+624B # +3-3C6B U+6731 # +3-3C6C U+6B8A # +3-3C6D U+72E9 # +3-3C6E U+73E0 # +3-3C6F U+7A2E # +3-3C70 U+816B # +3-3C71 U+8DA3 # +3-3C72 U+9152 # +3-3C73 U+9996 # +3-3C74 U+5112 # +3-3C75 U+53D7 # +3-3C76 U+546A # +3-3C77 U+5BFF # +3-3C78 U+6388 # +3-3C79 U+6A39 # +3-3C7A U+7DAC # +3-3C7B U+9700 # +3-3C7C U+56DA # +3-3C7D U+53CE # +3-3C7E U+5468 # +3-3D21 U+5B97 # +3-3D22 U+5C31 # +3-3D23 U+5DDE # +3-3D24 U+4FEE # +3-3D25 U+6101 # +3-3D26 U+62FE # +3-3D27 U+6D32 # +3-3D28 U+79C0 # +3-3D29 U+79CB # +3-3D2A U+7D42 # +3-3D2B U+7E4D # +3-3D2C U+7FD2 # +3-3D2D U+81ED # +3-3D2E U+821F # +3-3D2F U+8490 # +3-3D30 U+8846 # +3-3D31 U+8972 # +3-3D32 U+8B90 # +3-3D33 U+8E74 # +3-3D34 U+8F2F # +3-3D35 U+9031 # +3-3D36 U+914B # +3-3D37 U+916C # +3-3D38 U+96C6 # +3-3D39 U+919C # +3-3D3A U+4EC0 # +3-3D3B U+4F4F # +3-3D3C U+5145 # +3-3D3D U+5341 # +3-3D3E U+5F93 # +3-3D3F U+620E # +3-3D40 U+67D4 # +3-3D41 U+6C41 # +3-3D42 U+6E0B # +3-3D43 U+7363 # +3-3D44 U+7E26 # +3-3D45 U+91CD # +3-3D46 U+9283 # +3-3D47 U+53D4 # +3-3D48 U+5919 # +3-3D49 U+5BBF # +3-3D4A U+6DD1 # +3-3D4B U+795D # +3-3D4C U+7E2E # +3-3D4D U+7C9B # +3-3D4E U+587E # +3-3D4F U+719F # +3-3D50 U+51FA # +3-3D51 U+8853 # +3-3D52 U+8FF0 # +3-3D53 U+4FCA # +3-3D54 U+5CFB # +3-3D55 U+6625 # +3-3D56 U+77AC # +3-3D57 U+7AE3 # +3-3D58 U+821C # +3-3D59 U+99FF # +3-3D5A U+51C6 # +3-3D5B U+5FAA # +3-3D5C U+65EC # +3-3D5D U+696F # +3-3D5E U+6B89 # +3-3D5F U+6DF3 # +3-3D60 U+6E96 # +3-3D61 U+6F64 # +3-3D62 U+76FE # +3-3D63 U+7D14 # +3-3D64 U+5DE1 # +3-3D65 U+9075 # +3-3D66 U+9187 # +3-3D67 U+9806 # +3-3D68 U+51E6 # +3-3D69 U+521D # +3-3D6A U+6240 # +3-3D6B U+6691 # +3-3D6C U+66D9 # +3-3D6D U+6E1A # +3-3D6E U+5EB6 # +3-3D6F U+7DD2 # +3-3D70 U+7F72 # +3-3D71 U+66F8 # +3-3D72 U+85AF # +3-3D73 U+85F7 # +3-3D74 U+8AF8 # +3-3D75 U+52A9 # +3-3D76 U+53D9 # +3-3D77 U+5973 # +3-3D78 U+5E8F # +3-3D79 U+5F90 # +3-3D7A U+6055 # +3-3D7B U+92E4 # +3-3D7C U+9664 # +3-3D7D U+50B7 # +3-3D7E U+511F # +3-3E21 U+52DD # +3-3E22 U+5320 # +3-3E23 U+5347 # +3-3E24 U+53EC # +3-3E25 U+54E8 # +3-3E26 U+5546 # +3-3E27 U+5531 # +3-3E28 U+5617 # +3-3E29 U+5968 # +3-3E2A U+59BE # +3-3E2B U+5A3C # +3-3E2C U+5BB5 # +3-3E2D U+5C06 # +3-3E2E U+5C0F # +3-3E2F U+5C11 # +3-3E30 U+5C1A # +3-3E31 U+5E84 # +3-3E32 U+5E8A # +3-3E33 U+5EE0 # +3-3E34 U+5F70 # +3-3E35 U+627F # +3-3E36 U+6284 # +3-3E37 U+62DB # +3-3E38 U+638C # +3-3E39 U+6377 # +3-3E3A U+6607 # +3-3E3B U+660C # +3-3E3C U+662D # +3-3E3D U+6676 # +3-3E3E U+677E # +3-3E3F U+68A2 # +3-3E40 U+6A1F # +3-3E41 U+6A35 # +3-3E42 U+6CBC # +3-3E43 U+6D88 # +3-3E44 U+6E09 # +3-3E45 U+6E58 # +3-3E46 U+713C # +3-3E47 U+7126 # +3-3E48 U+7167 # +3-3E49 U+75C7 # +3-3E4A U+7701 # +3-3E4B U+785D # +3-3E4C U+7901 # +3-3E4D U+7965 # +3-3E4E U+79F0 # +3-3E4F U+7AE0 # +3-3E50 U+7B11 # +3-3E51 U+7CA7 # +3-3E52 U+7D39 # +3-3E53 U+8096 # +3-3E54 U+83D6 # +3-3E55 U+848B # +3-3E56 U+8549 # +3-3E57 U+885D # +3-3E58 U+88F3 # +3-3E59 U+8A1F # +3-3E5A U+8A3C # +3-3E5B U+8A54 # +3-3E5C U+8A73 # +3-3E5D U+8C61 # +3-3E5E U+8CDE # +3-3E5F U+91A4 # +3-3E60 U+9266 # +3-3E61 U+937E # +3-3E62 U+9418 # +3-3E63 U+969C # +3-3E64 U+9798 # +3-3E65 U+4E0A # +3-3E66 U+4E08 # +3-3E67 U+4E1E # +3-3E68 U+4E57 # +3-3E69 U+5197 # +3-3E6A U+5270 # +3-3E6B U+57CE # +3-3E6C U+5834 # +3-3E6D U+58CC # +3-3E6E U+5B22 # +3-3E6F U+5E38 # +3-3E70 U+60C5 # +3-3E71 U+64FE # +3-3E72 U+6761 # +3-3E73 U+6756 # +3-3E74 U+6D44 # +3-3E75 U+72B6 # +3-3E76 U+7573 # +3-3E77 U+7A63 # +3-3E78 U+84B8 # +3-3E79 U+8B72 # +3-3E7A U+91B8 # +3-3E7B U+9320 # +3-3E7C U+5631 # +3-3E7D U+57F4 # +3-3E7E U+98FE # +3-3F21 U+62ED # +3-3F22 U+690D # +3-3F23 U+6B96 # +3-3F24 U+71ED # +3-3F25 U+7E54 # +3-3F26 U+8077 # +3-3F27 U+8272 # +3-3F28 U+89E6 # +3-3F29 U+98DF # +3-3F2A U+8755 # +3-3F2B U+8FB1 # +3-3F2C U+5C3B # +3-3F2D U+4F38 # +3-3F2E U+4FE1 # +3-3F2F U+4FB5 # +3-3F30 U+5507 # +3-3F31 U+5A20 # +3-3F32 U+5BDD # +3-3F33 U+5BE9 # +3-3F34 U+5FC3 # +3-3F35 U+614E # +3-3F36 U+632F # +3-3F37 U+65B0 # +3-3F38 U+664B # +3-3F39 U+68EE # +3-3F3A U+699B # +3-3F3B U+6D78 # +3-3F3C U+6DF1 # +3-3F3D U+7533 # +3-3F3E U+75B9 # +3-3F3F U+771F # +3-3F40 U+795E # +3-3F41 U+79E6 # +3-3F42 U+7D33 # +3-3F43 U+81E3 # +3-3F44 U+82AF # +3-3F45 U+85AA # +3-3F46 U+89AA # +3-3F47 U+8A3A # +3-3F48 U+8EAB # +3-3F49 U+8F9B # +3-3F4A U+9032 # +3-3F4B U+91DD # +3-3F4C U+9707 # +3-3F4D U+4EBA # +3-3F4E U+4EC1 # +3-3F4F U+5203 # +3-3F50 U+5875 # +3-3F51 U+58EC # +3-3F52 U+5C0B # +3-3F53 U+751A # +3-3F54 U+5C3D # +3-3F55 U+814E # +3-3F56 U+8A0A # +3-3F57 U+8FC5 # +3-3F58 U+9663 # +3-3F59 U+976D # +3-3F5A U+7B25 # +3-3F5B U+8ACF # +3-3F5C U+9808 # +3-3F5D U+9162 # +3-3F5E U+56F3 # +3-3F5F U+53A8 # +3-3F60 U+9017 # +3-3F61 U+5439 # +3-3F62 U+5782 # +3-3F63 U+5E25 # +3-3F64 U+63A8 # +3-3F65 U+6C34 # +3-3F66 U+708A # +3-3F67 U+7761 # +3-3F68 U+7C8B # +3-3F69 U+7FE0 # +3-3F6A U+8870 # +3-3F6B U+9042 # +3-3F6C U+9154 # +3-3F6D U+9310 # +3-3F6E U+9318 # +3-3F6F U+968F # +3-3F70 U+745E # +3-3F71 U+9AC4 # +3-3F72 U+5D07 # +3-3F73 U+5D69 # +3-3F74 U+6570 # +3-3F75 U+67A2 # +3-3F76 U+8DA8 # +3-3F77 U+96DB # +3-3F78 U+636E # +3-3F79 U+6749 # +3-3F7A U+6919 # +3-3F7B U+83C5 # +3-3F7C U+9817 # +3-3F7D U+96C0 # +3-3F7E U+88FE # +3-4021 U+6F84 # +3-4022 U+647A # +3-4023 U+5BF8 # +3-4024 U+4E16 # +3-4025 U+702C # +3-4026 U+755D # +3-4027 U+662F # +3-4028 U+51C4 # +3-4029 U+5236 # +3-402A U+52E2 # +3-402B U+59D3 # +3-402C U+5F81 # +3-402D U+6027 # +3-402E U+6210 # +3-402F U+653F # +3-4030 U+6574 # +3-4031 U+661F # +3-4032 U+6674 # +3-4033 U+68F2 # +3-4034 U+6816 # +3-4035 U+6B63 # +3-4036 U+6E05 # +3-4037 U+7272 # +3-4038 U+751F # +3-4039 U+76DB # +3-403A U+7CBE # +3-403B U+8056 # +3-403C U+58F0 # +3-403D U+88FD # +3-403E U+897F # +3-403F U+8AA0 # +3-4040 U+8A93 # +3-4041 U+8ACB # +3-4042 U+901D # +3-4043 U+9192 # +3-4044 U+9752 # +3-4045 U+9759 # +3-4046 U+6589 # +3-4047 U+7A0E # +3-4048 U+8106 # +3-4049 U+96BB # +3-404A U+5E2D # +3-404B U+60DC # +3-404C U+621A # +3-404D U+65A5 # +3-404E U+6614 # +3-404F U+6790 # +3-4050 U+77F3 # +3-4051 U+7A4D # +3-4052 U+7C4D # +3-4053 U+7E3E # +3-4054 U+810A # +3-4055 U+8CAC # +3-4056 U+8D64 # +3-4057 U+8DE1 # +3-4058 U+8E5F # +3-4059 U+78A9 # +3-405A U+5207 # +3-405B U+62D9 # +3-405C U+63A5 # +3-405D U+6442 # +3-405E U+6298 # +3-405F U+8A2D # +3-4060 U+7A83 # +3-4061 U+7BC0 # +3-4062 U+8AAC # +3-4063 U+96EA # +3-4064 U+7D76 # +3-4065 U+820C # +3-4066 U+8749 # +3-4067 U+4ED9 # +3-4068 U+5148 # +3-4069 U+5343 # +3-406A U+5360 # +3-406B U+5BA3 # +3-406C U+5C02 # +3-406D U+5C16 # +3-406E U+5DDD # +3-406F U+6226 # +3-4070 U+6247 # +3-4071 U+64B0 # +3-4072 U+6813 # +3-4073 U+6834 # +3-4074 U+6CC9 # +3-4075 U+6D45 # +3-4076 U+6D17 # +3-4077 U+67D3 # +3-4078 U+6F5C # +3-4079 U+714E # +3-407A U+717D # +3-407B U+65CB # +3-407C U+7A7F # +3-407D U+7BAD # +3-407E U+7DDA # +3-4121 U+7E4A # +3-4122 U+7FA8 # +3-4123 U+817A # +3-4124 U+821B # +3-4125 U+8239 # +3-4126 U+85A6 # +3-4127 U+8A6E # +3-4128 U+8CCE # +3-4129 U+8DF5 # +3-412A U+9078 # +3-412B U+9077 # +3-412C U+92AD # +3-412D U+9291 # +3-412E U+9583 # +3-412F U+9BAE # +3-4130 U+524D # +3-4131 U+5584 # +3-4132 U+6F38 # +3-4133 U+7136 # +3-4134 U+5168 # +3-4135 U+7985 # +3-4136 U+7E55 # +3-4137 U+81B3 # +3-4138 U+7CCE # +3-4139 U+564C # +3-413A U+5851 # +3-413B U+5CA8 # +3-413C U+63AA # +3-413D U+66FE # +3-413E U+66FD # +3-413F U+695A # +3-4140 U+72D9 # +3-4141 U+758F # +3-4142 U+758E # +3-4143 U+790E # +3-4144 U+7956 # +3-4145 U+79DF # +3-4146 U+7C97 # +3-4147 U+7D20 # +3-4148 U+7D44 # +3-4149 U+8607 # +3-414A U+8A34 # +3-414B U+963B # +3-414C U+9061 # +3-414D U+9F20 # +3-414E U+50E7 # +3-414F U+5275 # +3-4150 U+53CC # +3-4151 U+53E2 # +3-4152 U+5009 # +3-4153 U+55AA # +3-4154 U+58EE # +3-4155 U+594F # +3-4156 U+723D # +3-4157 U+5B8B # +3-4158 U+5C64 # +3-4159 U+531D # +3-415A U+60E3 # +3-415B U+60F3 # +3-415C U+635C # +3-415D U+6383 # +3-415E U+633F # +3-415F U+63BB # +3-4160 U+64CD # +3-4161 U+65E9 # +3-4162 U+66F9 # +3-4163 U+5DE3 # +3-4164 U+69CD # +3-4165 U+69FD # +3-4166 U+6F15 # +3-4167 U+71E5 # +3-4168 U+4E89 # +3-4169 U+75E9 # +3-416A U+76F8 # +3-416B U+7A93 # +3-416C U+7CDF # +3-416D U+7DCF # +3-416E U+7D9C # +3-416F U+8061 # +3-4170 U+8349 # +3-4171 U+8358 # +3-4172 U+846C # +3-4173 U+84BC # +3-4174 U+85FB # +3-4175 U+88C5 # +3-4176 U+8D70 # +3-4177 U+9001 # +3-4178 U+906D # +3-4179 U+9397 # +3-417A U+971C # +3-417B U+9A12 # +3-417C U+50CF # +3-417D U+5897 # +3-417E U+618E # +3-4221 U+81D3 # +3-4222 U+8535 # +3-4223 U+8D08 # +3-4224 U+9020 # +3-4225 U+4FC3 # +3-4226 U+5074 # +3-4227 U+5247 # +3-4228 U+5373 # +3-4229 U+606F # +3-422A U+6349 # +3-422B U+675F # +3-422C U+6E2C # +3-422D U+8DB3 # +3-422E U+901F # +3-422F U+4FD7 # +3-4230 U+5C5E # +3-4231 U+8CCA # +3-4232 U+65CF # +3-4233 U+7D9A # +3-4234 U+5352 # +3-4235 U+8896 # +3-4236 U+5176 # +3-4237 U+63C3 # +3-4238 U+5B58 # +3-4239 U+5B6B # +3-423A U+5C0A # +3-423B U+640D # +3-423C U+6751 # +3-423D U+905C # +3-423E U+4ED6 # +3-423F U+591A # +3-4240 U+592A # +3-4241 U+6C70 # +3-4242 U+8A51 # +3-4243 U+553E # +3-4244 U+5815 # +3-4245 U+59A5 # +3-4246 U+60F0 # +3-4247 U+6253 # +3-4248 U+67C1 # +3-4249 U+8235 # +3-424A U+6955 # +3-424B U+9640 # +3-424C U+99C4 # +3-424D U+9A28 # +3-424E U+4F53 # +3-424F U+5806 # +3-4250 U+5BFE # +3-4251 U+8010 # +3-4252 U+5CB1 # +3-4253 U+5E2F # +3-4254 U+5F85 # +3-4255 U+6020 # +3-4256 U+614B # +3-4257 U+6234 # +3-4258 U+66FF # +3-4259 U+6CF0 # +3-425A U+6EDE # +3-425B U+80CE # +3-425C U+817F # +3-425D U+82D4 # +3-425E U+888B # +3-425F U+8CB8 # +3-4260 U+9000 # +3-4261 U+902E # +3-4262 U+968A # +3-4263 U+9EDB # +3-4264 U+9BDB # +3-4265 U+4EE3 # +3-4266 U+53F0 # +3-4267 U+5927 # +3-4268 U+7B2C # +3-4269 U+918D # +3-426A U+984C # +3-426B U+9DF9 # +3-426C U+6EDD # +3-426D U+7027 # +3-426E U+5353 # +3-426F U+5544 # +3-4270 U+5B85 # +3-4271 U+6258 # +3-4272 U+629E # +3-4273 U+62D3 # +3-4274 U+6CA2 # +3-4275 U+6FEF # +3-4276 U+7422 # +3-4277 U+8A17 # +3-4278 U+9438 # +3-4279 U+6FC1 # +3-427A U+8AFE # +3-427B U+8338 # +3-427C U+51E7 # +3-427D U+86F8 # +3-427E U+53EA # +3-4321 U+53E9 # +3-4322 U+4F46 # +3-4323 U+9054 # +3-4324 U+8FB0 # +3-4325 U+596A # +3-4326 U+8131 # +3-4327 U+5DFD # +3-4328 U+7AEA # +3-4329 U+8FBF # +3-432A U+68DA # +3-432B U+8C37 # +3-432C U+72F8 # +3-432D U+9C48 # +3-432E U+6A3D # +3-432F U+8AB0 # +3-4330 U+4E39 # +3-4331 U+5358 # +3-4332 U+5606 # +3-4333 U+5766 # +3-4334 U+62C5 # +3-4335 U+63A2 # +3-4336 U+65E6 # +3-4337 U+6B4E # +3-4338 U+6DE1 # +3-4339 U+6E5B # +3-433A U+70AD # +3-433B U+77ED # +3-433C U+7AEF # +3-433D U+7BAA # +3-433E U+7DBB # +3-433F U+803D # +3-4340 U+80C6 # +3-4341 U+86CB # +3-4342 U+8A95 # +3-4343 U+935B # +3-4344 U+56E3 # +3-4345 U+58C7 # +3-4346 U+5F3E # +3-4347 U+65AD # +3-4348 U+6696 # +3-4349 U+6A80 # +3-434A U+6BB5 # +3-434B U+7537 # +3-434C U+8AC7 # +3-434D U+5024 # +3-434E U+77E5 # +3-434F U+5730 # +3-4350 U+5F1B # +3-4351 U+6065 # +3-4352 U+667A # +3-4353 U+6C60 # +3-4354 U+75F4 # +3-4355 U+7A1A # +3-4356 U+7F6E # +3-4357 U+81F4 # +3-4358 U+8718 # +3-4359 U+9045 # +3-435A U+99B3 # +3-435B U+7BC9 # +3-435C U+755C # +3-435D U+7AF9 # +3-435E U+7B51 # +3-435F U+84C4 # +3-4360 U+9010 # +3-4361 U+79E9 # +3-4362 U+7A92 # +3-4363 U+8336 # +3-4364 U+5AE1 # +3-4365 U+7740 # +3-4366 U+4E2D # +3-4367 U+4EF2 # +3-4368 U+5B99 # +3-4369 U+5FE0 # +3-436A U+62BD # +3-436B U+663C # +3-436C U+67F1 # +3-436D U+6CE8 # +3-436E U+866B # +3-436F U+8877 # +3-4370 U+8A3B # +3-4371 U+914E # +3-4372 U+92F3 # +3-4373 U+99D0 # +3-4374 U+6A17 # +3-4375 U+7026 # +3-4376 U+732A # +3-4377 U+82E7 # +3-4378 U+8457 # +3-4379 U+8CAF # +3-437A U+4E01 # +3-437B U+5146 # +3-437C U+51CB # +3-437D U+558B # +3-437E U+5BF5 # +3-4421 U+5E16 # +3-4422 U+5E33 # +3-4423 U+5E81 # +3-4424 U+5F14 # +3-4425 U+5F35 # +3-4426 U+5F6B # +3-4427 U+5FB4 # +3-4428 U+61F2 # +3-4429 U+6311 # +3-442A U+66A2 # +3-442B U+671D # +3-442C U+6F6E # +3-442D U+7252 # +3-442E U+753A # +3-442F U+773A # +3-4430 U+8074 # +3-4431 U+8139 # +3-4432 U+8178 # +3-4433 U+8776 # +3-4434 U+8ABF # +3-4435 U+8ADC # +3-4436 U+8D85 # +3-4437 U+8DF3 # +3-4438 U+929A # +3-4439 U+9577 # +3-443A U+9802 # +3-443B U+9CE5 # +3-443C U+52C5 # +3-443D U+6357 # +3-443E U+76F4 # +3-443F U+6715 # +3-4440 U+6C88 # +3-4441 U+73CD # +3-4442 U+8CC3 # +3-4443 U+93AE # +3-4444 U+9673 # +3-4445 U+6D25 # +3-4446 U+589C # +3-4447 U+690E # +3-4448 U+69CC # +3-4449 U+8FFD # +3-444A U+939A # +3-444B U+75DB # +3-444C U+901A # +3-444D U+585A # +3-444E U+6802 # +3-444F U+63B4 # +3-4450 U+69FB # +3-4451 U+4F43 # +3-4452 U+6F2C # +3-4453 U+67D8 # +3-4454 U+8FBB # +3-4455 U+8526 # +3-4456 U+7DB4 # +3-4457 U+9354 # +3-4458 U+693F # +3-4459 U+6F70 # +3-445A U+576A # +3-445B U+58F7 # +3-445C U+5B2C # +3-445D U+7D2C # +3-445E U+722A # +3-445F U+540A # +3-4460 U+91E3 # +3-4461 U+9DB4 # +3-4462 U+4EAD # +3-4463 U+4F4E # +3-4464 U+505C # +3-4465 U+5075 # +3-4466 U+5243 # +3-4467 U+8C9E # +3-4468 U+5448 # +3-4469 U+5824 # +3-446A U+5B9A # +3-446B U+5E1D # +3-446C U+5E95 # +3-446D U+5EAD # +3-446E U+5EF7 # +3-446F U+5F1F # +3-4470 U+608C # +3-4471 U+62B5 # +3-4472 U+633A # +3-4473 U+63D0 # +3-4474 U+68AF # +3-4475 U+6C40 # +3-4476 U+7887 # +3-4477 U+798E # +3-4478 U+7A0B # +3-4479 U+7DE0 # +3-447A U+8247 # +3-447B U+8A02 # +3-447C U+8AE6 # +3-447D U+8E44 # +3-447E U+9013 # +3-4521 U+90B8 # +3-4522 U+912D # +3-4523 U+91D8 # +3-4524 U+9F0E # +3-4525 U+6CE5 # +3-4526 U+6458 # +3-4527 U+64E2 # +3-4528 U+6575 # +3-4529 U+6EF4 # +3-452A U+7684 # +3-452B U+7B1B # +3-452C U+9069 # +3-452D U+93D1 # +3-452E U+6EBA # +3-452F U+54F2 # +3-4530 U+5FB9 # +3-4531 U+64A4 # +3-4532 U+8F4D # +3-4533 U+8FED # +3-4534 U+9244 # +3-4535 U+5178 # +3-4536 U+586B # +3-4537 U+5929 # +3-4538 U+5C55 # +3-4539 U+5E97 # +3-453A U+6DFB # +3-453B U+7E8F # +3-453C U+751C # +3-453D U+8CBC # +3-453E U+8EE2 # +3-453F U+985B # +3-4540 U+70B9 # +3-4541 U+4F1D # +3-4542 U+6BBF # +3-4543 U+6FB1 # +3-4544 U+7530 # +3-4545 U+96FB # +3-4546 U+514E # +3-4547 U+5410 # +3-4548 U+5835 # +3-4549 U+5857 # +3-454A U+59AC # +3-454B U+5C60 # +3-454C U+5F92 # +3-454D U+6597 # +3-454E U+675C # +3-454F U+6E21 # +3-4550 U+767B # +3-4551 U+83DF # +3-4552 U+8CED # +3-4553 U+9014 # +3-4554 U+90FD # +3-4555 U+934D # +3-4556 U+7825 # +3-4557 U+783A # +3-4558 U+52AA # +3-4559 U+5EA6 # +3-455A U+571F # +3-455B U+5974 # +3-455C U+6012 # +3-455D U+5012 # +3-455E U+515A # +3-455F U+51AC # +3-4560 U+51CD # +3-4561 U+5200 # +3-4562 U+5510 # +3-4563 U+5854 # +3-4564 U+5858 # +3-4565 U+5957 # +3-4566 U+5B95 # +3-4567 U+5CF6 # +3-4568 U+5D8B # +3-4569 U+60BC # +3-456A U+6295 # +3-456B U+642D # +3-456C U+6771 # +3-456D U+6843 # +3-456E U+68BC # +3-456F U+68DF # +3-4570 U+76D7 # +3-4571 U+6DD8 # +3-4572 U+6E6F # +3-4573 U+6D9B # +3-4574 U+706F # +3-4575 U+71C8 # +3-4576 U+5F53 # +3-4577 U+75D8 # +3-4578 U+7977 # +3-4579 U+7B49 # +3-457A U+7B54 # +3-457B U+7B52 # +3-457C U+7CD6 # +3-457D U+7D71 # +3-457E U+5230 # +3-4621 U+8463 # +3-4622 U+8569 # +3-4623 U+85E4 # +3-4624 U+8A0E # +3-4625 U+8B04 # +3-4626 U+8C46 # +3-4627 U+8E0F # +3-4628 U+9003 # +3-4629 U+900F # +3-462A U+9419 # +3-462B U+9676 # +3-462C U+982D # +3-462D U+9A30 # +3-462E U+95D8 # +3-462F U+50CD # +3-4630 U+52D5 # +3-4631 U+540C # +3-4632 U+5802 # +3-4633 U+5C0E # +3-4634 U+61A7 # +3-4635 U+649E # +3-4636 U+6D1E # +3-4637 U+77B3 # +3-4638 U+7AE5 # +3-4639 U+80F4 # +3-463A U+8404 # +3-463B U+9053 # +3-463C U+9285 # +3-463D U+5CE0 # +3-463E U+9D07 # +3-463F U+533F # +3-4640 U+5F97 # +3-4641 U+5FB3 # +3-4642 U+6D9C # +3-4643 U+7279 # +3-4644 U+7763 # +3-4645 U+79BF # +3-4646 U+7BE4 # +3-4647 U+6BD2 # +3-4648 U+72EC # +3-4649 U+8AAD # +3-464A U+6803 # +3-464B U+6A61 # +3-464C U+51F8 # +3-464D U+7A81 # +3-464E U+6934 # +3-464F U+5C4A # +3-4650 U+9CF6 # +3-4651 U+82EB # +3-4652 U+5BC5 # +3-4653 U+9149 # +3-4654 U+701E # +3-4655 U+5678 # +3-4656 U+5C6F # +3-4657 U+60C7 # +3-4658 U+6566 # +3-4659 U+6C8C # +3-465A U+8C5A # +3-465B U+9041 # +3-465C U+9813 # +3-465D U+5451 # +3-465E U+66C7 # +3-465F U+920D # +3-4660 U+5948 # +3-4661 U+90A3 # +3-4662 U+5185 # +3-4663 U+4E4D # +3-4664 U+51EA # +3-4665 U+8599 # +3-4666 U+8B0E # +3-4667 U+7058 # +3-4668 U+637A # +3-4669 U+934B # +3-466A U+6962 # +3-466B U+99B4 # +3-466C U+7E04 # +3-466D U+7577 # +3-466E U+5357 # +3-466F U+6960 # +3-4670 U+8EDF # +3-4671 U+96E3 # +3-4672 U+6C5D # +3-4673 U+4E8C # +3-4674 U+5C3C # +3-4675 U+5F10 # +3-4676 U+8FE9 # +3-4677 U+5302 # +3-4678 U+8CD1 # +3-4679 U+8089 # +3-467A U+8679 # +3-467B U+5EFF # +3-467C U+65E5 # +3-467D U+4E73 # +3-467E U+5165 # +3-4721 U+5982 # +3-4722 U+5C3F # +3-4723 U+97EE # +3-4724 U+4EFB # +3-4725 U+598A # +3-4726 U+5FCD # +3-4727 U+8A8D # +3-4728 U+6FE1 # +3-4729 U+79B0 # +3-472A U+7962 # +3-472B U+5BE7 # +3-472C U+8471 # +3-472D U+732B # +3-472E U+71B1 # +3-472F U+5E74 # +3-4730 U+5FF5 # +3-4731 U+637B # +3-4732 U+649A # +3-4733 U+71C3 # +3-4734 U+7C98 # +3-4735 U+4E43 # +3-4736 U+5EFC # +3-4737 U+4E4B # +3-4738 U+57DC # +3-4739 U+56A2 # +3-473A U+60A9 # +3-473B U+6FC3 # +3-473C U+7D0D # +3-473D U+80FD # +3-473E U+8133 # +3-473F U+81BF # +3-4740 U+8FB2 # +3-4741 U+8997 # +3-4742 U+86A4 # +3-4743 U+5DF4 # +3-4744 U+628A # +3-4745 U+64AD # +3-4746 U+8987 # +3-4747 U+6777 # +3-4748 U+6CE2 # +3-4749 U+6D3E # +3-474A U+7436 # +3-474B U+7834 # +3-474C U+5A46 # +3-474D U+7F75 # +3-474E U+82AD # +3-474F U+99AC # +3-4750 U+4FF3 # +3-4751 U+5EC3 # +3-4752 U+62DD # +3-4753 U+6392 # +3-4754 U+6557 # +3-4755 U+676F # +3-4756 U+76C3 # +3-4757 U+724C # +3-4758 U+80CC # +3-4759 U+80BA # +3-475A U+8F29 # +3-475B U+914D # +3-475C U+500D # +3-475D U+57F9 # +3-475E U+5A92 # +3-475F U+6885 # +3-4760 U+6973 # +3-4761 U+7164 # +3-4762 U+72FD # +3-4763 U+8CB7 # +3-4764 U+58F2 # +3-4765 U+8CE0 # +3-4766 U+966A # +3-4767 U+9019 # +3-4768 U+877F # +3-4769 U+79E4 # +3-476A U+77E7 # +3-476B U+8429 # +3-476C U+4F2F # +3-476D U+5265 # +3-476E U+535A # +3-476F U+62CD # +3-4770 U+67CF # +3-4771 U+6CCA # +3-4772 U+767D # +3-4773 U+7B94 # +3-4774 U+7C95 # +3-4775 U+8236 # +3-4776 U+8584 # +3-4777 U+8FEB # +3-4778 U+66DD # +3-4779 U+6F20 # +3-477A U+7206 # +3-477B U+7E1B # +3-477C U+83AB # +3-477D U+99C1 # +3-477E U+9EA6 # +3-4821 U+51FD # +3-4822 U+7BB1 # +3-4823 U+7872 # +3-4824 U+7BB8 # +3-4825 U+8087 # +3-4826 U+7B48 # +3-4827 U+6AE8 # +3-4828 U+5E61 # +3-4829 U+808C # +3-482A U+7551 # +3-482B U+7560 # +3-482C U+516B # +3-482D U+9262 # +3-482E U+6E8C # +3-482F U+767A # +3-4830 U+9197 # +3-4831 U+9AEA # +3-4832 U+4F10 # +3-4833 U+7F70 # +3-4834 U+629C # +3-4835 U+7B4F # +3-4836 U+95A5 # +3-4837 U+9CE9 # +3-4838 U+567A # +3-4839 U+5859 # +3-483A U+86E4 # +3-483B U+96BC # +3-483C U+4F34 # +3-483D U+5224 # +3-483E U+534A # +3-483F U+53CD # +3-4840 U+53DB # +3-4841 U+5E06 # +3-4842 U+642C # +3-4843 U+6591 # +3-4844 U+677F # +3-4845 U+6C3E # +3-4846 U+6C4E # +3-4847 U+7248 # +3-4848 U+72AF # +3-4849 U+73ED # +3-484A U+7554 # +3-484B U+7E41 # +3-484C U+822C # +3-484D U+85E9 # +3-484E U+8CA9 # +3-484F U+7BC4 # +3-4850 U+91C6 # +3-4851 U+7169 # +3-4852 U+9812 # +3-4853 U+98EF # +3-4854 U+633D # +3-4855 U+6669 # +3-4856 U+756A # +3-4857 U+76E4 # +3-4858 U+78D0 # +3-4859 U+8543 # +3-485A U+86EE # +3-485B U+532A # +3-485C U+5351 # +3-485D U+5426 # +3-485E U+5983 # +3-485F U+5E87 # +3-4860 U+5F7C # +3-4861 U+60B2 # +3-4862 U+6249 # +3-4863 U+6279 # +3-4864 U+62AB # +3-4865 U+6590 # +3-4866 U+6BD4 # +3-4867 U+6CCC # +3-4868 U+75B2 # +3-4869 U+76AE # +3-486A U+7891 # +3-486B U+79D8 # +3-486C U+7DCB # +3-486D U+7F77 # +3-486E U+80A5 # +3-486F U+88AB # +3-4870 U+8AB9 # +3-4871 U+8CBB # +3-4872 U+907F # +3-4873 U+975E # +3-4874 U+98DB # +3-4875 U+6A0B # +3-4876 U+7C38 # +3-4877 U+5099 # +3-4878 U+5C3E # +3-4879 U+5FAE # +3-487A U+6787 # +3-487B U+6BD8 # +3-487C U+7435 # +3-487D U+7709 # +3-487E U+7F8E # +3-4921 U+9F3B # +3-4922 U+67CA # +3-4923 U+7A17 # +3-4924 U+5339 # +3-4925 U+758B # +3-4926 U+9AED # +3-4927 U+5F66 # +3-4928 U+819D # +3-4929 U+83F1 # +3-492A U+8098 # +3-492B U+5F3C # +3-492C U+5FC5 # +3-492D U+7562 # +3-492E U+7B46 # +3-492F U+903C # +3-4930 U+6867 # +3-4931 U+59EB # +3-4932 U+5A9B # +3-4933 U+7D10 # +3-4934 U+767E # +3-4935 U+8B2C # +3-4936 U+4FF5 # +3-4937 U+5F6A # +3-4938 U+6A19 # +3-4939 U+6C37 # +3-493A U+6F02 # +3-493B U+74E2 # +3-493C U+7968 # +3-493D U+8868 # +3-493E U+8A55 # +3-493F U+8C79 # +3-4940 U+5EDF # +3-4941 U+63CF # +3-4942 U+75C5 # +3-4943 U+79D2 # +3-4944 U+82D7 # +3-4945 U+9328 # +3-4946 U+92F2 # +3-4947 U+849C # +3-4948 U+86ED # +3-4949 U+9C2D # +3-494A U+54C1 # +3-494B U+5F6C # +3-494C U+658C # +3-494D U+6D5C # +3-494E U+7015 # +3-494F U+8CA7 # +3-4950 U+8CD3 # +3-4951 U+983B # +3-4952 U+654F # +3-4953 U+74F6 # +3-4954 U+4E0D # +3-4955 U+4ED8 # +3-4956 U+57E0 # +3-4957 U+592B # +3-4958 U+5A66 # +3-4959 U+5BCC # +3-495A U+51A8 # +3-495B U+5E03 # +3-495C U+5E9C # +3-495D U+6016 # +3-495E U+6276 # +3-495F U+6577 # +3-4960 U+65A7 # +3-4961 U+666E # +3-4962 U+6D6E # +3-4963 U+7236 # +3-4964 U+7B26 # +3-4965 U+8150 # +3-4966 U+819A # +3-4967 U+8299 # +3-4968 U+8B5C # +3-4969 U+8CA0 # +3-496A U+8CE6 # +3-496B U+8D74 # +3-496C U+961C # +3-496D U+9644 # +3-496E U+4FAE # +3-496F U+64AB # +3-4970 U+6B66 # +3-4971 U+821E # +3-4972 U+8461 # +3-4973 U+856A # +3-4974 U+90E8 # +3-4975 U+5C01 # +3-4976 U+6953 # +3-4977 U+98A8 # +3-4978 U+847A # +3-4979 U+8557 # +3-497A U+4F0F # +3-497B U+526F # +3-497C U+5FA9 # +3-497D U+5E45 # +3-497E U+670D # +3-4A21 U+798F # +3-4A22 U+8179 # +3-4A23 U+8907 # +3-4A24 U+8986 # +3-4A25 U+6DF5 # +3-4A26 U+5F17 # +3-4A27 U+6255 # +3-4A28 U+6CB8 # +3-4A29 U+4ECF # +3-4A2A U+7269 # +3-4A2B U+9B92 # +3-4A2C U+5206 # +3-4A2D U+543B # +3-4A2E U+5674 # +3-4A2F U+58B3 # +3-4A30 U+61A4 # +3-4A31 U+626E # +3-4A32 U+711A # +3-4A33 U+596E # +3-4A34 U+7C89 # +3-4A35 U+7CDE # +3-4A36 U+7D1B # +3-4A37 U+96F0 # +3-4A38 U+6587 # +3-4A39 U+805E # +3-4A3A U+4E19 # +3-4A3B U+4F75 # +3-4A3C U+5175 # +3-4A3D U+5840 # +3-4A3E U+5E63 # +3-4A3F U+5E73 # +3-4A40 U+5F0A # +3-4A41 U+67C4 # +3-4A42 U+4E26 # +3-4A43 U+853D # +3-4A44 U+9589 # +3-4A45 U+965B # +3-4A46 U+7C73 # +3-4A47 U+9801 # +3-4A48 U+50FB # +3-4A49 U+58C1 # +3-4A4A U+7656 # +3-4A4B U+78A7 # +3-4A4C U+5225 # +3-4A4D U+77A5 # +3-4A4E U+8511 # +3-4A4F U+7B86 # +3-4A50 U+504F # +3-4A51 U+5909 # +3-4A52 U+7247 # +3-4A53 U+7BC7 # +3-4A54 U+7DE8 # +3-4A55 U+8FBA # +3-4A56 U+8FD4 # +3-4A57 U+904D # +3-4A58 U+4FBF # +3-4A59 U+52C9 # +3-4A5A U+5A29 # +3-4A5B U+5F01 # +3-4A5C U+97AD # +3-4A5D U+4FDD # +3-4A5E U+8217 # +3-4A5F U+92EA # +3-4A60 U+5703 # +3-4A61 U+6355 # +3-4A62 U+6B69 # +3-4A63 U+752B # +3-4A64 U+88DC # +3-4A65 U+8F14 # +3-4A66 U+7A42 # +3-4A67 U+52DF # +3-4A68 U+5893 # +3-4A69 U+6155 # +3-4A6A U+620A # +3-4A6B U+66AE # +3-4A6C U+6BCD # +3-4A6D U+7C3F # +3-4A6E U+83E9 # +3-4A6F U+5023 # +3-4A70 U+4FF8 # +3-4A71 U+5305 # +3-4A72 U+5446 # +3-4A73 U+5831 # +3-4A74 U+5949 # +3-4A75 U+5B9D # +3-4A76 U+5CF0 # +3-4A77 U+5CEF # +3-4A78 U+5D29 # +3-4A79 U+5E96 # +3-4A7A U+62B1 # +3-4A7B U+6367 # +3-4A7C U+653E # +3-4A7D U+65B9 # +3-4A7E U+670B # +3-4B21 U+6CD5 # +3-4B22 U+6CE1 # +3-4B23 U+70F9 # +3-4B24 U+7832 # +3-4B25 U+7E2B # +3-4B26 U+80DE # +3-4B27 U+82B3 # +3-4B28 U+840C # +3-4B29 U+84EC # +3-4B2A U+8702 # +3-4B2B U+8912 # +3-4B2C U+8A2A # +3-4B2D U+8C4A # +3-4B2E U+90A6 # +3-4B2F U+92D2 # +3-4B30 U+98FD # +3-4B31 U+9CF3 # +3-4B32 U+9D6C # +3-4B33 U+4E4F # +3-4B34 U+4EA1 # +3-4B35 U+508D # +3-4B36 U+5256 # +3-4B37 U+574A # +3-4B38 U+59A8 # +3-4B39 U+5E3D # +3-4B3A U+5FD8 # +3-4B3B U+5FD9 # +3-4B3C U+623F # +3-4B3D U+66B4 # +3-4B3E U+671B # +3-4B3F U+67D0 # +3-4B40 U+68D2 # +3-4B41 U+5192 # +3-4B42 U+7D21 # +3-4B43 U+80AA # +3-4B44 U+81A8 # +3-4B45 U+8B00 # +3-4B46 U+8C8C # +3-4B47 U+8CBF # +3-4B48 U+927E # +3-4B49 U+9632 # +3-4B4A U+5420 # +3-4B4B U+982C # +3-4B4C U+5317 # +3-4B4D U+50D5 # +3-4B4E U+535C # +3-4B4F U+58A8 # +3-4B50 U+64B2 # +3-4B51 U+6734 # +3-4B52 U+7267 # +3-4B53 U+7766 # +3-4B54 U+7A46 # +3-4B55 U+91E6 # +3-4B56 U+52C3 # +3-4B57 U+6CA1 # +3-4B58 U+6B86 # +3-4B59 U+5800 # +3-4B5A U+5E4C # +3-4B5B U+5954 # +3-4B5C U+672C # +3-4B5D U+7FFB # +3-4B5E U+51E1 # +3-4B5F U+76C6 # +3-4B60 U+6469 # +3-4B61 U+78E8 # +3-4B62 U+9B54 # +3-4B63 U+9EBB # +3-4B64 U+57CB # +3-4B65 U+59B9 # +3-4B66 U+6627 # +3-4B67 U+679A # +3-4B68 U+6BCE # +3-4B69 U+54E9 # +3-4B6A U+69D9 # +3-4B6B U+5E55 # +3-4B6C U+819C # +3-4B6D U+6795 # +3-4B6E U+9BAA # +3-4B6F U+67FE # +3-4B70 U+9C52 # +3-4B71 U+685D # +3-4B72 U+4EA6 # +3-4B73 U+4FE3 # +3-4B74 U+53C8 # +3-4B75 U+62B9 # +3-4B76 U+672B # +3-4B77 U+6CAB # +3-4B78 U+8FC4 # +3-4B79 U+4FAD # +3-4B7A U+7E6D # +3-4B7B U+9EBF # +3-4B7C U+4E07 # +3-4B7D U+6162 # +3-4B7E U+6E80 # +3-4C21 U+6F2B # +3-4C22 U+8513 # +3-4C23 U+5473 # +3-4C24 U+672A # +3-4C25 U+9B45 # +3-4C26 U+5DF3 # +3-4C27 U+7B95 # +3-4C28 U+5CAC # +3-4C29 U+5BC6 # +3-4C2A U+871C # +3-4C2B U+6E4A # +3-4C2C U+84D1 # +3-4C2D U+7A14 # +3-4C2E U+8108 # +3-4C2F U+5999 # +3-4C30 U+7C8D # +3-4C31 U+6C11 # +3-4C32 U+7720 # +3-4C33 U+52D9 # +3-4C34 U+5922 # +3-4C35 U+7121 # +3-4C36 U+725F # +3-4C37 U+77DB # +3-4C38 U+9727 # +3-4C39 U+9D61 # +3-4C3A U+690B # +3-4C3B U+5A7F # +3-4C3C U+5A18 # +3-4C3D U+51A5 # +3-4C3E U+540D # +3-4C3F U+547D # +3-4C40 U+660E # +3-4C41 U+76DF # +3-4C42 U+8FF7 # +3-4C43 U+9298 # +3-4C44 U+9CF4 # +3-4C45 U+59EA # +3-4C46 U+725D # +3-4C47 U+6EC5 # +3-4C48 U+514D # +3-4C49 U+68C9 # +3-4C4A U+7DBF # +3-4C4B U+7DEC # +3-4C4C U+9762 # +3-4C4D U+9EBA # +3-4C4E U+6478 # +3-4C4F U+6A21 # +3-4C50 U+8302 # +3-4C51 U+5984 # +3-4C52 U+5B5F # +3-4C53 U+6BDB # +3-4C54 U+731B # +3-4C55 U+76F2 # +3-4C56 U+7DB2 # +3-4C57 U+8017 # +3-4C58 U+8499 # +3-4C59 U+5132 # +3-4C5A U+6728 # +3-4C5B U+9ED9 # +3-4C5C U+76EE # +3-4C5D U+6762 # +3-4C5E U+52FF # +3-4C5F U+9905 # +3-4C60 U+5C24 # +3-4C61 U+623B # +3-4C62 U+7C7E # +3-4C63 U+8CB0 # +3-4C64 U+554F # +3-4C65 U+60B6 # +3-4C66 U+7D0B # +3-4C67 U+9580 # +3-4C68 U+5301 # +3-4C69 U+4E5F # +3-4C6A U+51B6 # +3-4C6B U+591C # +3-4C6C U+723A # +3-4C6D U+8036 # +3-4C6E U+91CE # +3-4C6F U+5F25 # +3-4C70 U+77E2 # +3-4C71 U+5384 # +3-4C72 U+5F79 # +3-4C73 U+7D04 # +3-4C74 U+85AC # +3-4C75 U+8A33 # +3-4C76 U+8E8D # +3-4C77 U+9756 # +3-4C78 U+67F3 # +3-4C79 U+85AE # +3-4C7A U+9453 # +3-4C7B U+6109 # +3-4C7C U+6108 # +3-4C7D U+6CB9 # +3-4C7E U+7652 # +3-4D21 U+8AED # +3-4D22 U+8F38 # +3-4D23 U+552F # +3-4D24 U+4F51 # +3-4D25 U+512A # +3-4D26 U+52C7 # +3-4D27 U+53CB # +3-4D28 U+5BA5 # +3-4D29 U+5E7D # +3-4D2A U+60A0 # +3-4D2B U+6182 # +3-4D2C U+63D6 # +3-4D2D U+6709 # +3-4D2E U+67DA # +3-4D2F U+6E67 # +3-4D30 U+6D8C # +3-4D31 U+7336 # +3-4D32 U+7337 # +3-4D33 U+7531 # +3-4D34 U+7950 # +3-4D35 U+88D5 # +3-4D36 U+8A98 # +3-4D37 U+904A # +3-4D38 U+9091 # +3-4D39 U+90F5 # +3-4D3A U+96C4 # +3-4D3B U+878D # +3-4D3C U+5915 # +3-4D3D U+4E88 # +3-4D3E U+4F59 # +3-4D3F U+4E0E # +3-4D40 U+8A89 # +3-4D41 U+8F3F # +3-4D42 U+9810 # +3-4D43 U+50AD # +3-4D44 U+5E7C # +3-4D45 U+5996 # +3-4D46 U+5BB9 # +3-4D47 U+5EB8 # +3-4D48 U+63DA # +3-4D49 U+63FA # +3-4D4A U+64C1 # +3-4D4B U+66DC # +3-4D4C U+694A # +3-4D4D U+69D8 # +3-4D4E U+6D0B # +3-4D4F U+6EB6 # +3-4D50 U+7194 # +3-4D51 U+7528 # +3-4D52 U+7AAF # +3-4D53 U+7F8A # +3-4D54 U+8000 # +3-4D55 U+8449 # +3-4D56 U+84C9 # +3-4D57 U+8981 # +3-4D58 U+8B21 # +3-4D59 U+8E0A # +3-4D5A U+9065 # +3-4D5B U+967D # +3-4D5C U+990A # +3-4D5D U+617E # +3-4D5E U+6291 # +3-4D5F U+6B32 # +3-4D60 U+6C83 # +3-4D61 U+6D74 # +3-4D62 U+7FCC # +3-4D63 U+7FFC # +3-4D64 U+6DC0 # +3-4D65 U+7F85 # +3-4D66 U+87BA # +3-4D67 U+88F8 # +3-4D68 U+6765 # +3-4D69 U+83B1 # +3-4D6A U+983C # +3-4D6B U+96F7 # +3-4D6C U+6D1B # +3-4D6D U+7D61 # +3-4D6E U+843D # +3-4D6F U+916A # +3-4D70 U+4E71 # +3-4D71 U+5375 # +3-4D72 U+5D50 # +3-4D73 U+6B04 # +3-4D74 U+6FEB # +3-4D75 U+85CD # +3-4D76 U+862D # +3-4D77 U+89A7 # +3-4D78 U+5229 # +3-4D79 U+540F # +3-4D7A U+5C65 # +3-4D7B U+674E # +3-4D7C U+68A8 # +3-4D7D U+7406 # +3-4D7E U+7483 # +3-4E21 U+75E2 # +3-4E22 U+88CF # +3-4E23 U+88E1 # +3-4E24 U+91CC # +3-4E25 U+96E2 # +3-4E26 U+9678 # +3-4E27 U+5F8B # +3-4E28 U+7387 # +3-4E29 U+7ACB # +3-4E2A U+844E # +3-4E2B U+63A0 # +3-4E2C U+7565 # +3-4E2D U+5289 # +3-4E2E U+6D41 # +3-4E2F U+6E9C # +3-4E30 U+7409 # +3-4E31 U+7559 # +3-4E32 U+786B # +3-4E33 U+7C92 # +3-4E34 U+9686 # +3-4E35 U+7ADC # +3-4E36 U+9F8D # +3-4E37 U+4FB6 # +3-4E38 U+616E # +3-4E39 U+65C5 # +3-4E3A U+865C # +3-4E3B U+4E86 # +3-4E3C U+4EAE # +3-4E3D U+50DA # +3-4E3E U+4E21 # +3-4E3F U+51CC # +3-4E40 U+5BEE # +3-4E41 U+6599 # +3-4E42 U+6881 # +3-4E43 U+6DBC # +3-4E44 U+731F # +3-4E45 U+7642 # +3-4E46 U+77AD # +3-4E47 U+7A1C # +3-4E48 U+7CE7 # +3-4E49 U+826F # +3-4E4A U+8AD2 # +3-4E4B U+907C # +3-4E4C U+91CF # +3-4E4D U+9675 # +3-4E4E U+9818 # +3-4E4F U+529B # +3-4E50 U+7DD1 # +3-4E51 U+502B # +3-4E52 U+5398 # +3-4E53 U+6797 # +3-4E54 U+6DCB # +3-4E55 U+71D0 # +3-4E56 U+7433 # +3-4E57 U+81E8 # +3-4E58 U+8F2A # +3-4E59 U+96A3 # +3-4E5A U+9C57 # +3-4E5B U+9E9F # +3-4E5C U+7460 # +3-4E5D U+5841 # +3-4E5E U+6D99 # +3-4E5F U+7D2F # +3-4E60 U+985E # +3-4E61 U+4EE4 # +3-4E62 U+4F36 # +3-4E63 U+4F8B # +3-4E64 U+51B7 # +3-4E65 U+52B1 # +3-4E66 U+5DBA # +3-4E67 U+601C # +3-4E68 U+73B2 # +3-4E69 U+793C # +3-4E6A U+82D3 # +3-4E6B U+9234 # +3-4E6C U+96B7 # +3-4E6D U+96F6 # +3-4E6E U+970A # +3-4E6F U+9E97 # +3-4E70 U+9F62 # +3-4E71 U+66A6 # +3-4E72 U+6B74 # +3-4E73 U+5217 # +3-4E74 U+52A3 # +3-4E75 U+70C8 # +3-4E76 U+88C2 # +3-4E77 U+5EC9 # +3-4E78 U+604B # +3-4E79 U+6190 # +3-4E7A U+6F23 # +3-4E7B U+7149 # +3-4E7C U+7C3E # +3-4E7D U+7DF4 # +3-4E7E U+806F # +3-4F21 U+84EE # +3-4F22 U+9023 # +3-4F23 U+932C # +3-4F24 U+5442 # +3-4F25 U+9B6F # +3-4F26 U+6AD3 # +3-4F27 U+7089 # +3-4F28 U+8CC2 # +3-4F29 U+8DEF # +3-4F2A U+9732 # +3-4F2B U+52B4 # +3-4F2C U+5A41 # +3-4F2D U+5ECA # +3-4F2E U+5F04 # +3-4F2F U+6717 # +3-4F30 U+697C # +3-4F31 U+6994 # +3-4F32 U+6D6A # +3-4F33 U+6F0F # +3-4F34 U+7262 # +3-4F35 U+72FC # +3-4F36 U+7BED # +3-4F37 U+8001 # +3-4F38 U+807E # +3-4F39 U+874B # +3-4F3A U+90CE # +3-4F3B U+516D # +3-4F3C U+9E93 # +3-4F3D U+7984 # +3-4F3E U+808B # +3-4F3F U+9332 # +3-4F40 U+8AD6 # +3-4F41 U+502D # +3-4F42 U+548C # +3-4F43 U+8A71 # +3-4F44 U+6B6A # +3-4F45 U+8CC4 # +3-4F46 U+8107 # +3-4F47 U+60D1 # +3-4F48 U+67A0 # +3-4F49 U+9DF2 # +3-4F4A U+4E99 # +3-4F4B U+4E98 # +3-4F4C U+9C10 # +3-4F4D U+8A6B # +3-4F4E U+85C1 # +3-4F4F U+8568 # +3-4F50 U+6900 # +3-4F51 U+6E7E # +3-4F52 U+7897 # +3-4F53 U+8155 # +3-4F54 U+20B9F # [2004] +3-4F55 U+5B41 # [2000] +3-4F56 U+5B56 # [2000] +3-4F57 U+5B7D # [2000] +3-4F58 U+5B93 # [2000] +3-4F59 U+5BD8 # [2000] +3-4F5A U+5BEC # [2000] +3-4F5B U+5C12 # [2000] +3-4F5C U+5C1E # [2000] +3-4F5D U+5C23 # [2000] +3-4F5E U+5C2B # [2000] +3-4F5F U+378D # [2000] +3-4F60 U+5C62 # [2000] +3-4F61 U+FA3B # CJK COMPATIBILITY IDEOGRAPH-FA3B [2000] [Unicode3.2] +3-4F62 U+FA3C # CJK COMPATIBILITY IDEOGRAPH-FA3C [2000] [Unicode3.2] +3-4F63 U+216B4 # [2000] [Unicode3.1] Private: U+F792 +3-4F64 U+5C7A # [2000] +3-4F65 U+5C8F # [2000] +3-4F66 U+5C9F # [2000] +3-4F67 U+5CA3 # [2000] +3-4F68 U+5CAA # [2000] +3-4F69 U+5CBA # [2000] +3-4F6A U+5CCB # [2000] +3-4F6B U+5CD0 # [2000] +3-4F6C U+5CD2 # [2000] +3-4F6D U+5CF4 # [2000] +3-4F6E U+21E34 # [2000] [Unicode3.1] Private: U+F793 +3-4F6F U+37E2 # [2000] +3-4F70 U+5D0D # [2000] +3-4F71 U+5D27 # [2000] +3-4F72 U+FA11 # CJK COMPATIBILITY IDEOGRAPH-FA11 [2000] +3-4F73 U+5D46 # [2000] +3-4F74 U+5D47 # [2000] +3-4F75 U+5D53 # [2000] +3-4F76 U+5D4A # [2000] +3-4F77 U+5D6D # [2000] +3-4F78 U+5D81 # [2000] +3-4F79 U+5DA0 # [2000] +3-4F7A U+5DA4 # [2000] +3-4F7B U+5DA7 # [2000] +3-4F7C U+5DB8 # [2000] +3-4F7D U+5DCB # [2000] +3-4F7E U+541E # [2004] +3-5021 U+5F0C # +3-5022 U+4E10 # +3-5023 U+4E15 # +3-5024 U+4E2A # +3-5025 U+4E31 # +3-5026 U+4E36 # +3-5027 U+4E3C # +3-5028 U+4E3F # +3-5029 U+4E42 # +3-502A U+4E56 # +3-502B U+4E58 # +3-502C U+4E82 # +3-502D U+4E85 # +3-502E U+8C6B # +3-502F U+4E8A # +3-5030 U+8212 # +3-5031 U+5F0D # +3-5032 U+4E8E # +3-5033 U+4E9E # +3-5034 U+4E9F # +3-5035 U+4EA0 # +3-5036 U+4EA2 # +3-5037 U+4EB0 # +3-5038 U+4EB3 # +3-5039 U+4EB6 # +3-503A U+4ECE # +3-503B U+4ECD # +3-503C U+4EC4 # +3-503D U+4EC6 # +3-503E U+4EC2 # +3-503F U+4ED7 # +3-5040 U+4EDE # +3-5041 U+4EED # +3-5042 U+4EDF # +3-5043 U+4EF7 # +3-5044 U+4F09 # +3-5045 U+4F5A # +3-5046 U+4F30 # +3-5047 U+4F5B # +3-5048 U+4F5D # +3-5049 U+4F57 # +3-504A U+4F47 # +3-504B U+4F76 # +3-504C U+4F88 # +3-504D U+4F8F # +3-504E U+4F98 # +3-504F U+4F7B # +3-5050 U+4F69 # +3-5051 U+4F70 # +3-5052 U+4F91 # +3-5053 U+4F6F # +3-5054 U+4F86 # +3-5055 U+4F96 # +3-5056 U+5118 # +3-5057 U+4FD4 # +3-5058 U+4FDF # +3-5059 U+4FCE # +3-505A U+4FD8 # +3-505B U+4FDB # +3-505C U+4FD1 # +3-505D U+4FDA # +3-505E U+4FD0 # +3-505F U+4FE4 # +3-5060 U+4FE5 # +3-5061 U+501A # +3-5062 U+5028 # +3-5063 U+5014 # +3-5064 U+502A # +3-5065 U+5025 # +3-5066 U+5005 # +3-5067 U+4F1C # +3-5068 U+4FF6 # +3-5069 U+5021 # +3-506A U+5029 # +3-506B U+502C # +3-506C U+4FFE # +3-506D U+4FEF # +3-506E U+5011 # +3-506F U+5006 # +3-5070 U+5043 # +3-5071 U+5047 # +3-5072 U+6703 # +3-5073 U+5055 # +3-5074 U+5050 # +3-5075 U+5048 # +3-5076 U+505A # +3-5077 U+5056 # +3-5078 U+506C # +3-5079 U+5078 # +3-507A U+5080 # +3-507B U+509A # +3-507C U+5085 # +3-507D U+50B4 # +3-507E U+50B2 # +3-5121 U+50C9 # +3-5122 U+50CA # +3-5123 U+50B3 # +3-5124 U+50C2 # +3-5125 U+50D6 # +3-5126 U+50DE # +3-5127 U+50E5 # +3-5128 U+50ED # +3-5129 U+50E3 # +3-512A U+50EE # +3-512B U+50F9 # +3-512C U+50F5 # +3-512D U+5109 # +3-512E U+5101 # +3-512F U+5102 # +3-5130 U+5116 # +3-5131 U+5115 # +3-5132 U+5114 # +3-5133 U+511A # +3-5134 U+5121 # +3-5135 U+513A # +3-5136 U+5137 # +3-5137 U+513C # +3-5138 U+513B # +3-5139 U+513F # +3-513A U+5140 # +3-513B U+5152 # +3-513C U+514C # +3-513D U+5154 # +3-513E U+5162 # +3-513F U+7AF8 # +3-5140 U+5169 # +3-5141 U+516A # +3-5142 U+516E # +3-5143 U+5180 # +3-5144 U+5182 # +3-5145 U+56D8 # +3-5146 U+518C # +3-5147 U+5189 # +3-5148 U+518F # +3-5149 U+5191 # +3-514A U+5193 # +3-514B U+5195 # +3-514C U+5196 # +3-514D U+51A4 # +3-514E U+51A6 # +3-514F U+51A2 # +3-5150 U+51A9 # +3-5151 U+51AA # +3-5152 U+51AB # +3-5153 U+51B3 # +3-5154 U+51B1 # +3-5155 U+51B2 # +3-5156 U+51B0 # +3-5157 U+51B5 # +3-5158 U+51BD # +3-5159 U+51C5 # +3-515A U+51C9 # +3-515B U+51DB # +3-515C U+51E0 # +3-515D U+8655 # +3-515E U+51E9 # +3-515F U+51ED # +3-5160 U+51F0 # +3-5161 U+51F5 # +3-5162 U+51FE # +3-5163 U+5204 # +3-5164 U+520B # +3-5165 U+5214 # +3-5166 U+520E # +3-5167 U+5227 # +3-5168 U+522A # +3-5169 U+522E # +3-516A U+5233 # +3-516B U+5239 # +3-516C U+524F # +3-516D U+5244 # +3-516E U+524B # +3-516F U+524C # +3-5170 U+525E # +3-5171 U+5254 # +3-5172 U+526A # +3-5173 U+5274 # +3-5174 U+5269 # +3-5175 U+5273 # +3-5176 U+527F # +3-5177 U+527D # +3-5178 U+528D # +3-5179 U+5294 # +3-517A U+5292 # +3-517B U+5271 # +3-517C U+5288 # +3-517D U+5291 # +3-517E U+8FA8 # +3-5221 U+8FA7 # +3-5222 U+52AC # +3-5223 U+52AD # +3-5224 U+52BC # +3-5225 U+52B5 # +3-5226 U+52C1 # +3-5227 U+52CD # +3-5228 U+52D7 # +3-5229 U+52DE # +3-522A U+52E3 # +3-522B U+52E6 # +3-522C U+98ED # +3-522D U+52E0 # +3-522E U+52F3 # +3-522F U+52F5 # +3-5230 U+52F8 # +3-5231 U+52F9 # +3-5232 U+5306 # +3-5233 U+5308 # +3-5234 U+7538 # +3-5235 U+530D # +3-5236 U+5310 # +3-5237 U+530F # +3-5238 U+5315 # +3-5239 U+531A # +3-523A U+5323 # +3-523B U+532F # +3-523C U+5331 # +3-523D U+5333 # +3-523E U+5338 # +3-523F U+5340 # +3-5240 U+5346 # +3-5241 U+5345 # +3-5242 U+4E17 # +3-5243 U+5349 # +3-5244 U+534D # +3-5245 U+51D6 # +3-5246 U+535E # +3-5247 U+5369 # +3-5248 U+536E # +3-5249 U+5918 # +3-524A U+537B # +3-524B U+5377 # +3-524C U+5382 # +3-524D U+5396 # +3-524E U+53A0 # +3-524F U+53A6 # +3-5250 U+53A5 # +3-5251 U+53AE # +3-5252 U+53B0 # +3-5253 U+53B6 # +3-5254 U+53C3 # +3-5255 U+7C12 # +3-5256 U+96D9 # +3-5257 U+53DF # +3-5258 U+66FC # +3-5259 U+71EE # +3-525A U+53EE # +3-525B U+53E8 # +3-525C U+53ED # +3-525D U+53FA # +3-525E U+5401 # +3-525F U+543D # +3-5260 U+5440 # +3-5261 U+542C # +3-5262 U+542D # +3-5263 U+543C # +3-5264 U+542E # +3-5265 U+5436 # +3-5266 U+5429 # +3-5267 U+541D # +3-5268 U+544E # +3-5269 U+548F # +3-526A U+5475 # +3-526B U+548E # +3-526C U+545F # +3-526D U+5471 # +3-526E U+5477 # +3-526F U+5470 # +3-5270 U+5492 # +3-5271 U+547B # +3-5272 U+5480 # +3-5273 U+5476 # +3-5274 U+5484 # +3-5275 U+5490 # +3-5276 U+5486 # +3-5277 U+54C7 # +3-5278 U+54A2 # +3-5279 U+54B8 # +3-527A U+54A5 # +3-527B U+54AC # +3-527C U+54C4 # +3-527D U+54C8 # +3-527E U+54A8 # +3-5321 U+54AB # +3-5322 U+54C2 # +3-5323 U+54A4 # +3-5324 U+54BE # +3-5325 U+54BC # +3-5326 U+54D8 # +3-5327 U+54E5 # +3-5328 U+54E6 # +3-5329 U+550F # +3-532A U+5514 # +3-532B U+54FD # +3-532C U+54EE # +3-532D U+54ED # +3-532E U+54FA # +3-532F U+54E2 # +3-5330 U+5539 # +3-5331 U+5540 # +3-5332 U+5563 # +3-5333 U+554C # +3-5334 U+552E # +3-5335 U+555C # +3-5336 U+5545 # +3-5337 U+5556 # +3-5338 U+5557 # +3-5339 U+5538 # +3-533A U+5533 # +3-533B U+555D # +3-533C U+5599 # +3-533D U+5580 # +3-533E U+54AF # +3-533F U+558A # +3-5340 U+559F # +3-5341 U+557B # +3-5342 U+557E # +3-5343 U+5598 # +3-5344 U+559E # +3-5345 U+55AE # +3-5346 U+557C # +3-5347 U+5583 # +3-5348 U+55A9 # +3-5349 U+5587 # +3-534A U+55A8 # +3-534B U+55DA # +3-534C U+55C5 # +3-534D U+55DF # +3-534E U+55C4 # +3-534F U+55DC # +3-5350 U+55E4 # +3-5351 U+55D4 # +3-5352 U+5614 # +3-5353 U+55F7 # +3-5354 U+5616 # +3-5355 U+55FE # +3-5356 U+55FD # +3-5357 U+561B # +3-5358 U+55F9 # +3-5359 U+564E # +3-535A U+5650 # +3-535B U+71DF # +3-535C U+5634 # +3-535D U+5636 # +3-535E U+5632 # +3-535F U+5638 # +3-5360 U+566B # +3-5361 U+5664 # +3-5362 U+562F # +3-5363 U+566C # +3-5364 U+566A # +3-5365 U+5686 # +3-5366 U+5680 # +3-5367 U+568A # +3-5368 U+56A0 # +3-5369 U+5694 # +3-536A U+568F # +3-536B U+56A5 # +3-536C U+56AE # +3-536D U+56B6 # +3-536E U+56B4 # +3-536F U+56C2 # +3-5370 U+56BC # +3-5371 U+56C1 # +3-5372 U+56C3 # +3-5373 U+56C0 # +3-5374 U+56C8 # +3-5375 U+56CE # +3-5376 U+56D1 # +3-5377 U+56D3 # +3-5378 U+56D7 # +3-5379 U+56EE # +3-537A U+56F9 # +3-537B U+5700 # +3-537C U+56FF # +3-537D U+5704 # +3-537E U+5709 # +3-5421 U+5708 # +3-5422 U+570B # +3-5423 U+570D # +3-5424 U+5713 # +3-5425 U+5718 # +3-5426 U+5716 # +3-5427 U+55C7 # +3-5428 U+571C # +3-5429 U+5726 # +3-542A U+5737 # +3-542B U+5738 # +3-542C U+574E # +3-542D U+573B # +3-542E U+5740 # +3-542F U+574F # +3-5430 U+5769 # +3-5431 U+57C0 # +3-5432 U+5788 # +3-5433 U+5761 # +3-5434 U+577F # +3-5435 U+5789 # +3-5436 U+5793 # +3-5437 U+57A0 # +3-5438 U+57B3 # +3-5439 U+57A4 # +3-543A U+57AA # +3-543B U+57B0 # +3-543C U+57C3 # +3-543D U+57C6 # +3-543E U+57D4 # +3-543F U+57D2 # +3-5440 U+57D3 # +3-5441 U+580A # +3-5442 U+57D6 # +3-5443 U+57E3 # +3-5444 U+580B # +3-5445 U+5819 # +3-5446 U+581D # +3-5447 U+5872 # +3-5448 U+5821 # +3-5449 U+5862 # +3-544A U+584B # +3-544B U+5870 # +3-544C U+6BC0 # +3-544D U+5852 # +3-544E U+583D # +3-544F U+5879 # +3-5450 U+5885 # +3-5451 U+58B9 # +3-5452 U+589F # +3-5453 U+58AB # +3-5454 U+58BA # +3-5455 U+58DE # +3-5456 U+58BB # +3-5457 U+58B8 # +3-5458 U+58AE # +3-5459 U+58C5 # +3-545A U+58D3 # +3-545B U+58D1 # +3-545C U+58D7 # +3-545D U+58D9 # +3-545E U+58D8 # +3-545F U+58E5 # +3-5460 U+58DC # +3-5461 U+58E4 # +3-5462 U+58DF # +3-5463 U+58EF # +3-5464 U+58FA # +3-5465 U+58F9 # +3-5466 U+58FB # +3-5467 U+58FC # +3-5468 U+58FD # +3-5469 U+5902 # +3-546A U+590A # +3-546B U+5910 # +3-546C U+591B # +3-546D U+68A6 # +3-546E U+5925 # +3-546F U+592C # +3-5470 U+592D # +3-5471 U+5932 # +3-5472 U+5938 # +3-5473 U+593E # +3-5474 U+7AD2 # +3-5475 U+5955 # +3-5476 U+5950 # +3-5477 U+594E # +3-5478 U+595A # +3-5479 U+5958 # +3-547A U+5962 # +3-547B U+5960 # +3-547C U+5967 # +3-547D U+596C # +3-547E U+5969 # +3-5521 U+5978 # +3-5522 U+5981 # +3-5523 U+599D # +3-5524 U+4F5E # +3-5525 U+4FAB # +3-5526 U+59A3 # +3-5527 U+59B2 # +3-5528 U+59C6 # +3-5529 U+59E8 # +3-552A U+59DC # +3-552B U+598D # +3-552C U+59D9 # +3-552D U+59DA # +3-552E U+5A25 # +3-552F U+5A1F # +3-5530 U+5A11 # +3-5531 U+5A1C # +3-5532 U+5A09 # +3-5533 U+5A1A # +3-5534 U+5A40 # +3-5535 U+5A6C # +3-5536 U+5A49 # +3-5537 U+5A35 # +3-5538 U+5A36 # +3-5539 U+5A62 # +3-553A U+5A6A # +3-553B U+5A9A # +3-553C U+5ABC # +3-553D U+5ABE # +3-553E U+5ACB # +3-553F U+5AC2 # +3-5540 U+5ABD # +3-5541 U+5AE3 # +3-5542 U+5AD7 # +3-5543 U+5AE6 # +3-5544 U+5AE9 # +3-5545 U+5AD6 # +3-5546 U+5AFA # +3-5547 U+5AFB # +3-5548 U+5B0C # +3-5549 U+5B0B # +3-554A U+5B16 # +3-554B U+5B32 # +3-554C U+5AD0 # +3-554D U+5B2A # +3-554E U+5B36 # +3-554F U+5B3E # +3-5550 U+5B43 # +3-5551 U+5B45 # +3-5552 U+5B40 # +3-5553 U+5B51 # +3-5554 U+5B55 # +3-5555 U+5B5A # +3-5556 U+5B5B # +3-5557 U+5B65 # +3-5558 U+5B69 # +3-5559 U+5B70 # +3-555A U+5B73 # +3-555B U+5B75 # +3-555C U+5B78 # +3-555D U+6588 # +3-555E U+5B7A # +3-555F U+5B80 # +3-5560 U+5B83 # +3-5561 U+5BA6 # +3-5562 U+5BB8 # +3-5563 U+5BC3 # +3-5564 U+5BC7 # +3-5565 U+5BC9 # +3-5566 U+5BD4 # +3-5567 U+5BD0 # +3-5568 U+5BE4 # +3-5569 U+5BE6 # +3-556A U+5BE2 # +3-556B U+5BDE # +3-556C U+5BE5 # +3-556D U+5BEB # +3-556E U+5BF0 # +3-556F U+5BF6 # +3-5570 U+5BF3 # +3-5571 U+5C05 # +3-5572 U+5C07 # +3-5573 U+5C08 # +3-5574 U+5C0D # +3-5575 U+5C13 # +3-5576 U+5C20 # +3-5577 U+5C22 # +3-5578 U+5C28 # +3-5579 U+5C38 # +3-557A U+5C39 # +3-557B U+5C41 # +3-557C U+5C46 # +3-557D U+5C4E # +3-557E U+5C53 # +3-5621 U+5C50 # +3-5622 U+5C4F # +3-5623 U+5B71 # +3-5624 U+5C6C # +3-5625 U+5C6E # +3-5626 U+4E62 # +3-5627 U+5C76 # +3-5628 U+5C79 # +3-5629 U+5C8C # +3-562A U+5C91 # +3-562B U+5C94 # +3-562C U+599B # +3-562D U+5CAB # +3-562E U+5CBB # +3-562F U+5CB6 # +3-5630 U+5CBC # +3-5631 U+5CB7 # +3-5632 U+5CC5 # +3-5633 U+5CBE # +3-5634 U+5CC7 # +3-5635 U+5CD9 # +3-5636 U+5CE9 # +3-5637 U+5CFD # +3-5638 U+5CFA # +3-5639 U+5CED # +3-563A U+5D8C # +3-563B U+5CEA # +3-563C U+5D0B # +3-563D U+5D15 # +3-563E U+5D17 # +3-563F U+5D5C # +3-5640 U+5D1F # +3-5641 U+5D1B # +3-5642 U+5D11 # +3-5643 U+5D14 # +3-5644 U+5D22 # +3-5645 U+5D1A # +3-5646 U+5D19 # +3-5647 U+5D18 # +3-5648 U+5D4C # +3-5649 U+5D52 # +3-564A U+5D4E # +3-564B U+5D4B # +3-564C U+5D6C # +3-564D U+5D73 # +3-564E U+5D76 # +3-564F U+5D87 # +3-5650 U+5D84 # +3-5651 U+5D82 # +3-5652 U+5DA2 # +3-5653 U+5D9D # +3-5654 U+5DAC # +3-5655 U+5DAE # +3-5656 U+5DBD # +3-5657 U+5D90 # +3-5658 U+5DB7 # +3-5659 U+5DBC # +3-565A U+5DC9 # +3-565B U+5DCD # +3-565C U+5DD3 # +3-565D U+5DD2 # +3-565E U+5DD6 # +3-565F U+5DDB # +3-5660 U+5DEB # +3-5661 U+5DF2 # +3-5662 U+5DF5 # +3-5663 U+5E0B # +3-5664 U+5E1A # +3-5665 U+5E19 # +3-5666 U+5E11 # +3-5667 U+5E1B # +3-5668 U+5E36 # +3-5669 U+5E37 # +3-566A U+5E44 # +3-566B U+5E43 # +3-566C U+5E40 # +3-566D U+5E4E # +3-566E U+5E57 # +3-566F U+5E54 # +3-5670 U+5E5F # +3-5671 U+5E62 # +3-5672 U+5E64 # +3-5673 U+5E47 # +3-5674 U+5E75 # +3-5675 U+5E76 # +3-5676 U+5E7A # +3-5677 U+9EBC # +3-5678 U+5E7F # +3-5679 U+5EA0 # +3-567A U+5EC1 # +3-567B U+5EC2 # +3-567C U+5EC8 # +3-567D U+5ED0 # +3-567E U+5ECF # +3-5721 U+5ED6 # +3-5722 U+5EE3 # +3-5723 U+5EDD # +3-5724 U+5EDA # +3-5725 U+5EDB # +3-5726 U+5EE2 # +3-5727 U+5EE1 # +3-5728 U+5EE8 # +3-5729 U+5EE9 # +3-572A U+5EEC # +3-572B U+5EF1 # +3-572C U+5EF3 # +3-572D U+5EF0 # +3-572E U+5EF4 # +3-572F U+5EF8 # +3-5730 U+5EFE # +3-5731 U+5F03 # +3-5732 U+5F09 # +3-5733 U+5F5D # +3-5734 U+5F5C # +3-5735 U+5F0B # +3-5736 U+5F11 # +3-5737 U+5F16 # +3-5738 U+5F29 # +3-5739 U+5F2D # +3-573A U+5F38 # +3-573B U+5F41 # +3-573C U+5F48 # +3-573D U+5F4C # +3-573E U+5F4E # +3-573F U+5F2F # +3-5740 U+5F51 # +3-5741 U+5F56 # +3-5742 U+5F57 # +3-5743 U+5F59 # +3-5744 U+5F61 # +3-5745 U+5F6D # +3-5746 U+5F73 # +3-5747 U+5F77 # +3-5748 U+5F83 # +3-5749 U+5F82 # +3-574A U+5F7F # +3-574B U+5F8A # +3-574C U+5F88 # +3-574D U+5F91 # +3-574E U+5F87 # +3-574F U+5F9E # +3-5750 U+5F99 # +3-5751 U+5F98 # +3-5752 U+5FA0 # +3-5753 U+5FA8 # +3-5754 U+5FAD # +3-5755 U+5FBC # +3-5756 U+5FD6 # +3-5757 U+5FFB # +3-5758 U+5FE4 # +3-5759 U+5FF8 # +3-575A U+5FF1 # +3-575B U+5FDD # +3-575C U+60B3 # +3-575D U+5FFF # +3-575E U+6021 # +3-575F U+6060 # +3-5760 U+6019 # +3-5761 U+6010 # +3-5762 U+6029 # +3-5763 U+600E # +3-5764 U+6031 # +3-5765 U+601B # +3-5766 U+6015 # +3-5767 U+602B # +3-5768 U+6026 # +3-5769 U+600F # +3-576A U+603A # +3-576B U+605A # +3-576C U+6041 # +3-576D U+606A # +3-576E U+6077 # +3-576F U+605F # +3-5770 U+604A # +3-5771 U+6046 # +3-5772 U+604D # +3-5773 U+6063 # +3-5774 U+6043 # +3-5775 U+6064 # +3-5776 U+6042 # +3-5777 U+606C # +3-5778 U+606B # +3-5779 U+6059 # +3-577A U+6081 # +3-577B U+608D # +3-577C U+60E7 # +3-577D U+6083 # +3-577E U+609A # +3-5821 U+6084 # +3-5822 U+609B # +3-5823 U+6096 # +3-5824 U+6097 # +3-5825 U+6092 # +3-5826 U+60A7 # +3-5827 U+608B # +3-5828 U+60E1 # +3-5829 U+60B8 # +3-582A U+60E0 # +3-582B U+60D3 # +3-582C U+60B4 # +3-582D U+5FF0 # +3-582E U+60BD # +3-582F U+60C6 # +3-5830 U+60B5 # +3-5831 U+60D8 # +3-5832 U+614D # +3-5833 U+6115 # +3-5834 U+6106 # +3-5835 U+60F6 # +3-5836 U+60F7 # +3-5837 U+6100 # +3-5838 U+60F4 # +3-5839 U+60FA # +3-583A U+6103 # +3-583B U+6121 # +3-583C U+60FB # +3-583D U+60F1 # +3-583E U+610D # +3-583F U+610E # +3-5840 U+6147 # +3-5841 U+613E # +3-5842 U+6128 # +3-5843 U+6127 # +3-5844 U+614A # +3-5845 U+613F # +3-5846 U+613C # +3-5847 U+612C # +3-5848 U+6134 # +3-5849 U+613D # +3-584A U+6142 # +3-584B U+6144 # +3-584C U+6173 # +3-584D U+6177 # +3-584E U+6158 # +3-584F U+6159 # +3-5850 U+615A # +3-5851 U+616B # +3-5852 U+6174 # +3-5853 U+616F # +3-5854 U+6165 # +3-5855 U+6171 # +3-5856 U+615F # +3-5857 U+615D # +3-5858 U+6153 # +3-5859 U+6175 # +3-585A U+6199 # +3-585B U+6196 # +3-585C U+6187 # +3-585D U+61AC # +3-585E U+6194 # +3-585F U+619A # +3-5860 U+618A # +3-5861 U+6191 # +3-5862 U+61AB # +3-5863 U+61AE # +3-5864 U+61CC # +3-5865 U+61CA # +3-5866 U+61C9 # +3-5867 U+61F7 # +3-5868 U+61C8 # +3-5869 U+61C3 # +3-586A U+61C6 # +3-586B U+61BA # +3-586C U+61CB # +3-586D U+7F79 # +3-586E U+61CD # +3-586F U+61E6 # +3-5870 U+61E3 # +3-5871 U+61F6 # +3-5872 U+61FA # +3-5873 U+61F4 # +3-5874 U+61FF # +3-5875 U+61FD # +3-5876 U+61FC # +3-5877 U+61FE # +3-5878 U+6200 # +3-5879 U+6208 # +3-587A U+6209 # +3-587B U+620D # +3-587C U+620C # +3-587D U+6214 # +3-587E U+621B # +3-5921 U+621E # +3-5922 U+6221 # +3-5923 U+622A # +3-5924 U+622E # +3-5925 U+6230 # +3-5926 U+6232 # +3-5927 U+6233 # +3-5928 U+6241 # +3-5929 U+624E # +3-592A U+625E # +3-592B U+6263 # +3-592C U+625B # +3-592D U+6260 # +3-592E U+6268 # +3-592F U+627C # +3-5930 U+6282 # +3-5931 U+6289 # +3-5932 U+627E # +3-5933 U+6292 # +3-5934 U+6293 # +3-5935 U+6296 # +3-5936 U+62D4 # +3-5937 U+6283 # +3-5938 U+6294 # +3-5939 U+62D7 # +3-593A U+62D1 # +3-593B U+62BB # +3-593C U+62CF # +3-593D U+62FF # +3-593E U+62C6 # +3-593F U+64D4 # +3-5940 U+62C8 # +3-5941 U+62DC # +3-5942 U+62CC # +3-5943 U+62CA # +3-5944 U+62C2 # +3-5945 U+62C7 # +3-5946 U+629B # +3-5947 U+62C9 # +3-5948 U+630C # +3-5949 U+62EE # +3-594A U+62F1 # +3-594B U+6327 # +3-594C U+6302 # +3-594D U+6308 # +3-594E U+62EF # +3-594F U+62F5 # +3-5950 U+6350 # +3-5951 U+633E # +3-5952 U+634D # +3-5953 U+641C # +3-5954 U+634F # +3-5955 U+6396 # +3-5956 U+638E # +3-5957 U+6380 # +3-5958 U+63AB # +3-5959 U+6376 # +3-595A U+63A3 # +3-595B U+638F # +3-595C U+6389 # +3-595D U+639F # +3-595E U+63B5 # +3-595F U+636B # +3-5960 U+6369 # +3-5961 U+63BE # +3-5962 U+63E9 # +3-5963 U+63C0 # +3-5964 U+63C6 # +3-5965 U+63E3 # +3-5966 U+63C9 # +3-5967 U+63D2 # +3-5968 U+63F6 # +3-5969 U+63C4 # +3-596A U+6416 # +3-596B U+6434 # +3-596C U+6406 # +3-596D U+6413 # +3-596E U+6426 # +3-596F U+6436 # +3-5970 U+651D # +3-5971 U+6417 # +3-5972 U+6428 # +3-5973 U+640F # +3-5974 U+6467 # +3-5975 U+646F # +3-5976 U+6476 # +3-5977 U+644E # +3-5978 U+652A # +3-5979 U+6495 # +3-597A U+6493 # +3-597B U+64A5 # +3-597C U+64A9 # +3-597D U+6488 # +3-597E U+64BC # +3-5A21 U+64DA # +3-5A22 U+64D2 # +3-5A23 U+64C5 # +3-5A24 U+64C7 # +3-5A25 U+64BB # +3-5A26 U+64D8 # +3-5A27 U+64C2 # +3-5A28 U+64F1 # +3-5A29 U+64E7 # +3-5A2A U+8209 # +3-5A2B U+64E0 # +3-5A2C U+64E1 # +3-5A2D U+62AC # +3-5A2E U+64E3 # +3-5A2F U+64EF # +3-5A30 U+652C # +3-5A31 U+64F6 # +3-5A32 U+64F4 # +3-5A33 U+64F2 # +3-5A34 U+64FA # +3-5A35 U+6500 # +3-5A36 U+64FD # +3-5A37 U+6518 # +3-5A38 U+651C # +3-5A39 U+6505 # +3-5A3A U+6524 # +3-5A3B U+6523 # +3-5A3C U+652B # +3-5A3D U+6534 # +3-5A3E U+6535 # +3-5A3F U+6537 # +3-5A40 U+6536 # +3-5A41 U+6538 # +3-5A42 U+754B # +3-5A43 U+6548 # +3-5A44 U+6556 # +3-5A45 U+6555 # +3-5A46 U+654D # +3-5A47 U+6558 # +3-5A48 U+655E # +3-5A49 U+655D # +3-5A4A U+6572 # +3-5A4B U+6578 # +3-5A4C U+6582 # +3-5A4D U+6583 # +3-5A4E U+8B8A # +3-5A4F U+659B # +3-5A50 U+659F # +3-5A51 U+65AB # +3-5A52 U+65B7 # +3-5A53 U+65C3 # +3-5A54 U+65C6 # +3-5A55 U+65C1 # +3-5A56 U+65C4 # +3-5A57 U+65CC # +3-5A58 U+65D2 # +3-5A59 U+65DB # +3-5A5A U+65D9 # +3-5A5B U+65E0 # +3-5A5C U+65E1 # +3-5A5D U+65F1 # +3-5A5E U+6772 # +3-5A5F U+660A # +3-5A60 U+6603 # +3-5A61 U+65FB # +3-5A62 U+6773 # +3-5A63 U+6635 # +3-5A64 U+6636 # +3-5A65 U+6634 # +3-5A66 U+661C # +3-5A67 U+664F # +3-5A68 U+6644 # +3-5A69 U+6649 # +3-5A6A U+6641 # +3-5A6B U+665E # +3-5A6C U+665D # +3-5A6D U+6664 # +3-5A6E U+6667 # +3-5A6F U+6668 # +3-5A70 U+665F # +3-5A71 U+6662 # +3-5A72 U+6670 # +3-5A73 U+6683 # +3-5A74 U+6688 # +3-5A75 U+668E # +3-5A76 U+6689 # +3-5A77 U+6684 # +3-5A78 U+6698 # +3-5A79 U+669D # +3-5A7A U+66C1 # +3-5A7B U+66B9 # +3-5A7C U+66C9 # +3-5A7D U+66BE # +3-5A7E U+66BC # +3-5B21 U+66C4 # +3-5B22 U+66B8 # +3-5B23 U+66D6 # +3-5B24 U+66DA # +3-5B25 U+66E0 # +3-5B26 U+663F # +3-5B27 U+66E6 # +3-5B28 U+66E9 # +3-5B29 U+66F0 # +3-5B2A U+66F5 # +3-5B2B U+66F7 # +3-5B2C U+670F # +3-5B2D U+6716 # +3-5B2E U+671E # +3-5B2F U+6726 # +3-5B30 U+6727 # +3-5B31 U+9738 # +3-5B32 U+672E # +3-5B33 U+673F # +3-5B34 U+6736 # +3-5B35 U+6741 # +3-5B36 U+6738 # +3-5B37 U+6737 # +3-5B38 U+6746 # +3-5B39 U+675E # +3-5B3A U+6760 # +3-5B3B U+6759 # +3-5B3C U+6763 # +3-5B3D U+6764 # +3-5B3E U+6789 # +3-5B3F U+6770 # +3-5B40 U+67A9 # +3-5B41 U+677C # +3-5B42 U+676A # +3-5B43 U+678C # +3-5B44 U+678B # +3-5B45 U+67A6 # +3-5B46 U+67A1 # +3-5B47 U+6785 # +3-5B48 U+67B7 # +3-5B49 U+67EF # +3-5B4A U+67B4 # +3-5B4B U+67EC # +3-5B4C U+67B3 # +3-5B4D U+67E9 # +3-5B4E U+67B8 # +3-5B4F U+67E4 # +3-5B50 U+67DE # +3-5B51 U+67DD # +3-5B52 U+67E2 # +3-5B53 U+67EE # +3-5B54 U+67B9 # +3-5B55 U+67CE # +3-5B56 U+67C6 # +3-5B57 U+67E7 # +3-5B58 U+6A9C # +3-5B59 U+681E # +3-5B5A U+6846 # +3-5B5B U+6829 # +3-5B5C U+6840 # +3-5B5D U+684D # +3-5B5E U+6832 # +3-5B5F U+684E # +3-5B60 U+68B3 # +3-5B61 U+682B # +3-5B62 U+6859 # +3-5B63 U+6863 # +3-5B64 U+6877 # +3-5B65 U+687F # +3-5B66 U+689F # +3-5B67 U+688F # +3-5B68 U+68AD # +3-5B69 U+6894 # +3-5B6A U+689D # +3-5B6B U+689B # +3-5B6C U+6883 # +3-5B6D U+6AAE # +3-5B6E U+68B9 # +3-5B6F U+6874 # +3-5B70 U+68B5 # +3-5B71 U+68A0 # +3-5B72 U+68BA # +3-5B73 U+690F # +3-5B74 U+688D # +3-5B75 U+687E # +3-5B76 U+6901 # +3-5B77 U+68CA # +3-5B78 U+6908 # +3-5B79 U+68D8 # +3-5B7A U+6922 # +3-5B7B U+6926 # +3-5B7C U+68E1 # +3-5B7D U+690C # +3-5B7E U+68CD # +3-5C21 U+68D4 # +3-5C22 U+68E7 # +3-5C23 U+68D5 # +3-5C24 U+6936 # +3-5C25 U+6912 # +3-5C26 U+6904 # +3-5C27 U+68D7 # +3-5C28 U+68E3 # +3-5C29 U+6925 # +3-5C2A U+68F9 # +3-5C2B U+68E0 # +3-5C2C U+68EF # +3-5C2D U+6928 # +3-5C2E U+692A # +3-5C2F U+691A # +3-5C30 U+6923 # +3-5C31 U+6921 # +3-5C32 U+68C6 # +3-5C33 U+6979 # +3-5C34 U+6977 # +3-5C35 U+695C # +3-5C36 U+6978 # +3-5C37 U+696B # +3-5C38 U+6954 # +3-5C39 U+697E # +3-5C3A U+696E # +3-5C3B U+6939 # +3-5C3C U+6974 # +3-5C3D U+693D # +3-5C3E U+6959 # +3-5C3F U+6930 # +3-5C40 U+6961 # +3-5C41 U+695E # +3-5C42 U+695D # +3-5C43 U+6981 # +3-5C44 U+696A # +3-5C45 U+69B2 # +3-5C46 U+69AE # +3-5C47 U+69D0 # +3-5C48 U+69BF # +3-5C49 U+69C1 # +3-5C4A U+69D3 # +3-5C4B U+69BE # +3-5C4C U+69CE # +3-5C4D U+5BE8 # +3-5C4E U+69CA # +3-5C4F U+69DD # +3-5C50 U+69BB # +3-5C51 U+69C3 # +3-5C52 U+69A7 # +3-5C53 U+6A2E # +3-5C54 U+6991 # +3-5C55 U+69A0 # +3-5C56 U+699C # +3-5C57 U+6995 # +3-5C58 U+69B4 # +3-5C59 U+69DE # +3-5C5A U+69E8 # +3-5C5B U+6A02 # +3-5C5C U+6A1B # +3-5C5D U+69FF # +3-5C5E U+6B0A # +3-5C5F U+69F9 # +3-5C60 U+69F2 # +3-5C61 U+69E7 # +3-5C62 U+6A05 # +3-5C63 U+69B1 # +3-5C64 U+6A1E # +3-5C65 U+69ED # +3-5C66 U+6A14 # +3-5C67 U+69EB # +3-5C68 U+6A0A # +3-5C69 U+6A12 # +3-5C6A U+6AC1 # +3-5C6B U+6A23 # +3-5C6C U+6A13 # +3-5C6D U+6A44 # +3-5C6E U+6A0C # +3-5C6F U+6A72 # +3-5C70 U+6A36 # +3-5C71 U+6A78 # +3-5C72 U+6A47 # +3-5C73 U+6A62 # +3-5C74 U+6A59 # +3-5C75 U+6A66 # +3-5C76 U+6A48 # +3-5C77 U+6A38 # +3-5C78 U+6A22 # +3-5C79 U+6A90 # +3-5C7A U+6A8D # +3-5C7B U+6AA0 # +3-5C7C U+6A84 # +3-5C7D U+6AA2 # +3-5C7E U+6AA3 # +3-5D21 U+6A97 # +3-5D22 U+8617 # +3-5D23 U+6ABB # +3-5D24 U+6AC3 # +3-5D25 U+6AC2 # +3-5D26 U+6AB8 # +3-5D27 U+6AB3 # +3-5D28 U+6AAC # +3-5D29 U+6ADE # +3-5D2A U+6AD1 # +3-5D2B U+6ADF # +3-5D2C U+6AAA # +3-5D2D U+6ADA # +3-5D2E U+6AEA # +3-5D2F U+6AFB # +3-5D30 U+6B05 # +3-5D31 U+8616 # +3-5D32 U+6AFA # +3-5D33 U+6B12 # +3-5D34 U+6B16 # +3-5D35 U+9B31 # +3-5D36 U+6B1F # +3-5D37 U+6B38 # +3-5D38 U+6B37 # +3-5D39 U+76DC # +3-5D3A U+6B39 # +3-5D3B U+98EE # +3-5D3C U+6B47 # +3-5D3D U+6B43 # +3-5D3E U+6B49 # +3-5D3F U+6B50 # +3-5D40 U+6B59 # +3-5D41 U+6B54 # +3-5D42 U+6B5B # +3-5D43 U+6B5F # +3-5D44 U+6B61 # +3-5D45 U+6B78 # +3-5D46 U+6B79 # +3-5D47 U+6B7F # +3-5D48 U+6B80 # +3-5D49 U+6B84 # +3-5D4A U+6B83 # +3-5D4B U+6B8D # +3-5D4C U+6B98 # +3-5D4D U+6B95 # +3-5D4E U+6B9E # +3-5D4F U+6BA4 # +3-5D50 U+6BAA # +3-5D51 U+6BAB # +3-5D52 U+6BAF # +3-5D53 U+6BB2 # +3-5D54 U+6BB1 # +3-5D55 U+6BB3 # +3-5D56 U+6BB7 # +3-5D57 U+6BBC # +3-5D58 U+6BC6 # +3-5D59 U+6BCB # +3-5D5A U+6BD3 # +3-5D5B U+6BDF # +3-5D5C U+6BEC # +3-5D5D U+6BEB # +3-5D5E U+6BF3 # +3-5D5F U+6BEF # +3-5D60 U+9EBE # +3-5D61 U+6C08 # +3-5D62 U+6C13 # +3-5D63 U+6C14 # +3-5D64 U+6C1B # +3-5D65 U+6C24 # +3-5D66 U+6C23 # +3-5D67 U+6C5E # +3-5D68 U+6C55 # +3-5D69 U+6C62 # +3-5D6A U+6C6A # +3-5D6B U+6C82 # +3-5D6C U+6C8D # +3-5D6D U+6C9A # +3-5D6E U+6C81 # +3-5D6F U+6C9B # +3-5D70 U+6C7E # +3-5D71 U+6C68 # +3-5D72 U+6C73 # +3-5D73 U+6C92 # +3-5D74 U+6C90 # +3-5D75 U+6CC4 # +3-5D76 U+6CF1 # +3-5D77 U+6CD3 # +3-5D78 U+6CBD # +3-5D79 U+6CD7 # +3-5D7A U+6CC5 # +3-5D7B U+6CDD # +3-5D7C U+6CAE # +3-5D7D U+6CB1 # +3-5D7E U+6CBE # +3-5E21 U+6CBA # +3-5E22 U+6CDB # +3-5E23 U+6CEF # +3-5E24 U+6CD9 # +3-5E25 U+6CEA # +3-5E26 U+6D1F # +3-5E27 U+884D # +3-5E28 U+6D36 # +3-5E29 U+6D2B # +3-5E2A U+6D3D # +3-5E2B U+6D38 # +3-5E2C U+6D19 # +3-5E2D U+6D35 # +3-5E2E U+6D33 # +3-5E2F U+6D12 # +3-5E30 U+6D0C # +3-5E31 U+6D63 # +3-5E32 U+6D93 # +3-5E33 U+6D64 # +3-5E34 U+6D5A # +3-5E35 U+6D79 # +3-5E36 U+6D59 # +3-5E37 U+6D8E # +3-5E38 U+6D95 # +3-5E39 U+6FE4 # +3-5E3A U+6D85 # +3-5E3B U+6DF9 # +3-5E3C U+6E15 # +3-5E3D U+6E0A # +3-5E3E U+6DB5 # +3-5E3F U+6DC7 # +3-5E40 U+6DE6 # +3-5E41 U+6DB8 # +3-5E42 U+6DC6 # +3-5E43 U+6DEC # +3-5E44 U+6DDE # +3-5E45 U+6DCC # +3-5E46 U+6DE8 # +3-5E47 U+6DD2 # +3-5E48 U+6DC5 # +3-5E49 U+6DFA # +3-5E4A U+6DD9 # +3-5E4B U+6DE4 # +3-5E4C U+6DD5 # +3-5E4D U+6DEA # +3-5E4E U+6DEE # +3-5E4F U+6E2D # +3-5E50 U+6E6E # +3-5E51 U+6E2E # +3-5E52 U+6E19 # +3-5E53 U+6E72 # +3-5E54 U+6E5F # +3-5E55 U+6E3E # +3-5E56 U+6E23 # +3-5E57 U+6E6B # +3-5E58 U+6E2B # +3-5E59 U+6E76 # +3-5E5A U+6E4D # +3-5E5B U+6E1F # +3-5E5C U+6E43 # +3-5E5D U+6E3A # +3-5E5E U+6E4E # +3-5E5F U+6E24 # +3-5E60 U+6EFF # +3-5E61 U+6E1D # +3-5E62 U+6E38 # +3-5E63 U+6E82 # +3-5E64 U+6EAA # +3-5E65 U+6E98 # +3-5E66 U+6EC9 # +3-5E67 U+6EB7 # +3-5E68 U+6ED3 # +3-5E69 U+6EBD # +3-5E6A U+6EAF # +3-5E6B U+6EC4 # +3-5E6C U+6EB2 # +3-5E6D U+6ED4 # +3-5E6E U+6ED5 # +3-5E6F U+6E8F # +3-5E70 U+6EA5 # +3-5E71 U+6EC2 # +3-5E72 U+6E9F # +3-5E73 U+6F41 # +3-5E74 U+6F11 # +3-5E75 U+704C # +3-5E76 U+6EEC # +3-5E77 U+6EF8 # +3-5E78 U+6EFE # +3-5E79 U+6F3F # +3-5E7A U+6EF2 # +3-5E7B U+6F31 # +3-5E7C U+6EEF # +3-5E7D U+6F32 # +3-5E7E U+6ECC # +3-5F21 U+6F3E # +3-5F22 U+6F13 # +3-5F23 U+6EF7 # +3-5F24 U+6F86 # +3-5F25 U+6F7A # +3-5F26 U+6F78 # +3-5F27 U+6F81 # +3-5F28 U+6F80 # +3-5F29 U+6F6F # +3-5F2A U+6F5B # +3-5F2B U+6FF3 # +3-5F2C U+6F6D # +3-5F2D U+6F82 # +3-5F2E U+6F7C # +3-5F2F U+6F58 # +3-5F30 U+6F8E # +3-5F31 U+6F91 # +3-5F32 U+6FC2 # +3-5F33 U+6F66 # +3-5F34 U+6FB3 # +3-5F35 U+6FA3 # +3-5F36 U+6FA1 # +3-5F37 U+6FA4 # +3-5F38 U+6FB9 # +3-5F39 U+6FC6 # +3-5F3A U+6FAA # +3-5F3B U+6FDF # +3-5F3C U+6FD5 # +3-5F3D U+6FEC # +3-5F3E U+6FD4 # +3-5F3F U+6FD8 # +3-5F40 U+6FF1 # +3-5F41 U+6FEE # +3-5F42 U+6FDB # +3-5F43 U+7009 # +3-5F44 U+700B # +3-5F45 U+6FFA # +3-5F46 U+7011 # +3-5F47 U+7001 # +3-5F48 U+700F # +3-5F49 U+6FFE # +3-5F4A U+701B # +3-5F4B U+701A # +3-5F4C U+6F74 # +3-5F4D U+701D # +3-5F4E U+7018 # +3-5F4F U+701F # +3-5F50 U+7030 # +3-5F51 U+703E # +3-5F52 U+7032 # +3-5F53 U+7051 # +3-5F54 U+7063 # +3-5F55 U+7099 # +3-5F56 U+7092 # +3-5F57 U+70AF # +3-5F58 U+70F1 # +3-5F59 U+70AC # +3-5F5A U+70B8 # +3-5F5B U+70B3 # +3-5F5C U+70AE # +3-5F5D U+70DF # +3-5F5E U+70CB # +3-5F5F U+70DD # +3-5F60 U+70D9 # +3-5F61 U+7109 # +3-5F62 U+70FD # +3-5F63 U+711C # +3-5F64 U+7119 # +3-5F65 U+7165 # +3-5F66 U+7155 # +3-5F67 U+7188 # +3-5F68 U+7166 # +3-5F69 U+7162 # +3-5F6A U+714C # +3-5F6B U+7156 # +3-5F6C U+716C # +3-5F6D U+718F # +3-5F6E U+71FB # +3-5F6F U+7184 # +3-5F70 U+7195 # +3-5F71 U+71A8 # +3-5F72 U+71AC # +3-5F73 U+71D7 # +3-5F74 U+71B9 # +3-5F75 U+71BE # +3-5F76 U+71D2 # +3-5F77 U+71C9 # +3-5F78 U+71D4 # +3-5F79 U+71CE # +3-5F7A U+71E0 # +3-5F7B U+71EC # +3-5F7C U+71E7 # +3-5F7D U+71F5 # +3-5F7E U+71FC # +3-6021 U+71F9 # +3-6022 U+71FF # +3-6023 U+720D # +3-6024 U+7210 # +3-6025 U+721B # +3-6026 U+7228 # +3-6027 U+722D # +3-6028 U+722C # +3-6029 U+7230 # +3-602A U+7232 # +3-602B U+723B # +3-602C U+723C # +3-602D U+723F # +3-602E U+7240 # +3-602F U+7246 # +3-6030 U+724B # +3-6031 U+7258 # +3-6032 U+7274 # +3-6033 U+727E # +3-6034 U+7282 # +3-6035 U+7281 # +3-6036 U+7287 # +3-6037 U+7292 # +3-6038 U+7296 # +3-6039 U+72A2 # +3-603A U+72A7 # +3-603B U+72B9 # +3-603C U+72B2 # +3-603D U+72C3 # +3-603E U+72C6 # +3-603F U+72C4 # +3-6040 U+72CE # +3-6041 U+72D2 # +3-6042 U+72E2 # +3-6043 U+72E0 # +3-6044 U+72E1 # +3-6045 U+72F9 # +3-6046 U+72F7 # +3-6047 U+500F # +3-6048 U+7317 # +3-6049 U+730A # +3-604A U+731C # +3-604B U+7316 # +3-604C U+731D # +3-604D U+7334 # +3-604E U+732F # +3-604F U+7329 # +3-6050 U+7325 # +3-6051 U+733E # +3-6052 U+734E # +3-6053 U+734F # +3-6054 U+9ED8 # +3-6055 U+7357 # +3-6056 U+736A # +3-6057 U+7368 # +3-6058 U+7370 # +3-6059 U+7378 # +3-605A U+7375 # +3-605B U+737B # +3-605C U+737A # +3-605D U+73C8 # +3-605E U+73B3 # +3-605F U+73CE # +3-6060 U+73BB # +3-6061 U+73C0 # +3-6062 U+73E5 # +3-6063 U+73EE # +3-6064 U+73DE # +3-6065 U+74A2 # +3-6066 U+7405 # +3-6067 U+746F # +3-6068 U+7425 # +3-6069 U+73F8 # +3-606A U+7432 # +3-606B U+743A # +3-606C U+7455 # +3-606D U+743F # +3-606E U+745F # +3-606F U+7459 # +3-6070 U+7441 # +3-6071 U+745C # +3-6072 U+7469 # +3-6073 U+7470 # +3-6074 U+7463 # +3-6075 U+746A # +3-6076 U+7476 # +3-6077 U+747E # +3-6078 U+748B # +3-6079 U+749E # +3-607A U+74A7 # +3-607B U+74CA # +3-607C U+74CF # +3-607D U+74D4 # +3-607E U+73F1 # +3-6121 U+74E0 # +3-6122 U+74E3 # +3-6123 U+74E7 # +3-6124 U+74E9 # +3-6125 U+74EE # +3-6126 U+74F2 # +3-6127 U+74F0 # +3-6128 U+74F1 # +3-6129 U+74F8 # +3-612A U+74F7 # +3-612B U+7504 # +3-612C U+7503 # +3-612D U+7505 # +3-612E U+750C # +3-612F U+750E # +3-6130 U+750D # +3-6131 U+7515 # +3-6132 U+7513 # +3-6133 U+751E # +3-6134 U+7526 # +3-6135 U+752C # +3-6136 U+753C # +3-6137 U+7544 # +3-6138 U+754D # +3-6139 U+754A # +3-613A U+7549 # +3-613B U+755B # +3-613C U+7546 # +3-613D U+755A # +3-613E U+7569 # +3-613F U+7564 # +3-6140 U+7567 # +3-6141 U+756B # +3-6142 U+756D # +3-6143 U+7578 # +3-6144 U+7576 # +3-6145 U+7586 # +3-6146 U+7587 # +3-6147 U+7574 # +3-6148 U+758A # +3-6149 U+7589 # +3-614A U+7582 # +3-614B U+7594 # +3-614C U+759A # +3-614D U+759D # +3-614E U+75A5 # +3-614F U+75A3 # +3-6150 U+75C2 # +3-6151 U+75B3 # +3-6152 U+75C3 # +3-6153 U+75B5 # +3-6154 U+75BD # +3-6155 U+75B8 # +3-6156 U+75BC # +3-6157 U+75B1 # +3-6158 U+75CD # +3-6159 U+75CA # +3-615A U+75D2 # +3-615B U+75D9 # +3-615C U+75E3 # +3-615D U+75DE # +3-615E U+75FE # +3-615F U+75FF # +3-6160 U+75FC # +3-6161 U+7601 # +3-6162 U+75F0 # +3-6163 U+75FA # +3-6164 U+75F2 # +3-6165 U+75F3 # +3-6166 U+760B # +3-6167 U+760D # +3-6168 U+7609 # +3-6169 U+761F # +3-616A U+7627 # +3-616B U+7620 # +3-616C U+7621 # +3-616D U+7622 # +3-616E U+7624 # +3-616F U+7634 # +3-6170 U+7630 # +3-6171 U+763B # +3-6172 U+7647 # +3-6173 U+7648 # +3-6174 U+7646 # +3-6175 U+765C # +3-6176 U+7658 # +3-6177 U+7661 # +3-6178 U+7662 # +3-6179 U+7668 # +3-617A U+7669 # +3-617B U+766A # +3-617C U+7667 # +3-617D U+766C # +3-617E U+7670 # +3-6221 U+7672 # +3-6222 U+7676 # +3-6223 U+7678 # +3-6224 U+767C # +3-6225 U+7680 # +3-6226 U+7683 # +3-6227 U+7688 # +3-6228 U+768B # +3-6229 U+768E # +3-622A U+7696 # +3-622B U+7693 # +3-622C U+7699 # +3-622D U+769A # +3-622E U+76B0 # +3-622F U+76B4 # +3-6230 U+76B8 # +3-6231 U+76B9 # +3-6232 U+76BA # +3-6233 U+76C2 # +3-6234 U+76CD # +3-6235 U+76D6 # +3-6236 U+76D2 # +3-6237 U+76DE # +3-6238 U+76E1 # +3-6239 U+76E5 # +3-623A U+76E7 # +3-623B U+76EA # +3-623C U+862F # +3-623D U+76FB # +3-623E U+7708 # +3-623F U+7707 # +3-6240 U+7704 # +3-6241 U+7729 # +3-6242 U+7724 # +3-6243 U+771E # +3-6244 U+7725 # +3-6245 U+7726 # +3-6246 U+771B # +3-6247 U+7737 # +3-6248 U+7738 # +3-6249 U+7747 # +3-624A U+775A # +3-624B U+7768 # +3-624C U+776B # +3-624D U+775B # +3-624E U+7765 # +3-624F U+777F # +3-6250 U+777E # +3-6251 U+7779 # +3-6252 U+778E # +3-6253 U+778B # +3-6254 U+7791 # +3-6255 U+77A0 # +3-6256 U+779E # +3-6257 U+77B0 # +3-6258 U+77B6 # +3-6259 U+77B9 # +3-625A U+77BF # +3-625B U+77BC # +3-625C U+77BD # +3-625D U+77BB # +3-625E U+77C7 # +3-625F U+77CD # +3-6260 U+77D7 # +3-6261 U+77DA # +3-6262 U+77DC # +3-6263 U+77E3 # +3-6264 U+77EE # +3-6265 U+77FC # +3-6266 U+780C # +3-6267 U+7812 # +3-6268 U+7926 # +3-6269 U+7820 # +3-626A U+792A # +3-626B U+7845 # +3-626C U+788E # +3-626D U+7874 # +3-626E U+7886 # +3-626F U+787C # +3-6270 U+789A # +3-6271 U+788C # +3-6272 U+78A3 # +3-6273 U+78B5 # +3-6274 U+78AA # +3-6275 U+78AF # +3-6276 U+78D1 # +3-6277 U+78C6 # +3-6278 U+78CB # +3-6279 U+78D4 # +3-627A U+78BE # +3-627B U+78BC # +3-627C U+78C5 # +3-627D U+78CA # +3-627E U+78EC # +3-6321 U+78E7 # +3-6322 U+78DA # +3-6323 U+78FD # +3-6324 U+78F4 # +3-6325 U+7907 # +3-6326 U+7912 # +3-6327 U+7911 # +3-6328 U+7919 # +3-6329 U+792C # +3-632A U+792B # +3-632B U+7940 # +3-632C U+7960 # +3-632D U+7957 # +3-632E U+795F # +3-632F U+795A # +3-6330 U+7955 # +3-6331 U+7953 # +3-6332 U+797A # +3-6333 U+797F # +3-6334 U+798A # +3-6335 U+799D # +3-6336 U+79A7 # +3-6337 U+9F4B # +3-6338 U+79AA # +3-6339 U+79AE # +3-633A U+79B3 # +3-633B U+79B9 # +3-633C U+79BA # +3-633D U+79C9 # +3-633E U+79D5 # +3-633F U+79E7 # +3-6340 U+79EC # +3-6341 U+79E1 # +3-6342 U+79E3 # +3-6343 U+7A08 # +3-6344 U+7A0D # +3-6345 U+7A18 # +3-6346 U+7A19 # +3-6347 U+7A20 # +3-6348 U+7A1F # +3-6349 U+7980 # +3-634A U+7A31 # +3-634B U+7A3B # +3-634C U+7A3E # +3-634D U+7A37 # +3-634E U+7A43 # +3-634F U+7A57 # +3-6350 U+7A49 # +3-6351 U+7A61 # +3-6352 U+7A62 # +3-6353 U+7A69 # +3-6354 U+9F9D # +3-6355 U+7A70 # +3-6356 U+7A79 # +3-6357 U+7A7D # +3-6358 U+7A88 # +3-6359 U+7A97 # +3-635A U+7A95 # +3-635B U+7A98 # +3-635C U+7A96 # +3-635D U+7AA9 # +3-635E U+7AC8 # +3-635F U+7AB0 # +3-6360 U+7AB6 # +3-6361 U+7AC5 # +3-6362 U+7AC4 # +3-6363 U+7ABF # +3-6364 U+9083 # +3-6365 U+7AC7 # +3-6366 U+7ACA # +3-6367 U+7ACD # +3-6368 U+7ACF # +3-6369 U+7AD5 # +3-636A U+7AD3 # +3-636B U+7AD9 # +3-636C U+7ADA # +3-636D U+7ADD # +3-636E U+7AE1 # +3-636F U+7AE2 # +3-6370 U+7AE6 # +3-6371 U+7AED # +3-6372 U+7AF0 # +3-6373 U+7B02 # +3-6374 U+7B0F # +3-6375 U+7B0A # +3-6376 U+7B06 # +3-6377 U+7B33 # +3-6378 U+7B18 # +3-6379 U+7B19 # +3-637A U+7B1E # +3-637B U+7B35 # +3-637C U+7B28 # +3-637D U+7B36 # +3-637E U+7B50 # +3-6421 U+7B7A # +3-6422 U+7B04 # +3-6423 U+7B4D # +3-6424 U+7B0B # +3-6425 U+7B4C # +3-6426 U+7B45 # +3-6427 U+7B75 # +3-6428 U+7B65 # +3-6429 U+7B74 # +3-642A U+7B67 # +3-642B U+7B70 # +3-642C U+7B71 # +3-642D U+7B6C # +3-642E U+7B6E # +3-642F U+7B9D # +3-6430 U+7B98 # +3-6431 U+7B9F # +3-6432 U+7B8D # +3-6433 U+7B9C # +3-6434 U+7B9A # +3-6435 U+7B8B # +3-6436 U+7B92 # +3-6437 U+7B8F # +3-6438 U+7B5D # +3-6439 U+7B99 # +3-643A U+7BCB # +3-643B U+7BC1 # +3-643C U+7BCC # +3-643D U+7BCF # +3-643E U+7BB4 # +3-643F U+7BC6 # +3-6440 U+7BDD # +3-6441 U+7BE9 # +3-6442 U+7C11 # +3-6443 U+7C14 # +3-6444 U+7BE6 # +3-6445 U+7BE5 # +3-6446 U+7C60 # +3-6447 U+7C00 # +3-6448 U+7C07 # +3-6449 U+7C13 # +3-644A U+7BF3 # +3-644B U+7BF7 # +3-644C U+7C17 # +3-644D U+7C0D # +3-644E U+7BF6 # +3-644F U+7C23 # +3-6450 U+7C27 # +3-6451 U+7C2A # +3-6452 U+7C1F # +3-6453 U+7C37 # +3-6454 U+7C2B # +3-6455 U+7C3D # +3-6456 U+7C4C # +3-6457 U+7C43 # +3-6458 U+7C54 # +3-6459 U+7C4F # +3-645A U+7C40 # +3-645B U+7C50 # +3-645C U+7C58 # +3-645D U+7C5F # +3-645E U+7C64 # +3-645F U+7C56 # +3-6460 U+7C65 # +3-6461 U+7C6C # +3-6462 U+7C75 # +3-6463 U+7C83 # +3-6464 U+7C90 # +3-6465 U+7CA4 # +3-6466 U+7CAD # +3-6467 U+7CA2 # +3-6468 U+7CAB # +3-6469 U+7CA1 # +3-646A U+7CA8 # +3-646B U+7CB3 # +3-646C U+7CB2 # +3-646D U+7CB1 # +3-646E U+7CAE # +3-646F U+7CB9 # +3-6470 U+7CBD # +3-6471 U+7CC0 # +3-6472 U+7CC5 # +3-6473 U+7CC2 # +3-6474 U+7CD8 # +3-6475 U+7CD2 # +3-6476 U+7CDC # +3-6477 U+7CE2 # +3-6478 U+9B3B # +3-6479 U+7CEF # +3-647A U+7CF2 # +3-647B U+7CF4 # +3-647C U+7CF6 # +3-647D U+7CFA # +3-647E U+7D06 # +3-6521 U+7D02 # +3-6522 U+7D1C # +3-6523 U+7D15 # +3-6524 U+7D0A # +3-6525 U+7D45 # +3-6526 U+7D4B # +3-6527 U+7D2E # +3-6528 U+7D32 # +3-6529 U+7D3F # +3-652A U+7D35 # +3-652B U+7D46 # +3-652C U+7D73 # +3-652D U+7D56 # +3-652E U+7D4E # +3-652F U+7D72 # +3-6530 U+7D68 # +3-6531 U+7D6E # +3-6532 U+7D4F # +3-6533 U+7D63 # +3-6534 U+7D93 # +3-6535 U+7D89 # +3-6536 U+7D5B # +3-6537 U+7D8F # +3-6538 U+7D7D # +3-6539 U+7D9B # +3-653A U+7DBA # +3-653B U+7DAE # +3-653C U+7DA3 # +3-653D U+7DB5 # +3-653E U+7DC7 # +3-653F U+7DBD # +3-6540 U+7DAB # +3-6541 U+7E3D # +3-6542 U+7DA2 # +3-6543 U+7DAF # +3-6544 U+7DDC # +3-6545 U+7DB8 # +3-6546 U+7D9F # +3-6547 U+7DB0 # +3-6548 U+7DD8 # +3-6549 U+7DDD # +3-654A U+7DE4 # +3-654B U+7DDE # +3-654C U+7DFB # +3-654D U+7DF2 # +3-654E U+7DE1 # +3-654F U+7E05 # +3-6550 U+7E0A # +3-6551 U+7E23 # +3-6552 U+7E21 # +3-6553 U+7E12 # +3-6554 U+7E31 # +3-6555 U+7E1F # +3-6556 U+7E09 # +3-6557 U+7E0B # +3-6558 U+7E22 # +3-6559 U+7E46 # +3-655A U+7E66 # +3-655B U+7E3B # +3-655C U+7E35 # +3-655D U+7E39 # +3-655E U+7E43 # +3-655F U+7E37 # +3-6560 U+7E32 # +3-6561 U+7E3A # +3-6562 U+7E67 # +3-6563 U+7E5D # +3-6564 U+7E56 # +3-6565 U+7E5E # +3-6566 U+7E59 # +3-6567 U+7E5A # +3-6568 U+7E79 # +3-6569 U+7E6A # +3-656A U+7E69 # +3-656B U+7E7C # +3-656C U+7E7B # +3-656D U+7E83 # +3-656E U+7DD5 # +3-656F U+7E7D # +3-6570 U+8FAE # +3-6571 U+7E7F # +3-6572 U+7E88 # +3-6573 U+7E89 # +3-6574 U+7E8C # +3-6575 U+7E92 # +3-6576 U+7E90 # +3-6577 U+7E93 # +3-6578 U+7E94 # +3-6579 U+7E96 # +3-657A U+7E8E # +3-657B U+7E9B # +3-657C U+7E9C # +3-657D U+7F38 # +3-657E U+7F3A # +3-6621 U+7F45 # +3-6622 U+7F4C # +3-6623 U+7F4D # +3-6624 U+7F4E # +3-6625 U+7F50 # +3-6626 U+7F51 # +3-6627 U+7F55 # +3-6628 U+7F54 # +3-6629 U+7F58 # +3-662A U+7F5F # +3-662B U+7F60 # +3-662C U+7F68 # +3-662D U+7F69 # +3-662E U+7F67 # +3-662F U+7F78 # +3-6630 U+7F82 # +3-6631 U+7F86 # +3-6632 U+7F83 # +3-6633 U+7F88 # +3-6634 U+7F87 # +3-6635 U+7F8C # +3-6636 U+7F94 # +3-6637 U+7F9E # +3-6638 U+7F9D # +3-6639 U+7F9A # +3-663A U+7FA3 # +3-663B U+7FAF # +3-663C U+7FB2 # +3-663D U+7FB9 # +3-663E U+7FAE # +3-663F U+7FB6 # +3-6640 U+7FB8 # +3-6641 U+8B71 # +3-6642 U+7FC5 # +3-6643 U+7FC6 # +3-6644 U+7FCA # +3-6645 U+7FD5 # +3-6646 U+7FD4 # +3-6647 U+7FE1 # +3-6648 U+7FE6 # +3-6649 U+7FE9 # +3-664A U+7FF3 # +3-664B U+7FF9 # +3-664C U+98DC # +3-664D U+8006 # +3-664E U+8004 # +3-664F U+800B # +3-6650 U+8012 # +3-6651 U+8018 # +3-6652 U+8019 # +3-6653 U+801C # +3-6654 U+8021 # +3-6655 U+8028 # +3-6656 U+803F # +3-6657 U+803B # +3-6658 U+804A # +3-6659 U+8046 # +3-665A U+8052 # +3-665B U+8058 # +3-665C U+805A # +3-665D U+805F # +3-665E U+8062 # +3-665F U+8068 # +3-6660 U+8073 # +3-6661 U+8072 # +3-6662 U+8070 # +3-6663 U+8076 # +3-6664 U+8079 # +3-6665 U+807D # +3-6666 U+807F # +3-6667 U+8084 # +3-6668 U+8086 # +3-6669 U+8085 # +3-666A U+809B # +3-666B U+8093 # +3-666C U+809A # +3-666D U+80AD # +3-666E U+5190 # +3-666F U+80AC # +3-6670 U+80DB # +3-6671 U+80E5 # +3-6672 U+80D9 # +3-6673 U+80DD # +3-6674 U+80C4 # +3-6675 U+80DA # +3-6676 U+80D6 # +3-6677 U+8109 # +3-6678 U+80EF # +3-6679 U+80F1 # +3-667A U+811B # +3-667B U+8129 # +3-667C U+8123 # +3-667D U+812F # +3-667E U+814B # +3-6721 U+968B # +3-6722 U+8146 # +3-6723 U+813E # +3-6724 U+8153 # +3-6725 U+8151 # +3-6726 U+80FC # +3-6727 U+8171 # +3-6728 U+816E # +3-6729 U+8165 # +3-672A U+8166 # +3-672B U+8174 # +3-672C U+8183 # +3-672D U+8188 # +3-672E U+818A # +3-672F U+8180 # +3-6730 U+8182 # +3-6731 U+81A0 # +3-6732 U+8195 # +3-6733 U+81A4 # +3-6734 U+81A3 # +3-6735 U+815F # +3-6736 U+8193 # +3-6737 U+81A9 # +3-6738 U+81B0 # +3-6739 U+81B5 # +3-673A U+81BE # +3-673B U+81B8 # +3-673C U+81BD # +3-673D U+81C0 # +3-673E U+81C2 # +3-673F U+81BA # +3-6740 U+81C9 # +3-6741 U+81CD # +3-6742 U+81D1 # +3-6743 U+81D9 # +3-6744 U+81D8 # +3-6745 U+81C8 # +3-6746 U+81DA # +3-6747 U+81DF # +3-6748 U+81E0 # +3-6749 U+81E7 # +3-674A U+81FA # +3-674B U+81FB # +3-674C U+81FE # +3-674D U+8201 # +3-674E U+8202 # +3-674F U+8205 # +3-6750 U+8207 # +3-6751 U+820A # +3-6752 U+820D # +3-6753 U+8210 # +3-6754 U+8216 # +3-6755 U+8229 # +3-6756 U+822B # +3-6757 U+8238 # +3-6758 U+8233 # +3-6759 U+8240 # +3-675A U+8259 # +3-675B U+8258 # +3-675C U+825D # +3-675D U+825A # +3-675E U+825F # +3-675F U+8264 # +3-6760 U+8262 # +3-6761 U+8268 # +3-6762 U+826A # +3-6763 U+826B # +3-6764 U+822E # +3-6765 U+8271 # +3-6766 U+8277 # +3-6767 U+8278 # +3-6768 U+827E # +3-6769 U+828D # +3-676A U+8292 # +3-676B U+82AB # +3-676C U+829F # +3-676D U+82BB # +3-676E U+82AC # +3-676F U+82E1 # +3-6770 U+82E3 # +3-6771 U+82DF # +3-6772 U+82D2 # +3-6773 U+82F4 # +3-6774 U+82F3 # +3-6775 U+82FA # +3-6776 U+8393 # +3-6777 U+8303 # +3-6778 U+82FB # +3-6779 U+82F9 # +3-677A U+82DE # +3-677B U+8306 # +3-677C U+82DC # +3-677D U+8309 # +3-677E U+82D9 # +3-6821 U+8335 # +3-6822 U+8334 # +3-6823 U+8316 # +3-6824 U+8332 # +3-6825 U+8331 # +3-6826 U+8340 # +3-6827 U+8339 # +3-6828 U+8350 # +3-6829 U+8345 # +3-682A U+832F # +3-682B U+832B # +3-682C U+8317 # +3-682D U+8318 # +3-682E U+8385 # +3-682F U+839A # +3-6830 U+83AA # +3-6831 U+839F # +3-6832 U+83A2 # +3-6833 U+8396 # +3-6834 U+8323 # +3-6835 U+838E # +3-6836 U+8387 # +3-6837 U+838A # +3-6838 U+837C # +3-6839 U+83B5 # +3-683A U+8373 # +3-683B U+8375 # +3-683C U+83A0 # +3-683D U+8389 # +3-683E U+83A8 # +3-683F U+83F4 # +3-6840 U+8413 # +3-6841 U+83EB # +3-6842 U+83CE # +3-6843 U+83FD # +3-6844 U+8403 # +3-6845 U+83D8 # +3-6846 U+840B # +3-6847 U+83C1 # +3-6848 U+83F7 # +3-6849 U+8407 # +3-684A U+83E0 # +3-684B U+83F2 # +3-684C U+840D # +3-684D U+8422 # +3-684E U+8420 # +3-684F U+83BD # +3-6850 U+8438 # +3-6851 U+8506 # +3-6852 U+83FB # +3-6853 U+846D # +3-6854 U+842A # +3-6855 U+843C # +3-6856 U+855A # +3-6857 U+8484 # +3-6858 U+8477 # +3-6859 U+846B # +3-685A U+84AD # +3-685B U+846E # +3-685C U+8482 # +3-685D U+8469 # +3-685E U+8446 # +3-685F U+842C # +3-6860 U+846F # +3-6861 U+8479 # +3-6862 U+8435 # +3-6863 U+84CA # +3-6864 U+8462 # +3-6865 U+84B9 # +3-6866 U+84BF # +3-6867 U+849F # +3-6868 U+84D9 # +3-6869 U+84CD # +3-686A U+84BB # +3-686B U+84DA # +3-686C U+84D0 # +3-686D U+84C1 # +3-686E U+84C6 # +3-686F U+84D6 # +3-6870 U+84A1 # +3-6871 U+8521 # +3-6872 U+84FF # +3-6873 U+84F4 # +3-6874 U+8517 # +3-6875 U+8518 # +3-6876 U+852C # +3-6877 U+851F # +3-6878 U+8515 # +3-6879 U+8514 # +3-687A U+84FC # +3-687B U+8540 # +3-687C U+8563 # +3-687D U+8558 # +3-687E U+8548 # +3-6921 U+8541 # +3-6922 U+8602 # +3-6923 U+854B # +3-6924 U+8555 # +3-6925 U+8580 # +3-6926 U+85A4 # +3-6927 U+8588 # +3-6928 U+8591 # +3-6929 U+858A # +3-692A U+85A8 # +3-692B U+856D # +3-692C U+8594 # +3-692D U+859B # +3-692E U+85EA # +3-692F U+8587 # +3-6930 U+859C # +3-6931 U+8577 # +3-6932 U+857E # +3-6933 U+8590 # +3-6934 U+85C9 # +3-6935 U+85BA # +3-6936 U+85CF # +3-6937 U+85B9 # +3-6938 U+85D0 # +3-6939 U+85D5 # +3-693A U+85DD # +3-693B U+85E5 # +3-693C U+85DC # +3-693D U+85F9 # +3-693E U+860A # +3-693F U+8613 # +3-6940 U+860B # +3-6941 U+85FE # +3-6942 U+85FA # +3-6943 U+8606 # +3-6944 U+8622 # +3-6945 U+861A # +3-6946 U+8630 # +3-6947 U+863F # +3-6948 U+864D # +3-6949 U+4E55 # +3-694A U+8654 # +3-694B U+865F # +3-694C U+8667 # +3-694D U+8671 # +3-694E U+8693 # +3-694F U+86A3 # +3-6950 U+86A9 # +3-6951 U+86AA # +3-6952 U+868B # +3-6953 U+868C # +3-6954 U+86B6 # +3-6955 U+86AF # +3-6956 U+86C4 # +3-6957 U+86C6 # +3-6958 U+86B0 # +3-6959 U+86C9 # +3-695A U+8823 # +3-695B U+86AB # +3-695C U+86D4 # +3-695D U+86DE # +3-695E U+86E9 # +3-695F U+86EC # +3-6960 U+86DF # +3-6961 U+86DB # +3-6962 U+86EF # +3-6963 U+8712 # +3-6964 U+8706 # +3-6965 U+8708 # +3-6966 U+8700 # +3-6967 U+8703 # +3-6968 U+86FB # +3-6969 U+8711 # +3-696A U+8709 # +3-696B U+870D # +3-696C U+86F9 # +3-696D U+870A # +3-696E U+8734 # +3-696F U+873F # +3-6970 U+8737 # +3-6971 U+873B # +3-6972 U+8725 # +3-6973 U+8729 # +3-6974 U+871A # +3-6975 U+8760 # +3-6976 U+875F # +3-6977 U+8778 # +3-6978 U+874C # +3-6979 U+874E # +3-697A U+8774 # +3-697B U+8757 # +3-697C U+8768 # +3-697D U+876E # +3-697E U+8759 # +3-6A21 U+8753 # +3-6A22 U+8763 # +3-6A23 U+876A # +3-6A24 U+8805 # +3-6A25 U+87A2 # +3-6A26 U+879F # +3-6A27 U+8782 # +3-6A28 U+87AF # +3-6A29 U+87CB # +3-6A2A U+87BD # +3-6A2B U+87C0 # +3-6A2C U+87D0 # +3-6A2D U+96D6 # +3-6A2E U+87AB # +3-6A2F U+87C4 # +3-6A30 U+87B3 # +3-6A31 U+87C7 # +3-6A32 U+87C6 # +3-6A33 U+87BB # +3-6A34 U+87EF # +3-6A35 U+87F2 # +3-6A36 U+87E0 # +3-6A37 U+880F # +3-6A38 U+880D # +3-6A39 U+87FE # +3-6A3A U+87F6 # +3-6A3B U+87F7 # +3-6A3C U+880E # +3-6A3D U+87D2 # +3-6A3E U+8811 # +3-6A3F U+8816 # +3-6A40 U+8815 # +3-6A41 U+8822 # +3-6A42 U+8821 # +3-6A43 U+8831 # +3-6A44 U+8836 # +3-6A45 U+8839 # +3-6A46 U+8827 # +3-6A47 U+883B # +3-6A48 U+8844 # +3-6A49 U+8842 # +3-6A4A U+8852 # +3-6A4B U+8859 # +3-6A4C U+885E # +3-6A4D U+8862 # +3-6A4E U+886B # +3-6A4F U+8881 # +3-6A50 U+887E # +3-6A51 U+889E # +3-6A52 U+8875 # +3-6A53 U+887D # +3-6A54 U+88B5 # +3-6A55 U+8872 # +3-6A56 U+8882 # +3-6A57 U+8897 # +3-6A58 U+8892 # +3-6A59 U+88AE # +3-6A5A U+8899 # +3-6A5B U+88A2 # +3-6A5C U+888D # +3-6A5D U+88A4 # +3-6A5E U+88B0 # +3-6A5F U+88BF # +3-6A60 U+88B1 # +3-6A61 U+88C3 # +3-6A62 U+88C4 # +3-6A63 U+88D4 # +3-6A64 U+88D8 # +3-6A65 U+88D9 # +3-6A66 U+88DD # +3-6A67 U+88F9 # +3-6A68 U+8902 # +3-6A69 U+88FC # +3-6A6A U+88F4 # +3-6A6B U+88E8 # +3-6A6C U+88F2 # +3-6A6D U+8904 # +3-6A6E U+890C # +3-6A6F U+890A # +3-6A70 U+8913 # +3-6A71 U+8943 # +3-6A72 U+891E # +3-6A73 U+8925 # +3-6A74 U+892A # +3-6A75 U+892B # +3-6A76 U+8941 # +3-6A77 U+8944 # +3-6A78 U+893B # +3-6A79 U+8936 # +3-6A7A U+8938 # +3-6A7B U+894C # +3-6A7C U+891D # +3-6A7D U+8960 # +3-6A7E U+895E # +3-6B21 U+8966 # +3-6B22 U+8964 # +3-6B23 U+896D # +3-6B24 U+896A # +3-6B25 U+896F # +3-6B26 U+8974 # +3-6B27 U+8977 # +3-6B28 U+897E # +3-6B29 U+8983 # +3-6B2A U+8988 # +3-6B2B U+898A # +3-6B2C U+8993 # +3-6B2D U+8998 # +3-6B2E U+89A1 # +3-6B2F U+89A9 # +3-6B30 U+89A6 # +3-6B31 U+89AC # +3-6B32 U+89AF # +3-6B33 U+89B2 # +3-6B34 U+89BA # +3-6B35 U+89BD # +3-6B36 U+89BF # +3-6B37 U+89C0 # +3-6B38 U+89DA # +3-6B39 U+89DC # +3-6B3A U+89DD # +3-6B3B U+89E7 # +3-6B3C U+89F4 # +3-6B3D U+89F8 # +3-6B3E U+8A03 # +3-6B3F U+8A16 # +3-6B40 U+8A10 # +3-6B41 U+8A0C # +3-6B42 U+8A1B # +3-6B43 U+8A1D # +3-6B44 U+8A25 # +3-6B45 U+8A36 # +3-6B46 U+8A41 # +3-6B47 U+8A5B # +3-6B48 U+8A52 # +3-6B49 U+8A46 # +3-6B4A U+8A48 # +3-6B4B U+8A7C # +3-6B4C U+8A6D # +3-6B4D U+8A6C # +3-6B4E U+8A62 # +3-6B4F U+8A85 # +3-6B50 U+8A82 # +3-6B51 U+8A84 # +3-6B52 U+8AA8 # +3-6B53 U+8AA1 # +3-6B54 U+8A91 # +3-6B55 U+8AA5 # +3-6B56 U+8AA6 # +3-6B57 U+8A9A # +3-6B58 U+8AA3 # +3-6B59 U+8AC4 # +3-6B5A U+8ACD # +3-6B5B U+8AC2 # +3-6B5C U+8ADA # +3-6B5D U+8AEB # +3-6B5E U+8AF3 # +3-6B5F U+8AE7 # +3-6B60 U+8AE4 # +3-6B61 U+8AF1 # +3-6B62 U+8B14 # +3-6B63 U+8AE0 # +3-6B64 U+8AE2 # +3-6B65 U+8AF7 # +3-6B66 U+8ADE # +3-6B67 U+8ADB # +3-6B68 U+8B0C # +3-6B69 U+8B07 # +3-6B6A U+8B1A # +3-6B6B U+8AE1 # +3-6B6C U+8B16 # +3-6B6D U+8B10 # +3-6B6E U+8B17 # +3-6B6F U+8B20 # +3-6B70 U+8B33 # +3-6B71 U+97AB # +3-6B72 U+8B26 # +3-6B73 U+8B2B # +3-6B74 U+8B3E # +3-6B75 U+8B28 # +3-6B76 U+8B41 # +3-6B77 U+8B4C # +3-6B78 U+8B4F # +3-6B79 U+8B4E # +3-6B7A U+8B49 # +3-6B7B U+8B56 # +3-6B7C U+8B5B # +3-6B7D U+8B5A # +3-6B7E U+8B6B # +3-6C21 U+8B5F # +3-6C22 U+8B6C # +3-6C23 U+8B6F # +3-6C24 U+8B74 # +3-6C25 U+8B7D # +3-6C26 U+8B80 # +3-6C27 U+8B8C # +3-6C28 U+8B8E # +3-6C29 U+8B92 # +3-6C2A U+8B93 # +3-6C2B U+8B96 # +3-6C2C U+8B99 # +3-6C2D U+8B9A # +3-6C2E U+8C3A # +3-6C2F U+8C41 # +3-6C30 U+8C3F # +3-6C31 U+8C48 # +3-6C32 U+8C4C # +3-6C33 U+8C4E # +3-6C34 U+8C50 # +3-6C35 U+8C55 # +3-6C36 U+8C62 # +3-6C37 U+8C6C # +3-6C38 U+8C78 # +3-6C39 U+8C7A # +3-6C3A U+8C82 # +3-6C3B U+8C89 # +3-6C3C U+8C85 # +3-6C3D U+8C8A # +3-6C3E U+8C8D # +3-6C3F U+8C8E # +3-6C40 U+8C94 # +3-6C41 U+8C7C # +3-6C42 U+8C98 # +3-6C43 U+621D # +3-6C44 U+8CAD # +3-6C45 U+8CAA # +3-6C46 U+8CBD # +3-6C47 U+8CB2 # +3-6C48 U+8CB3 # +3-6C49 U+8CAE # +3-6C4A U+8CB6 # +3-6C4B U+8CC8 # +3-6C4C U+8CC1 # +3-6C4D U+8CE4 # +3-6C4E U+8CE3 # +3-6C4F U+8CDA # +3-6C50 U+8CFD # +3-6C51 U+8CFA # +3-6C52 U+8CFB # +3-6C53 U+8D04 # +3-6C54 U+8D05 # +3-6C55 U+8D0A # +3-6C56 U+8D07 # +3-6C57 U+8D0F # +3-6C58 U+8D0D # +3-6C59 U+8D10 # +3-6C5A U+9F4E # +3-6C5B U+8D13 # +3-6C5C U+8CCD # +3-6C5D U+8D14 # +3-6C5E U+8D16 # +3-6C5F U+8D67 # +3-6C60 U+8D6D # +3-6C61 U+8D71 # +3-6C62 U+8D73 # +3-6C63 U+8D81 # +3-6C64 U+8D99 # +3-6C65 U+8DC2 # +3-6C66 U+8DBE # +3-6C67 U+8DBA # +3-6C68 U+8DCF # +3-6C69 U+8DDA # +3-6C6A U+8DD6 # +3-6C6B U+8DCC # +3-6C6C U+8DDB # +3-6C6D U+8DCB # +3-6C6E U+8DEA # +3-6C6F U+8DEB # +3-6C70 U+8DDF # +3-6C71 U+8DE3 # +3-6C72 U+8DFC # +3-6C73 U+8E08 # +3-6C74 U+8E09 # +3-6C75 U+8DFF # +3-6C76 U+8E1D # +3-6C77 U+8E1E # +3-6C78 U+8E10 # +3-6C79 U+8E1F # +3-6C7A U+8E42 # +3-6C7B U+8E35 # +3-6C7C U+8E30 # +3-6C7D U+8E34 # +3-6C7E U+8E4A # +3-6D21 U+8E47 # +3-6D22 U+8E49 # +3-6D23 U+8E4C # +3-6D24 U+8E50 # +3-6D25 U+8E48 # +3-6D26 U+8E59 # +3-6D27 U+8E64 # +3-6D28 U+8E60 # +3-6D29 U+8E2A # +3-6D2A U+8E63 # +3-6D2B U+8E55 # +3-6D2C U+8E76 # +3-6D2D U+8E72 # +3-6D2E U+8E7C # +3-6D2F U+8E81 # +3-6D30 U+8E87 # +3-6D31 U+8E85 # +3-6D32 U+8E84 # +3-6D33 U+8E8B # +3-6D34 U+8E8A # +3-6D35 U+8E93 # +3-6D36 U+8E91 # +3-6D37 U+8E94 # +3-6D38 U+8E99 # +3-6D39 U+8EAA # +3-6D3A U+8EA1 # +3-6D3B U+8EAC # +3-6D3C U+8EB0 # +3-6D3D U+8EC6 # +3-6D3E U+8EB1 # +3-6D3F U+8EBE # +3-6D40 U+8EC5 # +3-6D41 U+8EC8 # +3-6D42 U+8ECB # +3-6D43 U+8EDB # +3-6D44 U+8EE3 # +3-6D45 U+8EFC # +3-6D46 U+8EFB # +3-6D47 U+8EEB # +3-6D48 U+8EFE # +3-6D49 U+8F0A # +3-6D4A U+8F05 # +3-6D4B U+8F15 # +3-6D4C U+8F12 # +3-6D4D U+8F19 # +3-6D4E U+8F13 # +3-6D4F U+8F1C # +3-6D50 U+8F1F # +3-6D51 U+8F1B # +3-6D52 U+8F0C # +3-6D53 U+8F26 # +3-6D54 U+8F33 # +3-6D55 U+8F3B # +3-6D56 U+8F39 # +3-6D57 U+8F45 # +3-6D58 U+8F42 # +3-6D59 U+8F3E # +3-6D5A U+8F4C # +3-6D5B U+8F49 # +3-6D5C U+8F46 # +3-6D5D U+8F4E # +3-6D5E U+8F57 # +3-6D5F U+8F5C # +3-6D60 U+8F62 # +3-6D61 U+8F63 # +3-6D62 U+8F64 # +3-6D63 U+8F9C # +3-6D64 U+8F9F # +3-6D65 U+8FA3 # +3-6D66 U+8FAD # +3-6D67 U+8FAF # +3-6D68 U+8FB7 # +3-6D69 U+8FDA # +3-6D6A U+8FE5 # +3-6D6B U+8FE2 # +3-6D6C U+8FEA # +3-6D6D U+8FEF # +3-6D6E U+9087 # +3-6D6F U+8FF4 # +3-6D70 U+9005 # +3-6D71 U+8FF9 # +3-6D72 U+8FFA # +3-6D73 U+9011 # +3-6D74 U+9015 # +3-6D75 U+9021 # +3-6D76 U+900D # +3-6D77 U+901E # +3-6D78 U+9016 # +3-6D79 U+900B # +3-6D7A U+9027 # +3-6D7B U+9036 # +3-6D7C U+9035 # +3-6D7D U+9039 # +3-6D7E U+8FF8 # +3-6E21 U+904F # +3-6E22 U+9050 # +3-6E23 U+9051 # +3-6E24 U+9052 # +3-6E25 U+900E # +3-6E26 U+9049 # +3-6E27 U+903E # +3-6E28 U+9056 # +3-6E29 U+9058 # +3-6E2A U+905E # +3-6E2B U+9068 # +3-6E2C U+906F # +3-6E2D U+9076 # +3-6E2E U+96A8 # +3-6E2F U+9072 # +3-6E30 U+9082 # +3-6E31 U+907D # +3-6E32 U+9081 # +3-6E33 U+9080 # +3-6E34 U+908A # +3-6E35 U+9089 # +3-6E36 U+908F # +3-6E37 U+90A8 # +3-6E38 U+90AF # +3-6E39 U+90B1 # +3-6E3A U+90B5 # +3-6E3B U+90E2 # +3-6E3C U+90E4 # +3-6E3D U+6248 # +3-6E3E U+90DB # +3-6E3F U+9102 # +3-6E40 U+9112 # +3-6E41 U+9119 # +3-6E42 U+9132 # +3-6E43 U+9130 # +3-6E44 U+914A # +3-6E45 U+9156 # +3-6E46 U+9158 # +3-6E47 U+9163 # +3-6E48 U+9165 # +3-6E49 U+9169 # +3-6E4A U+9173 # +3-6E4B U+9172 # +3-6E4C U+918B # +3-6E4D U+9189 # +3-6E4E U+9182 # +3-6E4F U+91A2 # +3-6E50 U+91AB # +3-6E51 U+91AF # +3-6E52 U+91AA # +3-6E53 U+91B5 # +3-6E54 U+91B4 # +3-6E55 U+91BA # +3-6E56 U+91C0 # +3-6E57 U+91C1 # +3-6E58 U+91C9 # +3-6E59 U+91CB # +3-6E5A U+91D0 # +3-6E5B U+91D6 # +3-6E5C U+91DF # +3-6E5D U+91E1 # +3-6E5E U+91DB # +3-6E5F U+91FC # +3-6E60 U+91F5 # +3-6E61 U+91F6 # +3-6E62 U+921E # +3-6E63 U+91FF # +3-6E64 U+9214 # +3-6E65 U+922C # +3-6E66 U+9215 # +3-6E67 U+9211 # +3-6E68 U+925E # +3-6E69 U+9257 # +3-6E6A U+9245 # +3-6E6B U+9249 # +3-6E6C U+9264 # +3-6E6D U+9248 # +3-6E6E U+9295 # +3-6E6F U+923F # +3-6E70 U+924B # +3-6E71 U+9250 # +3-6E72 U+929C # +3-6E73 U+9296 # +3-6E74 U+9293 # +3-6E75 U+929B # +3-6E76 U+925A # +3-6E77 U+92CF # +3-6E78 U+92B9 # +3-6E79 U+92B7 # +3-6E7A U+92E9 # +3-6E7B U+930F # +3-6E7C U+92FA # +3-6E7D U+9344 # +3-6E7E U+932E # +3-6F21 U+9319 # +3-6F22 U+9322 # +3-6F23 U+931A # +3-6F24 U+9323 # +3-6F25 U+933A # +3-6F26 U+9335 # +3-6F27 U+933B # +3-6F28 U+935C # +3-6F29 U+9360 # +3-6F2A U+937C # +3-6F2B U+936E # +3-6F2C U+9356 # +3-6F2D U+93B0 # +3-6F2E U+93AC # +3-6F2F U+93AD # +3-6F30 U+9394 # +3-6F31 U+93B9 # +3-6F32 U+93D6 # +3-6F33 U+93D7 # +3-6F34 U+93E8 # +3-6F35 U+93E5 # +3-6F36 U+93D8 # +3-6F37 U+93C3 # +3-6F38 U+93DD # +3-6F39 U+93D0 # +3-6F3A U+93C8 # +3-6F3B U+93E4 # +3-6F3C U+941A # +3-6F3D U+9414 # +3-6F3E U+9413 # +3-6F3F U+9403 # +3-6F40 U+9407 # +3-6F41 U+9410 # +3-6F42 U+9436 # +3-6F43 U+942B # +3-6F44 U+9435 # +3-6F45 U+9421 # +3-6F46 U+943A # +3-6F47 U+9441 # +3-6F48 U+9452 # +3-6F49 U+9444 # +3-6F4A U+945B # +3-6F4B U+9460 # +3-6F4C U+9462 # +3-6F4D U+945E # +3-6F4E U+946A # +3-6F4F U+9229 # +3-6F50 U+9470 # +3-6F51 U+9475 # +3-6F52 U+9477 # +3-6F53 U+947D # +3-6F54 U+945A # +3-6F55 U+947C # +3-6F56 U+947E # +3-6F57 U+9481 # +3-6F58 U+947F # +3-6F59 U+9582 # +3-6F5A U+9587 # +3-6F5B U+958A # +3-6F5C U+9594 # +3-6F5D U+9596 # +3-6F5E U+9598 # +3-6F5F U+9599 # +3-6F60 U+95A0 # +3-6F61 U+95A8 # +3-6F62 U+95A7 # +3-6F63 U+95AD # +3-6F64 U+95BC # +3-6F65 U+95BB # +3-6F66 U+95B9 # +3-6F67 U+95BE # +3-6F68 U+95CA # +3-6F69 U+6FF6 # +3-6F6A U+95C3 # +3-6F6B U+95CD # +3-6F6C U+95CC # +3-6F6D U+95D5 # +3-6F6E U+95D4 # +3-6F6F U+95D6 # +3-6F70 U+95DC # +3-6F71 U+95E1 # +3-6F72 U+95E5 # +3-6F73 U+95E2 # +3-6F74 U+9621 # +3-6F75 U+9628 # +3-6F76 U+962E # +3-6F77 U+962F # +3-6F78 U+9642 # +3-6F79 U+964C # +3-6F7A U+964F # +3-6F7B U+964B # +3-6F7C U+9677 # +3-6F7D U+965C # +3-6F7E U+965E # +3-7021 U+965D # +3-7022 U+965F # +3-7023 U+9666 # +3-7024 U+9672 # +3-7025 U+966C # +3-7026 U+968D # +3-7027 U+9698 # +3-7028 U+9695 # +3-7029 U+9697 # +3-702A U+96AA # +3-702B U+96A7 # +3-702C U+96B1 # +3-702D U+96B2 # +3-702E U+96B0 # +3-702F U+96B4 # +3-7030 U+96B6 # +3-7031 U+96B8 # +3-7032 U+96B9 # +3-7033 U+96CE # +3-7034 U+96CB # +3-7035 U+96C9 # +3-7036 U+96CD # +3-7037 U+894D # +3-7038 U+96DC # +3-7039 U+970D # +3-703A U+96D5 # +3-703B U+96F9 # +3-703C U+9704 # +3-703D U+9706 # +3-703E U+9708 # +3-703F U+9713 # +3-7040 U+970E # +3-7041 U+9711 # +3-7042 U+970F # +3-7043 U+9716 # +3-7044 U+9719 # +3-7045 U+9724 # +3-7046 U+972A # +3-7047 U+9730 # +3-7048 U+9739 # +3-7049 U+973D # +3-704A U+973E # +3-704B U+9744 # +3-704C U+9746 # +3-704D U+9748 # +3-704E U+9742 # +3-704F U+9749 # +3-7050 U+975C # +3-7051 U+9760 # +3-7052 U+9764 # +3-7053 U+9766 # +3-7054 U+9768 # +3-7055 U+52D2 # +3-7056 U+976B # +3-7057 U+9771 # +3-7058 U+9779 # +3-7059 U+9785 # +3-705A U+977C # +3-705B U+9781 # +3-705C U+977A # +3-705D U+9786 # +3-705E U+978B # +3-705F U+978F # +3-7060 U+9790 # +3-7061 U+979C # +3-7062 U+97A8 # +3-7063 U+97A6 # +3-7064 U+97A3 # +3-7065 U+97B3 # +3-7066 U+97B4 # +3-7067 U+97C3 # +3-7068 U+97C6 # +3-7069 U+97C8 # +3-706A U+97CB # +3-706B U+97DC # +3-706C U+97ED # +3-706D U+9F4F # +3-706E U+97F2 # +3-706F U+7ADF # +3-7070 U+97F6 # +3-7071 U+97F5 # +3-7072 U+980F # +3-7073 U+980C # +3-7074 U+9838 # +3-7075 U+9824 # +3-7076 U+9821 # +3-7077 U+9837 # +3-7078 U+983D # +3-7079 U+9846 # +3-707A U+984F # +3-707B U+984B # +3-707C U+986B # +3-707D U+986F # +3-707E U+9870 # +3-7121 U+9871 # +3-7122 U+9874 # +3-7123 U+9873 # +3-7124 U+98AA # +3-7125 U+98AF # +3-7126 U+98B1 # +3-7127 U+98B6 # +3-7128 U+98C4 # +3-7129 U+98C3 # +3-712A U+98C6 # +3-712B U+98E9 # +3-712C U+98EB # +3-712D U+9903 # +3-712E U+9909 # +3-712F U+9912 # +3-7130 U+9914 # +3-7131 U+9918 # +3-7132 U+9921 # +3-7133 U+991D # +3-7134 U+991E # +3-7135 U+9924 # +3-7136 U+9920 # +3-7137 U+992C # +3-7138 U+992E # +3-7139 U+993D # +3-713A U+993E # +3-713B U+9942 # +3-713C U+9949 # +3-713D U+9945 # +3-713E U+9950 # +3-713F U+994B # +3-7140 U+9951 # +3-7141 U+9952 # +3-7142 U+994C # +3-7143 U+9955 # +3-7144 U+9997 # +3-7145 U+9998 # +3-7146 U+99A5 # +3-7147 U+99AD # +3-7148 U+99AE # +3-7149 U+99BC # +3-714A U+99DF # +3-714B U+99DB # +3-714C U+99DD # +3-714D U+99D8 # +3-714E U+99D1 # +3-714F U+99ED # +3-7150 U+99EE # +3-7151 U+99F1 # +3-7152 U+99F2 # +3-7153 U+99FB # +3-7154 U+99F8 # +3-7155 U+9A01 # +3-7156 U+9A0F # +3-7157 U+9A05 # +3-7158 U+99E2 # +3-7159 U+9A19 # +3-715A U+9A2B # +3-715B U+9A37 # +3-715C U+9A45 # +3-715D U+9A42 # +3-715E U+9A40 # +3-715F U+9A43 # +3-7160 U+9A3E # +3-7161 U+9A55 # +3-7162 U+9A4D # +3-7163 U+9A5B # +3-7164 U+9A57 # +3-7165 U+9A5F # +3-7166 U+9A62 # +3-7167 U+9A65 # +3-7168 U+9A64 # +3-7169 U+9A69 # +3-716A U+9A6B # +3-716B U+9A6A # +3-716C U+9AAD # +3-716D U+9AB0 # +3-716E U+9ABC # +3-716F U+9AC0 # +3-7170 U+9ACF # +3-7171 U+9AD1 # +3-7172 U+9AD3 # +3-7173 U+9AD4 # +3-7174 U+9ADE # +3-7175 U+9ADF # +3-7176 U+9AE2 # +3-7177 U+9AE3 # +3-7178 U+9AE6 # +3-7179 U+9AEF # +3-717A U+9AEB # +3-717B U+9AEE # +3-717C U+9AF4 # +3-717D U+9AF1 # +3-717E U+9AF7 # +3-7221 U+9AFB # +3-7222 U+9B06 # +3-7223 U+9B18 # +3-7224 U+9B1A # +3-7225 U+9B1F # +3-7226 U+9B22 # +3-7227 U+9B23 # +3-7228 U+9B25 # +3-7229 U+9B27 # +3-722A U+9B28 # +3-722B U+9B29 # +3-722C U+9B2A # +3-722D U+9B2E # +3-722E U+9B2F # +3-722F U+9B32 # +3-7230 U+9B44 # +3-7231 U+9B43 # +3-7232 U+9B4F # +3-7233 U+9B4D # +3-7234 U+9B4E # +3-7235 U+9B51 # +3-7236 U+9B58 # +3-7237 U+9B74 # +3-7238 U+9B93 # +3-7239 U+9B83 # +3-723A U+9B91 # +3-723B U+9B96 # +3-723C U+9B97 # +3-723D U+9B9F # +3-723E U+9BA0 # +3-723F U+9BA8 # +3-7240 U+9BB4 # +3-7241 U+9BC0 # +3-7242 U+9BCA # +3-7243 U+9BB9 # +3-7244 U+9BC6 # +3-7245 U+9BCF # +3-7246 U+9BD1 # +3-7247 U+9BD2 # +3-7248 U+9BE3 # +3-7249 U+9BE2 # +3-724A U+9BE4 # +3-724B U+9BD4 # +3-724C U+9BE1 # +3-724D U+9C3A # +3-724E U+9BF2 # +3-724F U+9BF1 # +3-7250 U+9BF0 # +3-7251 U+9C15 # +3-7252 U+9C14 # +3-7253 U+9C09 # +3-7254 U+9C13 # +3-7255 U+9C0C # +3-7256 U+9C06 # +3-7257 U+9C08 # +3-7258 U+9C12 # +3-7259 U+9C0A # +3-725A U+9C04 # +3-725B U+9C2E # +3-725C U+9C1B # +3-725D U+9C25 # +3-725E U+9C24 # +3-725F U+9C21 # +3-7260 U+9C30 # +3-7261 U+9C47 # +3-7262 U+9C32 # +3-7263 U+9C46 # +3-7264 U+9C3E # +3-7265 U+9C5A # +3-7266 U+9C60 # +3-7267 U+9C67 # +3-7268 U+9C76 # +3-7269 U+9C78 # +3-726A U+9CE7 # +3-726B U+9CEC # +3-726C U+9CF0 # +3-726D U+9D09 # +3-726E U+9D08 # +3-726F U+9CEB # +3-7270 U+9D03 # +3-7271 U+9D06 # +3-7272 U+9D2A # +3-7273 U+9D26 # +3-7274 U+9DAF # +3-7275 U+9D23 # +3-7276 U+9D1F # +3-7277 U+9D44 # +3-7278 U+9D15 # +3-7279 U+9D12 # +3-727A U+9D41 # +3-727B U+9D3F # +3-727C U+9D3E # +3-727D U+9D46 # +3-727E U+9D48 # +3-7321 U+9D5D # +3-7322 U+9D5E # +3-7323 U+9D64 # +3-7324 U+9D51 # +3-7325 U+9D50 # +3-7326 U+9D59 # +3-7327 U+9D72 # +3-7328 U+9D89 # +3-7329 U+9D87 # +3-732A U+9DAB # +3-732B U+9D6F # +3-732C U+9D7A # +3-732D U+9D9A # +3-732E U+9DA4 # +3-732F U+9DA9 # +3-7330 U+9DB2 # +3-7331 U+9DC4 # +3-7332 U+9DC1 # +3-7333 U+9DBB # +3-7334 U+9DB8 # +3-7335 U+9DBA # +3-7336 U+9DC6 # +3-7337 U+9DCF # +3-7338 U+9DC2 # +3-7339 U+9DD9 # +3-733A U+9DD3 # +3-733B U+9DF8 # +3-733C U+9DE6 # +3-733D U+9DED # +3-733E U+9DEF # +3-733F U+9DFD # +3-7340 U+9E1A # +3-7341 U+9E1B # +3-7342 U+9E1E # +3-7343 U+9E75 # +3-7344 U+9E79 # +3-7345 U+9E7D # +3-7346 U+9E81 # +3-7347 U+9E88 # +3-7348 U+9E8B # +3-7349 U+9E8C # +3-734A U+9E92 # +3-734B U+9E95 # +3-734C U+9E91 # +3-734D U+9E9D # +3-734E U+9EA5 # +3-734F U+9EA9 # +3-7350 U+9EB8 # +3-7351 U+9EAA # +3-7352 U+9EAD # +3-7353 U+9761 # +3-7354 U+9ECC # +3-7355 U+9ECE # +3-7356 U+9ECF # +3-7357 U+9ED0 # +3-7358 U+9ED4 # +3-7359 U+9EDC # +3-735A U+9EDE # +3-735B U+9EDD # +3-735C U+9EE0 # +3-735D U+9EE5 # +3-735E U+9EE8 # +3-735F U+9EEF # +3-7360 U+9EF4 # +3-7361 U+9EF6 # +3-7362 U+9EF7 # +3-7363 U+9EF9 # +3-7364 U+9EFB # +3-7365 U+9EFC # +3-7366 U+9EFD # +3-7367 U+9F07 # +3-7368 U+9F08 # +3-7369 U+76B7 # +3-736A U+9F15 # +3-736B U+9F21 # +3-736C U+9F2C # +3-736D U+9F3E # +3-736E U+9F4A # +3-736F U+9F52 # +3-7370 U+9F54 # +3-7371 U+9F63 # +3-7372 U+9F5F # +3-7373 U+9F60 # +3-7374 U+9F61 # +3-7375 U+9F66 # +3-7376 U+9F67 # +3-7377 U+9F6C # +3-7378 U+9F6A # +3-7379 U+9F77 # +3-737A U+9F72 # +3-737B U+9F76 # +3-737C U+9F95 # +3-737D U+9F9C # +3-737E U+9FA0 # +3-7421 U+582F # [1983] +3-7422 U+69C7 # [1983] +3-7423 U+9059 # [1983] +3-7424 U+7464 # [1983] +3-7425 U+51DC # [1990] +3-7426 U+7199 # [1990] +3-7427 U+5653 # [2004] +3-7428 U+5DE2 # [2000] +3-7429 U+5E14 # [2000] +3-742A U+5E18 # [2000] +3-742B U+5E58 # [2000] +3-742C U+5E5E # [2000] +3-742D U+5EBE # [2000] +3-742E U+F928 # CJK COMPATIBILITY IDEOGRAPH-F928 [2000] +3-742F U+5ECB # [2000] +3-7430 U+5EF9 # [2000] +3-7431 U+5F00 # [2000] +3-7432 U+5F02 # [2000] +3-7433 U+5F07 # [2000] +3-7434 U+5F1D # [2000] +3-7435 U+5F23 # [2000] +3-7436 U+5F34 # [2000] +3-7437 U+5F36 # [2000] +3-7438 U+5F3D # [2000] +3-7439 U+5F40 # [2000] +3-743A U+5F45 # [2000] +3-743B U+5F54 # [2000] +3-743C U+5F58 # [2000] +3-743D U+5F64 # [2000] +3-743E U+5F67 # [2000] +3-743F U+5F7D # [2000] +3-7440 U+5F89 # [2000] +3-7441 U+5F9C # [2000] +3-7442 U+5FA7 # [2000] +3-7443 U+5FAF # [2000] +3-7444 U+5FB5 # [2000] +3-7445 U+5FB7 # [2000] +3-7446 U+5FC9 # [2000] +3-7447 U+5FDE # [2000] +3-7448 U+5FE1 # [2000] +3-7449 U+5FE9 # [2000] +3-744A U+600D # [2000] +3-744B U+6014 # [2000] +3-744C U+6018 # [2000] +3-744D U+6033 # [2000] +3-744E U+6035 # [2000] +3-744F U+6047 # [2000] +3-7450 U+FA3D # CJK COMPATIBILITY IDEOGRAPH-FA3D [2000] [Unicode3.2] +3-7451 U+609D # [2000] +3-7452 U+609E # [2000] +3-7453 U+60CB # [2000] +3-7454 U+60D4 # [2000] +3-7455 U+60D5 # [2000] +3-7456 U+60DD # [2000] +3-7457 U+60F8 # [2000] +3-7458 U+611C # [2000] +3-7459 U+612B # [2000] +3-745A U+6130 # [2000] +3-745B U+6137 # [2000] +3-745C U+FA3E # CJK COMPATIBILITY IDEOGRAPH-FA3E [2000] [Unicode3.2] +3-745D U+618D # [2000] +3-745E U+FA3F # CJK COMPATIBILITY IDEOGRAPH-FA3F [2000] [Unicode3.2] +3-745F U+61BC # [2000] +3-7460 U+61B9 # [2000] +3-7461 U+FA40 # CJK COMPATIBILITY IDEOGRAPH-FA40 [2000] [Unicode3.2] +3-7462 U+6222 # [2000] +3-7463 U+623E # [2000] +3-7464 U+6243 # [2000] +3-7465 U+6256 # [2000] +3-7466 U+625A # [2000] +3-7467 U+626F # [2000] +3-7468 U+6285 # [2000] +3-7469 U+62C4 # [2000] +3-746A U+62D6 # [2000] +3-746B U+62FC # [2000] +3-746C U+630A # [2000] +3-746D U+6318 # [2000] +3-746E U+6339 # [2000] +3-746F U+6343 # [2000] +3-7470 U+6365 # [2000] +3-7471 U+637C # [2000] +3-7472 U+63E5 # [2000] +3-7473 U+63ED # [2000] +3-7474 U+63F5 # [2000] +3-7475 U+6410 # [2000] +3-7476 U+6414 # [2000] +3-7477 U+6422 # [2000] +3-7478 U+6479 # [2000] +3-7479 U+6451 # [2000] +3-747A U+6460 # [2000] +3-747B U+646D # [2000] +3-747C U+64CE # [2000] +3-747D U+64BE # [2000] +3-747E U+64BF # [2000] +3-7521 U+64C4 # [2000] +3-7522 U+64CA # [2000] +3-7523 U+64D0 # [2000] +3-7524 U+64F7 # [2000] +3-7525 U+64FB # [2000] +3-7526 U+6522 # [2000] +3-7527 U+6529 # [2000] +3-7528 U+FA41 # CJK COMPATIBILITY IDEOGRAPH-FA41 [2000] [Unicode3.2] +3-7529 U+6567 # [2000] +3-752A U+659D # [2000] +3-752B U+FA42 # CJK COMPATIBILITY IDEOGRAPH-FA42 [2000] [Unicode3.2] +3-752C U+6600 # [2000] +3-752D U+6609 # [2000] +3-752E U+6615 # [2000] +3-752F U+661E # [2000] +3-7530 U+663A # [2000] +3-7531 U+6622 # [2000] +3-7532 U+6624 # [2000] +3-7533 U+662B # [2000] +3-7534 U+6630 # [2000] +3-7535 U+6631 # [2000] +3-7536 U+6633 # [2000] +3-7537 U+66FB # [2000] +3-7538 U+6648 # [2000] +3-7539 U+664C # [2000] +3-753A U+231C4 # [2000] [Unicode3.1] Private: U+F79A +3-753B U+6659 # [2000] +3-753C U+665A # [2000] +3-753D U+6661 # [2000] +3-753E U+6665 # [2000] +3-753F U+6673 # [2000] +3-7540 U+6677 # [2000] +3-7541 U+6678 # [2000] +3-7542 U+668D # [2000] +3-7543 U+FA43 # CJK COMPATIBILITY IDEOGRAPH-FA43 [2000] [Unicode3.2] +3-7544 U+66A0 # [2000] +3-7545 U+66B2 # [2000] +3-7546 U+66BB # [2000] +3-7547 U+66C6 # [2000] +3-7548 U+66C8 # [2000] +3-7549 U+3B22 # [2000] +3-754A U+66DB # [2000] +3-754B U+66E8 # [2000] +3-754C U+66FA # [2000] +3-754D U+6713 # [2000] +3-754E U+F929 # CJK COMPATIBILITY IDEOGRAPH-F929 [2000] +3-754F U+6733 # [2000] +3-7550 U+6766 # [2000] +3-7551 U+6747 # [2000] +3-7552 U+6748 # [2000] +3-7553 U+677B # [2000] +3-7554 U+6781 # [2000] +3-7555 U+6793 # [2000] +3-7556 U+6798 # [2000] +3-7557 U+679B # [2000] +3-7558 U+67BB # [2000] +3-7559 U+67F9 # [2000] +3-755A U+67C0 # [2000] +3-755B U+67D7 # [2000] +3-755C U+67FC # [2000] +3-755D U+6801 # [2000] +3-755E U+6852 # [2000] +3-755F U+681D # [2000] +3-7560 U+682C # [2000] +3-7561 U+6831 # [2000] +3-7562 U+685B # [2000] +3-7563 U+6872 # [2000] +3-7564 U+6875 # [2000] +3-7565 U+FA44 # CJK COMPATIBILITY IDEOGRAPH-FA44 [2000] [Unicode3.2] +3-7566 U+68A3 # [2000] +3-7567 U+68A5 # [2000] +3-7568 U+68B2 # [2000] +3-7569 U+68C8 # [2000] +3-756A U+68D0 # [2000] +3-756B U+68E8 # [2000] +3-756C U+68ED # [2000] +3-756D U+68F0 # [2000] +3-756E U+68F1 # [2000] +3-756F U+68FC # [2000] +3-7570 U+690A # [2000] +3-7571 U+6949 # [2000] +3-7572 U+235C4 # [2000] [Unicode3.1] Private: U+F79D +3-7573 U+6935 # [2000] +3-7574 U+6942 # [2000] +3-7575 U+6957 # [2000] +3-7576 U+6963 # [2000] +3-7577 U+6964 # [2000] +3-7578 U+6968 # [2000] +3-7579 U+6980 # [2000] +3-757A U+FA14 # CJK COMPATIBILITY IDEOGRAPH-FA14 [2000] +3-757B U+69A5 # [2000] +3-757C U+69AD # [2000] +3-757D U+69CF # [2000] +3-757E U+3BB6 # [2000] +3-7621 U+3BC3 # [2000] +3-7622 U+69E2 # [2000] +3-7623 U+69E9 # [2000] +3-7624 U+69EA # [2000] +3-7625 U+69F5 # [2000] +3-7626 U+69F6 # [2000] +3-7627 U+6A0F # [2000] +3-7628 U+6A15 # [2000] +3-7629 U+2373F # [2000] [Unicode3.1] Private: U+F79F +3-762A U+6A3B # [2000] +3-762B U+6A3E # [2000] +3-762C U+6A45 # [2000] +3-762D U+6A50 # [2000] +3-762E U+6A56 # [2000] +3-762F U+6A5B # [2000] +3-7630 U+6A6B # [2000] +3-7631 U+6A73 # [2000] +3-7632 U+23763 # [2000] [Unicode3.1] Private: U+F7A0 +3-7633 U+6A89 # [2000] +3-7634 U+6A94 # [2000] +3-7635 U+6A9D # [2000] +3-7636 U+6A9E # [2000] +3-7637 U+6AA5 # [2000] +3-7638 U+6AE4 # [2000] +3-7639 U+6AE7 # [2000] +3-763A U+3C0F # [2000] +3-763B U+F91D # CJK COMPATIBILITY IDEOGRAPH-F91D [2000] +3-763C U+6B1B # [2000] +3-763D U+6B1E # [2000] +3-763E U+6B2C # [2000] +3-763F U+6B35 # [2000] +3-7640 U+6B46 # [2000] +3-7641 U+6B56 # [2000] +3-7642 U+6B60 # [2000] +3-7643 U+6B65 # [2000] +3-7644 U+6B67 # [2000] +3-7645 U+6B77 # [2000] +3-7646 U+6B82 # [2000] +3-7647 U+6BA9 # [2000] +3-7648 U+6BAD # [2000] +3-7649 U+F970 # CJK COMPATIBILITY IDEOGRAPH-F970 [2000] +3-764A U+6BCF # [2000] +3-764B U+6BD6 # [2000] +3-764C U+6BD7 # [2000] +3-764D U+6BFF # [2000] +3-764E U+6C05 # [2000] +3-764F U+6C10 # [2000] +3-7650 U+6C33 # [2000] +3-7651 U+6C59 # [2000] +3-7652 U+6C5C # [2000] +3-7653 U+6CAA # [2000] +3-7654 U+6C74 # [2000] +3-7655 U+6C76 # [2000] +3-7656 U+6C85 # [2000] +3-7657 U+6C86 # [2000] +3-7658 U+6C98 # [2000] +3-7659 U+6C9C # [2000] +3-765A U+6CFB # [2000] +3-765B U+6CC6 # [2000] +3-765C U+6CD4 # [2000] +3-765D U+6CE0 # [2000] +3-765E U+6CEB # [2000] +3-765F U+6CEE # [2000] +3-7660 U+23CFE # [2000] [Unicode3.1] Private: U+F7A1 +3-7661 U+6D04 # [2000] +3-7662 U+6D0E # [2000] +3-7663 U+6D2E # [2000] +3-7664 U+6D31 # [2000] +3-7665 U+6D39 # [2000] +3-7666 U+6D3F # [2000] +3-7667 U+6D58 # [2000] +3-7668 U+6D65 # [2000] +3-7669 U+FA45 # CJK COMPATIBILITY IDEOGRAPH-FA45 [2000] [Unicode3.2] +3-766A U+6D82 # [2000] +3-766B U+6D87 # [2000] +3-766C U+6D89 # [2000] +3-766D U+6D94 # [2000] +3-766E U+6DAA # [2000] +3-766F U+6DAC # [2000] +3-7670 U+6DBF # [2000] +3-7671 U+6DC4 # [2000] +3-7672 U+6DD6 # [2000] +3-7673 U+6DDA # [2000] +3-7674 U+6DDB # [2000] +3-7675 U+6DDD # [2000] +3-7676 U+6DFC # [2000] +3-7677 U+FA46 # CJK COMPATIBILITY IDEOGRAPH-FA46 [2000] [Unicode3.2] +3-7678 U+6E34 # [2000] +3-7679 U+6E44 # [2000] +3-767A U+6E5C # [2000] +3-767B U+6E5E # [2000] +3-767C U+6EAB # [2000] +3-767D U+6EB1 # [2000] +3-767E U+6EC1 # [2000] +3-7721 U+6EC7 # [2000] +3-7722 U+6ECE # [2000] +3-7723 U+6F10 # [2000] +3-7724 U+6F1A # [2000] +3-7725 U+FA47 # CJK COMPATIBILITY IDEOGRAPH-FA47 [2000] [Unicode3.2] +3-7726 U+6F2A # [2000] +3-7727 U+6F2F # [2000] +3-7728 U+6F33 # [2000] +3-7729 U+6F51 # [2000] +3-772A U+6F59 # [2000] +3-772B U+6F5E # [2000] +3-772C U+6F61 # [2000] +3-772D U+6F62 # [2000] +3-772E U+6F7E # [2000] +3-772F U+6F88 # [2000] +3-7730 U+6F8C # [2000] +3-7731 U+6F8D # [2000] +3-7732 U+6F94 # [2000] +3-7733 U+6FA0 # [2000] +3-7734 U+6FA7 # [2000] +3-7735 U+6FB6 # [2000] +3-7736 U+6FBC # [2000] +3-7737 U+6FC7 # [2000] +3-7738 U+6FCA # [2000] +3-7739 U+6FF9 # [2000] +3-773A U+6FF0 # [2000] +3-773B U+6FF5 # [2000] +3-773C U+7005 # [2000] +3-773D U+7006 # [2000] +3-773E U+7028 # [2000] +3-773F U+704A # [2000] +3-7740 U+705D # [2000] +3-7741 U+705E # [2000] +3-7742 U+704E # [2000] +3-7743 U+7064 # [2000] +3-7744 U+7075 # [2000] +3-7745 U+7085 # [2000] +3-7746 U+70A4 # [2000] +3-7747 U+70AB # [2000] +3-7748 U+70B7 # [2000] +3-7749 U+70D4 # [2000] +3-774A U+70D8 # [2000] +3-774B U+70E4 # [2000] +3-774C U+710F # [2000] +3-774D U+712B # [2000] +3-774E U+711E # [2000] +3-774F U+7120 # [2000] +3-7750 U+712E # [2000] +3-7751 U+7130 # [2000] +3-7752 U+7146 # [2000] +3-7753 U+7147 # [2000] +3-7754 U+7151 # [2000] +3-7755 U+FA48 # CJK COMPATIBILITY IDEOGRAPH-FA48 [2000] [Unicode3.2] +3-7756 U+7152 # [2000] +3-7757 U+715C # [2000] +3-7758 U+7160 # [2000] +3-7759 U+7168 # [2000] +3-775A U+FA15 # CJK COMPATIBILITY IDEOGRAPH-FA15 [2000] +3-775B U+7185 # [2000] +3-775C U+7187 # [2000] +3-775D U+7192 # [2000] +3-775E U+71C1 # [2000] +3-775F U+71BA # [2000] +3-7760 U+71C4 # [2000] +3-7761 U+71FE # [2000] +3-7762 U+7200 # [2000] +3-7763 U+7215 # [2000] +3-7764 U+7255 # [2000] +3-7765 U+7256 # [2000] +3-7766 U+3E3F # [2000] +3-7767 U+728D # [2000] +3-7768 U+729B # [2000] +3-7769 U+72BE # [2000] +3-776A U+72C0 # [2000] +3-776B U+72FB # [2000] +3-776C U+247F1 # [2000] [Unicode3.1] Private: U+F7A6 +3-776D U+7327 # [2000] +3-776E U+7328 # [2000] +3-776F U+FA16 # CJK COMPATIBILITY IDEOGRAPH-FA16 [2000] +3-7770 U+7350 # [2000] +3-7771 U+7366 # [2000] +3-7772 U+737C # [2000] +3-7773 U+7395 # [2000] +3-7774 U+739F # [2000] +3-7775 U+73A0 # [2000] +3-7776 U+73A2 # [2000] +3-7777 U+73A6 # [2000] +3-7778 U+73AB # [2000] +3-7779 U+73C9 # [2000] +3-777A U+73CF # [2000] +3-777B U+73D6 # [2000] +3-777C U+73D9 # [2000] +3-777D U+73E3 # [2000] +3-777E U+73E9 # [2000] +3-7821 U+7407 # [2000] +3-7822 U+740A # [2000] +3-7823 U+741A # [2000] +3-7824 U+741B # [2000] +3-7825 U+FA4A # CJK COMPATIBILITY IDEOGRAPH-FA4A [2000] [Unicode3.2] +3-7826 U+7426 # [2000] +3-7827 U+7428 # [2000] +3-7828 U+742A # [2000] +3-7829 U+742B # [2000] +3-782A U+742C # [2000] +3-782B U+742E # [2000] +3-782C U+742F # [2000] +3-782D U+7430 # [2000] +3-782E U+7444 # [2000] +3-782F U+7446 # [2000] +3-7830 U+7447 # [2000] +3-7831 U+744B # [2000] +3-7832 U+7457 # [2000] +3-7833 U+7462 # [2000] +3-7834 U+746B # [2000] +3-7835 U+746D # [2000] +3-7836 U+7486 # [2000] +3-7837 U+7487 # [2000] +3-7838 U+7489 # [2000] +3-7839 U+7498 # [2000] +3-783A U+749C # [2000] +3-783B U+749F # [2000] +3-783C U+74A3 # [2000] +3-783D U+7490 # [2000] +3-783E U+74A6 # [2000] +3-783F U+74A8 # [2000] +3-7840 U+74A9 # [2000] +3-7841 U+74B5 # [2000] +3-7842 U+74BF # [2000] +3-7843 U+74C8 # [2000] +3-7844 U+74C9 # [2000] +3-7845 U+74DA # [2000] +3-7846 U+74FF # [2000] +3-7847 U+7501 # [2000] +3-7848 U+7517 # [2000] +3-7849 U+752F # [2000] +3-784A U+756F # [2000] +3-784B U+7579 # [2000] +3-784C U+7592 # [2000] +3-784D U+3F72 # [2000] +3-784E U+75CE # [2000] +3-784F U+75E4 # [2000] +3-7850 U+7600 # [2000] +3-7851 U+7602 # [2000] +3-7852 U+7608 # [2000] +3-7853 U+7615 # [2000] +3-7854 U+7616 # [2000] +3-7855 U+7619 # [2000] +3-7856 U+761E # [2000] +3-7857 U+762D # [2000] +3-7858 U+7635 # [2000] +3-7859 U+7643 # [2000] +3-785A U+764B # [2000] +3-785B U+7664 # [2000] +3-785C U+7665 # [2000] +3-785D U+766D # [2000] +3-785E U+766F # [2000] +3-785F U+7671 # [2000] +3-7860 U+7681 # [2000] +3-7861 U+769B # [2000] +3-7862 U+769D # [2000] +3-7863 U+769E # [2000] +3-7864 U+76A6 # [2000] +3-7865 U+76AA # [2000] +3-7866 U+76B6 # [2000] +3-7867 U+76C5 # [2000] +3-7868 U+76CC # [2000] +3-7869 U+76CE # [2000] +3-786A U+76D4 # [2000] +3-786B U+76E6 # [2000] +3-786C U+76F1 # [2000] +3-786D U+76FC # [2000] +3-786E U+770A # [2000] +3-786F U+7719 # [2000] +3-7870 U+7734 # [2000] +3-7871 U+7736 # [2000] +3-7872 U+7746 # [2000] +3-7873 U+774D # [2000] +3-7874 U+774E # [2000] +3-7875 U+775C # [2000] +3-7876 U+775F # [2000] +3-7877 U+7762 # [2000] +3-7878 U+777A # [2000] +3-7879 U+7780 # [2000] +3-787A U+7794 # [2000] +3-787B U+77AA # [2000] +3-787C U+77E0 # [2000] +3-787D U+782D # [2000] +3-787E U+2548E # [2000] [Unicode3.1] Private: U+F7A8 +3-7921 U+7843 # [2000] +3-7922 U+784E # [2000] +3-7923 U+784F # [2000] +3-7924 U+7851 # [2000] +3-7925 U+7868 # [2000] +3-7926 U+786E # [2000] +3-7927 U+FA4B # CJK COMPATIBILITY IDEOGRAPH-FA4B [2000] [Unicode3.2] +3-7928 U+78B0 # [2000] +3-7929 U+2550E # [2000] [Unicode3.1] Private: U+F7AA +3-792A U+78AD # [2000] +3-792B U+78E4 # [2000] +3-792C U+78F2 # [2000] +3-792D U+7900 # [2000] +3-792E U+78F7 # [2000] +3-792F U+791C # [2000] +3-7930 U+792E # [2000] +3-7931 U+7931 # [2000] +3-7932 U+7934 # [2000] +3-7933 U+FA4C # CJK COMPATIBILITY IDEOGRAPH-FA4C [2000] [Unicode3.2] +3-7934 U+FA4D # CJK COMPATIBILITY IDEOGRAPH-FA4D [2000] [Unicode3.2] +3-7935 U+7945 # [2000] +3-7936 U+7946 # [2000] +3-7937 U+FA4E # CJK COMPATIBILITY IDEOGRAPH-FA4E [2000] [Unicode3.2] +3-7938 U+FA4F # CJK COMPATIBILITY IDEOGRAPH-FA4F [2000] [Unicode3.2] +3-7939 U+FA50 # CJK COMPATIBILITY IDEOGRAPH-FA50 [2000] [Unicode3.2] +3-793A U+795C # [2000] +3-793B U+FA51 # CJK COMPATIBILITY IDEOGRAPH-FA51 [2000] [Unicode3.2] +3-793C U+FA19 # CJK COMPATIBILITY IDEOGRAPH-FA19 [2000] +3-793D U+FA1A # CJK COMPATIBILITY IDEOGRAPH-FA1A [2000] +3-793E U+7979 # [2000] +3-793F U+FA52 # CJK COMPATIBILITY IDEOGRAPH-FA52 [2000] [Unicode3.2] +3-7940 U+FA53 # CJK COMPATIBILITY IDEOGRAPH-FA53 [2000] [Unicode3.2] +3-7941 U+FA1B # CJK COMPATIBILITY IDEOGRAPH-FA1B [2000] +3-7942 U+7998 # [2000] +3-7943 U+79B1 # [2000] +3-7944 U+79B8 # [2000] +3-7945 U+79C8 # [2000] +3-7946 U+79CA # [2000] +3-7947 U+25771 # [2000] [Unicode3.1] Private: U+F7B3 +3-7948 U+79D4 # [2000] +3-7949 U+79DE # [2000] +3-794A U+79EB # [2000] +3-794B U+79ED # [2000] +3-794C U+7A03 # [2000] +3-794D U+FA54 # CJK COMPATIBILITY IDEOGRAPH-FA54 [2000] [Unicode3.2] +3-794E U+7A39 # [2000] +3-794F U+7A5D # [2000] +3-7950 U+7A6D # [2000] +3-7951 U+FA55 # CJK COMPATIBILITY IDEOGRAPH-FA55 [2000] [Unicode3.2] +3-7952 U+7A85 # [2000] +3-7953 U+7AA0 # [2000] +3-7954 U+259C4 # [2000] [Unicode3.1] Private: U+F7B6 +3-7955 U+7AB3 # [2000] +3-7956 U+7ABB # [2000] +3-7957 U+7ACE # [2000] +3-7958 U+7AEB # [2000] +3-7959 U+7AFD # [2000] +3-795A U+7B12 # [2000] +3-795B U+7B2D # [2000] +3-795C U+7B3B # [2000] +3-795D U+7B47 # [2000] +3-795E U+7B4E # [2000] +3-795F U+7B60 # [2000] +3-7960 U+7B6D # [2000] +3-7961 U+7B6F # [2000] +3-7962 U+7B72 # [2000] +3-7963 U+7B9E # [2000] +3-7964 U+FA56 # CJK COMPATIBILITY IDEOGRAPH-FA56 [2000] [Unicode3.2] +3-7965 U+7BD7 # [2000] +3-7966 U+7BD9 # [2000] +3-7967 U+7C01 # [2000] +3-7968 U+7C31 # [2000] +3-7969 U+7C1E # [2000] +3-796A U+7C20 # [2000] +3-796B U+7C33 # [2000] +3-796C U+7C36 # [2000] +3-796D U+4264 # [2000] +3-796E U+25DA1 # [2000] [Unicode3.1] Private: U+F7B8 +3-796F U+7C59 # [2000] +3-7970 U+7C6D # [2000] +3-7971 U+7C79 # [2000] +3-7972 U+7C8F # [2000] +3-7973 U+7C94 # [2000] +3-7974 U+7CA0 # [2000] +3-7975 U+7CBC # [2000] +3-7976 U+7CD5 # [2000] +3-7977 U+7CD9 # [2000] +3-7978 U+7CDD # [2000] +3-7979 U+7D07 # [2000] +3-797A U+7D08 # [2000] +3-797B U+7D13 # [2000] +3-797C U+7D1D # [2000] +3-797D U+7D23 # [2000] +3-797E U+7D31 # [2000] +3-7A21 U+7D41 # [2000] +3-7A22 U+7D48 # [2000] +3-7A23 U+7D53 # [2000] +3-7A24 U+7D5C # [2000] +3-7A25 U+7D7A # [2000] +3-7A26 U+7D83 # [2000] +3-7A27 U+7D8B # [2000] +3-7A28 U+7DA0 # [2000] +3-7A29 U+7DA6 # [2000] +3-7A2A U+7DC2 # [2000] +3-7A2B U+7DCC # [2000] +3-7A2C U+7DD6 # [2000] +3-7A2D U+7DE3 # [2000] +3-7A2E U+FA57 # CJK COMPATIBILITY IDEOGRAPH-FA57 [2000] [Unicode3.2] +3-7A2F U+7E28 # [2000] +3-7A30 U+7E08 # [2000] +3-7A31 U+7E11 # [2000] +3-7A32 U+7E15 # [2000] +3-7A33 U+FA59 # CJK COMPATIBILITY IDEOGRAPH-FA59 [2000] [Unicode3.2] +3-7A34 U+7E47 # [2000] +3-7A35 U+7E52 # [2000] +3-7A36 U+7E61 # [2000] +3-7A37 U+7E8A # [2000] +3-7A38 U+7E8D # [2000] +3-7A39 U+7F47 # [2000] +3-7A3A U+FA5A # CJK COMPATIBILITY IDEOGRAPH-FA5A [2000] [Unicode3.2] +3-7A3B U+7F91 # [2000] +3-7A3C U+7F97 # [2000] +3-7A3D U+7FBF # [2000] +3-7A3E U+7FCE # [2000] +3-7A3F U+7FDB # [2000] +3-7A40 U+7FDF # [2000] +3-7A41 U+7FEC # [2000] +3-7A42 U+7FEE # [2000] +3-7A43 U+7FFA # [2000] +3-7A44 U+FA5B # CJK COMPATIBILITY IDEOGRAPH-FA5B [2000] [Unicode3.2] +3-7A45 U+8014 # [2000] +3-7A46 U+8026 # [2000] +3-7A47 U+8035 # [2000] +3-7A48 U+8037 # [2000] +3-7A49 U+803C # [2000] +3-7A4A U+80CA # [2000] +3-7A4B U+80D7 # [2000] +3-7A4C U+80E0 # [2000] +3-7A4D U+80F3 # [2000] +3-7A4E U+8118 # [2000] +3-7A4F U+814A # [2000] +3-7A50 U+8160 # [2000] +3-7A51 U+8167 # [2000] +3-7A52 U+8168 # [2000] +3-7A53 U+816D # [2000] +3-7A54 U+81BB # [2000] +3-7A55 U+81CA # [2000] +3-7A56 U+81CF # [2000] +3-7A57 U+81D7 # [2000] +3-7A58 U+FA5C # CJK COMPATIBILITY IDEOGRAPH-FA5C [2000] [Unicode3.2] +3-7A59 U+4453 # [2000] +3-7A5A U+445B # [2000] +3-7A5B U+8260 # [2000] +3-7A5C U+8274 # [2000] +3-7A5D U+26AFF # [2000] [Unicode3.1] Private: U+F7BE +3-7A5E U+828E # [2000] +3-7A5F U+82A1 # [2000] +3-7A60 U+82A3 # [2000] +3-7A61 U+82A4 # [2000] +3-7A62 U+82A9 # [2000] +3-7A63 U+82AE # [2000] +3-7A64 U+82B7 # [2000] +3-7A65 U+82BE # [2000] +3-7A66 U+82BF # [2000] +3-7A67 U+82C6 # [2000] +3-7A68 U+82D5 # [2000] +3-7A69 U+82FD # [2000] +3-7A6A U+82FE # [2000] +3-7A6B U+8300 # [2000] +3-7A6C U+8301 # [2000] +3-7A6D U+8362 # [2000] +3-7A6E U+8322 # [2000] +3-7A6F U+832D # [2000] +3-7A70 U+833A # [2000] +3-7A71 U+8343 # [2000] +3-7A72 U+8347 # [2000] +3-7A73 U+8351 # [2000] +3-7A74 U+8355 # [2000] +3-7A75 U+837D # [2000] +3-7A76 U+8386 # [2000] +3-7A77 U+8392 # [2000] +3-7A78 U+8398 # [2000] +3-7A79 U+83A7 # [2000] +3-7A7A U+83A9 # [2000] +3-7A7B U+83BF # [2000] +3-7A7C U+83C0 # [2000] +3-7A7D U+83C7 # [2000] +3-7A7E U+83CF # [2000] +3-7B21 U+83D1 # [2000] +3-7B22 U+83E1 # [2000] +3-7B23 U+83EA # [2000] +3-7B24 U+8401 # [2000] +3-7B25 U+8406 # [2000] +3-7B26 U+840A # [2000] +3-7B27 U+FA5F # CJK COMPATIBILITY IDEOGRAPH-FA5F [2000] [Unicode3.2] +3-7B28 U+8448 # [2000] +3-7B29 U+845F # [2000] +3-7B2A U+8470 # [2000] +3-7B2B U+8473 # [2000] +3-7B2C U+8485 # [2000] +3-7B2D U+849E # [2000] +3-7B2E U+84AF # [2000] +3-7B2F U+84B4 # [2000] +3-7B30 U+84BA # [2000] +3-7B31 U+84C0 # [2000] +3-7B32 U+84C2 # [2000] +3-7B33 U+26E40 # [2000] [Unicode3.1] Private: U+F7C0 +3-7B34 U+8532 # [2000] +3-7B35 U+851E # [2000] +3-7B36 U+8523 # [2000] +3-7B37 U+852F # [2000] +3-7B38 U+8559 # [2000] +3-7B39 U+8564 # [2000] +3-7B3A U+FA1F # CJK COMPATIBILITY IDEOGRAPH-FA1F [2000] +3-7B3B U+85AD # [2000] +3-7B3C U+857A # [2000] +3-7B3D U+858C # [2000] +3-7B3E U+858F # [2000] +3-7B3F U+85A2 # [2000] +3-7B40 U+85B0 # [2000] +3-7B41 U+85CB # [2000] +3-7B42 U+85CE # [2000] +3-7B43 U+85ED # [2000] +3-7B44 U+8612 # [2000] +3-7B45 U+85FF # [2000] +3-7B46 U+8604 # [2000] +3-7B47 U+8605 # [2000] +3-7B48 U+8610 # [2000] +3-7B49 U+270F4 # [2000] [Unicode3.1] Private: U+F7C1 +3-7B4A U+8618 # [2000] +3-7B4B U+8629 # [2000] +3-7B4C U+8638 # [2000] +3-7B4D U+8657 # [2000] +3-7B4E U+865B # [2000] +3-7B4F U+F936 # CJK COMPATIBILITY IDEOGRAPH-F936 [2000] +3-7B50 U+8662 # [2000] +3-7B51 U+459D # [2000] +3-7B52 U+866C # [2000] +3-7B53 U+8675 # [2000] +3-7B54 U+8698 # [2000] +3-7B55 U+86B8 # [2000] +3-7B56 U+86FA # [2000] +3-7B57 U+86FC # [2000] +3-7B58 U+86FD # [2000] +3-7B59 U+870B # [2000] +3-7B5A U+8771 # [2000] +3-7B5B U+8787 # [2000] +3-7B5C U+8788 # [2000] +3-7B5D U+87AC # [2000] +3-7B5E U+87AD # [2000] +3-7B5F U+87B5 # [2000] +3-7B60 U+45EA # [2000] +3-7B61 U+87D6 # [2000] +3-7B62 U+87EC # [2000] +3-7B63 U+8806 # [2000] +3-7B64 U+880A # [2000] +3-7B65 U+8810 # [2000] +3-7B66 U+8814 # [2000] +3-7B67 U+881F # [2000] +3-7B68 U+8898 # [2000] +3-7B69 U+88AA # [2000] +3-7B6A U+88CA # [2000] +3-7B6B U+88CE # [2000] +3-7B6C U+27684 # [2000] [Unicode3.1] Private: U+F7C2 +3-7B6D U+88F5 # [2000] +3-7B6E U+891C # [2000] +3-7B6F U+FA60 # CJK COMPATIBILITY IDEOGRAPH-FA60 [2000] [Unicode3.2] +3-7B70 U+8918 # [2000] +3-7B71 U+8919 # [2000] +3-7B72 U+891A # [2000] +3-7B73 U+8927 # [2000] +3-7B74 U+8930 # [2000] +3-7B75 U+8932 # [2000] +3-7B76 U+8939 # [2000] +3-7B77 U+8940 # [2000] +3-7B78 U+8994 # [2000] +3-7B79 U+FA61 # CJK COMPATIBILITY IDEOGRAPH-FA61 [2000] [Unicode3.2] +3-7B7A U+89D4 # [2000] +3-7B7B U+89E5 # [2000] +3-7B7C U+89F6 # [2000] +3-7B7D U+8A12 # [2000] +3-7B7E U+8A15 # [2000] +3-7C21 U+8A22 # [2000] +3-7C22 U+8A37 # [2000] +3-7C23 U+8A47 # [2000] +3-7C24 U+8A4E # [2000] +3-7C25 U+8A5D # [2000] +3-7C26 U+8A61 # [2000] +3-7C27 U+8A75 # [2000] +3-7C28 U+8A79 # [2000] +3-7C29 U+8AA7 # [2000] +3-7C2A U+8AD0 # [2000] +3-7C2B U+8ADF # [2000] +3-7C2C U+8AF4 # [2000] +3-7C2D U+8AF6 # [2000] +3-7C2E U+FA22 # CJK COMPATIBILITY IDEOGRAPH-FA22 [2000] +3-7C2F U+FA62 # CJK COMPATIBILITY IDEOGRAPH-FA62 [2000] [Unicode3.2] +3-7C30 U+FA63 # CJK COMPATIBILITY IDEOGRAPH-FA63 [2000] [Unicode3.2] +3-7C31 U+8B46 # [2000] +3-7C32 U+8B54 # [2000] +3-7C33 U+8B59 # [2000] +3-7C34 U+8B69 # [2000] +3-7C35 U+8B9D # [2000] +3-7C36 U+8C49 # [2000] +3-7C37 U+8C68 # [2000] +3-7C38 U+FA64 # CJK COMPATIBILITY IDEOGRAPH-FA64 [2000] [Unicode3.2] +3-7C39 U+8CE1 # [2000] +3-7C3A U+8CF4 # [2000] +3-7C3B U+8CF8 # [2000] +3-7C3C U+8CFE # [2000] +3-7C3D U+FA65 # CJK COMPATIBILITY IDEOGRAPH-FA65 [2000] [Unicode3.2] +3-7C3E U+8D12 # [2000] +3-7C3F U+8D1B # [2000] +3-7C40 U+8DAF # [2000] +3-7C41 U+8DCE # [2000] +3-7C42 U+8DD1 # [2000] +3-7C43 U+8DD7 # [2000] +3-7C44 U+8E20 # [2000] +3-7C45 U+8E23 # [2000] +3-7C46 U+8E3D # [2000] +3-7C47 U+8E70 # [2000] +3-7C48 U+8E7B # [2000] +3-7C49 U+28277 # [2000] [Unicode3.1] Private: U+F7C9 +3-7C4A U+8EC0 # [2000] +3-7C4B U+4844 # [2000] +3-7C4C U+8EFA # [2000] +3-7C4D U+8F1E # [2000] +3-7C4E U+8F2D # [2000] +3-7C4F U+8F36 # [2000] +3-7C50 U+8F54 # [2000] +3-7C51 U+283CD # [2000] [Unicode3.1] Private: U+F7CA +3-7C52 U+8FA6 # [2000] +3-7C53 U+8FB5 # [2000] +3-7C54 U+8FE4 # [2000] +3-7C55 U+8FE8 # [2000] +3-7C56 U+8FEE # [2000] +3-7C57 U+9008 # [2000] +3-7C58 U+902D # [2000] +3-7C59 U+FA67 # CJK COMPATIBILITY IDEOGRAPH-FA67 [2000] [Unicode3.2] +3-7C5A U+9088 # [2000] +3-7C5B U+9095 # [2000] +3-7C5C U+9097 # [2000] +3-7C5D U+9099 # [2000] +3-7C5E U+909B # [2000] +3-7C5F U+90A2 # [2000] +3-7C60 U+90B3 # [2000] +3-7C61 U+90BE # [2000] +3-7C62 U+90C4 # [2000] +3-7C63 U+90C5 # [2000] +3-7C64 U+90C7 # [2000] +3-7C65 U+90D7 # [2000] +3-7C66 U+90DD # [2000] +3-7C67 U+90DE # [2000] +3-7C68 U+90EF # [2000] +3-7C69 U+90F4 # [2000] +3-7C6A U+FA26 # CJK COMPATIBILITY IDEOGRAPH-FA26 [2000] +3-7C6B U+9114 # [2000] +3-7C6C U+9115 # [2000] +3-7C6D U+9116 # [2000] +3-7C6E U+9122 # [2000] +3-7C6F U+9123 # [2000] +3-7C70 U+9127 # [2000] +3-7C71 U+912F # [2000] +3-7C72 U+9131 # [2000] +3-7C73 U+9134 # [2000] +3-7C74 U+913D # [2000] +3-7C75 U+9148 # [2000] +3-7C76 U+915B # [2000] +3-7C77 U+9183 # [2000] +3-7C78 U+919E # [2000] +3-7C79 U+91AC # [2000] +3-7C7A U+91B1 # [2000] +3-7C7B U+91BC # [2000] +3-7C7C U+91D7 # [2000] +3-7C7D U+91FB # [2000] +3-7C7E U+91E4 # [2000] +3-7D21 U+91E5 # [2000] +3-7D22 U+91ED # [2000] +3-7D23 U+91F1 # [2000] +3-7D24 U+9207 # [2000] +3-7D25 U+9210 # [2000] +3-7D26 U+9238 # [2000] +3-7D27 U+9239 # [2000] +3-7D28 U+923A # [2000] +3-7D29 U+923C # [2000] +3-7D2A U+9240 # [2000] +3-7D2B U+9243 # [2000] +3-7D2C U+924F # [2000] +3-7D2D U+9278 # [2000] +3-7D2E U+9288 # [2000] +3-7D2F U+92C2 # [2000] +3-7D30 U+92CB # [2000] +3-7D31 U+92CC # [2000] +3-7D32 U+92D3 # [2000] +3-7D33 U+92E0 # [2000] +3-7D34 U+92FF # [2000] +3-7D35 U+9304 # [2000] +3-7D36 U+931F # [2000] +3-7D37 U+9321 # [2000] +3-7D38 U+9325 # [2000] +3-7D39 U+9348 # [2000] +3-7D3A U+9349 # [2000] +3-7D3B U+934A # [2000] +3-7D3C U+9364 # [2000] +3-7D3D U+9365 # [2000] +3-7D3E U+936A # [2000] +3-7D3F U+9370 # [2000] +3-7D40 U+939B # [2000] +3-7D41 U+93A3 # [2000] +3-7D42 U+93BA # [2000] +3-7D43 U+93C6 # [2000] +3-7D44 U+93DE # [2000] +3-7D45 U+93DF # [2000] +3-7D46 U+9404 # [2000] +3-7D47 U+93FD # [2000] +3-7D48 U+9433 # [2000] +3-7D49 U+944A # [2000] +3-7D4A U+9463 # [2000] +3-7D4B U+946B # [2000] +3-7D4C U+9471 # [2000] +3-7D4D U+9472 # [2000] +3-7D4E U+958E # [2000] +3-7D4F U+959F # [2000] +3-7D50 U+95A6 # [2000] +3-7D51 U+95A9 # [2000] +3-7D52 U+95AC # [2000] +3-7D53 U+95B6 # [2000] +3-7D54 U+95BD # [2000] +3-7D55 U+95CB # [2000] +3-7D56 U+95D0 # [2000] +3-7D57 U+95D3 # [2000] +3-7D58 U+49B0 # [2000] +3-7D59 U+95DA # [2000] +3-7D5A U+95DE # [2000] +3-7D5B U+9658 # [2000] +3-7D5C U+9684 # [2000] +3-7D5D U+F9DC # CJK COMPATIBILITY IDEOGRAPH-F9DC [2000] +3-7D5E U+969D # [2000] +3-7D5F U+96A4 # [2000] +3-7D60 U+96A5 # [2000] +3-7D61 U+96D2 # [2000] +3-7D62 U+96DE # [2000] +3-7D63 U+FA68 # CJK COMPATIBILITY IDEOGRAPH-FA68 [2000] [Unicode3.2] +3-7D64 U+96E9 # [2000] +3-7D65 U+96EF # [2000] +3-7D66 U+9733 # [2000] +3-7D67 U+973B # [2000] +3-7D68 U+974D # [2000] +3-7D69 U+974E # [2000] +3-7D6A U+974F # [2000] +3-7D6B U+975A # [2000] +3-7D6C U+976E # [2000] +3-7D6D U+9773 # [2000] +3-7D6E U+9795 # [2000] +3-7D6F U+97AE # [2000] +3-7D70 U+97BA # [2000] +3-7D71 U+97C1 # [2000] +3-7D72 U+97C9 # [2000] +3-7D73 U+97DE # [2000] +3-7D74 U+97DB # [2000] +3-7D75 U+97F4 # [2000] +3-7D76 U+FA69 # CJK COMPATIBILITY IDEOGRAPH-FA69 [2000] [Unicode3.2] +3-7D77 U+980A # [2000] +3-7D78 U+981E # [2000] +3-7D79 U+982B # [2000] +3-7D7A U+9830 # [2000] +3-7D7B U+FA6A # CJK COMPATIBILITY IDEOGRAPH-FA6A [2000] [Unicode3.2] +3-7D7C U+9852 # [2000] +3-7D7D U+9853 # [2000] +3-7D7E U+9856 # [2000] +3-7E21 U+9857 # [2000] +3-7E22 U+9859 # [2000] +3-7E23 U+985A # [2000] +3-7E24 U+F9D0 # CJK COMPATIBILITY IDEOGRAPH-F9D0 [2000] +3-7E25 U+9865 # [2000] +3-7E26 U+986C # [2000] +3-7E27 U+98BA # [2000] +3-7E28 U+98C8 # [2000] +3-7E29 U+98E7 # [2000] +3-7E2A U+9958 # [2000] +3-7E2B U+999E # [2000] +3-7E2C U+9A02 # [2000] +3-7E2D U+9A03 # [2000] +3-7E2E U+9A24 # [2000] +3-7E2F U+9A2D # [2000] +3-7E30 U+9A2E # [2000] +3-7E31 U+9A38 # [2000] +3-7E32 U+9A4A # [2000] +3-7E33 U+9A4E # [2000] +3-7E34 U+9A52 # [2000] +3-7E35 U+9AB6 # [2000] +3-7E36 U+9AC1 # [2000] +3-7E37 U+9AC3 # [2000] +3-7E38 U+9ACE # [2000] +3-7E39 U+9AD6 # [2000] +3-7E3A U+9AF9 # [2000] +3-7E3B U+9B02 # [2000] +3-7E3C U+9B08 # [2000] +3-7E3D U+9B20 # [2000] +3-7E3E U+4C17 # [2000] +3-7E3F U+9B2D # [2000] +3-7E40 U+9B5E # [2000] +3-7E41 U+9B79 # [2000] +3-7E42 U+9B66 # [2000] +3-7E43 U+9B72 # [2000] +3-7E44 U+9B75 # [2000] +3-7E45 U+9B84 # [2000] +3-7E46 U+9B8A # [2000] +3-7E47 U+9B8F # [2000] +3-7E48 U+9B9E # [2000] +3-7E49 U+9BA7 # [2000] +3-7E4A U+9BC1 # [2000] +3-7E4B U+9BCE # [2000] +3-7E4C U+9BE5 # [2000] +3-7E4D U+9BF8 # [2000] +3-7E4E U+9BFD # [2000] +3-7E4F U+9C00 # [2000] +3-7E50 U+9C23 # [2000] +3-7E51 U+9C41 # [2000] +3-7E52 U+9C4F # [2000] +3-7E53 U+9C50 # [2000] +3-7E54 U+9C53 # [2000] +3-7E55 U+9C63 # [2000] +3-7E56 U+9C65 # [2000] +3-7E57 U+9C77 # [2000] +3-7E58 U+9D1D # [2000] +3-7E59 U+9D1E # [2000] +3-7E5A U+9D43 # [2000] +3-7E5B U+9D47 # [2000] +3-7E5C U+9D52 # [2000] +3-7E5D U+9D63 # [2000] +3-7E5E U+9D70 # [2000] +3-7E5F U+9D7C # [2000] +3-7E60 U+9D8A # [2000] +3-7E61 U+9D96 # [2000] +3-7E62 U+9DC0 # [2000] +3-7E63 U+9DAC # [2000] +3-7E64 U+9DBC # [2000] +3-7E65 U+9DD7 # [2000] +3-7E66 U+2A190 # [2000] [Unicode3.1] Private: U+F7D0 +3-7E67 U+9DE7 # [2000] +3-7E68 U+9E07 # [2000] +3-7E69 U+9E15 # [2000] +3-7E6A U+9E7C # [2000] +3-7E6B U+9E9E # [2000] +3-7E6C U+9EA4 # [2000] +3-7E6D U+9EAC # [2000] +3-7E6E U+9EAF # [2000] +3-7E6F U+9EB4 # [2000] +3-7E70 U+9EB5 # [2000] +3-7E71 U+9EC3 # [2000] +3-7E72 U+9ED1 # [2000] +3-7E73 U+9F10 # [2000] +3-7E74 U+9F39 # [2000] +3-7E75 U+9F57 # [2000] +3-7E76 U+9F90 # [2000] +3-7E77 U+9F94 # [2000] +3-7E78 U+9F97 # [2000] +3-7E79 U+9FA2 # [2000] +3-7E7A U+59F8 # [2004] +3-7E7B U+5C5B # [2004] +3-7E7C U+5E77 # [2004] +3-7E7D U+7626 # [2004] +3-7E7E U+7E6B # [2004] +4-2121 U+20089 # [2000] [Unicode3.1] Private: U+F7D1 +4-2122 U+4E02 # [2000] +4-2123 U+4E0F # [2000] +4-2124 U+4E12 # [2000] +4-2125 U+4E29 # [2000] +4-2126 U+4E2B # [2000] +4-2127 U+4E2E # [2000] +4-2128 U+4E40 # [2000] +4-2129 U+4E47 # [2000] +4-212A U+4E48 # [2000] +4-212B U+200A2 # [2000] [Unicode3.1] Private: U+F7D2 +4-212C U+4E51 # [2000] +4-212D U+3406 # [2000] +4-212E U+200A4 # [2000] [Unicode3.1] Private: U+F7D3 +4-212F U+4E5A # [2000] +4-2130 U+4E69 # [2000] +4-2131 U+4E9D # [2000] +4-2132 U+342C # [2000] +4-2133 U+342E # [2000] +4-2134 U+4EB9 # [2000] +4-2135 U+4EBB # [2000] +4-2136 U+201A2 # [2000] [Unicode3.1] Private: U+F7D4 +4-2137 U+4EBC # [2000] +4-2138 U+4EC3 # [2000] +4-2139 U+4EC8 # [2000] +4-213A U+4ED0 # [2000] +4-213B U+4EEB # [2000] +4-213C U+4EDA # [2000] +4-213D U+4EF1 # [2000] +4-213E U+4EF5 # [2000] +4-213F U+4F00 # [2000] +4-2140 U+4F16 # [2000] +4-2141 U+4F64 # [2000] +4-2142 U+4F37 # [2000] +4-2143 U+4F3E # [2000] +4-2144 U+4F54 # [2000] +4-2145 U+4F58 # [2000] +4-2146 U+20213 # [2000] [Unicode3.1] Private: U+F7D5 +4-2147 U+4F77 # [2000] +4-2148 U+4F78 # [2000] +4-2149 U+4F7A # [2000] +4-214A U+4F7D # [2000] +4-214B U+4F82 # [2000] +4-214C U+4F85 # [2000] +4-214D U+4F92 # [2000] +4-214E U+4F9A # [2000] +4-214F U+4FE6 # [2000] +4-2150 U+4FB2 # [2000] +4-2151 U+4FBE # [2000] +4-2152 U+4FC5 # [2000] +4-2153 U+4FCB # [2000] +4-2154 U+4FCF # [2000] +4-2155 U+4FD2 # [2000] +4-2156 U+346A # [2000] +4-2157 U+4FF2 # [2000] +4-2158 U+5000 # [2000] +4-2159 U+5010 # [2000] +4-215A U+5013 # [2000] +4-215B U+501C # [2000] +4-215C U+501E # [2000] +4-215D U+5022 # [2000] +4-215E U+3468 # [2000] +4-215F U+5042 # [2000] +4-2160 U+5046 # [2000] +4-2161 U+504E # [2000] +4-2162 U+5053 # [2000] +4-2163 U+5057 # [2000] +4-2164 U+5063 # [2000] +4-2165 U+5066 # [2000] +4-2166 U+506A # [2000] +4-2167 U+5070 # [2000] +4-2168 U+50A3 # [2000] +4-2169 U+5088 # [2000] +4-216A U+5092 # [2000] +4-216B U+5093 # [2000] +4-216C U+5095 # [2000] +4-216D U+5096 # [2000] +4-216E U+509C # [2000] +4-216F U+50AA # [2000] +4-2170 U+2032B # [2000] [Unicode3.1] Private: U+F7D6 +4-2171 U+50B1 # [2000] +4-2172 U+50BA # [2000] +4-2173 U+50BB # [2000] +4-2174 U+50C4 # [2000] +4-2175 U+50C7 # [2000] +4-2176 U+50F3 # [2000] +4-2177 U+20381 # [2000] [Unicode3.1] Private: U+F7D7 +4-2178 U+50CE # [2000] +4-2179 U+20371 # [2000] [Unicode3.1] Private: U+F7D8 +4-217A U+50D4 # [2000] +4-217B U+50D9 # [2000] +4-217C U+50E1 # [2000] +4-217D U+50E9 # [2000] +4-217E U+3492 # [2000] +4-2321 U+5108 # [2000] +4-2322 U+203F9 # [2000] [Unicode3.1] Private: U+F7D9 +4-2323 U+5117 # [2000] +4-2324 U+511B # [2000] +4-2325 U+2044A # [2000] [Unicode3.1] Private: U+F7DA +4-2326 U+5160 # [2000] +4-2327 U+20509 # [2000] [Unicode3.1] Private: U+F7DB +4-2328 U+5173 # [2000] +4-2329 U+5183 # [2000] +4-232A U+518B # [2000] +4-232B U+34BC # [2000] +4-232C U+5198 # [2000] +4-232D U+51A3 # [2000] +4-232E U+51AD # [2000] +4-232F U+34C7 # [2000] +4-2330 U+51BC # [2000] +4-2331 U+205D6 # [2000] [Unicode3.1] Private: U+F7DC +4-2332 U+20628 # [2000] [Unicode3.1] Private: U+F7DD +4-2333 U+51F3 # [2000] +4-2334 U+51F4 # [2000] +4-2335 U+5202 # [2000] +4-2336 U+5212 # [2000] +4-2337 U+5216 # [2000] +4-2338 U+2074F # [2000] [Unicode3.1] Private: U+F7DE +4-2339 U+5255 # [2000] +4-233A U+525C # [2000] +4-233B U+526C # [2000] +4-233C U+5277 # [2000] +4-233D U+5284 # [2000] +4-233E U+5282 # [2000] +4-233F U+20807 # [2000] [Unicode3.1] Private: U+F7DF +4-2340 U+5298 # [2000] +4-2341 U+2083A # [2000] [Unicode3.1] Private: U+F7E0 +4-2342 U+52A4 # [2000] +4-2343 U+52A6 # [2000] +4-2344 U+52AF # [2000] +4-2345 U+52BA # [2000] +4-2346 U+52BB # [2000] +4-2347 U+52CA # [2000] +4-2348 U+351F # [2000] +4-2349 U+52D1 # [2000] +4-234A U+208B9 # [2000] [Unicode3.1] Private: U+F7E1 +4-234B U+52F7 # [2000] +4-234C U+530A # [2000] +4-234D U+530B # [2000] +4-234E U+5324 # [2000] +4-234F U+5335 # [2000] +4-2350 U+533E # [2000] +4-2351 U+5342 # [2000] +4-2352 U+2097C # [2000] [Unicode3.1] Private: U+F7E2 +4-2353 U+2099D # [2000] [Unicode3.1] Private: U+F7E3 +4-2354 U+5367 # [2000] +4-2355 U+536C # [2000] +4-2356 U+537A # [2000] +4-2357 U+53A4 # [2000] +4-2358 U+53B4 # [2000] +4-2359 U+20AD3 # [2000] [Unicode3.1] Private: U+F7E4 +4-235A U+53B7 # [2000] +4-235B U+53C0 # [2000] +4-235C U+20B1D # [2000] [Unicode3.1] Private: U+F7E5 +4-235D U+355D # [2000] +4-235E U+355E # [2000] +4-235F U+53D5 # [2000] +4-2360 U+53DA # [2000] +4-2361 U+3563 # [2000] +4-2362 U+53F4 # [2000] +4-2363 U+53F5 # [2000] +4-2364 U+5455 # [2000] +4-2365 U+5424 # [2000] +4-2366 U+5428 # [2000] +4-2367 U+356E # [2000] +4-2368 U+5443 # [2000] +4-2369 U+5462 # [2000] +4-236A U+5466 # [2000] +4-236B U+546C # [2000] +4-236C U+548A # [2000] +4-236D U+548D # [2000] +4-236E U+5495 # [2000] +4-236F U+54A0 # [2000] +4-2370 U+54A6 # [2000] +4-2371 U+54AD # [2000] +4-2372 U+54AE # [2000] +4-2373 U+54B7 # [2000] +4-2374 U+54BA # [2000] +4-2375 U+54BF # [2000] +4-2376 U+54C3 # [2000] +4-2377 U+20D45 # [2000] [Unicode3.1] Private: U+F7E6 +4-2378 U+54EC # [2000] +4-2379 U+54EF # [2000] +4-237A U+54F1 # [2000] +4-237B U+54F3 # [2000] +4-237C U+5500 # [2000] +4-237D U+5501 # [2000] +4-237E U+5509 # [2000] +4-2421 U+553C # [2000] +4-2422 U+5541 # [2000] +4-2423 U+35A6 # [2000] +4-2424 U+5547 # [2000] +4-2425 U+554A # [2000] +4-2426 U+35A8 # [2000] +4-2427 U+5560 # [2000] +4-2428 U+5561 # [2000] +4-2429 U+5564 # [2000] +4-242A U+20DE1 # [2000] [Unicode3.1] Private: U+F7E7 +4-242B U+557D # [2000] +4-242C U+5582 # [2000] +4-242D U+5588 # [2000] +4-242E U+5591 # [2000] +4-242F U+35C5 # [2000] +4-2430 U+55D2 # [2000] +4-2431 U+20E95 # [2000] [Unicode3.1] Private: U+F7E8 +4-2432 U+20E6D # [2000] [Unicode3.1] Private: U+F7E9 +4-2433 U+55BF # [2000] +4-2434 U+55C9 # [2000] +4-2435 U+55CC # [2000] +4-2436 U+55D1 # [2000] +4-2437 U+55DD # [2000] +4-2438 U+35DA # [2000] +4-2439 U+55E2 # [2000] +4-243A U+20E64 # [2000] [Unicode3.1] Private: U+F7EA +4-243B U+55E9 # [2000] +4-243C U+5628 # [2000] +4-243D U+20F5F # [2000] [Unicode3.1] Private: U+F7EB +4-243E U+5607 # [2000] +4-243F U+5610 # [2000] +4-2440 U+5630 # [2000] +4-2441 U+5637 # [2000] +4-2442 U+35F4 # [2000] +4-2443 U+563D # [2000] +4-2444 U+563F # [2000] +4-2445 U+5640 # [2000] +4-2446 U+5647 # [2000] +4-2447 U+565E # [2000] +4-2448 U+5660 # [2000] +4-2449 U+566D # [2000] +4-244A U+3605 # [2000] +4-244B U+5688 # [2000] +4-244C U+568C # [2000] +4-244D U+5695 # [2000] +4-244E U+569A # [2000] +4-244F U+569D # [2000] +4-2450 U+56A8 # [2000] +4-2451 U+56AD # [2000] +4-2452 U+56B2 # [2000] +4-2453 U+56C5 # [2000] +4-2454 U+56CD # [2000] +4-2455 U+56DF # [2000] +4-2456 U+56E8 # [2000] +4-2457 U+56F6 # [2000] +4-2458 U+56F7 # [2000] +4-2459 U+21201 # [2000] [Unicode3.1] Private: U+F7EC +4-245A U+5715 # [2000] +4-245B U+5723 # [2000] +4-245C U+21255 # [2000] [Unicode3.1] Private: U+F7ED +4-245D U+5729 # [2000] +4-245E U+2127B # [2000] [Unicode3.1] Private: U+F7EE +4-245F U+5745 # [2000] +4-2460 U+5746 # [2000] +4-2461 U+574C # [2000] +4-2462 U+574D # [2000] +4-2463 U+21274 # [2000] [Unicode3.1] Private: U+F7EF +4-2464 U+5768 # [2000] +4-2465 U+576F # [2000] +4-2466 U+5773 # [2000] +4-2467 U+5774 # [2000] +4-2468 U+5775 # [2000] +4-2469 U+577B # [2000] +4-246A U+212E4 # [2000] [Unicode3.1] Private: U+F7F0 +4-246B U+212D7 # [2000] [Unicode3.1] Private: U+F7F1 +4-246C U+57AC # [2000] +4-246D U+579A # [2000] +4-246E U+579D # [2000] +4-246F U+579E # [2000] +4-2470 U+57A8 # [2000] +4-2471 U+57D7 # [2000] +4-2472 U+212FD # [2000] [Unicode3.1] Private: U+F7F2 +4-2473 U+57CC # [2000] +4-2474 U+21336 # [2000] [Unicode3.1] Private: U+F7F3 +4-2475 U+21344 # [2000] [Unicode3.1] Private: U+F7F4 +4-2476 U+57DE # [2000] +4-2477 U+57E6 # [2000] +4-2478 U+57F0 # [2000] +4-2479 U+364A # [2000] +4-247A U+57F8 # [2000] +4-247B U+57FB # [2000] +4-247C U+57FD # [2000] +4-247D U+5804 # [2000] +4-247E U+581E # [2000] +4-2521 U+5820 # [2000] +4-2522 U+5827 # [2000] +4-2523 U+5832 # [2000] +4-2524 U+5839 # [2000] +4-2525 U+213C4 # [2000] [Unicode3.1] Private: U+F7F5 +4-2526 U+5849 # [2000] +4-2527 U+584C # [2000] +4-2528 U+5867 # [2000] +4-2529 U+588A # [2000] +4-252A U+588B # [2000] +4-252B U+588D # [2000] +4-252C U+588F # [2000] +4-252D U+5890 # [2000] +4-252E U+5894 # [2000] +4-252F U+589D # [2000] +4-2530 U+58AA # [2000] +4-2531 U+58B1 # [2000] +4-2532 U+2146D # [2000] [Unicode3.1] Private: U+F7F6 +4-2533 U+58C3 # [2000] +4-2534 U+58CD # [2000] +4-2535 U+58E2 # [2000] +4-2536 U+58F3 # [2000] +4-2537 U+58F4 # [2000] +4-2538 U+5905 # [2000] +4-2539 U+5906 # [2000] +4-253A U+590B # [2000] +4-253B U+590D # [2000] +4-253C U+5914 # [2000] +4-253D U+5924 # [2000] +4-253E U+215D7 # [2000] [Unicode3.1] Private: U+F7F7 +4-253F U+3691 # [2000] +4-2540 U+593D # [2000] +4-2541 U+3699 # [2000] +4-2542 U+5946 # [2000] +4-2543 U+3696 # [2000] +4-2544 U+26C29 # [2000] [Unicode3.1] Private: U+F7F8 +4-2545 U+595B # [2000] +4-2546 U+595F # [2000] +4-2547 U+21647 # [2000] [Unicode3.1] Private: U+F7F9 +4-2548 U+5975 # [2000] +4-2549 U+5976 # [2000] +4-254A U+597C # [2000] +4-254B U+599F # [2000] +4-254C U+59AE # [2000] +4-254D U+59BC # [2000] +4-254E U+59C8 # [2000] +4-254F U+59CD # [2000] +4-2550 U+59DE # [2000] +4-2551 U+59E3 # [2000] +4-2552 U+59E4 # [2000] +4-2553 U+59E7 # [2000] +4-2554 U+59EE # [2000] +4-2555 U+21706 # [2000] [Unicode3.1] Private: U+F7FA +4-2556 U+21742 # [2000] [Unicode3.1] Private: U+F7FB +4-2557 U+36CF # [2000] +4-2558 U+5A0C # [2000] +4-2559 U+5A0D # [2000] +4-255A U+5A17 # [2000] +4-255B U+5A27 # [2000] +4-255C U+5A2D # [2000] +4-255D U+5A55 # [2000] +4-255E U+5A65 # [2000] +4-255F U+5A7A # [2000] +4-2560 U+5A8B # [2000] +4-2561 U+5A9C # [2000] +4-2562 U+5A9F # [2000] +4-2563 U+5AA0 # [2000] +4-2564 U+5AA2 # [2000] +4-2565 U+5AB1 # [2000] +4-2566 U+5AB3 # [2000] +4-2567 U+5AB5 # [2000] +4-2568 U+5ABA # [2000] +4-2569 U+5ABF # [2000] +4-256A U+5ADA # [2000] +4-256B U+5ADC # [2000] +4-256C U+5AE0 # [2000] +4-256D U+5AE5 # [2000] +4-256E U+5AF0 # [2000] +4-256F U+5AEE # [2000] +4-2570 U+5AF5 # [2000] +4-2571 U+5B00 # [2000] +4-2572 U+5B08 # [2000] +4-2573 U+5B17 # [2000] +4-2574 U+5B34 # [2000] +4-2575 U+5B2D # [2000] +4-2576 U+5B4C # [2000] +4-2577 U+5B52 # [2000] +4-2578 U+5B68 # [2000] +4-2579 U+5B6F # [2000] +4-257A U+5B7C # [2000] +4-257B U+5B7F # [2000] +4-257C U+5B81 # [2000] +4-257D U+5B84 # [2000] +4-257E U+219C3 # [2000] [Unicode3.1] Private: U+F7FC +4-2821 U+5B96 # [2000] +4-2822 U+5BAC # [2000] +4-2823 U+3761 # [2000] +4-2824 U+5BC0 # [2000] +4-2825 U+3762 # [2000] +4-2826 U+5BCE # [2000] +4-2827 U+5BD6 # [2000] +4-2828 U+376C # [2000] +4-2829 U+376B # [2000] +4-282A U+5BF1 # [2000] +4-282B U+5BFD # [2000] +4-282C U+3775 # [2000] +4-282D U+5C03 # [2000] +4-282E U+5C29 # [2000] +4-282F U+5C30 # [2000] +4-2830 U+21C56 # [2000] [Unicode3.1] Private: U+F7FD +4-2831 U+5C5F # [2000] +4-2832 U+5C63 # [2000] +4-2833 U+5C67 # [2000] +4-2834 U+5C68 # [2000] +4-2835 U+5C69 # [2000] +4-2836 U+5C70 # [2000] +4-2837 U+21D2D # [2000] [Unicode3.1] Private: U+F7FE +4-2838 U+21D45 # [2000] [Unicode3.1] Private: U+F7FF +4-2839 U+5C7C # [2000] +4-283A U+21D78 # [2000] [Unicode3.1] Private: U+F800 +4-283B U+21D62 # [2000] [Unicode3.1] Private: U+F801 +4-283C U+5C88 # [2000] +4-283D U+5C8A # [2000] +4-283E U+37C1 # [2000] +4-283F U+21DA1 # [2000] [Unicode3.1] Private: U+F802 +4-2840 U+21D9C # [2000] [Unicode3.1] Private: U+F803 +4-2841 U+5CA0 # [2000] +4-2842 U+5CA2 # [2000] +4-2843 U+5CA6 # [2000] +4-2844 U+5CA7 # [2000] +4-2845 U+21D92 # [2000] [Unicode3.1] Private: U+F804 +4-2846 U+5CAD # [2000] +4-2847 U+5CB5 # [2000] +4-2848 U+21DB7 # [2000] [Unicode3.1] Private: U+F805 +4-2849 U+5CC9 # [2000] +4-284A U+21DE0 # [2000] [Unicode3.1] Private: U+F806 +4-284B U+21E33 # [2000] [Unicode3.1] Private: U+F807 +4-284C U+5D06 # [2000] +4-284D U+5D10 # [2000] +4-284E U+5D2B # [2000] +4-284F U+5D1D # [2000] +4-2850 U+5D20 # [2000] +4-2851 U+5D24 # [2000] +4-2852 U+5D26 # [2000] +4-2853 U+5D31 # [2000] +4-2854 U+5D39 # [2000] +4-2855 U+5D42 # [2000] +4-2856 U+37E8 # [2000] +4-2857 U+5D61 # [2000] +4-2858 U+5D6A # [2000] +4-2859 U+37F4 # [2000] +4-285A U+5D70 # [2000] +4-285B U+21F1E # [2000] [Unicode3.1] Private: U+F808 +4-285C U+37FD # [2000] +4-285D U+5D88 # [2000] +4-285E U+3800 # [2000] +4-285F U+5D92 # [2000] +4-2860 U+5D94 # [2000] +4-2861 U+5D97 # [2000] +4-2862 U+5D99 # [2000] +4-2863 U+5DB0 # [2000] +4-2864 U+5DB2 # [2000] +4-2865 U+5DB4 # [2000] +4-2866 U+21F76 # [2000] [Unicode3.1] Private: U+F809 +4-2867 U+5DB9 # [2000] +4-2868 U+5DD1 # [2000] +4-2869 U+5DD7 # [2000] +4-286A U+5DD8 # [2000] +4-286B U+5DE0 # [2000] +4-286C U+21FFA # [2000] [Unicode3.1] Private: U+F80A +4-286D U+5DE4 # [2000] +4-286E U+5DE9 # [2000] +4-286F U+382F # [2000] +4-2870 U+5E00 # [2000] +4-2871 U+3836 # [2000] +4-2872 U+5E12 # [2000] +4-2873 U+5E15 # [2000] +4-2874 U+3840 # [2000] +4-2875 U+5E1F # [2000] +4-2876 U+5E2E # [2000] +4-2877 U+5E3E # [2000] +4-2878 U+5E49 # [2000] +4-2879 U+385C # [2000] +4-287A U+5E56 # [2000] +4-287B U+3861 # [2000] +4-287C U+5E6B # [2000] +4-287D U+5E6C # [2000] +4-287E U+5E6D # [2000] +4-2C21 U+5E6E # [2000] +4-2C22 U+2217B # [2000] [Unicode3.1] Private: U+F80B +4-2C23 U+5EA5 # [2000] +4-2C24 U+5EAA # [2000] +4-2C25 U+5EAC # [2000] +4-2C26 U+5EB9 # [2000] +4-2C27 U+5EBF # [2000] +4-2C28 U+5EC6 # [2000] +4-2C29 U+5ED2 # [2000] +4-2C2A U+5ED9 # [2000] +4-2C2B U+2231E # [2000] [Unicode3.1] Private: U+F80C +4-2C2C U+5EFD # [2000] +4-2C2D U+5F08 # [2000] +4-2C2E U+5F0E # [2000] +4-2C2F U+5F1C # [2000] +4-2C30 U+223AD # [2000] [Unicode3.1] Private: U+F80D +4-2C31 U+5F1E # [2000] +4-2C32 U+5F47 # [2000] +4-2C33 U+5F63 # [2000] +4-2C34 U+5F72 # [2000] +4-2C35 U+5F7E # [2000] +4-2C36 U+5F8F # [2000] +4-2C37 U+5FA2 # [2000] +4-2C38 U+5FA4 # [2000] +4-2C39 U+5FB8 # [2000] +4-2C3A U+5FC4 # [2000] +4-2C3B U+38FA # [2000] +4-2C3C U+5FC7 # [2000] +4-2C3D U+5FCB # [2000] +4-2C3E U+5FD2 # [2000] +4-2C3F U+5FD3 # [2000] +4-2C40 U+5FD4 # [2000] +4-2C41 U+5FE2 # [2000] +4-2C42 U+5FEE # [2000] +4-2C43 U+5FEF # [2000] +4-2C44 U+5FF3 # [2000] +4-2C45 U+5FFC # [2000] +4-2C46 U+3917 # [2000] +4-2C47 U+6017 # [2000] +4-2C48 U+6022 # [2000] +4-2C49 U+6024 # [2000] +4-2C4A U+391A # [2000] +4-2C4B U+604C # [2000] +4-2C4C U+607F # [2000] +4-2C4D U+608A # [2000] +4-2C4E U+6095 # [2000] +4-2C4F U+60A8 # [2000] +4-2C50 U+226F3 # [2000] [Unicode3.1] Private: U+F80E +4-2C51 U+60B0 # [2000] +4-2C52 U+60B1 # [2000] +4-2C53 U+60BE # [2000] +4-2C54 U+60C8 # [2000] +4-2C55 U+60D9 # [2000] +4-2C56 U+60DB # [2000] +4-2C57 U+60EE # [2000] +4-2C58 U+60F2 # [2000] +4-2C59 U+60F5 # [2000] +4-2C5A U+6110 # [2000] +4-2C5B U+6112 # [2000] +4-2C5C U+6113 # [2000] +4-2C5D U+6119 # [2000] +4-2C5E U+611E # [2000] +4-2C5F U+613A # [2000] +4-2C60 U+396F # [2000] +4-2C61 U+6141 # [2000] +4-2C62 U+6146 # [2000] +4-2C63 U+6160 # [2000] +4-2C64 U+617C # [2000] +4-2C65 U+2285B # [2000] [Unicode3.1] Private: U+F80F +4-2C66 U+6192 # [2000] +4-2C67 U+6193 # [2000] +4-2C68 U+6197 # [2000] +4-2C69 U+6198 # [2000] +4-2C6A U+61A5 # [2000] +4-2C6B U+61A8 # [2000] +4-2C6C U+61AD # [2000] +4-2C6D U+228AB # [2000] [Unicode3.1] Private: U+F810 +4-2C6E U+61D5 # [2000] +4-2C6F U+61DD # [2000] +4-2C70 U+61DF # [2000] +4-2C71 U+61F5 # [2000] +4-2C72 U+2298F # [2000] [Unicode3.1] Private: U+F811 +4-2C73 U+6215 # [2000] +4-2C74 U+6223 # [2000] +4-2C75 U+6229 # [2000] +4-2C76 U+6246 # [2000] +4-2C77 U+624C # [2000] +4-2C78 U+6251 # [2000] +4-2C79 U+6252 # [2000] +4-2C7A U+6261 # [2000] +4-2C7B U+6264 # [2000] +4-2C7C U+627B # [2000] +4-2C7D U+626D # [2000] +4-2C7E U+6273 # [2000] +4-2D21 U+6299 # [2000] +4-2D22 U+62A6 # [2000] +4-2D23 U+62D5 # [2000] +4-2D24 U+22AB8 # [2000] [Unicode3.1] Private: U+F812 +4-2D25 U+62FD # [2000] +4-2D26 U+6303 # [2000] +4-2D27 U+630D # [2000] +4-2D28 U+6310 # [2000] +4-2D29 U+22B4F # [2000] [Unicode3.1] Private: U+F813 +4-2D2A U+22B50 # [2000] [Unicode3.1] Private: U+F814 +4-2D2B U+6332 # [2000] +4-2D2C U+6335 # [2000] +4-2D2D U+633B # [2000] +4-2D2E U+633C # [2000] +4-2D2F U+6341 # [2000] +4-2D30 U+6344 # [2000] +4-2D31 U+634E # [2000] +4-2D32 U+22B46 # [2000] [Unicode3.1] Private: U+F815 +4-2D33 U+6359 # [2000] +4-2D34 U+22C1D # [2000] [Unicode3.1] Private: U+F816 +4-2D35 U+22BA6 # [2000] [Unicode3.1] Private: U+F817 +4-2D36 U+636C # [2000] +4-2D37 U+6384 # [2000] +4-2D38 U+6399 # [2000] +4-2D39 U+22C24 # [2000] [Unicode3.1] Private: U+F818 +4-2D3A U+6394 # [2000] +4-2D3B U+63BD # [2000] +4-2D3C U+63F7 # [2000] +4-2D3D U+63D4 # [2000] +4-2D3E U+63D5 # [2000] +4-2D3F U+63DC # [2000] +4-2D40 U+63E0 # [2000] +4-2D41 U+63EB # [2000] +4-2D42 U+63EC # [2000] +4-2D43 U+63F2 # [2000] +4-2D44 U+6409 # [2000] +4-2D45 U+641E # [2000] +4-2D46 U+6425 # [2000] +4-2D47 U+6429 # [2000] +4-2D48 U+642F # [2000] +4-2D49 U+645A # [2000] +4-2D4A U+645B # [2000] +4-2D4B U+645D # [2000] +4-2D4C U+6473 # [2000] +4-2D4D U+647D # [2000] +4-2D4E U+6487 # [2000] +4-2D4F U+6491 # [2000] +4-2D50 U+649D # [2000] +4-2D51 U+649F # [2000] +4-2D52 U+64CB # [2000] +4-2D53 U+64CC # [2000] +4-2D54 U+64D5 # [2000] +4-2D55 U+64D7 # [2000] +4-2D56 U+22DE1 # [2000] [Unicode3.1] Private: U+F819 +4-2D57 U+64E4 # [2000] +4-2D58 U+64E5 # [2000] +4-2D59 U+64FF # [2000] +4-2D5A U+6504 # [2000] +4-2D5B U+3A6E # [2000] +4-2D5C U+650F # [2000] +4-2D5D U+6514 # [2000] +4-2D5E U+6516 # [2000] +4-2D5F U+3A73 # [2000] +4-2D60 U+651E # [2000] +4-2D61 U+6532 # [2000] +4-2D62 U+6544 # [2000] +4-2D63 U+6554 # [2000] +4-2D64 U+656B # [2000] +4-2D65 U+657A # [2000] +4-2D66 U+6581 # [2000] +4-2D67 U+6584 # [2000] +4-2D68 U+6585 # [2000] +4-2D69 U+658A # [2000] +4-2D6A U+65B2 # [2000] +4-2D6B U+65B5 # [2000] +4-2D6C U+65B8 # [2000] +4-2D6D U+65BF # [2000] +4-2D6E U+65C2 # [2000] +4-2D6F U+65C9 # [2000] +4-2D70 U+65D4 # [2000] +4-2D71 U+3AD6 # [2000] +4-2D72 U+65F2 # [2000] +4-2D73 U+65F9 # [2000] +4-2D74 U+65FC # [2000] +4-2D75 U+6604 # [2000] +4-2D76 U+6608 # [2000] +4-2D77 U+6621 # [2000] +4-2D78 U+662A # [2000] +4-2D79 U+6645 # [2000] +4-2D7A U+6651 # [2000] +4-2D7B U+664E # [2000] +4-2D7C U+3AEA # [2000] +4-2D7D U+231C3 # [2000] [Unicode3.1] Private: U+F81A +4-2D7E U+6657 # [2000] +4-2E21 U+665B # [2000] +4-2E22 U+6663 # [2000] +4-2E23 U+231F5 # [2000] [Unicode3.1] Private: U+F81B +4-2E24 U+231B6 # [2000] [Unicode3.1] Private: U+F81C +4-2E25 U+666A # [2000] +4-2E26 U+666B # [2000] +4-2E27 U+666C # [2000] +4-2E28 U+666D # [2000] +4-2E29 U+667B # [2000] +4-2E2A U+6680 # [2000] +4-2E2B U+6690 # [2000] +4-2E2C U+6692 # [2000] +4-2E2D U+6699 # [2000] +4-2E2E U+3B0E # [2000] +4-2E2F U+66AD # [2000] +4-2E30 U+66B1 # [2000] +4-2E31 U+66B5 # [2000] +4-2E32 U+3B1A # [2000] +4-2E33 U+66BF # [2000] +4-2E34 U+3B1C # [2000] +4-2E35 U+66EC # [2000] +4-2E36 U+3AD7 # [2000] +4-2E37 U+6701 # [2000] +4-2E38 U+6705 # [2000] +4-2E39 U+6712 # [2000] +4-2E3A U+23372 # [2000] [Unicode3.1] Private: U+F81D +4-2E3B U+6719 # [2000] +4-2E3C U+233D3 # [2000] [Unicode3.1] Private: U+F81E +4-2E3D U+233D2 # [2000] [Unicode3.1] Private: U+F81F +4-2E3E U+674C # [2000] +4-2E3F U+674D # [2000] +4-2E40 U+6754 # [2000] +4-2E41 U+675D # [2000] +4-2E42 U+233D0 # [2000] [Unicode3.1] Private: U+F820 +4-2E43 U+233E4 # [2000] [Unicode3.1] Private: U+F821 +4-2E44 U+233D5 # [2000] [Unicode3.1] Private: U+F822 +4-2E45 U+6774 # [2000] +4-2E46 U+6776 # [2000] +4-2E47 U+233DA # [2000] [Unicode3.1] Private: U+F823 +4-2E48 U+6792 # [2000] +4-2E49 U+233DF # [2000] [Unicode3.1] Private: U+F824 +4-2E4A U+8363 # [2000] +4-2E4B U+6810 # [2000] +4-2E4C U+67B0 # [2000] +4-2E4D U+67B2 # [2000] +4-2E4E U+67C3 # [2000] +4-2E4F U+67C8 # [2000] +4-2E50 U+67D2 # [2000] +4-2E51 U+67D9 # [2000] +4-2E52 U+67DB # [2000] +4-2E53 U+67F0 # [2000] +4-2E54 U+67F7 # [2000] +4-2E55 U+2344A # [2000] [Unicode3.1] Private: U+F825 +4-2E56 U+23451 # [2000] [Unicode3.1] Private: U+F826 +4-2E57 U+2344B # [2000] [Unicode3.1] Private: U+F827 +4-2E58 U+6818 # [2000] +4-2E59 U+681F # [2000] +4-2E5A U+682D # [2000] +4-2E5B U+23465 # [2000] [Unicode3.1] Private: U+F828 +4-2E5C U+6833 # [2000] +4-2E5D U+683B # [2000] +4-2E5E U+683E # [2000] +4-2E5F U+6844 # [2000] +4-2E60 U+6845 # [2000] +4-2E61 U+6849 # [2000] +4-2E62 U+684C # [2000] +4-2E63 U+6855 # [2000] +4-2E64 U+6857 # [2000] +4-2E65 U+3B77 # [2000] +4-2E66 U+686B # [2000] +4-2E67 U+686E # [2000] +4-2E68 U+687A # [2000] +4-2E69 U+687C # [2000] +4-2E6A U+6882 # [2000] +4-2E6B U+6890 # [2000] +4-2E6C U+6896 # [2000] +4-2E6D U+3B6D # [2000] +4-2E6E U+6898 # [2000] +4-2E6F U+6899 # [2000] +4-2E70 U+689A # [2000] +4-2E71 U+689C # [2000] +4-2E72 U+68AA # [2000] +4-2E73 U+68AB # [2000] +4-2E74 U+68B4 # [2000] +4-2E75 U+68BB # [2000] +4-2E76 U+68FB # [2000] +4-2E77 U+234E4 # [2000] [Unicode3.1] Private: U+F829 +4-2E78 U+2355A # [2000] [Unicode3.1] Private: U+F82A +4-2E79 U+FA13 # CJK COMPATIBILITY IDEOGRAPH-FA13 [2000] +4-2E7A U+68C3 # [2000] +4-2E7B U+68C5 # [2000] +4-2E7C U+68CC # [2000] +4-2E7D U+68CF # [2000] +4-2E7E U+68D6 # [2000] +4-2F21 U+68D9 # [2000] +4-2F22 U+68E4 # [2000] +4-2F23 U+68E5 # [2000] +4-2F24 U+68EC # [2000] +4-2F25 U+68F7 # [2000] +4-2F26 U+6903 # [2000] +4-2F27 U+6907 # [2000] +4-2F28 U+3B87 # [2000] +4-2F29 U+3B88 # [2000] +4-2F2A U+23594 # [2000] [Unicode3.1] Private: U+F82B +4-2F2B U+693B # [2000] +4-2F2C U+3B8D # [2000] +4-2F2D U+6946 # [2000] +4-2F2E U+6969 # [2000] +4-2F2F U+696C # [2000] +4-2F30 U+6972 # [2000] +4-2F31 U+697A # [2000] +4-2F32 U+697F # [2000] +4-2F33 U+6992 # [2000] +4-2F34 U+3BA4 # [2000] +4-2F35 U+6996 # [2000] +4-2F36 U+6998 # [2000] +4-2F37 U+69A6 # [2000] +4-2F38 U+69B0 # [2000] +4-2F39 U+69B7 # [2000] +4-2F3A U+69BA # [2000] +4-2F3B U+69BC # [2000] +4-2F3C U+69C0 # [2000] +4-2F3D U+69D1 # [2000] +4-2F3E U+69D6 # [2000] +4-2F3F U+23639 # [2000] [Unicode3.1] Private: U+F82C +4-2F40 U+23647 # [2000] [Unicode3.1] Private: U+F82D +4-2F41 U+6A30 # [2000] +4-2F42 U+23638 # [2000] [Unicode3.1] Private: U+F82E +4-2F43 U+2363A # [2000] [Unicode3.1] Private: U+F82F +4-2F44 U+69E3 # [2000] +4-2F45 U+69EE # [2000] +4-2F46 U+69EF # [2000] +4-2F47 U+69F3 # [2000] +4-2F48 U+3BCD # [2000] +4-2F49 U+69F4 # [2000] +4-2F4A U+69FE # [2000] +4-2F4B U+6A11 # [2000] +4-2F4C U+6A1A # [2000] +4-2F4D U+6A1D # [2000] +4-2F4E U+2371C # [2000] [Unicode3.1] Private: U+F830 +4-2F4F U+6A32 # [2000] +4-2F50 U+6A33 # [2000] +4-2F51 U+6A34 # [2000] +4-2F52 U+6A3F # [2000] +4-2F53 U+6A46 # [2000] +4-2F54 U+6A49 # [2000] +4-2F55 U+6A7A # [2000] +4-2F56 U+6A4E # [2000] +4-2F57 U+6A52 # [2000] +4-2F58 U+6A64 # [2000] +4-2F59 U+2370C # [2000] [Unicode3.1] Private: U+F831 +4-2F5A U+6A7E # [2000] +4-2F5B U+6A83 # [2000] +4-2F5C U+6A8B # [2000] +4-2F5D U+3BF0 # [2000] +4-2F5E U+6A91 # [2000] +4-2F5F U+6A9F # [2000] +4-2F60 U+6AA1 # [2000] +4-2F61 U+23764 # [2000] [Unicode3.1] Private: U+F832 +4-2F62 U+6AAB # [2000] +4-2F63 U+6ABD # [2000] +4-2F64 U+6AC6 # [2000] +4-2F65 U+6AD4 # [2000] +4-2F66 U+6AD0 # [2000] +4-2F67 U+6ADC # [2000] +4-2F68 U+6ADD # [2000] +4-2F69 U+237FF # [2000] [Unicode3.1] Private: U+F833 +4-2F6A U+237E7 # [2000] [Unicode3.1] Private: U+F834 +4-2F6B U+6AEC # [2000] +4-2F6C U+6AF1 # [2000] +4-2F6D U+6AF2 # [2000] +4-2F6E U+6AF3 # [2000] +4-2F6F U+6AFD # [2000] +4-2F70 U+23824 # [2000] [Unicode3.1] Private: U+F835 +4-2F71 U+6B0B # [2000] +4-2F72 U+6B0F # [2000] +4-2F73 U+6B10 # [2000] +4-2F74 U+6B11 # [2000] +4-2F75 U+2383D # [2000] [Unicode3.1] Private: U+F836 +4-2F76 U+6B17 # [2000] +4-2F77 U+3C26 # [2000] +4-2F78 U+6B2F # [2000] +4-2F79 U+6B4A # [2000] +4-2F7A U+6B58 # [2000] +4-2F7B U+6B6C # [2000] +4-2F7C U+6B75 # [2000] +4-2F7D U+6B7A # [2000] +4-2F7E U+6B81 # [2000] +4-6E21 U+6B9B # [2000] +4-6E22 U+6BAE # [2000] +4-6E23 U+23A98 # [2000] [Unicode3.1] Private: U+F837 +4-6E24 U+6BBD # [2000] +4-6E25 U+6BBE # [2000] +4-6E26 U+6BC7 # [2000] +4-6E27 U+6BC8 # [2000] +4-6E28 U+6BC9 # [2000] +4-6E29 U+6BDA # [2000] +4-6E2A U+6BE6 # [2000] +4-6E2B U+6BE7 # [2000] +4-6E2C U+6BEE # [2000] +4-6E2D U+6BF1 # [2000] +4-6E2E U+6C02 # [2000] +4-6E2F U+6C0A # [2000] +4-6E30 U+6C0E # [2000] +4-6E31 U+6C35 # [2000] +4-6E32 U+6C36 # [2000] +4-6E33 U+6C3A # [2000] +4-6E34 U+23C7F # [2000] [Unicode3.1] Private: U+F838 +4-6E35 U+6C3F # [2000] +4-6E36 U+6C4D # [2000] +4-6E37 U+6C5B # [2000] +4-6E38 U+6C6D # [2000] +4-6E39 U+6C84 # [2000] +4-6E3A U+6C89 # [2000] +4-6E3B U+3CC3 # [2000] +4-6E3C U+6C94 # [2000] +4-6E3D U+6C95 # [2000] +4-6E3E U+6C97 # [2000] +4-6E3F U+6CAD # [2000] +4-6E40 U+6CC2 # [2000] +4-6E41 U+6CD0 # [2000] +4-6E42 U+3CD2 # [2000] +4-6E43 U+6CD6 # [2000] +4-6E44 U+6CDA # [2000] +4-6E45 U+6CDC # [2000] +4-6E46 U+6CE9 # [2000] +4-6E47 U+6CEC # [2000] +4-6E48 U+6CED # [2000] +4-6E49 U+23D00 # [2000] [Unicode3.1] Private: U+F839 +4-6E4A U+6D00 # [2000] +4-6E4B U+6D0A # [2000] +4-6E4C U+6D24 # [2000] +4-6E4D U+6D26 # [2000] +4-6E4E U+6D27 # [2000] +4-6E4F U+6C67 # [2000] +4-6E50 U+6D2F # [2000] +4-6E51 U+6D3C # [2000] +4-6E52 U+6D5B # [2000] +4-6E53 U+6D5E # [2000] +4-6E54 U+6D60 # [2000] +4-6E55 U+6D70 # [2000] +4-6E56 U+6D80 # [2000] +4-6E57 U+6D81 # [2000] +4-6E58 U+6D8A # [2000] +4-6E59 U+6D8D # [2000] +4-6E5A U+6D91 # [2000] +4-6E5B U+6D98 # [2000] +4-6E5C U+23D40 # [2000] [Unicode3.1] Private: U+F83A +4-6E5D U+6E17 # [2000] +4-6E5E U+23DFA # [2000] [Unicode3.1] Private: U+F83B +4-6E5F U+23DF9 # [2000] [Unicode3.1] Private: U+F83C +4-6E60 U+23DD3 # [2000] [Unicode3.1] Private: U+F83D +4-6E61 U+6DAB # [2000] +4-6E62 U+6DAE # [2000] +4-6E63 U+6DB4 # [2000] +4-6E64 U+6DC2 # [2000] +4-6E65 U+6D34 # [2000] +4-6E66 U+6DC8 # [2000] +4-6E67 U+6DCE # [2000] +4-6E68 U+6DCF # [2000] +4-6E69 U+6DD0 # [2000] +4-6E6A U+6DDF # [2000] +4-6E6B U+6DE9 # [2000] +4-6E6C U+6DF6 # [2000] +4-6E6D U+6E36 # [2000] +4-6E6E U+6E1E # [2000] +4-6E6F U+6E22 # [2000] +4-6E70 U+6E27 # [2000] +4-6E71 U+3D11 # [2000] +4-6E72 U+6E32 # [2000] +4-6E73 U+6E3C # [2000] +4-6E74 U+6E48 # [2000] +4-6E75 U+6E49 # [2000] +4-6E76 U+6E4B # [2000] +4-6E77 U+6E4C # [2000] +4-6E78 U+6E4F # [2000] +4-6E79 U+6E51 # [2000] +4-6E7A U+6E53 # [2000] +4-6E7B U+6E54 # [2000] +4-6E7C U+6E57 # [2000] +4-6E7D U+6E63 # [2000] +4-6E7E U+3D1E # [2000] +4-6F21 U+6E93 # [2000] +4-6F22 U+6EA7 # [2000] +4-6F23 U+6EB4 # [2000] +4-6F24 U+6EBF # [2000] +4-6F25 U+6EC3 # [2000] +4-6F26 U+6ECA # [2000] +4-6F27 U+6ED9 # [2000] +4-6F28 U+6F35 # [2000] +4-6F29 U+6EEB # [2000] +4-6F2A U+6EF9 # [2000] +4-6F2B U+6EFB # [2000] +4-6F2C U+6F0A # [2000] +4-6F2D U+6F0C # [2000] +4-6F2E U+6F18 # [2000] +4-6F2F U+6F25 # [2000] +4-6F30 U+6F36 # [2000] +4-6F31 U+6F3C # [2000] +4-6F32 U+23F7E # [2000] [Unicode3.1] Private: U+F83E +4-6F33 U+6F52 # [2000] +4-6F34 U+6F57 # [2000] +4-6F35 U+6F5A # [2000] +4-6F36 U+6F60 # [2000] +4-6F37 U+6F68 # [2000] +4-6F38 U+6F98 # [2000] +4-6F39 U+6F7D # [2000] +4-6F3A U+6F90 # [2000] +4-6F3B U+6F96 # [2000] +4-6F3C U+6FBE # [2000] +4-6F3D U+6F9F # [2000] +4-6F3E U+6FA5 # [2000] +4-6F3F U+6FAF # [2000] +4-6F40 U+3D64 # [2000] +4-6F41 U+6FB5 # [2000] +4-6F42 U+6FC8 # [2000] +4-6F43 U+6FC9 # [2000] +4-6F44 U+6FDA # [2000] +4-6F45 U+6FDE # [2000] +4-6F46 U+6FE9 # [2000] +4-6F47 U+24096 # [2000] [Unicode3.1] Private: U+F83F +4-6F48 U+6FFC # [2000] +4-6F49 U+7000 # [2000] +4-6F4A U+7007 # [2000] +4-6F4B U+700A # [2000] +4-6F4C U+7023 # [2000] +4-6F4D U+24103 # [2000] [Unicode3.1] Private: U+F840 +4-6F4E U+7039 # [2000] +4-6F4F U+703A # [2000] +4-6F50 U+703C # [2000] +4-6F51 U+7043 # [2000] +4-6F52 U+7047 # [2000] +4-6F53 U+704B # [2000] +4-6F54 U+3D9A # [2000] +4-6F55 U+7054 # [2000] +4-6F56 U+7065 # [2000] +4-6F57 U+7069 # [2000] +4-6F58 U+706C # [2000] +4-6F59 U+706E # [2000] +4-6F5A U+7076 # [2000] +4-6F5B U+707E # [2000] +4-6F5C U+7081 # [2000] +4-6F5D U+7086 # [2000] +4-6F5E U+7095 # [2000] +4-6F5F U+7097 # [2000] +4-6F60 U+70BB # [2000] +4-6F61 U+241C6 # [2000] [Unicode3.1] Private: U+F841 +4-6F62 U+709F # [2000] +4-6F63 U+70B1 # [2000] +4-6F64 U+241FE # [2000] [Unicode3.1] Private: U+F842 +4-6F65 U+70EC # [2000] +4-6F66 U+70CA # [2000] +4-6F67 U+70D1 # [2000] +4-6F68 U+70D3 # [2000] +4-6F69 U+70DC # [2000] +4-6F6A U+7103 # [2000] +4-6F6B U+7104 # [2000] +4-6F6C U+7106 # [2000] +4-6F6D U+7107 # [2000] +4-6F6E U+7108 # [2000] +4-6F6F U+710C # [2000] +4-6F70 U+3DC0 # [2000] +4-6F71 U+712F # [2000] +4-6F72 U+7131 # [2000] +4-6F73 U+7150 # [2000] +4-6F74 U+714A # [2000] +4-6F75 U+7153 # [2000] +4-6F76 U+715E # [2000] +4-6F77 U+3DD4 # [2000] +4-6F78 U+7196 # [2000] +4-6F79 U+7180 # [2000] +4-6F7A U+719B # [2000] +4-6F7B U+71A0 # [2000] +4-6F7C U+71A2 # [2000] +4-6F7D U+71AE # [2000] +4-6F7E U+71AF # [2000] +4-7021 U+71B3 # [2000] +4-7022 U+243BC # [2000] [Unicode3.1] Private: U+F843 +4-7023 U+71CB # [2000] +4-7024 U+71D3 # [2000] +4-7025 U+71D9 # [2000] +4-7026 U+71DC # [2000] +4-7027 U+7207 # [2000] +4-7028 U+3E05 # [2000] +4-7029 U+FA49 # CJK COMPATIBILITY IDEOGRAPH-FA49 [2000] [Unicode3.2] +4-702A U+722B # [2000] +4-702B U+7234 # [2000] +4-702C U+7238 # [2000] +4-702D U+7239 # [2000] +4-702E U+4E2C # [2000] +4-702F U+7242 # [2000] +4-7030 U+7253 # [2000] +4-7031 U+7257 # [2000] +4-7032 U+7263 # [2000] +4-7033 U+24629 # [2000] [Unicode3.1] Private: U+F845 +4-7034 U+726E # [2000] +4-7035 U+726F # [2000] +4-7036 U+7278 # [2000] +4-7037 U+727F # [2000] +4-7038 U+728E # [2000] +4-7039 U+246A5 # [2000] [Unicode3.1] Private: U+F846 +4-703A U+72AD # [2000] +4-703B U+72AE # [2000] +4-703C U+72B0 # [2000] +4-703D U+72B1 # [2000] +4-703E U+72C1 # [2000] +4-703F U+3E60 # [2000] +4-7040 U+72CC # [2000] +4-7041 U+3E66 # [2000] +4-7042 U+3E68 # [2000] +4-7043 U+72F3 # [2000] +4-7044 U+72FA # [2000] +4-7045 U+7307 # [2000] +4-7046 U+7312 # [2000] +4-7047 U+7318 # [2000] +4-7048 U+7319 # [2000] +4-7049 U+3E83 # [2000] +4-704A U+7339 # [2000] +4-704B U+732C # [2000] +4-704C U+7331 # [2000] +4-704D U+7333 # [2000] +4-704E U+733D # [2000] +4-704F U+7352 # [2000] +4-7050 U+3E94 # [2000] +4-7051 U+736B # [2000] +4-7052 U+736C # [2000] +4-7053 U+24896 # [2000] [Unicode3.1] Private: U+F847 +4-7054 U+736E # [2000] +4-7055 U+736F # [2000] +4-7056 U+7371 # [2000] +4-7057 U+7377 # [2000] +4-7058 U+7381 # [2000] +4-7059 U+7385 # [2000] +4-705A U+738A # [2000] +4-705B U+7394 # [2000] +4-705C U+7398 # [2000] +4-705D U+739C # [2000] +4-705E U+739E # [2000] +4-705F U+73A5 # [2000] +4-7060 U+73A8 # [2000] +4-7061 U+73B5 # [2000] +4-7062 U+73B7 # [2000] +4-7063 U+73B9 # [2000] +4-7064 U+73BC # [2000] +4-7065 U+73BF # [2000] +4-7066 U+73C5 # [2000] +4-7067 U+73CB # [2000] +4-7068 U+73E1 # [2000] +4-7069 U+73E7 # [2000] +4-706A U+73F9 # [2000] +4-706B U+7413 # [2000] +4-706C U+73FA # [2000] +4-706D U+7401 # [2000] +4-706E U+7424 # [2000] +4-706F U+7431 # [2000] +4-7070 U+7439 # [2000] +4-7071 U+7453 # [2000] +4-7072 U+7440 # [2000] +4-7073 U+7443 # [2000] +4-7074 U+744D # [2000] +4-7075 U+7452 # [2000] +4-7076 U+745D # [2000] +4-7077 U+7471 # [2000] +4-7078 U+7481 # [2000] +4-7079 U+7485 # [2000] +4-707A U+7488 # [2000] +4-707B U+24A4D # [2000] [Unicode3.1] Private: U+F848 +4-707C U+7492 # [2000] +4-707D U+7497 # [2000] +4-707E U+7499 # [2000] +4-7121 U+74A0 # [2000] +4-7122 U+74A1 # [2000] +4-7123 U+74A5 # [2000] +4-7124 U+74AA # [2000] +4-7125 U+74AB # [2000] +4-7126 U+74B9 # [2000] +4-7127 U+74BB # [2000] +4-7128 U+74BA # [2000] +4-7129 U+74D6 # [2000] +4-712A U+74D8 # [2000] +4-712B U+74DE # [2000] +4-712C U+74EF # [2000] +4-712D U+74EB # [2000] +4-712E U+24B56 # [2000] [Unicode3.1] Private: U+F849 +4-712F U+74FA # [2000] +4-7130 U+24B6F # [2000] [Unicode3.1] Private: U+F84A +4-7131 U+7520 # [2000] +4-7132 U+7524 # [2000] +4-7133 U+752A # [2000] +4-7134 U+3F57 # [2000] +4-7135 U+24C16 # [2000] [Unicode3.1] Private: U+F84B +4-7136 U+753D # [2000] +4-7137 U+753E # [2000] +4-7138 U+7540 # [2000] +4-7139 U+7548 # [2000] +4-713A U+754E # [2000] +4-713B U+7550 # [2000] +4-713C U+7552 # [2000] +4-713D U+756C # [2000] +4-713E U+7572 # [2000] +4-713F U+7571 # [2000] +4-7140 U+757A # [2000] +4-7141 U+757D # [2000] +4-7142 U+757E # [2000] +4-7143 U+7581 # [2000] +4-7144 U+24D14 # [2000] [Unicode3.1] Private: U+F84C +4-7145 U+758C # [2000] +4-7146 U+3F75 # [2000] +4-7147 U+75A2 # [2000] +4-7148 U+3F77 # [2000] +4-7149 U+75B0 # [2000] +4-714A U+75B7 # [2000] +4-714B U+75BF # [2000] +4-714C U+75C0 # [2000] +4-714D U+75C6 # [2000] +4-714E U+75CF # [2000] +4-714F U+75D3 # [2000] +4-7150 U+75DD # [2000] +4-7151 U+75DF # [2000] +4-7152 U+75E0 # [2000] +4-7153 U+75E7 # [2000] +4-7154 U+75EC # [2000] +4-7155 U+75EE # [2000] +4-7156 U+75F1 # [2000] +4-7157 U+75F9 # [2000] +4-7158 U+7603 # [2000] +4-7159 U+7618 # [2000] +4-715A U+7607 # [2000] +4-715B U+760F # [2000] +4-715C U+3FAE # [2000] +4-715D U+24E0E # [2000] [Unicode3.1] Private: U+F84D +4-715E U+7613 # [2000] +4-715F U+761B # [2000] +4-7160 U+761C # [2000] +4-7161 U+24E37 # [2000] [Unicode3.1] Private: U+F84E +4-7162 U+7625 # [2000] +4-7163 U+7628 # [2000] +4-7164 U+763C # [2000] +4-7165 U+7633 # [2000] +4-7166 U+24E6A # [2000] [Unicode3.1] Private: U+F84F +4-7167 U+3FC9 # [2000] +4-7168 U+7641 # [2000] +4-7169 U+24E8B # [2000] [Unicode3.1] Private: U+F850 +4-716A U+7649 # [2000] +4-716B U+7655 # [2000] +4-716C U+3FD7 # [2000] +4-716D U+766E # [2000] +4-716E U+7695 # [2000] +4-716F U+769C # [2000] +4-7170 U+76A1 # [2000] +4-7171 U+76A0 # [2000] +4-7172 U+76A7 # [2000] +4-7173 U+76A8 # [2000] +4-7174 U+76AF # [2000] +4-7175 U+2504A # [2000] [Unicode3.1] Private: U+F851 +4-7176 U+76C9 # [2000] +4-7177 U+25055 # [2000] [Unicode3.1] Private: U+F852 +4-7178 U+76E8 # [2000] +4-7179 U+76EC # [2000] +4-717A U+25122 # [2000] [Unicode3.1] Private: U+F853 +4-717B U+7717 # [2000] +4-717C U+771A # [2000] +4-717D U+772D # [2000] +4-717E U+7735 # [2000] +4-7221 U+251A9 # [2000] [Unicode3.1] Private: U+F854 +4-7222 U+4039 # [2000] +4-7223 U+251E5 # [2000] [Unicode3.1] Private: U+F855 +4-7224 U+251CD # [2000] [Unicode3.1] Private: U+F856 +4-7225 U+7758 # [2000] +4-7226 U+7760 # [2000] +4-7227 U+776A # [2000] +4-7228 U+2521E # [2000] [Unicode3.1] Private: U+F857 +4-7229 U+7772 # [2000] +4-722A U+777C # [2000] +4-722B U+777D # [2000] +4-722C U+2524C # [2000] [Unicode3.1] Private: U+F858 +4-722D U+4058 # [2000] +4-722E U+779A # [2000] +4-722F U+779F # [2000] +4-7230 U+77A2 # [2000] +4-7231 U+77A4 # [2000] +4-7232 U+77A9 # [2000] +4-7233 U+77DE # [2000] +4-7234 U+77DF # [2000] +4-7235 U+77E4 # [2000] +4-7236 U+77E6 # [2000] +4-7237 U+77EA # [2000] +4-7238 U+77EC # [2000] +4-7239 U+4093 # [2000] +4-723A U+77F0 # [2000] +4-723B U+77F4 # [2000] +4-723C U+77FB # [2000] +4-723D U+2542E # [2000] [Unicode3.1] Private: U+F859 +4-723E U+7805 # [2000] +4-723F U+7806 # [2000] +4-7240 U+7809 # [2000] +4-7241 U+780D # [2000] +4-7242 U+7819 # [2000] +4-7243 U+7821 # [2000] +4-7244 U+782C # [2000] +4-7245 U+7847 # [2000] +4-7246 U+7864 # [2000] +4-7247 U+786A # [2000] +4-7248 U+254D9 # [2000] [Unicode3.1] Private: U+F85A +4-7249 U+788A # [2000] +4-724A U+7894 # [2000] +4-724B U+78A4 # [2000] +4-724C U+789D # [2000] +4-724D U+789E # [2000] +4-724E U+789F # [2000] +4-724F U+78BB # [2000] +4-7250 U+78C8 # [2000] +4-7251 U+78CC # [2000] +4-7252 U+78CE # [2000] +4-7253 U+78D5 # [2000] +4-7254 U+78E0 # [2000] +4-7255 U+78E1 # [2000] +4-7256 U+78E6 # [2000] +4-7257 U+78F9 # [2000] +4-7258 U+78FA # [2000] +4-7259 U+78FB # [2000] +4-725A U+78FE # [2000] +4-725B U+255A7 # [2000] [Unicode3.1] Private: U+F85B +4-725C U+7910 # [2000] +4-725D U+791B # [2000] +4-725E U+7930 # [2000] +4-725F U+7925 # [2000] +4-7260 U+793B # [2000] +4-7261 U+794A # [2000] +4-7262 U+7958 # [2000] +4-7263 U+795B # [2000] +4-7264 U+4105 # [2000] +4-7265 U+7967 # [2000] +4-7266 U+7972 # [2000] +4-7267 U+7994 # [2000] +4-7268 U+7995 # [2000] +4-7269 U+7996 # [2000] +4-726A U+799B # [2000] +4-726B U+79A1 # [2000] +4-726C U+79A9 # [2000] +4-726D U+79B4 # [2000] +4-726E U+79BB # [2000] +4-726F U+79C2 # [2000] +4-7270 U+79C7 # [2000] +4-7271 U+79CC # [2000] +4-7272 U+79CD # [2000] +4-7273 U+79D6 # [2000] +4-7274 U+4148 # [2000] +4-7275 U+257A9 # [2000] [Unicode3.1] Private: U+F85C +4-7276 U+257B4 # [2000] [Unicode3.1] Private: U+F85D +4-7277 U+414F # [2000] +4-7278 U+7A0A # [2000] +4-7279 U+7A11 # [2000] +4-727A U+7A15 # [2000] +4-727B U+7A1B # [2000] +4-727C U+7A1E # [2000] +4-727D U+4163 # [2000] +4-727E U+7A2D # [2000] +4-7321 U+7A38 # [2000] +4-7322 U+7A47 # [2000] +4-7323 U+7A4C # [2000] +4-7324 U+7A56 # [2000] +4-7325 U+7A59 # [2000] +4-7326 U+7A5C # [2000] +4-7327 U+7A5F # [2000] +4-7328 U+7A60 # [2000] +4-7329 U+7A67 # [2000] +4-732A U+7A6A # [2000] +4-732B U+7A75 # [2000] +4-732C U+7A78 # [2000] +4-732D U+7A82 # [2000] +4-732E U+7A8A # [2000] +4-732F U+7A90 # [2000] +4-7330 U+7AA3 # [2000] +4-7331 U+7AAC # [2000] +4-7332 U+259D4 # [2000] [Unicode3.1] Private: U+F85E +4-7333 U+41B4 # [2000] +4-7334 U+7AB9 # [2000] +4-7335 U+7ABC # [2000] +4-7336 U+7ABE # [2000] +4-7337 U+41BF # [2000] +4-7338 U+7ACC # [2000] +4-7339 U+7AD1 # [2000] +4-733A U+7AE7 # [2000] +4-733B U+7AE8 # [2000] +4-733C U+7AF4 # [2000] +4-733D U+25AE4 # [2000] [Unicode3.1] Private: U+F85F +4-733E U+25AE3 # [2000] [Unicode3.1] Private: U+F860 +4-733F U+7B07 # [2000] +4-7340 U+25AF1 # [2000] [Unicode3.1] Private: U+F861 +4-7341 U+7B3D # [2000] +4-7342 U+7B27 # [2000] +4-7343 U+7B2A # [2000] +4-7344 U+7B2E # [2000] +4-7345 U+7B2F # [2000] +4-7346 U+7B31 # [2000] +4-7347 U+41E6 # [2000] +4-7348 U+41F3 # [2000] +4-7349 U+7B7F # [2000] +4-734A U+7B41 # [2000] +4-734B U+41EE # [2000] +4-734C U+7B55 # [2000] +4-734D U+7B79 # [2000] +4-734E U+7B64 # [2000] +4-734F U+7B66 # [2000] +4-7350 U+7B69 # [2000] +4-7351 U+7B73 # [2000] +4-7352 U+25BB2 # [2000] [Unicode3.1] Private: U+F862 +4-7353 U+4207 # [2000] +4-7354 U+7B90 # [2000] +4-7355 U+7B91 # [2000] +4-7356 U+7B9B # [2000] +4-7357 U+420E # [2000] +4-7358 U+7BAF # [2000] +4-7359 U+7BB5 # [2000] +4-735A U+7BBC # [2000] +4-735B U+7BC5 # [2000] +4-735C U+7BCA # [2000] +4-735D U+25C4B # [2000] [Unicode3.1] Private: U+F863 +4-735E U+25C64 # [2000] [Unicode3.1] Private: U+F864 +4-735F U+7BD4 # [2000] +4-7360 U+7BD6 # [2000] +4-7361 U+7BDA # [2000] +4-7362 U+7BEA # [2000] +4-7363 U+7BF0 # [2000] +4-7364 U+7C03 # [2000] +4-7365 U+7C0B # [2000] +4-7366 U+7C0E # [2000] +4-7367 U+7C0F # [2000] +4-7368 U+7C26 # [2000] +4-7369 U+7C45 # [2000] +4-736A U+7C4A # [2000] +4-736B U+7C51 # [2000] +4-736C U+7C57 # [2000] +4-736D U+7C5E # [2000] +4-736E U+7C61 # [2000] +4-736F U+7C69 # [2000] +4-7370 U+7C6E # [2000] +4-7371 U+7C6F # [2000] +4-7372 U+7C70 # [2000] +4-7373 U+25E2E # [2000] [Unicode3.1] Private: U+F865 +4-7374 U+25E56 # [2000] [Unicode3.1] Private: U+F866 +4-7375 U+25E65 # [2000] [Unicode3.1] Private: U+F867 +4-7376 U+7CA6 # [2000] +4-7377 U+25E62 # [2000] [Unicode3.1] Private: U+F868 +4-7378 U+7CB6 # [2000] +4-7379 U+7CB7 # [2000] +4-737A U+7CBF # [2000] +4-737B U+25ED8 # [2000] [Unicode3.1] Private: U+F869 +4-737C U+7CC4 # [2000] +4-737D U+25EC2 # [2000] [Unicode3.1] Private: U+F86A +4-737E U+7CC8 # [2000] +4-7421 U+7CCD # [2000] +4-7422 U+25EE8 # [2000] [Unicode3.1] Private: U+F86B +4-7423 U+7CD7 # [2000] +4-7424 U+25F23 # [2000] [Unicode3.1] Private: U+F86C +4-7425 U+7CE6 # [2000] +4-7426 U+7CEB # [2000] +4-7427 U+25F5C # [2000] [Unicode3.1] Private: U+F86D +4-7428 U+7CF5 # [2000] +4-7429 U+7D03 # [2000] +4-742A U+7D09 # [2000] +4-742B U+42C6 # [2000] +4-742C U+7D12 # [2000] +4-742D U+7D1E # [2000] +4-742E U+25FE0 # [2000] [Unicode3.1] Private: U+F86E +4-742F U+25FD4 # [2000] [Unicode3.1] Private: U+F86F +4-7430 U+7D3D # [2000] +4-7431 U+7D3E # [2000] +4-7432 U+7D40 # [2000] +4-7433 U+7D47 # [2000] +4-7434 U+2600C # [2000] [Unicode3.1] Private: U+F870 +4-7435 U+25FFB # [2000] [Unicode3.1] Private: U+F871 +4-7436 U+42D6 # [2000] +4-7437 U+7D59 # [2000] +4-7438 U+7D5A # [2000] +4-7439 U+7D6A # [2000] +4-743A U+7D70 # [2000] +4-743B U+42DD # [2000] +4-743C U+7D7F # [2000] +4-743D U+26017 # [2000] [Unicode3.1] Private: U+F872 +4-743E U+7D86 # [2000] +4-743F U+7D88 # [2000] +4-7440 U+7D8C # [2000] +4-7441 U+7D97 # [2000] +4-7442 U+26060 # [2000] [Unicode3.1] Private: U+F873 +4-7443 U+7D9D # [2000] +4-7444 U+7DA7 # [2000] +4-7445 U+7DAA # [2000] +4-7446 U+7DB6 # [2000] +4-7447 U+7DB7 # [2000] +4-7448 U+7DC0 # [2000] +4-7449 U+7DD7 # [2000] +4-744A U+7DD9 # [2000] +4-744B U+7DE6 # [2000] +4-744C U+7DF1 # [2000] +4-744D U+7DF9 # [2000] +4-744E U+4302 # [2000] +4-744F U+260ED # [2000] [Unicode3.1] Private: U+F874 +4-7450 U+FA58 # CJK COMPATIBILITY IDEOGRAPH-FA58 [2000] [Unicode3.2] +4-7451 U+7E10 # [2000] +4-7452 U+7E17 # [2000] +4-7453 U+7E1D # [2000] +4-7454 U+7E20 # [2000] +4-7455 U+7E27 # [2000] +4-7456 U+7E2C # [2000] +4-7457 U+7E45 # [2000] +4-7458 U+7E73 # [2000] +4-7459 U+7E75 # [2000] +4-745A U+7E7E # [2000] +4-745B U+7E86 # [2000] +4-745C U+7E87 # [2000] +4-745D U+432B # [2000] +4-745E U+7E91 # [2000] +4-745F U+7E98 # [2000] +4-7460 U+7E9A # [2000] +4-7461 U+4343 # [2000] +4-7462 U+7F3C # [2000] +4-7463 U+7F3B # [2000] +4-7464 U+7F3E # [2000] +4-7465 U+7F43 # [2000] +4-7466 U+7F44 # [2000] +4-7467 U+7F4F # [2000] +4-7468 U+34C1 # [2000] +4-7469 U+26270 # [2000] [Unicode3.1] Private: U+F876 +4-746A U+7F52 # [2000] +4-746B U+26286 # [2000] [Unicode3.1] Private: U+F877 +4-746C U+7F61 # [2000] +4-746D U+7F63 # [2000] +4-746E U+7F64 # [2000] +4-746F U+7F6D # [2000] +4-7470 U+7F7D # [2000] +4-7471 U+7F7E # [2000] +4-7472 U+2634C # [2000] [Unicode3.1] Private: U+F878 +4-7473 U+7F90 # [2000] +4-7474 U+517B # [2000] +4-7475 U+23D0E # [2000] [Unicode3.1] Private: U+F879 +4-7476 U+7F96 # [2000] +4-7477 U+7F9C # [2000] +4-7478 U+7FAD # [2000] +4-7479 U+26402 # [2000] [Unicode3.1] Private: U+F87A +4-747A U+7FC3 # [2000] +4-747B U+7FCF # [2000] +4-747C U+7FE3 # [2000] +4-747D U+7FE5 # [2000] +4-747E U+7FEF # [2000] +4-7521 U+7FF2 # [2000] +4-7522 U+8002 # [2000] +4-7523 U+800A # [2000] +4-7524 U+8008 # [2000] +4-7525 U+800E # [2000] +4-7526 U+8011 # [2000] +4-7527 U+8016 # [2000] +4-7528 U+8024 # [2000] +4-7529 U+802C # [2000] +4-752A U+8030 # [2000] +4-752B U+8043 # [2000] +4-752C U+8066 # [2000] +4-752D U+8071 # [2000] +4-752E U+8075 # [2000] +4-752F U+807B # [2000] +4-7530 U+8099 # [2000] +4-7531 U+809C # [2000] +4-7532 U+80A4 # [2000] +4-7533 U+80A7 # [2000] +4-7534 U+80B8 # [2000] +4-7535 U+2667E # [2000] [Unicode3.1] Private: U+F87B +4-7536 U+80C5 # [2000] +4-7537 U+80D5 # [2000] +4-7538 U+80D8 # [2000] +4-7539 U+80E6 # [2000] +4-753A U+266B0 # [2000] [Unicode3.1] Private: U+F87C +4-753B U+810D # [2000] +4-753C U+80F5 # [2000] +4-753D U+80FB # [2000] +4-753E U+43EE # [2000] +4-753F U+8135 # [2000] +4-7540 U+8116 # [2000] +4-7541 U+811E # [2000] +4-7542 U+43F0 # [2000] +4-7543 U+8124 # [2000] +4-7544 U+8127 # [2000] +4-7545 U+812C # [2000] +4-7546 U+2671D # [2000] [Unicode3.1] Private: U+F87D +4-7547 U+813D # [2000] +4-7548 U+4408 # [2000] +4-7549 U+8169 # [2000] +4-754A U+4417 # [2000] +4-754B U+8181 # [2000] +4-754C U+441C # [2000] +4-754D U+8184 # [2000] +4-754E U+8185 # [2000] +4-754F U+4422 # [2000] +4-7550 U+8198 # [2000] +4-7551 U+81B2 # [2000] +4-7552 U+81C1 # [2000] +4-7553 U+81C3 # [2000] +4-7554 U+81D6 # [2000] +4-7555 U+81DB # [2000] +4-7556 U+268DD # [2000] [Unicode3.1] Private: U+F87E +4-7557 U+81E4 # [2000] +4-7558 U+268EA # [2000] [Unicode3.1] Private: U+F87F +4-7559 U+81EC # [2000] +4-755A U+26951 # [2000] [Unicode3.1] Private: U+F880 +4-755B U+81FD # [2000] +4-755C U+81FF # [2000] +4-755D U+2696F # [2000] [Unicode3.1] Private: U+F881 +4-755E U+8204 # [2000] +4-755F U+269DD # [2000] [Unicode3.1] Private: U+F882 +4-7560 U+8219 # [2000] +4-7561 U+8221 # [2000] +4-7562 U+8222 # [2000] +4-7563 U+26A1E # [2000] [Unicode3.1] Private: U+F883 +4-7564 U+8232 # [2000] +4-7565 U+8234 # [2000] +4-7566 U+823C # [2000] +4-7567 U+8246 # [2000] +4-7568 U+8249 # [2000] +4-7569 U+8245 # [2000] +4-756A U+26A58 # [2000] [Unicode3.1] Private: U+F884 +4-756B U+824B # [2000] +4-756C U+4476 # [2000] +4-756D U+824F # [2000] +4-756E U+447A # [2000] +4-756F U+8257 # [2000] +4-7570 U+26A8C # [2000] [Unicode3.1] Private: U+F885 +4-7571 U+825C # [2000] +4-7572 U+8263 # [2000] +4-7573 U+26AB7 # [2000] [Unicode3.1] Private: U+F886 +4-7574 U+FA5D # CJK COMPATIBILITY IDEOGRAPH-FA5D [2000] [Unicode3.2] +4-7575 U+FA5E # CJK COMPATIBILITY IDEOGRAPH-FA5E [2000] [Unicode3.2] +4-7576 U+8279 # [2000] +4-7577 U+4491 # [2000] +4-7578 U+827D # [2000] +4-7579 U+827F # [2000] +4-757A U+8283 # [2000] +4-757B U+828A # [2000] +4-757C U+8293 # [2000] +4-757D U+82A7 # [2000] +4-757E U+82A8 # [2000] +4-7621 U+82B2 # [2000] +4-7622 U+82B4 # [2000] +4-7623 U+82BA # [2000] +4-7624 U+82BC # [2000] +4-7625 U+82E2 # [2000] +4-7626 U+82E8 # [2000] +4-7627 U+82F7 # [2000] +4-7628 U+8307 # [2000] +4-7629 U+8308 # [2000] +4-762A U+830C # [2000] +4-762B U+8354 # [2000] +4-762C U+831B # [2000] +4-762D U+831D # [2000] +4-762E U+8330 # [2000] +4-762F U+833C # [2000] +4-7630 U+8344 # [2000] +4-7631 U+8357 # [2000] +4-7632 U+44BE # [2000] +4-7633 U+837F # [2000] +4-7634 U+44D4 # [2000] +4-7635 U+44B3 # [2000] +4-7636 U+838D # [2000] +4-7637 U+8394 # [2000] +4-7638 U+8395 # [2000] +4-7639 U+839B # [2000] +4-763A U+839D # [2000] +4-763B U+83C9 # [2000] +4-763C U+83D0 # [2000] +4-763D U+83D4 # [2000] +4-763E U+83DD # [2000] +4-763F U+83E5 # [2000] +4-7640 U+83F9 # [2000] +4-7641 U+840F # [2000] +4-7642 U+8411 # [2000] +4-7643 U+8415 # [2000] +4-7644 U+26C73 # [2000] [Unicode3.1] Private: U+F889 +4-7645 U+8417 # [2000] +4-7646 U+8439 # [2000] +4-7647 U+844A # [2000] +4-7648 U+844F # [2000] +4-7649 U+8451 # [2000] +4-764A U+8452 # [2000] +4-764B U+8459 # [2000] +4-764C U+845A # [2000] +4-764D U+845C # [2000] +4-764E U+26CDD # [2000] [Unicode3.1] Private: U+F88A +4-764F U+8465 # [2000] +4-7650 U+8476 # [2000] +4-7651 U+8478 # [2000] +4-7652 U+847C # [2000] +4-7653 U+8481 # [2000] +4-7654 U+450D # [2000] +4-7655 U+84DC # [2000] +4-7656 U+8497 # [2000] +4-7657 U+84A6 # [2000] +4-7658 U+84BE # [2000] +4-7659 U+4508 # [2000] +4-765A U+84CE # [2000] +4-765B U+84CF # [2000] +4-765C U+84D3 # [2000] +4-765D U+26E65 # [2000] [Unicode3.1] Private: U+F88B +4-765E U+84E7 # [2000] +4-765F U+84EA # [2000] +4-7660 U+84EF # [2000] +4-7661 U+84F0 # [2000] +4-7662 U+84F1 # [2000] +4-7663 U+84FA # [2000] +4-7664 U+84FD # [2000] +4-7665 U+850C # [2000] +4-7666 U+851B # [2000] +4-7667 U+8524 # [2000] +4-7668 U+8525 # [2000] +4-7669 U+852B # [2000] +4-766A U+8534 # [2000] +4-766B U+854F # [2000] +4-766C U+856F # [2000] +4-766D U+4525 # [2000] +4-766E U+4543 # [2000] +4-766F U+853E # [2000] +4-7670 U+8551 # [2000] +4-7671 U+8553 # [2000] +4-7672 U+855E # [2000] +4-7673 U+8561 # [2000] +4-7674 U+8562 # [2000] +4-7675 U+26F94 # [2000] [Unicode3.1] Private: U+F88C +4-7676 U+857B # [2000] +4-7677 U+857D # [2000] +4-7678 U+857F # [2000] +4-7679 U+8581 # [2000] +4-767A U+8586 # [2000] +4-767B U+8593 # [2000] +4-767C U+859D # [2000] +4-767D U+859F # [2000] +4-767E U+26FF8 # [2000] [Unicode3.1] Private: U+F88D +4-7721 U+26FF6 # [2000] [Unicode3.1] Private: U+F88E +4-7722 U+26FF7 # [2000] [Unicode3.1] Private: U+F88F +4-7723 U+85B7 # [2000] +4-7724 U+85BC # [2000] +4-7725 U+85C7 # [2000] +4-7726 U+85CA # [2000] +4-7727 U+85D8 # [2000] +4-7728 U+85D9 # [2000] +4-7729 U+85DF # [2000] +4-772A U+85E1 # [2000] +4-772B U+85E6 # [2000] +4-772C U+85F6 # [2000] +4-772D U+8600 # [2000] +4-772E U+8611 # [2000] +4-772F U+861E # [2000] +4-7730 U+8621 # [2000] +4-7731 U+8624 # [2000] +4-7732 U+8627 # [2000] +4-7733 U+2710D # [2000] [Unicode3.1] Private: U+F890 +4-7734 U+8639 # [2000] +4-7735 U+863C # [2000] +4-7736 U+27139 # [2000] [Unicode3.1] Private: U+F891 +4-7737 U+8640 # [2000] +4-7738 U+FA20 # CJK COMPATIBILITY IDEOGRAPH-FA20 [2000] +4-7739 U+8653 # [2000] +4-773A U+8656 # [2000] +4-773B U+866F # [2000] +4-773C U+8677 # [2000] +4-773D U+867A # [2000] +4-773E U+8687 # [2000] +4-773F U+8689 # [2000] +4-7740 U+868D # [2000] +4-7741 U+8691 # [2000] +4-7742 U+869C # [2000] +4-7743 U+869D # [2000] +4-7744 U+86A8 # [2000] +4-7745 U+FA21 # CJK COMPATIBILITY IDEOGRAPH-FA21 [2000] +4-7746 U+86B1 # [2000] +4-7747 U+86B3 # [2000] +4-7748 U+86C1 # [2000] +4-7749 U+86C3 # [2000] +4-774A U+86D1 # [2000] +4-774B U+86D5 # [2000] +4-774C U+86D7 # [2000] +4-774D U+86E3 # [2000] +4-774E U+86E6 # [2000] +4-774F U+45B8 # [2000] +4-7750 U+8705 # [2000] +4-7751 U+8707 # [2000] +4-7752 U+870E # [2000] +4-7753 U+8710 # [2000] +4-7754 U+8713 # [2000] +4-7755 U+8719 # [2000] +4-7756 U+871F # [2000] +4-7757 U+8721 # [2000] +4-7758 U+8723 # [2000] +4-7759 U+8731 # [2000] +4-775A U+873A # [2000] +4-775B U+873E # [2000] +4-775C U+8740 # [2000] +4-775D U+8743 # [2000] +4-775E U+8751 # [2000] +4-775F U+8758 # [2000] +4-7760 U+8764 # [2000] +4-7761 U+8765 # [2000] +4-7762 U+8772 # [2000] +4-7763 U+877C # [2000] +4-7764 U+273DB # [2000] [Unicode3.1] Private: U+F892 +4-7765 U+273DA # [2000] [Unicode3.1] Private: U+F893 +4-7766 U+87A7 # [2000] +4-7767 U+8789 # [2000] +4-7768 U+878B # [2000] +4-7769 U+8793 # [2000] +4-776A U+87A0 # [2000] +4-776B U+273FE # [2000] [Unicode3.1] Private: U+F894 +4-776C U+45E5 # [2000] +4-776D U+87BE # [2000] +4-776E U+27410 # [2000] [Unicode3.1] Private: U+F895 +4-776F U+87C1 # [2000] +4-7770 U+87CE # [2000] +4-7771 U+87F5 # [2000] +4-7772 U+87DF # [2000] +4-7773 U+27449 # [2000] [Unicode3.1] Private: U+F896 +4-7774 U+87E3 # [2000] +4-7775 U+87E5 # [2000] +4-7776 U+87E6 # [2000] +4-7777 U+87EA # [2000] +4-7778 U+87EB # [2000] +4-7779 U+87ED # [2000] +4-777A U+8801 # [2000] +4-777B U+8803 # [2000] +4-777C U+880B # [2000] +4-777D U+8813 # [2000] +4-777E U+8828 # [2000] +4-7821 U+882E # [2000] +4-7822 U+8832 # [2000] +4-7823 U+883C # [2000] +4-7824 U+460F # [2000] +4-7825 U+884A # [2000] +4-7826 U+8858 # [2000] +4-7827 U+885F # [2000] +4-7828 U+8864 # [2000] +4-7829 U+27615 # [2000] [Unicode3.1] Private: U+F897 +4-782A U+27614 # [2000] [Unicode3.1] Private: U+F898 +4-782B U+8869 # [2000] +4-782C U+27631 # [2000] [Unicode3.1] Private: U+F899 +4-782D U+886F # [2000] +4-782E U+88A0 # [2000] +4-782F U+88BC # [2000] +4-7830 U+88BD # [2000] +4-7831 U+88BE # [2000] +4-7832 U+88C0 # [2000] +4-7833 U+88D2 # [2000] +4-7834 U+27693 # [2000] [Unicode3.1] Private: U+F89A +4-7835 U+88D1 # [2000] +4-7836 U+88D3 # [2000] +4-7837 U+88DB # [2000] +4-7838 U+88F0 # [2000] +4-7839 U+88F1 # [2000] +4-783A U+4641 # [2000] +4-783B U+8901 # [2000] +4-783C U+2770E # [2000] [Unicode3.1] Private: U+F89B +4-783D U+8937 # [2000] +4-783E U+27723 # [2000] [Unicode3.1] Private: U+F89C +4-783F U+8942 # [2000] +4-7840 U+8945 # [2000] +4-7841 U+8949 # [2000] +4-7842 U+27752 # [2000] [Unicode3.1] Private: U+F89D +4-7843 U+4665 # [2000] +4-7844 U+8962 # [2000] +4-7845 U+8980 # [2000] +4-7846 U+8989 # [2000] +4-7847 U+8990 # [2000] +4-7848 U+899F # [2000] +4-7849 U+89B0 # [2000] +4-784A U+89B7 # [2000] +4-784B U+89D6 # [2000] +4-784C U+89D8 # [2000] +4-784D U+89EB # [2000] +4-784E U+46A1 # [2000] +4-784F U+89F1 # [2000] +4-7850 U+89F3 # [2000] +4-7851 U+89FD # [2000] +4-7852 U+89FF # [2000] +4-7853 U+46AF # [2000] +4-7854 U+8A11 # [2000] +4-7855 U+8A14 # [2000] +4-7856 U+27985 # [2000] [Unicode3.1] Private: U+F89E +4-7857 U+8A21 # [2000] +4-7858 U+8A35 # [2000] +4-7859 U+8A3E # [2000] +4-785A U+8A45 # [2000] +4-785B U+8A4D # [2000] +4-785C U+8A58 # [2000] +4-785D U+8AAE # [2000] +4-785E U+8A90 # [2000] +4-785F U+8AB7 # [2000] +4-7860 U+8ABE # [2000] +4-7861 U+8AD7 # [2000] +4-7862 U+8AFC # [2000] +4-7863 U+27A84 # [2000] [Unicode3.1] Private: U+F89F +4-7864 U+8B0A # [2000] +4-7865 U+8B05 # [2000] +4-7866 U+8B0D # [2000] +4-7867 U+8B1C # [2000] +4-7868 U+8B1F # [2000] +4-7869 U+8B2D # [2000] +4-786A U+8B43 # [2000] +4-786B U+470C # [2000] +4-786C U+8B51 # [2000] +4-786D U+8B5E # [2000] +4-786E U+8B76 # [2000] +4-786F U+8B7F # [2000] +4-7870 U+8B81 # [2000] +4-7871 U+8B8B # [2000] +4-7872 U+8B94 # [2000] +4-7873 U+8B95 # [2000] +4-7874 U+8B9C # [2000] +4-7875 U+8B9E # [2000] +4-7876 U+8C39 # [2000] +4-7877 U+27BB3 # [2000] [Unicode3.1] Private: U+F8A0 +4-7878 U+8C3D # [2000] +4-7879 U+27BBE # [2000] [Unicode3.1] Private: U+F8A1 +4-787A U+27BC7 # [2000] [Unicode3.1] Private: U+F8A2 +4-787B U+8C45 # [2000] +4-787C U+8C47 # [2000] +4-787D U+8C4F # [2000] +4-787E U+8C54 # [2000] +4-7921 U+8C57 # [2000] +4-7922 U+8C69 # [2000] +4-7923 U+8C6D # [2000] +4-7924 U+8C73 # [2000] +4-7925 U+27CB8 # [2000] [Unicode3.1] Private: U+F8A3 +4-7926 U+8C93 # [2000] +4-7927 U+8C92 # [2000] +4-7928 U+8C99 # [2000] +4-7929 U+4764 # [2000] +4-792A U+8C9B # [2000] +4-792B U+8CA4 # [2000] +4-792C U+8CD6 # [2000] +4-792D U+8CD5 # [2000] +4-792E U+8CD9 # [2000] +4-792F U+27DA0 # [2000] [Unicode3.1] Private: U+F8A4 +4-7930 U+8CF0 # [2000] +4-7931 U+8CF1 # [2000] +4-7932 U+27E10 # [2000] [Unicode3.1] Private: U+F8A5 +4-7933 U+8D09 # [2000] +4-7934 U+8D0E # [2000] +4-7935 U+8D6C # [2000] +4-7936 U+8D84 # [2000] +4-7937 U+8D95 # [2000] +4-7938 U+8DA6 # [2000] +4-7939 U+27FB7 # [2000] [Unicode3.1] Private: U+F8A6 +4-793A U+8DC6 # [2000] +4-793B U+8DC8 # [2000] +4-793C U+8DD9 # [2000] +4-793D U+8DEC # [2000] +4-793E U+8E0C # [2000] +4-793F U+47FD # [2000] +4-7940 U+8DFD # [2000] +4-7941 U+8E06 # [2000] +4-7942 U+2808A # [2000] [Unicode3.1] Private: U+F8A7 +4-7943 U+8E14 # [2000] +4-7944 U+8E16 # [2000] +4-7945 U+8E21 # [2000] +4-7946 U+8E22 # [2000] +4-7947 U+8E27 # [2000] +4-7948 U+280BB # [2000] [Unicode3.1] Private: U+F8A8 +4-7949 U+4816 # [2000] +4-794A U+8E36 # [2000] +4-794B U+8E39 # [2000] +4-794C U+8E4B # [2000] +4-794D U+8E54 # [2000] +4-794E U+8E62 # [2000] +4-794F U+8E6C # [2000] +4-7950 U+8E6D # [2000] +4-7951 U+8E6F # [2000] +4-7952 U+8E98 # [2000] +4-7953 U+8E9E # [2000] +4-7954 U+8EAE # [2000] +4-7955 U+8EB3 # [2000] +4-7956 U+8EB5 # [2000] +4-7957 U+8EB6 # [2000] +4-7958 U+8EBB # [2000] +4-7959 U+28282 # [2000] [Unicode3.1] Private: U+F8A9 +4-795A U+8ED1 # [2000] +4-795B U+8ED4 # [2000] +4-795C U+484E # [2000] +4-795D U+8EF9 # [2000] +4-795E U+282F3 # [2000] [Unicode3.1] Private: U+F8AA +4-795F U+8F00 # [2000] +4-7960 U+8F08 # [2000] +4-7961 U+8F17 # [2000] +4-7962 U+8F2B # [2000] +4-7963 U+8F40 # [2000] +4-7964 U+8F4A # [2000] +4-7965 U+8F58 # [2000] +4-7966 U+2840C # [2000] [Unicode3.1] Private: U+F8AB +4-7967 U+8FA4 # [2000] +4-7968 U+8FB4 # [2000] +4-7969 U+FA66 # CJK COMPATIBILITY IDEOGRAPH-FA66 [2000] [Unicode3.2] +4-796A U+8FB6 # [2000] +4-796B U+28455 # [2000] [Unicode3.1] Private: U+F8AD +4-796C U+8FC1 # [2000] +4-796D U+8FC6 # [2000] +4-796E U+FA24 # CJK COMPATIBILITY IDEOGRAPH-FA24 [2000] +4-796F U+8FCA # [2000] +4-7970 U+8FCD # [2000] +4-7971 U+8FD3 # [2000] +4-7972 U+8FD5 # [2000] +4-7973 U+8FE0 # [2000] +4-7974 U+8FF1 # [2000] +4-7975 U+8FF5 # [2000] +4-7976 U+8FFB # [2000] +4-7977 U+9002 # [2000] +4-7978 U+900C # [2000] +4-7979 U+9037 # [2000] +4-797A U+2856B # [2000] [Unicode3.1] Private: U+F8AE +4-797B U+9043 # [2000] +4-797C U+9044 # [2000] +4-797D U+905D # [2000] +4-797E U+285C8 # [2000] [Unicode3.1] Private: U+F8AF +4-7A21 U+285C9 # [2000] [Unicode3.1] Private: U+F8B0 +4-7A22 U+9085 # [2000] +4-7A23 U+908C # [2000] +4-7A24 U+9090 # [2000] +4-7A25 U+961D # [2000] +4-7A26 U+90A1 # [2000] +4-7A27 U+48B5 # [2000] +4-7A28 U+90B0 # [2000] +4-7A29 U+90B6 # [2000] +4-7A2A U+90C3 # [2000] +4-7A2B U+90C8 # [2000] +4-7A2C U+286D7 # [2000] [Unicode3.1] Private: U+F8B1 +4-7A2D U+90DC # [2000] +4-7A2E U+90DF # [2000] +4-7A2F U+286FA # [2000] [Unicode3.1] Private: U+F8B2 +4-7A30 U+90F6 # [2000] +4-7A31 U+90F2 # [2000] +4-7A32 U+9100 # [2000] +4-7A33 U+90EB # [2000] +4-7A34 U+90FE # [2000] +4-7A35 U+90FF # [2000] +4-7A36 U+9104 # [2000] +4-7A37 U+9106 # [2000] +4-7A38 U+9118 # [2000] +4-7A39 U+911C # [2000] +4-7A3A U+911E # [2000] +4-7A3B U+9137 # [2000] +4-7A3C U+9139 # [2000] +4-7A3D U+913A # [2000] +4-7A3E U+9146 # [2000] +4-7A3F U+9147 # [2000] +4-7A40 U+9157 # [2000] +4-7A41 U+9159 # [2000] +4-7A42 U+9161 # [2000] +4-7A43 U+9164 # [2000] +4-7A44 U+9174 # [2000] +4-7A45 U+9179 # [2000] +4-7A46 U+9185 # [2000] +4-7A47 U+918E # [2000] +4-7A48 U+91A8 # [2000] +4-7A49 U+91AE # [2000] +4-7A4A U+91B3 # [2000] +4-7A4B U+91B6 # [2000] +4-7A4C U+91C3 # [2000] +4-7A4D U+91C4 # [2000] +4-7A4E U+91DA # [2000] +4-7A4F U+28949 # [2000] [Unicode3.1] Private: U+F8B3 +4-7A50 U+28946 # [2000] [Unicode3.1] Private: U+F8B4 +4-7A51 U+91EC # [2000] +4-7A52 U+91EE # [2000] +4-7A53 U+9201 # [2000] +4-7A54 U+920A # [2000] +4-7A55 U+9216 # [2000] +4-7A56 U+9217 # [2000] +4-7A57 U+2896B # [2000] [Unicode3.1] Private: U+F8B5 +4-7A58 U+9233 # [2000] +4-7A59 U+9242 # [2000] +4-7A5A U+9247 # [2000] +4-7A5B U+924A # [2000] +4-7A5C U+924E # [2000] +4-7A5D U+9251 # [2000] +4-7A5E U+9256 # [2000] +4-7A5F U+9259 # [2000] +4-7A60 U+9260 # [2000] +4-7A61 U+9261 # [2000] +4-7A62 U+9265 # [2000] +4-7A63 U+9267 # [2000] +4-7A64 U+9268 # [2000] +4-7A65 U+28987 # [2000] [Unicode3.1] Private: U+F8B6 +4-7A66 U+28988 # [2000] [Unicode3.1] Private: U+F8B7 +4-7A67 U+927C # [2000] +4-7A68 U+927D # [2000] +4-7A69 U+927F # [2000] +4-7A6A U+9289 # [2000] +4-7A6B U+928D # [2000] +4-7A6C U+9297 # [2000] +4-7A6D U+9299 # [2000] +4-7A6E U+929F # [2000] +4-7A6F U+92A7 # [2000] +4-7A70 U+92AB # [2000] +4-7A71 U+289BA # [2000] [Unicode3.1] Private: U+F8B8 +4-7A72 U+289BB # [2000] [Unicode3.1] Private: U+F8B9 +4-7A73 U+92B2 # [2000] +4-7A74 U+92BF # [2000] +4-7A75 U+92C0 # [2000] +4-7A76 U+92C6 # [2000] +4-7A77 U+92CE # [2000] +4-7A78 U+92D0 # [2000] +4-7A79 U+92D7 # [2000] +4-7A7A U+92D9 # [2000] +4-7A7B U+92E5 # [2000] +4-7A7C U+92E7 # [2000] +4-7A7D U+9311 # [2000] +4-7A7E U+28A1E # [2000] [Unicode3.1] Private: U+F8BA +4-7B21 U+28A29 # [2000] [Unicode3.1] Private: U+F8BB +4-7B22 U+92F7 # [2000] +4-7B23 U+92F9 # [2000] +4-7B24 U+92FB # [2000] +4-7B25 U+9302 # [2000] +4-7B26 U+930D # [2000] +4-7B27 U+9315 # [2000] +4-7B28 U+931D # [2000] +4-7B29 U+931E # [2000] +4-7B2A U+9327 # [2000] +4-7B2B U+9329 # [2000] +4-7B2C U+28A71 # [2000] [Unicode3.1] Private: U+F8BC +4-7B2D U+28A43 # [2000] [Unicode3.1] Private: U+F8BD +4-7B2E U+9347 # [2000] +4-7B2F U+9351 # [2000] +4-7B30 U+9357 # [2000] +4-7B31 U+935A # [2000] +4-7B32 U+936B # [2000] +4-7B33 U+9371 # [2000] +4-7B34 U+9373 # [2000] +4-7B35 U+93A1 # [2000] +4-7B36 U+28A99 # [2000] [Unicode3.1] Private: U+F8BE +4-7B37 U+28ACD # [2000] [Unicode3.1] Private: U+F8BF +4-7B38 U+9388 # [2000] +4-7B39 U+938B # [2000] +4-7B3A U+938F # [2000] +4-7B3B U+939E # [2000] +4-7B3C U+93F5 # [2000] +4-7B3D U+28AE4 # [2000] [Unicode3.1] Private: U+F8C0 +4-7B3E U+28ADD # [2000] [Unicode3.1] Private: U+F8C1 +4-7B3F U+93F1 # [2000] +4-7B40 U+93C1 # [2000] +4-7B41 U+93C7 # [2000] +4-7B42 U+93DC # [2000] +4-7B43 U+93E2 # [2000] +4-7B44 U+93E7 # [2000] +4-7B45 U+9409 # [2000] +4-7B46 U+940F # [2000] +4-7B47 U+9416 # [2000] +4-7B48 U+9417 # [2000] +4-7B49 U+93FB # [2000] +4-7B4A U+9432 # [2000] +4-7B4B U+9434 # [2000] +4-7B4C U+943B # [2000] +4-7B4D U+9445 # [2000] +4-7B4E U+28BC1 # [2000] [Unicode3.1] Private: U+F8C2 +4-7B4F U+28BEF # [2000] [Unicode3.1] Private: U+F8C3 +4-7B50 U+946D # [2000] +4-7B51 U+946F # [2000] +4-7B52 U+9578 # [2000] +4-7B53 U+9579 # [2000] +4-7B54 U+9586 # [2000] +4-7B55 U+958C # [2000] +4-7B56 U+958D # [2000] +4-7B57 U+28D10 # [2000] [Unicode3.1] Private: U+F8C4 +4-7B58 U+95AB # [2000] +4-7B59 U+95B4 # [2000] +4-7B5A U+28D71 # [2000] [Unicode3.1] Private: U+F8C5 +4-7B5B U+95C8 # [2000] +4-7B5C U+28DFB # [2000] [Unicode3.1] Private: U+F8C6 +4-7B5D U+28E1F # [2000] [Unicode3.1] Private: U+F8C7 +4-7B5E U+962C # [2000] +4-7B5F U+9633 # [2000] +4-7B60 U+9634 # [2000] +4-7B61 U+28E36 # [2000] [Unicode3.1] Private: U+F8C8 +4-7B62 U+963C # [2000] +4-7B63 U+9641 # [2000] +4-7B64 U+9661 # [2000] +4-7B65 U+28E89 # [2000] [Unicode3.1] Private: U+F8C9 +4-7B66 U+9682 # [2000] +4-7B67 U+28EEB # [2000] [Unicode3.1] Private: U+F8CA +4-7B68 U+969A # [2000] +4-7B69 U+28F32 # [2000] [Unicode3.1] Private: U+F8CB +4-7B6A U+49E7 # [2000] +4-7B6B U+96A9 # [2000] +4-7B6C U+96AF # [2000] +4-7B6D U+96B3 # [2000] +4-7B6E U+96BA # [2000] +4-7B6F U+96BD # [2000] +4-7B70 U+49FA # [2000] +4-7B71 U+28FF8 # [2000] [Unicode3.1] Private: U+F8CC +4-7B72 U+96D8 # [2000] +4-7B73 U+96DA # [2000] +4-7B74 U+96DD # [2000] +4-7B75 U+4A04 # [2000] +4-7B76 U+9714 # [2000] +4-7B77 U+9723 # [2000] +4-7B78 U+4A29 # [2000] +4-7B79 U+9736 # [2000] +4-7B7A U+9741 # [2000] +4-7B7B U+9747 # [2000] +4-7B7C U+9755 # [2000] +4-7B7D U+9757 # [2000] +4-7B7E U+975B # [2000] +4-7C21 U+976A # [2000] +4-7C22 U+292A0 # [2000] [Unicode3.1] Private: U+F8CD +4-7C23 U+292B1 # [2000] [Unicode3.1] Private: U+F8CE +4-7C24 U+9796 # [2000] +4-7C25 U+979A # [2000] +4-7C26 U+979E # [2000] +4-7C27 U+97A2 # [2000] +4-7C28 U+97B1 # [2000] +4-7C29 U+97B2 # [2000] +4-7C2A U+97BE # [2000] +4-7C2B U+97CC # [2000] +4-7C2C U+97D1 # [2000] +4-7C2D U+97D4 # [2000] +4-7C2E U+97D8 # [2000] +4-7C2F U+97D9 # [2000] +4-7C30 U+97E1 # [2000] +4-7C31 U+97F1 # [2000] +4-7C32 U+9804 # [2000] +4-7C33 U+980D # [2000] +4-7C34 U+980E # [2000] +4-7C35 U+9814 # [2000] +4-7C36 U+9816 # [2000] +4-7C37 U+4ABC # [2000] +4-7C38 U+29490 # [2000] [Unicode3.1] Private: U+F8CF +4-7C39 U+9823 # [2000] +4-7C3A U+9832 # [2000] +4-7C3B U+9833 # [2000] +4-7C3C U+9825 # [2000] +4-7C3D U+9847 # [2000] +4-7C3E U+9866 # [2000] +4-7C3F U+98AB # [2000] +4-7C40 U+98AD # [2000] +4-7C41 U+98B0 # [2000] +4-7C42 U+295CF # [2000] [Unicode3.1] Private: U+F8D0 +4-7C43 U+98B7 # [2000] +4-7C44 U+98B8 # [2000] +4-7C45 U+98BB # [2000] +4-7C46 U+98BC # [2000] +4-7C47 U+98BF # [2000] +4-7C48 U+98C2 # [2000] +4-7C49 U+98C7 # [2000] +4-7C4A U+98CB # [2000] +4-7C4B U+98E0 # [2000] +4-7C4C U+2967F # [2000] [Unicode3.1] Private: U+F8D1 +4-7C4D U+98E1 # [2000] +4-7C4E U+98E3 # [2000] +4-7C4F U+98E5 # [2000] +4-7C50 U+98EA # [2000] +4-7C51 U+98F0 # [2000] +4-7C52 U+98F1 # [2000] +4-7C53 U+98F3 # [2000] +4-7C54 U+9908 # [2000] +4-7C55 U+4B3B # [2000] +4-7C56 U+296F0 # [2000] [Unicode3.1] Private: U+F8D2 +4-7C57 U+9916 # [2000] +4-7C58 U+9917 # [2000] +4-7C59 U+29719 # [2000] [Unicode3.1] Private: U+F8D3 +4-7C5A U+991A # [2000] +4-7C5B U+991B # [2000] +4-7C5C U+991C # [2000] +4-7C5D U+29750 # [2000] [Unicode3.1] Private: U+F8D4 +4-7C5E U+9931 # [2000] +4-7C5F U+9932 # [2000] +4-7C60 U+9933 # [2000] +4-7C61 U+993A # [2000] +4-7C62 U+993B # [2000] +4-7C63 U+993C # [2000] +4-7C64 U+9940 # [2000] +4-7C65 U+9941 # [2000] +4-7C66 U+9946 # [2000] +4-7C67 U+994D # [2000] +4-7C68 U+994E # [2000] +4-7C69 U+995C # [2000] +4-7C6A U+995F # [2000] +4-7C6B U+9960 # [2000] +4-7C6C U+99A3 # [2000] +4-7C6D U+99A6 # [2000] +4-7C6E U+99B9 # [2000] +4-7C6F U+99BD # [2000] +4-7C70 U+99BF # [2000] +4-7C71 U+99C3 # [2000] +4-7C72 U+99C9 # [2000] +4-7C73 U+99D4 # [2000] +4-7C74 U+99D9 # [2000] +4-7C75 U+99DE # [2000] +4-7C76 U+298C6 # [2000] [Unicode3.1] Private: U+F8D5 +4-7C77 U+99F0 # [2000] +4-7C78 U+99F9 # [2000] +4-7C79 U+99FC # [2000] +4-7C7A U+9A0A # [2000] +4-7C7B U+9A11 # [2000] +4-7C7C U+9A16 # [2000] +4-7C7D U+9A1A # [2000] +4-7C7E U+9A20 # [2000] +4-7D21 U+9A31 # [2000] +4-7D22 U+9A36 # [2000] +4-7D23 U+9A44 # [2000] +4-7D24 U+9A4C # [2000] +4-7D25 U+9A58 # [2000] +4-7D26 U+4BC2 # [2000] +4-7D27 U+9AAF # [2000] +4-7D28 U+4BCA # [2000] +4-7D29 U+9AB7 # [2000] +4-7D2A U+4BD2 # [2000] +4-7D2B U+9AB9 # [2000] +4-7D2C U+29A72 # [2000] [Unicode3.1] Private: U+F8D6 +4-7D2D U+9AC6 # [2000] +4-7D2E U+9AD0 # [2000] +4-7D2F U+9AD2 # [2000] +4-7D30 U+9AD5 # [2000] +4-7D31 U+4BE8 # [2000] +4-7D32 U+9ADC # [2000] +4-7D33 U+9AE0 # [2000] +4-7D34 U+9AE5 # [2000] +4-7D35 U+9AE9 # [2000] +4-7D36 U+9B03 # [2000] +4-7D37 U+9B0C # [2000] +4-7D38 U+9B10 # [2000] +4-7D39 U+9B12 # [2000] +4-7D3A U+9B16 # [2000] +4-7D3B U+9B1C # [2000] +4-7D3C U+9B2B # [2000] +4-7D3D U+9B33 # [2000] +4-7D3E U+9B3D # [2000] +4-7D3F U+4C20 # [2000] +4-7D40 U+9B4B # [2000] +4-7D41 U+9B63 # [2000] +4-7D42 U+9B65 # [2000] +4-7D43 U+9B6B # [2000] +4-7D44 U+9B6C # [2000] +4-7D45 U+9B73 # [2000] +4-7D46 U+9B76 # [2000] +4-7D47 U+9B77 # [2000] +4-7D48 U+9BA6 # [2000] +4-7D49 U+9BAC # [2000] +4-7D4A U+9BB1 # [2000] +4-7D4B U+29DDB # [2000] [Unicode3.1] Private: U+F8D7 +4-7D4C U+29E3D # [2000] [Unicode3.1] Private: U+F8D8 +4-7D4D U+9BB2 # [2000] +4-7D4E U+9BB8 # [2000] +4-7D4F U+9BBE # [2000] +4-7D50 U+9BC7 # [2000] +4-7D51 U+9BF3 # [2000] +4-7D52 U+9BD8 # [2000] +4-7D53 U+9BDD # [2000] +4-7D54 U+9BE7 # [2000] +4-7D55 U+9BEA # [2000] +4-7D56 U+9BEB # [2000] +4-7D57 U+9BEF # [2000] +4-7D58 U+9BEE # [2000] +4-7D59 U+29E15 # [2000] [Unicode3.1] Private: U+F8D9 +4-7D5A U+9BFA # [2000] +4-7D5B U+29E8A # [2000] [Unicode3.1] Private: U+F8DA +4-7D5C U+9BF7 # [2000] +4-7D5D U+29E49 # [2000] [Unicode3.1] Private: U+F8DB +4-7D5E U+9C16 # [2000] +4-7D5F U+9C18 # [2000] +4-7D60 U+9C19 # [2000] +4-7D61 U+9C1A # [2000] +4-7D62 U+9C1D # [2000] +4-7D63 U+9C22 # [2000] +4-7D64 U+9C27 # [2000] +4-7D65 U+9C29 # [2000] +4-7D66 U+9C2A # [2000] +4-7D67 U+29EC4 # [2000] [Unicode3.1] Private: U+F8DC +4-7D68 U+9C31 # [2000] +4-7D69 U+9C36 # [2000] +4-7D6A U+9C37 # [2000] +4-7D6B U+9C45 # [2000] +4-7D6C U+9C5C # [2000] +4-7D6D U+29EE9 # [2000] [Unicode3.1] Private: U+F8DD +4-7D6E U+9C49 # [2000] +4-7D6F U+9C4A # [2000] +4-7D70 U+29EDB # [2000] [Unicode3.1] Private: U+F8DE +4-7D71 U+9C54 # [2000] +4-7D72 U+9C58 # [2000] +4-7D73 U+9C5B # [2000] +4-7D74 U+9C5D # [2000] +4-7D75 U+9C5F # [2000] +4-7D76 U+9C69 # [2000] +4-7D77 U+9C6A # [2000] +4-7D78 U+9C6B # [2000] +4-7D79 U+9C6D # [2000] +4-7D7A U+9C6E # [2000] +4-7D7B U+9C70 # [2000] +4-7D7C U+9C72 # [2000] +4-7D7D U+9C75 # [2000] +4-7D7E U+9C7A # [2000] +4-7E21 U+9CE6 # [2000] +4-7E22 U+9CF2 # [2000] +4-7E23 U+9D0B # [2000] +4-7E24 U+9D02 # [2000] +4-7E25 U+29FCE # [2000] [Unicode3.1] Private: U+F8DF +4-7E26 U+9D11 # [2000] +4-7E27 U+9D17 # [2000] +4-7E28 U+9D18 # [2000] +4-7E29 U+2A02F # [2000] [Unicode3.1] Private: U+F8E0 +4-7E2A U+4CC4 # [2000] +4-7E2B U+2A01A # [2000] [Unicode3.1] Private: U+F8E1 +4-7E2C U+9D32 # [2000] +4-7E2D U+4CD1 # [2000] +4-7E2E U+9D42 # [2000] +4-7E2F U+9D4A # [2000] +4-7E30 U+9D5F # [2000] +4-7E31 U+9D62 # [2000] +4-7E32 U+2A0F9 # [2000] [Unicode3.1] Private: U+F8E2 +4-7E33 U+9D69 # [2000] +4-7E34 U+9D6B # [2000] +4-7E35 U+2A082 # [2000] [Unicode3.1] Private: U+F8E3 +4-7E36 U+9D73 # [2000] +4-7E37 U+9D76 # [2000] +4-7E38 U+9D77 # [2000] +4-7E39 U+9D7E # [2000] +4-7E3A U+9D84 # [2000] +4-7E3B U+9D8D # [2000] +4-7E3C U+9D99 # [2000] +4-7E3D U+9DA1 # [2000] +4-7E3E U+9DBF # [2000] +4-7E3F U+9DB5 # [2000] +4-7E40 U+9DB9 # [2000] +4-7E41 U+9DBD # [2000] +4-7E42 U+9DC3 # [2000] +4-7E43 U+9DC7 # [2000] +4-7E44 U+9DC9 # [2000] +4-7E45 U+9DD6 # [2000] +4-7E46 U+9DDA # [2000] +4-7E47 U+9DDF # [2000] +4-7E48 U+9DE0 # [2000] +4-7E49 U+9DE3 # [2000] +4-7E4A U+9DF4 # [2000] +4-7E4B U+4D07 # [2000] +4-7E4C U+9E0A # [2000] +4-7E4D U+9E02 # [2000] +4-7E4E U+9E0D # [2000] +4-7E4F U+9E19 # [2000] +4-7E50 U+9E1C # [2000] +4-7E51 U+9E1D # [2000] +4-7E52 U+9E7B # [2000] +4-7E53 U+22218 # [2000] [Unicode3.1] Private: U+F8E4 +4-7E54 U+9E80 # [2000] +4-7E55 U+9E85 # [2000] +4-7E56 U+9E9B # [2000] +4-7E57 U+9EA8 # [2000] +4-7E58 U+2A38C # [2000] [Unicode3.1] Private: U+F8E5 +4-7E59 U+9EBD # [2000] +4-7E5A U+2A437 # [2000] [Unicode3.1] Private: U+F8E6 +4-7E5B U+9EDF # [2000] +4-7E5C U+9EE7 # [2000] +4-7E5D U+9EEE # [2000] +4-7E5E U+9EFF # [2000] +4-7E5F U+9F02 # [2000] +4-7E60 U+4D77 # [2000] +4-7E61 U+9F03 # [2000] +4-7E62 U+9F17 # [2000] +4-7E63 U+9F19 # [2000] +4-7E64 U+9F2F # [2000] +4-7E65 U+9F37 # [2000] +4-7E66 U+9F3A # [2000] +4-7E67 U+9F3D # [2000] +4-7E68 U+9F41 # [2000] +4-7E69 U+9F45 # [2000] +4-7E6A U+9F46 # [2000] +4-7E6B U+9F53 # [2000] +4-7E6C U+9F55 # [2000] +4-7E6D U+9F58 # [2000] +4-7E6E U+2A5F1 # [2000] [Unicode3.1] Private: U+F8E7 +4-7E6F U+9F5D # [2000] +4-7E70 U+2A602 # [2000] [Unicode3.1] Private: U+F8E8 +4-7E71 U+9F69 # [2000] +4-7E72 U+2A61A # [2000] [Unicode3.1] Private: U+F8E9 +4-7E73 U+9F6D # [2000] +4-7E74 U+9F70 # [2000] +4-7E75 U+9F75 # [2000] +4-7E76 U+2A6B2 # [2000] [Unicode3.1] Private: U+F8EA diff --git a/aclocal.m4 b/aclocal.m4 index f98db736..b5f9cb0e 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.15 -*- Autoconf -*- +# generated automatically by aclocal 1.16.2 -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -12,9 +12,9 @@ # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) -dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -dnl serial 11 (pkg-config-0.29.1) -dnl +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 11 (pkg-config-0.29.1) + dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl @@ -288,5 +288,73 @@ AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR +dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------ +dnl +dnl Prepare a "--with-" configure option using the lowercase +dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and +dnl PKG_CHECK_MODULES in a single macro. +AC_DEFUN([PKG_WITH_MODULES], +[ +m4_pushdef([with_arg], m4_tolower([$1])) + +m4_pushdef([description], + [m4_default([$5], [build with ]with_arg[ support])]) + +m4_pushdef([def_arg], [m4_default([$6], [auto])]) +m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) +m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) + +m4_case(def_arg, + [yes],[m4_pushdef([with_without], [--without-]with_arg)], + [m4_pushdef([with_without],[--with-]with_arg)]) + +AC_ARG_WITH(with_arg, + AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, + [AS_TR_SH([with_]with_arg)=def_arg]) + +AS_CASE([$AS_TR_SH([with_]with_arg)], + [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], + [auto],[PKG_CHECK_MODULES([$1],[$2], + [m4_n([def_action_if_found]) $3], + [m4_n([def_action_if_not_found]) $4])]) + +m4_popdef([with_arg]) +m4_popdef([description]) +m4_popdef([def_arg]) + +])dnl PKG_WITH_MODULES + +dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ----------------------------------------------- +dnl +dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES +dnl check._[VARIABLE-PREFIX] is exported as make variable. +AC_DEFUN([PKG_HAVE_WITH_MODULES], +[ +PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) + +AM_CONDITIONAL([HAVE_][$1], + [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) +])dnl PKG_HAVE_WITH_MODULES + +dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------------------ +dnl +dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after +dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make +dnl and preprocessor variable. +AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], +[ +PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) + +AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], + [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) +])dnl PKG_HAVE_DEFINE_WITH_MODULES + m4_include([m4/ax_c_float_words_bigendian.m4]) m4_include([m4/ax_check_openssl.m4]) diff --git a/configure b/configure index 96dcd0dc..9e6fd465 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for python 3.8. +# Generated by GNU Autoconf 2.69 for python 3.9. # # Report bugs to . # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='python' PACKAGE_TARNAME='python' -PACKAGE_VERSION='3.8' -PACKAGE_STRING='python 3.8' +PACKAGE_VERSION='3.9' +PACKAGE_STRING='python 3.9' PACKAGE_BUGREPORT='https://bugs.python.org/' PACKAGE_URL='' @@ -631,6 +631,8 @@ SRCDIRS THREADHEADERS LIBPL PY_ENABLE_SHARED +PLATLIBDIR +BINLIBDEST LIBPYTHON EXT_SUFFIX ALT_SOABI @@ -657,6 +659,7 @@ LIBFFI_INCLUDEDIR PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG +TZPATH SHLIBS CFLAGSFORSHARED LINKFORSHARED @@ -697,6 +700,8 @@ ARFLAGS ac_ct_AR AR GNULD +EXPORTSFROM +EXPORTSYMS LINKCC LDVERSION RUNSHARED @@ -782,7 +787,6 @@ infodir docdir oldincludedir includedir -runstatedir localstatedir sharedstatedir sysconfdir @@ -819,6 +823,7 @@ with_assertions enable_optimizations with_lto with_hash_algorithm +with_tzpath with_address_sanitizer with_memory_sanitizer with_undefined_behavior_sanitizer @@ -840,10 +845,12 @@ with_dtrace with_libm with_libc enable_big_digits +with_platlibdir with_computed_gotos with_ensurepip with_openssl with_ssl_default_suites +with_builtin_hashlib_hashes ' ac_precious_vars='build_alias host_alias @@ -897,7 +904,6 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1150,15 +1156,6 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; - -runstatedir | --runstatedir | --runstatedi | --runstated \ - | --runstate | --runstat | --runsta | --runst | --runs \ - | --run | --ru | --r) - ac_prev=runstatedir ;; - -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ - | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ - | --run=* | --ru=* | --r=*) - runstatedir=$ac_optarg ;; - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1296,7 +1293,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir runstatedir + libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1409,7 +1406,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures python 3.8 to adapt to many kinds of systems. +\`configure' configures python 3.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1449,7 +1446,6 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1475,7 +1471,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of python 3.8:";; + short | recursive ) echo "Configuration of python 3.9:";; esac cat <<\_ACEOF @@ -1484,52 +1480,74 @@ Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-universalsdk[=SDKDIR] - Build fat binary against Mac OS X SDK + create a universal binary build. SDKDIR specifies + which macOS SDK should be used to perform the build, + see Mac/README.rst. (default is no) --enable-framework[=INSTALLDIR] - Build (MacOSX|Darwin) framework - --enable-shared disable/enable building shared python library - --enable-profiling enable C-level code profiling - --enable-optimizations Enable expensive, stable optimizations (PGO, etc). - Disabled by default. + create a Python.framework rather than a traditional + Unix install. optional INSTALLDIR specifies the + installation path. see Mac/README.rst (default is + no) + --enable-shared enable building a shared Python library (default is + no) + --enable-profiling enable C-level code profiling with gprof (default is + no) + --enable-optimizations enable expensive, stable optimizations (PGO, etc.) + (default is no) --enable-loadable-sqlite-extensions - support loadable extensions in _sqlite module - --enable-ipv6 Enable ipv6 (with ipv4) support - --disable-ipv6 Disable ipv6 support - --enable-big-digits[=BITS] - use big digits for Python longs [[BITS=30]] + support loadable extensions in _sqlite module, see + Doc/library/sqlite3.rst (default is no) + --enable-ipv6 enable ipv6 (with ipv4) support, see + Doc/library/socket.rst (default is yes if supported) + --enable-big-digits[=15|30] + use big digits (30 or 15 bits) for Python longs + (default is system-dependent)] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-universal-archs=ARCH - select architectures for universal build ("32-bit", - "64-bit", "3-way", "intel", "intel-32", "intel-64", - or "all") + specify the kind of universal binary that should be + created. this option is only valid when + --enable-universalsdk is set; options are: + ("32-bit", "64-bit", "3-way", "intel", "intel-32", + "intel-64", or "all") see Mac/README.rst --with-framework-name=FRAMEWORK - specify an alternate name of the framework built - with --enable-framework - --with-cxx-main= - compile main() and link python executable with C++ - compiler - --with-suffix=.exe set executable suffix - --with-pydebug build with Py_DEBUG defined + specify the name for the python framework on macOS + only valid when --enable-framework is set. see + Mac/README.rst (default is 'Python') + --with-cxx-main[=COMPILER] + compile main() and link Python executable with C++ + compiler specified in COMPILER (default is $CXX) + --with-suffix=SUFFIX set executable suffix to SUFFIX (default is '.exe') + --with-pydebug build with Py_DEBUG defined (default is no) --with-trace-refs enable tracing references for debugging purpose - --with-assertions build with C assertions enabled - --with-lto Enable Link Time Optimization in any build. Disabled - by default. + (default is no) + --with-assertions build with C assertions enabled (default is no) + --with-lto enable Link-Time-Optimization in any build (default + is no) --with-hash-algorithm=[fnv|siphash24] - select hash algorithm + select hash algorithm for use in Python/pyhash.c + (default is SipHash24) + --with-tzpath= + Select the default time zone search path for zoneinfo.TZPATH + --with-address-sanitizer - enable AddressSanitizer (asan) - --with-memory-sanitizer enable MemorySanitizer (msan) + enable AddressSanitizer memory error detector, + 'asan' (default is no) + --with-memory-sanitizer enable MemorySanitizer allocation error detector, + 'msan' (default is no) --with-undefined-behavior-sanitizer - enable UndefinedBehaviorSanitizer (ubsan) - --with-libs='lib1 ...' link against additional libs + enable UndefinedBehaviorSanitizer undefined + behaviour detector, 'ubsan' (default is no) + --with-libs='lib1 ...' link against additional libs (default is no) --with-system-expat build pyexpat module using an installed expat - library - --with-system-ffi build _ctypes module using an installed ffi library + library, see Doc/library/pyexpat.rst (default is no) + --with-system-ffi build _ctypes module using an installed ffi library, + see Doc/library/ctypes.rst (default is + system-dependent) --with-system-libmpdec build _decimal module using an installed libmpdec - library + library, see Doc/library/decimal.rst (default is no) --with-decimal-contextvar build _decimal module using a coroutine-local rather than a thread-local context (default is yes) @@ -1538,29 +1556,37 @@ Optional Packages: --with-tcltk-libs='-L...' override search for Tcl and Tk libs --with-dbmliborder=db1:db2:... - order to check db backends for dbm. Valid value is a - colon separated string with the backend names - `ndbm', `gdbm' and `bdb'. - --with(out)-doc-strings disable/enable documentation strings - --with(out)-pymalloc disable/enable specialized mallocs - --with(out)-c-locale-coercion - disable/enable C locale coercion to a UTF-8 based - locale - --with-valgrind Enable Valgrind support - --with(out)-dtrace disable/enable DTrace support - --with-libm=STRING math library - --with-libc=STRING C library - --with(out)-computed-gotos - Use computed gotos in evaluation loop (enabled by + override order to check db backends for dbm; a valid + value is a colon separated string with the backend + names `ndbm', `gdbm' and `bdb'. + --with-doc-strings enable documentation strings (default is yes) + --with-pymalloc enable specialized mallocs (default is yes) + --with-c-locale-coercion + enable C locale coercion to a UTF-8 based locale + (default is yes) + --with-valgrind enable Valgrind support (default is no) + --with-dtrace enable DTrace support (default is no) + --with-libm=STRING override libm math library to STRING (default is + system-dependent) + --with-libc=STRING override libc C library to STRING (default is + system-dependent) + --with-platlibdir=DIRNAME + Python library directory name (default is "lib") + --with-computed-gotos enable computed gotos in evaluation loop (enabled by default on supported compilers) - --with(out)-ensurepip=[=upgrade] - "install" or "upgrade" using bundled pip - --with-openssl=DIR root of the OpenSSL directory + --with-ensurepip[=install|upgrade|no] + "install" or "upgrade" using bundled pip (default is + upgrade) + --with-openssl=DIR override root of the OpenSSL directory to DIR --with-ssl-default-suites=[python|openssl|STRING] - Override default cipher suites string, python: use + override default cipher suites string, python: use Python's preferred selection (default), openssl: leave OpenSSL's defaults untouched, STRING: use a - custom string, PROTOCOL_SSLv2 ignores the setting + custom string, PROTOCOL_SSLv2 ignores the setting, + see Doc/library/ssl.rst + --with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2 + builtin hash modules, md5, sha1, sha256, sha512, + sha3 (with shake), blake2 Some influential environment variables: MACHDEP name for machine-dependent library files @@ -1646,7 +1672,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -python configure 3.8 +python configure 3.9 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2355,7 +2381,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by python $as_me 3.8, which was +It was created by python $as_me 3.9, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2975,7 +3001,7 @@ rm confdefs.h mv confdefs.h.new confdefs.h -VERSION=3.8 +VERSION=3.9 # Version number of Python's own shared library file. @@ -3252,7 +3278,7 @@ _ACEOF ##AC_ARG_WITH(dyld, ## AS_HELP_STRING([--with-dyld], -## [Use (OpenStep|Rhapsody) dynamic linker])) +## [use (OpenStep|Rhapsody) dynamic linker])) ## # Set name for machine-dependent library files @@ -5771,8 +5797,6 @@ LDVERSION="$VERSION" # If CXX is set, and if it is needed to link a main function that was # compiled with CXX, LINKCC is CXX instead. Always using CXX is undesirable: # python might then depend on the C++ runtime -# This is altered for AIX in order to build the export list before -# linking. { $as_echo "$as_me:${as_lineno-$LINENO}: checking LINKCC" >&5 $as_echo_n "checking LINKCC... " >&6; } @@ -5780,13 +5804,6 @@ if test -z "$LINKCC" then LINKCC='$(PURIFY) $(MAINCC)' case $ac_sys_system in - AIX*) - exp_extra="\"\"" - if test $ac_sys_release -ge 5 -o \ - $ac_sys_release -eq 4 -a `uname -r` -ge 2 ; then - exp_extra="." - fi - LINKCC="\$(srcdir)/Modules/makexp_aix Modules/python.exp $exp_extra \$(LIBRARY); $LINKCC";; QNX*) # qcc must be used because the other compilers do not # support -N. @@ -5796,6 +5813,26 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINKCC" >&5 $as_echo "$LINKCC" >&6; } +# EXPORTSYMS holds the list of exported symbols for AIX. +# EXPORTSFROM holds the module name exporting symbols on AIX. +EXPORTSYMS= +EXPORTSFROM= + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking EXPORTSYMS" >&5 +$as_echo_n "checking EXPORTSYMS... " >&6; } +case $ac_sys_system in +AIX*) + EXPORTSYMS="Modules/python.exp" + if test $ac_sys_release -ge 5 -o \ + $ac_sys_release -eq 4 -a `uname -r` -ge 2 ; then + EXPORTSFROM=. # the main executable + fi + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $EXPORTSYMS" >&5 +$as_echo "$EXPORTSYMS" >&6; } + # GNULD is set to "yes" if the GNU linker is used. If this goes wrong # make sure we default having it set to "no": this is used by # distutils.unixccompiler to know if it should add --enable-new-dtags @@ -7351,6 +7388,47 @@ $as_echo "$ac_cv_enable_implicit_function_declaration_error" >&6; } CFLAGS_NODIST="$CFLAGS_NODIST -Werror=implicit-function-declaration" fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can use visibility in $CC" >&5 +$as_echo_n "checking if we can use visibility in $CC... " >&6; } + ac_save_cc="$CC" + CC="$CC -fvisibility=hidden" + if ${ac_cv_enable_visibility+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + ac_cv_enable_visibility=yes + +else + + ac_cv_enable_visibility=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + CC="$ac_save_cc" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_visibility" >&5 +$as_echo "$ac_cv_enable_visibility" >&6; } + + if test $ac_cv_enable_visibility = yes + then + CFLAGS_NODIST="$CFLAGS_NODIST -fvisibility=hidden" + fi + # if using gcc on alpha, use -mieee to get (near) full IEEE 754 # support. Without this, treatment of subnormals doesn't follow # the standard. @@ -7510,11 +7588,14 @@ $as_echo "$MACOSX_DEPLOYMENT_TARGET" >&6; } ;; esac -# ICC needs -fp-model strict or floats behave badly case "$CC" in *icc*) + # ICC needs -fp-model strict or floats behave badly CFLAGS_NODIST="$CFLAGS_NODIST -fp-model strict" ;; +*xlc*) + CFLAGS_NODIST="$CFLAGS_NODIST -qalias=noansi -qmaxmem=-1" + ;; esac if test "$assertions" = 'true'; then @@ -7898,7 +7979,7 @@ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ linux/tipc.h linux/random.h spawn.h util.h alloca.h endian.h \ -sys/endian.h sys/sysmacros.h linux/memfd.h sys/memfd.h sys/mman.h +sys/endian.h sys/sysmacros.h linux/memfd.h linux/wait.h sys/memfd.h sys/mman.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" @@ -8227,8 +8308,8 @@ fi done -# On Linux, can.h and can/raw.h require sys/socket.h -for ac_header in linux/can.h linux/can/raw.h linux/can/bcm.h +# On Linux, can.h, can/bcm.h, can/j1939.h, can/raw.h require sys/socket.h +for ac_header in linux/can.h linux/can/bcm.h linux/can/j1939.h linux/can/raw.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " @@ -9997,7 +10078,21 @@ $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext;; + conftest$ac_exeext conftest.$ac_ext +# BUILD_GNU_TYPE + AIX_BUILDDATE are used to construct the platform_tag +# of the AIX system used to build/package Python executable. This tag serves +# as a baseline for bdist module packages + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the system builddate" >&5 +$as_echo_n "checking for the system builddate... " >&6; } + AIX_BUILDDATE=$(lslpp -Lcq bos.mp64 | awk -F: '{ print $NF }') + +cat >>confdefs.h <<_ACEOF +#define AIX_BUILDDATE $AIX_BUILDDATE +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AIX_BUILDDATE" >&5 +$as_echo "$AIX_BUILDDATE" >&6; } + ;; *) ;; esac @@ -10077,6 +10172,47 @@ $as_echo "default" >&6; } fi +validate_tzpath() { + # Checks that each element of hte path is an absolute path + if test -z "$1"; then + # Empty string is allowed: it indicates no system TZPATH + return 0 + fi + + # Bad paths are those that don't start with / + if ( echo $1 | grep -qE '(^|:)([^/]|$)' ); then + as_fn_error $? "--with-tzpath must contain only absolute paths, not $1" "$LINENO" 5 + return 1; + fi +} + +TZPATH="/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-tzpath" >&5 +$as_echo_n "checking for --with-tzpath... " >&6; } + +# Check whether --with-tzpath was given. +if test "${with_tzpath+set}" = set; then : + withval=$with_tzpath; +case "$withval" in + yes) + as_fn_error $? "--with-tzpath requires a value" "$LINENO" 5 + ;; + *) + validate_tzpath "$withval" + TZPATH="$withval" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$withval\"" >&5 +$as_echo "\"$withval\"" >&6; } + ;; +esac + +else + validate_tzpath "$TZPATH" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$TZPATH\"" >&5 +$as_echo "\"$TZPATH\"" >&6; } +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-address-sanitizer" >&5 $as_echo_n "checking for --with-address-sanitizer... " >&6; } @@ -11238,6 +11374,36 @@ $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAN_RAW_JOIN_FILTERS" >&5 +$as_echo_n "checking for CAN_RAW_JOIN_FILTERS... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int +main () +{ +int can_raw_join_filters = CAN_RAW_JOIN_FILTERS; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + +$as_echo "#define HAVE_LINUX_CAN_RAW_JOIN_FILTERS 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + # Check for --with-doc-strings { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-doc-strings" >&5 $as_echo_n "checking for --with-doc-strings... " >&6; } @@ -11353,7 +11519,6 @@ $as_echo "$with_dtrace" >&6; } DTRACE= -DFLAGS= DTRACE_HEADERS= DTRACE_OBJS= @@ -11419,7 +11584,7 @@ if ${ac_cv_dtrace_link+:} false; then : else ac_cv_dtrace_link=no echo 'BEGIN{}' > conftest.d - "$DTRACE" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ + "$DTRACE" $DFLAGS -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ ac_cv_dtrace_link=yes fi @@ -11515,7 +11680,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ memrchr mbrtowc mkdirat mkfifo \ madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ - pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ + pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ @@ -11525,7 +11690,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ - truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ + truncate uname unlinkat utimensat utimes waitid waitpid wait3 wait4 \ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` @@ -12740,37 +12905,6 @@ if ac_fn_c_try_compile "$LINENO"; then : $as_echo "#define SETPGRP_HAVE_ARG 1" >>confdefs.h -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -done - -for ac_func in gettimeofday -do : - ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETTIMEOFDAY 1 -_ACEOF - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -gettimeofday((struct timeval*)0,(struct timezone*)0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - -$as_echo "#define GETTIMEOFDAY_NO_TZ 1" >>confdefs.h - - fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext @@ -15213,10 +15347,46 @@ else fi + +BINLIBDEST='$(LIBDIR)/python$(VERSION)' + + +# Check for --with-platlibdir +# /usr/$LIDIRNAME/python$VERSION + +PLATLIBDIR="lib" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-platlibdir" >&5 +$as_echo_n "checking for --with-platlibdir... " >&6; } + +# Check whether --with-platlibdir was given. +if test "${with_platlibdir+set}" = set; then : + withval=$with_platlibdir; +# ignore 3 options: +# --with-platlibdir +# --with-platlibdir= +# --without-platlibdir +if test -n "$withval" -a "$withval" != yes -a "$withval" != no +then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + PLATLIBDIR="$withval" + BINLIBDEST='${exec_prefix}/${PLATLIBDIR}/python$(VERSION)' +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + if test x$PLATFORM_TRIPLET = x; then - LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}" + LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}" else - LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" + LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" fi @@ -16648,7 +16818,7 @@ do done -SRCDIRS="Parser Objects Python Modules Modules/_io Programs" +SRCDIRS="Parser Parser/pegen Objects Python Modules Modules/_io Programs" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build directories" >&5 $as_echo_n "checking for build directories... " >&6; } for dir in $SRCDIRS; do @@ -17391,6 +17561,43 @@ $as_echo "#define PY_SSL_DEFAULT_CIPHERS 1" >>confdefs.h fi +# builtin hash modules +default_hashlib_hashes="md5,sha1,sha256,sha512,sha3,blake2" + +$as_echo "#define PY_BUILTIN_HASHLIB_HASHES /**/" >>confdefs.h + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-builtin-hashlib-hashes" >&5 +$as_echo_n "checking for --with-builtin-hashlib-hashes... " >&6; } + +# Check whether --with-builtin-hashlib-hashes was given. +if test "${with_builtin_hashlib_hashes+set}" = set; then : + withval=$with_builtin_hashlib_hashes; +case "$withval" in + yes) + withval=$default_hashlib_hashes + ;; + no) + withval="" + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $withval" >&5 +$as_echo "$withval" >&6; } +cat >>confdefs.h <<_ACEOF +#define PY_BUILTIN_HASHLIB_HASHES "$withval" +_ACEOF + + +else + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $default_hashlib_hashes" >&5 +$as_echo "$default_hashlib_hashes" >&6; }; +cat >>confdefs.h <<_ACEOF +#define PY_BUILTIN_HASHLIB_HASHES "$default_hashlib_hashes" +_ACEOF + + +fi + # generate output files ac_config_files="$ac_config_files Makefile.pre Misc/python.pc Misc/python-embed.pc Misc/python-config.sh" @@ -17904,7 +18111,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by python $as_me 3.8, which was +This file was extended by python $as_me 3.9, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -17966,7 +18173,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -python config.status 3.8 +python config.status 3.9 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 18a04462..d60f0525 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ dnl * Please run autoreconf to test your changes! * dnl *********************************************** # Set VERSION so we only need to edit in one place (i.e., here) -m4_define(PYTHON_VERSION, 3.8) +m4_define(PYTHON_VERSION, 3.9) AC_PREREQ([2.69]) @@ -149,7 +149,10 @@ CONFIG_ARGS="$ac_configure_args" AC_MSG_CHECKING([for --enable-universalsdk]) AC_ARG_ENABLE(universalsdk, - AS_HELP_STRING([--enable-universalsdk@<:@=SDKDIR@:>@], [Build fat binary against Mac OS X SDK]), + AS_HELP_STRING([--enable-universalsdk@<:@=SDKDIR@:>@], + [create a universal binary build. + SDKDIR specifies which macOS SDK should be used to perform the build, + see Mac/README.rst. (default is no)]), [ case $enableval in yes) @@ -212,7 +215,11 @@ fi AC_SUBST(LIPO_32BIT_FLAGS) AC_MSG_CHECKING(for --with-universal-archs) AC_ARG_WITH(universal-archs, - AS_HELP_STRING([--with-universal-archs=ARCH], [select architectures for universal build ("32-bit", "64-bit", "3-way", "intel", "intel-32", "intel-64", or "all")]), + AS_HELP_STRING([--with-universal-archs=ARCH], + [specify the kind of universal binary that should be created. this option is + only valid when --enable-universalsdk is set; options are: + ("32-bit", "64-bit", "3-way", "intel", "intel-32", "intel-64", or "all") + see Mac/README.rst]), [ UNIVERSAL_ARCHS="$withval" ], @@ -226,7 +233,9 @@ fi AC_ARG_WITH(framework-name, AS_HELP_STRING([--with-framework-name=FRAMEWORK], - [specify an alternate name of the framework built with --enable-framework]), + [specify the name for the python framework on macOS + only valid when --enable-framework is set. see Mac/README.rst + (default is 'Python')]), [ PYTHONFRAMEWORK=${withval} PYTHONFRAMEWORKDIR=${withval}.framework @@ -238,7 +247,10 @@ AC_ARG_WITH(framework-name, ]) dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output AC_ARG_ENABLE(framework, - AS_HELP_STRING([--enable-framework@<:@=INSTALLDIR@:>@], [Build (MacOSX|Darwin) framework]), + AS_HELP_STRING([--enable-framework@<:@=INSTALLDIR@:>@], + [create a Python.framework rather than a traditional Unix install. + optional INSTALLDIR specifies the installation path. see Mac/README.rst + (default is no)]), [ case $enableval in yes) @@ -357,7 +369,7 @@ AC_DEFINE_UNQUOTED(_PYTHONFRAMEWORK, "${PYTHONFRAMEWORK}", [framework name]) ##AC_ARG_WITH(dyld, ## AS_HELP_STRING([--with-dyld], -## [Use (OpenStep|Rhapsody) dynamic linker])) +## [use (OpenStep|Rhapsody) dynamic linker])) ## # Set name for machine-dependent library files AC_ARG_VAR([MACHDEP], [name for machine-dependent library files]) @@ -653,8 +665,8 @@ AC_SUBST(CXX) AC_SUBST(MAINCC) AC_MSG_CHECKING(for --with-cxx-main=) AC_ARG_WITH(cxx_main, - AS_HELP_STRING([--with-cxx-main=], - [compile main() and link python executable with C++ compiler]), + AS_HELP_STRING([--with-cxx-main@<:@=COMPILER@:>@], + [compile main() and link Python executable with C++ compiler specified in COMPILER (default is $CXX)]), [ case $withval in @@ -934,7 +946,7 @@ esac AC_EXEEXT AC_MSG_CHECKING(for --with-suffix) AC_ARG_WITH(suffix, - AS_HELP_STRING([--with-suffix=.exe], [set executable suffix]), + AS_HELP_STRING([--with-suffix=SUFFIX], [set executable suffix to SUFFIX (default is '.exe')]), [ case $withval in no) EXEEXT=;; @@ -1012,21 +1024,12 @@ LDVERSION="$VERSION" # If CXX is set, and if it is needed to link a main function that was # compiled with CXX, LINKCC is CXX instead. Always using CXX is undesirable: # python might then depend on the C++ runtime -# This is altered for AIX in order to build the export list before -# linking. AC_SUBST(LINKCC) AC_MSG_CHECKING(LINKCC) if test -z "$LINKCC" then LINKCC='$(PURIFY) $(MAINCC)' case $ac_sys_system in - AIX*) - exp_extra="\"\"" - if test $ac_sys_release -ge 5 -o \ - $ac_sys_release -eq 4 -a `uname -r` -ge 2 ; then - exp_extra="." - fi - LINKCC="\$(srcdir)/Modules/makexp_aix Modules/python.exp $exp_extra \$(LIBRARY); $LINKCC";; QNX*) # qcc must be used because the other compilers do not # support -N. @@ -1035,6 +1038,24 @@ then fi AC_MSG_RESULT($LINKCC) +# EXPORTSYMS holds the list of exported symbols for AIX. +# EXPORTSFROM holds the module name exporting symbols on AIX. +EXPORTSYMS= +EXPORTSFROM= +AC_SUBST(EXPORTSYMS) +AC_SUBST(EXPORTSFROM) +AC_MSG_CHECKING(EXPORTSYMS) +case $ac_sys_system in +AIX*) + EXPORTSYMS="Modules/python.exp" + if test $ac_sys_release -ge 5 -o \ + $ac_sys_release -eq 4 -a `uname -r` -ge 2 ; then + EXPORTSFROM=. # the main executable + fi + ;; +esac +AC_MSG_RESULT($EXPORTSYMS) + # GNULD is set to "yes" if the GNU linker is used. If this goes wrong # make sure we default having it set to "no": this is used by # distutils.unixccompiler to know if it should add --enable-new-dtags @@ -1056,7 +1077,7 @@ AC_MSG_RESULT($GNULD) AC_MSG_CHECKING(for --enable-shared) AC_ARG_ENABLE(shared, - AS_HELP_STRING([--enable-shared], [disable/enable building shared python library])) + AS_HELP_STRING([--enable-shared], [enable building a shared Python library (default is no)])) if test -z "$enable_shared" then @@ -1071,7 +1092,7 @@ AC_MSG_RESULT($enable_shared) AC_MSG_CHECKING(for --enable-profiling) AC_ARG_ENABLE(profiling, - AS_HELP_STRING([--enable-profiling], [enable C-level code profiling])) + AS_HELP_STRING([--enable-profiling], [enable C-level code profiling with gprof (default is no)])) if test "x$enable_profiling" = xyes; then ac_save_cc="$CC" CC="$CC -pg" @@ -1222,7 +1243,7 @@ ABIFLAGS="" # Check for --with-pydebug AC_MSG_CHECKING(for --with-pydebug) AC_ARG_WITH(pydebug, - AS_HELP_STRING([--with-pydebug], [build with Py_DEBUG defined]), + AS_HELP_STRING([--with-pydebug], [build with Py_DEBUG defined (default is no)]), [ if test "$withval" != no then @@ -1239,7 +1260,9 @@ fi], # --with-trace-refs AC_MSG_CHECKING(for --with-trace-refs) AC_ARG_WITH(trace-refs, - AS_HELP_STRING([--with-trace-refs],[enable tracing references for debugging purpose]),, + AS_HELP_STRING( + [--with-trace-refs], + [enable tracing references for debugging purpose (default is no)]),, with_trace_refs=no) AC_MSG_RESULT($with_trace_refs) @@ -1253,7 +1276,7 @@ fi assertions='false' AC_MSG_CHECKING(for --with-assertions) AC_ARG_WITH(assertions, - AS_HELP_STRING([--with-assertions],[build with C assertions enabled]), + AS_HELP_STRING([--with-assertions],[build with C assertions enabled (default is no)]), [ if test "$withval" != no then @@ -1274,7 +1297,9 @@ AC_SUBST(DEF_MAKE_ALL_RULE) AC_SUBST(DEF_MAKE_RULE) Py_OPT='false' AC_MSG_CHECKING(for --enable-optimizations) -AC_ARG_ENABLE(optimizations, AS_HELP_STRING([--enable-optimizations], [Enable expensive, stable optimizations (PGO, etc). Disabled by default.]), +AC_ARG_ENABLE(optimizations, AS_HELP_STRING( + [--enable-optimizations], + [enable expensive, stable optimizations (PGO, etc.) (default is no)]), [ if test "$enableval" != no then @@ -1329,7 +1354,7 @@ fi # Enable LTO flags AC_MSG_CHECKING(for --with-lto) -AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [Enable Link Time Optimization in any build. Disabled by default.]), +AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [enable Link-Time-Optimization in any build (default is no)]), [ if test "$withval" != no then @@ -1793,6 +1818,26 @@ yes) CFLAGS_NODIST="$CFLAGS_NODIST -Werror=implicit-function-declaration" fi + AC_MSG_CHECKING(if we can use visibility in $CC) + ac_save_cc="$CC" + CC="$CC -fvisibility=hidden" + AC_CACHE_VAL(ac_cv_enable_visibility, + AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM([[]], [[]]) + ],[ + ac_cv_enable_visibility=yes + ],[ + ac_cv_enable_visibility=no + ])) + CC="$ac_save_cc" + AC_MSG_RESULT($ac_cv_enable_visibility) + + if test $ac_cv_enable_visibility = yes + then + CFLAGS_NODIST="$CFLAGS_NODIST -fvisibility=hidden" + fi + # if using gcc on alpha, use -mieee to get (near) full IEEE 754 # support. Without this, treatment of subnormals doesn't follow # the standard. @@ -1948,11 +1993,14 @@ yes) ;; esac -# ICC needs -fp-model strict or floats behave badly case "$CC" in *icc*) + # ICC needs -fp-model strict or floats behave badly CFLAGS_NODIST="$CFLAGS_NODIST -fp-model strict" ;; +*xlc*) + CFLAGS_NODIST="$CFLAGS_NODIST -qalias=noansi -qmaxmem=-1" + ;; esac if test "$assertions" = 'true'; then @@ -2147,7 +2195,7 @@ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ linux/tipc.h linux/random.h spawn.h util.h alloca.h endian.h \ -sys/endian.h sys/sysmacros.h linux/memfd.h sys/memfd.h sys/mman.h) +sys/endian.h sys/sysmacros.h linux/memfd.h linux/wait.h sys/memfd.h sys/mman.h) AC_HEADER_DIRENT AC_HEADER_MAJOR @@ -2200,8 +2248,8 @@ AC_CHECK_HEADERS(linux/vm_sockets.h,,,[ #endif ]) -# On Linux, can.h and can/raw.h require sys/socket.h -AC_CHECK_HEADERS(linux/can.h linux/can/raw.h linux/can/bcm.h,,,[ +# On Linux, can.h, can/bcm.h, can/j1939.h, can/raw.h require sys/socket.h +AC_CHECK_HEADERS(linux/can.h linux/can/bcm.h linux/can/j1939.h linux/can/raw.h,,,[ #ifdef HAVE_SYS_SOCKET_H #include #endif @@ -2844,7 +2892,17 @@ case "$ac_sys_system" in AC_MSG_RESULT(yes) ],[ AC_MSG_RESULT(no) - ]);; + ]) +dnl The AIX_BUILDDATE is obtained from the kernel fileset - bos.mp64 +# BUILD_GNU_TYPE + AIX_BUILDDATE are used to construct the platform_tag +# of the AIX system used to build/package Python executable. This tag serves +# as a baseline for bdist module packages + AC_MSG_CHECKING(for the system builddate) + AIX_BUILDDATE=$(lslpp -Lcq bos.mp64 | awk -F: '{ print $NF }') + AC_DEFINE_UNQUOTED([AIX_BUILDDATE], [$AIX_BUILDDATE], + [BUILD_GNU_TYPE + AIX_BUILDDATE are used to construct the PEP425 tag of the build system.]) + AC_MSG_RESULT($AIX_BUILDDATE) + ;; *) ;; esac @@ -2883,7 +2941,7 @@ AC_MSG_CHECKING(for --with-hash-algorithm) dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output AC_ARG_WITH(hash_algorithm, AS_HELP_STRING([--with-hash-algorithm=@<:@fnv|siphash24@:>@], - [select hash algorithm]), + [select hash algorithm for use in Python/pyhash.c (default is SipHash24)]), [ AC_MSG_RESULT($withval) case "$withval" in @@ -2900,10 +2958,46 @@ esac ], [AC_MSG_RESULT(default)]) +validate_tzpath() { + # Checks that each element of hte path is an absolute path + if test -z "$1"; then + # Empty string is allowed: it indicates no system TZPATH + return 0 + fi + + # Bad paths are those that don't start with / + dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output + if ( echo $1 | grep -qE '(^|:)(@<:@^/@:>@|$)' ); then + AC_MSG_ERROR([--with-tzpath must contain only absolute paths, not $1]) + return 1; + fi +} + +TZPATH="/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" +AC_MSG_CHECKING(for --with-tzpath) +AC_ARG_WITH(tzpath, + AS_HELP_STRING([--with-tzpath=] + [Select the default time zone search path for zoneinfo.TZPATH]), +[ +case "$withval" in + yes) + AC_MSG_ERROR([--with-tzpath requires a value]) + ;; + *) + validate_tzpath "$withval" + TZPATH="$withval" + AC_MSG_RESULT("$withval") + ;; +esac +], +[validate_tzpath "$TZPATH" + AC_MSG_RESULT("$TZPATH")]) +AC_SUBST(TZPATH) + AC_MSG_CHECKING(for --with-address-sanitizer) AC_ARG_WITH(address_sanitizer, AS_HELP_STRING([--with-address-sanitizer], - [enable AddressSanitizer (asan)]), + [enable AddressSanitizer memory error detector, 'asan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=address -fno-omit-frame-pointer $BASECFLAGS" @@ -2916,7 +3010,7 @@ with_pymalloc="no" AC_MSG_CHECKING(for --with-memory-sanitizer) AC_ARG_WITH(memory_sanitizer, AS_HELP_STRING([--with-memory-sanitizer], - [enable MemorySanitizer (msan)]), + [enable MemorySanitizer allocation error detector, 'msan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer $BASECFLAGS" @@ -2929,7 +3023,7 @@ with_pymalloc="no" AC_MSG_CHECKING(for --with-undefined-behavior-sanitizer) AC_ARG_WITH(undefined_behavior_sanitizer, AS_HELP_STRING([--with-undefined-behavior-sanitizer], - [enable UndefinedBehaviorSanitizer (ubsan)]), + [enable UndefinedBehaviorSanitizer undefined behaviour detector, 'ubsan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=undefined $BASECFLAGS" @@ -2943,7 +3037,7 @@ AC_CHECK_LIB(socket, socket, [LIBS="-lsocket $LIBS"], [], $LIBS) # SVR4 sockets AC_MSG_CHECKING(for --with-libs) AC_ARG_WITH(libs, - AS_HELP_STRING([--with-libs='lib1 ...'], [link against additional libs]), + AS_HELP_STRING([--with-libs='lib1 ...'], [link against additional libs (default is no)]), [ AC_MSG_RESULT($withval) LIBS="$withval $LIBS" @@ -2955,7 +3049,7 @@ PKG_PROG_PKG_CONFIG # Check for use of the system expat library AC_MSG_CHECKING(for --with-system-expat) AC_ARG_WITH(system_expat, - AS_HELP_STRING([--with-system-expat], [build pyexpat module using an installed expat library]), + AS_HELP_STRING([--with-system-expat], [build pyexpat module using an installed expat library, see Doc/library/pyexpat.rst (default is no)]), [], [with_system_expat="no"]) @@ -2964,7 +3058,7 @@ AC_MSG_RESULT($with_system_expat) # Check for use of the system libffi library AC_MSG_CHECKING(for --with-system-ffi) AC_ARG_WITH(system_ffi, - AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library]),,,) + AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library, see Doc/library/ctypes.rst (default is system-dependent)]),,,) if test "$ac_sys_system" = "Darwin" then @@ -2998,7 +3092,7 @@ AC_SUBST(LIBFFI_INCLUDEDIR) # Check for use of the system libmpdec library AC_MSG_CHECKING(for --with-system-libmpdec) AC_ARG_WITH(system_libmpdec, - AS_HELP_STRING([--with-system-libmpdec], [build _decimal module using an installed libmpdec library]), + AS_HELP_STRING([--with-system-libmpdec], [build _decimal module using an installed libmpdec library, see Doc/library/decimal.rst (default is no)]), [], [with_system_libmpdec="no"]) @@ -3022,7 +3116,8 @@ AC_MSG_RESULT($with_decimal_contextvar) # Check for support for loadable sqlite extensions AC_MSG_CHECKING(for --enable-loadable-sqlite-extensions) AC_ARG_ENABLE(loadable-sqlite-extensions, - AS_HELP_STRING([--enable-loadable-sqlite-extensions], [support loadable extensions in _sqlite module]), + AS_HELP_STRING([--enable-loadable-sqlite-extensions], + [support loadable extensions in _sqlite module, see Doc/library/sqlite3.rst (default is no)]), [], [enable_loadable_sqlite_extensions="no"]) @@ -3059,7 +3154,7 @@ fi # Check for --with-dbmliborder AC_MSG_CHECKING(for --with-dbmliborder) AC_ARG_WITH(dbmliborder, - AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [order to check db backends for dbm. Valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]), + AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [override order to check db backends for dbm; a valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]), [ if test x$with_dbmliborder = xyes then @@ -3231,8 +3326,8 @@ fi AH_TEMPLATE(ENABLE_IPV6, [Define if --enable-ipv6 is specified]) AC_MSG_CHECKING([if --enable-ipv6 is specified]) AC_ARG_ENABLE(ipv6, -[ --enable-ipv6 Enable ipv6 (with ipv4) support - --disable-ipv6 Disable ipv6 support], + AS_HELP_STRING([--enable-ipv6], + [enable ipv6 (with ipv4) support, see Doc/library/socket.rst (default is yes if supported)]), [ case "$enableval" in no) AC_MSG_RESULT(no) @@ -3400,10 +3495,20 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ /* CAN_RAW_FD_FRAMES available check */ AC_MSG_RESULT(no) ]) +AC_MSG_CHECKING(for CAN_RAW_JOIN_FILTERS) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include ]], +[[int can_raw_join_filters = CAN_RAW_JOIN_FILTERS;]])],[ + AC_DEFINE(HAVE_LINUX_CAN_RAW_JOIN_FILTERS, 1, [Define if compiling using Linux 4.1 or later.]) + AC_MSG_RESULT(yes) +],[ + AC_MSG_RESULT(no) +]) + # Check for --with-doc-strings AC_MSG_CHECKING(for --with-doc-strings) AC_ARG_WITH(doc-strings, - AS_HELP_STRING([--with(out)-doc-strings], [disable/enable documentation strings])) + AS_HELP_STRING([--with-doc-strings], [enable documentation strings (default is yes)])) if test -z "$with_doc_strings" then with_doc_strings="yes" @@ -3418,7 +3523,7 @@ AC_MSG_RESULT($with_doc_strings) # Check for Python-specific malloc support AC_MSG_CHECKING(for --with-pymalloc) AC_ARG_WITH(pymalloc, - AS_HELP_STRING([--with(out)-pymalloc], [disable/enable specialized mallocs])) + AS_HELP_STRING([--with-pymalloc], [enable specialized mallocs (default is yes)])) if test -z "$with_pymalloc" then @@ -3434,8 +3539,8 @@ AC_MSG_RESULT($with_pymalloc) # Check for --with-c-locale-coercion AC_MSG_CHECKING(for --with-c-locale-coercion) AC_ARG_WITH(c-locale-coercion, - AS_HELP_STRING([--with(out)-c-locale-coercion], - [disable/enable C locale coercion to a UTF-8 based locale])) + AS_HELP_STRING([--with-c-locale-coercion], + [enable C locale coercion to a UTF-8 based locale (default is yes)])) if test -z "$with_c_locale_coercion" then @@ -3451,7 +3556,7 @@ AC_MSG_RESULT($with_c_locale_coercion) # Check for Valgrind support AC_MSG_CHECKING([for --with-valgrind]) AC_ARG_WITH([valgrind], - AS_HELP_STRING([--with-valgrind], [Enable Valgrind support]),, + AS_HELP_STRING([--with-valgrind], [enable Valgrind support (default is no)]),, with_valgrind=no) AC_MSG_RESULT([$with_valgrind]) if test "$with_valgrind" != no; then @@ -3465,7 +3570,7 @@ fi # Check for DTrace support AC_MSG_CHECKING(for --with-dtrace) AC_ARG_WITH(dtrace, - AS_HELP_STRING([--with(out)-dtrace],[disable/enable DTrace support]),, + AS_HELP_STRING([--with-dtrace],[enable DTrace support (default is no)]),, with_dtrace=no) AC_MSG_RESULT($with_dtrace) @@ -3474,7 +3579,6 @@ AC_SUBST(DFLAGS) AC_SUBST(DTRACE_HEADERS) AC_SUBST(DTRACE_OBJS) DTRACE= -DFLAGS= DTRACE_HEADERS= DTRACE_OBJS= @@ -3495,7 +3599,7 @@ then [ac_cv_dtrace_link], [dnl ac_cv_dtrace_link=no echo 'BEGIN{}' > conftest.d - "$DTRACE" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ + "$DTRACE" $DFLAGS -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ ac_cv_dtrace_link=yes ]) if test "$ac_cv_dtrace_link" = "yes"; then @@ -3572,7 +3676,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ memrchr mbrtowc mkdirat mkfifo \ madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ - pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ + pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ @@ -3582,7 +3686,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ - truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ + truncate uname unlinkat utimensat utimes waitid waitpid wait3 wait4 \ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn) # Force lchmod off for Linux. Linux disallows changing the mode of symbolic @@ -3889,15 +3993,6 @@ AC_CHECK_FUNCS(setpgrp, [AC_DEFINE(SETPGRP_HAVE_ARG, 1, [Define if setpgrp() must be called as setpgrp(0, 0).])], []) ) -AC_CHECK_FUNCS(gettimeofday, - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[gettimeofday((struct timeval*)0,(struct timezone*)0);]])], - [], - [AC_DEFINE(GETTIMEOFDAY_NO_TZ, 1, - [Define if gettimeofday() does not have second (timezone) argument - This is the case on Motorola V4 (R40V4.2)]) - ]) -) # We search for both crypt and crypt_r as one or the other may be defined # This gets us our -lcrypt in LIBS when required on the target platform. @@ -4321,7 +4416,7 @@ Darwin) ;; esac AC_MSG_CHECKING(for --with-libm=STRING) AC_ARG_WITH(libm, - AS_HELP_STRING([--with-libm=STRING], [math library]), + AS_HELP_STRING([--with-libm=STRING], [override libm math library to STRING (default is system-dependent)]), [ if test "$withval" = no then LIBM= @@ -4337,7 +4432,7 @@ fi], AC_SUBST(LIBC) AC_MSG_CHECKING(for --with-libc=STRING) AC_ARG_WITH(libc, - AS_HELP_STRING([--with-libc=STRING], [C library]), + AS_HELP_STRING([--with-libc=STRING], [override libc C library to STRING (default is system-dependent)]), [ if test "$withval" = no then LIBC= @@ -4555,7 +4650,7 @@ AC_CHECK_DECLS([RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTL # determine what size digit to use for Python's longs AC_MSG_CHECKING([digit size for Python's longs]) AC_ARG_ENABLE(big-digits, -AS_HELP_STRING([--enable-big-digits@<:@=BITS@:>@],[use big digits for Python longs [[BITS=30]]]), +AS_HELP_STRING([--enable-big-digits@<:@=15|30@:>@],[use big digits (30 or 15 bits) for Python longs (default is system-dependent)]]), [case $enable_big_digits in yes) enable_big_digits=30 ;; @@ -4686,12 +4781,41 @@ else LIBPYTHON='' fi + +AC_SUBST(BINLIBDEST) +BINLIBDEST='$(LIBDIR)/python$(VERSION)' + + +# Check for --with-platlibdir +# /usr/$LIDIRNAME/python$VERSION +AC_SUBST(PLATLIBDIR) +PLATLIBDIR="lib" +AC_MSG_CHECKING(for --with-platlibdir) +AC_ARG_WITH(platlibdir, + AS_HELP_STRING([--with-platlibdir=DIRNAME], + [Python library directory name (default is "lib")]), +[ +# ignore 3 options: +# --with-platlibdir +# --with-platlibdir= +# --without-platlibdir +if test -n "$withval" -a "$withval" != yes -a "$withval" != no +then + AC_MSG_RESULT(yes) + PLATLIBDIR="$withval" + BINLIBDEST='${exec_prefix}/${PLATLIBDIR}/python$(VERSION)' +else + AC_MSG_RESULT(no) +fi], +[AC_MSG_RESULT(no)]) + + dnl define LIBPL after ABIFLAGS and LDVERSION is defined. AC_SUBST(PY_ENABLE_SHARED) if test x$PLATFORM_TRIPLET = x; then - LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}" + LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}" else - LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" + LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" fi AC_SUBST(LIBPL) @@ -5267,8 +5391,8 @@ fi # Check for --with-computed-gotos AC_MSG_CHECKING(for --with-computed-gotos) AC_ARG_WITH(computed-gotos, - AS_HELP_STRING([--with(out)-computed-gotos], - [Use computed gotos in evaluation loop (enabled by default on supported compilers)]), + AS_HELP_STRING([--with-computed-gotos], + [enable computed gotos in evaluation loop (enabled by default on supported compilers)]), [ if test "$withval" = yes then @@ -5326,7 +5450,7 @@ do done AC_SUBST(SRCDIRS) -SRCDIRS="Parser Objects Python Modules Modules/_io Programs" +SRCDIRS="Parser Parser/pegen Objects Python Modules Modules/_io Programs" AC_MSG_CHECKING(for build directories) for dir in $SRCDIRS; do if test ! -d $dir; then @@ -5464,8 +5588,8 @@ fi # ensurepip option AC_MSG_CHECKING(for ensurepip) AC_ARG_WITH(ensurepip, - [AS_HELP_STRING([--with(out)-ensurepip=@<:@=upgrade@:>@], - ["install" or "upgrade" using bundled pip])], + [AS_HELP_STRING([--with-ensurepip@<:@=install|upgrade|no@:>@], + ["install" or "upgrade" using bundled pip (default is upgrade)])], [], [with_ensurepip=upgrade]) AS_CASE($with_ensurepip, @@ -5621,11 +5745,11 @@ AH_TEMPLATE(PY_SSL_DEFAULT_CIPHER_STRING, AC_MSG_CHECKING(for --with-ssl-default-suites) AC_ARG_WITH(ssl-default-suites, AS_HELP_STRING([--with-ssl-default-suites=@<:@python|openssl|STRING@:>@], - [Override default cipher suites string, + [override default cipher suites string, python: use Python's preferred selection (default), openssl: leave OpenSSL's defaults untouched, STRING: use a custom string, - PROTOCOL_SSLv2 ignores the setting]), + PROTOCOL_SSLv2 ignores the setting, see Doc/library/ssl.rst]), [ AC_MSG_RESULT($withval) case "$withval" in @@ -5646,6 +5770,31 @@ AC_MSG_RESULT(python) AC_DEFINE(PY_SSL_DEFAULT_CIPHERS, 1) ]) +# builtin hash modules +default_hashlib_hashes="md5,sha1,sha256,sha512,sha3,blake2" +AC_DEFINE([PY_BUILTIN_HASHLIB_HASHES], [], [enabled builtin hash modules] +) +AC_MSG_CHECKING(for --with-builtin-hashlib-hashes) +AC_ARG_WITH(builtin-hashlib-hashes, + AS_HELP_STRING([--with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2], + [builtin hash modules, + md5, sha1, sha256, sha512, sha3 (with shake), blake2]), +[ +case "$withval" in + yes) + withval=$default_hashlib_hashes + ;; + no) + withval="" + ;; +esac +AC_MSG_RESULT($withval) +AC_DEFINE_UNQUOTED(PY_BUILTIN_HASHLIB_HASHES, "$withval") +], +[ +AC_MSG_RESULT($default_hashlib_hashes); +AC_DEFINE_UNQUOTED(PY_BUILTIN_HASHLIB_HASHES, "$default_hashlib_hashes") +]) # generate output files AC_CONFIG_FILES(Makefile.pre Misc/python.pc Misc/python-embed.pc Misc/python-config.sh) diff --git a/m4/ax_check_openssl.m4 b/m4/ax_check_openssl.m4 index 28e48cbe..2846fd14 100644 --- a/m4/ax_check_openssl.m4 +++ b/m4/ax_check_openssl.m4 @@ -39,7 +39,7 @@ AC_DEFUN([AX_CHECK_OPENSSL], [ found=false AC_ARG_WITH([openssl], [AS_HELP_STRING([--with-openssl=DIR], - [root of the OpenSSL directory])], + [override root of the OpenSSL directory to DIR])], [ case "$withval" in "" | y | ye | yes | n | no) diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 00000000..387c8f95 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,4 @@ +[build] + base = "Doc/" + command = "make html" + publish = "Doc/build/html" \ No newline at end of file diff --git a/pyconfig.h.in b/pyconfig.h.in index 4263a712..c9589cd1 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -8,6 +8,10 @@ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD +/* BUILD_GNU_TYPE + AIX_BUILDDATE are used to construct the PEP425 tag of the + build system. */ +#undef AIX_BUILDDATE + /* Define for AIX if your compiler is a genuine IBM xlC/xlC_r and you want support for AIX C++ shared extension modules. */ #undef AIX_GENUINE_CPLUSPLUS @@ -44,10 +48,6 @@ /* Define if getpgrp() must be called as getpgrp(0). */ #undef GETPGRP_HAVE_ARG -/* Define if gettimeofday() does not have second (timezone) argument This is - the case on Motorola V4 (R40V4.2) */ -#undef GETTIMEOFDAY_NO_TZ - /* Define to 1 if you have the `accept4' function. */ #undef HAVE_ACCEPT4 @@ -513,9 +513,6 @@ /* Define to 1 if you have the `getspnam' function. */ #undef HAVE_GETSPNAM -/* Define to 1 if you have the `gettimeofday' function. */ -#undef HAVE_GETTIMEOFDAY - /* Define to 1 if you have the `getwd' function. */ #undef HAVE_GETWD @@ -625,12 +622,18 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_CAN_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_CAN_J1939_H + /* Define if compiling using Linux 3.6 or later. */ #undef HAVE_LINUX_CAN_RAW_FD_FRAMES /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_CAN_RAW_H +/* Define if compiling using Linux 4.1 or later. */ +#undef HAVE_LINUX_CAN_RAW_JOIN_FILTERS + /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_MEMFD_H @@ -649,6 +652,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_VM_SOCKETS_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_WAIT_H + /* Define to 1 if you have the `lockf' function. */ #undef HAVE_LOCKF @@ -802,9 +808,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_PTY_H -/* Define to 1 if you have the `putenv' function. */ -#undef HAVE_PUTENV - /* Define to 1 if you have the `pwrite' function. */ #undef HAVE_PWRITE @@ -1263,9 +1266,6 @@ /* Define to 1 if you have the `unlinkat' function. */ #undef HAVE_UNLINKAT -/* Define to 1 if you have the `unsetenv' function. */ -#undef HAVE_UNSETENV - /* Define if you have a useable wchar_t type defined in wchar.h; useable means wchar_t must be an unsigned type with at least 16 bits. (see Include/unicodeobject.h). */ @@ -1382,6 +1382,9 @@ /* Define as the preferred size in bits of long digits */ #undef PYLONG_BITS_IN_DIGIT +/* enabled builtin hash modules */ +#undef PY_BUILTIN_HASHLIB_HASHES + /* Define if you want to coerce the C locale to a UTF-8 based locale */ #undef PY_COERCE_C_LOCALE diff --git a/setup.py b/setup.py index 6340669f..770866bc 100644 --- a/setup.py +++ b/setup.py @@ -10,6 +10,25 @@ import sys import sysconfig from glob import glob, escape + +try: + import subprocess + del subprocess + SUBPROCESS_BOOTSTRAP = False +except ImportError: + # Bootstrap Python: distutils.spawn uses subprocess to build C extensions, + # subprocess requires C extensions built by setup.py like _posixsubprocess. + # + # Use _bootsubprocess which only uses the os module. + # + # It is dropped from sys.modules as soon as all C extension modules + # are built. + import _bootsubprocess + sys.modules['subprocess'] = _bootsubprocess + del _bootsubprocess + SUBPROCESS_BOOTSTRAP = True + + from distutils import log from distutils.command.build_ext import build_ext from distutils.command.build_scripts import build_scripts @@ -76,6 +95,11 @@ Topic :: Software Development """ +def run_command(cmd): + status = os.system(cmd) + return os.waitstatus_to_exitcode(status) + + # Set common compiler and linker flags derived from the Makefile, # reserved for building the interpreter and the stdlib modules. # See bpo-21121 and bpo-35257 @@ -126,7 +150,9 @@ def sysroot_paths(make_vars, subdirs): break return dirs + MACOS_SDK_ROOT = None +MACOS_SDK_SPECIFIED = None def macosx_sdk_root(): """Return the directory of the current macOS SDK. @@ -138,8 +164,9 @@ def macosx_sdk_root(): (The SDK may be supplied via Xcode or via the Command Line Tools). The SDK paths used by Apple-supplied tool chains depend on the setting of various variables; see the xcrun man page for more info. + Also sets MACOS_SDK_SPECIFIED for use by macosx_sdk_specified(). """ - global MACOS_SDK_ROOT + global MACOS_SDK_ROOT, MACOS_SDK_SPECIFIED # If already called, return cached result. if MACOS_SDK_ROOT: @@ -149,18 +176,20 @@ def macosx_sdk_root(): m = re.search(r'-isysroot\s*(\S+)', cflags) if m is not None: MACOS_SDK_ROOT = m.group(1) + MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' else: MACOS_SDK_ROOT = '/' + MACOS_SDK_SPECIFIED = False cc = sysconfig.get_config_var('CC') tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() try: os.unlink(tmpfile) except: pass - ret = os.system('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) + ret = run_command('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) in_incdirs = False try: - if ret >> 8 == 0: + if ret == 0: with open(tmpfile) as fp: for line in fp.readlines(): if line.startswith("#include <...>"): @@ -179,6 +208,28 @@ def macosx_sdk_root(): return MACOS_SDK_ROOT +def macosx_sdk_specified(): + """Returns true if an SDK was explicitly configured. + + True if an SDK was selected at configure time, either by specifying + --enable-universalsdk=(something other than no or /) or by adding a + -isysroot option to CFLAGS. In some cases, like when making + decisions about macOS Tk framework paths, we need to be able to + know whether the user explicitly asked to build with an SDK versus + the implicit use of an SDK when header files are no longer + installed on a running system by the Command Line Tools. + """ + global MACOS_SDK_SPECIFIED + + # If already called, return cached result. + if MACOS_SDK_SPECIFIED: + return MACOS_SDK_SPECIFIED + + # Find the sdk root and set MACOS_SDK_SPECIFIED + macosx_sdk_root() + return MACOS_SDK_SPECIFIED + + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -280,6 +331,17 @@ def find_library_file(compiler, libname, std_dirs, paths): else: assert False, "Internal error: Path not found in std_dirs or paths" +def validate_tzpath(): + base_tzpath = sysconfig.get_config_var('TZPATH') + if not base_tzpath: + return + + tzpaths = base_tzpath.split(os.pathsep) + bad_paths = [tzpath for tzpath in tzpaths if not os.path.isabs(tzpath)] + if bad_paths: + raise ValueError('TZPATH must contain only absolute paths, ' + + f'found:\n{tzpaths!r}\nwith invalid paths:\n' + + f'{bad_paths!r}') def find_module_file(module, dirlist): """Find a module in a set of possible folders. If it is not found @@ -303,22 +365,21 @@ class PyBuildExt(build_ext): self.failed = [] self.failed_on_import = [] self.missing = [] + self.disabled_configure = [] if '-j' in os.environ.get('MAKEFLAGS', ''): self.parallel = True def add(self, ext): self.extensions.append(ext) - def build_extensions(self): + def set_srcdir(self): self.srcdir = sysconfig.get_config_var('srcdir') if not self.srcdir: # Maybe running on Windows but not using CYGWIN? raise ValueError("No source directory; cannot proceed.") self.srcdir = os.path.abspath(self.srcdir) - # Detect which modules should be compiled - self.detect_modules() - + def remove_disabled(self): # Remove modules that are present on the disabled list extensions = [ext for ext in self.extensions if ext.name not in DISABLED_MODULE_LIST] @@ -329,6 +390,7 @@ class PyBuildExt(build_ext): extensions.append(ctypes) self.extensions = extensions + def update_sources_depends(self): # Fix up the autodetected modules, prefixing all the source files # with Modules/. moddirlist = [os.path.join(self.srcdir, 'Modules')] @@ -341,14 +403,6 @@ class PyBuildExt(build_ext): headers = [sysconfig.get_config_h_filename()] headers += glob(os.path.join(escape(sysconfig.get_path('include')), "*.h")) - # The sysconfig variables built by makesetup that list the already - # built modules and the disabled modules as configured by the Setup - # files. - sysconf_built = sysconfig.get_config_var('MODBUILT_NAMES').split() - sysconf_dis = sysconfig.get_config_var('MODDISABLED_NAMES').split() - - mods_built = [] - mods_disabled = [] for ext in self.extensions: ext.sources = [ find_module_file(filename, moddirlist) for filename in ext.sources ] @@ -360,6 +414,16 @@ class PyBuildExt(build_ext): # re-compile extensions if a header file has been changed ext.depends.extend(headers) + def remove_configured_extensions(self): + # The sysconfig variables built by makesetup that list the already + # built modules and the disabled modules as configured by the Setup + # files. + sysconf_built = sysconfig.get_config_var('MODBUILT_NAMES').split() + sysconf_dis = sysconfig.get_config_var('MODDISABLED_NAMES').split() + + mods_built = [] + mods_disabled = [] + for ext in self.extensions: # If a module has already been built or has been disabled in the # Setup files, don't build it here. if ext.name in sysconf_built: @@ -377,6 +441,9 @@ class PyBuildExt(build_ext): if os.path.exists(fullpath): os.unlink(fullpath) + return (mods_built, mods_disabled) + + def set_compiler_executables(self): # When you run "make CC=altcc" or something similar, you really want # those environment variables passed into the setup.py phase. Here's # a small set of useful ones. @@ -389,11 +456,31 @@ class PyBuildExt(build_ext): args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags self.compiler.set_executables(**args) + def build_extensions(self): + self.set_srcdir() + + # Detect which modules should be compiled + self.detect_modules() + + self.remove_disabled() + + self.update_sources_depends() + mods_built, mods_disabled = self.remove_configured_extensions() + self.set_compiler_executables() + build_ext.build_extensions(self) + if SUBPROCESS_BOOTSTRAP: + # Drop our custom subprocess module: + # use the newly built subprocess module + del sys.modules['subprocess'] + for ext in self.extensions: self.check_extension_import(ext) + self.summary(mods_built, mods_disabled) + + def summary(self, mods_built, mods_disabled): longest = max([len(e.name) for e in self.extensions], default=0) if self.failed or self.failed_on_import: all_failed = self.failed + self.failed_on_import @@ -435,6 +522,14 @@ class PyBuildExt(build_ext): print_three_column([ext.name for ext in mods_disabled]) print() + if self.disabled_configure: + print() + print("The following modules found by detect_modules() in" + " setup.py have not") + print("been built, they are *disabled* by configure:") + print_three_column(self.disabled_configure) + print() + if self.failed: failed = self.failed[:] print() @@ -552,11 +647,11 @@ class PyBuildExt(build_ext): tmpfile = os.path.join(self.build_temp, 'multiarch') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) - ret = os.system( + ret = run_command( '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile)) multiarch_path_component = '' try: - if ret >> 8 == 0: + if ret == 0: with open(tmpfile) as fp: multiarch_path_component = fp.readline().strip() finally: @@ -577,11 +672,11 @@ class PyBuildExt(build_ext): tmpfile = os.path.join(self.build_temp, 'multiarch') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) - ret = os.system( + ret = run_command( 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % (opt, tmpfile)) try: - if ret >> 8 == 0: + if ret == 0: with open(tmpfile) as fp: multiarch_path_component = fp.readline().strip() add_dir_to_list(self.compiler.library_dirs, @@ -596,12 +691,12 @@ class PyBuildExt(build_ext): tmpfile = os.path.join(self.build_temp, 'ccpaths') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) - ret = os.system('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) + ret = run_command('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) is_gcc = False is_clang = False in_incdirs = False try: - if ret >> 8 == 0: + if ret == 0: with open(tmpfile) as fp: for line in fp.readlines(): if line.startswith("gcc version"): @@ -734,12 +829,14 @@ class PyBuildExt(build_ext): # math library functions, e.g. sin() self.add(Extension('math', ['mathmodule.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], extra_objects=[shared_math], depends=['_math.h', shared_math], libraries=['m'])) # complex math library functions self.add(Extension('cmath', ['cmathmodule.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], extra_objects=[shared_math], depends=['_math.h', shared_math], libraries=['m'])) @@ -757,8 +854,11 @@ class PyBuildExt(build_ext): # uses modf(). self.add(Extension('_datetime', ['_datetimemodule.c'], libraries=['m'])) + # zoneinfo module + self.add(Extension('_zoneinfo', ['_zoneinfo.c'])), # random number generator implemented in C - self.add(Extension("_random", ["_randommodule.c"])) + self.add(Extension("_random", ["_randommodule.c"], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) # bisect self.add(Extension("_bisect", ["_bisectmodule.c"])) # heapq @@ -780,7 +880,8 @@ class PyBuildExt(build_ext): # _opcode module self.add(Extension('_opcode', ['_opcode.c'])) # asyncio speedups - self.add(Extension("_asyncio", ["_asynciomodule.c"])) + self.add(Extension("_asyncio", ["_asynciomodule.c"], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) # _abc speedups self.add(Extension("_abc", ["_abc.c"])) # _queue module @@ -887,14 +988,14 @@ class PyBuildExt(build_ext): # Determine if readline is already linked against curses or tinfo. if do_readline: if CROSS_COMPILING: - ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \ + ret = run_command("%s -d %s | grep '(NEEDED)' > %s" % (sysconfig.get_config_var('READELF'), do_readline, tmpfile)) elif find_executable('ldd'): - ret = os.system("ldd %s > %s" % (do_readline, tmpfile)) + ret = run_command("ldd %s > %s" % (do_readline, tmpfile)) else: - ret = 256 - if ret >> 8 == 0: + ret = 1 + if ret == 0: with open(tmpfile) as fp: for ln in fp: if 'curses' in ln: @@ -1018,9 +1119,9 @@ class PyBuildExt(build_ext): if (curses_enabled and not skip_curses_panel and self.compiler.find_library_file(self.lib_dirs, panel_library)): self.add(Extension('_curses_panel', ['_curses_panel.c'], - include_dirs=curses_includes, - define_macros=curses_defines, - libraries=[panel_library, *curses_libs])) + include_dirs=curses_includes, + define_macros=curses_defines, + libraries=[panel_library, *curses_libs])) elif not skip_curses_panel: self.missing.append('_curses_panel') @@ -1043,8 +1144,12 @@ class PyBuildExt(build_ext): def detect_socket(self): # socket(2) if not VXWORKS: - self.add(Extension('_socket', ['socketmodule.c'], - depends=['socketmodule.h'])) + kwargs = {'depends': ['socketmodule.h']} + if MACOS: + # Issue #35569: Expose RFC 3542 socket options. + kwargs['extra_compile_args'] = ['-D__APPLE_USE_RFC_3542'] + + self.add(Extension('_socket', ['socketmodule.c'], **kwargs)) elif self.compiler.find_library_file(self.lib_dirs, 'net'): libs = ['net'] self.add(Extension('_socket', ['socketmodule.c'], @@ -1609,9 +1714,9 @@ class PyBuildExt(build_ext): ] cc = sysconfig.get_config_var('CC').split()[0] - ret = os.system( + ret = run_command( '"%s" -Werror -Wno-unreachable-code -E -xc /dev/null >/dev/null 2>&1' % cc) - if ret >> 8 == 0: + if ret == 0: extra_compile_args.append('-Wno-unreachable-code') self.add(Extension('pyexpat', @@ -1752,31 +1857,73 @@ class PyBuildExt(build_ext): return True def detect_tkinter_darwin(self): - # The _tkinter module, using frameworks. Since frameworks are quite - # different the UNIX search logic is not sharable. + # Build default _tkinter on macOS using Tcl and Tk frameworks. + # + # The macOS native Tk (AKA Aqua Tk) and Tcl are most commonly + # built and installed as macOS framework bundles. However, + # for several reasons, we cannot take full advantage of the + # Apple-supplied compiler chain's -framework options here. + # Instead, we need to find and pass to the compiler the + # absolute paths of the Tcl and Tk headers files we want to use + # and the absolute path to the directory containing the Tcl + # and Tk frameworks for linking. + # + # We want to handle here two common use cases on macOS: + # 1. Build and link with system-wide third-party or user-built + # Tcl and Tk frameworks installed in /Library/Frameworks. + # 2. Build and link using a user-specified macOS SDK so that the + # built Python can be exported to other systems. In this case, + # search only the SDK's /Library/Frameworks (normally empty) + # and /System/Library/Frameworks. + # + # Any other use case should be able to be handled explicitly by + # using the options described above in detect_tkinter_explicitly(). + # In particular it would be good to handle here the case where + # you want to build and link with a framework build of Tcl and Tk + # that is not in /Library/Frameworks, say, in your private + # $HOME/Library/Frameworks directory or elsewhere. It turns + # out to be difficult to make that work automtically here + # without bringing into play more tools and magic. That case + # can be hamdled using a recipe with the right arguments + # to detect_tkinter_explicitly(). + # + # Note also that the fallback case here is to try to use the + # Apple-supplied Tcl and Tk frameworks in /System/Library but + # be forewarned that they are deprecated by Apple and typically + # out-of-date and buggy; their use should be avoided if at + # all possible by installing a newer version of Tcl and Tk in + # /Library/Frameworks before bwfore building Python without + # an explicit SDK or by configuring build arguments explicitly. + from os.path import join, exists - framework_dirs = [ - '/Library/Frameworks', - '/System/Library/Frameworks/', - join(os.getenv('HOME'), '/Library/Frameworks') - ] - sysroot = macosx_sdk_root() + sysroot = macosx_sdk_root() # path to the SDK or '/' + + if macosx_sdk_specified(): + # Use case #2: an SDK other than '/' was specified. + # Only search there. + framework_dirs = [ + join(sysroot, 'Library', 'Frameworks'), + join(sysroot, 'System', 'Library', 'Frameworks'), + ] + else: + # Use case #1: no explicit SDK selected. + # Search the local system-wide /Library/Frameworks, + # not the one in the default SDK, othewise fall back to + # /System/Library/Frameworks whose header files may be in + # the default SDK or, on older systems, actually installed. + framework_dirs = [ + join('/', 'Library', 'Frameworks'), + join(sysroot, 'System', 'Library', 'Frameworks'), + ] - # Find the directory that contains the Tcl.framework and Tk.framework - # bundles. - # XXX distutils should support -F! + # Find the directory that contains the Tcl.framework and + # Tk.framework bundles. for F in framework_dirs: # both Tcl.framework and Tk.framework should be present - - for fw in 'Tcl', 'Tk': - if is_macosx_sdk_path(F): - if not exists(join(sysroot, F[1:], fw + '.framework')): - break - else: - if not exists(join(F, fw + '.framework')): - break + if not exists(join(F, fw + '.framework')): + break else: # ok, F is now directory with both frameworks. Continure # building @@ -1786,24 +1933,16 @@ class PyBuildExt(build_ext): # will now resume. return False - # For 8.4a2, we must add -I options that point inside the Tcl and Tk - # frameworks. In later release we should hopefully be able to pass - # the -F option to gcc, which specifies a framework lookup path. - # include_dirs = [ join(F, fw + '.framework', H) for fw in ('Tcl', 'Tk') - for H in ('Headers', 'Versions/Current/PrivateHeaders') + for H in ('Headers',) ] - # For 8.4a2, the X11 headers are not included. Rather than include a - # complicated search, this is a hard-coded path. It could bail out - # if X11 libs are not found... - include_dirs.append('/usr/X11R6/include') - frameworks = ['-framework', 'Tcl', '-framework', 'Tk'] + # Add the base framework directory as well + compile_args = ['-F', F] - # All existing framework builds of Tcl/Tk don't support 64-bit - # architectures. + # Do not build tkinter for archs that this Tk was not built with. cflags = sysconfig.get_config_vars('CFLAGS')[0] archs = re.findall(r'-arch\s+(\w+)', cflags) @@ -1811,13 +1950,9 @@ class PyBuildExt(build_ext): if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) - # Note: cannot use os.popen or subprocess here, that - # requires extensions that are not available here. - if is_macosx_sdk_path(F): - os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile)) - else: - os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile)) - + run_command( + "file {}/Tk.framework/Tk | grep 'for architecture' > {}".format(F, tmpfile) + ) with open(tmpfile) as fp: detected_archs = [] for ln in fp: @@ -1826,16 +1961,26 @@ class PyBuildExt(build_ext): detected_archs.append(ln.split()[-1]) os.unlink(tmpfile) + arch_args = [] for a in detected_archs: - frameworks.append('-arch') - frameworks.append(a) + arch_args.append('-arch') + arch_args.append(a) + + compile_args += arch_args + link_args = [','.join(['-Wl', '-F', F, '-framework', 'Tcl', '-framework', 'Tk']), *arch_args] + + # The X11/xlib.h file bundled in the Tk sources can cause function + # prototype warnings from the compiler. Since we cannot easily fix + # that, suppress the warnings here instead. + if '-Wstrict-prototypes' in cflags.split(): + compile_args.append('-Wno-strict-prototypes') self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], define_macros=[('WITH_APPINIT', 1)], include_dirs=include_dirs, libraries=[], - extra_compile_args=frameworks[2:], - extra_link_args=frameworks)) + extra_compile_args=compile_args, + extra_link_args=link_args)) return True def detect_tkinter(self): @@ -1994,7 +2139,7 @@ class PyBuildExt(build_ext): # Thomas Heller's _ctypes module self.use_system_libffi = False include_dirs = [] - extra_compile_args = [] + extra_compile_args = ['-DPy_BUILD_CORE_MODULE'] extra_link_args = [] sources = ['_ctypes/_ctypes.c', '_ctypes/callbacks.c', @@ -2097,7 +2242,7 @@ class PyBuildExt(build_ext): '_decimal/libmpdec/fnt.c', '_decimal/libmpdec/fourstep.c', '_decimal/libmpdec/io.c', - '_decimal/libmpdec/memory.c', + '_decimal/libmpdec/mpalloc.c', '_decimal/libmpdec/mpdecimal.c', '_decimal/libmpdec/numbertheory.c', '_decimal/libmpdec/sixstep.c', @@ -2244,34 +2389,73 @@ class PyBuildExt(build_ext): libraries=openssl_libs)) def detect_hash_builtins(self): - # We always compile these even when OpenSSL is available (issue #14693). - # It's harmless and the object code is tiny (40-50 KiB per module, - # only loaded when actually used). - self.add(Extension('_sha256', ['sha256module.c'], - depends=['hashlib.h'])) - self.add(Extension('_sha512', ['sha512module.c'], - depends=['hashlib.h'])) - self.add(Extension('_md5', ['md5module.c'], - depends=['hashlib.h'])) - self.add(Extension('_sha1', ['sha1module.c'], - depends=['hashlib.h'])) - - blake2_deps = glob(os.path.join(escape(self.srcdir), - 'Modules/_blake2/impl/*')) - blake2_deps.append('hashlib.h') - - self.add(Extension('_blake2', - ['_blake2/blake2module.c', - '_blake2/blake2b_impl.c', - '_blake2/blake2s_impl.c'], - depends=blake2_deps)) - - sha3_deps = glob(os.path.join(escape(self.srcdir), - 'Modules/_sha3/kcp/*')) - sha3_deps.append('hashlib.h') - self.add(Extension('_sha3', - ['_sha3/sha3module.c'], - depends=sha3_deps)) + # By default we always compile these even when OpenSSL is available + # (issue #14693). It's harmless and the object code is tiny + # (40-50 KiB per module, only loaded when actually used). Modules can + # be disabled via the --with-builtin-hashlib-hashes configure flag. + supported = {"md5", "sha1", "sha256", "sha512", "sha3", "blake2"} + + configured = sysconfig.get_config_var("PY_BUILTIN_HASHLIB_HASHES") + configured = configured.strip('"').lower() + configured = { + m.strip() for m in configured.split(",") + } + + self.disabled_configure.extend( + sorted(supported.difference(configured)) + ) + + if "sha256" in configured: + self.add(Extension( + '_sha256', ['sha256module.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], + depends=['hashlib.h'] + )) + + if "sha512" in configured: + self.add(Extension( + '_sha512', ['sha512module.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], + depends=['hashlib.h'] + )) + + if "md5" in configured: + self.add(Extension( + '_md5', ['md5module.c'], + depends=['hashlib.h'] + )) + + if "sha1" in configured: + self.add(Extension( + '_sha1', ['sha1module.c'], + depends=['hashlib.h'] + )) + + if "blake2" in configured: + blake2_deps = glob( + os.path.join(escape(self.srcdir), 'Modules/_blake2/impl/*') + ) + blake2_deps.append('hashlib.h') + self.add(Extension( + '_blake2', + [ + '_blake2/blake2module.c', + '_blake2/blake2b_impl.c', + '_blake2/blake2s_impl.c' + ], + depends=blake2_deps + )) + + if "sha3" in configured: + sha3_deps = glob( + os.path.join(escape(self.srcdir), 'Modules/_sha3/kcp/*') + ) + sha3_deps.append('hashlib.h') + self.add(Extension( + '_sha3', + ['_sha3/sha3module.c'], + depends=sha3_deps + )) def detect_nis(self): if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6': @@ -2396,6 +2580,7 @@ def main(): ProcessPoolExecutor = None sys.modules['concurrent.futures.process'] = DummyProcess + validate_tzpath() # turn off warnings when deprecated modules are imported import warnings